From 2758158a4bb15b0f5ec30de92760133248afe1f8 Mon Sep 17 00:00:00 2001 From: alex-ong Date: Sun, 12 Aug 2018 17:23:58 +1000 Subject: [PATCH 001/788] Added xeal60 via clone of lets split --- keyboards/handwired/xeal60/config.h | 24 + keyboards/handwired/xeal60/i2c.c | 162 ++++++ keyboards/handwired/xeal60/i2c.h | 49 ++ keyboards/handwired/xeal60/info.json | 12 + .../xeal60/keymaps/DE_simple/config.h | 37 ++ .../xeal60/keymaps/DE_simple/keymap.c | 155 ++++++ .../xeal60/keymaps/DE_simple/readme.md | 59 +++ .../xeal60/keymaps/DE_simple/rules.mk | 0 .../xeal60/keymaps/OLED_sample/config.h | 60 +++ .../xeal60/keymaps/OLED_sample/keymap.c | 441 ++++++++++++++++ .../xeal60/keymaps/OLED_sample/readme.md | 25 + .../xeal60/keymaps/OLED_sample/rules.mk | 25 + .../handwired/xeal60/keymaps/adam/config.h | 50 ++ .../handwired/xeal60/keymaps/adam/keymap.c | 78 +++ .../xeal60/keymaps/bbaserdem/README.md | 27 + .../xeal60/keymaps/bbaserdem/config.h | 27 + .../xeal60/keymaps/bbaserdem/keymap.c | 36 ++ .../xeal60/keymaps/bbaserdem/rules.mk | 11 + .../xeal60/keymaps/bbaserdem_right/README.md | 5 + .../xeal60/keymaps/bbaserdem_right/config.h | 9 + .../xeal60/keymaps/bbaserdem_right/keymap.c | 31 ++ .../xeal60/keymaps/bbaserdem_right/rules.mk | 26 + .../xeal60/keymaps/cpeters1982/config.h | 54 ++ .../xeal60/keymaps/cpeters1982/keymap.c | 221 ++++++++ .../xeal60/keymaps/cpeters1982/rules.mk | 8 + .../handwired/xeal60/keymaps/default/config.h | 37 ++ .../handwired/xeal60/keymaps/default/keymap.c | 211 ++++++++ .../handwired/xeal60/keymaps/default/rules.mk | 3 + .../handwired/xeal60/keymaps/dlaroe/config.h | 37 ++ .../handwired/xeal60/keymaps/dlaroe/keymap.c | 255 ++++++++++ .../handwired/xeal60/keymaps/dlaroe/rules.mk | 0 .../handwired/xeal60/keymaps/drashna/config.h | 80 +++ .../handwired/xeal60/keymaps/drashna/keymap.c | 98 ++++ .../handwired/xeal60/keymaps/drashna/rules.mk | 25 + .../xeal60/keymaps/drashna_old/config.h | 86 ++++ .../xeal60/keymaps/drashna_old/keymap.c | 1 + .../xeal60/keymaps/drashna_old/rules.mk | 28 ++ .../xeal60/keymaps/dwallace/config.h | 43 ++ .../xeal60/keymaps/dwallace/keymap.c | 224 +++++++++ .../xeal60/keymaps/dwallace/rules.mk | 1 + .../handwired/xeal60/keymaps/fabian/config.h | 34 ++ .../handwired/xeal60/keymaps/fabian/keymap.c | 271 ++++++++++ .../handwired/xeal60/keymaps/fabian/rules.mk | 9 + .../handwired/xeal60/keymaps/fido/config.h | 45 ++ .../handwired/xeal60/keymaps/fido/keymap.c | 74 +++ .../handwired/xeal60/keymaps/fido/rules.mk | 1 + .../xeal60/keymaps/heartrobotninja/config.h | 58 +++ .../xeal60/keymaps/heartrobotninja/keymap.c | 180 +++++++ .../xeal60/keymaps/heartrobotninja/rules.mk | 26 + .../xeal60/keymaps/henxing/Readme.md | 51 ++ .../handwired/xeal60/keymaps/henxing/config.h | 37 ++ .../handwired/xeal60/keymaps/henxing/keymap.c | 113 +++++ .../xeal60/keymaps/hexwire/README.md | 116 +++++ .../handwired/xeal60/keymaps/hexwire/config.h | 43 ++ .../handwired/xeal60/keymaps/hexwire/keymap.c | 218 ++++++++ .../handwired/xeal60/keymaps/hexwire/rules.mk | 1 + .../handwired/xeal60/keymaps/khord/config.h | 44 ++ .../handwired/xeal60/keymaps/khord/keymap.c | 170 +++++++ .../handwired/xeal60/keymaps/khord/rules.mk | 7 + .../handwired/xeal60/keymaps/kris/keymap.c | 213 ++++++++ .../handwired/xeal60/keymaps/krusli/keymap.c | 238 +++++++++ .../handwired/xeal60/keymaps/krusli/readme.md | 2 + .../xeal60/keymaps/mbsurfer/config.h | 43 ++ .../xeal60/keymaps/mbsurfer/keymap.c | 274 ++++++++++ .../xeal60/keymaps/mbsurfer/rules.mk | 7 + .../handwired/xeal60/keymaps/mike808/config.h | 43 ++ .../handwired/xeal60/keymaps/mike808/keymap.c | 158 ++++++ .../handwired/xeal60/keymaps/mike808/rules.mk | 1 + .../handwired/xeal60/keymaps/mjt/config.h | 38 ++ .../handwired/xeal60/keymaps/mjt/keymap.c | 213 ++++++++ .../handwired/xeal60/keymaps/mjt/rules.mk | 25 + .../handwired/xeal60/keymaps/mtdjr/config.h | 43 ++ .../handwired/xeal60/keymaps/mtdjr/keymap.c | 55 ++ .../handwired/xeal60/keymaps/mtdjr/rules.mk | 5 + .../xeal60/keymaps/normacos/config.h | 37 ++ .../xeal60/keymaps/normacos/keymap.c | 213 ++++++++ .../xeal60/keymaps/normacos/readme.md | 86 ++++ .../handwired/xeal60/keymaps/piemod/README.md | 31 ++ .../handwired/xeal60/keymaps/piemod/config.h | 49 ++ .../handwired/xeal60/keymaps/piemod/keymap.c | 99 ++++ .../handwired/xeal60/keymaps/piemod/rules.mk | 13 + .../handwired/xeal60/keymaps/pitty/README.md | 91 ++++ .../handwired/xeal60/keymaps/pitty/config.h | 26 + .../handwired/xeal60/keymaps/pitty/keymap.c | 169 +++++++ .../handwired/xeal60/keymaps/pitty/rules.mk | 6 + .../handwired/xeal60/keymaps/poker/config.h | 37 ++ .../handwired/xeal60/keymaps/poker/keymap.c | 240 +++++++++ .../handwired/xeal60/keymaps/poker/rules.mk | 3 + .../handwired/xeal60/keymaps/smt/config.h | 37 ++ .../handwired/xeal60/keymaps/smt/keymap.c | 218 ++++++++ .../handwired/xeal60/keymaps/smt/readme.md | 88 ++++ .../xeal60/keymaps/that_canadian/config.h | 32 ++ .../xeal60/keymaps/that_canadian/keymap.c | 163 ++++++ .../handwired/xeal60/keymaps/waples/README.md | 58 +++ .../handwired/xeal60/keymaps/waples/config.h | 17 + .../handwired/xeal60/keymaps/waples/keymap.c | 131 +++++ .../handwired/xeal60/keymaps/waples/rules.mk | 3 + .../handwired/xeal60/keymaps/xk/config.h | 44 ++ .../handwired/xeal60/keymaps/xk/keymap.c | 370 ++++++++++++++ .../handwired/xeal60/keymaps/xk/rules.mk | 19 + .../handwired/xeal60/keymaps/zer09/config.h | 59 +++ .../handwired/xeal60/keymaps/zer09/keymap.c | 38 ++ .../handwired/xeal60/keymaps/zer09/keymap.h | 32 ++ .../handwired/xeal60/keymaps/zer09/rules.mk | 6 + keyboards/handwired/xeal60/lets_split.c | 16 + keyboards/handwired/xeal60/lets_split.h | 31 ++ keyboards/handwired/xeal60/matrix.c | 470 ++++++++++++++++++ keyboards/handwired/xeal60/readme.md | 187 +++++++ keyboards/handwired/xeal60/rev1/config.h | 86 ++++ keyboards/handwired/xeal60/rev1/rev1.c | 15 + keyboards/handwired/xeal60/rev1/rev1.h | 30 ++ keyboards/handwired/xeal60/rev1/rules.mk | 1 + keyboards/handwired/xeal60/rules.mk | 77 +++ keyboards/handwired/xeal60/serial.c | 228 +++++++++ keyboards/handwired/xeal60/serial.h | 26 + keyboards/handwired/xeal60/split_util.c | 86 ++++ keyboards/handwired/xeal60/split_util.h | 20 + 117 files changed, 9305 insertions(+) create mode 100644 keyboards/handwired/xeal60/config.h create mode 100644 keyboards/handwired/xeal60/i2c.c create mode 100644 keyboards/handwired/xeal60/i2c.h create mode 100644 keyboards/handwired/xeal60/info.json create mode 100644 keyboards/handwired/xeal60/keymaps/DE_simple/config.h create mode 100644 keyboards/handwired/xeal60/keymaps/DE_simple/keymap.c create mode 100644 keyboards/handwired/xeal60/keymaps/DE_simple/readme.md create mode 100644 keyboards/handwired/xeal60/keymaps/DE_simple/rules.mk create mode 100644 keyboards/handwired/xeal60/keymaps/OLED_sample/config.h create mode 100644 keyboards/handwired/xeal60/keymaps/OLED_sample/keymap.c create mode 100644 keyboards/handwired/xeal60/keymaps/OLED_sample/readme.md create mode 100644 keyboards/handwired/xeal60/keymaps/OLED_sample/rules.mk create mode 100644 keyboards/handwired/xeal60/keymaps/adam/config.h create mode 100644 keyboards/handwired/xeal60/keymaps/adam/keymap.c create mode 100644 keyboards/handwired/xeal60/keymaps/bbaserdem/README.md create mode 100644 keyboards/handwired/xeal60/keymaps/bbaserdem/config.h create mode 100644 keyboards/handwired/xeal60/keymaps/bbaserdem/keymap.c create mode 100644 keyboards/handwired/xeal60/keymaps/bbaserdem/rules.mk create mode 100644 keyboards/handwired/xeal60/keymaps/bbaserdem_right/README.md create mode 100644 keyboards/handwired/xeal60/keymaps/bbaserdem_right/config.h create mode 100644 keyboards/handwired/xeal60/keymaps/bbaserdem_right/keymap.c create mode 100644 keyboards/handwired/xeal60/keymaps/bbaserdem_right/rules.mk create mode 100644 keyboards/handwired/xeal60/keymaps/cpeters1982/config.h create mode 100644 keyboards/handwired/xeal60/keymaps/cpeters1982/keymap.c create mode 100644 keyboards/handwired/xeal60/keymaps/cpeters1982/rules.mk create mode 100644 keyboards/handwired/xeal60/keymaps/default/config.h create mode 100644 keyboards/handwired/xeal60/keymaps/default/keymap.c create mode 100644 keyboards/handwired/xeal60/keymaps/default/rules.mk create mode 100644 keyboards/handwired/xeal60/keymaps/dlaroe/config.h create mode 100644 keyboards/handwired/xeal60/keymaps/dlaroe/keymap.c create mode 100644 keyboards/handwired/xeal60/keymaps/dlaroe/rules.mk create mode 100644 keyboards/handwired/xeal60/keymaps/drashna/config.h create mode 100644 keyboards/handwired/xeal60/keymaps/drashna/keymap.c create mode 100644 keyboards/handwired/xeal60/keymaps/drashna/rules.mk create mode 100644 keyboards/handwired/xeal60/keymaps/drashna_old/config.h create mode 100644 keyboards/handwired/xeal60/keymaps/drashna_old/keymap.c create mode 100644 keyboards/handwired/xeal60/keymaps/drashna_old/rules.mk create mode 100644 keyboards/handwired/xeal60/keymaps/dwallace/config.h create mode 100644 keyboards/handwired/xeal60/keymaps/dwallace/keymap.c create mode 100644 keyboards/handwired/xeal60/keymaps/dwallace/rules.mk create mode 100644 keyboards/handwired/xeal60/keymaps/fabian/config.h create mode 100644 keyboards/handwired/xeal60/keymaps/fabian/keymap.c create mode 100644 keyboards/handwired/xeal60/keymaps/fabian/rules.mk create mode 100644 keyboards/handwired/xeal60/keymaps/fido/config.h create mode 100644 keyboards/handwired/xeal60/keymaps/fido/keymap.c create mode 100644 keyboards/handwired/xeal60/keymaps/fido/rules.mk create mode 100644 keyboards/handwired/xeal60/keymaps/heartrobotninja/config.h create mode 100644 keyboards/handwired/xeal60/keymaps/heartrobotninja/keymap.c create mode 100644 keyboards/handwired/xeal60/keymaps/heartrobotninja/rules.mk create mode 100644 keyboards/handwired/xeal60/keymaps/henxing/Readme.md create mode 100644 keyboards/handwired/xeal60/keymaps/henxing/config.h create mode 100644 keyboards/handwired/xeal60/keymaps/henxing/keymap.c create mode 100644 keyboards/handwired/xeal60/keymaps/hexwire/README.md create mode 100644 keyboards/handwired/xeal60/keymaps/hexwire/config.h create mode 100644 keyboards/handwired/xeal60/keymaps/hexwire/keymap.c create mode 100644 keyboards/handwired/xeal60/keymaps/hexwire/rules.mk create mode 100644 keyboards/handwired/xeal60/keymaps/khord/config.h create mode 100644 keyboards/handwired/xeal60/keymaps/khord/keymap.c create mode 100644 keyboards/handwired/xeal60/keymaps/khord/rules.mk create mode 100644 keyboards/handwired/xeal60/keymaps/kris/keymap.c create mode 100644 keyboards/handwired/xeal60/keymaps/krusli/keymap.c create mode 100644 keyboards/handwired/xeal60/keymaps/krusli/readme.md create mode 100644 keyboards/handwired/xeal60/keymaps/mbsurfer/config.h create mode 100644 keyboards/handwired/xeal60/keymaps/mbsurfer/keymap.c create mode 100644 keyboards/handwired/xeal60/keymaps/mbsurfer/rules.mk create mode 100644 keyboards/handwired/xeal60/keymaps/mike808/config.h create mode 100644 keyboards/handwired/xeal60/keymaps/mike808/keymap.c create mode 100644 keyboards/handwired/xeal60/keymaps/mike808/rules.mk create mode 100644 keyboards/handwired/xeal60/keymaps/mjt/config.h create mode 100644 keyboards/handwired/xeal60/keymaps/mjt/keymap.c create mode 100644 keyboards/handwired/xeal60/keymaps/mjt/rules.mk create mode 100644 keyboards/handwired/xeal60/keymaps/mtdjr/config.h create mode 100644 keyboards/handwired/xeal60/keymaps/mtdjr/keymap.c create mode 100644 keyboards/handwired/xeal60/keymaps/mtdjr/rules.mk create mode 100644 keyboards/handwired/xeal60/keymaps/normacos/config.h create mode 100644 keyboards/handwired/xeal60/keymaps/normacos/keymap.c create mode 100644 keyboards/handwired/xeal60/keymaps/normacos/readme.md create mode 100644 keyboards/handwired/xeal60/keymaps/piemod/README.md create mode 100644 keyboards/handwired/xeal60/keymaps/piemod/config.h create mode 100644 keyboards/handwired/xeal60/keymaps/piemod/keymap.c create mode 100644 keyboards/handwired/xeal60/keymaps/piemod/rules.mk create mode 100644 keyboards/handwired/xeal60/keymaps/pitty/README.md create mode 100644 keyboards/handwired/xeal60/keymaps/pitty/config.h create mode 100644 keyboards/handwired/xeal60/keymaps/pitty/keymap.c create mode 100644 keyboards/handwired/xeal60/keymaps/pitty/rules.mk create mode 100644 keyboards/handwired/xeal60/keymaps/poker/config.h create mode 100644 keyboards/handwired/xeal60/keymaps/poker/keymap.c create mode 100644 keyboards/handwired/xeal60/keymaps/poker/rules.mk create mode 100644 keyboards/handwired/xeal60/keymaps/smt/config.h create mode 100644 keyboards/handwired/xeal60/keymaps/smt/keymap.c create mode 100644 keyboards/handwired/xeal60/keymaps/smt/readme.md create mode 100644 keyboards/handwired/xeal60/keymaps/that_canadian/config.h create mode 100644 keyboards/handwired/xeal60/keymaps/that_canadian/keymap.c create mode 100644 keyboards/handwired/xeal60/keymaps/waples/README.md create mode 100644 keyboards/handwired/xeal60/keymaps/waples/config.h create mode 100644 keyboards/handwired/xeal60/keymaps/waples/keymap.c create mode 100644 keyboards/handwired/xeal60/keymaps/waples/rules.mk create mode 100644 keyboards/handwired/xeal60/keymaps/xk/config.h create mode 100644 keyboards/handwired/xeal60/keymaps/xk/keymap.c create mode 100644 keyboards/handwired/xeal60/keymaps/xk/rules.mk create mode 100644 keyboards/handwired/xeal60/keymaps/zer09/config.h create mode 100644 keyboards/handwired/xeal60/keymaps/zer09/keymap.c create mode 100644 keyboards/handwired/xeal60/keymaps/zer09/keymap.h create mode 100644 keyboards/handwired/xeal60/keymaps/zer09/rules.mk create mode 100644 keyboards/handwired/xeal60/lets_split.c create mode 100644 keyboards/handwired/xeal60/lets_split.h create mode 100644 keyboards/handwired/xeal60/matrix.c create mode 100644 keyboards/handwired/xeal60/readme.md create mode 100644 keyboards/handwired/xeal60/rev1/config.h create mode 100644 keyboards/handwired/xeal60/rev1/rev1.c create mode 100644 keyboards/handwired/xeal60/rev1/rev1.h create mode 100644 keyboards/handwired/xeal60/rev1/rules.mk create mode 100644 keyboards/handwired/xeal60/rules.mk create mode 100644 keyboards/handwired/xeal60/serial.c create mode 100644 keyboards/handwired/xeal60/serial.h create mode 100644 keyboards/handwired/xeal60/split_util.c create mode 100644 keyboards/handwired/xeal60/split_util.h diff --git a/keyboards/handwired/xeal60/config.h b/keyboards/handwired/xeal60/config.h new file mode 100644 index 000000000..c910d8f24 --- /dev/null +++ b/keyboards/handwired/xeal60/config.h @@ -0,0 +1,24 @@ +/* +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +#endif diff --git a/keyboards/handwired/xeal60/i2c.c b/keyboards/handwired/xeal60/i2c.c new file mode 100644 index 000000000..084c890c4 --- /dev/null +++ b/keyboards/handwired/xeal60/i2c.c @@ -0,0 +1,162 @@ +#include +#include +#include +#include +#include +#include +#include "i2c.h" + +#ifdef USE_I2C + +// Limits the amount of we wait for any one i2c transaction. +// Since were running SCL line 100kHz (=> 10μs/bit), and each transactions is +// 9 bits, a single transaction will take around 90μs to complete. +// +// (F_CPU/SCL_CLOCK) => # of μC cycles to transfer a bit +// poll loop takes at least 8 clock cycles to execute +#define I2C_LOOP_TIMEOUT (9+1)*(F_CPU/SCL_CLOCK)/8 + +#define BUFFER_POS_INC() (slave_buffer_pos = (slave_buffer_pos+1)%SLAVE_BUFFER_SIZE) + +volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE]; + +static volatile uint8_t slave_buffer_pos; +static volatile bool slave_has_register_set = false; + +// Wait for an i2c operation to finish +inline static +void i2c_delay(void) { + uint16_t lim = 0; + while(!(TWCR & (1<10. + // Check datasheets for more info. + TWBR = ((F_CPU/SCL_CLOCK)-16)/2; +} + +// Start a transaction with the given i2c slave address. The direction of the +// transfer is set with I2C_READ and I2C_WRITE. +// returns: 0 => success +// 1 => error +uint8_t i2c_master_start(uint8_t address) { + TWCR = (1< slave ACK +// 1 => slave NACK +uint8_t i2c_master_write(uint8_t data) { + TWDR = data; + TWCR = (1<= SLAVE_BUFFER_SIZE ) { + ack = 0; + slave_buffer_pos = 0; + } + slave_has_register_set = true; + } else { + i2c_slave_buffer[slave_buffer_pos] = TWDR; + BUFFER_POS_INC(); + } + break; + + case TW_ST_SLA_ACK: + case TW_ST_DATA_ACK: + // master has addressed this device as a slave transmitter and is + // requesting data. + TWDR = i2c_slave_buffer[slave_buffer_pos]; + BUFFER_POS_INC(); + break; + + case TW_BUS_ERROR: // something went wrong, reset twi state + TWCR = 0; + default: + break; + } + // Reset everything, so we are ready for the next TWI interrupt + TWCR |= (1< + +#ifndef F_CPU +#define F_CPU 16000000UL +#endif + +#define I2C_READ 1 +#define I2C_WRITE 0 + +#define I2C_ACK 1 +#define I2C_NACK 0 + +#define SLAVE_BUFFER_SIZE 0x10 + +// i2c SCL clock frequency +#define SCL_CLOCK 400000L + +extern volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE]; + +void i2c_master_init(void); +uint8_t i2c_master_start(uint8_t address); +void i2c_master_stop(void); +uint8_t i2c_master_write(uint8_t data); +uint8_t i2c_master_read(int); +void i2c_reset_state(void); +void i2c_slave_init(uint8_t address); + + +static inline unsigned char i2c_start_read(unsigned char addr) { + return i2c_master_start((addr << 1) | I2C_READ); +} + +static inline unsigned char i2c_start_write(unsigned char addr) { + return i2c_master_start((addr << 1) | I2C_WRITE); +} + +// from SSD1306 scrips +extern unsigned char i2c_rep_start(unsigned char addr); +extern void i2c_start_wait(unsigned char addr); +extern unsigned char i2c_readAck(void); +extern unsigned char i2c_readNak(void); +extern unsigned char i2c_read(unsigned char ack); + +#define i2c_read(ack) (ack) ? i2c_readAck() : i2c_readNak(); + +#endif diff --git a/keyboards/handwired/xeal60/info.json b/keyboards/handwired/xeal60/info.json new file mode 100644 index 000000000..aa1c3b8ef --- /dev/null +++ b/keyboards/handwired/xeal60/info.json @@ -0,0 +1,12 @@ +{ + "keyboard_name": "Let's Split", + "url": "", + "maintainer": "qmk", + "width": 13, + "height": 4, + "layouts": { + "LAYOUT": { + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":7, "y":1}, {"x":8, "y":1}, {"x":9, "y":1}, {"x":10, "y":1}, {"x":11, "y":1}, {"x":12, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2}, {"x":5, "y":2}, {"x":7, "y":2}, {"x":8, "y":2}, {"x":9, "y":2}, {"x":10, "y":2}, {"x":11, "y":2}, {"x":12, "y":2}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":4, "y":3}, {"x":5, "y":3}, {"x":7, "y":3}, {"x":8, "y":3}, {"x":9, "y":3}, {"x":10, "y":3}, {"x":11, "y":3}, {"x":12, "y":3}] + } + } +} diff --git a/keyboards/handwired/xeal60/keymaps/DE_simple/config.h b/keyboards/handwired/xeal60/keymaps/DE_simple/config.h new file mode 100644 index 000000000..5a6261c4f --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/DE_simple/config.h @@ -0,0 +1,37 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + +#endif diff --git a/keyboards/handwired/xeal60/keymaps/DE_simple/keymap.c b/keyboards/handwired/xeal60/keymaps/DE_simple/keymap.c new file mode 100644 index 000000000..d329bea4c --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/DE_simple/keymap.c @@ -0,0 +1,155 @@ +#include QMK_KEYBOARD_H +#include "keymap_german.h" + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTZ 0 +#define _LOWER 3 +#define _RAISE 4 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTZ = SAFE_RANGE, + LOWER, + RAISE, + ADJUST, +}; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwertz + * ,-----------------------------------------------------------------------------------. + * | Esc | Q | W | E | R | T | Z | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Tab | A | S | D | F | G | H | J | K | L | + | # | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Y | X | C | V | B | N | M | , | . | - |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Ctrl | Alt | AltGr| GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTZ] = LAYOUT( \ + KC_ESC, DE_Q, DE_W, DE_E, DE_R, DE_T, DE_Z, DE_U, DE_I, DE_O, DE_P, KC_BSPC, \ + KC_TAB, DE_A, DE_S, DE_D, DE_F, DE_G, DE_H, DE_J, DE_K, DE_L, DE_PLUS, DE_HASH, \ + KC_LSFT, DE_Y, DE_X, DE_C, DE_V, DE_B, DE_N, DE_M, DE_COMM, DE_DOT, DE_MINS, KC_ENT , \ + KC_LCTL, KC_LALT, DE_ALGR, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ° | ! | " | § | $ | % | & | / | ( | ) | = | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | @ | € | ü | ? | ´ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| F7 | F8 | F9 | F10 | F11 | F12 | | | ö | ä | |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT( \ + DE_CIRC, DE_EXLM, DE_DQOT, DE_PARA, DE_DLR, DE_PERC, DE_AMPR, DE_SLSH, DE_LPRN, DE_RPRN, DE_EQL, KC_BSPC, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, DE_AT , DE_EURO, KC_LBRC, DE_QST, DE_QUOT, \ + KC_LSFT, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DE_PIPE , KC_SCLN, KC_QUOT, _______, KC_ENT, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ° | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | { | [ | ] | } | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| F7 | F8 | F9 | F10 | F11 | F12 | | | | |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, DE_LCBR, DE_LBRC, DE_RBRC, DE_RCBR , DE_BSLS, \ + KC_LSFT, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, KC_ENT, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | Reset| | | | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwertz| | | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = LAYOUT( \ + _______, RESET , _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ + _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTZ, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ +) + + +}; + +#ifdef AUDIO_ENABLE +float tone_qwertz[][2] = SONG(QWERTY_SOUND); +float tone_dvorak[][2] = SONG(DVORAK_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); +#endif + +void persistent_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTZ: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_qwertz); + #endif + persistent_default_layer_set(1UL<<_QWERTZ); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + break; + } + return true; +} diff --git a/keyboards/handwired/xeal60/keymaps/DE_simple/readme.md b/keyboards/handwired/xeal60/keymaps/DE_simple/readme.md new file mode 100644 index 000000000..972cd6c39 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/DE_simple/readme.md @@ -0,0 +1,59 @@ +De_Simple Keymap +====== + +Features +-------- + +Changed Keymap to reasamble German Layout. + +Layout +-------- + + Qwertz + ,-----------------------------------------------------------------------------------. + | Esc | Q | W | E | R | T | Z | U | I | O | P | Bksp | + |------+------+------+------+------+-------------+------+------+------+------+------| + | Tab | A | S | D | F | G | H | J | K | L | + | # | + |------+------+------+------+------+------|------+------+------+------+------+------| + | Shift| Y | X | C | V | B | N | M | , | . | - |Enter | + |------+------+------+------+------+------+------+------+------+------+------+------| + | Ctrl | Alt | AltGr| GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + `-----------------------------------------------------------------------------------' + + + Qwerty + ,-----------------------------------------------------------------------------------. + | Esc | Q | W | E | R | T | Z | U | I | O | P | Bksp | + |------+------+------+------+------+-------------+------+------+------+------+------| + | Tab | A | S | D | F | G | H | J | K | L | + | # | + |------+------+------+------+------+------|------+------+------+------+------+------| + | Shift| Y | X | C | V | B | N | M | , | . | - |Enter | + |------+------+------+------+------+------+------+------+------+------+------+------| + | Ctrl | Alt | AltGr| GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + `-----------------------------------------------------------------------------------' + + + Raise + ,-----------------------------------------------------------------------------------. + | ° | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + |------+------+------+------+------+-------------+------+------+------+------+------| + | Del | F1 | F2 | F3 | F4 | F5 | F6 | { | [ | ] | } | \ | + |------+------+------+------+------+------|------+------+------+------+------+------| + | Shift| F7 | F8 | F9 | F10 | F11 | F12 | | | | |Enter | + |------+------+------+------+------+------+------+------+------+------+------+------| + | | | | | | | | Next | Vol- | Vol+ | Play | + `-----------------------------------------------------------------------------------' + + + Adjust (Lower + Raise) + ,-----------------------------------------------------------------------------------. + | | Reset| | | | | | | | | | Del | + |------+------+------+------+------+-------------+------+------+------+------+------| + | | | |Aud on|Audoff|AGnorm|AGswap|Qwertz| | | | | + |------+------+------+------+------+------|------+------+------+------+------+------| + | | | | | | | | | | | | | + |------+------+------+------+------+------+------+------+------+------+------+------| + | | | | | | | | | | | | + `-----------------------------------------------------------------------------------' + + diff --git a/keyboards/handwired/xeal60/keymaps/DE_simple/rules.mk b/keyboards/handwired/xeal60/keymaps/DE_simple/rules.mk new file mode 100644 index 000000000..e69de29bb diff --git a/keyboards/handwired/xeal60/keymaps/OLED_sample/config.h b/keyboards/handwired/xeal60/keymaps/OLED_sample/config.h new file mode 100644 index 000000000..e8632fe61 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/OLED_sample/config.h @@ -0,0 +1,60 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* Use I2C or Serial, not both */ + +#define USE_I2C +//#define USE_SERIAL + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS +#define FLIP_HALF + +#define SSD1306OLED +//#define OLED_ROTATE180 + + +#define PREVENT_STUCK_MODIFIERS +#define TAPPING_FORCE_HOLD +#define TAPPING_TERM 100 + +#ifdef SUBPROJECT_rev1 + #include "../../rev1/config.h" +#endif +#ifdef SUBPROJECT_rev2 + #include "../../rev2/config.h" +#endif + +#undef RGBLED_NUM +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 6 +#define RGBLIGHT_HUE_STEP 10 +#define RGBLIGHT_SAT_STEP 17 +#define RGBLIGHT_VAL_STEP 17 + +#endif diff --git a/keyboards/handwired/xeal60/keymaps/OLED_sample/keymap.c b/keyboards/handwired/xeal60/keymaps/OLED_sample/keymap.c new file mode 100644 index 000000000..5eccbcf1a --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/OLED_sample/keymap.c @@ -0,0 +1,441 @@ +#include QMK_KEYBOARD_H +#include "LUFA/Drivers/Peripheral/TWI.h" +#ifdef SSD1306OLED + #include "ssd1306.h" +#endif + +extern keymap_config_t keymap_config; + +//Following line allows macro to read current RGB settings +extern rgblight_config_t rgblight_config; + + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _LOWER 3 +#define _RAISE 4 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + LOWER, + RAISE, + ADJUST, + BACKLIT, + RGBLED_TOGGLE, + RGBLED_STEP_MODE, + RGBLED_INCREASE_HUE, + RGBLED_DECREASE_HUE, + RGBLED_INCREASE_SAT, + RGBLED_DECREASE_SAT, + RGBLED_INCREASE_VAL, + RGBLED_DECREASE_VAL, +}; + +enum macro_keycodes { + KC_SAMPLEMACRO, +}; + + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO +//Macros +#define M_SAMPLE M(KC_SAMPLEMACRO) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = LAYOUT( \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ + ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Colemak + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | R | S | T | D | H | N | E | I | O | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_COLEMAK] = LAYOUT( \ + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, \ + KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ + ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Dvorak + * ,-----------------------------------------------------------------------------------. + * | Tab | " | , | . | P | Y | F | G | C | R | L | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | O | E | U | I | D | H | T | N | S | / | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_DVORAK] = LAYOUT( \ + KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, \ + KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, \ + KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT , \ + ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | | \ | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT( \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | Reset| | | | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = LAYOUT( \ + _______, RESET, _______, M_SAMPLE, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ + _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ +) + + +}; + + +#ifdef AUDIO_ENABLE + +float tone_startup[][2] = SONG(STARTUP_SOUND); +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +float tone_dvorak[][2] = SONG(DVORAK_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); +float tone_plover[][2] = SONG(PLOVER_SOUND); +float tone_plover_gb[][2] = SONG(PLOVER_GOODBYE_SOUND); +float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); +float tone_goodbye[][2] = SONG(GOODBYE_SOUND); +#endif + +// define variables for reactive RGB +bool TOG_STATUS = false; +int RGB_current_mode; + +void persistent_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +// Setting ADJUST layer RGB back to default +void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) { + if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) { + rgblight_mode(RGB_current_mode); + layer_on(layer3); + } else { + layer_off(layer3); + } +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_qwerty); + #endif + persistent_default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_colemak); + #endif + persistent_default_layer_set(1UL<<_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_dvorak); + #endif + persistent_default_layer_set(1UL<<_DVORAK); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + //not sure how to have keyboard check mode and set it to a variable, so my work around + //uses another variable that would be set to true after the first time a reactive key is pressed. + if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false + } else { + TOG_STATUS = !TOG_STATUS; + rgblight_mode(16); + } + layer_on(_LOWER); + update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); + } else { + rgblight_mode(RGB_current_mode); // revert RGB to initial mode prior to RGB mode change + TOG_STATUS = false; + layer_off(_LOWER); + update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + //not sure how to have keyboard check mode and set it to a variable, so my work around + //uses another variable that would be set to true after the first time a reactive key is pressed. + if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false + } else { + TOG_STATUS = !TOG_STATUS; + rgblight_mode(15); + } + layer_on(_RAISE); + update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); + } else { + rgblight_mode(RGB_current_mode); // revert RGB to initial mode prior to RGB mode change + layer_off(_RAISE); + TOG_STATUS = false; + update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case BACKLIT: + if (record->event.pressed) { + register_code(KC_RSFT); + #ifdef BACKLIGHT_ENABLE + backlight_step(); + #endif + } else { + unregister_code(KC_RSFT); + } + return false; + break; + //led operations - RGB mode change now updates the RGB_current_mode to allow the right RGB mode to be set after reactive keys are released + case RGB_MOD: + if (record->event.pressed) { + rgblight_mode(RGB_current_mode); + rgblight_step(); + RGB_current_mode = rgblight_config.mode; + } + return false; + break; + } + return true; +} + +void matrix_init_user(void) { + #ifdef AUDIO_ENABLE + startup_user(); + #endif + RGB_current_mode = rgblight_config.mode; +} + +//SSD1306 OLED init and update loop, make sure to add #define SSD1306OLED in config.h +#ifdef SSD1306OLED +void matrix_master_OLED_init (void) { + TWI_Init(TWI_BIT_PRESCALE_1, TWI_BITLENGTH_FROM_FREQ(1, 800000)); + iota_gfx_init(); // turns on the display +} + +void matrix_scan_user(void) { + iota_gfx_task(); // this is what updates the display continuously +} +#endif + +#ifdef AUDIO_ENABLE + +void startup_user() +{ + _delay_ms(20); // gets rid of tick + PLAY_SONG(tone_startup); +} + +void shutdown_user() +{ + PLAY_SONG(tone_goodbye); + _delay_ms(150); + stop_all_notes(); +} + +void music_on_user(void) +{ + music_scale_user(); +} + +void music_scale_user(void) +{ + PLAY_SONG(music_scale); +} + +#endif + +/* + * Macro definition + */ +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + if (!eeconfig_is_enabled()) { + eeconfig_init(); + } + + switch (id) { + case KC_SAMPLEMACRO: + if (record->event.pressed){ + return MACRO (I(10), T(H), T(E), T(L), T(L), T(O), T(SPACE), T(W), T(O), T(R), T(L), T(D), END); + } + + } + + return MACRO_NONE; +} + + +void matrix_update(struct CharacterMatrix *dest, + const struct CharacterMatrix *source) { + if (memcmp(dest->display, source->display, sizeof(dest->display))) { + memcpy(dest->display, source->display, sizeof(dest->display)); + dest->dirty = true; + } +} + +//assign the right code to your layers for OLED display +#define L_BASE 0 +#define L_LOWER 8 +#define L_RAISE 16 +#define L_FNLAYER 64 +#define L_NUMLAY 128 +#define L_NLOWER 136 +#define L_NFNLAYER 192 +#define L_MOUSECURSOR 256 +#define L_ADJUST 65560 + +void iota_gfx_task_user(void) { +#if DEBUG_TO_SCREEN + if (debug_enable) { + return; + } +#endif + + struct CharacterMatrix matrix; + + matrix_clear(&matrix); + matrix_write_P(&matrix, PSTR("USB: ")); +#ifdef PROTOCOL_LUFA + switch (USB_DeviceState) { + case DEVICE_STATE_Unattached: + matrix_write_P(&matrix, PSTR("Unattached")); + break; + case DEVICE_STATE_Suspended: + matrix_write_P(&matrix, PSTR("Suspended")); + break; + case DEVICE_STATE_Configured: + matrix_write_P(&matrix, PSTR("Connected")); + break; + case DEVICE_STATE_Powered: + matrix_write_P(&matrix, PSTR("Powered")); + break; + case DEVICE_STATE_Default: + matrix_write_P(&matrix, PSTR("Default")); + break; + case DEVICE_STATE_Addressed: + matrix_write_P(&matrix, PSTR("Addressed")); + break; + default: + matrix_write_P(&matrix, PSTR("Invalid")); + } +#endif + +// Define layers here, Have not worked out how to have text displayed for each layer. Copy down the number you see and add a case for it below + + char buf[40]; + snprintf(buf,sizeof(buf), "Undef-%ld", layer_state); + matrix_write_P(&matrix, PSTR("\n\nLayer: ")); + switch (layer_state) { + case L_BASE: + matrix_write_P(&matrix, PSTR("Default")); + break; + case L_RAISE: + matrix_write_P(&matrix, PSTR("Raise")); + break; + case L_LOWER: + matrix_write_P(&matrix, PSTR("Lower")); + break; + case L_ADJUST: + matrix_write_P(&matrix, PSTR("ADJUST")); + break; + default: + matrix_write(&matrix, buf); + } + + // Host Keyboard LED Status + char led[40]; + snprintf(led, sizeof(led), "\n%s %s %s", + (host_keyboard_leds() & (1< +Copyright 2015 Jack Humbert + +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 . +*/ + +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +// #define MASTER_LEFT +// #define MASTER_RIGHT +#define EE_HANDS + +#ifdef SUBPROJECT_rev2 + /* RGB Underglow */ + #undef RGBLED_NUM + #define RGBLIGHT_ANIMATIONS + #define RGBLED_NUM 8 +#endif + +#undef TAPPING_TERM +#define TAPPING_TERM 200 //At 500 some bad logic takes hold +#define PREVENT_STUCK_MODIFIERS +#define IGNORE_MOD_TAP_INTERRUPT +#define PERMISSIVE_HOLD + +#endif diff --git a/keyboards/handwired/xeal60/keymaps/adam/keymap.c b/keyboards/handwired/xeal60/keymaps/adam/keymap.c new file mode 100644 index 000000000..b986ab780 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/adam/keymap.c @@ -0,0 +1,78 @@ +#include QMK_KEYBOARD_H + + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define BASE 0 // default layer +#define FLOCK 1 // symbols arrows and F keys on F held down +#define JLOCK 2 // same as Flock but with fall thru J and mapped to J held down + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Brite| Ctrl | Alt | GUI |Lower | Bksp |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[BASE] = LAYOUT ( \ + TD(1), KC_2, KC_3, KC_4, KC_5, KC_MINS, KC_EQL, KC_6, KC_7, KC_8, KC_9, KC_0, \ + KC_Q, KC_W, KC_E, KC_R, KC_T, KC_TAB, KC_TAB, KC_Y, KC_U, KC_I, KC_O, KC_P, \ + SFT_T(KC_A), ALT_T(KC_S),CTL_T(KC_D), F(FLOCK), GUI_T(KC_G), KC_BSPC, KC_DELETE, GUI_T(KC_H), F(JLOCK), CTL_T(KC_K), ALT_T(KC_L), SFT_T(KC_SCLN), \ + KC_Z, KC_X, KC_C, KC_V, KC_B, KC_SPC, KC_ENT, KC_N, KC_M, KC_COMM, KC_DOT, KC_QUOTE +), +[FLOCK] = LAYOUT ( \ + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11, KC_F12, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, \ + KC_LBRC, KC_GRV, KC_TILDE, S(KC_1), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_HOME, KC_PGUP, XXXXXXX, KC_RBRC, \ + S(KC_LBRC), _______, _______, _______, _______, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, S(KC_RBRC), \ + KC_BSLS, KC_PIPE, XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, KC_ESC, XXXXXXX, KC_END, KC_PGDOWN, KC_QUES, KC_SLASH \ +), +[JLOCK] = LAYOUT ( \ + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11, KC_F12, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, \ + KC_LBRC, KC_GRV, KC_TILDE, S(KC_1), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_HOME, KC_PGUP, XXXXXXX, KC_RBRC, \ + S(KC_LBRC), _______, _______, _______, _______, XXXXXXX, XXXXXXX, KC_LEFT, _______, KC_UP, KC_RIGHT, S(KC_RBRC), \ + KC_BSLS, KC_PIPE, XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, KC_ESC, XXXXXXX, KC_END, KC_PGDOWN, KC_QUES, KC_SLASH \ +) +}; + +const uint16_t PROGMEM fn_actions[] = { + [FLOCK] = ACTION_LAYER_TAP_KEY(FLOCK,KC_F), + [JLOCK] = ACTION_LAYER_TAP_KEY(JLOCK,KC_J) +}; +#ifdef TAP_DANCE_ENABLE +void tap_1(qk_tap_dance_state_t *state, void *user_data) { + switch (state->count) { + case 1: + register_code (KC_1); + unregister_code (KC_1); + break; + case 2: + register_code (KC_ESC); + unregister_code (KC_ESC); + break; + case 3: + register_code (KC_LSFT); + register_code (KC_1); + unregister_code (KC_1); + unregister_code (KC_LSFT); + } +} + +qk_tap_dance_action_t tap_dance_actions[] = { + [0] = ACTION_TAP_DANCE_DOUBLE(KC_1, KC_ESC), + [1] = ACTION_TAP_DANCE_FN(tap_1) +}; +#endif diff --git a/keyboards/handwired/xeal60/keymaps/bbaserdem/README.md b/keyboards/handwired/xeal60/keymaps/bbaserdem/README.md new file mode 100644 index 000000000..4b37d7355 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/bbaserdem/README.md @@ -0,0 +1,27 @@ +# Lets Split Layout + +Check out [user readme](../../../../users/bbaserdem/README.md) for more info. + +# Usage + +**These commands depend on there being no other arduino connected!** +Also udev rules can be set instead of using sudo. +Please unplug all other usb devices. + +To make the hex files; +``` +make lets_split/rev2:bbaserdem +make lets_split/rev2:bbaserdem_right +``` + +For the left half, after plugging in and resetting; (from repo main directory) +``` +sudo avrdude -p atmega32u4 -P "$(ls /dev/ttyACM*)" -c avr109 -D -U flash:w:.build/lets_split_rev2_bbaserdem.hex +sudo avrdude -p atmega32u4 -P "$(ls /dev/ttyACM*)" -c avr109 -U eeprom:w:keyboards/lets_split/eeprom-lefthand.eep +``` + +For the right half; +``` +sudo avrdude -p atmgea34u4 -P "$(ls /dev/ttyACM*)" -c avr109 -D -U flash:w:.build/lets_split_rev2_bbaserdem_right.hex +sudo avrdude -p atmega32u4 -P "$(ls /dev/ttyACM*)" -c avr109 -U eeprom:w:keyboards/lets_split/eeprom-righhand.eep +``` diff --git a/keyboards/handwired/xeal60/keymaps/bbaserdem/config.h b/keyboards/handwired/xeal60/keymaps/bbaserdem/config.h new file mode 100644 index 000000000..6a90e1c35 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/bbaserdem/config.h @@ -0,0 +1,27 @@ +#ifndef CONFIG_KEYMAP_H +#define CONFIG_KEYMAP_H + +#include "../../config.h" + +#define USE_SERIAL +#define EE_HANDS + +// LED strip stuff +#ifdef RGBLIGHT_ENABLE + +// Who thought it was a good idea to predefine these in the rev2/config.h ??? +#ifdef RGBLED_NUM +#undef RGBLED_NUM +#endif +#define RGBLED_NUM 12 + +#define RGBLIGHT_HUE_STEP 6 +#define RGBLIGHT_SAT_STEP 12 +#define RGBLIGHT_VAL_STEP 20 +#define RGBLIGHT_ANIMATIONS +#define RGBLIGHT_EFFECT_SNAKE_LENGTH 6 +#define RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL 2000 +#define RGBLIGHT_EFFECT_CHRISTMAS_STEP 1 +#endif + +#endif diff --git a/keyboards/handwired/xeal60/keymaps/bbaserdem/keymap.c b/keyboards/handwired/xeal60/keymaps/bbaserdem/keymap.c new file mode 100644 index 000000000..623117530 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/bbaserdem/keymap.c @@ -0,0 +1,36 @@ +/* + * Let's Split - Dvorak turkish + * Keymap by @bbaserdem + * Dvorak layout with multiple features + * Most of the code is in the "user" directory. + * Check qmk_firmware/users/bbaserdem for the main part of the code + */ +#define KEYMAP(...) LAYOUT_ortho_4x12(__VA_ARGS__) + +#include "lets_split.h" +#include "bbaserdem.h" + + +void matrix_init_keymap (void) { +} + +uint32_t layer_state_set_keymap(uint32_t state) { + return state; +} + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + // Main Dvorak layer + [_DV] = LAYOUT_letssplit_wrapper(DVORAK), + // Turkish and special character overlay + [_AL] = LAYOUT_letssplit_wrapper(ALTCHAR), + // Gaming layer + [_GA] = LAYOUT_letssplit_wrapper(GAME), + // Numbers layer + [_NU] = LAYOUT_letssplit_wrapper(NUMBERS), + // Settings layer + [_SE] = LAYOUT_letssplit_wrapper(SETTINGS), + // Mouse emulation layer + [_MO] = LAYOUT_letssplit_wrapper(MOUSE), + // Music layer + [_MU] = LAYOUT_letssplit_wrapper(MUSIC), +}; diff --git a/keyboards/handwired/xeal60/keymaps/bbaserdem/rules.mk b/keyboards/handwired/xeal60/keymaps/bbaserdem/rules.mk new file mode 100644 index 000000000..4159db3fe --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/bbaserdem/rules.mk @@ -0,0 +1,11 @@ +# Build options + +BACKLIGHT_ENABLE = no # Switch LEDs +MOUSEKEY_ENABLE = yes # Emulates mouse key using keypresses +RGBLIGHT_ENABLE = yes # LED strips +TAP_DANCE_ENABLE = no # Use multi-tap features +AUDIO_ENABLE = no # Audio stuff + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/handwired/xeal60/keymaps/bbaserdem_right/README.md b/keyboards/handwired/xeal60/keymaps/bbaserdem_right/README.md new file mode 100644 index 000000000..8608f23f7 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/bbaserdem_right/README.md @@ -0,0 +1,5 @@ +# Lets Split - Right Half + +Keymap for my right half, to be used as a numpad. +Check [main readme](../bbaserdem/README.md) for flashing info. + diff --git a/keyboards/handwired/xeal60/keymaps/bbaserdem_right/config.h b/keyboards/handwired/xeal60/keymaps/bbaserdem_right/config.h new file mode 100644 index 000000000..47545a059 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/bbaserdem_right/config.h @@ -0,0 +1,9 @@ +#ifndef CONFIG_KEYMAP_H +#define CONFIG_KEYMAP_H + +#include "../../config.h" + +#define USE_SERIAL +#define EE_HANDS + +#endif diff --git a/keyboards/handwired/xeal60/keymaps/bbaserdem_right/keymap.c b/keyboards/handwired/xeal60/keymaps/bbaserdem_right/keymap.c new file mode 100644 index 000000000..2dcae0dca --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/bbaserdem_right/keymap.c @@ -0,0 +1,31 @@ +/* + * Let's Split - Dvorak turkish + * Keymap by @bbaserdem + * Dvorak layout with multiple features + * Most of the code is in the "user" directory. + * Check qmk_firmware/users/bbaserdem for the main part of the code + */ + +#include "lets_split.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* Navigation All Supered) Numpad + * ,-----------------------. ,-----------------------. + * | F4| ` | Q |Alt| L | > | | ) | - | + | = |Ent|Bkp| + * |---+---+---+---+---+---| |---+---+---+---+---+---| + * | F3| M |Ent|Ctl| K | ^ | | ( | * | 9 | 6 | 3 | . | + * |---+---+---+---+---+---| |---+---+---+---+---+---| + * | F2| T |Spc|Shf| J | v | | % | / | 8 | 5 | 2 | , | + * |---+---+---+---+---+---| |---+---+---+---+---+---| + * | F1| F | P |Tab| H | < | |Nlc|Tab| 7 | 4 | 1 | 0 | + * `-----------------------' `-----------------------' + */ + // Main Dvorak layer + [0] = LAYOUT_ortho_4x12( + LCTL(LALT(KC_DEL)), LGUI(KC_GRV), LGUI(KC_Q), LGUI(KC_LALT), LGUI(KC_L), LGUI(KC_RGHT), KC_RPRN, KC_PMNS, KC_PPLS, KC_PEQL, KC_PENT, KC_BSPC, \ + LGUI(KC_F3), LGUI(KC_M), LGUI(KC_ENT), LGUI(KC_LCTL), LGUI(KC_K), LGUI(KC_UP), KC_LPRN, KC_PAST, KC_P9, KC_P6, KC_P3, KC_PDOT, \ + LGUI(KC_F2), LGUI(KC_T), LGUI(KC_SPC), LGUI(KC_LSFT), LGUI(KC_J), LGUI(KC_DOWN), KC_PERC, KC_PSLS, KC_P8, KC_P5, KC_P2, KC_PCMM, \ + LGUI(KC_F1), LGUI(KC_F), LGUI(KC_P), LGUI(KC_TAB), LGUI(KC_H), LGUI(KC_LEFT), KC_NLCK, KC_TAB, KC_P7, KC_P4, KC_P1, KC_P0 \ + ) +}; diff --git a/keyboards/handwired/xeal60/keymaps/bbaserdem_right/rules.mk b/keyboards/handwired/xeal60/keymaps/bbaserdem_right/rules.mk new file mode 100644 index 000000000..36b4b8fc2 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/bbaserdem_right/rules.mk @@ -0,0 +1,26 @@ +# Build options + +USER_NAME := bbaserdem-without-userspace + +BACKLIGHT_ENABLE = no # Switch LEDs +MOUSEKEY_ENABLE = no # Emulates mouse key using keypresses +RGBLIGHT_ENABLE = no # LED strips +TAP_DANCE_ENABLE = no # Use multi-tap features +AUDIO_ENABLE = no # Audio stuff +BLUETOOTH_ENABLE = no # No bluetooth +COMMAND_ENABLE = no # Some bootmagic thing +BOOTMAGIC_ENABLE = no # Access to EEPROM settings, not needed +CONSOLE_ENABLE = no # Allows console output with a command +SLEEP_LED_ENABLE = no # Breathes LED's when computer is asleep. Untested. +NKRO_ENABLE = no # Default is 6KRO which is plenty +MIDI_ENABLE = no # Untested feature +FAUXCLICKY_ENABLE = no # Emulates clicks using speaker +KEY_LOCK_ENABLE = no # Allows locking any key. Not used +API_SYSEX_ENABLE = no # Allows OS to send signals. +KEY_LOCK_ENABLE = no # Allows locking any key. Not used +UNICODE_ENABLE = no # Used for unicode character emulation +EXTRAKEY_ENABLE = no # OS signals like volume control + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/handwired/xeal60/keymaps/cpeters1982/config.h b/keyboards/handwired/xeal60/keymaps/cpeters1982/config.h new file mode 100644 index 000000000..3639b9c3f --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/cpeters1982/config.h @@ -0,0 +1,54 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +// #define MASTER_LEFT +#define MASTER_RIGHT +// #define EE_HANDS + +// Define Tap Dance interval +//#define TAPPING_TERM 175 + +// // Enable LED strip +#undef RGBLED_NUM +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 10 + +// Space Cadet +#define LSPO_KEY KC_9 +#define RSPC_KEY KC_0 +#define DISABLE_SPACE_CADET_ROLLOVER + +// Auto Shift settings +#define AUTO_SHIFT_TIMEOUT 165 +// #define NO_AUTO_SHIFT_SPECIAL + +#endif diff --git a/keyboards/handwired/xeal60/keymaps/cpeters1982/keymap.c b/keyboards/handwired/xeal60/keymaps/cpeters1982/keymap.c new file mode 100644 index 000000000..9c3eb9475 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/cpeters1982/keymap.c @@ -0,0 +1,221 @@ +#include QMK_KEYBOARD_H + + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +// #define _COLEMAK 1 +// #define _DVORAK 2 +#define _LOWER 1 +#define _RAISE 2 +#define _ADJUST 16 + + + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + // COLEMAK, + // DVORAK, + LOWER, + RAISE, + ADJUST, +}; + +/* +// Tap dance declerations +enum { + TD_GRV_TILD = 0, +}; + +// Tap dance definitions +qk_tap_dance_action_t tap_dance_actions[] = { + [TD_GRV_TILD] = ACTION_TAP_DANCE_DOUBLE(KC_GRV, KC_TILD), +}; +*/ + + + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | ` ~ | Q | W | E | R | T | Y | U | I | O | P | Bspc | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Tab | A | S | D | F | G | H | J | K | L | ; | ' | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Rshift| + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Ctrl | Lalt | GUI | Esc |Lower |KC_SPC |Enter |Raise | [cmd|] alt |= Hypr| - | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = LAYOUT( \ + KC_GRV, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, \ + KC_LCTRL,KC_LALT, KC_LGUI, KC_ESC, TG(_LOWER), LT(_ADJUST, KC_SPC), KC_ENT, TG(_RAISE), MT(MOD_RGUI, KC_LBRC), MT(MOD_RALT, KC_RBRC), MT(MOD_HYPR, KC_EQL), KC_MINS \ +), + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ESC | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bspc | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT( \ + KC_ESC, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,_______,_______,_______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MFFD, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bspc | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MFFD, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | Reset| | | | | | | | | up | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty| | left | down |right | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | | | | % | ` | ~ | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |AShftD|AShftU|REPORT| | | | [ | ] | - | = | \ | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = LAYOUT( \ + _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, KC_UP, KC_DEL, \ + _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, _______, KC_LEFT, KC_DOWN, KC_RGHT, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PERC, KC_GRV, KC_TILD, \ + KC_ASDN, KC_ASUP, KC_ASRP, _______, _______, _______, _______, KC_RBRC, KC_LBRC, KC_MINS, KC_EQL, KC_BSLASH \ +) + + +}; + +/* #ifdef AUDIO_ENABLE +* float tone_qwerty[][2] = SONG(QWERTY_SOUND); +* float tone_dvorak[][2] = SONG(DVORAK_SOUND); +* float tone_colemak[][2] = SONG(COLEMAK_SOUND); +#endif */ + + +void persistent_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_qwerty); + #endif + persistent_default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + break; + } + return true; +}; + +#define rgblight_set_blue rgblight_sethsv (0xFF, 0xFF, 0xFF); +#define rgblight_set_red rgblight_sethsv (0x00, 0xFF, 0xFF); +#define rgblight_set_green rgblight_sethsv (0x78, 0xFF, 0xFF); +#define rgblight_set_orange rgblight_sethsv (0x1E, 0xFF, 0xFF); +#define rgblight_set_teal rgblight_sethsv (0xC3, 0xFF, 0xFF); +#define rgblight_set_magenta rgblight_sethsv (0x12C, 0xFF, 0xFF); +#define rgblight_set_yellow rgblight_sethsv (0x3C, 0xFF, 0xFF); +#define rgblight_set_purple rgblight_sethsv (0x10E, 0xFF, 0xFF); +#define rgblight_set_white rgblight_sethsv (0x00, 0x00, 0xFF); + +uint32_t layer_state_set_user(uint32_t state) { +#ifdef RGBLIGHT_ENABLE + uint8_t default_layer = eeconfig_read_default_layer(); + if (rgb_layer_change) { + switch (biton32(state)) { + case _RAISE: + rgblight_set_orange; + rgblight_mode(5); + break; + case _LOWER: + rgblight_set_teal; + rgblight_mode(5); + break; + case _ADJUST: + rgblight_set_purple; + rgblight_mode(23); + break; + default: + if (default_layer & (1UL << _COLEMAK)) { + rgblight_set_magenta; + } + else if (default_layer & (1UL << _DVORAK)) { + rgblight_set_green; + } + else { + rgblight_set_blue; + } + rgblight_mode(1); + break; + } + } +#endif + return state; +} diff --git a/keyboards/handwired/xeal60/keymaps/cpeters1982/rules.mk b/keyboards/handwired/xeal60/keymaps/cpeters1982/rules.mk new file mode 100644 index 000000000..f2fde785d --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/cpeters1982/rules.mk @@ -0,0 +1,8 @@ + + + +ifndef QUANTUM_DIR + include ../../../../Makefile + AUTO_SHIFT_ENABLE = yes + RGBLIGHT_ENABLE = yes +endif diff --git a/keyboards/handwired/xeal60/keymaps/default/config.h b/keyboards/handwired/xeal60/keymaps/default/config.h new file mode 100644 index 000000000..5a6261c4f --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/default/config.h @@ -0,0 +1,37 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + +#endif diff --git a/keyboards/handwired/xeal60/keymaps/default/keymap.c b/keyboards/handwired/xeal60/keymaps/default/keymap.c new file mode 100644 index 000000000..f78278184 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/default/keymap.c @@ -0,0 +1,211 @@ +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _LOWER 3 +#define _RAISE 4 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + LOWER, + RAISE, + ADJUST, +}; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Adjust| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = LAYOUT_ortho_4x12( + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ + ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Colemak + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | R | S | T | D | H | N | E | I | O | ' | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_COLEMAK] = LAYOUT_ortho_4x12( \ + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, \ + KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ + ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Dvorak + * ,-----------------------------------------------------------------------------------. + * | Tab | ' | , | . | P | Y | F | G | C | R | L | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | O | E | U | I | D | H | T | N | S | / | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_DVORAK] = LAYOUT_ortho_4x12( \ + KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, \ + KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, \ + KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT , \ + ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT_ortho_4x12( \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT_ortho_4x12( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | Reset| | | | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = LAYOUT_ortho_4x12( \ + _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ + _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ +) + + +}; + +#ifdef AUDIO_ENABLE +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +float tone_dvorak[][2] = SONG(DVORAK_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); +#endif + +void persistent_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_qwerty); + #endif + persistent_default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_colemak); + #endif + persistent_default_layer_set(1UL<<_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_dvorak); + #endif + persistent_default_layer_set(1UL<<_DVORAK); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + break; + } + return true; +} diff --git a/keyboards/handwired/xeal60/keymaps/default/rules.mk b/keyboards/handwired/xeal60/keymaps/default/rules.mk new file mode 100644 index 000000000..457a3d01d --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/default/rules.mk @@ -0,0 +1,3 @@ +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/handwired/xeal60/keymaps/dlaroe/config.h b/keyboards/handwired/xeal60/keymaps/dlaroe/config.h new file mode 100644 index 000000000..6b31e8d14 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/dlaroe/config.h @@ -0,0 +1,37 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "config_common.h" + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + +#endif diff --git a/keyboards/handwired/xeal60/keymaps/dlaroe/keymap.c b/keyboards/handwired/xeal60/keymaps/dlaroe/keymap.c new file mode 100644 index 000000000..b2282e0fe --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/dlaroe/keymap.c @@ -0,0 +1,255 @@ +// Can't Remember Sh*t Keymap for Let's Split +// Trying to fit as many characters as possible on the default layer +// as its easier for me to remember logical functions than characters +// Also, I like me some numpad + + +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _ARROW 1 +#define _GAME 2 +#define _LOWER 3 +#define _RAISE 4 +#define _PLOVER 5 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + ARROW, + GAME, + LOWER, + RAISE, + BACKLIT, + PLOVER, + EXT_PLV +}; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Esc | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Tab | A | S | D | F | G | H | J | K | L | ; | ' | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Ctrl | GUI | \ | Alt | Lower|SpcRse| Space|Raise | [ | - | = | ] | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = LAYOUT( \ + KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_ENT), \ + KC_LCTL, KC_LGUI, KC_BSLS, KC_LALT, LOWER, LT(4, KC_SPC), KC_SPC, RAISE, LT(3, KC_LBRC), KC_MINS, KC_EQL, CTL_T(KC_RBRC) \ +), + +/* Arrow + * ,-----------------------------------------------------------------------------------. + * | Esc | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Tab | A | S | D | F | G | H | J | K | L | ; | ' | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Ctrl | GUI | \ | Alt | Lower|SpcRse| Space|Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_ARROW] = LAYOUT( \ + KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_ENT), \ + KC_LCTL, KC_LGUI, KC_BSLS, KC_LALT, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT \ +), + +/* Game + * ,-----------------------------------------------------------------------------------. + * | 1 | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * |Shift | A | S | D | F | G | H | J | K | L | ; | ' | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Ctrl | Z | X | C | V | B | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Alt | 4 | 3 | 2 | Lower| Space |Raise | Left | Down | Up | Right| + * `-----------------------------------------------------------------------------------' + */ +[_GAME] = LAYOUT( \ + KC_1, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LCTL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______ , \ + KC_LALT, KC_4, KC_3, KC_2, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT \ +), + + +/* Lower (switched to # because KP# were weird in terminal emulators) + * ,-----------------------------------------------------------------------------------. + * | Del | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Tab | F1 | F2 | F3 | F4 | F5 | F6 | 4 | 5 | 6 | . | * | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | 1 | 2 | 3 | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Esc | | | | | | 0 | | | | KP_+ | | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT( \ + KC_DEL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, \ + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_4, KC_5, KC_6, KC_DOT, KC_ASTR, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_1, KC_2, KC_3, KC_SLSH, _______, \ + KC_ESC, _______, _______, _______, _______, _______, KC_0, _______, _______, _______, KC_PLUS, _______ \ +), + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | Wh Up|RightC| M-Up | LeftC|QWERTY| Left | Down | Up | Right| | | ` | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | Wh Dn| M-L | M-Dn | M-R | | - | = | [ | ] | \ | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | App | | | | | Ins | | Home | PGDN | PGUP | End | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT( \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \ + KC_DEL, KC_WH_U, KC_BTN2, KC_MS_U, KC_BTN1, QWERTY, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_PIPE, KC_GRV, \ + _______, KC_WH_D, KC_MS_L, KC_MS_D, KC_MS_R, _______, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLASH, _______, \ + _______, KC_APP, _______, _______, _______, _______, KC_INS, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END \ +), + +/* Plover layer (http://opensteno.org) + * ,-----------------------------------------------------------------------------------. + * | # | # | # | # | # | # | # | # | # | # | # | # | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | S | T | P | H | * | * | F | P | L | T | D | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | S | K | W | R | * | * | R | B | G | S | Z | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Exit | | | A | O | | E | U | | | | + * `-----------------------------------------------------------------------------------' + */ + +[_PLOVER] = LAYOUT ( \ + KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1 , \ + XXXXXXX, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, \ + XXXXXXX, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + EXT_PLV, XXXXXXX, XXXXXXX, KC_C, KC_V, XXXXXXX, XXXXXXX, KC_N, KC_M, XXXXXXX, XXXXXXX, XXXXXXX \ +), + + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | C-A-I|Qwerty| | |Reset |Macro0| | | | | |C-A-D | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|Audoff| Game |AGswap|AGnorm| | | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | |Voice-|Voice+|Mus on|Musoff| Prev | Next | Mute | VolDn| VolUp| | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Brite| | | | | Play/Pause | | BL_T |BL_DEC|BL_INC|BL_ST | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = LAYOUT( \ + LALT(LCTL(KC_INS)), QWERTY, _______, _______, RESET, M(0), _______, _______, _______, _______, _______, LALT(LCTL(KC_DEL)), \ + _______, _______, _______, AU_ON, AU_OFF, GAME, AG_SWAP, AG_NORM, _______, _______, _______, _______, \ + _______, MUV_DE, MUV_IN, MU_ON, MU_OFF, KC_MPRV, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, \ + BACKLIT, _______, _______, _______, _______, KC_MPLY, KC_MPLY, _______, BL_TOGG, BL_DEC , BL_INC , BL_STEP \ +) + + +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) // this is the function signature -- just copy/paste it into your keymap file as it is. +{ + switch(id) { + case 0: // this would trigger when you hit a key mapped as M(0) + if (record->event.pressed) { + return MACRO( D(LSFT), T(LEFT), U(LSFT), D(LCTL), T(X), U(LCTL), T(RIGHT), D(LCTL), T(V), U(LCTL), T(LEFT), END ); // this swaps the characters on either side of the cursor when the macro executes + } + break; + } + return MACRO_NONE; +}; + + +#ifdef AUDIO_ENABLE +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); +#endif + + +void persistant_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_qwerty); + #endif + persistant_default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case GAME: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(music_scale); + #endif + persistant_default_layer_set(1UL<<_GAME); + } + return false; + break; + + + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case BACKLIT: + if (record->event.pressed) { + register_code(KC_RSFT); + #ifdef BACKLIGHT_ENABLE + backlight_step(); + #endif + } else { + unregister_code(KC_RSFT); + } + return false; + break; + } + return true; +} + +void matrix_init_user(void) { + +} diff --git a/keyboards/handwired/xeal60/keymaps/dlaroe/rules.mk b/keyboards/handwired/xeal60/keymaps/dlaroe/rules.mk new file mode 100644 index 000000000..e69de29bb diff --git a/keyboards/handwired/xeal60/keymaps/drashna/config.h b/keyboards/handwired/xeal60/keymaps/drashna/config.h new file mode 100644 index 000000000..5bc5598ee --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/drashna/config.h @@ -0,0 +1,80 @@ +/* +Copyright 2017 Danny Nguyen + +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 . +*/ + +#pragma once + +#ifdef RGBLIGHT_ENABLE +#undef RGBLED_NUM +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 16 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 +#define RGBLIGHT_EFFECT_KNIGHT_LENGTH 2 +#define RGBLIGHT_EFFECT_SNAKE_LENGTH 2 +#define RGBLIGHT_EFFECT_BREATHE_CENTER 1 +#define RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL 300 +#define RGBLIGHT_EFFECT_CHRISTMAS_STEP 1 +#endif // RGBLIGHT_ENABLE + + +#undef LOCKING_SUPPORT_ENABLE +#undef LOCKING_RESYNC_ENABLE + +#ifndef NO_DEBUG +#define NO_DEBUG +#endif // !NO_DEBUG +#ifndef NO_PRINT +#define NO_PRINT +#endif // !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 + +#undef PRODUCT +#define PRODUCT Drashnas Viterbi Macro Pad + +#define USE_I2C + +#ifdef AUDIO_ENABLE +#define C6_AUDIO +#define NO_MUSIC_MODE +#endif + +#define LAYOUT_ortho_5x7( \ + L00, L01, L02, L03, L04, L05, L06, \ + L10, L11, L12, L13, L14, L15, L16, \ + L20, L21, L22, L23, L24, L25, L26, \ + L30, L31, L32, L33, L34, L35, L36, \ + L40, L41, L42, L43, L44, L45, L46 \ + ) \ + LAYOUT( \ + L00, L01, L02, L03, L04, L05, L06, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ + L10, L11, L12, L13, L14, L15, L16, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ + L20, L21, L22, L23, L24, L25, L26, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ + L30, L31, L32, L33, L34, L35, L36, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ + L40, L41, L42, L43, L44, L45, L46, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO \ + ) + +#define QMK_ESC_OUTPUT F5 // usually COL +#define QMK_ESC_INPUT D4 // usually ROW +#define QMK_LED B0 +#define QMK_SPEAKER C6 diff --git a/keyboards/handwired/xeal60/keymaps/drashna/keymap.c b/keyboards/handwired/xeal60/keymaps/drashna/keymap.c new file mode 100644 index 000000000..68ca593db --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/drashna/keymap.c @@ -0,0 +1,98 @@ +#include QMK_KEYBOARD_H +#include "drashna.h" + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. + + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +#define LMACRO TG(_MACROS) +#define DIABLO TG(_DIABLO) +#define GAMEPAD TG(_GAMEPAD) +#define MEDIA TT(_MEDIA) + + +//enum more_custom_keycodes { +// KC_P00 = NEW_SAFE_RANGE +//}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_NUMLOCK] = LAYOUT_ortho_5x7( + LMACRO, DIABLO, GAMEPAD, KC_NLCK, KC_SLCK, KC_COLN, KC_PSLS, + MEDIA, KC_CALC, XXXXXXX, KC_P7, KC_P8, KC_P9, KC_PAST, + KC_HOME, KC_DEL, KC_PGUP, KC_P4, KC_P5, KC_P6, KC_PMNS, + KC_END, KC_UP, KC_PGDN, KC_P1, KC_P2, KC_P3, KC_PPLS, + KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_COLN, KC_PENT + ), + + [_DIABLO] = LAYOUT_ortho_5x7( + KC_ESC, DIABLO, KC_V, KC_D, XXXXXXX, XXXXXXX, KC_L, + KC_TAB, KC_S, KC_F, KC_I, KC_M, KC_T, KC_J, + KC_Q, KC_1, KC_2, KC_3, KC_4, KC_G, KC_F, + KC_LCTL, KC_D3_3, KC_D3_3, KC_D3_3, KC_D3_3, KC_Z, KC_DIABLO_CLEAR, + KC_LALT, KC_F4, KC_F5, KC_F8, KC_F9, KC_F10, SFT_T(KC_SPACE) + ), + + [_GAMEPAD] = LAYOUT_ortho_5x7( // Game pad layout designed primarily for Overwatch + LMACRO, KC_ESC, GAMEPAD, KC_1, KC_2, KC_3, KC_4, + MEDIA, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, + KC_Z, KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, + KC_Y, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, + KC_F1, KC_U, KC_I, KC_Y, KC_V, KC_SPC, KC_V + ), + + [_MACROS] = LAYOUT_ortho_5x7( + LMACRO, KC_OVERWATCH,GAMEPAD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_C9, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_SYMM, KC_TORB, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_GLHF, KC_GOODGAME, KC_GGEZ, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_SALT, KC_MORESALT, KC_SALTHARD, KC_JUSTGAME, KC_AIM, XXXXXXX, KC_PENT + ), + + + [_MEDIA] = LAYOUT_ortho_5x7( + KC_MAKE, KC_RESET,MU_TOG, AU_ON, AU_OFF, CK_TOGG, RGB_SAD, + MEDIA, EPRM, KC_RGB_T,RGB_M_P, RGB_M_B, RGB_M_R, RGB_SAI, + RGB_TOG, RGB_MOD, RGB_RMOD,RGB_M_SW,RGB_M_SN,RGB_M_K, RGB_HUD, + KC_MPLY, KC_MPRV, KC_MNXT, RGB_M_X, RGB_M_G, RGB_M_P, RGB_HUI, + KC_MUTE, KC_VOLD, KC_VOLU, XXXXXXX, XXXXXXX, RGB_VAD, RGB_VAI + ) + + +}; + + + +bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { + + //switch (keycode) { + //case KC_P00: + // if (!record->event.pressed) { + // tap(KC_KP_0); + // tap(KC_KP_0); + // } + // return false; + // break; + //} + return true; +} + + + +void matrix_init_keymap(void) { + DDRD &= ~(1<<5); + PORTD &= ~(1<<5); + + DDRB &= ~(1<<0); + PORTB &= ~(1<<0); +} + + diff --git a/keyboards/handwired/xeal60/keymaps/drashna/rules.mk b/keyboards/handwired/xeal60/keymaps/drashna/rules.mk new file mode 100644 index 000000000..ec3befc0b --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/drashna/rules.mk @@ -0,0 +1,25 @@ +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +TAP_DANCE_ENABLE = no +RGBLIGHT_ENABLE = yes +AUDIO_ENABLE = yes +NKRO_ENABLE = yes + +NO_SECRETS = yes +MACROS_ENABLED = yes +INDICATOR_LIGHTS = no +RGBLIGHT_TWINKLE = no + +LAYOUTS = ortho_5x7 + +# SRC := $(filter-out serial.c matrix.c i2c.c split_util.c,$(SRC)) +# SRC := $(filter-out serial.c,$(SRC)) +# SRC := $(filter-out matrix.c,$(SRC)) +# SRC := $(filter-out i2c.c,$(SRC)) +# SRC := $(filter-out split_util.c,$(SRC)) +# SRC += quantum/matrix.c + +BOOTLOADER = qmk-dfu diff --git a/keyboards/handwired/xeal60/keymaps/drashna_old/config.h b/keyboards/handwired/xeal60/keymaps/drashna_old/config.h new file mode 100644 index 000000000..ddf9d1a40 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/drashna_old/config.h @@ -0,0 +1,86 @@ +/* +Copyright 2017 Danny Nguyen + +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 . +*/ + +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include QMK_KEYBOARD_CONFIG_H + + +#ifdef RGBLIGHT_ENABLE +#undef RGBLED_NUM +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 12 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 +#define RGBLIGHT_EFFECT_KNIGHT_LENGTH 2 +#define RGBLIGHT_EFFECT_SNAKE_LENGTH 2 +#define RGBLIGHT_EFFECT_BREATHE_CENTER 1 +#define RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL 300 +#define RGBLIGHT_EFFECT_CHRISTMAS_STEP 1 +#endif // RGBLIGHT_ENABLE + + +#undef LOCKING_SUPPORT_ENABLE +#undef LOCKING_RESYNC_ENABLE + +#ifndef NO_DEBUG +#define NO_DEBUG +#endif // !NO_DEBUG +#ifndef NO_PRINT +#define NO_PRINT +#endif // !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 + +#undef PRODUCT +#define PRODUCT Drashnas Viterbi Macro Pad + +#define USE_I2C + +#ifdef AUDIO_ENABLE +#define C6_AUDIO +#define NO_MUSIC_MODE +#endif + +#define LAYOUT_ortho_5x7( \ + L00, L01, L02, L03, L04, L05, L06, \ + L10, L11, L12, L13, L14, L15, L16, \ + L20, L21, L22, L23, L24, L25, L26, \ + L30, L31, L32, L33, L34, L35, L36, \ + L40, L41, L42, L43, L44, L45, L46 \ + ) \ + LAYOUT( \ + L00, L01, L02, L03, L04, L05, L06, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ + L10, L11, L12, L13, L14, L15, L16, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ + L20, L21, L22, L23, L24, L25, L26, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ + L30, L31, L32, L33, L34, L35, L36, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ + L40, L41, L42, L43, L44, L45, L46, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO \ + ) + +#endif + +#define QMK_ESC_OUTPUT F5 // usually COL +#define QMK_ESC_INPUT D4 // usually ROW +#define QMK_LED B0 +#define QMK_SPEAKER C6 diff --git a/keyboards/handwired/xeal60/keymaps/drashna_old/keymap.c b/keyboards/handwired/xeal60/keymaps/drashna_old/keymap.c new file mode 100644 index 000000000..2d361da9a --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/drashna_old/keymap.c @@ -0,0 +1 @@ +//placeholder \ No newline at end of file diff --git a/keyboards/handwired/xeal60/keymaps/drashna_old/rules.mk b/keyboards/handwired/xeal60/keymaps/drashna_old/rules.mk new file mode 100644 index 000000000..14ac6a6b3 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/drashna_old/rules.mk @@ -0,0 +1,28 @@ +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +TAP_DANCE_ENABLE = no +RGBLIGHT_ENABLE = yes +AUDIO_ENABLE = yes +NKRO_ENABLE = yes + +NO_SECRETS = yes +MACROS_ENABLED = yes +INDICATOR_LIGHTS = no +RGBLIGHT_TWINKLE = no + +LAYOUTS = ortho_5x7 + +# SRC := $(filter-out serial.c matrix.c i2c.c split_util.c,$(SRC)) +# SRC := $(filter-out serial.c,$(SRC)) +# SRC := $(filter-out matrix.c,$(SRC)) +# SRC := $(filter-out i2c.c,$(SRC)) +# SRC := $(filter-out split_util.c,$(SRC)) +# SRC += quantum/matrix.c + +USER_NAME := drashna +SRC += ../drashna/keymap.c + +BOOTLOADER = qmk-dfu diff --git a/keyboards/handwired/xeal60/keymaps/dwallace/config.h b/keyboards/handwired/xeal60/keymaps/dwallace/config.h new file mode 100644 index 000000000..585b41dbc --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/dwallace/config.h @@ -0,0 +1,43 @@ +/* +Copyright 2017 Danny Nguyen + +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 . +*/ + +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + +#define TAPPING_TERM 150 + +#undef RGBLED_NUM +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 14 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 + +#endif diff --git a/keyboards/handwired/xeal60/keymaps/dwallace/keymap.c b/keyboards/handwired/xeal60/keymaps/dwallace/keymap.c new file mode 100644 index 000000000..241024482 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/dwallace/keymap.c @@ -0,0 +1,224 @@ +#include "viterbi.h" +#include "action_layer.h" +#include "eeconfig.h" +#ifdef RGBLIGHT_ENABLE +#include "rgblight.h" +#endif + +extern keymap_config_t keymap_config; + +#define _QWERTY 0 +#define _FN 1 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + STK_SHIFT, + STK_CTRL, + STK_ALT, + STK_GUI, + STK_META, + STK_CLEAR, + RGB_LEVEL_UP, + RGB_LEVEL_DOWN, +}; + +#define KC_ KC_TRNS +#define _______ KC_TRNS + +#define KC_SWIN LGUI(KC_TILD) // Switch between windows +#define KC_SAPP LGUI(KC_TAB) // Switch between applications +#define KC_FN1 MO(_FN) +#define KC_LCAG LCAG(KC_NO) +#define KC_RTOG RGB_TOG +#define KC_RGUP RGB_LEVEL_UP +#define KC_RGDN RGB_LEVEL_DOWN +#define KC_RST RESET +#define KC_SSFT STK_SHIFT +#define KC_SCTL STK_CTRL +#define KC_SALT STK_ALT +#define KC_SGUI STK_GUI +#define KC_SMTA STK_META +#define KC_SCLR STK_CLEAR + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_QWERTY] = LAYOUT_kc( + //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. + GRV , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,MINS,EQL ,BSPC, + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + TAB , Q , W , E , R , T ,LBRC, Y , U , I , O , P ,BSLS,PGUP, + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + ESC , A , S , D , F , G ,RBRC, H , J , K , L ,SCLN,QUOT,ENT , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + SSFT, Z , X , C , V , B ,SWIN, N , M ,COMM,DOT , UP ,SLSH,RSFT, + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + SCTL,SMTA,SALT,SGUI,SPC ,SCLR,SAPP, FN1 ,SPC ,RGUI,LEFT,DOWN,RGHT,PGDN + //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' + ), + + [_FN] = LAYOUT_kc( + //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. + , F1 , F2 , F3 , F4 , F5 , F6 , F7 , F8 , F9 ,F10 ,F11 ,F12 , , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + , , , ,RST , , , , , , , , , , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + , , , , , , , RTOG, ,RGDN,RGUP, , , , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + , , , , , , , ,MUTE,VOLD,VOLU, , , , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + , , , , , , , , , , , , , + //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' + ) + +}; + +#ifdef AUDIO_ENABLE +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +#endif + +void persistent_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool modifier_already_applied = false; +uint8_t physically_held_modifiers = 0; +uint8_t last_mods = 0xFF; +uint8_t rgb_dimming = 0; +#define SET_LED_RGB(val, led_num) setrgb(((val >> 16) & 0xFF) >> rgb_dimming, ((val >> 8) & 0xFF) >> rgb_dimming, (val & 0xFF) >> rgb_dimming, (LED_TYPE *)&led[led_num]) + +void update_underglow_level(void) { + if (get_mods() == last_mods) + return; + + last_mods = get_mods(); + + if (get_mods() == 0) { + uint8_t level = 0x10 >> rgb_dimming; + rgblight_setrgb(level, level, level); + return; + } + + uint32_t mod_colors[4] = {0}; + uint8_t mod_count = 0; + rgblight_setrgb(0x00, 0x00, 0x00); + + if (get_mods() & MOD_BIT(KC_LSFT)) + mod_colors[mod_count++] = 0xFF0000; + if (get_mods() & MOD_BIT(KC_LCTL)) + mod_colors[mod_count++] = 0x00FF00; + if (get_mods() & MOD_BIT(KC_LALT)) + mod_colors[mod_count++] = 0x0000FF; + if (get_mods() & MOD_BIT(KC_LGUI)) + mod_colors[mod_count++] = 0xFFFF00; + + uint8_t led_num = 0; + for (int m = 0; m < mod_count; m++) { + for (; led_num < RGBLED_NUM*(m+1)/mod_count; led_num++) { + SET_LED_RGB(mod_colors[m], led_num); + } + } + rgblight_set(); +} + +void add_sticky_modifier(uint16_t keycode) { + add_mods(MOD_BIT(keycode)); + register_code(keycode); + modifier_already_applied = false; +} + +void clear_sticky_modifiers(void) { + unregister_code(KC_LSFT); + unregister_code(KC_LCTL); + unregister_code(KC_LALT); + unregister_code(KC_LGUI); + update_underglow_level(); +} + +void handle_sticky_modifier_event(uint16_t keycode, bool pressed) { + if (pressed) { + add_sticky_modifier(keycode); + physically_held_modifiers |= MOD_BIT(keycode); + } else { + del_mods(MOD_BIT(keycode)); + physically_held_modifiers &= ~MOD_BIT(keycode); + if (modifier_already_applied) { + clear_sticky_modifiers(); + } else { + add_sticky_modifier(keycode); + } + } + update_underglow_level(); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_qwerty, false, 0); + #endif + persistent_default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case STK_SHIFT: + handle_sticky_modifier_event(KC_LSFT, record->event.pressed); + return false; + break; + case STK_CTRL: + handle_sticky_modifier_event(KC_LCTL, record->event.pressed); + return false; + break; + case STK_ALT: + handle_sticky_modifier_event(KC_LALT, record->event.pressed); + return false; + break; + case STK_GUI: + handle_sticky_modifier_event(KC_LGUI, record->event.pressed); + return false; + break; + case STK_META: + handle_sticky_modifier_event(KC_LCTL, record->event.pressed); + handle_sticky_modifier_event(KC_LALT, record->event.pressed); + handle_sticky_modifier_event(KC_LGUI, record->event.pressed); + return false; + break; + case STK_CLEAR: + if (record->event.pressed) { + clear_sticky_modifiers(); + } + return false; + break; + case RGB_LEVEL_DOWN: + if (record->event.pressed && rgb_dimming < 8) { + rgb_dimming++; + } + return false; + break; + case RGB_LEVEL_UP: + if (record->event.pressed && rgb_dimming > 0) { + rgb_dimming--; + } + return false; + break; + } + if (!record->event.pressed && IS_KEY(keycode)) { + modifier_already_applied = true; + if (physically_held_modifiers == 0) + clear_sticky_modifiers(); + } + return true; +} + +void matrix_init_user(void) { + #ifdef RGBLIGHT_ENABLE + rgblight_enable(); + #endif //RGBLIGHT_ENABLE +} + +void matrix_scan_user(void) { + #ifdef RGBLIGHT_ENABLE + update_underglow_level(); + #endif //RGBLIGHT_ENABLE +} diff --git a/keyboards/handwired/xeal60/keymaps/dwallace/rules.mk b/keyboards/handwired/xeal60/keymaps/dwallace/rules.mk new file mode 100644 index 000000000..1e3cebb14 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/dwallace/rules.mk @@ -0,0 +1 @@ +RGBLIGHT_ENABLE = yes diff --git a/keyboards/handwired/xeal60/keymaps/fabian/config.h b/keyboards/handwired/xeal60/keymaps/fabian/config.h new file mode 100644 index 000000000..6ae40cc2b --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/fabian/config.h @@ -0,0 +1,34 @@ +/* +Copyright 2012 Jun Wako + +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 . +*/ + + +#define USE_SERIAL + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + + +#ifdef SUBPROJECT_rev1 + #include "../../rev1/config.h" +#endif +#ifdef SUBPROJECT_rev2 + #include "../../rev2/config.h" +#endif +#ifdef SUBPROJECT_rev2fliphalf + #include "../../rev2fliphalf/config.h" +#endif diff --git a/keyboards/handwired/xeal60/keymaps/fabian/keymap.c b/keyboards/handwired/xeal60/keymaps/fabian/keymap.c new file mode 100644 index 000000000..37053a8e4 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/fabian/keymap.c @@ -0,0 +1,271 @@ +/* Copyright 2015-2017 Jack Humbert + * + * 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 . + */ + +#include QMK_KEYBOARD_H + + +extern keymap_config_t keymap_config; + +enum custom_layers { + _QWERTY, + _COLEMAK, + _DVORAK, + _LOWER, + _RAISE, + _PLOVER, + _ADJUST +}; + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + PLOVER, + LOWER, + RAISE, + BACKLIT, + EXT_PLV, +}; + +#define XXXXXXX KC_NO +#define _______ KC_TRNS + +#define CTL_ESC CTL_T(KC_ESC) // Tap for Escape, hold for Control +#define HPR_TAB ALL_T(KC_TAB) // Tap for Tab, hold for Hyper (Super+Ctrl+Alt+Shift) +#define MEH_GRV MEH_T(KC_GRV) // Tap for Backtick, hold for Meh (Ctrl+Alt+Shift) +#define SFT_BSP SFT_T(KC_BSPC) // Tap for Backspace, hold for Shift +#define SFT_ENT SFT_T(KC_ENT) // Tap for Enter, hold for Shift +#define SFT_SPC SFT_T(KC_SPC) // Tap for Space, hold for Shift +#define UMLAUT RALT(KC_U) // Combine Alt and U + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Ctrl | Meh | Alt | GUI |Lower |Space | Tab |Raise | GUI |AltGr | Umlt | Ctrl | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = LAYOUT( \ + HPR_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + CTL_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + SFT_BSP, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_ENT , \ + KC_LCTL, MEH_GRV, KC_LALT, KC_LGUI, LOWER, KC_SPC, HPR_TAB, RAISE, KC_RGUI, KC_RALT, UMLAUT, KC_RCTL \ +), + +/* Colemak + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | R | S | T | D | H | N | E | I | O | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Ctrl | Meh | Alt | GUI |Lower |Space | Tab |Raise | GUI |AltGr | Umlt | Ctrl | + * `-----------------------------------------------------------------------------------' + */ +[_COLEMAK] = LAYOUT( \ + HPR_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, \ + CTL_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \ + SFT_BSP, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_ENT , \ + KC_LCTL, MEH_GRV, KC_LALT, KC_LGUI, LOWER, KC_SPC, HPR_TAB, RAISE, KC_RGUI, KC_RALT, UMLAUT, KC_RCTL \ +), + +/* Dvorak + * ,-----------------------------------------------------------------------------------. + * | Tab | " | , | . | P | Y | F | G | C | R | L | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | O | E | U | I | D | H | T | N | S | / | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Ctrl | Meh | Alt | GUI |Lower |Space | Tab |Raise | GUI |AltGr | Umlt | Ctrl | + * `-----------------------------------------------------------------------------------' + */ +[_DVORAK] = LAYOUT( \ + HPR_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, \ + CTL_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, \ + SFT_BSP, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, SFT_ENT , \ + KC_LCTL, MEH_GRV, KC_LALT, KC_LGUI, LOWER, KC_SPC, HPR_TAB, RAISE, KC_RGUI, KC_RALT, UMLAUT, KC_RCTL \ +), + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | MS L | MS D |MS U | MS R |MS Btn| + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT( \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, KC_BTN1, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | Left | Down | Up | Rght |MS_BN2| + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_BTN2, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Plover layer (http://opensteno.org) + * ,-----------------------------------------------------------------------------------. + * | # | # | # | # | # | # | # | # | # | # | # | # | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | S | T | P | H | * | * | F | P | L | T | D | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | S | K | W | R | * | * | R | B | G | S | Z | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Exit | | | A | O | | | E | U | | | | + * `-----------------------------------------------------------------------------------' + */ + +[_PLOVER] = LAYOUT( \ + KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, \ + XXXXXXX, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, \ + XXXXXXX, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + EXT_PLV, XXXXXXX, XXXXXXX, KC_C, KC_V, XXXXXXX, XXXXXXX, KC_N, KC_M, XXXXXXX, XXXXXXX, XXXXXXX \ +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | Reset| | | | | | | | | Reset| Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak|Plover| | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof| | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = LAYOUT( \ + _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, RESET, KC_DEL , \ + _______, _______, MU_MOD, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, PLOVER, _______, \ + _______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ +) + +}; + +#ifdef AUDIO_ENABLE + float plover_song[][2] = SONG(PLOVER_SOUND); + float plover_gb_song[][2] = SONG(PLOVER_GOODBYE_SOUND); +#endif + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + set_single_persistent_default_layer(_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + set_single_persistent_default_layer(_DVORAK); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case BACKLIT: + if (record->event.pressed) { + register_code(KC_RSFT); + #ifdef BACKLIGHT_ENABLE + backlight_step(); + #endif + } else { + unregister_code(KC_RSFT); + } + return false; + break; + case PLOVER: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + stop_all_notes(); + PLAY_SONG(plover_song); + #endif + layer_off(_RAISE); + layer_off(_LOWER); + layer_off(_ADJUST); + layer_on(_PLOVER); + if (!eeconfig_is_enabled()) { + eeconfig_init(); + } + keymap_config.raw = eeconfig_read_keymap(); + keymap_config.nkro = 1; + eeconfig_update_keymap(keymap_config.raw); + } + return false; + break; + case EXT_PLV: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(plover_gb_song); + #endif + layer_off(_PLOVER); + } + return false; + break; + } + return true; +} diff --git a/keyboards/handwired/xeal60/keymaps/fabian/rules.mk b/keyboards/handwired/xeal60/keymaps/fabian/rules.mk new file mode 100644 index 000000000..b8c82cb99 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/fabian/rules.mk @@ -0,0 +1,9 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +# UNICODE_ENABLE = yes + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/handwired/xeal60/keymaps/fido/config.h b/keyboards/handwired/xeal60/keymaps/fido/config.h new file mode 100644 index 000000000..5cb108365 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/fido/config.h @@ -0,0 +1,45 @@ +/* +Copyright 2018 Danny Nguyen + +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 . +*/ + +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +#define MASTER_LEFT +#ifndef MASTER_LEFT + #define MASTER_RIGHT +#endif +// #define EE_HANDS + +#define TAPPING_TERM 150 + +#undef RGBLED_NUM +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 2 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 + +#endif diff --git a/keyboards/handwired/xeal60/keymaps/fido/keymap.c b/keyboards/handwired/xeal60/keymaps/fido/keymap.c new file mode 100644 index 000000000..b8ef46008 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/fido/keymap.c @@ -0,0 +1,74 @@ +#include "viterbi.h" +#include "action_layer.h" +#include "eeconfig.h" +#ifdef RGBLIGHT_ENABLE +#include "rgblight.h" +#endif + +extern keymap_config_t keymap_config; + +#define _QWERTY 0 +#define _FN 1 + +#define KC_ KC_TRNS +#define _______ KC_TRNS + +#define KC_FN1 MO(_FN) +#define KC_WD_L LCTL(KC_LEFT) +#define KC_WD_R LCTL(KC_RGHT) +#define KC_RTOG RGB_TOG +#define KC_RMOD RGB_MOD +#define KC_RHUI RGB_HUI +#define KC_RHUD RGB_HUD +#define KC_RSAI RGB_SAI +#define KC_RSAD RGB_SAD +#define KC_RVAI RGB_VAI +#define KC_RVAD RGB_VAD +#define KC_RST RESET +#define KC_CTLZ LCTL(KC_Z) +#define KC_CTLX LCTL(KC_X) +#define KC_CTLC LCTL(KC_C) +#define KC_CTLV LCTL(KC_V) +#define KC_ATAB LALT(KC_TAB) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_QWERTY] = LAYOUT_kc( + //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. + 1 , 2 , 3 , 4 , 5 , 6 ,ESC , DEL , 7 , 8 , 9 , 0 ,MINS,EQL , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + RBRC, Q , W , E , R , T ,TAB , BSPC, Y , U , I , O , P ,LBRC, + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + GRV , A , S , D , F , G ,LALT, CAPS, H , J , K , L ,SCLN,QUOT, + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + BSLS, Z , X , C , V , B ,LSFT, RSFT, N , M ,COMM,DOT ,SLSH,ENT , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + INS ,PSCR,MENU,LGUI,LCTL,SPC ,FN1 , FN1 ,SPC ,RCTL,RALT, , , + //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' + ), + + [_FN] = LAYOUT_kc( + //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. + F1 , F2 , F3 , F4 , F5 , F6 , , , F7 , F8 , F9 ,F10 ,F11 ,F12 , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + ,PGUP,WD_L, UP ,WD_R, ,ATAB, ,RMOD,RHUI,RSAI,RVAI, , , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + ,HOME,LEFT,DOWN,RGHT, , , , ,RHUD,RSAD,RVAD, , , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + ,CTLZ,CTLX,CTLC,CTLV, , , ,MUTE,VOLD,VOLU, , , , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + , , , , , , , , , , , , , + //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' + ) + +}; + +void led_set_user(uint8_t usb_led) { + #ifdef RGBLIGHT_ENABLE + if (usb_led & (1 << USB_LED_CAPS_LOCK)) { + rgblight_enable(); + } else { + rgblight_disable(); + } + #endif //RGBLIGHT_ENABLE +} diff --git a/keyboards/handwired/xeal60/keymaps/fido/rules.mk b/keyboards/handwired/xeal60/keymaps/fido/rules.mk new file mode 100644 index 000000000..1e3cebb14 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/fido/rules.mk @@ -0,0 +1 @@ +RGBLIGHT_ENABLE = yes diff --git a/keyboards/handwired/xeal60/keymaps/heartrobotninja/config.h b/keyboards/handwired/xeal60/keymaps/heartrobotninja/config.h new file mode 100644 index 000000000..bb3556e57 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/heartrobotninja/config.h @@ -0,0 +1,58 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL + +/* Select hand configuration */ + +// #define MASTER_LEFT +// #define MASTER_RIGHT +#define EE_HANDS + +#define ONESHOT_TAP_TOGGLE 2 +#define ONESHOT_TIMEOUT 1000 + +#undef LEADER_TIMEOUT +#define LEADER_TIMEOUT 1000 + +#undef TAPPING_TERM +#define TAPPING_TERM 200 + +#undef TAPPING_TOGGLE +#define TAPPING_TOGGLE 2 + +#ifdef SUBPROJECT_rev1 +#include "../../rev1/config.h" +#endif +#ifdef SUBPROJECT_rev2 +#include "../../rev2/config.h" +#endif +#ifdef SUBPROJECT_rev2fliphalf +#include "../../rev2fliphalf/config.h" +#endif + +#endif \ No newline at end of file diff --git a/keyboards/handwired/xeal60/keymaps/heartrobotninja/keymap.c b/keyboards/handwired/xeal60/keymaps/heartrobotninja/keymap.c new file mode 100644 index 000000000..3a7ef9db3 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/heartrobotninja/keymap.c @@ -0,0 +1,180 @@ +#include QMK_KEYBOARD_H + + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _COLE 0 +#define _LOWER 1 +#define _RAISE 2 +#define _AUX 16 + +/* Layers */ +enum +{ + COLE = 0, + LOWER, // right hand 10 key. + RAISE, // left hand Fn, right hand symbols. + AUX, +}; + +/* Tap Dancery */ +enum +{ + TD_BTK, + TD_TDE, + TD_LPRN, + TD_RPRN, + TD_MIN, + TD_USC, +}; + +bool time_travel = false; + +// Fillers to make layering more clear +#define ____ KC_TRNS + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* Colemak + * ,-----------------------------------------------------------------------------------. + * | ' " `| Q | W | F | P | G | J | L | U | Y | = + | ~ ; :| + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | ( [ {| A | R | S | T | D | H | N | E | I | O | ) ] }| + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | - , <| Z | X | C | V | B | K | M | ? | | | ^ | _ . >| + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Lower |Raise | Ctrl | Alt | Bksp | Spc |Enter |LShft | ESC | < | v | > | + * `-----------------------------------------------------------------------------------' + */ + [_COLE] = LAYOUT( + TD(TD_BTK), KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_EQL, TD(TD_TDE), + TD(TD_LPRN), KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, TD(TD_RPRN), + TD(TD_MIN), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_SLSH, KC_BSLS, KC_UP, TD(TD_USC), + LOWER, RAISE, OSM(MOD_LCTL), OSM(MOD_LALT), KC_SPC, KC_BSPC, KC_ENT, OSM(MOD_LSFT), KC_ESC, KC_LEFT, KC_DOWN, KC_RGHT), + + /* Lower + * ,-----------------------------------------------------------------------------------. + * | ---- | ---- | ---- | ---- | ---- | ---- | 7 | 8 | 9 | * | / | ^ | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | ---- | ---- | ---- | ---- | ---- | ---- | 4 | 5 | 6 | + | - | ---- | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | ---- | ---- | ---- | ---- | ---- | ---- | 1 | 2 | 3 | = | ---- | ---- | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | ---- | ---- | ---- | ---- | ---- | ---- | ---- | 0 | . | ---- | ---- | ---- | + * `-----------------------------------------------------------------------------------' + */ + [_LOWER] = LAYOUT( + ____, ____, ____, ____, ____, ____, KC_7, KC_8, KC_9, KC_PAST, KC_PSLS, KC_CIRC, + ____, ____, ____, ____, ____, ____, KC_4, KC_5, KC_6, KC_PPLS, KC_PMNS, ____, + ____, ____, ____, ____, ____, ____, KC_1, KC_2, KC_3, KC_PEQL, ____, ____, + ____, ____, ____, ____, ____, ____, ____, KC_0, KC_MNXT, ____, ____, ____), + + /* Raise + * ,-----------------------------------------------------------------------------------. + * | F1 | F2 | F3 | F4 | F5 | F6 | ! | @ | # | $ | % | ` ~ | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | F7 | F8 | F9 | F10 | F11 | F12 | ^ | & | * | ( | ) | - _ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | ____ | ____ | ____ | ____ | ____ | ____ | [ { | ] } | \ | | ; : | ' " | = + | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | , < | . > | / ? | + * `-----------------------------------------------------------------------------------' + */ + [_RAISE] = LAYOUT( + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_GRV, + KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_MINS, + KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_LBRC, KC_RBRC, KC_BSLS, KC_SCLN, KC_QUOT, KC_EQL, + ____, ____, ____, ____, ____, ____, ____, ____, ____, KC_COMM, KC_DOT, KC_SLSH), + + /* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | Reset| ____ | ____ | ____ | ____ | ____ | ____ | LOCK | ____ | ____ | ____ | VUP | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | ____ | ____ | RUN | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | VDWN | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | PGUP | MUTE | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | HOME | PGDN | END | + * `-----------------------------------------------------------------------------------' + */ + [_AUX] = LAYOUT( + RESET, ____, ____, ____, ____, ____, ____, LGUI(KC_L), ____, ____, ____, KC_VOLU, + ____, ____, LGUI(KC_R), ____, ____, ____, ____, ____, ____, ____, ____, KC_VOLD, + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, KC_PGUP, KC_MUTE, + ____, ____, ____, ____, KC_TAB, KC_DEL, ____, ____, ____, KC_HOME, KC_PGDOWN, KC_END) + +}; + +qk_tap_dance_action_t tap_dance_actions[] = { + [TD_BTK] = ACTION_TAP_DANCE_DOUBLE(KC_QUOT, KC_GRV), + [TD_TDE] = ACTION_TAP_DANCE_DOUBLE(KC_SCLN, KC_TILD), + [TD_LPRN] = ACTION_TAP_DANCE_DOUBLE(KC_LBRC, KC_LPRN), + [TD_RPRN] = ACTION_TAP_DANCE_DOUBLE(KC_RBRC, KC_RPRN), + [TD_MIN] = ACTION_TAP_DANCE_DOUBLE(KC_COMM, KC_MINS), + [TD_USC] = ACTION_TAP_DANCE_DOUBLE(KC_DOT, KC_UNDS)}; + +void persistent_default_layer_set(uint16_t default_layer) +{ + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +}; + +void matrix_scan_user(void){}; + +void matrix_init_user(void){}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) +{ + switch (keycode) + { + case COLE: + if (record->event.pressed) + { + persistent_default_layer_set(1UL << _COLE); + } + return false; + break; + case LOWER: + if (record->event.pressed) + { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _AUX); + } + else + { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _AUX); + } + return false; + break; + case RAISE: + if (record->event.pressed) + { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _AUX); + } + else + { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _AUX); + } + return false; + break; + case AUX: + if (record->event.pressed) + { + layer_on(_AUX); + } + else + { + layer_off(_AUX); + } + return false; + break; + } + return true; +} diff --git a/keyboards/handwired/xeal60/keymaps/heartrobotninja/rules.mk b/keyboards/handwired/xeal60/keymaps/heartrobotninja/rules.mk new file mode 100644 index 000000000..2261a848a --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/heartrobotninja/rules.mk @@ -0,0 +1,26 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +TAP_DANCE_ENABLE = yes +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SWAP_HANDS_ENABLE = no # Enable one-hand typing + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif + diff --git a/keyboards/handwired/xeal60/keymaps/henxing/Readme.md b/keyboards/handwired/xeal60/keymaps/henxing/Readme.md new file mode 100644 index 000000000..231aa6adf --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/henxing/Readme.md @@ -0,0 +1,51 @@ +# Let's Split the Atreus + +This keymap is a port of the Atreus keymap to the Let's Split keyboard, using a +similar method of handling layer switches as the `default` keymap. + + +# Layers + +The following tables are the layers as implemented. + +### Underscores in Layer + +Any underscore represents a key that is mapped to `KC_NO`, or no keypress. The +2x3 block in the middle is like this because the Atreus does not have any keys +there. It has been left blank for the user to add her own special keypresses or +macros that she finds useful to have on that particular layer. + + +## `_QWERTY` + +```c +/* + * q w e r t _ _ y u i o p + * a s d f g _ _ h j k l ; + * z x c v b _ _ n m , . / + * esc tab gui shift bksp ctrl alt space fn - ' enter + */ + ``` + + +## `_LOWER` + +```c +/* + * ! @ up { } _ _ pgup 7 8 9 * + * # left down right $ _ _ pgdn 4 5 6 + + * [ ] ( ) & _ _ ` 1 2 3 \ + * lower insert gui shift bksp ctrl alt space fn . 0 = + */ + ``` + +## `_RAISE` + +```c +/* + * insert home up end pgup _ _ up F7 F8 F9 F10 + * del left down right pgdn _ _ down F4 F5 F6 F11 + * _ volup _ _ reset _ _ F1 F2 F3 F12 + * _ voldn super shift bksp ctrl alt space L0 prtsc scroll pause + */ + ``` diff --git a/keyboards/handwired/xeal60/keymaps/henxing/config.h b/keyboards/handwired/xeal60/keymaps/henxing/config.h new file mode 100644 index 000000000..5a6261c4f --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/henxing/config.h @@ -0,0 +1,37 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + +#endif diff --git a/keyboards/handwired/xeal60/keymaps/henxing/keymap.c b/keyboards/handwired/xeal60/keymaps/henxing/keymap.c new file mode 100644 index 000000000..aab75dc54 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/henxing/keymap.c @@ -0,0 +1,113 @@ +#include QMK_KEYBOARD_H + + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _LOWER 1 +#define _RAISE 2 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + LOWER, + RAISE +}; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* + * q w e r t _ _ y u i o p + * a s d f g _ _ h j k l ; + * z x c v b _ _ n m , . / + * esc tab gui shift bksp ctrl alt space fn - ' enter + */ + [_QWERTY] = LAYOUT( \ + KC_Q, KC_W, KC_E, KC_R, KC_T, KC_NO, KC_NO, KC_Y, KC_U, KC_I, KC_O, KC_P, \ + KC_A, KC_S, KC_D, KC_F, KC_G, KC_NO, KC_NO, KC_H, KC_J, KC_K, KC_L, KC_SCLN, \ + KC_Z, KC_X, KC_C, KC_V, KC_B, KC_NO, KC_NO, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, \ + KC_ESC, KC_TAB, KC_LGUI, KC_LSFT, KC_BSPC, KC_LCTL, KC_LALT, KC_SPC, LOWER, KC_MINS, KC_QUOT, KC_ENT \ + ), + + /* + * ! @ up { } _ _ pgup 7 8 9 * + * # left down right $ _ _ pgdn 4 5 6 + + * [ ] ( ) & _ _ ` 1 2 3 \ + * lower insert gui shift bksp ctrl alt space fn . 0 = + */ + [_LOWER] = LAYOUT( \ + KC_EXLM, KC_AT, KC_UP, KC_LCBR, KC_RCBR, KC_NO, KC_NO, KC_PGUP, KC_7, KC_8, KC_9, KC_ASTR, \ + KC_HASH, KC_LEFT, KC_DOWN, KC_RGHT, KC_DEL, KC_NO, KC_NO, KC_PGDN, KC_4, KC_5, KC_6, KC_PLUS, \ + KC_LBRC, KC_RBRC, KC_LPRN, KC_RPRN, KC_AMPR, KC_NO, KC_NO, KC_GRV, KC_1, KC_2, KC_3, KC_BSLS, \ + RAISE, KC_INS, KC_LGUI, KC_LSFT, KC_BSPC, KC_LCTL, KC_LALT, KC_SPC, KC_TRNS, KC_DOT, KC_0, KC_EQL \ + ), + + /* + * insert home up end pgup _ _ up F7 F8 F9 F10 + * del left down right pgdn _ _ down F4 F5 F6 F11 + * _ volup _ _ reset _ _ F1 F2 F3 F12 + * _ voldn super shift bksp ctrl alt space L0 prtsc scroll pause + */ + [_RAISE] = LAYOUT( \ + KC_INS, KC_HOME, KC_UP, KC_END, KC_PGUP, KC_NO, KC_NO, KC_UP, KC_F7, KC_F8, KC_F9, KC_F10, \ + KC_DEL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_NO, KC_NO, KC_DOWN, KC_F4, KC_F5, KC_F6, KC_F11, \ + KC_TRNS, KC_VOLU, KC_TRNS, KC_TRNS, RESET, KC_NO, KC_NO, KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F12, \ + KC_NO, KC_VOLD, KC_LGUI, KC_LSFT, KC_BSPC, KC_LCTL, KC_LALT, KC_SPC, QWERTY, KC_PSCR, KC_SLCK, KC_PAUS \ + ) + +}; + +#ifdef AUDIO_ENABLE +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +float tone_dvorak[][2] = SONG(DVORAK_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); +#endif + +void persistent_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + + // The value to return + bool return_value = false; + + switch (keycode) { + case QWERTY: + if (record->event.pressed) { +#ifdef AUDIO_ENABLE + PLAY_SONG(tone_qwerty); +#endif + persistent_default_layer_set(1UL<<_QWERTY); + } + break; + + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + } else { + layer_off(_LOWER); + } + break; + + case RAISE: + persistent_default_layer_set(1UL<<_RAISE); + break; + default: + + // If the keycode is not handled by any of the other cases, we + // should return true + return_value = true; + break; + } + + return return_value; +} diff --git a/keyboards/handwired/xeal60/keymaps/hexwire/README.md b/keyboards/handwired/xeal60/keymaps/hexwire/README.md new file mode 100644 index 000000000..3ce3f6af3 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/hexwire/README.md @@ -0,0 +1,116 @@ +Hexwire's Nyquist Layout +============================ + +### Changes from default layout + +- Main layer + - The right space bar key has been changed to backspace, as I only hit space with my left thumb + - Backtick is at the lower right and also serves goes to the 3rd function layer when held + - Enter key acts as shift when held + - Escape key acts as control when held + - Minus key at upper right +- Lower layer + - Numbers are on the lower layer, to make it easier to use a numpad on the right hand + - Arrow keys + - Straight and curly brackets in the middle two columns + - Screenshot keys for MacOS +- Upper layer + - Symbols are on the upper layer + - Media keys + - Page Up/Down, Home/End +- 3rd function layer + - Function keys + +## Layouts + +### QWERTY + +``` +,----+----+----+----+----+----. ,----+----+----+----+----+----. +|ESC , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,BSPC| +|----+----+----+----+----+----| |----+----+----+----+----+----| +|TAB , Q , W , E , R , T , Y , U , I , O , P ,MINS| +|----+----+----+----+----+----| |----+----+----+----+----+----| +| X0 , A , S , D , F , G , H , J , K , L ,SCLN,QUOT| +|----+----+----+----+----+----| |----+----+----+----+----+----| +|LSFT, Z , X , C , V , B , N , M ,COMM,DOT ,SLSH, X4 | +|----+----+----+----+----+----| |----+----+----+----+----+----| +| X3 ,LCTL,LALT,LGUI, X1 ,SPC , BSPC, X2 ,LEFT,DOWN, UP ,RGHT| +`----+----+----+----+----+----' `----+----+----+----+----+----' +``` + +### Colemak +``` +,----+----+----+----+----+----. ,----+----+----+----+----+----. +|ESC , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,BSPC| +|----+----+----+----+----+----| |----+----+----+----+----+----| +|TAB , Q , W , F , P , G , J , L , U , Y ,SCLN,MINS| +|----+----+----+----+----+----| |----+----+----+----+----+----| +| X0 , A , R , S , T , D , H , N , E , I , O ,QUOT| +|----+----+----+----+----+----| |----+----+----+----+----+----| +|LSFT, Z , X , C , V , B , K , M ,COMM,DOT ,SLSH, X4 | +|----+----+----+----+----+----| |----+----+----+----+----+----| +| X3 ,LCTL,LALT,LGUI, X1 ,SPC , BSPC, X2 ,LEFT,DOWN, UP ,RGHT| +`----+----+----+----+----+----' `----+----+----+----+----+----' +``` + +### Dvorak +``` +,----+----+----+----+----+----. ,----+----+----+----+----+----. +|ESC , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,BSPC| +|----+----+----+----+----+----| |----+----+----+----+----+----| +|TAB ,QUOT,COMM,DOT , P , Y , F , G , C , R , L ,MINS| +|----+----+----+----+----+----| |----+----+----+----+----+----| +| X0 , A , O , E , U , I , D , H , T , N , S ,SLSH| +|----+----+----+----+----+----| |----+----+----+----+----+----| +|LSFT,SCLN, Q , J , K , X , B , M , W , V , Z , X4 | +|----+----+----+----+----+----| |----+----+----+----+----+----| +| X3 ,LCTL,LALT,LGUI, X1 ,SPC , BSPC, X2 ,LEFT,DOWN, UP ,RGHT| +`----+----+----+----+----+----' `----+----+----+----+----+----' +``` + +### Lower +``` +,----+----+----+----+----+----. ,----+----+----+----+----+----. +|TILD,EXLM, AT ,HASH,DLR ,PERC, CIRC,AMPR,ASTR,LPRN,RPRN,BSPC| +|----+----+----+----+----+----| |----+----+----+----+----+----| +| , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 , | +|----+----+----+----+----+----| |----+----+----+----+----+----| +|DEL ,CAPP,LEFT,RGHT, UP ,LBRC, RBRC, P4 , P5 , P6 ,PLUS,PIPE| +|----+----+----+----+----+----| |----+----+----+----+----+----| +| ,CPYP, , ,DOWN,LCBR, RCBR, P1 , P2 , P3 ,MINS, | +|----+----+----+----+----+----| |----+----+----+----+----+----| +| , , , , , , DEL , , P0 ,PDOT, , | +`----+----+----+----+----+----' `----+----+----+----+----+----' +``` + +### Raise +``` +,----+----+----+----+----+----. ,----+----+----+----+----+----. +|TILD,EXLM, AT ,HASH,DLR ,PERC, CIRC,AMPR,ASTR,LPRN,RPRN,BSPC| +|----+----+----+----+----+----| |----+----+----+----+----+----| +| ,EXLM, AT ,HASH,DLR ,PERC, CIRC,AMPR,ASTR,LPRN,RPRN, | +|----+----+----+----+----+----| |----+----+----+----+----+----| +|DEL ,MPRV,MNXT,VOLU,PGUP,UNDS, EQL ,HOME, , , ,BSLS| +|----+----+----+----+----+----| |----+----+----+----+----+----| +|MUTE,MSTP,MPLY,VOLD,PGDN,MINS, PLUS,END , , , , | +|----+----+----+----+----+----| |----+----+----+----+----+----| +| , , , , , , , , , , , | +`----+----+----+----+----+----' `----+----+----+----+----+----' +``` + +### 3rd function layer + +``` +,----+----+----+----+----+----. ,----+----+----+----+----+----. +|F12 , F1 , F2 , F3 , F4 , F5 , F6 , F7 , F8 , F9 ,F10 ,F11 | +|----+----+----+----+----+----| |----+----+----+----+----+----| +| , , , , , , , , , , , | +|----+----+----+----+----+----| |----+----+----+----+----+----| +| , , , , , , , , , , , | +|----+----+----+----+----+----| |----+----+----+----+----+----| +| , , , , , , , , , , , | +|----+----+----+----+----+----| |----+----+----+----+----+----| +| , , , , , , , , , , , | +`----+----+----+----+----+----' `----+----+----+----+----+----' +``` diff --git a/keyboards/handwired/xeal60/keymaps/hexwire/config.h b/keyboards/handwired/xeal60/keymaps/hexwire/config.h new file mode 100644 index 000000000..7acf84510 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/hexwire/config.h @@ -0,0 +1,43 @@ +/* +Copyright 2017 Danny Nguyen + +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 . +*/ + +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + +#define TAPPING_TERM 150 + +#undef RGBLED_NUM +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 12 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 + +#endif diff --git a/keyboards/handwired/xeal60/keymaps/hexwire/keymap.c b/keyboards/handwired/xeal60/keymaps/hexwire/keymap.c new file mode 100644 index 000000000..2050c0379 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/hexwire/keymap.c @@ -0,0 +1,218 @@ +#include "viterbi.h" +#include "action_layer.h" +#include "eeconfig.h" + +extern keymap_config_t keymap_config; + +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _LOWER 3 +#define _RAISE 4 +#define _FN3 5 +#define _FN4 6 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + LOWER, + RAISE, + FN3, + FN4, + ADJUST, +}; + +#define KC_ KC_TRNS +#define _______ KC_TRNS + +#define KC_CAPW LGUI(LSFT(KC_3)) // Capture whole screen +#define KC_CPYW LGUI(LSFT(LCTL(KC_3))) // Copy whole screen +#define KC_CAPP LGUI(LSFT(KC_4)) // Capture portion of screen +#define KC_CPYP LGUI(LSFT(LCTL(KC_4))) // Copy portion of screen +#define KC_X0 MT(MOD_LCTL, KC_ESC) +#define KC_X1 LOWER +#define KC_X2 RAISE +#define KC_X3 LT(_FN3, KC_GRV) +#define KC_X4 MT(MOD_LSFT, KC_ENT) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_QWERTY] = LAYOUT_kc( + //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. + ESC , 1 , 2 , 3 , 4 , 5 , , 6 , 7 , 8 , 9 , 0 ,BSPC, , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + TAB , Q , W , E , R , T , , Y , U , I , O , P ,MINS, , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + X0 , A , S , D , F , G , , H , J , K , L ,SCLN,QUOT, , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + LSFT, Z , X , C , V , B , , N , M ,COMM,DOT ,SLSH, X4 , , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + X3 ,LCTL,LALT,LGUI, X1 ,SPC , , BSPC, X2 ,LEFT,DOWN, UP ,RGHT, + //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' + ), + + [_COLEMAK] = LAYOUT_kc( + //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. + ESC , 1 , 2 , 3 , 4 , 5 , , 6 , 7 , 8 , 9 , 0 ,BSPC, , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + TAB , Q , W , F , P , G , , J , L , U , Y ,SCLN,MINS, , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + X0 , A , R , S , T , D , , H , N , E , I , O ,QUOT, , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + LSFT, Z , X , C , V , B , , K , M ,COMM,DOT ,SLSH, X4 , , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + X3 ,LCTL,LALT,LGUI, X1 ,SPC , , BSPC, X2 ,LEFT,DOWN, UP ,RGHT, + //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' + ), + + [_DVORAK] = LAYOUT_kc( + //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. + ESC , 1 , 2 , 3 , 4 , 5 , , 6 , 7 , 8 , 9 , 0 ,BSPC, , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + TAB ,QUOT,COMM,DOT , P , Y , , F , G , C , R , L ,MINS, , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + X0 , A , O , E , U , I , , D , H , T , N , S ,SLSH, , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + LSFT,SCLN, Q , J , K , X , , B , M , W , V , Z , X4 , , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + X3 ,LCTL,LALT,LGUI, X1 ,SPC , , BSPC, X2 ,LEFT,DOWN, UP ,RGHT, + //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' + ), + + [_LOWER] = LAYOUT_kc( + //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. + TILD,EXLM, AT ,HASH,DLR ,PERC, , CIRC,AMPR,ASTR,LPRN,RPRN,BSPC, , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + , 1 , 2 , 3 , 4 , 5 , , 6 , 7 , 8 , 9 , 0 , , , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + DEL ,CAPP,LEFT,RGHT, UP ,LBRC, , RBRC, P4 , P5 , P6 ,PLUS,PIPE, , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + ,CPYP, , ,DOWN,LCBR, , RCBR, P1 , P2 , P3 ,MINS, , , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + , , , , , , , DEL , , P0 ,PDOT, , , + //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' + ), + + [_RAISE] = LAYOUT_kc( + //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. + TILD,EXLM, AT ,HASH,DLR ,PERC, , CIRC,AMPR,ASTR,LPRN,RPRN,BSPC, , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + ,EXLM, AT ,HASH,DLR ,PERC, , CIRC,AMPR,ASTR,LPRN,RPRN, , , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + DEL ,MPRV,MNXT,VOLU,PGUP,UNDS, , EQL ,HOME, , , ,BSLS, , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + MUTE,MSTP,MPLY,VOLD,PGDN,MINS, , PLUS,END , , , , , , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + , , , , , , , , , , , , , + //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' + ), + + [_FN3] = LAYOUT_kc( + //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. + F12 , F1 , F2 , F3 , F4 , F5 , , F6 , F7 , F8 , F9 ,F10 ,F11 , , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + , , , , , , , , , , , , , , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + , , , , , , , , , , , , , , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + , , , , , , , , , , , , , , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + , , , , , , , , , , , , , + //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' + ), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | Reset|RGB Tg|RGB Md|Hue Up|Hue Dn|Sat Up|Sat Dn|Val Up|Val Dn| | | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ + [_ADJUST] = LAYOUT( \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, RESET , RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, _______, _______, _______, _______, \ + _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ) + + +}; + +#ifdef AUDIO_ENABLE +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +float tone_dvorak[][2] = SONG(DVORAK_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); +#endif + +void persistent_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_qwerty, false, 0); + #endif + persistent_default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_colemak, false, 0); + #endif + persistent_default_layer_set(1UL<<_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_dvorak, false, 0); + #endif + persistent_default_layer_set(1UL<<_DVORAK); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + break; + } + return true; +} diff --git a/keyboards/handwired/xeal60/keymaps/hexwire/rules.mk b/keyboards/handwired/xeal60/keymaps/hexwire/rules.mk new file mode 100644 index 000000000..1e3cebb14 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/hexwire/rules.mk @@ -0,0 +1 @@ +RGBLIGHT_ENABLE = yes diff --git a/keyboards/handwired/xeal60/keymaps/khord/config.h b/keyboards/handwired/xeal60/keymaps/khord/config.h new file mode 100644 index 000000000..4ebdbad76 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/khord/config.h @@ -0,0 +1,44 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +#define TAPPING_TERM 150 + +/* prevent stuck modifiers */ +#define PREVENT_STUCK_MODIFIERS + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +//#define MASTER_LEFT +// #define MASTER_RIGHT +#define EE_HANDS + +#define RGBLIGHT_ANIMATIONS + +#endif diff --git a/keyboards/handwired/xeal60/keymaps/khord/keymap.c b/keyboards/handwired/xeal60/keymaps/khord/keymap.c new file mode 100644 index 000000000..41042065d --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/khord/keymap.c @@ -0,0 +1,170 @@ +#include QMK_KEYBOARD_H + + +extern keymap_config_t keymap_config; + +#define _QWERTY 0 +#define _LOWER 3 +#define _RAISE 4 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + LOWER, + RAISE, + ADJUST, + ADMIN, + SMSPC1 +}; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +// Tap Dance Declarations +enum { + SFT_CAP = 0 +}; + +// Dylan's additions +#define C_A_DEL LALT(LCTL(KC_DEL)) +#define C_A_INS LALT(LCTL(KC_INS)) +//#define MAC_LOK S(LCTL(KC_PWR)) +#define MAC_LOK LCTL(LGUI(KC_Q)) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = LAYOUT( \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + TD(SFT_CAP), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_ENT), \ + ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | | | END | HOME |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT( \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, MAC_LOK, _______, KC_END, KC_HOME, _______, \ + LCTL(KC_UP), KC_BTN3, KC_BTN2, KC_BTN1, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | | |PG DN |PG UP |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | MB1 | MB2 | MB3 | MB4 | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, KC_PGDN, KC_PGUP, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_BTN1, KC_BTN2, KC_BTN3, KC_BTN4 \ +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | Reset| | |AGnorm|AGswap| | | |string|string| Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | |RGBMOD|HUE-UP|SAT-UP|BRI-UP| |PLAIN |BREATH|RANBOW| SWIRL| | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | |RGBTOG|HUE-DN|SAT-DN|BRI-DN| |GRDNT | XMAS |KNIGHT| SNAKE| | CAIns| + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | CADel| + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = LAYOUT( \ + _______, RESET, _______, _______, AG_NORM, AG_SWAP, _______, _______, _______, ADMIN, SMSPC1, KC_DEL, \ + _______, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, _______, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, _______, _______, \ + _______, RGB_TOG, RGB_HUD, RGB_SAD, RGB_VAD, _______, RGB_M_G, RGB_M_X, RGB_M_K, RGB_M_SN, _______, C_A_INS, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, C_A_DEL \ +) + +}; + +qk_tap_dance_action_t tap_dance_actions[] = { + [SFT_CAP] = ACTION_TAP_DANCE_DOUBLE(KC_LSFT, KC_CAPS) +}; + +void persistent_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + persistent_default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + break; + case ADMIN: + if (record->event.pressed) { + SEND_STRING("Administrator"); + } + return false; + break; + case SMSPC1: + if (record->event.pressed) { + SEND_STRING("Simspace1!"); + } + return false; + break; + } + return true; +} diff --git a/keyboards/handwired/xeal60/keymaps/khord/rules.mk b/keyboards/handwired/xeal60/keymaps/khord/rules.mk new file mode 100644 index 000000000..c90523e5d --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/khord/rules.mk @@ -0,0 +1,7 @@ +TAP_DANCE_ENABLE = yes +RGBLIGHT_ENABLE = yes +USE_I2C = no + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/handwired/xeal60/keymaps/kris/keymap.c b/keyboards/handwired/xeal60/keymaps/kris/keymap.c new file mode 100644 index 000000000..34d2e86da --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/kris/keymap.c @@ -0,0 +1,213 @@ +#include QMK_KEYBOARD_H + + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _LOWER 3 +#define _RAISE 4 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + LOWER, + RAISE, + ADJUST, +}; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Ctrl | A | S | D | F | G | H | J | K | L | ; |Enter | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Shift|| + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Adjust| Alt | Gui |Caps |Lower |Space |Space |Raise | [ | ] | - |Ctrl | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = LAYOUT( \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + KC_LCTRL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT , \ + ADJUST, KC_LALT, KC_LGUI, KC_CAPS, LOWER, KC_SPC, KC_SPC, RAISE, KC_LBRC, KC_RBRC, KC_MINS, KC_RCTRL \ +), + +/* Colemak + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | R | S | T | D | H | N | E | I | O | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_COLEMAK] = LAYOUT( \ + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, \ + KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ + ADJUST, KC_LALT, KC_LGUI, KC_CAPS, LOWER, KC_SPC, KC_SPC, RAISE, KC_LBRC, KC_RBRC, KC_MINS, KC_RCTRL \ +), + +/* Dvorak + * ,-----------------------------------------------------------------------------------. + * | Tab | " | , | . | P | Y | F | G | C | R | L | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | O | E | U | I | D | H | T | N | S | / | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_DVORAK] = LAYOUT( \ + KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, \ + KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, \ + KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT , \ + ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | | \ | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT( \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | 4 | 5 | 6 | ] | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_4, KC_5, KC_6, KC_RBRC, KC_BSLS, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_1, KC_2, KC_3, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_0, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | Reset| | | | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = LAYOUT( \ + _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ + _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ +) + + +}; + +#ifdef AUDIO_ENABLE +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +float tone_dvorak[][2] = SONG(DVORAK_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); +#endif + +void persistent_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_qwerty); + #endif + persistent_default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_colemak); + #endif + persistent_default_layer_set(1UL<<_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_dvorak); + #endif + persistent_default_layer_set(1UL<<_DVORAK); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + break; + } + return true; +} diff --git a/keyboards/handwired/xeal60/keymaps/krusli/keymap.c b/keyboards/handwired/xeal60/keymaps/krusli/keymap.c new file mode 100644 index 000000000..9b49bab3b --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/krusli/keymap.c @@ -0,0 +1,238 @@ +#include QMK_KEYBOARD_H + + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _LOWER 3 +#define _RAISE 4 +#define _NUMPAD 5 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + LOWER, + RAISE, + ADJUST, + NUMPAD +}; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | S | D | F | G | H | J | K | L | ; | ' | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Numpad| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = LAYOUT_ortho_4x12( \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ + NUMPAD, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Colemak + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | R | S | T | D | H | N | E | I | O | ' | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_COLEMAK] = LAYOUT_ortho_4x12( \ + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, \ + KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ + ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Dvorak + * ,-----------------------------------------------------------------------------------. + * | Tab | ' | , | . | P | Y | F | G | C | R | L | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | O | E | U | I | D | H | T | N | S | / | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_DVORAK] = LAYOUT_ortho_4x12( \ + KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, \ + KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, \ + KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT , \ + ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT_ortho_4x12( \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | Home | End | PgUp | PgDn |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT_ortho_4x12( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_HOME, KC_END, KC_PGUP, KC_PGDN, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Numpad + * ,-----------------------------------------------------------------------------------. + * | Esc | 7 | 8 | 9 | * | / | | | | | | | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | <-- | 4 | 5 | 6 | + | - | | | | | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | 1 | 2 | 3 |Enter |Enter | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Qwerty| 0 | . | . |Enter |Enter | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_NUMPAD] = LAYOUT_ortho_4x12( \ + KC_ESC, KC_P7, KC_P8, KC_P9, KC_PAST, KC_PSLS, _______, _______, _______, _______, _______, _______, \ + KC_BSPC, KC_P4, KC_P5, KC_P6, KC_PPLS, KC_PMNS, _______, _______, _______, _______, _______, _______, \ + _______, KC_P1, KC_P2, KC_P3, KC_PENT, KC_PENT, _______, _______, _______, _______, _______, _______, \ + QWERTY, KC_P0, KC_PDOT, KC_PDOT, KC_PENT, KC_PENT, _______, _______, _______, _______, _______, _______ \ +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | Reset| | | | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = LAYOUT_ortho_4x12( \ + _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ + _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ +) + + +}; + +#ifdef AUDIO_ENABLE +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +float tone_dvorak[][2] = SONG(DVORAK_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); +#endif + +void persistent_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_qwerty); + #endif + persistent_default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case NUMPAD: + if (record->event.pressed) + persistent_default_layer_set(1UL<<_NUMPAD); + return false; + break; + case COLEMAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_colemak); + #endif + persistent_default_layer_set(1UL<<_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_dvorak); + #endif + persistent_default_layer_set(1UL<<_DVORAK); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + break; + } + return true; +} diff --git a/keyboards/handwired/xeal60/keymaps/krusli/readme.md b/keyboards/handwired/xeal60/keymaps/krusli/readme.md new file mode 100644 index 000000000..175ef3c11 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/krusli/readme.md @@ -0,0 +1,2 @@ +# krusli +Let's Split keymap based off the default Planck layout with a numpad layer. diff --git a/keyboards/handwired/xeal60/keymaps/mbsurfer/config.h b/keyboards/handwired/xeal60/keymaps/mbsurfer/config.h new file mode 100644 index 000000000..6469b4846 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/mbsurfer/config.h @@ -0,0 +1,43 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +#define TAPPING_TERM 100 + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +//#define MASTER_LEFT +// #define MASTER_RIGHT +#define EE_HANDS + +#undef RGBLED_NUM +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 8 + +#endif diff --git a/keyboards/handwired/xeal60/keymaps/mbsurfer/keymap.c b/keyboards/handwired/xeal60/keymaps/mbsurfer/keymap.c new file mode 100644 index 000000000..5f6589337 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/mbsurfer/keymap.c @@ -0,0 +1,274 @@ +#include QMK_KEYBOARD_H + + +extern rgblight_config_t rgblight_config; +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _LOWER 3 +#define _RAISE 4 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + LOWER, + RAISE, + ADJUST, +}; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +// Tap Dance Declarations +enum { + SFT_CAP = 0, + LFT_HOM, + DWN_PDN, + UPP_PUP, + RGT_END +}; + +// Task Manager +#define C_S_ESC LSFT(LCTL(KC_ESC)) +#define C_A_DEL LALT(LCTL(KC_DEL)) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,------------------------------------------ ------------------------------------------. + * | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+------- -------+------+------+------+------+------| + * | Esc | A | S | D | F | G | | H | J | K | L | ; | " | + * |------+------+------+------+------+------- -------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+ +------+------+------+------+------+------| +* |Adjust| Ctrl | Alt | GUI |Lower |Space | |Space |Raise | Left | Down | Up |Right | + * `------------------------------------------ ------------------------------------------' + */ +[_QWERTY] = LAYOUT( \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + TD(SFT_CAP), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_ENT), \ + ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, TD(LFT_HOM), TD(DWN_PDN), TD(UPP_PUP), TD(RGT_END) \ +), + +/* Colemak + * ,------------------------------------------ ------------------------------------------. + * | Tab | Q | W | F | P | G | | J | L | U | Y | ; | Bksp | + * |------+------+------+------+------+------- -------+------+------+------+------+------| + * | Esc | A | R | S | T | D | | H | N | E | I | O | " | + * |------+------+------+------+------+------- -------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | | K | M | , | . | / |Enter | + * |------+------+------+------+------+------+ +------+------+------+------+------+------| + * |Adjust| Ctrl | Alt | GUI |Lower |Space | |Space |Raise | Left | Down | Up |Right | + * `------------------------------------------ ------------------------------------------' + */ +[_COLEMAK] = LAYOUT( \ + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, \ + KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ + ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Dvorak + * ,------------------------------------------ ------------------------------------------. + * | Tab | " | , | . | P | Y | | F | G | C | R | L | Bksp | + * |------+------+------+------+------+------- -------+------+------+------+------+------| + * | Esc | A | O | E | U | I | | D | H | T | N | S | / | + * |------+------+------+------+------+------- -------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | | B | M | W | V | Z |Enter | + * |------+------+------+------+------+------+ +------+------+------+------+------+------| + * |Adjust| Ctrl | Alt | GUI |Lower |Space | |Space |Raise | Left | Down | Up |Right | + * `------------------------------------------ ------------------------------------------' + */ +[_DVORAK] = LAYOUT( \ + KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, \ + KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, \ + KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT , \ + ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Lower + * ,------------------------------------------ ------------------------------------------. + * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | Bksp | + * |------+------+------+------+------+------- -------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | | F6 | _ | + | { | } | | | + * |------+------+------+------+------+------- -------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | | F12 |ISO ~ |ISO | | END | HOME |Enter | + * |------+------+------+------+------+------+ +------+------+------+------+------+------| + * | | | | | | | | | | Next | Vol- | Vol+ | Play | + * `------------------------------------------ ------------------------------------------' + */ +[_LOWER] = LAYOUT( \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_NUHS), S(KC_NUBS), KC_END, KC_HOME, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Raise + * ,------------------------------------------ ------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------- -------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------- -------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | | F12 |ISO # |ISO / |PG DN |PG UP |Enter | + * |------+------+------+------+------+------+ +------+------+------+------+------+------| + * | | | | | | | | | | Next | Vol- | Vol+ | Play | + * `------------------------------------------ ------------------------------------------' + */ +[_RAISE] = LAYOUT( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGDN, KC_PGUP, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Adjust (Lower + Raise) + * ,------------------------------------------ ------------------------------------------. + * | Reset| | Plain|Breath|Rainbw| Swirl| | Snake|Knight| Xmas |Grdent| | Del | + * |------+------+------+------+------+------- -------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm| |AGswap|Qwerty|Colemk|Dvorak| | | + * |------+------+------+------+------+------- -------+------+------+------+------+------| + * | |Toggle| Mode | Hue- | Hue+ | Sat- | | Sat+ | Val- | Val+ | | | | (RGB) + * |------+------+------+------+------+------+ +------+------+------+------+------+------| + * | | | | | | | | | | | |TskMng|CAltDe| + * `------------------------------------------ ------------------------------------------' + */ +[_ADJUST] = LAYOUT( \ + RESET, _______, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, RGB_M_SN, RGB_M_K, RGB_M_X, RGB_M_G, _______, KC_DEL, \ + _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ + _______, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, C_S_ESC, C_A_DEL \ +) + + +}; + +int RGB_current_mode; +int RGB_current_hue; + +qk_tap_dance_action_t tap_dance_actions[] = { + [SFT_CAP] = ACTION_TAP_DANCE_DOUBLE(KC_LSFT, KC_CAPS), + [LFT_HOM] = ACTION_TAP_DANCE_DOUBLE(KC_LEFT, KC_HOME), + [DWN_PDN] = ACTION_TAP_DANCE_DOUBLE(KC_DOWN, KC_PGDN), + [UPP_PUP] = ACTION_TAP_DANCE_DOUBLE(KC_UP, KC_PGUP), + [RGT_END] = ACTION_TAP_DANCE_DOUBLE(KC_RGHT, KC_END) +}; + +void persistent_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + persistent_default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + persistent_default_layer_set(1UL<<_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + persistent_default_layer_set(1UL<<_DVORAK); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + + if (IS_LAYER_OFF(_RAISE) && IS_LAYER_OFF(_ADJUST)) { + // Save current RGB info + RGB_current_mode = rgblight_config.mode; + RGB_current_hue = rgblight_config.hue; + + // Set RGB to Blue + rgblight_mode(1); + rgblight_setrgb(0, 0, 255); + } + + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + + if (IS_LAYER_ON(_ADJUST)){ + // Set RGB to cyan + rgblight_setrgb(0, 255, 255); + } + } else { + + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + + if (IS_LAYER_OFF(_RAISE) && IS_LAYER_OFF(_ADJUST)) { + // Reset RGB + rgblight_mode(RGB_current_mode); + rgblight_sethsv(RGB_current_hue, rgblight_config.sat, rgblight_config.val); + } else if (IS_LAYER_ON(_RAISE)){ + // Set RGB to Red + rgblight_setrgb(0, 255, 0); + } + } + return false; + break; + case RAISE: + if (record->event.pressed) { + + if (IS_LAYER_OFF(_LOWER) && IS_LAYER_OFF(_ADJUST)) { + // Save current RGB info + RGB_current_mode = rgblight_config.mode; + RGB_current_hue = rgblight_config.hue; + + // Set RGB to Green + rgblight_mode(1); + rgblight_setrgb(0, 255, 0); + } + + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + + if (IS_LAYER_ON(_ADJUST)){ + // Set RGB to cyan + rgblight_setrgb(0, 255, 255); + } + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + + if (IS_LAYER_OFF(_LOWER) && IS_LAYER_OFF(_ADJUST)) { + // Reset RGB + rgblight_mode(RGB_current_mode); + rgblight_sethsv(RGB_current_hue, rgblight_config.sat, rgblight_config.val); + } else if (IS_LAYER_ON(_LOWER)){ + // Set RGB to Blue + rgblight_setrgb(0, 0, 255); + } + } + return false; + break; + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + break; + } + return true; +} diff --git a/keyboards/handwired/xeal60/keymaps/mbsurfer/rules.mk b/keyboards/handwired/xeal60/keymaps/mbsurfer/rules.mk new file mode 100644 index 000000000..c90523e5d --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/mbsurfer/rules.mk @@ -0,0 +1,7 @@ +TAP_DANCE_ENABLE = yes +RGBLIGHT_ENABLE = yes +USE_I2C = no + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/handwired/xeal60/keymaps/mike808/config.h b/keyboards/handwired/xeal60/keymaps/mike808/config.h new file mode 100644 index 000000000..bfca915f2 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/mike808/config.h @@ -0,0 +1,43 @@ +/* +Copyright 2018 Danny Nguyen + +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 . +*/ + +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include QMK_KEYBOARD_CONFIG_H + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + +#define TAPPING_TERM 150 + +#undef RGBLED_NUM +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 2 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 + +#endif diff --git a/keyboards/handwired/xeal60/keymaps/mike808/keymap.c b/keyboards/handwired/xeal60/keymaps/mike808/keymap.c new file mode 100644 index 000000000..c7e48b135 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/mike808/keymap.c @@ -0,0 +1,158 @@ +#include QMK_KEYBOARD_H + +#define _DVORAK 0 +#define _QWERTY 1 +#define _FN1 2 +#define _MOUSE 3 + +enum custom_keycodes { + DVORAK = SAFE_RANGE, + QWERTY, +}; + +#define KC_ KC_TRNS +#define _______ KC_TRNS + +#define KC_DVOR DVORAK +#define KC_QWER QWERTY +#define KC_FN1 MO(_FN1) + +// Tap-Hold keys (QWERTY) +#define KC_S_C MT(MOD_LCTL, KC_S) +#define KC_D_A MT(MOD_LALT, KC_D) +#define KC_F_G MT(MOD_LGUI, KC_F) +#define KC_J_G MT(MOD_RGUI, KC_J) +#define KC_K_A MT(MOD_RALT, KC_K) +#define KC_L_C MT(MOD_RCTL, KC_L) + +// Tap-Hold keys (Dvorak) +#define KC_O_C MT(MOD_LCTL, KC_O) +#define KC_E_A MT(MOD_LALT, KC_E) +#define KC_U_G MT(MOD_LGUI, KC_U) +#define KC_H_G MT(MOD_RGUI, KC_H) +#define KC_T_A MT(MOD_RALT, KC_T) +#define KC_N_C MT(MOD_RCTL, KC_N) + +#define KC_G_A LGUI(KC_A) +#define KC_G_C LGUI(KC_C) +#define KC_G_V LGUI(KC_V) +#define KC_G_X LGUI(KC_X) +#define KC_G_Z LGUI(KC_Z) +#define KC_G_BL LGUI(KC_BSLS) +#define KC_G_TB LGUI(KC_TAB) +#define KC_G_SP LGUI(KC_SPC) + +#define KC_ENTM LT(_MOUSE, KC_ENT) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_QWERTY] = LAYOUT_kc( + //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. + DVOR,ESC , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,MINS,PGUP, + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + G_A ,TAB , Q , W , E , R , T , Y , U , I , O , P ,BSLS,PGDN, + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + G_X ,CAPS, A ,S_C ,D_A ,F_G , G , H ,J_G ,K_A ,L_C ,SCLN,QUOT, UP , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + G_C ,LSFT, Z , X , C , V , B , N , M ,COMM,DOT ,SLSH,RSFT,DOWN, + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + G_V ,FN1 ,G_TB,G_SP,BSPC,SPC ,SPC , ENTM,ENTM,G_Z ,GRV ,EQL ,LEFT,RGHT + //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' + ), + + [_DVORAK] = LAYOUT_kc( + //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. + QWER,ESC , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,EQL ,PGUP, + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + G_A ,TAB ,QUOT,COMM,DOT , P , Y , F , G , C , R , L ,SLSH,PGDN, + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + G_X ,CAPS, A ,O_C ,E_A ,U_G , I , D ,H_G ,T_A ,N_C , S ,MINS, UP , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + G_C ,LSFT,SCLN, Q , J , K , X , B , M , W , V , Z ,RSFT,DOWN, + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + G_V ,FN1 ,G_TB,G_SP,BSPC,SPC ,SPC , ENTM,ENTM,G_Z ,GRV ,BSLS,LEFT,RGHT + //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' + ), + + [_FN1] = LAYOUT_kc( + //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. + , , F1 , F2 , F3 , F4 , F5 , F6 , F7 , F8 , F9 ,F10 ,F11 , , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + , ,EXLM, AT ,LCBR,RCBR,PIPE, , P7 , P8 , P9 ,ASTR,F12 , , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + , ,HASH,DLR ,LPRN,RPRN,GRV , , P4 , P5 , P6 ,PLUS,MINS, , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + , ,PERC,CIRC,LBRC,RBRC,TILD, AMPR, P1 , P2 , P3 ,SLSH, , , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + , , , , , , , , ,PDOT, P0 ,EQL , , + //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' + ), + + [_MOUSE] = LAYOUT_kc( + //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. + , , , , , , , , , , , , , , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + , , , ,MS_U, , , , , , , , , , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + , , ,MS_L,MS_D,MS_R, , , , , , , , , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + , , , , , , , , , , , , , , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + , , , ,BTN1,BTN2, , , , , , , , + //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' + ) +}; + +#ifdef AUDIO_ENABLE +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +float tone_dvorak[][2] = SONG(DVORAK_SOUND); +#endif + +void update_rgblight(uint16_t layer) { + if (layer & (1UL << _DVORAK)) { + rgblight_sethsv_green(); + } else if (layer & (1UL << _QWERTY)) { + rgblight_sethsv_goldenrod(); + } +} + +void persistent_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); + #ifdef RGBLIGHT_ENABLE + update_rgblight(default_layer); + #endif // RGBLIGHT_ENABLE +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_qwerty, false, 0); + #endif + persistent_default_layer_set(1UL << _QWERTY); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_dvorak, false, 0); + #endif + persistent_default_layer_set(1UL << _DVORAK); + } + return false; + break; + } + return true; +} + + +void matrix_init_user(void) { + #ifdef RGBLIGHT_ENABLE + rgblight_enable(); + uint8_t default_layer = eeconfig_read_default_layer(); + update_rgblight(default_layer); + #endif +} diff --git a/keyboards/handwired/xeal60/keymaps/mike808/rules.mk b/keyboards/handwired/xeal60/keymaps/mike808/rules.mk new file mode 100644 index 000000000..1e3cebb14 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/mike808/rules.mk @@ -0,0 +1 @@ +RGBLIGHT_ENABLE = yes diff --git a/keyboards/handwired/xeal60/keymaps/mjt/config.h b/keyboards/handwired/xeal60/keymaps/mjt/config.h new file mode 100644 index 000000000..735a58b11 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/mjt/config.h @@ -0,0 +1,38 @@ +/* +Copyright 2012 Jun Wako + +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 . +*/ + + +#define USE_SERIAL + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + + +#ifdef SUBPROJECT_rev1 + #include "../../rev1/config.h" +#endif +#ifdef SUBPROJECT_rev2 + #include "../../rev2/config.h" +#endif +#ifdef SUBPROJECT_rev2fliphalf + #include "../../rev2fliphalf/config.h" +#endif + +#undef RGBLED_NUM +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 10 diff --git a/keyboards/handwired/xeal60/keymaps/mjt/keymap.c b/keyboards/handwired/xeal60/keymaps/mjt/keymap.c new file mode 100644 index 000000000..2c61cce3b --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/mjt/keymap.c @@ -0,0 +1,213 @@ +#include QMK_KEYBOARD_H + + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _LOWER 3 +#define _RAISE 4 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + LOWER, + RAISE, + ADJUST, +}; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = LAYOUT( \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ + ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Colemak + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | R | S | T | D | H | N | E | I | O | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_COLEMAK] = LAYOUT( \ + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, \ + KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ + ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Dvorak + * ,-----------------------------------------------------------------------------------. + * | Tab | " | , | . | P | Y | F | G | C | R | L | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | O | E | U | I | D | H | T | N | S | / | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_DVORAK] = LAYOUT( \ + KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, \ + KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, \ + KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT , \ + ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | | \ | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT( \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | Reset| | | | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = LAYOUT( \ + _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ + _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ + _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ +) + + +}; + +#ifdef AUDIO_ENABLE +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +float tone_dvorak[][2] = SONG(DVORAK_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); +#endif + +void persistent_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_qwerty, false, 0); + #endif + persistent_default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_colemak, false, 0); + #endif + persistent_default_layer_set(1UL<<_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_dvorak, false, 0); + #endif + persistent_default_layer_set(1UL<<_DVORAK); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + break; + } + return true; +} diff --git a/keyboards/handwired/xeal60/keymaps/mjt/rules.mk b/keyboards/handwired/xeal60/keymaps/mjt/rules.mk new file mode 100644 index 000000000..874d09eab --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/mjt/rules.mk @@ -0,0 +1,25 @@ + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SWAP_HANDS_ENABLE = no # Enable one-hand typing + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif \ No newline at end of file diff --git a/keyboards/handwired/xeal60/keymaps/mtdjr/config.h b/keyboards/handwired/xeal60/keymaps/mtdjr/config.h new file mode 100644 index 000000000..afbf73569 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/mtdjr/config.h @@ -0,0 +1,43 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +#define SOLENOID_ENABLE +#define SOLENOID_PIN F4 + +#undef RGBLED_NUM +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 8 + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C +/* Select hand configuration */ + + #define MASTER_LEFT +// #define _MASTER_RIGHT +// #define EE_HANDS + +#endif diff --git a/keyboards/handwired/xeal60/keymaps/mtdjr/keymap.c b/keyboards/handwired/xeal60/keymaps/mtdjr/keymap.c new file mode 100644 index 000000000..47972fcd3 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/mtdjr/keymap.c @@ -0,0 +1,55 @@ +#include QMK_KEYBOARD_H +#include "mtdjr.h" + +extern keymap_config_t keymap_config; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_QWERTY] = LAYOUT_kc( +// ,-----------------------------. .-----------------------------. + TAB, Q , W , E , R , T , Y , U , I , O , P ,BSPC, +// |----+----+----+----+----+----| |----+----+----+----+----+----| + EXC, A , S , D , F , G , H , J , K , L ,SCLN,QUOT, +// |----+----+----+----+----+----| |----+----+----+----+----+----| + LSFT, Z , X , C , V , B , N , M ,COMM, DOT,SLSH, ENT, +// |----+----+----+----+----+----| |----+----+----+----+----+----| + LOWR,LCTL,LALT,LGUI,LOWR, SPC, SPC,RASE,LEFT,DOWN, UP ,RGHT +// '-----------------------------' '-----------------------------' + ), + + [_LOWER] = LAYOUT_kc( +// ,-----------------------------. .-----------------------------. + TILD, 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 , DEL, +// |----+----+----+----+----+----| |----+----+----+----+----+----| + xxxx,xxxx,xxxx,xxxx,xxxx,xxxx, xxxx,xxxx,xxxx,LBRC,RBRC,BSLS, +// |----+----+----+----+----+----| |----+----+----+----+----+----| + ,UNDO, CUT,XCPY,XINS,xxxx, xxxx,xxxx,xxxx,xxxx,xxxx, , +// |----+----+----+----+----+----| |----+----+----+----+----+----| + , , , , , , , , , , , +// '-----------------------------' '-----------------------------' + ), + + [_RAISE] = LAYOUT_kc( +// ,-----------------------------. .-----------------------------. + GRV,EXLM, AT ,HASH, DLR,PERC, CIRC,AMPR,ASTR,LPRN,RPRN, , +// |----+----+----+----+----+----| |----+----+----+----+----+----| + xxxx,xxxx,xxxx,xxxx,xxxx,xxxx, MINS, EQL,xxxx,LCBR,RCBR,PIPE, +// |----+----+----+----+----+----| |----+----+----+----+----+----| + ,xxxx,xxxx,xxxx,xxxx,xxxx, UNDS,PLUS,xxxx,xxxx,xxxx, , +// |----+----+----+----+----+----| |----+----+----+----+----+----| + , , , , , , , ,MNXT,VOLD,VOLU,MPLY +// '-----------------------------' '-----------------------------' + ), + + [_ADJUST] = LAYOUT_kc( \ +// ,-----------------------------. .-----------------------------. + xxxx,ROOT,PPLY,PSEF,xxxx,xxxx, RST,STOG,xxxx,xxxx,xxxx, DEL, +// |----+----+----+----+----+----| |----+----+----+----+----+----| + RGB,RHUI,RSAI,RVAI, MOD,xxxx, F1 , F2 , F3 , F4 , F5 , F6 , +// |----+----+----+----+----+----| |----+----+----+----+----+----| + RBTH,RHUD,RSAD,RVAD,RMOD,xxxx, F7 , F8 , F9 , F10, F11, F12, +// |----+----+----+----+----+----| |----+----+----+----+----+----| + ,xxxx,xxxx,xxxx, ,xxxx, xxxx, ,xxxx,xxxx,xxxx,xxxx +// '-----------------------------' '-----------------------------' + ) +}; diff --git a/keyboards/handwired/xeal60/keymaps/mtdjr/rules.mk b/keyboards/handwired/xeal60/keymaps/mtdjr/rules.mk new file mode 100644 index 000000000..75e9c6503 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/mtdjr/rules.mk @@ -0,0 +1,5 @@ +ifndef QUANTUM_DIR + include ../../../../Makefile +endif + +RGBLIGHT_ENABLE = yes diff --git a/keyboards/handwired/xeal60/keymaps/normacos/config.h b/keyboards/handwired/xeal60/keymaps/normacos/config.h new file mode 100644 index 000000000..9f95a869d --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/normacos/config.h @@ -0,0 +1,37 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +// #define MASTER_LEFT +// #define _MASTER_RIGHT +#define EE_HANDS + +#endif diff --git a/keyboards/handwired/xeal60/keymaps/normacos/keymap.c b/keyboards/handwired/xeal60/keymaps/normacos/keymap.c new file mode 100644 index 000000000..8902b7b56 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/normacos/keymap.c @@ -0,0 +1,213 @@ +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _NORMAN 0 +#define _LOWER 1 +#define _RAISE 2 +#define _ADJUST 3 + +// To be used in process_record_user +enum custom_keycodes { + NORMAN = SAFE_RANGE, + LOWER, + RAISE, + ADJUST, + SH_LOG, + SH_GOUP, + SH_TERM, + SPOT, + SLACK, + OUTLOOK, + CHROME +}; + +// Fillers (to make layering more clear) +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +// Mod taps +#define SFT_ENT SFT_T(KC_ENT) // Tap for Enter, hold for Shift +#define CTL_ESC CTL_T(KC_ESC) // Tap for Escape, hold for Control + +// Custom macros +#define SCN_SHT LSFT(LGUI(KC_4)) // Take a screenshot (MacOS) +#define SCN_LCK LCTL(LGUI(KC_Q)) // Lock screen (MacOS) +#define SH_HOME LCTL(KC_A) // Go to start of line +#define SH_END LCTL(KC_E) // Go to end of line +#define SH_RSCH LCTL(KC_R) // Search command history +#define SH_CLRH LCTL(KC_U) // Erase to beginning of line +#define SH_CLRE LCTL(KC_K) // Erase to end of line + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Norman + * ,-----------------------------------------. ,-----------------------------------------. + * | Tab | Q | W | D | F | K | | J | U | R | L | ; | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * |CtlEsc| A | S | E | T | G | | Y | N | I | O | H | ' | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | | P | M | , | . | / |SftEnt| + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Lock | Home | End | Alt | Lower| GUI | | Space| Raise| Left | Down | Up | Right| + * `-----------------------------------------' `-----------------------------------------' + */ +[_NORMAN] = LAYOUT_ortho_4x12( \ + KC_TAB, KC_Q, KC_W, KC_D, KC_F, KC_K, KC_J, KC_U, KC_R, KC_L, KC_SCLN, KC_BSPC, \ + CTL_ESC, KC_A, KC_S, KC_E, KC_T, KC_G, KC_Y, KC_N, KC_I, KC_O, KC_H, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_P, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_ENT, \ + SCN_LCK, KC_HOME, KC_END, KC_LALT, LOWER, KC_LGUI, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT +), + +/* Lower + * ,-----------------------------------------. ,-----------------------------------------. + * | Tab | F1 | F2 | F3 | F4 | | |NumLck| 7 | 8 | 9 | = | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * |CtlEsc| F5 | F6 | F7 | F8 | | | * | 4 | 5 | 6 | + | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shift| F9 | F10 | F11 | F12 | | | / | 1 | 2 | 3 | - |SftEnt| + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Lock | Home | End | Alt | Lower| GUI | | . | Raise| 0 | Spot |Chrome| | + * `-----------------------------------------' `-----------------------------------------' + */ +[_LOWER] = LAYOUT_ortho_4x12( \ + _______, KC_F1, KC_F2, KC_F3, KC_F4, XXXXXXX, KC_NLCK, KC_P7, KC_P8, KC_P9, KC_PEQL, _______, \ + _______, KC_F5, KC_F6, KC_F8, KC_F9, XXXXXXX, KC_PAST, KC_P4, KC_P5, KC_P6, KC_PPLS, KC_DEL, \ + _______, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, KC_PSLS, KC_P1, KC_P2, KC_P3, KC_PMNS, _______, \ + _______, _______, _______, _______, _______, _______, KC_PDOT, _______, KC_P0, SPOT, CHROME, XXXXXXX +), + +/* Raise + * ,-----------------------------------------. ,-----------------------------------------. + * | Tab | ! | @ | # | $ | % | | ^ | & | * | ( | ) | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * |CtlEsc| Log | UpDir| Slack| Term | OutLk| | = | - | \ | [ | ] | ` | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shift|ClrHom|ClrEnd|ShHome| ShEnd|Search| | Play | Mute | VolDn| VolUp|ScnSht|SftEnt| + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Lock | Home | End | Alt | Lower| GUI | | Space| Raise| Left | Down | Up | Right| + * `-----------------------------------------' `-----------------------------------------' + */ +[_RAISE] = LAYOUT_ortho_4x12( \ + _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \ + _______, SH_LOG, SH_GOUP, SLACK, SH_TERM, OUTLOOK, KC_EQL, KC_MINS, KC_BSLS, KC_LBRC, KC_RBRC, KC_GRV, \ + _______, SH_CLRH, SH_CLRE, SH_HOME, SH_END, SH_RSCH, KC_MPLY, KC_MUTE, KC_VOLD, KC_VOLU, SCN_SHT, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------. ,-----------------------------------------. + * | | | | | | | | | | | | Reset| | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | AudOn|AudOff| | |Norman| | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | Lower| | | | Raise| | | | | + * `-----------------------------------------' `-----------------------------------------' + */ +[_ADJUST] = LAYOUT_ortho_4x12( \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, AU_ON, AU_OFF, XXXXXXX, NORMAN, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX +) + +}; + +#ifdef AUDIO_ENABLE +float tone_norman[][2] = SONG(QWERTY_SOUND); +#endif + +void persistent_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (record->event.pressed) { + switch(keycode) { + case NORMAN: + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_norman); + #endif + persistent_default_layer_set(1UL<<_NORMAN); + return false; + case LOWER: + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + return false; + case RAISE: + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + return false; + case ADJUST: + layer_on(_ADJUST); + return false; + case SH_LOG: // Open Jira log work window + SEND_STRING(SS_TAP(X_DOT)); + _delay_ms(100); + SEND_STRING("log work"); + _delay_ms(100); + SEND_STRING(SS_TAP(X_ENTER)); + return false; + case SH_GOUP: // Go up a directory + SEND_STRING("cd .."SS_TAP(X_ENTER)); + return false; + case SH_TERM: // Open Terminal + SEND_STRING(SS_LGUI(SS_TAP(X_SPACE))); + _delay_ms(100); + SEND_STRING("terminal"); + _delay_ms(100); + SEND_STRING(SS_TAP(X_ENTER)); + return false; + case SPOT: // Open Spotify + SEND_STRING(SS_LGUI(SS_TAP(X_SPACE))); + _delay_ms(100); + SEND_STRING("spotify app"); + _delay_ms(100); + SEND_STRING(SS_TAP(X_ENTER)); + return false; + case SLACK: // Open Slack + SEND_STRING(SS_LGUI(SS_TAP(X_SPACE))); + _delay_ms(100); + SEND_STRING("slack"); + _delay_ms(100); + SEND_STRING(SS_TAP(X_ENTER)); + return false; + case OUTLOOK: // Open MS Outlook + SEND_STRING(SS_LGUI(SS_TAP(X_SPACE))); + _delay_ms(100); + SEND_STRING("outlook"); + _delay_ms(100); + SEND_STRING(SS_TAP(X_ENTER)); + return false; + case CHROME: // Open Chrome + SEND_STRING(SS_LGUI(SS_TAP(X_SPACE))); + _delay_ms(100); + SEND_STRING("chrome"); + _delay_ms(100); + SEND_STRING(SS_TAP(X_ENTER)); + return false; + } + } else { + switch(keycode) { + case LOWER: + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + return false; + case RAISE: + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + return false; + case ADJUST: + layer_off(_ADJUST); + return false; + } + } + return true; +} diff --git a/keyboards/handwired/xeal60/keymaps/normacos/readme.md b/keyboards/handwired/xeal60/keymaps/normacos/readme.md new file mode 100644 index 000000000..3b7a20632 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/normacos/readme.md @@ -0,0 +1,86 @@ +# normacos +This keymap was designed specifically to be used on a MacOS High Sierra system with constant use of the Terminal, as it includes a multitude of macros for both the terminal as well as Spotlight Search. + +Norman keyboard layout [info page.](https://normanlayout.info/) + +Some Norman layout keys were placed on different layers and different positions based on available space and preference. + + +Macros: +- CtlEsc sends Escape when tapped, and Control when held. +- SftEnt sends Enter when tapped, and Shift when held. +- Lock locks the computer +- Slack opens Slack through Spotlight Search +- Term opens Terminal through Spotlight Search +- Spot opens Spotify through Spotlight Search +- Chrome opens Chrome through Spotlight Search +- OutLk opens Microsoft Outlook through Spotlight Search +- ScnSht allows the user to take a screenshot of a selected portion of the screen +- ClrHom clears Terminal line from beginning of line up to cursor +- ClrEnd clears Terminal line from cursor up to end of line +- ShHome moves Terminal cursor to beginning of line +- ShEnd moves Terminal cursor to end of line +- Search activates Terminal Reverse Search Command History +- Log opens the 'Log Work' modal on Atlassian's Jira web client +- UpDir moves working directory to its parent + +All macros that make use of the SEND_STRING command have a 100 millisecond wait before and after "writing" to let the computer/OS/app catch up. +Any and all empty keys shown below are will be set in the future, and do nothing as of the time of this writing. + + + +## Default (Norman) +``` +,-----------------------------------------. ,-----------------------------------------. +| Tab | Q | W | D | F | K | | J | U | R | L | ; | Bksp | +|------+------+------+------+------+------| |------+------+------+------+------+------| +|CtlEsc| A | S | E | T | G | | Y | N | I | O | H | ' | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| Shift| Z | X | C | V | B | | P | M | , | . | / |SftEnt| +|------+------+------+------+------+------| |------+------+------+------+------+------| +| Lock | Home | End | Alt | Lower| GUI | | Space| Raise| Left | Down | Up | Right| +`-----------------------------------------' `-----------------------------------------' +``` + + +## Lower +``` +,-----------------------------------------. ,-----------------------------------------. +| Tab | F1 | F2 | F3 | F4 | | |NumLck| 7 | 8 | 9 | = | Bksp | +|------+------+------+------+------+------| |------+------+------+------+------+------| +|CtlEsc| F5 | F6 | F7 | F8 | | | * | 4 | 5 | 6 | + | Del | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| Shift| F9 | F10 | F11 | F12 | | | / | 1 | 2 | 3 | - |SftEnt| +|------+------+------+------+------+------| |------+------+------+------+------+------| +| Lock | Home | End | Alt | Lower| GUI | | . | Raise| 0 | Spot |Chrome| | +`-----------------------------------------' `-----------------------------------------' +``` + + +## Raise + +``` +,-----------------------------------------. ,-----------------------------------------. +| Tab | ! | @ | # | $ | % | | ^ | & | * | ( | ) | Del | +|------+------+------+------+------+------| |------+------+------+------+------+------| +|CtlEsc| Log | UpDir| Slack| Term | OutLk| | = | - | \ | [ | ] | ` | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| Shift|ClrHom|ClrEnd|ShHome| ShEnd|Search| | Play | Mute | VolDn| VolUp|ScnSht|SftEnt| +|------+------+------+------+------+------| |------+------+------+------+------+------| +| Lock | Home | End | Alt | Lower| GUI | | Space| Raise| Left | Down | Up | Right| +`-----------------------------------------' `-----------------------------------------' +``` + +## Adjust (Lower + Raise) + +``` +,-----------------------------------------. ,-----------------------------------------. +| | | | | | | | | | | | Reset| | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| | | | | AudOn|AudOff| | |Norman| | | | | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| | | | | | | | | | | | | | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| | | | | Lower| | | | Raise| | | | | +`-----------------------------------------' `-----------------------------------------' +``` diff --git a/keyboards/handwired/xeal60/keymaps/piemod/README.md b/keyboards/handwired/xeal60/keymaps/piemod/README.md new file mode 100644 index 000000000..f2a051da1 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/piemod/README.md @@ -0,0 +1,31 @@ +PieMod +====== + +A keymap for users that need: + +- *P*: Programming symbols. + +- *I*: i3wm. + +- *E*: Emacs. + +- *M*: Macros. + +- *O*: Ortholinear. + +- *D*: Dvorak. + +Still a work-in-progress. Suggestions welcome @ https://github.com/dwrz/piemod. + +### Keymap + +![PieMod Keymap](./keymap.png) + +### TODO + +- [ ] Add Emacs layer. +- [ ] Add Macro layer. +- [ ] Add system control keys (rotation, brightness). +- [ ] Switch " and ' quotes (or function to toggle default). +- [ ] Add capslock. +. diff --git a/keyboards/handwired/xeal60/keymaps/piemod/config.h b/keyboards/handwired/xeal60/keymaps/piemod/config.h new file mode 100644 index 000000000..001b62e41 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/piemod/config.h @@ -0,0 +1,49 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + +// RGB Options +#undef RGBLED_NUM +#define RGBLED_NUM 10 +#define RGBLIGHT_SLEEP +#define RGBLIGHT_ANIMATIONS +#define RGBLIGHT_EFFECT_SNAKE_LENGTH 1 +#define RGBLIGHT_EFFECT_KNIGHT_LENGTH 1 + +// Typing Options +#define PREVENT_STUCK_MODIFIERS +#define QMK_KEYS_PER_SCAN 4 + +#endif diff --git a/keyboards/handwired/xeal60/keymaps/piemod/keymap.c b/keyboards/handwired/xeal60/keymaps/piemod/keymap.c new file mode 100644 index 000000000..d789b7a8b --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/piemod/keymap.c @@ -0,0 +1,99 @@ +#include QMK_KEYBOARD_H + + +extern keymap_config_t keymap_config; + +#define _DVORAK 0 +#define _ARROW 1 //F(1) +#define _SYMBOL 2 // F(2) +#define _NUMBER 3 // F(3) +#define _FUNCTION 4 // F(4) +#define _EMACS 5 // F(5) +#define _COMBOS 6 // F(6) +#define _MOUSE 7 // F(7) + +enum custom_keycodes { + DVORAK = SAFE_RANGE, + ARROW, + SYMBOL, + NUMBER, + FUNCTION, + EMACS, + COMBOS, + MOUSE, +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +[_DVORAK] = LAYOUT( \ + KC_ESC, KC_QUOTE, LT(7, KC_COMMA), KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_DELETE, \ + KC_TAB, LT(1, KC_A), LT(2, KC_O), LT(3, KC_E), LT(4, KC_U), KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_ENTER, \ + KC_LSHIFT, KC_SCOLON, LT(5, KC_Q), KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_MINUS, \ + F(1), LT(6, KC_LCTRL), KC_MENU, KC_LALT, KC_LGUI, KC_BSPACE, KC_SPACE, KC_RCTRL, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT \ +), + +[_ARROW] = LAYOUT( \ + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_HOME, KC_UP, KC_END, KC_PGUP, \ + KC_NO, KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_LEFT, KC_DOWN, KC_RIGHT, KC_PGDN, \ + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_HOME, KC_PGDN, KC_PGUP, KC_END, KC_NO, \ + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO \ +), + +[_SYMBOL] = LAYOUT( \ + KC_TILD, KC_GRAVE, KC_NO, KC_EQUAL, KC_PLUS, KC_NO, KC_LBRACKET, KC_RBRACKET, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, \ + KC_NO, KC_NO, KC_TRNS, KC_SCOLON, KC_COLN, KC_NO, KC_LCBR, KC_RCBR, KC_DLR, KC_PERC, KC_CIRC, F(2), \ + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_BSLASH, KC_SLASH, KC_EXLM, KC_AT, KC_HASH, KC_PIPE, \ + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_ASTR, KC_SLASH, KC_MINUS, KC_PLUS, KC_EQUAL \ +), + +[_NUMBER] = LAYOUT( \ + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_7, KC_8, KC_9, KC_NO, \ + KC_NO, KC_NO, KC_NO, KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_4, KC_5, KC_6, KC_NO, \ + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_0, KC_1, KC_2, KC_3, KC_NO, \ + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_ASTR, KC_SLASH, KC_MINUS, KC_PLUS, KC_EQUAL \ +), + +[_FUNCTION] = LAYOUT( \ + KC_PSCREEN, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, \ + KC_NO, RGB_HUI, RGB_SAI, RGB_VAI, KC_TRNS, KC_NO, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ + KC_NO, RGB_HUD, RGB_SAD, RGB_VAD, KC_NO, KC_NO, KC_NO, KC_NO, KC_AUDIO_MUTE, KC_AUDIO_VOL_DOWN, KC_AUDIO_VOL_UP, KC_MEDIA_PLAY_PAUSE, \ + RESET, RGB_TOG, RGB_MOD, KC_NO, KC_NO, KC_NO, KC_DELETE, KC_INSERT, KC_HOME, KC_PGDN, KC_PGUP, KC_END \ +), + +[_EMACS] = LAYOUT( \ + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ + KC_NO, KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO \ +), + +[_COMBOS] = LAYOUT( \ + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ + KC_NO, KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO \ +), + +[_MOUSE] = LAYOUT( \ + KC_NO, KC_NO, KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_MS_U, KC_NO, KC_NO, \ + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_MS_L, KC_MS_D, KC_MS_R, KC_NO, \ + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_MS_BTN1, KC_MS_BTN2, KC_MS_BTN3, KC_NO, KC_NO, KC_NO \ +) +}; + +enum function_id { + TEENSY_KEY, + CUSTOM_KEY, + L_CTRL_ALT_ENT, + R_CTRL_ALT_ENT, +}; + +int CAPSLOCKED = 0; + + const uint16_t PROGMEM fn_actions[] = { + // Special Keys + [1] = ACTION_MODS_KEY(KC_LCTRL, KC_LALT), // FN10 = Ctrl + Alt. + // Symbols + [2] = ACTION_MODS_KEY(MOD_LSFT, KC_SLASH), // FN21 = Question mark. + }; diff --git a/keyboards/handwired/xeal60/keymaps/piemod/rules.mk b/keyboards/handwired/xeal60/keymaps/piemod/rules.mk new file mode 100644 index 000000000..027ea977e --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/piemod/rules.mk @@ -0,0 +1,13 @@ +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = yes # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SUBPROJECT_rev1 = no diff --git a/keyboards/handwired/xeal60/keymaps/pitty/README.md b/keyboards/handwired/xeal60/keymaps/pitty/README.md new file mode 100644 index 000000000..1662fce7a --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/pitty/README.md @@ -0,0 +1,91 @@ +# Pittyolo's Let's Split Layout + +This is my Let's Split layout, modified for my ISO Hungarian taste :) + +Added some layer feedback in the underglow, but it's still a WIP. + +I wrote the keys that will appear when using Hungarian layout in Windows and the respective English keys in brackets. + + + ### Qwerty +``` +,-----------------------------------------------------------------------------------. +| Tab | Q | W | E | R | T | Z(Y)| U | I | O | P | Bksp | +|------+------+------+------+------+-------------+------+------+------+------+------| +| Esc | A | S | D |LTVIMF| G | H | J | K | L | É(;)| Á(") | +|------+------+------+------+------+------|------+------+------+------+------+------| +|Í/Shft| Y(Z) | X | C | V | B | N | M | , | . | -(/)| Shift| +|------+------+------+------+------+------+------+------+------+------+------+------| +| Ctrl | GUI | Alt |ADJUST| Spc | LOWER| Bksp | Ent | Alt | =(&) | GAME | Del | +`-----------------------------------------------------------------------------------' +``` + + Tap left shift writes the missing ISO key, hold is Shift. + + + ### Gaming mode (Toggle layer) +``` +,-----------------------------------------------------------------------------------. +| | | | | | | | | | | |Lower | +|------+------+------+------+------+------+------+------+------+------+------+------| +| | | | | F | | | | | | | | +|------+------+------+------+------+------+------+------+------+------+------+------| +| Shift| | | | | | | | | | |QWERTY| +|------+------+------+------+------+------+------+------+------+------+------+------| +| | | | | | | | | Left | Down | Up | Right| +`-----------------------------------------------------------------------------------' +``` + +Disabled some of the functions in the main layer to help with better gaming experience. + + + ### Lower (Hold down right Space) +``` +,-----------------------------------------------------------------------------------. +| 0(') | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Ö(0) | Ü(-) | +|------+------+------+------+------+------+------+------+------+------+------+------| +| F10 | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F11 | F12 | +|------+------+------+------+------+-------------+------+------+------+------+------| +| | | | | | | | | Ins | Home | PgUp | Shift| +|------+------+------+------+------+------+------+------+------+------+------+------| +| | | | | | | | | Del | End | PgDn | AltGr| +`-----------------------------------------------------------------------------------' +``` + + Function layer with everything that is missing from the main layer. + + + ### NAV (double tap toggles the layer, and hold for momentary switch) +``` +,-----------------------------------------------------------------------------------. +| | | Up | | F2 | | | 7 | 8 | 9 | / | | +|------+------+------+------+------+------|------+------+------+------+------+------| +| | Left | Down | Right| | | | 4 | 5 | 6 | * | | +|------+------+------+------+------+------|------+------+------+------+------+------| +| Shift| | | | | | | 1 | 2 | 3 | - | | +|------+------+------+------+------+------|------+------+------+------+------+------| +| | | | | | | | 0 | . | = | + | | +`-----------------------------------------------------------------------------------' +``` + + Navigation layer with a numpad on the right side. + + + + ### Vim Movement (Hold down F) +``` +,-----------------------------------------------------------------------------------. +|RGBMOD|RGBTOG| | | | | | Ú | Í | Ó | Ő | Ű | +|------+------+------+------+------+------+------+------+------+------+------+------| +|DM_stp| | | LCTRL| | | Left | Down | Up | Right| | | +|------+------+------+------+------+------+------+------+------+------+------+------| +|DM_REC| | | | | | | | | | | | +|------+------+------+------+------+------+------+------+------+------+------+------| +| | | | | LShft| | | | | | | RESET| +`-----------------------------------------------------------------------------------' +``` + + Turns hjkl into vim movement. I moved accented Hungarian letters here. + + + diff --git a/keyboards/handwired/xeal60/keymaps/pitty/config.h b/keyboards/handwired/xeal60/keymaps/pitty/config.h new file mode 100644 index 000000000..3798f9a64 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/pitty/config.h @@ -0,0 +1,26 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + +#define TAPPING_TOGGLE 2 + +#undef RGBLED_NUM +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 2 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 + +#endif diff --git a/keyboards/handwired/xeal60/keymaps/pitty/keymap.c b/keyboards/handwired/xeal60/keymaps/pitty/keymap.c new file mode 100644 index 000000000..0fd4c1384 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/pitty/keymap.c @@ -0,0 +1,169 @@ +#include QMK_KEYBOARD_H + + +//Following line allows macro to read current RGB settings +extern rgblight_config_t rgblight_config; + +extern keymap_config_t keymap_config; + +#define _QWERTY 0 +#define _GAME 1 +#define _LOWER 2 +#define _NAV 3 +#define _VIM 4 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + GAME, + LOWER, + NAV, + VIM, +}; + + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Z(Y)| U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | S | D |LTVIMF| G | H | J | K | L | É(;)| Á(") | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * |Í/Shft| Y(Z) | X | C | V | B | N | M | , | . | -(/)| Shift| + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Ctrl | GUI | Alt |ADJUST| Spc | LOWER| Bksp | Ent | Alt | =(&) | GAME | Del | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = LAYOUT( \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + KC_ESC, KC_A, KC_S, KC_D, LT(_VIM, KC_F), KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + MT(MOD_LSFT, KC_NUBS), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \ + KC_LCTL, KC_LGUI, KC_LALT, TT(_NAV), KC_SPC, LT(_LOWER, KC_SPC), KC_BSPC, KC_ENT, KC_RALT, KC_AMPERSAND, TG(_GAME), KC_DEL \ +), + +/* Gaming mode + * ,-----------------------------------------------------------------------------------. + * | | | | | | | | | | | |Lower | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | F | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Shift| | | | | | | | | | |QWERTY| + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | Left | Down | Up | Right| + * `-----------------------------------------------------------------------------------' + */ +[_GAME] = LAYOUT( \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, OSL(_LOWER), \ + _______, _______, _______, _______, KC_F, _______, _______, _______, _______, _______, _______, _______, \ + KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, TO(_QWERTY), \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | 0(') | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Ö(0) | Ü(-) | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | F10 | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F11 | F12 | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | | | | | | | Ins | Home | PgUp | Shift| + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | Del | End | PgDn | AltGr| + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, \ + KC_F10, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F11, KC_F12, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_INS, KC_HOME, KC_PGUP, KC_RSFT, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, KC_END, KC_PGDN, KC_RALT \ +), + + +/* NAV + * ,-----------------------------------------------------------------------------------. + * | | | Up | | F2 | | | 7 | 8 | 9 | / | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | Left | Down | Right| | | | 4 | 5 | 6 | * | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| | | | | | | 1 | 2 | 3 | - | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | | 0 | . | = | + | | + * `-----------------------------------------------------------------------------------' + */ +[_NAV] = LAYOUT( \ + _______, _______, KC_UP, _______, KC_F2, _______, _______, KC_7, KC_8, KC_9, KC_KP_SLASH, _______, \ + _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, KC_4, KC_5, KC_6, KC_KP_ASTERISK, _______, \ + KC_LSFT, _______, _______, _______, _______, _______, _______, KC_1, KC_2, KC_3, KC_KP_MINUS, _______, \ + _______, _______, _______, _______, _______, _______, _______, KC_GRV, KC_KP_DOT, KC_KP_EQUAL, KC_KP_PLUS, _______ \ +), + +/* Vim Movement (Hold down F) + * ,-----------------------------------------------------------------------------------. + * |RGBMOD|RGBTOG| | | | | | Ú | Í | Ó | Ő | Ű | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |DM_stp| | | LCTRL| | | Left | Down | Up | Right| | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |DM_REC| | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | LShft| | | | | | | RESET| + * `-----------------------------------------------------------------------------------' + */ +[_VIM] = LAYOUT( \ + RGB_MOD, RGB_TOG, _______, _______, _______, _______, _______, KC_RBRC, KC_NUBS, KC_EQL , KC_LBRC, KC_NUHS, \ + _______, _______, _______, KC_LCTL, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, KC_LSFT, _______, _______, _______, _______, _______, _______, RESET \ +) + + +}; + +// define variables for reactive RGB +bool RGB_INIT = false; +bool TOG_STATUS = false; +int RGB_current_mode; + +void persistent_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + + +void matrix_scan_user(void) { + uint8_t layer = biton32(layer_state); + switch (layer) { + case _NAV: + if (RGB_INIT) {} else { + RGB_current_mode = rgblight_config.mode; + RGB_INIT = true; + } + if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false + } else { + TOG_STATUS = !TOG_STATUS; + rgblight_mode(29); + } + break; + case _LOWER: + if (RGB_INIT) {} else { + RGB_current_mode = rgblight_config.mode; + RGB_INIT = true; + } + if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false + } else { + TOG_STATUS = !TOG_STATUS; + rgblight_mode(29); + } + break; + case _QWERTY: + if (RGB_INIT) {} else { + RGB_current_mode = rgblight_config.mode; + RGB_INIT = true; + } + rgblight_mode(RGB_current_mode); // revert RGB to initial mode prior to RGB mode change + TOG_STATUS = false; + break; + } + }; diff --git a/keyboards/handwired/xeal60/keymaps/pitty/rules.mk b/keyboards/handwired/xeal60/keymaps/pitty/rules.mk new file mode 100644 index 000000000..8ebc85a44 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/pitty/rules.mk @@ -0,0 +1,6 @@ +RGBLIGHT_ENABLE = yes +NKRO_ENABLE = yes + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/handwired/xeal60/keymaps/poker/config.h b/keyboards/handwired/xeal60/keymaps/poker/config.h new file mode 100644 index 000000000..5a6261c4f --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/poker/config.h @@ -0,0 +1,37 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + +#endif diff --git a/keyboards/handwired/xeal60/keymaps/poker/keymap.c b/keyboards/handwired/xeal60/keymaps/poker/keymap.c new file mode 100644 index 000000000..cce0ca474 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/poker/keymap.c @@ -0,0 +1,240 @@ +#include QMK_KEYBOARD_H + + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _LOWER 3 +#define _RAISE 4 +#define _FN 5 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + LOWER, + RAISE, + FN, + ADJUST +}; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Func | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Ctrl | GUI | Esc | Alt |Lower | Esc |Space |Raise | Left | Up | Down |Right | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = LAYOUT( \ + KC_TAB , KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + FN , KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + SFT_T(KC_ESC) , KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, MT(MOD_RSFT, KC_ENT), \ + KC_LCTL , KC_LGUI, KC_ESC, KC_LALT, LOWER, KC_ESC, KC_SPC, RAISE, KC_LEFT, KC_UP, KC_DOWN, KC_RGHT \ +), + +/* Colemak + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Func | A | R | S | T | D | H | N | E | I | O | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Ctrl | GUI | Esc | Alt |Lower | Esc |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_COLEMAK] = LAYOUT( \ + KC_TAB , KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, \ + FN , KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \ + SFT_T(KC_ESC) , KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, MT(MOD_RSFT, KC_ENT), \ + KC_LCTL , KC_LGUI, KC_ESC, KC_LALT, LOWER, KC_ESC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Dvorak + * ,-----------------------------------------------------------------------------------. + * | Tab | " | , | . | P | Y | F | G | C | R | L | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Func | A | O | E | U | I | D | H | T | N | S | / | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Ctrl | GUI | Esc | Alt |Lower | Esc |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_DVORAK] = LAYOUT( \ + KC_TAB , KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, \ + FN , KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, \ + SFT_T(KC_ESC) , KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, MT(MOD_RSFT, KC_ENT), \ + KC_LCTL , KC_LGUI, KC_ESC, KC_LALT, LOWER, KC_ESC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | Home | End | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | Home |Pg Up |Pg Dn | End | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT( \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL , \ + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_NUHS), S(KC_NUBS), KC_HOME, KC_END, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, KC_PGDN, KC_END \ +), + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / |Pg Up |Pg Dn | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | Home |Pg Up |Pg Dn | End | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL , \ + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, KC_PGDN, KC_END \ +), + +/* Function + * ,-----------------------------------------------------------------------------------. + * | Esc | | Prev | Play | Next | | |Pg Up | Up |Pg Dn |Prt Sc| Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | Vol- | Mute | Vol+ | | Home | Left | Down |Right | End | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | Esc | | | Esc | Home |Pg Up |Pg Dn | End | + * `-----------------------------------------------------------------------------------' + */ +[_FN] = LAYOUT( \ + KC_ESC , _______, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______, KC_PGUP, KC_UP, KC_PGDN, KC_PSCR, KC_DEL, \ + _______, _______, KC_VOLD, KC_MUTE, KC_VOLU, _______, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END , _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, KC_ESC , _______, _______, KC_ESC , KC_HOME, KC_PGUP, KC_PGDN, KC_END \ +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | Reset| | | | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Caps |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof| | | | | Caps | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ + [_ADJUST] = LAYOUT( \ + _______, RESET, DEBUG, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL , \ + _______, _______, MU_MOD, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ + KC_CAPS, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, KC_CAPS, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ) + +}; + +#ifdef AUDIO_ENABLE +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +float tone_dvorak[][2] = SONG(DVORAK_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); +#endif + +void persistent_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_qwerty); + #endif + persistent_default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_colemak); + #endif + persistent_default_layer_set(1UL<<_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_dvorak); + #endif + persistent_default_layer_set(1UL<<_DVORAK); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case FN: + if (record->event.pressed) { + layer_on(_FN); + } else { + layer_off(_FN); + } + return false; + break; + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + break; + } + return true; +} diff --git a/keyboards/handwired/xeal60/keymaps/poker/rules.mk b/keyboards/handwired/xeal60/keymaps/poker/rules.mk new file mode 100644 index 000000000..457a3d01d --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/poker/rules.mk @@ -0,0 +1,3 @@ +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/handwired/xeal60/keymaps/smt/config.h b/keyboards/handwired/xeal60/keymaps/smt/config.h new file mode 100644 index 000000000..5a6261c4f --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/smt/config.h @@ -0,0 +1,37 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + +#endif diff --git a/keyboards/handwired/xeal60/keymaps/smt/keymap.c b/keyboards/handwired/xeal60/keymaps/smt/keymap.c new file mode 100644 index 000000000..090cf78b7 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/smt/keymap.c @@ -0,0 +1,218 @@ +#include QMK_KEYBOARD_H + + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _LOWER 3 +#define _RAISE 4 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + LOWER, + RAISE, + ADJUST, +}; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +// Custom macros +#define CTL_ESC CTL_T(KC_ESC) // Tap for Esc, hold for Ctrl +#define SFT_ENT SFT_T(KC_ENT) // Tap for Enter, hold for Shift +#define HPR_TAB ALL_T(KC_TAB) // Tap for Tab, hold for Hyper (Super+Ctrl+Alt+Shift) +#define MEH_GRV MEH_T(KC_GRV) // Tap for Backtick, hold for Meh (Ctrl+Alt+Shift) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------. ,-----------------------------------------. + * | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Esc | A | S | D | F | G | | H | J | K | L | ; | " | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | | N | M | , | . | / |Enter | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | ` | Ctrl | Alt | GUI |Lower |Space | |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------' `-----------------------------------------' + */ +[_QWERTY] = LAYOUT( \ + HPR_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + CTL_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_ENT, \ + MEH_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT +), + +/* Colemak + * ,-----------------------------------------. ,-----------------------------------------. + * | Tab | Q | W | F | P | G | | J | L | U | Y | ; | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Esc | A | R | S | T | D | | H | N | E | I | O | " | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | | K | M | , | . | / |Enter | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | ` | Ctrl | Alt | GUI |Lower |Space | |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------' `-----------------------------------------' + */ +[_COLEMAK] = LAYOUT( \ + HPR_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, \ + CTL_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_ENT, \ + MEH_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT +), + +/* Dvorak + * ,-----------------------------------------. ,-----------------------------------------. + * | Tab | " | , | . | P | Y | | F | G | C | R | L | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Esc | A | O | E | U | I | | D | H | T | N | S | - | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | | B | M | W | V | Z |Enter | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | ` | Ctrl | Alt | GUI |Lower |Space | |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------' `-----------------------------------------' + */ +[_DVORAK] = LAYOUT( \ + HPR_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, \ + CTL_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, \ + KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, SFT_ENT, \ + MEH_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT +), + +/* Lower + * ,-----------------------------------------. ,-----------------------------------------. + * | 0 | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | $ | F1 | F2 | F3 | F4 | F5 | | F6 | 4 | 5 | 6 | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | | F12 | 1 | 2 | 3 | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------' `-----------------------------------------' + */ +[_LOWER] = LAYOUT( \ + ALL_T(KC_0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \ + CTL_T(KC_DLR), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_4, KC_5, KC_6, _______, _______, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_1, KC_2, KC_3, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY +), + +/* Raise + * ,-----------------------------------------. ,-----------------------------------------. + * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | _ | ? | + | { | } | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | - | / | = | [ | ] | \ | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | Home |PageDn|PageUp| End | + * `-----------------------------------------' `-----------------------------------------' + */ +[_RAISE] = LAYOUT( \ + ALL_T(KC_TILD), KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \ + _______, _______, _______, _______, _______, _______, KC_UNDS, KC_QUES, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ + _______, _______, _______, _______, _______, _______, KC_MINS, KC_SLSH, KC_EQL, KC_LBRC, KC_RBRC, SFT_T(KC_BSLS), \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------. ,-----------------------------------------. + * | | Reset| | | | | | | | | | | Reset| + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm| |AGswap|Qwerty|Colemk|Dvorak| | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | | | | | + * `-----------------------------------------' `-----------------------------------------' + */ +[_ADJUST] = LAYOUT( \ + _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET, \ + _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +) + +}; + +#ifdef AUDIO_ENABLE +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +float tone_dvorak[][2] = SONG(DVORAK_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); +#endif + +void persistent_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_qwerty); + #endif + persistent_default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_colemak); + #endif + persistent_default_layer_set(1UL<<_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_dvorak); + #endif + persistent_default_layer_set(1UL<<_DVORAK); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + break; + } + return true; +} diff --git a/keyboards/handwired/xeal60/keymaps/smt/readme.md b/keyboards/handwired/xeal60/keymaps/smt/readme.md new file mode 100644 index 000000000..20bc662f0 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/smt/readme.md @@ -0,0 +1,88 @@ +# smt's Let's Split keymap + +This keymap is ported from my Planck keymap. + + +## Qwerty + +``` +,-----------------------------------------. ,-----------------------------------------. +| Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| Esc | A | S | D | F | G | | H | J | K | L | ; | " | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| Shift| Z | X | C | V | B | | N | M | , | . | / |Enter | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| ` | Ctrl | Alt | GUI |Lower |Space | |Space |Raise | Left | Down | Up |Right | +`-----------------------------------------' `-----------------------------------------' +``` + +## Colemak + +``` +,-----------------------------------------. ,-----------------------------------------. +| Tab | Q | W | F | P | G | | J | L | U | Y | ; | Bksp | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| Esc | A | R | S | T | D | | H | N | E | I | O | " | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| Shift| Z | X | C | V | B | | K | M | , | . | / |Enter | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| ` | Ctrl | Alt | GUI |Lower |Space | |Space |Raise | Left | Down | Up |Right | +`-----------------------------------------' `-----------------------------------------' +``` + +## Dvorak + +``` +,-----------------------------------------. ,-----------------------------------------. +| Tab | " | , | . | P | Y | | F | G | C | R | L | Bksp | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| Esc | A | O | E | U | I | | D | H | T | N | S | - | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| Shift| ; | Q | J | K | X | | B | M | W | V | Z |Enter | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| ` | Ctrl | Alt | GUI |Lower |Space | |Space |Raise | Left | Down | Up |Right | +`-----------------------------------------' `-----------------------------------------' +``` + +## Lower + +``` +,-----------------------------------------. ,-----------------------------------------. +| 0 | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| $ | F1 | F2 | F3 | F4 | F5 | | F6 | 4 | 5 | 6 | | | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| | F7 | F8 | F9 | F10 | F11 | | F12 | 1 | 2 | 3 | | | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| | | | | | | | | | Next | Vol- | Vol+ | Play | +`-----------------------------------------' `-----------------------------------------' +``` + +## Raise + +``` +,-----------------------------------------. ,-----------------------------------------. +| ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | Del | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| | | | | | | | _ | ? | + | { | } | | | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| | | | | | | | - | / | = | [ | ] | \ | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| | | | | | | | | | Home |PageDn|PageUp| End | +`-----------------------------------------' `-----------------------------------------' +``` + +## Adjust (Lower + Raise) + +``` +,-----------------------------------------. ,-----------------------------------------. +| | Reset| | | | | | | | | | | Reset| +|------+------+------+------+------+------| |------+------+------+------+------+------| +| | | |Aud on|Audoff|AGnorm| |AGswap|Qwerty|Colemk|Dvorak| | | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| | | | | | | | | | | | | | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| | | | | | | | | | | | | | +`-----------------------------------------' `-----------------------------------------' +``` diff --git a/keyboards/handwired/xeal60/keymaps/that_canadian/config.h b/keyboards/handwired/xeal60/keymaps/that_canadian/config.h new file mode 100644 index 000000000..586b6e8c8 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/that_canadian/config.h @@ -0,0 +1,32 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define _MASTER_RIGHT +// #define EE_HANDS + +#endif \ No newline at end of file diff --git a/keyboards/handwired/xeal60/keymaps/that_canadian/keymap.c b/keyboards/handwired/xeal60/keymaps/that_canadian/keymap.c new file mode 100644 index 000000000..239a8d3be --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/that_canadian/keymap.c @@ -0,0 +1,163 @@ +#include QMK_KEYBOARD_H +#include "action_layer.h" +#include "eeconfig.h" + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 + +#define _LOWER 3 +#define _RAISE 4 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + LOWER, + RAISE, + ADJUST, + BACKLIT +}; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | RESET| Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Backlt| Ctrl | GUI | Alt |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = LAYOUT( \ + RESET, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + RGB_TOG, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ + BACKLIT, KC_LCTL, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | | \ | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT( \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | Reset| | | | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = LAYOUT( \ + _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ + _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ +) + + +}; + +void persistent_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_qwerty); + #endif + persistent_default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case BACKLIT: + if (record->event.pressed) { + register_code(KC_RSFT); + #ifdef BACKLIGHT_ENABLE + backlight_step(); + #endif + } else { + unregister_code(KC_RSFT); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + break; + } + return true; +} \ No newline at end of file diff --git a/keyboards/handwired/xeal60/keymaps/waples/README.md b/keyboards/handwired/xeal60/keymaps/waples/README.md new file mode 100644 index 000000000..6e171d964 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/waples/README.md @@ -0,0 +1,58 @@ +# Waples Let's Split keymap +[Waples](https://www.github.com/Waples) + +## My (forever) Work-In-Progress keymap for my Let's Split keyboard. +My keymap is much like the default, I just personally like to have my Enter and Escape key to be on my home row. The Escape key doubles as a Control key when held down, my Enter key functions as (right)Shift when held down. +Everything you see below here is constantly *under construction*, so there may be some dumb things in this, which are already gotten taken out, or are still in there :P. + +### Layers +I currently have the following layers in my keymap: +* Qwerty (as default) +* Dvorak (still learning this type of layout, so not really used much) +* Gaming (WIP! I tried some I found, but didn't like them, so I'm in the progress of making my own) +* Lefty (lower) +* Righty (raise) +* Dual (adjust) + +#### QWERTY + | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bsp | + |C_Esc| A | S | D | F | G | | H | J | K | L | ; |S_Ent| + | Sft | Z | X | C | V | B | | N | M | , | . | / | " | + |P_SCR| GUI | Alt | Cps | ^L^ | Bsp | | Spc | ^R^ | Lft | Dwn | Up! | Rgt | + + +#### DVORAK + | Tab | " | , | . | P | Y | | F | G | C | R | L | Bsp | + |C_Esc| A | O | E | U | I | | D | H | T | N | S |S_Ent| + | Sft | ; | Q | J | K | X | | B | M | W | V | Z | / | + |P_SCR| GUI | Alt | Cps | ^L^ | Bsp | | Spc | ^R^ | Lft | Dwn | Up! | Rgt | + + +#### GAMING + | Tab | Q | W | E | R | T | | | | | | |QWERT| + | Esc | A | S | D | F | G | | | | | | | | + | Sft | Z | X | C | V | B | | | | | | | | + | Ctl | 1 | 2 | 3 | ^L^ | Spc | | Bsp | ^R^ | Lft | Dwn | Up | Rgt | + + +#### LEFTY (lower) + | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | Bsp | + | Del | | | | | | | | ( | ) | [ | ] | | + | | | | | | | | | | | | | | + | | | | | | | | Ins | | Hme | PgD | PgU | End | + + +#### RIGHTY (raise) + | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bsp | + | Del | F1 | F2 | F3 | F4 | | | = | - | \ | / | | | + | | F5 | F6 | F7 | F8 | | | | | | | | | + | | F9 | F10 | F11 | | | | | | | | | | + + +#### DUAL + |Reset| | | | |QWERT| | GAME| | | | |Reset| + | | Prv | Stp | Tog | Nxt | Nrm | | Swp | | | | | | + | | | Mte | Vol-| Vol+| | | NKRO| | | | | | + | | | | | | | |DVORK| | | | | | + + diff --git a/keyboards/handwired/xeal60/keymaps/waples/config.h b/keyboards/handwired/xeal60/keymaps/waples/config.h new file mode 100644 index 000000000..98ebeff45 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/waples/config.h @@ -0,0 +1,17 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* Use I2C or Serial, not both */ +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ +// #define MASTER_LEFT +// #define MASTER_RIGHT +#define EE_HANDS // We like to have choices I guess + +#define PREVENT_STUCK_MODIFIERS // When switching layers, this will release all mods + +#endif diff --git a/keyboards/handwired/xeal60/keymaps/waples/keymap.c b/keyboards/handwired/xeal60/keymaps/waples/keymap.c new file mode 100644 index 000000000..7b25bc51f --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/waples/keymap.c @@ -0,0 +1,131 @@ +// Waples layout for Let's Split (rev2) +// Made changes from the default + +#include QMK_KEYBOARD_H + + +extern keymap_config_t keymap_config; + +#define _QWERTY 0 +#define _DVORAK 1 +#define _GAME 2 +#define _LEFTY 3 +#define _RIGHTY 4 +#define _DUAL 5 + +enum letssplit_keycodes { + QWERTY = SAFE_RANGE, + DVORAK, + GAME, + LEFTY, + RIGHTY, + DUAL, +}; + +#define TG_NKRO MAGIC_TOGGLE_NKRO // Toggle NKRO +#define CTLESC MT(MOD_LCTL, KC_ESC) // Hold for left Ctrl, tap for Esc +#define SHFTENT MT(MOD_RSFT, KC_ENT) // Hold for right Shift, tap for Enter +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +[_QWERTY] = LAYOUT( \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + CTLESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, SHFTENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_QUOT, \ + KC_PSCR, KC_BSPC, KC_LALT, KC_CAPS, LEFTY, KC_LGUI, KC_SPC, RIGHTY, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +[_DVORAK] = LAYOUT( \ + KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, \ + CTLESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, SHFTENT, \ + KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_SLSH, \ + KC_PSCR, KC_LGUI, KC_LALT, KC_CAPS, LEFTY, KC_BSPC, KC_SPC, RIGHTY, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +[_GAME] = LAYOUT( \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, _______, _______, _______, _______, _______, QWERTY, \ + CTLESC, KC_A, KC_S, KC_D, KC_F, KC_G, _______, _______, _______, _______, _______, _______, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, _______, _______, _______, _______, _______, _______, \ + KC_LCTL, KC_1, KC_2, KC_3, LEFTY, KC_SPC, KC_BSPC, RIGHTY, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT \ +), + +[_LEFTY] = LAYOUT( \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \ + KC_DEL, _______, _______, _______, _______, _______, _______, KC_LPRN, KC_RPRN, KC_LBRC, KC_RBRC, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, KC_INS, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END \ +), + +[_RIGHTY] = LAYOUT( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, _______, KC_EQL, KC_MINS, KC_BSLS, KC_SLSH, _______, _______, \ + _______, KC_F5, KC_F6, KC_F7, KC_F8, _______, _______, _______, _______, _______, _______, _______, + _______, KC_F9, KC_F10, KC_F11, _______, _______, _______, _______, _______, _______, _______, _______ \ +), + +[_DUAL] = LAYOUT( \ + RESET, _______, _______, _______, _______, QWERTY, GAME, _______, _______, _______, _______, RESET, \ + _______, KC_MPRV, KC_MSTP, KC_MPLY, KC_MNXT, AG_NORM, AG_SWAP, _______, _______, _______, _______, _______, \ + _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, TG_NKRO, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, DVORAK, _______, _______, _______, _______, _______ \ +) +}; + +void persistent_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + persistent_default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + persistent_default_layer_set(1UL<<_DVORAK); + } + return false; + break; + case GAME: + if (record->event.pressed) { + persistent_default_layer_set(1UL<<_GAME); + } + return false; + break; + case LEFTY: + if (record->event.pressed) { + layer_on(_LEFTY); + update_tri_layer(_LEFTY, _RIGHTY, _DUAL); + } else { + layer_off(_LEFTY); + update_tri_layer(_LEFTY, _RIGHTY, _DUAL); + } + return false; + break; + case RIGHTY: + if (record->event.pressed) { + layer_on(_RIGHTY); + update_tri_layer(_LEFTY, _RIGHTY, _DUAL); + } else { + layer_off(_RIGHTY); + update_tri_layer(_LEFTY, _RIGHTY, _DUAL); + } + return false; + break; + case DUAL: + if (record->event.pressed) { + layer_on(_DUAL); + } else { + layer_off(_DUAL); + } + return false; + break; + } + return true; +} diff --git a/keyboards/handwired/xeal60/keymaps/waples/rules.mk b/keyboards/handwired/xeal60/keymaps/waples/rules.mk new file mode 100644 index 000000000..457a3d01d --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/waples/rules.mk @@ -0,0 +1,3 @@ +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/handwired/xeal60/keymaps/xk/config.h b/keyboards/handwired/xeal60/keymaps/xk/config.h new file mode 100644 index 000000000..c75ed12cc --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/xk/config.h @@ -0,0 +1,44 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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. +*/ + +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +#define TAPPING_TOGGLE 1 +#define TAPPING_TERM 300 +#define ONESHOT_TAP_TOGGLE 2 +#define ONESHOT_LAYER_TOGGLE 2 +#define ONESHOT_TIMEOUT 800 + +#define USE_I2C + +#define MOUSEKEY_INTERVAL 50 +#define MOUSEKEY_DELAY 0 +#define MOUSEKEY_TIME_TO_MAX 60 +#define MOUSEKEY_MAX_SPEED 7 + +#define MOUSEKEY_WHEEL_DELAY 0 +#define MOUSEKEY_WHEEL_MAX_SPEED 8 +#define MOUSEKEY_WHEEL_TIME_TO_MAX 40 + +// #define MASTER_LEFT +// #define MASTER_RIGHT +#define EE_HANDS + + +#define PREVENT_STUCK_MODIFIERS +#define IGNORE_MOD_TAP_INTERRUPT +#define PERMISSIVE_HOLD + +#endif diff --git a/keyboards/handwired/xeal60/keymaps/xk/keymap.c b/keyboards/handwired/xeal60/keymaps/xk/keymap.c new file mode 100644 index 000000000..c032b865a --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/xk/keymap.c @@ -0,0 +1,370 @@ +#include QMK_KEYBOARD_H + + +extern keymap_config_t keymap_config; + +#define _COLEMAK 0 +#define _KAMELOC 1 +#define _IKAPILA 2 +#define _IKASHFT 3 +#define _ARROWKY 4 +#define _FNCTION 5 +#define _NINEKEY 6 +#define _NAVIGAT 7 +#define _QWERTY 8 +#define _MLAYER 9 +#define _GRVTABL 15 + +enum custom_keycodes { + COLEMAK = SAFE_RANGE, + KAMELOC, + IKAPILA, + IKASHFT, + ARROWKY, + FNCTION, + NINEKEY, + NAVIGAT, + QWERTY, + MLAYER, + GRVTABL, +}; + +//TD Declarations +enum { +VOM = 0, +PRN, +EGT, +HRD, +XRD, +DSH, +ESC, +EQE, +PGN, +HND, +COD, +UND, +F11, +F12, +F13, +F14, +F15, +F16, +F17, +F18, +F19, +F20, +//unicode_inputctl +LINUX, +WIN, +WINSH, +OSX, +}; + +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +// action-TAP for key/mod behavior LT(layer, KC) +#define XK_TAB LT(_FNCTION, KC_TAB) +#define XK_BSP LT(_KAMELOC, KC_BSPC) +#define XK_APO LT(_KAMELOC, KC_QUOT) + +#define XK_SPC LT(_IKAPILA, KC_SPC) +#define XK_ENT LT(_IKAPILA, KC_ENT) +#define XK_PGDN LT(_IKASHFT, KC_PGDN) +#define XK_PGUP LT(_IKASHFT, KC_PGUP) +#define PIPBOY LT(_FNCTION, KC_BSLS) +#define XK_DEL LT(_IKASHFT, KC_DEL) +#define XK_GRV LT(_GRVTABL, KC_GRV) + +// mod-TAP for mod/key behavior MT(modkey, KC) +#define ALT_IT MT(MOD_RALT, KC_SCLN) +#define CTL_IT MT(MOD_RCTL, KC_DOT) +#define SFT_ENT MT(MOD_RSFT, KC_ENT) + +//sticky modifiers +#define KYCTL OSM(MOD_LCTL) +#define KYSFT OSM(MOD_LSFT) +#define CAKY OSM(MOD_LCTL | MOD_LALT) + +//shortcuts +#define CADEL LALT(LCTL(KC_DEL)) +#define CAINS LALT(LCTL(KC_INS)) +#define TGNKRO MAGIC_TOGGLE_NKRO + +#define NAVCH LCTL(KC_HOME) +#define NAVCPD LCTL(KC_PGDN) +#define NAVCPU LCTL(KC_PGUP) +#define NAVCE LCTL(KC_END) +#define NAVCU LCTL(KC_UP) +#define NAVCD LCTL(KC_DOWN) +#define NAVCL LCTL(KC_LEFT) +#define NAVCR LCTL(KC_RGHT) +#define NAVGU LGUI(KC_UP) +#define NAVGD LGUI(KC_DOWN) +#define NAVGL LGUI(KC_LEFT) +#define NAVGR LGUI(KC_RGHT) + +#define KC_NDSH LCTL(KC_PMNS) +#define KC_MDSH LALT(LCTL(KC_PMNS)) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* + TAP + ┌────┬────┬────┬────┬────┬────┐ ┌────┬────┬────┬────┬────┬────┐ + │TAB │ Q │ W │ F │ P │ B │ │ J │ L │ U │ Y │ ; │DEL │ + ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ + │BKSP│ A │ R │ S │ T │ G │ │ M │ N │ E │ I │ O │ ' │ + ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ + │OSFT│ X │ C │ D │ V │ Z │ │ K │ H │ , │ │ . │ / │ + ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ + │OCTL│GUI │ESC │ALT │PGUP│SPC │ │ENT │PGDN│ () │ {} │ \ │ ` │ + └────┴────┴────┴────┴────┴────┘ └────┴────┴────┴────┴────┴────┘ + HOLD + ┌────┬────┬────┬────┬────┬────┐ ┌────┬────┬────┬────┬────┬────┐ + │L FN│ │ │ │ │ │ │ │ │ │ │ALT │L!@#│ + ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ + │L OH│ │ │ │ │ │ │ │ │ │ │ │L OH│ + ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ + │SFT │ │ │ │ │ │ │ │ │ │ │CTL │SFT │ + ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ + │CTL │GUI │ESC │ALT │L!@#│L123│ │L123│L!@#│L M│ │L FN│LGRV│ + └────┴────┴────┴────┴────┴────┘ └────┴────┴────┴────┴────┴────┘ + DOUBLETAP + ┌────┬────┬────┬────┬────┬────┐ ┌────┬────┬────┬────┬────┬────┐ + │ │ │ │ │ │ │ │ │ │ │ │ │ │ + ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ + │ │ │ │ │ │ │ │ │ │ │ │ │ │ + ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ + │OSML│ │ │ │ │ │ │ │ │ │ │ │ │ + ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ + │OSML│OSML│!F4 │ │ │ │ │ │ │ │ │ │ │ + └────┴────┴────┴────┴────┴────┘ └────┴────┴────┴────┴────┴────┘ + Switch type + ┌────┬────┬────┬────┬────┬────┐ ┌────┬────┬────┬────┬────┬────┐ + │Br │mxC │Z │Z │Z │Z │ │Z │Z │Z │Z │Br │G │ + ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ + │G │Z │Z │Z │Z │Z │ │Z │Z │Z │Z │Z │Z │ + ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ + │Y │Z │Z │Z │Z │Z │ │Z │Z │Z │B │B │Y │ + ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ + │Y │Y │mxC │Z │BLK │BLK │ │BLK │BLK │Z │Z │B │G │ + └────┴────┴────┴────┴────┴────┘ └────┴────┴────┴────┴────┴────┘ + with DCS keycaps + Top Row R1 (reversed?) + M Row1 R3 (with reversed pointer finger) + M Row2 R4 + B Row R2 (reversed) +*/ + +// Colemak PB&J (Mod-DH) +[_COLEMAK] = LAYOUT( \ + XK_TAB, KC_Q, KC_W, KC_F, KC_P, KC_B, KC_J, KC_L, KC_U, KC_Y, ALT_IT, XK_DEL, \ + XK_BSP, KC_A, KC_R, KC_S, KC_T, KC_G, KC_M, KC_N, KC_E, KC_I, KC_O, XK_APO, \ + KYSFT, KC_X, KC_C, KC_D, KC_V, KC_Z, KC_K, KC_H, TD(COD), KC_DOT, CTL_IT, SFT_T(KC_SLSH), \ + KYCTL, KC_LGUI, TD(ESC), KC_LALT, XK_PGUP, XK_SPC, XK_ENT, XK_PGDN, MO(_MLAYER), TT(_NAVIGAT), PIPBOY, XK_GRV \ +), + +// useful for one-handed typing +[_KAMELOC] = LAYOUT( \ + XK_DEL, KC_SCLN, KC_Y, KC_U, KC_L, KC_J, KC_B, KC_P, KC_F, KC_W, KC_Q, XK_TAB, \ + _______, KC_O, KC_I, KC_E, KC_N, KC_M, KC_G, KC_T, KC_S, KC_R, KC_A, _______, \ + KYSFT, KC_SLSH, KC_DOT, KC_COMM, KC_H, KC_K, TD(UND), KC_V, KC_D, KC_C, KC_X, KYSFT, \ + XK_GRV, PIPBOY, M(1), KC_BTN1, KC_HOME, KC_ENT, KC_ENT, KC_END, KC_LGUI, TD(ESC), KC_LALT, KYCTL \ +), + +/* + ┌────┬────┬────┬────┬────┬────┐ ┌────┬────┬────┬────┬────┬────┐ + │ │ 1 │ 2 │ 3 │ 4 │ 5 │ │ 6 │ 7 │ 8 │ 9 │ 0 │ │ + ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ + │ │ M │ V- │ V+ │NEXT│PLAY│ │ ← │ ↓ │ ↑ │ → │DASH│INS │ + ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ + │ │ - │ = │TGL │ │ │ │HOME│END │HOME│ │ \ │ ~ │ + ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ + │ │ │ │ │ │ │ │ │ │ │ │ │ │ + └────┴────┴────┴────┴────┴────┘ └────┴────┴────┴────┴────┴────┘ +*/ +[_IKAPILA] = LAYOUT( \ + _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, \ + _______, KC_MUTE, KC_VOLD, KC_VOLU, KC_MNXT, KC_MPLY, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, TD(DSH), KC_INS, \ + _______, KC_MINS, KC_EQL, XXXXXXX, XXXXXXX, LCTL(KC_Z), KC_HOME, TD(HND), KC_HOME, XXXXXXX, KC_BSLS, KC_TILD, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ +), + +/* + ┌────┬────┬────┬────┬────┬────┐ ┌────┬────┬────┬────┬────┬────┐ + │ │ ! │ @ │ # │ $ │ % │ │ ^ │ & │ * │ ( │ ) │BSPC│ + ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ + │DEL │ │ ← │ ↓ │ ↑ │ → │ │NEXT│PGUP│ V+ │ V- │DASH│PSCR│ + ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ + │ │ _ │ + │END │HOME│END │ │ │ │ │ [ │ ] │ │ + ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ + │ │ │ │ │ │ │ │ │ │ │ │ │ │ + └────┴────┴────┴────┴────┴────┘ └────┴────┴────┴────┴────┴────┘ +*/ + +[_IKASHFT] = LAYOUT( \ + _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \ + KC_DEL, TD(PGN), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_MNXT, KC_PGUP, KC_VOLU, TD(VOM), KC_MDSH, KC_PSCR, \ + _______, KC_UNDS, KC_PLUS, KC_END, KC_HOME, KC_END, M(1), M(0), M(2), KC_LBRC, KC_RBRC, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ +), + +/* + ┌────┬────┬────┬────┬────┬────┐ ┌────┬────┬────┬────┬────┬────┐ + │ │ → │ ↑ │ ← │ ↓ │ → │ │ → │ ↓ │ ← │ ↑ │ ↑ │ │ just in case someone hacks my IP with a 10MeG pipe, you know? + ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ + │ │ ← │ ↓ │ → │ ↑ │ ← │ │ ↑ │ ← │ ↓ │ → │ ← │ │ hacker_evasion layer + ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ >>init network SEQUENCE + │ │ ↑ │ ← │ ↓ │ → │ ↑ │ │ ↓ │ ← │ ↑ │ → │ ← │ │ sleep 11; echo "DONE\n" + ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ throttle INPUT 11001001 OUTPUT 010011001 ? FULL )); \ + │ │ │ │ → │ ← │ ↓ │ │ → │ ↑ │ ← │ ↓ │ ↑ │ │ <event.pressed) { + switch(id) { + case 0: + return MACRO( D(LSFT), T(9), U(LSFT), D(LSFT), T(0), U(LSFT), T(LEFT), END ); + case 1: + return MACRO( D(LSFT), T(LBRC), U(LSFT), D(LSFT), T(RBRC), U(LSFT), T(LEFT), END ); + case 2: + return MACRO( T(LBRC), T(RBRC), T(LEFT), END); + case 3: + clear_keyboard(); + case 4: + return MACRO( D(LSFT), T(SCOLON), U(LSFT), D(LSFT), T(9), U(LSFT), D(LSFT), T(0), U(LSFT), D(LSFT), T(LBRACKET), U(LSFT), D(LSFT), T(9), U(LSFT), D(LSFT), T(SCOLON), U(LSFT), D(LSFT), T(0), U(LSFT), D(LSFT), T(BSLASH), U(LSFT), D(LSFT), T(SCOLON), U(LSFT), D(LSFT), T(7), U(LSFT), D(LSFT), T(RBRACKET), U(LSFT), T(SCOLON), D(LSFT), T(SCOLON), U(LSFT), END ); + case WINSH: + set_unicode_input_mode(UC_WIN); + return false; + break; + case WIN: + set_unicode_input_mode(UC_WINC); + return false; + break; + case OSX: + set_unicode_input_mode(UC_OSX); + return false; + break; + } + } + return MACRO_NONE; +}; diff --git a/keyboards/handwired/xeal60/keymaps/xk/rules.mk b/keyboards/handwired/xeal60/keymaps/xk/rules.mk new file mode 100644 index 000000000..84bf8e1f5 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/xk/rules.mk @@ -0,0 +1,19 @@ +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +USE_I2C = yes +TAP_DANCE_ENABLE = yes + +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = yes # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/handwired/xeal60/keymaps/zer09/config.h b/keyboards/handwired/xeal60/keymaps/zer09/config.h new file mode 100644 index 000000000..73438d8a9 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/zer09/config.h @@ -0,0 +1,59 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* key matrix size */ +/* Rows are doubled-up */ +#undef MATRIX_ROWS +#undef MATRIX_COLS +#define MATRIX_ROWS 10 +#define MATRIX_COLS 5 + +#undef MATRIX_ROW_PINS +#undef MATRIX_COL_PINS +#define MATRIX_ROW_PINS { C6, D7, E6, B4, B5 } +#define MATRIX_COL_PINS { F7, B1, B3, B2, B6 } + +#define CATERINA_BOOTLOADER +#define USB_MAX_POWER_CONSUMPTION 50 + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +/* #define MASTER_LEFT */ +// #define MASTER_RIGHT +#define EE_HANDS + +/* ws2812 RGB LED */ +#undef RGBLED_NUM +#define RGB_DI_PIN D3 +#define RGBLIGHT_TIMER +#define RGBLED_NUM 50 +#define ws2812_PORTREG PORTD +#define ws2812_DDRREG DDRD +#endif diff --git a/keyboards/handwired/xeal60/keymaps/zer09/keymap.c b/keyboards/handwired/xeal60/keymaps/zer09/keymap.c new file mode 100644 index 000000000..8d0eaf141 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/zer09/keymap.c @@ -0,0 +1,38 @@ +#include "keymap.h" + +extern keymap_config_t keymap_config; + +#define _baseLayer LAYOUT( \ + KC_QUOTE, KC_COMMA, KC_DOT, KC_P, KC_Y, /**/KC_F, KC_G, KC_C, KC_R, KC_L, \ + CTL_T(KC_A), SFT_T(KC_O), ALT_T(KC_E), KC_U, KC_I, /**/KC_D, KC_H, ALT_T(KC_T), SFT_T(KC_N), CTL_T(KC_S), \ + KC_SCOLON, KC_Q, KC_J, KC_K, KC_X, /**/KC_B, KC_M, KC_W, KC_V, KC_Z, \ + TD(DA_UPLY), MO(_VL), KC_TAB, KC_BSPACE, KC_ESC, /**/KC_INS, KC_HOME, KC_PGUP, MO(_VL), TD(DA_UPLY), \ + TD(DA_DWLY), TD(DA_LCTL), KC_SPC, TD(DA_LSPR), LSFT_T(KC_CAPS),/**/SFT_T(KC_CAPS), TD(DA_RALT), KC_ENT, TD(DA_RCTL), TD(DA_DWLY)) + +#define _upLayer LAYOUT( \ + KC_4, KC_5, KC_6, _______, _______,/**/ _______, KC_RBRC, _______, _______, _______, \ + LCTL_T(KC_1), LSFT_T(KC_2), LALT_T(KC_3), _______, _______,/**/ KC_LBRC, KC_BSLS, _______, _______, _______, \ + KC_7, KC_8, KC_9, KC_0, KC_GRV, /**/ KC_SLSH, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______,/**/ KC_DEL, KC_END, KC_PGDN, _______, _______, \ + _______, _______, _______, _______, _______,/**/ _______, _______, _______, _______, _______) + +#define _downLayer LAYOUT( \ + KC_F4, KC_F5, KC_F6, KC_F12, _______,/**/ _______, KC_RPRN, _______, _______, _______, \ + LCTL_T(KC_F1), LSFT_T(KC_F2), LALT_T(KC_F3), KC_F11, _______,/**/ KC_LPRN, KC_EQUAL, KC_LEFT, KC_UP, KC_RIGHT, \ + KC_F7, KC_F8, KC_F9, KC_F10, _______,/**/ KC_MINUS, _______, _______, KC_DOWN, _______, \ + _______, _______, _______, _______, _______,/**/ KC_PSCR, KC_SLCK, KC_PAUSE, _______, _______, \ + _______, _______, _______, _______, _______,/**/ _______, _______, _______, _______, _______) + +#define _astdLayer LAYOUT( \ + KC_MPRV, KC_MUTE, _______, _______, _______,/**/KC_PSCR, KC_SLCK, KC_PAUSE, _______, KC_RGUP, \ + KC_MPLY, KC_VOLD, _______, _______, _______,/**/_______, _______, _______, _______, KC_RGDWN, \ + KC_MNXT, KC_VOLU, RESET, _______, _______,/**/_______, _______, RESET, _______, _______, \ + _______, _______, _______, _______, _______,/**/_______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______,/**/_______, _______, _______, _______, _______) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BL] = _baseLayer, + [_UL] = _upLayer, + [_DL] = _downLayer, + [_VL] = _upLayer, + [_AL] = _astdLayer}; diff --git a/keyboards/handwired/xeal60/keymaps/zer09/keymap.h b/keyboards/handwired/xeal60/keymaps/zer09/keymap.h new file mode 100644 index 000000000..03f8f480a --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/zer09/keymap.h @@ -0,0 +1,32 @@ +#include "lets_split.h" +#include "action_layer.h" +#include "eeconfig.h" +#include "tap_dance.h" +#include "zer09.h" + +#ifdef LAYOUT_ortho_4x12 +#undef LAYOUT_ortho_4x12 +#endif + +#ifdef LAYOUT +#undef LAYOUT +#define LAYOUT( \ + L00, L01, L02, L03, L04, R00, R01, R02, R03, R04, \ + L10, L11, L12, L13, L14, R10, R11, R12, R13, R14, \ + L20, L21, L22, L23, L24, R20, R21, R22, R23, R24, \ + L30, L31, L32, L33, L34, R30, R31, R32, R33, R34, \ + L40, L41, L42, L43, L44, R40, R41, R42, R43, R44 \ +) \ + { \ + { L00, L01, L02, L03, L04 }, \ + { L10, L11, L12, L13, L14 }, \ + { L20, L21, L22, L23, L24 }, \ + { L30, L31, L32, L33, L34 }, \ + { L40, L41, L42, L43, L44 }, \ + { R00, R01, R02, R03, R04 }, \ + { R10, R11, R12, R13, R14 }, \ + { R20, R21, R22, R23, R24 }, \ + { R30, R31, R32, R33, R34 }, \ + { R40, R41, R42, R43, R44 } \ + } +#endif diff --git a/keyboards/handwired/xeal60/keymaps/zer09/rules.mk b/keyboards/handwired/xeal60/keymaps/zer09/rules.mk new file mode 100644 index 000000000..d8adc7088 --- /dev/null +++ b/keyboards/handwired/xeal60/keymaps/zer09/rules.mk @@ -0,0 +1,6 @@ +RGBLIGHT_ENABLE = yes +TAP_DANCE_ENABLE = yes + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/handwired/xeal60/lets_split.c b/keyboards/handwired/xeal60/lets_split.c new file mode 100644 index 000000000..c400ab7bb --- /dev/null +++ b/keyboards/handwired/xeal60/lets_split.c @@ -0,0 +1,16 @@ +#include "lets_split.h" + +#ifdef SWAP_HANDS_ENABLE +__attribute__ ((weak)) +const keypos_t hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = { + + {{0, 4}, {1, 4}, {2, 4}, {3, 4}, {4, 4}, {5, 4}}, + {{0, 5}, {1, 5}, {2, 5}, {3, 5}, {4, 5}, {5, 5}}, + {{0, 6}, {1, 6}, {2, 6}, {3, 6}, {4, 6}, {5, 6}}, + {{0, 7}, {1, 7}, {2, 7}, {3, 7}, {4, 7}, {5, 7}}, + {{0, 0}, {1, 0}, {2, 0}, {3, 0}, {4, 0}, {5, 0}}, + {{0, 1}, {1, 1}, {2, 1}, {3, 1}, {4, 1}, {5, 1}}, + {{0, 2}, {1, 2}, {2, 2}, {3, 2}, {4, 2}, {5, 2}}, + {{0, 3}, {1, 3}, {2, 3}, {3, 3}, {4, 3}, {5, 3}}, +}; +#endif diff --git a/keyboards/handwired/xeal60/lets_split.h b/keyboards/handwired/xeal60/lets_split.h new file mode 100644 index 000000000..bce0ecb19 --- /dev/null +++ b/keyboards/handwired/xeal60/lets_split.h @@ -0,0 +1,31 @@ +#ifndef LETS_SPLIT_H +#define LETS_SPLIT_H + +#include "quantum.h" + +#ifdef KEYBOARD_lets_split_rev1 + #include "rev1.h" +#elif KEYBOARD_lets_split_rev2 + #include "rev2.h" +#elif KEYBOARD_lets_split_sockets + #include "sockets.h" +#endif + + +// Used to create a keymap using only KC_ prefixed keys +#define LAYOUT_kc( \ + L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \ + L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \ + L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \ + L30, L31, L32, L33, L34, L35, R30, R31, R32, R33, R34, R35 \ + ) \ + LAYOUT( \ + KC_##L00, KC_##L01, KC_##L02, KC_##L03, KC_##L04, KC_##L05, KC_##R00, KC_##R01, KC_##R02, KC_##R03, KC_##R04, KC_##R05, \ + KC_##L10, KC_##L11, KC_##L12, KC_##L13, KC_##L14, KC_##L15, KC_##R10, KC_##R11, KC_##R12, KC_##R13, KC_##R14, KC_##R15, \ + KC_##L20, KC_##L21, KC_##L22, KC_##L23, KC_##L24, KC_##L25, KC_##R20, KC_##R21, KC_##R22, KC_##R23, KC_##R24, KC_##R25, \ + KC_##L30, KC_##L31, KC_##L32, KC_##L33, KC_##L34, KC_##L35, KC_##R30, KC_##R31, KC_##R32, KC_##R33, KC_##R34, KC_##R35 \ + ) + +#define LAYOUT_kc_ortho_4x12 LAYOUT_kc + +#endif diff --git a/keyboards/handwired/xeal60/matrix.c b/keyboards/handwired/xeal60/matrix.c new file mode 100644 index 000000000..f753d234a --- /dev/null +++ b/keyboards/handwired/xeal60/matrix.c @@ -0,0 +1,470 @@ +/* +Copyright 2012 Jun Wako + +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 . +*/ + +/* + * scan matrix + */ +#include +#include +#include +#include "wait.h" +#include "print.h" +#include "debug.h" +#include "util.h" +#include "matrix.h" +#include "split_util.h" +#include "pro_micro.h" +#include "config.h" +#include "timer.h" + +#ifdef USE_I2C +# include "i2c.h" +#else // USE_SERIAL +# include "serial.h" +#endif + +#ifndef DEBOUNCING_DELAY +# define DEBOUNCING_DELAY 5 +#endif + +#if (DEBOUNCING_DELAY > 0) + static uint16_t debouncing_time; + static bool debouncing = false; +#endif + +#if (MATRIX_COLS <= 8) +# define print_matrix_header() print("\nr/c 01234567\n") +# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row)) +# define matrix_bitpop(i) bitpop(matrix[i]) +# define ROW_SHIFTER ((uint8_t)1) +#else +# error "Currently only supports 8 COLS" +#endif +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; + +#define ERROR_DISCONNECT_COUNT 5 + +#define ROWS_PER_HAND (MATRIX_ROWS/2) + +static uint8_t error_count = 0; + +static const uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; +static const uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; + +/* matrix state(1:on, 0:off) */ +static matrix_row_t matrix[MATRIX_ROWS]; +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; + +#if (DIODE_DIRECTION == COL2ROW) + static void init_cols(void); + static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row); + static void unselect_rows(void); + static void select_row(uint8_t row); + static void unselect_row(uint8_t row); +#elif (DIODE_DIRECTION == ROW2COL) + static void init_rows(void); + static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col); + static void unselect_cols(void); + static void unselect_col(uint8_t col); + static void select_col(uint8_t col); +#endif + +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + +__attribute__ ((weak)) +void matrix_slave_scan_user(void) { +} + +inline +uint8_t matrix_rows(void) +{ + return MATRIX_ROWS; +} + +inline +uint8_t matrix_cols(void) +{ + return MATRIX_COLS; +} + +void matrix_init(void) +{ +#ifdef DISABLE_JTAG + // JTAG disable for PORT F. write JTD bit twice within four cycles. + MCUCR |= (1< 0) + bool matrix_changed = read_cols_on_row(matrix_debouncing+offset, current_row); + + if (matrix_changed) { + debouncing = true; + debouncing_time = timer_read(); + } + +# else + read_cols_on_row(matrix+offset, current_row); +# endif + + } + +#elif (DIODE_DIRECTION == ROW2COL) + // Set col, read rows + for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) { +# if (DEBOUNCING_DELAY > 0) + bool matrix_changed = read_rows_on_col(matrix_debouncing+offset, current_col); + if (matrix_changed) { + debouncing = true; + debouncing_time = timer_read(); + } +# else + read_rows_on_col(matrix+offset, current_col); +# endif + + } +#endif + +# if (DEBOUNCING_DELAY > 0) + if (debouncing && (timer_elapsed(debouncing_time) > DEBOUNCING_DELAY)) { + for (uint8_t i = 0; i < ROWS_PER_HAND; i++) { + matrix[i+offset] = matrix_debouncing[i+offset]; + } + debouncing = false; + } +# endif + + return 1; +} + +#ifdef USE_I2C + +// Get rows from other half over i2c +int i2c_transaction(void) { + int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; + + int err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_WRITE); + if (err) goto i2c_error; + + // start of matrix stored at 0x00 + err = i2c_master_write(0x00); + if (err) goto i2c_error; + + // Start read + err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_READ); + if (err) goto i2c_error; + + if (!err) { + int i; + for (i = 0; i < ROWS_PER_HAND-1; ++i) { + matrix[slaveOffset+i] = i2c_master_read(I2C_ACK); + } + matrix[slaveOffset+i] = i2c_master_read(I2C_NACK); + i2c_master_stop(); + } else { +i2c_error: // the cable is disconnceted, or something else went wrong + i2c_reset_state(); + return err; + } + + return 0; +} + +#else // USE_SERIAL + +int serial_transaction(void) { + int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; + + if (serial_update_buffers()) { + return 1; + } + + for (int i = 0; i < ROWS_PER_HAND; ++i) { + matrix[slaveOffset+i] = serial_slave_buffer[i]; + } + return 0; +} +#endif + +uint8_t matrix_scan(void) +{ + uint8_t ret = _matrix_scan(); + +#ifdef USE_I2C + if( i2c_transaction() ) { +#else // USE_SERIAL + if( serial_transaction() ) { +#endif + // turn on the indicator led when halves are disconnected + TXLED1; + + error_count++; + + if (error_count > ERROR_DISCONNECT_COUNT) { + // reset other half if disconnected + int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; + for (int i = 0; i < ROWS_PER_HAND; ++i) { + matrix[slaveOffset+i] = 0; + } + } + } else { + // turn off the indicator led on no error + TXLED0; + error_count = 0; + } + matrix_scan_quantum(); + return ret; +} + +void matrix_slave_scan(void) { + _matrix_scan(); + + int offset = (isLeftHand) ? 0 : ROWS_PER_HAND; + +#ifdef USE_I2C + for (int i = 0; i < ROWS_PER_HAND; ++i) { + i2c_slave_buffer[i] = matrix[offset+i]; + } +#else // USE_SERIAL + for (int i = 0; i < ROWS_PER_HAND; ++i) { + serial_slave_buffer[i] = matrix[offset+i]; + } +#endif + matrix_slave_scan_user(); +} + +bool matrix_is_modified(void) +{ + if (debouncing) return false; + return true; +} + +inline +bool matrix_is_on(uint8_t row, uint8_t col) +{ + return (matrix[row] & ((matrix_row_t)1<> 4) + 1) &= ~_BV(pin & 0xF); // IN + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + } +} + +static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) +{ + // Store last value of row prior to reading + matrix_row_t last_row_value = current_matrix[current_row]; + + // Clear data in matrix row + current_matrix[current_row] = 0; + + // Select row and wait for row selecton to stabilize + select_row(current_row); + wait_us(30); + + // For each col... + for(uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) { + + // Select the col pin to read (active low) + uint8_t pin = col_pins[col_index]; + uint8_t pin_state = (_SFR_IO8(pin >> 4) & _BV(pin & 0xF)); + + // Populate the matrix row with the state of the col pin + current_matrix[current_row] |= pin_state ? 0 : (ROW_SHIFTER << col_index); + } + + // Unselect row + unselect_row(current_row); + + return (last_row_value != current_matrix[current_row]); +} + +static void select_row(uint8_t row) +{ + uint8_t pin = row_pins[row]; + _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT + _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW +} + +static void unselect_row(uint8_t row) +{ + uint8_t pin = row_pins[row]; + _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI +} + +static void unselect_rows(void) +{ + for(uint8_t x = 0; x < ROWS_PER_HAND; x++) { + uint8_t pin = row_pins[x]; + _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + } +} + +#elif (DIODE_DIRECTION == ROW2COL) + +static void init_rows(void) +{ + for(uint8_t x = 0; x < ROWS_PER_HAND; x++) { + uint8_t pin = row_pins[x]; + _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + } +} + +static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) +{ + bool matrix_changed = false; + + // Select col and wait for col selecton to stabilize + select_col(current_col); + wait_us(30); + + // For each row... + for(uint8_t row_index = 0; row_index < ROWS_PER_HAND; row_index++) + { + + // Store last value of row prior to reading + matrix_row_t last_row_value = current_matrix[row_index]; + + // Check row pin state + if ((_SFR_IO8(row_pins[row_index] >> 4) & _BV(row_pins[row_index] & 0xF)) == 0) + { + // Pin LO, set col bit + current_matrix[row_index] |= (ROW_SHIFTER << current_col); + } + else + { + // Pin HI, clear col bit + current_matrix[row_index] &= ~(ROW_SHIFTER << current_col); + } + + // Determine if the matrix changed state + if ((last_row_value != current_matrix[row_index]) && !(matrix_changed)) + { + matrix_changed = true; + } + } + + // Unselect col + unselect_col(current_col); + + return matrix_changed; +} + +static void select_col(uint8_t col) +{ + uint8_t pin = col_pins[col]; + _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT + _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW +} + +static void unselect_col(uint8_t col) +{ + uint8_t pin = col_pins[col]; + _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI +} + +static void unselect_cols(void) +{ + for(uint8_t x = 0; x < MATRIX_COLS; x++) { + uint8_t pin = col_pins[x]; + _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + } +} + +#endif diff --git a/keyboards/handwired/xeal60/readme.md b/keyboards/handwired/xeal60/readme.md new file mode 100644 index 000000000..80fe08b93 --- /dev/null +++ b/keyboards/handwired/xeal60/readme.md @@ -0,0 +1,187 @@ +Let's Split +====== + +This readme and most of the code are from https://github.com/ahtn/tmk_keyboard/ + +Split keyboard firmware for Arduino Pro Micro or other ATmega32u4 +based boards. + +**Hardware files for the Let's Split are now stored at http://qmk.fm/lets_split/** +**Hardware files for the sockets version can be found at https://github.com/dumle29/let-s-Split-v2/tree/socket-reverseable** + +## Build Guide + +A build guide for putting together the Let's Split v2 can be found here: [An Overly Verbose Guide to Building a Let's Split Keyboard](https://github.com/nicinabox/lets-split-guide) + +There is additional information there about flashing and adding RGB underglow. + +A build guide for putting together the sockets version can be found here: *Guide will be made and linked here when the PCBs have been received and tested* + +## First Time Setup + +Download or clone the `qmk_firmware` repo and navigate to its top level directory. Once your build environment is setup, you'll be able to generate the default .hex using: + +``` +$ make lets_split/rev2:default +``` + +You will see a lot of output and if everything worked correctly you will see the built hex file: + +``` +lets_split_rev2_default.hex +``` + +If you would like to use one of the alternative keymaps, or create your own, copy one of the existing [keymaps](keymaps/) and run make like so: + + +``` +$ make lets_split/rev2:YOUR_KEYMAP_NAME +``` + +If everything worked correctly you will see a file: + +``` +lets_split_rev2_YOUR_KEYMAP_NAME.hex +``` + +For more information on customizing keymaps, take a look at the primary documentation for [Customizing Your Keymap](/docs/faq_keymap.md) in the main readme.md. + +### Let's split 1.0 +If you have a first generation Let's Split you will need to use the revision 1 code. To do so, use `rev1` in all your commands instead. + +Features +-------- + +For the full Quantum Mechanical Keyboard feature list, see [the parent readme.md](/readme.md). + +Some features supported by the firmware: + +* Either half can connect to the computer via USB, or both halves can be used + independently. +* You only need 3 wires to connect the two halves. Two for VCC and GND and one + for serial communication. +* Optional support for I2C connection between the two halves if for some + reason you require a faster connection between the two halves. Note this + requires an extra wire between halves and pull-up resistors on the data lines. + +Required Hardware +----------------- + +Apart from diodes and key switches for the keyboard matrix in each half, you +will need: + +* 2 Arduino Pro Micros. You can find these on AliExpress for ≈3.50USD each. +* 2 TRRS sockets and 1 TRRS cable, or 2 TRS sockets and 1 TRS cable + +Alternatively, you can use any sort of cable and socket that has at least 3 +wires. If you want to use I2C to communicate between halves, you will need a +cable with at least 4 wires and 2x 4.7kΩ pull-up resistors + +Optional Hardware +----------------- + +A speaker can be hooked-up to either side to the `5` (`C6`) pin and `GND`, and turned on via `AUDIO_ENABLE`. + +Wiring +------ + +The 3 wires of the TRS/TRRS cable need to connect GND, VCC, and digital pin 3 (i.e. +PD0 on the ATmega32u4) between the two Pro Micros. + +Next, wire your key matrix to any of the remaining 17 IO pins of the pro micro +and modify the `matrix.c` accordingly. + +The wiring for serial: + +![serial wiring](https://i.imgur.com/C3D1GAQ.png) + +The wiring for i2c: + +![i2c wiring](https://i.imgur.com/Hbzhc6E.png) + +The pull-up resistors may be placed on either half. It is also possible +to use 4 resistors and have the pull-ups in both halves, but this is +unnecessary in simple use cases. + +You can change your configuration between serial and i2c by modifying your `config.h` file. + +Notes on Software Configuration +------------------------------- + +Configuring the firmware is similar to any other QMK project. One thing +to note is that `MATRIX_ROWS` in `config.h` is the total number of rows between +the two halves, i.e. if your split keyboard has 4 rows in each half, then use +`MATRIX_ROWS=8`. + +Also, the current implementation assumes a maximum of 8 columns, but it would +not be very difficult to adapt it to support more if required. + +Flashing +------- +From the top level `qmk_firmware` directory run `make KEYBOARD:KEYMAP:avrdude` for automatic serial port resolution and flashing. +Example: `make lets_split/rev2:default:avrdude` + + +Choosing which board to plug the USB cable into (choosing Master) +-------- +Because the two boards are identical, the firmware has logic to differentiate the left and right board. + +It uses two strategies to figure things out: looking at the EEPROM (memory on the chip) or looking if the current board has the usb cable. + +The EEPROM approach requires additional setup (flashing the eeprom) but allows you to swap the usb cable to either side. + +The USB cable approach is easier to setup and if you just want the usb cable on the left board, you do not need to do anything extra. + +### Setting the left hand as master +If you always plug the usb cable into the left board, nothing extra is needed as this is the default. Comment out `EE_HANDS` and comment out `I2C_MASTER_RIGHT` or `MASTER_RIGHT` if for some reason it was set. + +### Setting the right hand as master +If you always plug the usb cable into the right board, add an extra flag to your `config.h` +``` + #define MASTER_RIGHT +``` + +### Setting EE_hands to use either hands as master +If you define `EE_HANDS` in your `config.h`, you will need to set the +EEPROM for the left and right halves. + +The EEPROM is used to store whether the +half is left handed or right handed. This makes it so that the same firmware +file will run on both hands instead of having to flash left and right handed +versions of the firmware to each half. To flash the EEPROM file for the left +half run: +``` +avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:eeprom-lefthand.eep +// or the equivalent in dfu-programmer + +``` +and similarly for right half +``` +avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:eeprom-righhand.eep +// or the equivalent in dfu-programmer +``` + +NOTE: replace `$(COM_PORT)` with the port of your device (e.g. `/dev/ttyACM0`) + +After you have flashed the EEPROM, you then need to set `EE_HANDS` in your config.h, rebuild the hex files and reflash. + +Note that you need to program both halves, but you have the option of using +different keymaps for each half. You could program the left half with a QWERTY +layout and the right half with a Colemak layout using bootmagic's default layout option. +Then if you connect the left half to a computer by USB the keyboard will use QWERTY and Colemak when the +right half is connected. + + +Notes on Using Pro Micro 3.3V +----------------------------- + +Do update the `F_CPU` parameter in `rules.mk` to `8000000` which reflects +the frequency on the 3.3V board. + +Also, if the slave board is producing weird characters in certain columns, +update the following line in `matrix.c` to the following: + +``` +// _delay_us(30); // without this wait read unstable value. +_delay_us(300); // without this wait read unstable value. +``` diff --git a/keyboards/handwired/xeal60/rev1/config.h b/keyboards/handwired/xeal60/rev1/config.h new file mode 100644 index 000000000..73f90e715 --- /dev/null +++ b/keyboards/handwired/xeal60/rev1/config.h @@ -0,0 +1,86 @@ +/* +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#ifndef REV1_CONFIG_H +#define REV1_CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x3060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Wootpatoot +#define PRODUCT Lets Split v1 +#define DESCRIPTION A split keyboard for the cheap makers + +/* key matrix size */ +// Rows are doubled-up +#define MATRIX_ROWS 8 +#define MATRIX_COLS 6 + +// wiring of each half +#define MATRIX_ROW_PINS { B5, B4, E6, D7 } +#define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3 } +// #define MATRIX_COL_PINS { B3, B1, F7, F6, F5, F4 } //uncomment this line and comment line above if you need to reverse left-to-right key order + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ +// #define BACKLIGHT_LEVELS 3 + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCING_DELAY 5 + +/* 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 + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* ws2812 RGB LED */ +#define RGB_DI_PIN D3 +#define RGBLIGHT_TIMER +#define RGBLED_NUM 16 // Number of LEDs +#define ws2812_PORTREG PORTD +#define ws2812_DDRREG DDRD + +/* + * 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 + +#endif diff --git a/keyboards/handwired/xeal60/rev1/rev1.c b/keyboards/handwired/xeal60/rev1/rev1.c new file mode 100644 index 000000000..c243f71bc --- /dev/null +++ b/keyboards/handwired/xeal60/rev1/rev1.c @@ -0,0 +1,15 @@ +#include "lets_split.h" + +void matrix_init_kb(void) { + + // // green led on + // DDRD |= (1<<5); + // PORTD &= ~(1<<5); + + // // orange led on + // DDRB |= (1<<0); + // PORTB &= ~(1<<0); + + matrix_init_user(); +}; + diff --git a/keyboards/handwired/xeal60/rev1/rev1.h b/keyboards/handwired/xeal60/rev1/rev1.h new file mode 100644 index 000000000..073d83ef3 --- /dev/null +++ b/keyboards/handwired/xeal60/rev1/rev1.h @@ -0,0 +1,30 @@ +#ifndef REV1_H +#define REV1_H + +#include "lets_split.h" + +//void promicro_bootloader_jmp(bool program); +#include "quantum.h" + +//void promicro_bootloader_jmp(bool program); + +#define LAYOUT( \ + L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \ + L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \ + L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \ + L30, L31, L32, L33, L34, L35, R30, R31, R32, R33, R34, R35 \ + ) \ + { \ + { L00, L01, L02, L03, L04, L05 }, \ + { L10, L11, L12, L13, L14, L15 }, \ + { L20, L21, L22, L23, L24, L25 }, \ + { L30, L31, L32, L33, L34, L35 }, \ + { R00, R01, R02, R03, R04, R05 }, \ + { R10, R11, R12, R13, R14, R15 }, \ + { R20, R21, R22, R23, R24, R25 }, \ + { R30, R31, R32, R33, R34, R35 } \ + } + +#define LAYOUT_ortho_4x12 LAYOUT + +#endif diff --git a/keyboards/handwired/xeal60/rev1/rules.mk b/keyboards/handwired/xeal60/rev1/rules.mk new file mode 100644 index 000000000..f84561674 --- /dev/null +++ b/keyboards/handwired/xeal60/rev1/rules.mk @@ -0,0 +1 @@ +BACKLIGHT_ENABLE = no \ No newline at end of file diff --git a/keyboards/handwired/xeal60/rules.mk b/keyboards/handwired/xeal60/rules.mk new file mode 100644 index 000000000..951723edc --- /dev/null +++ b/keyboards/handwired/xeal60/rules.mk @@ -0,0 +1,77 @@ +SRC += matrix.c \ + i2c.c \ + split_util.c \ + serial.c \ + ssd1306.c + +# MCU name +#MCU = at90usb1287 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Bootloader +# This definition is optional, and if your keyboard supports multiple bootloaders of +# different sizes, comment this out, and the correct address will be loaded +# automatically (+60). See bootloader.mk for all options. +BOOTLOADER = caterina + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SUBPROJECT_rev1 = yes +USE_I2C = yes +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +CUSTOM_MATRIX = yes + +LAYOUTS = ortho_4x12 + +DEFAULT_FOLDER = lets_split/rev2 diff --git a/keyboards/handwired/xeal60/serial.c b/keyboards/handwired/xeal60/serial.c new file mode 100644 index 000000000..74bcbb6bf --- /dev/null +++ b/keyboards/handwired/xeal60/serial.c @@ -0,0 +1,228 @@ +/* + * WARNING: be careful changing this code, it is very timing dependent + */ + +#ifndef F_CPU +#define F_CPU 16000000 +#endif + +#include +#include +#include +#include +#include "serial.h" + +#ifndef USE_I2C + +// Serial pulse period in microseconds. Its probably a bad idea to lower this +// value. +#define SERIAL_DELAY 24 + +uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; +uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0}; + +#define SLAVE_DATA_CORRUPT (1<<0) +volatile uint8_t status = 0; + +inline static +void serial_delay(void) { + _delay_us(SERIAL_DELAY); +} + +inline static +void serial_output(void) { + SERIAL_PIN_DDR |= SERIAL_PIN_MASK; +} + +// make the serial pin an input with pull-up resistor +inline static +void serial_input(void) { + SERIAL_PIN_DDR &= ~SERIAL_PIN_MASK; + SERIAL_PIN_PORT |= SERIAL_PIN_MASK; +} + +inline static +uint8_t serial_read_pin(void) { + return !!(SERIAL_PIN_INPUT & SERIAL_PIN_MASK); +} + +inline static +void serial_low(void) { + SERIAL_PIN_PORT &= ~SERIAL_PIN_MASK; +} + +inline static +void serial_high(void) { + SERIAL_PIN_PORT |= SERIAL_PIN_MASK; +} + +void serial_master_init(void) { + serial_output(); + serial_high(); +} + +void serial_slave_init(void) { + serial_input(); + + // Enable INT0 + EIMSK |= _BV(INT0); + // Trigger on falling edge of INT0 + EICRA &= ~(_BV(ISC00) | _BV(ISC01)); +} + +// Used by the master to synchronize timing with the slave. +static +void sync_recv(void) { + serial_input(); + // This shouldn't hang if the slave disconnects because the + // serial line will float to high if the slave does disconnect. + while (!serial_read_pin()); + serial_delay(); +} + +// Used by the slave to send a synchronization signal to the master. +static +void sync_send(void) { + serial_output(); + + serial_low(); + serial_delay(); + + serial_high(); +} + +// Reads a byte from the serial line +static +uint8_t serial_read_byte(void) { + uint8_t byte = 0; + serial_input(); + for ( uint8_t i = 0; i < 8; ++i) { + byte = (byte << 1) | serial_read_pin(); + serial_delay(); + _delay_us(1); + } + + return byte; +} + +// Sends a byte with MSB ordering +static +void serial_write_byte(uint8_t data) { + uint8_t b = 8; + serial_output(); + while( b-- ) { + if(data & (1 << b)) { + serial_high(); + } else { + serial_low(); + } + serial_delay(); + } +} + +// interrupt handle to be used by the slave device +ISR(SERIAL_PIN_INTERRUPT) { + sync_send(); + + uint8_t checksum = 0; + for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) { + serial_write_byte(serial_slave_buffer[i]); + sync_send(); + checksum += serial_slave_buffer[i]; + } + serial_write_byte(checksum); + sync_send(); + + // wait for the sync to finish sending + serial_delay(); + + // read the middle of pulses + _delay_us(SERIAL_DELAY/2); + + uint8_t checksum_computed = 0; + for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) { + serial_master_buffer[i] = serial_read_byte(); + sync_send(); + checksum_computed += serial_master_buffer[i]; + } + uint8_t checksum_received = serial_read_byte(); + sync_send(); + + serial_input(); // end transaction + + if ( checksum_computed != checksum_received ) { + status |= SLAVE_DATA_CORRUPT; + } else { + status &= ~SLAVE_DATA_CORRUPT; + } +} + +inline +bool serial_slave_DATA_CORRUPT(void) { + return status & SLAVE_DATA_CORRUPT; +} + +// Copies the serial_slave_buffer to the master and sends the +// serial_master_buffer to the slave. +// +// Returns: +// 0 => no error +// 1 => slave did not respond +int serial_update_buffers(void) { + // this code is very time dependent, so we need to disable interrupts + cli(); + + // signal to the slave that we want to start a transaction + serial_output(); + serial_low(); + _delay_us(1); + + // wait for the slaves response + serial_input(); + serial_high(); + _delay_us(SERIAL_DELAY); + + // check if the slave is present + if (serial_read_pin()) { + // slave failed to pull the line low, assume not present + sei(); + return 1; + } + + // if the slave is present syncronize with it + sync_recv(); + + uint8_t checksum_computed = 0; + // receive data from the slave + for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) { + serial_slave_buffer[i] = serial_read_byte(); + sync_recv(); + checksum_computed += serial_slave_buffer[i]; + } + uint8_t checksum_received = serial_read_byte(); + sync_recv(); + + if (checksum_computed != checksum_received) { + sei(); + return 1; + } + + uint8_t checksum = 0; + // send data to the slave + for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) { + serial_write_byte(serial_master_buffer[i]); + sync_recv(); + checksum += serial_master_buffer[i]; + } + serial_write_byte(checksum); + sync_recv(); + + // always, release the line when not in use + serial_output(); + serial_high(); + + sei(); + return 0; +} + +#endif diff --git a/keyboards/handwired/xeal60/serial.h b/keyboards/handwired/xeal60/serial.h new file mode 100644 index 000000000..15fe4db7b --- /dev/null +++ b/keyboards/handwired/xeal60/serial.h @@ -0,0 +1,26 @@ +#ifndef MY_SERIAL_H +#define MY_SERIAL_H + +#include "config.h" +#include + +/* TODO: some defines for interrupt setup */ +#define SERIAL_PIN_DDR DDRD +#define SERIAL_PIN_PORT PORTD +#define SERIAL_PIN_INPUT PIND +#define SERIAL_PIN_MASK _BV(PD0) +#define SERIAL_PIN_INTERRUPT INT0_vect + +#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 +#define SERIAL_MASTER_BUFFER_LENGTH 1 + +// Buffers for master - slave communication +extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH]; +extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH]; + +void serial_master_init(void); +void serial_slave_init(void); +int serial_update_buffers(void); +bool serial_slave_data_corrupt(void); + +#endif diff --git a/keyboards/handwired/xeal60/split_util.c b/keyboards/handwired/xeal60/split_util.c new file mode 100644 index 000000000..346cbc908 --- /dev/null +++ b/keyboards/handwired/xeal60/split_util.c @@ -0,0 +1,86 @@ +#include +#include +#include +#include +#include +#include +#include "split_util.h" +#include "matrix.h" +#include "keyboard.h" +#include "config.h" +#include "timer.h" + +#ifdef USE_I2C +# include "i2c.h" +#else +# include "serial.h" +#endif + +volatile bool isLeftHand = true; + +static void setup_handedness(void) { + #ifdef EE_HANDS + isLeftHand = eeprom_read_byte(EECONFIG_HANDEDNESS); + #else + // I2C_MASTER_RIGHT is deprecated, use MASTER_RIGHT instead, since this works for both serial and i2c + #if defined(I2C_MASTER_RIGHT) || defined(MASTER_RIGHT) + isLeftHand = !has_usb(); + #else + isLeftHand = has_usb(); + #endif + #endif +} + +static void keyboard_master_setup(void) { +#ifdef USE_I2C + i2c_master_init(); +#ifdef SSD1306OLED + matrix_master_OLED_init (); +#endif +#else + serial_master_init(); +#endif +} + +static void keyboard_slave_setup(void) { + timer_init(); +#ifdef USE_I2C + i2c_slave_init(SLAVE_I2C_ADDRESS); +#else + serial_slave_init(); +#endif +} + +bool has_usb(void) { + USBCON |= (1 << OTGPADE); //enables VBUS pad + _delay_us(5); + return (USBSTA & (1< +#include "eeconfig.h" + +#define SLAVE_I2C_ADDRESS 0x32 + +extern volatile bool isLeftHand; + +// slave version of matix scan, defined in matrix.c +void matrix_slave_scan(void); + +void split_keyboard_setup(void); +bool has_usb(void); +void keyboard_slave_loop(void); + +void matrix_master_OLED_init (void); + +#endif From c796944354a76f3bd0a8387b9a4016864550ba91 Mon Sep 17 00:00:00 2001 From: Alex Ong Date: Sun, 12 Aug 2018 18:25:50 +1000 Subject: [PATCH 002/788] Delete removed other keymaps --- .../xeal60/keymaps/DE_simple/config.h | 37 -- .../xeal60/keymaps/DE_simple/keymap.c | 155 ------ .../xeal60/keymaps/DE_simple/readme.md | 59 --- .../xeal60/keymaps/DE_simple/rules.mk | 0 .../xeal60/keymaps/OLED_sample/config.h | 60 --- .../xeal60/keymaps/OLED_sample/keymap.c | 441 ------------------ .../xeal60/keymaps/OLED_sample/readme.md | 25 - .../xeal60/keymaps/OLED_sample/rules.mk | 25 - .../handwired/xeal60/keymaps/adam/config.h | 50 -- .../handwired/xeal60/keymaps/adam/keymap.c | 78 ---- .../xeal60/keymaps/bbaserdem/README.md | 27 -- .../xeal60/keymaps/bbaserdem/config.h | 27 -- .../xeal60/keymaps/bbaserdem/keymap.c | 36 -- .../xeal60/keymaps/bbaserdem/rules.mk | 11 - .../xeal60/keymaps/bbaserdem_right/README.md | 5 - .../xeal60/keymaps/bbaserdem_right/config.h | 9 - .../xeal60/keymaps/bbaserdem_right/keymap.c | 31 -- .../xeal60/keymaps/bbaserdem_right/rules.mk | 26 -- .../xeal60/keymaps/cpeters1982/config.h | 54 --- .../xeal60/keymaps/cpeters1982/keymap.c | 221 --------- .../xeal60/keymaps/cpeters1982/rules.mk | 8 - .../handwired/xeal60/keymaps/dlaroe/config.h | 37 -- .../handwired/xeal60/keymaps/dlaroe/keymap.c | 255 ---------- .../handwired/xeal60/keymaps/dlaroe/rules.mk | 0 .../handwired/xeal60/keymaps/drashna/config.h | 80 ---- .../handwired/xeal60/keymaps/drashna/keymap.c | 98 ---- .../handwired/xeal60/keymaps/drashna/rules.mk | 25 - .../xeal60/keymaps/drashna_old/config.h | 86 ---- .../xeal60/keymaps/drashna_old/keymap.c | 1 - .../xeal60/keymaps/drashna_old/rules.mk | 28 -- .../xeal60/keymaps/dwallace/config.h | 43 -- .../xeal60/keymaps/dwallace/keymap.c | 224 --------- .../xeal60/keymaps/dwallace/rules.mk | 1 - .../handwired/xeal60/keymaps/fabian/config.h | 34 -- .../handwired/xeal60/keymaps/fabian/keymap.c | 271 ----------- .../handwired/xeal60/keymaps/fabian/rules.mk | 9 - .../handwired/xeal60/keymaps/fido/config.h | 45 -- .../handwired/xeal60/keymaps/fido/keymap.c | 74 --- .../handwired/xeal60/keymaps/fido/rules.mk | 1 - .../xeal60/keymaps/heartrobotninja/config.h | 58 --- .../xeal60/keymaps/heartrobotninja/keymap.c | 180 ------- .../xeal60/keymaps/heartrobotninja/rules.mk | 26 -- .../xeal60/keymaps/henxing/Readme.md | 51 -- .../handwired/xeal60/keymaps/henxing/config.h | 37 -- .../handwired/xeal60/keymaps/henxing/keymap.c | 113 ----- .../xeal60/keymaps/hexwire/README.md | 116 ----- .../handwired/xeal60/keymaps/hexwire/config.h | 43 -- .../handwired/xeal60/keymaps/hexwire/keymap.c | 218 --------- .../handwired/xeal60/keymaps/hexwire/rules.mk | 1 - .../handwired/xeal60/keymaps/khord/config.h | 44 -- .../handwired/xeal60/keymaps/khord/keymap.c | 170 ------- .../handwired/xeal60/keymaps/khord/rules.mk | 7 - .../handwired/xeal60/keymaps/kris/keymap.c | 213 --------- .../handwired/xeal60/keymaps/krusli/keymap.c | 238 ---------- .../handwired/xeal60/keymaps/krusli/readme.md | 2 - .../xeal60/keymaps/mbsurfer/config.h | 43 -- .../xeal60/keymaps/mbsurfer/keymap.c | 274 ----------- .../xeal60/keymaps/mbsurfer/rules.mk | 7 - .../handwired/xeal60/keymaps/mike808/config.h | 43 -- .../handwired/xeal60/keymaps/mike808/keymap.c | 158 ------- .../handwired/xeal60/keymaps/mike808/rules.mk | 1 - .../handwired/xeal60/keymaps/mjt/config.h | 38 -- .../handwired/xeal60/keymaps/mjt/keymap.c | 213 --------- .../handwired/xeal60/keymaps/mjt/rules.mk | 25 - .../handwired/xeal60/keymaps/mtdjr/config.h | 43 -- .../handwired/xeal60/keymaps/mtdjr/keymap.c | 55 --- .../handwired/xeal60/keymaps/mtdjr/rules.mk | 5 - .../xeal60/keymaps/normacos/config.h | 37 -- .../xeal60/keymaps/normacos/keymap.c | 213 --------- .../xeal60/keymaps/normacos/readme.md | 86 ---- .../handwired/xeal60/keymaps/piemod/README.md | 31 -- .../handwired/xeal60/keymaps/piemod/config.h | 49 -- .../handwired/xeal60/keymaps/piemod/keymap.c | 99 ---- .../handwired/xeal60/keymaps/piemod/rules.mk | 13 - .../handwired/xeal60/keymaps/pitty/README.md | 91 ---- .../handwired/xeal60/keymaps/pitty/config.h | 26 -- .../handwired/xeal60/keymaps/pitty/keymap.c | 169 ------- .../handwired/xeal60/keymaps/pitty/rules.mk | 6 - .../handwired/xeal60/keymaps/poker/config.h | 37 -- .../handwired/xeal60/keymaps/poker/keymap.c | 240 ---------- .../handwired/xeal60/keymaps/poker/rules.mk | 3 - .../handwired/xeal60/keymaps/smt/config.h | 37 -- .../handwired/xeal60/keymaps/smt/keymap.c | 218 --------- .../handwired/xeal60/keymaps/smt/readme.md | 88 ---- .../xeal60/keymaps/that_canadian/config.h | 32 -- .../xeal60/keymaps/that_canadian/keymap.c | 163 ------- .../handwired/xeal60/keymaps/waples/README.md | 58 --- .../handwired/xeal60/keymaps/waples/config.h | 17 - .../handwired/xeal60/keymaps/waples/keymap.c | 131 ------ .../handwired/xeal60/keymaps/waples/rules.mk | 3 - .../handwired/xeal60/keymaps/xk/config.h | 44 -- .../handwired/xeal60/keymaps/xk/keymap.c | 370 --------------- .../handwired/xeal60/keymaps/xk/rules.mk | 19 - .../handwired/xeal60/keymaps/zer09/config.h | 59 --- .../handwired/xeal60/keymaps/zer09/keymap.c | 38 -- .../handwired/xeal60/keymaps/zer09/keymap.h | 32 -- .../handwired/xeal60/keymaps/zer09/rules.mk | 6 - 97 files changed, 7534 deletions(-) delete mode 100644 keyboards/handwired/xeal60/keymaps/DE_simple/config.h delete mode 100644 keyboards/handwired/xeal60/keymaps/DE_simple/keymap.c delete mode 100644 keyboards/handwired/xeal60/keymaps/DE_simple/readme.md delete mode 100644 keyboards/handwired/xeal60/keymaps/DE_simple/rules.mk delete mode 100644 keyboards/handwired/xeal60/keymaps/OLED_sample/config.h delete mode 100644 keyboards/handwired/xeal60/keymaps/OLED_sample/keymap.c delete mode 100644 keyboards/handwired/xeal60/keymaps/OLED_sample/readme.md delete mode 100644 keyboards/handwired/xeal60/keymaps/OLED_sample/rules.mk delete mode 100644 keyboards/handwired/xeal60/keymaps/adam/config.h delete mode 100644 keyboards/handwired/xeal60/keymaps/adam/keymap.c delete mode 100644 keyboards/handwired/xeal60/keymaps/bbaserdem/README.md delete mode 100644 keyboards/handwired/xeal60/keymaps/bbaserdem/config.h delete mode 100644 keyboards/handwired/xeal60/keymaps/bbaserdem/keymap.c delete mode 100644 keyboards/handwired/xeal60/keymaps/bbaserdem/rules.mk delete mode 100644 keyboards/handwired/xeal60/keymaps/bbaserdem_right/README.md delete mode 100644 keyboards/handwired/xeal60/keymaps/bbaserdem_right/config.h delete mode 100644 keyboards/handwired/xeal60/keymaps/bbaserdem_right/keymap.c delete mode 100644 keyboards/handwired/xeal60/keymaps/bbaserdem_right/rules.mk delete mode 100644 keyboards/handwired/xeal60/keymaps/cpeters1982/config.h delete mode 100644 keyboards/handwired/xeal60/keymaps/cpeters1982/keymap.c delete mode 100644 keyboards/handwired/xeal60/keymaps/cpeters1982/rules.mk delete mode 100644 keyboards/handwired/xeal60/keymaps/dlaroe/config.h delete mode 100644 keyboards/handwired/xeal60/keymaps/dlaroe/keymap.c delete mode 100644 keyboards/handwired/xeal60/keymaps/dlaroe/rules.mk delete mode 100644 keyboards/handwired/xeal60/keymaps/drashna/config.h delete mode 100644 keyboards/handwired/xeal60/keymaps/drashna/keymap.c delete mode 100644 keyboards/handwired/xeal60/keymaps/drashna/rules.mk delete mode 100644 keyboards/handwired/xeal60/keymaps/drashna_old/config.h delete mode 100644 keyboards/handwired/xeal60/keymaps/drashna_old/keymap.c delete mode 100644 keyboards/handwired/xeal60/keymaps/drashna_old/rules.mk delete mode 100644 keyboards/handwired/xeal60/keymaps/dwallace/config.h delete mode 100644 keyboards/handwired/xeal60/keymaps/dwallace/keymap.c delete mode 100644 keyboards/handwired/xeal60/keymaps/dwallace/rules.mk delete mode 100644 keyboards/handwired/xeal60/keymaps/fabian/config.h delete mode 100644 keyboards/handwired/xeal60/keymaps/fabian/keymap.c delete mode 100644 keyboards/handwired/xeal60/keymaps/fabian/rules.mk delete mode 100644 keyboards/handwired/xeal60/keymaps/fido/config.h delete mode 100644 keyboards/handwired/xeal60/keymaps/fido/keymap.c delete mode 100644 keyboards/handwired/xeal60/keymaps/fido/rules.mk delete mode 100644 keyboards/handwired/xeal60/keymaps/heartrobotninja/config.h delete mode 100644 keyboards/handwired/xeal60/keymaps/heartrobotninja/keymap.c delete mode 100644 keyboards/handwired/xeal60/keymaps/heartrobotninja/rules.mk delete mode 100644 keyboards/handwired/xeal60/keymaps/henxing/Readme.md delete mode 100644 keyboards/handwired/xeal60/keymaps/henxing/config.h delete mode 100644 keyboards/handwired/xeal60/keymaps/henxing/keymap.c delete mode 100644 keyboards/handwired/xeal60/keymaps/hexwire/README.md delete mode 100644 keyboards/handwired/xeal60/keymaps/hexwire/config.h delete mode 100644 keyboards/handwired/xeal60/keymaps/hexwire/keymap.c delete mode 100644 keyboards/handwired/xeal60/keymaps/hexwire/rules.mk delete mode 100644 keyboards/handwired/xeal60/keymaps/khord/config.h delete mode 100644 keyboards/handwired/xeal60/keymaps/khord/keymap.c delete mode 100644 keyboards/handwired/xeal60/keymaps/khord/rules.mk delete mode 100644 keyboards/handwired/xeal60/keymaps/kris/keymap.c delete mode 100644 keyboards/handwired/xeal60/keymaps/krusli/keymap.c delete mode 100644 keyboards/handwired/xeal60/keymaps/krusli/readme.md delete mode 100644 keyboards/handwired/xeal60/keymaps/mbsurfer/config.h delete mode 100644 keyboards/handwired/xeal60/keymaps/mbsurfer/keymap.c delete mode 100644 keyboards/handwired/xeal60/keymaps/mbsurfer/rules.mk delete mode 100644 keyboards/handwired/xeal60/keymaps/mike808/config.h delete mode 100644 keyboards/handwired/xeal60/keymaps/mike808/keymap.c delete mode 100644 keyboards/handwired/xeal60/keymaps/mike808/rules.mk delete mode 100644 keyboards/handwired/xeal60/keymaps/mjt/config.h delete mode 100644 keyboards/handwired/xeal60/keymaps/mjt/keymap.c delete mode 100644 keyboards/handwired/xeal60/keymaps/mjt/rules.mk delete mode 100644 keyboards/handwired/xeal60/keymaps/mtdjr/config.h delete mode 100644 keyboards/handwired/xeal60/keymaps/mtdjr/keymap.c delete mode 100644 keyboards/handwired/xeal60/keymaps/mtdjr/rules.mk delete mode 100644 keyboards/handwired/xeal60/keymaps/normacos/config.h delete mode 100644 keyboards/handwired/xeal60/keymaps/normacos/keymap.c delete mode 100644 keyboards/handwired/xeal60/keymaps/normacos/readme.md delete mode 100644 keyboards/handwired/xeal60/keymaps/piemod/README.md delete mode 100644 keyboards/handwired/xeal60/keymaps/piemod/config.h delete mode 100644 keyboards/handwired/xeal60/keymaps/piemod/keymap.c delete mode 100644 keyboards/handwired/xeal60/keymaps/piemod/rules.mk delete mode 100644 keyboards/handwired/xeal60/keymaps/pitty/README.md delete mode 100644 keyboards/handwired/xeal60/keymaps/pitty/config.h delete mode 100644 keyboards/handwired/xeal60/keymaps/pitty/keymap.c delete mode 100644 keyboards/handwired/xeal60/keymaps/pitty/rules.mk delete mode 100644 keyboards/handwired/xeal60/keymaps/poker/config.h delete mode 100644 keyboards/handwired/xeal60/keymaps/poker/keymap.c delete mode 100644 keyboards/handwired/xeal60/keymaps/poker/rules.mk delete mode 100644 keyboards/handwired/xeal60/keymaps/smt/config.h delete mode 100644 keyboards/handwired/xeal60/keymaps/smt/keymap.c delete mode 100644 keyboards/handwired/xeal60/keymaps/smt/readme.md delete mode 100644 keyboards/handwired/xeal60/keymaps/that_canadian/config.h delete mode 100644 keyboards/handwired/xeal60/keymaps/that_canadian/keymap.c delete mode 100644 keyboards/handwired/xeal60/keymaps/waples/README.md delete mode 100644 keyboards/handwired/xeal60/keymaps/waples/config.h delete mode 100644 keyboards/handwired/xeal60/keymaps/waples/keymap.c delete mode 100644 keyboards/handwired/xeal60/keymaps/waples/rules.mk delete mode 100644 keyboards/handwired/xeal60/keymaps/xk/config.h delete mode 100644 keyboards/handwired/xeal60/keymaps/xk/keymap.c delete mode 100644 keyboards/handwired/xeal60/keymaps/xk/rules.mk delete mode 100644 keyboards/handwired/xeal60/keymaps/zer09/config.h delete mode 100644 keyboards/handwired/xeal60/keymaps/zer09/keymap.c delete mode 100644 keyboards/handwired/xeal60/keymaps/zer09/keymap.h delete mode 100644 keyboards/handwired/xeal60/keymaps/zer09/rules.mk diff --git a/keyboards/handwired/xeal60/keymaps/DE_simple/config.h b/keyboards/handwired/xeal60/keymaps/DE_simple/config.h deleted file mode 100644 index 5a6261c4f..000000000 --- a/keyboards/handwired/xeal60/keymaps/DE_simple/config.h +++ /dev/null @@ -1,37 +0,0 @@ -/* -This is the c configuration file for the keymap - -Copyright 2012 Jun Wako -Copyright 2015 Jack Humbert - -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 . -*/ - -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -/* Use I2C or Serial, not both */ - -#define USE_SERIAL -// #define USE_I2C - -/* Select hand configuration */ - -#define MASTER_LEFT -// #define MASTER_RIGHT -// #define EE_HANDS - -#endif diff --git a/keyboards/handwired/xeal60/keymaps/DE_simple/keymap.c b/keyboards/handwired/xeal60/keymaps/DE_simple/keymap.c deleted file mode 100644 index d329bea4c..000000000 --- a/keyboards/handwired/xeal60/keymaps/DE_simple/keymap.c +++ /dev/null @@ -1,155 +0,0 @@ -#include QMK_KEYBOARD_H -#include "keymap_german.h" - -extern keymap_config_t keymap_config; - -// Each layer gets a name for readability, which is then used in the keymap matrix below. -// The underscores don't mean anything - you can have a layer called STUFF or any other name. -// Layer names don't all need to be of the same length, obviously, and you can also skip them -// entirely and just use numbers. -#define _QWERTZ 0 -#define _LOWER 3 -#define _RAISE 4 -#define _ADJUST 16 - -enum custom_keycodes { - QWERTZ = SAFE_RANGE, - LOWER, - RAISE, - ADJUST, -}; - -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - -/* Qwertz - * ,-----------------------------------------------------------------------------------. - * | Esc | Q | W | E | R | T | Z | U | I | O | P | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Tab | A | S | D | F | G | H | J | K | L | + | # | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Y | X | C | V | B | N | M | , | . | - |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Ctrl | Alt | AltGr| GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' - */ -[_QWERTZ] = LAYOUT( \ - KC_ESC, DE_Q, DE_W, DE_E, DE_R, DE_T, DE_Z, DE_U, DE_I, DE_O, DE_P, KC_BSPC, \ - KC_TAB, DE_A, DE_S, DE_D, DE_F, DE_G, DE_H, DE_J, DE_K, DE_L, DE_PLUS, DE_HASH, \ - KC_LSFT, DE_Y, DE_X, DE_C, DE_V, DE_B, DE_N, DE_M, DE_COMM, DE_DOT, DE_MINS, KC_ENT , \ - KC_LCTL, KC_LALT, DE_ALGR, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ -), - -/* Lower - * ,-----------------------------------------------------------------------------------. - * | ° | ! | " | § | $ | % | & | / | ( | ) | = | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | F6 | @ | € | ü | ? | ´ | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| F7 | F8 | F9 | F10 | F11 | F12 | | | ö | ä | |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | Next | Vol- | Vol+ | Play | - * `-----------------------------------------------------------------------------------' - */ -[_LOWER] = LAYOUT( \ - DE_CIRC, DE_EXLM, DE_DQOT, DE_PARA, DE_DLR, DE_PERC, DE_AMPR, DE_SLSH, DE_LPRN, DE_RPRN, DE_EQL, KC_BSPC, \ - KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, DE_AT , DE_EURO, KC_LBRC, DE_QST, DE_QUOT, \ - KC_LSFT, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DE_PIPE , KC_SCLN, KC_QUOT, _______, KC_ENT, \ - _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ -), - -/* Raise - * ,-----------------------------------------------------------------------------------. - * | ° | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | F6 | { | [ | ] | } | \ | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| F7 | F8 | F9 | F10 | F11 | F12 | | | | |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | Next | Vol- | Vol+ | Play | - * `-----------------------------------------------------------------------------------' - */ -[_RAISE] = LAYOUT( \ - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ - KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, DE_LCBR, DE_LBRC, DE_RBRC, DE_RCBR , DE_BSLS, \ - KC_LSFT, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, KC_ENT, \ - _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ -), - -/* Adjust (Lower + Raise) - * ,-----------------------------------------------------------------------------------. - * | | Reset| | | | | | | | | | Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | |Aud on|Audoff|AGnorm|AGswap|Qwertz| | | | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | | | | | | | | | | | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | | - * `-----------------------------------------------------------------------------------' - */ -[_ADJUST] = LAYOUT( \ - _______, RESET , _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ - _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTZ, _______, _______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ -) - - -}; - -#ifdef AUDIO_ENABLE -float tone_qwertz[][2] = SONG(QWERTY_SOUND); -float tone_dvorak[][2] = SONG(DVORAK_SOUND); -float tone_colemak[][2] = SONG(COLEMAK_SOUND); -#endif - -void persistent_default_layer_set(uint16_t default_layer) { - eeconfig_update_default_layer(default_layer); - default_layer_set(default_layer); -} - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case QWERTZ: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_qwertz); - #endif - persistent_default_layer_set(1UL<<_QWERTZ); - } - return false; - break; - case LOWER: - if (record->event.pressed) { - layer_on(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case RAISE: - if (record->event.pressed) { - layer_on(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case ADJUST: - if (record->event.pressed) { - layer_on(_ADJUST); - } else { - layer_off(_ADJUST); - } - return false; - break; - } - return true; -} diff --git a/keyboards/handwired/xeal60/keymaps/DE_simple/readme.md b/keyboards/handwired/xeal60/keymaps/DE_simple/readme.md deleted file mode 100644 index 972cd6c39..000000000 --- a/keyboards/handwired/xeal60/keymaps/DE_simple/readme.md +++ /dev/null @@ -1,59 +0,0 @@ -De_Simple Keymap -====== - -Features --------- - -Changed Keymap to reasamble German Layout. - -Layout --------- - - Qwertz - ,-----------------------------------------------------------------------------------. - | Esc | Q | W | E | R | T | Z | U | I | O | P | Bksp | - |------+------+------+------+------+-------------+------+------+------+------+------| - | Tab | A | S | D | F | G | H | J | K | L | + | # | - |------+------+------+------+------+------|------+------+------+------+------+------| - | Shift| Y | X | C | V | B | N | M | , | . | - |Enter | - |------+------+------+------+------+------+------+------+------+------+------+------| - | Ctrl | Alt | AltGr| GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | - `-----------------------------------------------------------------------------------' - - - Qwerty - ,-----------------------------------------------------------------------------------. - | Esc | Q | W | E | R | T | Z | U | I | O | P | Bksp | - |------+------+------+------+------+-------------+------+------+------+------+------| - | Tab | A | S | D | F | G | H | J | K | L | + | # | - |------+------+------+------+------+------|------+------+------+------+------+------| - | Shift| Y | X | C | V | B | N | M | , | . | - |Enter | - |------+------+------+------+------+------+------+------+------+------+------+------| - | Ctrl | Alt | AltGr| GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | - `-----------------------------------------------------------------------------------' - - - Raise - ,-----------------------------------------------------------------------------------. - | ° | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | - |------+------+------+------+------+-------------+------+------+------+------+------| - | Del | F1 | F2 | F3 | F4 | F5 | F6 | { | [ | ] | } | \ | - |------+------+------+------+------+------|------+------+------+------+------+------| - | Shift| F7 | F8 | F9 | F10 | F11 | F12 | | | | |Enter | - |------+------+------+------+------+------+------+------+------+------+------+------| - | | | | | | | | Next | Vol- | Vol+ | Play | - `-----------------------------------------------------------------------------------' - - - Adjust (Lower + Raise) - ,-----------------------------------------------------------------------------------. - | | Reset| | | | | | | | | | Del | - |------+------+------+------+------+-------------+------+------+------+------+------| - | | | |Aud on|Audoff|AGnorm|AGswap|Qwertz| | | | | - |------+------+------+------+------+------|------+------+------+------+------+------| - | | | | | | | | | | | | | - |------+------+------+------+------+------+------+------+------+------+------+------| - | | | | | | | | | | | | - `-----------------------------------------------------------------------------------' - - diff --git a/keyboards/handwired/xeal60/keymaps/DE_simple/rules.mk b/keyboards/handwired/xeal60/keymaps/DE_simple/rules.mk deleted file mode 100644 index e69de29bb..000000000 diff --git a/keyboards/handwired/xeal60/keymaps/OLED_sample/config.h b/keyboards/handwired/xeal60/keymaps/OLED_sample/config.h deleted file mode 100644 index e8632fe61..000000000 --- a/keyboards/handwired/xeal60/keymaps/OLED_sample/config.h +++ /dev/null @@ -1,60 +0,0 @@ -/* -This is the c configuration file for the keymap - -Copyright 2012 Jun Wako -Copyright 2015 Jack Humbert - -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 . -*/ - -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -/* Use I2C or Serial, not both */ - -#define USE_I2C -//#define USE_SERIAL - -/* Select hand configuration */ - -#define MASTER_LEFT -// #define MASTER_RIGHT -// #define EE_HANDS -#define FLIP_HALF - -#define SSD1306OLED -//#define OLED_ROTATE180 - - -#define PREVENT_STUCK_MODIFIERS -#define TAPPING_FORCE_HOLD -#define TAPPING_TERM 100 - -#ifdef SUBPROJECT_rev1 - #include "../../rev1/config.h" -#endif -#ifdef SUBPROJECT_rev2 - #include "../../rev2/config.h" -#endif - -#undef RGBLED_NUM -#define RGBLIGHT_ANIMATIONS -#define RGBLED_NUM 6 -#define RGBLIGHT_HUE_STEP 10 -#define RGBLIGHT_SAT_STEP 17 -#define RGBLIGHT_VAL_STEP 17 - -#endif diff --git a/keyboards/handwired/xeal60/keymaps/OLED_sample/keymap.c b/keyboards/handwired/xeal60/keymaps/OLED_sample/keymap.c deleted file mode 100644 index 5eccbcf1a..000000000 --- a/keyboards/handwired/xeal60/keymaps/OLED_sample/keymap.c +++ /dev/null @@ -1,441 +0,0 @@ -#include QMK_KEYBOARD_H -#include "LUFA/Drivers/Peripheral/TWI.h" -#ifdef SSD1306OLED - #include "ssd1306.h" -#endif - -extern keymap_config_t keymap_config; - -//Following line allows macro to read current RGB settings -extern rgblight_config_t rgblight_config; - - -// Each layer gets a name for readability, which is then used in the keymap matrix below. -// The underscores don't mean anything - you can have a layer called STUFF or any other name. -// Layer names don't all need to be of the same length, obviously, and you can also skip them -// entirely and just use numbers. -#define _QWERTY 0 -#define _COLEMAK 1 -#define _DVORAK 2 -#define _LOWER 3 -#define _RAISE 4 -#define _ADJUST 16 - -enum custom_keycodes { - QWERTY = SAFE_RANGE, - COLEMAK, - DVORAK, - LOWER, - RAISE, - ADJUST, - BACKLIT, - RGBLED_TOGGLE, - RGBLED_STEP_MODE, - RGBLED_INCREASE_HUE, - RGBLED_DECREASE_HUE, - RGBLED_INCREASE_SAT, - RGBLED_DECREASE_SAT, - RGBLED_INCREASE_VAL, - RGBLED_DECREASE_VAL, -}; - -enum macro_keycodes { - KC_SAMPLEMACRO, -}; - - -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO -//Macros -#define M_SAMPLE M(KC_SAMPLEMACRO) - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - -/* Qwerty - * ,-----------------------------------------------------------------------------------. - * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | S | D | F | G | H | J | K | L | ; | " | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' - */ -[_QWERTY] = LAYOUT( \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ - KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ - ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ -), - -/* Colemak - * ,-----------------------------------------------------------------------------------. - * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | R | S | T | D | H | N | E | I | O | " | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' - */ -[_COLEMAK] = LAYOUT( \ - KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, \ - KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ - ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ -), - -/* Dvorak - * ,-----------------------------------------------------------------------------------. - * | Tab | " | , | . | P | Y | F | G | C | R | L | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | O | E | U | I | D | H | T | N | S | / | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' - */ -[_DVORAK] = LAYOUT( \ - KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, \ - KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, \ - KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT , \ - ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ -), - -/* Lower - * ,-----------------------------------------------------------------------------------. - * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | | \ | | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | Next | Vol- | Vol+ | Play | - * `-----------------------------------------------------------------------------------' - */ -[_LOWER] = LAYOUT( \ - KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \ - KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ -), - -/* Raise - * ,-----------------------------------------------------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | Next | Vol- | Vol+ | Play | - * `-----------------------------------------------------------------------------------' - */ -[_RAISE] = LAYOUT( \ - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ - KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, _______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ -), - -/* Adjust (Lower + Raise) - * ,-----------------------------------------------------------------------------------. - * | | Reset| | | | | | | | | | Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | | | | | | | | | | | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | | - * `-----------------------------------------------------------------------------------' - */ -[_ADJUST] = LAYOUT( \ - _______, RESET, _______, M_SAMPLE, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ - _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ -) - - -}; - - -#ifdef AUDIO_ENABLE - -float tone_startup[][2] = SONG(STARTUP_SOUND); -float tone_qwerty[][2] = SONG(QWERTY_SOUND); -float tone_dvorak[][2] = SONG(DVORAK_SOUND); -float tone_colemak[][2] = SONG(COLEMAK_SOUND); -float tone_plover[][2] = SONG(PLOVER_SOUND); -float tone_plover_gb[][2] = SONG(PLOVER_GOODBYE_SOUND); -float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); -float tone_goodbye[][2] = SONG(GOODBYE_SOUND); -#endif - -// define variables for reactive RGB -bool TOG_STATUS = false; -int RGB_current_mode; - -void persistent_default_layer_set(uint16_t default_layer) { - eeconfig_update_default_layer(default_layer); - default_layer_set(default_layer); -} - -// Setting ADJUST layer RGB back to default -void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) { - if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) { - rgblight_mode(RGB_current_mode); - layer_on(layer3); - } else { - layer_off(layer3); - } -} - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case QWERTY: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_qwerty); - #endif - persistent_default_layer_set(1UL<<_QWERTY); - } - return false; - break; - case COLEMAK: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_colemak); - #endif - persistent_default_layer_set(1UL<<_COLEMAK); - } - return false; - break; - case DVORAK: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_dvorak); - #endif - persistent_default_layer_set(1UL<<_DVORAK); - } - return false; - break; - case LOWER: - if (record->event.pressed) { - //not sure how to have keyboard check mode and set it to a variable, so my work around - //uses another variable that would be set to true after the first time a reactive key is pressed. - if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false - } else { - TOG_STATUS = !TOG_STATUS; - rgblight_mode(16); - } - layer_on(_LOWER); - update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); - } else { - rgblight_mode(RGB_current_mode); // revert RGB to initial mode prior to RGB mode change - TOG_STATUS = false; - layer_off(_LOWER); - update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case RAISE: - if (record->event.pressed) { - //not sure how to have keyboard check mode and set it to a variable, so my work around - //uses another variable that would be set to true after the first time a reactive key is pressed. - if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false - } else { - TOG_STATUS = !TOG_STATUS; - rgblight_mode(15); - } - layer_on(_RAISE); - update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); - } else { - rgblight_mode(RGB_current_mode); // revert RGB to initial mode prior to RGB mode change - layer_off(_RAISE); - TOG_STATUS = false; - update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case BACKLIT: - if (record->event.pressed) { - register_code(KC_RSFT); - #ifdef BACKLIGHT_ENABLE - backlight_step(); - #endif - } else { - unregister_code(KC_RSFT); - } - return false; - break; - //led operations - RGB mode change now updates the RGB_current_mode to allow the right RGB mode to be set after reactive keys are released - case RGB_MOD: - if (record->event.pressed) { - rgblight_mode(RGB_current_mode); - rgblight_step(); - RGB_current_mode = rgblight_config.mode; - } - return false; - break; - } - return true; -} - -void matrix_init_user(void) { - #ifdef AUDIO_ENABLE - startup_user(); - #endif - RGB_current_mode = rgblight_config.mode; -} - -//SSD1306 OLED init and update loop, make sure to add #define SSD1306OLED in config.h -#ifdef SSD1306OLED -void matrix_master_OLED_init (void) { - TWI_Init(TWI_BIT_PRESCALE_1, TWI_BITLENGTH_FROM_FREQ(1, 800000)); - iota_gfx_init(); // turns on the display -} - -void matrix_scan_user(void) { - iota_gfx_task(); // this is what updates the display continuously -} -#endif - -#ifdef AUDIO_ENABLE - -void startup_user() -{ - _delay_ms(20); // gets rid of tick - PLAY_SONG(tone_startup); -} - -void shutdown_user() -{ - PLAY_SONG(tone_goodbye); - _delay_ms(150); - stop_all_notes(); -} - -void music_on_user(void) -{ - music_scale_user(); -} - -void music_scale_user(void) -{ - PLAY_SONG(music_scale); -} - -#endif - -/* - * Macro definition - */ -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - if (!eeconfig_is_enabled()) { - eeconfig_init(); - } - - switch (id) { - case KC_SAMPLEMACRO: - if (record->event.pressed){ - return MACRO (I(10), T(H), T(E), T(L), T(L), T(O), T(SPACE), T(W), T(O), T(R), T(L), T(D), END); - } - - } - - return MACRO_NONE; -} - - -void matrix_update(struct CharacterMatrix *dest, - const struct CharacterMatrix *source) { - if (memcmp(dest->display, source->display, sizeof(dest->display))) { - memcpy(dest->display, source->display, sizeof(dest->display)); - dest->dirty = true; - } -} - -//assign the right code to your layers for OLED display -#define L_BASE 0 -#define L_LOWER 8 -#define L_RAISE 16 -#define L_FNLAYER 64 -#define L_NUMLAY 128 -#define L_NLOWER 136 -#define L_NFNLAYER 192 -#define L_MOUSECURSOR 256 -#define L_ADJUST 65560 - -void iota_gfx_task_user(void) { -#if DEBUG_TO_SCREEN - if (debug_enable) { - return; - } -#endif - - struct CharacterMatrix matrix; - - matrix_clear(&matrix); - matrix_write_P(&matrix, PSTR("USB: ")); -#ifdef PROTOCOL_LUFA - switch (USB_DeviceState) { - case DEVICE_STATE_Unattached: - matrix_write_P(&matrix, PSTR("Unattached")); - break; - case DEVICE_STATE_Suspended: - matrix_write_P(&matrix, PSTR("Suspended")); - break; - case DEVICE_STATE_Configured: - matrix_write_P(&matrix, PSTR("Connected")); - break; - case DEVICE_STATE_Powered: - matrix_write_P(&matrix, PSTR("Powered")); - break; - case DEVICE_STATE_Default: - matrix_write_P(&matrix, PSTR("Default")); - break; - case DEVICE_STATE_Addressed: - matrix_write_P(&matrix, PSTR("Addressed")); - break; - default: - matrix_write_P(&matrix, PSTR("Invalid")); - } -#endif - -// Define layers here, Have not worked out how to have text displayed for each layer. Copy down the number you see and add a case for it below - - char buf[40]; - snprintf(buf,sizeof(buf), "Undef-%ld", layer_state); - matrix_write_P(&matrix, PSTR("\n\nLayer: ")); - switch (layer_state) { - case L_BASE: - matrix_write_P(&matrix, PSTR("Default")); - break; - case L_RAISE: - matrix_write_P(&matrix, PSTR("Raise")); - break; - case L_LOWER: - matrix_write_P(&matrix, PSTR("Lower")); - break; - case L_ADJUST: - matrix_write_P(&matrix, PSTR("ADJUST")); - break; - default: - matrix_write(&matrix, buf); - } - - // Host Keyboard LED Status - char led[40]; - snprintf(led, sizeof(led), "\n%s %s %s", - (host_keyboard_leds() & (1< -Copyright 2015 Jack Humbert - -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 . -*/ - -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -/* Use I2C or Serial, not both */ - -#define USE_SERIAL -// #define USE_I2C - -/* Select hand configuration */ - -// #define MASTER_LEFT -// #define MASTER_RIGHT -#define EE_HANDS - -#ifdef SUBPROJECT_rev2 - /* RGB Underglow */ - #undef RGBLED_NUM - #define RGBLIGHT_ANIMATIONS - #define RGBLED_NUM 8 -#endif - -#undef TAPPING_TERM -#define TAPPING_TERM 200 //At 500 some bad logic takes hold -#define PREVENT_STUCK_MODIFIERS -#define IGNORE_MOD_TAP_INTERRUPT -#define PERMISSIVE_HOLD - -#endif diff --git a/keyboards/handwired/xeal60/keymaps/adam/keymap.c b/keyboards/handwired/xeal60/keymaps/adam/keymap.c deleted file mode 100644 index b986ab780..000000000 --- a/keyboards/handwired/xeal60/keymaps/adam/keymap.c +++ /dev/null @@ -1,78 +0,0 @@ -#include QMK_KEYBOARD_H - - -extern keymap_config_t keymap_config; - -// Each layer gets a name for readability, which is then used in the keymap matrix below. -// The underscores don't mean anything - you can have a layer called STUFF or any other name. -// Layer names don't all need to be of the same length, obviously, and you can also skip them -// entirely and just use numbers. -#define BASE 0 // default layer -#define FLOCK 1 // symbols arrows and F keys on F held down -#define JLOCK 2 // same as Flock but with fall thru J and mapped to J held down - -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - -/* Qwerty - * ,-----------------------------------------------------------------------------------. - * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | S | D | F | G | H | J | K | L | ; | " | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Brite| Ctrl | Alt | GUI |Lower | Bksp |Space |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' - */ -[BASE] = LAYOUT ( \ - TD(1), KC_2, KC_3, KC_4, KC_5, KC_MINS, KC_EQL, KC_6, KC_7, KC_8, KC_9, KC_0, \ - KC_Q, KC_W, KC_E, KC_R, KC_T, KC_TAB, KC_TAB, KC_Y, KC_U, KC_I, KC_O, KC_P, \ - SFT_T(KC_A), ALT_T(KC_S),CTL_T(KC_D), F(FLOCK), GUI_T(KC_G), KC_BSPC, KC_DELETE, GUI_T(KC_H), F(JLOCK), CTL_T(KC_K), ALT_T(KC_L), SFT_T(KC_SCLN), \ - KC_Z, KC_X, KC_C, KC_V, KC_B, KC_SPC, KC_ENT, KC_N, KC_M, KC_COMM, KC_DOT, KC_QUOTE -), -[FLOCK] = LAYOUT ( \ - KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11, KC_F12, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, \ - KC_LBRC, KC_GRV, KC_TILDE, S(KC_1), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_HOME, KC_PGUP, XXXXXXX, KC_RBRC, \ - S(KC_LBRC), _______, _______, _______, _______, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, S(KC_RBRC), \ - KC_BSLS, KC_PIPE, XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, KC_ESC, XXXXXXX, KC_END, KC_PGDOWN, KC_QUES, KC_SLASH \ -), -[JLOCK] = LAYOUT ( \ - KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11, KC_F12, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, \ - KC_LBRC, KC_GRV, KC_TILDE, S(KC_1), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_HOME, KC_PGUP, XXXXXXX, KC_RBRC, \ - S(KC_LBRC), _______, _______, _______, _______, XXXXXXX, XXXXXXX, KC_LEFT, _______, KC_UP, KC_RIGHT, S(KC_RBRC), \ - KC_BSLS, KC_PIPE, XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, KC_ESC, XXXXXXX, KC_END, KC_PGDOWN, KC_QUES, KC_SLASH \ -) -}; - -const uint16_t PROGMEM fn_actions[] = { - [FLOCK] = ACTION_LAYER_TAP_KEY(FLOCK,KC_F), - [JLOCK] = ACTION_LAYER_TAP_KEY(JLOCK,KC_J) -}; -#ifdef TAP_DANCE_ENABLE -void tap_1(qk_tap_dance_state_t *state, void *user_data) { - switch (state->count) { - case 1: - register_code (KC_1); - unregister_code (KC_1); - break; - case 2: - register_code (KC_ESC); - unregister_code (KC_ESC); - break; - case 3: - register_code (KC_LSFT); - register_code (KC_1); - unregister_code (KC_1); - unregister_code (KC_LSFT); - } -} - -qk_tap_dance_action_t tap_dance_actions[] = { - [0] = ACTION_TAP_DANCE_DOUBLE(KC_1, KC_ESC), - [1] = ACTION_TAP_DANCE_FN(tap_1) -}; -#endif diff --git a/keyboards/handwired/xeal60/keymaps/bbaserdem/README.md b/keyboards/handwired/xeal60/keymaps/bbaserdem/README.md deleted file mode 100644 index 4b37d7355..000000000 --- a/keyboards/handwired/xeal60/keymaps/bbaserdem/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# Lets Split Layout - -Check out [user readme](../../../../users/bbaserdem/README.md) for more info. - -# Usage - -**These commands depend on there being no other arduino connected!** -Also udev rules can be set instead of using sudo. -Please unplug all other usb devices. - -To make the hex files; -``` -make lets_split/rev2:bbaserdem -make lets_split/rev2:bbaserdem_right -``` - -For the left half, after plugging in and resetting; (from repo main directory) -``` -sudo avrdude -p atmega32u4 -P "$(ls /dev/ttyACM*)" -c avr109 -D -U flash:w:.build/lets_split_rev2_bbaserdem.hex -sudo avrdude -p atmega32u4 -P "$(ls /dev/ttyACM*)" -c avr109 -U eeprom:w:keyboards/lets_split/eeprom-lefthand.eep -``` - -For the right half; -``` -sudo avrdude -p atmgea34u4 -P "$(ls /dev/ttyACM*)" -c avr109 -D -U flash:w:.build/lets_split_rev2_bbaserdem_right.hex -sudo avrdude -p atmega32u4 -P "$(ls /dev/ttyACM*)" -c avr109 -U eeprom:w:keyboards/lets_split/eeprom-righhand.eep -``` diff --git a/keyboards/handwired/xeal60/keymaps/bbaserdem/config.h b/keyboards/handwired/xeal60/keymaps/bbaserdem/config.h deleted file mode 100644 index 6a90e1c35..000000000 --- a/keyboards/handwired/xeal60/keymaps/bbaserdem/config.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef CONFIG_KEYMAP_H -#define CONFIG_KEYMAP_H - -#include "../../config.h" - -#define USE_SERIAL -#define EE_HANDS - -// LED strip stuff -#ifdef RGBLIGHT_ENABLE - -// Who thought it was a good idea to predefine these in the rev2/config.h ??? -#ifdef RGBLED_NUM -#undef RGBLED_NUM -#endif -#define RGBLED_NUM 12 - -#define RGBLIGHT_HUE_STEP 6 -#define RGBLIGHT_SAT_STEP 12 -#define RGBLIGHT_VAL_STEP 20 -#define RGBLIGHT_ANIMATIONS -#define RGBLIGHT_EFFECT_SNAKE_LENGTH 6 -#define RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL 2000 -#define RGBLIGHT_EFFECT_CHRISTMAS_STEP 1 -#endif - -#endif diff --git a/keyboards/handwired/xeal60/keymaps/bbaserdem/keymap.c b/keyboards/handwired/xeal60/keymaps/bbaserdem/keymap.c deleted file mode 100644 index 623117530..000000000 --- a/keyboards/handwired/xeal60/keymaps/bbaserdem/keymap.c +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Let's Split - Dvorak turkish - * Keymap by @bbaserdem - * Dvorak layout with multiple features - * Most of the code is in the "user" directory. - * Check qmk_firmware/users/bbaserdem for the main part of the code - */ -#define KEYMAP(...) LAYOUT_ortho_4x12(__VA_ARGS__) - -#include "lets_split.h" -#include "bbaserdem.h" - - -void matrix_init_keymap (void) { -} - -uint32_t layer_state_set_keymap(uint32_t state) { - return state; -} - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - // Main Dvorak layer - [_DV] = LAYOUT_letssplit_wrapper(DVORAK), - // Turkish and special character overlay - [_AL] = LAYOUT_letssplit_wrapper(ALTCHAR), - // Gaming layer - [_GA] = LAYOUT_letssplit_wrapper(GAME), - // Numbers layer - [_NU] = LAYOUT_letssplit_wrapper(NUMBERS), - // Settings layer - [_SE] = LAYOUT_letssplit_wrapper(SETTINGS), - // Mouse emulation layer - [_MO] = LAYOUT_letssplit_wrapper(MOUSE), - // Music layer - [_MU] = LAYOUT_letssplit_wrapper(MUSIC), -}; diff --git a/keyboards/handwired/xeal60/keymaps/bbaserdem/rules.mk b/keyboards/handwired/xeal60/keymaps/bbaserdem/rules.mk deleted file mode 100644 index 4159db3fe..000000000 --- a/keyboards/handwired/xeal60/keymaps/bbaserdem/rules.mk +++ /dev/null @@ -1,11 +0,0 @@ -# Build options - -BACKLIGHT_ENABLE = no # Switch LEDs -MOUSEKEY_ENABLE = yes # Emulates mouse key using keypresses -RGBLIGHT_ENABLE = yes # LED strips -TAP_DANCE_ENABLE = no # Use multi-tap features -AUDIO_ENABLE = no # Audio stuff - -ifndef QUANTUM_DIR - include ../../../../Makefile -endif diff --git a/keyboards/handwired/xeal60/keymaps/bbaserdem_right/README.md b/keyboards/handwired/xeal60/keymaps/bbaserdem_right/README.md deleted file mode 100644 index 8608f23f7..000000000 --- a/keyboards/handwired/xeal60/keymaps/bbaserdem_right/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Lets Split - Right Half - -Keymap for my right half, to be used as a numpad. -Check [main readme](../bbaserdem/README.md) for flashing info. - diff --git a/keyboards/handwired/xeal60/keymaps/bbaserdem_right/config.h b/keyboards/handwired/xeal60/keymaps/bbaserdem_right/config.h deleted file mode 100644 index 47545a059..000000000 --- a/keyboards/handwired/xeal60/keymaps/bbaserdem_right/config.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef CONFIG_KEYMAP_H -#define CONFIG_KEYMAP_H - -#include "../../config.h" - -#define USE_SERIAL -#define EE_HANDS - -#endif diff --git a/keyboards/handwired/xeal60/keymaps/bbaserdem_right/keymap.c b/keyboards/handwired/xeal60/keymaps/bbaserdem_right/keymap.c deleted file mode 100644 index 2dcae0dca..000000000 --- a/keyboards/handwired/xeal60/keymaps/bbaserdem_right/keymap.c +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Let's Split - Dvorak turkish - * Keymap by @bbaserdem - * Dvorak layout with multiple features - * Most of the code is in the "user" directory. - * Check qmk_firmware/users/bbaserdem for the main part of the code - */ - -#include "lets_split.h" - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - - /* Navigation All Supered) Numpad - * ,-----------------------. ,-----------------------. - * | F4| ` | Q |Alt| L | > | | ) | - | + | = |Ent|Bkp| - * |---+---+---+---+---+---| |---+---+---+---+---+---| - * | F3| M |Ent|Ctl| K | ^ | | ( | * | 9 | 6 | 3 | . | - * |---+---+---+---+---+---| |---+---+---+---+---+---| - * | F2| T |Spc|Shf| J | v | | % | / | 8 | 5 | 2 | , | - * |---+---+---+---+---+---| |---+---+---+---+---+---| - * | F1| F | P |Tab| H | < | |Nlc|Tab| 7 | 4 | 1 | 0 | - * `-----------------------' `-----------------------' - */ - // Main Dvorak layer - [0] = LAYOUT_ortho_4x12( - LCTL(LALT(KC_DEL)), LGUI(KC_GRV), LGUI(KC_Q), LGUI(KC_LALT), LGUI(KC_L), LGUI(KC_RGHT), KC_RPRN, KC_PMNS, KC_PPLS, KC_PEQL, KC_PENT, KC_BSPC, \ - LGUI(KC_F3), LGUI(KC_M), LGUI(KC_ENT), LGUI(KC_LCTL), LGUI(KC_K), LGUI(KC_UP), KC_LPRN, KC_PAST, KC_P9, KC_P6, KC_P3, KC_PDOT, \ - LGUI(KC_F2), LGUI(KC_T), LGUI(KC_SPC), LGUI(KC_LSFT), LGUI(KC_J), LGUI(KC_DOWN), KC_PERC, KC_PSLS, KC_P8, KC_P5, KC_P2, KC_PCMM, \ - LGUI(KC_F1), LGUI(KC_F), LGUI(KC_P), LGUI(KC_TAB), LGUI(KC_H), LGUI(KC_LEFT), KC_NLCK, KC_TAB, KC_P7, KC_P4, KC_P1, KC_P0 \ - ) -}; diff --git a/keyboards/handwired/xeal60/keymaps/bbaserdem_right/rules.mk b/keyboards/handwired/xeal60/keymaps/bbaserdem_right/rules.mk deleted file mode 100644 index 36b4b8fc2..000000000 --- a/keyboards/handwired/xeal60/keymaps/bbaserdem_right/rules.mk +++ /dev/null @@ -1,26 +0,0 @@ -# Build options - -USER_NAME := bbaserdem-without-userspace - -BACKLIGHT_ENABLE = no # Switch LEDs -MOUSEKEY_ENABLE = no # Emulates mouse key using keypresses -RGBLIGHT_ENABLE = no # LED strips -TAP_DANCE_ENABLE = no # Use multi-tap features -AUDIO_ENABLE = no # Audio stuff -BLUETOOTH_ENABLE = no # No bluetooth -COMMAND_ENABLE = no # Some bootmagic thing -BOOTMAGIC_ENABLE = no # Access to EEPROM settings, not needed -CONSOLE_ENABLE = no # Allows console output with a command -SLEEP_LED_ENABLE = no # Breathes LED's when computer is asleep. Untested. -NKRO_ENABLE = no # Default is 6KRO which is plenty -MIDI_ENABLE = no # Untested feature -FAUXCLICKY_ENABLE = no # Emulates clicks using speaker -KEY_LOCK_ENABLE = no # Allows locking any key. Not used -API_SYSEX_ENABLE = no # Allows OS to send signals. -KEY_LOCK_ENABLE = no # Allows locking any key. Not used -UNICODE_ENABLE = no # Used for unicode character emulation -EXTRAKEY_ENABLE = no # OS signals like volume control - -ifndef QUANTUM_DIR - include ../../../../Makefile -endif diff --git a/keyboards/handwired/xeal60/keymaps/cpeters1982/config.h b/keyboards/handwired/xeal60/keymaps/cpeters1982/config.h deleted file mode 100644 index 3639b9c3f..000000000 --- a/keyboards/handwired/xeal60/keymaps/cpeters1982/config.h +++ /dev/null @@ -1,54 +0,0 @@ -/* -This is the c configuration file for the keymap - -Copyright 2012 Jun Wako -Copyright 2015 Jack Humbert - -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 . -*/ - -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -/* Use I2C or Serial, not both */ - -#define USE_SERIAL -// #define USE_I2C - -/* Select hand configuration */ - -// #define MASTER_LEFT -#define MASTER_RIGHT -// #define EE_HANDS - -// Define Tap Dance interval -//#define TAPPING_TERM 175 - -// // Enable LED strip -#undef RGBLED_NUM -#define RGBLIGHT_ANIMATIONS -#define RGBLED_NUM 10 - -// Space Cadet -#define LSPO_KEY KC_9 -#define RSPC_KEY KC_0 -#define DISABLE_SPACE_CADET_ROLLOVER - -// Auto Shift settings -#define AUTO_SHIFT_TIMEOUT 165 -// #define NO_AUTO_SHIFT_SPECIAL - -#endif diff --git a/keyboards/handwired/xeal60/keymaps/cpeters1982/keymap.c b/keyboards/handwired/xeal60/keymaps/cpeters1982/keymap.c deleted file mode 100644 index 9c3eb9475..000000000 --- a/keyboards/handwired/xeal60/keymaps/cpeters1982/keymap.c +++ /dev/null @@ -1,221 +0,0 @@ -#include QMK_KEYBOARD_H - - -extern keymap_config_t keymap_config; - -// Each layer gets a name for readability, which is then used in the keymap matrix below. -// The underscores don't mean anything - you can have a layer called STUFF or any other name. -// Layer names don't all need to be of the same length, obviously, and you can also skip them -// entirely and just use numbers. -#define _QWERTY 0 -// #define _COLEMAK 1 -// #define _DVORAK 2 -#define _LOWER 1 -#define _RAISE 2 -#define _ADJUST 16 - - - -enum custom_keycodes { - QWERTY = SAFE_RANGE, - // COLEMAK, - // DVORAK, - LOWER, - RAISE, - ADJUST, -}; - -/* -// Tap dance declerations -enum { - TD_GRV_TILD = 0, -}; - -// Tap dance definitions -qk_tap_dance_action_t tap_dance_actions[] = { - [TD_GRV_TILD] = ACTION_TAP_DANCE_DOUBLE(KC_GRV, KC_TILD), -}; -*/ - - - -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - -/* Qwerty - * ,-----------------------------------------------------------------------------------. - * | ` ~ | Q | W | E | R | T | Y | U | I | O | P | Bspc | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Tab | A | S | D | F | G | H | J | K | L | ; | ' | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | N | M | , | . | / |Rshift| - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Ctrl | Lalt | GUI | Esc |Lower |KC_SPC |Enter |Raise | [cmd|] alt |= Hypr| - | - * `-----------------------------------------------------------------------------------' - */ -[_QWERTY] = LAYOUT( \ - KC_GRV, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ - KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ - KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, \ - KC_LCTRL,KC_LALT, KC_LGUI, KC_ESC, TG(_LOWER), LT(_ADJUST, KC_SPC), KC_ENT, TG(_RAISE), MT(MOD_RGUI, KC_LBRC), MT(MOD_RALT, KC_RBRC), MT(MOD_HYPR, KC_EQL), KC_MINS \ -), - -/* Lower - * ,-----------------------------------------------------------------------------------. - * | ESC | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bspc | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 | | | | | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | Next | Vol- | Vol+ | Play | - * `-----------------------------------------------------------------------------------' - */ -[_LOWER] = LAYOUT( \ - KC_ESC, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \ - KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,_______,_______,_______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, KC_MFFD, KC_VOLD, KC_VOLU, KC_MPLY \ -), - -/* Raise - * ,-----------------------------------------------------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bspc | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 | | | | | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | Next | Vol- | Vol+ | Play | - * `-----------------------------------------------------------------------------------' - */ -[_RAISE] = LAYOUT( \ - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ - KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, KC_MFFD, KC_VOLD, KC_VOLU, KC_MPLY \ -), - -/* Adjust (Lower + Raise) - * ,-----------------------------------------------------------------------------------. - * | | Reset| | | | | | | | | up | Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty| | left | down |right | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | | | | | | | | | % | ` | ~ | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * |AShftD|AShftU|REPORT| | | | [ | ] | - | = | \ | - * `-----------------------------------------------------------------------------------' - */ -[_ADJUST] = LAYOUT( \ - _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, KC_UP, KC_DEL, \ - _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, _______, KC_LEFT, KC_DOWN, KC_RGHT, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PERC, KC_GRV, KC_TILD, \ - KC_ASDN, KC_ASUP, KC_ASRP, _______, _______, _______, _______, KC_RBRC, KC_LBRC, KC_MINS, KC_EQL, KC_BSLASH \ -) - - -}; - -/* #ifdef AUDIO_ENABLE -* float tone_qwerty[][2] = SONG(QWERTY_SOUND); -* float tone_dvorak[][2] = SONG(DVORAK_SOUND); -* float tone_colemak[][2] = SONG(COLEMAK_SOUND); -#endif */ - - -void persistent_default_layer_set(uint16_t default_layer) { - eeconfig_update_default_layer(default_layer); - default_layer_set(default_layer); -} - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case QWERTY: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_qwerty); - #endif - persistent_default_layer_set(1UL<<_QWERTY); - } - return false; - break; - case LOWER: - if (record->event.pressed) { - layer_on(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case RAISE: - if (record->event.pressed) { - layer_on(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case ADJUST: - if (record->event.pressed) { - layer_on(_ADJUST); - } else { - layer_off(_ADJUST); - } - return false; - break; - } - return true; -}; - -#define rgblight_set_blue rgblight_sethsv (0xFF, 0xFF, 0xFF); -#define rgblight_set_red rgblight_sethsv (0x00, 0xFF, 0xFF); -#define rgblight_set_green rgblight_sethsv (0x78, 0xFF, 0xFF); -#define rgblight_set_orange rgblight_sethsv (0x1E, 0xFF, 0xFF); -#define rgblight_set_teal rgblight_sethsv (0xC3, 0xFF, 0xFF); -#define rgblight_set_magenta rgblight_sethsv (0x12C, 0xFF, 0xFF); -#define rgblight_set_yellow rgblight_sethsv (0x3C, 0xFF, 0xFF); -#define rgblight_set_purple rgblight_sethsv (0x10E, 0xFF, 0xFF); -#define rgblight_set_white rgblight_sethsv (0x00, 0x00, 0xFF); - -uint32_t layer_state_set_user(uint32_t state) { -#ifdef RGBLIGHT_ENABLE - uint8_t default_layer = eeconfig_read_default_layer(); - if (rgb_layer_change) { - switch (biton32(state)) { - case _RAISE: - rgblight_set_orange; - rgblight_mode(5); - break; - case _LOWER: - rgblight_set_teal; - rgblight_mode(5); - break; - case _ADJUST: - rgblight_set_purple; - rgblight_mode(23); - break; - default: - if (default_layer & (1UL << _COLEMAK)) { - rgblight_set_magenta; - } - else if (default_layer & (1UL << _DVORAK)) { - rgblight_set_green; - } - else { - rgblight_set_blue; - } - rgblight_mode(1); - break; - } - } -#endif - return state; -} diff --git a/keyboards/handwired/xeal60/keymaps/cpeters1982/rules.mk b/keyboards/handwired/xeal60/keymaps/cpeters1982/rules.mk deleted file mode 100644 index f2fde785d..000000000 --- a/keyboards/handwired/xeal60/keymaps/cpeters1982/rules.mk +++ /dev/null @@ -1,8 +0,0 @@ - - - -ifndef QUANTUM_DIR - include ../../../../Makefile - AUTO_SHIFT_ENABLE = yes - RGBLIGHT_ENABLE = yes -endif diff --git a/keyboards/handwired/xeal60/keymaps/dlaroe/config.h b/keyboards/handwired/xeal60/keymaps/dlaroe/config.h deleted file mode 100644 index 6b31e8d14..000000000 --- a/keyboards/handwired/xeal60/keymaps/dlaroe/config.h +++ /dev/null @@ -1,37 +0,0 @@ -/* -This is the c configuration file for the keymap - -Copyright 2012 Jun Wako -Copyright 2015 Jack Humbert - -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 . -*/ - -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "config_common.h" - -/* Use I2C or Serial, not both */ - -#define USE_SERIAL -// #define USE_I2C - -/* Select hand configuration */ - -#define MASTER_LEFT -// #define MASTER_RIGHT -// #define EE_HANDS - -#endif diff --git a/keyboards/handwired/xeal60/keymaps/dlaroe/keymap.c b/keyboards/handwired/xeal60/keymaps/dlaroe/keymap.c deleted file mode 100644 index b2282e0fe..000000000 --- a/keyboards/handwired/xeal60/keymaps/dlaroe/keymap.c +++ /dev/null @@ -1,255 +0,0 @@ -// Can't Remember Sh*t Keymap for Let's Split -// Trying to fit as many characters as possible on the default layer -// as its easier for me to remember logical functions than characters -// Also, I like me some numpad - - -#include QMK_KEYBOARD_H - -extern keymap_config_t keymap_config; - -// Each layer gets a name for readability, which is then used in the keymap matrix below. -// The underscores don't mean anything - you can have a layer called STUFF or any other name. -// Layer names don't all need to be of the same length, obviously, and you can also skip them -// entirely and just use numbers. -#define _QWERTY 0 -#define _ARROW 1 -#define _GAME 2 -#define _LOWER 3 -#define _RAISE 4 -#define _PLOVER 5 -#define _ADJUST 16 - -enum custom_keycodes { - QWERTY = SAFE_RANGE, - ARROW, - GAME, - LOWER, - RAISE, - BACKLIT, - PLOVER, - EXT_PLV -}; - -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - -/* Qwerty - * ,-----------------------------------------------------------------------------------. - * | Esc | Q | W | E | R | T | Y | U | I | O | P | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Tab | A | S | D | F | G | H | J | K | L | ; | ' | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Ctrl | GUI | \ | Alt | Lower|SpcRse| Space|Raise | [ | - | = | ] | - * `-----------------------------------------------------------------------------------' - */ -[_QWERTY] = LAYOUT( \ - KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ - KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_ENT), \ - KC_LCTL, KC_LGUI, KC_BSLS, KC_LALT, LOWER, LT(4, KC_SPC), KC_SPC, RAISE, LT(3, KC_LBRC), KC_MINS, KC_EQL, CTL_T(KC_RBRC) \ -), - -/* Arrow - * ,-----------------------------------------------------------------------------------. - * | Esc | Q | W | E | R | T | Y | U | I | O | P | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Tab | A | S | D | F | G | H | J | K | L | ; | ' | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Ctrl | GUI | \ | Alt | Lower|SpcRse| Space|Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' - */ -[_ARROW] = LAYOUT( \ - KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ - KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_ENT), \ - KC_LCTL, KC_LGUI, KC_BSLS, KC_LALT, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT \ -), - -/* Game - * ,-----------------------------------------------------------------------------------. - * | 1 | Q | W | E | R | T | Y | U | I | O | P | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * |Shift | A | S | D | F | G | H | J | K | L | ; | ' | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Ctrl | Z | X | C | V | B | N | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Alt | 4 | 3 | 2 | Lower| Space |Raise | Left | Down | Up | Right| - * `-----------------------------------------------------------------------------------' - */ -[_GAME] = LAYOUT( \ - KC_1, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ - KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ - KC_LCTL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______ , \ - KC_LALT, KC_4, KC_3, KC_2, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT \ -), - - -/* Lower (switched to # because KP# were weird in terminal emulators) - * ,-----------------------------------------------------------------------------------. - * | Del | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Tab | F1 | F2 | F3 | F4 | F5 | F6 | 4 | 5 | 6 | . | * | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 | 1 | 2 | 3 | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Esc | | | | | | 0 | | | | KP_+ | | - * `-----------------------------------------------------------------------------------' - */ -[_LOWER] = LAYOUT( \ - KC_DEL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, \ - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_4, KC_5, KC_6, KC_DOT, KC_ASTR, \ - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_1, KC_2, KC_3, KC_SLSH, _______, \ - KC_ESC, _______, _______, _______, _______, _______, KC_0, _______, _______, _______, KC_PLUS, _______ \ -), - -/* Raise - * ,-----------------------------------------------------------------------------------. - * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Del | Wh Up|RightC| M-Up | LeftC|QWERTY| Left | Down | Up | Right| | | ` | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | Wh Dn| M-L | M-Dn | M-R | | - | = | [ | ] | \ | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | App | | | | | Ins | | Home | PGDN | PGUP | End | - * `-----------------------------------------------------------------------------------' - */ -[_RAISE] = LAYOUT( \ - KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \ - KC_DEL, KC_WH_U, KC_BTN2, KC_MS_U, KC_BTN1, QWERTY, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_PIPE, KC_GRV, \ - _______, KC_WH_D, KC_MS_L, KC_MS_D, KC_MS_R, _______, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLASH, _______, \ - _______, KC_APP, _______, _______, _______, _______, KC_INS, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END \ -), - -/* Plover layer (http://opensteno.org) - * ,-----------------------------------------------------------------------------------. - * | # | # | # | # | # | # | # | # | # | # | # | # | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | S | T | P | H | * | * | F | P | L | T | D | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | S | K | W | R | * | * | R | B | G | S | Z | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Exit | | | A | O | | E | U | | | | - * `-----------------------------------------------------------------------------------' - */ - -[_PLOVER] = LAYOUT ( \ - KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1 , \ - XXXXXXX, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, \ - XXXXXXX, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ - EXT_PLV, XXXXXXX, XXXXXXX, KC_C, KC_V, XXXXXXX, XXXXXXX, KC_N, KC_M, XXXXXXX, XXXXXXX, XXXXXXX \ -), - - -/* Adjust (Lower + Raise) - * ,-----------------------------------------------------------------------------------. - * | C-A-I|Qwerty| | |Reset |Macro0| | | | | |C-A-D | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | |Aud on|Audoff| Game |AGswap|AGnorm| | | | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | |Voice-|Voice+|Mus on|Musoff| Prev | Next | Mute | VolDn| VolUp| | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Brite| | | | | Play/Pause | | BL_T |BL_DEC|BL_INC|BL_ST | - * `-----------------------------------------------------------------------------------' - */ -[_ADJUST] = LAYOUT( \ - LALT(LCTL(KC_INS)), QWERTY, _______, _______, RESET, M(0), _______, _______, _______, _______, _______, LALT(LCTL(KC_DEL)), \ - _______, _______, _______, AU_ON, AU_OFF, GAME, AG_SWAP, AG_NORM, _______, _______, _______, _______, \ - _______, MUV_DE, MUV_IN, MU_ON, MU_OFF, KC_MPRV, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, \ - BACKLIT, _______, _______, _______, _______, KC_MPLY, KC_MPLY, _______, BL_TOGG, BL_DEC , BL_INC , BL_STEP \ -) - - -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) // this is the function signature -- just copy/paste it into your keymap file as it is. -{ - switch(id) { - case 0: // this would trigger when you hit a key mapped as M(0) - if (record->event.pressed) { - return MACRO( D(LSFT), T(LEFT), U(LSFT), D(LCTL), T(X), U(LCTL), T(RIGHT), D(LCTL), T(V), U(LCTL), T(LEFT), END ); // this swaps the characters on either side of the cursor when the macro executes - } - break; - } - return MACRO_NONE; -}; - - -#ifdef AUDIO_ENABLE -float tone_qwerty[][2] = SONG(QWERTY_SOUND); -float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); -#endif - - -void persistant_default_layer_set(uint16_t default_layer) { - eeconfig_update_default_layer(default_layer); - default_layer_set(default_layer); -} - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case QWERTY: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_qwerty); - #endif - persistant_default_layer_set(1UL<<_QWERTY); - } - return false; - break; - case GAME: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(music_scale); - #endif - persistant_default_layer_set(1UL<<_GAME); - } - return false; - break; - - - case LOWER: - if (record->event.pressed) { - layer_on(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case RAISE: - if (record->event.pressed) { - layer_on(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case BACKLIT: - if (record->event.pressed) { - register_code(KC_RSFT); - #ifdef BACKLIGHT_ENABLE - backlight_step(); - #endif - } else { - unregister_code(KC_RSFT); - } - return false; - break; - } - return true; -} - -void matrix_init_user(void) { - -} diff --git a/keyboards/handwired/xeal60/keymaps/dlaroe/rules.mk b/keyboards/handwired/xeal60/keymaps/dlaroe/rules.mk deleted file mode 100644 index e69de29bb..000000000 diff --git a/keyboards/handwired/xeal60/keymaps/drashna/config.h b/keyboards/handwired/xeal60/keymaps/drashna/config.h deleted file mode 100644 index 5bc5598ee..000000000 --- a/keyboards/handwired/xeal60/keymaps/drashna/config.h +++ /dev/null @@ -1,80 +0,0 @@ -/* -Copyright 2017 Danny Nguyen - -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 . -*/ - -#pragma once - -#ifdef RGBLIGHT_ENABLE -#undef RGBLED_NUM -#define RGBLIGHT_ANIMATIONS -#define RGBLED_NUM 16 -#define RGBLIGHT_HUE_STEP 8 -#define RGBLIGHT_SAT_STEP 8 -#define RGBLIGHT_VAL_STEP 8 -#define RGBLIGHT_EFFECT_KNIGHT_LENGTH 2 -#define RGBLIGHT_EFFECT_SNAKE_LENGTH 2 -#define RGBLIGHT_EFFECT_BREATHE_CENTER 1 -#define RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL 300 -#define RGBLIGHT_EFFECT_CHRISTMAS_STEP 1 -#endif // RGBLIGHT_ENABLE - - -#undef LOCKING_SUPPORT_ENABLE -#undef LOCKING_RESYNC_ENABLE - -#ifndef NO_DEBUG -#define NO_DEBUG -#endif // !NO_DEBUG -#ifndef NO_PRINT -#define NO_PRINT -#endif // !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 - -#undef PRODUCT -#define PRODUCT Drashnas Viterbi Macro Pad - -#define USE_I2C - -#ifdef AUDIO_ENABLE -#define C6_AUDIO -#define NO_MUSIC_MODE -#endif - -#define LAYOUT_ortho_5x7( \ - L00, L01, L02, L03, L04, L05, L06, \ - L10, L11, L12, L13, L14, L15, L16, \ - L20, L21, L22, L23, L24, L25, L26, \ - L30, L31, L32, L33, L34, L35, L36, \ - L40, L41, L42, L43, L44, L45, L46 \ - ) \ - LAYOUT( \ - L00, L01, L02, L03, L04, L05, L06, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ - L10, L11, L12, L13, L14, L15, L16, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ - L20, L21, L22, L23, L24, L25, L26, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ - L30, L31, L32, L33, L34, L35, L36, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ - L40, L41, L42, L43, L44, L45, L46, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO \ - ) - -#define QMK_ESC_OUTPUT F5 // usually COL -#define QMK_ESC_INPUT D4 // usually ROW -#define QMK_LED B0 -#define QMK_SPEAKER C6 diff --git a/keyboards/handwired/xeal60/keymaps/drashna/keymap.c b/keyboards/handwired/xeal60/keymaps/drashna/keymap.c deleted file mode 100644 index 68ca593db..000000000 --- a/keyboards/handwired/xeal60/keymaps/drashna/keymap.c +++ /dev/null @@ -1,98 +0,0 @@ -#include QMK_KEYBOARD_H -#include "drashna.h" - -extern keymap_config_t keymap_config; - -// Each layer gets a name for readability, which is then used in the keymap matrix below. -// The underscores don't mean anything - you can have a layer called STUFF or any other name. -// Layer names don't all need to be of the same length, obviously, and you can also skip them -// entirely and just use numbers. - - -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO - -#define LMACRO TG(_MACROS) -#define DIABLO TG(_DIABLO) -#define GAMEPAD TG(_GAMEPAD) -#define MEDIA TT(_MEDIA) - - -//enum more_custom_keycodes { -// KC_P00 = NEW_SAFE_RANGE -//}; - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - - [_NUMLOCK] = LAYOUT_ortho_5x7( - LMACRO, DIABLO, GAMEPAD, KC_NLCK, KC_SLCK, KC_COLN, KC_PSLS, - MEDIA, KC_CALC, XXXXXXX, KC_P7, KC_P8, KC_P9, KC_PAST, - KC_HOME, KC_DEL, KC_PGUP, KC_P4, KC_P5, KC_P6, KC_PMNS, - KC_END, KC_UP, KC_PGDN, KC_P1, KC_P2, KC_P3, KC_PPLS, - KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_COLN, KC_PENT - ), - - [_DIABLO] = LAYOUT_ortho_5x7( - KC_ESC, DIABLO, KC_V, KC_D, XXXXXXX, XXXXXXX, KC_L, - KC_TAB, KC_S, KC_F, KC_I, KC_M, KC_T, KC_J, - KC_Q, KC_1, KC_2, KC_3, KC_4, KC_G, KC_F, - KC_LCTL, KC_D3_3, KC_D3_3, KC_D3_3, KC_D3_3, KC_Z, KC_DIABLO_CLEAR, - KC_LALT, KC_F4, KC_F5, KC_F8, KC_F9, KC_F10, SFT_T(KC_SPACE) - ), - - [_GAMEPAD] = LAYOUT_ortho_5x7( // Game pad layout designed primarily for Overwatch - LMACRO, KC_ESC, GAMEPAD, KC_1, KC_2, KC_3, KC_4, - MEDIA, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, - KC_Z, KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, - KC_Y, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, - KC_F1, KC_U, KC_I, KC_Y, KC_V, KC_SPC, KC_V - ), - - [_MACROS] = LAYOUT_ortho_5x7( - LMACRO, KC_OVERWATCH,GAMEPAD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - KC_C9, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - KC_SYMM, KC_TORB, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - KC_GLHF, KC_GOODGAME, KC_GGEZ, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - KC_SALT, KC_MORESALT, KC_SALTHARD, KC_JUSTGAME, KC_AIM, XXXXXXX, KC_PENT - ), - - - [_MEDIA] = LAYOUT_ortho_5x7( - KC_MAKE, KC_RESET,MU_TOG, AU_ON, AU_OFF, CK_TOGG, RGB_SAD, - MEDIA, EPRM, KC_RGB_T,RGB_M_P, RGB_M_B, RGB_M_R, RGB_SAI, - RGB_TOG, RGB_MOD, RGB_RMOD,RGB_M_SW,RGB_M_SN,RGB_M_K, RGB_HUD, - KC_MPLY, KC_MPRV, KC_MNXT, RGB_M_X, RGB_M_G, RGB_M_P, RGB_HUI, - KC_MUTE, KC_VOLD, KC_VOLU, XXXXXXX, XXXXXXX, RGB_VAD, RGB_VAI - ) - - -}; - - - -bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { - - //switch (keycode) { - //case KC_P00: - // if (!record->event.pressed) { - // tap(KC_KP_0); - // tap(KC_KP_0); - // } - // return false; - // break; - //} - return true; -} - - - -void matrix_init_keymap(void) { - DDRD &= ~(1<<5); - PORTD &= ~(1<<5); - - DDRB &= ~(1<<0); - PORTB &= ~(1<<0); -} - - diff --git a/keyboards/handwired/xeal60/keymaps/drashna/rules.mk b/keyboards/handwired/xeal60/keymaps/drashna/rules.mk deleted file mode 100644 index ec3befc0b..000000000 --- a/keyboards/handwired/xeal60/keymaps/drashna/rules.mk +++ /dev/null @@ -1,25 +0,0 @@ -BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = no # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = no # Console for debug(+400) -COMMAND_ENABLE = no # Commands for debug and configuration -TAP_DANCE_ENABLE = no -RGBLIGHT_ENABLE = yes -AUDIO_ENABLE = yes -NKRO_ENABLE = yes - -NO_SECRETS = yes -MACROS_ENABLED = yes -INDICATOR_LIGHTS = no -RGBLIGHT_TWINKLE = no - -LAYOUTS = ortho_5x7 - -# SRC := $(filter-out serial.c matrix.c i2c.c split_util.c,$(SRC)) -# SRC := $(filter-out serial.c,$(SRC)) -# SRC := $(filter-out matrix.c,$(SRC)) -# SRC := $(filter-out i2c.c,$(SRC)) -# SRC := $(filter-out split_util.c,$(SRC)) -# SRC += quantum/matrix.c - -BOOTLOADER = qmk-dfu diff --git a/keyboards/handwired/xeal60/keymaps/drashna_old/config.h b/keyboards/handwired/xeal60/keymaps/drashna_old/config.h deleted file mode 100644 index ddf9d1a40..000000000 --- a/keyboards/handwired/xeal60/keymaps/drashna_old/config.h +++ /dev/null @@ -1,86 +0,0 @@ -/* -Copyright 2017 Danny Nguyen - -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 . -*/ - -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include QMK_KEYBOARD_CONFIG_H - - -#ifdef RGBLIGHT_ENABLE -#undef RGBLED_NUM -#define RGBLIGHT_ANIMATIONS -#define RGBLED_NUM 12 -#define RGBLIGHT_HUE_STEP 8 -#define RGBLIGHT_SAT_STEP 8 -#define RGBLIGHT_VAL_STEP 8 -#define RGBLIGHT_EFFECT_KNIGHT_LENGTH 2 -#define RGBLIGHT_EFFECT_SNAKE_LENGTH 2 -#define RGBLIGHT_EFFECT_BREATHE_CENTER 1 -#define RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL 300 -#define RGBLIGHT_EFFECT_CHRISTMAS_STEP 1 -#endif // RGBLIGHT_ENABLE - - -#undef LOCKING_SUPPORT_ENABLE -#undef LOCKING_RESYNC_ENABLE - -#ifndef NO_DEBUG -#define NO_DEBUG -#endif // !NO_DEBUG -#ifndef NO_PRINT -#define NO_PRINT -#endif // !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 - -#undef PRODUCT -#define PRODUCT Drashnas Viterbi Macro Pad - -#define USE_I2C - -#ifdef AUDIO_ENABLE -#define C6_AUDIO -#define NO_MUSIC_MODE -#endif - -#define LAYOUT_ortho_5x7( \ - L00, L01, L02, L03, L04, L05, L06, \ - L10, L11, L12, L13, L14, L15, L16, \ - L20, L21, L22, L23, L24, L25, L26, \ - L30, L31, L32, L33, L34, L35, L36, \ - L40, L41, L42, L43, L44, L45, L46 \ - ) \ - LAYOUT( \ - L00, L01, L02, L03, L04, L05, L06, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ - L10, L11, L12, L13, L14, L15, L16, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ - L20, L21, L22, L23, L24, L25, L26, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ - L30, L31, L32, L33, L34, L35, L36, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ - L40, L41, L42, L43, L44, L45, L46, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO \ - ) - -#endif - -#define QMK_ESC_OUTPUT F5 // usually COL -#define QMK_ESC_INPUT D4 // usually ROW -#define QMK_LED B0 -#define QMK_SPEAKER C6 diff --git a/keyboards/handwired/xeal60/keymaps/drashna_old/keymap.c b/keyboards/handwired/xeal60/keymaps/drashna_old/keymap.c deleted file mode 100644 index 2d361da9a..000000000 --- a/keyboards/handwired/xeal60/keymaps/drashna_old/keymap.c +++ /dev/null @@ -1 +0,0 @@ -//placeholder \ No newline at end of file diff --git a/keyboards/handwired/xeal60/keymaps/drashna_old/rules.mk b/keyboards/handwired/xeal60/keymaps/drashna_old/rules.mk deleted file mode 100644 index 14ac6a6b3..000000000 --- a/keyboards/handwired/xeal60/keymaps/drashna_old/rules.mk +++ /dev/null @@ -1,28 +0,0 @@ -BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = no # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = no # Console for debug(+400) -COMMAND_ENABLE = no # Commands for debug and configuration -TAP_DANCE_ENABLE = no -RGBLIGHT_ENABLE = yes -AUDIO_ENABLE = yes -NKRO_ENABLE = yes - -NO_SECRETS = yes -MACROS_ENABLED = yes -INDICATOR_LIGHTS = no -RGBLIGHT_TWINKLE = no - -LAYOUTS = ortho_5x7 - -# SRC := $(filter-out serial.c matrix.c i2c.c split_util.c,$(SRC)) -# SRC := $(filter-out serial.c,$(SRC)) -# SRC := $(filter-out matrix.c,$(SRC)) -# SRC := $(filter-out i2c.c,$(SRC)) -# SRC := $(filter-out split_util.c,$(SRC)) -# SRC += quantum/matrix.c - -USER_NAME := drashna -SRC += ../drashna/keymap.c - -BOOTLOADER = qmk-dfu diff --git a/keyboards/handwired/xeal60/keymaps/dwallace/config.h b/keyboards/handwired/xeal60/keymaps/dwallace/config.h deleted file mode 100644 index 585b41dbc..000000000 --- a/keyboards/handwired/xeal60/keymaps/dwallace/config.h +++ /dev/null @@ -1,43 +0,0 @@ -/* -Copyright 2017 Danny Nguyen - -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 . -*/ - -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -/* Use I2C or Serial, not both */ - -#define USE_SERIAL -// #define USE_I2C - -/* Select hand configuration */ - -#define MASTER_LEFT -// #define MASTER_RIGHT -// #define EE_HANDS - -#define TAPPING_TERM 150 - -#undef RGBLED_NUM -#define RGBLIGHT_ANIMATIONS -#define RGBLED_NUM 14 -#define RGBLIGHT_HUE_STEP 8 -#define RGBLIGHT_SAT_STEP 8 -#define RGBLIGHT_VAL_STEP 8 - -#endif diff --git a/keyboards/handwired/xeal60/keymaps/dwallace/keymap.c b/keyboards/handwired/xeal60/keymaps/dwallace/keymap.c deleted file mode 100644 index 241024482..000000000 --- a/keyboards/handwired/xeal60/keymaps/dwallace/keymap.c +++ /dev/null @@ -1,224 +0,0 @@ -#include "viterbi.h" -#include "action_layer.h" -#include "eeconfig.h" -#ifdef RGBLIGHT_ENABLE -#include "rgblight.h" -#endif - -extern keymap_config_t keymap_config; - -#define _QWERTY 0 -#define _FN 1 - -enum custom_keycodes { - QWERTY = SAFE_RANGE, - STK_SHIFT, - STK_CTRL, - STK_ALT, - STK_GUI, - STK_META, - STK_CLEAR, - RGB_LEVEL_UP, - RGB_LEVEL_DOWN, -}; - -#define KC_ KC_TRNS -#define _______ KC_TRNS - -#define KC_SWIN LGUI(KC_TILD) // Switch between windows -#define KC_SAPP LGUI(KC_TAB) // Switch between applications -#define KC_FN1 MO(_FN) -#define KC_LCAG LCAG(KC_NO) -#define KC_RTOG RGB_TOG -#define KC_RGUP RGB_LEVEL_UP -#define KC_RGDN RGB_LEVEL_DOWN -#define KC_RST RESET -#define KC_SSFT STK_SHIFT -#define KC_SCTL STK_CTRL -#define KC_SALT STK_ALT -#define KC_SGUI STK_GUI -#define KC_SMTA STK_META -#define KC_SCLR STK_CLEAR - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - - [_QWERTY] = LAYOUT_kc( - //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. - GRV , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,MINS,EQL ,BSPC, - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - TAB , Q , W , E , R , T ,LBRC, Y , U , I , O , P ,BSLS,PGUP, - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - ESC , A , S , D , F , G ,RBRC, H , J , K , L ,SCLN,QUOT,ENT , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - SSFT, Z , X , C , V , B ,SWIN, N , M ,COMM,DOT , UP ,SLSH,RSFT, - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - SCTL,SMTA,SALT,SGUI,SPC ,SCLR,SAPP, FN1 ,SPC ,RGUI,LEFT,DOWN,RGHT,PGDN - //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' - ), - - [_FN] = LAYOUT_kc( - //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. - , F1 , F2 , F3 , F4 , F5 , F6 , F7 , F8 , F9 ,F10 ,F11 ,F12 , , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , , , ,RST , , , , , , , , , , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , , , , , , , RTOG, ,RGDN,RGUP, , , , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , , , , , , , ,MUTE,VOLD,VOLU, , , , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , , , , , , , , , , , , , - //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' - ) - -}; - -#ifdef AUDIO_ENABLE -float tone_qwerty[][2] = SONG(QWERTY_SOUND); -#endif - -void persistent_default_layer_set(uint16_t default_layer) { - eeconfig_update_default_layer(default_layer); - default_layer_set(default_layer); -} - -bool modifier_already_applied = false; -uint8_t physically_held_modifiers = 0; -uint8_t last_mods = 0xFF; -uint8_t rgb_dimming = 0; -#define SET_LED_RGB(val, led_num) setrgb(((val >> 16) & 0xFF) >> rgb_dimming, ((val >> 8) & 0xFF) >> rgb_dimming, (val & 0xFF) >> rgb_dimming, (LED_TYPE *)&led[led_num]) - -void update_underglow_level(void) { - if (get_mods() == last_mods) - return; - - last_mods = get_mods(); - - if (get_mods() == 0) { - uint8_t level = 0x10 >> rgb_dimming; - rgblight_setrgb(level, level, level); - return; - } - - uint32_t mod_colors[4] = {0}; - uint8_t mod_count = 0; - rgblight_setrgb(0x00, 0x00, 0x00); - - if (get_mods() & MOD_BIT(KC_LSFT)) - mod_colors[mod_count++] = 0xFF0000; - if (get_mods() & MOD_BIT(KC_LCTL)) - mod_colors[mod_count++] = 0x00FF00; - if (get_mods() & MOD_BIT(KC_LALT)) - mod_colors[mod_count++] = 0x0000FF; - if (get_mods() & MOD_BIT(KC_LGUI)) - mod_colors[mod_count++] = 0xFFFF00; - - uint8_t led_num = 0; - for (int m = 0; m < mod_count; m++) { - for (; led_num < RGBLED_NUM*(m+1)/mod_count; led_num++) { - SET_LED_RGB(mod_colors[m], led_num); - } - } - rgblight_set(); -} - -void add_sticky_modifier(uint16_t keycode) { - add_mods(MOD_BIT(keycode)); - register_code(keycode); - modifier_already_applied = false; -} - -void clear_sticky_modifiers(void) { - unregister_code(KC_LSFT); - unregister_code(KC_LCTL); - unregister_code(KC_LALT); - unregister_code(KC_LGUI); - update_underglow_level(); -} - -void handle_sticky_modifier_event(uint16_t keycode, bool pressed) { - if (pressed) { - add_sticky_modifier(keycode); - physically_held_modifiers |= MOD_BIT(keycode); - } else { - del_mods(MOD_BIT(keycode)); - physically_held_modifiers &= ~MOD_BIT(keycode); - if (modifier_already_applied) { - clear_sticky_modifiers(); - } else { - add_sticky_modifier(keycode); - } - } - update_underglow_level(); -} - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case QWERTY: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_NOTE_ARRAY(tone_qwerty, false, 0); - #endif - persistent_default_layer_set(1UL<<_QWERTY); - } - return false; - break; - case STK_SHIFT: - handle_sticky_modifier_event(KC_LSFT, record->event.pressed); - return false; - break; - case STK_CTRL: - handle_sticky_modifier_event(KC_LCTL, record->event.pressed); - return false; - break; - case STK_ALT: - handle_sticky_modifier_event(KC_LALT, record->event.pressed); - return false; - break; - case STK_GUI: - handle_sticky_modifier_event(KC_LGUI, record->event.pressed); - return false; - break; - case STK_META: - handle_sticky_modifier_event(KC_LCTL, record->event.pressed); - handle_sticky_modifier_event(KC_LALT, record->event.pressed); - handle_sticky_modifier_event(KC_LGUI, record->event.pressed); - return false; - break; - case STK_CLEAR: - if (record->event.pressed) { - clear_sticky_modifiers(); - } - return false; - break; - case RGB_LEVEL_DOWN: - if (record->event.pressed && rgb_dimming < 8) { - rgb_dimming++; - } - return false; - break; - case RGB_LEVEL_UP: - if (record->event.pressed && rgb_dimming > 0) { - rgb_dimming--; - } - return false; - break; - } - if (!record->event.pressed && IS_KEY(keycode)) { - modifier_already_applied = true; - if (physically_held_modifiers == 0) - clear_sticky_modifiers(); - } - return true; -} - -void matrix_init_user(void) { - #ifdef RGBLIGHT_ENABLE - rgblight_enable(); - #endif //RGBLIGHT_ENABLE -} - -void matrix_scan_user(void) { - #ifdef RGBLIGHT_ENABLE - update_underglow_level(); - #endif //RGBLIGHT_ENABLE -} diff --git a/keyboards/handwired/xeal60/keymaps/dwallace/rules.mk b/keyboards/handwired/xeal60/keymaps/dwallace/rules.mk deleted file mode 100644 index 1e3cebb14..000000000 --- a/keyboards/handwired/xeal60/keymaps/dwallace/rules.mk +++ /dev/null @@ -1 +0,0 @@ -RGBLIGHT_ENABLE = yes diff --git a/keyboards/handwired/xeal60/keymaps/fabian/config.h b/keyboards/handwired/xeal60/keymaps/fabian/config.h deleted file mode 100644 index 6ae40cc2b..000000000 --- a/keyboards/handwired/xeal60/keymaps/fabian/config.h +++ /dev/null @@ -1,34 +0,0 @@ -/* -Copyright 2012 Jun Wako - -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 . -*/ - - -#define USE_SERIAL - -#define MASTER_LEFT -// #define MASTER_RIGHT -// #define EE_HANDS - - -#ifdef SUBPROJECT_rev1 - #include "../../rev1/config.h" -#endif -#ifdef SUBPROJECT_rev2 - #include "../../rev2/config.h" -#endif -#ifdef SUBPROJECT_rev2fliphalf - #include "../../rev2fliphalf/config.h" -#endif diff --git a/keyboards/handwired/xeal60/keymaps/fabian/keymap.c b/keyboards/handwired/xeal60/keymaps/fabian/keymap.c deleted file mode 100644 index 37053a8e4..000000000 --- a/keyboards/handwired/xeal60/keymaps/fabian/keymap.c +++ /dev/null @@ -1,271 +0,0 @@ -/* Copyright 2015-2017 Jack Humbert - * - * 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 . - */ - -#include QMK_KEYBOARD_H - - -extern keymap_config_t keymap_config; - -enum custom_layers { - _QWERTY, - _COLEMAK, - _DVORAK, - _LOWER, - _RAISE, - _PLOVER, - _ADJUST -}; - -enum custom_keycodes { - QWERTY = SAFE_RANGE, - COLEMAK, - DVORAK, - PLOVER, - LOWER, - RAISE, - BACKLIT, - EXT_PLV, -}; - -#define XXXXXXX KC_NO -#define _______ KC_TRNS - -#define CTL_ESC CTL_T(KC_ESC) // Tap for Escape, hold for Control -#define HPR_TAB ALL_T(KC_TAB) // Tap for Tab, hold for Hyper (Super+Ctrl+Alt+Shift) -#define MEH_GRV MEH_T(KC_GRV) // Tap for Backtick, hold for Meh (Ctrl+Alt+Shift) -#define SFT_BSP SFT_T(KC_BSPC) // Tap for Backspace, hold for Shift -#define SFT_ENT SFT_T(KC_ENT) // Tap for Enter, hold for Shift -#define SFT_SPC SFT_T(KC_SPC) // Tap for Space, hold for Shift -#define UMLAUT RALT(KC_U) // Combine Alt and U - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - -/* Qwerty - * ,-----------------------------------------------------------------------------------. - * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | S | D | F | G | H | J | K | L | ; | " | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Ctrl | Meh | Alt | GUI |Lower |Space | Tab |Raise | GUI |AltGr | Umlt | Ctrl | - * `-----------------------------------------------------------------------------------' - */ -[_QWERTY] = LAYOUT( \ - HPR_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ - CTL_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ - SFT_BSP, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_ENT , \ - KC_LCTL, MEH_GRV, KC_LALT, KC_LGUI, LOWER, KC_SPC, HPR_TAB, RAISE, KC_RGUI, KC_RALT, UMLAUT, KC_RCTL \ -), - -/* Colemak - * ,-----------------------------------------------------------------------------------. - * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | R | S | T | D | H | N | E | I | O | " | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Ctrl | Meh | Alt | GUI |Lower |Space | Tab |Raise | GUI |AltGr | Umlt | Ctrl | - * `-----------------------------------------------------------------------------------' - */ -[_COLEMAK] = LAYOUT( \ - HPR_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, \ - CTL_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \ - SFT_BSP, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_ENT , \ - KC_LCTL, MEH_GRV, KC_LALT, KC_LGUI, LOWER, KC_SPC, HPR_TAB, RAISE, KC_RGUI, KC_RALT, UMLAUT, KC_RCTL \ -), - -/* Dvorak - * ,-----------------------------------------------------------------------------------. - * | Tab | " | , | . | P | Y | F | G | C | R | L | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | O | E | U | I | D | H | T | N | S | / | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Ctrl | Meh | Alt | GUI |Lower |Space | Tab |Raise | GUI |AltGr | Umlt | Ctrl | - * `-----------------------------------------------------------------------------------' - */ -[_DVORAK] = LAYOUT( \ - HPR_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, \ - CTL_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, \ - SFT_BSP, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, SFT_ENT , \ - KC_LCTL, MEH_GRV, KC_LALT, KC_LGUI, LOWER, KC_SPC, HPR_TAB, RAISE, KC_RGUI, KC_RALT, UMLAUT, KC_RCTL \ -), - -/* Lower - * ,-----------------------------------------------------------------------------------. - * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 | MS L | MS D |MS U | MS R |MS Btn| - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | Next | Vol- | Vol+ | Play | - * `-----------------------------------------------------------------------------------' - */ -[_LOWER] = LAYOUT( \ - KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \ - KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, KC_BTN1, \ - _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ -), - -/* Raise - * ,-----------------------------------------------------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 | Left | Down | Up | Rght |MS_BN2| - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | Next | Vol- | Vol+ | Play | - * `-----------------------------------------------------------------------------------' - */ -[_RAISE] = LAYOUT( \ - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ - KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_BTN2, \ - _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ -), - -/* Plover layer (http://opensteno.org) - * ,-----------------------------------------------------------------------------------. - * | # | # | # | # | # | # | # | # | # | # | # | # | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | S | T | P | H | * | * | F | P | L | T | D | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | S | K | W | R | * | * | R | B | G | S | Z | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Exit | | | A | O | | | E | U | | | | - * `-----------------------------------------------------------------------------------' - */ - -[_PLOVER] = LAYOUT( \ - KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, \ - XXXXXXX, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, \ - XXXXXXX, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ - EXT_PLV, XXXXXXX, XXXXXXX, KC_C, KC_V, XXXXXXX, XXXXXXX, KC_N, KC_M, XXXXXXX, XXXXXXX, XXXXXXX \ -), - -/* Adjust (Lower + Raise) - * ,-----------------------------------------------------------------------------------. - * | | Reset| | | | | | | | | Reset| Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak|Plover| | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof| | | | | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | | | - * `-----------------------------------------------------------------------------------' - */ -[_ADJUST] = LAYOUT( \ - _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, RESET, KC_DEL , \ - _______, _______, MU_MOD, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, PLOVER, _______, \ - _______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ -) - -}; - -#ifdef AUDIO_ENABLE - float plover_song[][2] = SONG(PLOVER_SOUND); - float plover_gb_song[][2] = SONG(PLOVER_GOODBYE_SOUND); -#endif - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case QWERTY: - if (record->event.pressed) { - set_single_persistent_default_layer(_QWERTY); - } - return false; - break; - case COLEMAK: - if (record->event.pressed) { - set_single_persistent_default_layer(_COLEMAK); - } - return false; - break; - case DVORAK: - if (record->event.pressed) { - set_single_persistent_default_layer(_DVORAK); - } - return false; - break; - case LOWER: - if (record->event.pressed) { - layer_on(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case RAISE: - if (record->event.pressed) { - layer_on(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case BACKLIT: - if (record->event.pressed) { - register_code(KC_RSFT); - #ifdef BACKLIGHT_ENABLE - backlight_step(); - #endif - } else { - unregister_code(KC_RSFT); - } - return false; - break; - case PLOVER: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - stop_all_notes(); - PLAY_SONG(plover_song); - #endif - layer_off(_RAISE); - layer_off(_LOWER); - layer_off(_ADJUST); - layer_on(_PLOVER); - if (!eeconfig_is_enabled()) { - eeconfig_init(); - } - keymap_config.raw = eeconfig_read_keymap(); - keymap_config.nkro = 1; - eeconfig_update_keymap(keymap_config.raw); - } - return false; - break; - case EXT_PLV: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(plover_gb_song); - #endif - layer_off(_PLOVER); - } - return false; - break; - } - return true; -} diff --git a/keyboards/handwired/xeal60/keymaps/fabian/rules.mk b/keyboards/handwired/xeal60/keymaps/fabian/rules.mk deleted file mode 100644 index b8c82cb99..000000000 --- a/keyboards/handwired/xeal60/keymaps/fabian/rules.mk +++ /dev/null @@ -1,9 +0,0 @@ -# Build Options -# change to "no" to disable the options, or define them in the Makefile in -# the appropriate keymap folder that will get included automatically -# -# UNICODE_ENABLE = yes - -ifndef QUANTUM_DIR - include ../../../../Makefile -endif diff --git a/keyboards/handwired/xeal60/keymaps/fido/config.h b/keyboards/handwired/xeal60/keymaps/fido/config.h deleted file mode 100644 index 5cb108365..000000000 --- a/keyboards/handwired/xeal60/keymaps/fido/config.h +++ /dev/null @@ -1,45 +0,0 @@ -/* -Copyright 2018 Danny Nguyen - -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 . -*/ - -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -/* Use I2C or Serial, not both */ - -#define USE_SERIAL -// #define USE_I2C - -/* Select hand configuration */ - -#define MASTER_LEFT -#ifndef MASTER_LEFT - #define MASTER_RIGHT -#endif -// #define EE_HANDS - -#define TAPPING_TERM 150 - -#undef RGBLED_NUM -#define RGBLIGHT_ANIMATIONS -#define RGBLED_NUM 2 -#define RGBLIGHT_HUE_STEP 8 -#define RGBLIGHT_SAT_STEP 8 -#define RGBLIGHT_VAL_STEP 8 - -#endif diff --git a/keyboards/handwired/xeal60/keymaps/fido/keymap.c b/keyboards/handwired/xeal60/keymaps/fido/keymap.c deleted file mode 100644 index b8ef46008..000000000 --- a/keyboards/handwired/xeal60/keymaps/fido/keymap.c +++ /dev/null @@ -1,74 +0,0 @@ -#include "viterbi.h" -#include "action_layer.h" -#include "eeconfig.h" -#ifdef RGBLIGHT_ENABLE -#include "rgblight.h" -#endif - -extern keymap_config_t keymap_config; - -#define _QWERTY 0 -#define _FN 1 - -#define KC_ KC_TRNS -#define _______ KC_TRNS - -#define KC_FN1 MO(_FN) -#define KC_WD_L LCTL(KC_LEFT) -#define KC_WD_R LCTL(KC_RGHT) -#define KC_RTOG RGB_TOG -#define KC_RMOD RGB_MOD -#define KC_RHUI RGB_HUI -#define KC_RHUD RGB_HUD -#define KC_RSAI RGB_SAI -#define KC_RSAD RGB_SAD -#define KC_RVAI RGB_VAI -#define KC_RVAD RGB_VAD -#define KC_RST RESET -#define KC_CTLZ LCTL(KC_Z) -#define KC_CTLX LCTL(KC_X) -#define KC_CTLC LCTL(KC_C) -#define KC_CTLV LCTL(KC_V) -#define KC_ATAB LALT(KC_TAB) - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - - [_QWERTY] = LAYOUT_kc( - //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. - 1 , 2 , 3 , 4 , 5 , 6 ,ESC , DEL , 7 , 8 , 9 , 0 ,MINS,EQL , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - RBRC, Q , W , E , R , T ,TAB , BSPC, Y , U , I , O , P ,LBRC, - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - GRV , A , S , D , F , G ,LALT, CAPS, H , J , K , L ,SCLN,QUOT, - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - BSLS, Z , X , C , V , B ,LSFT, RSFT, N , M ,COMM,DOT ,SLSH,ENT , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - INS ,PSCR,MENU,LGUI,LCTL,SPC ,FN1 , FN1 ,SPC ,RCTL,RALT, , , - //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' - ), - - [_FN] = LAYOUT_kc( - //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. - F1 , F2 , F3 , F4 , F5 , F6 , , , F7 , F8 , F9 ,F10 ,F11 ,F12 , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - ,PGUP,WD_L, UP ,WD_R, ,ATAB, ,RMOD,RHUI,RSAI,RVAI, , , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - ,HOME,LEFT,DOWN,RGHT, , , , ,RHUD,RSAD,RVAD, , , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - ,CTLZ,CTLX,CTLC,CTLV, , , ,MUTE,VOLD,VOLU, , , , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , , , , , , , , , , , , , - //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' - ) - -}; - -void led_set_user(uint8_t usb_led) { - #ifdef RGBLIGHT_ENABLE - if (usb_led & (1 << USB_LED_CAPS_LOCK)) { - rgblight_enable(); - } else { - rgblight_disable(); - } - #endif //RGBLIGHT_ENABLE -} diff --git a/keyboards/handwired/xeal60/keymaps/fido/rules.mk b/keyboards/handwired/xeal60/keymaps/fido/rules.mk deleted file mode 100644 index 1e3cebb14..000000000 --- a/keyboards/handwired/xeal60/keymaps/fido/rules.mk +++ /dev/null @@ -1 +0,0 @@ -RGBLIGHT_ENABLE = yes diff --git a/keyboards/handwired/xeal60/keymaps/heartrobotninja/config.h b/keyboards/handwired/xeal60/keymaps/heartrobotninja/config.h deleted file mode 100644 index bb3556e57..000000000 --- a/keyboards/handwired/xeal60/keymaps/heartrobotninja/config.h +++ /dev/null @@ -1,58 +0,0 @@ -/* -This is the c configuration file for the keymap - -Copyright 2012 Jun Wako -Copyright 2015 Jack Humbert - -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 . -*/ - -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -/* Use I2C or Serial, not both */ - -#define USE_SERIAL - -/* Select hand configuration */ - -// #define MASTER_LEFT -// #define MASTER_RIGHT -#define EE_HANDS - -#define ONESHOT_TAP_TOGGLE 2 -#define ONESHOT_TIMEOUT 1000 - -#undef LEADER_TIMEOUT -#define LEADER_TIMEOUT 1000 - -#undef TAPPING_TERM -#define TAPPING_TERM 200 - -#undef TAPPING_TOGGLE -#define TAPPING_TOGGLE 2 - -#ifdef SUBPROJECT_rev1 -#include "../../rev1/config.h" -#endif -#ifdef SUBPROJECT_rev2 -#include "../../rev2/config.h" -#endif -#ifdef SUBPROJECT_rev2fliphalf -#include "../../rev2fliphalf/config.h" -#endif - -#endif \ No newline at end of file diff --git a/keyboards/handwired/xeal60/keymaps/heartrobotninja/keymap.c b/keyboards/handwired/xeal60/keymaps/heartrobotninja/keymap.c deleted file mode 100644 index 3a7ef9db3..000000000 --- a/keyboards/handwired/xeal60/keymaps/heartrobotninja/keymap.c +++ /dev/null @@ -1,180 +0,0 @@ -#include QMK_KEYBOARD_H - - -extern keymap_config_t keymap_config; - -// Each layer gets a name for readability, which is then used in the keymap matrix below. -// The underscores don't mean anything - you can have a layer called STUFF or any other name. -// Layer names don't all need to be of the same length, obviously, and you can also skip them -// entirely and just use numbers. -#define _COLE 0 -#define _LOWER 1 -#define _RAISE 2 -#define _AUX 16 - -/* Layers */ -enum -{ - COLE = 0, - LOWER, // right hand 10 key. - RAISE, // left hand Fn, right hand symbols. - AUX, -}; - -/* Tap Dancery */ -enum -{ - TD_BTK, - TD_TDE, - TD_LPRN, - TD_RPRN, - TD_MIN, - TD_USC, -}; - -bool time_travel = false; - -// Fillers to make layering more clear -#define ____ KC_TRNS - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - - /* Colemak - * ,-----------------------------------------------------------------------------------. - * | ' " `| Q | W | F | P | G | J | L | U | Y | = + | ~ ; :| - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | ( [ {| A | R | S | T | D | H | N | E | I | O | ) ] }| - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | - , <| Z | X | C | V | B | K | M | ? | | | ^ | _ . >| - * |------+------+------+------+------+------+------+------+------+------+------+------| - * |Lower |Raise | Ctrl | Alt | Bksp | Spc |Enter |LShft | ESC | < | v | > | - * `-----------------------------------------------------------------------------------' - */ - [_COLE] = LAYOUT( - TD(TD_BTK), KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_EQL, TD(TD_TDE), - TD(TD_LPRN), KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, TD(TD_RPRN), - TD(TD_MIN), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_SLSH, KC_BSLS, KC_UP, TD(TD_USC), - LOWER, RAISE, OSM(MOD_LCTL), OSM(MOD_LALT), KC_SPC, KC_BSPC, KC_ENT, OSM(MOD_LSFT), KC_ESC, KC_LEFT, KC_DOWN, KC_RGHT), - - /* Lower - * ,-----------------------------------------------------------------------------------. - * | ---- | ---- | ---- | ---- | ---- | ---- | 7 | 8 | 9 | * | / | ^ | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | ---- | ---- | ---- | ---- | ---- | ---- | 4 | 5 | 6 | + | - | ---- | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | ---- | ---- | ---- | ---- | ---- | ---- | 1 | 2 | 3 | = | ---- | ---- | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | ---- | ---- | ---- | ---- | ---- | ---- | ---- | 0 | . | ---- | ---- | ---- | - * `-----------------------------------------------------------------------------------' - */ - [_LOWER] = LAYOUT( - ____, ____, ____, ____, ____, ____, KC_7, KC_8, KC_9, KC_PAST, KC_PSLS, KC_CIRC, - ____, ____, ____, ____, ____, ____, KC_4, KC_5, KC_6, KC_PPLS, KC_PMNS, ____, - ____, ____, ____, ____, ____, ____, KC_1, KC_2, KC_3, KC_PEQL, ____, ____, - ____, ____, ____, ____, ____, ____, ____, KC_0, KC_MNXT, ____, ____, ____), - - /* Raise - * ,-----------------------------------------------------------------------------------. - * | F1 | F2 | F3 | F4 | F5 | F6 | ! | @ | # | $ | % | ` ~ | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | F7 | F8 | F9 | F10 | F11 | F12 | ^ | & | * | ( | ) | - _ | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | ____ | ____ | ____ | ____ | ____ | ____ | [ { | ] } | \ | | ; : | ' " | = + | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | , < | . > | / ? | - * `-----------------------------------------------------------------------------------' - */ - [_RAISE] = LAYOUT( - KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_GRV, - KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_MINS, - KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_LBRC, KC_RBRC, KC_BSLS, KC_SCLN, KC_QUOT, KC_EQL, - ____, ____, ____, ____, ____, ____, ____, ____, ____, KC_COMM, KC_DOT, KC_SLSH), - - /* Adjust (Lower + Raise) - * ,-----------------------------------------------------------------------------------. - * | Reset| ____ | ____ | ____ | ____ | ____ | ____ | LOCK | ____ | ____ | ____ | VUP | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | ____ | ____ | RUN | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | VDWN | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | PGUP | MUTE | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | HOME | PGDN | END | - * `-----------------------------------------------------------------------------------' - */ - [_AUX] = LAYOUT( - RESET, ____, ____, ____, ____, ____, ____, LGUI(KC_L), ____, ____, ____, KC_VOLU, - ____, ____, LGUI(KC_R), ____, ____, ____, ____, ____, ____, ____, ____, KC_VOLD, - ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, KC_PGUP, KC_MUTE, - ____, ____, ____, ____, KC_TAB, KC_DEL, ____, ____, ____, KC_HOME, KC_PGDOWN, KC_END) - -}; - -qk_tap_dance_action_t tap_dance_actions[] = { - [TD_BTK] = ACTION_TAP_DANCE_DOUBLE(KC_QUOT, KC_GRV), - [TD_TDE] = ACTION_TAP_DANCE_DOUBLE(KC_SCLN, KC_TILD), - [TD_LPRN] = ACTION_TAP_DANCE_DOUBLE(KC_LBRC, KC_LPRN), - [TD_RPRN] = ACTION_TAP_DANCE_DOUBLE(KC_RBRC, KC_RPRN), - [TD_MIN] = ACTION_TAP_DANCE_DOUBLE(KC_COMM, KC_MINS), - [TD_USC] = ACTION_TAP_DANCE_DOUBLE(KC_DOT, KC_UNDS)}; - -void persistent_default_layer_set(uint16_t default_layer) -{ - eeconfig_update_default_layer(default_layer); - default_layer_set(default_layer); -}; - -void matrix_scan_user(void){}; - -void matrix_init_user(void){}; - -bool process_record_user(uint16_t keycode, keyrecord_t *record) -{ - switch (keycode) - { - case COLE: - if (record->event.pressed) - { - persistent_default_layer_set(1UL << _COLE); - } - return false; - break; - case LOWER: - if (record->event.pressed) - { - layer_on(_LOWER); - update_tri_layer(_LOWER, _RAISE, _AUX); - } - else - { - layer_off(_LOWER); - update_tri_layer(_LOWER, _RAISE, _AUX); - } - return false; - break; - case RAISE: - if (record->event.pressed) - { - layer_on(_RAISE); - update_tri_layer(_LOWER, _RAISE, _AUX); - } - else - { - layer_off(_RAISE); - update_tri_layer(_LOWER, _RAISE, _AUX); - } - return false; - break; - case AUX: - if (record->event.pressed) - { - layer_on(_AUX); - } - else - { - layer_off(_AUX); - } - return false; - break; - } - return true; -} diff --git a/keyboards/handwired/xeal60/keymaps/heartrobotninja/rules.mk b/keyboards/handwired/xeal60/keymaps/heartrobotninja/rules.mk deleted file mode 100644 index 2261a848a..000000000 --- a/keyboards/handwired/xeal60/keymaps/heartrobotninja/rules.mk +++ /dev/null @@ -1,26 +0,0 @@ -# Build Options -# change to "no" to disable the options, or define them in the Makefile in -# the appropriate keymap folder that will get included automatically -# -BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = no # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = no # Console for debug(+400) -COMMAND_ENABLE = no # Commands for debug and configuration -TAP_DANCE_ENABLE = yes -NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality -MIDI_ENABLE = no # MIDI controls -AUDIO_ENABLE = no # Audio output on port C6 -UNICODE_ENABLE = no # Unicode -BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. -SWAP_HANDS_ENABLE = no # Enable one-hand typing - -# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE -SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend - -ifndef QUANTUM_DIR - include ../../../../Makefile -endif - diff --git a/keyboards/handwired/xeal60/keymaps/henxing/Readme.md b/keyboards/handwired/xeal60/keymaps/henxing/Readme.md deleted file mode 100644 index 231aa6adf..000000000 --- a/keyboards/handwired/xeal60/keymaps/henxing/Readme.md +++ /dev/null @@ -1,51 +0,0 @@ -# Let's Split the Atreus - -This keymap is a port of the Atreus keymap to the Let's Split keyboard, using a -similar method of handling layer switches as the `default` keymap. - - -# Layers - -The following tables are the layers as implemented. - -### Underscores in Layer - -Any underscore represents a key that is mapped to `KC_NO`, or no keypress. The -2x3 block in the middle is like this because the Atreus does not have any keys -there. It has been left blank for the user to add her own special keypresses or -macros that she finds useful to have on that particular layer. - - -## `_QWERTY` - -```c -/* - * q w e r t _ _ y u i o p - * a s d f g _ _ h j k l ; - * z x c v b _ _ n m , . / - * esc tab gui shift bksp ctrl alt space fn - ' enter - */ - ``` - - -## `_LOWER` - -```c -/* - * ! @ up { } _ _ pgup 7 8 9 * - * # left down right $ _ _ pgdn 4 5 6 + - * [ ] ( ) & _ _ ` 1 2 3 \ - * lower insert gui shift bksp ctrl alt space fn . 0 = - */ - ``` - -## `_RAISE` - -```c -/* - * insert home up end pgup _ _ up F7 F8 F9 F10 - * del left down right pgdn _ _ down F4 F5 F6 F11 - * _ volup _ _ reset _ _ F1 F2 F3 F12 - * _ voldn super shift bksp ctrl alt space L0 prtsc scroll pause - */ - ``` diff --git a/keyboards/handwired/xeal60/keymaps/henxing/config.h b/keyboards/handwired/xeal60/keymaps/henxing/config.h deleted file mode 100644 index 5a6261c4f..000000000 --- a/keyboards/handwired/xeal60/keymaps/henxing/config.h +++ /dev/null @@ -1,37 +0,0 @@ -/* -This is the c configuration file for the keymap - -Copyright 2012 Jun Wako -Copyright 2015 Jack Humbert - -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 . -*/ - -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -/* Use I2C or Serial, not both */ - -#define USE_SERIAL -// #define USE_I2C - -/* Select hand configuration */ - -#define MASTER_LEFT -// #define MASTER_RIGHT -// #define EE_HANDS - -#endif diff --git a/keyboards/handwired/xeal60/keymaps/henxing/keymap.c b/keyboards/handwired/xeal60/keymaps/henxing/keymap.c deleted file mode 100644 index aab75dc54..000000000 --- a/keyboards/handwired/xeal60/keymaps/henxing/keymap.c +++ /dev/null @@ -1,113 +0,0 @@ -#include QMK_KEYBOARD_H - - -extern keymap_config_t keymap_config; - -// Each layer gets a name for readability, which is then used in the keymap matrix below. -// The underscores don't mean anything - you can have a layer called STUFF or any other name. -// Layer names don't all need to be of the same length, obviously, and you can also skip them -// entirely and just use numbers. -#define _QWERTY 0 -#define _LOWER 1 -#define _RAISE 2 - -enum custom_keycodes { - QWERTY = SAFE_RANGE, - LOWER, - RAISE -}; - -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - - /* - * q w e r t _ _ y u i o p - * a s d f g _ _ h j k l ; - * z x c v b _ _ n m , . / - * esc tab gui shift bksp ctrl alt space fn - ' enter - */ - [_QWERTY] = LAYOUT( \ - KC_Q, KC_W, KC_E, KC_R, KC_T, KC_NO, KC_NO, KC_Y, KC_U, KC_I, KC_O, KC_P, \ - KC_A, KC_S, KC_D, KC_F, KC_G, KC_NO, KC_NO, KC_H, KC_J, KC_K, KC_L, KC_SCLN, \ - KC_Z, KC_X, KC_C, KC_V, KC_B, KC_NO, KC_NO, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, \ - KC_ESC, KC_TAB, KC_LGUI, KC_LSFT, KC_BSPC, KC_LCTL, KC_LALT, KC_SPC, LOWER, KC_MINS, KC_QUOT, KC_ENT \ - ), - - /* - * ! @ up { } _ _ pgup 7 8 9 * - * # left down right $ _ _ pgdn 4 5 6 + - * [ ] ( ) & _ _ ` 1 2 3 \ - * lower insert gui shift bksp ctrl alt space fn . 0 = - */ - [_LOWER] = LAYOUT( \ - KC_EXLM, KC_AT, KC_UP, KC_LCBR, KC_RCBR, KC_NO, KC_NO, KC_PGUP, KC_7, KC_8, KC_9, KC_ASTR, \ - KC_HASH, KC_LEFT, KC_DOWN, KC_RGHT, KC_DEL, KC_NO, KC_NO, KC_PGDN, KC_4, KC_5, KC_6, KC_PLUS, \ - KC_LBRC, KC_RBRC, KC_LPRN, KC_RPRN, KC_AMPR, KC_NO, KC_NO, KC_GRV, KC_1, KC_2, KC_3, KC_BSLS, \ - RAISE, KC_INS, KC_LGUI, KC_LSFT, KC_BSPC, KC_LCTL, KC_LALT, KC_SPC, KC_TRNS, KC_DOT, KC_0, KC_EQL \ - ), - - /* - * insert home up end pgup _ _ up F7 F8 F9 F10 - * del left down right pgdn _ _ down F4 F5 F6 F11 - * _ volup _ _ reset _ _ F1 F2 F3 F12 - * _ voldn super shift bksp ctrl alt space L0 prtsc scroll pause - */ - [_RAISE] = LAYOUT( \ - KC_INS, KC_HOME, KC_UP, KC_END, KC_PGUP, KC_NO, KC_NO, KC_UP, KC_F7, KC_F8, KC_F9, KC_F10, \ - KC_DEL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_NO, KC_NO, KC_DOWN, KC_F4, KC_F5, KC_F6, KC_F11, \ - KC_TRNS, KC_VOLU, KC_TRNS, KC_TRNS, RESET, KC_NO, KC_NO, KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F12, \ - KC_NO, KC_VOLD, KC_LGUI, KC_LSFT, KC_BSPC, KC_LCTL, KC_LALT, KC_SPC, QWERTY, KC_PSCR, KC_SLCK, KC_PAUS \ - ) - -}; - -#ifdef AUDIO_ENABLE -float tone_qwerty[][2] = SONG(QWERTY_SOUND); -float tone_dvorak[][2] = SONG(DVORAK_SOUND); -float tone_colemak[][2] = SONG(COLEMAK_SOUND); -#endif - -void persistent_default_layer_set(uint16_t default_layer) { - eeconfig_update_default_layer(default_layer); - default_layer_set(default_layer); -} - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - - // The value to return - bool return_value = false; - - switch (keycode) { - case QWERTY: - if (record->event.pressed) { -#ifdef AUDIO_ENABLE - PLAY_SONG(tone_qwerty); -#endif - persistent_default_layer_set(1UL<<_QWERTY); - } - break; - - case LOWER: - if (record->event.pressed) { - layer_on(_LOWER); - } else { - layer_off(_LOWER); - } - break; - - case RAISE: - persistent_default_layer_set(1UL<<_RAISE); - break; - default: - - // If the keycode is not handled by any of the other cases, we - // should return true - return_value = true; - break; - } - - return return_value; -} diff --git a/keyboards/handwired/xeal60/keymaps/hexwire/README.md b/keyboards/handwired/xeal60/keymaps/hexwire/README.md deleted file mode 100644 index 3ce3f6af3..000000000 --- a/keyboards/handwired/xeal60/keymaps/hexwire/README.md +++ /dev/null @@ -1,116 +0,0 @@ -Hexwire's Nyquist Layout -============================ - -### Changes from default layout - -- Main layer - - The right space bar key has been changed to backspace, as I only hit space with my left thumb - - Backtick is at the lower right and also serves goes to the 3rd function layer when held - - Enter key acts as shift when held - - Escape key acts as control when held - - Minus key at upper right -- Lower layer - - Numbers are on the lower layer, to make it easier to use a numpad on the right hand - - Arrow keys - - Straight and curly brackets in the middle two columns - - Screenshot keys for MacOS -- Upper layer - - Symbols are on the upper layer - - Media keys - - Page Up/Down, Home/End -- 3rd function layer - - Function keys - -## Layouts - -### QWERTY - -``` -,----+----+----+----+----+----. ,----+----+----+----+----+----. -|ESC , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,BSPC| -|----+----+----+----+----+----| |----+----+----+----+----+----| -|TAB , Q , W , E , R , T , Y , U , I , O , P ,MINS| -|----+----+----+----+----+----| |----+----+----+----+----+----| -| X0 , A , S , D , F , G , H , J , K , L ,SCLN,QUOT| -|----+----+----+----+----+----| |----+----+----+----+----+----| -|LSFT, Z , X , C , V , B , N , M ,COMM,DOT ,SLSH, X4 | -|----+----+----+----+----+----| |----+----+----+----+----+----| -| X3 ,LCTL,LALT,LGUI, X1 ,SPC , BSPC, X2 ,LEFT,DOWN, UP ,RGHT| -`----+----+----+----+----+----' `----+----+----+----+----+----' -``` - -### Colemak -``` -,----+----+----+----+----+----. ,----+----+----+----+----+----. -|ESC , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,BSPC| -|----+----+----+----+----+----| |----+----+----+----+----+----| -|TAB , Q , W , F , P , G , J , L , U , Y ,SCLN,MINS| -|----+----+----+----+----+----| |----+----+----+----+----+----| -| X0 , A , R , S , T , D , H , N , E , I , O ,QUOT| -|----+----+----+----+----+----| |----+----+----+----+----+----| -|LSFT, Z , X , C , V , B , K , M ,COMM,DOT ,SLSH, X4 | -|----+----+----+----+----+----| |----+----+----+----+----+----| -| X3 ,LCTL,LALT,LGUI, X1 ,SPC , BSPC, X2 ,LEFT,DOWN, UP ,RGHT| -`----+----+----+----+----+----' `----+----+----+----+----+----' -``` - -### Dvorak -``` -,----+----+----+----+----+----. ,----+----+----+----+----+----. -|ESC , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,BSPC| -|----+----+----+----+----+----| |----+----+----+----+----+----| -|TAB ,QUOT,COMM,DOT , P , Y , F , G , C , R , L ,MINS| -|----+----+----+----+----+----| |----+----+----+----+----+----| -| X0 , A , O , E , U , I , D , H , T , N , S ,SLSH| -|----+----+----+----+----+----| |----+----+----+----+----+----| -|LSFT,SCLN, Q , J , K , X , B , M , W , V , Z , X4 | -|----+----+----+----+----+----| |----+----+----+----+----+----| -| X3 ,LCTL,LALT,LGUI, X1 ,SPC , BSPC, X2 ,LEFT,DOWN, UP ,RGHT| -`----+----+----+----+----+----' `----+----+----+----+----+----' -``` - -### Lower -``` -,----+----+----+----+----+----. ,----+----+----+----+----+----. -|TILD,EXLM, AT ,HASH,DLR ,PERC, CIRC,AMPR,ASTR,LPRN,RPRN,BSPC| -|----+----+----+----+----+----| |----+----+----+----+----+----| -| , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 , | -|----+----+----+----+----+----| |----+----+----+----+----+----| -|DEL ,CAPP,LEFT,RGHT, UP ,LBRC, RBRC, P4 , P5 , P6 ,PLUS,PIPE| -|----+----+----+----+----+----| |----+----+----+----+----+----| -| ,CPYP, , ,DOWN,LCBR, RCBR, P1 , P2 , P3 ,MINS, | -|----+----+----+----+----+----| |----+----+----+----+----+----| -| , , , , , , DEL , , P0 ,PDOT, , | -`----+----+----+----+----+----' `----+----+----+----+----+----' -``` - -### Raise -``` -,----+----+----+----+----+----. ,----+----+----+----+----+----. -|TILD,EXLM, AT ,HASH,DLR ,PERC, CIRC,AMPR,ASTR,LPRN,RPRN,BSPC| -|----+----+----+----+----+----| |----+----+----+----+----+----| -| ,EXLM, AT ,HASH,DLR ,PERC, CIRC,AMPR,ASTR,LPRN,RPRN, | -|----+----+----+----+----+----| |----+----+----+----+----+----| -|DEL ,MPRV,MNXT,VOLU,PGUP,UNDS, EQL ,HOME, , , ,BSLS| -|----+----+----+----+----+----| |----+----+----+----+----+----| -|MUTE,MSTP,MPLY,VOLD,PGDN,MINS, PLUS,END , , , , | -|----+----+----+----+----+----| |----+----+----+----+----+----| -| , , , , , , , , , , , | -`----+----+----+----+----+----' `----+----+----+----+----+----' -``` - -### 3rd function layer - -``` -,----+----+----+----+----+----. ,----+----+----+----+----+----. -|F12 , F1 , F2 , F3 , F4 , F5 , F6 , F7 , F8 , F9 ,F10 ,F11 | -|----+----+----+----+----+----| |----+----+----+----+----+----| -| , , , , , , , , , , , | -|----+----+----+----+----+----| |----+----+----+----+----+----| -| , , , , , , , , , , , | -|----+----+----+----+----+----| |----+----+----+----+----+----| -| , , , , , , , , , , , | -|----+----+----+----+----+----| |----+----+----+----+----+----| -| , , , , , , , , , , , | -`----+----+----+----+----+----' `----+----+----+----+----+----' -``` diff --git a/keyboards/handwired/xeal60/keymaps/hexwire/config.h b/keyboards/handwired/xeal60/keymaps/hexwire/config.h deleted file mode 100644 index 7acf84510..000000000 --- a/keyboards/handwired/xeal60/keymaps/hexwire/config.h +++ /dev/null @@ -1,43 +0,0 @@ -/* -Copyright 2017 Danny Nguyen - -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 . -*/ - -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -/* Use I2C or Serial, not both */ - -#define USE_SERIAL -// #define USE_I2C - -/* Select hand configuration */ - -#define MASTER_LEFT -// #define MASTER_RIGHT -// #define EE_HANDS - -#define TAPPING_TERM 150 - -#undef RGBLED_NUM -#define RGBLIGHT_ANIMATIONS -#define RGBLED_NUM 12 -#define RGBLIGHT_HUE_STEP 8 -#define RGBLIGHT_SAT_STEP 8 -#define RGBLIGHT_VAL_STEP 8 - -#endif diff --git a/keyboards/handwired/xeal60/keymaps/hexwire/keymap.c b/keyboards/handwired/xeal60/keymaps/hexwire/keymap.c deleted file mode 100644 index 2050c0379..000000000 --- a/keyboards/handwired/xeal60/keymaps/hexwire/keymap.c +++ /dev/null @@ -1,218 +0,0 @@ -#include "viterbi.h" -#include "action_layer.h" -#include "eeconfig.h" - -extern keymap_config_t keymap_config; - -#define _QWERTY 0 -#define _COLEMAK 1 -#define _DVORAK 2 -#define _LOWER 3 -#define _RAISE 4 -#define _FN3 5 -#define _FN4 6 -#define _ADJUST 16 - -enum custom_keycodes { - QWERTY = SAFE_RANGE, - COLEMAK, - DVORAK, - LOWER, - RAISE, - FN3, - FN4, - ADJUST, -}; - -#define KC_ KC_TRNS -#define _______ KC_TRNS - -#define KC_CAPW LGUI(LSFT(KC_3)) // Capture whole screen -#define KC_CPYW LGUI(LSFT(LCTL(KC_3))) // Copy whole screen -#define KC_CAPP LGUI(LSFT(KC_4)) // Capture portion of screen -#define KC_CPYP LGUI(LSFT(LCTL(KC_4))) // Copy portion of screen -#define KC_X0 MT(MOD_LCTL, KC_ESC) -#define KC_X1 LOWER -#define KC_X2 RAISE -#define KC_X3 LT(_FN3, KC_GRV) -#define KC_X4 MT(MOD_LSFT, KC_ENT) - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - - [_QWERTY] = LAYOUT_kc( - //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. - ESC , 1 , 2 , 3 , 4 , 5 , , 6 , 7 , 8 , 9 , 0 ,BSPC, , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - TAB , Q , W , E , R , T , , Y , U , I , O , P ,MINS, , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - X0 , A , S , D , F , G , , H , J , K , L ,SCLN,QUOT, , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - LSFT, Z , X , C , V , B , , N , M ,COMM,DOT ,SLSH, X4 , , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - X3 ,LCTL,LALT,LGUI, X1 ,SPC , , BSPC, X2 ,LEFT,DOWN, UP ,RGHT, - //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' - ), - - [_COLEMAK] = LAYOUT_kc( - //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. - ESC , 1 , 2 , 3 , 4 , 5 , , 6 , 7 , 8 , 9 , 0 ,BSPC, , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - TAB , Q , W , F , P , G , , J , L , U , Y ,SCLN,MINS, , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - X0 , A , R , S , T , D , , H , N , E , I , O ,QUOT, , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - LSFT, Z , X , C , V , B , , K , M ,COMM,DOT ,SLSH, X4 , , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - X3 ,LCTL,LALT,LGUI, X1 ,SPC , , BSPC, X2 ,LEFT,DOWN, UP ,RGHT, - //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' - ), - - [_DVORAK] = LAYOUT_kc( - //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. - ESC , 1 , 2 , 3 , 4 , 5 , , 6 , 7 , 8 , 9 , 0 ,BSPC, , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - TAB ,QUOT,COMM,DOT , P , Y , , F , G , C , R , L ,MINS, , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - X0 , A , O , E , U , I , , D , H , T , N , S ,SLSH, , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - LSFT,SCLN, Q , J , K , X , , B , M , W , V , Z , X4 , , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - X3 ,LCTL,LALT,LGUI, X1 ,SPC , , BSPC, X2 ,LEFT,DOWN, UP ,RGHT, - //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' - ), - - [_LOWER] = LAYOUT_kc( - //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. - TILD,EXLM, AT ,HASH,DLR ,PERC, , CIRC,AMPR,ASTR,LPRN,RPRN,BSPC, , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , 1 , 2 , 3 , 4 , 5 , , 6 , 7 , 8 , 9 , 0 , , , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - DEL ,CAPP,LEFT,RGHT, UP ,LBRC, , RBRC, P4 , P5 , P6 ,PLUS,PIPE, , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - ,CPYP, , ,DOWN,LCBR, , RCBR, P1 , P2 , P3 ,MINS, , , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , , , , , , , DEL , , P0 ,PDOT, , , - //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' - ), - - [_RAISE] = LAYOUT_kc( - //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. - TILD,EXLM, AT ,HASH,DLR ,PERC, , CIRC,AMPR,ASTR,LPRN,RPRN,BSPC, , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - ,EXLM, AT ,HASH,DLR ,PERC, , CIRC,AMPR,ASTR,LPRN,RPRN, , , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - DEL ,MPRV,MNXT,VOLU,PGUP,UNDS, , EQL ,HOME, , , ,BSLS, , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - MUTE,MSTP,MPLY,VOLD,PGDN,MINS, , PLUS,END , , , , , , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , , , , , , , , , , , , , - //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' - ), - - [_FN3] = LAYOUT_kc( - //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. - F12 , F1 , F2 , F3 , F4 , F5 , , F6 , F7 , F8 , F9 ,F10 ,F11 , , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , , , , , , , , , , , , , , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , , , , , , , , , , , , , , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , , , , , , , , , , , , , , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , , , , , , , , , , , , , - //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' - ), - -/* Adjust (Lower + Raise) - * ,-----------------------------------------------------------------------------------. - * | | Reset|RGB Tg|RGB Md|Hue Up|Hue Dn|Sat Up|Sat Dn|Val Up|Val Dn| | | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | | | | | | | | | | | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | | - * `-----------------------------------------------------------------------------------' - */ - [_ADJUST] = LAYOUT( \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ - _______, RESET , RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, _______, _______, _______, _______, \ - _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ - ) - - -}; - -#ifdef AUDIO_ENABLE -float tone_qwerty[][2] = SONG(QWERTY_SOUND); -float tone_dvorak[][2] = SONG(DVORAK_SOUND); -float tone_colemak[][2] = SONG(COLEMAK_SOUND); -#endif - -void persistent_default_layer_set(uint16_t default_layer) { - eeconfig_update_default_layer(default_layer); - default_layer_set(default_layer); -} - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case QWERTY: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_NOTE_ARRAY(tone_qwerty, false, 0); - #endif - persistent_default_layer_set(1UL<<_QWERTY); - } - return false; - break; - case COLEMAK: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_NOTE_ARRAY(tone_colemak, false, 0); - #endif - persistent_default_layer_set(1UL<<_COLEMAK); - } - return false; - break; - case DVORAK: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_NOTE_ARRAY(tone_dvorak, false, 0); - #endif - persistent_default_layer_set(1UL<<_DVORAK); - } - return false; - break; - case LOWER: - if (record->event.pressed) { - layer_on(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case RAISE: - if (record->event.pressed) { - layer_on(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case ADJUST: - if (record->event.pressed) { - layer_on(_ADJUST); - } else { - layer_off(_ADJUST); - } - return false; - break; - } - return true; -} diff --git a/keyboards/handwired/xeal60/keymaps/hexwire/rules.mk b/keyboards/handwired/xeal60/keymaps/hexwire/rules.mk deleted file mode 100644 index 1e3cebb14..000000000 --- a/keyboards/handwired/xeal60/keymaps/hexwire/rules.mk +++ /dev/null @@ -1 +0,0 @@ -RGBLIGHT_ENABLE = yes diff --git a/keyboards/handwired/xeal60/keymaps/khord/config.h b/keyboards/handwired/xeal60/keymaps/khord/config.h deleted file mode 100644 index 4ebdbad76..000000000 --- a/keyboards/handwired/xeal60/keymaps/khord/config.h +++ /dev/null @@ -1,44 +0,0 @@ -/* -This is the c configuration file for the keymap - -Copyright 2012 Jun Wako -Copyright 2015 Jack Humbert - -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 . -*/ - -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -#define TAPPING_TERM 150 - -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - -/* Use I2C or Serial, not both */ - -#define USE_SERIAL -// #define USE_I2C - -/* Select hand configuration */ - -//#define MASTER_LEFT -// #define MASTER_RIGHT -#define EE_HANDS - -#define RGBLIGHT_ANIMATIONS - -#endif diff --git a/keyboards/handwired/xeal60/keymaps/khord/keymap.c b/keyboards/handwired/xeal60/keymaps/khord/keymap.c deleted file mode 100644 index 41042065d..000000000 --- a/keyboards/handwired/xeal60/keymaps/khord/keymap.c +++ /dev/null @@ -1,170 +0,0 @@ -#include QMK_KEYBOARD_H - - -extern keymap_config_t keymap_config; - -#define _QWERTY 0 -#define _LOWER 3 -#define _RAISE 4 -#define _ADJUST 16 - -enum custom_keycodes { - QWERTY = SAFE_RANGE, - LOWER, - RAISE, - ADJUST, - ADMIN, - SMSPC1 -}; - -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO - -// Tap Dance Declarations -enum { - SFT_CAP = 0 -}; - -// Dylan's additions -#define C_A_DEL LALT(LCTL(KC_DEL)) -#define C_A_INS LALT(LCTL(KC_INS)) -//#define MAC_LOK S(LCTL(KC_PWR)) -#define MAC_LOK LCTL(LGUI(KC_Q)) - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - -/* Qwerty - * ,-----------------------------------------------------------------------------------. - * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | S | D | F | G | H | J | K | L | ; | " | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' - */ -[_QWERTY] = LAYOUT( \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ - CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ - TD(SFT_CAP), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_ENT), \ - ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ -), - -/* Lower - * ,-----------------------------------------------------------------------------------. - * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 | | | END | HOME |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | Next | Vol- | Vol+ | Play | - * `-----------------------------------------------------------------------------------' - */ -[_LOWER] = LAYOUT( \ - KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \ - KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, MAC_LOK, _______, KC_END, KC_HOME, _______, \ - LCTL(KC_UP), KC_BTN3, KC_BTN2, KC_BTN1, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ -), - -/* Raise - * ,-----------------------------------------------------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 | | |PG DN |PG UP |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | MB1 | MB2 | MB3 | MB4 | - * `-----------------------------------------------------------------------------------' - */ -[_RAISE] = LAYOUT( \ - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ - KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, KC_PGDN, KC_PGUP, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, KC_BTN1, KC_BTN2, KC_BTN3, KC_BTN4 \ -), - -/* Adjust (Lower + Raise) - * ,-----------------------------------------------------------------------------------. - * | | Reset| | |AGnorm|AGswap| | | |string|string| Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | |RGBMOD|HUE-UP|SAT-UP|BRI-UP| |PLAIN |BREATH|RANBOW| SWIRL| | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | |RGBTOG|HUE-DN|SAT-DN|BRI-DN| |GRDNT | XMAS |KNIGHT| SNAKE| | CAIns| - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | CADel| - * `-----------------------------------------------------------------------------------' - */ -[_ADJUST] = LAYOUT( \ - _______, RESET, _______, _______, AG_NORM, AG_SWAP, _______, _______, _______, ADMIN, SMSPC1, KC_DEL, \ - _______, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, _______, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, _______, _______, \ - _______, RGB_TOG, RGB_HUD, RGB_SAD, RGB_VAD, _______, RGB_M_G, RGB_M_X, RGB_M_K, RGB_M_SN, _______, C_A_INS, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, C_A_DEL \ -) - -}; - -qk_tap_dance_action_t tap_dance_actions[] = { - [SFT_CAP] = ACTION_TAP_DANCE_DOUBLE(KC_LSFT, KC_CAPS) -}; - -void persistent_default_layer_set(uint16_t default_layer) { - eeconfig_update_default_layer(default_layer); - default_layer_set(default_layer); -} - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case QWERTY: - if (record->event.pressed) { - persistent_default_layer_set(1UL<<_QWERTY); - } - return false; - break; - case LOWER: - if (record->event.pressed) { - layer_on(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case RAISE: - if (record->event.pressed) { - layer_on(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case ADJUST: - if (record->event.pressed) { - layer_on(_ADJUST); - } else { - layer_off(_ADJUST); - } - return false; - break; - case ADMIN: - if (record->event.pressed) { - SEND_STRING("Administrator"); - } - return false; - break; - case SMSPC1: - if (record->event.pressed) { - SEND_STRING("Simspace1!"); - } - return false; - break; - } - return true; -} diff --git a/keyboards/handwired/xeal60/keymaps/khord/rules.mk b/keyboards/handwired/xeal60/keymaps/khord/rules.mk deleted file mode 100644 index c90523e5d..000000000 --- a/keyboards/handwired/xeal60/keymaps/khord/rules.mk +++ /dev/null @@ -1,7 +0,0 @@ -TAP_DANCE_ENABLE = yes -RGBLIGHT_ENABLE = yes -USE_I2C = no - -ifndef QUANTUM_DIR - include ../../../../Makefile -endif diff --git a/keyboards/handwired/xeal60/keymaps/kris/keymap.c b/keyboards/handwired/xeal60/keymaps/kris/keymap.c deleted file mode 100644 index 34d2e86da..000000000 --- a/keyboards/handwired/xeal60/keymaps/kris/keymap.c +++ /dev/null @@ -1,213 +0,0 @@ -#include QMK_KEYBOARD_H - - -extern keymap_config_t keymap_config; - -// Each layer gets a name for readability, which is then used in the keymap matrix below. -// The underscores don't mean anything - you can have a layer called STUFF or any other name. -// Layer names don't all need to be of the same length, obviously, and you can also skip them -// entirely and just use numbers. -#define _QWERTY 0 -#define _COLEMAK 1 -#define _DVORAK 2 -#define _LOWER 3 -#define _RAISE 4 -#define _ADJUST 16 - -enum custom_keycodes { - QWERTY = SAFE_RANGE, - COLEMAK, - DVORAK, - LOWER, - RAISE, - ADJUST, -}; - -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - -/* Qwerty - * ,-----------------------------------------------------------------------------------. - * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Ctrl | A | S | D | F | G | H | J | K | L | ; |Enter | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | N | M | , | . | / |Shift|| - * |------+------+------+------+------+------+------+------+------+------+------+------| - * |Adjust| Alt | Gui |Caps |Lower |Space |Space |Raise | [ | ] | - |Ctrl | - * `-----------------------------------------------------------------------------------' - */ -[_QWERTY] = LAYOUT( \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ - KC_LCTRL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT , \ - ADJUST, KC_LALT, KC_LGUI, KC_CAPS, LOWER, KC_SPC, KC_SPC, RAISE, KC_LBRC, KC_RBRC, KC_MINS, KC_RCTRL \ -), - -/* Colemak - * ,-----------------------------------------------------------------------------------. - * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | R | S | T | D | H | N | E | I | O | " | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' - */ -[_COLEMAK] = LAYOUT( \ - KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, \ - KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ - ADJUST, KC_LALT, KC_LGUI, KC_CAPS, LOWER, KC_SPC, KC_SPC, RAISE, KC_LBRC, KC_RBRC, KC_MINS, KC_RCTRL \ -), - -/* Dvorak - * ,-----------------------------------------------------------------------------------. - * | Tab | " | , | . | P | Y | F | G | C | R | L | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | O | E | U | I | D | H | T | N | S | / | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' - */ -[_DVORAK] = LAYOUT( \ - KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, \ - KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, \ - KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT , \ - ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ -), - -/* Lower - * ,-----------------------------------------------------------------------------------. - * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | | \ | | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | Next | Vol- | Vol+ | Play | - * `-----------------------------------------------------------------------------------' - */ -[_LOWER] = LAYOUT( \ - KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \ - KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ -), - -/* Raise - * ,-----------------------------------------------------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | F6 | 4 | 5 | 6 | ] | \ | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | Next | Vol- | Vol+ | Play | - * `-----------------------------------------------------------------------------------' - */ -[_RAISE] = LAYOUT( \ - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \ - KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_4, KC_5, KC_6, KC_RBRC, KC_BSLS, \ - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_1, KC_2, KC_3, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, KC_0, KC_VOLD, KC_VOLU, KC_MPLY \ -), - -/* Adjust (Lower + Raise) - * ,-----------------------------------------------------------------------------------. - * | | Reset| | | | | | | | | | Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | | | | | | | | | | | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | | - * `-----------------------------------------------------------------------------------' - */ -[_ADJUST] = LAYOUT( \ - _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ - _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ -) - - -}; - -#ifdef AUDIO_ENABLE -float tone_qwerty[][2] = SONG(QWERTY_SOUND); -float tone_dvorak[][2] = SONG(DVORAK_SOUND); -float tone_colemak[][2] = SONG(COLEMAK_SOUND); -#endif - -void persistent_default_layer_set(uint16_t default_layer) { - eeconfig_update_default_layer(default_layer); - default_layer_set(default_layer); -} - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case QWERTY: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_qwerty); - #endif - persistent_default_layer_set(1UL<<_QWERTY); - } - return false; - break; - case COLEMAK: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_colemak); - #endif - persistent_default_layer_set(1UL<<_COLEMAK); - } - return false; - break; - case DVORAK: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_dvorak); - #endif - persistent_default_layer_set(1UL<<_DVORAK); - } - return false; - break; - case LOWER: - if (record->event.pressed) { - layer_on(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case RAISE: - if (record->event.pressed) { - layer_on(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case ADJUST: - if (record->event.pressed) { - layer_on(_ADJUST); - } else { - layer_off(_ADJUST); - } - return false; - break; - } - return true; -} diff --git a/keyboards/handwired/xeal60/keymaps/krusli/keymap.c b/keyboards/handwired/xeal60/keymaps/krusli/keymap.c deleted file mode 100644 index 9b49bab3b..000000000 --- a/keyboards/handwired/xeal60/keymaps/krusli/keymap.c +++ /dev/null @@ -1,238 +0,0 @@ -#include QMK_KEYBOARD_H - - -extern keymap_config_t keymap_config; - -// Each layer gets a name for readability, which is then used in the keymap matrix below. -// The underscores don't mean anything - you can have a layer called STUFF or any other name. -// Layer names don't all need to be of the same length, obviously, and you can also skip them -// entirely and just use numbers. -#define _QWERTY 0 -#define _COLEMAK 1 -#define _DVORAK 2 -#define _LOWER 3 -#define _RAISE 4 -#define _NUMPAD 5 -#define _ADJUST 16 - -enum custom_keycodes { - QWERTY = SAFE_RANGE, - COLEMAK, - DVORAK, - LOWER, - RAISE, - ADJUST, - NUMPAD -}; - -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - -/* Qwerty - * ,-----------------------------------------------------------------------------------. - * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | S | D | F | G | H | J | K | L | ; | ' | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * |Numpad| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' - */ -[_QWERTY] = LAYOUT_ortho_4x12( \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ - KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ - NUMPAD, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ -), - -/* Colemak - * ,-----------------------------------------------------------------------------------. - * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | R | S | T | D | H | N | E | I | O | ' | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' - */ -[_COLEMAK] = LAYOUT_ortho_4x12( \ - KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, \ - KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ - ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ -), - -/* Dvorak - * ,-----------------------------------------------------------------------------------. - * | Tab | ' | , | . | P | Y | F | G | C | R | L | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | O | E | U | I | D | H | T | N | S | / | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' - */ -[_DVORAK] = LAYOUT_ortho_4x12( \ - KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, \ - KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, \ - KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT , \ - ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ -), - -/* Lower - * ,-----------------------------------------------------------------------------------. - * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | Next | Vol- | Vol+ | Play | - * `-----------------------------------------------------------------------------------' - */ -[_LOWER] = LAYOUT_ortho_4x12( \ - KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \ - KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ -), - -/* Raise - * ,-----------------------------------------------------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 | Home | End | PgUp | PgDn |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | Next | Vol- | Vol+ | Play | - * `-----------------------------------------------------------------------------------' - */ -[_RAISE] = LAYOUT_ortho_4x12( \ - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ - KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_HOME, KC_END, KC_PGUP, KC_PGDN, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ -), - -/* Numpad - * ,-----------------------------------------------------------------------------------. - * | Esc | 7 | 8 | 9 | * | / | | | | | | | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | <-- | 4 | 5 | 6 | + | - | | | | | | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | 1 | 2 | 3 |Enter |Enter | | | | | | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * |Qwerty| 0 | . | . |Enter |Enter | | | | | | - * `-----------------------------------------------------------------------------------' - */ -[_NUMPAD] = LAYOUT_ortho_4x12( \ - KC_ESC, KC_P7, KC_P8, KC_P9, KC_PAST, KC_PSLS, _______, _______, _______, _______, _______, _______, \ - KC_BSPC, KC_P4, KC_P5, KC_P6, KC_PPLS, KC_PMNS, _______, _______, _______, _______, _______, _______, \ - _______, KC_P1, KC_P2, KC_P3, KC_PENT, KC_PENT, _______, _______, _______, _______, _______, _______, \ - QWERTY, KC_P0, KC_PDOT, KC_PDOT, KC_PENT, KC_PENT, _______, _______, _______, _______, _______, _______ \ -), - -/* Adjust (Lower + Raise) - * ,-----------------------------------------------------------------------------------. - * | | Reset| | | | | | | | | | Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | | | | | | | | | | | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | | - * `-----------------------------------------------------------------------------------' - */ -[_ADJUST] = LAYOUT_ortho_4x12( \ - _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ - _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ -) - - -}; - -#ifdef AUDIO_ENABLE -float tone_qwerty[][2] = SONG(QWERTY_SOUND); -float tone_dvorak[][2] = SONG(DVORAK_SOUND); -float tone_colemak[][2] = SONG(COLEMAK_SOUND); -#endif - -void persistent_default_layer_set(uint16_t default_layer) { - eeconfig_update_default_layer(default_layer); - default_layer_set(default_layer); -} - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case QWERTY: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_qwerty); - #endif - persistent_default_layer_set(1UL<<_QWERTY); - } - return false; - break; - case NUMPAD: - if (record->event.pressed) - persistent_default_layer_set(1UL<<_NUMPAD); - return false; - break; - case COLEMAK: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_colemak); - #endif - persistent_default_layer_set(1UL<<_COLEMAK); - } - return false; - break; - case DVORAK: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_dvorak); - #endif - persistent_default_layer_set(1UL<<_DVORAK); - } - return false; - break; - case LOWER: - if (record->event.pressed) { - layer_on(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case RAISE: - if (record->event.pressed) { - layer_on(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case ADJUST: - if (record->event.pressed) { - layer_on(_ADJUST); - } else { - layer_off(_ADJUST); - } - return false; - break; - } - return true; -} diff --git a/keyboards/handwired/xeal60/keymaps/krusli/readme.md b/keyboards/handwired/xeal60/keymaps/krusli/readme.md deleted file mode 100644 index 175ef3c11..000000000 --- a/keyboards/handwired/xeal60/keymaps/krusli/readme.md +++ /dev/null @@ -1,2 +0,0 @@ -# krusli -Let's Split keymap based off the default Planck layout with a numpad layer. diff --git a/keyboards/handwired/xeal60/keymaps/mbsurfer/config.h b/keyboards/handwired/xeal60/keymaps/mbsurfer/config.h deleted file mode 100644 index 6469b4846..000000000 --- a/keyboards/handwired/xeal60/keymaps/mbsurfer/config.h +++ /dev/null @@ -1,43 +0,0 @@ -/* -This is the c configuration file for the keymap - -Copyright 2012 Jun Wako -Copyright 2015 Jack Humbert - -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 . -*/ - -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -#define TAPPING_TERM 100 - -/* Use I2C or Serial, not both */ - -#define USE_SERIAL -// #define USE_I2C - -/* Select hand configuration */ - -//#define MASTER_LEFT -// #define MASTER_RIGHT -#define EE_HANDS - -#undef RGBLED_NUM -#define RGBLIGHT_ANIMATIONS -#define RGBLED_NUM 8 - -#endif diff --git a/keyboards/handwired/xeal60/keymaps/mbsurfer/keymap.c b/keyboards/handwired/xeal60/keymaps/mbsurfer/keymap.c deleted file mode 100644 index 5f6589337..000000000 --- a/keyboards/handwired/xeal60/keymaps/mbsurfer/keymap.c +++ /dev/null @@ -1,274 +0,0 @@ -#include QMK_KEYBOARD_H - - -extern rgblight_config_t rgblight_config; -extern keymap_config_t keymap_config; - -// Each layer gets a name for readability, which is then used in the keymap matrix below. -// The underscores don't mean anything - you can have a layer called STUFF or any other name. -// Layer names don't all need to be of the same length, obviously, and you can also skip them -// entirely and just use numbers. -#define _QWERTY 0 -#define _COLEMAK 1 -#define _DVORAK 2 -#define _LOWER 3 -#define _RAISE 4 -#define _ADJUST 16 - -enum custom_keycodes { - QWERTY = SAFE_RANGE, - COLEMAK, - DVORAK, - LOWER, - RAISE, - ADJUST, -}; - -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO - -// Tap Dance Declarations -enum { - SFT_CAP = 0, - LFT_HOM, - DWN_PDN, - UPP_PUP, - RGT_END -}; - -// Task Manager -#define C_S_ESC LSFT(LCTL(KC_ESC)) -#define C_A_DEL LALT(LCTL(KC_DEL)) - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - -/* Qwerty - * ,------------------------------------------ ------------------------------------------. - * | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | - * |------+------+------+------+------+------- -------+------+------+------+------+------| - * | Esc | A | S | D | F | G | | H | J | K | L | ; | " | - * |------+------+------+------+------+------- -------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | | N | M | , | . | / |Enter | - * |------+------+------+------+------+------+ +------+------+------+------+------+------| -* |Adjust| Ctrl | Alt | GUI |Lower |Space | |Space |Raise | Left | Down | Up |Right | - * `------------------------------------------ ------------------------------------------' - */ -[_QWERTY] = LAYOUT( \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ - CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ - TD(SFT_CAP), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_ENT), \ - ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, TD(LFT_HOM), TD(DWN_PDN), TD(UPP_PUP), TD(RGT_END) \ -), - -/* Colemak - * ,------------------------------------------ ------------------------------------------. - * | Tab | Q | W | F | P | G | | J | L | U | Y | ; | Bksp | - * |------+------+------+------+------+------- -------+------+------+------+------+------| - * | Esc | A | R | S | T | D | | H | N | E | I | O | " | - * |------+------+------+------+------+------- -------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | | K | M | , | . | / |Enter | - * |------+------+------+------+------+------+ +------+------+------+------+------+------| - * |Adjust| Ctrl | Alt | GUI |Lower |Space | |Space |Raise | Left | Down | Up |Right | - * `------------------------------------------ ------------------------------------------' - */ -[_COLEMAK] = LAYOUT( \ - KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, \ - KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ - ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ -), - -/* Dvorak - * ,------------------------------------------ ------------------------------------------. - * | Tab | " | , | . | P | Y | | F | G | C | R | L | Bksp | - * |------+------+------+------+------+------- -------+------+------+------+------+------| - * | Esc | A | O | E | U | I | | D | H | T | N | S | / | - * |------+------+------+------+------+------- -------+------+------+------+------+------| - * | Shift| ; | Q | J | K | X | | B | M | W | V | Z |Enter | - * |------+------+------+------+------+------+ +------+------+------+------+------+------| - * |Adjust| Ctrl | Alt | GUI |Lower |Space | |Space |Raise | Left | Down | Up |Right | - * `------------------------------------------ ------------------------------------------' - */ -[_DVORAK] = LAYOUT( \ - KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, \ - KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, \ - KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT , \ - ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ -), - -/* Lower - * ,------------------------------------------ ------------------------------------------. - * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | Bksp | - * |------+------+------+------+------+------- -------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | | F6 | _ | + | { | } | | | - * |------+------+------+------+------+------- -------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | | F12 |ISO ~ |ISO | | END | HOME |Enter | - * |------+------+------+------+------+------+ +------+------+------+------+------+------| - * | | | | | | | | | | Next | Vol- | Vol+ | Play | - * `------------------------------------------ ------------------------------------------' - */ -[_LOWER] = LAYOUT( \ - KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \ - KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_NUHS), S(KC_NUBS), KC_END, KC_HOME, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ -), - -/* Raise - * ,------------------------------------------ ------------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bksp | - * |------+------+------+------+------+------- -------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | | F6 | - | = | [ | ] | \ | - * |------+------+------+------+------+------- -------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | | F12 |ISO # |ISO / |PG DN |PG UP |Enter | - * |------+------+------+------+------+------+ +------+------+------+------+------+------| - * | | | | | | | | | | Next | Vol- | Vol+ | Play | - * `------------------------------------------ ------------------------------------------' - */ -[_RAISE] = LAYOUT( \ - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ - KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGDN, KC_PGUP, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ -), - -/* Adjust (Lower + Raise) - * ,------------------------------------------ ------------------------------------------. - * | Reset| | Plain|Breath|Rainbw| Swirl| | Snake|Knight| Xmas |Grdent| | Del | - * |------+------+------+------+------+------- -------+------+------+------+------+------| - * | | | |Aud on|Audoff|AGnorm| |AGswap|Qwerty|Colemk|Dvorak| | | - * |------+------+------+------+------+------- -------+------+------+------+------+------| - * | |Toggle| Mode | Hue- | Hue+ | Sat- | | Sat+ | Val- | Val+ | | | | (RGB) - * |------+------+------+------+------+------+ +------+------+------+------+------+------| - * | | | | | | | | | | | |TskMng|CAltDe| - * `------------------------------------------ ------------------------------------------' - */ -[_ADJUST] = LAYOUT( \ - RESET, _______, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, RGB_M_SN, RGB_M_K, RGB_M_X, RGB_M_G, _______, KC_DEL, \ - _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ - _______, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, _______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, C_S_ESC, C_A_DEL \ -) - - -}; - -int RGB_current_mode; -int RGB_current_hue; - -qk_tap_dance_action_t tap_dance_actions[] = { - [SFT_CAP] = ACTION_TAP_DANCE_DOUBLE(KC_LSFT, KC_CAPS), - [LFT_HOM] = ACTION_TAP_DANCE_DOUBLE(KC_LEFT, KC_HOME), - [DWN_PDN] = ACTION_TAP_DANCE_DOUBLE(KC_DOWN, KC_PGDN), - [UPP_PUP] = ACTION_TAP_DANCE_DOUBLE(KC_UP, KC_PGUP), - [RGT_END] = ACTION_TAP_DANCE_DOUBLE(KC_RGHT, KC_END) -}; - -void persistent_default_layer_set(uint16_t default_layer) { - eeconfig_update_default_layer(default_layer); - default_layer_set(default_layer); -} - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case QWERTY: - if (record->event.pressed) { - persistent_default_layer_set(1UL<<_QWERTY); - } - return false; - break; - case COLEMAK: - if (record->event.pressed) { - persistent_default_layer_set(1UL<<_COLEMAK); - } - return false; - break; - case DVORAK: - if (record->event.pressed) { - persistent_default_layer_set(1UL<<_DVORAK); - } - return false; - break; - case LOWER: - if (record->event.pressed) { - - if (IS_LAYER_OFF(_RAISE) && IS_LAYER_OFF(_ADJUST)) { - // Save current RGB info - RGB_current_mode = rgblight_config.mode; - RGB_current_hue = rgblight_config.hue; - - // Set RGB to Blue - rgblight_mode(1); - rgblight_setrgb(0, 0, 255); - } - - layer_on(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - - if (IS_LAYER_ON(_ADJUST)){ - // Set RGB to cyan - rgblight_setrgb(0, 255, 255); - } - } else { - - layer_off(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - - if (IS_LAYER_OFF(_RAISE) && IS_LAYER_OFF(_ADJUST)) { - // Reset RGB - rgblight_mode(RGB_current_mode); - rgblight_sethsv(RGB_current_hue, rgblight_config.sat, rgblight_config.val); - } else if (IS_LAYER_ON(_RAISE)){ - // Set RGB to Red - rgblight_setrgb(0, 255, 0); - } - } - return false; - break; - case RAISE: - if (record->event.pressed) { - - if (IS_LAYER_OFF(_LOWER) && IS_LAYER_OFF(_ADJUST)) { - // Save current RGB info - RGB_current_mode = rgblight_config.mode; - RGB_current_hue = rgblight_config.hue; - - // Set RGB to Green - rgblight_mode(1); - rgblight_setrgb(0, 255, 0); - } - - layer_on(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - - if (IS_LAYER_ON(_ADJUST)){ - // Set RGB to cyan - rgblight_setrgb(0, 255, 255); - } - } else { - layer_off(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - - if (IS_LAYER_OFF(_LOWER) && IS_LAYER_OFF(_ADJUST)) { - // Reset RGB - rgblight_mode(RGB_current_mode); - rgblight_sethsv(RGB_current_hue, rgblight_config.sat, rgblight_config.val); - } else if (IS_LAYER_ON(_LOWER)){ - // Set RGB to Blue - rgblight_setrgb(0, 0, 255); - } - } - return false; - break; - case ADJUST: - if (record->event.pressed) { - layer_on(_ADJUST); - } else { - layer_off(_ADJUST); - } - return false; - break; - } - return true; -} diff --git a/keyboards/handwired/xeal60/keymaps/mbsurfer/rules.mk b/keyboards/handwired/xeal60/keymaps/mbsurfer/rules.mk deleted file mode 100644 index c90523e5d..000000000 --- a/keyboards/handwired/xeal60/keymaps/mbsurfer/rules.mk +++ /dev/null @@ -1,7 +0,0 @@ -TAP_DANCE_ENABLE = yes -RGBLIGHT_ENABLE = yes -USE_I2C = no - -ifndef QUANTUM_DIR - include ../../../../Makefile -endif diff --git a/keyboards/handwired/xeal60/keymaps/mike808/config.h b/keyboards/handwired/xeal60/keymaps/mike808/config.h deleted file mode 100644 index bfca915f2..000000000 --- a/keyboards/handwired/xeal60/keymaps/mike808/config.h +++ /dev/null @@ -1,43 +0,0 @@ -/* -Copyright 2018 Danny Nguyen - -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 . -*/ - -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include QMK_KEYBOARD_CONFIG_H - -/* Use I2C or Serial, not both */ - -#define USE_SERIAL -// #define USE_I2C - -/* Select hand configuration */ - -#define MASTER_LEFT -// #define MASTER_RIGHT -// #define EE_HANDS - -#define TAPPING_TERM 150 - -#undef RGBLED_NUM -#define RGBLIGHT_ANIMATIONS -#define RGBLED_NUM 2 -#define RGBLIGHT_HUE_STEP 8 -#define RGBLIGHT_SAT_STEP 8 -#define RGBLIGHT_VAL_STEP 8 - -#endif diff --git a/keyboards/handwired/xeal60/keymaps/mike808/keymap.c b/keyboards/handwired/xeal60/keymaps/mike808/keymap.c deleted file mode 100644 index c7e48b135..000000000 --- a/keyboards/handwired/xeal60/keymaps/mike808/keymap.c +++ /dev/null @@ -1,158 +0,0 @@ -#include QMK_KEYBOARD_H - -#define _DVORAK 0 -#define _QWERTY 1 -#define _FN1 2 -#define _MOUSE 3 - -enum custom_keycodes { - DVORAK = SAFE_RANGE, - QWERTY, -}; - -#define KC_ KC_TRNS -#define _______ KC_TRNS - -#define KC_DVOR DVORAK -#define KC_QWER QWERTY -#define KC_FN1 MO(_FN1) - -// Tap-Hold keys (QWERTY) -#define KC_S_C MT(MOD_LCTL, KC_S) -#define KC_D_A MT(MOD_LALT, KC_D) -#define KC_F_G MT(MOD_LGUI, KC_F) -#define KC_J_G MT(MOD_RGUI, KC_J) -#define KC_K_A MT(MOD_RALT, KC_K) -#define KC_L_C MT(MOD_RCTL, KC_L) - -// Tap-Hold keys (Dvorak) -#define KC_O_C MT(MOD_LCTL, KC_O) -#define KC_E_A MT(MOD_LALT, KC_E) -#define KC_U_G MT(MOD_LGUI, KC_U) -#define KC_H_G MT(MOD_RGUI, KC_H) -#define KC_T_A MT(MOD_RALT, KC_T) -#define KC_N_C MT(MOD_RCTL, KC_N) - -#define KC_G_A LGUI(KC_A) -#define KC_G_C LGUI(KC_C) -#define KC_G_V LGUI(KC_V) -#define KC_G_X LGUI(KC_X) -#define KC_G_Z LGUI(KC_Z) -#define KC_G_BL LGUI(KC_BSLS) -#define KC_G_TB LGUI(KC_TAB) -#define KC_G_SP LGUI(KC_SPC) - -#define KC_ENTM LT(_MOUSE, KC_ENT) - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - - [_QWERTY] = LAYOUT_kc( - //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. - DVOR,ESC , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,MINS,PGUP, - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - G_A ,TAB , Q , W , E , R , T , Y , U , I , O , P ,BSLS,PGDN, - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - G_X ,CAPS, A ,S_C ,D_A ,F_G , G , H ,J_G ,K_A ,L_C ,SCLN,QUOT, UP , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - G_C ,LSFT, Z , X , C , V , B , N , M ,COMM,DOT ,SLSH,RSFT,DOWN, - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - G_V ,FN1 ,G_TB,G_SP,BSPC,SPC ,SPC , ENTM,ENTM,G_Z ,GRV ,EQL ,LEFT,RGHT - //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' - ), - - [_DVORAK] = LAYOUT_kc( - //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. - QWER,ESC , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,EQL ,PGUP, - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - G_A ,TAB ,QUOT,COMM,DOT , P , Y , F , G , C , R , L ,SLSH,PGDN, - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - G_X ,CAPS, A ,O_C ,E_A ,U_G , I , D ,H_G ,T_A ,N_C , S ,MINS, UP , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - G_C ,LSFT,SCLN, Q , J , K , X , B , M , W , V , Z ,RSFT,DOWN, - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - G_V ,FN1 ,G_TB,G_SP,BSPC,SPC ,SPC , ENTM,ENTM,G_Z ,GRV ,BSLS,LEFT,RGHT - //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' - ), - - [_FN1] = LAYOUT_kc( - //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. - , , F1 , F2 , F3 , F4 , F5 , F6 , F7 , F8 , F9 ,F10 ,F11 , , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , ,EXLM, AT ,LCBR,RCBR,PIPE, , P7 , P8 , P9 ,ASTR,F12 , , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , ,HASH,DLR ,LPRN,RPRN,GRV , , P4 , P5 , P6 ,PLUS,MINS, , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , ,PERC,CIRC,LBRC,RBRC,TILD, AMPR, P1 , P2 , P3 ,SLSH, , , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , , , , , , , , ,PDOT, P0 ,EQL , , - //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' - ), - - [_MOUSE] = LAYOUT_kc( - //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. - , , , , , , , , , , , , , , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , , , ,MS_U, , , , , , , , , , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , , ,MS_L,MS_D,MS_R, , , , , , , , , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , , , , , , , , , , , , , , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , , , ,BTN1,BTN2, , , , , , , , - //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' - ) -}; - -#ifdef AUDIO_ENABLE -float tone_qwerty[][2] = SONG(QWERTY_SOUND); -float tone_dvorak[][2] = SONG(DVORAK_SOUND); -#endif - -void update_rgblight(uint16_t layer) { - if (layer & (1UL << _DVORAK)) { - rgblight_sethsv_green(); - } else if (layer & (1UL << _QWERTY)) { - rgblight_sethsv_goldenrod(); - } -} - -void persistent_default_layer_set(uint16_t default_layer) { - eeconfig_update_default_layer(default_layer); - default_layer_set(default_layer); - #ifdef RGBLIGHT_ENABLE - update_rgblight(default_layer); - #endif // RGBLIGHT_ENABLE -} - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case QWERTY: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_NOTE_ARRAY(tone_qwerty, false, 0); - #endif - persistent_default_layer_set(1UL << _QWERTY); - } - return false; - break; - case DVORAK: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_NOTE_ARRAY(tone_dvorak, false, 0); - #endif - persistent_default_layer_set(1UL << _DVORAK); - } - return false; - break; - } - return true; -} - - -void matrix_init_user(void) { - #ifdef RGBLIGHT_ENABLE - rgblight_enable(); - uint8_t default_layer = eeconfig_read_default_layer(); - update_rgblight(default_layer); - #endif -} diff --git a/keyboards/handwired/xeal60/keymaps/mike808/rules.mk b/keyboards/handwired/xeal60/keymaps/mike808/rules.mk deleted file mode 100644 index 1e3cebb14..000000000 --- a/keyboards/handwired/xeal60/keymaps/mike808/rules.mk +++ /dev/null @@ -1 +0,0 @@ -RGBLIGHT_ENABLE = yes diff --git a/keyboards/handwired/xeal60/keymaps/mjt/config.h b/keyboards/handwired/xeal60/keymaps/mjt/config.h deleted file mode 100644 index 735a58b11..000000000 --- a/keyboards/handwired/xeal60/keymaps/mjt/config.h +++ /dev/null @@ -1,38 +0,0 @@ -/* -Copyright 2012 Jun Wako - -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 . -*/ - - -#define USE_SERIAL - -#define MASTER_LEFT -// #define MASTER_RIGHT -// #define EE_HANDS - - -#ifdef SUBPROJECT_rev1 - #include "../../rev1/config.h" -#endif -#ifdef SUBPROJECT_rev2 - #include "../../rev2/config.h" -#endif -#ifdef SUBPROJECT_rev2fliphalf - #include "../../rev2fliphalf/config.h" -#endif - -#undef RGBLED_NUM -#define RGBLIGHT_ANIMATIONS -#define RGBLED_NUM 10 diff --git a/keyboards/handwired/xeal60/keymaps/mjt/keymap.c b/keyboards/handwired/xeal60/keymaps/mjt/keymap.c deleted file mode 100644 index 2c61cce3b..000000000 --- a/keyboards/handwired/xeal60/keymaps/mjt/keymap.c +++ /dev/null @@ -1,213 +0,0 @@ -#include QMK_KEYBOARD_H - - -extern keymap_config_t keymap_config; - -// Each layer gets a name for readability, which is then used in the keymap matrix below. -// The underscores don't mean anything - you can have a layer called STUFF or any other name. -// Layer names don't all need to be of the same length, obviously, and you can also skip them -// entirely and just use numbers. -#define _QWERTY 0 -#define _COLEMAK 1 -#define _DVORAK 2 -#define _LOWER 3 -#define _RAISE 4 -#define _ADJUST 16 - -enum custom_keycodes { - QWERTY = SAFE_RANGE, - COLEMAK, - DVORAK, - LOWER, - RAISE, - ADJUST, -}; - -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - -/* Qwerty - * ,-----------------------------------------------------------------------------------. - * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | S | D | F | G | H | J | K | L | ; | " | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' - */ -[_QWERTY] = LAYOUT( \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ - KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ - ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ -), - -/* Colemak - * ,-----------------------------------------------------------------------------------. - * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | R | S | T | D | H | N | E | I | O | " | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' - */ -[_COLEMAK] = LAYOUT( \ - KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, \ - KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ - ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ -), - -/* Dvorak - * ,-----------------------------------------------------------------------------------. - * | Tab | " | , | . | P | Y | F | G | C | R | L | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | O | E | U | I | D | H | T | N | S | / | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' - */ -[_DVORAK] = LAYOUT( \ - KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, \ - KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, \ - KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT , \ - ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ -), - -/* Lower - * ,-----------------------------------------------------------------------------------. - * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | | \ | | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | Next | Vol- | Vol+ | Play | - * `-----------------------------------------------------------------------------------' - */ -[_LOWER] = LAYOUT( \ - KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \ - KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ -), - -/* Raise - * ,-----------------------------------------------------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | Next | Vol- | Vol+ | Play | - * `-----------------------------------------------------------------------------------' - */ -[_RAISE] = LAYOUT( \ - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ - KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, _______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ -), - -/* Adjust (Lower + Raise) - * ,-----------------------------------------------------------------------------------. - * | | Reset| | | | | | | | | | Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | | | | | | | | | | | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | | - * `-----------------------------------------------------------------------------------' - */ -[_ADJUST] = LAYOUT( \ - _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ - _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ - _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ -) - - -}; - -#ifdef AUDIO_ENABLE -float tone_qwerty[][2] = SONG(QWERTY_SOUND); -float tone_dvorak[][2] = SONG(DVORAK_SOUND); -float tone_colemak[][2] = SONG(COLEMAK_SOUND); -#endif - -void persistent_default_layer_set(uint16_t default_layer) { - eeconfig_update_default_layer(default_layer); - default_layer_set(default_layer); -} - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case QWERTY: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_NOTE_ARRAY(tone_qwerty, false, 0); - #endif - persistent_default_layer_set(1UL<<_QWERTY); - } - return false; - break; - case COLEMAK: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_NOTE_ARRAY(tone_colemak, false, 0); - #endif - persistent_default_layer_set(1UL<<_COLEMAK); - } - return false; - break; - case DVORAK: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_NOTE_ARRAY(tone_dvorak, false, 0); - #endif - persistent_default_layer_set(1UL<<_DVORAK); - } - return false; - break; - case LOWER: - if (record->event.pressed) { - layer_on(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case RAISE: - if (record->event.pressed) { - layer_on(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case ADJUST: - if (record->event.pressed) { - layer_on(_ADJUST); - } else { - layer_off(_ADJUST); - } - return false; - break; - } - return true; -} diff --git a/keyboards/handwired/xeal60/keymaps/mjt/rules.mk b/keyboards/handwired/xeal60/keymaps/mjt/rules.mk deleted file mode 100644 index 874d09eab..000000000 --- a/keyboards/handwired/xeal60/keymaps/mjt/rules.mk +++ /dev/null @@ -1,25 +0,0 @@ - -# Build Options -# change to "no" to disable the options, or define them in the Makefile in -# the appropriate keymap folder that will get included automatically -# -BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = no # Console for debug(+400) -COMMAND_ENABLE = no # Commands for debug and configuration -NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality -MIDI_ENABLE = no # MIDI controls -AUDIO_ENABLE = no # Audio output on port C6 -UNICODE_ENABLE = no # Unicode -BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. -SWAP_HANDS_ENABLE = no # Enable one-hand typing - -# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE -SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend - -ifndef QUANTUM_DIR - include ../../../../Makefile -endif \ No newline at end of file diff --git a/keyboards/handwired/xeal60/keymaps/mtdjr/config.h b/keyboards/handwired/xeal60/keymaps/mtdjr/config.h deleted file mode 100644 index afbf73569..000000000 --- a/keyboards/handwired/xeal60/keymaps/mtdjr/config.h +++ /dev/null @@ -1,43 +0,0 @@ -/* -This is the c configuration file for the keymap - -Copyright 2012 Jun Wako -Copyright 2015 Jack Humbert - -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 . -*/ - -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -#define SOLENOID_ENABLE -#define SOLENOID_PIN F4 - -#undef RGBLED_NUM -#define RGBLIGHT_ANIMATIONS -#define RGBLED_NUM 8 - -/* Use I2C or Serial, not both */ - -#define USE_SERIAL -// #define USE_I2C -/* Select hand configuration */ - - #define MASTER_LEFT -// #define _MASTER_RIGHT -// #define EE_HANDS - -#endif diff --git a/keyboards/handwired/xeal60/keymaps/mtdjr/keymap.c b/keyboards/handwired/xeal60/keymaps/mtdjr/keymap.c deleted file mode 100644 index 47972fcd3..000000000 --- a/keyboards/handwired/xeal60/keymaps/mtdjr/keymap.c +++ /dev/null @@ -1,55 +0,0 @@ -#include QMK_KEYBOARD_H -#include "mtdjr.h" - -extern keymap_config_t keymap_config; - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - - [_QWERTY] = LAYOUT_kc( -// ,-----------------------------. .-----------------------------. - TAB, Q , W , E , R , T , Y , U , I , O , P ,BSPC, -// |----+----+----+----+----+----| |----+----+----+----+----+----| - EXC, A , S , D , F , G , H , J , K , L ,SCLN,QUOT, -// |----+----+----+----+----+----| |----+----+----+----+----+----| - LSFT, Z , X , C , V , B , N , M ,COMM, DOT,SLSH, ENT, -// |----+----+----+----+----+----| |----+----+----+----+----+----| - LOWR,LCTL,LALT,LGUI,LOWR, SPC, SPC,RASE,LEFT,DOWN, UP ,RGHT -// '-----------------------------' '-----------------------------' - ), - - [_LOWER] = LAYOUT_kc( -// ,-----------------------------. .-----------------------------. - TILD, 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 , DEL, -// |----+----+----+----+----+----| |----+----+----+----+----+----| - xxxx,xxxx,xxxx,xxxx,xxxx,xxxx, xxxx,xxxx,xxxx,LBRC,RBRC,BSLS, -// |----+----+----+----+----+----| |----+----+----+----+----+----| - ,UNDO, CUT,XCPY,XINS,xxxx, xxxx,xxxx,xxxx,xxxx,xxxx, , -// |----+----+----+----+----+----| |----+----+----+----+----+----| - , , , , , , , , , , , -// '-----------------------------' '-----------------------------' - ), - - [_RAISE] = LAYOUT_kc( -// ,-----------------------------. .-----------------------------. - GRV,EXLM, AT ,HASH, DLR,PERC, CIRC,AMPR,ASTR,LPRN,RPRN, , -// |----+----+----+----+----+----| |----+----+----+----+----+----| - xxxx,xxxx,xxxx,xxxx,xxxx,xxxx, MINS, EQL,xxxx,LCBR,RCBR,PIPE, -// |----+----+----+----+----+----| |----+----+----+----+----+----| - ,xxxx,xxxx,xxxx,xxxx,xxxx, UNDS,PLUS,xxxx,xxxx,xxxx, , -// |----+----+----+----+----+----| |----+----+----+----+----+----| - , , , , , , , ,MNXT,VOLD,VOLU,MPLY -// '-----------------------------' '-----------------------------' - ), - - [_ADJUST] = LAYOUT_kc( \ -// ,-----------------------------. .-----------------------------. - xxxx,ROOT,PPLY,PSEF,xxxx,xxxx, RST,STOG,xxxx,xxxx,xxxx, DEL, -// |----+----+----+----+----+----| |----+----+----+----+----+----| - RGB,RHUI,RSAI,RVAI, MOD,xxxx, F1 , F2 , F3 , F4 , F5 , F6 , -// |----+----+----+----+----+----| |----+----+----+----+----+----| - RBTH,RHUD,RSAD,RVAD,RMOD,xxxx, F7 , F8 , F9 , F10, F11, F12, -// |----+----+----+----+----+----| |----+----+----+----+----+----| - ,xxxx,xxxx,xxxx, ,xxxx, xxxx, ,xxxx,xxxx,xxxx,xxxx -// '-----------------------------' '-----------------------------' - ) -}; diff --git a/keyboards/handwired/xeal60/keymaps/mtdjr/rules.mk b/keyboards/handwired/xeal60/keymaps/mtdjr/rules.mk deleted file mode 100644 index 75e9c6503..000000000 --- a/keyboards/handwired/xeal60/keymaps/mtdjr/rules.mk +++ /dev/null @@ -1,5 +0,0 @@ -ifndef QUANTUM_DIR - include ../../../../Makefile -endif - -RGBLIGHT_ENABLE = yes diff --git a/keyboards/handwired/xeal60/keymaps/normacos/config.h b/keyboards/handwired/xeal60/keymaps/normacos/config.h deleted file mode 100644 index 9f95a869d..000000000 --- a/keyboards/handwired/xeal60/keymaps/normacos/config.h +++ /dev/null @@ -1,37 +0,0 @@ -/* -This is the c configuration file for the keymap - -Copyright 2012 Jun Wako -Copyright 2015 Jack Humbert - -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 . -*/ - -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -/* Use I2C or Serial, not both */ - -#define USE_SERIAL -// #define USE_I2C - -/* Select hand configuration */ - -// #define MASTER_LEFT -// #define _MASTER_RIGHT -#define EE_HANDS - -#endif diff --git a/keyboards/handwired/xeal60/keymaps/normacos/keymap.c b/keyboards/handwired/xeal60/keymaps/normacos/keymap.c deleted file mode 100644 index 8902b7b56..000000000 --- a/keyboards/handwired/xeal60/keymaps/normacos/keymap.c +++ /dev/null @@ -1,213 +0,0 @@ -#include QMK_KEYBOARD_H - -extern keymap_config_t keymap_config; - -// Each layer gets a name for readability, which is then used in the keymap matrix below. -// The underscores don't mean anything - you can have a layer called STUFF or any other name. -// Layer names don't all need to be of the same length, obviously, and you can also skip them -// entirely and just use numbers. -#define _NORMAN 0 -#define _LOWER 1 -#define _RAISE 2 -#define _ADJUST 3 - -// To be used in process_record_user -enum custom_keycodes { - NORMAN = SAFE_RANGE, - LOWER, - RAISE, - ADJUST, - SH_LOG, - SH_GOUP, - SH_TERM, - SPOT, - SLACK, - OUTLOOK, - CHROME -}; - -// Fillers (to make layering more clear) -#define _______ KC_TRNS -#define XXXXXXX KC_NO - -// Mod taps -#define SFT_ENT SFT_T(KC_ENT) // Tap for Enter, hold for Shift -#define CTL_ESC CTL_T(KC_ESC) // Tap for Escape, hold for Control - -// Custom macros -#define SCN_SHT LSFT(LGUI(KC_4)) // Take a screenshot (MacOS) -#define SCN_LCK LCTL(LGUI(KC_Q)) // Lock screen (MacOS) -#define SH_HOME LCTL(KC_A) // Go to start of line -#define SH_END LCTL(KC_E) // Go to end of line -#define SH_RSCH LCTL(KC_R) // Search command history -#define SH_CLRH LCTL(KC_U) // Erase to beginning of line -#define SH_CLRE LCTL(KC_K) // Erase to end of line - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - -/* Norman - * ,-----------------------------------------. ,-----------------------------------------. - * | Tab | Q | W | D | F | K | | J | U | R | L | ; | Bksp | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * |CtlEsc| A | S | E | T | G | | Y | N | I | O | H | ' | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | | P | M | , | . | / |SftEnt| - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Lock | Home | End | Alt | Lower| GUI | | Space| Raise| Left | Down | Up | Right| - * `-----------------------------------------' `-----------------------------------------' - */ -[_NORMAN] = LAYOUT_ortho_4x12( \ - KC_TAB, KC_Q, KC_W, KC_D, KC_F, KC_K, KC_J, KC_U, KC_R, KC_L, KC_SCLN, KC_BSPC, \ - CTL_ESC, KC_A, KC_S, KC_E, KC_T, KC_G, KC_Y, KC_N, KC_I, KC_O, KC_H, KC_QUOT, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_P, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_ENT, \ - SCN_LCK, KC_HOME, KC_END, KC_LALT, LOWER, KC_LGUI, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT -), - -/* Lower - * ,-----------------------------------------. ,-----------------------------------------. - * | Tab | F1 | F2 | F3 | F4 | | |NumLck| 7 | 8 | 9 | = | Bksp | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * |CtlEsc| F5 | F6 | F7 | F8 | | | * | 4 | 5 | 6 | + | Del | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Shift| F9 | F10 | F11 | F12 | | | / | 1 | 2 | 3 | - |SftEnt| - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Lock | Home | End | Alt | Lower| GUI | | . | Raise| 0 | Spot |Chrome| | - * `-----------------------------------------' `-----------------------------------------' - */ -[_LOWER] = LAYOUT_ortho_4x12( \ - _______, KC_F1, KC_F2, KC_F3, KC_F4, XXXXXXX, KC_NLCK, KC_P7, KC_P8, KC_P9, KC_PEQL, _______, \ - _______, KC_F5, KC_F6, KC_F8, KC_F9, XXXXXXX, KC_PAST, KC_P4, KC_P5, KC_P6, KC_PPLS, KC_DEL, \ - _______, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, KC_PSLS, KC_P1, KC_P2, KC_P3, KC_PMNS, _______, \ - _______, _______, _______, _______, _______, _______, KC_PDOT, _______, KC_P0, SPOT, CHROME, XXXXXXX -), - -/* Raise - * ,-----------------------------------------. ,-----------------------------------------. - * | Tab | ! | @ | # | $ | % | | ^ | & | * | ( | ) | Del | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * |CtlEsc| Log | UpDir| Slack| Term | OutLk| | = | - | \ | [ | ] | ` | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Shift|ClrHom|ClrEnd|ShHome| ShEnd|Search| | Play | Mute | VolDn| VolUp|ScnSht|SftEnt| - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Lock | Home | End | Alt | Lower| GUI | | Space| Raise| Left | Down | Up | Right| - * `-----------------------------------------' `-----------------------------------------' - */ -[_RAISE] = LAYOUT_ortho_4x12( \ - _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \ - _______, SH_LOG, SH_GOUP, SLACK, SH_TERM, OUTLOOK, KC_EQL, KC_MINS, KC_BSLS, KC_LBRC, KC_RBRC, KC_GRV, \ - _______, SH_CLRH, SH_CLRE, SH_HOME, SH_END, SH_RSCH, KC_MPLY, KC_MUTE, KC_VOLD, KC_VOLU, SCN_SHT, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ -), - -/* Adjust (Lower + Raise) - * ,-----------------------------------------. ,-----------------------------------------. - * | | | | | | | | | | | | Reset| | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | | | | AudOn|AudOff| | |Norman| | | | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | | | | | | | | | | | | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | | | | Lower| | | | Raise| | | | | - * `-----------------------------------------' `-----------------------------------------' - */ -[_ADJUST] = LAYOUT_ortho_4x12( \ - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET, XXXXXXX, \ - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, AU_ON, AU_OFF, XXXXXXX, NORMAN, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX -) - -}; - -#ifdef AUDIO_ENABLE -float tone_norman[][2] = SONG(QWERTY_SOUND); -#endif - -void persistent_default_layer_set(uint16_t default_layer) { - eeconfig_update_default_layer(default_layer); - default_layer_set(default_layer); -} - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - if (record->event.pressed) { - switch(keycode) { - case NORMAN: - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_norman); - #endif - persistent_default_layer_set(1UL<<_NORMAN); - return false; - case LOWER: - layer_on(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - return false; - case RAISE: - layer_on(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - return false; - case ADJUST: - layer_on(_ADJUST); - return false; - case SH_LOG: // Open Jira log work window - SEND_STRING(SS_TAP(X_DOT)); - _delay_ms(100); - SEND_STRING("log work"); - _delay_ms(100); - SEND_STRING(SS_TAP(X_ENTER)); - return false; - case SH_GOUP: // Go up a directory - SEND_STRING("cd .."SS_TAP(X_ENTER)); - return false; - case SH_TERM: // Open Terminal - SEND_STRING(SS_LGUI(SS_TAP(X_SPACE))); - _delay_ms(100); - SEND_STRING("terminal"); - _delay_ms(100); - SEND_STRING(SS_TAP(X_ENTER)); - return false; - case SPOT: // Open Spotify - SEND_STRING(SS_LGUI(SS_TAP(X_SPACE))); - _delay_ms(100); - SEND_STRING("spotify app"); - _delay_ms(100); - SEND_STRING(SS_TAP(X_ENTER)); - return false; - case SLACK: // Open Slack - SEND_STRING(SS_LGUI(SS_TAP(X_SPACE))); - _delay_ms(100); - SEND_STRING("slack"); - _delay_ms(100); - SEND_STRING(SS_TAP(X_ENTER)); - return false; - case OUTLOOK: // Open MS Outlook - SEND_STRING(SS_LGUI(SS_TAP(X_SPACE))); - _delay_ms(100); - SEND_STRING("outlook"); - _delay_ms(100); - SEND_STRING(SS_TAP(X_ENTER)); - return false; - case CHROME: // Open Chrome - SEND_STRING(SS_LGUI(SS_TAP(X_SPACE))); - _delay_ms(100); - SEND_STRING("chrome"); - _delay_ms(100); - SEND_STRING(SS_TAP(X_ENTER)); - return false; - } - } else { - switch(keycode) { - case LOWER: - layer_off(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - return false; - case RAISE: - layer_off(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - return false; - case ADJUST: - layer_off(_ADJUST); - return false; - } - } - return true; -} diff --git a/keyboards/handwired/xeal60/keymaps/normacos/readme.md b/keyboards/handwired/xeal60/keymaps/normacos/readme.md deleted file mode 100644 index 3b7a20632..000000000 --- a/keyboards/handwired/xeal60/keymaps/normacos/readme.md +++ /dev/null @@ -1,86 +0,0 @@ -# normacos -This keymap was designed specifically to be used on a MacOS High Sierra system with constant use of the Terminal, as it includes a multitude of macros for both the terminal as well as Spotlight Search. - -Norman keyboard layout [info page.](https://normanlayout.info/) - -Some Norman layout keys were placed on different layers and different positions based on available space and preference. - - -Macros: -- CtlEsc sends Escape when tapped, and Control when held. -- SftEnt sends Enter when tapped, and Shift when held. -- Lock locks the computer -- Slack opens Slack through Spotlight Search -- Term opens Terminal through Spotlight Search -- Spot opens Spotify through Spotlight Search -- Chrome opens Chrome through Spotlight Search -- OutLk opens Microsoft Outlook through Spotlight Search -- ScnSht allows the user to take a screenshot of a selected portion of the screen -- ClrHom clears Terminal line from beginning of line up to cursor -- ClrEnd clears Terminal line from cursor up to end of line -- ShHome moves Terminal cursor to beginning of line -- ShEnd moves Terminal cursor to end of line -- Search activates Terminal Reverse Search Command History -- Log opens the 'Log Work' modal on Atlassian's Jira web client -- UpDir moves working directory to its parent - -All macros that make use of the SEND_STRING command have a 100 millisecond wait before and after "writing" to let the computer/OS/app catch up. -Any and all empty keys shown below are will be set in the future, and do nothing as of the time of this writing. - - - -## Default (Norman) -``` -,-----------------------------------------. ,-----------------------------------------. -| Tab | Q | W | D | F | K | | J | U | R | L | ; | Bksp | -|------+------+------+------+------+------| |------+------+------+------+------+------| -|CtlEsc| A | S | E | T | G | | Y | N | I | O | H | ' | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| Shift| Z | X | C | V | B | | P | M | , | . | / |SftEnt| -|------+------+------+------+------+------| |------+------+------+------+------+------| -| Lock | Home | End | Alt | Lower| GUI | | Space| Raise| Left | Down | Up | Right| -`-----------------------------------------' `-----------------------------------------' -``` - - -## Lower -``` -,-----------------------------------------. ,-----------------------------------------. -| Tab | F1 | F2 | F3 | F4 | | |NumLck| 7 | 8 | 9 | = | Bksp | -|------+------+------+------+------+------| |------+------+------+------+------+------| -|CtlEsc| F5 | F6 | F7 | F8 | | | * | 4 | 5 | 6 | + | Del | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| Shift| F9 | F10 | F11 | F12 | | | / | 1 | 2 | 3 | - |SftEnt| -|------+------+------+------+------+------| |------+------+------+------+------+------| -| Lock | Home | End | Alt | Lower| GUI | | . | Raise| 0 | Spot |Chrome| | -`-----------------------------------------' `-----------------------------------------' -``` - - -## Raise - -``` -,-----------------------------------------. ,-----------------------------------------. -| Tab | ! | @ | # | $ | % | | ^ | & | * | ( | ) | Del | -|------+------+------+------+------+------| |------+------+------+------+------+------| -|CtlEsc| Log | UpDir| Slack| Term | OutLk| | = | - | \ | [ | ] | ` | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| Shift|ClrHom|ClrEnd|ShHome| ShEnd|Search| | Play | Mute | VolDn| VolUp|ScnSht|SftEnt| -|------+------+------+------+------+------| |------+------+------+------+------+------| -| Lock | Home | End | Alt | Lower| GUI | | Space| Raise| Left | Down | Up | Right| -`-----------------------------------------' `-----------------------------------------' -``` - -## Adjust (Lower + Raise) - -``` -,-----------------------------------------. ,-----------------------------------------. -| | | | | | | | | | | | Reset| | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| | | | | AudOn|AudOff| | |Norman| | | | | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| | | | | | | | | | | | | | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| | | | | Lower| | | | Raise| | | | | -`-----------------------------------------' `-----------------------------------------' -``` diff --git a/keyboards/handwired/xeal60/keymaps/piemod/README.md b/keyboards/handwired/xeal60/keymaps/piemod/README.md deleted file mode 100644 index f2a051da1..000000000 --- a/keyboards/handwired/xeal60/keymaps/piemod/README.md +++ /dev/null @@ -1,31 +0,0 @@ -PieMod -====== - -A keymap for users that need: - -- *P*: Programming symbols. - -- *I*: i3wm. - -- *E*: Emacs. - -- *M*: Macros. - -- *O*: Ortholinear. - -- *D*: Dvorak. - -Still a work-in-progress. Suggestions welcome @ https://github.com/dwrz/piemod. - -### Keymap - -![PieMod Keymap](./keymap.png) - -### TODO - -- [ ] Add Emacs layer. -- [ ] Add Macro layer. -- [ ] Add system control keys (rotation, brightness). -- [ ] Switch " and ' quotes (or function to toggle default). -- [ ] Add capslock. -. diff --git a/keyboards/handwired/xeal60/keymaps/piemod/config.h b/keyboards/handwired/xeal60/keymaps/piemod/config.h deleted file mode 100644 index 001b62e41..000000000 --- a/keyboards/handwired/xeal60/keymaps/piemod/config.h +++ /dev/null @@ -1,49 +0,0 @@ -/* -This is the c configuration file for the keymap - -Copyright 2012 Jun Wako -Copyright 2015 Jack Humbert - -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 . -*/ - -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -/* Use I2C or Serial, not both */ - -#define USE_SERIAL -// #define USE_I2C - -/* Select hand configuration */ - -#define MASTER_LEFT -// #define MASTER_RIGHT -// #define EE_HANDS - -// RGB Options -#undef RGBLED_NUM -#define RGBLED_NUM 10 -#define RGBLIGHT_SLEEP -#define RGBLIGHT_ANIMATIONS -#define RGBLIGHT_EFFECT_SNAKE_LENGTH 1 -#define RGBLIGHT_EFFECT_KNIGHT_LENGTH 1 - -// Typing Options -#define PREVENT_STUCK_MODIFIERS -#define QMK_KEYS_PER_SCAN 4 - -#endif diff --git a/keyboards/handwired/xeal60/keymaps/piemod/keymap.c b/keyboards/handwired/xeal60/keymaps/piemod/keymap.c deleted file mode 100644 index d789b7a8b..000000000 --- a/keyboards/handwired/xeal60/keymaps/piemod/keymap.c +++ /dev/null @@ -1,99 +0,0 @@ -#include QMK_KEYBOARD_H - - -extern keymap_config_t keymap_config; - -#define _DVORAK 0 -#define _ARROW 1 //F(1) -#define _SYMBOL 2 // F(2) -#define _NUMBER 3 // F(3) -#define _FUNCTION 4 // F(4) -#define _EMACS 5 // F(5) -#define _COMBOS 6 // F(6) -#define _MOUSE 7 // F(7) - -enum custom_keycodes { - DVORAK = SAFE_RANGE, - ARROW, - SYMBOL, - NUMBER, - FUNCTION, - EMACS, - COMBOS, - MOUSE, -}; - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - -[_DVORAK] = LAYOUT( \ - KC_ESC, KC_QUOTE, LT(7, KC_COMMA), KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_DELETE, \ - KC_TAB, LT(1, KC_A), LT(2, KC_O), LT(3, KC_E), LT(4, KC_U), KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_ENTER, \ - KC_LSHIFT, KC_SCOLON, LT(5, KC_Q), KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_MINUS, \ - F(1), LT(6, KC_LCTRL), KC_MENU, KC_LALT, KC_LGUI, KC_BSPACE, KC_SPACE, KC_RCTRL, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT \ -), - -[_ARROW] = LAYOUT( \ - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_HOME, KC_UP, KC_END, KC_PGUP, \ - KC_NO, KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_LEFT, KC_DOWN, KC_RIGHT, KC_PGDN, \ - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_HOME, KC_PGDN, KC_PGUP, KC_END, KC_NO, \ - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO \ -), - -[_SYMBOL] = LAYOUT( \ - KC_TILD, KC_GRAVE, KC_NO, KC_EQUAL, KC_PLUS, KC_NO, KC_LBRACKET, KC_RBRACKET, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, \ - KC_NO, KC_NO, KC_TRNS, KC_SCOLON, KC_COLN, KC_NO, KC_LCBR, KC_RCBR, KC_DLR, KC_PERC, KC_CIRC, F(2), \ - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_BSLASH, KC_SLASH, KC_EXLM, KC_AT, KC_HASH, KC_PIPE, \ - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_ASTR, KC_SLASH, KC_MINUS, KC_PLUS, KC_EQUAL \ -), - -[_NUMBER] = LAYOUT( \ - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_7, KC_8, KC_9, KC_NO, \ - KC_NO, KC_NO, KC_NO, KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_4, KC_5, KC_6, KC_NO, \ - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_0, KC_1, KC_2, KC_3, KC_NO, \ - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_ASTR, KC_SLASH, KC_MINUS, KC_PLUS, KC_EQUAL \ -), - -[_FUNCTION] = LAYOUT( \ - KC_PSCREEN, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, \ - KC_NO, RGB_HUI, RGB_SAI, RGB_VAI, KC_TRNS, KC_NO, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ - KC_NO, RGB_HUD, RGB_SAD, RGB_VAD, KC_NO, KC_NO, KC_NO, KC_NO, KC_AUDIO_MUTE, KC_AUDIO_VOL_DOWN, KC_AUDIO_VOL_UP, KC_MEDIA_PLAY_PAUSE, \ - RESET, RGB_TOG, RGB_MOD, KC_NO, KC_NO, KC_NO, KC_DELETE, KC_INSERT, KC_HOME, KC_PGDN, KC_PGUP, KC_END \ -), - -[_EMACS] = LAYOUT( \ - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ - KC_NO, KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO \ -), - -[_COMBOS] = LAYOUT( \ - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ - KC_NO, KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO \ -), - -[_MOUSE] = LAYOUT( \ - KC_NO, KC_NO, KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_MS_U, KC_NO, KC_NO, \ - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_MS_L, KC_MS_D, KC_MS_R, KC_NO, \ - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_MS_BTN1, KC_MS_BTN2, KC_MS_BTN3, KC_NO, KC_NO, KC_NO \ -) -}; - -enum function_id { - TEENSY_KEY, - CUSTOM_KEY, - L_CTRL_ALT_ENT, - R_CTRL_ALT_ENT, -}; - -int CAPSLOCKED = 0; - - const uint16_t PROGMEM fn_actions[] = { - // Special Keys - [1] = ACTION_MODS_KEY(KC_LCTRL, KC_LALT), // FN10 = Ctrl + Alt. - // Symbols - [2] = ACTION_MODS_KEY(MOD_LSFT, KC_SLASH), // FN21 = Question mark. - }; diff --git a/keyboards/handwired/xeal60/keymaps/piemod/rules.mk b/keyboards/handwired/xeal60/keymaps/piemod/rules.mk deleted file mode 100644 index 027ea977e..000000000 --- a/keyboards/handwired/xeal60/keymaps/piemod/rules.mk +++ /dev/null @@ -1,13 +0,0 @@ -BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = no # Console for debug(+400) -COMMAND_ENABLE = yes # Commands for debug and configuration -NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality -MIDI_ENABLE = no # MIDI controls -AUDIO_ENABLE = no # Audio output on port C6 -UNICODE_ENABLE = yes # Unicode -BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. -SUBPROJECT_rev1 = no diff --git a/keyboards/handwired/xeal60/keymaps/pitty/README.md b/keyboards/handwired/xeal60/keymaps/pitty/README.md deleted file mode 100644 index 1662fce7a..000000000 --- a/keyboards/handwired/xeal60/keymaps/pitty/README.md +++ /dev/null @@ -1,91 +0,0 @@ -# Pittyolo's Let's Split Layout - -This is my Let's Split layout, modified for my ISO Hungarian taste :) - -Added some layer feedback in the underglow, but it's still a WIP. - -I wrote the keys that will appear when using Hungarian layout in Windows and the respective English keys in brackets. - - - ### Qwerty -``` -,-----------------------------------------------------------------------------------. -| Tab | Q | W | E | R | T | Z(Y)| U | I | O | P | Bksp | -|------+------+------+------+------+-------------+------+------+------+------+------| -| Esc | A | S | D |LTVIMF| G | H | J | K | L | É(;)| Á(") | -|------+------+------+------+------+------|------+------+------+------+------+------| -|Í/Shft| Y(Z) | X | C | V | B | N | M | , | . | -(/)| Shift| -|------+------+------+------+------+------+------+------+------+------+------+------| -| Ctrl | GUI | Alt |ADJUST| Spc | LOWER| Bksp | Ent | Alt | =(&) | GAME | Del | -`-----------------------------------------------------------------------------------' -``` - - Tap left shift writes the missing ISO key, hold is Shift. - - - ### Gaming mode (Toggle layer) -``` -,-----------------------------------------------------------------------------------. -| | | | | | | | | | | |Lower | -|------+------+------+------+------+------+------+------+------+------+------+------| -| | | | | F | | | | | | | | -|------+------+------+------+------+------+------+------+------+------+------+------| -| Shift| | | | | | | | | | |QWERTY| -|------+------+------+------+------+------+------+------+------+------+------+------| -| | | | | | | | | Left | Down | Up | Right| -`-----------------------------------------------------------------------------------' -``` - -Disabled some of the functions in the main layer to help with better gaming experience. - - - ### Lower (Hold down right Space) -``` -,-----------------------------------------------------------------------------------. -| 0(') | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Ö(0) | Ü(-) | -|------+------+------+------+------+------+------+------+------+------+------+------| -| F10 | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F11 | F12 | -|------+------+------+------+------+-------------+------+------+------+------+------| -| | | | | | | | | Ins | Home | PgUp | Shift| -|------+------+------+------+------+------+------+------+------+------+------+------| -| | | | | | | | | Del | End | PgDn | AltGr| -`-----------------------------------------------------------------------------------' -``` - - Function layer with everything that is missing from the main layer. - - - ### NAV (double tap toggles the layer, and hold for momentary switch) -``` -,-----------------------------------------------------------------------------------. -| | | Up | | F2 | | | 7 | 8 | 9 | / | | -|------+------+------+------+------+------|------+------+------+------+------+------| -| | Left | Down | Right| | | | 4 | 5 | 6 | * | | -|------+------+------+------+------+------|------+------+------+------+------+------| -| Shift| | | | | | | 1 | 2 | 3 | - | | -|------+------+------+------+------+------|------+------+------+------+------+------| -| | | | | | | | 0 | . | = | + | | -`-----------------------------------------------------------------------------------' -``` - - Navigation layer with a numpad on the right side. - - - - ### Vim Movement (Hold down F) -``` -,-----------------------------------------------------------------------------------. -|RGBMOD|RGBTOG| | | | | | Ú | Í | Ó | Ő | Ű | -|------+------+------+------+------+------+------+------+------+------+------+------| -|DM_stp| | | LCTRL| | | Left | Down | Up | Right| | | -|------+------+------+------+------+------+------+------+------+------+------+------| -|DM_REC| | | | | | | | | | | | -|------+------+------+------+------+------+------+------+------+------+------+------| -| | | | | LShft| | | | | | | RESET| -`-----------------------------------------------------------------------------------' -``` - - Turns hjkl into vim movement. I moved accented Hungarian letters here. - - - diff --git a/keyboards/handwired/xeal60/keymaps/pitty/config.h b/keyboards/handwired/xeal60/keymaps/pitty/config.h deleted file mode 100644 index 3798f9a64..000000000 --- a/keyboards/handwired/xeal60/keymaps/pitty/config.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -/* Use I2C or Serial, not both */ - -#define USE_SERIAL -// #define USE_I2C - -/* Select hand configuration */ - -#define MASTER_LEFT -// #define MASTER_RIGHT -// #define EE_HANDS - -#define TAPPING_TOGGLE 2 - -#undef RGBLED_NUM -#define RGBLIGHT_ANIMATIONS -#define RGBLED_NUM 2 -#define RGBLIGHT_HUE_STEP 8 -#define RGBLIGHT_SAT_STEP 8 -#define RGBLIGHT_VAL_STEP 8 - -#endif diff --git a/keyboards/handwired/xeal60/keymaps/pitty/keymap.c b/keyboards/handwired/xeal60/keymaps/pitty/keymap.c deleted file mode 100644 index 0fd4c1384..000000000 --- a/keyboards/handwired/xeal60/keymaps/pitty/keymap.c +++ /dev/null @@ -1,169 +0,0 @@ -#include QMK_KEYBOARD_H - - -//Following line allows macro to read current RGB settings -extern rgblight_config_t rgblight_config; - -extern keymap_config_t keymap_config; - -#define _QWERTY 0 -#define _GAME 1 -#define _LOWER 2 -#define _NAV 3 -#define _VIM 4 - -enum custom_keycodes { - QWERTY = SAFE_RANGE, - GAME, - LOWER, - NAV, - VIM, -}; - - -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - -/* Qwerty - * ,-----------------------------------------------------------------------------------. - * | Tab | Q | W | E | R | T | Z(Y)| U | I | O | P | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | S | D |LTVIMF| G | H | J | K | L | É(;)| Á(") | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * |Í/Shft| Y(Z) | X | C | V | B | N | M | , | . | -(/)| Shift| - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Ctrl | GUI | Alt |ADJUST| Spc | LOWER| Bksp | Ent | Alt | =(&) | GAME | Del | - * `-----------------------------------------------------------------------------------' - */ -[_QWERTY] = LAYOUT( \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ - KC_ESC, KC_A, KC_S, KC_D, LT(_VIM, KC_F), KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ - MT(MOD_LSFT, KC_NUBS), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \ - KC_LCTL, KC_LGUI, KC_LALT, TT(_NAV), KC_SPC, LT(_LOWER, KC_SPC), KC_BSPC, KC_ENT, KC_RALT, KC_AMPERSAND, TG(_GAME), KC_DEL \ -), - -/* Gaming mode - * ,-----------------------------------------------------------------------------------. - * | | | | | | | | | | | |Lower | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | F | | | | | | | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Shift| | | | | | | | | | |QWERTY| - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | Left | Down | Up | Right| - * `-----------------------------------------------------------------------------------' - */ -[_GAME] = LAYOUT( \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, OSL(_LOWER), \ - _______, _______, _______, _______, KC_F, _______, _______, _______, _______, _______, _______, _______, \ - KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, TO(_QWERTY), \ - _______, _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ -), - -/* Lower - * ,-----------------------------------------------------------------------------------. - * | 0(') | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Ö(0) | Ü(-) | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | F10 | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F11 | F12 | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | | | | | | | Ins | Home | PgUp | Shift| - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | Del | End | PgDn | AltGr| - * `-----------------------------------------------------------------------------------' - */ -[_LOWER] = LAYOUT( \ - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, \ - KC_F10, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F11, KC_F12, \ - _______, _______, _______, _______, _______, _______, _______, _______, KC_INS, KC_HOME, KC_PGUP, KC_RSFT, \ - _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, KC_END, KC_PGDN, KC_RALT \ -), - - -/* NAV - * ,-----------------------------------------------------------------------------------. - * | | | Up | | F2 | | | 7 | 8 | 9 | / | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | Left | Down | Right| | | | 4 | 5 | 6 | * | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| | | | | | | 1 | 2 | 3 | - | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | | | | | | | 0 | . | = | + | | - * `-----------------------------------------------------------------------------------' - */ -[_NAV] = LAYOUT( \ - _______, _______, KC_UP, _______, KC_F2, _______, _______, KC_7, KC_8, KC_9, KC_KP_SLASH, _______, \ - _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, KC_4, KC_5, KC_6, KC_KP_ASTERISK, _______, \ - KC_LSFT, _______, _______, _______, _______, _______, _______, KC_1, KC_2, KC_3, KC_KP_MINUS, _______, \ - _______, _______, _______, _______, _______, _______, _______, KC_GRV, KC_KP_DOT, KC_KP_EQUAL, KC_KP_PLUS, _______ \ -), - -/* Vim Movement (Hold down F) - * ,-----------------------------------------------------------------------------------. - * |RGBMOD|RGBTOG| | | | | | Ú | Í | Ó | Ő | Ű | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * |DM_stp| | | LCTRL| | | Left | Down | Up | Right| | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * |DM_REC| | | | | | | | | | | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | LShft| | | | | | | RESET| - * `-----------------------------------------------------------------------------------' - */ -[_VIM] = LAYOUT( \ - RGB_MOD, RGB_TOG, _______, _______, _______, _______, _______, KC_RBRC, KC_NUBS, KC_EQL , KC_LBRC, KC_NUHS, \ - _______, _______, _______, KC_LCTL, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ - _______, _______, _______, _______, KC_LSFT, _______, _______, _______, _______, _______, _______, RESET \ -) - - -}; - -// define variables for reactive RGB -bool RGB_INIT = false; -bool TOG_STATUS = false; -int RGB_current_mode; - -void persistent_default_layer_set(uint16_t default_layer) { - eeconfig_update_default_layer(default_layer); - default_layer_set(default_layer); -} - - -void matrix_scan_user(void) { - uint8_t layer = biton32(layer_state); - switch (layer) { - case _NAV: - if (RGB_INIT) {} else { - RGB_current_mode = rgblight_config.mode; - RGB_INIT = true; - } - if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false - } else { - TOG_STATUS = !TOG_STATUS; - rgblight_mode(29); - } - break; - case _LOWER: - if (RGB_INIT) {} else { - RGB_current_mode = rgblight_config.mode; - RGB_INIT = true; - } - if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false - } else { - TOG_STATUS = !TOG_STATUS; - rgblight_mode(29); - } - break; - case _QWERTY: - if (RGB_INIT) {} else { - RGB_current_mode = rgblight_config.mode; - RGB_INIT = true; - } - rgblight_mode(RGB_current_mode); // revert RGB to initial mode prior to RGB mode change - TOG_STATUS = false; - break; - } - }; diff --git a/keyboards/handwired/xeal60/keymaps/pitty/rules.mk b/keyboards/handwired/xeal60/keymaps/pitty/rules.mk deleted file mode 100644 index 8ebc85a44..000000000 --- a/keyboards/handwired/xeal60/keymaps/pitty/rules.mk +++ /dev/null @@ -1,6 +0,0 @@ -RGBLIGHT_ENABLE = yes -NKRO_ENABLE = yes - -ifndef QUANTUM_DIR - include ../../../../Makefile -endif diff --git a/keyboards/handwired/xeal60/keymaps/poker/config.h b/keyboards/handwired/xeal60/keymaps/poker/config.h deleted file mode 100644 index 5a6261c4f..000000000 --- a/keyboards/handwired/xeal60/keymaps/poker/config.h +++ /dev/null @@ -1,37 +0,0 @@ -/* -This is the c configuration file for the keymap - -Copyright 2012 Jun Wako -Copyright 2015 Jack Humbert - -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 . -*/ - -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -/* Use I2C or Serial, not both */ - -#define USE_SERIAL -// #define USE_I2C - -/* Select hand configuration */ - -#define MASTER_LEFT -// #define MASTER_RIGHT -// #define EE_HANDS - -#endif diff --git a/keyboards/handwired/xeal60/keymaps/poker/keymap.c b/keyboards/handwired/xeal60/keymaps/poker/keymap.c deleted file mode 100644 index cce0ca474..000000000 --- a/keyboards/handwired/xeal60/keymaps/poker/keymap.c +++ /dev/null @@ -1,240 +0,0 @@ -#include QMK_KEYBOARD_H - - -extern keymap_config_t keymap_config; - -// Each layer gets a name for readability, which is then used in the keymap matrix below. -// The underscores don't mean anything - you can have a layer called STUFF or any other name. -// Layer names don't all need to be of the same length, obviously, and you can also skip them -// entirely and just use numbers. -#define _QWERTY 0 -#define _COLEMAK 1 -#define _DVORAK 2 -#define _LOWER 3 -#define _RAISE 4 -#define _FN 5 -#define _ADJUST 16 - -enum custom_keycodes { - QWERTY = SAFE_RANGE, - COLEMAK, - DVORAK, - LOWER, - RAISE, - FN, - ADJUST -}; - -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - -/* Qwerty - * ,-----------------------------------------------------------------------------------. - * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Func | A | S | D | F | G | H | J | K | L | ; | " | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Ctrl | GUI | Esc | Alt |Lower | Esc |Space |Raise | Left | Up | Down |Right | - * `-----------------------------------------------------------------------------------' - */ -[_QWERTY] = LAYOUT( \ - KC_TAB , KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ - FN , KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ - SFT_T(KC_ESC) , KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, MT(MOD_RSFT, KC_ENT), \ - KC_LCTL , KC_LGUI, KC_ESC, KC_LALT, LOWER, KC_ESC, KC_SPC, RAISE, KC_LEFT, KC_UP, KC_DOWN, KC_RGHT \ -), - -/* Colemak - * ,-----------------------------------------------------------------------------------. - * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Func | A | R | S | T | D | H | N | E | I | O | " | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Ctrl | GUI | Esc | Alt |Lower | Esc |Space |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' - */ -[_COLEMAK] = LAYOUT( \ - KC_TAB , KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, \ - FN , KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \ - SFT_T(KC_ESC) , KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, MT(MOD_RSFT, KC_ENT), \ - KC_LCTL , KC_LGUI, KC_ESC, KC_LALT, LOWER, KC_ESC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ -), - -/* Dvorak - * ,-----------------------------------------------------------------------------------. - * | Tab | " | , | . | P | Y | F | G | C | R | L | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Func | A | O | E | U | I | D | H | T | N | S | / | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Ctrl | GUI | Esc | Alt |Lower | Esc |Space |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' - */ -[_DVORAK] = LAYOUT( \ - KC_TAB , KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, \ - FN , KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, \ - SFT_T(KC_ESC) , KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, MT(MOD_RSFT, KC_ENT), \ - KC_LCTL , KC_LGUI, KC_ESC, KC_LALT, LOWER, KC_ESC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ -), - -/* Lower - * ,-----------------------------------------------------------------------------------. - * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | Home | End | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | Home |Pg Up |Pg Dn | End | - * `-----------------------------------------------------------------------------------' - */ -[_LOWER] = LAYOUT( \ - KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL , \ - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_NUHS), S(KC_NUBS), KC_HOME, KC_END, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, KC_PGDN, KC_END \ -), - -/* Raise - * ,-----------------------------------------------------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / |Pg Up |Pg Dn | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | Home |Pg Up |Pg Dn | End | - * `-----------------------------------------------------------------------------------' - */ -[_RAISE] = LAYOUT( \ - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL , \ - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, KC_PGDN, KC_END \ -), - -/* Function - * ,-----------------------------------------------------------------------------------. - * | Esc | | Prev | Play | Next | | |Pg Up | Up |Pg Dn |Prt Sc| Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | Vol- | Mute | Vol+ | | Home | Left | Down |Right | End | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | | | | | | | | | | | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | Esc | | | Esc | Home |Pg Up |Pg Dn | End | - * `-----------------------------------------------------------------------------------' - */ -[_FN] = LAYOUT( \ - KC_ESC , _______, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______, KC_PGUP, KC_UP, KC_PGDN, KC_PSCR, KC_DEL, \ - _______, _______, KC_VOLD, KC_MUTE, KC_VOLU, _______, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END , _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ - _______, _______, _______, _______, KC_ESC , _______, _______, KC_ESC , KC_HOME, KC_PGUP, KC_PGDN, KC_END \ -), - -/* Adjust (Lower + Raise) - * ,-----------------------------------------------------------------------------------. - * | | Reset| | | | | | | | | | Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Caps |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof| | | | | Caps | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | | | - * `-----------------------------------------------------------------------------------' - */ - [_ADJUST] = LAYOUT( \ - _______, RESET, DEBUG, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL , \ - _______, _______, MU_MOD, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ - KC_CAPS, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, KC_CAPS, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ - ) - -}; - -#ifdef AUDIO_ENABLE -float tone_qwerty[][2] = SONG(QWERTY_SOUND); -float tone_dvorak[][2] = SONG(DVORAK_SOUND); -float tone_colemak[][2] = SONG(COLEMAK_SOUND); -#endif - -void persistent_default_layer_set(uint16_t default_layer) { - eeconfig_update_default_layer(default_layer); - default_layer_set(default_layer); -} - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case QWERTY: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_qwerty); - #endif - persistent_default_layer_set(1UL<<_QWERTY); - } - return false; - break; - case COLEMAK: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_colemak); - #endif - persistent_default_layer_set(1UL<<_COLEMAK); - } - return false; - break; - case DVORAK: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_dvorak); - #endif - persistent_default_layer_set(1UL<<_DVORAK); - } - return false; - break; - case LOWER: - if (record->event.pressed) { - layer_on(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case RAISE: - if (record->event.pressed) { - layer_on(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case FN: - if (record->event.pressed) { - layer_on(_FN); - } else { - layer_off(_FN); - } - return false; - break; - case ADJUST: - if (record->event.pressed) { - layer_on(_ADJUST); - } else { - layer_off(_ADJUST); - } - return false; - break; - } - return true; -} diff --git a/keyboards/handwired/xeal60/keymaps/poker/rules.mk b/keyboards/handwired/xeal60/keymaps/poker/rules.mk deleted file mode 100644 index 457a3d01d..000000000 --- a/keyboards/handwired/xeal60/keymaps/poker/rules.mk +++ /dev/null @@ -1,3 +0,0 @@ -ifndef QUANTUM_DIR - include ../../../../Makefile -endif diff --git a/keyboards/handwired/xeal60/keymaps/smt/config.h b/keyboards/handwired/xeal60/keymaps/smt/config.h deleted file mode 100644 index 5a6261c4f..000000000 --- a/keyboards/handwired/xeal60/keymaps/smt/config.h +++ /dev/null @@ -1,37 +0,0 @@ -/* -This is the c configuration file for the keymap - -Copyright 2012 Jun Wako -Copyright 2015 Jack Humbert - -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 . -*/ - -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -/* Use I2C or Serial, not both */ - -#define USE_SERIAL -// #define USE_I2C - -/* Select hand configuration */ - -#define MASTER_LEFT -// #define MASTER_RIGHT -// #define EE_HANDS - -#endif diff --git a/keyboards/handwired/xeal60/keymaps/smt/keymap.c b/keyboards/handwired/xeal60/keymaps/smt/keymap.c deleted file mode 100644 index 090cf78b7..000000000 --- a/keyboards/handwired/xeal60/keymaps/smt/keymap.c +++ /dev/null @@ -1,218 +0,0 @@ -#include QMK_KEYBOARD_H - - -extern keymap_config_t keymap_config; - -// Each layer gets a name for readability, which is then used in the keymap matrix below. -// The underscores don't mean anything - you can have a layer called STUFF or any other name. -// Layer names don't all need to be of the same length, obviously, and you can also skip them -// entirely and just use numbers. -#define _QWERTY 0 -#define _COLEMAK 1 -#define _DVORAK 2 -#define _LOWER 3 -#define _RAISE 4 -#define _ADJUST 16 - -enum custom_keycodes { - QWERTY = SAFE_RANGE, - COLEMAK, - DVORAK, - LOWER, - RAISE, - ADJUST, -}; - -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO - -// Custom macros -#define CTL_ESC CTL_T(KC_ESC) // Tap for Esc, hold for Ctrl -#define SFT_ENT SFT_T(KC_ENT) // Tap for Enter, hold for Shift -#define HPR_TAB ALL_T(KC_TAB) // Tap for Tab, hold for Hyper (Super+Ctrl+Alt+Shift) -#define MEH_GRV MEH_T(KC_GRV) // Tap for Backtick, hold for Meh (Ctrl+Alt+Shift) - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - -/* Qwerty - * ,-----------------------------------------. ,-----------------------------------------. - * | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Esc | A | S | D | F | G | | H | J | K | L | ; | " | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | | N | M | , | . | / |Enter | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | ` | Ctrl | Alt | GUI |Lower |Space | |Space |Raise | Left | Down | Up |Right | - * `-----------------------------------------' `-----------------------------------------' - */ -[_QWERTY] = LAYOUT( \ - HPR_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ - CTL_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_ENT, \ - MEH_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT -), - -/* Colemak - * ,-----------------------------------------. ,-----------------------------------------. - * | Tab | Q | W | F | P | G | | J | L | U | Y | ; | Bksp | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Esc | A | R | S | T | D | | H | N | E | I | O | " | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | | K | M | , | . | / |Enter | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | ` | Ctrl | Alt | GUI |Lower |Space | |Space |Raise | Left | Down | Up |Right | - * `-----------------------------------------' `-----------------------------------------' - */ -[_COLEMAK] = LAYOUT( \ - HPR_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, \ - CTL_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_ENT, \ - MEH_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT -), - -/* Dvorak - * ,-----------------------------------------. ,-----------------------------------------. - * | Tab | " | , | . | P | Y | | F | G | C | R | L | Bksp | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Esc | A | O | E | U | I | | D | H | T | N | S | - | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Shift| ; | Q | J | K | X | | B | M | W | V | Z |Enter | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | ` | Ctrl | Alt | GUI |Lower |Space | |Space |Raise | Left | Down | Up |Right | - * `-----------------------------------------' `-----------------------------------------' - */ -[_DVORAK] = LAYOUT( \ - HPR_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, \ - CTL_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, \ - KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, SFT_ENT, \ - MEH_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT -), - -/* Lower - * ,-----------------------------------------. ,-----------------------------------------. - * | 0 | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | $ | F1 | F2 | F3 | F4 | F5 | | F6 | 4 | 5 | 6 | | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | | F12 | 1 | 2 | 3 | | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | | | | | | | | | Next | Vol- | Vol+ | Play | - * `-----------------------------------------' `-----------------------------------------' - */ -[_LOWER] = LAYOUT( \ - ALL_T(KC_0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \ - CTL_T(KC_DLR), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_4, KC_5, KC_6, _______, _______, \ - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_1, KC_2, KC_3, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY -), - -/* Raise - * ,-----------------------------------------. ,-----------------------------------------. - * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | Del | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | | | | | | | _ | ? | + | { | } | | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | | | | | | | - | / | = | [ | ] | \ | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | | | | | | | | | Home |PageDn|PageUp| End | - * `-----------------------------------------' `-----------------------------------------' - */ -[_RAISE] = LAYOUT( \ - ALL_T(KC_TILD), KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \ - _______, _______, _______, _______, _______, _______, KC_UNDS, KC_QUES, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ - _______, _______, _______, _______, _______, _______, KC_MINS, KC_SLSH, KC_EQL, KC_LBRC, KC_RBRC, SFT_T(KC_BSLS), \ - _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END -), - -/* Adjust (Lower + Raise) - * ,-----------------------------------------. ,-----------------------------------------. - * | | Reset| | | | | | | | | | | Reset| - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | | |Aud on|Audoff|AGnorm| |AGswap|Qwerty|Colemk|Dvorak| | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | | | | | | | | | | | | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | | | | | | | | | | | | | - * `-----------------------------------------' `-----------------------------------------' - */ -[_ADJUST] = LAYOUT( \ - _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET, \ - _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ -) - -}; - -#ifdef AUDIO_ENABLE -float tone_qwerty[][2] = SONG(QWERTY_SOUND); -float tone_dvorak[][2] = SONG(DVORAK_SOUND); -float tone_colemak[][2] = SONG(COLEMAK_SOUND); -#endif - -void persistent_default_layer_set(uint16_t default_layer) { - eeconfig_update_default_layer(default_layer); - default_layer_set(default_layer); -} - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case QWERTY: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_qwerty); - #endif - persistent_default_layer_set(1UL<<_QWERTY); - } - return false; - break; - case COLEMAK: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_colemak); - #endif - persistent_default_layer_set(1UL<<_COLEMAK); - } - return false; - break; - case DVORAK: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_dvorak); - #endif - persistent_default_layer_set(1UL<<_DVORAK); - } - return false; - break; - case LOWER: - if (record->event.pressed) { - layer_on(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case RAISE: - if (record->event.pressed) { - layer_on(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case ADJUST: - if (record->event.pressed) { - layer_on(_ADJUST); - } else { - layer_off(_ADJUST); - } - return false; - break; - } - return true; -} diff --git a/keyboards/handwired/xeal60/keymaps/smt/readme.md b/keyboards/handwired/xeal60/keymaps/smt/readme.md deleted file mode 100644 index 20bc662f0..000000000 --- a/keyboards/handwired/xeal60/keymaps/smt/readme.md +++ /dev/null @@ -1,88 +0,0 @@ -# smt's Let's Split keymap - -This keymap is ported from my Planck keymap. - - -## Qwerty - -``` -,-----------------------------------------. ,-----------------------------------------. -| Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| Esc | A | S | D | F | G | | H | J | K | L | ; | " | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| Shift| Z | X | C | V | B | | N | M | , | . | / |Enter | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| ` | Ctrl | Alt | GUI |Lower |Space | |Space |Raise | Left | Down | Up |Right | -`-----------------------------------------' `-----------------------------------------' -``` - -## Colemak - -``` -,-----------------------------------------. ,-----------------------------------------. -| Tab | Q | W | F | P | G | | J | L | U | Y | ; | Bksp | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| Esc | A | R | S | T | D | | H | N | E | I | O | " | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| Shift| Z | X | C | V | B | | K | M | , | . | / |Enter | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| ` | Ctrl | Alt | GUI |Lower |Space | |Space |Raise | Left | Down | Up |Right | -`-----------------------------------------' `-----------------------------------------' -``` - -## Dvorak - -``` -,-----------------------------------------. ,-----------------------------------------. -| Tab | " | , | . | P | Y | | F | G | C | R | L | Bksp | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| Esc | A | O | E | U | I | | D | H | T | N | S | - | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| Shift| ; | Q | J | K | X | | B | M | W | V | Z |Enter | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| ` | Ctrl | Alt | GUI |Lower |Space | |Space |Raise | Left | Down | Up |Right | -`-----------------------------------------' `-----------------------------------------' -``` - -## Lower - -``` -,-----------------------------------------. ,-----------------------------------------. -| 0 | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| $ | F1 | F2 | F3 | F4 | F5 | | F6 | 4 | 5 | 6 | | | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| | F7 | F8 | F9 | F10 | F11 | | F12 | 1 | 2 | 3 | | | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| | | | | | | | | | Next | Vol- | Vol+ | Play | -`-----------------------------------------' `-----------------------------------------' -``` - -## Raise - -``` -,-----------------------------------------. ,-----------------------------------------. -| ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | Del | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| | | | | | | | _ | ? | + | { | } | | | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| | | | | | | | - | / | = | [ | ] | \ | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| | | | | | | | | | Home |PageDn|PageUp| End | -`-----------------------------------------' `-----------------------------------------' -``` - -## Adjust (Lower + Raise) - -``` -,-----------------------------------------. ,-----------------------------------------. -| | Reset| | | | | | | | | | | Reset| -|------+------+------+------+------+------| |------+------+------+------+------+------| -| | | |Aud on|Audoff|AGnorm| |AGswap|Qwerty|Colemk|Dvorak| | | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| | | | | | | | | | | | | | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| | | | | | | | | | | | | | -`-----------------------------------------' `-----------------------------------------' -``` diff --git a/keyboards/handwired/xeal60/keymaps/that_canadian/config.h b/keyboards/handwired/xeal60/keymaps/that_canadian/config.h deleted file mode 100644 index 586b6e8c8..000000000 --- a/keyboards/handwired/xeal60/keymaps/that_canadian/config.h +++ /dev/null @@ -1,32 +0,0 @@ -/* -This is the c configuration file for the keymap - -Copyright 2012 Jun Wako -Copyright 2015 Jack Humbert - -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 . -*/ - -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -/* Select hand configuration */ - -#define MASTER_LEFT -// #define _MASTER_RIGHT -// #define EE_HANDS - -#endif \ No newline at end of file diff --git a/keyboards/handwired/xeal60/keymaps/that_canadian/keymap.c b/keyboards/handwired/xeal60/keymaps/that_canadian/keymap.c deleted file mode 100644 index 239a8d3be..000000000 --- a/keyboards/handwired/xeal60/keymaps/that_canadian/keymap.c +++ /dev/null @@ -1,163 +0,0 @@ -#include QMK_KEYBOARD_H -#include "action_layer.h" -#include "eeconfig.h" - -extern keymap_config_t keymap_config; - -// Each layer gets a name for readability, which is then used in the keymap matrix below. -// The underscores don't mean anything - you can have a layer called STUFF or any other name. -// Layer names don't all need to be of the same length, obviously, and you can also skip them -// entirely and just use numbers. -#define _QWERTY 0 - -#define _LOWER 3 -#define _RAISE 4 -#define _ADJUST 16 - -enum custom_keycodes { - QWERTY = SAFE_RANGE, - LOWER, - RAISE, - ADJUST, - BACKLIT -}; - -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - -/* Qwerty - * ,-----------------------------------------------------------------------------------. - * | RESET| Q | W | E | R | T | Y | U | I | O | P | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | S | D | F | G | H | J | K | L | ; | " | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * |Backlt| Ctrl | GUI | Alt |Lower |Space |Space |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' - */ -[_QWERTY] = LAYOUT( \ - RESET, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ - KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ - RGB_TOG, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ - BACKLIT, KC_LCTL, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ -), - -/* Lower - * ,-----------------------------------------------------------------------------------. - * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | | \ | | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | Next | Vol- | Vol+ | Play | - * `-----------------------------------------------------------------------------------' - */ -[_LOWER] = LAYOUT( \ - KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \ - KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ -), - -/* Raise - * ,-----------------------------------------------------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | Next | Vol- | Vol+ | Play | - * `-----------------------------------------------------------------------------------' - */ -[_RAISE] = LAYOUT( \ - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ - KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, _______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ -), - -/* Adjust (Lower + Raise) - * ,-----------------------------------------------------------------------------------. - * | | Reset| | | | | | | | | | Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | | | | | | | | | | | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | | - * `-----------------------------------------------------------------------------------' - */ -[_ADJUST] = LAYOUT( \ - _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ - _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, _______, _______, _______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ -) - - -}; - -void persistent_default_layer_set(uint16_t default_layer) { - eeconfig_update_default_layer(default_layer); - default_layer_set(default_layer); -} - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case QWERTY: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_qwerty); - #endif - persistent_default_layer_set(1UL<<_QWERTY); - } - return false; - break; - case BACKLIT: - if (record->event.pressed) { - register_code(KC_RSFT); - #ifdef BACKLIGHT_ENABLE - backlight_step(); - #endif - } else { - unregister_code(KC_RSFT); - } - return false; - break; - case LOWER: - if (record->event.pressed) { - layer_on(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case RAISE: - if (record->event.pressed) { - layer_on(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case ADJUST: - if (record->event.pressed) { - layer_on(_ADJUST); - } else { - layer_off(_ADJUST); - } - return false; - break; - } - return true; -} \ No newline at end of file diff --git a/keyboards/handwired/xeal60/keymaps/waples/README.md b/keyboards/handwired/xeal60/keymaps/waples/README.md deleted file mode 100644 index 6e171d964..000000000 --- a/keyboards/handwired/xeal60/keymaps/waples/README.md +++ /dev/null @@ -1,58 +0,0 @@ -# Waples Let's Split keymap -[Waples](https://www.github.com/Waples) - -## My (forever) Work-In-Progress keymap for my Let's Split keyboard. -My keymap is much like the default, I just personally like to have my Enter and Escape key to be on my home row. The Escape key doubles as a Control key when held down, my Enter key functions as (right)Shift when held down. -Everything you see below here is constantly *under construction*, so there may be some dumb things in this, which are already gotten taken out, or are still in there :P. - -### Layers -I currently have the following layers in my keymap: -* Qwerty (as default) -* Dvorak (still learning this type of layout, so not really used much) -* Gaming (WIP! I tried some I found, but didn't like them, so I'm in the progress of making my own) -* Lefty (lower) -* Righty (raise) -* Dual (adjust) - -#### QWERTY - | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bsp | - |C_Esc| A | S | D | F | G | | H | J | K | L | ; |S_Ent| - | Sft | Z | X | C | V | B | | N | M | , | . | / | " | - |P_SCR| GUI | Alt | Cps | ^L^ | Bsp | | Spc | ^R^ | Lft | Dwn | Up! | Rgt | - - -#### DVORAK - | Tab | " | , | . | P | Y | | F | G | C | R | L | Bsp | - |C_Esc| A | O | E | U | I | | D | H | T | N | S |S_Ent| - | Sft | ; | Q | J | K | X | | B | M | W | V | Z | / | - |P_SCR| GUI | Alt | Cps | ^L^ | Bsp | | Spc | ^R^ | Lft | Dwn | Up! | Rgt | - - -#### GAMING - | Tab | Q | W | E | R | T | | | | | | |QWERT| - | Esc | A | S | D | F | G | | | | | | | | - | Sft | Z | X | C | V | B | | | | | | | | - | Ctl | 1 | 2 | 3 | ^L^ | Spc | | Bsp | ^R^ | Lft | Dwn | Up | Rgt | - - -#### LEFTY (lower) - | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | Bsp | - | Del | | | | | | | | ( | ) | [ | ] | | - | | | | | | | | | | | | | | - | | | | | | | | Ins | | Hme | PgD | PgU | End | - - -#### RIGHTY (raise) - | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bsp | - | Del | F1 | F2 | F3 | F4 | | | = | - | \ | / | | | - | | F5 | F6 | F7 | F8 | | | | | | | | | - | | F9 | F10 | F11 | | | | | | | | | | - - -#### DUAL - |Reset| | | | |QWERT| | GAME| | | | |Reset| - | | Prv | Stp | Tog | Nxt | Nrm | | Swp | | | | | | - | | | Mte | Vol-| Vol+| | | NKRO| | | | | | - | | | | | | | |DVORK| | | | | | - - diff --git a/keyboards/handwired/xeal60/keymaps/waples/config.h b/keyboards/handwired/xeal60/keymaps/waples/config.h deleted file mode 100644 index 98ebeff45..000000000 --- a/keyboards/handwired/xeal60/keymaps/waples/config.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -/* Use I2C or Serial, not both */ -#define USE_SERIAL -// #define USE_I2C - -/* Select hand configuration */ -// #define MASTER_LEFT -// #define MASTER_RIGHT -#define EE_HANDS // We like to have choices I guess - -#define PREVENT_STUCK_MODIFIERS // When switching layers, this will release all mods - -#endif diff --git a/keyboards/handwired/xeal60/keymaps/waples/keymap.c b/keyboards/handwired/xeal60/keymaps/waples/keymap.c deleted file mode 100644 index 7b25bc51f..000000000 --- a/keyboards/handwired/xeal60/keymaps/waples/keymap.c +++ /dev/null @@ -1,131 +0,0 @@ -// Waples layout for Let's Split (rev2) -// Made changes from the default - -#include QMK_KEYBOARD_H - - -extern keymap_config_t keymap_config; - -#define _QWERTY 0 -#define _DVORAK 1 -#define _GAME 2 -#define _LEFTY 3 -#define _RIGHTY 4 -#define _DUAL 5 - -enum letssplit_keycodes { - QWERTY = SAFE_RANGE, - DVORAK, - GAME, - LEFTY, - RIGHTY, - DUAL, -}; - -#define TG_NKRO MAGIC_TOGGLE_NKRO // Toggle NKRO -#define CTLESC MT(MOD_LCTL, KC_ESC) // Hold for left Ctrl, tap for Esc -#define SHFTENT MT(MOD_RSFT, KC_ENT) // Hold for right Shift, tap for Enter -#define _______ KC_TRNS -#define XXXXXXX KC_NO - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - -[_QWERTY] = LAYOUT( \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ - CTLESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, SHFTENT, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_QUOT, \ - KC_PSCR, KC_BSPC, KC_LALT, KC_CAPS, LEFTY, KC_LGUI, KC_SPC, RIGHTY, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ -), - -[_DVORAK] = LAYOUT( \ - KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, \ - CTLESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, SHFTENT, \ - KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_SLSH, \ - KC_PSCR, KC_LGUI, KC_LALT, KC_CAPS, LEFTY, KC_BSPC, KC_SPC, RIGHTY, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ -), - -[_GAME] = LAYOUT( \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, _______, _______, _______, _______, _______, QWERTY, \ - CTLESC, KC_A, KC_S, KC_D, KC_F, KC_G, _______, _______, _______, _______, _______, _______, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, _______, _______, _______, _______, _______, _______, \ - KC_LCTL, KC_1, KC_2, KC_3, LEFTY, KC_SPC, KC_BSPC, RIGHTY, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT \ -), - -[_LEFTY] = LAYOUT( \ - KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \ - KC_DEL, _______, _______, _______, _______, _______, _______, KC_LPRN, KC_RPRN, KC_LBRC, KC_RBRC, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ - _______, _______, _______, _______, _______, _______, KC_INS, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END \ -), - -[_RIGHTY] = LAYOUT( \ - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ - KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, _______, KC_EQL, KC_MINS, KC_BSLS, KC_SLSH, _______, _______, \ - _______, KC_F5, KC_F6, KC_F7, KC_F8, _______, _______, _______, _______, _______, _______, _______, - _______, KC_F9, KC_F10, KC_F11, _______, _______, _______, _______, _______, _______, _______, _______ \ -), - -[_DUAL] = LAYOUT( \ - RESET, _______, _______, _______, _______, QWERTY, GAME, _______, _______, _______, _______, RESET, \ - _______, KC_MPRV, KC_MSTP, KC_MPLY, KC_MNXT, AG_NORM, AG_SWAP, _______, _______, _______, _______, _______, \ - _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, TG_NKRO, _______, _______, _______, _______, _______, \ - _______, _______, _______, _______, _______, _______, DVORAK, _______, _______, _______, _______, _______ \ -) -}; - -void persistent_default_layer_set(uint16_t default_layer) { - eeconfig_update_default_layer(default_layer); - default_layer_set(default_layer); -} - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case QWERTY: - if (record->event.pressed) { - persistent_default_layer_set(1UL<<_QWERTY); - } - return false; - break; - case DVORAK: - if (record->event.pressed) { - persistent_default_layer_set(1UL<<_DVORAK); - } - return false; - break; - case GAME: - if (record->event.pressed) { - persistent_default_layer_set(1UL<<_GAME); - } - return false; - break; - case LEFTY: - if (record->event.pressed) { - layer_on(_LEFTY); - update_tri_layer(_LEFTY, _RIGHTY, _DUAL); - } else { - layer_off(_LEFTY); - update_tri_layer(_LEFTY, _RIGHTY, _DUAL); - } - return false; - break; - case RIGHTY: - if (record->event.pressed) { - layer_on(_RIGHTY); - update_tri_layer(_LEFTY, _RIGHTY, _DUAL); - } else { - layer_off(_RIGHTY); - update_tri_layer(_LEFTY, _RIGHTY, _DUAL); - } - return false; - break; - case DUAL: - if (record->event.pressed) { - layer_on(_DUAL); - } else { - layer_off(_DUAL); - } - return false; - break; - } - return true; -} diff --git a/keyboards/handwired/xeal60/keymaps/waples/rules.mk b/keyboards/handwired/xeal60/keymaps/waples/rules.mk deleted file mode 100644 index 457a3d01d..000000000 --- a/keyboards/handwired/xeal60/keymaps/waples/rules.mk +++ /dev/null @@ -1,3 +0,0 @@ -ifndef QUANTUM_DIR - include ../../../../Makefile -endif diff --git a/keyboards/handwired/xeal60/keymaps/xk/config.h b/keyboards/handwired/xeal60/keymaps/xk/config.h deleted file mode 100644 index c75ed12cc..000000000 --- a/keyboards/handwired/xeal60/keymaps/xk/config.h +++ /dev/null @@ -1,44 +0,0 @@ -/* -This is the c configuration file for the keymap - -Copyright 2012 Jun Wako -Copyright 2015 Jack Humbert - -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. -*/ - -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -#define TAPPING_TOGGLE 1 -#define TAPPING_TERM 300 -#define ONESHOT_TAP_TOGGLE 2 -#define ONESHOT_LAYER_TOGGLE 2 -#define ONESHOT_TIMEOUT 800 - -#define USE_I2C - -#define MOUSEKEY_INTERVAL 50 -#define MOUSEKEY_DELAY 0 -#define MOUSEKEY_TIME_TO_MAX 60 -#define MOUSEKEY_MAX_SPEED 7 - -#define MOUSEKEY_WHEEL_DELAY 0 -#define MOUSEKEY_WHEEL_MAX_SPEED 8 -#define MOUSEKEY_WHEEL_TIME_TO_MAX 40 - -// #define MASTER_LEFT -// #define MASTER_RIGHT -#define EE_HANDS - - -#define PREVENT_STUCK_MODIFIERS -#define IGNORE_MOD_TAP_INTERRUPT -#define PERMISSIVE_HOLD - -#endif diff --git a/keyboards/handwired/xeal60/keymaps/xk/keymap.c b/keyboards/handwired/xeal60/keymaps/xk/keymap.c deleted file mode 100644 index c032b865a..000000000 --- a/keyboards/handwired/xeal60/keymaps/xk/keymap.c +++ /dev/null @@ -1,370 +0,0 @@ -#include QMK_KEYBOARD_H - - -extern keymap_config_t keymap_config; - -#define _COLEMAK 0 -#define _KAMELOC 1 -#define _IKAPILA 2 -#define _IKASHFT 3 -#define _ARROWKY 4 -#define _FNCTION 5 -#define _NINEKEY 6 -#define _NAVIGAT 7 -#define _QWERTY 8 -#define _MLAYER 9 -#define _GRVTABL 15 - -enum custom_keycodes { - COLEMAK = SAFE_RANGE, - KAMELOC, - IKAPILA, - IKASHFT, - ARROWKY, - FNCTION, - NINEKEY, - NAVIGAT, - QWERTY, - MLAYER, - GRVTABL, -}; - -//TD Declarations -enum { -VOM = 0, -PRN, -EGT, -HRD, -XRD, -DSH, -ESC, -EQE, -PGN, -HND, -COD, -UND, -F11, -F12, -F13, -F14, -F15, -F16, -F17, -F18, -F19, -F20, -//unicode_inputctl -LINUX, -WIN, -WINSH, -OSX, -}; - -#define _______ KC_TRNS -#define XXXXXXX KC_NO - -// action-TAP for key/mod behavior LT(layer, KC) -#define XK_TAB LT(_FNCTION, KC_TAB) -#define XK_BSP LT(_KAMELOC, KC_BSPC) -#define XK_APO LT(_KAMELOC, KC_QUOT) - -#define XK_SPC LT(_IKAPILA, KC_SPC) -#define XK_ENT LT(_IKAPILA, KC_ENT) -#define XK_PGDN LT(_IKASHFT, KC_PGDN) -#define XK_PGUP LT(_IKASHFT, KC_PGUP) -#define PIPBOY LT(_FNCTION, KC_BSLS) -#define XK_DEL LT(_IKASHFT, KC_DEL) -#define XK_GRV LT(_GRVTABL, KC_GRV) - -// mod-TAP for mod/key behavior MT(modkey, KC) -#define ALT_IT MT(MOD_RALT, KC_SCLN) -#define CTL_IT MT(MOD_RCTL, KC_DOT) -#define SFT_ENT MT(MOD_RSFT, KC_ENT) - -//sticky modifiers -#define KYCTL OSM(MOD_LCTL) -#define KYSFT OSM(MOD_LSFT) -#define CAKY OSM(MOD_LCTL | MOD_LALT) - -//shortcuts -#define CADEL LALT(LCTL(KC_DEL)) -#define CAINS LALT(LCTL(KC_INS)) -#define TGNKRO MAGIC_TOGGLE_NKRO - -#define NAVCH LCTL(KC_HOME) -#define NAVCPD LCTL(KC_PGDN) -#define NAVCPU LCTL(KC_PGUP) -#define NAVCE LCTL(KC_END) -#define NAVCU LCTL(KC_UP) -#define NAVCD LCTL(KC_DOWN) -#define NAVCL LCTL(KC_LEFT) -#define NAVCR LCTL(KC_RGHT) -#define NAVGU LGUI(KC_UP) -#define NAVGD LGUI(KC_DOWN) -#define NAVGL LGUI(KC_LEFT) -#define NAVGR LGUI(KC_RGHT) - -#define KC_NDSH LCTL(KC_PMNS) -#define KC_MDSH LALT(LCTL(KC_PMNS)) - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - -/* - TAP - ┌────┬────┬────┬────┬────┬────┐ ┌────┬────┬────┬────┬────┬────┐ - │TAB │ Q │ W │ F │ P │ B │ │ J │ L │ U │ Y │ ; │DEL │ - ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ - │BKSP│ A │ R │ S │ T │ G │ │ M │ N │ E │ I │ O │ ' │ - ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ - │OSFT│ X │ C │ D │ V │ Z │ │ K │ H │ , │ │ . │ / │ - ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ - │OCTL│GUI │ESC │ALT │PGUP│SPC │ │ENT │PGDN│ () │ {} │ \ │ ` │ - └────┴────┴────┴────┴────┴────┘ └────┴────┴────┴────┴────┴────┘ - HOLD - ┌────┬────┬────┬────┬────┬────┐ ┌────┬────┬────┬────┬────┬────┐ - │L FN│ │ │ │ │ │ │ │ │ │ │ALT │L!@#│ - ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ - │L OH│ │ │ │ │ │ │ │ │ │ │ │L OH│ - ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ - │SFT │ │ │ │ │ │ │ │ │ │ │CTL │SFT │ - ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ - │CTL │GUI │ESC │ALT │L!@#│L123│ │L123│L!@#│L M│ │L FN│LGRV│ - └────┴────┴────┴────┴────┴────┘ └────┴────┴────┴────┴────┴────┘ - DOUBLETAP - ┌────┬────┬────┬────┬────┬────┐ ┌────┬────┬────┬────┬────┬────┐ - │ │ │ │ │ │ │ │ │ │ │ │ │ │ - ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ - │ │ │ │ │ │ │ │ │ │ │ │ │ │ - ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ - │OSML│ │ │ │ │ │ │ │ │ │ │ │ │ - ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ - │OSML│OSML│!F4 │ │ │ │ │ │ │ │ │ │ │ - └────┴────┴────┴────┴────┴────┘ └────┴────┴────┴────┴────┴────┘ - Switch type - ┌────┬────┬────┬────┬────┬────┐ ┌────┬────┬────┬────┬────┬────┐ - │Br │mxC │Z │Z │Z │Z │ │Z │Z │Z │Z │Br │G │ - ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ - │G │Z │Z │Z │Z │Z │ │Z │Z │Z │Z │Z │Z │ - ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ - │Y │Z │Z │Z │Z │Z │ │Z │Z │Z │B │B │Y │ - ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ - │Y │Y │mxC │Z │BLK │BLK │ │BLK │BLK │Z │Z │B │G │ - └────┴────┴────┴────┴────┴────┘ └────┴────┴────┴────┴────┴────┘ - with DCS keycaps - Top Row R1 (reversed?) - M Row1 R3 (with reversed pointer finger) - M Row2 R4 - B Row R2 (reversed) -*/ - -// Colemak PB&J (Mod-DH) -[_COLEMAK] = LAYOUT( \ - XK_TAB, KC_Q, KC_W, KC_F, KC_P, KC_B, KC_J, KC_L, KC_U, KC_Y, ALT_IT, XK_DEL, \ - XK_BSP, KC_A, KC_R, KC_S, KC_T, KC_G, KC_M, KC_N, KC_E, KC_I, KC_O, XK_APO, \ - KYSFT, KC_X, KC_C, KC_D, KC_V, KC_Z, KC_K, KC_H, TD(COD), KC_DOT, CTL_IT, SFT_T(KC_SLSH), \ - KYCTL, KC_LGUI, TD(ESC), KC_LALT, XK_PGUP, XK_SPC, XK_ENT, XK_PGDN, MO(_MLAYER), TT(_NAVIGAT), PIPBOY, XK_GRV \ -), - -// useful for one-handed typing -[_KAMELOC] = LAYOUT( \ - XK_DEL, KC_SCLN, KC_Y, KC_U, KC_L, KC_J, KC_B, KC_P, KC_F, KC_W, KC_Q, XK_TAB, \ - _______, KC_O, KC_I, KC_E, KC_N, KC_M, KC_G, KC_T, KC_S, KC_R, KC_A, _______, \ - KYSFT, KC_SLSH, KC_DOT, KC_COMM, KC_H, KC_K, TD(UND), KC_V, KC_D, KC_C, KC_X, KYSFT, \ - XK_GRV, PIPBOY, M(1), KC_BTN1, KC_HOME, KC_ENT, KC_ENT, KC_END, KC_LGUI, TD(ESC), KC_LALT, KYCTL \ -), - -/* - ┌────┬────┬────┬────┬────┬────┐ ┌────┬────┬────┬────┬────┬────┐ - │ │ 1 │ 2 │ 3 │ 4 │ 5 │ │ 6 │ 7 │ 8 │ 9 │ 0 │ │ - ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ - │ │ M │ V- │ V+ │NEXT│PLAY│ │ ← │ ↓ │ ↑ │ → │DASH│INS │ - ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ - │ │ - │ = │TGL │ │ │ │HOME│END │HOME│ │ \ │ ~ │ - ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ - │ │ │ │ │ │ │ │ │ │ │ │ │ │ - └────┴────┴────┴────┴────┴────┘ └────┴────┴────┴────┴────┴────┘ -*/ -[_IKAPILA] = LAYOUT( \ - _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, \ - _______, KC_MUTE, KC_VOLD, KC_VOLU, KC_MNXT, KC_MPLY, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, TD(DSH), KC_INS, \ - _______, KC_MINS, KC_EQL, XXXXXXX, XXXXXXX, LCTL(KC_Z), KC_HOME, TD(HND), KC_HOME, XXXXXXX, KC_BSLS, KC_TILD, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ -), - -/* - ┌────┬────┬────┬────┬────┬────┐ ┌────┬────┬────┬────┬────┬────┐ - │ │ ! │ @ │ # │ $ │ % │ │ ^ │ & │ * │ ( │ ) │BSPC│ - ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ - │DEL │ │ ← │ ↓ │ ↑ │ → │ │NEXT│PGUP│ V+ │ V- │DASH│PSCR│ - ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ - │ │ _ │ + │END │HOME│END │ │ │ │ │ [ │ ] │ │ - ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ - │ │ │ │ │ │ │ │ │ │ │ │ │ │ - └────┴────┴────┴────┴────┴────┘ └────┴────┴────┴────┴────┴────┘ -*/ - -[_IKASHFT] = LAYOUT( \ - _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \ - KC_DEL, TD(PGN), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_MNXT, KC_PGUP, KC_VOLU, TD(VOM), KC_MDSH, KC_PSCR, \ - _______, KC_UNDS, KC_PLUS, KC_END, KC_HOME, KC_END, M(1), M(0), M(2), KC_LBRC, KC_RBRC, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ -), - -/* - ┌────┬────┬────┬────┬────┬────┐ ┌────┬────┬────┬────┬────┬────┐ - │ │ → │ ↑ │ ← │ ↓ │ → │ │ → │ ↓ │ ← │ ↑ │ ↑ │ │ just in case someone hacks my IP with a 10MeG pipe, you know? - ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ - │ │ ← │ ↓ │ → │ ↑ │ ← │ │ ↑ │ ← │ ↓ │ → │ ← │ │ hacker_evasion layer - ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ >>init network SEQUENCE - │ │ ↑ │ ← │ ↓ │ → │ ↑ │ │ ↓ │ ← │ ↑ │ → │ ← │ │ sleep 11; echo "DONE\n" - ├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤ throttle INPUT 11001001 OUTPUT 010011001 ? FULL )); \ - │ │ │ │ → │ ← │ ↓ │ │ → │ ↑ │ ← │ ↓ │ ↑ │ │ <event.pressed) { - switch(id) { - case 0: - return MACRO( D(LSFT), T(9), U(LSFT), D(LSFT), T(0), U(LSFT), T(LEFT), END ); - case 1: - return MACRO( D(LSFT), T(LBRC), U(LSFT), D(LSFT), T(RBRC), U(LSFT), T(LEFT), END ); - case 2: - return MACRO( T(LBRC), T(RBRC), T(LEFT), END); - case 3: - clear_keyboard(); - case 4: - return MACRO( D(LSFT), T(SCOLON), U(LSFT), D(LSFT), T(9), U(LSFT), D(LSFT), T(0), U(LSFT), D(LSFT), T(LBRACKET), U(LSFT), D(LSFT), T(9), U(LSFT), D(LSFT), T(SCOLON), U(LSFT), D(LSFT), T(0), U(LSFT), D(LSFT), T(BSLASH), U(LSFT), D(LSFT), T(SCOLON), U(LSFT), D(LSFT), T(7), U(LSFT), D(LSFT), T(RBRACKET), U(LSFT), T(SCOLON), D(LSFT), T(SCOLON), U(LSFT), END ); - case WINSH: - set_unicode_input_mode(UC_WIN); - return false; - break; - case WIN: - set_unicode_input_mode(UC_WINC); - return false; - break; - case OSX: - set_unicode_input_mode(UC_OSX); - return false; - break; - } - } - return MACRO_NONE; -}; diff --git a/keyboards/handwired/xeal60/keymaps/xk/rules.mk b/keyboards/handwired/xeal60/keymaps/xk/rules.mk deleted file mode 100644 index 84bf8e1f5..000000000 --- a/keyboards/handwired/xeal60/keymaps/xk/rules.mk +++ /dev/null @@ -1,19 +0,0 @@ -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -USE_I2C = yes -TAP_DANCE_ENABLE = yes - -CONSOLE_ENABLE = no # Console for debug(+400) -COMMAND_ENABLE = no # Commands for debug and configuration -BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality -MIDI_ENABLE = no # MIDI controls -AUDIO_ENABLE = no # Audio output on port C6 -UNICODE_ENABLE = yes # Unicode -BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. -BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) - -ifndef QUANTUM_DIR - include ../../../../Makefile -endif diff --git a/keyboards/handwired/xeal60/keymaps/zer09/config.h b/keyboards/handwired/xeal60/keymaps/zer09/config.h deleted file mode 100644 index 73438d8a9..000000000 --- a/keyboards/handwired/xeal60/keymaps/zer09/config.h +++ /dev/null @@ -1,59 +0,0 @@ -/* -This is the c configuration file for the keymap - -Copyright 2012 Jun Wako -Copyright 2015 Jack Humbert - -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 . -*/ - -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -/* key matrix size */ -/* Rows are doubled-up */ -#undef MATRIX_ROWS -#undef MATRIX_COLS -#define MATRIX_ROWS 10 -#define MATRIX_COLS 5 - -#undef MATRIX_ROW_PINS -#undef MATRIX_COL_PINS -#define MATRIX_ROW_PINS { C6, D7, E6, B4, B5 } -#define MATRIX_COL_PINS { F7, B1, B3, B2, B6 } - -#define CATERINA_BOOTLOADER -#define USB_MAX_POWER_CONSUMPTION 50 - -/* Use I2C or Serial, not both */ - -#define USE_SERIAL -// #define USE_I2C - -/* Select hand configuration */ - -/* #define MASTER_LEFT */ -// #define MASTER_RIGHT -#define EE_HANDS - -/* ws2812 RGB LED */ -#undef RGBLED_NUM -#define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER -#define RGBLED_NUM 50 -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD -#endif diff --git a/keyboards/handwired/xeal60/keymaps/zer09/keymap.c b/keyboards/handwired/xeal60/keymaps/zer09/keymap.c deleted file mode 100644 index 8d0eaf141..000000000 --- a/keyboards/handwired/xeal60/keymaps/zer09/keymap.c +++ /dev/null @@ -1,38 +0,0 @@ -#include "keymap.h" - -extern keymap_config_t keymap_config; - -#define _baseLayer LAYOUT( \ - KC_QUOTE, KC_COMMA, KC_DOT, KC_P, KC_Y, /**/KC_F, KC_G, KC_C, KC_R, KC_L, \ - CTL_T(KC_A), SFT_T(KC_O), ALT_T(KC_E), KC_U, KC_I, /**/KC_D, KC_H, ALT_T(KC_T), SFT_T(KC_N), CTL_T(KC_S), \ - KC_SCOLON, KC_Q, KC_J, KC_K, KC_X, /**/KC_B, KC_M, KC_W, KC_V, KC_Z, \ - TD(DA_UPLY), MO(_VL), KC_TAB, KC_BSPACE, KC_ESC, /**/KC_INS, KC_HOME, KC_PGUP, MO(_VL), TD(DA_UPLY), \ - TD(DA_DWLY), TD(DA_LCTL), KC_SPC, TD(DA_LSPR), LSFT_T(KC_CAPS),/**/SFT_T(KC_CAPS), TD(DA_RALT), KC_ENT, TD(DA_RCTL), TD(DA_DWLY)) - -#define _upLayer LAYOUT( \ - KC_4, KC_5, KC_6, _______, _______,/**/ _______, KC_RBRC, _______, _______, _______, \ - LCTL_T(KC_1), LSFT_T(KC_2), LALT_T(KC_3), _______, _______,/**/ KC_LBRC, KC_BSLS, _______, _______, _______, \ - KC_7, KC_8, KC_9, KC_0, KC_GRV, /**/ KC_SLSH, _______, _______, _______, _______, \ - _______, _______, _______, _______, _______,/**/ KC_DEL, KC_END, KC_PGDN, _______, _______, \ - _______, _______, _______, _______, _______,/**/ _______, _______, _______, _______, _______) - -#define _downLayer LAYOUT( \ - KC_F4, KC_F5, KC_F6, KC_F12, _______,/**/ _______, KC_RPRN, _______, _______, _______, \ - LCTL_T(KC_F1), LSFT_T(KC_F2), LALT_T(KC_F3), KC_F11, _______,/**/ KC_LPRN, KC_EQUAL, KC_LEFT, KC_UP, KC_RIGHT, \ - KC_F7, KC_F8, KC_F9, KC_F10, _______,/**/ KC_MINUS, _______, _______, KC_DOWN, _______, \ - _______, _______, _______, _______, _______,/**/ KC_PSCR, KC_SLCK, KC_PAUSE, _______, _______, \ - _______, _______, _______, _______, _______,/**/ _______, _______, _______, _______, _______) - -#define _astdLayer LAYOUT( \ - KC_MPRV, KC_MUTE, _______, _______, _______,/**/KC_PSCR, KC_SLCK, KC_PAUSE, _______, KC_RGUP, \ - KC_MPLY, KC_VOLD, _______, _______, _______,/**/_______, _______, _______, _______, KC_RGDWN, \ - KC_MNXT, KC_VOLU, RESET, _______, _______,/**/_______, _______, RESET, _______, _______, \ - _______, _______, _______, _______, _______,/**/_______, _______, _______, _______, _______, \ - _______, _______, _______, _______, _______,/**/_______, _______, _______, _______, _______) - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_BL] = _baseLayer, - [_UL] = _upLayer, - [_DL] = _downLayer, - [_VL] = _upLayer, - [_AL] = _astdLayer}; diff --git a/keyboards/handwired/xeal60/keymaps/zer09/keymap.h b/keyboards/handwired/xeal60/keymaps/zer09/keymap.h deleted file mode 100644 index 03f8f480a..000000000 --- a/keyboards/handwired/xeal60/keymaps/zer09/keymap.h +++ /dev/null @@ -1,32 +0,0 @@ -#include "lets_split.h" -#include "action_layer.h" -#include "eeconfig.h" -#include "tap_dance.h" -#include "zer09.h" - -#ifdef LAYOUT_ortho_4x12 -#undef LAYOUT_ortho_4x12 -#endif - -#ifdef LAYOUT -#undef LAYOUT -#define LAYOUT( \ - L00, L01, L02, L03, L04, R00, R01, R02, R03, R04, \ - L10, L11, L12, L13, L14, R10, R11, R12, R13, R14, \ - L20, L21, L22, L23, L24, R20, R21, R22, R23, R24, \ - L30, L31, L32, L33, L34, R30, R31, R32, R33, R34, \ - L40, L41, L42, L43, L44, R40, R41, R42, R43, R44 \ -) \ - { \ - { L00, L01, L02, L03, L04 }, \ - { L10, L11, L12, L13, L14 }, \ - { L20, L21, L22, L23, L24 }, \ - { L30, L31, L32, L33, L34 }, \ - { L40, L41, L42, L43, L44 }, \ - { R00, R01, R02, R03, R04 }, \ - { R10, R11, R12, R13, R14 }, \ - { R20, R21, R22, R23, R24 }, \ - { R30, R31, R32, R33, R34 }, \ - { R40, R41, R42, R43, R44 } \ - } -#endif diff --git a/keyboards/handwired/xeal60/keymaps/zer09/rules.mk b/keyboards/handwired/xeal60/keymaps/zer09/rules.mk deleted file mode 100644 index d8adc7088..000000000 --- a/keyboards/handwired/xeal60/keymaps/zer09/rules.mk +++ /dev/null @@ -1,6 +0,0 @@ -RGBLIGHT_ENABLE = yes -TAP_DANCE_ENABLE = yes - -ifndef QUANTUM_DIR - include ../../../../Makefile -endif From 714e0da960c2251298234bcf2159f67dd060710a Mon Sep 17 00:00:00 2001 From: Alex Ong Date: Sun, 12 Aug 2018 21:27:51 +1000 Subject: [PATCH 003/788] Basic keymap (no FN). Compiles. --- keyboards/handwired/xeal60/i2c.c | 162 ------------- keyboards/handwired/xeal60/i2c.h | 49 ---- .../handwired/xeal60/keymaps/default/keymap.c | 226 ++++++------------ keyboards/handwired/xeal60/lets_split.c | 15 -- keyboards/handwired/xeal60/lets_split.h | 23 +- keyboards/handwired/xeal60/rev1/config.h | 41 ++-- keyboards/handwired/xeal60/rev1/rev1.h | 29 ++- keyboards/handwired/xeal60/rules.mk | 14 +- 8 files changed, 130 insertions(+), 429 deletions(-) delete mode 100644 keyboards/handwired/xeal60/i2c.c delete mode 100644 keyboards/handwired/xeal60/i2c.h diff --git a/keyboards/handwired/xeal60/i2c.c b/keyboards/handwired/xeal60/i2c.c deleted file mode 100644 index 084c890c4..000000000 --- a/keyboards/handwired/xeal60/i2c.c +++ /dev/null @@ -1,162 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include "i2c.h" - -#ifdef USE_I2C - -// Limits the amount of we wait for any one i2c transaction. -// Since were running SCL line 100kHz (=> 10μs/bit), and each transactions is -// 9 bits, a single transaction will take around 90μs to complete. -// -// (F_CPU/SCL_CLOCK) => # of μC cycles to transfer a bit -// poll loop takes at least 8 clock cycles to execute -#define I2C_LOOP_TIMEOUT (9+1)*(F_CPU/SCL_CLOCK)/8 - -#define BUFFER_POS_INC() (slave_buffer_pos = (slave_buffer_pos+1)%SLAVE_BUFFER_SIZE) - -volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE]; - -static volatile uint8_t slave_buffer_pos; -static volatile bool slave_has_register_set = false; - -// Wait for an i2c operation to finish -inline static -void i2c_delay(void) { - uint16_t lim = 0; - while(!(TWCR & (1<10. - // Check datasheets for more info. - TWBR = ((F_CPU/SCL_CLOCK)-16)/2; -} - -// Start a transaction with the given i2c slave address. The direction of the -// transfer is set with I2C_READ and I2C_WRITE. -// returns: 0 => success -// 1 => error -uint8_t i2c_master_start(uint8_t address) { - TWCR = (1< slave ACK -// 1 => slave NACK -uint8_t i2c_master_write(uint8_t data) { - TWDR = data; - TWCR = (1<= SLAVE_BUFFER_SIZE ) { - ack = 0; - slave_buffer_pos = 0; - } - slave_has_register_set = true; - } else { - i2c_slave_buffer[slave_buffer_pos] = TWDR; - BUFFER_POS_INC(); - } - break; - - case TW_ST_SLA_ACK: - case TW_ST_DATA_ACK: - // master has addressed this device as a slave transmitter and is - // requesting data. - TWDR = i2c_slave_buffer[slave_buffer_pos]; - BUFFER_POS_INC(); - break; - - case TW_BUS_ERROR: // something went wrong, reset twi state - TWCR = 0; - default: - break; - } - // Reset everything, so we are ready for the next TWI interrupt - TWCR |= (1< - -#ifndef F_CPU -#define F_CPU 16000000UL -#endif - -#define I2C_READ 1 -#define I2C_WRITE 0 - -#define I2C_ACK 1 -#define I2C_NACK 0 - -#define SLAVE_BUFFER_SIZE 0x10 - -// i2c SCL clock frequency -#define SCL_CLOCK 400000L - -extern volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE]; - -void i2c_master_init(void); -uint8_t i2c_master_start(uint8_t address); -void i2c_master_stop(void); -uint8_t i2c_master_write(uint8_t data); -uint8_t i2c_master_read(int); -void i2c_reset_state(void); -void i2c_slave_init(uint8_t address); - - -static inline unsigned char i2c_start_read(unsigned char addr) { - return i2c_master_start((addr << 1) | I2C_READ); -} - -static inline unsigned char i2c_start_write(unsigned char addr) { - return i2c_master_start((addr << 1) | I2C_WRITE); -} - -// from SSD1306 scrips -extern unsigned char i2c_rep_start(unsigned char addr); -extern void i2c_start_wait(unsigned char addr); -extern unsigned char i2c_readAck(void); -extern unsigned char i2c_readNak(void); -extern unsigned char i2c_read(unsigned char ack); - -#define i2c_read(ack) (ack) ? i2c_readAck() : i2c_readNak(); - -#endif diff --git a/keyboards/handwired/xeal60/keymaps/default/keymap.c b/keyboards/handwired/xeal60/keymaps/default/keymap.c index f78278184..84f84eaf2 100644 --- a/keyboards/handwired/xeal60/keymaps/default/keymap.c +++ b/keyboards/handwired/xeal60/keymaps/default/keymap.c @@ -7,148 +7,97 @@ extern keymap_config_t keymap_config; // Layer names don't all need to be of the same length, obviously, and you can also skip them // entirely and just use numbers. #define _QWERTY 0 -#define _COLEMAK 1 -#define _DVORAK 2 -#define _LOWER 3 +#define _NUMPAD 1 #define _RAISE 4 -#define _ADJUST 16 enum custom_keycodes { QWERTY = SAFE_RANGE, - COLEMAK, - DVORAK, - LOWER, - RAISE, - ADJUST, + NUMPAD, + RAISE }; // Fillers to make layering more clear #define _______ KC_TRNS #define XXXXXXX KC_NO +#define NP_STAR KC_KP_ASTERISK +#define NP_SLSH KC_KP_SLASH const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -/* Qwerty - * ,-----------------------------------------------------------------------------------. - * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | S | D | F | G | H | J | K | L | ; | " | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * |Adjust| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' - */ -[_QWERTY] = LAYOUT_ortho_4x12( - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ - KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ - ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ -), +/* + * ,-----------------------------------------------------------. + * |Esc~| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | + * |-----------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | + * |-----------------------------------------------------------| + * |FN | A| S| D| F| G| H| J| K| L| ;| '|Return | + * |-----------------------------------------------------------| + * |Shift | Z| X| C| V| B| N| M| ,| .| /| Shift | + * |-----------------------------------------------------------| + * |Ctrl|Gui |Alt | NUM | Space | Space |Alt |FN |Menu |Ctrl | + * `-----------------------------------------------------------' + */ + /* Layer 0: Qwerty */ + [_QWERTY] = LAYOUT_split60( \ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \ + RAISE, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \ + KC_LCTL, KC_LGUI, KC_LALT, NUMPAD, KC_SPC, KC_SPC, KC_RALT, RAISE, KC_MENU, KC_RCTL \ + ), -/* Colemak - * ,-----------------------------------------------------------------------------------. - * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | R | S | T | D | H | N | E | I | O | ' | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' - */ -[_COLEMAK] = LAYOUT_ortho_4x12( \ - KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, \ - KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ - ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ -), +/* + * ,-----------------------------------------------------------. + * | | | | | | | | | /| *| -| | | | + * |-----------------------------------------------------------| + * | | | | | | | | 7| 8| 9| +| | | | + * |-----------------------------------------------------------| + * | | | | | | | | 4| 5| 6|Bspc| |Return | + * |-----------------------------------------------------------| + * | | | | | | | | 1| 2| 3| .| | + * |-----------------------------------------------------------| + * | | | | QWE | | 0 | . | | | | + * `-----------------------------------------------------------' + */ -/* Dvorak - * ,-----------------------------------------------------------------------------------. - * | Tab | ' | , | . | P | Y | F | G | C | R | L | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | O | E | U | I | D | H | T | N | S | / | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' - */ -[_DVORAK] = LAYOUT_ortho_4x12( \ - KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, \ - KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, \ - KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT , \ - ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ -), + /* Layer 1: Numpad */ + [_NUMPAD] = LAYOUT_split60( \ + _______, _______, _______, _______, _______, _______, _______, _______, NP_SLSH, NP_STAR, KC_MINUS, _______, _______, KC_BSPC, \ + _______, _______, _______, _______, _______, _______, _______, KC_7, KC_8, KC_9, KC_PLUS, _______, _______, KC_BSLS, \ + _______, _______, _______, _______, _______, _______, _______, KC_4, KC_5, KC_6, KC_BSPC, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, KC_1, KC_2, KC_3, KC_DOT, _______, \ + _______, _______, _______, QWERTY, KC_SPC, KC_0, KC_DOT, RAISE, _______, _______ \ + ), -/* Lower - * ,-----------------------------------------------------------------------------------. - * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | Next | Vol- | Vol+ | Play | - * `-----------------------------------------------------------------------------------' - */ -[_LOWER] = LAYOUT_ortho_4x12( \ - KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \ - KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ -), - -/* Raise - * ,-----------------------------------------------------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | Next | Vol- | Vol+ | Play | - * `-----------------------------------------------------------------------------------' - */ -[_RAISE] = LAYOUT_ortho_4x12( \ - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \ - KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, _______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ -), - -/* Adjust (Lower + Raise) - * ,-----------------------------------------------------------------------------------. - * | | Reset| | | | | | | | | | Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | | | | | | | | | | | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | | - * `-----------------------------------------------------------------------------------' - */ -[_ADJUST] = LAYOUT_ortho_4x12( \ - _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ - _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ -) +/* + * ,-----------------------------------------------------------. + * | | | | | | | | | | | | | | | + * |-----------------------------------------------------------| + * | | | ^ | | | | |pUp| ^ |pDn| | | | | + * |-----------------------------------------------------------| + * | | < | v | > | | |Hom| < | v | > | | | | + * |-----------------------------------------------------------| + * | | | | | | |End| | | | | | + * |-----------------------------------------------------------| + * | | | | | | | | | | | + * `-----------------------------------------------------------' + */ + /* Layer 2: RAISE */ + [_RAISE] = LAYOUT_split60( \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ) }; #ifdef AUDIO_ENABLE float tone_qwerty[][2] = SONG(QWERTY_SOUND); -float tone_dvorak[][2] = SONG(DVORAK_SOUND); -float tone_colemak[][2] = SONG(COLEMAK_SOUND); +float tone_numpad[][2] = SONG(DVORAK_SOUND); #endif -void persistent_default_layer_set(uint16_t default_layer) { - eeconfig_update_default_layer(default_layer); - default_layer_set(default_layer); -} - bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch (keycode) { case QWERTY: @@ -156,53 +105,24 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { #ifdef AUDIO_ENABLE PLAY_SONG(tone_qwerty); #endif - persistent_default_layer_set(1UL<<_QWERTY); + default_layer_set(1UL<<_QWERTY); } return false; break; - case COLEMAK: + case NUMPAD: if (record->event.pressed) { #ifdef AUDIO_ENABLE - PLAY_SONG(tone_colemak); + PLAY_SONG(tone_numpad); #endif - persistent_default_layer_set(1UL<<_COLEMAK); - } - return false; - break; - case DVORAK: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_dvorak); - #endif - persistent_default_layer_set(1UL<<_DVORAK); - } - return false; - break; - case LOWER: - if (record->event.pressed) { - layer_on(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); + default_layer_set(1UL<<_NUMPAD); } return false; break; case RAISE: if (record->event.pressed) { layer_on(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); } else { layer_off(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case ADJUST: - if (record->event.pressed) { - layer_on(_ADJUST); - } else { - layer_off(_ADJUST); } return false; break; diff --git a/keyboards/handwired/xeal60/lets_split.c b/keyboards/handwired/xeal60/lets_split.c index c400ab7bb..3caa114c2 100644 --- a/keyboards/handwired/xeal60/lets_split.c +++ b/keyboards/handwired/xeal60/lets_split.c @@ -1,16 +1 @@ #include "lets_split.h" - -#ifdef SWAP_HANDS_ENABLE -__attribute__ ((weak)) -const keypos_t hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = { - - {{0, 4}, {1, 4}, {2, 4}, {3, 4}, {4, 4}, {5, 4}}, - {{0, 5}, {1, 5}, {2, 5}, {3, 5}, {4, 5}, {5, 5}}, - {{0, 6}, {1, 6}, {2, 6}, {3, 6}, {4, 6}, {5, 6}}, - {{0, 7}, {1, 7}, {2, 7}, {3, 7}, {4, 7}, {5, 7}}, - {{0, 0}, {1, 0}, {2, 0}, {3, 0}, {4, 0}, {5, 0}}, - {{0, 1}, {1, 1}, {2, 1}, {3, 1}, {4, 1}, {5, 1}}, - {{0, 2}, {1, 2}, {2, 2}, {3, 2}, {4, 2}, {5, 2}}, - {{0, 3}, {1, 3}, {2, 3}, {3, 3}, {4, 3}, {5, 3}}, -}; -#endif diff --git a/keyboards/handwired/xeal60/lets_split.h b/keyboards/handwired/xeal60/lets_split.h index bce0ecb19..0442982fa 100644 --- a/keyboards/handwired/xeal60/lets_split.h +++ b/keyboards/handwired/xeal60/lets_split.h @@ -5,27 +5,24 @@ #ifdef KEYBOARD_lets_split_rev1 #include "rev1.h" -#elif KEYBOARD_lets_split_rev2 - #include "rev2.h" -#elif KEYBOARD_lets_split_sockets - #include "sockets.h" #endif // Used to create a keymap using only KC_ prefixed keys #define LAYOUT_kc( \ - L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \ - L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \ - L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \ - L30, L31, L32, L33, L34, L35, R30, R31, R32, R33, R34, R35 \ + L00, L01, L02, L03, L04, L05, L06, L07, R00, R01, R02, R03, R04, R05, R06, R07, \ + L10, L11, L12, L13, L14, L15, L16, L17, R10, R11, R12, R13, R14, R15, R16, R17, \ + L20, L21, L22, L23, L24, L25, L26, L27, R20, R21, R22, R23, R24, R25, R26, R27, \ + L30, L31, L32, L33, L34, L35, L36, L37, R30, R31, R32, R33, R34, R35, R36, R37, \ + L40, L41, L42, L43, L44, L45, L46, L47, R40, R41, R42, R43, R44, R45, R46, R47 \ ) \ LAYOUT( \ - KC_##L00, KC_##L01, KC_##L02, KC_##L03, KC_##L04, KC_##L05, KC_##R00, KC_##R01, KC_##R02, KC_##R03, KC_##R04, KC_##R05, \ - KC_##L10, KC_##L11, KC_##L12, KC_##L13, KC_##L14, KC_##L15, KC_##R10, KC_##R11, KC_##R12, KC_##R13, KC_##R14, KC_##R15, \ - KC_##L20, KC_##L21, KC_##L22, KC_##L23, KC_##L24, KC_##L25, KC_##R20, KC_##R21, KC_##R22, KC_##R23, KC_##R24, KC_##R25, \ - KC_##L30, KC_##L31, KC_##L32, KC_##L33, KC_##L34, KC_##L35, KC_##R30, KC_##R31, KC_##R32, KC_##R33, KC_##R34, KC_##R35 \ + KC_##L00, KC_##L01, KC_##L02, KC_##L03, KC_##L04, KC_##L05, KC_##L06, KC_##L07, KC_##R00, KC_##R01, KC_##R02, KC_##R03, KC_##R04, KC_##R05, KC_##R06, KC_##R07,\ + KC_##L10, KC_##L11, KC_##L12, KC_##L13, KC_##L14, KC_##L15, KC_##L16, KC_##L17, KC_##R10, KC_##R11, KC_##R12, KC_##R13, KC_##R14, KC_##R15, KC_##R16, KC_##R17,\ + KC_##L20, KC_##L21, KC_##L22, KC_##L23, KC_##L24, KC_##L25, KC_##L26, KC_##L27, KC_##R20, KC_##R21, KC_##R22, KC_##R23, KC_##R24, KC_##R25, KC_##R26, KC_##R27,\ + KC_##L30, KC_##L31, KC_##L32, KC_##L33, KC_##L34, KC_##L35, KC_##L36, KC_##L37, KC_##R30, KC_##R31, KC_##R32, KC_##R33, KC_##R34, KC_##R35, KC_##R36, KC_##R37 \ ) -#define LAYOUT_kc_ortho_4x12 LAYOUT_kc +#define LAYOUT_XEAL LAYOUT_kc #endif diff --git a/keyboards/handwired/xeal60/rev1/config.h b/keyboards/handwired/xeal60/rev1/config.h index 73f90e715..504b3fe8c 100644 --- a/keyboards/handwired/xeal60/rev1/config.h +++ b/keyboards/handwired/xeal60/rev1/config.h @@ -22,22 +22,36 @@ along with this program. If not, see . #include "config_common.h" /* USB Device descriptor parameter */ -#define VENDOR_ID 0xFEED -#define PRODUCT_ID 0x3060 +#define VENDOR_ID 0x4131 +#define PRODUCT_ID 0x5141 #define DEVICE_VER 0x0001 -#define MANUFACTURER Wootpatoot -#define PRODUCT Lets Split v1 -#define DESCRIPTION A split keyboard for the cheap makers +#define MANUFACTURER XeaLouS +#define PRODUCT XeaL60 +#define DESCRIPTION A split keyboard /* key matrix size */ // Rows are doubled-up -#define MATRIX_ROWS 8 -#define MATRIX_COLS 6 +#define MATRIX_ROWS 10 +#define MATRIX_COLS 8 // wiring of each half -#define MATRIX_ROW_PINS { B5, B4, E6, D7 } -#define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3 } -// #define MATRIX_COL_PINS { B3, B1, F7, F6, F5, F4 } //uncomment this line and comment line above if you need to reverse left-to-right key order +//ascii art of pro micro +// PORT +//PD3 TX0 RAW +//PD2 RX1 GND +// GND RESET +// GND VCC +//PD1 2 A3 PF4 +//PD0 3 A2 PF5 +//PD4 4 A1 PF6 +//PC6 5 A0 PF7 +//PD7 6 15 PB1 +//PE6 7 14 PB3 +//PB4 8 13 PB2 +//PB5 9 10 PB6 + +#define MATRIX_ROW_PINS { B5, B4, E6, D7, C6 } +#define MATRIX_COL_PINS { B6, B2, B3, B1, F7, F6, F5 } /* define if matrix has ghost */ //#define MATRIX_HAS_GHOST @@ -58,13 +72,6 @@ along with this program. If not, see . keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* ws2812 RGB LED */ -#define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER -#define RGBLED_NUM 16 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD - /* * Feature disable options * These options are also useful to firmware size reduction. diff --git a/keyboards/handwired/xeal60/rev1/rev1.h b/keyboards/handwired/xeal60/rev1/rev1.h index 073d83ef3..8f25d7d2f 100644 --- a/keyboards/handwired/xeal60/rev1/rev1.h +++ b/keyboards/handwired/xeal60/rev1/rev1.h @@ -9,22 +9,25 @@ //void promicro_bootloader_jmp(bool program); #define LAYOUT( \ - L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \ - L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \ - L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \ - L30, L31, L32, L33, L34, L35, R30, R31, R32, R33, R34, R35 \ + L00, L01, L02, L03, L04, L05, L06, R00, R01, R02, R03, R04, R05, R06, \ + L10, L11, L12, L13, L14, L15, L16, L17, R11, R12, R13, R14, R15, R16, \ + L20, L21, L22, L23, L24, L25, L26, R21, R22, R23, R24, R25, R26, \ + L30, L31, L32, L33, L34, L35, R31, R32, R33, R34, R35, R36, \ + L40, L41, L42, L43, L44, R42, R43, R44, R45, R46 \ ) \ { \ - { L00, L01, L02, L03, L04, L05 }, \ - { L10, L11, L12, L13, L14, L15 }, \ - { L20, L21, L22, L23, L24, L25 }, \ - { L30, L31, L32, L33, L34, L35 }, \ - { R00, R01, R02, R03, R04, R05 }, \ - { R10, R11, R12, R13, R14, R15 }, \ - { R20, R21, R22, R23, R24, R25 }, \ - { R30, R31, R32, R33, R34, R35 } \ + { L00, L01, L02, L03, L04, L05, L06 }, \ + { L10, L11, L12, L13, L14, L15, L16, L17 }, \ + { L20, L21, L22, L23, L24, L25, L26 }, \ + { L30, L31, L32, L33, L34, L35 }, \ + { L40, L41, L42, L43, L44 }, \ + { R00, R01, R02, R03, R04, R05, R06}, \ + { R11, R12, R13, R14, R15, R16 }, \ + { R21, R22, R23, R24, R25, R26 }, \ + { R31, R32, R33, R34, R35, R36 }, \ + { R42, R43, R44, R45, R46 } \ } -#define LAYOUT_ortho_4x12 LAYOUT +#define LAYOUT_split60 LAYOUT #endif diff --git a/keyboards/handwired/xeal60/rules.mk b/keyboards/handwired/xeal60/rules.mk index 951723edc..6dde257ec 100644 --- a/keyboards/handwired/xeal60/rules.mk +++ b/keyboards/handwired/xeal60/rules.mk @@ -1,5 +1,4 @@ SRC += matrix.c \ - i2c.c \ split_util.c \ serial.c \ ssd1306.c @@ -53,20 +52,21 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT # change to "no" to disable the options, or define them in the Makefile in # the appropriate keymap folder that will get included automatically # -BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) CONSOLE_ENABLE = no # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration -NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. SUBPROJECT_rev1 = yes -USE_I2C = yes +USE_I2C = no + # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend From ac9b88e8ccbbf38762871504cd827ff0d941c426 Mon Sep 17 00:00:00 2001 From: Alex Ong Date: Sun, 12 Aug 2018 21:39:55 +1000 Subject: [PATCH 004/788] Removed NP_STAR and NP_SLSH. --- keyboards/handwired/xeal60/keymaps/default/keymap.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/keyboards/handwired/xeal60/keymaps/default/keymap.c b/keyboards/handwired/xeal60/keymaps/default/keymap.c index 84f84eaf2..d770d0c6a 100644 --- a/keyboards/handwired/xeal60/keymaps/default/keymap.c +++ b/keyboards/handwired/xeal60/keymaps/default/keymap.c @@ -19,8 +19,6 @@ enum custom_keycodes { // Fillers to make layering more clear #define _______ KC_TRNS #define XXXXXXX KC_NO -#define NP_STAR KC_KP_ASTERISK -#define NP_SLSH KC_KP_SLASH const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* @@ -61,11 +59,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Layer 1: Numpad */ [_NUMPAD] = LAYOUT_split60( \ - _______, _______, _______, _______, _______, _______, _______, _______, NP_SLSH, NP_STAR, KC_MINUS, _______, _______, KC_BSPC, \ - _______, _______, _______, _______, _______, _______, _______, KC_7, KC_8, KC_9, KC_PLUS, _______, _______, KC_BSLS, \ - _______, _______, _______, _______, _______, _______, _______, KC_4, KC_5, KC_6, KC_BSPC, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, KC_1, KC_2, KC_3, KC_DOT, _______, \ - _______, _______, _______, QWERTY, KC_SPC, KC_0, KC_DOT, RAISE, _______, _______ \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_PSLS, KC_PAST, KC_MINUS, _______, _______, KC_BSPC, \ + _______, _______, _______, _______, _______, _______, _______, KC_7, KC_8, KC_9, KC_PLUS, _______, _______, KC_BSLS, \ + _______, _______, _______, _______, _______, _______, _______, KC_4, KC_5, KC_6, KC_BSPC, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, KC_1, KC_2, KC_3, KC_DOT, _______, \ + _______, _______, _______, QWERTY, KC_SPC, KC_0, KC_DOT, RAISE, _______, _______ \ ), /* From 08c682c193f43e5d54df990680ae93fc2e06150a Mon Sep 17 00:00:00 2001 From: Evan Travers Date: Tue, 28 Aug 2018 19:35:24 -0500 Subject: [PATCH 005/788] Docs: Add docs for the `LAYOUT_*` macro to layouts (#3772) When moving my planck layout to my let's split, I ran into this issue because I had copied my planck layout from the default layout which just used the `{}` array form for the keymap layers. I checked the docs, but this bit wasn't clear to me. I'm sure @ishtob or @drashna helped me on discord, but this seemed to be the logical place to add a helpful hint. --- docs/feature_layouts.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/feature_layouts.md b/docs/feature_layouts.md index bfae92044..1ee8b5e35 100644 --- a/docs/feature_layouts.md +++ b/docs/feature_layouts.md @@ -53,6 +53,8 @@ but the `LAYOUT_` variable must be defined in `.h` as well. ## Tips for Making Layouts Keyboard-Agnostic +### Includes + Instead of using `#include "planck.h"`, you can use this line to include whatever `.h` (`.h` should not be included here) file that is being compiled: #include QMK_KEYBOARD_H @@ -72,3 +74,7 @@ For example: ``` Note that the names are lowercase and match the folder/file names for the keyboard/revision exactly. + +### Keymaps + +In order to support both split and non-split keyboards with the same layout, you need to use the keyboard agnostic `LAYOUT_` macro in your keymap. For instance, in order for a Let's Split and Planck to share the same layout file, you need to use `LAYOUT_ortho_4x12` instead of `LAYOUT_planck_grid` or just `{}` for a C array. From 661ca4440cc42f3b60697e98985c44b0571ccfc1 Mon Sep 17 00:00:00 2001 From: Boy_314 <32818287+Boy-314@users.noreply.github.com> Date: Tue, 28 Aug 2018 21:17:52 -0400 Subject: [PATCH 006/788] Keymap: Boy_314's Preonic and XD75 Layouts (#3781) * fixed arrow keys and left control * added right shift * latest version * reverted arrow keys * edited readme * added osu layer * updated osu layout * updated osu layout * added full arrow keys to osu layout * in case i mess up creating macros * added the best meme key in the world * added plover steno layer * updated boy314 layout * removed unused layers * added boy314 xd75 layout, inspired by preonic layout * added boy314 xd75 layout, inspired by preonic layout * version 2 of boy314's xd75 layout * added readme notes * updated readme for boy314 xd75 layout * qwerty support, brackets on bottom row, caps lock underglow * fixed readme/ * small changes to allow merging * minor changes to format * fixed up default readme --- keyboards/preonic/keymaps/boy314/config.h | 38 ++++ keyboards/preonic/keymaps/boy314/keymap.c | 213 +++++++++++++++++++++ keyboards/preonic/keymaps/boy314/readme.md | 8 + keyboards/preonic/keymaps/boy314/rules.mk | 0 keyboards/xd75/keymaps/boy_314/config.h | 1 + keyboards/xd75/keymaps/boy_314/keymap.c | 158 +++++++++++++++ keyboards/xd75/keymaps/boy_314/readme.md | 8 + keyboards/xd75/keymaps/boy_314/rules.mk | 0 keyboards/xd75/keymaps/default/readme.md | 2 +- 9 files changed, 427 insertions(+), 1 deletion(-) create mode 100644 keyboards/preonic/keymaps/boy314/config.h create mode 100644 keyboards/preonic/keymaps/boy314/keymap.c create mode 100644 keyboards/preonic/keymaps/boy314/readme.md create mode 100644 keyboards/preonic/keymaps/boy314/rules.mk create mode 100644 keyboards/xd75/keymaps/boy_314/config.h create mode 100644 keyboards/xd75/keymaps/boy_314/keymap.c create mode 100644 keyboards/xd75/keymaps/boy_314/readme.md create mode 100644 keyboards/xd75/keymaps/boy_314/rules.mk diff --git a/keyboards/preonic/keymaps/boy314/config.h b/keyboards/preonic/keymaps/boy314/config.h new file mode 100644 index 000000000..b18b95477 --- /dev/null +++ b/keyboards/preonic/keymaps/boy314/config.h @@ -0,0 +1,38 @@ +#pragma once + +#ifdef AUDIO_ENABLE + #define STARTUP_SONG SONG(PREONIC_SOUND) + // #define STARTUP_SONG SONG(NO_SOUND) + + #define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \ + SONG(COLEMAK_SOUND), \ + SONG(DVORAK_SOUND) \ + } +#endif + +#define MUSIC_MASK (keycode != KC_NO) + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ + +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + diff --git a/keyboards/preonic/keymaps/boy314/keymap.c b/keyboards/preonic/keymaps/boy314/keymap.c new file mode 100644 index 000000000..67292bdb3 --- /dev/null +++ b/keyboards/preonic/keymaps/boy314/keymap.c @@ -0,0 +1,213 @@ +/* Copyright 2015-2017 Jack Humbert + * + * 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 . + */ + +#include QMK_KEYBOARD_H + +#define FN_CAPS LT(_FL, KC_CAPSLOCK) + +// define layers +#define _QWERTY 0 +#define _DVORAK 1 +#define _OSU 2 +#define _LOWER 10 +#define _RAISE 11 +#define _ADJUST 12 + +// macro shortcuts +#define QWERTY TO(_QWERTY) +#define DVORAK TO(_DVORAK) +#define OSU TO(_OSU) +#define LOWER M(_LOWER) +#define RAISE M(_RAISE) + +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Enter| + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Caps | A | S | D | F | G | H | J | K | L | ; | ' | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / | Shift| + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Ctrl | Del | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ + +[_QWERTY] = LAYOUT_preonic_grid( \ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_ENT, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, \ + KC_LCTL, KC_DEL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT \ +), + +/* Dvorak + * ,-----------------------------------------------------------------------------------. + * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Tab | " | , | . | P | Y | F | G | C | R | L | / | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | CAPS | A | O | E | U | I | D | H | T | N | S | Enter| + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | B | M | W | V | Z | Shift| + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Ctrl | Del | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ + +[_DVORAK] = LAYOUT_preonic_grid( \ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ + KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, \ + KC_CAPS, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_ENT, \ + KC_LSPO, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSPC, \ + KC_LCTL, KC_DEL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT \ +), + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ` | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ + +[_LOWER] = LAYOUT_preonic_grid( \ + KC_GRV, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, KC_HOME, KC_END, _______, \ + _______, XXXXXXX, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | ` | | | Up | | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | | Left | Down |Right | | | - | = | [ | ] | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | | | |PageDn|PageUP| | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = { + {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, + {KC_GRV, _______, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, KC_DEL}, + {KC_DEL, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, + {_______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGDN, KC_PGUP, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} +}, + +[_RAISE] = LAYOUT_preonic_grid( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ + KC_GRV, _______, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ + KC_DEL, _______, KC_LEFT, KC_DOWN,KC_RIGHT, _______, _______, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, KC_PGDN, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | Reset| | | | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|AudOff|AGnorm|AGswap|Qwerty| | | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | |Voice-|Voice+|Mus on|MusOff|MidiOn|MidOff|Dvorak| | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | OSU | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ + +[_ADJUST] = LAYOUT_preonic_grid( \ + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ + _______, RESET, DEBUG, _______, _______, _______, _______, TERM_ON, TERM_OFF,_______, _______, KC_DEL, \ + _______, _______, MU_MOD, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, _______, _______, _______, _______, \ + _______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, DVORAK, _______, _______, _______, _______, \ + _______, OSU, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ +) + +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) +{ + switch (keycode) + { + case QWERTY: + if (record->event.pressed) + { + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + case DVORAK: + if (record->event.pressed) + { + set_single_persistent_default_layer(_DVORAK); + } + return false; + break; + case OSU: + if (record->event.pressed) + { + set_single_persistent_default_layer(_OSU); + } + return false; + break; + case LOWER: + if (record->event.pressed) + { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + else + { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) + { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + else + { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + } + return true; +}; diff --git a/keyboards/preonic/keymaps/boy314/readme.md b/keyboards/preonic/keymaps/boy314/readme.md new file mode 100644 index 000000000..9d8a2fd11 --- /dev/null +++ b/keyboards/preonic/keymaps/boy314/readme.md @@ -0,0 +1,8 @@ +# Boy_314's XD75RE Layout +- NOTE: ONLY SUPPORTS DVORAK AT THE MOMENT, WILL UPDATE WITH QWERTY WHEN I GET THE TIME TO DO SO. +- Features many symbols and function keys in secondary layers. +- NOTE: WORK IN PROGRESS +# THINGS TO DO +- make better use of bottom row +- add numpad toggle layer +- explore rgb underglow options \ No newline at end of file diff --git a/keyboards/preonic/keymaps/boy314/rules.mk b/keyboards/preonic/keymaps/boy314/rules.mk new file mode 100644 index 000000000..e69de29bb diff --git a/keyboards/xd75/keymaps/boy_314/config.h b/keyboards/xd75/keymaps/boy_314/config.h new file mode 100644 index 000000000..7b9637ef9 --- /dev/null +++ b/keyboards/xd75/keymaps/boy_314/config.h @@ -0,0 +1 @@ +#pragma once \ No newline at end of file diff --git a/keyboards/xd75/keymaps/boy_314/keymap.c b/keyboards/xd75/keymaps/boy_314/keymap.c new file mode 100644 index 000000000..8658fde6e --- /dev/null +++ b/keyboards/xd75/keymaps/boy_314/keymap.c @@ -0,0 +1,158 @@ +#include QMK_KEYBOARD_H + +// Layer shorthand +#define _DV 0 +#define _QW 1 +#define _FN1 2 +#define _FN2 3 +#define _NP 4 + +#define RGBLIGHT_LIGHT_VAL 255 +const uint8_t RGBLED_RAINBOW_SWIRL_INTERVALS[] PROGMEM = {10, 10, 10}; + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* DVORAK + * .--------------------------------------------------------------------------------------------------------------------------------------. + * | ESC | 1 | 2 | 3 | 4 | 5 | - | ` | = | 6 | 7 | 8 | 9 | 0 | BACKSP | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------| + * | TAB | ' | . | . | P | Y | [ | \ | ] | F | G | C | R | L | / | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------+--------| + * | CAP LK | A | O | E | U | I | HOME | DEL | PG UP | D | H | T | N | S | ENTER | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------------------------+--------| + * | LSHIFT | ; | Q | J | K | X | END | UP | PG DN | M | W | W | V | Z | RSHIFT | + * |--------+--------+--------+--------+--------+-----------------+--------+--------+--------+--------+-----------------+--------+--------| + * | LCTRL | DEL | LALT | WIN | FN1 | SPACE | LEFT | DOWN | RIGHT | SPACE | FN2 | [ | ] | { | } | + * '--------------------------------------------------------------------------------------------------------------------------------------' + */ + + [_DV] = { /* DVORAK */ + { KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_MINS, KC_GRV, KC_EQL, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC }, + { KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_LBRC, KC_BSLS, KC_RBRC, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH }, + { KC_CAPS, KC_A, KC_O, KC_E, KC_U, KC_I, KC_HOME, KC_DEL, KC_PGUP, KC_D, KC_H, KC_T, KC_N, KC_S, KC_ENT }, + { KC_LSPO, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_END, KC_UP, KC_PGDN, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSPC }, + { KC_LCTL, KC_DEL, KC_LALT, KC_LGUI, MO(_FN1),KC_SPC, KC_LEFT, KC_DOWN, KC_RGHT, KC_SPC, MO(_FN2),KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR }, + }, + +/* QWERTY + * .--------------------------------------------------------------------------------------------------------------------------------------. + * | ESC | 1 | 2 | 3 | 4 | 5 | - | ` | = | 6 | 7 | 8 | 9 | 0 | BACKSP | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------| + * | TAB | Q | W | E | R | T | [ | \ | ] | Y | U | I | O | P | ENTER | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------+--------| + * | CAP LK | A | S | D | F | G | HOME | DEL | PG UP | H | J | K | L | ; | ' | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------------------------+--------| + * | LSHIFT | Z | X | C | V | B | END | UP | PG DN | N | M | , | . | / | RSHIFT | + * |--------+--------+--------+--------+--------+-----------------+--------+--------+--------+--------+-----------------+--------+--------| + * | LCTRL | DEL | LALT | WIN | FN1 | SPACE | LEFT | DOWN | RIGHT | SPACE | FN2 | [ | ] | { | } | + * '--------------------------------------------------------------------------------------------------------------------------------------' + */ + + [_QW] = { /* QWERTY */ + { KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_MINS, KC_GRV, KC_EQL, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC }, + { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LBRC, KC_BSLS, KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_ENT }, + { KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_HOME, KC_DEL, KC_PGUP, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT }, + { KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_END, KC_UP, KC_PGDN, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC }, + { KC_LCTL, KC_DEL, KC_LALT, KC_LGUI, MO(_FN1),KC_SPC, KC_LEFT, KC_DOWN, KC_RGHT, KC_SPC, MO(_FN2),KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR }, + }, + +/* FUNCTION1 + * .--------------------------------------------------------------------------------------------------------------------------------------. + * | ` | ! | @ | # | $ | % | | | | ^ | & | * | ( | ) | BACKSP | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | ~ | ! | @ | # | $ | % | RESET |RGB HUE-|RGB HUE+| ^ | & | * | ( | ) | DEL | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | DEL | F1 | F2 | F3 | F4 | F5 | F6 |RGB SAT-|RGB SAT+| DVORAK | _ | + | { | } | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |BRIGHT- |BRIGHT+ | QWERTY | | | HOME | END | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | | | | | |RGB MODE|RGB MODE| | | PREV | VOL UP |VOL DOWN| NEXT | + * '--------------------------------------------------------------------------------------------------------------------------------------' + */ + + [_FN1] = { /* FUNCTION1 */ + { KC_GRV , KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, _______, _______, _______, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC }, + { KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, RESET, RGB_HUD, RGB_HUI, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL }, + { KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, RGB_SAD, RGB_SAI, TO(_DV), KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE }, + { _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, RGB_VAD, RGB_VAI, TO(_QW), _______, _______, KC_HOME, KC_END, _______ }, + { _______, _______, _______, _______, _______, _______, _______,RGB_RMOD, RGB_MOD, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY }, + }, + + +/* FUNCTION2 + * .--------------------------------------------------------------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | | | | 6 | 7 | 8 | 9 | 0 | BACKSP | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | ` | | | UP | | | RESET |RGB HUE-|RGB HUE+| | | | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | DEL | | LEFT | DOWN | RIGHT | | |RGB SAT-|RGB SAT+| DVORAK | - | = | [ | ] | \ | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | | | | | |BRIGHT- |BRIGHT+ | QWERTY | | | PAGE UP| PAGE DN| | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | | | | | |RGB MODE|RGB MODE| | | PREV | VOL UP |VOL DOWN| NEXT | + * '--------------------------------------------------------------------------------------------------------------------------------------' + */ + + [_FN2] = { /* FUNCTION2 */ + { KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, _______, _______, _______, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC }, + { KC_GRV, _______, _______, KC_UP, _______, _______, RESET, RGB_HUD, RGB_HUI, _______, _______, _______, _______, _______, KC_DEL }, + { KC_DEL, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, RGB_SAD, RGB_SAI, TO(_DV), KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS }, + { _______, _______, _______, _______, _______, _______, _______, RGB_VAD, RGB_VAI, TO(_QW), _______, _______, KC_PGDN, KC_PGUP, _______ }, + { _______, _______, _______, _______, _______, _______, _______,RGB_RMOD, RGB_MOD, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY }, + }, + +/* NUMPAD + * .--------------------------------------------------------------------------------------------------------------------------------------. + * | | | | | | / | * | - | | | | | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | | | | 7 | 8 | 9 | | | | | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | | | | 4 | 5 | 6 | | | | | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | | | | 1 | 2 | 3 | | | | | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | | | | 0 | 0 | . | | | | | | | | + * '--------------------------------------------------------------------------------------------------------------------------------------' + */ + + [_NP] = { /* NUMPAD */ + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, + } +}; + + + +const uint16_t PROGMEM fn_actions[] = { + +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + #ifdef BACKLIGHT_ENABLE + backlight_step(); + #endif + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; + +void led_set_user(uint8_t usb_led) { + if (usb_led & (1< Date: Wed, 29 Aug 2018 10:42:15 -0700 Subject: [PATCH 007/788] Yet another update to drashna keymaps and userspace (#3787) * Make tap function inline * Use better makefile keyboard detection * Remove Copy-Paste macro * Add F11/F12 to Iris * Minor tweaks to userspace config * Set audio clicky randomness to 1.5 * Set NO_DEBUG to only be set if console is not enabled * Move NO_MUSIC_MODE to userspace config.h * Reduce Ergodox Debounce * Add Planck Light config * Use OSM for ortho 4x12 * Music Mode changes for planck light * Cleanup do to shutdown user and other fixes in Master * Add and use 'shutdown_user' fzunction * Remove global NO_MUSIC_MODE define * Add NO_MUSIC_MODE to individual keymaps * Change layer colors * Remove NO_PRINT and NO_DEBUG from userspace config.h Since these are automatically disabled if the console isn't enabled. * Remove backlight code if backlight isn't enabled * Remove Twinkle from Ergodox * Disable RGB twinkling and enable PSM * Clean up RGB matrix code * Clean up planck light indicators * Clean up tap code * Rules cleanup for ortho 4x12 * Fix up userspace template * Revert "Clean up tap code" This reverts commit 09f64d6d67aa021c3b5ac86a9a739a5ca2b9c1ec. * Organize includes * userspace cleanup * Fix modifier spelling error * Fix userspace rules * Disable Permissive Hold again * Minor clean up * Fix Tap stuff * Viterbi Updates for file size --- keyboards/iris/keymaps/drashna/keymap.c | 22 +- keyboards/iris/keymaps/drashna/rules.mk | 2 +- keyboards/orthodox/keymaps/drashna/config.h | 2 +- keyboards/orthodox/keymaps/drashna/rules.mk | 2 +- keyboards/viterbi/keymaps/drashna/config.h | 8 +- keyboards/viterbi/keymaps/drashna/keymap.c | 2 +- layouts/community/ergodox/drashna/config.h | 3 + layouts/community/ergodox/drashna/keymap.c | 16 +- layouts/community/ergodox/drashna/rules.mk | 6 +- layouts/community/ortho_4x12/drashna/config.h | 9 + layouts/community/ortho_4x12/drashna/keymap.c | 195 ++++++++++-------- layouts/community/ortho_4x12/drashna/rules.mk | 14 +- users/drashna/config.h | 16 +- users/drashna/drashna.c | 75 +++---- users/drashna/drashna.h | 22 +- users/drashna/rgb_stuff.c | 6 +- users/drashna/rgb_stuff.h | 1 - users/drashna/template.c | 97 ++++++--- users/drashna/template.h | 4 +- 19 files changed, 280 insertions(+), 222 deletions(-) diff --git a/keyboards/iris/keymaps/drashna/keymap.c b/keyboards/iris/keymaps/drashna/keymap.c index 70d13cac2..37c3f97f5 100644 --- a/keyboards/iris/keymaps/drashna/keymap.c +++ b/keyboards/iris/keymaps/drashna/keymap.c @@ -2,36 +2,34 @@ #include QMK_KEYBOARD_H #include "drashna.h" -#define KC_ALAP ALT_T(KC_APP) -#define KC_OSLG OSM(MOD_LGUI) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_QWERTY] = LAYOUT_wrapper( KC_ESC, ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________, KC_MINS, KC_TAB , _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_BSLS, - KC_CCCV, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_QUOT, - KC_MLSF, _________________QWERTY_L3_________________, KC_ALAP, KC_OSLG, _________________QWERTY_R3_________________, KC_MRSF, + KC_C1R3, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_QUOT, + KC_MLSF, _________________QWERTY_L3_________________, ALT_APP, OS_RGUI, _________________QWERTY_R3_________________, KC_MRSF, LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE ), [_COLEMAK] = LAYOUT_wrapper( KC_ESC , ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________, KC_MINS, KC_TAB , _________________COLEMAK_L1________________, _________________COLEMAK_R1________________, KC_BSLS, - KC_CCCV, _________________COLEMAK_L2________________, _________________COLEMAK_R2________________, KC_QUOT, - KC_MLSF, _________________COLEMAK_L3________________, KC_ALAP, KC_OSLG, _________________COLEMAK_R3________________, KC_MRSF, + KC_C1R3, _________________COLEMAK_L2________________, _________________COLEMAK_R2________________, KC_QUOT, + KC_MLSF, _________________COLEMAK_L3________________, ALT_APP, OS_RGUI, _________________COLEMAK_R3________________, KC_MRSF, LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE ), [_DVORAK] = LAYOUT_wrapper( KC_ESC, ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________, KC_MINS, KC_TAB , _________________DVORAK_L1_________________, _________________DVORAK_R1_________________, KC_BSLS, - KC_CCCV, _________________DVORAK_L2_________________, _________________DVORAK_R2_________________, KC_QUOT, - KC_MLSF, _________________DVORAK_L3_________________, KC_ALAP, KC_OSLG, _________________DVORAK_R3_________________, KC_MRSF, + KC_C1R3, _________________DVORAK_L2_________________, _________________DVORAK_R2_________________, KC_QUOT, + KC_MLSF, _________________DVORAK_L3_________________, ALT_APP, OS_RGUI, _________________DVORAK_R3_________________, KC_MRSF, LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE ), [_WORKMAN] = LAYOUT_wrapper( KC_ESC, ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________, KC_MINS, KC_TAB , _________________WORKMAN_L1________________, _________________WORKMAN_R1________________, KC_BSLS, - KC_CCCV, _________________WORKMAN_L2________________, _________________WORKMAN_R2________________, KC_QUOT, - KC_MLSF, _________________WORKMAN_L3________________, KC_ALAP, KC_OSLG, _________________WORKMAN_R3________________, KC_MRSF, + KC_C1R3, _________________WORKMAN_L2________________, _________________WORKMAN_R2________________, KC_QUOT, + KC_MLSF, _________________WORKMAN_L3________________, ALT_APP, OS_RGUI, _________________WORKMAN_R3________________, KC_MRSF, LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE ), @@ -53,7 +51,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_LOWER] = LAYOUT_wrapper( - _______, _________________FUNC_LEFT_________________, _________________FUNC_RIGHT________________, _______, + KC_F12, _________________FUNC_LEFT_________________, _________________FUNC_RIGHT________________, KC_F11, KC_TILD, _________________LOWER_L1__________________, _________________LOWER_R1__________________, _______, _______, ___________________BLANK___________________, _________________LOWER_R2__________________, KC_PIPE, _______, ___________________BLANK___________________, _______, _______, _________________LOWER_R3__________________, _______, @@ -61,7 +59,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [_RAISE] = LAYOUT_wrapper( - _______, _________________FUNC_LEFT_________________, _________________FUNC_RIGHT________________, _______, + KC_F12, _________________FUNC_LEFT_________________, _________________FUNC_RIGHT________________, KC_F11, KC_GRV, _________________RAISE_L1__________________, _________________RAISE_R1__________________, _______, _______, _________________RAISE_L2__________________, _________________RAISE_R2__________________, KC_BSLS, _______, _________________RAISE_L3__________________, _______, _______, _________________RAISE_R3__________________, _______, diff --git a/keyboards/iris/keymaps/drashna/rules.mk b/keyboards/iris/keymaps/drashna/rules.mk index ccc33c06f..e8035176e 100644 --- a/keyboards/iris/keymaps/drashna/rules.mk +++ b/keyboards/iris/keymaps/drashna/rules.mk @@ -12,6 +12,6 @@ SWAP_HANDS_ENABLE = no INDICATOR_LIGHTS = yes MACROS_ENABLED = no -RGBLIGHT_TWINKLE = yes +RGBLIGHT_TWINKLE = no BOOTLOADER = qmk-dfu diff --git a/keyboards/orthodox/keymaps/drashna/config.h b/keyboards/orthodox/keymaps/drashna/config.h index d8ff95fcb..2257b62fd 100644 --- a/keyboards/orthodox/keymaps/drashna/config.h +++ b/keyboards/orthodox/keymaps/drashna/config.h @@ -58,7 +58,7 @@ along with this program. If not, see . #define C6_AUDIO #ifdef RGBLIGHT_ENABLE #define NO_MUSIC_MODE -#endif //RGBLIGHT_ENABLE +#endif #endif //AUDIO_ENABLE #undef PRODUCT diff --git a/keyboards/orthodox/keymaps/drashna/rules.mk b/keyboards/orthodox/keymaps/drashna/rules.mk index f870c3a7d..a826c664a 100644 --- a/keyboards/orthodox/keymaps/drashna/rules.mk +++ b/keyboards/orthodox/keymaps/drashna/rules.mk @@ -10,6 +10,6 @@ NKRO_ENABLE = yes INDICATOR_LIGHTS = yes MACROS_ENABLED = no -RGBLIGHT_TWINKLE = yes +RGBLIGHT_TWINKLE = no BOOTLOADER = qmk-dfu diff --git a/keyboards/viterbi/keymaps/drashna/config.h b/keyboards/viterbi/keymaps/drashna/config.h index 5bc5598ee..687f80441 100644 --- a/keyboards/viterbi/keymaps/drashna/config.h +++ b/keyboards/viterbi/keymaps/drashna/config.h @@ -35,12 +35,6 @@ along with this program. If not, see . #undef LOCKING_SUPPORT_ENABLE #undef LOCKING_RESYNC_ENABLE -#ifndef NO_DEBUG -#define NO_DEBUG -#endif // !NO_DEBUG -#ifndef NO_PRINT -#define NO_PRINT -#endif // !NO_PRINT /* disable action features */ //#define NO_ACTION_LAYER @@ -59,6 +53,8 @@ along with this program. If not, see . #define NO_MUSIC_MODE #endif +#undef PREVENT_STUCK_MODIFIERS + #define LAYOUT_ortho_5x7( \ L00, L01, L02, L03, L04, L05, L06, \ L10, L11, L12, L13, L14, L15, L16, \ diff --git a/keyboards/viterbi/keymaps/drashna/keymap.c b/keyboards/viterbi/keymaps/drashna/keymap.c index 68ca593db..acda8a0d2 100644 --- a/keyboards/viterbi/keymaps/drashna/keymap.c +++ b/keyboards/viterbi/keymaps/drashna/keymap.c @@ -13,7 +13,7 @@ extern keymap_config_t keymap_config; #define _______ KC_TRNS #define XXXXXXX KC_NO -#define LMACRO TG(_MACROS) +#define LMACRO OSL(_MACROS) #define DIABLO TG(_DIABLO) #define GAMEPAD TG(_GAMEPAD) #define MEDIA TT(_MEDIA) diff --git a/layouts/community/ergodox/drashna/config.h b/layouts/community/ergodox/drashna/config.h index 9e2bd74f3..3ced18593 100644 --- a/layouts/community/ergodox/drashna/config.h +++ b/layouts/community/ergodox/drashna/config.h @@ -13,3 +13,6 @@ #undef PRODUCT #define PRODUCT DrashnaDox - Hacked ErgoDox EZ Shine + +#undef DEBOUNCE +#define DEBOUNCE 5 diff --git a/layouts/community/ergodox/drashna/keymap.c b/layouts/community/ergodox/drashna/keymap.c index 27d20d928..4d7700f19 100644 --- a/layouts/community/ergodox/drashna/keymap.c +++ b/layouts/community/ergodox/drashna/keymap.c @@ -61,7 +61,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, _________________QWERTY_L1_________________, TG(_DIABLO), TG(_DIABLO), _________________QWERTY_R1_________________, KC_BSLS, KC_C1R3, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_QUOT, KC_MLSF, _________________QWERTY_L3_________________, TG(_GAMEPAD), TG(_GAMEPAD), _________________QWERTY_R3_________________, KC_MRSF, - KC_GRV, ___________ERGODOX_BOTTOM_LEFT_____________, ___________ERGODOX_BOTTOM_RIGHT____________, KC_CCCV, + KC_GRV, ___________ERGODOX_BOTTOM_LEFT_____________, ___________ERGODOX_BOTTOM_RIGHT____________, KC_NO, __________________ERGODOX_THUMB_CLUSTER_____________________ ), /* Keymap 0: COLEMAK layer @@ -93,7 +93,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, _________________COLEMAK_L1________________, TG(_DIABLO), TG(_DIABLO), _________________COLEMAK_R1________________, KC_BSLS, KC_C1R3, _________________COLEMAK_L2________________, _________________COLEMAK_R2________________, KC_QUOT, KC_MLSF, _________________COLEMAK_L3________________, TG(_GAMEPAD), TG(_GAMEPAD), _________________COLEMAK_R3________________, KC_MRSF, - KC_GRV, ___________ERGODOX_BOTTOM_LEFT_____________, ___________ERGODOX_BOTTOM_RIGHT____________, KC_CCCV, + KC_GRV, ___________ERGODOX_BOTTOM_LEFT_____________, ___________ERGODOX_BOTTOM_RIGHT____________, KC_NO, __________________ERGODOX_THUMB_CLUSTER_____________________ ), /* Keymap 0: DVORAK Layout @@ -125,7 +125,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, _________________DVORAK_L1_________________, TG(_DIABLO), TG(_DIABLO), _________________DVORAK_R1_________________, KC_SLSH, KC_C1R3, _________________DVORAK_L2_________________, _________________DVORAK_R2_________________, KC_MINS, KC_MLSF, _________________DVORAK_L3_________________, TG(_GAMEPAD), TG(_GAMEPAD), _________________DVORAK_R3_________________, KC_MRSF, - KC_GRV, ___________ERGODOX_BOTTOM_LEFT_____________, ___________ERGODOX_BOTTOM_RIGHT____________, KC_CCCV, + KC_GRV, ___________ERGODOX_BOTTOM_LEFT_____________, ___________ERGODOX_BOTTOM_RIGHT____________, KC_NO, __________________ERGODOX_THUMB_CLUSTER_____________________ ), /* Keymap 0: WORKMAN layer @@ -157,7 +157,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, _________________WORKMAN_L1________________, TG(_DIABLO), TG(_DIABLO), _________________WORKMAN_R1________________, KC_BSLS, KC_C1R3, _________________WORKMAN_L2________________, _________________WORKMAN_R2________________, KC_QUOT, KC_MLSF, _________________WORKMAN_L3________________, TG(_GAMEPAD), TG(_GAMEPAD), _________________WORKMAN_R3________________, KC_MRSF, - KC_GRV, ___________ERGODOX_BOTTOM_LEFT_____________, ___________ERGODOX_BOTTOM_RIGHT____________, KC_CCCV, + KC_GRV, ___________ERGODOX_BOTTOM_LEFT_____________, ___________ERGODOX_BOTTOM_RIGHT____________, KC_NO, __________________ERGODOX_THUMB_CLUSTER_____________________ ), @@ -294,7 +294,7 @@ void matrix_init_keymap(void) { // Runs boot tasks for keyboard void matrix_scan_keymap(void) { // runs frequently to update info - uint8_t modifiders = get_mods(); + uint8_t modifiers = get_mods(); uint8_t led_usb_state = host_keyboard_leds(); uint8_t one_shot = get_oneshot_mods(); @@ -307,15 +307,15 @@ void matrix_scan_keymap(void) { // runs frequently to update info // Since we're not using the LEDs here for layer indication anymore, // then lets use them for modifier indicators. Shame we don't have 4... // Also, no "else", since we want to know each, independently. - if (modifiders & MODS_SHIFT_MASK || led_usb_state & (1<event.pressed) { register_code(KC_RSFT); @@ -170,8 +113,86 @@ bool music_mask_user(uint16_t keycode) { switch (keycode) { case RAISE: case LOWER: + case BK_LWER: + case SP_LWER: + case DL_RAIS: + case ET_RAIS: return false; default: return true; } } + +#ifdef RGB_MATRIX_ENABLE + + +void rgb_matrix_layer_helper (uint8_t red, uint8_t green, uint8_t blue, bool default_layer) { + rgb_led led; + for (int i = 0; i < DRIVER_LED_TOTAL; i++) { + led = g_rgb_leds[i]; + if (led.matrix_co.raw < 0xFF) { + if (led.modifier) { + rgb_matrix_set_color( i, red, green, blue ); + } + } + } +} + +void rgb_matrix_indicators_user(void) { + uint8_t this_mod = get_mods(); + uint8_t this_led = host_keyboard_leds(); + uint8_t this_osm = get_oneshot_mods(); + + switch (biton32(layer_state)) { + case _RAISE: + rgb_matrix_layer_helper(0xFF, 0xFF, 0x00, false); break; + case _LOWER: + rgb_matrix_layer_helper(0x00, 0xFF, 0x00, false); break; + case _ADJUST: + rgb_matrix_layer_helper(0xFF, 0x00, 0x00, false); break; + default: + switch (biton32(default_layer_state)) { + case _QWERTY: + rgb_matrix_layer_helper(0x00, 0xFF, 0xFF, true); break; + case _COLEMAK: + rgb_matrix_layer_helper(0xFF, 0x00, 0xFF, true); break; + case _DVORAK: + rgb_matrix_layer_helper(0x00, 0xFF, 0x00, true); break; + case _WORKMAN: + rgb_matrix_layer_helper(0xD9, 0xA5, 0x21, true); break; + } + } + + switch (biton32(default_layer_state)) { + case _QWERTY: + rgb_matrix_set_color(42, 0x00, 0xFF, 0xFF); break; + case _COLEMAK: + rgb_matrix_set_color(42, 0xFF, 0x00, 0xFF); break; + case _DVORAK: + rgb_matrix_set_color(42, 0x00, 0xFF, 0x00); break; + case _WORKMAN: + rgb_matrix_set_color(42, 0xD9, 0xA5, 0x21); break; + } + + if (this_mod & MODS_SHIFT_MASK || this_led & (1<. */ #include "drashna.h" -#include "version.h" -#include "eeprom.h" #include "tap_dances.h" #include "rgb_stuff.h" - -float tone_copy[][2] = SONG(SCROLL_LOCK_ON_SOUND); -float tone_paste[][2] = SONG(SCROLL_LOCK_OFF_SOUND); - -static uint16_t copy_paste_timer; userspace_config_t userspace_config; // Helper Functions @@ -35,8 +28,14 @@ userspace_config_t userspace_config; // the same thing, but with differring text sent. bool send_game_macro(const char *str, keyrecord_t *record, bool override) { if (!record->event.pressed || override) { + uint16_t keycode; + if (userspace_config.is_overwatch) { + keycode = KC_BSPC; + } else { + keycode = KC_ENTER; + } clear_keyboard(); - tap(userspace_config.is_overwatch ? KC_BSPC : KC_ENTER); + tap(keycode); wait_ms(50); send_string_with_delay(str, MACRO_TIMER); wait_ms(50); @@ -46,8 +45,6 @@ bool send_game_macro(const char *str, keyrecord_t *record, bool override) { return false; } -void tap(uint16_t keycode){ register_code(keycode); unregister_code(keycode); }; - bool mod_key_press_timer (uint16_t code, uint16_t mod_code, bool pressed) { static uint16_t this_timer; if(pressed) { @@ -93,6 +90,9 @@ void matrix_init_keymap(void) {} __attribute__ ((weak)) void startup_keymap(void) {} +__attribute__ ((weak)) +void shutdown_keymap(void) {} + __attribute__ ((weak)) void suspend_power_down_keymap(void) {} @@ -127,6 +127,7 @@ __attribute__ ((weak)) void led_set_keymap(uint8_t usb_led) {} + // Call user matrix init, set default RGB colors and then // call the keymap's init function void matrix_init_user(void) { @@ -158,6 +159,24 @@ void startup_user (void) { startup_keymap(); } +void shutdown_user (void) { +#ifdef RGBLIGHT_ENABLE + rgblight_enable_noeeprom(); + rgblight_mode_noeeprom(1); + rgblight_setrgb_red(); +#endif // RGBLIGHT_ENABLE +#ifdef RGB_MATRIX_ENABLE + rgb_led led; + for (int i = 0; i < DRIVER_LED_TOTAL; i++) { + led = g_rgb_leds[i]; + if (led.matrix_co.raw < 0xFF) { + rgb_matrix_set_color( i, 0xFF, 0x00, 0x00 ); + } + } +#endif //RGB_MATRIX_ENABLE + shutdown_keymap(); +} + void suspend_power_down_user(void) { suspend_power_down_keymap(); @@ -246,20 +265,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { return false; break; - - case KC_RESET: // Custom RESET code that sets RGBLights to RED - if (!record->event.pressed) { -#ifdef RGBLIGHT_ENABLE - rgblight_enable_noeeprom(); - rgblight_mode_noeeprom(1); - rgblight_setrgb_red(); -#endif // RGBLIGHT_ENABLE - reset_keyboard(); - } - return false; - break; - - case EPRM: // Resets EEPROM if (record->event.pressed) { eeconfig_init(); @@ -333,28 +338,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { return false; break; - case KC_CCCV: // One key copy/paste - if(record->event.pressed){ - copy_paste_timer = timer_read(); - } else { - if (timer_elapsed(copy_paste_timer) > TAPPING_TERM) { // Hold, copy - register_code(KC_LCTL); - tap(KC_C); - unregister_code(KC_LCTL); -#ifdef AUDIO_ENABLE - PLAY_SONG(tone_copy); -#endif - } else { // Tap, paste - register_code(KC_LCTL); - tap(KC_V); - unregister_code(KC_LCTL); -#ifdef AUDIO_ENABLE - PLAY_SONG(tone_paste); -#endif - } - } - return false; - break; case CLICKY_TOGGLE: #ifdef AUDIO_CLICKY userspace_config.clicky_enable = clicky_enable; diff --git a/users/drashna/drashna.h b/users/drashna/drashna.h index 3efef5704..dd0d1c0d7 100644 --- a/users/drashna/drashna.h +++ b/users/drashna/drashna.h @@ -15,11 +15,13 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef USERSPACE -#define USERSPACE +#pragma once #include "quantum.h" - - +#include "version.h" +#include "eeprom.h" +#ifdef RGB_MATRIX_ENABLE +#include "rgb_matrix.h" +#endif // Define layer names enum userspace_layers { _QWERTY = 0, @@ -53,7 +55,7 @@ extern bool clicky_enable; void rgblight_sethsv_default_helper(uint8_t index); #endif // RGBLIGHT_ENABLE -void tap(uint16_t keycode); +inline void tap(uint16_t keycode){ register_code(keycode); unregister_code(keycode); }; bool mod_key_press_timer (uint16_t code, uint16_t mod_code, bool pressed); bool mod_key_press (uint16_t code, uint16_t mod_code, bool pressed, uint16_t this_timer); @@ -90,7 +92,6 @@ enum userspace_custom_keycodes { KC_C9, KC_GGEZ, KC_MAKE, // Run keyboard's customized make command - KC_RESET, // Resets keyboard, with red underglow KC_RGB_T, // Toggles RGB Layer Indication mode KC_SECRET_1, // test1 KC_SECRET_2, // test2 @@ -123,6 +124,7 @@ enum userspace_custom_keycodes { #define COLEMAK KC_COLEMAK #define WORKMAN KC_WORKMAN +#define KC_RESET RESET #define KC_RST KC_RESET #ifdef SWAP_HANDS_ENABLE @@ -131,6 +133,11 @@ enum userspace_custom_keycodes { #define KC_C1R3 KC_BSPC #endif // SWAP_HANDS_ENABLE +#define BK_LWER LT(_LOWER, KC_BSPC) +#define SP_LWER LT(_LOWER, KC_SPC) +#define DL_RAIS LT(_RAISE, KC_DEL) +#define ET_RAIS LT(_RAISE, KC_ENTER) + // OSM keycodes, to keep things clean and easy to change #define KC_MLSF OSM(MOD_LSFT) #define KC_MRSF OSM(MOD_RSFT) @@ -325,7 +332,7 @@ enum { #define _________________ADJUST_L1_________________ RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, RGB_TOG -#define _________________ADJUST_L2_________________ _______, CK_TOGG, AU_ON, AU_OFF, AG_NORM +#define _________________ADJUST_L2_________________ MU_TOG , CK_TOGG, AU_ON, AU_OFF, AG_NORM #define _________________ADJUST_L3_________________ RGB_RMOD,RGB_HUD,RGB_SAD, RGB_VAD, KC_RGB_T #define _________________ADJUST_R1_________________ KC_SEC1, KC_SEC2, KC_SEC3, KC_SEC4, KC_SEC5 @@ -350,4 +357,3 @@ enum { LT(_LOWER, KC_SPACE),KC_BSPC, KC_END, KC_PGDN, KC_DEL, LT(_RAISE, KC_ENTER) -#endif // !USERSPACE diff --git a/users/drashna/rgb_stuff.c b/users/drashna/rgb_stuff.c index f2a9a47a9..03c55b132 100644 --- a/users/drashna/rgb_stuff.c +++ b/users/drashna/rgb_stuff.c @@ -267,7 +267,7 @@ void matrix_init_rgb(void) { case _COLEMAK: rgblight_sethsv_noeeprom_magenta(); break; case _DVORAK: - rgblight_sethsv_noeeprom_green(); break; + rgblight_sethsv_noeeprom_springgreen(); break; case _WORKMAN: rgblight_sethsv_noeeprom_goldenrod(); break; default: @@ -313,7 +313,7 @@ uint32_t layer_state_set_rgb(uint32_t state) { rgblight_mode_noeeprom(5); break; case _LOWER: - rgblight_sethsv_noeeprom_orange(); + rgblight_sethsv_noeeprom_green(); rgblight_mode_noeeprom(5); break; case _ADJUST: @@ -325,7 +325,7 @@ uint32_t layer_state_set_rgb(uint32_t state) { case _COLEMAK: rgblight_sethsv_noeeprom_magenta(); break; case _DVORAK: - rgblight_sethsv_noeeprom_green(); break; + rgblight_sethsv_noeeprom_springgreen(); break; case _WORKMAN: rgblight_sethsv_noeeprom_goldenrod(); break; default: diff --git a/users/drashna/rgb_stuff.h b/users/drashna/rgb_stuff.h index 6426ea266..50c75c8c3 100644 --- a/users/drashna/rgb_stuff.h +++ b/users/drashna/rgb_stuff.h @@ -13,4 +13,3 @@ void matrix_init_rgb(void); void matrix_scan_rgb(void); uint32_t layer_state_set_rgb(uint32_t state); - diff --git a/users/drashna/template.c b/users/drashna/template.c index 20dbb96d7..e6b50c961 100644 --- a/users/drashna/template.c +++ b/users/drashna/template.c @@ -1,7 +1,5 @@ -#include "drashna.h" -#include "quantum.h" -#include "action.h" -#include "version.h" +#include "template.h" + // Add reconfigurable functions here, for keymap customization // This allows for a global, userspace functions, and continued @@ -10,25 +8,15 @@ __attribute__ ((weak)) void matrix_init_keymap(void) {} -__attribute__ ((weak)) -void matrix_scan_keymap(void) {} - -__attribute__ ((weak)) -bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { - return true; -} -__attribute__ ((weak)) -uint32_t layer_state_set_keymap (uint32_t state) { - return state; -} -__attribute__ ((weak)) -void led_set_keymap(uint8_t usb_led) {} - // Call user matrix init, then call the keymap's init function void matrix_init_user(void) { matrix_init_keymap(); } + +__attribute__ ((weak)) +void matrix_scan_keymap(void) {} + // No global matrix scan code, so just run keymap's matix // scan function void matrix_scan_user(void) { @@ -36,11 +24,16 @@ void matrix_scan_user(void) { } +__attribute__ ((weak)) +bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { + return true; +} + // Defines actions tor my global custom keycodes. Defined in drashna.h file // Then runs the _keymap's recod handier if not processed here, // And use "NEWPLACEHOLDER" for new safe range bool process_record_user(uint16_t keycode, keyrecord_t *record) { - + switch (keycode) { case KC_MAKE: if (!record->event.pressed) { @@ -56,12 +49,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } return false; break; - case KC_RESET: - if (!record->event.pressed) { - reset_keyboard(); - } - return false; - break; + case EPRM: if (record->event.pressed) { eeconfig_init(); @@ -78,13 +66,66 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { return process_record_keymap(keycode, record); } -// Runs state check and changes underglow color and animation -// on layer change, no matter where the change was initiated -// Then runs keymap's layer change check + +__attribute__ ((weak)) +uint32_t layer_state_set_keymap (uint32_t state) { + return state; +} + uint32_t layer_state_set_user (uint32_t state) { return layer_state_set_keymap (state); } + + +__attribute__ ((weak)) +void led_set_keymap(uint8_t usb_led) {} + void led_set_user(uint8_t usb_led) { led_set_keymap(usb_led); } + + + +__attribute__ ((weak)) +void suspend_power_down_keymap(void) {} + +void suspend_power_down_user(void) +{ + suspend_power_down_keymap(); +} + + + +__attribute__ ((weak)) +void suspend_wakeup_init_keymap(void) {} + +void suspend_wakeup_init_user(void) +{ + suspend_wakeup_init_keymap(); + #ifdef KEYBOARD_ergodox_ez + wait_ms(10); + #endif +} + + + +__attribute__ ((weak)) +void startup_keymap(void) {} + +void startup_user (void) { + #ifdef RGBLIGHT_ENABLE + matrix_init_rgb(); + #endif //RGBLIGHT_ENABLE + startup_keymap(); +} + + + +__attribute__ ((weak)) +void shutdown_keymap(void) {} + +void shutdown_user (void) { + shutdown_keymap(); +} + diff --git a/users/drashna/template.h b/users/drashna/template.h index d1251462b..5b3a93de5 100644 --- a/users/drashna/template.h +++ b/users/drashna/template.h @@ -2,8 +2,10 @@ #define USERSPACE #include "quantum.h" +#include "version.h" +#include "eeprom.h" -// Define layer names +// Define layer names #define BASE 0 enum custom_keycodes { From 74f2f855a330899bb078b1a1ba433368e0e05ea6 Mon Sep 17 00:00:00 2001 From: Jumail Date: Wed, 29 Aug 2018 10:31:22 +1000 Subject: [PATCH 008/788] Fixed bootloader target Fixed matching grep matches (for PRODUCT in particular) Fixed " Bootloader" concatenation for WSL (windows line-endings) --- tmk_core/avr.mk | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tmk_core/avr.mk b/tmk_core/avr.mk index cf62b0f07..2f955b18f 100644 --- a/tmk_core/avr.mk +++ b/tmk_core/avr.mk @@ -253,12 +253,12 @@ extcoff: $(BUILD_DIR)/$(TARGET).elf bootloader: make -C lib/lufa/Bootloaders/DFU/ clean printf "#ifndef QMK_KEYBOARD\n#define QMK_KEYBOARD\n\n" > lib/lufa/Bootloaders/DFU/Keyboard.h - printf "%s\n" "`$(GREP) "MANUFACTURER" $(ALL_CONFIGS) -h | tail -1`" >> lib/lufa/Bootloaders/DFU/Keyboard.h - printf "%s Bootloader\n" "`$(GREP) "PRODUCT" $(ALL_CONFIGS) -h | tail -1`" >> lib/lufa/Bootloaders/DFU/Keyboard.h - printf "%s\n" "`$(GREP) "QMK_ESC_OUTPUT" $(ALL_CONFIGS) -h | tail -1`" >> lib/lufa/Bootloaders/DFU/Keyboard.h - printf "%s\n" "`$(GREP) "QMK_ESC_INPUT" $(ALL_CONFIGS) -h | tail -1`" >> lib/lufa/Bootloaders/DFU/Keyboard.h - printf "%s\n" "`$(GREP) "QMK_LED" $(ALL_CONFIGS) -h | tail -1`" >> lib/lufa/Bootloaders/DFU/Keyboard.h - printf "%s\n" "`$(GREP) "QMK_SPEAKER" $(ALL_CONFIGS) -h | tail -1`" >> lib/lufa/Bootloaders/DFU/Keyboard.h + printf "%s\n" "`$(GREP) "MANUFACTURER\s" $(ALL_CONFIGS) -h | tail -1`" >> lib/lufa/Bootloaders/DFU/Keyboard.h + printf "%s Bootloader\n" "`$(GREP) "PRODUCT\s" $(ALL_CONFIGS) -h | tail -1 | tr -d '\r'`" >> lib/lufa/Bootloaders/DFU/Keyboard.h + printf "%s\n" "`$(GREP) "QMK_ESC_OUTPUT\s" $(ALL_CONFIGS) -h | tail -1`" >> lib/lufa/Bootloaders/DFU/Keyboard.h + printf "%s\n" "`$(GREP) "QMK_ESC_INPUT\s" $(ALL_CONFIGS) -h | tail -1`" >> lib/lufa/Bootloaders/DFU/Keyboard.h + printf "%s\n" "`$(GREP) "QMK_LED\s" $(ALL_CONFIGS) -h | tail -1`" >> lib/lufa/Bootloaders/DFU/Keyboard.h + printf "%s\n" "`$(GREP) "QMK_SPEAKER\s" $(ALL_CONFIGS) -h | tail -1`" >> lib/lufa/Bootloaders/DFU/Keyboard.h printf "\n#endif" >> lib/lufa/Bootloaders/DFU/Keyboard.h make -C lib/lufa/Bootloaders/DFU/ printf "BootloaderDFU.hex copied to $(TARGET)_bootloader.hex\n" From 836efb50c6fa1be9e3189242479e7ae5bc2b3f38 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Wed, 29 Aug 2018 10:57:30 -0700 Subject: [PATCH 009/788] Updated templates for use by new_project.sh (#3783) * template.h file cleanup Reformatted the pre-macro comments as block comments. Updated the ps2avrgb template comment to match the avr template's comment, which was more informative. Deleted the line about the macro representing the Planck MIT layout, because the macro doesn't represent that layout anymore. * base template keymap.c refactor Deleted the deprecated TMK macro functions. Defined two custom keycodes for use as macros by process_record_user. process_record_user is now after the keymap and before matrix_init_user, where the deleted TMK functions were. * Removed an extra " from macro command per @drashna * Added BOOTLOADER rule to avr/rules.mk per @drashna * Updated Bootloader sections per @drashna * Updated links to docs at the bottom of both avr and ps2avrgb template readme.md files Corrected the links to the Build Environment Setup and the Make Instructions docs. Added direct link to the QMK Complete Newbs Guide. --- quantum/template/avr/readme.md | 2 +- quantum/template/avr/rules.mk | 25 ++++++--- quantum/template/avr/template.h | 14 +++-- .../template/base/keymaps/default/keymap.c | 56 ++++++++++--------- quantum/template/ps2avrgb/readme.md | 2 +- quantum/template/ps2avrgb/template.h | 12 ++-- 6 files changed, 66 insertions(+), 45 deletions(-) diff --git a/quantum/template/avr/readme.md b/quantum/template/avr/readme.md index d9349811d..d243c66a9 100644 --- a/quantum/template/avr/readme.md +++ b/quantum/template/avr/readme.md @@ -12,4 +12,4 @@ Make example for this keyboard (after setting up your build environment): make %KEYBOARD%:default -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. \ No newline at end of file +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). diff --git a/quantum/template/avr/rules.mk b/quantum/template/avr/rules.mk index 92f3a03a9..383a3594b 100644 --- a/quantum/template/avr/rules.mk +++ b/quantum/template/avr/rules.mk @@ -39,13 +39,24 @@ F_USB = $(F_CPU) OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT -# Boot Section Size in *bytes* -# Teensy halfKay 512 -# Teensy++ halfKay 1024 -# Atmel DFU loader 4096 -# LUFA bootloader 4096 -# USBaspLoader 2048 -OPT_DEFS += -DBOOTLOADER_SIZE=4096 +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 # Build Options diff --git a/quantum/template/avr/template.h b/quantum/template/avr/template.h index 031efc952..0d626ed50 100644 --- a/quantum/template/avr/template.h +++ b/quantum/template/avr/template.h @@ -18,12 +18,14 @@ #include "quantum.h" -// This a shortcut to help you visually see your layout. -// The following is an example using the Planck MIT layout -// The first section contains all of the arguments representing the physical -// layout of the board and position of the keys -// The second converts the arguments into a two-dimensional array which -// represents the switch matrix. +/* This a shortcut to help you visually see your layout. + * + * The first section contains all of the arguments representing the physical + * layout of the board and position of the keys. + * + * The second converts the arguments into a two-dimensional array which + * represents the switch matrix. + */ #define LAYOUT( \ K00, K01, K02, \ K10, K11 \ diff --git a/quantum/template/base/keymaps/default/keymap.c b/quantum/template/base/keymaps/default/keymap.c index 14a8bc0f2..5f0730c8a 100644 --- a/quantum/template/base/keymaps/default/keymap.c +++ b/quantum/template/base/keymaps/default/keymap.c @@ -15,32 +15,40 @@ */ #include QMK_KEYBOARD_H +// Defines the keycodes used by our macros in process_record_user +enum custom_keycodes { + QMKBEST = SAFE_RANGE, + QMKURL +}; + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[0] = LAYOUT( /* Base */ - KC_A, KC_1, KC_H, \ - KC_TAB, KC_SPC \ -), + [0] = LAYOUT( /* Base */ + KC_A, KC_1, KC_H, \ + KC_TAB, KC_SPC \ + ), }; -const uint16_t PROGMEM fn_actions[] = { - -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - // MACRODOWN only works in this function - switch(id) { - case 0: - if (record->event.pressed) { - register_code(KC_RSFT); - } else { - unregister_code(KC_RSFT); - } - break; +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QMKBEST: + if (record->event.pressed) { + // when keycode QMKBEST is pressed + SEND_STRING("QMK is the best thing ever!"); + } else { + // when keycode QMKBEST is released } - return MACRO_NONE; -}; - + break; + case QMKURL: + if (record->event.pressed) { + // when keycode QMKURL is pressed + SEND_STRING("https://qmk.fm/" SS_TAP(X_ENTER)); + } else { + // when keycode QMKURL is released + } + break; + } + return true; +} void matrix_init_user(void) { @@ -50,10 +58,6 @@ void matrix_scan_user(void) { } -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - return true; -} - void led_set_user(uint8_t usb_led) { } diff --git a/quantum/template/ps2avrgb/readme.md b/quantum/template/ps2avrgb/readme.md index 1dcbe6e75..feec722a5 100644 --- a/quantum/template/ps2avrgb/readme.md +++ b/quantum/template/ps2avrgb/readme.md @@ -41,4 +41,4 @@ macOS: 4. Place your keyboard into reset. 5. Flash the board by typing `bootloadHID -r` followed by the path to your `.hex` file. -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. +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). diff --git a/quantum/template/ps2avrgb/template.h b/quantum/template/ps2avrgb/template.h index c3924ee71..b4d6f4662 100644 --- a/quantum/template/ps2avrgb/template.h +++ b/quantum/template/ps2avrgb/template.h @@ -18,10 +18,14 @@ #include "quantum.h" -// This a shortcut to help you visually see your layout. -// The following is an example using the Planck MIT layout -// The first section contains all of the arguments -// The second converts the arguments into a two-dimensional array +/* This a shortcut to help you visually see your layout. + * + * The first section contains all of the arguments representing the physical + * layout of the board and position of the keys. + * + * The second converts the arguments into a two-dimensional array which + * represents the switch matrix. + */ #define LAYOUT( \ k00, k01, k02, \ k10, k11 \ From 190fcdde2620bcd2d94b58aa29fca3f5361ef40d Mon Sep 17 00:00:00 2001 From: blindassassin111 <38090555+blindassassin111@users.noreply.github.com> Date: Wed, 29 Aug 2018 13:58:09 -0500 Subject: [PATCH 010/788] Keyboard: Adding the AT101 PCB (#3785) * Adding the AT101 PCB firmware * Fixed AT101 keymap error * Fixing AT101 firmware * More Fixes for AT101 firmware * Rename AT101_Blackheart.c to at101_blackheart.c * Rename AT101_Blackheart.h to at101_blackheart.h * Update readme.md * Renaming AT101 folder pt1 * Renaming AT101 folder pt2 * Fixing AT101 LED function name * Redoing AT101 folder naming pt2 Last round had issues, should be the last rename. * Fixing missing comma in at101_blackheart.h --- keyboards/at101_blackheart/at101_blackheart.c | 1 + keyboards/at101_blackheart/at101_blackheart.h | 28 +++++++++ keyboards/at101_blackheart/config.h | 43 ++++++++++++++ .../at101_blackheart/keymaps/default/keymap.c | 53 +++++++++++++++++ keyboards/at101_blackheart/readme.md | 14 +++++ keyboards/at101_blackheart/rules.mk | 59 +++++++++++++++++++ 6 files changed, 198 insertions(+) create mode 100644 keyboards/at101_blackheart/at101_blackheart.c create mode 100644 keyboards/at101_blackheart/at101_blackheart.h create mode 100644 keyboards/at101_blackheart/config.h create mode 100644 keyboards/at101_blackheart/keymaps/default/keymap.c create mode 100644 keyboards/at101_blackheart/readme.md create mode 100644 keyboards/at101_blackheart/rules.mk diff --git a/keyboards/at101_blackheart/at101_blackheart.c b/keyboards/at101_blackheart/at101_blackheart.c new file mode 100644 index 000000000..aa07a7864 --- /dev/null +++ b/keyboards/at101_blackheart/at101_blackheart.c @@ -0,0 +1 @@ +#include "at101_blackheart.h" diff --git a/keyboards/at101_blackheart/at101_blackheart.h b/keyboards/at101_blackheart/at101_blackheart.h new file mode 100644 index 000000000..24ac1b7c5 --- /dev/null +++ b/keyboards/at101_blackheart/at101_blackheart.h @@ -0,0 +1,28 @@ +#ifndef at101_blackheart_H +#define at101_blackheart_H + +#include "quantum.h" + +#define LAYOUT( \ + K0000, K0100, K0001, K0101, K0002, K0102, K0003, K0103, K0004, K0104, K0005, K0105, K0006, K0106, K0007, K0107, \ + K0200, K0300, K0201, K0301, K0202, K0302, K0203, K0303, K0204, K0304, K0205, K0305, K0206, K0306, K0207, K0307, K0208, K0308, K0209, K0309, K0009, \ + K0400, K0500, K0401, K0501, K0402, K0502, K0403, K0503, K0404, K0504, K0405, K0505, K0406, K0506, K0407, K0507, K0408, K0508, K0409, K0509, K0109, \ + K0600, K0700, K0601, K0701, K0602, K0702, K0603, K0703, K0604, K0704, K0605, K0705, K0606, K0608, K0708, K0609, K0709, \ + K0800, K1101, K0900, K0801, K0901, K0802, K0902, K0803, K0903, K0804, K0904, K0805, K0905, K0806, K0807, K0808, K0908, K0809, K0909, \ + K1000, K1100, K1001, K1102, K1005, K1105, K1006, K1106, K1007, K1107, K1008, K1108, K1009 \ +) { \ + { K0000, K0001, K0002, K0003, K0004, K0005, K0006, K0007, KC_NO, K0009 }, \ + { K0100, K0101, K0102, K0103, K0104, K0105, K0106, K0107, KC_NO, K0109 }, \ + { K0200, K0201, K0202, K0203, K0204, K0205, K0206, K0207, K0208, K0209 }, \ + { K0300, K0301, K0302, K0303, K0304, K0305, K0306, K0307, K0308, K0309 }, \ + { K0400, K0401, K0402, K0403, K0404, K0405, K0406, K0407, K0408, K0409 }, \ + { K0500, K0501, K0502, K0503, K0504, K0505, K0506, K0507, K0508, K0509 }, \ + { K0600, K0601, K0602, K0603, K0604, K0605, K0606, KC_NO, K0608, K0609 }, \ + { K0700, K0701, K0702, K0703, K0704, K0705, KC_NO, KC_NO, K0708, K0709 }, \ + { K0800, K0801, K0802, K0803, K0804, K0805, K0806, K0807, K0808, K0809 }, \ + { K0900, K0901, K0902, K0903, K0904, K0905, KC_NO, KC_NO, K0908, K0909 }, \ + { K1000, K1001, KC_NO, KC_NO, KC_NO, K1005, K1006, K1007, K1008, K1009 }, \ + { K1100, K1101, K1102, KC_NO, KC_NO, K1105, K1106, K1107, K1108, KC_NO } \ +} + +#endif diff --git a/keyboards/at101_blackheart/config.h b/keyboards/at101_blackheart/config.h new file mode 100644 index 000000000..6a809a02f --- /dev/null +++ b/keyboards/at101_blackheart/config.h @@ -0,0 +1,43 @@ +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER blindassassin111 +#define PRODUCT AT101_Blackheart PCB +#define DESCRIPTION Replacement AT101 PCB + +/* key matrix size */ +#define MATRIX_ROWS 12 +#define MATRIX_COLS 10 + +/* key matrix pins */ +#define MATRIX_ROW_PINS { F0, F1, F4, D4, F6, F5, F7, B6, B5, D5, C7, C6 } +#define MATRIX_COL_PINS { D1, D0, B7, B3, B2, B1, B0, E6, D2, D3 } +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCING_DELAY 5 + +/* 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 + +/* force n-key rollover*/ +#define FORCE_NKRO + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* prevent stuck modifiers */ +#define PREVENT_STUCK_MODIFIERS \ No newline at end of file diff --git a/keyboards/at101_blackheart/keymaps/default/keymap.c b/keyboards/at101_blackheart/keymaps/default/keymap.c new file mode 100644 index 000000000..086c25e1c --- /dev/null +++ b/keyboards/at101_blackheart/keymaps/default/keymap.c @@ -0,0 +1,53 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + LAYOUT( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR,KC_SLCK, KC_PAUS, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC,KC_BSLS, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, KC_PPLS, + KC_CAPS,KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT,KC_ENT, KC_P4, KC_P5, KC_P6, KC_PEQL, + KC_LSFT,KC_BSLS,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,KC_LSFT,MO(1), KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, + KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT, KC_RGUI,KC_MENU, KC_RCTL, KC_LEFT,KC_DOWN, KC_RGHT, KC_P0, KC_PDOT), + + LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), +}; + +void matrix_init_user(void) { +} + +void matrix_scan_user(void) { +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void led_set_user(uint8_t usb_led) { + DDRB |= (1 << 4); + DDRD |= (1 << 6) | (1 << 7); + + if (usb_led & (1 << USB_LED_NUM_LOCK)) { + PORTD |= (1 << 7); + } else { + PORTD &= ~(1 << 7); + } + + if (usb_led & (1 << USB_LED_CAPS_LOCK)) { + PORTB |= (1 << 4); + } else { + PORTB &= ~(1 << 4); + } + + if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { + PORTD |= (1 << 6); + } else { + PORTD &= ~(1 << 6); + } +} \ No newline at end of file diff --git a/keyboards/at101_blackheart/readme.md b/keyboards/at101_blackheart/readme.md new file mode 100644 index 000000000..7b356bc75 --- /dev/null +++ b/keyboards/at101_blackheart/readme.md @@ -0,0 +1,14 @@ +AT101 Blackheart PCB +=== + +A replacement PCB for AT101 keyboards. + +Keyboard Maintainer: QMK Community and blindassassin111 +Hardware Supported: AT101 blackheart PCB +Hardware Availability: https://deskthority.net/group-buys-f50/programmable-vintage-board-pcbs-omnikey-at101-and-z-150-t19325.html + +Make example for this keyboard (after setting up your build environment): + + make at101_blackheart:default + +See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. diff --git a/keyboards/at101_blackheart/rules.mk b/keyboards/at101_blackheart/rules.mk new file mode 100644 index 000000000..fadff6f23 --- /dev/null +++ b/keyboards/at101_blackheart/rules.mk @@ -0,0 +1,59 @@ +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader selection +BOOTLOADER = halfkay + +# Boot Section Size in *bytes* +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# comment out to disable the options. +# +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +AUDIO_ENABLE = no +RGBLIGHT_ENABLE = no \ No newline at end of file From a6c770432f1348c44bc199029ce17b1b9ff4191c Mon Sep 17 00:00:00 2001 From: frederik-h Date: Wed, 29 Aug 2018 21:01:49 +0200 Subject: [PATCH 011/788] Keymap: Add german layout for redox keyboard (#3695) * Add german layout for redox keyboard A german layout for the redox keyboard which tries to stay close to the default english redox layout while acommodating the umlauts at their usual position. * Fix keycodes in german redox keymap The keycode for Y was wrong. * Minor changes * Remove #ifdef include guard by #pragma once * Remove unnecessary include from rules.mk * Review changes Remove unnecessary code fragments that were pointed out in the review of PR #3695 by @drashna. --- keyboards/redox/keymaps/german/config.h | 36 ++++++++ keyboards/redox/keymaps/german/keymap.c | 108 +++++++++++++++++++++++ keyboards/redox/keymaps/german/readme.md | 5 ++ keyboards/redox/keymaps/german/rules.mk | 1 + 4 files changed, 150 insertions(+) create mode 100644 keyboards/redox/keymaps/german/config.h create mode 100644 keyboards/redox/keymaps/german/keymap.c create mode 100644 keyboards/redox/keymaps/german/readme.md create mode 100644 keyboards/redox/keymaps/german/rules.mk diff --git a/keyboards/redox/keymaps/german/config.h b/keyboards/redox/keymaps/german/config.h new file mode 100644 index 000000000..0eb19ab1e --- /dev/null +++ b/keyboards/redox/keymaps/german/config.h @@ -0,0 +1,36 @@ +/* +Copyright 2018 Mattia Dal Ben + +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 . +*/ + +#pragma once + +/* Use I2C or Serial, not both */ + +// #define USE_SERIAL +#define USE_I2C + +/* Select hand configuration */ + +// #define MASTER_LEFT +#define MASTER_LEFT +// #define EE_HANDS + +#undef RGBLED_NUM +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 14 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 diff --git a/keyboards/redox/keymaps/german/keymap.c b/keyboards/redox/keymaps/german/keymap.c new file mode 100644 index 000000000..315740f68 --- /dev/null +++ b/keyboards/redox/keymaps/german/keymap.c @@ -0,0 +1,108 @@ +#include QMK_KEYBOARD_H +#include "keymap_german.h" + +extern keymap_config_t keymap_config; +extern rgblight_config_t rgblight_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _SYMB 1 +#define _NAV 2 +#define _ADJUST 3 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + SYMB, + NAV, + ADJUST, +}; + +// Fillers to make layering more clear +#define KC_ KC_TRNS +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* QWERTY + * ,------------------------------------------------. ,------------------------------------------------. + * |^/Lyr2| 1 | 2 | 3 | 4 | 5 | Lyr1 | | Lyr1 | 6 | 7 | 8 | 9 | 0 |--Lyr2| + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | Tab | Q | W | E | R | T | ` | | + | Y | U | I | O | P | = | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | Esc | A | S | D | F | G | PgUp | | End | H | J | K | L | Ö | Ä | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | PgDn | | Home | N | M | , | . | - |Shift | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | Gui | < | # |*(Alt)|/(Ctr)|Bcksp | Del | |Enter |Space | Alt | Left | Down | Up | Right| + * `------------------------------------------------' `------------------------------------------------' + */ + [_QWERTY] = LAYOUT( + //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. + LT(_NAV, DE_CIRC) , DE_1 , DE_2 , DE_3 , DE_4 , DE_5 ,MO(_SYMB), MO(_SYMB), DE_6 , DE_7 , DE_8 , DE_9 , DE_0 ,LT(_NAV, DE_SS), + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + KC_TAB , DE_Q , DE_W , DE_E , DE_R , DE_T , DE_ACUT, DE_PLUS , DE_Z , DE_U , DE_I , DE_O , DE_P , DE_UE, + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + KC_ESC , DE_A , DE_S , DE_D , DE_F , DE_G , LT(_ADJUST, KC_PGUP), LT( _ADJUST, KC_END) , DE_H , DE_J , DE_K , DE_L , DE_OE , DE_AE, + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + KC_LSFT, DE_Y , DE_X , DE_C , DE_V , DE_B ,KC_PGDN, KC_HOME , DE_N , DE_M , DE_COMM, DE_DOT , DE_MINS , KC_RSFT, + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + KC_LGUI , DE_LESS , DE_HASH , LALT_T(KC_KP_PLUS),LCTL_T(KC_KP_ASTERISK),KC_BSPC,KC_DEL , KC_ENT , KC_SPC, DE_ALGR , KC_LEFT, KC_DOWN, KC_UP , KC_RGHT + //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' + ), + +/* Symbols + * ,------------------------------------------------. ,------------------------------------------------. + * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | ! | @ | { | } | | | | | | | 7 | 8 | 9 | | F12 | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | # | $ | [ | ] | ~ | | | | | 4 | 5 | 6 | | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | Shift| % | ^ | ( | ) | ` | | | | | 1 | 2 | 3 | |Shift | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | Alt | Ctrl | | | | | | 0 | 0 | . | | | + * `------------------------------------------------' `------------------------------------------------' + */ + + [_SYMB] = LAYOUT( + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + _______, DE_EXLM, DE_AT , DE_LCBR, DE_RCBR, DE_PIPE, _______, _______, XXXXXXX, KC_KP_7, KC_KP_8, KC_KP_9, XXXXXXX, KC_F12, + _______, DE_HASH, DE_DLR , DE_LBRC, DE_RBRC, DE_TILD, _______, _______, XXXXXXX, KC_KP_4, KC_KP_5, KC_KP_6, XXXXXXX, XXXXXXX, + KC_LSFT, DE_PERC, DE_CIRC, DE_LPRN, DE_RPRN, DE_GRV, _______, _______, XXXXXXX, KC_KP_1, KC_KP_2, KC_KP_3, XXXXXXX, KC_RSFT, + _______, _______, _______, KC_LALT, KC_LCTL, _______, _______, _______, _______, KC_KP_0, KC_KP_0, KC_PDOT, XXXXXXX, XXXXXXX + ), + +/* Navigation + * ,------------------------------------------------. ,------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | |MOUS_U| |WHEL_U| | | | | | | | | | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | |MOUS_L|MOUS_D|MOUS_R|WHEL_D| | | | | LEFT | DOWN | UP |RIGHT | | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | | | | | | | | | | | | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | |MOUS_1|MOUS_2| | | | | | | | | | + * `------------------------------------------------' `------------------------------------------------' + */ + [_NAV] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + XXXXXXX, XXXXXXX, KC_MS_U, XXXXXXX, KC_WH_U, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, XXXXXXX, _______, _______, KC_LEFT, KC_DOWN, KC_UP , KC_RIGHT,XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_BTN1, KC_BTN2, _______, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX + ), + + [_ADJUST] = LAYOUT( + XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, + XXXXXXX, RESET , RGB_M_P, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, XXXXXXX, KC_DEL, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX + ) + +}; diff --git a/keyboards/redox/keymaps/german/readme.md b/keyboards/redox/keymaps/german/readme.md new file mode 100644 index 000000000..91bc230fc --- /dev/null +++ b/keyboards/redox/keymaps/german/readme.md @@ -0,0 +1,5 @@ +# German keymap for Redox + +The layout acommodates the German umlauts and the punctuation symbols +at their usual positions relative to the other alphabetic characters. +Apart from that it stays close to the default english redox layout. diff --git a/keyboards/redox/keymaps/german/rules.mk b/keyboards/redox/keymaps/german/rules.mk new file mode 100644 index 000000000..1e3cebb14 --- /dev/null +++ b/keyboards/redox/keymaps/german/rules.mk @@ -0,0 +1 @@ +RGBLIGHT_ENABLE = yes From 30680c6eb396a2bb06928afd69edae9908ac84fb Mon Sep 17 00:00:00 2001 From: patrickmt <40182064+patrickmt@users.noreply.github.com> Date: Wed, 29 Aug 2018 15:07:52 -0400 Subject: [PATCH 012/788] Massdrop keyboard support (#3780) * Massdrop SAMD51 Massdrop SAMD51 keyboards initial project upload * Removing relocated files Removing files that were relocated and not deleted from previous location * LED queue fix and cleaning Cleaned some white space or comments. Fix for LED I2C command queue. Cleaned up interrupts. Added debug function for printing numbers to scope through m15 line. * Factory programmed serial usage Ability to use factory programmed serial in hub and keyboard usb descriptors * USB serial number and bugfix Added support for factory programmed serial and usage. Incorporated bootloader's conditional compiling to align project closer. Fixed issue when USB device attempted to send before enabled. General white space and comment cleanup. * Project cleanup Cleaned up project in terms of white space, commented code, and unecessary files. NKRO keyboard is now using correct setreport although KBD was fine to use. Fixed broken linkage to __xprintf for serial debug statements. * Fix for extra keys Fixed possible USB hang on extra keys report set missing * I2C cleanup I2C cleanup and file renames necessary for master branch merge * Boot tracing and clocks cleanup Added optional boot debug trace mode through debug LED codes. General clock code cleanup. * Relocate ARM/Atmel headers Moved ARM/Atmel header folder from drivers to lib and made necessary makefile changes. * Pull request changes Pull request changes * Keymap and compile flag fix Keymap fix for momentary layer. Potential compile flag fix for Travis CI failure. * va_list include fix Fix for va_list compile failure * Include file case fixes Fixes for include files with incorrect case * ctrl and alt67 keyboard readme Added ctrl and alt67 keyboard readme files --- build_keyboard.mk | 8 + keyboards/alt67/alt67.h | 24 + keyboards/alt67/config.h | 79 + keyboards/alt67/config_led.h | 178 + keyboards/alt67/keymaps/default/keymap.c | 200 + keyboards/alt67/led_programs.c | 120 + keyboards/alt67/matrix.c | 182 + keyboards/alt67/matrix.h | 77 + keyboards/alt67/readme.md | 15 + keyboards/alt67/rules.mk | 32 + keyboards/ctrl/config.h | 79 + keyboards/ctrl/config_led.h | 191 + keyboards/ctrl/ctrl.h | 32 + keyboards/ctrl/keymaps/default/keymap.c | 203 + keyboards/ctrl/led_programs.c | 120 + keyboards/ctrl/matrix.c | 182 + keyboards/ctrl/matrix.h | 77 + keyboards/ctrl/readme.md | 15 + keyboards/ctrl/rules.mk | 32 + .../arm/cmsis/5.0.1/CMSIS/Include/arm_math.h | 7226 +++++++++++++++++ .../5.0.1/CMSIS/Include/cmsis_compiler.h | 223 + .../arm/cmsis/5.0.1/CMSIS/Include/cmsis_gcc.h | 1899 +++++ .../arm/cmsis/5.0.1/CMSIS/Include/core_cm4.h | 2103 +++++ .../packs/arm/cmsis/5.0.1/LICENSE.txt | 201 + .../1.0.70/gcc/gcc/samd51j18a_flash.ld | 168 + .../1.0.70/include/component-version.h | 65 + .../SAMD51_DFP/1.0.70/include/component/ac.h | 598 ++ .../SAMD51_DFP/1.0.70/include/component/adc.h | 871 ++ .../SAMD51_DFP/1.0.70/include/component/aes.h | 375 + .../SAMD51_DFP/1.0.70/include/component/can.h | 3207 ++++++++ .../SAMD51_DFP/1.0.70/include/component/ccl.h | 228 + .../1.0.70/include/component/cmcc.h | 357 + .../SAMD51_DFP/1.0.70/include/component/dac.h | 544 ++ .../1.0.70/include/component/dmac.h | 1416 ++++ .../SAMD51_DFP/1.0.70/include/component/dsu.h | 1244 +++ .../SAMD51_DFP/1.0.70/include/component/eic.h | 497 ++ .../1.0.70/include/component/evsys.h | 587 ++ .../1.0.70/include/component/freqm.h | 233 + .../1.0.70/include/component/gclk.h | 272 + .../1.0.70/include/component/hmatrixb.h | 84 + .../SAMD51_DFP/1.0.70/include/component/i2s.h | 747 ++ .../SAMD51_DFP/1.0.70/include/component/icm.h | 582 ++ .../1.0.70/include/component/mclk.h | 474 ++ .../1.0.70/include/component/nvmctrl.h | 861 ++ .../1.0.70/include/component/osc32kctrl.h | 303 + .../1.0.70/include/component/oscctrl.h | 793 ++ .../SAMD51_DFP/1.0.70/include/component/pac.h | 674 ++ .../SAMD51_DFP/1.0.70/include/component/pcc.h | 251 + .../1.0.70/include/component/pdec.h | 726 ++ .../SAMD51_DFP/1.0.70/include/component/pm.h | 261 + .../1.0.70/include/component/port.h | 414 + .../1.0.70/include/component/qspi.h | 528 ++ .../1.0.70/include/component/ramecc.h | 178 + .../1.0.70/include/component/rstc.h | 115 + .../SAMD51_DFP/1.0.70/include/component/rtc.h | 2098 +++++ .../1.0.70/include/component/sdhc.h | 2599 ++++++ .../1.0.70/include/component/sercom.h | 1680 ++++ .../1.0.70/include/component/supc.h | 554 ++ .../SAMD51_DFP/1.0.70/include/component/tal.h | 1842 +++++ .../SAMD51_DFP/1.0.70/include/component/tc.h | 851 ++ .../SAMD51_DFP/1.0.70/include/component/tcc.h | 1762 ++++ .../1.0.70/include/component/trng.h | 172 + .../SAMD51_DFP/1.0.70/include/component/usb.h | 1777 ++++ .../SAMD51_DFP/1.0.70/include/component/wdt.h | 300 + .../SAMD51_DFP/1.0.70/include/instance/ac.h | 79 + .../SAMD51_DFP/1.0.70/include/instance/adc0.h | 99 + .../SAMD51_DFP/1.0.70/include/instance/adc1.h | 100 + .../SAMD51_DFP/1.0.70/include/instance/aes.h | 105 + .../SAMD51_DFP/1.0.70/include/instance/can0.h | 153 + .../SAMD51_DFP/1.0.70/include/instance/can1.h | 151 + .../SAMD51_DFP/1.0.70/include/instance/ccl.h | 57 + .../SAMD51_DFP/1.0.70/include/instance/cmcc.h | 61 + .../SAMD51_DFP/1.0.70/include/instance/dac.h | 88 + .../SAMD51_DFP/1.0.70/include/instance/dmac.h | 596 ++ .../SAMD51_DFP/1.0.70/include/instance/dsu.h | 121 + .../SAMD51_DFP/1.0.70/include/instance/eic.h | 73 + .../1.0.70/include/instance/evsys.h | 722 ++ .../1.0.70/include/instance/freqm.h | 59 + .../SAMD51_DFP/1.0.70/include/instance/gclk.h | 191 + .../1.0.70/include/instance/hmatrix.h | 133 + .../SAMD51_DFP/1.0.70/include/instance/i2s.h | 81 + .../SAMD51_DFP/1.0.70/include/instance/icm.h | 77 + .../SAMD51_DFP/1.0.70/include/instance/mclk.h | 61 + .../1.0.70/include/instance/nvmctrl.h | 75 + .../1.0.70/include/instance/osc32kctrl.h | 59 + .../1.0.70/include/instance/oscctrl.h | 130 + .../SAMD51_DFP/1.0.70/include/instance/pac.h | 69 + .../SAMD51_DFP/1.0.70/include/instance/pcc.h | 58 + .../SAMD51_DFP/1.0.70/include/instance/pdec.h | 80 + .../SAMD51_DFP/1.0.70/include/instance/pm.h | 59 + .../SAMD51_DFP/1.0.70/include/instance/port.h | 184 + .../1.0.70/include/instance/pukcc.h | 57 + .../SAMD51_DFP/1.0.70/include/instance/qspi.h | 72 + .../1.0.70/include/instance/ramecc.h | 54 + .../SAMD51_DFP/1.0.70/include/instance/rstc.h | 48 + .../SAMD51_DFP/1.0.70/include/instance/rtc.h | 156 + .../1.0.70/include/instance/sdhc0.h | 147 + .../1.0.70/include/instance/sdhc1.h | 147 + .../1.0.70/include/instance/sercom0.h | 181 + .../1.0.70/include/instance/sercom1.h | 181 + .../1.0.70/include/instance/sercom2.h | 181 + .../1.0.70/include/instance/sercom3.h | 181 + .../1.0.70/include/instance/sercom4.h | 181 + .../1.0.70/include/instance/sercom5.h | 181 + .../1.0.70/include/instance/sercom6.h | 181 + .../1.0.70/include/instance/sercom7.h | 181 + .../SAMD51_DFP/1.0.70/include/instance/supc.h | 64 + .../SAMD51_DFP/1.0.70/include/instance/tal.h | 541 ++ .../SAMD51_DFP/1.0.70/include/instance/tc0.h | 109 + .../SAMD51_DFP/1.0.70/include/instance/tc1.h | 109 + .../SAMD51_DFP/1.0.70/include/instance/tc2.h | 109 + .../SAMD51_DFP/1.0.70/include/instance/tc3.h | 109 + .../SAMD51_DFP/1.0.70/include/instance/tc4.h | 109 + .../SAMD51_DFP/1.0.70/include/instance/tc5.h | 109 + .../SAMD51_DFP/1.0.70/include/instance/tc6.h | 109 + .../SAMD51_DFP/1.0.70/include/instance/tc7.h | 109 + .../SAMD51_DFP/1.0.70/include/instance/tcc0.h | 125 + .../SAMD51_DFP/1.0.70/include/instance/tcc1.h | 115 + .../SAMD51_DFP/1.0.70/include/instance/tcc2.h | 106 + .../SAMD51_DFP/1.0.70/include/instance/tcc3.h | 99 + .../SAMD51_DFP/1.0.70/include/instance/tcc4.h | 99 + .../SAMD51_DFP/1.0.70/include/instance/trng.h | 51 + .../SAMD51_DFP/1.0.70/include/instance/usb.h | 343 + .../SAMD51_DFP/1.0.70/include/instance/wdt.h | 55 + .../1.0.70/include/pio/samd51j18a.h | 1863 +++++ .../atmel/SAMD51_DFP/1.0.70/include/sam.h | 54 + .../atmel/SAMD51_DFP/1.0.70/include/samd51.h | 60 + .../SAMD51_DFP/1.0.70/include/samd51j18a.h | 1079 +++ .../SAMD51_DFP/1.0.70/include/system_samd51.h | 48 + tmk_core/arm_atsam.mk | 56 + tmk_core/common.mk | 6 + tmk_core/common/arm_atsam/bootloader.c | 19 + tmk_core/common/arm_atsam/eeprom.c | 98 + tmk_core/common/arm_atsam/printf.h | 8 + tmk_core/common/arm_atsam/suspend.c | 17 + tmk_core/common/arm_atsam/timer.c | 59 + tmk_core/common/print.h | 30 +- tmk_core/common/report.h | 5 + tmk_core/protocol/arm_atsam.mk | 26 + tmk_core/protocol/arm_atsam/adc.c | 99 + tmk_core/protocol/arm_atsam/adc.h | 37 + .../protocol/arm_atsam/arm_atsam_protocol.h | 45 + tmk_core/protocol/arm_atsam/clks.c | 439 + tmk_core/protocol/arm_atsam/clks.h | 90 + tmk_core/protocol/arm_atsam/d51_util.c | 165 + tmk_core/protocol/arm_atsam/d51_util.h | 185 + tmk_core/protocol/arm_atsam/i2c_master.c | 585 ++ tmk_core/protocol/arm_atsam/i2c_master.h | 108 + tmk_core/protocol/arm_atsam/issi3733_driver.h | 201 + tmk_core/protocol/arm_atsam/led_matrix.c | 509 ++ tmk_core/protocol/arm_atsam/led_matrix.h | 142 + tmk_core/protocol/arm_atsam/main_arm_atsam.c | 279 + tmk_core/protocol/arm_atsam/main_arm_atsam.h | 23 + tmk_core/protocol/arm_atsam/md_bootloader.h | 18 + tmk_core/protocol/arm_atsam/spi.c | 90 + tmk_core/protocol/arm_atsam/spi.h | 63 + tmk_core/protocol/arm_atsam/startup.c | 548 ++ tmk_core/protocol/arm_atsam/usb/compiler.h | 1177 +++ tmk_core/protocol/arm_atsam/usb/conf_usb.h | 163 + tmk_core/protocol/arm_atsam/usb/main_usb.c | 118 + tmk_core/protocol/arm_atsam/usb/spfssf.c | 268 + tmk_core/protocol/arm_atsam/usb/spfssf.h | 57 + .../protocol/arm_atsam/usb/status_codes.h | 158 + tmk_core/protocol/arm_atsam/usb/udc.c | 1164 +++ tmk_core/protocol/arm_atsam/usb/udc.h | 260 + tmk_core/protocol/arm_atsam/usb/udc_desc.h | 135 + tmk_core/protocol/arm_atsam/usb/udd.h | 396 + tmk_core/protocol/arm_atsam/usb/udi.h | 133 + tmk_core/protocol/arm_atsam/usb/udi_cdc.c | 1384 ++++ tmk_core/protocol/arm_atsam/usb/udi_cdc.h | 381 + .../protocol/arm_atsam/usb/udi_cdc_conf.h | 72 + .../protocol/arm_atsam/usb/udi_device_conf.h | 715 ++ .../arm_atsam/usb/udi_device_epsize.h | 32 + tmk_core/protocol/arm_atsam/usb/udi_hid.c | 162 + tmk_core/protocol/arm_atsam/usb/udi_hid.h | 85 + tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c | 845 ++ tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h | 109 + .../protocol/arm_atsam/usb/udi_hid_kbd_conf.h | 60 + .../protocol/arm_atsam/usb/udi_hid_kbd_desc.c | 179 + tmk_core/protocol/arm_atsam/usb/ui.c | 106 + tmk_core/protocol/arm_atsam/usb/ui.h | 82 + tmk_core/protocol/arm_atsam/usb/usb.c | 1144 +++ tmk_core/protocol/arm_atsam/usb/usb.h | 492 ++ tmk_core/protocol/arm_atsam/usb/usb2422.c | 412 + tmk_core/protocol/arm_atsam/usb/usb2422.h | 405 + tmk_core/protocol/arm_atsam/usb/usb_atmel.h | 190 + .../protocol/arm_atsam/usb/usb_device_udd.c | 1097 +++ tmk_core/protocol/arm_atsam/usb/usb_main.h | 97 + .../protocol/arm_atsam/usb/usb_protocol.h | 498 ++ .../protocol/arm_atsam/usb/usb_protocol_cdc.h | 193 + .../protocol/arm_atsam/usb/usb_protocol_hid.h | 319 + tmk_core/protocol/arm_atsam/usb/usb_util.c | 59 + tmk_core/protocol/arm_atsam/usb/usb_util.h | 10 + tmk_core/protocol/arm_atsam/wait_api.h | 8 + 194 files changed, 73324 insertions(+), 1 deletion(-) create mode 100644 keyboards/alt67/alt67.h create mode 100644 keyboards/alt67/config.h create mode 100644 keyboards/alt67/config_led.h create mode 100644 keyboards/alt67/keymaps/default/keymap.c create mode 100644 keyboards/alt67/led_programs.c create mode 100644 keyboards/alt67/matrix.c create mode 100644 keyboards/alt67/matrix.h create mode 100644 keyboards/alt67/readme.md create mode 100644 keyboards/alt67/rules.mk create mode 100644 keyboards/ctrl/config.h create mode 100644 keyboards/ctrl/config_led.h create mode 100644 keyboards/ctrl/ctrl.h create mode 100644 keyboards/ctrl/keymaps/default/keymap.c create mode 100644 keyboards/ctrl/led_programs.c create mode 100644 keyboards/ctrl/matrix.c create mode 100644 keyboards/ctrl/matrix.h create mode 100644 keyboards/ctrl/readme.md create mode 100644 keyboards/ctrl/rules.mk create mode 100644 lib/arm_atsam/packs/arm/cmsis/5.0.1/CMSIS/Include/arm_math.h create mode 100644 lib/arm_atsam/packs/arm/cmsis/5.0.1/CMSIS/Include/cmsis_compiler.h create mode 100644 lib/arm_atsam/packs/arm/cmsis/5.0.1/CMSIS/Include/cmsis_gcc.h create mode 100644 lib/arm_atsam/packs/arm/cmsis/5.0.1/CMSIS/Include/core_cm4.h create mode 100644 lib/arm_atsam/packs/arm/cmsis/5.0.1/LICENSE.txt create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/gcc/gcc/samd51j18a_flash.ld create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component-version.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/ac.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/adc.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/aes.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/can.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/ccl.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/cmcc.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/dac.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/dmac.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/dsu.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/eic.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/evsys.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/freqm.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/gclk.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/hmatrixb.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/i2s.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/icm.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/mclk.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/nvmctrl.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/osc32kctrl.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/oscctrl.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/pac.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/pcc.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/pdec.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/pm.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/port.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/qspi.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/ramecc.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/rstc.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/rtc.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/sdhc.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/sercom.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/supc.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/tal.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/tc.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/tcc.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/trng.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/usb.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/wdt.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/ac.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/adc0.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/adc1.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/aes.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/can0.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/can1.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/ccl.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/cmcc.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/dac.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/dmac.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/dsu.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/eic.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/evsys.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/freqm.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/gclk.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/hmatrix.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/i2s.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/icm.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/mclk.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/nvmctrl.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/osc32kctrl.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/oscctrl.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/pac.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/pcc.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/pdec.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/pm.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/port.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/pukcc.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/qspi.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/ramecc.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/rstc.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/rtc.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/sdhc0.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/sdhc1.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/sercom0.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/sercom1.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/sercom2.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/sercom3.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/sercom4.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/sercom5.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/sercom6.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/sercom7.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/supc.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/tal.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/tc0.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/tc1.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/tc2.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/tc3.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/tc4.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/tc5.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/tc6.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/tc7.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/tcc0.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/tcc1.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/tcc2.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/tcc3.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/tcc4.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/trng.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/usb.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/wdt.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/pio/samd51j18a.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/sam.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/samd51.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/samd51j18a.h create mode 100644 lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/system_samd51.h create mode 100644 tmk_core/arm_atsam.mk create mode 100644 tmk_core/common/arm_atsam/bootloader.c create mode 100644 tmk_core/common/arm_atsam/eeprom.c create mode 100644 tmk_core/common/arm_atsam/printf.h create mode 100644 tmk_core/common/arm_atsam/suspend.c create mode 100644 tmk_core/common/arm_atsam/timer.c create mode 100644 tmk_core/protocol/arm_atsam.mk create mode 100644 tmk_core/protocol/arm_atsam/adc.c create mode 100644 tmk_core/protocol/arm_atsam/adc.h create mode 100644 tmk_core/protocol/arm_atsam/arm_atsam_protocol.h create mode 100644 tmk_core/protocol/arm_atsam/clks.c create mode 100644 tmk_core/protocol/arm_atsam/clks.h create mode 100644 tmk_core/protocol/arm_atsam/d51_util.c create mode 100644 tmk_core/protocol/arm_atsam/d51_util.h create mode 100644 tmk_core/protocol/arm_atsam/i2c_master.c create mode 100644 tmk_core/protocol/arm_atsam/i2c_master.h create mode 100644 tmk_core/protocol/arm_atsam/issi3733_driver.h create mode 100644 tmk_core/protocol/arm_atsam/led_matrix.c create mode 100644 tmk_core/protocol/arm_atsam/led_matrix.h create mode 100644 tmk_core/protocol/arm_atsam/main_arm_atsam.c create mode 100644 tmk_core/protocol/arm_atsam/main_arm_atsam.h create mode 100644 tmk_core/protocol/arm_atsam/md_bootloader.h create mode 100644 tmk_core/protocol/arm_atsam/spi.c create mode 100644 tmk_core/protocol/arm_atsam/spi.h create mode 100644 tmk_core/protocol/arm_atsam/startup.c create mode 100644 tmk_core/protocol/arm_atsam/usb/compiler.h create mode 100644 tmk_core/protocol/arm_atsam/usb/conf_usb.h create mode 100644 tmk_core/protocol/arm_atsam/usb/main_usb.c create mode 100644 tmk_core/protocol/arm_atsam/usb/spfssf.c create mode 100644 tmk_core/protocol/arm_atsam/usb/spfssf.h create mode 100644 tmk_core/protocol/arm_atsam/usb/status_codes.h create mode 100644 tmk_core/protocol/arm_atsam/usb/udc.c create mode 100644 tmk_core/protocol/arm_atsam/usb/udc.h create mode 100644 tmk_core/protocol/arm_atsam/usb/udc_desc.h create mode 100644 tmk_core/protocol/arm_atsam/usb/udd.h create mode 100644 tmk_core/protocol/arm_atsam/usb/udi.h create mode 100644 tmk_core/protocol/arm_atsam/usb/udi_cdc.c create mode 100644 tmk_core/protocol/arm_atsam/usb/udi_cdc.h create mode 100644 tmk_core/protocol/arm_atsam/usb/udi_cdc_conf.h create mode 100644 tmk_core/protocol/arm_atsam/usb/udi_device_conf.h create mode 100644 tmk_core/protocol/arm_atsam/usb/udi_device_epsize.h create mode 100644 tmk_core/protocol/arm_atsam/usb/udi_hid.c create mode 100644 tmk_core/protocol/arm_atsam/usb/udi_hid.h create mode 100644 tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c create mode 100644 tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h create mode 100644 tmk_core/protocol/arm_atsam/usb/udi_hid_kbd_conf.h create mode 100644 tmk_core/protocol/arm_atsam/usb/udi_hid_kbd_desc.c create mode 100644 tmk_core/protocol/arm_atsam/usb/ui.c create mode 100644 tmk_core/protocol/arm_atsam/usb/ui.h create mode 100644 tmk_core/protocol/arm_atsam/usb/usb.c create mode 100644 tmk_core/protocol/arm_atsam/usb/usb.h create mode 100644 tmk_core/protocol/arm_atsam/usb/usb2422.c create mode 100644 tmk_core/protocol/arm_atsam/usb/usb2422.h create mode 100644 tmk_core/protocol/arm_atsam/usb/usb_atmel.h create mode 100644 tmk_core/protocol/arm_atsam/usb/usb_device_udd.c create mode 100644 tmk_core/protocol/arm_atsam/usb/usb_main.h create mode 100644 tmk_core/protocol/arm_atsam/usb/usb_protocol.h create mode 100644 tmk_core/protocol/arm_atsam/usb/usb_protocol_cdc.h create mode 100644 tmk_core/protocol/arm_atsam/usb/usb_protocol_hid.h create mode 100644 tmk_core/protocol/arm_atsam/usb/usb_util.c create mode 100644 tmk_core/protocol/arm_atsam/usb/usb_util.h create mode 100644 tmk_core/protocol/arm_atsam/wait_api.h diff --git a/build_keyboard.mk b/build_keyboard.mk index 9f6c42ea1..a73741bb3 100644 --- a/build_keyboard.mk +++ b/build_keyboard.mk @@ -144,6 +144,9 @@ endif ifdef MCU_FAMILY FIRMWARE_FORMAT?=bin PLATFORM=CHIBIOS +else ifdef ARM_ATSAM + PLATFORM=ARM_ATSAM + FIRMWARE_FORMAT=bin else PLATFORM=AVR FIRMWARE_FORMAT?=hex @@ -286,6 +289,11 @@ endif include $(TMK_PATH)/avr.mk endif +ifeq ($(PLATFORM),ARM_ATSAM) + include $(TMK_PATH)/arm_atsam.mk + include $(TMK_PATH)/protocol/arm_atsam.mk +endif + ifeq ($(PLATFORM),CHIBIOS) include $(TMK_PATH)/protocol/chibios.mk endif diff --git a/keyboards/alt67/alt67.h b/keyboards/alt67/alt67.h new file mode 100644 index 000000000..387985512 --- /dev/null +++ b/keyboards/alt67/alt67.h @@ -0,0 +1,24 @@ +#pragma once + +#include "quantum.h" +#include "config_led.h" +#include "matrix.h" + +#include "i2c_master.h" +#include "led_matrix.h" //For led keycodes +#include "usb/udi_cdc.h" +#include "usb/usb2422.h" + +#define LAYOUT( \ + K01, K02, K03, K04, K05, K06, K07, K08, K09, K10, K11, K12, K13, K14, K15, \ + K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K30, \ + K31, K32, K33, K34, K35, K36, K37, K38, K39, K40, K41, K42, K43, K44, K45, \ + K46, K47, K48, K49, K50, K51, K52, K53, K54, K55, K56, K57, K58, K59, K60, \ + K61, K62, K63, K64, K65, K66, K67 \ +) { \ + { K01, K02, K03, K04, K05, K06, K07, K08, K09, K10, K11, K12, K13, K14, K15, }, \ + { K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K30, }, \ + { K31, K32, K33, K34, K35, K36, K37, K38, K39, K40, K41, K42, KC_NO, K43, K44, }, \ + { K45, KC_NO, K46, K47, K48, K49, K50, K51, K52, K53, K54, K55, K56, K57, K58, }, \ + { K59, K60, K61, KC_NO, KC_NO, KC_NO, K62, KC_NO, KC_NO, KC_NO, K63, K64, K65, K66, K67, }, \ +} diff --git a/keyboards/alt67/config.h b/keyboards/alt67/config.h new file mode 100644 index 000000000..c67ae7d43 --- /dev/null +++ b/keyboards/alt67/config.h @@ -0,0 +1,79 @@ +/* +Copyright 2015 Jun Wako + +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 . +*/ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0x04D8 +#define PRODUCT_ID 0xEED3 +#define DEVICE_VER 0x0101 + +#define MANUFACTURER "Massdrop Inc." +#define PRODUCT "ALT67 Keyboard" +#define SERIAL_NUM "Unavailable" + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 15 + +#define PA 0 +#define PB 1 + +#define MATRIX_ROW_PORTS PA, PA, PA, PA, PA +#define MATRIX_ROW_PINS 0, 1, 2, 3, 4 + +#define MATRIX_COL_PORTS PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PA, PA, PA, PA, PA +#define MATRIX_COL_PINS 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 5, 6, 7, 10, 11 + +/* Print boot debug codes using debug LED when M28 and M30 shorted */ +#define DEBUG_BOOT_TRACING + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* 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 + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* Force boot in NKRO mode */ +//#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 diff --git a/keyboards/alt67/config_led.h b/keyboards/alt67/config_led.h new file mode 100644 index 000000000..a049e3817 --- /dev/null +++ b/keyboards/alt67/config_led.h @@ -0,0 +1,178 @@ +/* +Copyright 2018 Massdrop Inc. + +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 . +*/ + +#ifndef _config_led_h_ +#define _config_led_h_ + +//Define number of ISSI3733 drivers being used (1...16) +#define ISSI3733_DRIVER_COUNT 2 + +//Hardware address of each driver (Refer to ISSI3733 pdf "Table 1 Slave Address" and keyboard schematic) +#define ISSI3773_DRIVER_ADDRESSES { 0xA0, 0xBE } + +//LED I2C bus speed +#define I2C_HZ 580000 + +//Count of LED bodies +#define ISSI3733_LED_COUNT 105 + +//Default Global Current Register value (Default brightness 0 - 255) +#define ISSI3733_GCR_DEFAULT 128 + +#define LED_GCR_MAX 165 //Max GCR value (0 - 255) WARNING: Raising this value may overload the LED drivers and USB bus +#define LED_GCR_STEP 10 //GCR increment/decrement value + +//Automatic power rollback and recovery +#define V5_HIGH 2540 //5V high level (After low power detect, point at which LEDs are allowed to use more power ) +#define V5_LOW 2480 //5V low level (LED power rolled back to stay above this limit) +#define V5_CAT 2200 //5V catastrophic level (Host USB port potential to shut down) + +#define ANIMATION_SPEED_STEP 1 + +#define BREATHE_MIN_STEP 0 +#define BREATHE_MAX_STEP 255 + +//LED Mapping - More practically generated from a spreadsheet program +//id: ID of the LED (Sync with PCB callouts) +//x: Physical X coordinate of LED (units do not matter) +//y: Physical Y coordinate of LED (units do not matter) +//drv: 1-Based index of ISSI3773_DRIVER_ADDRESSES +//cs: Matrix wiring CS col (1-16) +//swr: Matrix wiring SW Red row (1-12) +//swg: Matrix wiring SW Green row (1-12) +//swb: Matrix wiring SW Blue row (1-12) +//scan: Associated key scancode if any +//Note: Origin 0,0 may be located anywhere as the software will do the final layout +#define ISSI3733_LED_MAP { \ + { .id = 1, .x = 0, .y = 0, .adr = { .drv = 2, .cs = 2, .swr = 2, .swg = 1, .swb = 3 }, .scan = 0 }, \ + { .id = 2, .x = 0.75, .y = 0, .adr = { .drv = 2, .cs = 3, .swr = 5, .swg = 4, .swb = 6 }, .scan = 1 }, \ + { .id = 3, .x = 1.5, .y = 0, .adr = { .drv = 2, .cs = 4, .swr = 5, .swg = 4, .swb = 6 }, .scan = 2 }, \ + { .id = 4, .x = 2.25, .y = 0, .adr = { .drv = 2, .cs = 5, .swr = 5, .swg = 4, .swb = 6 }, .scan = 3 }, \ + { .id = 5, .x = 3, .y = 0, .adr = { .drv = 2, .cs = 6, .swr = 5, .swg = 4, .swb = 6 }, .scan = 4 }, \ + { .id = 6, .x = 3.75, .y = 0, .adr = { .drv = 2, .cs = 7, .swr = 5, .swg = 4, .swb = 6 }, .scan = 5 }, \ + { .id = 7, .x = 4.5, .y = 0, .adr = { .drv = 2, .cs = 8, .swr = 5, .swg = 4, .swb = 6 }, .scan = 6 }, \ + { .id = 8, .x = 5.25, .y = 0, .adr = { .drv = 2, .cs = 13, .swr = 2, .swg = 1, .swb = 3 }, .scan = 7 }, \ + { .id = 9, .x = 6, .y = 0, .adr = { .drv = 1, .cs = 1, .swr = 5, .swg = 4, .swb = 6 }, .scan = 8 }, \ + { .id = 10, .x = 6.75, .y = 0, .adr = { .drv = 1, .cs = 2, .swr = 5, .swg = 4, .swb = 6 }, .scan = 9 }, \ + { .id = 11, .x = 7.5, .y = 0, .adr = { .drv = 1, .cs = 3, .swr = 5, .swg = 4, .swb = 6 }, .scan = 10 }, \ + { .id = 12, .x = 8.25, .y = 0, .adr = { .drv = 1, .cs = 4, .swr = 5, .swg = 4, .swb = 6 }, .scan = 11 }, \ + { .id = 13, .x = 9, .y = 0, .adr = { .drv = 1, .cs = 5, .swr = 5, .swg = 4, .swb = 6 }, .scan = 12 }, \ + { .id = 14, .x = 10.125, .y = 0, .adr = { .drv = 1, .cs = 6, .swr = 5, .swg = 4, .swb = 6 }, .scan = 13 }, \ + { .id = 15, .x = 11.25, .y = 0, .adr = { .drv = 1, .cs = 7, .swr = 2, .swg = 1, .swb = 3 }, .scan = 14 }, \ + { .id = 16, .x = 0.188, .y = -0.75, .adr = { .drv = 2, .cs = 2, .swr = 5, .swg = 4, .swb = 6 }, .scan = 15 }, \ + { .id = 17, .x = 1.125, .y = -0.75, .adr = { .drv = 2, .cs = 3, .swr = 8, .swg = 7, .swb = 9 }, .scan = 16 }, \ + { .id = 18, .x = 1.875, .y = -0.75, .adr = { .drv = 2, .cs = 4, .swr = 8, .swg = 7, .swb = 9 }, .scan = 17 }, \ + { .id = 19, .x = 2.625, .y = -0.75, .adr = { .drv = 2, .cs = 5, .swr = 8, .swg = 7, .swb = 9 }, .scan = 18 }, \ + { .id = 20, .x = 3.375, .y = -0.75, .adr = { .drv = 2, .cs = 6, .swr = 8, .swg = 7, .swb = 9 }, .scan = 19 }, \ + { .id = 21, .x = 4.125, .y = -0.75, .adr = { .drv = 2, .cs = 7, .swr = 8, .swg = 7, .swb = 9 }, .scan = 20 }, \ + { .id = 22, .x = 4.875, .y = -0.75, .adr = { .drv = 2, .cs = 8, .swr = 8, .swg = 7, .swb = 9 }, .scan = 21 }, \ + { .id = 23, .x = 5.625, .y = -0.75, .adr = { .drv = 1, .cs = 1, .swr = 8, .swg = 7, .swb = 9 }, .scan = 22 }, \ + { .id = 24, .x = 6.375, .y = -0.75, .adr = { .drv = 1, .cs = 2, .swr = 8, .swg = 7, .swb = 9 }, .scan = 23 }, \ + { .id = 25, .x = 7.125, .y = -0.75, .adr = { .drv = 1, .cs = 3, .swr = 8, .swg = 7, .swb = 9 }, .scan = 24 }, \ + { .id = 26, .x = 7.875, .y = -0.75, .adr = { .drv = 1, .cs = 4, .swr = 8, .swg = 7, .swb = 9 }, .scan = 25 }, \ + { .id = 27, .x = 8.625, .y = -0.75, .adr = { .drv = 1, .cs = 5, .swr = 8, .swg = 7, .swb = 9 }, .scan = 26 }, \ + { .id = 28, .x = 9.375, .y = -0.75, .adr = { .drv = 1, .cs = 11, .swr = 11, .swg = 10, .swb = 12 }, .scan = 27 }, \ + { .id = 29, .x = 10.313, .y = -0.75, .adr = { .drv = 1, .cs = 6, .swr = 8, .swg = 7, .swb = 9 }, .scan = 28 }, \ + { .id = 30, .x = 11.25, .y = -0.75, .adr = { .drv = 1, .cs = 7, .swr = 5, .swg = 4, .swb = 6 }, .scan = 29 }, \ + { .id = 31, .x = 0.281, .y = -1.5, .adr = { .drv = 2, .cs = 2, .swr = 8, .swg = 7, .swb = 9 }, .scan = 30 }, \ + { .id = 32, .x = 1.313, .y = -1.5, .adr = { .drv = 2, .cs = 3, .swr = 11, .swg = 10, .swb = 12 }, .scan = 31 }, \ + { .id = 33, .x = 2.063, .y = -1.5, .adr = { .drv = 2, .cs = 4, .swr = 11, .swg = 10, .swb = 12 }, .scan = 32 }, \ + { .id = 34, .x = 2.813, .y = -1.5, .adr = { .drv = 2, .cs = 5, .swr = 11, .swg = 10, .swb = 12 }, .scan = 33 }, \ + { .id = 35, .x = 3.563, .y = -1.5, .adr = { .drv = 2, .cs = 6, .swr = 11, .swg = 10, .swb = 12 }, .scan = 34 }, \ + { .id = 36, .x = 4.313, .y = -1.5, .adr = { .drv = 2, .cs = 7, .swr = 11, .swg = 10, .swb = 12 }, .scan = 35 }, \ + { .id = 37, .x = 5.063, .y = -1.5, .adr = { .drv = 2, .cs = 8, .swr = 11, .swg = 10, .swb = 12 }, .scan = 36 }, \ + { .id = 38, .x = 5.813, .y = -1.5, .adr = { .drv = 1, .cs = 1, .swr = 11, .swg = 10, .swb = 12 }, .scan = 37 }, \ + { .id = 39, .x = 6.563, .y = -1.5, .adr = { .drv = 1, .cs = 2, .swr = 11, .swg = 10, .swb = 12 }, .scan = 38 }, \ + { .id = 40, .x = 7.313, .y = -1.5, .adr = { .drv = 1, .cs = 3, .swr = 11, .swg = 10, .swb = 12 }, .scan = 39 }, \ + { .id = 41, .x = 8.063, .y = -1.5, .adr = { .drv = 1, .cs = 4, .swr = 11, .swg = 10, .swb = 12 }, .scan = 40 }, \ + { .id = 42, .x = 8.813, .y = -1.5, .adr = { .drv = 1, .cs = 5, .swr = 11, .swg = 10, .swb = 12 }, .scan = 41 }, \ + { .id = 43, .x = 10.031, .y = -1.5, .adr = { .drv = 1, .cs = 6, .swr = 11, .swg = 10, .swb = 12 }, .scan = 43 }, \ + { .id = 44, .x = 11.25, .y = -1.5, .adr = { .drv = 1, .cs = 7, .swr = 8, .swg = 7, .swb = 9 }, .scan = 44 }, \ + { .id = 45, .x = 0.469, .y = -2.25, .adr = { .drv = 2, .cs = 2, .swr = 11, .swg = 10, .swb = 12 }, .scan = 45 }, \ + { .id = 46, .x = 1.688, .y = -2.25, .adr = { .drv = 2, .cs = 9, .swr = 5, .swg = 4, .swb = 6 }, .scan = 47 }, \ + { .id = 47, .x = 2.438, .y = -2.25, .adr = { .drv = 2, .cs = 9, .swr = 2, .swg = 1, .swb = 3 }, .scan = 48 }, \ + { .id = 48, .x = 3.188, .y = -2.25, .adr = { .drv = 2, .cs = 9, .swr = 11, .swg = 10, .swb = 12 }, .scan = 49 }, \ + { .id = 49, .x = 3.938, .y = -2.25, .adr = { .drv = 2, .cs = 9, .swr = 8, .swg = 7, .swb = 9 }, .scan = 50 }, \ + { .id = 50, .x = 4.688, .y = -2.25, .adr = { .drv = 2, .cs = 12, .swr = 11, .swg = 10, .swb = 12 }, .scan = 51 }, \ + { .id = 51, .x = 5.438, .y = -2.25, .adr = { .drv = 2, .cs = 13, .swr = 11, .swg = 10, .swb = 12 }, .scan = 52 }, \ + { .id = 52, .x = 6.188, .y = -2.25, .adr = { .drv = 1, .cs = 9, .swr = 11, .swg = 10, .swb = 12 }, .scan = 53 }, \ + { .id = 53, .x = 6.938, .y = -2.25, .adr = { .drv = 1, .cs = 10, .swr = 11, .swg = 10, .swb = 12 }, .scan = 54 }, \ + { .id = 54, .x = 7.688, .y = -2.25, .adr = { .drv = 1, .cs = 10, .swr = 8, .swg = 7, .swb = 9 }, .scan = 55 }, \ + { .id = 55, .x = 8.438, .y = -2.25, .adr = { .drv = 1, .cs = 11, .swr = 8, .swg = 7, .swb = 9 }, .scan = 56 }, \ + { .id = 56, .x = 9.469, .y = -2.25, .adr = { .drv = 1, .cs = 11, .swr = 2, .swg = 1, .swb = 3 }, .scan = 57 }, \ + { .id = 57, .x = 10.5, .y = -2.25, .adr = { .drv = 1, .cs = 11, .swr = 5, .swg = 4, .swb = 6 }, .scan = 58 }, \ + { .id = 58, .x = 11.25, .y = -2.25, .adr = { .drv = 1, .cs = 7, .swr = 11, .swg = 10, .swb = 12 }, .scan = 59 }, \ + { .id = 59, .x = 0.094, .y = -3, .adr = { .drv = 2, .cs = 10, .swr = 8, .swg = 7, .swb = 9 }, .scan = 60 }, \ + { .id = 60, .x = 1.031, .y = -3, .adr = { .drv = 2, .cs = 10, .swr = 5, .swg = 4, .swb = 6 }, .scan = 61 }, \ + { .id = 61, .x = 1.969, .y = -3, .adr = { .drv = 2, .cs = 10, .swr = 2, .swg = 1, .swb = 3 }, .scan = 62 }, \ + { .id = 62, .x = 4.781, .y = -3, .adr = { .drv = 2, .cs = 12, .swr = 8, .swg = 7, .swb = 9 }, .scan = 66 }, \ + { .id = 63, .x = 7.594, .y = -3, .adr = { .drv = 1, .cs = 10, .swr = 5, .swg = 4, .swb = 6 }, .scan = 70 }, \ + { .id = 64, .x = 8.531, .y = -3, .adr = { .drv = 1, .cs = 10, .swr = 2, .swg = 1, .swb = 3 }, .scan = 71 }, \ + { .id = 65, .x = 9.75, .y = -3, .adr = { .drv = 1, .cs = 12, .swr = 2, .swg = 1, .swb = 3 }, .scan = 72 }, \ + { .id = 66, .x = 10.5, .y = -3, .adr = { .drv = 1, .cs = 12, .swr = 8, .swg = 7, .swb = 9 }, .scan = 73 }, \ + { .id = 67, .x = 11.25, .y = -3, .adr = { .drv = 1, .cs = 12, .swr = 5, .swg = 4, .swb = 6 }, .scan = 74 }, \ + { .id = 68, .x = -0.338, .y = -3.338, .adr = { .drv = 2, .cs = 11, .swr = 11, .swg = 10, .swb = 12 }, .scan = 255 }, \ + { .id = 69, .x = 0.39, .y = -3.443, .adr = { .drv = 2, .cs = 11, .swr = 8, .swg = 7, .swb = 9 }, .scan = 255 }, \ + { .id = 70, .x = 1.263, .y = -3.443, .adr = { .drv = 2, .cs = 11, .swr = 5, .swg = 4, .swb = 6 }, .scan = 255 }, \ + { .id = 71, .x = 2.135, .y = -3.443, .adr = { .drv = 2, .cs = 11, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 72, .x = 3.008, .y = -3.443, .adr = { .drv = 2, .cs = 12, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 73, .x = 3.88, .y = -3.443, .adr = { .drv = 2, .cs = 12, .swr = 5, .swg = 4, .swb = 6 }, .scan = 255 }, \ + { .id = 74, .x = 4.753, .y = -3.443, .adr = { .drv = 2, .cs = 13, .swr = 5, .swg = 4, .swb = 6 }, .scan = 255 }, \ + { .id = 75, .x = 5.625, .y = -3.443, .adr = { .drv = 2, .cs = 13, .swr = 8, .swg = 7, .swb = 9 }, .scan = 255 }, \ + { .id = 76, .x = 6.497, .y = -3.443, .adr = { .drv = 1, .cs = 9, .swr = 8, .swg = 7, .swb = 9 }, .scan = 255 }, \ + { .id = 77, .x = 7.37, .y = -3.443, .adr = { .drv = 1, .cs = 9, .swr = 5, .swg = 4, .swb = 6 }, .scan = 255 }, \ + { .id = 78, .x = 8.242, .y = -3.443, .adr = { .drv = 1, .cs = 9, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 79, .x = 9.115, .y = -3.443, .adr = { .drv = 1, .cs = 13, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 80, .x = 9.987, .y = -3.443, .adr = { .drv = 1, .cs = 13, .swr = 8, .swg = 7, .swb = 9 }, .scan = 255 }, \ + { .id = 81, .x = 10.86, .y = -3.443, .adr = { .drv = 1, .cs = 13, .swr = 5, .swg = 4, .swb = 6 }, .scan = 255 }, \ + { .id = 82, .x = 11.588, .y = -3.338, .adr = { .drv = 1, .cs = 13, .swr = 11, .swg = 10, .swb = 12 }, .scan = 255 }, \ + { .id = 83, .x = 11.693, .y = -2.623, .adr = { .drv = 1, .cs = 12, .swr = 11, .swg = 10, .swb = 12 }, .scan = 255 }, \ + { .id = 84, .x = 11.693, .y = -1.873, .adr = { .drv = 1, .cs = 8, .swr = 11, .swg = 10, .swb = 12 }, .scan = 255 }, \ + { .id = 85, .x = 11.693, .y = -1.123, .adr = { .drv = 1, .cs = 8, .swr = 8, .swg = 7, .swb = 9 }, .scan = 255 }, \ + { .id = 86, .x = 11.693, .y = -0.373, .adr = { .drv = 1, .cs = 8, .swr = 5, .swg = 4, .swb = 6 }, .scan = 255 }, \ + { .id = 87, .x = 11.588, .y = 0.338, .adr = { .drv = 1, .cs = 8, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 88, .x = 9.908, .y = 0.443, .adr = { .drv = 1, .cs = 6, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 89, .x = 9.288, .y = 0.443, .adr = { .drv = 1, .cs = 5, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 90, .x = 8.625, .y = 0.443, .adr = { .drv = 1, .cs = 4, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 91, .x = 7.875, .y = 0.443, .adr = { .drv = 1, .cs = 3, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 92, .x = 7.125, .y = 0.443, .adr = { .drv = 1, .cs = 2, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 93, .x = 6.375, .y = 0.443, .adr = { .drv = 1, .cs = 1, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 94, .x = 5.625, .y = 0.443, .adr = { .drv = 1, .cs = 14, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 95, .x = 4.875, .y = 0.443, .adr = { .drv = 2, .cs = 8, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 96, .x = 4.125, .y = 0.443, .adr = { .drv = 2, .cs = 7, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 97, .x = 3.375, .y = 0.443, .adr = { .drv = 2, .cs = 6, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 98, .x = 2.625, .y = 0.443, .adr = { .drv = 2, .cs = 5, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 99, .x = 1.875, .y = 0.443, .adr = { .drv = 2, .cs = 4, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 100, .x = 1.125, .y = 0.443, .adr = { .drv = 2, .cs = 3, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 101, .x = -0.338, .y = 0.338, .adr = { .drv = 2, .cs = 1, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 102, .x = -0.443, .y = -0.373, .adr = { .drv = 2, .cs = 1, .swr = 5, .swg = 4, .swb = 6 }, .scan = 255 }, \ + { .id = 103, .x = -0.443, .y = -1.123, .adr = { .drv = 2, .cs = 1, .swr = 8, .swg = 7, .swb = 9 }, .scan = 255 }, \ + { .id = 104, .x = -0.443, .y = -1.873, .adr = { .drv = 2, .cs = 1, .swr = 11, .swg = 10, .swb = 12 }, .scan = 255 }, \ + { .id = 105, .x = -0.443, .y = -2.623, .adr = { .drv = 2, .cs = 10, .swr = 11, .swg = 10, .swb = 12 }, .scan = 255 }, \ +}; + + +#define USB_LED_INDICATOR_ENABLE //Comment out to disable indicator functionality +#ifdef USB_LED_INDICATOR_ENABLE //Scan codes refer to actual key matrix codes, not KC_* (255 to disable) + #define USB_LED_NUM_LOCK_SCANCODE 255 + #define USB_LED_CAPS_LOCK_SCANCODE 30 + #define USB_LED_SCROLL_LOCK_SCANCODE 255 + #define USB_LED_COMPOSE_SCANCODE 255 + #define USB_LED_KANA_SCANCODE 255 +#endif //USB_LED_INDICATOR_ENABLE + +#endif //_config_led_h_ diff --git a/keyboards/alt67/keymaps/default/keymap.c b/keyboards/alt67/keymaps/default/keymap.c new file mode 100644 index 000000000..8b77da55a --- /dev/null +++ b/keyboards/alt67/keymaps/default/keymap.c @@ -0,0 +1,200 @@ +#include QMK_KEYBOARD_H + +enum alt67_keycodes { + L_BRI = SAFE_RANGE, //LED Brightness Increase + L_BRD, //LED Brightness Decrease + L_PTN, //LED Pattern Select Next + L_PTP, //LED Pattern Select Previous + L_PSI, //LED Pattern Speed Increase + L_PSD, //LED Pattern Speed Decrease + L_T_MD, //LED Toggle Mode + L_T_ONF, //LED Toggle On / Off + L_ON, //LED On + L_OFF, //LED Off + L_T_BR, //LED Toggle Breath Effect + L_T_PTD, //LED Toggle Scrolling Pattern Direction + U_T_AUTO, //USB Extra Port Toggle Auto Detect / Always Active + U_T_AGCR, //USB Toggle Automatic GCR control + DBG_TOG, //DEBUG Toggle On / Off + DBG_MTRX, //DEBUG Toggle Matrix Prints + DBG_KBD, //DEBUG Toggle Keyboard Prints + DBG_MOU, //DEBUG Toggle Mouse Prints +}; + +#define TG_NKRO MAGIC_TOGGLE_NKRO //Toggle 6KRO / NKRO mode + +keymap_config_t keymap_config; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_HOME, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT \ + ), + [1] = LAYOUT( + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_MUTE, \ + L_T_BR, L_PSD, L_BRI, L_PSI, KC_TRNS, KC_TRNS, KC_TRNS, U_T_AUTO,U_T_AGCR,KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, \ + L_T_PTD, L_PTP, L_BRD, L_PTN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, \ + KC_TRNS, L_T_MD, L_T_ONF, KC_TRNS, KC_TRNS, KC_TRNS, TG_NKRO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_VOLD, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGDN, KC_END \ + ), + /* + [X] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ + ), + */ +}; + +const uint16_t PROGMEM fn_actions[] = { + +}; + +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { +}; + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { +}; + +#define MODS_SHIFT (keyboard_report->mods & MOD_BIT(KC_LSHIFT) || keyboard_report->mods & MOD_BIT(KC_RSHIFT)) +#define MODS_CTRL (keyboard_report->mods & MOD_BIT(KC_LCTL) || keyboard_report->mods & MOD_BIT(KC_RCTRL)) +#define MODS_ALT (keyboard_report->mods & MOD_BIT(KC_LALT) || keyboard_report->mods & MOD_BIT(KC_RALT)) + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case L_BRI: + if (record->event.pressed) { + if (LED_GCR_STEP > LED_GCR_MAX - gcr_desired) gcr_desired = LED_GCR_MAX; + else gcr_desired += LED_GCR_STEP; + if (led_animation_breathing) gcr_breathe = gcr_desired; + } + return false; + case L_BRD: + if (record->event.pressed) { + if (LED_GCR_STEP > gcr_desired) gcr_desired = 0; + else gcr_desired -= LED_GCR_STEP; + if (led_animation_breathing) gcr_breathe = gcr_desired; + } + return false; + case L_PTN: + if (record->event.pressed) { + if (led_animation_id == led_setups_count - 1) led_animation_id = 0; + else led_animation_id++; + } + return false; + case L_PTP: + if (record->event.pressed) { + if (led_animation_id == 0) led_animation_id = led_setups_count - 1; + else led_animation_id--; + } + return false; + case L_PSI: + if (record->event.pressed) { + led_animation_speed += ANIMATION_SPEED_STEP; + } + return false; + case L_PSD: + if (record->event.pressed) { + led_animation_speed -= ANIMATION_SPEED_STEP; + if (led_animation_speed < 0) led_animation_speed = 0; + } + return false; + case L_T_MD: + if (record->event.pressed) { + led_lighting_mode++; + if (led_lighting_mode > LED_MODE_MAX_INDEX) led_lighting_mode = LED_MODE_NORMAL; + } + return false; + case L_T_ONF: + if (record->event.pressed) { + led_enabled = !led_enabled; + I2C3733_Control_Set(led_enabled); + } + return false; + case L_ON: + if (record->event.pressed) { + led_enabled = 1; + I2C3733_Control_Set(led_enabled); + } + return false; + case L_OFF: + if (record->event.pressed) { + led_enabled = 0; + I2C3733_Control_Set(led_enabled); + } + return false; + case L_T_BR: + if (record->event.pressed) { + led_animation_breathing = !led_animation_breathing; + if (led_animation_breathing) + { + gcr_breathe = gcr_desired; + led_animation_breathe_cur = BREATHE_MIN_STEP; + breathe_dir = 1; + } + } + return false; + case L_T_PTD: + if (record->event.pressed) { + led_animation_direction = !led_animation_direction; + } + return false; + case U_T_AUTO: + if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { + usb_extra_manual = !usb_extra_manual; + CDC_print("USB extra port manual mode "); + CDC_print(usb_extra_manual ? "enabled" : "disabled"); + CDC_print("\r\n"); + } + return false; + case U_T_AGCR: + if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { + usb_gcr_auto = !usb_gcr_auto; + CDC_print("USB GCR auto mode "); + CDC_print(usb_gcr_auto ? "enabled" : "disabled"); + CDC_print("\r\n"); + } + return false; + case DBG_TOG: + if (record->event.pressed) { + debug_enable = !debug_enable; + CDC_print("Debug mode "); + CDC_print(debug_enable ? "enabled" : "disabled"); + CDC_print("\r\n"); + } + return false; + case DBG_MTRX: + if (record->event.pressed) { + debug_matrix = !debug_matrix; + CDC_print("Debug matrix "); + CDC_print(debug_matrix ? "enabled" : "disabled"); + CDC_print("\r\n"); + } + return false; + case DBG_KBD: + if (record->event.pressed) { + debug_keyboard = !debug_keyboard; + CDC_print("Debug keyboard "); + CDC_print(debug_keyboard ? "enabled" : "disabled"); + CDC_print("\r\n"); + } + return false; + case DBG_MOU: + if (record->event.pressed) { + debug_mouse = !debug_mouse; + CDC_print("Debug mouse "); + CDC_print(debug_mouse ? "enabled" : "disabled"); + CDC_print("\r\n"); + } + return false; + default: + return true; //Process all other keycodes normally + } +} \ No newline at end of file diff --git a/keyboards/alt67/led_programs.c b/keyboards/alt67/led_programs.c new file mode 100644 index 000000000..a8aab28d9 --- /dev/null +++ b/keyboards/alt67/led_programs.c @@ -0,0 +1,120 @@ +/* +Copyright 2018 Massdrop Inc. + +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 . +*/ + +#include "alt67.h" +#include "led_matrix.h" + +//Teal <-> Salmon +led_setup_t leds_teal_salmon[] = { + { .hs = 0, .he = 33, .rs = 24, .re = 24, .gs = 215, .ge = 215, .bs = 204, .be = 204, .ef = EF_NONE }, + { .hs = 33, .he = 66, .rs = 24, .re = 255, .gs = 215, .ge = 114, .bs = 204, .be = 118, .ef = EF_NONE }, + { .hs = 66, .he = 100, .rs = 255, .re = 255, .gs = 114, .ge = 114, .bs = 118, .be = 118, .ef = EF_NONE }, + { .end = 1 }, +}; + +//Yellow +led_setup_t leds_yellow[] = { + { .hs = 0, .he = 100, .rs = 255, .re = 255, .gs = 255, .ge = 255, .bs = 0, .be = 0, .ef = EF_NONE }, + { .end = 1 }, +}; + +//Off +led_setup_t leds_off[] = { + { .hs = 0, .he = 100, .rs = 0, .re = 0, .gs = 0, .ge = 0, .bs = 0, .be = 0, .ef = EF_NONE }, + { .end = 1 }, +}; + +//Red +led_setup_t leds_red[] = { + { .hs = 0, .he = 100, .rs = 255, .re = 255, .gs = 0, .ge = 0, .bs = 0, .be = 0, .ef = EF_NONE }, + { .end = 1 }, +}; + +//Green +led_setup_t leds_green[] = { + { .hs = 0, .he = 100, .rs = 0, .re = 0, .gs = 255, .ge = 255, .bs = 0, .be = 0, .ef = EF_NONE }, + { .end = 1 }, +}; + +//Blue +led_setup_t leds_blue[] = { + { .hs = 0, .he = 100, .rs = 0, .re = 0, .gs = 0, .ge = 0, .bs = 255, .be = 255, .ef = EF_NONE }, + { .end = 1 }, +}; + +//White +led_setup_t leds_white[] = { + { .hs = 0, .he = 100, .rs = 255, .re = 255, .gs = 255, .ge = 255, .bs = 255, .be = 255, .ef = EF_NONE }, + { .end = 1 }, +}; + +//White with moving red stripe +led_setup_t leds_white_with_red_stripe[] = { + { .hs = 0, .he = 100, .rs = 255, .re = 255, .gs = 255, .ge = 255, .bs = 255, .be = 255, .ef = EF_NONE }, + { .hs = 0, .he = 15, .rs = 0, .re = 0, .gs = 0, .ge = 255, .bs = 0, .be = 255, .ef = EF_SCR_R | EF_SUBTRACT }, + { .hs = 15, .he = 30, .rs = 0, .re = 0, .gs = 255, .ge = 0, .bs = 255, .be = 0, .ef = EF_SCR_R | EF_SUBTRACT }, + { .end = 1 }, +}; + +//Black with moving red stripe +led_setup_t leds_black_with_red_stripe[] = { + { .hs = 0, .he = 15, .rs = 0, .re = 255, .gs = 0, .ge = 0, .bs = 0, .be = 0, .ef = EF_SCR_R }, + { .hs = 15, .he = 30, .rs = 255, .re = 0, .gs = 0, .ge = 0, .bs = 0, .be = 0, .ef = EF_SCR_R }, + { .end = 1 }, +}; + +//Rainbow no scrolling +led_setup_t leds_rainbow_ns[] = { + { .hs = 0, .he = 16.67, .rs = 255, .re = 255, .gs = 0, .ge = 255, .bs = 0, .be = 0, .ef = EF_OVER }, + { .hs = 16.67, .he = 33.33, .rs = 255, .re = 0, .gs = 255, .ge = 255, .bs = 0, .be = 0, .ef = EF_OVER }, + { .hs = 33.33, .he = 50, .rs = 0, .re = 0, .gs = 255, .ge = 255, .bs = 0, .be = 255, .ef = EF_OVER }, + { .hs = 50, .he = 66.67, .rs = 0, .re = 0, .gs = 255, .ge = 0, .bs = 255, .be = 255, .ef = EF_OVER }, + { .hs = 66.67, .he = 83.33, .rs = 0, .re = 255, .gs = 0, .ge = 0, .bs = 255, .be = 255, .ef = EF_OVER }, + { .hs = 83.33, .he = 100, .rs = 255, .re = 255, .gs = 0, .ge = 0, .bs = 255, .be = 0, .ef = EF_OVER }, + { .end = 1 }, +}; + +//Rainbow scrolling +led_setup_t leds_rainbow_s[] = { + { .hs = 0, .he = 16.67, .rs = 255, .re = 255, .gs = 0, .ge = 255, .bs = 0, .be = 0, .ef = EF_OVER | EF_SCR_R }, + { .hs = 16.67, .he = 33.33, .rs = 255, .re = 0, .gs = 255, .ge = 255, .bs = 0, .be = 0, .ef = EF_OVER | EF_SCR_R }, + { .hs = 33.33, .he = 50, .rs = 0, .re = 0, .gs = 255, .ge = 255, .bs = 0, .be = 255, .ef = EF_OVER | EF_SCR_R }, + { .hs = 50, .he = 66.67, .rs = 0, .re = 0, .gs = 255, .ge = 0, .bs = 255, .be = 255, .ef = EF_OVER | EF_SCR_R }, + { .hs = 66.67, .he = 83.33, .rs = 0, .re = 255, .gs = 0, .ge = 0, .bs = 255, .be = 255, .ef = EF_OVER | EF_SCR_R }, + { .hs = 83.33, .he = 100, .rs = 255, .re = 255, .gs = 0, .ge = 0, .bs = 255, .be = 0, .ef = EF_OVER | EF_SCR_R }, + { .end = 1 }, +}; + +//Add new LED animations here using one from above as example +//The last entry must be { .end = 1 } +//Add the new animation name to the list below following its format + +void *led_setups[] = { + leds_rainbow_s, + leds_rainbow_ns, + leds_teal_salmon, + leds_yellow, + leds_red, + leds_green, + leds_blue, + leds_white, + leds_white_with_red_stripe, + leds_black_with_red_stripe, + leds_off +}; + +const uint8_t led_setups_count = sizeof(led_setups) / sizeof(led_setups[0]); diff --git a/keyboards/alt67/matrix.c b/keyboards/alt67/matrix.c new file mode 100644 index 000000000..e107b4c22 --- /dev/null +++ b/keyboards/alt67/matrix.c @@ -0,0 +1,182 @@ +/* +Copyright 2018 Massdrop Inc. + +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 . +*/ + +#include "alt67.h" + +#include "d51_util.h" +#include "debug.h" +#include "clks.h" +#include + +matrix_row_t mlatest[MATRIX_ROWS]; +matrix_row_t mlast[MATRIX_ROWS]; +matrix_row_t mdebounced[MATRIX_ROWS]; + +uint8_t row_ports[] = { MATRIX_ROW_PORTS }; +uint8_t row_pins[] = { MATRIX_ROW_PINS }; +uint8_t col_ports[] = { MATRIX_COL_PORTS }; +uint8_t col_pins[] = { MATRIX_COL_PINS }; +uint32_t row_masks[2]; //NOTE: If more than PA PB used in the future, adjust code to accomodate + +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + +void matrix_init(void) +{ + memset(mlatest, 0, MATRIX_ROWS * sizeof(matrix_row_t)); + memset(mlast, 0, MATRIX_ROWS * sizeof(matrix_row_t)); + memset(mdebounced, 0, MATRIX_ROWS * sizeof(matrix_row_t)); + + row_masks[PA] = 0; + row_masks[PB] = 0; + + uint8_t row; + for (row = 0; row < MATRIX_ROWS; row++) + { + PORT->Group[row_ports[row]].DIRCLR.reg = 1 << row_pins[row]; //Input + PORT->Group[row_ports[row]].OUTCLR.reg = 1 << row_pins[row]; //Low + PORT->Group[row_ports[row]].PINCFG[row_pins[row]].bit.INEN = 1; //Input Enable, + PORT->Group[row_ports[row]].PINCFG[row_pins[row]].bit.PULLEN = 1; //Pull Enable + row_masks[row_ports[row]] |= 1 << row_pins[row]; //Add pin to proper row mask + } + + uint8_t col; + for (col = 0; col < MATRIX_COLS; col++) + { + PORT->Group[col_ports[col]].DIRSET.reg = 1 << col_pins[col]; //Output + PORT->Group[col_ports[col]].OUTCLR.reg = 1 << col_pins[col]; //Low + } + + matrix_init_quantum(); +} + +#define MATRIX_SCAN_DELAY 10 //Delay after setting a col to output (in us) + +uint64_t mdebouncing = 0; +uint8_t matrix_scan(void) +{ + uint8_t mchanged; + uint8_t row; + uint8_t col; + uint32_t scans[2]; //PA PB + + if (CLK_get_ms() < mdebouncing) return 1; //mdebouncing == 0 when no debouncing active + + //m15_off; //Profiling scans + + memset(mlatest, 0, MATRIX_ROWS * sizeof(matrix_row_t)); //Zero the result buffer + + for (col = 0; col < MATRIX_COLS; col++) + { + PORT->Group[col_ports[col]].OUTSET.reg = 1 << col_pins[col]; //Set col output + + CLK_delay_us(MATRIX_SCAN_DELAY); //Delay for output + + scans[PA] = PORT->Group[PA].IN.reg & row_masks[PA]; //Read PA row pins data + scans[PB] = PORT->Group[PB].IN.reg & row_masks[PB]; //Read PB row pins data + + PORT->Group[col_ports[col]].OUTCLR.reg = 1 << col_pins[col]; //Clear col output + + for (row = 0; row < MATRIX_ROWS; row++) + { + //Move scan bits from scans array into proper row bit locations + if (scans[row_ports[row]] & (1 << row_pins[row])) + mlatest[row] |= 1 << col; + } + } + + mchanged = 0; //Default to no matrix change since last + + for (row = 0; row < MATRIX_ROWS; row++) + { + if (mlast[row] != mlatest[row]) + mchanged = 1; + mlast[row] = mlatest[row]; + } + + if (!mchanged) + { + for (row = 0; row < MATRIX_ROWS; row++) + mdebounced[row] = mlatest[row]; + mdebouncing = 0; + } + else + { + //Begin or extend debounce on change + mdebouncing = CLK_get_ms() + DEBOUNCING_DELAY; + } + + //m15_on; //Profiling scans + + matrix_scan_quantum(); + + return 1; +} + +matrix_row_t matrix_get_row(uint8_t row) +{ + return mdebounced[row]; +} + +void matrix_print(void) +{ + char buf[(MATRIX_COLS+8)*(MATRIX_ROWS+1)] = "R C"; + char *pbuf = buf+3; + uint32_t cols; + uint32_t rows; + matrix_row_t row; + + for (cols = 1; cols <= MATRIX_COLS; cols++) + { + *pbuf = (cols%10)+48; + pbuf++; + } + *pbuf = '\r'; pbuf++; + *pbuf = '\n'; pbuf++; + + for (rows = 1; rows <= MATRIX_ROWS; rows++) + { + row = matrix_get_row(rows-1); + if (rows < 10) { *pbuf = rows+48; pbuf++; *pbuf = ' '; pbuf++; *pbuf = ' '; pbuf++; } + else { *pbuf = (rows/10)+48; pbuf++; *pbuf = (rows%10)+48; pbuf++; *pbuf = ' '; pbuf++; } + for (cols = 0; cols < MATRIX_COLS; cols++) + { + if (row & 1 << cols) *pbuf = 'X'; + else *pbuf = '.'; + pbuf++; + } + *pbuf = '\r'; pbuf++; + *pbuf = '\n'; pbuf++; + } + *pbuf = 0; + dprint(buf); +} diff --git a/keyboards/alt67/matrix.h b/keyboards/alt67/matrix.h new file mode 100644 index 000000000..3eab6dece --- /dev/null +++ b/keyboards/alt67/matrix.h @@ -0,0 +1,77 @@ +/* +Copyright 2011 Jun Wako + +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 . +*/ +#ifndef MATRIX_H +#define MATRIX_H + +#include +#include +#include "keyboard.h" + +#if (MATRIX_COLS <= 8) +typedef uint8_t matrix_row_t; +#elif (MATRIX_COLS <= 16) +typedef uint16_t matrix_row_t; +#elif (MATRIX_COLS <= 32) +typedef uint32_t matrix_row_t; +#else +#error "MATRIX_COLS: invalid value" +#endif + +#define MATRIX_IS_ON(row, col) (matrix_get_row(row) && (1< + +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 . +*/ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0x04D8 +#define PRODUCT_ID 0xEED2 +#define DEVICE_VER 0x0101 + +#define MANUFACTURER "Massdrop Inc." +#define PRODUCT "CTRL Keyboard" +#define SERIAL_NUM "Unavailable" + +/* key matrix size */ +#define MATRIX_ROWS 11 +#define MATRIX_COLS 8 + +#define PA 0 +#define PB 1 + +#define MATRIX_ROW_PORTS PB, PB, PB, PB, PB, PB, PA, PA, PB, PB, PB +#define MATRIX_ROW_PINS 4, 5, 6, 7, 8, 9, 10, 11, 10, 11, 12 + +#define MATRIX_COL_PORTS PA, PA, PA, PA, PA, PA, PA, PA +#define MATRIX_COL_PINS 0, 1, 2, 3, 4, 5, 6, 7 + +/* Print boot debug codes using debug LED when M28 and M30 shorted */ +#define DEBUG_BOOT_TRACING + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* 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 + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* Force boot in NKRO mode */ +//#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 diff --git a/keyboards/ctrl/config_led.h b/keyboards/ctrl/config_led.h new file mode 100644 index 000000000..65563daa3 --- /dev/null +++ b/keyboards/ctrl/config_led.h @@ -0,0 +1,191 @@ +/* +Copyright 2018 Massdrop Inc. + +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 . +*/ + +#ifndef _config_led_h_ +#define _config_led_h_ + +//Define number of ISSI3733 drivers being used (1...16) +#define ISSI3733_DRIVER_COUNT 2 + +//Hardware address of each driver (Refer to ISSI3733 pdf "Table 1 Slave Address" and keyboard schematic) +#define ISSI3773_DRIVER_ADDRESSES { 0xA0, 0xBE } + +//LED I2C bus speed +#define I2C_HZ 580000 + +//Count of LED bodies +#define ISSI3733_LED_COUNT 119 + +//Default Global Current Register value (Default brightness 0 - 255) +#define ISSI3733_GCR_DEFAULT 128 + +#define LED_GCR_MAX 165 //Max GCR value (0 - 255) WARNING: Raising this value may overload the LED drivers and USB bus +#define LED_GCR_STEP 10 //GCR increment/decrement value + +//Automatic power rollback and recovery +#define V5_HIGH 2540 //5V high level (After low power detect, point at which LEDs are allowed to use more power ) +#define V5_LOW 2480 //5V low level (LED power rolled back to stay above this limit) +#define V5_CAT 2200 //5V catastrophic level (Host USB port potential to shut down) + +#define ANIMATION_SPEED_STEP 1 + +#define BREATHE_MIN_STEP 0 +#define BREATHE_MAX_STEP 255 + +//LED Mapping - More practically generated from a spreadsheet program +//id: ID of the LED (Sync with PCB callouts) +//x: Physical X coordinate of LED (units do not matter) +//y: Physical Y coordinate of LED (units do not matter) +//drv: 1-Based index of ISSI3773_DRIVER_ADDRESSES +//cs: Matrix wiring CS col (1-16) +//swr: Matrix wiring SW Red row (1-12) +//swg: Matrix wiring SW Green row (1-12) +//swb: Matrix wiring SW Blue row (1-12) +//scan: Associated key scancode if any +//Note: Origin 0,0 may be located anywhere as the software will do the final layout +#define ISSI3733_LED_MAP { \ + { .id = 1, .x = 0, .y = 0, .adr = { .drv = 2, .cs = 2, .swr = 2, .swg = 1, .swb = 3 }, .scan = 0 }, \ + { .id = 2, .x = 1.5, .y = 0, .adr = { .drv = 2, .cs = 3, .swr = 5, .swg = 4, .swb = 6 }, .scan = 1 }, \ + { .id = 3, .x = 2.25, .y = 0, .adr = { .drv = 2, .cs = 4, .swr = 5, .swg = 4, .swb = 6 }, .scan = 2 }, \ + { .id = 4, .x = 3, .y = 0, .adr = { .drv = 2, .cs = 5, .swr = 5, .swg = 4, .swb = 6 }, .scan = 3 }, \ + { .id = 5, .x = 3.75, .y = 0, .adr = { .drv = 2, .cs = 6, .swr = 2, .swg = 1, .swb = 3 }, .scan = 4 }, \ + { .id = 6, .x = 4.875, .y = 0, .adr = { .drv = 2, .cs = 7, .swr = 5, .swg = 4, .swb = 6 }, .scan = 5 }, \ + { .id = 7, .x = 5.625, .y = 0, .adr = { .drv = 2, .cs = 8, .swr = 5, .swg = 4, .swb = 6 }, .scan = 6 }, \ + { .id = 8, .x = 6.375, .y = 0, .adr = { .drv = 1, .cs = 1, .swr = 5, .swg = 4, .swb = 6 }, .scan = 7 }, \ + { .id = 9, .x = 7.125, .y = 0, .adr = { .drv = 1, .cs = 2, .swr = 5, .swg = 4, .swb = 6 }, .scan = 90 }, \ + { .id = 10, .x = 8.25, .y = 0, .adr = { .drv = 1, .cs = 3, .swr = 5, .swg = 4, .swb = 6 }, .scan = 91 }, \ + { .id = 11, .x = 9, .y = 0, .adr = { .drv = 1, .cs = 4, .swr = 5, .swg = 4, .swb = 6 }, .scan = 92 }, \ + { .id = 12, .x = 9.75, .y = 0, .adr = { .drv = 1, .cs = 5, .swr = 5, .swg = 4, .swb = 6 }, .scan = 93 }, \ + { .id = 13, .x = 10.5, .y = 0, .adr = { .drv = 1, .cs = 6, .swr = 5, .swg = 4, .swb = 6 }, .scan = 94 }, \ + { .id = 14, .x = 11.625, .y = 0, .adr = { .drv = 1, .cs = 7, .swr = 5, .swg = 4, .swb = 6 }, .scan = 95 }, \ + { .id = 15, .x = 12.375, .y = 0, .adr = { .drv = 1, .cs = 8, .swr = 5, .swg = 4, .swb = 6 }, .scan = 96 }, \ + { .id = 16, .x = 13.125, .y = 0, .adr = { .drv = 1, .cs = 9, .swr = 5, .swg = 4, .swb = 6 }, .scan = 97 }, \ + { .id = 17, .x = 0, .y = -1.125, .adr = { .drv = 2, .cs = 1, .swr = 8, .swg = 7, .swb = 9 }, .scan = 15 }, \ + { .id = 18, .x = 0.75, .y = -1.125, .adr = { .drv = 2, .cs = 2, .swr = 8, .swg = 7, .swb = 9 }, .scan = 16 }, \ + { .id = 19, .x = 1.5, .y = -1.125, .adr = { .drv = 2, .cs = 3, .swr = 8, .swg = 7, .swb = 9 }, .scan = 17 }, \ + { .id = 20, .x = 2.25, .y = -1.125, .adr = { .drv = 2, .cs = 4, .swr = 8, .swg = 7, .swb = 9 }, .scan = 18 }, \ + { .id = 21, .x = 3, .y = -1.125, .adr = { .drv = 2, .cs = 5, .swr = 8, .swg = 7, .swb = 9 }, .scan = 19 }, \ + { .id = 22, .x = 3.75, .y = -1.125, .adr = { .drv = 2, .cs = 6, .swr = 8, .swg = 7, .swb = 9 }, .scan = 20 }, \ + { .id = 23, .x = 4.5, .y = -1.125, .adr = { .drv = 2, .cs = 7, .swr = 8, .swg = 7, .swb = 9 }, .scan = 21 }, \ + { .id = 24, .x = 5.25, .y = -1.125, .adr = { .drv = 2, .cs = 8, .swr = 8, .swg = 7, .swb = 9 }, .scan = 22 }, \ + { .id = 25, .x = 6, .y = -1.125, .adr = { .drv = 1, .cs = 1, .swr = 8, .swg = 7, .swb = 9 }, .scan = 105 }, \ + { .id = 26, .x = 6.75, .y = -1.125, .adr = { .drv = 1, .cs = 2, .swr = 8, .swg = 7, .swb = 9 }, .scan = 106 }, \ + { .id = 27, .x = 7.5, .y = -1.125, .adr = { .drv = 1, .cs = 3, .swr = 8, .swg = 7, .swb = 9 }, .scan = 107 }, \ + { .id = 28, .x = 8.25, .y = -1.125, .adr = { .drv = 1, .cs = 4, .swr = 8, .swg = 7, .swb = 9 }, .scan = 108 }, \ + { .id = 29, .x = 9, .y = -1.125, .adr = { .drv = 1, .cs = 5, .swr = 8, .swg = 7, .swb = 9 }, .scan = 109 }, \ + { .id = 30, .x = 10.125, .y = -1.125, .adr = { .drv = 1, .cs = 6, .swr = 8, .swg = 7, .swb = 9 }, .scan = 110 }, \ + { .id = 31, .x = 11.625, .y = -1.125, .adr = { .drv = 1, .cs = 7, .swr = 8, .swg = 7, .swb = 9 }, .scan = 111 }, \ + { .id = 32, .x = 12.375, .y = -1.125, .adr = { .drv = 1, .cs = 8, .swr = 8, .swg = 7, .swb = 9 }, .scan = 112 }, \ + { .id = 33, .x = 13.125, .y = -1.125, .adr = { .drv = 1, .cs = 9, .swr = 8, .swg = 7, .swb = 9 }, .scan = 142 }, \ + { .id = 34, .x = 0.188, .y = -1.875, .adr = { .drv = 2, .cs = 1, .swr = 11, .swg = 10, .swb = 12 }, .scan = 30 }, \ + { .id = 35, .x = 1.125, .y = -1.875, .adr = { .drv = 2, .cs = 2, .swr = 11, .swg = 10, .swb = 12 }, .scan = 31 }, \ + { .id = 36, .x = 1.875, .y = -1.875, .adr = { .drv = 2, .cs = 3, .swr = 11, .swg = 10, .swb = 12 }, .scan = 32 }, \ + { .id = 37, .x = 2.625, .y = -1.875, .adr = { .drv = 2, .cs = 4, .swr = 11, .swg = 10, .swb = 12 }, .scan = 33 }, \ + { .id = 38, .x = 3.375, .y = -1.875, .adr = { .drv = 2, .cs = 5, .swr = 11, .swg = 10, .swb = 12 }, .scan = 34 }, \ + { .id = 39, .x = 4.125, .y = -1.875, .adr = { .drv = 2, .cs = 6, .swr = 11, .swg = 10, .swb = 12 }, .scan = 35 }, \ + { .id = 40, .x = 4.875, .y = -1.875, .adr = { .drv = 2, .cs = 7, .swr = 11, .swg = 10, .swb = 12 }, .scan = 36 }, \ + { .id = 41, .x = 5.625, .y = -1.875, .adr = { .drv = 2, .cs = 8, .swr = 11, .swg = 10, .swb = 12 }, .scan = 37 }, \ + { .id = 42, .x = 6.375, .y = -1.875, .adr = { .drv = 1, .cs = 1, .swr = 11, .swg = 10, .swb = 12 }, .scan = 120 }, \ + { .id = 43, .x = 7.125, .y = -1.875, .adr = { .drv = 1, .cs = 2, .swr = 11, .swg = 10, .swb = 12 }, .scan = 121 }, \ + { .id = 44, .x = 7.875, .y = -1.875, .adr = { .drv = 1, .cs = 3, .swr = 11, .swg = 10, .swb = 12 }, .scan = 122 }, \ + { .id = 45, .x = 8.625, .y = -1.875, .adr = { .drv = 1, .cs = 4, .swr = 11, .swg = 10, .swb = 12 }, .scan = 123 }, \ + { .id = 46, .x = 9.375, .y = -1.875, .adr = { .drv = 1, .cs = 5, .swr = 11, .swg = 10, .swb = 12 }, .scan = 124 }, \ + { .id = 47, .x = 10.312, .y = -1.875, .adr = { .drv = 1, .cs = 6, .swr = 11, .swg = 10, .swb = 12 }, .scan = 125 }, \ + { .id = 48, .x = 11.625, .y = -1.875, .adr = { .drv = 1, .cs = 7, .swr = 11, .swg = 10, .swb = 12 }, .scan = 126 }, \ + { .id = 49, .x = 12.375, .y = -1.875, .adr = { .drv = 1, .cs = 8, .swr = 11, .swg = 10, .swb = 12 }, .scan = 127 }, \ + { .id = 50, .x = 13.125, .y = -1.875, .adr = { .drv = 1, .cs = 9, .swr = 11, .swg = 10, .swb = 12 }, .scan = 141 }, \ + { .id = 51, .x = 0.281, .y = -2.625, .adr = { .drv = 2, .cs = 1, .swr = 5, .swg = 4, .swb = 6 }, .scan = 45 }, \ + { .id = 52, .x = 1.313, .y = -2.625, .adr = { .drv = 2, .cs = 2, .swr = 5, .swg = 4, .swb = 6 }, .scan = 46 }, \ + { .id = 53, .x = 2.063, .y = -2.625, .adr = { .drv = 2, .cs = 13, .swr = 11, .swg = 10, .swb = 12 }, .scan = 47 }, \ + { .id = 54, .x = 2.812, .y = -2.625, .adr = { .drv = 2, .cs = 12, .swr = 11, .swg = 10, .swb = 12 }, .scan = 48 }, \ + { .id = 55, .x = 3.562, .y = -2.625, .adr = { .drv = 2, .cs = 11, .swr = 11, .swg = 10, .swb = 12 }, .scan = 49 }, \ + { .id = 56, .x = 4.312, .y = -2.625, .adr = { .drv = 2, .cs = 6, .swr = 5, .swg = 4, .swb = 6 }, .scan = 50 }, \ + { .id = 57, .x = 5.062, .y = -2.625, .adr = { .drv = 2, .cs = 10, .swr = 11, .swg = 10, .swb = 12 }, .scan = 51 }, \ + { .id = 58, .x = 5.812, .y = -2.625, .adr = { .drv = 2, .cs = 9, .swr = 11, .swg = 10, .swb = 12 }, .scan = 52 }, \ + { .id = 59, .x = 6.562, .y = -2.625, .adr = { .drv = 1, .cs = 16, .swr = 11, .swg = 10, .swb = 12 }, .scan = 135 }, \ + { .id = 60, .x = 7.312, .y = -2.625, .adr = { .drv = 1, .cs = 15, .swr = 11, .swg = 10, .swb = 12 }, .scan = 136 }, \ + { .id = 61, .x = 8.062, .y = -2.625, .adr = { .drv = 1, .cs = 14, .swr = 11, .swg = 10, .swb = 12 }, .scan = 137 }, \ + { .id = 62, .x = 8.812, .y = -2.625, .adr = { .drv = 1, .cs = 13, .swr = 11, .swg = 10, .swb = 12 }, .scan = 138 }, \ + { .id = 63, .x = 10.031, .y = -2.625, .adr = { .drv = 1, .cs = 12, .swr = 11, .swg = 10, .swb = 12 }, .scan = 139 }, \ + { .id = 64, .x = 0.469, .y = -3.375, .adr = { .drv = 2, .cs = 14, .swr = 5, .swg = 4, .swb = 6 }, .scan = 60 }, \ + { .id = 65, .x = 1.688, .y = -3.375, .adr = { .drv = 2, .cs = 13, .swr = 5, .swg = 4, .swb = 6 }, .scan = 61 }, \ + { .id = 66, .x = 2.438, .y = -3.375, .adr = { .drv = 2, .cs = 12, .swr = 8, .swg = 7, .swb = 9 }, .scan = 62 }, \ + { .id = 67, .x = 3.188, .y = -3.375, .adr = { .drv = 2, .cs = 12, .swr = 5, .swg = 4, .swb = 6 }, .scan = 63 }, \ + { .id = 68, .x = 3.938, .y = -3.375, .adr = { .drv = 2, .cs = 11, .swr = 5, .swg = 4, .swb = 6 }, .scan = 64 }, \ + { .id = 69, .x = 4.688, .y = -3.375, .adr = { .drv = 2, .cs = 10, .swr = 5, .swg = 4, .swb = 6 }, .scan = 65 }, \ + { .id = 70, .x = 5.438, .y = -3.375, .adr = { .drv = 2, .cs = 9, .swr = 5, .swg = 4, .swb = 6 }, .scan = 66 }, \ + { .id = 71, .x = 6.188, .y = -3.375, .adr = { .drv = 2, .cs = 9, .swr = 8, .swg = 7, .swb = 9 }, .scan = 67 }, \ + { .id = 72, .x = 6.938, .y = -3.375, .adr = { .drv = 1, .cs = 16, .swr = 8, .swg = 7, .swb = 9 }, .scan = 150 }, \ + { .id = 73, .x = 7.688, .y = -3.375, .adr = { .drv = 1, .cs = 15, .swr = 8, .swg = 7, .swb = 9 }, .scan = 151 }, \ + { .id = 74, .x = 8.438, .y = -3.375, .adr = { .drv = 1, .cs = 14, .swr = 8, .swg = 7, .swb = 9 }, .scan = 152 }, \ + { .id = 75, .x = 9.844, .y = -3.375, .adr = { .drv = 1, .cs = 13, .swr = 8, .swg = 7, .swb = 9 }, .scan = 153 }, \ + { .id = 76, .x = 12.375, .y = -3.375, .adr = { .drv = 1, .cs = 11, .swr = 8, .swg = 7, .swb = 9 }, .scan = 140 }, \ + { .id = 77, .x = 0.094, .y = -4.125, .adr = { .drv = 2, .cs = 14, .swr = 11, .swg = 10, .swb = 12 }, .scan = 75 }, \ + { .id = 78, .x = 1.031, .y = -4.125, .adr = { .drv = 2, .cs = 14, .swr = 8, .swg = 7, .swb = 9 }, .scan = 76 }, \ + { .id = 79, .x = 1.969, .y = -4.125, .adr = { .drv = 2, .cs = 13, .swr = 8, .swg = 7, .swb = 9 }, .scan = 77 }, \ + { .id = 80, .x = 4.781, .y = -4.125, .adr = { .drv = 2, .cs = 10, .swr = 8, .swg = 7, .swb = 9 }, .scan = 78 }, \ + { .id = 81, .x = 7.594, .y = -4.125, .adr = { .drv = 1, .cs = 16, .swr = 5, .swg = 4, .swb = 6 }, .scan = 79 }, \ + { .id = 82, .x = 8.531, .y = -4.125, .adr = { .drv = 1, .cs = 15, .swr = 5, .swg = 4, .swb = 6 }, .scan = 80 }, \ + { .id = 83, .x = 9.469, .y = -4.125, .adr = { .drv = 1, .cs = 14, .swr = 5, .swg = 4, .swb = 6 }, .scan = 81 }, \ + { .id = 84, .x = 10.406, .y = -4.125, .adr = { .drv = 1, .cs = 13, .swr = 5, .swg = 4, .swb = 6 }, .scan = 82 }, \ + { .id = 85, .x = 11.625, .y = -4.125, .adr = { .drv = 1, .cs = 12, .swr = 8, .swg = 7, .swb = 9 }, .scan = 154 }, \ + { .id = 86, .x = 12.375, .y = -4.125, .adr = { .drv = 1, .cs = 12, .swr = 5, .swg = 4, .swb = 6 }, .scan = 155 }, \ + { .id = 87, .x = 13.125, .y = -4.125, .adr = { .drv = 1, .cs = 11, .swr = 5, .swg = 4, .swb = 6 }, .scan = 156 }, \ + { .id = 88, .x = 13.433, .y = -4.43, .adr = { .drv = 1, .cs = 11, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 89, .x = 12.285, .y = -4.535, .adr = { .drv = 1, .cs = 12, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 90, .x = 11.14, .y = -4.535, .adr = { .drv = 1, .cs = 13, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 91, .x = 9.995, .y = -4.535, .adr = { .drv = 1, .cs = 14, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 92, .x = 8.85, .y = -4.535, .adr = { .drv = 1, .cs = 15, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 93, .x = 7.705, .y = -4.535, .adr = { .drv = 1, .cs = 16, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 94, .x = 6.56, .y = -4.535, .adr = { .drv = 2, .cs = 9, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 95, .x = 5.415, .y = -4.535, .adr = { .drv = 2, .cs = 10, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 96, .x = 4.27, .y = -4.535, .adr = { .drv = 2, .cs = 11, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 97, .x = 3.125, .y = -4.535, .adr = { .drv = 2, .cs = 12, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 98, .x = 1.98, .y = -4.535, .adr = { .drv = 2, .cs = 13, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 99, .x = 0.835, .y = -4.535, .adr = { .drv = 2, .cs = 14, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 100, .x = -0.307, .y = -4.43, .adr = { .drv = 2, .cs = 15, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 101, .x = -0.41, .y = -3.245, .adr = { .drv = 2, .cs = 15, .swr = 11, .swg = 10, .swb = 12 }, .scan = 255 }, \ + { .id = 102, .x = -0.41, .y = -2.06, .adr = { .drv = 2, .cs = 15, .swr = 5, .swg = 4, .swb = 6 }, .scan = 255 }, \ + { .id = 103, .x = -0.41, .y = -0.875, .adr = { .drv = 2, .cs = 15, .swr = 8, .swg = 7, .swb = 9 }, .scan = 255 }, \ + { .id = 104, .x = -0.308, .y = 0.31, .adr = { .drv = 2, .cs = 1, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 105, .x = 0.835, .y = 0.415, .adr = { .drv = 2, .cs = 3, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 106, .x = 1.98, .y = 0.415, .adr = { .drv = 2, .cs = 4, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 107, .x = 3.125, .y = 0.415, .adr = { .drv = 2, .cs = 5, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 108, .x = 4.27, .y = 0.415, .adr = { .drv = 2, .cs = 7, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 109, .x = 5.415, .y = 0.415, .adr = { .drv = 2, .cs = 8, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 110, .x = 6.56, .y = 0.415, .adr = { .drv = 1, .cs = 1, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 111, .x = 7.705, .y = 0.415, .adr = { .drv = 1, .cs = 2, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 112, .x = 8.85, .y = 0.415, .adr = { .drv = 1, .cs = 3, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 113, .x = 9.995, .y = 0.415, .adr = { .drv = 1, .cs = 5, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 114, .x = 11.14, .y = 0.415, .adr = { .drv = 1, .cs = 6, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 115, .x = 12.285, .y = 0.415, .adr = { .drv = 1, .cs = 8, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 116, .x = 13.432, .y = 0.31, .adr = { .drv = 1, .cs = 10, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ + { .id = 117, .x = 13.535, .y = -0.875, .adr = { .drv = 1, .cs = 10, .swr = 8, .swg = 7, .swb = 9 }, .scan = 255 }, \ + { .id = 118, .x = 13.535, .y = -2.06, .adr = { .drv = 1, .cs = 10, .swr = 11, .swg = 10, .swb = 12 }, .scan = 255 }, \ + { .id = 119, .x = 13.535, .y = -3.245, .adr = { .drv = 1, .cs = 10, .swr = 5, .swg = 4, .swb = 6 }, .scan = 255 }, \ +}; + +#define USB_LED_INDICATOR_ENABLE //Comment out to disable indicator functionality +#ifdef USB_LED_INDICATOR_ENABLE //Scan codes refer to actual key matrix codes, not KC_* (255 to disable) + #define USB_LED_NUM_LOCK_SCANCODE 255 + #define USB_LED_CAPS_LOCK_SCANCODE 45 + #define USB_LED_SCROLL_LOCK_SCANCODE 96 + #define USB_LED_COMPOSE_SCANCODE 255 + #define USB_LED_KANA_SCANCODE 255 +#endif //USB_LED_INDICATOR_ENABLE + +#endif //_config_led_h_ diff --git a/keyboards/ctrl/ctrl.h b/keyboards/ctrl/ctrl.h new file mode 100644 index 000000000..dc7c7eabe --- /dev/null +++ b/keyboards/ctrl/ctrl.h @@ -0,0 +1,32 @@ +#pragma once + +#include "quantum.h" +#include "config_led.h" +#include "matrix.h" + +#include "i2c_master.h" +#include "led_matrix.h" //For led keycodes +#include "usb/udi_cdc.h" +#include "usb/usb2422.h" + +#define LAYOUT( \ + K01, K02, K03, K04, K05, K06, K07, K08, K09, K10, K11, K12, K13, K14, K15, \ + K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K30, \ + K31, K32, K33, K34, K35, K36, K37, K38, K39, K40, K41, K42, K43, K44, K45, \ + K46, K47, K48, K49, K50, K51, K52, K53, K54, K55, K56, K57, K58, K59, K60, \ + K61, K62, K63, K64, K65, K66, K67, K68, K69, K70, K71, K72, K73, K74, K75, \ + K76, K77, K78, K79, K80, K81, K82, K83, K84, K85, K86, K87 \ + \ +) { \ + { K01, K02, K03, K04, K05, K06, K07, K08 }, \ + { K17, K18, K19, K20, K21, K22, K23, K24 }, \ + { K34, K35, K36, K37, K38, K39, K40, K41 }, \ + { K51, K52, K53, K54, K55, K56, K57, K58 }, \ + { K64, K65, K66, K67, K68, K69, K70, K71 }, \ + { K77, K78, K79, K80, K81, K82, K83, K84 }, \ + { K09, K10, K11, K12, K13, K14, K15, K16 }, \ + { K25, K26, K27, K28, K29, K30, K31, K32 }, \ + { K42, K43, K44, K45, K46, K47, K48, K49 }, \ + { K59, K60, K61, K62, K63, K76, K50, K33 }, \ + { K72, K73, K74, K75, K85, K86, K87, }, \ +} diff --git a/keyboards/ctrl/keymaps/default/keymap.c b/keyboards/ctrl/keymaps/default/keymap.c new file mode 100644 index 000000000..8e84d4fee --- /dev/null +++ b/keyboards/ctrl/keymaps/default/keymap.c @@ -0,0 +1,203 @@ +#include QMK_KEYBOARD_H + +enum alt67_keycodes { + L_BRI = SAFE_RANGE, //LED Brightness Increase + L_BRD, //LED Brightness Decrease + L_PTN, //LED Pattern Select Next + L_PTP, //LED Pattern Select Previous + L_PSI, //LED Pattern Speed Increase + L_PSD, //LED Pattern Speed Decrease + L_T_MD, //LED Toggle Mode + L_T_ONF, //LED Toggle On / Off + L_ON, //LED On + L_OFF, //LED Off + L_T_BR, //LED Toggle Breath Effect + L_T_PTD, //LED Toggle Scrolling Pattern Direction + U_T_AUTO, //USB Extra Port Toggle Auto Detect / Always Active + U_T_AGCR, //USB Toggle Automatic GCR control + DBG_TOG, //DEBUG Toggle On / Off + DBG_MTRX, //DEBUG Toggle Matrix Prints + DBG_KBD, //DEBUG Toggle Keyboard Prints + DBG_MOU, //DEBUG Toggle Mouse Prints +}; + +#define TG_NKRO MAGIC_TOGGLE_NKRO //Toggle 6KRO / NKRO mode + +keymap_config_t keymap_config; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT \ + ), + [1] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_MSTP, KC_VOLU, \ + L_T_BR, L_PSD, L_BRI, L_PSI, KC_TRNS, KC_TRNS, KC_TRNS, U_T_AUTO,U_T_AGCR,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_VOLD, \ + L_T_PTD, L_PTP, L_BRD, L_PTN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, L_T_MD, L_T_ONF, KC_TRNS, KC_TRNS, KC_TRNS, TG_NKRO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ + ), + /* + [X] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, TG_NKRO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ + ), + */ +}; + +const uint16_t PROGMEM fn_actions[] = { + +}; + +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { +}; + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { +}; + +#define MODS_SHIFT (keyboard_report->mods & MOD_BIT(KC_LSHIFT) || keyboard_report->mods & MOD_BIT(KC_RSHIFT)) +#define MODS_CTRL (keyboard_report->mods & MOD_BIT(KC_LCTL) || keyboard_report->mods & MOD_BIT(KC_RCTRL)) +#define MODS_ALT (keyboard_report->mods & MOD_BIT(KC_LALT) || keyboard_report->mods & MOD_BIT(KC_RALT)) + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case L_BRI: + if (record->event.pressed) { + if (LED_GCR_STEP > LED_GCR_MAX - gcr_desired) gcr_desired = LED_GCR_MAX; + else gcr_desired += LED_GCR_STEP; + if (led_animation_breathing) gcr_breathe = gcr_desired; + } + return false; + case L_BRD: + if (record->event.pressed) { + if (LED_GCR_STEP > gcr_desired) gcr_desired = 0; + else gcr_desired -= LED_GCR_STEP; + if (led_animation_breathing) gcr_breathe = gcr_desired; + } + return false; + case L_PTN: + if (record->event.pressed) { + if (led_animation_id == led_setups_count - 1) led_animation_id = 0; + else led_animation_id++; + } + return false; + case L_PTP: + if (record->event.pressed) { + if (led_animation_id == 0) led_animation_id = led_setups_count - 1; + else led_animation_id--; + } + return false; + case L_PSI: + if (record->event.pressed) { + led_animation_speed += ANIMATION_SPEED_STEP; + } + return false; + case L_PSD: + if (record->event.pressed) { + led_animation_speed -= ANIMATION_SPEED_STEP; + if (led_animation_speed < 0) led_animation_speed = 0; + } + return false; + case L_T_MD: + if (record->event.pressed) { + led_lighting_mode++; + if (led_lighting_mode > LED_MODE_MAX_INDEX) led_lighting_mode = LED_MODE_NORMAL; + } + return false; + case L_T_ONF: + if (record->event.pressed) { + led_enabled = !led_enabled; + I2C3733_Control_Set(led_enabled); + } + return false; + case L_ON: + if (record->event.pressed) { + led_enabled = 1; + I2C3733_Control_Set(led_enabled); + } + return false; + case L_OFF: + if (record->event.pressed) { + led_enabled = 0; + I2C3733_Control_Set(led_enabled); + } + return false; + case L_T_BR: + if (record->event.pressed) { + led_animation_breathing = !led_animation_breathing; + if (led_animation_breathing) + { + gcr_breathe = gcr_desired; + led_animation_breathe_cur = BREATHE_MIN_STEP; + breathe_dir = 1; + } + } + return false; + case L_T_PTD: + if (record->event.pressed) { + led_animation_direction = !led_animation_direction; + } + return false; + case U_T_AUTO: + if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { + usb_extra_manual = !usb_extra_manual; + CDC_print("USB extra port manual mode "); + CDC_print(usb_extra_manual ? "enabled" : "disabled"); + CDC_print("\r\n"); + } + return false; + case U_T_AGCR: + if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { + usb_gcr_auto = !usb_gcr_auto; + CDC_print("USB GCR auto mode "); + CDC_print(usb_gcr_auto ? "enabled" : "disabled"); + CDC_print("\r\n"); + } + return false; + case DBG_TOG: + if (record->event.pressed) { + debug_enable = !debug_enable; + CDC_print("Debug mode "); + CDC_print(debug_enable ? "enabled" : "disabled"); + CDC_print("\r\n"); + } + return false; + case DBG_MTRX: + if (record->event.pressed) { + debug_matrix = !debug_matrix; + CDC_print("Debug matrix "); + CDC_print(debug_matrix ? "enabled" : "disabled"); + CDC_print("\r\n"); + } + return false; + case DBG_KBD: + if (record->event.pressed) { + debug_keyboard = !debug_keyboard; + CDC_print("Debug keyboard "); + CDC_print(debug_keyboard ? "enabled" : "disabled"); + CDC_print("\r\n"); + } + return false; + case DBG_MOU: + if (record->event.pressed) { + debug_mouse = !debug_mouse; + CDC_print("Debug mouse "); + CDC_print(debug_mouse ? "enabled" : "disabled"); + CDC_print("\r\n"); + } + return false; + default: + return true; //Process all other keycodes normally + } +} \ No newline at end of file diff --git a/keyboards/ctrl/led_programs.c b/keyboards/ctrl/led_programs.c new file mode 100644 index 000000000..ca2701645 --- /dev/null +++ b/keyboards/ctrl/led_programs.c @@ -0,0 +1,120 @@ +/* +Copyright 2018 Massdrop Inc. + +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 . +*/ + +#include "ctrl.h" +#include "led_matrix.h" + +//Teal <-> Salmon +led_setup_t leds_teal_salmon[] = { + { .hs = 0, .he = 33, .rs = 24, .re = 24, .gs = 215, .ge = 215, .bs = 204, .be = 204, .ef = EF_NONE }, + { .hs = 33, .he = 66, .rs = 24, .re = 255, .gs = 215, .ge = 114, .bs = 204, .be = 118, .ef = EF_NONE }, + { .hs = 66, .he = 100, .rs = 255, .re = 255, .gs = 114, .ge = 114, .bs = 118, .be = 118, .ef = EF_NONE }, + { .end = 1 }, +}; + +//Yellow +led_setup_t leds_yellow[] = { + { .hs = 0, .he = 100, .rs = 255, .re = 255, .gs = 255, .ge = 255, .bs = 0, .be = 0, .ef = EF_NONE }, + { .end = 1 }, +}; + +//Off +led_setup_t leds_off[] = { + { .hs = 0, .he = 100, .rs = 0, .re = 0, .gs = 0, .ge = 0, .bs = 0, .be = 0, .ef = EF_NONE }, + { .end = 1 }, +}; + +//Red +led_setup_t leds_red[] = { + { .hs = 0, .he = 100, .rs = 255, .re = 255, .gs = 0, .ge = 0, .bs = 0, .be = 0, .ef = EF_NONE }, + { .end = 1 }, +}; + +//Green +led_setup_t leds_green[] = { + { .hs = 0, .he = 100, .rs = 0, .re = 0, .gs = 255, .ge = 255, .bs = 0, .be = 0, .ef = EF_NONE }, + { .end = 1 }, +}; + +//Blue +led_setup_t leds_blue[] = { + { .hs = 0, .he = 100, .rs = 0, .re = 0, .gs = 0, .ge = 0, .bs = 255, .be = 255, .ef = EF_NONE }, + { .end = 1 }, +}; + +//White +led_setup_t leds_white[] = { + { .hs = 0, .he = 100, .rs = 255, .re = 255, .gs = 255, .ge = 255, .bs = 255, .be = 255, .ef = EF_NONE }, + { .end = 1 }, +}; + +//White with moving red stripe +led_setup_t leds_white_with_red_stripe[] = { + { .hs = 0, .he = 100, .rs = 255, .re = 255, .gs = 255, .ge = 255, .bs = 255, .be = 255, .ef = EF_NONE }, + { .hs = 0, .he = 15, .rs = 0, .re = 0, .gs = 0, .ge = 255, .bs = 0, .be = 255, .ef = EF_SCR_R | EF_SUBTRACT }, + { .hs = 15, .he = 30, .rs = 0, .re = 0, .gs = 255, .ge = 0, .bs = 255, .be = 0, .ef = EF_SCR_R | EF_SUBTRACT }, + { .end = 1 }, +}; + +//Black with moving red stripe +led_setup_t leds_black_with_red_stripe[] = { + { .hs = 0, .he = 15, .rs = 0, .re = 255, .gs = 0, .ge = 0, .bs = 0, .be = 0, .ef = EF_SCR_R }, + { .hs = 15, .he = 30, .rs = 255, .re = 0, .gs = 0, .ge = 0, .bs = 0, .be = 0, .ef = EF_SCR_R }, + { .end = 1 }, +}; + +//Rainbow no scrolling +led_setup_t leds_rainbow_ns[] = { + { .hs = 0, .he = 16.67, .rs = 255, .re = 255, .gs = 0, .ge = 255, .bs = 0, .be = 0, .ef = EF_OVER }, + { .hs = 16.67, .he = 33.33, .rs = 255, .re = 0, .gs = 255, .ge = 255, .bs = 0, .be = 0, .ef = EF_OVER }, + { .hs = 33.33, .he = 50, .rs = 0, .re = 0, .gs = 255, .ge = 255, .bs = 0, .be = 255, .ef = EF_OVER }, + { .hs = 50, .he = 66.67, .rs = 0, .re = 0, .gs = 255, .ge = 0, .bs = 255, .be = 255, .ef = EF_OVER }, + { .hs = 66.67, .he = 83.33, .rs = 0, .re = 255, .gs = 0, .ge = 0, .bs = 255, .be = 255, .ef = EF_OVER }, + { .hs = 83.33, .he = 100, .rs = 255, .re = 255, .gs = 0, .ge = 0, .bs = 255, .be = 0, .ef = EF_OVER }, + { .end = 1 }, +}; + +//Rainbow scrolling +led_setup_t leds_rainbow_s[] = { + { .hs = 0, .he = 16.67, .rs = 255, .re = 255, .gs = 0, .ge = 255, .bs = 0, .be = 0, .ef = EF_OVER | EF_SCR_R }, + { .hs = 16.67, .he = 33.33, .rs = 255, .re = 0, .gs = 255, .ge = 255, .bs = 0, .be = 0, .ef = EF_OVER | EF_SCR_R }, + { .hs = 33.33, .he = 50, .rs = 0, .re = 0, .gs = 255, .ge = 255, .bs = 0, .be = 255, .ef = EF_OVER | EF_SCR_R }, + { .hs = 50, .he = 66.67, .rs = 0, .re = 0, .gs = 255, .ge = 0, .bs = 255, .be = 255, .ef = EF_OVER | EF_SCR_R }, + { .hs = 66.67, .he = 83.33, .rs = 0, .re = 255, .gs = 0, .ge = 0, .bs = 255, .be = 255, .ef = EF_OVER | EF_SCR_R }, + { .hs = 83.33, .he = 100, .rs = 255, .re = 255, .gs = 0, .ge = 0, .bs = 255, .be = 0, .ef = EF_OVER | EF_SCR_R }, + { .end = 1 }, +}; + +//Add new LED animations here using one from above as example +//The last entry must be { .end = 1 } +//Add the new animation name to the list below following its format + +void *led_setups[] = { + leds_rainbow_s, + leds_rainbow_ns, + leds_teal_salmon, + leds_yellow, + leds_red, + leds_green, + leds_blue, + leds_white, + leds_white_with_red_stripe, + leds_black_with_red_stripe, + leds_off +}; + +const uint8_t led_setups_count = sizeof(led_setups) / sizeof(led_setups[0]); diff --git a/keyboards/ctrl/matrix.c b/keyboards/ctrl/matrix.c new file mode 100644 index 000000000..6f306962e --- /dev/null +++ b/keyboards/ctrl/matrix.c @@ -0,0 +1,182 @@ +/* +Copyright 2018 Massdrop Inc. + +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 . +*/ + +#include "ctrl.h" + +#include "d51_util.h" +#include "debug.h" +#include "clks.h" +#include + +matrix_row_t mlatest[MATRIX_ROWS]; +matrix_row_t mlast[MATRIX_ROWS]; +matrix_row_t mdebounced[MATRIX_ROWS]; + +uint8_t row_ports[] = { MATRIX_ROW_PORTS }; +uint8_t row_pins[] = { MATRIX_ROW_PINS }; +uint8_t col_ports[] = { MATRIX_COL_PORTS }; +uint8_t col_pins[] = { MATRIX_COL_PINS }; +uint32_t row_masks[2]; //NOTE: If more than PA PB used in the future, adjust code to accomodate + +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + +void matrix_init(void) +{ + memset(mlatest, 0, MATRIX_ROWS * sizeof(matrix_row_t)); + memset(mlast, 0, MATRIX_ROWS * sizeof(matrix_row_t)); + memset(mdebounced, 0, MATRIX_ROWS * sizeof(matrix_row_t)); + + row_masks[PA] = 0; + row_masks[PB] = 0; + + uint8_t row; + for (row = 0; row < MATRIX_ROWS; row++) + { + PORT->Group[row_ports[row]].DIRCLR.reg = 1 << row_pins[row]; //Input + PORT->Group[row_ports[row]].OUTCLR.reg = 1 << row_pins[row]; //Low + PORT->Group[row_ports[row]].PINCFG[row_pins[row]].bit.INEN = 1; //Input Enable, + PORT->Group[row_ports[row]].PINCFG[row_pins[row]].bit.PULLEN = 1; //Pull Enable + row_masks[row_ports[row]] |= 1 << row_pins[row]; //Add pin to proper row mask + } + + uint8_t col; + for (col = 0; col < MATRIX_COLS; col++) + { + PORT->Group[col_ports[col]].DIRSET.reg = 1 << col_pins[col]; //Output + PORT->Group[col_ports[col]].OUTCLR.reg = 1 << col_pins[col]; //Low + } + + matrix_init_quantum(); +} + +#define MATRIX_SCAN_DELAY 10 //Delay after setting a col to output (in us) + +uint64_t mdebouncing = 0; +uint8_t matrix_scan(void) +{ + uint8_t mchanged; + uint8_t row; + uint8_t col; + uint32_t scans[2]; //PA PB + + if (CLK_get_ms() < mdebouncing) return 1; //mdebouncing == 0 when no debouncing active + + //m15_off; //Profiling scans + + memset(mlatest, 0, MATRIX_ROWS * sizeof(matrix_row_t)); //Zero the result buffer + + for (col = 0; col < MATRIX_COLS; col++) + { + PORT->Group[col_ports[col]].OUTSET.reg = 1 << col_pins[col]; //Set col output + + CLK_delay_us(MATRIX_SCAN_DELAY); //Delay for output + + scans[PA] = PORT->Group[PA].IN.reg & row_masks[PA]; //Read PA row pins data + scans[PB] = PORT->Group[PB].IN.reg & row_masks[PB]; //Read PB row pins data + + PORT->Group[col_ports[col]].OUTCLR.reg = 1 << col_pins[col]; //Clear col output + + for (row = 0; row < MATRIX_ROWS; row++) + { + //Move scan bits from scans array into proper row bit locations + if (scans[row_ports[row]] & (1 << row_pins[row])) + mlatest[row] |= 1 << col; + } + } + + mchanged = 0; //Default to no matrix change since last + + for (row = 0; row < MATRIX_ROWS; row++) + { + if (mlast[row] != mlatest[row]) + mchanged = 1; + mlast[row] = mlatest[row]; + } + + if (!mchanged) + { + for (row = 0; row < MATRIX_ROWS; row++) + mdebounced[row] = mlatest[row]; + mdebouncing = 0; + } + else + { + //Begin or extend debounce on change + mdebouncing = CLK_get_ms() + DEBOUNCING_DELAY; + } + + //m15_on; //Profiling scans + + matrix_scan_quantum(); + + return 1; +} + +matrix_row_t matrix_get_row(uint8_t row) +{ + return mdebounced[row]; +} + +void matrix_print(void) +{ + char buf[(MATRIX_COLS+8)*(MATRIX_ROWS+1)] = "R C"; + char *pbuf = buf+3; + uint32_t cols; + uint32_t rows; + matrix_row_t row; + + for (cols = 1; cols <= MATRIX_COLS; cols++) + { + *pbuf = (cols%10)+48; + pbuf++; + } + *pbuf = '\r'; pbuf++; + *pbuf = '\n'; pbuf++; + + for (rows = 1; rows <= MATRIX_ROWS; rows++) + { + row = matrix_get_row(rows-1); + if (rows < 10) { *pbuf = rows+48; pbuf++; *pbuf = ' '; pbuf++; *pbuf = ' '; pbuf++; } + else { *pbuf = (rows/10)+48; pbuf++; *pbuf = (rows%10)+48; pbuf++; *pbuf = ' '; pbuf++; } + for (cols = 0; cols < MATRIX_COLS; cols++) + { + if (row & 1 << cols) *pbuf = 'X'; + else *pbuf = '.'; + pbuf++; + } + *pbuf = '\r'; pbuf++; + *pbuf = '\n'; pbuf++; + } + *pbuf = 0; + dprint(buf); +} diff --git a/keyboards/ctrl/matrix.h b/keyboards/ctrl/matrix.h new file mode 100644 index 000000000..3eab6dece --- /dev/null +++ b/keyboards/ctrl/matrix.h @@ -0,0 +1,77 @@ +/* +Copyright 2011 Jun Wako + +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 . +*/ +#ifndef MATRIX_H +#define MATRIX_H + +#include +#include +#include "keyboard.h" + +#if (MATRIX_COLS <= 8) +typedef uint8_t matrix_row_t; +#elif (MATRIX_COLS <= 16) +typedef uint16_t matrix_row_t; +#elif (MATRIX_COLS <= 32) +typedef uint32_t matrix_row_t; +#else +#error "MATRIX_COLS: invalid value" +#endif + +#define MATRIX_IS_ON(row, col) (matrix_get_row(row) && (1<Lib folder. + * - arm_cortexM7lfdp_math.lib (Cortex-M7, Little endian, Double Precision Floating Point Unit) + * - arm_cortexM7bfdp_math.lib (Cortex-M7, Big endian, Double Precision Floating Point Unit) + * - arm_cortexM7lfsp_math.lib (Cortex-M7, Little endian, Single Precision Floating Point Unit) + * - arm_cortexM7bfsp_math.lib (Cortex-M7, Big endian and Single Precision Floating Point Unit on) + * - arm_cortexM7l_math.lib (Cortex-M7, Little endian) + * - arm_cortexM7b_math.lib (Cortex-M7, Big endian) + * - arm_cortexM4lf_math.lib (Cortex-M4, Little endian, Floating Point Unit) + * - arm_cortexM4bf_math.lib (Cortex-M4, Big endian, Floating Point Unit) + * - arm_cortexM4l_math.lib (Cortex-M4, Little endian) + * - arm_cortexM4b_math.lib (Cortex-M4, Big endian) + * - arm_cortexM3l_math.lib (Cortex-M3, Little endian) + * - arm_cortexM3b_math.lib (Cortex-M3, Big endian) + * - arm_cortexM0l_math.lib (Cortex-M0 / Cortex-M0+, Little endian) + * - arm_cortexM0b_math.lib (Cortex-M0 / Cortex-M0+, Big endian) + * - arm_ARMv8MBLl_math.lib (ARMv8M Baseline, Little endian) + * - arm_ARMv8MMLl_math.lib (ARMv8M Mainline, Little endian) + * - arm_ARMv8MMLlfsp_math.lib (ARMv8M Mainline, Little endian, Single Precision Floating Point Unit) + * - arm_ARMv8MMLld_math.lib (ARMv8M Mainline, Little endian, DSP instructions) + * - arm_ARMv8MMLldfsp_math.lib (ARMv8M Mainline, Little endian, DSP instructions, Single Precision Floating Point Unit) + * + * The library functions are declared in the public file arm_math.h which is placed in the Include folder. + * Simply include this file and link the appropriate library in the application and begin calling the library functions. The Library supports single + * public header file arm_math.h for Cortex-M cores with little endian and big endian. Same header file will be used for floating point unit(FPU) variants. + * Define the appropriate pre processor MACRO ARM_MATH_CM7 or ARM_MATH_CM4 or ARM_MATH_CM3 or + * ARM_MATH_CM0 or ARM_MATH_CM0PLUS depending on the target processor in the application. + * For ARMv8M cores define pre processor MACRO ARM_MATH_ARMV8MBL or ARM_MATH_ARMV8MML. + * Set Pre processor MACRO __DSP_PRESENT if ARMv8M Mainline core supports DSP instructions. + * + * + * Examples + * -------- + * + * The library ships with a number of examples which demonstrate how to use the library functions. + * + * Toolchain Support + * ------------ + * + * The library has been developed and tested with MDK-ARM version 5.14.0.0 + * The library is being tested in GCC and IAR toolchains and updates on this activity will be made available shortly. + * + * Building the Library + * ------------ + * + * The library installer contains a project file to re build libraries on MDK-ARM Tool chain in the CMSIS\\DSP_Lib\\Source\\ARM folder. + * - arm_cortexM_math.uvprojx + * + * + * The libraries can be built by opening the arm_cortexM_math.uvprojx project in MDK-ARM, selecting a specific target, and defining the optional pre processor MACROs detailed above. + * + * Pre-processor Macros + * ------------ + * + * Each library project have differant pre-processor macros. + * + * - UNALIGNED_SUPPORT_DISABLE: + * + * Define macro UNALIGNED_SUPPORT_DISABLE, If the silicon does not support unaligned memory access + * + * - ARM_MATH_BIG_ENDIAN: + * + * Define macro ARM_MATH_BIG_ENDIAN to build the library for big endian targets. By default library builds for little endian targets. + * + * - ARM_MATH_MATRIX_CHECK: + * + * Define macro ARM_MATH_MATRIX_CHECK for checking on the input and output sizes of matrices + * + * - ARM_MATH_ROUNDING: + * + * Define macro ARM_MATH_ROUNDING for rounding on support functions + * + * - ARM_MATH_CMx: + * + * Define macro ARM_MATH_CM4 for building the library on Cortex-M4 target, ARM_MATH_CM3 for building library on Cortex-M3 target + * and ARM_MATH_CM0 for building library on Cortex-M0 target, ARM_MATH_CM0PLUS for building library on Cortex-M0+ target, and + * ARM_MATH_CM7 for building the library on cortex-M7. + * + * - ARM_MATH_ARMV8MxL: + * + * Define macro ARM_MATH_ARMV8MBL for building the library on ARMv8M Baseline target, ARM_MATH_ARMV8MBL for building library + * on ARMv8M Mainline target. + * + * - __FPU_PRESENT: + * + * Initialize macro __FPU_PRESENT = 1 when building on FPU supported Targets. Enable this macro for floating point libraries. + * + * - __DSP_PRESENT: + * + * Initialize macro __DSP_PRESENT = 1 when ARMv8M Mainline core supports DSP instructions. + * + *
+ * CMSIS-DSP in ARM::CMSIS Pack + * ----------------------------- + * + * The following files relevant to CMSIS-DSP are present in the ARM::CMSIS Pack directories: + * |File/Folder |Content | + * |------------------------------|------------------------------------------------------------------------| + * |\b CMSIS\\Documentation\\DSP | This documentation | + * |\b CMSIS\\DSP_Lib | Software license agreement (license.txt) | + * |\b CMSIS\\DSP_Lib\\Examples | Example projects demonstrating the usage of the library functions | + * |\b CMSIS\\DSP_Lib\\Source | Source files for rebuilding the library | + * + *
+ * Revision History of CMSIS-DSP + * ------------ + * Please refer to \ref ChangeLog_pg. + * + * Copyright Notice + * ------------ + * + * Copyright (C) 2010-2015 ARM Limited. All rights reserved. + */ + + +/** + * @defgroup groupMath Basic Math Functions + */ + +/** + * @defgroup groupFastMath Fast Math Functions + * This set of functions provides a fast approximation to sine, cosine, and square root. + * As compared to most of the other functions in the CMSIS math library, the fast math functions + * operate on individual values and not arrays. + * There are separate functions for Q15, Q31, and floating-point data. + * + */ + +/** + * @defgroup groupCmplxMath Complex Math Functions + * This set of functions operates on complex data vectors. + * The data in the complex arrays is stored in an interleaved fashion + * (real, imag, real, imag, ...). + * In the API functions, the number of samples in a complex array refers + * to the number of complex values; the array contains twice this number of + * real values. + */ + +/** + * @defgroup groupFilters Filtering Functions + */ + +/** + * @defgroup groupMatrix Matrix Functions + * + * This set of functions provides basic matrix math operations. + * The functions operate on matrix data structures. For example, + * the type + * definition for the floating-point matrix structure is shown + * below: + *
+ *     typedef struct
+ *     {
+ *       uint16_t numRows;     // number of rows of the matrix.
+ *       uint16_t numCols;     // number of columns of the matrix.
+ *       float32_t *pData;     // points to the data of the matrix.
+ *     } arm_matrix_instance_f32;
+ * 
+ * There are similar definitions for Q15 and Q31 data types. + * + * The structure specifies the size of the matrix and then points to + * an array of data. The array is of size numRows X numCols + * and the values are arranged in row order. That is, the + * matrix element (i, j) is stored at: + *
+ *     pData[i*numCols + j]
+ * 
+ * + * \par Init Functions + * There is an associated initialization function for each type of matrix + * data structure. + * The initialization function sets the values of the internal structure fields. + * Refer to the function arm_mat_init_f32(), arm_mat_init_q31() + * and arm_mat_init_q15() for floating-point, Q31 and Q15 types, respectively. + * + * \par + * Use of the initialization function is optional. However, if initialization function is used + * then the instance structure cannot be placed into a const data section. + * To place the instance structure in a const data + * section, manually initialize the data structure. For example: + *
+ * arm_matrix_instance_f32 S = {nRows, nColumns, pData};
+ * arm_matrix_instance_q31 S = {nRows, nColumns, pData};
+ * arm_matrix_instance_q15 S = {nRows, nColumns, pData};
+ * 
+ * where nRows specifies the number of rows, nColumns + * specifies the number of columns, and pData points to the + * data array. + * + * \par Size Checking + * By default all of the matrix functions perform size checking on the input and + * output matrices. For example, the matrix addition function verifies that the + * two input matrices and the output matrix all have the same number of rows and + * columns. If the size check fails the functions return: + *
+ *     ARM_MATH_SIZE_MISMATCH
+ * 
+ * Otherwise the functions return + *
+ *     ARM_MATH_SUCCESS
+ * 
+ * There is some overhead associated with this matrix size checking. + * The matrix size checking is enabled via the \#define + *
+ *     ARM_MATH_MATRIX_CHECK
+ * 
+ * within the library project settings. By default this macro is defined + * and size checking is enabled. By changing the project settings and + * undefining this macro size checking is eliminated and the functions + * run a bit faster. With size checking disabled the functions always + * return ARM_MATH_SUCCESS. + */ + +/** + * @defgroup groupTransforms Transform Functions + */ + +/** + * @defgroup groupController Controller Functions + */ + +/** + * @defgroup groupStats Statistics Functions + */ +/** + * @defgroup groupSupport Support Functions + */ + +/** + * @defgroup groupInterpolation Interpolation Functions + * These functions perform 1- and 2-dimensional interpolation of data. + * Linear interpolation is used for 1-dimensional data and + * bilinear interpolation is used for 2-dimensional data. + */ + +/** + * @defgroup groupExamples Examples + */ +#ifndef _ARM_MATH_H +#define _ARM_MATH_H + +/* ignore some GCC warnings */ +#if defined ( __GNUC__ ) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wsign-conversion" +#pragma GCC diagnostic ignored "-Wconversion" +#pragma GCC diagnostic ignored "-Wunused-parameter" +#endif + +#define __CMSIS_GENERIC /* disable NVIC and Systick functions */ + +#if defined(ARM_MATH_CM7) + #include "core_cm7.h" + #define ARM_MATH_DSP +#elif defined (ARM_MATH_CM4) + #include "core_cm4.h" + #define ARM_MATH_DSP +#elif defined (ARM_MATH_CM3) + #include "core_cm3.h" +#elif defined (ARM_MATH_CM0) + #include "core_cm0.h" + #define ARM_MATH_CM0_FAMILY +#elif defined (ARM_MATH_CM0PLUS) + #include "core_cm0plus.h" + #define ARM_MATH_CM0_FAMILY +#elif defined (ARM_MATH_ARMV8MBL) + #include "core_armv8mbl.h" + #define ARM_MATH_CM0_FAMILY +#elif defined (ARM_MATH_ARMV8MML) + #include "core_armv8mml.h" + #if (defined (__DSP_PRESENT) && (__DSP_PRESENT == 1)) + #define ARM_MATH_DSP + #endif +#else + #error "Define according the used Cortex core ARM_MATH_CM7, ARM_MATH_CM4, ARM_MATH_CM3, ARM_MATH_CM0PLUS, ARM_MATH_CM0, ARM_MATH_ARMV8MBL, ARM_MATH_ARMV8MML" +#endif + +#undef __CMSIS_GENERIC /* enable NVIC and Systick functions */ +#include "string.h" +#include "math.h" +#ifdef __cplusplus +extern "C" +{ +#endif + + + /** + * @brief Macros required for reciprocal calculation in Normalized LMS + */ + +#define DELTA_Q31 (0x100) +#define DELTA_Q15 0x5 +#define INDEX_MASK 0x0000003F +#ifndef PI + #define PI 3.14159265358979f +#endif + + /** + * @brief Macros required for SINE and COSINE Fast math approximations + */ + +#define FAST_MATH_TABLE_SIZE 512 +#define FAST_MATH_Q31_SHIFT (32 - 10) +#define FAST_MATH_Q15_SHIFT (16 - 10) +#define CONTROLLER_Q31_SHIFT (32 - 9) +#define TABLE_SPACING_Q31 0x400000 +#define TABLE_SPACING_Q15 0x80 + + /** + * @brief Macros required for SINE and COSINE Controller functions + */ + /* 1.31(q31) Fixed value of 2/360 */ + /* -1 to +1 is divided into 360 values so total spacing is (2/360) */ +#define INPUT_SPACING 0xB60B61 + + /** + * @brief Macro for Unaligned Support + */ +#ifndef UNALIGNED_SUPPORT_DISABLE + #define ALIGN4 +#else + #if defined (__GNUC__) + #define ALIGN4 __attribute__((aligned(4))) + #else + #define ALIGN4 __align(4) + #endif +#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ + + /** + * @brief Error status returned by some functions in the library. + */ + + typedef enum + { + ARM_MATH_SUCCESS = 0, /**< No error */ + ARM_MATH_ARGUMENT_ERROR = -1, /**< One or more arguments are incorrect */ + ARM_MATH_LENGTH_ERROR = -2, /**< Length of data buffer is incorrect */ + ARM_MATH_SIZE_MISMATCH = -3, /**< Size of matrices is not compatible with the operation. */ + ARM_MATH_NANINF = -4, /**< Not-a-number (NaN) or infinity is generated */ + ARM_MATH_SINGULAR = -5, /**< Generated by matrix inversion if the input matrix is singular and cannot be inverted. */ + ARM_MATH_TEST_FAILURE = -6 /**< Test Failed */ + } arm_status; + + /** + * @brief 8-bit fractional data type in 1.7 format. + */ + typedef int8_t q7_t; + + /** + * @brief 16-bit fractional data type in 1.15 format. + */ + typedef int16_t q15_t; + + /** + * @brief 32-bit fractional data type in 1.31 format. + */ + typedef int32_t q31_t; + + /** + * @brief 64-bit fractional data type in 1.63 format. + */ + typedef int64_t q63_t; + + /** + * @brief 32-bit floating-point type definition. + */ + typedef float float32_t; + + /** + * @brief 64-bit floating-point type definition. + */ + typedef double float64_t; + + /** + * @brief definition to read/write two 16 bit values. + */ +#if defined ( __CC_ARM ) + #define __SIMD32_TYPE int32_t __packed + #define CMSIS_UNUSED __attribute__((unused)) + #define CMSIS_INLINE __attribute__((always_inline)) + +#elif defined ( __ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 ) + #define __SIMD32_TYPE int32_t + #define CMSIS_UNUSED __attribute__((unused)) + #define CMSIS_INLINE __attribute__((always_inline)) + +#elif defined ( __GNUC__ ) + #define __SIMD32_TYPE int32_t + #define CMSIS_UNUSED __attribute__((unused)) + #define CMSIS_INLINE __attribute__((always_inline)) + +#elif defined ( __ICCARM__ ) + #define __SIMD32_TYPE int32_t __packed + #define CMSIS_UNUSED + #define CMSIS_INLINE + +#elif defined ( __TI_ARM__ ) + #define __SIMD32_TYPE int32_t + #define CMSIS_UNUSED __attribute__((unused)) + #define CMSIS_INLINE + +#elif defined ( __CSMC__ ) + #define __SIMD32_TYPE int32_t + #define CMSIS_UNUSED + #define CMSIS_INLINE + +#elif defined ( __TASKING__ ) + #define __SIMD32_TYPE __unaligned int32_t + #define CMSIS_UNUSED + #define CMSIS_INLINE + +#else + #error Unknown compiler +#endif + +#define __SIMD32(addr) (*(__SIMD32_TYPE **) & (addr)) +#define __SIMD32_CONST(addr) ((__SIMD32_TYPE *)(addr)) +#define _SIMD32_OFFSET(addr) (*(__SIMD32_TYPE *) (addr)) +#define __SIMD64(addr) (*(int64_t **) & (addr)) + +/* #if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0_FAMILY) */ +#if !defined (ARM_MATH_DSP) + /** + * @brief definition to pack two 16 bit values. + */ +#define __PKHBT(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0x0000FFFF) | \ + (((int32_t)(ARG2) << ARG3) & (int32_t)0xFFFF0000) ) +#define __PKHTB(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0xFFFF0000) | \ + (((int32_t)(ARG2) >> ARG3) & (int32_t)0x0000FFFF) ) + +/* #endif // defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0_FAMILY) */ +#endif /* !defined (ARM_MATH_DSP) */ + + /** + * @brief definition to pack four 8 bit values. + */ +#ifndef ARM_MATH_BIG_ENDIAN + +#define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v0) << 0) & (int32_t)0x000000FF) | \ + (((int32_t)(v1) << 8) & (int32_t)0x0000FF00) | \ + (((int32_t)(v2) << 16) & (int32_t)0x00FF0000) | \ + (((int32_t)(v3) << 24) & (int32_t)0xFF000000) ) +#else + +#define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v3) << 0) & (int32_t)0x000000FF) | \ + (((int32_t)(v2) << 8) & (int32_t)0x0000FF00) | \ + (((int32_t)(v1) << 16) & (int32_t)0x00FF0000) | \ + (((int32_t)(v0) << 24) & (int32_t)0xFF000000) ) + +#endif + + + /** + * @brief Clips Q63 to Q31 values. + */ + CMSIS_INLINE __STATIC_INLINE q31_t clip_q63_to_q31( + q63_t x) + { + return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ? + ((0x7FFFFFFF ^ ((q31_t) (x >> 63)))) : (q31_t) x; + } + + /** + * @brief Clips Q63 to Q15 values. + */ + CMSIS_INLINE __STATIC_INLINE q15_t clip_q63_to_q15( + q63_t x) + { + return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ? + ((0x7FFF ^ ((q15_t) (x >> 63)))) : (q15_t) (x >> 15); + } + + /** + * @brief Clips Q31 to Q7 values. + */ + CMSIS_INLINE __STATIC_INLINE q7_t clip_q31_to_q7( + q31_t x) + { + return ((q31_t) (x >> 24) != ((q31_t) x >> 23)) ? + ((0x7F ^ ((q7_t) (x >> 31)))) : (q7_t) x; + } + + /** + * @brief Clips Q31 to Q15 values. + */ + CMSIS_INLINE __STATIC_INLINE q15_t clip_q31_to_q15( + q31_t x) + { + return ((q31_t) (x >> 16) != ((q31_t) x >> 15)) ? + ((0x7FFF ^ ((q15_t) (x >> 31)))) : (q15_t) x; + } + + /** + * @brief Multiplies 32 X 64 and returns 32 bit result in 2.30 format. + */ + + CMSIS_INLINE __STATIC_INLINE q63_t mult32x64( + q63_t x, + q31_t y) + { + return ((((q63_t) (x & 0x00000000FFFFFFFF) * y) >> 32) + + (((q63_t) (x >> 32) * y))); + } + +/* + #if defined (ARM_MATH_CM0_FAMILY) && defined ( __CC_ARM ) + #define __CLZ __clz + #endif + */ +/* note: function can be removed when all toolchain support __CLZ for Cortex-M0 */ +#if defined (ARM_MATH_CM0_FAMILY) && ((defined (__ICCARM__)) ) + CMSIS_INLINE __STATIC_INLINE uint32_t __CLZ( + q31_t data); + + CMSIS_INLINE __STATIC_INLINE uint32_t __CLZ( + q31_t data) + { + uint32_t count = 0; + uint32_t mask = 0x80000000; + + while ((data & mask) == 0) + { + count += 1u; + mask = mask >> 1u; + } + + return (count); + } +#endif + + /** + * @brief Function to Calculates 1/in (reciprocal) value of Q31 Data type. + */ + + CMSIS_INLINE __STATIC_INLINE uint32_t arm_recip_q31( + q31_t in, + q31_t * dst, + q31_t * pRecipTable) + { + q31_t out; + uint32_t tempVal; + uint32_t index, i; + uint32_t signBits; + + if (in > 0) + { + signBits = ((uint32_t) (__CLZ( in) - 1)); + } + else + { + signBits = ((uint32_t) (__CLZ(-in) - 1)); + } + + /* Convert input sample to 1.31 format */ + in = (in << signBits); + + /* calculation of index for initial approximated Val */ + index = (uint32_t)(in >> 24); + index = (index & INDEX_MASK); + + /* 1.31 with exp 1 */ + out = pRecipTable[index]; + + /* calculation of reciprocal value */ + /* running approximation for two iterations */ + for (i = 0u; i < 2u; i++) + { + tempVal = (uint32_t) (((q63_t) in * out) >> 31); + tempVal = 0x7FFFFFFFu - tempVal; + /* 1.31 with exp 1 */ + /* out = (q31_t) (((q63_t) out * tempVal) >> 30); */ + out = clip_q63_to_q31(((q63_t) out * tempVal) >> 30); + } + + /* write output */ + *dst = out; + + /* return num of signbits of out = 1/in value */ + return (signBits + 1u); + } + + + /** + * @brief Function to Calculates 1/in (reciprocal) value of Q15 Data type. + */ + CMSIS_INLINE __STATIC_INLINE uint32_t arm_recip_q15( + q15_t in, + q15_t * dst, + q15_t * pRecipTable) + { + q15_t out = 0; + uint32_t tempVal = 0; + uint32_t index = 0, i = 0; + uint32_t signBits = 0; + + if (in > 0) + { + signBits = ((uint32_t)(__CLZ( in) - 17)); + } + else + { + signBits = ((uint32_t)(__CLZ(-in) - 17)); + } + + /* Convert input sample to 1.15 format */ + in = (in << signBits); + + /* calculation of index for initial approximated Val */ + index = (uint32_t)(in >> 8); + index = (index & INDEX_MASK); + + /* 1.15 with exp 1 */ + out = pRecipTable[index]; + + /* calculation of reciprocal value */ + /* running approximation for two iterations */ + for (i = 0u; i < 2u; i++) + { + tempVal = (uint32_t) (((q31_t) in * out) >> 15); + tempVal = 0x7FFFu - tempVal; + /* 1.15 with exp 1 */ + out = (q15_t) (((q31_t) out * tempVal) >> 14); + /* out = clip_q31_to_q15(((q31_t) out * tempVal) >> 14); */ + } + + /* write output */ + *dst = out; + + /* return num of signbits of out = 1/in value */ + return (signBits + 1); + } + + + /* + * @brief C custom defined intrinisic function for only M0 processors + */ +#if defined(ARM_MATH_CM0_FAMILY) + CMSIS_INLINE __STATIC_INLINE q31_t __SSAT( + q31_t x, + uint32_t y) + { + int32_t posMax, negMin; + uint32_t i; + + posMax = 1; + for (i = 0; i < (y - 1); i++) + { + posMax = posMax * 2; + } + + if (x > 0) + { + posMax = (posMax - 1); + + if (x > posMax) + { + x = posMax; + } + } + else + { + negMin = -posMax; + + if (x < negMin) + { + x = negMin; + } + } + return (x); + } +#endif /* end of ARM_MATH_CM0_FAMILY */ + + + /* + * @brief C custom defined intrinsic function for M3 and M0 processors + */ +/* #if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0_FAMILY) */ +#if !defined (ARM_MATH_DSP) + + /* + * @brief C custom defined QADD8 for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint32_t __QADD8( + uint32_t x, + uint32_t y) + { + q31_t r, s, t, u; + + r = __SSAT(((((q31_t)x << 24) >> 24) + (((q31_t)y << 24) >> 24)), 8) & (int32_t)0x000000FF; + s = __SSAT(((((q31_t)x << 16) >> 24) + (((q31_t)y << 16) >> 24)), 8) & (int32_t)0x000000FF; + t = __SSAT(((((q31_t)x << 8) >> 24) + (((q31_t)y << 8) >> 24)), 8) & (int32_t)0x000000FF; + u = __SSAT(((((q31_t)x ) >> 24) + (((q31_t)y ) >> 24)), 8) & (int32_t)0x000000FF; + + return ((uint32_t)((u << 24) | (t << 16) | (s << 8) | (r ))); + } + + + /* + * @brief C custom defined QSUB8 for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint32_t __QSUB8( + uint32_t x, + uint32_t y) + { + q31_t r, s, t, u; + + r = __SSAT(((((q31_t)x << 24) >> 24) - (((q31_t)y << 24) >> 24)), 8) & (int32_t)0x000000FF; + s = __SSAT(((((q31_t)x << 16) >> 24) - (((q31_t)y << 16) >> 24)), 8) & (int32_t)0x000000FF; + t = __SSAT(((((q31_t)x << 8) >> 24) - (((q31_t)y << 8) >> 24)), 8) & (int32_t)0x000000FF; + u = __SSAT(((((q31_t)x ) >> 24) - (((q31_t)y ) >> 24)), 8) & (int32_t)0x000000FF; + + return ((uint32_t)((u << 24) | (t << 16) | (s << 8) | (r ))); + } + + + /* + * @brief C custom defined QADD16 for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint32_t __QADD16( + uint32_t x, + uint32_t y) + { +/* q31_t r, s; without initialisation 'arm_offset_q15 test' fails but 'intrinsic' tests pass! for armCC */ + q31_t r = 0, s = 0; + + r = __SSAT(((((q31_t)x << 16) >> 16) + (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; + s = __SSAT(((((q31_t)x ) >> 16) + (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r ))); + } + + + /* + * @brief C custom defined SHADD16 for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint32_t __SHADD16( + uint32_t x, + uint32_t y) + { + q31_t r, s; + + r = (((((q31_t)x << 16) >> 16) + (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; + s = (((((q31_t)x ) >> 16) + (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r ))); + } + + + /* + * @brief C custom defined QSUB16 for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint32_t __QSUB16( + uint32_t x, + uint32_t y) + { + q31_t r, s; + + r = __SSAT(((((q31_t)x << 16) >> 16) - (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; + s = __SSAT(((((q31_t)x ) >> 16) - (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r ))); + } + + + /* + * @brief C custom defined SHSUB16 for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint32_t __SHSUB16( + uint32_t x, + uint32_t y) + { + q31_t r, s; + + r = (((((q31_t)x << 16) >> 16) - (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; + s = (((((q31_t)x ) >> 16) - (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r ))); + } + + + /* + * @brief C custom defined QASX for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint32_t __QASX( + uint32_t x, + uint32_t y) + { + q31_t r, s; + + r = __SSAT(((((q31_t)x << 16) >> 16) - (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF; + s = __SSAT(((((q31_t)x ) >> 16) + (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r ))); + } + + + /* + * @brief C custom defined SHASX for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint32_t __SHASX( + uint32_t x, + uint32_t y) + { + q31_t r, s; + + r = (((((q31_t)x << 16) >> 16) - (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF; + s = (((((q31_t)x ) >> 16) + (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r ))); + } + + + /* + * @brief C custom defined QSAX for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint32_t __QSAX( + uint32_t x, + uint32_t y) + { + q31_t r, s; + + r = __SSAT(((((q31_t)x << 16) >> 16) + (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF; + s = __SSAT(((((q31_t)x ) >> 16) - (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r ))); + } + + + /* + * @brief C custom defined SHSAX for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint32_t __SHSAX( + uint32_t x, + uint32_t y) + { + q31_t r, s; + + r = (((((q31_t)x << 16) >> 16) + (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF; + s = (((((q31_t)x ) >> 16) - (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r ))); + } + + + /* + * @brief C custom defined SMUSDX for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint32_t __SMUSDX( + uint32_t x, + uint32_t y) + { + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) - + ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) )); + } + + /* + * @brief C custom defined SMUADX for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint32_t __SMUADX( + uint32_t x, + uint32_t y) + { + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) + + ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) )); + } + + + /* + * @brief C custom defined QADD for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE int32_t __QADD( + int32_t x, + int32_t y) + { + return ((int32_t)(clip_q63_to_q31((q63_t)x + (q31_t)y))); + } + + + /* + * @brief C custom defined QSUB for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE int32_t __QSUB( + int32_t x, + int32_t y) + { + return ((int32_t)(clip_q63_to_q31((q63_t)x - (q31_t)y))); + } + + + /* + * @brief C custom defined SMLAD for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint32_t __SMLAD( + uint32_t x, + uint32_t y, + uint32_t sum) + { + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) + + ((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) + + ( ((q31_t)sum ) ) )); + } + + + /* + * @brief C custom defined SMLADX for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint32_t __SMLADX( + uint32_t x, + uint32_t y, + uint32_t sum) + { + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) + + ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) + + ( ((q31_t)sum ) ) )); + } + + + /* + * @brief C custom defined SMLSDX for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint32_t __SMLSDX( + uint32_t x, + uint32_t y, + uint32_t sum) + { + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) - + ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) + + ( ((q31_t)sum ) ) )); + } + + + /* + * @brief C custom defined SMLALD for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint64_t __SMLALD( + uint32_t x, + uint32_t y, + uint64_t sum) + { +/* return (sum + ((q15_t) (x >> 16) * (q15_t) (y >> 16)) + ((q15_t) x * (q15_t) y)); */ + return ((uint64_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) + + ((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) + + ( ((q63_t)sum ) ) )); + } + + + /* + * @brief C custom defined SMLALDX for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint64_t __SMLALDX( + uint32_t x, + uint32_t y, + uint64_t sum) + { +/* return (sum + ((q15_t) (x >> 16) * (q15_t) y)) + ((q15_t) x * (q15_t) (y >> 16)); */ + return ((uint64_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) + + ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) + + ( ((q63_t)sum ) ) )); + } + + + /* + * @brief C custom defined SMUAD for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint32_t __SMUAD( + uint32_t x, + uint32_t y) + { + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) + + ((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) )); + } + + + /* + * @brief C custom defined SMUSD for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint32_t __SMUSD( + uint32_t x, + uint32_t y) + { + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) - + ((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) )); + } + + + /* + * @brief C custom defined SXTB16 for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint32_t __SXTB16( + uint32_t x) + { + return ((uint32_t)(((((q31_t)x << 24) >> 24) & (q31_t)0x0000FFFF) | + ((((q31_t)x << 8) >> 8) & (q31_t)0xFFFF0000) )); + } + + /* + * @brief C custom defined SMMLA for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE int32_t __SMMLA( + int32_t x, + int32_t y, + int32_t sum) + { + return (sum + (int32_t) (((int64_t) x * y) >> 32)); + } + +#if 0 + /* + * @brief C custom defined PKHBT for unavailable DSP extension + */ + CMSIS_INLINE __STATIC_INLINE uint32_t __PKHBT( + uint32_t x, + uint32_t y, + uint32_t leftshift) + { + return ( ((x ) & 0x0000FFFFUL) | + ((y << leftshift) & 0xFFFF0000UL) ); + } + + /* + * @brief C custom defined PKHTB for unavailable DSP extension + */ + CMSIS_INLINE __STATIC_INLINE uint32_t __PKHTB( + uint32_t x, + uint32_t y, + uint32_t rightshift) + { + return ( ((x ) & 0xFFFF0000UL) | + ((y >> rightshift) & 0x0000FFFFUL) ); + } +#endif + +/* #endif // defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0_FAMILY) */ +#endif /* !defined (ARM_MATH_DSP) */ + + + /** + * @brief Instance structure for the Q7 FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of filter coefficients in the filter. */ + q7_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + } arm_fir_instance_q7; + + /** + * @brief Instance structure for the Q15 FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of filter coefficients in the filter. */ + q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + } arm_fir_instance_q15; + + /** + * @brief Instance structure for the Q31 FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of filter coefficients in the filter. */ + q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + } arm_fir_instance_q31; + + /** + * @brief Instance structure for the floating-point FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of filter coefficients in the filter. */ + float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + } arm_fir_instance_f32; + + + /** + * @brief Processing function for the Q7 FIR filter. + * @param[in] S points to an instance of the Q7 FIR filter structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_fir_q7( + const arm_fir_instance_q7 * S, + q7_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q7 FIR filter. + * @param[in,out] S points to an instance of the Q7 FIR structure. + * @param[in] numTaps Number of filter coefficients in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of samples that are processed. + */ + void arm_fir_init_q7( + arm_fir_instance_q7 * S, + uint16_t numTaps, + q7_t * pCoeffs, + q7_t * pState, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q15 FIR filter. + * @param[in] S points to an instance of the Q15 FIR structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_fir_q15( + const arm_fir_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Processing function for the fast Q15 FIR filter for Cortex-M3 and Cortex-M4. + * @param[in] S points to an instance of the Q15 FIR filter structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_fir_fast_q15( + const arm_fir_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q15 FIR filter. + * @param[in,out] S points to an instance of the Q15 FIR filter structure. + * @param[in] numTaps Number of filter coefficients in the filter. Must be even and greater than or equal to 4. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of samples that are processed at a time. + * @return The function returns ARM_MATH_SUCCESS if initialization was successful or ARM_MATH_ARGUMENT_ERROR if + * numTaps is not a supported value. + */ + arm_status arm_fir_init_q15( + arm_fir_instance_q15 * S, + uint16_t numTaps, + q15_t * pCoeffs, + q15_t * pState, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q31 FIR filter. + * @param[in] S points to an instance of the Q31 FIR filter structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_fir_q31( + const arm_fir_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Processing function for the fast Q31 FIR filter for Cortex-M3 and Cortex-M4. + * @param[in] S points to an instance of the Q31 FIR structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_fir_fast_q31( + const arm_fir_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q31 FIR filter. + * @param[in,out] S points to an instance of the Q31 FIR structure. + * @param[in] numTaps Number of filter coefficients in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of samples that are processed at a time. + */ + void arm_fir_init_q31( + arm_fir_instance_q31 * S, + uint16_t numTaps, + q31_t * pCoeffs, + q31_t * pState, + uint32_t blockSize); + + + /** + * @brief Processing function for the floating-point FIR filter. + * @param[in] S points to an instance of the floating-point FIR structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_fir_f32( + const arm_fir_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the floating-point FIR filter. + * @param[in,out] S points to an instance of the floating-point FIR filter structure. + * @param[in] numTaps Number of filter coefficients in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of samples that are processed at a time. + */ + void arm_fir_init_f32( + arm_fir_instance_f32 * S, + uint16_t numTaps, + float32_t * pCoeffs, + float32_t * pState, + uint32_t blockSize); + + + /** + * @brief Instance structure for the Q15 Biquad cascade filter. + */ + typedef struct + { + int8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + q15_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ + q15_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ + int8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ + } arm_biquad_casd_df1_inst_q15; + + /** + * @brief Instance structure for the Q31 Biquad cascade filter. + */ + typedef struct + { + uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + q31_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ + q31_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ + uint8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ + } arm_biquad_casd_df1_inst_q31; + + /** + * @brief Instance structure for the floating-point Biquad cascade filter. + */ + typedef struct + { + uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + float32_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ + float32_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ + } arm_biquad_casd_df1_inst_f32; + + + /** + * @brief Processing function for the Q15 Biquad cascade filter. + * @param[in] S points to an instance of the Q15 Biquad cascade structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cascade_df1_q15( + const arm_biquad_casd_df1_inst_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q15 Biquad cascade filter. + * @param[in,out] S points to an instance of the Q15 Biquad cascade structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] postShift Shift to be applied to the output. Varies according to the coefficients format + */ + void arm_biquad_cascade_df1_init_q15( + arm_biquad_casd_df1_inst_q15 * S, + uint8_t numStages, + q15_t * pCoeffs, + q15_t * pState, + int8_t postShift); + + + /** + * @brief Fast but less precise processing function for the Q15 Biquad cascade filter for Cortex-M3 and Cortex-M4. + * @param[in] S points to an instance of the Q15 Biquad cascade structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cascade_df1_fast_q15( + const arm_biquad_casd_df1_inst_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q31 Biquad cascade filter + * @param[in] S points to an instance of the Q31 Biquad cascade structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cascade_df1_q31( + const arm_biquad_casd_df1_inst_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Fast but less precise processing function for the Q31 Biquad cascade filter for Cortex-M3 and Cortex-M4. + * @param[in] S points to an instance of the Q31 Biquad cascade structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cascade_df1_fast_q31( + const arm_biquad_casd_df1_inst_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q31 Biquad cascade filter. + * @param[in,out] S points to an instance of the Q31 Biquad cascade structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] postShift Shift to be applied to the output. Varies according to the coefficients format + */ + void arm_biquad_cascade_df1_init_q31( + arm_biquad_casd_df1_inst_q31 * S, + uint8_t numStages, + q31_t * pCoeffs, + q31_t * pState, + int8_t postShift); + + + /** + * @brief Processing function for the floating-point Biquad cascade filter. + * @param[in] S points to an instance of the floating-point Biquad cascade structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cascade_df1_f32( + const arm_biquad_casd_df1_inst_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the floating-point Biquad cascade filter. + * @param[in,out] S points to an instance of the floating-point Biquad cascade structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + */ + void arm_biquad_cascade_df1_init_f32( + arm_biquad_casd_df1_inst_f32 * S, + uint8_t numStages, + float32_t * pCoeffs, + float32_t * pState); + + + /** + * @brief Instance structure for the floating-point matrix structure. + */ + typedef struct + { + uint16_t numRows; /**< number of rows of the matrix. */ + uint16_t numCols; /**< number of columns of the matrix. */ + float32_t *pData; /**< points to the data of the matrix. */ + } arm_matrix_instance_f32; + + + /** + * @brief Instance structure for the floating-point matrix structure. + */ + typedef struct + { + uint16_t numRows; /**< number of rows of the matrix. */ + uint16_t numCols; /**< number of columns of the matrix. */ + float64_t *pData; /**< points to the data of the matrix. */ + } arm_matrix_instance_f64; + + /** + * @brief Instance structure for the Q15 matrix structure. + */ + typedef struct + { + uint16_t numRows; /**< number of rows of the matrix. */ + uint16_t numCols; /**< number of columns of the matrix. */ + q15_t *pData; /**< points to the data of the matrix. */ + } arm_matrix_instance_q15; + + /** + * @brief Instance structure for the Q31 matrix structure. + */ + typedef struct + { + uint16_t numRows; /**< number of rows of the matrix. */ + uint16_t numCols; /**< number of columns of the matrix. */ + q31_t *pData; /**< points to the data of the matrix. */ + } arm_matrix_instance_q31; + + + /** + * @brief Floating-point matrix addition. + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_add_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_matrix_instance_f32 * pDst); + + + /** + * @brief Q15 matrix addition. + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_add_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst); + + + /** + * @brief Q31 matrix addition. + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_add_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst); + + + /** + * @brief Floating-point, complex, matrix multiplication. + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_cmplx_mult_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_matrix_instance_f32 * pDst); + + + /** + * @brief Q15, complex, matrix multiplication. + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_cmplx_mult_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst, + q15_t * pScratch); + + + /** + * @brief Q31, complex, matrix multiplication. + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_cmplx_mult_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst); + + + /** + * @brief Floating-point matrix transpose. + * @param[in] pSrc points to the input matrix + * @param[out] pDst points to the output matrix + * @return The function returns either ARM_MATH_SIZE_MISMATCH + * or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_trans_f32( + const arm_matrix_instance_f32 * pSrc, + arm_matrix_instance_f32 * pDst); + + + /** + * @brief Q15 matrix transpose. + * @param[in] pSrc points to the input matrix + * @param[out] pDst points to the output matrix + * @return The function returns either ARM_MATH_SIZE_MISMATCH + * or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_trans_q15( + const arm_matrix_instance_q15 * pSrc, + arm_matrix_instance_q15 * pDst); + + + /** + * @brief Q31 matrix transpose. + * @param[in] pSrc points to the input matrix + * @param[out] pDst points to the output matrix + * @return The function returns either ARM_MATH_SIZE_MISMATCH + * or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_trans_q31( + const arm_matrix_instance_q31 * pSrc, + arm_matrix_instance_q31 * pDst); + + + /** + * @brief Floating-point matrix multiplication + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_mult_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_matrix_instance_f32 * pDst); + + + /** + * @brief Q15 matrix multiplication + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @param[in] pState points to the array for storing intermediate results + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_mult_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst, + q15_t * pState); + + + /** + * @brief Q15 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @param[in] pState points to the array for storing intermediate results + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_mult_fast_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst, + q15_t * pState); + + + /** + * @brief Q31 matrix multiplication + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_mult_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst); + + + /** + * @brief Q31 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_mult_fast_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst); + + + /** + * @brief Floating-point matrix subtraction + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_sub_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_matrix_instance_f32 * pDst); + + + /** + * @brief Q15 matrix subtraction + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_sub_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst); + + + /** + * @brief Q31 matrix subtraction + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_sub_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst); + + + /** + * @brief Floating-point matrix scaling. + * @param[in] pSrc points to the input matrix + * @param[in] scale scale factor + * @param[out] pDst points to the output matrix + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_scale_f32( + const arm_matrix_instance_f32 * pSrc, + float32_t scale, + arm_matrix_instance_f32 * pDst); + + + /** + * @brief Q15 matrix scaling. + * @param[in] pSrc points to input matrix + * @param[in] scaleFract fractional portion of the scale factor + * @param[in] shift number of bits to shift the result by + * @param[out] pDst points to output matrix + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_scale_q15( + const arm_matrix_instance_q15 * pSrc, + q15_t scaleFract, + int32_t shift, + arm_matrix_instance_q15 * pDst); + + + /** + * @brief Q31 matrix scaling. + * @param[in] pSrc points to input matrix + * @param[in] scaleFract fractional portion of the scale factor + * @param[in] shift number of bits to shift the result by + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_scale_q31( + const arm_matrix_instance_q31 * pSrc, + q31_t scaleFract, + int32_t shift, + arm_matrix_instance_q31 * pDst); + + + /** + * @brief Q31 matrix initialization. + * @param[in,out] S points to an instance of the floating-point matrix structure. + * @param[in] nRows number of rows in the matrix. + * @param[in] nColumns number of columns in the matrix. + * @param[in] pData points to the matrix data array. + */ + void arm_mat_init_q31( + arm_matrix_instance_q31 * S, + uint16_t nRows, + uint16_t nColumns, + q31_t * pData); + + + /** + * @brief Q15 matrix initialization. + * @param[in,out] S points to an instance of the floating-point matrix structure. + * @param[in] nRows number of rows in the matrix. + * @param[in] nColumns number of columns in the matrix. + * @param[in] pData points to the matrix data array. + */ + void arm_mat_init_q15( + arm_matrix_instance_q15 * S, + uint16_t nRows, + uint16_t nColumns, + q15_t * pData); + + + /** + * @brief Floating-point matrix initialization. + * @param[in,out] S points to an instance of the floating-point matrix structure. + * @param[in] nRows number of rows in the matrix. + * @param[in] nColumns number of columns in the matrix. + * @param[in] pData points to the matrix data array. + */ + void arm_mat_init_f32( + arm_matrix_instance_f32 * S, + uint16_t nRows, + uint16_t nColumns, + float32_t * pData); + + + + /** + * @brief Instance structure for the Q15 PID Control. + */ + typedef struct + { + q15_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ +#if !defined (ARM_MATH_DSP) + q15_t A1; + q15_t A2; +#else + q31_t A1; /**< The derived gain A1 = -Kp - 2Kd | Kd.*/ +#endif + q15_t state[3]; /**< The state array of length 3. */ + q15_t Kp; /**< The proportional gain. */ + q15_t Ki; /**< The integral gain. */ + q15_t Kd; /**< The derivative gain. */ + } arm_pid_instance_q15; + + /** + * @brief Instance structure for the Q31 PID Control. + */ + typedef struct + { + q31_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ + q31_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ + q31_t A2; /**< The derived gain, A2 = Kd . */ + q31_t state[3]; /**< The state array of length 3. */ + q31_t Kp; /**< The proportional gain. */ + q31_t Ki; /**< The integral gain. */ + q31_t Kd; /**< The derivative gain. */ + } arm_pid_instance_q31; + + /** + * @brief Instance structure for the floating-point PID Control. + */ + typedef struct + { + float32_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ + float32_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ + float32_t A2; /**< The derived gain, A2 = Kd . */ + float32_t state[3]; /**< The state array of length 3. */ + float32_t Kp; /**< The proportional gain. */ + float32_t Ki; /**< The integral gain. */ + float32_t Kd; /**< The derivative gain. */ + } arm_pid_instance_f32; + + + + /** + * @brief Initialization function for the floating-point PID Control. + * @param[in,out] S points to an instance of the PID structure. + * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. + */ + void arm_pid_init_f32( + arm_pid_instance_f32 * S, + int32_t resetStateFlag); + + + /** + * @brief Reset function for the floating-point PID Control. + * @param[in,out] S is an instance of the floating-point PID Control structure + */ + void arm_pid_reset_f32( + arm_pid_instance_f32 * S); + + + /** + * @brief Initialization function for the Q31 PID Control. + * @param[in,out] S points to an instance of the Q15 PID structure. + * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. + */ + void arm_pid_init_q31( + arm_pid_instance_q31 * S, + int32_t resetStateFlag); + + + /** + * @brief Reset function for the Q31 PID Control. + * @param[in,out] S points to an instance of the Q31 PID Control structure + */ + + void arm_pid_reset_q31( + arm_pid_instance_q31 * S); + + + /** + * @brief Initialization function for the Q15 PID Control. + * @param[in,out] S points to an instance of the Q15 PID structure. + * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. + */ + void arm_pid_init_q15( + arm_pid_instance_q15 * S, + int32_t resetStateFlag); + + + /** + * @brief Reset function for the Q15 PID Control. + * @param[in,out] S points to an instance of the q15 PID Control structure + */ + void arm_pid_reset_q15( + arm_pid_instance_q15 * S); + + + /** + * @brief Instance structure for the floating-point Linear Interpolate function. + */ + typedef struct + { + uint32_t nValues; /**< nValues */ + float32_t x1; /**< x1 */ + float32_t xSpacing; /**< xSpacing */ + float32_t *pYData; /**< pointer to the table of Y values */ + } arm_linear_interp_instance_f32; + + /** + * @brief Instance structure for the floating-point bilinear interpolation function. + */ + typedef struct + { + uint16_t numRows; /**< number of rows in the data table. */ + uint16_t numCols; /**< number of columns in the data table. */ + float32_t *pData; /**< points to the data table. */ + } arm_bilinear_interp_instance_f32; + + /** + * @brief Instance structure for the Q31 bilinear interpolation function. + */ + typedef struct + { + uint16_t numRows; /**< number of rows in the data table. */ + uint16_t numCols; /**< number of columns in the data table. */ + q31_t *pData; /**< points to the data table. */ + } arm_bilinear_interp_instance_q31; + + /** + * @brief Instance structure for the Q15 bilinear interpolation function. + */ + typedef struct + { + uint16_t numRows; /**< number of rows in the data table. */ + uint16_t numCols; /**< number of columns in the data table. */ + q15_t *pData; /**< points to the data table. */ + } arm_bilinear_interp_instance_q15; + + /** + * @brief Instance structure for the Q15 bilinear interpolation function. + */ + typedef struct + { + uint16_t numRows; /**< number of rows in the data table. */ + uint16_t numCols; /**< number of columns in the data table. */ + q7_t *pData; /**< points to the data table. */ + } arm_bilinear_interp_instance_q7; + + + /** + * @brief Q7 vector multiplication. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_mult_q7( + q7_t * pSrcA, + q7_t * pSrcB, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q15 vector multiplication. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_mult_q15( + q15_t * pSrcA, + q15_t * pSrcB, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q31 vector multiplication. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_mult_q31( + q31_t * pSrcA, + q31_t * pSrcB, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Floating-point vector multiplication. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_mult_f32( + float32_t * pSrcA, + float32_t * pSrcB, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Instance structure for the Q15 CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + q15_t *pTwiddle; /**< points to the Sin twiddle factor table. */ + uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ + } arm_cfft_radix2_instance_q15; + +/* Deprecated */ + arm_status arm_cfft_radix2_init_q15( + arm_cfft_radix2_instance_q15 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/* Deprecated */ + void arm_cfft_radix2_q15( + const arm_cfft_radix2_instance_q15 * S, + q15_t * pSrc); + + + /** + * @brief Instance structure for the Q15 CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + q15_t *pTwiddle; /**< points to the twiddle factor table. */ + uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ + } arm_cfft_radix4_instance_q15; + +/* Deprecated */ + arm_status arm_cfft_radix4_init_q15( + arm_cfft_radix4_instance_q15 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/* Deprecated */ + void arm_cfft_radix4_q15( + const arm_cfft_radix4_instance_q15 * S, + q15_t * pSrc); + + /** + * @brief Instance structure for the Radix-2 Q31 CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + q31_t *pTwiddle; /**< points to the Twiddle factor table. */ + uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ + } arm_cfft_radix2_instance_q31; + +/* Deprecated */ + arm_status arm_cfft_radix2_init_q31( + arm_cfft_radix2_instance_q31 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/* Deprecated */ + void arm_cfft_radix2_q31( + const arm_cfft_radix2_instance_q31 * S, + q31_t * pSrc); + + /** + * @brief Instance structure for the Q31 CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + q31_t *pTwiddle; /**< points to the twiddle factor table. */ + uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ + } arm_cfft_radix4_instance_q31; + +/* Deprecated */ + void arm_cfft_radix4_q31( + const arm_cfft_radix4_instance_q31 * S, + q31_t * pSrc); + +/* Deprecated */ + arm_status arm_cfft_radix4_init_q31( + arm_cfft_radix4_instance_q31 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + + /** + * @brief Instance structure for the floating-point CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + float32_t *pTwiddle; /**< points to the Twiddle factor table. */ + uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ + float32_t onebyfftLen; /**< value of 1/fftLen. */ + } arm_cfft_radix2_instance_f32; + +/* Deprecated */ + arm_status arm_cfft_radix2_init_f32( + arm_cfft_radix2_instance_f32 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/* Deprecated */ + void arm_cfft_radix2_f32( + const arm_cfft_radix2_instance_f32 * S, + float32_t * pSrc); + + /** + * @brief Instance structure for the floating-point CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + float32_t *pTwiddle; /**< points to the Twiddle factor table. */ + uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ + float32_t onebyfftLen; /**< value of 1/fftLen. */ + } arm_cfft_radix4_instance_f32; + +/* Deprecated */ + arm_status arm_cfft_radix4_init_f32( + arm_cfft_radix4_instance_f32 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/* Deprecated */ + void arm_cfft_radix4_f32( + const arm_cfft_radix4_instance_f32 * S, + float32_t * pSrc); + + /** + * @brief Instance structure for the fixed-point CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + const q15_t *pTwiddle; /**< points to the Twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t bitRevLength; /**< bit reversal table length. */ + } arm_cfft_instance_q15; + +void arm_cfft_q15( + const arm_cfft_instance_q15 * S, + q15_t * p1, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + + /** + * @brief Instance structure for the fixed-point CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + const q31_t *pTwiddle; /**< points to the Twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t bitRevLength; /**< bit reversal table length. */ + } arm_cfft_instance_q31; + +void arm_cfft_q31( + const arm_cfft_instance_q31 * S, + q31_t * p1, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + + /** + * @brief Instance structure for the floating-point CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + const float32_t *pTwiddle; /**< points to the Twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t bitRevLength; /**< bit reversal table length. */ + } arm_cfft_instance_f32; + + void arm_cfft_f32( + const arm_cfft_instance_f32 * S, + float32_t * p1, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + + /** + * @brief Instance structure for the Q15 RFFT/RIFFT function. + */ + typedef struct + { + uint32_t fftLenReal; /**< length of the real FFT. */ + uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ + uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ + uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + q15_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ + q15_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ + const arm_cfft_instance_q15 *pCfft; /**< points to the complex FFT instance. */ + } arm_rfft_instance_q15; + + arm_status arm_rfft_init_q15( + arm_rfft_instance_q15 * S, + uint32_t fftLenReal, + uint32_t ifftFlagR, + uint32_t bitReverseFlag); + + void arm_rfft_q15( + const arm_rfft_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst); + + /** + * @brief Instance structure for the Q31 RFFT/RIFFT function. + */ + typedef struct + { + uint32_t fftLenReal; /**< length of the real FFT. */ + uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ + uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ + uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + q31_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ + q31_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ + const arm_cfft_instance_q31 *pCfft; /**< points to the complex FFT instance. */ + } arm_rfft_instance_q31; + + arm_status arm_rfft_init_q31( + arm_rfft_instance_q31 * S, + uint32_t fftLenReal, + uint32_t ifftFlagR, + uint32_t bitReverseFlag); + + void arm_rfft_q31( + const arm_rfft_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst); + + /** + * @brief Instance structure for the floating-point RFFT/RIFFT function. + */ + typedef struct + { + uint32_t fftLenReal; /**< length of the real FFT. */ + uint16_t fftLenBy2; /**< length of the complex FFT. */ + uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ + uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ + uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + float32_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ + float32_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ + arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ + } arm_rfft_instance_f32; + + arm_status arm_rfft_init_f32( + arm_rfft_instance_f32 * S, + arm_cfft_radix4_instance_f32 * S_CFFT, + uint32_t fftLenReal, + uint32_t ifftFlagR, + uint32_t bitReverseFlag); + + void arm_rfft_f32( + const arm_rfft_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst); + + /** + * @brief Instance structure for the floating-point RFFT/RIFFT function. + */ +typedef struct + { + arm_cfft_instance_f32 Sint; /**< Internal CFFT structure. */ + uint16_t fftLenRFFT; /**< length of the real sequence */ + float32_t * pTwiddleRFFT; /**< Twiddle factors real stage */ + } arm_rfft_fast_instance_f32 ; + +arm_status arm_rfft_fast_init_f32 ( + arm_rfft_fast_instance_f32 * S, + uint16_t fftLen); + +void arm_rfft_fast_f32( + arm_rfft_fast_instance_f32 * S, + float32_t * p, float32_t * pOut, + uint8_t ifftFlag); + + /** + * @brief Instance structure for the floating-point DCT4/IDCT4 function. + */ + typedef struct + { + uint16_t N; /**< length of the DCT4. */ + uint16_t Nby2; /**< half of the length of the DCT4. */ + float32_t normalize; /**< normalizing factor. */ + float32_t *pTwiddle; /**< points to the twiddle factor table. */ + float32_t *pCosFactor; /**< points to the cosFactor table. */ + arm_rfft_instance_f32 *pRfft; /**< points to the real FFT instance. */ + arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ + } arm_dct4_instance_f32; + + + /** + * @brief Initialization function for the floating-point DCT4/IDCT4. + * @param[in,out] S points to an instance of floating-point DCT4/IDCT4 structure. + * @param[in] S_RFFT points to an instance of floating-point RFFT/RIFFT structure. + * @param[in] S_CFFT points to an instance of floating-point CFFT/CIFFT structure. + * @param[in] N length of the DCT4. + * @param[in] Nby2 half of the length of the DCT4. + * @param[in] normalize normalizing factor. + * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLenReal is not a supported transform length. + */ + arm_status arm_dct4_init_f32( + arm_dct4_instance_f32 * S, + arm_rfft_instance_f32 * S_RFFT, + arm_cfft_radix4_instance_f32 * S_CFFT, + uint16_t N, + uint16_t Nby2, + float32_t normalize); + + + /** + * @brief Processing function for the floating-point DCT4/IDCT4. + * @param[in] S points to an instance of the floating-point DCT4/IDCT4 structure. + * @param[in] pState points to state buffer. + * @param[in,out] pInlineBuffer points to the in-place input and output buffer. + */ + void arm_dct4_f32( + const arm_dct4_instance_f32 * S, + float32_t * pState, + float32_t * pInlineBuffer); + + + /** + * @brief Instance structure for the Q31 DCT4/IDCT4 function. + */ + typedef struct + { + uint16_t N; /**< length of the DCT4. */ + uint16_t Nby2; /**< half of the length of the DCT4. */ + q31_t normalize; /**< normalizing factor. */ + q31_t *pTwiddle; /**< points to the twiddle factor table. */ + q31_t *pCosFactor; /**< points to the cosFactor table. */ + arm_rfft_instance_q31 *pRfft; /**< points to the real FFT instance. */ + arm_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */ + } arm_dct4_instance_q31; + + + /** + * @brief Initialization function for the Q31 DCT4/IDCT4. + * @param[in,out] S points to an instance of Q31 DCT4/IDCT4 structure. + * @param[in] S_RFFT points to an instance of Q31 RFFT/RIFFT structure + * @param[in] S_CFFT points to an instance of Q31 CFFT/CIFFT structure + * @param[in] N length of the DCT4. + * @param[in] Nby2 half of the length of the DCT4. + * @param[in] normalize normalizing factor. + * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if N is not a supported transform length. + */ + arm_status arm_dct4_init_q31( + arm_dct4_instance_q31 * S, + arm_rfft_instance_q31 * S_RFFT, + arm_cfft_radix4_instance_q31 * S_CFFT, + uint16_t N, + uint16_t Nby2, + q31_t normalize); + + + /** + * @brief Processing function for the Q31 DCT4/IDCT4. + * @param[in] S points to an instance of the Q31 DCT4 structure. + * @param[in] pState points to state buffer. + * @param[in,out] pInlineBuffer points to the in-place input and output buffer. + */ + void arm_dct4_q31( + const arm_dct4_instance_q31 * S, + q31_t * pState, + q31_t * pInlineBuffer); + + + /** + * @brief Instance structure for the Q15 DCT4/IDCT4 function. + */ + typedef struct + { + uint16_t N; /**< length of the DCT4. */ + uint16_t Nby2; /**< half of the length of the DCT4. */ + q15_t normalize; /**< normalizing factor. */ + q15_t *pTwiddle; /**< points to the twiddle factor table. */ + q15_t *pCosFactor; /**< points to the cosFactor table. */ + arm_rfft_instance_q15 *pRfft; /**< points to the real FFT instance. */ + arm_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */ + } arm_dct4_instance_q15; + + + /** + * @brief Initialization function for the Q15 DCT4/IDCT4. + * @param[in,out] S points to an instance of Q15 DCT4/IDCT4 structure. + * @param[in] S_RFFT points to an instance of Q15 RFFT/RIFFT structure. + * @param[in] S_CFFT points to an instance of Q15 CFFT/CIFFT structure. + * @param[in] N length of the DCT4. + * @param[in] Nby2 half of the length of the DCT4. + * @param[in] normalize normalizing factor. + * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if N is not a supported transform length. + */ + arm_status arm_dct4_init_q15( + arm_dct4_instance_q15 * S, + arm_rfft_instance_q15 * S_RFFT, + arm_cfft_radix4_instance_q15 * S_CFFT, + uint16_t N, + uint16_t Nby2, + q15_t normalize); + + + /** + * @brief Processing function for the Q15 DCT4/IDCT4. + * @param[in] S points to an instance of the Q15 DCT4 structure. + * @param[in] pState points to state buffer. + * @param[in,out] pInlineBuffer points to the in-place input and output buffer. + */ + void arm_dct4_q15( + const arm_dct4_instance_q15 * S, + q15_t * pState, + q15_t * pInlineBuffer); + + + /** + * @brief Floating-point vector addition. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_add_f32( + float32_t * pSrcA, + float32_t * pSrcB, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q7 vector addition. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_add_q7( + q7_t * pSrcA, + q7_t * pSrcB, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q15 vector addition. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_add_q15( + q15_t * pSrcA, + q15_t * pSrcB, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q31 vector addition. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_add_q31( + q31_t * pSrcA, + q31_t * pSrcB, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Floating-point vector subtraction. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_sub_f32( + float32_t * pSrcA, + float32_t * pSrcB, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q7 vector subtraction. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_sub_q7( + q7_t * pSrcA, + q7_t * pSrcB, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q15 vector subtraction. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_sub_q15( + q15_t * pSrcA, + q15_t * pSrcB, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q31 vector subtraction. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_sub_q31( + q31_t * pSrcA, + q31_t * pSrcB, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Multiplies a floating-point vector by a scalar. + * @param[in] pSrc points to the input vector + * @param[in] scale scale factor to be applied + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_scale_f32( + float32_t * pSrc, + float32_t scale, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Multiplies a Q7 vector by a scalar. + * @param[in] pSrc points to the input vector + * @param[in] scaleFract fractional portion of the scale value + * @param[in] shift number of bits to shift the result by + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_scale_q7( + q7_t * pSrc, + q7_t scaleFract, + int8_t shift, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Multiplies a Q15 vector by a scalar. + * @param[in] pSrc points to the input vector + * @param[in] scaleFract fractional portion of the scale value + * @param[in] shift number of bits to shift the result by + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_scale_q15( + q15_t * pSrc, + q15_t scaleFract, + int8_t shift, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Multiplies a Q31 vector by a scalar. + * @param[in] pSrc points to the input vector + * @param[in] scaleFract fractional portion of the scale value + * @param[in] shift number of bits to shift the result by + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_scale_q31( + q31_t * pSrc, + q31_t scaleFract, + int8_t shift, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q7 vector absolute value. + * @param[in] pSrc points to the input buffer + * @param[out] pDst points to the output buffer + * @param[in] blockSize number of samples in each vector + */ + void arm_abs_q7( + q7_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Floating-point vector absolute value. + * @param[in] pSrc points to the input buffer + * @param[out] pDst points to the output buffer + * @param[in] blockSize number of samples in each vector + */ + void arm_abs_f32( + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q15 vector absolute value. + * @param[in] pSrc points to the input buffer + * @param[out] pDst points to the output buffer + * @param[in] blockSize number of samples in each vector + */ + void arm_abs_q15( + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q31 vector absolute value. + * @param[in] pSrc points to the input buffer + * @param[out] pDst points to the output buffer + * @param[in] blockSize number of samples in each vector + */ + void arm_abs_q31( + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Dot product of floating-point vectors. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] blockSize number of samples in each vector + * @param[out] result output result returned here + */ + void arm_dot_prod_f32( + float32_t * pSrcA, + float32_t * pSrcB, + uint32_t blockSize, + float32_t * result); + + + /** + * @brief Dot product of Q7 vectors. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] blockSize number of samples in each vector + * @param[out] result output result returned here + */ + void arm_dot_prod_q7( + q7_t * pSrcA, + q7_t * pSrcB, + uint32_t blockSize, + q31_t * result); + + + /** + * @brief Dot product of Q15 vectors. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] blockSize number of samples in each vector + * @param[out] result output result returned here + */ + void arm_dot_prod_q15( + q15_t * pSrcA, + q15_t * pSrcB, + uint32_t blockSize, + q63_t * result); + + + /** + * @brief Dot product of Q31 vectors. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] blockSize number of samples in each vector + * @param[out] result output result returned here + */ + void arm_dot_prod_q31( + q31_t * pSrcA, + q31_t * pSrcB, + uint32_t blockSize, + q63_t * result); + + + /** + * @brief Shifts the elements of a Q7 vector a specified number of bits. + * @param[in] pSrc points to the input vector + * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_shift_q7( + q7_t * pSrc, + int8_t shiftBits, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Shifts the elements of a Q15 vector a specified number of bits. + * @param[in] pSrc points to the input vector + * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_shift_q15( + q15_t * pSrc, + int8_t shiftBits, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Shifts the elements of a Q31 vector a specified number of bits. + * @param[in] pSrc points to the input vector + * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_shift_q31( + q31_t * pSrc, + int8_t shiftBits, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Adds a constant offset to a floating-point vector. + * @param[in] pSrc points to the input vector + * @param[in] offset is the offset to be added + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_offset_f32( + float32_t * pSrc, + float32_t offset, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Adds a constant offset to a Q7 vector. + * @param[in] pSrc points to the input vector + * @param[in] offset is the offset to be added + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_offset_q7( + q7_t * pSrc, + q7_t offset, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Adds a constant offset to a Q15 vector. + * @param[in] pSrc points to the input vector + * @param[in] offset is the offset to be added + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_offset_q15( + q15_t * pSrc, + q15_t offset, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Adds a constant offset to a Q31 vector. + * @param[in] pSrc points to the input vector + * @param[in] offset is the offset to be added + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_offset_q31( + q31_t * pSrc, + q31_t offset, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Negates the elements of a floating-point vector. + * @param[in] pSrc points to the input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_negate_f32( + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Negates the elements of a Q7 vector. + * @param[in] pSrc points to the input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_negate_q7( + q7_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Negates the elements of a Q15 vector. + * @param[in] pSrc points to the input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_negate_q15( + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Negates the elements of a Q31 vector. + * @param[in] pSrc points to the input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_negate_q31( + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Copies the elements of a floating-point vector. + * @param[in] pSrc input pointer + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_copy_f32( + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Copies the elements of a Q7 vector. + * @param[in] pSrc input pointer + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_copy_q7( + q7_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Copies the elements of a Q15 vector. + * @param[in] pSrc input pointer + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_copy_q15( + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Copies the elements of a Q31 vector. + * @param[in] pSrc input pointer + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_copy_q31( + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Fills a constant value into a floating-point vector. + * @param[in] value input value to be filled + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_fill_f32( + float32_t value, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Fills a constant value into a Q7 vector. + * @param[in] value input value to be filled + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_fill_q7( + q7_t value, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Fills a constant value into a Q15 vector. + * @param[in] value input value to be filled + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_fill_q15( + q15_t value, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Fills a constant value into a Q31 vector. + * @param[in] value input value to be filled + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_fill_q31( + q31_t value, + q31_t * pDst, + uint32_t blockSize); + + +/** + * @brief Convolution of floating-point sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the location where the output result is written. Length srcALen+srcBLen-1. + */ + void arm_conv_f32( + float32_t * pSrcA, + uint32_t srcALen, + float32_t * pSrcB, + uint32_t srcBLen, + float32_t * pDst); + + + /** + * @brief Convolution of Q15 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. + * @param[in] pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). + */ + void arm_conv_opt_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + q15_t * pScratch1, + q15_t * pScratch2); + + +/** + * @brief Convolution of Q15 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the location where the output result is written. Length srcALen+srcBLen-1. + */ + void arm_conv_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst); + + + /** + * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. + */ + void arm_conv_fast_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst); + + + /** + * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. + * @param[in] pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). + */ + void arm_conv_fast_opt_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + q15_t * pScratch1, + q15_t * pScratch2); + + + /** + * @brief Convolution of Q31 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. + */ + void arm_conv_q31( + q31_t * pSrcA, + uint32_t srcALen, + q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst); + + + /** + * @brief Convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. + */ + void arm_conv_fast_q31( + q31_t * pSrcA, + uint32_t srcALen, + q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst); + + + /** + * @brief Convolution of Q7 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. + * @param[in] pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + * @param[in] pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). + */ + void arm_conv_opt_q7( + q7_t * pSrcA, + uint32_t srcALen, + q7_t * pSrcB, + uint32_t srcBLen, + q7_t * pDst, + q15_t * pScratch1, + q15_t * pScratch2); + + + /** + * @brief Convolution of Q7 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. + */ + void arm_conv_q7( + q7_t * pSrcA, + uint32_t srcALen, + q7_t * pSrcB, + uint32_t srcBLen, + q7_t * pDst); + + + /** + * @brief Partial convolution of floating-point sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_conv_partial_f32( + float32_t * pSrcA, + uint32_t srcALen, + float32_t * pSrcB, + uint32_t srcBLen, + float32_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + + + /** + * @brief Partial convolution of Q15 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @param[in] pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_conv_partial_opt_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + uint32_t firstIndex, + uint32_t numPoints, + q15_t * pScratch1, + q15_t * pScratch2); + + + /** + * @brief Partial convolution of Q15 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_conv_partial_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + + + /** + * @brief Partial convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_conv_partial_fast_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + + + /** + * @brief Partial convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @param[in] pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_conv_partial_fast_opt_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + uint32_t firstIndex, + uint32_t numPoints, + q15_t * pScratch1, + q15_t * pScratch2); + + + /** + * @brief Partial convolution of Q31 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_conv_partial_q31( + q31_t * pSrcA, + uint32_t srcALen, + q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + + + /** + * @brief Partial convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_conv_partial_fast_q31( + q31_t * pSrcA, + uint32_t srcALen, + q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + + + /** + * @brief Partial convolution of Q7 sequences + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @param[in] pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + * @param[in] pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_conv_partial_opt_q7( + q7_t * pSrcA, + uint32_t srcALen, + q7_t * pSrcB, + uint32_t srcBLen, + q7_t * pDst, + uint32_t firstIndex, + uint32_t numPoints, + q15_t * pScratch1, + q15_t * pScratch2); + + +/** + * @brief Partial convolution of Q7 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_conv_partial_q7( + q7_t * pSrcA, + uint32_t srcALen, + q7_t * pSrcB, + uint32_t srcBLen, + q7_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + + + /** + * @brief Instance structure for the Q15 FIR decimator. + */ + typedef struct + { + uint8_t M; /**< decimation factor. */ + uint16_t numTaps; /**< number of coefficients in the filter. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + } arm_fir_decimate_instance_q15; + + /** + * @brief Instance structure for the Q31 FIR decimator. + */ + typedef struct + { + uint8_t M; /**< decimation factor. */ + uint16_t numTaps; /**< number of coefficients in the filter. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + } arm_fir_decimate_instance_q31; + + /** + * @brief Instance structure for the floating-point FIR decimator. + */ + typedef struct + { + uint8_t M; /**< decimation factor. */ + uint16_t numTaps; /**< number of coefficients in the filter. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + } arm_fir_decimate_instance_f32; + + + /** + * @brief Processing function for the floating-point FIR decimator. + * @param[in] S points to an instance of the floating-point FIR decimator structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_decimate_f32( + const arm_fir_decimate_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the floating-point FIR decimator. + * @param[in,out] S points to an instance of the floating-point FIR decimator structure. + * @param[in] numTaps number of coefficients in the filter. + * @param[in] M decimation factor. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * blockSize is not a multiple of M. + */ + arm_status arm_fir_decimate_init_f32( + arm_fir_decimate_instance_f32 * S, + uint16_t numTaps, + uint8_t M, + float32_t * pCoeffs, + float32_t * pState, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q15 FIR decimator. + * @param[in] S points to an instance of the Q15 FIR decimator structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_decimate_q15( + const arm_fir_decimate_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q15 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4. + * @param[in] S points to an instance of the Q15 FIR decimator structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_decimate_fast_q15( + const arm_fir_decimate_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q15 FIR decimator. + * @param[in,out] S points to an instance of the Q15 FIR decimator structure. + * @param[in] numTaps number of coefficients in the filter. + * @param[in] M decimation factor. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * blockSize is not a multiple of M. + */ + arm_status arm_fir_decimate_init_q15( + arm_fir_decimate_instance_q15 * S, + uint16_t numTaps, + uint8_t M, + q15_t * pCoeffs, + q15_t * pState, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q31 FIR decimator. + * @param[in] S points to an instance of the Q31 FIR decimator structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_decimate_q31( + const arm_fir_decimate_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Processing function for the Q31 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4. + * @param[in] S points to an instance of the Q31 FIR decimator structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_decimate_fast_q31( + arm_fir_decimate_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q31 FIR decimator. + * @param[in,out] S points to an instance of the Q31 FIR decimator structure. + * @param[in] numTaps number of coefficients in the filter. + * @param[in] M decimation factor. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * blockSize is not a multiple of M. + */ + arm_status arm_fir_decimate_init_q31( + arm_fir_decimate_instance_q31 * S, + uint16_t numTaps, + uint8_t M, + q31_t * pCoeffs, + q31_t * pState, + uint32_t blockSize); + + + /** + * @brief Instance structure for the Q15 FIR interpolator. + */ + typedef struct + { + uint8_t L; /**< upsample factor. */ + uint16_t phaseLength; /**< length of each polyphase filter component. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ + q15_t *pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */ + } arm_fir_interpolate_instance_q15; + + /** + * @brief Instance structure for the Q31 FIR interpolator. + */ + typedef struct + { + uint8_t L; /**< upsample factor. */ + uint16_t phaseLength; /**< length of each polyphase filter component. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ + q31_t *pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */ + } arm_fir_interpolate_instance_q31; + + /** + * @brief Instance structure for the floating-point FIR interpolator. + */ + typedef struct + { + uint8_t L; /**< upsample factor. */ + uint16_t phaseLength; /**< length of each polyphase filter component. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ + float32_t *pState; /**< points to the state variable array. The array is of length phaseLength+numTaps-1. */ + } arm_fir_interpolate_instance_f32; + + + /** + * @brief Processing function for the Q15 FIR interpolator. + * @param[in] S points to an instance of the Q15 FIR interpolator structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_interpolate_q15( + const arm_fir_interpolate_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q15 FIR interpolator. + * @param[in,out] S points to an instance of the Q15 FIR interpolator structure. + * @param[in] L upsample factor. + * @param[in] numTaps number of filter coefficients in the filter. + * @param[in] pCoeffs points to the filter coefficient buffer. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * the filter length numTaps is not a multiple of the interpolation factor L. + */ + arm_status arm_fir_interpolate_init_q15( + arm_fir_interpolate_instance_q15 * S, + uint8_t L, + uint16_t numTaps, + q15_t * pCoeffs, + q15_t * pState, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q31 FIR interpolator. + * @param[in] S points to an instance of the Q15 FIR interpolator structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_interpolate_q31( + const arm_fir_interpolate_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q31 FIR interpolator. + * @param[in,out] S points to an instance of the Q31 FIR interpolator structure. + * @param[in] L upsample factor. + * @param[in] numTaps number of filter coefficients in the filter. + * @param[in] pCoeffs points to the filter coefficient buffer. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * the filter length numTaps is not a multiple of the interpolation factor L. + */ + arm_status arm_fir_interpolate_init_q31( + arm_fir_interpolate_instance_q31 * S, + uint8_t L, + uint16_t numTaps, + q31_t * pCoeffs, + q31_t * pState, + uint32_t blockSize); + + + /** + * @brief Processing function for the floating-point FIR interpolator. + * @param[in] S points to an instance of the floating-point FIR interpolator structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_interpolate_f32( + const arm_fir_interpolate_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the floating-point FIR interpolator. + * @param[in,out] S points to an instance of the floating-point FIR interpolator structure. + * @param[in] L upsample factor. + * @param[in] numTaps number of filter coefficients in the filter. + * @param[in] pCoeffs points to the filter coefficient buffer. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * the filter length numTaps is not a multiple of the interpolation factor L. + */ + arm_status arm_fir_interpolate_init_f32( + arm_fir_interpolate_instance_f32 * S, + uint8_t L, + uint16_t numTaps, + float32_t * pCoeffs, + float32_t * pState, + uint32_t blockSize); + + + /** + * @brief Instance structure for the high precision Q31 Biquad cascade filter. + */ + typedef struct + { + uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + q63_t *pState; /**< points to the array of state coefficients. The array is of length 4*numStages. */ + q31_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ + uint8_t postShift; /**< additional shift, in bits, applied to each output sample. */ + } arm_biquad_cas_df1_32x64_ins_q31; + + + /** + * @param[in] S points to an instance of the high precision Q31 Biquad cascade filter structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cas_df1_32x64_q31( + const arm_biquad_cas_df1_32x64_ins_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @param[in,out] S points to an instance of the high precision Q31 Biquad cascade filter structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] postShift shift to be applied to the output. Varies according to the coefficients format + */ + void arm_biquad_cas_df1_32x64_init_q31( + arm_biquad_cas_df1_32x64_ins_q31 * S, + uint8_t numStages, + q31_t * pCoeffs, + q63_t * pState, + uint8_t postShift); + + + /** + * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. + */ + typedef struct + { + uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + float32_t *pState; /**< points to the array of state coefficients. The array is of length 2*numStages. */ + float32_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ + } arm_biquad_cascade_df2T_instance_f32; + + /** + * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. + */ + typedef struct + { + uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + float32_t *pState; /**< points to the array of state coefficients. The array is of length 4*numStages. */ + float32_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ + } arm_biquad_cascade_stereo_df2T_instance_f32; + + /** + * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. + */ + typedef struct + { + uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + float64_t *pState; /**< points to the array of state coefficients. The array is of length 2*numStages. */ + float64_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ + } arm_biquad_cascade_df2T_instance_f64; + + + /** + * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. + * @param[in] S points to an instance of the filter data structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cascade_df2T_f32( + const arm_biquad_cascade_df2T_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. 2 channels + * @param[in] S points to an instance of the filter data structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cascade_stereo_df2T_f32( + const arm_biquad_cascade_stereo_df2T_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. + * @param[in] S points to an instance of the filter data structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cascade_df2T_f64( + const arm_biquad_cascade_df2T_instance_f64 * S, + float64_t * pSrc, + float64_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. + * @param[in,out] S points to an instance of the filter data structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + */ + void arm_biquad_cascade_df2T_init_f32( + arm_biquad_cascade_df2T_instance_f32 * S, + uint8_t numStages, + float32_t * pCoeffs, + float32_t * pState); + + + /** + * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. + * @param[in,out] S points to an instance of the filter data structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + */ + void arm_biquad_cascade_stereo_df2T_init_f32( + arm_biquad_cascade_stereo_df2T_instance_f32 * S, + uint8_t numStages, + float32_t * pCoeffs, + float32_t * pState); + + + /** + * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. + * @param[in,out] S points to an instance of the filter data structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + */ + void arm_biquad_cascade_df2T_init_f64( + arm_biquad_cascade_df2T_instance_f64 * S, + uint8_t numStages, + float64_t * pCoeffs, + float64_t * pState); + + + /** + * @brief Instance structure for the Q15 FIR lattice filter. + */ + typedef struct + { + uint16_t numStages; /**< number of filter stages. */ + q15_t *pState; /**< points to the state variable array. The array is of length numStages. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ + } arm_fir_lattice_instance_q15; + + /** + * @brief Instance structure for the Q31 FIR lattice filter. + */ + typedef struct + { + uint16_t numStages; /**< number of filter stages. */ + q31_t *pState; /**< points to the state variable array. The array is of length numStages. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ + } arm_fir_lattice_instance_q31; + + /** + * @brief Instance structure for the floating-point FIR lattice filter. + */ + typedef struct + { + uint16_t numStages; /**< number of filter stages. */ + float32_t *pState; /**< points to the state variable array. The array is of length numStages. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ + } arm_fir_lattice_instance_f32; + + + /** + * @brief Initialization function for the Q15 FIR lattice filter. + * @param[in] S points to an instance of the Q15 FIR lattice structure. + * @param[in] numStages number of filter stages. + * @param[in] pCoeffs points to the coefficient buffer. The array is of length numStages. + * @param[in] pState points to the state buffer. The array is of length numStages. + */ + void arm_fir_lattice_init_q15( + arm_fir_lattice_instance_q15 * S, + uint16_t numStages, + q15_t * pCoeffs, + q15_t * pState); + + + /** + * @brief Processing function for the Q15 FIR lattice filter. + * @param[in] S points to an instance of the Q15 FIR lattice structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_fir_lattice_q15( + const arm_fir_lattice_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q31 FIR lattice filter. + * @param[in] S points to an instance of the Q31 FIR lattice structure. + * @param[in] numStages number of filter stages. + * @param[in] pCoeffs points to the coefficient buffer. The array is of length numStages. + * @param[in] pState points to the state buffer. The array is of length numStages. + */ + void arm_fir_lattice_init_q31( + arm_fir_lattice_instance_q31 * S, + uint16_t numStages, + q31_t * pCoeffs, + q31_t * pState); + + + /** + * @brief Processing function for the Q31 FIR lattice filter. + * @param[in] S points to an instance of the Q31 FIR lattice structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of samples to process. + */ + void arm_fir_lattice_q31( + const arm_fir_lattice_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + +/** + * @brief Initialization function for the floating-point FIR lattice filter. + * @param[in] S points to an instance of the floating-point FIR lattice structure. + * @param[in] numStages number of filter stages. + * @param[in] pCoeffs points to the coefficient buffer. The array is of length numStages. + * @param[in] pState points to the state buffer. The array is of length numStages. + */ + void arm_fir_lattice_init_f32( + arm_fir_lattice_instance_f32 * S, + uint16_t numStages, + float32_t * pCoeffs, + float32_t * pState); + + + /** + * @brief Processing function for the floating-point FIR lattice filter. + * @param[in] S points to an instance of the floating-point FIR lattice structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of samples to process. + */ + void arm_fir_lattice_f32( + const arm_fir_lattice_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Instance structure for the Q15 IIR lattice filter. + */ + typedef struct + { + uint16_t numStages; /**< number of stages in the filter. */ + q15_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ + q15_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ + q15_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ + } arm_iir_lattice_instance_q15; + + /** + * @brief Instance structure for the Q31 IIR lattice filter. + */ + typedef struct + { + uint16_t numStages; /**< number of stages in the filter. */ + q31_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ + q31_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ + q31_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ + } arm_iir_lattice_instance_q31; + + /** + * @brief Instance structure for the floating-point IIR lattice filter. + */ + typedef struct + { + uint16_t numStages; /**< number of stages in the filter. */ + float32_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ + float32_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ + float32_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ + } arm_iir_lattice_instance_f32; + + + /** + * @brief Processing function for the floating-point IIR lattice filter. + * @param[in] S points to an instance of the floating-point IIR lattice structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_iir_lattice_f32( + const arm_iir_lattice_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the floating-point IIR lattice filter. + * @param[in] S points to an instance of the floating-point IIR lattice structure. + * @param[in] numStages number of stages in the filter. + * @param[in] pkCoeffs points to the reflection coefficient buffer. The array is of length numStages. + * @param[in] pvCoeffs points to the ladder coefficient buffer. The array is of length numStages+1. + * @param[in] pState points to the state buffer. The array is of length numStages+blockSize-1. + * @param[in] blockSize number of samples to process. + */ + void arm_iir_lattice_init_f32( + arm_iir_lattice_instance_f32 * S, + uint16_t numStages, + float32_t * pkCoeffs, + float32_t * pvCoeffs, + float32_t * pState, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q31 IIR lattice filter. + * @param[in] S points to an instance of the Q31 IIR lattice structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_iir_lattice_q31( + const arm_iir_lattice_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q31 IIR lattice filter. + * @param[in] S points to an instance of the Q31 IIR lattice structure. + * @param[in] numStages number of stages in the filter. + * @param[in] pkCoeffs points to the reflection coefficient buffer. The array is of length numStages. + * @param[in] pvCoeffs points to the ladder coefficient buffer. The array is of length numStages+1. + * @param[in] pState points to the state buffer. The array is of length numStages+blockSize. + * @param[in] blockSize number of samples to process. + */ + void arm_iir_lattice_init_q31( + arm_iir_lattice_instance_q31 * S, + uint16_t numStages, + q31_t * pkCoeffs, + q31_t * pvCoeffs, + q31_t * pState, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q15 IIR lattice filter. + * @param[in] S points to an instance of the Q15 IIR lattice structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_iir_lattice_q15( + const arm_iir_lattice_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + +/** + * @brief Initialization function for the Q15 IIR lattice filter. + * @param[in] S points to an instance of the fixed-point Q15 IIR lattice structure. + * @param[in] numStages number of stages in the filter. + * @param[in] pkCoeffs points to reflection coefficient buffer. The array is of length numStages. + * @param[in] pvCoeffs points to ladder coefficient buffer. The array is of length numStages+1. + * @param[in] pState points to state buffer. The array is of length numStages+blockSize. + * @param[in] blockSize number of samples to process per call. + */ + void arm_iir_lattice_init_q15( + arm_iir_lattice_instance_q15 * S, + uint16_t numStages, + q15_t * pkCoeffs, + q15_t * pvCoeffs, + q15_t * pState, + uint32_t blockSize); + + + /** + * @brief Instance structure for the floating-point LMS filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + float32_t mu; /**< step size that controls filter coefficient updates. */ + } arm_lms_instance_f32; + + + /** + * @brief Processing function for floating-point LMS filter. + * @param[in] S points to an instance of the floating-point LMS filter structure. + * @param[in] pSrc points to the block of input data. + * @param[in] pRef points to the block of reference data. + * @param[out] pOut points to the block of output data. + * @param[out] pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + */ + void arm_lms_f32( + const arm_lms_instance_f32 * S, + float32_t * pSrc, + float32_t * pRef, + float32_t * pOut, + float32_t * pErr, + uint32_t blockSize); + + + /** + * @brief Initialization function for floating-point LMS filter. + * @param[in] S points to an instance of the floating-point LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] pCoeffs points to the coefficient buffer. + * @param[in] pState points to state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + */ + void arm_lms_init_f32( + arm_lms_instance_f32 * S, + uint16_t numTaps, + float32_t * pCoeffs, + float32_t * pState, + float32_t mu, + uint32_t blockSize); + + + /** + * @brief Instance structure for the Q15 LMS filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + q15_t mu; /**< step size that controls filter coefficient updates. */ + uint32_t postShift; /**< bit shift applied to coefficients. */ + } arm_lms_instance_q15; + + + /** + * @brief Initialization function for the Q15 LMS filter. + * @param[in] S points to an instance of the Q15 LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] pCoeffs points to the coefficient buffer. + * @param[in] pState points to the state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + * @param[in] postShift bit shift applied to coefficients. + */ + void arm_lms_init_q15( + arm_lms_instance_q15 * S, + uint16_t numTaps, + q15_t * pCoeffs, + q15_t * pState, + q15_t mu, + uint32_t blockSize, + uint32_t postShift); + + + /** + * @brief Processing function for Q15 LMS filter. + * @param[in] S points to an instance of the Q15 LMS filter structure. + * @param[in] pSrc points to the block of input data. + * @param[in] pRef points to the block of reference data. + * @param[out] pOut points to the block of output data. + * @param[out] pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + */ + void arm_lms_q15( + const arm_lms_instance_q15 * S, + q15_t * pSrc, + q15_t * pRef, + q15_t * pOut, + q15_t * pErr, + uint32_t blockSize); + + + /** + * @brief Instance structure for the Q31 LMS filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + q31_t mu; /**< step size that controls filter coefficient updates. */ + uint32_t postShift; /**< bit shift applied to coefficients. */ + } arm_lms_instance_q31; + + + /** + * @brief Processing function for Q31 LMS filter. + * @param[in] S points to an instance of the Q15 LMS filter structure. + * @param[in] pSrc points to the block of input data. + * @param[in] pRef points to the block of reference data. + * @param[out] pOut points to the block of output data. + * @param[out] pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + */ + void arm_lms_q31( + const arm_lms_instance_q31 * S, + q31_t * pSrc, + q31_t * pRef, + q31_t * pOut, + q31_t * pErr, + uint32_t blockSize); + + + /** + * @brief Initialization function for Q31 LMS filter. + * @param[in] S points to an instance of the Q31 LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] pCoeffs points to coefficient buffer. + * @param[in] pState points to state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + * @param[in] postShift bit shift applied to coefficients. + */ + void arm_lms_init_q31( + arm_lms_instance_q31 * S, + uint16_t numTaps, + q31_t * pCoeffs, + q31_t * pState, + q31_t mu, + uint32_t blockSize, + uint32_t postShift); + + + /** + * @brief Instance structure for the floating-point normalized LMS filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + float32_t mu; /**< step size that control filter coefficient updates. */ + float32_t energy; /**< saves previous frame energy. */ + float32_t x0; /**< saves previous input sample. */ + } arm_lms_norm_instance_f32; + + + /** + * @brief Processing function for floating-point normalized LMS filter. + * @param[in] S points to an instance of the floating-point normalized LMS filter structure. + * @param[in] pSrc points to the block of input data. + * @param[in] pRef points to the block of reference data. + * @param[out] pOut points to the block of output data. + * @param[out] pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + */ + void arm_lms_norm_f32( + arm_lms_norm_instance_f32 * S, + float32_t * pSrc, + float32_t * pRef, + float32_t * pOut, + float32_t * pErr, + uint32_t blockSize); + + + /** + * @brief Initialization function for floating-point normalized LMS filter. + * @param[in] S points to an instance of the floating-point LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] pCoeffs points to coefficient buffer. + * @param[in] pState points to state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + */ + void arm_lms_norm_init_f32( + arm_lms_norm_instance_f32 * S, + uint16_t numTaps, + float32_t * pCoeffs, + float32_t * pState, + float32_t mu, + uint32_t blockSize); + + + /** + * @brief Instance structure for the Q31 normalized LMS filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + q31_t mu; /**< step size that controls filter coefficient updates. */ + uint8_t postShift; /**< bit shift applied to coefficients. */ + q31_t *recipTable; /**< points to the reciprocal initial value table. */ + q31_t energy; /**< saves previous frame energy. */ + q31_t x0; /**< saves previous input sample. */ + } arm_lms_norm_instance_q31; + + + /** + * @brief Processing function for Q31 normalized LMS filter. + * @param[in] S points to an instance of the Q31 normalized LMS filter structure. + * @param[in] pSrc points to the block of input data. + * @param[in] pRef points to the block of reference data. + * @param[out] pOut points to the block of output data. + * @param[out] pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + */ + void arm_lms_norm_q31( + arm_lms_norm_instance_q31 * S, + q31_t * pSrc, + q31_t * pRef, + q31_t * pOut, + q31_t * pErr, + uint32_t blockSize); + + + /** + * @brief Initialization function for Q31 normalized LMS filter. + * @param[in] S points to an instance of the Q31 normalized LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] pCoeffs points to coefficient buffer. + * @param[in] pState points to state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + * @param[in] postShift bit shift applied to coefficients. + */ + void arm_lms_norm_init_q31( + arm_lms_norm_instance_q31 * S, + uint16_t numTaps, + q31_t * pCoeffs, + q31_t * pState, + q31_t mu, + uint32_t blockSize, + uint8_t postShift); + + + /** + * @brief Instance structure for the Q15 normalized LMS filter. + */ + typedef struct + { + uint16_t numTaps; /**< Number of coefficients in the filter. */ + q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + q15_t mu; /**< step size that controls filter coefficient updates. */ + uint8_t postShift; /**< bit shift applied to coefficients. */ + q15_t *recipTable; /**< Points to the reciprocal initial value table. */ + q15_t energy; /**< saves previous frame energy. */ + q15_t x0; /**< saves previous input sample. */ + } arm_lms_norm_instance_q15; + + + /** + * @brief Processing function for Q15 normalized LMS filter. + * @param[in] S points to an instance of the Q15 normalized LMS filter structure. + * @param[in] pSrc points to the block of input data. + * @param[in] pRef points to the block of reference data. + * @param[out] pOut points to the block of output data. + * @param[out] pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + */ + void arm_lms_norm_q15( + arm_lms_norm_instance_q15 * S, + q15_t * pSrc, + q15_t * pRef, + q15_t * pOut, + q15_t * pErr, + uint32_t blockSize); + + + /** + * @brief Initialization function for Q15 normalized LMS filter. + * @param[in] S points to an instance of the Q15 normalized LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] pCoeffs points to coefficient buffer. + * @param[in] pState points to state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + * @param[in] postShift bit shift applied to coefficients. + */ + void arm_lms_norm_init_q15( + arm_lms_norm_instance_q15 * S, + uint16_t numTaps, + q15_t * pCoeffs, + q15_t * pState, + q15_t mu, + uint32_t blockSize, + uint8_t postShift); + + + /** + * @brief Correlation of floating-point sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + */ + void arm_correlate_f32( + float32_t * pSrcA, + uint32_t srcALen, + float32_t * pSrcB, + uint32_t srcBLen, + float32_t * pDst); + + + /** + * @brief Correlation of Q15 sequences + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + * @param[in] pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + */ + void arm_correlate_opt_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + q15_t * pScratch); + + + /** + * @brief Correlation of Q15 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + */ + + void arm_correlate_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst); + + + /** + * @brief Correlation of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + */ + + void arm_correlate_fast_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst); + + + /** + * @brief Correlation of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + * @param[in] pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + */ + void arm_correlate_fast_opt_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + q15_t * pScratch); + + + /** + * @brief Correlation of Q31 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + */ + void arm_correlate_q31( + q31_t * pSrcA, + uint32_t srcALen, + q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst); + + + /** + * @brief Correlation of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + */ + void arm_correlate_fast_q31( + q31_t * pSrcA, + uint32_t srcALen, + q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst); + + + /** + * @brief Correlation of Q7 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + * @param[in] pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + * @param[in] pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). + */ + void arm_correlate_opt_q7( + q7_t * pSrcA, + uint32_t srcALen, + q7_t * pSrcB, + uint32_t srcBLen, + q7_t * pDst, + q15_t * pScratch1, + q15_t * pScratch2); + + + /** + * @brief Correlation of Q7 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + */ + void arm_correlate_q7( + q7_t * pSrcA, + uint32_t srcALen, + q7_t * pSrcB, + uint32_t srcBLen, + q7_t * pDst); + + + /** + * @brief Instance structure for the floating-point sparse FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ + float32_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ + int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ + } arm_fir_sparse_instance_f32; + + /** + * @brief Instance structure for the Q31 sparse FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ + q31_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ + int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ + } arm_fir_sparse_instance_q31; + + /** + * @brief Instance structure for the Q15 sparse FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ + q15_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ + int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ + } arm_fir_sparse_instance_q15; + + /** + * @brief Instance structure for the Q7 sparse FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ + q7_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ + q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ + int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ + } arm_fir_sparse_instance_q7; + + + /** + * @brief Processing function for the floating-point sparse FIR filter. + * @param[in] S points to an instance of the floating-point sparse FIR structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] pScratchIn points to a temporary buffer of size blockSize. + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_sparse_f32( + arm_fir_sparse_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + float32_t * pScratchIn, + uint32_t blockSize); + + + /** + * @brief Initialization function for the floating-point sparse FIR filter. + * @param[in,out] S points to an instance of the floating-point sparse FIR structure. + * @param[in] numTaps number of nonzero coefficients in the filter. + * @param[in] pCoeffs points to the array of filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] pTapDelay points to the array of offset times. + * @param[in] maxDelay maximum offset time supported. + * @param[in] blockSize number of samples that will be processed per block. + */ + void arm_fir_sparse_init_f32( + arm_fir_sparse_instance_f32 * S, + uint16_t numTaps, + float32_t * pCoeffs, + float32_t * pState, + int32_t * pTapDelay, + uint16_t maxDelay, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q31 sparse FIR filter. + * @param[in] S points to an instance of the Q31 sparse FIR structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] pScratchIn points to a temporary buffer of size blockSize. + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_sparse_q31( + arm_fir_sparse_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + q31_t * pScratchIn, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q31 sparse FIR filter. + * @param[in,out] S points to an instance of the Q31 sparse FIR structure. + * @param[in] numTaps number of nonzero coefficients in the filter. + * @param[in] pCoeffs points to the array of filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] pTapDelay points to the array of offset times. + * @param[in] maxDelay maximum offset time supported. + * @param[in] blockSize number of samples that will be processed per block. + */ + void arm_fir_sparse_init_q31( + arm_fir_sparse_instance_q31 * S, + uint16_t numTaps, + q31_t * pCoeffs, + q31_t * pState, + int32_t * pTapDelay, + uint16_t maxDelay, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q15 sparse FIR filter. + * @param[in] S points to an instance of the Q15 sparse FIR structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] pScratchIn points to a temporary buffer of size blockSize. + * @param[in] pScratchOut points to a temporary buffer of size blockSize. + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_sparse_q15( + arm_fir_sparse_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + q15_t * pScratchIn, + q31_t * pScratchOut, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q15 sparse FIR filter. + * @param[in,out] S points to an instance of the Q15 sparse FIR structure. + * @param[in] numTaps number of nonzero coefficients in the filter. + * @param[in] pCoeffs points to the array of filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] pTapDelay points to the array of offset times. + * @param[in] maxDelay maximum offset time supported. + * @param[in] blockSize number of samples that will be processed per block. + */ + void arm_fir_sparse_init_q15( + arm_fir_sparse_instance_q15 * S, + uint16_t numTaps, + q15_t * pCoeffs, + q15_t * pState, + int32_t * pTapDelay, + uint16_t maxDelay, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q7 sparse FIR filter. + * @param[in] S points to an instance of the Q7 sparse FIR structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] pScratchIn points to a temporary buffer of size blockSize. + * @param[in] pScratchOut points to a temporary buffer of size blockSize. + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_sparse_q7( + arm_fir_sparse_instance_q7 * S, + q7_t * pSrc, + q7_t * pDst, + q7_t * pScratchIn, + q31_t * pScratchOut, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q7 sparse FIR filter. + * @param[in,out] S points to an instance of the Q7 sparse FIR structure. + * @param[in] numTaps number of nonzero coefficients in the filter. + * @param[in] pCoeffs points to the array of filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] pTapDelay points to the array of offset times. + * @param[in] maxDelay maximum offset time supported. + * @param[in] blockSize number of samples that will be processed per block. + */ + void arm_fir_sparse_init_q7( + arm_fir_sparse_instance_q7 * S, + uint16_t numTaps, + q7_t * pCoeffs, + q7_t * pState, + int32_t * pTapDelay, + uint16_t maxDelay, + uint32_t blockSize); + + + /** + * @brief Floating-point sin_cos function. + * @param[in] theta input value in degrees + * @param[out] pSinVal points to the processed sine output. + * @param[out] pCosVal points to the processed cos output. + */ + void arm_sin_cos_f32( + float32_t theta, + float32_t * pSinVal, + float32_t * pCosVal); + + + /** + * @brief Q31 sin_cos function. + * @param[in] theta scaled input value in degrees + * @param[out] pSinVal points to the processed sine output. + * @param[out] pCosVal points to the processed cosine output. + */ + void arm_sin_cos_q31( + q31_t theta, + q31_t * pSinVal, + q31_t * pCosVal); + + + /** + * @brief Floating-point complex conjugate. + * @param[in] pSrc points to the input vector + * @param[out] pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + */ + void arm_cmplx_conj_f32( + float32_t * pSrc, + float32_t * pDst, + uint32_t numSamples); + + /** + * @brief Q31 complex conjugate. + * @param[in] pSrc points to the input vector + * @param[out] pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + */ + void arm_cmplx_conj_q31( + q31_t * pSrc, + q31_t * pDst, + uint32_t numSamples); + + + /** + * @brief Q15 complex conjugate. + * @param[in] pSrc points to the input vector + * @param[out] pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + */ + void arm_cmplx_conj_q15( + q15_t * pSrc, + q15_t * pDst, + uint32_t numSamples); + + + /** + * @brief Floating-point complex magnitude squared + * @param[in] pSrc points to the complex input vector + * @param[out] pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + */ + void arm_cmplx_mag_squared_f32( + float32_t * pSrc, + float32_t * pDst, + uint32_t numSamples); + + + /** + * @brief Q31 complex magnitude squared + * @param[in] pSrc points to the complex input vector + * @param[out] pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + */ + void arm_cmplx_mag_squared_q31( + q31_t * pSrc, + q31_t * pDst, + uint32_t numSamples); + + + /** + * @brief Q15 complex magnitude squared + * @param[in] pSrc points to the complex input vector + * @param[out] pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + */ + void arm_cmplx_mag_squared_q15( + q15_t * pSrc, + q15_t * pDst, + uint32_t numSamples); + + + /** + * @ingroup groupController + */ + + /** + * @defgroup PID PID Motor Control + * + * A Proportional Integral Derivative (PID) controller is a generic feedback control + * loop mechanism widely used in industrial control systems. + * A PID controller is the most commonly used type of feedback controller. + * + * This set of functions implements (PID) controllers + * for Q15, Q31, and floating-point data types. The functions operate on a single sample + * of data and each call to the function returns a single processed value. + * S points to an instance of the PID control data structure. in + * is the input sample value. The functions return the output value. + * + * \par Algorithm: + *
+   *    y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2]
+   *    A0 = Kp + Ki + Kd
+   *    A1 = (-Kp ) - (2 * Kd )
+   *    A2 = Kd  
+ * + * \par + * where \c Kp is proportional constant, \c Ki is Integral constant and \c Kd is Derivative constant + * + * \par + * \image html PID.gif "Proportional Integral Derivative Controller" + * + * \par + * The PID controller calculates an "error" value as the difference between + * the measured output and the reference input. + * The controller attempts to minimize the error by adjusting the process control inputs. + * The proportional value determines the reaction to the current error, + * the integral value determines the reaction based on the sum of recent errors, + * and the derivative value determines the reaction based on the rate at which the error has been changing. + * + * \par Instance Structure + * The Gains A0, A1, A2 and state variables for a PID controller are stored together in an instance data structure. + * A separate instance structure must be defined for each PID Controller. + * There are separate instance structure declarations for each of the 3 supported data types. + * + * \par Reset Functions + * There is also an associated reset function for each data type which clears the state array. + * + * \par Initialization Functions + * There is also an associated initialization function for each data type. + * The initialization function performs the following operations: + * - Initializes the Gains A0, A1, A2 from Kp,Ki, Kd gains. + * - Zeros out the values in the state buffer. + * + * \par + * Instance structure cannot be placed into a const data section and it is recommended to use the initialization function. + * + * \par Fixed-Point Behavior + * Care must be taken when using the fixed-point versions of the PID Controller functions. + * In particular, the overflow and saturation behavior of the accumulator used in each function must be considered. + * Refer to the function specific documentation below for usage guidelines. + */ + + /** + * @addtogroup PID + * @{ + */ + + /** + * @brief Process function for the floating-point PID Control. + * @param[in,out] S is an instance of the floating-point PID Control structure + * @param[in] in input sample to process + * @return out processed output sample. + */ + CMSIS_INLINE __STATIC_INLINE float32_t arm_pid_f32( + arm_pid_instance_f32 * S, + float32_t in) + { + float32_t out; + + /* y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2] */ + out = (S->A0 * in) + + (S->A1 * S->state[0]) + (S->A2 * S->state[1]) + (S->state[2]); + + /* Update state */ + S->state[1] = S->state[0]; + S->state[0] = in; + S->state[2] = out; + + /* return to application */ + return (out); + + } + + /** + * @brief Process function for the Q31 PID Control. + * @param[in,out] S points to an instance of the Q31 PID Control structure + * @param[in] in input sample to process + * @return out processed output sample. + * + * Scaling and Overflow Behavior: + * \par + * The function is implemented using an internal 64-bit accumulator. + * The accumulator has a 2.62 format and maintains full precision of the intermediate multiplication results but provides only a single guard bit. + * Thus, if the accumulator result overflows it wraps around rather than clip. + * In order to avoid overflows completely the input signal must be scaled down by 2 bits as there are four additions. + * After all multiply-accumulates are performed, the 2.62 accumulator is truncated to 1.32 format and then saturated to 1.31 format. + */ + CMSIS_INLINE __STATIC_INLINE q31_t arm_pid_q31( + arm_pid_instance_q31 * S, + q31_t in) + { + q63_t acc; + q31_t out; + + /* acc = A0 * x[n] */ + acc = (q63_t) S->A0 * in; + + /* acc += A1 * x[n-1] */ + acc += (q63_t) S->A1 * S->state[0]; + + /* acc += A2 * x[n-2] */ + acc += (q63_t) S->A2 * S->state[1]; + + /* convert output to 1.31 format to add y[n-1] */ + out = (q31_t) (acc >> 31u); + + /* out += y[n-1] */ + out += S->state[2]; + + /* Update state */ + S->state[1] = S->state[0]; + S->state[0] = in; + S->state[2] = out; + + /* return to application */ + return (out); + } + + + /** + * @brief Process function for the Q15 PID Control. + * @param[in,out] S points to an instance of the Q15 PID Control structure + * @param[in] in input sample to process + * @return out processed output sample. + * + * Scaling and Overflow Behavior: + * \par + * The function is implemented using a 64-bit internal accumulator. + * Both Gains and state variables are represented in 1.15 format and multiplications yield a 2.30 result. + * The 2.30 intermediate results are accumulated in a 64-bit accumulator in 34.30 format. + * There is no risk of internal overflow with this approach and the full precision of intermediate multiplications is preserved. + * After all additions have been performed, the accumulator is truncated to 34.15 format by discarding low 15 bits. + * Lastly, the accumulator is saturated to yield a result in 1.15 format. + */ + CMSIS_INLINE __STATIC_INLINE q15_t arm_pid_q15( + arm_pid_instance_q15 * S, + q15_t in) + { + q63_t acc; + q15_t out; + +#if defined (ARM_MATH_DSP) + __SIMD32_TYPE *vstate; + + /* Implementation of PID controller */ + + /* acc = A0 * x[n] */ + acc = (q31_t) __SMUAD((uint32_t)S->A0, (uint32_t)in); + + /* acc += A1 * x[n-1] + A2 * x[n-2] */ + vstate = __SIMD32_CONST(S->state); + acc = (q63_t)__SMLALD((uint32_t)S->A1, (uint32_t)*vstate, (uint64_t)acc); +#else + /* acc = A0 * x[n] */ + acc = ((q31_t) S->A0) * in; + + /* acc += A1 * x[n-1] + A2 * x[n-2] */ + acc += (q31_t) S->A1 * S->state[0]; + acc += (q31_t) S->A2 * S->state[1]; +#endif + + /* acc += y[n-1] */ + acc += (q31_t) S->state[2] << 15; + + /* saturate the output */ + out = (q15_t) (__SSAT((acc >> 15), 16)); + + /* Update state */ + S->state[1] = S->state[0]; + S->state[0] = in; + S->state[2] = out; + + /* return to application */ + return (out); + } + + /** + * @} end of PID group + */ + + + /** + * @brief Floating-point matrix inverse. + * @param[in] src points to the instance of the input floating-point matrix structure. + * @param[out] dst points to the instance of the output floating-point matrix structure. + * @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match. + * If the input matrix is singular (does not have an inverse), then the algorithm terminates and returns error status ARM_MATH_SINGULAR. + */ + arm_status arm_mat_inverse_f32( + const arm_matrix_instance_f32 * src, + arm_matrix_instance_f32 * dst); + + + /** + * @brief Floating-point matrix inverse. + * @param[in] src points to the instance of the input floating-point matrix structure. + * @param[out] dst points to the instance of the output floating-point matrix structure. + * @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match. + * If the input matrix is singular (does not have an inverse), then the algorithm terminates and returns error status ARM_MATH_SINGULAR. + */ + arm_status arm_mat_inverse_f64( + const arm_matrix_instance_f64 * src, + arm_matrix_instance_f64 * dst); + + + + /** + * @ingroup groupController + */ + + /** + * @defgroup clarke Vector Clarke Transform + * Forward Clarke transform converts the instantaneous stator phases into a two-coordinate time invariant vector. + * Generally the Clarke transform uses three-phase currents Ia, Ib and Ic to calculate currents + * in the two-phase orthogonal stator axis Ialpha and Ibeta. + * When Ialpha is superposed with Ia as shown in the figure below + * \image html clarke.gif Stator current space vector and its components in (a,b). + * and Ia + Ib + Ic = 0, in this condition Ialpha and Ibeta + * can be calculated using only Ia and Ib. + * + * The function operates on a single sample of data and each call to the function returns the processed output. + * The library provides separate functions for Q31 and floating-point data types. + * \par Algorithm + * \image html clarkeFormula.gif + * where Ia and Ib are the instantaneous stator phases and + * pIalpha and pIbeta are the two coordinates of time invariant vector. + * \par Fixed-Point Behavior + * Care must be taken when using the Q31 version of the Clarke transform. + * In particular, the overflow and saturation behavior of the accumulator used must be considered. + * Refer to the function specific documentation below for usage guidelines. + */ + + /** + * @addtogroup clarke + * @{ + */ + + /** + * + * @brief Floating-point Clarke transform + * @param[in] Ia input three-phase coordinate a + * @param[in] Ib input three-phase coordinate b + * @param[out] pIalpha points to output two-phase orthogonal vector axis alpha + * @param[out] pIbeta points to output two-phase orthogonal vector axis beta + */ + CMSIS_INLINE __STATIC_INLINE void arm_clarke_f32( + float32_t Ia, + float32_t Ib, + float32_t * pIalpha, + float32_t * pIbeta) + { + /* Calculate pIalpha using the equation, pIalpha = Ia */ + *pIalpha = Ia; + + /* Calculate pIbeta using the equation, pIbeta = (1/sqrt(3)) * Ia + (2/sqrt(3)) * Ib */ + *pIbeta = ((float32_t) 0.57735026919 * Ia + (float32_t) 1.15470053838 * Ib); + } + + + /** + * @brief Clarke transform for Q31 version + * @param[in] Ia input three-phase coordinate a + * @param[in] Ib input three-phase coordinate b + * @param[out] pIalpha points to output two-phase orthogonal vector axis alpha + * @param[out] pIbeta points to output two-phase orthogonal vector axis beta + * + * Scaling and Overflow Behavior: + * \par + * The function is implemented using an internal 32-bit accumulator. + * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. + * There is saturation on the addition, hence there is no risk of overflow. + */ + CMSIS_INLINE __STATIC_INLINE void arm_clarke_q31( + q31_t Ia, + q31_t Ib, + q31_t * pIalpha, + q31_t * pIbeta) + { + q31_t product1, product2; /* Temporary variables used to store intermediate results */ + + /* Calculating pIalpha from Ia by equation pIalpha = Ia */ + *pIalpha = Ia; + + /* Intermediate product is calculated by (1/(sqrt(3)) * Ia) */ + product1 = (q31_t) (((q63_t) Ia * 0x24F34E8B) >> 30); + + /* Intermediate product is calculated by (2/sqrt(3) * Ib) */ + product2 = (q31_t) (((q63_t) Ib * 0x49E69D16) >> 30); + + /* pIbeta is calculated by adding the intermediate products */ + *pIbeta = __QADD(product1, product2); + } + + /** + * @} end of clarke group + */ + + /** + * @brief Converts the elements of the Q7 vector to Q31 vector. + * @param[in] pSrc input pointer + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_q7_to_q31( + q7_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + + /** + * @ingroup groupController + */ + + /** + * @defgroup inv_clarke Vector Inverse Clarke Transform + * Inverse Clarke transform converts the two-coordinate time invariant vector into instantaneous stator phases. + * + * The function operates on a single sample of data and each call to the function returns the processed output. + * The library provides separate functions for Q31 and floating-point data types. + * \par Algorithm + * \image html clarkeInvFormula.gif + * where pIa and pIb are the instantaneous stator phases and + * Ialpha and Ibeta are the two coordinates of time invariant vector. + * \par Fixed-Point Behavior + * Care must be taken when using the Q31 version of the Clarke transform. + * In particular, the overflow and saturation behavior of the accumulator used must be considered. + * Refer to the function specific documentation below for usage guidelines. + */ + + /** + * @addtogroup inv_clarke + * @{ + */ + + /** + * @brief Floating-point Inverse Clarke transform + * @param[in] Ialpha input two-phase orthogonal vector axis alpha + * @param[in] Ibeta input two-phase orthogonal vector axis beta + * @param[out] pIa points to output three-phase coordinate a + * @param[out] pIb points to output three-phase coordinate b + */ + CMSIS_INLINE __STATIC_INLINE void arm_inv_clarke_f32( + float32_t Ialpha, + float32_t Ibeta, + float32_t * pIa, + float32_t * pIb) + { + /* Calculating pIa from Ialpha by equation pIa = Ialpha */ + *pIa = Ialpha; + + /* Calculating pIb from Ialpha and Ibeta by equation pIb = -(1/2) * Ialpha + (sqrt(3)/2) * Ibeta */ + *pIb = -0.5f * Ialpha + 0.8660254039f * Ibeta; + } + + + /** + * @brief Inverse Clarke transform for Q31 version + * @param[in] Ialpha input two-phase orthogonal vector axis alpha + * @param[in] Ibeta input two-phase orthogonal vector axis beta + * @param[out] pIa points to output three-phase coordinate a + * @param[out] pIb points to output three-phase coordinate b + * + * Scaling and Overflow Behavior: + * \par + * The function is implemented using an internal 32-bit accumulator. + * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. + * There is saturation on the subtraction, hence there is no risk of overflow. + */ + CMSIS_INLINE __STATIC_INLINE void arm_inv_clarke_q31( + q31_t Ialpha, + q31_t Ibeta, + q31_t * pIa, + q31_t * pIb) + { + q31_t product1, product2; /* Temporary variables used to store intermediate results */ + + /* Calculating pIa from Ialpha by equation pIa = Ialpha */ + *pIa = Ialpha; + + /* Intermediate product is calculated by (1/(2*sqrt(3)) * Ia) */ + product1 = (q31_t) (((q63_t) (Ialpha) * (0x40000000)) >> 31); + + /* Intermediate product is calculated by (1/sqrt(3) * pIb) */ + product2 = (q31_t) (((q63_t) (Ibeta) * (0x6ED9EBA1)) >> 31); + + /* pIb is calculated by subtracting the products */ + *pIb = __QSUB(product2, product1); + } + + /** + * @} end of inv_clarke group + */ + + /** + * @brief Converts the elements of the Q7 vector to Q15 vector. + * @param[in] pSrc input pointer + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_q7_to_q15( + q7_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + + /** + * @ingroup groupController + */ + + /** + * @defgroup park Vector Park Transform + * + * Forward Park transform converts the input two-coordinate vector to flux and torque components. + * The Park transform can be used to realize the transformation of the Ialpha and the Ibeta currents + * from the stationary to the moving reference frame and control the spatial relationship between + * the stator vector current and rotor flux vector. + * If we consider the d axis aligned with the rotor flux, the diagram below shows the + * current vector and the relationship from the two reference frames: + * \image html park.gif "Stator current space vector and its component in (a,b) and in the d,q rotating reference frame" + * + * The function operates on a single sample of data and each call to the function returns the processed output. + * The library provides separate functions for Q31 and floating-point data types. + * \par Algorithm + * \image html parkFormula.gif + * where Ialpha and Ibeta are the stator vector components, + * pId and pIq are rotor vector components and cosVal and sinVal are the + * cosine and sine values of theta (rotor flux position). + * \par Fixed-Point Behavior + * Care must be taken when using the Q31 version of the Park transform. + * In particular, the overflow and saturation behavior of the accumulator used must be considered. + * Refer to the function specific documentation below for usage guidelines. + */ + + /** + * @addtogroup park + * @{ + */ + + /** + * @brief Floating-point Park transform + * @param[in] Ialpha input two-phase vector coordinate alpha + * @param[in] Ibeta input two-phase vector coordinate beta + * @param[out] pId points to output rotor reference frame d + * @param[out] pIq points to output rotor reference frame q + * @param[in] sinVal sine value of rotation angle theta + * @param[in] cosVal cosine value of rotation angle theta + * + * The function implements the forward Park transform. + * + */ + CMSIS_INLINE __STATIC_INLINE void arm_park_f32( + float32_t Ialpha, + float32_t Ibeta, + float32_t * pId, + float32_t * pIq, + float32_t sinVal, + float32_t cosVal) + { + /* Calculate pId using the equation, pId = Ialpha * cosVal + Ibeta * sinVal */ + *pId = Ialpha * cosVal + Ibeta * sinVal; + + /* Calculate pIq using the equation, pIq = - Ialpha * sinVal + Ibeta * cosVal */ + *pIq = -Ialpha * sinVal + Ibeta * cosVal; + } + + + /** + * @brief Park transform for Q31 version + * @param[in] Ialpha input two-phase vector coordinate alpha + * @param[in] Ibeta input two-phase vector coordinate beta + * @param[out] pId points to output rotor reference frame d + * @param[out] pIq points to output rotor reference frame q + * @param[in] sinVal sine value of rotation angle theta + * @param[in] cosVal cosine value of rotation angle theta + * + * Scaling and Overflow Behavior: + * \par + * The function is implemented using an internal 32-bit accumulator. + * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. + * There is saturation on the addition and subtraction, hence there is no risk of overflow. + */ + CMSIS_INLINE __STATIC_INLINE void arm_park_q31( + q31_t Ialpha, + q31_t Ibeta, + q31_t * pId, + q31_t * pIq, + q31_t sinVal, + q31_t cosVal) + { + q31_t product1, product2; /* Temporary variables used to store intermediate results */ + q31_t product3, product4; /* Temporary variables used to store intermediate results */ + + /* Intermediate product is calculated by (Ialpha * cosVal) */ + product1 = (q31_t) (((q63_t) (Ialpha) * (cosVal)) >> 31); + + /* Intermediate product is calculated by (Ibeta * sinVal) */ + product2 = (q31_t) (((q63_t) (Ibeta) * (sinVal)) >> 31); + + + /* Intermediate product is calculated by (Ialpha * sinVal) */ + product3 = (q31_t) (((q63_t) (Ialpha) * (sinVal)) >> 31); + + /* Intermediate product is calculated by (Ibeta * cosVal) */ + product4 = (q31_t) (((q63_t) (Ibeta) * (cosVal)) >> 31); + + /* Calculate pId by adding the two intermediate products 1 and 2 */ + *pId = __QADD(product1, product2); + + /* Calculate pIq by subtracting the two intermediate products 3 from 4 */ + *pIq = __QSUB(product4, product3); + } + + /** + * @} end of park group + */ + + /** + * @brief Converts the elements of the Q7 vector to floating-point vector. + * @param[in] pSrc is input pointer + * @param[out] pDst is output pointer + * @param[in] blockSize is the number of samples to process + */ + void arm_q7_to_float( + q7_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @ingroup groupController + */ + + /** + * @defgroup inv_park Vector Inverse Park transform + * Inverse Park transform converts the input flux and torque components to two-coordinate vector. + * + * The function operates on a single sample of data and each call to the function returns the processed output. + * The library provides separate functions for Q31 and floating-point data types. + * \par Algorithm + * \image html parkInvFormula.gif + * where pIalpha and pIbeta are the stator vector components, + * Id and Iq are rotor vector components and cosVal and sinVal are the + * cosine and sine values of theta (rotor flux position). + * \par Fixed-Point Behavior + * Care must be taken when using the Q31 version of the Park transform. + * In particular, the overflow and saturation behavior of the accumulator used must be considered. + * Refer to the function specific documentation below for usage guidelines. + */ + + /** + * @addtogroup inv_park + * @{ + */ + + /** + * @brief Floating-point Inverse Park transform + * @param[in] Id input coordinate of rotor reference frame d + * @param[in] Iq input coordinate of rotor reference frame q + * @param[out] pIalpha points to output two-phase orthogonal vector axis alpha + * @param[out] pIbeta points to output two-phase orthogonal vector axis beta + * @param[in] sinVal sine value of rotation angle theta + * @param[in] cosVal cosine value of rotation angle theta + */ + CMSIS_INLINE __STATIC_INLINE void arm_inv_park_f32( + float32_t Id, + float32_t Iq, + float32_t * pIalpha, + float32_t * pIbeta, + float32_t sinVal, + float32_t cosVal) + { + /* Calculate pIalpha using the equation, pIalpha = Id * cosVal - Iq * sinVal */ + *pIalpha = Id * cosVal - Iq * sinVal; + + /* Calculate pIbeta using the equation, pIbeta = Id * sinVal + Iq * cosVal */ + *pIbeta = Id * sinVal + Iq * cosVal; + } + + + /** + * @brief Inverse Park transform for Q31 version + * @param[in] Id input coordinate of rotor reference frame d + * @param[in] Iq input coordinate of rotor reference frame q + * @param[out] pIalpha points to output two-phase orthogonal vector axis alpha + * @param[out] pIbeta points to output two-phase orthogonal vector axis beta + * @param[in] sinVal sine value of rotation angle theta + * @param[in] cosVal cosine value of rotation angle theta + * + * Scaling and Overflow Behavior: + * \par + * The function is implemented using an internal 32-bit accumulator. + * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. + * There is saturation on the addition, hence there is no risk of overflow. + */ + CMSIS_INLINE __STATIC_INLINE void arm_inv_park_q31( + q31_t Id, + q31_t Iq, + q31_t * pIalpha, + q31_t * pIbeta, + q31_t sinVal, + q31_t cosVal) + { + q31_t product1, product2; /* Temporary variables used to store intermediate results */ + q31_t product3, product4; /* Temporary variables used to store intermediate results */ + + /* Intermediate product is calculated by (Id * cosVal) */ + product1 = (q31_t) (((q63_t) (Id) * (cosVal)) >> 31); + + /* Intermediate product is calculated by (Iq * sinVal) */ + product2 = (q31_t) (((q63_t) (Iq) * (sinVal)) >> 31); + + + /* Intermediate product is calculated by (Id * sinVal) */ + product3 = (q31_t) (((q63_t) (Id) * (sinVal)) >> 31); + + /* Intermediate product is calculated by (Iq * cosVal) */ + product4 = (q31_t) (((q63_t) (Iq) * (cosVal)) >> 31); + + /* Calculate pIalpha by using the two intermediate products 1 and 2 */ + *pIalpha = __QSUB(product1, product2); + + /* Calculate pIbeta by using the two intermediate products 3 and 4 */ + *pIbeta = __QADD(product4, product3); + } + + /** + * @} end of Inverse park group + */ + + + /** + * @brief Converts the elements of the Q31 vector to floating-point vector. + * @param[in] pSrc is input pointer + * @param[out] pDst is output pointer + * @param[in] blockSize is the number of samples to process + */ + void arm_q31_to_float( + q31_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + /** + * @ingroup groupInterpolation + */ + + /** + * @defgroup LinearInterpolate Linear Interpolation + * + * Linear interpolation is a method of curve fitting using linear polynomials. + * Linear interpolation works by effectively drawing a straight line between two neighboring samples and returning the appropriate point along that line + * + * \par + * \image html LinearInterp.gif "Linear interpolation" + * + * \par + * A Linear Interpolate function calculates an output value(y), for the input(x) + * using linear interpolation of the input values x0, x1( nearest input values) and the output values y0 and y1(nearest output values) + * + * \par Algorithm: + *
+   *       y = y0 + (x - x0) * ((y1 - y0)/(x1-x0))
+   *       where x0, x1 are nearest values of input x
+   *             y0, y1 are nearest values to output y
+   * 
+ * + * \par + * This set of functions implements Linear interpolation process + * for Q7, Q15, Q31, and floating-point data types. The functions operate on a single + * sample of data and each call to the function returns a single processed value. + * S points to an instance of the Linear Interpolate function data structure. + * x is the input sample value. The functions returns the output value. + * + * \par + * if x is outside of the table boundary, Linear interpolation returns first value of the table + * if x is below input range and returns last value of table if x is above range. + */ + + /** + * @addtogroup LinearInterpolate + * @{ + */ + + /** + * @brief Process function for the floating-point Linear Interpolation Function. + * @param[in,out] S is an instance of the floating-point Linear Interpolation structure + * @param[in] x input sample to process + * @return y processed output sample. + * + */ + CMSIS_INLINE __STATIC_INLINE float32_t arm_linear_interp_f32( + arm_linear_interp_instance_f32 * S, + float32_t x) + { + float32_t y; + float32_t x0, x1; /* Nearest input values */ + float32_t y0, y1; /* Nearest output values */ + float32_t xSpacing = S->xSpacing; /* spacing between input values */ + int32_t i; /* Index variable */ + float32_t *pYData = S->pYData; /* pointer to output table */ + + /* Calculation of index */ + i = (int32_t) ((x - S->x1) / xSpacing); + + if (i < 0) + { + /* Iniatilize output for below specified range as least output value of table */ + y = pYData[0]; + } + else if ((uint32_t)i >= S->nValues) + { + /* Iniatilize output for above specified range as last output value of table */ + y = pYData[S->nValues - 1]; + } + else + { + /* Calculation of nearest input values */ + x0 = S->x1 + i * xSpacing; + x1 = S->x1 + (i + 1) * xSpacing; + + /* Read of nearest output values */ + y0 = pYData[i]; + y1 = pYData[i + 1]; + + /* Calculation of output */ + y = y0 + (x - x0) * ((y1 - y0) / (x1 - x0)); + + } + + /* returns output value */ + return (y); + } + + + /** + * + * @brief Process function for the Q31 Linear Interpolation Function. + * @param[in] pYData pointer to Q31 Linear Interpolation table + * @param[in] x input sample to process + * @param[in] nValues number of table values + * @return y processed output sample. + * + * \par + * Input sample x is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. + * This function can support maximum of table size 2^12. + * + */ + CMSIS_INLINE __STATIC_INLINE q31_t arm_linear_interp_q31( + q31_t * pYData, + q31_t x, + uint32_t nValues) + { + q31_t y; /* output */ + q31_t y0, y1; /* Nearest output values */ + q31_t fract; /* fractional part */ + int32_t index; /* Index to read nearest output values */ + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + index = ((x & (q31_t)0xFFF00000) >> 20); + + if (index >= (int32_t)(nValues - 1)) + { + return (pYData[nValues - 1]); + } + else if (index < 0) + { + return (pYData[0]); + } + else + { + /* 20 bits for the fractional part */ + /* shift left by 11 to keep fract in 1.31 format */ + fract = (x & 0x000FFFFF) << 11; + + /* Read two nearest output values from the index in 1.31(q31) format */ + y0 = pYData[index]; + y1 = pYData[index + 1]; + + /* Calculation of y0 * (1-fract) and y is in 2.30 format */ + y = ((q31_t) ((q63_t) y0 * (0x7FFFFFFF - fract) >> 32)); + + /* Calculation of y0 * (1-fract) + y1 *fract and y is in 2.30 format */ + y += ((q31_t) (((q63_t) y1 * fract) >> 32)); + + /* Convert y to 1.31 format */ + return (y << 1u); + } + } + + + /** + * + * @brief Process function for the Q15 Linear Interpolation Function. + * @param[in] pYData pointer to Q15 Linear Interpolation table + * @param[in] x input sample to process + * @param[in] nValues number of table values + * @return y processed output sample. + * + * \par + * Input sample x is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. + * This function can support maximum of table size 2^12. + * + */ + CMSIS_INLINE __STATIC_INLINE q15_t arm_linear_interp_q15( + q15_t * pYData, + q31_t x, + uint32_t nValues) + { + q63_t y; /* output */ + q15_t y0, y1; /* Nearest output values */ + q31_t fract; /* fractional part */ + int32_t index; /* Index to read nearest output values */ + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + index = ((x & (int32_t)0xFFF00000) >> 20); + + if (index >= (int32_t)(nValues - 1)) + { + return (pYData[nValues - 1]); + } + else if (index < 0) + { + return (pYData[0]); + } + else + { + /* 20 bits for the fractional part */ + /* fract is in 12.20 format */ + fract = (x & 0x000FFFFF); + + /* Read two nearest output values from the index */ + y0 = pYData[index]; + y1 = pYData[index + 1]; + + /* Calculation of y0 * (1-fract) and y is in 13.35 format */ + y = ((q63_t) y0 * (0xFFFFF - fract)); + + /* Calculation of (y0 * (1-fract) + y1 * fract) and y is in 13.35 format */ + y += ((q63_t) y1 * (fract)); + + /* convert y to 1.15 format */ + return (q15_t) (y >> 20); + } + } + + + /** + * + * @brief Process function for the Q7 Linear Interpolation Function. + * @param[in] pYData pointer to Q7 Linear Interpolation table + * @param[in] x input sample to process + * @param[in] nValues number of table values + * @return y processed output sample. + * + * \par + * Input sample x is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. + * This function can support maximum of table size 2^12. + */ + CMSIS_INLINE __STATIC_INLINE q7_t arm_linear_interp_q7( + q7_t * pYData, + q31_t x, + uint32_t nValues) + { + q31_t y; /* output */ + q7_t y0, y1; /* Nearest output values */ + q31_t fract; /* fractional part */ + uint32_t index; /* Index to read nearest output values */ + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + if (x < 0) + { + return (pYData[0]); + } + index = (x >> 20) & 0xfff; + + if (index >= (nValues - 1)) + { + return (pYData[nValues - 1]); + } + else + { + /* 20 bits for the fractional part */ + /* fract is in 12.20 format */ + fract = (x & 0x000FFFFF); + + /* Read two nearest output values from the index and are in 1.7(q7) format */ + y0 = pYData[index]; + y1 = pYData[index + 1]; + + /* Calculation of y0 * (1-fract ) and y is in 13.27(q27) format */ + y = ((y0 * (0xFFFFF - fract))); + + /* Calculation of y1 * fract + y0 * (1-fract) and y is in 13.27(q27) format */ + y += (y1 * fract); + + /* convert y to 1.7(q7) format */ + return (q7_t) (y >> 20); + } + } + + /** + * @} end of LinearInterpolate group + */ + + /** + * @brief Fast approximation to the trigonometric sine function for floating-point data. + * @param[in] x input value in radians. + * @return sin(x). + */ + float32_t arm_sin_f32( + float32_t x); + + + /** + * @brief Fast approximation to the trigonometric sine function for Q31 data. + * @param[in] x Scaled input value in radians. + * @return sin(x). + */ + q31_t arm_sin_q31( + q31_t x); + + + /** + * @brief Fast approximation to the trigonometric sine function for Q15 data. + * @param[in] x Scaled input value in radians. + * @return sin(x). + */ + q15_t arm_sin_q15( + q15_t x); + + + /** + * @brief Fast approximation to the trigonometric cosine function for floating-point data. + * @param[in] x input value in radians. + * @return cos(x). + */ + float32_t arm_cos_f32( + float32_t x); + + + /** + * @brief Fast approximation to the trigonometric cosine function for Q31 data. + * @param[in] x Scaled input value in radians. + * @return cos(x). + */ + q31_t arm_cos_q31( + q31_t x); + + + /** + * @brief Fast approximation to the trigonometric cosine function for Q15 data. + * @param[in] x Scaled input value in radians. + * @return cos(x). + */ + q15_t arm_cos_q15( + q15_t x); + + + /** + * @ingroup groupFastMath + */ + + + /** + * @defgroup SQRT Square Root + * + * Computes the square root of a number. + * There are separate functions for Q15, Q31, and floating-point data types. + * The square root function is computed using the Newton-Raphson algorithm. + * This is an iterative algorithm of the form: + *
+   *      x1 = x0 - f(x0)/f'(x0)
+   * 
+ * where x1 is the current estimate, + * x0 is the previous estimate, and + * f'(x0) is the derivative of f() evaluated at x0. + * For the square root function, the algorithm reduces to: + *
+   *     x0 = in/2                         [initial guess]
+   *     x1 = 1/2 * ( x0 + in / x0)        [each iteration]
+   * 
+ */ + + + /** + * @addtogroup SQRT + * @{ + */ + + /** + * @brief Floating-point square root function. + * @param[in] in input value. + * @param[out] pOut square root of input value. + * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if + * in is negative value and returns zero output for negative values. + */ + CMSIS_INLINE __STATIC_INLINE arm_status arm_sqrt_f32( + float32_t in, + float32_t * pOut) + { + if (in >= 0.0f) + { + +#if (__FPU_USED == 1) && defined ( __CC_ARM ) + *pOut = __sqrtf(in); +#elif (__FPU_USED == 1) && (defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)) + *pOut = __builtin_sqrtf(in); +#elif (__FPU_USED == 1) && defined(__GNUC__) + *pOut = __builtin_sqrtf(in); +#elif (__FPU_USED == 1) && defined ( __ICCARM__ ) && (__VER__ >= 6040000) + __ASM("VSQRT.F32 %0,%1" : "=t"(*pOut) : "t"(in)); +#else + *pOut = sqrtf(in); +#endif + + return (ARM_MATH_SUCCESS); + } + else + { + *pOut = 0.0f; + return (ARM_MATH_ARGUMENT_ERROR); + } + } + + + /** + * @brief Q31 square root function. + * @param[in] in input value. The range of the input value is [0 +1) or 0x00000000 to 0x7FFFFFFF. + * @param[out] pOut square root of input value. + * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if + * in is negative value and returns zero output for negative values. + */ + arm_status arm_sqrt_q31( + q31_t in, + q31_t * pOut); + + + /** + * @brief Q15 square root function. + * @param[in] in input value. The range of the input value is [0 +1) or 0x0000 to 0x7FFF. + * @param[out] pOut square root of input value. + * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if + * in is negative value and returns zero output for negative values. + */ + arm_status arm_sqrt_q15( + q15_t in, + q15_t * pOut); + + /** + * @} end of SQRT group + */ + + + /** + * @brief floating-point Circular write function. + */ + CMSIS_INLINE __STATIC_INLINE void arm_circularWrite_f32( + int32_t * circBuffer, + int32_t L, + uint16_t * writeOffset, + int32_t bufferInc, + const int32_t * src, + int32_t srcInc, + uint32_t blockSize) + { + uint32_t i = 0u; + int32_t wOffset; + + /* Copy the value of Index pointer that points + * to the current location where the input samples to be copied */ + wOffset = *writeOffset; + + /* Loop over the blockSize */ + i = blockSize; + + while (i > 0u) + { + /* copy the input sample to the circular buffer */ + circBuffer[wOffset] = *src; + + /* Update the input pointer */ + src += srcInc; + + /* Circularly update wOffset. Watch out for positive and negative value */ + wOffset += bufferInc; + if (wOffset >= L) + wOffset -= L; + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *writeOffset = (uint16_t)wOffset; + } + + + + /** + * @brief floating-point Circular Read function. + */ + CMSIS_INLINE __STATIC_INLINE void arm_circularRead_f32( + int32_t * circBuffer, + int32_t L, + int32_t * readOffset, + int32_t bufferInc, + int32_t * dst, + int32_t * dst_base, + int32_t dst_length, + int32_t dstInc, + uint32_t blockSize) + { + uint32_t i = 0u; + int32_t rOffset, dst_end; + + /* Copy the value of Index pointer that points + * to the current location from where the input samples to be read */ + rOffset = *readOffset; + dst_end = (int32_t) (dst_base + dst_length); + + /* Loop over the blockSize */ + i = blockSize; + + while (i > 0u) + { + /* copy the sample from the circular buffer to the destination buffer */ + *dst = circBuffer[rOffset]; + + /* Update the input pointer */ + dst += dstInc; + + if (dst == (int32_t *) dst_end) + { + dst = dst_base; + } + + /* Circularly update rOffset. Watch out for positive and negative value */ + rOffset += bufferInc; + + if (rOffset >= L) + { + rOffset -= L; + } + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *readOffset = rOffset; + } + + + /** + * @brief Q15 Circular write function. + */ + CMSIS_INLINE __STATIC_INLINE void arm_circularWrite_q15( + q15_t * circBuffer, + int32_t L, + uint16_t * writeOffset, + int32_t bufferInc, + const q15_t * src, + int32_t srcInc, + uint32_t blockSize) + { + uint32_t i = 0u; + int32_t wOffset; + + /* Copy the value of Index pointer that points + * to the current location where the input samples to be copied */ + wOffset = *writeOffset; + + /* Loop over the blockSize */ + i = blockSize; + + while (i > 0u) + { + /* copy the input sample to the circular buffer */ + circBuffer[wOffset] = *src; + + /* Update the input pointer */ + src += srcInc; + + /* Circularly update wOffset. Watch out for positive and negative value */ + wOffset += bufferInc; + if (wOffset >= L) + wOffset -= L; + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *writeOffset = (uint16_t)wOffset; + } + + + /** + * @brief Q15 Circular Read function. + */ + CMSIS_INLINE __STATIC_INLINE void arm_circularRead_q15( + q15_t * circBuffer, + int32_t L, + int32_t * readOffset, + int32_t bufferInc, + q15_t * dst, + q15_t * dst_base, + int32_t dst_length, + int32_t dstInc, + uint32_t blockSize) + { + uint32_t i = 0; + int32_t rOffset, dst_end; + + /* Copy the value of Index pointer that points + * to the current location from where the input samples to be read */ + rOffset = *readOffset; + + dst_end = (int32_t) (dst_base + dst_length); + + /* Loop over the blockSize */ + i = blockSize; + + while (i > 0u) + { + /* copy the sample from the circular buffer to the destination buffer */ + *dst = circBuffer[rOffset]; + + /* Update the input pointer */ + dst += dstInc; + + if (dst == (q15_t *) dst_end) + { + dst = dst_base; + } + + /* Circularly update wOffset. Watch out for positive and negative value */ + rOffset += bufferInc; + + if (rOffset >= L) + { + rOffset -= L; + } + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *readOffset = rOffset; + } + + + /** + * @brief Q7 Circular write function. + */ + CMSIS_INLINE __STATIC_INLINE void arm_circularWrite_q7( + q7_t * circBuffer, + int32_t L, + uint16_t * writeOffset, + int32_t bufferInc, + const q7_t * src, + int32_t srcInc, + uint32_t blockSize) + { + uint32_t i = 0u; + int32_t wOffset; + + /* Copy the value of Index pointer that points + * to the current location where the input samples to be copied */ + wOffset = *writeOffset; + + /* Loop over the blockSize */ + i = blockSize; + + while (i > 0u) + { + /* copy the input sample to the circular buffer */ + circBuffer[wOffset] = *src; + + /* Update the input pointer */ + src += srcInc; + + /* Circularly update wOffset. Watch out for positive and negative value */ + wOffset += bufferInc; + if (wOffset >= L) + wOffset -= L; + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *writeOffset = (uint16_t)wOffset; + } + + + /** + * @brief Q7 Circular Read function. + */ + CMSIS_INLINE __STATIC_INLINE void arm_circularRead_q7( + q7_t * circBuffer, + int32_t L, + int32_t * readOffset, + int32_t bufferInc, + q7_t * dst, + q7_t * dst_base, + int32_t dst_length, + int32_t dstInc, + uint32_t blockSize) + { + uint32_t i = 0; + int32_t rOffset, dst_end; + + /* Copy the value of Index pointer that points + * to the current location from where the input samples to be read */ + rOffset = *readOffset; + + dst_end = (int32_t) (dst_base + dst_length); + + /* Loop over the blockSize */ + i = blockSize; + + while (i > 0u) + { + /* copy the sample from the circular buffer to the destination buffer */ + *dst = circBuffer[rOffset]; + + /* Update the input pointer */ + dst += dstInc; + + if (dst == (q7_t *) dst_end) + { + dst = dst_base; + } + + /* Circularly update rOffset. Watch out for positive and negative value */ + rOffset += bufferInc; + + if (rOffset >= L) + { + rOffset -= L; + } + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *readOffset = rOffset; + } + + + /** + * @brief Sum of the squares of the elements of a Q31 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_power_q31( + q31_t * pSrc, + uint32_t blockSize, + q63_t * pResult); + + + /** + * @brief Sum of the squares of the elements of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_power_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult); + + + /** + * @brief Sum of the squares of the elements of a Q15 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_power_q15( + q15_t * pSrc, + uint32_t blockSize, + q63_t * pResult); + + + /** + * @brief Sum of the squares of the elements of a Q7 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_power_q7( + q7_t * pSrc, + uint32_t blockSize, + q31_t * pResult); + + + /** + * @brief Mean value of a Q7 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_mean_q7( + q7_t * pSrc, + uint32_t blockSize, + q7_t * pResult); + + + /** + * @brief Mean value of a Q15 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_mean_q15( + q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult); + + + /** + * @brief Mean value of a Q31 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_mean_q31( + q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult); + + + /** + * @brief Mean value of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_mean_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult); + + + /** + * @brief Variance of the elements of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_var_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult); + + + /** + * @brief Variance of the elements of a Q31 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_var_q31( + q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult); + + + /** + * @brief Variance of the elements of a Q15 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_var_q15( + q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult); + + + /** + * @brief Root Mean Square of the elements of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_rms_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult); + + + /** + * @brief Root Mean Square of the elements of a Q31 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_rms_q31( + q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult); + + + /** + * @brief Root Mean Square of the elements of a Q15 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_rms_q15( + q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult); + + + /** + * @brief Standard deviation of the elements of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_std_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult); + + + /** + * @brief Standard deviation of the elements of a Q31 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_std_q31( + q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult); + + + /** + * @brief Standard deviation of the elements of a Q15 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_std_q15( + q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult); + + + /** + * @brief Floating-point complex magnitude + * @param[in] pSrc points to the complex input vector + * @param[out] pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + */ + void arm_cmplx_mag_f32( + float32_t * pSrc, + float32_t * pDst, + uint32_t numSamples); + + + /** + * @brief Q31 complex magnitude + * @param[in] pSrc points to the complex input vector + * @param[out] pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + */ + void arm_cmplx_mag_q31( + q31_t * pSrc, + q31_t * pDst, + uint32_t numSamples); + + + /** + * @brief Q15 complex magnitude + * @param[in] pSrc points to the complex input vector + * @param[out] pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + */ + void arm_cmplx_mag_q15( + q15_t * pSrc, + q15_t * pDst, + uint32_t numSamples); + + + /** + * @brief Q15 complex dot product + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] numSamples number of complex samples in each vector + * @param[out] realResult real part of the result returned here + * @param[out] imagResult imaginary part of the result returned here + */ + void arm_cmplx_dot_prod_q15( + q15_t * pSrcA, + q15_t * pSrcB, + uint32_t numSamples, + q31_t * realResult, + q31_t * imagResult); + + + /** + * @brief Q31 complex dot product + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] numSamples number of complex samples in each vector + * @param[out] realResult real part of the result returned here + * @param[out] imagResult imaginary part of the result returned here + */ + void arm_cmplx_dot_prod_q31( + q31_t * pSrcA, + q31_t * pSrcB, + uint32_t numSamples, + q63_t * realResult, + q63_t * imagResult); + + + /** + * @brief Floating-point complex dot product + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] numSamples number of complex samples in each vector + * @param[out] realResult real part of the result returned here + * @param[out] imagResult imaginary part of the result returned here + */ + void arm_cmplx_dot_prod_f32( + float32_t * pSrcA, + float32_t * pSrcB, + uint32_t numSamples, + float32_t * realResult, + float32_t * imagResult); + + + /** + * @brief Q15 complex-by-real multiplication + * @param[in] pSrcCmplx points to the complex input vector + * @param[in] pSrcReal points to the real input vector + * @param[out] pCmplxDst points to the complex output vector + * @param[in] numSamples number of samples in each vector + */ + void arm_cmplx_mult_real_q15( + q15_t * pSrcCmplx, + q15_t * pSrcReal, + q15_t * pCmplxDst, + uint32_t numSamples); + + + /** + * @brief Q31 complex-by-real multiplication + * @param[in] pSrcCmplx points to the complex input vector + * @param[in] pSrcReal points to the real input vector + * @param[out] pCmplxDst points to the complex output vector + * @param[in] numSamples number of samples in each vector + */ + void arm_cmplx_mult_real_q31( + q31_t * pSrcCmplx, + q31_t * pSrcReal, + q31_t * pCmplxDst, + uint32_t numSamples); + + + /** + * @brief Floating-point complex-by-real multiplication + * @param[in] pSrcCmplx points to the complex input vector + * @param[in] pSrcReal points to the real input vector + * @param[out] pCmplxDst points to the complex output vector + * @param[in] numSamples number of samples in each vector + */ + void arm_cmplx_mult_real_f32( + float32_t * pSrcCmplx, + float32_t * pSrcReal, + float32_t * pCmplxDst, + uint32_t numSamples); + + + /** + * @brief Minimum value of a Q7 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] result is output pointer + * @param[in] index is the array index of the minimum value in the input buffer. + */ + void arm_min_q7( + q7_t * pSrc, + uint32_t blockSize, + q7_t * result, + uint32_t * index); + + + /** + * @brief Minimum value of a Q15 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output pointer + * @param[in] pIndex is the array index of the minimum value in the input buffer. + */ + void arm_min_q15( + q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult, + uint32_t * pIndex); + + + /** + * @brief Minimum value of a Q31 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output pointer + * @param[out] pIndex is the array index of the minimum value in the input buffer. + */ + void arm_min_q31( + q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult, + uint32_t * pIndex); + + + /** + * @brief Minimum value of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output pointer + * @param[out] pIndex is the array index of the minimum value in the input buffer. + */ + void arm_min_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult, + uint32_t * pIndex); + + +/** + * @brief Maximum value of a Q7 vector. + * @param[in] pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] pResult maximum value returned here + * @param[out] pIndex index of maximum value returned here + */ + void arm_max_q7( + q7_t * pSrc, + uint32_t blockSize, + q7_t * pResult, + uint32_t * pIndex); + + +/** + * @brief Maximum value of a Q15 vector. + * @param[in] pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] pResult maximum value returned here + * @param[out] pIndex index of maximum value returned here + */ + void arm_max_q15( + q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult, + uint32_t * pIndex); + + +/** + * @brief Maximum value of a Q31 vector. + * @param[in] pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] pResult maximum value returned here + * @param[out] pIndex index of maximum value returned here + */ + void arm_max_q31( + q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult, + uint32_t * pIndex); + + +/** + * @brief Maximum value of a floating-point vector. + * @param[in] pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] pResult maximum value returned here + * @param[out] pIndex index of maximum value returned here + */ + void arm_max_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult, + uint32_t * pIndex); + + + /** + * @brief Q15 complex-by-complex multiplication + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + */ + void arm_cmplx_mult_cmplx_q15( + q15_t * pSrcA, + q15_t * pSrcB, + q15_t * pDst, + uint32_t numSamples); + + + /** + * @brief Q31 complex-by-complex multiplication + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + */ + void arm_cmplx_mult_cmplx_q31( + q31_t * pSrcA, + q31_t * pSrcB, + q31_t * pDst, + uint32_t numSamples); + + + /** + * @brief Floating-point complex-by-complex multiplication + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + */ + void arm_cmplx_mult_cmplx_f32( + float32_t * pSrcA, + float32_t * pSrcB, + float32_t * pDst, + uint32_t numSamples); + + + /** + * @brief Converts the elements of the floating-point vector to Q31 vector. + * @param[in] pSrc points to the floating-point input vector + * @param[out] pDst points to the Q31 output vector + * @param[in] blockSize length of the input vector + */ + void arm_float_to_q31( + float32_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the floating-point vector to Q15 vector. + * @param[in] pSrc points to the floating-point input vector + * @param[out] pDst points to the Q15 output vector + * @param[in] blockSize length of the input vector + */ + void arm_float_to_q15( + float32_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the floating-point vector to Q7 vector. + * @param[in] pSrc points to the floating-point input vector + * @param[out] pDst points to the Q7 output vector + * @param[in] blockSize length of the input vector + */ + void arm_float_to_q7( + float32_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the Q31 vector to Q15 vector. + * @param[in] pSrc is input pointer + * @param[out] pDst is output pointer + * @param[in] blockSize is the number of samples to process + */ + void arm_q31_to_q15( + q31_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the Q31 vector to Q7 vector. + * @param[in] pSrc is input pointer + * @param[out] pDst is output pointer + * @param[in] blockSize is the number of samples to process + */ + void arm_q31_to_q7( + q31_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the Q15 vector to floating-point vector. + * @param[in] pSrc is input pointer + * @param[out] pDst is output pointer + * @param[in] blockSize is the number of samples to process + */ + void arm_q15_to_float( + q15_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the Q15 vector to Q31 vector. + * @param[in] pSrc is input pointer + * @param[out] pDst is output pointer + * @param[in] blockSize is the number of samples to process + */ + void arm_q15_to_q31( + q15_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the Q15 vector to Q7 vector. + * @param[in] pSrc is input pointer + * @param[out] pDst is output pointer + * @param[in] blockSize is the number of samples to process + */ + void arm_q15_to_q7( + q15_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @ingroup groupInterpolation + */ + + /** + * @defgroup BilinearInterpolate Bilinear Interpolation + * + * Bilinear interpolation is an extension of linear interpolation applied to a two dimensional grid. + * The underlying function f(x, y) is sampled on a regular grid and the interpolation process + * determines values between the grid points. + * Bilinear interpolation is equivalent to two step linear interpolation, first in the x-dimension and then in the y-dimension. + * Bilinear interpolation is often used in image processing to rescale images. + * The CMSIS DSP library provides bilinear interpolation functions for Q7, Q15, Q31, and floating-point data types. + * + * Algorithm + * \par + * The instance structure used by the bilinear interpolation functions describes a two dimensional data table. + * For floating-point, the instance structure is defined as: + *
+   *   typedef struct
+   *   {
+   *     uint16_t numRows;
+   *     uint16_t numCols;
+   *     float32_t *pData;
+   * } arm_bilinear_interp_instance_f32;
+   * 
+ * + * \par + * where numRows specifies the number of rows in the table; + * numCols specifies the number of columns in the table; + * and pData points to an array of size numRows*numCols values. + * The data table pTable is organized in row order and the supplied data values fall on integer indexes. + * That is, table element (x,y) is located at pTable[x + y*numCols] where x and y are integers. + * + * \par + * Let (x, y) specify the desired interpolation point. Then define: + *
+   *     XF = floor(x)
+   *     YF = floor(y)
+   * 
+ * \par + * The interpolated output point is computed as: + *
+   *  f(x, y) = f(XF, YF) * (1-(x-XF)) * (1-(y-YF))
+   *           + f(XF+1, YF) * (x-XF)*(1-(y-YF))
+   *           + f(XF, YF+1) * (1-(x-XF))*(y-YF)
+   *           + f(XF+1, YF+1) * (x-XF)*(y-YF)
+   * 
+ * Note that the coordinates (x, y) contain integer and fractional components. + * The integer components specify which portion of the table to use while the + * fractional components control the interpolation processor. + * + * \par + * if (x,y) are outside of the table boundary, Bilinear interpolation returns zero output. + */ + + /** + * @addtogroup BilinearInterpolate + * @{ + */ + + + /** + * + * @brief Floating-point bilinear interpolation. + * @param[in,out] S points to an instance of the interpolation structure. + * @param[in] X interpolation coordinate. + * @param[in] Y interpolation coordinate. + * @return out interpolated value. + */ + CMSIS_INLINE __STATIC_INLINE float32_t arm_bilinear_interp_f32( + const arm_bilinear_interp_instance_f32 * S, + float32_t X, + float32_t Y) + { + float32_t out; + float32_t f00, f01, f10, f11; + float32_t *pData = S->pData; + int32_t xIndex, yIndex, index; + float32_t xdiff, ydiff; + float32_t b1, b2, b3, b4; + + xIndex = (int32_t) X; + yIndex = (int32_t) Y; + + /* Care taken for table outside boundary */ + /* Returns zero output when values are outside table boundary */ + if (xIndex < 0 || xIndex > (S->numRows - 1) || yIndex < 0 || yIndex > (S->numCols - 1)) + { + return (0); + } + + /* Calculation of index for two nearest points in X-direction */ + index = (xIndex - 1) + (yIndex - 1) * S->numCols; + + + /* Read two nearest points in X-direction */ + f00 = pData[index]; + f01 = pData[index + 1]; + + /* Calculation of index for two nearest points in Y-direction */ + index = (xIndex - 1) + (yIndex) * S->numCols; + + + /* Read two nearest points in Y-direction */ + f10 = pData[index]; + f11 = pData[index + 1]; + + /* Calculation of intermediate values */ + b1 = f00; + b2 = f01 - f00; + b3 = f10 - f00; + b4 = f00 - f01 - f10 + f11; + + /* Calculation of fractional part in X */ + xdiff = X - xIndex; + + /* Calculation of fractional part in Y */ + ydiff = Y - yIndex; + + /* Calculation of bi-linear interpolated output */ + out = b1 + b2 * xdiff + b3 * ydiff + b4 * xdiff * ydiff; + + /* return to application */ + return (out); + } + + + /** + * + * @brief Q31 bilinear interpolation. + * @param[in,out] S points to an instance of the interpolation structure. + * @param[in] X interpolation coordinate in 12.20 format. + * @param[in] Y interpolation coordinate in 12.20 format. + * @return out interpolated value. + */ + CMSIS_INLINE __STATIC_INLINE q31_t arm_bilinear_interp_q31( + arm_bilinear_interp_instance_q31 * S, + q31_t X, + q31_t Y) + { + q31_t out; /* Temporary output */ + q31_t acc = 0; /* output */ + q31_t xfract, yfract; /* X, Y fractional parts */ + q31_t x1, x2, y1, y2; /* Nearest output values */ + int32_t rI, cI; /* Row and column indices */ + q31_t *pYData = S->pData; /* pointer to output table values */ + uint32_t nCols = S->numCols; /* num of rows */ + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + rI = ((X & (q31_t)0xFFF00000) >> 20); + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + cI = ((Y & (q31_t)0xFFF00000) >> 20); + + /* Care taken for table outside boundary */ + /* Returns zero output when values are outside table boundary */ + if (rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1)) + { + return (0); + } + + /* 20 bits for the fractional part */ + /* shift left xfract by 11 to keep 1.31 format */ + xfract = (X & 0x000FFFFF) << 11u; + + /* Read two nearest output values from the index */ + x1 = pYData[(rI) + (int32_t)nCols * (cI) ]; + x2 = pYData[(rI) + (int32_t)nCols * (cI) + 1]; + + /* 20 bits for the fractional part */ + /* shift left yfract by 11 to keep 1.31 format */ + yfract = (Y & 0x000FFFFF) << 11u; + + /* Read two nearest output values from the index */ + y1 = pYData[(rI) + (int32_t)nCols * (cI + 1) ]; + y2 = pYData[(rI) + (int32_t)nCols * (cI + 1) + 1]; + + /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 3.29(q29) format */ + out = ((q31_t) (((q63_t) x1 * (0x7FFFFFFF - xfract)) >> 32)); + acc = ((q31_t) (((q63_t) out * (0x7FFFFFFF - yfract)) >> 32)); + + /* x2 * (xfract) * (1-yfract) in 3.29(q29) and adding to acc */ + out = ((q31_t) ((q63_t) x2 * (0x7FFFFFFF - yfract) >> 32)); + acc += ((q31_t) ((q63_t) out * (xfract) >> 32)); + + /* y1 * (1 - xfract) * (yfract) in 3.29(q29) and adding to acc */ + out = ((q31_t) ((q63_t) y1 * (0x7FFFFFFF - xfract) >> 32)); + acc += ((q31_t) ((q63_t) out * (yfract) >> 32)); + + /* y2 * (xfract) * (yfract) in 3.29(q29) and adding to acc */ + out = ((q31_t) ((q63_t) y2 * (xfract) >> 32)); + acc += ((q31_t) ((q63_t) out * (yfract) >> 32)); + + /* Convert acc to 1.31(q31) format */ + return ((q31_t)(acc << 2)); + } + + + /** + * @brief Q15 bilinear interpolation. + * @param[in,out] S points to an instance of the interpolation structure. + * @param[in] X interpolation coordinate in 12.20 format. + * @param[in] Y interpolation coordinate in 12.20 format. + * @return out interpolated value. + */ + CMSIS_INLINE __STATIC_INLINE q15_t arm_bilinear_interp_q15( + arm_bilinear_interp_instance_q15 * S, + q31_t X, + q31_t Y) + { + q63_t acc = 0; /* output */ + q31_t out; /* Temporary output */ + q15_t x1, x2, y1, y2; /* Nearest output values */ + q31_t xfract, yfract; /* X, Y fractional parts */ + int32_t rI, cI; /* Row and column indices */ + q15_t *pYData = S->pData; /* pointer to output table values */ + uint32_t nCols = S->numCols; /* num of rows */ + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + rI = ((X & (q31_t)0xFFF00000) >> 20); + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + cI = ((Y & (q31_t)0xFFF00000) >> 20); + + /* Care taken for table outside boundary */ + /* Returns zero output when values are outside table boundary */ + if (rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1)) + { + return (0); + } + + /* 20 bits for the fractional part */ + /* xfract should be in 12.20 format */ + xfract = (X & 0x000FFFFF); + + /* Read two nearest output values from the index */ + x1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) ]; + x2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) + 1]; + + /* 20 bits for the fractional part */ + /* yfract should be in 12.20 format */ + yfract = (Y & 0x000FFFFF); + + /* Read two nearest output values from the index */ + y1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) ]; + y2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) + 1]; + + /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 13.51 format */ + + /* x1 is in 1.15(q15), xfract in 12.20 format and out is in 13.35 format */ + /* convert 13.35 to 13.31 by right shifting and out is in 1.31 */ + out = (q31_t) (((q63_t) x1 * (0xFFFFF - xfract)) >> 4u); + acc = ((q63_t) out * (0xFFFFF - yfract)); + + /* x2 * (xfract) * (1-yfract) in 1.51 and adding to acc */ + out = (q31_t) (((q63_t) x2 * (0xFFFFF - yfract)) >> 4u); + acc += ((q63_t) out * (xfract)); + + /* y1 * (1 - xfract) * (yfract) in 1.51 and adding to acc */ + out = (q31_t) (((q63_t) y1 * (0xFFFFF - xfract)) >> 4u); + acc += ((q63_t) out * (yfract)); + + /* y2 * (xfract) * (yfract) in 1.51 and adding to acc */ + out = (q31_t) (((q63_t) y2 * (xfract)) >> 4u); + acc += ((q63_t) out * (yfract)); + + /* acc is in 13.51 format and down shift acc by 36 times */ + /* Convert out to 1.15 format */ + return ((q15_t)(acc >> 36)); + } + + + /** + * @brief Q7 bilinear interpolation. + * @param[in,out] S points to an instance of the interpolation structure. + * @param[in] X interpolation coordinate in 12.20 format. + * @param[in] Y interpolation coordinate in 12.20 format. + * @return out interpolated value. + */ + CMSIS_INLINE __STATIC_INLINE q7_t arm_bilinear_interp_q7( + arm_bilinear_interp_instance_q7 * S, + q31_t X, + q31_t Y) + { + q63_t acc = 0; /* output */ + q31_t out; /* Temporary output */ + q31_t xfract, yfract; /* X, Y fractional parts */ + q7_t x1, x2, y1, y2; /* Nearest output values */ + int32_t rI, cI; /* Row and column indices */ + q7_t *pYData = S->pData; /* pointer to output table values */ + uint32_t nCols = S->numCols; /* num of rows */ + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + rI = ((X & (q31_t)0xFFF00000) >> 20); + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + cI = ((Y & (q31_t)0xFFF00000) >> 20); + + /* Care taken for table outside boundary */ + /* Returns zero output when values are outside table boundary */ + if (rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1)) + { + return (0); + } + + /* 20 bits for the fractional part */ + /* xfract should be in 12.20 format */ + xfract = (X & (q31_t)0x000FFFFF); + + /* Read two nearest output values from the index */ + x1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) ]; + x2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) + 1]; + + /* 20 bits for the fractional part */ + /* yfract should be in 12.20 format */ + yfract = (Y & (q31_t)0x000FFFFF); + + /* Read two nearest output values from the index */ + y1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) ]; + y2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) + 1]; + + /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 16.47 format */ + out = ((x1 * (0xFFFFF - xfract))); + acc = (((q63_t) out * (0xFFFFF - yfract))); + + /* x2 * (xfract) * (1-yfract) in 2.22 and adding to acc */ + out = ((x2 * (0xFFFFF - yfract))); + acc += (((q63_t) out * (xfract))); + + /* y1 * (1 - xfract) * (yfract) in 2.22 and adding to acc */ + out = ((y1 * (0xFFFFF - xfract))); + acc += (((q63_t) out * (yfract))); + + /* y2 * (xfract) * (yfract) in 2.22 and adding to acc */ + out = ((y2 * (yfract))); + acc += (((q63_t) out * (xfract))); + + /* acc in 16.47 format and down shift by 40 to convert to 1.7 format */ + return ((q7_t)(acc >> 40)); + } + + /** + * @} end of BilinearInterpolate group + */ + + +/* SMMLAR */ +#define multAcc_32x32_keep32_R(a, x, y) \ + a = (q31_t) (((((q63_t) a) << 32) + ((q63_t) x * y) + 0x80000000LL ) >> 32) + +/* SMMLSR */ +#define multSub_32x32_keep32_R(a, x, y) \ + a = (q31_t) (((((q63_t) a) << 32) - ((q63_t) x * y) + 0x80000000LL ) >> 32) + +/* SMMULR */ +#define mult_32x32_keep32_R(a, x, y) \ + a = (q31_t) (((q63_t) x * y + 0x80000000LL ) >> 32) + +/* SMMLA */ +#define multAcc_32x32_keep32(a, x, y) \ + a += (q31_t) (((q63_t) x * y) >> 32) + +/* SMMLS */ +#define multSub_32x32_keep32(a, x, y) \ + a -= (q31_t) (((q63_t) x * y) >> 32) + +/* SMMUL */ +#define mult_32x32_keep32(a, x, y) \ + a = (q31_t) (((q63_t) x * y ) >> 32) + + +#if defined ( __CC_ARM ) + /* Enter low optimization region - place directly above function definition */ + #if defined( ARM_MATH_CM4 ) || defined( ARM_MATH_CM7) + #define LOW_OPTIMIZATION_ENTER \ + _Pragma ("push") \ + _Pragma ("O1") + #else + #define LOW_OPTIMIZATION_ENTER + #endif + + /* Exit low optimization region - place directly after end of function definition */ + #if defined ( ARM_MATH_CM4 ) || defined ( ARM_MATH_CM7 ) + #define LOW_OPTIMIZATION_EXIT \ + _Pragma ("pop") + #else + #define LOW_OPTIMIZATION_EXIT + #endif + + /* Enter low optimization region - place directly above function definition */ + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER + + /* Exit low optimization region - place directly after end of function definition */ + #define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined (__ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 ) + #define LOW_OPTIMIZATION_ENTER + #define LOW_OPTIMIZATION_EXIT + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER + #define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined ( __GNUC__ ) + #define LOW_OPTIMIZATION_ENTER \ + __attribute__(( optimize("-O1") )) + #define LOW_OPTIMIZATION_EXIT + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER + #define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined ( __ICCARM__ ) + /* Enter low optimization region - place directly above function definition */ + #if defined ( ARM_MATH_CM4 ) || defined ( ARM_MATH_CM7 ) + #define LOW_OPTIMIZATION_ENTER \ + _Pragma ("optimize=low") + #else + #define LOW_OPTIMIZATION_ENTER + #endif + + /* Exit low optimization region - place directly after end of function definition */ + #define LOW_OPTIMIZATION_EXIT + + /* Enter low optimization region - place directly above function definition */ + #if defined ( ARM_MATH_CM4 ) || defined ( ARM_MATH_CM7 ) + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER \ + _Pragma ("optimize=low") + #else + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER + #endif + + /* Exit low optimization region - place directly after end of function definition */ + #define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined ( __TI_ARM__ ) + #define LOW_OPTIMIZATION_ENTER + #define LOW_OPTIMIZATION_EXIT + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER + #define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined ( __CSMC__ ) + #define LOW_OPTIMIZATION_ENTER + #define LOW_OPTIMIZATION_EXIT + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER + #define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined ( __TASKING__ ) + #define LOW_OPTIMIZATION_ENTER + #define LOW_OPTIMIZATION_EXIT + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER + #define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#endif + + +#ifdef __cplusplus +} +#endif + + +#if defined ( __GNUC__ ) +#pragma GCC diagnostic pop +#endif + +#endif /* _ARM_MATH_H */ + +/** + * + * End of file. + */ diff --git a/lib/arm_atsam/packs/arm/cmsis/5.0.1/CMSIS/Include/cmsis_compiler.h b/lib/arm_atsam/packs/arm/cmsis/5.0.1/CMSIS/Include/cmsis_compiler.h new file mode 100644 index 000000000..8b989f851 --- /dev/null +++ b/lib/arm_atsam/packs/arm/cmsis/5.0.1/CMSIS/Include/cmsis_compiler.h @@ -0,0 +1,223 @@ +/**************************************************************************//** + * @file cmsis_compiler.h + * @brief CMSIS compiler generic header file + * @version V5.0.1 + * @date 30. January 2017 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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 __CMSIS_COMPILER_H +#define __CMSIS_COMPILER_H + +#include + +/* + * ARM Compiler 4/5 + */ +#if defined ( __CC_ARM ) + #include "cmsis_armcc.h" + + +/* + * ARM Compiler 6 (armclang) + */ +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #include "cmsis_armclang.h" + + +/* + * GNU Compiler + */ +#elif defined ( __GNUC__ ) + #include "cmsis_gcc.h" + + +/* + * IAR Compiler + */ +#elif defined ( __ICCARM__ ) + + #ifndef __ASM + #define __ASM __asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + + #include + + #ifndef __NO_RETURN + #define __NO_RETURN __noreturn + #endif + #ifndef __USED + #define __USED __root + #endif + #ifndef __WEAK + #define __WEAK __weak + #endif + #ifndef __UNALIGNED_UINT32 + __packed struct T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __ALIGNED + #warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored. + #define __ALIGNED(x) + #endif + #ifndef __PACKED + #define __PACKED __packed + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT __packed struct + #endif + + +/* + * TI ARM Compiler + */ +#elif defined ( __TI_ARM__ ) + #include + + #ifndef __ASM + #define __ASM __asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __NO_RETURN + #define __NO_RETURN __attribute__((noreturn)) + #endif + #ifndef __USED + #define __USED __attribute__((used)) + #endif + #ifndef __WEAK + #define __WEAK __attribute__((weak)) + #endif + #ifndef __UNALIGNED_UINT32 + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) + #endif + #ifndef __PACKED + #define __PACKED __attribute__((packed)) + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed)) + #endif + + +/* + * TASKING Compiler + */ +#elif defined ( __TASKING__ ) + /* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all intrinsics, + * Including the CMSIS ones. + */ + + #ifndef __ASM + #define __ASM __asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __NO_RETURN + #define __NO_RETURN __attribute__((noreturn)) + #endif + #ifndef __USED + #define __USED __attribute__((used)) + #endif + #ifndef __WEAK + #define __WEAK __attribute__((weak)) + #endif + #ifndef __UNALIGNED_UINT32 + struct __packed__ T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __ALIGNED + #define __ALIGNED(x) __align(x) + #endif + #ifndef __PACKED + #define __PACKED __packed__ + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __packed__ + #endif + + +/* + * COSMIC Compiler + */ +#elif defined ( __CSMC__ ) + #include + + #ifndef __ASM + #define __ASM _asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __NO_RETURN + // NO RETURN is automatically detected hence no warning here + #define __NO_RETURN + #endif + #ifndef __USED + #warning No compiler specific solution for __USED. __USED is ignored. + #define __USED + #endif + #ifndef __WEAK + #define __WEAK __weak + #endif + #ifndef __UNALIGNED_UINT32 + @packed struct T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __ALIGNED + #warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored. + #define __ALIGNED(x) + #endif + #ifndef __PACKED + #define __PACKED @packed + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT @packed struct + #endif + + +#else + #error Unknown compiler. +#endif + + +#endif /* __CMSIS_COMPILER_H */ + diff --git a/lib/arm_atsam/packs/arm/cmsis/5.0.1/CMSIS/Include/cmsis_gcc.h b/lib/arm_atsam/packs/arm/cmsis/5.0.1/CMSIS/Include/cmsis_gcc.h new file mode 100644 index 000000000..074cd7ab3 --- /dev/null +++ b/lib/arm_atsam/packs/arm/cmsis/5.0.1/CMSIS/Include/cmsis_gcc.h @@ -0,0 +1,1899 @@ +/**************************************************************************//** + * @file cmsis_gcc.h + * @brief CMSIS compiler GCC header file + * @version V5.0.1 + * @date 02. February 2017 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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 __CMSIS_GCC_H +#define __CMSIS_GCC_H + +/* ignore some GCC warnings */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wsign-conversion" +#pragma GCC diagnostic ignored "-Wconversion" +#pragma GCC diagnostic ignored "-Wunused-parameter" + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __attribute__((noreturn)) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __UNALIGNED_UINT32 +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wpacked" +#pragma GCC diagnostic ignored "-Wattributes" + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; +#pragma GCC diagnostic pop + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) +#endif + + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__((always_inline)) __STATIC_INLINE void __enable_irq(void) +{ + __ASM volatile ("cpsie i" : : : "memory"); +} + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__((always_inline)) __STATIC_INLINE void __disable_irq(void) +{ + __ASM volatile ("cpsid i" : : : "memory"); +} + + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Control Register (non-secure) + \details Returns the content of the non-secure Control Register when in secure mode. + \return non-secure Control Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_CONTROL_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Control Register (non-secure) + \details Writes the given value to the non-secure Control Register when in secure state. + \param [in] control Control Register value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_CONTROL_NS(uint32_t control) +{ + __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); +} +#endif + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_PSP(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, psp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer (non-secure) + \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. + \return PSP Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_PSP_NS(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); +} +#endif + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_MSP(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, msp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer (non-secure) + \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. + \return MSP Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_MSP_NS(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); +} +#endif + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Priority Mask (non-secure) + \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. + \return Priority Mask value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_PRIMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__attribute__((always_inline)) __STATIC_INLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Priority Mask (non-secure) + \details Assigns the given value to the non-secure Priority Mask Register when in secure state. + \param [in] priMask Priority Mask + */ +__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) +{ + __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); +} +#endif + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__((always_inline)) __STATIC_INLINE void __enable_fault_irq(void) +{ + __ASM volatile ("cpsie f" : : : "memory"); +} + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__((always_inline)) __STATIC_INLINE void __disable_fault_irq(void) +{ + __ASM volatile ("cpsid f" : : : "memory"); +} + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Base Priority (non-secure) + \details Returns the current value of the non-secure Base Priority register when in secure state. + \return Base Priority register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_BASEPRI_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __set_BASEPRI(uint32_t basePri) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Base Priority (non-secure) + \details Assigns the given value to the non-secure Base Priority register when in secure state. + \param [in] basePri Base Priority value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); +} +#endif + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Fault Mask (non-secure) + \details Returns the current value of the non-secure Fault Mask register when in secure state. + \return Fault Mask register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_FAULTMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Fault Mask (non-secure) + \details Assigns the given value to the non-secure Fault Mask register when in secure state. + \param [in] faultMask Fault Mask value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); +} +#endif + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + +/** + \brief Get Process Stack Pointer Limit + \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). + \return PSPLIM Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_PSPLIM(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, psplim" : "=r" (result) ); + return(result); +} + + +#if ((defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) && \ + (defined (__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Get Process Stack Pointer Limit (non-secure) + \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \return PSPLIM Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_PSPLIM_NS(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Process Stack Pointer Limit + \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) +{ + __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); +} + + +#if ((defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) && \ + (defined (__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Set Process Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) +{ + __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); +} +#endif + + +/** + \brief Get Main Stack Pointer Limit + \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). + \return MSPLIM Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_MSPLIM(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, msplim" : "=r" (result) ); + + return(result); +} + + +#if ((defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) && \ + (defined (__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Get Main Stack Pointer Limit (non-secure) + \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. + \return MSPLIM Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_MSPLIM_NS(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Main Stack Pointer Limit + \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). + \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) +{ + __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); +} + + +#if ((defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) && \ + (defined (__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Set Main Stack Pointer Limit (non-secure) + \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. + \param [in] MainStackPtrLimit Main Stack Pointer value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) +{ + __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); +} +#endif + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_FPSCR(void) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + uint32_t result; + + __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); + return(result); +#else + return(0U); +#endif +} + + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __set_FPSCR(uint32_t fpscr) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc", "memory"); +#else + (void)fpscr; +#endif +} + +#endif /* ((defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/* Define macros for porting to both thumb1 and thumb2. + * For thumb1, use low register (r0-r7), specified by constraint "l" + * Otherwise, use general registers, specified by constraint "r" */ +#if defined (__thumb__) && !defined (__thumb2__) +#define __CMSIS_GCC_OUT_REG(r) "=l" (r) +#define __CMSIS_GCC_RW_REG(r) "+l" (r) +#define __CMSIS_GCC_USE_REG(r) "l" (r) +#else +#define __CMSIS_GCC_OUT_REG(r) "=r" (r) +#define __CMSIS_GCC_RW_REG(r) "+r" (r) +#define __CMSIS_GCC_USE_REG(r) "r" (r) +#endif + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +//__attribute__((always_inline)) __STATIC_INLINE void __NOP(void) +//{ +// __ASM volatile ("nop"); +//} +#define __NOP() __ASM volatile ("nop") /* This implementation generates debug information */ + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +//__attribute__((always_inline)) __STATIC_INLINE void __WFI(void) +//{ +// __ASM volatile ("wfi"); +//} +#define __WFI() __ASM volatile ("wfi") /* This implementation generates debug information */ + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +//__attribute__((always_inline)) __STATIC_INLINE void __WFE(void) +//{ +// __ASM volatile ("wfe"); +//} +#define __WFE() __ASM volatile ("wfe") /* This implementation generates debug information */ + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +//__attribute__((always_inline)) __STATIC_INLINE void __SEV(void) +//{ +// __ASM volatile ("sev"); +//} +#define __SEV() __ASM volatile ("sev") /* This implementation generates debug information */ + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +__attribute__((always_inline)) __STATIC_INLINE void __ISB(void) +{ + __ASM volatile ("isb 0xF":::"memory"); +} + + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +__attribute__((always_inline)) __STATIC_INLINE void __DSB(void) +{ + __ASM volatile ("dsb 0xF":::"memory"); +} + + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +__attribute__((always_inline)) __STATIC_INLINE void __DMB(void) +{ + __ASM volatile ("dmb 0xF":::"memory"); +} + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in integer value. + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __REV(uint32_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) + return __builtin_bswap32(value); +#else + uint32_t result; + + __ASM volatile ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +#endif +} + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in two unsigned short values. + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __REV16(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} + + +/** + \brief Reverse byte order in signed short value + \details Reverses the byte order in a signed short value with sign extension to integer. + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__((always_inline)) __STATIC_INLINE int32_t __REVSH(int32_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + return (short)__builtin_bswap16(value); +#else + int32_t result; + + __ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +#endif +} + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + return (op1 >> op2) | (op1 << (32U - op2)); +} + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); +#else + int32_t s = (4 /*sizeof(v)*/ * 8) - 1; /* extra shift needed at end */ + + result = value; /* r will be reversed bits of v; first get LSB of v */ + for (value >>= 1U; value; value >>= 1U) + { + result <<= 1U; + result |= value & 1U; + s--; + } + result <<= s; /* shift when v's highest bits are zero */ +#endif + return(result); +} + + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ __builtin_clz + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__attribute__((always_inline)) __STATIC_INLINE uint8_t __LDREXB(volatile uint8_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrexb %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__attribute__((always_inline)) __STATIC_INLINE uint16_t __LDREXH(volatile uint16_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrexh %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __LDREXW(volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) ); + return(result); +} + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexb %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) ); + return(result); +} + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +__attribute__((always_inline)) __STATIC_INLINE void __CLREX(void) +{ + __ASM volatile ("clrex" ::: "memory"); +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT(ARG1,ARG2) \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __RRX(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__attribute__((always_inline)) __STATIC_INLINE uint8_t __LDRBT(volatile uint8_t *ptr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrbt %0, [%1]" : "=r" (result) : "r" (ptr) : "memory" ); +#endif + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__attribute__((always_inline)) __STATIC_INLINE uint16_t __LDRHT(volatile uint16_t *ptr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrht %0, [%1]" : "=r" (result) : "r" (ptr) : "memory" ); +#endif + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __LDRT(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__attribute__((always_inline)) __STATIC_INLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__attribute__((always_inline)) __STATIC_INLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__attribute__((always_inline)) __STATIC_INLINE void __STRT(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief Load-Acquire (8 bit) + \details Executes a LDAB instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__attribute__((always_inline)) __STATIC_INLINE uint8_t __LDAB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire (16 bit) + \details Executes a LDAH instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__attribute__((always_inline)) __STATIC_INLINE uint16_t __LDAH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire (32 bit) + \details Executes a LDA instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __LDA(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief Store-Release (8 bit) + \details Executes a STLB instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__attribute__((always_inline)) __STATIC_INLINE void __STLB(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (16 bit) + \details Executes a STLH instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__attribute__((always_inline)) __STATIC_INLINE void __STLH(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (32 bit) + \details Executes a STL instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__attribute__((always_inline)) __STATIC_INLINE void __STL(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Load-Acquire Exclusive (8 bit) + \details Executes a LDAB exclusive instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__attribute__((always_inline)) __STATIC_INLINE uint8_t __LDAEXB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaexb %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire Exclusive (16 bit) + \details Executes a LDAH exclusive instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__attribute__((always_inline)) __STATIC_INLINE uint16_t __LDAEXH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaexh %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire Exclusive (32 bit) + \details Executes a LDA exclusive instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __LDAEX(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaex %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief Store-Release Exclusive (8 bit) + \details Executes a STLB exclusive instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlexb %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief Store-Release Exclusive (16 bit) + \details Executes a STLH exclusive instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlexh %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief Store-Release Exclusive (32 bit) + \details Executes a STL exclusive instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlex %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) ); + return(result); +} + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if (__ARM_FEATURE_DSP == 1) /* ToDo ARMCLANG: This should be ARCH >= ARMv7-M + SIMD */ + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __QASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#define __SSAT16(ARG1,ARG2) \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +#define __USAT16(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SEL (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE int32_t __QADD( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE int32_t __QSUB( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +#if 0 +#define __PKHBT(ARG1,ARG2,ARG3) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) + +#define __PKHTB(ARG1,ARG2,ARG3) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + if (ARG3 == 0) \ + __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \ + else \ + __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) +#endif + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +__attribute__((always_inline)) __STATIC_INLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) +{ + int32_t result; + + __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#endif /* (__ARM_FEATURE_DSP == 1) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#pragma GCC diagnostic pop + +#endif /* __CMSIS_GCC_H */ diff --git a/lib/arm_atsam/packs/arm/cmsis/5.0.1/CMSIS/Include/core_cm4.h b/lib/arm_atsam/packs/arm/cmsis/5.0.1/CMSIS/Include/core_cm4.h new file mode 100644 index 000000000..2da78d398 --- /dev/null +++ b/lib/arm_atsam/packs/arm/cmsis/5.0.1/CMSIS/Include/core_cm4.h @@ -0,0 +1,2103 @@ +/**************************************************************************//** + * @file core_cm4.h + * @brief CMSIS Cortex-M4 Core Peripheral Access Layer Header File + * @version V5.0.1 + * @date 30. January 2017 + ******************************************************************************/ +/* + * Copyright (c) 2009-2016 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM4_H_GENERIC +#define __CORE_CM4_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M4 + @{ + */ + +/* CMSIS CM4 definitions */ +#define __CM4_CMSIS_VERSION_MAIN ( 5U) /*!< [31:16] CMSIS HAL main version */ +#define __CM4_CMSIS_VERSION_SUB ( 0U) /*!< [15:0] CMSIS HAL sub version */ +#define __CM4_CMSIS_VERSION ((__CM4_CMSIS_VERSION_MAIN << 16U) | \ + __CM4_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ + +#define __CORTEX_M (4U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM4_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM4_H_DEPENDANT +#define __CORE_CM4_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM4_REV + #define __CM4_REV 0x0000U + #warning "__CM4_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M4 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core FPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:1; /*!< bit: 9 Reserved */ + uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit */ + uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ +#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ + +#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ +#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ + uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24U]; + __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[24U]; + __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24U]; + __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24U]; + __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56U]; + __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[5U]; + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/* Auxiliary Control Register Definitions */ +#define SCnSCB_ACTLR_DISOOFP_Pos 9U /*!< ACTLR: DISOOFP Position */ +#define SCnSCB_ACTLR_DISOOFP_Msk (1UL << SCnSCB_ACTLR_DISOOFP_Pos) /*!< ACTLR: DISOOFP Mask */ + +#define SCnSCB_ACTLR_DISFPCA_Pos 8U /*!< ACTLR: DISFPCA Position */ +#define SCnSCB_ACTLR_DISFPCA_Msk (1UL << SCnSCB_ACTLR_DISFPCA_Pos) /*!< ACTLR: DISFPCA Mask */ + +#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ +#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ + +#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1U /*!< ACTLR: DISDEFWBUF Position */ +#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ + +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[6U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED0[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Mask Register Definitions */ +#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ +#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ +#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ + +#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ +#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ +#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ + +#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ +#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ + +#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ +#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ + +#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ +#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ + +#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ +#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IOM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY_Pos 0U /*!< TPI ITATBCTR2: ATREADY Position */ +#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/) /*!< TPI ITATBCTR2: ATREADY Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY_Pos 0U /*!< TPI ITATBCTR0: ATREADY Position */ +#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/) /*!< TPI ITATBCTR0: ATREADY Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_MajorType_Pos 4U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +#define TPI_DEVTYPE_SubType_Pos 0U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ +} MPU_Type; + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif /* defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and FP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and FP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/*@} end of group CMSIS_FPU */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ +#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ +#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ +#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ +#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +#define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ +#define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << 8U) ); /* Insert write key and priorty group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[((uint32_t)(int32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IP[((uint32_t)(int32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + uint32_t mvfr0; + + mvfr0 = FPU->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM4_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/lib/arm_atsam/packs/arm/cmsis/5.0.1/LICENSE.txt b/lib/arm_atsam/packs/arm/cmsis/5.0.1/LICENSE.txt new file mode 100644 index 000000000..8dada3eda --- /dev/null +++ b/lib/arm_atsam/packs/arm/cmsis/5.0.1/LICENSE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + 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. diff --git a/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/gcc/gcc/samd51j18a_flash.ld b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/gcc/gcc/samd51j18a_flash.ld new file mode 100644 index 000000000..3d114f5b7 --- /dev/null +++ b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/gcc/gcc/samd51j18a_flash.ld @@ -0,0 +1,168 @@ +/** + * \file + * + * \brief Linker script for running in internal FLASH on the SAMD51J18A + * + * Copyright (c) 2017 Microchip Technology Inc. + * + * \asf_license_start + * + * \page License + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 Licence 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. + * + * \asf_license_stop + * + */ + + +OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") +OUTPUT_ARCH(arm) +SEARCH_DIR(.) + +/* Memory Spaces Definitions */ +MEMORY +{ + //rom (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + rom (rx) : ORIGIN = 0x00004000, LENGTH = 0x0003C000 + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00020000 + bkupram (rwx) : ORIGIN = 0x47000000, LENGTH = 0x00002000 + qspi (rwx) : ORIGIN = 0x04000000, LENGTH = 0x01000000 +} + +/* The stack size used by the application. NOTE: you need to adjust according to your application. */ +STACK_SIZE = DEFINED(STACK_SIZE) ? STACK_SIZE : DEFINED(__stack_size__) ? __stack_size__ : 0x8000; + +_srom = ORIGIN(rom); +_lrom = LENGTH(rom); +_erom = ORIGIN(rom) + LENGTH(rom); + +/* Section Definitions */ +SECTIONS +{ + .text : + { + . = ALIGN(4); + _sfixed = .; + KEEP(*(.vectors .vectors.*)) + *(.text .text.* .gnu.linkonce.t.*) + *(.glue_7t) *(.glue_7) + *(.rodata .rodata* .gnu.linkonce.r.*) + *(.ARM.extab* .gnu.linkonce.armextab.*) + + /* Support C constructors, and C destructors in both user code + and the C library. This also provides support for C++ code. */ + . = ALIGN(4); + KEEP(*(.init)) + . = ALIGN(4); + __preinit_array_start = .; + KEEP (*(.preinit_array)) + __preinit_array_end = .; + + . = ALIGN(4); + __init_array_start = .; + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + __init_array_end = .; + + . = ALIGN(4); + KEEP (*crtbegin.o(.ctors)) + KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*crtend.o(.ctors)) + + . = ALIGN(4); + KEEP(*(.fini)) + + . = ALIGN(4); + __fini_array_start = .; + KEEP (*(.fini_array)) + KEEP (*(SORT(.fini_array.*))) + __fini_array_end = .; + + KEEP (*crtbegin.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*crtend.o(.dtors)) + + . = ALIGN(4); + _efixed = .; /* End of text section */ + } > rom + + /* .ARM.exidx is sorted, so has to go in its own output section. */ + PROVIDE_HIDDEN (__exidx_start = .); + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > rom + PROVIDE_HIDDEN (__exidx_end = .); + + . = ALIGN(4); + _etext = .; + + .relocate : AT (_etext) + { + . = ALIGN(4); + _srelocate = .; + *(.ramfunc .ramfunc.*); + *(.data .data.*); + . = ALIGN(4); + _erelocate = .; + } > ram + + .bkupram (NOLOAD): + { + . = ALIGN(8); + _sbkupram = .; + *(.bkupram .bkupram.*); + . = ALIGN(8); + _ebkupram = .; + } > bkupram + + .qspi (NOLOAD): + { + . = ALIGN(8); + _sqspi = .; + *(.qspi .qspi.*); + . = ALIGN(8); + _eqspi = .; + } > qspi + + /* .bss section which is used for uninitialized data */ + .bss (NOLOAD) : + { + . = ALIGN(4); + _sbss = . ; + _szero = .; + *(.bss .bss.*) + *(COMMON) + . = ALIGN(4); + _ebss = . ; + _ezero = .; + } > ram + + /* stack section */ + .stack (NOLOAD): + { + . = ALIGN(8); + _sstack = .; + . = . + STACK_SIZE; + . = ALIGN(8); + _estack = .; + } > ram + + . = ALIGN(4); + _end = . ; +} diff --git a/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component-version.h b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component-version.h new file mode 100644 index 000000000..80801fc12 --- /dev/null +++ b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component-version.h @@ -0,0 +1,65 @@ +/** + * \file + * + * \brief Component version header file + * + * Copyright (c) 2017 Atmel Corporation, a wholly owned subsidiary of Microchip Technology Inc. + * + * \license_start + * + * \page License + * + * 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. + * + * \license_stop + * + */ + +#ifndef _COMPONENT_VERSION_H_INCLUDED +#define _COMPONENT_VERSION_H_INCLUDED + +#define COMPONENT_VERSION_MAJOR 1 +#define COMPONENT_VERSION_MINOR 0 + +// +// The COMPONENT_VERSION define is composed of the major and the minor version number. +// +// The last four digits of the COMPONENT_VERSION is the minor version with leading zeros. +// The rest of the COMPONENT_VERSION is the major version, with leading zeros. The COMPONENT_VERSION +// is at least 8 digits long. +// +#define COMPONENT_VERSION 00010000 + +// +// The build number does not refer to the component, but to the build number +// of the device pack that provides the component. +// +#define BUILD_NUMBER 70 + +// +// The COMPONENT_VERSION_STRING is a string (enclosed in ") that can be used for logging or embedding. +// +#define COMPONENT_VERSION_STRING "1.0" + +// +// The COMPONENT_DATE_STRING contains a timestamp of when the pack was generated. +// +// The COMPONENT_DATE_STRING is written out using the following strftime pattern. +// +// "%Y-%m-%d %H:%M:%S" +// +// +#define COMPONENT_DATE_STRING "2017-08-09 09:59:41" + +#endif/* #ifndef _COMPONENT_VERSION_H_INCLUDED */ + diff --git a/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/ac.h b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/ac.h new file mode 100644 index 000000000..24623d00a --- /dev/null +++ b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/ac.h @@ -0,0 +1,598 @@ +/** + * \file + * + * \brief Component description for AC + * + * Copyright (c) 2017 Microchip Technology Inc. + * + * \asf_license_start + * + * \page License + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 Licence 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. + * + * \asf_license_stop + * + */ + +#ifndef _SAMD51_AC_COMPONENT_ +#define _SAMD51_AC_COMPONENT_ + +/* ========================================================================== */ +/** SOFTWARE API DEFINITION FOR AC */ +/* ========================================================================== */ +/** \addtogroup SAMD51_AC Analog Comparators */ +/*@{*/ + +#define AC_U2501 +#define REV_AC 0x100 + +/* -------- AC_CTRLA : (AC Offset: 0x00) (R/W 8) Control A -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t SWRST:1; /*!< bit: 0 Software Reset */ + uint8_t ENABLE:1; /*!< bit: 1 Enable */ + uint8_t :6; /*!< bit: 2.. 7 Reserved */ + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} AC_CTRLA_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define AC_CTRLA_OFFSET 0x00 /**< \brief (AC_CTRLA offset) Control A */ +#define AC_CTRLA_RESETVALUE _U_(0x00) /**< \brief (AC_CTRLA reset_value) Control A */ + +#define AC_CTRLA_SWRST_Pos 0 /**< \brief (AC_CTRLA) Software Reset */ +#define AC_CTRLA_SWRST (_U_(0x1) << AC_CTRLA_SWRST_Pos) +#define AC_CTRLA_ENABLE_Pos 1 /**< \brief (AC_CTRLA) Enable */ +#define AC_CTRLA_ENABLE (_U_(0x1) << AC_CTRLA_ENABLE_Pos) +#define AC_CTRLA_MASK _U_(0x03) /**< \brief (AC_CTRLA) MASK Register */ + +/* -------- AC_CTRLB : (AC Offset: 0x01) ( /W 8) Control B -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t START0:1; /*!< bit: 0 Comparator 0 Start Comparison */ + uint8_t START1:1; /*!< bit: 1 Comparator 1 Start Comparison */ + uint8_t :6; /*!< bit: 2.. 7 Reserved */ + } bit; /*!< Structure used for bit access */ + struct { + uint8_t START:2; /*!< bit: 0.. 1 Comparator x Start Comparison */ + uint8_t :6; /*!< bit: 2.. 7 Reserved */ + } vec; /*!< Structure used for vec access */ + uint8_t reg; /*!< Type used for register access */ +} AC_CTRLB_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define AC_CTRLB_OFFSET 0x01 /**< \brief (AC_CTRLB offset) Control B */ +#define AC_CTRLB_RESETVALUE _U_(0x00) /**< \brief (AC_CTRLB reset_value) Control B */ + +#define AC_CTRLB_START0_Pos 0 /**< \brief (AC_CTRLB) Comparator 0 Start Comparison */ +#define AC_CTRLB_START0 (_U_(1) << AC_CTRLB_START0_Pos) +#define AC_CTRLB_START1_Pos 1 /**< \brief (AC_CTRLB) Comparator 1 Start Comparison */ +#define AC_CTRLB_START1 (_U_(1) << AC_CTRLB_START1_Pos) +#define AC_CTRLB_START_Pos 0 /**< \brief (AC_CTRLB) Comparator x Start Comparison */ +#define AC_CTRLB_START_Msk (_U_(0x3) << AC_CTRLB_START_Pos) +#define AC_CTRLB_START(value) (AC_CTRLB_START_Msk & ((value) << AC_CTRLB_START_Pos)) +#define AC_CTRLB_MASK _U_(0x03) /**< \brief (AC_CTRLB) MASK Register */ + +/* -------- AC_EVCTRL : (AC Offset: 0x02) (R/W 16) Event Control -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint16_t COMPEO0:1; /*!< bit: 0 Comparator 0 Event Output Enable */ + uint16_t COMPEO1:1; /*!< bit: 1 Comparator 1 Event Output Enable */ + uint16_t :2; /*!< bit: 2.. 3 Reserved */ + uint16_t WINEO0:1; /*!< bit: 4 Window 0 Event Output Enable */ + uint16_t :3; /*!< bit: 5.. 7 Reserved */ + uint16_t COMPEI0:1; /*!< bit: 8 Comparator 0 Event Input Enable */ + uint16_t COMPEI1:1; /*!< bit: 9 Comparator 1 Event Input Enable */ + uint16_t :2; /*!< bit: 10..11 Reserved */ + uint16_t INVEI0:1; /*!< bit: 12 Comparator 0 Input Event Invert Enable */ + uint16_t INVEI1:1; /*!< bit: 13 Comparator 1 Input Event Invert Enable */ + uint16_t :2; /*!< bit: 14..15 Reserved */ + } bit; /*!< Structure used for bit access */ + struct { + uint16_t COMPEO:2; /*!< bit: 0.. 1 Comparator x Event Output Enable */ + uint16_t :2; /*!< bit: 2.. 3 Reserved */ + uint16_t WINEO:1; /*!< bit: 4 Window x Event Output Enable */ + uint16_t :3; /*!< bit: 5.. 7 Reserved */ + uint16_t COMPEI:2; /*!< bit: 8.. 9 Comparator x Event Input Enable */ + uint16_t :2; /*!< bit: 10..11 Reserved */ + uint16_t INVEI:2; /*!< bit: 12..13 Comparator x Input Event Invert Enable */ + uint16_t :2; /*!< bit: 14..15 Reserved */ + } vec; /*!< Structure used for vec access */ + uint16_t reg; /*!< Type used for register access */ +} AC_EVCTRL_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define AC_EVCTRL_OFFSET 0x02 /**< \brief (AC_EVCTRL offset) Event Control */ +#define AC_EVCTRL_RESETVALUE _U_(0x0000) /**< \brief (AC_EVCTRL reset_value) Event Control */ + +#define AC_EVCTRL_COMPEO0_Pos 0 /**< \brief (AC_EVCTRL) Comparator 0 Event Output Enable */ +#define AC_EVCTRL_COMPEO0 (_U_(1) << AC_EVCTRL_COMPEO0_Pos) +#define AC_EVCTRL_COMPEO1_Pos 1 /**< \brief (AC_EVCTRL) Comparator 1 Event Output Enable */ +#define AC_EVCTRL_COMPEO1 (_U_(1) << AC_EVCTRL_COMPEO1_Pos) +#define AC_EVCTRL_COMPEO_Pos 0 /**< \brief (AC_EVCTRL) Comparator x Event Output Enable */ +#define AC_EVCTRL_COMPEO_Msk (_U_(0x3) << AC_EVCTRL_COMPEO_Pos) +#define AC_EVCTRL_COMPEO(value) (AC_EVCTRL_COMPEO_Msk & ((value) << AC_EVCTRL_COMPEO_Pos)) +#define AC_EVCTRL_WINEO0_Pos 4 /**< \brief (AC_EVCTRL) Window 0 Event Output Enable */ +#define AC_EVCTRL_WINEO0 (_U_(1) << AC_EVCTRL_WINEO0_Pos) +#define AC_EVCTRL_WINEO_Pos 4 /**< \brief (AC_EVCTRL) Window x Event Output Enable */ +#define AC_EVCTRL_WINEO_Msk (_U_(0x1) << AC_EVCTRL_WINEO_Pos) +#define AC_EVCTRL_WINEO(value) (AC_EVCTRL_WINEO_Msk & ((value) << AC_EVCTRL_WINEO_Pos)) +#define AC_EVCTRL_COMPEI0_Pos 8 /**< \brief (AC_EVCTRL) Comparator 0 Event Input Enable */ +#define AC_EVCTRL_COMPEI0 (_U_(1) << AC_EVCTRL_COMPEI0_Pos) +#define AC_EVCTRL_COMPEI1_Pos 9 /**< \brief (AC_EVCTRL) Comparator 1 Event Input Enable */ +#define AC_EVCTRL_COMPEI1 (_U_(1) << AC_EVCTRL_COMPEI1_Pos) +#define AC_EVCTRL_COMPEI_Pos 8 /**< \brief (AC_EVCTRL) Comparator x Event Input Enable */ +#define AC_EVCTRL_COMPEI_Msk (_U_(0x3) << AC_EVCTRL_COMPEI_Pos) +#define AC_EVCTRL_COMPEI(value) (AC_EVCTRL_COMPEI_Msk & ((value) << AC_EVCTRL_COMPEI_Pos)) +#define AC_EVCTRL_INVEI0_Pos 12 /**< \brief (AC_EVCTRL) Comparator 0 Input Event Invert Enable */ +#define AC_EVCTRL_INVEI0 (_U_(1) << AC_EVCTRL_INVEI0_Pos) +#define AC_EVCTRL_INVEI1_Pos 13 /**< \brief (AC_EVCTRL) Comparator 1 Input Event Invert Enable */ +#define AC_EVCTRL_INVEI1 (_U_(1) << AC_EVCTRL_INVEI1_Pos) +#define AC_EVCTRL_INVEI_Pos 12 /**< \brief (AC_EVCTRL) Comparator x Input Event Invert Enable */ +#define AC_EVCTRL_INVEI_Msk (_U_(0x3) << AC_EVCTRL_INVEI_Pos) +#define AC_EVCTRL_INVEI(value) (AC_EVCTRL_INVEI_Msk & ((value) << AC_EVCTRL_INVEI_Pos)) +#define AC_EVCTRL_MASK _U_(0x3313) /**< \brief (AC_EVCTRL) MASK Register */ + +/* -------- AC_INTENCLR : (AC Offset: 0x04) (R/W 8) Interrupt Enable Clear -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t COMP0:1; /*!< bit: 0 Comparator 0 Interrupt Enable */ + uint8_t COMP1:1; /*!< bit: 1 Comparator 1 Interrupt Enable */ + uint8_t :2; /*!< bit: 2.. 3 Reserved */ + uint8_t WIN0:1; /*!< bit: 4 Window 0 Interrupt Enable */ + uint8_t :3; /*!< bit: 5.. 7 Reserved */ + } bit; /*!< Structure used for bit access */ + struct { + uint8_t COMP:2; /*!< bit: 0.. 1 Comparator x Interrupt Enable */ + uint8_t :2; /*!< bit: 2.. 3 Reserved */ + uint8_t WIN:1; /*!< bit: 4 Window x Interrupt Enable */ + uint8_t :3; /*!< bit: 5.. 7 Reserved */ + } vec; /*!< Structure used for vec access */ + uint8_t reg; /*!< Type used for register access */ +} AC_INTENCLR_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define AC_INTENCLR_OFFSET 0x04 /**< \brief (AC_INTENCLR offset) Interrupt Enable Clear */ +#define AC_INTENCLR_RESETVALUE _U_(0x00) /**< \brief (AC_INTENCLR reset_value) Interrupt Enable Clear */ + +#define AC_INTENCLR_COMP0_Pos 0 /**< \brief (AC_INTENCLR) Comparator 0 Interrupt Enable */ +#define AC_INTENCLR_COMP0 (_U_(1) << AC_INTENCLR_COMP0_Pos) +#define AC_INTENCLR_COMP1_Pos 1 /**< \brief (AC_INTENCLR) Comparator 1 Interrupt Enable */ +#define AC_INTENCLR_COMP1 (_U_(1) << AC_INTENCLR_COMP1_Pos) +#define AC_INTENCLR_COMP_Pos 0 /**< \brief (AC_INTENCLR) Comparator x Interrupt Enable */ +#define AC_INTENCLR_COMP_Msk (_U_(0x3) << AC_INTENCLR_COMP_Pos) +#define AC_INTENCLR_COMP(value) (AC_INTENCLR_COMP_Msk & ((value) << AC_INTENCLR_COMP_Pos)) +#define AC_INTENCLR_WIN0_Pos 4 /**< \brief (AC_INTENCLR) Window 0 Interrupt Enable */ +#define AC_INTENCLR_WIN0 (_U_(1) << AC_INTENCLR_WIN0_Pos) +#define AC_INTENCLR_WIN_Pos 4 /**< \brief (AC_INTENCLR) Window x Interrupt Enable */ +#define AC_INTENCLR_WIN_Msk (_U_(0x1) << AC_INTENCLR_WIN_Pos) +#define AC_INTENCLR_WIN(value) (AC_INTENCLR_WIN_Msk & ((value) << AC_INTENCLR_WIN_Pos)) +#define AC_INTENCLR_MASK _U_(0x13) /**< \brief (AC_INTENCLR) MASK Register */ + +/* -------- AC_INTENSET : (AC Offset: 0x05) (R/W 8) Interrupt Enable Set -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t COMP0:1; /*!< bit: 0 Comparator 0 Interrupt Enable */ + uint8_t COMP1:1; /*!< bit: 1 Comparator 1 Interrupt Enable */ + uint8_t :2; /*!< bit: 2.. 3 Reserved */ + uint8_t WIN0:1; /*!< bit: 4 Window 0 Interrupt Enable */ + uint8_t :3; /*!< bit: 5.. 7 Reserved */ + } bit; /*!< Structure used for bit access */ + struct { + uint8_t COMP:2; /*!< bit: 0.. 1 Comparator x Interrupt Enable */ + uint8_t :2; /*!< bit: 2.. 3 Reserved */ + uint8_t WIN:1; /*!< bit: 4 Window x Interrupt Enable */ + uint8_t :3; /*!< bit: 5.. 7 Reserved */ + } vec; /*!< Structure used for vec access */ + uint8_t reg; /*!< Type used for register access */ +} AC_INTENSET_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define AC_INTENSET_OFFSET 0x05 /**< \brief (AC_INTENSET offset) Interrupt Enable Set */ +#define AC_INTENSET_RESETVALUE _U_(0x00) /**< \brief (AC_INTENSET reset_value) Interrupt Enable Set */ + +#define AC_INTENSET_COMP0_Pos 0 /**< \brief (AC_INTENSET) Comparator 0 Interrupt Enable */ +#define AC_INTENSET_COMP0 (_U_(1) << AC_INTENSET_COMP0_Pos) +#define AC_INTENSET_COMP1_Pos 1 /**< \brief (AC_INTENSET) Comparator 1 Interrupt Enable */ +#define AC_INTENSET_COMP1 (_U_(1) << AC_INTENSET_COMP1_Pos) +#define AC_INTENSET_COMP_Pos 0 /**< \brief (AC_INTENSET) Comparator x Interrupt Enable */ +#define AC_INTENSET_COMP_Msk (_U_(0x3) << AC_INTENSET_COMP_Pos) +#define AC_INTENSET_COMP(value) (AC_INTENSET_COMP_Msk & ((value) << AC_INTENSET_COMP_Pos)) +#define AC_INTENSET_WIN0_Pos 4 /**< \brief (AC_INTENSET) Window 0 Interrupt Enable */ +#define AC_INTENSET_WIN0 (_U_(1) << AC_INTENSET_WIN0_Pos) +#define AC_INTENSET_WIN_Pos 4 /**< \brief (AC_INTENSET) Window x Interrupt Enable */ +#define AC_INTENSET_WIN_Msk (_U_(0x1) << AC_INTENSET_WIN_Pos) +#define AC_INTENSET_WIN(value) (AC_INTENSET_WIN_Msk & ((value) << AC_INTENSET_WIN_Pos)) +#define AC_INTENSET_MASK _U_(0x13) /**< \brief (AC_INTENSET) MASK Register */ + +/* -------- AC_INTFLAG : (AC Offset: 0x06) (R/W 8) Interrupt Flag Status and Clear -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { // __I to avoid read-modify-write on write-to-clear register + struct { + __I uint8_t COMP0:1; /*!< bit: 0 Comparator 0 */ + __I uint8_t COMP1:1; /*!< bit: 1 Comparator 1 */ + __I uint8_t :2; /*!< bit: 2.. 3 Reserved */ + __I uint8_t WIN0:1; /*!< bit: 4 Window 0 */ + __I uint8_t :3; /*!< bit: 5.. 7 Reserved */ + } bit; /*!< Structure used for bit access */ + struct { + __I uint8_t COMP:2; /*!< bit: 0.. 1 Comparator x */ + __I uint8_t :2; /*!< bit: 2.. 3 Reserved */ + __I uint8_t WIN:1; /*!< bit: 4 Window x */ + __I uint8_t :3; /*!< bit: 5.. 7 Reserved */ + } vec; /*!< Structure used for vec access */ + uint8_t reg; /*!< Type used for register access */ +} AC_INTFLAG_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define AC_INTFLAG_OFFSET 0x06 /**< \brief (AC_INTFLAG offset) Interrupt Flag Status and Clear */ +#define AC_INTFLAG_RESETVALUE _U_(0x00) /**< \brief (AC_INTFLAG reset_value) Interrupt Flag Status and Clear */ + +#define AC_INTFLAG_COMP0_Pos 0 /**< \brief (AC_INTFLAG) Comparator 0 */ +#define AC_INTFLAG_COMP0 (_U_(1) << AC_INTFLAG_COMP0_Pos) +#define AC_INTFLAG_COMP1_Pos 1 /**< \brief (AC_INTFLAG) Comparator 1 */ +#define AC_INTFLAG_COMP1 (_U_(1) << AC_INTFLAG_COMP1_Pos) +#define AC_INTFLAG_COMP_Pos 0 /**< \brief (AC_INTFLAG) Comparator x */ +#define AC_INTFLAG_COMP_Msk (_U_(0x3) << AC_INTFLAG_COMP_Pos) +#define AC_INTFLAG_COMP(value) (AC_INTFLAG_COMP_Msk & ((value) << AC_INTFLAG_COMP_Pos)) +#define AC_INTFLAG_WIN0_Pos 4 /**< \brief (AC_INTFLAG) Window 0 */ +#define AC_INTFLAG_WIN0 (_U_(1) << AC_INTFLAG_WIN0_Pos) +#define AC_INTFLAG_WIN_Pos 4 /**< \brief (AC_INTFLAG) Window x */ +#define AC_INTFLAG_WIN_Msk (_U_(0x1) << AC_INTFLAG_WIN_Pos) +#define AC_INTFLAG_WIN(value) (AC_INTFLAG_WIN_Msk & ((value) << AC_INTFLAG_WIN_Pos)) +#define AC_INTFLAG_MASK _U_(0x13) /**< \brief (AC_INTFLAG) MASK Register */ + +/* -------- AC_STATUSA : (AC Offset: 0x07) (R/ 8) Status A -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t STATE0:1; /*!< bit: 0 Comparator 0 Current State */ + uint8_t STATE1:1; /*!< bit: 1 Comparator 1 Current State */ + uint8_t :2; /*!< bit: 2.. 3 Reserved */ + uint8_t WSTATE0:2; /*!< bit: 4.. 5 Window 0 Current State */ + uint8_t :2; /*!< bit: 6.. 7 Reserved */ + } bit; /*!< Structure used for bit access */ + struct { + uint8_t STATE:2; /*!< bit: 0.. 1 Comparator x Current State */ + uint8_t :6; /*!< bit: 2.. 7 Reserved */ + } vec; /*!< Structure used for vec access */ + uint8_t reg; /*!< Type used for register access */ +} AC_STATUSA_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define AC_STATUSA_OFFSET 0x07 /**< \brief (AC_STATUSA offset) Status A */ +#define AC_STATUSA_RESETVALUE _U_(0x00) /**< \brief (AC_STATUSA reset_value) Status A */ + +#define AC_STATUSA_STATE0_Pos 0 /**< \brief (AC_STATUSA) Comparator 0 Current State */ +#define AC_STATUSA_STATE0 (_U_(1) << AC_STATUSA_STATE0_Pos) +#define AC_STATUSA_STATE1_Pos 1 /**< \brief (AC_STATUSA) Comparator 1 Current State */ +#define AC_STATUSA_STATE1 (_U_(1) << AC_STATUSA_STATE1_Pos) +#define AC_STATUSA_STATE_Pos 0 /**< \brief (AC_STATUSA) Comparator x Current State */ +#define AC_STATUSA_STATE_Msk (_U_(0x3) << AC_STATUSA_STATE_Pos) +#define AC_STATUSA_STATE(value) (AC_STATUSA_STATE_Msk & ((value) << AC_STATUSA_STATE_Pos)) +#define AC_STATUSA_WSTATE0_Pos 4 /**< \brief (AC_STATUSA) Window 0 Current State */ +#define AC_STATUSA_WSTATE0_Msk (_U_(0x3) << AC_STATUSA_WSTATE0_Pos) +#define AC_STATUSA_WSTATE0(value) (AC_STATUSA_WSTATE0_Msk & ((value) << AC_STATUSA_WSTATE0_Pos)) +#define AC_STATUSA_WSTATE0_ABOVE_Val _U_(0x0) /**< \brief (AC_STATUSA) Signal is above window */ +#define AC_STATUSA_WSTATE0_INSIDE_Val _U_(0x1) /**< \brief (AC_STATUSA) Signal is inside window */ +#define AC_STATUSA_WSTATE0_BELOW_Val _U_(0x2) /**< \brief (AC_STATUSA) Signal is below window */ +#define AC_STATUSA_WSTATE0_ABOVE (AC_STATUSA_WSTATE0_ABOVE_Val << AC_STATUSA_WSTATE0_Pos) +#define AC_STATUSA_WSTATE0_INSIDE (AC_STATUSA_WSTATE0_INSIDE_Val << AC_STATUSA_WSTATE0_Pos) +#define AC_STATUSA_WSTATE0_BELOW (AC_STATUSA_WSTATE0_BELOW_Val << AC_STATUSA_WSTATE0_Pos) +#define AC_STATUSA_MASK _U_(0x33) /**< \brief (AC_STATUSA) MASK Register */ + +/* -------- AC_STATUSB : (AC Offset: 0x08) (R/ 8) Status B -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t READY0:1; /*!< bit: 0 Comparator 0 Ready */ + uint8_t READY1:1; /*!< bit: 1 Comparator 1 Ready */ + uint8_t :6; /*!< bit: 2.. 7 Reserved */ + } bit; /*!< Structure used for bit access */ + struct { + uint8_t READY:2; /*!< bit: 0.. 1 Comparator x Ready */ + uint8_t :6; /*!< bit: 2.. 7 Reserved */ + } vec; /*!< Structure used for vec access */ + uint8_t reg; /*!< Type used for register access */ +} AC_STATUSB_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define AC_STATUSB_OFFSET 0x08 /**< \brief (AC_STATUSB offset) Status B */ +#define AC_STATUSB_RESETVALUE _U_(0x00) /**< \brief (AC_STATUSB reset_value) Status B */ + +#define AC_STATUSB_READY0_Pos 0 /**< \brief (AC_STATUSB) Comparator 0 Ready */ +#define AC_STATUSB_READY0 (_U_(1) << AC_STATUSB_READY0_Pos) +#define AC_STATUSB_READY1_Pos 1 /**< \brief (AC_STATUSB) Comparator 1 Ready */ +#define AC_STATUSB_READY1 (_U_(1) << AC_STATUSB_READY1_Pos) +#define AC_STATUSB_READY_Pos 0 /**< \brief (AC_STATUSB) Comparator x Ready */ +#define AC_STATUSB_READY_Msk (_U_(0x3) << AC_STATUSB_READY_Pos) +#define AC_STATUSB_READY(value) (AC_STATUSB_READY_Msk & ((value) << AC_STATUSB_READY_Pos)) +#define AC_STATUSB_MASK _U_(0x03) /**< \brief (AC_STATUSB) MASK Register */ + +/* -------- AC_DBGCTRL : (AC Offset: 0x09) (R/W 8) Debug Control -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t DBGRUN:1; /*!< bit: 0 Debug Run */ + uint8_t :7; /*!< bit: 1.. 7 Reserved */ + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} AC_DBGCTRL_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define AC_DBGCTRL_OFFSET 0x09 /**< \brief (AC_DBGCTRL offset) Debug Control */ +#define AC_DBGCTRL_RESETVALUE _U_(0x00) /**< \brief (AC_DBGCTRL reset_value) Debug Control */ + +#define AC_DBGCTRL_DBGRUN_Pos 0 /**< \brief (AC_DBGCTRL) Debug Run */ +#define AC_DBGCTRL_DBGRUN (_U_(0x1) << AC_DBGCTRL_DBGRUN_Pos) +#define AC_DBGCTRL_MASK _U_(0x01) /**< \brief (AC_DBGCTRL) MASK Register */ + +/* -------- AC_WINCTRL : (AC Offset: 0x0A) (R/W 8) Window Control -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t WEN0:1; /*!< bit: 0 Window 0 Mode Enable */ + uint8_t WINTSEL0:2; /*!< bit: 1.. 2 Window 0 Interrupt Selection */ + uint8_t :5; /*!< bit: 3.. 7 Reserved */ + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} AC_WINCTRL_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define AC_WINCTRL_OFFSET 0x0A /**< \brief (AC_WINCTRL offset) Window Control */ +#define AC_WINCTRL_RESETVALUE _U_(0x00) /**< \brief (AC_WINCTRL reset_value) Window Control */ + +#define AC_WINCTRL_WEN0_Pos 0 /**< \brief (AC_WINCTRL) Window 0 Mode Enable */ +#define AC_WINCTRL_WEN0 (_U_(0x1) << AC_WINCTRL_WEN0_Pos) +#define AC_WINCTRL_WINTSEL0_Pos 1 /**< \brief (AC_WINCTRL) Window 0 Interrupt Selection */ +#define AC_WINCTRL_WINTSEL0_Msk (_U_(0x3) << AC_WINCTRL_WINTSEL0_Pos) +#define AC_WINCTRL_WINTSEL0(value) (AC_WINCTRL_WINTSEL0_Msk & ((value) << AC_WINCTRL_WINTSEL0_Pos)) +#define AC_WINCTRL_WINTSEL0_ABOVE_Val _U_(0x0) /**< \brief (AC_WINCTRL) Interrupt on signal above window */ +#define AC_WINCTRL_WINTSEL0_INSIDE_Val _U_(0x1) /**< \brief (AC_WINCTRL) Interrupt on signal inside window */ +#define AC_WINCTRL_WINTSEL0_BELOW_Val _U_(0x2) /**< \brief (AC_WINCTRL) Interrupt on signal below window */ +#define AC_WINCTRL_WINTSEL0_OUTSIDE_Val _U_(0x3) /**< \brief (AC_WINCTRL) Interrupt on signal outside window */ +#define AC_WINCTRL_WINTSEL0_ABOVE (AC_WINCTRL_WINTSEL0_ABOVE_Val << AC_WINCTRL_WINTSEL0_Pos) +#define AC_WINCTRL_WINTSEL0_INSIDE (AC_WINCTRL_WINTSEL0_INSIDE_Val << AC_WINCTRL_WINTSEL0_Pos) +#define AC_WINCTRL_WINTSEL0_BELOW (AC_WINCTRL_WINTSEL0_BELOW_Val << AC_WINCTRL_WINTSEL0_Pos) +#define AC_WINCTRL_WINTSEL0_OUTSIDE (AC_WINCTRL_WINTSEL0_OUTSIDE_Val << AC_WINCTRL_WINTSEL0_Pos) +#define AC_WINCTRL_MASK _U_(0x07) /**< \brief (AC_WINCTRL) MASK Register */ + +/* -------- AC_SCALER : (AC Offset: 0x0C) (R/W 8) Scaler n -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t VALUE:6; /*!< bit: 0.. 5 Scaler Value */ + uint8_t :2; /*!< bit: 6.. 7 Reserved */ + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} AC_SCALER_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define AC_SCALER_OFFSET 0x0C /**< \brief (AC_SCALER offset) Scaler n */ +#define AC_SCALER_RESETVALUE _U_(0x00) /**< \brief (AC_SCALER reset_value) Scaler n */ + +#define AC_SCALER_VALUE_Pos 0 /**< \brief (AC_SCALER) Scaler Value */ +#define AC_SCALER_VALUE_Msk (_U_(0x3F) << AC_SCALER_VALUE_Pos) +#define AC_SCALER_VALUE(value) (AC_SCALER_VALUE_Msk & ((value) << AC_SCALER_VALUE_Pos)) +#define AC_SCALER_MASK _U_(0x3F) /**< \brief (AC_SCALER) MASK Register */ + +/* -------- AC_COMPCTRL : (AC Offset: 0x10) (R/W 32) Comparator Control n -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t :1; /*!< bit: 0 Reserved */ + uint32_t ENABLE:1; /*!< bit: 1 Enable */ + uint32_t SINGLE:1; /*!< bit: 2 Single-Shot Mode */ + uint32_t INTSEL:2; /*!< bit: 3.. 4 Interrupt Selection */ + uint32_t :1; /*!< bit: 5 Reserved */ + uint32_t RUNSTDBY:1; /*!< bit: 6 Run in Standby */ + uint32_t :1; /*!< bit: 7 Reserved */ + uint32_t MUXNEG:3; /*!< bit: 8..10 Negative Input Mux Selection */ + uint32_t :1; /*!< bit: 11 Reserved */ + uint32_t MUXPOS:3; /*!< bit: 12..14 Positive Input Mux Selection */ + uint32_t SWAP:1; /*!< bit: 15 Swap Inputs and Invert */ + uint32_t SPEED:2; /*!< bit: 16..17 Speed Selection */ + uint32_t :1; /*!< bit: 18 Reserved */ + uint32_t HYSTEN:1; /*!< bit: 19 Hysteresis Enable */ + uint32_t HYST:2; /*!< bit: 20..21 Hysteresis Level */ + uint32_t :2; /*!< bit: 22..23 Reserved */ + uint32_t FLEN:3; /*!< bit: 24..26 Filter Length */ + uint32_t :1; /*!< bit: 27 Reserved */ + uint32_t OUT:2; /*!< bit: 28..29 Output */ + uint32_t :2; /*!< bit: 30..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} AC_COMPCTRL_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define AC_COMPCTRL_OFFSET 0x10 /**< \brief (AC_COMPCTRL offset) Comparator Control n */ +#define AC_COMPCTRL_RESETVALUE _U_(0x00000000) /**< \brief (AC_COMPCTRL reset_value) Comparator Control n */ + +#define AC_COMPCTRL_ENABLE_Pos 1 /**< \brief (AC_COMPCTRL) Enable */ +#define AC_COMPCTRL_ENABLE (_U_(0x1) << AC_COMPCTRL_ENABLE_Pos) +#define AC_COMPCTRL_SINGLE_Pos 2 /**< \brief (AC_COMPCTRL) Single-Shot Mode */ +#define AC_COMPCTRL_SINGLE (_U_(0x1) << AC_COMPCTRL_SINGLE_Pos) +#define AC_COMPCTRL_INTSEL_Pos 3 /**< \brief (AC_COMPCTRL) Interrupt Selection */ +#define AC_COMPCTRL_INTSEL_Msk (_U_(0x3) << AC_COMPCTRL_INTSEL_Pos) +#define AC_COMPCTRL_INTSEL(value) (AC_COMPCTRL_INTSEL_Msk & ((value) << AC_COMPCTRL_INTSEL_Pos)) +#define AC_COMPCTRL_INTSEL_TOGGLE_Val _U_(0x0) /**< \brief (AC_COMPCTRL) Interrupt on comparator output toggle */ +#define AC_COMPCTRL_INTSEL_RISING_Val _U_(0x1) /**< \brief (AC_COMPCTRL) Interrupt on comparator output rising */ +#define AC_COMPCTRL_INTSEL_FALLING_Val _U_(0x2) /**< \brief (AC_COMPCTRL) Interrupt on comparator output falling */ +#define AC_COMPCTRL_INTSEL_EOC_Val _U_(0x3) /**< \brief (AC_COMPCTRL) Interrupt on end of comparison (single-shot mode only) */ +#define AC_COMPCTRL_INTSEL_TOGGLE (AC_COMPCTRL_INTSEL_TOGGLE_Val << AC_COMPCTRL_INTSEL_Pos) +#define AC_COMPCTRL_INTSEL_RISING (AC_COMPCTRL_INTSEL_RISING_Val << AC_COMPCTRL_INTSEL_Pos) +#define AC_COMPCTRL_INTSEL_FALLING (AC_COMPCTRL_INTSEL_FALLING_Val << AC_COMPCTRL_INTSEL_Pos) +#define AC_COMPCTRL_INTSEL_EOC (AC_COMPCTRL_INTSEL_EOC_Val << AC_COMPCTRL_INTSEL_Pos) +#define AC_COMPCTRL_RUNSTDBY_Pos 6 /**< \brief (AC_COMPCTRL) Run in Standby */ +#define AC_COMPCTRL_RUNSTDBY (_U_(0x1) << AC_COMPCTRL_RUNSTDBY_Pos) +#define AC_COMPCTRL_MUXNEG_Pos 8 /**< \brief (AC_COMPCTRL) Negative Input Mux Selection */ +#define AC_COMPCTRL_MUXNEG_Msk (_U_(0x7) << AC_COMPCTRL_MUXNEG_Pos) +#define AC_COMPCTRL_MUXNEG(value) (AC_COMPCTRL_MUXNEG_Msk & ((value) << AC_COMPCTRL_MUXNEG_Pos)) +#define AC_COMPCTRL_MUXNEG_PIN0_Val _U_(0x0) /**< \brief (AC_COMPCTRL) I/O pin 0 */ +#define AC_COMPCTRL_MUXNEG_PIN1_Val _U_(0x1) /**< \brief (AC_COMPCTRL) I/O pin 1 */ +#define AC_COMPCTRL_MUXNEG_PIN2_Val _U_(0x2) /**< \brief (AC_COMPCTRL) I/O pin 2 */ +#define AC_COMPCTRL_MUXNEG_PIN3_Val _U_(0x3) /**< \brief (AC_COMPCTRL) I/O pin 3 */ +#define AC_COMPCTRL_MUXNEG_GND_Val _U_(0x4) /**< \brief (AC_COMPCTRL) Ground */ +#define AC_COMPCTRL_MUXNEG_VSCALE_Val _U_(0x5) /**< \brief (AC_COMPCTRL) VDD scaler */ +#define AC_COMPCTRL_MUXNEG_BANDGAP_Val _U_(0x6) /**< \brief (AC_COMPCTRL) Internal bandgap voltage */ +#define AC_COMPCTRL_MUXNEG_DAC_Val _U_(0x7) /**< \brief (AC_COMPCTRL) DAC output */ +#define AC_COMPCTRL_MUXNEG_PIN0 (AC_COMPCTRL_MUXNEG_PIN0_Val << AC_COMPCTRL_MUXNEG_Pos) +#define AC_COMPCTRL_MUXNEG_PIN1 (AC_COMPCTRL_MUXNEG_PIN1_Val << AC_COMPCTRL_MUXNEG_Pos) +#define AC_COMPCTRL_MUXNEG_PIN2 (AC_COMPCTRL_MUXNEG_PIN2_Val << AC_COMPCTRL_MUXNEG_Pos) +#define AC_COMPCTRL_MUXNEG_PIN3 (AC_COMPCTRL_MUXNEG_PIN3_Val << AC_COMPCTRL_MUXNEG_Pos) +#define AC_COMPCTRL_MUXNEG_GND (AC_COMPCTRL_MUXNEG_GND_Val << AC_COMPCTRL_MUXNEG_Pos) +#define AC_COMPCTRL_MUXNEG_VSCALE (AC_COMPCTRL_MUXNEG_VSCALE_Val << AC_COMPCTRL_MUXNEG_Pos) +#define AC_COMPCTRL_MUXNEG_BANDGAP (AC_COMPCTRL_MUXNEG_BANDGAP_Val << AC_COMPCTRL_MUXNEG_Pos) +#define AC_COMPCTRL_MUXNEG_DAC (AC_COMPCTRL_MUXNEG_DAC_Val << AC_COMPCTRL_MUXNEG_Pos) +#define AC_COMPCTRL_MUXPOS_Pos 12 /**< \brief (AC_COMPCTRL) Positive Input Mux Selection */ +#define AC_COMPCTRL_MUXPOS_Msk (_U_(0x7) << AC_COMPCTRL_MUXPOS_Pos) +#define AC_COMPCTRL_MUXPOS(value) (AC_COMPCTRL_MUXPOS_Msk & ((value) << AC_COMPCTRL_MUXPOS_Pos)) +#define AC_COMPCTRL_MUXPOS_PIN0_Val _U_(0x0) /**< \brief (AC_COMPCTRL) I/O pin 0 */ +#define AC_COMPCTRL_MUXPOS_PIN1_Val _U_(0x1) /**< \brief (AC_COMPCTRL) I/O pin 1 */ +#define AC_COMPCTRL_MUXPOS_PIN2_Val _U_(0x2) /**< \brief (AC_COMPCTRL) I/O pin 2 */ +#define AC_COMPCTRL_MUXPOS_PIN3_Val _U_(0x3) /**< \brief (AC_COMPCTRL) I/O pin 3 */ +#define AC_COMPCTRL_MUXPOS_VSCALE_Val _U_(0x4) /**< \brief (AC_COMPCTRL) VDD Scaler */ +#define AC_COMPCTRL_MUXPOS_PIN0 (AC_COMPCTRL_MUXPOS_PIN0_Val << AC_COMPCTRL_MUXPOS_Pos) +#define AC_COMPCTRL_MUXPOS_PIN1 (AC_COMPCTRL_MUXPOS_PIN1_Val << AC_COMPCTRL_MUXPOS_Pos) +#define AC_COMPCTRL_MUXPOS_PIN2 (AC_COMPCTRL_MUXPOS_PIN2_Val << AC_COMPCTRL_MUXPOS_Pos) +#define AC_COMPCTRL_MUXPOS_PIN3 (AC_COMPCTRL_MUXPOS_PIN3_Val << AC_COMPCTRL_MUXPOS_Pos) +#define AC_COMPCTRL_MUXPOS_VSCALE (AC_COMPCTRL_MUXPOS_VSCALE_Val << AC_COMPCTRL_MUXPOS_Pos) +#define AC_COMPCTRL_SWAP_Pos 15 /**< \brief (AC_COMPCTRL) Swap Inputs and Invert */ +#define AC_COMPCTRL_SWAP (_U_(0x1) << AC_COMPCTRL_SWAP_Pos) +#define AC_COMPCTRL_SPEED_Pos 16 /**< \brief (AC_COMPCTRL) Speed Selection */ +#define AC_COMPCTRL_SPEED_Msk (_U_(0x3) << AC_COMPCTRL_SPEED_Pos) +#define AC_COMPCTRL_SPEED(value) (AC_COMPCTRL_SPEED_Msk & ((value) << AC_COMPCTRL_SPEED_Pos)) +#define AC_COMPCTRL_SPEED_HIGH_Val _U_(0x3) /**< \brief (AC_COMPCTRL) High speed */ +#define AC_COMPCTRL_SPEED_HIGH (AC_COMPCTRL_SPEED_HIGH_Val << AC_COMPCTRL_SPEED_Pos) +#define AC_COMPCTRL_HYSTEN_Pos 19 /**< \brief (AC_COMPCTRL) Hysteresis Enable */ +#define AC_COMPCTRL_HYSTEN (_U_(0x1) << AC_COMPCTRL_HYSTEN_Pos) +#define AC_COMPCTRL_HYST_Pos 20 /**< \brief (AC_COMPCTRL) Hysteresis Level */ +#define AC_COMPCTRL_HYST_Msk (_U_(0x3) << AC_COMPCTRL_HYST_Pos) +#define AC_COMPCTRL_HYST(value) (AC_COMPCTRL_HYST_Msk & ((value) << AC_COMPCTRL_HYST_Pos)) +#define AC_COMPCTRL_HYST_HYST50_Val _U_(0x0) /**< \brief (AC_COMPCTRL) 50mV */ +#define AC_COMPCTRL_HYST_HYST100_Val _U_(0x1) /**< \brief (AC_COMPCTRL) 100mV */ +#define AC_COMPCTRL_HYST_HYST150_Val _U_(0x2) /**< \brief (AC_COMPCTRL) 150mV */ +#define AC_COMPCTRL_HYST_HYST50 (AC_COMPCTRL_HYST_HYST50_Val << AC_COMPCTRL_HYST_Pos) +#define AC_COMPCTRL_HYST_HYST100 (AC_COMPCTRL_HYST_HYST100_Val << AC_COMPCTRL_HYST_Pos) +#define AC_COMPCTRL_HYST_HYST150 (AC_COMPCTRL_HYST_HYST150_Val << AC_COMPCTRL_HYST_Pos) +#define AC_COMPCTRL_FLEN_Pos 24 /**< \brief (AC_COMPCTRL) Filter Length */ +#define AC_COMPCTRL_FLEN_Msk (_U_(0x7) << AC_COMPCTRL_FLEN_Pos) +#define AC_COMPCTRL_FLEN(value) (AC_COMPCTRL_FLEN_Msk & ((value) << AC_COMPCTRL_FLEN_Pos)) +#define AC_COMPCTRL_FLEN_OFF_Val _U_(0x0) /**< \brief (AC_COMPCTRL) No filtering */ +#define AC_COMPCTRL_FLEN_MAJ3_Val _U_(0x1) /**< \brief (AC_COMPCTRL) 3-bit majority function (2 of 3) */ +#define AC_COMPCTRL_FLEN_MAJ5_Val _U_(0x2) /**< \brief (AC_COMPCTRL) 5-bit majority function (3 of 5) */ +#define AC_COMPCTRL_FLEN_OFF (AC_COMPCTRL_FLEN_OFF_Val << AC_COMPCTRL_FLEN_Pos) +#define AC_COMPCTRL_FLEN_MAJ3 (AC_COMPCTRL_FLEN_MAJ3_Val << AC_COMPCTRL_FLEN_Pos) +#define AC_COMPCTRL_FLEN_MAJ5 (AC_COMPCTRL_FLEN_MAJ5_Val << AC_COMPCTRL_FLEN_Pos) +#define AC_COMPCTRL_OUT_Pos 28 /**< \brief (AC_COMPCTRL) Output */ +#define AC_COMPCTRL_OUT_Msk (_U_(0x3) << AC_COMPCTRL_OUT_Pos) +#define AC_COMPCTRL_OUT(value) (AC_COMPCTRL_OUT_Msk & ((value) << AC_COMPCTRL_OUT_Pos)) +#define AC_COMPCTRL_OUT_OFF_Val _U_(0x0) /**< \brief (AC_COMPCTRL) The output of COMPn is not routed to the COMPn I/O port */ +#define AC_COMPCTRL_OUT_ASYNC_Val _U_(0x1) /**< \brief (AC_COMPCTRL) The asynchronous output of COMPn is routed to the COMPn I/O port */ +#define AC_COMPCTRL_OUT_SYNC_Val _U_(0x2) /**< \brief (AC_COMPCTRL) The synchronous output (including filtering) of COMPn is routed to the COMPn I/O port */ +#define AC_COMPCTRL_OUT_OFF (AC_COMPCTRL_OUT_OFF_Val << AC_COMPCTRL_OUT_Pos) +#define AC_COMPCTRL_OUT_ASYNC (AC_COMPCTRL_OUT_ASYNC_Val << AC_COMPCTRL_OUT_Pos) +#define AC_COMPCTRL_OUT_SYNC (AC_COMPCTRL_OUT_SYNC_Val << AC_COMPCTRL_OUT_Pos) +#define AC_COMPCTRL_MASK _U_(0x373BF75E) /**< \brief (AC_COMPCTRL) MASK Register */ + +/* -------- AC_SYNCBUSY : (AC Offset: 0x20) (R/ 32) Synchronization Busy -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t SWRST:1; /*!< bit: 0 Software Reset Synchronization Busy */ + uint32_t ENABLE:1; /*!< bit: 1 Enable Synchronization Busy */ + uint32_t WINCTRL:1; /*!< bit: 2 WINCTRL Synchronization Busy */ + uint32_t COMPCTRL0:1; /*!< bit: 3 COMPCTRL 0 Synchronization Busy */ + uint32_t COMPCTRL1:1; /*!< bit: 4 COMPCTRL 1 Synchronization Busy */ + uint32_t :27; /*!< bit: 5..31 Reserved */ + } bit; /*!< Structure used for bit access */ + struct { + uint32_t :3; /*!< bit: 0.. 2 Reserved */ + uint32_t COMPCTRL:2; /*!< bit: 3.. 4 COMPCTRL x Synchronization Busy */ + uint32_t :27; /*!< bit: 5..31 Reserved */ + } vec; /*!< Structure used for vec access */ + uint32_t reg; /*!< Type used for register access */ +} AC_SYNCBUSY_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define AC_SYNCBUSY_OFFSET 0x20 /**< \brief (AC_SYNCBUSY offset) Synchronization Busy */ +#define AC_SYNCBUSY_RESETVALUE _U_(0x00000000) /**< \brief (AC_SYNCBUSY reset_value) Synchronization Busy */ + +#define AC_SYNCBUSY_SWRST_Pos 0 /**< \brief (AC_SYNCBUSY) Software Reset Synchronization Busy */ +#define AC_SYNCBUSY_SWRST (_U_(0x1) << AC_SYNCBUSY_SWRST_Pos) +#define AC_SYNCBUSY_ENABLE_Pos 1 /**< \brief (AC_SYNCBUSY) Enable Synchronization Busy */ +#define AC_SYNCBUSY_ENABLE (_U_(0x1) << AC_SYNCBUSY_ENABLE_Pos) +#define AC_SYNCBUSY_WINCTRL_Pos 2 /**< \brief (AC_SYNCBUSY) WINCTRL Synchronization Busy */ +#define AC_SYNCBUSY_WINCTRL (_U_(0x1) << AC_SYNCBUSY_WINCTRL_Pos) +#define AC_SYNCBUSY_COMPCTRL0_Pos 3 /**< \brief (AC_SYNCBUSY) COMPCTRL 0 Synchronization Busy */ +#define AC_SYNCBUSY_COMPCTRL0 (_U_(1) << AC_SYNCBUSY_COMPCTRL0_Pos) +#define AC_SYNCBUSY_COMPCTRL1_Pos 4 /**< \brief (AC_SYNCBUSY) COMPCTRL 1 Synchronization Busy */ +#define AC_SYNCBUSY_COMPCTRL1 (_U_(1) << AC_SYNCBUSY_COMPCTRL1_Pos) +#define AC_SYNCBUSY_COMPCTRL_Pos 3 /**< \brief (AC_SYNCBUSY) COMPCTRL x Synchronization Busy */ +#define AC_SYNCBUSY_COMPCTRL_Msk (_U_(0x3) << AC_SYNCBUSY_COMPCTRL_Pos) +#define AC_SYNCBUSY_COMPCTRL(value) (AC_SYNCBUSY_COMPCTRL_Msk & ((value) << AC_SYNCBUSY_COMPCTRL_Pos)) +#define AC_SYNCBUSY_MASK _U_(0x0000001F) /**< \brief (AC_SYNCBUSY) MASK Register */ + +/* -------- AC_CALIB : (AC Offset: 0x24) (R/W 16) Calibration -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint16_t BIAS0:2; /*!< bit: 0.. 1 COMP0/1 Bias Scaling */ + uint16_t :14; /*!< bit: 2..15 Reserved */ + } bit; /*!< Structure used for bit access */ + uint16_t reg; /*!< Type used for register access */ +} AC_CALIB_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define AC_CALIB_OFFSET 0x24 /**< \brief (AC_CALIB offset) Calibration */ +#define AC_CALIB_RESETVALUE _U_(0x0101) /**< \brief (AC_CALIB reset_value) Calibration */ + +#define AC_CALIB_BIAS0_Pos 0 /**< \brief (AC_CALIB) COMP0/1 Bias Scaling */ +#define AC_CALIB_BIAS0_Msk (_U_(0x3) << AC_CALIB_BIAS0_Pos) +#define AC_CALIB_BIAS0(value) (AC_CALIB_BIAS0_Msk & ((value) << AC_CALIB_BIAS0_Pos)) +#define AC_CALIB_MASK _U_(0x0003) /**< \brief (AC_CALIB) MASK Register */ + +/** \brief AC hardware registers */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef struct { + __IO AC_CTRLA_Type CTRLA; /**< \brief Offset: 0x00 (R/W 8) Control A */ + __O AC_CTRLB_Type CTRLB; /**< \brief Offset: 0x01 ( /W 8) Control B */ + __IO AC_EVCTRL_Type EVCTRL; /**< \brief Offset: 0x02 (R/W 16) Event Control */ + __IO AC_INTENCLR_Type INTENCLR; /**< \brief Offset: 0x04 (R/W 8) Interrupt Enable Clear */ + __IO AC_INTENSET_Type INTENSET; /**< \brief Offset: 0x05 (R/W 8) Interrupt Enable Set */ + __IO AC_INTFLAG_Type INTFLAG; /**< \brief Offset: 0x06 (R/W 8) Interrupt Flag Status and Clear */ + __I AC_STATUSA_Type STATUSA; /**< \brief Offset: 0x07 (R/ 8) Status A */ + __I AC_STATUSB_Type STATUSB; /**< \brief Offset: 0x08 (R/ 8) Status B */ + __IO AC_DBGCTRL_Type DBGCTRL; /**< \brief Offset: 0x09 (R/W 8) Debug Control */ + __IO AC_WINCTRL_Type WINCTRL; /**< \brief Offset: 0x0A (R/W 8) Window Control */ + RoReg8 Reserved1[0x1]; + __IO AC_SCALER_Type SCALER[2]; /**< \brief Offset: 0x0C (R/W 8) Scaler n */ + RoReg8 Reserved2[0x2]; + __IO AC_COMPCTRL_Type COMPCTRL[2]; /**< \brief Offset: 0x10 (R/W 32) Comparator Control n */ + RoReg8 Reserved3[0x8]; + __I AC_SYNCBUSY_Type SYNCBUSY; /**< \brief Offset: 0x20 (R/ 32) Synchronization Busy */ + __IO AC_CALIB_Type CALIB; /**< \brief Offset: 0x24 (R/W 16) Calibration */ +} Ac; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/*@}*/ + +#endif /* _SAMD51_AC_COMPONENT_ */ diff --git a/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/adc.h b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/adc.h new file mode 100644 index 000000000..33c38ae3f --- /dev/null +++ b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/adc.h @@ -0,0 +1,871 @@ +/** + * \file + * + * \brief Component description for ADC + * + * Copyright (c) 2017 Microchip Technology Inc. + * + * \asf_license_start + * + * \page License + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 Licence 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. + * + * \asf_license_stop + * + */ + +#ifndef _SAMD51_ADC_COMPONENT_ +#define _SAMD51_ADC_COMPONENT_ + +/* ========================================================================== */ +/** SOFTWARE API DEFINITION FOR ADC */ +/* ========================================================================== */ +/** \addtogroup SAMD51_ADC Analog Digital Converter */ +/*@{*/ + +#define ADC_U2500 +#define REV_ADC 0x100 + +/* -------- ADC_CTRLA : (ADC Offset: 0x00) (R/W 16) Control A -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint16_t SWRST:1; /*!< bit: 0 Software Reset */ + uint16_t ENABLE:1; /*!< bit: 1 Enable */ + uint16_t :1; /*!< bit: 2 Reserved */ + uint16_t DUALSEL:2; /*!< bit: 3.. 4 Dual Mode Trigger Selection */ + uint16_t SLAVEEN:1; /*!< bit: 5 Slave Enable */ + uint16_t RUNSTDBY:1; /*!< bit: 6 Run in Standby */ + uint16_t ONDEMAND:1; /*!< bit: 7 On Demand Control */ + uint16_t PRESCALER:3; /*!< bit: 8..10 Prescaler Configuration */ + uint16_t :4; /*!< bit: 11..14 Reserved */ + uint16_t R2R:1; /*!< bit: 15 Rail to Rail Operation Enable */ + } bit; /*!< Structure used for bit access */ + uint16_t reg; /*!< Type used for register access */ +} ADC_CTRLA_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define ADC_CTRLA_OFFSET 0x00 /**< \brief (ADC_CTRLA offset) Control A */ +#define ADC_CTRLA_RESETVALUE _U_(0x0000) /**< \brief (ADC_CTRLA reset_value) Control A */ + +#define ADC_CTRLA_SWRST_Pos 0 /**< \brief (ADC_CTRLA) Software Reset */ +#define ADC_CTRLA_SWRST (_U_(0x1) << ADC_CTRLA_SWRST_Pos) +#define ADC_CTRLA_ENABLE_Pos 1 /**< \brief (ADC_CTRLA) Enable */ +#define ADC_CTRLA_ENABLE (_U_(0x1) << ADC_CTRLA_ENABLE_Pos) +#define ADC_CTRLA_DUALSEL_Pos 3 /**< \brief (ADC_CTRLA) Dual Mode Trigger Selection */ +#define ADC_CTRLA_DUALSEL_Msk (_U_(0x3) << ADC_CTRLA_DUALSEL_Pos) +#define ADC_CTRLA_DUALSEL(value) (ADC_CTRLA_DUALSEL_Msk & ((value) << ADC_CTRLA_DUALSEL_Pos)) +#define ADC_CTRLA_DUALSEL_BOTH_Val _U_(0x0) /**< \brief (ADC_CTRLA) Start event or software trigger will start a conversion on both ADCs */ +#define ADC_CTRLA_DUALSEL_INTERLEAVE_Val _U_(0x1) /**< \brief (ADC_CTRLA) START event or software trigger will alternatingly start a conversion on ADC0 and ADC1 */ +#define ADC_CTRLA_DUALSEL_BOTH (ADC_CTRLA_DUALSEL_BOTH_Val << ADC_CTRLA_DUALSEL_Pos) +#define ADC_CTRLA_DUALSEL_INTERLEAVE (ADC_CTRLA_DUALSEL_INTERLEAVE_Val << ADC_CTRLA_DUALSEL_Pos) +#define ADC_CTRLA_SLAVEEN_Pos 5 /**< \brief (ADC_CTRLA) Slave Enable */ +#define ADC_CTRLA_SLAVEEN (_U_(0x1) << ADC_CTRLA_SLAVEEN_Pos) +#define ADC_CTRLA_RUNSTDBY_Pos 6 /**< \brief (ADC_CTRLA) Run in Standby */ +#define ADC_CTRLA_RUNSTDBY (_U_(0x1) << ADC_CTRLA_RUNSTDBY_Pos) +#define ADC_CTRLA_ONDEMAND_Pos 7 /**< \brief (ADC_CTRLA) On Demand Control */ +#define ADC_CTRLA_ONDEMAND (_U_(0x1) << ADC_CTRLA_ONDEMAND_Pos) +#define ADC_CTRLA_PRESCALER_Pos 8 /**< \brief (ADC_CTRLA) Prescaler Configuration */ +#define ADC_CTRLA_PRESCALER_Msk (_U_(0x7) << ADC_CTRLA_PRESCALER_Pos) +#define ADC_CTRLA_PRESCALER(value) (ADC_CTRLA_PRESCALER_Msk & ((value) << ADC_CTRLA_PRESCALER_Pos)) +#define ADC_CTRLA_PRESCALER_DIV2_Val _U_(0x0) /**< \brief (ADC_CTRLA) Peripheral clock divided by 2 */ +#define ADC_CTRLA_PRESCALER_DIV4_Val _U_(0x1) /**< \brief (ADC_CTRLA) Peripheral clock divided by 4 */ +#define ADC_CTRLA_PRESCALER_DIV8_Val _U_(0x2) /**< \brief (ADC_CTRLA) Peripheral clock divided by 8 */ +#define ADC_CTRLA_PRESCALER_DIV16_Val _U_(0x3) /**< \brief (ADC_CTRLA) Peripheral clock divided by 16 */ +#define ADC_CTRLA_PRESCALER_DIV32_Val _U_(0x4) /**< \brief (ADC_CTRLA) Peripheral clock divided by 32 */ +#define ADC_CTRLA_PRESCALER_DIV64_Val _U_(0x5) /**< \brief (ADC_CTRLA) Peripheral clock divided by 64 */ +#define ADC_CTRLA_PRESCALER_DIV128_Val _U_(0x6) /**< \brief (ADC_CTRLA) Peripheral clock divided by 128 */ +#define ADC_CTRLA_PRESCALER_DIV256_Val _U_(0x7) /**< \brief (ADC_CTRLA) Peripheral clock divided by 256 */ +#define ADC_CTRLA_PRESCALER_DIV2 (ADC_CTRLA_PRESCALER_DIV2_Val << ADC_CTRLA_PRESCALER_Pos) +#define ADC_CTRLA_PRESCALER_DIV4 (ADC_CTRLA_PRESCALER_DIV4_Val << ADC_CTRLA_PRESCALER_Pos) +#define ADC_CTRLA_PRESCALER_DIV8 (ADC_CTRLA_PRESCALER_DIV8_Val << ADC_CTRLA_PRESCALER_Pos) +#define ADC_CTRLA_PRESCALER_DIV16 (ADC_CTRLA_PRESCALER_DIV16_Val << ADC_CTRLA_PRESCALER_Pos) +#define ADC_CTRLA_PRESCALER_DIV32 (ADC_CTRLA_PRESCALER_DIV32_Val << ADC_CTRLA_PRESCALER_Pos) +#define ADC_CTRLA_PRESCALER_DIV64 (ADC_CTRLA_PRESCALER_DIV64_Val << ADC_CTRLA_PRESCALER_Pos) +#define ADC_CTRLA_PRESCALER_DIV128 (ADC_CTRLA_PRESCALER_DIV128_Val << ADC_CTRLA_PRESCALER_Pos) +#define ADC_CTRLA_PRESCALER_DIV256 (ADC_CTRLA_PRESCALER_DIV256_Val << ADC_CTRLA_PRESCALER_Pos) +#define ADC_CTRLA_R2R_Pos 15 /**< \brief (ADC_CTRLA) Rail to Rail Operation Enable */ +#define ADC_CTRLA_R2R (_U_(0x1) << ADC_CTRLA_R2R_Pos) +#define ADC_CTRLA_MASK _U_(0x87FB) /**< \brief (ADC_CTRLA) MASK Register */ + +/* -------- ADC_EVCTRL : (ADC Offset: 0x02) (R/W 8) Event Control -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t FLUSHEI:1; /*!< bit: 0 Flush Event Input Enable */ + uint8_t STARTEI:1; /*!< bit: 1 Start Conversion Event Input Enable */ + uint8_t FLUSHINV:1; /*!< bit: 2 Flush Event Invert Enable */ + uint8_t STARTINV:1; /*!< bit: 3 Start Conversion Event Invert Enable */ + uint8_t RESRDYEO:1; /*!< bit: 4 Result Ready Event Out */ + uint8_t WINMONEO:1; /*!< bit: 5 Window Monitor Event Out */ + uint8_t :2; /*!< bit: 6.. 7 Reserved */ + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} ADC_EVCTRL_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define ADC_EVCTRL_OFFSET 0x02 /**< \brief (ADC_EVCTRL offset) Event Control */ +#define ADC_EVCTRL_RESETVALUE _U_(0x00) /**< \brief (ADC_EVCTRL reset_value) Event Control */ + +#define ADC_EVCTRL_FLUSHEI_Pos 0 /**< \brief (ADC_EVCTRL) Flush Event Input Enable */ +#define ADC_EVCTRL_FLUSHEI (_U_(0x1) << ADC_EVCTRL_FLUSHEI_Pos) +#define ADC_EVCTRL_STARTEI_Pos 1 /**< \brief (ADC_EVCTRL) Start Conversion Event Input Enable */ +#define ADC_EVCTRL_STARTEI (_U_(0x1) << ADC_EVCTRL_STARTEI_Pos) +#define ADC_EVCTRL_FLUSHINV_Pos 2 /**< \brief (ADC_EVCTRL) Flush Event Invert Enable */ +#define ADC_EVCTRL_FLUSHINV (_U_(0x1) << ADC_EVCTRL_FLUSHINV_Pos) +#define ADC_EVCTRL_STARTINV_Pos 3 /**< \brief (ADC_EVCTRL) Start Conversion Event Invert Enable */ +#define ADC_EVCTRL_STARTINV (_U_(0x1) << ADC_EVCTRL_STARTINV_Pos) +#define ADC_EVCTRL_RESRDYEO_Pos 4 /**< \brief (ADC_EVCTRL) Result Ready Event Out */ +#define ADC_EVCTRL_RESRDYEO (_U_(0x1) << ADC_EVCTRL_RESRDYEO_Pos) +#define ADC_EVCTRL_WINMONEO_Pos 5 /**< \brief (ADC_EVCTRL) Window Monitor Event Out */ +#define ADC_EVCTRL_WINMONEO (_U_(0x1) << ADC_EVCTRL_WINMONEO_Pos) +#define ADC_EVCTRL_MASK _U_(0x3F) /**< \brief (ADC_EVCTRL) MASK Register */ + +/* -------- ADC_DBGCTRL : (ADC Offset: 0x03) (R/W 8) Debug Control -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t DBGRUN:1; /*!< bit: 0 Debug Run */ + uint8_t :7; /*!< bit: 1.. 7 Reserved */ + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} ADC_DBGCTRL_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define ADC_DBGCTRL_OFFSET 0x03 /**< \brief (ADC_DBGCTRL offset) Debug Control */ +#define ADC_DBGCTRL_RESETVALUE _U_(0x00) /**< \brief (ADC_DBGCTRL reset_value) Debug Control */ + +#define ADC_DBGCTRL_DBGRUN_Pos 0 /**< \brief (ADC_DBGCTRL) Debug Run */ +#define ADC_DBGCTRL_DBGRUN (_U_(0x1) << ADC_DBGCTRL_DBGRUN_Pos) +#define ADC_DBGCTRL_MASK _U_(0x01) /**< \brief (ADC_DBGCTRL) MASK Register */ + +/* -------- ADC_INPUTCTRL : (ADC Offset: 0x04) (R/W 16) Input Control -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint16_t MUXPOS:5; /*!< bit: 0.. 4 Positive Mux Input Selection */ + uint16_t :2; /*!< bit: 5.. 6 Reserved */ + uint16_t DIFFMODE:1; /*!< bit: 7 Differential Mode */ + uint16_t MUXNEG:5; /*!< bit: 8..12 Negative Mux Input Selection */ + uint16_t :2; /*!< bit: 13..14 Reserved */ + uint16_t DSEQSTOP:1; /*!< bit: 15 Stop DMA Sequencing */ + } bit; /*!< Structure used for bit access */ + uint16_t reg; /*!< Type used for register access */ +} ADC_INPUTCTRL_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define ADC_INPUTCTRL_OFFSET 0x04 /**< \brief (ADC_INPUTCTRL offset) Input Control */ +#define ADC_INPUTCTRL_RESETVALUE _U_(0x0000) /**< \brief (ADC_INPUTCTRL reset_value) Input Control */ + +#define ADC_INPUTCTRL_MUXPOS_Pos 0 /**< \brief (ADC_INPUTCTRL) Positive Mux Input Selection */ +#define ADC_INPUTCTRL_MUXPOS_Msk (_U_(0x1F) << ADC_INPUTCTRL_MUXPOS_Pos) +#define ADC_INPUTCTRL_MUXPOS(value) (ADC_INPUTCTRL_MUXPOS_Msk & ((value) << ADC_INPUTCTRL_MUXPOS_Pos)) +#define ADC_INPUTCTRL_MUXPOS_AIN0_Val _U_(0x0) /**< \brief (ADC_INPUTCTRL) ADC AIN0 Pin */ +#define ADC_INPUTCTRL_MUXPOS_AIN1_Val _U_(0x1) /**< \brief (ADC_INPUTCTRL) ADC AIN1 Pin */ +#define ADC_INPUTCTRL_MUXPOS_AIN2_Val _U_(0x2) /**< \brief (ADC_INPUTCTRL) ADC AIN2 Pin */ +#define ADC_INPUTCTRL_MUXPOS_AIN3_Val _U_(0x3) /**< \brief (ADC_INPUTCTRL) ADC AIN3 Pin */ +#define ADC_INPUTCTRL_MUXPOS_AIN4_Val _U_(0x4) /**< \brief (ADC_INPUTCTRL) ADC AIN4 Pin */ +#define ADC_INPUTCTRL_MUXPOS_AIN5_Val _U_(0x5) /**< \brief (ADC_INPUTCTRL) ADC AIN5 Pin */ +#define ADC_INPUTCTRL_MUXPOS_AIN6_Val _U_(0x6) /**< \brief (ADC_INPUTCTRL) ADC AIN6 Pin */ +#define ADC_INPUTCTRL_MUXPOS_AIN7_Val _U_(0x7) /**< \brief (ADC_INPUTCTRL) ADC AIN7 Pin */ +#define ADC_INPUTCTRL_MUXPOS_AIN8_Val _U_(0x8) /**< \brief (ADC_INPUTCTRL) ADC AIN8 Pin */ +#define ADC_INPUTCTRL_MUXPOS_AIN9_Val _U_(0x9) /**< \brief (ADC_INPUTCTRL) ADC AIN9 Pin */ +#define ADC_INPUTCTRL_MUXPOS_AIN10_Val _U_(0xA) /**< \brief (ADC_INPUTCTRL) ADC AIN10 Pin */ +#define ADC_INPUTCTRL_MUXPOS_AIN11_Val _U_(0xB) /**< \brief (ADC_INPUTCTRL) ADC AIN11 Pin */ +#define ADC_INPUTCTRL_MUXPOS_AIN12_Val _U_(0xC) /**< \brief (ADC_INPUTCTRL) ADC AIN12 Pin */ +#define ADC_INPUTCTRL_MUXPOS_AIN13_Val _U_(0xD) /**< \brief (ADC_INPUTCTRL) ADC AIN13 Pin */ +#define ADC_INPUTCTRL_MUXPOS_AIN14_Val _U_(0xE) /**< \brief (ADC_INPUTCTRL) ADC AIN14 Pin */ +#define ADC_INPUTCTRL_MUXPOS_AIN15_Val _U_(0xF) /**< \brief (ADC_INPUTCTRL) ADC AIN15 Pin */ +#define ADC_INPUTCTRL_MUXPOS_AIN16_Val _U_(0x10) /**< \brief (ADC_INPUTCTRL) ADC AIN16 Pin */ +#define ADC_INPUTCTRL_MUXPOS_AIN17_Val _U_(0x11) /**< \brief (ADC_INPUTCTRL) ADC AIN17 Pin */ +#define ADC_INPUTCTRL_MUXPOS_AIN18_Val _U_(0x12) /**< \brief (ADC_INPUTCTRL) ADC AIN18 Pin */ +#define ADC_INPUTCTRL_MUXPOS_AIN19_Val _U_(0x13) /**< \brief (ADC_INPUTCTRL) ADC AIN19 Pin */ +#define ADC_INPUTCTRL_MUXPOS_AIN20_Val _U_(0x14) /**< \brief (ADC_INPUTCTRL) ADC AIN20 Pin */ +#define ADC_INPUTCTRL_MUXPOS_AIN21_Val _U_(0x15) /**< \brief (ADC_INPUTCTRL) ADC AIN21 Pin */ +#define ADC_INPUTCTRL_MUXPOS_AIN22_Val _U_(0x16) /**< \brief (ADC_INPUTCTRL) ADC AIN22 Pin */ +#define ADC_INPUTCTRL_MUXPOS_AIN23_Val _U_(0x17) /**< \brief (ADC_INPUTCTRL) ADC AIN23 Pin */ +#define ADC_INPUTCTRL_MUXPOS_SCALEDCOREVCC_Val _U_(0x18) /**< \brief (ADC_INPUTCTRL) 1/4 Scaled Core Supply */ +#define ADC_INPUTCTRL_MUXPOS_SCALEDVBAT_Val _U_(0x19) /**< \brief (ADC_INPUTCTRL) 1/4 Scaled VBAT Supply */ +#define ADC_INPUTCTRL_MUXPOS_SCALEDIOVCC_Val _U_(0x1A) /**< \brief (ADC_INPUTCTRL) 1/4 Scaled I/O Supply */ +#define ADC_INPUTCTRL_MUXPOS_BANDGAP_Val _U_(0x1B) /**< \brief (ADC_INPUTCTRL) Bandgap Voltage */ +#define ADC_INPUTCTRL_MUXPOS_PTAT_Val _U_(0x1C) /**< \brief (ADC_INPUTCTRL) Temperature Sensor */ +#define ADC_INPUTCTRL_MUXPOS_CTAT_Val _U_(0x1D) /**< \brief (ADC_INPUTCTRL) Temperature Sensor */ +#define ADC_INPUTCTRL_MUXPOS_DAC_Val _U_(0x1E) /**< \brief (ADC_INPUTCTRL) DAC Output */ +#define ADC_INPUTCTRL_MUXPOS_PTC_Val _U_(0x1F) /**< \brief (ADC_INPUTCTRL) PTC output (only on ADC0) */ +#define ADC_INPUTCTRL_MUXPOS_AIN0 (ADC_INPUTCTRL_MUXPOS_AIN0_Val << ADC_INPUTCTRL_MUXPOS_Pos) +#define ADC_INPUTCTRL_MUXPOS_AIN1 (ADC_INPUTCTRL_MUXPOS_AIN1_Val << ADC_INPUTCTRL_MUXPOS_Pos) +#define ADC_INPUTCTRL_MUXPOS_AIN2 (ADC_INPUTCTRL_MUXPOS_AIN2_Val << ADC_INPUTCTRL_MUXPOS_Pos) +#define ADC_INPUTCTRL_MUXPOS_AIN3 (ADC_INPUTCTRL_MUXPOS_AIN3_Val << ADC_INPUTCTRL_MUXPOS_Pos) +#define ADC_INPUTCTRL_MUXPOS_AIN4 (ADC_INPUTCTRL_MUXPOS_AIN4_Val << ADC_INPUTCTRL_MUXPOS_Pos) +#define ADC_INPUTCTRL_MUXPOS_AIN5 (ADC_INPUTCTRL_MUXPOS_AIN5_Val << ADC_INPUTCTRL_MUXPOS_Pos) +#define ADC_INPUTCTRL_MUXPOS_AIN6 (ADC_INPUTCTRL_MUXPOS_AIN6_Val << ADC_INPUTCTRL_MUXPOS_Pos) +#define ADC_INPUTCTRL_MUXPOS_AIN7 (ADC_INPUTCTRL_MUXPOS_AIN7_Val << ADC_INPUTCTRL_MUXPOS_Pos) +#define ADC_INPUTCTRL_MUXPOS_AIN8 (ADC_INPUTCTRL_MUXPOS_AIN8_Val << ADC_INPUTCTRL_MUXPOS_Pos) +#define ADC_INPUTCTRL_MUXPOS_AIN9 (ADC_INPUTCTRL_MUXPOS_AIN9_Val << ADC_INPUTCTRL_MUXPOS_Pos) +#define ADC_INPUTCTRL_MUXPOS_AIN10 (ADC_INPUTCTRL_MUXPOS_AIN10_Val << ADC_INPUTCTRL_MUXPOS_Pos) +#define ADC_INPUTCTRL_MUXPOS_AIN11 (ADC_INPUTCTRL_MUXPOS_AIN11_Val << ADC_INPUTCTRL_MUXPOS_Pos) +#define ADC_INPUTCTRL_MUXPOS_AIN12 (ADC_INPUTCTRL_MUXPOS_AIN12_Val << ADC_INPUTCTRL_MUXPOS_Pos) +#define ADC_INPUTCTRL_MUXPOS_AIN13 (ADC_INPUTCTRL_MUXPOS_AIN13_Val << ADC_INPUTCTRL_MUXPOS_Pos) +#define ADC_INPUTCTRL_MUXPOS_AIN14 (ADC_INPUTCTRL_MUXPOS_AIN14_Val << ADC_INPUTCTRL_MUXPOS_Pos) +#define ADC_INPUTCTRL_MUXPOS_AIN15 (ADC_INPUTCTRL_MUXPOS_AIN15_Val << ADC_INPUTCTRL_MUXPOS_Pos) +#define ADC_INPUTCTRL_MUXPOS_AIN16 (ADC_INPUTCTRL_MUXPOS_AIN16_Val << ADC_INPUTCTRL_MUXPOS_Pos) +#define ADC_INPUTCTRL_MUXPOS_AIN17 (ADC_INPUTCTRL_MUXPOS_AIN17_Val << ADC_INPUTCTRL_MUXPOS_Pos) +#define ADC_INPUTCTRL_MUXPOS_AIN18 (ADC_INPUTCTRL_MUXPOS_AIN18_Val << ADC_INPUTCTRL_MUXPOS_Pos) +#define ADC_INPUTCTRL_MUXPOS_AIN19 (ADC_INPUTCTRL_MUXPOS_AIN19_Val << ADC_INPUTCTRL_MUXPOS_Pos) +#define ADC_INPUTCTRL_MUXPOS_AIN20 (ADC_INPUTCTRL_MUXPOS_AIN20_Val << ADC_INPUTCTRL_MUXPOS_Pos) +#define ADC_INPUTCTRL_MUXPOS_AIN21 (ADC_INPUTCTRL_MUXPOS_AIN21_Val << ADC_INPUTCTRL_MUXPOS_Pos) +#define ADC_INPUTCTRL_MUXPOS_AIN22 (ADC_INPUTCTRL_MUXPOS_AIN22_Val << ADC_INPUTCTRL_MUXPOS_Pos) +#define ADC_INPUTCTRL_MUXPOS_AIN23 (ADC_INPUTCTRL_MUXPOS_AIN23_Val << ADC_INPUTCTRL_MUXPOS_Pos) +#define ADC_INPUTCTRL_MUXPOS_SCALEDCOREVCC (ADC_INPUTCTRL_MUXPOS_SCALEDCOREVCC_Val << ADC_INPUTCTRL_MUXPOS_Pos) +#define ADC_INPUTCTRL_MUXPOS_SCALEDVBAT (ADC_INPUTCTRL_MUXPOS_SCALEDVBAT_Val << ADC_INPUTCTRL_MUXPOS_Pos) +#define ADC_INPUTCTRL_MUXPOS_SCALEDIOVCC (ADC_INPUTCTRL_MUXPOS_SCALEDIOVCC_Val << ADC_INPUTCTRL_MUXPOS_Pos) +#define ADC_INPUTCTRL_MUXPOS_BANDGAP (ADC_INPUTCTRL_MUXPOS_BANDGAP_Val << ADC_INPUTCTRL_MUXPOS_Pos) +#define ADC_INPUTCTRL_MUXPOS_PTAT (ADC_INPUTCTRL_MUXPOS_PTAT_Val << ADC_INPUTCTRL_MUXPOS_Pos) +#define ADC_INPUTCTRL_MUXPOS_CTAT (ADC_INPUTCTRL_MUXPOS_CTAT_Val << ADC_INPUTCTRL_MUXPOS_Pos) +#define ADC_INPUTCTRL_MUXPOS_DAC (ADC_INPUTCTRL_MUXPOS_DAC_Val << ADC_INPUTCTRL_MUXPOS_Pos) +#define ADC_INPUTCTRL_MUXPOS_PTC (ADC_INPUTCTRL_MUXPOS_PTC_Val << ADC_INPUTCTRL_MUXPOS_Pos) +#define ADC_INPUTCTRL_DIFFMODE_Pos 7 /**< \brief (ADC_INPUTCTRL) Differential Mode */ +#define ADC_INPUTCTRL_DIFFMODE (_U_(0x1) << ADC_INPUTCTRL_DIFFMODE_Pos) +#define ADC_INPUTCTRL_MUXNEG_Pos 8 /**< \brief (ADC_INPUTCTRL) Negative Mux Input Selection */ +#define ADC_INPUTCTRL_MUXNEG_Msk (_U_(0x1F) << ADC_INPUTCTRL_MUXNEG_Pos) +#define ADC_INPUTCTRL_MUXNEG(value) (ADC_INPUTCTRL_MUXNEG_Msk & ((value) << ADC_INPUTCTRL_MUXNEG_Pos)) +#define ADC_INPUTCTRL_MUXNEG_AIN0_Val _U_(0x0) /**< \brief (ADC_INPUTCTRL) ADC AIN0 Pin */ +#define ADC_INPUTCTRL_MUXNEG_AIN1_Val _U_(0x1) /**< \brief (ADC_INPUTCTRL) ADC AIN1 Pin */ +#define ADC_INPUTCTRL_MUXNEG_AIN2_Val _U_(0x2) /**< \brief (ADC_INPUTCTRL) ADC AIN2 Pin */ +#define ADC_INPUTCTRL_MUXNEG_AIN3_Val _U_(0x3) /**< \brief (ADC_INPUTCTRL) ADC AIN3 Pin */ +#define ADC_INPUTCTRL_MUXNEG_AIN4_Val _U_(0x4) /**< \brief (ADC_INPUTCTRL) ADC AIN4 Pin */ +#define ADC_INPUTCTRL_MUXNEG_AIN5_Val _U_(0x5) /**< \brief (ADC_INPUTCTRL) ADC AIN5 Pin */ +#define ADC_INPUTCTRL_MUXNEG_AIN6_Val _U_(0x6) /**< \brief (ADC_INPUTCTRL) ADC AIN6 Pin */ +#define ADC_INPUTCTRL_MUXNEG_AIN7_Val _U_(0x7) /**< \brief (ADC_INPUTCTRL) ADC AIN7 Pin */ +#define ADC_INPUTCTRL_MUXNEG_GND_Val _U_(0x18) /**< \brief (ADC_INPUTCTRL) Internal Ground */ +#define ADC_INPUTCTRL_MUXNEG_AIN0 (ADC_INPUTCTRL_MUXNEG_AIN0_Val << ADC_INPUTCTRL_MUXNEG_Pos) +#define ADC_INPUTCTRL_MUXNEG_AIN1 (ADC_INPUTCTRL_MUXNEG_AIN1_Val << ADC_INPUTCTRL_MUXNEG_Pos) +#define ADC_INPUTCTRL_MUXNEG_AIN2 (ADC_INPUTCTRL_MUXNEG_AIN2_Val << ADC_INPUTCTRL_MUXNEG_Pos) +#define ADC_INPUTCTRL_MUXNEG_AIN3 (ADC_INPUTCTRL_MUXNEG_AIN3_Val << ADC_INPUTCTRL_MUXNEG_Pos) +#define ADC_INPUTCTRL_MUXNEG_AIN4 (ADC_INPUTCTRL_MUXNEG_AIN4_Val << ADC_INPUTCTRL_MUXNEG_Pos) +#define ADC_INPUTCTRL_MUXNEG_AIN5 (ADC_INPUTCTRL_MUXNEG_AIN5_Val << ADC_INPUTCTRL_MUXNEG_Pos) +#define ADC_INPUTCTRL_MUXNEG_AIN6 (ADC_INPUTCTRL_MUXNEG_AIN6_Val << ADC_INPUTCTRL_MUXNEG_Pos) +#define ADC_INPUTCTRL_MUXNEG_AIN7 (ADC_INPUTCTRL_MUXNEG_AIN7_Val << ADC_INPUTCTRL_MUXNEG_Pos) +#define ADC_INPUTCTRL_MUXNEG_GND (ADC_INPUTCTRL_MUXNEG_GND_Val << ADC_INPUTCTRL_MUXNEG_Pos) +#define ADC_INPUTCTRL_DSEQSTOP_Pos 15 /**< \brief (ADC_INPUTCTRL) Stop DMA Sequencing */ +#define ADC_INPUTCTRL_DSEQSTOP (_U_(0x1) << ADC_INPUTCTRL_DSEQSTOP_Pos) +#define ADC_INPUTCTRL_MASK _U_(0x9F9F) /**< \brief (ADC_INPUTCTRL) MASK Register */ + +/* -------- ADC_CTRLB : (ADC Offset: 0x06) (R/W 16) Control B -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint16_t LEFTADJ:1; /*!< bit: 0 Left-Adjusted Result */ + uint16_t FREERUN:1; /*!< bit: 1 Free Running Mode */ + uint16_t CORREN:1; /*!< bit: 2 Digital Correction Logic Enable */ + uint16_t RESSEL:2; /*!< bit: 3.. 4 Conversion Result Resolution */ + uint16_t :3; /*!< bit: 5.. 7 Reserved */ + uint16_t WINMODE:3; /*!< bit: 8..10 Window Monitor Mode */ + uint16_t WINSS:1; /*!< bit: 11 Window Single Sample */ + uint16_t :4; /*!< bit: 12..15 Reserved */ + } bit; /*!< Structure used for bit access */ + uint16_t reg; /*!< Type used for register access */ +} ADC_CTRLB_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define ADC_CTRLB_OFFSET 0x06 /**< \brief (ADC_CTRLB offset) Control B */ +#define ADC_CTRLB_RESETVALUE _U_(0x0000) /**< \brief (ADC_CTRLB reset_value) Control B */ + +#define ADC_CTRLB_LEFTADJ_Pos 0 /**< \brief (ADC_CTRLB) Left-Adjusted Result */ +#define ADC_CTRLB_LEFTADJ (_U_(0x1) << ADC_CTRLB_LEFTADJ_Pos) +#define ADC_CTRLB_FREERUN_Pos 1 /**< \brief (ADC_CTRLB) Free Running Mode */ +#define ADC_CTRLB_FREERUN (_U_(0x1) << ADC_CTRLB_FREERUN_Pos) +#define ADC_CTRLB_CORREN_Pos 2 /**< \brief (ADC_CTRLB) Digital Correction Logic Enable */ +#define ADC_CTRLB_CORREN (_U_(0x1) << ADC_CTRLB_CORREN_Pos) +#define ADC_CTRLB_RESSEL_Pos 3 /**< \brief (ADC_CTRLB) Conversion Result Resolution */ +#define ADC_CTRLB_RESSEL_Msk (_U_(0x3) << ADC_CTRLB_RESSEL_Pos) +#define ADC_CTRLB_RESSEL(value) (ADC_CTRLB_RESSEL_Msk & ((value) << ADC_CTRLB_RESSEL_Pos)) +#define ADC_CTRLB_RESSEL_12BIT_Val _U_(0x0) /**< \brief (ADC_CTRLB) 12-bit result */ +#define ADC_CTRLB_RESSEL_16BIT_Val _U_(0x1) /**< \brief (ADC_CTRLB) For averaging mode output */ +#define ADC_CTRLB_RESSEL_10BIT_Val _U_(0x2) /**< \brief (ADC_CTRLB) 10-bit result */ +#define ADC_CTRLB_RESSEL_8BIT_Val _U_(0x3) /**< \brief (ADC_CTRLB) 8-bit result */ +#define ADC_CTRLB_RESSEL_12BIT (ADC_CTRLB_RESSEL_12BIT_Val << ADC_CTRLB_RESSEL_Pos) +#define ADC_CTRLB_RESSEL_16BIT (ADC_CTRLB_RESSEL_16BIT_Val << ADC_CTRLB_RESSEL_Pos) +#define ADC_CTRLB_RESSEL_10BIT (ADC_CTRLB_RESSEL_10BIT_Val << ADC_CTRLB_RESSEL_Pos) +#define ADC_CTRLB_RESSEL_8BIT (ADC_CTRLB_RESSEL_8BIT_Val << ADC_CTRLB_RESSEL_Pos) +#define ADC_CTRLB_WINMODE_Pos 8 /**< \brief (ADC_CTRLB) Window Monitor Mode */ +#define ADC_CTRLB_WINMODE_Msk (_U_(0x7) << ADC_CTRLB_WINMODE_Pos) +#define ADC_CTRLB_WINMODE(value) (ADC_CTRLB_WINMODE_Msk & ((value) << ADC_CTRLB_WINMODE_Pos)) +#define ADC_CTRLB_WINMODE_DISABLE_Val _U_(0x0) /**< \brief (ADC_CTRLB) No window mode (default) */ +#define ADC_CTRLB_WINMODE_MODE1_Val _U_(0x1) /**< \brief (ADC_CTRLB) RESULT > WINLT */ +#define ADC_CTRLB_WINMODE_MODE2_Val _U_(0x2) /**< \brief (ADC_CTRLB) RESULT < WINUT */ +#define ADC_CTRLB_WINMODE_MODE3_Val _U_(0x3) /**< \brief (ADC_CTRLB) WINLT < RESULT < WINUT */ +#define ADC_CTRLB_WINMODE_MODE4_Val _U_(0x4) /**< \brief (ADC_CTRLB) !(WINLT < RESULT < WINUT) */ +#define ADC_CTRLB_WINMODE_DISABLE (ADC_CTRLB_WINMODE_DISABLE_Val << ADC_CTRLB_WINMODE_Pos) +#define ADC_CTRLB_WINMODE_MODE1 (ADC_CTRLB_WINMODE_MODE1_Val << ADC_CTRLB_WINMODE_Pos) +#define ADC_CTRLB_WINMODE_MODE2 (ADC_CTRLB_WINMODE_MODE2_Val << ADC_CTRLB_WINMODE_Pos) +#define ADC_CTRLB_WINMODE_MODE3 (ADC_CTRLB_WINMODE_MODE3_Val << ADC_CTRLB_WINMODE_Pos) +#define ADC_CTRLB_WINMODE_MODE4 (ADC_CTRLB_WINMODE_MODE4_Val << ADC_CTRLB_WINMODE_Pos) +#define ADC_CTRLB_WINSS_Pos 11 /**< \brief (ADC_CTRLB) Window Single Sample */ +#define ADC_CTRLB_WINSS (_U_(0x1) << ADC_CTRLB_WINSS_Pos) +#define ADC_CTRLB_MASK _U_(0x0F1F) /**< \brief (ADC_CTRLB) MASK Register */ + +/* -------- ADC_REFCTRL : (ADC Offset: 0x08) (R/W 8) Reference Control -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t REFSEL:4; /*!< bit: 0.. 3 Reference Selection */ + uint8_t :3; /*!< bit: 4.. 6 Reserved */ + uint8_t REFCOMP:1; /*!< bit: 7 Reference Buffer Offset Compensation Enable */ + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} ADC_REFCTRL_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define ADC_REFCTRL_OFFSET 0x08 /**< \brief (ADC_REFCTRL offset) Reference Control */ +#define ADC_REFCTRL_RESETVALUE _U_(0x00) /**< \brief (ADC_REFCTRL reset_value) Reference Control */ + +#define ADC_REFCTRL_REFSEL_Pos 0 /**< \brief (ADC_REFCTRL) Reference Selection */ +#define ADC_REFCTRL_REFSEL_Msk (_U_(0xF) << ADC_REFCTRL_REFSEL_Pos) +#define ADC_REFCTRL_REFSEL(value) (ADC_REFCTRL_REFSEL_Msk & ((value) << ADC_REFCTRL_REFSEL_Pos)) +#define ADC_REFCTRL_REFSEL_INTREF_Val _U_(0x0) /**< \brief (ADC_REFCTRL) Internal Bandgap Reference */ +#define ADC_REFCTRL_REFSEL_INTVCC0_Val _U_(0x2) /**< \brief (ADC_REFCTRL) 1/2 VDDANA */ +#define ADC_REFCTRL_REFSEL_INTVCC1_Val _U_(0x3) /**< \brief (ADC_REFCTRL) VDDANA */ +#define ADC_REFCTRL_REFSEL_AREFA_Val _U_(0x4) /**< \brief (ADC_REFCTRL) External Reference */ +#define ADC_REFCTRL_REFSEL_AREFB_Val _U_(0x5) /**< \brief (ADC_REFCTRL) External Reference */ +#define ADC_REFCTRL_REFSEL_AREFC_Val _U_(0x6) /**< \brief (ADC_REFCTRL) External Reference (only on ADC1) */ +#define ADC_REFCTRL_REFSEL_INTREF (ADC_REFCTRL_REFSEL_INTREF_Val << ADC_REFCTRL_REFSEL_Pos) +#define ADC_REFCTRL_REFSEL_INTVCC0 (ADC_REFCTRL_REFSEL_INTVCC0_Val << ADC_REFCTRL_REFSEL_Pos) +#define ADC_REFCTRL_REFSEL_INTVCC1 (ADC_REFCTRL_REFSEL_INTVCC1_Val << ADC_REFCTRL_REFSEL_Pos) +#define ADC_REFCTRL_REFSEL_AREFA (ADC_REFCTRL_REFSEL_AREFA_Val << ADC_REFCTRL_REFSEL_Pos) +#define ADC_REFCTRL_REFSEL_AREFB (ADC_REFCTRL_REFSEL_AREFB_Val << ADC_REFCTRL_REFSEL_Pos) +#define ADC_REFCTRL_REFSEL_AREFC (ADC_REFCTRL_REFSEL_AREFC_Val << ADC_REFCTRL_REFSEL_Pos) +#define ADC_REFCTRL_REFCOMP_Pos 7 /**< \brief (ADC_REFCTRL) Reference Buffer Offset Compensation Enable */ +#define ADC_REFCTRL_REFCOMP (_U_(0x1) << ADC_REFCTRL_REFCOMP_Pos) +#define ADC_REFCTRL_MASK _U_(0x8F) /**< \brief (ADC_REFCTRL) MASK Register */ + +/* -------- ADC_AVGCTRL : (ADC Offset: 0x0A) (R/W 8) Average Control -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t SAMPLENUM:4; /*!< bit: 0.. 3 Number of Samples to be Collected */ + uint8_t ADJRES:3; /*!< bit: 4.. 6 Adjusting Result / Division Coefficient */ + uint8_t :1; /*!< bit: 7 Reserved */ + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} ADC_AVGCTRL_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define ADC_AVGCTRL_OFFSET 0x0A /**< \brief (ADC_AVGCTRL offset) Average Control */ +#define ADC_AVGCTRL_RESETVALUE _U_(0x00) /**< \brief (ADC_AVGCTRL reset_value) Average Control */ + +#define ADC_AVGCTRL_SAMPLENUM_Pos 0 /**< \brief (ADC_AVGCTRL) Number of Samples to be Collected */ +#define ADC_AVGCTRL_SAMPLENUM_Msk (_U_(0xF) << ADC_AVGCTRL_SAMPLENUM_Pos) +#define ADC_AVGCTRL_SAMPLENUM(value) (ADC_AVGCTRL_SAMPLENUM_Msk & ((value) << ADC_AVGCTRL_SAMPLENUM_Pos)) +#define ADC_AVGCTRL_SAMPLENUM_1_Val _U_(0x0) /**< \brief (ADC_AVGCTRL) 1 sample */ +#define ADC_AVGCTRL_SAMPLENUM_2_Val _U_(0x1) /**< \brief (ADC_AVGCTRL) 2 samples */ +#define ADC_AVGCTRL_SAMPLENUM_4_Val _U_(0x2) /**< \brief (ADC_AVGCTRL) 4 samples */ +#define ADC_AVGCTRL_SAMPLENUM_8_Val _U_(0x3) /**< \brief (ADC_AVGCTRL) 8 samples */ +#define ADC_AVGCTRL_SAMPLENUM_16_Val _U_(0x4) /**< \brief (ADC_AVGCTRL) 16 samples */ +#define ADC_AVGCTRL_SAMPLENUM_32_Val _U_(0x5) /**< \brief (ADC_AVGCTRL) 32 samples */ +#define ADC_AVGCTRL_SAMPLENUM_64_Val _U_(0x6) /**< \brief (ADC_AVGCTRL) 64 samples */ +#define ADC_AVGCTRL_SAMPLENUM_128_Val _U_(0x7) /**< \brief (ADC_AVGCTRL) 128 samples */ +#define ADC_AVGCTRL_SAMPLENUM_256_Val _U_(0x8) /**< \brief (ADC_AVGCTRL) 256 samples */ +#define ADC_AVGCTRL_SAMPLENUM_512_Val _U_(0x9) /**< \brief (ADC_AVGCTRL) 512 samples */ +#define ADC_AVGCTRL_SAMPLENUM_1024_Val _U_(0xA) /**< \brief (ADC_AVGCTRL) 1024 samples */ +#define ADC_AVGCTRL_SAMPLENUM_1 (ADC_AVGCTRL_SAMPLENUM_1_Val << ADC_AVGCTRL_SAMPLENUM_Pos) +#define ADC_AVGCTRL_SAMPLENUM_2 (ADC_AVGCTRL_SAMPLENUM_2_Val << ADC_AVGCTRL_SAMPLENUM_Pos) +#define ADC_AVGCTRL_SAMPLENUM_4 (ADC_AVGCTRL_SAMPLENUM_4_Val << ADC_AVGCTRL_SAMPLENUM_Pos) +#define ADC_AVGCTRL_SAMPLENUM_8 (ADC_AVGCTRL_SAMPLENUM_8_Val << ADC_AVGCTRL_SAMPLENUM_Pos) +#define ADC_AVGCTRL_SAMPLENUM_16 (ADC_AVGCTRL_SAMPLENUM_16_Val << ADC_AVGCTRL_SAMPLENUM_Pos) +#define ADC_AVGCTRL_SAMPLENUM_32 (ADC_AVGCTRL_SAMPLENUM_32_Val << ADC_AVGCTRL_SAMPLENUM_Pos) +#define ADC_AVGCTRL_SAMPLENUM_64 (ADC_AVGCTRL_SAMPLENUM_64_Val << ADC_AVGCTRL_SAMPLENUM_Pos) +#define ADC_AVGCTRL_SAMPLENUM_128 (ADC_AVGCTRL_SAMPLENUM_128_Val << ADC_AVGCTRL_SAMPLENUM_Pos) +#define ADC_AVGCTRL_SAMPLENUM_256 (ADC_AVGCTRL_SAMPLENUM_256_Val << ADC_AVGCTRL_SAMPLENUM_Pos) +#define ADC_AVGCTRL_SAMPLENUM_512 (ADC_AVGCTRL_SAMPLENUM_512_Val << ADC_AVGCTRL_SAMPLENUM_Pos) +#define ADC_AVGCTRL_SAMPLENUM_1024 (ADC_AVGCTRL_SAMPLENUM_1024_Val << ADC_AVGCTRL_SAMPLENUM_Pos) +#define ADC_AVGCTRL_ADJRES_Pos 4 /**< \brief (ADC_AVGCTRL) Adjusting Result / Division Coefficient */ +#define ADC_AVGCTRL_ADJRES_Msk (_U_(0x7) << ADC_AVGCTRL_ADJRES_Pos) +#define ADC_AVGCTRL_ADJRES(value) (ADC_AVGCTRL_ADJRES_Msk & ((value) << ADC_AVGCTRL_ADJRES_Pos)) +#define ADC_AVGCTRL_MASK _U_(0x7F) /**< \brief (ADC_AVGCTRL) MASK Register */ + +/* -------- ADC_SAMPCTRL : (ADC Offset: 0x0B) (R/W 8) Sample Time Control -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t SAMPLEN:6; /*!< bit: 0.. 5 Sampling Time Length */ + uint8_t :1; /*!< bit: 6 Reserved */ + uint8_t OFFCOMP:1; /*!< bit: 7 Comparator Offset Compensation Enable */ + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} ADC_SAMPCTRL_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define ADC_SAMPCTRL_OFFSET 0x0B /**< \brief (ADC_SAMPCTRL offset) Sample Time Control */ +#define ADC_SAMPCTRL_RESETVALUE _U_(0x00) /**< \brief (ADC_SAMPCTRL reset_value) Sample Time Control */ + +#define ADC_SAMPCTRL_SAMPLEN_Pos 0 /**< \brief (ADC_SAMPCTRL) Sampling Time Length */ +#define ADC_SAMPCTRL_SAMPLEN_Msk (_U_(0x3F) << ADC_SAMPCTRL_SAMPLEN_Pos) +#define ADC_SAMPCTRL_SAMPLEN(value) (ADC_SAMPCTRL_SAMPLEN_Msk & ((value) << ADC_SAMPCTRL_SAMPLEN_Pos)) +#define ADC_SAMPCTRL_OFFCOMP_Pos 7 /**< \brief (ADC_SAMPCTRL) Comparator Offset Compensation Enable */ +#define ADC_SAMPCTRL_OFFCOMP (_U_(0x1) << ADC_SAMPCTRL_OFFCOMP_Pos) +#define ADC_SAMPCTRL_MASK _U_(0xBF) /**< \brief (ADC_SAMPCTRL) MASK Register */ + +/* -------- ADC_WINLT : (ADC Offset: 0x0C) (R/W 16) Window Monitor Lower Threshold -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint16_t WINLT:16; /*!< bit: 0..15 Window Lower Threshold */ + } bit; /*!< Structure used for bit access */ + uint16_t reg; /*!< Type used for register access */ +} ADC_WINLT_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define ADC_WINLT_OFFSET 0x0C /**< \brief (ADC_WINLT offset) Window Monitor Lower Threshold */ +#define ADC_WINLT_RESETVALUE _U_(0x0000) /**< \brief (ADC_WINLT reset_value) Window Monitor Lower Threshold */ + +#define ADC_WINLT_WINLT_Pos 0 /**< \brief (ADC_WINLT) Window Lower Threshold */ +#define ADC_WINLT_WINLT_Msk (_U_(0xFFFF) << ADC_WINLT_WINLT_Pos) +#define ADC_WINLT_WINLT(value) (ADC_WINLT_WINLT_Msk & ((value) << ADC_WINLT_WINLT_Pos)) +#define ADC_WINLT_MASK _U_(0xFFFF) /**< \brief (ADC_WINLT) MASK Register */ + +/* -------- ADC_WINUT : (ADC Offset: 0x0E) (R/W 16) Window Monitor Upper Threshold -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint16_t WINUT:16; /*!< bit: 0..15 Window Upper Threshold */ + } bit; /*!< Structure used for bit access */ + uint16_t reg; /*!< Type used for register access */ +} ADC_WINUT_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define ADC_WINUT_OFFSET 0x0E /**< \brief (ADC_WINUT offset) Window Monitor Upper Threshold */ +#define ADC_WINUT_RESETVALUE _U_(0x0000) /**< \brief (ADC_WINUT reset_value) Window Monitor Upper Threshold */ + +#define ADC_WINUT_WINUT_Pos 0 /**< \brief (ADC_WINUT) Window Upper Threshold */ +#define ADC_WINUT_WINUT_Msk (_U_(0xFFFF) << ADC_WINUT_WINUT_Pos) +#define ADC_WINUT_WINUT(value) (ADC_WINUT_WINUT_Msk & ((value) << ADC_WINUT_WINUT_Pos)) +#define ADC_WINUT_MASK _U_(0xFFFF) /**< \brief (ADC_WINUT) MASK Register */ + +/* -------- ADC_GAINCORR : (ADC Offset: 0x10) (R/W 16) Gain Correction -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint16_t GAINCORR:12; /*!< bit: 0..11 Gain Correction Value */ + uint16_t :4; /*!< bit: 12..15 Reserved */ + } bit; /*!< Structure used for bit access */ + uint16_t reg; /*!< Type used for register access */ +} ADC_GAINCORR_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define ADC_GAINCORR_OFFSET 0x10 /**< \brief (ADC_GAINCORR offset) Gain Correction */ +#define ADC_GAINCORR_RESETVALUE _U_(0x0000) /**< \brief (ADC_GAINCORR reset_value) Gain Correction */ + +#define ADC_GAINCORR_GAINCORR_Pos 0 /**< \brief (ADC_GAINCORR) Gain Correction Value */ +#define ADC_GAINCORR_GAINCORR_Msk (_U_(0xFFF) << ADC_GAINCORR_GAINCORR_Pos) +#define ADC_GAINCORR_GAINCORR(value) (ADC_GAINCORR_GAINCORR_Msk & ((value) << ADC_GAINCORR_GAINCORR_Pos)) +#define ADC_GAINCORR_MASK _U_(0x0FFF) /**< \brief (ADC_GAINCORR) MASK Register */ + +/* -------- ADC_OFFSETCORR : (ADC Offset: 0x12) (R/W 16) Offset Correction -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint16_t OFFSETCORR:12; /*!< bit: 0..11 Offset Correction Value */ + uint16_t :4; /*!< bit: 12..15 Reserved */ + } bit; /*!< Structure used for bit access */ + uint16_t reg; /*!< Type used for register access */ +} ADC_OFFSETCORR_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define ADC_OFFSETCORR_OFFSET 0x12 /**< \brief (ADC_OFFSETCORR offset) Offset Correction */ +#define ADC_OFFSETCORR_RESETVALUE _U_(0x0000) /**< \brief (ADC_OFFSETCORR reset_value) Offset Correction */ + +#define ADC_OFFSETCORR_OFFSETCORR_Pos 0 /**< \brief (ADC_OFFSETCORR) Offset Correction Value */ +#define ADC_OFFSETCORR_OFFSETCORR_Msk (_U_(0xFFF) << ADC_OFFSETCORR_OFFSETCORR_Pos) +#define ADC_OFFSETCORR_OFFSETCORR(value) (ADC_OFFSETCORR_OFFSETCORR_Msk & ((value) << ADC_OFFSETCORR_OFFSETCORR_Pos)) +#define ADC_OFFSETCORR_MASK _U_(0x0FFF) /**< \brief (ADC_OFFSETCORR) MASK Register */ + +/* -------- ADC_SWTRIG : (ADC Offset: 0x14) (R/W 8) Software Trigger -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t FLUSH:1; /*!< bit: 0 ADC Conversion Flush */ + uint8_t START:1; /*!< bit: 1 Start ADC Conversion */ + uint8_t :6; /*!< bit: 2.. 7 Reserved */ + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} ADC_SWTRIG_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define ADC_SWTRIG_OFFSET 0x14 /**< \brief (ADC_SWTRIG offset) Software Trigger */ +#define ADC_SWTRIG_RESETVALUE _U_(0x00) /**< \brief (ADC_SWTRIG reset_value) Software Trigger */ + +#define ADC_SWTRIG_FLUSH_Pos 0 /**< \brief (ADC_SWTRIG) ADC Conversion Flush */ +#define ADC_SWTRIG_FLUSH (_U_(0x1) << ADC_SWTRIG_FLUSH_Pos) +#define ADC_SWTRIG_START_Pos 1 /**< \brief (ADC_SWTRIG) Start ADC Conversion */ +#define ADC_SWTRIG_START (_U_(0x1) << ADC_SWTRIG_START_Pos) +#define ADC_SWTRIG_MASK _U_(0x03) /**< \brief (ADC_SWTRIG) MASK Register */ + +/* -------- ADC_INTENCLR : (ADC Offset: 0x2C) (R/W 8) Interrupt Enable Clear -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t RESRDY:1; /*!< bit: 0 Result Ready Interrupt Disable */ + uint8_t OVERRUN:1; /*!< bit: 1 Overrun Interrupt Disable */ + uint8_t WINMON:1; /*!< bit: 2 Window Monitor Interrupt Disable */ + uint8_t :5; /*!< bit: 3.. 7 Reserved */ + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} ADC_INTENCLR_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define ADC_INTENCLR_OFFSET 0x2C /**< \brief (ADC_INTENCLR offset) Interrupt Enable Clear */ +#define ADC_INTENCLR_RESETVALUE _U_(0x00) /**< \brief (ADC_INTENCLR reset_value) Interrupt Enable Clear */ + +#define ADC_INTENCLR_RESRDY_Pos 0 /**< \brief (ADC_INTENCLR) Result Ready Interrupt Disable */ +#define ADC_INTENCLR_RESRDY (_U_(0x1) << ADC_INTENCLR_RESRDY_Pos) +#define ADC_INTENCLR_OVERRUN_Pos 1 /**< \brief (ADC_INTENCLR) Overrun Interrupt Disable */ +#define ADC_INTENCLR_OVERRUN (_U_(0x1) << ADC_INTENCLR_OVERRUN_Pos) +#define ADC_INTENCLR_WINMON_Pos 2 /**< \brief (ADC_INTENCLR) Window Monitor Interrupt Disable */ +#define ADC_INTENCLR_WINMON (_U_(0x1) << ADC_INTENCLR_WINMON_Pos) +#define ADC_INTENCLR_MASK _U_(0x07) /**< \brief (ADC_INTENCLR) MASK Register */ + +/* -------- ADC_INTENSET : (ADC Offset: 0x2D) (R/W 8) Interrupt Enable Set -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t RESRDY:1; /*!< bit: 0 Result Ready Interrupt Enable */ + uint8_t OVERRUN:1; /*!< bit: 1 Overrun Interrupt Enable */ + uint8_t WINMON:1; /*!< bit: 2 Window Monitor Interrupt Enable */ + uint8_t :5; /*!< bit: 3.. 7 Reserved */ + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} ADC_INTENSET_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define ADC_INTENSET_OFFSET 0x2D /**< \brief (ADC_INTENSET offset) Interrupt Enable Set */ +#define ADC_INTENSET_RESETVALUE _U_(0x00) /**< \brief (ADC_INTENSET reset_value) Interrupt Enable Set */ + +#define ADC_INTENSET_RESRDY_Pos 0 /**< \brief (ADC_INTENSET) Result Ready Interrupt Enable */ +#define ADC_INTENSET_RESRDY (_U_(0x1) << ADC_INTENSET_RESRDY_Pos) +#define ADC_INTENSET_OVERRUN_Pos 1 /**< \brief (ADC_INTENSET) Overrun Interrupt Enable */ +#define ADC_INTENSET_OVERRUN (_U_(0x1) << ADC_INTENSET_OVERRUN_Pos) +#define ADC_INTENSET_WINMON_Pos 2 /**< \brief (ADC_INTENSET) Window Monitor Interrupt Enable */ +#define ADC_INTENSET_WINMON (_U_(0x1) << ADC_INTENSET_WINMON_Pos) +#define ADC_INTENSET_MASK _U_(0x07) /**< \brief (ADC_INTENSET) MASK Register */ + +/* -------- ADC_INTFLAG : (ADC Offset: 0x2E) (R/W 8) Interrupt Flag Status and Clear -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { // __I to avoid read-modify-write on write-to-clear register + struct { + __I uint8_t RESRDY:1; /*!< bit: 0 Result Ready Interrupt Flag */ + __I uint8_t OVERRUN:1; /*!< bit: 1 Overrun Interrupt Flag */ + __I uint8_t WINMON:1; /*!< bit: 2 Window Monitor Interrupt Flag */ + __I uint8_t :5; /*!< bit: 3.. 7 Reserved */ + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} ADC_INTFLAG_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define ADC_INTFLAG_OFFSET 0x2E /**< \brief (ADC_INTFLAG offset) Interrupt Flag Status and Clear */ +#define ADC_INTFLAG_RESETVALUE _U_(0x00) /**< \brief (ADC_INTFLAG reset_value) Interrupt Flag Status and Clear */ + +#define ADC_INTFLAG_RESRDY_Pos 0 /**< \brief (ADC_INTFLAG) Result Ready Interrupt Flag */ +#define ADC_INTFLAG_RESRDY (_U_(0x1) << ADC_INTFLAG_RESRDY_Pos) +#define ADC_INTFLAG_OVERRUN_Pos 1 /**< \brief (ADC_INTFLAG) Overrun Interrupt Flag */ +#define ADC_INTFLAG_OVERRUN (_U_(0x1) << ADC_INTFLAG_OVERRUN_Pos) +#define ADC_INTFLAG_WINMON_Pos 2 /**< \brief (ADC_INTFLAG) Window Monitor Interrupt Flag */ +#define ADC_INTFLAG_WINMON (_U_(0x1) << ADC_INTFLAG_WINMON_Pos) +#define ADC_INTFLAG_MASK _U_(0x07) /**< \brief (ADC_INTFLAG) MASK Register */ + +/* -------- ADC_STATUS : (ADC Offset: 0x2F) (R/ 8) Status -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t ADCBUSY:1; /*!< bit: 0 ADC Busy Status */ + uint8_t :1; /*!< bit: 1 Reserved */ + uint8_t WCC:6; /*!< bit: 2.. 7 Window Comparator Counter */ + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} ADC_STATUS_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define ADC_STATUS_OFFSET 0x2F /**< \brief (ADC_STATUS offset) Status */ +#define ADC_STATUS_RESETVALUE _U_(0x00) /**< \brief (ADC_STATUS reset_value) Status */ + +#define ADC_STATUS_ADCBUSY_Pos 0 /**< \brief (ADC_STATUS) ADC Busy Status */ +#define ADC_STATUS_ADCBUSY (_U_(0x1) << ADC_STATUS_ADCBUSY_Pos) +#define ADC_STATUS_WCC_Pos 2 /**< \brief (ADC_STATUS) Window Comparator Counter */ +#define ADC_STATUS_WCC_Msk (_U_(0x3F) << ADC_STATUS_WCC_Pos) +#define ADC_STATUS_WCC(value) (ADC_STATUS_WCC_Msk & ((value) << ADC_STATUS_WCC_Pos)) +#define ADC_STATUS_MASK _U_(0xFD) /**< \brief (ADC_STATUS) MASK Register */ + +/* -------- ADC_SYNCBUSY : (ADC Offset: 0x30) (R/ 32) Synchronization Busy -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t SWRST:1; /*!< bit: 0 SWRST Synchronization Busy */ + uint32_t ENABLE:1; /*!< bit: 1 ENABLE Synchronization Busy */ + uint32_t INPUTCTRL:1; /*!< bit: 2 Input Control Synchronization Busy */ + uint32_t CTRLB:1; /*!< bit: 3 Control B Synchronization Busy */ + uint32_t REFCTRL:1; /*!< bit: 4 Reference Control Synchronization Busy */ + uint32_t AVGCTRL:1; /*!< bit: 5 Average Control Synchronization Busy */ + uint32_t SAMPCTRL:1; /*!< bit: 6 Sampling Time Control Synchronization Busy */ + uint32_t WINLT:1; /*!< bit: 7 Window Monitor Lower Threshold Synchronization Busy */ + uint32_t WINUT:1; /*!< bit: 8 Window Monitor Upper Threshold Synchronization Busy */ + uint32_t GAINCORR:1; /*!< bit: 9 Gain Correction Synchronization Busy */ + uint32_t OFFSETCORR:1; /*!< bit: 10 Offset Correction Synchronization Busy */ + uint32_t SWTRIG:1; /*!< bit: 11 Software Trigger Synchronization Busy */ + uint32_t :20; /*!< bit: 12..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} ADC_SYNCBUSY_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define ADC_SYNCBUSY_OFFSET 0x30 /**< \brief (ADC_SYNCBUSY offset) Synchronization Busy */ +#define ADC_SYNCBUSY_RESETVALUE _U_(0x00000000) /**< \brief (ADC_SYNCBUSY reset_value) Synchronization Busy */ + +#define ADC_SYNCBUSY_SWRST_Pos 0 /**< \brief (ADC_SYNCBUSY) SWRST Synchronization Busy */ +#define ADC_SYNCBUSY_SWRST (_U_(0x1) << ADC_SYNCBUSY_SWRST_Pos) +#define ADC_SYNCBUSY_ENABLE_Pos 1 /**< \brief (ADC_SYNCBUSY) ENABLE Synchronization Busy */ +#define ADC_SYNCBUSY_ENABLE (_U_(0x1) << ADC_SYNCBUSY_ENABLE_Pos) +#define ADC_SYNCBUSY_INPUTCTRL_Pos 2 /**< \brief (ADC_SYNCBUSY) Input Control Synchronization Busy */ +#define ADC_SYNCBUSY_INPUTCTRL (_U_(0x1) << ADC_SYNCBUSY_INPUTCTRL_Pos) +#define ADC_SYNCBUSY_CTRLB_Pos 3 /**< \brief (ADC_SYNCBUSY) Control B Synchronization Busy */ +#define ADC_SYNCBUSY_CTRLB (_U_(0x1) << ADC_SYNCBUSY_CTRLB_Pos) +#define ADC_SYNCBUSY_REFCTRL_Pos 4 /**< \brief (ADC_SYNCBUSY) Reference Control Synchronization Busy */ +#define ADC_SYNCBUSY_REFCTRL (_U_(0x1) << ADC_SYNCBUSY_REFCTRL_Pos) +#define ADC_SYNCBUSY_AVGCTRL_Pos 5 /**< \brief (ADC_SYNCBUSY) Average Control Synchronization Busy */ +#define ADC_SYNCBUSY_AVGCTRL (_U_(0x1) << ADC_SYNCBUSY_AVGCTRL_Pos) +#define ADC_SYNCBUSY_SAMPCTRL_Pos 6 /**< \brief (ADC_SYNCBUSY) Sampling Time Control Synchronization Busy */ +#define ADC_SYNCBUSY_SAMPCTRL (_U_(0x1) << ADC_SYNCBUSY_SAMPCTRL_Pos) +#define ADC_SYNCBUSY_WINLT_Pos 7 /**< \brief (ADC_SYNCBUSY) Window Monitor Lower Threshold Synchronization Busy */ +#define ADC_SYNCBUSY_WINLT (_U_(0x1) << ADC_SYNCBUSY_WINLT_Pos) +#define ADC_SYNCBUSY_WINUT_Pos 8 /**< \brief (ADC_SYNCBUSY) Window Monitor Upper Threshold Synchronization Busy */ +#define ADC_SYNCBUSY_WINUT (_U_(0x1) << ADC_SYNCBUSY_WINUT_Pos) +#define ADC_SYNCBUSY_GAINCORR_Pos 9 /**< \brief (ADC_SYNCBUSY) Gain Correction Synchronization Busy */ +#define ADC_SYNCBUSY_GAINCORR (_U_(0x1) << ADC_SYNCBUSY_GAINCORR_Pos) +#define ADC_SYNCBUSY_OFFSETCORR_Pos 10 /**< \brief (ADC_SYNCBUSY) Offset Correction Synchronization Busy */ +#define ADC_SYNCBUSY_OFFSETCORR (_U_(0x1) << ADC_SYNCBUSY_OFFSETCORR_Pos) +#define ADC_SYNCBUSY_SWTRIG_Pos 11 /**< \brief (ADC_SYNCBUSY) Software Trigger Synchronization Busy */ +#define ADC_SYNCBUSY_SWTRIG (_U_(0x1) << ADC_SYNCBUSY_SWTRIG_Pos) +#define ADC_SYNCBUSY_MASK _U_(0x00000FFF) /**< \brief (ADC_SYNCBUSY) MASK Register */ + +/* -------- ADC_DSEQDATA : (ADC Offset: 0x34) ( /W 32) DMA Sequencial Data -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t DATA:32; /*!< bit: 0..31 DMA Sequential Data */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} ADC_DSEQDATA_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define ADC_DSEQDATA_OFFSET 0x34 /**< \brief (ADC_DSEQDATA offset) DMA Sequencial Data */ +#define ADC_DSEQDATA_RESETVALUE _U_(0x00000000) /**< \brief (ADC_DSEQDATA reset_value) DMA Sequencial Data */ + +#define ADC_DSEQDATA_DATA_Pos 0 /**< \brief (ADC_DSEQDATA) DMA Sequential Data */ +#define ADC_DSEQDATA_DATA_Msk (_U_(0xFFFFFFFF) << ADC_DSEQDATA_DATA_Pos) +#define ADC_DSEQDATA_DATA(value) (ADC_DSEQDATA_DATA_Msk & ((value) << ADC_DSEQDATA_DATA_Pos)) +#define ADC_DSEQDATA_MASK _U_(0xFFFFFFFF) /**< \brief (ADC_DSEQDATA) MASK Register */ + +/* -------- ADC_DSEQCTRL : (ADC Offset: 0x38) (R/W 32) DMA Sequential Control -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t INPUTCTRL:1; /*!< bit: 0 Input Control */ + uint32_t CTRLB:1; /*!< bit: 1 Control B */ + uint32_t REFCTRL:1; /*!< bit: 2 Reference Control */ + uint32_t AVGCTRL:1; /*!< bit: 3 Average Control */ + uint32_t SAMPCTRL:1; /*!< bit: 4 Sampling Time Control */ + uint32_t WINLT:1; /*!< bit: 5 Window Monitor Lower Threshold */ + uint32_t WINUT:1; /*!< bit: 6 Window Monitor Upper Threshold */ + uint32_t GAINCORR:1; /*!< bit: 7 Gain Correction */ + uint32_t OFFSETCORR:1; /*!< bit: 8 Offset Correction */ + uint32_t :22; /*!< bit: 9..30 Reserved */ + uint32_t AUTOSTART:1; /*!< bit: 31 ADC Auto-Start Conversion */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} ADC_DSEQCTRL_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define ADC_DSEQCTRL_OFFSET 0x38 /**< \brief (ADC_DSEQCTRL offset) DMA Sequential Control */ +#define ADC_DSEQCTRL_RESETVALUE _U_(0x00000000) /**< \brief (ADC_DSEQCTRL reset_value) DMA Sequential Control */ + +#define ADC_DSEQCTRL_INPUTCTRL_Pos 0 /**< \brief (ADC_DSEQCTRL) Input Control */ +#define ADC_DSEQCTRL_INPUTCTRL (_U_(0x1) << ADC_DSEQCTRL_INPUTCTRL_Pos) +#define ADC_DSEQCTRL_CTRLB_Pos 1 /**< \brief (ADC_DSEQCTRL) Control B */ +#define ADC_DSEQCTRL_CTRLB (_U_(0x1) << ADC_DSEQCTRL_CTRLB_Pos) +#define ADC_DSEQCTRL_REFCTRL_Pos 2 /**< \brief (ADC_DSEQCTRL) Reference Control */ +#define ADC_DSEQCTRL_REFCTRL (_U_(0x1) << ADC_DSEQCTRL_REFCTRL_Pos) +#define ADC_DSEQCTRL_AVGCTRL_Pos 3 /**< \brief (ADC_DSEQCTRL) Average Control */ +#define ADC_DSEQCTRL_AVGCTRL (_U_(0x1) << ADC_DSEQCTRL_AVGCTRL_Pos) +#define ADC_DSEQCTRL_SAMPCTRL_Pos 4 /**< \brief (ADC_DSEQCTRL) Sampling Time Control */ +#define ADC_DSEQCTRL_SAMPCTRL (_U_(0x1) << ADC_DSEQCTRL_SAMPCTRL_Pos) +#define ADC_DSEQCTRL_WINLT_Pos 5 /**< \brief (ADC_DSEQCTRL) Window Monitor Lower Threshold */ +#define ADC_DSEQCTRL_WINLT (_U_(0x1) << ADC_DSEQCTRL_WINLT_Pos) +#define ADC_DSEQCTRL_WINUT_Pos 6 /**< \brief (ADC_DSEQCTRL) Window Monitor Upper Threshold */ +#define ADC_DSEQCTRL_WINUT (_U_(0x1) << ADC_DSEQCTRL_WINUT_Pos) +#define ADC_DSEQCTRL_GAINCORR_Pos 7 /**< \brief (ADC_DSEQCTRL) Gain Correction */ +#define ADC_DSEQCTRL_GAINCORR (_U_(0x1) << ADC_DSEQCTRL_GAINCORR_Pos) +#define ADC_DSEQCTRL_OFFSETCORR_Pos 8 /**< \brief (ADC_DSEQCTRL) Offset Correction */ +#define ADC_DSEQCTRL_OFFSETCORR (_U_(0x1) << ADC_DSEQCTRL_OFFSETCORR_Pos) +#define ADC_DSEQCTRL_AUTOSTART_Pos 31 /**< \brief (ADC_DSEQCTRL) ADC Auto-Start Conversion */ +#define ADC_DSEQCTRL_AUTOSTART (_U_(0x1) << ADC_DSEQCTRL_AUTOSTART_Pos) +#define ADC_DSEQCTRL_MASK _U_(0x800001FF) /**< \brief (ADC_DSEQCTRL) MASK Register */ + +/* -------- ADC_DSEQSTAT : (ADC Offset: 0x3C) (R/ 32) DMA Sequencial Status -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t INPUTCTRL:1; /*!< bit: 0 Input Control */ + uint32_t CTRLB:1; /*!< bit: 1 Control B */ + uint32_t REFCTRL:1; /*!< bit: 2 Reference Control */ + uint32_t AVGCTRL:1; /*!< bit: 3 Average Control */ + uint32_t SAMPCTRL:1; /*!< bit: 4 Sampling Time Control */ + uint32_t WINLT:1; /*!< bit: 5 Window Monitor Lower Threshold */ + uint32_t WINUT:1; /*!< bit: 6 Window Monitor Upper Threshold */ + uint32_t GAINCORR:1; /*!< bit: 7 Gain Correction */ + uint32_t OFFSETCORR:1; /*!< bit: 8 Offset Correction */ + uint32_t :22; /*!< bit: 9..30 Reserved */ + uint32_t BUSY:1; /*!< bit: 31 DMA Sequencing Busy */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} ADC_DSEQSTAT_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define ADC_DSEQSTAT_OFFSET 0x3C /**< \brief (ADC_DSEQSTAT offset) DMA Sequencial Status */ +#define ADC_DSEQSTAT_RESETVALUE _U_(0x00000000) /**< \brief (ADC_DSEQSTAT reset_value) DMA Sequencial Status */ + +#define ADC_DSEQSTAT_INPUTCTRL_Pos 0 /**< \brief (ADC_DSEQSTAT) Input Control */ +#define ADC_DSEQSTAT_INPUTCTRL (_U_(0x1) << ADC_DSEQSTAT_INPUTCTRL_Pos) +#define ADC_DSEQSTAT_CTRLB_Pos 1 /**< \brief (ADC_DSEQSTAT) Control B */ +#define ADC_DSEQSTAT_CTRLB (_U_(0x1) << ADC_DSEQSTAT_CTRLB_Pos) +#define ADC_DSEQSTAT_REFCTRL_Pos 2 /**< \brief (ADC_DSEQSTAT) Reference Control */ +#define ADC_DSEQSTAT_REFCTRL (_U_(0x1) << ADC_DSEQSTAT_REFCTRL_Pos) +#define ADC_DSEQSTAT_AVGCTRL_Pos 3 /**< \brief (ADC_DSEQSTAT) Average Control */ +#define ADC_DSEQSTAT_AVGCTRL (_U_(0x1) << ADC_DSEQSTAT_AVGCTRL_Pos) +#define ADC_DSEQSTAT_SAMPCTRL_Pos 4 /**< \brief (ADC_DSEQSTAT) Sampling Time Control */ +#define ADC_DSEQSTAT_SAMPCTRL (_U_(0x1) << ADC_DSEQSTAT_SAMPCTRL_Pos) +#define ADC_DSEQSTAT_WINLT_Pos 5 /**< \brief (ADC_DSEQSTAT) Window Monitor Lower Threshold */ +#define ADC_DSEQSTAT_WINLT (_U_(0x1) << ADC_DSEQSTAT_WINLT_Pos) +#define ADC_DSEQSTAT_WINUT_Pos 6 /**< \brief (ADC_DSEQSTAT) Window Monitor Upper Threshold */ +#define ADC_DSEQSTAT_WINUT (_U_(0x1) << ADC_DSEQSTAT_WINUT_Pos) +#define ADC_DSEQSTAT_GAINCORR_Pos 7 /**< \brief (ADC_DSEQSTAT) Gain Correction */ +#define ADC_DSEQSTAT_GAINCORR (_U_(0x1) << ADC_DSEQSTAT_GAINCORR_Pos) +#define ADC_DSEQSTAT_OFFSETCORR_Pos 8 /**< \brief (ADC_DSEQSTAT) Offset Correction */ +#define ADC_DSEQSTAT_OFFSETCORR (_U_(0x1) << ADC_DSEQSTAT_OFFSETCORR_Pos) +#define ADC_DSEQSTAT_BUSY_Pos 31 /**< \brief (ADC_DSEQSTAT) DMA Sequencing Busy */ +#define ADC_DSEQSTAT_BUSY (_U_(0x1) << ADC_DSEQSTAT_BUSY_Pos) +#define ADC_DSEQSTAT_MASK _U_(0x800001FF) /**< \brief (ADC_DSEQSTAT) MASK Register */ + +/* -------- ADC_RESULT : (ADC Offset: 0x40) (R/ 16) Result Conversion Value -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint16_t RESULT:16; /*!< bit: 0..15 Result Conversion Value */ + } bit; /*!< Structure used for bit access */ + uint16_t reg; /*!< Type used for register access */ +} ADC_RESULT_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define ADC_RESULT_OFFSET 0x40 /**< \brief (ADC_RESULT offset) Result Conversion Value */ +#define ADC_RESULT_RESETVALUE _U_(0x0000) /**< \brief (ADC_RESULT reset_value) Result Conversion Value */ + +#define ADC_RESULT_RESULT_Pos 0 /**< \brief (ADC_RESULT) Result Conversion Value */ +#define ADC_RESULT_RESULT_Msk (_U_(0xFFFF) << ADC_RESULT_RESULT_Pos) +#define ADC_RESULT_RESULT(value) (ADC_RESULT_RESULT_Msk & ((value) << ADC_RESULT_RESULT_Pos)) +#define ADC_RESULT_MASK _U_(0xFFFF) /**< \brief (ADC_RESULT) MASK Register */ + +/* -------- ADC_RESS : (ADC Offset: 0x44) (R/ 16) Last Sample Result -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint16_t RESS:16; /*!< bit: 0..15 Last ADC conversion result */ + } bit; /*!< Structure used for bit access */ + uint16_t reg; /*!< Type used for register access */ +} ADC_RESS_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define ADC_RESS_OFFSET 0x44 /**< \brief (ADC_RESS offset) Last Sample Result */ +#define ADC_RESS_RESETVALUE _U_(0x0000) /**< \brief (ADC_RESS reset_value) Last Sample Result */ + +#define ADC_RESS_RESS_Pos 0 /**< \brief (ADC_RESS) Last ADC conversion result */ +#define ADC_RESS_RESS_Msk (_U_(0xFFFF) << ADC_RESS_RESS_Pos) +#define ADC_RESS_RESS(value) (ADC_RESS_RESS_Msk & ((value) << ADC_RESS_RESS_Pos)) +#define ADC_RESS_MASK _U_(0xFFFF) /**< \brief (ADC_RESS) MASK Register */ + +/* -------- ADC_CALIB : (ADC Offset: 0x48) (R/W 16) Calibration -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint16_t BIASCOMP:3; /*!< bit: 0.. 2 Bias Comparator Scaling */ + uint16_t :1; /*!< bit: 3 Reserved */ + uint16_t BIASR2R:3; /*!< bit: 4.. 6 Bias R2R Ampli scaling */ + uint16_t :1; /*!< bit: 7 Reserved */ + uint16_t BIASREFBUF:3; /*!< bit: 8..10 Bias Reference Buffer Scaling */ + uint16_t :5; /*!< bit: 11..15 Reserved */ + } bit; /*!< Structure used for bit access */ + uint16_t reg; /*!< Type used for register access */ +} ADC_CALIB_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define ADC_CALIB_OFFSET 0x48 /**< \brief (ADC_CALIB offset) Calibration */ +#define ADC_CALIB_RESETVALUE _U_(0x0000) /**< \brief (ADC_CALIB reset_value) Calibration */ + +#define ADC_CALIB_BIASCOMP_Pos 0 /**< \brief (ADC_CALIB) Bias Comparator Scaling */ +#define ADC_CALIB_BIASCOMP_Msk (_U_(0x7) << ADC_CALIB_BIASCOMP_Pos) +#define ADC_CALIB_BIASCOMP(value) (ADC_CALIB_BIASCOMP_Msk & ((value) << ADC_CALIB_BIASCOMP_Pos)) +#define ADC_CALIB_BIASR2R_Pos 4 /**< \brief (ADC_CALIB) Bias R2R Ampli scaling */ +#define ADC_CALIB_BIASR2R_Msk (_U_(0x7) << ADC_CALIB_BIASR2R_Pos) +#define ADC_CALIB_BIASR2R(value) (ADC_CALIB_BIASR2R_Msk & ((value) << ADC_CALIB_BIASR2R_Pos)) +#define ADC_CALIB_BIASREFBUF_Pos 8 /**< \brief (ADC_CALIB) Bias Reference Buffer Scaling */ +#define ADC_CALIB_BIASREFBUF_Msk (_U_(0x7) << ADC_CALIB_BIASREFBUF_Pos) +#define ADC_CALIB_BIASREFBUF(value) (ADC_CALIB_BIASREFBUF_Msk & ((value) << ADC_CALIB_BIASREFBUF_Pos)) +#define ADC_CALIB_MASK _U_(0x0777) /**< \brief (ADC_CALIB) MASK Register */ + +/** \brief ADC hardware registers */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef struct { + __IO ADC_CTRLA_Type CTRLA; /**< \brief Offset: 0x00 (R/W 16) Control A */ + __IO ADC_EVCTRL_Type EVCTRL; /**< \brief Offset: 0x02 (R/W 8) Event Control */ + __IO ADC_DBGCTRL_Type DBGCTRL; /**< \brief Offset: 0x03 (R/W 8) Debug Control */ + __IO ADC_INPUTCTRL_Type INPUTCTRL; /**< \brief Offset: 0x04 (R/W 16) Input Control */ + __IO ADC_CTRLB_Type CTRLB; /**< \brief Offset: 0x06 (R/W 16) Control B */ + __IO ADC_REFCTRL_Type REFCTRL; /**< \brief Offset: 0x08 (R/W 8) Reference Control */ + RoReg8 Reserved1[0x1]; + __IO ADC_AVGCTRL_Type AVGCTRL; /**< \brief Offset: 0x0A (R/W 8) Average Control */ + __IO ADC_SAMPCTRL_Type SAMPCTRL; /**< \brief Offset: 0x0B (R/W 8) Sample Time Control */ + __IO ADC_WINLT_Type WINLT; /**< \brief Offset: 0x0C (R/W 16) Window Monitor Lower Threshold */ + __IO ADC_WINUT_Type WINUT; /**< \brief Offset: 0x0E (R/W 16) Window Monitor Upper Threshold */ + __IO ADC_GAINCORR_Type GAINCORR; /**< \brief Offset: 0x10 (R/W 16) Gain Correction */ + __IO ADC_OFFSETCORR_Type OFFSETCORR; /**< \brief Offset: 0x12 (R/W 16) Offset Correction */ + __IO ADC_SWTRIG_Type SWTRIG; /**< \brief Offset: 0x14 (R/W 8) Software Trigger */ + RoReg8 Reserved2[0x17]; + __IO ADC_INTENCLR_Type INTENCLR; /**< \brief Offset: 0x2C (R/W 8) Interrupt Enable Clear */ + __IO ADC_INTENSET_Type INTENSET; /**< \brief Offset: 0x2D (R/W 8) Interrupt Enable Set */ + __IO ADC_INTFLAG_Type INTFLAG; /**< \brief Offset: 0x2E (R/W 8) Interrupt Flag Status and Clear */ + __I ADC_STATUS_Type STATUS; /**< \brief Offset: 0x2F (R/ 8) Status */ + __I ADC_SYNCBUSY_Type SYNCBUSY; /**< \brief Offset: 0x30 (R/ 32) Synchronization Busy */ + __O ADC_DSEQDATA_Type DSEQDATA; /**< \brief Offset: 0x34 ( /W 32) DMA Sequencial Data */ + __IO ADC_DSEQCTRL_Type DSEQCTRL; /**< \brief Offset: 0x38 (R/W 32) DMA Sequential Control */ + __I ADC_DSEQSTAT_Type DSEQSTAT; /**< \brief Offset: 0x3C (R/ 32) DMA Sequencial Status */ + __I ADC_RESULT_Type RESULT; /**< \brief Offset: 0x40 (R/ 16) Result Conversion Value */ + RoReg8 Reserved3[0x2]; + __I ADC_RESS_Type RESS; /**< \brief Offset: 0x44 (R/ 16) Last Sample Result */ + RoReg8 Reserved4[0x2]; + __IO ADC_CALIB_Type CALIB; /**< \brief Offset: 0x48 (R/W 16) Calibration */ +} Adc; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/*@}*/ + +#endif /* _SAMD51_ADC_COMPONENT_ */ diff --git a/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/aes.h b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/aes.h new file mode 100644 index 000000000..5a74eac28 --- /dev/null +++ b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/aes.h @@ -0,0 +1,375 @@ +/** + * \file + * + * \brief Component description for AES + * + * Copyright (c) 2017 Microchip Technology Inc. + * + * \asf_license_start + * + * \page License + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 Licence 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. + * + * \asf_license_stop + * + */ + +#ifndef _SAMD51_AES_COMPONENT_ +#define _SAMD51_AES_COMPONENT_ + +/* ========================================================================== */ +/** SOFTWARE API DEFINITION FOR AES */ +/* ========================================================================== */ +/** \addtogroup SAMD51_AES Advanced Encryption Standard */ +/*@{*/ + +#define AES_U2238 +#define REV_AES 0x220 + +/* -------- AES_CTRLA : (AES Offset: 0x00) (R/W 32) Control A -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t SWRST:1; /*!< bit: 0 Software Reset */ + uint32_t ENABLE:1; /*!< bit: 1 Enable */ + uint32_t AESMODE:3; /*!< bit: 2.. 4 AES Modes of operation */ + uint32_t CFBS:3; /*!< bit: 5.. 7 Cipher Feedback Block Size */ + uint32_t KEYSIZE:2; /*!< bit: 8.. 9 Encryption Key Size */ + uint32_t CIPHER:1; /*!< bit: 10 Cipher Mode */ + uint32_t STARTMODE:1; /*!< bit: 11 Start Mode Select */ + uint32_t LOD:1; /*!< bit: 12 Last Output Data Mode */ + uint32_t KEYGEN:1; /*!< bit: 13 Last Key Generation */ + uint32_t XORKEY:1; /*!< bit: 14 XOR Key Operation */ + uint32_t :1; /*!< bit: 15 Reserved */ + uint32_t CTYPE:4; /*!< bit: 16..19 Counter Measure Type */ + uint32_t :12; /*!< bit: 20..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} AES_CTRLA_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define AES_CTRLA_OFFSET 0x00 /**< \brief (AES_CTRLA offset) Control A */ +#define AES_CTRLA_RESETVALUE _U_(0x00000000) /**< \brief (AES_CTRLA reset_value) Control A */ + +#define AES_CTRLA_SWRST_Pos 0 /**< \brief (AES_CTRLA) Software Reset */ +#define AES_CTRLA_SWRST (_U_(0x1) << AES_CTRLA_SWRST_Pos) +#define AES_CTRLA_ENABLE_Pos 1 /**< \brief (AES_CTRLA) Enable */ +#define AES_CTRLA_ENABLE (_U_(0x1) << AES_CTRLA_ENABLE_Pos) +#define AES_CTRLA_AESMODE_Pos 2 /**< \brief (AES_CTRLA) AES Modes of operation */ +#define AES_CTRLA_AESMODE_Msk (_U_(0x7) << AES_CTRLA_AESMODE_Pos) +#define AES_CTRLA_AESMODE(value) (AES_CTRLA_AESMODE_Msk & ((value) << AES_CTRLA_AESMODE_Pos)) +#define AES_CTRLA_AESMODE_ECB_Val _U_(0x0) /**< \brief (AES_CTRLA) Electronic code book mode */ +#define AES_CTRLA_AESMODE_CBC_Val _U_(0x1) /**< \brief (AES_CTRLA) Cipher block chaining mode */ +#define AES_CTRLA_AESMODE_OFB_Val _U_(0x2) /**< \brief (AES_CTRLA) Output feedback mode */ +#define AES_CTRLA_AESMODE_CFB_Val _U_(0x3) /**< \brief (AES_CTRLA) Cipher feedback mode */ +#define AES_CTRLA_AESMODE_COUNTER_Val _U_(0x4) /**< \brief (AES_CTRLA) Counter mode */ +#define AES_CTRLA_AESMODE_CCM_Val _U_(0x5) /**< \brief (AES_CTRLA) CCM mode */ +#define AES_CTRLA_AESMODE_GCM_Val _U_(0x6) /**< \brief (AES_CTRLA) Galois counter mode */ +#define AES_CTRLA_AESMODE_ECB (AES_CTRLA_AESMODE_ECB_Val << AES_CTRLA_AESMODE_Pos) +#define AES_CTRLA_AESMODE_CBC (AES_CTRLA_AESMODE_CBC_Val << AES_CTRLA_AESMODE_Pos) +#define AES_CTRLA_AESMODE_OFB (AES_CTRLA_AESMODE_OFB_Val << AES_CTRLA_AESMODE_Pos) +#define AES_CTRLA_AESMODE_CFB (AES_CTRLA_AESMODE_CFB_Val << AES_CTRLA_AESMODE_Pos) +#define AES_CTRLA_AESMODE_COUNTER (AES_CTRLA_AESMODE_COUNTER_Val << AES_CTRLA_AESMODE_Pos) +#define AES_CTRLA_AESMODE_CCM (AES_CTRLA_AESMODE_CCM_Val << AES_CTRLA_AESMODE_Pos) +#define AES_CTRLA_AESMODE_GCM (AES_CTRLA_AESMODE_GCM_Val << AES_CTRLA_AESMODE_Pos) +#define AES_CTRLA_CFBS_Pos 5 /**< \brief (AES_CTRLA) Cipher Feedback Block Size */ +#define AES_CTRLA_CFBS_Msk (_U_(0x7) << AES_CTRLA_CFBS_Pos) +#define AES_CTRLA_CFBS(value) (AES_CTRLA_CFBS_Msk & ((value) << AES_CTRLA_CFBS_Pos)) +#define AES_CTRLA_CFBS_128BIT_Val _U_(0x0) /**< \brief (AES_CTRLA) 128-bit Input data block for Encryption/Decryption in Cipher Feedback mode */ +#define AES_CTRLA_CFBS_64BIT_Val _U_(0x1) /**< \brief (AES_CTRLA) 64-bit Input data block for Encryption/Decryption in Cipher Feedback mode */ +#define AES_CTRLA_CFBS_32BIT_Val _U_(0x2) /**< \brief (AES_CTRLA) 32-bit Input data block for Encryption/Decryption in Cipher Feedback mode */ +#define AES_CTRLA_CFBS_16BIT_Val _U_(0x3) /**< \brief (AES_CTRLA) 16-bit Input data block for Encryption/Decryption in Cipher Feedback mode */ +#define AES_CTRLA_CFBS_8BIT_Val _U_(0x4) /**< \brief (AES_CTRLA) 8-bit Input data block for Encryption/Decryption in Cipher Feedback mode */ +#define AES_CTRLA_CFBS_128BIT (AES_CTRLA_CFBS_128BIT_Val << AES_CTRLA_CFBS_Pos) +#define AES_CTRLA_CFBS_64BIT (AES_CTRLA_CFBS_64BIT_Val << AES_CTRLA_CFBS_Pos) +#define AES_CTRLA_CFBS_32BIT (AES_CTRLA_CFBS_32BIT_Val << AES_CTRLA_CFBS_Pos) +#define AES_CTRLA_CFBS_16BIT (AES_CTRLA_CFBS_16BIT_Val << AES_CTRLA_CFBS_Pos) +#define AES_CTRLA_CFBS_8BIT (AES_CTRLA_CFBS_8BIT_Val << AES_CTRLA_CFBS_Pos) +#define AES_CTRLA_KEYSIZE_Pos 8 /**< \brief (AES_CTRLA) Encryption Key Size */ +#define AES_CTRLA_KEYSIZE_Msk (_U_(0x3) << AES_CTRLA_KEYSIZE_Pos) +#define AES_CTRLA_KEYSIZE(value) (AES_CTRLA_KEYSIZE_Msk & ((value) << AES_CTRLA_KEYSIZE_Pos)) +#define AES_CTRLA_KEYSIZE_128BIT_Val _U_(0x0) /**< \brief (AES_CTRLA) 128-bit Key for Encryption / Decryption */ +#define AES_CTRLA_KEYSIZE_192BIT_Val _U_(0x1) /**< \brief (AES_CTRLA) 192-bit Key for Encryption / Decryption */ +#define AES_CTRLA_KEYSIZE_256BIT_Val _U_(0x2) /**< \brief (AES_CTRLA) 256-bit Key for Encryption / Decryption */ +#define AES_CTRLA_KEYSIZE_128BIT (AES_CTRLA_KEYSIZE_128BIT_Val << AES_CTRLA_KEYSIZE_Pos) +#define AES_CTRLA_KEYSIZE_192BIT (AES_CTRLA_KEYSIZE_192BIT_Val << AES_CTRLA_KEYSIZE_Pos) +#define AES_CTRLA_KEYSIZE_256BIT (AES_CTRLA_KEYSIZE_256BIT_Val << AES_CTRLA_KEYSIZE_Pos) +#define AES_CTRLA_CIPHER_Pos 10 /**< \brief (AES_CTRLA) Cipher Mode */ +#define AES_CTRLA_CIPHER (_U_(0x1) << AES_CTRLA_CIPHER_Pos) +#define AES_CTRLA_CIPHER_DEC_Val _U_(0x0) /**< \brief (AES_CTRLA) Decryption */ +#define AES_CTRLA_CIPHER_ENC_Val _U_(0x1) /**< \brief (AES_CTRLA) Encryption */ +#define AES_CTRLA_CIPHER_DEC (AES_CTRLA_CIPHER_DEC_Val << AES_CTRLA_CIPHER_Pos) +#define AES_CTRLA_CIPHER_ENC (AES_CTRLA_CIPHER_ENC_Val << AES_CTRLA_CIPHER_Pos) +#define AES_CTRLA_STARTMODE_Pos 11 /**< \brief (AES_CTRLA) Start Mode Select */ +#define AES_CTRLA_STARTMODE (_U_(0x1) << AES_CTRLA_STARTMODE_Pos) +#define AES_CTRLA_STARTMODE_MANUAL_Val _U_(0x0) /**< \brief (AES_CTRLA) Start Encryption / Decryption in Manual mode */ +#define AES_CTRLA_STARTMODE_AUTO_Val _U_(0x1) /**< \brief (AES_CTRLA) Start Encryption / Decryption in Auto mode */ +#define AES_CTRLA_STARTMODE_MANUAL (AES_CTRLA_STARTMODE_MANUAL_Val << AES_CTRLA_STARTMODE_Pos) +#define AES_CTRLA_STARTMODE_AUTO (AES_CTRLA_STARTMODE_AUTO_Val << AES_CTRLA_STARTMODE_Pos) +#define AES_CTRLA_LOD_Pos 12 /**< \brief (AES_CTRLA) Last Output Data Mode */ +#define AES_CTRLA_LOD (_U_(0x1) << AES_CTRLA_LOD_Pos) +#define AES_CTRLA_LOD_NONE_Val _U_(0x0) /**< \brief (AES_CTRLA) No effect */ +#define AES_CTRLA_LOD_LAST_Val _U_(0x1) /**< \brief (AES_CTRLA) Start encryption in Last Output Data mode */ +#define AES_CTRLA_LOD_NONE (AES_CTRLA_LOD_NONE_Val << AES_CTRLA_LOD_Pos) +#define AES_CTRLA_LOD_LAST (AES_CTRLA_LOD_LAST_Val << AES_CTRLA_LOD_Pos) +#define AES_CTRLA_KEYGEN_Pos 13 /**< \brief (AES_CTRLA) Last Key Generation */ +#define AES_CTRLA_KEYGEN (_U_(0x1) << AES_CTRLA_KEYGEN_Pos) +#define AES_CTRLA_KEYGEN_NONE_Val _U_(0x0) /**< \brief (AES_CTRLA) No effect */ +#define AES_CTRLA_KEYGEN_LAST_Val _U_(0x1) /**< \brief (AES_CTRLA) Start Computation of the last NK words of the expanded key */ +#define AES_CTRLA_KEYGEN_NONE (AES_CTRLA_KEYGEN_NONE_Val << AES_CTRLA_KEYGEN_Pos) +#define AES_CTRLA_KEYGEN_LAST (AES_CTRLA_KEYGEN_LAST_Val << AES_CTRLA_KEYGEN_Pos) +#define AES_CTRLA_XORKEY_Pos 14 /**< \brief (AES_CTRLA) XOR Key Operation */ +#define AES_CTRLA_XORKEY (_U_(0x1) << AES_CTRLA_XORKEY_Pos) +#define AES_CTRLA_XORKEY_NONE_Val _U_(0x0) /**< \brief (AES_CTRLA) No effect */ +#define AES_CTRLA_XORKEY_XOR_Val _U_(0x1) /**< \brief (AES_CTRLA) The user keyword gets XORed with the previous keyword register content. */ +#define AES_CTRLA_XORKEY_NONE (AES_CTRLA_XORKEY_NONE_Val << AES_CTRLA_XORKEY_Pos) +#define AES_CTRLA_XORKEY_XOR (AES_CTRLA_XORKEY_XOR_Val << AES_CTRLA_XORKEY_Pos) +#define AES_CTRLA_CTYPE_Pos 16 /**< \brief (AES_CTRLA) Counter Measure Type */ +#define AES_CTRLA_CTYPE_Msk (_U_(0xF) << AES_CTRLA_CTYPE_Pos) +#define AES_CTRLA_CTYPE(value) (AES_CTRLA_CTYPE_Msk & ((value) << AES_CTRLA_CTYPE_Pos)) +#define AES_CTRLA_MASK _U_(0x000F7FFF) /**< \brief (AES_CTRLA) MASK Register */ + +/* -------- AES_CTRLB : (AES Offset: 0x04) (R/W 8) Control B -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t START:1; /*!< bit: 0 Start Encryption/Decryption */ + uint8_t NEWMSG:1; /*!< bit: 1 New message */ + uint8_t EOM:1; /*!< bit: 2 End of message */ + uint8_t GFMUL:1; /*!< bit: 3 GF Multiplication */ + uint8_t :4; /*!< bit: 4.. 7 Reserved */ + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} AES_CTRLB_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define AES_CTRLB_OFFSET 0x04 /**< \brief (AES_CTRLB offset) Control B */ +#define AES_CTRLB_RESETVALUE _U_(0x00) /**< \brief (AES_CTRLB reset_value) Control B */ + +#define AES_CTRLB_START_Pos 0 /**< \brief (AES_CTRLB) Start Encryption/Decryption */ +#define AES_CTRLB_START (_U_(0x1) << AES_CTRLB_START_Pos) +#define AES_CTRLB_NEWMSG_Pos 1 /**< \brief (AES_CTRLB) New message */ +#define AES_CTRLB_NEWMSG (_U_(0x1) << AES_CTRLB_NEWMSG_Pos) +#define AES_CTRLB_EOM_Pos 2 /**< \brief (AES_CTRLB) End of message */ +#define AES_CTRLB_EOM (_U_(0x1) << AES_CTRLB_EOM_Pos) +#define AES_CTRLB_GFMUL_Pos 3 /**< \brief (AES_CTRLB) GF Multiplication */ +#define AES_CTRLB_GFMUL (_U_(0x1) << AES_CTRLB_GFMUL_Pos) +#define AES_CTRLB_MASK _U_(0x0F) /**< \brief (AES_CTRLB) MASK Register */ + +/* -------- AES_INTENCLR : (AES Offset: 0x05) (R/W 8) Interrupt Enable Clear -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t ENCCMP:1; /*!< bit: 0 Encryption Complete Interrupt Enable */ + uint8_t GFMCMP:1; /*!< bit: 1 GF Multiplication Complete Interrupt Enable */ + uint8_t :6; /*!< bit: 2.. 7 Reserved */ + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} AES_INTENCLR_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define AES_INTENCLR_OFFSET 0x05 /**< \brief (AES_INTENCLR offset) Interrupt Enable Clear */ +#define AES_INTENCLR_RESETVALUE _U_(0x00) /**< \brief (AES_INTENCLR reset_value) Interrupt Enable Clear */ + +#define AES_INTENCLR_ENCCMP_Pos 0 /**< \brief (AES_INTENCLR) Encryption Complete Interrupt Enable */ +#define AES_INTENCLR_ENCCMP (_U_(0x1) << AES_INTENCLR_ENCCMP_Pos) +#define AES_INTENCLR_GFMCMP_Pos 1 /**< \brief (AES_INTENCLR) GF Multiplication Complete Interrupt Enable */ +#define AES_INTENCLR_GFMCMP (_U_(0x1) << AES_INTENCLR_GFMCMP_Pos) +#define AES_INTENCLR_MASK _U_(0x03) /**< \brief (AES_INTENCLR) MASK Register */ + +/* -------- AES_INTENSET : (AES Offset: 0x06) (R/W 8) Interrupt Enable Set -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t ENCCMP:1; /*!< bit: 0 Encryption Complete Interrupt Enable */ + uint8_t GFMCMP:1; /*!< bit: 1 GF Multiplication Complete Interrupt Enable */ + uint8_t :6; /*!< bit: 2.. 7 Reserved */ + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} AES_INTENSET_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define AES_INTENSET_OFFSET 0x06 /**< \brief (AES_INTENSET offset) Interrupt Enable Set */ +#define AES_INTENSET_RESETVALUE _U_(0x00) /**< \brief (AES_INTENSET reset_value) Interrupt Enable Set */ + +#define AES_INTENSET_ENCCMP_Pos 0 /**< \brief (AES_INTENSET) Encryption Complete Interrupt Enable */ +#define AES_INTENSET_ENCCMP (_U_(0x1) << AES_INTENSET_ENCCMP_Pos) +#define AES_INTENSET_GFMCMP_Pos 1 /**< \brief (AES_INTENSET) GF Multiplication Complete Interrupt Enable */ +#define AES_INTENSET_GFMCMP (_U_(0x1) << AES_INTENSET_GFMCMP_Pos) +#define AES_INTENSET_MASK _U_(0x03) /**< \brief (AES_INTENSET) MASK Register */ + +/* -------- AES_INTFLAG : (AES Offset: 0x07) (R/W 8) Interrupt Flag Status -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { // __I to avoid read-modify-write on write-to-clear register + struct { + __I uint8_t ENCCMP:1; /*!< bit: 0 Encryption Complete */ + __I uint8_t GFMCMP:1; /*!< bit: 1 GF Multiplication Complete */ + __I uint8_t :6; /*!< bit: 2.. 7 Reserved */ + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} AES_INTFLAG_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define AES_INTFLAG_OFFSET 0x07 /**< \brief (AES_INTFLAG offset) Interrupt Flag Status */ +#define AES_INTFLAG_RESETVALUE _U_(0x00) /**< \brief (AES_INTFLAG reset_value) Interrupt Flag Status */ + +#define AES_INTFLAG_ENCCMP_Pos 0 /**< \brief (AES_INTFLAG) Encryption Complete */ +#define AES_INTFLAG_ENCCMP (_U_(0x1) << AES_INTFLAG_ENCCMP_Pos) +#define AES_INTFLAG_GFMCMP_Pos 1 /**< \brief (AES_INTFLAG) GF Multiplication Complete */ +#define AES_INTFLAG_GFMCMP (_U_(0x1) << AES_INTFLAG_GFMCMP_Pos) +#define AES_INTFLAG_MASK _U_(0x03) /**< \brief (AES_INTFLAG) MASK Register */ + +/* -------- AES_DATABUFPTR : (AES Offset: 0x08) (R/W 8) Data buffer pointer -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t INDATAPTR:2; /*!< bit: 0.. 1 Input Data Pointer */ + uint8_t :6; /*!< bit: 2.. 7 Reserved */ + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} AES_DATABUFPTR_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define AES_DATABUFPTR_OFFSET 0x08 /**< \brief (AES_DATABUFPTR offset) Data buffer pointer */ +#define AES_DATABUFPTR_RESETVALUE _U_(0x00) /**< \brief (AES_DATABUFPTR reset_value) Data buffer pointer */ + +#define AES_DATABUFPTR_INDATAPTR_Pos 0 /**< \brief (AES_DATABUFPTR) Input Data Pointer */ +#define AES_DATABUFPTR_INDATAPTR_Msk (_U_(0x3) << AES_DATABUFPTR_INDATAPTR_Pos) +#define AES_DATABUFPTR_INDATAPTR(value) (AES_DATABUFPTR_INDATAPTR_Msk & ((value) << AES_DATABUFPTR_INDATAPTR_Pos)) +#define AES_DATABUFPTR_MASK _U_(0x03) /**< \brief (AES_DATABUFPTR) MASK Register */ + +/* -------- AES_DBGCTRL : (AES Offset: 0x09) (R/W 8) Debug control -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t DBGRUN:1; /*!< bit: 0 Debug Run */ + uint8_t :7; /*!< bit: 1.. 7 Reserved */ + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} AES_DBGCTRL_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define AES_DBGCTRL_OFFSET 0x09 /**< \brief (AES_DBGCTRL offset) Debug control */ +#define AES_DBGCTRL_RESETVALUE _U_(0x00) /**< \brief (AES_DBGCTRL reset_value) Debug control */ + +#define AES_DBGCTRL_DBGRUN_Pos 0 /**< \brief (AES_DBGCTRL) Debug Run */ +#define AES_DBGCTRL_DBGRUN (_U_(0x1) << AES_DBGCTRL_DBGRUN_Pos) +#define AES_DBGCTRL_MASK _U_(0x01) /**< \brief (AES_DBGCTRL) MASK Register */ + +/* -------- AES_KEYWORD : (AES Offset: 0x0C) ( /W 32) Keyword n -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + uint32_t reg; /*!< Type used for register access */ +} AES_KEYWORD_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define AES_KEYWORD_OFFSET 0x0C /**< \brief (AES_KEYWORD offset) Keyword n */ +#define AES_KEYWORD_RESETVALUE _U_(0x00000000) /**< \brief (AES_KEYWORD reset_value) Keyword n */ +#define AES_KEYWORD_MASK _U_(0xFFFFFFFF) /**< \brief (AES_KEYWORD) MASK Register */ + +/* -------- AES_INDATA : (AES Offset: 0x38) (R/W 32) Indata -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + uint32_t reg; /*!< Type used for register access */ +} AES_INDATA_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define AES_INDATA_OFFSET 0x38 /**< \brief (AES_INDATA offset) Indata */ +#define AES_INDATA_RESETVALUE _U_(0x00000000) /**< \brief (AES_INDATA reset_value) Indata */ +#define AES_INDATA_MASK _U_(0xFFFFFFFF) /**< \brief (AES_INDATA) MASK Register */ + +/* -------- AES_INTVECTV : (AES Offset: 0x3C) ( /W 32) Initialisation Vector n -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + uint32_t reg; /*!< Type used for register access */ +} AES_INTVECTV_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define AES_INTVECTV_OFFSET 0x3C /**< \brief (AES_INTVECTV offset) Initialisation Vector n */ +#define AES_INTVECTV_RESETVALUE _U_(0x00000000) /**< \brief (AES_INTVECTV reset_value) Initialisation Vector n */ +#define AES_INTVECTV_MASK _U_(0xFFFFFFFF) /**< \brief (AES_INTVECTV) MASK Register */ + +/* -------- AES_HASHKEY : (AES Offset: 0x5C) (R/W 32) Hash key n -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + uint32_t reg; /*!< Type used for register access */ +} AES_HASHKEY_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define AES_HASHKEY_OFFSET 0x5C /**< \brief (AES_HASHKEY offset) Hash key n */ +#define AES_HASHKEY_RESETVALUE _U_(0x00000000) /**< \brief (AES_HASHKEY reset_value) Hash key n */ +#define AES_HASHKEY_MASK _U_(0xFFFFFFFF) /**< \brief (AES_HASHKEY) MASK Register */ + +/* -------- AES_GHASH : (AES Offset: 0x6C) (R/W 32) Galois Hash n -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + uint32_t reg; /*!< Type used for register access */ +} AES_GHASH_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define AES_GHASH_OFFSET 0x6C /**< \brief (AES_GHASH offset) Galois Hash n */ +#define AES_GHASH_RESETVALUE _U_(0x00000000) /**< \brief (AES_GHASH reset_value) Galois Hash n */ +#define AES_GHASH_MASK _U_(0xFFFFFFFF) /**< \brief (AES_GHASH) MASK Register */ + +/* -------- AES_CIPLEN : (AES Offset: 0x80) (R/W 32) Cipher Length -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + uint32_t reg; /*!< Type used for register access */ +} AES_CIPLEN_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define AES_CIPLEN_OFFSET 0x80 /**< \brief (AES_CIPLEN offset) Cipher Length */ +#define AES_CIPLEN_RESETVALUE _U_(0x00000000) /**< \brief (AES_CIPLEN reset_value) Cipher Length */ +#define AES_CIPLEN_MASK _U_(0xFFFFFFFF) /**< \brief (AES_CIPLEN) MASK Register */ + +/* -------- AES_RANDSEED : (AES Offset: 0x84) (R/W 32) Random Seed -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + uint32_t reg; /*!< Type used for register access */ +} AES_RANDSEED_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define AES_RANDSEED_OFFSET 0x84 /**< \brief (AES_RANDSEED offset) Random Seed */ +#define AES_RANDSEED_RESETVALUE _U_(0x00000000) /**< \brief (AES_RANDSEED reset_value) Random Seed */ +#define AES_RANDSEED_MASK _U_(0xFFFFFFFF) /**< \brief (AES_RANDSEED) MASK Register */ + +/** \brief AES hardware registers */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef struct { + __IO AES_CTRLA_Type CTRLA; /**< \brief Offset: 0x00 (R/W 32) Control A */ + __IO AES_CTRLB_Type CTRLB; /**< \brief Offset: 0x04 (R/W 8) Control B */ + __IO AES_INTENCLR_Type INTENCLR; /**< \brief Offset: 0x05 (R/W 8) Interrupt Enable Clear */ + __IO AES_INTENSET_Type INTENSET; /**< \brief Offset: 0x06 (R/W 8) Interrupt Enable Set */ + __IO AES_INTFLAG_Type INTFLAG; /**< \brief Offset: 0x07 (R/W 8) Interrupt Flag Status */ + __IO AES_DATABUFPTR_Type DATABUFPTR; /**< \brief Offset: 0x08 (R/W 8) Data buffer pointer */ + __IO AES_DBGCTRL_Type DBGCTRL; /**< \brief Offset: 0x09 (R/W 8) Debug control */ + RoReg8 Reserved1[0x2]; + __O AES_KEYWORD_Type KEYWORD[8]; /**< \brief Offset: 0x0C ( /W 32) Keyword n */ + RoReg8 Reserved2[0xC]; + __IO AES_INDATA_Type INDATA; /**< \brief Offset: 0x38 (R/W 32) Indata */ + __O AES_INTVECTV_Type INTVECTV[4]; /**< \brief Offset: 0x3C ( /W 32) Initialisation Vector n */ + RoReg8 Reserved3[0x10]; + __IO AES_HASHKEY_Type HASHKEY[4]; /**< \brief Offset: 0x5C (R/W 32) Hash key n */ + __IO AES_GHASH_Type GHASH[4]; /**< \brief Offset: 0x6C (R/W 32) Galois Hash n */ + RoReg8 Reserved4[0x4]; + __IO AES_CIPLEN_Type CIPLEN; /**< \brief Offset: 0x80 (R/W 32) Cipher Length */ + __IO AES_RANDSEED_Type RANDSEED; /**< \brief Offset: 0x84 (R/W 32) Random Seed */ +} Aes; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/*@}*/ + +#endif /* _SAMD51_AES_COMPONENT_ */ diff --git a/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/can.h b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/can.h new file mode 100644 index 000000000..9d6754998 --- /dev/null +++ b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/can.h @@ -0,0 +1,3207 @@ +/** + * \file + * + * \brief Component description for CAN + * + * Copyright (c) 2016 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +#ifndef _SAMD51_CAN_COMPONENT_ +#define _SAMD51_CAN_COMPONENT_ + +/* ========================================================================== */ +/** SOFTWARE API DEFINITION FOR CAN */ +/* ========================================================================== */ +/** \addtogroup SAMD51_CAN Control Area Network */ +/*@{*/ + +#define CAN_U2003 +#define REV_CAN 0x321 + +/* -------- CAN_CREL : (CAN Offset: 0x00) (R/ 32) Core Release -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t :20; /*!< bit: 0..19 Reserved */ + uint32_t SUBSTEP:4; /*!< bit: 20..23 Sub-step of Core Release */ + uint32_t STEP:4; /*!< bit: 24..27 Step of Core Release */ + uint32_t REL:4; /*!< bit: 28..31 Core Release */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_CREL_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_CREL_OFFSET 0x00 /**< \brief (CAN_CREL offset) Core Release */ +#define CAN_CREL_RESETVALUE 0x32100000u /**< \brief (CAN_CREL reset_value) Core Release */ + +#define CAN_CREL_SUBSTEP_Pos 20 /**< \brief (CAN_CREL) Sub-step of Core Release */ +#define CAN_CREL_SUBSTEP_Msk (0xFu << CAN_CREL_SUBSTEP_Pos) +#define CAN_CREL_SUBSTEP(value) (CAN_CREL_SUBSTEP_Msk & ((value) << CAN_CREL_SUBSTEP_Pos)) +#define CAN_CREL_STEP_Pos 24 /**< \brief (CAN_CREL) Step of Core Release */ +#define CAN_CREL_STEP_Msk (0xFu << CAN_CREL_STEP_Pos) +#define CAN_CREL_STEP(value) (CAN_CREL_STEP_Msk & ((value) << CAN_CREL_STEP_Pos)) +#define CAN_CREL_REL_Pos 28 /**< \brief (CAN_CREL) Core Release */ +#define CAN_CREL_REL_Msk (0xFu << CAN_CREL_REL_Pos) +#define CAN_CREL_REL(value) (CAN_CREL_REL_Msk & ((value) << CAN_CREL_REL_Pos)) +#define CAN_CREL_MASK 0xFFF00000u /**< \brief (CAN_CREL) MASK Register */ + +/* -------- CAN_ENDN : (CAN Offset: 0x04) (R/ 32) Endian -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t ETV:32; /*!< bit: 0..31 Endianness Test Value */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_ENDN_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_ENDN_OFFSET 0x04 /**< \brief (CAN_ENDN offset) Endian */ +#define CAN_ENDN_RESETVALUE 0x87654321u /**< \brief (CAN_ENDN reset_value) Endian */ + +#define CAN_ENDN_ETV_Pos 0 /**< \brief (CAN_ENDN) Endianness Test Value */ +#define CAN_ENDN_ETV_Msk (0xFFFFFFFFu << CAN_ENDN_ETV_Pos) +#define CAN_ENDN_ETV(value) (CAN_ENDN_ETV_Msk & ((value) << CAN_ENDN_ETV_Pos)) +#define CAN_ENDN_MASK 0xFFFFFFFFu /**< \brief (CAN_ENDN) MASK Register */ + +/* -------- CAN_MRCFG : (CAN Offset: 0x08) (R/W 32) Message RAM Configuration -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t QOS:2; /*!< bit: 0.. 1 Quality of Service */ + uint32_t :30; /*!< bit: 2..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_MRCFG_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_MRCFG_OFFSET 0x08 /**< \brief (CAN_MRCFG offset) Message RAM Configuration */ +#define CAN_MRCFG_RESETVALUE 0x00000002u /**< \brief (CAN_MRCFG reset_value) Message RAM Configuration */ + +#define CAN_MRCFG_QOS_Pos 0 /**< \brief (CAN_MRCFG) Quality of Service */ +#define CAN_MRCFG_QOS_Msk (0x3u << CAN_MRCFG_QOS_Pos) +#define CAN_MRCFG_QOS(value) (CAN_MRCFG_QOS_Msk & ((value) << CAN_MRCFG_QOS_Pos)) +#define CAN_MRCFG_QOS_DISABLE_Val 0x0u /**< \brief (CAN_MRCFG) Background (no sensitive operation) */ +#define CAN_MRCFG_QOS_LOW_Val 0x1u /**< \brief (CAN_MRCFG) Sensitive Bandwidth */ +#define CAN_MRCFG_QOS_MEDIUM_Val 0x2u /**< \brief (CAN_MRCFG) Sensitive Latency */ +#define CAN_MRCFG_QOS_HIGH_Val 0x3u /**< \brief (CAN_MRCFG) Critical Latency */ +#define CAN_MRCFG_QOS_DISABLE (CAN_MRCFG_QOS_DISABLE_Val << CAN_MRCFG_QOS_Pos) +#define CAN_MRCFG_QOS_LOW (CAN_MRCFG_QOS_LOW_Val << CAN_MRCFG_QOS_Pos) +#define CAN_MRCFG_QOS_MEDIUM (CAN_MRCFG_QOS_MEDIUM_Val << CAN_MRCFG_QOS_Pos) +#define CAN_MRCFG_QOS_HIGH (CAN_MRCFG_QOS_HIGH_Val << CAN_MRCFG_QOS_Pos) +#define CAN_MRCFG_MASK 0x00000003u /**< \brief (CAN_MRCFG) MASK Register */ + +/* -------- CAN_DBTP : (CAN Offset: 0x0C) (R/W 32) Fast Bit Timing and Prescaler -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t DSJW:4; /*!< bit: 0.. 3 Data (Re)Synchronization Jump Width */ + uint32_t DTSEG2:4; /*!< bit: 4.. 7 Data time segment after sample point */ + uint32_t DTSEG1:5; /*!< bit: 8..12 Data time segment before sample point */ + uint32_t :3; /*!< bit: 13..15 Reserved */ + uint32_t DBRP:5; /*!< bit: 16..20 Data Baud Rate Prescaler */ + uint32_t :2; /*!< bit: 21..22 Reserved */ + uint32_t TDC:1; /*!< bit: 23 Tranceiver Delay Compensation */ + uint32_t :8; /*!< bit: 24..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_DBTP_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_DBTP_OFFSET 0x0C /**< \brief (CAN_DBTP offset) Fast Bit Timing and Prescaler */ +#define CAN_DBTP_RESETVALUE 0x00000A33u /**< \brief (CAN_DBTP reset_value) Fast Bit Timing and Prescaler */ + +#define CAN_DBTP_DSJW_Pos 0 /**< \brief (CAN_DBTP) Data (Re)Synchronization Jump Width */ +#define CAN_DBTP_DSJW_Msk (0xFu << CAN_DBTP_DSJW_Pos) +#define CAN_DBTP_DSJW(value) (CAN_DBTP_DSJW_Msk & ((value) << CAN_DBTP_DSJW_Pos)) +#define CAN_DBTP_DTSEG2_Pos 4 /**< \brief (CAN_DBTP) Data time segment after sample point */ +#define CAN_DBTP_DTSEG2_Msk (0xFu << CAN_DBTP_DTSEG2_Pos) +#define CAN_DBTP_DTSEG2(value) (CAN_DBTP_DTSEG2_Msk & ((value) << CAN_DBTP_DTSEG2_Pos)) +#define CAN_DBTP_DTSEG1_Pos 8 /**< \brief (CAN_DBTP) Data time segment before sample point */ +#define CAN_DBTP_DTSEG1_Msk (0x1Fu << CAN_DBTP_DTSEG1_Pos) +#define CAN_DBTP_DTSEG1(value) (CAN_DBTP_DTSEG1_Msk & ((value) << CAN_DBTP_DTSEG1_Pos)) +#define CAN_DBTP_DBRP_Pos 16 /**< \brief (CAN_DBTP) Data Baud Rate Prescaler */ +#define CAN_DBTP_DBRP_Msk (0x1Fu << CAN_DBTP_DBRP_Pos) +#define CAN_DBTP_DBRP(value) (CAN_DBTP_DBRP_Msk & ((value) << CAN_DBTP_DBRP_Pos)) +#define CAN_DBTP_TDC_Pos 23 /**< \brief (CAN_DBTP) Tranceiver Delay Compensation */ +#define CAN_DBTP_TDC (0x1u << CAN_DBTP_TDC_Pos) +#define CAN_DBTP_MASK 0x009F1FFFu /**< \brief (CAN_DBTP) MASK Register */ + +/* -------- CAN_TEST : (CAN Offset: 0x10) (R/W 32) Test -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t :4; /*!< bit: 0.. 3 Reserved */ + uint32_t LBCK:1; /*!< bit: 4 Loop Back Mode */ + uint32_t TX:2; /*!< bit: 5.. 6 Control of Transmit Pin */ + uint32_t RX:1; /*!< bit: 7 Receive Pin */ + uint32_t :24; /*!< bit: 8..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_TEST_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_TEST_OFFSET 0x10 /**< \brief (CAN_TEST offset) Test */ +#define CAN_TEST_RESETVALUE 0x00000000u /**< \brief (CAN_TEST reset_value) Test */ + +#define CAN_TEST_LBCK_Pos 4 /**< \brief (CAN_TEST) Loop Back Mode */ +#define CAN_TEST_LBCK (0x1u << CAN_TEST_LBCK_Pos) +#define CAN_TEST_TX_Pos 5 /**< \brief (CAN_TEST) Control of Transmit Pin */ +#define CAN_TEST_TX_Msk (0x3u << CAN_TEST_TX_Pos) +#define CAN_TEST_TX(value) (CAN_TEST_TX_Msk & ((value) << CAN_TEST_TX_Pos)) +#define CAN_TEST_TX_CORE_Val 0x0u /**< \brief (CAN_TEST) TX controlled by CAN core */ +#define CAN_TEST_TX_SAMPLE_Val 0x1u /**< \brief (CAN_TEST) TX monitoring sample point */ +#define CAN_TEST_TX_DOMINANT_Val 0x2u /**< \brief (CAN_TEST) Dominant (0) level at pin CAN_TX */ +#define CAN_TEST_TX_RECESSIVE_Val 0x3u /**< \brief (CAN_TEST) Recessive (1) level at pin CAN_TX */ +#define CAN_TEST_TX_CORE (CAN_TEST_TX_CORE_Val << CAN_TEST_TX_Pos) +#define CAN_TEST_TX_SAMPLE (CAN_TEST_TX_SAMPLE_Val << CAN_TEST_TX_Pos) +#define CAN_TEST_TX_DOMINANT (CAN_TEST_TX_DOMINANT_Val << CAN_TEST_TX_Pos) +#define CAN_TEST_TX_RECESSIVE (CAN_TEST_TX_RECESSIVE_Val << CAN_TEST_TX_Pos) +#define CAN_TEST_RX_Pos 7 /**< \brief (CAN_TEST) Receive Pin */ +#define CAN_TEST_RX (0x1u << CAN_TEST_RX_Pos) +#define CAN_TEST_MASK 0x000000F0u /**< \brief (CAN_TEST) MASK Register */ + +/* -------- CAN_RWD : (CAN Offset: 0x14) (R/W 32) RAM Watchdog -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t WDC:8; /*!< bit: 0.. 7 Watchdog Configuration */ + uint32_t WDV:8; /*!< bit: 8..15 Watchdog Value */ + uint32_t :16; /*!< bit: 16..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_RWD_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_RWD_OFFSET 0x14 /**< \brief (CAN_RWD offset) RAM Watchdog */ +#define CAN_RWD_RESETVALUE 0x00000000u /**< \brief (CAN_RWD reset_value) RAM Watchdog */ + +#define CAN_RWD_WDC_Pos 0 /**< \brief (CAN_RWD) Watchdog Configuration */ +#define CAN_RWD_WDC_Msk (0xFFu << CAN_RWD_WDC_Pos) +#define CAN_RWD_WDC(value) (CAN_RWD_WDC_Msk & ((value) << CAN_RWD_WDC_Pos)) +#define CAN_RWD_WDV_Pos 8 /**< \brief (CAN_RWD) Watchdog Value */ +#define CAN_RWD_WDV_Msk (0xFFu << CAN_RWD_WDV_Pos) +#define CAN_RWD_WDV(value) (CAN_RWD_WDV_Msk & ((value) << CAN_RWD_WDV_Pos)) +#define CAN_RWD_MASK 0x0000FFFFu /**< \brief (CAN_RWD) MASK Register */ + +/* -------- CAN_CCCR : (CAN Offset: 0x18) (R/W 32) CC Control -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t INIT:1; /*!< bit: 0 Initialization */ + uint32_t CCE:1; /*!< bit: 1 Configuration Change Enable */ + uint32_t ASM:1; /*!< bit: 2 ASM Restricted Operation Mode */ + uint32_t CSA:1; /*!< bit: 3 Clock Stop Acknowledge */ + uint32_t CSR:1; /*!< bit: 4 Clock Stop Request */ + uint32_t MON:1; /*!< bit: 5 Bus Monitoring Mode */ + uint32_t DAR:1; /*!< bit: 6 Disable Automatic Retransmission */ + uint32_t TEST:1; /*!< bit: 7 Test Mode Enable */ + uint32_t FDOE:1; /*!< bit: 8 FD Operation Enable */ + uint32_t BRSE:1; /*!< bit: 9 Bit Rate Switch Enable */ + uint32_t :2; /*!< bit: 10..11 Reserved */ + uint32_t PXHD:1; /*!< bit: 12 Protocol Exception Handling Disable */ + uint32_t EFBI:1; /*!< bit: 13 Edge Filtering during Bus Integration */ + uint32_t TXP:1; /*!< bit: 14 Transmit Pause */ + uint32_t NISO:1; /*!< bit: 15 Non ISO Operation */ + uint32_t :16; /*!< bit: 16..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_CCCR_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_CCCR_OFFSET 0x18 /**< \brief (CAN_CCCR offset) CC Control */ +#define CAN_CCCR_RESETVALUE 0x00000001u /**< \brief (CAN_CCCR reset_value) CC Control */ + +#define CAN_CCCR_INIT_Pos 0 /**< \brief (CAN_CCCR) Initialization */ +#define CAN_CCCR_INIT (0x1u << CAN_CCCR_INIT_Pos) +#define CAN_CCCR_CCE_Pos 1 /**< \brief (CAN_CCCR) Configuration Change Enable */ +#define CAN_CCCR_CCE (0x1u << CAN_CCCR_CCE_Pos) +#define CAN_CCCR_ASM_Pos 2 /**< \brief (CAN_CCCR) ASM Restricted Operation Mode */ +#define CAN_CCCR_ASM (0x1u << CAN_CCCR_ASM_Pos) +#define CAN_CCCR_CSA_Pos 3 /**< \brief (CAN_CCCR) Clock Stop Acknowledge */ +#define CAN_CCCR_CSA (0x1u << CAN_CCCR_CSA_Pos) +#define CAN_CCCR_CSR_Pos 4 /**< \brief (CAN_CCCR) Clock Stop Request */ +#define CAN_CCCR_CSR (0x1u << CAN_CCCR_CSR_Pos) +#define CAN_CCCR_MON_Pos 5 /**< \brief (CAN_CCCR) Bus Monitoring Mode */ +#define CAN_CCCR_MON (0x1u << CAN_CCCR_MON_Pos) +#define CAN_CCCR_DAR_Pos 6 /**< \brief (CAN_CCCR) Disable Automatic Retransmission */ +#define CAN_CCCR_DAR (0x1u << CAN_CCCR_DAR_Pos) +#define CAN_CCCR_TEST_Pos 7 /**< \brief (CAN_CCCR) Test Mode Enable */ +#define CAN_CCCR_TEST (0x1u << CAN_CCCR_TEST_Pos) +#define CAN_CCCR_FDOE_Pos 8 /**< \brief (CAN_CCCR) FD Operation Enable */ +#define CAN_CCCR_FDOE (0x1u << CAN_CCCR_FDOE_Pos) +#define CAN_CCCR_BRSE_Pos 9 /**< \brief (CAN_CCCR) Bit Rate Switch Enable */ +#define CAN_CCCR_BRSE (0x1u << CAN_CCCR_BRSE_Pos) +#define CAN_CCCR_PXHD_Pos 12 /**< \brief (CAN_CCCR) Protocol Exception Handling Disable */ +#define CAN_CCCR_PXHD (0x1u << CAN_CCCR_PXHD_Pos) +#define CAN_CCCR_EFBI_Pos 13 /**< \brief (CAN_CCCR) Edge Filtering during Bus Integration */ +#define CAN_CCCR_EFBI (0x1u << CAN_CCCR_EFBI_Pos) +#define CAN_CCCR_TXP_Pos 14 /**< \brief (CAN_CCCR) Transmit Pause */ +#define CAN_CCCR_TXP (0x1u << CAN_CCCR_TXP_Pos) +#define CAN_CCCR_NISO_Pos 15 /**< \brief (CAN_CCCR) Non ISO Operation */ +#define CAN_CCCR_NISO (0x1u << CAN_CCCR_NISO_Pos) +#define CAN_CCCR_MASK 0x0000F3FFu /**< \brief (CAN_CCCR) MASK Register */ + +/* -------- CAN_NBTP : (CAN Offset: 0x1C) (R/W 32) Nominal Bit Timing and Prescaler -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t NTSEG2:7; /*!< bit: 0.. 6 Nominal Time segment after sample point */ + uint32_t :1; /*!< bit: 7 Reserved */ + uint32_t NTSEG1:8; /*!< bit: 8..15 Nominal Time segment before sample point */ + uint32_t NBRP:9; /*!< bit: 16..24 Nominal Baud Rate Prescaler */ + uint32_t NSJW:7; /*!< bit: 25..31 Nominal (Re)Synchronization Jump Width */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_NBTP_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_NBTP_OFFSET 0x1C /**< \brief (CAN_NBTP offset) Nominal Bit Timing and Prescaler */ +#define CAN_NBTP_RESETVALUE 0x06000A03u /**< \brief (CAN_NBTP reset_value) Nominal Bit Timing and Prescaler */ + +#define CAN_NBTP_NTSEG2_Pos 0 /**< \brief (CAN_NBTP) Nominal Time segment after sample point */ +#define CAN_NBTP_NTSEG2_Msk (0x7Fu << CAN_NBTP_NTSEG2_Pos) +#define CAN_NBTP_NTSEG2(value) (CAN_NBTP_NTSEG2_Msk & ((value) << CAN_NBTP_NTSEG2_Pos)) +#define CAN_NBTP_NTSEG1_Pos 8 /**< \brief (CAN_NBTP) Nominal Time segment before sample point */ +#define CAN_NBTP_NTSEG1_Msk (0xFFu << CAN_NBTP_NTSEG1_Pos) +#define CAN_NBTP_NTSEG1(value) (CAN_NBTP_NTSEG1_Msk & ((value) << CAN_NBTP_NTSEG1_Pos)) +#define CAN_NBTP_NBRP_Pos 16 /**< \brief (CAN_NBTP) Nominal Baud Rate Prescaler */ +#define CAN_NBTP_NBRP_Msk (0x1FFu << CAN_NBTP_NBRP_Pos) +#define CAN_NBTP_NBRP(value) (CAN_NBTP_NBRP_Msk & ((value) << CAN_NBTP_NBRP_Pos)) +#define CAN_NBTP_NSJW_Pos 25 /**< \brief (CAN_NBTP) Nominal (Re)Synchronization Jump Width */ +#define CAN_NBTP_NSJW_Msk (0x7Fu << CAN_NBTP_NSJW_Pos) +#define CAN_NBTP_NSJW(value) (CAN_NBTP_NSJW_Msk & ((value) << CAN_NBTP_NSJW_Pos)) +#define CAN_NBTP_MASK 0xFFFFFF7Fu /**< \brief (CAN_NBTP) MASK Register */ + +/* -------- CAN_TSCC : (CAN Offset: 0x20) (R/W 32) Timestamp Counter Configuration -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t TSS:2; /*!< bit: 0.. 1 Timestamp Select */ + uint32_t :14; /*!< bit: 2..15 Reserved */ + uint32_t TCP:4; /*!< bit: 16..19 Timestamp Counter Prescaler */ + uint32_t :12; /*!< bit: 20..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_TSCC_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_TSCC_OFFSET 0x20 /**< \brief (CAN_TSCC offset) Timestamp Counter Configuration */ +#define CAN_TSCC_RESETVALUE 0x00000000u /**< \brief (CAN_TSCC reset_value) Timestamp Counter Configuration */ + +#define CAN_TSCC_TSS_Pos 0 /**< \brief (CAN_TSCC) Timestamp Select */ +#define CAN_TSCC_TSS_Msk (0x3u << CAN_TSCC_TSS_Pos) +#define CAN_TSCC_TSS(value) (CAN_TSCC_TSS_Msk & ((value) << CAN_TSCC_TSS_Pos)) +#define CAN_TSCC_TSS_ZERO_Val 0x0u /**< \brief (CAN_TSCC) Timestamp counter value always 0x0000 */ +#define CAN_TSCC_TSS_INC_Val 0x1u /**< \brief (CAN_TSCC) Timestamp counter value incremented by TCP */ +#define CAN_TSCC_TSS_EXT_Val 0x2u /**< \brief (CAN_TSCC) External timestamp counter value used */ +#define CAN_TSCC_TSS_ZERO (CAN_TSCC_TSS_ZERO_Val << CAN_TSCC_TSS_Pos) +#define CAN_TSCC_TSS_INC (CAN_TSCC_TSS_INC_Val << CAN_TSCC_TSS_Pos) +#define CAN_TSCC_TSS_EXT (CAN_TSCC_TSS_EXT_Val << CAN_TSCC_TSS_Pos) +#define CAN_TSCC_TCP_Pos 16 /**< \brief (CAN_TSCC) Timestamp Counter Prescaler */ +#define CAN_TSCC_TCP_Msk (0xFu << CAN_TSCC_TCP_Pos) +#define CAN_TSCC_TCP(value) (CAN_TSCC_TCP_Msk & ((value) << CAN_TSCC_TCP_Pos)) +#define CAN_TSCC_MASK 0x000F0003u /**< \brief (CAN_TSCC) MASK Register */ + +/* -------- CAN_TSCV : (CAN Offset: 0x24) (R/ 32) Timestamp Counter Value -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t TSC:16; /*!< bit: 0..15 Timestamp Counter */ + uint32_t :16; /*!< bit: 16..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_TSCV_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_TSCV_OFFSET 0x24 /**< \brief (CAN_TSCV offset) Timestamp Counter Value */ +#define CAN_TSCV_RESETVALUE 0x00000000u /**< \brief (CAN_TSCV reset_value) Timestamp Counter Value */ + +#define CAN_TSCV_TSC_Pos 0 /**< \brief (CAN_TSCV) Timestamp Counter */ +#define CAN_TSCV_TSC_Msk (0xFFFFu << CAN_TSCV_TSC_Pos) +#define CAN_TSCV_TSC(value) (CAN_TSCV_TSC_Msk & ((value) << CAN_TSCV_TSC_Pos)) +#define CAN_TSCV_MASK 0x0000FFFFu /**< \brief (CAN_TSCV) MASK Register */ + +/* -------- CAN_TOCC : (CAN Offset: 0x28) (R/W 32) Timeout Counter Configuration -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t ETOC:1; /*!< bit: 0 Enable Timeout Counter */ + uint32_t TOS:2; /*!< bit: 1.. 2 Timeout Select */ + uint32_t :13; /*!< bit: 3..15 Reserved */ + uint32_t TOP:16; /*!< bit: 16..31 Timeout Period */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_TOCC_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_TOCC_OFFSET 0x28 /**< \brief (CAN_TOCC offset) Timeout Counter Configuration */ +#define CAN_TOCC_RESETVALUE 0xFFFF0000u /**< \brief (CAN_TOCC reset_value) Timeout Counter Configuration */ + +#define CAN_TOCC_ETOC_Pos 0 /**< \brief (CAN_TOCC) Enable Timeout Counter */ +#define CAN_TOCC_ETOC (0x1u << CAN_TOCC_ETOC_Pos) +#define CAN_TOCC_TOS_Pos 1 /**< \brief (CAN_TOCC) Timeout Select */ +#define CAN_TOCC_TOS_Msk (0x3u << CAN_TOCC_TOS_Pos) +#define CAN_TOCC_TOS(value) (CAN_TOCC_TOS_Msk & ((value) << CAN_TOCC_TOS_Pos)) +#define CAN_TOCC_TOS_CONT_Val 0x0u /**< \brief (CAN_TOCC) Continuout operation */ +#define CAN_TOCC_TOS_TXEF_Val 0x1u /**< \brief (CAN_TOCC) Timeout controlled by TX Event FIFO */ +#define CAN_TOCC_TOS_RXF0_Val 0x2u /**< \brief (CAN_TOCC) Timeout controlled by Rx FIFO 0 */ +#define CAN_TOCC_TOS_RXF1_Val 0x3u /**< \brief (CAN_TOCC) Timeout controlled by Rx FIFO 1 */ +#define CAN_TOCC_TOS_CONT (CAN_TOCC_TOS_CONT_Val << CAN_TOCC_TOS_Pos) +#define CAN_TOCC_TOS_TXEF (CAN_TOCC_TOS_TXEF_Val << CAN_TOCC_TOS_Pos) +#define CAN_TOCC_TOS_RXF0 (CAN_TOCC_TOS_RXF0_Val << CAN_TOCC_TOS_Pos) +#define CAN_TOCC_TOS_RXF1 (CAN_TOCC_TOS_RXF1_Val << CAN_TOCC_TOS_Pos) +#define CAN_TOCC_TOP_Pos 16 /**< \brief (CAN_TOCC) Timeout Period */ +#define CAN_TOCC_TOP_Msk (0xFFFFu << CAN_TOCC_TOP_Pos) +#define CAN_TOCC_TOP(value) (CAN_TOCC_TOP_Msk & ((value) << CAN_TOCC_TOP_Pos)) +#define CAN_TOCC_MASK 0xFFFF0007u /**< \brief (CAN_TOCC) MASK Register */ + +/* -------- CAN_TOCV : (CAN Offset: 0x2C) (R/W 32) Timeout Counter Value -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t TOC:16; /*!< bit: 0..15 Timeout Counter */ + uint32_t :16; /*!< bit: 16..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_TOCV_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_TOCV_OFFSET 0x2C /**< \brief (CAN_TOCV offset) Timeout Counter Value */ +#define CAN_TOCV_RESETVALUE 0x0000FFFFu /**< \brief (CAN_TOCV reset_value) Timeout Counter Value */ + +#define CAN_TOCV_TOC_Pos 0 /**< \brief (CAN_TOCV) Timeout Counter */ +#define CAN_TOCV_TOC_Msk (0xFFFFu << CAN_TOCV_TOC_Pos) +#define CAN_TOCV_TOC(value) (CAN_TOCV_TOC_Msk & ((value) << CAN_TOCV_TOC_Pos)) +#define CAN_TOCV_MASK 0x0000FFFFu /**< \brief (CAN_TOCV) MASK Register */ + +/* -------- CAN_ECR : (CAN Offset: 0x40) (R/ 32) Error Counter -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t TEC:8; /*!< bit: 0.. 7 Transmit Error Counter */ + uint32_t REC:7; /*!< bit: 8..14 Receive Error Counter */ + uint32_t RP:1; /*!< bit: 15 Receive Error Passive */ + uint32_t CEL:8; /*!< bit: 16..23 CAN Error Logging */ + uint32_t :8; /*!< bit: 24..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_ECR_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_ECR_OFFSET 0x40 /**< \brief (CAN_ECR offset) Error Counter */ +#define CAN_ECR_RESETVALUE 0x00000000u /**< \brief (CAN_ECR reset_value) Error Counter */ + +#define CAN_ECR_TEC_Pos 0 /**< \brief (CAN_ECR) Transmit Error Counter */ +#define CAN_ECR_TEC_Msk (0xFFu << CAN_ECR_TEC_Pos) +#define CAN_ECR_TEC(value) (CAN_ECR_TEC_Msk & ((value) << CAN_ECR_TEC_Pos)) +#define CAN_ECR_REC_Pos 8 /**< \brief (CAN_ECR) Receive Error Counter */ +#define CAN_ECR_REC_Msk (0x7Fu << CAN_ECR_REC_Pos) +#define CAN_ECR_REC(value) (CAN_ECR_REC_Msk & ((value) << CAN_ECR_REC_Pos)) +#define CAN_ECR_RP_Pos 15 /**< \brief (CAN_ECR) Receive Error Passive */ +#define CAN_ECR_RP (0x1u << CAN_ECR_RP_Pos) +#define CAN_ECR_CEL_Pos 16 /**< \brief (CAN_ECR) CAN Error Logging */ +#define CAN_ECR_CEL_Msk (0xFFu << CAN_ECR_CEL_Pos) +#define CAN_ECR_CEL(value) (CAN_ECR_CEL_Msk & ((value) << CAN_ECR_CEL_Pos)) +#define CAN_ECR_MASK 0x00FFFFFFu /**< \brief (CAN_ECR) MASK Register */ + +/* -------- CAN_PSR : (CAN Offset: 0x44) (R/ 32) Protocol Status -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t LEC:3; /*!< bit: 0.. 2 Last Error Code */ + uint32_t ACT:2; /*!< bit: 3.. 4 Activity */ + uint32_t EP:1; /*!< bit: 5 Error Passive */ + uint32_t EW:1; /*!< bit: 6 Warning Status */ + uint32_t BO:1; /*!< bit: 7 Bus_Off Status */ + uint32_t DLEC:3; /*!< bit: 8..10 Data Phase Last Error Code */ + uint32_t RESI:1; /*!< bit: 11 ESI flag of last received CAN FD Message */ + uint32_t RBRS:1; /*!< bit: 12 BRS flag of last received CAN FD Message */ + uint32_t RFDF:1; /*!< bit: 13 Received a CAN FD Message */ + uint32_t PXE:1; /*!< bit: 14 Protocol Exception Event */ + uint32_t :1; /*!< bit: 15 Reserved */ + uint32_t TDCV:7; /*!< bit: 16..22 Transmitter Delay Compensation Value */ + uint32_t :9; /*!< bit: 23..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_PSR_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_PSR_OFFSET 0x44 /**< \brief (CAN_PSR offset) Protocol Status */ +#define CAN_PSR_RESETVALUE 0x00000707u /**< \brief (CAN_PSR reset_value) Protocol Status */ + +#define CAN_PSR_LEC_Pos 0 /**< \brief (CAN_PSR) Last Error Code */ +#define CAN_PSR_LEC_Msk (0x7u << CAN_PSR_LEC_Pos) +#define CAN_PSR_LEC(value) (CAN_PSR_LEC_Msk & ((value) << CAN_PSR_LEC_Pos)) +#define CAN_PSR_LEC_NONE_Val 0x0u /**< \brief (CAN_PSR) No Error */ +#define CAN_PSR_LEC_STUFF_Val 0x1u /**< \brief (CAN_PSR) Stuff Error */ +#define CAN_PSR_LEC_FORM_Val 0x2u /**< \brief (CAN_PSR) Form Error */ +#define CAN_PSR_LEC_ACK_Val 0x3u /**< \brief (CAN_PSR) Ack Error */ +#define CAN_PSR_LEC_BIT1_Val 0x4u /**< \brief (CAN_PSR) Bit1 Error */ +#define CAN_PSR_LEC_BIT0_Val 0x5u /**< \brief (CAN_PSR) Bit0 Error */ +#define CAN_PSR_LEC_CRC_Val 0x6u /**< \brief (CAN_PSR) CRC Error */ +#define CAN_PSR_LEC_NC_Val 0x7u /**< \brief (CAN_PSR) No Change */ +#define CAN_PSR_LEC_NONE (CAN_PSR_LEC_NONE_Val << CAN_PSR_LEC_Pos) +#define CAN_PSR_LEC_STUFF (CAN_PSR_LEC_STUFF_Val << CAN_PSR_LEC_Pos) +#define CAN_PSR_LEC_FORM (CAN_PSR_LEC_FORM_Val << CAN_PSR_LEC_Pos) +#define CAN_PSR_LEC_ACK (CAN_PSR_LEC_ACK_Val << CAN_PSR_LEC_Pos) +#define CAN_PSR_LEC_BIT1 (CAN_PSR_LEC_BIT1_Val << CAN_PSR_LEC_Pos) +#define CAN_PSR_LEC_BIT0 (CAN_PSR_LEC_BIT0_Val << CAN_PSR_LEC_Pos) +#define CAN_PSR_LEC_CRC (CAN_PSR_LEC_CRC_Val << CAN_PSR_LEC_Pos) +#define CAN_PSR_LEC_NC (CAN_PSR_LEC_NC_Val << CAN_PSR_LEC_Pos) +#define CAN_PSR_ACT_Pos 3 /**< \brief (CAN_PSR) Activity */ +#define CAN_PSR_ACT_Msk (0x3u << CAN_PSR_ACT_Pos) +#define CAN_PSR_ACT(value) (CAN_PSR_ACT_Msk & ((value) << CAN_PSR_ACT_Pos)) +#define CAN_PSR_ACT_SYNC_Val 0x0u /**< \brief (CAN_PSR) Node is synchronizing on CAN communication */ +#define CAN_PSR_ACT_IDLE_Val 0x1u /**< \brief (CAN_PSR) Node is neither receiver nor transmitter */ +#define CAN_PSR_ACT_RX_Val 0x2u /**< \brief (CAN_PSR) Node is operating as receiver */ +#define CAN_PSR_ACT_TX_Val 0x3u /**< \brief (CAN_PSR) Node is operating as transmitter */ +#define CAN_PSR_ACT_SYNC (CAN_PSR_ACT_SYNC_Val << CAN_PSR_ACT_Pos) +#define CAN_PSR_ACT_IDLE (CAN_PSR_ACT_IDLE_Val << CAN_PSR_ACT_Pos) +#define CAN_PSR_ACT_RX (CAN_PSR_ACT_RX_Val << CAN_PSR_ACT_Pos) +#define CAN_PSR_ACT_TX (CAN_PSR_ACT_TX_Val << CAN_PSR_ACT_Pos) +#define CAN_PSR_EP_Pos 5 /**< \brief (CAN_PSR) Error Passive */ +#define CAN_PSR_EP (0x1u << CAN_PSR_EP_Pos) +#define CAN_PSR_EW_Pos 6 /**< \brief (CAN_PSR) Warning Status */ +#define CAN_PSR_EW (0x1u << CAN_PSR_EW_Pos) +#define CAN_PSR_BO_Pos 7 /**< \brief (CAN_PSR) Bus_Off Status */ +#define CAN_PSR_BO (0x1u << CAN_PSR_BO_Pos) +#define CAN_PSR_DLEC_Pos 8 /**< \brief (CAN_PSR) Data Phase Last Error Code */ +#define CAN_PSR_DLEC_Msk (0x7u << CAN_PSR_DLEC_Pos) +#define CAN_PSR_DLEC(value) (CAN_PSR_DLEC_Msk & ((value) << CAN_PSR_DLEC_Pos)) +#define CAN_PSR_DLEC_NONE_Val 0x0u /**< \brief (CAN_PSR) No Error */ +#define CAN_PSR_DLEC_STUFF_Val 0x1u /**< \brief (CAN_PSR) Stuff Error */ +#define CAN_PSR_DLEC_FORM_Val 0x2u /**< \brief (CAN_PSR) Form Error */ +#define CAN_PSR_DLEC_ACK_Val 0x3u /**< \brief (CAN_PSR) Ack Error */ +#define CAN_PSR_DLEC_BIT1_Val 0x4u /**< \brief (CAN_PSR) Bit1 Error */ +#define CAN_PSR_DLEC_BIT0_Val 0x5u /**< \brief (CAN_PSR) Bit0 Error */ +#define CAN_PSR_DLEC_CRC_Val 0x6u /**< \brief (CAN_PSR) CRC Error */ +#define CAN_PSR_DLEC_NC_Val 0x7u /**< \brief (CAN_PSR) No Change */ +#define CAN_PSR_DLEC_NONE (CAN_PSR_DLEC_NONE_Val << CAN_PSR_DLEC_Pos) +#define CAN_PSR_DLEC_STUFF (CAN_PSR_DLEC_STUFF_Val << CAN_PSR_DLEC_Pos) +#define CAN_PSR_DLEC_FORM (CAN_PSR_DLEC_FORM_Val << CAN_PSR_DLEC_Pos) +#define CAN_PSR_DLEC_ACK (CAN_PSR_DLEC_ACK_Val << CAN_PSR_DLEC_Pos) +#define CAN_PSR_DLEC_BIT1 (CAN_PSR_DLEC_BIT1_Val << CAN_PSR_DLEC_Pos) +#define CAN_PSR_DLEC_BIT0 (CAN_PSR_DLEC_BIT0_Val << CAN_PSR_DLEC_Pos) +#define CAN_PSR_DLEC_CRC (CAN_PSR_DLEC_CRC_Val << CAN_PSR_DLEC_Pos) +#define CAN_PSR_DLEC_NC (CAN_PSR_DLEC_NC_Val << CAN_PSR_DLEC_Pos) +#define CAN_PSR_RESI_Pos 11 /**< \brief (CAN_PSR) ESI flag of last received CAN FD Message */ +#define CAN_PSR_RESI (0x1u << CAN_PSR_RESI_Pos) +#define CAN_PSR_RBRS_Pos 12 /**< \brief (CAN_PSR) BRS flag of last received CAN FD Message */ +#define CAN_PSR_RBRS (0x1u << CAN_PSR_RBRS_Pos) +#define CAN_PSR_RFDF_Pos 13 /**< \brief (CAN_PSR) Received a CAN FD Message */ +#define CAN_PSR_RFDF (0x1u << CAN_PSR_RFDF_Pos) +#define CAN_PSR_PXE_Pos 14 /**< \brief (CAN_PSR) Protocol Exception Event */ +#define CAN_PSR_PXE (0x1u << CAN_PSR_PXE_Pos) +#define CAN_PSR_TDCV_Pos 16 /**< \brief (CAN_PSR) Transmitter Delay Compensation Value */ +#define CAN_PSR_TDCV_Msk (0x7Fu << CAN_PSR_TDCV_Pos) +#define CAN_PSR_TDCV(value) (CAN_PSR_TDCV_Msk & ((value) << CAN_PSR_TDCV_Pos)) +#define CAN_PSR_MASK 0x007F7FFFu /**< \brief (CAN_PSR) MASK Register */ + +/* -------- CAN_TDCR : (CAN Offset: 0x48) (R/W 32) Extended ID Filter Configuration -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t TDCF:7; /*!< bit: 0.. 6 Transmitter Delay Compensation Filter Length */ + uint32_t :1; /*!< bit: 7 Reserved */ + uint32_t TDCO:7; /*!< bit: 8..14 Transmitter Delay Compensation Offset */ + uint32_t :17; /*!< bit: 15..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_TDCR_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_TDCR_OFFSET 0x48 /**< \brief (CAN_TDCR offset) Extended ID Filter Configuration */ +#define CAN_TDCR_RESETVALUE 0x00000000u /**< \brief (CAN_TDCR reset_value) Extended ID Filter Configuration */ + +#define CAN_TDCR_TDCF_Pos 0 /**< \brief (CAN_TDCR) Transmitter Delay Compensation Filter Length */ +#define CAN_TDCR_TDCF_Msk (0x7Fu << CAN_TDCR_TDCF_Pos) +#define CAN_TDCR_TDCF(value) (CAN_TDCR_TDCF_Msk & ((value) << CAN_TDCR_TDCF_Pos)) +#define CAN_TDCR_TDCO_Pos 8 /**< \brief (CAN_TDCR) Transmitter Delay Compensation Offset */ +#define CAN_TDCR_TDCO_Msk (0x7Fu << CAN_TDCR_TDCO_Pos) +#define CAN_TDCR_TDCO(value) (CAN_TDCR_TDCO_Msk & ((value) << CAN_TDCR_TDCO_Pos)) +#define CAN_TDCR_MASK 0x00007F7Fu /**< \brief (CAN_TDCR) MASK Register */ + +/* -------- CAN_IR : (CAN Offset: 0x50) (R/W 32) Interrupt -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t RF0N:1; /*!< bit: 0 Rx FIFO 0 New Message */ + uint32_t RF0W:1; /*!< bit: 1 Rx FIFO 0 Watermark Reached */ + uint32_t RF0F:1; /*!< bit: 2 Rx FIFO 0 Full */ + uint32_t RF0L:1; /*!< bit: 3 Rx FIFO 0 Message Lost */ + uint32_t RF1N:1; /*!< bit: 4 Rx FIFO 1 New Message */ + uint32_t RF1W:1; /*!< bit: 5 Rx FIFO 1 Watermark Reached */ + uint32_t RF1F:1; /*!< bit: 6 Rx FIFO 1 FIFO Full */ + uint32_t RF1L:1; /*!< bit: 7 Rx FIFO 1 Message Lost */ + uint32_t HPM:1; /*!< bit: 8 High Priority Message */ + uint32_t TC:1; /*!< bit: 9 Timestamp Completed */ + uint32_t TCF:1; /*!< bit: 10 Transmission Cancellation Finished */ + uint32_t TFE:1; /*!< bit: 11 Tx FIFO Empty */ + uint32_t TEFN:1; /*!< bit: 12 Tx Event FIFO New Entry */ + uint32_t TEFW:1; /*!< bit: 13 Tx Event FIFO Watermark Reached */ + uint32_t TEFF:1; /*!< bit: 14 Tx Event FIFO Full */ + uint32_t TEFL:1; /*!< bit: 15 Tx Event FIFO Element Lost */ + uint32_t TSW:1; /*!< bit: 16 Timestamp Wraparound */ + uint32_t MRAF:1; /*!< bit: 17 Message RAM Access Failure */ + uint32_t TOO:1; /*!< bit: 18 Timeout Occurred */ + uint32_t DRX:1; /*!< bit: 19 Message stored to Dedicated Rx Buffer */ + uint32_t BEC:1; /*!< bit: 20 Bit Error Corrected */ + uint32_t BEU:1; /*!< bit: 21 Bit Error Uncorrected */ + uint32_t ELO:1; /*!< bit: 22 Error Logging Overflow */ + uint32_t EP:1; /*!< bit: 23 Error Passive */ + uint32_t EW:1; /*!< bit: 24 Warning Status */ + uint32_t BO:1; /*!< bit: 25 Bus_Off Status */ + uint32_t WDI:1; /*!< bit: 26 Watchdog Interrupt */ + uint32_t PEA:1; /*!< bit: 27 Protocol Error in Arbitration Phase */ + uint32_t PED:1; /*!< bit: 28 Protocol Error in Data Phase */ + uint32_t ARA:1; /*!< bit: 29 Access to Reserved Address */ + uint32_t :2; /*!< bit: 30..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_IR_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_IR_OFFSET 0x50 /**< \brief (CAN_IR offset) Interrupt */ +#define CAN_IR_RESETVALUE 0x00000000u /**< \brief (CAN_IR reset_value) Interrupt */ + +#define CAN_IR_RF0N_Pos 0 /**< \brief (CAN_IR) Rx FIFO 0 New Message */ +#define CAN_IR_RF0N (0x1u << CAN_IR_RF0N_Pos) +#define CAN_IR_RF0W_Pos 1 /**< \brief (CAN_IR) Rx FIFO 0 Watermark Reached */ +#define CAN_IR_RF0W (0x1u << CAN_IR_RF0W_Pos) +#define CAN_IR_RF0F_Pos 2 /**< \brief (CAN_IR) Rx FIFO 0 Full */ +#define CAN_IR_RF0F (0x1u << CAN_IR_RF0F_Pos) +#define CAN_IR_RF0L_Pos 3 /**< \brief (CAN_IR) Rx FIFO 0 Message Lost */ +#define CAN_IR_RF0L (0x1u << CAN_IR_RF0L_Pos) +#define CAN_IR_RF1N_Pos 4 /**< \brief (CAN_IR) Rx FIFO 1 New Message */ +#define CAN_IR_RF1N (0x1u << CAN_IR_RF1N_Pos) +#define CAN_IR_RF1W_Pos 5 /**< \brief (CAN_IR) Rx FIFO 1 Watermark Reached */ +#define CAN_IR_RF1W (0x1u << CAN_IR_RF1W_Pos) +#define CAN_IR_RF1F_Pos 6 /**< \brief (CAN_IR) Rx FIFO 1 FIFO Full */ +#define CAN_IR_RF1F (0x1u << CAN_IR_RF1F_Pos) +#define CAN_IR_RF1L_Pos 7 /**< \brief (CAN_IR) Rx FIFO 1 Message Lost */ +#define CAN_IR_RF1L (0x1u << CAN_IR_RF1L_Pos) +#define CAN_IR_HPM_Pos 8 /**< \brief (CAN_IR) High Priority Message */ +#define CAN_IR_HPM (0x1u << CAN_IR_HPM_Pos) +#define CAN_IR_TC_Pos 9 /**< \brief (CAN_IR) Timestamp Completed */ +#define CAN_IR_TC (0x1u << CAN_IR_TC_Pos) +#define CAN_IR_TCF_Pos 10 /**< \brief (CAN_IR) Transmission Cancellation Finished */ +#define CAN_IR_TCF (0x1u << CAN_IR_TCF_Pos) +#define CAN_IR_TFE_Pos 11 /**< \brief (CAN_IR) Tx FIFO Empty */ +#define CAN_IR_TFE (0x1u << CAN_IR_TFE_Pos) +#define CAN_IR_TEFN_Pos 12 /**< \brief (CAN_IR) Tx Event FIFO New Entry */ +#define CAN_IR_TEFN (0x1u << CAN_IR_TEFN_Pos) +#define CAN_IR_TEFW_Pos 13 /**< \brief (CAN_IR) Tx Event FIFO Watermark Reached */ +#define CAN_IR_TEFW (0x1u << CAN_IR_TEFW_Pos) +#define CAN_IR_TEFF_Pos 14 /**< \brief (CAN_IR) Tx Event FIFO Full */ +#define CAN_IR_TEFF (0x1u << CAN_IR_TEFF_Pos) +#define CAN_IR_TEFL_Pos 15 /**< \brief (CAN_IR) Tx Event FIFO Element Lost */ +#define CAN_IR_TEFL (0x1u << CAN_IR_TEFL_Pos) +#define CAN_IR_TSW_Pos 16 /**< \brief (CAN_IR) Timestamp Wraparound */ +#define CAN_IR_TSW (0x1u << CAN_IR_TSW_Pos) +#define CAN_IR_MRAF_Pos 17 /**< \brief (CAN_IR) Message RAM Access Failure */ +#define CAN_IR_MRAF (0x1u << CAN_IR_MRAF_Pos) +#define CAN_IR_TOO_Pos 18 /**< \brief (CAN_IR) Timeout Occurred */ +#define CAN_IR_TOO (0x1u << CAN_IR_TOO_Pos) +#define CAN_IR_DRX_Pos 19 /**< \brief (CAN_IR) Message stored to Dedicated Rx Buffer */ +#define CAN_IR_DRX (0x1u << CAN_IR_DRX_Pos) +#define CAN_IR_BEC_Pos 20 /**< \brief (CAN_IR) Bit Error Corrected */ +#define CAN_IR_BEC (0x1u << CAN_IR_BEC_Pos) +#define CAN_IR_BEU_Pos 21 /**< \brief (CAN_IR) Bit Error Uncorrected */ +#define CAN_IR_BEU (0x1u << CAN_IR_BEU_Pos) +#define CAN_IR_ELO_Pos 22 /**< \brief (CAN_IR) Error Logging Overflow */ +#define CAN_IR_ELO (0x1u << CAN_IR_ELO_Pos) +#define CAN_IR_EP_Pos 23 /**< \brief (CAN_IR) Error Passive */ +#define CAN_IR_EP (0x1u << CAN_IR_EP_Pos) +#define CAN_IR_EW_Pos 24 /**< \brief (CAN_IR) Warning Status */ +#define CAN_IR_EW (0x1u << CAN_IR_EW_Pos) +#define CAN_IR_BO_Pos 25 /**< \brief (CAN_IR) Bus_Off Status */ +#define CAN_IR_BO (0x1u << CAN_IR_BO_Pos) +#define CAN_IR_WDI_Pos 26 /**< \brief (CAN_IR) Watchdog Interrupt */ +#define CAN_IR_WDI (0x1u << CAN_IR_WDI_Pos) +#define CAN_IR_PEA_Pos 27 /**< \brief (CAN_IR) Protocol Error in Arbitration Phase */ +#define CAN_IR_PEA (0x1u << CAN_IR_PEA_Pos) +#define CAN_IR_PED_Pos 28 /**< \brief (CAN_IR) Protocol Error in Data Phase */ +#define CAN_IR_PED (0x1u << CAN_IR_PED_Pos) +#define CAN_IR_ARA_Pos 29 /**< \brief (CAN_IR) Access to Reserved Address */ +#define CAN_IR_ARA (0x1u << CAN_IR_ARA_Pos) +#define CAN_IR_MASK 0x3FFFFFFFu /**< \brief (CAN_IR) MASK Register */ + +/* -------- CAN_IE : (CAN Offset: 0x54) (R/W 32) Interrupt Enable -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t RF0NE:1; /*!< bit: 0 Rx FIFO 0 New Message Interrupt Enable */ + uint32_t RF0WE:1; /*!< bit: 1 Rx FIFO 0 Watermark Reached Interrupt Enable */ + uint32_t RF0FE:1; /*!< bit: 2 Rx FIFO 0 Full Interrupt Enable */ + uint32_t RF0LE:1; /*!< bit: 3 Rx FIFO 0 Message Lost Interrupt Enable */ + uint32_t RF1NE:1; /*!< bit: 4 Rx FIFO 1 New Message Interrupt Enable */ + uint32_t RF1WE:1; /*!< bit: 5 Rx FIFO 1 Watermark Reached Interrupt Enable */ + uint32_t RF1FE:1; /*!< bit: 6 Rx FIFO 1 FIFO Full Interrupt Enable */ + uint32_t RF1LE:1; /*!< bit: 7 Rx FIFO 1 Message Lost Interrupt Enable */ + uint32_t HPME:1; /*!< bit: 8 High Priority Message Interrupt Enable */ + uint32_t TCE:1; /*!< bit: 9 Timestamp Completed Interrupt Enable */ + uint32_t TCFE:1; /*!< bit: 10 Transmission Cancellation Finished Interrupt Enable */ + uint32_t TFEE:1; /*!< bit: 11 Tx FIFO Empty Interrupt Enable */ + uint32_t TEFNE:1; /*!< bit: 12 Tx Event FIFO New Entry Interrupt Enable */ + uint32_t TEFWE:1; /*!< bit: 13 Tx Event FIFO Watermark Reached Interrupt Enable */ + uint32_t TEFFE:1; /*!< bit: 14 Tx Event FIFO Full Interrupt Enable */ + uint32_t TEFLE:1; /*!< bit: 15 Tx Event FIFO Element Lost Interrupt Enable */ + uint32_t TSWE:1; /*!< bit: 16 Timestamp Wraparound Interrupt Enable */ + uint32_t MRAFE:1; /*!< bit: 17 Message RAM Access Failure Interrupt Enable */ + uint32_t TOOE:1; /*!< bit: 18 Timeout Occurred Interrupt Enable */ + uint32_t DRXE:1; /*!< bit: 19 Message stored to Dedicated Rx Buffer Interrupt Enable */ + uint32_t BECE:1; /*!< bit: 20 Bit Error Corrected Interrupt Enable */ + uint32_t BEUE:1; /*!< bit: 21 Bit Error Uncorrected Interrupt Enable */ + uint32_t ELOE:1; /*!< bit: 22 Error Logging Overflow Interrupt Enable */ + uint32_t EPE:1; /*!< bit: 23 Error Passive Interrupt Enable */ + uint32_t EWE:1; /*!< bit: 24 Warning Status Interrupt Enable */ + uint32_t BOE:1; /*!< bit: 25 Bus_Off Status Interrupt Enable */ + uint32_t WDIE:1; /*!< bit: 26 Watchdog Interrupt Interrupt Enable */ + uint32_t PEAE:1; /*!< bit: 27 Protocol Error in Arbitration Phase Enable */ + uint32_t PEDE:1; /*!< bit: 28 Protocol Error in Data Phase Enable */ + uint32_t ARAE:1; /*!< bit: 29 Access to Reserved Address Enable */ + uint32_t :2; /*!< bit: 30..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_IE_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_IE_OFFSET 0x54 /**< \brief (CAN_IE offset) Interrupt Enable */ +#define CAN_IE_RESETVALUE 0x00000000u /**< \brief (CAN_IE reset_value) Interrupt Enable */ + +#define CAN_IE_RF0NE_Pos 0 /**< \brief (CAN_IE) Rx FIFO 0 New Message Interrupt Enable */ +#define CAN_IE_RF0NE (0x1u << CAN_IE_RF0NE_Pos) +#define CAN_IE_RF0WE_Pos 1 /**< \brief (CAN_IE) Rx FIFO 0 Watermark Reached Interrupt Enable */ +#define CAN_IE_RF0WE (0x1u << CAN_IE_RF0WE_Pos) +#define CAN_IE_RF0FE_Pos 2 /**< \brief (CAN_IE) Rx FIFO 0 Full Interrupt Enable */ +#define CAN_IE_RF0FE (0x1u << CAN_IE_RF0FE_Pos) +#define CAN_IE_RF0LE_Pos 3 /**< \brief (CAN_IE) Rx FIFO 0 Message Lost Interrupt Enable */ +#define CAN_IE_RF0LE (0x1u << CAN_IE_RF0LE_Pos) +#define CAN_IE_RF1NE_Pos 4 /**< \brief (CAN_IE) Rx FIFO 1 New Message Interrupt Enable */ +#define CAN_IE_RF1NE (0x1u << CAN_IE_RF1NE_Pos) +#define CAN_IE_RF1WE_Pos 5 /**< \brief (CAN_IE) Rx FIFO 1 Watermark Reached Interrupt Enable */ +#define CAN_IE_RF1WE (0x1u << CAN_IE_RF1WE_Pos) +#define CAN_IE_RF1FE_Pos 6 /**< \brief (CAN_IE) Rx FIFO 1 FIFO Full Interrupt Enable */ +#define CAN_IE_RF1FE (0x1u << CAN_IE_RF1FE_Pos) +#define CAN_IE_RF1LE_Pos 7 /**< \brief (CAN_IE) Rx FIFO 1 Message Lost Interrupt Enable */ +#define CAN_IE_RF1LE (0x1u << CAN_IE_RF1LE_Pos) +#define CAN_IE_HPME_Pos 8 /**< \brief (CAN_IE) High Priority Message Interrupt Enable */ +#define CAN_IE_HPME (0x1u << CAN_IE_HPME_Pos) +#define CAN_IE_TCE_Pos 9 /**< \brief (CAN_IE) Timestamp Completed Interrupt Enable */ +#define CAN_IE_TCE (0x1u << CAN_IE_TCE_Pos) +#define CAN_IE_TCFE_Pos 10 /**< \brief (CAN_IE) Transmission Cancellation Finished Interrupt Enable */ +#define CAN_IE_TCFE (0x1u << CAN_IE_TCFE_Pos) +#define CAN_IE_TFEE_Pos 11 /**< \brief (CAN_IE) Tx FIFO Empty Interrupt Enable */ +#define CAN_IE_TFEE (0x1u << CAN_IE_TFEE_Pos) +#define CAN_IE_TEFNE_Pos 12 /**< \brief (CAN_IE) Tx Event FIFO New Entry Interrupt Enable */ +#define CAN_IE_TEFNE (0x1u << CAN_IE_TEFNE_Pos) +#define CAN_IE_TEFWE_Pos 13 /**< \brief (CAN_IE) Tx Event FIFO Watermark Reached Interrupt Enable */ +#define CAN_IE_TEFWE (0x1u << CAN_IE_TEFWE_Pos) +#define CAN_IE_TEFFE_Pos 14 /**< \brief (CAN_IE) Tx Event FIFO Full Interrupt Enable */ +#define CAN_IE_TEFFE (0x1u << CAN_IE_TEFFE_Pos) +#define CAN_IE_TEFLE_Pos 15 /**< \brief (CAN_IE) Tx Event FIFO Element Lost Interrupt Enable */ +#define CAN_IE_TEFLE (0x1u << CAN_IE_TEFLE_Pos) +#define CAN_IE_TSWE_Pos 16 /**< \brief (CAN_IE) Timestamp Wraparound Interrupt Enable */ +#define CAN_IE_TSWE (0x1u << CAN_IE_TSWE_Pos) +#define CAN_IE_MRAFE_Pos 17 /**< \brief (CAN_IE) Message RAM Access Failure Interrupt Enable */ +#define CAN_IE_MRAFE (0x1u << CAN_IE_MRAFE_Pos) +#define CAN_IE_TOOE_Pos 18 /**< \brief (CAN_IE) Timeout Occurred Interrupt Enable */ +#define CAN_IE_TOOE (0x1u << CAN_IE_TOOE_Pos) +#define CAN_IE_DRXE_Pos 19 /**< \brief (CAN_IE) Message stored to Dedicated Rx Buffer Interrupt Enable */ +#define CAN_IE_DRXE (0x1u << CAN_IE_DRXE_Pos) +#define CAN_IE_BECE_Pos 20 /**< \brief (CAN_IE) Bit Error Corrected Interrupt Enable */ +#define CAN_IE_BECE (0x1u << CAN_IE_BECE_Pos) +#define CAN_IE_BEUE_Pos 21 /**< \brief (CAN_IE) Bit Error Uncorrected Interrupt Enable */ +#define CAN_IE_BEUE (0x1u << CAN_IE_BEUE_Pos) +#define CAN_IE_ELOE_Pos 22 /**< \brief (CAN_IE) Error Logging Overflow Interrupt Enable */ +#define CAN_IE_ELOE (0x1u << CAN_IE_ELOE_Pos) +#define CAN_IE_EPE_Pos 23 /**< \brief (CAN_IE) Error Passive Interrupt Enable */ +#define CAN_IE_EPE (0x1u << CAN_IE_EPE_Pos) +#define CAN_IE_EWE_Pos 24 /**< \brief (CAN_IE) Warning Status Interrupt Enable */ +#define CAN_IE_EWE (0x1u << CAN_IE_EWE_Pos) +#define CAN_IE_BOE_Pos 25 /**< \brief (CAN_IE) Bus_Off Status Interrupt Enable */ +#define CAN_IE_BOE (0x1u << CAN_IE_BOE_Pos) +#define CAN_IE_WDIE_Pos 26 /**< \brief (CAN_IE) Watchdog Interrupt Interrupt Enable */ +#define CAN_IE_WDIE (0x1u << CAN_IE_WDIE_Pos) +#define CAN_IE_PEAE_Pos 27 /**< \brief (CAN_IE) Protocol Error in Arbitration Phase Enable */ +#define CAN_IE_PEAE (0x1u << CAN_IE_PEAE_Pos) +#define CAN_IE_PEDE_Pos 28 /**< \brief (CAN_IE) Protocol Error in Data Phase Enable */ +#define CAN_IE_PEDE (0x1u << CAN_IE_PEDE_Pos) +#define CAN_IE_ARAE_Pos 29 /**< \brief (CAN_IE) Access to Reserved Address Enable */ +#define CAN_IE_ARAE (0x1u << CAN_IE_ARAE_Pos) +#define CAN_IE_MASK 0x3FFFFFFFu /**< \brief (CAN_IE) MASK Register */ + +/* -------- CAN_ILS : (CAN Offset: 0x58) (R/W 32) Interrupt Line Select -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t RF0NL:1; /*!< bit: 0 Rx FIFO 0 New Message Interrupt Line */ + uint32_t RF0WL:1; /*!< bit: 1 Rx FIFO 0 Watermark Reached Interrupt Line */ + uint32_t RF0FL:1; /*!< bit: 2 Rx FIFO 0 Full Interrupt Line */ + uint32_t RF0LL:1; /*!< bit: 3 Rx FIFO 0 Message Lost Interrupt Line */ + uint32_t RF1NL:1; /*!< bit: 4 Rx FIFO 1 New Message Interrupt Line */ + uint32_t RF1WL:1; /*!< bit: 5 Rx FIFO 1 Watermark Reached Interrupt Line */ + uint32_t RF1FL:1; /*!< bit: 6 Rx FIFO 1 FIFO Full Interrupt Line */ + uint32_t RF1LL:1; /*!< bit: 7 Rx FIFO 1 Message Lost Interrupt Line */ + uint32_t HPML:1; /*!< bit: 8 High Priority Message Interrupt Line */ + uint32_t TCL:1; /*!< bit: 9 Timestamp Completed Interrupt Line */ + uint32_t TCFL:1; /*!< bit: 10 Transmission Cancellation Finished Interrupt Line */ + uint32_t TFEL:1; /*!< bit: 11 Tx FIFO Empty Interrupt Line */ + uint32_t TEFNL:1; /*!< bit: 12 Tx Event FIFO New Entry Interrupt Line */ + uint32_t TEFWL:1; /*!< bit: 13 Tx Event FIFO Watermark Reached Interrupt Line */ + uint32_t TEFFL:1; /*!< bit: 14 Tx Event FIFO Full Interrupt Line */ + uint32_t TEFLL:1; /*!< bit: 15 Tx Event FIFO Element Lost Interrupt Line */ + uint32_t TSWL:1; /*!< bit: 16 Timestamp Wraparound Interrupt Line */ + uint32_t MRAFL:1; /*!< bit: 17 Message RAM Access Failure Interrupt Line */ + uint32_t TOOL:1; /*!< bit: 18 Timeout Occurred Interrupt Line */ + uint32_t DRXL:1; /*!< bit: 19 Message stored to Dedicated Rx Buffer Interrupt Line */ + uint32_t BECL:1; /*!< bit: 20 Bit Error Corrected Interrupt Line */ + uint32_t BEUL:1; /*!< bit: 21 Bit Error Uncorrected Interrupt Line */ + uint32_t ELOL:1; /*!< bit: 22 Error Logging Overflow Interrupt Line */ + uint32_t EPL:1; /*!< bit: 23 Error Passive Interrupt Line */ + uint32_t EWL:1; /*!< bit: 24 Warning Status Interrupt Line */ + uint32_t BOL:1; /*!< bit: 25 Bus_Off Status Interrupt Line */ + uint32_t WDIL:1; /*!< bit: 26 Watchdog Interrupt Interrupt Line */ + uint32_t PEAL:1; /*!< bit: 27 Protocol Error in Arbitration Phase Line */ + uint32_t PEDL:1; /*!< bit: 28 Protocol Error in Data Phase Line */ + uint32_t ARAL:1; /*!< bit: 29 Access to Reserved Address Line */ + uint32_t :2; /*!< bit: 30..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_ILS_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_ILS_OFFSET 0x58 /**< \brief (CAN_ILS offset) Interrupt Line Select */ +#define CAN_ILS_RESETVALUE 0x00000000u /**< \brief (CAN_ILS reset_value) Interrupt Line Select */ + +#define CAN_ILS_RF0NL_Pos 0 /**< \brief (CAN_ILS) Rx FIFO 0 New Message Interrupt Line */ +#define CAN_ILS_RF0NL (0x1u << CAN_ILS_RF0NL_Pos) +#define CAN_ILS_RF0WL_Pos 1 /**< \brief (CAN_ILS) Rx FIFO 0 Watermark Reached Interrupt Line */ +#define CAN_ILS_RF0WL (0x1u << CAN_ILS_RF0WL_Pos) +#define CAN_ILS_RF0FL_Pos 2 /**< \brief (CAN_ILS) Rx FIFO 0 Full Interrupt Line */ +#define CAN_ILS_RF0FL (0x1u << CAN_ILS_RF0FL_Pos) +#define CAN_ILS_RF0LL_Pos 3 /**< \brief (CAN_ILS) Rx FIFO 0 Message Lost Interrupt Line */ +#define CAN_ILS_RF0LL (0x1u << CAN_ILS_RF0LL_Pos) +#define CAN_ILS_RF1NL_Pos 4 /**< \brief (CAN_ILS) Rx FIFO 1 New Message Interrupt Line */ +#define CAN_ILS_RF1NL (0x1u << CAN_ILS_RF1NL_Pos) +#define CAN_ILS_RF1WL_Pos 5 /**< \brief (CAN_ILS) Rx FIFO 1 Watermark Reached Interrupt Line */ +#define CAN_ILS_RF1WL (0x1u << CAN_ILS_RF1WL_Pos) +#define CAN_ILS_RF1FL_Pos 6 /**< \brief (CAN_ILS) Rx FIFO 1 FIFO Full Interrupt Line */ +#define CAN_ILS_RF1FL (0x1u << CAN_ILS_RF1FL_Pos) +#define CAN_ILS_RF1LL_Pos 7 /**< \brief (CAN_ILS) Rx FIFO 1 Message Lost Interrupt Line */ +#define CAN_ILS_RF1LL (0x1u << CAN_ILS_RF1LL_Pos) +#define CAN_ILS_HPML_Pos 8 /**< \brief (CAN_ILS) High Priority Message Interrupt Line */ +#define CAN_ILS_HPML (0x1u << CAN_ILS_HPML_Pos) +#define CAN_ILS_TCL_Pos 9 /**< \brief (CAN_ILS) Timestamp Completed Interrupt Line */ +#define CAN_ILS_TCL (0x1u << CAN_ILS_TCL_Pos) +#define CAN_ILS_TCFL_Pos 10 /**< \brief (CAN_ILS) Transmission Cancellation Finished Interrupt Line */ +#define CAN_ILS_TCFL (0x1u << CAN_ILS_TCFL_Pos) +#define CAN_ILS_TFEL_Pos 11 /**< \brief (CAN_ILS) Tx FIFO Empty Interrupt Line */ +#define CAN_ILS_TFEL (0x1u << CAN_ILS_TFEL_Pos) +#define CAN_ILS_TEFNL_Pos 12 /**< \brief (CAN_ILS) Tx Event FIFO New Entry Interrupt Line */ +#define CAN_ILS_TEFNL (0x1u << CAN_ILS_TEFNL_Pos) +#define CAN_ILS_TEFWL_Pos 13 /**< \brief (CAN_ILS) Tx Event FIFO Watermark Reached Interrupt Line */ +#define CAN_ILS_TEFWL (0x1u << CAN_ILS_TEFWL_Pos) +#define CAN_ILS_TEFFL_Pos 14 /**< \brief (CAN_ILS) Tx Event FIFO Full Interrupt Line */ +#define CAN_ILS_TEFFL (0x1u << CAN_ILS_TEFFL_Pos) +#define CAN_ILS_TEFLL_Pos 15 /**< \brief (CAN_ILS) Tx Event FIFO Element Lost Interrupt Line */ +#define CAN_ILS_TEFLL (0x1u << CAN_ILS_TEFLL_Pos) +#define CAN_ILS_TSWL_Pos 16 /**< \brief (CAN_ILS) Timestamp Wraparound Interrupt Line */ +#define CAN_ILS_TSWL (0x1u << CAN_ILS_TSWL_Pos) +#define CAN_ILS_MRAFL_Pos 17 /**< \brief (CAN_ILS) Message RAM Access Failure Interrupt Line */ +#define CAN_ILS_MRAFL (0x1u << CAN_ILS_MRAFL_Pos) +#define CAN_ILS_TOOL_Pos 18 /**< \brief (CAN_ILS) Timeout Occurred Interrupt Line */ +#define CAN_ILS_TOOL (0x1u << CAN_ILS_TOOL_Pos) +#define CAN_ILS_DRXL_Pos 19 /**< \brief (CAN_ILS) Message stored to Dedicated Rx Buffer Interrupt Line */ +#define CAN_ILS_DRXL (0x1u << CAN_ILS_DRXL_Pos) +#define CAN_ILS_BECL_Pos 20 /**< \brief (CAN_ILS) Bit Error Corrected Interrupt Line */ +#define CAN_ILS_BECL (0x1u << CAN_ILS_BECL_Pos) +#define CAN_ILS_BEUL_Pos 21 /**< \brief (CAN_ILS) Bit Error Uncorrected Interrupt Line */ +#define CAN_ILS_BEUL (0x1u << CAN_ILS_BEUL_Pos) +#define CAN_ILS_ELOL_Pos 22 /**< \brief (CAN_ILS) Error Logging Overflow Interrupt Line */ +#define CAN_ILS_ELOL (0x1u << CAN_ILS_ELOL_Pos) +#define CAN_ILS_EPL_Pos 23 /**< \brief (CAN_ILS) Error Passive Interrupt Line */ +#define CAN_ILS_EPL (0x1u << CAN_ILS_EPL_Pos) +#define CAN_ILS_EWL_Pos 24 /**< \brief (CAN_ILS) Warning Status Interrupt Line */ +#define CAN_ILS_EWL (0x1u << CAN_ILS_EWL_Pos) +#define CAN_ILS_BOL_Pos 25 /**< \brief (CAN_ILS) Bus_Off Status Interrupt Line */ +#define CAN_ILS_BOL (0x1u << CAN_ILS_BOL_Pos) +#define CAN_ILS_WDIL_Pos 26 /**< \brief (CAN_ILS) Watchdog Interrupt Interrupt Line */ +#define CAN_ILS_WDIL (0x1u << CAN_ILS_WDIL_Pos) +#define CAN_ILS_PEAL_Pos 27 /**< \brief (CAN_ILS) Protocol Error in Arbitration Phase Line */ +#define CAN_ILS_PEAL (0x1u << CAN_ILS_PEAL_Pos) +#define CAN_ILS_PEDL_Pos 28 /**< \brief (CAN_ILS) Protocol Error in Data Phase Line */ +#define CAN_ILS_PEDL (0x1u << CAN_ILS_PEDL_Pos) +#define CAN_ILS_ARAL_Pos 29 /**< \brief (CAN_ILS) Access to Reserved Address Line */ +#define CAN_ILS_ARAL (0x1u << CAN_ILS_ARAL_Pos) +#define CAN_ILS_MASK 0x3FFFFFFFu /**< \brief (CAN_ILS) MASK Register */ + +/* -------- CAN_ILE : (CAN Offset: 0x5C) (R/W 32) Interrupt Line Enable -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t EINT0:1; /*!< bit: 0 Enable Interrupt Line 0 */ + uint32_t EINT1:1; /*!< bit: 1 Enable Interrupt Line 1 */ + uint32_t :30; /*!< bit: 2..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_ILE_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_ILE_OFFSET 0x5C /**< \brief (CAN_ILE offset) Interrupt Line Enable */ +#define CAN_ILE_RESETVALUE 0x00000000u /**< \brief (CAN_ILE reset_value) Interrupt Line Enable */ + +#define CAN_ILE_EINT0_Pos 0 /**< \brief (CAN_ILE) Enable Interrupt Line 0 */ +#define CAN_ILE_EINT0 (0x1u << CAN_ILE_EINT0_Pos) +#define CAN_ILE_EINT1_Pos 1 /**< \brief (CAN_ILE) Enable Interrupt Line 1 */ +#define CAN_ILE_EINT1 (0x1u << CAN_ILE_EINT1_Pos) +#define CAN_ILE_MASK 0x00000003u /**< \brief (CAN_ILE) MASK Register */ + +/* -------- CAN_GFC : (CAN Offset: 0x80) (R/W 32) Global Filter Configuration -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t RRFE:1; /*!< bit: 0 Reject Remote Frames Extended */ + uint32_t RRFS:1; /*!< bit: 1 Reject Remote Frames Standard */ + uint32_t ANFE:2; /*!< bit: 2.. 3 Accept Non-matching Frames Extended */ + uint32_t ANFS:2; /*!< bit: 4.. 5 Accept Non-matching Frames Standard */ + uint32_t :26; /*!< bit: 6..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_GFC_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_GFC_OFFSET 0x80 /**< \brief (CAN_GFC offset) Global Filter Configuration */ +#define CAN_GFC_RESETVALUE 0x00000000u /**< \brief (CAN_GFC reset_value) Global Filter Configuration */ + +#define CAN_GFC_RRFE_Pos 0 /**< \brief (CAN_GFC) Reject Remote Frames Extended */ +#define CAN_GFC_RRFE (0x1u << CAN_GFC_RRFE_Pos) +#define CAN_GFC_RRFS_Pos 1 /**< \brief (CAN_GFC) Reject Remote Frames Standard */ +#define CAN_GFC_RRFS (0x1u << CAN_GFC_RRFS_Pos) +#define CAN_GFC_ANFE_Pos 2 /**< \brief (CAN_GFC) Accept Non-matching Frames Extended */ +#define CAN_GFC_ANFE_Msk (0x3u << CAN_GFC_ANFE_Pos) +#define CAN_GFC_ANFE(value) (CAN_GFC_ANFE_Msk & ((value) << CAN_GFC_ANFE_Pos)) +#define CAN_GFC_ANFE_RXF0_Val 0x0u /**< \brief (CAN_GFC) Accept in Rx FIFO 0 */ +#define CAN_GFC_ANFE_RXF1_Val 0x1u /**< \brief (CAN_GFC) Accept in Rx FIFO 1 */ +#define CAN_GFC_ANFE_REJECT_Val 0x2u /**< \brief (CAN_GFC) Reject */ +#define CAN_GFC_ANFE_RXF0 (CAN_GFC_ANFE_RXF0_Val << CAN_GFC_ANFE_Pos) +#define CAN_GFC_ANFE_RXF1 (CAN_GFC_ANFE_RXF1_Val << CAN_GFC_ANFE_Pos) +#define CAN_GFC_ANFE_REJECT (CAN_GFC_ANFE_REJECT_Val << CAN_GFC_ANFE_Pos) +#define CAN_GFC_ANFS_Pos 4 /**< \brief (CAN_GFC) Accept Non-matching Frames Standard */ +#define CAN_GFC_ANFS_Msk (0x3u << CAN_GFC_ANFS_Pos) +#define CAN_GFC_ANFS(value) (CAN_GFC_ANFS_Msk & ((value) << CAN_GFC_ANFS_Pos)) +#define CAN_GFC_ANFS_RXF0_Val 0x0u /**< \brief (CAN_GFC) Accept in Rx FIFO 0 */ +#define CAN_GFC_ANFS_RXF1_Val 0x1u /**< \brief (CAN_GFC) Accept in Rx FIFO 1 */ +#define CAN_GFC_ANFS_REJECT_Val 0x2u /**< \brief (CAN_GFC) Reject */ +#define CAN_GFC_ANFS_RXF0 (CAN_GFC_ANFS_RXF0_Val << CAN_GFC_ANFS_Pos) +#define CAN_GFC_ANFS_RXF1 (CAN_GFC_ANFS_RXF1_Val << CAN_GFC_ANFS_Pos) +#define CAN_GFC_ANFS_REJECT (CAN_GFC_ANFS_REJECT_Val << CAN_GFC_ANFS_Pos) +#define CAN_GFC_MASK 0x0000003Fu /**< \brief (CAN_GFC) MASK Register */ + +/* -------- CAN_SIDFC : (CAN Offset: 0x84) (R/W 32) Standard ID Filter Configuration -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t FLSSA:16; /*!< bit: 0..15 Filter List Standard Start Address */ + uint32_t LSS:8; /*!< bit: 16..23 List Size Standard */ + uint32_t :8; /*!< bit: 24..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_SIDFC_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_SIDFC_OFFSET 0x84 /**< \brief (CAN_SIDFC offset) Standard ID Filter Configuration */ +#define CAN_SIDFC_RESETVALUE 0x00000000u /**< \brief (CAN_SIDFC reset_value) Standard ID Filter Configuration */ + +#define CAN_SIDFC_FLSSA_Pos 0 /**< \brief (CAN_SIDFC) Filter List Standard Start Address */ +#define CAN_SIDFC_FLSSA_Msk (0xFFFFu << CAN_SIDFC_FLSSA_Pos) +#define CAN_SIDFC_FLSSA(value) (CAN_SIDFC_FLSSA_Msk & ((value) << CAN_SIDFC_FLSSA_Pos)) +#define CAN_SIDFC_LSS_Pos 16 /**< \brief (CAN_SIDFC) List Size Standard */ +#define CAN_SIDFC_LSS_Msk (0xFFu << CAN_SIDFC_LSS_Pos) +#define CAN_SIDFC_LSS(value) (CAN_SIDFC_LSS_Msk & ((value) << CAN_SIDFC_LSS_Pos)) +#define CAN_SIDFC_MASK 0x00FFFFFFu /**< \brief (CAN_SIDFC) MASK Register */ + +/* -------- CAN_XIDFC : (CAN Offset: 0x88) (R/W 32) Extended ID Filter Configuration -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t FLESA:16; /*!< bit: 0..15 Filter List Extended Start Address */ + uint32_t LSE:7; /*!< bit: 16..22 List Size Extended */ + uint32_t :9; /*!< bit: 23..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_XIDFC_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_XIDFC_OFFSET 0x88 /**< \brief (CAN_XIDFC offset) Extended ID Filter Configuration */ +#define CAN_XIDFC_RESETVALUE 0x00000000u /**< \brief (CAN_XIDFC reset_value) Extended ID Filter Configuration */ + +#define CAN_XIDFC_FLESA_Pos 0 /**< \brief (CAN_XIDFC) Filter List Extended Start Address */ +#define CAN_XIDFC_FLESA_Msk (0xFFFFu << CAN_XIDFC_FLESA_Pos) +#define CAN_XIDFC_FLESA(value) (CAN_XIDFC_FLESA_Msk & ((value) << CAN_XIDFC_FLESA_Pos)) +#define CAN_XIDFC_LSE_Pos 16 /**< \brief (CAN_XIDFC) List Size Extended */ +#define CAN_XIDFC_LSE_Msk (0x7Fu << CAN_XIDFC_LSE_Pos) +#define CAN_XIDFC_LSE(value) (CAN_XIDFC_LSE_Msk & ((value) << CAN_XIDFC_LSE_Pos)) +#define CAN_XIDFC_MASK 0x007FFFFFu /**< \brief (CAN_XIDFC) MASK Register */ + +/* -------- CAN_XIDAM : (CAN Offset: 0x90) (R/W 32) Extended ID AND Mask -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t EIDM:29; /*!< bit: 0..28 Extended ID Mask */ + uint32_t :3; /*!< bit: 29..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_XIDAM_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_XIDAM_OFFSET 0x90 /**< \brief (CAN_XIDAM offset) Extended ID AND Mask */ +#define CAN_XIDAM_RESETVALUE 0x1FFFFFFFu /**< \brief (CAN_XIDAM reset_value) Extended ID AND Mask */ + +#define CAN_XIDAM_EIDM_Pos 0 /**< \brief (CAN_XIDAM) Extended ID Mask */ +#define CAN_XIDAM_EIDM_Msk (0x1FFFFFFFu << CAN_XIDAM_EIDM_Pos) +#define CAN_XIDAM_EIDM(value) (CAN_XIDAM_EIDM_Msk & ((value) << CAN_XIDAM_EIDM_Pos)) +#define CAN_XIDAM_MASK 0x1FFFFFFFu /**< \brief (CAN_XIDAM) MASK Register */ + +/* -------- CAN_HPMS : (CAN Offset: 0x94) (R/ 32) High Priority Message Status -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t BIDX:6; /*!< bit: 0.. 5 Buffer Index */ + uint32_t MSI:2; /*!< bit: 6.. 7 Message Storage Indicator */ + uint32_t FIDX:7; /*!< bit: 8..14 Filter Index */ + uint32_t FLST:1; /*!< bit: 15 Filter List */ + uint32_t :16; /*!< bit: 16..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_HPMS_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_HPMS_OFFSET 0x94 /**< \brief (CAN_HPMS offset) High Priority Message Status */ +#define CAN_HPMS_RESETVALUE 0x00000000u /**< \brief (CAN_HPMS reset_value) High Priority Message Status */ + +#define CAN_HPMS_BIDX_Pos 0 /**< \brief (CAN_HPMS) Buffer Index */ +#define CAN_HPMS_BIDX_Msk (0x3Fu << CAN_HPMS_BIDX_Pos) +#define CAN_HPMS_BIDX(value) (CAN_HPMS_BIDX_Msk & ((value) << CAN_HPMS_BIDX_Pos)) +#define CAN_HPMS_MSI_Pos 6 /**< \brief (CAN_HPMS) Message Storage Indicator */ +#define CAN_HPMS_MSI_Msk (0x3u << CAN_HPMS_MSI_Pos) +#define CAN_HPMS_MSI(value) (CAN_HPMS_MSI_Msk & ((value) << CAN_HPMS_MSI_Pos)) +#define CAN_HPMS_MSI_NONE_Val 0x0u /**< \brief (CAN_HPMS) No FIFO selected */ +#define CAN_HPMS_MSI_LOST_Val 0x1u /**< \brief (CAN_HPMS) FIFO message lost */ +#define CAN_HPMS_MSI_FIFO0_Val 0x2u /**< \brief (CAN_HPMS) Message stored in FIFO 0 */ +#define CAN_HPMS_MSI_FIFO1_Val 0x3u /**< \brief (CAN_HPMS) Message stored in FIFO 1 */ +#define CAN_HPMS_MSI_NONE (CAN_HPMS_MSI_NONE_Val << CAN_HPMS_MSI_Pos) +#define CAN_HPMS_MSI_LOST (CAN_HPMS_MSI_LOST_Val << CAN_HPMS_MSI_Pos) +#define CAN_HPMS_MSI_FIFO0 (CAN_HPMS_MSI_FIFO0_Val << CAN_HPMS_MSI_Pos) +#define CAN_HPMS_MSI_FIFO1 (CAN_HPMS_MSI_FIFO1_Val << CAN_HPMS_MSI_Pos) +#define CAN_HPMS_FIDX_Pos 8 /**< \brief (CAN_HPMS) Filter Index */ +#define CAN_HPMS_FIDX_Msk (0x7Fu << CAN_HPMS_FIDX_Pos) +#define CAN_HPMS_FIDX(value) (CAN_HPMS_FIDX_Msk & ((value) << CAN_HPMS_FIDX_Pos)) +#define CAN_HPMS_FLST_Pos 15 /**< \brief (CAN_HPMS) Filter List */ +#define CAN_HPMS_FLST (0x1u << CAN_HPMS_FLST_Pos) +#define CAN_HPMS_MASK 0x0000FFFFu /**< \brief (CAN_HPMS) MASK Register */ + +/* -------- CAN_NDAT1 : (CAN Offset: 0x98) (R/W 32) New Data 1 -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t ND0:1; /*!< bit: 0 New Data 0 */ + uint32_t ND1:1; /*!< bit: 1 New Data 1 */ + uint32_t ND2:1; /*!< bit: 2 New Data 2 */ + uint32_t ND3:1; /*!< bit: 3 New Data 3 */ + uint32_t ND4:1; /*!< bit: 4 New Data 4 */ + uint32_t ND5:1; /*!< bit: 5 New Data 5 */ + uint32_t ND6:1; /*!< bit: 6 New Data 6 */ + uint32_t ND7:1; /*!< bit: 7 New Data 7 */ + uint32_t ND8:1; /*!< bit: 8 New Data 8 */ + uint32_t ND9:1; /*!< bit: 9 New Data 9 */ + uint32_t ND10:1; /*!< bit: 10 New Data 10 */ + uint32_t ND11:1; /*!< bit: 11 New Data 11 */ + uint32_t ND12:1; /*!< bit: 12 New Data 12 */ + uint32_t ND13:1; /*!< bit: 13 New Data 13 */ + uint32_t ND14:1; /*!< bit: 14 New Data 14 */ + uint32_t ND15:1; /*!< bit: 15 New Data 15 */ + uint32_t ND16:1; /*!< bit: 16 New Data 16 */ + uint32_t ND17:1; /*!< bit: 17 New Data 17 */ + uint32_t ND18:1; /*!< bit: 18 New Data 18 */ + uint32_t ND19:1; /*!< bit: 19 New Data 19 */ + uint32_t ND20:1; /*!< bit: 20 New Data 20 */ + uint32_t ND21:1; /*!< bit: 21 New Data 21 */ + uint32_t ND22:1; /*!< bit: 22 New Data 22 */ + uint32_t ND23:1; /*!< bit: 23 New Data 23 */ + uint32_t ND24:1; /*!< bit: 24 New Data 24 */ + uint32_t ND25:1; /*!< bit: 25 New Data 25 */ + uint32_t ND26:1; /*!< bit: 26 New Data 26 */ + uint32_t ND27:1; /*!< bit: 27 New Data 27 */ + uint32_t ND28:1; /*!< bit: 28 New Data 28 */ + uint32_t ND29:1; /*!< bit: 29 New Data 29 */ + uint32_t ND30:1; /*!< bit: 30 New Data 30 */ + uint32_t ND31:1; /*!< bit: 31 New Data 31 */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_NDAT1_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_NDAT1_OFFSET 0x98 /**< \brief (CAN_NDAT1 offset) New Data 1 */ +#define CAN_NDAT1_RESETVALUE 0x00000000u /**< \brief (CAN_NDAT1 reset_value) New Data 1 */ + +#define CAN_NDAT1_ND0_Pos 0 /**< \brief (CAN_NDAT1) New Data 0 */ +#define CAN_NDAT1_ND0 (0x1u << CAN_NDAT1_ND0_Pos) +#define CAN_NDAT1_ND1_Pos 1 /**< \brief (CAN_NDAT1) New Data 1 */ +#define CAN_NDAT1_ND1 (0x1u << CAN_NDAT1_ND1_Pos) +#define CAN_NDAT1_ND2_Pos 2 /**< \brief (CAN_NDAT1) New Data 2 */ +#define CAN_NDAT1_ND2 (0x1u << CAN_NDAT1_ND2_Pos) +#define CAN_NDAT1_ND3_Pos 3 /**< \brief (CAN_NDAT1) New Data 3 */ +#define CAN_NDAT1_ND3 (0x1u << CAN_NDAT1_ND3_Pos) +#define CAN_NDAT1_ND4_Pos 4 /**< \brief (CAN_NDAT1) New Data 4 */ +#define CAN_NDAT1_ND4 (0x1u << CAN_NDAT1_ND4_Pos) +#define CAN_NDAT1_ND5_Pos 5 /**< \brief (CAN_NDAT1) New Data 5 */ +#define CAN_NDAT1_ND5 (0x1u << CAN_NDAT1_ND5_Pos) +#define CAN_NDAT1_ND6_Pos 6 /**< \brief (CAN_NDAT1) New Data 6 */ +#define CAN_NDAT1_ND6 (0x1u << CAN_NDAT1_ND6_Pos) +#define CAN_NDAT1_ND7_Pos 7 /**< \brief (CAN_NDAT1) New Data 7 */ +#define CAN_NDAT1_ND7 (0x1u << CAN_NDAT1_ND7_Pos) +#define CAN_NDAT1_ND8_Pos 8 /**< \brief (CAN_NDAT1) New Data 8 */ +#define CAN_NDAT1_ND8 (0x1u << CAN_NDAT1_ND8_Pos) +#define CAN_NDAT1_ND9_Pos 9 /**< \brief (CAN_NDAT1) New Data 9 */ +#define CAN_NDAT1_ND9 (0x1u << CAN_NDAT1_ND9_Pos) +#define CAN_NDAT1_ND10_Pos 10 /**< \brief (CAN_NDAT1) New Data 10 */ +#define CAN_NDAT1_ND10 (0x1u << CAN_NDAT1_ND10_Pos) +#define CAN_NDAT1_ND11_Pos 11 /**< \brief (CAN_NDAT1) New Data 11 */ +#define CAN_NDAT1_ND11 (0x1u << CAN_NDAT1_ND11_Pos) +#define CAN_NDAT1_ND12_Pos 12 /**< \brief (CAN_NDAT1) New Data 12 */ +#define CAN_NDAT1_ND12 (0x1u << CAN_NDAT1_ND12_Pos) +#define CAN_NDAT1_ND13_Pos 13 /**< \brief (CAN_NDAT1) New Data 13 */ +#define CAN_NDAT1_ND13 (0x1u << CAN_NDAT1_ND13_Pos) +#define CAN_NDAT1_ND14_Pos 14 /**< \brief (CAN_NDAT1) New Data 14 */ +#define CAN_NDAT1_ND14 (0x1u << CAN_NDAT1_ND14_Pos) +#define CAN_NDAT1_ND15_Pos 15 /**< \brief (CAN_NDAT1) New Data 15 */ +#define CAN_NDAT1_ND15 (0x1u << CAN_NDAT1_ND15_Pos) +#define CAN_NDAT1_ND16_Pos 16 /**< \brief (CAN_NDAT1) New Data 16 */ +#define CAN_NDAT1_ND16 (0x1u << CAN_NDAT1_ND16_Pos) +#define CAN_NDAT1_ND17_Pos 17 /**< \brief (CAN_NDAT1) New Data 17 */ +#define CAN_NDAT1_ND17 (0x1u << CAN_NDAT1_ND17_Pos) +#define CAN_NDAT1_ND18_Pos 18 /**< \brief (CAN_NDAT1) New Data 18 */ +#define CAN_NDAT1_ND18 (0x1u << CAN_NDAT1_ND18_Pos) +#define CAN_NDAT1_ND19_Pos 19 /**< \brief (CAN_NDAT1) New Data 19 */ +#define CAN_NDAT1_ND19 (0x1u << CAN_NDAT1_ND19_Pos) +#define CAN_NDAT1_ND20_Pos 20 /**< \brief (CAN_NDAT1) New Data 20 */ +#define CAN_NDAT1_ND20 (0x1u << CAN_NDAT1_ND20_Pos) +#define CAN_NDAT1_ND21_Pos 21 /**< \brief (CAN_NDAT1) New Data 21 */ +#define CAN_NDAT1_ND21 (0x1u << CAN_NDAT1_ND21_Pos) +#define CAN_NDAT1_ND22_Pos 22 /**< \brief (CAN_NDAT1) New Data 22 */ +#define CAN_NDAT1_ND22 (0x1u << CAN_NDAT1_ND22_Pos) +#define CAN_NDAT1_ND23_Pos 23 /**< \brief (CAN_NDAT1) New Data 23 */ +#define CAN_NDAT1_ND23 (0x1u << CAN_NDAT1_ND23_Pos) +#define CAN_NDAT1_ND24_Pos 24 /**< \brief (CAN_NDAT1) New Data 24 */ +#define CAN_NDAT1_ND24 (0x1u << CAN_NDAT1_ND24_Pos) +#define CAN_NDAT1_ND25_Pos 25 /**< \brief (CAN_NDAT1) New Data 25 */ +#define CAN_NDAT1_ND25 (0x1u << CAN_NDAT1_ND25_Pos) +#define CAN_NDAT1_ND26_Pos 26 /**< \brief (CAN_NDAT1) New Data 26 */ +#define CAN_NDAT1_ND26 (0x1u << CAN_NDAT1_ND26_Pos) +#define CAN_NDAT1_ND27_Pos 27 /**< \brief (CAN_NDAT1) New Data 27 */ +#define CAN_NDAT1_ND27 (0x1u << CAN_NDAT1_ND27_Pos) +#define CAN_NDAT1_ND28_Pos 28 /**< \brief (CAN_NDAT1) New Data 28 */ +#define CAN_NDAT1_ND28 (0x1u << CAN_NDAT1_ND28_Pos) +#define CAN_NDAT1_ND29_Pos 29 /**< \brief (CAN_NDAT1) New Data 29 */ +#define CAN_NDAT1_ND29 (0x1u << CAN_NDAT1_ND29_Pos) +#define CAN_NDAT1_ND30_Pos 30 /**< \brief (CAN_NDAT1) New Data 30 */ +#define CAN_NDAT1_ND30 (0x1u << CAN_NDAT1_ND30_Pos) +#define CAN_NDAT1_ND31_Pos 31 /**< \brief (CAN_NDAT1) New Data 31 */ +#define CAN_NDAT1_ND31 (0x1u << CAN_NDAT1_ND31_Pos) +#define CAN_NDAT1_MASK 0xFFFFFFFFu /**< \brief (CAN_NDAT1) MASK Register */ + +/* -------- CAN_NDAT2 : (CAN Offset: 0x9C) (R/W 32) New Data 2 -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t ND32:1; /*!< bit: 0 New Data 32 */ + uint32_t ND33:1; /*!< bit: 1 New Data 33 */ + uint32_t ND34:1; /*!< bit: 2 New Data 34 */ + uint32_t ND35:1; /*!< bit: 3 New Data 35 */ + uint32_t ND36:1; /*!< bit: 4 New Data 36 */ + uint32_t ND37:1; /*!< bit: 5 New Data 37 */ + uint32_t ND38:1; /*!< bit: 6 New Data 38 */ + uint32_t ND39:1; /*!< bit: 7 New Data 39 */ + uint32_t ND40:1; /*!< bit: 8 New Data 40 */ + uint32_t ND41:1; /*!< bit: 9 New Data 41 */ + uint32_t ND42:1; /*!< bit: 10 New Data 42 */ + uint32_t ND43:1; /*!< bit: 11 New Data 43 */ + uint32_t ND44:1; /*!< bit: 12 New Data 44 */ + uint32_t ND45:1; /*!< bit: 13 New Data 45 */ + uint32_t ND46:1; /*!< bit: 14 New Data 46 */ + uint32_t ND47:1; /*!< bit: 15 New Data 47 */ + uint32_t ND48:1; /*!< bit: 16 New Data 48 */ + uint32_t ND49:1; /*!< bit: 17 New Data 49 */ + uint32_t ND50:1; /*!< bit: 18 New Data 50 */ + uint32_t ND51:1; /*!< bit: 19 New Data 51 */ + uint32_t ND52:1; /*!< bit: 20 New Data 52 */ + uint32_t ND53:1; /*!< bit: 21 New Data 53 */ + uint32_t ND54:1; /*!< bit: 22 New Data 54 */ + uint32_t ND55:1; /*!< bit: 23 New Data 55 */ + uint32_t ND56:1; /*!< bit: 24 New Data 56 */ + uint32_t ND57:1; /*!< bit: 25 New Data 57 */ + uint32_t ND58:1; /*!< bit: 26 New Data 58 */ + uint32_t ND59:1; /*!< bit: 27 New Data 59 */ + uint32_t ND60:1; /*!< bit: 28 New Data 60 */ + uint32_t ND61:1; /*!< bit: 29 New Data 61 */ + uint32_t ND62:1; /*!< bit: 30 New Data 62 */ + uint32_t ND63:1; /*!< bit: 31 New Data 63 */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_NDAT2_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_NDAT2_OFFSET 0x9C /**< \brief (CAN_NDAT2 offset) New Data 2 */ +#define CAN_NDAT2_RESETVALUE 0x00000000u /**< \brief (CAN_NDAT2 reset_value) New Data 2 */ + +#define CAN_NDAT2_ND32_Pos 0 /**< \brief (CAN_NDAT2) New Data 32 */ +#define CAN_NDAT2_ND32 (0x1u << CAN_NDAT2_ND32_Pos) +#define CAN_NDAT2_ND33_Pos 1 /**< \brief (CAN_NDAT2) New Data 33 */ +#define CAN_NDAT2_ND33 (0x1u << CAN_NDAT2_ND33_Pos) +#define CAN_NDAT2_ND34_Pos 2 /**< \brief (CAN_NDAT2) New Data 34 */ +#define CAN_NDAT2_ND34 (0x1u << CAN_NDAT2_ND34_Pos) +#define CAN_NDAT2_ND35_Pos 3 /**< \brief (CAN_NDAT2) New Data 35 */ +#define CAN_NDAT2_ND35 (0x1u << CAN_NDAT2_ND35_Pos) +#define CAN_NDAT2_ND36_Pos 4 /**< \brief (CAN_NDAT2) New Data 36 */ +#define CAN_NDAT2_ND36 (0x1u << CAN_NDAT2_ND36_Pos) +#define CAN_NDAT2_ND37_Pos 5 /**< \brief (CAN_NDAT2) New Data 37 */ +#define CAN_NDAT2_ND37 (0x1u << CAN_NDAT2_ND37_Pos) +#define CAN_NDAT2_ND38_Pos 6 /**< \brief (CAN_NDAT2) New Data 38 */ +#define CAN_NDAT2_ND38 (0x1u << CAN_NDAT2_ND38_Pos) +#define CAN_NDAT2_ND39_Pos 7 /**< \brief (CAN_NDAT2) New Data 39 */ +#define CAN_NDAT2_ND39 (0x1u << CAN_NDAT2_ND39_Pos) +#define CAN_NDAT2_ND40_Pos 8 /**< \brief (CAN_NDAT2) New Data 40 */ +#define CAN_NDAT2_ND40 (0x1u << CAN_NDAT2_ND40_Pos) +#define CAN_NDAT2_ND41_Pos 9 /**< \brief (CAN_NDAT2) New Data 41 */ +#define CAN_NDAT2_ND41 (0x1u << CAN_NDAT2_ND41_Pos) +#define CAN_NDAT2_ND42_Pos 10 /**< \brief (CAN_NDAT2) New Data 42 */ +#define CAN_NDAT2_ND42 (0x1u << CAN_NDAT2_ND42_Pos) +#define CAN_NDAT2_ND43_Pos 11 /**< \brief (CAN_NDAT2) New Data 43 */ +#define CAN_NDAT2_ND43 (0x1u << CAN_NDAT2_ND43_Pos) +#define CAN_NDAT2_ND44_Pos 12 /**< \brief (CAN_NDAT2) New Data 44 */ +#define CAN_NDAT2_ND44 (0x1u << CAN_NDAT2_ND44_Pos) +#define CAN_NDAT2_ND45_Pos 13 /**< \brief (CAN_NDAT2) New Data 45 */ +#define CAN_NDAT2_ND45 (0x1u << CAN_NDAT2_ND45_Pos) +#define CAN_NDAT2_ND46_Pos 14 /**< \brief (CAN_NDAT2) New Data 46 */ +#define CAN_NDAT2_ND46 (0x1u << CAN_NDAT2_ND46_Pos) +#define CAN_NDAT2_ND47_Pos 15 /**< \brief (CAN_NDAT2) New Data 47 */ +#define CAN_NDAT2_ND47 (0x1u << CAN_NDAT2_ND47_Pos) +#define CAN_NDAT2_ND48_Pos 16 /**< \brief (CAN_NDAT2) New Data 48 */ +#define CAN_NDAT2_ND48 (0x1u << CAN_NDAT2_ND48_Pos) +#define CAN_NDAT2_ND49_Pos 17 /**< \brief (CAN_NDAT2) New Data 49 */ +#define CAN_NDAT2_ND49 (0x1u << CAN_NDAT2_ND49_Pos) +#define CAN_NDAT2_ND50_Pos 18 /**< \brief (CAN_NDAT2) New Data 50 */ +#define CAN_NDAT2_ND50 (0x1u << CAN_NDAT2_ND50_Pos) +#define CAN_NDAT2_ND51_Pos 19 /**< \brief (CAN_NDAT2) New Data 51 */ +#define CAN_NDAT2_ND51 (0x1u << CAN_NDAT2_ND51_Pos) +#define CAN_NDAT2_ND52_Pos 20 /**< \brief (CAN_NDAT2) New Data 52 */ +#define CAN_NDAT2_ND52 (0x1u << CAN_NDAT2_ND52_Pos) +#define CAN_NDAT2_ND53_Pos 21 /**< \brief (CAN_NDAT2) New Data 53 */ +#define CAN_NDAT2_ND53 (0x1u << CAN_NDAT2_ND53_Pos) +#define CAN_NDAT2_ND54_Pos 22 /**< \brief (CAN_NDAT2) New Data 54 */ +#define CAN_NDAT2_ND54 (0x1u << CAN_NDAT2_ND54_Pos) +#define CAN_NDAT2_ND55_Pos 23 /**< \brief (CAN_NDAT2) New Data 55 */ +#define CAN_NDAT2_ND55 (0x1u << CAN_NDAT2_ND55_Pos) +#define CAN_NDAT2_ND56_Pos 24 /**< \brief (CAN_NDAT2) New Data 56 */ +#define CAN_NDAT2_ND56 (0x1u << CAN_NDAT2_ND56_Pos) +#define CAN_NDAT2_ND57_Pos 25 /**< \brief (CAN_NDAT2) New Data 57 */ +#define CAN_NDAT2_ND57 (0x1u << CAN_NDAT2_ND57_Pos) +#define CAN_NDAT2_ND58_Pos 26 /**< \brief (CAN_NDAT2) New Data 58 */ +#define CAN_NDAT2_ND58 (0x1u << CAN_NDAT2_ND58_Pos) +#define CAN_NDAT2_ND59_Pos 27 /**< \brief (CAN_NDAT2) New Data 59 */ +#define CAN_NDAT2_ND59 (0x1u << CAN_NDAT2_ND59_Pos) +#define CAN_NDAT2_ND60_Pos 28 /**< \brief (CAN_NDAT2) New Data 60 */ +#define CAN_NDAT2_ND60 (0x1u << CAN_NDAT2_ND60_Pos) +#define CAN_NDAT2_ND61_Pos 29 /**< \brief (CAN_NDAT2) New Data 61 */ +#define CAN_NDAT2_ND61 (0x1u << CAN_NDAT2_ND61_Pos) +#define CAN_NDAT2_ND62_Pos 30 /**< \brief (CAN_NDAT2) New Data 62 */ +#define CAN_NDAT2_ND62 (0x1u << CAN_NDAT2_ND62_Pos) +#define CAN_NDAT2_ND63_Pos 31 /**< \brief (CAN_NDAT2) New Data 63 */ +#define CAN_NDAT2_ND63 (0x1u << CAN_NDAT2_ND63_Pos) +#define CAN_NDAT2_MASK 0xFFFFFFFFu /**< \brief (CAN_NDAT2) MASK Register */ + +/* -------- CAN_RXF0C : (CAN Offset: 0xA0) (R/W 32) Rx FIFO 0 Configuration -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t F0SA:16; /*!< bit: 0..15 Rx FIFO 0 Start Address */ + uint32_t F0S:7; /*!< bit: 16..22 Rx FIFO 0 Size */ + uint32_t :1; /*!< bit: 23 Reserved */ + uint32_t F0WM:7; /*!< bit: 24..30 Rx FIFO 0 Watermark */ + uint32_t F0OM:1; /*!< bit: 31 FIFO 0 Operation Mode */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_RXF0C_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_RXF0C_OFFSET 0xA0 /**< \brief (CAN_RXF0C offset) Rx FIFO 0 Configuration */ +#define CAN_RXF0C_RESETVALUE 0x00000000u /**< \brief (CAN_RXF0C reset_value) Rx FIFO 0 Configuration */ + +#define CAN_RXF0C_F0SA_Pos 0 /**< \brief (CAN_RXF0C) Rx FIFO 0 Start Address */ +#define CAN_RXF0C_F0SA_Msk (0xFFFFu << CAN_RXF0C_F0SA_Pos) +#define CAN_RXF0C_F0SA(value) (CAN_RXF0C_F0SA_Msk & ((value) << CAN_RXF0C_F0SA_Pos)) +#define CAN_RXF0C_F0S_Pos 16 /**< \brief (CAN_RXF0C) Rx FIFO 0 Size */ +#define CAN_RXF0C_F0S_Msk (0x7Fu << CAN_RXF0C_F0S_Pos) +#define CAN_RXF0C_F0S(value) (CAN_RXF0C_F0S_Msk & ((value) << CAN_RXF0C_F0S_Pos)) +#define CAN_RXF0C_F0WM_Pos 24 /**< \brief (CAN_RXF0C) Rx FIFO 0 Watermark */ +#define CAN_RXF0C_F0WM_Msk (0x7Fu << CAN_RXF0C_F0WM_Pos) +#define CAN_RXF0C_F0WM(value) (CAN_RXF0C_F0WM_Msk & ((value) << CAN_RXF0C_F0WM_Pos)) +#define CAN_RXF0C_F0OM_Pos 31 /**< \brief (CAN_RXF0C) FIFO 0 Operation Mode */ +#define CAN_RXF0C_F0OM (0x1u << CAN_RXF0C_F0OM_Pos) +#define CAN_RXF0C_MASK 0xFF7FFFFFu /**< \brief (CAN_RXF0C) MASK Register */ + +/* -------- CAN_RXF0S : (CAN Offset: 0xA4) (R/ 32) Rx FIFO 0 Status -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t F0FL:7; /*!< bit: 0.. 6 Rx FIFO 0 Fill Level */ + uint32_t :1; /*!< bit: 7 Reserved */ + uint32_t F0GI:6; /*!< bit: 8..13 Rx FIFO 0 Get Index */ + uint32_t :2; /*!< bit: 14..15 Reserved */ + uint32_t F0PI:6; /*!< bit: 16..21 Rx FIFO 0 Put Index */ + uint32_t :2; /*!< bit: 22..23 Reserved */ + uint32_t F0F:1; /*!< bit: 24 Rx FIFO 0 Full */ + uint32_t RF0L:1; /*!< bit: 25 Rx FIFO 0 Message Lost */ + uint32_t :6; /*!< bit: 26..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_RXF0S_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_RXF0S_OFFSET 0xA4 /**< \brief (CAN_RXF0S offset) Rx FIFO 0 Status */ +#define CAN_RXF0S_RESETVALUE 0x00000000u /**< \brief (CAN_RXF0S reset_value) Rx FIFO 0 Status */ + +#define CAN_RXF0S_F0FL_Pos 0 /**< \brief (CAN_RXF0S) Rx FIFO 0 Fill Level */ +#define CAN_RXF0S_F0FL_Msk (0x7Fu << CAN_RXF0S_F0FL_Pos) +#define CAN_RXF0S_F0FL(value) (CAN_RXF0S_F0FL_Msk & ((value) << CAN_RXF0S_F0FL_Pos)) +#define CAN_RXF0S_F0GI_Pos 8 /**< \brief (CAN_RXF0S) Rx FIFO 0 Get Index */ +#define CAN_RXF0S_F0GI_Msk (0x3Fu << CAN_RXF0S_F0GI_Pos) +#define CAN_RXF0S_F0GI(value) (CAN_RXF0S_F0GI_Msk & ((value) << CAN_RXF0S_F0GI_Pos)) +#define CAN_RXF0S_F0PI_Pos 16 /**< \brief (CAN_RXF0S) Rx FIFO 0 Put Index */ +#define CAN_RXF0S_F0PI_Msk (0x3Fu << CAN_RXF0S_F0PI_Pos) +#define CAN_RXF0S_F0PI(value) (CAN_RXF0S_F0PI_Msk & ((value) << CAN_RXF0S_F0PI_Pos)) +#define CAN_RXF0S_F0F_Pos 24 /**< \brief (CAN_RXF0S) Rx FIFO 0 Full */ +#define CAN_RXF0S_F0F (0x1u << CAN_RXF0S_F0F_Pos) +#define CAN_RXF0S_RF0L_Pos 25 /**< \brief (CAN_RXF0S) Rx FIFO 0 Message Lost */ +#define CAN_RXF0S_RF0L (0x1u << CAN_RXF0S_RF0L_Pos) +#define CAN_RXF0S_MASK 0x033F3F7Fu /**< \brief (CAN_RXF0S) MASK Register */ + +/* -------- CAN_RXF0A : (CAN Offset: 0xA8) (R/W 32) Rx FIFO 0 Acknowledge -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t F0AI:6; /*!< bit: 0.. 5 Rx FIFO 0 Acknowledge Index */ + uint32_t :26; /*!< bit: 6..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_RXF0A_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_RXF0A_OFFSET 0xA8 /**< \brief (CAN_RXF0A offset) Rx FIFO 0 Acknowledge */ +#define CAN_RXF0A_RESETVALUE 0x00000000u /**< \brief (CAN_RXF0A reset_value) Rx FIFO 0 Acknowledge */ + +#define CAN_RXF0A_F0AI_Pos 0 /**< \brief (CAN_RXF0A) Rx FIFO 0 Acknowledge Index */ +#define CAN_RXF0A_F0AI_Msk (0x3Fu << CAN_RXF0A_F0AI_Pos) +#define CAN_RXF0A_F0AI(value) (CAN_RXF0A_F0AI_Msk & ((value) << CAN_RXF0A_F0AI_Pos)) +#define CAN_RXF0A_MASK 0x0000003Fu /**< \brief (CAN_RXF0A) MASK Register */ + +/* -------- CAN_RXBC : (CAN Offset: 0xAC) (R/W 32) Rx Buffer Configuration -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t RBSA:16; /*!< bit: 0..15 Rx Buffer Start Address */ + uint32_t :16; /*!< bit: 16..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_RXBC_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_RXBC_OFFSET 0xAC /**< \brief (CAN_RXBC offset) Rx Buffer Configuration */ +#define CAN_RXBC_RESETVALUE 0x00000000u /**< \brief (CAN_RXBC reset_value) Rx Buffer Configuration */ + +#define CAN_RXBC_RBSA_Pos 0 /**< \brief (CAN_RXBC) Rx Buffer Start Address */ +#define CAN_RXBC_RBSA_Msk (0xFFFFu << CAN_RXBC_RBSA_Pos) +#define CAN_RXBC_RBSA(value) (CAN_RXBC_RBSA_Msk & ((value) << CAN_RXBC_RBSA_Pos)) +#define CAN_RXBC_MASK 0x0000FFFFu /**< \brief (CAN_RXBC) MASK Register */ + +/* -------- CAN_RXF1C : (CAN Offset: 0xB0) (R/W 32) Rx FIFO 1 Configuration -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t F1SA:16; /*!< bit: 0..15 Rx FIFO 1 Start Address */ + uint32_t F1S:7; /*!< bit: 16..22 Rx FIFO 1 Size */ + uint32_t :1; /*!< bit: 23 Reserved */ + uint32_t F1WM:7; /*!< bit: 24..30 Rx FIFO 1 Watermark */ + uint32_t F1OM:1; /*!< bit: 31 FIFO 1 Operation Mode */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_RXF1C_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_RXF1C_OFFSET 0xB0 /**< \brief (CAN_RXF1C offset) Rx FIFO 1 Configuration */ +#define CAN_RXF1C_RESETVALUE 0x00000000u /**< \brief (CAN_RXF1C reset_value) Rx FIFO 1 Configuration */ + +#define CAN_RXF1C_F1SA_Pos 0 /**< \brief (CAN_RXF1C) Rx FIFO 1 Start Address */ +#define CAN_RXF1C_F1SA_Msk (0xFFFFu << CAN_RXF1C_F1SA_Pos) +#define CAN_RXF1C_F1SA(value) (CAN_RXF1C_F1SA_Msk & ((value) << CAN_RXF1C_F1SA_Pos)) +#define CAN_RXF1C_F1S_Pos 16 /**< \brief (CAN_RXF1C) Rx FIFO 1 Size */ +#define CAN_RXF1C_F1S_Msk (0x7Fu << CAN_RXF1C_F1S_Pos) +#define CAN_RXF1C_F1S(value) (CAN_RXF1C_F1S_Msk & ((value) << CAN_RXF1C_F1S_Pos)) +#define CAN_RXF1C_F1WM_Pos 24 /**< \brief (CAN_RXF1C) Rx FIFO 1 Watermark */ +#define CAN_RXF1C_F1WM_Msk (0x7Fu << CAN_RXF1C_F1WM_Pos) +#define CAN_RXF1C_F1WM(value) (CAN_RXF1C_F1WM_Msk & ((value) << CAN_RXF1C_F1WM_Pos)) +#define CAN_RXF1C_F1OM_Pos 31 /**< \brief (CAN_RXF1C) FIFO 1 Operation Mode */ +#define CAN_RXF1C_F1OM (0x1u << CAN_RXF1C_F1OM_Pos) +#define CAN_RXF1C_MASK 0xFF7FFFFFu /**< \brief (CAN_RXF1C) MASK Register */ + +/* -------- CAN_RXF1S : (CAN Offset: 0xB4) (R/ 32) Rx FIFO 1 Status -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t F1FL:7; /*!< bit: 0.. 6 Rx FIFO 1 Fill Level */ + uint32_t :1; /*!< bit: 7 Reserved */ + uint32_t F1GI:6; /*!< bit: 8..13 Rx FIFO 1 Get Index */ + uint32_t :2; /*!< bit: 14..15 Reserved */ + uint32_t F1PI:6; /*!< bit: 16..21 Rx FIFO 1 Put Index */ + uint32_t :2; /*!< bit: 22..23 Reserved */ + uint32_t F1F:1; /*!< bit: 24 Rx FIFO 1 Full */ + uint32_t RF1L:1; /*!< bit: 25 Rx FIFO 1 Message Lost */ + uint32_t :4; /*!< bit: 26..29 Reserved */ + uint32_t DMS:2; /*!< bit: 30..31 Debug Message Status */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_RXF1S_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_RXF1S_OFFSET 0xB4 /**< \brief (CAN_RXF1S offset) Rx FIFO 1 Status */ +#define CAN_RXF1S_RESETVALUE 0x00000000u /**< \brief (CAN_RXF1S reset_value) Rx FIFO 1 Status */ + +#define CAN_RXF1S_F1FL_Pos 0 /**< \brief (CAN_RXF1S) Rx FIFO 1 Fill Level */ +#define CAN_RXF1S_F1FL_Msk (0x7Fu << CAN_RXF1S_F1FL_Pos) +#define CAN_RXF1S_F1FL(value) (CAN_RXF1S_F1FL_Msk & ((value) << CAN_RXF1S_F1FL_Pos)) +#define CAN_RXF1S_F1GI_Pos 8 /**< \brief (CAN_RXF1S) Rx FIFO 1 Get Index */ +#define CAN_RXF1S_F1GI_Msk (0x3Fu << CAN_RXF1S_F1GI_Pos) +#define CAN_RXF1S_F1GI(value) (CAN_RXF1S_F1GI_Msk & ((value) << CAN_RXF1S_F1GI_Pos)) +#define CAN_RXF1S_F1PI_Pos 16 /**< \brief (CAN_RXF1S) Rx FIFO 1 Put Index */ +#define CAN_RXF1S_F1PI_Msk (0x3Fu << CAN_RXF1S_F1PI_Pos) +#define CAN_RXF1S_F1PI(value) (CAN_RXF1S_F1PI_Msk & ((value) << CAN_RXF1S_F1PI_Pos)) +#define CAN_RXF1S_F1F_Pos 24 /**< \brief (CAN_RXF1S) Rx FIFO 1 Full */ +#define CAN_RXF1S_F1F (0x1u << CAN_RXF1S_F1F_Pos) +#define CAN_RXF1S_RF1L_Pos 25 /**< \brief (CAN_RXF1S) Rx FIFO 1 Message Lost */ +#define CAN_RXF1S_RF1L (0x1u << CAN_RXF1S_RF1L_Pos) +#define CAN_RXF1S_DMS_Pos 30 /**< \brief (CAN_RXF1S) Debug Message Status */ +#define CAN_RXF1S_DMS_Msk (0x3u << CAN_RXF1S_DMS_Pos) +#define CAN_RXF1S_DMS(value) (CAN_RXF1S_DMS_Msk & ((value) << CAN_RXF1S_DMS_Pos)) +#define CAN_RXF1S_DMS_IDLE_Val 0x0u /**< \brief (CAN_RXF1S) Idle state */ +#define CAN_RXF1S_DMS_DBGA_Val 0x1u /**< \brief (CAN_RXF1S) Debug message A received */ +#define CAN_RXF1S_DMS_DBGB_Val 0x2u /**< \brief (CAN_RXF1S) Debug message A/B received */ +#define CAN_RXF1S_DMS_DBGC_Val 0x3u /**< \brief (CAN_RXF1S) Debug message A/B/C received, DMA request set */ +#define CAN_RXF1S_DMS_IDLE (CAN_RXF1S_DMS_IDLE_Val << CAN_RXF1S_DMS_Pos) +#define CAN_RXF1S_DMS_DBGA (CAN_RXF1S_DMS_DBGA_Val << CAN_RXF1S_DMS_Pos) +#define CAN_RXF1S_DMS_DBGB (CAN_RXF1S_DMS_DBGB_Val << CAN_RXF1S_DMS_Pos) +#define CAN_RXF1S_DMS_DBGC (CAN_RXF1S_DMS_DBGC_Val << CAN_RXF1S_DMS_Pos) +#define CAN_RXF1S_MASK 0xC33F3F7Fu /**< \brief (CAN_RXF1S) MASK Register */ + +/* -------- CAN_RXF1A : (CAN Offset: 0xB8) (R/W 32) Rx FIFO 1 Acknowledge -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t F1AI:6; /*!< bit: 0.. 5 Rx FIFO 1 Acknowledge Index */ + uint32_t :26; /*!< bit: 6..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_RXF1A_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_RXF1A_OFFSET 0xB8 /**< \brief (CAN_RXF1A offset) Rx FIFO 1 Acknowledge */ +#define CAN_RXF1A_RESETVALUE 0x00000000u /**< \brief (CAN_RXF1A reset_value) Rx FIFO 1 Acknowledge */ + +#define CAN_RXF1A_F1AI_Pos 0 /**< \brief (CAN_RXF1A) Rx FIFO 1 Acknowledge Index */ +#define CAN_RXF1A_F1AI_Msk (0x3Fu << CAN_RXF1A_F1AI_Pos) +#define CAN_RXF1A_F1AI(value) (CAN_RXF1A_F1AI_Msk & ((value) << CAN_RXF1A_F1AI_Pos)) +#define CAN_RXF1A_MASK 0x0000003Fu /**< \brief (CAN_RXF1A) MASK Register */ + +/* -------- CAN_RXESC : (CAN Offset: 0xBC) (R/W 32) Rx Buffer / FIFO Element Size Configuration -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t F0DS:3; /*!< bit: 0.. 2 Rx FIFO 0 Data Field Size */ + uint32_t :1; /*!< bit: 3 Reserved */ + uint32_t F1DS:3; /*!< bit: 4.. 6 Rx FIFO 1 Data Field Size */ + uint32_t :1; /*!< bit: 7 Reserved */ + uint32_t RBDS:3; /*!< bit: 8..10 Rx Buffer Data Field Size */ + uint32_t :21; /*!< bit: 11..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_RXESC_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_RXESC_OFFSET 0xBC /**< \brief (CAN_RXESC offset) Rx Buffer / FIFO Element Size Configuration */ +#define CAN_RXESC_RESETVALUE 0x00000000u /**< \brief (CAN_RXESC reset_value) Rx Buffer / FIFO Element Size Configuration */ + +#define CAN_RXESC_F0DS_Pos 0 /**< \brief (CAN_RXESC) Rx FIFO 0 Data Field Size */ +#define CAN_RXESC_F0DS_Msk (0x7u << CAN_RXESC_F0DS_Pos) +#define CAN_RXESC_F0DS(value) (CAN_RXESC_F0DS_Msk & ((value) << CAN_RXESC_F0DS_Pos)) +#define CAN_RXESC_F0DS_DATA8_Val 0x0u /**< \brief (CAN_RXESC) 8 byte data field */ +#define CAN_RXESC_F0DS_DATA12_Val 0x1u /**< \brief (CAN_RXESC) 12 byte data field */ +#define CAN_RXESC_F0DS_DATA16_Val 0x2u /**< \brief (CAN_RXESC) 16 byte data field */ +#define CAN_RXESC_F0DS_DATA20_Val 0x3u /**< \brief (CAN_RXESC) 20 byte data field */ +#define CAN_RXESC_F0DS_DATA24_Val 0x4u /**< \brief (CAN_RXESC) 24 byte data field */ +#define CAN_RXESC_F0DS_DATA32_Val 0x5u /**< \brief (CAN_RXESC) 32 byte data field */ +#define CAN_RXESC_F0DS_DATA48_Val 0x6u /**< \brief (CAN_RXESC) 48 byte data field */ +#define CAN_RXESC_F0DS_DATA64_Val 0x7u /**< \brief (CAN_RXESC) 64 byte data field */ +#define CAN_RXESC_F0DS_DATA8 (CAN_RXESC_F0DS_DATA8_Val << CAN_RXESC_F0DS_Pos) +#define CAN_RXESC_F0DS_DATA12 (CAN_RXESC_F0DS_DATA12_Val << CAN_RXESC_F0DS_Pos) +#define CAN_RXESC_F0DS_DATA16 (CAN_RXESC_F0DS_DATA16_Val << CAN_RXESC_F0DS_Pos) +#define CAN_RXESC_F0DS_DATA20 (CAN_RXESC_F0DS_DATA20_Val << CAN_RXESC_F0DS_Pos) +#define CAN_RXESC_F0DS_DATA24 (CAN_RXESC_F0DS_DATA24_Val << CAN_RXESC_F0DS_Pos) +#define CAN_RXESC_F0DS_DATA32 (CAN_RXESC_F0DS_DATA32_Val << CAN_RXESC_F0DS_Pos) +#define CAN_RXESC_F0DS_DATA48 (CAN_RXESC_F0DS_DATA48_Val << CAN_RXESC_F0DS_Pos) +#define CAN_RXESC_F0DS_DATA64 (CAN_RXESC_F0DS_DATA64_Val << CAN_RXESC_F0DS_Pos) +#define CAN_RXESC_F1DS_Pos 4 /**< \brief (CAN_RXESC) Rx FIFO 1 Data Field Size */ +#define CAN_RXESC_F1DS_Msk (0x7u << CAN_RXESC_F1DS_Pos) +#define CAN_RXESC_F1DS(value) (CAN_RXESC_F1DS_Msk & ((value) << CAN_RXESC_F1DS_Pos)) +#define CAN_RXESC_F1DS_DATA8_Val 0x0u /**< \brief (CAN_RXESC) 8 byte data field */ +#define CAN_RXESC_F1DS_DATA12_Val 0x1u /**< \brief (CAN_RXESC) 12 byte data field */ +#define CAN_RXESC_F1DS_DATA16_Val 0x2u /**< \brief (CAN_RXESC) 16 byte data field */ +#define CAN_RXESC_F1DS_DATA20_Val 0x3u /**< \brief (CAN_RXESC) 20 byte data field */ +#define CAN_RXESC_F1DS_DATA24_Val 0x4u /**< \brief (CAN_RXESC) 24 byte data field */ +#define CAN_RXESC_F1DS_DATA32_Val 0x5u /**< \brief (CAN_RXESC) 32 byte data field */ +#define CAN_RXESC_F1DS_DATA48_Val 0x6u /**< \brief (CAN_RXESC) 48 byte data field */ +#define CAN_RXESC_F1DS_DATA64_Val 0x7u /**< \brief (CAN_RXESC) 64 byte data field */ +#define CAN_RXESC_F1DS_DATA8 (CAN_RXESC_F1DS_DATA8_Val << CAN_RXESC_F1DS_Pos) +#define CAN_RXESC_F1DS_DATA12 (CAN_RXESC_F1DS_DATA12_Val << CAN_RXESC_F1DS_Pos) +#define CAN_RXESC_F1DS_DATA16 (CAN_RXESC_F1DS_DATA16_Val << CAN_RXESC_F1DS_Pos) +#define CAN_RXESC_F1DS_DATA20 (CAN_RXESC_F1DS_DATA20_Val << CAN_RXESC_F1DS_Pos) +#define CAN_RXESC_F1DS_DATA24 (CAN_RXESC_F1DS_DATA24_Val << CAN_RXESC_F1DS_Pos) +#define CAN_RXESC_F1DS_DATA32 (CAN_RXESC_F1DS_DATA32_Val << CAN_RXESC_F1DS_Pos) +#define CAN_RXESC_F1DS_DATA48 (CAN_RXESC_F1DS_DATA48_Val << CAN_RXESC_F1DS_Pos) +#define CAN_RXESC_F1DS_DATA64 (CAN_RXESC_F1DS_DATA64_Val << CAN_RXESC_F1DS_Pos) +#define CAN_RXESC_RBDS_Pos 8 /**< \brief (CAN_RXESC) Rx Buffer Data Field Size */ +#define CAN_RXESC_RBDS_Msk (0x7u << CAN_RXESC_RBDS_Pos) +#define CAN_RXESC_RBDS(value) (CAN_RXESC_RBDS_Msk & ((value) << CAN_RXESC_RBDS_Pos)) +#define CAN_RXESC_RBDS_DATA8_Val 0x0u /**< \brief (CAN_RXESC) 8 byte data field */ +#define CAN_RXESC_RBDS_DATA12_Val 0x1u /**< \brief (CAN_RXESC) 12 byte data field */ +#define CAN_RXESC_RBDS_DATA16_Val 0x2u /**< \brief (CAN_RXESC) 16 byte data field */ +#define CAN_RXESC_RBDS_DATA20_Val 0x3u /**< \brief (CAN_RXESC) 20 byte data field */ +#define CAN_RXESC_RBDS_DATA24_Val 0x4u /**< \brief (CAN_RXESC) 24 byte data field */ +#define CAN_RXESC_RBDS_DATA32_Val 0x5u /**< \brief (CAN_RXESC) 32 byte data field */ +#define CAN_RXESC_RBDS_DATA48_Val 0x6u /**< \brief (CAN_RXESC) 48 byte data field */ +#define CAN_RXESC_RBDS_DATA64_Val 0x7u /**< \brief (CAN_RXESC) 64 byte data field */ +#define CAN_RXESC_RBDS_DATA8 (CAN_RXESC_RBDS_DATA8_Val << CAN_RXESC_RBDS_Pos) +#define CAN_RXESC_RBDS_DATA12 (CAN_RXESC_RBDS_DATA12_Val << CAN_RXESC_RBDS_Pos) +#define CAN_RXESC_RBDS_DATA16 (CAN_RXESC_RBDS_DATA16_Val << CAN_RXESC_RBDS_Pos) +#define CAN_RXESC_RBDS_DATA20 (CAN_RXESC_RBDS_DATA20_Val << CAN_RXESC_RBDS_Pos) +#define CAN_RXESC_RBDS_DATA24 (CAN_RXESC_RBDS_DATA24_Val << CAN_RXESC_RBDS_Pos) +#define CAN_RXESC_RBDS_DATA32 (CAN_RXESC_RBDS_DATA32_Val << CAN_RXESC_RBDS_Pos) +#define CAN_RXESC_RBDS_DATA48 (CAN_RXESC_RBDS_DATA48_Val << CAN_RXESC_RBDS_Pos) +#define CAN_RXESC_RBDS_DATA64 (CAN_RXESC_RBDS_DATA64_Val << CAN_RXESC_RBDS_Pos) +#define CAN_RXESC_MASK 0x00000777u /**< \brief (CAN_RXESC) MASK Register */ + +/* -------- CAN_TXBC : (CAN Offset: 0xC0) (R/W 32) Tx Buffer Configuration -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t TBSA:16; /*!< bit: 0..15 Tx Buffers Start Address */ + uint32_t NDTB:6; /*!< bit: 16..21 Number of Dedicated Transmit Buffers */ + uint32_t :2; /*!< bit: 22..23 Reserved */ + uint32_t TFQS:6; /*!< bit: 24..29 Transmit FIFO/Queue Size */ + uint32_t TFQM:1; /*!< bit: 30 Tx FIFO/Queue Mode */ + uint32_t :1; /*!< bit: 31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_TXBC_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_TXBC_OFFSET 0xC0 /**< \brief (CAN_TXBC offset) Tx Buffer Configuration */ +#define CAN_TXBC_RESETVALUE 0x00000000u /**< \brief (CAN_TXBC reset_value) Tx Buffer Configuration */ + +#define CAN_TXBC_TBSA_Pos 0 /**< \brief (CAN_TXBC) Tx Buffers Start Address */ +#define CAN_TXBC_TBSA_Msk (0xFFFFu << CAN_TXBC_TBSA_Pos) +#define CAN_TXBC_TBSA(value) (CAN_TXBC_TBSA_Msk & ((value) << CAN_TXBC_TBSA_Pos)) +#define CAN_TXBC_NDTB_Pos 16 /**< \brief (CAN_TXBC) Number of Dedicated Transmit Buffers */ +#define CAN_TXBC_NDTB_Msk (0x3Fu << CAN_TXBC_NDTB_Pos) +#define CAN_TXBC_NDTB(value) (CAN_TXBC_NDTB_Msk & ((value) << CAN_TXBC_NDTB_Pos)) +#define CAN_TXBC_TFQS_Pos 24 /**< \brief (CAN_TXBC) Transmit FIFO/Queue Size */ +#define CAN_TXBC_TFQS_Msk (0x3Fu << CAN_TXBC_TFQS_Pos) +#define CAN_TXBC_TFQS(value) (CAN_TXBC_TFQS_Msk & ((value) << CAN_TXBC_TFQS_Pos)) +#define CAN_TXBC_TFQM_Pos 30 /**< \brief (CAN_TXBC) Tx FIFO/Queue Mode */ +#define CAN_TXBC_TFQM (0x1u << CAN_TXBC_TFQM_Pos) +#define CAN_TXBC_MASK 0x7F3FFFFFu /**< \brief (CAN_TXBC) MASK Register */ + +/* -------- CAN_TXFQS : (CAN Offset: 0xC4) (R/ 32) Tx FIFO / Queue Status -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t TFFL:6; /*!< bit: 0.. 5 Tx FIFO Free Level */ + uint32_t :2; /*!< bit: 6.. 7 Reserved */ + uint32_t TFGI:5; /*!< bit: 8..12 Tx FIFO Get Index */ + uint32_t :3; /*!< bit: 13..15 Reserved */ + uint32_t TFQPI:5; /*!< bit: 16..20 Tx FIFO/Queue Put Index */ + uint32_t TFQF:1; /*!< bit: 21 Tx FIFO/Queue Full */ + uint32_t :10; /*!< bit: 22..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_TXFQS_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_TXFQS_OFFSET 0xC4 /**< \brief (CAN_TXFQS offset) Tx FIFO / Queue Status */ +#define CAN_TXFQS_RESETVALUE 0x00000000u /**< \brief (CAN_TXFQS reset_value) Tx FIFO / Queue Status */ + +#define CAN_TXFQS_TFFL_Pos 0 /**< \brief (CAN_TXFQS) Tx FIFO Free Level */ +#define CAN_TXFQS_TFFL_Msk (0x3Fu << CAN_TXFQS_TFFL_Pos) +#define CAN_TXFQS_TFFL(value) (CAN_TXFQS_TFFL_Msk & ((value) << CAN_TXFQS_TFFL_Pos)) +#define CAN_TXFQS_TFGI_Pos 8 /**< \brief (CAN_TXFQS) Tx FIFO Get Index */ +#define CAN_TXFQS_TFGI_Msk (0x1Fu << CAN_TXFQS_TFGI_Pos) +#define CAN_TXFQS_TFGI(value) (CAN_TXFQS_TFGI_Msk & ((value) << CAN_TXFQS_TFGI_Pos)) +#define CAN_TXFQS_TFQPI_Pos 16 /**< \brief (CAN_TXFQS) Tx FIFO/Queue Put Index */ +#define CAN_TXFQS_TFQPI_Msk (0x1Fu << CAN_TXFQS_TFQPI_Pos) +#define CAN_TXFQS_TFQPI(value) (CAN_TXFQS_TFQPI_Msk & ((value) << CAN_TXFQS_TFQPI_Pos)) +#define CAN_TXFQS_TFQF_Pos 21 /**< \brief (CAN_TXFQS) Tx FIFO/Queue Full */ +#define CAN_TXFQS_TFQF (0x1u << CAN_TXFQS_TFQF_Pos) +#define CAN_TXFQS_MASK 0x003F1F3Fu /**< \brief (CAN_TXFQS) MASK Register */ + +/* -------- CAN_TXESC : (CAN Offset: 0xC8) (R/W 32) Tx Buffer Element Size Configuration -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t TBDS:3; /*!< bit: 0.. 2 Tx Buffer Data Field Size */ + uint32_t :29; /*!< bit: 3..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_TXESC_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_TXESC_OFFSET 0xC8 /**< \brief (CAN_TXESC offset) Tx Buffer Element Size Configuration */ +#define CAN_TXESC_RESETVALUE 0x00000000u /**< \brief (CAN_TXESC reset_value) Tx Buffer Element Size Configuration */ + +#define CAN_TXESC_TBDS_Pos 0 /**< \brief (CAN_TXESC) Tx Buffer Data Field Size */ +#define CAN_TXESC_TBDS_Msk (0x7u << CAN_TXESC_TBDS_Pos) +#define CAN_TXESC_TBDS(value) (CAN_TXESC_TBDS_Msk & ((value) << CAN_TXESC_TBDS_Pos)) +#define CAN_TXESC_TBDS_DATA8_Val 0x0u /**< \brief (CAN_TXESC) 8 byte data field */ +#define CAN_TXESC_TBDS_DATA12_Val 0x1u /**< \brief (CAN_TXESC) 12 byte data field */ +#define CAN_TXESC_TBDS_DATA16_Val 0x2u /**< \brief (CAN_TXESC) 16 byte data field */ +#define CAN_TXESC_TBDS_DATA20_Val 0x3u /**< \brief (CAN_TXESC) 20 byte data field */ +#define CAN_TXESC_TBDS_DATA24_Val 0x4u /**< \brief (CAN_TXESC) 24 byte data field */ +#define CAN_TXESC_TBDS_DATA32_Val 0x5u /**< \brief (CAN_TXESC) 32 byte data field */ +#define CAN_TXESC_TBDS_DATA48_Val 0x6u /**< \brief (CAN_TXESC) 48 byte data field */ +#define CAN_TXESC_TBDS_DATA64_Val 0x7u /**< \brief (CAN_TXESC) 64 byte data field */ +#define CAN_TXESC_TBDS_DATA8 (CAN_TXESC_TBDS_DATA8_Val << CAN_TXESC_TBDS_Pos) +#define CAN_TXESC_TBDS_DATA12 (CAN_TXESC_TBDS_DATA12_Val << CAN_TXESC_TBDS_Pos) +#define CAN_TXESC_TBDS_DATA16 (CAN_TXESC_TBDS_DATA16_Val << CAN_TXESC_TBDS_Pos) +#define CAN_TXESC_TBDS_DATA20 (CAN_TXESC_TBDS_DATA20_Val << CAN_TXESC_TBDS_Pos) +#define CAN_TXESC_TBDS_DATA24 (CAN_TXESC_TBDS_DATA24_Val << CAN_TXESC_TBDS_Pos) +#define CAN_TXESC_TBDS_DATA32 (CAN_TXESC_TBDS_DATA32_Val << CAN_TXESC_TBDS_Pos) +#define CAN_TXESC_TBDS_DATA48 (CAN_TXESC_TBDS_DATA48_Val << CAN_TXESC_TBDS_Pos) +#define CAN_TXESC_TBDS_DATA64 (CAN_TXESC_TBDS_DATA64_Val << CAN_TXESC_TBDS_Pos) +#define CAN_TXESC_MASK 0x00000007u /**< \brief (CAN_TXESC) MASK Register */ + +/* -------- CAN_TXBRP : (CAN Offset: 0xCC) (R/ 32) Tx Buffer Request Pending -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t TRP0:1; /*!< bit: 0 Transmission Request Pending 0 */ + uint32_t TRP1:1; /*!< bit: 1 Transmission Request Pending 1 */ + uint32_t TRP2:1; /*!< bit: 2 Transmission Request Pending 2 */ + uint32_t TRP3:1; /*!< bit: 3 Transmission Request Pending 3 */ + uint32_t TRP4:1; /*!< bit: 4 Transmission Request Pending 4 */ + uint32_t TRP5:1; /*!< bit: 5 Transmission Request Pending 5 */ + uint32_t TRP6:1; /*!< bit: 6 Transmission Request Pending 6 */ + uint32_t TRP7:1; /*!< bit: 7 Transmission Request Pending 7 */ + uint32_t TRP8:1; /*!< bit: 8 Transmission Request Pending 8 */ + uint32_t TRP9:1; /*!< bit: 9 Transmission Request Pending 9 */ + uint32_t TRP10:1; /*!< bit: 10 Transmission Request Pending 10 */ + uint32_t TRP11:1; /*!< bit: 11 Transmission Request Pending 11 */ + uint32_t TRP12:1; /*!< bit: 12 Transmission Request Pending 12 */ + uint32_t TRP13:1; /*!< bit: 13 Transmission Request Pending 13 */ + uint32_t TRP14:1; /*!< bit: 14 Transmission Request Pending 14 */ + uint32_t TRP15:1; /*!< bit: 15 Transmission Request Pending 15 */ + uint32_t TRP16:1; /*!< bit: 16 Transmission Request Pending 16 */ + uint32_t TRP17:1; /*!< bit: 17 Transmission Request Pending 17 */ + uint32_t TRP18:1; /*!< bit: 18 Transmission Request Pending 18 */ + uint32_t TRP19:1; /*!< bit: 19 Transmission Request Pending 19 */ + uint32_t TRP20:1; /*!< bit: 20 Transmission Request Pending 20 */ + uint32_t TRP21:1; /*!< bit: 21 Transmission Request Pending 21 */ + uint32_t TRP22:1; /*!< bit: 22 Transmission Request Pending 22 */ + uint32_t TRP23:1; /*!< bit: 23 Transmission Request Pending 23 */ + uint32_t TRP24:1; /*!< bit: 24 Transmission Request Pending 24 */ + uint32_t TRP25:1; /*!< bit: 25 Transmission Request Pending 25 */ + uint32_t TRP26:1; /*!< bit: 26 Transmission Request Pending 26 */ + uint32_t TRP27:1; /*!< bit: 27 Transmission Request Pending 27 */ + uint32_t TRP28:1; /*!< bit: 28 Transmission Request Pending 28 */ + uint32_t TRP29:1; /*!< bit: 29 Transmission Request Pending 29 */ + uint32_t TRP30:1; /*!< bit: 30 Transmission Request Pending 30 */ + uint32_t TRP31:1; /*!< bit: 31 Transmission Request Pending 31 */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_TXBRP_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_TXBRP_OFFSET 0xCC /**< \brief (CAN_TXBRP offset) Tx Buffer Request Pending */ +#define CAN_TXBRP_RESETVALUE 0x00000000u /**< \brief (CAN_TXBRP reset_value) Tx Buffer Request Pending */ + +#define CAN_TXBRP_TRP0_Pos 0 /**< \brief (CAN_TXBRP) Transmission Request Pending 0 */ +#define CAN_TXBRP_TRP0 (0x1u << CAN_TXBRP_TRP0_Pos) +#define CAN_TXBRP_TRP1_Pos 1 /**< \brief (CAN_TXBRP) Transmission Request Pending 1 */ +#define CAN_TXBRP_TRP1 (0x1u << CAN_TXBRP_TRP1_Pos) +#define CAN_TXBRP_TRP2_Pos 2 /**< \brief (CAN_TXBRP) Transmission Request Pending 2 */ +#define CAN_TXBRP_TRP2 (0x1u << CAN_TXBRP_TRP2_Pos) +#define CAN_TXBRP_TRP3_Pos 3 /**< \brief (CAN_TXBRP) Transmission Request Pending 3 */ +#define CAN_TXBRP_TRP3 (0x1u << CAN_TXBRP_TRP3_Pos) +#define CAN_TXBRP_TRP4_Pos 4 /**< \brief (CAN_TXBRP) Transmission Request Pending 4 */ +#define CAN_TXBRP_TRP4 (0x1u << CAN_TXBRP_TRP4_Pos) +#define CAN_TXBRP_TRP5_Pos 5 /**< \brief (CAN_TXBRP) Transmission Request Pending 5 */ +#define CAN_TXBRP_TRP5 (0x1u << CAN_TXBRP_TRP5_Pos) +#define CAN_TXBRP_TRP6_Pos 6 /**< \brief (CAN_TXBRP) Transmission Request Pending 6 */ +#define CAN_TXBRP_TRP6 (0x1u << CAN_TXBRP_TRP6_Pos) +#define CAN_TXBRP_TRP7_Pos 7 /**< \brief (CAN_TXBRP) Transmission Request Pending 7 */ +#define CAN_TXBRP_TRP7 (0x1u << CAN_TXBRP_TRP7_Pos) +#define CAN_TXBRP_TRP8_Pos 8 /**< \brief (CAN_TXBRP) Transmission Request Pending 8 */ +#define CAN_TXBRP_TRP8 (0x1u << CAN_TXBRP_TRP8_Pos) +#define CAN_TXBRP_TRP9_Pos 9 /**< \brief (CAN_TXBRP) Transmission Request Pending 9 */ +#define CAN_TXBRP_TRP9 (0x1u << CAN_TXBRP_TRP9_Pos) +#define CAN_TXBRP_TRP10_Pos 10 /**< \brief (CAN_TXBRP) Transmission Request Pending 10 */ +#define CAN_TXBRP_TRP10 (0x1u << CAN_TXBRP_TRP10_Pos) +#define CAN_TXBRP_TRP11_Pos 11 /**< \brief (CAN_TXBRP) Transmission Request Pending 11 */ +#define CAN_TXBRP_TRP11 (0x1u << CAN_TXBRP_TRP11_Pos) +#define CAN_TXBRP_TRP12_Pos 12 /**< \brief (CAN_TXBRP) Transmission Request Pending 12 */ +#define CAN_TXBRP_TRP12 (0x1u << CAN_TXBRP_TRP12_Pos) +#define CAN_TXBRP_TRP13_Pos 13 /**< \brief (CAN_TXBRP) Transmission Request Pending 13 */ +#define CAN_TXBRP_TRP13 (0x1u << CAN_TXBRP_TRP13_Pos) +#define CAN_TXBRP_TRP14_Pos 14 /**< \brief (CAN_TXBRP) Transmission Request Pending 14 */ +#define CAN_TXBRP_TRP14 (0x1u << CAN_TXBRP_TRP14_Pos) +#define CAN_TXBRP_TRP15_Pos 15 /**< \brief (CAN_TXBRP) Transmission Request Pending 15 */ +#define CAN_TXBRP_TRP15 (0x1u << CAN_TXBRP_TRP15_Pos) +#define CAN_TXBRP_TRP16_Pos 16 /**< \brief (CAN_TXBRP) Transmission Request Pending 16 */ +#define CAN_TXBRP_TRP16 (0x1u << CAN_TXBRP_TRP16_Pos) +#define CAN_TXBRP_TRP17_Pos 17 /**< \brief (CAN_TXBRP) Transmission Request Pending 17 */ +#define CAN_TXBRP_TRP17 (0x1u << CAN_TXBRP_TRP17_Pos) +#define CAN_TXBRP_TRP18_Pos 18 /**< \brief (CAN_TXBRP) Transmission Request Pending 18 */ +#define CAN_TXBRP_TRP18 (0x1u << CAN_TXBRP_TRP18_Pos) +#define CAN_TXBRP_TRP19_Pos 19 /**< \brief (CAN_TXBRP) Transmission Request Pending 19 */ +#define CAN_TXBRP_TRP19 (0x1u << CAN_TXBRP_TRP19_Pos) +#define CAN_TXBRP_TRP20_Pos 20 /**< \brief (CAN_TXBRP) Transmission Request Pending 20 */ +#define CAN_TXBRP_TRP20 (0x1u << CAN_TXBRP_TRP20_Pos) +#define CAN_TXBRP_TRP21_Pos 21 /**< \brief (CAN_TXBRP) Transmission Request Pending 21 */ +#define CAN_TXBRP_TRP21 (0x1u << CAN_TXBRP_TRP21_Pos) +#define CAN_TXBRP_TRP22_Pos 22 /**< \brief (CAN_TXBRP) Transmission Request Pending 22 */ +#define CAN_TXBRP_TRP22 (0x1u << CAN_TXBRP_TRP22_Pos) +#define CAN_TXBRP_TRP23_Pos 23 /**< \brief (CAN_TXBRP) Transmission Request Pending 23 */ +#define CAN_TXBRP_TRP23 (0x1u << CAN_TXBRP_TRP23_Pos) +#define CAN_TXBRP_TRP24_Pos 24 /**< \brief (CAN_TXBRP) Transmission Request Pending 24 */ +#define CAN_TXBRP_TRP24 (0x1u << CAN_TXBRP_TRP24_Pos) +#define CAN_TXBRP_TRP25_Pos 25 /**< \brief (CAN_TXBRP) Transmission Request Pending 25 */ +#define CAN_TXBRP_TRP25 (0x1u << CAN_TXBRP_TRP25_Pos) +#define CAN_TXBRP_TRP26_Pos 26 /**< \brief (CAN_TXBRP) Transmission Request Pending 26 */ +#define CAN_TXBRP_TRP26 (0x1u << CAN_TXBRP_TRP26_Pos) +#define CAN_TXBRP_TRP27_Pos 27 /**< \brief (CAN_TXBRP) Transmission Request Pending 27 */ +#define CAN_TXBRP_TRP27 (0x1u << CAN_TXBRP_TRP27_Pos) +#define CAN_TXBRP_TRP28_Pos 28 /**< \brief (CAN_TXBRP) Transmission Request Pending 28 */ +#define CAN_TXBRP_TRP28 (0x1u << CAN_TXBRP_TRP28_Pos) +#define CAN_TXBRP_TRP29_Pos 29 /**< \brief (CAN_TXBRP) Transmission Request Pending 29 */ +#define CAN_TXBRP_TRP29 (0x1u << CAN_TXBRP_TRP29_Pos) +#define CAN_TXBRP_TRP30_Pos 30 /**< \brief (CAN_TXBRP) Transmission Request Pending 30 */ +#define CAN_TXBRP_TRP30 (0x1u << CAN_TXBRP_TRP30_Pos) +#define CAN_TXBRP_TRP31_Pos 31 /**< \brief (CAN_TXBRP) Transmission Request Pending 31 */ +#define CAN_TXBRP_TRP31 (0x1u << CAN_TXBRP_TRP31_Pos) +#define CAN_TXBRP_MASK 0xFFFFFFFFu /**< \brief (CAN_TXBRP) MASK Register */ + +/* -------- CAN_TXBAR : (CAN Offset: 0xD0) (R/W 32) Tx Buffer Add Request -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t AR0:1; /*!< bit: 0 Add Request 0 */ + uint32_t AR1:1; /*!< bit: 1 Add Request 1 */ + uint32_t AR2:1; /*!< bit: 2 Add Request 2 */ + uint32_t AR3:1; /*!< bit: 3 Add Request 3 */ + uint32_t AR4:1; /*!< bit: 4 Add Request 4 */ + uint32_t AR5:1; /*!< bit: 5 Add Request 5 */ + uint32_t AR6:1; /*!< bit: 6 Add Request 6 */ + uint32_t AR7:1; /*!< bit: 7 Add Request 7 */ + uint32_t AR8:1; /*!< bit: 8 Add Request 8 */ + uint32_t AR9:1; /*!< bit: 9 Add Request 9 */ + uint32_t AR10:1; /*!< bit: 10 Add Request 10 */ + uint32_t AR11:1; /*!< bit: 11 Add Request 11 */ + uint32_t AR12:1; /*!< bit: 12 Add Request 12 */ + uint32_t AR13:1; /*!< bit: 13 Add Request 13 */ + uint32_t AR14:1; /*!< bit: 14 Add Request 14 */ + uint32_t AR15:1; /*!< bit: 15 Add Request 15 */ + uint32_t AR16:1; /*!< bit: 16 Add Request 16 */ + uint32_t AR17:1; /*!< bit: 17 Add Request 17 */ + uint32_t AR18:1; /*!< bit: 18 Add Request 18 */ + uint32_t AR19:1; /*!< bit: 19 Add Request 19 */ + uint32_t AR20:1; /*!< bit: 20 Add Request 20 */ + uint32_t AR21:1; /*!< bit: 21 Add Request 21 */ + uint32_t AR22:1; /*!< bit: 22 Add Request 22 */ + uint32_t AR23:1; /*!< bit: 23 Add Request 23 */ + uint32_t AR24:1; /*!< bit: 24 Add Request 24 */ + uint32_t AR25:1; /*!< bit: 25 Add Request 25 */ + uint32_t AR26:1; /*!< bit: 26 Add Request 26 */ + uint32_t AR27:1; /*!< bit: 27 Add Request 27 */ + uint32_t AR28:1; /*!< bit: 28 Add Request 28 */ + uint32_t AR29:1; /*!< bit: 29 Add Request 29 */ + uint32_t AR30:1; /*!< bit: 30 Add Request 30 */ + uint32_t AR31:1; /*!< bit: 31 Add Request 31 */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_TXBAR_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_TXBAR_OFFSET 0xD0 /**< \brief (CAN_TXBAR offset) Tx Buffer Add Request */ +#define CAN_TXBAR_RESETVALUE 0x00000000u /**< \brief (CAN_TXBAR reset_value) Tx Buffer Add Request */ + +#define CAN_TXBAR_AR0_Pos 0 /**< \brief (CAN_TXBAR) Add Request 0 */ +#define CAN_TXBAR_AR0 (0x1u << CAN_TXBAR_AR0_Pos) +#define CAN_TXBAR_AR1_Pos 1 /**< \brief (CAN_TXBAR) Add Request 1 */ +#define CAN_TXBAR_AR1 (0x1u << CAN_TXBAR_AR1_Pos) +#define CAN_TXBAR_AR2_Pos 2 /**< \brief (CAN_TXBAR) Add Request 2 */ +#define CAN_TXBAR_AR2 (0x1u << CAN_TXBAR_AR2_Pos) +#define CAN_TXBAR_AR3_Pos 3 /**< \brief (CAN_TXBAR) Add Request 3 */ +#define CAN_TXBAR_AR3 (0x1u << CAN_TXBAR_AR3_Pos) +#define CAN_TXBAR_AR4_Pos 4 /**< \brief (CAN_TXBAR) Add Request 4 */ +#define CAN_TXBAR_AR4 (0x1u << CAN_TXBAR_AR4_Pos) +#define CAN_TXBAR_AR5_Pos 5 /**< \brief (CAN_TXBAR) Add Request 5 */ +#define CAN_TXBAR_AR5 (0x1u << CAN_TXBAR_AR5_Pos) +#define CAN_TXBAR_AR6_Pos 6 /**< \brief (CAN_TXBAR) Add Request 6 */ +#define CAN_TXBAR_AR6 (0x1u << CAN_TXBAR_AR6_Pos) +#define CAN_TXBAR_AR7_Pos 7 /**< \brief (CAN_TXBAR) Add Request 7 */ +#define CAN_TXBAR_AR7 (0x1u << CAN_TXBAR_AR7_Pos) +#define CAN_TXBAR_AR8_Pos 8 /**< \brief (CAN_TXBAR) Add Request 8 */ +#define CAN_TXBAR_AR8 (0x1u << CAN_TXBAR_AR8_Pos) +#define CAN_TXBAR_AR9_Pos 9 /**< \brief (CAN_TXBAR) Add Request 9 */ +#define CAN_TXBAR_AR9 (0x1u << CAN_TXBAR_AR9_Pos) +#define CAN_TXBAR_AR10_Pos 10 /**< \brief (CAN_TXBAR) Add Request 10 */ +#define CAN_TXBAR_AR10 (0x1u << CAN_TXBAR_AR10_Pos) +#define CAN_TXBAR_AR11_Pos 11 /**< \brief (CAN_TXBAR) Add Request 11 */ +#define CAN_TXBAR_AR11 (0x1u << CAN_TXBAR_AR11_Pos) +#define CAN_TXBAR_AR12_Pos 12 /**< \brief (CAN_TXBAR) Add Request 12 */ +#define CAN_TXBAR_AR12 (0x1u << CAN_TXBAR_AR12_Pos) +#define CAN_TXBAR_AR13_Pos 13 /**< \brief (CAN_TXBAR) Add Request 13 */ +#define CAN_TXBAR_AR13 (0x1u << CAN_TXBAR_AR13_Pos) +#define CAN_TXBAR_AR14_Pos 14 /**< \brief (CAN_TXBAR) Add Request 14 */ +#define CAN_TXBAR_AR14 (0x1u << CAN_TXBAR_AR14_Pos) +#define CAN_TXBAR_AR15_Pos 15 /**< \brief (CAN_TXBAR) Add Request 15 */ +#define CAN_TXBAR_AR15 (0x1u << CAN_TXBAR_AR15_Pos) +#define CAN_TXBAR_AR16_Pos 16 /**< \brief (CAN_TXBAR) Add Request 16 */ +#define CAN_TXBAR_AR16 (0x1u << CAN_TXBAR_AR16_Pos) +#define CAN_TXBAR_AR17_Pos 17 /**< \brief (CAN_TXBAR) Add Request 17 */ +#define CAN_TXBAR_AR17 (0x1u << CAN_TXBAR_AR17_Pos) +#define CAN_TXBAR_AR18_Pos 18 /**< \brief (CAN_TXBAR) Add Request 18 */ +#define CAN_TXBAR_AR18 (0x1u << CAN_TXBAR_AR18_Pos) +#define CAN_TXBAR_AR19_Pos 19 /**< \brief (CAN_TXBAR) Add Request 19 */ +#define CAN_TXBAR_AR19 (0x1u << CAN_TXBAR_AR19_Pos) +#define CAN_TXBAR_AR20_Pos 20 /**< \brief (CAN_TXBAR) Add Request 20 */ +#define CAN_TXBAR_AR20 (0x1u << CAN_TXBAR_AR20_Pos) +#define CAN_TXBAR_AR21_Pos 21 /**< \brief (CAN_TXBAR) Add Request 21 */ +#define CAN_TXBAR_AR21 (0x1u << CAN_TXBAR_AR21_Pos) +#define CAN_TXBAR_AR22_Pos 22 /**< \brief (CAN_TXBAR) Add Request 22 */ +#define CAN_TXBAR_AR22 (0x1u << CAN_TXBAR_AR22_Pos) +#define CAN_TXBAR_AR23_Pos 23 /**< \brief (CAN_TXBAR) Add Request 23 */ +#define CAN_TXBAR_AR23 (0x1u << CAN_TXBAR_AR23_Pos) +#define CAN_TXBAR_AR24_Pos 24 /**< \brief (CAN_TXBAR) Add Request 24 */ +#define CAN_TXBAR_AR24 (0x1u << CAN_TXBAR_AR24_Pos) +#define CAN_TXBAR_AR25_Pos 25 /**< \brief (CAN_TXBAR) Add Request 25 */ +#define CAN_TXBAR_AR25 (0x1u << CAN_TXBAR_AR25_Pos) +#define CAN_TXBAR_AR26_Pos 26 /**< \brief (CAN_TXBAR) Add Request 26 */ +#define CAN_TXBAR_AR26 (0x1u << CAN_TXBAR_AR26_Pos) +#define CAN_TXBAR_AR27_Pos 27 /**< \brief (CAN_TXBAR) Add Request 27 */ +#define CAN_TXBAR_AR27 (0x1u << CAN_TXBAR_AR27_Pos) +#define CAN_TXBAR_AR28_Pos 28 /**< \brief (CAN_TXBAR) Add Request 28 */ +#define CAN_TXBAR_AR28 (0x1u << CAN_TXBAR_AR28_Pos) +#define CAN_TXBAR_AR29_Pos 29 /**< \brief (CAN_TXBAR) Add Request 29 */ +#define CAN_TXBAR_AR29 (0x1u << CAN_TXBAR_AR29_Pos) +#define CAN_TXBAR_AR30_Pos 30 /**< \brief (CAN_TXBAR) Add Request 30 */ +#define CAN_TXBAR_AR30 (0x1u << CAN_TXBAR_AR30_Pos) +#define CAN_TXBAR_AR31_Pos 31 /**< \brief (CAN_TXBAR) Add Request 31 */ +#define CAN_TXBAR_AR31 (0x1u << CAN_TXBAR_AR31_Pos) +#define CAN_TXBAR_MASK 0xFFFFFFFFu /**< \brief (CAN_TXBAR) MASK Register */ + +/* -------- CAN_TXBCR : (CAN Offset: 0xD4) (R/W 32) Tx Buffer Cancellation Request -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t CR0:1; /*!< bit: 0 Cancellation Request 0 */ + uint32_t CR1:1; /*!< bit: 1 Cancellation Request 1 */ + uint32_t CR2:1; /*!< bit: 2 Cancellation Request 2 */ + uint32_t CR3:1; /*!< bit: 3 Cancellation Request 3 */ + uint32_t CR4:1; /*!< bit: 4 Cancellation Request 4 */ + uint32_t CR5:1; /*!< bit: 5 Cancellation Request 5 */ + uint32_t CR6:1; /*!< bit: 6 Cancellation Request 6 */ + uint32_t CR7:1; /*!< bit: 7 Cancellation Request 7 */ + uint32_t CR8:1; /*!< bit: 8 Cancellation Request 8 */ + uint32_t CR9:1; /*!< bit: 9 Cancellation Request 9 */ + uint32_t CR10:1; /*!< bit: 10 Cancellation Request 10 */ + uint32_t CR11:1; /*!< bit: 11 Cancellation Request 11 */ + uint32_t CR12:1; /*!< bit: 12 Cancellation Request 12 */ + uint32_t CR13:1; /*!< bit: 13 Cancellation Request 13 */ + uint32_t CR14:1; /*!< bit: 14 Cancellation Request 14 */ + uint32_t CR15:1; /*!< bit: 15 Cancellation Request 15 */ + uint32_t CR16:1; /*!< bit: 16 Cancellation Request 16 */ + uint32_t CR17:1; /*!< bit: 17 Cancellation Request 17 */ + uint32_t CR18:1; /*!< bit: 18 Cancellation Request 18 */ + uint32_t CR19:1; /*!< bit: 19 Cancellation Request 19 */ + uint32_t CR20:1; /*!< bit: 20 Cancellation Request 20 */ + uint32_t CR21:1; /*!< bit: 21 Cancellation Request 21 */ + uint32_t CR22:1; /*!< bit: 22 Cancellation Request 22 */ + uint32_t CR23:1; /*!< bit: 23 Cancellation Request 23 */ + uint32_t CR24:1; /*!< bit: 24 Cancellation Request 24 */ + uint32_t CR25:1; /*!< bit: 25 Cancellation Request 25 */ + uint32_t CR26:1; /*!< bit: 26 Cancellation Request 26 */ + uint32_t CR27:1; /*!< bit: 27 Cancellation Request 27 */ + uint32_t CR28:1; /*!< bit: 28 Cancellation Request 28 */ + uint32_t CR29:1; /*!< bit: 29 Cancellation Request 29 */ + uint32_t CR30:1; /*!< bit: 30 Cancellation Request 30 */ + uint32_t CR31:1; /*!< bit: 31 Cancellation Request 31 */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_TXBCR_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_TXBCR_OFFSET 0xD4 /**< \brief (CAN_TXBCR offset) Tx Buffer Cancellation Request */ +#define CAN_TXBCR_RESETVALUE 0x00000000u /**< \brief (CAN_TXBCR reset_value) Tx Buffer Cancellation Request */ + +#define CAN_TXBCR_CR0_Pos 0 /**< \brief (CAN_TXBCR) Cancellation Request 0 */ +#define CAN_TXBCR_CR0 (0x1u << CAN_TXBCR_CR0_Pos) +#define CAN_TXBCR_CR1_Pos 1 /**< \brief (CAN_TXBCR) Cancellation Request 1 */ +#define CAN_TXBCR_CR1 (0x1u << CAN_TXBCR_CR1_Pos) +#define CAN_TXBCR_CR2_Pos 2 /**< \brief (CAN_TXBCR) Cancellation Request 2 */ +#define CAN_TXBCR_CR2 (0x1u << CAN_TXBCR_CR2_Pos) +#define CAN_TXBCR_CR3_Pos 3 /**< \brief (CAN_TXBCR) Cancellation Request 3 */ +#define CAN_TXBCR_CR3 (0x1u << CAN_TXBCR_CR3_Pos) +#define CAN_TXBCR_CR4_Pos 4 /**< \brief (CAN_TXBCR) Cancellation Request 4 */ +#define CAN_TXBCR_CR4 (0x1u << CAN_TXBCR_CR4_Pos) +#define CAN_TXBCR_CR5_Pos 5 /**< \brief (CAN_TXBCR) Cancellation Request 5 */ +#define CAN_TXBCR_CR5 (0x1u << CAN_TXBCR_CR5_Pos) +#define CAN_TXBCR_CR6_Pos 6 /**< \brief (CAN_TXBCR) Cancellation Request 6 */ +#define CAN_TXBCR_CR6 (0x1u << CAN_TXBCR_CR6_Pos) +#define CAN_TXBCR_CR7_Pos 7 /**< \brief (CAN_TXBCR) Cancellation Request 7 */ +#define CAN_TXBCR_CR7 (0x1u << CAN_TXBCR_CR7_Pos) +#define CAN_TXBCR_CR8_Pos 8 /**< \brief (CAN_TXBCR) Cancellation Request 8 */ +#define CAN_TXBCR_CR8 (0x1u << CAN_TXBCR_CR8_Pos) +#define CAN_TXBCR_CR9_Pos 9 /**< \brief (CAN_TXBCR) Cancellation Request 9 */ +#define CAN_TXBCR_CR9 (0x1u << CAN_TXBCR_CR9_Pos) +#define CAN_TXBCR_CR10_Pos 10 /**< \brief (CAN_TXBCR) Cancellation Request 10 */ +#define CAN_TXBCR_CR10 (0x1u << CAN_TXBCR_CR10_Pos) +#define CAN_TXBCR_CR11_Pos 11 /**< \brief (CAN_TXBCR) Cancellation Request 11 */ +#define CAN_TXBCR_CR11 (0x1u << CAN_TXBCR_CR11_Pos) +#define CAN_TXBCR_CR12_Pos 12 /**< \brief (CAN_TXBCR) Cancellation Request 12 */ +#define CAN_TXBCR_CR12 (0x1u << CAN_TXBCR_CR12_Pos) +#define CAN_TXBCR_CR13_Pos 13 /**< \brief (CAN_TXBCR) Cancellation Request 13 */ +#define CAN_TXBCR_CR13 (0x1u << CAN_TXBCR_CR13_Pos) +#define CAN_TXBCR_CR14_Pos 14 /**< \brief (CAN_TXBCR) Cancellation Request 14 */ +#define CAN_TXBCR_CR14 (0x1u << CAN_TXBCR_CR14_Pos) +#define CAN_TXBCR_CR15_Pos 15 /**< \brief (CAN_TXBCR) Cancellation Request 15 */ +#define CAN_TXBCR_CR15 (0x1u << CAN_TXBCR_CR15_Pos) +#define CAN_TXBCR_CR16_Pos 16 /**< \brief (CAN_TXBCR) Cancellation Request 16 */ +#define CAN_TXBCR_CR16 (0x1u << CAN_TXBCR_CR16_Pos) +#define CAN_TXBCR_CR17_Pos 17 /**< \brief (CAN_TXBCR) Cancellation Request 17 */ +#define CAN_TXBCR_CR17 (0x1u << CAN_TXBCR_CR17_Pos) +#define CAN_TXBCR_CR18_Pos 18 /**< \brief (CAN_TXBCR) Cancellation Request 18 */ +#define CAN_TXBCR_CR18 (0x1u << CAN_TXBCR_CR18_Pos) +#define CAN_TXBCR_CR19_Pos 19 /**< \brief (CAN_TXBCR) Cancellation Request 19 */ +#define CAN_TXBCR_CR19 (0x1u << CAN_TXBCR_CR19_Pos) +#define CAN_TXBCR_CR20_Pos 20 /**< \brief (CAN_TXBCR) Cancellation Request 20 */ +#define CAN_TXBCR_CR20 (0x1u << CAN_TXBCR_CR20_Pos) +#define CAN_TXBCR_CR21_Pos 21 /**< \brief (CAN_TXBCR) Cancellation Request 21 */ +#define CAN_TXBCR_CR21 (0x1u << CAN_TXBCR_CR21_Pos) +#define CAN_TXBCR_CR22_Pos 22 /**< \brief (CAN_TXBCR) Cancellation Request 22 */ +#define CAN_TXBCR_CR22 (0x1u << CAN_TXBCR_CR22_Pos) +#define CAN_TXBCR_CR23_Pos 23 /**< \brief (CAN_TXBCR) Cancellation Request 23 */ +#define CAN_TXBCR_CR23 (0x1u << CAN_TXBCR_CR23_Pos) +#define CAN_TXBCR_CR24_Pos 24 /**< \brief (CAN_TXBCR) Cancellation Request 24 */ +#define CAN_TXBCR_CR24 (0x1u << CAN_TXBCR_CR24_Pos) +#define CAN_TXBCR_CR25_Pos 25 /**< \brief (CAN_TXBCR) Cancellation Request 25 */ +#define CAN_TXBCR_CR25 (0x1u << CAN_TXBCR_CR25_Pos) +#define CAN_TXBCR_CR26_Pos 26 /**< \brief (CAN_TXBCR) Cancellation Request 26 */ +#define CAN_TXBCR_CR26 (0x1u << CAN_TXBCR_CR26_Pos) +#define CAN_TXBCR_CR27_Pos 27 /**< \brief (CAN_TXBCR) Cancellation Request 27 */ +#define CAN_TXBCR_CR27 (0x1u << CAN_TXBCR_CR27_Pos) +#define CAN_TXBCR_CR28_Pos 28 /**< \brief (CAN_TXBCR) Cancellation Request 28 */ +#define CAN_TXBCR_CR28 (0x1u << CAN_TXBCR_CR28_Pos) +#define CAN_TXBCR_CR29_Pos 29 /**< \brief (CAN_TXBCR) Cancellation Request 29 */ +#define CAN_TXBCR_CR29 (0x1u << CAN_TXBCR_CR29_Pos) +#define CAN_TXBCR_CR30_Pos 30 /**< \brief (CAN_TXBCR) Cancellation Request 30 */ +#define CAN_TXBCR_CR30 (0x1u << CAN_TXBCR_CR30_Pos) +#define CAN_TXBCR_CR31_Pos 31 /**< \brief (CAN_TXBCR) Cancellation Request 31 */ +#define CAN_TXBCR_CR31 (0x1u << CAN_TXBCR_CR31_Pos) +#define CAN_TXBCR_MASK 0xFFFFFFFFu /**< \brief (CAN_TXBCR) MASK Register */ + +/* -------- CAN_TXBTO : (CAN Offset: 0xD8) (R/ 32) Tx Buffer Transmission Occurred -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t TO0:1; /*!< bit: 0 Transmission Occurred 0 */ + uint32_t TO1:1; /*!< bit: 1 Transmission Occurred 1 */ + uint32_t TO2:1; /*!< bit: 2 Transmission Occurred 2 */ + uint32_t TO3:1; /*!< bit: 3 Transmission Occurred 3 */ + uint32_t TO4:1; /*!< bit: 4 Transmission Occurred 4 */ + uint32_t TO5:1; /*!< bit: 5 Transmission Occurred 5 */ + uint32_t TO6:1; /*!< bit: 6 Transmission Occurred 6 */ + uint32_t TO7:1; /*!< bit: 7 Transmission Occurred 7 */ + uint32_t TO8:1; /*!< bit: 8 Transmission Occurred 8 */ + uint32_t TO9:1; /*!< bit: 9 Transmission Occurred 9 */ + uint32_t TO10:1; /*!< bit: 10 Transmission Occurred 10 */ + uint32_t TO11:1; /*!< bit: 11 Transmission Occurred 11 */ + uint32_t TO12:1; /*!< bit: 12 Transmission Occurred 12 */ + uint32_t TO13:1; /*!< bit: 13 Transmission Occurred 13 */ + uint32_t TO14:1; /*!< bit: 14 Transmission Occurred 14 */ + uint32_t TO15:1; /*!< bit: 15 Transmission Occurred 15 */ + uint32_t TO16:1; /*!< bit: 16 Transmission Occurred 16 */ + uint32_t TO17:1; /*!< bit: 17 Transmission Occurred 17 */ + uint32_t TO18:1; /*!< bit: 18 Transmission Occurred 18 */ + uint32_t TO19:1; /*!< bit: 19 Transmission Occurred 19 */ + uint32_t TO20:1; /*!< bit: 20 Transmission Occurred 20 */ + uint32_t TO21:1; /*!< bit: 21 Transmission Occurred 21 */ + uint32_t TO22:1; /*!< bit: 22 Transmission Occurred 22 */ + uint32_t TO23:1; /*!< bit: 23 Transmission Occurred 23 */ + uint32_t TO24:1; /*!< bit: 24 Transmission Occurred 24 */ + uint32_t TO25:1; /*!< bit: 25 Transmission Occurred 25 */ + uint32_t TO26:1; /*!< bit: 26 Transmission Occurred 26 */ + uint32_t TO27:1; /*!< bit: 27 Transmission Occurred 27 */ + uint32_t TO28:1; /*!< bit: 28 Transmission Occurred 28 */ + uint32_t TO29:1; /*!< bit: 29 Transmission Occurred 29 */ + uint32_t TO30:1; /*!< bit: 30 Transmission Occurred 30 */ + uint32_t TO31:1; /*!< bit: 31 Transmission Occurred 31 */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_TXBTO_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_TXBTO_OFFSET 0xD8 /**< \brief (CAN_TXBTO offset) Tx Buffer Transmission Occurred */ +#define CAN_TXBTO_RESETVALUE 0x00000000u /**< \brief (CAN_TXBTO reset_value) Tx Buffer Transmission Occurred */ + +#define CAN_TXBTO_TO0_Pos 0 /**< \brief (CAN_TXBTO) Transmission Occurred 0 */ +#define CAN_TXBTO_TO0 (0x1u << CAN_TXBTO_TO0_Pos) +#define CAN_TXBTO_TO1_Pos 1 /**< \brief (CAN_TXBTO) Transmission Occurred 1 */ +#define CAN_TXBTO_TO1 (0x1u << CAN_TXBTO_TO1_Pos) +#define CAN_TXBTO_TO2_Pos 2 /**< \brief (CAN_TXBTO) Transmission Occurred 2 */ +#define CAN_TXBTO_TO2 (0x1u << CAN_TXBTO_TO2_Pos) +#define CAN_TXBTO_TO3_Pos 3 /**< \brief (CAN_TXBTO) Transmission Occurred 3 */ +#define CAN_TXBTO_TO3 (0x1u << CAN_TXBTO_TO3_Pos) +#define CAN_TXBTO_TO4_Pos 4 /**< \brief (CAN_TXBTO) Transmission Occurred 4 */ +#define CAN_TXBTO_TO4 (0x1u << CAN_TXBTO_TO4_Pos) +#define CAN_TXBTO_TO5_Pos 5 /**< \brief (CAN_TXBTO) Transmission Occurred 5 */ +#define CAN_TXBTO_TO5 (0x1u << CAN_TXBTO_TO5_Pos) +#define CAN_TXBTO_TO6_Pos 6 /**< \brief (CAN_TXBTO) Transmission Occurred 6 */ +#define CAN_TXBTO_TO6 (0x1u << CAN_TXBTO_TO6_Pos) +#define CAN_TXBTO_TO7_Pos 7 /**< \brief (CAN_TXBTO) Transmission Occurred 7 */ +#define CAN_TXBTO_TO7 (0x1u << CAN_TXBTO_TO7_Pos) +#define CAN_TXBTO_TO8_Pos 8 /**< \brief (CAN_TXBTO) Transmission Occurred 8 */ +#define CAN_TXBTO_TO8 (0x1u << CAN_TXBTO_TO8_Pos) +#define CAN_TXBTO_TO9_Pos 9 /**< \brief (CAN_TXBTO) Transmission Occurred 9 */ +#define CAN_TXBTO_TO9 (0x1u << CAN_TXBTO_TO9_Pos) +#define CAN_TXBTO_TO10_Pos 10 /**< \brief (CAN_TXBTO) Transmission Occurred 10 */ +#define CAN_TXBTO_TO10 (0x1u << CAN_TXBTO_TO10_Pos) +#define CAN_TXBTO_TO11_Pos 11 /**< \brief (CAN_TXBTO) Transmission Occurred 11 */ +#define CAN_TXBTO_TO11 (0x1u << CAN_TXBTO_TO11_Pos) +#define CAN_TXBTO_TO12_Pos 12 /**< \brief (CAN_TXBTO) Transmission Occurred 12 */ +#define CAN_TXBTO_TO12 (0x1u << CAN_TXBTO_TO12_Pos) +#define CAN_TXBTO_TO13_Pos 13 /**< \brief (CAN_TXBTO) Transmission Occurred 13 */ +#define CAN_TXBTO_TO13 (0x1u << CAN_TXBTO_TO13_Pos) +#define CAN_TXBTO_TO14_Pos 14 /**< \brief (CAN_TXBTO) Transmission Occurred 14 */ +#define CAN_TXBTO_TO14 (0x1u << CAN_TXBTO_TO14_Pos) +#define CAN_TXBTO_TO15_Pos 15 /**< \brief (CAN_TXBTO) Transmission Occurred 15 */ +#define CAN_TXBTO_TO15 (0x1u << CAN_TXBTO_TO15_Pos) +#define CAN_TXBTO_TO16_Pos 16 /**< \brief (CAN_TXBTO) Transmission Occurred 16 */ +#define CAN_TXBTO_TO16 (0x1u << CAN_TXBTO_TO16_Pos) +#define CAN_TXBTO_TO17_Pos 17 /**< \brief (CAN_TXBTO) Transmission Occurred 17 */ +#define CAN_TXBTO_TO17 (0x1u << CAN_TXBTO_TO17_Pos) +#define CAN_TXBTO_TO18_Pos 18 /**< \brief (CAN_TXBTO) Transmission Occurred 18 */ +#define CAN_TXBTO_TO18 (0x1u << CAN_TXBTO_TO18_Pos) +#define CAN_TXBTO_TO19_Pos 19 /**< \brief (CAN_TXBTO) Transmission Occurred 19 */ +#define CAN_TXBTO_TO19 (0x1u << CAN_TXBTO_TO19_Pos) +#define CAN_TXBTO_TO20_Pos 20 /**< \brief (CAN_TXBTO) Transmission Occurred 20 */ +#define CAN_TXBTO_TO20 (0x1u << CAN_TXBTO_TO20_Pos) +#define CAN_TXBTO_TO21_Pos 21 /**< \brief (CAN_TXBTO) Transmission Occurred 21 */ +#define CAN_TXBTO_TO21 (0x1u << CAN_TXBTO_TO21_Pos) +#define CAN_TXBTO_TO22_Pos 22 /**< \brief (CAN_TXBTO) Transmission Occurred 22 */ +#define CAN_TXBTO_TO22 (0x1u << CAN_TXBTO_TO22_Pos) +#define CAN_TXBTO_TO23_Pos 23 /**< \brief (CAN_TXBTO) Transmission Occurred 23 */ +#define CAN_TXBTO_TO23 (0x1u << CAN_TXBTO_TO23_Pos) +#define CAN_TXBTO_TO24_Pos 24 /**< \brief (CAN_TXBTO) Transmission Occurred 24 */ +#define CAN_TXBTO_TO24 (0x1u << CAN_TXBTO_TO24_Pos) +#define CAN_TXBTO_TO25_Pos 25 /**< \brief (CAN_TXBTO) Transmission Occurred 25 */ +#define CAN_TXBTO_TO25 (0x1u << CAN_TXBTO_TO25_Pos) +#define CAN_TXBTO_TO26_Pos 26 /**< \brief (CAN_TXBTO) Transmission Occurred 26 */ +#define CAN_TXBTO_TO26 (0x1u << CAN_TXBTO_TO26_Pos) +#define CAN_TXBTO_TO27_Pos 27 /**< \brief (CAN_TXBTO) Transmission Occurred 27 */ +#define CAN_TXBTO_TO27 (0x1u << CAN_TXBTO_TO27_Pos) +#define CAN_TXBTO_TO28_Pos 28 /**< \brief (CAN_TXBTO) Transmission Occurred 28 */ +#define CAN_TXBTO_TO28 (0x1u << CAN_TXBTO_TO28_Pos) +#define CAN_TXBTO_TO29_Pos 29 /**< \brief (CAN_TXBTO) Transmission Occurred 29 */ +#define CAN_TXBTO_TO29 (0x1u << CAN_TXBTO_TO29_Pos) +#define CAN_TXBTO_TO30_Pos 30 /**< \brief (CAN_TXBTO) Transmission Occurred 30 */ +#define CAN_TXBTO_TO30 (0x1u << CAN_TXBTO_TO30_Pos) +#define CAN_TXBTO_TO31_Pos 31 /**< \brief (CAN_TXBTO) Transmission Occurred 31 */ +#define CAN_TXBTO_TO31 (0x1u << CAN_TXBTO_TO31_Pos) +#define CAN_TXBTO_MASK 0xFFFFFFFFu /**< \brief (CAN_TXBTO) MASK Register */ + +/* -------- CAN_TXBCF : (CAN Offset: 0xDC) (R/ 32) Tx Buffer Cancellation Finished -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t CF0:1; /*!< bit: 0 Tx Buffer Cancellation Finished 0 */ + uint32_t CF1:1; /*!< bit: 1 Tx Buffer Cancellation Finished 1 */ + uint32_t CF2:1; /*!< bit: 2 Tx Buffer Cancellation Finished 2 */ + uint32_t CF3:1; /*!< bit: 3 Tx Buffer Cancellation Finished 3 */ + uint32_t CF4:1; /*!< bit: 4 Tx Buffer Cancellation Finished 4 */ + uint32_t CF5:1; /*!< bit: 5 Tx Buffer Cancellation Finished 5 */ + uint32_t CF6:1; /*!< bit: 6 Tx Buffer Cancellation Finished 6 */ + uint32_t CF7:1; /*!< bit: 7 Tx Buffer Cancellation Finished 7 */ + uint32_t CF8:1; /*!< bit: 8 Tx Buffer Cancellation Finished 8 */ + uint32_t CF9:1; /*!< bit: 9 Tx Buffer Cancellation Finished 9 */ + uint32_t CF10:1; /*!< bit: 10 Tx Buffer Cancellation Finished 10 */ + uint32_t CF11:1; /*!< bit: 11 Tx Buffer Cancellation Finished 11 */ + uint32_t CF12:1; /*!< bit: 12 Tx Buffer Cancellation Finished 12 */ + uint32_t CF13:1; /*!< bit: 13 Tx Buffer Cancellation Finished 13 */ + uint32_t CF14:1; /*!< bit: 14 Tx Buffer Cancellation Finished 14 */ + uint32_t CF15:1; /*!< bit: 15 Tx Buffer Cancellation Finished 15 */ + uint32_t CF16:1; /*!< bit: 16 Tx Buffer Cancellation Finished 16 */ + uint32_t CF17:1; /*!< bit: 17 Tx Buffer Cancellation Finished 17 */ + uint32_t CF18:1; /*!< bit: 18 Tx Buffer Cancellation Finished 18 */ + uint32_t CF19:1; /*!< bit: 19 Tx Buffer Cancellation Finished 19 */ + uint32_t CF20:1; /*!< bit: 20 Tx Buffer Cancellation Finished 20 */ + uint32_t CF21:1; /*!< bit: 21 Tx Buffer Cancellation Finished 21 */ + uint32_t CF22:1; /*!< bit: 22 Tx Buffer Cancellation Finished 22 */ + uint32_t CF23:1; /*!< bit: 23 Tx Buffer Cancellation Finished 23 */ + uint32_t CF24:1; /*!< bit: 24 Tx Buffer Cancellation Finished 24 */ + uint32_t CF25:1; /*!< bit: 25 Tx Buffer Cancellation Finished 25 */ + uint32_t CF26:1; /*!< bit: 26 Tx Buffer Cancellation Finished 26 */ + uint32_t CF27:1; /*!< bit: 27 Tx Buffer Cancellation Finished 27 */ + uint32_t CF28:1; /*!< bit: 28 Tx Buffer Cancellation Finished 28 */ + uint32_t CF29:1; /*!< bit: 29 Tx Buffer Cancellation Finished 29 */ + uint32_t CF30:1; /*!< bit: 30 Tx Buffer Cancellation Finished 30 */ + uint32_t CF31:1; /*!< bit: 31 Tx Buffer Cancellation Finished 31 */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_TXBCF_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_TXBCF_OFFSET 0xDC /**< \brief (CAN_TXBCF offset) Tx Buffer Cancellation Finished */ +#define CAN_TXBCF_RESETVALUE 0x00000000u /**< \brief (CAN_TXBCF reset_value) Tx Buffer Cancellation Finished */ + +#define CAN_TXBCF_CF0_Pos 0 /**< \brief (CAN_TXBCF) Tx Buffer Cancellation Finished 0 */ +#define CAN_TXBCF_CF0 (0x1u << CAN_TXBCF_CF0_Pos) +#define CAN_TXBCF_CF1_Pos 1 /**< \brief (CAN_TXBCF) Tx Buffer Cancellation Finished 1 */ +#define CAN_TXBCF_CF1 (0x1u << CAN_TXBCF_CF1_Pos) +#define CAN_TXBCF_CF2_Pos 2 /**< \brief (CAN_TXBCF) Tx Buffer Cancellation Finished 2 */ +#define CAN_TXBCF_CF2 (0x1u << CAN_TXBCF_CF2_Pos) +#define CAN_TXBCF_CF3_Pos 3 /**< \brief (CAN_TXBCF) Tx Buffer Cancellation Finished 3 */ +#define CAN_TXBCF_CF3 (0x1u << CAN_TXBCF_CF3_Pos) +#define CAN_TXBCF_CF4_Pos 4 /**< \brief (CAN_TXBCF) Tx Buffer Cancellation Finished 4 */ +#define CAN_TXBCF_CF4 (0x1u << CAN_TXBCF_CF4_Pos) +#define CAN_TXBCF_CF5_Pos 5 /**< \brief (CAN_TXBCF) Tx Buffer Cancellation Finished 5 */ +#define CAN_TXBCF_CF5 (0x1u << CAN_TXBCF_CF5_Pos) +#define CAN_TXBCF_CF6_Pos 6 /**< \brief (CAN_TXBCF) Tx Buffer Cancellation Finished 6 */ +#define CAN_TXBCF_CF6 (0x1u << CAN_TXBCF_CF6_Pos) +#define CAN_TXBCF_CF7_Pos 7 /**< \brief (CAN_TXBCF) Tx Buffer Cancellation Finished 7 */ +#define CAN_TXBCF_CF7 (0x1u << CAN_TXBCF_CF7_Pos) +#define CAN_TXBCF_CF8_Pos 8 /**< \brief (CAN_TXBCF) Tx Buffer Cancellation Finished 8 */ +#define CAN_TXBCF_CF8 (0x1u << CAN_TXBCF_CF8_Pos) +#define CAN_TXBCF_CF9_Pos 9 /**< \brief (CAN_TXBCF) Tx Buffer Cancellation Finished 9 */ +#define CAN_TXBCF_CF9 (0x1u << CAN_TXBCF_CF9_Pos) +#define CAN_TXBCF_CF10_Pos 10 /**< \brief (CAN_TXBCF) Tx Buffer Cancellation Finished 10 */ +#define CAN_TXBCF_CF10 (0x1u << CAN_TXBCF_CF10_Pos) +#define CAN_TXBCF_CF11_Pos 11 /**< \brief (CAN_TXBCF) Tx Buffer Cancellation Finished 11 */ +#define CAN_TXBCF_CF11 (0x1u << CAN_TXBCF_CF11_Pos) +#define CAN_TXBCF_CF12_Pos 12 /**< \brief (CAN_TXBCF) Tx Buffer Cancellation Finished 12 */ +#define CAN_TXBCF_CF12 (0x1u << CAN_TXBCF_CF12_Pos) +#define CAN_TXBCF_CF13_Pos 13 /**< \brief (CAN_TXBCF) Tx Buffer Cancellation Finished 13 */ +#define CAN_TXBCF_CF13 (0x1u << CAN_TXBCF_CF13_Pos) +#define CAN_TXBCF_CF14_Pos 14 /**< \brief (CAN_TXBCF) Tx Buffer Cancellation Finished 14 */ +#define CAN_TXBCF_CF14 (0x1u << CAN_TXBCF_CF14_Pos) +#define CAN_TXBCF_CF15_Pos 15 /**< \brief (CAN_TXBCF) Tx Buffer Cancellation Finished 15 */ +#define CAN_TXBCF_CF15 (0x1u << CAN_TXBCF_CF15_Pos) +#define CAN_TXBCF_CF16_Pos 16 /**< \brief (CAN_TXBCF) Tx Buffer Cancellation Finished 16 */ +#define CAN_TXBCF_CF16 (0x1u << CAN_TXBCF_CF16_Pos) +#define CAN_TXBCF_CF17_Pos 17 /**< \brief (CAN_TXBCF) Tx Buffer Cancellation Finished 17 */ +#define CAN_TXBCF_CF17 (0x1u << CAN_TXBCF_CF17_Pos) +#define CAN_TXBCF_CF18_Pos 18 /**< \brief (CAN_TXBCF) Tx Buffer Cancellation Finished 18 */ +#define CAN_TXBCF_CF18 (0x1u << CAN_TXBCF_CF18_Pos) +#define CAN_TXBCF_CF19_Pos 19 /**< \brief (CAN_TXBCF) Tx Buffer Cancellation Finished 19 */ +#define CAN_TXBCF_CF19 (0x1u << CAN_TXBCF_CF19_Pos) +#define CAN_TXBCF_CF20_Pos 20 /**< \brief (CAN_TXBCF) Tx Buffer Cancellation Finished 20 */ +#define CAN_TXBCF_CF20 (0x1u << CAN_TXBCF_CF20_Pos) +#define CAN_TXBCF_CF21_Pos 21 /**< \brief (CAN_TXBCF) Tx Buffer Cancellation Finished 21 */ +#define CAN_TXBCF_CF21 (0x1u << CAN_TXBCF_CF21_Pos) +#define CAN_TXBCF_CF22_Pos 22 /**< \brief (CAN_TXBCF) Tx Buffer Cancellation Finished 22 */ +#define CAN_TXBCF_CF22 (0x1u << CAN_TXBCF_CF22_Pos) +#define CAN_TXBCF_CF23_Pos 23 /**< \brief (CAN_TXBCF) Tx Buffer Cancellation Finished 23 */ +#define CAN_TXBCF_CF23 (0x1u << CAN_TXBCF_CF23_Pos) +#define CAN_TXBCF_CF24_Pos 24 /**< \brief (CAN_TXBCF) Tx Buffer Cancellation Finished 24 */ +#define CAN_TXBCF_CF24 (0x1u << CAN_TXBCF_CF24_Pos) +#define CAN_TXBCF_CF25_Pos 25 /**< \brief (CAN_TXBCF) Tx Buffer Cancellation Finished 25 */ +#define CAN_TXBCF_CF25 (0x1u << CAN_TXBCF_CF25_Pos) +#define CAN_TXBCF_CF26_Pos 26 /**< \brief (CAN_TXBCF) Tx Buffer Cancellation Finished 26 */ +#define CAN_TXBCF_CF26 (0x1u << CAN_TXBCF_CF26_Pos) +#define CAN_TXBCF_CF27_Pos 27 /**< \brief (CAN_TXBCF) Tx Buffer Cancellation Finished 27 */ +#define CAN_TXBCF_CF27 (0x1u << CAN_TXBCF_CF27_Pos) +#define CAN_TXBCF_CF28_Pos 28 /**< \brief (CAN_TXBCF) Tx Buffer Cancellation Finished 28 */ +#define CAN_TXBCF_CF28 (0x1u << CAN_TXBCF_CF28_Pos) +#define CAN_TXBCF_CF29_Pos 29 /**< \brief (CAN_TXBCF) Tx Buffer Cancellation Finished 29 */ +#define CAN_TXBCF_CF29 (0x1u << CAN_TXBCF_CF29_Pos) +#define CAN_TXBCF_CF30_Pos 30 /**< \brief (CAN_TXBCF) Tx Buffer Cancellation Finished 30 */ +#define CAN_TXBCF_CF30 (0x1u << CAN_TXBCF_CF30_Pos) +#define CAN_TXBCF_CF31_Pos 31 /**< \brief (CAN_TXBCF) Tx Buffer Cancellation Finished 31 */ +#define CAN_TXBCF_CF31 (0x1u << CAN_TXBCF_CF31_Pos) +#define CAN_TXBCF_MASK 0xFFFFFFFFu /**< \brief (CAN_TXBCF) MASK Register */ + +/* -------- CAN_TXBTIE : (CAN Offset: 0xE0) (R/W 32) Tx Buffer Transmission Interrupt Enable -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t TIE0:1; /*!< bit: 0 Transmission Interrupt Enable 0 */ + uint32_t TIE1:1; /*!< bit: 1 Transmission Interrupt Enable 1 */ + uint32_t TIE2:1; /*!< bit: 2 Transmission Interrupt Enable 2 */ + uint32_t TIE3:1; /*!< bit: 3 Transmission Interrupt Enable 3 */ + uint32_t TIE4:1; /*!< bit: 4 Transmission Interrupt Enable 4 */ + uint32_t TIE5:1; /*!< bit: 5 Transmission Interrupt Enable 5 */ + uint32_t TIE6:1; /*!< bit: 6 Transmission Interrupt Enable 6 */ + uint32_t TIE7:1; /*!< bit: 7 Transmission Interrupt Enable 7 */ + uint32_t TIE8:1; /*!< bit: 8 Transmission Interrupt Enable 8 */ + uint32_t TIE9:1; /*!< bit: 9 Transmission Interrupt Enable 9 */ + uint32_t TIE10:1; /*!< bit: 10 Transmission Interrupt Enable 10 */ + uint32_t TIE11:1; /*!< bit: 11 Transmission Interrupt Enable 11 */ + uint32_t TIE12:1; /*!< bit: 12 Transmission Interrupt Enable 12 */ + uint32_t TIE13:1; /*!< bit: 13 Transmission Interrupt Enable 13 */ + uint32_t TIE14:1; /*!< bit: 14 Transmission Interrupt Enable 14 */ + uint32_t TIE15:1; /*!< bit: 15 Transmission Interrupt Enable 15 */ + uint32_t TIE16:1; /*!< bit: 16 Transmission Interrupt Enable 16 */ + uint32_t TIE17:1; /*!< bit: 17 Transmission Interrupt Enable 17 */ + uint32_t TIE18:1; /*!< bit: 18 Transmission Interrupt Enable 18 */ + uint32_t TIE19:1; /*!< bit: 19 Transmission Interrupt Enable 19 */ + uint32_t TIE20:1; /*!< bit: 20 Transmission Interrupt Enable 20 */ + uint32_t TIE21:1; /*!< bit: 21 Transmission Interrupt Enable 21 */ + uint32_t TIE22:1; /*!< bit: 22 Transmission Interrupt Enable 22 */ + uint32_t TIE23:1; /*!< bit: 23 Transmission Interrupt Enable 23 */ + uint32_t TIE24:1; /*!< bit: 24 Transmission Interrupt Enable 24 */ + uint32_t TIE25:1; /*!< bit: 25 Transmission Interrupt Enable 25 */ + uint32_t TIE26:1; /*!< bit: 26 Transmission Interrupt Enable 26 */ + uint32_t TIE27:1; /*!< bit: 27 Transmission Interrupt Enable 27 */ + uint32_t TIE28:1; /*!< bit: 28 Transmission Interrupt Enable 28 */ + uint32_t TIE29:1; /*!< bit: 29 Transmission Interrupt Enable 29 */ + uint32_t TIE30:1; /*!< bit: 30 Transmission Interrupt Enable 30 */ + uint32_t TIE31:1; /*!< bit: 31 Transmission Interrupt Enable 31 */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_TXBTIE_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_TXBTIE_OFFSET 0xE0 /**< \brief (CAN_TXBTIE offset) Tx Buffer Transmission Interrupt Enable */ +#define CAN_TXBTIE_RESETVALUE 0x00000000u /**< \brief (CAN_TXBTIE reset_value) Tx Buffer Transmission Interrupt Enable */ + +#define CAN_TXBTIE_TIE0_Pos 0 /**< \brief (CAN_TXBTIE) Transmission Interrupt Enable 0 */ +#define CAN_TXBTIE_TIE0 (0x1u << CAN_TXBTIE_TIE0_Pos) +#define CAN_TXBTIE_TIE1_Pos 1 /**< \brief (CAN_TXBTIE) Transmission Interrupt Enable 1 */ +#define CAN_TXBTIE_TIE1 (0x1u << CAN_TXBTIE_TIE1_Pos) +#define CAN_TXBTIE_TIE2_Pos 2 /**< \brief (CAN_TXBTIE) Transmission Interrupt Enable 2 */ +#define CAN_TXBTIE_TIE2 (0x1u << CAN_TXBTIE_TIE2_Pos) +#define CAN_TXBTIE_TIE3_Pos 3 /**< \brief (CAN_TXBTIE) Transmission Interrupt Enable 3 */ +#define CAN_TXBTIE_TIE3 (0x1u << CAN_TXBTIE_TIE3_Pos) +#define CAN_TXBTIE_TIE4_Pos 4 /**< \brief (CAN_TXBTIE) Transmission Interrupt Enable 4 */ +#define CAN_TXBTIE_TIE4 (0x1u << CAN_TXBTIE_TIE4_Pos) +#define CAN_TXBTIE_TIE5_Pos 5 /**< \brief (CAN_TXBTIE) Transmission Interrupt Enable 5 */ +#define CAN_TXBTIE_TIE5 (0x1u << CAN_TXBTIE_TIE5_Pos) +#define CAN_TXBTIE_TIE6_Pos 6 /**< \brief (CAN_TXBTIE) Transmission Interrupt Enable 6 */ +#define CAN_TXBTIE_TIE6 (0x1u << CAN_TXBTIE_TIE6_Pos) +#define CAN_TXBTIE_TIE7_Pos 7 /**< \brief (CAN_TXBTIE) Transmission Interrupt Enable 7 */ +#define CAN_TXBTIE_TIE7 (0x1u << CAN_TXBTIE_TIE7_Pos) +#define CAN_TXBTIE_TIE8_Pos 8 /**< \brief (CAN_TXBTIE) Transmission Interrupt Enable 8 */ +#define CAN_TXBTIE_TIE8 (0x1u << CAN_TXBTIE_TIE8_Pos) +#define CAN_TXBTIE_TIE9_Pos 9 /**< \brief (CAN_TXBTIE) Transmission Interrupt Enable 9 */ +#define CAN_TXBTIE_TIE9 (0x1u << CAN_TXBTIE_TIE9_Pos) +#define CAN_TXBTIE_TIE10_Pos 10 /**< \brief (CAN_TXBTIE) Transmission Interrupt Enable 10 */ +#define CAN_TXBTIE_TIE10 (0x1u << CAN_TXBTIE_TIE10_Pos) +#define CAN_TXBTIE_TIE11_Pos 11 /**< \brief (CAN_TXBTIE) Transmission Interrupt Enable 11 */ +#define CAN_TXBTIE_TIE11 (0x1u << CAN_TXBTIE_TIE11_Pos) +#define CAN_TXBTIE_TIE12_Pos 12 /**< \brief (CAN_TXBTIE) Transmission Interrupt Enable 12 */ +#define CAN_TXBTIE_TIE12 (0x1u << CAN_TXBTIE_TIE12_Pos) +#define CAN_TXBTIE_TIE13_Pos 13 /**< \brief (CAN_TXBTIE) Transmission Interrupt Enable 13 */ +#define CAN_TXBTIE_TIE13 (0x1u << CAN_TXBTIE_TIE13_Pos) +#define CAN_TXBTIE_TIE14_Pos 14 /**< \brief (CAN_TXBTIE) Transmission Interrupt Enable 14 */ +#define CAN_TXBTIE_TIE14 (0x1u << CAN_TXBTIE_TIE14_Pos) +#define CAN_TXBTIE_TIE15_Pos 15 /**< \brief (CAN_TXBTIE) Transmission Interrupt Enable 15 */ +#define CAN_TXBTIE_TIE15 (0x1u << CAN_TXBTIE_TIE15_Pos) +#define CAN_TXBTIE_TIE16_Pos 16 /**< \brief (CAN_TXBTIE) Transmission Interrupt Enable 16 */ +#define CAN_TXBTIE_TIE16 (0x1u << CAN_TXBTIE_TIE16_Pos) +#define CAN_TXBTIE_TIE17_Pos 17 /**< \brief (CAN_TXBTIE) Transmission Interrupt Enable 17 */ +#define CAN_TXBTIE_TIE17 (0x1u << CAN_TXBTIE_TIE17_Pos) +#define CAN_TXBTIE_TIE18_Pos 18 /**< \brief (CAN_TXBTIE) Transmission Interrupt Enable 18 */ +#define CAN_TXBTIE_TIE18 (0x1u << CAN_TXBTIE_TIE18_Pos) +#define CAN_TXBTIE_TIE19_Pos 19 /**< \brief (CAN_TXBTIE) Transmission Interrupt Enable 19 */ +#define CAN_TXBTIE_TIE19 (0x1u << CAN_TXBTIE_TIE19_Pos) +#define CAN_TXBTIE_TIE20_Pos 20 /**< \brief (CAN_TXBTIE) Transmission Interrupt Enable 20 */ +#define CAN_TXBTIE_TIE20 (0x1u << CAN_TXBTIE_TIE20_Pos) +#define CAN_TXBTIE_TIE21_Pos 21 /**< \brief (CAN_TXBTIE) Transmission Interrupt Enable 21 */ +#define CAN_TXBTIE_TIE21 (0x1u << CAN_TXBTIE_TIE21_Pos) +#define CAN_TXBTIE_TIE22_Pos 22 /**< \brief (CAN_TXBTIE) Transmission Interrupt Enable 22 */ +#define CAN_TXBTIE_TIE22 (0x1u << CAN_TXBTIE_TIE22_Pos) +#define CAN_TXBTIE_TIE23_Pos 23 /**< \brief (CAN_TXBTIE) Transmission Interrupt Enable 23 */ +#define CAN_TXBTIE_TIE23 (0x1u << CAN_TXBTIE_TIE23_Pos) +#define CAN_TXBTIE_TIE24_Pos 24 /**< \brief (CAN_TXBTIE) Transmission Interrupt Enable 24 */ +#define CAN_TXBTIE_TIE24 (0x1u << CAN_TXBTIE_TIE24_Pos) +#define CAN_TXBTIE_TIE25_Pos 25 /**< \brief (CAN_TXBTIE) Transmission Interrupt Enable 25 */ +#define CAN_TXBTIE_TIE25 (0x1u << CAN_TXBTIE_TIE25_Pos) +#define CAN_TXBTIE_TIE26_Pos 26 /**< \brief (CAN_TXBTIE) Transmission Interrupt Enable 26 */ +#define CAN_TXBTIE_TIE26 (0x1u << CAN_TXBTIE_TIE26_Pos) +#define CAN_TXBTIE_TIE27_Pos 27 /**< \brief (CAN_TXBTIE) Transmission Interrupt Enable 27 */ +#define CAN_TXBTIE_TIE27 (0x1u << CAN_TXBTIE_TIE27_Pos) +#define CAN_TXBTIE_TIE28_Pos 28 /**< \brief (CAN_TXBTIE) Transmission Interrupt Enable 28 */ +#define CAN_TXBTIE_TIE28 (0x1u << CAN_TXBTIE_TIE28_Pos) +#define CAN_TXBTIE_TIE29_Pos 29 /**< \brief (CAN_TXBTIE) Transmission Interrupt Enable 29 */ +#define CAN_TXBTIE_TIE29 (0x1u << CAN_TXBTIE_TIE29_Pos) +#define CAN_TXBTIE_TIE30_Pos 30 /**< \brief (CAN_TXBTIE) Transmission Interrupt Enable 30 */ +#define CAN_TXBTIE_TIE30 (0x1u << CAN_TXBTIE_TIE30_Pos) +#define CAN_TXBTIE_TIE31_Pos 31 /**< \brief (CAN_TXBTIE) Transmission Interrupt Enable 31 */ +#define CAN_TXBTIE_TIE31 (0x1u << CAN_TXBTIE_TIE31_Pos) +#define CAN_TXBTIE_MASK 0xFFFFFFFFu /**< \brief (CAN_TXBTIE) MASK Register */ + +/* -------- CAN_TXBCIE : (CAN Offset: 0xE4) (R/W 32) Tx Buffer Cancellation Finished Interrupt Enable -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t CFIE0:1; /*!< bit: 0 Cancellation Finished Interrupt Enable 0 */ + uint32_t CFIE1:1; /*!< bit: 1 Cancellation Finished Interrupt Enable 1 */ + uint32_t CFIE2:1; /*!< bit: 2 Cancellation Finished Interrupt Enable 2 */ + uint32_t CFIE3:1; /*!< bit: 3 Cancellation Finished Interrupt Enable 3 */ + uint32_t CFIE4:1; /*!< bit: 4 Cancellation Finished Interrupt Enable 4 */ + uint32_t CFIE5:1; /*!< bit: 5 Cancellation Finished Interrupt Enable 5 */ + uint32_t CFIE6:1; /*!< bit: 6 Cancellation Finished Interrupt Enable 6 */ + uint32_t CFIE7:1; /*!< bit: 7 Cancellation Finished Interrupt Enable 7 */ + uint32_t CFIE8:1; /*!< bit: 8 Cancellation Finished Interrupt Enable 8 */ + uint32_t CFIE9:1; /*!< bit: 9 Cancellation Finished Interrupt Enable 9 */ + uint32_t CFIE10:1; /*!< bit: 10 Cancellation Finished Interrupt Enable 10 */ + uint32_t CFIE11:1; /*!< bit: 11 Cancellation Finished Interrupt Enable 11 */ + uint32_t CFIE12:1; /*!< bit: 12 Cancellation Finished Interrupt Enable 12 */ + uint32_t CFIE13:1; /*!< bit: 13 Cancellation Finished Interrupt Enable 13 */ + uint32_t CFIE14:1; /*!< bit: 14 Cancellation Finished Interrupt Enable 14 */ + uint32_t CFIE15:1; /*!< bit: 15 Cancellation Finished Interrupt Enable 15 */ + uint32_t CFIE16:1; /*!< bit: 16 Cancellation Finished Interrupt Enable 16 */ + uint32_t CFIE17:1; /*!< bit: 17 Cancellation Finished Interrupt Enable 17 */ + uint32_t CFIE18:1; /*!< bit: 18 Cancellation Finished Interrupt Enable 18 */ + uint32_t CFIE19:1; /*!< bit: 19 Cancellation Finished Interrupt Enable 19 */ + uint32_t CFIE20:1; /*!< bit: 20 Cancellation Finished Interrupt Enable 20 */ + uint32_t CFIE21:1; /*!< bit: 21 Cancellation Finished Interrupt Enable 21 */ + uint32_t CFIE22:1; /*!< bit: 22 Cancellation Finished Interrupt Enable 22 */ + uint32_t CFIE23:1; /*!< bit: 23 Cancellation Finished Interrupt Enable 23 */ + uint32_t CFIE24:1; /*!< bit: 24 Cancellation Finished Interrupt Enable 24 */ + uint32_t CFIE25:1; /*!< bit: 25 Cancellation Finished Interrupt Enable 25 */ + uint32_t CFIE26:1; /*!< bit: 26 Cancellation Finished Interrupt Enable 26 */ + uint32_t CFIE27:1; /*!< bit: 27 Cancellation Finished Interrupt Enable 27 */ + uint32_t CFIE28:1; /*!< bit: 28 Cancellation Finished Interrupt Enable 28 */ + uint32_t CFIE29:1; /*!< bit: 29 Cancellation Finished Interrupt Enable 29 */ + uint32_t CFIE30:1; /*!< bit: 30 Cancellation Finished Interrupt Enable 30 */ + uint32_t CFIE31:1; /*!< bit: 31 Cancellation Finished Interrupt Enable 31 */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_TXBCIE_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_TXBCIE_OFFSET 0xE4 /**< \brief (CAN_TXBCIE offset) Tx Buffer Cancellation Finished Interrupt Enable */ +#define CAN_TXBCIE_RESETVALUE 0x00000000u /**< \brief (CAN_TXBCIE reset_value) Tx Buffer Cancellation Finished Interrupt Enable */ + +#define CAN_TXBCIE_CFIE0_Pos 0 /**< \brief (CAN_TXBCIE) Cancellation Finished Interrupt Enable 0 */ +#define CAN_TXBCIE_CFIE0 (0x1u << CAN_TXBCIE_CFIE0_Pos) +#define CAN_TXBCIE_CFIE1_Pos 1 /**< \brief (CAN_TXBCIE) Cancellation Finished Interrupt Enable 1 */ +#define CAN_TXBCIE_CFIE1 (0x1u << CAN_TXBCIE_CFIE1_Pos) +#define CAN_TXBCIE_CFIE2_Pos 2 /**< \brief (CAN_TXBCIE) Cancellation Finished Interrupt Enable 2 */ +#define CAN_TXBCIE_CFIE2 (0x1u << CAN_TXBCIE_CFIE2_Pos) +#define CAN_TXBCIE_CFIE3_Pos 3 /**< \brief (CAN_TXBCIE) Cancellation Finished Interrupt Enable 3 */ +#define CAN_TXBCIE_CFIE3 (0x1u << CAN_TXBCIE_CFIE3_Pos) +#define CAN_TXBCIE_CFIE4_Pos 4 /**< \brief (CAN_TXBCIE) Cancellation Finished Interrupt Enable 4 */ +#define CAN_TXBCIE_CFIE4 (0x1u << CAN_TXBCIE_CFIE4_Pos) +#define CAN_TXBCIE_CFIE5_Pos 5 /**< \brief (CAN_TXBCIE) Cancellation Finished Interrupt Enable 5 */ +#define CAN_TXBCIE_CFIE5 (0x1u << CAN_TXBCIE_CFIE5_Pos) +#define CAN_TXBCIE_CFIE6_Pos 6 /**< \brief (CAN_TXBCIE) Cancellation Finished Interrupt Enable 6 */ +#define CAN_TXBCIE_CFIE6 (0x1u << CAN_TXBCIE_CFIE6_Pos) +#define CAN_TXBCIE_CFIE7_Pos 7 /**< \brief (CAN_TXBCIE) Cancellation Finished Interrupt Enable 7 */ +#define CAN_TXBCIE_CFIE7 (0x1u << CAN_TXBCIE_CFIE7_Pos) +#define CAN_TXBCIE_CFIE8_Pos 8 /**< \brief (CAN_TXBCIE) Cancellation Finished Interrupt Enable 8 */ +#define CAN_TXBCIE_CFIE8 (0x1u << CAN_TXBCIE_CFIE8_Pos) +#define CAN_TXBCIE_CFIE9_Pos 9 /**< \brief (CAN_TXBCIE) Cancellation Finished Interrupt Enable 9 */ +#define CAN_TXBCIE_CFIE9 (0x1u << CAN_TXBCIE_CFIE9_Pos) +#define CAN_TXBCIE_CFIE10_Pos 10 /**< \brief (CAN_TXBCIE) Cancellation Finished Interrupt Enable 10 */ +#define CAN_TXBCIE_CFIE10 (0x1u << CAN_TXBCIE_CFIE10_Pos) +#define CAN_TXBCIE_CFIE11_Pos 11 /**< \brief (CAN_TXBCIE) Cancellation Finished Interrupt Enable 11 */ +#define CAN_TXBCIE_CFIE11 (0x1u << CAN_TXBCIE_CFIE11_Pos) +#define CAN_TXBCIE_CFIE12_Pos 12 /**< \brief (CAN_TXBCIE) Cancellation Finished Interrupt Enable 12 */ +#define CAN_TXBCIE_CFIE12 (0x1u << CAN_TXBCIE_CFIE12_Pos) +#define CAN_TXBCIE_CFIE13_Pos 13 /**< \brief (CAN_TXBCIE) Cancellation Finished Interrupt Enable 13 */ +#define CAN_TXBCIE_CFIE13 (0x1u << CAN_TXBCIE_CFIE13_Pos) +#define CAN_TXBCIE_CFIE14_Pos 14 /**< \brief (CAN_TXBCIE) Cancellation Finished Interrupt Enable 14 */ +#define CAN_TXBCIE_CFIE14 (0x1u << CAN_TXBCIE_CFIE14_Pos) +#define CAN_TXBCIE_CFIE15_Pos 15 /**< \brief (CAN_TXBCIE) Cancellation Finished Interrupt Enable 15 */ +#define CAN_TXBCIE_CFIE15 (0x1u << CAN_TXBCIE_CFIE15_Pos) +#define CAN_TXBCIE_CFIE16_Pos 16 /**< \brief (CAN_TXBCIE) Cancellation Finished Interrupt Enable 16 */ +#define CAN_TXBCIE_CFIE16 (0x1u << CAN_TXBCIE_CFIE16_Pos) +#define CAN_TXBCIE_CFIE17_Pos 17 /**< \brief (CAN_TXBCIE) Cancellation Finished Interrupt Enable 17 */ +#define CAN_TXBCIE_CFIE17 (0x1u << CAN_TXBCIE_CFIE17_Pos) +#define CAN_TXBCIE_CFIE18_Pos 18 /**< \brief (CAN_TXBCIE) Cancellation Finished Interrupt Enable 18 */ +#define CAN_TXBCIE_CFIE18 (0x1u << CAN_TXBCIE_CFIE18_Pos) +#define CAN_TXBCIE_CFIE19_Pos 19 /**< \brief (CAN_TXBCIE) Cancellation Finished Interrupt Enable 19 */ +#define CAN_TXBCIE_CFIE19 (0x1u << CAN_TXBCIE_CFIE19_Pos) +#define CAN_TXBCIE_CFIE20_Pos 20 /**< \brief (CAN_TXBCIE) Cancellation Finished Interrupt Enable 20 */ +#define CAN_TXBCIE_CFIE20 (0x1u << CAN_TXBCIE_CFIE20_Pos) +#define CAN_TXBCIE_CFIE21_Pos 21 /**< \brief (CAN_TXBCIE) Cancellation Finished Interrupt Enable 21 */ +#define CAN_TXBCIE_CFIE21 (0x1u << CAN_TXBCIE_CFIE21_Pos) +#define CAN_TXBCIE_CFIE22_Pos 22 /**< \brief (CAN_TXBCIE) Cancellation Finished Interrupt Enable 22 */ +#define CAN_TXBCIE_CFIE22 (0x1u << CAN_TXBCIE_CFIE22_Pos) +#define CAN_TXBCIE_CFIE23_Pos 23 /**< \brief (CAN_TXBCIE) Cancellation Finished Interrupt Enable 23 */ +#define CAN_TXBCIE_CFIE23 (0x1u << CAN_TXBCIE_CFIE23_Pos) +#define CAN_TXBCIE_CFIE24_Pos 24 /**< \brief (CAN_TXBCIE) Cancellation Finished Interrupt Enable 24 */ +#define CAN_TXBCIE_CFIE24 (0x1u << CAN_TXBCIE_CFIE24_Pos) +#define CAN_TXBCIE_CFIE25_Pos 25 /**< \brief (CAN_TXBCIE) Cancellation Finished Interrupt Enable 25 */ +#define CAN_TXBCIE_CFIE25 (0x1u << CAN_TXBCIE_CFIE25_Pos) +#define CAN_TXBCIE_CFIE26_Pos 26 /**< \brief (CAN_TXBCIE) Cancellation Finished Interrupt Enable 26 */ +#define CAN_TXBCIE_CFIE26 (0x1u << CAN_TXBCIE_CFIE26_Pos) +#define CAN_TXBCIE_CFIE27_Pos 27 /**< \brief (CAN_TXBCIE) Cancellation Finished Interrupt Enable 27 */ +#define CAN_TXBCIE_CFIE27 (0x1u << CAN_TXBCIE_CFIE27_Pos) +#define CAN_TXBCIE_CFIE28_Pos 28 /**< \brief (CAN_TXBCIE) Cancellation Finished Interrupt Enable 28 */ +#define CAN_TXBCIE_CFIE28 (0x1u << CAN_TXBCIE_CFIE28_Pos) +#define CAN_TXBCIE_CFIE29_Pos 29 /**< \brief (CAN_TXBCIE) Cancellation Finished Interrupt Enable 29 */ +#define CAN_TXBCIE_CFIE29 (0x1u << CAN_TXBCIE_CFIE29_Pos) +#define CAN_TXBCIE_CFIE30_Pos 30 /**< \brief (CAN_TXBCIE) Cancellation Finished Interrupt Enable 30 */ +#define CAN_TXBCIE_CFIE30 (0x1u << CAN_TXBCIE_CFIE30_Pos) +#define CAN_TXBCIE_CFIE31_Pos 31 /**< \brief (CAN_TXBCIE) Cancellation Finished Interrupt Enable 31 */ +#define CAN_TXBCIE_CFIE31 (0x1u << CAN_TXBCIE_CFIE31_Pos) +#define CAN_TXBCIE_MASK 0xFFFFFFFFu /**< \brief (CAN_TXBCIE) MASK Register */ + +/* -------- CAN_TXEFC : (CAN Offset: 0xF0) (R/W 32) Tx Event FIFO Configuration -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t EFSA:16; /*!< bit: 0..15 Event FIFO Start Address */ + uint32_t EFS:6; /*!< bit: 16..21 Event FIFO Size */ + uint32_t :2; /*!< bit: 22..23 Reserved */ + uint32_t EFWM:6; /*!< bit: 24..29 Event FIFO Watermark */ + uint32_t :2; /*!< bit: 30..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_TXEFC_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_TXEFC_OFFSET 0xF0 /**< \brief (CAN_TXEFC offset) Tx Event FIFO Configuration */ +#define CAN_TXEFC_RESETVALUE 0x00000000u /**< \brief (CAN_TXEFC reset_value) Tx Event FIFO Configuration */ + +#define CAN_TXEFC_EFSA_Pos 0 /**< \brief (CAN_TXEFC) Event FIFO Start Address */ +#define CAN_TXEFC_EFSA_Msk (0xFFFFu << CAN_TXEFC_EFSA_Pos) +#define CAN_TXEFC_EFSA(value) (CAN_TXEFC_EFSA_Msk & ((value) << CAN_TXEFC_EFSA_Pos)) +#define CAN_TXEFC_EFS_Pos 16 /**< \brief (CAN_TXEFC) Event FIFO Size */ +#define CAN_TXEFC_EFS_Msk (0x3Fu << CAN_TXEFC_EFS_Pos) +#define CAN_TXEFC_EFS(value) (CAN_TXEFC_EFS_Msk & ((value) << CAN_TXEFC_EFS_Pos)) +#define CAN_TXEFC_EFWM_Pos 24 /**< \brief (CAN_TXEFC) Event FIFO Watermark */ +#define CAN_TXEFC_EFWM_Msk (0x3Fu << CAN_TXEFC_EFWM_Pos) +#define CAN_TXEFC_EFWM(value) (CAN_TXEFC_EFWM_Msk & ((value) << CAN_TXEFC_EFWM_Pos)) +#define CAN_TXEFC_MASK 0x3F3FFFFFu /**< \brief (CAN_TXEFC) MASK Register */ + +/* -------- CAN_TXEFS : (CAN Offset: 0xF4) (R/ 32) Tx Event FIFO Status -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t EFFL:6; /*!< bit: 0.. 5 Event FIFO Fill Level */ + uint32_t :2; /*!< bit: 6.. 7 Reserved */ + uint32_t EFGI:5; /*!< bit: 8..12 Event FIFO Get Index */ + uint32_t :3; /*!< bit: 13..15 Reserved */ + uint32_t EFPI:5; /*!< bit: 16..20 Event FIFO Put Index */ + uint32_t :3; /*!< bit: 21..23 Reserved */ + uint32_t EFF:1; /*!< bit: 24 Event FIFO Full */ + uint32_t TEFL:1; /*!< bit: 25 Tx Event FIFO Element Lost */ + uint32_t :6; /*!< bit: 26..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_TXEFS_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_TXEFS_OFFSET 0xF4 /**< \brief (CAN_TXEFS offset) Tx Event FIFO Status */ +#define CAN_TXEFS_RESETVALUE 0x00000000u /**< \brief (CAN_TXEFS reset_value) Tx Event FIFO Status */ + +#define CAN_TXEFS_EFFL_Pos 0 /**< \brief (CAN_TXEFS) Event FIFO Fill Level */ +#define CAN_TXEFS_EFFL_Msk (0x3Fu << CAN_TXEFS_EFFL_Pos) +#define CAN_TXEFS_EFFL(value) (CAN_TXEFS_EFFL_Msk & ((value) << CAN_TXEFS_EFFL_Pos)) +#define CAN_TXEFS_EFGI_Pos 8 /**< \brief (CAN_TXEFS) Event FIFO Get Index */ +#define CAN_TXEFS_EFGI_Msk (0x1Fu << CAN_TXEFS_EFGI_Pos) +#define CAN_TXEFS_EFGI(value) (CAN_TXEFS_EFGI_Msk & ((value) << CAN_TXEFS_EFGI_Pos)) +#define CAN_TXEFS_EFPI_Pos 16 /**< \brief (CAN_TXEFS) Event FIFO Put Index */ +#define CAN_TXEFS_EFPI_Msk (0x1Fu << CAN_TXEFS_EFPI_Pos) +#define CAN_TXEFS_EFPI(value) (CAN_TXEFS_EFPI_Msk & ((value) << CAN_TXEFS_EFPI_Pos)) +#define CAN_TXEFS_EFF_Pos 24 /**< \brief (CAN_TXEFS) Event FIFO Full */ +#define CAN_TXEFS_EFF (0x1u << CAN_TXEFS_EFF_Pos) +#define CAN_TXEFS_TEFL_Pos 25 /**< \brief (CAN_TXEFS) Tx Event FIFO Element Lost */ +#define CAN_TXEFS_TEFL (0x1u << CAN_TXEFS_TEFL_Pos) +#define CAN_TXEFS_MASK 0x031F1F3Fu /**< \brief (CAN_TXEFS) MASK Register */ + +/* -------- CAN_TXEFA : (CAN Offset: 0xF8) (R/W 32) Tx Event FIFO Acknowledge -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t EFAI:5; /*!< bit: 0.. 4 Event FIFO Acknowledge Index */ + uint32_t :27; /*!< bit: 5..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_TXEFA_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_TXEFA_OFFSET 0xF8 /**< \brief (CAN_TXEFA offset) Tx Event FIFO Acknowledge */ +#define CAN_TXEFA_RESETVALUE 0x00000000u /**< \brief (CAN_TXEFA reset_value) Tx Event FIFO Acknowledge */ + +#define CAN_TXEFA_EFAI_Pos 0 /**< \brief (CAN_TXEFA) Event FIFO Acknowledge Index */ +#define CAN_TXEFA_EFAI_Msk (0x1Fu << CAN_TXEFA_EFAI_Pos) +#define CAN_TXEFA_EFAI(value) (CAN_TXEFA_EFAI_Msk & ((value) << CAN_TXEFA_EFAI_Pos)) +#define CAN_TXEFA_MASK 0x0000001Fu /**< \brief (CAN_TXEFA) MASK Register */ + +/* -------- CAN_RXBE_0 : (CAN Offset: 0x00) (R/W 32) Rx Buffer Element 0 -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t ID:29; /*!< bit: 0..28 Identifier */ + uint32_t RTR:1; /*!< bit: 29 Remote Transmission Request */ + uint32_t XTD:1; /*!< bit: 30 Extended Identifier */ + uint32_t ESI:1; /*!< bit: 31 Error State Indicator */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_RXBE_0_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_RXBE_0_OFFSET 0x00 /**< \brief (CAN_RXBE_0 offset) Rx Buffer Element 0 */ +#define CAN_RXBE_0_RESETVALUE 0x00000000u /**< \brief (CAN_RXBE_0 reset_value) Rx Buffer Element 0 */ + +#define CAN_RXBE_0_ID_Pos 0 /**< \brief (CAN_RXBE_0) Identifier */ +#define CAN_RXBE_0_ID_Msk (0x1FFFFFFFu << CAN_RXBE_0_ID_Pos) +#define CAN_RXBE_0_ID(value) (CAN_RXBE_0_ID_Msk & ((value) << CAN_RXBE_0_ID_Pos)) +#define CAN_RXBE_0_RTR_Pos 29 /**< \brief (CAN_RXBE_0) Remote Transmission Request */ +#define CAN_RXBE_0_RTR (0x1u << CAN_RXBE_0_RTR_Pos) +#define CAN_RXBE_0_XTD_Pos 30 /**< \brief (CAN_RXBE_0) Extended Identifier */ +#define CAN_RXBE_0_XTD (0x1u << CAN_RXBE_0_XTD_Pos) +#define CAN_RXBE_0_ESI_Pos 31 /**< \brief (CAN_RXBE_0) Error State Indicator */ +#define CAN_RXBE_0_ESI (0x1u << CAN_RXBE_0_ESI_Pos) +#define CAN_RXBE_0_MASK 0xFFFFFFFFu /**< \brief (CAN_RXBE_0) MASK Register */ + +/* -------- CAN_RXBE_1 : (CAN Offset: 0x04) (R/W 32) Rx Buffer Element 1 -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t RXTS:16; /*!< bit: 0..15 Rx Timestamp */ + uint32_t DLC:4; /*!< bit: 16..19 Data Length Code */ + uint32_t BRS:1; /*!< bit: 20 Bit Rate Search */ + uint32_t FDF:1; /*!< bit: 21 FD Format */ + uint32_t :2; /*!< bit: 22..23 Reserved */ + uint32_t FIDX:7; /*!< bit: 24..30 Filter Index */ + uint32_t ANMF:1; /*!< bit: 31 Accepted Non-matching Frame */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_RXBE_1_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_RXBE_1_OFFSET 0x04 /**< \brief (CAN_RXBE_1 offset) Rx Buffer Element 1 */ +#define CAN_RXBE_1_RESETVALUE 0x00000000u /**< \brief (CAN_RXBE_1 reset_value) Rx Buffer Element 1 */ + +#define CAN_RXBE_1_RXTS_Pos 0 /**< \brief (CAN_RXBE_1) Rx Timestamp */ +#define CAN_RXBE_1_RXTS_Msk (0xFFFFu << CAN_RXBE_1_RXTS_Pos) +#define CAN_RXBE_1_RXTS(value) (CAN_RXBE_1_RXTS_Msk & ((value) << CAN_RXBE_1_RXTS_Pos)) +#define CAN_RXBE_1_DLC_Pos 16 /**< \brief (CAN_RXBE_1) Data Length Code */ +#define CAN_RXBE_1_DLC_Msk (0xFu << CAN_RXBE_1_DLC_Pos) +#define CAN_RXBE_1_DLC(value) (CAN_RXBE_1_DLC_Msk & ((value) << CAN_RXBE_1_DLC_Pos)) +#define CAN_RXBE_1_BRS_Pos 20 /**< \brief (CAN_RXBE_1) Bit Rate Search */ +#define CAN_RXBE_1_BRS (0x1u << CAN_RXBE_1_BRS_Pos) +#define CAN_RXBE_1_FDF_Pos 21 /**< \brief (CAN_RXBE_1) FD Format */ +#define CAN_RXBE_1_FDF (0x1u << CAN_RXBE_1_FDF_Pos) +#define CAN_RXBE_1_FIDX_Pos 24 /**< \brief (CAN_RXBE_1) Filter Index */ +#define CAN_RXBE_1_FIDX_Msk (0x7Fu << CAN_RXBE_1_FIDX_Pos) +#define CAN_RXBE_1_FIDX(value) (CAN_RXBE_1_FIDX_Msk & ((value) << CAN_RXBE_1_FIDX_Pos)) +#define CAN_RXBE_1_ANMF_Pos 31 /**< \brief (CAN_RXBE_1) Accepted Non-matching Frame */ +#define CAN_RXBE_1_ANMF (0x1u << CAN_RXBE_1_ANMF_Pos) +#define CAN_RXBE_1_MASK 0xFF3FFFFFu /**< \brief (CAN_RXBE_1) MASK Register */ + +/* -------- CAN_RXBE_DATA : (CAN Offset: 0x08) (R/W 32) Rx Buffer Element Data -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t DB0:8; /*!< bit: 0.. 7 Data Byte 0 */ + uint32_t DB1:8; /*!< bit: 8..15 Data Byte 1 */ + uint32_t DB2:8; /*!< bit: 16..23 Data Byte 2 */ + uint32_t DB3:8; /*!< bit: 24..31 Data Byte 3 */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_RXBE_DATA_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_RXBE_DATA_OFFSET 0x08 /**< \brief (CAN_RXBE_DATA offset) Rx Buffer Element Data */ +#define CAN_RXBE_DATA_RESETVALUE 0x00000000u /**< \brief (CAN_RXBE_DATA reset_value) Rx Buffer Element Data */ + +#define CAN_RXBE_DATA_DB0_Pos 0 /**< \brief (CAN_RXBE_DATA) Data Byte 0 */ +#define CAN_RXBE_DATA_DB0_Msk (0xFFu << CAN_RXBE_DATA_DB0_Pos) +#define CAN_RXBE_DATA_DB0(value) (CAN_RXBE_DATA_DB0_Msk & ((value) << CAN_RXBE_DATA_DB0_Pos)) +#define CAN_RXBE_DATA_DB1_Pos 8 /**< \brief (CAN_RXBE_DATA) Data Byte 1 */ +#define CAN_RXBE_DATA_DB1_Msk (0xFFu << CAN_RXBE_DATA_DB1_Pos) +#define CAN_RXBE_DATA_DB1(value) (CAN_RXBE_DATA_DB1_Msk & ((value) << CAN_RXBE_DATA_DB1_Pos)) +#define CAN_RXBE_DATA_DB2_Pos 16 /**< \brief (CAN_RXBE_DATA) Data Byte 2 */ +#define CAN_RXBE_DATA_DB2_Msk (0xFFu << CAN_RXBE_DATA_DB2_Pos) +#define CAN_RXBE_DATA_DB2(value) (CAN_RXBE_DATA_DB2_Msk & ((value) << CAN_RXBE_DATA_DB2_Pos)) +#define CAN_RXBE_DATA_DB3_Pos 24 /**< \brief (CAN_RXBE_DATA) Data Byte 3 */ +#define CAN_RXBE_DATA_DB3_Msk (0xFFu << CAN_RXBE_DATA_DB3_Pos) +#define CAN_RXBE_DATA_DB3(value) (CAN_RXBE_DATA_DB3_Msk & ((value) << CAN_RXBE_DATA_DB3_Pos)) +#define CAN_RXBE_DATA_MASK 0xFFFFFFFFu /**< \brief (CAN_RXBE_DATA) MASK Register */ + +/* -------- CAN_RXF0E_0 : (CAN Offset: 0x00) (R/W 32) Rx FIFO 0 Element 0 -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t ID:29; /*!< bit: 0..28 Identifier */ + uint32_t RTR:1; /*!< bit: 29 Remote Transmission Request */ + uint32_t XTD:1; /*!< bit: 30 Extended Identifier */ + uint32_t ESI:1; /*!< bit: 31 Error State Indicator */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_RXF0E_0_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_RXF0E_0_OFFSET 0x00 /**< \brief (CAN_RXF0E_0 offset) Rx FIFO 0 Element 0 */ +#define CAN_RXF0E_0_RESETVALUE 0x00000000u /**< \brief (CAN_RXF0E_0 reset_value) Rx FIFO 0 Element 0 */ + +#define CAN_RXF0E_0_ID_Pos 0 /**< \brief (CAN_RXF0E_0) Identifier */ +#define CAN_RXF0E_0_ID_Msk (0x1FFFFFFFu << CAN_RXF0E_0_ID_Pos) +#define CAN_RXF0E_0_ID(value) (CAN_RXF0E_0_ID_Msk & ((value) << CAN_RXF0E_0_ID_Pos)) +#define CAN_RXF0E_0_RTR_Pos 29 /**< \brief (CAN_RXF0E_0) Remote Transmission Request */ +#define CAN_RXF0E_0_RTR (0x1u << CAN_RXF0E_0_RTR_Pos) +#define CAN_RXF0E_0_XTD_Pos 30 /**< \brief (CAN_RXF0E_0) Extended Identifier */ +#define CAN_RXF0E_0_XTD (0x1u << CAN_RXF0E_0_XTD_Pos) +#define CAN_RXF0E_0_ESI_Pos 31 /**< \brief (CAN_RXF0E_0) Error State Indicator */ +#define CAN_RXF0E_0_ESI (0x1u << CAN_RXF0E_0_ESI_Pos) +#define CAN_RXF0E_0_MASK 0xFFFFFFFFu /**< \brief (CAN_RXF0E_0) MASK Register */ + +/* -------- CAN_RXF0E_1 : (CAN Offset: 0x04) (R/W 32) Rx FIFO 0 Element 1 -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t RXTS:16; /*!< bit: 0..15 Rx Timestamp */ + uint32_t DLC:4; /*!< bit: 16..19 Data Length Code */ + uint32_t BRS:1; /*!< bit: 20 Bit Rate Search */ + uint32_t FDF:1; /*!< bit: 21 FD Format */ + uint32_t :2; /*!< bit: 22..23 Reserved */ + uint32_t FIDX:7; /*!< bit: 24..30 Filter Index */ + uint32_t ANMF:1; /*!< bit: 31 Accepted Non-matching Frame */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_RXF0E_1_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_RXF0E_1_OFFSET 0x04 /**< \brief (CAN_RXF0E_1 offset) Rx FIFO 0 Element 1 */ +#define CAN_RXF0E_1_RESETVALUE 0x00000000u /**< \brief (CAN_RXF0E_1 reset_value) Rx FIFO 0 Element 1 */ + +#define CAN_RXF0E_1_RXTS_Pos 0 /**< \brief (CAN_RXF0E_1) Rx Timestamp */ +#define CAN_RXF0E_1_RXTS_Msk (0xFFFFu << CAN_RXF0E_1_RXTS_Pos) +#define CAN_RXF0E_1_RXTS(value) (CAN_RXF0E_1_RXTS_Msk & ((value) << CAN_RXF0E_1_RXTS_Pos)) +#define CAN_RXF0E_1_DLC_Pos 16 /**< \brief (CAN_RXF0E_1) Data Length Code */ +#define CAN_RXF0E_1_DLC_Msk (0xFu << CAN_RXF0E_1_DLC_Pos) +#define CAN_RXF0E_1_DLC(value) (CAN_RXF0E_1_DLC_Msk & ((value) << CAN_RXF0E_1_DLC_Pos)) +#define CAN_RXF0E_1_BRS_Pos 20 /**< \brief (CAN_RXF0E_1) Bit Rate Search */ +#define CAN_RXF0E_1_BRS (0x1u << CAN_RXF0E_1_BRS_Pos) +#define CAN_RXF0E_1_FDF_Pos 21 /**< \brief (CAN_RXF0E_1) FD Format */ +#define CAN_RXF0E_1_FDF (0x1u << CAN_RXF0E_1_FDF_Pos) +#define CAN_RXF0E_1_FIDX_Pos 24 /**< \brief (CAN_RXF0E_1) Filter Index */ +#define CAN_RXF0E_1_FIDX_Msk (0x7Fu << CAN_RXF0E_1_FIDX_Pos) +#define CAN_RXF0E_1_FIDX(value) (CAN_RXF0E_1_FIDX_Msk & ((value) << CAN_RXF0E_1_FIDX_Pos)) +#define CAN_RXF0E_1_ANMF_Pos 31 /**< \brief (CAN_RXF0E_1) Accepted Non-matching Frame */ +#define CAN_RXF0E_1_ANMF (0x1u << CAN_RXF0E_1_ANMF_Pos) +#define CAN_RXF0E_1_MASK 0xFF3FFFFFu /**< \brief (CAN_RXF0E_1) MASK Register */ + +/* -------- CAN_RXF0E_DATA : (CAN Offset: 0x08) (R/W 32) Rx FIFO 0 Element Data -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t DB0:8; /*!< bit: 0.. 7 Data Byte 0 */ + uint32_t DB1:8; /*!< bit: 8..15 Data Byte 1 */ + uint32_t DB2:8; /*!< bit: 16..23 Data Byte 2 */ + uint32_t DB3:8; /*!< bit: 24..31 Data Byte 3 */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_RXF0E_DATA_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_RXF0E_DATA_OFFSET 0x08 /**< \brief (CAN_RXF0E_DATA offset) Rx FIFO 0 Element Data */ +#define CAN_RXF0E_DATA_RESETVALUE 0x00000000u /**< \brief (CAN_RXF0E_DATA reset_value) Rx FIFO 0 Element Data */ + +#define CAN_RXF0E_DATA_DB0_Pos 0 /**< \brief (CAN_RXF0E_DATA) Data Byte 0 */ +#define CAN_RXF0E_DATA_DB0_Msk (0xFFu << CAN_RXF0E_DATA_DB0_Pos) +#define CAN_RXF0E_DATA_DB0(value) (CAN_RXF0E_DATA_DB0_Msk & ((value) << CAN_RXF0E_DATA_DB0_Pos)) +#define CAN_RXF0E_DATA_DB1_Pos 8 /**< \brief (CAN_RXF0E_DATA) Data Byte 1 */ +#define CAN_RXF0E_DATA_DB1_Msk (0xFFu << CAN_RXF0E_DATA_DB1_Pos) +#define CAN_RXF0E_DATA_DB1(value) (CAN_RXF0E_DATA_DB1_Msk & ((value) << CAN_RXF0E_DATA_DB1_Pos)) +#define CAN_RXF0E_DATA_DB2_Pos 16 /**< \brief (CAN_RXF0E_DATA) Data Byte 2 */ +#define CAN_RXF0E_DATA_DB2_Msk (0xFFu << CAN_RXF0E_DATA_DB2_Pos) +#define CAN_RXF0E_DATA_DB2(value) (CAN_RXF0E_DATA_DB2_Msk & ((value) << CAN_RXF0E_DATA_DB2_Pos)) +#define CAN_RXF0E_DATA_DB3_Pos 24 /**< \brief (CAN_RXF0E_DATA) Data Byte 3 */ +#define CAN_RXF0E_DATA_DB3_Msk (0xFFu << CAN_RXF0E_DATA_DB3_Pos) +#define CAN_RXF0E_DATA_DB3(value) (CAN_RXF0E_DATA_DB3_Msk & ((value) << CAN_RXF0E_DATA_DB3_Pos)) +#define CAN_RXF0E_DATA_MASK 0xFFFFFFFFu /**< \brief (CAN_RXF0E_DATA) MASK Register */ + +/* -------- CAN_RXF1E_0 : (CAN Offset: 0x00) (R/W 32) Rx FIFO 1 Element 0 -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t ID:29; /*!< bit: 0..28 Identifier */ + uint32_t RTR:1; /*!< bit: 29 Remote Transmission Request */ + uint32_t XTD:1; /*!< bit: 30 Extended Identifier */ + uint32_t ESI:1; /*!< bit: 31 Error State Indicator */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_RXF1E_0_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_RXF1E_0_OFFSET 0x00 /**< \brief (CAN_RXF1E_0 offset) Rx FIFO 1 Element 0 */ +#define CAN_RXF1E_0_RESETVALUE 0x00000000u /**< \brief (CAN_RXF1E_0 reset_value) Rx FIFO 1 Element 0 */ + +#define CAN_RXF1E_0_ID_Pos 0 /**< \brief (CAN_RXF1E_0) Identifier */ +#define CAN_RXF1E_0_ID_Msk (0x1FFFFFFFu << CAN_RXF1E_0_ID_Pos) +#define CAN_RXF1E_0_ID(value) (CAN_RXF1E_0_ID_Msk & ((value) << CAN_RXF1E_0_ID_Pos)) +#define CAN_RXF1E_0_RTR_Pos 29 /**< \brief (CAN_RXF1E_0) Remote Transmission Request */ +#define CAN_RXF1E_0_RTR (0x1u << CAN_RXF1E_0_RTR_Pos) +#define CAN_RXF1E_0_XTD_Pos 30 /**< \brief (CAN_RXF1E_0) Extended Identifier */ +#define CAN_RXF1E_0_XTD (0x1u << CAN_RXF1E_0_XTD_Pos) +#define CAN_RXF1E_0_ESI_Pos 31 /**< \brief (CAN_RXF1E_0) Error State Indicator */ +#define CAN_RXF1E_0_ESI (0x1u << CAN_RXF1E_0_ESI_Pos) +#define CAN_RXF1E_0_MASK 0xFFFFFFFFu /**< \brief (CAN_RXF1E_0) MASK Register */ + +/* -------- CAN_RXF1E_1 : (CAN Offset: 0x04) (R/W 32) Rx FIFO 1 Element 1 -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t RXTS:16; /*!< bit: 0..15 Rx Timestamp */ + uint32_t DLC:4; /*!< bit: 16..19 Data Length Code */ + uint32_t BRS:1; /*!< bit: 20 Bit Rate Search */ + uint32_t FDF:1; /*!< bit: 21 FD Format */ + uint32_t :2; /*!< bit: 22..23 Reserved */ + uint32_t FIDX:7; /*!< bit: 24..30 Filter Index */ + uint32_t ANMF:1; /*!< bit: 31 Accepted Non-matching Frame */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_RXF1E_1_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_RXF1E_1_OFFSET 0x04 /**< \brief (CAN_RXF1E_1 offset) Rx FIFO 1 Element 1 */ +#define CAN_RXF1E_1_RESETVALUE 0x00000000u /**< \brief (CAN_RXF1E_1 reset_value) Rx FIFO 1 Element 1 */ + +#define CAN_RXF1E_1_RXTS_Pos 0 /**< \brief (CAN_RXF1E_1) Rx Timestamp */ +#define CAN_RXF1E_1_RXTS_Msk (0xFFFFu << CAN_RXF1E_1_RXTS_Pos) +#define CAN_RXF1E_1_RXTS(value) (CAN_RXF1E_1_RXTS_Msk & ((value) << CAN_RXF1E_1_RXTS_Pos)) +#define CAN_RXF1E_1_DLC_Pos 16 /**< \brief (CAN_RXF1E_1) Data Length Code */ +#define CAN_RXF1E_1_DLC_Msk (0xFu << CAN_RXF1E_1_DLC_Pos) +#define CAN_RXF1E_1_DLC(value) (CAN_RXF1E_1_DLC_Msk & ((value) << CAN_RXF1E_1_DLC_Pos)) +#define CAN_RXF1E_1_BRS_Pos 20 /**< \brief (CAN_RXF1E_1) Bit Rate Search */ +#define CAN_RXF1E_1_BRS (0x1u << CAN_RXF1E_1_BRS_Pos) +#define CAN_RXF1E_1_FDF_Pos 21 /**< \brief (CAN_RXF1E_1) FD Format */ +#define CAN_RXF1E_1_FDF (0x1u << CAN_RXF1E_1_FDF_Pos) +#define CAN_RXF1E_1_FIDX_Pos 24 /**< \brief (CAN_RXF1E_1) Filter Index */ +#define CAN_RXF1E_1_FIDX_Msk (0x7Fu << CAN_RXF1E_1_FIDX_Pos) +#define CAN_RXF1E_1_FIDX(value) (CAN_RXF1E_1_FIDX_Msk & ((value) << CAN_RXF1E_1_FIDX_Pos)) +#define CAN_RXF1E_1_ANMF_Pos 31 /**< \brief (CAN_RXF1E_1) Accepted Non-matching Frame */ +#define CAN_RXF1E_1_ANMF (0x1u << CAN_RXF1E_1_ANMF_Pos) +#define CAN_RXF1E_1_MASK 0xFF3FFFFFu /**< \brief (CAN_RXF1E_1) MASK Register */ + +/* -------- CAN_RXF1E_DATA : (CAN Offset: 0x08) (R/W 32) Rx FIFO 1 Element Data -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t DB0:8; /*!< bit: 0.. 7 Data Byte 0 */ + uint32_t DB1:8; /*!< bit: 8..15 Data Byte 1 */ + uint32_t DB2:8; /*!< bit: 16..23 Data Byte 2 */ + uint32_t DB3:8; /*!< bit: 24..31 Data Byte 3 */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_RXF1E_DATA_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_RXF1E_DATA_OFFSET 0x08 /**< \brief (CAN_RXF1E_DATA offset) Rx FIFO 1 Element Data */ +#define CAN_RXF1E_DATA_RESETVALUE 0x00000000u /**< \brief (CAN_RXF1E_DATA reset_value) Rx FIFO 1 Element Data */ + +#define CAN_RXF1E_DATA_DB0_Pos 0 /**< \brief (CAN_RXF1E_DATA) Data Byte 0 */ +#define CAN_RXF1E_DATA_DB0_Msk (0xFFu << CAN_RXF1E_DATA_DB0_Pos) +#define CAN_RXF1E_DATA_DB0(value) (CAN_RXF1E_DATA_DB0_Msk & ((value) << CAN_RXF1E_DATA_DB0_Pos)) +#define CAN_RXF1E_DATA_DB1_Pos 8 /**< \brief (CAN_RXF1E_DATA) Data Byte 1 */ +#define CAN_RXF1E_DATA_DB1_Msk (0xFFu << CAN_RXF1E_DATA_DB1_Pos) +#define CAN_RXF1E_DATA_DB1(value) (CAN_RXF1E_DATA_DB1_Msk & ((value) << CAN_RXF1E_DATA_DB1_Pos)) +#define CAN_RXF1E_DATA_DB2_Pos 16 /**< \brief (CAN_RXF1E_DATA) Data Byte 2 */ +#define CAN_RXF1E_DATA_DB2_Msk (0xFFu << CAN_RXF1E_DATA_DB2_Pos) +#define CAN_RXF1E_DATA_DB2(value) (CAN_RXF1E_DATA_DB2_Msk & ((value) << CAN_RXF1E_DATA_DB2_Pos)) +#define CAN_RXF1E_DATA_DB3_Pos 24 /**< \brief (CAN_RXF1E_DATA) Data Byte 3 */ +#define CAN_RXF1E_DATA_DB3_Msk (0xFFu << CAN_RXF1E_DATA_DB3_Pos) +#define CAN_RXF1E_DATA_DB3(value) (CAN_RXF1E_DATA_DB3_Msk & ((value) << CAN_RXF1E_DATA_DB3_Pos)) +#define CAN_RXF1E_DATA_MASK 0xFFFFFFFFu /**< \brief (CAN_RXF1E_DATA) MASK Register */ + +/* -------- CAN_SIDFE_0 : (CAN Offset: 0x00) (R/W 32) Standard Message ID Filter Element -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t SFID2:11; /*!< bit: 0..10 Standard Filter ID 2 */ + uint32_t :5; /*!< bit: 11..15 Reserved */ + uint32_t SFID1:11; /*!< bit: 16..26 Standard Filter ID 1 */ + uint32_t SFEC:3; /*!< bit: 27..29 Standard Filter Element Configuration */ + uint32_t SFT:2; /*!< bit: 30..31 Standard Filter Type */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_SIDFE_0_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_SIDFE_0_OFFSET 0x00 /**< \brief (CAN_SIDFE_0 offset) Standard Message ID Filter Element */ +#define CAN_SIDFE_0_RESETVALUE 0x00000000u /**< \brief (CAN_SIDFE_0 reset_value) Standard Message ID Filter Element */ + +#define CAN_SIDFE_0_SFID2_Pos 0 /**< \brief (CAN_SIDFE_0) Standard Filter ID 2 */ +#define CAN_SIDFE_0_SFID2_Msk (0x7FFu << CAN_SIDFE_0_SFID2_Pos) +#define CAN_SIDFE_0_SFID2(value) (CAN_SIDFE_0_SFID2_Msk & ((value) << CAN_SIDFE_0_SFID2_Pos)) +#define CAN_SIDFE_0_SFID1_Pos 16 /**< \brief (CAN_SIDFE_0) Standard Filter ID 1 */ +#define CAN_SIDFE_0_SFID1_Msk (0x7FFu << CAN_SIDFE_0_SFID1_Pos) +#define CAN_SIDFE_0_SFID1(value) (CAN_SIDFE_0_SFID1_Msk & ((value) << CAN_SIDFE_0_SFID1_Pos)) +#define CAN_SIDFE_0_SFEC_Pos 27 /**< \brief (CAN_SIDFE_0) Standard Filter Element Configuration */ +#define CAN_SIDFE_0_SFEC_Msk (0x7u << CAN_SIDFE_0_SFEC_Pos) +#define CAN_SIDFE_0_SFEC(value) (CAN_SIDFE_0_SFEC_Msk & ((value) << CAN_SIDFE_0_SFEC_Pos)) +#define CAN_SIDFE_0_SFEC_DISABLE_Val 0x0u /**< \brief (CAN_SIDFE_0) Disable filter element */ +#define CAN_SIDFE_0_SFEC_STF0M_Val 0x1u /**< \brief (CAN_SIDFE_0) Store in Rx FIFO 0 if filter match */ +#define CAN_SIDFE_0_SFEC_STF1M_Val 0x2u /**< \brief (CAN_SIDFE_0) Store in Rx FIFO 1 if filter match */ +#define CAN_SIDFE_0_SFEC_REJECT_Val 0x3u /**< \brief (CAN_SIDFE_0) Reject ID if filter match */ +#define CAN_SIDFE_0_SFEC_PRIORITY_Val 0x4u /**< \brief (CAN_SIDFE_0) Set priority if filter match */ +#define CAN_SIDFE_0_SFEC_PRIF0M_Val 0x5u /**< \brief (CAN_SIDFE_0) Set priority and store in FIFO 0 if filter match */ +#define CAN_SIDFE_0_SFEC_PRIF1M_Val 0x6u /**< \brief (CAN_SIDFE_0) Set priority and store in FIFO 1 if filter match */ +#define CAN_SIDFE_0_SFEC_STRXBUF_Val 0x7u /**< \brief (CAN_SIDFE_0) Store into Rx Buffer */ +#define CAN_SIDFE_0_SFEC_DISABLE (CAN_SIDFE_0_SFEC_DISABLE_Val << CAN_SIDFE_0_SFEC_Pos) +#define CAN_SIDFE_0_SFEC_STF0M (CAN_SIDFE_0_SFEC_STF0M_Val << CAN_SIDFE_0_SFEC_Pos) +#define CAN_SIDFE_0_SFEC_STF1M (CAN_SIDFE_0_SFEC_STF1M_Val << CAN_SIDFE_0_SFEC_Pos) +#define CAN_SIDFE_0_SFEC_REJECT (CAN_SIDFE_0_SFEC_REJECT_Val << CAN_SIDFE_0_SFEC_Pos) +#define CAN_SIDFE_0_SFEC_PRIORITY (CAN_SIDFE_0_SFEC_PRIORITY_Val << CAN_SIDFE_0_SFEC_Pos) +#define CAN_SIDFE_0_SFEC_PRIF0M (CAN_SIDFE_0_SFEC_PRIF0M_Val << CAN_SIDFE_0_SFEC_Pos) +#define CAN_SIDFE_0_SFEC_PRIF1M (CAN_SIDFE_0_SFEC_PRIF1M_Val << CAN_SIDFE_0_SFEC_Pos) +#define CAN_SIDFE_0_SFEC_STRXBUF (CAN_SIDFE_0_SFEC_STRXBUF_Val << CAN_SIDFE_0_SFEC_Pos) +#define CAN_SIDFE_0_SFT_Pos 30 /**< \brief (CAN_SIDFE_0) Standard Filter Type */ +#define CAN_SIDFE_0_SFT_Msk (0x3u << CAN_SIDFE_0_SFT_Pos) +#define CAN_SIDFE_0_SFT(value) (CAN_SIDFE_0_SFT_Msk & ((value) << CAN_SIDFE_0_SFT_Pos)) +#define CAN_SIDFE_0_SFT_RANGE_Val 0x0u /**< \brief (CAN_SIDFE_0) Range filter from SFID1 to SFID2 */ +#define CAN_SIDFE_0_SFT_DUAL_Val 0x1u /**< \brief (CAN_SIDFE_0) Dual ID filter for SFID1 or SFID2 */ +#define CAN_SIDFE_0_SFT_CLASSIC_Val 0x2u /**< \brief (CAN_SIDFE_0) Classic filter */ +#define CAN_SIDFE_0_SFT_RANGE (CAN_SIDFE_0_SFT_RANGE_Val << CAN_SIDFE_0_SFT_Pos) +#define CAN_SIDFE_0_SFT_DUAL (CAN_SIDFE_0_SFT_DUAL_Val << CAN_SIDFE_0_SFT_Pos) +#define CAN_SIDFE_0_SFT_CLASSIC (CAN_SIDFE_0_SFT_CLASSIC_Val << CAN_SIDFE_0_SFT_Pos) +#define CAN_SIDFE_0_MASK 0xFFFF07FFu /**< \brief (CAN_SIDFE_0) MASK Register */ + +/* -------- CAN_TXBE_0 : (CAN Offset: 0x00) (R/W 32) Tx Buffer Element 0 -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t ID:29; /*!< bit: 0..28 Identifier */ + uint32_t RTR:1; /*!< bit: 29 Remote Transmission Request */ + uint32_t XTD:1; /*!< bit: 30 Extended Identifier */ + uint32_t ESI:1; /*!< bit: 31 Error State Indicator */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_TXBE_0_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_TXBE_0_OFFSET 0x00 /**< \brief (CAN_TXBE_0 offset) Tx Buffer Element 0 */ +#define CAN_TXBE_0_RESETVALUE 0x00000000u /**< \brief (CAN_TXBE_0 reset_value) Tx Buffer Element 0 */ + +#define CAN_TXBE_0_ID_Pos 0 /**< \brief (CAN_TXBE_0) Identifier */ +#define CAN_TXBE_0_ID_Msk (0x1FFFFFFFu << CAN_TXBE_0_ID_Pos) +#define CAN_TXBE_0_ID(value) (CAN_TXBE_0_ID_Msk & ((value) << CAN_TXBE_0_ID_Pos)) +#define CAN_TXBE_0_RTR_Pos 29 /**< \brief (CAN_TXBE_0) Remote Transmission Request */ +#define CAN_TXBE_0_RTR (0x1u << CAN_TXBE_0_RTR_Pos) +#define CAN_TXBE_0_XTD_Pos 30 /**< \brief (CAN_TXBE_0) Extended Identifier */ +#define CAN_TXBE_0_XTD (0x1u << CAN_TXBE_0_XTD_Pos) +#define CAN_TXBE_0_ESI_Pos 31 /**< \brief (CAN_TXBE_0) Error State Indicator */ +#define CAN_TXBE_0_ESI (0x1u << CAN_TXBE_0_ESI_Pos) +#define CAN_TXBE_0_MASK 0xFFFFFFFFu /**< \brief (CAN_TXBE_0) MASK Register */ + +/* -------- CAN_TXBE_1 : (CAN Offset: 0x04) (R/W 32) Tx Buffer Element 1 -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t :16; /*!< bit: 0..15 Reserved */ + uint32_t DLC:4; /*!< bit: 16..19 Identifier */ + uint32_t BRS:1; /*!< bit: 20 Bit Rate Search */ + uint32_t FDF:1; /*!< bit: 21 FD Format */ + uint32_t :1; /*!< bit: 22 Reserved */ + uint32_t EFC:1; /*!< bit: 23 Event FIFO Control */ + uint32_t MM:8; /*!< bit: 24..31 Message Marker */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_TXBE_1_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_TXBE_1_OFFSET 0x04 /**< \brief (CAN_TXBE_1 offset) Tx Buffer Element 1 */ +#define CAN_TXBE_1_RESETVALUE 0x00000000u /**< \brief (CAN_TXBE_1 reset_value) Tx Buffer Element 1 */ + +#define CAN_TXBE_1_DLC_Pos 16 /**< \brief (CAN_TXBE_1) Identifier */ +#define CAN_TXBE_1_DLC_Msk (0xFu << CAN_TXBE_1_DLC_Pos) +#define CAN_TXBE_1_DLC(value) (CAN_TXBE_1_DLC_Msk & ((value) << CAN_TXBE_1_DLC_Pos)) +#define CAN_TXBE_1_BRS_Pos 20 /**< \brief (CAN_TXBE_1) Bit Rate Search */ +#define CAN_TXBE_1_BRS (0x1u << CAN_TXBE_1_BRS_Pos) +#define CAN_TXBE_1_FDF_Pos 21 /**< \brief (CAN_TXBE_1) FD Format */ +#define CAN_TXBE_1_FDF (0x1u << CAN_TXBE_1_FDF_Pos) +#define CAN_TXBE_1_EFC_Pos 23 /**< \brief (CAN_TXBE_1) Event FIFO Control */ +#define CAN_TXBE_1_EFC (0x1u << CAN_TXBE_1_EFC_Pos) +#define CAN_TXBE_1_MM_Pos 24 /**< \brief (CAN_TXBE_1) Message Marker */ +#define CAN_TXBE_1_MM_Msk (0xFFu << CAN_TXBE_1_MM_Pos) +#define CAN_TXBE_1_MM(value) (CAN_TXBE_1_MM_Msk & ((value) << CAN_TXBE_1_MM_Pos)) +#define CAN_TXBE_1_MASK 0xFFBF0000u /**< \brief (CAN_TXBE_1) MASK Register */ + +/* -------- CAN_TXBE_DATA : (CAN Offset: 0x08) (R/W 32) Tx Buffer Element Data -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t DB0:8; /*!< bit: 0.. 7 Data Byte 0 */ + uint32_t DB1:8; /*!< bit: 8..15 Data Byte 1 */ + uint32_t DB2:8; /*!< bit: 16..23 Data Byte 2 */ + uint32_t DB3:8; /*!< bit: 24..31 Data Byte 3 */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_TXBE_DATA_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_TXBE_DATA_OFFSET 0x08 /**< \brief (CAN_TXBE_DATA offset) Tx Buffer Element Data */ +#define CAN_TXBE_DATA_RESETVALUE 0x00000000u /**< \brief (CAN_TXBE_DATA reset_value) Tx Buffer Element Data */ + +#define CAN_TXBE_DATA_DB0_Pos 0 /**< \brief (CAN_TXBE_DATA) Data Byte 0 */ +#define CAN_TXBE_DATA_DB0_Msk (0xFFu << CAN_TXBE_DATA_DB0_Pos) +#define CAN_TXBE_DATA_DB0(value) (CAN_TXBE_DATA_DB0_Msk & ((value) << CAN_TXBE_DATA_DB0_Pos)) +#define CAN_TXBE_DATA_DB1_Pos 8 /**< \brief (CAN_TXBE_DATA) Data Byte 1 */ +#define CAN_TXBE_DATA_DB1_Msk (0xFFu << CAN_TXBE_DATA_DB1_Pos) +#define CAN_TXBE_DATA_DB1(value) (CAN_TXBE_DATA_DB1_Msk & ((value) << CAN_TXBE_DATA_DB1_Pos)) +#define CAN_TXBE_DATA_DB2_Pos 16 /**< \brief (CAN_TXBE_DATA) Data Byte 2 */ +#define CAN_TXBE_DATA_DB2_Msk (0xFFu << CAN_TXBE_DATA_DB2_Pos) +#define CAN_TXBE_DATA_DB2(value) (CAN_TXBE_DATA_DB2_Msk & ((value) << CAN_TXBE_DATA_DB2_Pos)) +#define CAN_TXBE_DATA_DB3_Pos 24 /**< \brief (CAN_TXBE_DATA) Data Byte 3 */ +#define CAN_TXBE_DATA_DB3_Msk (0xFFu << CAN_TXBE_DATA_DB3_Pos) +#define CAN_TXBE_DATA_DB3(value) (CAN_TXBE_DATA_DB3_Msk & ((value) << CAN_TXBE_DATA_DB3_Pos)) +#define CAN_TXBE_DATA_MASK 0xFFFFFFFFu /**< \brief (CAN_TXBE_DATA) MASK Register */ + +/* -------- CAN_TXEFE_0 : (CAN Offset: 0x00) (R/W 32) Tx Event FIFO Element 0 -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t ID:29; /*!< bit: 0..28 Identifier */ + uint32_t RTR:1; /*!< bit: 29 Remote Transmission Request */ + uint32_t XTD:1; /*!< bit: 30 Extended Indentifier */ + uint32_t ESI:1; /*!< bit: 31 Error State Indicator */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_TXEFE_0_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_TXEFE_0_OFFSET 0x00 /**< \brief (CAN_TXEFE_0 offset) Tx Event FIFO Element 0 */ +#define CAN_TXEFE_0_RESETVALUE 0x00000000u /**< \brief (CAN_TXEFE_0 reset_value) Tx Event FIFO Element 0 */ + +#define CAN_TXEFE_0_ID_Pos 0 /**< \brief (CAN_TXEFE_0) Identifier */ +#define CAN_TXEFE_0_ID_Msk (0x1FFFFFFFu << CAN_TXEFE_0_ID_Pos) +#define CAN_TXEFE_0_ID(value) (CAN_TXEFE_0_ID_Msk & ((value) << CAN_TXEFE_0_ID_Pos)) +#define CAN_TXEFE_0_RTR_Pos 29 /**< \brief (CAN_TXEFE_0) Remote Transmission Request */ +#define CAN_TXEFE_0_RTR (0x1u << CAN_TXEFE_0_RTR_Pos) +#define CAN_TXEFE_0_XTD_Pos 30 /**< \brief (CAN_TXEFE_0) Extended Indentifier */ +#define CAN_TXEFE_0_XTD (0x1u << CAN_TXEFE_0_XTD_Pos) +#define CAN_TXEFE_0_ESI_Pos 31 /**< \brief (CAN_TXEFE_0) Error State Indicator */ +#define CAN_TXEFE_0_ESI (0x1u << CAN_TXEFE_0_ESI_Pos) +#define CAN_TXEFE_0_MASK 0xFFFFFFFFu /**< \brief (CAN_TXEFE_0) MASK Register */ + +/* -------- CAN_TXEFE_1 : (CAN Offset: 0x04) (R/W 32) Tx Event FIFO Element 1 -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t TXTS:16; /*!< bit: 0..15 Tx Timestamp */ + uint32_t DLC:4; /*!< bit: 16..19 Data Length Code */ + uint32_t BRS:1; /*!< bit: 20 Bit Rate Search */ + uint32_t FDF:1; /*!< bit: 21 FD Format */ + uint32_t ET:2; /*!< bit: 22..23 Event Type */ + uint32_t MM:8; /*!< bit: 24..31 Message Marker */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_TXEFE_1_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_TXEFE_1_OFFSET 0x04 /**< \brief (CAN_TXEFE_1 offset) Tx Event FIFO Element 1 */ +#define CAN_TXEFE_1_RESETVALUE 0x00000000u /**< \brief (CAN_TXEFE_1 reset_value) Tx Event FIFO Element 1 */ + +#define CAN_TXEFE_1_TXTS_Pos 0 /**< \brief (CAN_TXEFE_1) Tx Timestamp */ +#define CAN_TXEFE_1_TXTS_Msk (0xFFFFu << CAN_TXEFE_1_TXTS_Pos) +#define CAN_TXEFE_1_TXTS(value) (CAN_TXEFE_1_TXTS_Msk & ((value) << CAN_TXEFE_1_TXTS_Pos)) +#define CAN_TXEFE_1_DLC_Pos 16 /**< \brief (CAN_TXEFE_1) Data Length Code */ +#define CAN_TXEFE_1_DLC_Msk (0xFu << CAN_TXEFE_1_DLC_Pos) +#define CAN_TXEFE_1_DLC(value) (CAN_TXEFE_1_DLC_Msk & ((value) << CAN_TXEFE_1_DLC_Pos)) +#define CAN_TXEFE_1_BRS_Pos 20 /**< \brief (CAN_TXEFE_1) Bit Rate Search */ +#define CAN_TXEFE_1_BRS (0x1u << CAN_TXEFE_1_BRS_Pos) +#define CAN_TXEFE_1_FDF_Pos 21 /**< \brief (CAN_TXEFE_1) FD Format */ +#define CAN_TXEFE_1_FDF (0x1u << CAN_TXEFE_1_FDF_Pos) +#define CAN_TXEFE_1_ET_Pos 22 /**< \brief (CAN_TXEFE_1) Event Type */ +#define CAN_TXEFE_1_ET_Msk (0x3u << CAN_TXEFE_1_ET_Pos) +#define CAN_TXEFE_1_ET(value) (CAN_TXEFE_1_ET_Msk & ((value) << CAN_TXEFE_1_ET_Pos)) +#define CAN_TXEFE_1_ET_TXE_Val 0x1u /**< \brief (CAN_TXEFE_1) Tx event */ +#define CAN_TXEFE_1_ET_TXC_Val 0x2u /**< \brief (CAN_TXEFE_1) Transmission in spite of cancellation */ +#define CAN_TXEFE_1_ET_TXE (CAN_TXEFE_1_ET_TXE_Val << CAN_TXEFE_1_ET_Pos) +#define CAN_TXEFE_1_ET_TXC (CAN_TXEFE_1_ET_TXC_Val << CAN_TXEFE_1_ET_Pos) +#define CAN_TXEFE_1_MM_Pos 24 /**< \brief (CAN_TXEFE_1) Message Marker */ +#define CAN_TXEFE_1_MM_Msk (0xFFu << CAN_TXEFE_1_MM_Pos) +#define CAN_TXEFE_1_MM(value) (CAN_TXEFE_1_MM_Msk & ((value) << CAN_TXEFE_1_MM_Pos)) +#define CAN_TXEFE_1_MASK 0xFFFFFFFFu /**< \brief (CAN_TXEFE_1) MASK Register */ + +/* -------- CAN_XIDFE_0 : (CAN Offset: 0x00) (R/W 32) Extended Message ID Filter Element 0 -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t EFID1:29; /*!< bit: 0..28 Extended Filter ID 1 */ + uint32_t EFEC:3; /*!< bit: 29..31 Extended Filter Element Configuration */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_XIDFE_0_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_XIDFE_0_OFFSET 0x00 /**< \brief (CAN_XIDFE_0 offset) Extended Message ID Filter Element 0 */ +#define CAN_XIDFE_0_RESETVALUE 0x00000000u /**< \brief (CAN_XIDFE_0 reset_value) Extended Message ID Filter Element 0 */ + +#define CAN_XIDFE_0_EFID1_Pos 0 /**< \brief (CAN_XIDFE_0) Extended Filter ID 1 */ +#define CAN_XIDFE_0_EFID1_Msk (0x1FFFFFFFu << CAN_XIDFE_0_EFID1_Pos) +#define CAN_XIDFE_0_EFID1(value) (CAN_XIDFE_0_EFID1_Msk & ((value) << CAN_XIDFE_0_EFID1_Pos)) +#define CAN_XIDFE_0_EFEC_Pos 29 /**< \brief (CAN_XIDFE_0) Extended Filter Element Configuration */ +#define CAN_XIDFE_0_EFEC_Msk (0x7u << CAN_XIDFE_0_EFEC_Pos) +#define CAN_XIDFE_0_EFEC(value) (CAN_XIDFE_0_EFEC_Msk & ((value) << CAN_XIDFE_0_EFEC_Pos)) +#define CAN_XIDFE_0_EFEC_DISABLE_Val 0x0u /**< \brief (CAN_XIDFE_0) Disable filter element */ +#define CAN_XIDFE_0_EFEC_STF0M_Val 0x1u /**< \brief (CAN_XIDFE_0) Store in Rx FIFO 0 if filter match */ +#define CAN_XIDFE_0_EFEC_STF1M_Val 0x2u /**< \brief (CAN_XIDFE_0) Store in Rx FIFO 1 if filter match */ +#define CAN_XIDFE_0_EFEC_REJECT_Val 0x3u /**< \brief (CAN_XIDFE_0) Reject ID if filter match */ +#define CAN_XIDFE_0_EFEC_PRIORITY_Val 0x4u /**< \brief (CAN_XIDFE_0) Set priority if filter match */ +#define CAN_XIDFE_0_EFEC_PRIF0M_Val 0x5u /**< \brief (CAN_XIDFE_0) Set priority and store in FIFO 0 if filter match */ +#define CAN_XIDFE_0_EFEC_PRIF1M_Val 0x6u /**< \brief (CAN_XIDFE_0) Set priority and store in FIFO 1 if filter match */ +#define CAN_XIDFE_0_EFEC_STRXBUF_Val 0x7u /**< \brief (CAN_XIDFE_0) Store into Rx Buffer */ +#define CAN_XIDFE_0_EFEC_DISABLE (CAN_XIDFE_0_EFEC_DISABLE_Val << CAN_XIDFE_0_EFEC_Pos) +#define CAN_XIDFE_0_EFEC_STF0M (CAN_XIDFE_0_EFEC_STF0M_Val << CAN_XIDFE_0_EFEC_Pos) +#define CAN_XIDFE_0_EFEC_STF1M (CAN_XIDFE_0_EFEC_STF1M_Val << CAN_XIDFE_0_EFEC_Pos) +#define CAN_XIDFE_0_EFEC_REJECT (CAN_XIDFE_0_EFEC_REJECT_Val << CAN_XIDFE_0_EFEC_Pos) +#define CAN_XIDFE_0_EFEC_PRIORITY (CAN_XIDFE_0_EFEC_PRIORITY_Val << CAN_XIDFE_0_EFEC_Pos) +#define CAN_XIDFE_0_EFEC_PRIF0M (CAN_XIDFE_0_EFEC_PRIF0M_Val << CAN_XIDFE_0_EFEC_Pos) +#define CAN_XIDFE_0_EFEC_PRIF1M (CAN_XIDFE_0_EFEC_PRIF1M_Val << CAN_XIDFE_0_EFEC_Pos) +#define CAN_XIDFE_0_EFEC_STRXBUF (CAN_XIDFE_0_EFEC_STRXBUF_Val << CAN_XIDFE_0_EFEC_Pos) +#define CAN_XIDFE_0_MASK 0xFFFFFFFFu /**< \brief (CAN_XIDFE_0) MASK Register */ + +/* -------- CAN_XIDFE_1 : (CAN Offset: 0x04) (R/W 32) Extended Message ID Filter Element 1 -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t EFID2:29; /*!< bit: 0..28 Extended Filter ID 2 */ + uint32_t :1; /*!< bit: 29 Reserved */ + uint32_t EFT:2; /*!< bit: 30..31 Extended Filter Type */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CAN_XIDFE_1_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CAN_XIDFE_1_OFFSET 0x04 /**< \brief (CAN_XIDFE_1 offset) Extended Message ID Filter Element 1 */ +#define CAN_XIDFE_1_RESETVALUE 0x00000000u /**< \brief (CAN_XIDFE_1 reset_value) Extended Message ID Filter Element 1 */ + +#define CAN_XIDFE_1_EFID2_Pos 0 /**< \brief (CAN_XIDFE_1) Extended Filter ID 2 */ +#define CAN_XIDFE_1_EFID2_Msk (0x1FFFFFFFu << CAN_XIDFE_1_EFID2_Pos) +#define CAN_XIDFE_1_EFID2(value) (CAN_XIDFE_1_EFID2_Msk & ((value) << CAN_XIDFE_1_EFID2_Pos)) +#define CAN_XIDFE_1_EFT_Pos 30 /**< \brief (CAN_XIDFE_1) Extended Filter Type */ +#define CAN_XIDFE_1_EFT_Msk (0x3u << CAN_XIDFE_1_EFT_Pos) +#define CAN_XIDFE_1_EFT(value) (CAN_XIDFE_1_EFT_Msk & ((value) << CAN_XIDFE_1_EFT_Pos)) +#define CAN_XIDFE_1_EFT_RANGEM_Val 0x0u /**< \brief (CAN_XIDFE_1) Range filter from EFID1 to EFID2 */ +#define CAN_XIDFE_1_EFT_DUAL_Val 0x1u /**< \brief (CAN_XIDFE_1) Dual ID filter for EFID1 or EFID2 */ +#define CAN_XIDFE_1_EFT_CLASSIC_Val 0x2u /**< \brief (CAN_XIDFE_1) Classic filter */ +#define CAN_XIDFE_1_EFT_RANGE_Val 0x3u /**< \brief (CAN_XIDFE_1) Range filter from EFID1 to EFID2 with no XIDAM mask */ +#define CAN_XIDFE_1_EFT_RANGEM (CAN_XIDFE_1_EFT_RANGEM_Val << CAN_XIDFE_1_EFT_Pos) +#define CAN_XIDFE_1_EFT_DUAL (CAN_XIDFE_1_EFT_DUAL_Val << CAN_XIDFE_1_EFT_Pos) +#define CAN_XIDFE_1_EFT_CLASSIC (CAN_XIDFE_1_EFT_CLASSIC_Val << CAN_XIDFE_1_EFT_Pos) +#define CAN_XIDFE_1_EFT_RANGE (CAN_XIDFE_1_EFT_RANGE_Val << CAN_XIDFE_1_EFT_Pos) +#define CAN_XIDFE_1_MASK 0xDFFFFFFFu /**< \brief (CAN_XIDFE_1) MASK Register */ + +/** \brief CAN APB hardware registers */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef struct { + __I CAN_CREL_Type CREL; /**< \brief Offset: 0x00 (R/ 32) Core Release */ + __I CAN_ENDN_Type ENDN; /**< \brief Offset: 0x04 (R/ 32) Endian */ + __IO CAN_MRCFG_Type MRCFG; /**< \brief Offset: 0x08 (R/W 32) Message RAM Configuration */ + __IO CAN_DBTP_Type DBTP; /**< \brief Offset: 0x0C (R/W 32) Fast Bit Timing and Prescaler */ + __IO CAN_TEST_Type TEST; /**< \brief Offset: 0x10 (R/W 32) Test */ + __IO CAN_RWD_Type RWD; /**< \brief Offset: 0x14 (R/W 32) RAM Watchdog */ + __IO CAN_CCCR_Type CCCR; /**< \brief Offset: 0x18 (R/W 32) CC Control */ + __IO CAN_NBTP_Type NBTP; /**< \brief Offset: 0x1C (R/W 32) Nominal Bit Timing and Prescaler */ + __IO CAN_TSCC_Type TSCC; /**< \brief Offset: 0x20 (R/W 32) Timestamp Counter Configuration */ + __I CAN_TSCV_Type TSCV; /**< \brief Offset: 0x24 (R/ 32) Timestamp Counter Value */ + __IO CAN_TOCC_Type TOCC; /**< \brief Offset: 0x28 (R/W 32) Timeout Counter Configuration */ + __IO CAN_TOCV_Type TOCV; /**< \brief Offset: 0x2C (R/W 32) Timeout Counter Value */ + RoReg8 Reserved1[0x10]; + __I CAN_ECR_Type ECR; /**< \brief Offset: 0x40 (R/ 32) Error Counter */ + __I CAN_PSR_Type PSR; /**< \brief Offset: 0x44 (R/ 32) Protocol Status */ + __IO CAN_TDCR_Type TDCR; /**< \brief Offset: 0x48 (R/W 32) Extended ID Filter Configuration */ + RoReg8 Reserved2[0x4]; + __IO CAN_IR_Type IR; /**< \brief Offset: 0x50 (R/W 32) Interrupt */ + __IO CAN_IE_Type IE; /**< \brief Offset: 0x54 (R/W 32) Interrupt Enable */ + __IO CAN_ILS_Type ILS; /**< \brief Offset: 0x58 (R/W 32) Interrupt Line Select */ + __IO CAN_ILE_Type ILE; /**< \brief Offset: 0x5C (R/W 32) Interrupt Line Enable */ + RoReg8 Reserved3[0x20]; + __IO CAN_GFC_Type GFC; /**< \brief Offset: 0x80 (R/W 32) Global Filter Configuration */ + __IO CAN_SIDFC_Type SIDFC; /**< \brief Offset: 0x84 (R/W 32) Standard ID Filter Configuration */ + __IO CAN_XIDFC_Type XIDFC; /**< \brief Offset: 0x88 (R/W 32) Extended ID Filter Configuration */ + RoReg8 Reserved4[0x4]; + __IO CAN_XIDAM_Type XIDAM; /**< \brief Offset: 0x90 (R/W 32) Extended ID AND Mask */ + __I CAN_HPMS_Type HPMS; /**< \brief Offset: 0x94 (R/ 32) High Priority Message Status */ + __IO CAN_NDAT1_Type NDAT1; /**< \brief Offset: 0x98 (R/W 32) New Data 1 */ + __IO CAN_NDAT2_Type NDAT2; /**< \brief Offset: 0x9C (R/W 32) New Data 2 */ + __IO CAN_RXF0C_Type RXF0C; /**< \brief Offset: 0xA0 (R/W 32) Rx FIFO 0 Configuration */ + __I CAN_RXF0S_Type RXF0S; /**< \brief Offset: 0xA4 (R/ 32) Rx FIFO 0 Status */ + __IO CAN_RXF0A_Type RXF0A; /**< \brief Offset: 0xA8 (R/W 32) Rx FIFO 0 Acknowledge */ + __IO CAN_RXBC_Type RXBC; /**< \brief Offset: 0xAC (R/W 32) Rx Buffer Configuration */ + __IO CAN_RXF1C_Type RXF1C; /**< \brief Offset: 0xB0 (R/W 32) Rx FIFO 1 Configuration */ + __I CAN_RXF1S_Type RXF1S; /**< \brief Offset: 0xB4 (R/ 32) Rx FIFO 1 Status */ + __IO CAN_RXF1A_Type RXF1A; /**< \brief Offset: 0xB8 (R/W 32) Rx FIFO 1 Acknowledge */ + __IO CAN_RXESC_Type RXESC; /**< \brief Offset: 0xBC (R/W 32) Rx Buffer / FIFO Element Size Configuration */ + __IO CAN_TXBC_Type TXBC; /**< \brief Offset: 0xC0 (R/W 32) Tx Buffer Configuration */ + __I CAN_TXFQS_Type TXFQS; /**< \brief Offset: 0xC4 (R/ 32) Tx FIFO / Queue Status */ + __IO CAN_TXESC_Type TXESC; /**< \brief Offset: 0xC8 (R/W 32) Tx Buffer Element Size Configuration */ + __I CAN_TXBRP_Type TXBRP; /**< \brief Offset: 0xCC (R/ 32) Tx Buffer Request Pending */ + __IO CAN_TXBAR_Type TXBAR; /**< \brief Offset: 0xD0 (R/W 32) Tx Buffer Add Request */ + __IO CAN_TXBCR_Type TXBCR; /**< \brief Offset: 0xD4 (R/W 32) Tx Buffer Cancellation Request */ + __I CAN_TXBTO_Type TXBTO; /**< \brief Offset: 0xD8 (R/ 32) Tx Buffer Transmission Occurred */ + __I CAN_TXBCF_Type TXBCF; /**< \brief Offset: 0xDC (R/ 32) Tx Buffer Cancellation Finished */ + __IO CAN_TXBTIE_Type TXBTIE; /**< \brief Offset: 0xE0 (R/W 32) Tx Buffer Transmission Interrupt Enable */ + __IO CAN_TXBCIE_Type TXBCIE; /**< \brief Offset: 0xE4 (R/W 32) Tx Buffer Cancellation Finished Interrupt Enable */ + RoReg8 Reserved5[0x8]; + __IO CAN_TXEFC_Type TXEFC; /**< \brief Offset: 0xF0 (R/W 32) Tx Event FIFO Configuration */ + __I CAN_TXEFS_Type TXEFS; /**< \brief Offset: 0xF4 (R/ 32) Tx Event FIFO Status */ + __IO CAN_TXEFA_Type TXEFA; /**< \brief Offset: 0xF8 (R/W 32) Tx Event FIFO Acknowledge */ +} Can; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/** \brief CAN Mram_rxbe hardware registers */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef struct { + __IO CAN_RXBE_0_Type RXBE_0; /**< \brief Offset: 0x00 (R/W 32) Rx Buffer Element 0 */ + __IO CAN_RXBE_1_Type RXBE_1; /**< \brief Offset: 0x04 (R/W 32) Rx Buffer Element 1 */ + __IO CAN_RXBE_DATA_Type RXBE_DATA[16]; /**< \brief Offset: 0x08 (R/W 32) Rx Buffer Element Data */ +} CanMramRxbe +#ifdef __GNUC__ + __attribute__ ((aligned (4))) +#endif +; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/** \brief CAN Mram_rxf0e hardware registers */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef struct { + __IO CAN_RXF0E_0_Type RXF0E_0; /**< \brief Offset: 0x00 (R/W 32) Rx FIFO 0 Element 0 */ + __IO CAN_RXF0E_1_Type RXF0E_1; /**< \brief Offset: 0x04 (R/W 32) Rx FIFO 0 Element 1 */ + __IO CAN_RXF0E_DATA_Type RXF0E_DATA[16]; /**< \brief Offset: 0x08 (R/W 32) Rx FIFO 0 Element Data */ +} CanMramRxf0e +#ifdef __GNUC__ + __attribute__ ((aligned (4))) +#endif +; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/** \brief CAN Mram_rxf1e hardware registers */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef struct { + __IO CAN_RXF1E_0_Type RXF1E_0; /**< \brief Offset: 0x00 (R/W 32) Rx FIFO 1 Element 0 */ + __IO CAN_RXF1E_1_Type RXF1E_1; /**< \brief Offset: 0x04 (R/W 32) Rx FIFO 1 Element 1 */ + __IO CAN_RXF1E_DATA_Type RXF1E_DATA[16]; /**< \brief Offset: 0x08 (R/W 32) Rx FIFO 1 Element Data */ +} CanMramRxf1e +#ifdef __GNUC__ + __attribute__ ((aligned (4))) +#endif +; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/** \brief CAN Mram_sidfe hardware registers */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef struct { + __IO CAN_SIDFE_0_Type SIDFE_0; /**< \brief Offset: 0x00 (R/W 32) Standard Message ID Filter Element */ +} CanMramSidfe +#ifdef __GNUC__ + __attribute__ ((aligned (4))) +#endif +; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/** \brief CAN Mram_txbe hardware registers */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef struct { + __IO CAN_TXBE_0_Type TXBE_0; /**< \brief Offset: 0x00 (R/W 32) Tx Buffer Element 0 */ + __IO CAN_TXBE_1_Type TXBE_1; /**< \brief Offset: 0x04 (R/W 32) Tx Buffer Element 1 */ + __IO CAN_TXBE_DATA_Type TXBE_DATA[16]; /**< \brief Offset: 0x08 (R/W 32) Tx Buffer Element Data */ +} CanMramTxbe +#ifdef __GNUC__ + __attribute__ ((aligned (4))) +#endif +; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/** \brief CAN Mram_txefe hardware registers */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef struct { + __IO CAN_TXEFE_0_Type TXEFE_0; /**< \brief Offset: 0x00 (R/W 32) Tx Event FIFO Element 0 */ + __IO CAN_TXEFE_1_Type TXEFE_1; /**< \brief Offset: 0x04 (R/W 32) Tx Event FIFO Element 1 */ +} CanMramTxefe +#ifdef __GNUC__ + __attribute__ ((aligned (4))) +#endif +; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/** \brief CAN Mram_xifde hardware registers */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef struct { + __IO CAN_XIDFE_0_Type XIDFE_0; /**< \brief Offset: 0x00 (R/W 32) Extended Message ID Filter Element 0 */ + __IO CAN_XIDFE_1_Type XIDFE_1; /**< \brief Offset: 0x04 (R/W 32) Extended Message ID Filter Element 1 */ +} CanMramXifde +#ifdef __GNUC__ + __attribute__ ((aligned (4))) +#endif +; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define SECTION_CAN_MRAM_RXBE + +#define SECTION_CAN_MRAM_RXF0E + +#define SECTION_CAN_MRAM_RXF1E + +#define SECTION_CAN_MRAM_SIDFE + +#define SECTION_CAN_MRAM_TXBE + +#define SECTION_CAN_MRAM_TXEFE + +#define SECTION_CAN_MRAM_XIFDE + +/*@}*/ + +#endif /* _SAMD51_CAN_COMPONENT_ */ diff --git a/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/ccl.h b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/ccl.h new file mode 100644 index 000000000..890e81edf --- /dev/null +++ b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/ccl.h @@ -0,0 +1,228 @@ +/** + * \file + * + * \brief Component description for CCL + * + * Copyright (c) 2017 Microchip Technology Inc. + * + * \asf_license_start + * + * \page License + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 Licence 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. + * + * \asf_license_stop + * + */ + +#ifndef _SAMD51_CCL_COMPONENT_ +#define _SAMD51_CCL_COMPONENT_ + +/* ========================================================================== */ +/** SOFTWARE API DEFINITION FOR CCL */ +/* ========================================================================== */ +/** \addtogroup SAMD51_CCL Configurable Custom Logic */ +/*@{*/ + +#define CCL_U2225 +#define REV_CCL 0x110 + +/* -------- CCL_CTRL : (CCL Offset: 0x0) (R/W 8) Control -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t SWRST:1; /*!< bit: 0 Software Reset */ + uint8_t ENABLE:1; /*!< bit: 1 Enable */ + uint8_t :4; /*!< bit: 2.. 5 Reserved */ + uint8_t RUNSTDBY:1; /*!< bit: 6 Run in Standby */ + uint8_t :1; /*!< bit: 7 Reserved */ + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} CCL_CTRL_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CCL_CTRL_OFFSET 0x0 /**< \brief (CCL_CTRL offset) Control */ +#define CCL_CTRL_RESETVALUE _U_(0x00) /**< \brief (CCL_CTRL reset_value) Control */ + +#define CCL_CTRL_SWRST_Pos 0 /**< \brief (CCL_CTRL) Software Reset */ +#define CCL_CTRL_SWRST (_U_(0x1) << CCL_CTRL_SWRST_Pos) +#define CCL_CTRL_ENABLE_Pos 1 /**< \brief (CCL_CTRL) Enable */ +#define CCL_CTRL_ENABLE (_U_(0x1) << CCL_CTRL_ENABLE_Pos) +#define CCL_CTRL_RUNSTDBY_Pos 6 /**< \brief (CCL_CTRL) Run in Standby */ +#define CCL_CTRL_RUNSTDBY (_U_(0x1) << CCL_CTRL_RUNSTDBY_Pos) +#define CCL_CTRL_MASK _U_(0x43) /**< \brief (CCL_CTRL) MASK Register */ + +/* -------- CCL_SEQCTRL : (CCL Offset: 0x4) (R/W 8) SEQ Control x -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t SEQSEL:4; /*!< bit: 0.. 3 Sequential Selection */ + uint8_t :4; /*!< bit: 4.. 7 Reserved */ + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} CCL_SEQCTRL_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CCL_SEQCTRL_OFFSET 0x4 /**< \brief (CCL_SEQCTRL offset) SEQ Control x */ +#define CCL_SEQCTRL_RESETVALUE _U_(0x00) /**< \brief (CCL_SEQCTRL reset_value) SEQ Control x */ + +#define CCL_SEQCTRL_SEQSEL_Pos 0 /**< \brief (CCL_SEQCTRL) Sequential Selection */ +#define CCL_SEQCTRL_SEQSEL_Msk (_U_(0xF) << CCL_SEQCTRL_SEQSEL_Pos) +#define CCL_SEQCTRL_SEQSEL(value) (CCL_SEQCTRL_SEQSEL_Msk & ((value) << CCL_SEQCTRL_SEQSEL_Pos)) +#define CCL_SEQCTRL_SEQSEL_DISABLE_Val _U_(0x0) /**< \brief (CCL_SEQCTRL) Sequential logic is disabled */ +#define CCL_SEQCTRL_SEQSEL_DFF_Val _U_(0x1) /**< \brief (CCL_SEQCTRL) D flip flop */ +#define CCL_SEQCTRL_SEQSEL_JK_Val _U_(0x2) /**< \brief (CCL_SEQCTRL) JK flip flop */ +#define CCL_SEQCTRL_SEQSEL_LATCH_Val _U_(0x3) /**< \brief (CCL_SEQCTRL) D latch */ +#define CCL_SEQCTRL_SEQSEL_RS_Val _U_(0x4) /**< \brief (CCL_SEQCTRL) RS latch */ +#define CCL_SEQCTRL_SEQSEL_DISABLE (CCL_SEQCTRL_SEQSEL_DISABLE_Val << CCL_SEQCTRL_SEQSEL_Pos) +#define CCL_SEQCTRL_SEQSEL_DFF (CCL_SEQCTRL_SEQSEL_DFF_Val << CCL_SEQCTRL_SEQSEL_Pos) +#define CCL_SEQCTRL_SEQSEL_JK (CCL_SEQCTRL_SEQSEL_JK_Val << CCL_SEQCTRL_SEQSEL_Pos) +#define CCL_SEQCTRL_SEQSEL_LATCH (CCL_SEQCTRL_SEQSEL_LATCH_Val << CCL_SEQCTRL_SEQSEL_Pos) +#define CCL_SEQCTRL_SEQSEL_RS (CCL_SEQCTRL_SEQSEL_RS_Val << CCL_SEQCTRL_SEQSEL_Pos) +#define CCL_SEQCTRL_MASK _U_(0x0F) /**< \brief (CCL_SEQCTRL) MASK Register */ + +/* -------- CCL_LUTCTRL : (CCL Offset: 0x8) (R/W 32) LUT Control x -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t :1; /*!< bit: 0 Reserved */ + uint32_t ENABLE:1; /*!< bit: 1 LUT Enable */ + uint32_t :2; /*!< bit: 2.. 3 Reserved */ + uint32_t FILTSEL:2; /*!< bit: 4.. 5 Filter Selection */ + uint32_t :1; /*!< bit: 6 Reserved */ + uint32_t EDGESEL:1; /*!< bit: 7 Edge Selection */ + uint32_t INSEL0:4; /*!< bit: 8..11 Input Selection 0 */ + uint32_t INSEL1:4; /*!< bit: 12..15 Input Selection 1 */ + uint32_t INSEL2:4; /*!< bit: 16..19 Input Selection 2 */ + uint32_t INVEI:1; /*!< bit: 20 Inverted Event Input Enable */ + uint32_t LUTEI:1; /*!< bit: 21 LUT Event Input Enable */ + uint32_t LUTEO:1; /*!< bit: 22 LUT Event Output Enable */ + uint32_t :1; /*!< bit: 23 Reserved */ + uint32_t TRUTH:8; /*!< bit: 24..31 Truth Value */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CCL_LUTCTRL_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CCL_LUTCTRL_OFFSET 0x8 /**< \brief (CCL_LUTCTRL offset) LUT Control x */ +#define CCL_LUTCTRL_RESETVALUE _U_(0x00000000) /**< \brief (CCL_LUTCTRL reset_value) LUT Control x */ + +#define CCL_LUTCTRL_ENABLE_Pos 1 /**< \brief (CCL_LUTCTRL) LUT Enable */ +#define CCL_LUTCTRL_ENABLE (_U_(0x1) << CCL_LUTCTRL_ENABLE_Pos) +#define CCL_LUTCTRL_FILTSEL_Pos 4 /**< \brief (CCL_LUTCTRL) Filter Selection */ +#define CCL_LUTCTRL_FILTSEL_Msk (_U_(0x3) << CCL_LUTCTRL_FILTSEL_Pos) +#define CCL_LUTCTRL_FILTSEL(value) (CCL_LUTCTRL_FILTSEL_Msk & ((value) << CCL_LUTCTRL_FILTSEL_Pos)) +#define CCL_LUTCTRL_FILTSEL_DISABLE_Val _U_(0x0) /**< \brief (CCL_LUTCTRL) Filter disabled */ +#define CCL_LUTCTRL_FILTSEL_SYNCH_Val _U_(0x1) /**< \brief (CCL_LUTCTRL) Synchronizer enabled */ +#define CCL_LUTCTRL_FILTSEL_FILTER_Val _U_(0x2) /**< \brief (CCL_LUTCTRL) Filter enabled */ +#define CCL_LUTCTRL_FILTSEL_DISABLE (CCL_LUTCTRL_FILTSEL_DISABLE_Val << CCL_LUTCTRL_FILTSEL_Pos) +#define CCL_LUTCTRL_FILTSEL_SYNCH (CCL_LUTCTRL_FILTSEL_SYNCH_Val << CCL_LUTCTRL_FILTSEL_Pos) +#define CCL_LUTCTRL_FILTSEL_FILTER (CCL_LUTCTRL_FILTSEL_FILTER_Val << CCL_LUTCTRL_FILTSEL_Pos) +#define CCL_LUTCTRL_EDGESEL_Pos 7 /**< \brief (CCL_LUTCTRL) Edge Selection */ +#define CCL_LUTCTRL_EDGESEL (_U_(0x1) << CCL_LUTCTRL_EDGESEL_Pos) +#define CCL_LUTCTRL_INSEL0_Pos 8 /**< \brief (CCL_LUTCTRL) Input Selection 0 */ +#define CCL_LUTCTRL_INSEL0_Msk (_U_(0xF) << CCL_LUTCTRL_INSEL0_Pos) +#define CCL_LUTCTRL_INSEL0(value) (CCL_LUTCTRL_INSEL0_Msk & ((value) << CCL_LUTCTRL_INSEL0_Pos)) +#define CCL_LUTCTRL_INSEL0_MASK_Val _U_(0x0) /**< \brief (CCL_LUTCTRL) Masked input */ +#define CCL_LUTCTRL_INSEL0_FEEDBACK_Val _U_(0x1) /**< \brief (CCL_LUTCTRL) Feedback input source */ +#define CCL_LUTCTRL_INSEL0_LINK_Val _U_(0x2) /**< \brief (CCL_LUTCTRL) Linked LUT input source */ +#define CCL_LUTCTRL_INSEL0_EVENT_Val _U_(0x3) /**< \brief (CCL_LUTCTRL) Event input source */ +#define CCL_LUTCTRL_INSEL0_IO_Val _U_(0x4) /**< \brief (CCL_LUTCTRL) I/O pin input source */ +#define CCL_LUTCTRL_INSEL0_AC_Val _U_(0x5) /**< \brief (CCL_LUTCTRL) AC input source */ +#define CCL_LUTCTRL_INSEL0_TC_Val _U_(0x6) /**< \brief (CCL_LUTCTRL) TC input source */ +#define CCL_LUTCTRL_INSEL0_ALTTC_Val _U_(0x7) /**< \brief (CCL_LUTCTRL) Alternate TC input source */ +#define CCL_LUTCTRL_INSEL0_TCC_Val _U_(0x8) /**< \brief (CCL_LUTCTRL) TCC input source */ +#define CCL_LUTCTRL_INSEL0_SERCOM_Val _U_(0x9) /**< \brief (CCL_LUTCTRL) SERCOM input source */ +#define CCL_LUTCTRL_INSEL0_MASK (CCL_LUTCTRL_INSEL0_MASK_Val << CCL_LUTCTRL_INSEL0_Pos) +#define CCL_LUTCTRL_INSEL0_FEEDBACK (CCL_LUTCTRL_INSEL0_FEEDBACK_Val << CCL_LUTCTRL_INSEL0_Pos) +#define CCL_LUTCTRL_INSEL0_LINK (CCL_LUTCTRL_INSEL0_LINK_Val << CCL_LUTCTRL_INSEL0_Pos) +#define CCL_LUTCTRL_INSEL0_EVENT (CCL_LUTCTRL_INSEL0_EVENT_Val << CCL_LUTCTRL_INSEL0_Pos) +#define CCL_LUTCTRL_INSEL0_IO (CCL_LUTCTRL_INSEL0_IO_Val << CCL_LUTCTRL_INSEL0_Pos) +#define CCL_LUTCTRL_INSEL0_AC (CCL_LUTCTRL_INSEL0_AC_Val << CCL_LUTCTRL_INSEL0_Pos) +#define CCL_LUTCTRL_INSEL0_TC (CCL_LUTCTRL_INSEL0_TC_Val << CCL_LUTCTRL_INSEL0_Pos) +#define CCL_LUTCTRL_INSEL0_ALTTC (CCL_LUTCTRL_INSEL0_ALTTC_Val << CCL_LUTCTRL_INSEL0_Pos) +#define CCL_LUTCTRL_INSEL0_TCC (CCL_LUTCTRL_INSEL0_TCC_Val << CCL_LUTCTRL_INSEL0_Pos) +#define CCL_LUTCTRL_INSEL0_SERCOM (CCL_LUTCTRL_INSEL0_SERCOM_Val << CCL_LUTCTRL_INSEL0_Pos) +#define CCL_LUTCTRL_INSEL1_Pos 12 /**< \brief (CCL_LUTCTRL) Input Selection 1 */ +#define CCL_LUTCTRL_INSEL1_Msk (_U_(0xF) << CCL_LUTCTRL_INSEL1_Pos) +#define CCL_LUTCTRL_INSEL1(value) (CCL_LUTCTRL_INSEL1_Msk & ((value) << CCL_LUTCTRL_INSEL1_Pos)) +#define CCL_LUTCTRL_INSEL1_MASK_Val _U_(0x0) /**< \brief (CCL_LUTCTRL) Masked input */ +#define CCL_LUTCTRL_INSEL1_FEEDBACK_Val _U_(0x1) /**< \brief (CCL_LUTCTRL) Feedback input source */ +#define CCL_LUTCTRL_INSEL1_LINK_Val _U_(0x2) /**< \brief (CCL_LUTCTRL) Linked LUT input source */ +#define CCL_LUTCTRL_INSEL1_EVENT_Val _U_(0x3) /**< \brief (CCL_LUTCTRL) Event input source */ +#define CCL_LUTCTRL_INSEL1_IO_Val _U_(0x4) /**< \brief (CCL_LUTCTRL) I/O pin input source */ +#define CCL_LUTCTRL_INSEL1_AC_Val _U_(0x5) /**< \brief (CCL_LUTCTRL) AC input source */ +#define CCL_LUTCTRL_INSEL1_TC_Val _U_(0x6) /**< \brief (CCL_LUTCTRL) TC input source */ +#define CCL_LUTCTRL_INSEL1_ALTTC_Val _U_(0x7) /**< \brief (CCL_LUTCTRL) Alternate TC input source */ +#define CCL_LUTCTRL_INSEL1_TCC_Val _U_(0x8) /**< \brief (CCL_LUTCTRL) TCC input source */ +#define CCL_LUTCTRL_INSEL1_SERCOM_Val _U_(0x9) /**< \brief (CCL_LUTCTRL) SERCOM input source */ +#define CCL_LUTCTRL_INSEL1_MASK (CCL_LUTCTRL_INSEL1_MASK_Val << CCL_LUTCTRL_INSEL1_Pos) +#define CCL_LUTCTRL_INSEL1_FEEDBACK (CCL_LUTCTRL_INSEL1_FEEDBACK_Val << CCL_LUTCTRL_INSEL1_Pos) +#define CCL_LUTCTRL_INSEL1_LINK (CCL_LUTCTRL_INSEL1_LINK_Val << CCL_LUTCTRL_INSEL1_Pos) +#define CCL_LUTCTRL_INSEL1_EVENT (CCL_LUTCTRL_INSEL1_EVENT_Val << CCL_LUTCTRL_INSEL1_Pos) +#define CCL_LUTCTRL_INSEL1_IO (CCL_LUTCTRL_INSEL1_IO_Val << CCL_LUTCTRL_INSEL1_Pos) +#define CCL_LUTCTRL_INSEL1_AC (CCL_LUTCTRL_INSEL1_AC_Val << CCL_LUTCTRL_INSEL1_Pos) +#define CCL_LUTCTRL_INSEL1_TC (CCL_LUTCTRL_INSEL1_TC_Val << CCL_LUTCTRL_INSEL1_Pos) +#define CCL_LUTCTRL_INSEL1_ALTTC (CCL_LUTCTRL_INSEL1_ALTTC_Val << CCL_LUTCTRL_INSEL1_Pos) +#define CCL_LUTCTRL_INSEL1_TCC (CCL_LUTCTRL_INSEL1_TCC_Val << CCL_LUTCTRL_INSEL1_Pos) +#define CCL_LUTCTRL_INSEL1_SERCOM (CCL_LUTCTRL_INSEL1_SERCOM_Val << CCL_LUTCTRL_INSEL1_Pos) +#define CCL_LUTCTRL_INSEL2_Pos 16 /**< \brief (CCL_LUTCTRL) Input Selection 2 */ +#define CCL_LUTCTRL_INSEL2_Msk (_U_(0xF) << CCL_LUTCTRL_INSEL2_Pos) +#define CCL_LUTCTRL_INSEL2(value) (CCL_LUTCTRL_INSEL2_Msk & ((value) << CCL_LUTCTRL_INSEL2_Pos)) +#define CCL_LUTCTRL_INSEL2_MASK_Val _U_(0x0) /**< \brief (CCL_LUTCTRL) Masked input */ +#define CCL_LUTCTRL_INSEL2_FEEDBACK_Val _U_(0x1) /**< \brief (CCL_LUTCTRL) Feedback input source */ +#define CCL_LUTCTRL_INSEL2_LINK_Val _U_(0x2) /**< \brief (CCL_LUTCTRL) Linked LUT input source */ +#define CCL_LUTCTRL_INSEL2_EVENT_Val _U_(0x3) /**< \brief (CCL_LUTCTRL) Event input source */ +#define CCL_LUTCTRL_INSEL2_IO_Val _U_(0x4) /**< \brief (CCL_LUTCTRL) I/O pin input source */ +#define CCL_LUTCTRL_INSEL2_AC_Val _U_(0x5) /**< \brief (CCL_LUTCTRL) AC input source */ +#define CCL_LUTCTRL_INSEL2_TC_Val _U_(0x6) /**< \brief (CCL_LUTCTRL) TC input source */ +#define CCL_LUTCTRL_INSEL2_ALTTC_Val _U_(0x7) /**< \brief (CCL_LUTCTRL) Alternate TC input source */ +#define CCL_LUTCTRL_INSEL2_TCC_Val _U_(0x8) /**< \brief (CCL_LUTCTRL) TCC input source */ +#define CCL_LUTCTRL_INSEL2_SERCOM_Val _U_(0x9) /**< \brief (CCL_LUTCTRL) SERCOM input source */ +#define CCL_LUTCTRL_INSEL2_MASK (CCL_LUTCTRL_INSEL2_MASK_Val << CCL_LUTCTRL_INSEL2_Pos) +#define CCL_LUTCTRL_INSEL2_FEEDBACK (CCL_LUTCTRL_INSEL2_FEEDBACK_Val << CCL_LUTCTRL_INSEL2_Pos) +#define CCL_LUTCTRL_INSEL2_LINK (CCL_LUTCTRL_INSEL2_LINK_Val << CCL_LUTCTRL_INSEL2_Pos) +#define CCL_LUTCTRL_INSEL2_EVENT (CCL_LUTCTRL_INSEL2_EVENT_Val << CCL_LUTCTRL_INSEL2_Pos) +#define CCL_LUTCTRL_INSEL2_IO (CCL_LUTCTRL_INSEL2_IO_Val << CCL_LUTCTRL_INSEL2_Pos) +#define CCL_LUTCTRL_INSEL2_AC (CCL_LUTCTRL_INSEL2_AC_Val << CCL_LUTCTRL_INSEL2_Pos) +#define CCL_LUTCTRL_INSEL2_TC (CCL_LUTCTRL_INSEL2_TC_Val << CCL_LUTCTRL_INSEL2_Pos) +#define CCL_LUTCTRL_INSEL2_ALTTC (CCL_LUTCTRL_INSEL2_ALTTC_Val << CCL_LUTCTRL_INSEL2_Pos) +#define CCL_LUTCTRL_INSEL2_TCC (CCL_LUTCTRL_INSEL2_TCC_Val << CCL_LUTCTRL_INSEL2_Pos) +#define CCL_LUTCTRL_INSEL2_SERCOM (CCL_LUTCTRL_INSEL2_SERCOM_Val << CCL_LUTCTRL_INSEL2_Pos) +#define CCL_LUTCTRL_INVEI_Pos 20 /**< \brief (CCL_LUTCTRL) Inverted Event Input Enable */ +#define CCL_LUTCTRL_INVEI (_U_(0x1) << CCL_LUTCTRL_INVEI_Pos) +#define CCL_LUTCTRL_LUTEI_Pos 21 /**< \brief (CCL_LUTCTRL) LUT Event Input Enable */ +#define CCL_LUTCTRL_LUTEI (_U_(0x1) << CCL_LUTCTRL_LUTEI_Pos) +#define CCL_LUTCTRL_LUTEO_Pos 22 /**< \brief (CCL_LUTCTRL) LUT Event Output Enable */ +#define CCL_LUTCTRL_LUTEO (_U_(0x1) << CCL_LUTCTRL_LUTEO_Pos) +#define CCL_LUTCTRL_TRUTH_Pos 24 /**< \brief (CCL_LUTCTRL) Truth Value */ +#define CCL_LUTCTRL_TRUTH_Msk (_U_(0xFF) << CCL_LUTCTRL_TRUTH_Pos) +#define CCL_LUTCTRL_TRUTH(value) (CCL_LUTCTRL_TRUTH_Msk & ((value) << CCL_LUTCTRL_TRUTH_Pos)) +#define CCL_LUTCTRL_MASK _U_(0xFF7FFFB2) /**< \brief (CCL_LUTCTRL) MASK Register */ + +/** \brief CCL hardware registers */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef struct { + __IO CCL_CTRL_Type CTRL; /**< \brief Offset: 0x0 (R/W 8) Control */ + RoReg8 Reserved1[0x3]; + __IO CCL_SEQCTRL_Type SEQCTRL[2]; /**< \brief Offset: 0x4 (R/W 8) SEQ Control x */ + RoReg8 Reserved2[0x2]; + __IO CCL_LUTCTRL_Type LUTCTRL[4]; /**< \brief Offset: 0x8 (R/W 32) LUT Control x */ +} Ccl; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/*@}*/ + +#endif /* _SAMD51_CCL_COMPONENT_ */ diff --git a/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/cmcc.h b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/cmcc.h new file mode 100644 index 000000000..92fa6813e --- /dev/null +++ b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/cmcc.h @@ -0,0 +1,357 @@ +/** + * \file + * + * \brief Component description for CMCC + * + * Copyright (c) 2017 Microchip Technology Inc. + * + * \asf_license_start + * + * \page License + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 Licence 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. + * + * \asf_license_stop + * + */ + +#ifndef _SAMD51_CMCC_COMPONENT_ +#define _SAMD51_CMCC_COMPONENT_ + +/* ========================================================================== */ +/** SOFTWARE API DEFINITION FOR CMCC */ +/* ========================================================================== */ +/** \addtogroup SAMD51_CMCC Cortex M Cache Controller */ +/*@{*/ + +#define CMCC_U2015 +#define REV_CMCC 0x600 + +/* -------- CMCC_TYPE : (CMCC Offset: 0x00) (R/ 32) Cache Type Register -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t :1; /*!< bit: 0 Reserved */ + uint32_t GCLK:1; /*!< bit: 1 dynamic Clock Gating supported */ + uint32_t :2; /*!< bit: 2.. 3 Reserved */ + uint32_t RRP:1; /*!< bit: 4 Round Robin Policy supported */ + uint32_t WAYNUM:2; /*!< bit: 5.. 6 Number of Way */ + uint32_t LCKDOWN:1; /*!< bit: 7 Lock Down supported */ + uint32_t CSIZE:3; /*!< bit: 8..10 Cache Size */ + uint32_t CLSIZE:3; /*!< bit: 11..13 Cache Line Size */ + uint32_t :18; /*!< bit: 14..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CMCC_TYPE_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CMCC_TYPE_OFFSET 0x00 /**< \brief (CMCC_TYPE offset) Cache Type Register */ +#define CMCC_TYPE_RESETVALUE _U_(0x000012D2) /**< \brief (CMCC_TYPE reset_value) Cache Type Register */ + +#define CMCC_TYPE_GCLK_Pos 1 /**< \brief (CMCC_TYPE) dynamic Clock Gating supported */ +#define CMCC_TYPE_GCLK (_U_(0x1) << CMCC_TYPE_GCLK_Pos) +#define CMCC_TYPE_RRP_Pos 4 /**< \brief (CMCC_TYPE) Round Robin Policy supported */ +#define CMCC_TYPE_RRP (_U_(0x1) << CMCC_TYPE_RRP_Pos) +#define CMCC_TYPE_WAYNUM_Pos 5 /**< \brief (CMCC_TYPE) Number of Way */ +#define CMCC_TYPE_WAYNUM_Msk (_U_(0x3) << CMCC_TYPE_WAYNUM_Pos) +#define CMCC_TYPE_WAYNUM(value) (CMCC_TYPE_WAYNUM_Msk & ((value) << CMCC_TYPE_WAYNUM_Pos)) +#define CMCC_TYPE_WAYNUM_DMAPPED_Val _U_(0x0) /**< \brief (CMCC_TYPE) Direct Mapped Cache */ +#define CMCC_TYPE_WAYNUM_ARCH2WAY_Val _U_(0x1) /**< \brief (CMCC_TYPE) 2-WAY set associative */ +#define CMCC_TYPE_WAYNUM_ARCH4WAY_Val _U_(0x2) /**< \brief (CMCC_TYPE) 4-WAY set associative */ +#define CMCC_TYPE_WAYNUM_DMAPPED (CMCC_TYPE_WAYNUM_DMAPPED_Val << CMCC_TYPE_WAYNUM_Pos) +#define CMCC_TYPE_WAYNUM_ARCH2WAY (CMCC_TYPE_WAYNUM_ARCH2WAY_Val << CMCC_TYPE_WAYNUM_Pos) +#define CMCC_TYPE_WAYNUM_ARCH4WAY (CMCC_TYPE_WAYNUM_ARCH4WAY_Val << CMCC_TYPE_WAYNUM_Pos) +#define CMCC_TYPE_LCKDOWN_Pos 7 /**< \brief (CMCC_TYPE) Lock Down supported */ +#define CMCC_TYPE_LCKDOWN (_U_(0x1) << CMCC_TYPE_LCKDOWN_Pos) +#define CMCC_TYPE_CSIZE_Pos 8 /**< \brief (CMCC_TYPE) Cache Size */ +#define CMCC_TYPE_CSIZE_Msk (_U_(0x7) << CMCC_TYPE_CSIZE_Pos) +#define CMCC_TYPE_CSIZE(value) (CMCC_TYPE_CSIZE_Msk & ((value) << CMCC_TYPE_CSIZE_Pos)) +#define CMCC_TYPE_CSIZE_CSIZE_1KB_Val _U_(0x0) /**< \brief (CMCC_TYPE) Cache Size is 1 KB */ +#define CMCC_TYPE_CSIZE_CSIZE_2KB_Val _U_(0x1) /**< \brief (CMCC_TYPE) Cache Size is 2 KB */ +#define CMCC_TYPE_CSIZE_CSIZE_4KB_Val _U_(0x2) /**< \brief (CMCC_TYPE) Cache Size is 4 KB */ +#define CMCC_TYPE_CSIZE_CSIZE_8KB_Val _U_(0x3) /**< \brief (CMCC_TYPE) Cache Size is 8 KB */ +#define CMCC_TYPE_CSIZE_CSIZE_16KB_Val _U_(0x4) /**< \brief (CMCC_TYPE) Cache Size is 16 KB */ +#define CMCC_TYPE_CSIZE_CSIZE_32KB_Val _U_(0x5) /**< \brief (CMCC_TYPE) Cache Size is 32 KB */ +#define CMCC_TYPE_CSIZE_CSIZE_64KB_Val _U_(0x6) /**< \brief (CMCC_TYPE) Cache Size is 64 KB */ +#define CMCC_TYPE_CSIZE_CSIZE_1KB (CMCC_TYPE_CSIZE_CSIZE_1KB_Val << CMCC_TYPE_CSIZE_Pos) +#define CMCC_TYPE_CSIZE_CSIZE_2KB (CMCC_TYPE_CSIZE_CSIZE_2KB_Val << CMCC_TYPE_CSIZE_Pos) +#define CMCC_TYPE_CSIZE_CSIZE_4KB (CMCC_TYPE_CSIZE_CSIZE_4KB_Val << CMCC_TYPE_CSIZE_Pos) +#define CMCC_TYPE_CSIZE_CSIZE_8KB (CMCC_TYPE_CSIZE_CSIZE_8KB_Val << CMCC_TYPE_CSIZE_Pos) +#define CMCC_TYPE_CSIZE_CSIZE_16KB (CMCC_TYPE_CSIZE_CSIZE_16KB_Val << CMCC_TYPE_CSIZE_Pos) +#define CMCC_TYPE_CSIZE_CSIZE_32KB (CMCC_TYPE_CSIZE_CSIZE_32KB_Val << CMCC_TYPE_CSIZE_Pos) +#define CMCC_TYPE_CSIZE_CSIZE_64KB (CMCC_TYPE_CSIZE_CSIZE_64KB_Val << CMCC_TYPE_CSIZE_Pos) +#define CMCC_TYPE_CLSIZE_Pos 11 /**< \brief (CMCC_TYPE) Cache Line Size */ +#define CMCC_TYPE_CLSIZE_Msk (_U_(0x7) << CMCC_TYPE_CLSIZE_Pos) +#define CMCC_TYPE_CLSIZE(value) (CMCC_TYPE_CLSIZE_Msk & ((value) << CMCC_TYPE_CLSIZE_Pos)) +#define CMCC_TYPE_CLSIZE_CLSIZE_4B_Val _U_(0x0) /**< \brief (CMCC_TYPE) Cache Line Size is 4 bytes */ +#define CMCC_TYPE_CLSIZE_CLSIZE_8B_Val _U_(0x1) /**< \brief (CMCC_TYPE) Cache Line Size is 8 bytes */ +#define CMCC_TYPE_CLSIZE_CLSIZE_16B_Val _U_(0x2) /**< \brief (CMCC_TYPE) Cache Line Size is 16 bytes */ +#define CMCC_TYPE_CLSIZE_CLSIZE_32B_Val _U_(0x3) /**< \brief (CMCC_TYPE) Cache Line Size is 32 bytes */ +#define CMCC_TYPE_CLSIZE_CLSIZE_64B_Val _U_(0x4) /**< \brief (CMCC_TYPE) Cache Line Size is 64 bytes */ +#define CMCC_TYPE_CLSIZE_CLSIZE_128B_Val _U_(0x5) /**< \brief (CMCC_TYPE) Cache Line Size is 128 bytes */ +#define CMCC_TYPE_CLSIZE_CLSIZE_4B (CMCC_TYPE_CLSIZE_CLSIZE_4B_Val << CMCC_TYPE_CLSIZE_Pos) +#define CMCC_TYPE_CLSIZE_CLSIZE_8B (CMCC_TYPE_CLSIZE_CLSIZE_8B_Val << CMCC_TYPE_CLSIZE_Pos) +#define CMCC_TYPE_CLSIZE_CLSIZE_16B (CMCC_TYPE_CLSIZE_CLSIZE_16B_Val << CMCC_TYPE_CLSIZE_Pos) +#define CMCC_TYPE_CLSIZE_CLSIZE_32B (CMCC_TYPE_CLSIZE_CLSIZE_32B_Val << CMCC_TYPE_CLSIZE_Pos) +#define CMCC_TYPE_CLSIZE_CLSIZE_64B (CMCC_TYPE_CLSIZE_CLSIZE_64B_Val << CMCC_TYPE_CLSIZE_Pos) +#define CMCC_TYPE_CLSIZE_CLSIZE_128B (CMCC_TYPE_CLSIZE_CLSIZE_128B_Val << CMCC_TYPE_CLSIZE_Pos) +#define CMCC_TYPE_MASK _U_(0x00003FF2) /**< \brief (CMCC_TYPE) MASK Register */ + +/* -------- CMCC_CFG : (CMCC Offset: 0x04) (R/W 32) Cache Configuration Register -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t :1; /*!< bit: 0 Reserved */ + uint32_t ICDIS:1; /*!< bit: 1 Instruction Cache Disable */ + uint32_t DCDIS:1; /*!< bit: 2 Data Cache Disable */ + uint32_t :1; /*!< bit: 3 Reserved */ + uint32_t CSIZESW:3; /*!< bit: 4.. 6 Cache size configured by software */ + uint32_t :25; /*!< bit: 7..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CMCC_CFG_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CMCC_CFG_OFFSET 0x04 /**< \brief (CMCC_CFG offset) Cache Configuration Register */ +#define CMCC_CFG_RESETVALUE _U_(0x00000020) /**< \brief (CMCC_CFG reset_value) Cache Configuration Register */ + +#define CMCC_CFG_ICDIS_Pos 1 /**< \brief (CMCC_CFG) Instruction Cache Disable */ +#define CMCC_CFG_ICDIS (_U_(0x1) << CMCC_CFG_ICDIS_Pos) +#define CMCC_CFG_DCDIS_Pos 2 /**< \brief (CMCC_CFG) Data Cache Disable */ +#define CMCC_CFG_DCDIS (_U_(0x1) << CMCC_CFG_DCDIS_Pos) +#define CMCC_CFG_CSIZESW_Pos 4 /**< \brief (CMCC_CFG) Cache size configured by software */ +#define CMCC_CFG_CSIZESW_Msk (_U_(0x7) << CMCC_CFG_CSIZESW_Pos) +#define CMCC_CFG_CSIZESW(value) (CMCC_CFG_CSIZESW_Msk & ((value) << CMCC_CFG_CSIZESW_Pos)) +#define CMCC_CFG_CSIZESW_CONF_CSIZE_1KB_Val _U_(0x0) /**< \brief (CMCC_CFG) the Cache Size is configured to 1KB */ +#define CMCC_CFG_CSIZESW_CONF_CSIZE_2KB_Val _U_(0x1) /**< \brief (CMCC_CFG) the Cache Size is configured to 2KB */ +#define CMCC_CFG_CSIZESW_CONF_CSIZE_4KB_Val _U_(0x2) /**< \brief (CMCC_CFG) the Cache Size is configured to 4KB */ +#define CMCC_CFG_CSIZESW_CONF_CSIZE_8KB_Val _U_(0x3) /**< \brief (CMCC_CFG) the Cache Size is configured to 8KB */ +#define CMCC_CFG_CSIZESW_CONF_CSIZE_16KB_Val _U_(0x4) /**< \brief (CMCC_CFG) the Cache Size is configured to 16KB */ +#define CMCC_CFG_CSIZESW_CONF_CSIZE_32KB_Val _U_(0x5) /**< \brief (CMCC_CFG) the Cache Size is configured to 32KB */ +#define CMCC_CFG_CSIZESW_CONF_CSIZE_64KB_Val _U_(0x6) /**< \brief (CMCC_CFG) the Cache Size is configured to 64KB */ +#define CMCC_CFG_CSIZESW_CONF_CSIZE_1KB (CMCC_CFG_CSIZESW_CONF_CSIZE_1KB_Val << CMCC_CFG_CSIZESW_Pos) +#define CMCC_CFG_CSIZESW_CONF_CSIZE_2KB (CMCC_CFG_CSIZESW_CONF_CSIZE_2KB_Val << CMCC_CFG_CSIZESW_Pos) +#define CMCC_CFG_CSIZESW_CONF_CSIZE_4KB (CMCC_CFG_CSIZESW_CONF_CSIZE_4KB_Val << CMCC_CFG_CSIZESW_Pos) +#define CMCC_CFG_CSIZESW_CONF_CSIZE_8KB (CMCC_CFG_CSIZESW_CONF_CSIZE_8KB_Val << CMCC_CFG_CSIZESW_Pos) +#define CMCC_CFG_CSIZESW_CONF_CSIZE_16KB (CMCC_CFG_CSIZESW_CONF_CSIZE_16KB_Val << CMCC_CFG_CSIZESW_Pos) +#define CMCC_CFG_CSIZESW_CONF_CSIZE_32KB (CMCC_CFG_CSIZESW_CONF_CSIZE_32KB_Val << CMCC_CFG_CSIZESW_Pos) +#define CMCC_CFG_CSIZESW_CONF_CSIZE_64KB (CMCC_CFG_CSIZESW_CONF_CSIZE_64KB_Val << CMCC_CFG_CSIZESW_Pos) +#define CMCC_CFG_MASK _U_(0x00000076) /**< \brief (CMCC_CFG) MASK Register */ + +/* -------- CMCC_CTRL : (CMCC Offset: 0x08) ( /W 32) Cache Control Register -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t CEN:1; /*!< bit: 0 Cache Controller Enable */ + uint32_t :31; /*!< bit: 1..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CMCC_CTRL_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CMCC_CTRL_OFFSET 0x08 /**< \brief (CMCC_CTRL offset) Cache Control Register */ +#define CMCC_CTRL_RESETVALUE _U_(0x00000000) /**< \brief (CMCC_CTRL reset_value) Cache Control Register */ + +#define CMCC_CTRL_CEN_Pos 0 /**< \brief (CMCC_CTRL) Cache Controller Enable */ +#define CMCC_CTRL_CEN (_U_(0x1) << CMCC_CTRL_CEN_Pos) +#define CMCC_CTRL_MASK _U_(0x00000001) /**< \brief (CMCC_CTRL) MASK Register */ + +/* -------- CMCC_SR : (CMCC Offset: 0x0C) (R/ 32) Cache Status Register -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t CSTS:1; /*!< bit: 0 Cache Controller Status */ + uint32_t :31; /*!< bit: 1..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CMCC_SR_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CMCC_SR_OFFSET 0x0C /**< \brief (CMCC_SR offset) Cache Status Register */ +#define CMCC_SR_RESETVALUE _U_(0x00000000) /**< \brief (CMCC_SR reset_value) Cache Status Register */ + +#define CMCC_SR_CSTS_Pos 0 /**< \brief (CMCC_SR) Cache Controller Status */ +#define CMCC_SR_CSTS (_U_(0x1) << CMCC_SR_CSTS_Pos) +#define CMCC_SR_MASK _U_(0x00000001) /**< \brief (CMCC_SR) MASK Register */ + +/* -------- CMCC_LCKWAY : (CMCC Offset: 0x10) (R/W 32) Cache Lock per Way Register -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t LCKWAY:4; /*!< bit: 0.. 3 Lockdown way Register */ + uint32_t :28; /*!< bit: 4..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CMCC_LCKWAY_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CMCC_LCKWAY_OFFSET 0x10 /**< \brief (CMCC_LCKWAY offset) Cache Lock per Way Register */ +#define CMCC_LCKWAY_RESETVALUE _U_(0x00000000) /**< \brief (CMCC_LCKWAY reset_value) Cache Lock per Way Register */ + +#define CMCC_LCKWAY_LCKWAY_Pos 0 /**< \brief (CMCC_LCKWAY) Lockdown way Register */ +#define CMCC_LCKWAY_LCKWAY_Msk (_U_(0xF) << CMCC_LCKWAY_LCKWAY_Pos) +#define CMCC_LCKWAY_LCKWAY(value) (CMCC_LCKWAY_LCKWAY_Msk & ((value) << CMCC_LCKWAY_LCKWAY_Pos)) +#define CMCC_LCKWAY_MASK _U_(0x0000000F) /**< \brief (CMCC_LCKWAY) MASK Register */ + +/* -------- CMCC_MAINT0 : (CMCC Offset: 0x20) ( /W 32) Cache Maintenance Register 0 -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t INVALL:1; /*!< bit: 0 Cache Controller invalidate All */ + uint32_t :31; /*!< bit: 1..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CMCC_MAINT0_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CMCC_MAINT0_OFFSET 0x20 /**< \brief (CMCC_MAINT0 offset) Cache Maintenance Register 0 */ +#define CMCC_MAINT0_RESETVALUE _U_(0x00000000) /**< \brief (CMCC_MAINT0 reset_value) Cache Maintenance Register 0 */ + +#define CMCC_MAINT0_INVALL_Pos 0 /**< \brief (CMCC_MAINT0) Cache Controller invalidate All */ +#define CMCC_MAINT0_INVALL (_U_(0x1) << CMCC_MAINT0_INVALL_Pos) +#define CMCC_MAINT0_MASK _U_(0x00000001) /**< \brief (CMCC_MAINT0) MASK Register */ + +/* -------- CMCC_MAINT1 : (CMCC Offset: 0x24) ( /W 32) Cache Maintenance Register 1 -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t :4; /*!< bit: 0.. 3 Reserved */ + uint32_t INDEX:8; /*!< bit: 4..11 Invalidate Index */ + uint32_t :16; /*!< bit: 12..27 Reserved */ + uint32_t WAY:4; /*!< bit: 28..31 Invalidate Way */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CMCC_MAINT1_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CMCC_MAINT1_OFFSET 0x24 /**< \brief (CMCC_MAINT1 offset) Cache Maintenance Register 1 */ +#define CMCC_MAINT1_RESETVALUE _U_(0x00000000) /**< \brief (CMCC_MAINT1 reset_value) Cache Maintenance Register 1 */ + +#define CMCC_MAINT1_INDEX_Pos 4 /**< \brief (CMCC_MAINT1) Invalidate Index */ +#define CMCC_MAINT1_INDEX_Msk (_U_(0xFF) << CMCC_MAINT1_INDEX_Pos) +#define CMCC_MAINT1_INDEX(value) (CMCC_MAINT1_INDEX_Msk & ((value) << CMCC_MAINT1_INDEX_Pos)) +#define CMCC_MAINT1_WAY_Pos 28 /**< \brief (CMCC_MAINT1) Invalidate Way */ +#define CMCC_MAINT1_WAY_Msk (_U_(0xF) << CMCC_MAINT1_WAY_Pos) +#define CMCC_MAINT1_WAY(value) (CMCC_MAINT1_WAY_Msk & ((value) << CMCC_MAINT1_WAY_Pos)) +#define CMCC_MAINT1_WAY_WAY0_Val _U_(0x0) /**< \brief (CMCC_MAINT1) Way 0 is selection for index invalidation */ +#define CMCC_MAINT1_WAY_WAY1_Val _U_(0x1) /**< \brief (CMCC_MAINT1) Way 1 is selection for index invalidation */ +#define CMCC_MAINT1_WAY_WAY2_Val _U_(0x2) /**< \brief (CMCC_MAINT1) Way 2 is selection for index invalidation */ +#define CMCC_MAINT1_WAY_WAY3_Val _U_(0x3) /**< \brief (CMCC_MAINT1) Way 3 is selection for index invalidation */ +#define CMCC_MAINT1_WAY_WAY0 (CMCC_MAINT1_WAY_WAY0_Val << CMCC_MAINT1_WAY_Pos) +#define CMCC_MAINT1_WAY_WAY1 (CMCC_MAINT1_WAY_WAY1_Val << CMCC_MAINT1_WAY_Pos) +#define CMCC_MAINT1_WAY_WAY2 (CMCC_MAINT1_WAY_WAY2_Val << CMCC_MAINT1_WAY_Pos) +#define CMCC_MAINT1_WAY_WAY3 (CMCC_MAINT1_WAY_WAY3_Val << CMCC_MAINT1_WAY_Pos) +#define CMCC_MAINT1_MASK _U_(0xF0000FF0) /**< \brief (CMCC_MAINT1) MASK Register */ + +/* -------- CMCC_MCFG : (CMCC Offset: 0x28) (R/W 32) Cache Monitor Configuration Register -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t MODE:2; /*!< bit: 0.. 1 Cache Controller Monitor Counter Mode */ + uint32_t :30; /*!< bit: 2..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CMCC_MCFG_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CMCC_MCFG_OFFSET 0x28 /**< \brief (CMCC_MCFG offset) Cache Monitor Configuration Register */ +#define CMCC_MCFG_RESETVALUE _U_(0x00000000) /**< \brief (CMCC_MCFG reset_value) Cache Monitor Configuration Register */ + +#define CMCC_MCFG_MODE_Pos 0 /**< \brief (CMCC_MCFG) Cache Controller Monitor Counter Mode */ +#define CMCC_MCFG_MODE_Msk (_U_(0x3) << CMCC_MCFG_MODE_Pos) +#define CMCC_MCFG_MODE(value) (CMCC_MCFG_MODE_Msk & ((value) << CMCC_MCFG_MODE_Pos)) +#define CMCC_MCFG_MODE_CYCLE_COUNT_Val _U_(0x0) /**< \brief (CMCC_MCFG) cycle counter */ +#define CMCC_MCFG_MODE_IHIT_COUNT_Val _U_(0x1) /**< \brief (CMCC_MCFG) instruction hit counter */ +#define CMCC_MCFG_MODE_DHIT_COUNT_Val _U_(0x2) /**< \brief (CMCC_MCFG) data hit counter */ +#define CMCC_MCFG_MODE_CYCLE_COUNT (CMCC_MCFG_MODE_CYCLE_COUNT_Val << CMCC_MCFG_MODE_Pos) +#define CMCC_MCFG_MODE_IHIT_COUNT (CMCC_MCFG_MODE_IHIT_COUNT_Val << CMCC_MCFG_MODE_Pos) +#define CMCC_MCFG_MODE_DHIT_COUNT (CMCC_MCFG_MODE_DHIT_COUNT_Val << CMCC_MCFG_MODE_Pos) +#define CMCC_MCFG_MASK _U_(0x00000003) /**< \brief (CMCC_MCFG) MASK Register */ + +/* -------- CMCC_MEN : (CMCC Offset: 0x2C) (R/W 32) Cache Monitor Enable Register -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t MENABLE:1; /*!< bit: 0 Cache Controller Monitor Enable */ + uint32_t :31; /*!< bit: 1..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CMCC_MEN_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CMCC_MEN_OFFSET 0x2C /**< \brief (CMCC_MEN offset) Cache Monitor Enable Register */ +#define CMCC_MEN_RESETVALUE _U_(0x00000000) /**< \brief (CMCC_MEN reset_value) Cache Monitor Enable Register */ + +#define CMCC_MEN_MENABLE_Pos 0 /**< \brief (CMCC_MEN) Cache Controller Monitor Enable */ +#define CMCC_MEN_MENABLE (_U_(0x1) << CMCC_MEN_MENABLE_Pos) +#define CMCC_MEN_MASK _U_(0x00000001) /**< \brief (CMCC_MEN) MASK Register */ + +/* -------- CMCC_MCTRL : (CMCC Offset: 0x30) ( /W 32) Cache Monitor Control Register -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t SWRST:1; /*!< bit: 0 Cache Controller Software Reset */ + uint32_t :31; /*!< bit: 1..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CMCC_MCTRL_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CMCC_MCTRL_OFFSET 0x30 /**< \brief (CMCC_MCTRL offset) Cache Monitor Control Register */ +#define CMCC_MCTRL_RESETVALUE _U_(0x00000000) /**< \brief (CMCC_MCTRL reset_value) Cache Monitor Control Register */ + +#define CMCC_MCTRL_SWRST_Pos 0 /**< \brief (CMCC_MCTRL) Cache Controller Software Reset */ +#define CMCC_MCTRL_SWRST (_U_(0x1) << CMCC_MCTRL_SWRST_Pos) +#define CMCC_MCTRL_MASK _U_(0x00000001) /**< \brief (CMCC_MCTRL) MASK Register */ + +/* -------- CMCC_MSR : (CMCC Offset: 0x34) (R/ 32) Cache Monitor Status Register -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t EVENT_CNT:32; /*!< bit: 0..31 Monitor Event Counter */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} CMCC_MSR_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define CMCC_MSR_OFFSET 0x34 /**< \brief (CMCC_MSR offset) Cache Monitor Status Register */ +#define CMCC_MSR_RESETVALUE _U_(0x00000000) /**< \brief (CMCC_MSR reset_value) Cache Monitor Status Register */ + +#define CMCC_MSR_EVENT_CNT_Pos 0 /**< \brief (CMCC_MSR) Monitor Event Counter */ +#define CMCC_MSR_EVENT_CNT_Msk (_U_(0xFFFFFFFF) << CMCC_MSR_EVENT_CNT_Pos) +#define CMCC_MSR_EVENT_CNT(value) (CMCC_MSR_EVENT_CNT_Msk & ((value) << CMCC_MSR_EVENT_CNT_Pos)) +#define CMCC_MSR_MASK _U_(0xFFFFFFFF) /**< \brief (CMCC_MSR) MASK Register */ + +/** \brief CMCC APB hardware registers */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef struct { + __I CMCC_TYPE_Type TYPE; /**< \brief Offset: 0x00 (R/ 32) Cache Type Register */ + __IO CMCC_CFG_Type CFG; /**< \brief Offset: 0x04 (R/W 32) Cache Configuration Register */ + __O CMCC_CTRL_Type CTRL; /**< \brief Offset: 0x08 ( /W 32) Cache Control Register */ + __I CMCC_SR_Type SR; /**< \brief Offset: 0x0C (R/ 32) Cache Status Register */ + __IO CMCC_LCKWAY_Type LCKWAY; /**< \brief Offset: 0x10 (R/W 32) Cache Lock per Way Register */ + RoReg8 Reserved1[0xC]; + __O CMCC_MAINT0_Type MAINT0; /**< \brief Offset: 0x20 ( /W 32) Cache Maintenance Register 0 */ + __O CMCC_MAINT1_Type MAINT1; /**< \brief Offset: 0x24 ( /W 32) Cache Maintenance Register 1 */ + __IO CMCC_MCFG_Type MCFG; /**< \brief Offset: 0x28 (R/W 32) Cache Monitor Configuration Register */ + __IO CMCC_MEN_Type MEN; /**< \brief Offset: 0x2C (R/W 32) Cache Monitor Enable Register */ + __O CMCC_MCTRL_Type MCTRL; /**< \brief Offset: 0x30 ( /W 32) Cache Monitor Control Register */ + __I CMCC_MSR_Type MSR; /**< \brief Offset: 0x34 (R/ 32) Cache Monitor Status Register */ +} Cmcc; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/*@}*/ + +#endif /* _SAMD51_CMCC_COMPONENT_ */ diff --git a/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/dac.h b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/dac.h new file mode 100644 index 000000000..c67efda30 --- /dev/null +++ b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/dac.h @@ -0,0 +1,544 @@ +/** + * \file + * + * \brief Component description for DAC + * + * Copyright (c) 2017 Microchip Technology Inc. + * + * \asf_license_start + * + * \page License + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 Licence 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. + * + * \asf_license_stop + * + */ + +#ifndef _SAMD51_DAC_COMPONENT_ +#define _SAMD51_DAC_COMPONENT_ + +/* ========================================================================== */ +/** SOFTWARE API DEFINITION FOR DAC */ +/* ========================================================================== */ +/** \addtogroup SAMD51_DAC Digital-to-Analog Converter */ +/*@{*/ + +#define DAC_U2502 +#define REV_DAC 0x100 + +/* -------- DAC_CTRLA : (DAC Offset: 0x00) (R/W 8) Control A -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t SWRST:1; /*!< bit: 0 Software Reset */ + uint8_t ENABLE:1; /*!< bit: 1 Enable DAC Controller */ + uint8_t :6; /*!< bit: 2.. 7 Reserved */ + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} DAC_CTRLA_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define DAC_CTRLA_OFFSET 0x00 /**< \brief (DAC_CTRLA offset) Control A */ +#define DAC_CTRLA_RESETVALUE _U_(0x00) /**< \brief (DAC_CTRLA reset_value) Control A */ + +#define DAC_CTRLA_SWRST_Pos 0 /**< \brief (DAC_CTRLA) Software Reset */ +#define DAC_CTRLA_SWRST (_U_(0x1) << DAC_CTRLA_SWRST_Pos) +#define DAC_CTRLA_ENABLE_Pos 1 /**< \brief (DAC_CTRLA) Enable DAC Controller */ +#define DAC_CTRLA_ENABLE (_U_(0x1) << DAC_CTRLA_ENABLE_Pos) +#define DAC_CTRLA_MASK _U_(0x03) /**< \brief (DAC_CTRLA) MASK Register */ + +/* -------- DAC_CTRLB : (DAC Offset: 0x01) (R/W 8) Control B -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t DIFF:1; /*!< bit: 0 Differential mode enable */ + uint8_t REFSEL:2; /*!< bit: 1.. 2 Reference Selection for DAC0/1 */ + uint8_t :5; /*!< bit: 3.. 7 Reserved */ + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} DAC_CTRLB_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define DAC_CTRLB_OFFSET 0x01 /**< \brief (DAC_CTRLB offset) Control B */ +#define DAC_CTRLB_RESETVALUE _U_(0x02) /**< \brief (DAC_CTRLB reset_value) Control B */ + +#define DAC_CTRLB_DIFF_Pos 0 /**< \brief (DAC_CTRLB) Differential mode enable */ +#define DAC_CTRLB_DIFF (_U_(0x1) << DAC_CTRLB_DIFF_Pos) +#define DAC_CTRLB_REFSEL_Pos 1 /**< \brief (DAC_CTRLB) Reference Selection for DAC0/1 */ +#define DAC_CTRLB_REFSEL_Msk (_U_(0x3) << DAC_CTRLB_REFSEL_Pos) +#define DAC_CTRLB_REFSEL(value) (DAC_CTRLB_REFSEL_Msk & ((value) << DAC_CTRLB_REFSEL_Pos)) +#define DAC_CTRLB_REFSEL_VREFPU_Val _U_(0x0) /**< \brief (DAC_CTRLB) External reference unbuffered */ +#define DAC_CTRLB_REFSEL_VDDANA_Val _U_(0x1) /**< \brief (DAC_CTRLB) Analog supply */ +#define DAC_CTRLB_REFSEL_VREFPB_Val _U_(0x2) /**< \brief (DAC_CTRLB) External reference buffered */ +#define DAC_CTRLB_REFSEL_INTREF_Val _U_(0x3) /**< \brief (DAC_CTRLB) Internal bandgap reference */ +#define DAC_CTRLB_REFSEL_VREFPU (DAC_CTRLB_REFSEL_VREFPU_Val << DAC_CTRLB_REFSEL_Pos) +#define DAC_CTRLB_REFSEL_VDDANA (DAC_CTRLB_REFSEL_VDDANA_Val << DAC_CTRLB_REFSEL_Pos) +#define DAC_CTRLB_REFSEL_VREFPB (DAC_CTRLB_REFSEL_VREFPB_Val << DAC_CTRLB_REFSEL_Pos) +#define DAC_CTRLB_REFSEL_INTREF (DAC_CTRLB_REFSEL_INTREF_Val << DAC_CTRLB_REFSEL_Pos) +#define DAC_CTRLB_MASK _U_(0x07) /**< \brief (DAC_CTRLB) MASK Register */ + +/* -------- DAC_EVCTRL : (DAC Offset: 0x02) (R/W 8) Event Control -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t STARTEI0:1; /*!< bit: 0 Start Conversion Event Input DAC 0 */ + uint8_t STARTEI1:1; /*!< bit: 1 Start Conversion Event Input DAC 1 */ + uint8_t EMPTYEO0:1; /*!< bit: 2 Data Buffer Empty Event Output DAC 0 */ + uint8_t EMPTYEO1:1; /*!< bit: 3 Data Buffer Empty Event Output DAC 1 */ + uint8_t INVEI0:1; /*!< bit: 4 Enable Invertion of DAC 0 input event */ + uint8_t INVEI1:1; /*!< bit: 5 Enable Invertion of DAC 1 input event */ + uint8_t RESRDYEO0:1; /*!< bit: 6 Result Ready Event Output 0 */ + uint8_t RESRDYEO1:1; /*!< bit: 7 Result Ready Event Output 1 */ + } bit; /*!< Structure used for bit access */ + struct { + uint8_t STARTEI:2; /*!< bit: 0.. 1 Start Conversion Event Input DAC x */ + uint8_t EMPTYEO:2; /*!< bit: 2.. 3 Data Buffer Empty Event Output DAC x */ + uint8_t INVEI:2; /*!< bit: 4.. 5 Enable Invertion of DAC x input event */ + uint8_t RESRDYEO:2; /*!< bit: 6.. 7 Result Ready Event Output x */ + } vec; /*!< Structure used for vec access */ + uint8_t reg; /*!< Type used for register access */ +} DAC_EVCTRL_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define DAC_EVCTRL_OFFSET 0x02 /**< \brief (DAC_EVCTRL offset) Event Control */ +#define DAC_EVCTRL_RESETVALUE _U_(0x00) /**< \brief (DAC_EVCTRL reset_value) Event Control */ + +#define DAC_EVCTRL_STARTEI0_Pos 0 /**< \brief (DAC_EVCTRL) Start Conversion Event Input DAC 0 */ +#define DAC_EVCTRL_STARTEI0 (_U_(1) << DAC_EVCTRL_STARTEI0_Pos) +#define DAC_EVCTRL_STARTEI1_Pos 1 /**< \brief (DAC_EVCTRL) Start Conversion Event Input DAC 1 */ +#define DAC_EVCTRL_STARTEI1 (_U_(1) << DAC_EVCTRL_STARTEI1_Pos) +#define DAC_EVCTRL_STARTEI_Pos 0 /**< \brief (DAC_EVCTRL) Start Conversion Event Input DAC x */ +#define DAC_EVCTRL_STARTEI_Msk (_U_(0x3) << DAC_EVCTRL_STARTEI_Pos) +#define DAC_EVCTRL_STARTEI(value) (DAC_EVCTRL_STARTEI_Msk & ((value) << DAC_EVCTRL_STARTEI_Pos)) +#define DAC_EVCTRL_EMPTYEO0_Pos 2 /**< \brief (DAC_EVCTRL) Data Buffer Empty Event Output DAC 0 */ +#define DAC_EVCTRL_EMPTYEO0 (_U_(1) << DAC_EVCTRL_EMPTYEO0_Pos) +#define DAC_EVCTRL_EMPTYEO1_Pos 3 /**< \brief (DAC_EVCTRL) Data Buffer Empty Event Output DAC 1 */ +#define DAC_EVCTRL_EMPTYEO1 (_U_(1) << DAC_EVCTRL_EMPTYEO1_Pos) +#define DAC_EVCTRL_EMPTYEO_Pos 2 /**< \brief (DAC_EVCTRL) Data Buffer Empty Event Output DAC x */ +#define DAC_EVCTRL_EMPTYEO_Msk (_U_(0x3) << DAC_EVCTRL_EMPTYEO_Pos) +#define DAC_EVCTRL_EMPTYEO(value) (DAC_EVCTRL_EMPTYEO_Msk & ((value) << DAC_EVCTRL_EMPTYEO_Pos)) +#define DAC_EVCTRL_INVEI0_Pos 4 /**< \brief (DAC_EVCTRL) Enable Invertion of DAC 0 input event */ +#define DAC_EVCTRL_INVEI0 (_U_(1) << DAC_EVCTRL_INVEI0_Pos) +#define DAC_EVCTRL_INVEI1_Pos 5 /**< \brief (DAC_EVCTRL) Enable Invertion of DAC 1 input event */ +#define DAC_EVCTRL_INVEI1 (_U_(1) << DAC_EVCTRL_INVEI1_Pos) +#define DAC_EVCTRL_INVEI_Pos 4 /**< \brief (DAC_EVCTRL) Enable Invertion of DAC x input event */ +#define DAC_EVCTRL_INVEI_Msk (_U_(0x3) << DAC_EVCTRL_INVEI_Pos) +#define DAC_EVCTRL_INVEI(value) (DAC_EVCTRL_INVEI_Msk & ((value) << DAC_EVCTRL_INVEI_Pos)) +#define DAC_EVCTRL_RESRDYEO0_Pos 6 /**< \brief (DAC_EVCTRL) Result Ready Event Output 0 */ +#define DAC_EVCTRL_RESRDYEO0 (_U_(1) << DAC_EVCTRL_RESRDYEO0_Pos) +#define DAC_EVCTRL_RESRDYEO1_Pos 7 /**< \brief (DAC_EVCTRL) Result Ready Event Output 1 */ +#define DAC_EVCTRL_RESRDYEO1 (_U_(1) << DAC_EVCTRL_RESRDYEO1_Pos) +#define DAC_EVCTRL_RESRDYEO_Pos 6 /**< \brief (DAC_EVCTRL) Result Ready Event Output x */ +#define DAC_EVCTRL_RESRDYEO_Msk (_U_(0x3) << DAC_EVCTRL_RESRDYEO_Pos) +#define DAC_EVCTRL_RESRDYEO(value) (DAC_EVCTRL_RESRDYEO_Msk & ((value) << DAC_EVCTRL_RESRDYEO_Pos)) +#define DAC_EVCTRL_MASK _U_(0xFF) /**< \brief (DAC_EVCTRL) MASK Register */ + +/* -------- DAC_INTENCLR : (DAC Offset: 0x04) (R/W 8) Interrupt Enable Clear -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t UNDERRUN0:1; /*!< bit: 0 Underrun 0 Interrupt Enable */ + uint8_t UNDERRUN1:1; /*!< bit: 1 Underrun 1 Interrupt Enable */ + uint8_t EMPTY0:1; /*!< bit: 2 Data Buffer 0 Empty Interrupt Enable */ + uint8_t EMPTY1:1; /*!< bit: 3 Data Buffer 1 Empty Interrupt Enable */ + uint8_t RESRDY0:1; /*!< bit: 4 Result 0 Ready Interrupt Enable */ + uint8_t RESRDY1:1; /*!< bit: 5 Result 1 Ready Interrupt Enable */ + uint8_t OVERRUN0:1; /*!< bit: 6 Overrun 0 Interrupt Enable */ + uint8_t OVERRUN1:1; /*!< bit: 7 Overrun 1 Interrupt Enable */ + } bit; /*!< Structure used for bit access */ + struct { + uint8_t UNDERRUN:2; /*!< bit: 0.. 1 Underrun x Interrupt Enable */ + uint8_t EMPTY:2; /*!< bit: 2.. 3 Data Buffer x Empty Interrupt Enable */ + uint8_t RESRDY:2; /*!< bit: 4.. 5 Result x Ready Interrupt Enable */ + uint8_t OVERRUN:2; /*!< bit: 6.. 7 Overrun x Interrupt Enable */ + } vec; /*!< Structure used for vec access */ + uint8_t reg; /*!< Type used for register access */ +} DAC_INTENCLR_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define DAC_INTENCLR_OFFSET 0x04 /**< \brief (DAC_INTENCLR offset) Interrupt Enable Clear */ +#define DAC_INTENCLR_RESETVALUE _U_(0x00) /**< \brief (DAC_INTENCLR reset_value) Interrupt Enable Clear */ + +#define DAC_INTENCLR_UNDERRUN0_Pos 0 /**< \brief (DAC_INTENCLR) Underrun 0 Interrupt Enable */ +#define DAC_INTENCLR_UNDERRUN0 (_U_(1) << DAC_INTENCLR_UNDERRUN0_Pos) +#define DAC_INTENCLR_UNDERRUN1_Pos 1 /**< \brief (DAC_INTENCLR) Underrun 1 Interrupt Enable */ +#define DAC_INTENCLR_UNDERRUN1 (_U_(1) << DAC_INTENCLR_UNDERRUN1_Pos) +#define DAC_INTENCLR_UNDERRUN_Pos 0 /**< \brief (DAC_INTENCLR) Underrun x Interrupt Enable */ +#define DAC_INTENCLR_UNDERRUN_Msk (_U_(0x3) << DAC_INTENCLR_UNDERRUN_Pos) +#define DAC_INTENCLR_UNDERRUN(value) (DAC_INTENCLR_UNDERRUN_Msk & ((value) << DAC_INTENCLR_UNDERRUN_Pos)) +#define DAC_INTENCLR_EMPTY0_Pos 2 /**< \brief (DAC_INTENCLR) Data Buffer 0 Empty Interrupt Enable */ +#define DAC_INTENCLR_EMPTY0 (_U_(1) << DAC_INTENCLR_EMPTY0_Pos) +#define DAC_INTENCLR_EMPTY1_Pos 3 /**< \brief (DAC_INTENCLR) Data Buffer 1 Empty Interrupt Enable */ +#define DAC_INTENCLR_EMPTY1 (_U_(1) << DAC_INTENCLR_EMPTY1_Pos) +#define DAC_INTENCLR_EMPTY_Pos 2 /**< \brief (DAC_INTENCLR) Data Buffer x Empty Interrupt Enable */ +#define DAC_INTENCLR_EMPTY_Msk (_U_(0x3) << DAC_INTENCLR_EMPTY_Pos) +#define DAC_INTENCLR_EMPTY(value) (DAC_INTENCLR_EMPTY_Msk & ((value) << DAC_INTENCLR_EMPTY_Pos)) +#define DAC_INTENCLR_RESRDY0_Pos 4 /**< \brief (DAC_INTENCLR) Result 0 Ready Interrupt Enable */ +#define DAC_INTENCLR_RESRDY0 (_U_(1) << DAC_INTENCLR_RESRDY0_Pos) +#define DAC_INTENCLR_RESRDY1_Pos 5 /**< \brief (DAC_INTENCLR) Result 1 Ready Interrupt Enable */ +#define DAC_INTENCLR_RESRDY1 (_U_(1) << DAC_INTENCLR_RESRDY1_Pos) +#define DAC_INTENCLR_RESRDY_Pos 4 /**< \brief (DAC_INTENCLR) Result x Ready Interrupt Enable */ +#define DAC_INTENCLR_RESRDY_Msk (_U_(0x3) << DAC_INTENCLR_RESRDY_Pos) +#define DAC_INTENCLR_RESRDY(value) (DAC_INTENCLR_RESRDY_Msk & ((value) << DAC_INTENCLR_RESRDY_Pos)) +#define DAC_INTENCLR_OVERRUN0_Pos 6 /**< \brief (DAC_INTENCLR) Overrun 0 Interrupt Enable */ +#define DAC_INTENCLR_OVERRUN0 (_U_(1) << DAC_INTENCLR_OVERRUN0_Pos) +#define DAC_INTENCLR_OVERRUN1_Pos 7 /**< \brief (DAC_INTENCLR) Overrun 1 Interrupt Enable */ +#define DAC_INTENCLR_OVERRUN1 (_U_(1) << DAC_INTENCLR_OVERRUN1_Pos) +#define DAC_INTENCLR_OVERRUN_Pos 6 /**< \brief (DAC_INTENCLR) Overrun x Interrupt Enable */ +#define DAC_INTENCLR_OVERRUN_Msk (_U_(0x3) << DAC_INTENCLR_OVERRUN_Pos) +#define DAC_INTENCLR_OVERRUN(value) (DAC_INTENCLR_OVERRUN_Msk & ((value) << DAC_INTENCLR_OVERRUN_Pos)) +#define DAC_INTENCLR_MASK _U_(0xFF) /**< \brief (DAC_INTENCLR) MASK Register */ + +/* -------- DAC_INTENSET : (DAC Offset: 0x05) (R/W 8) Interrupt Enable Set -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t UNDERRUN0:1; /*!< bit: 0 Underrun 0 Interrupt Enable */ + uint8_t UNDERRUN1:1; /*!< bit: 1 Underrun 1 Interrupt Enable */ + uint8_t EMPTY0:1; /*!< bit: 2 Data Buffer 0 Empty Interrupt Enable */ + uint8_t EMPTY1:1; /*!< bit: 3 Data Buffer 1 Empty Interrupt Enable */ + uint8_t RESRDY0:1; /*!< bit: 4 Result 0 Ready Interrupt Enable */ + uint8_t RESRDY1:1; /*!< bit: 5 Result 1 Ready Interrupt Enable */ + uint8_t OVERRUN0:1; /*!< bit: 6 Overrun 0 Interrupt Enable */ + uint8_t OVERRUN1:1; /*!< bit: 7 Overrun 1 Interrupt Enable */ + } bit; /*!< Structure used for bit access */ + struct { + uint8_t UNDERRUN:2; /*!< bit: 0.. 1 Underrun x Interrupt Enable */ + uint8_t EMPTY:2; /*!< bit: 2.. 3 Data Buffer x Empty Interrupt Enable */ + uint8_t RESRDY:2; /*!< bit: 4.. 5 Result x Ready Interrupt Enable */ + uint8_t OVERRUN:2; /*!< bit: 6.. 7 Overrun x Interrupt Enable */ + } vec; /*!< Structure used for vec access */ + uint8_t reg; /*!< Type used for register access */ +} DAC_INTENSET_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define DAC_INTENSET_OFFSET 0x05 /**< \brief (DAC_INTENSET offset) Interrupt Enable Set */ +#define DAC_INTENSET_RESETVALUE _U_(0x00) /**< \brief (DAC_INTENSET reset_value) Interrupt Enable Set */ + +#define DAC_INTENSET_UNDERRUN0_Pos 0 /**< \brief (DAC_INTENSET) Underrun 0 Interrupt Enable */ +#define DAC_INTENSET_UNDERRUN0 (_U_(1) << DAC_INTENSET_UNDERRUN0_Pos) +#define DAC_INTENSET_UNDERRUN1_Pos 1 /**< \brief (DAC_INTENSET) Underrun 1 Interrupt Enable */ +#define DAC_INTENSET_UNDERRUN1 (_U_(1) << DAC_INTENSET_UNDERRUN1_Pos) +#define DAC_INTENSET_UNDERRUN_Pos 0 /**< \brief (DAC_INTENSET) Underrun x Interrupt Enable */ +#define DAC_INTENSET_UNDERRUN_Msk (_U_(0x3) << DAC_INTENSET_UNDERRUN_Pos) +#define DAC_INTENSET_UNDERRUN(value) (DAC_INTENSET_UNDERRUN_Msk & ((value) << DAC_INTENSET_UNDERRUN_Pos)) +#define DAC_INTENSET_EMPTY0_Pos 2 /**< \brief (DAC_INTENSET) Data Buffer 0 Empty Interrupt Enable */ +#define DAC_INTENSET_EMPTY0 (_U_(1) << DAC_INTENSET_EMPTY0_Pos) +#define DAC_INTENSET_EMPTY1_Pos 3 /**< \brief (DAC_INTENSET) Data Buffer 1 Empty Interrupt Enable */ +#define DAC_INTENSET_EMPTY1 (_U_(1) << DAC_INTENSET_EMPTY1_Pos) +#define DAC_INTENSET_EMPTY_Pos 2 /**< \brief (DAC_INTENSET) Data Buffer x Empty Interrupt Enable */ +#define DAC_INTENSET_EMPTY_Msk (_U_(0x3) << DAC_INTENSET_EMPTY_Pos) +#define DAC_INTENSET_EMPTY(value) (DAC_INTENSET_EMPTY_Msk & ((value) << DAC_INTENSET_EMPTY_Pos)) +#define DAC_INTENSET_RESRDY0_Pos 4 /**< \brief (DAC_INTENSET) Result 0 Ready Interrupt Enable */ +#define DAC_INTENSET_RESRDY0 (_U_(1) << DAC_INTENSET_RESRDY0_Pos) +#define DAC_INTENSET_RESRDY1_Pos 5 /**< \brief (DAC_INTENSET) Result 1 Ready Interrupt Enable */ +#define DAC_INTENSET_RESRDY1 (_U_(1) << DAC_INTENSET_RESRDY1_Pos) +#define DAC_INTENSET_RESRDY_Pos 4 /**< \brief (DAC_INTENSET) Result x Ready Interrupt Enable */ +#define DAC_INTENSET_RESRDY_Msk (_U_(0x3) << DAC_INTENSET_RESRDY_Pos) +#define DAC_INTENSET_RESRDY(value) (DAC_INTENSET_RESRDY_Msk & ((value) << DAC_INTENSET_RESRDY_Pos)) +#define DAC_INTENSET_OVERRUN0_Pos 6 /**< \brief (DAC_INTENSET) Overrun 0 Interrupt Enable */ +#define DAC_INTENSET_OVERRUN0 (_U_(1) << DAC_INTENSET_OVERRUN0_Pos) +#define DAC_INTENSET_OVERRUN1_Pos 7 /**< \brief (DAC_INTENSET) Overrun 1 Interrupt Enable */ +#define DAC_INTENSET_OVERRUN1 (_U_(1) << DAC_INTENSET_OVERRUN1_Pos) +#define DAC_INTENSET_OVERRUN_Pos 6 /**< \brief (DAC_INTENSET) Overrun x Interrupt Enable */ +#define DAC_INTENSET_OVERRUN_Msk (_U_(0x3) << DAC_INTENSET_OVERRUN_Pos) +#define DAC_INTENSET_OVERRUN(value) (DAC_INTENSET_OVERRUN_Msk & ((value) << DAC_INTENSET_OVERRUN_Pos)) +#define DAC_INTENSET_MASK _U_(0xFF) /**< \brief (DAC_INTENSET) MASK Register */ + +/* -------- DAC_INTFLAG : (DAC Offset: 0x06) (R/W 8) Interrupt Flag Status and Clear -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { // __I to avoid read-modify-write on write-to-clear register + struct { + __I uint8_t UNDERRUN0:1; /*!< bit: 0 Result 0 Underrun */ + __I uint8_t UNDERRUN1:1; /*!< bit: 1 Result 1 Underrun */ + __I uint8_t EMPTY0:1; /*!< bit: 2 Data Buffer 0 Empty */ + __I uint8_t EMPTY1:1; /*!< bit: 3 Data Buffer 1 Empty */ + __I uint8_t RESRDY0:1; /*!< bit: 4 Result 0 Ready */ + __I uint8_t RESRDY1:1; /*!< bit: 5 Result 1 Ready */ + __I uint8_t OVERRUN0:1; /*!< bit: 6 Result 0 Overrun */ + __I uint8_t OVERRUN1:1; /*!< bit: 7 Result 1 Overrun */ + } bit; /*!< Structure used for bit access */ + struct { + __I uint8_t UNDERRUN:2; /*!< bit: 0.. 1 Result x Underrun */ + __I uint8_t EMPTY:2; /*!< bit: 2.. 3 Data Buffer x Empty */ + __I uint8_t RESRDY:2; /*!< bit: 4.. 5 Result x Ready */ + __I uint8_t OVERRUN:2; /*!< bit: 6.. 7 Result x Overrun */ + } vec; /*!< Structure used for vec access */ + uint8_t reg; /*!< Type used for register access */ +} DAC_INTFLAG_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define DAC_INTFLAG_OFFSET 0x06 /**< \brief (DAC_INTFLAG offset) Interrupt Flag Status and Clear */ +#define DAC_INTFLAG_RESETVALUE _U_(0x00) /**< \brief (DAC_INTFLAG reset_value) Interrupt Flag Status and Clear */ + +#define DAC_INTFLAG_UNDERRUN0_Pos 0 /**< \brief (DAC_INTFLAG) Result 0 Underrun */ +#define DAC_INTFLAG_UNDERRUN0 (_U_(1) << DAC_INTFLAG_UNDERRUN0_Pos) +#define DAC_INTFLAG_UNDERRUN1_Pos 1 /**< \brief (DAC_INTFLAG) Result 1 Underrun */ +#define DAC_INTFLAG_UNDERRUN1 (_U_(1) << DAC_INTFLAG_UNDERRUN1_Pos) +#define DAC_INTFLAG_UNDERRUN_Pos 0 /**< \brief (DAC_INTFLAG) Result x Underrun */ +#define DAC_INTFLAG_UNDERRUN_Msk (_U_(0x3) << DAC_INTFLAG_UNDERRUN_Pos) +#define DAC_INTFLAG_UNDERRUN(value) (DAC_INTFLAG_UNDERRUN_Msk & ((value) << DAC_INTFLAG_UNDERRUN_Pos)) +#define DAC_INTFLAG_EMPTY0_Pos 2 /**< \brief (DAC_INTFLAG) Data Buffer 0 Empty */ +#define DAC_INTFLAG_EMPTY0 (_U_(1) << DAC_INTFLAG_EMPTY0_Pos) +#define DAC_INTFLAG_EMPTY1_Pos 3 /**< \brief (DAC_INTFLAG) Data Buffer 1 Empty */ +#define DAC_INTFLAG_EMPTY1 (_U_(1) << DAC_INTFLAG_EMPTY1_Pos) +#define DAC_INTFLAG_EMPTY_Pos 2 /**< \brief (DAC_INTFLAG) Data Buffer x Empty */ +#define DAC_INTFLAG_EMPTY_Msk (_U_(0x3) << DAC_INTFLAG_EMPTY_Pos) +#define DAC_INTFLAG_EMPTY(value) (DAC_INTFLAG_EMPTY_Msk & ((value) << DAC_INTFLAG_EMPTY_Pos)) +#define DAC_INTFLAG_RESRDY0_Pos 4 /**< \brief (DAC_INTFLAG) Result 0 Ready */ +#define DAC_INTFLAG_RESRDY0 (_U_(1) << DAC_INTFLAG_RESRDY0_Pos) +#define DAC_INTFLAG_RESRDY1_Pos 5 /**< \brief (DAC_INTFLAG) Result 1 Ready */ +#define DAC_INTFLAG_RESRDY1 (_U_(1) << DAC_INTFLAG_RESRDY1_Pos) +#define DAC_INTFLAG_RESRDY_Pos 4 /**< \brief (DAC_INTFLAG) Result x Ready */ +#define DAC_INTFLAG_RESRDY_Msk (_U_(0x3) << DAC_INTFLAG_RESRDY_Pos) +#define DAC_INTFLAG_RESRDY(value) (DAC_INTFLAG_RESRDY_Msk & ((value) << DAC_INTFLAG_RESRDY_Pos)) +#define DAC_INTFLAG_OVERRUN0_Pos 6 /**< \brief (DAC_INTFLAG) Result 0 Overrun */ +#define DAC_INTFLAG_OVERRUN0 (_U_(1) << DAC_INTFLAG_OVERRUN0_Pos) +#define DAC_INTFLAG_OVERRUN1_Pos 7 /**< \brief (DAC_INTFLAG) Result 1 Overrun */ +#define DAC_INTFLAG_OVERRUN1 (_U_(1) << DAC_INTFLAG_OVERRUN1_Pos) +#define DAC_INTFLAG_OVERRUN_Pos 6 /**< \brief (DAC_INTFLAG) Result x Overrun */ +#define DAC_INTFLAG_OVERRUN_Msk (_U_(0x3) << DAC_INTFLAG_OVERRUN_Pos) +#define DAC_INTFLAG_OVERRUN(value) (DAC_INTFLAG_OVERRUN_Msk & ((value) << DAC_INTFLAG_OVERRUN_Pos)) +#define DAC_INTFLAG_MASK _U_(0xFF) /**< \brief (DAC_INTFLAG) MASK Register */ + +/* -------- DAC_STATUS : (DAC Offset: 0x07) (R/ 8) Status -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t READY0:1; /*!< bit: 0 DAC 0 Startup Ready */ + uint8_t READY1:1; /*!< bit: 1 DAC 1 Startup Ready */ + uint8_t EOC0:1; /*!< bit: 2 DAC 0 End of Conversion */ + uint8_t EOC1:1; /*!< bit: 3 DAC 1 End of Conversion */ + uint8_t :4; /*!< bit: 4.. 7 Reserved */ + } bit; /*!< Structure used for bit access */ + struct { + uint8_t READY:2; /*!< bit: 0.. 1 DAC x Startup Ready */ + uint8_t EOC:2; /*!< bit: 2.. 3 DAC x End of Conversion */ + uint8_t :4; /*!< bit: 4.. 7 Reserved */ + } vec; /*!< Structure used for vec access */ + uint8_t reg; /*!< Type used for register access */ +} DAC_STATUS_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define DAC_STATUS_OFFSET 0x07 /**< \brief (DAC_STATUS offset) Status */ +#define DAC_STATUS_RESETVALUE _U_(0x00) /**< \brief (DAC_STATUS reset_value) Status */ + +#define DAC_STATUS_READY0_Pos 0 /**< \brief (DAC_STATUS) DAC 0 Startup Ready */ +#define DAC_STATUS_READY0 (_U_(1) << DAC_STATUS_READY0_Pos) +#define DAC_STATUS_READY1_Pos 1 /**< \brief (DAC_STATUS) DAC 1 Startup Ready */ +#define DAC_STATUS_READY1 (_U_(1) << DAC_STATUS_READY1_Pos) +#define DAC_STATUS_READY_Pos 0 /**< \brief (DAC_STATUS) DAC x Startup Ready */ +#define DAC_STATUS_READY_Msk (_U_(0x3) << DAC_STATUS_READY_Pos) +#define DAC_STATUS_READY(value) (DAC_STATUS_READY_Msk & ((value) << DAC_STATUS_READY_Pos)) +#define DAC_STATUS_EOC0_Pos 2 /**< \brief (DAC_STATUS) DAC 0 End of Conversion */ +#define DAC_STATUS_EOC0 (_U_(1) << DAC_STATUS_EOC0_Pos) +#define DAC_STATUS_EOC1_Pos 3 /**< \brief (DAC_STATUS) DAC 1 End of Conversion */ +#define DAC_STATUS_EOC1 (_U_(1) << DAC_STATUS_EOC1_Pos) +#define DAC_STATUS_EOC_Pos 2 /**< \brief (DAC_STATUS) DAC x End of Conversion */ +#define DAC_STATUS_EOC_Msk (_U_(0x3) << DAC_STATUS_EOC_Pos) +#define DAC_STATUS_EOC(value) (DAC_STATUS_EOC_Msk & ((value) << DAC_STATUS_EOC_Pos)) +#define DAC_STATUS_MASK _U_(0x0F) /**< \brief (DAC_STATUS) MASK Register */ + +/* -------- DAC_SYNCBUSY : (DAC Offset: 0x08) (R/ 32) Synchronization Busy -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t SWRST:1; /*!< bit: 0 Software Reset */ + uint32_t ENABLE:1; /*!< bit: 1 DAC Enable Status */ + uint32_t DATA0:1; /*!< bit: 2 Data DAC 0 */ + uint32_t DATA1:1; /*!< bit: 3 Data DAC 1 */ + uint32_t DATABUF0:1; /*!< bit: 4 Data Buffer DAC 0 */ + uint32_t DATABUF1:1; /*!< bit: 5 Data Buffer DAC 1 */ + uint32_t :26; /*!< bit: 6..31 Reserved */ + } bit; /*!< Structure used for bit access */ + struct { + uint32_t :2; /*!< bit: 0.. 1 Reserved */ + uint32_t DATA:2; /*!< bit: 2.. 3 Data DAC x */ + uint32_t DATABUF:2; /*!< bit: 4.. 5 Data Buffer DAC x */ + uint32_t :26; /*!< bit: 6..31 Reserved */ + } vec; /*!< Structure used for vec access */ + uint32_t reg; /*!< Type used for register access */ +} DAC_SYNCBUSY_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define DAC_SYNCBUSY_OFFSET 0x08 /**< \brief (DAC_SYNCBUSY offset) Synchronization Busy */ +#define DAC_SYNCBUSY_RESETVALUE _U_(0x00000000) /**< \brief (DAC_SYNCBUSY reset_value) Synchronization Busy */ + +#define DAC_SYNCBUSY_SWRST_Pos 0 /**< \brief (DAC_SYNCBUSY) Software Reset */ +#define DAC_SYNCBUSY_SWRST (_U_(0x1) << DAC_SYNCBUSY_SWRST_Pos) +#define DAC_SYNCBUSY_ENABLE_Pos 1 /**< \brief (DAC_SYNCBUSY) DAC Enable Status */ +#define DAC_SYNCBUSY_ENABLE (_U_(0x1) << DAC_SYNCBUSY_ENABLE_Pos) +#define DAC_SYNCBUSY_DATA0_Pos 2 /**< \brief (DAC_SYNCBUSY) Data DAC 0 */ +#define DAC_SYNCBUSY_DATA0 (_U_(1) << DAC_SYNCBUSY_DATA0_Pos) +#define DAC_SYNCBUSY_DATA1_Pos 3 /**< \brief (DAC_SYNCBUSY) Data DAC 1 */ +#define DAC_SYNCBUSY_DATA1 (_U_(1) << DAC_SYNCBUSY_DATA1_Pos) +#define DAC_SYNCBUSY_DATA_Pos 2 /**< \brief (DAC_SYNCBUSY) Data DAC x */ +#define DAC_SYNCBUSY_DATA_Msk (_U_(0x3) << DAC_SYNCBUSY_DATA_Pos) +#define DAC_SYNCBUSY_DATA(value) (DAC_SYNCBUSY_DATA_Msk & ((value) << DAC_SYNCBUSY_DATA_Pos)) +#define DAC_SYNCBUSY_DATABUF0_Pos 4 /**< \brief (DAC_SYNCBUSY) Data Buffer DAC 0 */ +#define DAC_SYNCBUSY_DATABUF0 (_U_(1) << DAC_SYNCBUSY_DATABUF0_Pos) +#define DAC_SYNCBUSY_DATABUF1_Pos 5 /**< \brief (DAC_SYNCBUSY) Data Buffer DAC 1 */ +#define DAC_SYNCBUSY_DATABUF1 (_U_(1) << DAC_SYNCBUSY_DATABUF1_Pos) +#define DAC_SYNCBUSY_DATABUF_Pos 4 /**< \brief (DAC_SYNCBUSY) Data Buffer DAC x */ +#define DAC_SYNCBUSY_DATABUF_Msk (_U_(0x3) << DAC_SYNCBUSY_DATABUF_Pos) +#define DAC_SYNCBUSY_DATABUF(value) (DAC_SYNCBUSY_DATABUF_Msk & ((value) << DAC_SYNCBUSY_DATABUF_Pos)) +#define DAC_SYNCBUSY_MASK _U_(0x0000003F) /**< \brief (DAC_SYNCBUSY) MASK Register */ + +/* -------- DAC_DACCTRL : (DAC Offset: 0x0C) (R/W 16) DAC n Control -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint16_t LEFTADJ:1; /*!< bit: 0 Left Adjusted Data */ + uint16_t ENABLE:1; /*!< bit: 1 Enable DAC0 */ + uint16_t CCTRL:2; /*!< bit: 2.. 3 Current Control */ + uint16_t :1; /*!< bit: 4 Reserved */ + uint16_t FEXT:1; /*!< bit: 5 Standalone Filter */ + uint16_t RUNSTDBY:1; /*!< bit: 6 Run in Standby */ + uint16_t DITHER:1; /*!< bit: 7 Dithering Mode */ + uint16_t REFRESH:4; /*!< bit: 8..11 Refresh period */ + uint16_t :1; /*!< bit: 12 Reserved */ + uint16_t OSR:3; /*!< bit: 13..15 Sampling Rate */ + } bit; /*!< Structure used for bit access */ + uint16_t reg; /*!< Type used for register access */ +} DAC_DACCTRL_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define DAC_DACCTRL_OFFSET 0x0C /**< \brief (DAC_DACCTRL offset) DAC n Control */ +#define DAC_DACCTRL_RESETVALUE _U_(0x0000) /**< \brief (DAC_DACCTRL reset_value) DAC n Control */ + +#define DAC_DACCTRL_LEFTADJ_Pos 0 /**< \brief (DAC_DACCTRL) Left Adjusted Data */ +#define DAC_DACCTRL_LEFTADJ (_U_(0x1) << DAC_DACCTRL_LEFTADJ_Pos) +#define DAC_DACCTRL_ENABLE_Pos 1 /**< \brief (DAC_DACCTRL) Enable DAC0 */ +#define DAC_DACCTRL_ENABLE (_U_(0x1) << DAC_DACCTRL_ENABLE_Pos) +#define DAC_DACCTRL_CCTRL_Pos 2 /**< \brief (DAC_DACCTRL) Current Control */ +#define DAC_DACCTRL_CCTRL_Msk (_U_(0x3) << DAC_DACCTRL_CCTRL_Pos) +#define DAC_DACCTRL_CCTRL(value) (DAC_DACCTRL_CCTRL_Msk & ((value) << DAC_DACCTRL_CCTRL_Pos)) +#define DAC_DACCTRL_CCTRL_CC100K_Val _U_(0x0) /**< \brief (DAC_DACCTRL) GCLK_DAC ≤ 1.2MHz (100kSPS) */ +#define DAC_DACCTRL_CCTRL_CC1M_Val _U_(0x1) /**< \brief (DAC_DACCTRL) 1.2MHz < GCLK_DAC ≤ 6MHz (500kSPS) */ +#define DAC_DACCTRL_CCTRL_CC12M_Val _U_(0x2) /**< \brief (DAC_DACCTRL) 6MHz < GCLK_DAC ≤ 12MHz (1MSPS) */ +#define DAC_DACCTRL_CCTRL_CC100K (DAC_DACCTRL_CCTRL_CC100K_Val << DAC_DACCTRL_CCTRL_Pos) +#define DAC_DACCTRL_CCTRL_CC1M (DAC_DACCTRL_CCTRL_CC1M_Val << DAC_DACCTRL_CCTRL_Pos) +#define DAC_DACCTRL_CCTRL_CC12M (DAC_DACCTRL_CCTRL_CC12M_Val << DAC_DACCTRL_CCTRL_Pos) +#define DAC_DACCTRL_FEXT_Pos 5 /**< \brief (DAC_DACCTRL) Standalone Filter */ +#define DAC_DACCTRL_FEXT (_U_(0x1) << DAC_DACCTRL_FEXT_Pos) +#define DAC_DACCTRL_RUNSTDBY_Pos 6 /**< \brief (DAC_DACCTRL) Run in Standby */ +#define DAC_DACCTRL_RUNSTDBY (_U_(0x1) << DAC_DACCTRL_RUNSTDBY_Pos) +#define DAC_DACCTRL_DITHER_Pos 7 /**< \brief (DAC_DACCTRL) Dithering Mode */ +#define DAC_DACCTRL_DITHER (_U_(0x1) << DAC_DACCTRL_DITHER_Pos) +#define DAC_DACCTRL_REFRESH_Pos 8 /**< \brief (DAC_DACCTRL) Refresh period */ +#define DAC_DACCTRL_REFRESH_Msk (_U_(0xF) << DAC_DACCTRL_REFRESH_Pos) +#define DAC_DACCTRL_REFRESH(value) (DAC_DACCTRL_REFRESH_Msk & ((value) << DAC_DACCTRL_REFRESH_Pos)) +#define DAC_DACCTRL_OSR_Pos 13 /**< \brief (DAC_DACCTRL) Sampling Rate */ +#define DAC_DACCTRL_OSR_Msk (_U_(0x7) << DAC_DACCTRL_OSR_Pos) +#define DAC_DACCTRL_OSR(value) (DAC_DACCTRL_OSR_Msk & ((value) << DAC_DACCTRL_OSR_Pos)) +#define DAC_DACCTRL_MASK _U_(0xEFEF) /**< \brief (DAC_DACCTRL) MASK Register */ + +/* -------- DAC_DATA : (DAC Offset: 0x10) ( /W 16) DAC n Data -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint16_t DATA:16; /*!< bit: 0..15 DAC0 Data */ + } bit; /*!< Structure used for bit access */ + uint16_t reg; /*!< Type used for register access */ +} DAC_DATA_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define DAC_DATA_OFFSET 0x10 /**< \brief (DAC_DATA offset) DAC n Data */ +#define DAC_DATA_RESETVALUE _U_(0x0000) /**< \brief (DAC_DATA reset_value) DAC n Data */ + +#define DAC_DATA_DATA_Pos 0 /**< \brief (DAC_DATA) DAC0 Data */ +#define DAC_DATA_DATA_Msk (_U_(0xFFFF) << DAC_DATA_DATA_Pos) +#define DAC_DATA_DATA(value) (DAC_DATA_DATA_Msk & ((value) << DAC_DATA_DATA_Pos)) +#define DAC_DATA_MASK _U_(0xFFFF) /**< \brief (DAC_DATA) MASK Register */ + +/* -------- DAC_DATABUF : (DAC Offset: 0x14) ( /W 16) DAC n Data Buffer -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint16_t DATABUF:16; /*!< bit: 0..15 DAC0 Data Buffer */ + } bit; /*!< Structure used for bit access */ + uint16_t reg; /*!< Type used for register access */ +} DAC_DATABUF_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define DAC_DATABUF_OFFSET 0x14 /**< \brief (DAC_DATABUF offset) DAC n Data Buffer */ +#define DAC_DATABUF_RESETVALUE _U_(0x0000) /**< \brief (DAC_DATABUF reset_value) DAC n Data Buffer */ + +#define DAC_DATABUF_DATABUF_Pos 0 /**< \brief (DAC_DATABUF) DAC0 Data Buffer */ +#define DAC_DATABUF_DATABUF_Msk (_U_(0xFFFF) << DAC_DATABUF_DATABUF_Pos) +#define DAC_DATABUF_DATABUF(value) (DAC_DATABUF_DATABUF_Msk & ((value) << DAC_DATABUF_DATABUF_Pos)) +#define DAC_DATABUF_MASK _U_(0xFFFF) /**< \brief (DAC_DATABUF) MASK Register */ + +/* -------- DAC_DBGCTRL : (DAC Offset: 0x18) (R/W 8) Debug Control -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t DBGRUN:1; /*!< bit: 0 Debug Run */ + uint8_t :7; /*!< bit: 1.. 7 Reserved */ + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} DAC_DBGCTRL_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define DAC_DBGCTRL_OFFSET 0x18 /**< \brief (DAC_DBGCTRL offset) Debug Control */ +#define DAC_DBGCTRL_RESETVALUE _U_(0x00) /**< \brief (DAC_DBGCTRL reset_value) Debug Control */ + +#define DAC_DBGCTRL_DBGRUN_Pos 0 /**< \brief (DAC_DBGCTRL) Debug Run */ +#define DAC_DBGCTRL_DBGRUN (_U_(0x1) << DAC_DBGCTRL_DBGRUN_Pos) +#define DAC_DBGCTRL_MASK _U_(0x01) /**< \brief (DAC_DBGCTRL) MASK Register */ + +/* -------- DAC_RESULT : (DAC Offset: 0x1C) (R/ 16) Filter Result -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint16_t RESULT:16; /*!< bit: 0..15 Filter Result */ + } bit; /*!< Structure used for bit access */ + uint16_t reg; /*!< Type used for register access */ +} DAC_RESULT_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define DAC_RESULT_OFFSET 0x1C /**< \brief (DAC_RESULT offset) Filter Result */ +#define DAC_RESULT_RESETVALUE _U_(0x0000) /**< \brief (DAC_RESULT reset_value) Filter Result */ + +#define DAC_RESULT_RESULT_Pos 0 /**< \brief (DAC_RESULT) Filter Result */ +#define DAC_RESULT_RESULT_Msk (_U_(0xFFFF) << DAC_RESULT_RESULT_Pos) +#define DAC_RESULT_RESULT(value) (DAC_RESULT_RESULT_Msk & ((value) << DAC_RESULT_RESULT_Pos)) +#define DAC_RESULT_MASK _U_(0xFFFF) /**< \brief (DAC_RESULT) MASK Register */ + +/** \brief DAC hardware registers */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef struct { + __IO DAC_CTRLA_Type CTRLA; /**< \brief Offset: 0x00 (R/W 8) Control A */ + __IO DAC_CTRLB_Type CTRLB; /**< \brief Offset: 0x01 (R/W 8) Control B */ + __IO DAC_EVCTRL_Type EVCTRL; /**< \brief Offset: 0x02 (R/W 8) Event Control */ + RoReg8 Reserved1[0x1]; + __IO DAC_INTENCLR_Type INTENCLR; /**< \brief Offset: 0x04 (R/W 8) Interrupt Enable Clear */ + __IO DAC_INTENSET_Type INTENSET; /**< \brief Offset: 0x05 (R/W 8) Interrupt Enable Set */ + __IO DAC_INTFLAG_Type INTFLAG; /**< \brief Offset: 0x06 (R/W 8) Interrupt Flag Status and Clear */ + __I DAC_STATUS_Type STATUS; /**< \brief Offset: 0x07 (R/ 8) Status */ + __I DAC_SYNCBUSY_Type SYNCBUSY; /**< \brief Offset: 0x08 (R/ 32) Synchronization Busy */ + __IO DAC_DACCTRL_Type DACCTRL[2]; /**< \brief Offset: 0x0C (R/W 16) DAC n Control */ + __O DAC_DATA_Type DATA[2]; /**< \brief Offset: 0x10 ( /W 16) DAC n Data */ + __O DAC_DATABUF_Type DATABUF[2]; /**< \brief Offset: 0x14 ( /W 16) DAC n Data Buffer */ + __IO DAC_DBGCTRL_Type DBGCTRL; /**< \brief Offset: 0x18 (R/W 8) Debug Control */ + RoReg8 Reserved2[0x3]; + __I DAC_RESULT_Type RESULT[2]; /**< \brief Offset: 0x1C (R/ 16) Filter Result */ +} Dac; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/*@}*/ + +#endif /* _SAMD51_DAC_COMPONENT_ */ diff --git a/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/dmac.h b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/dmac.h new file mode 100644 index 000000000..295b31fe4 --- /dev/null +++ b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/component/dmac.h @@ -0,0 +1,1416 @@ +/** + * \file + * + * \brief Component description for DMAC + * + * Copyright (c) 2017 Microchip Technology Inc. + * + * \asf_license_start + * + * \page License + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 Licence 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. + * + * \asf_license_stop + * + */ + +#ifndef _SAMD51_DMAC_COMPONENT_ +#define _SAMD51_DMAC_COMPONENT_ + +/* ========================================================================== */ +/** SOFTWARE API DEFINITION FOR DMAC */ +/* ========================================================================== */ +/** \addtogroup SAMD51_DMAC Direct Memory Access Controller */ +/*@{*/ + +#define DMAC_U2503 +#define REV_DMAC 0x100 + +/* -------- DMAC_CTRL : (DMAC Offset: 0x00) (R/W 16) Control -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint16_t SWRST:1; /*!< bit: 0 Software Reset */ + uint16_t DMAENABLE:1; /*!< bit: 1 DMA Enable */ + uint16_t :6; /*!< bit: 2.. 7 Reserved */ + uint16_t LVLEN0:1; /*!< bit: 8 Priority Level 0 Enable */ + uint16_t LVLEN1:1; /*!< bit: 9 Priority Level 1 Enable */ + uint16_t LVLEN2:1; /*!< bit: 10 Priority Level 2 Enable */ + uint16_t LVLEN3:1; /*!< bit: 11 Priority Level 3 Enable */ + uint16_t :4; /*!< bit: 12..15 Reserved */ + } bit; /*!< Structure used for bit access */ + struct { + uint16_t :8; /*!< bit: 0.. 7 Reserved */ + uint16_t LVLEN:4; /*!< bit: 8..11 Priority Level x Enable */ + uint16_t :4; /*!< bit: 12..15 Reserved */ + } vec; /*!< Structure used for vec access */ + uint16_t reg; /*!< Type used for register access */ +} DMAC_CTRL_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define DMAC_CTRL_OFFSET 0x00 /**< \brief (DMAC_CTRL offset) Control */ +#define DMAC_CTRL_RESETVALUE _U_(0x0000) /**< \brief (DMAC_CTRL reset_value) Control */ + +#define DMAC_CTRL_SWRST_Pos 0 /**< \brief (DMAC_CTRL) Software Reset */ +#define DMAC_CTRL_SWRST (_U_(0x1) << DMAC_CTRL_SWRST_Pos) +#define DMAC_CTRL_DMAENABLE_Pos 1 /**< \brief (DMAC_CTRL) DMA Enable */ +#define DMAC_CTRL_DMAENABLE (_U_(0x1) << DMAC_CTRL_DMAENABLE_Pos) +#define DMAC_CTRL_LVLEN0_Pos 8 /**< \brief (DMAC_CTRL) Priority Level 0 Enable */ +#define DMAC_CTRL_LVLEN0 (_U_(1) << DMAC_CTRL_LVLEN0_Pos) +#define DMAC_CTRL_LVLEN1_Pos 9 /**< \brief (DMAC_CTRL) Priority Level 1 Enable */ +#define DMAC_CTRL_LVLEN1 (_U_(1) << DMAC_CTRL_LVLEN1_Pos) +#define DMAC_CTRL_LVLEN2_Pos 10 /**< \brief (DMAC_CTRL) Priority Level 2 Enable */ +#define DMAC_CTRL_LVLEN2 (_U_(1) << DMAC_CTRL_LVLEN2_Pos) +#define DMAC_CTRL_LVLEN3_Pos 11 /**< \brief (DMAC_CTRL) Priority Level 3 Enable */ +#define DMAC_CTRL_LVLEN3 (_U_(1) << DMAC_CTRL_LVLEN3_Pos) +#define DMAC_CTRL_LVLEN_Pos 8 /**< \brief (DMAC_CTRL) Priority Level x Enable */ +#define DMAC_CTRL_LVLEN_Msk (_U_(0xF) << DMAC_CTRL_LVLEN_Pos) +#define DMAC_CTRL_LVLEN(value) (DMAC_CTRL_LVLEN_Msk & ((value) << DMAC_CTRL_LVLEN_Pos)) +#define DMAC_CTRL_MASK _U_(0x0F03) /**< \brief (DMAC_CTRL) MASK Register */ + +/* -------- DMAC_CRCCTRL : (DMAC Offset: 0x02) (R/W 16) CRC Control -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint16_t CRCBEATSIZE:2; /*!< bit: 0.. 1 CRC Beat Size */ + uint16_t CRCPOLY:2; /*!< bit: 2.. 3 CRC Polynomial Type */ + uint16_t :4; /*!< bit: 4.. 7 Reserved */ + uint16_t CRCSRC:6; /*!< bit: 8..13 CRC Input Source */ + uint16_t CRCMODE:2; /*!< bit: 14..15 CRC Operating Mode */ + } bit; /*!< Structure used for bit access */ + uint16_t reg; /*!< Type used for register access */ +} DMAC_CRCCTRL_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define DMAC_CRCCTRL_OFFSET 0x02 /**< \brief (DMAC_CRCCTRL offset) CRC Control */ +#define DMAC_CRCCTRL_RESETVALUE _U_(0x0000) /**< \brief (DMAC_CRCCTRL reset_value) CRC Control */ + +#define DMAC_CRCCTRL_CRCBEATSIZE_Pos 0 /**< \brief (DMAC_CRCCTRL) CRC Beat Size */ +#define DMAC_CRCCTRL_CRCBEATSIZE_Msk (_U_(0x3) << DMAC_CRCCTRL_CRCBEATSIZE_Pos) +#define DMAC_CRCCTRL_CRCBEATSIZE(value) (DMAC_CRCCTRL_CRCBEATSIZE_Msk & ((value) << DMAC_CRCCTRL_CRCBEATSIZE_Pos)) +#define DMAC_CRCCTRL_CRCBEATSIZE_BYTE_Val _U_(0x0) /**< \brief (DMAC_CRCCTRL) 8-bit bus transfer */ +#define DMAC_CRCCTRL_CRCBEATSIZE_HWORD_Val _U_(0x1) /**< \brief (DMAC_CRCCTRL) 16-bit bus transfer */ +#define DMAC_CRCCTRL_CRCBEATSIZE_WORD_Val _U_(0x2) /**< \brief (DMAC_CRCCTRL) 32-bit bus transfer */ +#define DMAC_CRCCTRL_CRCBEATSIZE_BYTE (DMAC_CRCCTRL_CRCBEATSIZE_BYTE_Val << DMAC_CRCCTRL_CRCBEATSIZE_Pos) +#define DMAC_CRCCTRL_CRCBEATSIZE_HWORD (DMAC_CRCCTRL_CRCBEATSIZE_HWORD_Val << DMAC_CRCCTRL_CRCBEATSIZE_Pos) +#define DMAC_CRCCTRL_CRCBEATSIZE_WORD (DMAC_CRCCTRL_CRCBEATSIZE_WORD_Val << DMAC_CRCCTRL_CRCBEATSIZE_Pos) +#define DMAC_CRCCTRL_CRCPOLY_Pos 2 /**< \brief (DMAC_CRCCTRL) CRC Polynomial Type */ +#define DMAC_CRCCTRL_CRCPOLY_Msk (_U_(0x3) << DMAC_CRCCTRL_CRCPOLY_Pos) +#define DMAC_CRCCTRL_CRCPOLY(value) (DMAC_CRCCTRL_CRCPOLY_Msk & ((value) << DMAC_CRCCTRL_CRCPOLY_Pos)) +#define DMAC_CRCCTRL_CRCPOLY_CRC16_Val _U_(0x0) /**< \brief (DMAC_CRCCTRL) CRC-16 (CRC-CCITT) */ +#define DMAC_CRCCTRL_CRCPOLY_CRC32_Val _U_(0x1) /**< \brief (DMAC_CRCCTRL) CRC32 (IEEE 802.3) */ +#define DMAC_CRCCTRL_CRCPOLY_CRC16 (DMAC_CRCCTRL_CRCPOLY_CRC16_Val << DMAC_CRCCTRL_CRCPOLY_Pos) +#define DMAC_CRCCTRL_CRCPOLY_CRC32 (DMAC_CRCCTRL_CRCPOLY_CRC32_Val << DMAC_CRCCTRL_CRCPOLY_Pos) +#define DMAC_CRCCTRL_CRCSRC_Pos 8 /**< \brief (DMAC_CRCCTRL) CRC Input Source */ +#define DMAC_CRCCTRL_CRCSRC_Msk (_U_(0x3F) << DMAC_CRCCTRL_CRCSRC_Pos) +#define DMAC_CRCCTRL_CRCSRC(value) (DMAC_CRCCTRL_CRCSRC_Msk & ((value) << DMAC_CRCCTRL_CRCSRC_Pos)) +#define DMAC_CRCCTRL_CRCSRC_DISABLE_Val _U_(0x0) /**< \brief (DMAC_CRCCTRL) CRC Disabled */ +#define DMAC_CRCCTRL_CRCSRC_IO_Val _U_(0x1) /**< \brief (DMAC_CRCCTRL) I/O interface */ +#define DMAC_CRCCTRL_CRCSRC_DISABLE (DMAC_CRCCTRL_CRCSRC_DISABLE_Val << DMAC_CRCCTRL_CRCSRC_Pos) +#define DMAC_CRCCTRL_CRCSRC_IO (DMAC_CRCCTRL_CRCSRC_IO_Val << DMAC_CRCCTRL_CRCSRC_Pos) +#define DMAC_CRCCTRL_CRCMODE_Pos 14 /**< \brief (DMAC_CRCCTRL) CRC Operating Mode */ +#define DMAC_CRCCTRL_CRCMODE_Msk (_U_(0x3) << DMAC_CRCCTRL_CRCMODE_Pos) +#define DMAC_CRCCTRL_CRCMODE(value) (DMAC_CRCCTRL_CRCMODE_Msk & ((value) << DMAC_CRCCTRL_CRCMODE_Pos)) +#define DMAC_CRCCTRL_CRCMODE_DEFAULT_Val _U_(0x0) /**< \brief (DMAC_CRCCTRL) Default operating mode */ +#define DMAC_CRCCTRL_CRCMODE_CRCMON_Val _U_(0x2) /**< \brief (DMAC_CRCCTRL) Memory CRC monitor operating mode */ +#define DMAC_CRCCTRL_CRCMODE_CRCGEN_Val _U_(0x3) /**< \brief (DMAC_CRCCTRL) Memory CRC generation operating mode */ +#define DMAC_CRCCTRL_CRCMODE_DEFAULT (DMAC_CRCCTRL_CRCMODE_DEFAULT_Val << DMAC_CRCCTRL_CRCMODE_Pos) +#define DMAC_CRCCTRL_CRCMODE_CRCMON (DMAC_CRCCTRL_CRCMODE_CRCMON_Val << DMAC_CRCCTRL_CRCMODE_Pos) +#define DMAC_CRCCTRL_CRCMODE_CRCGEN (DMAC_CRCCTRL_CRCMODE_CRCGEN_Val << DMAC_CRCCTRL_CRCMODE_Pos) +#define DMAC_CRCCTRL_MASK _U_(0xFF0F) /**< \brief (DMAC_CRCCTRL) MASK Register */ + +/* -------- DMAC_CRCDATAIN : (DMAC Offset: 0x04) (R/W 32) CRC Data Input -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t CRCDATAIN:32; /*!< bit: 0..31 CRC Data Input */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} DMAC_CRCDATAIN_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define DMAC_CRCDATAIN_OFFSET 0x04 /**< \brief (DMAC_CRCDATAIN offset) CRC Data Input */ +#define DMAC_CRCDATAIN_RESETVALUE _U_(0x00000000) /**< \brief (DMAC_CRCDATAIN reset_value) CRC Data Input */ + +#define DMAC_CRCDATAIN_CRCDATAIN_Pos 0 /**< \brief (DMAC_CRCDATAIN) CRC Data Input */ +#define DMAC_CRCDATAIN_CRCDATAIN_Msk (_U_(0xFFFFFFFF) << DMAC_CRCDATAIN_CRCDATAIN_Pos) +#define DMAC_CRCDATAIN_CRCDATAIN(value) (DMAC_CRCDATAIN_CRCDATAIN_Msk & ((value) << DMAC_CRCDATAIN_CRCDATAIN_Pos)) +#define DMAC_CRCDATAIN_MASK _U_(0xFFFFFFFF) /**< \brief (DMAC_CRCDATAIN) MASK Register */ + +/* -------- DMAC_CRCCHKSUM : (DMAC Offset: 0x08) (R/W 32) CRC Checksum -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t CRCCHKSUM:32; /*!< bit: 0..31 CRC Checksum */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} DMAC_CRCCHKSUM_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define DMAC_CRCCHKSUM_OFFSET 0x08 /**< \brief (DMAC_CRCCHKSUM offset) CRC Checksum */ +#define DMAC_CRCCHKSUM_RESETVALUE _U_(0x00000000) /**< \brief (DMAC_CRCCHKSUM reset_value) CRC Checksum */ + +#define DMAC_CRCCHKSUM_CRCCHKSUM_Pos 0 /**< \brief (DMAC_CRCCHKSUM) CRC Checksum */ +#define DMAC_CRCCHKSUM_CRCCHKSUM_Msk (_U_(0xFFFFFFFF) << DMAC_CRCCHKSUM_CRCCHKSUM_Pos) +#define DMAC_CRCCHKSUM_CRCCHKSUM(value) (DMAC_CRCCHKSUM_CRCCHKSUM_Msk & ((value) << DMAC_CRCCHKSUM_CRCCHKSUM_Pos)) +#define DMAC_CRCCHKSUM_MASK _U_(0xFFFFFFFF) /**< \brief (DMAC_CRCCHKSUM) MASK Register */ + +/* -------- DMAC_CRCSTATUS : (DMAC Offset: 0x0C) (R/W 8) CRC Status -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t CRCBUSY:1; /*!< bit: 0 CRC Module Busy */ + uint8_t CRCZERO:1; /*!< bit: 1 CRC Zero */ + uint8_t CRCERR:1; /*!< bit: 2 CRC Error */ + uint8_t :5; /*!< bit: 3.. 7 Reserved */ + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} DMAC_CRCSTATUS_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define DMAC_CRCSTATUS_OFFSET 0x0C /**< \brief (DMAC_CRCSTATUS offset) CRC Status */ +#define DMAC_CRCSTATUS_RESETVALUE _U_(0x00) /**< \brief (DMAC_CRCSTATUS reset_value) CRC Status */ + +#define DMAC_CRCSTATUS_CRCBUSY_Pos 0 /**< \brief (DMAC_CRCSTATUS) CRC Module Busy */ +#define DMAC_CRCSTATUS_CRCBUSY (_U_(0x1) << DMAC_CRCSTATUS_CRCBUSY_Pos) +#define DMAC_CRCSTATUS_CRCZERO_Pos 1 /**< \brief (DMAC_CRCSTATUS) CRC Zero */ +#define DMAC_CRCSTATUS_CRCZERO (_U_(0x1) << DMAC_CRCSTATUS_CRCZERO_Pos) +#define DMAC_CRCSTATUS_CRCERR_Pos 2 /**< \brief (DMAC_CRCSTATUS) CRC Error */ +#define DMAC_CRCSTATUS_CRCERR (_U_(0x1) << DMAC_CRCSTATUS_CRCERR_Pos) +#define DMAC_CRCSTATUS_MASK _U_(0x07) /**< \brief (DMAC_CRCSTATUS) MASK Register */ + +/* -------- DMAC_DBGCTRL : (DMAC Offset: 0x0D) (R/W 8) Debug Control -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t DBGRUN:1; /*!< bit: 0 Debug Run */ + uint8_t :7; /*!< bit: 1.. 7 Reserved */ + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} DMAC_DBGCTRL_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define DMAC_DBGCTRL_OFFSET 0x0D /**< \brief (DMAC_DBGCTRL offset) Debug Control */ +#define DMAC_DBGCTRL_RESETVALUE _U_(0x00) /**< \brief (DMAC_DBGCTRL reset_value) Debug Control */ + +#define DMAC_DBGCTRL_DBGRUN_Pos 0 /**< \brief (DMAC_DBGCTRL) Debug Run */ +#define DMAC_DBGCTRL_DBGRUN (_U_(0x1) << DMAC_DBGCTRL_DBGRUN_Pos) +#define DMAC_DBGCTRL_MASK _U_(0x01) /**< \brief (DMAC_DBGCTRL) MASK Register */ + +/* -------- DMAC_SWTRIGCTRL : (DMAC Offset: 0x10) (R/W 32) Software Trigger Control -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t SWTRIG0:1; /*!< bit: 0 Channel 0 Software Trigger */ + uint32_t SWTRIG1:1; /*!< bit: 1 Channel 1 Software Trigger */ + uint32_t SWTRIG2:1; /*!< bit: 2 Channel 2 Software Trigger */ + uint32_t SWTRIG3:1; /*!< bit: 3 Channel 3 Software Trigger */ + uint32_t SWTRIG4:1; /*!< bit: 4 Channel 4 Software Trigger */ + uint32_t SWTRIG5:1; /*!< bit: 5 Channel 5 Software Trigger */ + uint32_t SWTRIG6:1; /*!< bit: 6 Channel 6 Software Trigger */ + uint32_t SWTRIG7:1; /*!< bit: 7 Channel 7 Software Trigger */ + uint32_t SWTRIG8:1; /*!< bit: 8 Channel 8 Software Trigger */ + uint32_t SWTRIG9:1; /*!< bit: 9 Channel 9 Software Trigger */ + uint32_t SWTRIG10:1; /*!< bit: 10 Channel 10 Software Trigger */ + uint32_t SWTRIG11:1; /*!< bit: 11 Channel 11 Software Trigger */ + uint32_t SWTRIG12:1; /*!< bit: 12 Channel 12 Software Trigger */ + uint32_t SWTRIG13:1; /*!< bit: 13 Channel 13 Software Trigger */ + uint32_t SWTRIG14:1; /*!< bit: 14 Channel 14 Software Trigger */ + uint32_t SWTRIG15:1; /*!< bit: 15 Channel 15 Software Trigger */ + uint32_t SWTRIG16:1; /*!< bit: 16 Channel 16 Software Trigger */ + uint32_t SWTRIG17:1; /*!< bit: 17 Channel 17 Software Trigger */ + uint32_t SWTRIG18:1; /*!< bit: 18 Channel 18 Software Trigger */ + uint32_t SWTRIG19:1; /*!< bit: 19 Channel 19 Software Trigger */ + uint32_t SWTRIG20:1; /*!< bit: 20 Channel 20 Software Trigger */ + uint32_t SWTRIG21:1; /*!< bit: 21 Channel 21 Software Trigger */ + uint32_t SWTRIG22:1; /*!< bit: 22 Channel 22 Software Trigger */ + uint32_t SWTRIG23:1; /*!< bit: 23 Channel 23 Software Trigger */ + uint32_t SWTRIG24:1; /*!< bit: 24 Channel 24 Software Trigger */ + uint32_t SWTRIG25:1; /*!< bit: 25 Channel 25 Software Trigger */ + uint32_t SWTRIG26:1; /*!< bit: 26 Channel 26 Software Trigger */ + uint32_t SWTRIG27:1; /*!< bit: 27 Channel 27 Software Trigger */ + uint32_t SWTRIG28:1; /*!< bit: 28 Channel 28 Software Trigger */ + uint32_t SWTRIG29:1; /*!< bit: 29 Channel 29 Software Trigger */ + uint32_t SWTRIG30:1; /*!< bit: 30 Channel 30 Software Trigger */ + uint32_t SWTRIG31:1; /*!< bit: 31 Channel 31 Software Trigger */ + } bit; /*!< Structure used for bit access */ + struct { + uint32_t SWTRIG:32; /*!< bit: 0..31 Channel x Software Trigger */ + } vec; /*!< Structure used for vec access */ + uint32_t reg; /*!< Type used for register access */ +} DMAC_SWTRIGCTRL_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define DMAC_SWTRIGCTRL_OFFSET 0x10 /**< \brief (DMAC_SWTRIGCTRL offset) Software Trigger Control */ +#define DMAC_SWTRIGCTRL_RESETVALUE _U_(0x00000000) /**< \brief (DMAC_SWTRIGCTRL reset_value) Software Trigger Control */ + +#define DMAC_SWTRIGCTRL_SWTRIG0_Pos 0 /**< \brief (DMAC_SWTRIGCTRL) Channel 0 Software Trigger */ +#define DMAC_SWTRIGCTRL_SWTRIG0 (_U_(1) << DMAC_SWTRIGCTRL_SWTRIG0_Pos) +#define DMAC_SWTRIGCTRL_SWTRIG1_Pos 1 /**< \brief (DMAC_SWTRIGCTRL) Channel 1 Software Trigger */ +#define DMAC_SWTRIGCTRL_SWTRIG1 (_U_(1) << DMAC_SWTRIGCTRL_SWTRIG1_Pos) +#define DMAC_SWTRIGCTRL_SWTRIG2_Pos 2 /**< \brief (DMAC_SWTRIGCTRL) Channel 2 Software Trigger */ +#define DMAC_SWTRIGCTRL_SWTRIG2 (_U_(1) << DMAC_SWTRIGCTRL_SWTRIG2_Pos) +#define DMAC_SWTRIGCTRL_SWTRIG3_Pos 3 /**< \brief (DMAC_SWTRIGCTRL) Channel 3 Software Trigger */ +#define DMAC_SWTRIGCTRL_SWTRIG3 (_U_(1) << DMAC_SWTRIGCTRL_SWTRIG3_Pos) +#define DMAC_SWTRIGCTRL_SWTRIG4_Pos 4 /**< \brief (DMAC_SWTRIGCTRL) Channel 4 Software Trigger */ +#define DMAC_SWTRIGCTRL_SWTRIG4 (_U_(1) << DMAC_SWTRIGCTRL_SWTRIG4_Pos) +#define DMAC_SWTRIGCTRL_SWTRIG5_Pos 5 /**< \brief (DMAC_SWTRIGCTRL) Channel 5 Software Trigger */ +#define DMAC_SWTRIGCTRL_SWTRIG5 (_U_(1) << DMAC_SWTRIGCTRL_SWTRIG5_Pos) +#define DMAC_SWTRIGCTRL_SWTRIG6_Pos 6 /**< \brief (DMAC_SWTRIGCTRL) Channel 6 Software Trigger */ +#define DMAC_SWTRIGCTRL_SWTRIG6 (_U_(1) << DMAC_SWTRIGCTRL_SWTRIG6_Pos) +#define DMAC_SWTRIGCTRL_SWTRIG7_Pos 7 /**< \brief (DMAC_SWTRIGCTRL) Channel 7 Software Trigger */ +#define DMAC_SWTRIGCTRL_SWTRIG7 (_U_(1) << DMAC_SWTRIGCTRL_SWTRIG7_Pos) +#define DMAC_SWTRIGCTRL_SWTRIG8_Pos 8 /**< \brief (DMAC_SWTRIGCTRL) Channel 8 Software Trigger */ +#define DMAC_SWTRIGCTRL_SWTRIG8 (_U_(1) << DMAC_SWTRIGCTRL_SWTRIG8_Pos) +#define DMAC_SWTRIGCTRL_SWTRIG9_Pos 9 /**< \brief (DMAC_SWTRIGCTRL) Channel 9 Software Trigger */ +#define DMAC_SWTRIGCTRL_SWTRIG9 (_U_(1) << DMAC_SWTRIGCTRL_SWTRIG9_Pos) +#define DMAC_SWTRIGCTRL_SWTRIG10_Pos 10 /**< \brief (DMAC_SWTRIGCTRL) Channel 10 Software Trigger */ +#define DMAC_SWTRIGCTRL_SWTRIG10 (_U_(1) << DMAC_SWTRIGCTRL_SWTRIG10_Pos) +#define DMAC_SWTRIGCTRL_SWTRIG11_Pos 11 /**< \brief (DMAC_SWTRIGCTRL) Channel 11 Software Trigger */ +#define DMAC_SWTRIGCTRL_SWTRIG11 (_U_(1) << DMAC_SWTRIGCTRL_SWTRIG11_Pos) +#define DMAC_SWTRIGCTRL_SWTRIG12_Pos 12 /**< \brief (DMAC_SWTRIGCTRL) Channel 12 Software Trigger */ +#define DMAC_SWTRIGCTRL_SWTRIG12 (_U_(1) << DMAC_SWTRIGCTRL_SWTRIG12_Pos) +#define DMAC_SWTRIGCTRL_SWTRIG13_Pos 13 /**< \brief (DMAC_SWTRIGCTRL) Channel 13 Software Trigger */ +#define DMAC_SWTRIGCTRL_SWTRIG13 (_U_(1) << DMAC_SWTRIGCTRL_SWTRIG13_Pos) +#define DMAC_SWTRIGCTRL_SWTRIG14_Pos 14 /**< \brief (DMAC_SWTRIGCTRL) Channel 14 Software Trigger */ +#define DMAC_SWTRIGCTRL_SWTRIG14 (_U_(1) << DMAC_SWTRIGCTRL_SWTRIG14_Pos) +#define DMAC_SWTRIGCTRL_SWTRIG15_Pos 15 /**< \brief (DMAC_SWTRIGCTRL) Channel 15 Software Trigger */ +#define DMAC_SWTRIGCTRL_SWTRIG15 (_U_(1) << DMAC_SWTRIGCTRL_SWTRIG15_Pos) +#define DMAC_SWTRIGCTRL_SWTRIG16_Pos 16 /**< \brief (DMAC_SWTRIGCTRL) Channel 16 Software Trigger */ +#define DMAC_SWTRIGCTRL_SWTRIG16 (_U_(1) << DMAC_SWTRIGCTRL_SWTRIG16_Pos) +#define DMAC_SWTRIGCTRL_SWTRIG17_Pos 17 /**< \brief (DMAC_SWTRIGCTRL) Channel 17 Software Trigger */ +#define DMAC_SWTRIGCTRL_SWTRIG17 (_U_(1) << DMAC_SWTRIGCTRL_SWTRIG17_Pos) +#define DMAC_SWTRIGCTRL_SWTRIG18_Pos 18 /**< \brief (DMAC_SWTRIGCTRL) Channel 18 Software Trigger */ +#define DMAC_SWTRIGCTRL_SWTRIG18 (_U_(1) << DMAC_SWTRIGCTRL_SWTRIG18_Pos) +#define DMAC_SWTRIGCTRL_SWTRIG19_Pos 19 /**< \brief (DMAC_SWTRIGCTRL) Channel 19 Software Trigger */ +#define DMAC_SWTRIGCTRL_SWTRIG19 (_U_(1) << DMAC_SWTRIGCTRL_SWTRIG19_Pos) +#define DMAC_SWTRIGCTRL_SWTRIG20_Pos 20 /**< \brief (DMAC_SWTRIGCTRL) Channel 20 Software Trigger */ +#define DMAC_SWTRIGCTRL_SWTRIG20 (_U_(1) << DMAC_SWTRIGCTRL_SWTRIG20_Pos) +#define DMAC_SWTRIGCTRL_SWTRIG21_Pos 21 /**< \brief (DMAC_SWTRIGCTRL) Channel 21 Software Trigger */ +#define DMAC_SWTRIGCTRL_SWTRIG21 (_U_(1) << DMAC_SWTRIGCTRL_SWTRIG21_Pos) +#define DMAC_SWTRIGCTRL_SWTRIG22_Pos 22 /**< \brief (DMAC_SWTRIGCTRL) Channel 22 Software Trigger */ +#define DMAC_SWTRIGCTRL_SWTRIG22 (_U_(1) << DMAC_SWTRIGCTRL_SWTRIG22_Pos) +#define DMAC_SWTRIGCTRL_SWTRIG23_Pos 23 /**< \brief (DMAC_SWTRIGCTRL) Channel 23 Software Trigger */ +#define DMAC_SWTRIGCTRL_SWTRIG23 (_U_(1) << DMAC_SWTRIGCTRL_SWTRIG23_Pos) +#define DMAC_SWTRIGCTRL_SWTRIG24_Pos 24 /**< \brief (DMAC_SWTRIGCTRL) Channel 24 Software Trigger */ +#define DMAC_SWTRIGCTRL_SWTRIG24 (_U_(1) << DMAC_SWTRIGCTRL_SWTRIG24_Pos) +#define DMAC_SWTRIGCTRL_SWTRIG25_Pos 25 /**< \brief (DMAC_SWTRIGCTRL) Channel 25 Software Trigger */ +#define DMAC_SWTRIGCTRL_SWTRIG25 (_U_(1) << DMAC_SWTRIGCTRL_SWTRIG25_Pos) +#define DMAC_SWTRIGCTRL_SWTRIG26_Pos 26 /**< \brief (DMAC_SWTRIGCTRL) Channel 26 Software Trigger */ +#define DMAC_SWTRIGCTRL_SWTRIG26 (_U_(1) << DMAC_SWTRIGCTRL_SWTRIG26_Pos) +#define DMAC_SWTRIGCTRL_SWTRIG27_Pos 27 /**< \brief (DMAC_SWTRIGCTRL) Channel 27 Software Trigger */ +#define DMAC_SWTRIGCTRL_SWTRIG27 (_U_(1) << DMAC_SWTRIGCTRL_SWTRIG27_Pos) +#define DMAC_SWTRIGCTRL_SWTRIG28_Pos 28 /**< \brief (DMAC_SWTRIGCTRL) Channel 28 Software Trigger */ +#define DMAC_SWTRIGCTRL_SWTRIG28 (_U_(1) << DMAC_SWTRIGCTRL_SWTRIG28_Pos) +#define DMAC_SWTRIGCTRL_SWTRIG29_Pos 29 /**< \brief (DMAC_SWTRIGCTRL) Channel 29 Software Trigger */ +#define DMAC_SWTRIGCTRL_SWTRIG29 (_U_(1) << DMAC_SWTRIGCTRL_SWTRIG29_Pos) +#define DMAC_SWTRIGCTRL_SWTRIG30_Pos 30 /**< \brief (DMAC_SWTRIGCTRL) Channel 30 Software Trigger */ +#define DMAC_SWTRIGCTRL_SWTRIG30 (_U_(1) << DMAC_SWTRIGCTRL_SWTRIG30_Pos) +#define DMAC_SWTRIGCTRL_SWTRIG31_Pos 31 /**< \brief (DMAC_SWTRIGCTRL) Channel 31 Software Trigger */ +#define DMAC_SWTRIGCTRL_SWTRIG31 (_U_(1) << DMAC_SWTRIGCTRL_SWTRIG31_Pos) +#define DMAC_SWTRIGCTRL_SWTRIG_Pos 0 /**< \brief (DMAC_SWTRIGCTRL) Channel x Software Trigger */ +#define DMAC_SWTRIGCTRL_SWTRIG_Msk (_U_(0xFFFFFFFF) << DMAC_SWTRIGCTRL_SWTRIG_Pos) +#define DMAC_SWTRIGCTRL_SWTRIG(value) (DMAC_SWTRIGCTRL_SWTRIG_Msk & ((value) << DMAC_SWTRIGCTRL_SWTRIG_Pos)) +#define DMAC_SWTRIGCTRL_MASK _U_(0xFFFFFFFF) /**< \brief (DMAC_SWTRIGCTRL) MASK Register */ + +/* -------- DMAC_PRICTRL0 : (DMAC Offset: 0x14) (R/W 32) Priority Control 0 -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t LVLPRI0:5; /*!< bit: 0.. 4 Level 0 Channel Priority Number */ + uint32_t QOS0:2; /*!< bit: 5.. 6 Level 0 Quality of Service */ + uint32_t RRLVLEN0:1; /*!< bit: 7 Level 0 Round-Robin Scheduling Enable */ + uint32_t LVLPRI1:5; /*!< bit: 8..12 Level 1 Channel Priority Number */ + uint32_t QOS1:2; /*!< bit: 13..14 Level 1 Quality of Service */ + uint32_t RRLVLEN1:1; /*!< bit: 15 Level 1 Round-Robin Scheduling Enable */ + uint32_t LVLPRI2:5; /*!< bit: 16..20 Level 2 Channel Priority Number */ + uint32_t QOS2:2; /*!< bit: 21..22 Level 2 Quality of Service */ + uint32_t RRLVLEN2:1; /*!< bit: 23 Level 2 Round-Robin Scheduling Enable */ + uint32_t LVLPRI3:5; /*!< bit: 24..28 Level 3 Channel Priority Number */ + uint32_t QOS3:2; /*!< bit: 29..30 Level 3 Quality of Service */ + uint32_t RRLVLEN3:1; /*!< bit: 31 Level 3 Round-Robin Scheduling Enable */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} DMAC_PRICTRL0_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define DMAC_PRICTRL0_OFFSET 0x14 /**< \brief (DMAC_PRICTRL0 offset) Priority Control 0 */ +#define DMAC_PRICTRL0_RESETVALUE _U_(0x40404040) /**< \brief (DMAC_PRICTRL0 reset_value) Priority Control 0 */ + +#define DMAC_PRICTRL0_LVLPRI0_Pos 0 /**< \brief (DMAC_PRICTRL0) Level 0 Channel Priority Number */ +#define DMAC_PRICTRL0_LVLPRI0_Msk (_U_(0x1F) << DMAC_PRICTRL0_LVLPRI0_Pos) +#define DMAC_PRICTRL0_LVLPRI0(value) (DMAC_PRICTRL0_LVLPRI0_Msk & ((value) << DMAC_PRICTRL0_LVLPRI0_Pos)) +#define DMAC_PRICTRL0_QOS0_Pos 5 /**< \brief (DMAC_PRICTRL0) Level 0 Quality of Service */ +#define DMAC_PRICTRL0_QOS0_Msk (_U_(0x3) << DMAC_PRICTRL0_QOS0_Pos) +#define DMAC_PRICTRL0_QOS0(value) (DMAC_PRICTRL0_QOS0_Msk & ((value) << DMAC_PRICTRL0_QOS0_Pos)) +#define DMAC_PRICTRL0_QOS0_REGULAR_Val _U_(0x0) /**< \brief (DMAC_PRICTRL0) Regular delivery */ +#define DMAC_PRICTRL0_QOS0_SHORTAGE_Val _U_(0x1) /**< \brief (DMAC_PRICTRL0) Bandwidth shortage */ +#define DMAC_PRICTRL0_QOS0_SENSITIVE_Val _U_(0x2) /**< \brief (DMAC_PRICTRL0) Latency sensitive */ +#define DMAC_PRICTRL0_QOS0_CRITICAL_Val _U_(0x3) /**< \brief (DMAC_PRICTRL0) Latency critical */ +#define DMAC_PRICTRL0_QOS0_REGULAR (DMAC_PRICTRL0_QOS0_REGULAR_Val << DMAC_PRICTRL0_QOS0_Pos) +#define DMAC_PRICTRL0_QOS0_SHORTAGE (DMAC_PRICTRL0_QOS0_SHORTAGE_Val << DMAC_PRICTRL0_QOS0_Pos) +#define DMAC_PRICTRL0_QOS0_SENSITIVE (DMAC_PRICTRL0_QOS0_SENSITIVE_Val << DMAC_PRICTRL0_QOS0_Pos) +#define DMAC_PRICTRL0_QOS0_CRITICAL (DMAC_PRICTRL0_QOS0_CRITICAL_Val << DMAC_PRICTRL0_QOS0_Pos) +#define DMAC_PRICTRL0_RRLVLEN0_Pos 7 /**< \brief (DMAC_PRICTRL0) Level 0 Round-Robin Scheduling Enable */ +#define DMAC_PRICTRL0_RRLVLEN0 (_U_(0x1) << DMAC_PRICTRL0_RRLVLEN0_Pos) +#define DMAC_PRICTRL0_LVLPRI1_Pos 8 /**< \brief (DMAC_PRICTRL0) Level 1 Channel Priority Number */ +#define DMAC_PRICTRL0_LVLPRI1_Msk (_U_(0x1F) << DMAC_PRICTRL0_LVLPRI1_Pos) +#define DMAC_PRICTRL0_LVLPRI1(value) (DMAC_PRICTRL0_LVLPRI1_Msk & ((value) << DMAC_PRICTRL0_LVLPRI1_Pos)) +#define DMAC_PRICTRL0_QOS1_Pos 13 /**< \brief (DMAC_PRICTRL0) Level 1 Quality of Service */ +#define DMAC_PRICTRL0_QOS1_Msk (_U_(0x3) << DMAC_PRICTRL0_QOS1_Pos) +#define DMAC_PRICTRL0_QOS1(value) (DMAC_PRICTRL0_QOS1_Msk & ((value) << DMAC_PRICTRL0_QOS1_Pos)) +#define DMAC_PRICTRL0_QOS1_REGULAR_Val _U_(0x0) /**< \brief (DMAC_PRICTRL0) Regular delivery */ +#define DMAC_PRICTRL0_QOS1_SHORTAGE_Val _U_(0x1) /**< \brief (DMAC_PRICTRL0) Bandwidth shortage */ +#define DMAC_PRICTRL0_QOS1_SENSITIVE_Val _U_(0x2) /**< \brief (DMAC_PRICTRL0) Latency sensitive */ +#define DMAC_PRICTRL0_QOS1_CRITICAL_Val _U_(0x3) /**< \brief (DMAC_PRICTRL0) Latency critical */ +#define DMAC_PRICTRL0_QOS1_REGULAR (DMAC_PRICTRL0_QOS1_REGULAR_Val << DMAC_PRICTRL0_QOS1_Pos) +#define DMAC_PRICTRL0_QOS1_SHORTAGE (DMAC_PRICTRL0_QOS1_SHORTAGE_Val << DMAC_PRICTRL0_QOS1_Pos) +#define DMAC_PRICTRL0_QOS1_SENSITIVE (DMAC_PRICTRL0_QOS1_SENSITIVE_Val << DMAC_PRICTRL0_QOS1_Pos) +#define DMAC_PRICTRL0_QOS1_CRITICAL (DMAC_PRICTRL0_QOS1_CRITICAL_Val << DMAC_PRICTRL0_QOS1_Pos) +#define DMAC_PRICTRL0_RRLVLEN1_Pos 15 /**< \brief (DMAC_PRICTRL0) Level 1 Round-Robin Scheduling Enable */ +#define DMAC_PRICTRL0_RRLVLEN1 (_U_(0x1) << DMAC_PRICTRL0_RRLVLEN1_Pos) +#define DMAC_PRICTRL0_LVLPRI2_Pos 16 /**< \brief (DMAC_PRICTRL0) Level 2 Channel Priority Number */ +#define DMAC_PRICTRL0_LVLPRI2_Msk (_U_(0x1F) << DMAC_PRICTRL0_LVLPRI2_Pos) +#define DMAC_PRICTRL0_LVLPRI2(value) (DMAC_PRICTRL0_LVLPRI2_Msk & ((value) << DMAC_PRICTRL0_LVLPRI2_Pos)) +#define DMAC_PRICTRL0_QOS2_Pos 21 /**< \brief (DMAC_PRICTRL0) Level 2 Quality of Service */ +#define DMAC_PRICTRL0_QOS2_Msk (_U_(0x3) << DMAC_PRICTRL0_QOS2_Pos) +#define DMAC_PRICTRL0_QOS2(value) (DMAC_PRICTRL0_QOS2_Msk & ((value) << DMAC_PRICTRL0_QOS2_Pos)) +#define DMAC_PRICTRL0_QOS2_REGULAR_Val _U_(0x0) /**< \brief (DMAC_PRICTRL0) Regular delivery */ +#define DMAC_PRICTRL0_QOS2_SHORTAGE_Val _U_(0x1) /**< \brief (DMAC_PRICTRL0) Bandwidth shortage */ +#define DMAC_PRICTRL0_QOS2_SENSITIVE_Val _U_(0x2) /**< \brief (DMAC_PRICTRL0) Latency sensitive */ +#define DMAC_PRICTRL0_QOS2_CRITICAL_Val _U_(0x3) /**< \brief (DMAC_PRICTRL0) Latency critical */ +#define DMAC_PRICTRL0_QOS2_REGULAR (DMAC_PRICTRL0_QOS2_REGULAR_Val << DMAC_PRICTRL0_QOS2_Pos) +#define DMAC_PRICTRL0_QOS2_SHORTAGE (DMAC_PRICTRL0_QOS2_SHORTAGE_Val << DMAC_PRICTRL0_QOS2_Pos) +#define DMAC_PRICTRL0_QOS2_SENSITIVE (DMAC_PRICTRL0_QOS2_SENSITIVE_Val << DMAC_PRICTRL0_QOS2_Pos) +#define DMAC_PRICTRL0_QOS2_CRITICAL (DMAC_PRICTRL0_QOS2_CRITICAL_Val << DMAC_PRICTRL0_QOS2_Pos) +#define DMAC_PRICTRL0_RRLVLEN2_Pos 23 /**< \brief (DMAC_PRICTRL0) Level 2 Round-Robin Scheduling Enable */ +#define DMAC_PRICTRL0_RRLVLEN2 (_U_(0x1) << DMAC_PRICTRL0_RRLVLEN2_Pos) +#define DMAC_PRICTRL0_LVLPRI3_Pos 24 /**< \brief (DMAC_PRICTRL0) Level 3 Channel Priority Number */ +#define DMAC_PRICTRL0_LVLPRI3_Msk (_U_(0x1F) << DMAC_PRICTRL0_LVLPRI3_Pos) +#define DMAC_PRICTRL0_LVLPRI3(value) (DMAC_PRICTRL0_LVLPRI3_Msk & ((value) << DMAC_PRICTRL0_LVLPRI3_Pos)) +#define DMAC_PRICTRL0_QOS3_Pos 29 /**< \brief (DMAC_PRICTRL0) Level 3 Quality of Service */ +#define DMAC_PRICTRL0_QOS3_Msk (_U_(0x3) << DMAC_PRICTRL0_QOS3_Pos) +#define DMAC_PRICTRL0_QOS3(value) (DMAC_PRICTRL0_QOS3_Msk & ((value) << DMAC_PRICTRL0_QOS3_Pos)) +#define DMAC_PRICTRL0_QOS3_REGULAR_Val _U_(0x0) /**< \brief (DMAC_PRICTRL0) Regular delivery */ +#define DMAC_PRICTRL0_QOS3_SHORTAGE_Val _U_(0x1) /**< \brief (DMAC_PRICTRL0) Bandwidth shortage */ +#define DMAC_PRICTRL0_QOS3_SENSITIVE_Val _U_(0x2) /**< \brief (DMAC_PRICTRL0) Latency sensitive */ +#define DMAC_PRICTRL0_QOS3_CRITICAL_Val _U_(0x3) /**< \brief (DMAC_PRICTRL0) Latency critical */ +#define DMAC_PRICTRL0_QOS3_REGULAR (DMAC_PRICTRL0_QOS3_REGULAR_Val << DMAC_PRICTRL0_QOS3_Pos) +#define DMAC_PRICTRL0_QOS3_SHORTAGE (DMAC_PRICTRL0_QOS3_SHORTAGE_Val << DMAC_PRICTRL0_QOS3_Pos) +#define DMAC_PRICTRL0_QOS3_SENSITIVE (DMAC_PRICTRL0_QOS3_SENSITIVE_Val << DMAC_PRICTRL0_QOS3_Pos) +#define DMAC_PRICTRL0_QOS3_CRITICAL (DMAC_PRICTRL0_QOS3_CRITICAL_Val << DMAC_PRICTRL0_QOS3_Pos) +#define DMAC_PRICTRL0_RRLVLEN3_Pos 31 /**< \brief (DMAC_PRICTRL0) Level 3 Round-Robin Scheduling Enable */ +#define DMAC_PRICTRL0_RRLVLEN3 (_U_(0x1) << DMAC_PRICTRL0_RRLVLEN3_Pos) +#define DMAC_PRICTRL0_MASK _U_(0xFFFFFFFF) /**< \brief (DMAC_PRICTRL0) MASK Register */ + +/* -------- DMAC_INTPEND : (DMAC Offset: 0x20) (R/W 16) Interrupt Pending -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint16_t ID:5; /*!< bit: 0.. 4 Channel ID */ + uint16_t :3; /*!< bit: 5.. 7 Reserved */ + uint16_t TERR:1; /*!< bit: 8 Transfer Error */ + uint16_t TCMPL:1; /*!< bit: 9 Transfer Complete */ + uint16_t SUSP:1; /*!< bit: 10 Channel Suspend */ + uint16_t :1; /*!< bit: 11 Reserved */ + uint16_t CRCERR:1; /*!< bit: 12 CRC Error */ + uint16_t FERR:1; /*!< bit: 13 Fetch Error */ + uint16_t BUSY:1; /*!< bit: 14 Busy */ + uint16_t PEND:1; /*!< bit: 15 Pending */ + } bit; /*!< Structure used for bit access */ + uint16_t reg; /*!< Type used for register access */ +} DMAC_INTPEND_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define DMAC_INTPEND_OFFSET 0x20 /**< \brief (DMAC_INTPEND offset) Interrupt Pending */ +#define DMAC_INTPEND_RESETVALUE _U_(0x0000) /**< \brief (DMAC_INTPEND reset_value) Interrupt Pending */ + +#define DMAC_INTPEND_ID_Pos 0 /**< \brief (DMAC_INTPEND) Channel ID */ +#define DMAC_INTPEND_ID_Msk (_U_(0x1F) << DMAC_INTPEND_ID_Pos) +#define DMAC_INTPEND_ID(value) (DMAC_INTPEND_ID_Msk & ((value) << DMAC_INTPEND_ID_Pos)) +#define DMAC_INTPEND_TERR_Pos 8 /**< \brief (DMAC_INTPEND) Transfer Error */ +#define DMAC_INTPEND_TERR (_U_(0x1) << DMAC_INTPEND_TERR_Pos) +#define DMAC_INTPEND_TCMPL_Pos 9 /**< \brief (DMAC_INTPEND) Transfer Complete */ +#define DMAC_INTPEND_TCMPL (_U_(0x1) << DMAC_INTPEND_TCMPL_Pos) +#define DMAC_INTPEND_SUSP_Pos 10 /**< \brief (DMAC_INTPEND) Channel Suspend */ +#define DMAC_INTPEND_SUSP (_U_(0x1) << DMAC_INTPEND_SUSP_Pos) +#define DMAC_INTPEND_CRCERR_Pos 12 /**< \brief (DMAC_INTPEND) CRC Error */ +#define DMAC_INTPEND_CRCERR (_U_(0x1) << DMAC_INTPEND_CRCERR_Pos) +#define DMAC_INTPEND_FERR_Pos 13 /**< \brief (DMAC_INTPEND) Fetch Error */ +#define DMAC_INTPEND_FERR (_U_(0x1) << DMAC_INTPEND_FERR_Pos) +#define DMAC_INTPEND_BUSY_Pos 14 /**< \brief (DMAC_INTPEND) Busy */ +#define DMAC_INTPEND_BUSY (_U_(0x1) << DMAC_INTPEND_BUSY_Pos) +#define DMAC_INTPEND_PEND_Pos 15 /**< \brief (DMAC_INTPEND) Pending */ +#define DMAC_INTPEND_PEND (_U_(0x1) << DMAC_INTPEND_PEND_Pos) +#define DMAC_INTPEND_MASK _U_(0xF71F) /**< \brief (DMAC_INTPEND) MASK Register */ + +/* -------- DMAC_INTSTATUS : (DMAC Offset: 0x24) (R/ 32) Interrupt Status -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t CHINT0:1; /*!< bit: 0 Channel 0 Pending Interrupt */ + uint32_t CHINT1:1; /*!< bit: 1 Channel 1 Pending Interrupt */ + uint32_t CHINT2:1; /*!< bit: 2 Channel 2 Pending Interrupt */ + uint32_t CHINT3:1; /*!< bit: 3 Channel 3 Pending Interrupt */ + uint32_t CHINT4:1; /*!< bit: 4 Channel 4 Pending Interrupt */ + uint32_t CHINT5:1; /*!< bit: 5 Channel 5 Pending Interrupt */ + uint32_t CHINT6:1; /*!< bit: 6 Channel 6 Pending Interrupt */ + uint32_t CHINT7:1; /*!< bit: 7 Channel 7 Pending Interrupt */ + uint32_t CHINT8:1; /*!< bit: 8 Channel 8 Pending Interrupt */ + uint32_t CHINT9:1; /*!< bit: 9 Channel 9 Pending Interrupt */ + uint32_t CHINT10:1; /*!< bit: 10 Channel 10 Pending Interrupt */ + uint32_t CHINT11:1; /*!< bit: 11 Channel 11 Pending Interrupt */ + uint32_t CHINT12:1; /*!< bit: 12 Channel 12 Pending Interrupt */ + uint32_t CHINT13:1; /*!< bit: 13 Channel 13 Pending Interrupt */ + uint32_t CHINT14:1; /*!< bit: 14 Channel 14 Pending Interrupt */ + uint32_t CHINT15:1; /*!< bit: 15 Channel 15 Pending Interrupt */ + uint32_t CHINT16:1; /*!< bit: 16 Channel 16 Pending Interrupt */ + uint32_t CHINT17:1; /*!< bit: 17 Channel 17 Pending Interrupt */ + uint32_t CHINT18:1; /*!< bit: 18 Channel 18 Pending Interrupt */ + uint32_t CHINT19:1; /*!< bit: 19 Channel 19 Pending Interrupt */ + uint32_t CHINT20:1; /*!< bit: 20 Channel 20 Pending Interrupt */ + uint32_t CHINT21:1; /*!< bit: 21 Channel 21 Pending Interrupt */ + uint32_t CHINT22:1; /*!< bit: 22 Channel 22 Pending Interrupt */ + uint32_t CHINT23:1; /*!< bit: 23 Channel 23 Pending Interrupt */ + uint32_t CHINT24:1; /*!< bit: 24 Channel 24 Pending Interrupt */ + uint32_t CHINT25:1; /*!< bit: 25 Channel 25 Pending Interrupt */ + uint32_t CHINT26:1; /*!< bit: 26 Channel 26 Pending Interrupt */ + uint32_t CHINT27:1; /*!< bit: 27 Channel 27 Pending Interrupt */ + uint32_t CHINT28:1; /*!< bit: 28 Channel 28 Pending Interrupt */ + uint32_t CHINT29:1; /*!< bit: 29 Channel 29 Pending Interrupt */ + uint32_t CHINT30:1; /*!< bit: 30 Channel 30 Pending Interrupt */ + uint32_t CHINT31:1; /*!< bit: 31 Channel 31 Pending Interrupt */ + } bit; /*!< Structure used for bit access */ + struct { + uint32_t CHINT:32; /*!< bit: 0..31 Channel x Pending Interrupt */ + } vec; /*!< Structure used for vec access */ + uint32_t reg; /*!< Type used for register access */ +} DMAC_INTSTATUS_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define DMAC_INTSTATUS_OFFSET 0x24 /**< \brief (DMAC_INTSTATUS offset) Interrupt Status */ +#define DMAC_INTSTATUS_RESETVALUE _U_(0x00000000) /**< \brief (DMAC_INTSTATUS reset_value) Interrupt Status */ + +#define DMAC_INTSTATUS_CHINT0_Pos 0 /**< \brief (DMAC_INTSTATUS) Channel 0 Pending Interrupt */ +#define DMAC_INTSTATUS_CHINT0 (_U_(1) << DMAC_INTSTATUS_CHINT0_Pos) +#define DMAC_INTSTATUS_CHINT1_Pos 1 /**< \brief (DMAC_INTSTATUS) Channel 1 Pending Interrupt */ +#define DMAC_INTSTATUS_CHINT1 (_U_(1) << DMAC_INTSTATUS_CHINT1_Pos) +#define DMAC_INTSTATUS_CHINT2_Pos 2 /**< \brief (DMAC_INTSTATUS) Channel 2 Pending Interrupt */ +#define DMAC_INTSTATUS_CHINT2 (_U_(1) << DMAC_INTSTATUS_CHINT2_Pos) +#define DMAC_INTSTATUS_CHINT3_Pos 3 /**< \brief (DMAC_INTSTATUS) Channel 3 Pending Interrupt */ +#define DMAC_INTSTATUS_CHINT3 (_U_(1) << DMAC_INTSTATUS_CHINT3_Pos) +#define DMAC_INTSTATUS_CHINT4_Pos 4 /**< \brief (DMAC_INTSTATUS) Channel 4 Pending Interrupt */ +#define DMAC_INTSTATUS_CHINT4 (_U_(1) << DMAC_INTSTATUS_CHINT4_Pos) +#define DMAC_INTSTATUS_CHINT5_Pos 5 /**< \brief (DMAC_INTSTATUS) Channel 5 Pending Interrupt */ +#define DMAC_INTSTATUS_CHINT5 (_U_(1) << DMAC_INTSTATUS_CHINT5_Pos) +#define DMAC_INTSTATUS_CHINT6_Pos 6 /**< \brief (DMAC_INTSTATUS) Channel 6 Pending Interrupt */ +#define DMAC_INTSTATUS_CHINT6 (_U_(1) << DMAC_INTSTATUS_CHINT6_Pos) +#define DMAC_INTSTATUS_CHINT7_Pos 7 /**< \brief (DMAC_INTSTATUS) Channel 7 Pending Interrupt */ +#define DMAC_INTSTATUS_CHINT7 (_U_(1) << DMAC_INTSTATUS_CHINT7_Pos) +#define DMAC_INTSTATUS_CHINT8_Pos 8 /**< \brief (DMAC_INTSTATUS) Channel 8 Pending Interrupt */ +#define DMAC_INTSTATUS_CHINT8 (_U_(1) << DMAC_INTSTATUS_CHINT8_Pos) +#define DMAC_INTSTATUS_CHINT9_Pos 9 /**< \brief (DMAC_INTSTATUS) Channel 9 Pending Interrupt */ +#define DMAC_INTSTATUS_CHINT9 (_U_(1) << DMAC_INTSTATUS_CHINT9_Pos) +#define DMAC_INTSTATUS_CHINT10_Pos 10 /**< \brief (DMAC_INTSTATUS) Channel 10 Pending Interrupt */ +#define DMAC_INTSTATUS_CHINT10 (_U_(1) << DMAC_INTSTATUS_CHINT10_Pos) +#define DMAC_INTSTATUS_CHINT11_Pos 11 /**< \brief (DMAC_INTSTATUS) Channel 11 Pending Interrupt */ +#define DMAC_INTSTATUS_CHINT11 (_U_(1) << DMAC_INTSTATUS_CHINT11_Pos) +#define DMAC_INTSTATUS_CHINT12_Pos 12 /**< \brief (DMAC_INTSTATUS) Channel 12 Pending Interrupt */ +#define DMAC_INTSTATUS_CHINT12 (_U_(1) << DMAC_INTSTATUS_CHINT12_Pos) +#define DMAC_INTSTATUS_CHINT13_Pos 13 /**< \brief (DMAC_INTSTATUS) Channel 13 Pending Interrupt */ +#define DMAC_INTSTATUS_CHINT13 (_U_(1) << DMAC_INTSTATUS_CHINT13_Pos) +#define DMAC_INTSTATUS_CHINT14_Pos 14 /**< \brief (DMAC_INTSTATUS) Channel 14 Pending Interrupt */ +#define DMAC_INTSTATUS_CHINT14 (_U_(1) << DMAC_INTSTATUS_CHINT14_Pos) +#define DMAC_INTSTATUS_CHINT15_Pos 15 /**< \brief (DMAC_INTSTATUS) Channel 15 Pending Interrupt */ +#define DMAC_INTSTATUS_CHINT15 (_U_(1) << DMAC_INTSTATUS_CHINT15_Pos) +#define DMAC_INTSTATUS_CHINT16_Pos 16 /**< \brief (DMAC_INTSTATUS) Channel 16 Pending Interrupt */ +#define DMAC_INTSTATUS_CHINT16 (_U_(1) << DMAC_INTSTATUS_CHINT16_Pos) +#define DMAC_INTSTATUS_CHINT17_Pos 17 /**< \brief (DMAC_INTSTATUS) Channel 17 Pending Interrupt */ +#define DMAC_INTSTATUS_CHINT17 (_U_(1) << DMAC_INTSTATUS_CHINT17_Pos) +#define DMAC_INTSTATUS_CHINT18_Pos 18 /**< \brief (DMAC_INTSTATUS) Channel 18 Pending Interrupt */ +#define DMAC_INTSTATUS_CHINT18 (_U_(1) << DMAC_INTSTATUS_CHINT18_Pos) +#define DMAC_INTSTATUS_CHINT19_Pos 19 /**< \brief (DMAC_INTSTATUS) Channel 19 Pending Interrupt */ +#define DMAC_INTSTATUS_CHINT19 (_U_(1) << DMAC_INTSTATUS_CHINT19_Pos) +#define DMAC_INTSTATUS_CHINT20_Pos 20 /**< \brief (DMAC_INTSTATUS) Channel 20 Pending Interrupt */ +#define DMAC_INTSTATUS_CHINT20 (_U_(1) << DMAC_INTSTATUS_CHINT20_Pos) +#define DMAC_INTSTATUS_CHINT21_Pos 21 /**< \brief (DMAC_INTSTATUS) Channel 21 Pending Interrupt */ +#define DMAC_INTSTATUS_CHINT21 (_U_(1) << DMAC_INTSTATUS_CHINT21_Pos) +#define DMAC_INTSTATUS_CHINT22_Pos 22 /**< \brief (DMAC_INTSTATUS) Channel 22 Pending Interrupt */ +#define DMAC_INTSTATUS_CHINT22 (_U_(1) << DMAC_INTSTATUS_CHINT22_Pos) +#define DMAC_INTSTATUS_CHINT23_Pos 23 /**< \brief (DMAC_INTSTATUS) Channel 23 Pending Interrupt */ +#define DMAC_INTSTATUS_CHINT23 (_U_(1) << DMAC_INTSTATUS_CHINT23_Pos) +#define DMAC_INTSTATUS_CHINT24_Pos 24 /**< \brief (DMAC_INTSTATUS) Channel 24 Pending Interrupt */ +#define DMAC_INTSTATUS_CHINT24 (_U_(1) << DMAC_INTSTATUS_CHINT24_Pos) +#define DMAC_INTSTATUS_CHINT25_Pos 25 /**< \brief (DMAC_INTSTATUS) Channel 25 Pending Interrupt */ +#define DMAC_INTSTATUS_CHINT25 (_U_(1) << DMAC_INTSTATUS_CHINT25_Pos) +#define DMAC_INTSTATUS_CHINT26_Pos 26 /**< \brief (DMAC_INTSTATUS) Channel 26 Pending Interrupt */ +#define DMAC_INTSTATUS_CHINT26 (_U_(1) << DMAC_INTSTATUS_CHINT26_Pos) +#define DMAC_INTSTATUS_CHINT27_Pos 27 /**< \brief (DMAC_INTSTATUS) Channel 27 Pending Interrupt */ +#define DMAC_INTSTATUS_CHINT27 (_U_(1) << DMAC_INTSTATUS_CHINT27_Pos) +#define DMAC_INTSTATUS_CHINT28_Pos 28 /**< \brief (DMAC_INTSTATUS) Channel 28 Pending Interrupt */ +#define DMAC_INTSTATUS_CHINT28 (_U_(1) << DMAC_INTSTATUS_CHINT28_Pos) +#define DMAC_INTSTATUS_CHINT29_Pos 29 /**< \brief (DMAC_INTSTATUS) Channel 29 Pending Interrupt */ +#define DMAC_INTSTATUS_CHINT29 (_U_(1) << DMAC_INTSTATUS_CHINT29_Pos) +#define DMAC_INTSTATUS_CHINT30_Pos 30 /**< \brief (DMAC_INTSTATUS) Channel 30 Pending Interrupt */ +#define DMAC_INTSTATUS_CHINT30 (_U_(1) << DMAC_INTSTATUS_CHINT30_Pos) +#define DMAC_INTSTATUS_CHINT31_Pos 31 /**< \brief (DMAC_INTSTATUS) Channel 31 Pending Interrupt */ +#define DMAC_INTSTATUS_CHINT31 (_U_(1) << DMAC_INTSTATUS_CHINT31_Pos) +#define DMAC_INTSTATUS_CHINT_Pos 0 /**< \brief (DMAC_INTSTATUS) Channel x Pending Interrupt */ +#define DMAC_INTSTATUS_CHINT_Msk (_U_(0xFFFFFFFF) << DMAC_INTSTATUS_CHINT_Pos) +#define DMAC_INTSTATUS_CHINT(value) (DMAC_INTSTATUS_CHINT_Msk & ((value) << DMAC_INTSTATUS_CHINT_Pos)) +#define DMAC_INTSTATUS_MASK _U_(0xFFFFFFFF) /**< \brief (DMAC_INTSTATUS) MASK Register */ + +/* -------- DMAC_BUSYCH : (DMAC Offset: 0x28) (R/ 32) Busy Channels -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t BUSYCH0:1; /*!< bit: 0 Busy Channel 0 */ + uint32_t BUSYCH1:1; /*!< bit: 1 Busy Channel 1 */ + uint32_t BUSYCH2:1; /*!< bit: 2 Busy Channel 2 */ + uint32_t BUSYCH3:1; /*!< bit: 3 Busy Channel 3 */ + uint32_t BUSYCH4:1; /*!< bit: 4 Busy Channel 4 */ + uint32_t BUSYCH5:1; /*!< bit: 5 Busy Channel 5 */ + uint32_t BUSYCH6:1; /*!< bit: 6 Busy Channel 6 */ + uint32_t BUSYCH7:1; /*!< bit: 7 Busy Channel 7 */ + uint32_t BUSYCH8:1; /*!< bit: 8 Busy Channel 8 */ + uint32_t BUSYCH9:1; /*!< bit: 9 Busy Channel 9 */ + uint32_t BUSYCH10:1; /*!< bit: 10 Busy Channel 10 */ + uint32_t BUSYCH11:1; /*!< bit: 11 Busy Channel 11 */ + uint32_t BUSYCH12:1; /*!< bit: 12 Busy Channel 12 */ + uint32_t BUSYCH13:1; /*!< bit: 13 Busy Channel 13 */ + uint32_t BUSYCH14:1; /*!< bit: 14 Busy Channel 14 */ + uint32_t BUSYCH15:1; /*!< bit: 15 Busy Channel 15 */ + uint32_t BUSYCH16:1; /*!< bit: 16 Busy Channel 16 */ + uint32_t BUSYCH17:1; /*!< bit: 17 Busy Channel 17 */ + uint32_t BUSYCH18:1; /*!< bit: 18 Busy Channel 18 */ + uint32_t BUSYCH19:1; /*!< bit: 19 Busy Channel 19 */ + uint32_t BUSYCH20:1; /*!< bit: 20 Busy Channel 20 */ + uint32_t BUSYCH21:1; /*!< bit: 21 Busy Channel 21 */ + uint32_t BUSYCH22:1; /*!< bit: 22 Busy Channel 22 */ + uint32_t BUSYCH23:1; /*!< bit: 23 Busy Channel 23 */ + uint32_t BUSYCH24:1; /*!< bit: 24 Busy Channel 24 */ + uint32_t BUSYCH25:1; /*!< bit: 25 Busy Channel 25 */ + uint32_t BUSYCH26:1; /*!< bit: 26 Busy Channel 26 */ + uint32_t BUSYCH27:1; /*!< bit: 27 Busy Channel 27 */ + uint32_t BUSYCH28:1; /*!< bit: 28 Busy Channel 28 */ + uint32_t BUSYCH29:1; /*!< bit: 29 Busy Channel 29 */ + uint32_t BUSYCH30:1; /*!< bit: 30 Busy Channel 30 */ + uint32_t BUSYCH31:1; /*!< bit: 31 Busy Channel 31 */ + } bit; /*!< Structure used for bit access */ + struct { + uint32_t BUSYCH:32; /*!< bit: 0..31 Busy Channel x */ + } vec; /*!< Structure used for vec access */ + uint32_t reg; /*!< Type used for register access */ +} DMAC_BUSYCH_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define DMAC_BUSYCH_OFFSET 0x28 /**< \brief (DMAC_BUSYCH offset) Busy Channels */ +#define DMAC_BUSYCH_RESETVALUE _U_(0x00000000) /**< \brief (DMAC_BUSYCH reset_value) Busy Channels */ + +#define DMAC_BUSYCH_BUSYCH0_Pos 0 /**< \brief (DMAC_BUSYCH) Busy Channel 0 */ +#define DMAC_BUSYCH_BUSYCH0 (_U_(1) << DMAC_BUSYCH_BUSYCH0_Pos) +#define DMAC_BUSYCH_BUSYCH1_Pos 1 /**< \brief (DMAC_BUSYCH) Busy Channel 1 */ +#define DMAC_BUSYCH_BUSYCH1 (_U_(1) << DMAC_BUSYCH_BUSYCH1_Pos) +#define DMAC_BUSYCH_BUSYCH2_Pos 2 /**< \brief (DMAC_BUSYCH) Busy Channel 2 */ +#define DMAC_BUSYCH_BUSYCH2 (_U_(1) << DMAC_BUSYCH_BUSYCH2_Pos) +#define DMAC_BUSYCH_BUSYCH3_Pos 3 /**< \brief (DMAC_BUSYCH) Busy Channel 3 */ +#define DMAC_BUSYCH_BUSYCH3 (_U_(1) << DMAC_BUSYCH_BUSYCH3_Pos) +#define DMAC_BUSYCH_BUSYCH4_Pos 4 /**< \brief (DMAC_BUSYCH) Busy Channel 4 */ +#define DMAC_BUSYCH_BUSYCH4 (_U_(1) << DMAC_BUSYCH_BUSYCH4_Pos) +#define DMAC_BUSYCH_BUSYCH5_Pos 5 /**< \brief (DMAC_BUSYCH) Busy Channel 5 */ +#define DMAC_BUSYCH_BUSYCH5 (_U_(1) << DMAC_BUSYCH_BUSYCH5_Pos) +#define DMAC_BUSYCH_BUSYCH6_Pos 6 /**< \brief (DMAC_BUSYCH) Busy Channel 6 */ +#define DMAC_BUSYCH_BUSYCH6 (_U_(1) << DMAC_BUSYCH_BUSYCH6_Pos) +#define DMAC_BUSYCH_BUSYCH7_Pos 7 /**< \brief (DMAC_BUSYCH) Busy Channel 7 */ +#define DMAC_BUSYCH_BUSYCH7 (_U_(1) << DMAC_BUSYCH_BUSYCH7_Pos) +#define DMAC_BUSYCH_BUSYCH8_Pos 8 /**< \brief (DMAC_BUSYCH) Busy Channel 8 */ +#define DMAC_BUSYCH_BUSYCH8 (_U_(1) << DMAC_BUSYCH_BUSYCH8_Pos) +#define DMAC_BUSYCH_BUSYCH9_Pos 9 /**< \brief (DMAC_BUSYCH) Busy Channel 9 */ +#define DMAC_BUSYCH_BUSYCH9 (_U_(1) << DMAC_BUSYCH_BUSYCH9_Pos) +#define DMAC_BUSYCH_BUSYCH10_Pos 10 /**< \brief (DMAC_BUSYCH) Busy Channel 10 */ +#define DMAC_BUSYCH_BUSYCH10 (_U_(1) << DMAC_BUSYCH_BUSYCH10_Pos) +#define DMAC_BUSYCH_BUSYCH11_Pos 11 /**< \brief (DMAC_BUSYCH) Busy Channel 11 */ +#define DMAC_BUSYCH_BUSYCH11 (_U_(1) << DMAC_BUSYCH_BUSYCH11_Pos) +#define DMAC_BUSYCH_BUSYCH12_Pos 12 /**< \brief (DMAC_BUSYCH) Busy Channel 12 */ +#define DMAC_BUSYCH_BUSYCH12 (_U_(1) << DMAC_BUSYCH_BUSYCH12_Pos) +#define DMAC_BUSYCH_BUSYCH13_Pos 13 /**< \brief (DMAC_BUSYCH) Busy Channel 13 */ +#define DMAC_BUSYCH_BUSYCH13 (_U_(1) << DMAC_BUSYCH_BUSYCH13_Pos) +#define DMAC_BUSYCH_BUSYCH14_Pos 14 /**< \brief (DMAC_BUSYCH) Busy Channel 14 */ +#define DMAC_BUSYCH_BUSYCH14 (_U_(1) << DMAC_BUSYCH_BUSYCH14_Pos) +#define DMAC_BUSYCH_BUSYCH15_Pos 15 /**< \brief (DMAC_BUSYCH) Busy Channel 15 */ +#define DMAC_BUSYCH_BUSYCH15 (_U_(1) << DMAC_BUSYCH_BUSYCH15_Pos) +#define DMAC_BUSYCH_BUSYCH16_Pos 16 /**< \brief (DMAC_BUSYCH) Busy Channel 16 */ +#define DMAC_BUSYCH_BUSYCH16 (_U_(1) << DMAC_BUSYCH_BUSYCH16_Pos) +#define DMAC_BUSYCH_BUSYCH17_Pos 17 /**< \brief (DMAC_BUSYCH) Busy Channel 17 */ +#define DMAC_BUSYCH_BUSYCH17 (_U_(1) << DMAC_BUSYCH_BUSYCH17_Pos) +#define DMAC_BUSYCH_BUSYCH18_Pos 18 /**< \brief (DMAC_BUSYCH) Busy Channel 18 */ +#define DMAC_BUSYCH_BUSYCH18 (_U_(1) << DMAC_BUSYCH_BUSYCH18_Pos) +#define DMAC_BUSYCH_BUSYCH19_Pos 19 /**< \brief (DMAC_BUSYCH) Busy Channel 19 */ +#define DMAC_BUSYCH_BUSYCH19 (_U_(1) << DMAC_BUSYCH_BUSYCH19_Pos) +#define DMAC_BUSYCH_BUSYCH20_Pos 20 /**< \brief (DMAC_BUSYCH) Busy Channel 20 */ +#define DMAC_BUSYCH_BUSYCH20 (_U_(1) << DMAC_BUSYCH_BUSYCH20_Pos) +#define DMAC_BUSYCH_BUSYCH21_Pos 21 /**< \brief (DMAC_BUSYCH) Busy Channel 21 */ +#define DMAC_BUSYCH_BUSYCH21 (_U_(1) << DMAC_BUSYCH_BUSYCH21_Pos) +#define DMAC_BUSYCH_BUSYCH22_Pos 22 /**< \brief (DMAC_BUSYCH) Busy Channel 22 */ +#define DMAC_BUSYCH_BUSYCH22 (_U_(1) << DMAC_BUSYCH_BUSYCH22_Pos) +#define DMAC_BUSYCH_BUSYCH23_Pos 23 /**< \brief (DMAC_BUSYCH) Busy Channel 23 */ +#define DMAC_BUSYCH_BUSYCH23 (_U_(1) << DMAC_BUSYCH_BUSYCH23_Pos) +#define DMAC_BUSYCH_BUSYCH24_Pos 24 /**< \brief (DMAC_BUSYCH) Busy Channel 24 */ +#define DMAC_BUSYCH_BUSYCH24 (_U_(1) << DMAC_BUSYCH_BUSYCH24_Pos) +#define DMAC_BUSYCH_BUSYCH25_Pos 25 /**< \brief (DMAC_BUSYCH) Busy Channel 25 */ +#define DMAC_BUSYCH_BUSYCH25 (_U_(1) << DMAC_BUSYCH_BUSYCH25_Pos) +#define DMAC_BUSYCH_BUSYCH26_Pos 26 /**< \brief (DMAC_BUSYCH) Busy Channel 26 */ +#define DMAC_BUSYCH_BUSYCH26 (_U_(1) << DMAC_BUSYCH_BUSYCH26_Pos) +#define DMAC_BUSYCH_BUSYCH27_Pos 27 /**< \brief (DMAC_BUSYCH) Busy Channel 27 */ +#define DMAC_BUSYCH_BUSYCH27 (_U_(1) << DMAC_BUSYCH_BUSYCH27_Pos) +#define DMAC_BUSYCH_BUSYCH28_Pos 28 /**< \brief (DMAC_BUSYCH) Busy Channel 28 */ +#define DMAC_BUSYCH_BUSYCH28 (_U_(1) << DMAC_BUSYCH_BUSYCH28_Pos) +#define DMAC_BUSYCH_BUSYCH29_Pos 29 /**< \brief (DMAC_BUSYCH) Busy Channel 29 */ +#define DMAC_BUSYCH_BUSYCH29 (_U_(1) << DMAC_BUSYCH_BUSYCH29_Pos) +#define DMAC_BUSYCH_BUSYCH30_Pos 30 /**< \brief (DMAC_BUSYCH) Busy Channel 30 */ +#define DMAC_BUSYCH_BUSYCH30 (_U_(1) << DMAC_BUSYCH_BUSYCH30_Pos) +#define DMAC_BUSYCH_BUSYCH31_Pos 31 /**< \brief (DMAC_BUSYCH) Busy Channel 31 */ +#define DMAC_BUSYCH_BUSYCH31 (_U_(1) << DMAC_BUSYCH_BUSYCH31_Pos) +#define DMAC_BUSYCH_BUSYCH_Pos 0 /**< \brief (DMAC_BUSYCH) Busy Channel x */ +#define DMAC_BUSYCH_BUSYCH_Msk (_U_(0xFFFFFFFF) << DMAC_BUSYCH_BUSYCH_Pos) +#define DMAC_BUSYCH_BUSYCH(value) (DMAC_BUSYCH_BUSYCH_Msk & ((value) << DMAC_BUSYCH_BUSYCH_Pos)) +#define DMAC_BUSYCH_MASK _U_(0xFFFFFFFF) /**< \brief (DMAC_BUSYCH) MASK Register */ + +/* -------- DMAC_PENDCH : (DMAC Offset: 0x2C) (R/ 32) Pending Channels -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t PENDCH0:1; /*!< bit: 0 Pending Channel 0 */ + uint32_t PENDCH1:1; /*!< bit: 1 Pending Channel 1 */ + uint32_t PENDCH2:1; /*!< bit: 2 Pending Channel 2 */ + uint32_t PENDCH3:1; /*!< bit: 3 Pending Channel 3 */ + uint32_t PENDCH4:1; /*!< bit: 4 Pending Channel 4 */ + uint32_t PENDCH5:1; /*!< bit: 5 Pending Channel 5 */ + uint32_t PENDCH6:1; /*!< bit: 6 Pending Channel 6 */ + uint32_t PENDCH7:1; /*!< bit: 7 Pending Channel 7 */ + uint32_t PENDCH8:1; /*!< bit: 8 Pending Channel 8 */ + uint32_t PENDCH9:1; /*!< bit: 9 Pending Channel 9 */ + uint32_t PENDCH10:1; /*!< bit: 10 Pending Channel 10 */ + uint32_t PENDCH11:1; /*!< bit: 11 Pending Channel 11 */ + uint32_t PENDCH12:1; /*!< bit: 12 Pending Channel 12 */ + uint32_t PENDCH13:1; /*!< bit: 13 Pending Channel 13 */ + uint32_t PENDCH14:1; /*!< bit: 14 Pending Channel 14 */ + uint32_t PENDCH15:1; /*!< bit: 15 Pending Channel 15 */ + uint32_t PENDCH16:1; /*!< bit: 16 Pending Channel 16 */ + uint32_t PENDCH17:1; /*!< bit: 17 Pending Channel 17 */ + uint32_t PENDCH18:1; /*!< bit: 18 Pending Channel 18 */ + uint32_t PENDCH19:1; /*!< bit: 19 Pending Channel 19 */ + uint32_t PENDCH20:1; /*!< bit: 20 Pending Channel 20 */ + uint32_t PENDCH21:1; /*!< bit: 21 Pending Channel 21 */ + uint32_t PENDCH22:1; /*!< bit: 22 Pending Channel 22 */ + uint32_t PENDCH23:1; /*!< bit: 23 Pending Channel 23 */ + uint32_t PENDCH24:1; /*!< bit: 24 Pending Channel 24 */ + uint32_t PENDCH25:1; /*!< bit: 25 Pending Channel 25 */ + uint32_t PENDCH26:1; /*!< bit: 26 Pending Channel 26 */ + uint32_t PENDCH27:1; /*!< bit: 27 Pending Channel 27 */ + uint32_t PENDCH28:1; /*!< bit: 28 Pending Channel 28 */ + uint32_t PENDCH29:1; /*!< bit: 29 Pending Channel 29 */ + uint32_t PENDCH30:1; /*!< bit: 30 Pending Channel 30 */ + uint32_t PENDCH31:1; /*!< bit: 31 Pending Channel 31 */ + } bit; /*!< Structure used for bit access */ + struct { + uint32_t PENDCH:32; /*!< bit: 0..31 Pending Channel x */ + } vec; /*!< Structure used for vec access */ + uint32_t reg; /*!< Type used for register access */ +} DMAC_PENDCH_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define DMAC_PENDCH_OFFSET 0x2C /**< \brief (DMAC_PENDCH offset) Pending Channels */ +#define DMAC_PENDCH_RESETVALUE _U_(0x00000000) /**< \brief (DMAC_PENDCH reset_value) Pending Channels */ + +#define DMAC_PENDCH_PENDCH0_Pos 0 /**< \brief (DMAC_PENDCH) Pending Channel 0 */ +#define DMAC_PENDCH_PENDCH0 (_U_(1) << DMAC_PENDCH_PENDCH0_Pos) +#define DMAC_PENDCH_PENDCH1_Pos 1 /**< \brief (DMAC_PENDCH) Pending Channel 1 */ +#define DMAC_PENDCH_PENDCH1 (_U_(1) << DMAC_PENDCH_PENDCH1_Pos) +#define DMAC_PENDCH_PENDCH2_Pos 2 /**< \brief (DMAC_PENDCH) Pending Channel 2 */ +#define DMAC_PENDCH_PENDCH2 (_U_(1) << DMAC_PENDCH_PENDCH2_Pos) +#define DMAC_PENDCH_PENDCH3_Pos 3 /**< \brief (DMAC_PENDCH) Pending Channel 3 */ +#define DMAC_PENDCH_PENDCH3 (_U_(1) << DMAC_PENDCH_PENDCH3_Pos) +#define DMAC_PENDCH_PENDCH4_Pos 4 /**< \brief (DMAC_PENDCH) Pending Channel 4 */ +#define DMAC_PENDCH_PENDCH4 (_U_(1) << DMAC_PENDCH_PENDCH4_Pos) +#define DMAC_PENDCH_PENDCH5_Pos 5 /**< \brief (DMAC_PENDCH) Pending Channel 5 */ +#define DMAC_PENDCH_PENDCH5 (_U_(1) << DMAC_PENDCH_PENDCH5_Pos) +#define DMAC_PENDCH_PENDCH6_Pos 6 /**< \brief (DMAC_PENDCH) Pending Channel 6 */ +#define DMAC_PENDCH_PENDCH6 (_U_(1) << DMAC_PENDCH_PENDCH6_Pos) +#define DMAC_PENDCH_PENDCH7_Pos 7 /**< \brief (DMAC_PENDCH) Pending Channel 7 */ +#define DMAC_PENDCH_PENDCH7 (_U_(1) << DMAC_PENDCH_PENDCH7_Pos) +#define DMAC_PENDCH_PENDCH8_Pos 8 /**< \brief (DMAC_PENDCH) Pending Channel 8 */ +#define DMAC_PENDCH_PENDCH8 (_U_(1) << DMAC_PENDCH_PENDCH8_Pos) +#define DMAC_PENDCH_PENDCH9_Pos 9 /**< \brief (DMAC_PENDCH) Pending Channel 9 */ +#define DMAC_PENDCH_PENDCH9 (_U_(1) << DMAC_PENDCH_PENDCH9_Pos) +#define DMAC_PENDCH_PENDCH10_Pos 10 /**< \brief (DMAC_PENDCH) Pending Channel 10 */ +#define DMAC_PENDCH_PENDCH10 (_U_(1) << DMAC_PENDCH_PENDCH10_Pos) +#define DMAC_PENDCH_PENDCH11_Pos 11 /**< \brief (DMAC_PENDCH) Pending Channel 11 */ +#define DMAC_PENDCH_PENDCH11 (_U_(1) << DMAC_PENDCH_PENDCH11_Pos) +#define DMAC_PENDCH_PENDCH12_Pos 12 /**< \brief (DMAC_PENDCH) Pending Channel 12 */ +#define DMAC_PENDCH_PENDCH12 (_U_(1) << DMAC_PENDCH_PENDCH12_Pos) +#define DMAC_PENDCH_PENDCH13_Pos 13 /**< \brief (DMAC_PENDCH) Pending Channel 13 */ +#define DMAC_PENDCH_PENDCH13 (_U_(1) << DMAC_PENDCH_PENDCH13_Pos) +#define DMAC_PENDCH_PENDCH14_Pos 14 /**< \brief (DMAC_PENDCH) Pending Channel 14 */ +#define DMAC_PENDCH_PENDCH14 (_U_(1) << DMAC_PENDCH_PENDCH14_Pos) +#define DMAC_PENDCH_PENDCH15_Pos 15 /**< \brief (DMAC_PENDCH) Pending Channel 15 */ +#define DMAC_PENDCH_PENDCH15 (_U_(1) << DMAC_PENDCH_PENDCH15_Pos) +#define DMAC_PENDCH_PENDCH16_Pos 16 /**< \brief (DMAC_PENDCH) Pending Channel 16 */ +#define DMAC_PENDCH_PENDCH16 (_U_(1) << DMAC_PENDCH_PENDCH16_Pos) +#define DMAC_PENDCH_PENDCH17_Pos 17 /**< \brief (DMAC_PENDCH) Pending Channel 17 */ +#define DMAC_PENDCH_PENDCH17 (_U_(1) << DMAC_PENDCH_PENDCH17_Pos) +#define DMAC_PENDCH_PENDCH18_Pos 18 /**< \brief (DMAC_PENDCH) Pending Channel 18 */ +#define DMAC_PENDCH_PENDCH18 (_U_(1) << DMAC_PENDCH_PENDCH18_Pos) +#define DMAC_PENDCH_PENDCH19_Pos 19 /**< \brief (DMAC_PENDCH) Pending Channel 19 */ +#define DMAC_PENDCH_PENDCH19 (_U_(1) << DMAC_PENDCH_PENDCH19_Pos) +#define DMAC_PENDCH_PENDCH20_Pos 20 /**< \brief (DMAC_PENDCH) Pending Channel 20 */ +#define DMAC_PENDCH_PENDCH20 (_U_(1) << DMAC_PENDCH_PENDCH20_Pos) +#define DMAC_PENDCH_PENDCH21_Pos 21 /**< \brief (DMAC_PENDCH) Pending Channel 21 */ +#define DMAC_PENDCH_PENDCH21 (_U_(1) << DMAC_PENDCH_PENDCH21_Pos) +#define DMAC_PENDCH_PENDCH22_Pos 22 /**< \brief (DMAC_PENDCH) Pending Channel 22 */ +#define DMAC_PENDCH_PENDCH22 (_U_(1) << DMAC_PENDCH_PENDCH22_Pos) +#define DMAC_PENDCH_PENDCH23_Pos 23 /**< \brief (DMAC_PENDCH) Pending Channel 23 */ +#define DMAC_PENDCH_PENDCH23 (_U_(1) << DMAC_PENDCH_PENDCH23_Pos) +#define DMAC_PENDCH_PENDCH24_Pos 24 /**< \brief (DMAC_PENDCH) Pending Channel 24 */ +#define DMAC_PENDCH_PENDCH24 (_U_(1) << DMAC_PENDCH_PENDCH24_Pos) +#define DMAC_PENDCH_PENDCH25_Pos 25 /**< \brief (DMAC_PENDCH) Pending Channel 25 */ +#define DMAC_PENDCH_PENDCH25 (_U_(1) << DMAC_PENDCH_PENDCH25_Pos) +#define DMAC_PENDCH_PENDCH26_Pos 26 /**< \brief (DMAC_PENDCH) Pending Channel 26 */ +#define DMAC_PENDCH_PENDCH26 (_U_(1) << DMAC_PENDCH_PENDCH26_Pos) +#define DMAC_PENDCH_PENDCH27_Pos 27 /**< \brief (DMAC_PENDCH) Pending Channel 27 */ +#define DMAC_PENDCH_PENDCH27 (_U_(1) << DMAC_PENDCH_PENDCH27_Pos) +#define DMAC_PENDCH_PENDCH28_Pos 28 /**< \brief (DMAC_PENDCH) Pending Channel 28 */ +#define DMAC_PENDCH_PENDCH28 (_U_(1) << DMAC_PENDCH_PENDCH28_Pos) +#define DMAC_PENDCH_PENDCH29_Pos 29 /**< \brief (DMAC_PENDCH) Pending Channel 29 */ +#define DMAC_PENDCH_PENDCH29 (_U_(1) << DMAC_PENDCH_PENDCH29_Pos) +#define DMAC_PENDCH_PENDCH30_Pos 30 /**< \brief (DMAC_PENDCH) Pending Channel 30 */ +#define DMAC_PENDCH_PENDCH30 (_U_(1) << DMAC_PENDCH_PENDCH30_Pos) +#define DMAC_PENDCH_PENDCH31_Pos 31 /**< \brief (DMAC_PENDCH) Pending Channel 31 */ +#define DMAC_PENDCH_PENDCH31 (_U_(1) << DMAC_PENDCH_PENDCH31_Pos) +#define DMAC_PENDCH_PENDCH_Pos 0 /**< \brief (DMAC_PENDCH) Pending Channel x */ +#define DMAC_PENDCH_PENDCH_Msk (_U_(0xFFFFFFFF) << DMAC_PENDCH_PENDCH_Pos) +#define DMAC_PENDCH_PENDCH(value) (DMAC_PENDCH_PENDCH_Msk & ((value) << DMAC_PENDCH_PENDCH_Pos)) +#define DMAC_PENDCH_MASK _U_(0xFFFFFFFF) /**< \brief (DMAC_PENDCH) MASK Register */ + +/* -------- DMAC_ACTIVE : (DMAC Offset: 0x30) (R/ 32) Active Channel and Levels -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t LVLEX0:1; /*!< bit: 0 Level 0 Channel Trigger Request Executing */ + uint32_t LVLEX1:1; /*!< bit: 1 Level 1 Channel Trigger Request Executing */ + uint32_t LVLEX2:1; /*!< bit: 2 Level 2 Channel Trigger Request Executing */ + uint32_t LVLEX3:1; /*!< bit: 3 Level 3 Channel Trigger Request Executing */ + uint32_t :4; /*!< bit: 4.. 7 Reserved */ + uint32_t ID:5; /*!< bit: 8..12 Active Channel ID */ + uint32_t :2; /*!< bit: 13..14 Reserved */ + uint32_t ABUSY:1; /*!< bit: 15 Active Channel Busy */ + uint32_t BTCNT:16; /*!< bit: 16..31 Active Channel Block Transfer Count */ + } bit; /*!< Structure used for bit access */ + struct { + uint32_t LVLEX:4; /*!< bit: 0.. 3 Level x Channel Trigger Request Executing */ + uint32_t :28; /*!< bit: 4..31 Reserved */ + } vec; /*!< Structure used for vec access */ + uint32_t reg; /*!< Type used for register access */ +} DMAC_ACTIVE_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define DMAC_ACTIVE_OFFSET 0x30 /**< \brief (DMAC_ACTIVE offset) Active Channel and Levels */ +#define DMAC_ACTIVE_RESETVALUE _U_(0x00000000) /**< \brief (DMAC_ACTIVE reset_value) Active Channel and Levels */ + +#define DMAC_ACTIVE_LVLEX0_Pos 0 /**< \brief (DMAC_ACTIVE) Level 0 Channel Trigger Request Executing */ +#define DMAC_ACTIVE_LVLEX0 (_U_(1) << DMAC_ACTIVE_LVLEX0_Pos) +#define DMAC_ACTIVE_LVLEX1_Pos 1 /**< \brief (DMAC_ACTIVE) Level 1 Channel Trigger Request Executing */ +#define DMAC_ACTIVE_LVLEX1 (_U_(1) << DMAC_ACTIVE_LVLEX1_Pos) +#define DMAC_ACTIVE_LVLEX2_Pos 2 /**< \brief (DMAC_ACTIVE) Level 2 Channel Trigger Request Executing */ +#define DMAC_ACTIVE_LVLEX2 (_U_(1) << DMAC_ACTIVE_LVLEX2_Pos) +#define DMAC_ACTIVE_LVLEX3_Pos 3 /**< \brief (DMAC_ACTIVE) Level 3 Channel Trigger Request Executing */ +#define DMAC_ACTIVE_LVLEX3 (_U_(1) << DMAC_ACTIVE_LVLEX3_Pos) +#define DMAC_ACTIVE_LVLEX_Pos 0 /**< \brief (DMAC_ACTIVE) Level x Channel Trigger Request Executing */ +#define DMAC_ACTIVE_LVLEX_Msk (_U_(0xF) << DMAC_ACTIVE_LVLEX_Pos) +#define DMAC_ACTIVE_LVLEX(value) (DMAC_ACTIVE_LVLEX_Msk & ((value) << DMAC_ACTIVE_LVLEX_Pos)) +#define DMAC_ACTIVE_ID_Pos 8 /**< \brief (DMAC_ACTIVE) Active Channel ID */ +#define DMAC_ACTIVE_ID_Msk (_U_(0x1F) << DMAC_ACTIVE_ID_Pos) +#define DMAC_ACTIVE_ID(value) (DMAC_ACTIVE_ID_Msk & ((value) << DMAC_ACTIVE_ID_Pos)) +#define DMAC_ACTIVE_ABUSY_Pos 15 /**< \brief (DMAC_ACTIVE) Active Channel Busy */ +#define DMAC_ACTIVE_ABUSY (_U_(0x1) << DMAC_ACTIVE_ABUSY_Pos) +#define DMAC_ACTIVE_BTCNT_Pos 16 /**< \brief (DMAC_ACTIVE) Active Channel Block Transfer Count */ +#define DMAC_ACTIVE_BTCNT_Msk (_U_(0xFFFF) << DMAC_ACTIVE_BTCNT_Pos) +#define DMAC_ACTIVE_BTCNT(value) (DMAC_ACTIVE_BTCNT_Msk & ((value) << DMAC_ACTIVE_BTCNT_Pos)) +#define DMAC_ACTIVE_MASK _U_(0xFFFF9F0F) /**< \brief (DMAC_ACTIVE) MASK Register */ + +/* -------- DMAC_BASEADDR : (DMAC Offset: 0x34) (R/W 32) Descriptor Memory Section Base Address -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t BASEADDR:32; /*!< bit: 0..31 Descriptor Memory Base Address */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} DMAC_BASEADDR_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define DMAC_BASEADDR_OFFSET 0x34 /**< \brief (DMAC_BASEADDR offset) Descriptor Memory Section Base Address */ +#define DMAC_BASEADDR_RESETVALUE _U_(0x00000000) /**< \brief (DMAC_BASEADDR reset_value) Descriptor Memory Section Base Address */ + +#define DMAC_BASEADDR_BASEADDR_Pos 0 /**< \brief (DMAC_BASEADDR) Descriptor Memory Base Address */ +#define DMAC_BASEADDR_BASEADDR_Msk (_U_(0xFFFFFFFF) << DMAC_BASEADDR_BASEADDR_Pos) +#define DMAC_BASEADDR_BASEADDR(value) (DMAC_BASEADDR_BASEADDR_Msk & ((value) << DMAC_BASEADDR_BASEADDR_Pos)) +#define DMAC_BASEADDR_MASK _U_(0xFFFFFFFF) /**< \brief (DMAC_BASEADDR) MASK Register */ + +/* -------- DMAC_WRBADDR : (DMAC Offset: 0x38) (R/W 32) Write-Back Memory Section Base Address -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t WRBADDR:32; /*!< bit: 0..31 Write-Back Memory Base Address */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} DMAC_WRBADDR_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define DMAC_WRBADDR_OFFSET 0x38 /**< \brief (DMAC_WRBADDR offset) Write-Back Memory Section Base Address */ +#define DMAC_WRBADDR_RESETVALUE _U_(0x00000000) /**< \brief (DMAC_WRBADDR reset_value) Write-Back Memory Section Base Address */ + +#define DMAC_WRBADDR_WRBADDR_Pos 0 /**< \brief (DMAC_WRBADDR) Write-Back Memory Base Address */ +#define DMAC_WRBADDR_WRBADDR_Msk (_U_(0xFFFFFFFF) << DMAC_WRBADDR_WRBADDR_Pos) +#define DMAC_WRBADDR_WRBADDR(value) (DMAC_WRBADDR_WRBADDR_Msk & ((value) << DMAC_WRBADDR_WRBADDR_Pos)) +#define DMAC_WRBADDR_MASK _U_(0xFFFFFFFF) /**< \brief (DMAC_WRBADDR) MASK Register */ + +/* -------- DMAC_CHCTRLA : (DMAC Offset: 0x40) (R/W 32) CHANNEL Channel n Control A -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint32_t SWRST:1; /*!< bit: 0 Channel Software Reset */ + uint32_t ENABLE:1; /*!< bit: 1 Channel Enable */ + uint32_t :4; /*!< bit: 2.. 5 Reserved */ + uint32_t RUNSTDBY:1; /*!< bit: 6 Channel Run in Standby */ + uint32_t :1; /*!< bit: 7 Reserved */ + uint32_t TRIGSRC:7; /*!< bit: 8..14 Trigger Source */ + uint32_t :5; /*!< bit: 15..19 Reserved */ + uint32_t TRIGACT:2; /*!< bit: 20..21 Trigger Action */ + uint32_t :2; /*!< bit: 22..23 Reserved */ + uint32_t BURSTLEN:4; /*!< bit: 24..27 Burst Length */ + uint32_t THRESHOLD:2; /*!< bit: 28..29 FIFO Threshold */ + uint32_t :2; /*!< bit: 30..31 Reserved */ + } bit; /*!< Structure used for bit access */ + uint32_t reg; /*!< Type used for register access */ +} DMAC_CHCTRLA_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define DMAC_CHCTRLA_OFFSET 0x40 /**< \brief (DMAC_CHCTRLA offset) Channel n Control A */ +#define DMAC_CHCTRLA_RESETVALUE _U_(0x00000000) /**< \brief (DMAC_CHCTRLA reset_value) Channel n Control A */ + +#define DMAC_CHCTRLA_SWRST_Pos 0 /**< \brief (DMAC_CHCTRLA) Channel Software Reset */ +#define DMAC_CHCTRLA_SWRST (_U_(0x1) << DMAC_CHCTRLA_SWRST_Pos) +#define DMAC_CHCTRLA_ENABLE_Pos 1 /**< \brief (DMAC_CHCTRLA) Channel Enable */ +#define DMAC_CHCTRLA_ENABLE (_U_(0x1) << DMAC_CHCTRLA_ENABLE_Pos) +#define DMAC_CHCTRLA_RUNSTDBY_Pos 6 /**< \brief (DMAC_CHCTRLA) Channel Run in Standby */ +#define DMAC_CHCTRLA_RUNSTDBY (_U_(0x1) << DMAC_CHCTRLA_RUNSTDBY_Pos) +#define DMAC_CHCTRLA_TRIGSRC_Pos 8 /**< \brief (DMAC_CHCTRLA) Trigger Source */ +#define DMAC_CHCTRLA_TRIGSRC_Msk (_U_(0x7F) << DMAC_CHCTRLA_TRIGSRC_Pos) +#define DMAC_CHCTRLA_TRIGSRC(value) (DMAC_CHCTRLA_TRIGSRC_Msk & ((value) << DMAC_CHCTRLA_TRIGSRC_Pos)) +#define DMAC_CHCTRLA_TRIGSRC_DISABLE_Val _U_(0x0) /**< \brief (DMAC_CHCTRLA) Only software/event triggers */ +#define DMAC_CHCTRLA_TRIGSRC_DISABLE (DMAC_CHCTRLA_TRIGSRC_DISABLE_Val << DMAC_CHCTRLA_TRIGSRC_Pos) +#define DMAC_CHCTRLA_TRIGACT_Pos 20 /**< \brief (DMAC_CHCTRLA) Trigger Action */ +#define DMAC_CHCTRLA_TRIGACT_Msk (_U_(0x3) << DMAC_CHCTRLA_TRIGACT_Pos) +#define DMAC_CHCTRLA_TRIGACT(value) (DMAC_CHCTRLA_TRIGACT_Msk & ((value) << DMAC_CHCTRLA_TRIGACT_Pos)) +#define DMAC_CHCTRLA_TRIGACT_BLOCK_Val _U_(0x0) /**< \brief (DMAC_CHCTRLA) One trigger required for each block transfer */ +#define DMAC_CHCTRLA_TRIGACT_BURST_Val _U_(0x2) /**< \brief (DMAC_CHCTRLA) One trigger required for each burst transfer */ +#define DMAC_CHCTRLA_TRIGACT_TRANSACTION_Val _U_(0x3) /**< \brief (DMAC_CHCTRLA) One trigger required for each transaction */ +#define DMAC_CHCTRLA_TRIGACT_BLOCK (DMAC_CHCTRLA_TRIGACT_BLOCK_Val << DMAC_CHCTRLA_TRIGACT_Pos) +#define DMAC_CHCTRLA_TRIGACT_BURST (DMAC_CHCTRLA_TRIGACT_BURST_Val << DMAC_CHCTRLA_TRIGACT_Pos) +#define DMAC_CHCTRLA_TRIGACT_TRANSACTION (DMAC_CHCTRLA_TRIGACT_TRANSACTION_Val << DMAC_CHCTRLA_TRIGACT_Pos) +#define DMAC_CHCTRLA_BURSTLEN_Pos 24 /**< \brief (DMAC_CHCTRLA) Burst Length */ +#define DMAC_CHCTRLA_BURSTLEN_Msk (_U_(0xF) << DMAC_CHCTRLA_BURSTLEN_Pos) +#define DMAC_CHCTRLA_BURSTLEN(value) (DMAC_CHCTRLA_BURSTLEN_Msk & ((value) << DMAC_CHCTRLA_BURSTLEN_Pos)) +#define DMAC_CHCTRLA_BURSTLEN_SINGLE_Val _U_(0x0) /**< \brief (DMAC_CHCTRLA) Single-beat burst length */ +#define DMAC_CHCTRLA_BURSTLEN_2BEAT_Val _U_(0x1) /**< \brief (DMAC_CHCTRLA) 2-beats burst length */ +#define DMAC_CHCTRLA_BURSTLEN_3BEAT_Val _U_(0x2) /**< \brief (DMAC_CHCTRLA) 3-beats burst length */ +#define DMAC_CHCTRLA_BURSTLEN_4BEAT_Val _U_(0x3) /**< \brief (DMAC_CHCTRLA) 4-beats burst length */ +#define DMAC_CHCTRLA_BURSTLEN_5BEAT_Val _U_(0x4) /**< \brief (DMAC_CHCTRLA) 5-beats burst length */ +#define DMAC_CHCTRLA_BURSTLEN_6BEAT_Val _U_(0x5) /**< \brief (DMAC_CHCTRLA) 6-beats burst length */ +#define DMAC_CHCTRLA_BURSTLEN_7BEAT_Val _U_(0x6) /**< \brief (DMAC_CHCTRLA) 7-beats burst length */ +#define DMAC_CHCTRLA_BURSTLEN_8BEAT_Val _U_(0x7) /**< \brief (DMAC_CHCTRLA) 8-beats burst length */ +#define DMAC_CHCTRLA_BURSTLEN_9BEAT_Val _U_(0x8) /**< \brief (DMAC_CHCTRLA) 9-beats burst length */ +#define DMAC_CHCTRLA_BURSTLEN_10BEAT_Val _U_(0x9) /**< \brief (DMAC_CHCTRLA) 10-beats burst length */ +#define DMAC_CHCTRLA_BURSTLEN_11BEAT_Val _U_(0xA) /**< \brief (DMAC_CHCTRLA) 11-beats burst length */ +#define DMAC_CHCTRLA_BURSTLEN_12BEAT_Val _U_(0xB) /**< \brief (DMAC_CHCTRLA) 12-beats burst length */ +#define DMAC_CHCTRLA_BURSTLEN_13BEAT_Val _U_(0xC) /**< \brief (DMAC_CHCTRLA) 13-beats burst length */ +#define DMAC_CHCTRLA_BURSTLEN_14BEAT_Val _U_(0xD) /**< \brief (DMAC_CHCTRLA) 14-beats burst length */ +#define DMAC_CHCTRLA_BURSTLEN_15BEAT_Val _U_(0xE) /**< \brief (DMAC_CHCTRLA) 15-beats burst length */ +#define DMAC_CHCTRLA_BURSTLEN_16BEAT_Val _U_(0xF) /**< \brief (DMAC_CHCTRLA) 16-beats burst length */ +#define DMAC_CHCTRLA_BURSTLEN_SINGLE (DMAC_CHCTRLA_BURSTLEN_SINGLE_Val << DMAC_CHCTRLA_BURSTLEN_Pos) +#define DMAC_CHCTRLA_BURSTLEN_2BEAT (DMAC_CHCTRLA_BURSTLEN_2BEAT_Val << DMAC_CHCTRLA_BURSTLEN_Pos) +#define DMAC_CHCTRLA_BURSTLEN_3BEAT (DMAC_CHCTRLA_BURSTLEN_3BEAT_Val << DMAC_CHCTRLA_BURSTLEN_Pos) +#define DMAC_CHCTRLA_BURSTLEN_4BEAT (DMAC_CHCTRLA_BURSTLEN_4BEAT_Val << DMAC_CHCTRLA_BURSTLEN_Pos) +#define DMAC_CHCTRLA_BURSTLEN_5BEAT (DMAC_CHCTRLA_BURSTLEN_5BEAT_Val << DMAC_CHCTRLA_BURSTLEN_Pos) +#define DMAC_CHCTRLA_BURSTLEN_6BEAT (DMAC_CHCTRLA_BURSTLEN_6BEAT_Val << DMAC_CHCTRLA_BURSTLEN_Pos) +#define DMAC_CHCTRLA_BURSTLEN_7BEAT (DMAC_CHCTRLA_BURSTLEN_7BEAT_Val << DMAC_CHCTRLA_BURSTLEN_Pos) +#define DMAC_CHCTRLA_BURSTLEN_8BEAT (DMAC_CHCTRLA_BURSTLEN_8BEAT_Val << DMAC_CHCTRLA_BURSTLEN_Pos) +#define DMAC_CHCTRLA_BURSTLEN_9BEAT (DMAC_CHCTRLA_BURSTLEN_9BEAT_Val << DMAC_CHCTRLA_BURSTLEN_Pos) +#define DMAC_CHCTRLA_BURSTLEN_10BEAT (DMAC_CHCTRLA_BURSTLEN_10BEAT_Val << DMAC_CHCTRLA_BURSTLEN_Pos) +#define DMAC_CHCTRLA_BURSTLEN_11BEAT (DMAC_CHCTRLA_BURSTLEN_11BEAT_Val << DMAC_CHCTRLA_BURSTLEN_Pos) +#define DMAC_CHCTRLA_BURSTLEN_12BEAT (DMAC_CHCTRLA_BURSTLEN_12BEAT_Val << DMAC_CHCTRLA_BURSTLEN_Pos) +#define DMAC_CHCTRLA_BURSTLEN_13BEAT (DMAC_CHCTRLA_BURSTLEN_13BEAT_Val << DMAC_CHCTRLA_BURSTLEN_Pos) +#define DMAC_CHCTRLA_BURSTLEN_14BEAT (DMAC_CHCTRLA_BURSTLEN_14BEAT_Val << DMAC_CHCTRLA_BURSTLEN_Pos) +#define DMAC_CHCTRLA_BURSTLEN_15BEAT (DMAC_CHCTRLA_BURSTLEN_15BEAT_Val << DMAC_CHCTRLA_BURSTLEN_Pos) +#define DMAC_CHCTRLA_BURSTLEN_16BEAT (DMAC_CHCTRLA_BURSTLEN_16BEAT_Val << DMAC_CHCTRLA_BURSTLEN_Pos) +#define DMAC_CHCTRLA_THRESHOLD_Pos 28 /**< \brief (DMAC_CHCTRLA) FIFO Threshold */ +#define DMAC_CHCTRLA_THRESHOLD_Msk (_U_(0x3) << DMAC_CHCTRLA_THRESHOLD_Pos) +#define DMAC_CHCTRLA_THRESHOLD(value) (DMAC_CHCTRLA_THRESHOLD_Msk & ((value) << DMAC_CHCTRLA_THRESHOLD_Pos)) +#define DMAC_CHCTRLA_THRESHOLD_1BEAT_Val _U_(0x0) /**< \brief (DMAC_CHCTRLA) Destination write starts after each beat source address read */ +#define DMAC_CHCTRLA_THRESHOLD_2BEATS_Val _U_(0x1) /**< \brief (DMAC_CHCTRLA) Destination write starts after 2-beats source address read */ +#define DMAC_CHCTRLA_THRESHOLD_4BEATS_Val _U_(0x2) /**< \brief (DMAC_CHCTRLA) Destination write starts after 4-beats source address read */ +#define DMAC_CHCTRLA_THRESHOLD_8BEATS_Val _U_(0x3) /**< \brief (DMAC_CHCTRLA) Destination write starts after 8-beats source address read */ +#define DMAC_CHCTRLA_THRESHOLD_1BEAT (DMAC_CHCTRLA_THRESHOLD_1BEAT_Val << DMAC_CHCTRLA_THRESHOLD_Pos) +#define DMAC_CHCTRLA_THRESHOLD_2BEATS (DMAC_CHCTRLA_THRESHOLD_2BEATS_Val << DMAC_CHCTRLA_THRESHOLD_Pos) +#define DMAC_CHCTRLA_THRESHOLD_4BEATS (DMAC_CHCTRLA_THRESHOLD_4BEATS_Val << DMAC_CHCTRLA_THRESHOLD_Pos) +#define DMAC_CHCTRLA_THRESHOLD_8BEATS (DMAC_CHCTRLA_THRESHOLD_8BEATS_Val << DMAC_CHCTRLA_THRESHOLD_Pos) +#define DMAC_CHCTRLA_MASK _U_(0x3F307F43) /**< \brief (DMAC_CHCTRLA) MASK Register */ + +/* -------- DMAC_CHCTRLB : (DMAC Offset: 0x44) (R/W 8) CHANNEL Channel n Control B -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t CMD:2; /*!< bit: 0.. 1 Software Command */ + uint8_t :6; /*!< bit: 2.. 7 Reserved */ + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} DMAC_CHCTRLB_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define DMAC_CHCTRLB_OFFSET 0x44 /**< \brief (DMAC_CHCTRLB offset) Channel n Control B */ +#define DMAC_CHCTRLB_RESETVALUE _U_(0x00) /**< \brief (DMAC_CHCTRLB reset_value) Channel n Control B */ + +#define DMAC_CHCTRLB_CMD_Pos 0 /**< \brief (DMAC_CHCTRLB) Software Command */ +#define DMAC_CHCTRLB_CMD_Msk (_U_(0x3) << DMAC_CHCTRLB_CMD_Pos) +#define DMAC_CHCTRLB_CMD(value) (DMAC_CHCTRLB_CMD_Msk & ((value) << DMAC_CHCTRLB_CMD_Pos)) +#define DMAC_CHCTRLB_CMD_NOACT_Val _U_(0x0) /**< \brief (DMAC_CHCTRLB) No action */ +#define DMAC_CHCTRLB_CMD_SUSPEND_Val _U_(0x1) /**< \brief (DMAC_CHCTRLB) Channel suspend operation */ +#define DMAC_CHCTRLB_CMD_RESUME_Val _U_(0x2) /**< \brief (DMAC_CHCTRLB) Channel resume operation */ +#define DMAC_CHCTRLB_CMD_NOACT (DMAC_CHCTRLB_CMD_NOACT_Val << DMAC_CHCTRLB_CMD_Pos) +#define DMAC_CHCTRLB_CMD_SUSPEND (DMAC_CHCTRLB_CMD_SUSPEND_Val << DMAC_CHCTRLB_CMD_Pos) +#define DMAC_CHCTRLB_CMD_RESUME (DMAC_CHCTRLB_CMD_RESUME_Val << DMAC_CHCTRLB_CMD_Pos) +#define DMAC_CHCTRLB_MASK _U_(0x03) /**< \brief (DMAC_CHCTRLB) MASK Register */ + +/* -------- DMAC_CHPRILVL : (DMAC Offset: 0x45) (R/W 8) CHANNEL Channel n Priority Level -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t PRILVL:2; /*!< bit: 0.. 1 Channel Priority Level */ + uint8_t :6; /*!< bit: 2.. 7 Reserved */ + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} DMAC_CHPRILVL_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define DMAC_CHPRILVL_OFFSET 0x45 /**< \brief (DMAC_CHPRILVL offset) Channel n Priority Level */ +#define DMAC_CHPRILVL_RESETVALUE _U_(0x00) /**< \brief (DMAC_CHPRILVL reset_value) Channel n Priority Level */ + +#define DMAC_CHPRILVL_PRILVL_Pos 0 /**< \brief (DMAC_CHPRILVL) Channel Priority Level */ +#define DMAC_CHPRILVL_PRILVL_Msk (_U_(0x3) << DMAC_CHPRILVL_PRILVL_Pos) +#define DMAC_CHPRILVL_PRILVL(value) (DMAC_CHPRILVL_PRILVL_Msk & ((value) << DMAC_CHPRILVL_PRILVL_Pos)) +#define DMAC_CHPRILVL_PRILVL_LVL0_Val _U_(0x0) /**< \brief (DMAC_CHPRILVL) Channel Priority Level 0 (Lowest Level) */ +#define DMAC_CHPRILVL_PRILVL_LVL1_Val _U_(0x1) /**< \brief (DMAC_CHPRILVL) Channel Priority Level 1 */ +#define DMAC_CHPRILVL_PRILVL_LVL2_Val _U_(0x2) /**< \brief (DMAC_CHPRILVL) Channel Priority Level 2 */ +#define DMAC_CHPRILVL_PRILVL_LVL3_Val _U_(0x3) /**< \brief (DMAC_CHPRILVL) Channel Priority Level 3 */ +#define DMAC_CHPRILVL_PRILVL_LVL4_Val _U_(0x4) /**< \brief (DMAC_CHPRILVL) Channel Priority Level 4 */ +#define DMAC_CHPRILVL_PRILVL_LVL5_Val _U_(0x5) /**< \brief (DMAC_CHPRILVL) Channel Priority Level 5 */ +#define DMAC_CHPRILVL_PRILVL_LVL6_Val _U_(0x6) /**< \brief (DMAC_CHPRILVL) Channel Priority Level 6 */ +#define DMAC_CHPRILVL_PRILVL_LVL7_Val _U_(0x7) /**< \brief (DMAC_CHPRILVL) Channel Priority Level 7 (Highest Level) */ +#define DMAC_CHPRILVL_PRILVL_LVL0 (DMAC_CHPRILVL_PRILVL_LVL0_Val << DMAC_CHPRILVL_PRILVL_Pos) +#define DMAC_CHPRILVL_PRILVL_LVL1 (DMAC_CHPRILVL_PRILVL_LVL1_Val << DMAC_CHPRILVL_PRILVL_Pos) +#define DMAC_CHPRILVL_PRILVL_LVL2 (DMAC_CHPRILVL_PRILVL_LVL2_Val << DMAC_CHPRILVL_PRILVL_Pos) +#define DMAC_CHPRILVL_PRILVL_LVL3 (DMAC_CHPRILVL_PRILVL_LVL3_Val << DMAC_CHPRILVL_PRILVL_Pos) +#define DMAC_CHPRILVL_PRILVL_LVL4 (DMAC_CHPRILVL_PRILVL_LVL4_Val << DMAC_CHPRILVL_PRILVL_Pos) +#define DMAC_CHPRILVL_PRILVL_LVL5 (DMAC_CHPRILVL_PRILVL_LVL5_Val << DMAC_CHPRILVL_PRILVL_Pos) +#define DMAC_CHPRILVL_PRILVL_LVL6 (DMAC_CHPRILVL_PRILVL_LVL6_Val << DMAC_CHPRILVL_PRILVL_Pos) +#define DMAC_CHPRILVL_PRILVL_LVL7 (DMAC_CHPRILVL_PRILVL_LVL7_Val << DMAC_CHPRILVL_PRILVL_Pos) +#define DMAC_CHPRILVL_MASK _U_(0x03) /**< \brief (DMAC_CHPRILVL) MASK Register */ + +/* -------- DMAC_CHEVCTRL : (DMAC Offset: 0x46) (R/W 8) CHANNEL Channel n Event Control -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t EVACT:3; /*!< bit: 0.. 2 Channel Event Input Action */ + uint8_t :1; /*!< bit: 3 Reserved */ + uint8_t EVOMODE:2; /*!< bit: 4.. 5 Channel Event Output Mode */ + uint8_t EVIE:1; /*!< bit: 6 Channel Event Input Enable */ + uint8_t EVOE:1; /*!< bit: 7 Channel Event Output Enable */ + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} DMAC_CHEVCTRL_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define DMAC_CHEVCTRL_OFFSET 0x46 /**< \brief (DMAC_CHEVCTRL offset) Channel n Event Control */ +#define DMAC_CHEVCTRL_RESETVALUE _U_(0x00) /**< \brief (DMAC_CHEVCTRL reset_value) Channel n Event Control */ + +#define DMAC_CHEVCTRL_EVACT_Pos 0 /**< \brief (DMAC_CHEVCTRL) Channel Event Input Action */ +#define DMAC_CHEVCTRL_EVACT_Msk (_U_(0x7) << DMAC_CHEVCTRL_EVACT_Pos) +#define DMAC_CHEVCTRL_EVACT(value) (DMAC_CHEVCTRL_EVACT_Msk & ((value) << DMAC_CHEVCTRL_EVACT_Pos)) +#define DMAC_CHEVCTRL_EVACT_NOACT_Val _U_(0x0) /**< \brief (DMAC_CHEVCTRL) No action */ +#define DMAC_CHEVCTRL_EVACT_TRIG_Val _U_(0x1) /**< \brief (DMAC_CHEVCTRL) Transfer and periodic transfer trigger */ +#define DMAC_CHEVCTRL_EVACT_CTRIG_Val _U_(0x2) /**< \brief (DMAC_CHEVCTRL) Conditional transfer trigger */ +#define DMAC_CHEVCTRL_EVACT_CBLOCK_Val _U_(0x3) /**< \brief (DMAC_CHEVCTRL) Conditional block transfer */ +#define DMAC_CHEVCTRL_EVACT_SUSPEND_Val _U_(0x4) /**< \brief (DMAC_CHEVCTRL) Channel suspend operation */ +#define DMAC_CHEVCTRL_EVACT_RESUME_Val _U_(0x5) /**< \brief (DMAC_CHEVCTRL) Channel resume operation */ +#define DMAC_CHEVCTRL_EVACT_SSKIP_Val _U_(0x6) /**< \brief (DMAC_CHEVCTRL) Skip next block suspend action */ +#define DMAC_CHEVCTRL_EVACT_INCPRI_Val _U_(0x7) /**< \brief (DMAC_CHEVCTRL) Increase priority */ +#define DMAC_CHEVCTRL_EVACT_NOACT (DMAC_CHEVCTRL_EVACT_NOACT_Val << DMAC_CHEVCTRL_EVACT_Pos) +#define DMAC_CHEVCTRL_EVACT_TRIG (DMAC_CHEVCTRL_EVACT_TRIG_Val << DMAC_CHEVCTRL_EVACT_Pos) +#define DMAC_CHEVCTRL_EVACT_CTRIG (DMAC_CHEVCTRL_EVACT_CTRIG_Val << DMAC_CHEVCTRL_EVACT_Pos) +#define DMAC_CHEVCTRL_EVACT_CBLOCK (DMAC_CHEVCTRL_EVACT_CBLOCK_Val << DMAC_CHEVCTRL_EVACT_Pos) +#define DMAC_CHEVCTRL_EVACT_SUSPEND (DMAC_CHEVCTRL_EVACT_SUSPEND_Val << DMAC_CHEVCTRL_EVACT_Pos) +#define DMAC_CHEVCTRL_EVACT_RESUME (DMAC_CHEVCTRL_EVACT_RESUME_Val << DMAC_CHEVCTRL_EVACT_Pos) +#define DMAC_CHEVCTRL_EVACT_SSKIP (DMAC_CHEVCTRL_EVACT_SSKIP_Val << DMAC_CHEVCTRL_EVACT_Pos) +#define DMAC_CHEVCTRL_EVACT_INCPRI (DMAC_CHEVCTRL_EVACT_INCPRI_Val << DMAC_CHEVCTRL_EVACT_Pos) +#define DMAC_CHEVCTRL_EVOMODE_Pos 4 /**< \brief (DMAC_CHEVCTRL) Channel Event Output Mode */ +#define DMAC_CHEVCTRL_EVOMODE_Msk (_U_(0x3) << DMAC_CHEVCTRL_EVOMODE_Pos) +#define DMAC_CHEVCTRL_EVOMODE(value) (DMAC_CHEVCTRL_EVOMODE_Msk & ((value) << DMAC_CHEVCTRL_EVOMODE_Pos)) +#define DMAC_CHEVCTRL_EVOMODE_DEFAULT_Val _U_(0x0) /**< \brief (DMAC_CHEVCTRL) Block event output selection. Refer to BTCTRL.EVOSEL for available selections. */ +#define DMAC_CHEVCTRL_EVOMODE_TRIGACT_Val _U_(0x1) /**< \brief (DMAC_CHEVCTRL) Ongoing trigger action */ +#define DMAC_CHEVCTRL_EVOMODE_DEFAULT (DMAC_CHEVCTRL_EVOMODE_DEFAULT_Val << DMAC_CHEVCTRL_EVOMODE_Pos) +#define DMAC_CHEVCTRL_EVOMODE_TRIGACT (DMAC_CHEVCTRL_EVOMODE_TRIGACT_Val << DMAC_CHEVCTRL_EVOMODE_Pos) +#define DMAC_CHEVCTRL_EVIE_Pos 6 /**< \brief (DMAC_CHEVCTRL) Channel Event Input Enable */ +#define DMAC_CHEVCTRL_EVIE (_U_(0x1) << DMAC_CHEVCTRL_EVIE_Pos) +#define DMAC_CHEVCTRL_EVOE_Pos 7 /**< \brief (DMAC_CHEVCTRL) Channel Event Output Enable */ +#define DMAC_CHEVCTRL_EVOE (_U_(0x1) << DMAC_CHEVCTRL_EVOE_Pos) +#define DMAC_CHEVCTRL_MASK _U_(0xF7) /**< \brief (DMAC_CHEVCTRL) MASK Register */ + +/* -------- DMAC_CHINTENCLR : (DMAC Offset: 0x4C) (R/W 8) CHANNEL Channel n Interrupt Enable Clear -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t TERR:1; /*!< bit: 0 Channel Transfer Error Interrupt Enable */ + uint8_t TCMPL:1; /*!< bit: 1 Channel Transfer Complete Interrupt Enable */ + uint8_t SUSP:1; /*!< bit: 2 Channel Suspend Interrupt Enable */ + uint8_t :5; /*!< bit: 3.. 7 Reserved */ + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} DMAC_CHINTENCLR_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define DMAC_CHINTENCLR_OFFSET 0x4C /**< \brief (DMAC_CHINTENCLR offset) Channel n Interrupt Enable Clear */ +#define DMAC_CHINTENCLR_RESETVALUE _U_(0x00) /**< \brief (DMAC_CHINTENCLR reset_value) Channel n Interrupt Enable Clear */ + +#define DMAC_CHINTENCLR_TERR_Pos 0 /**< \brief (DMAC_CHINTENCLR) Channel Transfer Error Interrupt Enable */ +#define DMAC_CHINTENCLR_TERR (_U_(0x1) << DMAC_CHINTENCLR_TERR_Pos) +#define DMAC_CHINTENCLR_TCMPL_Pos 1 /**< \brief (DMAC_CHINTENCLR) Channel Transfer Complete Interrupt Enable */ +#define DMAC_CHINTENCLR_TCMPL (_U_(0x1) << DMAC_CHINTENCLR_TCMPL_Pos) +#define DMAC_CHINTENCLR_SUSP_Pos 2 /**< \brief (DMAC_CHINTENCLR) Channel Suspend Interrupt Enable */ +#define DMAC_CHINTENCLR_SUSP (_U_(0x1) << DMAC_CHINTENCLR_SUSP_Pos) +#define DMAC_CHINTENCLR_MASK _U_(0x07) /**< \brief (DMAC_CHINTENCLR) MASK Register */ + +/* -------- DMAC_CHINTENSET : (DMAC Offset: 0x4D) (R/W 8) CHANNEL Channel n Interrupt Enable Set -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t TERR:1; /*!< bit: 0 Channel Transfer Error Interrupt Enable */ + uint8_t TCMPL:1; /*!< bit: 1 Channel Transfer Complete Interrupt Enable */ + uint8_t SUSP:1; /*!< bit: 2 Channel Suspend Interrupt Enable */ + uint8_t :5; /*!< bit: 3.. 7 Reserved */ + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} DMAC_CHINTENSET_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define DMAC_CHINTENSET_OFFSET 0x4D /**< \brief (DMAC_CHINTENSET offset) Channel n Interrupt Enable Set */ +#define DMAC_CHINTENSET_RESETVALUE _U_(0x00) /**< \brief (DMAC_CHINTENSET reset_value) Channel n Interrupt Enable Set */ + +#define DMAC_CHINTENSET_TERR_Pos 0 /**< \brief (DMAC_CHINTENSET) Channel Transfer Error Interrupt Enable */ +#define DMAC_CHINTENSET_TERR (_U_(0x1) << DMAC_CHINTENSET_TERR_Pos) +#define DMAC_CHINTENSET_TCMPL_Pos 1 /**< \brief (DMAC_CHINTENSET) Channel Transfer Complete Interrupt Enable */ +#define DMAC_CHINTENSET_TCMPL (_U_(0x1) << DMAC_CHINTENSET_TCMPL_Pos) +#define DMAC_CHINTENSET_SUSP_Pos 2 /**< \brief (DMAC_CHINTENSET) Channel Suspend Interrupt Enable */ +#define DMAC_CHINTENSET_SUSP (_U_(0x1) << DMAC_CHINTENSET_SUSP_Pos) +#define DMAC_CHINTENSET_MASK _U_(0x07) /**< \brief (DMAC_CHINTENSET) MASK Register */ + +/* -------- DMAC_CHINTFLAG : (DMAC Offset: 0x4E) (R/W 8) CHANNEL Channel n Interrupt Flag Status and Clear -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { // __I to avoid read-modify-write on write-to-clear register + struct { + __I uint8_t TERR:1; /*!< bit: 0 Channel Transfer Error */ + __I uint8_t TCMPL:1; /*!< bit: 1 Channel Transfer Complete */ + __I uint8_t SUSP:1; /*!< bit: 2 Channel Suspend */ + __I uint8_t :5; /*!< bit: 3.. 7 Reserved */ + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} DMAC_CHINTFLAG_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define DMAC_CHINTFLAG_OFFSET 0x4E /**< \brief (DMAC_CHINTFLAG offset) Channel n Interrupt Flag Status and Clear */ +#define DMAC_CHINTFLAG_RESETVALUE _U_(0x00) /**< \brief (DMAC_CHINTFLAG reset_value) Channel n Interrupt Flag Status and Clear */ + +#define DMAC_CHINTFLAG_TERR_Pos 0 /**< \brief (DMAC_CHINTFLAG) Channel Transfer Error */ +#define DMAC_CHINTFLAG_TERR (_U_(0x1) << DMAC_CHINTFLAG_TERR_Pos) +#define DMAC_CHINTFLAG_TCMPL_Pos 1 /**< \brief (DMAC_CHINTFLAG) Channel Transfer Complete */ +#define DMAC_CHINTFLAG_TCMPL (_U_(0x1) << DMAC_CHINTFLAG_TCMPL_Pos) +#define DMAC_CHINTFLAG_SUSP_Pos 2 /**< \brief (DMAC_CHINTFLAG) Channel Suspend */ +#define DMAC_CHINTFLAG_SUSP (_U_(0x1) << DMAC_CHINTFLAG_SUSP_Pos) +#define DMAC_CHINTFLAG_MASK _U_(0x07) /**< \brief (DMAC_CHINTFLAG) MASK Register */ + +/* -------- DMAC_CHSTATUS : (DMAC Offset: 0x4F) (R/W 8) CHANNEL Channel n Status -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t PEND:1; /*!< bit: 0 Channel Pending */ + uint8_t BUSY:1; /*!< bit: 1 Channel Busy */ + uint8_t FERR:1; /*!< bit: 2 Channel Fetch Error */ + uint8_t CRCERR:1; /*!< bit: 3 Channel CRC Error */ + uint8_t :4; /*!< bit: 4.. 7 Reserved */ + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} DMAC_CHSTATUS_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define DMAC_CHSTATUS_OFFSET 0x4F /**< \brief (DMAC_CHSTATUS offset) Channel n Status */ +#define DMAC_CHSTATUS_RESETVALUE _U_(0x00) /**< \brief (DMAC_CHSTATUS reset_value) Channel n Status */ + +#define DMAC_CHSTATUS_PEND_Pos 0 /**< \brief (DMAC_CHSTATUS) Channel Pending */ +#define DMAC_CHSTATUS_PEND (_U_(0x1) << DMAC_CHSTATUS_PEND_Pos) +#define DMAC_CHSTATUS_BUSY_Pos 1 /**< \brief (DMAC_CHSTATUS) Channel Busy */ +#define DMAC_CHSTATUS_BUSY (_U_(0x1) << DMAC_CHSTATUS_BUSY_Pos) +#define DMAC_CHSTATUS_FERR_Pos 2 /**< \brief (DMAC_CHSTATUS) Channel Fetch Error */ +#define DMAC_CHSTATUS_FERR (_U_(0x1) << DMAC_CHSTATUS_FERR_Pos) +#define DMAC_CHSTATUS_CRCERR_Pos 3 /**< \brief (DMAC_CHSTATUS) Channel CRC Error */ +#define DMAC_CHSTATUS_CRCERR (_U_(0x1) << DMAC_CHSTATUS_CRCERR_Pos) +#define DMAC_CHSTATUS_MASK _U_(0x0F) /**< \brief (DMAC_CHSTATUS) MASK Register */ + +/* -------- DMAC_BTCTRL : (DMAC Offset: 0x00) (R/W 16) Block Transfer Control -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint16_t VALID:1; /*!< bit: 0 Descriptor Valid */ + uint16_t EVOSEL:2; /*!< bit: 1.. 2 Block Event Output Selection */ + uint16_t BLOCKACT:2; /*!< bit: 3.. 4 Block Action */ + uint16_t :3; /*!< bit: 5.. 7 Reserved */ + uint16_t BEATSIZE:2; /*!< bit: 8.. 9 Beat Size */ + uint16_t SRCINC:1; /*!< bit: 10 Source Address Increment Enable */ + uint16_t DSTINC:1; /*!< bit: 11 Destination Address Increment Enable */ + uint16_t STEPSEL:1; /*!< bit: 12 Step Selection */ + uint16_t STEPSIZE:3; /*!< bit: 13..15 Address Increment Step Size */ + } bit; /*!< Structure used for bit access */ + uint16_t reg; /*!< Type used for register access */ +} DMAC_BTCTRL_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +#define DMAC_BTCTRL_OFFSET 0x00 /**< \brief (DMAC_BTCTRL offset) Block Transfer Control */ +#define DMAC_BTCTRL_RESETVALUE _U_(0x0000) /**< \brief (DMAC_BTCTRL reset_value) Block Transfer Control */ + +#define DMAC_BTCTRL_VALID_Pos 0 /**< \brief (DMAC_BTCTRL) Descriptor Valid */ +#define DMAC_BTCTRL_VALID (_U_(0x1) << DMAC_BTCTRL_VALID_Pos) +#define DMAC_BTCTRL_EVOSEL_Pos 1 /**< \brief (DMAC_BTCTRL) Block Event Output Selection */ +#define DMAC_BTCTRL_EVOSEL_Msk (_U_(0x3) << DMAC_BTCTRL_EVOSEL_Pos) +#define DMAC_BTCTRL_EVOSEL(value) (DMAC_BTCTRL_EVOSEL_Msk & ((value) << DMAC_BTCTRL_EVOSEL_Pos)) +#define DMAC_BTCTRL_EVOSEL_DISABLE_Val _U_(0x0) /**< \brief (DMAC_BTCTRL) Event generation disabled */ +#define DMAC_BTCTRL_EVOSEL_BLOCK_Val _U_(0x1) /**< \brief (DMAC_BTCTRL) Block event strobe */ +#define DMAC_BTCTRL_EVOSEL_BURST_Val _U_(0x3) /**< \brief (DMAC_BTCTRL) Burst event strobe */ +#define DMAC_BTCTRL_EVOSEL_DISABLE (DMAC_BTCTRL_EVOSEL_DISABLE_Val << DMAC_BTCTRL_EVOSEL_Pos) +#define DMAC_BTCTRL_EVOSEL_BLOCK (DMAC_BTCTRL_EVOSEL_BLOCK_Val << DMAC_BTCTRL_EVOSEL_Pos) +#define DMAC_BTCTRL_EVOSEL_BURST (DMAC_BTCTRL_EVOSEL_BURST_Val << DMAC_BTCTRL_EVOSEL_Pos) +#define DMAC_BTCTRL_BLOCKACT_Pos 3 /**< \brief (DMAC_BTCTRL) Block Action */ +#define DMAC_BTCTRL_BLOCKACT_Msk (_U_(0x3) << DMAC_BTCTRL_BLOCKACT_Pos) +#define DMAC_BTCTRL_BLOCKACT(value) (DMAC_BTCTRL_BLOCKACT_Msk & ((value) << DMAC_BTCTRL_BLOCKACT_Pos)) +#define DMAC_BTCTRL_BLOCKACT_NOACT_Val _U_(0x0) /**< \brief (DMAC_BTCTRL) Channel will be disabled if it is the last block transfer in the transaction */ +#define DMAC_BTCTRL_BLOCKACT_INT_Val _U_(0x1) /**< \brief (DMAC_BTCTRL) Channel will be disabled if it is the last block transfer in the transaction and block interrupt */ +#define DMAC_BTCTRL_BLOCKACT_SUSPEND_Val _U_(0x2) /**< \brief (DMAC_BTCTRL) Channel suspend operation is completed */ +#define DMAC_BTCTRL_BLOCKACT_BOTH_Val _U_(0x3) /**< \brief (DMAC_BTCTRL) Both channel suspend operation and block interrupt */ +#define DMAC_BTCTRL_BLOCKACT_NOACT (DMAC_BTCTRL_BLOCKACT_NOACT_Val << DMAC_BTCTRL_BLOCKACT_Pos) +#define DMAC_BTCTRL_BLOCKACT_INT (DMAC_BTCTRL_BLOCKACT_INT_Val << DMAC_BTCTRL_BLOCKACT_Pos) +#define DMAC_BTCTRL_BLOCKACT_SUSPEND (DMAC_BTCTRL_BLOCKACT_SUSPEND_Val << DMAC_BTCTRL_BLOCKACT_Pos) +#define DMAC_BTCTRL_BLOCKACT_BOTH (DMAC_BTCTRL_BLOCKACT_BOTH_Val << DMAC_BTCTRL_BLOCKACT_Pos) +#define DMAC_BTCTRL_BEATSIZE_Pos 8 /**< \brief (DMAC_BTCTRL) Beat Size */ +#define DMAC_BTCTRL_BEATSIZE_Msk (_U_(0x3) << DMAC_BTCTRL_BEATSIZE_Pos) +#define DMAC_BTCTRL_BEATSIZE(value) (DMAC_BTCTRL_BEATSIZE_Msk & ((value) << DMAC_BTCTRL_BEATSIZE_Pos)) +#define DMAC_BTCTRL_BEATSIZE_BYTE_Val _U_(0x0) /**< \brief (DMAC_BTCTRL) 8-bit bus transfer */ +#define DMAC_BTCTRL_BEATSIZE_HWORD_Val _U_(0x1) /**< \brief (DMAC_BTCTRL) 16-bit bus transfer */ +#define DMAC_BTCTRL_BEATSIZE_WORD_Val _U_(0x2) /**< \brief (DMAC_BTCTRL) 32-bit bus transfer */ +#define DMAC_BTCTRL_BEATSIZE_BYTE (DMAC_BTCTRL_BEATSIZE_BYTE_Val << DMAC_BTCTRL_BEATSIZE_Pos) +#define DMAC_BTCTRL_BEATSIZE_HWORD (DMAC_BTCTRL_BEATSIZE_HWORD_Val << DMAC_BTCTRL_BEATSIZE_Pos) +#define DMAC_BTCTRL_BEATSIZE_WORD (DMAC_BTCTRL_BEATSIZE_WORD_Val << DMAC_BTCTRL_BEATSIZE_Pos) +#define DMAC_BTCTRL_SRCINC_Pos 10 /**< \brief (DMAC_BTCTRL) Source Address Increment Enable */ +#define DMAC_BTCTRL_SRCINC (_U_(0x1) << DMAC_BTCTRL_SRCINC_Pos) +#define DMAC_BTCTRL_DSTINC_Pos 11 /**< \brief (DMAC_BTCTRL) Destination Address Increment Enable */ +#define DMAC_BTCTRL_DSTINC (_U_(0x1) << DMAC_BTCTRL_DSTINC_Pos) +#define DMAC_BTCTRL_STEPSEL_Pos 12 /**< \brief (DMAC_BTCTRL) Step Selection */ +#define DMAC_BTCTRL_STEPSEL (_U_(0x1) << DMAC_BTCTRL_STEPSEL_Pos) +#define DMAC_BTCTRL_STEPSEL_DST_Val _U_(0x0) /**< \brief (DMAC_BTCTRL) Step size settings apply to the destination address */ +#define DMAC_BTCTRL_STEPSEL_SRC_Val _U_(0x1) /**< \brief (DMAC_BTCTRL) Step size settings apply to the source address */ +#define DMAC_BTCTRL_STEPSEL_DST (DMAC_BTCTRL_STEPSEL_DST_Val << DMAC_BTCTRL_STEPSEL_Pos) +#define DMAC_BTCTRL_STEPSEL_SRC (DMAC_BTCTRL_STEPSEL_SRC_Val << DMAC_BTCTRL_STEPSEL_Pos) +#define DMAC_BTCTRL_STEPSIZE_Pos 13 /**< \brief (DMAC_BTCTRL) Address Increment Step Size */ +#define DMAC_BTCTRL_STEPSIZE_Msk (_U_(0x7) << DMAC_BTCTRL_STEPSIZE_Pos) +#define DMAC_BTCTRL_STEPSIZE(value) (DMAC_BTCTRL_STEPSIZE_Msk & ((value) << DMAC_BTCTRL_STEPSIZE_Pos)) +#define DMAC_BTCTRL_STEPSIZE_X1_Val _U_(0x0) /**< \brief (DMAC_BTCTRL) Next ADDR = ADDR + (1< 8 bits, 1 -> 16 bits +#define USB_EPNUM 8 // parameter for rtl : max of ENDPOINT and PIPE NUM +#define USB_EPT_NUM 8 // Number of USB end points +#define USB_GCLK_ID 10 // Index of Generic Clock +#define USB_INITIAL_CONTROL_QOS 3 // CONTROL QOS RESET value +#define USB_INITIAL_DATA_QOS 3 // DATA QOS RESET value +#define USB_MISSING_SOF_DET_IMPLEMENTED 1 // 48 mHz xPLL feature implemented +#define USB_PIPE_NUM 8 // Number of USB pipes +#define USB_SYSTEM_CLOCK_IS_CKUSB 0 // Dual (1'b0) or Single (1'b1) clock system +#define USB_USB_2_AHB_FIFO_DEPTH 4 // bytes number, should be at least 2, and 2^n (4,8,16 ...) +#define USB_USB_2_AHB_RD_DATA_BITS 16 // 8, 16 or 32, here : 8-bits is required as UTMI interface should work in 8-bits mode +#define USB_USB_2_AHB_RD_THRESHOLD 2 // as soon as there are 16 bytes-free inside the fifo, ahb read transfer is requested +#define USB_USB_2_AHB_WR_DATA_BITS 8 // 8, 16 or 32 : here : 8-bits is required as UTMI interface should work in 8-bits mode + +#endif /* _SAMD51_USB_INSTANCE_ */ diff --git a/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/wdt.h b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/wdt.h new file mode 100644 index 000000000..98a2ca13d --- /dev/null +++ b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/instance/wdt.h @@ -0,0 +1,55 @@ +/** + * \file + * + * \brief Instance description for WDT + * + * Copyright (c) 2017 Microchip Technology Inc. + * + * \asf_license_start + * + * \page License + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 Licence 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. + * + * \asf_license_stop + * + */ + +#ifndef _SAMD51_WDT_INSTANCE_ +#define _SAMD51_WDT_INSTANCE_ + +/* ========== Register definition for WDT peripheral ========== */ +#if (defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +#define REG_WDT_CTRLA (0x40002000) /**< \brief (WDT) Control */ +#define REG_WDT_CONFIG (0x40002001) /**< \brief (WDT) Configuration */ +#define REG_WDT_EWCTRL (0x40002002) /**< \brief (WDT) Early Warning Interrupt Control */ +#define REG_WDT_INTENCLR (0x40002004) /**< \brief (WDT) Interrupt Enable Clear */ +#define REG_WDT_INTENSET (0x40002005) /**< \brief (WDT) Interrupt Enable Set */ +#define REG_WDT_INTFLAG (0x40002006) /**< \brief (WDT) Interrupt Flag Status and Clear */ +#define REG_WDT_SYNCBUSY (0x40002008) /**< \brief (WDT) Synchronization Busy */ +#define REG_WDT_CLEAR (0x4000200C) /**< \brief (WDT) Clear */ +#else +#define REG_WDT_CTRLA (*(RwReg8 *)0x40002000UL) /**< \brief (WDT) Control */ +#define REG_WDT_CONFIG (*(RwReg8 *)0x40002001UL) /**< \brief (WDT) Configuration */ +#define REG_WDT_EWCTRL (*(RwReg8 *)0x40002002UL) /**< \brief (WDT) Early Warning Interrupt Control */ +#define REG_WDT_INTENCLR (*(RwReg8 *)0x40002004UL) /**< \brief (WDT) Interrupt Enable Clear */ +#define REG_WDT_INTENSET (*(RwReg8 *)0x40002005UL) /**< \brief (WDT) Interrupt Enable Set */ +#define REG_WDT_INTFLAG (*(RwReg8 *)0x40002006UL) /**< \brief (WDT) Interrupt Flag Status and Clear */ +#define REG_WDT_SYNCBUSY (*(RoReg *)0x40002008UL) /**< \brief (WDT) Synchronization Busy */ +#define REG_WDT_CLEAR (*(WoReg8 *)0x4000200CUL) /**< \brief (WDT) Clear */ +#endif /* (defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + + +#endif /* _SAMD51_WDT_INSTANCE_ */ diff --git a/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/pio/samd51j18a.h b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/pio/samd51j18a.h new file mode 100644 index 000000000..d8fa56d5b --- /dev/null +++ b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/pio/samd51j18a.h @@ -0,0 +1,1863 @@ +/** + * \file + * + * \brief Peripheral I/O description for SAMD51J18A + * + * Copyright (c) 2017 Microchip Technology Inc. + * + * \asf_license_start + * + * \page License + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 Licence 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. + * + * \asf_license_stop + * + */ + +#ifndef _SAMD51J18A_PIO_ +#define _SAMD51J18A_PIO_ + +#define PIN_PA00 0 /**< \brief Pin Number for PA00 */ +#define PORT_PA00 (_UL_(1) << 0) /**< \brief PORT Mask for PA00 */ +#define PIN_PA01 1 /**< \brief Pin Number for PA01 */ +#define PORT_PA01 (_UL_(1) << 1) /**< \brief PORT Mask for PA01 */ +#define PIN_PA02 2 /**< \brief Pin Number for PA02 */ +#define PORT_PA02 (_UL_(1) << 2) /**< \brief PORT Mask for PA02 */ +#define PIN_PA03 3 /**< \brief Pin Number for PA03 */ +#define PORT_PA03 (_UL_(1) << 3) /**< \brief PORT Mask for PA03 */ +#define PIN_PA04 4 /**< \brief Pin Number for PA04 */ +#define PORT_PA04 (_UL_(1) << 4) /**< \brief PORT Mask for PA04 */ +#define PIN_PA05 5 /**< \brief Pin Number for PA05 */ +#define PORT_PA05 (_UL_(1) << 5) /**< \brief PORT Mask for PA05 */ +#define PIN_PA06 6 /**< \brief Pin Number for PA06 */ +#define PORT_PA06 (_UL_(1) << 6) /**< \brief PORT Mask for PA06 */ +#define PIN_PA07 7 /**< \brief Pin Number for PA07 */ +#define PORT_PA07 (_UL_(1) << 7) /**< \brief PORT Mask for PA07 */ +#define PIN_PA08 8 /**< \brief Pin Number for PA08 */ +#define PORT_PA08 (_UL_(1) << 8) /**< \brief PORT Mask for PA08 */ +#define PIN_PA09 9 /**< \brief Pin Number for PA09 */ +#define PORT_PA09 (_UL_(1) << 9) /**< \brief PORT Mask for PA09 */ +#define PIN_PA10 10 /**< \brief Pin Number for PA10 */ +#define PORT_PA10 (_UL_(1) << 10) /**< \brief PORT Mask for PA10 */ +#define PIN_PA11 11 /**< \brief Pin Number for PA11 */ +#define PORT_PA11 (_UL_(1) << 11) /**< \brief PORT Mask for PA11 */ +#define PIN_PA12 12 /**< \brief Pin Number for PA12 */ +#define PORT_PA12 (_UL_(1) << 12) /**< \brief PORT Mask for PA12 */ +#define PIN_PA13 13 /**< \brief Pin Number for PA13 */ +#define PORT_PA13 (_UL_(1) << 13) /**< \brief PORT Mask for PA13 */ +#define PIN_PA14 14 /**< \brief Pin Number for PA14 */ +#define PORT_PA14 (_UL_(1) << 14) /**< \brief PORT Mask for PA14 */ +#define PIN_PA15 15 /**< \brief Pin Number for PA15 */ +#define PORT_PA15 (_UL_(1) << 15) /**< \brief PORT Mask for PA15 */ +#define PIN_PA16 16 /**< \brief Pin Number for PA16 */ +#define PORT_PA16 (_UL_(1) << 16) /**< \brief PORT Mask for PA16 */ +#define PIN_PA17 17 /**< \brief Pin Number for PA17 */ +#define PORT_PA17 (_UL_(1) << 17) /**< \brief PORT Mask for PA17 */ +#define PIN_PA18 18 /**< \brief Pin Number for PA18 */ +#define PORT_PA18 (_UL_(1) << 18) /**< \brief PORT Mask for PA18 */ +#define PIN_PA19 19 /**< \brief Pin Number for PA19 */ +#define PORT_PA19 (_UL_(1) << 19) /**< \brief PORT Mask for PA19 */ +#define PIN_PA20 20 /**< \brief Pin Number for PA20 */ +#define PORT_PA20 (_UL_(1) << 20) /**< \brief PORT Mask for PA20 */ +#define PIN_PA21 21 /**< \brief Pin Number for PA21 */ +#define PORT_PA21 (_UL_(1) << 21) /**< \brief PORT Mask for PA21 */ +#define PIN_PA22 22 /**< \brief Pin Number for PA22 */ +#define PORT_PA22 (_UL_(1) << 22) /**< \brief PORT Mask for PA22 */ +#define PIN_PA23 23 /**< \brief Pin Number for PA23 */ +#define PORT_PA23 (_UL_(1) << 23) /**< \brief PORT Mask for PA23 */ +#define PIN_PA24 24 /**< \brief Pin Number for PA24 */ +#define PORT_PA24 (_UL_(1) << 24) /**< \brief PORT Mask for PA24 */ +#define PIN_PA25 25 /**< \brief Pin Number for PA25 */ +#define PORT_PA25 (_UL_(1) << 25) /**< \brief PORT Mask for PA25 */ +#define PIN_PA27 27 /**< \brief Pin Number for PA27 */ +#define PORT_PA27 (_UL_(1) << 27) /**< \brief PORT Mask for PA27 */ +#define PIN_PA30 30 /**< \brief Pin Number for PA30 */ +#define PORT_PA30 (_UL_(1) << 30) /**< \brief PORT Mask for PA30 */ +#define PIN_PA31 31 /**< \brief Pin Number for PA31 */ +#define PORT_PA31 (_UL_(1) << 31) /**< \brief PORT Mask for PA31 */ +#define PIN_PB00 32 /**< \brief Pin Number for PB00 */ +#define PORT_PB00 (_UL_(1) << 0) /**< \brief PORT Mask for PB00 */ +#define PIN_PB01 33 /**< \brief Pin Number for PB01 */ +#define PORT_PB01 (_UL_(1) << 1) /**< \brief PORT Mask for PB01 */ +#define PIN_PB02 34 /**< \brief Pin Number for PB02 */ +#define PORT_PB02 (_UL_(1) << 2) /**< \brief PORT Mask for PB02 */ +#define PIN_PB03 35 /**< \brief Pin Number for PB03 */ +#define PORT_PB03 (_UL_(1) << 3) /**< \brief PORT Mask for PB03 */ +#define PIN_PB04 36 /**< \brief Pin Number for PB04 */ +#define PORT_PB04 (_UL_(1) << 4) /**< \brief PORT Mask for PB04 */ +#define PIN_PB05 37 /**< \brief Pin Number for PB05 */ +#define PORT_PB05 (_UL_(1) << 5) /**< \brief PORT Mask for PB05 */ +#define PIN_PB06 38 /**< \brief Pin Number for PB06 */ +#define PORT_PB06 (_UL_(1) << 6) /**< \brief PORT Mask for PB06 */ +#define PIN_PB07 39 /**< \brief Pin Number for PB07 */ +#define PORT_PB07 (_UL_(1) << 7) /**< \brief PORT Mask for PB07 */ +#define PIN_PB08 40 /**< \brief Pin Number for PB08 */ +#define PORT_PB08 (_UL_(1) << 8) /**< \brief PORT Mask for PB08 */ +#define PIN_PB09 41 /**< \brief Pin Number for PB09 */ +#define PORT_PB09 (_UL_(1) << 9) /**< \brief PORT Mask for PB09 */ +#define PIN_PB10 42 /**< \brief Pin Number for PB10 */ +#define PORT_PB10 (_UL_(1) << 10) /**< \brief PORT Mask for PB10 */ +#define PIN_PB11 43 /**< \brief Pin Number for PB11 */ +#define PORT_PB11 (_UL_(1) << 11) /**< \brief PORT Mask for PB11 */ +#define PIN_PB12 44 /**< \brief Pin Number for PB12 */ +#define PORT_PB12 (_UL_(1) << 12) /**< \brief PORT Mask for PB12 */ +#define PIN_PB13 45 /**< \brief Pin Number for PB13 */ +#define PORT_PB13 (_UL_(1) << 13) /**< \brief PORT Mask for PB13 */ +#define PIN_PB14 46 /**< \brief Pin Number for PB14 */ +#define PORT_PB14 (_UL_(1) << 14) /**< \brief PORT Mask for PB14 */ +#define PIN_PB15 47 /**< \brief Pin Number for PB15 */ +#define PORT_PB15 (_UL_(1) << 15) /**< \brief PORT Mask for PB15 */ +#define PIN_PB16 48 /**< \brief Pin Number for PB16 */ +#define PORT_PB16 (_UL_(1) << 16) /**< \brief PORT Mask for PB16 */ +#define PIN_PB17 49 /**< \brief Pin Number for PB17 */ +#define PORT_PB17 (_UL_(1) << 17) /**< \brief PORT Mask for PB17 */ +#define PIN_PB22 54 /**< \brief Pin Number for PB22 */ +#define PORT_PB22 (_UL_(1) << 22) /**< \brief PORT Mask for PB22 */ +#define PIN_PB23 55 /**< \brief Pin Number for PB23 */ +#define PORT_PB23 (_UL_(1) << 23) /**< \brief PORT Mask for PB23 */ +#define PIN_PB30 62 /**< \brief Pin Number for PB30 */ +#define PORT_PB30 (_UL_(1) << 30) /**< \brief PORT Mask for PB30 */ +#define PIN_PB31 63 /**< \brief Pin Number for PB31 */ +#define PORT_PB31 (_UL_(1) << 31) /**< \brief PORT Mask for PB31 */ +/* ========== PORT definition for CM4 peripheral ========== */ +#define PIN_PA30H_CM4_SWCLK _L_(30) /**< \brief CM4 signal: SWCLK on PA30 mux H */ +#define MUX_PA30H_CM4_SWCLK _L_(7) +#define PINMUX_PA30H_CM4_SWCLK ((PIN_PA30H_CM4_SWCLK << 16) | MUX_PA30H_CM4_SWCLK) +#define PORT_PA30H_CM4_SWCLK (_UL_(1) << 30) +#define PIN_PB30H_CM4_SWO _L_(62) /**< \brief CM4 signal: SWO on PB30 mux H */ +#define MUX_PB30H_CM4_SWO _L_(7) +#define PINMUX_PB30H_CM4_SWO ((PIN_PB30H_CM4_SWO << 16) | MUX_PB30H_CM4_SWO) +#define PORT_PB30H_CM4_SWO (_UL_(1) << 30) +/* ========== PORT definition for ANAREF peripheral ========== */ +#define PIN_PA03B_ANAREF_VREF0 _L_(3) /**< \brief ANAREF signal: VREF0 on PA03 mux B */ +#define MUX_PA03B_ANAREF_VREF0 _L_(1) +#define PINMUX_PA03B_ANAREF_VREF0 ((PIN_PA03B_ANAREF_VREF0 << 16) | MUX_PA03B_ANAREF_VREF0) +#define PORT_PA03B_ANAREF_VREF0 (_UL_(1) << 3) +#define PIN_PA04B_ANAREF_VREF1 _L_(4) /**< \brief ANAREF signal: VREF1 on PA04 mux B */ +#define MUX_PA04B_ANAREF_VREF1 _L_(1) +#define PINMUX_PA04B_ANAREF_VREF1 ((PIN_PA04B_ANAREF_VREF1 << 16) | MUX_PA04B_ANAREF_VREF1) +#define PORT_PA04B_ANAREF_VREF1 (_UL_(1) << 4) +#define PIN_PA06B_ANAREF_VREF2 _L_(6) /**< \brief ANAREF signal: VREF2 on PA06 mux B */ +#define MUX_PA06B_ANAREF_VREF2 _L_(1) +#define PINMUX_PA06B_ANAREF_VREF2 ((PIN_PA06B_ANAREF_VREF2 << 16) | MUX_PA06B_ANAREF_VREF2) +#define PORT_PA06B_ANAREF_VREF2 (_UL_(1) << 6) +/* ========== PORT definition for GCLK peripheral ========== */ +#define PIN_PA30M_GCLK_IO0 _L_(30) /**< \brief GCLK signal: IO0 on PA30 mux M */ +#define MUX_PA30M_GCLK_IO0 _L_(12) +#define PINMUX_PA30M_GCLK_IO0 ((PIN_PA30M_GCLK_IO0 << 16) | MUX_PA30M_GCLK_IO0) +#define PORT_PA30M_GCLK_IO0 (_UL_(1) << 30) +#define PIN_PB14M_GCLK_IO0 _L_(46) /**< \brief GCLK signal: IO0 on PB14 mux M */ +#define MUX_PB14M_GCLK_IO0 _L_(12) +#define PINMUX_PB14M_GCLK_IO0 ((PIN_PB14M_GCLK_IO0 << 16) | MUX_PB14M_GCLK_IO0) +#define PORT_PB14M_GCLK_IO0 (_UL_(1) << 14) +#define PIN_PA14M_GCLK_IO0 _L_(14) /**< \brief GCLK signal: IO0 on PA14 mux M */ +#define MUX_PA14M_GCLK_IO0 _L_(12) +#define PINMUX_PA14M_GCLK_IO0 ((PIN_PA14M_GCLK_IO0 << 16) | MUX_PA14M_GCLK_IO0) +#define PORT_PA14M_GCLK_IO0 (_UL_(1) << 14) +#define PIN_PB22M_GCLK_IO0 _L_(54) /**< \brief GCLK signal: IO0 on PB22 mux M */ +#define MUX_PB22M_GCLK_IO0 _L_(12) +#define PINMUX_PB22M_GCLK_IO0 ((PIN_PB22M_GCLK_IO0 << 16) | MUX_PB22M_GCLK_IO0) +#define PORT_PB22M_GCLK_IO0 (_UL_(1) << 22) +#define PIN_PB15M_GCLK_IO1 _L_(47) /**< \brief GCLK signal: IO1 on PB15 mux M */ +#define MUX_PB15M_GCLK_IO1 _L_(12) +#define PINMUX_PB15M_GCLK_IO1 ((PIN_PB15M_GCLK_IO1 << 16) | MUX_PB15M_GCLK_IO1) +#define PORT_PB15M_GCLK_IO1 (_UL_(1) << 15) +#define PIN_PA15M_GCLK_IO1 _L_(15) /**< \brief GCLK signal: IO1 on PA15 mux M */ +#define MUX_PA15M_GCLK_IO1 _L_(12) +#define PINMUX_PA15M_GCLK_IO1 ((PIN_PA15M_GCLK_IO1 << 16) | MUX_PA15M_GCLK_IO1) +#define PORT_PA15M_GCLK_IO1 (_UL_(1) << 15) +#define PIN_PB23M_GCLK_IO1 _L_(55) /**< \brief GCLK signal: IO1 on PB23 mux M */ +#define MUX_PB23M_GCLK_IO1 _L_(12) +#define PINMUX_PB23M_GCLK_IO1 ((PIN_PB23M_GCLK_IO1 << 16) | MUX_PB23M_GCLK_IO1) +#define PORT_PB23M_GCLK_IO1 (_UL_(1) << 23) +#define PIN_PA27M_GCLK_IO1 _L_(27) /**< \brief GCLK signal: IO1 on PA27 mux M */ +#define MUX_PA27M_GCLK_IO1 _L_(12) +#define PINMUX_PA27M_GCLK_IO1 ((PIN_PA27M_GCLK_IO1 << 16) | MUX_PA27M_GCLK_IO1) +#define PORT_PA27M_GCLK_IO1 (_UL_(1) << 27) +#define PIN_PA16M_GCLK_IO2 _L_(16) /**< \brief GCLK signal: IO2 on PA16 mux M */ +#define MUX_PA16M_GCLK_IO2 _L_(12) +#define PINMUX_PA16M_GCLK_IO2 ((PIN_PA16M_GCLK_IO2 << 16) | MUX_PA16M_GCLK_IO2) +#define PORT_PA16M_GCLK_IO2 (_UL_(1) << 16) +#define PIN_PB16M_GCLK_IO2 _L_(48) /**< \brief GCLK signal: IO2 on PB16 mux M */ +#define MUX_PB16M_GCLK_IO2 _L_(12) +#define PINMUX_PB16M_GCLK_IO2 ((PIN_PB16M_GCLK_IO2 << 16) | MUX_PB16M_GCLK_IO2) +#define PORT_PB16M_GCLK_IO2 (_UL_(1) << 16) +#define PIN_PA17M_GCLK_IO3 _L_(17) /**< \brief GCLK signal: IO3 on PA17 mux M */ +#define MUX_PA17M_GCLK_IO3 _L_(12) +#define PINMUX_PA17M_GCLK_IO3 ((PIN_PA17M_GCLK_IO3 << 16) | MUX_PA17M_GCLK_IO3) +#define PORT_PA17M_GCLK_IO3 (_UL_(1) << 17) +#define PIN_PB17M_GCLK_IO3 _L_(49) /**< \brief GCLK signal: IO3 on PB17 mux M */ +#define MUX_PB17M_GCLK_IO3 _L_(12) +#define PINMUX_PB17M_GCLK_IO3 ((PIN_PB17M_GCLK_IO3 << 16) | MUX_PB17M_GCLK_IO3) +#define PORT_PB17M_GCLK_IO3 (_UL_(1) << 17) +#define PIN_PA10M_GCLK_IO4 _L_(10) /**< \brief GCLK signal: IO4 on PA10 mux M */ +#define MUX_PA10M_GCLK_IO4 _L_(12) +#define PINMUX_PA10M_GCLK_IO4 ((PIN_PA10M_GCLK_IO4 << 16) | MUX_PA10M_GCLK_IO4) +#define PORT_PA10M_GCLK_IO4 (_UL_(1) << 10) +#define PIN_PB10M_GCLK_IO4 _L_(42) /**< \brief GCLK signal: IO4 on PB10 mux M */ +#define MUX_PB10M_GCLK_IO4 _L_(12) +#define PINMUX_PB10M_GCLK_IO4 ((PIN_PB10M_GCLK_IO4 << 16) | MUX_PB10M_GCLK_IO4) +#define PORT_PB10M_GCLK_IO4 (_UL_(1) << 10) +#define PIN_PA11M_GCLK_IO5 _L_(11) /**< \brief GCLK signal: IO5 on PA11 mux M */ +#define MUX_PA11M_GCLK_IO5 _L_(12) +#define PINMUX_PA11M_GCLK_IO5 ((PIN_PA11M_GCLK_IO5 << 16) | MUX_PA11M_GCLK_IO5) +#define PORT_PA11M_GCLK_IO5 (_UL_(1) << 11) +#define PIN_PB11M_GCLK_IO5 _L_(43) /**< \brief GCLK signal: IO5 on PB11 mux M */ +#define MUX_PB11M_GCLK_IO5 _L_(12) +#define PINMUX_PB11M_GCLK_IO5 ((PIN_PB11M_GCLK_IO5 << 16) | MUX_PB11M_GCLK_IO5) +#define PORT_PB11M_GCLK_IO5 (_UL_(1) << 11) +#define PIN_PB12M_GCLK_IO6 _L_(44) /**< \brief GCLK signal: IO6 on PB12 mux M */ +#define MUX_PB12M_GCLK_IO6 _L_(12) +#define PINMUX_PB12M_GCLK_IO6 ((PIN_PB12M_GCLK_IO6 << 16) | MUX_PB12M_GCLK_IO6) +#define PORT_PB12M_GCLK_IO6 (_UL_(1) << 12) +#define PIN_PB13M_GCLK_IO7 _L_(45) /**< \brief GCLK signal: IO7 on PB13 mux M */ +#define MUX_PB13M_GCLK_IO7 _L_(12) +#define PINMUX_PB13M_GCLK_IO7 ((PIN_PB13M_GCLK_IO7 << 16) | MUX_PB13M_GCLK_IO7) +#define PORT_PB13M_GCLK_IO7 (_UL_(1) << 13) +/* ========== PORT definition for EIC peripheral ========== */ +#define PIN_PA00A_EIC_EXTINT0 _L_(0) /**< \brief EIC signal: EXTINT0 on PA00 mux A */ +#define MUX_PA00A_EIC_EXTINT0 _L_(0) +#define PINMUX_PA00A_EIC_EXTINT0 ((PIN_PA00A_EIC_EXTINT0 << 16) | MUX_PA00A_EIC_EXTINT0) +#define PORT_PA00A_EIC_EXTINT0 (_UL_(1) << 0) +#define PIN_PA00A_EIC_EXTINT_NUM _L_(0) /**< \brief EIC signal: PIN_PA00 External Interrupt Line */ +#define PIN_PA16A_EIC_EXTINT0 _L_(16) /**< \brief EIC signal: EXTINT0 on PA16 mux A */ +#define MUX_PA16A_EIC_EXTINT0 _L_(0) +#define PINMUX_PA16A_EIC_EXTINT0 ((PIN_PA16A_EIC_EXTINT0 << 16) | MUX_PA16A_EIC_EXTINT0) +#define PORT_PA16A_EIC_EXTINT0 (_UL_(1) << 16) +#define PIN_PA16A_EIC_EXTINT_NUM _L_(0) /**< \brief EIC signal: PIN_PA16 External Interrupt Line */ +#define PIN_PB00A_EIC_EXTINT0 _L_(32) /**< \brief EIC signal: EXTINT0 on PB00 mux A */ +#define MUX_PB00A_EIC_EXTINT0 _L_(0) +#define PINMUX_PB00A_EIC_EXTINT0 ((PIN_PB00A_EIC_EXTINT0 << 16) | MUX_PB00A_EIC_EXTINT0) +#define PORT_PB00A_EIC_EXTINT0 (_UL_(1) << 0) +#define PIN_PB00A_EIC_EXTINT_NUM _L_(0) /**< \brief EIC signal: PIN_PB00 External Interrupt Line */ +#define PIN_PB16A_EIC_EXTINT0 _L_(48) /**< \brief EIC signal: EXTINT0 on PB16 mux A */ +#define MUX_PB16A_EIC_EXTINT0 _L_(0) +#define PINMUX_PB16A_EIC_EXTINT0 ((PIN_PB16A_EIC_EXTINT0 << 16) | MUX_PB16A_EIC_EXTINT0) +#define PORT_PB16A_EIC_EXTINT0 (_UL_(1) << 16) +#define PIN_PB16A_EIC_EXTINT_NUM _L_(0) /**< \brief EIC signal: PIN_PB16 External Interrupt Line */ +#define PIN_PA01A_EIC_EXTINT1 _L_(1) /**< \brief EIC signal: EXTINT1 on PA01 mux A */ +#define MUX_PA01A_EIC_EXTINT1 _L_(0) +#define PINMUX_PA01A_EIC_EXTINT1 ((PIN_PA01A_EIC_EXTINT1 << 16) | MUX_PA01A_EIC_EXTINT1) +#define PORT_PA01A_EIC_EXTINT1 (_UL_(1) << 1) +#define PIN_PA01A_EIC_EXTINT_NUM _L_(1) /**< \brief EIC signal: PIN_PA01 External Interrupt Line */ +#define PIN_PA17A_EIC_EXTINT1 _L_(17) /**< \brief EIC signal: EXTINT1 on PA17 mux A */ +#define MUX_PA17A_EIC_EXTINT1 _L_(0) +#define PINMUX_PA17A_EIC_EXTINT1 ((PIN_PA17A_EIC_EXTINT1 << 16) | MUX_PA17A_EIC_EXTINT1) +#define PORT_PA17A_EIC_EXTINT1 (_UL_(1) << 17) +#define PIN_PA17A_EIC_EXTINT_NUM _L_(1) /**< \brief EIC signal: PIN_PA17 External Interrupt Line */ +#define PIN_PB01A_EIC_EXTINT1 _L_(33) /**< \brief EIC signal: EXTINT1 on PB01 mux A */ +#define MUX_PB01A_EIC_EXTINT1 _L_(0) +#define PINMUX_PB01A_EIC_EXTINT1 ((PIN_PB01A_EIC_EXTINT1 << 16) | MUX_PB01A_EIC_EXTINT1) +#define PORT_PB01A_EIC_EXTINT1 (_UL_(1) << 1) +#define PIN_PB01A_EIC_EXTINT_NUM _L_(1) /**< \brief EIC signal: PIN_PB01 External Interrupt Line */ +#define PIN_PB17A_EIC_EXTINT1 _L_(49) /**< \brief EIC signal: EXTINT1 on PB17 mux A */ +#define MUX_PB17A_EIC_EXTINT1 _L_(0) +#define PINMUX_PB17A_EIC_EXTINT1 ((PIN_PB17A_EIC_EXTINT1 << 16) | MUX_PB17A_EIC_EXTINT1) +#define PORT_PB17A_EIC_EXTINT1 (_UL_(1) << 17) +#define PIN_PB17A_EIC_EXTINT_NUM _L_(1) /**< \brief EIC signal: PIN_PB17 External Interrupt Line */ +#define PIN_PA02A_EIC_EXTINT2 _L_(2) /**< \brief EIC signal: EXTINT2 on PA02 mux A */ +#define MUX_PA02A_EIC_EXTINT2 _L_(0) +#define PINMUX_PA02A_EIC_EXTINT2 ((PIN_PA02A_EIC_EXTINT2 << 16) | MUX_PA02A_EIC_EXTINT2) +#define PORT_PA02A_EIC_EXTINT2 (_UL_(1) << 2) +#define PIN_PA02A_EIC_EXTINT_NUM _L_(2) /**< \brief EIC signal: PIN_PA02 External Interrupt Line */ +#define PIN_PA18A_EIC_EXTINT2 _L_(18) /**< \brief EIC signal: EXTINT2 on PA18 mux A */ +#define MUX_PA18A_EIC_EXTINT2 _L_(0) +#define PINMUX_PA18A_EIC_EXTINT2 ((PIN_PA18A_EIC_EXTINT2 << 16) | MUX_PA18A_EIC_EXTINT2) +#define PORT_PA18A_EIC_EXTINT2 (_UL_(1) << 18) +#define PIN_PA18A_EIC_EXTINT_NUM _L_(2) /**< \brief EIC signal: PIN_PA18 External Interrupt Line */ +#define PIN_PB02A_EIC_EXTINT2 _L_(34) /**< \brief EIC signal: EXTINT2 on PB02 mux A */ +#define MUX_PB02A_EIC_EXTINT2 _L_(0) +#define PINMUX_PB02A_EIC_EXTINT2 ((PIN_PB02A_EIC_EXTINT2 << 16) | MUX_PB02A_EIC_EXTINT2) +#define PORT_PB02A_EIC_EXTINT2 (_UL_(1) << 2) +#define PIN_PB02A_EIC_EXTINT_NUM _L_(2) /**< \brief EIC signal: PIN_PB02 External Interrupt Line */ +#define PIN_PA03A_EIC_EXTINT3 _L_(3) /**< \brief EIC signal: EXTINT3 on PA03 mux A */ +#define MUX_PA03A_EIC_EXTINT3 _L_(0) +#define PINMUX_PA03A_EIC_EXTINT3 ((PIN_PA03A_EIC_EXTINT3 << 16) | MUX_PA03A_EIC_EXTINT3) +#define PORT_PA03A_EIC_EXTINT3 (_UL_(1) << 3) +#define PIN_PA03A_EIC_EXTINT_NUM _L_(3) /**< \brief EIC signal: PIN_PA03 External Interrupt Line */ +#define PIN_PA19A_EIC_EXTINT3 _L_(19) /**< \brief EIC signal: EXTINT3 on PA19 mux A */ +#define MUX_PA19A_EIC_EXTINT3 _L_(0) +#define PINMUX_PA19A_EIC_EXTINT3 ((PIN_PA19A_EIC_EXTINT3 << 16) | MUX_PA19A_EIC_EXTINT3) +#define PORT_PA19A_EIC_EXTINT3 (_UL_(1) << 19) +#define PIN_PA19A_EIC_EXTINT_NUM _L_(3) /**< \brief EIC signal: PIN_PA19 External Interrupt Line */ +#define PIN_PB03A_EIC_EXTINT3 _L_(35) /**< \brief EIC signal: EXTINT3 on PB03 mux A */ +#define MUX_PB03A_EIC_EXTINT3 _L_(0) +#define PINMUX_PB03A_EIC_EXTINT3 ((PIN_PB03A_EIC_EXTINT3 << 16) | MUX_PB03A_EIC_EXTINT3) +#define PORT_PB03A_EIC_EXTINT3 (_UL_(1) << 3) +#define PIN_PB03A_EIC_EXTINT_NUM _L_(3) /**< \brief EIC signal: PIN_PB03 External Interrupt Line */ +#define PIN_PA04A_EIC_EXTINT4 _L_(4) /**< \brief EIC signal: EXTINT4 on PA04 mux A */ +#define MUX_PA04A_EIC_EXTINT4 _L_(0) +#define PINMUX_PA04A_EIC_EXTINT4 ((PIN_PA04A_EIC_EXTINT4 << 16) | MUX_PA04A_EIC_EXTINT4) +#define PORT_PA04A_EIC_EXTINT4 (_UL_(1) << 4) +#define PIN_PA04A_EIC_EXTINT_NUM _L_(4) /**< \brief EIC signal: PIN_PA04 External Interrupt Line */ +#define PIN_PA20A_EIC_EXTINT4 _L_(20) /**< \brief EIC signal: EXTINT4 on PA20 mux A */ +#define MUX_PA20A_EIC_EXTINT4 _L_(0) +#define PINMUX_PA20A_EIC_EXTINT4 ((PIN_PA20A_EIC_EXTINT4 << 16) | MUX_PA20A_EIC_EXTINT4) +#define PORT_PA20A_EIC_EXTINT4 (_UL_(1) << 20) +#define PIN_PA20A_EIC_EXTINT_NUM _L_(4) /**< \brief EIC signal: PIN_PA20 External Interrupt Line */ +#define PIN_PB04A_EIC_EXTINT4 _L_(36) /**< \brief EIC signal: EXTINT4 on PB04 mux A */ +#define MUX_PB04A_EIC_EXTINT4 _L_(0) +#define PINMUX_PB04A_EIC_EXTINT4 ((PIN_PB04A_EIC_EXTINT4 << 16) | MUX_PB04A_EIC_EXTINT4) +#define PORT_PB04A_EIC_EXTINT4 (_UL_(1) << 4) +#define PIN_PB04A_EIC_EXTINT_NUM _L_(4) /**< \brief EIC signal: PIN_PB04 External Interrupt Line */ +#define PIN_PA05A_EIC_EXTINT5 _L_(5) /**< \brief EIC signal: EXTINT5 on PA05 mux A */ +#define MUX_PA05A_EIC_EXTINT5 _L_(0) +#define PINMUX_PA05A_EIC_EXTINT5 ((PIN_PA05A_EIC_EXTINT5 << 16) | MUX_PA05A_EIC_EXTINT5) +#define PORT_PA05A_EIC_EXTINT5 (_UL_(1) << 5) +#define PIN_PA05A_EIC_EXTINT_NUM _L_(5) /**< \brief EIC signal: PIN_PA05 External Interrupt Line */ +#define PIN_PA21A_EIC_EXTINT5 _L_(21) /**< \brief EIC signal: EXTINT5 on PA21 mux A */ +#define MUX_PA21A_EIC_EXTINT5 _L_(0) +#define PINMUX_PA21A_EIC_EXTINT5 ((PIN_PA21A_EIC_EXTINT5 << 16) | MUX_PA21A_EIC_EXTINT5) +#define PORT_PA21A_EIC_EXTINT5 (_UL_(1) << 21) +#define PIN_PA21A_EIC_EXTINT_NUM _L_(5) /**< \brief EIC signal: PIN_PA21 External Interrupt Line */ +#define PIN_PB05A_EIC_EXTINT5 _L_(37) /**< \brief EIC signal: EXTINT5 on PB05 mux A */ +#define MUX_PB05A_EIC_EXTINT5 _L_(0) +#define PINMUX_PB05A_EIC_EXTINT5 ((PIN_PB05A_EIC_EXTINT5 << 16) | MUX_PB05A_EIC_EXTINT5) +#define PORT_PB05A_EIC_EXTINT5 (_UL_(1) << 5) +#define PIN_PB05A_EIC_EXTINT_NUM _L_(5) /**< \brief EIC signal: PIN_PB05 External Interrupt Line */ +#define PIN_PA06A_EIC_EXTINT6 _L_(6) /**< \brief EIC signal: EXTINT6 on PA06 mux A */ +#define MUX_PA06A_EIC_EXTINT6 _L_(0) +#define PINMUX_PA06A_EIC_EXTINT6 ((PIN_PA06A_EIC_EXTINT6 << 16) | MUX_PA06A_EIC_EXTINT6) +#define PORT_PA06A_EIC_EXTINT6 (_UL_(1) << 6) +#define PIN_PA06A_EIC_EXTINT_NUM _L_(6) /**< \brief EIC signal: PIN_PA06 External Interrupt Line */ +#define PIN_PA22A_EIC_EXTINT6 _L_(22) /**< \brief EIC signal: EXTINT6 on PA22 mux A */ +#define MUX_PA22A_EIC_EXTINT6 _L_(0) +#define PINMUX_PA22A_EIC_EXTINT6 ((PIN_PA22A_EIC_EXTINT6 << 16) | MUX_PA22A_EIC_EXTINT6) +#define PORT_PA22A_EIC_EXTINT6 (_UL_(1) << 22) +#define PIN_PA22A_EIC_EXTINT_NUM _L_(6) /**< \brief EIC signal: PIN_PA22 External Interrupt Line */ +#define PIN_PB06A_EIC_EXTINT6 _L_(38) /**< \brief EIC signal: EXTINT6 on PB06 mux A */ +#define MUX_PB06A_EIC_EXTINT6 _L_(0) +#define PINMUX_PB06A_EIC_EXTINT6 ((PIN_PB06A_EIC_EXTINT6 << 16) | MUX_PB06A_EIC_EXTINT6) +#define PORT_PB06A_EIC_EXTINT6 (_UL_(1) << 6) +#define PIN_PB06A_EIC_EXTINT_NUM _L_(6) /**< \brief EIC signal: PIN_PB06 External Interrupt Line */ +#define PIN_PB22A_EIC_EXTINT6 _L_(54) /**< \brief EIC signal: EXTINT6 on PB22 mux A */ +#define MUX_PB22A_EIC_EXTINT6 _L_(0) +#define PINMUX_PB22A_EIC_EXTINT6 ((PIN_PB22A_EIC_EXTINT6 << 16) | MUX_PB22A_EIC_EXTINT6) +#define PORT_PB22A_EIC_EXTINT6 (_UL_(1) << 22) +#define PIN_PB22A_EIC_EXTINT_NUM _L_(6) /**< \brief EIC signal: PIN_PB22 External Interrupt Line */ +#define PIN_PA07A_EIC_EXTINT7 _L_(7) /**< \brief EIC signal: EXTINT7 on PA07 mux A */ +#define MUX_PA07A_EIC_EXTINT7 _L_(0) +#define PINMUX_PA07A_EIC_EXTINT7 ((PIN_PA07A_EIC_EXTINT7 << 16) | MUX_PA07A_EIC_EXTINT7) +#define PORT_PA07A_EIC_EXTINT7 (_UL_(1) << 7) +#define PIN_PA07A_EIC_EXTINT_NUM _L_(7) /**< \brief EIC signal: PIN_PA07 External Interrupt Line */ +#define PIN_PA23A_EIC_EXTINT7 _L_(23) /**< \brief EIC signal: EXTINT7 on PA23 mux A */ +#define MUX_PA23A_EIC_EXTINT7 _L_(0) +#define PINMUX_PA23A_EIC_EXTINT7 ((PIN_PA23A_EIC_EXTINT7 << 16) | MUX_PA23A_EIC_EXTINT7) +#define PORT_PA23A_EIC_EXTINT7 (_UL_(1) << 23) +#define PIN_PA23A_EIC_EXTINT_NUM _L_(7) /**< \brief EIC signal: PIN_PA23 External Interrupt Line */ +#define PIN_PB07A_EIC_EXTINT7 _L_(39) /**< \brief EIC signal: EXTINT7 on PB07 mux A */ +#define MUX_PB07A_EIC_EXTINT7 _L_(0) +#define PINMUX_PB07A_EIC_EXTINT7 ((PIN_PB07A_EIC_EXTINT7 << 16) | MUX_PB07A_EIC_EXTINT7) +#define PORT_PB07A_EIC_EXTINT7 (_UL_(1) << 7) +#define PIN_PB07A_EIC_EXTINT_NUM _L_(7) /**< \brief EIC signal: PIN_PB07 External Interrupt Line */ +#define PIN_PB23A_EIC_EXTINT7 _L_(55) /**< \brief EIC signal: EXTINT7 on PB23 mux A */ +#define MUX_PB23A_EIC_EXTINT7 _L_(0) +#define PINMUX_PB23A_EIC_EXTINT7 ((PIN_PB23A_EIC_EXTINT7 << 16) | MUX_PB23A_EIC_EXTINT7) +#define PORT_PB23A_EIC_EXTINT7 (_UL_(1) << 23) +#define PIN_PB23A_EIC_EXTINT_NUM _L_(7) /**< \brief EIC signal: PIN_PB23 External Interrupt Line */ +#define PIN_PA24A_EIC_EXTINT8 _L_(24) /**< \brief EIC signal: EXTINT8 on PA24 mux A */ +#define MUX_PA24A_EIC_EXTINT8 _L_(0) +#define PINMUX_PA24A_EIC_EXTINT8 ((PIN_PA24A_EIC_EXTINT8 << 16) | MUX_PA24A_EIC_EXTINT8) +#define PORT_PA24A_EIC_EXTINT8 (_UL_(1) << 24) +#define PIN_PA24A_EIC_EXTINT_NUM _L_(8) /**< \brief EIC signal: PIN_PA24 External Interrupt Line */ +#define PIN_PB08A_EIC_EXTINT8 _L_(40) /**< \brief EIC signal: EXTINT8 on PB08 mux A */ +#define MUX_PB08A_EIC_EXTINT8 _L_(0) +#define PINMUX_PB08A_EIC_EXTINT8 ((PIN_PB08A_EIC_EXTINT8 << 16) | MUX_PB08A_EIC_EXTINT8) +#define PORT_PB08A_EIC_EXTINT8 (_UL_(1) << 8) +#define PIN_PB08A_EIC_EXTINT_NUM _L_(8) /**< \brief EIC signal: PIN_PB08 External Interrupt Line */ +#define PIN_PA09A_EIC_EXTINT9 _L_(9) /**< \brief EIC signal: EXTINT9 on PA09 mux A */ +#define MUX_PA09A_EIC_EXTINT9 _L_(0) +#define PINMUX_PA09A_EIC_EXTINT9 ((PIN_PA09A_EIC_EXTINT9 << 16) | MUX_PA09A_EIC_EXTINT9) +#define PORT_PA09A_EIC_EXTINT9 (_UL_(1) << 9) +#define PIN_PA09A_EIC_EXTINT_NUM _L_(9) /**< \brief EIC signal: PIN_PA09 External Interrupt Line */ +#define PIN_PA25A_EIC_EXTINT9 _L_(25) /**< \brief EIC signal: EXTINT9 on PA25 mux A */ +#define MUX_PA25A_EIC_EXTINT9 _L_(0) +#define PINMUX_PA25A_EIC_EXTINT9 ((PIN_PA25A_EIC_EXTINT9 << 16) | MUX_PA25A_EIC_EXTINT9) +#define PORT_PA25A_EIC_EXTINT9 (_UL_(1) << 25) +#define PIN_PA25A_EIC_EXTINT_NUM _L_(9) /**< \brief EIC signal: PIN_PA25 External Interrupt Line */ +#define PIN_PB09A_EIC_EXTINT9 _L_(41) /**< \brief EIC signal: EXTINT9 on PB09 mux A */ +#define MUX_PB09A_EIC_EXTINT9 _L_(0) +#define PINMUX_PB09A_EIC_EXTINT9 ((PIN_PB09A_EIC_EXTINT9 << 16) | MUX_PB09A_EIC_EXTINT9) +#define PORT_PB09A_EIC_EXTINT9 (_UL_(1) << 9) +#define PIN_PB09A_EIC_EXTINT_NUM _L_(9) /**< \brief EIC signal: PIN_PB09 External Interrupt Line */ +#define PIN_PA10A_EIC_EXTINT10 _L_(10) /**< \brief EIC signal: EXTINT10 on PA10 mux A */ +#define MUX_PA10A_EIC_EXTINT10 _L_(0) +#define PINMUX_PA10A_EIC_EXTINT10 ((PIN_PA10A_EIC_EXTINT10 << 16) | MUX_PA10A_EIC_EXTINT10) +#define PORT_PA10A_EIC_EXTINT10 (_UL_(1) << 10) +#define PIN_PA10A_EIC_EXTINT_NUM _L_(10) /**< \brief EIC signal: PIN_PA10 External Interrupt Line */ +#define PIN_PB10A_EIC_EXTINT10 _L_(42) /**< \brief EIC signal: EXTINT10 on PB10 mux A */ +#define MUX_PB10A_EIC_EXTINT10 _L_(0) +#define PINMUX_PB10A_EIC_EXTINT10 ((PIN_PB10A_EIC_EXTINT10 << 16) | MUX_PB10A_EIC_EXTINT10) +#define PORT_PB10A_EIC_EXTINT10 (_UL_(1) << 10) +#define PIN_PB10A_EIC_EXTINT_NUM _L_(10) /**< \brief EIC signal: PIN_PB10 External Interrupt Line */ +#define PIN_PA11A_EIC_EXTINT11 _L_(11) /**< \brief EIC signal: EXTINT11 on PA11 mux A */ +#define MUX_PA11A_EIC_EXTINT11 _L_(0) +#define PINMUX_PA11A_EIC_EXTINT11 ((PIN_PA11A_EIC_EXTINT11 << 16) | MUX_PA11A_EIC_EXTINT11) +#define PORT_PA11A_EIC_EXTINT11 (_UL_(1) << 11) +#define PIN_PA11A_EIC_EXTINT_NUM _L_(11) /**< \brief EIC signal: PIN_PA11 External Interrupt Line */ +#define PIN_PA27A_EIC_EXTINT11 _L_(27) /**< \brief EIC signal: EXTINT11 on PA27 mux A */ +#define MUX_PA27A_EIC_EXTINT11 _L_(0) +#define PINMUX_PA27A_EIC_EXTINT11 ((PIN_PA27A_EIC_EXTINT11 << 16) | MUX_PA27A_EIC_EXTINT11) +#define PORT_PA27A_EIC_EXTINT11 (_UL_(1) << 27) +#define PIN_PA27A_EIC_EXTINT_NUM _L_(11) /**< \brief EIC signal: PIN_PA27 External Interrupt Line */ +#define PIN_PB11A_EIC_EXTINT11 _L_(43) /**< \brief EIC signal: EXTINT11 on PB11 mux A */ +#define MUX_PB11A_EIC_EXTINT11 _L_(0) +#define PINMUX_PB11A_EIC_EXTINT11 ((PIN_PB11A_EIC_EXTINT11 << 16) | MUX_PB11A_EIC_EXTINT11) +#define PORT_PB11A_EIC_EXTINT11 (_UL_(1) << 11) +#define PIN_PB11A_EIC_EXTINT_NUM _L_(11) /**< \brief EIC signal: PIN_PB11 External Interrupt Line */ +#define PIN_PA12A_EIC_EXTINT12 _L_(12) /**< \brief EIC signal: EXTINT12 on PA12 mux A */ +#define MUX_PA12A_EIC_EXTINT12 _L_(0) +#define PINMUX_PA12A_EIC_EXTINT12 ((PIN_PA12A_EIC_EXTINT12 << 16) | MUX_PA12A_EIC_EXTINT12) +#define PORT_PA12A_EIC_EXTINT12 (_UL_(1) << 12) +#define PIN_PA12A_EIC_EXTINT_NUM _L_(12) /**< \brief EIC signal: PIN_PA12 External Interrupt Line */ +#define PIN_PB12A_EIC_EXTINT12 _L_(44) /**< \brief EIC signal: EXTINT12 on PB12 mux A */ +#define MUX_PB12A_EIC_EXTINT12 _L_(0) +#define PINMUX_PB12A_EIC_EXTINT12 ((PIN_PB12A_EIC_EXTINT12 << 16) | MUX_PB12A_EIC_EXTINT12) +#define PORT_PB12A_EIC_EXTINT12 (_UL_(1) << 12) +#define PIN_PB12A_EIC_EXTINT_NUM _L_(12) /**< \brief EIC signal: PIN_PB12 External Interrupt Line */ +#define PIN_PA13A_EIC_EXTINT13 _L_(13) /**< \brief EIC signal: EXTINT13 on PA13 mux A */ +#define MUX_PA13A_EIC_EXTINT13 _L_(0) +#define PINMUX_PA13A_EIC_EXTINT13 ((PIN_PA13A_EIC_EXTINT13 << 16) | MUX_PA13A_EIC_EXTINT13) +#define PORT_PA13A_EIC_EXTINT13 (_UL_(1) << 13) +#define PIN_PA13A_EIC_EXTINT_NUM _L_(13) /**< \brief EIC signal: PIN_PA13 External Interrupt Line */ +#define PIN_PB13A_EIC_EXTINT13 _L_(45) /**< \brief EIC signal: EXTINT13 on PB13 mux A */ +#define MUX_PB13A_EIC_EXTINT13 _L_(0) +#define PINMUX_PB13A_EIC_EXTINT13 ((PIN_PB13A_EIC_EXTINT13 << 16) | MUX_PB13A_EIC_EXTINT13) +#define PORT_PB13A_EIC_EXTINT13 (_UL_(1) << 13) +#define PIN_PB13A_EIC_EXTINT_NUM _L_(13) /**< \brief EIC signal: PIN_PB13 External Interrupt Line */ +#define PIN_PA30A_EIC_EXTINT14 _L_(30) /**< \brief EIC signal: EXTINT14 on PA30 mux A */ +#define MUX_PA30A_EIC_EXTINT14 _L_(0) +#define PINMUX_PA30A_EIC_EXTINT14 ((PIN_PA30A_EIC_EXTINT14 << 16) | MUX_PA30A_EIC_EXTINT14) +#define PORT_PA30A_EIC_EXTINT14 (_UL_(1) << 30) +#define PIN_PA30A_EIC_EXTINT_NUM _L_(14) /**< \brief EIC signal: PIN_PA30 External Interrupt Line */ +#define PIN_PB14A_EIC_EXTINT14 _L_(46) /**< \brief EIC signal: EXTINT14 on PB14 mux A */ +#define MUX_PB14A_EIC_EXTINT14 _L_(0) +#define PINMUX_PB14A_EIC_EXTINT14 ((PIN_PB14A_EIC_EXTINT14 << 16) | MUX_PB14A_EIC_EXTINT14) +#define PORT_PB14A_EIC_EXTINT14 (_UL_(1) << 14) +#define PIN_PB14A_EIC_EXTINT_NUM _L_(14) /**< \brief EIC signal: PIN_PB14 External Interrupt Line */ +#define PIN_PB30A_EIC_EXTINT14 _L_(62) /**< \brief EIC signal: EXTINT14 on PB30 mux A */ +#define MUX_PB30A_EIC_EXTINT14 _L_(0) +#define PINMUX_PB30A_EIC_EXTINT14 ((PIN_PB30A_EIC_EXTINT14 << 16) | MUX_PB30A_EIC_EXTINT14) +#define PORT_PB30A_EIC_EXTINT14 (_UL_(1) << 30) +#define PIN_PB30A_EIC_EXTINT_NUM _L_(14) /**< \brief EIC signal: PIN_PB30 External Interrupt Line */ +#define PIN_PA14A_EIC_EXTINT14 _L_(14) /**< \brief EIC signal: EXTINT14 on PA14 mux A */ +#define MUX_PA14A_EIC_EXTINT14 _L_(0) +#define PINMUX_PA14A_EIC_EXTINT14 ((PIN_PA14A_EIC_EXTINT14 << 16) | MUX_PA14A_EIC_EXTINT14) +#define PORT_PA14A_EIC_EXTINT14 (_UL_(1) << 14) +#define PIN_PA14A_EIC_EXTINT_NUM _L_(14) /**< \brief EIC signal: PIN_PA14 External Interrupt Line */ +#define PIN_PA15A_EIC_EXTINT15 _L_(15) /**< \brief EIC signal: EXTINT15 on PA15 mux A */ +#define MUX_PA15A_EIC_EXTINT15 _L_(0) +#define PINMUX_PA15A_EIC_EXTINT15 ((PIN_PA15A_EIC_EXTINT15 << 16) | MUX_PA15A_EIC_EXTINT15) +#define PORT_PA15A_EIC_EXTINT15 (_UL_(1) << 15) +#define PIN_PA15A_EIC_EXTINT_NUM _L_(15) /**< \brief EIC signal: PIN_PA15 External Interrupt Line */ +#define PIN_PA31A_EIC_EXTINT15 _L_(31) /**< \brief EIC signal: EXTINT15 on PA31 mux A */ +#define MUX_PA31A_EIC_EXTINT15 _L_(0) +#define PINMUX_PA31A_EIC_EXTINT15 ((PIN_PA31A_EIC_EXTINT15 << 16) | MUX_PA31A_EIC_EXTINT15) +#define PORT_PA31A_EIC_EXTINT15 (_UL_(1) << 31) +#define PIN_PA31A_EIC_EXTINT_NUM _L_(15) /**< \brief EIC signal: PIN_PA31 External Interrupt Line */ +#define PIN_PB15A_EIC_EXTINT15 _L_(47) /**< \brief EIC signal: EXTINT15 on PB15 mux A */ +#define MUX_PB15A_EIC_EXTINT15 _L_(0) +#define PINMUX_PB15A_EIC_EXTINT15 ((PIN_PB15A_EIC_EXTINT15 << 16) | MUX_PB15A_EIC_EXTINT15) +#define PORT_PB15A_EIC_EXTINT15 (_UL_(1) << 15) +#define PIN_PB15A_EIC_EXTINT_NUM _L_(15) /**< \brief EIC signal: PIN_PB15 External Interrupt Line */ +#define PIN_PB31A_EIC_EXTINT15 _L_(63) /**< \brief EIC signal: EXTINT15 on PB31 mux A */ +#define MUX_PB31A_EIC_EXTINT15 _L_(0) +#define PINMUX_PB31A_EIC_EXTINT15 ((PIN_PB31A_EIC_EXTINT15 << 16) | MUX_PB31A_EIC_EXTINT15) +#define PORT_PB31A_EIC_EXTINT15 (_UL_(1) << 31) +#define PIN_PB31A_EIC_EXTINT_NUM _L_(15) /**< \brief EIC signal: PIN_PB31 External Interrupt Line */ +#define PIN_PA08A_EIC_NMI _L_(8) /**< \brief EIC signal: NMI on PA08 mux A */ +#define MUX_PA08A_EIC_NMI _L_(0) +#define PINMUX_PA08A_EIC_NMI ((PIN_PA08A_EIC_NMI << 16) | MUX_PA08A_EIC_NMI) +#define PORT_PA08A_EIC_NMI (_UL_(1) << 8) +/* ========== PORT definition for SERCOM0 peripheral ========== */ +#define PIN_PA04D_SERCOM0_PAD0 _L_(4) /**< \brief SERCOM0 signal: PAD0 on PA04 mux D */ +#define MUX_PA04D_SERCOM0_PAD0 _L_(3) +#define PINMUX_PA04D_SERCOM0_PAD0 ((PIN_PA04D_SERCOM0_PAD0 << 16) | MUX_PA04D_SERCOM0_PAD0) +#define PORT_PA04D_SERCOM0_PAD0 (_UL_(1) << 4) +#define PIN_PA08C_SERCOM0_PAD0 _L_(8) /**< \brief SERCOM0 signal: PAD0 on PA08 mux C */ +#define MUX_PA08C_SERCOM0_PAD0 _L_(2) +#define PINMUX_PA08C_SERCOM0_PAD0 ((PIN_PA08C_SERCOM0_PAD0 << 16) | MUX_PA08C_SERCOM0_PAD0) +#define PORT_PA08C_SERCOM0_PAD0 (_UL_(1) << 8) +#define PIN_PA05D_SERCOM0_PAD1 _L_(5) /**< \brief SERCOM0 signal: PAD1 on PA05 mux D */ +#define MUX_PA05D_SERCOM0_PAD1 _L_(3) +#define PINMUX_PA05D_SERCOM0_PAD1 ((PIN_PA05D_SERCOM0_PAD1 << 16) | MUX_PA05D_SERCOM0_PAD1) +#define PORT_PA05D_SERCOM0_PAD1 (_UL_(1) << 5) +#define PIN_PA09C_SERCOM0_PAD1 _L_(9) /**< \brief SERCOM0 signal: PAD1 on PA09 mux C */ +#define MUX_PA09C_SERCOM0_PAD1 _L_(2) +#define PINMUX_PA09C_SERCOM0_PAD1 ((PIN_PA09C_SERCOM0_PAD1 << 16) | MUX_PA09C_SERCOM0_PAD1) +#define PORT_PA09C_SERCOM0_PAD1 (_UL_(1) << 9) +#define PIN_PA06D_SERCOM0_PAD2 _L_(6) /**< \brief SERCOM0 signal: PAD2 on PA06 mux D */ +#define MUX_PA06D_SERCOM0_PAD2 _L_(3) +#define PINMUX_PA06D_SERCOM0_PAD2 ((PIN_PA06D_SERCOM0_PAD2 << 16) | MUX_PA06D_SERCOM0_PAD2) +#define PORT_PA06D_SERCOM0_PAD2 (_UL_(1) << 6) +#define PIN_PA10C_SERCOM0_PAD2 _L_(10) /**< \brief SERCOM0 signal: PAD2 on PA10 mux C */ +#define MUX_PA10C_SERCOM0_PAD2 _L_(2) +#define PINMUX_PA10C_SERCOM0_PAD2 ((PIN_PA10C_SERCOM0_PAD2 << 16) | MUX_PA10C_SERCOM0_PAD2) +#define PORT_PA10C_SERCOM0_PAD2 (_UL_(1) << 10) +#define PIN_PA07D_SERCOM0_PAD3 _L_(7) /**< \brief SERCOM0 signal: PAD3 on PA07 mux D */ +#define MUX_PA07D_SERCOM0_PAD3 _L_(3) +#define PINMUX_PA07D_SERCOM0_PAD3 ((PIN_PA07D_SERCOM0_PAD3 << 16) | MUX_PA07D_SERCOM0_PAD3) +#define PORT_PA07D_SERCOM0_PAD3 (_UL_(1) << 7) +#define PIN_PA11C_SERCOM0_PAD3 _L_(11) /**< \brief SERCOM0 signal: PAD3 on PA11 mux C */ +#define MUX_PA11C_SERCOM0_PAD3 _L_(2) +#define PINMUX_PA11C_SERCOM0_PAD3 ((PIN_PA11C_SERCOM0_PAD3 << 16) | MUX_PA11C_SERCOM0_PAD3) +#define PORT_PA11C_SERCOM0_PAD3 (_UL_(1) << 11) +/* ========== PORT definition for SERCOM1 peripheral ========== */ +#define PIN_PA00D_SERCOM1_PAD0 _L_(0) /**< \brief SERCOM1 signal: PAD0 on PA00 mux D */ +#define MUX_PA00D_SERCOM1_PAD0 _L_(3) +#define PINMUX_PA00D_SERCOM1_PAD0 ((PIN_PA00D_SERCOM1_PAD0 << 16) | MUX_PA00D_SERCOM1_PAD0) +#define PORT_PA00D_SERCOM1_PAD0 (_UL_(1) << 0) +#define PIN_PA16C_SERCOM1_PAD0 _L_(16) /**< \brief SERCOM1 signal: PAD0 on PA16 mux C */ +#define MUX_PA16C_SERCOM1_PAD0 _L_(2) +#define PINMUX_PA16C_SERCOM1_PAD0 ((PIN_PA16C_SERCOM1_PAD0 << 16) | MUX_PA16C_SERCOM1_PAD0) +#define PORT_PA16C_SERCOM1_PAD0 (_UL_(1) << 16) +#define PIN_PA01D_SERCOM1_PAD1 _L_(1) /**< \brief SERCOM1 signal: PAD1 on PA01 mux D */ +#define MUX_PA01D_SERCOM1_PAD1 _L_(3) +#define PINMUX_PA01D_SERCOM1_PAD1 ((PIN_PA01D_SERCOM1_PAD1 << 16) | MUX_PA01D_SERCOM1_PAD1) +#define PORT_PA01D_SERCOM1_PAD1 (_UL_(1) << 1) +#define PIN_PA17C_SERCOM1_PAD1 _L_(17) /**< \brief SERCOM1 signal: PAD1 on PA17 mux C */ +#define MUX_PA17C_SERCOM1_PAD1 _L_(2) +#define PINMUX_PA17C_SERCOM1_PAD1 ((PIN_PA17C_SERCOM1_PAD1 << 16) | MUX_PA17C_SERCOM1_PAD1) +#define PORT_PA17C_SERCOM1_PAD1 (_UL_(1) << 17) +#define PIN_PA30D_SERCOM1_PAD2 _L_(30) /**< \brief SERCOM1 signal: PAD2 on PA30 mux D */ +#define MUX_PA30D_SERCOM1_PAD2 _L_(3) +#define PINMUX_PA30D_SERCOM1_PAD2 ((PIN_PA30D_SERCOM1_PAD2 << 16) | MUX_PA30D_SERCOM1_PAD2) +#define PORT_PA30D_SERCOM1_PAD2 (_UL_(1) << 30) +#define PIN_PA18C_SERCOM1_PAD2 _L_(18) /**< \brief SERCOM1 signal: PAD2 on PA18 mux C */ +#define MUX_PA18C_SERCOM1_PAD2 _L_(2) +#define PINMUX_PA18C_SERCOM1_PAD2 ((PIN_PA18C_SERCOM1_PAD2 << 16) | MUX_PA18C_SERCOM1_PAD2) +#define PORT_PA18C_SERCOM1_PAD2 (_UL_(1) << 18) +#define PIN_PB22C_SERCOM1_PAD2 _L_(54) /**< \brief SERCOM1 signal: PAD2 on PB22 mux C */ +#define MUX_PB22C_SERCOM1_PAD2 _L_(2) +#define PINMUX_PB22C_SERCOM1_PAD2 ((PIN_PB22C_SERCOM1_PAD2 << 16) | MUX_PB22C_SERCOM1_PAD2) +#define PORT_PB22C_SERCOM1_PAD2 (_UL_(1) << 22) +#define PIN_PA31D_SERCOM1_PAD3 _L_(31) /**< \brief SERCOM1 signal: PAD3 on PA31 mux D */ +#define MUX_PA31D_SERCOM1_PAD3 _L_(3) +#define PINMUX_PA31D_SERCOM1_PAD3 ((PIN_PA31D_SERCOM1_PAD3 << 16) | MUX_PA31D_SERCOM1_PAD3) +#define PORT_PA31D_SERCOM1_PAD3 (_UL_(1) << 31) +#define PIN_PA19C_SERCOM1_PAD3 _L_(19) /**< \brief SERCOM1 signal: PAD3 on PA19 mux C */ +#define MUX_PA19C_SERCOM1_PAD3 _L_(2) +#define PINMUX_PA19C_SERCOM1_PAD3 ((PIN_PA19C_SERCOM1_PAD3 << 16) | MUX_PA19C_SERCOM1_PAD3) +#define PORT_PA19C_SERCOM1_PAD3 (_UL_(1) << 19) +#define PIN_PB23C_SERCOM1_PAD3 _L_(55) /**< \brief SERCOM1 signal: PAD3 on PB23 mux C */ +#define MUX_PB23C_SERCOM1_PAD3 _L_(2) +#define PINMUX_PB23C_SERCOM1_PAD3 ((PIN_PB23C_SERCOM1_PAD3 << 16) | MUX_PB23C_SERCOM1_PAD3) +#define PORT_PB23C_SERCOM1_PAD3 (_UL_(1) << 23) +/* ========== PORT definition for TC0 peripheral ========== */ +#define PIN_PA04E_TC0_WO0 _L_(4) /**< \brief TC0 signal: WO0 on PA04 mux E */ +#define MUX_PA04E_TC0_WO0 _L_(4) +#define PINMUX_PA04E_TC0_WO0 ((PIN_PA04E_TC0_WO0 << 16) | MUX_PA04E_TC0_WO0) +#define PORT_PA04E_TC0_WO0 (_UL_(1) << 4) +#define PIN_PA08E_TC0_WO0 _L_(8) /**< \brief TC0 signal: WO0 on PA08 mux E */ +#define MUX_PA08E_TC0_WO0 _L_(4) +#define PINMUX_PA08E_TC0_WO0 ((PIN_PA08E_TC0_WO0 << 16) | MUX_PA08E_TC0_WO0) +#define PORT_PA08E_TC0_WO0 (_UL_(1) << 8) +#define PIN_PB30E_TC0_WO0 _L_(62) /**< \brief TC0 signal: WO0 on PB30 mux E */ +#define MUX_PB30E_TC0_WO0 _L_(4) +#define PINMUX_PB30E_TC0_WO0 ((PIN_PB30E_TC0_WO0 << 16) | MUX_PB30E_TC0_WO0) +#define PORT_PB30E_TC0_WO0 (_UL_(1) << 30) +#define PIN_PA05E_TC0_WO1 _L_(5) /**< \brief TC0 signal: WO1 on PA05 mux E */ +#define MUX_PA05E_TC0_WO1 _L_(4) +#define PINMUX_PA05E_TC0_WO1 ((PIN_PA05E_TC0_WO1 << 16) | MUX_PA05E_TC0_WO1) +#define PORT_PA05E_TC0_WO1 (_UL_(1) << 5) +#define PIN_PA09E_TC0_WO1 _L_(9) /**< \brief TC0 signal: WO1 on PA09 mux E */ +#define MUX_PA09E_TC0_WO1 _L_(4) +#define PINMUX_PA09E_TC0_WO1 ((PIN_PA09E_TC0_WO1 << 16) | MUX_PA09E_TC0_WO1) +#define PORT_PA09E_TC0_WO1 (_UL_(1) << 9) +#define PIN_PB31E_TC0_WO1 _L_(63) /**< \brief TC0 signal: WO1 on PB31 mux E */ +#define MUX_PB31E_TC0_WO1 _L_(4) +#define PINMUX_PB31E_TC0_WO1 ((PIN_PB31E_TC0_WO1 << 16) | MUX_PB31E_TC0_WO1) +#define PORT_PB31E_TC0_WO1 (_UL_(1) << 31) +/* ========== PORT definition for TC1 peripheral ========== */ +#define PIN_PA06E_TC1_WO0 _L_(6) /**< \brief TC1 signal: WO0 on PA06 mux E */ +#define MUX_PA06E_TC1_WO0 _L_(4) +#define PINMUX_PA06E_TC1_WO0 ((PIN_PA06E_TC1_WO0 << 16) | MUX_PA06E_TC1_WO0) +#define PORT_PA06E_TC1_WO0 (_UL_(1) << 6) +#define PIN_PA10E_TC1_WO0 _L_(10) /**< \brief TC1 signal: WO0 on PA10 mux E */ +#define MUX_PA10E_TC1_WO0 _L_(4) +#define PINMUX_PA10E_TC1_WO0 ((PIN_PA10E_TC1_WO0 << 16) | MUX_PA10E_TC1_WO0) +#define PORT_PA10E_TC1_WO0 (_UL_(1) << 10) +#define PIN_PA07E_TC1_WO1 _L_(7) /**< \brief TC1 signal: WO1 on PA07 mux E */ +#define MUX_PA07E_TC1_WO1 _L_(4) +#define PINMUX_PA07E_TC1_WO1 ((PIN_PA07E_TC1_WO1 << 16) | MUX_PA07E_TC1_WO1) +#define PORT_PA07E_TC1_WO1 (_UL_(1) << 7) +#define PIN_PA11E_TC1_WO1 _L_(11) /**< \brief TC1 signal: WO1 on PA11 mux E */ +#define MUX_PA11E_TC1_WO1 _L_(4) +#define PINMUX_PA11E_TC1_WO1 ((PIN_PA11E_TC1_WO1 << 16) | MUX_PA11E_TC1_WO1) +#define PORT_PA11E_TC1_WO1 (_UL_(1) << 11) +/* ========== PORT definition for USB peripheral ========== */ +#define PIN_PA24H_USB_DM _L_(24) /**< \brief USB signal: DM on PA24 mux H */ +#define MUX_PA24H_USB_DM _L_(7) +#define PINMUX_PA24H_USB_DM ((PIN_PA24H_USB_DM << 16) | MUX_PA24H_USB_DM) +#define PORT_PA24H_USB_DM (_UL_(1) << 24) +#define PIN_PA25H_USB_DP _L_(25) /**< \brief USB signal: DP on PA25 mux H */ +#define MUX_PA25H_USB_DP _L_(7) +#define PINMUX_PA25H_USB_DP ((PIN_PA25H_USB_DP << 16) | MUX_PA25H_USB_DP) +#define PORT_PA25H_USB_DP (_UL_(1) << 25) +#define PIN_PA23H_USB_SOF_1KHZ _L_(23) /**< \brief USB signal: SOF_1KHZ on PA23 mux H */ +#define MUX_PA23H_USB_SOF_1KHZ _L_(7) +#define PINMUX_PA23H_USB_SOF_1KHZ ((PIN_PA23H_USB_SOF_1KHZ << 16) | MUX_PA23H_USB_SOF_1KHZ) +#define PORT_PA23H_USB_SOF_1KHZ (_UL_(1) << 23) +#define PIN_PB22H_USB_SOF_1KHZ _L_(54) /**< \brief USB signal: SOF_1KHZ on PB22 mux H */ +#define MUX_PB22H_USB_SOF_1KHZ _L_(7) +#define PINMUX_PB22H_USB_SOF_1KHZ ((PIN_PB22H_USB_SOF_1KHZ << 16) | MUX_PB22H_USB_SOF_1KHZ) +#define PORT_PB22H_USB_SOF_1KHZ (_UL_(1) << 22) +/* ========== PORT definition for SERCOM2 peripheral ========== */ +#define PIN_PA09D_SERCOM2_PAD0 _L_(9) /**< \brief SERCOM2 signal: PAD0 on PA09 mux D */ +#define MUX_PA09D_SERCOM2_PAD0 _L_(3) +#define PINMUX_PA09D_SERCOM2_PAD0 ((PIN_PA09D_SERCOM2_PAD0 << 16) | MUX_PA09D_SERCOM2_PAD0) +#define PORT_PA09D_SERCOM2_PAD0 (_UL_(1) << 9) +#define PIN_PA12C_SERCOM2_PAD0 _L_(12) /**< \brief SERCOM2 signal: PAD0 on PA12 mux C */ +#define MUX_PA12C_SERCOM2_PAD0 _L_(2) +#define PINMUX_PA12C_SERCOM2_PAD0 ((PIN_PA12C_SERCOM2_PAD0 << 16) | MUX_PA12C_SERCOM2_PAD0) +#define PORT_PA12C_SERCOM2_PAD0 (_UL_(1) << 12) +#define PIN_PA08D_SERCOM2_PAD1 _L_(8) /**< \brief SERCOM2 signal: PAD1 on PA08 mux D */ +#define MUX_PA08D_SERCOM2_PAD1 _L_(3) +#define PINMUX_PA08D_SERCOM2_PAD1 ((PIN_PA08D_SERCOM2_PAD1 << 16) | MUX_PA08D_SERCOM2_PAD1) +#define PORT_PA08D_SERCOM2_PAD1 (_UL_(1) << 8) +#define PIN_PA13C_SERCOM2_PAD1 _L_(13) /**< \brief SERCOM2 signal: PAD1 on PA13 mux C */ +#define MUX_PA13C_SERCOM2_PAD1 _L_(2) +#define PINMUX_PA13C_SERCOM2_PAD1 ((PIN_PA13C_SERCOM2_PAD1 << 16) | MUX_PA13C_SERCOM2_PAD1) +#define PORT_PA13C_SERCOM2_PAD1 (_UL_(1) << 13) +#define PIN_PA10D_SERCOM2_PAD2 _L_(10) /**< \brief SERCOM2 signal: PAD2 on PA10 mux D */ +#define MUX_PA10D_SERCOM2_PAD2 _L_(3) +#define PINMUX_PA10D_SERCOM2_PAD2 ((PIN_PA10D_SERCOM2_PAD2 << 16) | MUX_PA10D_SERCOM2_PAD2) +#define PORT_PA10D_SERCOM2_PAD2 (_UL_(1) << 10) +#define PIN_PA14C_SERCOM2_PAD2 _L_(14) /**< \brief SERCOM2 signal: PAD2 on PA14 mux C */ +#define MUX_PA14C_SERCOM2_PAD2 _L_(2) +#define PINMUX_PA14C_SERCOM2_PAD2 ((PIN_PA14C_SERCOM2_PAD2 << 16) | MUX_PA14C_SERCOM2_PAD2) +#define PORT_PA14C_SERCOM2_PAD2 (_UL_(1) << 14) +#define PIN_PA11D_SERCOM2_PAD3 _L_(11) /**< \brief SERCOM2 signal: PAD3 on PA11 mux D */ +#define MUX_PA11D_SERCOM2_PAD3 _L_(3) +#define PINMUX_PA11D_SERCOM2_PAD3 ((PIN_PA11D_SERCOM2_PAD3 << 16) | MUX_PA11D_SERCOM2_PAD3) +#define PORT_PA11D_SERCOM2_PAD3 (_UL_(1) << 11) +#define PIN_PA15C_SERCOM2_PAD3 _L_(15) /**< \brief SERCOM2 signal: PAD3 on PA15 mux C */ +#define MUX_PA15C_SERCOM2_PAD3 _L_(2) +#define PINMUX_PA15C_SERCOM2_PAD3 ((PIN_PA15C_SERCOM2_PAD3 << 16) | MUX_PA15C_SERCOM2_PAD3) +#define PORT_PA15C_SERCOM2_PAD3 (_UL_(1) << 15) +/* ========== PORT definition for SERCOM3 peripheral ========== */ +#define PIN_PA17D_SERCOM3_PAD0 _L_(17) /**< \brief SERCOM3 signal: PAD0 on PA17 mux D */ +#define MUX_PA17D_SERCOM3_PAD0 _L_(3) +#define PINMUX_PA17D_SERCOM3_PAD0 ((PIN_PA17D_SERCOM3_PAD0 << 16) | MUX_PA17D_SERCOM3_PAD0) +#define PORT_PA17D_SERCOM3_PAD0 (_UL_(1) << 17) +#define PIN_PA22C_SERCOM3_PAD0 _L_(22) /**< \brief SERCOM3 signal: PAD0 on PA22 mux C */ +#define MUX_PA22C_SERCOM3_PAD0 _L_(2) +#define PINMUX_PA22C_SERCOM3_PAD0 ((PIN_PA22C_SERCOM3_PAD0 << 16) | MUX_PA22C_SERCOM3_PAD0) +#define PORT_PA22C_SERCOM3_PAD0 (_UL_(1) << 22) +#define PIN_PA16D_SERCOM3_PAD1 _L_(16) /**< \brief SERCOM3 signal: PAD1 on PA16 mux D */ +#define MUX_PA16D_SERCOM3_PAD1 _L_(3) +#define PINMUX_PA16D_SERCOM3_PAD1 ((PIN_PA16D_SERCOM3_PAD1 << 16) | MUX_PA16D_SERCOM3_PAD1) +#define PORT_PA16D_SERCOM3_PAD1 (_UL_(1) << 16) +#define PIN_PA23C_SERCOM3_PAD1 _L_(23) /**< \brief SERCOM3 signal: PAD1 on PA23 mux C */ +#define MUX_PA23C_SERCOM3_PAD1 _L_(2) +#define PINMUX_PA23C_SERCOM3_PAD1 ((PIN_PA23C_SERCOM3_PAD1 << 16) | MUX_PA23C_SERCOM3_PAD1) +#define PORT_PA23C_SERCOM3_PAD1 (_UL_(1) << 23) +#define PIN_PA18D_SERCOM3_PAD2 _L_(18) /**< \brief SERCOM3 signal: PAD2 on PA18 mux D */ +#define MUX_PA18D_SERCOM3_PAD2 _L_(3) +#define PINMUX_PA18D_SERCOM3_PAD2 ((PIN_PA18D_SERCOM3_PAD2 << 16) | MUX_PA18D_SERCOM3_PAD2) +#define PORT_PA18D_SERCOM3_PAD2 (_UL_(1) << 18) +#define PIN_PA20D_SERCOM3_PAD2 _L_(20) /**< \brief SERCOM3 signal: PAD2 on PA20 mux D */ +#define MUX_PA20D_SERCOM3_PAD2 _L_(3) +#define PINMUX_PA20D_SERCOM3_PAD2 ((PIN_PA20D_SERCOM3_PAD2 << 16) | MUX_PA20D_SERCOM3_PAD2) +#define PORT_PA20D_SERCOM3_PAD2 (_UL_(1) << 20) +#define PIN_PA24C_SERCOM3_PAD2 _L_(24) /**< \brief SERCOM3 signal: PAD2 on PA24 mux C */ +#define MUX_PA24C_SERCOM3_PAD2 _L_(2) +#define PINMUX_PA24C_SERCOM3_PAD2 ((PIN_PA24C_SERCOM3_PAD2 << 16) | MUX_PA24C_SERCOM3_PAD2) +#define PORT_PA24C_SERCOM3_PAD2 (_UL_(1) << 24) +#define PIN_PA19D_SERCOM3_PAD3 _L_(19) /**< \brief SERCOM3 signal: PAD3 on PA19 mux D */ +#define MUX_PA19D_SERCOM3_PAD3 _L_(3) +#define PINMUX_PA19D_SERCOM3_PAD3 ((PIN_PA19D_SERCOM3_PAD3 << 16) | MUX_PA19D_SERCOM3_PAD3) +#define PORT_PA19D_SERCOM3_PAD3 (_UL_(1) << 19) +#define PIN_PA21D_SERCOM3_PAD3 _L_(21) /**< \brief SERCOM3 signal: PAD3 on PA21 mux D */ +#define MUX_PA21D_SERCOM3_PAD3 _L_(3) +#define PINMUX_PA21D_SERCOM3_PAD3 ((PIN_PA21D_SERCOM3_PAD3 << 16) | MUX_PA21D_SERCOM3_PAD3) +#define PORT_PA21D_SERCOM3_PAD3 (_UL_(1) << 21) +#define PIN_PA25C_SERCOM3_PAD3 _L_(25) /**< \brief SERCOM3 signal: PAD3 on PA25 mux C */ +#define MUX_PA25C_SERCOM3_PAD3 _L_(2) +#define PINMUX_PA25C_SERCOM3_PAD3 ((PIN_PA25C_SERCOM3_PAD3 << 16) | MUX_PA25C_SERCOM3_PAD3) +#define PORT_PA25C_SERCOM3_PAD3 (_UL_(1) << 25) +/* ========== PORT definition for TCC0 peripheral ========== */ +#define PIN_PA20G_TCC0_WO0 _L_(20) /**< \brief TCC0 signal: WO0 on PA20 mux G */ +#define MUX_PA20G_TCC0_WO0 _L_(6) +#define PINMUX_PA20G_TCC0_WO0 ((PIN_PA20G_TCC0_WO0 << 16) | MUX_PA20G_TCC0_WO0) +#define PORT_PA20G_TCC0_WO0 (_UL_(1) << 20) +#define PIN_PB12G_TCC0_WO0 _L_(44) /**< \brief TCC0 signal: WO0 on PB12 mux G */ +#define MUX_PB12G_TCC0_WO0 _L_(6) +#define PINMUX_PB12G_TCC0_WO0 ((PIN_PB12G_TCC0_WO0 << 16) | MUX_PB12G_TCC0_WO0) +#define PORT_PB12G_TCC0_WO0 (_UL_(1) << 12) +#define PIN_PA08F_TCC0_WO0 _L_(8) /**< \brief TCC0 signal: WO0 on PA08 mux F */ +#define MUX_PA08F_TCC0_WO0 _L_(5) +#define PINMUX_PA08F_TCC0_WO0 ((PIN_PA08F_TCC0_WO0 << 16) | MUX_PA08F_TCC0_WO0) +#define PORT_PA08F_TCC0_WO0 (_UL_(1) << 8) +#define PIN_PA21G_TCC0_WO1 _L_(21) /**< \brief TCC0 signal: WO1 on PA21 mux G */ +#define MUX_PA21G_TCC0_WO1 _L_(6) +#define PINMUX_PA21G_TCC0_WO1 ((PIN_PA21G_TCC0_WO1 << 16) | MUX_PA21G_TCC0_WO1) +#define PORT_PA21G_TCC0_WO1 (_UL_(1) << 21) +#define PIN_PB13G_TCC0_WO1 _L_(45) /**< \brief TCC0 signal: WO1 on PB13 mux G */ +#define MUX_PB13G_TCC0_WO1 _L_(6) +#define PINMUX_PB13G_TCC0_WO1 ((PIN_PB13G_TCC0_WO1 << 16) | MUX_PB13G_TCC0_WO1) +#define PORT_PB13G_TCC0_WO1 (_UL_(1) << 13) +#define PIN_PA09F_TCC0_WO1 _L_(9) /**< \brief TCC0 signal: WO1 on PA09 mux F */ +#define MUX_PA09F_TCC0_WO1 _L_(5) +#define PINMUX_PA09F_TCC0_WO1 ((PIN_PA09F_TCC0_WO1 << 16) | MUX_PA09F_TCC0_WO1) +#define PORT_PA09F_TCC0_WO1 (_UL_(1) << 9) +#define PIN_PA22G_TCC0_WO2 _L_(22) /**< \brief TCC0 signal: WO2 on PA22 mux G */ +#define MUX_PA22G_TCC0_WO2 _L_(6) +#define PINMUX_PA22G_TCC0_WO2 ((PIN_PA22G_TCC0_WO2 << 16) | MUX_PA22G_TCC0_WO2) +#define PORT_PA22G_TCC0_WO2 (_UL_(1) << 22) +#define PIN_PB14G_TCC0_WO2 _L_(46) /**< \brief TCC0 signal: WO2 on PB14 mux G */ +#define MUX_PB14G_TCC0_WO2 _L_(6) +#define PINMUX_PB14G_TCC0_WO2 ((PIN_PB14G_TCC0_WO2 << 16) | MUX_PB14G_TCC0_WO2) +#define PORT_PB14G_TCC0_WO2 (_UL_(1) << 14) +#define PIN_PA10F_TCC0_WO2 _L_(10) /**< \brief TCC0 signal: WO2 on PA10 mux F */ +#define MUX_PA10F_TCC0_WO2 _L_(5) +#define PINMUX_PA10F_TCC0_WO2 ((PIN_PA10F_TCC0_WO2 << 16) | MUX_PA10F_TCC0_WO2) +#define PORT_PA10F_TCC0_WO2 (_UL_(1) << 10) +#define PIN_PA23G_TCC0_WO3 _L_(23) /**< \brief TCC0 signal: WO3 on PA23 mux G */ +#define MUX_PA23G_TCC0_WO3 _L_(6) +#define PINMUX_PA23G_TCC0_WO3 ((PIN_PA23G_TCC0_WO3 << 16) | MUX_PA23G_TCC0_WO3) +#define PORT_PA23G_TCC0_WO3 (_UL_(1) << 23) +#define PIN_PB15G_TCC0_WO3 _L_(47) /**< \brief TCC0 signal: WO3 on PB15 mux G */ +#define MUX_PB15G_TCC0_WO3 _L_(6) +#define PINMUX_PB15G_TCC0_WO3 ((PIN_PB15G_TCC0_WO3 << 16) | MUX_PB15G_TCC0_WO3) +#define PORT_PB15G_TCC0_WO3 (_UL_(1) << 15) +#define PIN_PA11F_TCC0_WO3 _L_(11) /**< \brief TCC0 signal: WO3 on PA11 mux F */ +#define MUX_PA11F_TCC0_WO3 _L_(5) +#define PINMUX_PA11F_TCC0_WO3 ((PIN_PA11F_TCC0_WO3 << 16) | MUX_PA11F_TCC0_WO3) +#define PORT_PA11F_TCC0_WO3 (_UL_(1) << 11) +#define PIN_PA16G_TCC0_WO4 _L_(16) /**< \brief TCC0 signal: WO4 on PA16 mux G */ +#define MUX_PA16G_TCC0_WO4 _L_(6) +#define PINMUX_PA16G_TCC0_WO4 ((PIN_PA16G_TCC0_WO4 << 16) | MUX_PA16G_TCC0_WO4) +#define PORT_PA16G_TCC0_WO4 (_UL_(1) << 16) +#define PIN_PB16G_TCC0_WO4 _L_(48) /**< \brief TCC0 signal: WO4 on PB16 mux G */ +#define MUX_PB16G_TCC0_WO4 _L_(6) +#define PINMUX_PB16G_TCC0_WO4 ((PIN_PB16G_TCC0_WO4 << 16) | MUX_PB16G_TCC0_WO4) +#define PORT_PB16G_TCC0_WO4 (_UL_(1) << 16) +#define PIN_PB10F_TCC0_WO4 _L_(42) /**< \brief TCC0 signal: WO4 on PB10 mux F */ +#define MUX_PB10F_TCC0_WO4 _L_(5) +#define PINMUX_PB10F_TCC0_WO4 ((PIN_PB10F_TCC0_WO4 << 16) | MUX_PB10F_TCC0_WO4) +#define PORT_PB10F_TCC0_WO4 (_UL_(1) << 10) +#define PIN_PA17G_TCC0_WO5 _L_(17) /**< \brief TCC0 signal: WO5 on PA17 mux G */ +#define MUX_PA17G_TCC0_WO5 _L_(6) +#define PINMUX_PA17G_TCC0_WO5 ((PIN_PA17G_TCC0_WO5 << 16) | MUX_PA17G_TCC0_WO5) +#define PORT_PA17G_TCC0_WO5 (_UL_(1) << 17) +#define PIN_PB17G_TCC0_WO5 _L_(49) /**< \brief TCC0 signal: WO5 on PB17 mux G */ +#define MUX_PB17G_TCC0_WO5 _L_(6) +#define PINMUX_PB17G_TCC0_WO5 ((PIN_PB17G_TCC0_WO5 << 16) | MUX_PB17G_TCC0_WO5) +#define PORT_PB17G_TCC0_WO5 (_UL_(1) << 17) +#define PIN_PB11F_TCC0_WO5 _L_(43) /**< \brief TCC0 signal: WO5 on PB11 mux F */ +#define MUX_PB11F_TCC0_WO5 _L_(5) +#define PINMUX_PB11F_TCC0_WO5 ((PIN_PB11F_TCC0_WO5 << 16) | MUX_PB11F_TCC0_WO5) +#define PORT_PB11F_TCC0_WO5 (_UL_(1) << 11) +#define PIN_PA18G_TCC0_WO6 _L_(18) /**< \brief TCC0 signal: WO6 on PA18 mux G */ +#define MUX_PA18G_TCC0_WO6 _L_(6) +#define PINMUX_PA18G_TCC0_WO6 ((PIN_PA18G_TCC0_WO6 << 16) | MUX_PA18G_TCC0_WO6) +#define PORT_PA18G_TCC0_WO6 (_UL_(1) << 18) +#define PIN_PB30G_TCC0_WO6 _L_(62) /**< \brief TCC0 signal: WO6 on PB30 mux G */ +#define MUX_PB30G_TCC0_WO6 _L_(6) +#define PINMUX_PB30G_TCC0_WO6 ((PIN_PB30G_TCC0_WO6 << 16) | MUX_PB30G_TCC0_WO6) +#define PORT_PB30G_TCC0_WO6 (_UL_(1) << 30) +#define PIN_PA12F_TCC0_WO6 _L_(12) /**< \brief TCC0 signal: WO6 on PA12 mux F */ +#define MUX_PA12F_TCC0_WO6 _L_(5) +#define PINMUX_PA12F_TCC0_WO6 ((PIN_PA12F_TCC0_WO6 << 16) | MUX_PA12F_TCC0_WO6) +#define PORT_PA12F_TCC0_WO6 (_UL_(1) << 12) +#define PIN_PA19G_TCC0_WO7 _L_(19) /**< \brief TCC0 signal: WO7 on PA19 mux G */ +#define MUX_PA19G_TCC0_WO7 _L_(6) +#define PINMUX_PA19G_TCC0_WO7 ((PIN_PA19G_TCC0_WO7 << 16) | MUX_PA19G_TCC0_WO7) +#define PORT_PA19G_TCC0_WO7 (_UL_(1) << 19) +#define PIN_PB31G_TCC0_WO7 _L_(63) /**< \brief TCC0 signal: WO7 on PB31 mux G */ +#define MUX_PB31G_TCC0_WO7 _L_(6) +#define PINMUX_PB31G_TCC0_WO7 ((PIN_PB31G_TCC0_WO7 << 16) | MUX_PB31G_TCC0_WO7) +#define PORT_PB31G_TCC0_WO7 (_UL_(1) << 31) +#define PIN_PA13F_TCC0_WO7 _L_(13) /**< \brief TCC0 signal: WO7 on PA13 mux F */ +#define MUX_PA13F_TCC0_WO7 _L_(5) +#define PINMUX_PA13F_TCC0_WO7 ((PIN_PA13F_TCC0_WO7 << 16) | MUX_PA13F_TCC0_WO7) +#define PORT_PA13F_TCC0_WO7 (_UL_(1) << 13) +/* ========== PORT definition for TCC1 peripheral ========== */ +#define PIN_PB10G_TCC1_WO0 _L_(42) /**< \brief TCC1 signal: WO0 on PB10 mux G */ +#define MUX_PB10G_TCC1_WO0 _L_(6) +#define PINMUX_PB10G_TCC1_WO0 ((PIN_PB10G_TCC1_WO0 << 16) | MUX_PB10G_TCC1_WO0) +#define PORT_PB10G_TCC1_WO0 (_UL_(1) << 10) +#define PIN_PA16F_TCC1_WO0 _L_(16) /**< \brief TCC1 signal: WO0 on PA16 mux F */ +#define MUX_PA16F_TCC1_WO0 _L_(5) +#define PINMUX_PA16F_TCC1_WO0 ((PIN_PA16F_TCC1_WO0 << 16) | MUX_PA16F_TCC1_WO0) +#define PORT_PA16F_TCC1_WO0 (_UL_(1) << 16) +#define PIN_PB11G_TCC1_WO1 _L_(43) /**< \brief TCC1 signal: WO1 on PB11 mux G */ +#define MUX_PB11G_TCC1_WO1 _L_(6) +#define PINMUX_PB11G_TCC1_WO1 ((PIN_PB11G_TCC1_WO1 << 16) | MUX_PB11G_TCC1_WO1) +#define PORT_PB11G_TCC1_WO1 (_UL_(1) << 11) +#define PIN_PA17F_TCC1_WO1 _L_(17) /**< \brief TCC1 signal: WO1 on PA17 mux F */ +#define MUX_PA17F_TCC1_WO1 _L_(5) +#define PINMUX_PA17F_TCC1_WO1 ((PIN_PA17F_TCC1_WO1 << 16) | MUX_PA17F_TCC1_WO1) +#define PORT_PA17F_TCC1_WO1 (_UL_(1) << 17) +#define PIN_PA12G_TCC1_WO2 _L_(12) /**< \brief TCC1 signal: WO2 on PA12 mux G */ +#define MUX_PA12G_TCC1_WO2 _L_(6) +#define PINMUX_PA12G_TCC1_WO2 ((PIN_PA12G_TCC1_WO2 << 16) | MUX_PA12G_TCC1_WO2) +#define PORT_PA12G_TCC1_WO2 (_UL_(1) << 12) +#define PIN_PA14G_TCC1_WO2 _L_(14) /**< \brief TCC1 signal: WO2 on PA14 mux G */ +#define MUX_PA14G_TCC1_WO2 _L_(6) +#define PINMUX_PA14G_TCC1_WO2 ((PIN_PA14G_TCC1_WO2 << 16) | MUX_PA14G_TCC1_WO2) +#define PORT_PA14G_TCC1_WO2 (_UL_(1) << 14) +#define PIN_PA18F_TCC1_WO2 _L_(18) /**< \brief TCC1 signal: WO2 on PA18 mux F */ +#define MUX_PA18F_TCC1_WO2 _L_(5) +#define PINMUX_PA18F_TCC1_WO2 ((PIN_PA18F_TCC1_WO2 << 16) | MUX_PA18F_TCC1_WO2) +#define PORT_PA18F_TCC1_WO2 (_UL_(1) << 18) +#define PIN_PA13G_TCC1_WO3 _L_(13) /**< \brief TCC1 signal: WO3 on PA13 mux G */ +#define MUX_PA13G_TCC1_WO3 _L_(6) +#define PINMUX_PA13G_TCC1_WO3 ((PIN_PA13G_TCC1_WO3 << 16) | MUX_PA13G_TCC1_WO3) +#define PORT_PA13G_TCC1_WO3 (_UL_(1) << 13) +#define PIN_PA15G_TCC1_WO3 _L_(15) /**< \brief TCC1 signal: WO3 on PA15 mux G */ +#define MUX_PA15G_TCC1_WO3 _L_(6) +#define PINMUX_PA15G_TCC1_WO3 ((PIN_PA15G_TCC1_WO3 << 16) | MUX_PA15G_TCC1_WO3) +#define PORT_PA15G_TCC1_WO3 (_UL_(1) << 15) +#define PIN_PA19F_TCC1_WO3 _L_(19) /**< \brief TCC1 signal: WO3 on PA19 mux F */ +#define MUX_PA19F_TCC1_WO3 _L_(5) +#define PINMUX_PA19F_TCC1_WO3 ((PIN_PA19F_TCC1_WO3 << 16) | MUX_PA19F_TCC1_WO3) +#define PORT_PA19F_TCC1_WO3 (_UL_(1) << 19) +#define PIN_PA08G_TCC1_WO4 _L_(8) /**< \brief TCC1 signal: WO4 on PA08 mux G */ +#define MUX_PA08G_TCC1_WO4 _L_(6) +#define PINMUX_PA08G_TCC1_WO4 ((PIN_PA08G_TCC1_WO4 << 16) | MUX_PA08G_TCC1_WO4) +#define PORT_PA08G_TCC1_WO4 (_UL_(1) << 8) +#define PIN_PA20F_TCC1_WO4 _L_(20) /**< \brief TCC1 signal: WO4 on PA20 mux F */ +#define MUX_PA20F_TCC1_WO4 _L_(5) +#define PINMUX_PA20F_TCC1_WO4 ((PIN_PA20F_TCC1_WO4 << 16) | MUX_PA20F_TCC1_WO4) +#define PORT_PA20F_TCC1_WO4 (_UL_(1) << 20) +#define PIN_PA09G_TCC1_WO5 _L_(9) /**< \brief TCC1 signal: WO5 on PA09 mux G */ +#define MUX_PA09G_TCC1_WO5 _L_(6) +#define PINMUX_PA09G_TCC1_WO5 ((PIN_PA09G_TCC1_WO5 << 16) | MUX_PA09G_TCC1_WO5) +#define PORT_PA09G_TCC1_WO5 (_UL_(1) << 9) +#define PIN_PA21F_TCC1_WO5 _L_(21) /**< \brief TCC1 signal: WO5 on PA21 mux F */ +#define MUX_PA21F_TCC1_WO5 _L_(5) +#define PINMUX_PA21F_TCC1_WO5 ((PIN_PA21F_TCC1_WO5 << 16) | MUX_PA21F_TCC1_WO5) +#define PORT_PA21F_TCC1_WO5 (_UL_(1) << 21) +#define PIN_PA10G_TCC1_WO6 _L_(10) /**< \brief TCC1 signal: WO6 on PA10 mux G */ +#define MUX_PA10G_TCC1_WO6 _L_(6) +#define PINMUX_PA10G_TCC1_WO6 ((PIN_PA10G_TCC1_WO6 << 16) | MUX_PA10G_TCC1_WO6) +#define PORT_PA10G_TCC1_WO6 (_UL_(1) << 10) +#define PIN_PA22F_TCC1_WO6 _L_(22) /**< \brief TCC1 signal: WO6 on PA22 mux F */ +#define MUX_PA22F_TCC1_WO6 _L_(5) +#define PINMUX_PA22F_TCC1_WO6 ((PIN_PA22F_TCC1_WO6 << 16) | MUX_PA22F_TCC1_WO6) +#define PORT_PA22F_TCC1_WO6 (_UL_(1) << 22) +#define PIN_PA11G_TCC1_WO7 _L_(11) /**< \brief TCC1 signal: WO7 on PA11 mux G */ +#define MUX_PA11G_TCC1_WO7 _L_(6) +#define PINMUX_PA11G_TCC1_WO7 ((PIN_PA11G_TCC1_WO7 << 16) | MUX_PA11G_TCC1_WO7) +#define PORT_PA11G_TCC1_WO7 (_UL_(1) << 11) +#define PIN_PA23F_TCC1_WO7 _L_(23) /**< \brief TCC1 signal: WO7 on PA23 mux F */ +#define MUX_PA23F_TCC1_WO7 _L_(5) +#define PINMUX_PA23F_TCC1_WO7 ((PIN_PA23F_TCC1_WO7 << 16) | MUX_PA23F_TCC1_WO7) +#define PORT_PA23F_TCC1_WO7 (_UL_(1) << 23) +/* ========== PORT definition for TC2 peripheral ========== */ +#define PIN_PA12E_TC2_WO0 _L_(12) /**< \brief TC2 signal: WO0 on PA12 mux E */ +#define MUX_PA12E_TC2_WO0 _L_(4) +#define PINMUX_PA12E_TC2_WO0 ((PIN_PA12E_TC2_WO0 << 16) | MUX_PA12E_TC2_WO0) +#define PORT_PA12E_TC2_WO0 (_UL_(1) << 12) +#define PIN_PA16E_TC2_WO0 _L_(16) /**< \brief TC2 signal: WO0 on PA16 mux E */ +#define MUX_PA16E_TC2_WO0 _L_(4) +#define PINMUX_PA16E_TC2_WO0 ((PIN_PA16E_TC2_WO0 << 16) | MUX_PA16E_TC2_WO0) +#define PORT_PA16E_TC2_WO0 (_UL_(1) << 16) +#define PIN_PA00E_TC2_WO0 _L_(0) /**< \brief TC2 signal: WO0 on PA00 mux E */ +#define MUX_PA00E_TC2_WO0 _L_(4) +#define PINMUX_PA00E_TC2_WO0 ((PIN_PA00E_TC2_WO0 << 16) | MUX_PA00E_TC2_WO0) +#define PORT_PA00E_TC2_WO0 (_UL_(1) << 0) +#define PIN_PA01E_TC2_WO1 _L_(1) /**< \brief TC2 signal: WO1 on PA01 mux E */ +#define MUX_PA01E_TC2_WO1 _L_(4) +#define PINMUX_PA01E_TC2_WO1 ((PIN_PA01E_TC2_WO1 << 16) | MUX_PA01E_TC2_WO1) +#define PORT_PA01E_TC2_WO1 (_UL_(1) << 1) +#define PIN_PA13E_TC2_WO1 _L_(13) /**< \brief TC2 signal: WO1 on PA13 mux E */ +#define MUX_PA13E_TC2_WO1 _L_(4) +#define PINMUX_PA13E_TC2_WO1 ((PIN_PA13E_TC2_WO1 << 16) | MUX_PA13E_TC2_WO1) +#define PORT_PA13E_TC2_WO1 (_UL_(1) << 13) +#define PIN_PA17E_TC2_WO1 _L_(17) /**< \brief TC2 signal: WO1 on PA17 mux E */ +#define MUX_PA17E_TC2_WO1 _L_(4) +#define PINMUX_PA17E_TC2_WO1 ((PIN_PA17E_TC2_WO1 << 16) | MUX_PA17E_TC2_WO1) +#define PORT_PA17E_TC2_WO1 (_UL_(1) << 17) +/* ========== PORT definition for TC3 peripheral ========== */ +#define PIN_PA18E_TC3_WO0 _L_(18) /**< \brief TC3 signal: WO0 on PA18 mux E */ +#define MUX_PA18E_TC3_WO0 _L_(4) +#define PINMUX_PA18E_TC3_WO0 ((PIN_PA18E_TC3_WO0 << 16) | MUX_PA18E_TC3_WO0) +#define PORT_PA18E_TC3_WO0 (_UL_(1) << 18) +#define PIN_PA14E_TC3_WO0 _L_(14) /**< \brief TC3 signal: WO0 on PA14 mux E */ +#define MUX_PA14E_TC3_WO0 _L_(4) +#define PINMUX_PA14E_TC3_WO0 ((PIN_PA14E_TC3_WO0 << 16) | MUX_PA14E_TC3_WO0) +#define PORT_PA14E_TC3_WO0 (_UL_(1) << 14) +#define PIN_PA15E_TC3_WO1 _L_(15) /**< \brief TC3 signal: WO1 on PA15 mux E */ +#define MUX_PA15E_TC3_WO1 _L_(4) +#define PINMUX_PA15E_TC3_WO1 ((PIN_PA15E_TC3_WO1 << 16) | MUX_PA15E_TC3_WO1) +#define PORT_PA15E_TC3_WO1 (_UL_(1) << 15) +#define PIN_PA19E_TC3_WO1 _L_(19) /**< \brief TC3 signal: WO1 on PA19 mux E */ +#define MUX_PA19E_TC3_WO1 _L_(4) +#define PINMUX_PA19E_TC3_WO1 ((PIN_PA19E_TC3_WO1 << 16) | MUX_PA19E_TC3_WO1) +#define PORT_PA19E_TC3_WO1 (_UL_(1) << 19) +/* ========== PORT definition for TAL peripheral ========== */ +#define PIN_PA27H_TAL_BRK _L_(27) /**< \brief TAL signal: BRK on PA27 mux H */ +#define MUX_PA27H_TAL_BRK _L_(7) +#define PINMUX_PA27H_TAL_BRK ((PIN_PA27H_TAL_BRK << 16) | MUX_PA27H_TAL_BRK) +#define PORT_PA27H_TAL_BRK (_UL_(1) << 27) +#define PIN_PB31H_TAL_BRK _L_(63) /**< \brief TAL signal: BRK on PB31 mux H */ +#define MUX_PB31H_TAL_BRK _L_(7) +#define PINMUX_PB31H_TAL_BRK ((PIN_PB31H_TAL_BRK << 16) | MUX_PB31H_TAL_BRK) +#define PORT_PB31H_TAL_BRK (_UL_(1) << 31) +/* ========== PORT definition for TCC2 peripheral ========== */ +#define PIN_PA14F_TCC2_WO0 _L_(14) /**< \brief TCC2 signal: WO0 on PA14 mux F */ +#define MUX_PA14F_TCC2_WO0 _L_(5) +#define PINMUX_PA14F_TCC2_WO0 ((PIN_PA14F_TCC2_WO0 << 16) | MUX_PA14F_TCC2_WO0) +#define PORT_PA14F_TCC2_WO0 (_UL_(1) << 14) +#define PIN_PA30F_TCC2_WO0 _L_(30) /**< \brief TCC2 signal: WO0 on PA30 mux F */ +#define MUX_PA30F_TCC2_WO0 _L_(5) +#define PINMUX_PA30F_TCC2_WO0 ((PIN_PA30F_TCC2_WO0 << 16) | MUX_PA30F_TCC2_WO0) +#define PORT_PA30F_TCC2_WO0 (_UL_(1) << 30) +#define PIN_PA15F_TCC2_WO1 _L_(15) /**< \brief TCC2 signal: WO1 on PA15 mux F */ +#define MUX_PA15F_TCC2_WO1 _L_(5) +#define PINMUX_PA15F_TCC2_WO1 ((PIN_PA15F_TCC2_WO1 << 16) | MUX_PA15F_TCC2_WO1) +#define PORT_PA15F_TCC2_WO1 (_UL_(1) << 15) +#define PIN_PA31F_TCC2_WO1 _L_(31) /**< \brief TCC2 signal: WO1 on PA31 mux F */ +#define MUX_PA31F_TCC2_WO1 _L_(5) +#define PINMUX_PA31F_TCC2_WO1 ((PIN_PA31F_TCC2_WO1 << 16) | MUX_PA31F_TCC2_WO1) +#define PORT_PA31F_TCC2_WO1 (_UL_(1) << 31) +#define PIN_PA24F_TCC2_WO2 _L_(24) /**< \brief TCC2 signal: WO2 on PA24 mux F */ +#define MUX_PA24F_TCC2_WO2 _L_(5) +#define PINMUX_PA24F_TCC2_WO2 ((PIN_PA24F_TCC2_WO2 << 16) | MUX_PA24F_TCC2_WO2) +#define PORT_PA24F_TCC2_WO2 (_UL_(1) << 24) +#define PIN_PB02F_TCC2_WO2 _L_(34) /**< \brief TCC2 signal: WO2 on PB02 mux F */ +#define MUX_PB02F_TCC2_WO2 _L_(5) +#define PINMUX_PB02F_TCC2_WO2 ((PIN_PB02F_TCC2_WO2 << 16) | MUX_PB02F_TCC2_WO2) +#define PORT_PB02F_TCC2_WO2 (_UL_(1) << 2) +/* ========== PORT definition for TCC3 peripheral ========== */ +#define PIN_PB12F_TCC3_WO0 _L_(44) /**< \brief TCC3 signal: WO0 on PB12 mux F */ +#define MUX_PB12F_TCC3_WO0 _L_(5) +#define PINMUX_PB12F_TCC3_WO0 ((PIN_PB12F_TCC3_WO0 << 16) | MUX_PB12F_TCC3_WO0) +#define PORT_PB12F_TCC3_WO0 (_UL_(1) << 12) +#define PIN_PB16F_TCC3_WO0 _L_(48) /**< \brief TCC3 signal: WO0 on PB16 mux F */ +#define MUX_PB16F_TCC3_WO0 _L_(5) +#define PINMUX_PB16F_TCC3_WO0 ((PIN_PB16F_TCC3_WO0 << 16) | MUX_PB16F_TCC3_WO0) +#define PORT_PB16F_TCC3_WO0 (_UL_(1) << 16) +#define PIN_PB13F_TCC3_WO1 _L_(45) /**< \brief TCC3 signal: WO1 on PB13 mux F */ +#define MUX_PB13F_TCC3_WO1 _L_(5) +#define PINMUX_PB13F_TCC3_WO1 ((PIN_PB13F_TCC3_WO1 << 16) | MUX_PB13F_TCC3_WO1) +#define PORT_PB13F_TCC3_WO1 (_UL_(1) << 13) +#define PIN_PB17F_TCC3_WO1 _L_(49) /**< \brief TCC3 signal: WO1 on PB17 mux F */ +#define MUX_PB17F_TCC3_WO1 _L_(5) +#define PINMUX_PB17F_TCC3_WO1 ((PIN_PB17F_TCC3_WO1 << 16) | MUX_PB17F_TCC3_WO1) +#define PORT_PB17F_TCC3_WO1 (_UL_(1) << 17) +/* ========== PORT definition for TC4 peripheral ========== */ +#define PIN_PA22E_TC4_WO0 _L_(22) /**< \brief TC4 signal: WO0 on PA22 mux E */ +#define MUX_PA22E_TC4_WO0 _L_(4) +#define PINMUX_PA22E_TC4_WO0 ((PIN_PA22E_TC4_WO0 << 16) | MUX_PA22E_TC4_WO0) +#define PORT_PA22E_TC4_WO0 (_UL_(1) << 22) +#define PIN_PB08E_TC4_WO0 _L_(40) /**< \brief TC4 signal: WO0 on PB08 mux E */ +#define MUX_PB08E_TC4_WO0 _L_(4) +#define PINMUX_PB08E_TC4_WO0 ((PIN_PB08E_TC4_WO0 << 16) | MUX_PB08E_TC4_WO0) +#define PORT_PB08E_TC4_WO0 (_UL_(1) << 8) +#define PIN_PB12E_TC4_WO0 _L_(44) /**< \brief TC4 signal: WO0 on PB12 mux E */ +#define MUX_PB12E_TC4_WO0 _L_(4) +#define PINMUX_PB12E_TC4_WO0 ((PIN_PB12E_TC4_WO0 << 16) | MUX_PB12E_TC4_WO0) +#define PORT_PB12E_TC4_WO0 (_UL_(1) << 12) +#define PIN_PA23E_TC4_WO1 _L_(23) /**< \brief TC4 signal: WO1 on PA23 mux E */ +#define MUX_PA23E_TC4_WO1 _L_(4) +#define PINMUX_PA23E_TC4_WO1 ((PIN_PA23E_TC4_WO1 << 16) | MUX_PA23E_TC4_WO1) +#define PORT_PA23E_TC4_WO1 (_UL_(1) << 23) +#define PIN_PB09E_TC4_WO1 _L_(41) /**< \brief TC4 signal: WO1 on PB09 mux E */ +#define MUX_PB09E_TC4_WO1 _L_(4) +#define PINMUX_PB09E_TC4_WO1 ((PIN_PB09E_TC4_WO1 << 16) | MUX_PB09E_TC4_WO1) +#define PORT_PB09E_TC4_WO1 (_UL_(1) << 9) +#define PIN_PB13E_TC4_WO1 _L_(45) /**< \brief TC4 signal: WO1 on PB13 mux E */ +#define MUX_PB13E_TC4_WO1 _L_(4) +#define PINMUX_PB13E_TC4_WO1 ((PIN_PB13E_TC4_WO1 << 16) | MUX_PB13E_TC4_WO1) +#define PORT_PB13E_TC4_WO1 (_UL_(1) << 13) +/* ========== PORT definition for TC5 peripheral ========== */ +#define PIN_PA24E_TC5_WO0 _L_(24) /**< \brief TC5 signal: WO0 on PA24 mux E */ +#define MUX_PA24E_TC5_WO0 _L_(4) +#define PINMUX_PA24E_TC5_WO0 ((PIN_PA24E_TC5_WO0 << 16) | MUX_PA24E_TC5_WO0) +#define PORT_PA24E_TC5_WO0 (_UL_(1) << 24) +#define PIN_PB10E_TC5_WO0 _L_(42) /**< \brief TC5 signal: WO0 on PB10 mux E */ +#define MUX_PB10E_TC5_WO0 _L_(4) +#define PINMUX_PB10E_TC5_WO0 ((PIN_PB10E_TC5_WO0 << 16) | MUX_PB10E_TC5_WO0) +#define PORT_PB10E_TC5_WO0 (_UL_(1) << 10) +#define PIN_PB14E_TC5_WO0 _L_(46) /**< \brief TC5 signal: WO0 on PB14 mux E */ +#define MUX_PB14E_TC5_WO0 _L_(4) +#define PINMUX_PB14E_TC5_WO0 ((PIN_PB14E_TC5_WO0 << 16) | MUX_PB14E_TC5_WO0) +#define PORT_PB14E_TC5_WO0 (_UL_(1) << 14) +#define PIN_PA25E_TC5_WO1 _L_(25) /**< \brief TC5 signal: WO1 on PA25 mux E */ +#define MUX_PA25E_TC5_WO1 _L_(4) +#define PINMUX_PA25E_TC5_WO1 ((PIN_PA25E_TC5_WO1 << 16) | MUX_PA25E_TC5_WO1) +#define PORT_PA25E_TC5_WO1 (_UL_(1) << 25) +#define PIN_PB11E_TC5_WO1 _L_(43) /**< \brief TC5 signal: WO1 on PB11 mux E */ +#define MUX_PB11E_TC5_WO1 _L_(4) +#define PINMUX_PB11E_TC5_WO1 ((PIN_PB11E_TC5_WO1 << 16) | MUX_PB11E_TC5_WO1) +#define PORT_PB11E_TC5_WO1 (_UL_(1) << 11) +#define PIN_PB15E_TC5_WO1 _L_(47) /**< \brief TC5 signal: WO1 on PB15 mux E */ +#define MUX_PB15E_TC5_WO1 _L_(4) +#define PINMUX_PB15E_TC5_WO1 ((PIN_PB15E_TC5_WO1 << 16) | MUX_PB15E_TC5_WO1) +#define PORT_PB15E_TC5_WO1 (_UL_(1) << 15) +/* ========== PORT definition for PDEC peripheral ========== */ +#define PIN_PB23G_PDEC_QDI0 _L_(55) /**< \brief PDEC signal: QDI0 on PB23 mux G */ +#define MUX_PB23G_PDEC_QDI0 _L_(6) +#define PINMUX_PB23G_PDEC_QDI0 ((PIN_PB23G_PDEC_QDI0 << 16) | MUX_PB23G_PDEC_QDI0) +#define PORT_PB23G_PDEC_QDI0 (_UL_(1) << 23) +#define PIN_PA24G_PDEC_QDI0 _L_(24) /**< \brief PDEC signal: QDI0 on PA24 mux G */ +#define MUX_PA24G_PDEC_QDI0 _L_(6) +#define PINMUX_PA24G_PDEC_QDI0 ((PIN_PA24G_PDEC_QDI0 << 16) | MUX_PA24G_PDEC_QDI0) +#define PORT_PA24G_PDEC_QDI0 (_UL_(1) << 24) +#define PIN_PA25G_PDEC_QDI1 _L_(25) /**< \brief PDEC signal: QDI1 on PA25 mux G */ +#define MUX_PA25G_PDEC_QDI1 _L_(6) +#define PINMUX_PA25G_PDEC_QDI1 ((PIN_PA25G_PDEC_QDI1 << 16) | MUX_PA25G_PDEC_QDI1) +#define PORT_PA25G_PDEC_QDI1 (_UL_(1) << 25) +#define PIN_PB22G_PDEC_QDI2 _L_(54) /**< \brief PDEC signal: QDI2 on PB22 mux G */ +#define MUX_PB22G_PDEC_QDI2 _L_(6) +#define PINMUX_PB22G_PDEC_QDI2 ((PIN_PB22G_PDEC_QDI2 << 16) | MUX_PB22G_PDEC_QDI2) +#define PORT_PB22G_PDEC_QDI2 (_UL_(1) << 22) +/* ========== PORT definition for AC peripheral ========== */ +#define PIN_PA04B_AC_AIN0 _L_(4) /**< \brief AC signal: AIN0 on PA04 mux B */ +#define MUX_PA04B_AC_AIN0 _L_(1) +#define PINMUX_PA04B_AC_AIN0 ((PIN_PA04B_AC_AIN0 << 16) | MUX_PA04B_AC_AIN0) +#define PORT_PA04B_AC_AIN0 (_UL_(1) << 4) +#define PIN_PA05B_AC_AIN1 _L_(5) /**< \brief AC signal: AIN1 on PA05 mux B */ +#define MUX_PA05B_AC_AIN1 _L_(1) +#define PINMUX_PA05B_AC_AIN1 ((PIN_PA05B_AC_AIN1 << 16) | MUX_PA05B_AC_AIN1) +#define PORT_PA05B_AC_AIN1 (_UL_(1) << 5) +#define PIN_PA06B_AC_AIN2 _L_(6) /**< \brief AC signal: AIN2 on PA06 mux B */ +#define MUX_PA06B_AC_AIN2 _L_(1) +#define PINMUX_PA06B_AC_AIN2 ((PIN_PA06B_AC_AIN2 << 16) | MUX_PA06B_AC_AIN2) +#define PORT_PA06B_AC_AIN2 (_UL_(1) << 6) +#define PIN_PA07B_AC_AIN3 _L_(7) /**< \brief AC signal: AIN3 on PA07 mux B */ +#define MUX_PA07B_AC_AIN3 _L_(1) +#define PINMUX_PA07B_AC_AIN3 ((PIN_PA07B_AC_AIN3 << 16) | MUX_PA07B_AC_AIN3) +#define PORT_PA07B_AC_AIN3 (_UL_(1) << 7) +#define PIN_PA12M_AC_CMP0 _L_(12) /**< \brief AC signal: CMP0 on PA12 mux M */ +#define MUX_PA12M_AC_CMP0 _L_(12) +#define PINMUX_PA12M_AC_CMP0 ((PIN_PA12M_AC_CMP0 << 16) | MUX_PA12M_AC_CMP0) +#define PORT_PA12M_AC_CMP0 (_UL_(1) << 12) +#define PIN_PA18M_AC_CMP0 _L_(18) /**< \brief AC signal: CMP0 on PA18 mux M */ +#define MUX_PA18M_AC_CMP0 _L_(12) +#define PINMUX_PA18M_AC_CMP0 ((PIN_PA18M_AC_CMP0 << 16) | MUX_PA18M_AC_CMP0) +#define PORT_PA18M_AC_CMP0 (_UL_(1) << 18) +#define PIN_PA13M_AC_CMP1 _L_(13) /**< \brief AC signal: CMP1 on PA13 mux M */ +#define MUX_PA13M_AC_CMP1 _L_(12) +#define PINMUX_PA13M_AC_CMP1 ((PIN_PA13M_AC_CMP1 << 16) | MUX_PA13M_AC_CMP1) +#define PORT_PA13M_AC_CMP1 (_UL_(1) << 13) +#define PIN_PA19M_AC_CMP1 _L_(19) /**< \brief AC signal: CMP1 on PA19 mux M */ +#define MUX_PA19M_AC_CMP1 _L_(12) +#define PINMUX_PA19M_AC_CMP1 ((PIN_PA19M_AC_CMP1 << 16) | MUX_PA19M_AC_CMP1) +#define PORT_PA19M_AC_CMP1 (_UL_(1) << 19) +/* ========== PORT definition for QSPI peripheral ========== */ +#define PIN_PB11H_QSPI_CS _L_(43) /**< \brief QSPI signal: CS on PB11 mux H */ +#define MUX_PB11H_QSPI_CS _L_(7) +#define PINMUX_PB11H_QSPI_CS ((PIN_PB11H_QSPI_CS << 16) | MUX_PB11H_QSPI_CS) +#define PORT_PB11H_QSPI_CS (_UL_(1) << 11) +#define PIN_PA08H_QSPI_DATA0 _L_(8) /**< \brief QSPI signal: DATA0 on PA08 mux H */ +#define MUX_PA08H_QSPI_DATA0 _L_(7) +#define PINMUX_PA08H_QSPI_DATA0 ((PIN_PA08H_QSPI_DATA0 << 16) | MUX_PA08H_QSPI_DATA0) +#define PORT_PA08H_QSPI_DATA0 (_UL_(1) << 8) +#define PIN_PA09H_QSPI_DATA1 _L_(9) /**< \brief QSPI signal: DATA1 on PA09 mux H */ +#define MUX_PA09H_QSPI_DATA1 _L_(7) +#define PINMUX_PA09H_QSPI_DATA1 ((PIN_PA09H_QSPI_DATA1 << 16) | MUX_PA09H_QSPI_DATA1) +#define PORT_PA09H_QSPI_DATA1 (_UL_(1) << 9) +#define PIN_PA10H_QSPI_DATA2 _L_(10) /**< \brief QSPI signal: DATA2 on PA10 mux H */ +#define MUX_PA10H_QSPI_DATA2 _L_(7) +#define PINMUX_PA10H_QSPI_DATA2 ((PIN_PA10H_QSPI_DATA2 << 16) | MUX_PA10H_QSPI_DATA2) +#define PORT_PA10H_QSPI_DATA2 (_UL_(1) << 10) +#define PIN_PA11H_QSPI_DATA3 _L_(11) /**< \brief QSPI signal: DATA3 on PA11 mux H */ +#define MUX_PA11H_QSPI_DATA3 _L_(7) +#define PINMUX_PA11H_QSPI_DATA3 ((PIN_PA11H_QSPI_DATA3 << 16) | MUX_PA11H_QSPI_DATA3) +#define PORT_PA11H_QSPI_DATA3 (_UL_(1) << 11) +#define PIN_PB10H_QSPI_SCK _L_(42) /**< \brief QSPI signal: SCK on PB10 mux H */ +#define MUX_PB10H_QSPI_SCK _L_(7) +#define PINMUX_PB10H_QSPI_SCK ((PIN_PB10H_QSPI_SCK << 16) | MUX_PB10H_QSPI_SCK) +#define PORT_PB10H_QSPI_SCK (_UL_(1) << 10) +/* ========== PORT definition for CCL peripheral ========== */ +#define PIN_PA04N_CCL_IN0 _L_(4) /**< \brief CCL signal: IN0 on PA04 mux N */ +#define MUX_PA04N_CCL_IN0 _L_(13) +#define PINMUX_PA04N_CCL_IN0 ((PIN_PA04N_CCL_IN0 << 16) | MUX_PA04N_CCL_IN0) +#define PORT_PA04N_CCL_IN0 (_UL_(1) << 4) +#define PIN_PA16N_CCL_IN0 _L_(16) /**< \brief CCL signal: IN0 on PA16 mux N */ +#define MUX_PA16N_CCL_IN0 _L_(13) +#define PINMUX_PA16N_CCL_IN0 ((PIN_PA16N_CCL_IN0 << 16) | MUX_PA16N_CCL_IN0) +#define PORT_PA16N_CCL_IN0 (_UL_(1) << 16) +#define PIN_PB22N_CCL_IN0 _L_(54) /**< \brief CCL signal: IN0 on PB22 mux N */ +#define MUX_PB22N_CCL_IN0 _L_(13) +#define PINMUX_PB22N_CCL_IN0 ((PIN_PB22N_CCL_IN0 << 16) | MUX_PB22N_CCL_IN0) +#define PORT_PB22N_CCL_IN0 (_UL_(1) << 22) +#define PIN_PA05N_CCL_IN1 _L_(5) /**< \brief CCL signal: IN1 on PA05 mux N */ +#define MUX_PA05N_CCL_IN1 _L_(13) +#define PINMUX_PA05N_CCL_IN1 ((PIN_PA05N_CCL_IN1 << 16) | MUX_PA05N_CCL_IN1) +#define PORT_PA05N_CCL_IN1 (_UL_(1) << 5) +#define PIN_PA17N_CCL_IN1 _L_(17) /**< \brief CCL signal: IN1 on PA17 mux N */ +#define MUX_PA17N_CCL_IN1 _L_(13) +#define PINMUX_PA17N_CCL_IN1 ((PIN_PA17N_CCL_IN1 << 16) | MUX_PA17N_CCL_IN1) +#define PORT_PA17N_CCL_IN1 (_UL_(1) << 17) +#define PIN_PB00N_CCL_IN1 _L_(32) /**< \brief CCL signal: IN1 on PB00 mux N */ +#define MUX_PB00N_CCL_IN1 _L_(13) +#define PINMUX_PB00N_CCL_IN1 ((PIN_PB00N_CCL_IN1 << 16) | MUX_PB00N_CCL_IN1) +#define PORT_PB00N_CCL_IN1 (_UL_(1) << 0) +#define PIN_PA06N_CCL_IN2 _L_(6) /**< \brief CCL signal: IN2 on PA06 mux N */ +#define MUX_PA06N_CCL_IN2 _L_(13) +#define PINMUX_PA06N_CCL_IN2 ((PIN_PA06N_CCL_IN2 << 16) | MUX_PA06N_CCL_IN2) +#define PORT_PA06N_CCL_IN2 (_UL_(1) << 6) +#define PIN_PA18N_CCL_IN2 _L_(18) /**< \brief CCL signal: IN2 on PA18 mux N */ +#define MUX_PA18N_CCL_IN2 _L_(13) +#define PINMUX_PA18N_CCL_IN2 ((PIN_PA18N_CCL_IN2 << 16) | MUX_PA18N_CCL_IN2) +#define PORT_PA18N_CCL_IN2 (_UL_(1) << 18) +#define PIN_PB01N_CCL_IN2 _L_(33) /**< \brief CCL signal: IN2 on PB01 mux N */ +#define MUX_PB01N_CCL_IN2 _L_(13) +#define PINMUX_PB01N_CCL_IN2 ((PIN_PB01N_CCL_IN2 << 16) | MUX_PB01N_CCL_IN2) +#define PORT_PB01N_CCL_IN2 (_UL_(1) << 1) +#define PIN_PA08N_CCL_IN3 _L_(8) /**< \brief CCL signal: IN3 on PA08 mux N */ +#define MUX_PA08N_CCL_IN3 _L_(13) +#define PINMUX_PA08N_CCL_IN3 ((PIN_PA08N_CCL_IN3 << 16) | MUX_PA08N_CCL_IN3) +#define PORT_PA08N_CCL_IN3 (_UL_(1) << 8) +#define PIN_PA30N_CCL_IN3 _L_(30) /**< \brief CCL signal: IN3 on PA30 mux N */ +#define MUX_PA30N_CCL_IN3 _L_(13) +#define PINMUX_PA30N_CCL_IN3 ((PIN_PA30N_CCL_IN3 << 16) | MUX_PA30N_CCL_IN3) +#define PORT_PA30N_CCL_IN3 (_UL_(1) << 30) +#define PIN_PA09N_CCL_IN4 _L_(9) /**< \brief CCL signal: IN4 on PA09 mux N */ +#define MUX_PA09N_CCL_IN4 _L_(13) +#define PINMUX_PA09N_CCL_IN4 ((PIN_PA09N_CCL_IN4 << 16) | MUX_PA09N_CCL_IN4) +#define PORT_PA09N_CCL_IN4 (_UL_(1) << 9) +#define PIN_PA10N_CCL_IN5 _L_(10) /**< \brief CCL signal: IN5 on PA10 mux N */ +#define MUX_PA10N_CCL_IN5 _L_(13) +#define PINMUX_PA10N_CCL_IN5 ((PIN_PA10N_CCL_IN5 << 16) | MUX_PA10N_CCL_IN5) +#define PORT_PA10N_CCL_IN5 (_UL_(1) << 10) +#define PIN_PA22N_CCL_IN6 _L_(22) /**< \brief CCL signal: IN6 on PA22 mux N */ +#define MUX_PA22N_CCL_IN6 _L_(13) +#define PINMUX_PA22N_CCL_IN6 ((PIN_PA22N_CCL_IN6 << 16) | MUX_PA22N_CCL_IN6) +#define PORT_PA22N_CCL_IN6 (_UL_(1) << 22) +#define PIN_PB06N_CCL_IN6 _L_(38) /**< \brief CCL signal: IN6 on PB06 mux N */ +#define MUX_PB06N_CCL_IN6 _L_(13) +#define PINMUX_PB06N_CCL_IN6 ((PIN_PB06N_CCL_IN6 << 16) | MUX_PB06N_CCL_IN6) +#define PORT_PB06N_CCL_IN6 (_UL_(1) << 6) +#define PIN_PA23N_CCL_IN7 _L_(23) /**< \brief CCL signal: IN7 on PA23 mux N */ +#define MUX_PA23N_CCL_IN7 _L_(13) +#define PINMUX_PA23N_CCL_IN7 ((PIN_PA23N_CCL_IN7 << 16) | MUX_PA23N_CCL_IN7) +#define PORT_PA23N_CCL_IN7 (_UL_(1) << 23) +#define PIN_PB07N_CCL_IN7 _L_(39) /**< \brief CCL signal: IN7 on PB07 mux N */ +#define MUX_PB07N_CCL_IN7 _L_(13) +#define PINMUX_PB07N_CCL_IN7 ((PIN_PB07N_CCL_IN7 << 16) | MUX_PB07N_CCL_IN7) +#define PORT_PB07N_CCL_IN7 (_UL_(1) << 7) +#define PIN_PA24N_CCL_IN8 _L_(24) /**< \brief CCL signal: IN8 on PA24 mux N */ +#define MUX_PA24N_CCL_IN8 _L_(13) +#define PINMUX_PA24N_CCL_IN8 ((PIN_PA24N_CCL_IN8 << 16) | MUX_PA24N_CCL_IN8) +#define PORT_PA24N_CCL_IN8 (_UL_(1) << 24) +#define PIN_PB08N_CCL_IN8 _L_(40) /**< \brief CCL signal: IN8 on PB08 mux N */ +#define MUX_PB08N_CCL_IN8 _L_(13) +#define PINMUX_PB08N_CCL_IN8 ((PIN_PB08N_CCL_IN8 << 16) | MUX_PB08N_CCL_IN8) +#define PORT_PB08N_CCL_IN8 (_UL_(1) << 8) +#define PIN_PB14N_CCL_IN9 _L_(46) /**< \brief CCL signal: IN9 on PB14 mux N */ +#define MUX_PB14N_CCL_IN9 _L_(13) +#define PINMUX_PB14N_CCL_IN9 ((PIN_PB14N_CCL_IN9 << 16) | MUX_PB14N_CCL_IN9) +#define PORT_PB14N_CCL_IN9 (_UL_(1) << 14) +#define PIN_PB15N_CCL_IN10 _L_(47) /**< \brief CCL signal: IN10 on PB15 mux N */ +#define MUX_PB15N_CCL_IN10 _L_(13) +#define PINMUX_PB15N_CCL_IN10 ((PIN_PB15N_CCL_IN10 << 16) | MUX_PB15N_CCL_IN10) +#define PORT_PB15N_CCL_IN10 (_UL_(1) << 15) +#define PIN_PB10N_CCL_IN11 _L_(42) /**< \brief CCL signal: IN11 on PB10 mux N */ +#define MUX_PB10N_CCL_IN11 _L_(13) +#define PINMUX_PB10N_CCL_IN11 ((PIN_PB10N_CCL_IN11 << 16) | MUX_PB10N_CCL_IN11) +#define PORT_PB10N_CCL_IN11 (_UL_(1) << 10) +#define PIN_PB16N_CCL_IN11 _L_(48) /**< \brief CCL signal: IN11 on PB16 mux N */ +#define MUX_PB16N_CCL_IN11 _L_(13) +#define PINMUX_PB16N_CCL_IN11 ((PIN_PB16N_CCL_IN11 << 16) | MUX_PB16N_CCL_IN11) +#define PORT_PB16N_CCL_IN11 (_UL_(1) << 16) +#define PIN_PA07N_CCL_OUT0 _L_(7) /**< \brief CCL signal: OUT0 on PA07 mux N */ +#define MUX_PA07N_CCL_OUT0 _L_(13) +#define PINMUX_PA07N_CCL_OUT0 ((PIN_PA07N_CCL_OUT0 << 16) | MUX_PA07N_CCL_OUT0) +#define PORT_PA07N_CCL_OUT0 (_UL_(1) << 7) +#define PIN_PA19N_CCL_OUT0 _L_(19) /**< \brief CCL signal: OUT0 on PA19 mux N */ +#define MUX_PA19N_CCL_OUT0 _L_(13) +#define PINMUX_PA19N_CCL_OUT0 ((PIN_PA19N_CCL_OUT0 << 16) | MUX_PA19N_CCL_OUT0) +#define PORT_PA19N_CCL_OUT0 (_UL_(1) << 19) +#define PIN_PB02N_CCL_OUT0 _L_(34) /**< \brief CCL signal: OUT0 on PB02 mux N */ +#define MUX_PB02N_CCL_OUT0 _L_(13) +#define PINMUX_PB02N_CCL_OUT0 ((PIN_PB02N_CCL_OUT0 << 16) | MUX_PB02N_CCL_OUT0) +#define PORT_PB02N_CCL_OUT0 (_UL_(1) << 2) +#define PIN_PB23N_CCL_OUT0 _L_(55) /**< \brief CCL signal: OUT0 on PB23 mux N */ +#define MUX_PB23N_CCL_OUT0 _L_(13) +#define PINMUX_PB23N_CCL_OUT0 ((PIN_PB23N_CCL_OUT0 << 16) | MUX_PB23N_CCL_OUT0) +#define PORT_PB23N_CCL_OUT0 (_UL_(1) << 23) +#define PIN_PA11N_CCL_OUT1 _L_(11) /**< \brief CCL signal: OUT1 on PA11 mux N */ +#define MUX_PA11N_CCL_OUT1 _L_(13) +#define PINMUX_PA11N_CCL_OUT1 ((PIN_PA11N_CCL_OUT1 << 16) | MUX_PA11N_CCL_OUT1) +#define PORT_PA11N_CCL_OUT1 (_UL_(1) << 11) +#define PIN_PA31N_CCL_OUT1 _L_(31) /**< \brief CCL signal: OUT1 on PA31 mux N */ +#define MUX_PA31N_CCL_OUT1 _L_(13) +#define PINMUX_PA31N_CCL_OUT1 ((PIN_PA31N_CCL_OUT1 << 16) | MUX_PA31N_CCL_OUT1) +#define PORT_PA31N_CCL_OUT1 (_UL_(1) << 31) +#define PIN_PB11N_CCL_OUT1 _L_(43) /**< \brief CCL signal: OUT1 on PB11 mux N */ +#define MUX_PB11N_CCL_OUT1 _L_(13) +#define PINMUX_PB11N_CCL_OUT1 ((PIN_PB11N_CCL_OUT1 << 16) | MUX_PB11N_CCL_OUT1) +#define PORT_PB11N_CCL_OUT1 (_UL_(1) << 11) +#define PIN_PA25N_CCL_OUT2 _L_(25) /**< \brief CCL signal: OUT2 on PA25 mux N */ +#define MUX_PA25N_CCL_OUT2 _L_(13) +#define PINMUX_PA25N_CCL_OUT2 ((PIN_PA25N_CCL_OUT2 << 16) | MUX_PA25N_CCL_OUT2) +#define PORT_PA25N_CCL_OUT2 (_UL_(1) << 25) +#define PIN_PB09N_CCL_OUT2 _L_(41) /**< \brief CCL signal: OUT2 on PB09 mux N */ +#define MUX_PB09N_CCL_OUT2 _L_(13) +#define PINMUX_PB09N_CCL_OUT2 ((PIN_PB09N_CCL_OUT2 << 16) | MUX_PB09N_CCL_OUT2) +#define PORT_PB09N_CCL_OUT2 (_UL_(1) << 9) +#define PIN_PB17N_CCL_OUT3 _L_(49) /**< \brief CCL signal: OUT3 on PB17 mux N */ +#define MUX_PB17N_CCL_OUT3 _L_(13) +#define PINMUX_PB17N_CCL_OUT3 ((PIN_PB17N_CCL_OUT3 << 16) | MUX_PB17N_CCL_OUT3) +#define PORT_PB17N_CCL_OUT3 (_UL_(1) << 17) +/* ========== PORT definition for SERCOM4 peripheral ========== */ +#define PIN_PA13D_SERCOM4_PAD0 _L_(13) /**< \brief SERCOM4 signal: PAD0 on PA13 mux D */ +#define MUX_PA13D_SERCOM4_PAD0 _L_(3) +#define PINMUX_PA13D_SERCOM4_PAD0 ((PIN_PA13D_SERCOM4_PAD0 << 16) | MUX_PA13D_SERCOM4_PAD0) +#define PORT_PA13D_SERCOM4_PAD0 (_UL_(1) << 13) +#define PIN_PB08D_SERCOM4_PAD0 _L_(40) /**< \brief SERCOM4 signal: PAD0 on PB08 mux D */ +#define MUX_PB08D_SERCOM4_PAD0 _L_(3) +#define PINMUX_PB08D_SERCOM4_PAD0 ((PIN_PB08D_SERCOM4_PAD0 << 16) | MUX_PB08D_SERCOM4_PAD0) +#define PORT_PB08D_SERCOM4_PAD0 (_UL_(1) << 8) +#define PIN_PB12C_SERCOM4_PAD0 _L_(44) /**< \brief SERCOM4 signal: PAD0 on PB12 mux C */ +#define MUX_PB12C_SERCOM4_PAD0 _L_(2) +#define PINMUX_PB12C_SERCOM4_PAD0 ((PIN_PB12C_SERCOM4_PAD0 << 16) | MUX_PB12C_SERCOM4_PAD0) +#define PORT_PB12C_SERCOM4_PAD0 (_UL_(1) << 12) +#define PIN_PA12D_SERCOM4_PAD1 _L_(12) /**< \brief SERCOM4 signal: PAD1 on PA12 mux D */ +#define MUX_PA12D_SERCOM4_PAD1 _L_(3) +#define PINMUX_PA12D_SERCOM4_PAD1 ((PIN_PA12D_SERCOM4_PAD1 << 16) | MUX_PA12D_SERCOM4_PAD1) +#define PORT_PA12D_SERCOM4_PAD1 (_UL_(1) << 12) +#define PIN_PB09D_SERCOM4_PAD1 _L_(41) /**< \brief SERCOM4 signal: PAD1 on PB09 mux D */ +#define MUX_PB09D_SERCOM4_PAD1 _L_(3) +#define PINMUX_PB09D_SERCOM4_PAD1 ((PIN_PB09D_SERCOM4_PAD1 << 16) | MUX_PB09D_SERCOM4_PAD1) +#define PORT_PB09D_SERCOM4_PAD1 (_UL_(1) << 9) +#define PIN_PB13C_SERCOM4_PAD1 _L_(45) /**< \brief SERCOM4 signal: PAD1 on PB13 mux C */ +#define MUX_PB13C_SERCOM4_PAD1 _L_(2) +#define PINMUX_PB13C_SERCOM4_PAD1 ((PIN_PB13C_SERCOM4_PAD1 << 16) | MUX_PB13C_SERCOM4_PAD1) +#define PORT_PB13C_SERCOM4_PAD1 (_UL_(1) << 13) +#define PIN_PA14D_SERCOM4_PAD2 _L_(14) /**< \brief SERCOM4 signal: PAD2 on PA14 mux D */ +#define MUX_PA14D_SERCOM4_PAD2 _L_(3) +#define PINMUX_PA14D_SERCOM4_PAD2 ((PIN_PA14D_SERCOM4_PAD2 << 16) | MUX_PA14D_SERCOM4_PAD2) +#define PORT_PA14D_SERCOM4_PAD2 (_UL_(1) << 14) +#define PIN_PB10D_SERCOM4_PAD2 _L_(42) /**< \brief SERCOM4 signal: PAD2 on PB10 mux D */ +#define MUX_PB10D_SERCOM4_PAD2 _L_(3) +#define PINMUX_PB10D_SERCOM4_PAD2 ((PIN_PB10D_SERCOM4_PAD2 << 16) | MUX_PB10D_SERCOM4_PAD2) +#define PORT_PB10D_SERCOM4_PAD2 (_UL_(1) << 10) +#define PIN_PB14C_SERCOM4_PAD2 _L_(46) /**< \brief SERCOM4 signal: PAD2 on PB14 mux C */ +#define MUX_PB14C_SERCOM4_PAD2 _L_(2) +#define PINMUX_PB14C_SERCOM4_PAD2 ((PIN_PB14C_SERCOM4_PAD2 << 16) | MUX_PB14C_SERCOM4_PAD2) +#define PORT_PB14C_SERCOM4_PAD2 (_UL_(1) << 14) +#define PIN_PB11D_SERCOM4_PAD3 _L_(43) /**< \brief SERCOM4 signal: PAD3 on PB11 mux D */ +#define MUX_PB11D_SERCOM4_PAD3 _L_(3) +#define PINMUX_PB11D_SERCOM4_PAD3 ((PIN_PB11D_SERCOM4_PAD3 << 16) | MUX_PB11D_SERCOM4_PAD3) +#define PORT_PB11D_SERCOM4_PAD3 (_UL_(1) << 11) +#define PIN_PA15D_SERCOM4_PAD3 _L_(15) /**< \brief SERCOM4 signal: PAD3 on PA15 mux D */ +#define MUX_PA15D_SERCOM4_PAD3 _L_(3) +#define PINMUX_PA15D_SERCOM4_PAD3 ((PIN_PA15D_SERCOM4_PAD3 << 16) | MUX_PA15D_SERCOM4_PAD3) +#define PORT_PA15D_SERCOM4_PAD3 (_UL_(1) << 15) +#define PIN_PB15C_SERCOM4_PAD3 _L_(47) /**< \brief SERCOM4 signal: PAD3 on PB15 mux C */ +#define MUX_PB15C_SERCOM4_PAD3 _L_(2) +#define PINMUX_PB15C_SERCOM4_PAD3 ((PIN_PB15C_SERCOM4_PAD3 << 16) | MUX_PB15C_SERCOM4_PAD3) +#define PORT_PB15C_SERCOM4_PAD3 (_UL_(1) << 15) +/* ========== PORT definition for SERCOM5 peripheral ========== */ +#define PIN_PA23D_SERCOM5_PAD0 _L_(23) /**< \brief SERCOM5 signal: PAD0 on PA23 mux D */ +#define MUX_PA23D_SERCOM5_PAD0 _L_(3) +#define PINMUX_PA23D_SERCOM5_PAD0 ((PIN_PA23D_SERCOM5_PAD0 << 16) | MUX_PA23D_SERCOM5_PAD0) +#define PORT_PA23D_SERCOM5_PAD0 (_UL_(1) << 23) +#define PIN_PB02D_SERCOM5_PAD0 _L_(34) /**< \brief SERCOM5 signal: PAD0 on PB02 mux D */ +#define MUX_PB02D_SERCOM5_PAD0 _L_(3) +#define PINMUX_PB02D_SERCOM5_PAD0 ((PIN_PB02D_SERCOM5_PAD0 << 16) | MUX_PB02D_SERCOM5_PAD0) +#define PORT_PB02D_SERCOM5_PAD0 (_UL_(1) << 2) +#define PIN_PB31D_SERCOM5_PAD0 _L_(63) /**< \brief SERCOM5 signal: PAD0 on PB31 mux D */ +#define MUX_PB31D_SERCOM5_PAD0 _L_(3) +#define PINMUX_PB31D_SERCOM5_PAD0 ((PIN_PB31D_SERCOM5_PAD0 << 16) | MUX_PB31D_SERCOM5_PAD0) +#define PORT_PB31D_SERCOM5_PAD0 (_UL_(1) << 31) +#define PIN_PB16C_SERCOM5_PAD0 _L_(48) /**< \brief SERCOM5 signal: PAD0 on PB16 mux C */ +#define MUX_PB16C_SERCOM5_PAD0 _L_(2) +#define PINMUX_PB16C_SERCOM5_PAD0 ((PIN_PB16C_SERCOM5_PAD0 << 16) | MUX_PB16C_SERCOM5_PAD0) +#define PORT_PB16C_SERCOM5_PAD0 (_UL_(1) << 16) +#define PIN_PA22D_SERCOM5_PAD1 _L_(22) /**< \brief SERCOM5 signal: PAD1 on PA22 mux D */ +#define MUX_PA22D_SERCOM5_PAD1 _L_(3) +#define PINMUX_PA22D_SERCOM5_PAD1 ((PIN_PA22D_SERCOM5_PAD1 << 16) | MUX_PA22D_SERCOM5_PAD1) +#define PORT_PA22D_SERCOM5_PAD1 (_UL_(1) << 22) +#define PIN_PB03D_SERCOM5_PAD1 _L_(35) /**< \brief SERCOM5 signal: PAD1 on PB03 mux D */ +#define MUX_PB03D_SERCOM5_PAD1 _L_(3) +#define PINMUX_PB03D_SERCOM5_PAD1 ((PIN_PB03D_SERCOM5_PAD1 << 16) | MUX_PB03D_SERCOM5_PAD1) +#define PORT_PB03D_SERCOM5_PAD1 (_UL_(1) << 3) +#define PIN_PB30D_SERCOM5_PAD1 _L_(62) /**< \brief SERCOM5 signal: PAD1 on PB30 mux D */ +#define MUX_PB30D_SERCOM5_PAD1 _L_(3) +#define PINMUX_PB30D_SERCOM5_PAD1 ((PIN_PB30D_SERCOM5_PAD1 << 16) | MUX_PB30D_SERCOM5_PAD1) +#define PORT_PB30D_SERCOM5_PAD1 (_UL_(1) << 30) +#define PIN_PB17C_SERCOM5_PAD1 _L_(49) /**< \brief SERCOM5 signal: PAD1 on PB17 mux C */ +#define MUX_PB17C_SERCOM5_PAD1 _L_(2) +#define PINMUX_PB17C_SERCOM5_PAD1 ((PIN_PB17C_SERCOM5_PAD1 << 16) | MUX_PB17C_SERCOM5_PAD1) +#define PORT_PB17C_SERCOM5_PAD1 (_UL_(1) << 17) +#define PIN_PA24D_SERCOM5_PAD2 _L_(24) /**< \brief SERCOM5 signal: PAD2 on PA24 mux D */ +#define MUX_PA24D_SERCOM5_PAD2 _L_(3) +#define PINMUX_PA24D_SERCOM5_PAD2 ((PIN_PA24D_SERCOM5_PAD2 << 16) | MUX_PA24D_SERCOM5_PAD2) +#define PORT_PA24D_SERCOM5_PAD2 (_UL_(1) << 24) +#define PIN_PB00D_SERCOM5_PAD2 _L_(32) /**< \brief SERCOM5 signal: PAD2 on PB00 mux D */ +#define MUX_PB00D_SERCOM5_PAD2 _L_(3) +#define PINMUX_PB00D_SERCOM5_PAD2 ((PIN_PB00D_SERCOM5_PAD2 << 16) | MUX_PB00D_SERCOM5_PAD2) +#define PORT_PB00D_SERCOM5_PAD2 (_UL_(1) << 0) +#define PIN_PB22D_SERCOM5_PAD2 _L_(54) /**< \brief SERCOM5 signal: PAD2 on PB22 mux D */ +#define MUX_PB22D_SERCOM5_PAD2 _L_(3) +#define PINMUX_PB22D_SERCOM5_PAD2 ((PIN_PB22D_SERCOM5_PAD2 << 16) | MUX_PB22D_SERCOM5_PAD2) +#define PORT_PB22D_SERCOM5_PAD2 (_UL_(1) << 22) +#define PIN_PA20C_SERCOM5_PAD2 _L_(20) /**< \brief SERCOM5 signal: PAD2 on PA20 mux C */ +#define MUX_PA20C_SERCOM5_PAD2 _L_(2) +#define PINMUX_PA20C_SERCOM5_PAD2 ((PIN_PA20C_SERCOM5_PAD2 << 16) | MUX_PA20C_SERCOM5_PAD2) +#define PORT_PA20C_SERCOM5_PAD2 (_UL_(1) << 20) +#define PIN_PA25D_SERCOM5_PAD3 _L_(25) /**< \brief SERCOM5 signal: PAD3 on PA25 mux D */ +#define MUX_PA25D_SERCOM5_PAD3 _L_(3) +#define PINMUX_PA25D_SERCOM5_PAD3 ((PIN_PA25D_SERCOM5_PAD3 << 16) | MUX_PA25D_SERCOM5_PAD3) +#define PORT_PA25D_SERCOM5_PAD3 (_UL_(1) << 25) +#define PIN_PB01D_SERCOM5_PAD3 _L_(33) /**< \brief SERCOM5 signal: PAD3 on PB01 mux D */ +#define MUX_PB01D_SERCOM5_PAD3 _L_(3) +#define PINMUX_PB01D_SERCOM5_PAD3 ((PIN_PB01D_SERCOM5_PAD3 << 16) | MUX_PB01D_SERCOM5_PAD3) +#define PORT_PB01D_SERCOM5_PAD3 (_UL_(1) << 1) +#define PIN_PB23D_SERCOM5_PAD3 _L_(55) /**< \brief SERCOM5 signal: PAD3 on PB23 mux D */ +#define MUX_PB23D_SERCOM5_PAD3 _L_(3) +#define PINMUX_PB23D_SERCOM5_PAD3 ((PIN_PB23D_SERCOM5_PAD3 << 16) | MUX_PB23D_SERCOM5_PAD3) +#define PORT_PB23D_SERCOM5_PAD3 (_UL_(1) << 23) +#define PIN_PA21C_SERCOM5_PAD3 _L_(21) /**< \brief SERCOM5 signal: PAD3 on PA21 mux C */ +#define MUX_PA21C_SERCOM5_PAD3 _L_(2) +#define PINMUX_PA21C_SERCOM5_PAD3 ((PIN_PA21C_SERCOM5_PAD3 << 16) | MUX_PA21C_SERCOM5_PAD3) +#define PORT_PA21C_SERCOM5_PAD3 (_UL_(1) << 21) +/* ========== PORT definition for TCC4 peripheral ========== */ +#define PIN_PB14F_TCC4_WO0 _L_(46) /**< \brief TCC4 signal: WO0 on PB14 mux F */ +#define MUX_PB14F_TCC4_WO0 _L_(5) +#define PINMUX_PB14F_TCC4_WO0 ((PIN_PB14F_TCC4_WO0 << 16) | MUX_PB14F_TCC4_WO0) +#define PORT_PB14F_TCC4_WO0 (_UL_(1) << 14) +#define PIN_PB30F_TCC4_WO0 _L_(62) /**< \brief TCC4 signal: WO0 on PB30 mux F */ +#define MUX_PB30F_TCC4_WO0 _L_(5) +#define PINMUX_PB30F_TCC4_WO0 ((PIN_PB30F_TCC4_WO0 << 16) | MUX_PB30F_TCC4_WO0) +#define PORT_PB30F_TCC4_WO0 (_UL_(1) << 30) +#define PIN_PB15F_TCC4_WO1 _L_(47) /**< \brief TCC4 signal: WO1 on PB15 mux F */ +#define MUX_PB15F_TCC4_WO1 _L_(5) +#define PINMUX_PB15F_TCC4_WO1 ((PIN_PB15F_TCC4_WO1 << 16) | MUX_PB15F_TCC4_WO1) +#define PORT_PB15F_TCC4_WO1 (_UL_(1) << 15) +#define PIN_PB31F_TCC4_WO1 _L_(63) /**< \brief TCC4 signal: WO1 on PB31 mux F */ +#define MUX_PB31F_TCC4_WO1 _L_(5) +#define PINMUX_PB31F_TCC4_WO1 ((PIN_PB31F_TCC4_WO1 << 16) | MUX_PB31F_TCC4_WO1) +#define PORT_PB31F_TCC4_WO1 (_UL_(1) << 31) +/* ========== PORT definition for ADC0 peripheral ========== */ +#define PIN_PA02B_ADC0_AIN0 _L_(2) /**< \brief ADC0 signal: AIN0 on PA02 mux B */ +#define MUX_PA02B_ADC0_AIN0 _L_(1) +#define PINMUX_PA02B_ADC0_AIN0 ((PIN_PA02B_ADC0_AIN0 << 16) | MUX_PA02B_ADC0_AIN0) +#define PORT_PA02B_ADC0_AIN0 (_UL_(1) << 2) +#define PIN_PA03B_ADC0_AIN1 _L_(3) /**< \brief ADC0 signal: AIN1 on PA03 mux B */ +#define MUX_PA03B_ADC0_AIN1 _L_(1) +#define PINMUX_PA03B_ADC0_AIN1 ((PIN_PA03B_ADC0_AIN1 << 16) | MUX_PA03B_ADC0_AIN1) +#define PORT_PA03B_ADC0_AIN1 (_UL_(1) << 3) +#define PIN_PB08B_ADC0_AIN2 _L_(40) /**< \brief ADC0 signal: AIN2 on PB08 mux B */ +#define MUX_PB08B_ADC0_AIN2 _L_(1) +#define PINMUX_PB08B_ADC0_AIN2 ((PIN_PB08B_ADC0_AIN2 << 16) | MUX_PB08B_ADC0_AIN2) +#define PORT_PB08B_ADC0_AIN2 (_UL_(1) << 8) +#define PIN_PB09B_ADC0_AIN3 _L_(41) /**< \brief ADC0 signal: AIN3 on PB09 mux B */ +#define MUX_PB09B_ADC0_AIN3 _L_(1) +#define PINMUX_PB09B_ADC0_AIN3 ((PIN_PB09B_ADC0_AIN3 << 16) | MUX_PB09B_ADC0_AIN3) +#define PORT_PB09B_ADC0_AIN3 (_UL_(1) << 9) +#define PIN_PA04B_ADC0_AIN4 _L_(4) /**< \brief ADC0 signal: AIN4 on PA04 mux B */ +#define MUX_PA04B_ADC0_AIN4 _L_(1) +#define PINMUX_PA04B_ADC0_AIN4 ((PIN_PA04B_ADC0_AIN4 << 16) | MUX_PA04B_ADC0_AIN4) +#define PORT_PA04B_ADC0_AIN4 (_UL_(1) << 4) +#define PIN_PA05B_ADC0_AIN5 _L_(5) /**< \brief ADC0 signal: AIN5 on PA05 mux B */ +#define MUX_PA05B_ADC0_AIN5 _L_(1) +#define PINMUX_PA05B_ADC0_AIN5 ((PIN_PA05B_ADC0_AIN5 << 16) | MUX_PA05B_ADC0_AIN5) +#define PORT_PA05B_ADC0_AIN5 (_UL_(1) << 5) +#define PIN_PA06B_ADC0_AIN6 _L_(6) /**< \brief ADC0 signal: AIN6 on PA06 mux B */ +#define MUX_PA06B_ADC0_AIN6 _L_(1) +#define PINMUX_PA06B_ADC0_AIN6 ((PIN_PA06B_ADC0_AIN6 << 16) | MUX_PA06B_ADC0_AIN6) +#define PORT_PA06B_ADC0_AIN6 (_UL_(1) << 6) +#define PIN_PA07B_ADC0_AIN7 _L_(7) /**< \brief ADC0 signal: AIN7 on PA07 mux B */ +#define MUX_PA07B_ADC0_AIN7 _L_(1) +#define PINMUX_PA07B_ADC0_AIN7 ((PIN_PA07B_ADC0_AIN7 << 16) | MUX_PA07B_ADC0_AIN7) +#define PORT_PA07B_ADC0_AIN7 (_UL_(1) << 7) +#define PIN_PA08B_ADC0_AIN8 _L_(8) /**< \brief ADC0 signal: AIN8 on PA08 mux B */ +#define MUX_PA08B_ADC0_AIN8 _L_(1) +#define PINMUX_PA08B_ADC0_AIN8 ((PIN_PA08B_ADC0_AIN8 << 16) | MUX_PA08B_ADC0_AIN8) +#define PORT_PA08B_ADC0_AIN8 (_UL_(1) << 8) +#define PIN_PA09B_ADC0_AIN9 _L_(9) /**< \brief ADC0 signal: AIN9 on PA09 mux B */ +#define MUX_PA09B_ADC0_AIN9 _L_(1) +#define PINMUX_PA09B_ADC0_AIN9 ((PIN_PA09B_ADC0_AIN9 << 16) | MUX_PA09B_ADC0_AIN9) +#define PORT_PA09B_ADC0_AIN9 (_UL_(1) << 9) +#define PIN_PA10B_ADC0_AIN10 _L_(10) /**< \brief ADC0 signal: AIN10 on PA10 mux B */ +#define MUX_PA10B_ADC0_AIN10 _L_(1) +#define PINMUX_PA10B_ADC0_AIN10 ((PIN_PA10B_ADC0_AIN10 << 16) | MUX_PA10B_ADC0_AIN10) +#define PORT_PA10B_ADC0_AIN10 (_UL_(1) << 10) +#define PIN_PA11B_ADC0_AIN11 _L_(11) /**< \brief ADC0 signal: AIN11 on PA11 mux B */ +#define MUX_PA11B_ADC0_AIN11 _L_(1) +#define PINMUX_PA11B_ADC0_AIN11 ((PIN_PA11B_ADC0_AIN11 << 16) | MUX_PA11B_ADC0_AIN11) +#define PORT_PA11B_ADC0_AIN11 (_UL_(1) << 11) +#define PIN_PB00B_ADC0_AIN12 _L_(32) /**< \brief ADC0 signal: AIN12 on PB00 mux B */ +#define MUX_PB00B_ADC0_AIN12 _L_(1) +#define PINMUX_PB00B_ADC0_AIN12 ((PIN_PB00B_ADC0_AIN12 << 16) | MUX_PB00B_ADC0_AIN12) +#define PORT_PB00B_ADC0_AIN12 (_UL_(1) << 0) +#define PIN_PB01B_ADC0_AIN13 _L_(33) /**< \brief ADC0 signal: AIN13 on PB01 mux B */ +#define MUX_PB01B_ADC0_AIN13 _L_(1) +#define PINMUX_PB01B_ADC0_AIN13 ((PIN_PB01B_ADC0_AIN13 << 16) | MUX_PB01B_ADC0_AIN13) +#define PORT_PB01B_ADC0_AIN13 (_UL_(1) << 1) +#define PIN_PB02B_ADC0_AIN14 _L_(34) /**< \brief ADC0 signal: AIN14 on PB02 mux B */ +#define MUX_PB02B_ADC0_AIN14 _L_(1) +#define PINMUX_PB02B_ADC0_AIN14 ((PIN_PB02B_ADC0_AIN14 << 16) | MUX_PB02B_ADC0_AIN14) +#define PORT_PB02B_ADC0_AIN14 (_UL_(1) << 2) +#define PIN_PB03B_ADC0_AIN15 _L_(35) /**< \brief ADC0 signal: AIN15 on PB03 mux B */ +#define MUX_PB03B_ADC0_AIN15 _L_(1) +#define PINMUX_PB03B_ADC0_AIN15 ((PIN_PB03B_ADC0_AIN15 << 16) | MUX_PB03B_ADC0_AIN15) +#define PORT_PB03B_ADC0_AIN15 (_UL_(1) << 3) +#define PIN_PA03O_ADC0_DRV0 _L_(3) /**< \brief ADC0 signal: DRV0 on PA03 mux O */ +#define MUX_PA03O_ADC0_DRV0 _L_(14) +#define PINMUX_PA03O_ADC0_DRV0 ((PIN_PA03O_ADC0_DRV0 << 16) | MUX_PA03O_ADC0_DRV0) +#define PORT_PA03O_ADC0_DRV0 (_UL_(1) << 3) +#define PIN_PB08O_ADC0_DRV1 _L_(40) /**< \brief ADC0 signal: DRV1 on PB08 mux O */ +#define MUX_PB08O_ADC0_DRV1 _L_(14) +#define PINMUX_PB08O_ADC0_DRV1 ((PIN_PB08O_ADC0_DRV1 << 16) | MUX_PB08O_ADC0_DRV1) +#define PORT_PB08O_ADC0_DRV1 (_UL_(1) << 8) +#define PIN_PB09O_ADC0_DRV2 _L_(41) /**< \brief ADC0 signal: DRV2 on PB09 mux O */ +#define MUX_PB09O_ADC0_DRV2 _L_(14) +#define PINMUX_PB09O_ADC0_DRV2 ((PIN_PB09O_ADC0_DRV2 << 16) | MUX_PB09O_ADC0_DRV2) +#define PORT_PB09O_ADC0_DRV2 (_UL_(1) << 9) +#define PIN_PA04O_ADC0_DRV3 _L_(4) /**< \brief ADC0 signal: DRV3 on PA04 mux O */ +#define MUX_PA04O_ADC0_DRV3 _L_(14) +#define PINMUX_PA04O_ADC0_DRV3 ((PIN_PA04O_ADC0_DRV3 << 16) | MUX_PA04O_ADC0_DRV3) +#define PORT_PA04O_ADC0_DRV3 (_UL_(1) << 4) +#define PIN_PA06O_ADC0_DRV4 _L_(6) /**< \brief ADC0 signal: DRV4 on PA06 mux O */ +#define MUX_PA06O_ADC0_DRV4 _L_(14) +#define PINMUX_PA06O_ADC0_DRV4 ((PIN_PA06O_ADC0_DRV4 << 16) | MUX_PA06O_ADC0_DRV4) +#define PORT_PA06O_ADC0_DRV4 (_UL_(1) << 6) +#define PIN_PA07O_ADC0_DRV5 _L_(7) /**< \brief ADC0 signal: DRV5 on PA07 mux O */ +#define MUX_PA07O_ADC0_DRV5 _L_(14) +#define PINMUX_PA07O_ADC0_DRV5 ((PIN_PA07O_ADC0_DRV5 << 16) | MUX_PA07O_ADC0_DRV5) +#define PORT_PA07O_ADC0_DRV5 (_UL_(1) << 7) +#define PIN_PA08O_ADC0_DRV6 _L_(8) /**< \brief ADC0 signal: DRV6 on PA08 mux O */ +#define MUX_PA08O_ADC0_DRV6 _L_(14) +#define PINMUX_PA08O_ADC0_DRV6 ((PIN_PA08O_ADC0_DRV6 << 16) | MUX_PA08O_ADC0_DRV6) +#define PORT_PA08O_ADC0_DRV6 (_UL_(1) << 8) +#define PIN_PA09O_ADC0_DRV7 _L_(9) /**< \brief ADC0 signal: DRV7 on PA09 mux O */ +#define MUX_PA09O_ADC0_DRV7 _L_(14) +#define PINMUX_PA09O_ADC0_DRV7 ((PIN_PA09O_ADC0_DRV7 << 16) | MUX_PA09O_ADC0_DRV7) +#define PORT_PA09O_ADC0_DRV7 (_UL_(1) << 9) +#define PIN_PA10O_ADC0_DRV8 _L_(10) /**< \brief ADC0 signal: DRV8 on PA10 mux O */ +#define MUX_PA10O_ADC0_DRV8 _L_(14) +#define PINMUX_PA10O_ADC0_DRV8 ((PIN_PA10O_ADC0_DRV8 << 16) | MUX_PA10O_ADC0_DRV8) +#define PORT_PA10O_ADC0_DRV8 (_UL_(1) << 10) +#define PIN_PA11O_ADC0_DRV9 _L_(11) /**< \brief ADC0 signal: DRV9 on PA11 mux O */ +#define MUX_PA11O_ADC0_DRV9 _L_(14) +#define PINMUX_PA11O_ADC0_DRV9 ((PIN_PA11O_ADC0_DRV9 << 16) | MUX_PA11O_ADC0_DRV9) +#define PORT_PA11O_ADC0_DRV9 (_UL_(1) << 11) +#define PIN_PA16O_ADC0_DRV10 _L_(16) /**< \brief ADC0 signal: DRV10 on PA16 mux O */ +#define MUX_PA16O_ADC0_DRV10 _L_(14) +#define PINMUX_PA16O_ADC0_DRV10 ((PIN_PA16O_ADC0_DRV10 << 16) | MUX_PA16O_ADC0_DRV10) +#define PORT_PA16O_ADC0_DRV10 (_UL_(1) << 16) +#define PIN_PA17O_ADC0_DRV11 _L_(17) /**< \brief ADC0 signal: DRV11 on PA17 mux O */ +#define MUX_PA17O_ADC0_DRV11 _L_(14) +#define PINMUX_PA17O_ADC0_DRV11 ((PIN_PA17O_ADC0_DRV11 << 16) | MUX_PA17O_ADC0_DRV11) +#define PORT_PA17O_ADC0_DRV11 (_UL_(1) << 17) +#define PIN_PA18O_ADC0_DRV12 _L_(18) /**< \brief ADC0 signal: DRV12 on PA18 mux O */ +#define MUX_PA18O_ADC0_DRV12 _L_(14) +#define PINMUX_PA18O_ADC0_DRV12 ((PIN_PA18O_ADC0_DRV12 << 16) | MUX_PA18O_ADC0_DRV12) +#define PORT_PA18O_ADC0_DRV12 (_UL_(1) << 18) +#define PIN_PA19O_ADC0_DRV13 _L_(19) /**< \brief ADC0 signal: DRV13 on PA19 mux O */ +#define MUX_PA19O_ADC0_DRV13 _L_(14) +#define PINMUX_PA19O_ADC0_DRV13 ((PIN_PA19O_ADC0_DRV13 << 16) | MUX_PA19O_ADC0_DRV13) +#define PORT_PA19O_ADC0_DRV13 (_UL_(1) << 19) +#define PIN_PA20O_ADC0_DRV14 _L_(20) /**< \brief ADC0 signal: DRV14 on PA20 mux O */ +#define MUX_PA20O_ADC0_DRV14 _L_(14) +#define PINMUX_PA20O_ADC0_DRV14 ((PIN_PA20O_ADC0_DRV14 << 16) | MUX_PA20O_ADC0_DRV14) +#define PORT_PA20O_ADC0_DRV14 (_UL_(1) << 20) +#define PIN_PA21O_ADC0_DRV15 _L_(21) /**< \brief ADC0 signal: DRV15 on PA21 mux O */ +#define MUX_PA21O_ADC0_DRV15 _L_(14) +#define PINMUX_PA21O_ADC0_DRV15 ((PIN_PA21O_ADC0_DRV15 << 16) | MUX_PA21O_ADC0_DRV15) +#define PORT_PA21O_ADC0_DRV15 (_UL_(1) << 21) +#define PIN_PA22O_ADC0_DRV16 _L_(22) /**< \brief ADC0 signal: DRV16 on PA22 mux O */ +#define MUX_PA22O_ADC0_DRV16 _L_(14) +#define PINMUX_PA22O_ADC0_DRV16 ((PIN_PA22O_ADC0_DRV16 << 16) | MUX_PA22O_ADC0_DRV16) +#define PORT_PA22O_ADC0_DRV16 (_UL_(1) << 22) +#define PIN_PA23O_ADC0_DRV17 _L_(23) /**< \brief ADC0 signal: DRV17 on PA23 mux O */ +#define MUX_PA23O_ADC0_DRV17 _L_(14) +#define PINMUX_PA23O_ADC0_DRV17 ((PIN_PA23O_ADC0_DRV17 << 16) | MUX_PA23O_ADC0_DRV17) +#define PORT_PA23O_ADC0_DRV17 (_UL_(1) << 23) +#define PIN_PA27O_ADC0_DRV18 _L_(27) /**< \brief ADC0 signal: DRV18 on PA27 mux O */ +#define MUX_PA27O_ADC0_DRV18 _L_(14) +#define PINMUX_PA27O_ADC0_DRV18 ((PIN_PA27O_ADC0_DRV18 << 16) | MUX_PA27O_ADC0_DRV18) +#define PORT_PA27O_ADC0_DRV18 (_UL_(1) << 27) +#define PIN_PA30O_ADC0_DRV19 _L_(30) /**< \brief ADC0 signal: DRV19 on PA30 mux O */ +#define MUX_PA30O_ADC0_DRV19 _L_(14) +#define PINMUX_PA30O_ADC0_DRV19 ((PIN_PA30O_ADC0_DRV19 << 16) | MUX_PA30O_ADC0_DRV19) +#define PORT_PA30O_ADC0_DRV19 (_UL_(1) << 30) +#define PIN_PB02O_ADC0_DRV20 _L_(34) /**< \brief ADC0 signal: DRV20 on PB02 mux O */ +#define MUX_PB02O_ADC0_DRV20 _L_(14) +#define PINMUX_PB02O_ADC0_DRV20 ((PIN_PB02O_ADC0_DRV20 << 16) | MUX_PB02O_ADC0_DRV20) +#define PORT_PB02O_ADC0_DRV20 (_UL_(1) << 2) +#define PIN_PB03O_ADC0_DRV21 _L_(35) /**< \brief ADC0 signal: DRV21 on PB03 mux O */ +#define MUX_PB03O_ADC0_DRV21 _L_(14) +#define PINMUX_PB03O_ADC0_DRV21 ((PIN_PB03O_ADC0_DRV21 << 16) | MUX_PB03O_ADC0_DRV21) +#define PORT_PB03O_ADC0_DRV21 (_UL_(1) << 3) +#define PIN_PB04O_ADC0_DRV22 _L_(36) /**< \brief ADC0 signal: DRV22 on PB04 mux O */ +#define MUX_PB04O_ADC0_DRV22 _L_(14) +#define PINMUX_PB04O_ADC0_DRV22 ((PIN_PB04O_ADC0_DRV22 << 16) | MUX_PB04O_ADC0_DRV22) +#define PORT_PB04O_ADC0_DRV22 (_UL_(1) << 4) +#define PIN_PB05O_ADC0_DRV23 _L_(37) /**< \brief ADC0 signal: DRV23 on PB05 mux O */ +#define MUX_PB05O_ADC0_DRV23 _L_(14) +#define PINMUX_PB05O_ADC0_DRV23 ((PIN_PB05O_ADC0_DRV23 << 16) | MUX_PB05O_ADC0_DRV23) +#define PORT_PB05O_ADC0_DRV23 (_UL_(1) << 5) +#define PIN_PB06O_ADC0_DRV24 _L_(38) /**< \brief ADC0 signal: DRV24 on PB06 mux O */ +#define MUX_PB06O_ADC0_DRV24 _L_(14) +#define PINMUX_PB06O_ADC0_DRV24 ((PIN_PB06O_ADC0_DRV24 << 16) | MUX_PB06O_ADC0_DRV24) +#define PORT_PB06O_ADC0_DRV24 (_UL_(1) << 6) +#define PIN_PB07O_ADC0_DRV25 _L_(39) /**< \brief ADC0 signal: DRV25 on PB07 mux O */ +#define MUX_PB07O_ADC0_DRV25 _L_(14) +#define PINMUX_PB07O_ADC0_DRV25 ((PIN_PB07O_ADC0_DRV25 << 16) | MUX_PB07O_ADC0_DRV25) +#define PORT_PB07O_ADC0_DRV25 (_UL_(1) << 7) +#define PIN_PB12O_ADC0_DRV26 _L_(44) /**< \brief ADC0 signal: DRV26 on PB12 mux O */ +#define MUX_PB12O_ADC0_DRV26 _L_(14) +#define PINMUX_PB12O_ADC0_DRV26 ((PIN_PB12O_ADC0_DRV26 << 16) | MUX_PB12O_ADC0_DRV26) +#define PORT_PB12O_ADC0_DRV26 (_UL_(1) << 12) +#define PIN_PB13O_ADC0_DRV27 _L_(45) /**< \brief ADC0 signal: DRV27 on PB13 mux O */ +#define MUX_PB13O_ADC0_DRV27 _L_(14) +#define PINMUX_PB13O_ADC0_DRV27 ((PIN_PB13O_ADC0_DRV27 << 16) | MUX_PB13O_ADC0_DRV27) +#define PORT_PB13O_ADC0_DRV27 (_UL_(1) << 13) +#define PIN_PB14O_ADC0_DRV28 _L_(46) /**< \brief ADC0 signal: DRV28 on PB14 mux O */ +#define MUX_PB14O_ADC0_DRV28 _L_(14) +#define PINMUX_PB14O_ADC0_DRV28 ((PIN_PB14O_ADC0_DRV28 << 16) | MUX_PB14O_ADC0_DRV28) +#define PORT_PB14O_ADC0_DRV28 (_UL_(1) << 14) +#define PIN_PB15O_ADC0_DRV29 _L_(47) /**< \brief ADC0 signal: DRV29 on PB15 mux O */ +#define MUX_PB15O_ADC0_DRV29 _L_(14) +#define PINMUX_PB15O_ADC0_DRV29 ((PIN_PB15O_ADC0_DRV29 << 16) | MUX_PB15O_ADC0_DRV29) +#define PORT_PB15O_ADC0_DRV29 (_UL_(1) << 15) +#define PIN_PB00O_ADC0_DRV30 _L_(32) /**< \brief ADC0 signal: DRV30 on PB00 mux O */ +#define MUX_PB00O_ADC0_DRV30 _L_(14) +#define PINMUX_PB00O_ADC0_DRV30 ((PIN_PB00O_ADC0_DRV30 << 16) | MUX_PB00O_ADC0_DRV30) +#define PORT_PB00O_ADC0_DRV30 (_UL_(1) << 0) +#define PIN_PB01O_ADC0_DRV31 _L_(33) /**< \brief ADC0 signal: DRV31 on PB01 mux O */ +#define MUX_PB01O_ADC0_DRV31 _L_(14) +#define PINMUX_PB01O_ADC0_DRV31 ((PIN_PB01O_ADC0_DRV31 << 16) | MUX_PB01O_ADC0_DRV31) +#define PORT_PB01O_ADC0_DRV31 (_UL_(1) << 1) +#define PIN_PA03B_ADC0_PTCXY0 _L_(3) /**< \brief ADC0 signal: PTCXY0 on PA03 mux B */ +#define MUX_PA03B_ADC0_PTCXY0 _L_(1) +#define PINMUX_PA03B_ADC0_PTCXY0 ((PIN_PA03B_ADC0_PTCXY0 << 16) | MUX_PA03B_ADC0_PTCXY0) +#define PORT_PA03B_ADC0_PTCXY0 (_UL_(1) << 3) +#define PIN_PB08B_ADC0_PTCXY1 _L_(40) /**< \brief ADC0 signal: PTCXY1 on PB08 mux B */ +#define MUX_PB08B_ADC0_PTCXY1 _L_(1) +#define PINMUX_PB08B_ADC0_PTCXY1 ((PIN_PB08B_ADC0_PTCXY1 << 16) | MUX_PB08B_ADC0_PTCXY1) +#define PORT_PB08B_ADC0_PTCXY1 (_UL_(1) << 8) +#define PIN_PB09B_ADC0_PTCXY2 _L_(41) /**< \brief ADC0 signal: PTCXY2 on PB09 mux B */ +#define MUX_PB09B_ADC0_PTCXY2 _L_(1) +#define PINMUX_PB09B_ADC0_PTCXY2 ((PIN_PB09B_ADC0_PTCXY2 << 16) | MUX_PB09B_ADC0_PTCXY2) +#define PORT_PB09B_ADC0_PTCXY2 (_UL_(1) << 9) +#define PIN_PA04B_ADC0_PTCXY3 _L_(4) /**< \brief ADC0 signal: PTCXY3 on PA04 mux B */ +#define MUX_PA04B_ADC0_PTCXY3 _L_(1) +#define PINMUX_PA04B_ADC0_PTCXY3 ((PIN_PA04B_ADC0_PTCXY3 << 16) | MUX_PA04B_ADC0_PTCXY3) +#define PORT_PA04B_ADC0_PTCXY3 (_UL_(1) << 4) +#define PIN_PA06B_ADC0_PTCXY4 _L_(6) /**< \brief ADC0 signal: PTCXY4 on PA06 mux B */ +#define MUX_PA06B_ADC0_PTCXY4 _L_(1) +#define PINMUX_PA06B_ADC0_PTCXY4 ((PIN_PA06B_ADC0_PTCXY4 << 16) | MUX_PA06B_ADC0_PTCXY4) +#define PORT_PA06B_ADC0_PTCXY4 (_UL_(1) << 6) +#define PIN_PA07B_ADC0_PTCXY5 _L_(7) /**< \brief ADC0 signal: PTCXY5 on PA07 mux B */ +#define MUX_PA07B_ADC0_PTCXY5 _L_(1) +#define PINMUX_PA07B_ADC0_PTCXY5 ((PIN_PA07B_ADC0_PTCXY5 << 16) | MUX_PA07B_ADC0_PTCXY5) +#define PORT_PA07B_ADC0_PTCXY5 (_UL_(1) << 7) +#define PIN_PA08B_ADC0_PTCXY6 _L_(8) /**< \brief ADC0 signal: PTCXY6 on PA08 mux B */ +#define MUX_PA08B_ADC0_PTCXY6 _L_(1) +#define PINMUX_PA08B_ADC0_PTCXY6 ((PIN_PA08B_ADC0_PTCXY6 << 16) | MUX_PA08B_ADC0_PTCXY6) +#define PORT_PA08B_ADC0_PTCXY6 (_UL_(1) << 8) +#define PIN_PA09B_ADC0_PTCXY7 _L_(9) /**< \brief ADC0 signal: PTCXY7 on PA09 mux B */ +#define MUX_PA09B_ADC0_PTCXY7 _L_(1) +#define PINMUX_PA09B_ADC0_PTCXY7 ((PIN_PA09B_ADC0_PTCXY7 << 16) | MUX_PA09B_ADC0_PTCXY7) +#define PORT_PA09B_ADC0_PTCXY7 (_UL_(1) << 9) +#define PIN_PA10B_ADC0_PTCXY8 _L_(10) /**< \brief ADC0 signal: PTCXY8 on PA10 mux B */ +#define MUX_PA10B_ADC0_PTCXY8 _L_(1) +#define PINMUX_PA10B_ADC0_PTCXY8 ((PIN_PA10B_ADC0_PTCXY8 << 16) | MUX_PA10B_ADC0_PTCXY8) +#define PORT_PA10B_ADC0_PTCXY8 (_UL_(1) << 10) +#define PIN_PA11B_ADC0_PTCXY9 _L_(11) /**< \brief ADC0 signal: PTCXY9 on PA11 mux B */ +#define MUX_PA11B_ADC0_PTCXY9 _L_(1) +#define PINMUX_PA11B_ADC0_PTCXY9 ((PIN_PA11B_ADC0_PTCXY9 << 16) | MUX_PA11B_ADC0_PTCXY9) +#define PORT_PA11B_ADC0_PTCXY9 (_UL_(1) << 11) +#define PIN_PA16B_ADC0_PTCXY10 _L_(16) /**< \brief ADC0 signal: PTCXY10 on PA16 mux B */ +#define MUX_PA16B_ADC0_PTCXY10 _L_(1) +#define PINMUX_PA16B_ADC0_PTCXY10 ((PIN_PA16B_ADC0_PTCXY10 << 16) | MUX_PA16B_ADC0_PTCXY10) +#define PORT_PA16B_ADC0_PTCXY10 (_UL_(1) << 16) +#define PIN_PA17B_ADC0_PTCXY11 _L_(17) /**< \brief ADC0 signal: PTCXY11 on PA17 mux B */ +#define MUX_PA17B_ADC0_PTCXY11 _L_(1) +#define PINMUX_PA17B_ADC0_PTCXY11 ((PIN_PA17B_ADC0_PTCXY11 << 16) | MUX_PA17B_ADC0_PTCXY11) +#define PORT_PA17B_ADC0_PTCXY11 (_UL_(1) << 17) +#define PIN_PA19B_ADC0_PTCXY13 _L_(19) /**< \brief ADC0 signal: PTCXY13 on PA19 mux B */ +#define MUX_PA19B_ADC0_PTCXY13 _L_(1) +#define PINMUX_PA19B_ADC0_PTCXY13 ((PIN_PA19B_ADC0_PTCXY13 << 16) | MUX_PA19B_ADC0_PTCXY13) +#define PORT_PA19B_ADC0_PTCXY13 (_UL_(1) << 19) +#define PIN_PA20B_ADC0_PTCXY14 _L_(20) /**< \brief ADC0 signal: PTCXY14 on PA20 mux B */ +#define MUX_PA20B_ADC0_PTCXY14 _L_(1) +#define PINMUX_PA20B_ADC0_PTCXY14 ((PIN_PA20B_ADC0_PTCXY14 << 16) | MUX_PA20B_ADC0_PTCXY14) +#define PORT_PA20B_ADC0_PTCXY14 (_UL_(1) << 20) +#define PIN_PA21B_ADC0_PTCXY15 _L_(21) /**< \brief ADC0 signal: PTCXY15 on PA21 mux B */ +#define MUX_PA21B_ADC0_PTCXY15 _L_(1) +#define PINMUX_PA21B_ADC0_PTCXY15 ((PIN_PA21B_ADC0_PTCXY15 << 16) | MUX_PA21B_ADC0_PTCXY15) +#define PORT_PA21B_ADC0_PTCXY15 (_UL_(1) << 21) +#define PIN_PA22B_ADC0_PTCXY16 _L_(22) /**< \brief ADC0 signal: PTCXY16 on PA22 mux B */ +#define MUX_PA22B_ADC0_PTCXY16 _L_(1) +#define PINMUX_PA22B_ADC0_PTCXY16 ((PIN_PA22B_ADC0_PTCXY16 << 16) | MUX_PA22B_ADC0_PTCXY16) +#define PORT_PA22B_ADC0_PTCXY16 (_UL_(1) << 22) +#define PIN_PA23B_ADC0_PTCXY17 _L_(23) /**< \brief ADC0 signal: PTCXY17 on PA23 mux B */ +#define MUX_PA23B_ADC0_PTCXY17 _L_(1) +#define PINMUX_PA23B_ADC0_PTCXY17 ((PIN_PA23B_ADC0_PTCXY17 << 16) | MUX_PA23B_ADC0_PTCXY17) +#define PORT_PA23B_ADC0_PTCXY17 (_UL_(1) << 23) +#define PIN_PA27B_ADC0_PTCXY18 _L_(27) /**< \brief ADC0 signal: PTCXY18 on PA27 mux B */ +#define MUX_PA27B_ADC0_PTCXY18 _L_(1) +#define PINMUX_PA27B_ADC0_PTCXY18 ((PIN_PA27B_ADC0_PTCXY18 << 16) | MUX_PA27B_ADC0_PTCXY18) +#define PORT_PA27B_ADC0_PTCXY18 (_UL_(1) << 27) +#define PIN_PA30B_ADC0_PTCXY19 _L_(30) /**< \brief ADC0 signal: PTCXY19 on PA30 mux B */ +#define MUX_PA30B_ADC0_PTCXY19 _L_(1) +#define PINMUX_PA30B_ADC0_PTCXY19 ((PIN_PA30B_ADC0_PTCXY19 << 16) | MUX_PA30B_ADC0_PTCXY19) +#define PORT_PA30B_ADC0_PTCXY19 (_UL_(1) << 30) +#define PIN_PB02B_ADC0_PTCXY20 _L_(34) /**< \brief ADC0 signal: PTCXY20 on PB02 mux B */ +#define MUX_PB02B_ADC0_PTCXY20 _L_(1) +#define PINMUX_PB02B_ADC0_PTCXY20 ((PIN_PB02B_ADC0_PTCXY20 << 16) | MUX_PB02B_ADC0_PTCXY20) +#define PORT_PB02B_ADC0_PTCXY20 (_UL_(1) << 2) +#define PIN_PB03B_ADC0_PTCXY21 _L_(35) /**< \brief ADC0 signal: PTCXY21 on PB03 mux B */ +#define MUX_PB03B_ADC0_PTCXY21 _L_(1) +#define PINMUX_PB03B_ADC0_PTCXY21 ((PIN_PB03B_ADC0_PTCXY21 << 16) | MUX_PB03B_ADC0_PTCXY21) +#define PORT_PB03B_ADC0_PTCXY21 (_UL_(1) << 3) +#define PIN_PB04B_ADC0_PTCXY22 _L_(36) /**< \brief ADC0 signal: PTCXY22 on PB04 mux B */ +#define MUX_PB04B_ADC0_PTCXY22 _L_(1) +#define PINMUX_PB04B_ADC0_PTCXY22 ((PIN_PB04B_ADC0_PTCXY22 << 16) | MUX_PB04B_ADC0_PTCXY22) +#define PORT_PB04B_ADC0_PTCXY22 (_UL_(1) << 4) +#define PIN_PB05B_ADC0_PTCXY23 _L_(37) /**< \brief ADC0 signal: PTCXY23 on PB05 mux B */ +#define MUX_PB05B_ADC0_PTCXY23 _L_(1) +#define PINMUX_PB05B_ADC0_PTCXY23 ((PIN_PB05B_ADC0_PTCXY23 << 16) | MUX_PB05B_ADC0_PTCXY23) +#define PORT_PB05B_ADC0_PTCXY23 (_UL_(1) << 5) +#define PIN_PB06B_ADC0_PTCXY24 _L_(38) /**< \brief ADC0 signal: PTCXY24 on PB06 mux B */ +#define MUX_PB06B_ADC0_PTCXY24 _L_(1) +#define PINMUX_PB06B_ADC0_PTCXY24 ((PIN_PB06B_ADC0_PTCXY24 << 16) | MUX_PB06B_ADC0_PTCXY24) +#define PORT_PB06B_ADC0_PTCXY24 (_UL_(1) << 6) +#define PIN_PB07B_ADC0_PTCXY25 _L_(39) /**< \brief ADC0 signal: PTCXY25 on PB07 mux B */ +#define MUX_PB07B_ADC0_PTCXY25 _L_(1) +#define PINMUX_PB07B_ADC0_PTCXY25 ((PIN_PB07B_ADC0_PTCXY25 << 16) | MUX_PB07B_ADC0_PTCXY25) +#define PORT_PB07B_ADC0_PTCXY25 (_UL_(1) << 7) +#define PIN_PB12B_ADC0_PTCXY26 _L_(44) /**< \brief ADC0 signal: PTCXY26 on PB12 mux B */ +#define MUX_PB12B_ADC0_PTCXY26 _L_(1) +#define PINMUX_PB12B_ADC0_PTCXY26 ((PIN_PB12B_ADC0_PTCXY26 << 16) | MUX_PB12B_ADC0_PTCXY26) +#define PORT_PB12B_ADC0_PTCXY26 (_UL_(1) << 12) +#define PIN_PB13B_ADC0_PTCXY27 _L_(45) /**< \brief ADC0 signal: PTCXY27 on PB13 mux B */ +#define MUX_PB13B_ADC0_PTCXY27 _L_(1) +#define PINMUX_PB13B_ADC0_PTCXY27 ((PIN_PB13B_ADC0_PTCXY27 << 16) | MUX_PB13B_ADC0_PTCXY27) +#define PORT_PB13B_ADC0_PTCXY27 (_UL_(1) << 13) +#define PIN_PB14B_ADC0_PTCXY28 _L_(46) /**< \brief ADC0 signal: PTCXY28 on PB14 mux B */ +#define MUX_PB14B_ADC0_PTCXY28 _L_(1) +#define PINMUX_PB14B_ADC0_PTCXY28 ((PIN_PB14B_ADC0_PTCXY28 << 16) | MUX_PB14B_ADC0_PTCXY28) +#define PORT_PB14B_ADC0_PTCXY28 (_UL_(1) << 14) +#define PIN_PB15B_ADC0_PTCXY29 _L_(47) /**< \brief ADC0 signal: PTCXY29 on PB15 mux B */ +#define MUX_PB15B_ADC0_PTCXY29 _L_(1) +#define PINMUX_PB15B_ADC0_PTCXY29 ((PIN_PB15B_ADC0_PTCXY29 << 16) | MUX_PB15B_ADC0_PTCXY29) +#define PORT_PB15B_ADC0_PTCXY29 (_UL_(1) << 15) +#define PIN_PB00B_ADC0_PTCXY30 _L_(32) /**< \brief ADC0 signal: PTCXY30 on PB00 mux B */ +#define MUX_PB00B_ADC0_PTCXY30 _L_(1) +#define PINMUX_PB00B_ADC0_PTCXY30 ((PIN_PB00B_ADC0_PTCXY30 << 16) | MUX_PB00B_ADC0_PTCXY30) +#define PORT_PB00B_ADC0_PTCXY30 (_UL_(1) << 0) +#define PIN_PB01B_ADC0_PTCXY31 _L_(33) /**< \brief ADC0 signal: PTCXY31 on PB01 mux B */ +#define MUX_PB01B_ADC0_PTCXY31 _L_(1) +#define PINMUX_PB01B_ADC0_PTCXY31 ((PIN_PB01B_ADC0_PTCXY31 << 16) | MUX_PB01B_ADC0_PTCXY31) +#define PORT_PB01B_ADC0_PTCXY31 (_UL_(1) << 1) +/* ========== PORT definition for ADC1 peripheral ========== */ +#define PIN_PB08B_ADC1_AIN0 _L_(40) /**< \brief ADC1 signal: AIN0 on PB08 mux B */ +#define MUX_PB08B_ADC1_AIN0 _L_(1) +#define PINMUX_PB08B_ADC1_AIN0 ((PIN_PB08B_ADC1_AIN0 << 16) | MUX_PB08B_ADC1_AIN0) +#define PORT_PB08B_ADC1_AIN0 (_UL_(1) << 8) +#define PIN_PB09B_ADC1_AIN1 _L_(41) /**< \brief ADC1 signal: AIN1 on PB09 mux B */ +#define MUX_PB09B_ADC1_AIN1 _L_(1) +#define PINMUX_PB09B_ADC1_AIN1 ((PIN_PB09B_ADC1_AIN1 << 16) | MUX_PB09B_ADC1_AIN1) +#define PORT_PB09B_ADC1_AIN1 (_UL_(1) << 9) +#define PIN_PA08B_ADC1_AIN2 _L_(8) /**< \brief ADC1 signal: AIN2 on PA08 mux B */ +#define MUX_PA08B_ADC1_AIN2 _L_(1) +#define PINMUX_PA08B_ADC1_AIN2 ((PIN_PA08B_ADC1_AIN2 << 16) | MUX_PA08B_ADC1_AIN2) +#define PORT_PA08B_ADC1_AIN2 (_UL_(1) << 8) +#define PIN_PA09B_ADC1_AIN3 _L_(9) /**< \brief ADC1 signal: AIN3 on PA09 mux B */ +#define MUX_PA09B_ADC1_AIN3 _L_(1) +#define PINMUX_PA09B_ADC1_AIN3 ((PIN_PA09B_ADC1_AIN3 << 16) | MUX_PA09B_ADC1_AIN3) +#define PORT_PA09B_ADC1_AIN3 (_UL_(1) << 9) +#define PIN_PB04B_ADC1_AIN6 _L_(36) /**< \brief ADC1 signal: AIN6 on PB04 mux B */ +#define MUX_PB04B_ADC1_AIN6 _L_(1) +#define PINMUX_PB04B_ADC1_AIN6 ((PIN_PB04B_ADC1_AIN6 << 16) | MUX_PB04B_ADC1_AIN6) +#define PORT_PB04B_ADC1_AIN6 (_UL_(1) << 4) +#define PIN_PB05B_ADC1_AIN7 _L_(37) /**< \brief ADC1 signal: AIN7 on PB05 mux B */ +#define MUX_PB05B_ADC1_AIN7 _L_(1) +#define PINMUX_PB05B_ADC1_AIN7 ((PIN_PB05B_ADC1_AIN7 << 16) | MUX_PB05B_ADC1_AIN7) +#define PORT_PB05B_ADC1_AIN7 (_UL_(1) << 5) +#define PIN_PB06B_ADC1_AIN8 _L_(38) /**< \brief ADC1 signal: AIN8 on PB06 mux B */ +#define MUX_PB06B_ADC1_AIN8 _L_(1) +#define PINMUX_PB06B_ADC1_AIN8 ((PIN_PB06B_ADC1_AIN8 << 16) | MUX_PB06B_ADC1_AIN8) +#define PORT_PB06B_ADC1_AIN8 (_UL_(1) << 6) +#define PIN_PB07B_ADC1_AIN9 _L_(39) /**< \brief ADC1 signal: AIN9 on PB07 mux B */ +#define MUX_PB07B_ADC1_AIN9 _L_(1) +#define PINMUX_PB07B_ADC1_AIN9 ((PIN_PB07B_ADC1_AIN9 << 16) | MUX_PB07B_ADC1_AIN9) +#define PORT_PB07B_ADC1_AIN9 (_UL_(1) << 7) +/* ========== PORT definition for DAC peripheral ========== */ +#define PIN_PA02B_DAC_VOUT0 _L_(2) /**< \brief DAC signal: VOUT0 on PA02 mux B */ +#define MUX_PA02B_DAC_VOUT0 _L_(1) +#define PINMUX_PA02B_DAC_VOUT0 ((PIN_PA02B_DAC_VOUT0 << 16) | MUX_PA02B_DAC_VOUT0) +#define PORT_PA02B_DAC_VOUT0 (_UL_(1) << 2) +#define PIN_PA05B_DAC_VOUT1 _L_(5) /**< \brief DAC signal: VOUT1 on PA05 mux B */ +#define MUX_PA05B_DAC_VOUT1 _L_(1) +#define PINMUX_PA05B_DAC_VOUT1 ((PIN_PA05B_DAC_VOUT1 << 16) | MUX_PA05B_DAC_VOUT1) +#define PORT_PA05B_DAC_VOUT1 (_UL_(1) << 5) +/* ========== PORT definition for I2S peripheral ========== */ +#define PIN_PA09J_I2S_FS0 _L_(9) /**< \brief I2S signal: FS0 on PA09 mux J */ +#define MUX_PA09J_I2S_FS0 _L_(9) +#define PINMUX_PA09J_I2S_FS0 ((PIN_PA09J_I2S_FS0 << 16) | MUX_PA09J_I2S_FS0) +#define PORT_PA09J_I2S_FS0 (_UL_(1) << 9) +#define PIN_PA20J_I2S_FS0 _L_(20) /**< \brief I2S signal: FS0 on PA20 mux J */ +#define MUX_PA20J_I2S_FS0 _L_(9) +#define PINMUX_PA20J_I2S_FS0 ((PIN_PA20J_I2S_FS0 << 16) | MUX_PA20J_I2S_FS0) +#define PORT_PA20J_I2S_FS0 (_UL_(1) << 20) +#define PIN_PA23J_I2S_FS1 _L_(23) /**< \brief I2S signal: FS1 on PA23 mux J */ +#define MUX_PA23J_I2S_FS1 _L_(9) +#define PINMUX_PA23J_I2S_FS1 ((PIN_PA23J_I2S_FS1 << 16) | MUX_PA23J_I2S_FS1) +#define PORT_PA23J_I2S_FS1 (_UL_(1) << 23) +#define PIN_PB11J_I2S_FS1 _L_(43) /**< \brief I2S signal: FS1 on PB11 mux J */ +#define MUX_PB11J_I2S_FS1 _L_(9) +#define PINMUX_PB11J_I2S_FS1 ((PIN_PB11J_I2S_FS1 << 16) | MUX_PB11J_I2S_FS1) +#define PORT_PB11J_I2S_FS1 (_UL_(1) << 11) +#define PIN_PA08J_I2S_MCK0 _L_(8) /**< \brief I2S signal: MCK0 on PA08 mux J */ +#define MUX_PA08J_I2S_MCK0 _L_(9) +#define PINMUX_PA08J_I2S_MCK0 ((PIN_PA08J_I2S_MCK0 << 16) | MUX_PA08J_I2S_MCK0) +#define PORT_PA08J_I2S_MCK0 (_UL_(1) << 8) +#define PIN_PB17J_I2S_MCK0 _L_(49) /**< \brief I2S signal: MCK0 on PB17 mux J */ +#define MUX_PB17J_I2S_MCK0 _L_(9) +#define PINMUX_PB17J_I2S_MCK0 ((PIN_PB17J_I2S_MCK0 << 16) | MUX_PB17J_I2S_MCK0) +#define PORT_PB17J_I2S_MCK0 (_UL_(1) << 17) +#define PIN_PB13J_I2S_MCK1 _L_(45) /**< \brief I2S signal: MCK1 on PB13 mux J */ +#define MUX_PB13J_I2S_MCK1 _L_(9) +#define PINMUX_PB13J_I2S_MCK1 ((PIN_PB13J_I2S_MCK1 << 16) | MUX_PB13J_I2S_MCK1) +#define PORT_PB13J_I2S_MCK1 (_UL_(1) << 13) +#define PIN_PA10J_I2S_SCK0 _L_(10) /**< \brief I2S signal: SCK0 on PA10 mux J */ +#define MUX_PA10J_I2S_SCK0 _L_(9) +#define PINMUX_PA10J_I2S_SCK0 ((PIN_PA10J_I2S_SCK0 << 16) | MUX_PA10J_I2S_SCK0) +#define PORT_PA10J_I2S_SCK0 (_UL_(1) << 10) +#define PIN_PB16J_I2S_SCK0 _L_(48) /**< \brief I2S signal: SCK0 on PB16 mux J */ +#define MUX_PB16J_I2S_SCK0 _L_(9) +#define PINMUX_PB16J_I2S_SCK0 ((PIN_PB16J_I2S_SCK0 << 16) | MUX_PB16J_I2S_SCK0) +#define PORT_PB16J_I2S_SCK0 (_UL_(1) << 16) +#define PIN_PB12J_I2S_SCK1 _L_(44) /**< \brief I2S signal: SCK1 on PB12 mux J */ +#define MUX_PB12J_I2S_SCK1 _L_(9) +#define PINMUX_PB12J_I2S_SCK1 ((PIN_PB12J_I2S_SCK1 << 16) | MUX_PB12J_I2S_SCK1) +#define PORT_PB12J_I2S_SCK1 (_UL_(1) << 12) +#define PIN_PA22J_I2S_SDI _L_(22) /**< \brief I2S signal: SDI on PA22 mux J */ +#define MUX_PA22J_I2S_SDI _L_(9) +#define PINMUX_PA22J_I2S_SDI ((PIN_PA22J_I2S_SDI << 16) | MUX_PA22J_I2S_SDI) +#define PORT_PA22J_I2S_SDI (_UL_(1) << 22) +#define PIN_PB10J_I2S_SDI _L_(42) /**< \brief I2S signal: SDI on PB10 mux J */ +#define MUX_PB10J_I2S_SDI _L_(9) +#define PINMUX_PB10J_I2S_SDI ((PIN_PB10J_I2S_SDI << 16) | MUX_PB10J_I2S_SDI) +#define PORT_PB10J_I2S_SDI (_UL_(1) << 10) +#define PIN_PA11J_I2S_SDO _L_(11) /**< \brief I2S signal: SDO on PA11 mux J */ +#define MUX_PA11J_I2S_SDO _L_(9) +#define PINMUX_PA11J_I2S_SDO ((PIN_PA11J_I2S_SDO << 16) | MUX_PA11J_I2S_SDO) +#define PORT_PA11J_I2S_SDO (_UL_(1) << 11) +#define PIN_PA21J_I2S_SDO _L_(21) /**< \brief I2S signal: SDO on PA21 mux J */ +#define MUX_PA21J_I2S_SDO _L_(9) +#define PINMUX_PA21J_I2S_SDO ((PIN_PA21J_I2S_SDO << 16) | MUX_PA21J_I2S_SDO) +#define PORT_PA21J_I2S_SDO (_UL_(1) << 21) +/* ========== PORT definition for PCC peripheral ========== */ +#define PIN_PA14K_PCC_CLK _L_(14) /**< \brief PCC signal: CLK on PA14 mux K */ +#define MUX_PA14K_PCC_CLK _L_(10) +#define PINMUX_PA14K_PCC_CLK ((PIN_PA14K_PCC_CLK << 16) | MUX_PA14K_PCC_CLK) +#define PORT_PA14K_PCC_CLK (_UL_(1) << 14) +#define PIN_PA16K_PCC_DATA0 _L_(16) /**< \brief PCC signal: DATA0 on PA16 mux K */ +#define MUX_PA16K_PCC_DATA0 _L_(10) +#define PINMUX_PA16K_PCC_DATA0 ((PIN_PA16K_PCC_DATA0 << 16) | MUX_PA16K_PCC_DATA0) +#define PORT_PA16K_PCC_DATA0 (_UL_(1) << 16) +#define PIN_PA17K_PCC_DATA1 _L_(17) /**< \brief PCC signal: DATA1 on PA17 mux K */ +#define MUX_PA17K_PCC_DATA1 _L_(10) +#define PINMUX_PA17K_PCC_DATA1 ((PIN_PA17K_PCC_DATA1 << 16) | MUX_PA17K_PCC_DATA1) +#define PORT_PA17K_PCC_DATA1 (_UL_(1) << 17) +#define PIN_PA18K_PCC_DATA2 _L_(18) /**< \brief PCC signal: DATA2 on PA18 mux K */ +#define MUX_PA18K_PCC_DATA2 _L_(10) +#define PINMUX_PA18K_PCC_DATA2 ((PIN_PA18K_PCC_DATA2 << 16) | MUX_PA18K_PCC_DATA2) +#define PORT_PA18K_PCC_DATA2 (_UL_(1) << 18) +#define PIN_PA19K_PCC_DATA3 _L_(19) /**< \brief PCC signal: DATA3 on PA19 mux K */ +#define MUX_PA19K_PCC_DATA3 _L_(10) +#define PINMUX_PA19K_PCC_DATA3 ((PIN_PA19K_PCC_DATA3 << 16) | MUX_PA19K_PCC_DATA3) +#define PORT_PA19K_PCC_DATA3 (_UL_(1) << 19) +#define PIN_PA20K_PCC_DATA4 _L_(20) /**< \brief PCC signal: DATA4 on PA20 mux K */ +#define MUX_PA20K_PCC_DATA4 _L_(10) +#define PINMUX_PA20K_PCC_DATA4 ((PIN_PA20K_PCC_DATA4 << 16) | MUX_PA20K_PCC_DATA4) +#define PORT_PA20K_PCC_DATA4 (_UL_(1) << 20) +#define PIN_PA21K_PCC_DATA5 _L_(21) /**< \brief PCC signal: DATA5 on PA21 mux K */ +#define MUX_PA21K_PCC_DATA5 _L_(10) +#define PINMUX_PA21K_PCC_DATA5 ((PIN_PA21K_PCC_DATA5 << 16) | MUX_PA21K_PCC_DATA5) +#define PORT_PA21K_PCC_DATA5 (_UL_(1) << 21) +#define PIN_PA22K_PCC_DATA6 _L_(22) /**< \brief PCC signal: DATA6 on PA22 mux K */ +#define MUX_PA22K_PCC_DATA6 _L_(10) +#define PINMUX_PA22K_PCC_DATA6 ((PIN_PA22K_PCC_DATA6 << 16) | MUX_PA22K_PCC_DATA6) +#define PORT_PA22K_PCC_DATA6 (_UL_(1) << 22) +#define PIN_PA23K_PCC_DATA7 _L_(23) /**< \brief PCC signal: DATA7 on PA23 mux K */ +#define MUX_PA23K_PCC_DATA7 _L_(10) +#define PINMUX_PA23K_PCC_DATA7 ((PIN_PA23K_PCC_DATA7 << 16) | MUX_PA23K_PCC_DATA7) +#define PORT_PA23K_PCC_DATA7 (_UL_(1) << 23) +#define PIN_PB14K_PCC_DATA8 _L_(46) /**< \brief PCC signal: DATA8 on PB14 mux K */ +#define MUX_PB14K_PCC_DATA8 _L_(10) +#define PINMUX_PB14K_PCC_DATA8 ((PIN_PB14K_PCC_DATA8 << 16) | MUX_PB14K_PCC_DATA8) +#define PORT_PB14K_PCC_DATA8 (_UL_(1) << 14) +#define PIN_PB15K_PCC_DATA9 _L_(47) /**< \brief PCC signal: DATA9 on PB15 mux K */ +#define MUX_PB15K_PCC_DATA9 _L_(10) +#define PINMUX_PB15K_PCC_DATA9 ((PIN_PB15K_PCC_DATA9 << 16) | MUX_PB15K_PCC_DATA9) +#define PORT_PB15K_PCC_DATA9 (_UL_(1) << 15) +#define PIN_PA12K_PCC_DEN1 _L_(12) /**< \brief PCC signal: DEN1 on PA12 mux K */ +#define MUX_PA12K_PCC_DEN1 _L_(10) +#define PINMUX_PA12K_PCC_DEN1 ((PIN_PA12K_PCC_DEN1 << 16) | MUX_PA12K_PCC_DEN1) +#define PORT_PA12K_PCC_DEN1 (_UL_(1) << 12) +#define PIN_PA13K_PCC_DEN2 _L_(13) /**< \brief PCC signal: DEN2 on PA13 mux K */ +#define MUX_PA13K_PCC_DEN2 _L_(10) +#define PINMUX_PA13K_PCC_DEN2 ((PIN_PA13K_PCC_DEN2 << 16) | MUX_PA13K_PCC_DEN2) +#define PORT_PA13K_PCC_DEN2 (_UL_(1) << 13) +/* ========== PORT definition for SDHC0 peripheral ========== */ +#define PIN_PA06I_SDHC0_SDCD _L_(6) /**< \brief SDHC0 signal: SDCD on PA06 mux I */ +#define MUX_PA06I_SDHC0_SDCD _L_(8) +#define PINMUX_PA06I_SDHC0_SDCD ((PIN_PA06I_SDHC0_SDCD << 16) | MUX_PA06I_SDHC0_SDCD) +#define PORT_PA06I_SDHC0_SDCD (_UL_(1) << 6) +#define PIN_PA12I_SDHC0_SDCD _L_(12) /**< \brief SDHC0 signal: SDCD on PA12 mux I */ +#define MUX_PA12I_SDHC0_SDCD _L_(8) +#define PINMUX_PA12I_SDHC0_SDCD ((PIN_PA12I_SDHC0_SDCD << 16) | MUX_PA12I_SDHC0_SDCD) +#define PORT_PA12I_SDHC0_SDCD (_UL_(1) << 12) +#define PIN_PB12I_SDHC0_SDCD _L_(44) /**< \brief SDHC0 signal: SDCD on PB12 mux I */ +#define MUX_PB12I_SDHC0_SDCD _L_(8) +#define PINMUX_PB12I_SDHC0_SDCD ((PIN_PB12I_SDHC0_SDCD << 16) | MUX_PB12I_SDHC0_SDCD) +#define PORT_PB12I_SDHC0_SDCD (_UL_(1) << 12) +#define PIN_PB11I_SDHC0_SDCK _L_(43) /**< \brief SDHC0 signal: SDCK on PB11 mux I */ +#define MUX_PB11I_SDHC0_SDCK _L_(8) +#define PINMUX_PB11I_SDHC0_SDCK ((PIN_PB11I_SDHC0_SDCK << 16) | MUX_PB11I_SDHC0_SDCK) +#define PORT_PB11I_SDHC0_SDCK (_UL_(1) << 11) +#define PIN_PA08I_SDHC0_SDCMD _L_(8) /**< \brief SDHC0 signal: SDCMD on PA08 mux I */ +#define MUX_PA08I_SDHC0_SDCMD _L_(8) +#define PINMUX_PA08I_SDHC0_SDCMD ((PIN_PA08I_SDHC0_SDCMD << 16) | MUX_PA08I_SDHC0_SDCMD) +#define PORT_PA08I_SDHC0_SDCMD (_UL_(1) << 8) +#define PIN_PA09I_SDHC0_SDDAT0 _L_(9) /**< \brief SDHC0 signal: SDDAT0 on PA09 mux I */ +#define MUX_PA09I_SDHC0_SDDAT0 _L_(8) +#define PINMUX_PA09I_SDHC0_SDDAT0 ((PIN_PA09I_SDHC0_SDDAT0 << 16) | MUX_PA09I_SDHC0_SDDAT0) +#define PORT_PA09I_SDHC0_SDDAT0 (_UL_(1) << 9) +#define PIN_PA10I_SDHC0_SDDAT1 _L_(10) /**< \brief SDHC0 signal: SDDAT1 on PA10 mux I */ +#define MUX_PA10I_SDHC0_SDDAT1 _L_(8) +#define PINMUX_PA10I_SDHC0_SDDAT1 ((PIN_PA10I_SDHC0_SDDAT1 << 16) | MUX_PA10I_SDHC0_SDDAT1) +#define PORT_PA10I_SDHC0_SDDAT1 (_UL_(1) << 10) +#define PIN_PA11I_SDHC0_SDDAT2 _L_(11) /**< \brief SDHC0 signal: SDDAT2 on PA11 mux I */ +#define MUX_PA11I_SDHC0_SDDAT2 _L_(8) +#define PINMUX_PA11I_SDHC0_SDDAT2 ((PIN_PA11I_SDHC0_SDDAT2 << 16) | MUX_PA11I_SDHC0_SDDAT2) +#define PORT_PA11I_SDHC0_SDDAT2 (_UL_(1) << 11) +#define PIN_PB10I_SDHC0_SDDAT3 _L_(42) /**< \brief SDHC0 signal: SDDAT3 on PB10 mux I */ +#define MUX_PB10I_SDHC0_SDDAT3 _L_(8) +#define PINMUX_PB10I_SDHC0_SDDAT3 ((PIN_PB10I_SDHC0_SDDAT3 << 16) | MUX_PB10I_SDHC0_SDDAT3) +#define PORT_PB10I_SDHC0_SDDAT3 (_UL_(1) << 10) +#define PIN_PA07I_SDHC0_SDWP _L_(7) /**< \brief SDHC0 signal: SDWP on PA07 mux I */ +#define MUX_PA07I_SDHC0_SDWP _L_(8) +#define PINMUX_PA07I_SDHC0_SDWP ((PIN_PA07I_SDHC0_SDWP << 16) | MUX_PA07I_SDHC0_SDWP) +#define PORT_PA07I_SDHC0_SDWP (_UL_(1) << 7) +#define PIN_PA13I_SDHC0_SDWP _L_(13) /**< \brief SDHC0 signal: SDWP on PA13 mux I */ +#define MUX_PA13I_SDHC0_SDWP _L_(8) +#define PINMUX_PA13I_SDHC0_SDWP ((PIN_PA13I_SDHC0_SDWP << 16) | MUX_PA13I_SDHC0_SDWP) +#define PORT_PA13I_SDHC0_SDWP (_UL_(1) << 13) +#define PIN_PB13I_SDHC0_SDWP _L_(45) /**< \brief SDHC0 signal: SDWP on PB13 mux I */ +#define MUX_PB13I_SDHC0_SDWP _L_(8) +#define PINMUX_PB13I_SDHC0_SDWP ((PIN_PB13I_SDHC0_SDWP << 16) | MUX_PB13I_SDHC0_SDWP) +#define PORT_PB13I_SDHC0_SDWP (_UL_(1) << 13) + +#endif /* _SAMD51J18A_PIO_ */ diff --git a/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/sam.h b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/sam.h new file mode 100644 index 000000000..9009b6d65 --- /dev/null +++ b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/sam.h @@ -0,0 +1,54 @@ +/** + * \file + * + * \brief Top level header file + * + * Copyright (c) 2017 Atmel Corporation, a wholly owned subsidiary of Microchip Technology Inc. + * + * \license_start + * + * \page License + * + * 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. + * + * \license_stop + * + */ + +#ifndef _SAM_ +#define _SAM_ + +#if defined(__SAMD51G18A__) || defined(__ATSAMD51G18A__) + #include "samd51g18a.h" +#elif defined(__SAMD51G19A__) || defined(__ATSAMD51G19A__) + #include "samd51g19a.h" +#elif defined(__SAMD51J18A__) || defined(__ATSAMD51J18A__) + #include "samd51j18a.h" +#elif defined(__SAMD51J19A__) || defined(__ATSAMD51J19A__) + #include "samd51j19a.h" +#elif defined(__SAMD51J20A__) || defined(__ATSAMD51J20A__) + #include "samd51j20a.h" +#elif defined(__SAMD51N19A__) || defined(__ATSAMD51N19A__) + #include "samd51n19a.h" +#elif defined(__SAMD51N20A__) || defined(__ATSAMD51N20A__) + #include "samd51n20a.h" +#elif defined(__SAMD51P19A__) || defined(__ATSAMD51P19A__) + #include "samd51p19a.h" +#elif defined(__SAMD51P20A__) || defined(__ATSAMD51P20A__) + #include "samd51p20a.h" +#else + #error Library does not support the specified device +#endif + +#endif /* _SAM_ */ + diff --git a/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/samd51.h b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/samd51.h new file mode 100644 index 000000000..d08ac64cb --- /dev/null +++ b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/samd51.h @@ -0,0 +1,60 @@ +/** + * \file + * + * \brief Top header file for SAMD51 + * + * Copyright (c) 2017 Microchip Technology Inc. + * + * \asf_license_start + * + * \page License + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 Licence 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. + * + * \asf_license_stop + * + */ + +#ifndef _SAMD51_ +#define _SAMD51_ + +/** + * \defgroup SAMD51_definitions SAMD51 Device Definitions + * \brief SAMD51 CMSIS Definitions. + */ + +#if defined(__SAMD51G18A__) || defined(__ATSAMD51G18A__) + #include "samd51g18a.h" +#elif defined(__SAMD51G19A__) || defined(__ATSAMD51G19A__) + #include "samd51g19a.h" +#elif defined(__SAMD51J18A__) || defined(__ATSAMD51J18A__) + #include "samd51j18a.h" +#elif defined(__SAMD51J19A__) || defined(__ATSAMD51J19A__) + #include "samd51j19a.h" +#elif defined(__SAMD51J20A__) || defined(__ATSAMD51J20A__) + #include "samd51j20a.h" +#elif defined(__SAMD51N19A__) || defined(__ATSAMD51N19A__) + #include "samd51n19a.h" +#elif defined(__SAMD51N20A__) || defined(__ATSAMD51N20A__) + #include "samd51n20a.h" +#elif defined(__SAMD51P19A__) || defined(__ATSAMD51P19A__) + #include "samd51p19a.h" +#elif defined(__SAMD51P20A__) || defined(__ATSAMD51P20A__) + #include "samd51p20a.h" +#else + #error Library does not support the specified device. +#endif + +#endif /* _SAMD51_ */ diff --git a/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/samd51j18a.h b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/samd51j18a.h new file mode 100644 index 000000000..5cfccdfc8 --- /dev/null +++ b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/samd51j18a.h @@ -0,0 +1,1079 @@ +/** + * \file + * + * \brief Header file for SAMD51J18A + * + * Copyright (c) 2017 Microchip Technology Inc. + * + * \asf_license_start + * + * \page License + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 Licence 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. + * + * \asf_license_stop + * + */ + +#ifndef _SAMD51J18A_ +#define _SAMD51J18A_ + +/** + * \ingroup SAMD51_definitions + * \addtogroup SAMD51J18A_definitions SAMD51J18A definitions + * This file defines all structures and symbols for SAMD51J18A: + * - registers and bitfields + * - peripheral base address + * - peripheral ID + * - PIO definitions +*/ +/*@{*/ + +#ifdef __cplusplus + extern "C" { +#endif + +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +#include +#ifndef __cplusplus +typedef volatile const uint32_t RoReg; /**< Read only 32-bit register (volatile const unsigned int) */ +typedef volatile const uint16_t RoReg16; /**< Read only 16-bit register (volatile const unsigned int) */ +typedef volatile const uint8_t RoReg8; /**< Read only 8-bit register (volatile const unsigned int) */ +#else +typedef volatile uint32_t RoReg; /**< Read only 32-bit register (volatile const unsigned int) */ +typedef volatile uint16_t RoReg16; /**< Read only 16-bit register (volatile const unsigned int) */ +typedef volatile uint8_t RoReg8; /**< Read only 8-bit register (volatile const unsigned int) */ +#endif +typedef volatile uint32_t WoReg; /**< Write only 32-bit register (volatile unsigned int) */ +typedef volatile uint16_t WoReg16; /**< Write only 16-bit register (volatile unsigned int) */ +typedef volatile uint8_t WoReg8; /**< Write only 8-bit register (volatile unsigned int) */ +typedef volatile uint32_t RwReg; /**< Read-Write 32-bit register (volatile unsigned int) */ +typedef volatile uint16_t RwReg16; /**< Read-Write 16-bit register (volatile unsigned int) */ +typedef volatile uint8_t RwReg8; /**< Read-Write 8-bit register (volatile unsigned int) */ +#endif + +#if !defined(SKIP_INTEGER_LITERALS) +#if defined(_U_) || defined(_L_) || defined(_UL_) + #error "Integer Literals macros already defined elsewhere" +#endif + +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +/* Macros that deal with adding suffixes to integer literal constants for C/C++ */ +#define _U_(x) x ## U /**< C code: Unsigned integer literal constant value */ +#define _L_(x) x ## L /**< C code: Long integer literal constant value */ +#define _UL_(x) x ## UL /**< C code: Unsigned Long integer literal constant value */ +#else /* Assembler */ +#define _U_(x) x /**< Assembler: Unsigned integer literal constant value */ +#define _L_(x) x /**< Assembler: Long integer literal constant value */ +#define _UL_(x) x /**< Assembler: Unsigned Long integer literal constant value */ +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ +#endif /* SKIP_INTEGER_LITERALS */ + +/* ************************************************************************** */ +/** CMSIS DEFINITIONS FOR SAMD51J18A */ +/* ************************************************************************** */ +/** \defgroup SAMD51J18A_cmsis CMSIS Definitions */ +/*@{*/ + +/** Interrupt Number Definition */ +typedef enum IRQn +{ + /****** Cortex-M4 Processor Exceptions Numbers ******************************/ + NonMaskableInt_IRQn = -14,/**< 2 Non Maskable Interrupt */ + HardFault_IRQn = -13,/**< 3 Cortex-M4 Hard Fault Interrupt */ + MemoryManagement_IRQn = -12,/**< 4 Cortex-M4 Memory Management Interrupt */ + BusFault_IRQn = -11,/**< 5 Cortex-M4 Bus Fault Interrupt */ + UsageFault_IRQn = -10,/**< 6 Cortex-M4 Usage Fault Interrupt */ + SVCall_IRQn = -5, /**< 11 Cortex-M4 SV Call Interrupt */ + DebugMonitor_IRQn = -4, /**< 12 Cortex-M4 Debug Monitor Interrupt */ + PendSV_IRQn = -2, /**< 14 Cortex-M4 Pend SV Interrupt */ + SysTick_IRQn = -1, /**< 15 Cortex-M4 System Tick Interrupt */ + /****** SAMD51J18A-specific Interrupt Numbers ***********************/ + PM_IRQn = 0, /**< 0 SAMD51J18A Power Manager (PM) */ + MCLK_IRQn = 1, /**< 1 SAMD51J18A Main Clock (MCLK) */ + OSCCTRL_0_IRQn = 2, /**< 2 SAMD51J18A Oscillators Control (OSCCTRL): OSCCTRL_XOSCFAIL_0, OSCCTRL_XOSCRDY_0 */ + OSCCTRL_1_IRQn = 3, /**< 3 SAMD51J18A Oscillators Control (OSCCTRL): OSCCTRL_XOSCFAIL_1, OSCCTRL_XOSCRDY_1 */ + OSCCTRL_2_IRQn = 4, /**< 4 SAMD51J18A Oscillators Control (OSCCTRL): OSCCTRL_DFLLLOCKC, OSCCTRL_DFLLLOCKF, OSCCTRL_DFLLOOB, OSCCTRL_DFLLRCS, OSCCTRL_DFLLRDY */ + OSCCTRL_3_IRQn = 5, /**< 5 SAMD51J18A Oscillators Control (OSCCTRL): OSCCTRL_DPLLLCKF_0, OSCCTRL_DPLLLCKR_0, OSCCTRL_DPLLLDRTO_0, OSCCTRL_DPLLLTO_0 */ + OSCCTRL_4_IRQn = 6, /**< 6 SAMD51J18A Oscillators Control (OSCCTRL): OSCCTRL_DPLLLCKF_1, OSCCTRL_DPLLLCKR_1, OSCCTRL_DPLLLDRTO_1, OSCCTRL_DPLLLTO_1 */ + OSC32KCTRL_IRQn = 7, /**< 7 SAMD51J18A 32kHz Oscillators Control (OSC32KCTRL) */ + SUPC_0_IRQn = 8, /**< 8 SAMD51J18A Supply Controller (SUPC): SUPC_B12SRDY, SUPC_B33SRDY, SUPC_BOD12RDY, SUPC_BOD33RDY, SUPC_VCORERDY, SUPC_VREGRDY */ + SUPC_1_IRQn = 9, /**< 9 SAMD51J18A Supply Controller (SUPC): SUPC_BOD12DET, SUPC_BOD33DET */ + WDT_IRQn = 10, /**< 10 SAMD51J18A Watchdog Timer (WDT) */ + RTC_IRQn = 11, /**< 11 SAMD51J18A Real-Time Counter (RTC) */ + EIC_0_IRQn = 12, /**< 12 SAMD51J18A External Interrupt Controller (EIC): EIC_EXTINT_0 */ + EIC_1_IRQn = 13, /**< 13 SAMD51J18A External Interrupt Controller (EIC): EIC_EXTINT_1 */ + EIC_2_IRQn = 14, /**< 14 SAMD51J18A External Interrupt Controller (EIC): EIC_EXTINT_2 */ + EIC_3_IRQn = 15, /**< 15 SAMD51J18A External Interrupt Controller (EIC): EIC_EXTINT_3 */ + EIC_4_IRQn = 16, /**< 16 SAMD51J18A External Interrupt Controller (EIC): EIC_EXTINT_4 */ + EIC_5_IRQn = 17, /**< 17 SAMD51J18A External Interrupt Controller (EIC): EIC_EXTINT_5 */ + EIC_6_IRQn = 18, /**< 18 SAMD51J18A External Interrupt Controller (EIC): EIC_EXTINT_6 */ + EIC_7_IRQn = 19, /**< 19 SAMD51J18A External Interrupt Controller (EIC): EIC_EXTINT_7 */ + EIC_8_IRQn = 20, /**< 20 SAMD51J18A External Interrupt Controller (EIC): EIC_EXTINT_8 */ + EIC_9_IRQn = 21, /**< 21 SAMD51J18A External Interrupt Controller (EIC): EIC_EXTINT_9 */ + EIC_10_IRQn = 22, /**< 22 SAMD51J18A External Interrupt Controller (EIC): EIC_EXTINT_10 */ + EIC_11_IRQn = 23, /**< 23 SAMD51J18A External Interrupt Controller (EIC): EIC_EXTINT_11 */ + EIC_12_IRQn = 24, /**< 24 SAMD51J18A External Interrupt Controller (EIC): EIC_EXTINT_12 */ + EIC_13_IRQn = 25, /**< 25 SAMD51J18A External Interrupt Controller (EIC): EIC_EXTINT_13 */ + EIC_14_IRQn = 26, /**< 26 SAMD51J18A External Interrupt Controller (EIC): EIC_EXTINT_14 */ + EIC_15_IRQn = 27, /**< 27 SAMD51J18A External Interrupt Controller (EIC): EIC_EXTINT_15 */ + FREQM_IRQn = 28, /**< 28 SAMD51J18A Frequency Meter (FREQM) */ + NVMCTRL_0_IRQn = 29, /**< 29 SAMD51J18A Non-Volatile Memory Controller (NVMCTRL): NVMCTRL_0, NVMCTRL_1, NVMCTRL_2, NVMCTRL_3, NVMCTRL_4, NVMCTRL_5, NVMCTRL_6, NVMCTRL_7 */ + NVMCTRL_1_IRQn = 30, /**< 30 SAMD51J18A Non-Volatile Memory Controller (NVMCTRL): NVMCTRL_10, NVMCTRL_8, NVMCTRL_9 */ + DMAC_0_IRQn = 31, /**< 31 SAMD51J18A Direct Memory Access Controller (DMAC): DMAC_SUSP_0, DMAC_TCMPL_0, DMAC_TERR_0 */ + DMAC_1_IRQn = 32, /**< 32 SAMD51J18A Direct Memory Access Controller (DMAC): DMAC_SUSP_1, DMAC_TCMPL_1, DMAC_TERR_1 */ + DMAC_2_IRQn = 33, /**< 33 SAMD51J18A Direct Memory Access Controller (DMAC): DMAC_SUSP_2, DMAC_TCMPL_2, DMAC_TERR_2 */ + DMAC_3_IRQn = 34, /**< 34 SAMD51J18A Direct Memory Access Controller (DMAC): DMAC_SUSP_3, DMAC_TCMPL_3, DMAC_TERR_3 */ + DMAC_4_IRQn = 35, /**< 35 SAMD51J18A Direct Memory Access Controller (DMAC): DMAC_SUSP_10, DMAC_SUSP_11, DMAC_SUSP_12, DMAC_SUSP_13, DMAC_SUSP_14, DMAC_SUSP_15, DMAC_SUSP_16, DMAC_SUSP_17, DMAC_SUSP_18, DMAC_SUSP_19, DMAC_SUSP_20, DMAC_SUSP_21, DMAC_SUSP_22, DMAC_SUSP_23, DMAC_SUSP_24, DMAC_SUSP_25, DMAC_SUSP_26, DMAC_SUSP_27, DMAC_SUSP_28, DMAC_SUSP_29, DMAC_SUSP_30, DMAC_SUSP_31, DMAC_SUSP_4, DMAC_SUSP_5, DMAC_SUSP_6, DMAC_SUSP_7, DMAC_SUSP_8, DMAC_SUSP_9, DMAC_TCMPL_10, DMAC_TCMPL_11, DMAC_TCMPL_12, DMAC_TCMPL_13, DMAC_TCMPL_14, DMAC_TCMPL_15, DMAC_TCMPL_16, DMAC_TCMPL_17, DMAC_TCMPL_18, DMAC_TCMPL_19, DMAC_TCMPL_20, DMAC_TCMPL_21, DMAC_TCMPL_22, DMAC_TCMPL_23, DMAC_TCMPL_24, DMAC_TCMPL_25, DMAC_TCMPL_26, DMAC_TCMPL_27, DMAC_TCMPL_28, DMAC_TCMPL_29, DMAC_TCMPL_30, DMAC_TCMPL_31, DMAC_TCMPL_4, DMAC_TCMPL_5, DMAC_TCMPL_6, DMAC_TCMPL_7, DMAC_TCMPL_8, DMAC_TCMPL_9, DMAC_TERR_10, DMAC_TERR_11, DMAC_TERR_12, DMAC_TERR_13, DMAC_TERR_14, DMAC_TERR_15, DMAC_TERR_16, DMAC_TERR_17, DMAC_TERR_18, DMAC_TERR_19, DMAC_TERR_20, DMAC_TERR_21, DMAC_TERR_22, DMAC_TERR_23, DMAC_TERR_24, DMAC_TERR_25, DMAC_TERR_26, DMAC_TERR_27, DMAC_TERR_28, DMAC_TERR_29, DMAC_TERR_30, DMAC_TERR_31, DMAC_TERR_4, DMAC_TERR_5, DMAC_TERR_6, DMAC_TERR_7, DMAC_TERR_8, DMAC_TERR_9 */ + EVSYS_0_IRQn = 36, /**< 36 SAMD51J18A Event System Interface (EVSYS): EVSYS_EVD_0, EVSYS_OVR_0 */ + EVSYS_1_IRQn = 37, /**< 37 SAMD51J18A Event System Interface (EVSYS): EVSYS_EVD_1, EVSYS_OVR_1 */ + EVSYS_2_IRQn = 38, /**< 38 SAMD51J18A Event System Interface (EVSYS): EVSYS_EVD_2, EVSYS_OVR_2 */ + EVSYS_3_IRQn = 39, /**< 39 SAMD51J18A Event System Interface (EVSYS): EVSYS_EVD_3, EVSYS_OVR_3 */ + EVSYS_4_IRQn = 40, /**< 40 SAMD51J18A Event System Interface (EVSYS): EVSYS_EVD_10, EVSYS_EVD_11, EVSYS_EVD_4, EVSYS_EVD_5, EVSYS_EVD_6, EVSYS_EVD_7, EVSYS_EVD_8, EVSYS_EVD_9, EVSYS_OVR_10, EVSYS_OVR_11, EVSYS_OVR_4, EVSYS_OVR_5, EVSYS_OVR_6, EVSYS_OVR_7, EVSYS_OVR_8, EVSYS_OVR_9 */ + PAC_IRQn = 41, /**< 41 SAMD51J18A Peripheral Access Controller (PAC) */ + TAL_0_IRQn = 42, /**< 42 SAMD51J18A Trigger Allocator (TAL): TAL_BRK */ + TAL_1_IRQn = 43, /**< 43 SAMD51J18A Trigger Allocator (TAL): TAL_IPS_0, TAL_IPS_1 */ + RAMECC_IRQn = 45, /**< 45 SAMD51J18A RAM ECC (RAMECC) */ + SERCOM0_0_IRQn = 46, /**< 46 SAMD51J18A Serial Communication Interface 0 (SERCOM0): SERCOM0_0 */ + SERCOM0_1_IRQn = 47, /**< 47 SAMD51J18A Serial Communication Interface 0 (SERCOM0): SERCOM0_1 */ + SERCOM0_2_IRQn = 48, /**< 48 SAMD51J18A Serial Communication Interface 0 (SERCOM0): SERCOM0_2 */ + SERCOM0_3_IRQn = 49, /**< 49 SAMD51J18A Serial Communication Interface 0 (SERCOM0): SERCOM0_3, SERCOM0_4, SERCOM0_5, SERCOM0_6 */ + SERCOM1_0_IRQn = 50, /**< 50 SAMD51J18A Serial Communication Interface 1 (SERCOM1): SERCOM1_0 */ + SERCOM1_1_IRQn = 51, /**< 51 SAMD51J18A Serial Communication Interface 1 (SERCOM1): SERCOM1_1 */ + SERCOM1_2_IRQn = 52, /**< 52 SAMD51J18A Serial Communication Interface 1 (SERCOM1): SERCOM1_2 */ + SERCOM1_3_IRQn = 53, /**< 53 SAMD51J18A Serial Communication Interface 1 (SERCOM1): SERCOM1_3, SERCOM1_4, SERCOM1_5, SERCOM1_6 */ + SERCOM2_0_IRQn = 54, /**< 54 SAMD51J18A Serial Communication Interface 2 (SERCOM2): SERCOM2_0 */ + SERCOM2_1_IRQn = 55, /**< 55 SAMD51J18A Serial Communication Interface 2 (SERCOM2): SERCOM2_1 */ + SERCOM2_2_IRQn = 56, /**< 56 SAMD51J18A Serial Communication Interface 2 (SERCOM2): SERCOM2_2 */ + SERCOM2_3_IRQn = 57, /**< 57 SAMD51J18A Serial Communication Interface 2 (SERCOM2): SERCOM2_3, SERCOM2_4, SERCOM2_5, SERCOM2_6 */ + SERCOM3_0_IRQn = 58, /**< 58 SAMD51J18A Serial Communication Interface 3 (SERCOM3): SERCOM3_0 */ + SERCOM3_1_IRQn = 59, /**< 59 SAMD51J18A Serial Communication Interface 3 (SERCOM3): SERCOM3_1 */ + SERCOM3_2_IRQn = 60, /**< 60 SAMD51J18A Serial Communication Interface 3 (SERCOM3): SERCOM3_2 */ + SERCOM3_3_IRQn = 61, /**< 61 SAMD51J18A Serial Communication Interface 3 (SERCOM3): SERCOM3_3, SERCOM3_4, SERCOM3_5, SERCOM3_6 */ + SERCOM4_0_IRQn = 62, /**< 62 SAMD51J18A Serial Communication Interface 4 (SERCOM4): SERCOM4_0 */ + SERCOM4_1_IRQn = 63, /**< 63 SAMD51J18A Serial Communication Interface 4 (SERCOM4): SERCOM4_1 */ + SERCOM4_2_IRQn = 64, /**< 64 SAMD51J18A Serial Communication Interface 4 (SERCOM4): SERCOM4_2 */ + SERCOM4_3_IRQn = 65, /**< 65 SAMD51J18A Serial Communication Interface 4 (SERCOM4): SERCOM4_3, SERCOM4_4, SERCOM4_5, SERCOM4_6 */ + SERCOM5_0_IRQn = 66, /**< 66 SAMD51J18A Serial Communication Interface 5 (SERCOM5): SERCOM5_0 */ + SERCOM5_1_IRQn = 67, /**< 67 SAMD51J18A Serial Communication Interface 5 (SERCOM5): SERCOM5_1 */ + SERCOM5_2_IRQn = 68, /**< 68 SAMD51J18A Serial Communication Interface 5 (SERCOM5): SERCOM5_2 */ + SERCOM5_3_IRQn = 69, /**< 69 SAMD51J18A Serial Communication Interface 5 (SERCOM5): SERCOM5_3, SERCOM5_4, SERCOM5_5, SERCOM5_6 */ + USB_0_IRQn = 80, /**< 80 SAMD51J18A Universal Serial Bus (USB): USB_EORSM_DNRSM, USB_EORST_RST, USB_LPMSUSP_DDISC, USB_LPM_DCONN, USB_MSOF, USB_RAMACER, USB_RXSTP_TXSTP_0, USB_RXSTP_TXSTP_1, USB_RXSTP_TXSTP_2, USB_RXSTP_TXSTP_3, USB_RXSTP_TXSTP_4, USB_RXSTP_TXSTP_5, USB_RXSTP_TXSTP_6, USB_RXSTP_TXSTP_7, USB_STALL0_STALL_0, USB_STALL0_STALL_1, USB_STALL0_STALL_2, USB_STALL0_STALL_3, USB_STALL0_STALL_4, USB_STALL0_STALL_5, USB_STALL0_STALL_6, USB_STALL0_STALL_7, USB_STALL1_0, USB_STALL1_1, USB_STALL1_2, USB_STALL1_3, USB_STALL1_4, USB_STALL1_5, USB_STALL1_6, USB_STALL1_7, USB_SUSPEND, USB_TRFAIL0_TRFAIL_0, USB_TRFAIL0_TRFAIL_1, USB_TRFAIL0_TRFAIL_2, USB_TRFAIL0_TRFAIL_3, USB_TRFAIL0_TRFAIL_4, USB_TRFAIL0_TRFAIL_5, USB_TRFAIL0_TRFAIL_6, USB_TRFAIL0_TRFAIL_7, USB_TRFAIL1_PERR_0, USB_TRFAIL1_PERR_1, USB_TRFAIL1_PERR_2, USB_TRFAIL1_PERR_3, USB_TRFAIL1_PERR_4, USB_TRFAIL1_PERR_5, USB_TRFAIL1_PERR_6, USB_TRFAIL1_PERR_7, USB_UPRSM, USB_WAKEUP */ + USB_1_IRQn = 81, /**< 81 SAMD51J18A Universal Serial Bus (USB): USB_SOF_HSOF */ + USB_2_IRQn = 82, /**< 82 SAMD51J18A Universal Serial Bus (USB): USB_TRCPT0_0, USB_TRCPT0_1, USB_TRCPT0_2, USB_TRCPT0_3, USB_TRCPT0_4, USB_TRCPT0_5, USB_TRCPT0_6, USB_TRCPT0_7 */ + USB_3_IRQn = 83, /**< 83 SAMD51J18A Universal Serial Bus (USB): USB_TRCPT1_0, USB_TRCPT1_1, USB_TRCPT1_2, USB_TRCPT1_3, USB_TRCPT1_4, USB_TRCPT1_5, USB_TRCPT1_6, USB_TRCPT1_7 */ + TCC0_0_IRQn = 85, /**< 85 SAMD51J18A Timer Counter Control 0 (TCC0): TCC0_CNT_A, TCC0_DFS_A, TCC0_ERR_A, TCC0_FAULT0_A, TCC0_FAULT1_A, TCC0_FAULTA_A, TCC0_FAULTB_A, TCC0_OVF, TCC0_TRG, TCC0_UFS_A */ + TCC0_1_IRQn = 86, /**< 86 SAMD51J18A Timer Counter Control 0 (TCC0): TCC0_MC_0 */ + TCC0_2_IRQn = 87, /**< 87 SAMD51J18A Timer Counter Control 0 (TCC0): TCC0_MC_1 */ + TCC0_3_IRQn = 88, /**< 88 SAMD51J18A Timer Counter Control 0 (TCC0): TCC0_MC_2 */ + TCC0_4_IRQn = 89, /**< 89 SAMD51J18A Timer Counter Control 0 (TCC0): TCC0_MC_3 */ + TCC0_5_IRQn = 90, /**< 90 SAMD51J18A Timer Counter Control 0 (TCC0): TCC0_MC_4 */ + TCC0_6_IRQn = 91, /**< 91 SAMD51J18A Timer Counter Control 0 (TCC0): TCC0_MC_5 */ + TCC1_0_IRQn = 92, /**< 92 SAMD51J18A Timer Counter Control 1 (TCC1): TCC1_CNT_A, TCC1_DFS_A, TCC1_ERR_A, TCC1_FAULT0_A, TCC1_FAULT1_A, TCC1_FAULTA_A, TCC1_FAULTB_A, TCC1_OVF, TCC1_TRG, TCC1_UFS_A */ + TCC1_1_IRQn = 93, /**< 93 SAMD51J18A Timer Counter Control 1 (TCC1): TCC1_MC_0 */ + TCC1_2_IRQn = 94, /**< 94 SAMD51J18A Timer Counter Control 1 (TCC1): TCC1_MC_1 */ + TCC1_3_IRQn = 95, /**< 95 SAMD51J18A Timer Counter Control 1 (TCC1): TCC1_MC_2 */ + TCC1_4_IRQn = 96, /**< 96 SAMD51J18A Timer Counter Control 1 (TCC1): TCC1_MC_3 */ + TCC2_0_IRQn = 97, /**< 97 SAMD51J18A Timer Counter Control 2 (TCC2): TCC2_CNT_A, TCC2_DFS_A, TCC2_ERR_A, TCC2_FAULT0_A, TCC2_FAULT1_A, TCC2_FAULTA_A, TCC2_FAULTB_A, TCC2_OVF, TCC2_TRG, TCC2_UFS_A */ + TCC2_1_IRQn = 98, /**< 98 SAMD51J18A Timer Counter Control 2 (TCC2): TCC2_MC_0 */ + TCC2_2_IRQn = 99, /**< 99 SAMD51J18A Timer Counter Control 2 (TCC2): TCC2_MC_1 */ + TCC2_3_IRQn = 100, /**< 100 SAMD51J18A Timer Counter Control 2 (TCC2): TCC2_MC_2 */ + TCC3_0_IRQn = 101, /**< 101 SAMD51J18A Timer Counter Control 3 (TCC3): TCC3_CNT_A, TCC3_DFS_A, TCC3_ERR_A, TCC3_FAULT0_A, TCC3_FAULT1_A, TCC3_FAULTA_A, TCC3_FAULTB_A, TCC3_OVF, TCC3_TRG, TCC3_UFS_A */ + TCC3_1_IRQn = 102, /**< 102 SAMD51J18A Timer Counter Control 3 (TCC3): TCC3_MC_0 */ + TCC3_2_IRQn = 103, /**< 103 SAMD51J18A Timer Counter Control 3 (TCC3): TCC3_MC_1 */ + TCC4_0_IRQn = 104, /**< 104 SAMD51J18A Timer Counter Control 4 (TCC4): TCC4_CNT_A, TCC4_DFS_A, TCC4_ERR_A, TCC4_FAULT0_A, TCC4_FAULT1_A, TCC4_FAULTA_A, TCC4_FAULTB_A, TCC4_OVF, TCC4_TRG, TCC4_UFS_A */ + TCC4_1_IRQn = 105, /**< 105 SAMD51J18A Timer Counter Control 4 (TCC4): TCC4_MC_0 */ + TCC4_2_IRQn = 106, /**< 106 SAMD51J18A Timer Counter Control 4 (TCC4): TCC4_MC_1 */ + TC0_IRQn = 107, /**< 107 SAMD51J18A Basic Timer Counter 0 (TC0) */ + TC1_IRQn = 108, /**< 108 SAMD51J18A Basic Timer Counter 1 (TC1) */ + TC2_IRQn = 109, /**< 109 SAMD51J18A Basic Timer Counter 2 (TC2) */ + TC3_IRQn = 110, /**< 110 SAMD51J18A Basic Timer Counter 3 (TC3) */ + TC4_IRQn = 111, /**< 111 SAMD51J18A Basic Timer Counter 4 (TC4) */ + TC5_IRQn = 112, /**< 112 SAMD51J18A Basic Timer Counter 5 (TC5) */ + PDEC_0_IRQn = 115, /**< 115 SAMD51J18A Quadrature Decodeur (PDEC): PDEC_DIR_A, PDEC_ERR_A, PDEC_OVF, PDEC_VLC_A */ + PDEC_1_IRQn = 116, /**< 116 SAMD51J18A Quadrature Decodeur (PDEC): PDEC_MC_0 */ + PDEC_2_IRQn = 117, /**< 117 SAMD51J18A Quadrature Decodeur (PDEC): PDEC_MC_1 */ + ADC0_0_IRQn = 118, /**< 118 SAMD51J18A Analog Digital Converter 0 (ADC0): ADC0_OVERRUN, ADC0_WINMON */ + ADC0_1_IRQn = 119, /**< 119 SAMD51J18A Analog Digital Converter 0 (ADC0): ADC0_RESRDY */ + ADC1_0_IRQn = 120, /**< 120 SAMD51J18A Analog Digital Converter 1 (ADC1): ADC1_OVERRUN, ADC1_WINMON */ + ADC1_1_IRQn = 121, /**< 121 SAMD51J18A Analog Digital Converter 1 (ADC1): ADC1_RESRDY */ + AC_IRQn = 122, /**< 122 SAMD51J18A Analog Comparators (AC) */ + DAC_0_IRQn = 123, /**< 123 SAMD51J18A Digital-to-Analog Converter (DAC): DAC_OVERRUN_A_0, DAC_OVERRUN_A_1, DAC_UNDERRUN_A_0, DAC_UNDERRUN_A_1 */ + DAC_1_IRQn = 124, /**< 124 SAMD51J18A Digital-to-Analog Converter (DAC): DAC_EMPTY_0 */ + DAC_2_IRQn = 125, /**< 125 SAMD51J18A Digital-to-Analog Converter (DAC): DAC_EMPTY_1 */ + DAC_3_IRQn = 126, /**< 126 SAMD51J18A Digital-to-Analog Converter (DAC): DAC_RESRDY_0 */ + DAC_4_IRQn = 127, /**< 127 SAMD51J18A Digital-to-Analog Converter (DAC): DAC_RESRDY_1 */ + I2S_IRQn = 128, /**< 128 SAMD51J18A Inter-IC Sound Interface (I2S) */ + PCC_IRQn = 129, /**< 129 SAMD51J18A Parallel Capture Controller (PCC) */ + AES_IRQn = 130, /**< 130 SAMD51J18A Advanced Encryption Standard (AES) */ + TRNG_IRQn = 131, /**< 131 SAMD51J18A True Random Generator (TRNG) */ + ICM_IRQn = 132, /**< 132 SAMD51J18A Integrity Check Monitor (ICM) */ + PUKCC_IRQn = 133, /**< 133 SAMD51J18A PUblic-Key Cryptography Controller (PUKCC) */ + QSPI_IRQn = 134, /**< 134 SAMD51J18A Quad SPI interface (QSPI) */ + SDHC0_IRQn = 135, /**< 135 SAMD51J18A SD/MMC Host Controller 0 (SDHC0) */ + + PERIPH_COUNT_IRQn = 137 /**< Number of peripheral IDs */ +} IRQn_Type; + +typedef struct _DeviceVectors +{ + /* Stack pointer */ + void* pvStack; + + /* Cortex-M handlers */ + void* pfnReset_Handler; + void* pfnNMI_Handler; + void* pfnHardFault_Handler; + void* pfnMemManage_Handler; + void* pfnBusFault_Handler; + void* pfnUsageFault_Handler; + void* pvReservedM9; + void* pvReservedM8; + void* pvReservedM7; + void* pvReservedM6; + void* pfnSVC_Handler; + void* pfnDebugMon_Handler; + void* pvReservedM3; + void* pfnPendSV_Handler; + void* pfnSysTick_Handler; + + /* Peripheral handlers */ + void* pfnPM_Handler; /* 0 Power Manager */ + void* pfnMCLK_Handler; /* 1 Main Clock */ + void* pfnOSCCTRL_0_Handler; /* 2 Oscillators Control IRQ 0 */ + void* pfnOSCCTRL_1_Handler; /* 3 Oscillators Control IRQ 1 */ + void* pfnOSCCTRL_2_Handler; /* 4 Oscillators Control IRQ 2 */ + void* pfnOSCCTRL_3_Handler; /* 5 Oscillators Control IRQ 3 */ + void* pfnOSCCTRL_4_Handler; /* 6 Oscillators Control IRQ 4 */ + void* pfnOSC32KCTRL_Handler; /* 7 32kHz Oscillators Control */ + void* pfnSUPC_0_Handler; /* 8 Supply Controller IRQ 0 */ + void* pfnSUPC_1_Handler; /* 9 Supply Controller IRQ 1 */ + void* pfnWDT_Handler; /* 10 Watchdog Timer */ + void* pfnRTC_Handler; /* 11 Real-Time Counter */ + void* pfnEIC_0_Handler; /* 12 External Interrupt Controller IRQ 0 */ + void* pfnEIC_1_Handler; /* 13 External Interrupt Controller IRQ 1 */ + void* pfnEIC_2_Handler; /* 14 External Interrupt Controller IRQ 2 */ + void* pfnEIC_3_Handler; /* 15 External Interrupt Controller IRQ 3 */ + void* pfnEIC_4_Handler; /* 16 External Interrupt Controller IRQ 4 */ + void* pfnEIC_5_Handler; /* 17 External Interrupt Controller IRQ 5 */ + void* pfnEIC_6_Handler; /* 18 External Interrupt Controller IRQ 6 */ + void* pfnEIC_7_Handler; /* 19 External Interrupt Controller IRQ 7 */ + void* pfnEIC_8_Handler; /* 20 External Interrupt Controller IRQ 8 */ + void* pfnEIC_9_Handler; /* 21 External Interrupt Controller IRQ 9 */ + void* pfnEIC_10_Handler; /* 22 External Interrupt Controller IRQ 10 */ + void* pfnEIC_11_Handler; /* 23 External Interrupt Controller IRQ 11 */ + void* pfnEIC_12_Handler; /* 24 External Interrupt Controller IRQ 12 */ + void* pfnEIC_13_Handler; /* 25 External Interrupt Controller IRQ 13 */ + void* pfnEIC_14_Handler; /* 26 External Interrupt Controller IRQ 14 */ + void* pfnEIC_15_Handler; /* 27 External Interrupt Controller IRQ 15 */ + void* pfnFREQM_Handler; /* 28 Frequency Meter */ + void* pfnNVMCTRL_0_Handler; /* 29 Non-Volatile Memory Controller IRQ 0 */ + void* pfnNVMCTRL_1_Handler; /* 30 Non-Volatile Memory Controller IRQ 1 */ + void* pfnDMAC_0_Handler; /* 31 Direct Memory Access Controller IRQ 0 */ + void* pfnDMAC_1_Handler; /* 32 Direct Memory Access Controller IRQ 1 */ + void* pfnDMAC_2_Handler; /* 33 Direct Memory Access Controller IRQ 2 */ + void* pfnDMAC_3_Handler; /* 34 Direct Memory Access Controller IRQ 3 */ + void* pfnDMAC_4_Handler; /* 35 Direct Memory Access Controller IRQ 4 */ + void* pfnEVSYS_0_Handler; /* 36 Event System Interface IRQ 0 */ + void* pfnEVSYS_1_Handler; /* 37 Event System Interface IRQ 1 */ + void* pfnEVSYS_2_Handler; /* 38 Event System Interface IRQ 2 */ + void* pfnEVSYS_3_Handler; /* 39 Event System Interface IRQ 3 */ + void* pfnEVSYS_4_Handler; /* 40 Event System Interface IRQ 4 */ + void* pfnPAC_Handler; /* 41 Peripheral Access Controller */ + void* pfnTAL_0_Handler; /* 42 Trigger Allocator IRQ 0 */ + void* pfnTAL_1_Handler; /* 43 Trigger Allocator IRQ 1 */ + void* pvReserved44; + void* pfnRAMECC_Handler; /* 45 RAM ECC */ + void* pfnSERCOM0_0_Handler; /* 46 Serial Communication Interface 0 IRQ 0 */ + void* pfnSERCOM0_1_Handler; /* 47 Serial Communication Interface 0 IRQ 1 */ + void* pfnSERCOM0_2_Handler; /* 48 Serial Communication Interface 0 IRQ 2 */ + void* pfnSERCOM0_3_Handler; /* 49 Serial Communication Interface 0 IRQ 3 */ + void* pfnSERCOM1_0_Handler; /* 50 Serial Communication Interface 1 IRQ 0 */ + void* pfnSERCOM1_1_Handler; /* 51 Serial Communication Interface 1 IRQ 1 */ + void* pfnSERCOM1_2_Handler; /* 52 Serial Communication Interface 1 IRQ 2 */ + void* pfnSERCOM1_3_Handler; /* 53 Serial Communication Interface 1 IRQ 3 */ + void* pfnSERCOM2_0_Handler; /* 54 Serial Communication Interface 2 IRQ 0 */ + void* pfnSERCOM2_1_Handler; /* 55 Serial Communication Interface 2 IRQ 1 */ + void* pfnSERCOM2_2_Handler; /* 56 Serial Communication Interface 2 IRQ 2 */ + void* pfnSERCOM2_3_Handler; /* 57 Serial Communication Interface 2 IRQ 3 */ + void* pfnSERCOM3_0_Handler; /* 58 Serial Communication Interface 3 IRQ 0 */ + void* pfnSERCOM3_1_Handler; /* 59 Serial Communication Interface 3 IRQ 1 */ + void* pfnSERCOM3_2_Handler; /* 60 Serial Communication Interface 3 IRQ 2 */ + void* pfnSERCOM3_3_Handler; /* 61 Serial Communication Interface 3 IRQ 3 */ + void* pfnSERCOM4_0_Handler; /* 62 Serial Communication Interface 4 IRQ 0 */ + void* pfnSERCOM4_1_Handler; /* 63 Serial Communication Interface 4 IRQ 1 */ + void* pfnSERCOM4_2_Handler; /* 64 Serial Communication Interface 4 IRQ 2 */ + void* pfnSERCOM4_3_Handler; /* 65 Serial Communication Interface 4 IRQ 3 */ + void* pfnSERCOM5_0_Handler; /* 66 Serial Communication Interface 5 IRQ 0 */ + void* pfnSERCOM5_1_Handler; /* 67 Serial Communication Interface 5 IRQ 1 */ + void* pfnSERCOM5_2_Handler; /* 68 Serial Communication Interface 5 IRQ 2 */ + void* pfnSERCOM5_3_Handler; /* 69 Serial Communication Interface 5 IRQ 3 */ + void* pvReserved70; + void* pvReserved71; + void* pvReserved72; + void* pvReserved73; + void* pvReserved74; + void* pvReserved75; + void* pvReserved76; + void* pvReserved77; + void* pvReserved78; + void* pvReserved79; + void* pfnUSB_0_Handler; /* 80 Universal Serial Bus IRQ 0 */ + void* pfnUSB_1_Handler; /* 81 Universal Serial Bus IRQ 1 */ + void* pfnUSB_2_Handler; /* 82 Universal Serial Bus IRQ 2 */ + void* pfnUSB_3_Handler; /* 83 Universal Serial Bus IRQ 3 */ + void* pvReserved84; + void* pfnTCC0_0_Handler; /* 85 Timer Counter Control 0 IRQ 0 */ + void* pfnTCC0_1_Handler; /* 86 Timer Counter Control 0 IRQ 1 */ + void* pfnTCC0_2_Handler; /* 87 Timer Counter Control 0 IRQ 2 */ + void* pfnTCC0_3_Handler; /* 88 Timer Counter Control 0 IRQ 3 */ + void* pfnTCC0_4_Handler; /* 89 Timer Counter Control 0 IRQ 4 */ + void* pfnTCC0_5_Handler; /* 90 Timer Counter Control 0 IRQ 5 */ + void* pfnTCC0_6_Handler; /* 91 Timer Counter Control 0 IRQ 6 */ + void* pfnTCC1_0_Handler; /* 92 Timer Counter Control 1 IRQ 0 */ + void* pfnTCC1_1_Handler; /* 93 Timer Counter Control 1 IRQ 1 */ + void* pfnTCC1_2_Handler; /* 94 Timer Counter Control 1 IRQ 2 */ + void* pfnTCC1_3_Handler; /* 95 Timer Counter Control 1 IRQ 3 */ + void* pfnTCC1_4_Handler; /* 96 Timer Counter Control 1 IRQ 4 */ + void* pfnTCC2_0_Handler; /* 97 Timer Counter Control 2 IRQ 0 */ + void* pfnTCC2_1_Handler; /* 98 Timer Counter Control 2 IRQ 1 */ + void* pfnTCC2_2_Handler; /* 99 Timer Counter Control 2 IRQ 2 */ + void* pfnTCC2_3_Handler; /* 100 Timer Counter Control 2 IRQ 3 */ + void* pfnTCC3_0_Handler; /* 101 Timer Counter Control 3 IRQ 0 */ + void* pfnTCC3_1_Handler; /* 102 Timer Counter Control 3 IRQ 1 */ + void* pfnTCC3_2_Handler; /* 103 Timer Counter Control 3 IRQ 2 */ + void* pfnTCC4_0_Handler; /* 104 Timer Counter Control 4 IRQ 0 */ + void* pfnTCC4_1_Handler; /* 105 Timer Counter Control 4 IRQ 1 */ + void* pfnTCC4_2_Handler; /* 106 Timer Counter Control 4 IRQ 2 */ + void* pfnTC0_Handler; /* 107 Basic Timer Counter 0 */ + void* pfnTC1_Handler; /* 108 Basic Timer Counter 1 */ + void* pfnTC2_Handler; /* 109 Basic Timer Counter 2 */ + void* pfnTC3_Handler; /* 110 Basic Timer Counter 3 */ + void* pfnTC4_Handler; /* 111 Basic Timer Counter 4 */ + void* pfnTC5_Handler; /* 112 Basic Timer Counter 5 */ + void* pvReserved113; + void* pvReserved114; + void* pfnPDEC_0_Handler; /* 115 Quadrature Decodeur IRQ 0 */ + void* pfnPDEC_1_Handler; /* 116 Quadrature Decodeur IRQ 1 */ + void* pfnPDEC_2_Handler; /* 117 Quadrature Decodeur IRQ 2 */ + void* pfnADC0_0_Handler; /* 118 Analog Digital Converter 0 IRQ 0 */ + void* pfnADC0_1_Handler; /* 119 Analog Digital Converter 0 IRQ 1 */ + void* pfnADC1_0_Handler; /* 120 Analog Digital Converter 1 IRQ 0 */ + void* pfnADC1_1_Handler; /* 121 Analog Digital Converter 1 IRQ 1 */ + void* pfnAC_Handler; /* 122 Analog Comparators */ + void* pfnDAC_0_Handler; /* 123 Digital-to-Analog Converter IRQ 0 */ + void* pfnDAC_1_Handler; /* 124 Digital-to-Analog Converter IRQ 1 */ + void* pfnDAC_2_Handler; /* 125 Digital-to-Analog Converter IRQ 2 */ + void* pfnDAC_3_Handler; /* 126 Digital-to-Analog Converter IRQ 3 */ + void* pfnDAC_4_Handler; /* 127 Digital-to-Analog Converter IRQ 4 */ + void* pfnI2S_Handler; /* 128 Inter-IC Sound Interface */ + void* pfnPCC_Handler; /* 129 Parallel Capture Controller */ + void* pfnAES_Handler; /* 130 Advanced Encryption Standard */ + void* pfnTRNG_Handler; /* 131 True Random Generator */ + void* pfnICM_Handler; /* 132 Integrity Check Monitor */ + void* pfnPUKCC_Handler; /* 133 PUblic-Key Cryptography Controller */ + void* pfnQSPI_Handler; /* 134 Quad SPI interface */ + void* pfnSDHC0_Handler; /* 135 SD/MMC Host Controller 0 */ + void* pvReserved136; +} DeviceVectors; + +/* Cortex-M4 processor handlers */ +void Reset_Handler ( void ); +void NMI_Handler ( void ); +void HardFault_Handler ( void ); +void MemManage_Handler ( void ); +void BusFault_Handler ( void ); +void UsageFault_Handler ( void ); +void SVC_Handler ( void ); +void DebugMon_Handler ( void ); +void PendSV_Handler ( void ); +void SysTick_Handler ( void ); + +/* Peripherals handlers */ +void PM_Handler ( void ); +void MCLK_Handler ( void ); +void OSCCTRL_0_Handler ( void ); +void OSCCTRL_1_Handler ( void ); +void OSCCTRL_2_Handler ( void ); +void OSCCTRL_3_Handler ( void ); +void OSCCTRL_4_Handler ( void ); +void OSC32KCTRL_Handler ( void ); +void SUPC_0_Handler ( void ); +void SUPC_1_Handler ( void ); +void WDT_Handler ( void ); +void RTC_Handler ( void ); +void EIC_0_Handler ( void ); +void EIC_1_Handler ( void ); +void EIC_2_Handler ( void ); +void EIC_3_Handler ( void ); +void EIC_4_Handler ( void ); +void EIC_5_Handler ( void ); +void EIC_6_Handler ( void ); +void EIC_7_Handler ( void ); +void EIC_8_Handler ( void ); +void EIC_9_Handler ( void ); +void EIC_10_Handler ( void ); +void EIC_11_Handler ( void ); +void EIC_12_Handler ( void ); +void EIC_13_Handler ( void ); +void EIC_14_Handler ( void ); +void EIC_15_Handler ( void ); +void FREQM_Handler ( void ); +void NVMCTRL_0_Handler ( void ); +void NVMCTRL_1_Handler ( void ); +void DMAC_0_Handler ( void ); +void DMAC_1_Handler ( void ); +void DMAC_2_Handler ( void ); +void DMAC_3_Handler ( void ); +void DMAC_4_Handler ( void ); +void EVSYS_0_Handler ( void ); +void EVSYS_1_Handler ( void ); +void EVSYS_2_Handler ( void ); +void EVSYS_3_Handler ( void ); +void EVSYS_4_Handler ( void ); +void PAC_Handler ( void ); +void TAL_0_Handler ( void ); +void TAL_1_Handler ( void ); +void RAMECC_Handler ( void ); +void SERCOM0_0_Handler ( void ); +void SERCOM0_1_Handler ( void ); +void SERCOM0_2_Handler ( void ); +void SERCOM0_3_Handler ( void ); +void SERCOM1_0_Handler ( void ); +void SERCOM1_1_Handler ( void ); +void SERCOM1_2_Handler ( void ); +void SERCOM1_3_Handler ( void ); +void SERCOM2_0_Handler ( void ); +void SERCOM2_1_Handler ( void ); +void SERCOM2_2_Handler ( void ); +void SERCOM2_3_Handler ( void ); +void SERCOM3_0_Handler ( void ); +void SERCOM3_1_Handler ( void ); +void SERCOM3_2_Handler ( void ); +void SERCOM3_3_Handler ( void ); +void SERCOM4_0_Handler ( void ); +void SERCOM4_1_Handler ( void ); +void SERCOM4_2_Handler ( void ); +void SERCOM4_3_Handler ( void ); +void SERCOM5_0_Handler ( void ); +void SERCOM5_1_Handler ( void ); +void SERCOM5_2_Handler ( void ); +void SERCOM5_3_Handler ( void ); +void USB_0_Handler ( void ); +void USB_1_Handler ( void ); +void USB_2_Handler ( void ); +void USB_3_Handler ( void ); +void TCC0_0_Handler ( void ); +void TCC0_1_Handler ( void ); +void TCC0_2_Handler ( void ); +void TCC0_3_Handler ( void ); +void TCC0_4_Handler ( void ); +void TCC0_5_Handler ( void ); +void TCC0_6_Handler ( void ); +void TCC1_0_Handler ( void ); +void TCC1_1_Handler ( void ); +void TCC1_2_Handler ( void ); +void TCC1_3_Handler ( void ); +void TCC1_4_Handler ( void ); +void TCC2_0_Handler ( void ); +void TCC2_1_Handler ( void ); +void TCC2_2_Handler ( void ); +void TCC2_3_Handler ( void ); +void TCC3_0_Handler ( void ); +void TCC3_1_Handler ( void ); +void TCC3_2_Handler ( void ); +void TCC4_0_Handler ( void ); +void TCC4_1_Handler ( void ); +void TCC4_2_Handler ( void ); +void TC0_Handler ( void ); +void TC1_Handler ( void ); +void TC2_Handler ( void ); +void TC3_Handler ( void ); +void TC4_Handler ( void ); +void TC5_Handler ( void ); +void PDEC_0_Handler ( void ); +void PDEC_1_Handler ( void ); +void PDEC_2_Handler ( void ); +void ADC0_0_Handler ( void ); +void ADC0_1_Handler ( void ); +void ADC1_0_Handler ( void ); +void ADC1_1_Handler ( void ); +void AC_Handler ( void ); +void DAC_0_Handler ( void ); +void DAC_1_Handler ( void ); +void DAC_2_Handler ( void ); +void DAC_3_Handler ( void ); +void DAC_4_Handler ( void ); +void I2S_Handler ( void ); +void PCC_Handler ( void ); +void AES_Handler ( void ); +void TRNG_Handler ( void ); +void ICM_Handler ( void ); +void PUKCC_Handler ( void ); +void QSPI_Handler ( void ); +void SDHC0_Handler ( void ); + +/* + * \brief Configuration of the Cortex-M4 Processor and Core Peripherals + */ + +#define LITTLE_ENDIAN 1 +#define __CM4_REV 1 /*!< Core revision r0p1 */ +#define __DEBUG_LVL 3 /*!< Full debug plus DWT data matching */ +#define __FPU_PRESENT 1 /*!< FPU present or not */ +#define __MPU_PRESENT 1 /*!< MPU present or not */ +#define __NVIC_PRIO_BITS 3 /*!< Number of bits used for Priority Levels */ +#define __TRACE_LVL 2 /*!< Full trace: ITM, DWT triggers and counters, ETM */ +#define __VTOR_PRESENT 1 /*!< VTOR present or not */ +#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ + +/** + * \brief CMSIS includes + */ + +#include +#if !defined DONT_USE_CMSIS_INIT +#include "system_samd51.h" +#endif /* DONT_USE_CMSIS_INIT */ + +/*@}*/ + +/* ************************************************************************** */ +/** SOFTWARE PERIPHERAL API DEFINITION FOR SAMD51J18A */ +/* ************************************************************************** */ +/** \defgroup SAMD51J18A_api Peripheral Software API */ +/*@{*/ + +#include "component/ac.h" +#include "component/adc.h" +#include "component/aes.h" +#include "component/ccl.h" +#include "component/cmcc.h" +#include "component/dac.h" +#include "component/dmac.h" +#include "component/dsu.h" +#include "component/eic.h" +#include "component/evsys.h" +#include "component/freqm.h" +#include "component/gclk.h" +#include "component/hmatrixb.h" +#include "component/icm.h" +#include "component/i2s.h" +#include "component/mclk.h" +#include "component/nvmctrl.h" +#include "component/oscctrl.h" +#include "component/osc32kctrl.h" +#include "component/pac.h" +#include "component/pcc.h" +#include "component/pdec.h" +#include "component/pm.h" +#include "component/port.h" +#include "component/qspi.h" +#include "component/ramecc.h" +#include "component/rstc.h" +#include "component/rtc.h" +#include "component/sdhc.h" +#include "component/sercom.h" +#include "component/supc.h" +#include "component/tal.h" +#include "component/tc.h" +#include "component/tcc.h" +#include "component/trng.h" +#include "component/usb.h" +#include "component/wdt.h" +/*@}*/ + +/* ************************************************************************** */ +/** REGISTERS ACCESS DEFINITIONS FOR SAMD51J18A */ +/* ************************************************************************** */ +/** \defgroup SAMD51J18A_reg Registers Access Definitions */ +/*@{*/ + +#include "instance/ac.h" +#include "instance/adc0.h" +#include "instance/adc1.h" +#include "instance/aes.h" +#include "instance/ccl.h" +#include "instance/cmcc.h" +#include "instance/dac.h" +#include "instance/dmac.h" +#include "instance/dsu.h" +#include "instance/eic.h" +#include "instance/evsys.h" +#include "instance/freqm.h" +#include "instance/gclk.h" +#include "instance/hmatrix.h" +#include "instance/icm.h" +#include "instance/i2s.h" +#include "instance/mclk.h" +#include "instance/nvmctrl.h" +#include "instance/oscctrl.h" +#include "instance/osc32kctrl.h" +#include "instance/pac.h" +#include "instance/pcc.h" +#include "instance/pdec.h" +#include "instance/pm.h" +#include "instance/port.h" +#include "instance/qspi.h" +#include "instance/ramecc.h" +#include "instance/rstc.h" +#include "instance/rtc.h" +#include "instance/sdhc0.h" +#include "instance/sercom0.h" +#include "instance/sercom1.h" +#include "instance/sercom2.h" +#include "instance/sercom3.h" +#include "instance/sercom4.h" +#include "instance/sercom5.h" +#include "instance/supc.h" +#include "instance/tal.h" +#include "instance/tc0.h" +#include "instance/tc1.h" +#include "instance/tc2.h" +#include "instance/tc3.h" +#include "instance/tc4.h" +#include "instance/tc5.h" +#include "instance/tcc0.h" +#include "instance/tcc1.h" +#include "instance/tcc2.h" +#include "instance/tcc3.h" +#include "instance/tcc4.h" +#include "instance/trng.h" +#include "instance/usb.h" +#include "instance/wdt.h" +/*@}*/ + +/* ************************************************************************** */ +/** PERIPHERAL ID DEFINITIONS FOR SAMD51J18A */ +/* ************************************************************************** */ +/** \defgroup SAMD51J18A_id Peripheral Ids Definitions */ +/*@{*/ + +// Peripheral instances on HPB0 bridge +#define ID_PAC 0 /**< \brief Peripheral Access Controller (PAC) */ +#define ID_PM 1 /**< \brief Power Manager (PM) */ +#define ID_MCLK 2 /**< \brief Main Clock (MCLK) */ +#define ID_RSTC 3 /**< \brief Reset Controller (RSTC) */ +#define ID_OSCCTRL 4 /**< \brief Oscillators Control (OSCCTRL) */ +#define ID_OSC32KCTRL 5 /**< \brief 32kHz Oscillators Control (OSC32KCTRL) */ +#define ID_SUPC 6 /**< \brief Supply Controller (SUPC) */ +#define ID_GCLK 7 /**< \brief Generic Clock Generator (GCLK) */ +#define ID_WDT 8 /**< \brief Watchdog Timer (WDT) */ +#define ID_RTC 9 /**< \brief Real-Time Counter (RTC) */ +#define ID_EIC 10 /**< \brief External Interrupt Controller (EIC) */ +#define ID_FREQM 11 /**< \brief Frequency Meter (FREQM) */ +#define ID_SERCOM0 12 /**< \brief Serial Communication Interface 0 (SERCOM0) */ +#define ID_SERCOM1 13 /**< \brief Serial Communication Interface 1 (SERCOM1) */ +#define ID_TC0 14 /**< \brief Basic Timer Counter 0 (TC0) */ +#define ID_TC1 15 /**< \brief Basic Timer Counter 1 (TC1) */ + +// Peripheral instances on HPB1 bridge +#define ID_USB 32 /**< \brief Universal Serial Bus (USB) */ +#define ID_DSU 33 /**< \brief Device Service Unit (DSU) */ +#define ID_NVMCTRL 34 /**< \brief Non-Volatile Memory Controller (NVMCTRL) */ +#define ID_CMCC 35 /**< \brief Cortex M Cache Controller (CMCC) */ +#define ID_PORT 36 /**< \brief Port Module (PORT) */ +#define ID_DMAC 37 /**< \brief Direct Memory Access Controller (DMAC) */ +#define ID_HMATRIX 38 /**< \brief HSB Matrix (HMATRIX) */ +#define ID_EVSYS 39 /**< \brief Event System Interface (EVSYS) */ +#define ID_SERCOM2 41 /**< \brief Serial Communication Interface 2 (SERCOM2) */ +#define ID_SERCOM3 42 /**< \brief Serial Communication Interface 3 (SERCOM3) */ +#define ID_TCC0 43 /**< \brief Timer Counter Control 0 (TCC0) */ +#define ID_TCC1 44 /**< \brief Timer Counter Control 1 (TCC1) */ +#define ID_TC2 45 /**< \brief Basic Timer Counter 2 (TC2) */ +#define ID_TC3 46 /**< \brief Basic Timer Counter 3 (TC3) */ +#define ID_TAL 47 /**< \brief Trigger Allocator (TAL) */ +#define ID_RAMECC 48 /**< \brief RAM ECC (RAMECC) */ +#define ID_TCC2 67 /**< \brief Timer Counter Control 2 (TCC2) */ +#define ID_TCC3 68 /**< \brief Timer Counter Control 3 (TCC3) */ +#define ID_TC4 69 /**< \brief Basic Timer Counter 4 (TC4) */ +#define ID_TC5 70 /**< \brief Basic Timer Counter 5 (TC5) */ +#define ID_PDEC 71 /**< \brief Quadrature Decodeur (PDEC) */ +#define ID_AC 72 /**< \brief Analog Comparators (AC) */ +#define ID_AES 73 /**< \brief Advanced Encryption Standard (AES) */ +#define ID_TRNG 74 /**< \brief True Random Generator (TRNG) */ +#define ID_ICM 75 /**< \brief Integrity Check Monitor (ICM) */ +#define ID_PUKCC 76 /**< \brief PUblic-Key Cryptography Controller (PUKCC) */ +#define ID_QSPI 77 /**< \brief Quad SPI interface (QSPI) */ +#define ID_CCL 78 /**< \brief Configurable Custom Logic (CCL) */ + +// Peripheral instances on HPB3 bridge +#define ID_SERCOM4 96 /**< \brief Serial Communication Interface 4 (SERCOM4) */ +#define ID_SERCOM5 97 /**< \brief Serial Communication Interface 5 (SERCOM5) */ +#define ID_TCC4 100 /**< \brief Timer Counter Control 4 (TCC4) */ +#define ID_ADC0 103 /**< \brief Analog Digital Converter 0 (ADC0) */ +#define ID_ADC1 104 /**< \brief Analog Digital Converter 1 (ADC1) */ +#define ID_DAC 105 /**< \brief Digital-to-Analog Converter (DAC) */ +#define ID_I2S 106 /**< \brief Inter-IC Sound Interface (I2S) */ +#define ID_PCC 107 /**< \brief Parallel Capture Controller (PCC) */ + +// Peripheral instances on AHB (as if on bridge 4) +#define ID_SDHC0 128 /**< \brief SD/MMC Host Controller (SDHC0) */ + +#define ID_PERIPH_COUNT 129 /**< \brief Max number of peripheral IDs */ +/*@}*/ + +/* ************************************************************************** */ +/** BASE ADDRESS DEFINITIONS FOR SAMD51J18A */ +/* ************************************************************************** */ +/** \defgroup SAMD51J18A_base Peripheral Base Address Definitions */ +/*@{*/ + +#if defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__) +#define AC (0x42002000) /**< \brief (AC) APB Base Address */ +#define ADC0 (0x43001C00) /**< \brief (ADC0) APB Base Address */ +#define ADC1 (0x43002000) /**< \brief (ADC1) APB Base Address */ +#define AES (0x42002400) /**< \brief (AES) APB Base Address */ +#define CCL (0x42003800) /**< \brief (CCL) APB Base Address */ +#define CMCC (0x41006000) /**< \brief (CMCC) APB Base Address */ +#define CMCC_AHB (0x03000000) /**< \brief (CMCC) AHB Base Address */ +#define DAC (0x43002400) /**< \brief (DAC) APB Base Address */ +#define DMAC (0x4100A000) /**< \brief (DMAC) APB Base Address */ +#define DSU (0x41002000) /**< \brief (DSU) APB Base Address */ +#define EIC (0x40002800) /**< \brief (EIC) APB Base Address */ +#define EVSYS (0x4100E000) /**< \brief (EVSYS) APB Base Address */ +#define FREQM (0x40002C00) /**< \brief (FREQM) APB Base Address */ +#define GCLK (0x40001C00) /**< \brief (GCLK) APB Base Address */ +#define HMATRIX (0x4100C000) /**< \brief (HMATRIX) APB Base Address */ +#define ICM (0x42002C00) /**< \brief (ICM) APB Base Address */ +#define I2S (0x43002800) /**< \brief (I2S) APB Base Address */ +#define MCLK (0x40000800) /**< \brief (MCLK) APB Base Address */ +#define NVMCTRL (0x41004000) /**< \brief (NVMCTRL) APB Base Address */ +#define NVMCTRL_CB (0x00800000) /**< \brief (NVMCTRL) CB Base Address */ +#define NVMCTRL_CBW0 (0x00800000) /**< \brief (NVMCTRL) CBW0 Base Address */ +#define NVMCTRL_CBW1 (0x00800010) /**< \brief (NVMCTRL) CBW1 Base Address */ +#define NVMCTRL_CBW2 (0x00800020) /**< \brief (NVMCTRL) CBW2 Base Address */ +#define NVMCTRL_CBW3 (0x00800030) /**< \brief (NVMCTRL) CBW3 Base Address */ +#define NVMCTRL_CBW4 (0x00800040) /**< \brief (NVMCTRL) CBW4 Base Address */ +#define NVMCTRL_CBW5 (0x00800050) /**< \brief (NVMCTRL) CBW5 Base Address */ +#define NVMCTRL_CBW6 (0x00800060) /**< \brief (NVMCTRL) CBW6 Base Address */ +#define NVMCTRL_CBW7 (0x00800070) /**< \brief (NVMCTRL) CBW7 Base Address */ +#define NVMCTRL_FS (0x00806000) /**< \brief (NVMCTRL) FS Base Address */ +#define NVMCTRL_SW0 (0x00800080) /**< \brief (NVMCTRL) SW0 Base Address */ +#define NVMCTRL_SW1 (0x00800090) /**< \brief (NVMCTRL) SW1 Base Address */ +#define NVMCTRL_SW2 (0x008000A0) /**< \brief (NVMCTRL) SW2 Base Address */ +#define NVMCTRL_SW3 (0x008000B0) /**< \brief (NVMCTRL) SW3 Base Address */ +#define NVMCTRL_SW4 (0x008000C0) /**< \brief (NVMCTRL) SW4 Base Address */ +#define NVMCTRL_SW5 (0x008000D0) /**< \brief (NVMCTRL) SW5 Base Address */ +#define NVMCTRL_SW6 (0x008000E0) /**< \brief (NVMCTRL) SW6 Base Address */ +#define NVMCTRL_SW7 (0x008000F0) /**< \brief (NVMCTRL) SW7 Base Address */ +#define NVMCTRL_TEMP_LOG (0x00800100) /**< \brief (NVMCTRL) TEMP_LOG Base Address */ +#define NVMCTRL_TEMP_LOG_W0 (0x00800100) /**< \brief (NVMCTRL) TEMP_LOG_W0 Base Address */ +#define NVMCTRL_TEMP_LOG_W1 (0x00800110) /**< \brief (NVMCTRL) TEMP_LOG_W1 Base Address */ +#define NVMCTRL_TEMP_LOG_W2 (0x00800120) /**< \brief (NVMCTRL) TEMP_LOG_W2 Base Address */ +#define NVMCTRL_TEMP_LOG_W3 (0x00800130) /**< \brief (NVMCTRL) TEMP_LOG_W3 Base Address */ +#define NVMCTRL_TEMP_LOG_W4 (0x00800140) /**< \brief (NVMCTRL) TEMP_LOG_W4 Base Address */ +#define NVMCTRL_TEMP_LOG_W5 (0x00800150) /**< \brief (NVMCTRL) TEMP_LOG_W5 Base Address */ +#define NVMCTRL_TEMP_LOG_W6 (0x00800160) /**< \brief (NVMCTRL) TEMP_LOG_W6 Base Address */ +#define NVMCTRL_TEMP_LOG_W7 (0x00800170) /**< \brief (NVMCTRL) TEMP_LOG_W7 Base Address */ +#define NVMCTRL_TLATCH (0x00802000) /**< \brief (NVMCTRL) TLATCH Base Address */ +#define NVMCTRL_USER (0x00804000) /**< \brief (NVMCTRL) USER Base Address */ +#define OSCCTRL (0x40001000) /**< \brief (OSCCTRL) APB Base Address */ +#define OSC32KCTRL (0x40001400) /**< \brief (OSC32KCTRL) APB Base Address */ +#define PAC (0x40000000) /**< \brief (PAC) APB Base Address */ +#define PCC (0x43002C00) /**< \brief (PCC) APB Base Address */ +#define PDEC (0x42001C00) /**< \brief (PDEC) APB Base Address */ +#define PM (0x40000400) /**< \brief (PM) APB Base Address */ +#define PORT (0x41008000) /**< \brief (PORT) APB Base Address */ +#define PUKCC (0x42003000) /**< \brief (PUKCC) APB Base Address */ +#define PUKCC_AHB (0x02000000) /**< \brief (PUKCC) AHB Base Address */ +#define QSPI (0x42003400) /**< \brief (QSPI) APB Base Address */ +#define QSPI_AHB (0x04000000) /**< \brief (QSPI) AHB Base Address */ +#define RAMECC (0x41020000) /**< \brief (RAMECC) APB Base Address */ +#define RSTC (0x40000C00) /**< \brief (RSTC) APB Base Address */ +#define RTC (0x40002400) /**< \brief (RTC) APB Base Address */ +#define SDHC0 (0x45000000) /**< \brief (SDHC0) AHB Base Address */ +#define SERCOM0 (0x40003000) /**< \brief (SERCOM0) APB Base Address */ +#define SERCOM1 (0x40003400) /**< \brief (SERCOM1) APB Base Address */ +#define SERCOM2 (0x41012000) /**< \brief (SERCOM2) APB Base Address */ +#define SERCOM3 (0x41014000) /**< \brief (SERCOM3) APB Base Address */ +#define SERCOM4 (0x43000000) /**< \brief (SERCOM4) APB Base Address */ +#define SERCOM5 (0x43000400) /**< \brief (SERCOM5) APB Base Address */ +#define SUPC (0x40001800) /**< \brief (SUPC) APB Base Address */ +#define TAL (0x4101E000) /**< \brief (TAL) APB Base Address */ +#define TC0 (0x40003800) /**< \brief (TC0) APB Base Address */ +#define TC1 (0x40003C00) /**< \brief (TC1) APB Base Address */ +#define TC2 (0x4101A000) /**< \brief (TC2) APB Base Address */ +#define TC3 (0x4101C000) /**< \brief (TC3) APB Base Address */ +#define TC4 (0x42001400) /**< \brief (TC4) APB Base Address */ +#define TC5 (0x42001800) /**< \brief (TC5) APB Base Address */ +#define TCC0 (0x41016000) /**< \brief (TCC0) APB Base Address */ +#define TCC1 (0x41018000) /**< \brief (TCC1) APB Base Address */ +#define TCC2 (0x42000C00) /**< \brief (TCC2) APB Base Address */ +#define TCC3 (0x42001000) /**< \brief (TCC3) APB Base Address */ +#define TCC4 (0x43001000) /**< \brief (TCC4) APB Base Address */ +#define TRNG (0x42002800) /**< \brief (TRNG) APB Base Address */ +#define USB (0x41000000) /**< \brief (USB) APB Base Address */ +#define WDT (0x40002000) /**< \brief (WDT) APB Base Address */ +#else +#define AC ((Ac *)0x42002000UL) /**< \brief (AC) APB Base Address */ +#define AC_INST_NUM 1 /**< \brief (AC) Number of instances */ +#define AC_INSTS { AC } /**< \brief (AC) Instances List */ + +#define ADC0 ((Adc *)0x43001C00UL) /**< \brief (ADC0) APB Base Address */ +#define ADC1 ((Adc *)0x43002000UL) /**< \brief (ADC1) APB Base Address */ +#define ADC_INST_NUM 2 /**< \brief (ADC) Number of instances */ +#define ADC_INSTS { ADC0, ADC1 } /**< \brief (ADC) Instances List */ + +#define AES ((Aes *)0x42002400UL) /**< \brief (AES) APB Base Address */ +#define AES_INST_NUM 1 /**< \brief (AES) Number of instances */ +#define AES_INSTS { AES } /**< \brief (AES) Instances List */ + +#define CCL ((Ccl *)0x42003800UL) /**< \brief (CCL) APB Base Address */ +#define CCL_INST_NUM 1 /**< \brief (CCL) Number of instances */ +#define CCL_INSTS { CCL } /**< \brief (CCL) Instances List */ + +#define CMCC ((Cmcc *)0x41006000UL) /**< \brief (CMCC) APB Base Address */ +#define CMCC_AHB (0x03000000UL) /**< \brief (CMCC) AHB Base Address */ +#define CMCC_INST_NUM 1 /**< \brief (CMCC) Number of instances */ +#define CMCC_INSTS { CMCC } /**< \brief (CMCC) Instances List */ + +#define DAC ((Dac *)0x43002400UL) /**< \brief (DAC) APB Base Address */ +#define DAC_INST_NUM 1 /**< \brief (DAC) Number of instances */ +#define DAC_INSTS { DAC } /**< \brief (DAC) Instances List */ + +#define DMAC ((Dmac *)0x4100A000UL) /**< \brief (DMAC) APB Base Address */ +#define DMAC_INST_NUM 1 /**< \brief (DMAC) Number of instances */ +#define DMAC_INSTS { DMAC } /**< \brief (DMAC) Instances List */ + +#define DSU ((Dsu *)0x41002000UL) /**< \brief (DSU) APB Base Address */ +#define DSU_INST_NUM 1 /**< \brief (DSU) Number of instances */ +#define DSU_INSTS { DSU } /**< \brief (DSU) Instances List */ + +#define EIC ((Eic *)0x40002800UL) /**< \brief (EIC) APB Base Address */ +#define EIC_INST_NUM 1 /**< \brief (EIC) Number of instances */ +#define EIC_INSTS { EIC } /**< \brief (EIC) Instances List */ + +#define EVSYS ((Evsys *)0x4100E000UL) /**< \brief (EVSYS) APB Base Address */ +#define EVSYS_INST_NUM 1 /**< \brief (EVSYS) Number of instances */ +#define EVSYS_INSTS { EVSYS } /**< \brief (EVSYS) Instances List */ + +#define FREQM ((Freqm *)0x40002C00UL) /**< \brief (FREQM) APB Base Address */ +#define FREQM_INST_NUM 1 /**< \brief (FREQM) Number of instances */ +#define FREQM_INSTS { FREQM } /**< \brief (FREQM) Instances List */ + +#define GCLK ((Gclk *)0x40001C00UL) /**< \brief (GCLK) APB Base Address */ +#define GCLK_INST_NUM 1 /**< \brief (GCLK) Number of instances */ +#define GCLK_INSTS { GCLK } /**< \brief (GCLK) Instances List */ + +#define HMATRIX ((Hmatrixb *)0x4100C000UL) /**< \brief (HMATRIX) APB Base Address */ +#define HMATRIXB_INST_NUM 1 /**< \brief (HMATRIXB) Number of instances */ +#define HMATRIXB_INSTS { HMATRIX } /**< \brief (HMATRIXB) Instances List */ + +#define ICM ((Icm *)0x42002C00UL) /**< \brief (ICM) APB Base Address */ +#define ICM_INST_NUM 1 /**< \brief (ICM) Number of instances */ +#define ICM_INSTS { ICM } /**< \brief (ICM) Instances List */ + +#define I2S ((I2s *)0x43002800UL) /**< \brief (I2S) APB Base Address */ +#define I2S_INST_NUM 1 /**< \brief (I2S) Number of instances */ +#define I2S_INSTS { I2S } /**< \brief (I2S) Instances List */ + +#define MCLK ((Mclk *)0x40000800UL) /**< \brief (MCLK) APB Base Address */ +#define MCLK_INST_NUM 1 /**< \brief (MCLK) Number of instances */ +#define MCLK_INSTS { MCLK } /**< \brief (MCLK) Instances List */ + +#define NVMCTRL ((Nvmctrl *)0x41004000UL) /**< \brief (NVMCTRL) APB Base Address */ +#define NVMCTRL_CB (0x00800000UL) /**< \brief (NVMCTRL) CB Base Address */ +#define NVMCTRL_CBW0 (0x00800000UL) /**< \brief (NVMCTRL) CBW0 Base Address */ +#define NVMCTRL_CBW1 (0x00800010UL) /**< \brief (NVMCTRL) CBW1 Base Address */ +#define NVMCTRL_CBW2 (0x00800020UL) /**< \brief (NVMCTRL) CBW2 Base Address */ +#define NVMCTRL_CBW3 (0x00800030UL) /**< \brief (NVMCTRL) CBW3 Base Address */ +#define NVMCTRL_CBW4 (0x00800040UL) /**< \brief (NVMCTRL) CBW4 Base Address */ +#define NVMCTRL_CBW5 (0x00800050UL) /**< \brief (NVMCTRL) CBW5 Base Address */ +#define NVMCTRL_CBW6 (0x00800060UL) /**< \brief (NVMCTRL) CBW6 Base Address */ +#define NVMCTRL_CBW7 (0x00800070UL) /**< \brief (NVMCTRL) CBW7 Base Address */ +#define NVMCTRL_FS (0x00806000UL) /**< \brief (NVMCTRL) FS Base Address */ +#define NVMCTRL_SW0 (0x00800080UL) /**< \brief (NVMCTRL) SW0 Base Address */ +#define NVMCTRL_SW1 (0x00800090UL) /**< \brief (NVMCTRL) SW1 Base Address */ +#define NVMCTRL_SW2 (0x008000A0UL) /**< \brief (NVMCTRL) SW2 Base Address */ +#define NVMCTRL_SW3 (0x008000B0UL) /**< \brief (NVMCTRL) SW3 Base Address */ +#define NVMCTRL_SW4 (0x008000C0UL) /**< \brief (NVMCTRL) SW4 Base Address */ +#define NVMCTRL_SW5 (0x008000D0UL) /**< \brief (NVMCTRL) SW5 Base Address */ +#define NVMCTRL_SW6 (0x008000E0UL) /**< \brief (NVMCTRL) SW6 Base Address */ +#define NVMCTRL_SW7 (0x008000F0UL) /**< \brief (NVMCTRL) SW7 Base Address */ +#define NVMCTRL_TEMP_LOG (0x00800100UL) /**< \brief (NVMCTRL) TEMP_LOG Base Address */ +#define NVMCTRL_TEMP_LOG_W0 (0x00800100UL) /**< \brief (NVMCTRL) TEMP_LOG_W0 Base Address */ +#define NVMCTRL_TEMP_LOG_W1 (0x00800110UL) /**< \brief (NVMCTRL) TEMP_LOG_W1 Base Address */ +#define NVMCTRL_TEMP_LOG_W2 (0x00800120UL) /**< \brief (NVMCTRL) TEMP_LOG_W2 Base Address */ +#define NVMCTRL_TEMP_LOG_W3 (0x00800130UL) /**< \brief (NVMCTRL) TEMP_LOG_W3 Base Address */ +#define NVMCTRL_TEMP_LOG_W4 (0x00800140UL) /**< \brief (NVMCTRL) TEMP_LOG_W4 Base Address */ +#define NVMCTRL_TEMP_LOG_W5 (0x00800150UL) /**< \brief (NVMCTRL) TEMP_LOG_W5 Base Address */ +#define NVMCTRL_TEMP_LOG_W6 (0x00800160UL) /**< \brief (NVMCTRL) TEMP_LOG_W6 Base Address */ +#define NVMCTRL_TEMP_LOG_W7 (0x00800170UL) /**< \brief (NVMCTRL) TEMP_LOG_W7 Base Address */ +#define NVMCTRL_TLATCH (0x00802000UL) /**< \brief (NVMCTRL) TLATCH Base Address */ +#define NVMCTRL_USER (0x00804000UL) /**< \brief (NVMCTRL) USER Base Address */ +#define NVMCTRL_INST_NUM 1 /**< \brief (NVMCTRL) Number of instances */ +#define NVMCTRL_INSTS { NVMCTRL } /**< \brief (NVMCTRL) Instances List */ + +#define OSCCTRL ((Oscctrl *)0x40001000UL) /**< \brief (OSCCTRL) APB Base Address */ +#define OSCCTRL_INST_NUM 1 /**< \brief (OSCCTRL) Number of instances */ +#define OSCCTRL_INSTS { OSCCTRL } /**< \brief (OSCCTRL) Instances List */ + +#define OSC32KCTRL ((Osc32kctrl *)0x40001400UL) /**< \brief (OSC32KCTRL) APB Base Address */ +#define OSC32KCTRL_INST_NUM 1 /**< \brief (OSC32KCTRL) Number of instances */ +#define OSC32KCTRL_INSTS { OSC32KCTRL } /**< \brief (OSC32KCTRL) Instances List */ + +#define PAC ((Pac *)0x40000000UL) /**< \brief (PAC) APB Base Address */ +#define PAC_INST_NUM 1 /**< \brief (PAC) Number of instances */ +#define PAC_INSTS { PAC } /**< \brief (PAC) Instances List */ + +#define PCC ((Pcc *)0x43002C00UL) /**< \brief (PCC) APB Base Address */ +#define PCC_INST_NUM 1 /**< \brief (PCC) Number of instances */ +#define PCC_INSTS { PCC } /**< \brief (PCC) Instances List */ + +#define PDEC ((Pdec *)0x42001C00UL) /**< \brief (PDEC) APB Base Address */ +#define PDEC_INST_NUM 1 /**< \brief (PDEC) Number of instances */ +#define PDEC_INSTS { PDEC } /**< \brief (PDEC) Instances List */ + +#define PM ((Pm *)0x40000400UL) /**< \brief (PM) APB Base Address */ +#define PM_INST_NUM 1 /**< \brief (PM) Number of instances */ +#define PM_INSTS { PM } /**< \brief (PM) Instances List */ + +#define PORT ((Port *)0x41008000UL) /**< \brief (PORT) APB Base Address */ +#define PORT_INST_NUM 1 /**< \brief (PORT) Number of instances */ +#define PORT_INSTS { PORT } /**< \brief (PORT) Instances List */ + +#define PUKCC ((void *)0x42003000UL) /**< \brief (PUKCC) APB Base Address */ +#define PUKCC_AHB ((void *)0x02000000UL) /**< \brief (PUKCC) AHB Base Address */ +#define PUKCC_INST_NUM 1 /**< \brief (PUKCC) Number of instances */ +#define PUKCC_INSTS { PUKCC } /**< \brief (PUKCC) Instances List */ + +#define QSPI ((Qspi *)0x42003400UL) /**< \brief (QSPI) APB Base Address */ +#define QSPI_AHB (0x04000000UL) /**< \brief (QSPI) AHB Base Address */ +#define QSPI_INST_NUM 1 /**< \brief (QSPI) Number of instances */ +#define QSPI_INSTS { QSPI } /**< \brief (QSPI) Instances List */ + +#define RAMECC ((Ramecc *)0x41020000UL) /**< \brief (RAMECC) APB Base Address */ +#define RAMECC_INST_NUM 1 /**< \brief (RAMECC) Number of instances */ +#define RAMECC_INSTS { RAMECC } /**< \brief (RAMECC) Instances List */ + +#define RSTC ((Rstc *)0x40000C00UL) /**< \brief (RSTC) APB Base Address */ +#define RSTC_INST_NUM 1 /**< \brief (RSTC) Number of instances */ +#define RSTC_INSTS { RSTC } /**< \brief (RSTC) Instances List */ + +#define RTC ((Rtc *)0x40002400UL) /**< \brief (RTC) APB Base Address */ +#define RTC_INST_NUM 1 /**< \brief (RTC) Number of instances */ +#define RTC_INSTS { RTC } /**< \brief (RTC) Instances List */ + +#define SDHC0 ((Sdhc *)0x45000000UL) /**< \brief (SDHC0) AHB Base Address */ +#define SDHC_INST_NUM 1 /**< \brief (SDHC) Number of instances */ +#define SDHC_INSTS { SDHC0 } /**< \brief (SDHC) Instances List */ + +#define SERCOM0 ((Sercom *)0x40003000UL) /**< \brief (SERCOM0) APB Base Address */ +#define SERCOM1 ((Sercom *)0x40003400UL) /**< \brief (SERCOM1) APB Base Address */ +#define SERCOM2 ((Sercom *)0x41012000UL) /**< \brief (SERCOM2) APB Base Address */ +#define SERCOM3 ((Sercom *)0x41014000UL) /**< \brief (SERCOM3) APB Base Address */ +#define SERCOM4 ((Sercom *)0x43000000UL) /**< \brief (SERCOM4) APB Base Address */ +#define SERCOM5 ((Sercom *)0x43000400UL) /**< \brief (SERCOM5) APB Base Address */ +#define SERCOM_INST_NUM 6 /**< \brief (SERCOM) Number of instances */ +#define SERCOM_INSTS { SERCOM0, SERCOM1, SERCOM2, SERCOM3, SERCOM4, SERCOM5 } /**< \brief (SERCOM) Instances List */ + +#define SUPC ((Supc *)0x40001800UL) /**< \brief (SUPC) APB Base Address */ +#define SUPC_INST_NUM 1 /**< \brief (SUPC) Number of instances */ +#define SUPC_INSTS { SUPC } /**< \brief (SUPC) Instances List */ + +#define TAL ((Tal *)0x4101E000UL) /**< \brief (TAL) APB Base Address */ +#define TAL_INST_NUM 1 /**< \brief (TAL) Number of instances */ +#define TAL_INSTS { TAL } /**< \brief (TAL) Instances List */ + +#define TC0 ((Tc *)0x40003800UL) /**< \brief (TC0) APB Base Address */ +#define TC1 ((Tc *)0x40003C00UL) /**< \brief (TC1) APB Base Address */ +#define TC2 ((Tc *)0x4101A000UL) /**< \brief (TC2) APB Base Address */ +#define TC3 ((Tc *)0x4101C000UL) /**< \brief (TC3) APB Base Address */ +#define TC4 ((Tc *)0x42001400UL) /**< \brief (TC4) APB Base Address */ +#define TC5 ((Tc *)0x42001800UL) /**< \brief (TC5) APB Base Address */ +#define TC_INST_NUM 6 /**< \brief (TC) Number of instances */ +#define TC_INSTS { TC0, TC1, TC2, TC3, TC4, TC5 } /**< \brief (TC) Instances List */ + +#define TCC0 ((Tcc *)0x41016000UL) /**< \brief (TCC0) APB Base Address */ +#define TCC1 ((Tcc *)0x41018000UL) /**< \brief (TCC1) APB Base Address */ +#define TCC2 ((Tcc *)0x42000C00UL) /**< \brief (TCC2) APB Base Address */ +#define TCC3 ((Tcc *)0x42001000UL) /**< \brief (TCC3) APB Base Address */ +#define TCC4 ((Tcc *)0x43001000UL) /**< \brief (TCC4) APB Base Address */ +#define TCC_INST_NUM 5 /**< \brief (TCC) Number of instances */ +#define TCC_INSTS { TCC0, TCC1, TCC2, TCC3, TCC4 } /**< \brief (TCC) Instances List */ + +#define TRNG ((Trng *)0x42002800UL) /**< \brief (TRNG) APB Base Address */ +#define TRNG_INST_NUM 1 /**< \brief (TRNG) Number of instances */ +#define TRNG_INSTS { TRNG } /**< \brief (TRNG) Instances List */ + +#define USB ((Usb *)0x41000000UL) /**< \brief (USB) APB Base Address */ +#define USB_INST_NUM 1 /**< \brief (USB) Number of instances */ +#define USB_INSTS { USB } /**< \brief (USB) Instances List */ + +#define WDT ((Wdt *)0x40002000UL) /**< \brief (WDT) APB Base Address */ +#define WDT_INST_NUM 1 /**< \brief (WDT) Number of instances */ +#define WDT_INSTS { WDT } /**< \brief (WDT) Instances List */ + +#endif /* (defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ +/*@}*/ + +/* ************************************************************************** */ +/** PORT DEFINITIONS FOR SAMD51J18A */ +/* ************************************************************************** */ +/** \defgroup SAMD51J18A_port PORT Definitions */ +/*@{*/ + +#include "pio/samd51j18a.h" +/*@}*/ + +/* ************************************************************************** */ +/** MEMORY MAPPING DEFINITIONS FOR SAMD51J18A */ +/* ************************************************************************** */ + +#define HSRAM_SIZE _UL_(0x00020000) /* 128 kB */ +#define FLASH_SIZE _UL_(0x00040000) /* 256 kB */ +#define FLASH_PAGE_SIZE 512 +#define FLASH_NB_OF_PAGES 512 +#define FLASH_USER_PAGE_SIZE 512 +#define BKUPRAM_SIZE _UL_(0x00002000) /* 8 kB */ +#define QSPI_SIZE _UL_(0x01000000) /* 16384 kB */ + +#define FLASH_ADDR _UL_(0x00000000) /**< FLASH base address */ +#define CMCC_DATARAM_ADDR _UL_(0x03000000) /**< CMCC_DATARAM base address */ +#define CMCC_DATARAM_SIZE _UL_(0x00001000) /**< CMCC_DATARAM size */ +#define CMCC_TAGRAM_ADDR _UL_(0x03001000) /**< CMCC_TAGRAM base address */ +#define CMCC_TAGRAM_SIZE _UL_(0x00000400) /**< CMCC_TAGRAM size */ +#define CMCC_VALIDRAM_ADDR _UL_(0x03002000) /**< CMCC_VALIDRAM base address */ +#define CMCC_VALIDRAM_SIZE _UL_(0x00000040) /**< CMCC_VALIDRAM size */ +#define HSRAM_ADDR _UL_(0x20000000) /**< HSRAM base address */ +#define HSRAM_ETB_ADDR _UL_(0x20000000) /**< HSRAM_ETB base address */ +#define HSRAM_ETB_SIZE _UL_(0x00008000) /**< HSRAM_ETB size */ +#define HSRAM_RET1_ADDR _UL_(0x20000000) /**< HSRAM_RET1 base address */ +#define HSRAM_RET1_SIZE _UL_(0x00008000) /**< HSRAM_RET1 size */ +#define HPB0_ADDR _UL_(0x40000000) /**< HPB0 base address */ +#define HPB1_ADDR _UL_(0x41000000) /**< HPB1 base address */ +#define HPB2_ADDR _UL_(0x42000000) /**< HPB2 base address */ +#define HPB3_ADDR _UL_(0x43000000) /**< HPB3 base address */ +#define SEEPROM_ADDR _UL_(0x44000000) /**< SEEPROM base address */ +#define BKUPRAM_ADDR _UL_(0x47000000) /**< BKUPRAM base address */ +#define PPB_ADDR _UL_(0xE0000000) /**< PPB base address */ + +#define DSU_DID_RESETVALUE _UL_(0x60060006) +#define ADC0_TOUCH_LINES_NUM 32 +#define PORT_GROUPS 2 + +/* ************************************************************************** */ +/** ELECTRICAL DEFINITIONS FOR SAMD51J18A */ +/* ************************************************************************** */ + + +#ifdef __cplusplus +} +#endif + +/*@}*/ + +#endif /* SAMD51J18A_H */ diff --git a/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/system_samd51.h b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/system_samd51.h new file mode 100644 index 000000000..cfbd2b921 --- /dev/null +++ b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include/system_samd51.h @@ -0,0 +1,48 @@ +/** + * \file + * + * \brief Low-level initialization functions called upon chip startup + * + * Copyright (c) 2017 Microchip Technology Inc. + * + * \asf_license_start + * + * \page License + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 Licence 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. + * + * \asf_license_stop + * + */ + +#ifndef _SYSTEM_SAMD51_H_INCLUDED_ +#define _SYSTEM_SAMD51_H_INCLUDED_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +extern uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock) */ + +void SystemInit(void); +void SystemCoreClockUpdate(void); + +#ifdef __cplusplus +} +#endif + +#endif /* SYSTEM_SAMD51_H_INCLUDED */ diff --git a/tmk_core/arm_atsam.mk b/tmk_core/arm_atsam.mk new file mode 100644 index 000000000..ef412d59d --- /dev/null +++ b/tmk_core/arm_atsam.mk @@ -0,0 +1,56 @@ +# Hey Emacs, this is a -*- makefile -*- +############################################################################## +# Compiler settings +# +CC = arm-none-eabi-gcc +OBJCOPY = arm-none-eabi-objcopy +OBJDUMP = arm-none-eabi-objdump +SIZE = arm-none-eabi-size +AR = arm-none-eabi-ar rcs +NM = arm-none-eabi-nm +HEX = $(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock -R .signature +EEP = $(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) +BIN = + +COMMON_VPATH += $(LIB_PATH)/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/include +COMMON_VPATH += $(LIB_PATH)/arm_atsam/packs/arm/cmsis/5.0.1/CMSIS/Include + +COMPILEFLAGS += -funsigned-char +COMPILEFLAGS += -funsigned-bitfields +COMPILEFLAGS += -ffunction-sections +COMPILEFLAGS += -fshort-enums +COMPILEFLAGS += -fno-inline-small-functions +COMPILEFLAGS += -fno-strict-aliasing +COMPILEFLAGS += -mfloat-abi=hard +COMPILEFLAGS += -mfpu=fpv4-sp-d16 +COMPILEFLAGS += -mthumb + +#ALLOW_WARNINGS = yes + +CFLAGS += $(COMPILEFLAGS) + +CPPFLAGS += $(COMPILEFLAGS) +CPPFLAGS += -fno-exceptions -std=c++11 + +LDFLAGS +=-Wl,--gc-sections +LDFLAGS += -Wl,-Map="%OUT%%PROJ_NAME%.map" +LDFLAGS += -Wl,--start-group +LDFLAGS += -Wl,--end-group +LDFLAGS += -Wl,--gc-sections +LDFLAGS += -T$(LIB_PATH)/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/gcc/gcc/samd51j18a_flash.ld + +OPT_DEFS += -DPROTOCOL_ARM_ATSAM + +MCUFLAGS = -mcpu=$(MCU) +MCUFLAGS += -D__$(ARM_ATSAM)__ + +# List any extra directories to look for libraries here. +# Each directory must be seperated by a space. +# Use forward slashes for directory separators. +# For a directory that has spaces, enclose it in quotes. +EXTRALIBDIRS = + +# Convert hex to bin. +bin: $(BUILD_DIR)/$(TARGET).hex + $(OBJCOPY) -Iihex -Obinary $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).bin + $(COPY) $(BUILD_DIR)/$(TARGET).bin $(TARGET).bin; diff --git a/tmk_core/common.mk b/tmk_core/common.mk index 3e407f157..fd91d29dc 100644 --- a/tmk_core/common.mk +++ b/tmk_core/common.mk @@ -3,6 +3,8 @@ ifeq ($(PLATFORM),AVR) PLATFORM_COMMON_DIR = $(COMMON_DIR)/avr else ifeq ($(PLATFORM),CHIBIOS) PLATFORM_COMMON_DIR = $(COMMON_DIR)/chibios +else ifeq ($(PLATFORM),ARM_ATSAM) + PLATFORM_COMMON_DIR = $(COMMON_DIR)/arm_atsam else PLATFORM_COMMON_DIR = $(COMMON_DIR)/test endif @@ -35,6 +37,10 @@ ifeq ($(PLATFORM),CHIBIOS) endif endif +ifeq ($(PLATFORM),ARM_ATSAM) + TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom.c +endif + ifeq ($(PLATFORM),TEST) TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom.c endif diff --git a/tmk_core/common/arm_atsam/bootloader.c b/tmk_core/common/arm_atsam/bootloader.c new file mode 100644 index 000000000..5155d9ff0 --- /dev/null +++ b/tmk_core/common/arm_atsam/bootloader.c @@ -0,0 +1,19 @@ +/* Copyright 2017 Fred Sundvik + * + * 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 . + */ + +#include "bootloader.h" + +void bootloader_jump(void) {} diff --git a/tmk_core/common/arm_atsam/eeprom.c b/tmk_core/common/arm_atsam/eeprom.c new file mode 100644 index 000000000..61cc039ef --- /dev/null +++ b/tmk_core/common/arm_atsam/eeprom.c @@ -0,0 +1,98 @@ +/* Copyright 2017 Fred Sundvik + * + * 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 . + */ + +#include "eeprom.h" + +#define EEPROM_SIZE 32 + +static uint8_t buffer[EEPROM_SIZE]; + +uint8_t eeprom_read_byte(const uint8_t *addr) { + uintptr_t offset = (uintptr_t)addr; + return buffer[offset]; +} + +void eeprom_write_byte(uint8_t *addr, uint8_t value) { + uintptr_t offset = (uintptr_t)addr; + buffer[offset] = value; +} + +uint16_t eeprom_read_word(const uint16_t *addr) { + const uint8_t *p = (const uint8_t *)addr; + return eeprom_read_byte(p) | (eeprom_read_byte(p+1) << 8); +} + +uint32_t eeprom_read_dword(const uint32_t *addr) { + const uint8_t *p = (const uint8_t *)addr; + return eeprom_read_byte(p) | (eeprom_read_byte(p+1) << 8) + | (eeprom_read_byte(p+2) << 16) | (eeprom_read_byte(p+3) << 24); +} + +void eeprom_read_block(void *buf, const void *addr, uint32_t len) { + const uint8_t *p = (const uint8_t *)addr; + uint8_t *dest = (uint8_t *)buf; + while (len--) { + *dest++ = eeprom_read_byte(p++); + } +} + +void eeprom_write_word(uint16_t *addr, uint16_t value) { + uint8_t *p = (uint8_t *)addr; + eeprom_write_byte(p++, value); + eeprom_write_byte(p, value >> 8); +} + +void eeprom_write_dword(uint32_t *addr, uint32_t value) { + uint8_t *p = (uint8_t *)addr; + eeprom_write_byte(p++, value); + eeprom_write_byte(p++, value >> 8); + eeprom_write_byte(p++, value >> 16); + eeprom_write_byte(p, value >> 24); +} + +void eeprom_write_block(const void *buf, void *addr, uint32_t len) { + uint8_t *p = (uint8_t *)addr; + const uint8_t *src = (const uint8_t *)buf; + while (len--) { + eeprom_write_byte(p++, *src++); + } +} + +void eeprom_update_byte(uint8_t *addr, uint8_t value) { + eeprom_write_byte(addr, value); +} + +void eeprom_update_word(uint16_t *addr, uint16_t value) { + uint8_t *p = (uint8_t *)addr; + eeprom_write_byte(p++, value); + eeprom_write_byte(p, value >> 8); +} + +void eeprom_update_dword(uint32_t *addr, uint32_t value) { + uint8_t *p = (uint8_t *)addr; + eeprom_write_byte(p++, value); + eeprom_write_byte(p++, value >> 8); + eeprom_write_byte(p++, value >> 16); + eeprom_write_byte(p, value >> 24); +} + +void eeprom_update_block(const void *buf, void *addr, uint32_t len) { + uint8_t *p = (uint8_t *)addr; + const uint8_t *src = (const uint8_t *)buf; + while (len--) { + eeprom_write_byte(p++, *src++); + } +} diff --git a/tmk_core/common/arm_atsam/printf.h b/tmk_core/common/arm_atsam/printf.h new file mode 100644 index 000000000..582c83bf5 --- /dev/null +++ b/tmk_core/common/arm_atsam/printf.h @@ -0,0 +1,8 @@ +#ifndef _PRINTF_H_ +#define _PRINTF_H_ + +#define __xprintf dpf +int dpf(const char *_Format, ...); + +#endif //_PRINTF_H_ + diff --git a/tmk_core/common/arm_atsam/suspend.c b/tmk_core/common/arm_atsam/suspend.c new file mode 100644 index 000000000..01d1930ea --- /dev/null +++ b/tmk_core/common/arm_atsam/suspend.c @@ -0,0 +1,17 @@ +/* Copyright 2017 Fred Sundvik + * + * 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 . + */ + + diff --git a/tmk_core/common/arm_atsam/timer.c b/tmk_core/common/arm_atsam/timer.c new file mode 100644 index 000000000..bcfe5002c --- /dev/null +++ b/tmk_core/common/arm_atsam/timer.c @@ -0,0 +1,59 @@ +#include "samd51j18a.h" +#include "timer.h" +#include "tmk_core/protocol/arm_atsam/clks.h" + +void set_time(uint64_t tset) +{ + ms_clk = tset; +} + +void timer_init(void) +{ + ms_clk = 0; +} + +uint16_t timer_read(void) +{ + return (uint16_t)ms_clk; +} + +uint32_t timer_read32(void) +{ + return (uint32_t)ms_clk; +} + +uint64_t timer_read64(void) +{ + return ms_clk; +} + +uint16_t timer_elapsed(uint16_t tlast) +{ + return TIMER_DIFF_16(timer_read(), tlast); +} + +uint32_t timer_elapsed32(uint32_t tlast) +{ + return TIMER_DIFF_32(timer_read32(), tlast); +} + +uint32_t timer_elapsed64(uint32_t tlast) +{ + uint64_t tnow = timer_read64(); + return (tnow >= tlast ? tnow - tlast : UINT64_MAX - tlast + tnow); +} + +void timer_clear(void) +{ + ms_clk = 0; +} + +void wait_ms(uint64_t msec) +{ + CLK_delay_ms(msec); +} + +void wait_us(uint16_t usec) +{ + CLK_delay_us(usec); +} diff --git a/tmk_core/common/print.h b/tmk_core/common/print.h index 8836c0fc7..9cbe67bad 100644 --- a/tmk_core/common/print.h +++ b/tmk_core/common/print.h @@ -99,6 +99,34 @@ void print_set_sendchar(int8_t (*print_sendchar_func)(uint8_t)); # endif /* USER_PRINT / NORMAL PRINT */ +#elif defined(PROTOCOL_ARM_ATSAM) /* PROTOCOL_ARM_ATSAM */ + +# include "arm_atsam/printf.h" + +# ifdef USER_PRINT /* USER_PRINT */ + +// Remove normal print defines +# define print(s) +# define println(s) +# define xprintf(fmt, ...) + +// Create user print defines +# define uprintf(fmt, ...) __xprintf(fmt, ##__VA_ARGS__) +# define uprint(s) xprintf(s) +# define uprintln(s) xprintf(s "\r\n") + +# else /* NORMAL PRINT */ + +// Create user & normal print defines +# define xprintf(fmt, ...) __xprintf(fmt, ##__VA_ARGS__) +# define print(s) xprintf(s) +# define println(s) xprintf(s "\r\n") +# define uprint(s) print(s) +# define uprintln(s) println(s) +# define uprintf(fmt, ...) xprintf(fmt, ...) + +# endif /* USER_PRINT / NORMAL PRINT */ + #elif defined(__arm__) /* __arm__ */ # include "mbed/xprintf.h" @@ -130,7 +158,7 @@ void print_set_sendchar(int8_t (*print_sendchar_func)(uint8_t)); /* TODO: to select output destinations: UART/USBSerial */ # define print_set_sendchar(func) -#endif /* __AVR__ / PROTOCOL_CHIBIOS / __arm__ */ +#endif /* __AVR__ / PROTOCOL_CHIBIOS / PROTOCOL_ARM_ATSAM / __arm__ */ // User print disables the normal print messages in the body of QMK/TMK code and // is meant as a lightweight alternative to NOPRINT. Use it when you only want to do diff --git a/tmk_core/common/report.h b/tmk_core/common/report.h index 6c27eb9dc..167f38275 100644 --- a/tmk_core/common/report.h +++ b/tmk_core/common/report.h @@ -84,6 +84,11 @@ along with this program. If not, see . #define KEYBOARD_REPORT_SIZE NKRO_EPSIZE #define KEYBOARD_REPORT_KEYS (NKRO_EPSIZE - 2) #define KEYBOARD_REPORT_BITS (NKRO_EPSIZE - 1) + #elif defined(PROTOCOL_ARM_ATSAM) + #include "protocol/arm_atsam/usb/udi_device_epsize.h" + #define KEYBOARD_REPORT_SIZE NKRO_EPSIZE + #define KEYBOARD_REPORT_KEYS (NKRO_EPSIZE - 2) + #define KEYBOARD_REPORT_BITS (NKRO_EPSIZE - 1) #else #error "NKRO not supported with this protocol" #endif diff --git a/tmk_core/protocol/arm_atsam.mk b/tmk_core/protocol/arm_atsam.mk new file mode 100644 index 000000000..d535b64cd --- /dev/null +++ b/tmk_core/protocol/arm_atsam.mk @@ -0,0 +1,26 @@ +ARM_ATSAM_DIR = protocol/arm_atsam + +SRC += $(ARM_ATSAM_DIR)/adc.c +SRC += $(ARM_ATSAM_DIR)/clks.c +SRC += $(ARM_ATSAM_DIR)/d51_util.c +SRC += $(ARM_ATSAM_DIR)/i2c_master.c +SRC += $(ARM_ATSAM_DIR)/led_matrix.c +SRC += $(ARM_ATSAM_DIR)/main_arm_atsam.c +SRC += $(ARM_ATSAM_DIR)/spi.c +SRC += $(ARM_ATSAM_DIR)/startup.c + +SRC += $(ARM_ATSAM_DIR)/usb/main_usb.c +SRC += $(ARM_ATSAM_DIR)/usb/spfssf.c +SRC += $(ARM_ATSAM_DIR)/usb/udc.c +SRC += $(ARM_ATSAM_DIR)/usb/udi_cdc.c +SRC += $(ARM_ATSAM_DIR)/usb/udi_hid.c +SRC += $(ARM_ATSAM_DIR)/usb/udi_hid_kbd.c +SRC += $(ARM_ATSAM_DIR)/usb/udi_hid_kbd_desc.c +SRC += $(ARM_ATSAM_DIR)/usb/ui.c +SRC += $(ARM_ATSAM_DIR)/usb/usb2422.c +SRC += $(ARM_ATSAM_DIR)/usb/usb.c +SRC += $(ARM_ATSAM_DIR)/usb/usb_device_udd.c +SRC += $(ARM_ATSAM_DIR)/usb/usb_util.c + +# Search Path +VPATH += $(TMK_DIR)/$(ARM_ATSAM_DIR) diff --git a/tmk_core/protocol/arm_atsam/adc.c b/tmk_core/protocol/arm_atsam/adc.c new file mode 100644 index 000000000..ab77f9240 --- /dev/null +++ b/tmk_core/protocol/arm_atsam/adc.c @@ -0,0 +1,99 @@ +/* +Copyright 2018 Massdrop Inc. + +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 . +*/ + +#include "arm_atsam_protocol.h" + +uint16_t v_5v; +uint16_t v_5v_avg; +uint16_t v_con_1; +uint16_t v_con_2; +uint16_t v_con_1_boot; +uint16_t v_con_2_boot; + +void ADC0_clock_init(void) +{ + DBGC(DC_ADC0_CLOCK_INIT_BEGIN); + + MCLK->APBDMASK.bit.ADC0_ = 1; //ADC0 Clock Enable + + GCLK->PCHCTRL[ADC0_GCLK_ID].bit.GEN = GEN_OSC0; //Select generator clock + GCLK->PCHCTRL[ADC0_GCLK_ID].bit.CHEN = 1; //Enable peripheral clock + + DBGC(DC_ADC0_CLOCK_INIT_COMPLETE); +} + +void ADC0_init(void) +{ + DBGC(DC_ADC0_INIT_BEGIN); + + //MCU + PORT->Group[1].DIRCLR.reg = 1 << 0; //PB00 as input 5V + PORT->Group[1].DIRCLR.reg = 1 << 1; //PB01 as input CON2 + PORT->Group[1].DIRCLR.reg = 1 << 2; //PB02 as input CON1 + PORT->Group[1].PMUX[0].bit.PMUXE = 1; //PB00 mux select B ADC 5V + PORT->Group[1].PMUX[0].bit.PMUXO = 1; //PB01 mux select B ADC CON2 + PORT->Group[1].PMUX[1].bit.PMUXE = 1; //PB02 mux select B ADC CON1 + PORT->Group[1].PINCFG[0].bit.PMUXEN = 1; //PB01 mux ADC Enable 5V + PORT->Group[1].PINCFG[1].bit.PMUXEN = 1; //PB01 mux ADC Enable CON2 + PORT->Group[1].PINCFG[2].bit.PMUXEN = 1; //PB02 mux ADC Enable CON1 + + //ADC + ADC0->CTRLA.bit.SWRST = 1; + while (ADC0->SYNCBUSY.bit.SWRST) { DBGC(DC_ADC0_SWRST_SYNCING_1); } + while (ADC0->CTRLA.bit.SWRST) { DBGC(DC_ADC0_SWRST_SYNCING_2); } + + //Clock divide + ADC0->CTRLA.bit.PRESCALER = ADC_CTRLA_PRESCALER_DIV2_Val; + + //Averaging + ADC0->AVGCTRL.bit.SAMPLENUM = ADC_AVGCTRL_SAMPLENUM_4_Val; + while (ADC0->SYNCBUSY.bit.AVGCTRL) { DBGC(DC_ADC0_AVGCTRL_SYNCING_1); } + if (ADC0->AVGCTRL.bit.SAMPLENUM == ADC_AVGCTRL_SAMPLENUM_1_Val) ADC0->AVGCTRL.bit.ADJRES = 0; + else if (ADC0->AVGCTRL.bit.SAMPLENUM == ADC_AVGCTRL_SAMPLENUM_2_Val) ADC0->AVGCTRL.bit.ADJRES = 1; + else if (ADC0->AVGCTRL.bit.SAMPLENUM == ADC_AVGCTRL_SAMPLENUM_4_Val) ADC0->AVGCTRL.bit.ADJRES = 2; + else if (ADC0->AVGCTRL.bit.SAMPLENUM == ADC_AVGCTRL_SAMPLENUM_8_Val) ADC0->AVGCTRL.bit.ADJRES = 3; + else ADC0->AVGCTRL.bit.ADJRES = 4; + while (ADC0->SYNCBUSY.bit.AVGCTRL) { DBGC(DC_ADC0_AVGCTRL_SYNCING_2); } + + //Settling + ADC0->SAMPCTRL.bit.SAMPLEN = 45; //Sampling Time Length: 1-63, 1 ADC CLK per + while (ADC0->SYNCBUSY.bit.SAMPCTRL) { DBGC(DC_ADC0_SAMPCTRL_SYNCING_1); } + + //Load factory calibration data + ADC0->CALIB.bit.BIASCOMP = (ADC0_FUSES_BIASCOMP_ADDR >> ADC0_FUSES_BIASCOMP_Pos) & ADC0_FUSES_BIASCOMP_Msk; + ADC0->CALIB.bit.BIASR2R = (ADC0_FUSES_BIASR2R_ADDR >> ADC0_FUSES_BIASR2R_Pos) & ADC0_FUSES_BIASR2R_Msk; + ADC0->CALIB.bit.BIASREFBUF = (ADC0_FUSES_BIASREFBUF_ADDR >> ADC0_FUSES_BIASREFBUF_Pos) & ADC0_FUSES_BIASREFBUF_Msk; + + //Enable + ADC0->CTRLA.bit.ENABLE = 1; + while (ADC0->SYNCBUSY.bit.ENABLE) { DBGC(DC_ADC0_ENABLE_SYNCING_1); } + + DBGC(DC_ADC0_INIT_COMPLETE); +} + +uint16_t adc_get(uint8_t muxpos) +{ + ADC0->INPUTCTRL.bit.MUXPOS = muxpos; + while (ADC0->SYNCBUSY.bit.INPUTCTRL) {} + + ADC0->SWTRIG.bit.START = 1; + while (ADC0->SYNCBUSY.bit.SWTRIG) {} + while (!ADC0->INTFLAG.bit.RESRDY) {} + + return ADC0->RESULT.reg; +} + diff --git a/tmk_core/protocol/arm_atsam/adc.h b/tmk_core/protocol/arm_atsam/adc.h new file mode 100644 index 000000000..5a90ece3f --- /dev/null +++ b/tmk_core/protocol/arm_atsam/adc.h @@ -0,0 +1,37 @@ +/* +Copyright 2018 Massdrop Inc. + +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 . +*/ + +#ifndef _ADC_H_ +#define _ADC_H_ + +#define ADC_5V_START_LEVEL 2365 + +#define ADC_5V ADC_INPUTCTRL_MUXPOS_AIN12_Val +#define ADC_CON1 ADC_INPUTCTRL_MUXPOS_AIN14_Val +#define ADC_CON2 ADC_INPUTCTRL_MUXPOS_AIN13_Val + +extern uint16_t v_5v; +extern uint16_t v_5v_avg; +extern uint16_t v_con_1; +extern uint16_t v_con_2; +extern uint16_t v_con_1_boot; +extern uint16_t v_con_2_boot; + +void ADC0_clock_init(void); +void ADC0_init(void); + +#endif //_ADC_H_ diff --git a/tmk_core/protocol/arm_atsam/arm_atsam_protocol.h b/tmk_core/protocol/arm_atsam/arm_atsam_protocol.h new file mode 100644 index 000000000..be73beccd --- /dev/null +++ b/tmk_core/protocol/arm_atsam/arm_atsam_protocol.h @@ -0,0 +1,45 @@ +/* +Copyright 2018 Massdrop Inc. + +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 . +*/ + +#ifndef _ARM_ATSAM_PROTOCOL_H_ +#define _ARM_ATSAM_PROTOCOL_H_ + +#include "samd51j18a.h" +#include "md_bootloader.h" + +#include "d51_util.h" +#include "clks.h" +#include "adc.h" +#include "i2c_master.h" +#include "spi.h" + +#include "./usb/usb2422.h" + +#ifndef MD_BOOTLOADER + +#include "main_arm_atsam.h" +#include "led_matrix.h" +#include "issi3733_driver.h" +#include "./usb/compiler.h" +#include "./usb/udc.h" +#include "./usb/spfssf.h" +#include "./usb/udi_cdc.h" + +#endif //MD_BOOTLOADER + +#endif //_ARM_ATSAM_PROTOCOL_H_ + diff --git a/tmk_core/protocol/arm_atsam/clks.c b/tmk_core/protocol/arm_atsam/clks.c new file mode 100644 index 000000000..8768d0a99 --- /dev/null +++ b/tmk_core/protocol/arm_atsam/clks.c @@ -0,0 +1,439 @@ +/* +Copyright 2018 Massdrop Inc. + +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 . +*/ + +#include "arm_atsam_protocol.h" + +#include + +volatile clk_t system_clks; +volatile uint64_t ms_clk; + +volatile uint8_t us_delay_done; + +const uint32_t sercom_apbbase[] = {(uint32_t)SERCOM0,(uint32_t)SERCOM1,(uint32_t)SERCOM2,(uint32_t)SERCOM3,(uint32_t)SERCOM4,(uint32_t)SERCOM5}; +const uint8_t sercom_pchan[] = {7, 8, 23, 24, 34, 35}; + +#define USE_DPLL_IND 0 +#define USE_DPLL_DEF GCLK_SOURCE_DPLL0 + +void CLK_oscctrl_init(void) +{ + Oscctrl *posctrl = OSCCTRL; + Gclk *pgclk = GCLK; + + DBGC(DC_CLK_OSC_INIT_BEGIN); + + //default setup on por + system_clks.freq_dfll = FREQ_DFLL_DEFAULT; + system_clks.freq_gclk[0] = system_clks.freq_dfll; + + //configure and startup 16MHz xosc0 + posctrl->XOSCCTRL[0].bit.ENABLE = 0; + posctrl->XOSCCTRL[0].bit.STARTUP = 0xD; + posctrl->XOSCCTRL[0].bit.ENALC = 1; + posctrl->XOSCCTRL[0].bit.IMULT = 5; + posctrl->XOSCCTRL[0].bit.IPTAT = 3; + posctrl->XOSCCTRL[0].bit.ONDEMAND = 0; + posctrl->XOSCCTRL[0].bit.XTALEN = 1; + posctrl->XOSCCTRL[0].bit.ENABLE = 1; + while (posctrl->STATUS.bit.XOSCRDY0 == 0) { DBGC(DC_CLK_OSC_INIT_XOSC0_SYNC); } + system_clks.freq_xosc0 = FREQ_XOSC0; + + //configure and startup DPLL + posctrl->Dpll[USE_DPLL_IND].DPLLCTRLA.bit.ENABLE = 0; + while (posctrl->Dpll[USE_DPLL_IND].DPLLSYNCBUSY.bit.ENABLE) { DBGC(DC_CLK_OSC_INIT_DPLL_SYNC_DISABLE); } + posctrl->Dpll[USE_DPLL_IND].DPLLCTRLB.bit.REFCLK = 2; //select XOSC0 (16MHz) + posctrl->Dpll[USE_DPLL_IND].DPLLCTRLB.bit.DIV = 7; //16 MHz / (2 * (7 + 1)) = 1 MHz + posctrl->Dpll[USE_DPLL_IND].DPLLRATIO.bit.LDR = PLL_RATIO; //1 MHz * (PLL_RATIO(47) + 1) = 48MHz + while (posctrl->Dpll[USE_DPLL_IND].DPLLSYNCBUSY.bit.DPLLRATIO) { DBGC(DC_CLK_OSC_INIT_DPLL_SYNC_RATIO); } + posctrl->Dpll[USE_DPLL_IND].DPLLCTRLA.bit.ONDEMAND = 0; + posctrl->Dpll[USE_DPLL_IND].DPLLCTRLA.bit.ENABLE = 1; + while (posctrl->Dpll[USE_DPLL_IND].DPLLSYNCBUSY.bit.ENABLE) { DBGC(DC_CLK_OSC_INIT_DPLL_SYNC_ENABLE); } + while (posctrl->Dpll[USE_DPLL_IND].DPLLSTATUS.bit.LOCK == 0) { DBGC(DC_CLK_OSC_INIT_DPLL_WAIT_LOCK); } + while (posctrl->Dpll[USE_DPLL_IND].DPLLSTATUS.bit.CLKRDY == 0) { DBGC(DC_CLK_OSC_INIT_DPLL_WAIT_CLKRDY); } + system_clks.freq_dpll[0] = (system_clks.freq_xosc0 / 2 / (posctrl->Dpll[USE_DPLL_IND].DPLLCTRLB.bit.DIV + 1)) * (posctrl->Dpll[USE_DPLL_IND].DPLLRATIO.bit.LDR + 1); + + //change gclk0 to DPLL + pgclk->GENCTRL[GEN_DPLL0].bit.SRC = USE_DPLL_DEF; + while (pgclk->SYNCBUSY.bit.GENCTRL0) { DBGC(DC_CLK_OSC_INIT_GCLK_SYNC_GENCTRL0); } + + system_clks.freq_gclk[0] = system_clks.freq_dpll[0]; + + DBGC(DC_CLK_OSC_INIT_COMPLETE); +} + +//configure for 1MHz (1 usec timebase) +//call CLK_set_gclk_freq(GEN_TC45, FREQ_TC45_DEFAULT); +uint32_t CLK_set_gclk_freq(uint8_t gclkn, uint32_t freq) +{ + Gclk *pgclk = GCLK; + + DBGC(DC_CLK_SET_GCLK_FREQ_BEGIN); + + while (pgclk->SYNCBUSY.vec.GENCTRL) { DBGC(DC_CLK_SET_GCLK_FREQ_SYNC_1); } + pgclk->GENCTRL[gclkn].bit.SRC = USE_DPLL_DEF; + while (pgclk->SYNCBUSY.vec.GENCTRL) { DBGC(DC_CLK_SET_GCLK_FREQ_SYNC_2); } + pgclk->GENCTRL[gclkn].bit.DIV = (uint8_t)(system_clks.freq_dpll[0] / freq); + while (pgclk->SYNCBUSY.vec.GENCTRL) { DBGC(DC_CLK_SET_GCLK_FREQ_SYNC_3); } + pgclk->GENCTRL[gclkn].bit.DIVSEL = 0; + while (pgclk->SYNCBUSY.vec.GENCTRL) { DBGC(DC_CLK_SET_GCLK_FREQ_SYNC_4); } + pgclk->GENCTRL[gclkn].bit.GENEN = 1; + while (pgclk->SYNCBUSY.vec.GENCTRL) { DBGC(DC_CLK_SET_GCLK_FREQ_SYNC_5); } + system_clks.freq_gclk[gclkn] = system_clks.freq_dpll[0] / pgclk->GENCTRL[gclkn].bit.DIV; + + DBGC(DC_CLK_SET_GCLK_FREQ_COMPLETE); + + return system_clks.freq_gclk[gclkn]; +} + +void CLK_init_osc(void) +{ + uint8_t gclkn = GEN_OSC0; + Gclk *pgclk = GCLK; + + DBGC(DC_CLK_INIT_OSC_BEGIN); + + while (pgclk->SYNCBUSY.vec.GENCTRL) { DBGC(DC_CLK_INIT_OSC_SYNC_1); } + pgclk->GENCTRL[gclkn].bit.SRC = GCLK_SOURCE_XOSC0; + while (pgclk->SYNCBUSY.vec.GENCTRL) { DBGC(DC_CLK_INIT_OSC_SYNC_2); } + pgclk->GENCTRL[gclkn].bit.DIV = 1; + while (pgclk->SYNCBUSY.vec.GENCTRL) { DBGC(DC_CLK_INIT_OSC_SYNC_3); } + pgclk->GENCTRL[gclkn].bit.DIVSEL = 0; + while (pgclk->SYNCBUSY.vec.GENCTRL) { DBGC(DC_CLK_INIT_OSC_SYNC_4); } + pgclk->GENCTRL[gclkn].bit.GENEN = 1; + while (pgclk->SYNCBUSY.vec.GENCTRL) { DBGC(DC_CLK_INIT_OSC_SYNC_5); } + system_clks.freq_gclk[gclkn] = system_clks.freq_xosc0; + + DBGC(DC_CLK_INIT_OSC_COMPLETE); +} + +void CLK_reset_time(void) +{ + Tc *ptc4 = TC4; + Tc *ptc0 = TC0; + + ms_clk = 0; + + DBGC(DC_CLK_RESET_TIME_BEGIN); + + //stop counters + ptc4->COUNT16.CTRLA.bit.ENABLE = 0; + while (ptc4->COUNT16.SYNCBUSY.bit.ENABLE) {} + ptc0->COUNT32.CTRLA.bit.ENABLE = 0; + while (ptc0->COUNT32.SYNCBUSY.bit.ENABLE) {} + //zero counters + ptc4->COUNT16.COUNT.reg = 0; + while (ptc4->COUNT16.SYNCBUSY.bit.COUNT) {} + ptc0->COUNT32.COUNT.reg = 0; + while (ptc0->COUNT32.SYNCBUSY.bit.COUNT) {} + //start counters + ptc0->COUNT32.CTRLA.bit.ENABLE = 1; + while (ptc0->COUNT32.SYNCBUSY.bit.ENABLE) {} + ptc4->COUNT16.CTRLA.bit.ENABLE = 1; + while (ptc4->COUNT16.SYNCBUSY.bit.ENABLE) {} + + DBGC(DC_CLK_RESET_TIME_COMPLETE); +} + +void TC4_Handler() +{ + if (TC4->COUNT16.INTFLAG.bit.MC0) + { + TC4->COUNT16.INTFLAG.reg = TC_INTENCLR_MC0; + ms_clk++; + } +} + +void TC5_Handler() +{ + if (TC5->COUNT16.INTFLAG.bit.MC0) + { + TC5->COUNT16.INTFLAG.reg = TC_INTENCLR_MC0; + us_delay_done = 1; + TC5->COUNT16.CTRLA.bit.ENABLE = 0; + while (TC5->COUNT16.SYNCBUSY.bit.ENABLE) {} + } +} + +uint32_t CLK_enable_timebase(void) +{ + Gclk *pgclk = GCLK; + Mclk *pmclk = MCLK; + Tc *ptc4 = TC4; + Tc *ptc5 = TC5; + Tc *ptc0 = TC0; + Evsys *pevsys = EVSYS; + + DBGC(DC_CLK_ENABLE_TIMEBASE_BEGIN); + + //gclk2 highspeed time base + CLK_set_gclk_freq(GEN_TC45, FREQ_TC45_DEFAULT); + CLK_init_osc(); + + //unmask TC4, sourcegclk2 to TC4 + pmclk->APBCMASK.bit.TC4_ = 1; + pgclk->PCHCTRL[TC4_GCLK_ID].bit.GEN = GEN_TC45; + pgclk->PCHCTRL[TC4_GCLK_ID].bit.CHEN = 1; + + //unmask TC5 sourcegclk2 to TC5 + pmclk->APBCMASK.bit.TC5_ = 1; + pgclk->PCHCTRL[TC5_GCLK_ID].bit.GEN = GEN_TC45; + pgclk->PCHCTRL[TC5_GCLK_ID].bit.CHEN = 1; + + //configure TC4 + DBGC(DC_CLK_ENABLE_TIMEBASE_TC4_BEGIN); + ptc4->COUNT16.CTRLA.bit.ENABLE = 0; + while (ptc4->COUNT16.SYNCBUSY.bit.ENABLE) { DBGC(DC_CLK_ENABLE_TIMEBASE_TC4_SYNC_DISABLE); } + ptc4->COUNT16.CTRLA.bit.SWRST = 1; + while (ptc4->COUNT16.SYNCBUSY.bit.SWRST) { DBGC(DC_CLK_ENABLE_TIMEBASE_TC4_SYNC_SWRST_1); } + while (ptc4->COUNT16.CTRLA.bit.SWRST) { DBGC(DC_CLK_ENABLE_TIMEBASE_TC4_SYNC_SWRST_2); } + + //CTRLA defaults + //CTRLB as default, counting up + ptc4->COUNT16.CTRLBCLR.reg = 5; + while (ptc4->COUNT16.SYNCBUSY.bit.CTRLB) { DBGC(DC_CLK_ENABLE_TIMEBASE_TC4_SYNC_CLTRB); } + ptc4->COUNT16.CC[0].reg = 999; + while (ptc4->COUNT16.SYNCBUSY.bit.CC0) { DBGC(DC_CLK_ENABLE_TIMEBASE_TC4_SYNC_CC0); } + //ptc4->COUNT16.DBGCTRL.bit.DBGRUN = 1; + + //wave mode + ptc4->COUNT16.WAVE.bit.WAVEGEN = 1; //MFRQ match frequency mode, toggle each CC match + //generate event for next stage + ptc4->COUNT16.EVCTRL.bit.MCEO0 = 1; + + NVIC_EnableIRQ(TC4_IRQn); + ptc4->COUNT16.INTENSET.bit.MC0 = 1; + + DBGC(DC_CLK_ENABLE_TIMEBASE_TC4_COMPLETE); + + //configure TC5 + DBGC(DC_CLK_ENABLE_TIMEBASE_TC5_BEGIN); + ptc5->COUNT16.CTRLA.bit.ENABLE = 0; + while (ptc5->COUNT16.SYNCBUSY.bit.ENABLE) { DBGC(DC_CLK_ENABLE_TIMEBASE_TC5_SYNC_DISABLE); } + ptc5->COUNT16.CTRLA.bit.SWRST = 1; + while (ptc5->COUNT16.SYNCBUSY.bit.SWRST) { DBGC(DC_CLK_ENABLE_TIMEBASE_TC5_SYNC_SWRST_1); } + while (ptc5->COUNT16.CTRLA.bit.SWRST) { DBGC(DC_CLK_ENABLE_TIMEBASE_TC5_SYNC_SWRST_2); } + + //CTRLA defaults + //CTRLB as default, counting up + ptc5->COUNT16.CTRLBCLR.reg = 5; + while (ptc5->COUNT16.SYNCBUSY.bit.CTRLB) { DBGC(DC_CLK_ENABLE_TIMEBASE_TC5_SYNC_CLTRB); } + //ptc5->COUNT16.DBGCTRL.bit.DBGRUN = 1; + + //wave mode + ptc5->COUNT16.WAVE.bit.WAVEGEN = 1; //MFRQ match frequency mode, toggle each CC match + //generate event for next stage + ptc5->COUNT16.EVCTRL.bit.MCEO0 = 1; + + NVIC_EnableIRQ(TC5_IRQn); + ptc5->COUNT16.INTENSET.bit.MC0 = 1; + + DBGC(DC_CLK_ENABLE_TIMEBASE_TC5_COMPLETE); + + //unmask TC0,1, sourcegclk2 to TC0,1 + pmclk->APBAMASK.bit.TC0_ = 1; + pgclk->PCHCTRL[TC0_GCLK_ID].bit.GEN = GEN_TC45; + pgclk->PCHCTRL[TC0_GCLK_ID].bit.CHEN = 1; + + pmclk->APBAMASK.bit.TC1_ = 1; + pgclk->PCHCTRL[TC1_GCLK_ID].bit.GEN = GEN_TC45; + pgclk->PCHCTRL[TC1_GCLK_ID].bit.CHEN = 1; + + //configure TC0 + DBGC(DC_CLK_ENABLE_TIMEBASE_TC0_BEGIN); + ptc0->COUNT32.CTRLA.bit.ENABLE = 0; + while (ptc0->COUNT32.SYNCBUSY.bit.ENABLE) { DBGC(DC_CLK_ENABLE_TIMEBASE_TC0_SYNC_DISABLE); } + ptc0->COUNT32.CTRLA.bit.SWRST = 1; + while (ptc0->COUNT32.SYNCBUSY.bit.SWRST) { DBGC(DC_CLK_ENABLE_TIMEBASE_TC0_SYNC_SWRST_1); } + while (ptc0->COUNT32.CTRLA.bit.SWRST) { DBGC(DC_CLK_ENABLE_TIMEBASE_TC0_SYNC_SWRST_2); } + //CTRLA as default + ptc0->COUNT32.CTRLA.bit.MODE = 2; //32 bit mode + ptc0->COUNT32.EVCTRL.bit.TCEI = 1; //enable incoming events + ptc0->COUNT32.EVCTRL.bit.EVACT = 2 ; //count events + + DBGC(DC_CLK_ENABLE_TIMEBASE_TC0_COMPLETE); + + DBGC(DC_CLK_ENABLE_TIMEBASE_EVSYS_BEGIN); + + //configure event system + pmclk->APBBMASK.bit.EVSYS_ = 1; + pgclk->PCHCTRL[EVSYS_GCLK_ID_0].bit.GEN = GEN_TC45; + pgclk->PCHCTRL[EVSYS_GCLK_ID_0].bit.CHEN = 1; + pevsys->USER[44].reg = EVSYS_ID_USER_PORT_EV_0; //TC0 will get event channel 0 + pevsys->Channel[0].CHANNEL.bit.EDGSEL = EVSYS_CHANNEL_EDGSEL_RISING_EDGE_Val; //Rising edge + pevsys->Channel[0].CHANNEL.bit.PATH = EVSYS_CHANNEL_PATH_SYNCHRONOUS_Val; //Synchronous + pevsys->Channel[0].CHANNEL.bit.EVGEN = EVSYS_ID_GEN_TC4_MCX_0; //TC4 MC0 + + DBGC(DC_CLK_ENABLE_TIMEBASE_EVSYS_COMPLETE); + + CLK_reset_time(); + + ADC0_clock_init(); + + DBGC(DC_CLK_ENABLE_TIMEBASE_COMPLETE); + + return 0; +} + +uint32_t CLK_get_ms(void) +{ + return ms_clk; +} + +void CLK_delay_us(uint16_t usec) +{ + us_delay_done = 0; + + if (TC5->COUNT16.CTRLA.bit.ENABLE) + { + TC5->COUNT16.CTRLA.bit.ENABLE = 0; + while (TC5->COUNT16.SYNCBUSY.bit.ENABLE) {} + } + + if (usec < 10) usec = 0; + else usec -= 10; + + TC5->COUNT16.CC[0].reg = usec; + while (TC5->COUNT16.SYNCBUSY.bit.CC0) {} + + TC5->COUNT16.CTRLA.bit.ENABLE = 1; + while (TC5->COUNT16.SYNCBUSY.bit.ENABLE) {} + + while (!us_delay_done) {} +} + +void CLK_delay_ms(uint64_t msec) +{ + msec += CLK_get_ms(); + while (msec > CLK_get_ms()) {} +} + +void clk_enable_sercom_apbmask(int sercomn) +{ + Mclk *pmclk = MCLK; + switch (sercomn) + { + case 0: + pmclk->APBAMASK.bit.SERCOM0_ = 1; + break; + case 1: + pmclk->APBAMASK.bit.SERCOM1_ = 1; + break; + case 2: + pmclk->APBBMASK.bit.SERCOM2_ = 1; + break; + case 3: + pmclk->APBBMASK.bit.SERCOM3_ = 1; + break; + default: + break; + } +} + +//call CLK_oscctrl_init first +//call CLK_set_spi_freq(CHAN_SERCOM_SPI, FREQ_SPI_DEFAULT); +uint32_t CLK_set_spi_freq(uint8_t sercomn, uint32_t freq) +{ + DBGC(DC_CLK_SET_SPI_FREQ_BEGIN); + + Gclk *pgclk = GCLK; + Sercom *psercom = (Sercom *)sercom_apbbase[sercomn]; + clk_enable_sercom_apbmask(sercomn); + + //all gclk0 for now + pgclk->PCHCTRL[sercom_pchan[sercomn]].bit.GEN = 0; + pgclk->PCHCTRL[sercom_pchan[sercomn]].bit.CHEN = 1; + + psercom->I2CM.CTRLA.bit.SWRST = 1; + while (psercom->I2CM.SYNCBUSY.bit.SWRST) {} + while (psercom->I2CM.CTRLA.bit.SWRST) {} + + psercom->SPI.BAUD.reg = (uint8_t) (system_clks.freq_gclk[0]/2/freq-1); + system_clks.freq_spi = system_clks.freq_gclk[0]/2/(psercom->SPI.BAUD.reg+1); + system_clks.freq_sercom[sercomn] = system_clks.freq_spi; + + DBGC(DC_CLK_SET_SPI_FREQ_COMPLETE); + + return system_clks.freq_spi; +} + +//call CLK_oscctrl_init first +//call CLK_set_i2c0_freq(CHAN_SERCOM_I2C0, FREQ_I2C0_DEFAULT); +uint32_t CLK_set_i2c0_freq(uint8_t sercomn, uint32_t freq) +{ + DBGC(DC_CLK_SET_I2C0_FREQ_BEGIN); + + Gclk *pgclk = GCLK; + Sercom *psercom = (Sercom *)sercom_apbbase[sercomn]; + clk_enable_sercom_apbmask(sercomn); + + //all gclk0 for now + pgclk->PCHCTRL[sercom_pchan[sercomn]].bit.GEN = 0; + pgclk->PCHCTRL[sercom_pchan[sercomn]].bit.CHEN = 1; + + psercom->I2CM.CTRLA.bit.SWRST = 1; + while (psercom->I2CM.SYNCBUSY.bit.SWRST) {} + while (psercom->I2CM.CTRLA.bit.SWRST) {} + + psercom->I2CM.BAUD.bit.BAUD = (uint8_t) (system_clks.freq_gclk[0]/2/freq-1); + system_clks.freq_i2c0 = system_clks.freq_gclk[0]/2/(psercom->I2CM.BAUD.bit.BAUD+1); + system_clks.freq_sercom[sercomn] = system_clks.freq_i2c0; + + DBGC(DC_CLK_SET_I2C0_FREQ_COMPLETE); + + return system_clks.freq_i2c0; +} + +//call CLK_oscctrl_init first +//call CLK_set_i2c1_freq(CHAN_SERCOM_I2C1, FREQ_I2C1_DEFAULT); +uint32_t CLK_set_i2c1_freq(uint8_t sercomn, uint32_t freq) +{ + DBGC(DC_CLK_SET_I2C1_FREQ_BEGIN); + + Gclk *pgclk = GCLK; + Sercom *psercom = (Sercom *)sercom_apbbase[sercomn]; + clk_enable_sercom_apbmask(sercomn); + + //all gclk0 for now + pgclk->PCHCTRL[sercom_pchan[sercomn]].bit.GEN = 0; + pgclk->PCHCTRL[sercom_pchan[sercomn]].bit.CHEN = 1; + + psercom->I2CM.CTRLA.bit.SWRST = 1; + while (psercom->I2CM.SYNCBUSY.bit.SWRST) {} + while (psercom->I2CM.CTRLA.bit.SWRST) {} + + psercom->I2CM.BAUD.bit.BAUD = (uint8_t) (system_clks.freq_gclk[0]/2/freq-10); + system_clks.freq_i2c1 = system_clks.freq_gclk[0]/2/(psercom->I2CM.BAUD.bit.BAUD+10); + system_clks.freq_sercom[sercomn] = system_clks.freq_i2c1; + + DBGC(DC_CLK_SET_I2C1_FREQ_COMPLETE); + + return system_clks.freq_i2c1; +} + +void CLK_init(void) +{ + DBGC(DC_CLK_INIT_BEGIN); + + memset((void *)&system_clks,0,sizeof(system_clks)); + + CLK_oscctrl_init(); + CLK_enable_timebase(); + + DBGC(DC_CLK_INIT_COMPLETE); +} + diff --git a/tmk_core/protocol/arm_atsam/clks.h b/tmk_core/protocol/arm_atsam/clks.h new file mode 100644 index 000000000..96819bfdd --- /dev/null +++ b/tmk_core/protocol/arm_atsam/clks.h @@ -0,0 +1,90 @@ +/* +Copyright 2018 Massdrop Inc. + +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 . +*/ + +#ifndef _CLKS_H_ +#define _CLKS_H_ + +#ifndef MD_BOOTLOADER + +//From keyboard +#include "config_led.h" +#include "config.h" + +#endif //MD_BOOTLOADER + +#define PLL_RATIO 47 //mcu frequency ((X+1)MHz) +#define FREQ_DFLL_DEFAULT 48000000 //DFLL frequency / usb clock +#define FREQ_SPI_DEFAULT 1000000 //spi to 595 shift regs +#define FREQ_I2C0_DEFAULT 100000 //i2c to hub +#define FREQ_I2C1_DEFAULT I2C_HZ //i2c to LED drivers +#define FREQ_TC45_DEFAULT 1000000 //1 usec resolution + +//I2C1 Set ~Result PWM Time (2x Drivers) +// 1000000 1090000 +// 900000 1000000 3.82ms +// 800000 860000 +// 700000 750000 +// 600000 630000 +// 580000 615000 6.08ms +// 500000 522000 + +#define FREQ_XOSC0 16000000 + +#define CHAN_SERCOM_SPI 2 //shift regs +#define CHAN_SERCOM_I2C0 0 //hub +#define CHAN_SERCOM_I2C1 1 //led drivers +#define CHAN_SERCOM_UART 3 //debug util + +//Generator clock channels +#define GEN_DPLL0 0 +#define GEN_OSC0 1 +#define GEN_TC45 2 + +#define SERCOM_COUNT 5 +#define GCLK_COUNT 12 + +typedef struct clk_s { + uint32_t freq_dfll; + uint32_t freq_dpll[2]; + uint32_t freq_sercom[SERCOM_COUNT]; + uint32_t freq_gclk[GCLK_COUNT]; + uint32_t freq_xosc0; + uint32_t freq_spi; + uint32_t freq_i2c0; + uint32_t freq_i2c1; + uint32_t freq_uart; + uint32_t freq_adc0; +} clk_t; + +extern volatile clk_t system_clks; +extern volatile uint64_t ms_clk; + +void CLK_oscctrl_init(void); +void CLK_reset_time(void); +uint32_t CLK_set_gclk_freq(uint8_t gclkn, uint32_t freq); +uint32_t CLK_enable_timebase(void); +uint32_t CLK_get_ms(void); +uint64_t CLK_get_us(void); +void CLK_delay_us(uint16_t usec); +void CLK_delay_ms(uint64_t msec); + +uint32_t CLK_set_spi_freq(uint8_t sercomn, uint32_t freq); +uint32_t CLK_set_i2c0_freq(uint8_t sercomn, uint32_t freq); +uint32_t CLK_set_i2c1_freq(uint8_t sercomn, uint32_t freq); +void CLK_init(void); + +#endif // _CLKS_H_ diff --git a/tmk_core/protocol/arm_atsam/d51_util.c b/tmk_core/protocol/arm_atsam/d51_util.c new file mode 100644 index 000000000..91b58757c --- /dev/null +++ b/tmk_core/protocol/arm_atsam/d51_util.c @@ -0,0 +1,165 @@ +#include "d51_util.h" + +//Display unsigned 32-bit number through m15 +//Read as follows: 1230 = || ||| |||| | (note always ending toggle) +void m15_print(uint32_t x) +{ + int8_t t; + uint32_t n; + uint32_t p, p2; + + if (x < 10) t = 0; + else if (x < 100) t = 1; + else if (x < 1000) t = 2; + else if (x < 10000) t = 3; + else if (x < 100000) t = 4; + else if (x < 1000000) t = 5; + else if (x < 10000000) t = 6; + else if (x < 100000000) t = 7; + else if (x < 1000000000) t = 8; + else t = 9; + + while (t >= 0) + { + p2 = t; + p = 1; + while (p2--) p *= 10; + n = x / p; + x -= n * p; + while (n > 0) + { + m15_on; + n--; + m15_off; + } + //Will always end with an extra toggle + m15_on; + t--; + m15_off; + } +} + +//Display unsigned 32-bit number through debug led +//Read as follows: 1230 = [*] [* *] [* * *] [**] (note zero is fast double flash) +#define DLED_ONTIME 600000 +#define DLED_PAUSE 1000000 +volatile uint32_t w; +void dled_print(uint32_t x, uint8_t long_pause) +{ + int8_t t; + uint32_t n; + uint32_t p, p2; + + if (x < 10) t = 0; + else if (x < 100) t = 1; + else if (x < 1000) t = 2; + else if (x < 10000) t = 3; + else if (x < 100000) t = 4; + else if (x < 1000000) t = 5; + else if (x < 10000000) t = 6; + else if (x < 100000000) t = 7; + else if (x < 1000000000) t = 8; + else t = 9; + + while (t >= 0) + { + p2 = t; + p = 1; + while (p2--) p *= 10; + n = x / p; + x -= n * p; + if (!n) + { + led_on; + for (w = DLED_ONTIME / 4; w; w--); + led_off; + for (w = DLED_ONTIME / 4; w; w--); + led_on; + for (w = DLED_ONTIME / 4; w; w--); + led_off; + for (w = DLED_ONTIME / 4; w; w--); + n--; + } + else + { + while (n > 0) + { + led_on; + for (w = DLED_ONTIME; w; w--); + led_off; + for (w = DLED_ONTIME / 2; w; w--); + n--; + } + } + + for (w = DLED_PAUSE; w; w--); + t--; + } + + if (long_pause) + { + for (w = DLED_PAUSE * 4; w; w--); + } +} + +#ifdef DEBUG_BOOT_TRACING + +volatile uint32_t debug_code; + +void EIC_15_Handler() +{ + //This is only for non-functional keyboard troubleshooting and should be disabled after boot + //Intention is to lock up the keyboard here with repeating debug led code + while (1) + { + dled_print(debug_code, 1); + } +} + +void debug_code_init(void) +{ + DBGC(DC_UNSET); + + //Configure Ports for EIC on PB31 + PORT->Group[1].DIRCLR.reg = 1 << 31; //Input + PORT->Group[1].OUTSET.reg = 1 << 31; //High + PORT->Group[1].PINCFG[31].bit.INEN = 1; //Input Enable + PORT->Group[1].PINCFG[31].bit.PULLEN = 1; //Pull Enable + PORT->Group[1].PINCFG[31].bit.PMUXEN = 1; //Mux Enable + PORT->Group[1].PMUX[15].bit.PMUXO = 0; //Mux A + + //Enable CLK_EIC_APB + MCLK->APBAMASK.bit.EIC_ = 1; + + //Configure EIC + EIC->CTRLA.bit.SWRST = 1; + while (EIC->SYNCBUSY.bit.SWRST) {} + EIC->ASYNCH.reg = 1 << 15; + EIC->INTENSET.reg = 1 << 15; + EIC->CONFIG[1].bit.SENSE7 = 2; + EIC->CTRLA.bit.ENABLE = 1; + while (EIC->SYNCBUSY.bit.ENABLE) {} + + //Enable EIC IRQ + NVIC_EnableIRQ(EIC_15_IRQn); +} + +void debug_code_disable(void) +{ + //Disable EIC IRQ + NVIC_DisableIRQ(EIC_15_IRQn); + + //Disable EIC + EIC->CTRLA.bit.ENABLE = 0; + while (EIC->SYNCBUSY.bit.ENABLE) {} + + //Disable CLK_EIC_APB + MCLK->APBAMASK.bit.EIC_ = 0; +} + +#else + +void debug_code_init(void) {} +void debug_code_disable(void) {} + +#endif //DEBUG_BOOT_TRACING diff --git a/tmk_core/protocol/arm_atsam/d51_util.h b/tmk_core/protocol/arm_atsam/d51_util.h new file mode 100644 index 000000000..465889c7c --- /dev/null +++ b/tmk_core/protocol/arm_atsam/d51_util.h @@ -0,0 +1,185 @@ +/* +Copyright 2018 Massdrop Inc. + +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 . +*/ + +#ifndef _D51_UTIL_H_ +#define _D51_UTIL_H_ + +#include "samd51j18a.h" + +//TODO: PS: Should bring these ports out to keyboard level configuration + +//Debug LED PA27 +#define led_ena REG_PORT_DIRSET0 = 0x08000000 //PA27 Output +#define led_on REG_PORT_OUTSET0 = 0x08000000 //PA27 High +#define led_off REG_PORT_OUTCLR0 = 0x08000000 //PA27 Low + +//Debug Port PB30 +#define m15_ena REG_PORT_DIRSET1 = 0x40000000 //PB30 Output +#define m15_on REG_PORT_OUTSET1 = 0x40000000 //PB30 High +#define m15_off REG_PORT_OUTCLR1 = 0x40000000 //PB30 Low + +#define m15_loop(M15X) {uint8_t M15L=M15X; while(M15L--){m15_on;CLK_delay_us(1);m15_off;}} + +void m15_print(uint32_t x); +void dled_print(uint32_t x, uint8_t long_pause); + +void debug_code_init(void); +void debug_code_disable(void); + +#ifdef DEBUG_BOOT_TRACING + +#define DBGC(n) debug_code = n + +extern volatile uint32_t debug_code; + +enum debug_code_list { + DC_UNSET = 0, + DC_CLK_INIT_BEGIN, + DC_CLK_INIT_COMPLETE, + DC_CLK_SET_I2C1_FREQ_BEGIN, + DC_CLK_SET_I2C1_FREQ_COMPLETE, + DC_CLK_SET_I2C0_FREQ_BEGIN, + DC_CLK_SET_I2C0_FREQ_COMPLETE, + DC_CLK_SET_SPI_FREQ_BEGIN, + DC_CLK_SET_SPI_FREQ_COMPLETE, + DC_CLK_ENABLE_TIMEBASE_BEGIN, + DC_CLK_ENABLE_TIMEBASE_SYNC_ENABLE, + DC_CLK_ENABLE_TIMEBASE_SYNC_SWRST_1, + DC_CLK_ENABLE_TIMEBASE_SYNC_SWRST_2, + DC_CLK_ENABLE_TIMEBASE_TC4_BEGIN, + DC_CLK_ENABLE_TIMEBASE_TC4_SYNC_DISABLE, + DC_CLK_ENABLE_TIMEBASE_TC4_SYNC_SWRST_1, + DC_CLK_ENABLE_TIMEBASE_TC4_SYNC_SWRST_2, + DC_CLK_ENABLE_TIMEBASE_TC4_SYNC_CLTRB, + DC_CLK_ENABLE_TIMEBASE_TC4_SYNC_CC0, + DC_CLK_ENABLE_TIMEBASE_TC4_COMPLETE, + DC_CLK_ENABLE_TIMEBASE_TC5_BEGIN, + DC_CLK_ENABLE_TIMEBASE_TC5_SYNC_DISABLE, + DC_CLK_ENABLE_TIMEBASE_TC5_SYNC_SWRST_1, + DC_CLK_ENABLE_TIMEBASE_TC5_SYNC_SWRST_2, + DC_CLK_ENABLE_TIMEBASE_TC5_SYNC_CLTRB, + DC_CLK_ENABLE_TIMEBASE_TC5_COMPLETE, + DC_CLK_ENABLE_TIMEBASE_TC0_BEGIN, + DC_CLK_ENABLE_TIMEBASE_TC0_SYNC_DISABLE, + DC_CLK_ENABLE_TIMEBASE_TC0_SYNC_SWRST_1, + DC_CLK_ENABLE_TIMEBASE_TC0_SYNC_SWRST_2, + DC_CLK_ENABLE_TIMEBASE_TC0_COMPLETE, + DC_CLK_ENABLE_TIMEBASE_EVSYS_BEGIN, + DC_CLK_ENABLE_TIMEBASE_EVSYS_COMPLETE, + DC_CLK_ENABLE_TIMEBASE_COMPLETE, + DC_CLK_SET_GCLK_FREQ_BEGIN, + DC_CLK_SET_GCLK_FREQ_SYNC_1, + DC_CLK_SET_GCLK_FREQ_SYNC_2, + DC_CLK_SET_GCLK_FREQ_SYNC_3, + DC_CLK_SET_GCLK_FREQ_SYNC_4, + DC_CLK_SET_GCLK_FREQ_SYNC_5, + DC_CLK_SET_GCLK_FREQ_COMPLETE, + DC_CLK_INIT_OSC_BEGIN, + DC_CLK_INIT_OSC_SYNC_1, + DC_CLK_INIT_OSC_SYNC_2, + DC_CLK_INIT_OSC_SYNC_3, + DC_CLK_INIT_OSC_SYNC_4, + DC_CLK_INIT_OSC_SYNC_5, + DC_CLK_INIT_OSC_COMPLETE, + DC_CLK_RESET_TIME_BEGIN, + DC_CLK_RESET_TIME_COMPLETE, + DC_CLK_OSC_INIT_BEGIN, + DC_CLK_OSC_INIT_XOSC0_SYNC, + DC_CLK_OSC_INIT_DPLL_SYNC_DISABLE, + DC_CLK_OSC_INIT_DPLL_SYNC_RATIO, + DC_CLK_OSC_INIT_DPLL_SYNC_ENABLE, + DC_CLK_OSC_INIT_DPLL_WAIT_LOCK, + DC_CLK_OSC_INIT_DPLL_WAIT_CLKRDY, + DC_CLK_OSC_INIT_GCLK_SYNC_GENCTRL0, + DC_CLK_OSC_INIT_COMPLETE, + DC_SPI_INIT_BEGIN, + DC_SPI_WRITE_DRE, + DC_SPI_WRITE_TXC_1, + DC_SPI_WRITE_TXC_2, + DC_SPI_SYNC_ENABLING, + DC_SPI_INIT_COMPLETE, + DC_PORT_DETECT_INIT_BEGIN, + DC_PORT_DETECT_INIT_FAILED, + DC_PORT_DETECT_INIT_COMPLETE, + DC_USB_RESET_BEGIN, + DC_USB_RESET_COMPLETE, + DC_USB_SET_HOST_BY_VOLTAGE_BEGIN, + DC_USB_SET_HOST_5V_LOW_WAITING, + DC_USB_SET_HOST_BY_VOLTAGE_COMPLETE, + DC_USB_CONFIGURE_BEGIN, + DC_USB_CONFIGURE_GET_SERIAL, + DC_USB_CONFIGURE_COMPLETE, + DC_USB_WRITE2422_BLOCK_BEGIN, + DC_USB_WRITE2422_BLOCK_SYNC_SYSOP, + DC_USB_WRITE2422_BLOCK_COMPLETE, + DC_ADC0_CLOCK_INIT_BEGIN, + DC_ADC0_CLOCK_INIT_COMPLETE, + DC_ADC0_INIT_BEGIN, + DC_ADC0_SWRST_SYNCING_1, + DC_ADC0_SWRST_SYNCING_2, + DC_ADC0_AVGCTRL_SYNCING_1, + DC_ADC0_AVGCTRL_SYNCING_2, + DC_ADC0_SAMPCTRL_SYNCING_1, + DC_ADC0_ENABLE_SYNCING_1, + DC_ADC0_INIT_COMPLETE, + DC_I2C0_INIT_BEGIN, + DC_I2C0_INIT_SYNC_ENABLING, + DC_I2C0_INIT_SYNC_SYSOP, + DC_I2C0_INIT_WAIT_IDLE, + DC_I2C0_INIT_COMPLETE, + DC_I2C1_INIT_BEGIN, + DC_I2C1_INIT_SYNC_ENABLING, + DC_I2C1_INIT_SYNC_SYSOP, + DC_I2C1_INIT_WAIT_IDLE, + DC_I2C1_INIT_COMPLETE, + DC_I2C3733_INIT_CONTROL_BEGIN, + DC_I2C3733_INIT_CONTROL_COMPLETE, + DC_I2C3733_INIT_DRIVERS_BEGIN, + DC_I2C3733_INIT_DRIVERS_COMPLETE, + DC_I2C_DMAC_LED_INIT_BEGIN, + DC_I2C_DMAC_LED_INIT_COMPLETE, + DC_I2C3733_CONTROL_SET_BEGIN, + DC_I2C3733_CONTROL_SET_COMPLETE, + DC_LED_MATRIX_INIT_BEGIN, + DC_LED_MATRIX_INIT_COMPLETE, + DC_USB2422_INIT_BEGIN, + DC_USB2422_INIT_WAIT_5V_LOW, + DC_USB2422_INIT_OSC_SYNC_DISABLING, + DC_USB2422_INIT_OSC_SYNC_DFLLCTRLB_1, + DC_USB2422_INIT_OSC_SYNC_DFLLCTRLB_2, + DC_USB2422_INIT_OSC_SYNC_DFLLCTRLB_3, + DC_USB2422_INIT_OSC_SYNC_DFLLCTRLB_4, + DC_USB2422_INIT_OSC_SYNC_DFLLMUL, + DC_USB2422_INIT_OSC_SYNC_ENABLING, + DC_USB2422_INIT_USB_SYNC_SWRST, + DC_USB2422_INIT_USB_WAIT_SWRST, + DC_USB2422_INIT_USB_SYNC_ENABLING, + DC_USB2422_INIT_COMPLETE, + DC_MAIN_UDC_START_BEGIN, + DC_MAIN_UDC_START_COMPLETE, + DC_MAIN_CDC_INIT_BEGIN, + DC_MAIN_CDC_INIT_COMPLETE, + /* Never change the order of error codes! Only add codes to end! */ +}; + +#else + +#define DBGC(n) {} + +#endif //DEBUG_BOOT_TRACING + +#endif //_D51_UTIL_H_ diff --git a/tmk_core/protocol/arm_atsam/i2c_master.c b/tmk_core/protocol/arm_atsam/i2c_master.c new file mode 100644 index 000000000..bbe909e9b --- /dev/null +++ b/tmk_core/protocol/arm_atsam/i2c_master.c @@ -0,0 +1,585 @@ +/* +Copyright 2018 Massdrop Inc. + +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 . +*/ + +#include "arm_atsam_protocol.h" + +#ifndef MD_BOOTLOADER + +#include + +//From keyboard +#include "config.h" +#include "config_led.h" +#include "matrix.h" + +#define I2C_LED_USE_DMA 1 //Set 1 to use background DMA transfers for leds, Set 0 to use inline software transfers + +static uint8_t i2c_led_q[I2C_Q_SIZE]; //I2C queue circular buffer +static uint8_t i2c_led_q_s; //Start of circular buffer +static uint8_t i2c_led_q_e; //End of circular buffer +static uint8_t i2c_led_q_full; //Queue full counter for reset + +static uint8_t dma_sendbuf[I2C_DMA_MAX_SEND]; //Data being written to I2C + +volatile uint8_t i2c_led_q_running; + +#endif //MD_BOOTLOADER + +void i2c0_init(void) +{ + DBGC(DC_I2C0_INIT_BEGIN); + + CLK_set_i2c0_freq(CHAN_SERCOM_I2C0, FREQ_I2C0_DEFAULT); + + //MCU + PORT->Group[0].PMUX[4].bit.PMUXE = 2; + PORT->Group[0].PMUX[4].bit.PMUXO = 2; + PORT->Group[0].PINCFG[8].bit.PMUXEN = 1; + PORT->Group[0].PINCFG[9].bit.PMUXEN = 1; + + //I2C + //Note: SW Reset handled in CLK_set_i2c0_freq clks.c + + SERCOM0->I2CM.CTRLA.bit.MODE = 5; //Set master mode + + SERCOM0->I2CM.CTRLA.bit.SPEED = 0; //Set to 1 for Fast-mode Plus (FM+) up to 1 MHz + SERCOM0->I2CM.CTRLA.bit.RUNSTDBY = 1; //Enabled + + SERCOM0->I2CM.CTRLA.bit.ENABLE = 1; //Enable the device + while (SERCOM0->I2CM.SYNCBUSY.bit.ENABLE) { DBGC(DC_I2C0_INIT_SYNC_ENABLING); } //Wait for SYNCBUSY.ENABLE to clear + + SERCOM0->I2CM.STATUS.bit.BUSSTATE = 1; //Force into IDLE state + while (SERCOM0->I2CM.SYNCBUSY.bit.SYSOP) { DBGC(DC_I2C0_INIT_SYNC_SYSOP); } + while (SERCOM0->I2CM.STATUS.bit.BUSSTATE != 1) { DBGC(DC_I2C0_INIT_WAIT_IDLE); } //Wait while not idle + + DBGC(DC_I2C0_INIT_COMPLETE); +} + +uint8_t i2c0_start(uint8_t address) +{ + SERCOM0->I2CM.ADDR.bit.ADDR = address; + while (SERCOM0->I2CM.SYNCBUSY.bit.SYSOP) {} + while (SERCOM0->I2CM.INTFLAG.bit.MB == 0) {} + while (SERCOM0->I2CM.STATUS.bit.RXNACK) {} + + return 1; +} + +uint8_t i2c0_transmit(uint8_t address, uint8_t *data, uint16_t length, uint16_t timeout) +{ + if (!length) return 0; + + i2c0_start(address); + + while (length) + { + SERCOM0->I2CM.DATA.bit.DATA = *data; + while (SERCOM0->I2CM.INTFLAG.bit.MB == 0) {} + while (SERCOM0->I2CM.STATUS.bit.RXNACK) {} + + data++; + length--; + } + + i2c0_stop(); + + return 1; +} + +void i2c0_stop(void) +{ + if (SERCOM0->I2CM.STATUS.bit.CLKHOLD || SERCOM0->I2CM.INTFLAG.bit.MB == 1 || SERCOM0->I2CM.STATUS.bit.BUSSTATE != 1) + { + SERCOM0->I2CM.CTRLB.bit.CMD = 3; + while (SERCOM0->I2CM.SYNCBUSY.bit.SYSOP); + while (SERCOM0->I2CM.STATUS.bit.CLKHOLD); + while (SERCOM0->I2CM.INTFLAG.bit.MB); + while (SERCOM0->I2CM.STATUS.bit.BUSSTATE != 1); + } +} + +#ifndef MD_BOOTLOADER +void i2c1_init(void) +{ + DBGC(DC_I2C1_INIT_BEGIN); + + CLK_set_i2c1_freq(CHAN_SERCOM_I2C1, FREQ_I2C1_DEFAULT); + + /* MCU */ + PORT->Group[0].PMUX[8].bit.PMUXE = 2; + PORT->Group[0].PMUX[8].bit.PMUXO = 2; + PORT->Group[0].PINCFG[16].bit.PMUXEN = 1; + PORT->Group[0].PINCFG[17].bit.PMUXEN = 1; + + /* I2C */ + //Note: SW Reset handled in CLK_set_i2c1_freq clks.c + + SERCOM1->I2CM.CTRLA.bit.MODE = 5; //MODE: Set master mode (No sync) + SERCOM1->I2CM.CTRLA.bit.SPEED = 1; //SPEED: Fm+ up to 1MHz (No sync) + SERCOM1->I2CM.CTRLA.bit.RUNSTDBY = 1; //RUNSTBY: Enabled (No sync) + + SERCOM1->I2CM.CTRLB.bit.SMEN = 1; //SMEN: Smart mode enabled (For DMA)(No sync) + + NVIC_EnableIRQ(SERCOM1_0_IRQn); + SERCOM1->I2CM.INTENSET.bit.ERROR = 1; + + SERCOM1->I2CM.CTRLA.bit.ENABLE = 1; //ENABLE: Enable the device (sync SYNCBUSY.ENABLE) + while (SERCOM1->I2CM.SYNCBUSY.bit.ENABLE) { DBGC(DC_I2C1_INIT_SYNC_ENABLING); } //Wait for SYNCBUSY.ENABLE to clear + + SERCOM1->I2CM.STATUS.bit.BUSSTATE = 1; //BUSSTATE: Force into IDLE state (sync SYNCBUSY.SYSOP) + while (SERCOM1->I2CM.SYNCBUSY.bit.SYSOP) { DBGC(DC_I2C1_INIT_SYNC_SYSOP); } + while (SERCOM1->I2CM.STATUS.bit.BUSSTATE != 1) { DBGC(DC_I2C1_INIT_WAIT_IDLE); } //Wait while not idle + + DBGC(DC_I2C1_INIT_COMPLETE); +} + +uint8_t i2c1_start(uint8_t address) +{ + SERCOM1->I2CM.ADDR.bit.ADDR = address; + while (SERCOM1->I2CM.SYNCBUSY.bit.SYSOP) {} + while (SERCOM1->I2CM.INTFLAG.bit.MB == 0) {} + while (SERCOM1->I2CM.STATUS.bit.RXNACK) {} + + return 1; +} + +uint8_t i2c1_transmit(uint8_t address, uint8_t *data, uint16_t length, uint16_t timeout) +{ + if (!length) return 0; + + i2c1_start(address); + + while (length) + { + SERCOM1->I2CM.DATA.bit.DATA = *data; + while (SERCOM1->I2CM.INTFLAG.bit.MB == 0) {} + while (SERCOM1->I2CM.STATUS.bit.RXNACK) {} + + data++; + length--; + } + + i2c1_stop(); + + return 1; +} + +void i2c1_stop(void) +{ + if (SERCOM1->I2CM.STATUS.bit.CLKHOLD || SERCOM1->I2CM.INTFLAG.bit.MB == 1 || SERCOM1->I2CM.STATUS.bit.BUSSTATE != 1) + { + SERCOM1->I2CM.CTRLB.bit.CMD = 3; + while (SERCOM1->I2CM.SYNCBUSY.bit.SYSOP); + while (SERCOM1->I2CM.STATUS.bit.CLKHOLD); + while (SERCOM1->I2CM.INTFLAG.bit.MB); + while (SERCOM1->I2CM.STATUS.bit.BUSSTATE != 1); + } +} + +void i2c_led_send_CRWL(uint8_t drvid) +{ + uint8_t i2cdata[] = { ISSI3733_CMDRWL, ISSI3733_CMDRWL_WRITE_ENABLE_ONCE }; + i2c1_transmit(issidrv[drvid].addr, i2cdata, sizeof(i2cdata), 0); +} + +void i2c_led_select_page(uint8_t drvid, uint8_t pageno) +{ + uint8_t i2cdata[] = { ISSI3733_CMDR, pageno }; + i2c1_transmit(issidrv[drvid].addr, i2cdata, sizeof(i2cdata), 0); +} + +void i2c_led_send_GCR(uint8_t drvid) +{ + uint8_t i2cdata[] = { ISSI3733_GCCR, 0x00 }; + + if (gcr_actual > LED_GCR_MAX) gcr_actual = LED_GCR_MAX; + i2cdata[1] = gcr_actual; + + i2c1_transmit(issidrv[drvid].addr, i2cdata, sizeof(i2cdata), 0); +} + +void i2c_led_send_onoff(uint8_t drvid) +{ +#if I2C_LED_USE_DMA != 1 + if (!i2c_led_q_running) + { +#endif + i2c_led_send_CRWL(drvid); + i2c_led_select_page(drvid, 0); +#if I2C_LED_USE_DMA != 1 + } +#endif + + *issidrv[drvid].onoff = 0; //Force start location offset to zero + i2c1_transmit(issidrv[drvid].addr, issidrv[drvid].onoff, ISSI3733_PG0_BYTES, 0); +} + +void i2c_led_send_mode_op_gcr(uint8_t drvid, uint8_t mode, uint8_t operation) +{ + uint8_t i2cdata[] = { ISSI3733_CR, mode | operation, gcr_actual}; + i2c1_transmit(issidrv[drvid].addr, i2cdata, sizeof(i2cdata), 0); +} + +void i2c_led_send_pur_pdr(uint8_t drvid, uint8_t pur, uint8_t pdr) +{ + uint8_t i2cdata[] = { ISSI3733_SWYR_PUR, pur, pdr }; + + i2c1_transmit(issidrv[drvid].addr, i2cdata, sizeof(i2cdata), 0); +} + +void i2c_led_send_pwm(uint8_t drvid) +{ +#if I2C_LED_USE_DMA != 1 + if (!i2c_led_q_running) + { +#endif + i2c_led_send_CRWL(drvid); + i2c_led_select_page(drvid, 0); +#if I2C_LED_USE_DMA != 1 + } +#endif + + *issidrv[drvid].pwm = 0; //Force start location offset to zero + i2c1_transmit(issidrv[drvid].addr, issidrv[drvid].pwm, ISSI3733_PG1_BYTES, 0); +} + +uint8_t I2C3733_Init_Control(void) +{ + DBGC(DC_I2C3733_INIT_CONTROL_BEGIN); + + srdata.bit.SDB_N = 1; + SPI_WriteSRData(); + + CLK_delay_ms(1); + + srdata.bit.IRST = 0; + SPI_WriteSRData(); + + CLK_delay_ms(1); + + DBGC(DC_I2C3733_INIT_CONTROL_COMPLETE); + + return 1; +} + +uint8_t I2C3733_Init_Drivers(void) +{ + DBGC(DC_I2C3733_INIT_DRIVERS_BEGIN); + + gcr_actual = ISSI3733_GCR_DEFAULT; + gcr_actual_last = gcr_actual; + + if (gcr_actual > LED_GCR_MAX) gcr_actual = LED_GCR_MAX; + gcr_desired = gcr_actual; + + //Set up master device + i2c_led_send_CRWL(0); + i2c_led_select_page(0, 3); + i2c_led_send_mode_op_gcr(0, ISSI3733_CR_SYNC_MASTER, ISSI3733_CR_SSD_NORMAL); + + //Set up slave device + i2c_led_send_CRWL(1); + i2c_led_select_page(1, 3); + i2c_led_send_mode_op_gcr(1, ISSI3733_CR_SYNC_SLAVE, ISSI3733_CR_SSD_NORMAL); + + i2c_led_send_CRWL(0); + i2c_led_select_page(0, 3); + i2c_led_send_pur_pdr(0, ISSI3733_SWYR_PUR_8000, ISSI3733_CSXR_PDR_8000); + + i2c_led_send_CRWL(1); + i2c_led_select_page(1, 3); + i2c_led_send_pur_pdr(1, ISSI3733_SWYR_PUR_8000, ISSI3733_CSXR_PDR_8000); + + DBGC(DC_I2C3733_INIT_DRIVERS_COMPLETE); + + return 1; +} + +void I2C_DMAC_LED_Init(void) +{ + Dmac *dmac = DMAC; + + DBGC(DC_I2C_DMAC_LED_INIT_BEGIN); + + //Disable device + dmac->CTRL.bit.DMAENABLE = 0; //Disable DMAC + while (dmac->CTRL.bit.DMAENABLE) {} //Wait for disabled state in case of ongoing transfers + dmac->CTRL.bit.SWRST = 1; //Software Reset DMAC + while (dmac->CTRL.bit.SWRST) {} //Wait for software reset to complete + + //Configure device + dmac->BASEADDR.reg = (uint32_t)&dmac_desc; //Set descriptor base address + dmac->WRBADDR.reg = (uint32_t)&dmac_desc_wb; //Set descriptor write back address + dmac->CTRL.reg |= 0x0f00; //Handle all priorities (LVL0-3) + + //Disable channel + dmac->Channel[0].CHCTRLA.bit.ENABLE = 0; //Disable the channel + while (dmac->Channel[0].CHCTRLA.bit.ENABLE) {} //Wait for disabled state in case of ongoing transfers + dmac->Channel[0].CHCTRLA.bit.SWRST = 1; //Software Reset the channel + while (dmac->Channel[0].CHCTRLA.bit.SWRST) {} //Wait for software reset to complete + + //Configure channel + dmac->Channel[0].CHCTRLA.bit.THRESHOLD = 0; //1BEAT + dmac->Channel[0].CHCTRLA.bit.BURSTLEN = 0; //SINGLE + dmac->Channel[0].CHCTRLA.bit.TRIGACT = 2; //BURST + dmac->Channel[0].CHCTRLA.bit.TRIGSRC = SERCOM1_DMAC_ID_TX; //Trigger source + dmac->Channel[0].CHCTRLA.bit.RUNSTDBY = 1; //Run in standby + + NVIC_EnableIRQ(DMAC_0_IRQn); + dmac->Channel[0].CHINTENSET.bit.TCMPL = 1; + dmac->Channel[0].CHINTENSET.bit.TERR = 1; + + //Enable device + dmac->CTRL.bit.DMAENABLE = 1; //Enable DMAC + while (dmac->CTRL.bit.DMAENABLE == 0) {} //Wait for enable state + + DBGC(DC_I2C_DMAC_LED_INIT_COMPLETE); +} + +//state = 1 enable +//state = 0 disable +void I2C3733_Control_Set(uint8_t state) +{ + DBGC(DC_I2C3733_CONTROL_SET_BEGIN); + + srdata.bit.SDB_N = (state == 1 ? 1 : 0); + SPI_WriteSRData(); + + DBGC(DC_I2C3733_CONTROL_SET_COMPLETE); +} + +void i2c_led_desc_defaults(void) +{ + dmac_desc.BTCTRL.bit.STEPSIZE = 0; //SRCINC used in favor for auto 1 inc + dmac_desc.BTCTRL.bit.STEPSEL = 0; //SRCINC used in favor for auto 1 inc + dmac_desc.BTCTRL.bit.DSTINC = 0; //The Destination Address Increment is disabled + dmac_desc.BTCTRL.bit.SRCINC = 1; //The Source Address Increment is enabled (Inc by 1) + dmac_desc.BTCTRL.bit.BEATSIZE = 0; //8-bit bus transfer + dmac_desc.BTCTRL.bit.BLOCKACT = 0; //Channel will be disabled if it is the last block transfer in the transaction + dmac_desc.BTCTRL.bit.EVOSEL = 0; //Event generation disabled + dmac_desc.BTCTRL.bit.VALID = 1; //Set dmac valid +} + +void i2c_led_prepare_send_dma(uint8_t *data, uint8_t len) +{ + i2c_led_desc_defaults(); + + dmac_desc.BTCNT.reg = len; + dmac_desc.SRCADDR.reg = (uint32_t)data + len; + dmac_desc.DSTADDR.reg = (uint32_t)&SERCOM1->I2CM.DATA.reg; + dmac_desc.DESCADDR.reg = 0; +} + +void i2c_led_begin_dma(uint8_t drvid) +{ + DMAC->Channel[0].CHCTRLA.bit.ENABLE = 1; //Enable the channel + + SERCOM1->I2CM.ADDR.reg = (dmac_desc.BTCNT.reg << 16) | 0x2000 | issidrv[drvid].addr; //Begin transfer +} + +void i2c_led_send_CRWL_dma(uint8_t drvid) +{ + *(dma_sendbuf+0) = ISSI3733_CMDRWL; + *(dma_sendbuf+1) = ISSI3733_CMDRWL_WRITE_ENABLE_ONCE; + i2c_led_prepare_send_dma(dma_sendbuf, 2); + + i2c_led_begin_dma(drvid); +} + +void i2c_led_select_page_dma(uint8_t drvid, uint8_t pageno) +{ + *(dma_sendbuf+0) = ISSI3733_CMDR; + *(dma_sendbuf+1) = pageno; + i2c_led_prepare_send_dma(dma_sendbuf, 2); + + i2c_led_begin_dma(drvid); +} + +void i2c_led_send_GCR_dma(uint8_t drvid) +{ + *(dma_sendbuf+0) = ISSI3733_GCCR; + *(dma_sendbuf+1) = gcr_actual; + i2c_led_prepare_send_dma(dma_sendbuf, 2); + + i2c_led_begin_dma(drvid); +} + +void i2c_led_send_pwm_dma(uint8_t drvid) +{ + //Note: This copies the CURRENT pwm buffer, which may be getting modified + memcpy(dma_sendbuf, issidrv[drvid].pwm, ISSI3733_PG1_BYTES); + *dma_sendbuf = 0; //Force start location offset to zero + i2c_led_prepare_send_dma(dma_sendbuf, ISSI3733_PG1_BYTES); + + i2c_led_begin_dma(drvid); +} + +void i2c_led_send_onoff_dma(uint8_t drvid) +{ + //Note: This copies the CURRENT onoff buffer, which may be getting modified + memcpy(dma_sendbuf, issidrv[drvid].onoff, ISSI3733_PG0_BYTES); + *dma_sendbuf = 0; //Force start location offset to zero + i2c_led_prepare_send_dma(dma_sendbuf, ISSI3733_PG0_BYTES); + + i2c_led_begin_dma(drvid); +} + +void i2c_led_q_init(void) +{ + memset(i2c_led_q, 0, I2C_Q_SIZE); + i2c_led_q_s = 0; + i2c_led_q_e = 0; + i2c_led_q_running = 0; + i2c_led_q_full = 0; +} + +uint8_t i2c_led_q_isempty(void) +{ + return i2c_led_q_s == i2c_led_q_e; +} + +uint8_t i2c_led_q_size(void) +{ + return (i2c_led_q_e - i2c_led_q_s) % I2C_Q_SIZE; +} + +uint8_t i2c_led_q_available(void) +{ + return I2C_Q_SIZE - i2c_led_q_size() - 1; //Never allow end to meet start +} + +void i2c_led_q_add(uint8_t cmd) +{ + //WARNING: Always request room before adding commands! + + //Assign command + i2c_led_q[i2c_led_q_e] = cmd; + + i2c_led_q_e = (i2c_led_q_e + 1) % I2C_Q_SIZE; //Move end up one or wrap +} + +void i2c_led_q_s_advance(void) +{ + i2c_led_q_s = (i2c_led_q_s + 1) % I2C_Q_SIZE; //Move start up one or wrap +} + +//Always request room before adding commands +//PS: In case the queue somehow gets filled, it will reset if it can not clear up +//PS: Could only get this to happen through unrealistic timings to overload the I2C bus +uint8_t i2c_led_q_request_room(uint8_t request_size) +{ + if (request_size > i2c_led_q_available()) + { + i2c_led_q_full++; + + if (i2c_led_q_full >= 100) //Give the queue a chance to clear up + { + led_on; + I2C_DMAC_LED_Init(); + i2c_led_q_init(); + return 1; + } + + return 0; + } + + i2c_led_q_full = 0; + + return 1; +} + +uint8_t i2c_led_q_run(void) +{ + if (i2c_led_q_isempty()) + { + i2c_led_q_running = 0; + return 0; + } + + if (i2c_led_q_running) return 1; + + i2c_led_q_running = 1; + +#if I2C_LED_USE_DMA != 1 + while (!i2c_led_q_isempty()) + { +#endif + //run command + if (i2c_led_q[i2c_led_q_s] == I2C_Q_CRWL) + { + i2c_led_q_s_advance(); + uint8_t drvid = i2c_led_q[i2c_led_q_s]; +#if I2C_LED_USE_DMA == 1 + i2c_led_send_CRWL_dma(drvid); +#else + i2c_led_send_CRWL(drvid); +#endif + } + else if (i2c_led_q[i2c_led_q_s] == I2C_Q_PAGE_SELECT) + { + i2c_led_q_s_advance(); + uint8_t drvid = i2c_led_q[i2c_led_q_s]; + i2c_led_q_s_advance(); + uint8_t page = i2c_led_q[i2c_led_q_s]; +#if I2C_LED_USE_DMA == 1 + i2c_led_select_page_dma(drvid, page); +#else + i2c_led_select_page(drvid, page); +#endif + } + else if (i2c_led_q[i2c_led_q_s] == I2C_Q_PWM) + { + i2c_led_q_s_advance(); + uint8_t drvid = i2c_led_q[i2c_led_q_s]; +#if I2C_LED_USE_DMA == 1 + i2c_led_send_pwm_dma(drvid); +#else + i2c_led_send_pwm(drvid); +#endif + } + else if (i2c_led_q[i2c_led_q_s] == I2C_Q_GCR) + { + i2c_led_q_s_advance(); + uint8_t drvid = i2c_led_q[i2c_led_q_s]; +#if I2C_LED_USE_DMA == 1 + i2c_led_send_GCR_dma(drvid); +#else + i2c_led_send_GCR(drvid); +#endif + } + else if (i2c_led_q[i2c_led_q_s] == I2C_Q_ONOFF) + { + i2c_led_q_s_advance(); + uint8_t drvid = i2c_led_q[i2c_led_q_s]; +#if I2C_LED_USE_DMA == 1 + i2c_led_send_onoff_dma(drvid); +#else + i2c_led_send_onoff(drvid); +#endif + } + + i2c_led_q_s_advance(); //Advance last run command or if the command byte was not serviced + +#if I2C_LED_USE_DMA != 1 + } + + i2c_led_q_running = 0; +#endif + + return 1; +} +#endif //MD_BOOTLOADER diff --git a/tmk_core/protocol/arm_atsam/i2c_master.h b/tmk_core/protocol/arm_atsam/i2c_master.h new file mode 100644 index 000000000..99481366a --- /dev/null +++ b/tmk_core/protocol/arm_atsam/i2c_master.h @@ -0,0 +1,108 @@ +/* +Copyright 2018 Massdrop Inc. + +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 . +*/ + +#ifndef _I2C_MASTER_H_ +#define _I2C_MASTER_H_ + +#ifndef MD_BOOTLOADER + +#include "samd51j18a.h" +#include "issi3733_driver.h" +#include "config.h" + +__attribute__((__aligned__(16))) +DmacDescriptor dmac_desc; +__attribute__((__aligned__(16))) +DmacDescriptor dmac_desc_wb; + +uint8_t I2C3733_Init_Control(void); +uint8_t I2C3733_Init_Drivers(void); +void I2C3733_Control_Set(uint8_t state); +void I2C_DMAC_LED_Init(void); + +#define I2C_Q_SIZE 100 + +#define I2C_Q_NA 100 +#define I2C_Q_CRWL 101 +#define I2C_Q_PAGE_SELECT 102 +#define I2C_Q_PWM 103 +#define I2C_Q_GCR 104 +#define I2C_Q_ONOFF 105 + +#define I2C_DMA_MAX_SEND 255 + +extern volatile uint8_t i2c_led_q_running; + +#define I2C_LED_Q_PWM(a) { \ + if (i2c_led_q_request_room(7)) \ + { \ + i2c_led_q_add(I2C_Q_CRWL); \ + i2c_led_q_add(a); \ + i2c_led_q_add(I2C_Q_PAGE_SELECT); \ + i2c_led_q_add(a); \ + i2c_led_q_add(ISSI3733_PG_PWM); \ + i2c_led_q_add(I2C_Q_PWM); \ + i2c_led_q_add(a); \ + } \ + } + +#define I2C_LED_Q_GCR(a) { \ + if (i2c_led_q_request_room(7)) \ + { \ + i2c_led_q_add(I2C_Q_CRWL); \ + i2c_led_q_add(a); \ + i2c_led_q_add(I2C_Q_PAGE_SELECT); \ + i2c_led_q_add(a); \ + i2c_led_q_add(ISSI3733_PG_FN); \ + i2c_led_q_add(I2C_Q_GCR); \ + i2c_led_q_add(a); \ + } \ + } + +#define I2C_LED_Q_ONOFF(a) { \ + if (i2c_led_q_request_room(7)) \ + { \ + i2c_led_q_add(I2C_Q_CRWL); \ + i2c_led_q_add(a); \ + i2c_led_q_add(I2C_Q_PAGE_SELECT); \ + i2c_led_q_add(a); \ + i2c_led_q_add(ISSI3733_PG_ONOFF); \ + i2c_led_q_add(I2C_Q_ONOFF); \ + i2c_led_q_add(a); \ + } \ + } + + +void i2c_led_q_init(void); +void i2c_led_q_add(uint8_t cmd); +void i2c_led_q_s_advance(void); +uint8_t i2c_led_q_size(void); +uint8_t i2c_led_q_request_room(uint8_t request_size); +uint8_t i2c_led_q_run(void); + +void i2c1_init(void); +uint8_t i2c1_transmit(uint8_t address, uint8_t *data, uint16_t length, uint16_t timeout); +void i2c1_stop(void); + +#endif //MD_BOOTLOADER + +void i2c0_init(void); +uint8_t i2c0_transmit(uint8_t address, uint8_t *data, uint16_t length, uint16_t timeout); +void i2c0_stop(void); + +#endif // _I2C_MASTER_H_ + diff --git a/tmk_core/protocol/arm_atsam/issi3733_driver.h b/tmk_core/protocol/arm_atsam/issi3733_driver.h new file mode 100644 index 000000000..a537029f0 --- /dev/null +++ b/tmk_core/protocol/arm_atsam/issi3733_driver.h @@ -0,0 +1,201 @@ +/* +Copyright 2018 Massdrop Inc. + +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 . +*/ + +#ifndef _ISSI3733_DRIVER_H_ +#define _ISSI3733_DRIVER_H_ + +//ISII3733 Registers + +#define ISSI3733_CMDR 0xFD //Command Register (Write Only) + +#define ISSI3733_CMDRWL 0xFE //Command Register Write Lock (Read/Write) +#define ISSI3733_CMDRWL_WRITE_DISABLE 0x00 //Lock register +#define ISSI3733_CMDRWL_WRITE_ENABLE_ONCE 0xC5 //Enable one write to register then reset to locked + +#define ISSI3733_IMR 0xF0 //Interrupt Mask Register (Write Only) +#define ISSI3733_IMR_IAC_ON 0x08 //Auto Clear Interrupt Bit - Interrupt auto clear when INTB stay low exceeds 8ms +#define ISSI3733_IMR_IAB_ON 0x04 //Auto Breath Interrupt Bit - Enable auto breath loop finish interrupt +#define ISSI3733_IMR_IS_ON 0x02 //Dot Short Interrupt Bit - Enable dot short interrupt +#define ISSI3733_IMR_IO_ON 0x01 //Dot Open Interrupt Bit - Enable dot open interrupt + +#define ISSI3733_ISR 0xF1 //Interrupt Status Register (Read Only) +#define ISSI3733_ISR_ABM3_FINISH 0x10 //Auto Breath Mode 3 Finish Bit - ABM3 finished +#define ISSI3733_ISR_ABM2_FINISH 0x08 //Auto Breath Mode 2 Finish Bit - ABM2 finished +#define ISSI3733_ISR_ABM1_FINISH 0x04 //Auto Breath Mode 1 Finish Bit - ABM1 finished +#define ISSI3733_ISR_SB 0x02 //Short Bit - Shorted +#define ISSI3733_ISR_OB 0x01 //Open Bit - Opened + +#define ISSI3733_PG0 0x00 //LED Control Register +#define ISSI3733_PG1 0x01 //PWM Register +#define ISSI3733_PG2 0x02 //Auto Breath Mode Register +#define ISSI3733_PG3 0x03 //Function Register + +#define ISSI3733_PG_ONOFF ISSI3733_PG0 +#define ISSI3733_PG_OR ISSI3733_PG0 +#define ISSI3733_PG_SR ISSI3733_PG0 +#define ISSI3733_PG_PWM ISSI3733_PG1 +#define ISSI3733_PG_ABM ISSI3733_PG2 +#define ISSI3733_PG_FN ISSI3733_PG3 + +#define ISSI3733_CR 0x00 //Configuration Register + +//PG3: Configuration Register: Synchronize Configuration +#define ISSI3733_CR_SYNC_MASTER 0x40 //Master +#define ISSI3733_CR_SYNC_SLAVE 0x80 //Slave +#define ISSI3733_CR_SYNC_HIGH_IMP 0xC0 //High Impedance + +//PG3: Configuration Register: Open/Short Detection Enable Bit +//#define ISSI3733_CR_OSD_DISABLE 0x00 //Disable open/short detection +#define ISSI3733_CR_OSD_ENABLE 0x04 //Enable open/short detection + +//PG3: Configuration Register: Auto Breath Enable +//#define ISSI3733_CR_B_EN_PWM 0x00 //PWM Mode Enable +#define ISSI3733_CR_B_EN_AUTO 0x02 //Auto Breath Mode Enable + +//PG3: Configuration Register: Software Shutdown Control +//#define ISSI3733_CR_SSD_SHUTDOWN 0x00 //Software shutdown +#define ISSI3733_CR_SSD_NORMAL 0x01 //Normal operation + +#define ISSI3733_GCCR 0x01 //Global Current Control Register + +//1 Byte, Iout = (GCC / 256) * (840 / Rext) +//TODO: Give user define for Rext + +//PG3: Auto Breath Control Register 1 +#define ISSI3733_ABCR1_ABM1 0x02 //Auto Breath Control Register 1 of ABM-1 +#define ISSI3733_ABCR1_ABM2 0x06 //Auto Breath Control Register 1 of ABM-2 +#define ISSI3733_ABCR1_ABM3 0x0A //Auto Breath Control Register 1 of ABM-3 + +//Rise time +#define ISSI3733_ABCR1_T1_0021 0x00 //0.21s +#define ISSI3733_ABCR1_T1_0042 0x20 //0.42s +#define ISSI3733_ABCR1_T1_0084 0x40 //0.84s +#define ISSI3733_ABCR1_T1_0168 0x60 //1.68s +#define ISSI3733_ABCR1_T1_0336 0x80 //3.36s +#define ISSI3733_ABCR1_T1_0672 0xA0 //6.72s +#define ISSI3733_ABCR1_T1_1344 0xC0 //13.44s +#define ISSI3733_ABCR1_T1_2688 0xE0 //26.88s + +//Max value time +#define ISSI3733_ABCR1_T2_0000 0x00 //0s +#define ISSI3733_ABCR1_T2_0021 0x02 //0.21s +#define ISSI3733_ABCR1_T2_0042 0x04 //0.42s +#define ISSI3733_ABCR1_T2_0084 0x06 //0.84s +#define ISSI3733_ABCR1_T2_0168 0x08 //1.68s +#define ISSI3733_ABCR1_T2_0336 0x0A //3.36s +#define ISSI3733_ABCR1_T2_0672 0x0C //6.72s +#define ISSI3733_ABCR1_T2_1344 0x0E //13.44s +#define ISSI3733_ABCR1_T2_2688 0x10 //26.88s + +//PG3: Auto Breath Control Register 2 +#define ISSI3733_ABCR2_ABM1 0x03 //Auto Breath Control Register 2 of ABM-1 +#define ISSI3733_ABCR2_ABM2 0x07 //Auto Breath Control Register 2 of ABM-2 +#define ISSI3733_ABCR2_ABM3 0x0B //Auto Breath Control Register 2 of ABM-3 + +//Fall time +#define ISSI3733_ABCR2_T3_0021 0x00 //0.21s +#define ISSI3733_ABCR2_T3_0042 0x20 //0.42s +#define ISSI3733_ABCR2_T3_0084 0x40 //0.84s +#define ISSI3733_ABCR2_T3_0168 0x60 //1.68s +#define ISSI3733_ABCR2_T3_0336 0x80 //3.36s +#define ISSI3733_ABCR2_T3_0672 0xA0 //6.72s +#define ISSI3733_ABCR2_T3_1344 0xC0 //13.44s +#define ISSI3733_ABCR2_T3_2688 0xE0 //26.88s + +//Min value time +#define ISSI3733_ABCR2_T4_0000 0x00 //0s +#define ISSI3733_ABCR2_T4_0021 0x02 //0.21s +#define ISSI3733_ABCR2_T4_0042 0x04 //0.42s +#define ISSI3733_ABCR2_T4_0084 0x06 //0.84s +#define ISSI3733_ABCR2_T4_0168 0x08 //1.68s +#define ISSI3733_ABCR2_T4_0336 0x0A //3.36s +#define ISSI3733_ABCR2_T4_0672 0x0C //6.72s +#define ISSI3733_ABCR2_T4_1344 0x0E //13.44s +#define ISSI3733_ABCR2_T4_2688 0x10 //26.88s +#define ISSI3733_ABCR2_T4_5376 0x12 //53.76s +#define ISSI3733_ABCR2_T4_10752 0x14 //107.52s + +//PG3: Auto Breath Control Register 3 +#define ISSI3733_ABCR3_ABM1 0x04 //Auto Breath Control Register 3 of ABM-1 +#define ISSI3733_ABCR3_ABM2 0x08 //Auto Breath Control Register 3 of ABM-2 +#define ISSI3733_ABCR3_ABM3 0x0C //Auto Breath Control Register 3 of ABM-3 + +#define ISSI3733_ABCR3_LTA_LOOP_ENDLESS 0x00 +#define ISSI3733_ABCR3_LTA_LOOP_1 0x01 +#define ISSI3733_ABCR3_LTA_LOOP_2 0x02 +#define ISSI3733_ABCR3_LTA_LOOP_3 0x03 +#define ISSI3733_ABCR3_LTA_LOOP_4 0x04 +#define ISSI3733_ABCR3_LTA_LOOP_5 0x05 +#define ISSI3733_ABCR3_LTA_LOOP_6 0x06 +#define ISSI3733_ABCR3_LTA_LOOP_7 0x07 +#define ISSI3733_ABCR3_LTA_LOOP_8 0x08 +#define ISSI3733_ABCR3_LTA_LOOP_9 0x09 +#define ISSI3733_ABCR3_LTA_LOOP_10 0x0A +#define ISSI3733_ABCR3_LTA_LOOP_11 0x0B +#define ISSI3733_ABCR3_LTA_LOOP_12 0x0C +#define ISSI3733_ABCR3_LTA_LOOP_13 0x0D +#define ISSI3733_ABCR3_LTA_LOOP_14 0x0E +#define ISSI3733_ABCR3_LTA_LOOP_15 0x0F + +//Loop Begin +#define ISSI3733_ABCR3_LB_T1 0x00 +#define ISSI3733_ABCR3_LB_T2 0x10 +#define ISSI3733_ABCR3_LB_T3 0x20 +#define ISSI3733_ABCR3_LB_T4 0x30 + +//Loop End +#define ISSI3733_ABCR3_LE_T3 0x00 //End at Off state +#define ISSI3733_ABCR3_LE_T1 0x40 //End at On State + +//PG3: Auto Breath Control Register 4 +#define ISSI3733_ABCR4_ABM1 0x05 //Auto Breath Control Register 4 of ABM-1 +#define ISSI3733_ABCR4_ABM2 0x09 //Auto Breath Control Register 4 of ABM-2 +#define ISSI3733_ABCR4_ABM3 0x0D //Auto Breath Control Register 4 of ABM-3 + +#define ISSI3733_ABCR4_LTB_LOOP_ENDLESS 0x00 +//Or 8bit loop times + +//PG3: Time Update Register +#define ISSI3733_TUR 0x0E +#define ISSI3733_TUR_UPDATE 0x00 //Write to update 02h~0Dh time registers after configuring + +//PG3: SWy Pull-Up Resistor Selection Register +#define ISSI3733_SWYR_PUR 0x0F +#define ISSI3733_SWYR_PUR_NONE 0x00 //No pull-up resistor +#define ISSI3733_SWYR_PUR_500 0x01 //0.5k Ohm +#define ISSI3733_SWYR_PUR_1000 0x02 //1.0k Ohm +#define ISSI3733_SWYR_PUR_2000 0x03 //2.0k Ohm +#define ISSI3733_SWYR_PUR_4000 0x04 //4.0k Ohm +#define ISSI3733_SWYR_PUR_8000 0x05 //8.0k Ohm +#define ISSI3733_SWYR_PUR_16000 0x06 //16k Ohm +#define ISSI3733_SWYR_PUR_32000 0x07 //32k Ohm + +//PG3: CSx Pull-Down Resistor Selection Register +#define ISSI3733_CSXR_PDR 0x10 +#define ISSI3733_CSXR_PDR_NONE 0x00 //No pull-down resistor +#define ISSI3733_CSXR_PDR_500 0x01 //0.5k Ohm +#define ISSI3733_CSXR_PDR_1000 0x02 //1.0k Ohm +#define ISSI3733_CSXR_PDR_2000 0x03 //2.0k Ohm +#define ISSI3733_CSXR_PDR_4000 0x04 //4.0k Ohm +#define ISSI3733_CSXR_PDR_8000 0x05 //8.0k Ohm +#define ISSI3733_CSXR_PDR_16000 0x06 //16k Ohm +#define ISSI3733_CSXR_PDR_32000 0x07 //32k Ohm + +//PG3: Reset Register +#define ISSI3733_RR 0x11 //Read to reset all registers to default values + +#endif //_ISSI3733_DRIVER_H_ diff --git a/tmk_core/protocol/arm_atsam/led_matrix.c b/tmk_core/protocol/arm_atsam/led_matrix.c new file mode 100644 index 000000000..7ee1dad22 --- /dev/null +++ b/tmk_core/protocol/arm_atsam/led_matrix.c @@ -0,0 +1,509 @@ +/* +Copyright 2018 Massdrop Inc. + +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 . +*/ + +#include "arm_atsam_protocol.h" +#include "tmk_core/common/led.h" +#include + +void SERCOM1_0_Handler( void ) +{ + if (SERCOM1->I2CM.INTFLAG.bit.ERROR) + { + SERCOM1->I2CM.INTFLAG.reg = SERCOM_I2CM_INTENCLR_ERROR; + } +} + +void DMAC_0_Handler( void ) +{ + if (DMAC->Channel[0].CHINTFLAG.bit.TCMPL) + { + DMAC->Channel[0].CHINTFLAG.reg = DMAC_CHINTENCLR_TCMPL; + + i2c1_stop(); + + i2c_led_q_running = 0; + + i2c_led_q_run(); + + return; + } + + if (DMAC->Channel[0].CHINTFLAG.bit.TERR) + { + DMAC->Channel[0].CHINTFLAG.reg = DMAC_CHINTENCLR_TERR; + } +} + +issi3733_driver_t issidrv[ISSI3733_DRIVER_COUNT]; + +issi3733_led_t led_map[ISSI3733_LED_COUNT+1] = ISSI3733_LED_MAP; +issi3733_led_t *lede = led_map + ISSI3733_LED_COUNT; //End pointer of mapping + +uint8_t gcr_desired; +uint8_t gcr_breathe; +uint8_t gcr_use; +uint8_t gcr_actual; +uint8_t gcr_actual_last; + +#define ACT_GCR_NONE 0 +#define ACT_GCR_INC 1 +#define ACT_GCR_DEC 2 + +#define LED_GCR_STEP_AUTO 2 + +static uint8_t gcr_min_counter; +static uint8_t v_5v_cat_hit; + +//WARNING: Automatic GCR is in place to prevent USB shutdown and LED driver overloading +void gcr_compute(void) +{ + uint8_t action = ACT_GCR_NONE; + + if (led_animation_breathing) + gcr_use = gcr_breathe; + else + gcr_use = gcr_desired; + + //If the 5v takes a catastrophic hit, disable the LED drivers briefly, assert auto gcr mode, min gcr and let the auto take over + if (v_5v < V5_CAT) + { + I2C3733_Control_Set(0); + //CDC_print("USB: WARNING: 5V catastrophic level reached! Disabling LED drivers!\r\n"); //Blocking print is bad here! + v_5v_cat_hit = 20; //~100ms recover + gcr_actual = 0; //Minimize GCR + usb_gcr_auto = 1; //Force auto mode enabled + return; + } + else if (v_5v_cat_hit > 1) + { + v_5v_cat_hit--; + return; + } + else if (v_5v_cat_hit == 1) + { + I2C3733_Control_Set(1); + CDC_print("USB: WARNING: Re-enabling LED drivers\r\n"); + v_5v_cat_hit = 0; + return; + } + + if (usb_gcr_auto) + { + if (v_5v_avg < V5_LOW) action = ACT_GCR_DEC; + else if (v_5v_avg > V5_HIGH && gcr_actual < gcr_use) action = ACT_GCR_INC; + else if (gcr_actual > gcr_use) action = ACT_GCR_DEC; + } + else + { + if (gcr_actual < gcr_use) action = ACT_GCR_INC; + else if (gcr_actual > gcr_use) action = ACT_GCR_DEC; + } + + if (action == ACT_GCR_NONE) + { + gcr_min_counter = 0; + } + else if (action == ACT_GCR_INC) + { + if (LED_GCR_STEP_AUTO > LED_GCR_MAX - gcr_actual) gcr_actual = LED_GCR_MAX; //Obey max and prevent wrapping + else gcr_actual += LED_GCR_STEP_AUTO; + gcr_min_counter = 0; + } + else if (action == ACT_GCR_DEC) + { + if (LED_GCR_STEP_AUTO > gcr_actual) //Prevent wrapping + { + gcr_actual = 0; + //At this point, power can no longer be cut from the LED drivers, so focus on cutting out extra port if active + if (usb_extra_state != USB_EXTRA_STATE_DISABLED_UNTIL_REPLUG) //If not in a wait for replug state + { + if (usb_extra_state == USB_EXTRA_STATE_ENABLED) //If extra usb is enabled + { + gcr_min_counter++; + if (gcr_min_counter > 200) //5ms per check = 1s delay + { + USB_ExtraSetState(USB_EXTRA_STATE_DISABLED_UNTIL_REPLUG); + usb_extra_manual = 0; //Force disable manual mode of extra port + if (usb_extra_manual) CDC_print("USB: Disabling extra port until replug and manual mode toggle!\r\n"); + else CDC_print("USB: Disabling extra port until replug!\r\n"); + } + } + } + } + else + { + //Power successfully cut back from LED drivers + gcr_actual -= LED_GCR_STEP_AUTO; + gcr_min_counter = 0; + + //If breathe mode is active, the top end can fluctuate if the host can not supply enough current + //So set the breathe GCR to where it becomes stable + if (led_animation_breathing == 1) + { + gcr_breathe = gcr_actual; + //PS: At this point, setting breathing to exhale makes a noticebly shorter cycle + // and the same would happen maybe one or two more times. Therefore I'm favoring + // powering through one full breathe and letting gcr settle completely + } + } + } +} + +led_disp_t disp; + +void issi3733_prepare_arrays(void) +{ + memset(issidrv,0,sizeof(issi3733_driver_t) * ISSI3733_DRIVER_COUNT); + + int i; + uint8_t addrs[ISSI3733_DRIVER_COUNT] = ISSI3773_DRIVER_ADDRESSES; + + for (i=0;irgb.g = issidrv[cur->adr.drv-1].pwm + 1 + ((cur->adr.swg-1)*16 + (cur->adr.cs-1)); + cur->rgb.r = issidrv[cur->adr.drv-1].pwm + 1 + ((cur->adr.swr-1)*16 + (cur->adr.cs-1)); + cur->rgb.b = issidrv[cur->adr.drv-1].pwm + 1 + ((cur->adr.swb-1)*16 + (cur->adr.cs-1)); + + //BYTE: 1 + (SW-1)*2 + (CS-1)/8 + //BIT: (CS-1)%8 + *(issidrv[cur->adr.drv-1].onoff + 1 + (cur->adr.swg-1)*2+(cur->adr.cs-1)/8) |= (1<<((cur->adr.cs-1)%8)); + *(issidrv[cur->adr.drv-1].onoff + 1 + (cur->adr.swr-1)*2+(cur->adr.cs-1)/8) |= (1<<((cur->adr.cs-1)%8)); + *(issidrv[cur->adr.drv-1].onoff + 1 + (cur->adr.swb-1)*2+(cur->adr.cs-1)/8) |= (1<<((cur->adr.cs-1)%8)); + + cur++; + } +} + +void disp_calc_extents(void) +{ + issi3733_led_t *cur = led_map; + + disp.left = 1e10; + disp.right = -1e10; + disp.top = -1e10; + disp.bottom = 1e10; + + while (cur < lede) + { + if (cur->x < disp.left) disp.left = cur->x; + if (cur->x > disp.right) disp.right = cur->x; + if (cur->y < disp.bottom) disp.bottom = cur->y; + if (cur->y > disp.top) disp.top = cur->y; + + cur++; + } + + disp.width = disp.right - disp.left; + disp.height = disp.top - disp.bottom; +} + +void disp_pixel_setup(void) +{ + issi3733_led_t *cur = led_map; + + while (cur < lede) + { + cur->px = (cur->x - disp.left) / disp.width * 100; + cur->py = (cur->y - disp.top) / disp.height * 100; + *cur->rgb.r = 0; + *cur->rgb.g = 0; + *cur->rgb.b = 0; + + cur++; + } +} + +void led_matrix_prepare(void) +{ + disp_calc_extents(); + disp_pixel_setup(); +} + +uint8_t led_enabled; +float led_animation_speed; +uint8_t led_animation_direction; +uint8_t led_animation_breathing; +uint8_t led_animation_breathe_cur; +uint8_t breathe_step; +uint8_t breathe_dir; +uint64_t led_next_run; + +uint8_t led_animation_id; +uint8_t led_lighting_mode; + +issi3733_led_t *led_cur; +uint8_t led_per_run = 15; +float breathe_mult; + +void led_matrix_run(led_setup_t *f) +{ + float ro; + float go; + float bo; + float px; + uint8_t led_this_run = 0; + + if (led_cur == 0) //Denotes start of new processing cycle in the case of chunked processing + { + led_cur = led_map; + + disp.frame += 1; + + breathe_mult = 1; + + if (led_animation_breathing) + { + led_animation_breathe_cur += breathe_step * breathe_dir; + + if (led_animation_breathe_cur >= BREATHE_MAX_STEP) + breathe_dir = -1; + else if (led_animation_breathe_cur <= BREATHE_MIN_STEP) + breathe_dir = 1; + + //Brightness curve created for 256 steps, 0 - ~98% + breathe_mult = 0.000015 * led_animation_breathe_cur * led_animation_breathe_cur; + if (breathe_mult > 1) breathe_mult = 1; + else if (breathe_mult < 0) breathe_mult = 0; + } + } + + uint8_t fcur = 0; + uint8_t fmax = 0; + + //Frames setup + while (f[fcur].end != 1) + { + fcur++; //Count frames + } + + fmax = fcur; //Store total frames count + + while (led_cur < lede && led_this_run < led_per_run) + { + ro = 0; + go = 0; + bo = 0; + + if (led_lighting_mode == LED_MODE_KEYS_ONLY && led_cur->scan == 255) + { + //Do not act on this LED + } + else if (led_lighting_mode == LED_MODE_NON_KEYS_ONLY && led_cur->scan != 255) + { + //Do not act on this LED + } + else if (led_lighting_mode == LED_MODE_INDICATORS_ONLY) + { + //Do not act on this LED (Only show indicators) + } + else + { + //Act on LED + for (fcur = 0; fcur < fmax; fcur++) + { + px = led_cur->px; + float pxmod; + pxmod = (float)(disp.frame % (uint32_t)(1000.0f / led_animation_speed)) / 10.0f * led_animation_speed; + + //Add in any moving effects + if ((!led_animation_direction && f[fcur].ef & EF_SCR_R) || (led_animation_direction && (f[fcur].ef & EF_SCR_L))) + { + pxmod *= 100.0f; + pxmod = (uint32_t)pxmod % 10000; + pxmod /= 100.0f; + + px -= pxmod; + + if (px > 100) px -= 100; + else if (px < 0) px += 100; + } + else if ((!led_animation_direction && f[fcur].ef & EF_SCR_L) || (led_animation_direction && (f[fcur].ef & EF_SCR_R))) + { + pxmod *= 100.0f; + pxmod = (uint32_t)pxmod % 10000; + pxmod /= 100.0f; + px += pxmod; + + if (px > 100) px -= 100; + else if (px < 0) px += 100; + } + + //Check if LED's px is in current frame + if (px < f[fcur].hs) continue; + if (px > f[fcur].he) continue; + //note: < 0 or > 100 continue + + //Calculate the px within the start-stop percentage for color blending + px = (px - f[fcur].hs) / (f[fcur].he - f[fcur].hs); + + //Add in any color effects + if (f[fcur].ef & EF_OVER) + { + ro = (px * (f[fcur].re - f[fcur].rs)) + f[fcur].rs;// + 0.5; + go = (px * (f[fcur].ge - f[fcur].gs)) + f[fcur].gs;// + 0.5; + bo = (px * (f[fcur].be - f[fcur].bs)) + f[fcur].bs;// + 0.5; + } + else if (f[fcur].ef & EF_SUBTRACT) + { + ro -= (px * (f[fcur].re - f[fcur].rs)) + f[fcur].rs;// + 0.5; + go -= (px * (f[fcur].ge - f[fcur].gs)) + f[fcur].gs;// + 0.5; + bo -= (px * (f[fcur].be - f[fcur].bs)) + f[fcur].bs;// + 0.5; + } + else + { + ro += (px * (f[fcur].re - f[fcur].rs)) + f[fcur].rs;// + 0.5; + go += (px * (f[fcur].ge - f[fcur].gs)) + f[fcur].gs;// + 0.5; + bo += (px * (f[fcur].be - f[fcur].bs)) + f[fcur].bs;// + 0.5; + } + } + } + + //Clamp values 0-255 + if (ro > 255) ro = 255; else if (ro < 0) ro = 0; + if (go > 255) go = 255; else if (go < 0) go = 0; + if (bo > 255) bo = 255; else if (bo < 0) bo = 0; + + if (led_animation_breathing) + { + ro *= breathe_mult; + go *= breathe_mult; + bo *= breathe_mult; + } + + *led_cur->rgb.r = (uint8_t)ro; + *led_cur->rgb.g = (uint8_t)go; + *led_cur->rgb.b = (uint8_t)bo; + +#ifdef USB_LED_INDICATOR_ENABLE + if (keyboard_leds()) + { + uint8_t kbled = keyboard_leds(); + if ( + #if USB_LED_NUM_LOCK_SCANCODE != 255 + (led_cur->scan == USB_LED_NUM_LOCK_SCANCODE && kbled & (1<scan == USB_LED_CAPS_LOCK_SCANCODE && kbled & (1<scan == USB_LED_SCROLL_LOCK_SCANCODE && kbled & (1<scan == USB_LED_COMPOSE_SCANCODE && kbled & (1<scan == USB_LED_KANA_SCANCODE && kbled & (1<rgb.r > 127) *led_cur->rgb.r = 0; + else *led_cur->rgb.r = 255; + if (*led_cur->rgb.g > 127) *led_cur->rgb.g = 0; + else *led_cur->rgb.g = 255; + if (*led_cur->rgb.b > 127) *led_cur->rgb.b = 0; + else *led_cur->rgb.b = 255; + } + } +#endif //USB_LED_INDICATOR_ENABLE + + led_cur++; + led_this_run++; + } +} + +uint8_t led_matrix_init(void) +{ + DBGC(DC_LED_MATRIX_INIT_BEGIN); + + issi3733_prepare_arrays(); + + led_matrix_prepare(); + + disp.frame = 0; + led_next_run = 0; + + led_enabled = 1; + led_animation_id = 0; + led_lighting_mode = LED_MODE_NORMAL; + led_animation_speed = 4.0f; + led_animation_direction = 0; + led_animation_breathing = 0; + led_animation_breathe_cur = BREATHE_MIN_STEP; + breathe_step = 1; + breathe_dir = 1; + + gcr_min_counter = 0; + v_5v_cat_hit = 0; + + //Run led matrix code once for initial LED coloring + led_cur = 0; + led_matrix_run((led_setup_t*)led_setups[led_animation_id]); + + DBGC(DC_LED_MATRIX_INIT_COMPLETE); + + return 0; +} + +#define LED_UPDATE_RATE 10 //ms + +//led data processing can take time, so process data in chunks to free up the processor +//this is done through led_cur and lede +void led_matrix_task(void) +{ + if (led_enabled) + { + //If an update may run and frame processing has completed + if (CLK_get_ms() >= led_next_run && led_cur == lede) + { + uint8_t drvid; + + led_next_run = CLK_get_ms() + LED_UPDATE_RATE; //Set next frame update time + + //NOTE: GCR does not need to be timed with LED processing, but there is really no harm + if (gcr_actual != gcr_actual_last) + { + for (drvid=0;drvid. +*/ + +#ifndef _LED_MATRIX_H_ +#define _LED_MATRIX_H_ + +//From keyboard +#include "config_led.h" + +//CS1-CS16 Current Source "Col" +#define ISSI3733_CS_COUNT 16 + +//SW1-SW12 Switch "Row" +#define ISSI3733_SW_COUNT 12 + +#define ISSI3733_LED_RGB_COUNT ISSI3733_CS_COUNT * ISSI3733_SW_COUNT +#define ISSI3733_PG0_BYTES ISSI3733_LED_RGB_COUNT / 8 + 1 //+1 for first byte being memory start offset for I2C transfer +#define ISSI3733_PG1_BYTES ISSI3733_LED_RGB_COUNT + 1 //+1 for first byte being memory start offset for I2C transfer +#define ISSI3733_PG2_BYTES ISSI3733_LED_RGB_COUNT + 1 //+1 for first byte being memory start offset for I2C transfer +#define ISSI3733_PG3_BYTES 18 + 1 //+1 for first byte being memory start offset for I2C transfer + +#define ISSI3733_PG_ONOFF_BYTES ISSI3733_PG0_BYTES +#define ISSI3733_PG_OR_BYTES ISSI3733_PG0_BYTES +#define ISSI3733_PG_SR_BYTES ISSI3733_PG0_BYTES +#define ISSI3733_PG_PWM_BYTES ISSI3733_PG1_BYTES +#define ISSI3733_PG_ABM_BYTES ISSI3733_PG2_BYTES +#define ISSI3733_PG_FN_BYTES ISSI3733_PG3_BYTES + +typedef struct issi3733_driver_s { + uint8_t addr; //Address of the driver according to wiring "ISSI3733: Table 1 Slave Address" + uint8_t onoff[ISSI3733_PG_ONOFF_BYTES]; //PG0 - LED Control Register - LED On/Off Register + uint8_t open[ISSI3733_PG_OR_BYTES]; //PG0 - LED Control Register - LED Open Register + uint8_t shrt[ISSI3733_PG_SR_BYTES]; //PG0 - LED Control Register - LED Short Register + uint8_t pwm[ISSI3733_PG_PWM_BYTES]; //PG1 - PWM Register + uint8_t abm[ISSI3733_PG_ABM_BYTES]; //PG2 - Auto Breath Mode Register + uint8_t conf[ISSI3733_PG_FN_BYTES]; //PG3 - Function Register +} issi3733_driver_t; + +typedef struct issi3733_rgb_s { + uint8_t *r; //Direct access into PWM data + uint8_t *g; //Direct access into PWM data + uint8_t *b; //Direct access into PWM data +} issi3733_rgb_t; + +typedef struct issi3733_rgb_adr_s { + uint8_t drv; //Driver from given list + uint8_t cs; //CS + uint8_t swr; //SW Red + uint8_t swg; //SW Green + uint8_t swb; //SW Blue +} issi3733_rgb_adr_t; + +typedef struct issi3733_led_s { + uint8_t id; //According to PCB ref + issi3733_rgb_t rgb; //PWM settings of R G B + issi3733_rgb_adr_t adr; //Hardware addresses + float x; //Physical position X + float y; //Physical position Y + float px; //Physical position X in percent + float py; //Physical position Y in percent + uint8_t scan; //Key scan code from wiring (set 0xFF if no key) +} issi3733_led_t; + +typedef struct led_disp_s { + uint64_t frame; + float left; + float right; + float top; + float bottom; + float width; + float height; +} led_disp_t; + +uint8_t led_matrix_init(void); + +#define LED_MODE_NORMAL 0 //Must be 0 +#define LED_MODE_KEYS_ONLY 1 +#define LED_MODE_NON_KEYS_ONLY 2 +#define LED_MODE_INDICATORS_ONLY 3 +#define LED_MODE_MAX_INDEX LED_MODE_INDICATORS_ONLY //Must be highest value + +#define EF_NONE 0x00000000 //No effect +#define EF_OVER 0x00000001 //Overwrite any previous color information with new +#define EF_SCR_L 0x00000002 //Scroll left +#define EF_SCR_R 0x00000004 //Scroll right +#define EF_SUBTRACT 0x00000008 //Subtract color values + +typedef struct led_setup_s { + float hs; //Band begin at percent + float he; //Band end at percent + uint8_t rs; //Red start value + uint8_t re; //Red end value + uint8_t gs; //Green start value + uint8_t ge; //Green end value + uint8_t bs; //Blue start value + uint8_t be; //Blue end value + uint32_t ef; //Animation and color effects + uint8_t end; //Set to signal end of the setup +} led_setup_t; + +extern issi3733_driver_t issidrv[ISSI3733_DRIVER_COUNT]; + +extern uint8_t gcr_desired; +extern uint8_t gcr_breathe; +extern uint8_t gcr_actual; +extern uint8_t gcr_actual_last; + +extern uint8_t led_animation_id; +extern uint8_t led_enabled; +extern float led_animation_speed; +extern uint8_t led_lighting_mode; +extern uint8_t led_animation_direction; +extern uint8_t led_animation_breathing; +extern uint8_t led_animation_breathe_cur; +extern uint8_t breathe_dir; +extern const uint8_t led_setups_count; + +extern void *led_setups[]; + +extern issi3733_led_t *led_cur; +extern issi3733_led_t *lede; + +void led_matrix_run(led_setup_t *f); +void led_matrix_task(void); + +void gcr_compute(void); + +#endif //_LED_MATRIX_H_ diff --git a/tmk_core/protocol/arm_atsam/main_arm_atsam.c b/tmk_core/protocol/arm_atsam/main_arm_atsam.c new file mode 100644 index 000000000..e9514730e --- /dev/null +++ b/tmk_core/protocol/arm_atsam/main_arm_atsam.c @@ -0,0 +1,279 @@ +/* +Copyright 2018 Massdrop Inc. + +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 . +*/ + +#include "samd51j18a.h" +#include "tmk_core/common/keyboard.h" + +#include "report.h" +#include "host.h" +#include "host_driver.h" +#include "keycode_config.h" +#include +#include "quantum.h" + +//From protocol directory +#include "arm_atsam_protocol.h" + +//From keyboard's directory +#include "config_led.h" + +uint8_t keyboard_leds(void); +void send_keyboard(report_keyboard_t *report); +void send_mouse(report_mouse_t *report); +void send_system(uint16_t data); +void send_consumer(uint16_t data); + +host_driver_t arm_atsam_driver = { + keyboard_leds, + send_keyboard, + send_mouse, + send_system, + send_consumer +}; + +uint8_t led_states; + +uint8_t keyboard_leds(void) +{ +#ifdef NKRO_ENABLE + if (keymap_config.nkro) + return udi_hid_nkro_report_set; + else +#endif //NKRO_ENABLE + return udi_hid_kbd_report_set; +} + +void send_keyboard(report_keyboard_t *report) +{ + uint32_t irqflags; + +#ifdef NKRO_ENABLE + if (!keymap_config.nkro) + { +#endif //NKRO_ENABLE + dprint("s-kbd\r\n"); + + irqflags = __get_PRIMASK(); + __disable_irq(); + __DMB(); + + memcpy(udi_hid_kbd_report, report->raw, UDI_HID_KBD_REPORT_SIZE); + udi_hid_kbd_b_report_valid = 1; + udi_hid_kbd_send_report(); + + __DMB(); + __set_PRIMASK(irqflags); +#ifdef NKRO_ENABLE + } + else + { + dprint("s-nkro\r\n"); + + irqflags = __get_PRIMASK(); + __disable_irq(); + __DMB(); + + memcpy(udi_hid_nkro_report, report->raw, UDI_HID_NKRO_REPORT_SIZE); + udi_hid_nkro_b_report_valid = 1; + udi_hid_nkro_send_report(); + + __DMB(); + __set_PRIMASK(irqflags); + } +#endif //NKRO_ENABLE +} + +void send_mouse(report_mouse_t *report) +{ +#ifdef MOUSEKEY_ENABLE + uint32_t irqflags; + + dprint("s-mou\r\n"); + + irqflags = __get_PRIMASK(); + __disable_irq(); + __DMB(); + + memcpy(udi_hid_mou_report, report, UDI_HID_MOU_REPORT_SIZE); + udi_hid_mou_b_report_valid = 1; + udi_hid_mou_send_report(); + + __DMB(); + __set_PRIMASK(irqflags); +#endif //MOUSEKEY_ENABLE +} + +void send_system(uint16_t data) +{ +#ifdef EXTRAKEY_ENABLE + dprintf("s-exks %i\r\n", data); + + uint32_t irqflags; + + irqflags = __get_PRIMASK(); + __disable_irq(); + __DMB(); + + udi_hid_exk_report.desc.report_id = REPORT_ID_SYSTEM; + if (data != 0) data = data - SYSTEM_POWER_DOWN + 1; + udi_hid_exk_report.desc.report_data = data; + udi_hid_exk_b_report_valid = 1; + udi_hid_exk_send_report(); + + __DMB(); + __set_PRIMASK(irqflags); +#endif //EXTRAKEY_ENABLE +} + +void send_consumer(uint16_t data) +{ +#ifdef EXTRAKEY_ENABLE + dprintf("s-exkc %i\r\n",data); + + uint32_t irqflags; + + irqflags = __get_PRIMASK(); + __disable_irq(); + __DMB(); + + udi_hid_exk_report.desc.report_id = REPORT_ID_CONSUMER; + udi_hid_exk_report.desc.report_data = data; + udi_hid_exk_b_report_valid = 1; + udi_hid_exk_send_report(); + + __DMB(); + __set_PRIMASK(irqflags); +#endif //EXTRAKEY_ENABLE +} + +int main(void) +{ + led_ena; + m15_ena; + + debug_code_init(); + + CLK_init(); + + ADC0_init(); + + SPI_Init(); + + i2c1_init(); + + matrix_init(); + + USB2422_init(); + + DBGC(DC_MAIN_UDC_START_BEGIN); + udc_start(); + DBGC(DC_MAIN_UDC_START_COMPLETE); + + DBGC(DC_MAIN_CDC_INIT_BEGIN); + CDC_init(); + DBGC(DC_MAIN_CDC_INIT_COMPLETE); + + while (USB2422_Port_Detect_Init() == 0) {} + + led_off; + m15_off; + + led_matrix_init(); + + while (I2C3733_Init_Control() != 1) {} + while (I2C3733_Init_Drivers() != 1) {} + + I2C_DMAC_LED_Init(); + + i2c_led_q_init(); + + uint8_t drvid; + for (drvid=0;drvid next_5v_checkup) + { + next_5v_checkup = CLK_get_ms() + 5; + + v_5v = adc_get(ADC_5V); + v_5v_avg = 0.9 * v_5v_avg + 0.1 * v_5v; + + gcr_compute(); + } + + if (CLK_get_ms() > next_usb_checkup) + { + next_usb_checkup = CLK_get_ms() + 10; + + USB_HandleExtraDevice(); + } + +#ifdef VIRTSER_ENABLE + if (CLK_get_ms() > next_print) + { + next_print = CLK_get_ms() + 250; + //dpf("5v=%i 5vu=%i dlow=%i dhi=%i gca=%i gcd=%i\r\n",v_5v,v_5v_avg,v_5v_avg-V5_LOW,v_5v_avg-V5_HIGH,gcr_actual,gcr_desired); + } +#endif //VIRTSER_ENABLE + } + + return 1; +} + diff --git a/tmk_core/protocol/arm_atsam/main_arm_atsam.h b/tmk_core/protocol/arm_atsam/main_arm_atsam.h new file mode 100644 index 000000000..78205e2e1 --- /dev/null +++ b/tmk_core/protocol/arm_atsam/main_arm_atsam.h @@ -0,0 +1,23 @@ +/* +Copyright 2018 Massdrop Inc. + +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 . +*/ + +#ifndef _MAIN_ARM_ATSAM_H_ +#define _MAIN_ARM_ATSAM_H_ + +uint8_t keyboard_leds(void); + +#endif //_MAIN_ARM_ATSAM_H_ diff --git a/tmk_core/protocol/arm_atsam/md_bootloader.h b/tmk_core/protocol/arm_atsam/md_bootloader.h new file mode 100644 index 000000000..1316876c8 --- /dev/null +++ b/tmk_core/protocol/arm_atsam/md_bootloader.h @@ -0,0 +1,18 @@ +#ifndef _MD_BOOTLOADER_H_ +#define _MD_BOOTLOADER_H_ + +extern uint32_t _srom; +extern uint32_t _lrom; +extern uint32_t _erom; + +#define BOOTLOADER_SERIAL_MAX_SIZE 20 //DO NOT MODIFY! + +#ifdef MD_BOOTLOADER + +#define MCU_HZ 48000000 +#define I2C_HZ 0 //Not used + +#endif //MD_BOOTLOADER + +#endif //_MD_BOOTLOADER_H_ + diff --git a/tmk_core/protocol/arm_atsam/spi.c b/tmk_core/protocol/arm_atsam/spi.c new file mode 100644 index 000000000..6036a9220 --- /dev/null +++ b/tmk_core/protocol/arm_atsam/spi.c @@ -0,0 +1,90 @@ +/* +Copyright 2018 Massdrop Inc. + +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 . +*/ + +#include "arm_atsam_protocol.h" + +Srdata_t srdata; + +void SPI_WriteSRData(void) +{ + uint16_t timeout; + + SC2_RCLCK_LO; + + timeout = 50000; + while (!(SCSPI->SPI.INTFLAG.bit.DRE) && --timeout) { DBGC(DC_SPI_WRITE_DRE); } + + SCSPI->SPI.DATA.bit.DATA = srdata.reg & 0xFF; //Shift in bits 7-0 + timeout = 50000; + while (!(SCSPI->SPI.INTFLAG.bit.TXC) && --timeout) { DBGC(DC_SPI_WRITE_TXC_1); } + + SCSPI->SPI.DATA.bit.DATA = (srdata.reg >> 8) & 0xFF; //Shift in bits 15-8 + timeout = 50000; + while (!(SCSPI->SPI.INTFLAG.bit.TXC) && --timeout) { DBGC(DC_SPI_WRITE_TXC_2); } + + SC2_RCLCK_HI; +} + +void SPI_Init(void) +{ + uint32_t timeout; + + DBGC(DC_SPI_INIT_BEGIN); + + CLK_set_spi_freq(CHAN_SERCOM_SPI, FREQ_SPI_DEFAULT); + + PORT->Group[0].PMUX[6].bit.PMUXE = 2; + PORT->Group[0].PMUX[6].bit.PMUXO = 2; + PORT->Group[0].PINCFG[12].bit.PMUXEN = 1; + PORT->Group[0].PINCFG[13].bit.PMUXEN = 1; + + //Configure Shift Registers + SC2_DIRSET; + SC2_RCLCK_HI; + SC2_OE_DIS; + + SCSPI->SPI.CTRLA.bit.DORD = 1; + SCSPI->SPI.CTRLA.bit.CPOL = 1; + SCSPI->SPI.CTRLA.bit.CPHA = 1; + SCSPI->SPI.CTRLA.bit.DIPO = 3; + SCSPI->SPI.CTRLA.bit.MODE = 3; //master + + SCSPI->SPI.CTRLA.bit.ENABLE = 1; + timeout = 50000; + while (SCSPI->SPI.SYNCBUSY.bit.ENABLE && timeout--) { DBGC(DC_SPI_SYNC_ENABLING); } + + srdata.reg = 0; + srdata.bit.HUB_CONNECT = 0; + srdata.bit.HUB_RESET_N = 0; + srdata.bit.S_UP = 0; + srdata.bit.E_UP_N = 1; + srdata.bit.S_DN1 = 1; + srdata.bit.E_DN1_N = 1; + srdata.bit.E_VBUS_1 = 0; + srdata.bit.E_VBUS_2 = 0; + srdata.bit.SRC_1 = 1; + srdata.bit.SRC_2 = 1; + srdata.bit.IRST = 1; + srdata.bit.SDB_N = 0; + SPI_WriteSRData(); + + //Enable register output + SC2_OE_ENA; + + DBGC(DC_SPI_INIT_COMPLETE); +} + diff --git a/tmk_core/protocol/arm_atsam/spi.h b/tmk_core/protocol/arm_atsam/spi.h new file mode 100644 index 000000000..3412dfc36 --- /dev/null +++ b/tmk_core/protocol/arm_atsam/spi.h @@ -0,0 +1,63 @@ +/* +Copyright 2018 Massdrop Inc. + +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 . +*/ + +#ifndef _SPI_H_ +#define _SPI_H_ + +//TODO: PS: Should bring ports to keyboard configuration + +#define SCSPI SERCOM2 + +#define P14_DIR 0x00004000 /* PIN14 DIR Bit */ +#define P14_OUT 0x00004000 /* PIN14 OUT Bit */ +#define P15_DIR 0x00008000 /* PIN15 DIR Bit */ +#define P15_OUT 0x00008000 /* PIN15 OUT Bit */ + +#define SC2_RCLCK_LO REG_PORT_OUTCLR1 = P14_OUT /* PB14 Low, SC2_RCLCK Low */ +#define SC2_RCLCK_HI REG_PORT_OUTSET1 = P14_OUT /* PB14 High, SC2_RCLCK High */ +#define SC2_OE_ENA REG_PORT_OUTCLR1 = P15_OUT /* PB15 Low, SC2_OE_N Low (Shift register enabled) */ +#define SC2_OE_DIS REG_PORT_OUTSET1 = P15_OUT /* PB15 High, SC2_OE_N High (Shift register disabled) */ +#define SC2_DIRSET REG_PORT_DIRSET1 = P14_DIR | P15_DIR; /* PB14 PB15 OUT */ + +typedef union { + struct { + uint16_t RSVD4:1; /*!< bit: 0 */ + uint16_t RSVD3:1; /*!< bit: 1 */ + uint16_t RSVD2:1; /*!< bit: 2 */ + uint16_t RSVD1:1; /*!< bit: 3 */ + uint16_t SDB_N:1; /*!< bit: 4 SHUTDOWN THE CHIP WHEN 0, RUN WHEN 1 */ + uint16_t IRST:1; /*!< bit: 5 RESET THE IS3733 I2C WHEN 1, RUN WHEN 0 */ + uint16_t SRC_2:1; /*!< bit: 6 ADVERTISE A SOURCE TO USBC-2 CC */ + uint16_t SRC_1:1; /*!< bit: 7 ADVERTISE A SOURCE TO USBC-1 CC */ + uint16_t E_VBUS_2:1; /*!< bit: 8 ENABLE 5V OUT TO USBC-2 WHEN 1 */ + uint16_t E_VBUS_1:1; /*!< bit: 9 ENABLE 5V OUT TO USBC-1 WHEN 1 */ + uint16_t E_DN1_N:1; /*!< bit: 10 ENABLE DN1 1:2 MUX WHEN 0 */ + uint16_t S_DN1:1; /*!< bit: 11 SELECT DN1 PATH 0:USBC-1, 1:USBC-2 */ + uint16_t E_UP_N:1; /*!< bit: 12 ENABLE SUP 1:2 MUX WHEN 0 */ + uint16_t S_UP:1; /*!< bit: 13 SELECT UP PATH 0:USBC-1, 1:USBC-2 */ + uint16_t HUB_RESET_N:1; /*!< bit: 14 RESET USB HUB WHEN 0, RUN WHEN 1 */ + uint16_t HUB_CONNECT:1; /*!< bit: 15 SIGNAL VBUS CONNECT TO USB HUB WHEN 1 */ + } bit; /*!< Structure used for bit access */ + uint16_t reg; /*!< Type used for register access */ +} Srdata_t; + +extern Srdata_t srdata; + +void SPI_WriteSRData(void); +void SPI_Init(void); + +#endif //_SPI_H_ diff --git a/tmk_core/protocol/arm_atsam/startup.c b/tmk_core/protocol/arm_atsam/startup.c new file mode 100644 index 000000000..a62d02f1c --- /dev/null +++ b/tmk_core/protocol/arm_atsam/startup.c @@ -0,0 +1,548 @@ +/** + * \file + * + * \brief gcc starttup file for SAMD51 + * + * Copyright (c) 2017 Microchip Technology Inc. + * + * \asf_license_start + * + * \page License + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 Licence 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. + * + * \asf_license_stop + * + */ + +#include "samd51.h" + +/* Initialize segments */ +extern uint32_t _sfixed; +extern uint32_t _efixed; +extern uint32_t _etext; +extern uint32_t _srelocate; +extern uint32_t _erelocate; +extern uint32_t _szero; +extern uint32_t _ezero; +extern uint32_t _sstack; +extern uint32_t _estack; + +/** \cond DOXYGEN_SHOULD_SKIP_THIS */ +int main(void); +/** \endcond */ + +void __libc_init_array(void); + +/* Default empty handler */ +void Dummy_Handler(void); + +/* Cortex-M4 core handlers */ +void NMI_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); +void HardFault_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); +void MemManage_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); +void BusFault_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); +void UsageFault_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); +void SVC_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); +void DebugMon_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); +void PendSV_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); +void SysTick_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); + +/* Peripherals handlers */ +void PM_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); +void MCLK_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); +void OSCCTRL_0_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* OSCCTRL_XOSCFAIL_0, OSCCTRL_XOSCRDY_0 */ +void OSCCTRL_1_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* OSCCTRL_XOSCFAIL_1, OSCCTRL_XOSCRDY_1 */ +void OSCCTRL_2_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* OSCCTRL_DFLLLOCKC, OSCCTRL_DFLLLOCKF, OSCCTRL_DFLLOOB, OSCCTRL_DFLLRCS, OSCCTRL_DFLLRDY */ +void OSCCTRL_3_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* OSCCTRL_DPLLLCKF_0, OSCCTRL_DPLLLCKR_0, OSCCTRL_DPLLLDRTO_0, OSCCTRL_DPLLLTO_0 */ +void OSCCTRL_4_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* OSCCTRL_DPLLLCKF_1, OSCCTRL_DPLLLCKR_1, OSCCTRL_DPLLLDRTO_1, OSCCTRL_DPLLLTO_1 */ +void OSC32KCTRL_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); +void SUPC_0_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* SUPC_B12SRDY, SUPC_B33SRDY, SUPC_BOD12RDY, SUPC_BOD33RDY, SUPC_VCORERDY, SUPC_VREGRDY */ +void SUPC_1_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* SUPC_BOD12DET, SUPC_BOD33DET */ +void WDT_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); +void RTC_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); +void EIC_0_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* EIC_EXTINT_0 */ +void EIC_1_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* EIC_EXTINT_1 */ +void EIC_2_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* EIC_EXTINT_2 */ +void EIC_3_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* EIC_EXTINT_3 */ +void EIC_4_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* EIC_EXTINT_4 */ +void EIC_5_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* EIC_EXTINT_5 */ +void EIC_6_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* EIC_EXTINT_6 */ +void EIC_7_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* EIC_EXTINT_7 */ +void EIC_8_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* EIC_EXTINT_8 */ +void EIC_9_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* EIC_EXTINT_9 */ +void EIC_10_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* EIC_EXTINT_10 */ +void EIC_11_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* EIC_EXTINT_11 */ +void EIC_12_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* EIC_EXTINT_12 */ +void EIC_13_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* EIC_EXTINT_13 */ +void EIC_14_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* EIC_EXTINT_14 */ +void EIC_15_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* EIC_EXTINT_15 */ +void FREQM_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); +void NVMCTRL_0_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* NVMCTRL_0, NVMCTRL_1, NVMCTRL_2, NVMCTRL_3, NVMCTRL_4, NVMCTRL_5, NVMCTRL_6, NVMCTRL_7 */ +void NVMCTRL_1_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* NVMCTRL_10, NVMCTRL_8, NVMCTRL_9 */ +void DMAC_0_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* DMAC_SUSP_0, DMAC_TCMPL_0, DMAC_TERR_0 */ +void DMAC_1_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* DMAC_SUSP_1, DMAC_TCMPL_1, DMAC_TERR_1 */ +void DMAC_2_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* DMAC_SUSP_2, DMAC_TCMPL_2, DMAC_TERR_2 */ +void DMAC_3_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* DMAC_SUSP_3, DMAC_TCMPL_3, DMAC_TERR_3 */ +void DMAC_4_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* DMAC_SUSP_10, DMAC_SUSP_11, DMAC_SUSP_12, DMAC_SUSP_13, DMAC_SUSP_14, DMAC_SUSP_15, DMAC_SUSP_16, DMAC_SUSP_17, DMAC_SUSP_18, DMAC_SUSP_19, DMAC_SUSP_20, DMAC_SUSP_21, DMAC_SUSP_22, DMAC_SUSP_23, DMAC_SUSP_24, DMAC_SUSP_25, DMAC_SUSP_26, DMAC_SUSP_27, DMAC_SUSP_28, DMAC_SUSP_29, DMAC_SUSP_30, DMAC_SUSP_31, DMAC_SUSP_4, DMAC_SUSP_5, DMAC_SUSP_6, DMAC_SUSP_7, DMAC_SUSP_8, DMAC_SUSP_9, DMAC_TCMPL_10, DMAC_TCMPL_11, DMAC_TCMPL_12, DMAC_TCMPL_13, DMAC_TCMPL_14, DMAC_TCMPL_15, DMAC_TCMPL_16, DMAC_TCMPL_17, DMAC_TCMPL_18, DMAC_TCMPL_19, DMAC_TCMPL_20, DMAC_TCMPL_21, DMAC_TCMPL_22, DMAC_TCMPL_23, DMAC_TCMPL_24, DMAC_TCMPL_25, DMAC_TCMPL_26, DMAC_TCMPL_27, DMAC_TCMPL_28, DMAC_TCMPL_29, DMAC_TCMPL_30, DMAC_TCMPL_31, DMAC_TCMPL_4, DMAC_TCMPL_5, DMAC_TCMPL_6, DMAC_TCMPL_7, DMAC_TCMPL_8, DMAC_TCMPL_9, DMAC_TERR_10, DMAC_TERR_11, DMAC_TERR_12, DMAC_TERR_13, DMAC_TERR_14, DMAC_TERR_15, DMAC_TERR_16, DMAC_TERR_17, DMAC_TERR_18, DMAC_TERR_19, DMAC_TERR_20, DMAC_TERR_21, DMAC_TERR_22, DMAC_TERR_23, DMAC_TERR_24, DMAC_TERR_25, DMAC_TERR_26, DMAC_TERR_27, DMAC_TERR_28, DMAC_TERR_29, DMAC_TERR_30, DMAC_TERR_31, DMAC_TERR_4, DMAC_TERR_5, DMAC_TERR_6, DMAC_TERR_7, DMAC_TERR_8, DMAC_TERR_9 */ +void EVSYS_0_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* EVSYS_EVD_0, EVSYS_OVR_0 */ +void EVSYS_1_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* EVSYS_EVD_1, EVSYS_OVR_1 */ +void EVSYS_2_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* EVSYS_EVD_2, EVSYS_OVR_2 */ +void EVSYS_3_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* EVSYS_EVD_3, EVSYS_OVR_3 */ +void EVSYS_4_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* EVSYS_EVD_10, EVSYS_EVD_11, EVSYS_EVD_4, EVSYS_EVD_5, EVSYS_EVD_6, EVSYS_EVD_7, EVSYS_EVD_8, EVSYS_EVD_9, EVSYS_OVR_10, EVSYS_OVR_11, EVSYS_OVR_4, EVSYS_OVR_5, EVSYS_OVR_6, EVSYS_OVR_7, EVSYS_OVR_8, EVSYS_OVR_9 */ +void PAC_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); +void TAL_0_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* TAL_BRK */ +void TAL_1_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* TAL_IPS_0, TAL_IPS_1 */ +void RAMECC_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); +void SERCOM0_0_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* SERCOM0_0 */ +void SERCOM0_1_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* SERCOM0_1 */ +void SERCOM0_2_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* SERCOM0_2 */ +void SERCOM0_3_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* SERCOM0_3, SERCOM0_4, SERCOM0_5, SERCOM0_6 */ +void SERCOM1_0_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* SERCOM1_0 */ +void SERCOM1_1_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* SERCOM1_1 */ +void SERCOM1_2_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* SERCOM1_2 */ +void SERCOM1_3_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* SERCOM1_3, SERCOM1_4, SERCOM1_5, SERCOM1_6 */ +void SERCOM2_0_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* SERCOM2_0 */ +void SERCOM2_1_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* SERCOM2_1 */ +void SERCOM2_2_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* SERCOM2_2 */ +void SERCOM2_3_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* SERCOM2_3, SERCOM2_4, SERCOM2_5, SERCOM2_6 */ +void SERCOM3_0_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* SERCOM3_0 */ +void SERCOM3_1_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* SERCOM3_1 */ +void SERCOM3_2_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* SERCOM3_2 */ +void SERCOM3_3_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* SERCOM3_3, SERCOM3_4, SERCOM3_5, SERCOM3_6 */ +#ifdef ID_SERCOM4 +void SERCOM4_0_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* SERCOM4_0 */ +void SERCOM4_1_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* SERCOM4_1 */ +void SERCOM4_2_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* SERCOM4_2 */ +void SERCOM4_3_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* SERCOM4_3, SERCOM4_4, SERCOM4_5, SERCOM4_6 */ +#endif +#ifdef ID_SERCOM5 +void SERCOM5_0_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* SERCOM5_0 */ +void SERCOM5_1_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* SERCOM5_1 */ +void SERCOM5_2_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* SERCOM5_2 */ +void SERCOM5_3_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* SERCOM5_3, SERCOM5_4, SERCOM5_5, SERCOM5_6 */ +#endif +#ifdef ID_SERCOM6 +void SERCOM6_0_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* SERCOM6_0 */ +void SERCOM6_1_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* SERCOM6_1 */ +void SERCOM6_2_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* SERCOM6_2 */ +void SERCOM6_3_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* SERCOM6_3, SERCOM6_4, SERCOM6_5, SERCOM6_6 */ +#endif +#ifdef ID_SERCOM7 +void SERCOM7_0_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* SERCOM7_0 */ +void SERCOM7_1_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* SERCOM7_1 */ +void SERCOM7_2_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* SERCOM7_2 */ +void SERCOM7_3_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* SERCOM7_3, SERCOM7_4, SERCOM7_5, SERCOM7_6 */ +#endif +#ifdef ID_CAN0 +void CAN0_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); +#endif +#ifdef ID_CAN1 +void CAN1_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); +#endif +#ifdef ID_USB +void USB_0_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* USB_EORSM_DNRSM, USB_EORST_RST, USB_LPMSUSP_DDISC, USB_LPM_DCONN, USB_MSOF, USB_RAMACER, USB_RXSTP_TXSTP_0, USB_RXSTP_TXSTP_1, USB_RXSTP_TXSTP_2, USB_RXSTP_TXSTP_3, USB_RXSTP_TXSTP_4, USB_RXSTP_TXSTP_5, USB_RXSTP_TXSTP_6, USB_RXSTP_TXSTP_7, USB_STALL0_STALL_0, USB_STALL0_STALL_1, USB_STALL0_STALL_2, USB_STALL0_STALL_3, USB_STALL0_STALL_4, USB_STALL0_STALL_5, USB_STALL0_STALL_6, USB_STALL0_STALL_7, USB_STALL1_0, USB_STALL1_1, USB_STALL1_2, USB_STALL1_3, USB_STALL1_4, USB_STALL1_5, USB_STALL1_6, USB_STALL1_7, USB_SUSPEND, USB_TRFAIL0_TRFAIL_0, USB_TRFAIL0_TRFAIL_1, USB_TRFAIL0_TRFAIL_2, USB_TRFAIL0_TRFAIL_3, USB_TRFAIL0_TRFAIL_4, USB_TRFAIL0_TRFAIL_5, USB_TRFAIL0_TRFAIL_6, USB_TRFAIL0_TRFAIL_7, USB_TRFAIL1_PERR_0, USB_TRFAIL1_PERR_1, USB_TRFAIL1_PERR_2, USB_TRFAIL1_PERR_3, USB_TRFAIL1_PERR_4, USB_TRFAIL1_PERR_5, USB_TRFAIL1_PERR_6, USB_TRFAIL1_PERR_7, USB_UPRSM, USB_WAKEUP */ +void USB_1_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* USB_SOF_HSOF */ +void USB_2_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* USB_TRCPT0_0, USB_TRCPT0_1, USB_TRCPT0_2, USB_TRCPT0_3, USB_TRCPT0_4, USB_TRCPT0_5, USB_TRCPT0_6, USB_TRCPT0_7 */ +void USB_3_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* USB_TRCPT1_0, USB_TRCPT1_1, USB_TRCPT1_2, USB_TRCPT1_3, USB_TRCPT1_4, USB_TRCPT1_5, USB_TRCPT1_6, USB_TRCPT1_7 */ +#endif +#ifdef ID_GMAC +void GMAC_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); +#endif +void TCC0_0_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* TCC0_CNT_A, TCC0_DFS_A, TCC0_ERR_A, TCC0_FAULT0_A, TCC0_FAULT1_A, TCC0_FAULTA_A, TCC0_FAULTB_A, TCC0_OVF, TCC0_TRG, TCC0_UFS_A */ +void TCC0_1_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* TCC0_MC_0 */ +void TCC0_2_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* TCC0_MC_1 */ +void TCC0_3_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* TCC0_MC_2 */ +void TCC0_4_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* TCC0_MC_3 */ +void TCC0_5_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* TCC0_MC_4 */ +void TCC0_6_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* TCC0_MC_5 */ +void TCC1_0_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* TCC1_CNT_A, TCC1_DFS_A, TCC1_ERR_A, TCC1_FAULT0_A, TCC1_FAULT1_A, TCC1_FAULTA_A, TCC1_FAULTB_A, TCC1_OVF, TCC1_TRG, TCC1_UFS_A */ +void TCC1_1_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* TCC1_MC_0 */ +void TCC1_2_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* TCC1_MC_1 */ +void TCC1_3_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* TCC1_MC_2 */ +void TCC1_4_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* TCC1_MC_3 */ +void TCC2_0_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* TCC2_CNT_A, TCC2_DFS_A, TCC2_ERR_A, TCC2_FAULT0_A, TCC2_FAULT1_A, TCC2_FAULTA_A, TCC2_FAULTB_A, TCC2_OVF, TCC2_TRG, TCC2_UFS_A */ +void TCC2_1_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* TCC2_MC_0 */ +void TCC2_2_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* TCC2_MC_1 */ +void TCC2_3_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* TCC2_MC_2 */ +#ifdef ID_TCC3 +void TCC3_0_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* TCC3_CNT_A, TCC3_DFS_A, TCC3_ERR_A, TCC3_FAULT0_A, TCC3_FAULT1_A, TCC3_FAULTA_A, TCC3_FAULTB_A, TCC3_OVF, TCC3_TRG, TCC3_UFS_A */ +void TCC3_1_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* TCC3_MC_0 */ +void TCC3_2_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* TCC3_MC_1 */ +#endif +#ifdef ID_TCC4 +void TCC4_0_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* TCC4_CNT_A, TCC4_DFS_A, TCC4_ERR_A, TCC4_FAULT0_A, TCC4_FAULT1_A, TCC4_FAULTA_A, TCC4_FAULTB_A, TCC4_OVF, TCC4_TRG, TCC4_UFS_A */ +void TCC4_1_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* TCC4_MC_0 */ +void TCC4_2_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* TCC4_MC_1 */ +#endif +void TC0_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); +void TC1_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); +void TC2_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); +void TC3_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); +#ifdef ID_TC4 +void TC4_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); +#endif +#ifdef ID_TC5 +void TC5_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); +#endif +#ifdef ID_TC6 +void TC6_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); +#endif +#ifdef ID_TC7 +void TC7_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); +#endif +void PDEC_0_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* PDEC_DIR_A, PDEC_ERR_A, PDEC_OVF, PDEC_VLC_A */ +void PDEC_1_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* PDEC_MC_0 */ +void PDEC_2_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* PDEC_MC_1 */ +void ADC0_0_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* ADC0_OVERRUN, ADC0_WINMON */ +void ADC0_1_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* ADC0_RESRDY */ +void ADC1_0_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* ADC1_OVERRUN, ADC1_WINMON */ +void ADC1_1_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* ADC1_RESRDY */ +void AC_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); +void DAC_0_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* DAC_OVERRUN_A_0, DAC_OVERRUN_A_1, DAC_UNDERRUN_A_0, DAC_UNDERRUN_A_1 */ +void DAC_1_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* DAC_EMPTY_0 */ +void DAC_2_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* DAC_EMPTY_1 */ +void DAC_3_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* DAC_RESRDY_0 */ +void DAC_4_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); /* DAC_RESRDY_1 */ +#ifdef ID_I2S +void I2S_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); +#endif +void PCC_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); +void AES_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); +void TRNG_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); +#ifdef ID_ICM +void ICM_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); +#endif +#ifdef ID_PUKCC +void PUKCC_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); +#endif +void QSPI_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); +#ifdef ID_SDHC0 +void SDHC0_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); +#endif +#ifdef ID_SDHC1 +void SDHC1_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); +#endif + +/* Exception Table */ +__attribute__ ((section(".vectors"))) +const DeviceVectors exception_table = { + + /* Configure Initial Stack Pointer, using linker-generated symbols */ + .pvStack = (void*) (&_estack), + + .pfnReset_Handler = (void*) Reset_Handler, + .pfnNMI_Handler = (void*) NMI_Handler, + .pfnHardFault_Handler = (void*) HardFault_Handler, + .pfnMemManage_Handler = (void*) MemManage_Handler, + .pfnBusFault_Handler = (void*) BusFault_Handler, + .pfnUsageFault_Handler = (void*) UsageFault_Handler, + .pvReservedM9 = (void*) (0UL), /* Reserved */ + .pvReservedM8 = (void*) (0UL), /* Reserved */ + .pvReservedM7 = (void*) (0UL), /* Reserved */ + .pvReservedM6 = (void*) (0UL), /* Reserved */ + .pfnSVC_Handler = (void*) SVC_Handler, + .pfnDebugMon_Handler = (void*) DebugMon_Handler, + .pvReservedM3 = (void*) (0UL), /* Reserved */ + .pfnPendSV_Handler = (void*) PendSV_Handler, + .pfnSysTick_Handler = (void*) SysTick_Handler, + + /* Configurable interrupts */ + .pfnPM_Handler = (void*) PM_Handler, /* 0 Power Manager */ + .pfnMCLK_Handler = (void*) MCLK_Handler, /* 1 Main Clock */ + .pfnOSCCTRL_0_Handler = (void*) OSCCTRL_0_Handler, /* 2 OSCCTRL_XOSCFAIL_0, OSCCTRL_XOSCRDY_0 */ + .pfnOSCCTRL_1_Handler = (void*) OSCCTRL_1_Handler, /* 3 OSCCTRL_XOSCFAIL_1, OSCCTRL_XOSCRDY_1 */ + .pfnOSCCTRL_2_Handler = (void*) OSCCTRL_2_Handler, /* 4 OSCCTRL_DFLLLOCKC, OSCCTRL_DFLLLOCKF, OSCCTRL_DFLLOOB, OSCCTRL_DFLLRCS, OSCCTRL_DFLLRDY */ + .pfnOSCCTRL_3_Handler = (void*) OSCCTRL_3_Handler, /* 5 OSCCTRL_DPLLLCKF_0, OSCCTRL_DPLLLCKR_0, OSCCTRL_DPLLLDRTO_0, OSCCTRL_DPLLLTO_0 */ + .pfnOSCCTRL_4_Handler = (void*) OSCCTRL_4_Handler, /* 6 OSCCTRL_DPLLLCKF_1, OSCCTRL_DPLLLCKR_1, OSCCTRL_DPLLLDRTO_1, OSCCTRL_DPLLLTO_1 */ + .pfnOSC32KCTRL_Handler = (void*) OSC32KCTRL_Handler, /* 7 32kHz Oscillators Control */ + .pfnSUPC_0_Handler = (void*) SUPC_0_Handler, /* 8 SUPC_B12SRDY, SUPC_B33SRDY, SUPC_BOD12RDY, SUPC_BOD33RDY, SUPC_VCORERDY, SUPC_VREGRDY */ + .pfnSUPC_1_Handler = (void*) SUPC_1_Handler, /* 9 SUPC_BOD12DET, SUPC_BOD33DET */ + .pfnWDT_Handler = (void*) WDT_Handler, /* 10 Watchdog Timer */ + .pfnRTC_Handler = (void*) RTC_Handler, /* 11 Real-Time Counter */ + .pfnEIC_0_Handler = (void*) EIC_0_Handler, /* 12 EIC_EXTINT_0 */ + .pfnEIC_1_Handler = (void*) EIC_1_Handler, /* 13 EIC_EXTINT_1 */ + .pfnEIC_2_Handler = (void*) EIC_2_Handler, /* 14 EIC_EXTINT_2 */ + .pfnEIC_3_Handler = (void*) EIC_3_Handler, /* 15 EIC_EXTINT_3 */ + .pfnEIC_4_Handler = (void*) EIC_4_Handler, /* 16 EIC_EXTINT_4 */ + .pfnEIC_5_Handler = (void*) EIC_5_Handler, /* 17 EIC_EXTINT_5 */ + .pfnEIC_6_Handler = (void*) EIC_6_Handler, /* 18 EIC_EXTINT_6 */ + .pfnEIC_7_Handler = (void*) EIC_7_Handler, /* 19 EIC_EXTINT_7 */ + .pfnEIC_8_Handler = (void*) EIC_8_Handler, /* 20 EIC_EXTINT_8 */ + .pfnEIC_9_Handler = (void*) EIC_9_Handler, /* 21 EIC_EXTINT_9 */ + .pfnEIC_10_Handler = (void*) EIC_10_Handler, /* 22 EIC_EXTINT_10 */ + .pfnEIC_11_Handler = (void*) EIC_11_Handler, /* 23 EIC_EXTINT_11 */ + .pfnEIC_12_Handler = (void*) EIC_12_Handler, /* 24 EIC_EXTINT_12 */ + .pfnEIC_13_Handler = (void*) EIC_13_Handler, /* 25 EIC_EXTINT_13 */ + .pfnEIC_14_Handler = (void*) EIC_14_Handler, /* 26 EIC_EXTINT_14 */ + .pfnEIC_15_Handler = (void*) EIC_15_Handler, /* 27 EIC_EXTINT_15 */ + .pfnFREQM_Handler = (void*) FREQM_Handler, /* 28 Frequency Meter */ + .pfnNVMCTRL_0_Handler = (void*) NVMCTRL_0_Handler, /* 29 NVMCTRL_0, NVMCTRL_1, NVMCTRL_2, NVMCTRL_3, NVMCTRL_4, NVMCTRL_5, NVMCTRL_6, NVMCTRL_7 */ + .pfnNVMCTRL_1_Handler = (void*) NVMCTRL_1_Handler, /* 30 NVMCTRL_10, NVMCTRL_8, NVMCTRL_9 */ + .pfnDMAC_0_Handler = (void*) DMAC_0_Handler, /* 31 DMAC_SUSP_0, DMAC_TCMPL_0, DMAC_TERR_0 */ + .pfnDMAC_1_Handler = (void*) DMAC_1_Handler, /* 32 DMAC_SUSP_1, DMAC_TCMPL_1, DMAC_TERR_1 */ + .pfnDMAC_2_Handler = (void*) DMAC_2_Handler, /* 33 DMAC_SUSP_2, DMAC_TCMPL_2, DMAC_TERR_2 */ + .pfnDMAC_3_Handler = (void*) DMAC_3_Handler, /* 34 DMAC_SUSP_3, DMAC_TCMPL_3, DMAC_TERR_3 */ + .pfnDMAC_4_Handler = (void*) DMAC_4_Handler, /* 35 DMAC_SUSP_10, DMAC_SUSP_11, DMAC_SUSP_12, DMAC_SUSP_13, DMAC_SUSP_14, DMAC_SUSP_15, DMAC_SUSP_16, DMAC_SUSP_17, DMAC_SUSP_18, DMAC_SUSP_19, DMAC_SUSP_20, DMAC_SUSP_21, DMAC_SUSP_22, DMAC_SUSP_23, DMAC_SUSP_24, DMAC_SUSP_25, DMAC_SUSP_26, DMAC_SUSP_27, DMAC_SUSP_28, DMAC_SUSP_29, DMAC_SUSP_30, DMAC_SUSP_31, DMAC_SUSP_4, DMAC_SUSP_5, DMAC_SUSP_6, DMAC_SUSP_7, DMAC_SUSP_8, DMAC_SUSP_9, DMAC_TCMPL_10, DMAC_TCMPL_11, DMAC_TCMPL_12, DMAC_TCMPL_13, DMAC_TCMPL_14, DMAC_TCMPL_15, DMAC_TCMPL_16, DMAC_TCMPL_17, DMAC_TCMPL_18, DMAC_TCMPL_19, DMAC_TCMPL_20, DMAC_TCMPL_21, DMAC_TCMPL_22, DMAC_TCMPL_23, DMAC_TCMPL_24, DMAC_TCMPL_25, DMAC_TCMPL_26, DMAC_TCMPL_27, DMAC_TCMPL_28, DMAC_TCMPL_29, DMAC_TCMPL_30, DMAC_TCMPL_31, DMAC_TCMPL_4, DMAC_TCMPL_5, DMAC_TCMPL_6, DMAC_TCMPL_7, DMAC_TCMPL_8, DMAC_TCMPL_9, DMAC_TERR_10, DMAC_TERR_11, DMAC_TERR_12, DMAC_TERR_13, DMAC_TERR_14, DMAC_TERR_15, DMAC_TERR_16, DMAC_TERR_17, DMAC_TERR_18, DMAC_TERR_19, DMAC_TERR_20, DMAC_TERR_21, DMAC_TERR_22, DMAC_TERR_23, DMAC_TERR_24, DMAC_TERR_25, DMAC_TERR_26, DMAC_TERR_27, DMAC_TERR_28, DMAC_TERR_29, DMAC_TERR_30, DMAC_TERR_31, DMAC_TERR_4, DMAC_TERR_5, DMAC_TERR_6, DMAC_TERR_7, DMAC_TERR_8, DMAC_TERR_9 */ + .pfnEVSYS_0_Handler = (void*) EVSYS_0_Handler, /* 36 EVSYS_EVD_0, EVSYS_OVR_0 */ + .pfnEVSYS_1_Handler = (void*) EVSYS_1_Handler, /* 37 EVSYS_EVD_1, EVSYS_OVR_1 */ + .pfnEVSYS_2_Handler = (void*) EVSYS_2_Handler, /* 38 EVSYS_EVD_2, EVSYS_OVR_2 */ + .pfnEVSYS_3_Handler = (void*) EVSYS_3_Handler, /* 39 EVSYS_EVD_3, EVSYS_OVR_3 */ + .pfnEVSYS_4_Handler = (void*) EVSYS_4_Handler, /* 40 EVSYS_EVD_10, EVSYS_EVD_11, EVSYS_EVD_4, EVSYS_EVD_5, EVSYS_EVD_6, EVSYS_EVD_7, EVSYS_EVD_8, EVSYS_EVD_9, EVSYS_OVR_10, EVSYS_OVR_11, EVSYS_OVR_4, EVSYS_OVR_5, EVSYS_OVR_6, EVSYS_OVR_7, EVSYS_OVR_8, EVSYS_OVR_9 */ + .pfnPAC_Handler = (void*) PAC_Handler, /* 41 Peripheral Access Controller */ + .pfnTAL_0_Handler = (void*) TAL_0_Handler, /* 42 TAL_BRK */ + .pfnTAL_1_Handler = (void*) TAL_1_Handler, /* 43 TAL_IPS_0, TAL_IPS_1 */ + .pvReserved44 = (void*) (0UL), /* 44 Reserved */ + .pfnRAMECC_Handler = (void*) RAMECC_Handler, /* 45 RAM ECC */ + .pfnSERCOM0_0_Handler = (void*) SERCOM0_0_Handler, /* 46 SERCOM0_0 */ + .pfnSERCOM0_1_Handler = (void*) SERCOM0_1_Handler, /* 47 SERCOM0_1 */ + .pfnSERCOM0_2_Handler = (void*) SERCOM0_2_Handler, /* 48 SERCOM0_2 */ + .pfnSERCOM0_3_Handler = (void*) SERCOM0_3_Handler, /* 49 SERCOM0_3, SERCOM0_4, SERCOM0_5, SERCOM0_6 */ + .pfnSERCOM1_0_Handler = (void*) SERCOM1_0_Handler, /* 50 SERCOM1_0 */ + .pfnSERCOM1_1_Handler = (void*) SERCOM1_1_Handler, /* 51 SERCOM1_1 */ + .pfnSERCOM1_2_Handler = (void*) SERCOM1_2_Handler, /* 52 SERCOM1_2 */ + .pfnSERCOM1_3_Handler = (void*) SERCOM1_3_Handler, /* 53 SERCOM1_3, SERCOM1_4, SERCOM1_5, SERCOM1_6 */ + .pfnSERCOM2_0_Handler = (void*) SERCOM2_0_Handler, /* 54 SERCOM2_0 */ + .pfnSERCOM2_1_Handler = (void*) SERCOM2_1_Handler, /* 55 SERCOM2_1 */ + .pfnSERCOM2_2_Handler = (void*) SERCOM2_2_Handler, /* 56 SERCOM2_2 */ + .pfnSERCOM2_3_Handler = (void*) SERCOM2_3_Handler, /* 57 SERCOM2_3, SERCOM2_4, SERCOM2_5, SERCOM2_6 */ + .pfnSERCOM3_0_Handler = (void*) SERCOM3_0_Handler, /* 58 SERCOM3_0 */ + .pfnSERCOM3_1_Handler = (void*) SERCOM3_1_Handler, /* 59 SERCOM3_1 */ + .pfnSERCOM3_2_Handler = (void*) SERCOM3_2_Handler, /* 60 SERCOM3_2 */ + .pfnSERCOM3_3_Handler = (void*) SERCOM3_3_Handler, /* 61 SERCOM3_3, SERCOM3_4, SERCOM3_5, SERCOM3_6 */ +#ifdef ID_SERCOM4 + .pfnSERCOM4_0_Handler = (void*) SERCOM4_0_Handler, /* 62 SERCOM4_0 */ + .pfnSERCOM4_1_Handler = (void*) SERCOM4_1_Handler, /* 63 SERCOM4_1 */ + .pfnSERCOM4_2_Handler = (void*) SERCOM4_2_Handler, /* 64 SERCOM4_2 */ + .pfnSERCOM4_3_Handler = (void*) SERCOM4_3_Handler, /* 65 SERCOM4_3, SERCOM4_4, SERCOM4_5, SERCOM4_6 */ +#else + .pvReserved62 = (void*) (0UL), /* 62 Reserved */ + .pvReserved63 = (void*) (0UL), /* 63 Reserved */ + .pvReserved64 = (void*) (0UL), /* 64 Reserved */ + .pvReserved65 = (void*) (0UL), /* 65 Reserved */ +#endif +#ifdef ID_SERCOM5 + .pfnSERCOM5_0_Handler = (void*) SERCOM5_0_Handler, /* 66 SERCOM5_0 */ + .pfnSERCOM5_1_Handler = (void*) SERCOM5_1_Handler, /* 67 SERCOM5_1 */ + .pfnSERCOM5_2_Handler = (void*) SERCOM5_2_Handler, /* 68 SERCOM5_2 */ + .pfnSERCOM5_3_Handler = (void*) SERCOM5_3_Handler, /* 69 SERCOM5_3, SERCOM5_4, SERCOM5_5, SERCOM5_6 */ +#else + .pvReserved66 = (void*) (0UL), /* 66 Reserved */ + .pvReserved67 = (void*) (0UL), /* 67 Reserved */ + .pvReserved68 = (void*) (0UL), /* 68 Reserved */ + .pvReserved69 = (void*) (0UL), /* 69 Reserved */ +#endif +#ifdef ID_SERCOM6 + .pfnSERCOM6_0_Handler = (void*) SERCOM6_0_Handler, /* 70 SERCOM6_0 */ + .pfnSERCOM6_1_Handler = (void*) SERCOM6_1_Handler, /* 71 SERCOM6_1 */ + .pfnSERCOM6_2_Handler = (void*) SERCOM6_2_Handler, /* 72 SERCOM6_2 */ + .pfnSERCOM6_3_Handler = (void*) SERCOM6_3_Handler, /* 73 SERCOM6_3, SERCOM6_4, SERCOM6_5, SERCOM6_6 */ +#else + .pvReserved70 = (void*) (0UL), /* 70 Reserved */ + .pvReserved71 = (void*) (0UL), /* 71 Reserved */ + .pvReserved72 = (void*) (0UL), /* 72 Reserved */ + .pvReserved73 = (void*) (0UL), /* 73 Reserved */ +#endif +#ifdef ID_SERCOM7 + .pfnSERCOM7_0_Handler = (void*) SERCOM7_0_Handler, /* 74 SERCOM7_0 */ + .pfnSERCOM7_1_Handler = (void*) SERCOM7_1_Handler, /* 75 SERCOM7_1 */ + .pfnSERCOM7_2_Handler = (void*) SERCOM7_2_Handler, /* 76 SERCOM7_2 */ + .pfnSERCOM7_3_Handler = (void*) SERCOM7_3_Handler, /* 77 SERCOM7_3, SERCOM7_4, SERCOM7_5, SERCOM7_6 */ +#else + .pvReserved74 = (void*) (0UL), /* 74 Reserved */ + .pvReserved75 = (void*) (0UL), /* 75 Reserved */ + .pvReserved76 = (void*) (0UL), /* 76 Reserved */ + .pvReserved77 = (void*) (0UL), /* 77 Reserved */ +#endif +#ifdef ID_CAN0 + .pfnCAN0_Handler = (void*) CAN0_Handler, /* 78 Control Area Network 0 */ +#else + .pvReserved78 = (void*) (0UL), /* 78 Reserved */ +#endif +#ifdef ID_CAN1 + .pfnCAN1_Handler = (void*) CAN1_Handler, /* 79 Control Area Network 1 */ +#else + .pvReserved79 = (void*) (0UL), /* 79 Reserved */ +#endif +#ifdef ID_USB + .pfnUSB_0_Handler = (void*) USB_0_Handler, /* 80 USB_EORSM_DNRSM, USB_EORST_RST, USB_LPMSUSP_DDISC, USB_LPM_DCONN, USB_MSOF, USB_RAMACER, USB_RXSTP_TXSTP_0, USB_RXSTP_TXSTP_1, USB_RXSTP_TXSTP_2, USB_RXSTP_TXSTP_3, USB_RXSTP_TXSTP_4, USB_RXSTP_TXSTP_5, USB_RXSTP_TXSTP_6, USB_RXSTP_TXSTP_7, USB_STALL0_STALL_0, USB_STALL0_STALL_1, USB_STALL0_STALL_2, USB_STALL0_STALL_3, USB_STALL0_STALL_4, USB_STALL0_STALL_5, USB_STALL0_STALL_6, USB_STALL0_STALL_7, USB_STALL1_0, USB_STALL1_1, USB_STALL1_2, USB_STALL1_3, USB_STALL1_4, USB_STALL1_5, USB_STALL1_6, USB_STALL1_7, USB_SUSPEND, USB_TRFAIL0_TRFAIL_0, USB_TRFAIL0_TRFAIL_1, USB_TRFAIL0_TRFAIL_2, USB_TRFAIL0_TRFAIL_3, USB_TRFAIL0_TRFAIL_4, USB_TRFAIL0_TRFAIL_5, USB_TRFAIL0_TRFAIL_6, USB_TRFAIL0_TRFAIL_7, USB_TRFAIL1_PERR_0, USB_TRFAIL1_PERR_1, USB_TRFAIL1_PERR_2, USB_TRFAIL1_PERR_3, USB_TRFAIL1_PERR_4, USB_TRFAIL1_PERR_5, USB_TRFAIL1_PERR_6, USB_TRFAIL1_PERR_7, USB_UPRSM, USB_WAKEUP */ + .pfnUSB_1_Handler = (void*) USB_1_Handler, /* 81 USB_SOF_HSOF */ + .pfnUSB_2_Handler = (void*) USB_2_Handler, /* 82 USB_TRCPT0_0, USB_TRCPT0_1, USB_TRCPT0_2, USB_TRCPT0_3, USB_TRCPT0_4, USB_TRCPT0_5, USB_TRCPT0_6, USB_TRCPT0_7 */ + .pfnUSB_3_Handler = (void*) USB_3_Handler, /* 83 USB_TRCPT1_0, USB_TRCPT1_1, USB_TRCPT1_2, USB_TRCPT1_3, USB_TRCPT1_4, USB_TRCPT1_5, USB_TRCPT1_6, USB_TRCPT1_7 */ +#else + .pvReserved80 = (void*) (0UL), /* 80 Reserved */ + .pvReserved81 = (void*) (0UL), /* 81 Reserved */ + .pvReserved82 = (void*) (0UL), /* 82 Reserved */ + .pvReserved83 = (void*) (0UL), /* 83 Reserved */ +#endif +#ifdef ID_GMAC + .pfnGMAC_Handler = (void*) GMAC_Handler, /* 84 Ethernet MAC */ +#else + .pvReserved84 = (void*) (0UL), /* 84 Reserved */ +#endif + .pfnTCC0_0_Handler = (void*) TCC0_0_Handler, /* 85 TCC0_CNT_A, TCC0_DFS_A, TCC0_ERR_A, TCC0_FAULT0_A, TCC0_FAULT1_A, TCC0_FAULTA_A, TCC0_FAULTB_A, TCC0_OVF, TCC0_TRG, TCC0_UFS_A */ + .pfnTCC0_1_Handler = (void*) TCC0_1_Handler, /* 86 TCC0_MC_0 */ + .pfnTCC0_2_Handler = (void*) TCC0_2_Handler, /* 87 TCC0_MC_1 */ + .pfnTCC0_3_Handler = (void*) TCC0_3_Handler, /* 88 TCC0_MC_2 */ + .pfnTCC0_4_Handler = (void*) TCC0_4_Handler, /* 89 TCC0_MC_3 */ + .pfnTCC0_5_Handler = (void*) TCC0_5_Handler, /* 90 TCC0_MC_4 */ + .pfnTCC0_6_Handler = (void*) TCC0_6_Handler, /* 91 TCC0_MC_5 */ + .pfnTCC1_0_Handler = (void*) TCC1_0_Handler, /* 92 TCC1_CNT_A, TCC1_DFS_A, TCC1_ERR_A, TCC1_FAULT0_A, TCC1_FAULT1_A, TCC1_FAULTA_A, TCC1_FAULTB_A, TCC1_OVF, TCC1_TRG, TCC1_UFS_A */ + .pfnTCC1_1_Handler = (void*) TCC1_1_Handler, /* 93 TCC1_MC_0 */ + .pfnTCC1_2_Handler = (void*) TCC1_2_Handler, /* 94 TCC1_MC_1 */ + .pfnTCC1_3_Handler = (void*) TCC1_3_Handler, /* 95 TCC1_MC_2 */ + .pfnTCC1_4_Handler = (void*) TCC1_4_Handler, /* 96 TCC1_MC_3 */ + .pfnTCC2_0_Handler = (void*) TCC2_0_Handler, /* 97 TCC2_CNT_A, TCC2_DFS_A, TCC2_ERR_A, TCC2_FAULT0_A, TCC2_FAULT1_A, TCC2_FAULTA_A, TCC2_FAULTB_A, TCC2_OVF, TCC2_TRG, TCC2_UFS_A */ + .pfnTCC2_1_Handler = (void*) TCC2_1_Handler, /* 98 TCC2_MC_0 */ + .pfnTCC2_2_Handler = (void*) TCC2_2_Handler, /* 99 TCC2_MC_1 */ + .pfnTCC2_3_Handler = (void*) TCC2_3_Handler, /* 100 TCC2_MC_2 */ +#ifdef ID_TCC3 + .pfnTCC3_0_Handler = (void*) TCC3_0_Handler, /* 101 TCC3_CNT_A, TCC3_DFS_A, TCC3_ERR_A, TCC3_FAULT0_A, TCC3_FAULT1_A, TCC3_FAULTA_A, TCC3_FAULTB_A, TCC3_OVF, TCC3_TRG, TCC3_UFS_A */ + .pfnTCC3_1_Handler = (void*) TCC3_1_Handler, /* 102 TCC3_MC_0 */ + .pfnTCC3_2_Handler = (void*) TCC3_2_Handler, /* 103 TCC3_MC_1 */ +#else + .pvReserved101 = (void*) (0UL), /* 101 Reserved */ + .pvReserved102 = (void*) (0UL), /* 102 Reserved */ + .pvReserved103 = (void*) (0UL), /* 103 Reserved */ +#endif +#ifdef ID_TCC4 + .pfnTCC4_0_Handler = (void*) TCC4_0_Handler, /* 104 TCC4_CNT_A, TCC4_DFS_A, TCC4_ERR_A, TCC4_FAULT0_A, TCC4_FAULT1_A, TCC4_FAULTA_A, TCC4_FAULTB_A, TCC4_OVF, TCC4_TRG, TCC4_UFS_A */ + .pfnTCC4_1_Handler = (void*) TCC4_1_Handler, /* 105 TCC4_MC_0 */ + .pfnTCC4_2_Handler = (void*) TCC4_2_Handler, /* 106 TCC4_MC_1 */ +#else + .pvReserved104 = (void*) (0UL), /* 104 Reserved */ + .pvReserved105 = (void*) (0UL), /* 105 Reserved */ + .pvReserved106 = (void*) (0UL), /* 106 Reserved */ +#endif + .pfnTC0_Handler = (void*) TC0_Handler, /* 107 Basic Timer Counter 0 */ + .pfnTC1_Handler = (void*) TC1_Handler, /* 108 Basic Timer Counter 1 */ + .pfnTC2_Handler = (void*) TC2_Handler, /* 109 Basic Timer Counter 2 */ + .pfnTC3_Handler = (void*) TC3_Handler, /* 110 Basic Timer Counter 3 */ +#ifdef ID_TC4 + .pfnTC4_Handler = (void*) TC4_Handler, /* 111 Basic Timer Counter 4 */ +#else + .pvReserved111 = (void*) (0UL), /* 111 Reserved */ +#endif +#ifdef ID_TC5 + .pfnTC5_Handler = (void*) TC5_Handler, /* 112 Basic Timer Counter 5 */ +#else + .pvReserved112 = (void*) (0UL), /* 112 Reserved */ +#endif +#ifdef ID_TC6 + .pfnTC6_Handler = (void*) TC6_Handler, /* 113 Basic Timer Counter 6 */ +#else + .pvReserved113 = (void*) (0UL), /* 113 Reserved */ +#endif +#ifdef ID_TC7 + .pfnTC7_Handler = (void*) TC7_Handler, /* 114 Basic Timer Counter 7 */ +#else + .pvReserved114 = (void*) (0UL), /* 114 Reserved */ +#endif + .pfnPDEC_0_Handler = (void*) PDEC_0_Handler, /* 115 PDEC_DIR_A, PDEC_ERR_A, PDEC_OVF, PDEC_VLC_A */ + .pfnPDEC_1_Handler = (void*) PDEC_1_Handler, /* 116 PDEC_MC_0 */ + .pfnPDEC_2_Handler = (void*) PDEC_2_Handler, /* 117 PDEC_MC_1 */ + .pfnADC0_0_Handler = (void*) ADC0_0_Handler, /* 118 ADC0_OVERRUN, ADC0_WINMON */ + .pfnADC0_1_Handler = (void*) ADC0_1_Handler, /* 119 ADC0_RESRDY */ + .pfnADC1_0_Handler = (void*) ADC1_0_Handler, /* 120 ADC1_OVERRUN, ADC1_WINMON */ + .pfnADC1_1_Handler = (void*) ADC1_1_Handler, /* 121 ADC1_RESRDY */ + .pfnAC_Handler = (void*) AC_Handler, /* 122 Analog Comparators */ + .pfnDAC_0_Handler = (void*) DAC_0_Handler, /* 123 DAC_OVERRUN_A_0, DAC_OVERRUN_A_1, DAC_UNDERRUN_A_0, DAC_UNDERRUN_A_1 */ + .pfnDAC_1_Handler = (void*) DAC_1_Handler, /* 124 DAC_EMPTY_0 */ + .pfnDAC_2_Handler = (void*) DAC_2_Handler, /* 125 DAC_EMPTY_1 */ + .pfnDAC_3_Handler = (void*) DAC_3_Handler, /* 126 DAC_RESRDY_0 */ + .pfnDAC_4_Handler = (void*) DAC_4_Handler, /* 127 DAC_RESRDY_1 */ +#ifdef ID_I2S + .pfnI2S_Handler = (void*) I2S_Handler, /* 128 Inter-IC Sound Interface */ +#else + .pvReserved128 = (void*) (0UL), /* 128 Reserved */ +#endif + .pfnPCC_Handler = (void*) PCC_Handler, /* 129 Parallel Capture Controller */ + .pfnAES_Handler = (void*) AES_Handler, /* 130 Advanced Encryption Standard */ + .pfnTRNG_Handler = (void*) TRNG_Handler, /* 131 True Random Generator */ +#ifdef ID_ICM + .pfnICM_Handler = (void*) ICM_Handler, /* 132 Integrity Check Monitor */ +#else + .pvReserved132 = (void*) (0UL), /* 132 Reserved */ +#endif +#ifdef ID_PUKCC + .pfnPUKCC_Handler = (void*) PUKCC_Handler, /* 133 PUblic-Key Cryptography Controller */ +#else + .pvReserved133 = (void*) (0UL), /* 133 Reserved */ +#endif + .pfnQSPI_Handler = (void*) QSPI_Handler, /* 134 Quad SPI interface */ +#ifdef ID_SDHC0 + .pfnSDHC0_Handler = (void*) SDHC0_Handler, /* 135 SD/MMC Host Controller 0 */ +#else + .pvReserved135 = (void*) (0UL), /* 135 Reserved */ +#endif +#ifdef ID_SDHC1 + .pfnSDHC1_Handler = (void*) SDHC1_Handler /* 136 SD/MMC Host Controller 1 */ +#else + .pvReserved136 = (void*) (0UL) /* 136 Reserved */ +#endif +}; + +/** + * \brief This is the code that gets called on processor reset. + * To initialize the device, and call the main() routine. + */ +void Reset_Handler(void) +{ + uint32_t *pSrc, *pDest; + + /* Initialize the relocate segment */ + pSrc = &_etext; + pDest = &_srelocate; + + if (pSrc != pDest) { + for (; pDest < &_erelocate;) { + *pDest++ = *pSrc++; + } + } + + /* Clear the zero segment */ + for (pDest = &_szero; pDest < &_ezero;) { + *pDest++ = 0; + } + + /* Set the vector table base address */ + pSrc = (uint32_t *) & _sfixed; + SCB->VTOR = ((uint32_t) pSrc & SCB_VTOR_TBLOFF_Msk); + +#if __FPU_USED + /* Enable FPU */ + SCB->CPACR |= (0xFu << 20); + __DSB(); + __ISB(); +#endif + + /* Initialize the C library */ + __libc_init_array(); + + /* Branch to main function */ + main(); + + /* Infinite loop */ + while (1); +} + +/** + * \brief Default interrupt handler for unused IRQs. + */ +void Dummy_Handler(void) +{ + while (1) { + } +} diff --git a/tmk_core/protocol/arm_atsam/usb/compiler.h b/tmk_core/protocol/arm_atsam/usb/compiler.h new file mode 100644 index 000000000..d33843986 --- /dev/null +++ b/tmk_core/protocol/arm_atsam/usb/compiler.h @@ -0,0 +1,1177 @@ +/** + * \file + * + * \brief Commonly used includes, types and macros. + * + * Copyright (C) 2012-2016 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef UTILS_COMPILER_H_INCLUDED +#define UTILS_COMPILER_H_INCLUDED + +/** + * \defgroup group_sam0_utils Compiler abstraction layer and code utilities + * + * Compiler abstraction layer and code utilities for Cortex-M0+ based Atmel SAM devices. + * This module provides various abstraction layers and utilities to make code compatible between different compilers. + * + * @{ + */ + +#if (defined __ICCARM__) +# include +#endif + +#include +//#include +//#include +//#include +//#include + +#ifndef __ASSEMBLY__ + +#include +#include +#include +#include + +/** + * \def UNUSED + * \brief Marking \a v as a unused parameter or value. + */ +#define UNUSED(v) (void)(v) + +/** + * \def barrier + * \brief Memory barrier + */ +#ifdef __GNUC__ +# define barrier() asm volatile("" ::: "memory") +#else +# define barrier() asm ("") +#endif + +/** + * \brief Emit the compiler pragma \a arg. + * + * \param[in] arg The pragma directive as it would appear after \e \#pragma + * (i.e. not stringified). + */ +#define COMPILER_PRAGMA(arg) _Pragma(#arg) + +/** + * \def COMPILER_PACK_SET(alignment) + * \brief Set maximum alignment for subsequent struct and union definitions to \a alignment. + */ +#define COMPILER_PACK_SET(alignment) COMPILER_PRAGMA(pack(alignment)) + +/** + * \def COMPILER_PACK_RESET() + * \brief Set default alignment for subsequent struct and union definitions. + */ +#define COMPILER_PACK_RESET() COMPILER_PRAGMA(pack()) + + +/** + * \brief Set aligned boundary. + */ +#if (defined __GNUC__) || (defined __CC_ARM) +# define COMPILER_ALIGNED(a) __attribute__((__aligned__(a))) +#elif (defined __ICCARM__) +# define COMPILER_ALIGNED(a) COMPILER_PRAGMA(data_alignment = a) +#endif + +/** + * \brief Set word-aligned boundary. + */ +#if (defined __GNUC__) || defined(__CC_ARM) +#define COMPILER_WORD_ALIGNED __attribute__((__aligned__(4))) +#elif (defined __ICCARM__) +#define COMPILER_WORD_ALIGNED COMPILER_PRAGMA(data_alignment = 4) +#endif + +/** + * \def __always_inline + * \brief The function should always be inlined. + * + * This annotation instructs the compiler to ignore its inlining + * heuristics and inline the function no matter how big it thinks it + * becomes. + */ +#if defined(__CC_ARM) +# define __always_inline __forceinline +#elif (defined __GNUC__) +# define __always_inline __attribute__((__always_inline__)) +#elif (defined __ICCARM__) +# define __always_inline _Pragma("inline=forced") +#endif + +/** + * \def __no_inline + * \brief The function should never be inlined + * + * This annotation instructs the compiler to ignore its inlining + * heuristics and not inline the function no matter how small it thinks it + * becomes. + */ +#if defined(__CC_ARM) +# define __no_inline __attribute__((noinline)) +#elif (defined __GNUC__) +# define __no_inline __attribute__((noinline)) +#elif (defined __ICCARM__) +# define __no_inline _Pragma("inline=never") +#endif + + +/** \brief This macro is used to test fatal errors. + * + * The macro tests if the expression is false. If it is, a fatal error is + * detected and the application hangs up. If \c TEST_SUITE_DEFINE_ASSERT_MACRO + * is defined, a unit test version of the macro is used, to allow execution + * of further tests after a false expression. + * + * \param[in] expr Expression to evaluate and supposed to be nonzero. + */ +#if defined(_ASSERT_ENABLE_) +# if defined(TEST_SUITE_DEFINE_ASSERT_MACRO) +# include "unit_test/suite.h" +# else +# undef TEST_SUITE_DEFINE_ASSERT_MACRO +# define Assert(expr) \ + {\ + if (!(expr)) asm("BKPT #0");\ + } +# endif +#else +# define Assert(expr) ((void) 0) +#endif + +/* Define WEAK attribute */ +#if defined ( __CC_ARM ) +# define WEAK __attribute__ ((weak)) +#elif defined ( __ICCARM__ ) +# define WEAK __weak +#elif defined ( __GNUC__ ) +# define WEAK __attribute__ ((weak)) +#endif + +/* Define NO_INIT attribute */ +#if defined ( __CC_ARM ) +# define NO_INIT __attribute__((zero_init)) +#elif defined ( __ICCARM__ ) +# define NO_INIT __no_init +#elif defined ( __GNUC__ ) +# define NO_INIT __attribute__((section(".no_init"))) +#endif + +//#include "interrupt.h" + +/** \name Usual Types + * @{ */ +#ifndef __cplusplus +# if !defined(__bool_true_false_are_defined) +typedef unsigned char bool; +# endif +#endif +typedef uint16_t le16_t; +typedef uint16_t be16_t; +typedef uint32_t le32_t; +typedef uint32_t be32_t; +typedef uint32_t iram_size_t; +/** @} */ + +/** \name Aliasing Aggregate Types + * @{ */ + +/** 16-bit union. */ +typedef union +{ + int16_t s16; + uint16_t u16; + int8_t s8[2]; + uint8_t u8[2]; +} Union16; + +/** 32-bit union. */ +typedef union +{ + int32_t s32; + uint32_t u32; + int16_t s16[2]; + uint16_t u16[2]; + int8_t s8[4]; + uint8_t u8[4]; +} Union32; + +/** 64-bit union. */ +typedef union +{ + int64_t s64; + uint64_t u64; + int32_t s32[2]; + uint32_t u32[2]; + int16_t s16[4]; + uint16_t u16[4]; + int8_t s8[8]; + uint8_t u8[8]; +} Union64; + +/** Union of pointers to 64-, 32-, 16- and 8-bit unsigned integers. */ +typedef union +{ + int64_t *s64ptr; + uint64_t *u64ptr; + int32_t *s32ptr; + uint32_t *u32ptr; + int16_t *s16ptr; + uint16_t *u16ptr; + int8_t *s8ptr; + uint8_t *u8ptr; +} UnionPtr; + +/** Union of pointers to volatile 64-, 32-, 16- and 8-bit unsigned integers. */ +typedef union +{ + volatile int64_t *s64ptr; + volatile uint64_t *u64ptr; + volatile int32_t *s32ptr; + volatile uint32_t *u32ptr; + volatile int16_t *s16ptr; + volatile uint16_t *u16ptr; + volatile int8_t *s8ptr; + volatile uint8_t *u8ptr; +} UnionVPtr; + +/** Union of pointers to constant 64-, 32-, 16- and 8-bit unsigned integers. */ +typedef union +{ + const int64_t *s64ptr; + const uint64_t *u64ptr; + const int32_t *s32ptr; + const uint32_t *u32ptr; + const int16_t *s16ptr; + const uint16_t *u16ptr; + const int8_t *s8ptr; + const uint8_t *u8ptr; +} UnionCPtr; + +/** Union of pointers to constant volatile 64-, 32-, 16- and 8-bit unsigned integers. */ +typedef union +{ + const volatile int64_t *s64ptr; + const volatile uint64_t *u64ptr; + const volatile int32_t *s32ptr; + const volatile uint32_t *u32ptr; + const volatile int16_t *s16ptr; + const volatile uint16_t *u16ptr; + const volatile int8_t *s8ptr; + const volatile uint8_t *u8ptr; +} UnionCVPtr; + +/** Structure of pointers to 64-, 32-, 16- and 8-bit unsigned integers. */ +typedef struct +{ + int64_t *s64ptr; + uint64_t *u64ptr; + int32_t *s32ptr; + uint32_t *u32ptr; + int16_t *s16ptr; + uint16_t *u16ptr; + int8_t *s8ptr; + uint8_t *u8ptr; +} StructPtr; + +/** Structure of pointers to volatile 64-, 32-, 16- and 8-bit unsigned integers. */ +typedef struct +{ + volatile int64_t *s64ptr; + volatile uint64_t *u64ptr; + volatile int32_t *s32ptr; + volatile uint32_t *u32ptr; + volatile int16_t *s16ptr; + volatile uint16_t *u16ptr; + volatile int8_t *s8ptr; + volatile uint8_t *u8ptr; +} StructVPtr; + +/** Structure of pointers to constant 64-, 32-, 16- and 8-bit unsigned integers. */ +typedef struct +{ + const int64_t *s64ptr; + const uint64_t *u64ptr; + const int32_t *s32ptr; + const uint32_t *u32ptr; + const int16_t *s16ptr; + const uint16_t *u16ptr; + const int8_t *s8ptr; + const uint8_t *u8ptr; +} StructCPtr; + +/** Structure of pointers to constant volatile 64-, 32-, 16- and 8-bit unsigned integers. */ +typedef struct +{ + const volatile int64_t *s64ptr; + const volatile uint64_t *u64ptr; + const volatile int32_t *s32ptr; + const volatile uint32_t *u32ptr; + const volatile int16_t *s16ptr; + const volatile uint16_t *u16ptr; + const volatile int8_t *s8ptr; + const volatile uint8_t *u8ptr; +} StructCVPtr; + +/** @} */ + +#endif /* #ifndef __ASSEMBLY__ */ + +/** \name Usual Constants + * @{ */ +//kmod #define DISABLE 0 +//kmod #define ENABLE 1 + +#ifndef __cplusplus +# if !defined(__bool_true_false_are_defined) +# define false 0 +# define true 1 +# endif +#endif +/** @} */ + +#ifndef __ASSEMBLY__ + +/** \name Optimization Control + * @{ */ + +/** + * \def likely(exp) + * \brief The expression \a exp is likely to be true + */ +#if !defined(likely) || defined(__DOXYGEN__) +# define likely(exp) (exp) +#endif + +/** + * \def unlikely(exp) + * \brief The expression \a exp is unlikely to be true + */ +#if !defined(unlikely) || defined(__DOXYGEN__) +# define unlikely(exp) (exp) +#endif + +/** + * \def is_constant(exp) + * \brief Determine if an expression evaluates to a constant value. + * + * \param[in] exp Any expression + * + * \return true if \a exp is constant, false otherwise. + */ +#if (defined __GNUC__) || (defined __CC_ARM) +# define is_constant(exp) __builtin_constant_p(exp) +#else +# define is_constant(exp) (0) +#endif + +/** @} */ + +/** \name Bit-Field Handling + * @{ */ + +/** \brief Reads the bits of a value specified by a given bit-mask. + * + * \param[in] value Value to read bits from. + * \param[in] mask Bit-mask indicating bits to read. + * + * \return Read bits. + */ +#define Rd_bits( value, mask) ((value) & (mask)) + +/** \brief Writes the bits of a C lvalue specified by a given bit-mask. + * + * \param[in] lvalue C lvalue to write bits to. + * \param[in] mask Bit-mask indicating bits to write. + * \param[in] bits Bits to write. + * + * \return Resulting value with written bits. + */ +#define Wr_bits(lvalue, mask, bits) ((lvalue) = ((lvalue) & ~(mask)) |\ + ((bits ) & (mask))) + +/** \brief Tests the bits of a value specified by a given bit-mask. + * + * \param[in] value Value of which to test bits. + * \param[in] mask Bit-mask indicating bits to test. + * + * \return \c 1 if at least one of the tested bits is set, else \c 0. + */ +#define Tst_bits( value, mask) (Rd_bits(value, mask) != 0) + +/** \brief Clears the bits of a C lvalue specified by a given bit-mask. + * + * \param[in] lvalue C lvalue of which to clear bits. + * \param[in] mask Bit-mask indicating bits to clear. + * + * \return Resulting value with cleared bits. + */ +#define Clr_bits(lvalue, mask) ((lvalue) &= ~(mask)) + +/** \brief Sets the bits of a C lvalue specified by a given bit-mask. + * + * \param[in] lvalue C lvalue of which to set bits. + * \param[in] mask Bit-mask indicating bits to set. + * + * \return Resulting value with set bits. + */ +#define Set_bits(lvalue, mask) ((lvalue) |= (mask)) + +/** \brief Toggles the bits of a C lvalue specified by a given bit-mask. + * + * \param[in] lvalue C lvalue of which to toggle bits. + * \param[in] mask Bit-mask indicating bits to toggle. + * + * \return Resulting value with toggled bits. + */ +#define Tgl_bits(lvalue, mask) ((lvalue) ^= (mask)) + +/** \brief Reads the bit-field of a value specified by a given bit-mask. + * + * \param[in] value Value to read a bit-field from. + * \param[in] mask Bit-mask indicating the bit-field to read. + * + * \return Read bit-field. + */ +#define Rd_bitfield( value, mask) (Rd_bits( value, mask) >> ctz(mask)) + +/** \brief Writes the bit-field of a C lvalue specified by a given bit-mask. + * + * \param[in] lvalue C lvalue to write a bit-field to. + * \param[in] mask Bit-mask indicating the bit-field to write. + * \param[in] bitfield Bit-field to write. + * + * \return Resulting value with written bit-field. + */ +#define Wr_bitfield(lvalue, mask, bitfield) (Wr_bits(lvalue, mask, (uint32_t)(bitfield) << ctz(mask))) + +/** @} */ + + +/** \name Zero-Bit Counting + * + * Under GCC, __builtin_clz and __builtin_ctz behave like macros when + * applied to constant expressions (values known at compile time), so they are + * more optimized than the use of the corresponding assembly instructions and + * they can be used as constant expressions e.g. to initialize objects having + * static storage duration, and like the corresponding assembly instructions + * when applied to non-constant expressions (values unknown at compile time), so + * they are more optimized than an assembly periphrasis. Hence, clz and ctz + * ensure a possible and optimized behavior for both constant and non-constant + * expressions. + * + * @{ */ + +/** \brief Counts the leading zero bits of the given value considered as a 32-bit integer. + * + * \param[in] u Value of which to count the leading zero bits. + * + * \return The count of leading zero bits in \a u. + */ +#if (defined __GNUC__) || (defined __CC_ARM) +# define clz(u) ((u) ? __builtin_clz(u) : 32) +#else +# define clz(u) (((u) == 0) ? 32 : \ + ((u) & (1ul << 31)) ? 0 : \ + ((u) & (1ul << 30)) ? 1 : \ + ((u) & (1ul << 29)) ? 2 : \ + ((u) & (1ul << 28)) ? 3 : \ + ((u) & (1ul << 27)) ? 4 : \ + ((u) & (1ul << 26)) ? 5 : \ + ((u) & (1ul << 25)) ? 6 : \ + ((u) & (1ul << 24)) ? 7 : \ + ((u) & (1ul << 23)) ? 8 : \ + ((u) & (1ul << 22)) ? 9 : \ + ((u) & (1ul << 21)) ? 10 : \ + ((u) & (1ul << 20)) ? 11 : \ + ((u) & (1ul << 19)) ? 12 : \ + ((u) & (1ul << 18)) ? 13 : \ + ((u) & (1ul << 17)) ? 14 : \ + ((u) & (1ul << 16)) ? 15 : \ + ((u) & (1ul << 15)) ? 16 : \ + ((u) & (1ul << 14)) ? 17 : \ + ((u) & (1ul << 13)) ? 18 : \ + ((u) & (1ul << 12)) ? 19 : \ + ((u) & (1ul << 11)) ? 20 : \ + ((u) & (1ul << 10)) ? 21 : \ + ((u) & (1ul << 9)) ? 22 : \ + ((u) & (1ul << 8)) ? 23 : \ + ((u) & (1ul << 7)) ? 24 : \ + ((u) & (1ul << 6)) ? 25 : \ + ((u) & (1ul << 5)) ? 26 : \ + ((u) & (1ul << 4)) ? 27 : \ + ((u) & (1ul << 3)) ? 28 : \ + ((u) & (1ul << 2)) ? 29 : \ + ((u) & (1ul << 1)) ? 30 : \ + 31) +#endif + +/** \brief Counts the trailing zero bits of the given value considered as a 32-bit integer. + * + * \param[in] u Value of which to count the trailing zero bits. + * + * \return The count of trailing zero bits in \a u. + */ +#if (defined __GNUC__) || (defined __CC_ARM) +# define ctz(u) ((u) ? __builtin_ctz(u) : 32) +#else +# define ctz(u) ((u) & (1ul << 0) ? 0 : \ + (u) & (1ul << 1) ? 1 : \ + (u) & (1ul << 2) ? 2 : \ + (u) & (1ul << 3) ? 3 : \ + (u) & (1ul << 4) ? 4 : \ + (u) & (1ul << 5) ? 5 : \ + (u) & (1ul << 6) ? 6 : \ + (u) & (1ul << 7) ? 7 : \ + (u) & (1ul << 8) ? 8 : \ + (u) & (1ul << 9) ? 9 : \ + (u) & (1ul << 10) ? 10 : \ + (u) & (1ul << 11) ? 11 : \ + (u) & (1ul << 12) ? 12 : \ + (u) & (1ul << 13) ? 13 : \ + (u) & (1ul << 14) ? 14 : \ + (u) & (1ul << 15) ? 15 : \ + (u) & (1ul << 16) ? 16 : \ + (u) & (1ul << 17) ? 17 : \ + (u) & (1ul << 18) ? 18 : \ + (u) & (1ul << 19) ? 19 : \ + (u) & (1ul << 20) ? 20 : \ + (u) & (1ul << 21) ? 21 : \ + (u) & (1ul << 22) ? 22 : \ + (u) & (1ul << 23) ? 23 : \ + (u) & (1ul << 24) ? 24 : \ + (u) & (1ul << 25) ? 25 : \ + (u) & (1ul << 26) ? 26 : \ + (u) & (1ul << 27) ? 27 : \ + (u) & (1ul << 28) ? 28 : \ + (u) & (1ul << 29) ? 29 : \ + (u) & (1ul << 30) ? 30 : \ + (u) & (1ul << 31) ? 31 : \ + 32) +#endif + +/** @} */ + + +/** \name Bit Reversing + * @{ */ + +/** \brief Reverses the bits of \a u8. + * + * \param[in] u8 U8 of which to reverse the bits. + * + * \return Value resulting from \a u8 with reversed bits. + */ +#define bit_reverse8(u8) ((U8)(bit_reverse32((U8)(u8)) >> 24)) + +/** \brief Reverses the bits of \a u16. + * + * \param[in] u16 U16 of which to reverse the bits. + * + * \return Value resulting from \a u16 with reversed bits. + */ +#define bit_reverse16(u16) ((uint16_t)(bit_reverse32((uint16_t)(u16)) >> 16)) + +/** \brief Reverses the bits of \a u32. + * + * \param[in] u32 U32 of which to reverse the bits. + * + * \return Value resulting from \a u32 with reversed bits. + */ +#define bit_reverse32(u32) __RBIT(u32) + +/** \brief Reverses the bits of \a u64. + * + * \param[in] u64 U64 of which to reverse the bits. + * + * \return Value resulting from \a u64 with reversed bits. + */ +#define bit_reverse64(u64) ((uint64_t)(((uint64_t)bit_reverse32((uint64_t)(u64) >> 32)) |\ + ((uint64_t)bit_reverse32((uint64_t)(u64)) << 32))) + +/** @} */ + + +/** \name Alignment + * @{ */ + +/** \brief Tests alignment of the number \a val with the \a n boundary. + * + * \param[in] val Input value. + * \param[in] n Boundary. + * + * \return \c 1 if the number \a val is aligned with the \a n boundary, else \c 0. + */ +#define Test_align(val, n) (!Tst_bits( val, (n) - 1 ) ) + +/** \brief Gets alignment of the number \a val with respect to the \a n boundary. + * + * \param[in] val Input value. + * \param[in] n Boundary. + * + * \return Alignment of the number \a val with respect to the \a n boundary. + */ +#define Get_align(val, n) ( Rd_bits( val, (n) - 1 ) ) + +/** \brief Sets alignment of the lvalue number \a lval to \a alg with respect to the \a n boundary. + * + * \param[in] lval Input/output lvalue. + * \param[in] n Boundary. + * \param[in] alg Alignment. + * + * \return New value of \a lval resulting from its alignment set to \a alg with respect to the \a n boundary. + */ +#define Set_align(lval, n, alg) ( Wr_bits(lval, (n) - 1, alg) ) + +/** \brief Aligns the number \a val with the upper \a n boundary. + * + * \param[in] val Input value. + * \param[in] n Boundary. + * + * \return Value resulting from the number \a val aligned with the upper \a n boundary. + */ +#define Align_up( val, n) (((val) + ((n) - 1)) & ~((n) - 1)) + +/** \brief Aligns the number \a val with the lower \a n boundary. + * + * \param[in] val Input value. + * \param[in] n Boundary. + * + * \return Value resulting from the number \a val aligned with the lower \a n boundary. + */ +#define Align_down(val, n) ( (val) & ~((n) - 1)) + +/** @} */ + + +/** \name Mathematics + * + * The same considerations as for clz and ctz apply here but GCC does not + * provide built-in functions to access the assembly instructions abs, min and + * max and it does not produce them by itself in most cases, so two sets of + * macros are defined here: + * - Abs, Min and Max to apply to constant expressions (values known at + * compile time); + * - abs, min and max to apply to non-constant expressions (values unknown at + * compile time), abs is found in stdlib.h. + * + * @{ */ + +/** \brief Takes the absolute value of \a a. + * + * \param[in] a Input value. + * + * \return Absolute value of \a a. + * + * \note More optimized if only used with values known at compile time. + */ +#define Abs(a) (((a) < 0 ) ? -(a) : (a)) + +#ifndef __cplusplus +/** \brief Takes the minimal value of \a a and \a b. + * + * \param[in] a Input value. + * \param[in] b Input value. + * + * \return Minimal value of \a a and \a b. + * + * \note More optimized if only used with values known at compile time. + */ +#define Min(a, b) (((a) < (b)) ? (a) : (b)) + +/** \brief Takes the maximal value of \a a and \a b. + * + * \param[in] a Input value. + * \param[in] b Input value. + * + * \return Maximal value of \a a and \a b. + * + * \note More optimized if only used with values known at compile time. + */ +#define Max(a, b) (((a) > (b)) ? (a) : (b)) + +/** \brief Takes the minimal value of \a a and \a b. + * + * \param[in] a Input value. + * \param[in] b Input value. + * + * \return Minimal value of \a a and \a b. + * + * \note More optimized if only used with values unknown at compile time. + */ +#define min(a, b) Min(a, b) + +/** \brief Takes the maximal value of \a a and \a b. + * + * \param[in] a Input value. + * \param[in] b Input value. + * + * \return Maximal value of \a a and \a b. + * + * \note More optimized if only used with values unknown at compile time. + */ +#define max(a, b) Max(a, b) +#endif + +/** @} */ + + +/** \brief Calls the routine at address \a addr. + * + * It generates a long call opcode. + * + * For example, `Long_call(0x80000000)' generates a software reset on a UC3 if + * it is invoked from the CPU supervisor mode. + * + * \param[in] addr Address of the routine to call. + * + * \note It may be used as a long jump opcode in some special cases. + */ +#define Long_call(addr) ((*(void (*)(void))(addr))()) + + +/** \name MCU Endianism Handling + * ARM is MCU little endian. + * + * @{ */ +#define BE16(x) swap16(x) +#define LE16(x) (x) + +#define le16_to_cpu(x) (x) +#define cpu_to_le16(x) (x) +#define LE16_TO_CPU(x) (x) +#define CPU_TO_LE16(x) (x) + +#define be16_to_cpu(x) swap16(x) +#define cpu_to_be16(x) swap16(x) +#define BE16_TO_CPU(x) swap16(x) +#define CPU_TO_BE16(x) swap16(x) + +#define le32_to_cpu(x) (x) +#define cpu_to_le32(x) (x) +#define LE32_TO_CPU(x) (x) +#define CPU_TO_LE32(x) (x) + +#define be32_to_cpu(x) swap32(x) +#define cpu_to_be32(x) swap32(x) +#define BE32_TO_CPU(x) swap32(x) +#define CPU_TO_BE32(x) swap32(x) +/** @} */ + + +/** \name Endianism Conversion + * + * The same considerations as for clz and ctz apply here but GCC's + * __builtin_bswap_32 and __builtin_bswap_64 do not behave like macros when + * applied to constant expressions, so two sets of macros are defined here: + * - Swap16, Swap32 and Swap64 to apply to constant expressions (values known + * at compile time); + * - swap16, swap32 and swap64 to apply to non-constant expressions (values + * unknown at compile time). + * + * @{ */ + +/** \brief Toggles the endianism of \a u16 (by swapping its bytes). + * + * \param[in] u16 U16 of which to toggle the endianism. + * + * \return Value resulting from \a u16 with toggled endianism. + * + * \note More optimized if only used with values known at compile time. + */ +#define Swap16(u16) ((uint16_t)(((uint16_t)(u16) >> 8) |\ + ((uint16_t)(u16) << 8))) + +/** \brief Toggles the endianism of \a u32 (by swapping its bytes). + * + * \param[in] u32 U32 of which to toggle the endianism. + * + * \return Value resulting from \a u32 with toggled endianism. + * + * \note More optimized if only used with values known at compile time. + */ +#define Swap32(u32) ((uint32_t)(((uint32_t)Swap16((uint32_t)(u32) >> 16)) |\ + ((uint32_t)Swap16((uint32_t)(u32)) << 16))) + +/** \brief Toggles the endianism of \a u64 (by swapping its bytes). + * + * \param[in] u64 U64 of which to toggle the endianism. + * + * \return Value resulting from \a u64 with toggled endianism. + * + * \note More optimized if only used with values known at compile time. + */ +#define Swap64(u64) ((uint64_t)(((uint64_t)Swap32((uint64_t)(u64) >> 32)) |\ + ((uint64_t)Swap32((uint64_t)(u64)) << 32))) + +/** \brief Toggles the endianism of \a u16 (by swapping its bytes). + * + * \param[in] u16 U16 of which to toggle the endianism. + * + * \return Value resulting from \a u16 with toggled endianism. + * + * \note More optimized if only used with values unknown at compile time. + */ +#define swap16(u16) Swap16(u16) + +/** \brief Toggles the endianism of \a u32 (by swapping its bytes). + * + * \param[in] u32 U32 of which to toggle the endianism. + * + * \return Value resulting from \a u32 with toggled endianism. + * + * \note More optimized if only used with values unknown at compile time. + */ +#if (defined __GNUC__) +# define swap32(u32) ((uint32_t)__builtin_bswap32((uint32_t)(u32))) +#else +# define swap32(u32) Swap32(u32) +#endif + +/** \brief Toggles the endianism of \a u64 (by swapping its bytes). + * + * \param[in] u64 U64 of which to toggle the endianism. + * + * \return Value resulting from \a u64 with toggled endianism. + * + * \note More optimized if only used with values unknown at compile time. + */ +#if (defined __GNUC__) +# define swap64(u64) ((uint64_t)__builtin_bswap64((uint64_t)(u64))) +#else +# define swap64(u64) ((uint64_t)(((uint64_t)swap32((uint64_t)(u64) >> 32)) |\ + ((uint64_t)swap32((uint64_t)(u64)) << 32))) +#endif + +/** @} */ + + +/** \name Target Abstraction + * + * @{ */ + +#define _GLOBEXT_ extern /**< extern storage-class specifier. */ +#define _CONST_TYPE_ const /**< const type qualifier. */ +#define _MEM_TYPE_SLOW_ /**< Slow memory type. */ +#define _MEM_TYPE_MEDFAST_ /**< Fairly fast memory type. */ +#define _MEM_TYPE_FAST_ /**< Fast memory type. */ + +#define memcmp_ram2ram memcmp /**< Target-specific memcmp of RAM to RAM. */ +#define memcmp_code2ram memcmp /**< Target-specific memcmp of RAM to NVRAM. */ +#define memcpy_ram2ram memcpy /**< Target-specific memcpy from RAM to RAM. */ +#define memcpy_code2ram memcpy /**< Target-specific memcpy from NVRAM to RAM. */ + +/** @} */ + +/** + * \brief Calculate \f$ \left\lceil \frac{a}{b} \right\rceil \f$ using + * integer arithmetic. + * + * \param[in] a An integer + * \param[in] b Another integer + * + * \return (\a a / \a b) rounded up to the nearest integer. + */ +#define div_ceil(a, b) (((a) + (b) - 1) / (b)) + +#endif /* #ifndef __ASSEMBLY__ */ +#ifdef __ICCARM__ +/** \name Compiler Keywords + * + * Port of some keywords from GCC to IAR Embedded Workbench. + * + * @{ */ + +#define __asm__ asm +#define __inline__ inline +#define __volatile__ + +/** @} */ + +#endif + +#define FUNC_PTR void * +/** + * \def unused + * \brief Marking \a v as a unused parameter or value. + */ +#define unused(v) do { (void)(v); } while(0) + +/* Define RAMFUNC attribute */ +#if defined ( __CC_ARM ) /* Keil uVision 4 */ +# define RAMFUNC __attribute__ ((section(".ramfunc"))) +#elif defined ( __ICCARM__ ) /* IAR Ewarm 5.41+ */ +# define RAMFUNC __ramfunc +#elif defined ( __GNUC__ ) /* GCC CS3 2009q3-68 */ +# define RAMFUNC __attribute__ ((section(".ramfunc"))) +#endif + +/* Define OPTIMIZE_HIGH attribute */ +#if defined ( __CC_ARM ) /* Keil uVision 4 */ +# define OPTIMIZE_HIGH _Pragma("O3") +#elif defined ( __ICCARM__ ) /* IAR Ewarm 5.41+ */ +# define OPTIMIZE_HIGH _Pragma("optimize=high") +#elif defined ( __GNUC__ ) /* GCC CS3 2009q3-68 */ +# define OPTIMIZE_HIGH __attribute__((optimize("s"))) +#endif +//kmod #define PASS 0 +//kmod #define FAIL 1 +//kmod #define LOW 0 +//kmod #define HIGH 1 + +typedef int8_t S8 ; //!< 8-bit signed integer. +typedef uint8_t U8 ; //!< 8-bit unsigned integer. +typedef int16_t S16; //!< 16-bit signed integer. +typedef uint16_t U16; //!< 16-bit unsigned integer. +typedef int32_t S32; //!< 32-bit signed integer. +typedef uint32_t U32; //!< 32-bit unsigned integer. +typedef int64_t S64; //!< 64-bit signed integer. +typedef uint64_t U64; //!< 64-bit unsigned integer. +typedef float F32; //!< 32-bit floating-point number. +typedef double F64; //!< 64-bit floating-point number. + +#define MSB(u16) (((U8 *)&(u16))[1]) //!< Most significant byte of \a u16. +#define LSB(u16) (((U8 *)&(u16))[0]) //!< Least significant byte of \a u16. + +#define MSH(u32) (((U16 *)&(u32))[1]) //!< Most significant half-word of \a u32. +#define LSH(u32) (((U16 *)&(u32))[0]) //!< Least significant half-word of \a u32. +#define MSB0W(u32) (((U8 *)&(u32))[3]) //!< Most significant byte of 1st rank of \a u32. +#define MSB1W(u32) (((U8 *)&(u32))[2]) //!< Most significant byte of 2nd rank of \a u32. +#define MSB2W(u32) (((U8 *)&(u32))[1]) //!< Most significant byte of 3rd rank of \a u32. +#define MSB3W(u32) (((U8 *)&(u32))[0]) //!< Most significant byte of 4th rank of \a u32. +#define LSB3W(u32) MSB0W(u32) //!< Least significant byte of 4th rank of \a u32. +#define LSB2W(u32) MSB1W(u32) //!< Least significant byte of 3rd rank of \a u32. +#define LSB1W(u32) MSB2W(u32) //!< Least significant byte of 2nd rank of \a u32. +#define LSB0W(u32) MSB3W(u32) //!< Least significant byte of 1st rank of \a u32. + +#define MSW(u64) (((U32 *)&(u64))[1]) //!< Most significant word of \a u64. +#define LSW(u64) (((U32 *)&(u64))[0]) //!< Least significant word of \a u64. +#define MSH0(u64) (((U16 *)&(u64))[3]) //!< Most significant half-word of 1st rank of \a u64. +#define MSH1(u64) (((U16 *)&(u64))[2]) //!< Most significant half-word of 2nd rank of \a u64. +#define MSH2(u64) (((U16 *)&(u64))[1]) //!< Most significant half-word of 3rd rank of \a u64. +#define MSH3(u64) (((U16 *)&(u64))[0]) //!< Most significant half-word of 4th rank of \a u64. +#define LSH3(u64) MSH0(u64) //!< Least significant half-word of 4th rank of \a u64. +#define LSH2(u64) MSH1(u64) //!< Least significant half-word of 3rd rank of \a u64. +#define LSH1(u64) MSH2(u64) //!< Least significant half-word of 2nd rank of \a u64. +#define LSH0(u64) MSH3(u64) //!< Least significant half-word of 1st rank of \a u64. +#define MSB0D(u64) (((U8 *)&(u64))[7]) //!< Most significant byte of 1st rank of \a u64. +#define MSB1D(u64) (((U8 *)&(u64))[6]) //!< Most significant byte of 2nd rank of \a u64. +#define MSB2D(u64) (((U8 *)&(u64))[5]) //!< Most significant byte of 3rd rank of \a u64. +#define MSB3D(u64) (((U8 *)&(u64))[4]) //!< Most significant byte of 4th rank of \a u64. +#define MSB4D(u64) (((U8 *)&(u64))[3]) //!< Most significant byte of 5th rank of \a u64. +#define MSB5D(u64) (((U8 *)&(u64))[2]) //!< Most significant byte of 6th rank of \a u64. +#define MSB6D(u64) (((U8 *)&(u64))[1]) //!< Most significant byte of 7th rank of \a u64. +#define MSB7D(u64) (((U8 *)&(u64))[0]) //!< Most significant byte of 8th rank of \a u64. +#define LSB7D(u64) MSB0D(u64) //!< Least significant byte of 8th rank of \a u64. +#define LSB6D(u64) MSB1D(u64) //!< Least significant byte of 7th rank of \a u64. +#define LSB5D(u64) MSB2D(u64) //!< Least significant byte of 6th rank of \a u64. +#define LSB4D(u64) MSB3D(u64) //!< Least significant byte of 5th rank of \a u64. +#define LSB3D(u64) MSB4D(u64) //!< Least significant byte of 4th rank of \a u64. +#define LSB2D(u64) MSB5D(u64) //!< Least significant byte of 3rd rank of \a u64. +#define LSB1D(u64) MSB6D(u64) //!< Least significant byte of 2nd rank of \a u64. +#define LSB0D(u64) MSB7D(u64) //!< Least significant byte of 1st rank of \a u64. + +#define LSB0(u32) LSB0W(u32) //!< Least significant byte of 1st rank of \a u32. +#define LSB1(u32) LSB1W(u32) //!< Least significant byte of 2nd rank of \a u32. +#define LSB2(u32) LSB2W(u32) //!< Least significant byte of 3rd rank of \a u32. +#define LSB3(u32) LSB3W(u32) //!< Least significant byte of 4th rank of \a u32. +#define MSB3(u32) MSB3W(u32) //!< Most significant byte of 4th rank of \a u32. +#define MSB2(u32) MSB2W(u32) //!< Most significant byte of 3rd rank of \a u32. +#define MSB1(u32) MSB1W(u32) //!< Most significant byte of 2nd rank of \a u32. +#define MSB0(u32) MSB0W(u32) //!< Most significant byte of 1st rank of \a u32. + +#if defined(__ICCARM__) +#define SHORTENUM __packed +#elif defined(__GNUC__) +#define SHORTENUM __attribute__((packed)) +#endif + +/* No operation */ +#if defined(__ICCARM__) +#define nop() __no_operation() +#elif defined(__GNUC__) +#define nop() (__NOP()) +#endif + +#define FLASH_DECLARE(x) const x +#define FLASH_EXTERN(x) extern const x +#define PGM_READ_BYTE(x) *(x) +#define PGM_READ_WORD(x) *(x) +#define MEMCPY_ENDIAN memcpy +#define PGM_READ_BLOCK(dst, src, len) memcpy((dst), (src), (len)) + +/*Defines the Flash Storage for the request and response of MAC*/ +#define CMD_ID_OCTET (0) + +/* Converting of values from CPU endian to little endian. */ +#define CPU_ENDIAN_TO_LE16(x) (x) +#define CPU_ENDIAN_TO_LE32(x) (x) +#define CPU_ENDIAN_TO_LE64(x) (x) + +/* Converting of values from little endian to CPU endian. */ +#define LE16_TO_CPU_ENDIAN(x) (x) +#define LE32_TO_CPU_ENDIAN(x) (x) +#define LE64_TO_CPU_ENDIAN(x) (x) + +/* Converting of constants from little endian to CPU endian. */ +#define CLE16_TO_CPU_ENDIAN(x) (x) +#define CLE32_TO_CPU_ENDIAN(x) (x) +#define CLE64_TO_CPU_ENDIAN(x) (x) + +/* Converting of constants from CPU endian to little endian. */ +#define CCPU_ENDIAN_TO_LE16(x) (x) +#define CCPU_ENDIAN_TO_LE32(x) (x) +#define CCPU_ENDIAN_TO_LE64(x) (x) + +#define ADDR_COPY_DST_SRC_16(dst, src) ((dst) = (src)) +#define ADDR_COPY_DST_SRC_64(dst, src) ((dst) = (src)) + +/** + * @brief Converts a 64-Bit value into a 8 Byte array + * + * @param[in] value 64-Bit value + * @param[out] data Pointer to the 8 Byte array to be updated with 64-Bit value + * @ingroup apiPalApi + */ +static inline void convert_64_bit_to_byte_array(uint64_t value, uint8_t *data) +{ + uint8_t index = 0; + + while (index < 8) + { + data[index++] = value & 0xFF; + value = value >> 8; + } +} + +/** + * @brief Converts a 16-Bit value into a 2 Byte array + * + * @param[in] value 16-Bit value + * @param[out] data Pointer to the 2 Byte array to be updated with 16-Bit value + * @ingroup apiPalApi + */ +static inline void convert_16_bit_to_byte_array(uint16_t value, uint8_t *data) +{ + data[0] = value & 0xFF; + data[1] = (value >> 8) & 0xFF; +} + +/* Converts a 16-Bit value into a 2 Byte array */ +static inline void convert_spec_16_bit_to_byte_array(uint16_t value, uint8_t *data) +{ + data[0] = value & 0xFF; + data[1] = (value >> 8) & 0xFF; +} + +/* Converts a 16-Bit value into a 2 Byte array */ +static inline void convert_16_bit_to_byte_address(uint16_t value, uint8_t *data) +{ + data[0] = value & 0xFF; + data[1] = (value >> 8) & 0xFF; +} + +/* + * @brief Converts a 2 Byte array into a 16-Bit value + * + * @param data Specifies the pointer to the 2 Byte array + * + * @return 16-Bit value + * @ingroup apiPalApi + */ +static inline uint16_t convert_byte_array_to_16_bit(uint8_t *data) +{ + return (data[0] | ((uint16_t)data[1] << 8)); +} + +/* Converts a 4 Byte array into a 32-Bit value */ +static inline uint32_t convert_byte_array_to_32_bit(uint8_t *data) +{ + union + { + uint32_t u32; + uint8_t u8[4]; + } long_addr; + + uint8_t index; + + for (index = 0; index < 4; index++) + { + long_addr.u8[index] = *data++; + } + + return long_addr.u32; +} + +/** + * @brief Converts a 8 Byte array into a 64-Bit value + * + * @param data Specifies the pointer to the 8 Byte array + * + * @return 64-Bit value + * @ingroup apiPalApi + */ +static inline uint64_t convert_byte_array_to_64_bit(uint8_t *data) +{ + union + { + uint64_t u64; + uint8_t u8[8]; + } long_addr; + + uint8_t index; + + for (index = 0; index < 8; index++) + { + long_addr.u8[index] = *data++; + } + + return long_addr.u64; +} + +/** @} */ + +#endif /* UTILS_COMPILER_H_INCLUDED */ diff --git a/tmk_core/protocol/arm_atsam/usb/conf_usb.h b/tmk_core/protocol/arm_atsam/usb/conf_usb.h new file mode 100644 index 000000000..8f0f47268 --- /dev/null +++ b/tmk_core/protocol/arm_atsam/usb/conf_usb.h @@ -0,0 +1,163 @@ +/** + * \file + * + * \brief USB configuration file + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _CONF_USB_H_ +#define _CONF_USB_H_ + +#include "compiler.h" +#include "udi_device_conf.h" + +#define UDI_CDC_DEFAULT_RATE 115200 +#define UDI_CDC_DEFAULT_STOPBITS CDC_STOP_BITS_1 +#define UDI_CDC_DEFAULT_PARITY CDC_PAR_NONE +#define UDI_CDC_DEFAULT_DATABITS 8 + +//! Device definition (mandatory) +#define USB_DEVICE_VENDOR_ID VENDOR_ID +#define USB_DEVICE_PRODUCT_ID PRODUCT_ID +#define USB_DEVICE_VERSION DEVICE_VER +#define USB_DEVICE_POWER 500 // Consumption on Vbus line (mA) +#define USB_DEVICE_ATTR (USB_CONFIG_ATTR_REMOTE_WAKEUP|USB_CONFIG_ATTR_BUS_POWERED) +// (USB_CONFIG_ATTR_REMOTE_WAKEUP|USB_CONFIG_ATTR_BUS_POWERED) +// (USB_CONFIG_ATTR_REMOTE_WAKEUP|USB_CONFIG_ATTR_SELF_POWERED) +// (USB_CONFIG_ATTR_SELF_POWERED) +// (USB_CONFIG_ATTR_BUS_POWERED) + +//! USB Device string definitions (Optional) +#define USB_DEVICE_MANUFACTURE_NAME MANUFACTURER +#define USB_DEVICE_PRODUCT_NAME PRODUCT +#define USB_DEVICE_SERIAL_NAME SERIAL_NUM + +//Comment out USB_DEVICE_SERIAL_USE_BOOTLOADER_SERIAL to prevent ROM lookup of factory programmed serial number +#define USB_DEVICE_SERIAL_USE_BOOTLOADER_SERIAL + +/** + * Device speeds support + * @{ + */ +//! To define a Low speed device +//#define USB_DEVICE_LOW_SPEED + +//! To authorize the High speed +#if (UC3A3||UC3A4) +//#define USB_DEVICE_HS_SUPPORT +#elif (SAM3XA||SAM3U) +//#define USB_DEVICE_HS_SUPPORT +#endif +//@} + +/** + * USB Device Callbacks definitions (Optional) + * @{ + */ +#define UDC_VBUS_EVENT(b_vbus_high) +#define UDC_SOF_EVENT() main_sof_action() +#define UDC_SUSPEND_EVENT() main_suspend_action() +#define UDC_RESUME_EVENT() main_resume_action() +//! Mandatory when USB_DEVICE_ATTR authorizes remote wakeup feature +#define UDC_REMOTEWAKEUP_ENABLE() main_remotewakeup_enable() +#define UDC_REMOTEWAKEUP_DISABLE() main_remotewakeup_disable() +//! When a extra string descriptor must be supported +//! other than manufacturer, product and serial string +// #define UDC_GET_EXTRA_STRING() +//@} + +//@} + + +/** + * USB Interface Configuration + * @{ + */ +/** + * Configuration of HID Keyboard interface + * @{ + */ +//! Interface callback definition +#ifdef KBD +#define UDI_HID_KBD_ENABLE_EXT() main_kbd_enable() +#define UDI_HID_KBD_DISABLE_EXT() main_kbd_disable() +//#define UDI_HID_KBD_CHANGE_LED(value) ui_kbd_led(value) +#endif + +#ifdef NKRO +#define UDI_HID_NKRO_ENABLE_EXT() main_nkro_enable() +#define UDI_HID_NKRO_DISABLE_EXT() main_nkro_disable() +//#define UDI_HID_NKRO_CHANGE_LED(value) ui_kbd_led(value) +#endif + +#ifdef EXK +#define UDI_HID_EXK_ENABLE_EXT() main_exk_enable() +#define UDI_HID_EXK_DISABLE_EXT() main_exk_disable() +#endif + +#ifdef MOU +#define UDI_HID_MOU_ENABLE_EXT() main_mou_enable() +#define UDI_HID_MOU_DISABLE_EXT() main_mou_disable() +#endif + +#ifdef RAW +#define UDI_HID_RAW_ENABLE_EXT() main_raw_enable() +#define UDI_HID_RAW_DISABLE_EXT() main_raw_disable() +#endif + + +//@} +//@} + + +/** + * USB Device Driver Configuration + * @{ + */ +//@} + +//! The includes of classes and other headers must be done at the end of this file to avoid compile error +#include "udi_hid_kbd_conf.h" +#include "usb_main.h" +#include "ui.h" + +#endif // _CONF_USB_H_ diff --git a/tmk_core/protocol/arm_atsam/usb/main_usb.c b/tmk_core/protocol/arm_atsam/usb/main_usb.c new file mode 100644 index 000000000..e943cbcdc --- /dev/null +++ b/tmk_core/protocol/arm_atsam/usb/main_usb.c @@ -0,0 +1,118 @@ +/* +Copyright 2018 Massdrop Inc. + +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 . +*/ + +#include "samd51j18a.h" +#include "conf_usb.h" +#include "udd.h" + +uint8_t keyboard_protocol = 1; + +void main_suspend_action(void) +{ + ui_powerdown(); +} + +void main_resume_action(void) +{ + ui_wakeup(); +} + +void main_sof_action(void) +{ + ui_process(udd_get_frame_number()); +} + +void main_remotewakeup_enable(void) +{ + ui_wakeup_enable(); +} + +void main_remotewakeup_disable(void) +{ + ui_wakeup_disable(); +} + +#ifdef KBD +volatile bool main_b_kbd_enable = false; +bool main_kbd_enable(void) +{ + main_b_kbd_enable = true; + return true; +} + +void main_kbd_disable(void) +{ + main_b_kbd_enable = false; +} +#endif + +#ifdef NKRO +volatile bool main_b_nkro_enable = false; +bool main_nkro_enable(void) +{ + main_b_nkro_enable = true; + return true; +} + +void main_nkro_disable(void) +{ + main_b_nkro_enable = false; +} +#endif + +#ifdef EXK +volatile bool main_b_exk_enable = false; +bool main_exk_enable(void) +{ + main_b_exk_enable = true; + return true; +} + +void main_exk_disable(void) +{ + main_b_exk_enable = false; +} +#endif + +#ifdef MOU +volatile bool main_b_mou_enable = false; +bool main_mou_enable(void) +{ + main_b_mou_enable = true; + return true; +} + +void main_mou_disable(void) +{ + main_b_mou_enable = false; +} +#endif + +#ifdef RAW +volatile bool main_b_raw_enable = false; +bool main_raw_enable(void) +{ + main_b_raw_enable = true; + return true; +} + +void main_raw_disable(void) +{ + main_b_raw_enable = false; +} +#endif + diff --git a/tmk_core/protocol/arm_atsam/usb/spfssf.c b/tmk_core/protocol/arm_atsam/usb/spfssf.c new file mode 100644 index 000000000..449a8bb7d --- /dev/null +++ b/tmk_core/protocol/arm_atsam/usb/spfssf.c @@ -0,0 +1,268 @@ +#include "samd51j18a.h" +#include "stdarg.h" +#include "spfssf.h" +#include "usb_util.h" + +int vspf(char *_Dest, const char *_Format, va_list va) +{ + //va_list va; //Variable argument list variable + char *d = _Dest; //Pointer to dest + + //va_start(va,_Format); //Initialize the variable argument list + while (*_Format) //While not end of format string + { + if (*_Format == SPF_SPEC_START) //If current format string character is the specifier start character + { + _Format++; //Skip over the character + while (*_Format && *_Format <= 64) _Format++; //Forward past any options + if (*_Format == SPF_SPEC_START) *d++ = *_Format; //If the character is the specifier start character, output the character and advance dest + else if (*_Format == SPF_SPEC_LONG) //If the character is the long type + { + _Format++; //Skip over the character + if (*_Format == SPF_SPEC_DECIMAL) //If the character is the decimal type + { + int64_t buf = va_arg(va,int64_t); //Get the next value from the va list + //if (buf < 0) { *d++ = '-'; buf = -buf; } //If the given number is negative, add a negative sign to the dest and invert number + //spf_uint2str_32_3t(&d,buf,32); //Perform the conversion + d += UTIL_ltoa_radix(buf, d, 10); + } + else if (*_Format == SPF_SPEC_UNSIGNED) //If the character is the unsigned type + { + uint64_t num = va_arg(va,uint64_t); //Get the next value from the va list + //spf_uint2str_32_3t(&d,num,32); //Perform the conversion + d += UTIL_ltoa_radix(num, d, 10); + } + else if (*_Format == SPF_SPEC_UHINT || *_Format == SPF_SPEC_UHINT_UP) //If the character is the unsigned type + { + uint64_t buf = va_arg(va,uint64_t); //Get the next value from the va list + //spf_uint2hex_32(&d,(unsigned long) buf); + d += UTIL_ltoa_radix(buf, d, 16); + } + else //If the character was not a known type + { + *d++ = SPF_SPEC_START; //Output the start specifier + *d++ = SPF_SPEC_LONG; //Output the long type + *d++ = *_Format; //Output the unknown type + } + } + else if (*_Format == SPF_SPEC_DECIMAL) //If the character is the decimal type + { + int buf = va_arg(va,int); //Get the next value from the va list + //if (buf < 0) { *d++ = '-'; buf = -buf; } //If the given number is negative, add a negative sign to the dest and invert number + //spf_uint2str_32_3t(&d,buf,16); //Perform the conversion + d += UTIL_itoa(buf, d); + } + else if (*_Format == SPF_SPEC_INT) //If the character is the integer type + { + int buf = va_arg(va,int); //Get the next value from the va list + //if (buf < 0) { *d++ = '-'; buf = -buf; } //If the given number is negative, add a negative sign to the dest and inverted number + //spf_uint2str_32_3t(&d,buf,16); //Perform the conversion + d += UTIL_itoa(buf, d); + } + else if (*_Format == SPF_SPEC_UINT) //If the character is the unsigned integer type + { + int buf = va_arg(va,int); //Get the next value from the va list + //spf_uint2str_32_3t(&d,buf,16); //Perform the conversion + d += UTIL_utoa(buf, d); + } + else if (*_Format == SPF_SPEC_STRING) //If the character is the string type + { + char *buf = va_arg(va,char*); //Get the next value from the va list + while (*buf) *d++ = *buf++; //Perform the conversion (simply output characters and adcance pointers) + } + else if (*_Format == SPF_SPEC_UHINT || *_Format == SPF_SPEC_UHINT_UP) //If the character is the short type + { + int buf = va_arg(va,unsigned int); //Get the next value from the va list + //spf_uint2hex_32(&d,(unsigned long) buf); //Perform the conversion + d += UTIL_utoa(buf, d); + } + else //If the character type is unknown + { + *d++ = SPF_SPEC_START; //Output the start specifier + *d++ = *_Format; //Output the unknown type + } + } + else *d++ = *_Format; //If the character is unknown, output it to dest and advance dest + _Format++; //Advance the format buffer pointer to next character + } + //va_end(va); //End the variable argument list + + *d = '\0'; //Cap off the destination string with a zero + + return d - _Dest; //Return the length of the destintion buffer +} + +int spf(char *_Dest, const char *_Format, ...) +{ + va_list va; //Variable argument list variable + int result; + + va_start(va,_Format); //Initialize the variable argument list + result = vspf(_Dest, _Format, va); + va_end(va); + return result; +} + +//sscanf string to number (integer types) +int64_t ssf_ston(const char **_Src, uint32_t count, uint32_t *conv_count) +{ + int64_t value = 0; //Return value accumulator + uint32_t counter=count; //Counter to keep track of numbers converted + const char* p; //Pointer to first non space character + + while (*(*_Src) == SSF_SKIP_SPACE) (*_Src)++; //Forward through the whitespace to next non whitespace + + p = (*_Src); //Set pointer to first non space character + if (*p == '+' || *p == '-') (*_Src)++; //Skip over sign if any + while (*(*_Src) >= ASCII_NUM_START && + *(*_Src) <= ASCII_NUM_END && + counter) //While the source character is a digit and counter is not zero + { + value *= 10; //Multiply result by 10 to make room for next 1's place number + value += *(*_Src)++ - ASCII_NUM_START; //Add source number to value + counter--; //Decrement counter + } + if (counter - count == 0) return 0; //If no number conversion were performed, return 0 + if (*p == '-') value = -value; //If the number given was negative, make the result negative + + if (conv_count) (*conv_count)++; //Increment the converted count + return value; //Return the value +} + +uint64_t ssf_hton(const char **_Src, uint32_t count,uint32_t *conv_count) +{ + int64_t value=0; //Return value accumulator + uint32_t counter=count; //Counter to keep track of numbers converted + //const char* p; //Pointer to first non space character + char c; + + while (*(*_Src) == SSF_SKIP_SPACE) (*_Src)++; //Forward through the whitespace to next non whitespace + + //p = (*_Src); //Set pointer to first non space character + + while (counter) + { + c = *(*_Src)++; + if (c >= 'a' && c <= 'f') c -= ('a'-'A'); //toupper + if (c < '0' || (c > '9' && c < 'A') || c > 'F') break; + value *= 16; //Multiply result by 10 to make room for next 1's place number + c = c - '0'; + if (c > 9) c -= 7; + value += c; //Add source number to value + counter--; //Decrement counter + } + + if (counter - count == 0) return 0; //If no number conversion were performed, return 0 + //if (*p == '-') value = -value; //If the number given was negative, make the result negative + + if (conv_count) (*conv_count)++; //Increment the converted count + return value; +} + +//sscanf +int ssf(const char *_Src, const char *_Format, ...) +{ + va_list va; //Variable argument list variable + unsigned char looking_for=0; //Static char specified in format to be found in source + uint32_t conv_count=0; //Count of conversions made + + va_start(va,_Format); //Initialize the variable argument list + while (*_Format) //While the format string has not been fully read + { + if (looking_for != 0) //If we are looking for a matching character in the source string + { + while (*_Src != looking_for && *_Src) _Src++; //While the character is not found in the source string and not the end of the source + // string, increment the pointer position + if (*_Src == looking_for) _Src++; //If the character was found, step over it + else break; //Else the end was reached and the scan is now invalid (Could not find static character) + looking_for = 0; //Clear the looking for character + } + if (*_Format == SSF_SPEC_START) //If the current format character is the specifier start character + { + _Format++; //Step over the specifier start character + if (*_Format == SSF_SPEC_DECIMAL) //If the decimal specifier type is found + { + int *value=va_arg(va,int*); //User given destination address + //*value = (int)ssf_ston(&_Src,5,&conv_count); //Run conversion + *value = (int)ssf_ston(&_Src,10,&conv_count); //Run conversion + } + else if (*_Format == SSF_SPEC_LONG) //If the long specifier type is found + { + _Format++; //Skip over the specifier type + if (*_Format == SSF_SPEC_DECIMAL) //If the decimal specifier type is found + { + int64_t *value=va_arg(va,int64_t*); //User given destination address + //*value = (int64_t)ssf_ston(&_Src,10,&conv_count); //Run conversion + *value = (int64_t)ssf_ston(&_Src,19,&conv_count); //Run conversion + } + else if (*_Format == SSF_SPEC_UHINT) //If the decimal specifier type is found + { + uint64_t *value=va_arg(va,uint64_t *); //User given destination address + //*value = (uint64_t int)ssf_hton(&_Src,12,&conv_count); //Run conversion + *value = (uint64_t)ssf_hton(&_Src,16,&conv_count); //Run conversion + } + } + else if (*_Format == SSF_SPEC_SHORTINT) //If the short int specifier type is found + { + _Format++; //Skip over the specifier type + if (*_Format == SSF_SPEC_SHORTINT) //If the short int specifier type is found + { + _Format++; //Skip over the specifier type + if (*_Format == SSF_SPEC_DECIMAL) //If the decimal specifier type is found + { + unsigned char *value=va_arg(va,unsigned char*); //User given destination address + //*value = (unsigned char)ssf_ston(&_Src,3,&conv_count); //Run conversion + *value = (unsigned char)ssf_ston(&_Src,5,&conv_count); //Run conversion + } + } + } + else if (*_Format == SSF_SPEC_STRING) //If the specifier type is string + { + char *value=va_arg(va,char*); //User given destination address, max chars read pointer + while (*_Src == SSF_SKIP_SPACE) _Src++; //Forward through the whitespace to next non whitespace + while (*_Src != SSF_SKIP_SPACE && *_Src) *value++ = *_Src++; //While any character but space and not end of string and not end location, copy char to dest + *value = 0; //Cap off the string pointer with zero + conv_count++; //Increment the converted count + } + else if (*_Format == SSF_SPEC_VERSION) //If the specifier type is string + { + char *value=va_arg(va,char*); //User given destination address, max chars read pointer + while (*_Src == SSF_SKIP_SPACE) _Src++; //Forward through the whitespace to next non whitespace + while (*_Src != SSF_DELIM_COMMA && *_Src) *value++ = *_Src++; //While any character but space and not end of string and not end location, copy char to dest + *value = 0; //Cap off the string pointer with zero + conv_count++; //Increment the converted count + } + else if (*_Format >= ASCII_NUM_START && *_Format <= ASCII_NUM_END) + { + uint32_t len = (uint32_t)ssf_ston(&_Format,3,NULL); //Convert the given length + if (*_Format == SSF_SPEC_STRING) //If the specifier type is string + { + char *value=va_arg(va,char*),*e; //User given destination address, max chars read pointer + while (*_Src == SSF_SKIP_SPACE) _Src++; //Forward through the whitespace to next non whitespace + e = (char*)_Src+len; //Set a maximum length pointer location + while (*_Src != SSF_SKIP_SPACE && *_Src && _Src != e) *value++ = *_Src++; //While any character but space and not end of string and not end location, copy char to dest + *value = 0; //Cap off the string pointer with zero + conv_count++; //Increment the converted count + } + else if (*_Format == SSF_SPEC_VERSION) //If the specifier type is string + { + char *value=va_arg(va,char*),*e; //User given destination address, max chars read pointer + while (*_Src == SSF_SKIP_SPACE) _Src++; //Forward through the whitespace to next non whitespace + e = (char*)_Src+len; //Set a maximum length pointer location + while (*_Src != SSF_DELIM_COMMA && *_Src && _Src != e) *value++ = *_Src++; //While any character but space and not end of string and not end location, copy char to dest + *value = 0; //Cap off the string pointer with zero + conv_count++; //Increment the converted count + } + } + else if (*_Format == SSF_SPEC_START) looking_for = *_Format; //If another start specifier character is found, output a specifier character + else break; //Scan is now invalid (Uknown type specified) + } + else if (*_Format == SSF_SKIP_SPACE) { } //If a space is found, ignore it + else looking_for = *_Format; //If any other character is found, it is static and should be found in src as well + _Format++; //Skip over current format character + } + + va_end(va); //End the variable argument list + return conv_count; //Return the number of conversions made +} + diff --git a/tmk_core/protocol/arm_atsam/usb/spfssf.h b/tmk_core/protocol/arm_atsam/usb/spfssf.h new file mode 100644 index 000000000..337a904df --- /dev/null +++ b/tmk_core/protocol/arm_atsam/usb/spfssf.h @@ -0,0 +1,57 @@ +#ifndef ____spfssf_h +#define ____spfssf_h + +#include + +#define sprintf spf +#define sscanf ssf + +#define SIZEOF_OFFSET 1 + +#ifndef NULL +#define NULL 0 +#endif + +#define SPF_NONE 0 + +#define SPF_SPEC_START 37 //% +#define SPF_SPEC_DECIMAL 100 //d 16bit dec signed (-32767 to 32767) DONE same as i +#define SPF_SPEC_INT 105 //i 16bit dec signed (-32767 to 32767) DONE same as d +#define SPF_SPEC_UINT 117 //u 16bit dec unsigned (0 to 65535) DONE +#define SPF_SPEC_STRING 115 //s variable length (abcd...) DONE +#define SPF_SPEC_UHINT 120 //x 16bit hex lwrc (7fa) DONE +#define SPF_SPEC_UHINT_UP 88 //x 16bit hex lwrc (7fa) DONE +#define SPF_SPEC_LONG 108 //l start of either ld or lu DONE +#define SPF_SPEC_DECIMAL 100 //ld 32bit dec signed (-2147483647 to 2147483647) DONE +#define SPF_SPEC_UNSIGNED 117 //lu 32bit dec unsigned (0 to 4294967295) DONE +#define SPF_SPEC_UHINT 120 //lx 32bit hex unsigned (0 to ffffffff) DONE + +#define SSF_SPEC_START 37 //% +#define SSF_SPEC_SHORTINT 104 //h 8bit dec signed (-127 to 127) DONE +#define SSF_LEN_SHORTINT 3 //hhd +#define SSF_SPEC_DECIMAL 100 //d 16bit dec signed (-32767 to 32767) DONE +#define SSF_LEN_DECIMAL 5 //32767 +#define SSF_SPEC_INT 105 //i 16bit dec signed (-32767 to 32767) DONE +#define SSF_LEN_INT 5 //32767 +#define SSF_SPEC_LONG 108 //l start of either ld or lu DONE +#define SSF_SPEC_DECIMAL 100 //ld 32bit dec signed (-2147483647 to 2147483647) DONE +#define SSF_SPEC_UHINT 120 //lx 32bit hex unsigned DONE +#define SSF_LEN_LDECIMAL 10 //2147483647 +#define SSF_SPEC_STRING 115 //s variable length (abcd...) DONE +#define SSF_SKIP_SPACE 32 //space + +#define SSF_SPEC_VERSION 118 //v collect to comma delimiter - special +#define SSF_DELIM_COMMA 44 //, + +#define ASCII_NUM_START 48 //0 +#define ASCII_NUM_END 58 //9 + +#define T_UINT32_0_LIMIT 14 +#define T_UINT32_1_LIMIT 27 + +int vspf(char *_Dest, const char *_Format, va_list va); +int spf(char *_Dest, const char *_Format, ...); +int ssf(const char *_Src, const char *_Format, ...); + +#endif //____spfssf_h + diff --git a/tmk_core/protocol/arm_atsam/usb/status_codes.h b/tmk_core/protocol/arm_atsam/usb/status_codes.h new file mode 100644 index 000000000..f56d2faed --- /dev/null +++ b/tmk_core/protocol/arm_atsam/usb/status_codes.h @@ -0,0 +1,158 @@ +/** + * \file + * + * \brief Status code definitions. + * + * This file defines various status codes returned by functions, + * indicating success or failure as well as what kind of failure. + * + * Copyright (C) 2012-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef STATUS_CODES_H_INCLUDED +#define STATUS_CODES_H_INCLUDED + +#include + +/** + * \defgroup group_sam0_utils_status_codes Status Codes + * + * \ingroup group_sam0_utils + * + * @{ + */ + +/** Mask to retrieve the error category of a status code. */ +#define STATUS_CATEGORY_MASK 0xF0 + +/** Mask to retrieve the error code within the category of a status code. */ +#define STATUS_ERROR_MASK 0x0F + +/** Status code error categories. */ +enum status_categories { + STATUS_CATEGORY_OK = 0x00, + STATUS_CATEGORY_COMMON = 0x10, + STATUS_CATEGORY_ANALOG = 0x30, + STATUS_CATEGORY_COM = 0x40, + STATUS_CATEGORY_IO = 0x50, +}; + +/** + * Status code that may be returned by shell commands and protocol + * implementations. + * + * \note Any change to these status codes and the corresponding + * message strings is strictly forbidden. New codes can be added, + * however, but make sure that any message string tables are updated + * at the same time. + */ +enum status_code { + STATUS_OK = STATUS_CATEGORY_OK | 0x00, + STATUS_VALID_DATA = STATUS_CATEGORY_OK | 0x01, + STATUS_NO_CHANGE = STATUS_CATEGORY_OK | 0x02, + STATUS_ABORTED = STATUS_CATEGORY_OK | 0x04, + STATUS_BUSY = STATUS_CATEGORY_OK | 0x05, + STATUS_SUSPEND = STATUS_CATEGORY_OK | 0x06, + + STATUS_ERR_IO = STATUS_CATEGORY_COMMON | 0x00, + STATUS_ERR_REQ_FLUSHED = STATUS_CATEGORY_COMMON | 0x01, + STATUS_ERR_TIMEOUT = STATUS_CATEGORY_COMMON | 0x02, + STATUS_ERR_BAD_DATA = STATUS_CATEGORY_COMMON | 0x03, + STATUS_ERR_NOT_FOUND = STATUS_CATEGORY_COMMON | 0x04, + STATUS_ERR_UNSUPPORTED_DEV = STATUS_CATEGORY_COMMON | 0x05, + STATUS_ERR_NO_MEMORY = STATUS_CATEGORY_COMMON | 0x06, + STATUS_ERR_INVALID_ARG = STATUS_CATEGORY_COMMON | 0x07, + STATUS_ERR_BAD_ADDRESS = STATUS_CATEGORY_COMMON | 0x08, + STATUS_ERR_BAD_FORMAT = STATUS_CATEGORY_COMMON | 0x0A, + STATUS_ERR_BAD_FRQ = STATUS_CATEGORY_COMMON | 0x0B, + STATUS_ERR_DENIED = STATUS_CATEGORY_COMMON | 0x0c, + STATUS_ERR_ALREADY_INITIALIZED = STATUS_CATEGORY_COMMON | 0x0d, + STATUS_ERR_OVERFLOW = STATUS_CATEGORY_COMMON | 0x0e, + STATUS_ERR_NOT_INITIALIZED = STATUS_CATEGORY_COMMON | 0x0f, + + STATUS_ERR_SAMPLERATE_UNAVAILABLE = STATUS_CATEGORY_ANALOG | 0x00, + STATUS_ERR_RESOLUTION_UNAVAILABLE = STATUS_CATEGORY_ANALOG | 0x01, + + STATUS_ERR_BAUDRATE_UNAVAILABLE = STATUS_CATEGORY_COM | 0x00, + STATUS_ERR_PACKET_COLLISION = STATUS_CATEGORY_COM | 0x01, + STATUS_ERR_PROTOCOL = STATUS_CATEGORY_COM | 0x02, + + STATUS_ERR_PIN_MUX_INVALID = STATUS_CATEGORY_IO | 0x00, +}; +typedef enum status_code status_code_genare_t; + +/** + Status codes used by MAC stack. + */ +enum status_code_wireless { + //STATUS_OK = 0, //!< Success + ERR_IO_ERROR = -1, //!< I/O error + ERR_FLUSHED = -2, //!< Request flushed from queue + ERR_TIMEOUT = -3, //!< Operation timed out + ERR_BAD_DATA = -4, //!< Data integrity check failed + ERR_PROTOCOL = -5, //!< Protocol error + ERR_UNSUPPORTED_DEV = -6, //!< Unsupported device + ERR_NO_MEMORY = -7, //!< Insufficient memory + ERR_INVALID_ARG = -8, //!< Invalid argument + ERR_BAD_ADDRESS = -9, //!< Bad address + ERR_BUSY = -10, //!< Resource is busy + ERR_BAD_FORMAT = -11, //!< Data format not recognized + ERR_NO_TIMER = -12, //!< No timer available + ERR_TIMER_ALREADY_RUNNING = -13, //!< Timer already running + ERR_TIMER_NOT_RUNNING = -14, //!< Timer not running + + /** + * \brief Operation in progress + * + * This status code is for driver-internal use when an operation + * is currently being performed. + * + * \note Drivers should never return this status code to any + * callers. It is strictly for internal use. + */ + OPERATION_IN_PROGRESS = -128, +}; + +typedef enum status_code_wireless status_code_t; + +/** @} */ + +#endif /* STATUS_CODES_H_INCLUDED */ diff --git a/tmk_core/protocol/arm_atsam/usb/udc.c b/tmk_core/protocol/arm_atsam/usb/udc.c new file mode 100644 index 000000000..12444d305 --- /dev/null +++ b/tmk_core/protocol/arm_atsam/usb/udc.c @@ -0,0 +1,1164 @@ +/** + * \file + * + * \brief USB Device Controller (UDC) + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#include "conf_usb.h" +#include "usb_protocol.h" +#include "udd.h" +#include "udc_desc.h" +#include "udi_device_conf.h" +#include "udi.h" +#include "udc.h" +#include "md_bootloader.h" + +/** + * \ingroup udc_group + * \defgroup udc_group_interne Implementation of UDC + * + * Internal implementation + * @{ + */ + +//! \name Internal variables to manage the USB device +//! @{ + +//! Device status state (see enum usb_device_status in usb_protocol.h) +static le16_t udc_device_status; + +COMPILER_WORD_ALIGNED +//! Device interface setting value +static uint8_t udc_iface_setting = 0; + +//! Device Configuration number selected by the USB host +COMPILER_WORD_ALIGNED +static uint8_t udc_num_configuration = 0; + +//! Pointer on the selected speed device configuration +static udc_config_speed_t UDC_DESC_STORAGE *udc_ptr_conf; + +//! Pointer on interface descriptor used by SETUP request. +static usb_iface_desc_t UDC_DESC_STORAGE *udc_ptr_iface; + +//! @} + + +//! \name Internal structure to store the USB device main strings +//! @{ + +/** + * \brief Language ID of USB device (US ID by default) + */ +COMPILER_WORD_ALIGNED +static UDC_DESC_STORAGE usb_str_lgid_desc_t udc_string_desc_languageid = { + .desc.bLength = sizeof(usb_str_lgid_desc_t), + .desc.bDescriptorType = USB_DT_STRING, + .string = {LE16(USB_LANGID_EN_US)} +}; + +/** + * \brief USB device manufacture name storage + * String is allocated only if USB_DEVICE_MANUFACTURE_NAME is declared + * by usb application configuration + */ +#ifdef USB_DEVICE_MANUFACTURE_NAME +static uint8_t udc_string_manufacturer_name[] = USB_DEVICE_MANUFACTURE_NAME; +#define USB_DEVICE_MANUFACTURE_NAME_SIZE (sizeof(udc_string_manufacturer_name)-1) +#else +#define USB_DEVICE_MANUFACTURE_NAME_SIZE 0 +#endif + +/** + * \brief USB device product name storage + * String is allocated only if USB_DEVICE_PRODUCT_NAME is declared + * by usb application configuration + */ +#ifdef USB_DEVICE_PRODUCT_NAME +static uint8_t udc_string_product_name[] = USB_DEVICE_PRODUCT_NAME; +#define USB_DEVICE_PRODUCT_NAME_SIZE (sizeof(udc_string_product_name)-1) +#else +#define USB_DEVICE_PRODUCT_NAME_SIZE 0 +#endif + +#if defined USB_DEVICE_SERIAL_NAME +#define USB_DEVICE_SERIAL_NAME_SIZE (sizeof(USB_DEVICE_SERIAL_NAME)-1) +#else +#define USB_DEVICE_SERIAL_NAME_SIZE 0 +#endif + +uint8_t usb_device_serial_name_size = 0; +#if defined USB_DEVICE_SERIAL_USE_BOOTLOADER_SERIAL +uint8_t bootloader_serial_number[BOOTLOADER_SERIAL_MAX_SIZE+1]=""; +#endif +static const uint8_t *udc_get_string_serial_name(void) +{ +#if defined USB_DEVICE_SERIAL_USE_BOOTLOADER_SERIAL + uint32_t serial_ptrloc = (uint32_t)&_srom - 4; + uint32_t serial_address = *(uint32_t *)serial_ptrloc; //Address of bootloader's serial number if available + + if (serial_address != 0xFFFFFFFF && serial_address < serial_ptrloc) //Check for factory programmed serial address + { + if ((serial_address & 0xFF) % 4 == 0) //Check alignment + { + uint16_t *serial_use = (uint16_t *)(serial_address); //Point to address of string in rom + uint8_t serial_length = 0; + + while ((*(serial_use + serial_length) > 32 && *(serial_use + serial_length) < 127) && + serial_length < BOOTLOADER_SERIAL_MAX_SIZE) + { + bootloader_serial_number[serial_length] = *(serial_use + serial_length) & 0xFF; + serial_length++; + } + bootloader_serial_number[serial_length] = 0; + + usb_device_serial_name_size = serial_length; + + return bootloader_serial_number; //Use serial programmed into bootloader rom + } + } +#endif + + usb_device_serial_name_size = USB_DEVICE_SERIAL_NAME_SIZE; + +#if defined USB_DEVICE_SERIAL_NAME + return (const uint8_t *)USB_DEVICE_SERIAL_NAME; //Use serial supplied by keyboard's config.h +#else + return 0; //No serial supplied +#endif +} + +/** + * \brief USB device string descriptor + * Structure used to transfer ASCII strings to USB String descriptor structure. + */ +#ifndef BOOTLOADER_SERIAL_MAX_SIZE +#define BOOTLOADER_SERIAL_MAX_SIZE 0 +#endif //BOOTLOADER_SERIAL_MAX_SIZE +struct udc_string_desc_t { + usb_str_desc_t header; + le16_t string[Max(Max(Max(USB_DEVICE_MANUFACTURE_NAME_SIZE, \ + USB_DEVICE_PRODUCT_NAME_SIZE), USB_DEVICE_SERIAL_NAME_SIZE), \ + BOOTLOADER_SERIAL_MAX_SIZE)]; +}; +COMPILER_WORD_ALIGNED +static UDC_DESC_STORAGE struct udc_string_desc_t udc_string_desc = { + .header.bDescriptorType = USB_DT_STRING +}; +//! @} + +usb_iface_desc_t UDC_DESC_STORAGE *udc_get_interface_desc(void) +{ + return udc_ptr_iface; +} + +/** + * \brief Returns a value to check the end of USB Configuration descriptor + * + * \return address after the last byte of USB Configuration descriptor + */ +static usb_conf_desc_t UDC_DESC_STORAGE *udc_get_eof_conf(void) +{ + return (UDC_DESC_STORAGE usb_conf_desc_t *) ((uint8_t *) + udc_ptr_conf->desc + + le16_to_cpu(udc_ptr_conf->desc->wTotalLength)); +} + +#if (0!=USB_DEVICE_MAX_EP) +/** + * \brief Search specific descriptor in global interface descriptor + * + * \param desc Address of interface descriptor + * or previous specific descriptor found + * \param desc_id Descriptor ID to search + * + * \return address of specific descriptor found + * \return NULL if it is the end of global interface descriptor + */ +static usb_conf_desc_t UDC_DESC_STORAGE *udc_next_desc_in_iface(usb_conf_desc_t + UDC_DESC_STORAGE * desc, uint8_t desc_id) +{ + usb_conf_desc_t UDC_DESC_STORAGE *ptr_eof_desc; + + ptr_eof_desc = udc_get_eof_conf(); + // Go to next descriptor + desc = (UDC_DESC_STORAGE usb_conf_desc_t *) ((uint8_t *) desc + + desc->bLength); + // Check the end of configuration descriptor + while (ptr_eof_desc > desc) { + // If new interface descriptor is found, + // then it is the end of the current global interface descriptor + if (USB_DT_INTERFACE == desc->bDescriptorType) { + break; // End of global interface descriptor + } + if (desc_id == desc->bDescriptorType) { + return desc; // Specific descriptor found + } + // Go to next descriptor + desc = (UDC_DESC_STORAGE usb_conf_desc_t *) ((uint8_t *) desc + + desc->bLength); + } + return NULL; // No specific descriptor found +} +#endif + +/** + * \brief Search an interface descriptor + * This routine updates the internal pointer udc_ptr_iface. + * + * \param iface_num Interface number to find in Configuration Descriptor + * \param setting_num Setting number of interface to find + * + * \return 1 if found or 0 if not found + */ +static bool udc_update_iface_desc(uint8_t iface_num, uint8_t setting_num) +{ + usb_conf_desc_t UDC_DESC_STORAGE *ptr_end_desc; + + if (0 == udc_num_configuration) { + return false; + } + + if (iface_num >= udc_ptr_conf->desc->bNumInterfaces) { + return false; + } + + // Start at the beginning of configuration descriptor + udc_ptr_iface = (UDC_DESC_STORAGE usb_iface_desc_t *) + udc_ptr_conf->desc; + + // Check the end of configuration descriptor + ptr_end_desc = udc_get_eof_conf(); + while (ptr_end_desc > + (UDC_DESC_STORAGE usb_conf_desc_t *) udc_ptr_iface) { + if (USB_DT_INTERFACE == udc_ptr_iface->bDescriptorType) { + // A interface descriptor is found + // Check interface and alternate setting number + if ((iface_num == udc_ptr_iface->bInterfaceNumber) && + (setting_num == + udc_ptr_iface->bAlternateSetting)) { + return true; // Interface found + } + } + // Go to next descriptor + udc_ptr_iface = (UDC_DESC_STORAGE usb_iface_desc_t *) ( + (uint8_t *) udc_ptr_iface + + udc_ptr_iface->bLength); + } + return false; // Interface not found +} + +/** + * \brief Disables an usb device interface (UDI) + * This routine call the UDI corresponding to interface number + * + * \param iface_num Interface number to disable + * + * \return 1 if it is done or 0 if interface is not found + */ +static bool udc_iface_disable(uint8_t iface_num) +{ + udi_api_t UDC_DESC_STORAGE *udi_api; + + // Select first alternate setting of the interface + // to update udc_ptr_iface before call iface->getsetting() + if (!udc_update_iface_desc(iface_num, 0)) { + return false; + } + + // Select the interface with the current alternate setting + udi_api = udc_ptr_conf->udi_apis[iface_num]; + +#if (0!=USB_DEVICE_MAX_EP) + if (!udc_update_iface_desc(iface_num, udi_api->getsetting())) { + return false; + } + + // Start at the beginning of interface descriptor + { + usb_ep_desc_t UDC_DESC_STORAGE *ep_desc; + ep_desc = (UDC_DESC_STORAGE usb_ep_desc_t *) udc_ptr_iface; + while (1) { + // Search Endpoint descriptor included in global interface descriptor + ep_desc = (UDC_DESC_STORAGE usb_ep_desc_t *) + udc_next_desc_in_iface((UDC_DESC_STORAGE + usb_conf_desc_t *) + ep_desc, USB_DT_ENDPOINT); + if (NULL == ep_desc) { + break; + } + // Free the endpoint used by the interface + udd_ep_free(ep_desc->bEndpointAddress); + } + } +#endif + + // Disable interface + udi_api->disable(); + return true; +} + +/** + * \brief Enables an usb device interface (UDI) + * This routine calls the UDI corresponding + * to the interface and setting number. + * + * \param iface_num Interface number to enable + * \param setting_num Setting number to enable + * + * \return 1 if it is done or 0 if interface is not found + */ +static bool udc_iface_enable(uint8_t iface_num, uint8_t setting_num) +{ + // Select the interface descriptor + if (!udc_update_iface_desc(iface_num, setting_num)) { + return false; + } + +#if (0!=USB_DEVICE_MAX_EP) + usb_ep_desc_t UDC_DESC_STORAGE *ep_desc; + + // Start at the beginning of the global interface descriptor + ep_desc = (UDC_DESC_STORAGE usb_ep_desc_t *) udc_ptr_iface; + while (1) { + // Search Endpoint descriptor included in the global interface descriptor + ep_desc = (UDC_DESC_STORAGE usb_ep_desc_t *) + udc_next_desc_in_iface((UDC_DESC_STORAGE + usb_conf_desc_t *) ep_desc, + USB_DT_ENDPOINT); + if (NULL == ep_desc) + break; + // Alloc the endpoint used by the interface + if (!udd_ep_alloc(ep_desc->bEndpointAddress, + ep_desc->bmAttributes, + le16_to_cpu + (ep_desc->wMaxPacketSize))) { + return false; + } + } +#endif + // Enable the interface + return udc_ptr_conf->udi_apis[iface_num]->enable(); +} + +/*! \brief Start the USB Device stack + */ +void udc_start(void) +{ + udd_enable(); +} + +/*! \brief Stop the USB Device stack + */ +void udc_stop(void) +{ + udd_disable(); + udc_reset(); +} + +/** + * \brief Reset the current configuration of the USB device, + * This routines can be called by UDD when a RESET on the USB line occurs. + */ +void udc_reset(void) +{ + uint8_t iface_num; + + if (udc_num_configuration) { + for (iface_num = 0; + iface_num < udc_ptr_conf->desc->bNumInterfaces; + iface_num++) { + udc_iface_disable(iface_num); + } + } + udc_num_configuration = 0; +#if (USB_CONFIG_ATTR_REMOTE_WAKEUP \ + == (USB_DEVICE_ATTR & USB_CONFIG_ATTR_REMOTE_WAKEUP)) + if (CPU_TO_LE16(USB_DEV_STATUS_REMOTEWAKEUP) & udc_device_status) { + // Remote wakeup is enabled then disable it + UDC_REMOTEWAKEUP_DISABLE(); + } +#endif + udc_device_status = +#if (USB_DEVICE_ATTR & USB_CONFIG_ATTR_SELF_POWERED) + CPU_TO_LE16(USB_DEV_STATUS_SELF_POWERED); +#else + CPU_TO_LE16(USB_DEV_STATUS_BUS_POWERED); +#endif +} + +void udc_sof_notify(void) +{ + uint8_t iface_num; + + if (udc_num_configuration) { + for (iface_num = 0; + iface_num < udc_ptr_conf->desc->bNumInterfaces; + iface_num++) { + if (udc_ptr_conf->udi_apis[iface_num]->sof_notify != NULL) { + udc_ptr_conf->udi_apis[iface_num]->sof_notify(); + } + } + } +} + +/** + * \brief Standard device request to get device status + * + * \return true if success + */ +static bool udc_req_std_dev_get_status(void) +{ + if (udd_g_ctrlreq.req.wLength != sizeof(udc_device_status)) { + return false; + } + + udd_set_setup_payload( (uint8_t *) & udc_device_status, + sizeof(udc_device_status)); + return true; +} + +#if (0!=USB_DEVICE_MAX_EP) +/** + * \brief Standard endpoint request to get endpoint status + * + * \return true if success + */ +static bool udc_req_std_ep_get_status(void) +{ + static le16_t udc_ep_status; + + if (udd_g_ctrlreq.req.wLength != sizeof(udc_ep_status)) { + return false; + } + + udc_ep_status = udd_ep_is_halted(udd_g_ctrlreq.req. + wIndex & 0xFF) ? CPU_TO_LE16(USB_EP_STATUS_HALTED) : 0; + + udd_set_setup_payload( (uint8_t *) & udc_ep_status, + sizeof(udc_ep_status)); + return true; +} +#endif + +/** + * \brief Standard device request to change device status + * + * \return true if success + */ +static bool udc_req_std_dev_clear_feature(void) +{ + if (udd_g_ctrlreq.req.wLength) { + return false; + } + + if (udd_g_ctrlreq.req.wValue == USB_DEV_FEATURE_REMOTE_WAKEUP) { + udc_device_status &= CPU_TO_LE16(~(uint32_t)USB_DEV_STATUS_REMOTEWAKEUP); +#if (USB_CONFIG_ATTR_REMOTE_WAKEUP \ + == (USB_DEVICE_ATTR & USB_CONFIG_ATTR_REMOTE_WAKEUP)) + UDC_REMOTEWAKEUP_DISABLE(); +#endif + return true; + } + return false; +} + +#if (0!=USB_DEVICE_MAX_EP) +/** + * \brief Standard endpoint request to clear endpoint feature + * + * \return true if success + */ +static bool udc_req_std_ep_clear_feature(void) +{ + if (udd_g_ctrlreq.req.wLength) { + return false; + } + + if (udd_g_ctrlreq.req.wValue == USB_EP_FEATURE_HALT) { + return udd_ep_clear_halt(udd_g_ctrlreq.req.wIndex & 0xFF); + } + return false; +} +#endif + +/** + * \brief Standard device request to set a feature + * + * \return true if success + */ +static bool udc_req_std_dev_set_feature(void) +{ + if (udd_g_ctrlreq.req.wLength) { + return false; + } + + switch (udd_g_ctrlreq.req.wValue) { + + case USB_DEV_FEATURE_REMOTE_WAKEUP: +#if (USB_CONFIG_ATTR_REMOTE_WAKEUP \ + == (USB_DEVICE_ATTR & USB_CONFIG_ATTR_REMOTE_WAKEUP)) + udc_device_status |= CPU_TO_LE16(USB_DEV_STATUS_REMOTEWAKEUP); + UDC_REMOTEWAKEUP_ENABLE(); + return true; +#else + return false; +#endif + +#ifdef USB_DEVICE_HS_SUPPORT + case USB_DEV_FEATURE_TEST_MODE: + if (!udd_is_high_speed()) { + break; + } + if (udd_g_ctrlreq.req.wIndex & 0xff) { + break; + } + // Unconfigure the device, terminating all ongoing requests + udc_reset(); + switch ((udd_g_ctrlreq.req.wIndex >> 8) & 0xFF) { + case USB_DEV_TEST_MODE_J: + udd_g_ctrlreq.callback = udd_test_mode_j; + return true; + + case USB_DEV_TEST_MODE_K: + udd_g_ctrlreq.callback = udd_test_mode_k; + return true; + + case USB_DEV_TEST_MODE_SE0_NAK: + udd_g_ctrlreq.callback = udd_test_mode_se0_nak; + return true; + + case USB_DEV_TEST_MODE_PACKET: + udd_g_ctrlreq.callback = udd_test_mode_packet; + return true; + + case USB_DEV_TEST_MODE_FORCE_ENABLE: // Only for downstream facing hub ports + default: + break; + } + break; +#endif + default: + break; + } + return false; +} + +/** + * \brief Standard endpoint request to halt an endpoint + * + * \return true if success + */ +#if (0!=USB_DEVICE_MAX_EP) +static bool udc_req_std_ep_set_feature(void) +{ + if (udd_g_ctrlreq.req.wLength) { + return false; + } + if (udd_g_ctrlreq.req.wValue == USB_EP_FEATURE_HALT) { + udd_ep_abort(udd_g_ctrlreq.req.wIndex & 0xFF); + return udd_ep_set_halt(udd_g_ctrlreq.req.wIndex & 0xFF); + } + return false; +} +#endif + +/** + * \brief Change the address of device + * Callback called at the end of request set address + */ +static void udc_valid_address(void) +{ + udd_set_address(udd_g_ctrlreq.req.wValue & 0x7F); +} + +/** + * \brief Standard device request to set device address + * + * \return true if success + */ +static bool udc_req_std_dev_set_address(void) +{ + if (udd_g_ctrlreq.req.wLength) { + return false; + } + + // The address must be changed at the end of setup request after the handshake + // then we use a callback to change address + udd_g_ctrlreq.callback = udc_valid_address; + return true; +} + +/** + * \brief Standard device request to get device string descriptor + * + * \return true if success + */ +static bool udc_req_std_dev_get_str_desc(void) +{ + uint8_t i; + const uint8_t *str; + uint8_t str_length = 0; + + // Link payload pointer to the string corresponding at request + switch (udd_g_ctrlreq.req.wValue & 0xff) { + case 0: + udd_set_setup_payload((uint8_t *) &udc_string_desc_languageid, + sizeof(udc_string_desc_languageid)); + break; + +#ifdef USB_DEVICE_MANUFACTURE_NAME + case 1: + str_length = USB_DEVICE_MANUFACTURE_NAME_SIZE; + str = udc_string_manufacturer_name; + break; +#endif +#ifdef USB_DEVICE_PRODUCT_NAME + case 2: + str_length = USB_DEVICE_PRODUCT_NAME_SIZE; + str = udc_string_product_name; + break; +#endif + case 3: + str = udc_get_string_serial_name(); + str_length = usb_device_serial_name_size; + break; + default: +#ifdef UDC_GET_EXTRA_STRING + if (UDC_GET_EXTRA_STRING()) { + break; + } +#endif + return false; + } + + if (str_length) { + for(i = 0; i < str_length; i++) { + udc_string_desc.string[i] = cpu_to_le16((le16_t)str[i]); + } + + udc_string_desc.header.bLength = 2 + (str_length) * 2; + udd_set_setup_payload( + (uint8_t *) &udc_string_desc, + udc_string_desc.header.bLength); + } + + return true; +} + +/** + * \brief Standard device request to get descriptors about USB device + * + * \return true if success + */ +static bool udc_req_std_dev_get_descriptor(void) +{ + uint8_t conf_num; + + conf_num = udd_g_ctrlreq.req.wValue & 0xff; + + // Check descriptor ID + switch ((uint8_t) (udd_g_ctrlreq.req.wValue >> 8)) { + case USB_DT_DEVICE: + // Device descriptor requested +#ifdef USB_DEVICE_HS_SUPPORT + if (!udd_is_high_speed()) { + udd_set_setup_payload( + (uint8_t *) udc_config.confdev_hs, + udc_config.confdev_hs->bLength); + } else +#endif + { + udd_set_setup_payload( + (uint8_t *) udc_config.confdev_lsfs, + udc_config.confdev_lsfs->bLength); + } + break; + + case USB_DT_CONFIGURATION: + // Configuration descriptor requested +#ifdef USB_DEVICE_HS_SUPPORT + if (udd_is_high_speed()) { + // HS descriptor + if (conf_num >= udc_config.confdev_hs->bNumConfigurations) { + return false; + } + udd_set_setup_payload( + (uint8_t *)udc_config.conf_hs[conf_num].desc, + le16_to_cpu(udc_config.conf_hs[conf_num].desc->wTotalLength)); + } else +#endif + { + // FS descriptor + if (conf_num >= udc_config.confdev_lsfs->bNumConfigurations) { + return false; + } + udd_set_setup_payload( + (uint8_t *)udc_config.conf_lsfs[conf_num].desc, + le16_to_cpu(udc_config.conf_lsfs[conf_num].desc->wTotalLength)); + } + ((usb_conf_desc_t *) udd_g_ctrlreq.payload)->bDescriptorType = + USB_DT_CONFIGURATION; + break; + +#ifdef USB_DEVICE_HS_SUPPORT + case USB_DT_DEVICE_QUALIFIER: + // Device qualifier descriptor requested + udd_set_setup_payload( (uint8_t *) udc_config.qualifier, + udc_config.qualifier->bLength); + break; + + case USB_DT_OTHER_SPEED_CONFIGURATION: + // Other configuration descriptor requested + if (!udd_is_high_speed()) { + // HS descriptor + if (conf_num >= udc_config.confdev_hs->bNumConfigurations) { + return false; + } + udd_set_setup_payload( + (uint8_t *)udc_config.conf_hs[conf_num].desc, + le16_to_cpu(udc_config.conf_hs[conf_num].desc->wTotalLength)); + } else { + // FS descriptor + if (conf_num >= udc_config.confdev_lsfs->bNumConfigurations) { + return false; + } + udd_set_setup_payload( + (uint8_t *)udc_config.conf_lsfs[conf_num].desc, + le16_to_cpu(udc_config.conf_lsfs[conf_num].desc->wTotalLength)); + } + ((usb_conf_desc_t *) udd_g_ctrlreq.payload)->bDescriptorType = + USB_DT_OTHER_SPEED_CONFIGURATION; + break; +#endif + + case USB_DT_BOS: + // Device BOS descriptor requested + if (udc_config.conf_bos == NULL) { + return false; + } + udd_set_setup_payload( (uint8_t *) udc_config.conf_bos, + udc_config.conf_bos->wTotalLength); + break; + + case USB_DT_STRING: + // String descriptor requested + if (!udc_req_std_dev_get_str_desc()) { + return false; + } + break; + + default: + // Unknown descriptor requested + return false; + } + // if the descriptor is larger than length requested, then reduce it + if (udd_g_ctrlreq.req.wLength < udd_g_ctrlreq.payload_size) { + udd_g_ctrlreq.payload_size = udd_g_ctrlreq.req.wLength; + } + return true; +} + +/** + * \brief Standard device request to get configuration number + * + * \return true if success + */ +static bool udc_req_std_dev_get_configuration(void) +{ + if (udd_g_ctrlreq.req.wLength != 1) { + return false; + } + + udd_set_setup_payload(&udc_num_configuration,1); + return true; +} + +/** + * \brief Standard device request to enable a configuration + * + * \return true if success + */ +static bool udc_req_std_dev_set_configuration(void) +{ + uint8_t iface_num; + + // Check request length + if (udd_g_ctrlreq.req.wLength) { + return false; + } + // Authorize configuration only if the address is valid + if (!udd_getaddress()) { + return false; + } + // Check the configuration number requested +#ifdef USB_DEVICE_HS_SUPPORT + if (udd_is_high_speed()) { + // HS descriptor + if ((udd_g_ctrlreq.req.wValue & 0xFF) > + udc_config.confdev_hs->bNumConfigurations) { + return false; + } + } else +#endif + { + // FS descriptor + if ((udd_g_ctrlreq.req.wValue & 0xFF) > + udc_config.confdev_lsfs->bNumConfigurations) { + return false; + } + } + + // Reset current configuration + udc_reset(); + + // Enable new configuration + udc_num_configuration = udd_g_ctrlreq.req.wValue & 0xFF; + if (udc_num_configuration == 0) { + return true; // Default empty configuration requested + } + // Update pointer of the configuration descriptor +#ifdef USB_DEVICE_HS_SUPPORT + if (udd_is_high_speed()) { + // HS descriptor + udc_ptr_conf = &udc_config.conf_hs[udc_num_configuration - 1]; + } else +#endif + { + // FS descriptor + udc_ptr_conf = &udc_config.conf_lsfs[udc_num_configuration - 1]; + } + // Enable all interfaces of the selected configuration + for (iface_num = 0; iface_num < udc_ptr_conf->desc->bNumInterfaces; + iface_num++) { + if (!udc_iface_enable(iface_num, 0)) { + return false; + } + } + return true; +} + +/** + * \brief Standard interface request + * to get the alternate setting number of an interface + * + * \return true if success + */ +static bool udc_req_std_iface_get_setting(void) +{ + uint8_t iface_num; + udi_api_t UDC_DESC_STORAGE *udi_api; + + if (udd_g_ctrlreq.req.wLength != 1) { + return false; // Error in request + } + if (!udc_num_configuration) { + return false; // The device is not is configured state yet + } + + // Check the interface number included in the request + iface_num = udd_g_ctrlreq.req.wIndex & 0xFF; + if (iface_num >= udc_ptr_conf->desc->bNumInterfaces) { + return false; + } + + // Select first alternate setting of the interface to update udc_ptr_iface + // before call iface->getsetting() + if (!udc_update_iface_desc(iface_num, 0)) { + return false; + } + // Get alternate setting from UDI + udi_api = udc_ptr_conf->udi_apis[iface_num]; + udc_iface_setting = udi_api->getsetting(); + + // Link value to payload pointer of request + udd_set_setup_payload(&udc_iface_setting,1); + return true; +} + +/** + * \brief Standard interface request + * to set an alternate setting of an interface + * + * \return true if success + */ +static bool udc_req_std_iface_set_setting(void) +{ + uint8_t iface_num, setting_num; + + if (udd_g_ctrlreq.req.wLength) { + return false; // Error in request + } + if (!udc_num_configuration) { + return false; // The device is not is configured state yet + } + + iface_num = udd_g_ctrlreq.req.wIndex & 0xFF; + setting_num = udd_g_ctrlreq.req.wValue & 0xFF; + + // Disable current setting + if (!udc_iface_disable(iface_num)) { + return false; + } + + // Enable new setting + return udc_iface_enable(iface_num, setting_num); +} + +/** + * \brief Main routine to manage the standard USB SETUP request + * + * \return true if the request is supported + */ +static bool udc_reqstd(void) +{ + if (Udd_setup_is_in()) { + // GET Standard Requests + if (udd_g_ctrlreq.req.wLength == 0) { + return false; // Error for USB host + } + + if (USB_REQ_RECIP_DEVICE == Udd_setup_recipient()) { + // Standard Get Device request + switch (udd_g_ctrlreq.req.bRequest) { + case USB_REQ_GET_STATUS: + return udc_req_std_dev_get_status(); + case USB_REQ_GET_DESCRIPTOR: + return udc_req_std_dev_get_descriptor(); + case USB_REQ_GET_CONFIGURATION: + return udc_req_std_dev_get_configuration(); + default: + break; + } + } + + if (USB_REQ_RECIP_INTERFACE == Udd_setup_recipient()) { + // Standard Get Interface request + switch (udd_g_ctrlreq.req.bRequest) { + case USB_REQ_GET_INTERFACE: + return udc_req_std_iface_get_setting(); + default: + break; + } + } +#if (0!=USB_DEVICE_MAX_EP) + if (USB_REQ_RECIP_ENDPOINT == Udd_setup_recipient()) { + // Standard Get Endpoint request + switch (udd_g_ctrlreq.req.bRequest) { + case USB_REQ_GET_STATUS: + return udc_req_std_ep_get_status(); + default: + break; + } + } +#endif + } else { + // SET Standard Requests + if (USB_REQ_RECIP_DEVICE == Udd_setup_recipient()) { + // Standard Set Device request + switch (udd_g_ctrlreq.req.bRequest) { + case USB_REQ_SET_ADDRESS: + return udc_req_std_dev_set_address(); + case USB_REQ_CLEAR_FEATURE: + return udc_req_std_dev_clear_feature(); + case USB_REQ_SET_FEATURE: + return udc_req_std_dev_set_feature(); + case USB_REQ_SET_CONFIGURATION: + return udc_req_std_dev_set_configuration(); + case USB_REQ_SET_DESCRIPTOR: + /* Not supported (defined as optional by the USB 2.0 spec) */ + break; + default: + break; + } + } + + if (USB_REQ_RECIP_INTERFACE == Udd_setup_recipient()) { + // Standard Set Interface request + switch (udd_g_ctrlreq.req.bRequest) { + case USB_REQ_SET_INTERFACE: + return udc_req_std_iface_set_setting(); + default: + break; + } + } +#if (0!=USB_DEVICE_MAX_EP) + if (USB_REQ_RECIP_ENDPOINT == Udd_setup_recipient()) { + // Standard Set Endpoint request + switch (udd_g_ctrlreq.req.bRequest) { + case USB_REQ_CLEAR_FEATURE: + return udc_req_std_ep_clear_feature(); + case USB_REQ_SET_FEATURE: + return udc_req_std_ep_set_feature(); + default: + break; + } + } +#endif + } + return false; +} + +/** + * \brief Send the SETUP interface request to UDI + * + * \return true if the request is supported + */ +static bool udc_req_iface(void) +{ + uint8_t iface_num; + udi_api_t UDC_DESC_STORAGE *udi_api; + + if (0 == udc_num_configuration) { + return false; // The device is not is configured state yet + } + // Check interface number + iface_num = udd_g_ctrlreq.req.wIndex & 0xFF; + if (iface_num >= udc_ptr_conf->desc->bNumInterfaces) { + return false; + } + + //* To update udc_ptr_iface with the selected interface in request + // Select first alternate setting of interface to update udc_ptr_iface + // before calling udi_api->getsetting() + if (!udc_update_iface_desc(iface_num, 0)) { + return false; + } + // Select the interface with the current alternate setting + udi_api = udc_ptr_conf->udi_apis[iface_num]; + if (!udc_update_iface_desc(iface_num, udi_api->getsetting())) { + return false; + } + + // Send the SETUP request to the UDI corresponding to the interface number + return udi_api->setup(); +} + +/** + * \brief Send the SETUP interface request to UDI + * + * \return true if the request is supported + */ +static bool udc_req_ep(void) +{ + uint8_t iface_num; + udi_api_t UDC_DESC_STORAGE *udi_api; + + if (0 == udc_num_configuration) { + return false; // The device is not is configured state yet + } + // Send this request on all enabled interfaces + iface_num = udd_g_ctrlreq.req.wIndex & 0xFF; + for (iface_num = 0; iface_num < udc_ptr_conf->desc->bNumInterfaces; + iface_num++) { + // Select the interface with the current alternate setting + udi_api = udc_ptr_conf->udi_apis[iface_num]; + if (!udc_update_iface_desc(iface_num, udi_api->getsetting())) { + return false; + } + + // Send the SETUP request to the UDI + if (udi_api->setup()) { + return true; + } + } + return false; +} + +/** + * \brief Main routine to manage the USB SETUP request. + * + * This function parses a USB SETUP request and submits an appropriate + * response back to the host or, in the case of SETUP OUT requests + * with data, sets up a buffer for receiving the data payload. + * + * The main standard requests defined by the USB 2.0 standard are handled + * internally. The interface requests are sent to UDI, and the specific request + * sent to a specific application callback. + * + * \return true if the request is supported, else the request is stalled by UDD + */ +bool udc_process_setup(void) +{ + // By default no data (receive/send) and no callbacks registered + udd_g_ctrlreq.payload_size = 0; + udd_g_ctrlreq.callback = NULL; + udd_g_ctrlreq.over_under_run = NULL; + + if (Udd_setup_is_in()) { + if (udd_g_ctrlreq.req.wLength == 0) { + return false; // Error from USB host + } + } + + // If standard request then try to decode it in UDC + if (Udd_setup_type() == USB_REQ_TYPE_STANDARD) { + if (udc_reqstd()) { + return true; + } + } + + // If interface request then try to decode it in UDI + if (Udd_setup_recipient() == USB_REQ_RECIP_INTERFACE) { + if (udc_req_iface()) { + return true; + } + } + + // If endpoint request then try to decode it in UDI + if (Udd_setup_recipient() == USB_REQ_RECIP_ENDPOINT) { + if (udc_req_ep()) { + return true; + } + } + + // Here SETUP request unknown by UDC and UDIs +#ifdef USB_DEVICE_SPECIFIC_REQUEST + // Try to decode it in specific callback + return USB_DEVICE_SPECIFIC_REQUEST(); // Ex: Vendor request,... +#else + return false; +#endif +} + +//! @} diff --git a/tmk_core/protocol/arm_atsam/usb/udc.h b/tmk_core/protocol/arm_atsam/usb/udc.h new file mode 100644 index 000000000..c88a442cb --- /dev/null +++ b/tmk_core/protocol/arm_atsam/usb/udc.h @@ -0,0 +1,260 @@ +/** + * \file + * + * \brief Interface of the USB Device Controller (UDC) + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _UDC_H_ +#define _UDC_H_ + +#include "conf_usb.h" +#include "usb_protocol.h" +#include "udc_desc.h" +#include "udd.h" + +#if USB_DEVICE_VENDOR_ID == 0 +# error USB_DEVICE_VENDOR_ID cannot be equal to 0 +#endif + +#if USB_DEVICE_PRODUCT_ID == 0 +# error USB_DEVICE_PRODUCT_ID cannot be equal to 0 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \ingroup usb_device_group + * \defgroup udc_group USB Device Controller (UDC) + * + * The UDC provides a high-level abstraction of the usb device. + * You can use these functions to control the main device state + * (start/attach/wakeup). + * + * \section USB_DEVICE_CONF USB Device Custom configuration + * The following USB Device configuration must be included in the conf_usb.h + * file of the application. + * + * USB_DEVICE_VENDOR_ID (Word)
+ * Vendor ID provided by USB org (ATMEL 0x03EB). + * + * USB_DEVICE_PRODUCT_ID (Word)
+ * Product ID (Referenced in usb_atmel.h). + * + * USB_DEVICE_MAJOR_VERSION (Byte)
+ * Major version of the device + * + * USB_DEVICE_MINOR_VERSION (Byte)
+ * Minor version of the device + * + * USB_DEVICE_MANUFACTURE_NAME (string)
+ * ASCII name for the manufacture + * + * USB_DEVICE_PRODUCT_NAME (string)
+ * ASCII name for the product + * + * USB_DEVICE_SERIAL_NAME (string)
+ * ASCII name to enable and set a serial number + * + * USB_DEVICE_POWER (Numeric)
+ * (unit mA) Maximum device power + * + * USB_DEVICE_ATTR (Byte)
+ * USB attributes available: + * - USB_CONFIG_ATTR_SELF_POWERED + * - USB_CONFIG_ATTR_REMOTE_WAKEUP + * Note: if remote wake enabled then defines remotewakeup callbacks, + * see Table 5-2. External API from UDC - Callback + * + * USB_DEVICE_LOW_SPEED (Only defined)
+ * Force the USB Device to run in low speed + * + * USB_DEVICE_HS_SUPPORT (Only defined)
+ * Authorize the USB Device to run in high speed + * + * USB_DEVICE_MAX_EP (Byte)
+ * Define the maximum endpoint number used by the USB Device.
+ * This one is already defined in UDI default configuration. + * Ex: + * - When endpoint control 0x00, endpoint 0x01 and + * endpoint 0x82 is used then USB_DEVICE_MAX_EP=2 + * - When only endpoint control 0x00 is used then USB_DEVICE_MAX_EP=0 + * - When endpoint 0x01 and endpoint 0x81 is used then USB_DEVICE_MAX_EP=1
+ * (configuration not possible on USBB interface) + * @{ + */ + +/** + * \brief Authorizes the VBUS event + * + * \return true, if the VBUS monitoring is possible. + * + * \section udc_vbus_monitoring VBus monitoring used cases + * + * The VBus monitoring is used only for USB SELF Power application. + * + * - By default the USB device is automatically attached when Vbus is high + * or when USB is start for devices without internal Vbus monitoring. + * conf_usb.h file does not contains define USB_DEVICE_ATTACH_AUTO_DISABLE. + * \code //#define USB_DEVICE_ATTACH_AUTO_DISABLE \endcode + * + * - Add custom VBUS monitoring. conf_usb.h file contains define + * USB_DEVICE_ATTACH_AUTO_DISABLE: + * \code #define USB_DEVICE_ATTACH_AUTO_DISABLE \endcode + * User C file contains: + * \code + // Authorize VBUS monitoring + if (!udc_include_vbus_monitoring()) { + // Implement custom VBUS monitoring via GPIO or other + } + Event_VBUS_present() // VBUS interrupt or GPIO interrupt or other + { + // Attach USB Device + udc_attach(); + } +\endcode + * + * - Case of battery charging. conf_usb.h file contains define + * USB_DEVICE_ATTACH_AUTO_DISABLE: + * \code #define USB_DEVICE_ATTACH_AUTO_DISABLE \endcode + * User C file contains: + * \code + Event VBUS present() // VBUS interrupt or GPIO interrupt or .. + { + // Authorize battery charging, but wait key press to start USB. + } + Event Key press() + { + // Stop batteries charging + // Start USB + udc_attach(); + } +\endcode + */ +static inline bool udc_include_vbus_monitoring(void) +{ + return udd_include_vbus_monitoring(); +} + +/*! \brief Start the USB Device stack + */ +void udc_start(void); + +/*! \brief Stop the USB Device stack + */ +void udc_stop(void); + +/** + * \brief Attach device to the bus when possible + * + * \warning If a VBus control is included in driver, + * then it will attach device when an acceptable Vbus + * level from the host is detected. + */ +static inline void udc_attach(void) +{ + udd_attach(); +} + +/** + * \brief Detaches the device from the bus + * + * The driver must remove pull-up on USB line D- or D+. + */ +static inline void udc_detach(void) +{ + udd_detach(); +} + +/*! \brief The USB driver sends a resume signal called \e "Upstream Resume" + * This is authorized only when the remote wakeup feature is enabled by host. + */ +static inline void udc_remotewakeup(void) +{ + udd_send_remotewakeup(); +} + +/** + * \brief Returns a pointer on the current interface descriptor + * + * \return pointer on the current interface descriptor. + */ +usb_iface_desc_t UDC_DESC_STORAGE *udc_get_interface_desc(void); + +//@} + +/** + * \ingroup usb_group + * \defgroup usb_device_group USB Stack Device + * + * This module includes USB Stack Device implementation. + * The stack is divided in three parts: + * - USB Device Controller (UDC) provides USB chapter 9 compliance + * - USB Device Interface (UDI) provides USB Class compliance + * - USB Device Driver (UDD) provides USB Driver for each Atmel MCU + + * Many USB Device applications can be implemented on Atmel MCU. + * Atmel provides many application notes for different applications: + * - AVR4900, provides general information about Device Stack + * - AVR4901, explains how to create a new class + * - AVR4902, explains how to create a composite device + * - AVR49xx, all device classes provided in ASF have an application note + * + * A basic USB knowledge is required to understand the USB Device + * Class application notes (HID,MS,CDC,PHDC,...). + * Then, to create an USB device with + * only one class provided by ASF, refer directly to the application note + * corresponding to this USB class. The USB Device application note for + * New Class and Composite is dedicated to advanced USB users. + * + * @{ + */ + +//! @} + +#ifdef __cplusplus +} +#endif + +#endif // _UDC_H_ diff --git a/tmk_core/protocol/arm_atsam/usb/udc_desc.h b/tmk_core/protocol/arm_atsam/usb/udc_desc.h new file mode 100644 index 000000000..9cab03dcb --- /dev/null +++ b/tmk_core/protocol/arm_atsam/usb/udc_desc.h @@ -0,0 +1,135 @@ +/** + * \file + * + * \brief Common API for USB Device Interface + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _UDC_DESC_H_ +#define _UDC_DESC_H_ + +#include "conf_usb.h" +#include "usb_protocol.h" +#include "udi.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \ingroup udc_group + * \defgroup udc_desc_group USB Device Descriptor + * + * @{ + */ + +/** + * \brief Defines the memory's location of USB descriptors + * + * By default the Descriptor is stored in RAM + * (UDC_DESC_STORAGE is defined empty). + * + * If you have need to free RAM space, + * it is possible to put descriptor in flash in following case: + * - USB driver authorize flash transfer (USBB on UC3 and USB on Mega) + * - USB Device is not high speed (UDC no need to change USB descriptors) + * + * For UC3 application used "const". + * + * For Mega application used "code". + */ +#define UDC_DESC_STORAGE + // Descriptor storage in internal RAM +#if (defined UDC_DATA_USE_HRAM_SUPPORT) +#if defined(__GNUC__) +#define UDC_DATA(x) COMPILER_WORD_ALIGNED __attribute__((__section__(".data_hram0"))) +#define UDC_BSS(x) COMPILER_ALIGNED(x) __attribute__((__section__(".bss_hram0"))) +#elif defined(__ICCAVR32__) +#define UDC_DATA(x) COMPILER_ALIGNED(x) __data32 +#define UDC_BSS(x) COMPILER_ALIGNED(x) __data32 +#endif +#else +#define UDC_DATA(x) COMPILER_ALIGNED(x) +#define UDC_BSS(x) COMPILER_ALIGNED(x) +#endif + + + +/** + * \brief Configuration descriptor and UDI link for one USB speed + */ +typedef struct { + //! USB configuration descriptor + usb_conf_desc_t UDC_DESC_STORAGE *desc; + //! Array of UDI API pointer + udi_api_t UDC_DESC_STORAGE *UDC_DESC_STORAGE * udi_apis; +} udc_config_speed_t; + + +/** + * \brief All information about the USB Device + */ +typedef struct { + //! USB device descriptor for low or full speed + usb_dev_desc_t UDC_DESC_STORAGE *confdev_lsfs; + //! USB configuration descriptor and UDI API pointers for low or full speed + udc_config_speed_t UDC_DESC_STORAGE *conf_lsfs; +#ifdef USB_DEVICE_HS_SUPPORT + //! USB device descriptor for high speed + usb_dev_desc_t UDC_DESC_STORAGE *confdev_hs; + //! USB device qualifier, only use in high speed mode + usb_dev_qual_desc_t UDC_DESC_STORAGE *qualifier; + //! USB configuration descriptor and UDI API pointers for high speed + udc_config_speed_t UDC_DESC_STORAGE *conf_hs; +#endif + usb_dev_bos_desc_t UDC_DESC_STORAGE *conf_bos; +} udc_config_t; + +//! Global variables of USB Device Descriptor and UDI links +extern UDC_DESC_STORAGE udc_config_t udc_config; + +//@} + +#ifdef __cplusplus +} +#endif +#endif // _UDC_DESC_H_ diff --git a/tmk_core/protocol/arm_atsam/usb/udd.h b/tmk_core/protocol/arm_atsam/usb/udd.h new file mode 100644 index 000000000..b580e5847 --- /dev/null +++ b/tmk_core/protocol/arm_atsam/usb/udd.h @@ -0,0 +1,396 @@ +/** + * \file + * + * \brief Common API for USB Device Drivers (UDD) + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _UDD_H_ +#define _UDD_H_ + +#include "usb_protocol.h" +#include "udc_desc.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \ingroup usb_device_group + * \defgroup udd_group USB Device Driver (UDD) + * + * The UDD driver provides a low-level abstraction of the device + * controller hardware. Most events coming from the hardware such as + * interrupts, which may cause the UDD to call into the UDC and UDI. + * + * @{ + */ + +//! \brief Endpoint identifier +typedef uint8_t udd_ep_id_t; + +//! \brief Endpoint transfer status +//! Returned in parameters of callback register via udd_ep_run routine. +typedef enum { + UDD_EP_TRANSFER_OK = 0, + UDD_EP_TRANSFER_ABORT = 1, +} udd_ep_status_t; + +/** + * \brief Global variable to give and record information of the setup request management + * + * This global variable allows to decode and response a setup request. + * It can be updated by udc_process_setup() from UDC or *setup() from UDIs. + */ +typedef struct { + //! Data received in USB SETUP packet + //! Note: The swap of "req.wValues" from uin16_t to le16_t is done by UDD. + usb_setup_req_t req; + + //! Point to buffer to send or fill with data following SETUP packet + //! This buffer must be word align for DATA IN phase (use prefix COMPILER_WORD_ALIGNED for buffer) + uint8_t *payload; + + //! Size of buffer to send or fill, and content the number of byte transfered + uint16_t payload_size; + + //! Callback called after reception of ZLP from setup request + void (*callback) (void); + + //! Callback called when the buffer given (.payload) is full or empty. + //! This one return false to abort data transfer, or true with a new buffer in .payload. + bool(*over_under_run) (void); +} udd_ctrl_request_t; +extern udd_ctrl_request_t udd_g_ctrlreq; + +//! Return true if the setup request \a udd_g_ctrlreq indicates IN data transfer +#define Udd_setup_is_in() \ + (USB_REQ_DIR_IN == (udd_g_ctrlreq.req.bmRequestType & USB_REQ_DIR_MASK)) + +//! Return true if the setup request \a udd_g_ctrlreq indicates OUT data transfer +#define Udd_setup_is_out() \ + (USB_REQ_DIR_OUT == (udd_g_ctrlreq.req.bmRequestType & USB_REQ_DIR_MASK)) + +//! Return the type of the SETUP request \a udd_g_ctrlreq. \see usb_reqtype. +#define Udd_setup_type() \ + (udd_g_ctrlreq.req.bmRequestType & USB_REQ_TYPE_MASK) + +//! Return the recipient of the SETUP request \a udd_g_ctrlreq. \see usb_recipient +#define Udd_setup_recipient() \ + (udd_g_ctrlreq.req.bmRequestType & USB_REQ_RECIP_MASK) + +/** + * \brief End of halt callback function type. + * Registered by routine udd_ep_wait_stall_clear() + * Callback called when endpoint stall is cleared. + */ +typedef void (*udd_callback_halt_cleared_t) (void); + +/** + * \brief End of transfer callback function type. + * Registered by routine udd_ep_run() + * Callback called by USB interrupt after data transfer or abort (reset,...). + * + * \param status UDD_EP_TRANSFER_OK, if transfer is complete + * \param status UDD_EP_TRANSFER_ABORT, if transfer is aborted + * \param n number of data transfered + */ +typedef void (*udd_callback_trans_t) (udd_ep_status_t status, + iram_size_t nb_transfered, udd_ep_id_t ep); + +/** + * \brief Authorizes the VBUS event + * + * \return true, if the VBUS monitoring is possible. + */ +bool udd_include_vbus_monitoring(void); + +/** + * \brief Enables the USB Device mode + */ +void udd_enable(void); + +/** + * \brief Disables the USB Device mode + */ +void udd_disable(void); + +/** + * \brief Attach device to the bus when possible + * + * \warning If a VBus control is included in driver, + * then it will attach device when an acceptable Vbus + * level from the host is detected. + */ +void udd_attach(void); + +/** + * \brief Detaches the device from the bus + * + * The driver must remove pull-up on USB line D- or D+. + */ +void udd_detach(void); + +/** + * \brief Test whether the USB Device Controller is running at high + * speed or not. + * + * \return \c true if the Device is running at high speed mode, otherwise \c false. + */ +bool udd_is_high_speed(void); + +/** + * \brief Changes the USB address of device + * + * \param address New USB address + */ +void udd_set_address(uint8_t address); + +/** + * \brief Returns the USB address of device + * + * \return USB address + */ +uint8_t udd_getaddress(void); + +/** + * \brief Returns the current start of frame number + * + * \return current start of frame number. + */ +uint16_t udd_get_frame_number(void); + +/** + * \brief Returns the current micro start of frame number + * + * \return current micro start of frame number required in high speed mode. + */ +uint16_t udd_get_micro_frame_number(void); + +/*! \brief The USB driver sends a resume signal called Upstream Resume + */ +void udd_send_remotewakeup(void); + +/** + * \brief Load setup payload + * + * \param payload Pointer on payload + * \param payload_size Size of payload + */ +void udd_set_setup_payload( uint8_t *payload, uint16_t payload_size ); + + +/** + * \name Endpoint Management + * + * The following functions allow drivers to create and remove + * endpoints, as well as set, clear and query their "halted" and + * "wedged" states. + */ +//@{ + +#if (USB_DEVICE_MAX_EP != 0) + +/** + * \brief Configures and enables an endpoint + * + * \param ep Endpoint number including direction (USB_EP_DIR_IN/USB_EP_DIR_OUT). + * \param bmAttributes Attributes of endpoint declared in the descriptor. + * \param MaxEndpointSize Endpoint maximum size + * + * \return \c 1 if the endpoint is enabled, otherwise \c 0. + */ +bool udd_ep_alloc(udd_ep_id_t ep, uint8_t bmAttributes, + uint16_t MaxEndpointSize); + +/** + * \brief Disables an endpoint + * + * \param ep Endpoint number including direction (USB_EP_DIR_IN/USB_EP_DIR_OUT). + */ +void udd_ep_free(udd_ep_id_t ep); + +/** + * \brief Check if the endpoint \a ep is halted. + * + * \param ep The ID of the endpoint to check. + * + * \return \c 1 if \a ep is halted, otherwise \c 0. + */ +bool udd_ep_is_halted(udd_ep_id_t ep); + +/** + * \brief Set the halted state of the endpoint \a ep + * + * After calling this function, any transaction on \a ep will result + * in a STALL handshake being sent. Any pending transactions will be + * performed first, however. + * + * \param ep The ID of the endpoint to be halted + * + * \return \c 1 if \a ep is halted, otherwise \c 0. + */ +bool udd_ep_set_halt(udd_ep_id_t ep); + +/** + * \brief Clear the halted state of the endpoint \a ep + * + * After calling this function, any transaction on \a ep will + * be handled normally, i.e. a STALL handshake will not be sent, and + * the data toggle sequence will start at DATA0. + * + * \param ep The ID of the endpoint to be un-halted + * + * \return \c 1 if function was successfully done, otherwise \c 0. + */ +bool udd_ep_clear_halt(udd_ep_id_t ep); + +/** + * \brief Registers a callback to call when endpoint halt is cleared + * + * \param ep The ID of the endpoint to use + * \param callback NULL or function to call when endpoint halt is cleared + * + * \warning if the endpoint is not halted then the \a callback is called immediately. + * + * \return \c 1 if the register is accepted, otherwise \c 0. + */ +bool udd_ep_wait_stall_clear(udd_ep_id_t ep, + udd_callback_halt_cleared_t callback); + +/** + * \brief Allows to receive or send data on an endpoint + * + * The driver uses a specific DMA USB to transfer data + * from internal RAM to endpoint, if this one is available. + * When the transfer is finished or aborted (stall, reset, ...), the \a callback is called. + * The \a callback returns the transfer status and eventually the number of byte transfered. + * Note: The control endpoint is not authorized. + * + * \param ep The ID of the endpoint to use + * \param b_shortpacket Enabled automatic short packet + * \param buf Buffer on Internal RAM to send or fill. + * It must be align, then use COMPILER_WORD_ALIGNED. + * \param buf_size Buffer size to send or fill + * \param callback NULL or function to call at the end of transfer + * + * \warning About \a b_shortpacket, for IN endpoint it means that a short packet + * (or a Zero Length Packet) will be sent to the USB line to properly close the usb + * transfer at the end of the data transfer. + * For Bulk and Interrupt OUT endpoint, it will automatically stop the transfer + * at the end of the data transfer (received short packet). + * + * \return \c 1 if function was successfully done, otherwise \c 0. + */ +bool udd_ep_run(udd_ep_id_t ep, bool b_shortpacket, + uint8_t *buf, iram_size_t buf_size, + udd_callback_trans_t callback); +/** + * \brief Aborts transfer on going on endpoint + * + * If a transfer is on going, then it is stopped and + * the callback registered is called to signal the end of transfer. + * Note: The control endpoint is not authorized. + * + * \param ep Endpoint to abort + */ +void udd_ep_abort(udd_ep_id_t ep); + +#endif + +//@} + + +/** + * \name High speed test mode management + * + * The following functions allow the device to jump to a specific test mode required in high speed mode. + */ +//@{ +void udd_test_mode_j(void); +void udd_test_mode_k(void); +void udd_test_mode_se0_nak(void); +void udd_test_mode_packet(void); +//@} + + +/** + * \name UDC callbacks to provide for UDD + * + * The following callbacks are used by UDD. + */ +//@{ + +/** + * \brief Decodes and manages a setup request + * + * The driver call it when a SETUP packet is received. + * The \c udd_g_ctrlreq contains the data of SETUP packet. + * If this callback accepts the setup request then it must + * return \c 1 and eventually update \c udd_g_ctrlreq to send or receive data. + * + * \return \c 1 if the request is accepted, otherwise \c 0. + */ +extern bool udc_process_setup(void); + +/** + * \brief Reset the UDC + * + * The UDC must reset all configuration. + */ +extern void udc_reset(void); + +/** + * \brief To signal that a SOF is occurred + * + * The UDC must send the signal to all UDIs enabled + */ +extern void udc_sof_notify(void); + +//@} + +//@} + +#ifdef __cplusplus +} +#endif +#endif // _UDD_H_ diff --git a/tmk_core/protocol/arm_atsam/usb/udi.h b/tmk_core/protocol/arm_atsam/usb/udi.h new file mode 100644 index 000000000..9e4d4baf7 --- /dev/null +++ b/tmk_core/protocol/arm_atsam/usb/udi.h @@ -0,0 +1,133 @@ +/** + * \file + * + * \brief Common API for USB Device Interface + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _UDI_H_ +#define _UDI_H_ + +#include "conf_usb.h" +#include "usb_protocol.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \ingroup usb_device_group + * \defgroup udi_group USB Device Interface (UDI) + * The UDI provides a common API for all classes, + * and this is used by UDC for the main control of USB Device interface. + * @{ + */ + +/** + * \brief UDI API. + * + * The callbacks within this structure are called only by + * USB Device Controller (UDC) + * + * The udc_get_interface_desc() can be use by UDI to know the interface descriptor + * selected by UDC. + */ +typedef struct { + /** + * \brief Enable the interface. + * + * This function is called when the host selects a configuration + * to which this interface belongs through a Set Configuration + * request, and when the host selects an alternate setting of + * this interface through a Set Interface request. + * + * \return \c 1 if function was successfully done, otherwise \c 0. + */ + bool(*enable) (void); + + /** + * \brief Disable the interface. + * + * This function is called when this interface is currently + * active, and + * - the host selects any configuration through a Set + * Configuration request, or + * - the host issues a USB reset, or + * - the device is detached from the host (i.e. Vbus is no + * longer present) + */ + void (*disable) (void); + + /** + * \brief Handle a control request directed at an interface. + * + * This function is called when this interface is currently + * active and the host sends a SETUP request + * with this interface as the recipient. + * + * Use udd_g_ctrlreq to decode and response to SETUP request. + * + * \return \c 1 if this interface supports the SETUP request, otherwise \c 0. + */ + bool(*setup) (void); + + /** + * \brief Returns the current setting of the selected interface. + * + * This function is called when UDC when know alternate setting of selected interface. + * + * \return alternate setting of selected interface + */ + uint8_t(*getsetting) (void); + + /** + * \brief To signal that a SOF is occurred + */ + void(*sof_notify) (void); +} udi_api_t; + +//@} + +#ifdef __cplusplus +} +#endif +#endif // _UDI_H_ diff --git a/tmk_core/protocol/arm_atsam/usb/udi_cdc.c b/tmk_core/protocol/arm_atsam/usb/udi_cdc.c new file mode 100644 index 000000000..b4159d325 --- /dev/null +++ b/tmk_core/protocol/arm_atsam/usb/udi_cdc.c @@ -0,0 +1,1384 @@ +/** + * \file + * + * \brief USB Device Communication Device Class (CDC) interface. + * + * Copyright (c) 2009-2016 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#include "samd51j18a.h" +#include "conf_usb.h" +#include "usb_protocol.h" +#include "usb_protocol_cdc.h" +#include "udd.h" +#include "udc.h" +#include "udi_cdc.h" +#include +#include "udi_cdc_conf.h" +#include "udi_device_conf.h" +#include "spfssf.h" +#include "stdarg.h" +#include "tmk_core/protocol/arm_atsam/clks.h" + +#ifdef CDC + +#ifdef UDI_CDC_LOW_RATE +# ifdef USB_DEVICE_HS_SUPPORT +# define UDI_CDC_TX_BUFFERS (UDI_CDC_DATA_EPS_HS_SIZE) +# define UDI_CDC_RX_BUFFERS (UDI_CDC_DATA_EPS_HS_SIZE) +# else +# define UDI_CDC_TX_BUFFERS (UDI_CDC_DATA_EPS_FS_SIZE) +# define UDI_CDC_RX_BUFFERS (UDI_CDC_DATA_EPS_FS_SIZE) +# endif +#else +# ifdef USB_DEVICE_HS_SUPPORT +# define UDI_CDC_TX_BUFFERS (UDI_CDC_DATA_EPS_HS_SIZE) +# define UDI_CDC_RX_BUFFERS (UDI_CDC_DATA_EPS_HS_SIZE) +# else +# define UDI_CDC_TX_BUFFERS (5*UDI_CDC_DATA_EPS_FS_SIZE) +# define UDI_CDC_RX_BUFFERS (5*UDI_CDC_DATA_EPS_FS_SIZE) +# endif +#endif + +#ifndef UDI_CDC_TX_EMPTY_NOTIFY +# define UDI_CDC_TX_EMPTY_NOTIFY(port) +#endif + +/** + * \ingroup udi_cdc_group + * \defgroup udi_cdc_group_udc Interface with USB Device Core (UDC) + * + * Structures and functions required by UDC. + * + * @{ + */ +bool udi_cdc_comm_enable(void); +void udi_cdc_comm_disable(void); +bool udi_cdc_comm_setup(void); +bool udi_cdc_data_enable(void); +void udi_cdc_data_disable(void); +bool udi_cdc_data_setup(void); +uint8_t udi_cdc_getsetting(void); +void udi_cdc_data_sof_notify(void); +UDC_DESC_STORAGE udi_api_t udi_api_cdc_comm = { + .enable = udi_cdc_comm_enable, + .disable = udi_cdc_comm_disable, + .setup = udi_cdc_comm_setup, + .getsetting = udi_cdc_getsetting, + .sof_notify = NULL +}; +UDC_DESC_STORAGE udi_api_t udi_api_cdc_data = { + .enable = udi_cdc_data_enable, + .disable = udi_cdc_data_disable, + .setup = udi_cdc_data_setup, + .getsetting = udi_cdc_getsetting, + .sof_notify = udi_cdc_data_sof_notify, +}; +//@} + +/** + * \ingroup udi_cdc_group + * \defgroup udi_cdc_group_internal Implementation of UDI CDC + * + * Class internal implementation + * @{ + */ + +/** + * \name Internal routines + */ +//@{ + +/** + * \name Routines to control serial line + */ +//@{ + +/** + * \brief Returns the port number corresponding at current setup request + * + * \return port number + */ +static uint8_t udi_cdc_setup_to_port(void); + +/** + * \brief Sends line coding to application + * + * Called after SETUP request when line coding data is received. + */ +static void udi_cdc_line_coding_received(void); + +/** + * \brief Records new state + * + * \param port Communication port number to manage + * \param b_set State is enabled if true, else disabled + * \param bit_mask Field to process (see CDC_SERIAL_STATE_ defines) + */ +static void udi_cdc_ctrl_state_change(uint8_t port, bool b_set, le16_t bit_mask); + +/** + * \brief Check and eventually notify the USB host of new state + * + * \param port Communication port number to manage + * \param ep Port communication endpoint + */ +static void udi_cdc_ctrl_state_notify(uint8_t port, udd_ep_id_t ep); + +/** + * \brief Ack sent of serial state message + * Callback called after serial state message sent + * + * \param status UDD_EP_TRANSFER_OK, if transfer finished + * \param status UDD_EP_TRANSFER_ABORT, if transfer aborted + * \param n number of data transfered + */ +static void udi_cdc_serial_state_msg_sent(udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep); + +//@} + +/** + * \name Routines to process data transfer + */ +//@{ + +/** + * \brief Enable the reception of data from the USB host + * + * The value udi_cdc_rx_trans_sel indicate the RX buffer to fill. + * + * \param port Communication port number to manage + * + * \return \c 1 if function was successfully done, otherwise \c 0. + */ +static bool udi_cdc_rx_start(uint8_t port); + +/** + * \brief Update rx buffer management with a new data + * Callback called after data reception on USB line + * + * \param status UDD_EP_TRANSFER_OK, if transfer finish + * \param status UDD_EP_TRANSFER_ABORT, if transfer aborted + * \param n number of data received + */ +static void udi_cdc_data_received(udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep); + +/** + * \brief Ack sent of tx buffer + * Callback called after data transfer on USB line + * + * \param status UDD_EP_TRANSFER_OK, if transfer finished + * \param status UDD_EP_TRANSFER_ABORT, if transfer aborted + * \param n number of data transfered + */ +static void udi_cdc_data_sent(udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep); + +/** + * \brief Send buffer on line or wait a SOF event + * + * \param port Communication port number to manage + */ +static void udi_cdc_tx_send(uint8_t port); + +//@} + +//@} + +/** + * \name Information about configuration of communication line + */ +//@{ +COMPILER_WORD_ALIGNED +static usb_cdc_line_coding_t udi_cdc_line_coding[UDI_CDC_PORT_NB]; +static bool udi_cdc_serial_state_msg_ongoing[UDI_CDC_PORT_NB]; +static volatile le16_t udi_cdc_state[UDI_CDC_PORT_NB]; +COMPILER_WORD_ALIGNED static usb_cdc_notify_serial_state_t uid_cdc_state_msg[UDI_CDC_PORT_NB]; + +//! Status of CDC COMM interfaces +static volatile uint8_t udi_cdc_nb_comm_enabled = 0; +//@} + +/** + * \name Variables to manage RX/TX transfer requests + * Two buffers for each sense are used to optimize the speed. + */ +//@{ + +//! Status of CDC DATA interfaces +static volatile uint8_t udi_cdc_nb_data_enabled = 0; +static volatile bool udi_cdc_data_running = false; +//! Buffer to receive data +COMPILER_WORD_ALIGNED static uint8_t udi_cdc_rx_buf[UDI_CDC_PORT_NB][2][UDI_CDC_RX_BUFFERS]; +//! Data available in RX buffers +static volatile uint16_t udi_cdc_rx_buf_nb[UDI_CDC_PORT_NB][2]; +//! Give the current RX buffer used (rx0 if 0, rx1 if 1) +static volatile uint8_t udi_cdc_rx_buf_sel[UDI_CDC_PORT_NB]; +//! Read position in current RX buffer +static volatile uint16_t udi_cdc_rx_pos[UDI_CDC_PORT_NB]; +//! Signal a transfer on-going +static volatile bool udi_cdc_rx_trans_ongoing[UDI_CDC_PORT_NB]; + +//! Define a transfer halted +#define UDI_CDC_TRANS_HALTED 2 + +//! Buffer to send data +COMPILER_WORD_ALIGNED static uint8_t udi_cdc_tx_buf[UDI_CDC_PORT_NB][2][UDI_CDC_TX_BUFFERS]; +//! Data available in TX buffers +static uint16_t udi_cdc_tx_buf_nb[UDI_CDC_PORT_NB][2]; +//! Give current TX buffer used (tx0 if 0, tx1 if 1) +static volatile uint8_t udi_cdc_tx_buf_sel[UDI_CDC_PORT_NB]; +//! Value of SOF during last TX transfer +static uint16_t udi_cdc_tx_sof_num[UDI_CDC_PORT_NB]; +//! Signal a transfer on-going +static volatile bool udi_cdc_tx_trans_ongoing[UDI_CDC_PORT_NB]; +//! Signal that both buffer content data to send +static volatile bool udi_cdc_tx_both_buf_to_send[UDI_CDC_PORT_NB]; + +//@} + +bool udi_cdc_comm_enable(void) +{ + uint8_t port; + uint8_t iface_comm_num; + +//#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; + udi_cdc_nb_comm_enabled = 0; +//#else +// if (udi_cdc_nb_comm_enabled > UDI_CDC_PORT_NB) { +// udi_cdc_nb_comm_enabled = 0; +// } +// port = udi_cdc_nb_comm_enabled; +//#endif + + // Initialize control signal management + udi_cdc_state[port] = CPU_TO_LE16(0); + + uid_cdc_state_msg[port].header.bmRequestType = + USB_REQ_DIR_IN | USB_REQ_TYPE_CLASS | + USB_REQ_RECIP_INTERFACE; + uid_cdc_state_msg[port].header.bNotification = USB_REQ_CDC_NOTIFY_SERIAL_STATE; + uid_cdc_state_msg[port].header.wValue = LE16(0); + + /* + switch (port) { + #define UDI_CDC_PORT_TO_IFACE_COMM(index, unused) \ + case index: \ + iface_comm_num = UDI_CDC_COMM_IFACE_NUMBER_##index; \ + break; + MREPEAT(UDI_CDC_PORT_NB, UDI_CDC_PORT_TO_IFACE_COMM, ~) + #undef UDI_CDC_PORT_TO_IFACE_COMM + default: + iface_comm_num = UDI_CDC_COMM_IFACE_NUMBER_0; + break; + } + */ + iface_comm_num = UDI_CDC_COMM_IFACE_NUMBER_0; + + uid_cdc_state_msg[port].header.wIndex = LE16(iface_comm_num); + uid_cdc_state_msg[port].header.wLength = LE16(2); + uid_cdc_state_msg[port].value = CPU_TO_LE16(0); + + udi_cdc_line_coding[port].dwDTERate = CPU_TO_LE32(UDI_CDC_DEFAULT_RATE); + udi_cdc_line_coding[port].bCharFormat = UDI_CDC_DEFAULT_STOPBITS; + udi_cdc_line_coding[port].bParityType = UDI_CDC_DEFAULT_PARITY; + udi_cdc_line_coding[port].bDataBits = UDI_CDC_DEFAULT_DATABITS; + // Call application callback + // to initialize memories or indicate that interface is enabled +#if 0 + UDI_CDC_SET_CODING_EXT(port,(&udi_cdc_line_coding[port])); + if (!UDI_CDC_ENABLE_EXT(port)) { + return false; + } +#endif + udi_cdc_nb_comm_enabled++; + return true; +} + +bool udi_cdc_data_enable(void) +{ + uint8_t port; + +//#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; + udi_cdc_nb_data_enabled = 0; +//#else +// if (udi_cdc_nb_data_enabled > UDI_CDC_PORT_NB) { +// udi_cdc_nb_data_enabled = 0; +// } +// port = udi_cdc_nb_data_enabled; +//#endif + + // Initialize TX management + udi_cdc_tx_trans_ongoing[port] = false; + udi_cdc_tx_both_buf_to_send[port] = false; + udi_cdc_tx_buf_sel[port] = 0; + udi_cdc_tx_buf_nb[port][0] = 0; + udi_cdc_tx_buf_nb[port][1] = 0; + udi_cdc_tx_sof_num[port] = 0; + udi_cdc_tx_send(port); + + // Initialize RX management + udi_cdc_rx_trans_ongoing[port] = false; + udi_cdc_rx_buf_sel[port] = 0; + udi_cdc_rx_buf_nb[port][0] = 0; + udi_cdc_rx_buf_nb[port][1] = 0; + udi_cdc_rx_pos[port] = 0; + if (!udi_cdc_rx_start(port)) { + return false; + } + udi_cdc_nb_data_enabled++; + if (udi_cdc_nb_data_enabled == UDI_CDC_PORT_NB) { + udi_cdc_data_running = true; + } + return true; +} + +void udi_cdc_comm_disable(void) +{ + Assert(udi_cdc_nb_comm_enabled != 0); + udi_cdc_nb_comm_enabled--; +} + +void udi_cdc_data_disable(void) +{ +// uint8_t port; + + Assert(udi_cdc_nb_data_enabled != 0); + udi_cdc_nb_data_enabled--; +// port = udi_cdc_nb_data_enabled; +// UDI_CDC_DISABLE_EXT(port); + udi_cdc_data_running = false; +} + +bool udi_cdc_comm_setup(void) +{ + uint8_t port = udi_cdc_setup_to_port(); + + if (Udd_setup_is_in()) { + // GET Interface Requests + if (Udd_setup_type() == USB_REQ_TYPE_CLASS) { + // Requests Class Interface Get + switch (udd_g_ctrlreq.req.bRequest) { + case USB_REQ_CDC_GET_LINE_CODING: + // Get configuration of CDC line + if (sizeof(usb_cdc_line_coding_t) != + udd_g_ctrlreq.req.wLength) + return false; // Error for USB host + udd_g_ctrlreq.payload = + (uint8_t *) & + udi_cdc_line_coding[port]; + udd_g_ctrlreq.payload_size = + sizeof(usb_cdc_line_coding_t); + return true; + } + } + } + if (Udd_setup_is_out()) { + // SET Interface Requests + if (Udd_setup_type() == USB_REQ_TYPE_CLASS) { + // Requests Class Interface Set + switch (udd_g_ctrlreq.req.bRequest) { + case USB_REQ_CDC_SET_LINE_CODING: + // Change configuration of CDC line + if (sizeof(usb_cdc_line_coding_t) != + udd_g_ctrlreq.req.wLength) + return false; // Error for USB host + udd_g_ctrlreq.callback = + udi_cdc_line_coding_received; + udd_g_ctrlreq.payload = + (uint8_t *) & + udi_cdc_line_coding[port]; + udd_g_ctrlreq.payload_size = + sizeof(usb_cdc_line_coding_t); + return true; + case USB_REQ_CDC_SET_CONTROL_LINE_STATE: + // According cdc spec 1.1 chapter 6.2.14 +// UDI_CDC_SET_DTR_EXT(port, (0 != +// (udd_g_ctrlreq.req.wValue +// & CDC_CTRL_SIGNAL_DTE_PRESENT))); +// UDI_CDC_SET_RTS_EXT(port, (0 != +// (udd_g_ctrlreq.req.wValue +// & CDC_CTRL_SIGNAL_ACTIVATE_CARRIER))); + return true; + } + } + } + return false; // request Not supported +} + +bool udi_cdc_data_setup(void) +{ + return false; // request Not supported +} + +uint8_t udi_cdc_getsetting(void) +{ + return 0; // CDC don't have multiple alternate setting +} + +void udi_cdc_data_sof_notify(void) +{ + static uint8_t port_notify = 0; + + // A call of udi_cdc_data_sof_notify() is done for each port + udi_cdc_tx_send(port_notify); + /* +#if UDI_CDC_PORT_NB != 1 // To optimize code + port_notify++; + if (port_notify >= UDI_CDC_PORT_NB) { + port_notify = 0; + } +#endif + */ +} + + +//------------------------------------------------- +//------- Internal routines to control serial line + +static uint8_t udi_cdc_setup_to_port(void) +{ + uint8_t port; + + /* + switch (udd_g_ctrlreq.req.wIndex & 0xFF) { +#define UDI_CDC_IFACE_COMM_TO_PORT(iface, unused) \ + case UDI_CDC_COMM_IFACE_NUMBER_##iface: \ + port = iface; \ + break; + MREPEAT(UDI_CDC_PORT_NB, UDI_CDC_IFACE_COMM_TO_PORT, ~) +#undef UDI_CDC_IFACE_COMM_TO_PORT + default: + port = 0; + break; + } + */ + port = 0; + + return port; +} + +static void udi_cdc_line_coding_received(void) +{ + uint8_t port = udi_cdc_setup_to_port(); + UNUSED(port); + +// UDI_CDC_SET_CODING_EXT(port, (&udi_cdc_line_coding[port])); +} + +static void udi_cdc_ctrl_state_change(uint8_t port, bool b_set, le16_t bit_mask) +{ + udd_ep_id_t ep_comm; + uint32_t irqflags; //irqflags_t + + +//#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; +//#endif + + // Update state + irqflags = __get_PRIMASK(); + __disable_irq(); + __DMB(); + if (b_set) { + udi_cdc_state[port] |= bit_mask; + } else { + udi_cdc_state[port] &= ~(unsigned)bit_mask; + } + __DMB(); + __set_PRIMASK(irqflags); + + /* + // Send it if possible and state changed + switch (port) { +#define UDI_CDC_PORT_TO_COMM_EP(index, unused) \ + case index: \ + ep_comm = UDI_CDC_COMM_EP_##index; \ + break; + MREPEAT(UDI_CDC_PORT_NB, UDI_CDC_PORT_TO_COMM_EP, ~) +#undef UDI_CDC_PORT_TO_COMM_EP + default: + ep_comm = UDI_CDC_COMM_EP_0; + break; + } + */ + ep_comm = UDI_CDC_COMM_EP_0; + + udi_cdc_ctrl_state_notify(port, ep_comm); +} + + +static void udi_cdc_ctrl_state_notify(uint8_t port, udd_ep_id_t ep) +{ +#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; +#endif + + // Send it if possible and state changed + if ((!udi_cdc_serial_state_msg_ongoing[port]) + && (udi_cdc_state[port] != uid_cdc_state_msg[port].value)) { + // Fill notification message + uid_cdc_state_msg[port].value = udi_cdc_state[port]; + // Send notification message + udi_cdc_serial_state_msg_ongoing[port] = + udd_ep_run(ep, + false, + (uint8_t *) & uid_cdc_state_msg[port], + sizeof(uid_cdc_state_msg[0]), + udi_cdc_serial_state_msg_sent); + } +} + + +static void udi_cdc_serial_state_msg_sent(udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep) +{ + uint8_t port; + UNUSED(n); + UNUSED(status); + + /* + switch (ep) { +#define UDI_CDC_GET_PORT_FROM_COMM_EP(iface, unused) \ + case UDI_CDC_COMM_EP_##iface: \ + port = iface; \ + break; + MREPEAT(UDI_CDC_PORT_NB, UDI_CDC_GET_PORT_FROM_COMM_EP, ~) +#undef UDI_CDC_GET_PORT_FROM_COMM_EP + default: + port = 0; + break; + } + */ + port = 0; + + udi_cdc_serial_state_msg_ongoing[port] = false; + + // For the irregular signals like break, the incoming ring signal, + // or the overrun error state, this will reset their values to zero + // and again will not send another notification until their state changes. + udi_cdc_state[port] &= ~(CDC_SERIAL_STATE_BREAK | + CDC_SERIAL_STATE_RING | + CDC_SERIAL_STATE_FRAMING | + CDC_SERIAL_STATE_PARITY | CDC_SERIAL_STATE_OVERRUN); + uid_cdc_state_msg[port].value &= ~(CDC_SERIAL_STATE_BREAK | + CDC_SERIAL_STATE_RING | + CDC_SERIAL_STATE_FRAMING | + CDC_SERIAL_STATE_PARITY | CDC_SERIAL_STATE_OVERRUN); + // Send it if possible and state changed + udi_cdc_ctrl_state_notify(port, ep); +} + +//------------------------------------------------- +//------- Internal routines to process data transfer + +static bool udi_cdc_rx_start(uint8_t port) +{ + uint32_t irqflags; //irqflags_t + uint8_t buf_sel_trans; + udd_ep_id_t ep; + +//#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; +//#endif + + irqflags = __get_PRIMASK(); + __disable_irq(); + __DMB(); + buf_sel_trans = udi_cdc_rx_buf_sel[port]; + if (udi_cdc_rx_trans_ongoing[port] || + (udi_cdc_rx_pos[port] < udi_cdc_rx_buf_nb[port][buf_sel_trans])) { + // Transfer already on-going or current buffer no empty + __DMB(); + __set_PRIMASK(irqflags); + return false; + } + + // Change current buffer + udi_cdc_rx_pos[port] = 0; + udi_cdc_rx_buf_sel[port] = (buf_sel_trans==0)?1:0; + + // Start transfer on RX + udi_cdc_rx_trans_ongoing[port] = true; + __DMB(); + __set_PRIMASK(irqflags); + + if (udi_cdc_multi_is_rx_ready(port)) { +// UDI_CDC_RX_NOTIFY(port); + } + + /* + // Send the buffer with enable of short packet + switch (port) { +#define UDI_CDC_PORT_TO_DATA_EP_OUT(index, unused) \ + case index: \ + ep = UDI_CDC_DATA_EP_OUT_##index; \ + break; + MREPEAT(UDI_CDC_PORT_NB, UDI_CDC_PORT_TO_DATA_EP_OUT, ~) +#undef UDI_CDC_PORT_TO_DATA_EP_OUT + default: + ep = UDI_CDC_DATA_EP_OUT_0; + break; + } + */ + ep = UDI_CDC_DATA_EP_OUT_0; + + return udd_ep_run(ep, + true, + udi_cdc_rx_buf[port][buf_sel_trans], + UDI_CDC_RX_BUFFERS, + udi_cdc_data_received); +} + +static void udi_cdc_data_received(udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep) +{ + uint8_t buf_sel_trans; + uint8_t port; + + /* + switch (ep) { +#define UDI_CDC_DATA_EP_OUT_TO_PORT(index, unused) \ + case UDI_CDC_DATA_EP_OUT_##index: \ + port = index; \ + break; + MREPEAT(UDI_CDC_PORT_NB, UDI_CDC_DATA_EP_OUT_TO_PORT, ~) +#undef UDI_CDC_DATA_EP_OUT_TO_PORT + default: + port = 0; + break; + } + */ + port = 0; + + if (UDD_EP_TRANSFER_OK != status) { + // Abort reception + return; + } + + buf_sel_trans = (udi_cdc_rx_buf_sel[port]==0)?1:0; + + if (!n) { + udd_ep_run( ep, + true, + udi_cdc_rx_buf[port][buf_sel_trans], + UDI_CDC_RX_BUFFERS, + udi_cdc_data_received); + return; + } + + udi_cdc_rx_buf_nb[port][buf_sel_trans] = n; + udi_cdc_rx_trans_ongoing[port] = false; + udi_cdc_rx_start(port); +} + +static void udi_cdc_data_sent(udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep) +{ + uint8_t port; + UNUSED(n); + + /* + switch (ep) { +#define UDI_CDC_DATA_EP_IN_TO_PORT(index, unused) \ + case UDI_CDC_DATA_EP_IN_##index: \ + port = index; \ + break; + MREPEAT(UDI_CDC_PORT_NB, UDI_CDC_DATA_EP_IN_TO_PORT, ~) +#undef UDI_CDC_DATA_EP_IN_TO_PORT + default: + port = 0; + break; + } + */ + port = 0; + + if (UDD_EP_TRANSFER_OK != status) { + // Abort transfer + return; + } + + udi_cdc_tx_buf_nb[port][(udi_cdc_tx_buf_sel[port]==0)?1:0] = 0; + udi_cdc_tx_both_buf_to_send[port] = false; + udi_cdc_tx_trans_ongoing[port] = false; + + if (n != 0) { + UDI_CDC_TX_EMPTY_NOTIFY(port); + } + + udi_cdc_tx_send(port); +} + +static void udi_cdc_tx_send(uint8_t port) +{ + uint32_t irqflags; //irqflags_t + uint8_t buf_sel_trans; + bool b_short_packet; + udd_ep_id_t ep; + static uint16_t sof_zlp_counter = 0; + +//#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; +//#endif + + if (udi_cdc_tx_trans_ongoing[port]) { + return; // Already on going or wait next SOF to send next data + } + if (udd_is_high_speed()) { + if (udi_cdc_tx_sof_num[port] == udd_get_micro_frame_number()) { + return; // Wait next SOF to send next data + } + }else{ + if (udi_cdc_tx_sof_num[port] == udd_get_frame_number()) { + return; // Wait next SOF to send next data + } + } + + irqflags = __get_PRIMASK(); + __disable_irq(); + __DMB(); + buf_sel_trans = udi_cdc_tx_buf_sel[port]; + if (udi_cdc_tx_buf_nb[port][buf_sel_trans] == 0) { + sof_zlp_counter++; + if (((!udd_is_high_speed()) && (sof_zlp_counter < 100)) + || (udd_is_high_speed() && (sof_zlp_counter < 800))) { + __DMB(); + __set_PRIMASK(irqflags); + return; + } + } + sof_zlp_counter = 0; + + if (!udi_cdc_tx_both_buf_to_send[port]) { + // Send current Buffer + // and switch the current buffer + udi_cdc_tx_buf_sel[port] = (buf_sel_trans==0)?1:0; + }else{ + // Send the other Buffer + // and no switch the current buffer + buf_sel_trans = (buf_sel_trans==0)?1:0; + } + udi_cdc_tx_trans_ongoing[port] = true; + __DMB(); + __set_PRIMASK(irqflags); + + b_short_packet = (udi_cdc_tx_buf_nb[port][buf_sel_trans] != UDI_CDC_TX_BUFFERS); + if (b_short_packet) { + if (udd_is_high_speed()) { + udi_cdc_tx_sof_num[port] = udd_get_micro_frame_number(); + }else{ + udi_cdc_tx_sof_num[port] = udd_get_frame_number(); + } + }else{ + udi_cdc_tx_sof_num[port] = 0; // Force next transfer without wait SOF + } + + /* + // Send the buffer with enable of short packet + switch (port) { +#define UDI_CDC_PORT_TO_DATA_EP_IN(index, unused) \ + case index: \ + ep = UDI_CDC_DATA_EP_IN_##index; \ + break; + MREPEAT(UDI_CDC_PORT_NB, UDI_CDC_PORT_TO_DATA_EP_IN, ~) +#undef UDI_CDC_PORT_TO_DATA_EP_IN + default: + ep = UDI_CDC_DATA_EP_IN_0; + break; + } + */ + ep = UDI_CDC_DATA_EP_IN_0; + + udd_ep_run( ep, + b_short_packet, + udi_cdc_tx_buf[port][buf_sel_trans], + udi_cdc_tx_buf_nb[port][buf_sel_trans], + udi_cdc_data_sent); +} + +//--------------------------------------------- +//------- Application interface + +void udi_cdc_ctrl_signal_dcd(bool b_set) +{ + udi_cdc_ctrl_state_change(0, b_set, CDC_SERIAL_STATE_DCD); +} + +void udi_cdc_ctrl_signal_dsr(bool b_set) +{ + udi_cdc_ctrl_state_change(0, b_set, CDC_SERIAL_STATE_DSR); +} + +void udi_cdc_signal_framing_error(void) +{ + udi_cdc_ctrl_state_change(0, true, CDC_SERIAL_STATE_FRAMING); +} + +void udi_cdc_signal_parity_error(void) +{ + udi_cdc_ctrl_state_change(0, true, CDC_SERIAL_STATE_PARITY); +} + +void udi_cdc_signal_overrun(void) +{ + udi_cdc_ctrl_state_change(0, true, CDC_SERIAL_STATE_OVERRUN); +} + +void udi_cdc_multi_ctrl_signal_dcd(uint8_t port, bool b_set) +{ + udi_cdc_ctrl_state_change(port, b_set, CDC_SERIAL_STATE_DCD); +} + +void udi_cdc_multi_ctrl_signal_dsr(uint8_t port, bool b_set) +{ + udi_cdc_ctrl_state_change(port, b_set, CDC_SERIAL_STATE_DSR); +} + +void udi_cdc_multi_signal_framing_error(uint8_t port) +{ + udi_cdc_ctrl_state_change(port, true, CDC_SERIAL_STATE_FRAMING); +} + +void udi_cdc_multi_signal_parity_error(uint8_t port) +{ + udi_cdc_ctrl_state_change(port, true, CDC_SERIAL_STATE_PARITY); +} + +void udi_cdc_multi_signal_overrun(uint8_t port) +{ + udi_cdc_ctrl_state_change(port, true, CDC_SERIAL_STATE_OVERRUN); +} + +iram_size_t udi_cdc_multi_get_nb_received_data(uint8_t port) +{ + uint32_t irqflags; //irqflags_t + uint16_t pos; + iram_size_t nb_received; + +//#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; +//#endif + + irqflags = __get_PRIMASK(); + __disable_irq(); + __DMB(); + pos = udi_cdc_rx_pos[port]; + nb_received = udi_cdc_rx_buf_nb[port][udi_cdc_rx_buf_sel[port]] - pos; + __DMB(); + __set_PRIMASK(irqflags); + return nb_received; +} + +iram_size_t udi_cdc_get_nb_received_data(void) +{ + return udi_cdc_multi_get_nb_received_data(0); +} + +bool udi_cdc_multi_is_rx_ready(uint8_t port) +{ + return (udi_cdc_multi_get_nb_received_data(port) > 0); +} + +bool udi_cdc_is_rx_ready(void) +{ + return udi_cdc_multi_is_rx_ready(0); +} + +int udi_cdc_multi_getc(uint8_t port) +{ + uint32_t irqflags; //irqflags_t + int rx_data = 0; + bool b_databit_9; + uint16_t pos; + uint8_t buf_sel; + bool again; + +//#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; +//#endif + + b_databit_9 = (9 == udi_cdc_line_coding[port].bDataBits); + +udi_cdc_getc_process_one_byte: + // Check available data + irqflags = __get_PRIMASK(); + __disable_irq(); + __DMB(); + pos = udi_cdc_rx_pos[port]; + buf_sel = udi_cdc_rx_buf_sel[port]; + again = pos >= udi_cdc_rx_buf_nb[port][buf_sel]; + __DMB(); + __set_PRIMASK(irqflags); + while (again) { + if (!udi_cdc_data_running) { + return 0; + } + goto udi_cdc_getc_process_one_byte; + } + + // Read data + rx_data |= udi_cdc_rx_buf[port][buf_sel][pos]; + udi_cdc_rx_pos[port] = pos+1; + + udi_cdc_rx_start(port); + + if (b_databit_9) { + // Receive MSB + b_databit_9 = false; + rx_data = rx_data << 8; + goto udi_cdc_getc_process_one_byte; + } + return rx_data; +} + +int udi_cdc_getc(void) +{ + return udi_cdc_multi_getc(0); +} + +iram_size_t udi_cdc_multi_read_buf(uint8_t port, void* buf, iram_size_t size) +{ + uint32_t irqflags; //irqflags_t + uint8_t *ptr_buf = (uint8_t *)buf; + iram_size_t copy_nb; + uint16_t pos; + uint8_t buf_sel; + bool again; + +//#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; +//#endif + +udi_cdc_read_buf_loop_wait: + // Check available data + irqflags = __get_PRIMASK(); + __disable_irq(); + __DMB(); pos = udi_cdc_rx_pos[port]; + buf_sel = udi_cdc_rx_buf_sel[port]; + again = pos >= udi_cdc_rx_buf_nb[port][buf_sel]; + __DMB(); + __set_PRIMASK(irqflags); + while (again) { + if (!udi_cdc_data_running) { + return size; + } + goto udi_cdc_read_buf_loop_wait; + } + + // Read data + copy_nb = udi_cdc_rx_buf_nb[port][buf_sel] - pos; + if (copy_nb>size) { + copy_nb = size; + } + memcpy(ptr_buf, &udi_cdc_rx_buf[port][buf_sel][pos], copy_nb); + udi_cdc_rx_pos[port] += copy_nb; + ptr_buf += copy_nb; + size -= copy_nb; + udi_cdc_rx_start(port); + + if (size) { + goto udi_cdc_read_buf_loop_wait; + } + return 0; +} + +static iram_size_t udi_cdc_multi_read_no_polling(uint8_t port, void* buf, iram_size_t size) +{ + uint8_t *ptr_buf = (uint8_t *)buf; + iram_size_t nb_avail_data; + uint16_t pos; + uint8_t buf_sel; + uint32_t irqflags; //irqflags_t + +//#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; +//#endif + + //Data interface not started... exit + if (!udi_cdc_data_running) { + return 0; + } + + //Get number of available data + // Check available data + irqflags = __get_PRIMASK(); + __disable_irq(); + __DMB(); + pos = udi_cdc_rx_pos[port]; + buf_sel = udi_cdc_rx_buf_sel[port]; + nb_avail_data = udi_cdc_rx_buf_nb[port][buf_sel] - pos; + __DMB(); + __set_PRIMASK(irqflags); + //If the buffer contains less than the requested number of data, + //adjust read size + if(nb_avail_data0) { + memcpy(ptr_buf, &udi_cdc_rx_buf[port][buf_sel][pos], size); + irqflags = __get_PRIMASK(); + __disable_irq(); + __DMB(); + udi_cdc_rx_pos[port] += size; + __DMB(); + __set_PRIMASK(irqflags); + ptr_buf += size; + udi_cdc_rx_start(port); + } + return(nb_avail_data); +} + +iram_size_t udi_cdc_read_no_polling(void* buf, iram_size_t size) +{ + return udi_cdc_multi_read_no_polling(0, buf, size); +} + +iram_size_t udi_cdc_read_buf(void* buf, iram_size_t size) +{ + return udi_cdc_multi_read_buf(0, buf, size); +} + +iram_size_t udi_cdc_multi_get_free_tx_buffer(uint8_t port) +{ + uint32_t irqflags; //irqflags_t + iram_size_t buf_sel_nb, retval; + uint8_t buf_sel; + +//#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; +//#endif + + irqflags = __get_PRIMASK(); + __disable_irq(); + __DMB(); + buf_sel = udi_cdc_tx_buf_sel[port]; + buf_sel_nb = udi_cdc_tx_buf_nb[port][buf_sel]; + if (buf_sel_nb == UDI_CDC_TX_BUFFERS) { + if ((!udi_cdc_tx_trans_ongoing[port]) + && (!udi_cdc_tx_both_buf_to_send[port])) { + /* One buffer is full, but the other buffer is not used. + * (not used = transfer on-going) + * then move to the other buffer to store data */ + udi_cdc_tx_both_buf_to_send[port] = true; + udi_cdc_tx_buf_sel[port] = (buf_sel == 0)? 1 : 0; + buf_sel_nb = 0; + } + } + retval = UDI_CDC_TX_BUFFERS - buf_sel_nb; + __DMB(); + __set_PRIMASK(irqflags); + return retval; +} + +iram_size_t udi_cdc_get_free_tx_buffer(void) +{ + return udi_cdc_multi_get_free_tx_buffer(0); +} + +bool udi_cdc_multi_is_tx_ready(uint8_t port) +{ + return (udi_cdc_multi_get_free_tx_buffer(port) != 0); +} + +bool udi_cdc_is_tx_ready(void) +{ + return udi_cdc_multi_is_tx_ready(0); +} + +int udi_cdc_multi_putc(uint8_t port, int value) +{ + uint32_t irqflags; //irqflags_t + bool b_databit_9; + uint8_t buf_sel; + +//#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; +//#endif + + b_databit_9 = (9 == udi_cdc_line_coding[port].bDataBits); + +udi_cdc_putc_process_one_byte: + // Check available space + if (!udi_cdc_multi_is_tx_ready(port)) { + if (!udi_cdc_data_running) { + return false; + } + goto udi_cdc_putc_process_one_byte; + } + + // Write value + irqflags = __get_PRIMASK(); + __disable_irq(); + __DMB(); + buf_sel = udi_cdc_tx_buf_sel[port]; + udi_cdc_tx_buf[port][buf_sel][udi_cdc_tx_buf_nb[port][buf_sel]++] = value; + __DMB(); + __set_PRIMASK(irqflags); + + if (b_databit_9) { + // Send MSB + b_databit_9 = false; + value = value >> 8; + goto udi_cdc_putc_process_one_byte; + } + return true; +} + +int udi_cdc_putc(int value) +{ + return udi_cdc_multi_putc(0, value); +} + +iram_size_t udi_cdc_multi_write_buf(uint8_t port, const void* buf, iram_size_t size) +{ + uint32_t irqflags; //irqflags_t + uint8_t buf_sel; + uint16_t buf_nb; + iram_size_t copy_nb; + uint8_t *ptr_buf = (uint8_t *)buf; + +//#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; +//#endif + + if (9 == udi_cdc_line_coding[port].bDataBits) { + size *=2; + } + + udi_cdc_write_buf_loop_wait: + + // Check available space + if (!udi_cdc_multi_is_tx_ready(port)) { + if (!udi_cdc_data_running) { + return size; + } + goto udi_cdc_write_buf_loop_wait; + } + + // Write values + irqflags = __get_PRIMASK(); + __disable_irq(); + __DMB(); + buf_sel = udi_cdc_tx_buf_sel[port]; + buf_nb = udi_cdc_tx_buf_nb[port][buf_sel]; + copy_nb = UDI_CDC_TX_BUFFERS - buf_nb; + if (copy_nb > size) { + copy_nb = size; + } + memcpy(&udi_cdc_tx_buf[port][buf_sel][buf_nb], ptr_buf, copy_nb); + udi_cdc_tx_buf_nb[port][buf_sel] = buf_nb + copy_nb; + __DMB(); + __set_PRIMASK(irqflags); + + // Update buffer pointer + ptr_buf = ptr_buf + copy_nb; + size -= copy_nb; + + if (size) { + goto udi_cdc_write_buf_loop_wait; + } + + return 0; +} + +iram_size_t udi_cdc_write_buf(const void* buf, iram_size_t size) +{ + return udi_cdc_multi_write_buf(0, buf, size); +} + +#define MAX_PRINT 256 +#define CDC_SEND_INTERVAL 2 +uint32_t cdc_tx_send_time_next; + +void CDC_send(void) +{ + while (CLK_get_ms() < cdc_tx_send_time_next); + udi_cdc_tx_send(0); + cdc_tx_send_time_next = CLK_get_ms() + CDC_SEND_INTERVAL; +} + +uint32_t CDC_print(char *printbuf) +{ + uint32_t count=0; + char *buf = printbuf; + char c; + + if (CLK_get_ms() < 5000) return 0; + + while ((c = *buf++) != 0 && !(count >= MAX_PRINT)) + { + count++; + if (!udi_cdc_is_tx_ready()) return 0; + udi_cdc_putc(c); + if (count >= UDI_CDC_TX_BUFFERS) + { + count = 0; + CDC_send(); + } + } + if (count) + { + CDC_send(); + } + return 1; +} + + +char printbuf[CDC_PRINTBUF_SIZE]; + +int dpf(const char *_Format, ...) +{ + va_list va; //Variable argument list variable + int result; + + va_start(va,_Format); //Initialize the variable argument list + result = vspf(printbuf, _Format, va); + va_end(va); + + CDC_print(printbuf); + + return result; +} + +//global "inbuf" if desired +inbuf_t inbuf; + +uint32_t CDC_input_buf(inbuf_t inbuf, uint32_t inbuf_size) +{ + int RXChar; + int entered = 0; + + if (!udi_cdc_is_rx_ready()) return 0; + udi_cdc_get_nb_received_data(); + RXChar = udi_cdc_getc(); + + if (RXChar) + { + switch (RXChar) + { + case '\t': //tab - repeat last + inbuf.count=inbuf.lastcount; + inbuf.buf[inbuf.count+1] = 0; + CDC_print(inbuf.buf); + break; + case '\r': //enter + inbuf.buf[inbuf.count]=0; + inbuf.lastcount = inbuf.count; + inbuf.count = 0; + entered = 1; + break; + case '\b': //backspace + if (inbuf.count > 0) { + inbuf.count -= 1; + CDC_print("\b \b\0"); + } + else + CDC_print("\a\0"); + break; + default: + if ((RXChar >= 32) && (RXChar <= 126)) + { + if (inbuf.count < inbuf_size-1) + { + inbuf.buf[inbuf.count] = RXChar; + inbuf.buf[inbuf.count+1] = 0; + CDC_print(&inbuf.buf[inbuf.count]); + inbuf.count += 1; + } + else + CDC_print("\a\0"); + } + break; + } + RXChar = 0; + } + return entered; +} + +uint32_t CDC_input() +{ + return CDC_input_buf(inbuf, CDC_INBUF_SIZE); +} + +void CDC_init(void) +{ + inbuf.count = 0; + inbuf.lastcount = 0; + printbuf[0] = 0; + cdc_tx_send_time_next = CLK_get_ms() + CDC_SEND_INTERVAL; +} + +#else //CDC line 62 + +char printbuf[CDC_PRINTBUF_SIZE]; + +void CDC_send(void) +{ + return; +} + +uint32_t CDC_print(char *printbuf) +{ + return 0; +} + +int dpf(const char *_Format, ...) +{ + return 0; +} + +inbuf_t inbuf; + +uint32_t CDC_input(void) +{ + return 0; +} + +void CDC_init(void) +{ + inbuf.count = 0; + inbuf.lastcount = 0; + printbuf[0]=0; +} + +char printbuf[CDC_PRINTBUF_SIZE]; + +#endif //CDC line 62 + +//@} diff --git a/tmk_core/protocol/arm_atsam/usb/udi_cdc.h b/tmk_core/protocol/arm_atsam/usb/udi_cdc.h new file mode 100644 index 000000000..6b70e96d0 --- /dev/null +++ b/tmk_core/protocol/arm_atsam/usb/udi_cdc.h @@ -0,0 +1,381 @@ +/** + * \file + * + * \brief USB Device Communication Device Class (CDC) interface definitions. + * + * Copyright (c) 2009-2016 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _UDI_CDC_H_ +#define _UDI_CDC_H_ + +#ifdef CDC + +#include "conf_usb.h" +#include "usb_protocol.h" +#include "usb_protocol_cdc.h" +#include "udd.h" +#include "udc_desc.h" +#include "udi.h" + +// Check the number of port +#ifndef UDI_CDC_PORT_NB +# define UDI_CDC_PORT_NB 1 +#endif +#if (UDI_CDC_PORT_NB > 1) +# error UDI_CDC_PORT_NB must be at most 1 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \addtogroup udi_cdc_group_udc + * @{ + */ + +//! Global structure which contains standard UDI API for UDC +extern UDC_DESC_STORAGE udi_api_t udi_api_cdc_comm; +extern UDC_DESC_STORAGE udi_api_t udi_api_cdc_data; +//@} + +//#define CDC_ACM_SIZE 64 see usb_protocol_cdc.h +//#define CDC_RX_SIZE 64 + +//! CDC communication endpoints size for all speeds +#define UDI_CDC_COMM_EP_SIZE CDC_ACM_SIZE +//! CDC data endpoints size for FS speed (8B, 16B, 32B, 64B) +#define UDI_CDC_DATA_EPS_FS_SIZE CDC_RX_SIZE + +#define CDC_PRINT_BUF_SIZE 256 +extern char printbuf[CDC_PRINT_BUF_SIZE]; + +//@} + +/** + * \ingroup udi_group + * \defgroup udi_cdc_group USB Device Interface (UDI) for Communication Class Device (CDC) + * + * Common APIs used by high level application to use this USB class. + * + * These routines are used to transfer and control data + * to/from USB CDC endpoint. + * + * See \ref udi_cdc_quickstart. + * @{ + */ + +/** + * \name Interface for application with single CDC interface support + */ +//@{ + +/** + * \brief Notify a state change of DCD signal + * + * \param b_set DCD is enabled if true, else disabled + */ +void udi_cdc_ctrl_signal_dcd(bool b_set); + +/** + * \brief Notify a state change of DSR signal + * + * \param b_set DSR is enabled if true, else disabled + */ +void udi_cdc_ctrl_signal_dsr(bool b_set); + +/** + * \brief Notify a framing error + */ +void udi_cdc_signal_framing_error(void); + +/** + * \brief Notify a parity error + */ +void udi_cdc_signal_parity_error(void); + +/** + * \brief Notify a overrun + */ +void udi_cdc_signal_overrun(void); + +/** + * \brief Gets the number of byte received + * + * \return the number of data available + */ +iram_size_t udi_cdc_get_nb_received_data(void); + +/** + * \brief This function checks if a character has been received on the CDC line + * + * \return \c 1 if a byte is ready to be read. + */ +bool udi_cdc_is_rx_ready(void); + +/** + * \brief Waits and gets a value on CDC line + * + * \return value read on CDC line + */ +int udi_cdc_getc(void); + +/** + * \brief Reads a RAM buffer on CDC line + * + * \param buf Values read + * \param size Number of value read + * + * \return the number of data remaining + */ +iram_size_t udi_cdc_read_buf(void* buf, iram_size_t size); + +/** + * \brief Non polling reads of a up to 'size' data from CDC line + * + * \param port Communication port number to manage + * \param buf Buffer where to store read data + * \param size Maximum number of data to read (size of buffer) + * + * \return the number of data effectively read + */ +iram_size_t udi_cdc_read_no_polling(void* buf, iram_size_t size); + +/** + * \brief Gets the number of free byte in TX buffer + * + * \return the number of free byte in TX buffer + */ +iram_size_t udi_cdc_get_free_tx_buffer(void); + +/** + * \brief This function checks if a new character sent is possible + * The type int is used to support scanf redirection from compiler LIB. + * + * \return \c 1 if a new character can be sent + */ +bool udi_cdc_is_tx_ready(void); + +/** + * \brief Puts a byte on CDC line + * The type int is used to support printf redirection from compiler LIB. + * + * \param value Value to put + * + * \return \c 1 if function was successfully done, otherwise \c 0. + */ +int udi_cdc_putc(int value); + +/** + * \brief Writes a RAM buffer on CDC line + * + * \param buf Values to write + * \param size Number of value to write + * + * \return the number of data remaining + */ +iram_size_t udi_cdc_write_buf(const void* buf, iram_size_t size); +//@} + +/** + * \name Interface for application with multi CDC interfaces support + */ +//@{ + +/** + * \brief Notify a state change of DCD signal + * + * \param port Communication port number to manage + * \param b_set DCD is enabled if true, else disabled + */ +void udi_cdc_multi_ctrl_signal_dcd(uint8_t port, bool b_set); + +/** + * \brief Notify a state change of DSR signal + * + * \param port Communication port number to manage + * \param b_set DSR is enabled if true, else disabled + */ +void udi_cdc_multi_ctrl_signal_dsr(uint8_t port, bool b_set); + +/** + * \brief Notify a framing error + * + * \param port Communication port number to manage + */ +void udi_cdc_multi_signal_framing_error(uint8_t port); + +/** + * \brief Notify a parity error + * + * \param port Communication port number to manage + */ +void udi_cdc_multi_signal_parity_error(uint8_t port); + +/** + * \brief Notify a overrun + * + * \param port Communication port number to manage + */ +void udi_cdc_multi_signal_overrun(uint8_t port); + +/** + * \brief Gets the number of byte received + * + * \param port Communication port number to manage + * + * \return the number of data available + */ +iram_size_t udi_cdc_multi_get_nb_received_data(uint8_t port); + +/** + * \brief This function checks if a character has been received on the CDC line + * + * \param port Communication port number to manage + * + * \return \c 1 if a byte is ready to be read. + */ +bool udi_cdc_multi_is_rx_ready(uint8_t port); + +/** + * \brief Waits and gets a value on CDC line + * + * \param port Communication port number to manage + * + * \return value read on CDC line + */ +int udi_cdc_multi_getc(uint8_t port); + +/** + * \brief Reads a RAM buffer on CDC line + * + * \param port Communication port number to manage + * \param buf Values read + * \param size Number of values read + * + * \return the number of data remaining + */ +iram_size_t udi_cdc_multi_read_buf(uint8_t port, void* buf, iram_size_t size); + +/** + * \brief Gets the number of free byte in TX buffer + * + * \param port Communication port number to manage + * + * \return the number of free byte in TX buffer + */ +iram_size_t udi_cdc_multi_get_free_tx_buffer(uint8_t port); + +/** + * \brief This function checks if a new character sent is possible + * The type int is used to support scanf redirection from compiler LIB. + * + * \param port Communication port number to manage + * + * \return \c 1 if a new character can be sent + */ +bool udi_cdc_multi_is_tx_ready(uint8_t port); + +/** + * \brief Puts a byte on CDC line + * The type int is used to support printf redirection from compiler LIB. + * + * \param port Communication port number to manage + * \param value Value to put + * + * \return \c 1 if function was successfully done, otherwise \c 0. + */ +int udi_cdc_multi_putc(uint8_t port, int value); + +/** + * \brief Writes a RAM buffer on CDC line + * + * \param port Communication port number to manage + * \param buf Values to write + * \param size Number of value to write + * + * \return the number of data remaining + */ +iram_size_t udi_cdc_multi_write_buf(uint8_t port, const void* buf, iram_size_t size); +//@} + +#define CDC_PRINTBUF_SIZE 256 +extern char printbuf[CDC_PRINTBUF_SIZE]; + +#define CDC_INBUF_SIZE 256 + +typedef struct { + uint32_t count; + uint32_t lastcount; + char buf[CDC_INBUF_SIZE]; +} inbuf_t; + +#else //CDC + +// keep these to accommodate calls if remaining +#define CDC_PRINTBUF_SIZE 1 +extern char printbuf[CDC_PRINTBUF_SIZE]; + +#define CDC_INBUF_SIZE 1 + +typedef struct { + uint32_t count; + uint32_t lastcount; + char buf[CDC_INBUF_SIZE]; +} inbuf_t; + +extern inbuf_t inbuf; + +#endif //CDC + +uint32_t CDC_print(char *printbuf); +uint32_t CDC_input(void); +void CDC_init(void); + +#define __xprintf dpf +int dpf(const char *_Format, ...); + +#ifdef __cplusplus +} +#endif + +#endif // _UDI_CDC_H_ diff --git a/tmk_core/protocol/arm_atsam/usb/udi_cdc_conf.h b/tmk_core/protocol/arm_atsam/usb/udi_cdc_conf.h new file mode 100644 index 000000000..2db61fab5 --- /dev/null +++ b/tmk_core/protocol/arm_atsam/usb/udi_cdc_conf.h @@ -0,0 +1,72 @@ +/** + * \file + * + * \brief Default CDC configuration for a USB Device with a single interface + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _UDI_CDC_CONF_H_ +#define _UDI_CDC_CONF_H_ + +#include "usb_protocol_cdc.h" +#include "conf_usb.h" +#include "udi_device_conf.h" + +#ifndef UDI_CDC_PORT_NB +#define UDI_CDC_PORT_NB 1 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define UDI_CDC_DATA_EP_IN_0 ((CDC_TX_ENDPOINT) | (USB_EP_DIR_IN)) //TX +#define UDI_CDC_DATA_EP_OUT_0 ((CDC_RX_ENDPOINT) | (USB_EP_DIR_OUT)) // RX +#define UDI_CDC_COMM_EP_0 ((CDC_ACM_ENDPOINT) | (USB_EP_DIR_IN)) // Notify endpoint + +#define UDI_CDC_COMM_IFACE_NUMBER_0 (CDC_STATUS_INTERFACE) +#define UDI_CDC_DATA_IFACE_NUMBER_0 (CDC_DATA_INTERFACE) + +#ifdef __cplusplus +} +#endif +#endif // _UDI_CDC_CONF_H_ diff --git a/tmk_core/protocol/arm_atsam/usb/udi_device_conf.h b/tmk_core/protocol/arm_atsam/usb/udi_device_conf.h new file mode 100644 index 000000000..c78726234 --- /dev/null +++ b/tmk_core/protocol/arm_atsam/usb/udi_device_conf.h @@ -0,0 +1,715 @@ +/* +Copyright 2018 Massdrop Inc. + +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 . +*/ + +#ifndef _UDI_DEVICE_CONF_H_ +#define _UDI_DEVICE_CONF_H_ + +#include "udi_device_epsize.h" +#include "usb_protocol.h" +#include "compiler.h" +#include "usb_protocol_hid.h" + +#define DEVICE_CLASS 0 +#define DEVICE_SUBCLASS 0 +#define DEVICE_PROTOCOL 0 + +#define KBD + +//#define MOUSE_ENABLE //rules.mk +#ifdef MOUSE_ENABLE +#define MOU +#endif + +//#define EXTRAKEY_ENABLE //rules.mk +#ifdef EXTRAKEY_ENABLE +#define EXK +#endif + +//#define RAW_ENABLE //rules.mk +#ifdef RAW_ENABLE +#define RAW +#endif + +//#define CONSOLE_ENABLE //deferred implementation +//#ifdef CONSOLE_ENABLE +//#define CON +//#endif + +//#define NKRO_ENABLE //rules.mk +#ifdef NKRO_ENABLE +#define NKRO +#endif + +//#define MIDI_ENABLE //deferred implementation +//#ifdef MIDI_ENABLE +//#define MIDI +//#endif + +//#define VIRTSER_ENABLE //rules.mk +#ifdef VIRTSER_ENABLE +#define CDC +//because CDC uses IAD (interface association descriptor +//per USB Interface Association Descriptor Device Class Code and Use Model 7/23/2003 Rev 1.0) +#undef DEVICE_CLASS +#define DEVICE_CLASS 0xEF +#undef DEVICE_SUBCLASS +#define DEVICE_SUBCLASS 0x02 +#undef DEVICE_PROTOCOL +#define DEVICE_PROTOCOL 0x01 +#endif + +/* number of interfaces */ +#define NEXT_INTERFACE_0 0 + +#ifdef KBD +#define KEYBOARD_INTERFACE NEXT_INTERFACE_0 +#define NEXT_INTERFACE_1 (KEYBOARD_INTERFACE + 1) +#define UDI_HID_KBD_IFACE_NUMBER KEYBOARD_INTERFACE +#else +#define NEXT_INTERFACE_1 NEXT_INTERFACE_0 +#endif + +// It is important that the Raw HID interface is at a constant +// interface number, to support Linux/OSX platforms and chrome.hid +// If Raw HID is enabled, let it be always 1. +#ifdef RAW +#define RAW_INTERFACE NEXT_INTERFACE_1 +#define NEXT_INTERFACE_2 (RAW_INTERFACE + 1) +#else +#define NEXT_INTERFACE_2 NEXT_INTERFACE_1 +#endif + +#ifdef MOU +#define MOUSE_INTERFACE NEXT_INTERFACE_2 +#define UDI_HID_MOU_IFACE_NUMBER MOUSE_INTERFACE +#define NEXT_INTERFACE_3 (MOUSE_INTERFACE + 1) +#else +#define NEXT_INTERFACE_3 NEXT_INTERFACE_2 +#endif + +#ifdef EXK +#define EXTRAKEY_INTERFACE NEXT_INTERFACE_3 +#define NEXT_INTERFACE_4 (EXTRAKEY_INTERFACE + 1) +#define UDI_HID_EXK_IFACE_NUMBER EXTRAKEY_INTERFACE +#else +#define NEXT_INTERFACE_4 NEXT_INTERFACE_3 +#endif + +#ifdef CON +#define CONSOLE_INTERFACE NEXT_INTERFACE_4 +#define NEXT_INTERFACE_5 (CONSOLE_INTERFACE + 1) +#else +#define NEXT_INTERFACE_5 NEXT_INTERFACE_4 +#endif + +#ifdef NKRO +#define NKRO_INTERFACE NEXT_INTERFACE_5 +#define NEXT_INTERFACE_6 (NKRO_INTERFACE + 1) +#define UDI_HID_NKRO_IFACE_NUMBER NKRO_INTERFACE +#else +#define NEXT_INTERFACE_6 NEXT_INTERFACE_5 +#endif + +#ifdef MIDI +#define AC_INTERFACE NEXT_INTERFACE_6 +#define AS_INTERFACE (AC_INTERFACE + 1) +#define NEXT_INTERFACE_7 (AS_INTERFACE + 1) +#else +#define NEXT_INTERFACE_7 NEXT_INTERFACE_6 +#endif + +#ifdef CDC +#define CCI_INTERFACE NEXT_INTERFACE_7 +#define CDI_INTERFACE (CCI_INTERFACE + 1) +#define NEXT_INTERFACE_8 (CDI_INTERFACE + 1) +#define CDC_STATUS_INTERFACE CCI_INTERFACE +#define CDC_DATA_INTERFACE CDI_INTERFACE +#else +#define NEXT_INTERFACE_8 NEXT_INTERFACE_7 +#endif + +/* nubmer of interfaces */ +#define TOTAL_INTERFACES NEXT_INTERFACE_8 +#define USB_DEVICE_NB_INTERFACE TOTAL_INTERFACES + + +// ********************************************************************** +// Endopoint number and size +// ********************************************************************** +#define USB_DEVICE_EP_CTRL_SIZE 8 + +#define NEXT_IN_EPNUM_0 1 +#define NEXT_OUT_EPNUM_0 1 + +#ifdef KBD +#define KEYBOARD_IN_EPNUM NEXT_IN_EPNUM_0 +#define UDI_HID_KBD_EP_IN KEYBOARD_IN_EPNUM +#define NEXT_IN_EPNUM_1 (KEYBOARD_IN_EPNUM + 1) +#define UDI_HID_KBD_EP_SIZE KEYBOARD_EPSIZE +#define KBD_POLLING_INTERVAL 10 +#ifndef UDI_HID_KBD_STRING_ID +#define UDI_HID_KBD_STRING_ID 0 +#endif +#else +#define NEXT_IN_EPNUM_1 NEXT_IN_EPNUM_0 +#endif + +#ifdef MOU +#define MOUSE_IN_EPNUM NEXT_IN_EPNUM_1 +#define NEXT_IN_EPNUM_2 (MOUSE_IN_EPNUM + 1) +#define UDI_HID_MOU_EP_IN MOUSE_IN_EPNUM +#define UDI_HID_MOU_EP_SIZE MOUSE_EPSIZE +#define MOU_POLLING_INTERVAL 10 +#ifndef UDI_HID_MOU_STRING_ID +#define UDI_HID_MOU_STRING_ID 0 +#endif +#else +#define NEXT_IN_EPNUM_2 NEXT_IN_EPNUM_1 +#endif + +#ifdef EXK +#define EXTRAKEY_IN_EPNUM NEXT_IN_EPNUM_2 +#define UDI_HID_EXK_EP_IN EXTRAKEY_IN_EPNUM +#define NEXT_IN_EPNUM_3 (EXTRAKEY_IN_EPNUM + 1) +#define UDI_HID_EXK_EP_SIZE EXTRAKEY_EPSIZE +#define EXTRAKEY_POLLING_INTERVAL 10 +#ifndef UDI_HID_EXK_STRING_ID +#define UDI_HID_EXK_STRING_ID 0 +#endif +#else +#define NEXT_IN_EPNUM_3 NEXT_IN_EPNUM_2 +#endif + +#ifdef RAW +#define RAW_IN_EPNUM NEXT_IN_EPNUM_3 +#define UDI_HID_RAW_EP_IN RAW_IN_EPNUM +#define NEXT_IN_EPNUM_4 (RAW_IN_EPNUM + 1) +#define RAW_OUT_EPNUM NEXT_OUT_EPNUM_0 +#define UDI_HID_RAW_EP_OUT RAW_OUT_EPNUM +#define NEXT_OUT_EPNUM_1 (RAW_OUT_EPNUM + 1) +#define RAW_POLLING_INTERVAL 1 +#ifndef UDI_HID_RAW_STRING_ID +#define UDI_HID_RAW_STRING_ID 0 +#endif +#else +#define NEXT_IN_EPNUM_4 NEXT_IN_EPNUM_3 +#define NEXT_OUT_EPNUM_1 NEXT_OUT_EPNUM_0 +#endif + +#ifdef CON +#define CONSOLE_IN_EPNUM NEXT_IN_EPNUM_4 +#define NEXT_IN_EPNUM_5 (CONSOLE_IN_EPNUM + 1) +#define CONSOLE_OUT_EPNUM NEXT_OUT_EPNUM_1 +#define NEXT_OUT_EPNUM_2 (CONSOLE_OUT_EPNUM + 1) +#define CONSOLE_POLLING_INTERVAL 1 +#else +#define NEXT_IN_EPNUM_5 NEXT_IN_EPNUM_4 +#define NEXT_OUT_EPNUM_2 NEXT_OUT_EPNUM_1 +#endif + +#ifdef NKRO +#define NKRO_IN_EPNUM NEXT_IN_EPNUM_5 +#define UDI_HID_NKRO_EP_IN NKRO_IN_EPNUM +#define NEXT_IN_EPNUM_6 (NKRO_IN_EPNUM + 1) +#define UDI_HID_NKRO_EP_SIZE NKRO_EPSIZE +#define NKRO_POLLING_INTERVAL 1 +#ifndef UDI_HID_NKRO_STRING_ID +#define UDI_HID_NKRO_STRING_ID 0 +#endif +#else +#define NEXT_IN_EPNUM_6 NEXT_IN_EPNUM_5 +#endif + +#ifdef MIDI +#define MIDI_STREAM_IN_EPNUM NEXT_IN_EPNUM_6 +#define NEXT_IN_EPNUM_7 (MIDI_STREAM_IN_EPNUM + 1) +#define MIDI_STREAM_OUT_EPNUM NEXT_OUT_EPNUM_2 +#define NEXT_OUT_EPNUM_3 (MIDI_STREAM_OUT_EPNUM + 1) +#define MIDI_POLLING_INTERVAL 5 +#else +#define NEXT_IN_EPNUM_7 NEXT_IN_EPNUM_6 +#define NEXT_OUT_EPNUM_3 NEXT_OUT_EPNUM_2 +#endif + +#ifdef CDC +#define CDC_NOTIFICATION_EPNUM NEXT_IN_EPNUM_7 +#define CDC_ACM_ENDPOINT CDC_NOTIFICATION_EPNUM +#define CDC_TX_ENDPOINT (CDC_NOTIFICATION_EPNUM + 1) +#define NEXT_IN_EPNUM_8 (CDC_TX_ENDPOINT + 1) + +#define CDC_OUT_EPNUM NEXT_OUT_EPNUM_3 +#define CDC_RX_ENDPOINT CDC_OUT_EPNUM +#define NEXT_OUT_EPNUM_4 (CDC_OUT_EPNUM + 1) + +#define CDC_ACM_SIZE CDC_NOTIFICATION_EPSIZE +#define CDC_RX_SIZE CDC_EPSIZE //KFSMOD was 64 +#define CDC_TX_SIZE CDC_RX_SIZE +#define CDC_ACM_POLLING_INTERVAL 255 +#define CDC_EP_INTERVAL_STATUS CDC_ACM_POLLING_INTERVAL +#define CDC_DATA_POLLING_INTERVAL 5 +#define CDC_EP_INTERVAL_DATA CDC_DATA_POLLING_INTERVAL +#define CDC_STATUS_NAME L"Virtual Serial Port - Status" +#define CDC_DATA_NAME L"Virtual Serial Port - Data" +#else +#define NEXT_IN_EPNUM_8 NEXT_IN_EPNUM_7 +#define NEXT_OUT_EPNUM_4 NEXT_OUT_EPNUM_3 +#endif + +#define TOTAL_OUT_EP NEXT_OUT_EPNUM_4 +#define TOTAL_IN_EP NEXT_IN_EPNUM_8 +#define USB_DEVICE_MAX_EP (max(NEXT_OUT_EPNUM_4, NEXT_IN_EPNUM_8)) + +#if USB_DEVICE_MAX_EP > 8 +#error "There are not enough available endpoints to support all functions. Remove some in the rules.mk file.(MOUSEKEY, EXTRAKEY, CONSOLE, NKRO, MIDI, VIRTSER)" +#endif + + +// ********************************************************************** +// KBD Descriptor structure and content +// ********************************************************************** +#ifdef KBD + +COMPILER_PACK_SET(1) + +typedef struct { + usb_iface_desc_t iface; + usb_hid_descriptor_t hid; + usb_ep_desc_t ep; +} udi_hid_kbd_desc_t; + +typedef struct { + uint8_t array[59]; +} udi_hid_kbd_report_desc_t; + +#define UDI_HID_KBD_DESC {\ + .iface.bLength = sizeof(usb_iface_desc_t),\ + .iface.bDescriptorType = USB_DT_INTERFACE,\ + .iface.bInterfaceNumber = UDI_HID_KBD_IFACE_NUMBER,\ + .iface.bAlternateSetting = 0,\ + .iface.bNumEndpoints = 1,\ + .iface.bInterfaceClass = HID_CLASS,\ + .iface.bInterfaceSubClass = HID_SUB_CLASS_BOOT,\ + .iface.bInterfaceProtocol = HID_PROTOCOL_KEYBOARD,\ + .iface.iInterface = UDI_HID_KBD_STRING_ID,\ + .hid.bLength = sizeof(usb_hid_descriptor_t),\ + .hid.bDescriptorType = USB_DT_HID,\ + .hid.bcdHID = LE16(USB_HID_BDC_V1_11),\ + .hid.bCountryCode = USB_HID_NO_COUNTRY_CODE,\ + .hid.bNumDescriptors = USB_HID_NUM_DESC,\ + .hid.bRDescriptorType = USB_DT_HID_REPORT,\ + .hid.wDescriptorLength = LE16(sizeof(udi_hid_kbd_report_desc_t)),\ + .ep.bLength = sizeof(usb_ep_desc_t),\ + .ep.bDescriptorType = USB_DT_ENDPOINT,\ + .ep.bEndpointAddress = UDI_HID_KBD_EP_IN | USB_EP_DIR_IN,\ + .ep.bmAttributes = USB_EP_TYPE_INTERRUPT,\ + .ep.wMaxPacketSize = LE16(UDI_HID_KBD_EP_SIZE),\ + .ep.bInterval = KBD_POLLING_INTERVAL,\ +} + +//set report buffer (from host) +extern uint8_t udi_hid_kbd_report_set; + +//report buffer (to host) +#define UDI_HID_KBD_REPORT_SIZE 8 +extern uint8_t udi_hid_kbd_report[UDI_HID_KBD_REPORT_SIZE]; + +COMPILER_PACK_RESET() + +#endif //KBD + +// ********************************************************************** +// EXK Descriptor structure and content +// ********************************************************************** +#ifdef EXK + +COMPILER_PACK_SET(1) + +typedef struct { + usb_iface_desc_t iface; + usb_hid_descriptor_t hid; + usb_ep_desc_t ep; +} udi_hid_exk_desc_t; + +typedef struct { + uint8_t array[54]; +} udi_hid_exk_report_desc_t; + +#define UDI_HID_EXK_DESC {\ + .iface.bLength = sizeof(usb_iface_desc_t),\ + .iface.bDescriptorType = USB_DT_INTERFACE,\ + .iface.bInterfaceNumber = UDI_HID_EXK_IFACE_NUMBER,\ + .iface.bAlternateSetting = 0,\ + .iface.bNumEndpoints = 1,\ + .iface.bInterfaceClass = HID_CLASS,\ + .iface.bInterfaceSubClass = HID_SUB_CLASS_BOOT,\ + .iface.bInterfaceProtocol = HID_PROTOCOL_GENERIC,\ + .iface.iInterface = UDI_HID_EXK_STRING_ID,\ + .hid.bLength = sizeof(usb_hid_descriptor_t),\ + .hid.bDescriptorType = USB_DT_HID,\ + .hid.bcdHID = LE16(USB_HID_BDC_V1_11),\ + .hid.bCountryCode = USB_HID_NO_COUNTRY_CODE,\ + .hid.bNumDescriptors = USB_HID_NUM_DESC,\ + .hid.bRDescriptorType = USB_DT_HID_REPORT,\ + .hid.wDescriptorLength = LE16(sizeof(udi_hid_exk_report_desc_t)),\ + .ep.bLength = sizeof(usb_ep_desc_t),\ + .ep.bDescriptorType = USB_DT_ENDPOINT,\ + .ep.bEndpointAddress = UDI_HID_EXK_EP_IN | USB_EP_DIR_IN,\ + .ep.bmAttributes = USB_EP_TYPE_INTERRUPT,\ + .ep.wMaxPacketSize = LE16(UDI_HID_EXK_EP_SIZE),\ + .ep.bInterval = EXTRAKEY_POLLING_INTERVAL,\ +} + +//set report buffer (from host) +extern uint8_t udi_hid_exk_report_set; + +//report buffer +#define UDI_HID_EXK_REPORT_SIZE 3 + +typedef union { + struct { + uint8_t report_id; + uint16_t report_data; + } desc; + uint8_t raw[UDI_HID_EXK_REPORT_SIZE]; +} udi_hid_exk_report_t; + +extern udi_hid_exk_report_t udi_hid_exk_report; + +COMPILER_PACK_RESET() + +#endif //EXK + +// ********************************************************************** +// NKRO Descriptor structure and content +// ********************************************************************** +#ifdef NKRO + +COMPILER_PACK_SET(1) + +typedef struct { + usb_iface_desc_t iface; + usb_hid_descriptor_t hid; + usb_ep_desc_t ep; +} udi_hid_nkro_desc_t; + +typedef struct { + uint8_t array[57]; +} udi_hid_nkro_report_desc_t; + +#define UDI_HID_NKRO_DESC {\ + .iface.bLength = sizeof(usb_iface_desc_t),\ + .iface.bDescriptorType = USB_DT_INTERFACE,\ + .iface.bInterfaceNumber = UDI_HID_NKRO_IFACE_NUMBER,\ + .iface.bAlternateSetting = 0,\ + .iface.bNumEndpoints = 1,\ + .iface.bInterfaceClass = HID_CLASS,\ + .iface.bInterfaceSubClass = HID_SUB_CLASS_NOBOOT,\ + .iface.bInterfaceProtocol = HID_PROTOCOL_KEYBOARD,\ + .iface.iInterface = UDI_HID_NKRO_STRING_ID,\ + .hid.bLength = sizeof(usb_hid_descriptor_t),\ + .hid.bDescriptorType = USB_DT_HID,\ + .hid.bcdHID = LE16(USB_HID_BDC_V1_11),\ + .hid.bCountryCode = USB_HID_NO_COUNTRY_CODE,\ + .hid.bNumDescriptors = USB_HID_NUM_DESC,\ + .hid.bRDescriptorType = USB_DT_HID_REPORT,\ + .hid.wDescriptorLength = LE16(sizeof(udi_hid_nkro_report_desc_t)),\ + .ep.bLength = sizeof(usb_ep_desc_t),\ + .ep.bDescriptorType = USB_DT_ENDPOINT,\ + .ep.bEndpointAddress = UDI_HID_NKRO_EP_IN | USB_EP_DIR_IN,\ + .ep.bmAttributes = USB_EP_TYPE_INTERRUPT,\ + .ep.wMaxPacketSize = LE16(UDI_HID_NKRO_EP_SIZE),\ + .ep.bInterval = NKRO_POLLING_INTERVAL,\ +} + +//set report buffer +extern uint8_t udi_hid_nkro_report_set; + +//report buffer +#define UDI_HID_NKRO_REPORT_SIZE 32 +extern uint8_t udi_hid_nkro_report[UDI_HID_NKRO_REPORT_SIZE]; + +COMPILER_PACK_RESET() + +#endif //NKRO + +// ********************************************************************** +// MOU Descriptor structure and content +// ********************************************************************** +#ifdef MOU + +COMPILER_PACK_SET(1) + +typedef struct { + usb_iface_desc_t iface; + usb_hid_descriptor_t hid; + usb_ep_desc_t ep; +} udi_hid_mou_desc_t; + +typedef struct { + uint8_t array[77];//MOU PDS +} udi_hid_mou_report_desc_t; + +#define UDI_HID_MOU_DESC {\ + .iface.bLength = sizeof(usb_iface_desc_t),\ + .iface.bDescriptorType = USB_DT_INTERFACE,\ + .iface.bInterfaceNumber = MOUSE_INTERFACE,\ + .iface.bAlternateSetting = 0,\ + .iface.bNumEndpoints = 1,\ + .iface.bInterfaceClass = HID_CLASS,\ + .iface.bInterfaceSubClass = HID_SUB_CLASS_BOOT,\ + .iface.bInterfaceProtocol = HID_PROTOCOL_MOUSE,\ + .iface.iInterface = UDI_HID_MOU_STRING_ID,\ + .hid.bLength = sizeof(usb_hid_descriptor_t),\ + .hid.bDescriptorType = USB_DT_HID,\ + .hid.bcdHID = LE16(USB_HID_BDC_V1_11),\ + .hid.bCountryCode = USB_HID_NO_COUNTRY_CODE,\ + .hid.bNumDescriptors = USB_HID_NUM_DESC,\ + .hid.bRDescriptorType = USB_DT_HID_REPORT,\ + .hid.wDescriptorLength = LE16(sizeof(udi_hid_mou_report_desc_t)),\ + .ep.bLength = sizeof(usb_ep_desc_t),\ + .ep.bDescriptorType = USB_DT_ENDPOINT,\ + .ep.bEndpointAddress = UDI_HID_MOU_EP_IN | USB_EP_DIR_IN,\ + .ep.bmAttributes = USB_EP_TYPE_INTERRUPT,\ + .ep.wMaxPacketSize = LE16(UDI_HID_MOU_EP_SIZE),\ + .ep.bInterval = MOU_POLLING_INTERVAL,\ +} + +//no set report buffer + +//report buffer +#define UDI_HID_MOU_REPORT_SIZE 5 //MOU PDS +extern uint8_t udi_hid_mou_report[UDI_HID_MOU_REPORT_SIZE]; + +COMPILER_PACK_RESET() + +#endif //MOU + +// ********************************************************************** +// RAW Descriptor structure and content +// ********************************************************************** +#ifdef RAW + +COMPILER_PACK_SET(1) + +typedef struct { + usb_iface_desc_t iface; + usb_hid_descriptor_t hid; + usb_ep_desc_t ep_out; + usb_ep_desc_t ep_in; +} udi_hid_raw_desc_t; + +typedef struct { + uint8_t array[27]; +} udi_hid_raw_report_desc_t; + +#define UDI_HID_RAW_DESC {\ + .iface.bLength = sizeof(usb_iface_desc_t),\ + .iface.bDescriptorType = USB_DT_INTERFACE,\ + .iface.bInterfaceNumber = RAW_INTERFACE,\ + .iface.bAlternateSetting = 0,\ + .iface.bNumEndpoints = 2,\ + .iface.bInterfaceClass = HID_CLASS,\ + .iface.bInterfaceSubClass = HID_SUB_CLASS_NOBOOT,\ + .iface.bInterfaceProtocol = HID_SUB_CLASS_NOBOOT,\ + .iface.iInterface = UDI_HID_RAW_STRING_ID,\ + .hid.bLength = sizeof(usb_hid_descriptor_t),\ + .hid.bDescriptorType = USB_DT_HID,\ + .hid.bcdHID = LE16(USB_HID_BDC_V1_11),\ + .hid.bCountryCode = USB_HID_NO_COUNTRY_CODE,\ + .hid.bNumDescriptors = USB_HID_NUM_DESC,\ + .hid.bRDescriptorType = USB_DT_HID_REPORT,\ + .hid.wDescriptorLength = LE16(sizeof(udi_hid_raw_report_desc_t)),\ + .ep_out.bLength = sizeof(usb_ep_desc_t),\ + .ep_out.bDescriptorType = USB_DT_ENDPOINT,\ + .ep_out.bEndpointAddress = UDI_HID_RAW_EP_OUT | USB_EP_DIR_OUT,\ + .ep_out.bmAttributes = USB_EP_TYPE_INTERRUPT,\ + .ep_out.wMaxPacketSize = LE16(RAW_EPSIZE),\ + .ep_out.bInterval = RAW_POLLING_INTERVAL,\ + .ep_in.bLength = sizeof(usb_ep_desc_t),\ + .ep_in.bDescriptorType = USB_DT_ENDPOINT,\ + .ep_in.bEndpointAddress = UDI_HID_RAW_EP_IN | USB_EP_DIR_IN,\ + .ep_in.bmAttributes = USB_EP_TYPE_INTERRUPT,\ + .ep_in.wMaxPacketSize = LE16(RAW_EPSIZE),\ + .ep_in.bInterval = RAW_POLLING_INTERVAL,\ +} + +#define UDI_HID_RAW_REPORT_SIZE RAW_EPSIZE + +extern uint8_t udi_hid_raw_report_set[UDI_HID_RAW_REPORT_SIZE]; + +//report buffer +extern uint8_t udi_hid_raw_report[UDI_HID_RAW_REPORT_SIZE]; + +COMPILER_PACK_RESET() + +#endif //RAW + +// ********************************************************************** +// CDC Descriptor structure and content +// ********************************************************************** +#ifdef CDC + +COMPILER_PACK_SET(1) + +typedef struct { + uint8_t bFunctionLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + le16_t bcdCDC; +} usb_cdc_hdr_desc_t; + +typedef struct { + uint8_t bFunctionLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bmCapabilities; + uint8_t bDataInterface; +} usb_cdc_call_mgmt_desc_t; + +typedef struct { + uint8_t bFunctionLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bmCapabilities; +} usb_cdc_acm_desc_t; + +typedef struct { + uint8_t bFunctionLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bMasterInterface; + uint8_t bSlaveInterface0; +} usb_cdc_union_desc_t; + +typedef struct { + usb_association_desc_t iaface; + usb_iface_desc_t iface_c; + usb_cdc_hdr_desc_t fd; + usb_cdc_call_mgmt_desc_t mfd; + usb_cdc_acm_desc_t acmd; + usb_cdc_union_desc_t ufd; + usb_ep_desc_t ep_c; + usb_iface_desc_t iface_d; + usb_ep_desc_t ep_tx; + usb_ep_desc_t ep_rx; +} udi_cdc_desc_t; + +#define CDC_DESCRIPTOR {\ + .iaface.bLength = sizeof(usb_association_desc_t),\ + .iaface.bDescriptorType = USB_DT_IAD,\ + .iaface.bFirstInterface = CDC_STATUS_INTERFACE,\ + .iaface.bInterfaceCount = 2,\ + .iaface.bFunctionClass = CDC_CLASS_DEVICE,\ + .iaface.bFunctionSubClass = CDC_SUBCLASS_ACM,\ + .iaface.bFunctionProtocol = CDC_PROTOCOL_V25TER,\ + .iaface.iFunction = 0,\ + .iface_c.bLength = sizeof(usb_iface_desc_t),\ + .iface_c.bDescriptorType = USB_DT_INTERFACE,\ + .iface_c.bInterfaceNumber = CDC_STATUS_INTERFACE,\ + .iface_c.bAlternateSetting = 0,\ + .iface_c.bNumEndpoints = 1,\ + .iface_c.bInterfaceClass = 0x02,\ + .iface_c.bInterfaceSubClass = 0x02,\ + .iface_c.bInterfaceProtocol = CDC_PROTOCOL_V25TER,\ + .iface_c.iInterface = 0,\ + .fd.bFunctionLength = sizeof(usb_cdc_hdr_desc_t),\ + .fd.bDescriptorType = CDC_CS_INTERFACE,\ + .fd.bDescriptorSubtype = CDC_SCS_HEADER,\ + .fd.bcdCDC = 0x0110,\ + .mfd.bFunctionLength = sizeof(usb_cdc_call_mgmt_desc_t),\ + .mfd.bDescriptorType = CDC_CS_INTERFACE,\ + .mfd.bDescriptorSubtype = CDC_SCS_CALL_MGMT,\ + .mfd.bmCapabilities = CDC_CALL_MGMT_SUPPORTED,\ + .mfd.bDataInterface = CDC_DATA_INTERFACE,\ + .acmd.bFunctionLength = sizeof(usb_cdc_acm_desc_t),\ + .acmd.bDescriptorType = CDC_CS_INTERFACE,\ + .acmd.bDescriptorSubtype = CDC_SCS_ACM,\ + .acmd.bmCapabilities = CDC_ACM_SUPPORT_LINE_REQUESTS,\ + .ufd.bFunctionLength = sizeof(usb_cdc_union_desc_t),\ + .ufd.bDescriptorType = CDC_CS_INTERFACE,\ + .ufd.bDescriptorSubtype = CDC_SCS_UNION,\ + .ufd.bMasterInterface = CDC_STATUS_INTERFACE,\ + .ufd.bSlaveInterface0 = CDC_DATA_INTERFACE,\ + .ep_c.bLength = sizeof(usb_ep_desc_t),\ + .ep_c.bDescriptorType = USB_DT_ENDPOINT,\ + .ep_c.bEndpointAddress = CDC_ACM_ENDPOINT | USB_EP_DIR_IN,\ + .ep_c.bmAttributes = USB_EP_TYPE_INTERRUPT,\ + .ep_c.wMaxPacketSize = LE16(CDC_ACM_SIZE),\ + .ep_c.bInterval = CDC_EP_INTERVAL_STATUS,\ + .iface_d.bLength = sizeof(usb_iface_desc_t),\ + .iface_d.bDescriptorType = USB_DT_INTERFACE,\ + .iface_d.bInterfaceNumber = CDC_DATA_INTERFACE,\ + .iface_d.bAlternateSetting = 0,\ + .iface_d.bNumEndpoints = 2,\ + .iface_d.bInterfaceClass = CDC_CLASS_DATA,\ + .iface_d.bInterfaceSubClass = 0,\ + .iface_d.bInterfaceProtocol = 0,\ + .iface_d.iInterface = 0,\ + .ep_rx.bLength = sizeof(usb_ep_desc_t),\ + .ep_rx.bDescriptorType = USB_DT_ENDPOINT,\ + .ep_rx.bEndpointAddress = CDC_RX_ENDPOINT | USB_EP_DIR_OUT,\ + .ep_rx.bmAttributes = USB_EP_TYPE_BULK,\ + .ep_rx.wMaxPacketSize = LE16(CDC_RX_SIZE),\ + .ep_rx.bInterval = CDC_EP_INTERVAL_DATA,\ + .ep_tx.bLength = sizeof(usb_ep_desc_t),\ + .ep_tx.bDescriptorType = USB_DT_ENDPOINT,\ + .ep_tx.bEndpointAddress = CDC_TX_ENDPOINT | USB_EP_DIR_IN,\ + .ep_tx.bmAttributes = USB_EP_TYPE_BULK,\ + .ep_tx.wMaxPacketSize = LE16(CDC_TX_SIZE),\ + .ep_tx.bInterval = CDC_EP_INTERVAL_DATA,\ +} + +COMPILER_PACK_RESET() + +#endif //CDC + +// ********************************************************************** +// CONFIGURATION Descriptor structure and content +// ********************************************************************** +COMPILER_PACK_SET(1) + +typedef struct { + usb_conf_desc_t conf; +#ifdef KBD + udi_hid_kbd_desc_t hid_kbd; +#endif +#ifdef MOU + udi_hid_mou_desc_t hid_mou; +#endif +#ifdef EXK + udi_hid_exk_desc_t hid_exk; +#endif +#ifdef RAW + udi_hid_raw_desc_t hid_raw; +#endif +#ifdef CON + udi_hid_con_desc_t hid_con; +#endif +#ifdef NKRO + udi_hid_nkro_desc_t hid_nkro; +#endif +#ifdef MIDI + udi_hid_midi_desc_t hid_midi; +#endif +#ifdef CDC + udi_cdc_desc_t cdc_serial; +#endif +} udc_desc_t; + +COMPILER_PACK_RESET() + +#endif //_UDI_DEVICE_CONF_H_ diff --git a/tmk_core/protocol/arm_atsam/usb/udi_device_epsize.h b/tmk_core/protocol/arm_atsam/usb/udi_device_epsize.h new file mode 100644 index 000000000..96d03c286 --- /dev/null +++ b/tmk_core/protocol/arm_atsam/usb/udi_device_epsize.h @@ -0,0 +1,32 @@ +/* +Copyright 2018 Massdrop Inc. + +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 . +*/ + +#ifndef _UDI_DEVICE_EPSIZE_H_ +#define _UDI_DEVICE_EPSIZE_H_ + +#define KEYBOARD_EPSIZE 8 +#define MOUSE_EPSIZE 8 +#define EXTRAKEY_EPSIZE 8 +#define RAW_EPSIZE 64 +#define CONSOLE_EPSIZE 32 +#define NKRO_EPSIZE 32 +#define MIDI_STREAM_EPSIZE 64 +#define CDC_NOTIFICATION_EPSIZE 8 +#define CDC_EPSIZE 16 + +#endif //_UDI_DEVICE_EPSIZE_H_ + diff --git a/tmk_core/protocol/arm_atsam/usb/udi_hid.c b/tmk_core/protocol/arm_atsam/usb/udi_hid.c new file mode 100644 index 000000000..131b7a0ec --- /dev/null +++ b/tmk_core/protocol/arm_atsam/usb/udi_hid.c @@ -0,0 +1,162 @@ +/** + * \file + * + * \brief USB Device Human Interface Device (HID) interface. + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#include "conf_usb.h" +#include "usb_protocol.h" +#include "udd.h" +#include "udc.h" +#include "udi_hid.h" + + +/** + * \ingroup udi_hid_group + * \defgroup udi_hid_group_internal Implementation of HID common library + * @{ + */ + +/** + * \brief Send the specific descriptors requested by SETUP request + * + * \retval true if the descriptor is supported + */ +static bool udi_hid_reqstdifaceget_descriptor(uint8_t *report_desc); + +bool udi_hid_setup( uint8_t *rate, uint8_t *protocol, uint8_t *report_desc, bool (*setup_report)(void) ) +{ + if (Udd_setup_is_in()) { + // Requests Interface GET + if (Udd_setup_type() == USB_REQ_TYPE_STANDARD) { + // Requests Standard Interface Get + switch (udd_g_ctrlreq.req.bRequest) { + + case USB_REQ_GET_DESCRIPTOR: + return udi_hid_reqstdifaceget_descriptor(report_desc); + } + } + if (Udd_setup_type() == USB_REQ_TYPE_CLASS) { + // Requests Class Interface Get + switch (udd_g_ctrlreq.req.bRequest) { + + case USB_REQ_HID_GET_REPORT: + return setup_report(); + + case USB_REQ_HID_GET_IDLE: + udd_g_ctrlreq.payload = rate; + udd_g_ctrlreq.payload_size = 1; + return true; + + case USB_REQ_HID_GET_PROTOCOL: + udd_g_ctrlreq.payload = protocol; + udd_g_ctrlreq.payload_size = 1; + return true; + } + } + } + if (Udd_setup_is_out()) { + // Requests Interface SET + if (Udd_setup_type() == USB_REQ_TYPE_CLASS) { + // Requests Class Interface Set + switch (udd_g_ctrlreq.req.bRequest) { + + case USB_REQ_HID_SET_REPORT: + return setup_report(); + + case USB_REQ_HID_SET_IDLE: + *rate = udd_g_ctrlreq.req.wValue >> 8; + return true; + + case USB_REQ_HID_SET_PROTOCOL: + if (0 != udd_g_ctrlreq.req.wLength) + return false; + *protocol = udd_g_ctrlreq.req.wValue; + return true; + } + } + } + return false; // Request not supported +} + +//--------------------------------------------- +//------- Internal routines + +static bool udi_hid_reqstdifaceget_descriptor(uint8_t *report_desc) +{ + usb_hid_descriptor_t UDC_DESC_STORAGE *ptr_hid_desc; + + // Get the USB descriptor which is located after the interface descriptor + // This descriptor must be the HID descriptor + ptr_hid_desc = (usb_hid_descriptor_t UDC_DESC_STORAGE *) ((uint8_t *) + udc_get_interface_desc() + sizeof(usb_iface_desc_t)); + if (USB_DT_HID != ptr_hid_desc->bDescriptorType) + return false; + + // The SETUP request can ask for: + // - an USB_DT_HID descriptor + // - or USB_DT_HID_REPORT descriptor + // - or USB_DT_HID_PHYSICAL descriptor + if (USB_DT_HID == (uint8_t) (udd_g_ctrlreq.req.wValue >> 8)) { + // USB_DT_HID descriptor requested then send it + udd_g_ctrlreq.payload = (uint8_t *) ptr_hid_desc; + udd_g_ctrlreq.payload_size = + min(udd_g_ctrlreq.req.wLength, + ptr_hid_desc->bLength); + return true; + } + // The HID_X descriptor requested must correspond to report type + // included in the HID descriptor + if (ptr_hid_desc->bRDescriptorType == + (uint8_t) (udd_g_ctrlreq.req.wValue >> 8)) { + // Send HID Report descriptor given by high level + udd_g_ctrlreq.payload = report_desc; + udd_g_ctrlreq.payload_size = + min(udd_g_ctrlreq.req.wLength, + le16_to_cpu(ptr_hid_desc->wDescriptorLength)); + return true; + } + return false; +} + +//@} diff --git a/tmk_core/protocol/arm_atsam/usb/udi_hid.h b/tmk_core/protocol/arm_atsam/usb/udi_hid.h new file mode 100644 index 000000000..0edb09c1c --- /dev/null +++ b/tmk_core/protocol/arm_atsam/usb/udi_hid.h @@ -0,0 +1,85 @@ +/** + * \file + * + * \brief USB Device Human Interface Device (HID) interface definitions. + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _UDI_HID_H_ +#define _UDI_HID_H_ + +#include "conf_usb.h" +#include "usb_protocol.h" +#include "usb_protocol_hid.h" +#include "udd.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \ingroup udi_group + * \defgroup udi_hid_group USB Device Interface (UDI) for Human Interface Device (HID) + * + * Common library for all Human Interface Device (HID) implementation. + * + * @{ + */ + +/** + * \brief Decode HID setup request + * + * \param rate Pointer on rate of current HID interface + * \param protocol Pointer on protocol of current HID interface + * \param report_desc Pointer on report descriptor of current HID interface + * \param set_report Pointer on set_report callback of current HID interface + * + * \return \c 1 if function was successfully done, otherwise \c 0. + */ +bool udi_hid_setup( uint8_t *rate, uint8_t *protocol, uint8_t *report_desc, bool (*setup_report)(void) ); + +//@} + +#ifdef __cplusplus +} +#endif +#endif // _UDI_HID_H_ diff --git a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c new file mode 100644 index 000000000..18f69350c --- /dev/null +++ b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c @@ -0,0 +1,845 @@ +/** + * \file + * + * \brief USB Device Human Interface Device (HID) keyboard interface. + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#include "samd51j18a.h" +#include "conf_usb.h" +#include "usb_protocol.h" +#include "udd.h" +#include "udc.h" +#include "udi_device_conf.h" +#include "udi_hid.h" +#include "udi_hid_kbd.h" +#include + +//*************************************************************************** +// KBD +//*************************************************************************** +#ifdef KBD + +bool udi_hid_kbd_enable(void); +void udi_hid_kbd_disable(void); +bool udi_hid_kbd_setup(void); +uint8_t udi_hid_kbd_getsetting(void); + +UDC_DESC_STORAGE udi_api_t udi_api_hid_kbd = { + .enable = (bool(*)(void))udi_hid_kbd_enable, + .disable = (void (*)(void))udi_hid_kbd_disable, + .setup = (bool(*)(void))udi_hid_kbd_setup, + .getsetting = (uint8_t(*)(void))udi_hid_kbd_getsetting, + .sof_notify = NULL, +}; + +COMPILER_WORD_ALIGNED +static uint8_t udi_hid_kbd_rate; + +COMPILER_WORD_ALIGNED +static uint8_t udi_hid_kbd_protocol; + +COMPILER_WORD_ALIGNED +uint8_t udi_hid_kbd_report_set; + +bool udi_hid_kbd_b_report_valid; + +COMPILER_WORD_ALIGNED +uint8_t udi_hid_kbd_report[UDI_HID_KBD_REPORT_SIZE]; + +static bool udi_hid_kbd_b_report_trans_ongoing; + +COMPILER_WORD_ALIGNED +static uint8_t udi_hid_kbd_report_trans[UDI_HID_KBD_REPORT_SIZE]; + +COMPILER_WORD_ALIGNED +UDC_DESC_STORAGE udi_hid_kbd_report_desc_t udi_hid_kbd_report_desc = { + { + 0x05, 0x01, // Usage Page (Generic Desktop) + 0x09, 0x06, // Usage (Keyboard) + 0xA1, 0x01, // Collection (Application) + 0x05, 0x07, // Usage Page (Keyboard) + 0x19, 0xE0, // Usage Minimum (224) + 0x29, 0xE7, // Usage Maximum (231) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) + 0x75, 0x01, // Report Size (1) + 0x95, 0x08, // Report Count (8) + 0x81, 0x02, // Input (Data, Variable, Absolute) + 0x81, 0x01, // Input (Constant) + 0x19, 0x00, // Usage Minimum (0) + 0x29, 0x65, // Usage Maximum (101) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x65, // Logical Maximum (101) + 0x75, 0x08, // Report Size (8) + 0x95, 0x06, // Report Count (6) + 0x81, 0x00, // Input (Data, Array) + 0x05, 0x08, // Usage Page (LED) + 0x19, 0x01, // Usage Minimum (1) + 0x29, 0x05, // Usage Maximum (5) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) + 0x75, 0x01, // Report Size (1) + 0x95, 0x05, // Report Count (5) + 0x91, 0x02, // Output (Data, Variable, Absolute) + 0x95, 0x03, // Report Count (3) + 0x91, 0x01, // Output (Constant) + 0xC0 // End Collection + } +}; + +static bool udi_hid_kbd_setreport(void); + +static void udi_hid_kbd_report_sent(udd_ep_status_t status, iram_size_t nb_sent, udd_ep_id_t ep); + +static void udi_hid_kbd_setreport_valid(void); + +bool udi_hid_kbd_enable(void) +{ + // Initialize internal values + udi_hid_kbd_rate = 0; + udi_hid_kbd_protocol = 0; + udi_hid_kbd_b_report_trans_ongoing = false; + memset(udi_hid_kbd_report, 0, UDI_HID_KBD_REPORT_SIZE); + udi_hid_kbd_b_report_valid = false; + return UDI_HID_KBD_ENABLE_EXT(); +} + +void udi_hid_kbd_disable(void) +{ + UDI_HID_KBD_DISABLE_EXT(); +} + +bool udi_hid_kbd_setup(void) +{ + return udi_hid_setup(&udi_hid_kbd_rate, + &udi_hid_kbd_protocol, + (uint8_t *) &udi_hid_kbd_report_desc, + udi_hid_kbd_setreport); +} + +uint8_t udi_hid_kbd_getsetting(void) +{ + return 0; +} + +static bool udi_hid_kbd_setreport(void) +{ + if ((USB_HID_REPORT_TYPE_OUTPUT == (udd_g_ctrlreq.req.wValue >> 8)) + && (0 == (0xFF & udd_g_ctrlreq.req.wValue)) + && (1 == udd_g_ctrlreq.req.wLength)) { + // Report OUT type on report ID 0 from USB Host + udd_g_ctrlreq.payload = &udi_hid_kbd_report_set; + udd_g_ctrlreq.callback = udi_hid_kbd_setreport_valid; + udd_g_ctrlreq.payload_size = 1; + return true; + } + return false; +} + +bool udi_hid_kbd_send_report(void) +{ + if (!main_b_kbd_enable) { + return false; + } + + if (udi_hid_kbd_b_report_trans_ongoing) { + return false; + } + + memcpy(udi_hid_kbd_report_trans, udi_hid_kbd_report, + UDI_HID_KBD_REPORT_SIZE); + udi_hid_kbd_b_report_valid = false; + udi_hid_kbd_b_report_trans_ongoing = + udd_ep_run(UDI_HID_KBD_EP_IN | USB_EP_DIR_IN, + false, + udi_hid_kbd_report_trans, + UDI_HID_KBD_REPORT_SIZE, + udi_hid_kbd_report_sent); + + return udi_hid_kbd_b_report_trans_ongoing; +} + +static void udi_hid_kbd_report_sent(udd_ep_status_t status, iram_size_t nb_sent, udd_ep_id_t ep) +{ + UNUSED(status); + UNUSED(nb_sent); + UNUSED(ep); + udi_hid_kbd_b_report_trans_ongoing = false; + if (udi_hid_kbd_b_report_valid) { + udi_hid_kbd_send_report(); + } +} + +static void udi_hid_kbd_setreport_valid(void) +{ + //UDI_HID_KBD_CHANGE_LED(udi_hid_kbd_report_set); +} + +#endif //KBD + +//******************************************************************************************** +// NKRO Keyboard +//******************************************************************************************** +#ifdef NKRO + +bool udi_hid_nkro_enable(void); +void udi_hid_nkro_disable(void); +bool udi_hid_nkro_setup(void); +uint8_t udi_hid_nkro_getsetting(void); + +UDC_DESC_STORAGE udi_api_t udi_api_hid_nkro = { + .enable = (bool(*)(void))udi_hid_nkro_enable, + .disable = (void (*)(void))udi_hid_nkro_disable, + .setup = (bool(*)(void))udi_hid_nkro_setup, + .getsetting = (uint8_t(*)(void))udi_hid_nkro_getsetting, + .sof_notify = NULL, +}; + +COMPILER_WORD_ALIGNED +static uint8_t udi_hid_nkro_rate; + +COMPILER_WORD_ALIGNED +static uint8_t udi_hid_nkro_protocol; + +COMPILER_WORD_ALIGNED +uint8_t udi_hid_nkro_report_set; + +bool udi_hid_nkro_b_report_valid; + +COMPILER_WORD_ALIGNED +uint8_t udi_hid_nkro_report[UDI_HID_NKRO_REPORT_SIZE]; + +static bool udi_hid_nkro_b_report_trans_ongoing; + +COMPILER_WORD_ALIGNED +static uint8_t udi_hid_nkro_report_trans[UDI_HID_NKRO_REPORT_SIZE]; + +COMPILER_WORD_ALIGNED +UDC_DESC_STORAGE udi_hid_nkro_report_desc_t udi_hid_nkro_report_desc = { + { + 0x05, 0x01, // Usage Page (Generic Desktop), + 0x09, 0x06, // Usage (Keyboard), + 0xA1, 0x01, // Collection (Application) - Keyboard, + + //Mods + 0x75, 0x01, // Report Size (1), + 0x95, 0x08, // Report Count (8), + 0x15, 0x00, // Logical Minimum (0), + 0x25, 0x01, // Logical Maximum (1), + 0x05, 0x07, // Usage Page (Key Codes), + 0x19, 0xE0, // Usage Minimum (224), + 0x29, 0xE7, // Usage Maximum (231), + 0x81, 0x02, // Input (Data, Variable, Absolute), + + //LED Report + 0x75, 0x01, // Report Size (1), + 0x95, 0x05, // Report Count (5), + 0x05, 0x08, // Usage Page (LEDs), + 0x19, 0x01, // Usage Minimum (1), + 0x29, 0x05, // Usage Maximum (5), + 0x91, 0x02, // Output (Data, Variable, Absolute), + + //LED Report Padding + 0x75, 0x03, // Report Size (3), + 0x95, 0x01, // Report Count (1), + 0x91, 0x03, // Output (Constant), + + //Main keys + 0x75, 0x01, // Report Size (1), + 0x95, 0xF8, // Report Count (248), + 0x15, 0x00, // Logical Minimum (0), + 0x25, 0x01, // Logical Maximum (1), + 0x05, 0x07, // Usage Page (Key Codes), + 0x19, 0x00, // Usage Minimum (0), + 0x29, 0xF7, // Usage Maximum (247), + 0x81, 0x02, // Input (Data, Variable, Absolute, Bitfield), + 0xc0, // End Collection - Keyboard + } +}; + +static bool udi_hid_nkro_setreport(void); +static void udi_hid_nkro_setreport_valid(void); +static void udi_hid_nkro_report_sent(udd_ep_status_t status, iram_size_t nb_sent, udd_ep_id_t ep); + +bool udi_hid_nkro_enable(void) +{ + // Initialize internal values + udi_hid_nkro_rate = 0; + udi_hid_nkro_protocol = 0; + udi_hid_nkro_b_report_trans_ongoing = false; + memset(udi_hid_nkro_report, 0, UDI_HID_NKRO_REPORT_SIZE); + udi_hid_nkro_b_report_valid = false; + return UDI_HID_NKRO_ENABLE_EXT(); +} + +void udi_hid_nkro_disable(void) +{ + UDI_HID_NKRO_DISABLE_EXT(); +} + +bool udi_hid_nkro_setup(void) +{ + return udi_hid_setup(&udi_hid_nkro_rate, + &udi_hid_nkro_protocol, + (uint8_t *) &udi_hid_nkro_report_desc, + udi_hid_nkro_setreport); +} + +uint8_t udi_hid_nkro_getsetting(void) +{ + return 0; +} + +//keyboard receives LED report here +static bool udi_hid_nkro_setreport(void) +{ + if ((USB_HID_REPORT_TYPE_OUTPUT == (udd_g_ctrlreq.req.wValue >> 8)) + && (0 == (0xFF & udd_g_ctrlreq.req.wValue)) + && (1 == udd_g_ctrlreq.req.wLength)) { + // Report OUT type on report ID 0 from USB Host + udd_g_ctrlreq.payload = &udi_hid_nkro_report_set; + udd_g_ctrlreq.callback = udi_hid_nkro_setreport_valid; //must call routine to transform setreport to LED state + udd_g_ctrlreq.payload_size = 1; + return true; + } + return false; +} + +bool udi_hid_nkro_send_report(void) +{ + if (!main_b_nkro_enable) { + return false; + } + + if (udi_hid_nkro_b_report_trans_ongoing) { + return false; + } + + memcpy(udi_hid_nkro_report_trans, udi_hid_nkro_report,UDI_HID_NKRO_REPORT_SIZE); + udi_hid_nkro_b_report_valid = false; + udi_hid_nkro_b_report_trans_ongoing = + udd_ep_run(UDI_HID_NKRO_EP_IN | USB_EP_DIR_IN, + false, + udi_hid_nkro_report_trans, + UDI_HID_NKRO_REPORT_SIZE, + udi_hid_nkro_report_sent); + + return udi_hid_nkro_b_report_trans_ongoing; +} + +static void udi_hid_nkro_report_sent(udd_ep_status_t status, iram_size_t nb_sent, udd_ep_id_t ep) +{ + UNUSED(status); + UNUSED(nb_sent); + UNUSED(ep); + udi_hid_nkro_b_report_trans_ongoing = false; + if (udi_hid_nkro_b_report_valid) { + udi_hid_nkro_send_report(); + } +} + +static void udi_hid_nkro_setreport_valid(void) +{ + //UDI_HID_NKRO_CHANGE_LED(udi_hid_nkro_report_set); +} + +#endif //NKRO + +//******************************************************************************************** +// EXK (extra-keys) SYS-CTRL Keyboard +//******************************************************************************************** +#ifdef EXK + +bool udi_hid_exk_enable(void); +void udi_hid_exk_disable(void); +bool udi_hid_exk_setup(void); +uint8_t udi_hid_exk_getsetting(void); + +UDC_DESC_STORAGE udi_api_t udi_api_hid_exk = { + .enable = (bool(*)(void))udi_hid_exk_enable, + .disable = (void (*)(void))udi_hid_exk_disable, + .setup = (bool(*)(void))udi_hid_exk_setup, + .getsetting = (uint8_t(*)(void))udi_hid_exk_getsetting, + .sof_notify = NULL, +}; + +COMPILER_WORD_ALIGNED +static uint8_t udi_hid_exk_rate; + +COMPILER_WORD_ALIGNED +static uint8_t udi_hid_exk_protocol; + +COMPILER_WORD_ALIGNED +uint8_t udi_hid_exk_report_set; + +bool udi_hid_exk_b_report_valid; + +COMPILER_WORD_ALIGNED +udi_hid_exk_report_t udi_hid_exk_report; + +static bool udi_hid_exk_b_report_trans_ongoing; + +COMPILER_WORD_ALIGNED +static uint8_t udi_hid_exk_report_trans[UDI_HID_EXK_REPORT_SIZE]; + +COMPILER_WORD_ALIGNED +UDC_DESC_STORAGE udi_hid_exk_report_desc_t udi_hid_exk_report_desc = { + { + // System Control Collection (8 bits) + + 0x05, 0x01, // Usage Page (Generic Desktop), + 0x09, 0x80, // Usage (System Control), + 0xA1, 0x01, // Collection (Application), + 0x85, 0x02, // Report ID (2) (System), + 0x16, 0x01, 0x00, // Logical Minimum (1), + 0x26, 0x03, 0x00, // Logical Maximum (3), + 0x1A, 0x81, 0x00, // Usage Minimum (81) (System Power Down), + 0x2A, 0x83, 0x00, // Usage Maximum (83) (System Wake Up), + 0x75, 0x10, // Report Size (16), + 0x95, 0x01, // Report Count (1), + 0x81, 0x00, // Input (Data, Array), + 0xC0, // End Collection - System Control + + // Consumer Control Collection - Media Keys (16 bits) + + 0x05, 0x0C, // Usage Page (Consumer), + 0x09, 0x01, // Usage (Consumer Control), + 0xA1, 0x01, // Collection (Application), + 0x85, 0x03, // Report ID (3) (Consumer), + 0x16, 0x01, 0x00, // Logical Minimum (1), + 0x26, 0x9C, 0x02, // Logical Maximum (668), + 0x1A, 0x01, 0x00, // Usage Minimum (1), + 0x2A, 0x9C, 0x02, // Usage Maximum (668), + 0x75, 0x10, // Report Size (16), + 0x95, 0x01, // Report Count (1), + 0x81, 0x00, // Input (Data, Array), + 0xC0, // End Collection - Consumer Control + } +}; + +static bool udi_hid_exk_setreport(void); + +static void udi_hid_exk_report_sent(udd_ep_status_t status, iram_size_t nb_sent, udd_ep_id_t ep); + +static void udi_hid_exk_setreport_valid(void); + +bool udi_hid_exk_enable(void) +{ + // Initialize internal values + udi_hid_exk_rate = 0; + udi_hid_exk_protocol = 0; + udi_hid_exk_b_report_trans_ongoing = false; + memset(udi_hid_exk_report.raw, 0, UDI_HID_EXK_REPORT_SIZE); + udi_hid_exk_b_report_valid = false; + return UDI_HID_EXK_ENABLE_EXT(); +} + +void udi_hid_exk_disable(void) +{ + UDI_HID_EXK_DISABLE_EXT(); +} + +bool udi_hid_exk_setup(void) +{ + return udi_hid_setup(&udi_hid_exk_rate, + &udi_hid_exk_protocol, + (uint8_t *) &udi_hid_exk_report_desc, + udi_hid_exk_setreport); +} + +uint8_t udi_hid_exk_getsetting(void) +{ + return 0; +} + +static bool udi_hid_exk_setreport(void) +{ + if ((USB_HID_REPORT_TYPE_OUTPUT == (udd_g_ctrlreq.req.wValue >> 8)) + && (0 == (0xFF & udd_g_ctrlreq.req.wValue)) + && (1 == udd_g_ctrlreq.req.wLength)) { + // Report OUT type on report ID 0 from USB Host + udd_g_ctrlreq.payload = &udi_hid_exk_report_set; + udd_g_ctrlreq.callback = udi_hid_exk_setreport_valid; + udd_g_ctrlreq.payload_size = 1; + return true; + } + return false; +} + +bool udi_hid_exk_send_report(void) +{ + if (!main_b_exk_enable) { + return false; + } + + if (udi_hid_exk_b_report_trans_ongoing) { + return false; + } + + memcpy(udi_hid_exk_report_trans, udi_hid_exk_report.raw, UDI_HID_EXK_REPORT_SIZE); + udi_hid_exk_b_report_valid = false; + udi_hid_exk_b_report_trans_ongoing = + udd_ep_run(UDI_HID_EXK_EP_IN | USB_EP_DIR_IN, + false, + udi_hid_exk_report_trans, + UDI_HID_EXK_REPORT_SIZE, + udi_hid_exk_report_sent); + + return udi_hid_exk_b_report_trans_ongoing; +} + +static void udi_hid_exk_report_sent(udd_ep_status_t status, iram_size_t nb_sent, udd_ep_id_t ep) +{ + UNUSED(status); + UNUSED(nb_sent); + UNUSED(ep); + udi_hid_exk_b_report_trans_ongoing = false; + if (udi_hid_exk_b_report_valid) { + udi_hid_exk_send_report(); + } +} + +static void udi_hid_exk_setreport_valid(void) +{ + +} + +#endif //EXK + +//******************************************************************************************** +// MOU Mouse +//******************************************************************************************** +#ifdef MOU + +bool udi_hid_mou_enable(void); +void udi_hid_mou_disable(void); +bool udi_hid_mou_setup(void); +uint8_t udi_hid_mou_getsetting(void); + +UDC_DESC_STORAGE udi_api_t udi_api_hid_mou = { + .enable = (bool(*)(void))udi_hid_mou_enable, + .disable = (void (*)(void))udi_hid_mou_disable, + .setup = (bool(*)(void))udi_hid_mou_setup, + .getsetting = (uint8_t(*)(void))udi_hid_mou_getsetting, + .sof_notify = NULL, +}; + +COMPILER_WORD_ALIGNED +static uint8_t udi_hid_mou_rate; + +COMPILER_WORD_ALIGNED +static uint8_t udi_hid_mou_protocol; + +//COMPILER_WORD_ALIGNED +//uint8_t udi_hid_mou_report_set; //No set report + +bool udi_hid_mou_b_report_valid; + +COMPILER_WORD_ALIGNED +uint8_t udi_hid_mou_report[UDI_HID_MOU_REPORT_SIZE]; + +static bool udi_hid_mou_b_report_trans_ongoing; + +COMPILER_WORD_ALIGNED +static uint8_t udi_hid_mou_report_trans[UDI_HID_MOU_REPORT_SIZE]; + +COMPILER_WORD_ALIGNED +UDC_DESC_STORAGE udi_hid_mou_report_desc_t udi_hid_mou_report_desc = { + { + 0x05, 0x01, // Usage Page (Generic Desktop), + 0x09, 0x02, // Usage (Mouse), + 0xA1, 0x01, // Collection (Application), + 0x09, 0x01, // Usage (Pointer), + 0xA1, 0x00, // Collection (Physical), + 0x05, 0x09, // Usage Page (Buttons), + 0x19, 0x01, // Usage Minimum (01), + 0x29, 0x05, // Usage Maximun (05), + 0x15, 0x00, // Logical Minimum (0), + 0x25, 0x01, // Logical Maximum (1), + 0x95, 0x05, // Report Count (5), + 0x75, 0x01, // Report Size (1), + 0x81, 0x02, // Input (Data, Variable, Absolute), ;5 button bits + 0x95, 0x01, // Report Count (1), + 0x75, 0x03, // Report Size (3), + 0x81, 0x01, // Input (Constant), ;3 bit padding, + + 0x05, 0x01, // Usage Page (Generic Desktop), + 0x09, 0x30, // Usage (X), + 0x09, 0x31, // Usage (Y), + 0x15, 0x81, // Logical Minimum (-127), + 0x25, 0x7F, // Logical Maximum (127), + 0x95, 0x02, // Report Count (2), + 0x75, 0x08, // Report Size (8), + 0x81, 0x06, // Input (Data, Variable, Relative), ;2 position bytes (X & Y), + + 0x09, 0x38, // Usage (Wheel), + 0x15, 0x81, // Logical Minimum (-127), + 0x25, 0x7F, // Logical Maximum (127), + 0x95, 0x01, // Report Count (1), + 0x75, 0x08, // Report Size (8), + 0x81, 0x06, // Input (Data, Variable, Relative), + + 0x05, 0x0C, // Usage Page (Consumer), + 0x0A, 0x38, 0x02, // Usage (AC Pan (Horizontal wheel)), + 0x15, 0x81, // Logical Minimum (-127), + 0x25, 0x7F, // Logical Maximum (127), + 0x95, 0x01, // Report Count (1), + 0x75, 0x08, // Report Size (8), + 0x81, 0x06, // Input (Data, Variable, Relative), + + 0xC0, // End Collection, + 0xC0, // End Collection + } +}; + +static void udi_hid_mou_report_sent(udd_ep_status_t status, iram_size_t nb_sent, udd_ep_id_t ep); + +bool udi_hid_mou_enable(void) +{ + // Initialize internal values + udi_hid_mou_rate = 0; + udi_hid_mou_protocol = 0; + udi_hid_mou_b_report_trans_ongoing = false; + memset(udi_hid_mou_report, 0, UDI_HID_MOU_REPORT_SIZE); + udi_hid_mou_b_report_valid = false; + return UDI_HID_MOU_ENABLE_EXT(); +} + +void udi_hid_mou_disable(void) +{ + UDI_HID_MOU_DISABLE_EXT(); +} + +bool udi_hid_mou_setup(void) +{ + return udi_hid_setup(&udi_hid_mou_rate, + &udi_hid_mou_protocol, + (uint8_t *) &udi_hid_mou_report_desc, + NULL); +} + +uint8_t udi_hid_mou_getsetting(void) +{ + return 0; +} + +bool udi_hid_mou_send_report(void) +{ + if (!main_b_mou_enable) { + return false; + } + + if (udi_hid_mou_b_report_trans_ongoing) { + return false; + } + + memcpy(udi_hid_mou_report_trans, udi_hid_mou_report, UDI_HID_MOU_REPORT_SIZE); + udi_hid_mou_b_report_valid = false; + udi_hid_mou_b_report_trans_ongoing = + udd_ep_run(UDI_HID_MOU_EP_IN | USB_EP_DIR_IN, + false, + udi_hid_mou_report_trans, + UDI_HID_MOU_REPORT_SIZE, + udi_hid_mou_report_sent); + + return udi_hid_mou_b_report_trans_ongoing; +} + +static void udi_hid_mou_report_sent(udd_ep_status_t status, iram_size_t nb_sent, udd_ep_id_t ep) +{ + UNUSED(status); + UNUSED(nb_sent); + UNUSED(ep); + udi_hid_mou_b_report_trans_ongoing = false; + if (udi_hid_mou_b_report_valid) { + udi_hid_mou_send_report(); + } +} + +#endif //MOU + +//******************************************************************************************** +// RAW +//******************************************************************************************** +#ifdef RAW + +bool udi_hid_raw_enable(void); +void udi_hid_raw_disable(void); +bool udi_hid_raw_setup(void); +uint8_t udi_hid_raw_getsetting(void); + +UDC_DESC_STORAGE udi_api_t udi_api_hid_raw = { + .enable = (bool(*)(void))udi_hid_raw_enable, + .disable = (void (*)(void))udi_hid_raw_disable, + .setup = (bool(*)(void))udi_hid_raw_setup, + .getsetting = (uint8_t(*)(void))udi_hid_raw_getsetting, + .sof_notify = NULL, +}; + +COMPILER_WORD_ALIGNED +static uint8_t udi_hid_raw_rate; + +COMPILER_WORD_ALIGNED +static uint8_t udi_hid_raw_protocol; + +COMPILER_WORD_ALIGNED +uint8_t udi_hid_raw_report_set[UDI_HID_RAW_REPORT_SIZE]; + +static bool udi_hid_raw_b_report_valid; + +COMPILER_WORD_ALIGNED +uint8_t udi_hid_raw_report[UDI_HID_RAW_REPORT_SIZE]; + +static bool udi_hid_raw_b_report_trans_ongoing; + +COMPILER_WORD_ALIGNED +static uint8_t udi_hid_raw_report_trans[UDI_HID_RAW_REPORT_SIZE]; + +COMPILER_WORD_ALIGNED +UDC_DESC_STORAGE udi_hid_raw_report_desc_t udi_hid_raw_report_desc = { + { + 0x06, // Usage Page (Vendor Defined) + 0xFF, 0xFF, + 0x0A, // Usage (Mouse) + 0xFF, 0xFF, + 0xA1, 0x01, // Collection (Application) + 0x75, 0x08, // Report Size (8) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0xFF, // Logical Maximum (255) + 0x95, 0x40, // Report Count + 0x09, 0x01, // Usage (Input) + 0x81, 0x02, // Input (Data + 0x95, 0x40, // Report Count + 0x09, 0x02, // Usage (Output) + 0x91, 0x02, // Output (Data + 0xC0, // End Collection - Consumer Control + } +}; + +static bool udi_hid_raw_setreport(void); +static void udi_hid_raw_setreport_valid(void); + +static void udi_hid_raw_report_sent(udd_ep_status_t status, iram_size_t nb_sent, udd_ep_id_t ep); + +bool udi_hid_raw_enable(void) +{ + // Initialize internal values + udi_hid_raw_rate = 0; + udi_hid_raw_protocol = 0; + udi_hid_raw_b_report_trans_ongoing = false; + memset(udi_hid_raw_report, 0, UDI_HID_RAW_REPORT_SIZE); + udi_hid_raw_b_report_valid = false; + return UDI_HID_RAW_ENABLE_EXT(); +} + +void udi_hid_raw_disable(void) +{ + UDI_HID_RAW_DISABLE_EXT(); +} + +bool udi_hid_raw_setup(void) +{ + return udi_hid_setup(&udi_hid_raw_rate, + &udi_hid_raw_protocol, + (uint8_t *) &udi_hid_raw_report_desc, + udi_hid_raw_setreport); +} + +uint8_t udi_hid_raw_getsetting(void) +{ + return 0; +} + +static bool udi_hid_raw_setreport(void) +{ + if ((USB_HID_REPORT_TYPE_OUTPUT == (udd_g_ctrlreq.req.wValue >> 8)) + && (0 == (0xFF & udd_g_ctrlreq.req.wValue)) + && (UDI_HID_RAW_REPORT_SIZE == udd_g_ctrlreq.req.wLength)) { + // Report OUT type on report ID 0 from USB Host + udd_g_ctrlreq.payload = udi_hid_raw_report_set; + udd_g_ctrlreq.callback = udi_hid_raw_setreport_valid; //must call routine to transform setreport to LED state + udd_g_ctrlreq.payload_size = UDI_HID_RAW_REPORT_SIZE; + return true; + } + return false; +} + +bool udi_hid_raw_send_report(void) +{ + if (!main_b_raw_enable) { + return false; + } + + if (udi_hid_raw_b_report_trans_ongoing) { + return false; + } + + memcpy(udi_hid_raw_report_trans, udi_hid_raw_report,UDI_HID_RAW_REPORT_SIZE); + udi_hid_raw_b_report_valid = false; + udi_hid_raw_b_report_trans_ongoing = + udd_ep_run(UDI_HID_RAW_EP_IN | USB_EP_DIR_IN, + false, + udi_hid_raw_report_trans, + UDI_HID_RAW_REPORT_SIZE, + udi_hid_raw_report_sent); + + return udi_hid_raw_b_report_trans_ongoing; +} + +static void udi_hid_raw_report_sent(udd_ep_status_t status, iram_size_t nb_sent, udd_ep_id_t ep) +{ + UNUSED(status); + UNUSED(nb_sent); + UNUSED(ep); + udi_hid_raw_b_report_trans_ongoing = false; + if (udi_hid_raw_b_report_valid) { + udi_hid_raw_send_report(); + } +} + +static void udi_hid_raw_setreport_valid(void) +{ + +} + +#endif //RAW diff --git a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h new file mode 100644 index 000000000..9a2741534 --- /dev/null +++ b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h @@ -0,0 +1,109 @@ +/** + * \file + * + * \brief USB Device Human Interface Device (HID) keyboard interface. + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _UDC_HID_KBD_H_ +#define _UDC_HID_KBD_H_ + +#include "udc_desc.h" +#include "udi.h" + +#ifdef __cplusplus +extern "C" { +#endif + +//****************************************************************************** +// Keyboard interface definitions +//****************************************************************************** +#ifdef KBD +extern UDC_DESC_STORAGE udi_api_t udi_api_hid_kbd; +extern bool udi_hid_kbd_b_report_valid; +extern uint8_t udi_hid_kbd_report_set; +bool udi_hid_kbd_send_report(void); +#endif //KBD + +//******************************************************************************************** +// NKRO Keyboard +//******************************************************************************************** +#ifdef NKRO +extern UDC_DESC_STORAGE udi_api_t udi_api_hid_nkro; +extern bool udi_hid_nkro_b_report_valid; +bool udi_hid_nkro_send_report(void); +#endif //NKRO + +//******************************************************************************************** +// SYS-CTRL interface +//******************************************************************************************** +#ifdef EXK +extern UDC_DESC_STORAGE udi_api_t udi_api_hid_exk; +extern bool udi_hid_exk_b_report_valid; +extern uint8_t udi_hid_exk_report_set; +bool udi_hid_exk_send_report(void); +#endif //EXK + +//******************************************************************************************** +// MOU Mouse +//******************************************************************************************** +#ifdef MOU +extern UDC_DESC_STORAGE udi_api_t udi_api_hid_mou; +extern bool udi_hid_mou_b_report_valid; +bool udi_hid_mou_send_report(void); +#endif //MOU + +//******************************************************************************************** +// RAW Raw +//******************************************************************************************** +#ifdef RAW +extern UDC_DESC_STORAGE udi_api_t udi_api_hid_raw; +bool udi_hid_raw_send_report(void); +#endif //RAW + +//@} + +#ifdef __cplusplus +} +#endif + +#endif // _UDC_HID_KBD_H_ diff --git a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd_conf.h b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd_conf.h new file mode 100644 index 000000000..db5db17ed --- /dev/null +++ b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd_conf.h @@ -0,0 +1,60 @@ +/** + * \file + * + * \brief Default HID keyboard configuration for a USB Device + * with a single interface HID keyboard + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _UDI_HID_KBD_CONF_H_ +#define _UDI_HID_KBD_CONF_H_ + +/** + * \addtogroup udi_hid_keyboard_group_single_desc + * @{ + */ + +#include "udi_device_conf.h" + +#include "udi_hid_kbd.h" + +#endif // _UDI_HID_KBD_CONF_H_ diff --git a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd_desc.c b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd_desc.c new file mode 100644 index 000000000..16bd4e514 --- /dev/null +++ b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd_desc.c @@ -0,0 +1,179 @@ +/** + * \file + * + * \brief Default descriptors for a USB Device + * with a single interface HID keyboard + * + * Copyright (c) 2009-2016 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#include "conf_usb.h" +#include "usb_protocol.h" +#include "udc_desc.h" +#include "udi_device_conf.h" +#include "udi_hid_kbd.h" +#include "udi_cdc.h" + +/** + * \ingroup udi_hid_keyboard_group + * \defgroup udi_hid_keyboard_group_single_desc USB device descriptors for a single interface + * + * The following structures provide the USB device descriptors required + * for USB Device with a single interface HID keyboard. + * + * It is ready to use and do not require more definition. + * @{ + */ + +//! USB Device Descriptor +COMPILER_WORD_ALIGNED +UDC_DESC_STORAGE usb_dev_desc_t udc_device_desc = { + .bLength = sizeof(usb_dev_desc_t), + .bDescriptorType = USB_DT_DEVICE, + .bcdUSB = LE16(USB_V2_0), + .bDeviceClass = DEVICE_CLASS, + .bDeviceSubClass = DEVICE_SUBCLASS, + .bDeviceProtocol = DEVICE_PROTOCOL, + .bMaxPacketSize0 = USB_DEVICE_EP_CTRL_SIZE, + .idVendor = LE16(USB_DEVICE_VENDOR_ID), + .idProduct = LE16(USB_DEVICE_PRODUCT_ID), + .bcdDevice = LE16(USB_DEVICE_VERSION), +#ifdef USB_DEVICE_MANUFACTURE_NAME + .iManufacturer = 1, +#else + .iManufacturer = 0, // No manufacture string +#endif +#ifdef USB_DEVICE_PRODUCT_NAME + .iProduct = 2, +#else + .iProduct = 0, // No product string +#endif +#if (defined USB_DEVICE_SERIAL_NAME || defined USB_DEVICE_GET_SERIAL_NAME_POINTER) + .iSerialNumber = 3, +#else + .iSerialNumber = 0, // No serial string +#endif + .bNumConfigurations = 1 +}; + +#if 0 +#ifdef USB_DEVICE_HS_SUPPORT +//! USB Device Qualifier Descriptor for HS +COMPILER_WORD_ALIGNED +UDC_DESC_STORAGE usb_dev_qual_desc_t udc_device_qual = { + .bLength = sizeof(usb_dev_qual_desc_t), + .bDescriptorType = USB_DT_DEVICE_QUALIFIER, + .bcdUSB = LE16(USB_V2_0), + .bDeviceClass = 0, + .bDeviceSubClass = 0, + .bDeviceProtocol = 0, + .bMaxPacketSize0 = USB_DEVICE_EP_CTRL_SIZE, + .bNumConfigurations = 1 +}; +#endif +#endif + +//! USB Device Configuration Descriptor filled for FS and HS +COMPILER_WORD_ALIGNED +UDC_DESC_STORAGE udc_desc_t udc_desc = { + .conf.bLength = sizeof(usb_conf_desc_t), + .conf.bDescriptorType = USB_DT_CONFIGURATION, + .conf.wTotalLength = LE16(sizeof(udc_desc_t)), + .conf.bNumInterfaces = USB_DEVICE_NB_INTERFACE, + .conf.bConfigurationValue = 1, + .conf.iConfiguration = 0, + .conf.bmAttributes = /* USB_CONFIG_ATTR_MUST_SET | */ USB_DEVICE_ATTR, + .conf.bMaxPower = USB_CONFIG_MAX_POWER(USB_DEVICE_POWER), +#ifdef KBD + .hid_kbd = UDI_HID_KBD_DESC, +#endif +#ifdef RAW + .hid_raw = UDI_HID_RAW_DESC, +#endif +#ifdef MOU + .hid_mou = UDI_HID_MOU_DESC, +#endif +#ifdef EXK + .hid_exk = UDI_HID_EXK_DESC, +#endif +#ifdef NKRO + .hid_nkro = UDI_HID_NKRO_DESC, +#endif +#ifdef CDC + .cdc_serial = CDC_DESCRIPTOR, +#endif +}; + +UDC_DESC_STORAGE udi_api_t *udi_apis[USB_DEVICE_NB_INTERFACE] = { + #ifdef KBD + &udi_api_hid_kbd, + #endif + #ifdef RAW + &udi_api_hid_raw, + #endif + #ifdef MOU + &udi_api_hid_mou, + #endif + #ifdef EXK + &udi_api_hid_exk, + #endif + #ifdef NKRO + &udi_api_hid_nkro, + #endif + #ifdef CDC + &udi_api_cdc_comm, &udi_api_cdc_data, + #endif +}; + +//! Add UDI with USB Descriptors FS & HS +UDC_DESC_STORAGE udc_config_speed_t udc_config_fshs[1] = {{ + .desc = (usb_conf_desc_t UDC_DESC_STORAGE*)&udc_desc, + .udi_apis = udi_apis, +}}; + +//! Add all information about USB Device in global structure for UDC +UDC_DESC_STORAGE udc_config_t udc_config = { + .confdev_lsfs = &udc_device_desc, + .conf_lsfs = udc_config_fshs, +}; + +//@} +//@} diff --git a/tmk_core/protocol/arm_atsam/usb/ui.c b/tmk_core/protocol/arm_atsam/usb/ui.c new file mode 100644 index 000000000..031678b64 --- /dev/null +++ b/tmk_core/protocol/arm_atsam/usb/ui.c @@ -0,0 +1,106 @@ +/** + * \file + * + * \brief User Interface + * + * Copyright (c) 2014-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef ARM_MATH_CM4 + #define ARM_MATH_CM4 +#endif + +#undef LITTLE_ENDIAN //redefined in samd51j18a.h +#include "samd51j18a.h" +#include "ui.h" + +volatile uint8_t usb_state; + +//! Sequence process running each \c SEQUENCE_PERIOD ms +#define SEQUENCE_PERIOD 150 + +#if 0 +/* Interrupt on "pin change" from push button to do wakeup on USB + * Note: + * This interrupt is enable when the USB host enable remote wakeup feature + * This interrupt wakeup the CPU if this one is in idle mode + */ +static void ui_wakeup_handler(void) +{ + /* It is a wakeup then send wakeup USB */ + udc_remotewakeup(); +} +#endif + +void ui_init(void) +{ + usb_state = USB_STATE_POWERUP; +} + +void ui_powerdown(void) +{ + usb_state = USB_STATE_POWERDOWN; +} + +void ui_wakeup_enable(void) +{ + +} + +void ui_wakeup_disable(void) +{ + +} + +void ui_wakeup(void) +{ + usb_state = USB_STATE_POWERUP; +} + +void ui_process(uint16_t framenumber) +{ + +} + +void ui_kbd_led(uint8_t value) +{ + +} diff --git a/tmk_core/protocol/arm_atsam/usb/ui.h b/tmk_core/protocol/arm_atsam/usb/ui.h new file mode 100644 index 000000000..3d899e669 --- /dev/null +++ b/tmk_core/protocol/arm_atsam/usb/ui.h @@ -0,0 +1,82 @@ +/** + * \file + * + * \brief Common User Interface for HID Keyboard application + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _UI_H_ +#define _UI_H_ + +extern volatile uint8_t usb_state; + +#define USB_STATE_UNKNOWN 0 +#define USB_STATE_POWERDOWN 1 +#define USB_STATE_POWERUP 2 + +//! \brief Initializes the user interface +void ui_init(void); + +//! \brief Enters the user interface in power down mode +void ui_powerdown(void); + +//! \brief Enables the asynchronous interrupts of the user interface +void ui_wakeup_enable(void); + +//! \brief Disables the asynchronous interrupts of the user interface +void ui_wakeup_disable(void); + +//! \brief Exits the user interface of power down mode +void ui_wakeup(void); + +/*! \brief This process is called each 1ms + * It is called only if the USB interface is enabled. + * + * \param framenumber Current frame number + */ +void ui_process(uint16_t framenumber); + +/*! \brief Turn on or off the keyboard LEDs + */ +void ui_kbd_led(uint8_t value); + +#endif // _UI_H_ diff --git a/tmk_core/protocol/arm_atsam/usb/usb.c b/tmk_core/protocol/arm_atsam/usb/usb.c new file mode 100644 index 000000000..d30d76dd1 --- /dev/null +++ b/tmk_core/protocol/arm_atsam/usb/usb.c @@ -0,0 +1,1144 @@ +/** + * \file + * + * \brief SAM USB Driver. + * + * Copyright (C) 2014-2016 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#define DEVICE_MODE_ONLY true +#define SAMD11 DEVICE_MODE_ONLY + +#ifndef ARM_MATH_CM4 + #define ARM_MATH_CM4 +#endif + +#include "compiler.h" +#undef LITTLE_ENDIAN //redefined in samd51j18a.h +#include "samd51j18a.h" +#include +#include +#include "arm_math.h" +#include "status_codes.h" +#include "usb.h" + +/** Fields definition from a LPM TOKEN */ +#define USB_LPM_ATTRIBUT_BLINKSTATE_MASK (0xF << 0) +#define USB_LPM_ATTRIBUT_HIRD_MASK (0xF << 4) +#define USB_LPM_ATTRIBUT_REMOTEWAKE_MASK (1 << 8) +#define USB_LPM_ATTRIBUT_BLINKSTATE(value) ((value & 0xF) << 0) +#define USB_LPM_ATTRIBUT_HIRD(value) ((value & 0xF) << 4) +#define USB_LPM_ATTRIBUT_REMOTEWAKE(value) ((value & 1) << 8) +#define USB_LPM_ATTRIBUT_BLINKSTATE_L1 USB_LPM_ATTRIBUT_BLINKSTATE(1) + +/** + * \brief Mask selecting the index part of an endpoint address + */ +#define USB_EP_ADDR_MASK 0x0f + +/** + * \brief Endpoint transfer direction is IN + */ +#define USB_EP_DIR_IN 0x80 + +/** + * \brief Endpoint transfer direction is OUT + */ +#define USB_EP_DIR_OUT 0x00 + +/** + * \name USB SRAM data containing pipe descriptor table + * The content of the USB SRAM can be : + * - modified by USB hardware interface to update pipe status. + * Thereby, it is read by software. + * - modified by USB software to control pipe. + * Thereby, it is read by hardware. + * This data section is volatile. + * + * @{ + */ +COMPILER_PACK_SET(1) +COMPILER_WORD_ALIGNED +union { + UsbDeviceDescriptor usb_endpoint_table[USB_EPT_NUM]; +} usb_descriptor_table; +COMPILER_PACK_RESET() +/** @} */ + +/** + * \brief Local USB module instance + */ +static struct usb_module *_usb_instances; + +/* Device LPM callback variable */ +static uint32_t device_callback_lpm_wakeup_enable; + +/** + * \brief Device endpoint callback parameter variable, used to transfer info to UDD wrapper layer + */ +static struct usb_endpoint_callback_parameter ep_callback_para; + +/** + * \internal USB Device IRQ Mask Bits Map + */ +static const uint16_t _usb_device_irq_bits[USB_DEVICE_CALLBACK_N] = { + USB_DEVICE_INTFLAG_SOF, + USB_DEVICE_INTFLAG_EORST, + USB_DEVICE_INTFLAG_WAKEUP | USB_DEVICE_INTFLAG_EORSM | USB_DEVICE_INTFLAG_UPRSM, + USB_DEVICE_INTFLAG_RAMACER, + USB_DEVICE_INTFLAG_SUSPEND, + USB_DEVICE_INTFLAG_LPMNYET, + USB_DEVICE_INTFLAG_LPMSUSP, +}; + +/** + * \internal USB Device IRQ Mask Bits Map + */ +static const uint8_t _usb_endpoint_irq_bits[USB_DEVICE_EP_CALLBACK_N] = { + USB_DEVICE_EPINTFLAG_TRCPT_Msk, + USB_DEVICE_EPINTFLAG_TRFAIL_Msk, + USB_DEVICE_EPINTFLAG_RXSTP, + USB_DEVICE_EPINTFLAG_STALL_Msk +}; + +/** + * \brief Registers a USB device callback + * + * Registers a callback function which is implemented by the user. + * + * \note The callback must be enabled by \ref usb_device_enable_callback, + * in order for the interrupt handler to call it when the conditions for the + * callback type is met. + * + * \param[in] module_inst Pointer to USB software instance struct + * \param[in] callback_type Callback type given by an enum + * \param[in] callback_func Pointer to callback function + * + * \return Status of the registration operation. + * \retval STATUS_OK The callback was registered successfully. + */ +enum status_code usb_device_register_callback(struct usb_module *module_inst, + enum usb_device_callback callback_type, + usb_device_callback_t callback_func) +{ + /* Sanity check arguments */ + Assert(module_inst); + Assert(callback_func); + + /* Register callback function */ + module_inst->device_callback[callback_type] = callback_func; + + /* Set the bit corresponding to the callback_type */ + module_inst->device_registered_callback_mask |= _usb_device_irq_bits[callback_type]; + + return STATUS_OK; +} + +/** + * \brief Unregisters a USB device callback + * + * Unregisters an asynchronous callback implemented by the user. Removing it + * from the internal callback registration table. + * + * \param[in] module_inst Pointer to USB software instance struct + * \param[in] callback_type Callback type given by an enum + * + * \return Status of the de-registration operation. + * \retval STATUS_OK The callback was unregistered successfully. + */ +enum status_code usb_device_unregister_callback(struct usb_module *module_inst, + enum usb_device_callback callback_type) +{ + /* Sanity check arguments */ + Assert(module_inst); + + /* Unregister callback function */ + module_inst->device_callback[callback_type] = NULL; + + /* Clear the bit corresponding to the callback_type */ + module_inst->device_registered_callback_mask &= ~_usb_device_irq_bits[callback_type]; + + return STATUS_OK; +} + +/** + * \brief Enables USB device callback generation for a given type. + * + * Enables asynchronous callbacks for a given logical type. + * This must be called before USB device generate callback events. + * + * \param[in] module_inst Pointer to USB software instance struct + * \param[in] callback_type Callback type given by an enum + * + * \return Status of the callback enable operation. + * \retval STATUS_OK The callback was enabled successfully. + */ +enum status_code usb_device_enable_callback(struct usb_module *module_inst, + enum usb_device_callback callback_type) +{ + /* Sanity check arguments */ + Assert(module_inst); + Assert(module_inst->hw); + + /* clear related flag */ + module_inst->hw->DEVICE.INTFLAG.reg = _usb_device_irq_bits[callback_type]; + + /* Enable callback */ + module_inst->device_enabled_callback_mask |= _usb_device_irq_bits[callback_type]; + + module_inst->hw->DEVICE.INTENSET.reg = _usb_device_irq_bits[callback_type]; + + return STATUS_OK; +} + +/** + * \brief Disables USB device callback generation for a given type. + * + * Disables asynchronous callbacks for a given logical type. + * + * \param[in] module_inst Pointer to USB software instance struct + * \param[in] callback_type Callback type given by an enum + * + * \return Status of the callback disable operation. + * \retval STATUS_OK The callback was disabled successfully. + */ +enum status_code usb_device_disable_callback(struct usb_module *module_inst, + enum usb_device_callback callback_type) +{ + /* Sanity check arguments */ + Assert(module_inst); + Assert(module_inst->hw); + + /* Disable callback */ + module_inst->device_enabled_callback_mask &= ~_usb_device_irq_bits[callback_type]; + + module_inst->hw->DEVICE.INTENCLR.reg = _usb_device_irq_bits[callback_type]; + + return STATUS_OK; +} + +/** + * \brief Registers a USB device endpoint callback + * + * Registers a callback function which is implemented by the user. + * + * \note The callback must be enabled by \ref usb_device_endpoint_enable_callback, + * in order for the interrupt handler to call it when the conditions for the + * callback type is met. + * + * \param[in] module_inst Pointer to USB software instance struct + * \param[in] ep_num Endpoint to configure + * \param[in] callback_type Callback type given by an enum + * \param[in] callback_func Pointer to callback function + * + * \return Status of the registration operation. + * \retval STATUS_OK The callback was registered successfully. + */ +enum status_code usb_device_endpoint_register_callback( + struct usb_module *module_inst, uint8_t ep_num, + enum usb_device_endpoint_callback callback_type, + usb_device_endpoint_callback_t callback_func) +{ + /* Sanity check arguments */ + Assert(module_inst); + Assert(ep_num < USB_EPT_NUM); + Assert(callback_func); + + /* Register callback function */ + module_inst->device_endpoint_callback[ep_num][callback_type] = callback_func; + + /* Set the bit corresponding to the callback_type */ + module_inst->device_endpoint_registered_callback_mask[ep_num] |= _usb_endpoint_irq_bits[callback_type]; + + return STATUS_OK; +} + +/** + * \brief Unregisters a USB device endpoint callback + * + * Unregisters an callback implemented by the user. Removing it + * from the internal callback registration table. + * + * \param[in] module_inst Pointer to USB software instance struct + * \param[in] ep_num Endpoint to configure + * \param[in] callback_type Callback type given by an enum + * + * \return Status of the de-registration operation. + * \retval STATUS_OK The callback was unregistered successfully. + */ +enum status_code usb_device_endpoint_unregister_callback( + struct usb_module *module_inst, uint8_t ep_num, + enum usb_device_endpoint_callback callback_type) +{ + /* Sanity check arguments */ + Assert(module_inst); + Assert(ep_num < USB_EPT_NUM); + + /* Unregister callback function */ + module_inst->device_endpoint_callback[ep_num][callback_type] = NULL; + + /* Clear the bit corresponding to the callback_type */ + module_inst->device_endpoint_registered_callback_mask[ep_num] &= ~_usb_endpoint_irq_bits[callback_type]; + + return STATUS_OK; +} + +/** + * \brief Enables USB device endpoint callback generation for a given type. + * + * Enables callbacks for a given logical type. + * This must be called before USB device pipe generate callback events. + * + * \param[in] module_inst Pointer to USB software instance struct + * \param[in] ep Endpoint to configure + * \param[in] callback_type Callback type given by an enum + * + * \return Status of the callback enable operation. + * \retval STATUS_OK The callback was enabled successfully. + */ +enum status_code usb_device_endpoint_enable_callback( + struct usb_module *module_inst, uint8_t ep, + enum usb_device_endpoint_callback callback_type) +{ + /* Sanity check arguments */ + Assert(module_inst); + Assert(module_inst->hw); + + uint8_t ep_num = ep & USB_EP_ADDR_MASK; + Assert(ep_num < USB_EPT_NUM); + + /* Enable callback */ + module_inst->device_endpoint_enabled_callback_mask[ep_num] |= _usb_endpoint_irq_bits[callback_type]; + + if (callback_type == USB_DEVICE_ENDPOINT_CALLBACK_TRCPT) { + if (ep_num == 0) { // control endpoint + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPINTENSET.reg = USB_DEVICE_EPINTENSET_TRCPT0 | USB_DEVICE_EPINTENSET_TRCPT1; + } else if (ep & USB_EP_DIR_IN) { + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPINTENSET.reg = USB_DEVICE_EPINTENSET_TRCPT1; + } else { + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPINTENSET.reg = USB_DEVICE_EPINTENSET_TRCPT0; + } + } + + if (callback_type == USB_DEVICE_ENDPOINT_CALLBACK_TRFAIL) { + if (ep_num == 0) { // control endpoint + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPINTENSET.reg = USB_DEVICE_EPINTENSET_TRFAIL0 | USB_DEVICE_EPINTENSET_TRFAIL1; + } else if (ep & USB_EP_DIR_IN) { + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPINTENSET.reg = USB_DEVICE_EPINTENSET_TRFAIL1; + } else { + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPINTENSET.reg = USB_DEVICE_EPINTENSET_TRFAIL0; + } + } + + if (callback_type == USB_DEVICE_ENDPOINT_CALLBACK_RXSTP) { + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPINTENSET.reg = USB_DEVICE_EPINTENSET_RXSTP; + } + + if (callback_type == USB_DEVICE_ENDPOINT_CALLBACK_STALL) { + if (ep & USB_EP_DIR_IN) { + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPINTENSET.reg = USB_DEVICE_EPINTENSET_STALL1; + } else { + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPINTENSET.reg = USB_DEVICE_EPINTENSET_STALL0; + } + } + + return STATUS_OK; +} + +/** + * \brief Disables USB device endpoint callback generation for a given type. + * + * Disables callbacks for a given logical type. + * + * \param[in] module_inst Pointer to USB software instance struct + * \param[in] ep Endpoint to configure + * \param[in] callback_type Callback type given by an enum + * + * \return Status of the callback disable operation. + * \retval STATUS_OK The callback was disabled successfully. + */ +enum status_code usb_device_endpoint_disable_callback( + struct usb_module *module_inst, uint8_t ep, + enum usb_device_endpoint_callback callback_type) +{ + /* Sanity check arguments */ + Assert(module_inst); + Assert(module_inst->hw); + + uint8_t ep_num = ep & USB_EP_ADDR_MASK; + Assert(ep_num < USB_EPT_NUM); + + /* Enable callback */ + module_inst->device_endpoint_enabled_callback_mask[ep_num] &= ~_usb_endpoint_irq_bits[callback_type]; + + if (callback_type == USB_DEVICE_ENDPOINT_CALLBACK_TRCPT) { + if (ep_num == 0) { // control endpoint + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPINTENCLR.reg = USB_DEVICE_EPINTENCLR_TRCPT0 | USB_DEVICE_EPINTENCLR_TRCPT1; + } else if (ep & USB_EP_DIR_IN) { + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPINTENCLR.reg = USB_DEVICE_EPINTENCLR_TRCPT1; + } else { + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPINTENCLR.reg = USB_DEVICE_EPINTENCLR_TRCPT0; + } + } + + if (callback_type == USB_DEVICE_ENDPOINT_CALLBACK_TRFAIL) { + if (ep_num == 0) { // control endpoint + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPINTENCLR.reg = USB_DEVICE_EPINTENCLR_TRFAIL0 | USB_DEVICE_EPINTENCLR_TRFAIL1; + } else if (ep & USB_EP_DIR_IN) { + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPINTENCLR.reg = USB_DEVICE_EPINTENCLR_TRFAIL1; + } else { + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPINTENCLR.reg = USB_DEVICE_EPINTENCLR_TRFAIL0; + } + } + + if (callback_type == USB_DEVICE_ENDPOINT_CALLBACK_RXSTP) { + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPINTENCLR.reg = USB_DEVICE_EPINTENCLR_RXSTP; + } + + if (callback_type == USB_DEVICE_ENDPOINT_CALLBACK_STALL) { + if (ep & USB_EP_DIR_IN) { + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPINTENCLR.reg = USB_DEVICE_EPINTENCLR_STALL1; + } else { + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPINTENCLR.reg = USB_DEVICE_EPINTENCLR_STALL0; + } + } + + return STATUS_OK; +} + +/** + * \brief Initializes an USB device endpoint configuration structure to defaults. + * + * Initializes a given USB device endpoint configuration structure to a + * set of known default values. This function should be called on all new + * instances of these configuration structures before being modified by the + * user application. + * + * The default configuration is as follows: + * \li endpoint address is 0 + * \li endpoint size is 8 bytes + * \li auto_zlp is false + * \li endpoint type is control + * + * \param[out] ep_config Configuration structure to initialize to default values + */ +void usb_device_endpoint_get_config_defaults(struct usb_device_endpoint_config *ep_config) +{ + /* Sanity check arguments */ + Assert(ep_config); + + /* Write default config to config struct */ + ep_config->ep_address = 0; + ep_config->ep_size = USB_ENDPOINT_8_BYTE; + ep_config->auto_zlp = false; + ep_config->ep_type = USB_DEVICE_ENDPOINT_TYPE_CONTROL; +} + +/** + * \brief Writes an USB device endpoint configuration to the hardware module. + * + * Writes out a given configuration of an USB device endpoint + * configuration to the hardware module. If the pipe is already configured, + * the new configuration will replace the existing one. + * + * \param[in] module_inst Pointer to USB software instance struct + * \param[in] ep_config Configuration settings for the endpoint + * + * \return Status of the device endpoint configuration operation + * \retval STATUS_OK The device endpoint was configured successfully + * \retval STATUS_ERR_DENIED The endpoint address is already configured + */ +enum status_code usb_device_endpoint_set_config(struct usb_module *module_inst, + struct usb_device_endpoint_config *ep_config) +{ + /* Sanity check arguments */ + Assert(module_inst); + Assert(ep_config); + + uint8_t ep_num = ep_config->ep_address & USB_EP_ADDR_MASK; + uint8_t ep_bank = (ep_config->ep_address & USB_EP_DIR_IN) ? 1 : 0; + + switch (ep_config->ep_type) { + case USB_DEVICE_ENDPOINT_TYPE_DISABLE: + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPCFG.reg = USB_DEVICE_EPCFG_EPTYPE0(0) | USB_DEVICE_EPCFG_EPTYPE1(0); + return STATUS_OK; + + case USB_DEVICE_ENDPOINT_TYPE_CONTROL: + if ((module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPCFG.reg & USB_DEVICE_EPCFG_EPTYPE0_Msk) == 0 && \ + (module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPCFG.reg & USB_DEVICE_EPCFG_EPTYPE1_Msk) == 0) { + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPCFG.reg = USB_DEVICE_EPCFG_EPTYPE0(1) | USB_DEVICE_EPCFG_EPTYPE1(1); + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPSTATUSSET.reg = USB_DEVICE_EPSTATUSSET_BK0RDY; + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPSTATUSCLR.reg = USB_DEVICE_EPSTATUSCLR_BK1RDY; + } else { + return STATUS_ERR_DENIED; + } + if (true == ep_config->auto_zlp) { + usb_descriptor_table.usb_endpoint_table[ep_num].DeviceDescBank[0].PCKSIZE.reg |= USB_DEVICE_PCKSIZE_AUTO_ZLP; + usb_descriptor_table.usb_endpoint_table[ep_num].DeviceDescBank[1].PCKSIZE.reg |= USB_DEVICE_PCKSIZE_AUTO_ZLP; + } else { + usb_descriptor_table.usb_endpoint_table[ep_num].DeviceDescBank[0].PCKSIZE.reg &= ~USB_DEVICE_PCKSIZE_AUTO_ZLP; + usb_descriptor_table.usb_endpoint_table[ep_num].DeviceDescBank[1].PCKSIZE.reg &= ~USB_DEVICE_PCKSIZE_AUTO_ZLP; + } + usb_descriptor_table.usb_endpoint_table[ep_num].DeviceDescBank[0].PCKSIZE.bit.SIZE = ep_config->ep_size; + usb_descriptor_table.usb_endpoint_table[ep_num].DeviceDescBank[1].PCKSIZE.bit.SIZE = ep_config->ep_size; + return STATUS_OK; + + case USB_DEVICE_ENDPOINT_TYPE_ISOCHRONOUS: + if (ep_bank) { + if ((module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPCFG.reg & USB_DEVICE_EPCFG_EPTYPE1_Msk) == 0){ + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPCFG.reg |= USB_DEVICE_EPCFG_EPTYPE1(2); + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPSTATUSCLR.reg = USB_DEVICE_EPSTATUSCLR_BK1RDY; + } else { + return STATUS_ERR_DENIED; + } + } else { + if ((module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPCFG.reg & USB_DEVICE_EPCFG_EPTYPE0_Msk) == 0){ + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPCFG.reg |= USB_DEVICE_EPCFG_EPTYPE0(2); + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPSTATUSSET.reg = USB_DEVICE_EPSTATUSSET_BK0RDY; + } else { + return STATUS_ERR_DENIED; + } + } + break; + + case USB_DEVICE_ENDPOINT_TYPE_BULK: + if (ep_bank) { + if ((module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPCFG.reg & USB_DEVICE_EPCFG_EPTYPE1_Msk) == 0){ + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPCFG.reg |= USB_DEVICE_EPCFG_EPTYPE1(3); + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPSTATUSCLR.reg = USB_DEVICE_EPSTATUSCLR_BK1RDY; + } else { + return STATUS_ERR_DENIED; + } + } else { + if ((module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPCFG.reg & USB_DEVICE_EPCFG_EPTYPE0_Msk) == 0){ + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPCFG.reg |= USB_DEVICE_EPCFG_EPTYPE0(3); + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPSTATUSSET.reg = USB_DEVICE_EPSTATUSSET_BK0RDY; + } else { + return STATUS_ERR_DENIED; + } + } + break; + + case USB_DEVICE_ENDPOINT_TYPE_INTERRUPT: + if (ep_bank) { + if ((module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPCFG.reg & USB_DEVICE_EPCFG_EPTYPE1_Msk) == 0){ + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPCFG.reg |= USB_DEVICE_EPCFG_EPTYPE1(4); + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPSTATUSCLR.reg = USB_DEVICE_EPSTATUSCLR_BK1RDY; + } else { + return STATUS_ERR_DENIED; + } + } else { + if ((module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPCFG.reg & USB_DEVICE_EPCFG_EPTYPE0_Msk) == 0){ + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPCFG.reg |= USB_DEVICE_EPCFG_EPTYPE0(4); + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPSTATUSSET.reg = USB_DEVICE_EPSTATUSSET_BK0RDY; + } else { + return STATUS_ERR_DENIED; + } + } + break; + + default: + break; + } + + usb_descriptor_table.usb_endpoint_table[ep_num].DeviceDescBank[ep_bank].PCKSIZE.bit.SIZE = ep_config->ep_size; + + if (true == ep_config->auto_zlp) { + usb_descriptor_table.usb_endpoint_table[ep_num].DeviceDescBank[ep_bank].PCKSIZE.reg |= USB_DEVICE_PCKSIZE_AUTO_ZLP; + } else { + usb_descriptor_table.usb_endpoint_table[ep_num].DeviceDescBank[ep_bank].PCKSIZE.reg &= ~USB_DEVICE_PCKSIZE_AUTO_ZLP; + } + + return STATUS_OK; +} + +/** + * \brief Check if current endpoint is configured + * + * \param module_inst Pointer to USB software instance struct + * \param ep Endpoint address (direction & number) + * + * \return \c true if endpoint is configured and ready to use + */ +bool usb_device_endpoint_is_configured(struct usb_module *module_inst, uint8_t ep) +{ + uint8_t ep_num = ep & USB_EP_ADDR_MASK; + uint8_t flag; + + if (ep & USB_EP_DIR_IN) { + flag = (uint8_t)(module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPCFG.bit.EPTYPE1); + } else { + flag = (uint8_t)(module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPCFG.bit.EPTYPE0); + } + return ((enum usb_device_endpoint_type)(flag) != USB_DEVICE_ENDPOINT_TYPE_DISABLE); +} + + +/** + * \brief Abort ongoing job on the endpoint + * + * \param module_inst Pointer to USB software instance struct + * \param ep Endpoint address + */ +void usb_device_endpoint_abort_job(struct usb_module *module_inst, uint8_t ep) +{ + uint8_t ep_num; + ep_num = ep & USB_EP_ADDR_MASK; + + // Stop transfer + if (ep & USB_EP_DIR_IN) { + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPSTATUSCLR.reg = USB_DEVICE_EPSTATUSCLR_BK1RDY; + // Eventually ack a transfer occur during abort + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPINTFLAG.reg = USB_DEVICE_EPINTFLAG_TRCPT1; + } else { + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPSTATUSSET.reg = USB_DEVICE_EPSTATUSSET_BK0RDY; + // Eventually ack a transfer occur during abort + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPINTFLAG.reg = USB_DEVICE_EPINTFLAG_TRCPT0; + } +} + +/** + * \brief Check if endpoint is halted + * + * \param module_inst Pointer to USB software instance struct + * \param ep Endpoint address + * + * \return \c true if the endpoint is halted + */ +bool usb_device_endpoint_is_halted(struct usb_module *module_inst, uint8_t ep) +{ + uint8_t ep_num = ep & USB_EP_ADDR_MASK; + + if (ep & USB_EP_DIR_IN) { + return (module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPSTATUS.reg & USB_DEVICE_EPSTATUSSET_STALLRQ1); + } else { + return (module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPSTATUS.reg & USB_DEVICE_EPSTATUSSET_STALLRQ0); + } +} + +/** + * \brief Halt the endpoint (send STALL) + * + * \param module_inst Pointer to USB software instance struct + * \param ep Endpoint address + */ +void usb_device_endpoint_set_halt(struct usb_module *module_inst, uint8_t ep) +{ + uint8_t ep_num = ep & USB_EP_ADDR_MASK; + + // Stall endpoint + if (ep & USB_EP_DIR_IN) { + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPSTATUSSET.reg = USB_DEVICE_EPSTATUSSET_STALLRQ1; + } else { + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPSTATUSSET.reg = USB_DEVICE_EPSTATUSSET_STALLRQ0; + } +} + +/** + * \brief Clear endpoint halt state + * + * \param module_inst Pointer to USB software instance struct + * \param ep Endpoint address + */ +void usb_device_endpoint_clear_halt(struct usb_module *module_inst, uint8_t ep) +{ + uint8_t ep_num = ep & USB_EP_ADDR_MASK; + + if (ep & USB_EP_DIR_IN) { + if (module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPSTATUS.reg & USB_DEVICE_EPSTATUSSET_STALLRQ1) { + // Remove stall request + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPSTATUSCLR.reg = USB_DEVICE_EPSTATUSCLR_STALLRQ1; + if (module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPINTFLAG.reg & USB_DEVICE_EPINTFLAG_STALL1) { + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPINTFLAG.reg = USB_DEVICE_EPINTFLAG_STALL1; + // The Stall has occurred, then reset data toggle + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPSTATUSCLR.reg = USB_DEVICE_EPSTATUSSET_DTGLIN; + } + } + } else { + if (module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPSTATUS.reg & USB_DEVICE_EPSTATUSSET_STALLRQ0) { + // Remove stall request + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPSTATUSCLR.reg = USB_DEVICE_EPSTATUSCLR_STALLRQ0; + if (module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPINTFLAG.reg & USB_DEVICE_EPINTFLAG_STALL0) { + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPINTFLAG.reg = USB_DEVICE_EPINTFLAG_STALL0; + // The Stall has occurred, then reset data toggle + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPSTATUSCLR.reg = USB_DEVICE_EPSTATUSSET_DTGLOUT; + } + } + } +} + +/** + * \brief Start write buffer job on a endpoint + * + * \param module_inst Pointer to USB module instance + * \param ep_num Endpoint number + * \param pbuf Pointer to buffer + * \param buf_size Size of buffer + * + * \return Status of procedure + * \retval STATUS_OK Job started successfully + * \retval STATUS_ERR_DENIED Endpoint is not ready + */ +enum status_code usb_device_endpoint_write_buffer_job(struct usb_module *module_inst,uint8_t ep_num, + uint8_t* pbuf, uint32_t buf_size) +{ + /* Sanity check arguments */ + Assert(module_inst); + Assert(module_inst->hw); + Assert(ep_num < USB_EPT_NUM); + + uint8_t flag; + flag = (uint8_t)(module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPCFG.bit.EPTYPE1); + if ((enum usb_device_endpoint_type)(flag) == USB_DEVICE_ENDPOINT_TYPE_DISABLE) { + return STATUS_ERR_DENIED; + }; + + /* get endpoint configuration from setting register */ + usb_descriptor_table.usb_endpoint_table[ep_num].DeviceDescBank[1].ADDR.reg = (uint32_t)pbuf; + usb_descriptor_table.usb_endpoint_table[ep_num].DeviceDescBank[1].PCKSIZE.bit.MULTI_PACKET_SIZE = 0; + usb_descriptor_table.usb_endpoint_table[ep_num].DeviceDescBank[1].PCKSIZE.bit.BYTE_COUNT = buf_size; + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPSTATUSSET.reg = USB_DEVICE_EPSTATUSSET_BK1RDY; + + return STATUS_OK; +} + +/** + * \brief Start read buffer job on a endpoint + * + * \param module_inst Pointer to USB module instance + * \param ep_num Endpoint number + * \param pbuf Pointer to buffer + * \param buf_size Size of buffer + * + * \return Status of procedure + * \retval STATUS_OK Job started successfully + * \retval STATUS_ERR_DENIED Endpoint is not ready + */ +enum status_code usb_device_endpoint_read_buffer_job(struct usb_module *module_inst,uint8_t ep_num, + uint8_t* pbuf, uint32_t buf_size) +{ + /* Sanity check arguments */ + Assert(module_inst); + Assert(module_inst->hw); + Assert(ep_num < USB_EPT_NUM); + + uint8_t flag; + flag = (uint8_t)(module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPCFG.bit.EPTYPE0); + if ((enum usb_device_endpoint_type)(flag) == USB_DEVICE_ENDPOINT_TYPE_DISABLE) { + return STATUS_ERR_DENIED; + }; + + /* get endpoint configuration from setting register */ + usb_descriptor_table.usb_endpoint_table[ep_num].DeviceDescBank[0].ADDR.reg = (uint32_t)pbuf; + usb_descriptor_table.usb_endpoint_table[ep_num].DeviceDescBank[0].PCKSIZE.bit.MULTI_PACKET_SIZE = buf_size; + usb_descriptor_table.usb_endpoint_table[ep_num].DeviceDescBank[0].PCKSIZE.bit.BYTE_COUNT = 0; + module_inst->hw->DEVICE.DeviceEndpoint[ep_num].EPSTATUSCLR.reg = USB_DEVICE_EPSTATUSCLR_BK0RDY; + + return STATUS_OK; +} + +/** + * \brief Start setup packet read job on a endpoint + * + * \param module_inst Pointer to USB device module instance + * \param pbuf Pointer to buffer + * + * \return Status of procedure + * \retval STATUS_OK Job started successfully + * \retval STATUS_ERR_DENIED Endpoint is not ready + */ +enum status_code usb_device_endpoint_setup_buffer_job(struct usb_module *module_inst, + uint8_t* pbuf) +{ + /* Sanity check arguments */ + Assert(module_inst); + Assert(module_inst->hw); + + /* get endpoint configuration from setting register */ + usb_descriptor_table.usb_endpoint_table[0].DeviceDescBank[0].ADDR.reg = (uint32_t)pbuf; + usb_descriptor_table.usb_endpoint_table[0].DeviceDescBank[0].PCKSIZE.bit.MULTI_PACKET_SIZE = 8; + usb_descriptor_table.usb_endpoint_table[0].DeviceDescBank[0].PCKSIZE.bit.BYTE_COUNT = 0; + module_inst->hw->DEVICE.DeviceEndpoint[0].EPSTATUSCLR.reg = USB_DEVICE_EPSTATUSCLR_BK0RDY; + + return STATUS_OK; +} + +static void _usb_device_interrupt_handler(void) +{ + uint16_t ep_inst; + uint16_t flags, flags_run; + ep_inst = _usb_instances->hw->DEVICE.EPINTSMRY.reg; + + /* device interrupt */ + if (0 == ep_inst) { + int i; + + /* get interrupt flags */ + flags = _usb_instances->hw->DEVICE.INTFLAG.reg; + flags_run = flags & + _usb_instances->device_enabled_callback_mask & + _usb_instances->device_registered_callback_mask; + + for (i = 0; i < USB_DEVICE_CALLBACK_N; i ++) { + if (flags & _usb_device_irq_bits[i]) { + _usb_instances->hw->DEVICE.INTFLAG.reg = + _usb_device_irq_bits[i]; + } + if (flags_run & _usb_device_irq_bits[i]) { + if (i == USB_DEVICE_CALLBACK_LPMSUSP) { + device_callback_lpm_wakeup_enable = + usb_descriptor_table.usb_endpoint_table[0].DeviceDescBank[0].EXTREG.bit.VARIABLE + & USB_LPM_ATTRIBUT_REMOTEWAKE_MASK; + } + (_usb_instances->device_callback[i])(_usb_instances, &device_callback_lpm_wakeup_enable); + } + } + + } else { + /* endpoint interrupt */ + + for (uint8_t i = 0; i < USB_EPT_NUM; i++) { + + if (ep_inst & (1 << i)) { + flags = _usb_instances->hw->DEVICE.DeviceEndpoint[i].EPINTFLAG.reg; + flags_run = flags & + _usb_instances->device_endpoint_enabled_callback_mask[i] & + _usb_instances->device_endpoint_registered_callback_mask[i]; + + // endpoint transfer stall interrupt + if (flags & USB_DEVICE_EPINTFLAG_STALL_Msk) { + if (_usb_instances->hw->DEVICE.DeviceEndpoint[i].EPINTFLAG.reg & USB_DEVICE_EPINTFLAG_STALL1) { + _usb_instances->hw->DEVICE.DeviceEndpoint[i].EPINTFLAG.reg = USB_DEVICE_EPINTFLAG_STALL1; + ep_callback_para.endpoint_address = USB_EP_DIR_IN | i; + } else if (_usb_instances->hw->DEVICE.DeviceEndpoint[i].EPINTFLAG.reg & USB_DEVICE_EPINTFLAG_STALL0) { + _usb_instances->hw->DEVICE.DeviceEndpoint[i].EPINTFLAG.reg = USB_DEVICE_EPINTFLAG_STALL0; + ep_callback_para.endpoint_address = USB_EP_DIR_OUT | i; + } + + if (flags_run & USB_DEVICE_EPINTFLAG_STALL_Msk) { + (_usb_instances->device_endpoint_callback[i][USB_DEVICE_ENDPOINT_CALLBACK_STALL])(_usb_instances,&ep_callback_para); + } + return; + } + + // endpoint received setup interrupt + if (flags & USB_DEVICE_EPINTFLAG_RXSTP) { + _usb_instances->hw->DEVICE.DeviceEndpoint[i].EPINTFLAG.reg = USB_DEVICE_EPINTFLAG_RXSTP; + if(_usb_instances->device_endpoint_enabled_callback_mask[i] & _usb_endpoint_irq_bits[USB_DEVICE_ENDPOINT_CALLBACK_RXSTP]) { + ep_callback_para.received_bytes = (uint16_t)(usb_descriptor_table.usb_endpoint_table[i].DeviceDescBank[0].PCKSIZE.bit.BYTE_COUNT); + (_usb_instances->device_endpoint_callback[i][USB_DEVICE_ENDPOINT_CALLBACK_RXSTP])(_usb_instances,&ep_callback_para); + } + return; + } + + // endpoint transfer complete interrupt + if (flags & USB_DEVICE_EPINTFLAG_TRCPT_Msk) { + if (_usb_instances->hw->DEVICE.DeviceEndpoint[i].EPINTFLAG.reg & USB_DEVICE_EPINTFLAG_TRCPT1) { + _usb_instances->hw->DEVICE.DeviceEndpoint[i].EPINTFLAG.reg = USB_DEVICE_EPINTFLAG_TRCPT1; + ep_callback_para.endpoint_address = USB_EP_DIR_IN | i; + ep_callback_para.sent_bytes = (uint16_t)(usb_descriptor_table.usb_endpoint_table[i].DeviceDescBank[1].PCKSIZE.bit.BYTE_COUNT); + + } else if (_usb_instances->hw->DEVICE.DeviceEndpoint[i].EPINTFLAG.reg & USB_DEVICE_EPINTFLAG_TRCPT0) { + _usb_instances->hw->DEVICE.DeviceEndpoint[i].EPINTFLAG.reg = USB_DEVICE_EPINTFLAG_TRCPT0; + ep_callback_para.endpoint_address = USB_EP_DIR_OUT | i; + ep_callback_para.received_bytes = (uint16_t)(usb_descriptor_table.usb_endpoint_table[i].DeviceDescBank[0].PCKSIZE.bit.BYTE_COUNT); + ep_callback_para.out_buffer_size = (uint16_t)(usb_descriptor_table.usb_endpoint_table[i].DeviceDescBank[0].PCKSIZE.bit.MULTI_PACKET_SIZE); + } + if(flags_run & USB_DEVICE_EPINTFLAG_TRCPT_Msk) { + (_usb_instances->device_endpoint_callback[i][USB_DEVICE_ENDPOINT_CALLBACK_TRCPT])(_usb_instances,&ep_callback_para); + } + return; + } + + // endpoint transfer fail interrupt + if (flags & USB_DEVICE_EPINTFLAG_TRFAIL_Msk) { + if (_usb_instances->hw->DEVICE.DeviceEndpoint[i].EPINTFLAG.reg & USB_DEVICE_EPINTFLAG_TRFAIL1) { + _usb_instances->hw->DEVICE.DeviceEndpoint[i].EPINTFLAG.reg = USB_DEVICE_EPINTFLAG_TRFAIL1; + if (usb_descriptor_table.usb_endpoint_table[i].DeviceDescBank[1].STATUS_BK.reg & USB_DEVICE_STATUS_BK_ERRORFLOW) { + usb_descriptor_table.usb_endpoint_table[i].DeviceDescBank[1].STATUS_BK.reg &= ~USB_DEVICE_STATUS_BK_ERRORFLOW; + } + ep_callback_para.endpoint_address = USB_EP_DIR_IN | i; + if (_usb_instances->hw->DEVICE.DeviceEndpoint[i].EPINTFLAG.reg & USB_DEVICE_EPINTFLAG_TRCPT1) { + return; + } + } else if(_usb_instances->hw->DEVICE.DeviceEndpoint[i].EPINTFLAG.reg & USB_DEVICE_EPINTFLAG_TRFAIL0) { + _usb_instances->hw->DEVICE.DeviceEndpoint[i].EPINTFLAG.reg = USB_DEVICE_EPINTFLAG_TRFAIL0; + if (usb_descriptor_table.usb_endpoint_table[i].DeviceDescBank[0].STATUS_BK.reg & USB_DEVICE_STATUS_BK_ERRORFLOW) { + usb_descriptor_table.usb_endpoint_table[i].DeviceDescBank[0].STATUS_BK.reg &= ~USB_DEVICE_STATUS_BK_ERRORFLOW; + } + ep_callback_para.endpoint_address = USB_EP_DIR_OUT | i; + if (_usb_instances->hw->DEVICE.DeviceEndpoint[i].EPINTFLAG.reg & USB_DEVICE_EPINTFLAG_TRCPT0) { + return; + } + } + + if(flags_run & USB_DEVICE_EPINTFLAG_TRFAIL_Msk) { + (_usb_instances->device_endpoint_callback[i][USB_DEVICE_ENDPOINT_CALLBACK_TRFAIL])(_usb_instances,&ep_callback_para); + } + return; + } + } + } + } +} + +/** + * \brief Enable the USB module peripheral + * + * \param module_inst pointer to USB module instance + */ +void usb_enable(struct usb_module *module_inst) +{ + Assert(module_inst); + Assert(module_inst->hw); + + module_inst->hw->DEVICE.CTRLA.reg |= USB_CTRLA_ENABLE; + while (module_inst->hw->DEVICE.SYNCBUSY.reg == USB_SYNCBUSY_ENABLE); +} + +/** + * \brief Disable the USB module peripheral + * + * \param module_inst pointer to USB module instance + */ +void usb_disable(struct usb_module *module_inst) +{ + Assert(module_inst); + Assert(module_inst->hw); + + module_inst->hw->DEVICE.INTENCLR.reg = USB_DEVICE_INTENCLR_MASK; + module_inst->hw->DEVICE.INTFLAG.reg = USB_DEVICE_INTFLAG_MASK; + module_inst->hw->DEVICE.CTRLA.reg &= ~USB_CTRLA_ENABLE; + while (module_inst->hw->DEVICE.SYNCBUSY.reg == USB_SYNCBUSY_ENABLE); +} + +/** + * \brief Interrupt handler for the USB module. + */ +void USB_0_Handler(void) +{ + if (_usb_instances->hw->DEVICE.CTRLA.bit.MODE) { + + } else { + /*device mode ISR */ + _usb_device_interrupt_handler(); + } +} + +void USB_1_Handler(void) +{ + _usb_device_interrupt_handler(); +} + +void USB_2_Handler(void) +{ + _usb_device_interrupt_handler(); +} + +void USB_3_Handler(void) +{ + _usb_device_interrupt_handler(); +} + +/** + * \brief Get the default USB module settings + * + * \param[out] module_config Configuration structure to initialize to default values + */ +void usb_get_config_defaults(struct usb_config *module_config) +{ + Assert(module_config); + + /* Sanity check arguments */ + Assert(module_config); + /* Write default configuration to config struct */ + module_config->select_host_mode = 0; + module_config->run_in_standby = 1; + module_config->source_generator = 0; + module_config->speed_mode = USB_SPEED_FULL; +} + +#define NVM_USB_PAD_TRANSN_POS 45 +#define NVM_USB_PAD_TRANSN_SIZE 5 +#define NVM_USB_PAD_TRANSP_POS 50 +#define NVM_USB_PAD_TRANSP_SIZE 5 +#define NVM_USB_PAD_TRIM_POS 55 +#define NVM_USB_PAD_TRIM_SIZE 3 + +/** + * \brief Initializes USB module instance + * + * Enables the clock and initializes the USB module, based on the given + * configuration values. + * + * \param[in,out] module_inst Pointer to the software module instance struct + * \param[in] hw Pointer to the USB hardware module + * \param[in] module_config Pointer to the USB configuration options struct + * + * \return Status of the initialization procedure. + * + * \retval STATUS_OK The module was initialized successfully + */ + +#define GCLK_USB 10 + +enum status_code usb_init(struct usb_module *module_inst, Usb *const hw, + struct usb_config *module_config) +{ + /* Sanity check arguments */ + Assert(hw); + Assert(module_inst); + Assert(module_config); + + uint32_t i,j; + uint32_t pad_transn, pad_transp, pad_trim; + + Gclk *pgclk = GCLK; + Mclk *pmclk = MCLK; + Port *pport = PORT; + Oscctrl *posc = OSCCTRL; + + _usb_instances = module_inst; + + /* Associate the software module instance with the hardware module */ + module_inst->hw = hw; + + //setup peripheral and synchronous bus clocks to USB + pmclk->AHBMASK.bit.USB_ = 1; + pmclk->APBBMASK.bit.USB_ = 1; + + /* Set up the USB DP/DN pins */ + pport->Group[0].PMUX[12].reg = 0x77; //PA24, PA25, function column H for USB D-, D+ + pport->Group[0].PINCFG[24].bit.PMUXEN = 1; + pport->Group[0].PINCFG[25].bit.PMUXEN = 1; + pport->Group[1].PMUX[11].bit.PMUXE = 7; //PB22, function column H for USB SOF_1KHz output + pport->Group[1].PINCFG[22].bit.PMUXEN = 1; + + //configure and enable DFLL for USB clock recovery mode at 48MHz + posc->DFLLCTRLA.bit.ENABLE = 0; + while (posc->DFLLSYNC.bit.ENABLE); + while (posc->DFLLSYNC.bit.DFLLCTRLB); + posc->DFLLCTRLB.bit.USBCRM = 1; + while (posc->DFLLSYNC.bit.DFLLCTRLB); + posc->DFLLCTRLB.bit.MODE = 1; + while (posc->DFLLSYNC.bit.DFLLCTRLB); + posc->DFLLCTRLB.bit.QLDIS = 0; + while (posc->DFLLSYNC.bit.DFLLCTRLB); + posc->DFLLCTRLB.bit.CCDIS = 1; + posc->DFLLMUL.bit.MUL = 0xbb80; //4800 x 1KHz + while (posc->DFLLSYNC.bit.DFLLMUL); + posc->DFLLCTRLA.bit.ENABLE = 1; + while (posc->DFLLSYNC.bit.ENABLE); + + /* Setup clock for module */ + pgclk->PCHCTRL[GCLK_USB].bit.GEN = 0; + pgclk->PCHCTRL[GCLK_USB].bit.CHEN = 1; + + /* Reset */ + hw->DEVICE.CTRLA.bit.SWRST = 1; + while (hw->DEVICE.SYNCBUSY.bit.SWRST) { + /* Sync wait */ + } + + /* Change QOS values to have the best performance and correct USB behaviour */ + USB->DEVICE.QOSCTRL.bit.CQOS = 2; + USB->DEVICE.QOSCTRL.bit.DQOS = 2; + + /* Load Pad Calibration */ + + pad_transn = (USB_FUSES_TRANSN_ADDR >> USB_FUSES_TRANSN_Pos) & USB_FUSES_TRANSN_Msk; + if (pad_transn == 0x1F) { + pad_transn = 5; + } + + hw->DEVICE.PADCAL.bit.TRANSN = pad_transn; + + pad_transp = (USB_FUSES_TRANSP_ADDR >> USB_FUSES_TRANSP_Pos) & USB_FUSES_TRANSP_Msk; + if (pad_transp == 0x1F) { + pad_transp = 29; + } + + hw->DEVICE.PADCAL.bit.TRANSP = pad_transp; + + pad_trim = (USB_FUSES_TRIM_ADDR >> USB_FUSES_TRIM_Pos) & USB_FUSES_TRIM_Msk; + if (pad_trim == 0x07) { + pad_trim = 3; + } + + hw->DEVICE.PADCAL.bit.TRIM = pad_trim; + + /* Set the configuration */ + hw->DEVICE.CTRLA.bit.MODE = module_config->select_host_mode; + hw->DEVICE.CTRLA.bit.RUNSTDBY = module_config->run_in_standby; + hw->DEVICE.DESCADD.reg = (uint32_t)(&usb_descriptor_table.usb_endpoint_table[0]); + if (USB_SPEED_FULL == module_config->speed_mode) { + module_inst->hw->DEVICE.CTRLB.bit.SPDCONF = USB_DEVICE_CTRLB_SPDCONF_FS_Val; + } else if(USB_SPEED_LOW == module_config->speed_mode) { + module_inst->hw->DEVICE.CTRLB.bit.SPDCONF = USB_DEVICE_CTRLB_SPDCONF_LS_Val; + } + + memset((uint8_t *)(&usb_descriptor_table.usb_endpoint_table[0]), 0, + sizeof(usb_descriptor_table.usb_endpoint_table)); + + /* device callback related */ + for (i = 0; i < USB_DEVICE_CALLBACK_N; i++) { + module_inst->device_callback[i] = NULL; + } + for (i = 0; i < USB_EPT_NUM; i++) { + for(j = 0; j < USB_DEVICE_EP_CALLBACK_N; j++) { + module_inst->device_endpoint_callback[i][j] = NULL; + } + } + module_inst->device_registered_callback_mask = 0; + module_inst->device_enabled_callback_mask = 0; + for (j = 0; j < USB_EPT_NUM; j++) { + module_inst->device_endpoint_registered_callback_mask[j] = 0; + module_inst->device_endpoint_enabled_callback_mask[j] = 0; + } + + /* Enable interrupts for this USB module */ + NVIC_EnableIRQ(USB_0_IRQn); + NVIC_EnableIRQ(USB_2_IRQn); + NVIC_EnableIRQ(USB_3_IRQn); + + return STATUS_OK; +} + diff --git a/tmk_core/protocol/arm_atsam/usb/usb.h b/tmk_core/protocol/arm_atsam/usb/usb.h new file mode 100644 index 000000000..9a452881a --- /dev/null +++ b/tmk_core/protocol/arm_atsam/usb/usb.h @@ -0,0 +1,492 @@ +/** + * \file + * + * \brief SAM USB Driver + * + * Copyright (C) 2014-2016 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef USB_H_INCLUDED +#define USB_H_INCLUDED + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \defgroup asfdoc_sam0_usb_group SAM Universal Serial Bus (USB) + * + * The Universal Serial Bus (USB) module complies with the USB 2.1 specification. + * + * The following peripherals are used by this module: + * - USB (Universal Serial Bus) + * + * The following devices can use this module: + * - Atmel | SMART SAM D51 + * + * The USB module covers following mode: + * \if USB_DEVICE_MODE + * - USB Device Mode + * \endif + * \if USB_HOST_MODE + * - USB Host Mode + * \endif + * + * The USB module covers following speed: + * \if USB_HS_MODE + * - USB High Speed (480Mbit/s) + * \endif + * - USB Full Speed (12Mbit/s) + * \if USB_LS_MODE + * - USB Low Speed (1.5Mbit/s) + * \endif + * + * \if USB_LPM_MODE + * The USB module supports Link Power Management (LPM-L1) protocol. + * \endif + * + * USB support needs whole set of enumeration process, to make the device + * recognizable and usable. The USB driver is designed to interface to the + * USB Stack in Atmel Software Framework (ASF). + * + * \if USB_DEVICE_MODE + * \section asfdoc_sam0_usb_device USB Device Mode + * The ASF USB Device Stack has defined the USB Device Driver (UDD) interface, + * to support USB device operations. The USB module device driver complies with + * this interface, so that the USB Device Stack can work based on the + * USB module. + * + * Refer to + * "ASF - USB Device Stack" for more details. + * \endif + * + * \if USB_HOST_MODE + * \section adfdoc_sam0_usb_host USB Host Mode + * The ASF USB Host Stack has defined the USB Host Driver (UHD) interface, + * to support USB host operations. The USB module host driver complies with + * this interface, so that the USB Host Stack can work based on the USB module. + * + * Refer to + * "ASF - USB Host Stack" for more details. + * \endif + */ + +/** Enum for the speed status for the USB module */ +enum usb_speed { + USB_SPEED_LOW, + USB_SPEED_FULL, +}; + +/** Enum for the possible callback types for the USB in host module */ +enum usb_host_callback { + USB_HOST_CALLBACK_SOF, + USB_HOST_CALLBACK_RESET, + USB_HOST_CALLBACK_WAKEUP, + USB_HOST_CALLBACK_DNRSM, + USB_HOST_CALLBACK_UPRSM, + USB_HOST_CALLBACK_RAMACER, + USB_HOST_CALLBACK_CONNECT, + USB_HOST_CALLBACK_DISCONNECT, + USB_HOST_CALLBACK_N, +}; + +/** Enum for the possible callback types for the USB pipe in host module */ +enum usb_host_pipe_callback { + USB_HOST_PIPE_CALLBACK_TRANSFER_COMPLETE, + USB_HOST_PIPE_CALLBACK_ERROR, + USB_HOST_PIPE_CALLBACK_SETUP, + USB_HOST_PIPE_CALLBACK_STALL, + USB_HOST_PIPE_CALLBACK_N, +}; + +/** + * \brief Host pipe types. + */ +enum usb_host_pipe_type { + USB_HOST_PIPE_TYPE_DISABLE, + USB_HOST_PIPE_TYPE_CONTROL, + USB_HOST_PIPE_TYPE_ISO, + USB_HOST_PIPE_TYPE_BULK, + USB_HOST_PIPE_TYPE_INTERRUPT, + USB_HOST_PIPE_TYPE_EXTENDED, +}; + +/** + * \brief Host pipe token types. + */ +enum usb_host_pipe_token { + USB_HOST_PIPE_TOKEN_SETUP, + USB_HOST_PIPE_TOKEN_IN, + USB_HOST_PIPE_TOKEN_OUT, +}; + +/** + * \brief Enumeration for the possible callback types for the USB in device module + */ +enum usb_device_callback { + USB_DEVICE_CALLBACK_SOF, + USB_DEVICE_CALLBACK_RESET, + USB_DEVICE_CALLBACK_WAKEUP, + USB_DEVICE_CALLBACK_RAMACER, + USB_DEVICE_CALLBACK_SUSPEND, + USB_DEVICE_CALLBACK_LPMNYET, + USB_DEVICE_CALLBACK_LPMSUSP, + USB_DEVICE_CALLBACK_N, +}; + +/** + * \brief Enumeration for the possible callback types for the USB endpoint in device module + */ +enum usb_device_endpoint_callback { + USB_DEVICE_ENDPOINT_CALLBACK_TRCPT, + USB_DEVICE_ENDPOINT_CALLBACK_TRFAIL, + USB_DEVICE_ENDPOINT_CALLBACK_RXSTP, + USB_DEVICE_ENDPOINT_CALLBACK_STALL, + USB_DEVICE_EP_CALLBACK_N, +}; + +/** + * \brief Device Endpoint types. + */ +enum usb_device_endpoint_type { + USB_DEVICE_ENDPOINT_TYPE_DISABLE, + USB_DEVICE_ENDPOINT_TYPE_CONTROL, + USB_DEVICE_ENDPOINT_TYPE_ISOCHRONOUS, + USB_DEVICE_ENDPOINT_TYPE_BULK, + USB_DEVICE_ENDPOINT_TYPE_INTERRUPT, +}; + +/** + * \brief Endpoint Size + */ +enum usb_endpoint_size { + USB_ENDPOINT_8_BYTE, + USB_ENDPOINT_16_BYTE, + USB_ENDPOINT_32_BYTE, + USB_ENDPOINT_64_BYTE, + USB_ENDPOINT_128_BYTE, + USB_ENDPOINT_256_BYTE, + USB_ENDPOINT_512_BYTE, + USB_ENDPOINT_1023_BYTE, +}; + +/** + * \brief Link Power Management Handshake. + */ +enum usb_device_lpm_mode { + USB_DEVICE_LPM_NOT_SUPPORT, + USB_DEVICE_LPM_ACK, + USB_DEVICE_LPM_NYET, +}; + +/** + * \brief Module structure + */ +struct usb_module; + +/** + * \name Host Callback Functions Types + * @{ + */ +typedef void (*usb_host_callback_t)(struct usb_module *module_inst); +typedef void (*usb_host_pipe_callback_t)(struct usb_module *module_inst, void *); +/** @} */ + +/** + * \name Device Callback Functions Types + * @{ + */ +typedef void (*usb_device_callback_t)(struct usb_module *module_inst, void* pointer); +typedef void (*usb_device_endpoint_callback_t)(struct usb_module *module_inst, void* pointer); +/** @} */ + +/** USB configurations */ +struct usb_config { + /** \c true for host, \c false for device. */ + bool select_host_mode; + /** When \c true the module is enabled during standby. */ + bool run_in_standby; + /** Generic Clock Generator source channel. */ + // enum gclk_generator source_generator; + uint8_t source_generator; + /** Speed mode */ + //enum usb_speed speed_mode; + uint8_t speed_mode; +}; + +/** + * \brief USB software module instance structure. + * + * USB software module instance structure, used to retain software state + * information of an associated hardware module instance. + * + */ +struct usb_module { + /** Hardware module pointer of the associated USB peripheral. */ + Usb *hw; + + /** Array to store device related callback functions */ + usb_device_callback_t device_callback[USB_DEVICE_CALLBACK_N]; + usb_device_endpoint_callback_t device_endpoint_callback[USB_EPT_NUM][USB_DEVICE_EP_CALLBACK_N]; + /** Bit mask for device callbacks registered */ + uint16_t device_registered_callback_mask; + /** Bit mask for device callbacks enabled */ + uint16_t device_enabled_callback_mask; + /** Bit mask for device endpoint callbacks registered */ + uint8_t device_endpoint_registered_callback_mask[USB_EPT_NUM]; + /** Bit mask for device endpoint callbacks enabled */ + uint8_t device_endpoint_enabled_callback_mask[USB_EPT_NUM]; +}; + +/** USB device endpoint configurations */ +struct usb_device_endpoint_config { + /** device address */ + uint8_t ep_address; + /** endpoint size */ + enum usb_endpoint_size ep_size; + /** automatic zero length packet mode, \c true to enable */ + bool auto_zlp; + /** type of endpoint with Bank */ + enum usb_device_endpoint_type ep_type; +}; + +/** USB device endpoint callback status parameter structure */ +struct usb_endpoint_callback_parameter { + uint16_t received_bytes; + uint16_t sent_bytes; + uint16_t out_buffer_size; + uint8_t endpoint_address; +}; + +void usb_enable(struct usb_module *module_inst); +void usb_disable(struct usb_module *module_inst); + +/** + * \brief Get the status of USB module's state machine + * + * \param module_inst Pointer to USB module instance + */ +static inline uint8_t usb_get_state_machine_status(struct usb_module *module_inst) +{ + /* Sanity check arguments */ + Assert(module_inst); + Assert(module_inst->hw); + + return module_inst->hw->DEVICE.FSMSTATUS.reg; +} + +void usb_get_config_defaults(struct usb_config *module_config); +enum status_code usb_init(struct usb_module *module_inst, Usb *const hw, + struct usb_config *module_config); + +/** + * \brief Attach USB device to the bus + * + * \param module_inst Pointer to USB device module instance + */ +static inline void usb_device_attach(struct usb_module *module_inst) +{ + module_inst->hw->DEVICE.CTRLB.reg &= ~USB_DEVICE_CTRLB_DETACH; +} + +/** + * \brief Detach USB device from the bus + * + * \param module_inst Pointer to USB device module instance + */ +static inline void usb_device_detach(struct usb_module *module_inst) +{ + module_inst->hw->DEVICE.CTRLB.reg |= USB_DEVICE_CTRLB_DETACH; +} + +/** + * \brief Get the speed mode of USB device + * + * \param module_inst Pointer to USB device module instance + * \return USB Speed mode (\ref usb_speed). + */ +static inline enum usb_speed usb_device_get_speed(struct usb_module *module_inst) +{ + if (!(module_inst->hw->DEVICE.STATUS.reg & USB_DEVICE_STATUS_SPEED_Msk)) { + return USB_SPEED_FULL; + } else { + return USB_SPEED_LOW; + } +} + +/** + * \brief Get the address of USB device + * + * \param module_inst Pointer to USB device module instance + * \return USB device address value. + */ +static inline uint8_t usb_device_get_address(struct usb_module *module_inst) +{ + return ((uint8_t)(module_inst->hw->DEVICE.DADD.bit.DADD)); +} + +/** + * \brief Set the speed mode of USB device + * + * \param module_inst Pointer to USB device module instance + * \param address USB device address value + */ +static inline void usb_device_set_address(struct usb_module *module_inst, uint8_t address) +{ + module_inst->hw->DEVICE.DADD.reg = USB_DEVICE_DADD_ADDEN | address; +} + +/** + * \brief Get the frame number of USB device + * + * \param module_inst Pointer to USB device module instance + * \return USB device frame number value. + */ +static inline uint16_t usb_device_get_frame_number(struct usb_module *module_inst) +{ + return ((uint16_t)(module_inst->hw->DEVICE.FNUM.bit.FNUM)); +} + +/** + * \brief Get the micro-frame number of USB device + * + * \param module_inst Pointer to USB device module instance + * \return USB device micro-frame number value. + */ +static inline uint16_t usb_device_get_micro_frame_number(struct usb_module *module_inst) +{ + return ((uint16_t)(module_inst->hw->DEVICE.FNUM.reg)); +} + +/** + * \brief USB device send the resume wakeup + * + * \param module_inst Pointer to USB device module instance + */ +static inline void usb_device_send_remote_wake_up(struct usb_module *module_inst) +{ + module_inst->hw->DEVICE.CTRLB.reg |= USB_DEVICE_CTRLB_UPRSM; +} + +/** + * \brief USB device set the LPM mode + * + * \param module_inst Pointer to USB device module instance + * \param lpm_mode LPM mode + */ +static inline void usb_device_set_lpm_mode(struct usb_module *module_inst, + enum usb_device_lpm_mode lpm_mode) +{ + module_inst->hw->DEVICE.CTRLB.bit.LPMHDSK = lpm_mode; +} + +/** + * \name USB Device Callback Management + * @{ + */ +enum status_code usb_device_register_callback(struct usb_module *module_inst, + enum usb_device_callback callback_type, + usb_device_callback_t callback_func); +enum status_code usb_device_unregister_callback(struct usb_module *module_inst, + enum usb_device_callback callback_type); +enum status_code usb_device_enable_callback(struct usb_module *module_inst, + enum usb_device_callback callback_type); +enum status_code usb_device_disable_callback(struct usb_module *module_inst, + enum usb_device_callback callback_type); +/** @} */ + +/** + * \name USB Device Endpoint Configuration + * @{ + */ +void usb_device_endpoint_get_config_defaults(struct usb_device_endpoint_config *ep_config); +enum status_code usb_device_endpoint_set_config(struct usb_module *module_inst, + struct usb_device_endpoint_config *ep_config); +bool usb_device_endpoint_is_configured(struct usb_module *module_inst, uint8_t ep); +/** @} */ + +/** + * \name USB Device Endpoint Callback Management + * @{ + */ +enum status_code usb_device_endpoint_register_callback( + struct usb_module *module_inst, uint8_t ep_num, + enum usb_device_endpoint_callback callback_type, + usb_device_endpoint_callback_t callback_func); +enum status_code usb_device_endpoint_unregister_callback( + struct usb_module *module_inst, uint8_t ep_num, + enum usb_device_endpoint_callback callback_type); +enum status_code usb_device_endpoint_enable_callback( + struct usb_module *module_inst, uint8_t ep, + enum usb_device_endpoint_callback callback_type); +enum status_code usb_device_endpoint_disable_callback( + struct usb_module *module_inst, uint8_t ep, + enum usb_device_endpoint_callback callback_type); +/** @} */ + +/** + * \name USB Device Endpoint Job Management + * @{ + */ +enum status_code usb_device_endpoint_write_buffer_job(struct usb_module *module_inst,uint8_t ep_num, + uint8_t* pbuf, uint32_t buf_size); +enum status_code usb_device_endpoint_read_buffer_job(struct usb_module *module_inst,uint8_t ep_num, + uint8_t* pbuf, uint32_t buf_size); +enum status_code usb_device_endpoint_setup_buffer_job(struct usb_module *module_inst, + uint8_t* pbuf); +void usb_device_endpoint_abort_job(struct usb_module *module_inst, uint8_t ep); +/** @} */ + +/** + * \name USB Device Endpoint Operations + * @{ + */ + +bool usb_device_endpoint_is_halted(struct usb_module *module_inst, uint8_t ep); +void usb_device_endpoint_set_halt(struct usb_module *module_inst, uint8_t ep); +void usb_device_endpoint_clear_halt(struct usb_module *module_inst, uint8_t ep); + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* USB_H_INCLUDED */ diff --git a/tmk_core/protocol/arm_atsam/usb/usb2422.c b/tmk_core/protocol/arm_atsam/usb/usb2422.c new file mode 100644 index 000000000..7c78e41d4 --- /dev/null +++ b/tmk_core/protocol/arm_atsam/usb/usb2422.c @@ -0,0 +1,412 @@ +/* +Copyright 2018 Massdrop Inc. + +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 . +*/ + +#include "arm_atsam_protocol.h" +#include + +Usb2422 USB2422_shadow; +unsigned char i2c0_buf[34]; + +const uint16_t MFRNAME[] = { 'M','a','s','s','d','r','o','p',' ','I','n','c','.' }; //Massdrop Inc. +const uint16_t PRDNAME[] = { 'M','a','s','s','d','r','o','p',' ','H','u','b' }; //Massdrop Hub +#ifndef MD_BOOTLOADER +//Serial number reported stops before first found space character or at last found character +const uint16_t SERNAME[] = { 'U','n','a','v','a','i','l','a','b','l','e' }; //Unavailable +#else +//In production, this field is found, modified, and offset noted as the last 32-bit word in the bootloader space +//The offset allows the application to use the factory programmed serial (which may differ from the physical serial label) +//Serial number reported stops before first found space character or when max size is reached +__attribute__((__aligned__(4))) +const uint16_t SERNAME[BOOTLOADER_SERIAL_MAX_SIZE] = { 'M','D','H','U','B','B','O','O','T','L','0','0','0','0','0','0','0','0','0','0' }; +//NOTE: Serial replacer will not write a string longer than given here as a precaution, so give enough +// space as needed and adjust BOOTLOADER_SERIAL_MAX_SIZE to match amount given +#endif //MD_BOOTLOADER + +uint8_t usb_host_port; + +#ifndef MD_BOOTLOADER + +uint8_t usb_extra_state; +uint8_t usb_extra_manual; +uint8_t usb_gcr_auto; + +#endif //MD_BOOTLOADER + +uint16_t adc_extra; + +void USB_write2422_block(void) +{ + unsigned char *dest = i2c0_buf; + unsigned char *src; + unsigned char *base = (unsigned char *)&USB2422_shadow; + + DBGC(DC_USB_WRITE2422_BLOCK_BEGIN); + + for (src = base; src < base + 256; src += 32) + { + dest[0] = src - base; + dest[1] = 32; + memcpy(&dest[2], src, 32); + i2c0_transmit(USB2422_ADDR, dest, 34, 50000); + SERCOM0->I2CM.CTRLB.bit.CMD = 0x03; + while (SERCOM0->I2CM.SYNCBUSY.bit.SYSOP) { DBGC(DC_USB_WRITE2422_BLOCK_SYNC_SYSOP); } + CLK_delay_us(100); + } + + DBGC(DC_USB_WRITE2422_BLOCK_COMPLETE); +} + +void USB2422_init(void) +{ + Gclk *pgclk = GCLK; + Mclk *pmclk = MCLK; + Port *pport = PORT; + Oscctrl *posc = OSCCTRL; + Usb *pusb = USB; + Srdata_t *pspi = &srdata; + + DBGC(DC_USB2422_INIT_BEGIN); + + while ((v_5v = adc_get(ADC_5V)) < ADC_5V_START_LEVEL) { DBGC(DC_USB2422_INIT_WAIT_5V_LOW); } + + //setup peripheral and synchronous bus clocks to USB + pgclk->PCHCTRL[10].bit.GEN = 0; + pgclk->PCHCTRL[10].bit.CHEN = 1; + pmclk->AHBMASK.bit.USB_ = 1; + pmclk->APBBMASK.bit.USB_ = 1; + + //setup port pins for D-, D+, and SOF_1KHZ + pport->Group[0].PMUX[12].reg = 0x77; //PA24, PA25, function column H for USB D-, D+ + pport->Group[0].PINCFG[24].bit.PMUXEN = 1; + pport->Group[0].PINCFG[25].bit.PMUXEN = 1; + pport->Group[1].PMUX[11].bit.PMUXE = 7; //PB22, function column H for USB SOF_1KHz output + pport->Group[1].PINCFG[22].bit.PMUXEN = 1; + + //configure and enable DFLL for USB clock recovery mode at 48MHz + posc->DFLLCTRLA.bit.ENABLE = 0; + while (posc->DFLLSYNC.bit.ENABLE) { DBGC(DC_USB2422_INIT_OSC_SYNC_DISABLING); } + while (posc->DFLLSYNC.bit.DFLLCTRLB) { DBGC(DC_USB2422_INIT_OSC_SYNC_DFLLCTRLB_1); } + posc->DFLLCTRLB.bit.USBCRM = 1; + while (posc->DFLLSYNC.bit.DFLLCTRLB) { DBGC(DC_USB2422_INIT_OSC_SYNC_DFLLCTRLB_2); } + posc->DFLLCTRLB.bit.MODE = 1; + while (posc->DFLLSYNC.bit.DFLLCTRLB) { DBGC(DC_USB2422_INIT_OSC_SYNC_DFLLCTRLB_3); } + posc->DFLLCTRLB.bit.QLDIS = 0; + while (posc->DFLLSYNC.bit.DFLLCTRLB) { DBGC(DC_USB2422_INIT_OSC_SYNC_DFLLCTRLB_4); } + posc->DFLLCTRLB.bit.CCDIS = 1; + posc->DFLLMUL.bit.MUL = 0xBB80; //4800 x 1KHz + while (posc->DFLLSYNC.bit.DFLLMUL) { DBGC(DC_USB2422_INIT_OSC_SYNC_DFLLMUL); } + posc->DFLLCTRLA.bit.ENABLE = 1; + while (posc->DFLLSYNC.bit.ENABLE) { DBGC(DC_USB2422_INIT_OSC_SYNC_ENABLING); } + + pusb->DEVICE.CTRLA.bit.SWRST = 1; + while (pusb->DEVICE.SYNCBUSY.bit.SWRST) { DBGC(DC_USB2422_INIT_USB_SYNC_SWRST); } + while (pusb->DEVICE.CTRLA.bit.SWRST) { DBGC(DC_USB2422_INIT_USB_WAIT_SWRST); } + //calibration from factory presets + pusb->DEVICE.PADCAL.bit.TRANSN = (USB_FUSES_TRANSN_ADDR >> USB_FUSES_TRANSN_Pos) & USB_FUSES_TRANSN_Msk; + pusb->DEVICE.PADCAL.bit.TRANSP = (USB_FUSES_TRANSP_ADDR >> USB_FUSES_TRANSP_Pos) & USB_FUSES_TRANSP_Msk; + pusb->DEVICE.PADCAL.bit.TRIM = (USB_FUSES_TRIM_ADDR >> USB_FUSES_TRIM_Pos) & USB_FUSES_TRIM_Msk; + //device mode, enabled + pusb->DEVICE.CTRLB.bit.SPDCONF = 0; //full speed + pusb->DEVICE.CTRLA.bit.MODE = 0; + pusb->DEVICE.CTRLA.bit.ENABLE = 1; + while (pusb->DEVICE.SYNCBUSY.bit.ENABLE) { DBGC(DC_USB2422_INIT_USB_SYNC_ENABLING); } + + pusb->DEVICE.QOSCTRL.bit.DQOS = 2; + pusb->DEVICE.QOSCTRL.bit.CQOS = 2; + + pport->Group[USB2422_HUB_ACTIVE_GROUP].PINCFG[USB2422_HUB_ACTIVE_PIN].bit.INEN = 1; + + i2c0_init(); //IC2 clk must be high at USB2422 reset release time to signal SMB configuration + + pspi->bit.HUB_CONNECT = 1; //connect signal + pspi->bit.HUB_RESET_N = 1; //reset high + SPI_WriteSRData(); + + CLK_delay_us(100); + +#ifndef MD_BOOTLOADER + + usb_extra_manual = 0; + usb_gcr_auto = 1; + +#endif //MD_BOOTLOADER + + DBGC(DC_USB2422_INIT_COMPLETE); +} + +void USB_reset(void) +{ + Srdata_t *pspi = &srdata; + + DBGC(DC_USB_RESET_BEGIN); + + //pulse reset for at least 1 usec + pspi->bit.HUB_RESET_N = 0; //reset low + SPI_WriteSRData(); + CLK_delay_us(1); + pspi->bit.HUB_RESET_N = 1; //reset high to run + SPI_WriteSRData(); + CLK_delay_us(1); + + DBGC(DC_USB_RESET_COMPLETE); +} + +void USB_configure(void) +{ + Usb2422 *pusb2422 = &USB2422_shadow; + memset(pusb2422, 0, sizeof(Usb2422)); + + uint16_t *serial_use = (uint16_t *)SERNAME; //Default to use SERNAME from this file + uint8_t serial_length = sizeof(SERNAME) / sizeof(uint16_t); //Default to use SERNAME from this file +#ifndef MD_BOOTLOADER + uint32_t serial_ptrloc = (uint32_t)&_srom - 4; +#else //MD_BOOTLOADER + uint32_t serial_ptrloc = (uint32_t)&_erom - 4; +#endif //MD_BOOTLOADER + uint32_t serial_address = *(uint32_t *)serial_ptrloc; //Address of bootloader's serial number if available + + DBGC(DC_USB_CONFIGURE_BEGIN); + + if (serial_address != 0xFFFFFFFF && serial_address < serial_ptrloc) //Check for factory programmed serial address + { + if ((serial_address & 0xFF) % 4 == 0) //Check alignment + { + serial_use = (uint16_t *)(serial_address); + serial_length = 0; + while ((*(serial_use + serial_length) > 32 && *(serial_use + serial_length) < 127) && + serial_length < BOOTLOADER_SERIAL_MAX_SIZE) + { + serial_length++; + DBGC(DC_USB_CONFIGURE_GET_SERIAL); + } + } + } + + //configure Usb2422 registers + pusb2422->VID.reg = 0x04D8; // from Microchip 4/19/2018 + pusb2422->PID.reg = 0xEEC5; // from Microchip 4/19/2018 = Massdrop, Inc. USB Hub + pusb2422->DID.reg = 0x0101; // BCD 01.01 + pusb2422->CFG1.bit.SELF_BUS_PWR = 1; // self powered for now + pusb2422->CFG1.bit.HS_DISABLE = 1; // full or high speed + //pusb2422->CFG2.bit.COMPOUND = 0; // compound device + pusb2422->CFG3.bit.STRING_EN = 1; // strings enabled + //pusb2422->NRD.bit.PORT2_NR = 0; // MCU is non-removable + pusb2422->MAXPB.reg = 20; // 0mA + pusb2422->HCMCB.reg = 20; // 0mA + pusb2422->MFRSL.reg = sizeof(MFRNAME) / sizeof(uint16_t); + pusb2422->PRDSL.reg = sizeof(PRDNAME) / sizeof(uint16_t); + pusb2422->SERSL.reg = serial_length; + memcpy(pusb2422->MFRSTR, MFRNAME, sizeof(MFRNAME)); + memcpy(pusb2422->PRDSTR, PRDNAME, sizeof(PRDNAME)); + memcpy(pusb2422->SERSTR, serial_use, serial_length * sizeof(uint16_t)); + //pusb2422->BOOSTUP.bit.BOOST=3; //upstream port + //pusb2422->BOOSTDOWN.bit.BOOST1=0; // extra port + //pusb2422->BOOSTDOWN.bit.BOOST2=2; //MCU is close + pusb2422->STCD.bit.USB_ATTACH = 1; + USB_write2422_block(); + + adc_extra = 0; + + DBGC(DC_USB_CONFIGURE_COMPLETE); +} + +uint16_t USB_active(void) +{ + return (PORT->Group[USB2422_HUB_ACTIVE_GROUP].IN.reg & (1 << USB2422_HUB_ACTIVE_PIN)) != 0; +} + +void USB_set_host_by_voltage(void) +{ + //UP is upstream device (HOST) + //DN1 is downstream device (EXTRA) + //DN2 is keyboard (KEYB) + + DBGC(DC_USB_SET_HOST_BY_VOLTAGE_BEGIN); + + usb_host_port = USB_HOST_PORT_UNKNOWN; +#ifndef MD_BOOTLOADER + usb_extra_state = USB_EXTRA_STATE_UNKNOWN; +#endif //MD_BOOTLOADER + srdata.bit.SRC_1 = 1; //USBC-1 available for test + srdata.bit.SRC_2 = 1; //USBC-2 available for test + srdata.bit.E_UP_N = 1; //HOST disable + srdata.bit.E_DN1_N = 1; //EXTRA disable + srdata.bit.E_VBUS_1 = 0; //USBC-1 disable full power I/O + srdata.bit.E_VBUS_2 = 0; //USBC-2 disable full power I/O + + SPI_WriteSRData(); + + CLK_delay_ms(250); + + while ((v_5v = adc_get(ADC_5V)) < ADC_5V_START_LEVEL) { DBGC(DC_USB_SET_HOST_5V_LOW_WAITING); } + + v_con_1 = adc_get(ADC_CON1); + v_con_2 = adc_get(ADC_CON2); + + v_con_1_boot = v_con_1; + v_con_2_boot = v_con_2; + + if (v_con_1 > v_con_2) + { + srdata.bit.S_UP = 0; //HOST to USBC-1 + srdata.bit.S_DN1 = 1; //EXTRA to USBC-2 + srdata.bit.SRC_1 = 1; //HOST on USBC-1 + srdata.bit.SRC_2 = 0; //EXTRA available on USBC-2 + + srdata.bit.E_VBUS_1 = 1; //USBC-1 enable full power I/O + srdata.bit.E_VBUS_2 = 0; //USBC-2 disable full power I/O + + SPI_WriteSRData(); + + srdata.bit.E_UP_N = 0; //HOST enable + + SPI_WriteSRData(); + + usb_host_port = USB_HOST_PORT_1; + } + else + { + srdata.bit.S_UP = 1; //EXTRA to USBC-1 + srdata.bit.S_DN1 = 0; //HOST to USBC-2 + srdata.bit.SRC_1 = 0; //EXTRA available on USBC-1 + srdata.bit.SRC_2 = 1; //HOST on USBC-2 + + srdata.bit.E_VBUS_1 = 0; //USBC-1 disable full power I/O + srdata.bit.E_VBUS_2 = 1; //USBC-2 enable full power I/O + + SPI_WriteSRData(); + + srdata.bit.E_UP_N = 0; //HOST enable + + SPI_WriteSRData(); + + usb_host_port = USB_HOST_PORT_2; + } + +#ifndef MD_BOOTLOADER + usb_extra_state = USB_EXTRA_STATE_DISABLED; +#endif //MD_BOOTLOADER + + USB_reset(); + USB_configure(); + + DBGC(DC_USB_SET_HOST_BY_VOLTAGE_COMPLETE); +} + +uint8_t USB2422_Port_Detect_Init(void) +{ + uint32_t port_detect_retry_ms; + uint32_t tmod; + + DBGC(DC_PORT_DETECT_INIT_BEGIN); + + USB_set_host_by_voltage(); + + port_detect_retry_ms = CLK_get_ms() + PORT_DETECT_RETRY_INTERVAL; + + while (!USB_active()) + { + tmod = CLK_get_ms() % PORT_DETECT_RETRY_INTERVAL; + + if (v_con_1 > v_con_2) //Values updated from USB_set_host_by_voltage(); + { + //1 flash for port 1 detected + if (tmod > 500 && tmod < 600) { led_on; } + else { led_off; } + } + else if (v_con_2 > v_con_1) //Values updated from USB_set_host_by_voltage(); + { + //2 flash for port 2 detected + if (tmod > 500 && tmod < 600) { led_on; } + else if (tmod > 700 && tmod < 800) { led_on; } + else { led_off; } + } + + if (CLK_get_ms() > port_detect_retry_ms) + { + DBGC(DC_PORT_DETECT_INIT_FAILED); + return 0; + } + } + + DBGC(DC_PORT_DETECT_INIT_COMPLETE); + + return 1; +} + +#ifndef MD_BOOTLOADER + +void USB_ExtraSetState(uint8_t state) +{ + uint8_t state_save = state; + + if (state == USB_EXTRA_STATE_DISABLED_UNTIL_REPLUG) + state = USB_EXTRA_STATE_DISABLED; + + if (usb_host_port == USB_HOST_PORT_1) srdata.bit.E_VBUS_2 = state; + else if (usb_host_port == USB_HOST_PORT_2) srdata.bit.E_VBUS_1 = state; + else return; + + srdata.bit.E_DN1_N = !state; + SPI_WriteSRData(); + + usb_extra_state = state_save; + + if (usb_extra_state == USB_EXTRA_STATE_ENABLED) CDC_print("USB: Extra enabled\r\n"); + else if (usb_extra_state == USB_EXTRA_STATE_DISABLED) + { + CDC_print("USB: Extra disabled\r\n"); + if (led_animation_breathing) gcr_breathe = gcr_desired; + } + else if (usb_extra_state == USB_EXTRA_STATE_DISABLED_UNTIL_REPLUG) CDC_print("USB: Extra disabled until replug\r\n"); + else CDC_print("USB: Extra state unknown\r\n"); +} + +void USB_HandleExtraDevice(void) +{ + uint16_t adcval; + + if (usb_host_port == USB_HOST_PORT_1) adcval = adc_get(ADC_CON2); + else if (usb_host_port == USB_HOST_PORT_2) adcval = adc_get(ADC_CON1); + else return; + + adc_extra = adc_extra * 0.9 + adcval * 0.1; + + //Check for a forced disable state (such as overload prevention) + if (usb_extra_state == USB_EXTRA_STATE_DISABLED_UNTIL_REPLUG) + { + //Detect unplug and reset state to disabled + if (adc_extra > USB_EXTRA_ADC_THRESHOLD) usb_extra_state = USB_EXTRA_STATE_DISABLED; + + return; //Return even if unplug detected + } + + if (usb_extra_manual) + { + if (usb_extra_state == USB_EXTRA_STATE_DISABLED) + USB_ExtraSetState(USB_EXTRA_STATE_ENABLED); + + return; + } + + //dpf("a %i %i\r\n",adcval, adc_extra); + if (usb_extra_state == USB_EXTRA_STATE_DISABLED && adc_extra < USB_EXTRA_ADC_THRESHOLD) USB_ExtraSetState(USB_EXTRA_STATE_ENABLED); + else if (usb_extra_state == USB_EXTRA_STATE_ENABLED && adc_extra > USB_EXTRA_ADC_THRESHOLD) USB_ExtraSetState(USB_EXTRA_STATE_DISABLED); +} + +#endif //MD_BOOTLOADER + diff --git a/tmk_core/protocol/arm_atsam/usb/usb2422.h b/tmk_core/protocol/arm_atsam/usb/usb2422.h new file mode 100644 index 000000000..6c763dd8c --- /dev/null +++ b/tmk_core/protocol/arm_atsam/usb/usb2422.h @@ -0,0 +1,405 @@ +/* +Copyright 2018 Massdrop Inc. + +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 . +*/ + +#ifndef _USB2422_H_ +#define _USB2422_H_ + +#define USB2422_ALT67_1P0 +#define REV_USB2422 0x100 + +#define USB2422_ADDR 0x58 //I2C device address, one instance + +#define USB2422_HUB_ACTIVE_GROUP 0 //PA +#define USB2422_HUB_ACTIVE_PIN 18 //18 + +/* -------- USB2422_VID : (USB2422L Offset: 0x00) (R/W 16) Vendor ID -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint16_t VID_LSB : 8; + uint16_t VID_MSB : 8; + } bit; /*!< Structure used for bit access */ + uint16_t reg; /*!< Type used for register access */ +} USB2422_VID_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/* -------- USB2422_PID : (USB2422L Offset: 0x02) (R/W 16) Product ID -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint16_t PID_LSB : 8; + uint16_t PID_MSB : 8; + } bit; /*!< Structure used for bit access */ + uint16_t reg; /*!< Type used for register access */ +} USB2422_PID_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/* -------- USB2422_DID : (USB2422L Offset: 0x04) (R/W 16) Device ID -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint16_t DID_LSB : 8; + uint16_t DID_MSB : 8; + } bit; /*!< Structure used for bit access */ + uint16_t reg; /*!< Type used for register access */ +} USB2422_DID_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/* -------- USB2422_CFG1 : (USB2422L Offset: 0x06) (R/W 8) Configuration Data Byte 1-------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t PORT_PWR : 1; + uint8_t CURRENT_SNS : 2; + uint8_t EOP_DISABLE : 1; + uint8_t MTT_ENABLE : 1; + uint8_t HS_DISABLE :1; + uint8_t :1; + uint8_t SELF_BUS_PWR : 1; + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} USB2422_CFG1_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/* -------- USB2422_CFG2 : (USB2422L Offset: 0x07) (R/W 8) Configuration Data Byte 2-------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t : 3; + uint8_t COMPOUND : 1; + uint8_t OC_TIMER :2; + uint8_t :1; + uint8_t DYNAMIC : 1; + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} USB2422_CFG2_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/* -------- USB2422_CFG3 : (USB2422L Offset: 0x08) (R/W 16) Configuration Data Byte 3-------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t STRING_EN : 1; + uint8_t :2; + uint8_t PRTMAP_EN :1; + uint8_t : 4; + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} USB2422_CFG3_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/* -------- USB2422_NRD : (USB2422L Offset: 0x09) (R/W 8) Non Removable Device -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t : 5; + uint8_t PORT2_NR :1; + uint8_t PORT1_NR :1; + uint8_t : 1; + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} USB2422_NRD_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/* -------- USB2422_PDS : (USB2422L Offset: 0x0A) (R/W 8) Port Diable for Self-Powered Operation -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t : 1; + uint8_t PORT1_DIS :1; + uint8_t PORT2_DIS :1; + uint8_t : 5; + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} USB2422_PDS_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/* -------- USB2422_PDB : (USB2422L Offset: 0x0B) (R/W 8) Port Diable for Bus-Powered Operation -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t : 1; + uint8_t PORT1_DIS :1; + uint8_t PORT2_DIS :1; + uint8_t : 5; + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} USB2422_PDB_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/* -------- USB2422_MAXPS : (USB2422L Offset: 0x0C) (R/W 8) Max Power for Self-Powered Operation -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t MAX_PWR_SP : 8; + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} USB2422_MAXPS_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/* -------- USB2422_MAXPB : (USB2422L Offset: 0x0D) (R/W 8) Max Power for Bus-Powered Operation -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t MAX_PWR_BP : 8; + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} USB2422_MAXPB_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/* -------- USB2422_HCMCS : (USB2422L Offset: 0x0E) (R/W 8) Hub Controller Max Current for Self-Powered Operation -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t HC_MAX_C_SP : 8; + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} USB2422_HCMCS_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/* -------- USB2422_HCMCB : (USB2422L Offset: 0x0F) (R/W 8) Hub Controller Max Current for Bus-Powered Operation -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t HC_MAX_C_BP : 8; + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} USB2422_HCMCB_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/* -------- USB2422_PWRT : (USB2422L Offset: 0x10) (R/W 8) Power On Time -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t POWER_ON_TIME : 8; + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} USB2422_PWRT_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/* -------- USB2422_LANGID LSB : (USB2422L Offset: 0x11) (R/W 16) Language ID -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t LANGID_LSB : 8; + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} USB2422_LANGID_LSB_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/* -------- USB2422_LANGID MSB : (USB2422L Offset: 0x12) (R/W 16) Language ID -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t LANGID_MSB : 8; + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} USB2422_LANGID_MSB_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + + +/* -------- USB2422_MFRSL : (USB2422L Offset: 0x13) (R/W 8) Manufacturer String Length -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t MFR_STR_LEN : 8; + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} USB2422_MFRSL_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/* -------- USB2422_PRDSL : (USB2422L Offset: 0x14) (R/W 8) Product String Length -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t PRD_STR_LEN : 8; + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} USB2422_PRDSL_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/* -------- USB2422_SERSL : (USB2422L Offset: 0x15) (R/W 8) Serial String Length -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t SER_STR_LEN : 8; + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} USB2422_SERSL_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/* -------- USB2422_MFRSTR : (USB2422L Offset: 0x16-53) (R/W 8) Maufacturer String -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef uint16_t USB2422_MFRSTR_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/* -------- USB2422_PRDSTR : (USB2422L Offset: 0x54-91) (R/W 8) Product String -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef uint16_t USB2422_PRDSTR_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/* -------- USB2422_SERSTR : (USB2422L Offset: 0x92-CF) (R/W 8) Serial String -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef uint16_t USB2422_SERSTR_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/* -------- USB2422_BCEN : (USB2422L Offset: 0xD0) (R/W 8) Battery Charging Enable -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t : 1; + uint8_t PORT1_BCE :1; + uint8_t PORT2_BCE :1; + uint8_t : 5; + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} USB2422_BCEN_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/* -------- USB2422_BOOSTUP : (USB2422L Offset: 0xF6) (R/W 8) Boost Upstream -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t BOOST :2; + uint8_t : 6; + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} USB2422_BOOSTUP_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/* -------- USB2422_BOOSTDOWN : (USB2422L Offset: 0xF8) (R/W 8) Boost Downstream -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t BOOST1 :2; + uint8_t BOOST2 :2; + uint8_t : 4; + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} USB2422_BOOSTDOWN_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/* -------- USB2422_PRTSP : (USB2422L Offset: 0xFA) (R/W 8) Port Swap -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t : 1; + uint8_t PORT1_SP :1; + uint8_t PORT2_SP :1; + uint8_t : 5; + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} USB2422_PRTSP_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/* -------- USB2422_PRTR12 : (USB2422L Offset: 0xFB) (R/W 8) Port 1/2 Remap -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t PORT1_REMAP: 4; + uint8_t PORT2_REMAP: 4; + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} USB2422_PRTR12_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ +#define USB2422_PRTR12_DISABLE 0 +#define USB2422_PRT12_P2TOL1 1 +#define USB2422_PRT12_P2XTOL2 2 +#define USB2422_PRT12_P1TOL1 1 +#define USB2422_PRT12_P1XTOL2 2 + +/* -------- USB2422_STCD : (USB2422L Offset: 0xFF) (R/W 8) Status Command -------- */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef union { + struct { + uint8_t USB_ATTACH: 1; + uint8_t RESET: 1; + uint8_t INTF_PWRDN: 1; + uint8_t : 5; + } bit; /*!< Structure used for bit access */ + uint8_t reg; /*!< Type used for register access */ +} USB2422_STCD_Type; +#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */ + +/** \brief USB2422 device hardware registers */ +#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) +typedef struct { + USB2422_VID_Type VID; /**< \brief Offset: 0x00*/ + USB2422_PID_Type PID; /**< \brief Offset: 0x02*/ + USB2422_DID_Type DID; /**< \brief Offset: 0x04*/ + USB2422_CFG1_Type CFG1; /**< \brief Offset: 0x06*/ + USB2422_CFG2_Type CFG2; /**< \brief Offset: 0x07*/ + USB2422_CFG3_Type CFG3; /**< \brief Offset: 0x08*/ + USB2422_NRD_Type NRD; /**< \brief Offset: 0x09*/ + USB2422_PDS_Type PDS; /**< \brief Offset: 0x0A*/ + USB2422_PDB_Type PDB; /**< \brief Offset: 0x0B*/ + USB2422_MAXPS_Type MAXPS; /**< \brief Offset: 0x0C*/ + USB2422_MAXPB_Type MAXPB; /**< \brief Offset: 0x0D*/ + USB2422_HCMCS_Type HCMCS; /**< \brief Offset: 0x0E*/ + USB2422_HCMCB_Type HCMCB; /**< \brief Offset: 0x0F*/ + USB2422_PWRT_Type PWRT; /**< \brief Offset: 0x10*/ + USB2422_LANGID_LSB_Type LANGID_LSB; /**< \brief Offset: 0x11*/ + USB2422_LANGID_MSB_Type LANGID_MSB; /**< \brief Offset: 0x12*/ + USB2422_MFRSL_Type MFRSL; /**< \brief Offset: 0x13*/ + USB2422_PRDSL_Type PRDSL; /**< \brief Offset: 0x14*/ + USB2422_SERSL_Type SERSL; /**< \brief Offset: 0x15*/ + USB2422_MFRSTR_Type MFRSTR[31]; /**< \brief Offset: 0x16*/ + USB2422_PRDSTR_Type PRDSTR[31]; /**< \brief Offset: 0x54*/ + USB2422_SERSTR_Type SERSTR[31]; /**< \brief Offset: 0x92*/ + USB2422_BCEN_Type BCEN; /**< \brief Offset: 0xD0*/ + uint8_t Reserved1[0x25]; + USB2422_BOOSTUP_Type BOOSTUP; /**< \brief Offset: 0xF6*/ + uint8_t Reserved2[0x1]; + USB2422_BOOSTDOWN_Type BOOSTDOWN; /**< \brief Offset: 0xF8*/ + uint8_t Reserved3[0x1]; + USB2422_PRTSP_Type PRTSP; /**< \brief Offset: 0xFA*/ + USB2422_PRTR12_Type PRTR12; /**< \brief Offset: 0xFB*/ + uint8_t Reserved4[0x3]; + USB2422_STCD_Type STCD; /**< \brief Offset: 0xFF*/ +} Usb2422; +#endif + +#define PORT_DETECT_RETRY_INTERVAL 2000 + +#define USB_EXTRA_ADC_THRESHOLD 900 + +#define USB_EXTRA_STATE_DISABLED 0 +#define USB_EXTRA_STATE_ENABLED 1 +#define USB_EXTRA_STATE_UNKNOWN 2 +#define USB_EXTRA_STATE_DISABLED_UNTIL_REPLUG 3 + +#define USB_HOST_PORT_1 0 +#define USB_HOST_PORT_2 1 +#define USB_HOST_PORT_UNKNOWN 2 + +extern uint8_t usb_host_port; +extern uint8_t usb_extra_state; +extern uint8_t usb_extra_manual; +extern uint8_t usb_gcr_auto; + +void USB2422_init(void); +void USB_reset(void); +void USB_configure(void); +uint16_t USB_active(void); +void USB_set_host_by_voltage(void); +uint16_t adc_get(uint8_t muxpos); +uint8_t USB2422_Port_Detect_Init(void); +void USB_HandleExtraDevice(void); +void USB_ExtraSetState(uint8_t state); + +#endif //_USB2422_H_ + diff --git a/tmk_core/protocol/arm_atsam/usb/usb_atmel.h b/tmk_core/protocol/arm_atsam/usb/usb_atmel.h new file mode 100644 index 000000000..7febdc9ec --- /dev/null +++ b/tmk_core/protocol/arm_atsam/usb/usb_atmel.h @@ -0,0 +1,190 @@ +/** + * \file + * + * \brief All USB VIDs and PIDs from Atmel USB applications + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _USB_ATMEL_H_ +#define _USB_ATMEL_H_ + +/** + * \defgroup usb_group USB Stack + * + * This stack includes the USB Device Stack, USB Host Stack and common + * definitions. + * @{ + */ + +//! @} + +/** + * \ingroup usb_group + * \defgroup usb_atmel_ids_group Atmel USB Identifiers + * + * This module defines Atmel PID and VIDs constants. + * + * @{ + */ + +//! \name Vendor Identifier assigned by USB org to ATMEL +#define USB_VID_ATMEL 0x03EB + +//! \name Product Identifier assigned by ATMEL to AVR applications +//! @{ + +//! \name The range from 2000h to 20FFh is reserved to the old PID for C51, MEGA, and others. +//! @{ +#define USB_PID_ATMEL_MEGA_HIDGENERIC 0x2013 +#define USB_PID_ATMEL_MEGA_HIDKEYBOARD 0x2017 +#define USB_PID_ATMEL_MEGA_CDC 0x2018 +#define USB_PID_ATMEL_MEGA_AUDIO_IN 0x2019 +#define USB_PID_ATMEL_MEGA_MS 0x201A +#define USB_PID_ATMEL_MEGA_AUDIO_IN_OUT 0x201B +#define USB_PID_ATMEL_MEGA_HIDMOUSE 0x201C +#define USB_PID_ATMEL_MEGA_HIDMOUSE_CERTIF_U4 0x201D +#define USB_PID_ATMEL_MEGA_CDC_MULTI 0x201E +#define USB_PID_ATMEL_MEGA_MS_HIDMS_HID_USBKEY 0x2022 +#define USB_PID_ATMEL_MEGA_MS_HIDMS_HID_STK525 0x2023 +#define USB_PID_ATMEL_MEGA_MS_2 0x2029 +#define USB_PID_ATMEL_MEGA_MS_HIDMS 0x202A +#define USB_PID_ATMEL_MEGA_MS_3 0x2032 +#define USB_PID_ATMEL_MEGA_LIBUSB 0x2050 +//! @} + +//! \name The range 2100h to 21FFh is reserved to PIDs for AVR Tools. +//! @{ +#define USB_PID_ATMEL_XPLAINED 0x2122 +#define USB_PID_ATMEL_XMEGA_USB_ZIGBIT_2_4GHZ 0x214A +#define USB_PID_ATMEL_XMEGA_USB_ZIGBIT_SUBGHZ 0x214B +//! @} + +//! \name The range 2300h to 23FFh is reserved to PIDs for demo from ASF1.7=> +//! @{ +#define USB_PID_ATMEL_UC3_ENUM 0x2300 +#define USB_PID_ATMEL_UC3_MS 0x2301 +#define USB_PID_ATMEL_UC3_MS_SDRAM_LOADER 0x2302 +#define USB_PID_ATMEL_UC3_EVK1100_CTRLPANEL 0x2303 +#define USB_PID_ATMEL_UC3_HID 0x2304 +#define USB_PID_ATMEL_UC3_EVK1101_CTRLPANEL_HID 0x2305 +#define USB_PID_ATMEL_UC3_EVK1101_CTRLPANEL_HID_MS 0x2306 +#define USB_PID_ATMEL_UC3_CDC 0x2307 +#define USB_PID_ATMEL_UC3_AUDIO_MICRO 0x2308 +#define USB_PID_ATMEL_UC3_CDC_DEBUG 0x2310 // Virtual Com (debug interface) on EVK11xx +#define USB_PID_ATMEL_UC3_AUDIO_SPEAKER_MICRO 0x2311 +#define USB_PID_ATMEL_UC3_CDC_MSC 0x2312 +//! @} + +//! \name The range 2400h to 24FFh is reserved to PIDs for ASF applications +//! @{ +#define USB_PID_ATMEL_ASF_HIDMOUSE 0x2400 +#define USB_PID_ATMEL_ASF_HIDKEYBOARD 0x2401 +#define USB_PID_ATMEL_ASF_HIDGENERIC 0x2402 +#define USB_PID_ATMEL_ASF_MSC 0x2403 +#define USB_PID_ATMEL_ASF_CDC 0x2404 +#define USB_PID_ATMEL_ASF_PHDC 0x2405 +#define USB_PID_ATMEL_ASF_HIDMTOUCH 0x2406 +#define USB_PID_ATMEL_ASF_MSC_HIDMOUSE 0x2420 +#define USB_PID_ATMEL_ASF_MSC_HIDS_CDC 0x2421 +#define USB_PID_ATMEL_ASF_MSC_HIDKEYBOARD 0x2422 +#define USB_PID_ATMEL_ASF_VENDOR_CLASS 0x2423 +#define USB_PID_ATMEL_ASF_MSC_CDC 0x2424 +#define USB_PID_ATMEL_ASF_TWO_CDC 0x2425 +#define USB_PID_ATMEL_ASF_SEVEN_CDC 0x2426 +#define USB_PID_ATMEL_ASF_XPLAIN_BC_POWERONLY 0x2430 +#define USB_PID_ATMEL_ASF_XPLAIN_BC_TERMINAL 0x2431 +#define USB_PID_ATMEL_ASF_XPLAIN_BC_TOUCH 0x2432 +#define USB_PID_ATMEL_ASF_AUDIO_SPEAKER 0x2433 +#define USB_PID_ATMEL_ASF_XMEGA_B1_XPLAINED 0x2434 +//! @} + +//! \name The range 2F00h to 2FFFh is reserved to official PIDs for AVR bootloaders +//! Note, !!!! don't use this range for demos or examples !!!! +//! @{ +#define USB_PID_ATMEL_DFU_ATXMEGA64C3 0x2FD6 +#define USB_PID_ATMEL_DFU_ATXMEGA128C3 0x2FD7 +#define USB_PID_ATMEL_DFU_ATXMEGA16C4 0x2FD8 +#define USB_PID_ATMEL_DFU_ATXMEGA32C4 0x2FD9 +#define USB_PID_ATMEL_DFU_ATXMEGA256C3 0x2FDA +#define USB_PID_ATMEL_DFU_ATXMEGA384C3 0x2FDB +#define USB_PID_ATMEL_DFU_ATUCL3_L4 0x2FDC +#define USB_PID_ATMEL_DFU_ATXMEGA64A4U 0x2FDD +#define USB_PID_ATMEL_DFU_ATXMEGA128A4U 0x2FDE + +#define USB_PID_ATMEL_DFU_ATXMEGA64B3 0x2FDF +#define USB_PID_ATMEL_DFU_ATXMEGA128B3 0x2FE0 +#define USB_PID_ATMEL_DFU_ATXMEGA64B1 0x2FE1 +#define USB_PID_ATMEL_DFU_ATXMEGA256A3BU 0x2FE2 +#define USB_PID_ATMEL_DFU_ATXMEGA16A4U 0x2FE3 +#define USB_PID_ATMEL_DFU_ATXMEGA32A4U 0x2FE4 +#define USB_PID_ATMEL_DFU_ATXMEGA64A3U 0x2FE5 +#define USB_PID_ATMEL_DFU_ATXMEGA128A3U 0x2FE6 +#define USB_PID_ATMEL_DFU_ATXMEGA192A3U 0x2FE7 +#define USB_PID_ATMEL_DFU_ATXMEGA64A1U 0x2FE8 +#define USB_PID_ATMEL_DFU_ATUC3D 0x2FE9 +#define USB_PID_ATMEL_DFU_ATXMEGA128B1 0x2FEA +#define USB_PID_ATMEL_DFU_AT32UC3C 0x2FEB +#define USB_PID_ATMEL_DFU_ATXMEGA256A3U 0x2FEC +#define USB_PID_ATMEL_DFU_ATXMEGA128A1U 0x2FED +#define USB_PID_ATMEL_DFU_ATMEGA8U2 0x2FEE +#define USB_PID_ATMEL_DFU_ATMEGA16U2 0x2FEF +#define USB_PID_ATMEL_DFU_ATMEGA32U2 0x2FF0 +#define USB_PID_ATMEL_DFU_AT32UC3A3 0x2FF1 +#define USB_PID_ATMEL_DFU_ATMEGA32U6 0x2FF2 +#define USB_PID_ATMEL_DFU_ATMEGA16U4 0x2FF3 +#define USB_PID_ATMEL_DFU_ATMEGA32U4 0x2FF4 +#define USB_PID_ATMEL_DFU_AT32AP7200 0x2FF5 +#define USB_PID_ATMEL_DFU_AT32UC3B 0x2FF6 +#define USB_PID_ATMEL_DFU_AT90USB82 0x2FF7 +#define USB_PID_ATMEL_DFU_AT32UC3A 0x2FF8 +#define USB_PID_ATMEL_DFU_AT90USB64 0x2FF9 +#define USB_PID_ATMEL_DFU_AT90USB162 0x2FFA +#define USB_PID_ATMEL_DFU_AT90USB128 0x2FFB +// 2FFCh to 2FFFh used by C51 family products +//! @} + +//! @} + +//! @} + + +#endif // _USB_ATMEL_H_ diff --git a/tmk_core/protocol/arm_atsam/usb/usb_device_udd.c b/tmk_core/protocol/arm_atsam/usb/usb_device_udd.c new file mode 100644 index 000000000..b31256df7 --- /dev/null +++ b/tmk_core/protocol/arm_atsam/usb/usb_device_udd.c @@ -0,0 +1,1097 @@ +/** + * \file + * + * \brief USB Device wrapper layer for compliance with common driver UDD + * + * Copyright (C) 2014-2016 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#include "samd51j18a.h" +#include +#include + +// Get USB device configuration +#include "conf_usb.h" +#include "udd.h" +#include "usb.h" +#include "status_codes.h" + +/** + * \ingroup usb_device_group + * \defgroup usb_device_udd_group USB Device Driver Implement (UDD) + * USB low-level driver for USB device mode + * @{ + */ +// Check USB device configuration +#ifdef USB_DEVICE_HS_SUPPORT +# error The High speed mode is not supported on this part, please remove USB_DEVICE_HS_SUPPORT in conf_usb.h +#endif + +//Note: This driver is adapted for SAMD51 + +#ifndef UDC_REMOTEWAKEUP_LPM_ENABLE +#define UDC_REMOTEWAKEUP_LPM_ENABLE() +#endif +#ifndef UDC_REMOTEWAKEUP_LPM_DISABLE +#define UDC_REMOTEWAKEUP_LPM_DISABLE() +#endif +#ifndef UDC_SUSPEND_LPM_EVENT +#define UDC_SUSPEND_LPM_EVENT() +#endif + +/* for debug text */ +#ifdef USB_DEBUG +# define dbg_print printf +#else +# define dbg_print(...) +#endif + +/** Maximum size of a transfer in multi-packet mode */ +#define UDD_ENDPOINT_MAX_TRANS ((8*1024)-1) + +/** USB software device instance structure */ +struct usb_module usb_device; + +/** + * \name Clock management + * + * @{ + */ + +#define UDD_CLOCK_GEN 0 + +static inline void udd_wait_clock_ready(void) +{ + +} + +/** + * \name Power management + * + * @{ + */ +#define udd_sleep_mode(arg) +/** @} */ + +/** + * \name Control endpoint low level management routine. + * + * This function performs control endpoint management. + * It handles the SETUP/DATA/HANDSHAKE phases of a control transaction. + * + * @{ + */ + +/** + * \brief Buffer to store the data received on control endpoint (SETUP/OUT endpoint 0) + * + * Used to avoid a RAM buffer overflow in case of the payload buffer + * is smaller than control endpoint size + */ +UDC_BSS(4) +uint8_t udd_ctrl_buffer[USB_DEVICE_EP_CTRL_SIZE]; + +/** Bit definitions about endpoint control state machine for udd_ep_control_state */ +typedef enum { + UDD_EPCTRL_SETUP = 0, //!< Wait a SETUP packet + UDD_EPCTRL_DATA_OUT = 1, //!< Wait a OUT data packet + UDD_EPCTRL_DATA_IN = 2, //!< Wait a IN data packet + UDD_EPCTRL_HANDSHAKE_WAIT_IN_ZLP = 3, //!< Wait a IN ZLP packet + UDD_EPCTRL_HANDSHAKE_WAIT_OUT_ZLP = 4, //!< Wait a OUT ZLP packet + UDD_EPCTRL_STALL_REQ = 5, //!< STALL enabled on IN & OUT packet +} udd_ctrl_ep_state_t; + +/** Global variable to give and record information of the set up request management */ +udd_ctrl_request_t udd_g_ctrlreq; + +/** State of the endpoint control management */ +static udd_ctrl_ep_state_t udd_ep_control_state; + +/** Total number of data received/sent during data packet phase with previous payload buffers */ +static uint16_t udd_ctrl_prev_payload_nb_trans; + +/** Number of data received/sent to/from udd_g_ctrlreq.payload buffer */ +static uint16_t udd_ctrl_payload_nb_trans; + +/** @} */ + +/** + * \name Management of bulk/interrupt/isochronous endpoints + * + * The UDD manages the data transfer on endpoints: + * - Start data transfer on endpoint with USB Device DMA + * - Send a ZLP packet if requested + * - Call callback registered to signal end of transfer + * The transfer abort and stall feature are supported. + * + * @{ + */ + +/** + * \brief Buffer to store the data received on bulk/interrupt endpoints + * + * Used to avoid a RAM buffer overflow in case of the user buffer + * is smaller than endpoint size + * + * \warning The protected interrupt endpoint size is 512 bytes maximum. + * \warning The isochronous and endpoint is not protected by this system and + * the user must always use a buffer corresponding at endpoint size. + */ + +#if (defined USB_DEVICE_LOW_SPEED) +UDC_BSS(4) uint8_t udd_ep_out_cache_buffer[USB_DEVICE_MAX_EP][8]; +#elif (defined USB_DEVICE_HS_SUPPORT) +UDC_BSS(4) uint8_t udd_ep_out_cache_buffer[USB_DEVICE_MAX_EP][512]; +#else +UDC_BSS(4) uint8_t udd_ep_out_cache_buffer[USB_DEVICE_MAX_EP][64]; +#endif + +/** Structure definition about job registered on an endpoint */ +typedef struct { + union { + //! Callback to call at the end of transfer + udd_callback_trans_t call_trans; + //! Callback to call when the endpoint halt is cleared + udd_callback_halt_cleared_t call_nohalt; + }; + //! Buffer located in internal RAM to send or fill during job + uint8_t *buf; + //! Size of buffer to send or fill + iram_size_t buf_size; + //! Total number of data transferred on endpoint + iram_size_t nb_trans; + //! Endpoint size + uint16_t ep_size; + //! A job is registered on this endpoint + uint8_t busy:1; + //! A short packet is requested for this job on endpoint IN + uint8_t b_shortpacket:1; + //! The cache buffer is currently used on endpoint OUT + uint8_t b_use_out_cache_buffer:1; +} udd_ep_job_t; + +/** Array to register a job on bulk/interrupt/isochronous endpoint */ +static udd_ep_job_t udd_ep_job[2 * USB_DEVICE_MAX_EP]; + +/** @} */ + +/** + * \brief Get the detailed job by endpoint number + * \param[in] ep Endpoint Address + * \retval pointer to an udd_ep_job_t structure instance + */ +static udd_ep_job_t* udd_ep_get_job(udd_ep_id_t ep) +{ + if ((ep == 0) || (ep == 0x80)) { + return NULL; + } else { + return &udd_ep_job[(2 * (ep & USB_EP_ADDR_MASK) + ((ep & USB_EP_DIR_IN) ? 1 : 0)) - 2]; + } +} + +/** + * \brief Endpoint IN process, continue to send packets or zero length packet + * \param[in] pointer Pointer to the endpoint transfer status parameter struct from driver layer. + */ +static void udd_ep_trans_in_next(void* pointer) +{ + struct usb_endpoint_callback_parameter *ep_callback_para = (struct usb_endpoint_callback_parameter*)pointer; + udd_ep_id_t ep = ep_callback_para->endpoint_address; + uint16_t ep_size, nb_trans; + uint16_t next_trans; + udd_ep_id_t ep_num; + udd_ep_job_t *ptr_job; + + ptr_job = udd_ep_get_job(ep); + ep_num = ep & USB_EP_ADDR_MASK; + + ep_size = ptr_job->ep_size; + /* Update number of data transferred */ + nb_trans = ep_callback_para->sent_bytes; + ptr_job->nb_trans += nb_trans; + + /* Need to send other data */ + if (ptr_job->nb_trans != ptr_job->buf_size) { + next_trans = ptr_job->buf_size - ptr_job->nb_trans; + if (UDD_ENDPOINT_MAX_TRANS < next_trans) { + /* The USB hardware support a maximum + * transfer size of UDD_ENDPOINT_MAX_TRANS Bytes */ + next_trans = UDD_ENDPOINT_MAX_TRANS -(UDD_ENDPOINT_MAX_TRANS % ep_size); + } + /* Need ZLP, if requested and last packet is not a short packet */ + ptr_job->b_shortpacket = ptr_job->b_shortpacket && (0 == (next_trans % ep_size)); + usb_device_endpoint_write_buffer_job(&usb_device,ep_num,&ptr_job->buf[ptr_job->nb_trans],next_trans); + return; + } + + /* Need to send a ZLP after all data transfer */ + if (ptr_job->b_shortpacket) { + ptr_job->b_shortpacket = false; + /* Start new transfer */ + usb_device_endpoint_write_buffer_job(&usb_device,ep_num,&ptr_job->buf[ptr_job->nb_trans],0); + return; + } + + /* Job complete then call callback */ + ptr_job->busy = false; + if (NULL != ptr_job->call_trans) { + ptr_job->call_trans(UDD_EP_TRANSFER_OK, ptr_job->nb_trans, ep); + } +} + +/** + * \brief Endpoint OUT process, continue to receive packets or zero length packet + * \param[in] pointer Pointer to the endpoint transfer status parameter struct from driver layer. + */ +static void udd_ep_trans_out_next(void* pointer) +{ + struct usb_endpoint_callback_parameter *ep_callback_para = (struct usb_endpoint_callback_parameter*)pointer; + udd_ep_id_t ep = ep_callback_para->endpoint_address; + uint16_t ep_size, nb_trans; + uint16_t next_trans; + udd_ep_id_t ep_num; + udd_ep_job_t *ptr_job; + + ptr_job = udd_ep_get_job(ep); + ep_num = ep & USB_EP_ADDR_MASK; + + ep_size = ptr_job->ep_size; + /* Update number of data transferred */ + nb_trans = ep_callback_para->received_bytes; + + /* Can be necessary to copy data receive from cache buffer to user buffer */ + if (ptr_job->b_use_out_cache_buffer) { + memcpy(&ptr_job->buf[ptr_job->nb_trans], udd_ep_out_cache_buffer[ep_num - 1], ptr_job->buf_size % ep_size); + } + + /* Update number of data transferred */ + ptr_job->nb_trans += nb_trans; + if (ptr_job->nb_trans > ptr_job->buf_size) { + ptr_job->nb_trans = ptr_job->buf_size; + } + + /* If all previous data requested are received and user buffer not full + * then need to receive other data */ + if ((nb_trans == ep_callback_para->out_buffer_size) && (ptr_job->nb_trans != ptr_job->buf_size)) { + next_trans = ptr_job->buf_size - ptr_job->nb_trans; + if (UDD_ENDPOINT_MAX_TRANS < next_trans) { + /* The USB hardware support a maximum transfer size + * of UDD_ENDPOINT_MAX_TRANS Bytes */ + next_trans = UDD_ENDPOINT_MAX_TRANS - (UDD_ENDPOINT_MAX_TRANS % ep_size); + } else { + next_trans -= next_trans % ep_size; + } + + if (next_trans < ep_size) { + /* Use the cache buffer for Bulk or Interrupt size endpoint */ + ptr_job->b_use_out_cache_buffer = true; + usb_device_endpoint_read_buffer_job(&usb_device,ep_num,udd_ep_out_cache_buffer[ep_num - 1],ep_size); + } else { + usb_device_endpoint_read_buffer_job(&usb_device,ep_num,&ptr_job->buf[ptr_job->nb_trans],next_trans); + } + return; + } + + /* Job complete then call callback */ + ptr_job->busy = false; + if (NULL != ptr_job->call_trans) { + ptr_job->call_trans(UDD_EP_TRANSFER_OK, ptr_job->nb_trans, ep); + } +} + +/** + * \brief Endpoint Transfer Complete callback function, to do the next transfer depends on the direction(IN or OUT) + * \param[in] module_inst Pointer to USB module instance + * \param[in] pointer Pointer to the endpoint transfer status parameter struct from driver layer. + */ +static void udd_ep_transfer_process(struct usb_module *module_inst, void* pointer) +{ + struct usb_endpoint_callback_parameter *ep_callback_para = (struct usb_endpoint_callback_parameter*)pointer; + udd_ep_id_t ep = ep_callback_para->endpoint_address; + + if (ep & USB_EP_DIR_IN) { + udd_ep_trans_in_next(pointer); + } else { + udd_ep_trans_out_next(pointer); + } +} + +void udd_ep_abort(udd_ep_id_t ep) +{ + udd_ep_job_t *ptr_job; + + usb_device_endpoint_abort_job(&usb_device, ep); + + /* Job complete then call callback */ + ptr_job = udd_ep_get_job(ep); + if (!ptr_job->busy) { + return; + } + ptr_job->busy = false; + if (NULL != ptr_job->call_trans) { + /* It can be a Transfer or stall callback */ + ptr_job->call_trans(UDD_EP_TRANSFER_ABORT, ptr_job->nb_trans, ep); + } +} + +bool udd_is_high_speed(void) +{ + return false; +} + +uint16_t udd_get_frame_number(void) +{ + return usb_device_get_frame_number(&usb_device); +} + +uint16_t udd_get_micro_frame_number(void) +{ + return usb_device_get_micro_frame_number(&usb_device); +} + +void udd_ep_free(udd_ep_id_t ep) +{ + struct usb_device_endpoint_config config_ep; + usb_device_endpoint_get_config_defaults(&config_ep); + + uint8_t ep_num = ep & USB_EP_ADDR_MASK; + udd_ep_abort(ep); + + config_ep.ep_address = ep; + config_ep.ep_type = USB_DEVICE_ENDPOINT_TYPE_DISABLE; + usb_device_endpoint_set_config(&usb_device, &config_ep); + usb_device_endpoint_unregister_callback(&usb_device,ep_num,USB_DEVICE_ENDPOINT_CALLBACK_TRCPT); + usb_device_endpoint_disable_callback(&usb_device,ep,USB_DEVICE_ENDPOINT_CALLBACK_TRCPT); +} + +bool udd_ep_alloc(udd_ep_id_t ep, uint8_t bmAttributes, uint16_t MaxEndpointSize) +{ + struct usb_device_endpoint_config config_ep; + usb_device_endpoint_get_config_defaults(&config_ep); + + config_ep.ep_address = ep; + + if(MaxEndpointSize <= 8) { + config_ep.ep_size = USB_ENDPOINT_8_BYTE; + } else if(MaxEndpointSize <= 16) { + config_ep.ep_size = USB_ENDPOINT_16_BYTE; + } else if(MaxEndpointSize <= 32) { + config_ep.ep_size = USB_ENDPOINT_32_BYTE; + } else if(MaxEndpointSize <= 64) { + config_ep.ep_size = USB_ENDPOINT_64_BYTE; + } else if(MaxEndpointSize <= 128) { + config_ep.ep_size = USB_ENDPOINT_128_BYTE; + } else if(MaxEndpointSize <= 256) { + config_ep.ep_size = USB_ENDPOINT_256_BYTE; + } else if(MaxEndpointSize <= 512) { + config_ep.ep_size = USB_ENDPOINT_512_BYTE; + } else if(MaxEndpointSize <= 1023) { + config_ep.ep_size = USB_ENDPOINT_1023_BYTE; + } else { + return false; + } + udd_ep_job_t *ptr_job = udd_ep_get_job(ep); + ptr_job->ep_size = MaxEndpointSize; + + bmAttributes = bmAttributes & USB_EP_TYPE_MASK; + + /* Check endpoint type */ + if(USB_EP_TYPE_ISOCHRONOUS == bmAttributes) { + config_ep.ep_type = USB_DEVICE_ENDPOINT_TYPE_ISOCHRONOUS; + } else if (USB_EP_TYPE_BULK == bmAttributes) { + config_ep.ep_type = USB_DEVICE_ENDPOINT_TYPE_BULK; + } else if (USB_EP_TYPE_INTERRUPT == bmAttributes) { + config_ep.ep_type = USB_DEVICE_ENDPOINT_TYPE_INTERRUPT; + } else { + return false; + } + + uint8_t ep_num = ep & USB_EP_ADDR_MASK; + + if (STATUS_OK != usb_device_endpoint_set_config(&usb_device, &config_ep)) { + return false; + } + usb_device_endpoint_register_callback(&usb_device,ep_num,USB_DEVICE_ENDPOINT_CALLBACK_TRCPT,udd_ep_transfer_process); + usb_device_endpoint_enable_callback(&usb_device,ep,USB_DEVICE_ENDPOINT_CALLBACK_TRCPT); + usb_device_endpoint_enable_callback(&usb_device,ep,USB_DEVICE_ENDPOINT_CALLBACK_TRFAIL); + + return true; +} + +bool udd_ep_is_halted(udd_ep_id_t ep) +{ + return usb_device_endpoint_is_halted(&usb_device, ep); +} + +bool udd_ep_set_halt(udd_ep_id_t ep) +{ + uint8_t ep_num = ep & USB_EP_ADDR_MASK; + + if (USB_DEVICE_MAX_EP < ep_num) { + return false; + } + + usb_device_endpoint_set_halt(&usb_device, ep); + + udd_ep_abort(ep); + return true; +} + +bool udd_ep_clear_halt(udd_ep_id_t ep) +{ + udd_ep_job_t *ptr_job; + uint8_t ep_num = ep & USB_EP_ADDR_MASK; + + if (USB_DEVICE_MAX_EP < ep_num) { + return false; + } + ptr_job = udd_ep_get_job(ep); + + usb_device_endpoint_clear_halt(&usb_device, ep); + + /* If a job is register on clear halt action then execute callback */ + if (ptr_job->busy == true) { + ptr_job->busy = false; + ptr_job->call_nohalt(); + } + + return true; +} + +bool udd_ep_wait_stall_clear(udd_ep_id_t ep, udd_callback_halt_cleared_t callback) +{ + udd_ep_id_t ep_num; + udd_ep_job_t *ptr_job; + + ep_num = ep & USB_EP_ADDR_MASK; + if (USB_DEVICE_MAX_EP < ep_num) { + return false; + } + + ptr_job = udd_ep_get_job(ep); + if (ptr_job->busy == true) { + return false; /* Job already on going */ + } + + /* Wait clear halt endpoint */ + if (usb_device_endpoint_is_halted(&usb_device, ep)) { + /* Endpoint halted then registers the callback */ + ptr_job->busy = true; + ptr_job->call_nohalt = callback; + return true; + } else if (usb_device_endpoint_is_configured(&usb_device, ep)) { + callback(); /* Endpoint not halted then call directly callback */ + return true; + } else { + return false; + } +} + +/** + * \brief Control Endpoint stall sending data + */ +static void udd_ctrl_stall_data(void) +{ + udd_ep_control_state = UDD_EPCTRL_STALL_REQ; + + usb_device_endpoint_set_halt(&usb_device, USB_EP_DIR_IN); + usb_device_endpoint_clear_halt(&usb_device, USB_EP_DIR_OUT); +} + +bool udd_ep_run(udd_ep_id_t ep, bool b_shortpacket, uint8_t *buf, iram_size_t buf_size, udd_callback_trans_t callback) +{ + udd_ep_id_t ep_num; + udd_ep_job_t *ptr_job; + uint32_t irqflags; + + ep_num = ep & USB_EP_ADDR_MASK; + + if ((USB_DEVICE_MAX_EP < ep_num) || (udd_ep_is_halted(ep))) { + return false; + } + + ptr_job = udd_ep_get_job(ep); + + irqflags = __get_PRIMASK(); + __disable_irq(); + __DMB(); + + if (ptr_job->busy == true) { + __DMB(); + __set_PRIMASK(irqflags); + return false; /* Job already on going */ + } + + ptr_job->busy = true; + __DMB(); + __set_PRIMASK(irqflags); + + /* No job running, set up a new one */ + ptr_job->buf = buf; + ptr_job->buf_size = buf_size; + ptr_job->nb_trans = 0; + ptr_job->call_trans = callback; + ptr_job->b_shortpacket = b_shortpacket; + ptr_job->b_use_out_cache_buffer = false; + + /* Initialize value to simulate a empty transfer */ + uint16_t next_trans; + + if (ep & USB_EP_DIR_IN) { + if (0 != ptr_job->buf_size) { + next_trans = ptr_job->buf_size; + if (UDD_ENDPOINT_MAX_TRANS < next_trans) { + next_trans = UDD_ENDPOINT_MAX_TRANS - (UDD_ENDPOINT_MAX_TRANS % ptr_job->ep_size); + } + ptr_job->b_shortpacket = ptr_job->b_shortpacket && (0 == (next_trans % ptr_job->ep_size)); + } else if (true == ptr_job->b_shortpacket) { + ptr_job->b_shortpacket = false; /* avoid to send zero length packet again */ + next_trans = 0; + } else { + ptr_job->busy = false; + if (NULL != ptr_job->call_trans) { + ptr_job->call_trans(UDD_EP_TRANSFER_OK, 0, ep); + } + return true; + } + return (STATUS_OK == + usb_device_endpoint_write_buffer_job(&usb_device, + ep_num,&ptr_job->buf[0],next_trans)); + } else { + if (0 != ptr_job->buf_size) { + next_trans = ptr_job->buf_size; + if (UDD_ENDPOINT_MAX_TRANS < next_trans) { + /* The USB hardware support a maximum transfer size + * of UDD_ENDPOINT_MAX_TRANS Bytes */ + next_trans = UDD_ENDPOINT_MAX_TRANS - + (UDD_ENDPOINT_MAX_TRANS % ptr_job->ep_size); + } else { + next_trans -= next_trans % ptr_job->ep_size; + } + if (next_trans < ptr_job->ep_size) { + ptr_job->b_use_out_cache_buffer = true; + return (STATUS_OK == + usb_device_endpoint_read_buffer_job(&usb_device, ep_num, + udd_ep_out_cache_buffer[ep_num - 1], + ptr_job->ep_size)); + } else { + return (STATUS_OK == + usb_device_endpoint_read_buffer_job(&usb_device, ep_num, + &ptr_job->buf[0],next_trans)); + } + } else { + ptr_job->busy = false; + if (NULL != ptr_job->call_trans) { + ptr_job->call_trans(UDD_EP_TRANSFER_OK, 0, ep); + } + return true; + } + } +} + +void udd_set_address(uint8_t address) +{ + usb_device_set_address(&usb_device,address); +} + +uint8_t udd_getaddress(void) +{ + return usb_device_get_address(&usb_device); +} + +void udd_send_remotewakeup(void) +{ + uint32_t try = 5; + udd_wait_clock_ready(); + udd_sleep_mode(UDD_STATE_IDLE); + while(2 != usb_get_state_machine_status(&usb_device) && try --) { + usb_device_send_remote_wake_up(&usb_device); + } +} + +void udd_set_setup_payload( uint8_t *payload, uint16_t payload_size ) +{ + udd_g_ctrlreq.payload = payload; + udd_g_ctrlreq.payload_size = payload_size; +} + +/** + * \brief Control Endpoint translate the data in buffer into Device Request Struct + */ +static void udd_ctrl_fetch_ram(void) +{ + udd_g_ctrlreq.req.bmRequestType = udd_ctrl_buffer[0]; + udd_g_ctrlreq.req.bRequest = udd_ctrl_buffer[1]; + udd_g_ctrlreq.req.wValue = ((uint16_t)(udd_ctrl_buffer[3]) << 8) + udd_ctrl_buffer[2]; + udd_g_ctrlreq.req.wIndex = ((uint16_t)(udd_ctrl_buffer[5]) << 8) + udd_ctrl_buffer[4]; + udd_g_ctrlreq.req.wLength = ((uint16_t)(udd_ctrl_buffer[7]) << 8) + udd_ctrl_buffer[6]; +} + +/** + * \brief Control Endpoint send out zero length packet + */ +static void udd_ctrl_send_zlp_in(void) +{ + udd_ep_control_state = UDD_EPCTRL_HANDSHAKE_WAIT_IN_ZLP; + usb_device_endpoint_setup_buffer_job(&usb_device,udd_ctrl_buffer); + usb_device_endpoint_write_buffer_job(&usb_device,0,udd_g_ctrlreq.payload,0); +} + +/** + * \brief Process control endpoint IN transaction + */ +static void udd_ctrl_in_sent(void) +{ + static bool b_shortpacket = false; + uint16_t nb_remain; + + nb_remain = udd_g_ctrlreq.payload_size - udd_ctrl_payload_nb_trans; + + if (0 == nb_remain) { + /* All content of current buffer payload are sent Update number of total data sending by previous payload buffer */ + udd_ctrl_prev_payload_nb_trans += udd_ctrl_payload_nb_trans; + if ((udd_g_ctrlreq.req.wLength == udd_ctrl_prev_payload_nb_trans) || b_shortpacket) { + /* All data requested are transferred or a short packet has been sent, then it is the end of data phase. + * Generate an OUT ZLP for handshake phase */ + udd_ep_control_state = UDD_EPCTRL_HANDSHAKE_WAIT_OUT_ZLP; + usb_device_endpoint_setup_buffer_job(&usb_device,udd_ctrl_buffer); + return; + } + /* Need of new buffer because the data phase is not complete */ + if ((!udd_g_ctrlreq.over_under_run) || (!udd_g_ctrlreq.over_under_run())) { + /* Under run then send zlp on IN + * Here nb_remain=0, this allows to send a IN ZLP */ + } else { + /* A new payload buffer is given */ + udd_ctrl_payload_nb_trans = 0; + nb_remain = udd_g_ctrlreq.payload_size; + } + } + + /* Continue transfer and send next data */ + if (nb_remain >= USB_DEVICE_EP_CTRL_SIZE) { + nb_remain = USB_DEVICE_EP_CTRL_SIZE; + b_shortpacket = false; + } else { + b_shortpacket = true; + } + + /* Link payload buffer directly on USB hardware */ + usb_device_endpoint_write_buffer_job(&usb_device,0,udd_g_ctrlreq.payload + udd_ctrl_payload_nb_trans,nb_remain); + + udd_ctrl_payload_nb_trans += nb_remain; +} + +/** + * \brief Process control endpoint OUT transaction + * \param[in] pointer Pointer to the endpoint transfer status parameter struct from driver layer. + */ +static void udd_ctrl_out_received(void* pointer) +{ + struct usb_endpoint_callback_parameter *ep_callback_para = (struct usb_endpoint_callback_parameter*)pointer; + + uint16_t nb_data; + nb_data = ep_callback_para->received_bytes; /* Read data received during OUT phase */ + + if (udd_g_ctrlreq.payload_size < (udd_ctrl_payload_nb_trans + nb_data)) { + /* Payload buffer too small */ + nb_data = udd_g_ctrlreq.payload_size - udd_ctrl_payload_nb_trans; + } + + memcpy((uint8_t *) (udd_g_ctrlreq.payload + udd_ctrl_payload_nb_trans), udd_ctrl_buffer, nb_data); + udd_ctrl_payload_nb_trans += nb_data; + + if ((USB_DEVICE_EP_CTRL_SIZE != nb_data) || \ + (udd_g_ctrlreq.req.wLength <= (udd_ctrl_prev_payload_nb_trans + udd_ctrl_payload_nb_trans))) { + /* End of reception because it is a short packet + * or all data are transferred */ + + /* Before send ZLP, call intermediate callback + * in case of data receive generate a stall */ + udd_g_ctrlreq.payload_size = udd_ctrl_payload_nb_trans; + if (NULL != udd_g_ctrlreq.over_under_run) { + if (!udd_g_ctrlreq.over_under_run()) { + /* Stall ZLP */ + udd_ep_control_state = UDD_EPCTRL_STALL_REQ; + /* Stall all packets on IN & OUT control endpoint */ + udd_ep_set_halt(0); + /* Ack reception of OUT to replace NAK by a STALL */ + return; + } + } + /* Send IN ZLP to ACK setup request */ + udd_ctrl_send_zlp_in(); + return; + } + + if (udd_g_ctrlreq.payload_size == udd_ctrl_payload_nb_trans) { + /* Overrun then request a new payload buffer */ + if (!udd_g_ctrlreq.over_under_run) { + /* No callback available to request a new payload buffer + * Stall ZLP */ + udd_ep_control_state = UDD_EPCTRL_STALL_REQ; + /* Stall all packets on IN & OUT control endpoint */ + udd_ep_set_halt(0); + return; + } + if (!udd_g_ctrlreq.over_under_run()) { + /* No new payload buffer delivered + * Stall ZLP */ + udd_ep_control_state = UDD_EPCTRL_STALL_REQ; + /* Stall all packets on IN & OUT control endpoint */ + udd_ep_set_halt(0); + return; + } + /* New payload buffer available + * Update number of total data received */ + udd_ctrl_prev_payload_nb_trans += udd_ctrl_payload_nb_trans; + + /* Reinitialize reception on payload buffer */ + udd_ctrl_payload_nb_trans = 0; + } + usb_device_endpoint_read_buffer_job(&usb_device,0,udd_ctrl_buffer,USB_DEVICE_EP_CTRL_SIZE); +} + +/** + * \internal + * \brief Endpoint 0 (control) SETUP received callback + * \param[in] module_inst pointer to USB module instance + * \param[in] pointer Pointer to the endpoint transfer status parameter struct from driver layer. + */ +static void _usb_ep0_on_setup(struct usb_module *module_inst, void* pointer) +{ + struct usb_endpoint_callback_parameter *ep_callback_para = (struct usb_endpoint_callback_parameter*)pointer; + + if (UDD_EPCTRL_SETUP != udd_ep_control_state) { + if (NULL != udd_g_ctrlreq.callback) { + udd_g_ctrlreq.callback(); + } + udd_ep_control_state = UDD_EPCTRL_SETUP; + } + if ( 8 != ep_callback_para->received_bytes) { + udd_ctrl_stall_data(); + return; + } else { + udd_ctrl_fetch_ram(); + if (false == udc_process_setup()) { + udd_ctrl_stall_data(); + return; + } else if (Udd_setup_is_in()) { + udd_ctrl_prev_payload_nb_trans = 0; + udd_ctrl_payload_nb_trans = 0; + udd_ep_control_state = UDD_EPCTRL_DATA_IN; + usb_device_endpoint_read_buffer_job(&usb_device,0,udd_ctrl_buffer,USB_DEVICE_EP_CTRL_SIZE); + udd_ctrl_in_sent(); + } else { + if(0 == udd_g_ctrlreq.req.wLength) { + udd_ctrl_send_zlp_in(); + return; + } else { + udd_ctrl_prev_payload_nb_trans = 0; + udd_ctrl_payload_nb_trans = 0; + udd_ep_control_state = UDD_EPCTRL_DATA_OUT; + /* Initialize buffer size and enable OUT bank */ + usb_device_endpoint_read_buffer_job(&usb_device,0,udd_ctrl_buffer,USB_DEVICE_EP_CTRL_SIZE); + } + } + } +} + +/** + * \brief Control Endpoint Process when underflow condition has occurred + * \param[in] pointer Pointer to the endpoint transfer status parameter struct from driver layer. + */ +static void udd_ctrl_underflow(void* pointer) +{ + struct usb_endpoint_callback_parameter *ep_callback_para = (struct usb_endpoint_callback_parameter*)pointer; + + if (UDD_EPCTRL_DATA_OUT == udd_ep_control_state) { + /* Host want to stop OUT transaction + * then stop to wait OUT data phase and wait IN ZLP handshake */ + udd_ctrl_send_zlp_in(); + } else if (UDD_EPCTRL_HANDSHAKE_WAIT_OUT_ZLP == udd_ep_control_state) { + /* A OUT handshake is waiting by device, + * but host want extra IN data then stall extra IN data */ + usb_device_endpoint_set_halt(&usb_device, ep_callback_para->endpoint_address); + } +} + +/** + * \brief Control Endpoint Process when overflow condition has occurred + * \param[in] pointer Pointer to the endpoint transfer status parameter struct from driver layer. + */ +static void udd_ctrl_overflow(void* pointer) +{ + struct usb_endpoint_callback_parameter *ep_callback_para = (struct usb_endpoint_callback_parameter*)pointer; + + if (UDD_EPCTRL_DATA_IN == udd_ep_control_state) { + /* Host want to stop IN transaction + * then stop to wait IN data phase and wait OUT ZLP handshake */ + udd_ep_control_state = UDD_EPCTRL_HANDSHAKE_WAIT_OUT_ZLP; + } else if (UDD_EPCTRL_HANDSHAKE_WAIT_IN_ZLP == udd_ep_control_state) { + /* A IN handshake is waiting by device, + * but host want extra OUT data then stall extra OUT data and following status stage */ + usb_device_endpoint_set_halt(&usb_device, ep_callback_para->endpoint_address); + } +} + +/** + * \internal + * \brief Control endpoint transfer fail callback function + * \param[in] module_inst Pointer to USB module instance + * \param[in] pointer Pointer to the endpoint transfer status parameter struct from driver layer. + */ +static void _usb_ep0_on_tansfer_fail(struct usb_module *module_inst, void* pointer) +{ + struct usb_endpoint_callback_parameter *ep_callback_para = (struct usb_endpoint_callback_parameter*)pointer; + + if(ep_callback_para->endpoint_address & USB_EP_DIR_IN) { + udd_ctrl_underflow(pointer); + } else { + udd_ctrl_overflow(pointer); + } +} + +/** + * \internal + * \brief Control endpoint transfer complete callback function + * \param[in] module_inst Pointer to USB module instance + * \param[in] pointer Pointer to the endpoint transfer status parameter struct from driver layer. + */ +static void _usb_ep0_on_tansfer_ok(struct usb_module *module_inst, void *pointer) +{ + if (UDD_EPCTRL_DATA_OUT == udd_ep_control_state) { /* handshake Out for status stage */ + udd_ctrl_out_received(pointer); + } else if (UDD_EPCTRL_DATA_IN == udd_ep_control_state) { /* handshake In for status stage */ + udd_ctrl_in_sent(); + } else { + if (NULL != udd_g_ctrlreq.callback) { + udd_g_ctrlreq.callback(); + } + udd_ep_control_state = UDD_EPCTRL_SETUP; + } +} + +/** + * \brief Enable Control Endpoint + * \param[in] module_inst Pointer to USB module instance + */ +static void udd_ctrl_ep_enable(struct usb_module *module_inst) +{ + /* USB Device Endpoint0 Configuration */ + struct usb_device_endpoint_config config_ep0; + + usb_device_endpoint_get_config_defaults(&config_ep0); + config_ep0.ep_size = (enum usb_endpoint_size)(32 - clz(((uint32_t)Min(Max(USB_DEVICE_EP_CTRL_SIZE, 8), 1024) << 1) - 1) - 1 - 3); + usb_device_endpoint_set_config(module_inst,&config_ep0); + + usb_device_endpoint_setup_buffer_job(module_inst,udd_ctrl_buffer); + + usb_device_endpoint_register_callback(module_inst,0,USB_DEVICE_ENDPOINT_CALLBACK_RXSTP, _usb_ep0_on_setup ); + usb_device_endpoint_register_callback(module_inst,0,USB_DEVICE_ENDPOINT_CALLBACK_TRCPT,_usb_ep0_on_tansfer_ok ); + usb_device_endpoint_register_callback(module_inst,0,USB_DEVICE_ENDPOINT_CALLBACK_TRFAIL,_usb_ep0_on_tansfer_fail ); + usb_device_endpoint_enable_callback(module_inst,0,USB_DEVICE_ENDPOINT_CALLBACK_RXSTP); + usb_device_endpoint_enable_callback(module_inst,0,USB_DEVICE_ENDPOINT_CALLBACK_TRCPT); + usb_device_endpoint_enable_callback(module_inst,0,USB_DEVICE_ENDPOINT_CALLBACK_TRFAIL); + +#ifdef USB_DEVICE_LPM_SUPPORT + // Enable LPM feature + usb_device_set_lpm_mode(module_inst, USB_DEVICE_LPM_ACK); +#endif + + udd_ep_control_state = UDD_EPCTRL_SETUP; +} + +/** + * \internal + * \brief Control endpoint Suspend callback function + * \param[in] module_inst Pointer to USB module instance + * \param[in] pointer Pointer to the callback parameter from driver layer. + */ +static void _usb_on_suspend(struct usb_module *module_inst, void *pointer) +{ + usb_device_disable_callback(&usb_device, USB_DEVICE_CALLBACK_SUSPEND); + usb_device_enable_callback(&usb_device, USB_DEVICE_CALLBACK_WAKEUP); + udd_sleep_mode(UDD_STATE_SUSPEND); +#ifdef UDC_SUSPEND_EVENT + UDC_SUSPEND_EVENT(); +#endif +} + +#ifdef USB_DEVICE_LPM_SUPPORT +static void _usb_device_lpm_suspend(struct usb_module *module_inst, void *pointer) +{ + dbg_print("LPM_SUSP\n"); + + uint32_t *lpm_wakeup_enable; + lpm_wakeup_enable = (uint32_t *)pointer; + + usb_device_disable_callback(&usb_device, USB_DEVICE_CALLBACK_LPMSUSP); + usb_device_disable_callback(&usb_device, USB_DEVICE_CALLBACK_SUSPEND); + usb_device_enable_callback(&usb_device, USB_DEVICE_CALLBACK_WAKEUP); + +//#warning Here the sleep mode must be choose to have a DFLL startup time < bmAttribut.HIRD + udd_sleep_mode(UDD_STATE_SUSPEND_LPM); // Enter in LPM SUSPEND mode + if ((*lpm_wakeup_enable)) { + UDC_REMOTEWAKEUP_LPM_ENABLE(); + } + if (!(*lpm_wakeup_enable)) { + UDC_REMOTEWAKEUP_LPM_DISABLE(); + } + UDC_SUSPEND_LPM_EVENT(); +} +#endif + +/** + * \internal + * \brief Control endpoint SOF callback function + * \param[in] module_inst Pointer to USB module instance + * \param[in] pointer Pointer to the callback parameter from driver layer. + */ +static void _usb_on_sof_notify(struct usb_module *module_inst, void *pointer) +{ + udc_sof_notify(); +#ifdef UDC_SOF_EVENT + UDC_SOF_EVENT(); +#endif +} + +/** + * \internal + * \brief Control endpoint Reset callback function + * \param[in] module_inst Pointer to USB module instance + * \param[in] pointer Pointer to the callback parameter from driver layer. + */ +static void _usb_on_bus_reset(struct usb_module *module_inst, void *pointer) +{ + // Reset USB Device Stack Core + udc_reset(); + usb_device_set_address(module_inst,0); + udd_ctrl_ep_enable(module_inst); +} + +/** + * \internal + * \brief Control endpoint Wakeup callback function + * \param[in] module_inst Pointer to USB module instance + * \param[in] pointer Pointer to the callback parameter from driver layer. + */ +static void _usb_on_wakeup(struct usb_module *module_inst, void *pointer) +{ + udd_wait_clock_ready(); + + usb_device_disable_callback(&usb_device, USB_DEVICE_CALLBACK_WAKEUP); + usb_device_enable_callback(&usb_device, USB_DEVICE_CALLBACK_SUSPEND); +#ifdef USB_DEVICE_LPM_SUPPORT + usb_device_register_callback(&usb_device, USB_DEVICE_CALLBACK_LPMSUSP, _usb_device_lpm_suspend); + usb_device_enable_callback(&usb_device, USB_DEVICE_CALLBACK_LPMSUSP); +#endif + udd_sleep_mode(UDD_STATE_IDLE); +#ifdef UDC_RESUME_EVENT + UDC_RESUME_EVENT(); +#endif +} + +void udd_detach(void) +{ + usb_device_detach(&usb_device); + udd_sleep_mode(UDD_STATE_SUSPEND); +} + +void udd_attach(void) +{ + udd_sleep_mode(UDD_STATE_IDLE); + usb_device_attach(&usb_device); + + usb_device_register_callback(&usb_device, USB_DEVICE_CALLBACK_SUSPEND, _usb_on_suspend); + usb_device_register_callback(&usb_device, USB_DEVICE_CALLBACK_SOF, _usb_on_sof_notify); + usb_device_register_callback(&usb_device, USB_DEVICE_CALLBACK_RESET, _usb_on_bus_reset); + usb_device_register_callback(&usb_device, USB_DEVICE_CALLBACK_WAKEUP, _usb_on_wakeup); + + usb_device_enable_callback(&usb_device, USB_DEVICE_CALLBACK_SUSPEND); + usb_device_enable_callback(&usb_device, USB_DEVICE_CALLBACK_SOF); + usb_device_enable_callback(&usb_device, USB_DEVICE_CALLBACK_RESET); + usb_device_enable_callback(&usb_device, USB_DEVICE_CALLBACK_WAKEUP); +#ifdef USB_DEVICE_LPM_SUPPORT + usb_device_register_callback(&usb_device, USB_DEVICE_CALLBACK_LPMSUSP, _usb_device_lpm_suspend); + usb_device_enable_callback(&usb_device, USB_DEVICE_CALLBACK_LPMSUSP); +#endif +} + +void udd_enable(void) +{ + uint32_t irqflags; + + /* To avoid USB interrupt before end of initialization */ + irqflags = __get_PRIMASK(); + __disable_irq(); + __DMB(); + + struct usb_config config_usb; + + /* USB Module configuration */ + usb_get_config_defaults(&config_usb); + config_usb.source_generator = UDD_CLOCK_GEN; + usb_init(&usb_device, USB, &config_usb); + + /* USB Module Enable */ + usb_enable(&usb_device); + + /* Check clock after enable module, request the clock */ + udd_wait_clock_ready(); + + udd_sleep_mode(UDD_STATE_SUSPEND); + + // No VBus detect, assume always high +#ifndef USB_DEVICE_ATTACH_AUTO_DISABLE + udd_attach(); +#endif + + __DMB(); + __set_PRIMASK(irqflags); +} + +void udd_disable(void) +{ + udd_detach(); + + udd_sleep_mode(UDD_STATE_OFF); +} +/** @} */ diff --git a/tmk_core/protocol/arm_atsam/usb/usb_main.h b/tmk_core/protocol/arm_atsam/usb/usb_main.h new file mode 100644 index 000000000..b7adaa1a7 --- /dev/null +++ b/tmk_core/protocol/arm_atsam/usb/usb_main.h @@ -0,0 +1,97 @@ +/** + * \file + * + * \brief Declaration of main function used by HID keyboard example + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _MAIN_H_ +#define _MAIN_H_ + +//Enters the application in low power mode +//Callback called when USB host sets USB line in suspend state +void main_suspend_action(void); + +//Called by UDD when the USB line exit of suspend state +void main_resume_action(void); + +//Called when a start of frame is received on USB line +void main_sof_action(void); + +//Called by UDC when USB Host request to enable remote wakeup +void main_remotewakeup_enable(void); + +//Called by UDC when USB Host request to disable remote wakeup +void main_remotewakeup_disable(void); + + +#ifdef KBD +extern volatile bool main_b_kbd_enable; +bool main_kbd_enable(void); +void main_kbd_disable(void); +#endif //KBD + +#ifdef NKRO +extern volatile bool main_b_nkro_enable; +bool main_nkro_enable(void); +void main_nkro_disable(void); +#endif //NKRO + +#ifdef EXK +extern volatile bool main_b_exk_enable; +bool main_exk_enable(void); +void main_exk_disable(void); +#endif //EXK + +#ifdef MOU +extern volatile bool main_b_mou_enable; +bool main_mou_enable(void); +void main_mou_disable(void); +#endif //MOU + +#ifdef RAW +extern volatile bool main_b_raw_enable; +bool main_raw_enable(void); +void main_raw_disable(void); +#endif //RAW + +#endif // _MAIN_H_ diff --git a/tmk_core/protocol/arm_atsam/usb/usb_protocol.h b/tmk_core/protocol/arm_atsam/usb/usb_protocol.h new file mode 100644 index 000000000..892a7d3a5 --- /dev/null +++ b/tmk_core/protocol/arm_atsam/usb/usb_protocol.h @@ -0,0 +1,498 @@ +/** + * \file + * + * \brief USB protocol definitions. + * + * This file contains the USB definitions and data structures provided by the + * USB 2.0 specification. + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _USB_PROTOCOL_H_ +#define _USB_PROTOCOL_H_ + +#include "usb_atmel.h" + +/** + * \ingroup usb_group + * \defgroup usb_protocol_group USB Protocol Definitions + * + * This module defines constants and data structures provided by the USB + * 2.0 specification. + * + * @{ + */ + +//! Value for field bcdUSB +#define USB_V2_0 0x0200 //!< USB Specification version 2.00 +#define USB_V2_1 0x0201 //!< USB Specification version 2.01 + +/*! \name Generic definitions (Class, subclass and protocol) + */ +//! @{ +#define NO_CLASS 0x00 +#define CLASS_VENDOR_SPECIFIC 0xFF +#define NO_SUBCLASS 0x00 +#define NO_PROTOCOL 0x00 +//! @} + +//! \name IAD (Interface Association Descriptor) constants +//! @{ +#define CLASS_IAD 0xEF +#define SUB_CLASS_IAD 0x02 +#define PROTOCOL_IAD 0x01 +//! @} + +/** + * \brief USB request data transfer direction (bmRequestType) + */ +#define USB_REQ_DIR_OUT (0<<7) //!< Host to device +#define USB_REQ_DIR_IN (1<<7) //!< Device to host +#define USB_REQ_DIR_MASK (1<<7) //!< Mask + +/** + * \brief USB request types (bmRequestType) + */ +#define USB_REQ_TYPE_STANDARD (0<<5) //!< Standard request +#define USB_REQ_TYPE_CLASS (1<<5) //!< Class-specific request +#define USB_REQ_TYPE_VENDOR (2<<5) //!< Vendor-specific request +#define USB_REQ_TYPE_MASK (3<<5) //!< Mask + +/** + * \brief USB recipient codes (bmRequestType) + */ +#define USB_REQ_RECIP_DEVICE (0<<0) //!< Recipient device +#define USB_REQ_RECIP_INTERFACE (1<<0) //!< Recipient interface +#define USB_REQ_RECIP_ENDPOINT (2<<0) //!< Recipient endpoint +#define USB_REQ_RECIP_OTHER (3<<0) //!< Recipient other +#define USB_REQ_RECIP_MASK (0x1F) //!< Mask + +/** + * \brief Standard USB requests (bRequest) + */ +enum usb_reqid { + USB_REQ_GET_STATUS = 0, + USB_REQ_CLEAR_FEATURE = 1, + USB_REQ_SET_FEATURE = 3, + USB_REQ_SET_ADDRESS = 5, + USB_REQ_GET_DESCRIPTOR = 6, + USB_REQ_SET_DESCRIPTOR = 7, + USB_REQ_GET_CONFIGURATION = 8, + USB_REQ_SET_CONFIGURATION = 9, + USB_REQ_GET_INTERFACE = 10, + USB_REQ_SET_INTERFACE = 11, + USB_REQ_SYNCH_FRAME = 12, +}; + +/** + * \brief Standard USB device status flags + * + */ +enum usb_device_status { + USB_DEV_STATUS_BUS_POWERED = 0, + USB_DEV_STATUS_SELF_POWERED = 1, + USB_DEV_STATUS_REMOTEWAKEUP = 2 +}; + +/** + * \brief Standard USB Interface status flags + * + */ +enum usb_interface_status { + USB_IFACE_STATUS_RESERVED = 0 +}; + +/** + * \brief Standard USB endpoint status flags + * + */ +enum usb_endpoint_status { + USB_EP_STATUS_HALTED = 1, +}; + +/** + * \brief Standard USB device feature flags + * + * \note valid for SetFeature request. + */ +enum usb_device_feature { + USB_DEV_FEATURE_REMOTE_WAKEUP = 1, //!< Remote wakeup enabled + USB_DEV_FEATURE_TEST_MODE = 2, //!< USB test mode + USB_DEV_FEATURE_OTG_B_HNP_ENABLE = 3, + USB_DEV_FEATURE_OTG_A_HNP_SUPPORT = 4, + USB_DEV_FEATURE_OTG_A_ALT_HNP_SUPPORT = 5 +}; + +/** + * \brief Test Mode possible on HS USB device + * + * \note valid for USB_DEV_FEATURE_TEST_MODE request. + */ +enum usb_device_hs_test_mode { + USB_DEV_TEST_MODE_J = 1, + USB_DEV_TEST_MODE_K = 2, + USB_DEV_TEST_MODE_SE0_NAK = 3, + USB_DEV_TEST_MODE_PACKET = 4, + USB_DEV_TEST_MODE_FORCE_ENABLE = 5, +}; + +/** + * \brief Standard USB endpoint feature/status flags + */ +enum usb_endpoint_feature { + USB_EP_FEATURE_HALT = 0, +}; + +/** + * \brief Standard USB Test Mode Selectors + */ +enum usb_test_mode_selector { + USB_TEST_J = 0x01, + USB_TEST_K = 0x02, + USB_TEST_SE0_NAK = 0x03, + USB_TEST_PACKET = 0x04, + USB_TEST_FORCE_ENABLE = 0x05, +}; + +/** + * \brief Standard USB descriptor types + */ +enum usb_descriptor_type { + USB_DT_DEVICE = 1, + USB_DT_CONFIGURATION = 2, + USB_DT_STRING = 3, + USB_DT_INTERFACE = 4, + USB_DT_ENDPOINT = 5, + USB_DT_DEVICE_QUALIFIER = 6, + USB_DT_OTHER_SPEED_CONFIGURATION = 7, + USB_DT_INTERFACE_POWER = 8, + USB_DT_OTG = 9, + USB_DT_IAD = 0x0B, + USB_DT_BOS = 0x0F, + USB_DT_DEVICE_CAPABILITY = 0x10, +}; + +/** + * \brief USB Device Capability types + */ +enum usb_capability_type { + USB_DC_USB20_EXTENSION = 0x02, +}; + +/** + * \brief USB Device Capability - USB 2.0 Extension + * To fill bmAttributes field of usb_capa_ext_desc_t structure. + */ +enum usb_capability_extension_attr { + USB_DC_EXT_LPM = 0x00000002, +}; + +#define HIRD_50_US 0 +#define HIRD_125_US 1 +#define HIRD_200_US 2 +#define HIRD_275_US 3 +#define HIRD_350_US 4 +#define HIRD_425_US 5 +#define HIRD_500_US 6 +#define HIRD_575_US 7 +#define HIRD_650_US 8 +#define HIRD_725_US 9 +#define HIRD_800_US 10 +#define HIRD_875_US 11 +#define HIRD_950_US 12 +#define HIRD_1025_US 13 +#define HIRD_1100_US 14 +#define HIRD_1175_US 15 + +/** Fields definition from a LPM TOKEN */ +#define USB_LPM_ATTRIBUT_BLINKSTATE_MASK (0xF << 0) +#define USB_LPM_ATTRIBUT_FIRD_MASK (0xF << 4) +#define USB_LPM_ATTRIBUT_REMOTEWAKE_MASK (1 << 8) +#define USB_LPM_ATTRIBUT_BLINKSTATE(value) ((value & 0xF) << 0) +#define USB_LPM_ATTRIBUT_FIRD(value) ((value & 0xF) << 4) +#define USB_LPM_ATTRIBUT_REMOTEWAKE(value) ((value & 1) << 8) +#define USB_LPM_ATTRIBUT_BLINKSTATE_L1 USB_LPM_ATTRIBUT_BLINKSTATE(1) + +/** + * \brief Standard USB endpoint transfer types + */ +enum usb_ep_type { + USB_EP_TYPE_CONTROL = 0x00, + USB_EP_TYPE_ISOCHRONOUS = 0x01, + USB_EP_TYPE_BULK = 0x02, + USB_EP_TYPE_INTERRUPT = 0x03, + USB_EP_TYPE_MASK = 0x03, +}; + +/** + * \brief Standard USB language IDs for string descriptors + */ +enum usb_langid { + USB_LANGID_EN_US = 0x0409, //!< English (United States) +}; + +/** + * \brief Mask selecting the index part of an endpoint address + */ +#define USB_EP_ADDR_MASK 0x0f + +//! \brief USB address identifier +typedef uint8_t usb_add_t; + +/** + * \brief Endpoint transfer direction is IN + */ +#define USB_EP_DIR_IN 0x80 + +/** + * \brief Endpoint transfer direction is OUT + */ +#define USB_EP_DIR_OUT 0x00 + +//! \brief Endpoint identifier +typedef uint8_t usb_ep_t; + +/** + * \brief Maximum length in bytes of a USB descriptor + * + * The maximum length of a USB descriptor is limited by the 8-bit + * bLength field. + */ +#define USB_MAX_DESC_LEN 255 + +/* + * 2-byte alignment requested for all USB structures. + */ +COMPILER_PACK_SET(1) + +/** + * \brief A USB Device SETUP request + * + * The data payload of SETUP packets always follows this structure. + */ +typedef struct { + uint8_t bmRequestType; + uint8_t bRequest; + le16_t wValue; + le16_t wIndex; + le16_t wLength; +} usb_setup_req_t; + +/** + * \brief Standard USB device descriptor structure + */ +typedef struct { + uint8_t bLength; + uint8_t bDescriptorType; + le16_t bcdUSB; + uint8_t bDeviceClass; + uint8_t bDeviceSubClass; + uint8_t bDeviceProtocol; + uint8_t bMaxPacketSize0; + le16_t idVendor; + le16_t idProduct; + le16_t bcdDevice; + uint8_t iManufacturer; + uint8_t iProduct; + uint8_t iSerialNumber; + uint8_t bNumConfigurations; +} usb_dev_desc_t; + +/** + * \brief Standard USB device qualifier descriptor structure + * + * This descriptor contains information about the device when running at + * the "other" speed (i.e. if the device is currently operating at high + * speed, this descriptor can be used to determine what would change if + * the device was operating at full speed.) + */ +typedef struct { + uint8_t bLength; + uint8_t bDescriptorType; + le16_t bcdUSB; + uint8_t bDeviceClass; + uint8_t bDeviceSubClass; + uint8_t bDeviceProtocol; + uint8_t bMaxPacketSize0; + uint8_t bNumConfigurations; + uint8_t bReserved; +} usb_dev_qual_desc_t; + +/** + * \brief USB Device BOS descriptor structure + * + * The BOS descriptor (Binary device Object Store) defines a root + * descriptor that is similar to the configuration descriptor, and is + * the base descriptor for accessing a family of related descriptors. + * A host can read a BOS descriptor and learn from the wTotalLength field + * the entire size of the device-level descriptor set, or it can read in + * the entire BOS descriptor set of device capabilities. + * The host accesses this descriptor using the GetDescriptor() request. + * The descriptor type in the GetDescriptor() request is set to BOS. + */ +typedef struct { + uint8_t bLength; + uint8_t bDescriptorType; + le16_t wTotalLength; + uint8_t bNumDeviceCaps; +} usb_dev_bos_desc_t; + + +/** + * \brief USB Device Capabilities - USB 2.0 Extension Descriptor structure + * + * Defines the set of USB 1.1-specific device level capabilities. + */ +typedef struct { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDevCapabilityType; + le32_t bmAttributes; +} usb_dev_capa_ext_desc_t; + +/** + * \brief USB Device LPM Descriptor structure + * + * The BOS descriptor and capabilities descriptors for LPM. + */ +typedef struct { + usb_dev_bos_desc_t bos; + usb_dev_capa_ext_desc_t capa_ext; +} usb_dev_lpm_desc_t; + +/** + * \brief Standard USB Interface Association Descriptor structure + */ +typedef struct { + uint8_t bLength; //!< size of this descriptor in bytes + uint8_t bDescriptorType; //!< INTERFACE descriptor type + uint8_t bFirstInterface; //!< Number of interface + uint8_t bInterfaceCount; //!< value to select alternate setting + uint8_t bFunctionClass; //!< Class code assigned by the USB + uint8_t bFunctionSubClass;//!< Sub-class code assigned by the USB + uint8_t bFunctionProtocol;//!< Protocol code assigned by the USB + uint8_t iFunction; //!< Index of string descriptor +} usb_association_desc_t; + + +/** + * \brief Standard USB configuration descriptor structure + */ +typedef struct { + uint8_t bLength; + uint8_t bDescriptorType; + le16_t wTotalLength; + uint8_t bNumInterfaces; + uint8_t bConfigurationValue; + uint8_t iConfiguration; + uint8_t bmAttributes; + uint8_t bMaxPower; +} usb_conf_desc_t; + + +#define USB_CONFIG_ATTR_MUST_SET (1 << 7) //!< Must always be set +#define USB_CONFIG_ATTR_BUS_POWERED (0 << 6) //!< Bus-powered +#define USB_CONFIG_ATTR_SELF_POWERED (1 << 6) //!< Self-powered +#define USB_CONFIG_ATTR_REMOTE_WAKEUP (1 << 5) //!< remote wakeup supported + +#define USB_CONFIG_MAX_POWER(ma) (((ma) + 1) / 2) //!< Max power in mA + +/** + * \brief Standard USB association descriptor structure + */ +typedef struct { + uint8_t bLength; //!< Size of this descriptor in bytes + uint8_t bDescriptorType; //!< Interface descriptor type + uint8_t bFirstInterface; //!< Number of interface + uint8_t bInterfaceCount; //!< value to select alternate setting + uint8_t bFunctionClass; //!< Class code assigned by the USB + uint8_t bFunctionSubClass; //!< Sub-class code assigned by the USB + uint8_t bFunctionProtocol; //!< Protocol code assigned by the USB + uint8_t iFunction; //!< Index of string descriptor +} usb_iad_desc_t; + +/** + * \brief Standard USB interface descriptor structure + */ +typedef struct { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bInterfaceNumber; + uint8_t bAlternateSetting; + uint8_t bNumEndpoints; + uint8_t bInterfaceClass; + uint8_t bInterfaceSubClass; + uint8_t bInterfaceProtocol; + uint8_t iInterface; +} usb_iface_desc_t; + +/** + * \brief Standard USB endpoint descriptor structure + */ +typedef struct { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bEndpointAddress; + uint8_t bmAttributes; + le16_t wMaxPacketSize; + uint8_t bInterval; +} usb_ep_desc_t; + + +/** + * \brief A standard USB string descriptor structure + */ +typedef struct { + uint8_t bLength; + uint8_t bDescriptorType; +} usb_str_desc_t; + +typedef struct { + usb_str_desc_t desc; + le16_t string[1]; +} usb_str_lgid_desc_t; + +COMPILER_PACK_RESET() + +//! @} + +#endif /* _USB_PROTOCOL_H_ */ diff --git a/tmk_core/protocol/arm_atsam/usb/usb_protocol_cdc.h b/tmk_core/protocol/arm_atsam/usb/usb_protocol_cdc.h new file mode 100644 index 000000000..479f25d4e --- /dev/null +++ b/tmk_core/protocol/arm_atsam/usb/usb_protocol_cdc.h @@ -0,0 +1,193 @@ +/** + * \file + * + * \brief USB Communication Device Class (CDC) protocol definitions + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef _USB_PROTOCOL_CDC_H_ +#define _USB_PROTOCOL_CDC_H_ + +#include "compiler.h" + +#ifdef CDC + +#define CDC_CLASS_DEVICE 0x02 //!< USB Communication Device Class +#define CDC_CLASS_COMM 0x02 //!< CDC Communication Class Interface +#define CDC_CLASS_DATA 0x0A //!< CDC Data Class Interface + +#define CDC_SUBCLASS_DLCM 0x01 //!< Direct Line Control Model +#define CDC_SUBCLASS_ACM 0x02 //!< Abstract Control Model +#define CDC_SUBCLASS_TCM 0x03 //!< Telephone Control Model +#define CDC_SUBCLASS_MCCM 0x04 //!< Multi-Channel Control Model +#define CDC_SUBCLASS_CCM 0x05 //!< CAPI Control Model +#define CDC_SUBCLASS_ETH 0x06 //!< Ethernet Networking Control Model +#define CDC_SUBCLASS_ATM 0x07 //!< ATM Networking Control Model + +#define CDC_PROTOCOL_V25TER 0x01 //!< Common AT commands + +#define CDC_PROTOCOL_I430 0x30 //!< ISDN BRI +#define CDC_PROTOCOL_HDLC 0x31 //!< HDLC +#define CDC_PROTOCOL_TRANS 0x32 //!< Transparent +#define CDC_PROTOCOL_Q921M 0x50 //!< Q.921 management protocol +#define CDC_PROTOCOL_Q921 0x51 //!< Q.931 [sic] Data link protocol +#define CDC_PROTOCOL_Q921TM 0x52 //!< Q.921 TEI-multiplexor +#define CDC_PROTOCOL_V42BIS 0x90 //!< Data compression procedures +#define CDC_PROTOCOL_Q931 0x91 //!< Euro-ISDN protocol control +#define CDC_PROTOCOL_V120 0x92 //!< V.24 rate adaption to ISDN +#define CDC_PROTOCOL_CAPI20 0x93 //!< CAPI Commands +#define CDC_PROTOCOL_HOST 0xFD //!< Host based driver + +#define CDC_PROTOCOL_PUFD 0xFE + +#define CDC_CS_INTERFACE 0x24 //!< Interface Functional Descriptor +#define CDC_CS_ENDPOINT 0x25 //!< Endpoint Functional Descriptor + +#define CDC_SCS_HEADER 0x00 //!< Header Functional Descriptor +#define CDC_SCS_CALL_MGMT 0x01 //!< Call Management +#define CDC_SCS_ACM 0x02 //!< Abstract Control Management +#define CDC_SCS_UNION 0x06 //!< Union Functional Descriptor + +#define USB_REQ_CDC_SEND_ENCAPSULATED_COMMAND 0x00 +#define USB_REQ_CDC_GET_ENCAPSULATED_RESPONSE 0x01 +#define USB_REQ_CDC_SET_COMM_FEATURE 0x02 +#define USB_REQ_CDC_GET_COMM_FEATURE 0x03 +#define USB_REQ_CDC_CLEAR_COMM_FEATURE 0x04 +#define USB_REQ_CDC_SET_AUX_LINE_STATE 0x10 +#define USB_REQ_CDC_SET_HOOK_STATE 0x11 +#define USB_REQ_CDC_PULSE_SETUP 0x12 +#define USB_REQ_CDC_SEND_PULSE 0x13 +#define USB_REQ_CDC_SET_PULSE_TIME 0x14 +#define USB_REQ_CDC_RING_AUX_JACK 0x15 +#define USB_REQ_CDC_SET_LINE_CODING 0x20 +#define USB_REQ_CDC_GET_LINE_CODING 0x21 +#define USB_REQ_CDC_SET_CONTROL_LINE_STATE 0x22 +#define USB_REQ_CDC_SEND_BREAK 0x23 +#define USB_REQ_CDC_SET_RINGER_PARMS 0x30 +#define USB_REQ_CDC_GET_RINGER_PARMS 0x31 +#define USB_REQ_CDC_SET_OPERATION_PARMS 0x32 +#define USB_REQ_CDC_GET_OPERATION_PARMS 0x33 +#define USB_REQ_CDC_SET_LINE_PARMS 0x34 +#define USB_REQ_CDC_GET_LINE_PARMS 0x35 +#define USB_REQ_CDC_DIAL_DIGITS 0x36 +#define USB_REQ_CDC_SET_UNIT_PARAMETER 0x37 +#define USB_REQ_CDC_GET_UNIT_PARAMETER 0x38 +#define USB_REQ_CDC_CLEAR_UNIT_PARAMETER 0x39 +#define USB_REQ_CDC_GET_PROFILE 0x3A +#define USB_REQ_CDC_SET_ETHERNET_MULTICAST_FILTERS 0x40 +#define USB_REQ_CDC_SET_ETHERNET_POWER_MANAGEMENT_PATTERNFILTER 0x41 +#define USB_REQ_CDC_GET_ETHERNET_POWER_MANAGEMENT_PATTERNFILTER 0x42 +#define USB_REQ_CDC_SET_ETHERNET_PACKET_FILTER 0x43 +#define USB_REQ_CDC_GET_ETHERNET_STATISTIC 0x44 +#define USB_REQ_CDC_SET_ATM_DATA_FORMAT 0x50 +#define USB_REQ_CDC_GET_ATM_DEVICE_STATISTICS 0x51 +#define USB_REQ_CDC_SET_ATM_DEFAULT_VC 0x52 +#define USB_REQ_CDC_GET_ATM_VC_STATISTICS 0x53 +// Added bNotification codes according cdc spec 1.1 chapter 6.3 +#define USB_REQ_CDC_NOTIFY_RING_DETECT 0x09 +#define USB_REQ_CDC_NOTIFY_SERIAL_STATE 0x20 +#define USB_REQ_CDC_NOTIFY_CALL_STATE_CHANGE 0x28 +#define USB_REQ_CDC_NOTIFY_LINE_STATE_CHANGE 0x29 + + +#define CDC_CALL_MGMT_SUPPORTED (1 << 0) +#define CDC_CALL_MGMT_OVER_DCI (1 << 1) +#define CDC_ACM_SUPPORT_FEATURE_REQUESTS (1 << 0) +#define CDC_ACM_SUPPORT_LINE_REQUESTS (1 << 1) +#define CDC_ACM_SUPPORT_SENDBREAK_REQUESTS (1 << 2) +#define CDC_ACM_SUPPORT_NOTIFY_REQUESTS (1 << 3) + +#pragma pack(push,1) +typedef struct { + le32_t dwDTERate; + uint8_t bCharFormat; + uint8_t bParityType; + uint8_t bDataBits; +} usb_cdc_line_coding_t; +#pragma pack(pop) + +enum cdc_char_format { + CDC_STOP_BITS_1 = 0, //!< 1 stop bit + CDC_STOP_BITS_1_5 = 1, //!< 1.5 stop bits + CDC_STOP_BITS_2 = 2, //!< 2 stop bits +}; + +enum cdc_parity { + CDC_PAR_NONE = 0, //!< No parity + CDC_PAR_ODD = 1, //!< Odd parity + CDC_PAR_EVEN = 2, //!< Even parity + CDC_PAR_MARK = 3, //!< Parity forced to 0 (space) + CDC_PAR_SPACE = 4, //!< Parity forced to 1 (mark) +}; + + +typedef struct { + uint16_t value; +} usb_cdc_control_signal_t; + +#define CDC_CTRL_SIGNAL_ACTIVATE_CARRIER (1 << 1) +#define CDC_CTRL_SIGNAL_DTE_PRESENT (1 << 0) + + +typedef struct { + uint8_t bmRequestType; + uint8_t bNotification; + le16_t wValue; + le16_t wIndex; + le16_t wLength; +} usb_cdc_notify_msg_t; + +typedef struct { + usb_cdc_notify_msg_t header; + le16_t value; +} usb_cdc_notify_serial_state_t; + +#define CDC_SERIAL_STATE_DCD CPU_TO_LE16((1<<0)) +#define CDC_SERIAL_STATE_DSR CPU_TO_LE16((1<<1)) +#define CDC_SERIAL_STATE_BREAK CPU_TO_LE16((1<<2)) +#define CDC_SERIAL_STATE_RING CPU_TO_LE16((1<<3)) +#define CDC_SERIAL_STATE_FRAMING CPU_TO_LE16((1<<4)) +#define CDC_SERIAL_STATE_PARITY CPU_TO_LE16((1<<5)) +#define CDC_SERIAL_STATE_OVERRUN CPU_TO_LE16((1<<6)) + +#endif + +#endif // _USB_PROTOCOL_CDC_H_ diff --git a/tmk_core/protocol/arm_atsam/usb/usb_protocol_hid.h b/tmk_core/protocol/arm_atsam/usb/usb_protocol_hid.h new file mode 100644 index 000000000..c482e9c06 --- /dev/null +++ b/tmk_core/protocol/arm_atsam/usb/usb_protocol_hid.h @@ -0,0 +1,319 @@ +/** + * \file + * + * \brief USB Human Interface Device (HID) protocol definitions. + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _USB_PROTOCOL_HID_H_ +#define _USB_PROTOCOL_HID_H_ + +/** + * \ingroup usb_protocol_group + * \defgroup usb_hid_protocol USB Human Interface Device (HID) + * protocol definitions + * \brief USB Human Interface Device (HID) protocol definitions + * + * @{ + */ + +//! \name Possible Class value +//@{ +#define HID_CLASS 0x03 +//@} + +//! \name Possible SubClass value +//@{ +//! Interface subclass NO support BOOT protocol +#define HID_SUB_CLASS_NOBOOT 0x00 +//! Interface subclass support BOOT protocol +#define HID_SUB_CLASS_BOOT 0x01 +//@} + +//! \name Possible protocol value +//@{ +//! Protocol generic standard +#define HID_PROTOCOL_GENERIC 0x00 +//! Protocol keyboard standard +#define HID_PROTOCOL_KEYBOARD 0x01 +//! Protocol mouse standard +#define HID_PROTOCOL_MOUSE 0x02 +//@} + + +//! \brief Hid USB requests (bRequest) +enum usb_reqid_hid { + USB_REQ_HID_GET_REPORT = 0x01, + USB_REQ_HID_GET_IDLE = 0x02, + USB_REQ_HID_GET_PROTOCOL = 0x03, + USB_REQ_HID_SET_REPORT = 0x09, + USB_REQ_HID_SET_IDLE = 0x0A, + USB_REQ_HID_SET_PROTOCOL = 0x0B, +}; + +//! \brief HID USB descriptor types +enum usb_descriptor_type_hid { + USB_DT_HID = 0x21, + USB_DT_HID_REPORT = 0x22, + USB_DT_HID_PHYSICAL = 0x23, +}; + +//! \brief HID Type for report descriptor +enum usb_hid_item_report_type { + USB_HID_ITEM_REPORT_TYPE_MAIN = 0, + USB_HID_ITEM_REPORT_TYPE_GLOBAL = 1, + USB_HID_ITEM_REPORT_TYPE_LOCAL = 2, + USB_HID_ITEM_REPORT_TYPE_LONG = 3, +}; + +//! \brief HID report type +enum usb_hid_report_type { + USB_HID_REPORT_TYPE_INPUT = 1, + USB_HID_REPORT_TYPE_OUTPUT = 2, + USB_HID_REPORT_TYPE_FEATURE = 3, +}; + + +//! \brief HID protocol +enum usb_hid_protocol { + USB_HID_PROCOTOL_BOOT = 0, + USB_HID_PROCOTOL_REPORT = 1, +}; + +COMPILER_PACK_SET(1) + +//! \brief HID Descriptor +typedef struct { + uint8_t bLength; //!< Size of this descriptor in bytes + uint8_t bDescriptorType; //!< HID descriptor type + le16_t bcdHID; //!< Binary Coded Decimal Spec. release + uint8_t bCountryCode; //!< Hardware target country + uint8_t bNumDescriptors; //!< Number of HID class descriptors to follow + uint8_t bRDescriptorType; //!< Report descriptor type + le16_t wDescriptorLength; //!< Total length of Report descriptor +} usb_hid_descriptor_t; + +COMPILER_PACK_RESET() + + //! \name HID Report type + //! Used by SETUP_HID_GET_REPORT & SETUP_HID_SET_REPORT + //! @{ +#define REPORT_TYPE_INPUT 0x01 +#define REPORT_TYPE_OUTPUT 0x02 +#define REPORT_TYPE_FEATURE 0x03 + //! @} + + //! \name Constants of field DESCRIPTOR_HID + //! @{ +//! Numeric expression identifying the HID Class +//! Specification release (here V1.11) +#define USB_HID_BDC_V1_11 0x0111 +//! Numeric expression specifying the number of class descriptors +//! Note: Always at least one i.e. Report descriptor. +#define USB_HID_NUM_DESC 0x01 + + //! \name Country code + //! @{ +#define USB_HID_NO_COUNTRY_CODE 0 // Not Supported +#define USB_HID_COUNTRY_ARABIC 1 // Arabic +#define USB_HID_COUNTRY_BELGIAN 2 // Belgian +#define USB_HID_COUNTRY_CANADIAN_BILINGUAL 3 // Canadian-Bilingual +#define USB_HID_COUNTRY_CANADIAN_FRENCH 4 // Canadian-French +#define USB_HID_COUNTRY_CZECH_REPUBLIC 5 // Czech Republic +#define USB_HID_COUNTRY_DANISH 6 // Danish +#define USB_HID_COUNTRY_FINNISH 7 // Finnish +#define USB_HID_COUNTRY_FRENCH 8 // French +#define USB_HID_COUNTRY_GERMAN 9 // German +#define USB_HID_COUNTRY_GREEK 10 // Greek +#define USB_HID_COUNTRY_HEBREW 11 // Hebrew +#define USB_HID_COUNTRY_HUNGARY 12 // Hungary +#define USB_HID_COUNTRY_INTERNATIONAL_ISO 13 // International (ISO) +#define USB_HID_COUNTRY_ITALIAN 14 // Italian +#define USB_HID_COUNTRY_JAPAN_KATAKANA 15 // Japan (Katakana) +#define USB_HID_COUNTRY_KOREAN 16 // Korean +#define USB_HID_COUNTRY_LATIN_AMERICAN 17 // Latin American +#define USB_HID_COUNTRY_NETHERLANDS_DUTCH 18 // Netherlands/Dutch +#define USB_HID_COUNTRY_NORWEGIAN 19 // Norwegian +#define USB_HID_COUNTRY_PERSIAN_FARSI 20 // Persian (Farsi) +#define USB_HID_COUNTRY_POLAND 21 // Poland +#define USB_HID_COUNTRY_PORTUGUESE 22 // Portuguese +#define USB_HID_COUNTRY_RUSSIA 23 // Russia +#define USB_HID_COUNTRY_SLOVAKIA 24 // Slovakia +#define USB_HID_COUNTRY_SPANISH 25 // Spanish +#define USB_HID_COUNTRY_SWEDISH 26 // Swedish +#define USB_HID_COUNTRY_SWISS_FRENCH 27 // Swiss/French +#define USB_HID_COUNTRY_SWISS_GERMAN 28 // Swiss/German +#define USB_HID_COUNTRY_SWITZERLAND 29 // Switzerland +#define USB_HID_COUNTRY_TAIWAN 30 // Taiwan +#define USB_HID_COUNTRY_TURKISH_Q 31 // Turkish-Q +#define USB_HID_COUNTRY_UK 32 // UK +#define USB_HID_COUNTRY_US 33 // US +#define USB_HID_COUNTRY_YUGOSLAVIA 34 // Yugoslavia +#define USB_HID_COUNTRY_TURKISH_F 35 // Turkish-F + //! @} + //! @} +//! @} + + +//! \name HID KEYS values +//! @{ +#define HID_A 0x04 +#define HID_B 0x05 +#define HID_C 0x06 +#define HID_D 0x07 +#define HID_E 0x08 +#define HID_F 0x09 +#define HID_G 0x0A +#define HID_H 0x0B +#define HID_I 0x0C +#define HID_J 0x0D +#define HID_K 0x0E +#define HID_L 0x0F +#define HID_M 0x10 +#define HID_N 0x11 +#define HID_O 0x12 +#define HID_P 0x13 +#define HID_Q 0x14 +#define HID_R 0x15 +#define HID_S 0x16 +#define HID_T 0x17 +#define HID_U 0x18 +#define HID_V 0x19 +#define HID_W 0x1A +#define HID_X 0x1B +#define HID_Y 0x1C +#define HID_Z 0x1D +#define HID_1 30 +#define HID_2 31 +#define HID_3 32 +#define HID_4 33 +#define HID_5 34 +#define HID_6 35 +#define HID_7 36 +#define HID_8 37 +#define HID_9 38 +#define HID_0 39 +#define HID_ENTER 40 +#define HID_ESCAPE 41 +#define HID_BACKSPACE 42 +#define HID_TAB 43 +#define HID_SPACEBAR 44 +#define HID_UNDERSCORE 45 +#define HID_PLUS 46 +#define HID_OPEN_BRACKET 47 // { +#define HID_CLOSE_BRACKET 48 // } +#define HID_BACKSLASH 49 +#define HID_ASH 50 // # ~ +#define HID_COLON 51 // ; : +#define HID_QUOTE 52 // ' " +#define HID_TILDE 53 +#define HID_COMMA 54 +#define HID_DOT 55 +#define HID_SLASH 56 +#define HID_CAPS_LOCK 57 +#define HID_F1 58 +#define HID_F2 59 +#define HID_F3 60 +#define HID_F4 61 +#define HID_F5 62 +#define HID_F6 63 +#define HID_F7 64 +#define HID_F8 65 +#define HID_F9 66 +#define HID_F10 67 +#define HID_F11 68 +#define HID_F12 69 +#define HID_PRINTSCREEN 70 +#define HID_SCROLL_LOCK 71 +#define HID_PAUSE 72 +#define HID_INSERT 73 +#define HID_HOME 74 +#define HID_PAGEUP 75 +#define HID_DELETE 76 +#define HID_END 77 +#define HID_PAGEDOWN 78 +#define HID_RIGHT 79 +#define HID_LEFT 80 +#define HID_DOWN 81 +#define HID_UP 82 +#define HID_KEYPAD_NUM_LOCK 83 +#define HID_KEYPAD_DIVIDE 84 +#define HID_KEYPAD_AT 85 +#define HID_KEYPAD_MULTIPLY 85 +#define HID_KEYPAD_MINUS 86 +#define HID_KEYPAD_PLUS 87 +#define HID_KEYPAD_ENTER 88 +#define HID_KEYPAD_1 89 +#define HID_KEYPAD_2 90 +#define HID_KEYPAD_3 91 +#define HID_KEYPAD_4 92 +#define HID_KEYPAD_5 93 +#define HID_KEYPAD_6 94 +#define HID_KEYPAD_7 95 +#define HID_KEYPAD_8 96 +#define HID_KEYPAD_9 97 +#define HID_KEYPAD_0 98 + + //! \name HID modifier values + //! @{ +#define HID_MODIFIER_NONE 0x00 +#define HID_MODIFIER_LEFT_CTRL 0x01 +#define HID_MODIFIER_LEFT_SHIFT 0x02 +#define HID_MODIFIER_LEFT_ALT 0x04 +#define HID_MODIFIER_LEFT_UI 0x08 +#define HID_MODIFIER_RIGHT_CTRL 0x10 +#define HID_MODIFIER_RIGHT_SHIFT 0x20 +#define HID_MODIFIER_RIGHT_ALT 0x40 +#define HID_MODIFIER_RIGHT_UI 0x80 + //! @} +//! @} + +//! \name HID KEYS values +//! @{ +#define HID_LED_NUM_LOCK (1<<0) +#define HID_LED_CAPS_LOCK (1<<1) +#define HID_LED_SCROLL_LOCK (1<<2) +#define HID_LED_COMPOSE (1<<3) +#define HID_LED_KANA (1<<4) +//! @} + +#endif // _USB_PROTOCOL_HID_H_ diff --git a/tmk_core/protocol/arm_atsam/usb/usb_util.c b/tmk_core/protocol/arm_atsam/usb/usb_util.c new file mode 100644 index 000000000..58b349362 --- /dev/null +++ b/tmk_core/protocol/arm_atsam/usb/usb_util.c @@ -0,0 +1,59 @@ +#include "samd51j18a.h" +#include "string.h" +#include "usb_util.h" + +char digit(int d, int radix) +{ + if (d < 10) + { + return d + '0'; + } + else + { + return d - 10 + 'A'; + } +} + +int UTIL_ltoa_radix(int64_t value, char *dest, int radix) +{ + int64_t original = value; //save original value + char buf[25] = ""; + int c = sizeof(buf)-1; + int last = c; + int d; + int size; + + if (value < 0) //if it's negative, take the absolute value + value = -value; + + do //write least significant digit of value that's left + { + d = (value % radix); + buf[--c] = digit(d, radix); + value /= radix; + } while (value); + + if (original < 0) + buf[--c] = '-'; + + size = last - c + 1; //includes null at end + memcpy(dest, &buf[c], last - c + 1); + + return (size - 1); //without null termination +} + +int UTIL_ltoa(int64_t value, char *dest) +{ + return UTIL_ltoa_radix(value, dest, 10); +} + +int UTIL_itoa(int value, char *dest) +{ + return UTIL_ltoa_radix((int64_t)value, dest, 10); +} + +int UTIL_utoa(uint32_t value, char *dest) +{ + return UTIL_ltoa_radix((int64_t)value, dest, 10); +} + diff --git a/tmk_core/protocol/arm_atsam/usb/usb_util.h b/tmk_core/protocol/arm_atsam/usb/usb_util.h new file mode 100644 index 000000000..2134d5d27 --- /dev/null +++ b/tmk_core/protocol/arm_atsam/usb/usb_util.h @@ -0,0 +1,10 @@ +#ifndef _USB_UTIL_H_ +#define _USB_UTIL_H_ + +int UTIL_ltoa_radix(int64_t value, char *dest, int radix); +int UTIL_ltoa(int64_t value, char *dest); +int UTIL_itoa(int value, char *dest); +int UTIL_utoa(uint32_t value, char *dest); + +#endif //_USB_UTIL_H_ + diff --git a/tmk_core/protocol/arm_atsam/wait_api.h b/tmk_core/protocol/arm_atsam/wait_api.h new file mode 100644 index 000000000..424fbb53b --- /dev/null +++ b/tmk_core/protocol/arm_atsam/wait_api.h @@ -0,0 +1,8 @@ +#ifndef _wait_api_h_ +#define _wait_api_h_ + +void wait_ms(uint64_t msec); +void wait_us(uint16_t usec); + +#endif + From 621ce29a53e9e94e085fbd86c0b7134e9df4bfe5 Mon Sep 17 00:00:00 2001 From: yiancar Date: Wed, 29 Aug 2018 23:14:49 +0300 Subject: [PATCH 013/788] STM32 EEPROM Emulation (#3741) * STM32 EEPROM Emulation - Added EEPROM emulation libaries from libmaple and Arduino_STM32. https://github.com/rogerclarkmelbourne/Arduino_STM32 and https://github.com/leaflabs/libmaple. - Renamed teensy EEPROM library and added conditional selection of library. - Remapped EEPROM memory map for 16 byte blocks (as is with STM32f3xx MCUs). - Added EEPROM initialization in main.c of Chibios. - Added EEPROM format to clear the emulated pages when EEPROM is marked as invalid. * Fixed ifdef --- tmk_core/common.mk | 7 +- tmk_core/common/chibios/eeprom_stm32.c | 673 ++++++++++++++++++ tmk_core/common/chibios/eeprom_stm32.h | 89 +++ .../chibios/{eeprom.c => eeprom_teensy.c} | 0 tmk_core/common/chibios/flash_stm32.c | 180 +++++ tmk_core/common/chibios/flash_stm32.h | 53 ++ tmk_core/common/eeconfig.c | 11 + tmk_core/common/eeconfig.h | 16 + tmk_core/protocol/chibios/main.c | 7 + 9 files changed, 1035 insertions(+), 1 deletion(-) create mode 100755 tmk_core/common/chibios/eeprom_stm32.c create mode 100755 tmk_core/common/chibios/eeprom_stm32.h rename tmk_core/common/chibios/{eeprom.c => eeprom_teensy.c} (100%) create mode 100755 tmk_core/common/chibios/flash_stm32.c create mode 100755 tmk_core/common/chibios/flash_stm32.h diff --git a/tmk_core/common.mk b/tmk_core/common.mk index fd91d29dc..319d196ae 100644 --- a/tmk_core/common.mk +++ b/tmk_core/common.mk @@ -31,7 +31,12 @@ endif ifeq ($(PLATFORM),CHIBIOS) TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/printf.c - TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom.c + ifeq ($(MCU_SERIES), STM32F3xx) + TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom_stm32.c + TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/flash_stm32.c + else + TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom_teensy.c +endif ifeq ($(strip $(AUTO_SHIFT_ENABLE)), yes) TMK_COMMON_SRC += $(CHIBIOS)/os/various/syscalls.c endif diff --git a/tmk_core/common/chibios/eeprom_stm32.c b/tmk_core/common/chibios/eeprom_stm32.c new file mode 100755 index 000000000..3c1945122 --- /dev/null +++ b/tmk_core/common/chibios/eeprom_stm32.c @@ -0,0 +1,673 @@ +/* + * This software is experimental and a work in progress. + * Under no circumstances should these files be used in relation to any critical system(s). + * Use of these files is at your own risk. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * This files are free to use from https://github.com/rogerclarkmelbourne/Arduino_STM32 and + * https://github.com/leaflabs/libmaple + * + * Modifications for QMK and STM32F303 by Yiancar + */ + +#include "eeprom_stm32.h" + + FLASH_Status EE_ErasePage(uint32_t); + + uint16_t EE_CheckPage(uint32_t, uint16_t); + uint16_t EE_CheckErasePage(uint32_t, uint16_t); + uint16_t EE_Format(void); + uint32_t EE_FindValidPage(void); + uint16_t EE_GetVariablesCount(uint32_t, uint16_t); + uint16_t EE_PageTransfer(uint32_t, uint32_t, uint16_t); + uint16_t EE_VerifyPageFullWriteVariable(uint16_t, uint16_t); + + uint32_t PageBase0 = EEPROM_PAGE0_BASE; + uint32_t PageBase1 = EEPROM_PAGE1_BASE; + uint32_t PageSize = EEPROM_PAGE_SIZE; + uint16_t Status = EEPROM_NOT_INIT; + +// See http://www.st.com/web/en/resource/technical/document/application_note/CD00165693.pdf + +/** + * @brief Check page for blank + * @param page base address + * @retval Success or error + * EEPROM_BAD_FLASH: page not empty after erase + * EEPROM_OK: page blank + */ +uint16_t EE_CheckPage(uint32_t pageBase, uint16_t status) +{ + uint32_t pageEnd = pageBase + (uint32_t)PageSize; + + // Page Status not EEPROM_ERASED and not a "state" + if ((*(__IO uint16_t*)pageBase) != EEPROM_ERASED && (*(__IO uint16_t*)pageBase) != status) + return EEPROM_BAD_FLASH; + for(pageBase += 4; pageBase < pageEnd; pageBase += 4) + if ((*(__IO uint32_t*)pageBase) != 0xFFFFFFFF) // Verify if slot is empty + return EEPROM_BAD_FLASH; + return EEPROM_OK; +} + +/** + * @brief Erase page with increment erase counter (page + 2) + * @param page base address + * @retval Success or error + * FLASH_COMPLETE: success erase + * - Flash error code: on write Flash error + */ +FLASH_Status EE_ErasePage(uint32_t pageBase) +{ + FLASH_Status FlashStatus; + uint16_t data = (*(__IO uint16_t*)(pageBase)); + if ((data == EEPROM_ERASED) || (data == EEPROM_VALID_PAGE) || (data == EEPROM_RECEIVE_DATA)) + data = (*(__IO uint16_t*)(pageBase + 2)) + 1; + else + data = 0; + + FlashStatus = FLASH_ErasePage(pageBase); + if (FlashStatus == FLASH_COMPLETE) + FlashStatus = FLASH_ProgramHalfWord(pageBase + 2, data); + + return FlashStatus; +} + +/** + * @brief Check page for blank and erase it + * @param page base address + * @retval Success or error + * - Flash error code: on write Flash error + * - EEPROM_BAD_FLASH: page not empty after erase + * - EEPROM_OK: page blank + */ +uint16_t EE_CheckErasePage(uint32_t pageBase, uint16_t status) +{ + uint16_t FlashStatus; + if (EE_CheckPage(pageBase, status) != EEPROM_OK) + { + FlashStatus = EE_ErasePage(pageBase); + if (FlashStatus != FLASH_COMPLETE) + return FlashStatus; + return EE_CheckPage(pageBase, status); + } + return EEPROM_OK; +} + +/** + * @brief Find valid Page for write or read operation + * @param Page0: Page0 base address + * Page1: Page1 base address + * @retval Valid page address (PAGE0 or PAGE1) or NULL in case of no valid page was found + */ +uint32_t EE_FindValidPage(void) +{ + uint16_t status0 = (*(__IO uint16_t*)PageBase0); // Get Page0 actual status + uint16_t status1 = (*(__IO uint16_t*)PageBase1); // Get Page1 actual status + + if (status0 == EEPROM_VALID_PAGE && status1 == EEPROM_ERASED) + return PageBase0; + if (status1 == EEPROM_VALID_PAGE && status0 == EEPROM_ERASED) + return PageBase1; + + return 0; +} + +/** + * @brief Calculate unique variables in EEPROM + * @param start: address of first slot to check (page + 4) + * @param end: page end address + * @param address: 16 bit virtual address of the variable to excluse (or 0XFFFF) + * @retval count of variables + */ +uint16_t EE_GetVariablesCount(uint32_t pageBase, uint16_t skipAddress) +{ + uint16_t varAddress, nextAddress; + uint32_t idx; + uint32_t pageEnd = pageBase + (uint32_t)PageSize; + uint16_t count = 0; + + for (pageBase += 6; pageBase < pageEnd; pageBase += 4) + { + varAddress = (*(__IO uint16_t*)pageBase); + if (varAddress == 0xFFFF || varAddress == skipAddress) + continue; + + count++; + for(idx = pageBase + 4; idx < pageEnd; idx += 4) + { + nextAddress = (*(__IO uint16_t*)idx); + if (nextAddress == varAddress) + { + count--; + break; + } + } + } + return count; +} + +/** + * @brief Transfers last updated variables data from the full Page to an empty one. + * @param newPage: new page base address + * @param oldPage: old page base address + * @param SkipAddress: 16 bit virtual address of the variable (or 0xFFFF) + * @retval Success or error status: + * - FLASH_COMPLETE: on success + * - EEPROM_OUT_SIZE: if valid new page is full + * - Flash error code: on write Flash error + */ +uint16_t EE_PageTransfer(uint32_t newPage, uint32_t oldPage, uint16_t SkipAddress) +{ + uint32_t oldEnd, newEnd; + uint32_t oldIdx, newIdx, idx; + uint16_t address, data, found; + FLASH_Status FlashStatus; + + // Transfer process: transfer variables from old to the new active page + newEnd = newPage + ((uint32_t)PageSize); + + // Find first free element in new page + for (newIdx = newPage + 4; newIdx < newEnd; newIdx += 4) + if ((*(__IO uint32_t*)newIdx) == 0xFFFFFFFF) // Verify if element + break; // contents are 0xFFFFFFFF + if (newIdx >= newEnd) + return EEPROM_OUT_SIZE; + + oldEnd = oldPage + 4; + oldIdx = oldPage + (uint32_t)(PageSize - 2); + + for (; oldIdx > oldEnd; oldIdx -= 4) + { + address = *(__IO uint16_t*)oldIdx; + if (address == 0xFFFF || address == SkipAddress) + continue; // it's means that power off after write data + + found = 0; + for (idx = newPage + 6; idx < newIdx; idx += 4) + if ((*(__IO uint16_t*)(idx)) == address) + { + found = 1; + break; + } + + if (found) + continue; + + if (newIdx < newEnd) + { + data = (*(__IO uint16_t*)(oldIdx - 2)); + + FlashStatus = FLASH_ProgramHalfWord(newIdx, data); + if (FlashStatus != FLASH_COMPLETE) + return FlashStatus; + + FlashStatus = FLASH_ProgramHalfWord(newIdx + 2, address); + if (FlashStatus != FLASH_COMPLETE) + return FlashStatus; + + newIdx += 4; + } + else + return EEPROM_OUT_SIZE; + } + + // Erase the old Page: Set old Page status to EEPROM_EEPROM_ERASED status + data = EE_CheckErasePage(oldPage, EEPROM_ERASED); + if (data != EEPROM_OK) + return data; + + // Set new Page status + FlashStatus = FLASH_ProgramHalfWord(newPage, EEPROM_VALID_PAGE); + if (FlashStatus != FLASH_COMPLETE) + return FlashStatus; + + return EEPROM_OK; +} + +/** + * @brief Verify if active page is full and Writes variable in EEPROM. + * @param Address: 16 bit virtual address of the variable + * @param Data: 16 bit data to be written as variable value + * @retval Success or error status: + * - FLASH_COMPLETE: on success + * - EEPROM_PAGE_FULL: if valid page is full (need page transfer) + * - EEPROM_NO_VALID_PAGE: if no valid page was found + * - EEPROM_OUT_SIZE: if EEPROM size exceeded + * - Flash error code: on write Flash error + */ +uint16_t EE_VerifyPageFullWriteVariable(uint16_t Address, uint16_t Data) +{ + FLASH_Status FlashStatus; + uint32_t idx, pageBase, pageEnd, newPage; + uint16_t count; + + // Get valid Page for write operation + pageBase = EE_FindValidPage(); + if (pageBase == 0) + return EEPROM_NO_VALID_PAGE; + + // Get the valid Page end Address + pageEnd = pageBase + PageSize; // Set end of page + + for (idx = pageEnd - 2; idx > pageBase; idx -= 4) + { + if ((*(__IO uint16_t*)idx) == Address) // Find last value for address + { + count = (*(__IO uint16_t*)(idx - 2)); // Read last data + if (count == Data) + return EEPROM_OK; + if (count == 0xFFFF) + { + FlashStatus = FLASH_ProgramHalfWord(idx - 2, Data); // Set variable data + if (FlashStatus == FLASH_COMPLETE) + return EEPROM_OK; + } + break; + } + } + + // Check each active page address starting from begining + for (idx = pageBase + 4; idx < pageEnd; idx += 4) + if ((*(__IO uint32_t*)idx) == 0xFFFFFFFF) // Verify if element + { // contents are 0xFFFFFFFF + FlashStatus = FLASH_ProgramHalfWord(idx, Data); // Set variable data + if (FlashStatus != FLASH_COMPLETE) + return FlashStatus; + FlashStatus = FLASH_ProgramHalfWord(idx + 2, Address); // Set variable virtual address + if (FlashStatus != FLASH_COMPLETE) + return FlashStatus; + return EEPROM_OK; + } + + // Empty slot not found, need page transfer + // Calculate unique variables in page + count = EE_GetVariablesCount(pageBase, Address) + 1; + if (count >= (PageSize / 4 - 1)) + return EEPROM_OUT_SIZE; + + if (pageBase == PageBase1) + newPage = PageBase0; // New page address where variable will be moved to + else + newPage = PageBase1; + + // Set the new Page status to RECEIVE_DATA status + FlashStatus = FLASH_ProgramHalfWord(newPage, EEPROM_RECEIVE_DATA); + if (FlashStatus != FLASH_COMPLETE) + return FlashStatus; + + // Write the variable passed as parameter in the new active page + FlashStatus = FLASH_ProgramHalfWord(newPage + 4, Data); + if (FlashStatus != FLASH_COMPLETE) + return FlashStatus; + + FlashStatus = FLASH_ProgramHalfWord(newPage + 6, Address); + if (FlashStatus != FLASH_COMPLETE) + return FlashStatus; + + return EE_PageTransfer(newPage, pageBase, Address); +} + +/*EEPROMClass::EEPROMClass(void) +{ + PageBase0 = EEPROM_PAGE0_BASE; + PageBase1 = EEPROM_PAGE1_BASE; + PageSize = EEPROM_PAGE_SIZE; + Status = EEPROM_NOT_INIT; +}*/ +/* +uint16_t EEPROM_init(uint32_t pageBase0, uint32_t pageBase1, uint32_t pageSize) +{ + PageBase0 = pageBase0; + PageBase1 = pageBase1; + PageSize = pageSize; + return EEPROM_init(); +}*/ + +uint16_t EEPROM_init(void) +{ + uint16_t status0 = 6, status1 = 6; + FLASH_Status FlashStatus; + + FLASH_Unlock(); + Status = EEPROM_NO_VALID_PAGE; + + status0 = (*(__IO uint16_t *)PageBase0); + status1 = (*(__IO uint16_t *)PageBase1); + + switch (status0) + { +/* + Page0 Page1 + ----- ----- + EEPROM_ERASED EEPROM_VALID_PAGE Page1 valid, Page0 erased + EEPROM_RECEIVE_DATA Page1 need set to valid, Page0 erased + EEPROM_ERASED make EE_Format + any Error: EEPROM_NO_VALID_PAGE +*/ + case EEPROM_ERASED: + if (status1 == EEPROM_VALID_PAGE) // Page0 erased, Page1 valid + Status = EE_CheckErasePage(PageBase0, EEPROM_ERASED); + else if (status1 == EEPROM_RECEIVE_DATA) // Page0 erased, Page1 receive + { + FlashStatus = FLASH_ProgramHalfWord(PageBase1, EEPROM_VALID_PAGE); + if (FlashStatus != FLASH_COMPLETE) + Status = FlashStatus; + else + Status = EE_CheckErasePage(PageBase0, EEPROM_ERASED); + } + else if (status1 == EEPROM_ERASED) // Both in erased state so format EEPROM + Status = EEPROM_format(); + break; +/* + Page0 Page1 + ----- ----- + EEPROM_RECEIVE_DATA EEPROM_VALID_PAGE Transfer Page1 to Page0 + EEPROM_ERASED Page0 need set to valid, Page1 erased + any EEPROM_NO_VALID_PAGE +*/ + case EEPROM_RECEIVE_DATA: + if (status1 == EEPROM_VALID_PAGE) // Page0 receive, Page1 valid + Status = EE_PageTransfer(PageBase0, PageBase1, 0xFFFF); + else if (status1 == EEPROM_ERASED) // Page0 receive, Page1 erased + { + Status = EE_CheckErasePage(PageBase1, EEPROM_ERASED); + if (Status == EEPROM_OK) + { + FlashStatus = FLASH_ProgramHalfWord(PageBase0, EEPROM_VALID_PAGE); + if (FlashStatus != FLASH_COMPLETE) + Status = FlashStatus; + else + Status = EEPROM_OK; + } + } + break; +/* + Page0 Page1 + ----- ----- + EEPROM_VALID_PAGE EEPROM_VALID_PAGE Error: EEPROM_NO_VALID_PAGE + EEPROM_RECEIVE_DATA Transfer Page0 to Page1 + any Page0 valid, Page1 erased +*/ + case EEPROM_VALID_PAGE: + if (status1 == EEPROM_VALID_PAGE) // Both pages valid + Status = EEPROM_NO_VALID_PAGE; + else if (status1 == EEPROM_RECEIVE_DATA) + Status = EE_PageTransfer(PageBase1, PageBase0, 0xFFFF); + else + Status = EE_CheckErasePage(PageBase1, EEPROM_ERASED); + break; +/* + Page0 Page1 + ----- ----- + any EEPROM_VALID_PAGE Page1 valid, Page0 erased + EEPROM_RECEIVE_DATA Page1 valid, Page0 erased + any EEPROM_NO_VALID_PAGE +*/ + default: + if (status1 == EEPROM_VALID_PAGE) + Status = EE_CheckErasePage(PageBase0, EEPROM_ERASED); // Check/Erase Page0 + else if (status1 == EEPROM_RECEIVE_DATA) + { + FlashStatus = FLASH_ProgramHalfWord(PageBase1, EEPROM_VALID_PAGE); + if (FlashStatus != FLASH_COMPLETE) + Status = FlashStatus; + else + Status = EE_CheckErasePage(PageBase0, EEPROM_ERASED); + } + break; + } + return Status; +} + +/** + * @brief Erases PAGE0 and PAGE1 and writes EEPROM_VALID_PAGE / 0 header to PAGE0 + * @param PAGE0 and PAGE1 base addresses + * @retval Status of the last operation (Flash write or erase) done during EEPROM formating + */ +uint16_t EEPROM_format(void) +{ + uint16_t status; + FLASH_Status FlashStatus; + + FLASH_Unlock(); + + // Erase Page0 + status = EE_CheckErasePage(PageBase0, EEPROM_VALID_PAGE); + if (status != EEPROM_OK) + return status; + if ((*(__IO uint16_t*)PageBase0) == EEPROM_ERASED) + { + // Set Page0 as valid page: Write VALID_PAGE at Page0 base address + FlashStatus = FLASH_ProgramHalfWord(PageBase0, EEPROM_VALID_PAGE); + if (FlashStatus != FLASH_COMPLETE) + return FlashStatus; + } + // Erase Page1 + return EE_CheckErasePage(PageBase1, EEPROM_ERASED); +} + +/** + * @brief Returns the erase counter for current page + * @param Data: Global variable contains the read variable value + * @retval Success or error status: + * - EEPROM_OK: if erases counter return. + * - EEPROM_NO_VALID_PAGE: if no valid page was found. + */ +uint16_t EEPROM_erases(uint16_t *Erases) +{ + uint32_t pageBase; + if (Status != EEPROM_OK) + if (EEPROM_init() != EEPROM_OK) + return Status; + + // Get active Page for read operation + pageBase = EE_FindValidPage(); + if (pageBase == 0) + return EEPROM_NO_VALID_PAGE; + + *Erases = (*(__IO uint16_t*)pageBase+2); + return EEPROM_OK; +} + +/** + * @brief Returns the last stored variable data, if found, + * which correspond to the passed virtual address + * @param Address: Variable virtual address + * @retval Data for variable or EEPROM_DEFAULT_DATA, if any errors + */ +/* +uint16_t EEPROM_read (uint16_t Address) +{ + uint16_t data; + EEPROM_read(Address, &data); + return data; +}*/ + +/** + * @brief Returns the last stored variable data, if found, + * which correspond to the passed virtual address + * @param Address: Variable virtual address + * @param Data: Pointer to data variable + * @retval Success or error status: + * - EEPROM_OK: if variable was found + * - EEPROM_BAD_ADDRESS: if the variable was not found + * - EEPROM_NO_VALID_PAGE: if no valid page was found. + */ +uint16_t EEPROM_read(uint16_t Address, uint16_t *Data) +{ + uint32_t pageBase, pageEnd; + + // Set default data (empty EEPROM) + *Data = EEPROM_DEFAULT_DATA; + + if (Status == EEPROM_NOT_INIT) + if (EEPROM_init() != EEPROM_OK) + return Status; + + // Get active Page for read operation + pageBase = EE_FindValidPage(); + if (pageBase == 0) + return EEPROM_NO_VALID_PAGE; + + // Get the valid Page end Address + pageEnd = pageBase + ((uint32_t)(PageSize - 2)); + + // Check each active page address starting from end + for (pageBase += 6; pageEnd >= pageBase; pageEnd -= 4) + if ((*(__IO uint16_t*)pageEnd) == Address) // Compare the read address with the virtual address + { + *Data = (*(__IO uint16_t*)(pageEnd - 2)); // Get content of Address-2 which is variable value + return EEPROM_OK; + } + + // Return ReadStatus value: (0: variable exist, 1: variable doesn't exist) + return EEPROM_BAD_ADDRESS; +} + +/** + * @brief Writes/upadtes variable data in EEPROM. + * @param VirtAddress: Variable virtual address + * @param Data: 16 bit data to be written + * @retval Success or error status: + * - FLASH_COMPLETE: on success + * - EEPROM_BAD_ADDRESS: if address = 0xFFFF + * - EEPROM_PAGE_FULL: if valid page is full + * - EEPROM_NO_VALID_PAGE: if no valid page was found + * - EEPROM_OUT_SIZE: if no empty EEPROM variables + * - Flash error code: on write Flash error + */ +uint16_t EEPROM_write(uint16_t Address, uint16_t Data) +{ + if (Status == EEPROM_NOT_INIT) + if (EEPROM_init() != EEPROM_OK) + return Status; + + if (Address == 0xFFFF) + return EEPROM_BAD_ADDRESS; + + // Write the variable virtual address and value in the EEPROM + uint16_t status = EE_VerifyPageFullWriteVariable(Address, Data); + return status; +} + +/** + * @brief Writes/upadtes variable data in EEPROM. + The value is written only if differs from the one already saved at the same address. + * @param VirtAddress: Variable virtual address + * @param Data: 16 bit data to be written + * @retval Success or error status: + * - EEPROM_SAME_VALUE: If new Data matches existing EEPROM Data + * - FLASH_COMPLETE: on success + * - EEPROM_BAD_ADDRESS: if address = 0xFFFF + * - EEPROM_PAGE_FULL: if valid page is full + * - EEPROM_NO_VALID_PAGE: if no valid page was found + * - EEPROM_OUT_SIZE: if no empty EEPROM variables + * - Flash error code: on write Flash error + */ +uint16_t EEPROM_update(uint16_t Address, uint16_t Data) +{ + uint16_t temp; + EEPROM_read(Address, &temp); + if (Address == Data) + return EEPROM_SAME_VALUE; + else + return EEPROM_write(Address, Data); +} + +/** + * @brief Return number of variable + * @retval Number of variables + */ +uint16_t EEPROM_count(uint16_t *Count) +{ + if (Status == EEPROM_NOT_INIT) + if (EEPROM_init() != EEPROM_OK) + return Status; + + // Get valid Page for write operation + uint32_t pageBase = EE_FindValidPage(); + if (pageBase == 0) + return EEPROM_NO_VALID_PAGE; // No valid page, return max. numbers + + *Count = EE_GetVariablesCount(pageBase, 0xFFFF); + return EEPROM_OK; +} + +uint16_t EEPROM_maxcount(void) +{ + return ((PageSize / 4)-1); +} + + +uint8_t eeprom_read_byte (const uint8_t *Address) +{ + const uint16_t p = (const uint32_t) Address; + uint16_t temp; + EEPROM_read(p, &temp); + return (uint8_t) temp; +} + +void eeprom_write_byte (uint8_t *Address, uint8_t Value) +{ + uint16_t p = (uint32_t) Address; + EEPROM_write(p, (uint16_t) Value); +} + +void eeprom_update_byte (uint8_t *Address, uint8_t Value) +{ + uint16_t p = (uint32_t) Address; + EEPROM_update(p, (uint16_t) Value); +} + +uint16_t eeprom_read_word (const uint16_t *Address) +{ + const uint16_t p = (const uint32_t) Address; + uint16_t temp; + EEPROM_read(p, &temp); + return temp; +} + +void eeprom_write_word (uint16_t *Address, uint16_t Value) +{ + uint16_t p = (uint32_t) Address; + EEPROM_write(p, Value); +} + +void eeprom_update_word (uint16_t *Address, uint16_t Value) +{ + uint16_t p = (uint32_t) Address; + EEPROM_update(p, Value); +} + +uint32_t eeprom_read_dword (const uint32_t *Address) +{ + const uint16_t p = (const uint32_t) Address; + uint16_t temp1, temp2; + EEPROM_read(p, &temp1); + EEPROM_read(p + 1, &temp2); + return temp1 | (temp2 << 16); +} + +void eeprom_write_dword (uint32_t *Address, uint32_t Value) +{ + uint16_t temp = (uint16_t) Value; + uint16_t p = (uint32_t) Address; + EEPROM_write(p, temp); + temp = (uint16_t) (Value >> 16); + EEPROM_write(p + 1, temp); +} + +void eeprom_update_dword (uint32_t *Address, uint32_t Value) +{ + uint16_t temp = (uint16_t) Value; + uint16_t p = (uint32_t) Address; + EEPROM_update(p, temp); + temp = (uint16_t) (Value >> 16); + EEPROM_update(p + 1, temp); +} diff --git a/tmk_core/common/chibios/eeprom_stm32.h b/tmk_core/common/chibios/eeprom_stm32.h new file mode 100755 index 000000000..d06d30266 --- /dev/null +++ b/tmk_core/common/chibios/eeprom_stm32.h @@ -0,0 +1,89 @@ +/* + * This software is experimental and a work in progress. + * Under no circumstances should these files be used in relation to any critical system(s). + * Use of these files is at your own risk. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * This files are free to use from https://github.com/rogerclarkmelbourne/Arduino_STM32 and + * https://github.com/leaflabs/libmaple + * + * Modifications for QMK and STM32F303 by Yiancar + */ + +// This file must be modified if the MCU is not defined below. +// This library also assumes that the pages are not used by the firmware. + +#ifndef __EEPROM_H +#define __EEPROM_H + +#include "ch.h" +#include "hal.h" +#include "flash_stm32.h" + +// HACK ALERT. This definition may not match your processor +// To Do. Work out correct value for EEPROM_PAGE_SIZE on the STM32F103CT6 etc +#define MCU_STM32F303CC + +#ifndef EEPROM_PAGE_SIZE + #if defined (MCU_STM32F103RB) + #define EEPROM_PAGE_SIZE (uint16_t)0x400 /* Page size = 1KByte */ + #elif defined (MCU_STM32F103ZE) || defined (MCU_STM32F103RE) || defined (MCU_STM32F103RD) || defined (MCU_STM32F303CC) + #define EEPROM_PAGE_SIZE (uint16_t)0x800 /* Page size = 2KByte */ + #else + #error "No MCU type specified. Add something like -DMCU_STM32F103RB to your compiler arguments (probably in a Makefile)." + #endif +#endif + +#ifndef EEPROM_START_ADDRESS + #if defined (MCU_STM32F103RB) + #define EEPROM_START_ADDRESS ((uint32_t)(0x8000000 + 128 * 1024 - 2 * EEPROM_PAGE_SIZE)) + #elif defined (MCU_STM32F103ZE) || defined (MCU_STM32F103RE) + #define EEPROM_START_ADDRESS ((uint32_t)(0x8000000 + 512 * 1024 - 2 * EEPROM_PAGE_SIZE)) + #elif defined (MCU_STM32F103RD) + #define EEPROM_START_ADDRESS ((uint32_t)(0x8000000 + 384 * 1024 - 2 * EEPROM_PAGE_SIZE)) + #elif defined (MCU_STM32F303CC) + #define EEPROM_START_ADDRESS ((uint32_t)(0x8000000 + 250 * 1024 - 2 * EEPROM_PAGE_SIZE)) + #else + #error "No MCU type specified. Add something like -DMCU_STM32F103RB to your compiler arguments (probably in a Makefile)." + #endif +#endif + +/* Pages 0 and 1 base and end addresses */ +#define EEPROM_PAGE0_BASE ((uint32_t)(EEPROM_START_ADDRESS + 0x000)) +#define EEPROM_PAGE1_BASE ((uint32_t)(EEPROM_START_ADDRESS + EEPROM_PAGE_SIZE)) + +/* Page status definitions */ +#define EEPROM_ERASED ((uint16_t)0xFFFF) /* PAGE is empty */ +#define EEPROM_RECEIVE_DATA ((uint16_t)0xEEEE) /* PAGE is marked to receive data */ +#define EEPROM_VALID_PAGE ((uint16_t)0x0000) /* PAGE containing valid data */ + +/* Page full define */ +enum uint16_t + { + EEPROM_OK = ((uint16_t)0x0000), + EEPROM_OUT_SIZE = ((uint16_t)0x0081), + EEPROM_BAD_ADDRESS = ((uint16_t)0x0082), + EEPROM_BAD_FLASH = ((uint16_t)0x0083), + EEPROM_NOT_INIT = ((uint16_t)0x0084), + EEPROM_SAME_VALUE = ((uint16_t)0x0085), + EEPROM_NO_VALID_PAGE = ((uint16_t)0x00AB) + }; + +#define EEPROM_DEFAULT_DATA 0xFFFF + + uint16_t EEPROM_init(void); + uint16_t EEPROM_format(void); + uint16_t EEPROM_erases(uint16_t *); + uint16_t EEPROM_read (uint16_t address, uint16_t *data); + uint16_t EEPROM_write(uint16_t address, uint16_t data); + uint16_t EEPROM_update(uint16_t address, uint16_t data); + uint16_t EEPROM_count(uint16_t *); + uint16_t EEPROM_maxcount(void); + +#endif /* __EEPROM_H */ diff --git a/tmk_core/common/chibios/eeprom.c b/tmk_core/common/chibios/eeprom_teensy.c similarity index 100% rename from tmk_core/common/chibios/eeprom.c rename to tmk_core/common/chibios/eeprom_teensy.c diff --git a/tmk_core/common/chibios/flash_stm32.c b/tmk_core/common/chibios/flash_stm32.c new file mode 100755 index 000000000..e7199ac7b --- /dev/null +++ b/tmk_core/common/chibios/flash_stm32.c @@ -0,0 +1,180 @@ +/* + * This software is experimental and a work in progress. + * Under no circumstances should these files be used in relation to any critical system(s). + * Use of these files is at your own risk. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * This files are free to use from https://github.com/rogerclarkmelbourne/Arduino_STM32 and + * https://github.com/leaflabs/libmaple + * + * Modifications for QMK and STM32F303 by Yiancar + */ + +#define STM32F303xC + +#include "stm32f3xx.h" +#include "flash_stm32.h" + +#define FLASH_KEY1 ((uint32_t)0x45670123) +#define FLASH_KEY2 ((uint32_t)0xCDEF89AB) + +/* Delay definition */ +#define EraseTimeout ((uint32_t)0x00000FFF) +#define ProgramTimeout ((uint32_t)0x0000001F) + +#define ASSERT(exp) (void)((0)) + +/** + * @brief Inserts a time delay. + * @param None + * @retval None + */ +static void delay(void) +{ + __IO uint32_t i = 0; + for(i = 0xFF; i != 0; i--) { } +} + +/** + * @brief Returns the FLASH Status. + * @param None + * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP or FLASH_COMPLETE + */ +FLASH_Status FLASH_GetStatus(void) +{ + if ((FLASH->SR & FLASH_SR_BSY) == FLASH_SR_BSY) + return FLASH_BUSY; + + if ((FLASH->SR & FLASH_SR_PGERR) != 0) + return FLASH_ERROR_PG; + + if ((FLASH->SR & FLASH_SR_WRPERR) != 0 ) + return FLASH_ERROR_WRP; + + if ((FLASH->SR & FLASH_OBR_OPTERR) != 0 ) + return FLASH_ERROR_OPT; + + return FLASH_COMPLETE; +} + +/** + * @brief Waits for a Flash operation to complete or a TIMEOUT to occur. + * @param Timeout: FLASH progamming Timeout + * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout) +{ + FLASH_Status status; + + /* Check for the Flash Status */ + status = FLASH_GetStatus(); + /* Wait for a Flash operation to complete or a TIMEOUT to occur */ + while ((status == FLASH_BUSY) && (Timeout != 0x00)) + { + delay(); + status = FLASH_GetStatus(); + Timeout--; + } + if (Timeout == 0) + status = FLASH_TIMEOUT; + /* Return the operation status */ + return status; +} + +/** + * @brief Erases a specified FLASH page. + * @param Page_Address: The page address to be erased. + * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_ErasePage(uint32_t Page_Address) +{ + FLASH_Status status = FLASH_COMPLETE; + /* Check the parameters */ + ASSERT(IS_FLASH_ADDRESS(Page_Address)); + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(EraseTimeout); + + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to erase the page */ + FLASH->CR |= FLASH_CR_PER; + FLASH->AR = Page_Address; + FLASH->CR |= FLASH_CR_STRT; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(EraseTimeout); + if(status != FLASH_TIMEOUT) + { + /* if the erase operation is completed, disable the PER Bit */ + FLASH->CR &= ~FLASH_CR_PER; + } + FLASH->SR = (FLASH_SR_EOP | FLASH_SR_PGERR | FLASH_SR_WRPERR); + } + /* Return the Erase Status */ + return status; +} + +/** + * @brief Programs a half word at a specified address. + * @param Address: specifies the address to be programmed. + * @param Data: specifies the data to be programmed. + * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data) +{ + FLASH_Status status = FLASH_BAD_ADDRESS; + + if (IS_FLASH_ADDRESS(Address)) + { + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to program the new data */ + FLASH->CR |= FLASH_CR_PG; + *(__IO uint16_t*)Address = Data; + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + if(status != FLASH_TIMEOUT) + { + /* if the program operation is completed, disable the PG Bit */ + FLASH->CR &= ~FLASH_CR_PG; + } + FLASH->SR = (FLASH_SR_EOP | FLASH_SR_PGERR | FLASH_SR_WRPERR); + } + } + return status; +} + +/** + * @brief Unlocks the FLASH Program Erase Controller. + * @param None + * @retval None + */ +void FLASH_Unlock(void) +{ + /* Authorize the FPEC Access */ + FLASH->KEYR = FLASH_KEY1; + FLASH->KEYR = FLASH_KEY2; +} + +/** + * @brief Locks the FLASH Program Erase Controller. + * @param None + * @retval None + */ +void FLASH_Lock(void) +{ + /* Set the Lock Bit to lock the FPEC and the FCR */ + FLASH->CR |= FLASH_CR_LOCK; +} diff --git a/tmk_core/common/chibios/flash_stm32.h b/tmk_core/common/chibios/flash_stm32.h new file mode 100755 index 000000000..cc065cbca --- /dev/null +++ b/tmk_core/common/chibios/flash_stm32.h @@ -0,0 +1,53 @@ +/* + * This software is experimental and a work in progress. + * Under no circumstances should these files be used in relation to any critical system(s). + * Use of these files is at your own risk. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * This files are free to use from https://github.com/rogerclarkmelbourne/Arduino_STM32 and + * https://github.com/leaflabs/libmaple + * + * Modifications for QMK and STM32F303 by Yiancar + */ + +#ifndef __FLASH_STM32_H +#define __FLASH_STM32_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ch.h" +#include "hal.h" + +typedef enum + { + FLASH_BUSY = 1, + FLASH_ERROR_PG, + FLASH_ERROR_WRP, + FLASH_ERROR_OPT, + FLASH_COMPLETE, + FLASH_TIMEOUT, + FLASH_BAD_ADDRESS + } FLASH_Status; + +#define IS_FLASH_ADDRESS(ADDRESS) (((ADDRESS) >= 0x08000000) && ((ADDRESS) < 0x0807FFFF)) + +FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout); +FLASH_Status FLASH_ErasePage(uint32_t Page_Address); +FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data); + +void FLASH_Unlock(void); +void FLASH_Lock(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __FLASH_STM32_H */ diff --git a/tmk_core/common/eeconfig.c b/tmk_core/common/eeconfig.c index 3e5987ee3..35de574a9 100644 --- a/tmk_core/common/eeconfig.c +++ b/tmk_core/common/eeconfig.c @@ -3,12 +3,20 @@ #include "eeprom.h" #include "eeconfig.h" +#ifdef STM32F303xC +#include "hal.h" +#include "eeprom_stm32.h" +#endif + /** \brief eeconfig initialization * * FIXME: needs doc */ void eeconfig_init(void) { +#ifdef STM32F303xC + EEPROM_format(); +#endif eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER); eeprom_update_byte(EECONFIG_DEBUG, 0); eeprom_update_byte(EECONFIG_DEFAULT_LAYER, 0); @@ -43,6 +51,9 @@ void eeconfig_enable(void) */ void eeconfig_disable(void) { +#ifdef STM32F303xC + EEPROM_format(); +#endif eeprom_update_word(EECONFIG_MAGIC, 0xFFFF); } diff --git a/tmk_core/common/eeconfig.h b/tmk_core/common/eeconfig.h index 1397a90c7..fa498df48 100644 --- a/tmk_core/common/eeconfig.h +++ b/tmk_core/common/eeconfig.h @@ -25,6 +25,7 @@ along with this program. If not, see . #define EECONFIG_MAGIC_NUMBER (uint16_t)0xFEED /* eeprom parameteter address */ +#if !defined(STM32F303xC) #define EECONFIG_MAGIC (uint16_t *)0 #define EECONFIG_DEBUG (uint8_t *)2 #define EECONFIG_DEFAULT_LAYER (uint8_t *)3 @@ -38,6 +39,21 @@ along with this program. If not, see . // EEHANDS for two handed boards #define EECONFIG_HANDEDNESS (uint8_t *)14 +#else +/* STM32F3 uses 16byte block. Reconfigure memory map */ +#define EECONFIG_MAGIC (uint16_t *)0 +#define EECONFIG_DEBUG (uint8_t *)1 +#define EECONFIG_DEFAULT_LAYER (uint8_t *)2 +#define EECONFIG_KEYMAP (uint8_t *)3 +#define EECONFIG_MOUSEKEY_ACCEL (uint8_t *)4 +#define EECONFIG_BACKLIGHT (uint8_t *)5 +#define EECONFIG_AUDIO (uint8_t *)6 +#define EECONFIG_RGBLIGHT (uint32_t *)7 +#define EECONFIG_UNICODEMODE (uint8_t *)9 +#define EECONFIG_STENOMODE (uint8_t *)10 +// EEHANDS for two handed boards +#define EECONFIG_HANDEDNESS (uint8_t *)11 +#endif /* debug bit */ #define EECONFIG_DEBUG_ENABLE (1<<0) diff --git a/tmk_core/protocol/chibios/main.c b/tmk_core/protocol/chibios/main.c index f2abc438d..568c1edb2 100644 --- a/tmk_core/protocol/chibios/main.c +++ b/tmk_core/protocol/chibios/main.c @@ -44,6 +44,9 @@ #ifdef MIDI_ENABLE #include "qmk_midi.h" #endif +#ifdef STM32F303xC +#include "eeprom_stm32.h" +#endif #include "suspend.h" #include "wait.h" @@ -109,6 +112,10 @@ int main(void) { halInit(); chSysInit(); +#ifdef STM32F303xC + EEPROM_init(); +#endif + // TESTING // chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); From 6794a5c9dcf12c7b528c46dfd48d8f7157bc585f Mon Sep 17 00:00:00 2001 From: mechmerlin Date: Wed, 29 Aug 2018 13:27:03 -0700 Subject: [PATCH 014/788] move massdrop boards into its own directory for configurator visibility --- keyboards/{ => massdrop}/alt67/alt67.h | 0 keyboards/{ => massdrop}/alt67/config.h | 0 keyboards/{ => massdrop}/alt67/config_led.h | 0 keyboards/{ => massdrop}/alt67/keymaps/default/keymap.c | 0 keyboards/{ => massdrop}/alt67/led_programs.c | 0 keyboards/{ => massdrop}/alt67/matrix.c | 0 keyboards/{ => massdrop}/alt67/matrix.h | 0 keyboards/{ => massdrop}/alt67/readme.md | 0 keyboards/{ => massdrop}/alt67/rules.mk | 0 keyboards/{ => massdrop}/ctrl/config.h | 0 keyboards/{ => massdrop}/ctrl/config_led.h | 0 keyboards/{ => massdrop}/ctrl/ctrl.h | 0 keyboards/{ => massdrop}/ctrl/keymaps/default/keymap.c | 0 keyboards/{ => massdrop}/ctrl/led_programs.c | 0 keyboards/{ => massdrop}/ctrl/matrix.c | 0 keyboards/{ => massdrop}/ctrl/matrix.h | 0 keyboards/{ => massdrop}/ctrl/readme.md | 0 keyboards/{ => massdrop}/ctrl/rules.mk | 0 18 files changed, 0 insertions(+), 0 deletions(-) rename keyboards/{ => massdrop}/alt67/alt67.h (100%) rename keyboards/{ => massdrop}/alt67/config.h (100%) rename keyboards/{ => massdrop}/alt67/config_led.h (100%) rename keyboards/{ => massdrop}/alt67/keymaps/default/keymap.c (100%) rename keyboards/{ => massdrop}/alt67/led_programs.c (100%) rename keyboards/{ => massdrop}/alt67/matrix.c (100%) rename keyboards/{ => massdrop}/alt67/matrix.h (100%) rename keyboards/{ => massdrop}/alt67/readme.md (100%) rename keyboards/{ => massdrop}/alt67/rules.mk (100%) rename keyboards/{ => massdrop}/ctrl/config.h (100%) rename keyboards/{ => massdrop}/ctrl/config_led.h (100%) rename keyboards/{ => massdrop}/ctrl/ctrl.h (100%) rename keyboards/{ => massdrop}/ctrl/keymaps/default/keymap.c (100%) rename keyboards/{ => massdrop}/ctrl/led_programs.c (100%) rename keyboards/{ => massdrop}/ctrl/matrix.c (100%) rename keyboards/{ => massdrop}/ctrl/matrix.h (100%) rename keyboards/{ => massdrop}/ctrl/readme.md (100%) rename keyboards/{ => massdrop}/ctrl/rules.mk (100%) diff --git a/keyboards/alt67/alt67.h b/keyboards/massdrop/alt67/alt67.h similarity index 100% rename from keyboards/alt67/alt67.h rename to keyboards/massdrop/alt67/alt67.h diff --git a/keyboards/alt67/config.h b/keyboards/massdrop/alt67/config.h similarity index 100% rename from keyboards/alt67/config.h rename to keyboards/massdrop/alt67/config.h diff --git a/keyboards/alt67/config_led.h b/keyboards/massdrop/alt67/config_led.h similarity index 100% rename from keyboards/alt67/config_led.h rename to keyboards/massdrop/alt67/config_led.h diff --git a/keyboards/alt67/keymaps/default/keymap.c b/keyboards/massdrop/alt67/keymaps/default/keymap.c similarity index 100% rename from keyboards/alt67/keymaps/default/keymap.c rename to keyboards/massdrop/alt67/keymaps/default/keymap.c diff --git a/keyboards/alt67/led_programs.c b/keyboards/massdrop/alt67/led_programs.c similarity index 100% rename from keyboards/alt67/led_programs.c rename to keyboards/massdrop/alt67/led_programs.c diff --git a/keyboards/alt67/matrix.c b/keyboards/massdrop/alt67/matrix.c similarity index 100% rename from keyboards/alt67/matrix.c rename to keyboards/massdrop/alt67/matrix.c diff --git a/keyboards/alt67/matrix.h b/keyboards/massdrop/alt67/matrix.h similarity index 100% rename from keyboards/alt67/matrix.h rename to keyboards/massdrop/alt67/matrix.h diff --git a/keyboards/alt67/readme.md b/keyboards/massdrop/alt67/readme.md similarity index 100% rename from keyboards/alt67/readme.md rename to keyboards/massdrop/alt67/readme.md diff --git a/keyboards/alt67/rules.mk b/keyboards/massdrop/alt67/rules.mk similarity index 100% rename from keyboards/alt67/rules.mk rename to keyboards/massdrop/alt67/rules.mk diff --git a/keyboards/ctrl/config.h b/keyboards/massdrop/ctrl/config.h similarity index 100% rename from keyboards/ctrl/config.h rename to keyboards/massdrop/ctrl/config.h diff --git a/keyboards/ctrl/config_led.h b/keyboards/massdrop/ctrl/config_led.h similarity index 100% rename from keyboards/ctrl/config_led.h rename to keyboards/massdrop/ctrl/config_led.h diff --git a/keyboards/ctrl/ctrl.h b/keyboards/massdrop/ctrl/ctrl.h similarity index 100% rename from keyboards/ctrl/ctrl.h rename to keyboards/massdrop/ctrl/ctrl.h diff --git a/keyboards/ctrl/keymaps/default/keymap.c b/keyboards/massdrop/ctrl/keymaps/default/keymap.c similarity index 100% rename from keyboards/ctrl/keymaps/default/keymap.c rename to keyboards/massdrop/ctrl/keymaps/default/keymap.c diff --git a/keyboards/ctrl/led_programs.c b/keyboards/massdrop/ctrl/led_programs.c similarity index 100% rename from keyboards/ctrl/led_programs.c rename to keyboards/massdrop/ctrl/led_programs.c diff --git a/keyboards/ctrl/matrix.c b/keyboards/massdrop/ctrl/matrix.c similarity index 100% rename from keyboards/ctrl/matrix.c rename to keyboards/massdrop/ctrl/matrix.c diff --git a/keyboards/ctrl/matrix.h b/keyboards/massdrop/ctrl/matrix.h similarity index 100% rename from keyboards/ctrl/matrix.h rename to keyboards/massdrop/ctrl/matrix.h diff --git a/keyboards/ctrl/readme.md b/keyboards/massdrop/ctrl/readme.md similarity index 100% rename from keyboards/ctrl/readme.md rename to keyboards/massdrop/ctrl/readme.md diff --git a/keyboards/ctrl/rules.mk b/keyboards/massdrop/ctrl/rules.mk similarity index 100% rename from keyboards/ctrl/rules.mk rename to keyboards/massdrop/ctrl/rules.mk From 972388447b03e1c403f20acd6c6b04363864f66e Mon Sep 17 00:00:00 2001 From: patrickmt <40182064+patrickmt@users.noreply.github.com> Date: Wed, 29 Aug 2018 17:11:58 -0400 Subject: [PATCH 015/788] Massdrop keyboards readme update (#3791) Massdrop keyboards readme update for flashing instructions --- keyboards/massdrop/alt67/readme.md | 5 +++++ keyboards/massdrop/ctrl/readme.md | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/keyboards/massdrop/alt67/readme.md b/keyboards/massdrop/alt67/readme.md index 27a7a64da..1632d8b57 100644 --- a/keyboards/massdrop/alt67/readme.md +++ b/keyboards/massdrop/alt67/readme.md @@ -12,4 +12,9 @@ Make example for this keyboard (after setting up your build environment): make alt67:default +For information on flashing this keyboard, visit the following links: + +[Massdrop Loader Releases](https://github.com/Massdrop/mdloader/releases/tag/0.0.1) +[Massdrop Loader Repository and Instructions](https://github.com/Massdrop/mdloader) + 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). \ No newline at end of file diff --git a/keyboards/massdrop/ctrl/readme.md b/keyboards/massdrop/ctrl/readme.md index 54157c3da..4a57095c5 100644 --- a/keyboards/massdrop/ctrl/readme.md +++ b/keyboards/massdrop/ctrl/readme.md @@ -12,4 +12,9 @@ Make example for this keyboard (after setting up your build environment): make ctrl:default +For information on flashing this keyboard, visit the following links: + +[Massdrop Loader Releases](https://github.com/Massdrop/mdloader/releases/tag/0.0.1) +[Massdrop Loader Repository and Instructions](https://github.com/Massdrop/mdloader) + 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). \ No newline at end of file From d12d058baeb1f26a05077f88406bc3222f185129 Mon Sep 17 00:00:00 2001 From: TerryMathews Date: Sun, 26 Aug 2018 13:12:41 -0400 Subject: [PATCH 016/788] Autodetect lack of screen presence This is the simplest, most efficient way I could come up with to silence the "Failed to start write 60" error that occurs when QMK tries to talk to a screen that doesn't exist. iota_gfx_init passes a success boolean. We catch that into a global bool (we could rewrite multiple functions to pass this as an argument, but given the number of keyboards using this code it seemed less disruptive this way) and then use that as a conditional on running the iota_gfx_task in matrix_scan_user. Tl;dr: if the screen doesn't init, the screen write code doesn't run. --- keyboards/tkc1800/keymaps/default/keymap.c | 10 ++++++++-- keyboards/tkc1800/keymaps/wkl/keymap.c | 10 ++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/keyboards/tkc1800/keymaps/default/keymap.c b/keyboards/tkc1800/keymaps/default/keymap.c index 3a11aed2f..cc19de3bd 100644 --- a/keyboards/tkc1800/keymaps/default/keymap.c +++ b/keyboards/tkc1800/keymaps/default/keymap.c @@ -34,6 +34,8 @@ enum { FUNCTION, }; +bool screenWorks = 0; + //13 characters max without re-writing the "Layer: " format in iota_gfx_task_user() static char layer_lookup[][14] = {"Base","Function"}; @@ -93,7 +95,9 @@ void matrix_init_user(void) { // calls code for the SSD1306 OLED _delay_ms(400); TWI_Init(TWI_BIT_PRESCALE_1, TWI_BITLENGTH_FROM_FREQ(1, 800000)); - iota_gfx_init(); // turns on the display + if(iota_gfx_init()){ // turns on the display + screenWorks = 1; + } #endif #endif #ifdef AUDIO_ENABLE @@ -103,7 +107,9 @@ void matrix_init_user(void) { void matrix_scan_user(void) { #ifdef SSD1306OLED - iota_gfx_task(); // this is what updates the display continuously + if(screenWorks){ + iota_gfx_task(); // this is what updates the display continuously + }; #endif } diff --git a/keyboards/tkc1800/keymaps/wkl/keymap.c b/keyboards/tkc1800/keymaps/wkl/keymap.c index 40d2e5fad..e04c4d5c1 100644 --- a/keyboards/tkc1800/keymaps/wkl/keymap.c +++ b/keyboards/tkc1800/keymaps/wkl/keymap.c @@ -34,6 +34,8 @@ enum { FUNCTION, }; +bool screenWorks = 0; + //13 characters max without re-writing the "Layer: " format in iota_gfx_task_user() static char layer_lookup[][14] = {"Base","Function"}; @@ -93,7 +95,9 @@ void matrix_init_user(void) { // calls code for the SSD1306 OLED _delay_ms(400); TWI_Init(TWI_BIT_PRESCALE_1, TWI_BITLENGTH_FROM_FREQ(1, 800000)); - iota_gfx_init(); // turns on the display + if(iota_gfx_init()){ // turns on the display + screenWorks = 1; + } #endif #endif #ifdef AUDIO_ENABLE @@ -103,7 +107,9 @@ void matrix_init_user(void) { void matrix_scan_user(void) { #ifdef SSD1306OLED - iota_gfx_task(); // this is what updates the display continuously + if(screenWorks){ + iota_gfx_task(); // this is what updates the display continuously + }; #endif } From 097f1a299f2d0e0e5afe174b8cfc1eea1b00c7cf Mon Sep 17 00:00:00 2001 From: fauxpark Date: Thu, 30 Aug 2018 11:05:02 +1000 Subject: [PATCH 017/788] Mask off keycode/layer/mod where possible in LT(), MT(), etc. (#3430) * Mask off keycode/layer/mod where possible in LT(), MT(), etc. * Don't need these parentheses * Put back parentheses for order of operations --- docs/feature_advanced_keycodes.md | 10 ++-- quantum/quantum_keycodes.h | 88 +++++++++++++++---------------- 2 files changed, 48 insertions(+), 50 deletions(-) diff --git a/docs/feature_advanced_keycodes.md b/docs/feature_advanced_keycodes.md index f93b8033a..5713234be 100644 --- a/docs/feature_advanced_keycodes.md +++ b/docs/feature_advanced_keycodes.md @@ -13,9 +13,11 @@ People often define custom names using `#define`. For example: This will allow you to use `FN_CAPS` and `ALT_TAB` in your `KEYMAP()`, keeping it more readable. -### Limits of These Aliases +### Caveats -Currently, the keycodes able to used with these functions are limited to the [Basic Keycodes](keycodes_basic.md), meaning you can't use keycodes like `KC_TILD`, or anything greater than 0xFF. For a full list of the keycodes able to be used see [Basic Keycodes](keycodes_basic.md). +Currently, `LT()` and `MT()` are limited to the [Basic Keycode set](keycodes_basic.md), meaning you can't use keycodes like `LCTL()`, `KC_TILD`, or anything greater than `0xFF`. Modifiers specified as part of a Layer Tap or Mod Tap's keycode will be ignored. + +Additionally, if at least one right-handed modifier is specified in a Mod Tap or Layer Tap, it will cause all modifiers specified to become right-handed, so it is not possible to mix and match the two. # Switching and Toggling Layers @@ -103,10 +105,6 @@ We've added shortcuts to make common modifier/tap (mod-tap) mappings more compac * `LCAG_T(kc)` - is CtrlAltGui when held and *kc* when tapped * `MEH_T(kc)` - is like Hyper, but not as cool -- does not include the Cmd/Win key, so just sends Alt+Ctrl+Shift. -?> Due to the way that keycodes are structured, any modifiers specified as part of `kc`, such as `LCTL()` or `KC_LPRN`, will only activate when held instead of tapped. - -?> Additionally, if there is at least one right-handed modifier, any other modifiers in a chain of functions will turn into their right-handed equivalents, so it is not possible to "mix and match" the two. - # One Shot Keys One shot keys are keys that remain active until the next key is pressed, and then are released. This allows you to type keyboard combinations without pressing more than one key at a time. These keys are usually called "Sticky keys" or "Dead keys". diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h index f2cdb8a3b..0ecc293a8 100644 --- a/quantum/quantum_keycodes.h +++ b/quantum/quantum_keycodes.h @@ -459,27 +459,27 @@ enum quantum_keycodes { }; // Ability to use mods in layouts -#define LCTL(kc) (kc | QK_LCTL) -#define LSFT(kc) (kc | QK_LSFT) -#define LALT(kc) (kc | QK_LALT) -#define LGUI(kc) (kc | QK_LGUI) +#define LCTL(kc) (QK_LCTL | (kc)) +#define LSFT(kc) (QK_LSFT | (kc)) +#define LALT(kc) (QK_LALT | (kc)) +#define LGUI(kc) (QK_LGUI | (kc)) #define LCMD(kc) LGUI(kc) #define LWIN(kc) LGUI(kc) -#define RCTL(kc) (kc | QK_RCTL) -#define RSFT(kc) (kc | QK_RSFT) -#define RALT(kc) (kc | QK_RALT) -#define RGUI(kc) (kc | QK_RGUI) +#define RCTL(kc) (QK_RCTL | (kc)) +#define RSFT(kc) (QK_RSFT | (kc)) +#define RALT(kc) (QK_RALT | (kc)) +#define RGUI(kc) (QK_RGUI | (kc)) #define RCMD(kc) RGUI(kc) #define RWIN(kc) RGUI(kc) -#define HYPR(kc) (kc | QK_LCTL | QK_LSFT | QK_LALT | QK_LGUI) -#define MEH(kc) (kc | QK_LCTL | QK_LSFT | QK_LALT) -#define LCAG(kc) (kc | QK_LCTL | QK_LALT | QK_LGUI) -#define ALTG(kc) (kc | QK_RCTL | QK_RALT) -#define SGUI(kc) (kc | QK_LGUI | QK_LSFT) +#define HYPR(kc) (QK_LCTL | QK_LSFT | QK_LALT | QK_LGUI | (kc)) +#define MEH(kc) (QK_LCTL | QK_LSFT | QK_LALT | (kc)) +#define LCAG(kc) (QK_LCTL | QK_LALT | QK_LGUI | (kc)) +#define ALTG(kc) (QK_RCTL | QK_RALT | (kc)) +#define SGUI(kc) (QK_LGUI | QK_LSFT | (kc)) #define SCMD(kc) SGUI(kc) #define SWIN(kc) SGUI(kc) -#define LCA(kc) (kc | QK_LCTL | QK_LALT) +#define LCA(kc) (QK_LCTL | QK_LALT | (kc)) #define MOD_HYPR 0xf #define MOD_MEH 0x7 @@ -557,15 +557,15 @@ enum quantum_keycodes { #define KC_DELT KC_DELETE // Del key (four letter code) // Alias for function layers than expand past FN31 -#define FUNC(kc) (kc | QK_FUNCTION) +#define FUNC(kc) (QK_FUNCTION | (kc)) // Aliases #define S(kc) LSFT(kc) #define F(kc) FUNC(kc) -#define M(kc) (kc | QK_MACRO) +#define M(kc) (QK_MACRO | (kc)) -#define MACROTAP(kc) (kc | QK_MACRO | FUNC_TAP<<8) +#define MACROTAP(kc) (QK_MACRO | (FUNC_TAP << 8) | (kc)) #define MACRODOWN(...) (record->event.pressed ? MACRO(__VA_ARGS__) : MACRO_NONE) #define KC_GESC GRAVE_ESC @@ -590,7 +590,7 @@ enum quantum_keycodes { #define RGB_M_T RGB_MODE_RGBTEST // L-ayer, T-ap - 256 keycode max, 16 layer max -#define LT(layer, kc) (kc | QK_LAYER_TAP | ((layer & 0xF) << 8)) +#define LT(layer, kc) (QK_LAYER_TAP | ((layer & 0xF) << 8) | ((kc) & 0xFF)) #define AG_SWAP MAGIC_SWAP_ALT_GUI #define AG_NORM MAGIC_UNSWAP_ALT_GUI @@ -602,32 +602,32 @@ enum quantum_keycodes { // Unless you have a good reason not to do so, prefer ON_PRESS (1) as your default. // In fact, we changed it to assume ON_PRESS for sanity/simplicity. If needed, you can add your own // keycode modeled after the old version, kept below for this. -/* #define TO(layer, when) (layer | QK_TO | (when << 0x4)) */ -#define TO(layer) (layer | QK_TO | (ON_PRESS << 0x4)) +/* #define TO(layer, when) (QK_TO | (when << 0x4) | (layer & 0xFF)) */ +#define TO(layer) (QK_TO | (ON_PRESS << 0x4) | (layer & 0xFF)) // Momentary switch layer - 256 layer max -#define MO(layer) (layer | QK_MOMENTARY) +#define MO(layer) (QK_MOMENTARY | (layer & 0xFF)) // Set default layer - 256 layer max -#define DF(layer) (layer | QK_DEF_LAYER) +#define DF(layer) (QK_DEF_LAYER | (layer & 0xFF)) // Toggle to layer - 256 layer max -#define TG(layer) (layer | QK_TOGGLE_LAYER) +#define TG(layer) (QK_TOGGLE_LAYER | (layer & 0xFF)) // One-shot layer - 256 layer max -#define OSL(layer) (layer | QK_ONE_SHOT_LAYER) +#define OSL(layer) (QK_ONE_SHOT_LAYER | (layer & 0xFF)) // L-ayer M-od: Momentary switch layer with modifiers active - 16 layer max, left mods only -#define LM(layer, mod) (QK_LAYER_MOD | (((layer) & 0xF) << 4) | ((mod) & 0xF)) +#define LM(layer, mod) (QK_LAYER_MOD | ((layer & 0xF) << 4) | ((mod) & 0xF)) // One-shot mod -#define OSM(mod) ((mod) | QK_ONE_SHOT_MOD) +#define OSM(mod) (QK_ONE_SHOT_MOD | ((mod) & 0xFF)) // Layer tap-toggle -#define TT(layer) (layer | QK_LAYER_TAP_TOGGLE) +#define TT(layer) (QK_LAYER_TAP_TOGGLE | (layer & 0xFF)) // M-od, T-ap - 256 keycode max -#define MT(mod, kc) (kc | QK_MOD_TAP | (((mod) & 0x1F) << 8)) +#define MT(mod, kc) (QK_MOD_TAP | (((mod) & 0x1F) << 8) | ((kc) & 0xFF)) #define CTL_T(kc) MT(MOD_LCTL, kc) #define LCTL_T(kc) MT(MOD_LCTL, kc) @@ -652,15 +652,15 @@ enum quantum_keycodes { #define RCMD_T(kc) RGUI_T(kc) #define RWIN_T(kc) RGUI_T(kc) -#define C_S_T(kc) MT((MOD_LCTL | MOD_LSFT), kc) // Control + Shift e.g. for gnome-terminal -#define MEH_T(kc) MT((MOD_LCTL | MOD_LSFT | MOD_LALT), kc) // Meh is a less hyper version of the Hyper key -- doesn't include Win or Cmd, so just alt+shift+ctrl -#define LCAG_T(kc) MT((MOD_LCTL | MOD_LALT | MOD_LGUI), kc) // Left control alt and gui -#define RCAG_T(kc) MT((MOD_RCTL | MOD_RALT | MOD_RGUI), kc) // Right control alt and gui -#define ALL_T(kc) MT((MOD_LCTL | MOD_LSFT | MOD_LALT | MOD_LGUI), kc) // see http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/ -#define SGUI_T(kc) MT((MOD_LGUI | MOD_LSFT), kc) +#define C_S_T(kc) MT(MOD_LCTL | MOD_LSFT, kc) // Control + Shift e.g. for gnome-terminal +#define MEH_T(kc) MT(MOD_LCTL | MOD_LSFT | MOD_LALT, kc) // Meh is a less hyper version of the Hyper key -- doesn't include Win or Cmd, so just alt+shift+ctrl +#define LCAG_T(kc) MT(MOD_LCTL | MOD_LALT | MOD_LGUI, kc) // Left control alt and gui +#define RCAG_T(kc) MT(MOD_RCTL | MOD_RALT | MOD_RGUI, kc) // Right control alt and gui +#define ALL_T(kc) MT(MOD_LCTL | MOD_LSFT | MOD_LALT | MOD_LGUI, kc) // see http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/ +#define SGUI_T(kc) MT(MOD_LGUI | MOD_LSFT, kc) #define SCMD_T(kc) SGUI_T(kc) #define SWIN_T(kc) SGUI_T(kc) -#define LCA_T(kc) MT((MOD_LCTL | MOD_LALT), kc) // Left control and left alt +#define LCA_T(kc) MT(MOD_LCTL | MOD_LALT, kc) // Left control and left alt // Dedicated keycode versions for Hyper and Meh, if you want to use them as standalone keys rather than mod-tap #define KC_HYPR HYPR(KC_NO) @@ -670,22 +670,22 @@ enum quantum_keycodes { // For sending unicode codes. // You may not send codes over 7FFF -- this supports most of UTF8. // To have a key that sends out Œ, go UC(0x0152) - #define UNICODE(n) (n | QK_UNICODE) + #define UNICODE(n) (QK_UNICODE | (n)) #define UC(n) UNICODE(n) #endif #ifdef UNICODEMAP_ENABLE - #define X(n) (n | QK_UNICODE_MAP) + #define X(n) (QK_UNICODE_MAP | (n)) #endif #ifdef SWAP_HANDS_ENABLE - #define SH_T(key) (QK_SWAP_HANDS | key) - #define SH_TG (QK_SWAP_HANDS | OP_SH_TOGGLE) - #define SH_TT (QK_SWAP_HANDS | OP_SH_TAP_TOGGLE) - #define SH_MON (QK_SWAP_HANDS | OP_SH_ON_OFF) - #define SH_MOFF (QK_SWAP_HANDS | OP_SH_OFF_ON) - #define SH_ON (QK_SWAP_HANDS | OP_SH_ON) - #define SH_OFF (QK_SWAP_HANDS | OP_SH_OFF) + #define SH_T(kc) (QK_SWAP_HANDS | (kc)) + #define SH_TG (QK_SWAP_HANDS | OP_SH_TOGGLE) + #define SH_TT (QK_SWAP_HANDS | OP_SH_TAP_TOGGLE) + #define SH_MON (QK_SWAP_HANDS | OP_SH_ON_OFF) + #define SH_MOFF (QK_SWAP_HANDS | OP_SH_OFF_ON) + #define SH_ON (QK_SWAP_HANDS | OP_SH_ON) + #define SH_OFF (QK_SWAP_HANDS | OP_SH_OFF) #endif #endif // QUANTUM_KEYCODES_H From 3cafc4e7c6c3f38e86f3673336d28657e95287d7 Mon Sep 17 00:00:00 2001 From: patrickmt <40182064+patrickmt@users.noreply.github.com> Date: Wed, 29 Aug 2018 21:11:32 -0400 Subject: [PATCH 018/788] Keyboard: Update CTRL and ALT keyboard readme (#3796) * Massdrop keyboards readme update Massdrop keyboards readme update for flashing instructions * ctrl and alt keyboard readme update Updating make command in Massdrop CTRL and ALT keyboard readme files to reflect directory change --- keyboards/massdrop/alt67/readme.md | 7 ++++++- keyboards/massdrop/ctrl/readme.md | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/keyboards/massdrop/alt67/readme.md b/keyboards/massdrop/alt67/readme.md index 1632d8b57..cc33349c9 100644 --- a/keyboards/massdrop/alt67/readme.md +++ b/keyboards/massdrop/alt67/readme.md @@ -10,7 +10,12 @@ Hardware Availability: [Massdrop ALT Mechanical Keyboard](https://www.massdrop.c Make example for this keyboard (after setting up your build environment): - make alt67:default + make massdrop/alt67:default + +For information on flashing this keyboard, visit the following links: + +[Massdrop Loader Releases](https://github.com/Massdrop/mdloader/releases/tag/0.0.1) +[Massdrop Loader Repository and Instructions](https://github.com/Massdrop/mdloader) For information on flashing this keyboard, visit the following links: diff --git a/keyboards/massdrop/ctrl/readme.md b/keyboards/massdrop/ctrl/readme.md index 4a57095c5..5e504d96d 100644 --- a/keyboards/massdrop/ctrl/readme.md +++ b/keyboards/massdrop/ctrl/readme.md @@ -10,7 +10,12 @@ Hardware Availability: [Massdrop CTRL Mechanical Keyboard](https://www.massdrop. Make example for this keyboard (after setting up your build environment): - make ctrl:default + make massdrop/ctrl:default + +For information on flashing this keyboard, visit the following links: + +[Massdrop Loader Releases](https://github.com/Massdrop/mdloader/releases/tag/0.0.1) +[Massdrop Loader Repository and Instructions](https://github.com/Massdrop/mdloader) For information on flashing this keyboard, visit the following links: From 97d09ef8fabed45fb409b0b620f3ae3867d5ed50 Mon Sep 17 00:00:00 2001 From: Takeshi ISHII <2170248+mtei@users.noreply.github.com> Date: Thu, 30 Aug 2018 10:12:09 +0900 Subject: [PATCH 019/788] Keyboard: remove old comment from keyboards/helix/rules.mk (#3795) remove 2 lines from keyboards/helix/rules.mk | -# if firmware size over limit, try this option | -# CFLAGS += -flto | - see keyboards/helix/[rev2|pico]/keymaps/EACH_MAP/rules.mk: | Link_Time_Optimization = no # if firmware size over limit, try this option : : : | ifeq ($(strip $(Link_Time_Optimization)),yes) | EXTRAFLAGS += -flto -DUSE_Link_Time_Optimization | endif --- keyboards/helix/rules.mk | 3 --- 1 file changed, 3 deletions(-) diff --git a/keyboards/helix/rules.mk b/keyboards/helix/rules.mk index e42f92cf8..7c1d56527 100644 --- a/keyboards/helix/rules.mk +++ b/keyboards/helix/rules.mk @@ -2,9 +2,6 @@ SRC += i2c.c SRC += serial.c SRC += ssd1306.c -# if firmware size over limit, try this option -# CFLAGS += -flto - # MCU name #MCU = at90usb1287 MCU = atmega32u4 From 11f49d638895e4035698574df63e44118e23c393 Mon Sep 17 00:00:00 2001 From: Sascha Grunert Date: Thu, 30 Aug 2018 03:19:43 +0200 Subject: [PATCH 020/788] Keymap: Update keymap including LAYOUT_planck_grid (#3779) * Update keymap including LAYOUT_planck_grid * Change include --- keyboards/planck/keymaps/sascha/keymap.c | 29 ++++++++++++------------ 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/keyboards/planck/keymaps/sascha/keymap.c b/keyboards/planck/keymaps/sascha/keymap.c index afa73e212..93787599c 100644 --- a/keyboards/planck/keymaps/sascha/keymap.c +++ b/keyboards/planck/keymaps/sascha/keymap.c @@ -1,9 +1,8 @@ #include "backlight.h" -#pragma message "You may need to add LAYOUT_planck_grid to your keymap layers - see default for an example" -#include "planck.h" +#include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[0] = { +[0] = LAYOUT_planck_grid( /* ┌──────┬──────┬──────┬──────┬──────┬──────┬──────┬──────┬──────┬──────┬──────┬──────┐ * │ Esc │ Q │ W │ E │ R │ T │ Z │ U │ I │ O │ P │ Bksp │ * ├──────┼──────┼──────┼──────┼──────┼──────┼──────┼──────┼──────┼──────┼──────┼──────┤ @@ -11,15 +10,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * ├──────┼──────┼──────┼──────┼──────┼──────┼──────┼──────┼──────┼──────┼──────┼──────┤ * │ Shft │ Y │ X │ C │ V │ B │ N │ M │ , < │ . > │ / ? │ ' " │ * ├──────┼──────┼──────┼──────┼──────┼──────┼──────┼──────┼──────┼──────┼──────┼──────┤ - * │ Ctrl │ Alt │ GUI │ - _ │ = + │ Spce │ \ | │ ( │ ) │ [ { │ ] } │ Lr 1 │ + * │ Ctrl │ Alt │ ` ~ │ - _ │ = + │ Spce │ \ | │ ( │ ) │ [ { │ ] } │ Lr 1 │ * └──────┴──────┴──────┴──────┴──────┴──────┴──────┴──────┴──────┴──────┴──────┴──────┘ */ - { KC_ESC , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Z , KC_U , KC_I , KC_O , KC_P , KC_BSPC } , - { KC_TAB , KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_SCLN , KC_ENT } , - { KC_LSFT , KC_Y , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM , KC_DOT , KC_SLSH , KC_QUOT } , - { KC_LCTL , KC_LALT , KC_LGUI , KC_MINS , KC_EQL , KC_SPC , KC_BSLS , KC_LPRN , KC_RPRN , KC_LBRC , KC_RBRC , MO(1) } - }, -[1] = { + KC_ESC , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Z , KC_U , KC_I , KC_O , KC_P , KC_BSPC, + KC_TAB , KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_SCLN , KC_ENT, + KC_LSFT , KC_Y , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM , KC_DOT , KC_SLSH , KC_QUOT, + KC_LCTL , KC_LALT , KC_GRV , KC_MINS , KC_EQL , KC_SPC , KC_BSLS , KC_LPRN , KC_RPRN , KC_LBRC , KC_RBRC , MO(1) + ), +[1] = LAYOUT_planck_grid( /* ┌──────┬──────┬──────┬──────┬──────┬──────┬──────┬──────┬──────┬──────┬──────┬──────┐ * │ ~ │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ DEL │ * ├──────┼──────┼──────┼──────┼──────┼──────┼──────┼──────┼──────┼──────┼──────┼──────┤ @@ -30,11 +29,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * │ Powr │ Rset │ BLSt │ Home │ End │ PgUp │ PgDn │ Left │ Down │ Up │ Rght │ │ * └──────┴──────┴──────┴──────┴──────┴──────┴──────┴──────┴──────┴──────┴──────┴──────┘ */ - { KC_TILD , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_DEL } , - { KC_GRV , KC_EXLM , KC_AT , KC_HASH , KC_DLR , KC_PERC , KC_CIRC , KC_AMPR , KC_ASTR , UC(L'ü') , UC(L'ö') , UC(L'ä') } , - { S(KC_INS) , UC(L'♥') , UC(L'≈') , UC(L'✓') , UC(L'✗') , UC(L'←') , UC(L'→') , UC(L'€') , UC(L'ß') , UC(L'Ü') , UC(L'Ö') , UC(L'Ä') } , - { KC_PWR , RESET , BL_STEP , KC_HOME , KC_END , KC_PGUP , KC_PGDN , KC_LEFT , KC_DOWN , KC_UP , KC_RGHT , KC_TRNS } - } + KC_TILD , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_DEL, + KC_GRV , KC_EXLM , KC_AT , KC_HASH , KC_DLR , KC_PERC , KC_CIRC , KC_AMPR , KC_ASTR , UC(L'ü') , UC(L'ö') , UC(L'ä'), + S(KC_INS) , UC(L'♥') , UC(L'≈') , UC(L'✓') , UC(L'✗') , UC(L'←') , UC(L'→') , UC(L'€') , UC(L'ß') , UC(L'Ü') , UC(L'Ö') , UC(L'Ä'), + KC_PWR , RESET , BL_STEP , KC_HOME , KC_END , KC_PGUP , KC_PGDN , KC_LEFT , KC_DOWN , KC_UP , KC_RGHT , KC_TRNS + ) }; void matrix_init_user(void) { From 4cd4e1ded686f2799cfd87750200fcd6fba445ee Mon Sep 17 00:00:00 2001 From: arlenk <33534303+arlenk@users.noreply.github.com> Date: Wed, 29 Aug 2018 21:20:41 -0400 Subject: [PATCH 021/788] Docs: add process_terminal() and update links to other functions (#3778) * add process_terminal() and update links to other functions * convert links to permalinks and add a few missing process_* functions * update links in main text as well --- docs/understanding_qmk.md | 51 +++++++++++++++++++++------------------ 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/docs/understanding_qmk.md b/docs/understanding_qmk.md index 4544cb260..bf695d008 100644 --- a/docs/understanding_qmk.md +++ b/docs/understanding_qmk.md @@ -12,7 +12,7 @@ You can think of QMK as no different from any other computer program. It is star The reason for this is the different platforms that QMK supports. The most common platform is `lufa`, which runs on AVR processors such at the atmega32u4. We also support `chibios` and `vusb`. -We'll focus on AVR processors for the moment, which use the `lufa` platform. You can find the `main()` function in [tmk_core/protocol/lufa/lufa.c](https://github.com/qmk/qmk_firmware/blob/master/tmk_core/protocol/lufa/lufa.c#L1129). If you browse through that function you'll find that it initializes any hardware that has been configured (including USB to the host) and then it starts the core part of the program with a [`while(1)`](https://github.com/qmk/qmk_firmware/blob/master/tmk_core/protocol/lufa/lufa.c#L1182). This is [The Main Loop](#the_main_loop). +We'll focus on AVR processors for the moment, which use the `lufa` platform. You can find the `main()` function in [tmk_core/protocol/lufa/lufa.c](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/tmk_core/protocol/lufa/lufa.c#L1019). If you browse through that function you'll find that it initializes any hardware that has been configured (including USB to the host) and then it starts the core part of the program with a [`while(1)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/tmk_core/protocol/lufa/lufa.c#L1060). This is [The Main Loop](#the-main-loop). ## The Main Loop @@ -22,7 +22,7 @@ This section of code is called "The Main Loop" because it's responsible for loop keyboard_task(); ``` -This is where all the keyboard specific functionality is dispatched. The source code for `keyboard_task()` can be found in [tmk_core/common/keyboard.c](https://github.com/qmk/qmk_firmware/blob/master/tmk_core/common/keyboard.c#L154), and it is responsible for detecting changes in the matrix and turning status LED's on and off. +This is where all the keyboard specific functionality is dispatched. The source code for `keyboard_task()` can be found in [tmk_core/common/keyboard.c](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/tmk_core/common/keyboard.c#L206), and it is responsible for detecting changes in the matrix and turning status LED's on and off. Within `keyboard_task()` you'll find code to handle: @@ -77,7 +77,7 @@ At the keyboard level we define a C macro (typically named `KEYMAP()`) which map Notice how the second block of our `KEYMAP()` macro matches the Matrix Scanning array above? This macro is what will map the matrix scanning array to keycodes. However, if you look at a 17 key numpad you'll notice that it has 3 places where the matrix could have a switch but doesn't, due to larger keys. We have populated those spaces with `KC_NO` so that our keymap definition doesn't have to. -You can also use this macro to handle unusual matrix layouts, for example the [Clueboard rev 2](https://github.com/qmk/qmk_firmware/blob/master/keyboards/clueboard/66/rev2/rev2.h). Explaining that is outside the scope of this document. +You can also use this macro to handle unusual matrix layouts, for example the [Clueboard rev 2](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/keyboards/clueboard/66/rev2/rev2.h). Explaining that is outside the scope of this document. ##### Keycode Assignment @@ -129,27 +129,32 @@ Comparing against our keymap we can see that the pressed key is KC_NLCK. From he ##### Process Record +The `process_record()` function itself is deceptively simple, but hidden within is a gateway to overriding functionality at various levels of QMK. The chain of events is listed below, using cluecard whenever we need to look at the keyboard/keymap level functions. Depending on options set in rule.mk or elsewhere, only a subset of the functions below will be included in final firmware. -The `process_record()` function itself is deceptively simple, but hidden within is a gateway to overriding functionality at various levels of QMK. The chain of events is described below, using cluecard whenever we need to look at the keyboard/keymap level functions. - -* [`void process_record(keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/master/tmk_core/common/action.c#L128) - * [`bool process_record_quantum(keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/master/quantum/quantum.c#L140) - * [Map this record to a keycode](https://github.com/qmk/qmk_firmware/blob/master/quantum/quantum.c#L143) - * [`bool process_record_kb(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/master/keyboards/clueboard/card/card.c#L20) - * [`bool process_record_user(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/master/keyboards/clueboard/card/keymaps/default/keymap.c#L58) - * [`bool process_midi(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/master/quantum/process_keycode/process_midi.c#L102) - * [`bool process_audio(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/master/quantum/process_keycode/process_audio.c#L10) - * [`bool process_music(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/master/quantum/process_keycode/process_music.c#L69) - * [`bool process_tap_dance(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/master/quantum/process_keycode/process_tap_dance.c#L75) - * [`bool process_leader(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/master/quantum/process_keycode/process_leader.c#L32) - * [`bool process_chording(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/master/quantum/process_keycode/process_chording.c#L41) - * [`bool process_combo(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/master/quantum/process_keycode/process_combo.c#L115) - * [`bool process_unicode(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/master/quantum/process_keycode/process_unicode.c#L22) - * [`bool process_ucis(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/master/quantum/process_keycode/process_ucis.c#L91) - * [`bool process_printer(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/master/quantum/process_keycode/process_printer.c#L77) - * [`bool process_auto_shift(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/master/quantum/process_keycode/process_auto_shift.c#L47) - * [`bool process_unicode_map(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/master/quantum/process_keycode/process_unicodemap.c#L47) - * [Identify and process quantum specific keycodes](https://github.com/qmk/qmk_firmware/blob/master/quantum/quantum.c#L211) +* [`void process_record(keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/08c682c193f43e5d54df990680ae93fc2e06150a/tmk_core/common/action.c#L172) + * [`bool process_record_quantum(keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/08c682c193f43e5d54df990680ae93fc2e06150a/quantum/quantum.c#L193) + * [Map this record to a keycode](https://github.com/qmk/qmk_firmware/blob/08c682c193f43e5d54df990680ae93fc2e06150a/quantum/quantum.c#L213) + * [`void preprocess_tap_dance(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/08c682c193f43e5d54df990680ae93fc2e06150a/quantum/process_keycode/process_tap_dance.c#L115) + * [`bool process_key_lock(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/08c682c193f43e5d54df990680ae93fc2e06150a/quantum/process_keycode/process_key_lock.c#L62) + * [`bool process_clicky(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/08c682c193f43e5d54df990680ae93fc2e06150a/quantum/process_keycode/process_clicky.c#L44) + * [`bool process_record_kb(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/08c682c193f43e5d54df990680ae93fc2e06150a/keyboards/clueboard/card/card.c#L20) + * [`bool process_record_user(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/08c682c193f43e5d54df990680ae93fc2e06150a/keyboards/clueboard/card/keymaps/default/keymap.c#L58) + * [`bool process_rgb_matrix(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/fdd0f915271f79b104aa5d216566bcc3fd134e85/quantum/rgb_matrix.c#L139) + * [`bool process_midi(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_midi.c#L81) + * [`bool process_audio(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_audio.c#L19) + * [`bool process_steno(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_steno.c#L160) + * [`bool process_music(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_music.c#L114) + * [`bool process_tap_dance(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_tap_dance.c#L136) + * [`bool process_leader(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_leader.c#L38) + * [`bool process_chording(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_chording.c#L41) + * [`bool process_combo(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_combo.c#L115) + * [`bool process_unicode(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_unicode.c#L22) + * [`bool process_ucis(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_ucis.c#L91) + * [`bool process_printer(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_printer.c#L77) + * [`bool process_auto_shift(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_auto_shift.c#L94) + * [`bool process_unicode_map(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_unicodemap.c#L47) + * [`bool process_terminal(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_terminal.c#L264) + * [Identify and process quantum specific keycodes](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/quantum.c#L287) At any step during this chain of events a function (such as `process_record_kb()`) can `return false` to halt all further processing. From 1acaf2b2c22eb6bd77374b93101480207829db04 Mon Sep 17 00:00:00 2001 From: fauxpark Date: Thu, 30 Aug 2018 16:22:29 +1000 Subject: [PATCH 022/788] Tweak the wording in "Becoming a QMK Collaborator" --- docs/becoming_a_qmk_collaborator.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/becoming_a_qmk_collaborator.md b/docs/becoming_a_qmk_collaborator.md index 3cac63c97..16ae0d569 100644 --- a/docs/becoming_a_qmk_collaborator.md +++ b/docs/becoming_a_qmk_collaborator.md @@ -1,7 +1,9 @@ -A QMK collaborator is a keyboard maker/designer that is interested in helping QMK grow and fully support their keyboard(s), and encouraging their users/customers to submit features, ideas, and keymaps. We're always looking to add more keyboards and collaborators, but we ask that they fulfill these requirements: +# Becoming a QMK Collaborator -* **Have a PCB available for sale** - unfortunately there's just too much variation and complications with handwired keyboards. -* **Maintain the your keyboard's directory** - this may just require an initial setup to get your keyboard working, but it could also include accommodating changes made to QMK's core. -* **Approve and merge your keyboard's keymap pull requests** - we like to encourage users to contribute their keymaps for others to see and work from when creating their own. +A QMK collaborator is a keyboard maker or designer that is interested in helping QMK grow and fully support their keyboard(s), and encouraging their users and customers to submit features, ideas, and keymaps. We're always looking to add more keyboards and collaborators, but we ask that they fulfill these requirements: + +* **Have a PCB available for sale.** Unfortunately there's just too much variation and complications with handwired keyboards. +* **Maintain your keyboard in QMK.** This may just require an initial setup to get your keyboard working, but it could also include accommodating changes made to QMK's core that might break or render any custom code redundant. +* **Approve and merge keymap pull requests for your keyboard.** We like to encourage users to contribute their keymaps for others to see and work from when creating their own. If you feel you meet these requirements, shoot us an email at hello@qmk.fm with an introduction and some links to your keyboard! From 2b707f3470afd10f2db9db17d096dda836535444 Mon Sep 17 00:00:00 2001 From: Lars Herbach Date: Thu, 30 Aug 2018 18:23:33 +0200 Subject: [PATCH 023/788] Keymap: Added new tada68 keymap (#3788) * Initial Commit * Removed duplicate lines --- keyboards/tada68/keymaps/laas/config.h | 1 + keyboards/tada68/keymaps/laas/keymap.c | 53 +++++++++++++++++++++++++ keyboards/tada68/keymaps/laas/readme.md | 12 ++++++ keyboards/tada68/keymaps/laas/rules.mk | 5 +++ 4 files changed, 71 insertions(+) create mode 100755 keyboards/tada68/keymaps/laas/config.h create mode 100755 keyboards/tada68/keymaps/laas/keymap.c create mode 100755 keyboards/tada68/keymaps/laas/readme.md create mode 100755 keyboards/tada68/keymaps/laas/rules.mk diff --git a/keyboards/tada68/keymaps/laas/config.h b/keyboards/tada68/keymaps/laas/config.h new file mode 100755 index 000000000..6f70f09be --- /dev/null +++ b/keyboards/tada68/keymaps/laas/config.h @@ -0,0 +1 @@ +#pragma once diff --git a/keyboards/tada68/keymaps/laas/keymap.c b/keyboards/tada68/keymaps/laas/keymap.c new file mode 100755 index 000000000..25b990a72 --- /dev/null +++ b/keyboards/tada68/keymaps/laas/keymap.c @@ -0,0 +1,53 @@ +#include QMK_KEYBOARD_H + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _BL 0 +#define _FL 1 +#define _______ KC_TRNS + +LEADER_EXTERNS(); + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Keymap _BL: (Base Layer) Default Layer + * ,----------------------------------------------------------------. + * |Esc | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp |~ ` | + * |----------------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ |Del | + * |----------------------------------------------------------------| + * |CAPS | A| S| D| F| G| H| J| K| L| ;| '|Return |PgUp| + * |----------------------------------------------------------------| + * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | Up|PgDn| + * |----------------------------------------------------------------| + * |Ctrl|Win |Alt | Space |Alt| FN|Ctrl|Lef|Dow|Rig | + * `----------------------------------------------------------------' + */ + [_BL] = LAYOUT_ansi( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_GRV, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FL), KC_RCTRL, KC_LEFT, KC_DOWN, KC_RGHT), + + /* Keymap _FL: Function Layer + * ,----------------------------------------------------------------. + * | | F1|F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12|Del |Ins | + * |----------------------------------------------------------------| + * | | |Up | | | | | | | | | | | |VMU | + * |----------------------------------------------------------------| + * | |<- |Dn | ->| | | | | | | | | |Hme | + * |----------------------------------------------------------------| + * | | | |Bl-|BL |BL+| | | | | | | |VU-|End | + * |----------------------------------------------------------------| + * | | | | Play/Pause | | | |Rwd|VU+|Fwd | + * `----------------------------------------------------------------' + */ + [_FL] = LAYOUT_ansi( + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_INS, + _______, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, + _______, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, + _______, _______, _______, BL_DEC, BL_TOGG, BL_INC, _______, _______, _______, _______, _______, _______, KC_VOLU, KC_END, + _______, _______, _______, KC_MPLY, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT), +}; diff --git a/keyboards/tada68/keymaps/laas/readme.md b/keyboards/tada68/keymaps/laas/readme.md new file mode 100755 index 000000000..48497062c --- /dev/null +++ b/keyboards/tada68/keymaps/laas/readme.md @@ -0,0 +1,12 @@ +# laas' TADA68 layout + +* Disabled mouse controls +* Fn + PgUp -> Home +* Fn + PgDown -> End +* Media control for Windows: + * Fn + Left: Previous track + * Fn + Right: Next track + * Fn + Up: Volume up + * Fn + Down: Volume down + * Fn + Delete: Mute + * Fn + Space: Play/pause diff --git a/keyboards/tada68/keymaps/laas/rules.mk b/keyboards/tada68/keymaps/laas/rules.mk new file mode 100755 index 000000000..dbaa9045e --- /dev/null +++ b/keyboards/tada68/keymaps/laas/rules.mk @@ -0,0 +1,5 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +CONSOLE_ENABLE = no # Console for debug(+400) From 2fcfd5cff7089338385c40a630315939a7a9ebbc Mon Sep 17 00:00:00 2001 From: wanleg <32079073+wanleg@users.noreply.github.com> Date: Thu, 30 Aug 2018 09:34:14 -0700 Subject: [PATCH 024/788] Keymap: Wanleg updates (#3794) * various edits and minor additions * updates * updates * updates * lets_split LEDs off instructions * lets_split LEDs off instructions * turn off lets_split LEDs in userspace * one-hand setup for right side --- keyboards/4x4/rules.mk | 2 +- keyboards/5x5/info.json | 0 keyboards/5x5/rules.mk | 2 +- layouts/community/ortho_4x12/wanleg/config.h | 7 ++++ layouts/community/ortho_4x12/wanleg/keymap.c | 2 +- layouts/community/ortho_4x12/wanleg/readme.md | 40 ++++++++++++++++--- layouts/community/ortho_4x12/wanleg/rules.mk | 4 ++ layouts/community/ortho_5x10/layout.json | 5 +++ layouts/community/ortho_5x10/readme.md | 3 ++ layouts/community/ortho_5x10/wanleg/config.h | 9 +++++ layouts/community/ortho_5x10/wanleg/keymap.c | 38 ++++++++++++++++++ layouts/community/ortho_5x10/wanleg/rules.mk | 3 ++ users/wanleg/wanleg.c | 21 ++++++++++ users/wanleg/wanleg.h | 7 ++-- 14 files changed, 132 insertions(+), 11 deletions(-) delete mode 100644 keyboards/5x5/info.json create mode 100644 layouts/community/ortho_5x10/layout.json create mode 100644 layouts/community/ortho_5x10/readme.md create mode 100644 layouts/community/ortho_5x10/wanleg/config.h create mode 100644 layouts/community/ortho_5x10/wanleg/keymap.c create mode 100644 layouts/community/ortho_5x10/wanleg/rules.mk diff --git a/keyboards/4x4/rules.mk b/keyboards/4x4/rules.mk index 3ea4476db..b8b4bccc4 100644 --- a/keyboards/4x4/rules.mk +++ b/keyboards/4x4/rules.mk @@ -71,4 +71,4 @@ AUDIO_ENABLE = no # Audio output on port C6 FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) -LAYOUT = ortho_4x4 ortho_4x8 ortho_4x12 ortho_4x16 +LAYOUTS = ortho_4x4 ortho_4x8 ortho_4x12 ortho_4x16 diff --git a/keyboards/5x5/info.json b/keyboards/5x5/info.json deleted file mode 100644 index e69de29bb..000000000 diff --git a/keyboards/5x5/rules.mk b/keyboards/5x5/rules.mk index b04e4a527..24e0e020f 100644 --- a/keyboards/5x5/rules.mk +++ b/keyboards/5x5/rules.mk @@ -71,4 +71,4 @@ AUDIO_ENABLE = no # Audio output on port C6 FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) -LAYOUT = ortho_5x5 ortho_5x10 ortho_5x15 +LAYOUTS = ortho_5x5 ortho_5x10 ortho_5x15 diff --git a/layouts/community/ortho_4x12/wanleg/config.h b/layouts/community/ortho_4x12/wanleg/config.h index 2c6fcc75f..0d2cc591e 100644 --- a/layouts/community/ortho_4x12/wanleg/config.h +++ b/layouts/community/ortho_4x12/wanleg/config.h @@ -12,4 +12,11 @@ #define EE_HANDS #endif +// set top left key as bootloader mode escape key on 4x4 48key layout +#if defined(KEYBOARD_4x4) +#define QMK_LED B0 +#define QMK_ESC_OUTPUT C6 // usually COL +#define QMK_ESC_INPUT B2 // usually ROW +#endif + #endif diff --git a/layouts/community/ortho_4x12/wanleg/keymap.c b/layouts/community/ortho_4x12/wanleg/keymap.c index 8773001d0..f6030469c 100644 --- a/layouts/community/ortho_4x12/wanleg/keymap.c +++ b/layouts/community/ortho_4x12/wanleg/keymap.c @@ -13,7 +13,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______________Qwerty_Row__0_______________, _______________Qwerty_Row__1_______________, _______________Qwerty_Row__2_______________, - KC_LCTL, KC_LGUI, KC_LALT, GHERKIN, SUBTER, SH_T(KC_SPC), KC_SPC, SUPRA, KC_RGUI, KC_RALT, KC_DEL, KC_RCTL + KC_LCTL, KC_LGUI, KC_LALT, GHERKIN, SUBTER, SH_T(KC_SPC), SH_T(KC_SPC), SUPRA, KC_RGUI, KC_RALT, GHERKIN, KC_RCTL ), #else [_GK] = LAYOUT_ortho_4x12_wrapper( diff --git a/layouts/community/ortho_4x12/wanleg/readme.md b/layouts/community/ortho_4x12/wanleg/readme.md index 2f89d1de6..1cd41d116 100644 --- a/layouts/community/ortho_4x12/wanleg/readme.md +++ b/layouts/community/ortho_4x12/wanleg/readme.md @@ -16,9 +16,39 @@ Change `comPORT` to whatever port is used by the Arduino (e.g. `com11` in Window ## Using QMK DFU Once QMK DFU is burned to your ProMicro, you can then flash subsequent hex files with `make lets_split/rev2::dfu dfu=qmk` -The `dfu=qmk` conditional will set `BOOTLOADER = qmk-dfu` instead of `BOOTLOADER = caterina` +The `dfu=qmk` conditional will set `BOOTLOADER = qmk-dfu` instead of `BOOTLOADER = caterina` ---- -# JJ40 -## To Do -- [ ] Mousekeys not working with Userspace for some reason (jj40 only) \ No newline at end of file +# Let's Split LEDs +In `qmk_firmware/keyboards/lets_split/rev2/rev2.c`, replace contents with +``` +#include "lets_split.h" + + +#ifdef SSD1306OLED +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + led_set_user(usb_led); +} +#endif + +void matrix_init_kb(void) { + + // // green led on + // DDRD |= (1<<5); + // PORTD &= ~(1<<5); + + // // orange led on + // DDRB |= (1<<0); + // PORTB &= ~(1<<0); + + //turn off LEDs on ProMicro + DDRD &= ~(1<<5); + PORTD &= ~(1<<5); + + DDRB &= ~(1<<0); + PORTB &= ~(1<<0); + + matrix_init_user(); +}; +``` +to turn off LEDs diff --git a/layouts/community/ortho_4x12/wanleg/rules.mk b/layouts/community/ortho_4x12/wanleg/rules.mk index 79929689c..69f377a01 100644 --- a/layouts/community/ortho_4x12/wanleg/rules.mk +++ b/layouts/community/ortho_4x12/wanleg/rules.mk @@ -3,4 +3,8 @@ SWAP_HANDS_ENABLE = yes ifeq ($(strip $(KEYBOARD)), jj40) SWAP_HANDS_ENABLE = no +endif + +ifeq ($(strip $(KEYBOARD)), 4x4) + SWAP_HANDS_ENABLE = no endif \ No newline at end of file diff --git a/layouts/community/ortho_5x10/layout.json b/layouts/community/ortho_5x10/layout.json new file mode 100644 index 000000000..00d847952 --- /dev/null +++ b/layouts/community/ortho_5x10/layout.json @@ -0,0 +1,5 @@ +["","","","","","","","","",""], +["","","","","","","","","",""], +["","","","","","","","","",""], +["","","","","","","","","",""], +["","","","","","","","","",""] diff --git a/layouts/community/ortho_5x10/readme.md b/layouts/community/ortho_5x10/readme.md new file mode 100644 index 000000000..5c94f8eca --- /dev/null +++ b/layouts/community/ortho_5x10/readme.md @@ -0,0 +1,3 @@ +# ortho_5x10 + + LAYOUT_ortho_5x10 diff --git a/layouts/community/ortho_5x10/wanleg/config.h b/layouts/community/ortho_5x10/wanleg/config.h new file mode 100644 index 000000000..2d24f2771 --- /dev/null +++ b/layouts/community/ortho_5x10/wanleg/config.h @@ -0,0 +1,9 @@ +#pragma once + +//QMK DFU settings (ProMicro boards) +// set top left key as bootloader mode escape key on Gherkin +#if defined(KEYBOARD_5x5) +#define QMK_LED B0 +#define QMK_ESC_OUTPUT D7 // usually COL +#define QMK_ESC_INPUT B2 // usually ROW +#endif diff --git a/layouts/community/ortho_5x10/wanleg/keymap.c b/layouts/community/ortho_5x10/wanleg/keymap.c new file mode 100644 index 000000000..5d06e53ae --- /dev/null +++ b/layouts/community/ortho_5x10/wanleg/keymap.c @@ -0,0 +1,38 @@ +#include QMK_KEYBOARD_H +#include "wanleg.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[gGK] = LAYOUT_ortho_5x10_wrapper( + _______________Gherkin_NUM_0_______________, + _______________Gherkin_Row_0_______________, + _______________Gherkin_Row_1_______________, + _______________Gherkin_Row_2_______________, + _______, _______, _______, gNUMBER, gETCETERA, KC_SPC,gDIRECTION, KC_RGUI, _______, _______ +), + + +[gNUM] = LAYOUT_ortho_5x10_wrapper( + _______________Gherkin_NUM_0_______________, + _______________Gherkin_NUM_0_______________, + _______________Gherkin_NUM_1_______________, + _______________Gherkin_NUM_2_______________, + _______, _______, _______, _______, _______, KC_ENT, KC_RSFT, KC_RGUI, _______, _______ +), + +[gDIR] = LAYOUT_ortho_5x10_wrapper( + _______________Gherkin_NUM_0_______________, + _______________Gherkin_DIR_0_______________, + _______________Gherkin_DIR_1_______________, + _______________Gherkin_DIR_2_______________, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +[gETC] = LAYOUT_ortho_5x10_wrapper( + _______________Gherkin_NUM_0_______________, + _______________Gherkin_ETC_0_______________, + _______________Gherkin_ETC_1_______________, + _______________Gherkin_ETC_2_______________, + _______, _______, _______, _______, _______, LALT(LCTL(KC_DEL)), _______, _______, _______, _______ +), + +}; diff --git a/layouts/community/ortho_5x10/wanleg/rules.mk b/layouts/community/ortho_5x10/wanleg/rules.mk new file mode 100644 index 000000000..90841d2ab --- /dev/null +++ b/layouts/community/ortho_5x10/wanleg/rules.mk @@ -0,0 +1,3 @@ +SWAP_HANDS_ENABLE = no + +BOOTLOADER = qmk-dfu \ No newline at end of file diff --git a/users/wanleg/wanleg.c b/users/wanleg/wanleg.c index 0175ae201..931546c15 100644 --- a/users/wanleg/wanleg.c +++ b/users/wanleg/wanleg.c @@ -156,3 +156,24 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } return true; } + +/// Turn off LEDs on ProMicros of Let's Split /// +// LEDs only on by default on Let's Split +// Add reconfigurable functions here, for keymap customization +// This allows for a global, userspace functions, and continued +// customization of the keymap. Use _keymap instead of _user +// functions in the keymaps +__attribute__ ((weak)) +void matrix_init_keymap(void) {} + +// Call user matrix init, then call the keymap's init function +void matrix_init_user(void) { +#if defined(KEYBOARD_lets_split_rev2) + DDRD &= ~(1<<5); + PORTD &= ~(1<<5); + + DDRB &= ~(1<<0); + PORTB &= ~(1<<0); +#endif + matrix_init_keymap(); +} \ No newline at end of file diff --git a/users/wanleg/wanleg.h b/users/wanleg/wanleg.h index da14dcdf5..5cec82e60 100644 --- a/users/wanleg/wanleg.h +++ b/users/wanleg/wanleg.h @@ -119,6 +119,7 @@ enum { #define KEYMAP_wrapper(...) LAYOUT(__VA_ARGS__) #define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__) #define LAYOUT_ortho_3x10_wrapper(...) LAYOUT_ortho_3x10(__VA_ARGS__) +#define LAYOUT_ortho_5x10_wrapper(...) LAYOUT_ortho_5x10(__VA_ARGS__) #define LAYOUT_ortho_4x12_wrapper(...) LAYOUT_ortho_4x12(__VA_ARGS__) #define LAYOUT_ortho_5x15_wrapper(...) LAYOUT_ortho_5x15(__VA_ARGS__) @@ -204,7 +205,7 @@ enum { #define _______________GherkinLike_1_______________ KC_TAB, _______________Gherkin_Row_1_______________, KC_QUOT #define _______________GherkinLike_2_______________ TD(TD_SFT_CAPS), SFT_T(KC_Z), KC_X, KC_C, LT(NUM, KC_V),LT(ETC, KC_B),KC_N, LT(DIR, KC_M), GUI_T(KC_COMM), ALT_T(KC_DOT), CTL_T(KC_BSPC), SFT_T(KC_ENT) #define _______________GherkinLike_3_______________ KC_LCTL, KC_LGUI, KC_LALT, KC_LALT, NUMBER, ETCETERA, KC_SPC,DIRECTION, KC_RGUI, KC_RALT, KC_DEL, KC_RCTL -#define _______________GherkinLike_3_OneHand_______ KC_LCTL, KC_LGUI, KC_LALT, ONEHAND, NUMBER, ETCETERA, KC_SPC,DIRECTION, KC_RGUI, KC_RALT, KC_DEL, KC_RCTL +#define _______________GherkinLike_3_OneHand_______ KC_LCTL, KC_LGUI, KC_LALT, ONEHAND, NUMBER, ETCETERA, KC_SPC,DIRECTION, KC_RGUI, KC_RALT, ONEHAND, KC_RCTL /* Qwerty * .-------------------------------------------------------------------------------------. @@ -257,7 +258,7 @@ enum { /* Gherkin Numbers * .-----------------------------------------------------------------------------------------------------------. - * | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | DEL | + * | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | BACKSP | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| * | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| @@ -267,7 +268,7 @@ enum { * | | | | | | | ENTER | SHIFT | RGUI | | | | * '-----------------------------------------------------------------------------------------------------------' */ -#define _______________NUMBERS_Row_0_______________ _______, _______________Gherkin_NUM_0_______________, KC_DEL +#define _______________NUMBERS_Row_0_______________ _______, _______________Gherkin_NUM_0_______________, KC_BSPC #define _______________NUMBERS_Row_1_______________ _______, _______________Gherkin_NUM_1_______________, _______ #define _______________NUMBERS_Row_2_______________ _______, _______________Gherkin_NUM_2_______________, _______ #define _______________NUMBERS_Row_3_______________ _______, _______, _______, _______, _______, _______, KC_ENT, KC_RSFT, KC_RGUI, _______, _______, _______ From ce3ccd3f4a5e8ff8ac391887f3357dd8e985a452 Mon Sep 17 00:00:00 2001 From: fauxpark Date: Fri, 31 Aug 2018 02:37:05 +1000 Subject: [PATCH 025/788] Docs: Tabulate Modifier & Mod-Tap keycode listings in advanced keycodes docs (#3799) --- docs/feature_advanced_keycodes.md | 94 +++++++++++++++++++------------ docs/keycodes.md | 4 +- 2 files changed, 59 insertions(+), 39 deletions(-) diff --git a/docs/feature_advanced_keycodes.md b/docs/feature_advanced_keycodes.md index 5713234be..5f30359e0 100644 --- a/docs/feature_advanced_keycodes.md +++ b/docs/feature_advanced_keycodes.md @@ -57,53 +57,73 @@ Sometimes, you might want to switch between layers in a macro or as part of a ta # Modifier Keys -These functions allow you to combine a mod with a keycode. When pressed the keydown for the mod will be sent first, and then *kc* will be sent. When released the keyup for *kc* will be sent and then the mod will be sent. +These allow you to combine a modifier with a keycode. When pressed, the keydown event for the modifier, then `kc` will be sent. On release, the keyup event for `kc`, then the modifier will be sent. -* `LSFT(kc)` or `S(kc)` - applies left Shift to *kc* (keycode) -* `RSFT(kc)` - applies right Shift to *kc* -* `LCTL(kc)` - applies left Control to *kc* -* `RCTL(kc)` - applies right Control to *kc* -* `LALT(kc)` - applies left Alt to *kc* -* `RALT(kc)` - applies right Alt to *kc* -* `LGUI(kc)` - applies left GUI (command/win) to *kc* -* `RGUI(kc)` - applies right GUI (command/win) to *kc* -* `HYPR(kc)` - applies Hyper (all modifiers) to *kc* -* `MEH(kc)` - applies Meh (all modifiers except Win/Cmd) to *kc* -* `LCAG(kc)` - applies CtrlAltGui to *kc* +|Key |Aliases |Description | +|----------|----------------------|----------------------------------------------------| +|`LCTL(kc)`| |Hold Left Control and press `kc` | +|`LSFT(kc)`|`S(kc)` |Hold Left Shift and press `kc` | +|`LALT(kc)`| |Hold Left Alt and press `kc` | +|`LGUI(kc)`|`LCMD(kc)`, `LWIN(kc)`|Hold Left GUI and press `kc` | +|`RCTL(kc)`| |Hold Right Control and press `kc` | +|`RSFT(kc)`| |Hold Right Shift and press `kc` | +|`RALT(kc)`| |Hold Right Alt and press `kc` | +|`RGUI(kc)`|`RCMD(kc)`, `LWIN(kc)`|Hold Right GUI and press `kc` | +|`HYPR(kc)`| |Hold Left Control, Shift, Alt and GUI and press `kc`| +|`MEH(kc)` | |Hold Left Control, Shift and Alt and press `kc` | +|`LCAG(kc)`| |Hold Left Control, Alt and GUI and press `kc` | +|`ALTG(kc)`| |Hold Right Control and Alt and press `kc` | +|`SGUI(kc)`|`SCMD(kc)`, `SWIN(kc)`|Hold Left Shift and GUI and press `kc` | +|`LCA(kc)` | |Hold Left Control and Alt and press `kc` | -You can also chain these, like this: +You can also chain them, for example `LCTL(LALT(KC_DEL))` makes a key that sends Control+Alt+Delete with a single keypress. - LALT(LCTL(KC_DEL)) -- this makes a key that sends Alt, Control, and Delete in a single keypress. +# Mod-Tap -# Mod Tap +The Mod-Tap key `MT(mod, kc)` acts like a modifier when held, and a regular keycode when tapped. In other words, you can have a key that sends Escape when you tap it, but functions as a Control or Shift key when you hold it down. -`MT(mod, kc)` - is *mod* (modifier key - MOD_LCTL, MOD_LSFT) when held, and *kc* when tapped. In other words, you can have a key that sends Esc (or the letter O or whatever) when you tap it, but works as a Control key or a Shift key when you hold it down. +The modifiers this keycode and `OSM()` accept are prefixed with `MOD_`, not `KC_`: -These are the values you can use for the `mod` in `MT()` and `OSM()`: +|Modifier |Description | +|----------|----------------------------------------| +|`MOD_LCTL`|Left Control | +|`MOD_LSFT`|Left Shift | +|`MOD_LALT`|Left Alt | +|`MOD_LGUI`|Left GUI (Windows/Command/Meta key) | +|`MOD_RCTL`|Right Control | +|`MOD_RSFT`|Right Shift | +|`MOD_RALT`|Right Alt | +|`MOD_RGUI`|Right GUI (Windows/Command/Meta key) | +|`MOD_HYPR`|Hyper (Left Control, Shift, Alt and GUI)| +|`MOD_MEH` |Meh (Left Control, Shift, and Alt) | - * MOD_LCTL - * MOD_LSFT - * MOD_LALT - * MOD_LGUI - * MOD_RCTL - * MOD_RSFT - * MOD_RALT - * MOD_RGUI - * MOD_HYPR - * MOD_MEH +You can combine these by ORing them together like so: -These can also be combined like `MOD_LCTL | MOD_LSFT` e.g. `MT(MOD_LCTL | MOD_LSFT, KC_ESC)` which would activate Control and Shift when held, and send Escape when tapped. +```c +MT(MOD_LCTL | MOD_LSFT, KC_ESC) +``` -We've added shortcuts to make common modifier/tap (mod-tap) mappings more compact: +This key would activate Left Control and Left Shift when held, and send Escape when tapped. - * `CTL_T(kc)` - is LCTL when held and *kc* when tapped - * `SFT_T(kc)` - is LSFT when held and *kc* when tapped - * `ALT_T(kc)` - is LALT when held and *kc* when tapped - * `ALGR_T(kc)` - is AltGr when held and *kc* when tapped - * `GUI_T(kc)` - is LGUI when held and *kc* when tapped - * `ALL_T(kc)` - is Hyper (all mods) when held and *kc* when tapped. To read more about what you can do with a Hyper key, see [this blog post by Brett Terpstra](http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/) - * `LCAG_T(kc)` - is CtrlAltGui when held and *kc* when tapped - * `MEH_T(kc)` - is like Hyper, but not as cool -- does not include the Cmd/Win key, so just sends Alt+Ctrl+Shift. +For convenience, QMK includes some Mod-Tap shortcuts to make common combinations more compact in your keymap: + +|Key |Aliases |Description | +|------------|---------------------------------------|-------------------------------------------------------| +|`LCTL_T(kc)`|`CTL_T(kc)` |Left Control when held, `kc` when tapped | +|`RCTL_T(kc)`| |Right Control when held, `kc` when tapped | +|`LSFT_T(kc)`|`SFT_T(kc)` |Left Shift when held, `kc` when tapped | +|`RSFT_T(kc)`| |Right Shift when held, `kc` when tapped | +|`LALT_T(kc)`|`ALT_T(kc)` |Left Alt when held, `kc` when tapped | +|`RALT_T(kc)`|`ALGR_T(kc)` |Right Alt when held, `kc` when tapped | +|`LGUI_T(kc)`|`LCMD_T(kc)`, `RWIN_T(kc)`, `GUI_T(kc)`|Left GUI when held, `kc` when tapped | +|`RGUI_T(kc)`|`RCMD_T(kc)`, `RWIN_T(kc)` |Right GUI when held, `kc` when tapped | +|`C_S_T(kc)` | |Left Control and Shift when held, `kc` when tapped | +|`MEH_T(kc)` | |Left Control, Shift and Alt when held, `kc` when tapped| +|`LCAG_T(kc)`| |Left Control, Alt and GUI when held, `kc` when tapped | +|`RCAG_T(kc)`| |Right Control, Alt and GUI when held, `kc` when tapped | +|`ALL_T(kc)` | |Left Control, Shift, Alt and GUI when held, `kc` when tapped - more info [here](http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/)| +|`SGUI_T(kc)`|`SCMD_T(kc)`, `SWIN_T(kc)` |Left Shift and GUI when held, `kc` when tapped | +|`LCA_T(kc)` | |Left Control and Alt when held, `kc` when tapped | # One Shot Keys diff --git a/docs/keycodes.md b/docs/keycodes.md index fd3776bb7..c344a7528 100644 --- a/docs/keycodes.md +++ b/docs/keycodes.md @@ -318,7 +318,7 @@ This is a reference only. Each group of keys links to the page documenting their ## [Modifiers](feature_advanced_keycodes.md#modifier-keys) |Key |Aliases |Description | -|----------|---------- |----------------------------------------------------| +|----------|----------------------|----------------------------------------------------| |`KC_HYPR` | |Hold Left Control, Shift, Alt and GUI | |`KC_MEH` | |Hold Left Control, Shift and Alt | |`LCTL(kc)`| |Hold Left Control and press `kc` | @@ -353,7 +353,7 @@ This is a reference only. Each group of keys links to the page documenting their |`LCAG_T(kc)`| |Left Control, Alt and GUI when held, `kc` when tapped | |`RCAG_T(kc)`| |Right Control, Alt and GUI when held, `kc` when tapped | |`ALL_T(kc)` | |Left Control, Shift, Alt and GUI when held, `kc` when tapped - more info [here](http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/)| -|`SCMD_T(kc)`|`SWIN_T(kc)` |Left Shift and GUI when held, `kc` when tapped | +|`SGUI_T(kc)`|`SCMD_T(kc)`, `SWIN_T(kc)` |Left Shift and GUI when held, `kc` when tapped | |`LCA_T(kc)` | |Left Control and Alt when held, `kc` when tapped | ## [RGB Lighting](feature_rgblight.md) From b61653739b791cc18dd6516337ed8b2daa8663fc Mon Sep 17 00:00:00 2001 From: patrickmt <40182064+patrickmt@users.noreply.github.com> Date: Thu, 30 Aug 2018 16:49:17 -0400 Subject: [PATCH 026/788] Keyboard: CTRL and ALT updates (#3810) Update to CTRL and ALT keyboard files --- keyboards/massdrop/alt67/info.json | 80 ++++++++++++++ .../massdrop/alt67/keymaps/default/keymap.c | 2 +- keyboards/massdrop/alt67/readme.md | 5 - keyboards/massdrop/ctrl/info.json | 100 ++++++++++++++++++ keyboards/massdrop/ctrl/readme.md | 5 - 5 files changed, 181 insertions(+), 11 deletions(-) create mode 100644 keyboards/massdrop/alt67/info.json create mode 100644 keyboards/massdrop/ctrl/info.json diff --git a/keyboards/massdrop/alt67/info.json b/keyboards/massdrop/alt67/info.json new file mode 100644 index 000000000..eca47ac4e --- /dev/null +++ b/keyboards/massdrop/alt67/info.json @@ -0,0 +1,80 @@ +{ + "keyboard_name": "ALT", + "url": "https://www.massdrop.com/buy/massdrop-alt-mechanical-keyboard", + "maintainer": "Massdrop", + "width": 16, + "height": 5, + "layouts": { + "LAYOUT_all": { + "layout": [ + {"label":"ESCAPE", "x":0, "y":0}, + {"label":"1", "x":1, "y":0}, + {"label":"2", "x":2, "y":0}, + {"label":"3", "x":3, "y":0}, + {"label":"4", "x":4, "y":0}, + {"label":"5", "x":5, "y":0}, + {"label":"6", "x":6, "y":0}, + {"label":"7", "x":7, "y":0}, + {"label":"8", "x":8, "y":0}, + {"label":"9", "x":9, "y":0}, + {"label":"0", "x":10, "y":0}, + {"label":"MINUS", "x":11, "y":0}, + {"label":"EQUALS", "x":12, "y":0}, + {"label":"BACKSPACE", "x":13, "y":0, "w":2}, + {"label":"DELETE", "x":15, "y":0}, + {"label":"TAB", "x":0, "y":1, "w":1.5}, + {"label":"Q", "x":1.5, "y":1}, + {"label":"W", "x":2.5, "y":1}, + {"label":"E", "x":3.5, "y":1}, + {"label":"R", "x":4.5, "y":1}, + {"label":"T", "x":5.5, "y":1}, + {"label":"Y", "x":6.5, "y":1}, + {"label":"U", "x":7.5, "y":1}, + {"label":"I", "x":8.5, "y":1}, + {"label":"O", "x":9.5, "y":1}, + {"label":"P", "x":10.5, "y":1}, + {"label":"LEFT BRACKET", "x":11.5, "y":1}, + {"label":"RIGHT BRACKET", "x":12.5, "y":1}, + {"label":"BACK SLASH", "x":13.5, "y":1, "w":1.5}, + {"label":"HOME", "x":15, "y":1}, + {"label":"CAPS LOCK", "x":0, "y":2, "w":1.75}, + {"label":"A", "x":1.75, "y":2}, + {"label":"S", "x":2.75, "y":2}, + {"label":"D", "x":3.75, "y":2}, + {"label":"F", "x":4.75, "y":2}, + {"label":"G", "x":5.75, "y":2}, + {"label":"H", "x":6.75, "y":2}, + {"label":"J", "x":7.75, "y":2}, + {"label":"K", "x":8.75, "y":2}, + {"label":"L", "x":9.75, "y":2}, + {"label":"SEMICOLON", "x":10.75, "y":2}, + {"label":"SINGLE TICK", "x":11.75, "y":2}, + {"label":"ENTER", "x":12.75, "y":2, "w":2.25}, + {"label":"PAGE UP", "x":15, "y":2}, + {"label":"LEFT SHIFT", "x":0, "y":3, "w":2.25}, + {"label":"Z", "x":2.25, "y":3}, + {"label":"X", "x":3.25, "y":3}, + {"label":"C", "x":4.25, "y":3}, + {"label":"V", "x":5.25, "y":3}, + {"label":"B", "x":6.25, "y":3}, + {"label":"N", "x":7.25, "y":3}, + {"label":"M", "x":8.25, "y":3}, + {"label":"COMMA", "x":9.25, "y":3}, + {"label":"PERIOD", "x":10.25, "y":3}, + {"label":"FORWARD SLASH", "x":11.25, "y":3}, + {"label":"RIGHT SHIFT", "x":12.25, "y":3, "w":1.75}, + {"label":"UP ARROW", "x":14, "y":3}, + {"label":"PAGE DOWN", "x":15, "y":3}, + {"label":"LEFT CTRL", "x":0, "y":4, "w":1.25}, + {"label":"LEFT WIN", "x":1.25, "y":4, "w":1.25}, + {"label":"LEFT ALT", "x":2.5, "y":4, "w":1.25}, + {"label":"SPACEBAR", "x":3.75, "y":4, "w":6.25}, + {"label":"RIGHT ALT", "x":10, "y":4, "w":1.25}, + {"label":"FN", "x":11.25, "y":4, "w":1.25}, + {"label":"LEFT ARROW", "x":13, "y":4}, + {"label":"DOWN ARROW", "x":14, "y":4}, + {"label":"RIGHT ARROW", "x":15, "y":4} + ] + } + } +} diff --git a/keyboards/massdrop/alt67/keymaps/default/keymap.c b/keyboards/massdrop/alt67/keymaps/default/keymap.c index 8b77da55a..b8d0b6c03 100644 --- a/keyboards/massdrop/alt67/keymaps/default/keymap.c +++ b/keyboards/massdrop/alt67/keymaps/default/keymap.c @@ -34,7 +34,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT \ ), [1] = LAYOUT( - KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_MUTE, \ + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_MUTE, \ L_T_BR, L_PSD, L_BRI, L_PSI, KC_TRNS, KC_TRNS, KC_TRNS, U_T_AUTO,U_T_AGCR,KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, \ L_T_PTD, L_PTP, L_BRD, L_PTN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, \ KC_TRNS, L_T_MD, L_T_ONF, KC_TRNS, KC_TRNS, KC_TRNS, TG_NKRO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_VOLD, \ diff --git a/keyboards/massdrop/alt67/readme.md b/keyboards/massdrop/alt67/readme.md index cc33349c9..551c10c20 100644 --- a/keyboards/massdrop/alt67/readme.md +++ b/keyboards/massdrop/alt67/readme.md @@ -17,9 +17,4 @@ For information on flashing this keyboard, visit the following links: [Massdrop Loader Releases](https://github.com/Massdrop/mdloader/releases/tag/0.0.1) [Massdrop Loader Repository and Instructions](https://github.com/Massdrop/mdloader) -For information on flashing this keyboard, visit the following links: - -[Massdrop Loader Releases](https://github.com/Massdrop/mdloader/releases/tag/0.0.1) -[Massdrop Loader Repository and Instructions](https://github.com/Massdrop/mdloader) - 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). \ No newline at end of file diff --git a/keyboards/massdrop/ctrl/info.json b/keyboards/massdrop/ctrl/info.json new file mode 100644 index 000000000..5eac2937b --- /dev/null +++ b/keyboards/massdrop/ctrl/info.json @@ -0,0 +1,100 @@ +{ + "keyboard_name": "CTRL", + "url": "https://www.massdrop.com/buy/massdrop-ctrl-mechanical-keyboard", + "maintainer": "Massdrop", + "width": 18.5, + "height": 6.5, + "layouts": { + "LAYOUT_all": { + "layout": [ + {"label":"ESCAPE", "x":0, "y":0}, + {"label":"F1", "x":2, "y":0}, + {"label":"F2", "x":3, "y":0}, + {"label":"F3", "x":4, "y":0}, + {"label":"F4", "x":5, "y":0}, + {"label":"F5", "x":6.5, "y":0}, + {"label":"F6", "x":7.5, "y":0}, + {"label":"F7", "x":8.5, "y":0}, + {"label":"F8", "x":9.5, "y":0}, + {"label":"F9", "x":11, "y":0}, + {"label":"F10", "x":12, "y":0}, + {"label":"F11", "x":13, "y":0}, + {"label":"F12", "x":14, "y":0}, + {"label":"PRINT SCREEN", "x":15.5, "y":0}, + {"label":"SCROLL LOCK", "x":16.5, "y":0}, + {"label":"PAUSE BREAK", "x":17.5, "y":0}, + {"label":"BACKTICK", "x":0, "y":1.5}, + {"label":"1", "x":1, "y":1.5}, + {"label":"2", "x":2, "y":1.5}, + {"label":"3", "x":3, "y":1.5}, + {"label":"4", "x":4, "y":1.5}, + {"label":"5", "x":5, "y":1.5}, + {"label":"6", "x":6, "y":1.5}, + {"label":"7", "x":7, "y":1.5}, + {"label":"8", "x":8, "y":1.5}, + {"label":"9", "x":9, "y":1.5}, + {"label":"0", "x":10, "y":1.5}, + {"label":"MINUS", "x":11, "y":1.5}, + {"label":"EQUALS", "x":12, "y":1.5}, + {"label":"BACKSPACE", "x":13, "y":1.5, "w":2}, + {"label":"INSERT", "x":15.5, "y":1.5}, + {"label":"HOME", "x":16.5, "y":1.5}, + {"label":"PAGE UP", "x":17.5, "y":1.5}, + {"label":"TAB", "x":0, "y":2.5, "w":1.5}, + {"label":"Q", "x":1.5, "y":2.5}, + {"label":"W", "x":2.5, "y":2.5}, + {"label":"E", "x":3.5, "y":2.5}, + {"label":"R", "x":4.5, "y":2.5}, + {"label":"T", "x":5.5, "y":2.5}, + {"label":"Y", "x":6.5, "y":2.5}, + {"label":"U", "x":7.5, "y":2.5}, + {"label":"I", "x":8.5, "y":2.5}, + {"label":"O", "x":9.5, "y":2.5}, + {"label":"P", "x":10.5, "y":2.5}, + {"label":"LEFT BRACKET", "x":11.5, "y":2.5}, + {"label":"RIGHT BRACKET", "x":12.5, "y":2.5}, + {"label":"BACK SLASH", "x":13.5, "y":2.5, "w":1.5}, + {"label":"DELETE", "x":15.5, "y":2.5}, + {"label":"END", "x":16.5, "y":2.5}, + {"label":"PAGE DOWN", "x":17.5, "y":2.5}, + {"label":"CAPS LOCK", "x":0, "y":3.5, "w":1.75}, + {"label":"A", "x":1.75, "y":3.5}, + {"label":"S", "x":2.75, "y":3.5}, + {"label":"D", "x":3.75, "y":3.5}, + {"label":"F", "x":4.75, "y":3.5}, + {"label":"G", "x":5.75, "y":3.5}, + {"label":"H", "x":6.75, "y":3.5}, + {"label":"J", "x":7.75, "y":3.5}, + {"label":"K", "x":8.75, "y":3.5}, + {"label":"L", "x":9.75, "y":3.5}, + {"label":"SEMICOLON", "x":10.75, "y":3.5}, + {"label":"SINGLE TICK", "x":11.75, "y":3.5}, + {"label":"ENTER", "x":12.75, "y":3.5, "w":2.25}, + {"label":"LEFT SHIFT", "x":0, "y":4.5, "w":2.25}, + {"label":"Z", "x":2.25, "y":4.5}, + {"label":"X", "x":3.25, "y":4.5}, + {"label":"C", "x":4.25, "y":4.5}, + {"label":"V", "x":5.25, "y":4.5}, + {"label":"B", "x":6.25, "y":4.5}, + {"label":"N", "x":7.25, "y":4.5}, + {"label":"M", "x":8.25, "y":4.5}, + {"label":"COMMA", "x":9.25, "y":4.5}, + {"label":"PERIOD", "x":10.25, "y":4.5}, + {"label":"FORWARD SLASH", "x":11.25, "y":4.5}, + {"label":"RIGHT SHIFT", "x":12.25, "y":4.5, "w":2.75}, + {"label":"UP ARROW", "x":16.5, "y":4.5}, + {"label":"LEFT CTRL", "x":0.005, "y":5.5, "w":1.24}, + {"label":"LEFT WIN", "x":1.255, "y":5.5, "w":1.24}, + {"label":"LEFT ALT", "x":2.505, "y":5.5, "w":1.24}, + {"label":"SPACEBAR", "x":3.75, "y":5.5, "w":6.25}, + {"label":"RIGHT ALT", "x":10, "y":5.5, "w":1.25}, + {"label":"FN", "x":11.25, "y":5.5, "w":1.25}, + {"label":"MENU", "x":12.5, "y":5.5, "w":1.25}, + {"label":"RIGHT CTRL", "x":13.75, "y":5.5, "w":1.25}, + {"label":"LEFT ARROW", "x":15.5, "y":5.5}, + {"label":"DOWN ARROW", "x":16.5, "y":5.5}, + {"label":"RIGHT ARROW", "x":17.5, "y":5.5} + ] + } + } +} diff --git a/keyboards/massdrop/ctrl/readme.md b/keyboards/massdrop/ctrl/readme.md index 5e504d96d..656ef9ac9 100644 --- a/keyboards/massdrop/ctrl/readme.md +++ b/keyboards/massdrop/ctrl/readme.md @@ -17,9 +17,4 @@ For information on flashing this keyboard, visit the following links: [Massdrop Loader Releases](https://github.com/Massdrop/mdloader/releases/tag/0.0.1) [Massdrop Loader Repository and Instructions](https://github.com/Massdrop/mdloader) -For information on flashing this keyboard, visit the following links: - -[Massdrop Loader Releases](https://github.com/Massdrop/mdloader/releases/tag/0.0.1) -[Massdrop Loader Repository and Instructions](https://github.com/Massdrop/mdloader) - 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). \ No newline at end of file From be94e5e59138e5357632b84734476a574e9f0d1a Mon Sep 17 00:00:00 2001 From: Salt-Peanuts Date: Thu, 30 Aug 2018 18:38:31 -0400 Subject: [PATCH 027/788] Keymap: Updated keymap with the "pretty" layout (#3812) --- .../keymaps/insertsnideremarks/keymap.c | 697 +++++++----------- .../keymaps/insertsnideremarks/readme.md | 18 +- .../keymaps/insertsnideremarks/rules.mk | 2 +- 3 files changed, 295 insertions(+), 422 deletions(-) diff --git a/keyboards/kinesis/keymaps/insertsnideremarks/keymap.c b/keyboards/kinesis/keymaps/insertsnideremarks/keymap.c index bf75327f1..78defea23 100644 --- a/keyboards/kinesis/keymaps/insertsnideremarks/keymap.c +++ b/keyboards/kinesis/keymaps/insertsnideremarks/keymap.c @@ -78,454 +78,327 @@ qk_tap_dance_action_t tap_dance_actions[] = { }; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -/* Fundtion Row Keys -/ (Identical across layers, unless otherwise noted; Numpad is a toggle; Adjust is mometary) -* ,-----------------------------------------------------------------------------------------------------------. -* | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | PScr| SLck| Paus|Numpd|Adjst| -* `-----------------------------------------------------------------------------------------------------------' -*/ - /* Colemak -* (Defauit layer; keys separated by /: tap for first, hold for second; uses Space Cadet Shifts) -* ,-------------------------------------------. ,-------------------------------------------. -* | = | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | - | -* |--------+------+------+------+------+------| |------+------+------+------+------+--------| -* | Tab | Q | W | F | P | G | | J | L | U | Y | ; | \ | -* |--------+------+------+------+------+------| |------+------+------+------+------+--------| -* |Esc/Ctrl| A | R | S | T | D | | H | N | E | I | O | ' | -* |--------+------+------+------+------+------| |------+------+------+------+------+--------| -* |SC Shift| Z | X | C | V | B | | K | M | , | . | / |SC Shift| -* `--------+------+------+------+------+------' `------+------+------+------+------+--------' -* | Ins | ` | [ | ] | | Left | Down | Up | Right| -* `---------------------------' `---------------------------' -* ,---------------. ,---------------. -* |Esc/Ctl| Hyper | | RAlt | RCtl | -* ,-------|-------|-------| |-------+-------+-------. -* | Space | Enter |App/Alt| | RGUI | Delete| Bspc | -* | / | / |-------| |-------| / | / | -* | Fn | Number| Bspc | | Enter |Number2| Fn2 | -* `-----------------------' `-----------------------' + (Defauit layer; keys separated by /: tap for first, hold for second; uses Space Cadet Shifts) + ,-----------------------------------------------------------------------------------------------------------. + | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | PScr| SLck| Paus|Numpd|Adjst| + `-----------------------------------------------------------------------------------------------------------' + ,-------------------------------------------. ,-------------------------------------------. + | = | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | - | + |--------+------+------+------+------+------| |------+------+------+------+------+--------| + | Tab | Q | W | F | P | G | | J | L | U | Y | ; | \ | + |--------+------+------+------+------+------| |------+------+------+------+------+--------| + |Esc/Ctrl| A | R | S | T | D | | H | N | E | I | O | ' | + |--------+------+------+------+------+------| |------+------+------+------+------+--------| + |SC Shift| Z | X | C | V | B | | K | M | , | . | / |SC Shift| + `--------+------+------+------+------+------' `------+------+------+------+------+--------' + | Ins | ` | [ | ] | | Left | Down | Up | Right| + `---------------------------' `---------------------------' + ,---------------. ,---------------. + |Esc/Ctl| Hyper | | RAlt | RCtl | + ,-------|-------|-------| |-------+-------+-------. + | Space | Enter |App/Alt| | RGUI | Delete| Bspc | + | / | / |-------| |-------| / | / | + | Fn | Number| Bspc | | Enter |Number2| Fn2 | + `-----------------------' `-----------------------' */ -[_COLEMAK] = LAYOUT( - // Left Hand - KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, - KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, - KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, - CTLESC, KC_A, KC_R, KC_S, KC_T, KC_D, - KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, - KC_INS, KC_GRV, KC_LBRC, KC_RBRC, - //Left Thumb - CTLESC, ALL_T(KC_NO), - ALTAPP, - SPCFN, ENTNS, KC_BSPC, - //Right Hand - KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, NUMPAD, ADJUST, - KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, - KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSLS, - KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, - KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, - KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, - //Right Thumb - KC_RALT, KC_RCTL, - KC_RGUI, - KC_ENT, DELNS, BSPCFN +[_COLEMAK] = LAYOUT_pretty( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, NUMPAD, ADJUST, + KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSLS, + CTLESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, + KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, + KC_INS, KC_GRV, KC_LBRC, KC_RBRC, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, + CTLESC, ALL_T(KC_NO), KC_RALT, KC_RCTL, + ALTAPP, KC_RGUI, + SPCFN, ENTNS, KC_BSPC, KC_ENT, DELNS, BSPCFN ), /* QWERTY -* (Keys separated by /: tap for first, hold for second; uses Space Cadet Shifts) -* ,-------------------------------------------. ,-------------------------------------------. -* | = | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | - | -* |--------+------+------+------+------+------| |------+------+------+------+------+--------| -* | Tab | Q | W | E | R | T | | Y | U | I | O | P | \ | -* |--------+------+------+------+------+------| |------+------+------+------+------+--------| -* |Esc/Ctrl| A | S | D | F | G | | H | J | K | L | ; | ' | -* |--------+------+------+------+------+------| |------+------+------+------+------+--------| -* |SC Shift| Z | X | C | V | B | | N | M | , | . | / |SC Shift| -* `--------+------+------+------+------+------' `------+------+------+------+------+--------' -* | Ins | ` | [ | ] | | Left | Down | Up | Right| -* `---------------------------' `---------------------------' -* ,---------------. ,---------------. -* |Esc/Ctl| Hyper | | RAlt | RCtl | -* ,-------|-------|-------| |-------+-------+-------. -* | Space | Enter |App/Alt| | RGUI | Delete| Bspc | -* | / | / |-------| |-------| / | / | -* | Fn | Number| Bspc | | Enter |Number2| Fn2 | -* `-----------------------' `-----------------------' + (Keys separated by /: tap for first, hold for second; uses Space Cadet Shifts) + ,-----------------------------------------------------------------------------------------------------------. + | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | PScr| SLck| Paus|Numpd|Adjst| + `-----------------------------------------------------------------------------------------------------------' + ,-------------------------------------------. ,-------------------------------------------. + | = | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | - | + |--------+------+------+------+------+------| |------+------+------+------+------+--------| + | Tab | Q | W | E | R | T | | Y | U | I | O | P | \ | + |--------+------+------+------+------+------| |------+------+------+------+------+--------| + |Esc/Ctrl| A | S | D | F | G | | H | J | K | L | ; | ' | + |--------+------+------+------+------+------| |------+------+------+------+------+--------| + |SC Shift| Z | X | C | V | B | | N | M | , | . | / |SC Shift| + `--------+------+------+------+------+------' `------+------+------+------+------+--------' + | Ins | ` | [ | ] | | Left | Down | Up | Right| + `---------------------------' `---------------------------' + ,---------------. ,---------------. + |Esc/Ctl| Hyper | | RAlt | RCtl | + ,-------|-------|-------| |-------+-------+-------. + | Space | Enter |App/Alt| | RGUI | Delete| Bspc | + | / | / |-------| |-------| / | / | + | Fn | Number| Bspc | | Enter |Number2| Fn2 | + `-----------------------' `-----------------------' */ -[_QWERTY] = LAYOUT( - // Left Hand - KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, - KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, - CTLESC, KC_A, KC_S, KC_D, KC_F, KC_G, - KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, - KC_INS, KC_GRV, KC_LBRC, KC_RBRC, - //Left Thumb - CTLESC, ALL_T(KC_NO), - ALTAPP, - SPCFN, ENTNS, KC_BSPC, - - //Right Hand - KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, NUMPAD, ADJUST, - KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, - KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, - KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, - KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, - KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, - //Right Thumb - KC_RALT, KC_RCTL, - KC_RGUI, - KC_ENT, DELNS, BSPCFN +[_QWERTY] = LAYOUT_pretty( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, NUMPAD, ADJUST, + KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, + CTLESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, + KC_INS, KC_GRV, KC_LBRC, KC_RBRC, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, + CTLESC, ALL_T(KC_NO), KC_RALT, KC_RCTL, + ALTAPP, KC_RGUI, + SPCFN, ENTNS, KC_BSPC, KC_ENT, DELNS, BSPCFN ), /* Number/symbol layer -* (Multiple characters: single-tap for first, double-tap for second) -* ,-------------------------------------------. ,-------------------------------------------. -* | F12 | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 | -* |--------+------+------+------+------+------| |------+------+------+------+------+--------| -* | | 6 | 7 | 8 | 9 | 0 | | ^ | & | * | ( | ) | | -* |--------+------+------+------+------+------| |------+------+------+------+------+--------| -* | | 1 | 2 | 3 | 4 | 5 | | ! | @ | # | $ | % | | -* |--------+------+------+------+------+------| |------+------+------+------+------+--------| -* | | | . | / * | - _ | + = | | ` ~ | [ { | ] } | | | | -* `--------+------+------+------+------+------' `------+------+------+------+------+--------' -* | ( | ) | [ { | ] } | | | | | | -* `---------------------------' `---------------------------' -* ,---------------. ,---------------. -* | | | | | | -* ,-------|-------|-------| |-------+-------+-------. -* | | | | | | | | -* | | |-------| |-------| | | -* | | | | | | | | -* `-----------------------' `-----------------------' + (Multiple characters: single-tap for first, double-tap for second) + ,-----------------------------------------------------------------------------------------------------------. + | | | | | | | | | | | | | | | | | | | + `-----------------------------------------------------------------------------------------------------------' + ,-------------------------------------------. ,-------------------------------------------. + | F12 | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 | + |--------+------+------+------+------+------| |------+------+------+------+------+--------| + | | 6 | 7 | 8 | 9 | 0 | | ^ | & | * | ( | ) | | + |--------+------+------+------+------+------| |------+------+------+------+------+--------| + | | 1 | 2 | 3 | 4 | 5 | | ! | @ | # | $ | % | | + |--------+------+------+------+------+------| |------+------+------+------+------+--------| + | | | . | / * | - _ | + = | | ` ~ | [ { | ] } | | | | + `--------+------+------+------+------+------' `------+------+------+------+------+--------' + | ( | ) | [ { | ] } | | | | | | + `---------------------------' `---------------------------' + ,---------------. ,---------------. + | | | | | | + ,-------|-------|-------| |-------+-------+-------. + | | | | | | | | + | | |-------| |-------| | | + | | | | | | | | + `-----------------------' `-----------------------' */ -[_NUMBERS] = LAYOUT( - // Left Hand - _______, _______, _______, _______, _______, _______, _______, _______, _______, - KC_F12, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, - _______, KC_6, KC_7, KC_8, KC_9, KC_0, - _______, KC_1, KC_2, KC_3, KC_4, KC_5, - _______, _______, KC_DOT, TD(SLAS), TD(MNUN), TD(PLEQ), - KC_LPRN, KC_RPRN, TD(LBCB), TD(RBCB), - // Left Thumb - _______, _______, - _______, - _______, _______, _______, - // Right Hand - _______, _______, _______, _______, _______, _______, _______, _______, _______, - KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, - KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, - KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, _______, - TD(GVTL), TD(LBCB), TD(RBCB), _______, _______, _______, - _______, _______, _______, _______, - // Right Thumb - _______, _______, - _______, - _______, _______, _______ +[_NUMBERS] = LAYOUT_pretty( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + KC_F12, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + _______, KC_6, KC_7, KC_8, KC_9, KC_0, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, + _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, _______, + _______, _______, KC_DOT, TD(SLAS), TD(MNUN), TD(PLEQ), TD(GVTL), TD(LBCB), TD(RBCB), _______, _______, _______, + KC_LPRN, KC_RPRN, TD(LBCB), TD(RBCB), _______, _______, _______, _______, + _______, _______, _______, _______, + _______, _______, + _______, _______, _______, _______, _______, _______ ), -[_NUMBERS2] = LAYOUT( - // Left Hand - _______, _______, _______, _______, _______, _______, _______, _______, _______, - KC_F12, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, - _______, KC_6, KC_7, KC_8, KC_9, KC_0, - _______, KC_1, KC_2, KC_3, KC_4, KC_5, - _______, _______, KC_DOT, TD(SLAS), TD(MNUN), TD(PLEQ), - KC_LPRN, KC_RPRN, TD(LBCB), TD(RBCB), - // Left Thumb - _______, _______, - _______, - _______, _______, _______, - // Right Hand - _______, _______, _______, _______, _______, _______, _______, _______, _______, - KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, - KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, - KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, _______, - TD(GVTL), TD(LBCB), TD(RBCB), _______, _______, _______, - _______, _______, _______, _______, - // Right Thumb - _______, _______, - _______, - _______, _______, _______ +[_NUMBERS2] = LAYOUT_pretty( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + KC_F12, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + _______, KC_6, KC_7, KC_8, KC_9, KC_0, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, + _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, _______, + _______, _______, KC_DOT, TD(SLAS), TD(MNUN), TD(PLEQ), TD(GVTL), TD(LBCB), TD(RBCB), _______, _______, _______, + KC_LPRN, KC_RPRN, TD(LBCB), TD(RBCB), _______, _______, _______, _______, + _______, _______, _______, _______, + _______, _______, + _______, _______, _______, _______, _______, _______ ), /* Function layer -* ,-------------------------------------------. ,-------------------------------------------. -* | F12 | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 | -* |--------+------+------+------+------+------| |------+------+------+------+------+--------| -* | | | | Up | | | | | | Up |Ctrl+Y| | | -* |--------+------+------+------+------+------| |------+------+------+------+------+--------| -* | |Ctrl+A| Left | Down | Right|C+A+Tb| | PgUp | Right| Down | Left | Home | | -* |--------+------+------+------+------+------| |------+------+------+------+------+--------| -* | |Ctrl+Z|Ctrl+X|Ctrl+C|Ctrl+V| Bspc | | PgDn | Mute | Vol- | Vol+ | End | | -* `--------+------+------+------+------+------' `------+------+------+------+------+--------' -* | | | | | | Prev | Play | Next | Stop | -* `---------------------------' `---------------------------' -* ,---------------. ,---------------. -* | | | | | | -* ,-------|-------|-------| |-------+-------+-------. -* | | | | | | | | -* | | |-------| |-------| | | -* | | | | | | | | -* `-----------------------' `-----------------------' + ,-----------------------------------------------------------------------------------------------------------. + | | | | | | | | | | | | | | | | | | | + `-----------------------------------------------------------------------------------------------------------' + ,-------------------------------------------. ,-------------------------------------------. + | F12 | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 | + |--------+------+------+------+------+------| |------+------+------+------+------+--------| + | | | | Up | | | | | | Up |Ctrl+Y| | | + |--------+------+------+------+------+------| |------+------+------+------+------+--------| + | |Ctrl+A| Left | Down | Right|C+A+Tb| | PgUp | Right| Down | Left | Home | | + |--------+------+------+------+------+------| |------+------+------+------+------+--------| + | |Ctrl+Z|Ctrl+X|Ctrl+C|Ctrl+V| Bspc | | PgDn | Mute | Vol- | Vol+ | End | | + `--------+------+------+------+------+------' `------+------+------+------+------+--------' + | | | | | | Prev | Play | Next | Stop | + `---------------------------' `---------------------------' + ,---------------. ,---------------. + | | | | | | + ,-------|-------|-------| |-------+-------+-------. + | | | | | | | | + | | |-------| |-------| | | + | | | | | | | | + `-----------------------' `-----------------------' */ -[_FUNCTION] = LAYOUT( - // Left Hand - _______, _______, _______, _______, _______, _______, _______, _______, _______, - KC_F12, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, - _______, _______, _______, KC_UP, _______, _______, - _______, LCTL(KC_A), KC_LEFT, KC_DOWN, KC_RGHT, LCA(KC_TAB), - _______, LCTL(KC_Z), LCTL(KC_X), LCTL(KC_C), LCTL(KC_V), KC_BSPC, - _______, _______, _______, _______, - // Left Thumb - _______, _______, - _______, - _______, _______, _______, - // Right Hand - _______, _______, _______, _______, _______, _______, _______, _______, _______, - KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, - _______, _______, KC_UP, LCTL(KC_Y), _______, _______, - KC_PGUP, KC_LEFT, KC_DOWN, KC_RGHT, KC_HOME, _______, - KC_PGDN, KC_MUTE, KC_VOLD, KC_VOLU, KC_END, _______, - KC_MPRV, KC_MPLY, KC_MNXT, KC_MSTP, - // Right Thumb - _______, _______, - _______, - _______, _______, _______ +[_FUNCTION] = LAYOUT_pretty( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + KC_F12, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + _______, _______, _______, KC_UP, _______, _______, _______, _______, KC_UP, LCTL(KC_Y), _______, _______, + _______, LCTL(KC_A), KC_LEFT, KC_DOWN, KC_RGHT, LCA(KC_TAB), KC_PGUP, KC_LEFT, KC_DOWN, KC_RGHT, KC_HOME, _______, + _______, LCTL(KC_Z), LCTL(KC_X), LCTL(KC_C), LCTL(KC_V), KC_BSPC, KC_PGDN, KC_MUTE, KC_VOLD, KC_VOLU, KC_END, _______, + _______, _______, _______, _______, KC_MPRV, KC_MPLY, KC_MNXT, KC_MSTP, + _______, _______, _______, _______, + _______, _______, + _______, _______, _______, _______, _______, _______ ), -[_FUNCTION2] = LAYOUT( - // Left Hand - _______, _______, _______, _______, _______, _______, _______, _______, _______, - KC_F12, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, - _______, _______, _______, KC_UP, _______, _______, - _______, LCTL(KC_A), KC_LEFT, KC_DOWN, KC_RGHT, LCA(KC_TAB), - _______, LCTL(KC_Z), LCTL(KC_X), LCTL(KC_C), LCTL(KC_V), KC_BSPC, - _______, _______, _______, _______, - // Left Thumb - _______, _______, - _______, - _______, _______, _______, - // Right Hand - _______, _______, _______, _______, _______, _______, _______, _______, _______, - KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, - _______, _______, KC_UP, LCTL(KC_Y), _______, _______, - KC_PGUP, KC_LEFT, KC_DOWN, KC_RGHT, KC_HOME, _______, - KC_PGDN, KC_MUTE, KC_VOLD, KC_VOLU, KC_END, _______, - KC_MPRV, KC_MPLY, KC_MNXT, KC_MSTP, - // Right Thumb - _______, _______, - _______, - _______, _______, _______ +[_FUNCTION2] = LAYOUT_pretty( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + KC_F12, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + _______, _______, _______, KC_UP, _______, _______, _______, _______, KC_UP, LCTL(KC_Y), _______, _______, + _______, LCTL(KC_A), KC_LEFT, KC_DOWN, KC_RGHT, LCA(KC_TAB), KC_PGUP, KC_LEFT, KC_DOWN, KC_RGHT, KC_HOME, _______, + _______, LCTL(KC_Z), LCTL(KC_X), LCTL(KC_C), LCTL(KC_V), KC_BSPC, KC_PGDN, KC_MUTE, KC_VOLD, KC_VOLU, KC_END, _______, + _______, _______, _______, _______, KC_MPRV, KC_MPLY, KC_MNXT, KC_MSTP, + _______, _______, _______, _______, + _______, _______, + _______, _______, _______, _______, _______, _______ ), /* Numpad layer -* (Left side duplicates layout from the Numbers layer, just with numpad output; right side layout close to PC numpad layout) -* ,-------------------------------------------. ,-------------------------------------------. -* | | NumLk| | | | | | Tab | NumLk| KP / | KP * | KP - | | -* |--------+------+------+------+------+------| |------+------+------+------+------+--------| -* | | KP 6 | KP 7 | KP 8 | KP 9 | KP 0 | | | KP 7 | KP 8 | KP 9 | KP + | | -* |--------+------+------+------+------+------| |------+------+------+------+------+--------| -* | | KP 1 | KP 2 | KP 3 | KP 4 | KP 5 | | | KP 4 | KP 5 | KP 6 | = | | -* |--------+------+------+------+------+------| |------+------+------+------+------+--------| -* | | | KP . |KP/KP*| KP- _| KP+ =| | | KP 1 | KP 2 | KP 3 |KP Ent| | -* `--------+------+------+------+------+------' `------+------+------+------+------+--------' -* | ( | ) | [ { | ] } | | KP 0 | , | KP . |KP Ent| -* `---------------------------' `---------------------------' -* ,---------------. ,---------------. -* | | | | | | -* ,-------|-------|-------| |-------+-------+-------. -* | | | | | | | | -* | | |-------| |-------| | | -* | | | | | KP Ent| | | -* `-----------------------' `-----------------------' + (Left side duplicates layout from the Numbers layer, just with numpad output; right side layout close to PC numpad layout) + ,-----------------------------------------------------------------------------------------------------------. + | | | | | | | | | | | | | | | | | | | + `-----------------------------------------------------------------------------------------------------------' + ,-------------------------------------------. ,-------------------------------------------. + | | NumLk| | | | | | Tab | NumLk| KP / | KP * | KP - | | + |--------+------+------+------+------+------| |------+------+------+------+------+--------| + | | KP 6 | KP 7 | KP 8 | KP 9 | KP 0 | | | KP 7 | KP 8 | KP 9 | KP + | | + |--------+------+------+------+------+------| |------+------+------+------+------+--------| + | | KP 1 | KP 2 | KP 3 | KP 4 | KP 5 | | | KP 4 | KP 5 | KP 6 | = | | + |--------+------+------+------+------+------| |------+------+------+------+------+--------| + | | | KP . |KP/KP*| KP- _| KP+ =| | | KP 1 | KP 2 | KP 3 |KP Ent| | + `--------+------+------+------+------+------' `------+------+------+------+------+--------' + | ( | ) | [ { | ] } | | KP 0 | , | KP . |KP Ent| + `---------------------------' `---------------------------' + ,---------------. ,---------------. + | | | | | | + ,-------|-------|-------| |-------+-------+-------. + | | | | | | | | + | | |-------| |-------| | | + | | | | | | | | + `-----------------------' `-----------------------' */ -[_NUMPAD] = LAYOUT( - // Left Hand - _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, KC_NLCK, _______, _______, _______, _______, - _______, KC_P6, KC_P7, KC_P8, KC_P9, KC_P0, - _______, KC_P1, KC_P2, KC_P3, KC_P4, KC_P5, - _______, _______, KC_PDOT, TD(PSLPAS), TD(PMNUN), TD(PPLEQ), - KC_LPRN, KC_RPRN, TD(LBCB), TD(RBCB), - // Left Thumb - _______, _______, - _______, - _______, _______, _______, - // Right Hand - _______, _______, _______, _______, _______, _______, _______, _______, _______, - KC_TAB, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, _______, - _______, KC_P7, KC_P8, KC_P9, KC_PPLS, _______, - _______, KC_P4, KC_P5, KC_P6, KC_EQL, _______, - _______, KC_P1, KC_P2, KC_P3, KC_PENT, _______, - KC_P0, KC_COMM, KC_PDOT, KC_PENT, - // Right Thumb - _______, _______, - _______, - _______, _______, _______ +[_NUMPAD] = LAYOUT_pretty( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, KC_NLCK, _______, _______, _______, _______, KC_TAB, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, _______, + _______, KC_P6, KC_P7, KC_P8, KC_P9, KC_P0, _______, KC_P7, KC_P8, KC_P9, KC_PPLS, _______, + _______, KC_P1, KC_P2, KC_P3, KC_P4, KC_P5, _______, KC_P4, KC_P5, KC_P6, KC_EQL, _______, + _______, _______, KC_PDOT, TD(PSLPAS), TD(PMNUN), TD(PPLEQ), _______, KC_P1, KC_P2, KC_P3, KC_PENT, _______, + KC_LPRN, KC_RPRN, TD(LBCB), TD(RBCB), KC_P0, KC_COMM, KC_PDOT, KC_PENT, + _______, _______, _______, _______, + _______, _______, + _______, _______, _______, _______, _______, _______ ), /* Colemak gaming/vanilla -* (Limited access to Function or Numbers layers; mainly used for gaming; double-tap and hold TD(ADJ) above LAlt to access Adjust layer) -* ,-------------------------------------------. ,-------------------------------------------. -* | = | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | - | -* |--------+------+------+------+------+------| |------+------+------+------+------+--------| -* | Tab | Q | W | F | P | G | | J | L | U | Y | ; | \ | -* |--------+------+------+------+------+------| |------+------+------+------+------+--------| -* | Ctrl | A | R | S | T | D | | H | N | E | I | O | ' | -* |--------+------+------+------+------+------| |------+------+------+------+------+--------| -* | Shift | Z | X | C | V | B | | K | M | , | . | / | Shift | -* `--------+------+------+------+------+------' `------+------+------+------+------+--------' -* | Ins | ` | [ | ] | | Left | Down | Up | Right| -* `---------------------------' `---------------------------' -* ,---------------. ,---------------. -* |Esc/Ctl|TD(ADJ)| | RAlt | RCtl | -* ,-------|-------|-------| |-------+-------+-------. -* | | | LAlt | | RGUI | | | -* | Space | Enter |-------| |-------| Delete| Bspc | -* | | |Bspc/FN| | Ent/NS| | | -* `-----------------------' `-----------------------' + (Limited access to Function or Numbers layers; mainly used for gaming; double-tap and hold TD(ADJ) above LAlt to access Adjust layer) + ,-----------------------------------------------------------------------------------------------------------. + | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | PScr| SLck| Paus|Numpd|Adjst| + `-----------------------------------------------------------------------------------------------------------' + ,-------------------------------------------. ,-------------------------------------------. + | = | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | - | + |--------+------+------+------+------+------| |------+------+------+------+------+--------| + | Tab | Q | W | F | P | G | | J | L | U | Y | ; | \ | + |--------+------+------+------+------+------| |------+------+------+------+------+--------| + | Ctrl | A | R | S | T | D | | H | N | E | I | O | ' | + |--------+------+------+------+------+------| |------+------+------+------+------+--------| + | Shift | Z | X | C | V | B | | K | M | , | . | / | Shift | + `--------+------+------+------+------+------' `------+------+------+------+------+--------' + | Ins | ` | [ | ] | | Left | Down | Up | Right| + `---------------------------' `---------------------------' + ,---------------. ,---------------. + |Esc/Ctl|TD(ADJ)| | RAlt | RCtl | + ,-------|-------|-------| |-------+-------+-------. + | | | LAlt | | RGUI | | | + | Space | Enter |-------| |-------| Delete| Bspc | + | | |Bspc/FN| | Ent/NS| | | + `-----------------------' `-----------------------' */ -[_COLEMAKGM] = LAYOUT( - // Left Hand - KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, - KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, - KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, - KC_LCTL, KC_A, KC_R, KC_S, KC_T, KC_D, - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, - KC_INS, KC_GRV, KC_LBRC, KC_RBRC, - //Left Thumb - CTLESC, TD(ADJ), - KC_LALT, - KC_SPC, KC_ENT, BSPCFN, - //Right Hand - KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, NUMPAD, ADJUST, - KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, - KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSLS, - KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, - KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, - KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, - //Right Thumb - KC_RALT, KC_RCTL, - KC_RGUI, - ENTNS, KC_DEL, KC_BSPC +[_COLEMAKGM] = LAYOUT_pretty( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, NUMPAD, ADJUST, + KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSLS, + KC_LCTL, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_INS, KC_GRV, KC_LBRC, KC_RBRC, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, + CTLESC, TD(ADJ), KC_RALT, KC_RCTL, + KC_LALT, KC_RGUI, + KC_SPC, KC_ENT, BSPCFN, ENTNS, KC_DEL, KC_BSPC ), /* QWERTY gaming/vanilla -* (Limited access to Function or Numbers layers; mainly used for gaming; double-tap and hold TD(ADJ) above LAlt to access Adjust layer) -* ,-------------------------------------------. ,-------------------------------------------. -* | = | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | - | -* |--------+------+------+------+------+------| |------+------+------+------+------+--------| -* | Tab | Q | W | E | R | T | | Y | U | I | O | P | \ | -* |--------+------+------+------+------+------| |------+------+------+------+------+--------| -* | Ctrl | A | S | D | F | G | | H | J | K | L | ; | ' | -* |--------+------+------+------+------+------| |------+------+------+------+------+--------| -* | Shift | Z | X | C | V | B | | N | M | , | . | / | Shift | -* `--------+------+------+------+------+------' `------+------+------+------+------+--------' -* | Ins | ` | [ | ] | | Left | Down | Up | Right| -* `---------------------------' `---------------------------' -* ,---------------. ,---------------. -* |Esc/Ctl|TD(ADJ)| | RAlt | RCtl | -* ,-------|-------|-------| |-------+-------+-------. -* | | | LAlt | | RGUI | | | -* | Space | Enter |-------| |-------| Delete| Bspc | -* | | |Bspc/FN| | Ent/NS| | | -* `-----------------------' `-----------------------' + (Limited access to Function or Numbers layers; mainly used for gaming; double-tap and hold TD(ADJ) above LAlt to access Adjust layer) + ,-----------------------------------------------------------------------------------------------------------. + | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | PScr| SLck| Paus|Numpd|Adjst| + `-----------------------------------------------------------------------------------------------------------' + ,-------------------------------------------. ,-------------------------------------------. + | = | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | - | + |--------+------+------+------+------+------| |------+------+------+------+------+--------| + | Tab | Q | W | E | R | T | | Y | U | I | O | P | \ | + |--------+------+------+------+------+------| |------+------+------+------+------+--------| + | Ctrl | A | S | D | F | G | | H | J | K | L | ; | ' | + |--------+------+------+------+------+------| |------+------+------+------+------+--------| + | Shift | Z | X | C | V | B | | N | M | , | . | / | Shift | + `--------+------+------+------+------+------' `------+------+------+------+------+--------' + | Ins | ` | [ | ] | | Left | Down | Up | Right| + `---------------------------' `---------------------------' + ,---------------. ,---------------. + |Esc/Ctl|TD(ADJ)| | RAlt | RCtl | + ,-------|-------|-------| |-------+-------+-------. + | | | LAlt | | RGUI | | | + | Space | Enter |-------| |-------| Delete| Bspc | + | | |Bspc/FN| | Ent/NS| | | + `-----------------------' `-----------------------' */ -[_QWERTYGM] = LAYOUT( - // Left Hand - KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, - KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, - KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, - KC_INS, KC_GRV, KC_LBRC, KC_RBRC, - //Left Thumb - CTLESC, TD(ADJ), - KC_LALT, - KC_SPC, KC_ENT, BSPCFN, - //Right Hand - KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, NUMPAD, ADJUST, - KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, - KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, - KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, - KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, - KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, - //Right Thumb - KC_RALT, KC_RCTL, - KC_RGUI, - ENTNS, KC_DEL, KC_BSPC +[_QWERTYGM] = LAYOUT_pretty( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, NUMPAD, ADJUST, + KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_INS, KC_GRV, KC_LBRC, KC_RBRC, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, + CTLESC, TD(ADJ), KC_RALT, KC_RCTL, + KC_LALT, KC_RGUI, + KC_SPC, KC_ENT, BSPCFN, ENTNS, KC_DEL, KC_BSPC ), /* Adjust layer -* (Enter/Number + Delete/Number2 under non-gaming/vanilla layers; Numpad is a toggle) -* ,-------------------------------------------. ,-------------------------------------------. -* | |Colmak|Qwerty| |ClmkGM| QWGM | |Numpad| | | | | RESET | -* |--------+------+------+------+------+------| |------+------+------+------+------+--------| -* | | | | | | | | | | | | | | -* |--------+------+------+------+------+------| |------+------+------+------+------+--------| -* | | | | | | | | |NKROTG| | | | | -* |--------+------+------+------+------+------| |------+------+------+------+------+--------| -* | | | | | | | | | | | | | | -* `--------+------+------+------+------+------' `------+------+------+------+------+--------' -* | | | | | | | | | | -* `---------------------------' `---------------------------' -* ,---------------. ,---------------. -* | | | | | | -* ,-------|-------|-------| |-------+-------+-------. -* | | | | | | | | -* | | |-------| |-------| | | -* | | | | | | | | -* `-----------------------' `-----------------------' + (Enter/Number + Delete/Number2 under non-gaming/vanilla layers or press & hold Adjust key on function row; Numpad is a toggle) + ,-----------------------------------------------------------------------------------------------------------. + | | | | | | | | | | | | | | | | | | | + `-----------------------------------------------------------------------------------------------------------' + ,-------------------------------------------. ,-------------------------------------------. + | |Colmak|Qwerty| |ClmkGM| QWGM | |Numpad| | | | | RESET | + |--------+------+------+------+------+------| |------+------+------+------+------+--------| + | | | | | | | | | | | | | | + |--------+------+------+------+------+------| |------+------+------+------+------+--------| + | | | | | | | | | NKRO | | | | | + |--------+------+------+------+------+------| |------+------+------+------+------+--------| + | | | | | | | | | | | | | | + `--------+------+------+------+------+------' `------+------+------+------+------+--------' + | | | | | | | | | | + `---------------------------' `---------------------------' + ,---------------. ,---------------. + | | | | | | + ,-------|-------|-------| |-------+-------+-------. + | | | | | | | | + | | |-------| |-------| | | + | | | | | | | | + `-----------------------' `-----------------------' */ -[_ADJUST] = LAYOUT( - // Left Hand - _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, COLEMAK, QWERTY, _______, COLEMAKGM, QWERTYGM, - _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, - // Left Thumb - _______, _______, - _______, - _______, _______, _______, - // Right Hand - _______, _______, _______, _______, _______, _______, _______, _______, _______, - NUMPAD, _______, _______, _______, _______, RESET, - _______, _______, _______, _______, _______, _______, - _______, NKROTG, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, - // Right Thumb - _______, _______, - _______, - _______, _______, _______ +[_ADJUST] = LAYOUT_pretty( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, COLEMAK, QWERTY, _______, COLEMAKGM, QWERTYGM, NUMPAD, _______, _______, _______, _______, RESET, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, NKROTG, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, + _______, _______, + _______, _______, _______, _______, _______, _______ ), -[_ADJUST2] = LAYOUT( - // Left Hand - _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, COLEMAK, QWERTY, _______, COLEMAKGM, QWERTYGM, - _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, - // Left Thumb - _______, _______, - _______, - _______, _______, _______, - // Right Hand - _______, _______, _______, _______, _______, _______, _______, _______, _______, - NUMPAD, _______, _______, _______, _______, RESET, - _______, _______, _______, _______, _______, _______, - _______, NKROTG, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, - // Right Thumb - _______, _______, - _______, - _______, _______, _______ +[_ADJUST2] = LAYOUT_pretty( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, COLEMAK, QWERTY, _______, COLEMAKGM, QWERTYGM, NUMPAD, _______, _______, _______, _______, RESET, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, NKROTG, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, + _______, _______, + _______, _______, _______, _______, _______, _______ ) }; diff --git a/keyboards/kinesis/keymaps/insertsnideremarks/readme.md b/keyboards/kinesis/keymaps/insertsnideremarks/readme.md index f774ef444..7a146c7a2 100644 --- a/keyboards/kinesis/keymaps/insertsnideremarks/readme.md +++ b/keyboards/kinesis/keymaps/insertsnideremarks/readme.md @@ -14,7 +14,7 @@ I've largely left the function keys untouched, with the intension of not using t I use Colemak as my default layout. I've included QWERTY here as well. -Additionally, I've added gaming/vanilla version of Colemak and QWERTY layouts. These layouts have no access to the Function or Numbers layers, thus no dual-role keys with layer access, and are mainly used for gaming. +Additionally, I've added gaming/vanilla version of Colemak and QWERTY layouts. These layouts have limited access to the Function or Numbers layers, and are mainly used for gaming. Persistent default layer has been enabled for Colemak and QWERTY. The gaming/vanilla Colemak and QWERTY can be set as default layer, but will not be persistent. @@ -46,7 +46,7 @@ Persistent default layer has been enabled for Colemak and QWERTY. The gaming/va ,-------|-------|-------| |-------+-------+-------. | Space | Enter |App/Alt| | RGUI | Delete| Bspc | | / | / |-------| |-------| / | / | - | Fn | Number| Bspc | | Tab |Number2| Fn2 | + | Fn | Number| Bspc | | Enter |Number2| Fn2 | `-----------------------' `-----------------------' @@ -71,7 +71,7 @@ Persistent default layer has been enabled for Colemak and QWERTY. The gaming/va ,-------|-------|-------| |-------+-------+-------. | Space | Enter |App/Alt| | RGUI | Delete| Bspc | | / | / |-------| |-------| / | / | - | Fn | Number| Bspc | | Tab |Number2| Fn2 | + | Fn | Number| Bspc | | Enter |Number2| Fn2 | `-----------------------' `-----------------------' @@ -109,9 +109,9 @@ Persistent default layer has been enabled for Colemak and QWERTY. The gaming/va |--------+------+------+------+------+------| |------+------+------+------+------+--------| | | | | Up | | | | | | Up |Ctrl+Y| | | |--------+------+------+------+------+------| |------+------+------+------+------+--------| - | |Ctrl+A| Left | Down | Right| | | PgUp | Right| Down | Left | Home | | + | |Ctrl+A| Left | Down | Right|C+A+Tb| | PgUp | Right| Down | Left | Home | | |--------+------+------+------+------+------| |------+------+------+------+------+--------| - | |Ctrl+Z|Ctrl+X|Ctrl+C|Ctrl+V| | | PgDn | Mute | Vol- | Vol+ | End | | + | |Ctrl+Z|Ctrl+X|Ctrl+C|Ctrl+V| Bspc | | PgDn | Mute | Vol- | Vol+ | End | | `--------+------+------+------+------+------' `------+------+------+------+------+--------' | | | | | | Prev | Play | Next | Stop | `---------------------------' `---------------------------' @@ -120,7 +120,7 @@ Persistent default layer has been enabled for Colemak and QWERTY. The gaming/va ,-------|-------|-------| |-------+-------+-------. | | | | | | | | | | |-------| |-------| | | - | | | | |C+A+Tab| | | + | | | | | | | | `-----------------------' `-----------------------' @@ -150,7 +150,7 @@ Persistent default layer has been enabled for Colemak and QWERTY. The gaming/va ### Colemak gaming/vanilla - (Limited access to Function or Numbers layers; mainly used for gaming; double-tap TD(ADJ) for one shot access to Adjust layer) + (Limited access to Function or Numbers layers; mainly used for gaming; double-tap and hold TD(ADJ) above LAlt to access Adjust layer) ,-----------------------------------------------------------------------------------------------------------. | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | PScr| SLck| Paus|Numpd|Adjst| `-----------------------------------------------------------------------------------------------------------' @@ -175,7 +175,7 @@ Persistent default layer has been enabled for Colemak and QWERTY. The gaming/va ### QWERTY gaming/vanilla - (Limited access to Function or Numbers layers; mainly used for gaming; double-tap TD(ADJ) for one shot access to Adjust layer) + (Limited access to Function or Numbers layers; mainly used for gaming; double-tap and hold TD(ADJ) above LAlt to access Adjust layer) ,-----------------------------------------------------------------------------------------------------------. | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | PScr| SLck| Paus|Numpd|Adjst| `-----------------------------------------------------------------------------------------------------------' @@ -199,7 +199,7 @@ Persistent default layer has been enabled for Colemak and QWERTY. The gaming/va `-----------------------' `-----------------------' ### Adjust layer - (Press Enter/Number + Delete/Number2 together under non-gaming/vanilla layers; Numpad is a toggle) + (Press Enter/Number + Delete/Number2 under non-gaming/vanilla layers or press & hold Adjust key on function row; Numpad is a toggle) ,-----------------------------------------------------------------------------------------------------------. | | | | | | | | | | | | | | | | | | | `-----------------------------------------------------------------------------------------------------------' diff --git a/keyboards/kinesis/keymaps/insertsnideremarks/rules.mk b/keyboards/kinesis/keymaps/insertsnideremarks/rules.mk index e1af05cb4..8e4a8ffad 100644 --- a/keyboards/kinesis/keymaps/insertsnideremarks/rules.mk +++ b/keyboards/kinesis/keymaps/insertsnideremarks/rules.mk @@ -5,7 +5,7 @@ DEFAULT_FOLDER = kinesis/stapelberg BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = no # Mouse keys(+4700) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) CONSOLE_ENABLE = yes # Console for debug(+400) COMMAND_ENABLE = no # Commands for debug and configuration From 94f92cedef54403b2d6df9ce7a2715d3c4732378 Mon Sep 17 00:00:00 2001 From: ishtob Date: Fri, 31 Aug 2018 10:37:13 -0400 Subject: [PATCH 028/788] Fix emulated EEPROM start address on STM32F303 (#3819) MCU has 254 flash, changed 250 to 254. tested working on a planck rev6 --- tmk_core/common/chibios/eeprom_stm32.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmk_core/common/chibios/eeprom_stm32.h b/tmk_core/common/chibios/eeprom_stm32.h index d06d30266..68aa14f6d 100755 --- a/tmk_core/common/chibios/eeprom_stm32.h +++ b/tmk_core/common/chibios/eeprom_stm32.h @@ -48,7 +48,7 @@ #elif defined (MCU_STM32F103RD) #define EEPROM_START_ADDRESS ((uint32_t)(0x8000000 + 384 * 1024 - 2 * EEPROM_PAGE_SIZE)) #elif defined (MCU_STM32F303CC) - #define EEPROM_START_ADDRESS ((uint32_t)(0x8000000 + 250 * 1024 - 2 * EEPROM_PAGE_SIZE)) + #define EEPROM_START_ADDRESS ((uint32_t)(0x8000000 + 256 * 1024 - 2 * EEPROM_PAGE_SIZE)) #else #error "No MCU type specified. Add something like -DMCU_STM32F103RB to your compiler arguments (probably in a Makefile)." #endif From 2cd80f84a416153cb17bc4543477be0d708e6f0f Mon Sep 17 00:00:00 2001 From: patrickmt <40182064+patrickmt@users.noreply.github.com> Date: Fri, 31 Aug 2018 10:38:06 -0400 Subject: [PATCH 029/788] Keyboard: CTRL and ALT keyboard json fix (#3816) Fixed incorrect layout names --- keyboards/massdrop/alt67/info.json | 2 +- keyboards/massdrop/ctrl/info.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/massdrop/alt67/info.json b/keyboards/massdrop/alt67/info.json index eca47ac4e..8f85bece2 100644 --- a/keyboards/massdrop/alt67/info.json +++ b/keyboards/massdrop/alt67/info.json @@ -5,7 +5,7 @@ "width": 16, "height": 5, "layouts": { - "LAYOUT_all": { + "LAYOUT": { "layout": [ {"label":"ESCAPE", "x":0, "y":0}, {"label":"1", "x":1, "y":0}, diff --git a/keyboards/massdrop/ctrl/info.json b/keyboards/massdrop/ctrl/info.json index 5eac2937b..2212540e5 100644 --- a/keyboards/massdrop/ctrl/info.json +++ b/keyboards/massdrop/ctrl/info.json @@ -5,7 +5,7 @@ "width": 18.5, "height": 6.5, "layouts": { - "LAYOUT_all": { + "LAYOUT": { "layout": [ {"label":"ESCAPE", "x":0, "y":0}, {"label":"F1", "x":2, "y":0}, From f9eedd7ce741f15a1d5ff7327cb44d3979a46e35 Mon Sep 17 00:00:00 2001 From: Daniel Shields Date: Fri, 31 Aug 2018 16:12:37 +0100 Subject: [PATCH 030/788] Keymap: Add backlight controls for Planck Light in dshields keymap (#3801) --- keyboards/planck/keymaps/dshields/keymap.c | 10 +++++++++- keyboards/planck/keymaps/dshields/rules.mk | 16 +++++++++++----- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/keyboards/planck/keymaps/dshields/keymap.c b/keyboards/planck/keymaps/dshields/keymap.c index 86443d671..a39dc5e77 100644 --- a/keyboards/planck/keymaps/dshields/keymap.c +++ b/keyboards/planck/keymaps/dshields/keymap.c @@ -8,6 +8,14 @@ enum planck_keycodes { DYNAMIC_MACRO_RANGE = SAFE_RANGE }; #include "dynamic_macro.h" +#ifdef KEYBOARD_planck_light + #define LGT_TOG RGB_TOG + #define LGT_MOD RGB_MOD +#else + #define LGT_TOG BL_TOGG + #define LGT_MOD BL_STEP +#endif + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Default * ,-----------------------------------------------------------------------------------. @@ -74,7 +82,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [FUN] = LAYOUT_planck_grid( KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, RESET, KC_DEL, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10 , KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, _______, _______, _______, KC_WH_L, KC_WH_D, KC_WH_U, KC_WH_R, - BL_TOGG, BL_STEP, _______, _______, _______, DM_STRT, DM_STOP, _______, _______, KC_BTN1, KC_BTN2, KC_BTN3, + LGT_TOG, LGT_MOD, _______, _______, _______, DM_STRT, DM_STOP, _______, _______, KC_BTN1, KC_BTN2, KC_BTN3, _______, _______, _______, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R ) }; diff --git a/keyboards/planck/keymaps/dshields/rules.mk b/keyboards/planck/keymaps/dshields/rules.mk index a084c67de..8799c78f0 100644 --- a/keyboards/planck/keymaps/dshields/rules.mk +++ b/keyboards/planck/keymaps/dshields/rules.mk @@ -3,11 +3,17 @@ ifndef QUANTUM_DIR endif MOUSEKEY_ENABLE = yes # Mouse keys(+4700) -COMMAND_ENABLE = yes # Commands for debug and configuration +COMMAND_ENABLE = no # Commands for debug and configuration CONSOLE_ENABLE = no # Console for debug(+400) -BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality -# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend -AUDIO_ENABLE = no API_SYSEX_ENABLE = no -BOOTLOADER = qmk-dfu + +ifneq (,$(findstring planck/light,$(KEYBOARD))) + AUDIO_ENABLE = yes + BACKLIGHT_ENABLE = no + RGB_MATRIX_ENABLE = yes +else + AUDIO_ENABLE = no + BACKLIGHT_ENABLE = yes + RGB_MATRIX_ENABLE = no +endif From 4e45119796049f1c2f9e0c99a0ad6f0f932691b5 Mon Sep 17 00:00:00 2001 From: blindassassin111 <38090555+blindassassin111@users.noreply.github.com> Date: Fri, 31 Aug 2018 10:15:09 -0500 Subject: [PATCH 031/788] Keyboard: Adding Z-150 PCB firmware (#3793) * Adding the AT101 PCB firmware * Fixed AT101 keymap error * Fixing AT101 firmware * More Fixes for AT101 firmware * Rename AT101_Blackheart.c to at101_blackheart.c * Rename AT101_Blackheart.h to at101_blackheart.h * Update readme.md * Renaming AT101 folder pt1 * Renaming AT101 folder pt2 * Fixing AT101 LED function name * Redoing AT101 folder naming pt2 Last round had issues, should be the last rename. * Fixing missing comma in at101_blackheart.h * Adding Z-150 PCB * Adding Z-150 readme file * Fixing Z-150 firmware errors * Fixing Z-150 layout error * Fixing Z-150 firmware errors * Fixing Z-150 Issues Still unsure where the extra "\" is that through the error. * Fixing more Z-150 errors * Finally fixing the Z-150 error * Fixed Z-150 layout naming * Removed Z-150 layout fillers --- keyboards/z150_blackheart/config.h | 52 ++++++++++++++ .../z150_blackheart/keymaps/default/keymap.c | 69 +++++++++++++++++++ keyboards/z150_blackheart/readme.md | 14 ++++ keyboards/z150_blackheart/rules.mk | 58 ++++++++++++++++ keyboards/z150_blackheart/z150_blackheart.c | 1 + keyboards/z150_blackheart/z150_blackheart.h | 34 +++++++++ 6 files changed, 228 insertions(+) create mode 100644 keyboards/z150_blackheart/config.h create mode 100644 keyboards/z150_blackheart/keymaps/default/keymap.c create mode 100644 keyboards/z150_blackheart/readme.md create mode 100644 keyboards/z150_blackheart/rules.mk create mode 100644 keyboards/z150_blackheart/z150_blackheart.c create mode 100644 keyboards/z150_blackheart/z150_blackheart.h diff --git a/keyboards/z150_blackheart/config.h b/keyboards/z150_blackheart/config.h new file mode 100644 index 000000000..d2fce9aee --- /dev/null +++ b/keyboards/z150_blackheart/config.h @@ -0,0 +1,52 @@ +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER blindassassin111 +#define PRODUCT Z-150 PCB +#define DESCRIPTION Replacement for Zenith Z-150 PCB + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 20 + +/* key matrix pins */ +#define MATRIX_ROW_PINS { C3, C2, C1, C0, E1 } +#define MATRIX_COL_PINS { D0, D1, D2, D3, D4, D5, D7, E0, C7, C6, C5, C4, F0, F1, F2, F3, F4, F5, F6, F7 } +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCING_DELAY 5 + +/* 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 + +/* force n-key rollover*/ +#define FORCE_NKRO + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* prevent stuck modifiers */ +#define PREVENT_STUCK_MODIFIERS + + +#ifdef RGB_DI_PIN +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 0 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 +#endif \ No newline at end of file diff --git a/keyboards/z150_blackheart/keymaps/default/keymap.c b/keyboards/z150_blackheart/keymaps/default/keymap.c new file mode 100644 index 000000000..e93802052 --- /dev/null +++ b/keyboards/z150_blackheart/keymaps/default/keymap.c @@ -0,0 +1,69 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + LAYOUT( + KC_F1, KC_F2, KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NLCK, KC_SLCK, MO(1), + KC_F3, KC_F4, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_ENT, KC_P7, KC_P8, KC_P9, KC_PAST, + KC_F5, KC_F6, KC_LCTRL,KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_P4, KC_P5, KC_P6, KC_PMNS, + KC_F7, KC_F8, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT,KC_SLSH, KC_RSFT, KC_BSLS, KC_P1, KC_P2, KC_P3, KC_PPLS, + KC_F9, KC_F10, KC_LALT, KC_GRV, KC_SPC, KC_CAPS, KC_P0, KC_PDOT + ), + + LAYOUT( + _______, _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______ + ), + + LAYOUT_z150_tkl( + KC_F1, KC_F2, KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, + KC_F3, KC_F4, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, + KC_F5, KC_F6, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, + KC_F7, KC_F8, KC_LSFT, KC_BSLS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT, MO(1), XXXXXXX, KC_UP, XXXXXXX, + KC_F9, KC_F10, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_MENU, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + ), + + LAYOUT_z150_tkl( + _______, _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), +}; + +void matrix_init_user(void) { +} + +void matrix_scan_user(void) { +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void led_set_user(uint8_t usb_led) { + DDRB |= (1 << 0); + DDRE |= (1 << 6) | (1 << 7); + + if (usb_led & (1 << USB_LED_NUM_LOCK)) { + PORTE |= (1 << 7); + } else { + PORTE &= ~(1 << 7); + } + + if (usb_led & (1 << USB_LED_CAPS_LOCK)) { + PORTB |= (1 << 0); + } else { + PORTB &= ~(1 << 0); + } + + if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { + PORTE |= (1 << 6); + } else { + PORTE &= ~(1 << 6); + } +} \ No newline at end of file diff --git a/keyboards/z150_blackheart/readme.md b/keyboards/z150_blackheart/readme.md new file mode 100644 index 000000000..5e87b6c8f --- /dev/null +++ b/keyboards/z150_blackheart/readme.md @@ -0,0 +1,14 @@ +Z-150 Blackheart PCB +=== + +A replacement PCB for Zenith Z-150 keyboards. + +Keyboard Maintainer: QMK Community and blindassassin111 +Hardware Supported: Z-150 blackheart PCB +Hardware Availability: https://deskthority.net/group-buys-f50/programmable-vintage-board-pcbs-omnikey-at101-and-z-150-t19325.html + +Make example for this keyboard (after setting up your build environment): + + make z150_blackheart:default + +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). diff --git a/keyboards/z150_blackheart/rules.mk b/keyboards/z150_blackheart/rules.mk new file mode 100644 index 000000000..b258bf35f --- /dev/null +++ b/keyboards/z150_blackheart/rules.mk @@ -0,0 +1,58 @@ +# MCU name +MCU = at90usb1286 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + +# Bootloader selection +BOOTLOADER = halfkay + +# Boot Section Size in *bytes* +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# comment out to disable the options. +# +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +AUDIO_ENABLE = no +RGBLIGHT_ENABLE = no \ No newline at end of file diff --git a/keyboards/z150_blackheart/z150_blackheart.c b/keyboards/z150_blackheart/z150_blackheart.c new file mode 100644 index 000000000..10f388cf6 --- /dev/null +++ b/keyboards/z150_blackheart/z150_blackheart.c @@ -0,0 +1 @@ +#include "z150_blackheart.h" diff --git a/keyboards/z150_blackheart/z150_blackheart.h b/keyboards/z150_blackheart/z150_blackheart.h new file mode 100644 index 000000000..baf187fd2 --- /dev/null +++ b/keyboards/z150_blackheart/z150_blackheart.h @@ -0,0 +1,34 @@ +#ifndef z150_blackheart_H +#define z150_blackheart_H + +#include "quantum.h" + +#define LAYOUT( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015, K016, K017, K019, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116, K117, K118, K119, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, K216, K217, K218, \ + K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, K316, K317, K318, \ + K400, K401, K402, K403, K407, K414, K415, K417 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015, K016, K017, KC_NO, K019 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116, K117, K118, K119 }, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO, K215, K216, K217, K218, KC_NO }, \ + { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, K316, K317, K318, KC_NO }, \ + { K400, K401, K402, K403, KC_NO, KC_NO, KC_NO, K407, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, K414, K415, KC_NO, K417, KC_NO, KC_NO } \ +} + +#define LAYOUT_z150_tkl( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015, K017, K018, K019, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K117, K118, K119, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K216, K217, K218, \ + K300, K301, K302, K405, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K316, K317, K318, \ + K400, K401, K402, K403, K404, K407, K412, K413, K414, K415, K416, K417, K418 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015, KC_NO, K017, K018, K019 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, KC_NO, K117, K118, K119 }, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, KC_NO, K216, K217, K218, KC_NO }, \ + { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, KC_NO, K316, K317, K318, KC_NO }, \ + { K400, K401, K402, K403, K404, K405, KC_NO, K407, KC_NO, KC_NO, KC_NO, KC_NO, K412, K413, K414, K415, K416, K417, K418, KC_NO } \ +} + +#endif \ No newline at end of file From 78ef62764bfba2b7cb1fb34e477953c16c7a926d Mon Sep 17 00:00:00 2001 From: Christon DeWan Date: Fri, 31 Aug 2018 11:28:14 -0400 Subject: [PATCH 032/788] Keymap: I got my intern a KBParadise V60 Type R... (#3813) * new mode for v60 xtonhasvim. still working on it: - need to get indicator lights going - and fun layer properly fleshed out. * status lighting, proper fun layer copied fun layout from keycaps to maximize accessibility * enable power return * support brightness adjustment for indicators * refined brightness setting. is saved in eeprom now * readme. and fixed tilde * more modifiers fall through fun layer * i mean, this kinda works.. * much more reliable way of restoring lights * responded to feedback --- .../v60_type_r/keymaps/xtonhasvim/config.h | 24 +++ .../v60_type_r/keymaps/xtonhasvim/keymap.c | 196 ++++++++++++++++++ .../v60_type_r/keymaps/xtonhasvim/readme.md | 20 ++ .../v60_type_r/keymaps/xtonhasvim/rules.mk | 5 + keyboards/v60_type_r/rules.mk | 2 +- users/xtonhasvim/fancylighting.c | 7 +- users/xtonhasvim/fancylighting.h | 9 +- users/xtonhasvim/xtonhasvim.h | 6 +- 8 files changed, 259 insertions(+), 10 deletions(-) create mode 100644 keyboards/v60_type_r/keymaps/xtonhasvim/config.h create mode 100644 keyboards/v60_type_r/keymaps/xtonhasvim/keymap.c create mode 100644 keyboards/v60_type_r/keymaps/xtonhasvim/readme.md create mode 100644 keyboards/v60_type_r/keymaps/xtonhasvim/rules.mk diff --git a/keyboards/v60_type_r/keymaps/xtonhasvim/config.h b/keyboards/v60_type_r/keymaps/xtonhasvim/config.h new file mode 100644 index 000000000..997802a56 --- /dev/null +++ b/keyboards/v60_type_r/keymaps/xtonhasvim/config.h @@ -0,0 +1,24 @@ +/* Copyright 2018 Christon DeWan (Xton) + * + * 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 . + */ + + +#pragma once + +#define V60_POLESTAR + +#define PERMISSIVE_HOLD + + diff --git a/keyboards/v60_type_r/keymaps/xtonhasvim/keymap.c b/keyboards/v60_type_r/keymaps/xtonhasvim/keymap.c new file mode 100644 index 000000000..ec337bb22 --- /dev/null +++ b/keyboards/v60_type_r/keymaps/xtonhasvim/keymap.c @@ -0,0 +1,196 @@ +/* Copyright 2018 Christon DeWan (Xton) + * + * 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 . + */ +#include QMK_KEYBOARD_H + +#include "xtonhasvim.h" +#include "fancylighting.h" + +#define _______ KC_TRNS +#define X_____X KC_NO + +enum layers { + _QWERTY, + _FUN, + _MOVE, + _CMD +}; + +enum layout_key_codes { + IND_BRI = VIM_SAFE_RANGE, + IND_DIM +}; + +extern uint8_t vim_cmd_layer(void) { return _CMD; } + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_QWERTY] = LAYOUT_all( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, X_____X, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \ + LT(_MOVE, KC_CAPS), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ + KC_LSFT, X_____X, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, X_____X, \ + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT, VIM_START, MO(_FUN)), + + + [_MOVE] = LAYOUT_all( + X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, + X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, KC_HOME, KC_PGDN, KC_PGUP, KC_END, X_____X, X_____X, X_____X, X_____X, + _______, X_____X, LGUI(KC_LBRC), LGUI(LSFT(KC_LBRC)), LGUI(LSFT(KC_RBRC)), LGUI(KC_RBRC), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, X_____X, X_____X, VIM_START, + _______, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, _______, + _______, _______, _______, _______, _______, _______, _______, _______), + + + [_FUN] = LAYOUT_all( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, X_____X, KC_DEL, \ + X_____X, X_____X, KC_UP, RGB_TOG, IND_BRI, X_____X, X_____X, X_____X, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, X_____X, KC_INS, \ + X_____X, KC_LEFT, KC_DOWN, KC_RIGHT, IND_DIM, X_____X, X_____X, X_____X, KC_HOME, KC_PGUP, KC_LEFT, KC_RIGHT, FIREY_RETURN, \ + _______, X_____X, BL_INC, BL_STEP, BL_DEC, X_____X, KC_VOLD, KC_VOLU, KC_MUTE, KC_END, KC_PGDN, KC_DOWN, _______, X_____X, \ + _______, _______, _______, X_____X, _______, _______, X_____X, _______ + ), + + [_CMD] = LAYOUT_all( + VIM_ESC, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, + X_____X, X_____X, VIM_W, VIM_E, X_____X, X_____X, VIM_Y, VIM_U, VIM_I, VIM_O, VIM_P, X_____X, X_____X, X_____X, + _______, VIM_A, VIM_S, VIM_D, X_____X, VIM_G, VIM_H, VIM_J, VIM_K, VIM_L, X_____X, X_____X, X_____X, + VIM_SHIFT, X_____X, X_____X, VIM_X, VIM_C, VIM_V, VIM_B, X_____X, X_____X, VIM_COMMA, VIM_PERIOD, X_____X, VIM_SHIFT,X_____X, + _______, _______, _______, _______, _______, _______, _______, TO(_QWERTY) + ) +}; + + +void led_set_user(uint8_t usb_led) { + if (usb_led & (1<event.pressed) { + switch(keycode) { + case IND_BRI: + if (rgblight_config.val + RGBLIGHT_VAL_STEP > RGBLIGHT_LIMIT_VAL) { + rgblight_config.val = RGBLIGHT_LIMIT_VAL; + } else { + rgblight_config.val = rgblight_config.val + RGBLIGHT_VAL_STEP; + } + eeconfig_update_rgblight(rgblight_config.raw); + set_state_leds(); + break; + case IND_DIM: + if (rgblight_config.val - RGBLIGHT_VAL_STEP < RGBLIGHT_BASE_VAL) { + rgblight_config.val = RGBLIGHT_BASE_VAL; + } else { + rgblight_config.val = rgblight_config.val - RGBLIGHT_VAL_STEP; + } + eeconfig_update_rgblight(rgblight_config.raw); + set_state_leds(); + break; + } + } + return true; +} + +void suspend_power_down_user(void) +{ + // rgb + rgblight_config.enable = false; + rgblight_set(); + + // backlight + /** I don't know why, but 3 means "off" and down is up */ + backlight_config.level = 3; + backlight_config.enable = false; + backlight_set(3); +} + +void suspend_wakeup_init_user(void) +{ + rgblight_config.raw = eeconfig_read_rgblight(); + backlight_config.raw = eeconfig_read_backlight(); + + backlight_set(backlight_config.level); + rgblight_set(); +} + diff --git a/keyboards/v60_type_r/keymaps/xtonhasvim/readme.md b/keyboards/v60_type_r/keymaps/xtonhasvim/readme.md new file mode 100644 index 000000000..541faed2b --- /dev/null +++ b/keyboards/v60_type_r/keymaps/xtonhasvim/readme.md @@ -0,0 +1,20 @@ +KB Paradise V60 Type R Xton Has Vim! Layout +====================== + +If you don't look closely, this layout mimics the default layout fairly well. Care +is taken to match the FN layer to the keycaps that the TypeR comes with. I wrote this layout +for a keyboard that I'm giving my intern as a parting gift and wanted it to be as easy to learn +as possible. + +The key differences: + +- Holding capslock down activates the movement layer, much like the vimouse layout except that I'm using the xtonhasvim movement layer. +- Capslock+return (or right-control) activates vim mode! + +## Keymap Notes + +- Alternate underglow modes are not supported. Instead the underglow is used to indicate state. It can be turned off and dimmed. Polestar underglow LEDs are not individually addressable, sadly. + +### Build + +To build this keymap, simply run `make v60_type_r:xtonhasvim` from the root project directory. Flash using QMK Toolbox diff --git a/keyboards/v60_type_r/keymaps/xtonhasvim/rules.mk b/keyboards/v60_type_r/keymaps/xtonhasvim/rules.mk new file mode 100644 index 000000000..6f9d7cc39 --- /dev/null +++ b/keyboards/v60_type_r/keymaps/xtonhasvim/rules.mk @@ -0,0 +1,5 @@ +BACKLIGHT_ENABLE = yes +RGBLIGHT_ENABLE = yes +MOUSEKEY_ENABLE = no +CONSOLE_ENABLE = no # Console for debug(+400) +DEBUG_ENABLE = no diff --git a/keyboards/v60_type_r/rules.mk b/keyboards/v60_type_r/rules.mk index afd65cd1a..30038d562 100644 --- a/keyboards/v60_type_r/rules.mk +++ b/keyboards/v60_type_r/rules.mk @@ -68,4 +68,4 @@ BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID AUDIO_ENABLE ?= no # Audio output on port C6 FAUXCLICKY_ENABLE ?= no # Use buzzer to emulate clicky switches -LAYOUTS = 60_ansi \ No newline at end of file +LAYOUTS = 60_ansi diff --git a/users/xtonhasvim/fancylighting.c b/users/xtonhasvim/fancylighting.c index f4af5ec55..dc13df03f 100644 --- a/users/xtonhasvim/fancylighting.c +++ b/users/xtonhasvim/fancylighting.c @@ -34,9 +34,14 @@ void matrix_scan_keymap(void) { #define FADE_BACK_TIME 500 #define BREATH_FIRE_TIME 1000 #define ANIMATION_STEP_INTERVAL 20 + +#if RGBLED_NUM >= 2 #define POWER_KEY_OFFSET (RGBLED_NUM / 2) #define SPACE_OFFSET_MAX (RGBLED_NUM / 2) - +#else +#define POWER_KEY_OFFSET 1 +#define SPACE_OFFSET_MAX 1 +#endif uint16_t effect_start_timer = 0; uint8_t user_rgb_mode = 0; diff --git a/users/xtonhasvim/fancylighting.h b/users/xtonhasvim/fancylighting.h index 982010d3d..02fb58b84 100644 --- a/users/xtonhasvim/fancylighting.h +++ b/users/xtonhasvim/fancylighting.h @@ -1,4 +1,4 @@ -p /* Copyright 2015-2017 Christon DeWan +/* Copyright 2015-2017 Christon DeWan * * 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 @@ -20,16 +20,17 @@ p /* Copyright 2015-2017 Christon DeWan #include "xtonhasvim.h" + extern uint8_t user_rgb_mode; extern LED_TYPE shadowed_led[]; -void start_firey_return(void); -#endif //_fancy_lighting_h +#endif //RGBLIGHT_ENABLE +void start_firey_return(void); enum xtonhasvim_rgbmodes { BREATH_FIRE = 1, FADE_BACK }; -#endif //RGBLIGHT_ENABLE +#endif //_fancy_lighting_h diff --git a/users/xtonhasvim/xtonhasvim.h b/users/xtonhasvim/xtonhasvim.h index 5ff4932a4..2d6670a5e 100644 --- a/users/xtonhasvim/xtonhasvim.h +++ b/users/xtonhasvim/xtonhasvim.h @@ -22,11 +22,9 @@ #define X_____X KC_NO -bool process_record_xtonhasvim(uint16_t keycode, keyrecord_t *record); - enum xtonhasvim_keycodes { - DUMMY = SAFE_RANGE, - FIREY_RETURN, // kick off special effects + // 20: give keyboard-specific codes some room + FIREY_RETURN = SAFE_RANGE + 20, // kick off special effects VIM_START, // bookend for vim states VIM_A, VIM_B, From c51b2266a06aeac767c41e6f0f8054db531a156f Mon Sep 17 00:00:00 2001 From: rschardt <42609861+rschardt@users.noreply.github.com> Date: Fri, 31 Aug 2018 17:44:15 +0200 Subject: [PATCH 033/788] Keymap: Adding adnw_puq-Layout for Ergodox (#3723) * added adnw_p_u_q-Layout * changed link * 3723 - outsource definitions to config.h * added TAPPING_TERM * changed defines and added colors * removed debug- and action_layer-Header --- layouts/community/ergodox/adnw_p_u_q/config.h | 9 + layouts/community/ergodox/adnw_p_u_q/keymap.c | 335 ++++++++++++++++++ .../community/ergodox/adnw_p_u_q/readme.md | 17 + .../community/ergodox/adnw_p_u_q/visualizer.c | 34 ++ 4 files changed, 395 insertions(+) create mode 100644 layouts/community/ergodox/adnw_p_u_q/config.h create mode 100644 layouts/community/ergodox/adnw_p_u_q/keymap.c create mode 100644 layouts/community/ergodox/adnw_p_u_q/readme.md create mode 100644 layouts/community/ergodox/adnw_p_u_q/visualizer.c diff --git a/layouts/community/ergodox/adnw_p_u_q/config.h b/layouts/community/ergodox/adnw_p_u_q/config.h new file mode 100644 index 000000000..b1170aa78 --- /dev/null +++ b/layouts/community/ergodox/adnw_p_u_q/config.h @@ -0,0 +1,9 @@ +#pragma once + +// This is the ideal value for me but find your own +#undef TAPPING_TERM +#define TAPPING_TERM 145 + +// more options here: https://docs.qmk.fm/config_options.html +#define FORCE_NKRO +#define PERMISSIVE_HOLD // tab/hold-Keys should work better with that diff --git a/layouts/community/ergodox/adnw_p_u_q/keymap.c b/layouts/community/ergodox/adnw_p_u_q/keymap.c new file mode 100644 index 000000000..a90fcbc2c --- /dev/null +++ b/layouts/community/ergodox/adnw_p_u_q/keymap.c @@ -0,0 +1,335 @@ +#include QMK_KEYBOARD_H +#include "keymap_german.h" + + +#define BASE 0 // default layer / VIM +#define ARW 1 // arrow layer / Terminal +#define DIAK 2 // diakritika layer +#define BRACK 3 // brackets layer +#define SYMBOLS 4 // symbols +#define MEDIA 5 // media keys / Mouse-Navigation + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Keymap 0: Basic layer / VIM + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | 1 | 2 | 3 | 4 | 5 | | | | 6 | 7 | 8 | 9 | 0 | Media | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | P | U | Dia-L| , | Q | | | | V | C | L | M | B | | + * |--------+------+------+------+------+------| G | | gg |------+------+------+------+------+--------| + * | Symbols| H | I | E | A | O |------| |------| D | T | R | N | S | ARW | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | LShift | K | Y | . | ' | X |str-D | |str-U | J | G | Z | W | F | RShift | + * * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | Ctrl | Alt | | | | | H | J | K | L | Ctrl | + * `----------------------------------' `----------------------------------' + * LShift is Tab on Click + * + * ,-------------. ,-------------. + * | ^ | / | | ? | $ | + * ,------|------|------| |------+--------+------. + * | | |str+a | |str+c | | | + * | Brack| Space|------| |------| Enter |BSpace| + * | -Lay |/shift| Tab/ | | | | | + * | | | GUI | | ESC | | | + * `--------------------' `----------------------' + * GUI is one shot + * str + a is for tmux etc. + * str + c is for stopping programs + */ +[BASE] = LAYOUT_ergodox( // layer 0 : default + // left hand + KC_NO, KC_1, KC_2, KC_3, KC_4, KC_5, KC_NO, + TG(SYMBOLS), DE_P, DE_U, OSL(DIAK), DE_COMM, DE_Q, LSFT(DE_G), + OSL(SYMBOLS), DE_H, DE_I, DE_E, DE_A, DE_O, + SFT_T(KC_TAB), DE_K, DE_Y, DE_DOT, DE_QUOT, DE_X, LCTL(DE_D), + KC_LCTRL, KC_LALT, KC_NO, KC_NO, KC_NO, + + + // left hand thumb-cluster + DE_CIRC, DE_SLSH, + LCTL(DE_A), + OSL(BRACK), SFT_T(KC_SPACE), GUI_T(KC_TAB), + + + // right hand + KC_NO, KC_6, KC_7, KC_8, KC_9, KC_0, TG(MEDIA), + DE_G, DE_V, DE_C, DE_L, DE_M, DE_B, KC_NO, + DE_D, DE_T, DE_R, DE_N, DE_S, TG(ARW), + LCTL(DE_U), DE_J, DE_G, DE_Z, DE_W, DE_F, KC_RSFT, + KC_H, KC_J, KC_K, KC_L, KC_RCTRL, + + // right thumb-cluster + DE_QST, DE_DLR, + LCTL(DE_C), + KC_ESCAPE, KC_ENTER, KC_BSPACE +), + + +/* Keymap 1: Arrow Layer / Terminal + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | |------| |------| | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | |P-Down| |P-Up | | | | | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | Left | Bot | Top | Right| | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | Home | | | | End | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// Arrows +[ARW] = LAYOUT_ergodox( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGDOWN, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_HOME, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + + // right hand + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_PGUP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_TRNS, + KC_TRNS, KC_END, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), + + +/* Keymap 2: Diakritika Layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | Ü | | | | | | | | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | Ä | Ö |------| |------| | | | | ß | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | | | | | | | | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// Diakritika +[DIAK] = LAYOUT_ergodox( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, DE_UE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, DE_AE, DE_OE, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + + // right hand + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, DE_SS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), + + +/* Keymap 3: Brackets Layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | ( | { | [ | |------| |------| | ] | } | ) | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | | | | | | | | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// BRACK +[BRACK] = LAYOUT_ergodox( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, DE_LPRN, DE_LCBR, DE_LBRC, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + + // right hand + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, DE_RBRC, DE_RCBR, DE_RPRN, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), + + +/* Keymap 4: Symbol Layer + * + * + * Original: + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | ² | ° | ~ | @ | ! | | | | ? | & | § | " | ³ | | + * |--------+------+------+------+------+------| ( | | ) |------+------+------+------+------+--------| + * | | ´ | ' | : | ^ | < |------| |------| > | $ | ; | | | ` | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | € | + | = | * | / | { | | } | \ | % | # | - | _ | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + */ +// SYMBOLS +[SYMBOLS] = LAYOUT_ergodox( + // left hand + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, //DE_LBRC, + KC_TRNS,DE_SQ2, DE_RING, DE_TILD, DE_AT, DE_EXLM, DE_LPRN, + KC_TRNS,DE_ACUT,DE_QUOT, DE_COLN, DE_CIRC, DE_LESS, + KC_TRNS,DE_EURO,DE_PLUS, DE_EQL, DE_ASTR, DE_SLSH, DE_LCBR, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS, + + // right hand + //DE_RBRC, + KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, + DE_RPRN, DE_QST, DE_AMPR, DE_PARA, DE_DQOT, DE_SQ3, KC_TRNS, + DE_MORE, DE_DLR, DE_SCLN, DE_PIPE, DE_GRV, KC_TRNS, + DE_RCBR, DE_BSLS, DE_PERC, DE_HASH, DE_MINS, DE_UNDS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), + +/* Keymap 5: Numbers + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | | | | Num | / | * | - | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | | | | | | | | | | 7 | 8 | 9 | + | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | |------| |------| | | 4 | 5 | 6 | + | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | | | | | | 1 | 2 | 3 | Enter | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | 0 | , | | | Enter| + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' +// NUMBERS +[NUMBERS] = LAYOUT_ergodox( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + + // right hand + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_7, KC_8, KC_9, KC_TRNS, + KC_TRNS, KC_TRNS, KC_4, KC_5, KC_8, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_1, KC_2, KC_3, KC_TRNS, + KC_0, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), + + +*/ + +/* Keymap 6: Media and mouse keys + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | Sleep| | | | | | | | | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | Wake | | | | |------| |------| |MsLeft|MsDown| MsUp |MsRght| | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | | | | | | | | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | Mute| VolDn| VolUp| | Play| Prev | Next | Stop | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | Lclk|------| |------|Rclk | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// MEDIA AND MOUSE +[MEDIA] = LAYOUT_ergodox( + KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_TRNS, KC_SLEP, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_TRNS, KC_WAKE, KC_NO, KC_NO, KC_NO, KC_TRNS, + KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_BTN1, KC_TRNS, + // right hand + KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, + KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, + KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, KC_TRNS, + KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, + KC_MPLY, KC_MPRV, KC_MNXT, KC_MSTP, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_BTN2, KC_TRNS +), +}; + +// Runs constantly in the background, in a loop. +void matrix_scan_user_keyboard(void) { + ergodox_board_led_on(); + ergodox_led_all_on(); +} diff --git a/layouts/community/ergodox/adnw_p_u_q/readme.md b/layouts/community/ergodox/adnw_p_u_q/readme.md new file mode 100644 index 000000000..dc914a0aa --- /dev/null +++ b/layouts/community/ergodox/adnw_p_u_q/readme.md @@ -0,0 +1,17 @@ +This is a fork of the adnw_k_o_y-Layout + +Features: +- Diakritika-Layer for ADNW-PUQ-Layout +- all basic-symbols of the german-layout can be found in the Symbol- and Diakritika-Layer +- Symbol-Layer: Symbols are mirrored -- left = < and right = > +- Basic-Layer-Keys which always be present in any Layer and allow the movement between layers +- HJKL-Keys and Arrow-Keys can be switched, necessary for working with a terminal and vim +- Number-Layer for Numpad-Emulation +- Brackets-Layer for easier programming +- Media-Layer for Mouse-Navigation + +Notes: +- adnw is a layout optimised for usage with german and english language +- PUQ is a variant of adnw: http://www.adnw.de/index.php?n=Main.OptimierungF%C3%BCrDieGeradeTastaturMitDaumen-Shift +- This implementation is optimised for my workflow with vim/tmux/xmonad and ergodox +- The OS must use the de_DE layout diff --git a/layouts/community/ergodox/adnw_p_u_q/visualizer.c b/layouts/community/ergodox/adnw_p_u_q/visualizer.c new file mode 100644 index 000000000..9a4d48538 --- /dev/null +++ b/layouts/community/ergodox/adnw_p_u_q/visualizer.c @@ -0,0 +1,34 @@ +/* +Note: this is a modified copy of ../default/visualizer.c, originally licensed GPL. +*/ + +#include "simple_visualizer.h" + +// This function should be implemented by the keymap visualizer +// Don't change anything else than state->target_lcd_color and state->layer_text as that's the only thing +// that the simple_visualizer assumes that you are updating +// Also make sure that the buffer passed to state->layer_text remains valid until the previous animation is +// stopped. This can be done by either double buffering it or by using constant strings +static void get_visualizer_layer_and_color(visualizer_state_t* state) { + + if (state->status.layer & 0x20) { + state->target_lcd_color = LCD_COLOR(127, 0xFF, 0xFF); + state->layer_text = "Mouse"; + } else if (state->status.layer & 0x10) { + state->target_lcd_color = LCD_COLOR(85, 0xFF, 0xFF); + state->layer_text = "Symbol"; + } else if (state->status.layer & 0x8) { + state->target_lcd_color = LCD_COLOR(64, 0xFF, 0xFF); + state->layer_text = "Brackets"; + } else if (state->status.layer & 0x4) { + state->target_lcd_color = LCD_COLOR(42, 0xFF, 0xFF); + state->layer_text = "Diak"; + } else if (state->status.layer & 0x2) { + state->target_lcd_color = LCD_COLOR(21, 0xFF, 0xFF); + state->layer_text = "Terminal"; + } else { + state->target_lcd_color = LCD_COLOR(192, 0xFF, 0xFF); + state->layer_text = "Vim"; + } +} + From acc06a0848380fbeb2688d18bc19fee07797046c Mon Sep 17 00:00:00 2001 From: Danny Date: Fri, 31 Aug 2018 14:13:55 -0400 Subject: [PATCH 034/788] Keyboard: Add Tragicforce 68 (#3807) * Fork MF68 to Tragicforce 68 * Set pinouts and key layout * Reformat keymap, update comments/notes * Cleanup rules.mk --- keyboards/tragicforce68/README.md | 18 +++++ keyboards/tragicforce68/config.h | 69 +++++++++++++++++++ keyboards/tragicforce68/info.json | 12 ++++ .../tragicforce68/keymaps/default/keymap.c | 34 +++++++++ keyboards/tragicforce68/rules.mk | 26 +++++++ keyboards/tragicforce68/tragicforce68.c | 8 +++ keyboards/tragicforce68/tragicforce68.h | 56 +++++++++++++++ 7 files changed, 223 insertions(+) create mode 100644 keyboards/tragicforce68/README.md create mode 100644 keyboards/tragicforce68/config.h create mode 100644 keyboards/tragicforce68/info.json create mode 100644 keyboards/tragicforce68/keymaps/default/keymap.c create mode 100644 keyboards/tragicforce68/rules.mk create mode 100644 keyboards/tragicforce68/tragicforce68.c create mode 100644 keyboards/tragicforce68/tragicforce68.h diff --git a/keyboards/tragicforce68/README.md b/keyboards/tragicforce68/README.md new file mode 100644 index 000000000..c7a6cc77d --- /dev/null +++ b/keyboards/tragicforce68/README.md @@ -0,0 +1,18 @@ +Tragicforce 68 +=============== + +Magicforce 68 with [Tragicforce 68 replacement PCB](https://keeb.io/products/mf68-magicforce-68-pcb-replacement-kit) from Keebio. + +Keyboard Maintainer: [Keebio](https://keeb.io) +Hardware Supported: Pro Micro +Hardware Availability: [Keebio](https://keeb.io) + +Make example for this keyboard (after setting up your build environment): + + make tragicforce68:default + +Example of flashing this keyboard: + + make tragicforce68:default:avrdude + +See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. diff --git a/keyboards/tragicforce68/config.h b/keyboards/tragicforce68/config.h new file mode 100644 index 000000000..9afdca614 --- /dev/null +++ b/keyboards/tragicforce68/config.h @@ -0,0 +1,69 @@ +/* +Copyright 2012 Jun Wako + +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 . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xCEEB +#define PRODUCT_ID 0x0510 +#define DEVICE_VER 0x0101 +#define MANUFACTURER Keebio +#define PRODUCT Tragicforce 68 +#define DESCRIPTION Programmable PCB replacement for Magicforce 68 + +/* key matrix size */ +#define MATRIX_ROWS 9 +#define MATRIX_COLS 8 + +/* + * 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 { D3, D2, D1, D0, B4, E6, C6, D7, D4 } +#define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3, B2, B6 } +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +#define BACKLIGHT_PIN B5 +#define BACKLIGHT_BREATHING +#define BACKLIGHT_LEVELS 7 + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* 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 + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +#endif diff --git a/keyboards/tragicforce68/info.json b/keyboards/tragicforce68/info.json new file mode 100644 index 000000000..f3e3d6ada --- /dev/null +++ b/keyboards/tragicforce68/info.json @@ -0,0 +1,12 @@ +{ + "keyboard_name": "Tragicforce 68", + "url": "https://keeb.io", + "maintainer": "Keebio", + "width": 17.25, + "height": 5, + "layouts": { + "LAYOUT": { + "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"x":15.25, "y":0}, {"x":16.25, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"x":15.25, "y":1}, {"x":16.25, "y":1}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"x":15.25, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"x":14.25, "y":4}, {"x":15.25, "y":4}, {"x":16.25, "y":4}] + } + } +} diff --git a/keyboards/tragicforce68/keymaps/default/keymap.c b/keyboards/tragicforce68/keymaps/default/keymap.c new file mode 100644 index 000000000..69255e080 --- /dev/null +++ b/keyboards/tragicforce68/keymaps/default/keymap.c @@ -0,0 +1,34 @@ +#include QMK_KEYBOARD_H + +#define _QWERTY 0 +#define _FN1 1 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_QWERTY] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────────────┐ ┌────────┬────────┐ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_PGUP, + //├────────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────────────┤ ├────────┼────────┤ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_PGDN, + //├────────────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴────────────┤ └────────┴────────┘ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENTER, + //├──────────────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───────────────────┤ ┌────────┐ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, + //├──────────┬───────┴──┬─────┴────┬───┴────────┴────────┴────────┴────────┴────────┴──────┬─┴────────┼────────┴─┬──────────┬────┬──────┴─┬────────┼────────┐ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPACE, MO(_FN1), KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + //└──────────┴──────────┴──────────┴───────────────────────────────────────────────────────┴──────────┴──────────┴──────────┘ └────────┴────────┴────────┘ + ), + + [_FN1] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────────────┐ ┌────────┬────────┐ + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, KC_HOME, + //├────────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────────────┤ ├────────┼────────┤ + _______, _______, KC_UP, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUS, BL_STEP, KC_BSLS, _______, KC_END, + //├────────────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴────────────┤ └────────┴────────┘ + _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, KC_HOME, KC_QUOT, KC_ENTER, + //├──────────────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───────────────────┤ ┌────────┐ + _______, _______, KC_MPLY, KC_MSTP, KC_MPRV, KC_MNXT, KC_VOLD, KC_VOLU, KC_MUTE, _______, KC_END, _______, BL_INC, + //├──────────┬───────┴──┬─────┴────┬───┴────────┴────────┴────────┴────────┴────────┴──────┬─┴────────┼────────┴─┬──────────┬────┬──────┴─┬────────┼────────┐ + _______, _______, _______, _______, _______, _______, KC_MENU, BL_BRTG, BL_DEC, BL_TOGG + //└──────────┴──────────┴──────────┴───────────────────────────────────────────────────────┴──────────┴──────────┴──────────┘ └────────┴────────┴────────┘ + ) +}; diff --git a/keyboards/tragicforce68/rules.mk b/keyboards/tragicforce68/rules.mk new file mode 100644 index 000000000..a652f1fac --- /dev/null +++ b/keyboards/tragicforce68/rules.mk @@ -0,0 +1,26 @@ +MCU = atmega32u4 +F_CPU = 16000000 +ARCH = AVR8 +F_USB = $(F_CPU) +BOOTLOADER = caterina + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = no # USB Nkey Rollover +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default +MIDI_ENABLE = no # MIDI controls +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 diff --git a/keyboards/tragicforce68/tragicforce68.c b/keyboards/tragicforce68/tragicforce68.c new file mode 100644 index 000000000..327197d25 --- /dev/null +++ b/keyboards/tragicforce68/tragicforce68.c @@ -0,0 +1,8 @@ +#include "tragicforce68.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} diff --git a/keyboards/tragicforce68/tragicforce68.h b/keyboards/tragicforce68/tragicforce68.h new file mode 100644 index 000000000..e1b2a038d --- /dev/null +++ b/keyboards/tragicforce68/tragicforce68.h @@ -0,0 +1,56 @@ +#pragma once + +#include "quantum.h" + +#define LAYOUT( \ + A1, A2, A3, A4, A5, A6, A7, A8, E1, E2, E3, E4, E5, E6, E7, E8, \ + B1, B2, B3, B4, B5, B6, B7, B8, F1, F2, F3, F4, F5, F6, F7, F8, \ + C1, C2, C3, C4, C5, C6, C7, C8, G1, G2, G3, G4, G5, \ + D1, D2, D3, D4, D5, D6, D7, D8, H1, H2, H3, H4, H5, \ + J1, J2, J3, J5, J7, J8, H6, G6, G7, G8 \ +) { \ + { A1, A2, A3, A4, A5, A6, A7, A8 }, \ + { B1, B2, B3, B4, B5, B6, B7, B8 }, \ + { C1, C2, C3, C4, C5, C6, C7, C8 }, \ + { D1, D2, D3, D4, D5, D6, D7, D8 }, \ + { E1, E2, E3, E4, E5, E6, E7, E8 }, \ + { F1, F2, F3, F4, F5, F6, F7, F8 }, \ + { G1, G2, G3, G4, G5, G6, G7, G8 }, \ + { H1, H2, H3, H4, H5, H6, KC_NO, KC_NO }, \ + { J1, J2, J3, KC_NO, J5, KC_NO, J7, J8 } \ +} + +#define LAYOUT_split_space( \ + A1, A2, A3, A4, A5, A6, A7, A8, E1, E2, E3, E4, E5, E6, E7, E8, \ + B1, B2, B3, B4, B5, B6, B7, B8, F1, F2, F3, F4, F5, F6, F7, F8, \ + C1, C2, C3, C4, C5, C6, C7, C8, G1, G2, G3, G4, G5, \ + D1, D2, D3, D4, D5, D6, D7, D8, H1, H2, H3, H4, H5, \ + J1, J2, J3, J4, J5, J6, J7, J8, H6, G6, G7, G8 \ +) { \ + { A1, A2, A3, A4, A5, A6, A7, A8 }, \ + { B1, B2, B3, B4, B5, B6, B7, B8 }, \ + { C1, C2, C3, C4, C5, C6, C7, C8 }, \ + { D1, D2, D3, D4, D5, D6, D7, D8 }, \ + { E1, E2, E3, E4, E5, E6, E7, E8 }, \ + { F1, F2, F3, F4, F5, F6, F7, F8 }, \ + { G1, G2, G3, G4, G5, G6, G7, G8 }, \ + { H1, H2, H3, H4, H5, H6, KC_NO, KC_NO }, \ + { J1, J2, J3, J4, J5, J6, J7, J8 } \ +} + +#define LAYOUT_kc( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K10, K11, K12, K13, K14, K15, K16, \ + K17, K18, K20, K21, K22, K23, K24, K25, K26, K27, K28, K30, K31, K32, K33, K34, \ + K35, K36, K37, K38, K40, K41, K42, K43, K44, K45, K46, K47, K48, \ + K50, K51, K52, K53, K54, K55, K56, K57, K58, K60, K61, K62, K63, \ + K64, K65, K66, K67, K68, K70, K71, K72, K73, K74 \ +) LAYOUT( \ + KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, \ + KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, \ + KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27, KC_##K28, \ + KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, KC_##K38, \ + KC_##K40, KC_##K41, KC_##K42, KC_##K43, KC_##K44, KC_##K45, KC_##K46, KC_##K47, KC_##K48, \ + KC_##K50, KC_##K51, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57, KC_##K58, \ + KC_##K60, KC_##K61, KC_##K62, KC_##K63, KC_##K64, KC_##K65, KC_##K66, KC_##K67, KC_##K68, \ + KC_##K70, KC_##K71, KC_##K72, KC_##K73, KC_##K74 \ +) From fb79015049ebd1309cd4f69a7584db614f50d1db Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Fri, 31 Aug 2018 14:49:18 -0700 Subject: [PATCH 035/788] Keymap: Merlin Learns to QMK (#3820) * Fix up my keymaps to use more QMK features * update 60_ansi readme * add the start of my userspace * begin to use my new userspace * use more of my userspace * spread userspace love to my clueboard * spread userspace love to 75 layout * add a fairly vanilla readme * put the FNX into a userspace incase I ever want to use it for something else * respond to drashna's code review comments --- .../60_ansi/mechmerlin-ansi/keymap.c | 38 +++---------------- .../60_ansi/mechmerlin-ansi/readme.md | 4 +- .../60_ansi/mechmerlin-ansi/rules.mk | 1 + .../mechmerlin-split/keymap.c | 17 ++++----- .../mechmerlin-split/rules.mk | 1 + layouts/community/66_ansi/mechmerlin/keymap.c | 15 ++------ layouts/community/66_ansi/mechmerlin/rules.mk | 1 + .../75_ansi/mechmerlin-75_ansi/keymap.c | 12 +++--- .../75_ansi/mechmerlin-75_ansi/rules.mk | 1 + users/mechmerlin/mechmerlin.c | 20 ++++++++++ users/mechmerlin/mechmerlin.h | 17 +++++++++ users/mechmerlin/readme.md | 3 ++ users/mechmerlin/rules.mk | 1 + 13 files changed, 68 insertions(+), 63 deletions(-) create mode 100644 layouts/community/60_ansi/mechmerlin-ansi/rules.mk create mode 100644 layouts/community/60_ansi_split_bs_rshift/mechmerlin-split/rules.mk create mode 100644 layouts/community/66_ansi/mechmerlin/rules.mk create mode 100644 layouts/community/75_ansi/mechmerlin-75_ansi/rules.mk create mode 100644 users/mechmerlin/mechmerlin.c create mode 100644 users/mechmerlin/mechmerlin.h create mode 100644 users/mechmerlin/readme.md create mode 100644 users/mechmerlin/rules.mk diff --git a/layouts/community/60_ansi/mechmerlin-ansi/keymap.c b/layouts/community/60_ansi/mechmerlin-ansi/keymap.c index 47316915c..e48fddea4 100644 --- a/layouts/community/60_ansi/mechmerlin-ansi/keymap.c +++ b/layouts/community/60_ansi/mechmerlin-ansi/keymap.c @@ -1,29 +1,22 @@ #include QMK_KEYBOARD_H - -#define BASE 0 -#define FN 1 -#define ARROWS 2 - -enum keycodes { - KC_FNX, // Hold for FN layer, tap to toggle ARROWS layer. -}; +#include "mechmerlin.h" const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[BASE] = LAYOUT_60_ansi( +[_BL] = LAYOUT_60_ansi( KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLASH, \ - KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ + KC_CTCP, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \ KC_LCTL, KC_LGUI, KC_LALT, KC_SPACE, KC_FNX, KC_RALT, KC_RGUI, KC_RCTL), -[FN] = LAYOUT_60_ansi( +[_FL] = LAYOUT_60_ansi( KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, \ RGB_TOG, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), -[ARROWS] = LAYOUT_60_ansi( +[_AL] = LAYOUT_60_ansi( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ @@ -31,22 +24,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT) }; - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - static uint16_t fnx_layer_timer; - - switch (keycode){ - case KC_FNX: - if(record->event.pressed){ - fnx_layer_timer = timer_read(); - layer_on(FN); - } else { - layer_off(FN); - if (timer_elapsed(fnx_layer_timer) < 150) { - layer_invert(ARROWS); - } - } - return false; - } - return true; -} \ No newline at end of file diff --git a/layouts/community/60_ansi/mechmerlin-ansi/readme.md b/layouts/community/60_ansi/mechmerlin-ansi/readme.md index c81a126d5..1c40def2a 100644 --- a/layouts/community/60_ansi/mechmerlin-ansi/readme.md +++ b/layouts/community/60_ansi/mechmerlin-ansi/readme.md @@ -10,8 +10,8 @@ It is used on his [NPKC KC60](https://github.com/qmk/qmk_firmware/tree/master/keyboards/kc60) ## Keymap Notes -- Highly influenced by the KBP V60 and WKL B.Face standard layouts -- Arrow toggle switch is FN + Space +- Arrow toggle switch is tapping the `FN` key once. +- `Caps Lock` can be held to act as a `Left Control` ### Build To build the firmware file associated with this keymap, simply run `make your_keyboard:mechmerlin-ansi`. diff --git a/layouts/community/60_ansi/mechmerlin-ansi/rules.mk b/layouts/community/60_ansi/mechmerlin-ansi/rules.mk new file mode 100644 index 000000000..e2ce3d773 --- /dev/null +++ b/layouts/community/60_ansi/mechmerlin-ansi/rules.mk @@ -0,0 +1 @@ +USER_NAME := mechmerlin \ No newline at end of file diff --git a/layouts/community/60_ansi_split_bs_rshift/mechmerlin-split/keymap.c b/layouts/community/60_ansi_split_bs_rshift/mechmerlin-split/keymap.c index 4c6458c9b..5ec005162 100644 --- a/layouts/community/60_ansi_split_bs_rshift/mechmerlin-split/keymap.c +++ b/layouts/community/60_ansi_split_bs_rshift/mechmerlin-split/keymap.c @@ -1,25 +1,22 @@ #include QMK_KEYBOARD_H - -#define BASE 0 -#define FN 1 -#define ARROWS 2 +#include "mechmerlin.h" const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[BASE] = LAYOUT_60_ansi_split_bs_rshift( +[_BL] = LAYOUT_60_ansi_split_bs_rshift( KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_NO, KC_BSPC, \ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLASH, \ - KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ + KC_CTCP, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, TG(2), \ KC_LCTL, KC_LGUI, KC_LALT, KC_SPACE, MO(1), KC_RALT, KC_RGUI, KC_RCTL), -[FN] = LAYOUT_60_ansi_split_bs_rshift( - KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NO, KC_DEL, \ +[_FL] = LAYOUT_60_ansi_split_bs_rshift( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NO, KC_DEL, \ RGB_TOG, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), -[ARROWS] = LAYOUT_60_ansi_split_bs_rshift( +[_AL] = LAYOUT_60_ansi_split_bs_rshift( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ diff --git a/layouts/community/60_ansi_split_bs_rshift/mechmerlin-split/rules.mk b/layouts/community/60_ansi_split_bs_rshift/mechmerlin-split/rules.mk new file mode 100644 index 000000000..e2ce3d773 --- /dev/null +++ b/layouts/community/60_ansi_split_bs_rshift/mechmerlin-split/rules.mk @@ -0,0 +1 @@ +USER_NAME := mechmerlin \ No newline at end of file diff --git a/layouts/community/66_ansi/mechmerlin/keymap.c b/layouts/community/66_ansi/mechmerlin/keymap.c index b8142f967..ea2e923b1 100644 --- a/layouts/community/66_ansi/mechmerlin/keymap.c +++ b/layouts/community/66_ansi/mechmerlin/keymap.c @@ -1,32 +1,23 @@ #include QMK_KEYBOARD_H +#include "mechmerlin.h" -// Each layer gets a name for readability, which is then used in the keymap matrix below. -// The underscores don't mean anything - you can have a layer called STUFF or any other name. -#define _BL 0 -#define _FL 1 #define _CL 2 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* Keymap _BL: Base Layer (Default Layer) - */ [_BL] = LAYOUT_66_ansi( KC_GESC,KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL, KC_BSPC, KC_PGUP, \ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC,KC_BSLS, KC_PGDN, \ - KC_LCTL,KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_ENT, \ + KC_CTCP,KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_ENT, \ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT, KC_UP, \ KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, MO(_FL),KC_RGUI,KC_RCTL,KC_LEFT,KC_DOWN,KC_RGHT), - /* Keymap _FL: Function Layer - */ [_FL] = LAYOUT_66_ansi( KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_VOLU, \ _______,_______,_______,_______,_______,_______,_______,_______,_______,KC_MPRV,KC_MPLY,KC_MNXT,_______,KC_MUTE, KC_VOLD, \ - KC_CAPS,_______,MO(_CL),_______,_______,_______,_______,_______,_______,_______,_______,_______, _______, \ + _______,_______,MO(_CL),_______,_______,_______,_______,_______,_______,_______,_______,_______, _______, \ _______, _______,_______,_______,_______,_______,_______,KC_MUTE,KC_VOLU,KC_VOLD,_______, _______, KC_PGUP, \ _______,_______,_______, _______, _______,_______,_______,KC_HOME,KC_PGDN,KC_END), - /* Keymap _CL: Control layer - */ [_CL] = LAYOUT_66_ansi( BL_STEP,RGB_M_P,RGB_M_B,RGB_M_R,RGB_M_SW,RGB_M_SN,RGB_M_K,RGB_M_X,RGB_M_G,_______,_______,_______,_______, _______, RGB_VAI, \ RGB_TOG,_______,_______,_______,RESET, _______,_______,_______,_______,_______,_______,_______,_______,_______, RGB_VAD, \ diff --git a/layouts/community/66_ansi/mechmerlin/rules.mk b/layouts/community/66_ansi/mechmerlin/rules.mk new file mode 100644 index 000000000..e2ce3d773 --- /dev/null +++ b/layouts/community/66_ansi/mechmerlin/rules.mk @@ -0,0 +1 @@ +USER_NAME := mechmerlin \ No newline at end of file diff --git a/layouts/community/75_ansi/mechmerlin-75_ansi/keymap.c b/layouts/community/75_ansi/mechmerlin-75_ansi/keymap.c index 70506da52..ec3286b09 100644 --- a/layouts/community/75_ansi/mechmerlin-75_ansi/keymap.c +++ b/layouts/community/75_ansi/mechmerlin-75_ansi/keymap.c @@ -1,23 +1,21 @@ #include QMK_KEYBOARD_H - -#define BASE 0 -#define FN 1 +#include "mechmerlin.h" const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[BASE] = LAYOUT_75_ansi(\ +[_BL] = LAYOUT_75_ansi(\ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_PAUS, KC_DEL, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_HOME, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP, - KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN, + KC_CTCP, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), -[FN] = LAYOUT_75_ansi(\ +[_FL] = LAYOUT_75_ansi(\ KC_TRNS, RGB_TOG, RGB_MOD, RGB_VAI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) }; \ No newline at end of file diff --git a/layouts/community/75_ansi/mechmerlin-75_ansi/rules.mk b/layouts/community/75_ansi/mechmerlin-75_ansi/rules.mk new file mode 100644 index 000000000..e2ce3d773 --- /dev/null +++ b/layouts/community/75_ansi/mechmerlin-75_ansi/rules.mk @@ -0,0 +1 @@ +USER_NAME := mechmerlin \ No newline at end of file diff --git a/users/mechmerlin/mechmerlin.c b/users/mechmerlin/mechmerlin.c new file mode 100644 index 000000000..8d6cecd18 --- /dev/null +++ b/users/mechmerlin/mechmerlin.c @@ -0,0 +1,20 @@ +#include "mechmerlin.h" + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + static uint16_t fnx_layer_timer; + + switch (keycode){ + case KC_FNX: + if(record->event.pressed){ + fnx_layer_timer = timer_read(); + layer_on(_FL); + } else { + layer_off(_FL); + if (timer_elapsed(fnx_layer_timer) < 150) { + layer_invert(_AL); + } + } + return false; + } + return true; +} \ No newline at end of file diff --git a/users/mechmerlin/mechmerlin.h b/users/mechmerlin/mechmerlin.h new file mode 100644 index 000000000..c140ac70c --- /dev/null +++ b/users/mechmerlin/mechmerlin.h @@ -0,0 +1,17 @@ +#pragma once + +#include "quantum.h" + +enum userspace_layers { + _BL = 0, // Base Layer + _FL, // Function Layer + _AL // Arrow Layer +}; + +// Enum of custom keycodes defined in process_record_user +enum keycodes { + KC_FNX, // Hold for FN layer, tap to toggle ARROWS layer. +}; + +// Custom #defined keycodes +#define KC_CTCP MT(KC_LCTL, KC_CAPS) diff --git a/users/mechmerlin/readme.md b/users/mechmerlin/readme.md new file mode 100644 index 000000000..6a76dd2a9 --- /dev/null +++ b/users/mechmerlin/readme.md @@ -0,0 +1,3 @@ +# MechMerlin's Userspace + +This is a collection of my most commonly used QMK functions diff --git a/users/mechmerlin/rules.mk b/users/mechmerlin/rules.mk new file mode 100644 index 000000000..70c20ec71 --- /dev/null +++ b/users/mechmerlin/rules.mk @@ -0,0 +1 @@ +SRC += mechmerlin.c \ No newline at end of file From 2aa27f0c78871ebea58559bb847d97d09de01078 Mon Sep 17 00:00:00 2001 From: patrickmt <40182064+patrickmt@users.noreply.github.com> Date: Sat, 1 Sep 2018 12:21:48 -0400 Subject: [PATCH 036/788] Keyboard: Rename alt67 to alt (#3824) Renamed keyboard alt67 to alt and adjusted necessary files where alt67 appeared. CTRL keymap fixed enum structure name. usb2422 removed stray define no longer used. --- keyboards/massdrop/{alt67/alt67.h => alt/alt.h} | 0 keyboards/massdrop/{alt67 => alt}/config.h | 2 +- keyboards/massdrop/{alt67 => alt}/config_led.h | 0 keyboards/massdrop/{alt67 => alt}/info.json | 0 keyboards/massdrop/{alt67 => alt}/keymaps/default/keymap.c | 2 +- keyboards/massdrop/{alt67 => alt}/led_programs.c | 2 +- keyboards/massdrop/{alt67 => alt}/matrix.c | 2 +- keyboards/massdrop/{alt67 => alt}/matrix.h | 0 keyboards/massdrop/{alt67 => alt}/readme.md | 6 +++--- keyboards/massdrop/{alt67 => alt}/rules.mk | 0 keyboards/massdrop/ctrl/keymaps/default/keymap.c | 2 +- tmk_core/protocol/arm_atsam/usb/usb2422.h | 1 - 12 files changed, 8 insertions(+), 9 deletions(-) rename keyboards/massdrop/{alt67/alt67.h => alt/alt.h} (100%) rename keyboards/massdrop/{alt67 => alt}/config.h (98%) rename keyboards/massdrop/{alt67 => alt}/config_led.h (100%) rename keyboards/massdrop/{alt67 => alt}/info.json (100%) rename keyboards/massdrop/{alt67 => alt}/keymaps/default/keymap.c (99%) rename keyboards/massdrop/{alt67 => alt}/led_programs.c (99%) rename keyboards/massdrop/{alt67 => alt}/matrix.c (99%) rename keyboards/massdrop/{alt67 => alt}/matrix.h (100%) rename keyboards/massdrop/{alt67 => alt}/readme.md (83%) rename keyboards/massdrop/{alt67 => alt}/rules.mk (100%) diff --git a/keyboards/massdrop/alt67/alt67.h b/keyboards/massdrop/alt/alt.h similarity index 100% rename from keyboards/massdrop/alt67/alt67.h rename to keyboards/massdrop/alt/alt.h diff --git a/keyboards/massdrop/alt67/config.h b/keyboards/massdrop/alt/config.h similarity index 98% rename from keyboards/massdrop/alt67/config.h rename to keyboards/massdrop/alt/config.h index c67ae7d43..a486f34a0 100644 --- a/keyboards/massdrop/alt67/config.h +++ b/keyboards/massdrop/alt/config.h @@ -25,7 +25,7 @@ along with this program. If not, see . #define DEVICE_VER 0x0101 #define MANUFACTURER "Massdrop Inc." -#define PRODUCT "ALT67 Keyboard" +#define PRODUCT "ALT Keyboard" #define SERIAL_NUM "Unavailable" /* key matrix size */ diff --git a/keyboards/massdrop/alt67/config_led.h b/keyboards/massdrop/alt/config_led.h similarity index 100% rename from keyboards/massdrop/alt67/config_led.h rename to keyboards/massdrop/alt/config_led.h diff --git a/keyboards/massdrop/alt67/info.json b/keyboards/massdrop/alt/info.json similarity index 100% rename from keyboards/massdrop/alt67/info.json rename to keyboards/massdrop/alt/info.json diff --git a/keyboards/massdrop/alt67/keymaps/default/keymap.c b/keyboards/massdrop/alt/keymaps/default/keymap.c similarity index 99% rename from keyboards/massdrop/alt67/keymaps/default/keymap.c rename to keyboards/massdrop/alt/keymaps/default/keymap.c index b8d0b6c03..3f0b84e38 100644 --- a/keyboards/massdrop/alt67/keymaps/default/keymap.c +++ b/keyboards/massdrop/alt/keymaps/default/keymap.c @@ -1,6 +1,6 @@ #include QMK_KEYBOARD_H -enum alt67_keycodes { +enum alt_keycodes { L_BRI = SAFE_RANGE, //LED Brightness Increase L_BRD, //LED Brightness Decrease L_PTN, //LED Pattern Select Next diff --git a/keyboards/massdrop/alt67/led_programs.c b/keyboards/massdrop/alt/led_programs.c similarity index 99% rename from keyboards/massdrop/alt67/led_programs.c rename to keyboards/massdrop/alt/led_programs.c index a8aab28d9..b3b7a7e90 100644 --- a/keyboards/massdrop/alt67/led_programs.c +++ b/keyboards/massdrop/alt/led_programs.c @@ -15,7 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#include "alt67.h" +#include "alt.h" #include "led_matrix.h" //Teal <-> Salmon diff --git a/keyboards/massdrop/alt67/matrix.c b/keyboards/massdrop/alt/matrix.c similarity index 99% rename from keyboards/massdrop/alt67/matrix.c rename to keyboards/massdrop/alt/matrix.c index e107b4c22..75a4d62b9 100644 --- a/keyboards/massdrop/alt67/matrix.c +++ b/keyboards/massdrop/alt/matrix.c @@ -15,7 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#include "alt67.h" +#include "alt.h" #include "d51_util.h" #include "debug.h" diff --git a/keyboards/massdrop/alt67/matrix.h b/keyboards/massdrop/alt/matrix.h similarity index 100% rename from keyboards/massdrop/alt67/matrix.h rename to keyboards/massdrop/alt/matrix.h diff --git a/keyboards/massdrop/alt67/readme.md b/keyboards/massdrop/alt/readme.md similarity index 83% rename from keyboards/massdrop/alt67/readme.md rename to keyboards/massdrop/alt/readme.md index 551c10c20..57e2e5f17 100644 --- a/keyboards/massdrop/alt67/readme.md +++ b/keyboards/massdrop/alt/readme.md @@ -5,16 +5,16 @@ The Massdrop ALT is a 65% mechanical keyboard featuring dual USB-C connectors, an integrated Hi-Speed USB 2.0 hub, and fully customizable RGB backlighting and underlighting. Keyboard Maintainer: [Massdrop](https://github.com/massdrop) -Hardware Supported: Massdrop, Inc. ALT67 PCBs utilizing Microchip's ATSAMD51J18A MCU and USB2422 2-Port USB 2.0 Hi-Speed Hub Controller, and ISSI's IS31FL3733 LED Drivers. +Hardware Supported: Massdrop, Inc. ALT PCBs utilizing Microchip's ATSAMD51J18A MCU and USB2422 2-Port USB 2.0 Hi-Speed Hub Controller, and ISSI's IS31FL3733 LED Drivers. Hardware Availability: [Massdrop ALT Mechanical Keyboard](https://www.massdrop.com/buy/massdrop-alt-mechanical-keyboard) Make example for this keyboard (after setting up your build environment): - make massdrop/alt67:default + make massdrop/alt:default For information on flashing this keyboard, visit the following links: [Massdrop Loader Releases](https://github.com/Massdrop/mdloader/releases/tag/0.0.1) [Massdrop Loader Repository and Instructions](https://github.com/Massdrop/mdloader) -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). \ No newline at end of file +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). diff --git a/keyboards/massdrop/alt67/rules.mk b/keyboards/massdrop/alt/rules.mk similarity index 100% rename from keyboards/massdrop/alt67/rules.mk rename to keyboards/massdrop/alt/rules.mk diff --git a/keyboards/massdrop/ctrl/keymaps/default/keymap.c b/keyboards/massdrop/ctrl/keymaps/default/keymap.c index 8e84d4fee..ac58f336e 100644 --- a/keyboards/massdrop/ctrl/keymaps/default/keymap.c +++ b/keyboards/massdrop/ctrl/keymaps/default/keymap.c @@ -1,6 +1,6 @@ #include QMK_KEYBOARD_H -enum alt67_keycodes { +enum ctrl_keycodes { L_BRI = SAFE_RANGE, //LED Brightness Increase L_BRD, //LED Brightness Decrease L_PTN, //LED Pattern Select Next diff --git a/tmk_core/protocol/arm_atsam/usb/usb2422.h b/tmk_core/protocol/arm_atsam/usb/usb2422.h index 6c763dd8c..85ad596a6 100644 --- a/tmk_core/protocol/arm_atsam/usb/usb2422.h +++ b/tmk_core/protocol/arm_atsam/usb/usb2422.h @@ -18,7 +18,6 @@ along with this program. If not, see . #ifndef _USB2422_H_ #define _USB2422_H_ -#define USB2422_ALT67_1P0 #define REV_USB2422 0x100 #define USB2422_ADDR 0x58 //I2C device address, one instance From dedffb5f6dcf3519f787692aca69851cb4049708 Mon Sep 17 00:00:00 2001 From: Salt-Peanuts Date: Sat, 1 Sep 2018 12:22:21 -0400 Subject: [PATCH 037/788] Keymap: Cleaned up Rorschach keymap (#3823) --- .../keymaps/insertsnideremarks/keymap.c | 41 ------------------- 1 file changed, 41 deletions(-) diff --git a/keyboards/rorschach/keymaps/insertsnideremarks/keymap.c b/keyboards/rorschach/keymaps/insertsnideremarks/keymap.c index 5f4c26415..5d93e2f05 100644 --- a/keyboards/rorschach/keymaps/insertsnideremarks/keymap.c +++ b/keyboards/rorschach/keymaps/insertsnideremarks/keymap.c @@ -10,8 +10,6 @@ enum rorschach_layers { _FUNCTION, // Function _FUNCTION2, // Function 2 (identical as _FUNCTION; used to allow for easier use of space and backspace while using function layer arrows) _NUMPAD, // Numpad -// _COLEMAKGM, // Colemak gaming/vanilla (no dual-role keys with layer access) -// _QWERTYGM, // QWERTY gaming/vanilla (no dual-role keys with layer access) _ADJUST, // Adjust layer, accessed via tri-layer feature) _ADJUST2 // Second Adjust layer, accessed outside of tri-layer feature) }; @@ -19,8 +17,6 @@ enum rorschach_layers { enum rorschach_keycodes { COLEMAK = SAFE_RANGE, QWERTY, -// COLEMAKGM, -// QWERTYGM, NUMPAD = TG(_NUMPAD), ADJUST = MO(_ADJUST2), SPCFN = LT(_FUNCTION, KC_SPC), @@ -269,8 +265,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { layer_off ( _FUNCTION); layer_off ( _FUNCTION2); layer_off ( _NUMPAD); -// layer_off ( _COLEMAKGM); -// layer_off ( _QWERTYGM); layer_off ( _ADJUST); layer_off ( _ADJUST2); } @@ -285,46 +279,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { layer_off ( _FUNCTION); layer_off ( _FUNCTION2); layer_off ( _NUMPAD); -// layer_off ( _COLEMAKGM); -// layer_off ( _QWERTYGM); layer_off ( _ADJUST); layer_off ( _ADJUST2); } return false; break; -/* case COLEMAKGM: - if (record->event.pressed) { - default_layer_set(1UL << _COLEMAKGM); - layer_off ( _QWERTY); - layer_off ( _COLEMAK); - layer_off ( _NUMBERS); - layer_off ( _NUMBERS2); - layer_off ( _FUNCTION); - layer_off ( _FUNCTION2); - layer_off ( _NUMPAD); - layer_off ( _QWERTYGM); - layer_off ( _ADJUST); - layer_off ( _ADJUST2); - } - return false; - break; - case QWERTYGM: - if (record->event.pressed) { - default_layer_set(1UL << _QWERTYGM); - layer_off ( _QWERTY); - layer_off ( _COLEMAK); - layer_off ( _NUMBERS); - layer_off ( _NUMBERS2); - layer_off ( _FUNCTION); - layer_off ( _FUNCTION2); - layer_off ( _NUMPAD); - layer_off ( _COLEMAKGM); - layer_off ( _ADJUST); - layer_off ( _ADJUST2); - } - return false; - break; -*/ } return true; } \ No newline at end of file From 8eb674b257147efa4ba7829fb294254497aec7c6 Mon Sep 17 00:00:00 2001 From: Jon Olsson Date: Sat, 1 Sep 2018 18:23:10 +0200 Subject: [PATCH 038/788] Keymap: Nojjan atreus (#3822) * Add support for my Falbatech Atreus This is currently the default Atreus keyboard layout, but I will eventually customize it to match my Ergodox layout. * Address review comments * More review comments fixed * More review comments fixed --- keyboards/atreus/keymaps/nojjan/config.h | 10 ++++ keyboards/atreus/keymaps/nojjan/keymap.c | 61 ++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 keyboards/atreus/keymaps/nojjan/config.h create mode 100644 keyboards/atreus/keymaps/nojjan/keymap.c diff --git a/keyboards/atreus/keymaps/nojjan/config.h b/keyboards/atreus/keymaps/nojjan/config.h new file mode 100644 index 000000000..90b7c4a6c --- /dev/null +++ b/keyboards/atreus/keymaps/nojjan/config.h @@ -0,0 +1,10 @@ +#pragma once + +#undef MATRIX_ROW_PINS +#undef MATRIX_COL_PINS +#undef UNUSED_PINS + +// Pin configuration for falbatech atreus +#define MATRIX_ROW_PINS { D0, D1, D3, D2 } +#define MATRIX_COL_PINS { D7, C6, B5, B4, E6, D4, B6, F6, F7, D6, B7 } +#define UNUSED_PINS diff --git a/keyboards/atreus/keymaps/nojjan/keymap.c b/keyboards/atreus/keymaps/nojjan/keymap.c new file mode 100644 index 000000000..8f56e5746 --- /dev/null +++ b/keyboards/atreus/keymaps/nojjan/keymap.c @@ -0,0 +1,61 @@ +// this is the style you want to emulate. +// This is the canonical layout file for the Quantum project. If you want to add another keyboard, + +#include QMK_KEYBOARD_H + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QW 0 +#define _RS 1 +#define _LW 2 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[_QW] = LAYOUT( /* Qwerty */ + KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P , + KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN , + KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH , + KC_ESC, KC_TAB, KC_LGUI, KC_LSFT, KC_BSPC, KC_LCTL, KC_LALT, KC_SPC, MO(_RS), KC_MINS, KC_QUOT, KC_ENT ), +/* + * ! @ up { } || pgup 7 8 9 * + * # left down right $ || pgdn 4 5 6 + + * [ ] ( ) & || ` 1 2 3 \ + * lower insert super shift bksp ctrl || alt space fn . 0 = + */ +[_RS] = LAYOUT( /* [> RAISE <] */ + KC_EXLM, KC_AT, KC_UP, KC_LCBR, KC_RCBR, KC_PGUP, KC_7, KC_8, KC_9, KC_ASTR , + KC_HASH, KC_LEFT, KC_DOWN, KC_RGHT, KC_DLR, KC_PGDN, KC_4, KC_5, KC_6, KC_PLUS , + KC_LBRC, KC_RBRC, KC_LPRN, KC_RPRN, KC_AMPR, KC_GRV, KC_1, KC_2, KC_3, KC_BSLS , + TG(_LW), KC_INS, KC_LGUI, KC_LSFT, KC_BSPC, KC_LCTL, KC_LALT, KC_SPC, KC_TRNS, KC_DOT, KC_0, KC_EQL ), +/* + * insert home up end pgup || up F7 F8 F9 F10 + * del left down right pgdn || down F4 F5 F6 F11 + * volup reset || F1 F2 F3 F12 + * voldn super shift bksp ctrl || alt space L0 prtsc scroll pause + */ +[_LW] = LAYOUT( /* [> LOWER <] */ + KC_INS, KC_HOME, KC_UP, KC_END, KC_PGUP, KC_UP, KC_F7, KC_F8, KC_F9, KC_F10 , + KC_DELT, KC_LEFT, KC_DOWN, KC_RGHT, KC_DOWN, KC_DOWN, KC_F4, KC_F5, KC_F6, KC_F11 , + KC_NO, KC_VOLU, KC_NO, KC_NO, RESET, KC_NO, KC_F1, KC_F2, KC_F3, KC_F12 , + KC_NO, KC_VOLD, KC_LGUI, KC_LSFT, KC_BSPC, KC_LCTL, KC_LALT, KC_SPC, TO(_QW), KC_PSCR, KC_SLCK, KC_PAUS ) +}; + +const uint16_t PROGMEM fn_actions[] = { + +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; From ffc2dc0359ee3eee4eea8605082cfc210b1bc53d Mon Sep 17 00:00:00 2001 From: Yasuhiro Shimizu Date: Sun, 2 Sep 2018 01:38:29 +0900 Subject: [PATCH 039/788] Keymap: add yshrsmz keymaps (#3770) * add ergo42 keymap * add helix keymap * add keymap for lets_split * Add keymap for nyquist * update keymaps to address review comments - remove unneeded include - use `#pragma once` --- keyboards/ergo42/keymaps/yshrsmz/config.h | 36 ++ keyboards/ergo42/keymaps/yshrsmz/keymap.c | 166 ++++++ keyboards/ergo42/keymaps/yshrsmz/rules.mk | 4 + keyboards/helix/rev2/keymaps/yshrsmz/config.h | 23 + keyboards/helix/rev2/keymaps/yshrsmz/keymap.c | 558 ++++++++++++++++++ .../helix/rev2/keymaps/yshrsmz/readme.md | 25 + keyboards/helix/rev2/keymaps/yshrsmz/rules.mk | 121 ++++ keyboards/lets_split/keymaps/yshrsmz/config.h | 35 ++ keyboards/lets_split/keymaps/yshrsmz/keymap.c | 180 ++++++ keyboards/lets_split/keymaps/yshrsmz/rules.mk | 1 + keyboards/nyquist/keymaps/yshrsmz/config.h | 39 ++ keyboards/nyquist/keymaps/yshrsmz/keymap.c | 195 ++++++ keyboards/nyquist/keymaps/yshrsmz/rules.mk | 1 + 13 files changed, 1384 insertions(+) create mode 100644 keyboards/ergo42/keymaps/yshrsmz/config.h create mode 100644 keyboards/ergo42/keymaps/yshrsmz/keymap.c create mode 100644 keyboards/ergo42/keymaps/yshrsmz/rules.mk create mode 100644 keyboards/helix/rev2/keymaps/yshrsmz/config.h create mode 100644 keyboards/helix/rev2/keymaps/yshrsmz/keymap.c create mode 100644 keyboards/helix/rev2/keymaps/yshrsmz/readme.md create mode 100644 keyboards/helix/rev2/keymaps/yshrsmz/rules.mk create mode 100644 keyboards/lets_split/keymaps/yshrsmz/config.h create mode 100644 keyboards/lets_split/keymaps/yshrsmz/keymap.c create mode 100644 keyboards/lets_split/keymaps/yshrsmz/rules.mk create mode 100644 keyboards/nyquist/keymaps/yshrsmz/config.h create mode 100644 keyboards/nyquist/keymaps/yshrsmz/keymap.c create mode 100644 keyboards/nyquist/keymaps/yshrsmz/rules.mk diff --git a/keyboards/ergo42/keymaps/yshrsmz/config.h b/keyboards/ergo42/keymaps/yshrsmz/config.h new file mode 100644 index 000000000..1892ef652 --- /dev/null +++ b/keyboards/ergo42/keymaps/yshrsmz/config.h @@ -0,0 +1,36 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#pragma once + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + +/* auto shift config */ +#define AUTO_SHIFT_TIMEOUT 150 + diff --git a/keyboards/ergo42/keymaps/yshrsmz/keymap.c b/keyboards/ergo42/keymaps/yshrsmz/keymap.c new file mode 100644 index 000000000..a4a83a2e1 --- /dev/null +++ b/keyboards/ergo42/keymaps/yshrsmz/keymap.c @@ -0,0 +1,166 @@ +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +#define _BASE 0 +#define _META 1 +#define _SYMB 2 +#define _GAME 3 + + +enum custom_keycodes { + BASE = SAFE_RANGE, + META, + SYMB, + GAME, + EISU, + KANA +}; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* BASE + * ,------------------------------------------------. ,------------------------------------------------. + * | = | Q | W | E | R | T | [ | | ] | Y | U | I | O | P | - | + * |------+------+------+------+------+------+------| |-------------+------+------+------+------+------| + * | Tab | A | S | D | F | G | ( | | ) | H | J | K | L | ; | ' | + * |------+------+------+------+------+------+------| |------|------+------+------+------+------+------| + * | Sft | Z | X | C | V | B | { | | } | N | M | , | . | / |\/Sft | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | EISU | Ctrl | Alt | GUI | ESC/ |Del |Back | |Enter |Space | META | GUI |=>GAME|=>SYMB| KANA | + * | | | | | SYMB | |Space | | | | | | | | | + * `------------------------------------------------' `------------------------------------------------' + */ + +[_BASE] = LAYOUT( \ + KC_EQL, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LBRC, KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS, \ + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_LPRN, KC_RPRN, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LCBR, KC_RCBR, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_BSLS, \ + EISU, KC_LCTRL, KC_LALT, KC_LGUI, LT(_SYMB, KC_ESC),KC_DEL, KC_BSPC, KC_ENT, KC_SPC, META, KC_LGUI, TG(_GAME), TG(_SYMB), KANA \ +), + +/* META + * ,------------------------------------------------. ,------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | | | | 6 | 7 | 8 | 9 | 0 | | + * |------+------+------+------+------+------+------| |-------------+------+------+------+------+------| + * | | F1 | F2 | F3 | F4 | F5 | F6 | | | Left | Down | Up |Right | PgUp | | + * |------+------+------+------+------+------+------| |------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | | | Home | End |Alt+← |Alt+→ | PgDn | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | | | | | | | | |Reset | | | | + * | | | | | | | | | | | | | | | | + * `------------------------------------------------' `------------------------------------------------' + */ + +[_META] = LAYOUT( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, _______, _______, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, \ + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_PGUP, _______, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_HOME, KC_END, LALT(KC_LEFT), LALT(KC_RGHT), KC_PGDN, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET, _______, _______, _______ \ +), + +/* SYMB + * ,------------------------------------------------. ,------------------------------------------------. + * | ~ | ! | @ | # | $ | % | | | | ^ | & | * | ( | ) | - | + * |------+------+------+------+------+------+------| |-------------+------+------+------+------+------| + * | | F1 | F2 | F3 | F4 | F5 | F6 | | | Left | Down | Up |Right | PgUp | | + * |------+------+------+------+------+------+------| |------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | | | Home | End |Alt+← |Alt+→ | PgDn | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | | | | | | | | |Reset | | | | + * | | | | | | | | | | | | | | | | + * `------------------------------------------------' `------------------------------------------------' + */ + +[_SYMB] = LAYOUT( \ + KC_TILD, S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), _______, _______, S(KC_6), S(KC_7), S(KC_8), S(KC_9), S(KC_0), _______, \ + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_PGUP, _______, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_HOME, KC_END, LALT(KC_LEFT), LALT(KC_RGHT), KC_PGDN, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET, _______, _______, _______ \ +), + +/* GAME + * ,------------------------------------------------. ,------------------------------------------------. + * | Tab | Q | W | E | R | T | [ | | ] | Y | U | I | O | P | @ | + * |------+------+------+------+------+------+------| |-------------+------+------+------+------+------| + * | Alt | A | S | D | F | G | ( | | ) | H | J | K | L | ; | : | + * |------+------+------+------+------+------+------| |------|------+------+------+------+------+------| + * | Sft | Z | X | C | V | B | { | | } | N | M | , | . | / |\/Sft | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | Ctrl | GUI | App |PrtSc | ESC |Space |Tab | |Back |Enter | Del |PrtSc |=>GAME|=>SYMB| \ | + * | | | | | | | | |Space | | | | | | | + * `------------------------------------------------' `------------------------------------------------' + */ +[_GAME] = LAYOUT( \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_RBRC, KC_BSLS, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, \ + KC_LALT, KC_A, KC_S, KC_D, KC_F, KC_G, S(KC_8), S(KC_9), KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, S(KC_RBRC), S(KC_BSLS), KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_RO), \ + KC_LCTRL, KC_LGUI, KC_APP, KC_PSCR, KC_ESC, KC_SPC, KC_TAB, KC_BSPC, KC_ENT, KC_DELT, KC_PSCR, _______, _______, KC_JYEN \ +) + +}; + +void persistent_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case BASE: + if (record->event.pressed) { + persistent_default_layer_set(1UL<<_BASE); + } + return false; + break; + case META: + if (record->event.pressed) { + layer_on(_META); + update_tri_layer(_META, _SYMB, _GAME); + } else { + layer_off(_META); + update_tri_layer(_META, _SYMB, _GAME); + } + return false; + break; + case SYMB: + if (record->event.pressed) { + layer_on(_SYMB); + update_tri_layer(_META, _SYMB, _GAME); + } else { + layer_off(_SYMB); + update_tri_layer(_META, _SYMB, _GAME); + } + return false; + break; + case GAME: + if (record->event.pressed) { + layer_on(_GAME); + } else { + layer_off(_GAME); + } + return false; + break; + case EISU: + if (record->event.pressed) { + register_code(KC_LANG2); + } else { + unregister_code(KC_LANG2); + } + return false; + break; + case KANA: + if (record->event.pressed) { + register_code(KC_LANG1); + } else { + unregister_code(KC_LANG1); + } + return false; + break; + } + return true; +} diff --git a/keyboards/ergo42/keymaps/yshrsmz/rules.mk b/keyboards/ergo42/keymaps/yshrsmz/rules.mk new file mode 100644 index 000000000..a779882fa --- /dev/null +++ b/keyboards/ergo42/keymaps/yshrsmz/rules.mk @@ -0,0 +1,4 @@ +RGBLIGHT_ENABLE = no +BACKLIGHT_ENABLE = no + +AUTO_SHIFT_ENABLE = yes diff --git a/keyboards/helix/rev2/keymaps/yshrsmz/config.h b/keyboards/helix/rev2/keymaps/yshrsmz/config.h new file mode 100644 index 000000000..a1cd126ee --- /dev/null +++ b/keyboards/helix/rev2/keymaps/yshrsmz/config.h @@ -0,0 +1,23 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ +#pragma once + +/* auto shift config */ +#define AUTO_SHIFT_TIMEOUT 150 diff --git a/keyboards/helix/rev2/keymaps/yshrsmz/keymap.c b/keyboards/helix/rev2/keymaps/yshrsmz/keymap.c new file mode 100644 index 000000000..cce28796e --- /dev/null +++ b/keyboards/helix/rev2/keymaps/yshrsmz/keymap.c @@ -0,0 +1,558 @@ +#include QMK_KEYBOARD_H +#include "bootloader.h" +#ifdef PROTOCOL_LUFA +#include "lufa.h" +#include "split_util.h" +#endif +#ifdef AUDIO_ENABLE + #include "audio.h" +#endif +#ifdef SSD1306OLED + #include "ssd1306.h" +#endif + +extern keymap_config_t keymap_config; + +#ifdef RGBLIGHT_ENABLE +//Following line allows macro to read current RGB settings +extern rgblight_config_t rgblight_config; +#endif + +extern uint8_t is_master; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +enum layer_number { + _QWERTY = 0, + _LOWER, + _RAISE, + _FUNC, + _ADJUST +}; + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + LOWER, + RAISE, + FUNC, + ADJUST, + EISU, + KANA +}; + +enum macro_keycodes { + KC_SAMPLEMACRO, +}; + + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO +//Macros +#define M_SAMPLE M(KC_SAMPLEMACRO) + +#if HELIX_ROWS == 5 +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* Qwerty + * ,-----------------------------------------. ,-----------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | = | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | Q | W | E | R | T | | Y | U | I | O | P | - | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | ESC | A | S | D | F | G | | H | J | K | L | ; | ' | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * |Shift | Z | X | C | V | B | Fn | Fn | N | M | , | . | / |Shift | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | EISU | Ctrl | Alt | GUI |Lower |Space | Bksp |Enter |Space |Raise | GUI | Alt | Ctrl | KANA | + * `-------------------------------------------------------------------------------------------------' + */ + [_QWERTY] = LAYOUT( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_EQL, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS, \ + KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, FUNC, FUNC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ + EISU, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_BSPC, KC_ENT, KC_SPC, RAISE, KC_RGUI, KC_RALT, KC_RCTL, KANA \ + ), + + /* Lower + * ,-----------------------------------------. ,-----------------------------------------. + * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | | F6 | _ | + | { | } | | | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | | | F12 | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | Next | Vol- | Vol+ | Play | + * `-------------------------------------------------------------------------------------------------' + */ + [_LOWER] = LAYOUT( \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, _______, _______, KC_F12, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ + ), + + /* Raise + * ,-----------------------------------------. ,-----------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | | | F12 | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | Next | Vol- | Vol+ | Play | + * `-------------------------------------------------------------------------------------------------' + */ + [_RAISE] = LAYOUT( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, _______, _______, KC_F12, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ + ), + + /* Func + * ,-----------------------------------------. ,-----------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | LEFT | DOWN | UP |RIGHT | PGUP | | + * |------+------+------+------+------+------|------+------|------+------+------+------+------+------| + * | | | | | | | | | HOME | END |Alt+← |Alt+→ | PGDN | | + * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| + * | | | | | | | | | | | Next | Vol- | Vol+ | Play | + * `-------------------------------------------------------------------------------------------------' + */ + [_FUNC] = LAYOUT( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \ + _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_PGUP, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_END, LALT(KC_LEFT), LALT(KC_RGHT), KC_PGDN, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ + ), + + /* Adjust (Lower + Raise) + * ,-----------------------------------------. ,-----------------------------------------. + * | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | Reset| | | | | | | | | | | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | |Aud on|Audoff| Mac | | Win |Qwerty| | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | |RGB ON| HUE+ | SAT+ | VAL+ | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | MODE | HUE- | SAT- | VAL- | + * `-------------------------------------------------------------------------------------------------' + */ + [_ADJUST] = LAYOUT( \ + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ + _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ + _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SMOD,RGB_HUD, RGB_SAD, RGB_VAD \ + ) +}; + +#elif HELIX_ROWS == 4 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* Qwerty + * ,-----------------------------------------. ,-----------------------------------------. + * | = | Q | W | E | R | T | | Y | U | I | O | P | - | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Esc | A | S | D | F | G | | H | J | K | L | ; | ' | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| + * | EISU | Ctrl | Alt | GUI |ESC/Lower | Func | Bksp |Enter |Space |Raise | GUI | Alt | Ctrl | KANA | + * `-------------------------------------------------------------------------------------------------' + */ + [_QWERTY] = LAYOUT( \ + KC_EQL, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS, \ + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ + EISU, KC_LCTL, KC_LALT, KC_LGUI, LT(_LOWER, KC_ESC), FUNC, KC_BSPC, KC_ENT, KC_SPC, RAISE, KC_RGUI, KC_RALT, KC_RCTL, KANA \ + ), + + /* Lower + * ,-----------------------------------------. ,-----------------------------------------. + * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | | F6 | _ | + | { | } | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | | F12 | | | | | | + * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| + * | | | | | | | | | | | Next | Vol- | Vol+ | Play | + * `-------------------------------------------------------------------------------------------------' + */ + [_LOWER] = LAYOUT( \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ + ), + + /* Raise + * ,-----------------------------------------. ,-----------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | | F12 | | | | | | + * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| + * | | | | | | | | | | | Next | Vol- | Vol+ | Play | + * `-------------------------------------------------------------------------------------------------' + */ + [_RAISE] = LAYOUT( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ + ), + + /* Func + * ,-----------------------------------------. ,-----------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | LEFT | DOWN | UP |RIGHT | PGUP | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | HOME | END |Alt+← |Alt+→ | PGDN | | + * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| + * | | | | | | | | | | | Next | Vol- | Vol+ | Play | + * `-------------------------------------------------------------------------------------------------' + */ + [_FUNC] = LAYOUT( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \ + _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_PGUP, _______, \ + _______, _______, _______, _______, _______, _______, KC_HOME, KC_END, LALT(KC_LEFT), LALT(KC_RGHT), KC_PGDN, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ + ), + + /* Adjust (Lower + Raise) + * ,-----------------------------------------. ,-----------------------------------------. + * | | Reset| | | | | | | | | | | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | |Aud on|Audoff| Mac | | Win |Qwerty| | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | |RGB ON| HUE+ | SAT+ | VAL+ | + * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| + * | | | | | | | | | | | MODE | HUE- | SAT- | VAL- | + * `-------------------------------------------------------------------------------------------------' + */ + [_ADJUST] = LAYOUT( \ + _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ + _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SMOD,RGB_HUD, RGB_SAD, RGB_VAD \ + ) +}; + +#else +#error "undefined keymaps" +#endif + + +#ifdef AUDIO_ENABLE + +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +float tone_dvorak[][2] = SONG(DVORAK_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); +float tone_plover[][2] = SONG(PLOVER_SOUND); +float tone_plover_gb[][2] = SONG(PLOVER_GOODBYE_SOUND); +float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); +#endif + +// define variables for reactive RGB +bool TOG_STATUS = false; +int RGB_current_mode; + +void persistent_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +// Setting ADJUST layer RGB back to default +void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) { + if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) { + #ifdef RGBLIGHT_ENABLE + //rgblight_mode(RGB_current_mode); + #endif + layer_on(layer3); + } else { + layer_off(layer3); + } +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_qwerty); + #endif + persistent_default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + //not sure how to have keyboard check mode and set it to a variable, so my work around + //uses another variable that would be set to true after the first time a reactive key is pressed. + if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false + } else { + TOG_STATUS = !TOG_STATUS; + #ifdef RGBLIGHT_ENABLE + //rgblight_mode(16); + #endif + } + layer_on(_LOWER); + update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); + } else { + #ifdef RGBLIGHT_ENABLE + //rgblight_mode(RGB_current_mode); // revert RGB to initial mode prior to RGB mode change + #endif + TOG_STATUS = false; + layer_off(_LOWER); + update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + //not sure how to have keyboard check mode and set it to a variable, so my work around + //uses another variable that would be set to true after the first time a reactive key is pressed. + if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false + } else { + TOG_STATUS = !TOG_STATUS; + #ifdef RGBLIGHT_ENABLE + //rgblight_mode(15); + #endif + } + layer_on(_RAISE); + update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); + } else { + #ifdef RGBLIGHT_ENABLE + //rgblight_mode(RGB_current_mode); // revert RGB to initial mode prior to RGB mode change + #endif + layer_off(_RAISE); + TOG_STATUS = false; + update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case FUNC: + if (record->event.pressed) { + layer_on(_FUNC); + } else { + layer_off(_FUNC); + } + return false; + break; + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + break; + //led operations - RGB mode change now updates the RGB_current_mode to allow the right RGB mode to be set after reactive keys are released + case RGB_MOD: + #ifdef RGBLIGHT_ENABLE + if (record->event.pressed) { + rgblight_mode(RGB_current_mode); + rgblight_step(); + RGB_current_mode = rgblight_config.mode; + } + #endif + return false; + break; + case EISU: + if (record->event.pressed) { + if(keymap_config.swap_lalt_lgui==false){ + register_code(KC_LANG2); + }else{ + SEND_STRING(SS_LALT("`")); + } + } else { + unregister_code(KC_LANG2); + } + return false; + break; + case KANA: + if (record->event.pressed) { + if(keymap_config.swap_lalt_lgui==false){ + register_code(KC_LANG1); + }else{ + SEND_STRING(SS_LALT("`")); + } + } else { + unregister_code(KC_LANG1); + } + return false; + break; + } + return true; +} + +void matrix_init_user(void) { + #ifdef AUDIO_ENABLE + startup_user(); + #endif + #ifdef RGBLIGHT_ENABLE + RGB_current_mode = rgblight_config.mode; + #endif + //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h + #ifdef SSD1306OLED + iota_gfx_init(!has_usb()); // turns on the display + #endif +} + + +#ifdef AUDIO_ENABLE + +void startup_user() +{ + _delay_ms(20); // gets rid of tick +} + +void shutdown_user() +{ + _delay_ms(150); + stop_all_notes(); +} + +void music_on_user(void) +{ + music_scale_user(); +} + +void music_scale_user(void) +{ + PLAY_SONG(music_scale); +} + +#endif + + +//SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h +#ifdef SSD1306OLED + +// hook point for 'led_test' keymap +// 'default' keymap's led_test_init() is empty function, do nothing +// 'led_test' keymap's led_test_init() force rgblight_mode_noeeprom(35); +__attribute__ ((weak)) +void led_test_init(void) {} + +void matrix_scan_user(void) { + led_test_init(); + iota_gfx_task(); // this is what updates the display continuously +} + +void matrix_update(struct CharacterMatrix *dest, + const struct CharacterMatrix *source) { + if (memcmp(dest->display, source->display, sizeof(dest->display))) { + memcpy(dest->display, source->display, sizeof(dest->display)); + dest->dirty = true; + } +} + +//assign the right code to your layers for OLED display +#define L_BASE 0 +#define L_LOWER (1<<_LOWER) +#define L_RAISE (1<<_RAISE) +#define L_FUNC (1<<_FUNC) +#define L_ADJUST (1<<_ADJUST) +#define L_ADJUST_TRI (L_ADJUST|L_RAISE|L_LOWER) + +static void render_logo(struct CharacterMatrix *matrix) { + + static char logo[]={ + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94, + 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4, + 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4, + 0}; + matrix_write(matrix, logo); + //matrix_write_P(&matrix, PSTR(" Split keyboard kit")); +} + + + +void render_status(struct CharacterMatrix *matrix) { + + // Render to mode icon + static char logo[][2][3]={{{0x95,0x96,0},{0xb5,0xb6,0}},{{0x97,0x98,0},{0xb7,0xb8,0}}}; + if(keymap_config.swap_lalt_lgui==false){ + matrix_write(matrix, logo[0][0]); + matrix_write_P(matrix, PSTR("\n")); + matrix_write(matrix, logo[0][1]); + }else{ + matrix_write(matrix, logo[1][0]); + matrix_write_P(matrix, PSTR("\n")); + matrix_write(matrix, logo[1][1]); + } + + // Define layers here, Have not worked out how to have text displayed for each layer. Copy down the number you see and add a case for it below + char buf[40]; + snprintf(buf,sizeof(buf), "Undef-%ld", layer_state); + matrix_write_P(matrix, PSTR("\nLayer: ")); + switch (layer_state) { + case L_BASE: + matrix_write_P(matrix, PSTR("Default")); + break; + case L_RAISE: + matrix_write_P(matrix, PSTR("Raise")); + break; + case L_LOWER: + matrix_write_P(matrix, PSTR("Lower")); + break; + case L_FUNC: + matrix_write_P(matrix, PSTR("Func")); + break; + case L_ADJUST: + case L_ADJUST_TRI: + matrix_write_P(matrix, PSTR("Adjust")); + break; + default: + matrix_write(matrix, buf); + } + + // Host Keyboard LED Status + char led[40]; + snprintf(led, sizeof(led), "\n%s %s %s", + (host_keyboard_leds() & (1< helix:defualt +## option= oled | back | under | na | ios +## ex. +## make HELIX=oled helix:defualt +## make HELIX=oled,back helix:defualt +## make HELIX=oled,under helix:defualt +## make HELIX=oled,back,na helix:defualt +## make HELIX=oled,back,ios helix:defualt +## +ifneq ($(strip $(HELIX)),) + ifeq ($(findstring oled,$(HELIX)), oled) + OLED_ENABLE = yes + endif + ifeq ($(findstring back,$(HELIX)), back) + LED_BACK_ENABLE = yes + else ifeq ($(findstring under,$(HELIX)), under) + LED_UNDERGLOW_ENABLE = yes + endif + ifeq ($(findstring na,$(HELIX)), na) + LED_ANIMATIONS = no + endif + ifeq ($(findstring ios,$(HELIX)), ios) + IOS_DEVICE_ENABLE = yes + endif + $(eval $(call HELIX_CUSTOMISE_MSG)) + $(info ) +endif + +# Uncomment these for checking +# jp: コンパイル時にカスタマイズの状態を表示したい時はコメントをはずします。 +# $(eval $(call HELIX_CUSTOMISE_MSG)) +# $(info ) + +ifneq ($(strip $(HELIX_ROWS)), 4) + ifneq ($(strip $(HELIX_ROWS)), 5) + $(error HELIX_ROWS = $(strip $(HELIX_ROWS)) is unexpected value) + endif +endif +OPT_DEFS += -DHELIX_ROWS=$(strip $(HELIX_ROWS)) + +ifeq ($(strip $(LED_BACK_ENABLE)), yes) + RGBLIGHT_ENABLE = yes + OPT_DEFS += -DRGBLED_BACK + ifeq ($(strip $(LED_UNDERGLOW_ENABLE)), yes) + $(eval $(call HELIX_CUSTOMISE_MSG)) + $(error LED_BACK_ENABLE and LED_UNDERGLOW_ENABLE both 'yes') + endif +else ifeq ($(strip $(LED_UNDERGLOW_ENABLE)), yes) + RGBLIGHT_ENABLE = yes +else + RGBLIGHT_ENABLE = no +endif + +ifeq ($(strip $(IOS_DEVICE_ENABLE)), yes) + OPT_DEFS += -DIOS_DEVICE_ENABLE +endif + +ifeq ($(strip $(LED_ANIMATIONS)), yes) + OPT_DEFS += -DRGBLIGHT_ANIMATIONS +endif + +ifeq ($(strip $(OLED_ENABLE)), yes) + OPT_DEFS += -DOLED_ENABLE +endif + +ifeq ($(strip $(LOCAL_GLCDFONT)), yes) + OPT_DEFS += -DLOCAL_GLCDFONT +endif + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +AUTO_SHIFT_ENABLE = yes + +# Uncomment these for debugging +# $(info -- RGBLIGHT_ENABLE=$(RGBLIGHT_ENABLE)) +# $(info -- OPT_DEFS=$(OPT_DEFS)) +# $(info ) diff --git a/keyboards/lets_split/keymaps/yshrsmz/config.h b/keyboards/lets_split/keymaps/yshrsmz/config.h new file mode 100644 index 000000000..301f1ffc6 --- /dev/null +++ b/keyboards/lets_split/keymaps/yshrsmz/config.h @@ -0,0 +1,35 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#pragma once + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* auto shift config */ +#define AUTO_SHIFT_TIMEOUT 150 + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define _MASTER_RIGHT +// #define EE_HANDS diff --git a/keyboards/lets_split/keymaps/yshrsmz/keymap.c b/keyboards/lets_split/keymaps/yshrsmz/keymap.c new file mode 100644 index 000000000..52a0d2b83 --- /dev/null +++ b/keyboards/lets_split/keymaps/yshrsmz/keymap.c @@ -0,0 +1,180 @@ +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _LOWER 1 +#define _RAISE 2 +#define _FUNC 3 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + LOWER, + RAISE, + FUNC, + ADJUST, +}; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Y | U | I | O | P | - | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Fn | Ctrl | Alt | GUI |Lower | Bksp |Space |Raise | GUI |Shift |Adjust| Fn | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = LAYOUT_ortho_4x12( \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS, \ + KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, \ + FUNC, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_BSPC, KC_SPC, RAISE, KC_RGUI, KC_RSFT, ADJUST, FUNC \ +), + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT_ortho_4x12( \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ +), + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT_ortho_4x12( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ +), + +/* FUNC + * ,-----------------------------------------------------------------------------------. + * | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | F11 | F12 | | | | LEFT | DOWN | UP |RIGHT | PGUP | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | HOME | END |Alt+← |Alt+→ | PGDN | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_FUNC] = LAYOUT_ortho_4x12( \ + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_DEL, \ + _______, KC_F11, KC_F12, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_PGUP, _______, \ + _______, _______, _______, _______, _______, _______, KC_HOME, KC_END, LALT(KC_LEFT), LALT(KC_RGHT), KC_PGDN, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | Reset| | | | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty| | | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = LAYOUT_ortho_4x12( \ + _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ + _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ +) + + +}; + +#ifdef AUDIO_ENABLE +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +#endif + +void persistent_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_qwerty); + #endif + persistent_default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case FUNC: + if (record->event.pressed) { + layer_on(_FUNC); + } else { + layer_off(_FUNC); + } + return false; + break; + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + break; + } + return true; +} diff --git a/keyboards/lets_split/keymaps/yshrsmz/rules.mk b/keyboards/lets_split/keymaps/yshrsmz/rules.mk new file mode 100644 index 000000000..c9383ab8d --- /dev/null +++ b/keyboards/lets_split/keymaps/yshrsmz/rules.mk @@ -0,0 +1 @@ +AUTO_SHIFT_ENABLE = yes diff --git a/keyboards/nyquist/keymaps/yshrsmz/config.h b/keyboards/nyquist/keymaps/yshrsmz/config.h new file mode 100644 index 000000000..5cbe3b701 --- /dev/null +++ b/keyboards/nyquist/keymaps/yshrsmz/config.h @@ -0,0 +1,39 @@ +/* +Copyright 2017 Danny Nguyen + +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 . +*/ + +#pragma once + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* auto shift config */ +#define AUTO_SHIFT_TIMEOUT 140 + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define _MASTER_RIGHT +// #define EE_HANDS + +#undef RGBLED_NUM +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 12 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 diff --git a/keyboards/nyquist/keymaps/yshrsmz/keymap.c b/keyboards/nyquist/keymaps/yshrsmz/keymap.c new file mode 100644 index 000000000..78070279d --- /dev/null +++ b/keyboards/nyquist/keymaps/yshrsmz/keymap.c @@ -0,0 +1,195 @@ +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _LOWER 1 +#define _RAISE 2 +#define _FUNC 3 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + LOWER, + RAISE, + FUNC, + ADJUST, +}; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | = | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Tab | Q | W | E | R | T | Y | U | I | O | P | - | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Fn | Ctrl | Alt | GUI |Lower | Bksp |Space |Raise | GUI |Shift |Adjust| Fn | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = LAYOUT( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_EQL, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS, \ + KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ + FUNC, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_BSPC, KC_SPC, RAISE, KC_RGUI, KC_RSFT, ADJUST, FUNC \ +), + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | | | | |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT( \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | | | | |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* FUNC + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | ` | F1 | F2 | F3 | F4 | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F5 | F6 | F7 | F8 | | LEFT | DOWN | UP |RIGHT | PGUP | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F9 | F10 | F11 | F12 | | HOME | END |Alt+← |Alt+→ | PGDN | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_FUNC] = LAYOUT( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, _______, _______, _______, _______, _______, _______, KC_DEL, \ + _______, KC_F5, KC_F6, KC_F7, KC_F8, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_PGUP, _______, \ + _______, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_HOME, KC_END, LALT(KC_LEFT),LALT(KC_RGHT), KC_PGDN, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | Reset|RGB Tg|RGB Md|Hue Up|Hue Dn|Sat Up|Sat Dn|Val Up|Val Dn| | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty| | | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = LAYOUT( \ + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ + _______, RESET , RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, _______, KC_DEL, \ + _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ +) + + +}; + +#ifdef AUDIO_ENABLE +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +#endif + +void persistent_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_qwerty); + #endif + persistent_default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case FUNC: + if (record->event.pressed) { + layer_on(_FUNC); + } else { + layer_off(_FUNC); + } + return false; + break; + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + break; + } + return true; +} diff --git a/keyboards/nyquist/keymaps/yshrsmz/rules.mk b/keyboards/nyquist/keymaps/yshrsmz/rules.mk new file mode 100644 index 000000000..c9383ab8d --- /dev/null +++ b/keyboards/nyquist/keymaps/yshrsmz/rules.mk @@ -0,0 +1 @@ +AUTO_SHIFT_ENABLE = yes From 0dcd60eeedbd3254d29e8bdf33719222a598f085 Mon Sep 17 00:00:00 2001 From: Brad Date: Sat, 1 Sep 2018 11:59:20 -0500 Subject: [PATCH 040/788] Keymap: added keys to broswen keymap (#3825) * added PGUP and PGDN to my keymap * added VOLU VOLD and MUTE to keymap --- keyboards/iris/keymaps/broswen/keymap.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/keyboards/iris/keymaps/broswen/keymap.c b/keyboards/iris/keymaps/broswen/keymap.c index 7453a9eef..6d783142e 100644 --- a/keyboards/iris/keymaps/broswen/keymap.c +++ b/keyboards/iris/keymaps/broswen/keymap.c @@ -45,7 +45,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //,----+----+----+----+----+----. ,----+----+----+----+----+----. , , , , , , , , , , , , //|----+----+----+----+----+----| |----+----+----+----+----+----| - , , , , , , , , , , , , + , , , , , , ,PGDN,PGUP, , , , //|----+----+----+----+----+----| |----+----+----+----+----+----| ,TILD,PIPE,MINS,PLUS, , LEFT,DOWN, UP ,RGHT, , , //|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----| @@ -59,9 +59,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //,----+----+----+----+----+----. ,----+----+----+----+----+----. F12 , F1 , F2 , F3 , F4 , F5 , F6 , F7 , F8 , F9 ,F10 ,F11 , //|----+----+----+----+----+----| |----+----+----+----+----+----| - , , , , , , , , , , , , + , , , , , , , , , , ,F12 , //|----+----+----+----+----+----| |----+----+----+----+----+----| - , , , , , , , , , , , , + , , , , , , MUTE,VOLD,VOLU, , , , //|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----| , , , , , , , , , , , , , , //`----+----+----+--+-+----+----+----/ \----+----+----+----+----+----+----' From 7e5a0def3ac5632770151f40fc52e8e0c291a78a Mon Sep 17 00:00:00 2001 From: Pranav Singh Date: Sat, 1 Sep 2018 13:02:10 -0400 Subject: [PATCH 041/788] Keymap: new planck keymap (#3809) * Add files via upload * new planck keymap * new planck keymap * readme file updated * deleted files from qmkfirmware folder * re-added readme file to /qmk_firmware * Fix main readme (hopefully) --- keyboards/planck/keymaps/vaire/config.h | 37 ++++++ keyboards/planck/keymaps/vaire/keymap.c | 150 +++++++++++++++++++++++ keyboards/planck/keymaps/vaire/readme.md | 6 + keyboards/planck/keymaps/vaire/rules.mk | 82 +++++++++++++ 4 files changed, 275 insertions(+) create mode 100644 keyboards/planck/keymaps/vaire/config.h create mode 100644 keyboards/planck/keymaps/vaire/keymap.c create mode 100644 keyboards/planck/keymaps/vaire/readme.md create mode 100644 keyboards/planck/keymaps/vaire/rules.mk diff --git a/keyboards/planck/keymaps/vaire/config.h b/keyboards/planck/keymaps/vaire/config.h new file mode 100644 index 000000000..96a13cc42 --- /dev/null +++ b/keyboards/planck/keymaps/vaire/config.h @@ -0,0 +1,37 @@ +#pragma + + + + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +#define MOUSEKEY_INTERVAL 16 +#define MOUSEKEY_DELAY 0 +#define MOUSEKEY_TIME_TO_MAX 60 +#define MOUSEKEY_MAX_SPEED 7 +#define MOUSEKEY_WHEEL_DELAY 0 + + +#define MIDI_BASIC + +#define BACKLIGHT_BREATHING + + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 diff --git a/keyboards/planck/keymaps/vaire/keymap.c b/keyboards/planck/keymaps/vaire/keymap.c new file mode 100644 index 000000000..71cbcd8bd --- /dev/null +++ b/keyboards/planck/keymaps/vaire/keymap.c @@ -0,0 +1,150 @@ +#include QMK_KEYBOARD_H + #include "action_layer.h" + + +extern keymap_config_t keymap_config; + +#define EXCEL_HOME LALT(KC_H) +#define EXCEL_COL LCTL(KC_SPC) +#define EXCEL_ROW LSFT(KC_SPC) +#define DESK_LEFT LCTL(LGUI(KC_LEFT)) +#define WIN_LEFT LSFT(KC_TAB) +#define WIN_CLOSE LALT(KC_F4) +#define WIN_RIGHT KC_TAB +#define DESK_RIGHT LCTL(LGUI(KC_RGHT)) +#define DOCS LGUI(KC_E) +#define SNAP_RIGHT LGUI(KC_RGHT) +#define SNAP_UP LGUI(KC_UP) +#define SNAP_LEFT LGUI(KC_LEFT) +#define SNAP_DOWN LGUI(KC_DOWN) +#define COPY LCTL(KC_C) +#define PASTE LCTL(KC_V) +#define CUT LCTL(KC_X) +#define UNDO LCTL(KC_Z) +#define FIND LCTL(KC_F) + + + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + + + LAYOUT_planck_grid( + KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_UP, SFT_T(KC_ENT), + MO(1), KC_LCTL, KC_LALT, KC_LGUI, MO(2), LT(5,KC_ENT), LT(4,KC_SPC), MO(3), KC_SLSH, KC_LEFT, KC_DOWN, CTL_T(KC_RGHT)), + + LAYOUT_planck_grid( + KC_ESC, KC_NLCK, LCTL(KC_SPC), KC_UP, LSFT(KC_SPC), KC_DLR, KC_EQL, KC_P7, KC_P8, KC_P9, KC_PPLS, LCTL(KC_BSPC), + KC_TAB, FIND, KC_LEFT, KC_DOWN, KC_RGHT, KC_PERC, KC_CIRC, KC_P4, KC_P5, KC_P6, KC_PMNS, KC_BSLS, + KC_LSFT, UNDO, CUT, COPY, PASTE, EXCEL_HOME, KC_PSCR, KC_P1, KC_P2, KC_P3, KC_PSLS, KC_LSFT, + KC_TRNS, KC_LCTL, KC_LALT, KC_LGUI, TO(1), KC_ENT, KC_SPC, KC_PENT, KC_P0, KC_PDOT, KC_PAST, KC_LCTL), + + LAYOUT_planck_grid( + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, + KC_CAPS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_EQL, KC_LT, KC_GT, KC_LPRN, + KC_LSFT, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_MUTE, KC_MPLY, KC_MNXT, KC_PGUP, SFT_T(KC_VOLU), + TO(0), KC_LCTL, KC_LALT, KC_LGUI, KC_TRNS, KC_ENT, KC_SPC, MO(3), KC_PSCR, KC_MPRV, KC_PGDOWN, CTL_T(KC_VOLD)), + + LAYOUT_planck_grid( + KC_TILD, DESK_LEFT, WIN_LEFT, KC_F4, WIN_RIGHT, DESK_RIGHT, DOCS, SNAP_LEFT, SNAP_UP, SNAP_RIGHT, SNAP_DOWN, KC_DEL, + KC_CAPS, KC_QUOT, KC_LBRC, KC_LCBR, KC_LPRN, KC_BSLS, KC_SLSH, KC_RPRN, KC_RCBR, KC_RBRC, KC_DQUO, KC_QUOT, + KC_PWR, KC_SLEP, KC_WAKE, KC_HOME, BL_BRTG, BL_STEP, KC_TRNS, KC_CALC, KC_LT, KC_GT, KC_COLON, KC_LSFT, + TO(0), KC_LCTL, KC_LALT, KC_LGUI, KC_LALT, KC_LCTL, KC_TRNS, KC_TRNS, AU_TOG, MU_TOG, MU_MOD, LCTL(KC_RGHT)), + + LAYOUT_planck_grid( + TO(0), KC_LSCR, WIN_LEFT, KC_MS_WH_UP, WIN_RIGHT, KC_TRNS, KC_TRNS, KC_MS_BTN1, KC_MS_U, KC_MS_BTN2, KC_TRNS, KC_TRNS, + KC_TRNS, KC_INS, KC_MS_WH_LEFT, KC_MS_WH_DOWN, KC_MS_WH_RIGHT, KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, KC_TRNS, + RESET, KC_APP, KC_MS_ACCEL0, KC_MS_ACCEL0, KC_MS_ACCEL0, KC_TRNS, KC_TRNS, TO(0), TO(1), TO(2), TO(3), TO(4), + TO(0), KC_MENU, KC_TRNS, KC_TRNS, KC_LALT, KC_LCTL, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RCTL), + + LAYOUT_planck_grid( + KC_BSPC, KC_P, KC_O, KC_I, KC_U, KC_Y, KC_T, KC_R, KC_E, KC_W, KC_Q, KC_BSPC, + KC_TAB, KC_SCLN, KC_L, KC_K, KC_J, KC_H, KC_G, KC_F, KC_D, KC_S, KC_A, KC_QUOT, + KC_LSFT, KC_ENT, KC_DOT, KC_COMM, KC_M, KC_N, KC_B, KC_V, KC_C, KC_X, KC_Z, SFT_T(KC_ENT), + TO(0), KC_LCTL, KC_LALT, KC_LGUI, MO(2), KC_TRNS, KC_TRNS, MO(3), KC_SLSH, KC_LEFT, KC_DOWN, LCTL(KC_RGHT)), + + + +}; + + +#ifdef AUDIO_ENABLE + +void matrix_init_user(void) +{ + set_voice(default_voice); + startup_user(); + println("Matrix Init"); +} + +void led_set_user(uint8_t usb_led) +{ + static uint8_t old_usb_led = 0; + + _delay_ms(10); // gets rid of tick + + if (!is_playing_notes()) + { + if ((usb_led & (1< Date: Sun, 2 Sep 2018 08:29:13 -0700 Subject: [PATCH 042/788] Fix bad key label in ascii art (#3830) Just fixed a key that was wrong in the Tokyo60 ASCII art --- keyboards/tokyo60/keymaps/default/keymap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/tokyo60/keymaps/default/keymap.c b/keyboards/tokyo60/keymaps/default/keymap.c index 97380784c..a3e27bdd8 100644 --- a/keyboards/tokyo60/keymaps/default/keymap.c +++ b/keyboards/tokyo60/keymaps/default/keymap.c @@ -12,7 +12,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │BkSpc│█████│ ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ -│Ctrl │ A │ S │ D │ F │ G │ H │ J │ K │ L │ Fn3 │ ' │█████│Enter│█████│ +│Ctrl │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │█████│Enter│█████│ ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ │Shift│█████│ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │█████│Shift│ Fn │ ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ From 479bf78f3eb3b0eec31c4c14ca853d3c80d2f9c6 Mon Sep 17 00:00:00 2001 From: Damien Date: Sun, 2 Sep 2018 17:35:04 +0200 Subject: [PATCH 043/788] Keymap: Added personal layout for FC660C (#3834) * - Fixed DK60 version in config.h * - Updated dk60 readme with new QMK rules * - Fixed wording in readme * Added dbroqua layout for DZ60 I've also updated dz60.h to add "true HHKD" keymap definition (6U spacebar). With the default HHKB definition r_alt was not mapped and when I pressed r_menu it was r_alt. Regards * Updated dbroqua layout for HHKB keyboard Added default configuration and alternate (swap gui/alt keys). Save user choice in keyboard memory (like plank, thanks for this feature!). * Added dbroqua layout for Iris keyboard * Updated layout and fixed includes * Added personal layout for FC660C --- keyboards/fc660c/keymaps/dbroqua/keymap.c | 47 +++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 keyboards/fc660c/keymaps/dbroqua/keymap.c diff --git a/keyboards/fc660c/keymaps/dbroqua/keymap.c b/keyboards/fc660c/keymaps/dbroqua/keymap.c new file mode 100644 index 000000000..ef6f471aa --- /dev/null +++ b/keyboards/fc660c/keymaps/dbroqua/keymap.c @@ -0,0 +1,47 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* BASE layer: Default Layer + * ,--------------------------------------------------------------------------------------------------. + * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Backspace | | Ins | + * |-----------------------------------------------------------------------------------------+ +-----+ + * | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | Bksp | | Del | + * |-----------------------------------------------------------------------------------------+ +-----+ + * | Ctrl | A | S | D | F | G | H | J | K | L | ; | ' | Enter | + * |--------------------------------------------------------------------------------------------+ + * | Shift | Z | X | C | V | B | N | M | , | . | / | Shift | Up | + * +--------------------------------------------------------------------------------------------+-----+ + * | Ctrl | Gui | Alt | Space | Alt | Gui | Fn | Left| Down|Right| + * `--------------------------------------------------------------------------------------------------´ + */ + [0] = LAYOUT( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL, KC_BSPC, KC_INS, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC,KC_BSLS, KC_DEL, + KC_LCTL,KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_ENT, + KC_LSFT,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,KC_RSFT, KC_UP, + KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RCTL,MO(1), KC_LEFT,KC_DOWN,KC_RGHT + ), + /* FN layer + * ,--------------------------------------------------------------------------------------------------. + * | ` | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | | | | + * |-----------------------------------------------------------------------------------------+ +-----+ + * | | | | | | | | |PrtSc| Slck| Paus| | | | | | + * |-----------------------------------------------------------------------------------------+ +-----+ + * | | Vol-| Vol+| Mute|Eject| | | | Home| PgUp| | | | + * |--------------------------------------------------------------------------------------------+ + * | | Prev| Play| Next| | | | | End | PgDn| | | | + * +--------------------------------------------------------------------------------------------+-----+ + * | | | | | | | | | | | + * `--------------------------------------------------------------------------------------------------´ + */ + [1] = LAYOUT( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, + _______,_______,_______,_______,_______,_______,_______,_______,KC_PSCR,KC_SLCK,KC_PAUS,_______,_______,_______, _______, + _______,KC_VOLD,KC_VOLU,KC_MUTE,KC_EJCT,_______,_______,_______,KC_HOME,KC_PGUP,_______,_______, _______, + _______,KC_MPRV,KC_MPLY,KC_MNXT,_______,_______,_______,_______,KC_END, KC_PGDN,_______,_______, _______, + _______,_______,_______, _______, _______,_______,MO(1), _______,_______,_______ + ) +}; + +const uint16_t PROGMEM fn_actions[] = { +}; From 04bea9ef742827f2784401bd976b53fc29158d3d Mon Sep 17 00:00:00 2001 From: leico Date: Mon, 3 Sep 2018 01:46:52 +0900 Subject: [PATCH 044/788] Keymap: share my ortho_4x12 layout symbolic (#3833) * add ortho_4x12 symbolic layout * delete trash * modify little bit * fixed doesn't requires replace `#ifndef ... #endif` to `#pragma ones` in config.h delete `QMK_KEYBOARD_CONFIG_H` in config.h delete `action_layer.h` and `eeconfig.h` in keymap.c --- .../community/ortho_4x12/symbolic/README.md | 70 +++++++ .../community/ortho_4x12/symbolic/config.h | 47 +++++ .../community/ortho_4x12/symbolic/keymap.c | 171 ++++++++++++++++++ 3 files changed, 288 insertions(+) create mode 100644 layouts/community/ortho_4x12/symbolic/README.md create mode 100644 layouts/community/ortho_4x12/symbolic/config.h create mode 100644 layouts/community/ortho_4x12/symbolic/keymap.c diff --git a/layouts/community/ortho_4x12/symbolic/README.md b/layouts/community/ortho_4x12/symbolic/README.md new file mode 100644 index 000000000..37fbcd56a --- /dev/null +++ b/layouts/community/ortho_4x12/symbolic/README.md @@ -0,0 +1,70 @@ +# Symbolic ortho 4x12 layout + +## Features + +### QWERTY based + +![QWERTY layout](https://gist.githubusercontent.com/leico/cb50ecd12eb8ad906a69678f265cd52c/raw/4597497ecd00790312f1a3928b2e2c5cf17a6ac1/QWERTY.png) + +* Default keymap +* QWERTY layout +* Hold and tap + * `Shift` and `Space` + * `Left Ctrl` and `Tab` +* Symmetric Modifiers + * `Shift` + * `Raise Layer` + * `Lower Layer` + * `GUI` + * `Reset` + +### symbol charactor layer + +![Raise layout](https://gist.githubusercontent.com/leico/cb50ecd12eb8ad906a69678f265cd52c/raw/4597497ecd00790312f1a3928b2e2c5cf17a6ac1/Raise.png) + +* Raise Layer +* assigned symbolic(punctuation) characters +* as could as possible, related neighbor keys + * brackets + * quotes + * operators + * slashes +* related default layer keys + * colons + * exclamation and question +* thus above features, easy learn keymapping +* transparent all modifiers + +### numbers and allows layer + +![Lower layout](https://gist.githubusercontent.com/leico/cb50ecd12eb8ad906a69678f265cd52c/raw/4597497ecd00790312f1a3928b2e2c5cf17a6ac1/Lower.png) + +* Lower Layer +* entrust vim style arrows +* also numkeys +* additional, computer volume keys +* transparent all modifiers + +### Numpads and F key layer + +![Neutral layout](https://gist.githubusercontent.com/leico/cb50ecd12eb8ad906a69678f265cd52c/raw/4597497ecd00790312f1a3928b2e2c5cf17a6ac1/Neutral.png) + +* visibled when Raise and Lower layer visibled +* F keys assigned left hand side +* Numpads assigned right hand side + * for that reason, override `RGUI` key +* transparent mostly modifiers + + +### Goals + +* release a right little finger from symbols +* entrust more symbols for a left hand +* simple, minimal, easy learn +* as soon as possible, don't disable any shortcuts + + +### suggestions or find issues + +[post issues for my fork](https://github.com/leico/qmk_firmware/issues) + diff --git a/layouts/community/ortho_4x12/symbolic/config.h b/layouts/community/ortho_4x12/symbolic/config.h new file mode 100644 index 000000000..702c9226c --- /dev/null +++ b/layouts/community/ortho_4x12/symbolic/config.h @@ -0,0 +1,47 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#pragma once + +// prevent stuck modifiers +#define PREVENT_STUCK_MODIFIERS + + +// hold & tapping delay setting +#define TAPPING_TERM 100 + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +//#define MASTER_LEFT +// #define MASTER_RIGHT +#define EE_HANDS + +#ifdef AUDIO_ENABLE + #define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \ + SONG(DVORAK_SOUND), \ + SONG(COLEMAK_SOUND) \ + } +#endif + diff --git a/layouts/community/ortho_4x12/symbolic/keymap.c b/layouts/community/ortho_4x12/symbolic/keymap.c new file mode 100644 index 000000000..d4c089236 --- /dev/null +++ b/layouts/community/ortho_4x12/symbolic/keymap.c @@ -0,0 +1,171 @@ +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _LOWER 1 +#define _RAISE 2 +#define _NEUTRAL 3 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + L_LOWER, + R_LOWER, + L_RAISE, + R_RAISE +}; + + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,------------------------------------------------------------------------------------. + * | | | | | | || | | | | | | + * | Esc | Q | W | E | R | T || Y | U | I | O | P | Bksp | + * |------+------+------+------+------+------++------+------+------+------+------+------| + * |LCTL_T| | | | | || | | | | | | + * | Tab | A | S | D | F | G || H | J | K | L | ; |Enter | + * |------+------+------+------+------+------++------+------+------+------+------+------| + * | | | | | | || | | | | | | + * | | Z | X | C | V | B || N | M | , | . | ! | | + * |------+------+------+------+------+------++------+------+------+------+------+------| + * | | | | | |LSFT_T||RSFT_T| | | | | | + * |Reset | Alt | GUI |LLower|LRaise|Space ||Space |RRaise|RLower| GUI | Del |Reset | + * `------------------------------------------------------------------------------------' + */ +[_QWERTY] = LAYOUT_ortho_4x12( \ + KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + LCTL_T(KC_TAB), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT, \ + XXXXXXX, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_EXLM, XXXXXXX, \ + RESET, KC_LALT, KC_LGUI, L_LOWER, L_RAISE, LSFT_T( KC_SPC ), RSFT_T( KC_SPC ), R_RAISE, R_LOWER, KC_RGUI, KC_DEL, RESET \ +), + +/* Raise + * ,------------------------------------------------------------------------------------. + * | | | | | | || | | | | | | + * | Esc | | & | { | } | % || \ | [ | ] | # | | Bksp | + * |------+------+------+------+------+------++------+------+------+------+------+------| + * |LCTL_T| | | | | || | | | | | | + * | Tab | ~ | | | ( | ) | * || / | < | > | ' | : |Enter | + * |------+------+------+------+------+------++------+------+------+------+------+------| + * | | | | | | || | | | | | | + * | | ` | ^ | @ | $ | + || - | = | _ | " | ? | | + * |------+------+------+------+------+------++------+------+------+------+------+------| + * | | | | | |LSFT_T||RSFT_T| | | | | | + * |Reset | Alt | GUI |LLower|LRaise|Space ||Space |RRaise|RLower| GUI | Del |Reset | + * `------------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT_ortho_4x12( \ + _______, XXXXXXX, KC_AMPR, KC_LCBR, KC_RCBR, KC_PERC, KC_BSLS, KC_LBRC, KC_RBRC, KC_HASH, XXXXXXX, _______, \ + _______, KC_TILD, KC_PIPE, KC_LPRN, KC_RPRN, KC_ASTR, KC_SLSH, KC_LABK, KC_RABK, KC_QUOT, KC_COLN, _______, \ + _______, KC_GRV, KC_CIRC, KC_AT, KC_DLR, KC_PLUS, KC_MINS, KC_EQL, KC_UNDS, KC_DQUO, KC_QUES, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ +), +/* Lower + * ,------------------------------------------------------------------------------------. + * | | | | | | || | | | | | | + * | Esc | 1 | 2 | 3 | 4 | 5 || 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------++------+------+------+------+------+------| + * |LCTL_T| | | | | || | | | | | | + * | Tab | |VolDn |VolUp | Mute | || Left | Down | Up |Right | |Enter | + * |------+------+------+------+------+------++------+------+------+------+------+------| + * | | | | | | || | | | | | | + * | | | | | | || | | | | | | + * |------+------+------+------+------+------++------+------+------+------+------+------| + * | | | | | |LSFT_T||RSFT_T| | | | | | + * |Reset | Alt | GUI |LLower|LRaise|Space ||Space |RRaise|RLower| GUI | Del |Reset | + * `------------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT_ortho_4x12( \ + _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, \ + _______, XXXXXXX, KC_VOLD, KC_VOLU, KC_MUTE, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, XXXXXXX, _______, \ + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ +), + +/* Neutral + * ,------------------------------------------------------------------------------------. + * | | | | | | || | | | | | | + * | Esc | F1 | F2 | F3 | F4 | || + | - | 1 | 2 | 3 | Bksp | + * |------+------+------+------+------+------++------+------+------+------+------+------| + * |LCTL_T| | | | | || | | | | | | + * | Tab | F5 | F6 | F7 | F8 | || * | / | 4 | 5 | 6 |Enter | + * |------+------+------+------+------+------++------+------+------+------+------+------| + * | | | | | | || | | | | | | + * | | F9 | F10 | F11 | F12 | || . | , | 7 | 8 | 9 | | + * |------+------+------+------+------+------++------+------+------+------+------+------| + * | | | | | |LSFT_T||RSFT_T| | | | | | + * |Reset | Alt | GUI |LLower|LRaise|Space ||Space |RRaise|RLower| 0 | Del |Reset | + * `------------------------------------------------------------------------------------' + */ +[_NEUTRAL] = LAYOUT_ortho_4x12( \ + _______, KC_F1, KC_F2, KC_F3, KC_F4, XXXXXXX, KC_PPLS, KC_PMNS, KC_P1, KC_P2, KC_P3, _______, \ + _______, KC_F5, KC_F6, KC_F7, KC_F8, XXXXXXX, KC_PAST, KC_PSLS, KC_P4, KC_P5, KC_P6, _______, \ + _______, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, KC_PDOT, KC_COMM, KC_P7, KC_P8, KC_P9, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_P0, _______, _______ \ +) + + +}; + + +void DualKeyPressed ( bool brother_state, uint8_t target ){ + + if( brother_state ) return; + + layer_on( target ); + return; +} + +void DualKeyReleased ( bool brother_state, uint8_t target1 ){ + + if( brother_state ) return ; + + layer_off( target1 ); + return ; +} + +bool LayerSwitch ( keyrecord_t *record, bool *key_state, bool brother, uint8_t layer ){ + if ( record -> event.pressed ) { + *key_state = true; + DualKeyPressed( brother, layer ); + } + else { + *key_state = false; + DualKeyReleased( brother, layer ); + } + + update_tri_layer(_LOWER, _RAISE, _NEUTRAL ); + return false; + + +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + + static bool l_lower = false; + static bool r_lower = false; + + static bool l_raise = false; + static bool r_raise = false; + + switch (keycode) { + + + case L_LOWER : return LayerSwitch( record, &l_lower, r_lower, _LOWER ); break; + case R_LOWER : return LayerSwitch( record, &r_lower, l_lower, _LOWER ); break; + case L_RAISE : return LayerSwitch( record, &l_raise, r_raise, _RAISE ); break; + case R_RAISE : return LayerSwitch( record, &r_raise, l_raise, _RAISE ); break; + + } + return true; +} From fa1ee47cf2293d06693b86e8dd188d9fbc9338c4 Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Tue, 4 Sep 2018 00:18:37 +0100 Subject: [PATCH 045/788] Enable mouse keys in register_code and unregister_code This allows for macros to be assigned to press two mouse directions at same time, which allows for one key diagonals. --- tmk_core/common/action.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tmk_core/common/action.c b/tmk_core/common/action.c index f7c039f45..76c150b40 100644 --- a/tmk_core/common/action.c +++ b/tmk_core/common/action.c @@ -773,6 +773,9 @@ void register_code(uint8_t code) else if IS_CONSUMER(code) { host_consumer_send(KEYCODE2CONSUMER(code)); } + else if IS_MOUSEKEY(code) { + mousekey_on(code); + } } /** \brief Utilities for actions. (FIXME: Needs better description) @@ -832,6 +835,9 @@ void unregister_code(uint8_t code) else if IS_CONSUMER(code) { host_consumer_send(0); } + else if IS_MOUSEKEY(code) { + mousekey_off(code); + } } /** \brief Utilities for actions. (FIXME: Needs better description) From 35efcc9f398a1a2493b482dd1bd7c859f93ef450 Mon Sep 17 00:00:00 2001 From: marksard <38324387+marksard@users.noreply.github.com> Date: Tue, 4 Sep 2018 08:34:16 +0900 Subject: [PATCH 046/788] Keyboard: Improvement of crkbd communication functions (based on helix-keyboard) (#3798) * improvement of crkbd communication functions (based on helix-keyboard) * Removed unnecessary code. * Changed read restriction from #define to #pragma once. * Changed from sizeof to defined size. * moved lib folder to crkbdroot. removed warning of ws2812.d --- keyboards/crkbd/config.h | 13 +- keyboards/crkbd/crkbd.h | 5 +- keyboards/crkbd/i2c.c | 2 +- keyboards/crkbd/i2c.h | 7 +- keyboards/crkbd/keymaps/default/keymap.c | 2 - keyboards/crkbd/keymaps/default/rules.mk | 14 +- keyboards/crkbd/keymaps/like_jis/keymap.c | 2 - keyboards/crkbd/keymaps/like_jis/rules.mk | 14 +- .../{keymaps => }/lib/host_led_state_reader.c | 0 keyboards/crkbd/{keymaps => }/lib/keylogger.c | 0 .../{keymaps => }/lib/layer_state_reader.c | 0 .../crkbd/{keymaps => }/lib/logo_reader.c | 0 .../{keymaps => }/lib/mode_icon_reader.c | 0 .../{keymaps => }/lib/rgb_state_reader.c | 0 .../crkbd/{keymaps => }/lib/timelogger.c | 0 keyboards/crkbd/pro_micro.h | 6 +- keyboards/crkbd/rev1/config.h | 8 +- keyboards/crkbd/rev1/matrix.c | 59 ++- keyboards/crkbd/rev1/rev1.h | 5 +- keyboards/crkbd/rev1/rules.mk | 5 +- keyboards/crkbd/rev1/serial_config.h | 10 + .../crkbd/rev1/serial_config_simpleapi.h | 5 + keyboards/crkbd/rev1/split_scomm.c | 73 +++ keyboards/crkbd/rev1/split_scomm.h | 21 + keyboards/crkbd/{ => rev1}/split_util.c | 3 +- keyboards/crkbd/{ => rev1}/split_util.h | 5 +- keyboards/crkbd/rules.mk | 10 +- keyboards/crkbd/serial.c | 456 +++++++++++++----- keyboards/crkbd/serial.h | 83 +++- keyboards/crkbd/ssd1306.c | 1 + keyboards/crkbd/ssd1306.h | 8 +- 31 files changed, 582 insertions(+), 235 deletions(-) rename keyboards/crkbd/{keymaps => }/lib/host_led_state_reader.c (100%) rename keyboards/crkbd/{keymaps => }/lib/keylogger.c (100%) rename keyboards/crkbd/{keymaps => }/lib/layer_state_reader.c (100%) rename keyboards/crkbd/{keymaps => }/lib/logo_reader.c (100%) rename keyboards/crkbd/{keymaps => }/lib/mode_icon_reader.c (100%) rename keyboards/crkbd/{keymaps => }/lib/rgb_state_reader.c (100%) rename keyboards/crkbd/{keymaps => }/lib/timelogger.c (100%) create mode 100644 keyboards/crkbd/rev1/serial_config.h create mode 100644 keyboards/crkbd/rev1/serial_config_simpleapi.h create mode 100644 keyboards/crkbd/rev1/split_scomm.c create mode 100644 keyboards/crkbd/rev1/split_scomm.h rename keyboards/crkbd/{ => rev1}/split_util.c (97%) rename keyboards/crkbd/{ => rev1}/split_util.h (81%) diff --git a/keyboards/crkbd/config.h b/keyboards/crkbd/config.h index c910d8f24..64fee7545 100644 --- a/keyboards/crkbd/config.h +++ b/keyboards/crkbd/config.h @@ -16,9 +16,16 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef CONFIG_H -#define CONFIG_H +#pragma once #include "config_common.h" +#include -#endif +#ifdef USE_Link_Time_Optimization + // LTO has issues with macros (action_get_macro) and "functions" (fn_actions), + // so just disable them + #define NO_ACTION_MACRO + #define NO_ACTION_FUNCTION + + #define DISABLE_LEADER +#endif // USE_Link_Time_Optimization diff --git a/keyboards/crkbd/crkbd.h b/keyboards/crkbd/crkbd.h index 889bcb9ae..73f2a3f07 100644 --- a/keyboards/crkbd/crkbd.h +++ b/keyboards/crkbd/crkbd.h @@ -1,8 +1,5 @@ -#ifndef CRKBD_H -#define CRKBD_H +#pragma once #ifdef KEYBOARD_crkbd_rev1 #include "rev1.h" #endif - -#endif diff --git a/keyboards/crkbd/i2c.c b/keyboards/crkbd/i2c.c index 084c890c4..4bee5c639 100644 --- a/keyboards/crkbd/i2c.c +++ b/keyboards/crkbd/i2c.c @@ -34,7 +34,7 @@ void i2c_delay(void) { // _delay_us(100); } -// Setup twi to run at 100kHz +// Setup twi to run at 100kHz or 400kHz (see ./i2c.h SCL_CLOCK) void i2c_master_init(void) { // no prescaler TWSR = 0; diff --git a/keyboards/crkbd/i2c.h b/keyboards/crkbd/i2c.h index c15b6bc50..710662c7a 100644 --- a/keyboards/crkbd/i2c.h +++ b/keyboards/crkbd/i2c.h @@ -1,5 +1,4 @@ -#ifndef I2C_H -#define I2C_H +#pragma once #include @@ -15,7 +14,7 @@ #define SLAVE_BUFFER_SIZE 0x10 -// i2c SCL clock frequency +// i2c SCL clock frequency 400kHz #define SCL_CLOCK 400000L extern volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE]; @@ -45,5 +44,3 @@ extern unsigned char i2c_readNak(void); extern unsigned char i2c_read(unsigned char ack); #define i2c_read(ack) (ack) ? i2c_readAck() : i2c_readNak(); - -#endif diff --git a/keyboards/crkbd/keymaps/default/keymap.c b/keyboards/crkbd/keymaps/default/keymap.c index 87661d345..e92fbdebf 100644 --- a/keyboards/crkbd/keymaps/default/keymap.c +++ b/keyboards/crkbd/keymaps/default/keymap.c @@ -5,7 +5,6 @@ #include "split_util.h" #endif #ifdef SSD1306OLED - #include "LUFA/Drivers/Peripheral/TWI.h" #include "ssd1306.h" #endif @@ -130,7 +129,6 @@ void matrix_init_user(void) { #endif //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h #ifdef SSD1306OLED - TWI_Init(TWI_BIT_PRESCALE_1, TWI_BITLENGTH_FROM_FREQ(1, 800000)); iota_gfx_init(!has_usb()); // turns on the display #endif } diff --git a/keyboards/crkbd/keymaps/default/rules.mk b/keyboards/crkbd/keymaps/default/rules.mk index 6570e2f5c..0edf1181f 100644 --- a/keyboards/crkbd/keymaps/default/rules.mk +++ b/keyboards/crkbd/keymaps/default/rules.mk @@ -21,10 +21,10 @@ SWAP_HANDS_ENABLE = no # Enable one-hand typing SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend # If you want to change the display of OLED, you need to change here -SRC += ../lib/rgb_state_reader.c \ - ../lib/layer_state_reader.c \ - ../lib/logo_reader.c \ - ../lib/keylogger.c \ - # ../lib/mode_icon_reader.c \ - # ../lib/host_led_state_reader.c \ - # ../lib/timelogger.c \ +SRC += ./lib/rgb_state_reader.c \ + ./lib/layer_state_reader.c \ + ./lib/logo_reader.c \ + ./lib/keylogger.c \ + # ./lib/mode_icon_reader.c \ + # ./lib/host_led_state_reader.c \ + # ./lib/timelogger.c \ diff --git a/keyboards/crkbd/keymaps/like_jis/keymap.c b/keyboards/crkbd/keymaps/like_jis/keymap.c index 31b5230b1..90e5b7ec1 100644 --- a/keyboards/crkbd/keymaps/like_jis/keymap.c +++ b/keyboards/crkbd/keymaps/like_jis/keymap.c @@ -5,7 +5,6 @@ #include "split_util.h" #endif #ifdef SSD1306OLED - #include "LUFA/Drivers/Peripheral/TWI.h" #include "ssd1306.h" #endif @@ -124,7 +123,6 @@ void matrix_init_user(void) { #endif //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h #ifdef SSD1306OLED - TWI_Init(TWI_BIT_PRESCALE_1, TWI_BITLENGTH_FROM_FREQ(1, 800000)); iota_gfx_init(!has_usb()); // turns on the display #endif } diff --git a/keyboards/crkbd/keymaps/like_jis/rules.mk b/keyboards/crkbd/keymaps/like_jis/rules.mk index 6570e2f5c..0edf1181f 100644 --- a/keyboards/crkbd/keymaps/like_jis/rules.mk +++ b/keyboards/crkbd/keymaps/like_jis/rules.mk @@ -21,10 +21,10 @@ SWAP_HANDS_ENABLE = no # Enable one-hand typing SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend # If you want to change the display of OLED, you need to change here -SRC += ../lib/rgb_state_reader.c \ - ../lib/layer_state_reader.c \ - ../lib/logo_reader.c \ - ../lib/keylogger.c \ - # ../lib/mode_icon_reader.c \ - # ../lib/host_led_state_reader.c \ - # ../lib/timelogger.c \ +SRC += ./lib/rgb_state_reader.c \ + ./lib/layer_state_reader.c \ + ./lib/logo_reader.c \ + ./lib/keylogger.c \ + # ./lib/mode_icon_reader.c \ + # ./lib/host_led_state_reader.c \ + # ./lib/timelogger.c \ diff --git a/keyboards/crkbd/keymaps/lib/host_led_state_reader.c b/keyboards/crkbd/lib/host_led_state_reader.c similarity index 100% rename from keyboards/crkbd/keymaps/lib/host_led_state_reader.c rename to keyboards/crkbd/lib/host_led_state_reader.c diff --git a/keyboards/crkbd/keymaps/lib/keylogger.c b/keyboards/crkbd/lib/keylogger.c similarity index 100% rename from keyboards/crkbd/keymaps/lib/keylogger.c rename to keyboards/crkbd/lib/keylogger.c diff --git a/keyboards/crkbd/keymaps/lib/layer_state_reader.c b/keyboards/crkbd/lib/layer_state_reader.c similarity index 100% rename from keyboards/crkbd/keymaps/lib/layer_state_reader.c rename to keyboards/crkbd/lib/layer_state_reader.c diff --git a/keyboards/crkbd/keymaps/lib/logo_reader.c b/keyboards/crkbd/lib/logo_reader.c similarity index 100% rename from keyboards/crkbd/keymaps/lib/logo_reader.c rename to keyboards/crkbd/lib/logo_reader.c diff --git a/keyboards/crkbd/keymaps/lib/mode_icon_reader.c b/keyboards/crkbd/lib/mode_icon_reader.c similarity index 100% rename from keyboards/crkbd/keymaps/lib/mode_icon_reader.c rename to keyboards/crkbd/lib/mode_icon_reader.c diff --git a/keyboards/crkbd/keymaps/lib/rgb_state_reader.c b/keyboards/crkbd/lib/rgb_state_reader.c similarity index 100% rename from keyboards/crkbd/keymaps/lib/rgb_state_reader.c rename to keyboards/crkbd/lib/rgb_state_reader.c diff --git a/keyboards/crkbd/keymaps/lib/timelogger.c b/keyboards/crkbd/lib/timelogger.c similarity index 100% rename from keyboards/crkbd/keymaps/lib/timelogger.c rename to keyboards/crkbd/lib/timelogger.c diff --git a/keyboards/crkbd/pro_micro.h b/keyboards/crkbd/pro_micro.h index f9e7ed75d..366633372 100644 --- a/keyboards/crkbd/pro_micro.h +++ b/keyboards/crkbd/pro_micro.h @@ -21,9 +21,7 @@ $Id: wiring.h 249 2007-02-03 16:52:51Z mellis $ */ - -#ifndef Pins_Arduino_h -#define Pins_Arduino_h +#pragma once #include @@ -358,5 +356,3 @@ const uint8_t PROGMEM analog_pin_to_channel_PGM[] = { #define SERIAL_PORT_USBVIRTUAL Serial #define SERIAL_PORT_HARDWARE Serial1 #define SERIAL_PORT_HARDWARE_OPEN Serial1 - -#endif /* Pins_Arduino_h */ diff --git a/keyboards/crkbd/rev1/config.h b/keyboards/crkbd/rev1/config.h index 6321136a7..efce13a49 100644 --- a/keyboards/crkbd/rev1/config.h +++ b/keyboards/crkbd/rev1/config.h @@ -16,10 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef REV1_CONFIG_H -#define REV1_CONFIG_H - -#include "../config.h" +#pragma once /* USB Device descriptor parameter */ #define VENDOR_ID 0xFEED @@ -82,6 +79,3 @@ along with this program. If not, see . //#define NO_ACTION_ONESHOT //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION - - -#endif diff --git a/keyboards/crkbd/rev1/matrix.c b/keyboards/crkbd/rev1/matrix.c index 117ff8d37..718cc5744 100644 --- a/keyboards/crkbd/rev1/matrix.c +++ b/keyboards/crkbd/rev1/matrix.c @@ -20,6 +20,7 @@ along with this program. If not, see . */ #include #include +#include #include #include #include @@ -30,12 +31,11 @@ along with this program. If not, see . #include "matrix.h" #include "split_util.h" #include "pro_micro.h" -#include "config.h" #ifdef USE_MATRIX_I2C # include "i2c.h" #else // USE_SERIAL -# include "serial.h" +# include "split_scomm.h" #endif #ifndef DEBOUNCE @@ -103,6 +103,8 @@ void matrix_init(void) init_cols(); TX_RX_LED_INIT; + TXLED0; + RXLED0; // initialize matrix state: all keys off for (uint8_t i=0; i < MATRIX_ROWS; i++) { @@ -179,17 +181,20 @@ i2c_error: // the cable is disconnceted, or something else went wrong #else // USE_SERIAL -int serial_transaction(void) { +int serial_transaction(int master_changed) { int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; +#ifdef SERIAL_USE_MULTI_TRANSACTION + int ret=serial_update_buffers(master_changed); +#else int ret=serial_update_buffers(); +#endif if (ret ) { - if(ret==2)RXLED1; + if(ret==2) RXLED1; return 1; } -RXLED0; - for (int i = 0; i < ROWS_PER_HAND; ++i) { - matrix[slaveOffset+i] = serial_slave_buffer[i]; - } + RXLED0; + memcpy(&matrix[slaveOffset], + (void *)serial_slave_buffer, SERIAL_SLAVE_BUFFER_LENGTH); return 0; } #endif @@ -200,19 +205,9 @@ uint8_t matrix_scan(void) matrix_master_scan(); }else{ matrix_slave_scan(); - -// if(serial_slave_DATA_CORRUPT()){ -// TXLED0; - int offset = (isLeftHand) ? ROWS_PER_HAND : 0; - - for (int i = 0; i < ROWS_PER_HAND; ++i) { - matrix[offset+i] = serial_master_buffer[i]; - } - -// }else{ -// TXLED1; -// } - + int offset = (isLeftHand) ? ROWS_PER_HAND : 0; + memcpy(&matrix[offset], + (void *)serial_master_buffer, SERIAL_MASTER_BUFFER_LENGTH); matrix_scan_quantum(); } return 1; @@ -222,6 +217,7 @@ uint8_t matrix_scan(void) uint8_t matrix_master_scan(void) { int ret = _matrix_scan(); + int mchanged = 1; int offset = (isLeftHand) ? 0 : ROWS_PER_HAND; @@ -231,15 +227,18 @@ uint8_t matrix_master_scan(void) { // i2c_slave_buffer[i] = matrix[offset+i]; // } #else // USE_SERIAL - for (int i = 0; i < ROWS_PER_HAND; ++i) { - serial_master_buffer[i] = matrix[offset+i]; - } + #ifdef SERIAL_USE_MULTI_TRANSACTION + mchanged = memcmp((void *)serial_master_buffer, + &matrix[offset], SERIAL_MASTER_BUFFER_LENGTH); + #endif + memcpy((void *)serial_master_buffer, + &matrix[offset], SERIAL_MASTER_BUFFER_LENGTH); #endif #ifdef USE_MATRIX_I2C if( i2c_transaction() ) { #else // USE_SERIAL - if( serial_transaction() ) { + if( serial_transaction(mchanged) ) { #endif // turn on the indicator led when halves are disconnected TXLED1; @@ -273,9 +272,19 @@ void matrix_slave_scan(void) { i2c_slave_buffer[i] = matrix[offset+i]; } #else // USE_SERIAL + #ifdef SERIAL_USE_MULTI_TRANSACTION + int change = 0; + #endif for (int i = 0; i < ROWS_PER_HAND; ++i) { + #ifdef SERIAL_USE_MULTI_TRANSACTION + if( serial_slave_buffer[i] != matrix[offset+i] ) + change = 1; + #endif serial_slave_buffer[i] = matrix[offset+i]; } + #ifdef SERIAL_USE_MULTI_TRANSACTION + slave_buffer_change_count += change; + #endif #endif } diff --git a/keyboards/crkbd/rev1/rev1.h b/keyboards/crkbd/rev1/rev1.h index d02c51f30..cdd61d2bf 100644 --- a/keyboards/crkbd/rev1/rev1.h +++ b/keyboards/crkbd/rev1/rev1.h @@ -1,5 +1,4 @@ -#ifndef REV1_H -#define REV1_CONFIG_H +#pragma once #include "../crkbd.h" @@ -49,5 +48,3 @@ KC_##L20, KC_##L21, KC_##L22, KC_##L23, KC_##L24, KC_##L25, KC_##R20, KC_##R21, KC_##R22, KC_##R23, KC_##R24, KC_##R25, \ KC_##L30, KC_##L31, KC_##L32, KC_##R30, KC_##R31, KC_##R32 \ ) - -#endif diff --git a/keyboards/crkbd/rev1/rules.mk b/keyboards/crkbd/rev1/rules.mk index 7af7ffdb8..6028b5a5b 100644 --- a/keyboards/crkbd/rev1/rules.mk +++ b/keyboards/crkbd/rev1/rules.mk @@ -1,2 +1,3 @@ -SRC += rev1/matrix.c \ - ws2812.c +SRC += rev1/matrix.c +SRC += rev1/split_util.c +SRC += rev1/split_scomm.c diff --git a/keyboards/crkbd/rev1/serial_config.h b/keyboards/crkbd/rev1/serial_config.h new file mode 100644 index 000000000..671ed821d --- /dev/null +++ b/keyboards/crkbd/rev1/serial_config.h @@ -0,0 +1,10 @@ +#pragma once + +/* Soft Serial defines */ +#define SERIAL_PIN_DDR DDRD +#define SERIAL_PIN_PORT PORTD +#define SERIAL_PIN_INPUT PIND +#define SERIAL_PIN_MASK _BV(PD2) +#define SERIAL_PIN_INTERRUPT INT2_vect + +#define SERIAL_USE_MULTI_TRANSACTION diff --git a/keyboards/crkbd/rev1/serial_config_simpleapi.h b/keyboards/crkbd/rev1/serial_config_simpleapi.h new file mode 100644 index 000000000..0e1dd9e4a --- /dev/null +++ b/keyboards/crkbd/rev1/serial_config_simpleapi.h @@ -0,0 +1,5 @@ +#pragma once + +#undef SERIAL_USE_MULTI_TRANSACTION +#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 +#define SERIAL_MASTER_BUFFER_LENGTH MATRIX_ROWS/2 diff --git a/keyboards/crkbd/rev1/split_scomm.c b/keyboards/crkbd/rev1/split_scomm.c new file mode 100644 index 000000000..9719eb22e --- /dev/null +++ b/keyboards/crkbd/rev1/split_scomm.c @@ -0,0 +1,73 @@ +#ifdef USE_SERIAL +#ifdef SERIAL_USE_MULTI_TRANSACTION +/* --- USE flexible API (using multi-type transaction function) --- */ + +#include +#include +#include +#include +#include "serial.h" +#ifdef SERIAL_DEBUG_MODE +#include +#endif + +uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; +uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0}; +uint8_t volatile status_com = 0; +uint8_t volatile status1 = 0; +uint8_t slave_buffer_change_count = 0; +uint8_t s_change_old = 0xff; + +SSTD_t transactions[] = { +#define GET_SLAVE_STATUS 0 + /* master buffer not changed, only recive slave_buffer_change_count */ + { (uint8_t *)&status_com, + 0, NULL, + sizeof(slave_buffer_change_count), &slave_buffer_change_count, + }, +#define PUT_MASTER_GET_SLAVE_STATUS 1 + /* master buffer changed need send, and recive slave_buffer_change_count */ + { (uint8_t *)&status_com, + sizeof(serial_master_buffer), (uint8_t *)serial_master_buffer, + sizeof(slave_buffer_change_count), &slave_buffer_change_count, + }, +#define GET_SLAVE_BUFFER 2 + /* recive serial_slave_buffer */ + { (uint8_t *)&status1, + 0, NULL, + sizeof(serial_slave_buffer), (uint8_t *)serial_slave_buffer + } +}; + +void serial_master_init(void) +{ + soft_serial_initiator_init(transactions); +} + +void serial_slave_init(void) +{ + soft_serial_target_init(transactions); +} + +// 0 => no error +// 1 => slave did not respond +// 2 => checksum error +int serial_update_buffers(int master_update) +{ + int status; + static int need_retry = 0; + if( s_change_old != slave_buffer_change_count ) { + status = soft_serial_transaction(GET_SLAVE_BUFFER); + if( status == TRANSACTION_END ) + s_change_old = slave_buffer_change_count; + } + if( !master_update && !need_retry) + status = soft_serial_transaction(GET_SLAVE_STATUS); + else + status = soft_serial_transaction(PUT_MASTER_GET_SLAVE_STATUS); + need_retry = ( status == TRANSACTION_END ) ? 0 : 1; + return status; +} + +#endif // SERIAL_USE_MULTI_TRANSACTION +#endif /* USE_SERIAL */ diff --git a/keyboards/crkbd/rev1/split_scomm.h b/keyboards/crkbd/rev1/split_scomm.h new file mode 100644 index 000000000..16887eb74 --- /dev/null +++ b/keyboards/crkbd/rev1/split_scomm.h @@ -0,0 +1,21 @@ +#pragma once + +#ifndef SERIAL_USE_MULTI_TRANSACTION +/* --- USE Simple API (OLD API, compatible with let's split serial.c) --- */ +#include "serial.h" + +#else +/* --- USE flexible API (using multi-type transaction function) --- */ +// Buffers for master - slave communication +#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 +#define SERIAL_MASTER_BUFFER_LENGTH MATRIX_ROWS/2 + +extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH]; +extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH]; +extern uint8_t slave_buffer_change_count; + +void serial_master_init(void); +void serial_slave_init(void); +int serial_update_buffers(int master_changed); + +#endif diff --git a/keyboards/crkbd/split_util.c b/keyboards/crkbd/rev1/split_util.c similarity index 97% rename from keyboards/crkbd/split_util.c rename to keyboards/crkbd/rev1/split_util.c index 8bc064174..e1ff8b437 100644 --- a/keyboards/crkbd/split_util.c +++ b/keyboards/crkbd/rev1/split_util.c @@ -7,12 +7,11 @@ #include "split_util.h" #include "matrix.h" #include "keyboard.h" -#include "config.h" #ifdef USE_MATRIX_I2C # include "i2c.h" #else -# include "serial.h" +# include "split_scomm.h" #endif volatile bool isLeftHand = true; diff --git a/keyboards/crkbd/split_util.h b/keyboards/crkbd/rev1/split_util.h similarity index 81% rename from keyboards/crkbd/split_util.h rename to keyboards/crkbd/rev1/split_util.h index 687ca19bd..f59304756 100644 --- a/keyboards/crkbd/split_util.h +++ b/keyboards/crkbd/rev1/split_util.h @@ -1,5 +1,4 @@ -#ifndef SPLIT_KEYBOARD_UTIL_H -#define SPLIT_KEYBOARD_UTIL_H +#pragma once #include #include "eeconfig.h" @@ -15,5 +14,3 @@ void split_keyboard_setup(void); bool has_usb(void); void matrix_master_OLED_init (void); - -#endif diff --git a/keyboards/crkbd/rules.mk b/keyboards/crkbd/rules.mk index d88daebf3..6396b115d 100644 --- a/keyboards/crkbd/rules.mk +++ b/keyboards/crkbd/rules.mk @@ -1,7 +1,9 @@ -SRC += i2c.c \ - serial.c \ - split_util.c \ - ssd1306.c +SRC += i2c.c +SRC += serial.c +SRC += ssd1306.c + +# if firmware size over limit, try this option +# CFLAGS += -flto # MCU name #MCU = at90usb1287 diff --git a/keyboards/crkbd/serial.c b/keyboards/crkbd/serial.c index e918ab6ee..11ceff0b3 100644 --- a/keyboards/crkbd/serial.c +++ b/keyboards/crkbd/serial.c @@ -9,36 +9,128 @@ #include #include #include +#include #include #include "serial.h" +//#include #ifdef USE_SERIAL -// Serial pulse period in microseconds. Its probably a bad idea to lower this -// value. -#define SERIAL_DELAY 24 +#ifndef SERIAL_USE_MULTI_TRANSACTION +/* --- USE Simple API (OLD API, compatible with let's split serial.c) */ + #if SERIAL_SLAVE_BUFFER_LENGTH > 0 + uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; + #endif + #if SERIAL_MASTER_BUFFER_LENGTH > 0 + uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0}; + #endif + uint8_t volatile status0 = 0; -uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; -uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0}; +SSTD_t transactions[] = { + { (uint8_t *)&status0, + #if SERIAL_MASTER_BUFFER_LENGTH > 0 + sizeof(serial_master_buffer), (uint8_t *)serial_master_buffer, + #else + 0, (uint8_t *)NULL, + #endif + #if SERIAL_SLAVE_BUFFER_LENGTH > 0 + sizeof(serial_slave_buffer), (uint8_t *)serial_slave_buffer + #else + 0, (uint8_t *)NULL, + #endif + } +}; -#define SLAVE_DATA_CORRUPT (1<<0) -volatile uint8_t status = 0; +void serial_master_init(void) +{ soft_serial_initiator_init(transactions); } + +void serial_slave_init(void) +{ soft_serial_target_init(transactions); } + +// 0 => no error +// 1 => slave did not respond +// 2 => checksum error +int serial_update_buffers() +{ return soft_serial_transaction(); } + +#endif // Simple API (OLD API, compatible with let's split serial.c) + +#define ALWAYS_INLINE __attribute__((always_inline)) +#define NO_INLINE __attribute__((noinline)) +#define _delay_sub_us(x) __builtin_avr_delay_cycles(x) + +// Serial pulse period in microseconds. +#define TID_SEND_ADJUST 14 + +#define SELECT_SERIAL_SPEED 1 +#if SELECT_SERIAL_SPEED == 0 + // Very High speed + #define SERIAL_DELAY 4 // micro sec + #define READ_WRITE_START_ADJUST 33 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles +#elif SELECT_SERIAL_SPEED == 1 + // High speed + #define SERIAL_DELAY 6 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles +#elif SELECT_SERIAL_SPEED == 2 + // Middle speed + #define SERIAL_DELAY 12 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles +#elif SELECT_SERIAL_SPEED == 3 + // Low speed + #define SERIAL_DELAY 24 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles +#elif SELECT_SERIAL_SPEED == 4 + // Very Low speed + #define SERIAL_DELAY 50 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles +#else +#error Illegal Serial Speed +#endif + + +#define SERIAL_DELAY_HALF1 (SERIAL_DELAY/2) +#define SERIAL_DELAY_HALF2 (SERIAL_DELAY - SERIAL_DELAY/2) + +#define SLAVE_INT_WIDTH_US 1 +#ifndef SERIAL_USE_MULTI_TRANSACTION + #define SLAVE_INT_RESPONSE_TIME SERIAL_DELAY +#else + #define SLAVE_INT_ACK_WIDTH_UNIT 2 + #define SLAVE_INT_ACK_WIDTH 4 +#endif + +static SSTD_t *Transaction_table = NULL; inline static void serial_delay(void) { _delay_us(SERIAL_DELAY); } -void serial_delay_short(void) { - _delay_us(SERIAL_DELAY-1); + +inline static +void serial_delay_half1(void) { + _delay_us(SERIAL_DELAY_HALF1); } + +inline static +void serial_delay_half2(void) { + _delay_us(SERIAL_DELAY_HALF2); +} + +inline static void serial_output(void) ALWAYS_INLINE; inline static void serial_output(void) { SERIAL_PIN_DDR |= SERIAL_PIN_MASK; } // make the serial pin an input with pull-up resistor +inline static void serial_input_with_pullup(void) ALWAYS_INLINE; inline static -void serial_input(void) { +void serial_input_with_pullup(void) { SERIAL_PIN_DDR &= ~SERIAL_PIN_MASK; SERIAL_PIN_PORT |= SERIAL_PIN_MASK; } @@ -48,191 +140,305 @@ uint8_t serial_read_pin(void) { return !!(SERIAL_PIN_INPUT & SERIAL_PIN_MASK); } +inline static void serial_low(void) ALWAYS_INLINE; inline static void serial_low(void) { SERIAL_PIN_PORT &= ~SERIAL_PIN_MASK; } +inline static void serial_high(void) ALWAYS_INLINE; inline static void serial_high(void) { SERIAL_PIN_PORT |= SERIAL_PIN_MASK; } -void serial_master_init(void) { - serial_output(); - serial_high(); +void soft_serial_initiator_init(SSTD_t *sstd_table) +{ + Transaction_table = sstd_table; + serial_output(); + serial_high(); } -void serial_slave_init(void) { - serial_input(); +void soft_serial_target_init(SSTD_t *sstd_table) +{ + Transaction_table = sstd_table; + serial_input_with_pullup(); -#ifndef USE_SERIAL_PD2 - // Enable INT0 - EIMSK |= _BV(INT0); - // Trigger on falling edge of INT0 - EICRA &= ~(_BV(ISC00) | _BV(ISC01)); +#if SERIAL_PIN_MASK == _BV(PD0) + // Enable INT0 + EIMSK |= _BV(INT0); + // Trigger on falling edge of INT0 + EICRA &= ~(_BV(ISC00) | _BV(ISC01)); +#elif SERIAL_PIN_MASK == _BV(PD2) + // Enable INT2 + EIMSK |= _BV(INT2); + // Trigger on falling edge of INT2 + EICRA &= ~(_BV(ISC20) | _BV(ISC21)); #else - // Enable INT2 - EIMSK |= _BV(INT2); - // Trigger on falling edge of INT2 - EICRA &= ~(_BV(ISC20) | _BV(ISC21)); + #error unknown SERIAL_PIN_MASK value #endif } -// Used by the master to synchronize timing with the slave. +// Used by the sender to synchronize timing with the reciver. +static void sync_recv(void) NO_INLINE; static void sync_recv(void) { - serial_input(); - // This shouldn't hang if the slave disconnects because the - // serial line will float to high if the slave does disconnect. + for (uint8_t i = 0; i < SERIAL_DELAY*5 && serial_read_pin(); i++ ) { + } + // This shouldn't hang if the target disconnects because the + // serial line will float to high if the target does disconnect. while (!serial_read_pin()); - //serial_delay(); - _delay_us(SERIAL_DELAY-5); } -// Used by the slave to send a synchronization signal to the master. +// Used by the reciver to send a synchronization signal to the sender. +static void sync_send(void)NO_INLINE; static void sync_send(void) { - serial_output(); - serial_low(); serial_delay(); - serial_high(); } // Reads a byte from the serial line -static -uint8_t serial_read_byte(void) { - uint8_t byte = 0; - serial_input(); - for ( uint8_t i = 0; i < 8; ++i) { - byte = (byte << 1) | serial_read_pin(); - serial_delay(); - _delay_us(1); +static uint8_t serial_read_chunk(uint8_t *pterrcount, uint8_t bit) NO_INLINE; +static uint8_t serial_read_chunk(uint8_t *pterrcount, uint8_t bit) { + uint8_t byte, i, p, pb; + + _delay_sub_us(READ_WRITE_START_ADJUST); + for( i = 0, byte = 0, p = 0; i < bit; i++ ) { + serial_delay_half1(); // read the middle of pulses + if( serial_read_pin() ) { + byte = (byte << 1) | 1; p ^= 1; + } else { + byte = (byte << 1) | 0; p ^= 0; + } + _delay_sub_us(READ_WRITE_WIDTH_ADJUST); + serial_delay_half2(); } + /* recive parity bit */ + serial_delay_half1(); // read the middle of pulses + pb = serial_read_pin(); + _delay_sub_us(READ_WRITE_WIDTH_ADJUST); + serial_delay_half2(); + + *pterrcount += (p != pb)? 1 : 0; return byte; } // Sends a byte with MSB ordering -static -void serial_write_byte(uint8_t data) { - uint8_t b = 8; - serial_output(); - while( b-- ) { - if(data & (1 << b)) { - serial_high(); - } else { - serial_low(); +void serial_write_chunk(uint8_t data, uint8_t bit) NO_INLINE; +void serial_write_chunk(uint8_t data, uint8_t bit) { + uint8_t b, p; + for( p = 0, b = 1<<(bit-1); b ; b >>= 1) { + if(data & b) { + serial_high(); p ^= 1; + } else { + serial_low(); p ^= 0; + } + serial_delay(); } + /* send parity bit */ + if(p & 1) { serial_high(); } + else { serial_low(); } serial_delay(); + + serial_low(); // sync_send() / senc_recv() need raise edge +} + +static void serial_send_packet(uint8_t *buffer, uint8_t size) NO_INLINE; +static +void serial_send_packet(uint8_t *buffer, uint8_t size) { + for (uint8_t i = 0; i < size; ++i) { + uint8_t data; + data = buffer[i]; + sync_send(); + serial_write_chunk(data,8); } } -// interrupt handle to be used by the slave device +static uint8_t serial_recive_packet(uint8_t *buffer, uint8_t size) NO_INLINE; +static +uint8_t serial_recive_packet(uint8_t *buffer, uint8_t size) { + uint8_t pecount = 0; + for (uint8_t i = 0; i < size; ++i) { + uint8_t data; + sync_recv(); + data = serial_read_chunk(&pecount, 8); + buffer[i] = data; + } + return pecount == 0; +} + +inline static +void change_sender2reciver(void) { + sync_send(); //0 + serial_delay_half1(); //1 + serial_low(); //2 + serial_input_with_pullup(); //2 + serial_delay_half1(); //3 +} + +inline static +void change_reciver2sender(void) { + sync_recv(); //0 + serial_delay(); //1 + serial_low(); //3 + serial_output(); //3 + serial_delay_half1(); //4 +} + +// interrupt handle to be used by the target device ISR(SERIAL_PIN_INTERRUPT) { - sync_send(); - uint8_t checksum = 0; - for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) { - serial_write_byte(serial_slave_buffer[i]); - sync_send(); - checksum += serial_slave_buffer[i]; - } - serial_write_byte(checksum); - sync_send(); +#ifndef SERIAL_USE_MULTI_TRANSACTION + serial_low(); + serial_output(); + SSTD_t *trans = Transaction_table; +#else + // recive transaction table index + uint8_t tid; + uint8_t pecount = 0; + sync_recv(); + tid = serial_read_chunk(&pecount,4); + if(pecount> 0) + return; + serial_delay_half1(); - // wait for the sync to finish sending - serial_delay(); + serial_high(); // response step1 low->high + serial_output(); + _delay_sub_us(SLAVE_INT_ACK_WIDTH_UNIT*SLAVE_INT_ACK_WIDTH); + SSTD_t *trans = &Transaction_table[tid]; + serial_low(); // response step2 ack high->low +#endif - // read the middle of pulses - _delay_us(SERIAL_DELAY/2); + // target send phase + if( trans->target2initiator_buffer_size > 0 ) + serial_send_packet((uint8_t *)trans->target2initiator_buffer, + trans->target2initiator_buffer_size); + // target switch to input + change_sender2reciver(); - uint8_t checksum_computed = 0; - for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) { - serial_master_buffer[i] = serial_read_byte(); - sync_send(); - checksum_computed += serial_master_buffer[i]; - } - uint8_t checksum_received = serial_read_byte(); - sync_send(); - - serial_input(); // end transaction - - if ( checksum_computed != checksum_received ) { - status |= SLAVE_DATA_CORRUPT; + // target recive phase + if( trans->initiator2target_buffer_size > 0 ) { + if (serial_recive_packet((uint8_t *)trans->initiator2target_buffer, + trans->initiator2target_buffer_size) ) { + *trans->status = TRANSACTION_ACCEPTED; + } else { + *trans->status = TRANSACTION_DATA_ERROR; + } } else { - status &= ~SLAVE_DATA_CORRUPT; + *trans->status = TRANSACTION_ACCEPTED; } + + sync_recv(); //weit initiator output to high } -inline -bool serial_slave_DATA_CORRUPT(void) { - return status & SLAVE_DATA_CORRUPT; -} - -// Copies the serial_slave_buffer to the master and sends the -// serial_master_buffer to the slave. +///////// +// start transaction by initiator +// +// int soft_serial_transaction(int sstd_index) // // Returns: -// 0 => no error -// 1 => slave did not respond -int serial_update_buffers(void) { - // this code is very time dependent, so we need to disable interrupts +// TRANSACTION_END +// TRANSACTION_NO_RESPONSE +// TRANSACTION_DATA_ERROR +// this code is very time dependent, so we need to disable interrupts +#ifndef SERIAL_USE_MULTI_TRANSACTION +int soft_serial_transaction(void) { + SSTD_t *trans = Transaction_table; +#else +int soft_serial_transaction(int sstd_index) { + SSTD_t *trans = &Transaction_table[sstd_index]; +#endif cli(); - // signal to the slave that we want to start a transaction + // signal to the target that we want to start a transaction serial_output(); serial_low(); - _delay_us(1); + _delay_us(SLAVE_INT_WIDTH_US); - // wait for the slaves response - serial_input(); - serial_high(); - _delay_us(SERIAL_DELAY); +#ifndef SERIAL_USE_MULTI_TRANSACTION + // wait for the target response + serial_input_with_pullup(); + _delay_us(SLAVE_INT_RESPONSE_TIME); - // check if the slave is present + // check if the target is present if (serial_read_pin()) { - // slave failed to pull the line low, assume not present + // target failed to pull the line low, assume not present + serial_output(); + serial_high(); + *trans->status = TRANSACTION_NO_RESPONSE; sei(); - return 1; + return TRANSACTION_NO_RESPONSE; } - // if the slave is present syncronize with it - sync_recv(); +#else + // send transaction table index + sync_send(); + _delay_sub_us(TID_SEND_ADJUST); + serial_write_chunk(sstd_index, 4); + serial_delay_half1(); - uint8_t checksum_computed = 0; - // receive data from the slave - for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) { - serial_slave_buffer[i] = serial_read_byte(); - sync_recv(); - checksum_computed += serial_slave_buffer[i]; - } - uint8_t checksum_received = serial_read_byte(); - sync_recv(); - - if (checksum_computed != checksum_received) { - sei(); - return 2; + // wait for the target response (step1 low->high) + serial_input_with_pullup(); + while( !serial_read_pin() ) { + _delay_sub_us(2); } - uint8_t checksum = 0; - // send data to the slave - for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) { - serial_write_byte(serial_master_buffer[i]); - sync_recv(); - checksum += serial_master_buffer[i]; + // check if the target is present (step2 high->low) + for( int i = 0; serial_read_pin(); i++ ) { + if (i > SLAVE_INT_ACK_WIDTH + 1) { + // slave failed to pull the line low, assume not present + serial_output(); + serial_high(); + *trans->status = TRANSACTION_NO_RESPONSE; + sei(); + return TRANSACTION_NO_RESPONSE; + } + _delay_sub_us(SLAVE_INT_ACK_WIDTH_UNIT); + } +#endif + + // initiator recive phase + // if the target is present syncronize with it + if( trans->target2initiator_buffer_size > 0 ) { + if (!serial_recive_packet((uint8_t *)trans->target2initiator_buffer, + trans->target2initiator_buffer_size) ) { + serial_output(); + serial_high(); + *trans->status = TRANSACTION_DATA_ERROR; + sei(); + return TRANSACTION_DATA_ERROR; + } + } + + // initiator switch to output + change_reciver2sender(); + + // initiator send phase + if( trans->initiator2target_buffer_size > 0 ) { + serial_send_packet((uint8_t *)trans->initiator2target_buffer, + trans->initiator2target_buffer_size); } - serial_write_byte(checksum); - sync_recv(); // always, release the line when not in use - serial_output(); - serial_high(); + sync_send(); + *trans->status = TRANSACTION_END; sei(); - return 0; + return TRANSACTION_END; } +#ifdef SERIAL_USE_MULTI_TRANSACTION +int soft_serial_get_and_clean_status(int sstd_index) { + SSTD_t *trans = &Transaction_table[sstd_index]; + cli(); + int retval = *trans->status; + *trans->status = 0;; + sei(); + return retval; +} +#endif + #endif diff --git a/keyboards/crkbd/serial.h b/keyboards/crkbd/serial.h index 43e51f7fa..76c6aaa04 100644 --- a/keyboards/crkbd/serial.h +++ b/keyboards/crkbd/serial.h @@ -1,32 +1,77 @@ -#ifndef MY_SERIAL_H -#define MY_SERIAL_H +#pragma once -#include "config.h" #include -/* TODO: some defines for interrupt setup */ -#define SERIAL_PIN_DDR DDRD -#define SERIAL_PIN_PORT PORTD -#define SERIAL_PIN_INPUT PIND +// ///////////////////////////////////////////////////////////////// +// Need Soft Serial defines in serial_config.h +// ///////////////////////////////////////////////////////////////// +// ex. +// #define SERIAL_PIN_DDR DDRD +// #define SERIAL_PIN_PORT PORTD +// #define SERIAL_PIN_INPUT PIND +// #define SERIAL_PIN_MASK _BV(PD?) ?=0,2 +// #define SERIAL_PIN_INTERRUPT INT?_vect ?=0,2 +// +// //// USE Simple API (OLD API, compatible with let's split serial.c) +// ex. +// #define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 +// #define SERIAL_MASTER_BUFFER_LENGTH 1 +// +// //// USE flexible API (using multi-type transaction function) +// #define SERIAL_USE_MULTI_TRANSACTION +// +// ///////////////////////////////////////////////////////////////// -#ifndef USE_SERIAL_PD2 -#define SERIAL_PIN_MASK _BV(PD0) -#define SERIAL_PIN_INTERRUPT INT0_vect -#else -#define SERIAL_PIN_MASK _BV(PD2) -#define SERIAL_PIN_INTERRUPT INT2_vect -#endif -#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 -#define SERIAL_MASTER_BUFFER_LENGTH MATRIX_ROWS/2 - -// Buffers for master - slave communication +#ifndef SERIAL_USE_MULTI_TRANSACTION +/* --- USE Simple API (OLD API, compatible with let's split serial.c) */ +#if SERIAL_SLAVE_BUFFER_LENGTH > 0 extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH]; +#endif +#if SERIAL_MASTER_BUFFER_LENGTH > 0 extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH]; +#endif void serial_master_init(void); void serial_slave_init(void); int serial_update_buffers(void); -bool serial_slave_data_corrupt(void); +#endif // USE Simple API + +// Soft Serial Transaction Descriptor +typedef struct _SSTD_t { + uint8_t *status; + uint8_t initiator2target_buffer_size; + uint8_t *initiator2target_buffer; + uint8_t target2initiator_buffer_size; + uint8_t *target2initiator_buffer; +} SSTD_t; + +// initiator is transaction start side +void soft_serial_initiator_init(SSTD_t *sstd_table); +// target is interrupt accept side +void soft_serial_target_init(SSTD_t *sstd_table); + +// initiator resullt +#define TRANSACTION_END 0 +#define TRANSACTION_NO_RESPONSE 0x1 +#define TRANSACTION_DATA_ERROR 0x2 +#ifndef SERIAL_USE_MULTI_TRANSACTION +int soft_serial_transaction(void); +#else +int soft_serial_transaction(int sstd_index); +#endif + +// target status +// *SSTD_t.status has +// initiator: +// TRANSACTION_END +// or TRANSACTION_NO_RESPONSE +// or TRANSACTION_DATA_ERROR +// target: +// TRANSACTION_DATA_ERROR +// or TRANSACTION_ACCEPTED +#define TRANSACTION_ACCEPTED 0x4 +#ifdef SERIAL_USE_MULTI_TRANSACTION +int soft_serial_get_and_clean_status(int sstd_index); #endif diff --git a/keyboards/crkbd/ssd1306.c b/keyboards/crkbd/ssd1306.c index d07900119..b8f9512e3 100644 --- a/keyboards/crkbd/ssd1306.c +++ b/keyboards/crkbd/ssd1306.c @@ -123,6 +123,7 @@ static int8_t capture_sendchar(uint8_t c) { bool iota_gfx_init(bool rotate) { bool success = false; + i2c_master_init(); send_cmd1(DisplayOff); send_cmd2(SetDisplayClockDiv, 0x80); send_cmd2(SetMultiPlex, DisplayHeight - 1); diff --git a/keyboards/crkbd/ssd1306.h b/keyboards/crkbd/ssd1306.h index 59d31c9f3..76dd6a2a7 100644 --- a/keyboards/crkbd/ssd1306.h +++ b/keyboards/crkbd/ssd1306.h @@ -1,10 +1,8 @@ -#ifndef SSD1306_H -#define SSD1306_H +#pragma once #include #include #include "pincontrol.h" -#include "config.h" enum ssd1306_cmds { DisplayOff = 0xAE, @@ -88,7 +86,3 @@ void matrix_write(struct CharacterMatrix *matrix, const char *data); void matrix_write_ln(struct CharacterMatrix *matrix, const char *data); void matrix_write_P(struct CharacterMatrix *matrix, const char *data); void matrix_render(struct CharacterMatrix *matrix); - - - -#endif From dd29b642564896f3753721db364b6413e501e6c1 Mon Sep 17 00:00:00 2001 From: Christon DeWan Date: Mon, 3 Sep 2018 16:35:27 -0700 Subject: [PATCH 047/788] Keyboard: Add support for Diverge TM2 (#3829) * pulling in diverge tm2 from staging branch * cleaned up comments, docs, licenses * refactored apparent grid to make 2u spacebars more obvious * various delinting from noroadsleft review * most of drashna's feedback responded to - lots of lint swept - used more modern tri-layer functions - still need to adopt modern split support. * switch to common split code. remove comment cruft * tapping force hold makes LT way more usable for rapid , sequences --- keyboards/divergetm2/config.h | 79 +++++++ keyboards/divergetm2/divergetm2.c | 17 ++ keyboards/divergetm2/divergetm2.h | 74 +++++++ keyboards/divergetm2/keymaps/default/config.h | 23 ++ keyboards/divergetm2/keymaps/default/keymap.c | 200 ++++++++++++++++++ .../divergetm2/keymaps/default/readme.md | 5 + keyboards/divergetm2/keymaps/default/rules.mk | 0 .../divergetm2/keymaps/xtonhasvim/config.h | 23 ++ .../divergetm2/keymaps/xtonhasvim/keymap.c | 155 ++++++++++++++ .../divergetm2/keymaps/xtonhasvim/readme.md | 9 + .../divergetm2/keymaps/xtonhasvim/rules.mk | 3 + keyboards/divergetm2/readme.md | 21 ++ keyboards/divergetm2/rules.mk | 75 +++++++ 13 files changed, 684 insertions(+) create mode 100644 keyboards/divergetm2/config.h create mode 100644 keyboards/divergetm2/divergetm2.c create mode 100644 keyboards/divergetm2/divergetm2.h create mode 100644 keyboards/divergetm2/keymaps/default/config.h create mode 100644 keyboards/divergetm2/keymaps/default/keymap.c create mode 100644 keyboards/divergetm2/keymaps/default/readme.md create mode 100644 keyboards/divergetm2/keymaps/default/rules.mk create mode 100644 keyboards/divergetm2/keymaps/xtonhasvim/config.h create mode 100644 keyboards/divergetm2/keymaps/xtonhasvim/keymap.c create mode 100644 keyboards/divergetm2/keymaps/xtonhasvim/readme.md create mode 100644 keyboards/divergetm2/keymaps/xtonhasvim/rules.mk create mode 100644 keyboards/divergetm2/readme.md create mode 100644 keyboards/divergetm2/rules.mk diff --git a/keyboards/divergetm2/config.h b/keyboards/divergetm2/config.h new file mode 100644 index 000000000..8bc9d2c80 --- /dev/null +++ b/keyboards/divergetm2/config.h @@ -0,0 +1,79 @@ +/* Copyright 2018 Christon DeWan (xton) + * Copyright 2017 IslandMan93 + * + * 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 . + */ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x1256 +#define DEVICE_VER 0x0001 +#define MANUFACTURER UniKeyboard +#define PRODUCT diverge tm2 +#define DESCRIPTION Split 46 key keyboard + +/* key matrix size */ +#define MATRIX_ROWS 8 +#define MATRIX_COLS 6 + +/* + * 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 { D7, E6, B4, B5 } +#define MATRIX_COL_PINS { F6, F7, B1, B3, B2, B6 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION ROW2COL + + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* number of backlight levels */ + +/* 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 + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + + diff --git a/keyboards/divergetm2/divergetm2.c b/keyboards/divergetm2/divergetm2.c new file mode 100644 index 000000000..61ea45416 --- /dev/null +++ b/keyboards/divergetm2/divergetm2.c @@ -0,0 +1,17 @@ +/* Copyright 2018 Christon DeWan (xton) + * Copyright 2017 IslandMan93 + * + * 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 . + */ +#include "divergetm2.h" diff --git a/keyboards/divergetm2/divergetm2.h b/keyboards/divergetm2/divergetm2.h new file mode 100644 index 000000000..50144b1d2 --- /dev/null +++ b/keyboards/divergetm2/divergetm2.h @@ -0,0 +1,74 @@ +/* Copyright 2018 Christon DeWan (xton) + * Copyright 2017 IslandMan93 + * + * 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 . + */ + +#pragma once + +//void promicro_bootloader_jmp(bool program); +#include "quantum.h" + + +#ifdef USE_I2C +#include +#ifdef __AVR__ + #include + #include +#endif +#endif + +//void promicro_bootloader_jmp(bool program); + +#ifndef FLIP_HALF +// Standard Keymap +// (TRRS jack on the left half is to the right, TRRS jack on the right half is to the left) +#define LAYOUT( \ + L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \ + L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \ + L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \ + L30, L31, L32, L33, L34, R31, R32, R33, R34, R35 \ + ) \ + { \ + { L00, L01, L02, L03, L04, L05 }, \ + { L10, L11, L12, L13, L14, L15 }, \ + { L20, L21, L22, L23, L24, L25 }, \ + { L30, L31, L32, L33, L34, KC_NO }, \ + { R05, R04, R03, R02, R01, R00 }, \ + { R15, R14, R13, R12, R11, R10 }, \ + { R25, R24, R23, R22, R21, R20 }, \ + { R35, R34, R33, R32, R31, KC_NO } \ + } +#else +// Keymap with right side flipped +// (TRRS jack on both halves are to the right) +#define LAYOUT( \ + L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \ + L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \ + L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \ + L30, L31, L32, L33, L34, R31, R32, R33, R34, R35 \ + ) \ + { \ + { L00, L01, L02, L03, L04, L05 }, \ + { L10, L11, L12, L13, L14, L15 }, \ + { L20, L21, L22, L23, L24, L25 }, \ + { L30, L31, L32, L33, L34, KC_NO }, \ + { R00, R01, R02, R03, R04, R05 }, \ + { R10, R11, R12, R13, R14, R15 }, \ + { R20, R21, R22, R23, R24, R25 }, \ + { KC_NO, R31, R32, R33, R34, R35 } \ + } +#endif + +#define LAYOUT_ortho_4x12_2x2u LAYOUT diff --git a/keyboards/divergetm2/keymaps/default/config.h b/keyboards/divergetm2/keymaps/default/config.h new file mode 100644 index 000000000..ccd00621f --- /dev/null +++ b/keyboards/divergetm2/keymaps/default/config.h @@ -0,0 +1,23 @@ +/* Copyright 2018 Christon DeWan (xton) + * Copyright 2017 IslandMan93 + * + * 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 . + */ + +#pragma once + +// place overrides here +#define MASTER_RIGHT +#define PERMISSIVE_HOLD +#define TAPPING_TERM 150 diff --git a/keyboards/divergetm2/keymaps/default/keymap.c b/keyboards/divergetm2/keymaps/default/keymap.c new file mode 100644 index 000000000..068705970 --- /dev/null +++ b/keyboards/divergetm2/keymaps/default/keymap.c @@ -0,0 +1,200 @@ +/* Copyright 2018 Christon DeWan (xton) + * Copyright 2017 IslandMan93 + * + * 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 . + */ + +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _LOWER 3 +#define _RAISE 4 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK +}; + + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | Ctrl | Alt | GUI | Lower | Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = LAYOUT_ortho_4x12_2x2u( \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ + RESET, KC_LCTL, KC_LALT, KC_LGUI, LT(_LOWER, KC_SPC), LT(_RAISE,KC_SPC), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Colemak + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | R | S | T | D | H | N | E | I | O | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | Ctrl | Alt | GUI | Lower | Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_COLEMAK] = LAYOUT_ortho_4x12_2x2u( \ + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, \ + KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ + KC_NO, KC_LCTL, KC_LALT, KC_LGUI, LT(_LOWER, KC_SPC), LT(_RAISE,KC_SPC), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Dvorak + * ,-----------------------------------------------------------------------------------. + * | Tab | " | , | . | P | Y | F | G | C | R | L | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | O | E | U | I | D | H | T | N | S | / | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | Ctrl | Alt | GUI | Lower | Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_DVORAK] = LAYOUT_ortho_4x12_2x2u( \ + KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, \ + KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, \ + KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT , \ + KC_NO, KC_LCTL, KC_LALT, KC_LGUI, LT(_LOWER, KC_SPC), LT(_RAISE,KC_SPC), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | | \ | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT_ortho_4x12_2x2u( \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ + BL_STEP, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______, \ + _______, _______, _______, _______, _______, MO(_RAISE), KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT_ortho_4x12_2x2u( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, _______, _______, _______, \ + _______, _______, _______, _______, MO(_LOWER), _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | Reset| | | | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = LAYOUT_ortho_4x12_2x2u( \ + _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ + _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ +) + + +}; + +#ifdef AUDIO_ENABLE +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +float tone_dvorak[][2] = SONG(DVORAK_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); +#endif + +#define SPACE_WAIT 100 +uint16_t rl_start_time = 0; + + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if(rl_start_time && record->event.pressed) rl_start_time = 0; + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_qwerty); + #endif + set_single_persistent_default_layer(1UL<<_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_colemak); + #endif + set_single_persistent_default_layer(1UL<<_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_dvorak); + #endif + set_single_persistent_default_layer(1UL<<_DVORAK); + } + return false; + break; + } + return true; +} + +uint32_t layer_state_set_user(uint32_t state) { + return update_tri_layer_state(state, _RAISE, _LOWER, _ADJUST); +} diff --git a/keyboards/divergetm2/keymaps/default/readme.md b/keyboards/divergetm2/keymaps/default/readme.md new file mode 100644 index 000000000..dceb4f8a9 --- /dev/null +++ b/keyboards/divergetm2/keymaps/default/readme.md @@ -0,0 +1,5 @@ +# A default-ish keymap for diverge tm2 + +Actually it's a Planck layout, but I needed something for the default. :-D + +The 2u spacebars are space when tapped, raise/lower when held. diff --git a/keyboards/divergetm2/keymaps/default/rules.mk b/keyboards/divergetm2/keymaps/default/rules.mk new file mode 100644 index 000000000..e69de29bb diff --git a/keyboards/divergetm2/keymaps/xtonhasvim/config.h b/keyboards/divergetm2/keymaps/xtonhasvim/config.h new file mode 100644 index 000000000..4ba4a5716 --- /dev/null +++ b/keyboards/divergetm2/keymaps/xtonhasvim/config.h @@ -0,0 +1,23 @@ +#pragma once + +// help for fast typist+dual function keys? +#define PERMISSIVE_HOLD +// Let me type `ls -l` more quickly. +#define TAPPING_FORCE_HOLD + +// where is the cord plugged in? +#define MASTER_RIGHT + +/* speed up mousekeys a bit */ +#define MOUSEKEY_DELAY 50 +#define MOUSEKEY_INTERVAL 20 +#define MOUSEKEY_MAX_SPEED 8 +#define MOUSEKEY_TIME_TO_MAX 30 +#define MOUSEKEY_WHEEL_MAX_SPEED 8 +#define MOUSEKEY_WHEEL_TIME_TO_MAX 40 + +// because I'm lazy and didn't case out the rgb support +#define RGBLED_NUM 2 + +#define BACKLIGHT_PIN B7 +#define BACKLIGHT_LEVELS 3 diff --git a/keyboards/divergetm2/keymaps/xtonhasvim/keymap.c b/keyboards/divergetm2/keymaps/xtonhasvim/keymap.c new file mode 100644 index 000000000..9d5135baa --- /dev/null +++ b/keyboards/divergetm2/keymaps/xtonhasvim/keymap.c @@ -0,0 +1,155 @@ + /* Copyright 2018 Christon DeWan + * + * 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 . + */ + +#include QMK_KEYBOARD_H +#include "xtonhasvim.h" + +/************************************ + * states + ************************************/ + +enum layers { + _QWERTY, + _LOWER, + _RAISE, + _ADJUST, + _MOVE, + _MOUSE, + _CMD +}; + +extern uint8_t vim_cmd_layer(void) { return _CMD; } + +enum keymap_keycodes { + RAISE = VIM_SAFE_RANGE, + LOWER +}; + +/************************************ + * keymaps! + ************************************/ + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Ctrl*| A | S | D | F | G | H | J | K | L | ;* | ' | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | chkwm| | Alt | GUI | Lower* | Raise* | SPC | GUI | | Vim | + * `-----------------------------------------------------------------------------------' + * + * - Ctrl acts as Esc when tapped. + * - Holding ; switches to movement layer. + * - Tapping raise or lower produces space. + */ +[_QWERTY] = LAYOUT_ortho_4x12_2x2u( \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + LCTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, LT(_MOVE,KC_SCLN), KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, RSFT_T(KC_ENT) , \ + LSFT(KC_LALT), MO(_MOVE), KC_LALT, KC_LGUI, LT(_LOWER, KC_SPC), LT(_RAISE, KC_SPC), KC_RGUI, KC_RALT, MO(_MOVE), VIM_START \ +), + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ~ | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | ! | @ | # | $ | % | ^ | & | * | ( | ) | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | | Next | Vol- | Vol+ | Play | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | Bail | | | | Raise | | | Bail | | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT_ortho_4x12_2x2u( \ + KC_TILD, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_BSPC, \ + KC_DEL, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_PIPE, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, X_____X, X_____X, X_____X, X_____X, FIREY_RETURN, \ + RESET, TO(_QWERTY), _______, _______, _______, MO(_RAISE), _______, _______, TO(_QWERTY), X_____X \ +), + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | | Next | Vol- | Vol+ | Play | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | Bail | | | Lower | | | | Bail | | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT_ortho_4x12_2x2u( \ + KC_GRV, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSPC, \ + KC_DEL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSLS, \ + _______, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, FIREY_RETURN, \ + X_____X, TO(_QWERTY), _______, _______, MO(_LOWER), _______, _______, _______, TO(_QWERTY), RESET \ +), + + +/* Adjust (Lower + Raise) + * ,-------------------------------------------------------------------------------------. + * |BL Raise| | | | | | | | | | | | + * |--------+------+------+------+------+-------------+------+------+------+------+------| + * |BL Lower| | | | | | | | | | | | + * |--------+------+------+------+------+------|------+------+------+------+------+------| + * |BL STEP | | | | | | | Next | Vol- | Vol+ | Play | | + * |--------+------+------+------+------+------+------+------+------+------+------+------| + * |Backlite| Mouse| | | | | | | Bail | | + * `-------------------------------------------------------------------------------------' + */ +[_ADJUST] = LAYOUT_ortho_4x12_2x2u( \ + BL_INC, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, \ + BL_DEC, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, \ + BL_STEP, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, X_____X, \ + BL_TOGG, TO(_MOUSE), _______, _______, _______, _______, _______, _______, TO(_QWERTY), X_____X \ +), + + +/* movement layer (hold semicolon) */ +[_MOVE] = LAYOUT_ortho_4x12_2x2u( \ + TO(_QWERTY), X_____X, X_____X, X_____X, X_____X, X_____X, KC_HOME, KC_PGDN, KC_PGUP, KC_END, X_____X, X_____X, \ + _______, X_____X, LGUI(KC_LBRC), LGUI(LSFT(KC_LBRC)), LGUI(LSFT(KC_RBRC)), LGUI(KC_RBRC), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, X_____X, \ + _______, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, X_____X \ +), + +/* mouse layer + */ +[_MOUSE] = LAYOUT_ortho_4x12_2x2u( \ + TO(_QWERTY), X_____X, X_____X, KC_MS_UP, X_____X, X_____X, KC_MS_WH_LEFT, KC_MS_WH_DOWN, KC_MS_WH_UP, KC_MS_WH_RIGHT, X_____X, X_____X , \ + _______, X_____X, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, X_____X, X_____X, KC_MS_BTN1, KC_MS_BTN2, KC_MS_BTN3, X_____X, X_____X, \ + _______, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, _______, \ + _______, TO(_QWERTY), _______, _______, _______, _______, _______, _______, TO(_QWERTY), X_____X \ +), + +/* vim command layer. + */ +[_CMD] = LAYOUT_ortho_4x12_2x2u( \ + X_____X, X_____X, VIM_W, VIM_E, X_____X, X_____X, VIM_Y, VIM_U, VIM_I, VIM_O, VIM_P, X_____X, \ + VIM_ESC, VIM_A, VIM_S, VIM_D, X_____X, VIM_G, VIM_H, VIM_J, VIM_K, VIM_L, X_____X, X_____X, \ + VIM_SHIFT, X_____X, VIM_X, VIM_C, VIM_V, VIM_B, X_____X, X_____X, VIM_COMMA, VIM_PERIOD, X_____X, VIM_SHIFT, \ + _______, TO(_QWERTY), _______, _______, X_____X, X_____X, _______, _______, TO(_QWERTY), X_____X \ +) + +}; + +uint32_t layer_state_set_user(uint32_t state) { + return update_tri_layer_state(state, _RAISE, _LOWER, _ADJUST); +} diff --git a/keyboards/divergetm2/keymaps/xtonhasvim/readme.md b/keyboards/divergetm2/keymaps/xtonhasvim/readme.md new file mode 100644 index 000000000..9ff4ce1f1 --- /dev/null +++ b/keyboards/divergetm2/keymaps/xtonhasvim/readme.md @@ -0,0 +1,9 @@ +# Xton has a tiny keyboard! With Vim! + +Based on the standard Planck layout with a few changes: + +* Escape moved to dual-function with control. +* Dedicated movement and mouse layers. +* Top and middle row swapped in `_RAISE` and `_LOWER` because I never use F-keys. +* Vim layers! See `users/xtonhasvim`. + diff --git a/keyboards/divergetm2/keymaps/xtonhasvim/rules.mk b/keyboards/divergetm2/keymaps/xtonhasvim/rules.mk new file mode 100644 index 000000000..ede4e02b6 --- /dev/null +++ b/keyboards/divergetm2/keymaps/xtonhasvim/rules.mk @@ -0,0 +1,3 @@ +MOUSEKEY_ENABLE = yes +# BACKLIGHT_ENABLE = yes +AUDIO_ENABLE = no diff --git a/keyboards/divergetm2/readme.md b/keyboards/divergetm2/readme.md new file mode 100644 index 000000000..893b82cb5 --- /dev/null +++ b/keyboards/divergetm2/readme.md @@ -0,0 +1,21 @@ +# diverge tm2 + +A 4x6x2 split ortholinear keyboard with 2u spacebars like the Levinson (similar to Let's Split). Made by [Unikeyboard](https://unikeyboard.io). + +Keyboard Maintainer: [IslandMan93](https://github.com/islandman93) and [xton](https://github.com/xton) +Hardware Supported: Pro Micro +Hardware Availability: [Diverge TM2](https://unikeyboard.io/product/diverge-tm/) + +Make example for this keyboard (after setting up your build environment): + + make divergetm2:default + +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). + +# Flashing the first time + +Disassemble the case so you have access to each Pro Micro. Flash each half with QMK Toolbox by connecting the USB cable and shorting RST and GND. After that, just use the soft reset key on your respective layout to reflash both halves. + +# Reflashing Animus + +Reflashing the stock firmware is pretty easy. Just follow the same steps in the [original guide](https://imgur.com/a/8UapN). You will have to manually reset the Pro Micro (by shorting the GND and RST) during the upload step. Then reapply your keymap through Arbites. diff --git a/keyboards/divergetm2/rules.mk b/keyboards/divergetm2/rules.mk new file mode 100644 index 000000000..2be853a2a --- /dev/null +++ b/keyboards/divergetm2/rules.mk @@ -0,0 +1,75 @@ + + +# MCU name +#MCU = at90usb1286 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +SPLIT_KEYBOARD = yes + +# must specify this to enable soft-reset +BOOTLOADER = caterina From 07fac2fbbff871827b17eba3a3740b8991e8c5d3 Mon Sep 17 00:00:00 2001 From: Christon DeWan Date: Mon, 3 Sep 2018 16:50:11 -0700 Subject: [PATCH 048/788] Keymap: xtonhasvim Levinson (#3837) * pulled in levinson from staging. * simplified trilayer handling and some other linting that bit me in the last code review * formatting --- .../levinson/keymaps/xtonhasvim/config.h | 35 +++ .../levinson/keymaps/xtonhasvim/keymap.c | 237 ++++++++++++++++++ .../levinson/keymaps/xtonhasvim/readme.md | 9 + .../levinson/keymaps/xtonhasvim/rules.mk | 5 + 4 files changed, 286 insertions(+) create mode 100644 keyboards/levinson/keymaps/xtonhasvim/config.h create mode 100644 keyboards/levinson/keymaps/xtonhasvim/keymap.c create mode 100644 keyboards/levinson/keymaps/xtonhasvim/readme.md create mode 100644 keyboards/levinson/keymaps/xtonhasvim/rules.mk diff --git a/keyboards/levinson/keymaps/xtonhasvim/config.h b/keyboards/levinson/keymaps/xtonhasvim/config.h new file mode 100644 index 000000000..bcd2220ce --- /dev/null +++ b/keyboards/levinson/keymaps/xtonhasvim/config.h @@ -0,0 +1,35 @@ +#pragma once + +#define USE_SERIAL + +// #define MUSIC_MASK (keycode != KC_NO) + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ + +// #define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + +// help for fast typist+dual function keys? +#define PERMISSIVE_HOLD + +// where is the cord plugged in? +#define MASTER_LEFT diff --git a/keyboards/levinson/keymaps/xtonhasvim/keymap.c b/keyboards/levinson/keymaps/xtonhasvim/keymap.c new file mode 100644 index 000000000..b9341ff35 --- /dev/null +++ b/keyboards/levinson/keymaps/xtonhasvim/keymap.c @@ -0,0 +1,237 @@ + /* Copyright 2015-2017 Christon DeWan + * + * 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 . + */ + +#include QMK_KEYBOARD_H +#include "xtonhasvim.h" +#include "fancylighting.h" + +/************************************ + * states + ************************************/ + +enum layers { + _QWERTY, + _LOWER, + _RAISE, + _ADJUST, + _MOVE, + _MOUSE, + _CMD +}; + +extern uint8_t vim_cmd_layer(void) { return _CMD; } + +/************************************ + * keymaps! + ************************************/ + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Ctrl*| A* | S | D | F | G | H | J | K | L | ;* | ' | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | chkwm| | Alt | GUI |Lower*| Sp|ace |Raise*| SPC | GUI | | Vim | + * `-----------------------------------------------------------------------------------' + * + * - Ctrl acts as Esc when tapped. + * - Holding A or ; switches to movement layer. + * - Raise and Lower are one-shot layers. + */ +[_QWERTY] = LAYOUT_ortho_4x12( \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + LCTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, LT(_MOVE,KC_SCLN), KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, RSFT_T(KC_ENT) , \ + LSFT(KC_LALT), MO(_MOVE), KC_LALT, KC_LGUI, MO(_LOWER), KC_SPC, KC_SPC, MO(_RAISE), KC_RGUI, KC_RALT, MO(_MOVE), VIM_START \ +), + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ~ | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | ! | @ | # | $ | % | ^ | & | * | ( | ) | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | | Next | Vol- | Vol+ | Play | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | Bail | | | | | |Raise | | | Bail | | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT_ortho_4x12( \ + KC_TILD, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_BSPC, \ + KC_DEL, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_PIPE, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, X_____X, X_____X, X_____X, X_____X, FIREY_RETURN, \ + RESET, TO(_QWERTY), _______, _______, _______, _______, _______, MO(_RAISE), _______, _______, TO(_QWERTY), X_____X \ +), + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | | Next | Vol- | Vol+ | Play | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | Bail | | |Lower | | | | | | Bail | | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT_ortho_4x12( \ + KC_GRV, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSPC, \ + KC_DEL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSLS, \ + _______, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, FIREY_RETURN, \ + X_____X, TO(_QWERTY), _______, _______, MO(_LOWER), _______, _______, _______, _______, _______, TO(_QWERTY), RESET \ +), + + +/* Adjust (Lower + Raise) + * ,-------------------------------------------------------------------------------------. + * |BL Raise| | | | | | | | | | | | + * |--------+------+------+------+------+-------------+------+------+------+------+------| + * |BL Lower| | | | | | | | | | | | + * |--------+------+------+------+------+------|------+------+------+------+------+------| + * |BL STEP | | | | | | | Next | Vol- | Vol+ | Play | | + * |--------+------+------+------+------+------+------+------+------+------+------+------| + * |Backlite| Bail | | | | | | | | | Bail | | + * `-------------------------------------------------------------------------------------' + */ +[_ADJUST] = LAYOUT_ortho_4x12( \ + BL_INC, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, RGB_MODE_PLAIN, \ + BL_DEC, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, RGB_MODE_REVERSE, \ + BL_STEP, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, RGB_MODE_FORWARD, \ + BL_TOGG, TO(_MOUSE), _______, _______, _______, _______, _______, _______, _______, _______, TO(_QWERTY), RGB_TOG \ +), + + +/* movement layer (hold semicolon) */ +[_MOVE] = LAYOUT_ortho_4x12( \ + TO(_QWERTY), X_____X, X_____X, X_____X, X_____X, X_____X, KC_HOME, KC_PGDN, KC_PGUP, KC_END, X_____X, X_____X, \ + _______, X_____X, LGUI(KC_LBRC), LGUI(LSFT(KC_LBRC)), LGUI(LSFT(KC_RBRC)), LGUI(KC_RBRC), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, X_____X, \ + _______, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, _______, \ + _______, _______, _______, _______, _______, X_____X, X_____X, _______, _______, _______, _______, X_____X \ +), + +/* mouse layer + */ +[_MOUSE] = LAYOUT_ortho_4x12( \ + TO(_QWERTY), X_____X, X_____X, KC_MS_UP, X_____X, X_____X, KC_MS_WH_LEFT, KC_MS_WH_DOWN, KC_MS_WH_UP, KC_MS_WH_RIGHT, X_____X, X_____X, \ + _______, X_____X, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, X_____X, X_____X, KC_MS_BTN1, KC_MS_BTN2, KC_MS_BTN3, X_____X, X_____X, \ + _______, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, _______, \ + _______, TO(_QWERTY), _______, _______, _______, X_____X, X_____X, _______, _______, _______, TO(_QWERTY), X_____X \ +), + +/* vim command layer. + */ +[_CMD] = LAYOUT_ortho_4x12( \ + X_____X, X_____X, VIM_W, VIM_E, X_____X, X_____X, VIM_Y, VIM_U, VIM_I, VIM_O, VIM_P, X_____X, \ + VIM_ESC, VIM_A, VIM_S, VIM_D, X_____X, VIM_G, VIM_H, VIM_J, VIM_K, VIM_L, X_____X, X_____X, \ + VIM_SHIFT, X_____X, VIM_X, VIM_C, VIM_V, VIM_B, X_____X, X_____X, VIM_COMMA, VIM_PERIOD, X_____X, VIM_SHIFT, \ + _______, TO(_QWERTY), _______, _______, X_____X, X_____X, X_____X, X_____X, _______, _______, TO(_QWERTY), X_____X \ +) + +}; + + + +#define C_RED 0xFF, 0x00, 0x00 +#define C_GRN 0x00, 0xFF, 0x00 +#define C_BLU 0x00, 0x00, 0xFF + +#define C_YAN 0x00, 0xFF, 0xFF +#define C_PRP 0x7A, 0x00, 0xFF +#define C_ORG 0xFF, 0x93, 0x00 + +void rgbflag(uint8_t r, uint8_t g, uint8_t b, uint8_t rr, uint8_t gg, uint8_t bb) { + LED_TYPE *target_led = user_rgb_mode ? shadowed_led : led; + for (int i = 0; i < RGBLED_NUM; i++) { + switch (i) { + case 10: case 11: + target_led[i].r = r; + target_led[i].g = g; + target_led[i].b = b; + break; + case 0: case 1: + target_led[i].r = rr; + target_led[i].g = gg; + target_led[i].b = bb; + break; + default: + target_led[i].r = 0; + target_led[i].g = 0; + target_led[i].b = 0; + break; + } + } + rgblight_set(); +} + +void set_state_leds(void) { + if (rgblight_get_mode() == 1) { + switch (biton32(layer_state)) { + case _RAISE: + rgbflag(C_BLU, C_GRN); + break; + case _LOWER: + rgbflag(C_BLU, C_RED); + break; + case _ADJUST: + rgbflag(C_BLU, C_PRP); + break; + case _MOVE: + rgbflag(C_RED, C_PRP); + break; + case _MOUSE: + rgbflag(C_RED, C_GRN); + break; + case _CMD: + switch(vstate) { + case VIM_V: + case VIM_VI: + case VIM_VS: + rgbflag(C_GRN, C_YAN); + break; + case VIM_C: + case VIM_CI: + rgbflag(C_GRN, C_ORG); + break; + case VIM_D: + case VIM_DI: + rgbflag(C_GRN, C_RED); + break; + case VIM_G: + rgbflag(C_GRN, C_BLU); + break; + case VIM_Y: + rgbflag(C_GRN, C_PRP); + break; + case VIM_START: + default: + rgbflag(C_GRN, C_GRN); + break; + } + break; + default: // for any other layers, or the default layer + rgbflag(C_YAN, C_YAN); + break; + } + } +} + +uint32_t layer_state_set_user(uint32_t state) { + return update_tri_layer_state(state, _RAISE, _LOWER, _ADJUST); +} diff --git a/keyboards/levinson/keymaps/xtonhasvim/readme.md b/keyboards/levinson/keymaps/xtonhasvim/readme.md new file mode 100644 index 000000000..9ff4ce1f1 --- /dev/null +++ b/keyboards/levinson/keymaps/xtonhasvim/readme.md @@ -0,0 +1,9 @@ +# Xton has a tiny keyboard! With Vim! + +Based on the standard Planck layout with a few changes: + +* Escape moved to dual-function with control. +* Dedicated movement and mouse layers. +* Top and middle row swapped in `_RAISE` and `_LOWER` because I never use F-keys. +* Vim layers! See `users/xtonhasvim`. + diff --git a/keyboards/levinson/keymaps/xtonhasvim/rules.mk b/keyboards/levinson/keymaps/xtonhasvim/rules.mk new file mode 100644 index 000000000..ad5466991 --- /dev/null +++ b/keyboards/levinson/keymaps/xtonhasvim/rules.mk @@ -0,0 +1,5 @@ +# MOUSEKEY_ENABLE = yes +# BACKLIGHT_ENABLE = yes +# AUDIO_ENABLE = no + +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. From aa795dc33ee1c854a3ea5a3cb3d15e7e68be89d6 Mon Sep 17 00:00:00 2001 From: Xin-Xin Wang Date: Mon, 3 Sep 2018 19:55:06 -0400 Subject: [PATCH 049/788] Keymap: Fix missing braces around initializer error on older gcc (#3840) --- users/xtonhasvim/fancylighting.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/users/xtonhasvim/fancylighting.c b/users/xtonhasvim/fancylighting.c index dc13df03f..a88ca4beb 100644 --- a/users/xtonhasvim/fancylighting.c +++ b/users/xtonhasvim/fancylighting.c @@ -45,7 +45,7 @@ void matrix_scan_keymap(void) { uint16_t effect_start_timer = 0; uint8_t user_rgb_mode = 0; -LED_TYPE shadowed_led[RGBLED_NUM] = {0}; +LED_TYPE shadowed_led[RGBLED_NUM] = {{0}}; void start_firey_return(void) { user_rgb_mode = BREATH_FIRE; @@ -79,7 +79,7 @@ void set_color_for_offsets(uint16_t time_offset, uint16_t space_offset, uint8_t float alpha = (time_progress + 0.1) * 7.0 - space_progress; alpha = fmin(1.0, alpha*alpha); - LED_TYPE px[1] = {0}; + LED_TYPE px[1] = {{0}}; sethsv((uint16_t)(fmod(time_progress * 1.5 + space_progress,1.0)*360), 255, (uint8_t)(progress*255),&px[0]); led[idx].r = alpha * px[0].r + ( 1.0 - alpha) * shadowed_led[idx].r; led[idx].g = alpha * px[0].g + ( 1.0 - alpha) * shadowed_led[idx].g; From f48e20c1eb52d7281276025fd1cbaa81e1856f83 Mon Sep 17 00:00:00 2001 From: Xyverz Date: Mon, 3 Sep 2018 16:57:06 -0700 Subject: [PATCH 050/788] Keymap: Updates to xyverz keymaps (#3841) * fixing ortho_4x12 configs * Using upstream/master version instead * Additions and Corrections Corrected the Kinesis/Stapelberg's .c file to allow LEDs to work Removed excess cruft from my Kinesis keymap to reflect this change Other minor tweaks and adjustments to my ortho_4x12 and 5x12 layouts * Rules for vitamins_included Added a section to disable RGB underglow for the Let's Split Vitamins Included board. * fixing ortho_4x12 configs * Using upstream/master version instead * Additions and Corrections Corrected the Kinesis/Stapelberg's .c file to allow LEDs to work Removed excess cruft from my Kinesis keymap to reflect this change Other minor tweaks and adjustments to my ortho_4x12 and 5x12 layouts * Creating my own userspace * Added Rorschach keymap * renamed userspace folder I renamed my userspace folder since I'm not ready to start using it just yet, and I want to get my keyboards programmed. This is a temporary thing and will be fixed later as I get time. * adding files in "new" folder * Disabling LEDs on Pro Micro * Modifications to Kinesis keymap * More kinesis tweaks * removed userspace from master Created a new branch for my userspace stuff. I'll work on it there. * Moved keymap to separate branch Moved the Rorschach keymap I was working on to a separate branch for development purposes. Not ready to push it up to upstream master. --- keyboards/atreus62/keymaps/xyverz/keymap.c | 11 +++++- keyboards/kinesis/keymaps/xyverz/keymap.c | 43 ++++++++++++---------- keyboards/kinesis/keymaps/xyverz/readme.md | 20 +++++----- keyboards/kinesis/keymaps/xyverz/rules.mk | 6 +-- 4 files changed, 46 insertions(+), 34 deletions(-) diff --git a/keyboards/atreus62/keymaps/xyverz/keymap.c b/keyboards/atreus62/keymaps/xyverz/keymap.c index 378831737..0f2e8ea08 100644 --- a/keyboards/atreus62/keymaps/xyverz/keymap.c +++ b/keyboards/atreus62/keymaps/xyverz/keymap.c @@ -127,8 +127,17 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; -const uint16_t PROGMEM fn_actions[] = { +void matrix_init_user(void) { +#ifdef BOOTLOADER_CATERINA + // This will disable the red LEDs on the ProMicros + DDRD &= ~(1<<5); + PORTD &= ~(1<<5); + DDRB &= ~(1<<0); + PORTB &= ~(1<<0); +#endif +}; +const uint16_t PROGMEM fn_actions[] = { }; void persistent_default_layer_set(uint16_t default_layer) { diff --git a/keyboards/kinesis/keymaps/xyverz/keymap.c b/keyboards/kinesis/keymaps/xyverz/keymap.c index 1025df076..2eab62a2b 100644 --- a/keyboards/kinesis/keymaps/xyverz/keymap.c +++ b/keyboards/kinesis/keymaps/xyverz/keymap.c @@ -20,6 +20,11 @@ enum custom_keycodes { #define _______ KC_TRNS #define XXXXXXX KC_NO +// Aliases to make the keymap more uniform +#define GUI_END GUI_T(KC_END) +#define MED_DEL LT(_MEDIA, KC_DEL) +#define KPD_ENT LT(_KEYPAD, KC_ENT) + /* Function Keys on All Layers (Keypad toggles): @@ -96,9 +101,9 @@ enum custom_keycodes { |--------+------+------+------+------+------||------+------+------+------+------+--------| | | | | | | || | | | | | | |--------+------+------+------+------+------||------+------+------+------+------+--------| - | | | | | | || | Mute | Vol- | Vol+ | | | + | | | Mute | Vol- | Vol+ | || | | | | | | |--------+------+------+------+------+------||------+------+------+------+------+--------| - | | | | | | || Stop | Prev | Play | Next | Sel | | + | | Stop | Prev | Play | Next | Sel || | | | | | | `--------+------+------+------+------+------'`------+------+------+------+------+--------' | | | | | | | | | | `---------------------------' `---------------------------' @@ -116,12 +121,12 @@ enum custom_keycodes { |--------+------+------+------+------+------||------+------+------+------+------+--------| | Sleep | | | | | || | KP 7 | KP 8 | KP 9 | KP - | | |--------+------+------+------+------+------||------+------+------+------+------+--------| - | Wake | |QWERTY|Colemk|Dvorak| || | KP 4 | KP 5 | KP 6 | KP + | | + | Wake | | Mute | Vol- | Vol+ | || | KP 4 | KP 5 | KP 6 | KP + | | |--------+------+------+------+------+------||------+------+------+------+------+--------| - | | | | | | || | KP 1 | KP 2 | KP 3 |KP Ent| | + | | Stop | Prev | Play | Next | Sel || | KP 1 | KP 2 | KP 3 |KP Ent| | `--------+------+------+------+------+------'`------+------+------+------+------+--------' - | | | | | | | | KP . |KP Ent| | - `---------------------------' `----------------------------------' + | |QWERTY|Colemk|Dvorak| | | | KP . |KP Ent| + `---------------------------' `---------------------------' ,-------------.,-------------. | | || | | ,------|------|------||------+------+------. @@ -144,7 +149,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // Left Thumb KC_LCTL, KC_LALT, KC_HOME, - KC_BSPC, LT(_MEDIA, KC_DEL), KC_END, + KC_BSPC, MED_DEL, GUI_END, // Right Hand KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, TG(_KEYPAD), RESET, @@ -156,7 +161,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // Right Thumb KC_RGUI, KC_RCTL, KC_PGUP, - KC_PGDN, LT(_KEYPAD, KC_ENT), KC_SPC + KC_PGDN, KPD_ENT, KC_SPC ), [_QWERTY] = LAYOUT ( @@ -170,7 +175,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // Left Thumb KC_LCTL, KC_LALT, KC_HOME, - KC_BSPC, LT(_MEDIA, KC_DEL), KC_END, + KC_BSPC, MED_DEL, KC_END, // Right Hand KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, TG(_KEYPAD), RESET, @@ -182,7 +187,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // Right Thumb KC_RGUI, KC_RCTL, KC_PGUP, - KC_PGDN, LT(_KEYPAD, KC_ENT), KC_SPC + KC_PGDN, KPD_ENT, KC_SPC ), [_COLEMAK] = LAYOUT ( @@ -196,7 +201,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // Left Thumb KC_LCTL, KC_LALT, KC_HOME, - KC_BSPC, LT(_MEDIA, KC_DEL), KC_END, + KC_BSPC, MED_DEL, KC_END, // Right Hand KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, TG(_KEYPAD), RESET, @@ -208,7 +213,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // Right Thumb KC_RGUI, KC_RCTL, KC_PGUP, - KC_PGDN, LT(_KEYPAD, KC_ENT), KC_SPC + KC_PGDN, KPD_ENT, KC_SPC ), [_MEDIA] = LAYOUT ( @@ -216,8 +221,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_F11, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, + _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, + _______, KC_MSTP, KC_MPRV, KC_MPLY, KC_MNXT, KC_MSEL, _______, _______, _______, _______, // Left Thumb _______, _______, @@ -228,8 +233,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F12, _______, _______, _______, _______, _______, _______, - _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, - KC_MSTP, KC_MPRV, KC_MPLY, KC_MNXT, KC_MSEL, _______, + _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, // Right Thumb _______, _______, @@ -242,9 +247,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PWR, _______, _______, _______, _______, _______, KC_SLEP, _______, _______, _______, _______, _______, - KC_WAKE, _______, QWERTY, COLEMAK, DVORAK, _______, - _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, + KC_WAKE, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, + _______, KC_MSTP, KC_MPRV, KC_MPLY, KC_MNXT, KC_MSEL, + _______, QWERTY, COLEMAK, DVORAK, // Left Thumb _______, _______, _______, diff --git a/keyboards/kinesis/keymaps/xyverz/readme.md b/keyboards/kinesis/keymaps/xyverz/readme.md index 4f270445d..b55100d25 100644 --- a/keyboards/kinesis/keymaps/xyverz/readme.md +++ b/keyboards/kinesis/keymaps/xyverz/readme.md @@ -4,19 +4,17 @@ The Dvorak layout shown here stems from my early Kinesis years, using the Contour PS/2 with a Dvorak software layout. Because of this, the RBRC and LBRC were on opposite sides of the board in the corner keys. I've decided to continue using this layout with my QMK Kinesis. -~~After a year of using a planck, I've become accustomed to my / and ? being above the - key, so I've decided to move my [, ], and = to the normal Advantage location and set the two keys above the - to new locations. I'll play with it for a while and see how I like it.~~ I didn't like it, so I've switched back. - The QWERTY layout shown here is based entirely on the Kinesis Advantage layout. The Colemak layout is merely an adaptation of that. I've enabled persistent keymaps for Qwerty, Dvorak and Colemak layers, similar to the default Planck layouts. -As of August 4 2018, I've got the LEDs working ... mostly. Caps Lock and Num Lock LEDs work for me. The Scroll Lock LED does work on my keyboard, but I can't get it to work when I use the Scroll Lock key on my keyboard. I also have no idea how to get the Num Pad LED working when I switch to the Numpad layer. +Depending on the OS, most of the LEDs are now working in this keymap, but I still have yet to get the Num Pad LED working when switching to the Numpad layer. ## Still to do: - * Figure out how to make the Numpad and ScrLck LEDs work properly. + * Figure out how to make the Numpad LED work properly. -### Function Keys on All Layers (keypad toggles): +### Function Keys on All Layers (`keypad` toggles to the keypad layer): ,-----------------------------------------------------------------. | Esc | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | `-----------------------------------------------------------------' @@ -94,9 +92,9 @@ As of August 4 2018, I've got the LEDs working ... mostly. Caps Lock and Num Loc |--------+------+------+------+------+------||------+------+------+------+------+--------| | | | | | | || | | | | | | |--------+------+------+------+------+------||------+------+------+------+------+--------| - | | | | | | || | Mute | Vol- | Vol+ | | | + | | | Mute | Vol- | Vol+ | || | | | | | | |--------+------+------+------+------+------||------+------+------+------+------+--------| - | | | | | | || Stop | Prev | Play | Next | Sel | | + | | Stop | Prev | Play | Next | Sel || | | | | | | `--------+------+------+------+------+------'`------+------+------+------+------+--------' | | | | | | | | | | `---------------------------' `---------------------------' @@ -117,12 +115,12 @@ As of August 4 2018, I've got the LEDs working ... mostly. Caps Lock and Num Loc |--------+------+------+------+------+------||------+------+------+------+------+--------| | Sleep | | | | | || | KP 7 | KP 8 | KP 9 | KP - | | |--------+------+------+------+------+------||------+------+------+------+------+--------| - | Wake | |QWERTY|Colemk|Dvorak| || | KP 4 | KP 5 | KP 6 | KP + | | + | Wake | | Mute | Vol- | Vol+ | || | KP 4 | KP 5 | KP 6 | KP + | | |--------+------+------+------+------+------||------+------+------+------+------+--------| - | | | | | | || | KP 1 | KP 2 | KP 3 |KP Ent| | + | | Stop | Prev | Play | Next | Sel || | KP 1 | KP 2 | KP 3 |KP Ent| | `--------+------+------+------+------+------'`------+------+------+------+------+--------' - | | | | | | | | KP . |KP Ent| | - `---------------------------' `----------------------------------' + | |QWERTY|Colemk|Dvorak| | | | KP . |KP Ent| + `---------------------------' `---------------------------' ,-------------.,-------------. | | || | | ,------|------|------||------+------+------. diff --git a/keyboards/kinesis/keymaps/xyverz/rules.mk b/keyboards/kinesis/keymaps/xyverz/rules.mk index 1da780b84..c21f8aea6 100644 --- a/keyboards/kinesis/keymaps/xyverz/rules.mk +++ b/keyboards/kinesis/keymaps/xyverz/rules.mk @@ -2,11 +2,11 @@ # change to "no" to disable the options, or define them in the Makefile in # the appropriate keymap folder that will get included automatically # -BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) CONSOLE_ENABLE = no # Console for debug(+400) -COMMAND_ENABLE = yes # Commands for debug and configuration +COMMAND_ENABLE = no # Commands for debug and configuration NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality MIDI_ENABLE = no # MIDI controls From 714c82cc2ee493b1b2d234c9900ff6d04cc39f62 Mon Sep 17 00:00:00 2001 From: Elisiano Petrini Date: Tue, 4 Sep 2018 01:57:57 +0200 Subject: [PATCH 051/788] Keymap: Massdrop CTRL: add basic MacOS support (#3842) * swap KC_LALT with KC_LGUI * replace KC_RALT with KC_RGUI This makes the keyboard more mac friendly out of the box (I'm aware this that this could partially be done in software with the preferences but hey, where's the fun in that). --- keyboards/massdrop/ctrl/keymaps/mac/keymap.c | 203 +++++++++++++++++++ 1 file changed, 203 insertions(+) create mode 100644 keyboards/massdrop/ctrl/keymaps/mac/keymap.c diff --git a/keyboards/massdrop/ctrl/keymaps/mac/keymap.c b/keyboards/massdrop/ctrl/keymaps/mac/keymap.c new file mode 100644 index 000000000..116aaa9a1 --- /dev/null +++ b/keyboards/massdrop/ctrl/keymaps/mac/keymap.c @@ -0,0 +1,203 @@ +#include QMK_KEYBOARD_H + +enum ctrl_keycodes { + L_BRI = SAFE_RANGE, //LED Brightness Increase + L_BRD, //LED Brightness Decrease + L_PTN, //LED Pattern Select Next + L_PTP, //LED Pattern Select Previous + L_PSI, //LED Pattern Speed Increase + L_PSD, //LED Pattern Speed Decrease + L_T_MD, //LED Toggle Mode + L_T_ONF, //LED Toggle On / Off + L_ON, //LED On + L_OFF, //LED Off + L_T_BR, //LED Toggle Breath Effect + L_T_PTD, //LED Toggle Scrolling Pattern Direction + U_T_AUTO, //USB Extra Port Toggle Auto Detect / Always Active + U_T_AGCR, //USB Toggle Automatic GCR control + DBG_TOG, //DEBUG Toggle On / Off + DBG_MTRX, //DEBUG Toggle Matrix Prints + DBG_KBD, //DEBUG Toggle Keyboard Prints + DBG_MOU, //DEBUG Toggle Mouse Prints +}; + +#define TG_NKRO MAGIC_TOGGLE_NKRO //Toggle 6KRO / NKRO mode + +keymap_config_t keymap_config; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, \ + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, MO(1), KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT \ + ), + [1] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_MSTP, KC_VOLU, \ + L_T_BR, L_PSD, L_BRI, L_PSI, KC_TRNS, KC_TRNS, KC_TRNS, U_T_AUTO,U_T_AGCR,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_VOLD, \ + L_T_PTD, L_PTP, L_BRD, L_PTN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, L_T_MD, L_T_ONF, KC_TRNS, KC_TRNS, KC_TRNS, TG_NKRO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ + ), + /* + [X] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, TG_NKRO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ + ), + */ +}; + +const uint16_t PROGMEM fn_actions[] = { + +}; + +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { +}; + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { +}; + +#define MODS_SHIFT (keyboard_report->mods & MOD_BIT(KC_LSHIFT) || keyboard_report->mods & MOD_BIT(KC_RSHIFT)) +#define MODS_CTRL (keyboard_report->mods & MOD_BIT(KC_LCTL) || keyboard_report->mods & MOD_BIT(KC_RCTRL)) +#define MODS_ALT (keyboard_report->mods & MOD_BIT(KC_LALT) || keyboard_report->mods & MOD_BIT(KC_RALT)) + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case L_BRI: + if (record->event.pressed) { + if (LED_GCR_STEP > LED_GCR_MAX - gcr_desired) gcr_desired = LED_GCR_MAX; + else gcr_desired += LED_GCR_STEP; + if (led_animation_breathing) gcr_breathe = gcr_desired; + } + return false; + case L_BRD: + if (record->event.pressed) { + if (LED_GCR_STEP > gcr_desired) gcr_desired = 0; + else gcr_desired -= LED_GCR_STEP; + if (led_animation_breathing) gcr_breathe = gcr_desired; + } + return false; + case L_PTN: + if (record->event.pressed) { + if (led_animation_id == led_setups_count - 1) led_animation_id = 0; + else led_animation_id++; + } + return false; + case L_PTP: + if (record->event.pressed) { + if (led_animation_id == 0) led_animation_id = led_setups_count - 1; + else led_animation_id--; + } + return false; + case L_PSI: + if (record->event.pressed) { + led_animation_speed += ANIMATION_SPEED_STEP; + } + return false; + case L_PSD: + if (record->event.pressed) { + led_animation_speed -= ANIMATION_SPEED_STEP; + if (led_animation_speed < 0) led_animation_speed = 0; + } + return false; + case L_T_MD: + if (record->event.pressed) { + led_lighting_mode++; + if (led_lighting_mode > LED_MODE_MAX_INDEX) led_lighting_mode = LED_MODE_NORMAL; + } + return false; + case L_T_ONF: + if (record->event.pressed) { + led_enabled = !led_enabled; + I2C3733_Control_Set(led_enabled); + } + return false; + case L_ON: + if (record->event.pressed) { + led_enabled = 1; + I2C3733_Control_Set(led_enabled); + } + return false; + case L_OFF: + if (record->event.pressed) { + led_enabled = 0; + I2C3733_Control_Set(led_enabled); + } + return false; + case L_T_BR: + if (record->event.pressed) { + led_animation_breathing = !led_animation_breathing; + if (led_animation_breathing) + { + gcr_breathe = gcr_desired; + led_animation_breathe_cur = BREATHE_MIN_STEP; + breathe_dir = 1; + } + } + return false; + case L_T_PTD: + if (record->event.pressed) { + led_animation_direction = !led_animation_direction; + } + return false; + case U_T_AUTO: + if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { + usb_extra_manual = !usb_extra_manual; + CDC_print("USB extra port manual mode "); + CDC_print(usb_extra_manual ? "enabled" : "disabled"); + CDC_print("\r\n"); + } + return false; + case U_T_AGCR: + if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { + usb_gcr_auto = !usb_gcr_auto; + CDC_print("USB GCR auto mode "); + CDC_print(usb_gcr_auto ? "enabled" : "disabled"); + CDC_print("\r\n"); + } + return false; + case DBG_TOG: + if (record->event.pressed) { + debug_enable = !debug_enable; + CDC_print("Debug mode "); + CDC_print(debug_enable ? "enabled" : "disabled"); + CDC_print("\r\n"); + } + return false; + case DBG_MTRX: + if (record->event.pressed) { + debug_matrix = !debug_matrix; + CDC_print("Debug matrix "); + CDC_print(debug_matrix ? "enabled" : "disabled"); + CDC_print("\r\n"); + } + return false; + case DBG_KBD: + if (record->event.pressed) { + debug_keyboard = !debug_keyboard; + CDC_print("Debug keyboard "); + CDC_print(debug_keyboard ? "enabled" : "disabled"); + CDC_print("\r\n"); + } + return false; + case DBG_MOU: + if (record->event.pressed) { + debug_mouse = !debug_mouse; + CDC_print("Debug mouse "); + CDC_print(debug_mouse ? "enabled" : "disabled"); + CDC_print("\r\n"); + } + return false; + default: + return true; //Process all other keycodes normally + } +} From a14eb01883cd135105cebd4d5570337250cc76cb Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Mon, 3 Sep 2018 19:48:09 -0400 Subject: [PATCH 052/788] fix mousekey call --- tmk_core/common/action.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/tmk_core/common/action.c b/tmk_core/common/action.c index 76c150b40..ae0864749 100644 --- a/tmk_core/common/action.c +++ b/tmk_core/common/action.c @@ -773,9 +773,12 @@ void register_code(uint8_t code) else if IS_CONSUMER(code) { host_consumer_send(KEYCODE2CONSUMER(code)); } - else if IS_MOUSEKEY(code) { - mousekey_on(code); - } + + #ifdef MOUSEKEY_ENABLE + else if IS_MOUSEKEY(code) { + mousekey_on(code); + } + #endif } /** \brief Utilities for actions. (FIXME: Needs better description) @@ -835,9 +838,11 @@ void unregister_code(uint8_t code) else if IS_CONSUMER(code) { host_consumer_send(0); } - else if IS_MOUSEKEY(code) { - mousekey_off(code); - } + #ifdef MOUSEKEY_ENABLE + else if IS_MOUSEKEY(code) { + mousekey_off(code); + } + #endif } /** \brief Utilities for actions. (FIXME: Needs better description) From 0533ea4a2042365e1970345243f2fc0333fb082c Mon Sep 17 00:00:00 2001 From: marksard <38324387+marksard@users.noreply.github.com> Date: Wed, 5 Sep 2018 00:52:00 +0900 Subject: [PATCH 053/788] Keymap: Added a keymap like a JIS keyboard for JJ 40. (#3847) --- keyboards/jj40/keymaps/like_jis/config.h | 49 ++++++ keyboards/jj40/keymaps/like_jis/keymap.c | 200 +++++++++++++++++++++++ keyboards/jj40/keymaps/like_jis/rules.mk | 5 + 3 files changed, 254 insertions(+) create mode 100644 keyboards/jj40/keymaps/like_jis/config.h create mode 100644 keyboards/jj40/keymaps/like_jis/keymap.c create mode 100644 keyboards/jj40/keymaps/like_jis/rules.mk diff --git a/keyboards/jj40/keymaps/like_jis/config.h b/keyboards/jj40/keymaps/like_jis/config.h new file mode 100644 index 000000000..cd9709272 --- /dev/null +++ b/keyboards/jj40/keymaps/like_jis/config.h @@ -0,0 +1,49 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#pragma once + +// place overrides here + +#define TAPPING_TERM 200 + +#ifdef MOUSEKEY_ENABLE + #undef MOUSEKEY_INTERVAL + #define MOUSEKEY_INTERVAL 5 + + #undef MOUSEKEY_TIME_TO_MAX + #define MOUSEKEY_TIME_TO_MAX 150 + + #undef MOUSEKEY_MAX_SPEED + #define MOUSEKEY_MAX_SPEED 3 + + #undef MOUSEKEY_MOVE_DELTA + #define MOUSEKEY_MOVE_DELTA 3 + + #undef MOUSEKEY_DELAY + #define MOUSEKEY_DELAY 0 +#endif + +#undef BACKLIGHT_LEVELS +#define BACKLIGHT_LEVELS 15 +// #undef BACKLIGHT_LEVELS +// #define BACKLIGHT_BREATHING +// #undef BREATHING_PERIOD +// #define BREATHING_PERIOD 4 diff --git a/keyboards/jj40/keymaps/like_jis/keymap.c b/keyboards/jj40/keymaps/like_jis/keymap.c new file mode 100644 index 000000000..4724933ea --- /dev/null +++ b/keyboards/jj40/keymaps/like_jis/keymap.c @@ -0,0 +1,200 @@ +#include QMK_KEYBOARD_H + +#define _QWERTY 0 +#define _LOWER 3 +#define _RAISE 4 +#define _ADJUST 16 + +enum custom_keycodes { + LOWER = SAFE_RANGE, + RAISE, + ADJUST, + RGBRST +}; + +#define KC______ KC_TRNS +#define KC_XXXXX KC_NO +#define KC_KANJI KC_GRV + +#define KC_LOWER LOWER +#define KC_RAISE RAISE +#define KC_ADJST ADJUST + +#define KC_RST RESET + +#define KC_LRST RGBRST +#define KC_LTOG RGB_TOG +#define KC_LHUI RGB_HUI +#define KC_LHUD RGB_HUD +#define KC_LSAI RGB_SAI +#define KC_LSAD RGB_SAD +#define KC_LVAI RGB_VAI +#define KC_LVAD RGB_VAD +#define KC_LSMOD RGB_SMOD +#define KC_BTOG BL_TOGG +#define KC_BINC BL_INC +#define KC_BDEC BL_DEC +// #define KC_BRTG BL_BRTG + +#define KC_KNRM AG_NORM +#define KC_KSWP AG_SWAP + +// Layer Mode aliases +// #define KC_L_LO MO(_LOWER) +// #define KC_L_RA MO(_RAISE) +// #define KC_L_AD MO(_ADJUST) +#define KC_TBSF LSFT_T(KC_TAB) +// #define KC_SPSF LSFT_T(KC_SPC) +// #define KC_GUAP LALT_T(KC_APP) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_QWERTY] = KC_LAYOUT_ortho_4x12( \ + //,-----------------------------------------------------------------------------------. + ESC, Q, W, E, R, T, Y, U, I, O, P, MINS,\ + //|------+------+------+------+------+------|------+------+------+------+------+------| + TBSF, A, S, D, F, G, H, J, K, L, SCLN, ENT,\ + //|------+------+------+------+------+------|------+------+------+------+------+------| + LSFT, Z, X, C, V, B, N, M, COMM, DOT, UP, RSFT,\ + //|------+------+------+------+------+------|------+------+------+------+------+------| + LCTRL, LALT, LGUI, ADJST, LOWER, BSPC, SPC, RAISE, APP, LEFT, DOWN, RGHT \ + //|------+------+------+------+------+-------------+------+------+------+------+------| + ), + + [_LOWER] = KC_LAYOUT_ortho_4x12( \ + //,-----------------------------------------------------------------------------------. + TAB, F1, F2, F3, F4, F5, XXXXX, MINS, EQL, JYEN, LBRC, RBRC,\ + //|------+------+------+------+------+------|------+------+------+------+------+------| + _____, F6, F7, F8, F9, F10, XXXXX, XXXXX, XXXXX, SCLN, QUOT, BSLS,\ + //|------+------+------+------+------+------|------+------+------+------+------+------| + _____, F11, F12, XXXXX, KANJI, ENT, XXXXX, XXXXX, COMM, DOT, SLSH, RO,\ + //|------+------+------+------+------+-------------+------+------+------+------+------| + _____, _____, _____, _____, _____, DEL, _____, _____, _____, _____, _____, _____ \ + //|------+------+------+------+------+-------------+------+------+------+------+------| + ), + + [_RAISE] = KC_LAYOUT_ortho_4x12( \ + //,-----------------------------------------------------------------------------------. + _____, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,\ + //|------+------+------+------+------+------|------+------+------+------+------+------| + _____, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, 4, 5, 6, QUOT, PLUS,\ + //|------+------+------+------+------+------|------+------+------+------+------+------| + _____, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, 0, 1, 2, 3, DOT, SLSH,\ + //|------+------+------+------+------+-------------+------+------+------+------+------| + _____, _____, _____, _____, _____, BSPC, _____, _____, _____, _____, _____, _____ \ + //|------+------+------+------+------+-------------+------+------+------+------+------| + ), + + [_ADJUST] = KC_LAYOUT_ortho_4x12( \ + //,-----------------------------------------------------------------------------------. + XXXXX, RST, LRST, KNRM, KSWP, XXXXX, XXXXX, WH_L, WH_U, HOME, PGUP, XXXXX,\ + //|------+------+------+------+------+------|------+------+------+------+------+------| + XXXXX, LTOG, LHUI, LSAI, LVAI, BTOG, BINC, WH_R, WH_D, END, PGDN, XXXXX,\ + //|------+------+------+------+------+------|------+------+------+------+------+------| + XXXXX, LSMOD, LHUD, LSAD, LVAD, XXXXX, BDEC, XXXXX, BTN1, BTN2, MS_U, XXXXX,\ + //|------+------+------+------+------+-------------+------+------+------+------+------| + _____, _____, _____, _____, _____, XXXXX, XXXXX, _____, _____, MS_L, MS_D, MS_R \ + //|------+------+------+------+------+-------------+------+------+------+------+------| + ) +}; + + +#ifdef BACKLIGHT_ENABLE + extern backlight_config_t backlight_config; + + inline void enable_backright(bool on) { + backlight_config.enable = on; + if (backlight_config.raw == 1) // enabled but level = 0 + backlight_config.level = 1; + eeconfig_update_backlight(backlight_config.raw); + // dprintf("backlight toggle: %u\n", backlight_config.enable); + backlight_set(backlight_config.enable ? backlight_config.level : 0); + } + + uint8_t bl_breath_count; + uint8_t bl_breath_speed = 10; + int8_t bl_breath_updown = 1; + bool bl_breath_on; + backlight_config_t bl_breath_backup; + + void bl_breath_start(uint8_t speed) { + + bl_breath_on = true; + bl_breath_speed = speed; + bl_breath_backup = backlight_config; + } + + void bl_breath_end(void) { + + bl_breath_on = false; + backlight_config = bl_breath_backup; + eeconfig_update_backlight(backlight_config.raw); + backlight_set(backlight_config.enable ? backlight_config.level : 0); + } + + void bl_breath_update(void) { + + if (bl_breath_on) { + ++bl_breath_count; + if (bl_breath_count > bl_breath_speed) { + bl_breath_count = 0; + + backlight_config.level += bl_breath_updown; + bl_breath_updown = (backlight_config.level > BACKLIGHT_LEVELS) ? -1 : + (backlight_config.level <= 0) ? 1 : + bl_breath_updown; + enable_backright(true); + } + } + } + + #define BL_BREATH_START bl_breath_start + #define BL_BREATH_END bl_breath_end + #define BL_BREATH_UPDATE bl_breath_update + +#else + + #define BL_BREATH_START(a) + #define BL_BREATH_END() + #define BL_BREATH_UPDATE() +#endif + +// Loop +void matrix_scan_user(void) { + + BL_BREATH_UPDATE(); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + + switch (keycode) { + case LOWER: + if (record->event.pressed) { + BL_BREATH_START(50); + layer_on(_LOWER); + } else { + BL_BREATH_END(); + layer_off(_LOWER); + } + break; + case RAISE: + if (record->event.pressed) { + BL_BREATH_START(100); + layer_on(_RAISE); + } else { + BL_BREATH_END(); + layer_off(_RAISE); + } + break; + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + break; + default: + return true; + } + + return false; +} diff --git a/keyboards/jj40/keymaps/like_jis/rules.mk b/keyboards/jj40/keymaps/like_jis/rules.mk new file mode 100644 index 000000000..0103be5f4 --- /dev/null +++ b/keyboards/jj40/keymaps/like_jis/rules.mk @@ -0,0 +1,5 @@ +MOUSEKEY_ENABLE = yes +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend From 40718d2ca3590b34c3d41b8988fc055dc6b55add Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Em=C4=ABls=20Delle?= Date: Tue, 4 Sep 2018 18:52:52 +0300 Subject: [PATCH 054/788] Keymap: Create ISO HHKB keymapping for GH60 (#3832) * Create ISO HHKB keymapping for GH60 * Add media controls to Fn layer * Use M(x) instead of F(x), add Copyright text --- keyboards/gh60/keymaps/emiilsd/keymap.c | 51 +++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 keyboards/gh60/keymaps/emiilsd/keymap.c diff --git a/keyboards/gh60/keymaps/emiilsd/keymap.c b/keyboards/gh60/keymaps/emiilsd/keymap.c new file mode 100644 index 000000000..0fbfe38c2 --- /dev/null +++ b/keyboards/gh60/keymaps/emiilsd/keymap.c @@ -0,0 +1,51 @@ +/* Copyright 2018 Funderburker + * + * 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 . + */ +#include QMK_KEYBOARD_H + +// Fillers to make layering more clear +#define _______ KC_TRNS + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* + ISO HHKB layout: + + * 2u Backspace + * ISO Enter + * split left Shift + * split right Shift + * Caps as Control + * 1u/1.5u/7u/1.5u//1u bottom row + */ + + /* 0: QWERTY */ + [0] = LAYOUT( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_NO, + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_BSLS, KC_ENT, + KC_LSFT, KC_GRV, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, MO(1), KC_RSFT, + KC_NO, KC_LALT, KC_LGUI, KC_SPC, KC_NO, KC_NO, KC_RALT, KC_CAPSLOCK, KC_NO + ), + + /* 1: Fn layer */ + [1] = LAYOUT( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, + _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_END, KC_UP, _______, _______, + _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, _______, _______, KC_PGUP, KC_LEFT, KC_RGHT, _______, _______, + _______, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______, _______, _______, _______, _______, KC_PGDN, KC_DOWN, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + +}; From 224b4dea9805412d0f4b677dc22c1c4fca79a9de Mon Sep 17 00:00:00 2001 From: "Michael F. Lamb" Date: Tue, 4 Sep 2018 08:55:31 -0700 Subject: [PATCH 055/788] mitosis:datagrok add layer select, more layouts (#3835) * mitosis:datagrok: fix typo'd inconsistent brace arrangement (thank you @cari66ean) * mitosis:datagrok: add makefile argument MITOSIS_DATAGROK_SLOWUART * mitosis:datagrok: return backspace to opposite space, use TT(), more - move backspace back to its position opposite space - move del to red+backspace - move tab back to tap-leftshift - move printscreen/scrolllock/pause to blue+left pinky column - use TT() instead of MO() to stick a layer on if wanted - indentation that my text editor wants - default to no audio; i can enable it at compile time. * mitosis:datagrok: modularize features, add default layer rotator key * mitosis: add MITOSIS_DATAGROK_BOTTOMSPACE makefile argument * mitosis:datagrok: README improvements; document new features * mitosis:datagrok: dot. not "number pad dot." in numbers layer * mitosis:datagrok remove unnecessary _user audio code * mitosis:datagrok: return to MO() for red/blue, keep TT() for purple in this way, the LED still updates quickly when red or blue is pressed, but we can still lock the purple layer on for 10-key numpad operation with red+tapping blue. * mitosis:datagrok: add colemak and dvorak default layers * mitosis:datagrok update readme re: available default layouts * mitosis: remove unneeded code that was overriding led_set_user also, add some comments * mitosis:datagrok: updated led setting code for new layers also, place into led_set_user where it belongs, not matrix_scan_user. * mitosis:datagrok: update LEDs when setting the default layer maybe this should go into default_layer_set? * mitosis:datagrok update readme with new imgur links + other improvements * mitosis:datagrok fix typo in image urls * mitosis:datagrok remove useless #include (ty @drashna) * mitosis:datagrok undo unnecessary change to quantum/quantum.h i can put the extern float definition in my own keymap code. (ty @drashna) * mitosis:datagrok move customized layout to my keymap no need to modify keyboard-level mitosis.h. (ty @drashna) * mitosis:datagrok update comment describing my led indicator logic * datagrok:mitosis update readme to document LED indicator. --- keyboards/mitosis/keymaps/datagrok/config.h | 41 +++- keyboards/mitosis/keymaps/datagrok/keymap.c | 233 ++++++++++++------- keyboards/mitosis/keymaps/datagrok/readme.md | 145 ++++++++---- keyboards/mitosis/keymaps/datagrok/rules.mk | 25 +- keyboards/mitosis/mitosis.c | 19 +- keyboards/mitosis/mitosis.h | 19 +- 6 files changed, 319 insertions(+), 163 deletions(-) diff --git a/keyboards/mitosis/keymaps/datagrok/config.h b/keyboards/mitosis/keymaps/datagrok/config.h index 9edb950cf..1c70a3791 100644 --- a/keyboards/mitosis/keymaps/datagrok/config.h +++ b/keyboards/mitosis/keymaps/datagrok/config.h @@ -1,12 +1,21 @@ #ifndef CONFIG_USER_H #define CONFIG_USER_H -#include "../../config.h" +#ifdef MITOSIS_DATAGROK_SLOWUART +// This is the highest possible baud rate that a pro micro clocked at 8Mhz can +// support without errors. I don't notice any difference in behavior at this +// slower speed. (So I think it should maybe be the default, to allow a single +// codebase to support both available flavors of pro micro.) This requires a +// corresponding change to the wireless module firmware; see +// https://github.com/reversebias/mitosis/pull/10 +#undef SERIAL_UART_BAUD // avoids redefinition warning +#define SERIAL_UART_BAUD 250000 +#endif // I want to place an underscore as tap behavior on the right shift key. But // RSFT_T(KC_UNDS) doesn't work; mod-tap doesn't work with pre-shifted keys. So -// instead we take advantage of Space Cadet Shift that does something similar -// and just tweak it to use the -_ key instead of 0) See +// instead I take advantage of Space Cadet Shift that does something similar +// and just tweak it to use the -/_ key instead of 0/). See // https://github.com/qmk/qmk_firmware/pull/2055 #define RSPC_KEY KC_MINS @@ -18,11 +27,12 @@ //#define NO_ACTION_FUNCTION #ifdef AUDIO_ENABLE -#define STARTUP_SONG SONG(PLANCK_SOUND) -// #define STARTUP_SONG SONG(NO_SOUND) -#define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \ - SONG(COLEMAK_SOUND), \ - SONG(DVORAK_SOUND) \ +#define STARTUP_SONG SONG(MARIO_MUSHROOM) +#define DEFAULT_LAYER_SONGS { \ + SONG(QWERTY_SOUND), \ + SONG(COLEMAK_SOUND), \ + SONG(DVORAK_SOUND), \ + SONG(ZELDA_TREASURE), \ } #define AUDIO_VOICES #define AUDIO_CLICKY @@ -30,3 +40,18 @@ #endif #endif + +#define LAYOUT_bottomspace( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, \ + k31, k32, k33, k34, k35, k36, k37, k38, \ + k41, k42, k43, k44, k45, k46, k47, k48 \ + ) \ + { \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09 }, \ + { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19 }, \ + { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29 }, \ + { KC_NO, k31, k32, k43, k44, k45, k46, k37, k38, KC_NO }, \ + { KC_NO, k41, k42, k33, k34, k35, k36, k47, k48, KC_NO } \ + } diff --git a/keyboards/mitosis/keymaps/datagrok/keymap.c b/keyboards/mitosis/keymaps/datagrok/keymap.c index 4fda3f839..ae3b95470 100644 --- a/keyboards/mitosis/keymaps/datagrok/keymap.c +++ b/keyboards/mitosis/keymaps/datagrok/keymap.c @@ -1,16 +1,34 @@ #include QMK_KEYBOARD_H + #ifdef AUDIO_ENABLE #include "audio.h" +#ifdef DEFAULT_LAYER_SONGS +extern float default_layer_songs[][][]; +#endif #endif enum mitosis_layers -{ + { _xQ, // qwerty + _xC, // colemak + _xD, // dvorak _xW, // workman _xS, // symbols _xN, // numbers _xF // functions -}; + }; + +enum mitosis_keycodes + { + KC_LAYO = SAFE_RANGE + }; + +// Setting MITOSIS_DATAGROK_BOTTOMSPACE in rules.mk will swap the upper and +// lower center four thumb-keys. See keymaps/datagrok/rules.mk. +#ifdef MITOSIS_DATAGROK_BOTTOMSPACE +#undef LAYOUT +#define LAYOUT LAYOUT_bottomspace +#endif // Fillers to make layering more clear #define _______ KC_TRNS // Transparent @@ -31,58 +49,125 @@ enum mitosis_layers const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_xQ] = LAYOUT( - KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, - KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, - KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_QUOT, - /*, */ KC_LGUI, KC_LCTL, MO(_xS), KC_TAB, KC_SPC, MO(_xS), KC_RCTL, KC_RGUI, - /*, */ KC_HENK, KC_LALT, MO(_xN), KC_LSFT, KC_RSPC, MO(_xN), KC_RALT, KC_MHEN), + KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, + KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, + KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_QUOT, + /*, */ KC_LGUI, KC_LCTL, MO(_xS), KC_BSPC, KC_SPC, MO(_xS), KC_RCTL, KC_RGUI, + /*, */ KC_HENK, KC_LALT, MO(_xN), LSFT_T(KC_TAB), KC_RSPC, MO(_xN), KC_RALT, KC_MHEN), + [_xC] = LAYOUT( + KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, + KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, + KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_QUOT, + /*, */ _______, _______, _______, _______, _______, _______, _______, _______, + /*, */ _______, _______, _______, _______, _______, _______, _______, _______), + [_xD] = LAYOUT( + KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, + KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, + KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, + /*, */ _______, _______, _______, _______, _______, _______, _______, _______, + /*, */ _______, _______, _______, _______, _______, _______, _______, _______), [_xW] = LAYOUT( - KC_Q, KC_D, KC_R, KC_W, KC_B, KC_J, KC_F, KC_U, KC_P, KC_SCLN, - KC_A, KC_S, KC_H, KC_T, KC_G, KC_Y, KC_N, KC_E, KC_O, KC_I, - KC_Z, KC_X, KC_M, KC_C, KC_V, KC_K, KC_L, KC_COMM, KC_DOT, KC_QUOT, - /*, */ _______, _______, _______, _______, _______, _______, _______, _______, - /*, */ _______, _______, _______, _______, _______, _______, _______, _______), + KC_Q, KC_D, KC_R, KC_W, KC_B, KC_J, KC_F, KC_U, KC_P, KC_SCLN, + KC_A, KC_S, KC_H, KC_T, KC_G, KC_Y, KC_N, KC_E, KC_O, KC_I, + KC_Z, KC_X, KC_M, KC_C, KC_V, KC_K, KC_L, KC_COMM, KC_DOT, KC_QUOT, + /*, */ _______, _______, _______, _______, _______, _______, _______, _______, + /*, */ _______, _______, _______, _______, _______, _______, _______, _______), [_xS] = LAYOUT( - KC_ESC, KC_GRV , KC_UP, KC_EQL , KC_TILD, KC_PLUS, KC_CIRC, KC_AMPR, KC_PERC, KC_MINS, - KC_BSPC, KC_LEFT, KC_DOWN, KC_RGHT, _______, KC_PIPE, KC_AT, KC_DLR, KC_HASH, KC_ENT, - KC_BSLS, KC_LABK, KC_LCBR, KC_LPRN, KC_LBRC, KC_RBRC, KC_RCBR, KC_RPRN, KC_RABK, KC_SLSH, - /*, */ _______, _______, _______, _______, _______, _______, _______, _______, - /*, */ _______, _______, MO(_xF), _______, _______, MO(_xF), _______, _______), + KC_ESC, KC_GRV , KC_UP, KC_EQL , KC_TILD, KC_PLUS, KC_CIRC, KC_AMPR, KC_PERC, KC_MINS, + _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, KC_PIPE, KC_AT, KC_DLR, KC_HASH, KC_ENT, + KC_BSLS, KC_LABK, KC_LCBR, KC_LPRN, KC_LBRC, KC_RBRC, KC_RPRN, KC_RCBR, KC_RABK, KC_SLSH, + /*, */ _______, _______, _______, KC_DEL, _______, _______, _______, _______, + /*, */ _______, _______, TT(_xF), _______, _______, TT(_xF), _______, _______), [_xN] = LAYOUT( - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_PPLS, KC_7, KC_8, KC_9, KC_PMNS, - _______, KC_F4, KC_F5, KC_F6, KC_F11, KC_NLCK, KC_4, KC_5, KC_6, KC_PENT, - _______, KC_F1, KC_F2, KC_F3, KC_F12, KC_PAST, KC_1, KC_2, KC_3, KC_PSLS, - /*, */ _______, _______, MO(_xF), _______, _______, MO(_xF), KC_0, KC_PDOT, - /*, */ _______, _______, _______, _______, _______, _______, _______, _______), + KC_PSCR, KC_F7, KC_F8, KC_F9, KC_F10, KC_PPLS, KC_7, KC_8, KC_9, KC_PMNS, + KC_SLCK, KC_F4, KC_F5, KC_F6, KC_F11, KC_NLCK, KC_4, KC_5, KC_6, KC_PENT, + KC_PAUS, KC_F1, KC_F2, KC_F3, KC_F12, KC_PAST, KC_1, KC_2, KC_3, KC_PSLS, + /*, */ _______, _______, TT(_xF), _______, _______, TT(_xF), KC_0, KC_DOT, + /*, */ _______, _______, _______, _______, _______, _______, _______, _______), [_xF] = LAYOUT( - RESET, KC_INS, KC_PGUP, KC_DEL, KC_VOLU, KC_PPLS, KC_P7, KC_P8, KC_P9, KC_PMNS, - CK_TOGG, KC_HOME, KC_PGDN, KC_END, KC_VOLD, KC_NLCK, KC_P4, KC_P5, KC_P6, KC_PENT, - TG(_xW), KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_PAST, KC_P1, KC_P2, KC_P3, KC_PSLS, - /*, */ CK_UP, MU_TOG, _______, _______, _______, _______, KC_P0, KC_PDOT, - /*, */ CK_DOWN, MU_MOD, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUS), + RESET, KC_INS, KC_PGUP, DEBUG, KC_VOLU, KC_PPLS, KC_P7, KC_P8, KC_P9, KC_PMNS, + CK_TOGG, KC_HOME, KC_PGDN, KC_END, KC_VOLD, KC_NLCK, KC_P4, KC_P5, KC_P6, KC_PENT, + KC_LAYO, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_PAST, KC_P1, KC_P2, KC_P3, KC_PSLS, + /*, */ CK_UP, MU_TOG, _______, _______, _______, _______, KC_P0, KC_PDOT, + /*, */ CK_DOWN, MU_MOD, _______, _______, _______, _______, _______, _______), }; +const bool defaultlayers[] = { + [_xQ] = true, + [_xC] = true, + [_xD] = true, + [_xW] = true, + [_xS] = false, + [_xN] = false, + [_xF] = false, +}; +const size_t defaultlayers_n = sizeof(defaultlayers) / sizeof(defaultlayers[0]); -// This is a hack to place on and event.pressed) { + return true; + } + + if (get_mods() & (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT))) { // shift pressed + // save default layer. whatever the current default layer is, store that + eeconfig_update_default_layer(default_layer_state); + #if defined(AUDIO_ENABLE) + PLAY_SONG(saved_song); + #endif + } else { + // rotate default layer. + // find the current default layer + default_layer = biton32(default_layer_state); + // find next valid default layer + for (i = 1; i < defaultlayers_n; i++) { + if (defaultlayers[(default_layer + i) % defaultlayers_n]) { + break; + } + } + if (i == defaultlayers_n) { + // we fell out of the loop without finding another default layer to switch + // to. + return false; + } + default_layer = (default_layer + i) % defaultlayers_n; + default_layer_set(1U< on and on , when using an operating system configured for a // US/qwerty layout. +// cdeq = "comma dot exclamation question" bool comm_shifted = false; bool ques_shifted = false; -bool process_record_user(uint16_t keycode, keyrecord_t *record) { +bool process_record_cdeq(uint16_t keycode, keyrecord_t *record) { uint8_t shifted; uint16_t s_keycode; bool *k_shifted; switch (keycode) { - case KC_COMM: - s_keycode = KC_SLSH; - k_shifted = &comm_shifted; - break; - case KC_DOT: - s_keycode = KC_1; - k_shifted = &ques_shifted; - break; - default: - return true; + case KC_COMM: + s_keycode = KC_SLSH; + k_shifted = &comm_shifted; + break; + case KC_DOT: + s_keycode = KC_1; + k_shifted = &ques_shifted; + break; + default: + return true; } shifted = get_mods() & (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)); @@ -104,47 +189,29 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } } -#ifdef AUDIO_ENABLE -float tone_qwerty[][2] = SONG(QWERTY_SOUND); -float tone_dyn_macro_rec[][2] = SONG(DVORAK_SOUND); -float tone_dyn_macro_play[][2] = SONG(COLEMAK_SOUND); -float tone_fnpc[][2] = SONG(PLOVER_SOUND); -float tone_fnmac[][2] = SONG(PLOVER_GOODBYE_SOUND); - -void startup_user() -{ - float tone_startup[][2] = SONG(STARTUP_SOUND); - _delay_ms(20); // gets rid of tick - PLAY_SONG(tone_startup); +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return \ + process_record_cdeq(keycode, record) && \ + process_record_layout(keycode, record); } -void shutdown_user() -{ - float tone_goodbye[][2] = SONG(GOODBYE_SOUND); - PLAY_SONG(tone_goodbye); - _delay_ms(150); - stop_all_notes(); -} - -void music_on_user(void) -{ - music_scale_user(); -} - -void music_scale_user(void) -{ - float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); - PLAY_SONG(music_scale); -} - -#endif - // Set the bits of A selected by MASK to the corresponding bits of B #define setbits(A, B, MASK) A = (A & (B | ~MASK)) | (B & MASK) -void matrix_scan_user(void) { + +void led_set_user(uint8_t usb_leds) { + // A simple (but technically inaccurate) model of the momentary layer state: + // Red layer active -> indicator = red + // Blue layer active -> indicator = blue + // Purple layer active -> indicator = purple + // the Pro Micro tx LED displays Num Lock status. // + // Workman layout active -> indicator = green + // Workman red layer -> indicator = yellow (red + green) + // Workman blue layer -> indicator = cyan (blue + green) + // Workman purple layer -> indicator = white (red + blue + green) + // Bit # 7 6 5 4 3 2 1 0 - // layer_state: [ | | | _xF | _xN | _xS | _xQ | _xW ] + // layer_state: [ | _xF | _xN | _xS | _xW | _xD | _xC | _xQ ] // usb_led [ | | |kana |cmps |scrl |caps | num ] // PORTB: [ NC | 10 | 9 | 8 | 14 | 16 | 15 |rxled] // PORTC: [ NC | 5 | | | | | | ] @@ -158,16 +225,16 @@ void matrix_scan_user(void) { // board. Each may be connected to an LED by way of a resistor (4.7k to // match the others) for a total of 14 additional indicators. - // A simple (but technically inaccurate) model of the momentary layer state: - // Fn1 key makes _xS active; indicator = red - // Fn2 key makes _xN active; indicator = blue - // Both keys make _xF active; indicator = purple - // Toggling QWERTY mode makes indicator include green, so (red/blue/purple becomes yellow/cyan/white) - + uint32_t portf_bits = \ + ((layer_state|default_layer_state)&0b01100000)>>1 | \ + ((layer_state|default_layer_state)&0b00010000)<<1 | \ + ((layer_state|default_layer_state)&0b01000000)>>2; + uint32_t portd_bits = \ + (usb_leds&0b1)<<5 | \ + ((layer_state|default_layer_state)&0b1000)>>2; // negated because for ports 0=LED on. - uint32_t portf_bits = ~(layer_state|layer_state<<1|(layer_state&0b100)<<3); - setbits(PORTF, portf_bits, 0b00110000); - setbits(PORTD, ~layer_state, 0b00000010); + setbits(PORTF, ~portf_bits, 0b00110000); + setbits(PORTD, ~portd_bits, 0b00100010); } // vim: set sw=2 et: diff --git a/keyboards/mitosis/keymaps/datagrok/readme.md b/keyboards/mitosis/keymaps/datagrok/readme.md index 9b159b98a..22d7f4d2f 100644 --- a/keyboards/mitosis/keymaps/datagrok/readme.md +++ b/keyboards/mitosis/keymaps/datagrok/readme.md @@ -1,54 +1,59 @@ # a layout for the Mitosis - Emphasis on momentary modifiers, all usable from either hand, arranged symmetrically, but left/right distinguishable by the OS. - Shift, Red ("Lower"), Blue ("Raise"), Super ("Windows"), Meta ("Alt"), Hyper (actually Henkan/Muhenkan). + I place left- and right-versions of Shift, GUI ("Super"), and Alt ("Meta"), and Henkan/Muhenkan (which I plan to overload for "Hyper"). + I'm going for a [Space Cadet](https://en.wikipedia.org/wiki/Space-cadet_keyboard) aesthetic; I want a keyboard that can (even just in theory) make use of all the bucky bits my operating system can support. -- Red and Blue are used to momentary-enable (like a shift key) one of three layers: +- Red key and Blue key momentary-enable (like a shift key) one of three layers: - Red: Symbols layer - Blue: Numbers layer - "Purple" (both Red and Blue): Functions layer + + This tri-state layer mechanism is a bit similar to Planck and Preonic's "Raise," "Lower," and "Adjust." - The base layer is QWERTY. - A slight variant of [Workman][] may be toggled using `Red`+`Blue`+`Z`. + [Colemak][], [Dvorak][], and [Workman][] may be toggled using `Red`+`Blue`+`Z`. + When you find the one you like, save it with `Shift`+`Red`+`Blue`+`Z`. - Minimize hand travel, so as not to lose orientation with home row. -- `?` and `!` are moved to take the place of `<` and `>`. Rationale: unmodded - and shifted keys should be for prose, while symbols useful for programming - should be colocated on their own layer. +- `?` and `!` are moved to take the place of `<` and `>`. + Rationale: unmodded and shifted keys should be for prose, while symbols useful for programming should be colocated on their own layer. - Key positions chosen for mnemonics. For example, you can distinguish between alphanumeric numerals and keypad numerals, but they occupy the same key positions. ## Layout Images -![mitosis:datagrok layout base layer](https://imgur.com/9LoLQUk.png) +![mitosis:datagrok layout base layer](https://i.imgur.com/tap5Pjf.png) Base layer. Notes: - customized comma and period, which have exclamation point and question mark on their shift layer. -- tap right-shift for underscore +- tap right-shift for underscore, tap left-shift for tab. -![mitosis:datagrok layout red layer](https://imgur.com/B5bnPGM.png) +![mitosis:datagrok layout red layer](https://i.imgur.com/sMGr34T.png) Red layer. Intended for common navigation and programming symbols. Notes: - symmetric layout of paired braces/brackets/slashes for easier memorization - arrows placed directly on home position -![mitosis:datagrok layout blue layer](https://imgur.com/HGJ4G1U.png) +![mitosis:datagrok layout blue layer](https://i.imgur.com/dDb2563.png) Blue layer. Intended for "number pad." Notes: -- Keycodes generated for numbers, enter key, and mathematical symbols are from the alphanumeric keys, not keypad. This way they are not influenced by the state of Num Lock. If you want to send the keypad equivalents, just use Red and Blue modifiers simultaneously. +- Keycodes generated for numbers, enter key, and mathematical symbols are from the alphanumeric keys, not keypad. + This way they are not influenced by the state of Num Lock. + If you want to send the keypad equivalents, just press Blue as well to access keypad numbers in the same positions in the Purple layer. -![mitosis:datagrok layout purple layer](https://imgur.com/lNsKDtA.png) +![mitosis:datagrok layout purple layer](https://i.imgur.com/pESzy2u.png) Purple (Red+Blue) layer. Intended for "true keypad" and various functions. Notes: - Numbers on this layer send Keypad codes, so the result will be affected by the state of Num Lock. -- "Switch Layout" toggles the alphabet keys between QWERTY and Workman -- Page Up / Page Down / Home / End are placed on similar arrows -- To press Print Screen it is necessary to use the left-side Red and Blue modifiers. +- "Switch Layout" toggles the alphabet keys between QWERTY, Colemak, Dvorak, and Workman. + Shift + "Switch Layout" stores the currently selected alphabet layout in eeprom, so the selection persists across reboots and computers. +- Page Up / Page Down / Home / End are placed on corresponding arrow keys. Keyboard layout editor sources: [base](http://www.keyboard-layout-editor.com/#/gists/bc2d06a3203d1bc3a14ed2245cf39643) @@ -56,14 +61,41 @@ Keyboard layout editor sources: [blue](http://www.keyboard-layout-editor.com/#/gists/240e807f3d7e1d3ddabe1b69ee675048) [purple](http://www.keyboard-layout-editor.com/#/gists/9559f0f8bb1ee47677c8f2b4d766829d) -[Imgur album](https://imgur.com/a/KSoVgPx) +[Imgur album](https://imgur.com/a/hm4bbdM) + +## Indicators + +- When Red layer is active, the RGB indicator turns red. +- When Blue layer is active, the RGB indicator turns blue. +- When Purple layer is active, the RGB indicator turns purple. +- When the Workman layer is active, the RGB indicator turns green. + Currently, this means that activating the Red layer while using the Workman layout will make the indicator show yellow. (red + green.) +- The Num Lock status is shown on the Pro Micro tx LED. +- If you attach a speaker to PC6 (pin 5) and compile with AUDIO_ENABLE=yes, music will be played at startup, when switching default layers, and when saving the default layer. + +## Variants + +Some additional compile-time options for this layout are available by editing rules.mk or compiling like so: + +Normal compilation: + +```make mitosis:datagrok``` + +Swap Space onto bottom thumb row: swaps Red/Backspace/Space/Red with Blue/Shift/Shift/Blue: + +```make mitosis:datagrok MITOSIS_DATAGROK_BOTTOMSPACE=yes``` + +Lower baud UART. Useful when using an 8Mhz pro micro; corresponding changes required in wireless firmware. See rules.mk for details. + +```make mitosis:datagrok MITOSIS_DATAGROK_SLOWUART=yes``` ## Design notes ### Workman layout -- I'm learning a new physical key placement, so I might as well go all-out and - use an optimal non-QWERTY layout. +- I'm learning a new physical key placement, so I might as well go all-out and use an optimal non-QWERTY layout. + Bonus: it's easy to switch back to QWERTY on a traditional row-staggered keyboard. + The designer of the Mitosis had [a similar experience](https://www.reddit.com/r/MechanicalKeyboards/comments/66588f/wireless_split_qmk_mitosis/dgfr22q/). - I like the way Workman feels and some of its advantages over Colemak. Unfortunately, it was designed using a weighting system based on a standard @@ -78,14 +110,10 @@ Keyboard layout editor sources: The next fastest baudrate that works without errors is 250k baud. So if you want to do the same: - - Set the Pro Micro clock rate correctly in `rules.mk`: + - Set the Pro Micro clock and baud rate correctly in `rules.mk`: ``` F_CPU = 800000 - ``` - - Configure it to communicate at 250k baud in `config.h`: - ``` - #undef SERIAL_UART_BAUD // avoids redefinition warning - #define SERIAL_UART_BAUD 250000 + MITOSIS_DATAGROK_SLOWUART = yes ``` - Configure the receiver's wireless module to communicate at 250k baud in `main.c`. See https://github.com/reversebias/mitosis/pull/10 ``` @@ -99,7 +127,7 @@ Keyboard layout editor sources: - Arrow keys are in the home position on the Red layer. - - Blue+Arrows = PgUp/PgDn/Home/End, which is intuitive for me. + - Blue+Arrows = PgUp/PgDn/Home/End, which is intuitive for me and similar to what is done on Apple and some Dell keyboards. - The number pad: I placed the ten-key number pad on the Blue layer. However, this would do the wrong thing when Num Lock was not enabled. @@ -111,11 +139,7 @@ Keyboard layout editor sources: - The Function-keys are arranged to mimic the order of the ten-key pad. - Enter is now in a more qwerty-familiar location, and may be activated with one hand. - Numpad Enter is in the same position. - -- Rather than place Backspace opposite Space, I intentionally place it on a layer where it takes some effort to activate. - Backspace is one of the keys I most dislike on a QWERTY keyboard because it moves me away from homerow and I need to use it so often. - Rather than make it easier to strike, I want to discourage myself from using it by learning to type more accurately. + Numpad Enter is in the same position for mnemonics. - Why do I dislike [snake\_case](https://en.wikipedia.org/wiki/Snake_case) (`__variable_names_that_use_underscores_`)? Maybe because it's hard to type all those underscores requiring the shift key? @@ -126,6 +150,22 @@ Keyboard layout editor sources: ### Current +- Discard "intentionally difficult backspace" idea. + Tab returns to left-shift. + Del returns to Red+Backspace +- "High Profile mode:" Swap Red/Backspace/Space/Red with Blue/Shift/Shift/Blue (placing space on lower thumb keys) using `MITOSIS_DATAGROK_BOTTOMSPACE=yes` when compiling. +- Move Print Screen / Scroll Lock / Pause to pinky column on Blue layer. +- Let's try using TT instead of MO so we can e.g. lock-on the keypad. + - We still use MO for first modifier, so e.g. Red + tapping Blue will lock purple. + So far it feels a bit janky, we'll see. +- One key `KC_LAYO` to cycle through available base layers instead of a dedicated key for each; + Shift + `KC_LAYO` stores current base layer selection in eeprom so it comes back after disconnecting or a reset. +- Added Colemak and Dvorak as default layers that may be selected. +- Set UART to 250kbaud with make argument `MITOSIS_DATAGROK_SLOWUART=yes`, for use with 8Mhz Pro Micros. +- Display Num Lock status on tx LED + +### 0.6.60 + - Experiment: no-modifier underscore on right shift key. - New combined numbers + keypad arrangement. No more worrying about Num Lock key. @@ -168,27 +208,33 @@ Keyboard layout editor sources: ### Abandoned ideas -- "Since QWERTY and Workman keep angle brackets together, place other - enclosing symbols on the same keys. This informs the numbers placement, - which informs the function-key placement." +- Abandoned: intentionally-difficult backspace. + "Backspace is one of the keys I most dislike on a QWERTY keyboard because it moves me away from homerow and I need to use it so often. + Rather than make it easier to strike, I want to discourage myself from using it and train myself to type more accurately." + + - Many other people like an easy-to-reach backspace. + - Many other split-spacebar ergo boards place backspace at the thumbs. + - I can still train myself to type well with it in an easy location. + - I couldn't think of anything really better to put opposite space. - - I tried this and it was bad. I don't like having to pick the right - modifier to get the right flavor of bracket. Instead, now, one modifier - activates a symbols layer where all brackets are easily accessible. +- Abandoned: pile all brackets onto one pair of keys. + "Since QWERTY and Workman keep angle brackets together, place other enclosing symbols on the same keys." -- Space/Enter to the left of layer select for Enter + - I didn't like having to pick the right modifier to get the right flavor of bracket. + Instead, now, one modifier activates a symbols layer where all brackets are easily accessible. - - Doesn't work well; I always trigger space first when mashing the keys +- Abandoned: chorded Enter without proper chording detection + + - I tried to make Red+Space = Enter with the intention that I could hit both with my thumb. + That didn't work well; I always trigger space first when mashing the keys simultaneously. ~~This might not continue to be true if I change the angle at which I strike the keys e.g. with a neoprene base or a wrist support.~~ Even with a wrist rest or low-profile, this is hard to do with one hand. Need to adjust the firmware to understand chorded thumb keys. -- I used to have Blue on ring finger, but that was too hard to use in - conjunction with shift. - ## To do +- Ctrl+'+' doesn't seem to work; fix. - **Shared Layouts.** Figure out how to make use of QMK's common `layouts/` - **Chorded Combos.** @@ -203,16 +249,23 @@ Keyboard layout editor sources: Do any of my applications use it? Should I have the firmware ensure it is set how I want it? Maybe cause it to be momentary active with Blue? - See [@drashna's comment](https://github.com/qmk/qmk_firmware/pull/2366#issuecomment-404951953) -- Store default base layer in eeprom? + See [@drashna's comment](https://github.com/qmk/qmk_firmware/pull/2366#issuecomment-404951953) for code to force it always-on, which I don't know if I want. +- ~~Store default layer in eeprom?~~ +- Allow "!? on ,." to be easily toggled-off. +- Modularize "!? on ,." so it can be easily used on any QMK keyboard. (about half done) - See if the henkan/muhenkan placement is at all useful for Japanese speakers, or abuse different keysyms for Left/Right Hyper. (Original space cadet used scancodes 145/175. 145 is LANG2, 175 is "reserved" in USB HID spec.) - Implement "layer lock" key +- Feature parity with popular boards e.g. Planck? + - Layers for ~~Dvorak, Coleman,~~ Plover + - More music and midi stuff + - Macros? - Improve tri-layer behavior -- Find a better location for PrintScr/SysRq, Scroll Lock, Pause/Break, Caps Lock. -- ~~Figure out where to place non-numpad numbers so we don't need num lock turned - on to type them?~~ +- Find out what `update_tri_layer_state` offers that my simple layers arrangement lacks. +- ~~Find a better location for Caps Lock, PrintScr/SysRq, Scroll Lock, Pause/Break,~~. + Placed on Blue layer. Caps will be Shift+"Layer Lock," once I get that working. +- ~~Figure out where to place non-numpad numbers so we don't need num lock turned on to type them?~~ - ~~Add Insert, PrintScr, Pause/Break~~ - ~~Make QWERTY base layer for people who customize layout in software?~~ I default to QWERTY now. diff --git a/keyboards/mitosis/keymaps/datagrok/rules.mk b/keyboards/mitosis/keymaps/datagrok/rules.mk index a321a67b2..215e58a7d 100644 --- a/keyboards/mitosis/keymaps/datagrok/rules.mk +++ b/keyboards/mitosis/keymaps/datagrok/rules.mk @@ -1,4 +1,19 @@ -AUDIO_ENABLE = yes # audio output +# Space and "Red" modifier are keys I want in the easiest-to-reach position in +# the thumb row. Depending on the angle and height of the Mitosis and the type +# of keycaps you use, the upper row or the lower row of thumb keys might be more +# comfortable for you. I put red/space on the upper row and blue/shift on the +# lower, but to swap that, set MITOSIS_DATAGROK_BOTTOMSPACE = yes. This has the +# effect of swapping only the four center keys on the upper row of thumb keys with that +# of the lower row of thumb keys. +MITOSIS_DATAGROK_BOTTOMSPACE = no + +# I used to use a pro micro clocked at 8Mhz. It can't reach the same baud rate +# that the standard 16Mhz-clocked pro micro can, so the baud rate needs to be +# lowered. Set this to "yes" to do that. See also +# https://github.com/reversebias/mitosis/pull/10 +MITOSIS_DATAGROK_SLOWUART = no + +AUDIO_ENABLE = no # audio output FAUXCLICKY_ENABLE = no BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) MOUSEKEY_ENABLE = no # Mouse keys(+4700) @@ -9,4 +24,12 @@ UNICODE_ENABLE = no # Unicode BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID MIDI_ENABLE = no # MIDI controls + +ifeq ($(strip $(MITOSIS_DATAGROK_BOTTOMSPACE)), yes) + OPT_DEFS += -DMITOSIS_DATAGROK_BOTTOMSPACE +endif +ifeq ($(strip $(MITOSIS_DATAGROK_SLOWUART)), yes) + OPT_DEFS += -DMITOSIS_DATAGROK_SLOWUART +endif + # vim: set ts=8 noet: diff --git a/keyboards/mitosis/mitosis.c b/keyboards/mitosis/mitosis.c index f965f2a04..1ca7276e4 100644 --- a/keyboards/mitosis/mitosis.c +++ b/keyboards/mitosis/mitosis.c @@ -5,13 +5,12 @@ void uart_init(void) { } void led_init(void) { - DDRD |= (1<<1); - PORTD |= (1<<1); - DDRF |= (1<<4) | (1<<5); - PORTF |= (1<<4) | (1<<5); + DDRD |= (1<<1); // Pin to green, set as output + PORTD |= (1<<1); // Turn it off + DDRF |= (1<<4) | (1<<5); // Pins to red and blue, set as output + PORTF |= (1<<4) | (1<<5); // Turn them off } - void matrix_init_kb(void) { // put your keyboard start-up code here // runs once when the firmware starts up @@ -20,16 +19,6 @@ void matrix_init_kb(void) { led_init(); } -void matrix_scan_kb(void) { - // put your looping keyboard code here - // runs every cycle (a lot) - matrix_scan_user(); -} - -void led_set_kb(uint8_t usb_led) { - -} - #ifdef SWAP_HANDS_ENABLE __attribute__ ((weak)) const keypos_t hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = { diff --git a/keyboards/mitosis/mitosis.h b/keyboards/mitosis/mitosis.h index 5dd7cc778..4b73f0407 100644 --- a/keyboards/mitosis/mitosis.h +++ b/keyboards/mitosis/mitosis.h @@ -53,15 +53,14 @@ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, \ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, \ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, \ - k31, k32, k33, k34, k35, k36, k37, k38, \ - k41, k42, k43, k44, k45, k46, k47, k48 \ + k31, k32, k33, k34, k35, k36, k37, k38, \ + k41, k42, k43, k44, k45, k46, k47, k48 \ ) \ -{ \ - { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09 }, \ - { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19 }, \ - { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29 }, \ - { KC_NO, k31, k32, k33, k34, k35, k36, k37, k38, KC_NO }, \ - { KC_NO, k41, k42, k43, k44, k45, k46, k47, k48, KC_NO } \ -} - + { \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09 }, \ + { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19 }, \ + { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29 }, \ + { KC_NO, k31, k32, k33, k34, k35, k36, k37, k38, KC_NO }, \ + { KC_NO, k41, k42, k43, k44, k45, k46, k47, k48, KC_NO } \ + } #endif From 1a907a1627796468c5d93c091168fede5893bbc7 Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Tue, 4 Sep 2018 13:29:58 -0700 Subject: [PATCH 056/788] Keyboard: formatting changes for readme and enable bootmagic (#3851) --- keyboards/kbd6x/readme.md | 3 ++- keyboards/kbd6x/rules.mk | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/keyboards/kbd6x/readme.md b/keyboards/kbd6x/readme.md index 625ec8968..b50646ace 100644 --- a/keyboards/kbd6x/readme.md +++ b/keyboards/kbd6x/readme.md @@ -4,7 +4,8 @@ A WKL Hot Swap Double USB C 60% Keyboard Maintainer: [MechMerlin](https://github.com/mechmerlin) Hardware Supported: KBD6x PCB -Hardware Availability: [KBDFans](https://kbdfans.cn/products/kbd6x-wkl-hot-swap-60-double-type-c-pcb) +Hardware Availability: [KBDFans](https://kbdfans.cn/products/kbd6x-wkl-hot-swap-60-double-type-c-pcb) + Make example for this keyboard (after setting up your build environment): make kbd6x:default diff --git a/keyboards/kbd6x/rules.mk b/keyboards/kbd6x/rules.mk index b8acb7ad9..5c7a3877e 100644 --- a/keyboards/kbd6x/rules.mk +++ b/keyboards/kbd6x/rules.mk @@ -51,7 +51,7 @@ OPT_DEFS += -DBOOTLOADER_SIZE=4096 # Build Options # change yes to no to disable # -BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) MOUSEKEY_ENABLE = no # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) CONSOLE_ENABLE = yes # Console for debug(+400) From 73a3399d0ef7e06db70fc2964a3f2a35e9aca25d Mon Sep 17 00:00:00 2001 From: yiancar Date: Fri, 24 Aug 2018 15:38:31 +0300 Subject: [PATCH 057/788] Add the ability to disable the USB startup check for Chibios - Added support for NO_USB_STARTUP_CHECK. This allows the keyboard do function and not get stuck in a SUSPENDED state loop in case of no USB connection. - Added support for WAIT_FOR_USB. In LUFA no keyboard has this flag enable therefor no keyboard waits for usb to be active. - Added documentation for both configuration flags as they were missing. --- docs/config_options.md | 4 ++++ tmk_core/protocol/chibios/main.c | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/docs/config_options.md b/docs/config_options.md index e978bcce8..eaaa59872 100644 --- a/docs/config_options.md +++ b/docs/config_options.md @@ -248,3 +248,7 @@ Use these to enable or disable building certain features. The more you have enab * Enable Bluetooth with the Adafruit EZ-Key HID * `SPLIT_KEYBOARD` * Enables split keyboard support (dual MCU like the let's split and bakingpy's boards) and includes all necessary files located at quantum/split_common +* `WAIT_FOR_USB` + * Forces the keyboard to wait for a USB connection to be established before it starts up +* `NO_USB_STARTUP_CHECK` + * Disables usb suspend check after keyboard startup. Usually the keyboard waits for the host to wake it up before any tasks are performed. This is useful for split keyboards as one half will not get a wakeup call but must send commands to the master. diff --git a/tmk_core/protocol/chibios/main.c b/tmk_core/protocol/chibios/main.c index 568c1edb2..dcc6d9d07 100644 --- a/tmk_core/protocol/chibios/main.c +++ b/tmk_core/protocol/chibios/main.c @@ -142,10 +142,15 @@ int main(void) { /* Wait until the USB or serial link is active */ while (true) { +#if defined(WAIT_FOR_USB) || defined(SERIAL_LINK_ENABLE) if(USB_DRIVER.state == USB_ACTIVE) { driver = &chibios_driver; break; } +#else + driver = &chibios_driver; + break; +#endif #ifdef SERIAL_LINK_ENABLE if(is_serial_link_connected()) { driver = get_serial_link_driver(); @@ -178,6 +183,7 @@ int main(void) { /* Main loop */ while(true) { +#if !defined(NO_USB_STARTUP_CHECK) if(USB_DRIVER.state == USB_SUSPENDED) { print("[s]"); #ifdef VISUALIZER_ENABLE @@ -205,6 +211,7 @@ int main(void) { visualizer_resume(); #endif } +#endif keyboard_task(); #ifdef CONSOLE_ENABLE From e5465e1c57f1ae6b71e1e665e4afd5f5e3909a89 Mon Sep 17 00:00:00 2001 From: patrickmt <40182064+patrickmt@users.noreply.github.com> Date: Wed, 5 Sep 2018 12:25:47 -0400 Subject: [PATCH 058/788] CTRL and ALT updates Added support to enter bootloader from software (bootloader version must be newer than "v2.18Jun 22 2018 17:28:08" until workaround for older is created). Updated CTRL and ALT keymaps for entering bootloader with Fn+b held for >500ms. Added basic MacOS keymap for ALT. USB sleep LED indicator now turns off after 1 second. Slowed down debug LED code printing. --- .../massdrop/alt/keymaps/default/keymap.c | 14 +- keyboards/massdrop/alt/keymaps/mac/keymap.c | 212 ++++++++++++++++++ .../massdrop/ctrl/keymaps/default/keymap.c | 16 +- keyboards/massdrop/ctrl/keymaps/mac/keymap.c | 12 + tmk_core/common/arm_atsam/bootloader.c | 32 ++- tmk_core/protocol/arm_atsam/d51_util.c | 4 +- tmk_core/protocol/arm_atsam/main_arm_atsam.c | 7 +- 7 files changed, 290 insertions(+), 7 deletions(-) create mode 100644 keyboards/massdrop/alt/keymaps/mac/keymap.c diff --git a/keyboards/massdrop/alt/keymaps/default/keymap.c b/keyboards/massdrop/alt/keymaps/default/keymap.c index 3f0b84e38..9d8387bb7 100644 --- a/keyboards/massdrop/alt/keymaps/default/keymap.c +++ b/keyboards/massdrop/alt/keymaps/default/keymap.c @@ -19,6 +19,7 @@ enum alt_keycodes { DBG_MTRX, //DEBUG Toggle Matrix Prints DBG_KBD, //DEBUG Toggle Keyboard Prints DBG_MOU, //DEBUG Toggle Mouse Prints + MD_BOOT, //Restart into bootloader after hold timeout }; #define TG_NKRO MAGIC_TOGGLE_NKRO //Toggle 6KRO / NKRO mode @@ -37,7 +38,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_MUTE, \ L_T_BR, L_PSD, L_BRI, L_PSI, KC_TRNS, KC_TRNS, KC_TRNS, U_T_AUTO,U_T_AGCR,KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, \ L_T_PTD, L_PTP, L_BRD, L_PTN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, \ - KC_TRNS, L_T_MD, L_T_ONF, KC_TRNS, KC_TRNS, KC_TRNS, TG_NKRO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_VOLD, \ + KC_TRNS, L_T_MD, L_T_ONF, KC_TRNS, KC_TRNS, MD_BOOT, TG_NKRO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_VOLD, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGDN, KC_END \ ), /* @@ -68,6 +69,8 @@ void matrix_scan_user(void) { #define MODS_ALT (keyboard_report->mods & MOD_BIT(KC_LALT) || keyboard_report->mods & MOD_BIT(KC_RALT)) bool process_record_user(uint16_t keycode, keyrecord_t *record) { + static uint32_t key_timer; + switch (keycode) { case L_BRI: if (record->event.pressed) { @@ -194,6 +197,15 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { CDC_print("\r\n"); } return false; + case MD_BOOT: + if (record->event.pressed) { + key_timer = timer_read32(); + } else { + if (timer_elapsed32(key_timer) >= 500) { + reset_keyboard(); + } + } + return false; default: return true; //Process all other keycodes normally } diff --git a/keyboards/massdrop/alt/keymaps/mac/keymap.c b/keyboards/massdrop/alt/keymaps/mac/keymap.c new file mode 100644 index 000000000..a8adbd3c8 --- /dev/null +++ b/keyboards/massdrop/alt/keymaps/mac/keymap.c @@ -0,0 +1,212 @@ +#include QMK_KEYBOARD_H + +enum alt_keycodes { + L_BRI = SAFE_RANGE, //LED Brightness Increase + L_BRD, //LED Brightness Decrease + L_PTN, //LED Pattern Select Next + L_PTP, //LED Pattern Select Previous + L_PSI, //LED Pattern Speed Increase + L_PSD, //LED Pattern Speed Decrease + L_T_MD, //LED Toggle Mode + L_T_ONF, //LED Toggle On / Off + L_ON, //LED On + L_OFF, //LED Off + L_T_BR, //LED Toggle Breath Effect + L_T_PTD, //LED Toggle Scrolling Pattern Direction + U_T_AUTO, //USB Extra Port Toggle Auto Detect / Always Active + U_T_AGCR, //USB Toggle Automatic GCR control + DBG_TOG, //DEBUG Toggle On / Off + DBG_MTRX, //DEBUG Toggle Matrix Prints + DBG_KBD, //DEBUG Toggle Keyboard Prints + DBG_MOU, //DEBUG Toggle Mouse Prints + MD_BOOT, //Restart into bootloader after hold timeout +}; + +#define TG_NKRO MAGIC_TOGGLE_NKRO //Toggle 6KRO / NKRO mode + +keymap_config_t keymap_config; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_HOME, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN, \ + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, MO(1), KC_LEFT, KC_DOWN, KC_RGHT \ + ), + [1] = LAYOUT( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_MUTE, \ + L_T_BR, L_PSD, L_BRI, L_PSI, KC_TRNS, KC_TRNS, KC_TRNS, U_T_AUTO,U_T_AGCR,KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, \ + L_T_PTD, L_PTP, L_BRD, L_PTN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, \ + KC_TRNS, L_T_MD, L_T_ONF, KC_TRNS, KC_TRNS, MD_BOOT, TG_NKRO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_VOLD, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGDN, KC_END \ + ), + /* + [X] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ + ), + */ +}; + +const uint16_t PROGMEM fn_actions[] = { + +}; + +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { +}; + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { +}; + +#define MODS_SHIFT (keyboard_report->mods & MOD_BIT(KC_LSHIFT) || keyboard_report->mods & MOD_BIT(KC_RSHIFT)) +#define MODS_CTRL (keyboard_report->mods & MOD_BIT(KC_LCTL) || keyboard_report->mods & MOD_BIT(KC_RCTRL)) +#define MODS_ALT (keyboard_report->mods & MOD_BIT(KC_LALT) || keyboard_report->mods & MOD_BIT(KC_RALT)) + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + static uint32_t key_timer; + + switch (keycode) { + case L_BRI: + if (record->event.pressed) { + if (LED_GCR_STEP > LED_GCR_MAX - gcr_desired) gcr_desired = LED_GCR_MAX; + else gcr_desired += LED_GCR_STEP; + if (led_animation_breathing) gcr_breathe = gcr_desired; + } + return false; + case L_BRD: + if (record->event.pressed) { + if (LED_GCR_STEP > gcr_desired) gcr_desired = 0; + else gcr_desired -= LED_GCR_STEP; + if (led_animation_breathing) gcr_breathe = gcr_desired; + } + return false; + case L_PTN: + if (record->event.pressed) { + if (led_animation_id == led_setups_count - 1) led_animation_id = 0; + else led_animation_id++; + } + return false; + case L_PTP: + if (record->event.pressed) { + if (led_animation_id == 0) led_animation_id = led_setups_count - 1; + else led_animation_id--; + } + return false; + case L_PSI: + if (record->event.pressed) { + led_animation_speed += ANIMATION_SPEED_STEP; + } + return false; + case L_PSD: + if (record->event.pressed) { + led_animation_speed -= ANIMATION_SPEED_STEP; + if (led_animation_speed < 0) led_animation_speed = 0; + } + return false; + case L_T_MD: + if (record->event.pressed) { + led_lighting_mode++; + if (led_lighting_mode > LED_MODE_MAX_INDEX) led_lighting_mode = LED_MODE_NORMAL; + } + return false; + case L_T_ONF: + if (record->event.pressed) { + led_enabled = !led_enabled; + I2C3733_Control_Set(led_enabled); + } + return false; + case L_ON: + if (record->event.pressed) { + led_enabled = 1; + I2C3733_Control_Set(led_enabled); + } + return false; + case L_OFF: + if (record->event.pressed) { + led_enabled = 0; + I2C3733_Control_Set(led_enabled); + } + return false; + case L_T_BR: + if (record->event.pressed) { + led_animation_breathing = !led_animation_breathing; + if (led_animation_breathing) + { + gcr_breathe = gcr_desired; + led_animation_breathe_cur = BREATHE_MIN_STEP; + breathe_dir = 1; + } + } + return false; + case L_T_PTD: + if (record->event.pressed) { + led_animation_direction = !led_animation_direction; + } + return false; + case U_T_AUTO: + if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { + usb_extra_manual = !usb_extra_manual; + CDC_print("USB extra port manual mode "); + CDC_print(usb_extra_manual ? "enabled" : "disabled"); + CDC_print("\r\n"); + } + return false; + case U_T_AGCR: + if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { + usb_gcr_auto = !usb_gcr_auto; + CDC_print("USB GCR auto mode "); + CDC_print(usb_gcr_auto ? "enabled" : "disabled"); + CDC_print("\r\n"); + } + return false; + case DBG_TOG: + if (record->event.pressed) { + debug_enable = !debug_enable; + CDC_print("Debug mode "); + CDC_print(debug_enable ? "enabled" : "disabled"); + CDC_print("\r\n"); + } + return false; + case DBG_MTRX: + if (record->event.pressed) { + debug_matrix = !debug_matrix; + CDC_print("Debug matrix "); + CDC_print(debug_matrix ? "enabled" : "disabled"); + CDC_print("\r\n"); + } + return false; + case DBG_KBD: + if (record->event.pressed) { + debug_keyboard = !debug_keyboard; + CDC_print("Debug keyboard "); + CDC_print(debug_keyboard ? "enabled" : "disabled"); + CDC_print("\r\n"); + } + return false; + case DBG_MOU: + if (record->event.pressed) { + debug_mouse = !debug_mouse; + CDC_print("Debug mouse "); + CDC_print(debug_mouse ? "enabled" : "disabled"); + CDC_print("\r\n"); + } + return false; + case MD_BOOT: + if (record->event.pressed) { + key_timer = timer_read32(); + } else { + if (timer_elapsed32(key_timer) >= 500) { + reset_keyboard(); + } + } + return false; + default: + return true; //Process all other keycodes normally + } +} diff --git a/keyboards/massdrop/ctrl/keymaps/default/keymap.c b/keyboards/massdrop/ctrl/keymaps/default/keymap.c index ac58f336e..9bfb7fec5 100644 --- a/keyboards/massdrop/ctrl/keymaps/default/keymap.c +++ b/keyboards/massdrop/ctrl/keymaps/default/keymap.c @@ -19,6 +19,7 @@ enum ctrl_keycodes { DBG_MTRX, //DEBUG Toggle Matrix Prints DBG_KBD, //DEBUG Toggle Keyboard Prints DBG_MOU, //DEBUG Toggle Mouse Prints + MD_BOOT, //Restart into bootloader after hold timeout }; #define TG_NKRO MAGIC_TOGGLE_NKRO //Toggle 6KRO / NKRO mode @@ -39,7 +40,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_MSTP, KC_VOLU, \ L_T_BR, L_PSD, L_BRI, L_PSI, KC_TRNS, KC_TRNS, KC_TRNS, U_T_AUTO,U_T_AGCR,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_VOLD, \ L_T_PTD, L_PTP, L_BRD, L_PTN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, L_T_MD, L_T_ONF, KC_TRNS, KC_TRNS, KC_TRNS, TG_NKRO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, L_T_MD, L_T_ONF, KC_TRNS, KC_TRNS, MD_BOOT, TG_NKRO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ ), /* @@ -71,6 +72,8 @@ void matrix_scan_user(void) { #define MODS_ALT (keyboard_report->mods & MOD_BIT(KC_LALT) || keyboard_report->mods & MOD_BIT(KC_RALT)) bool process_record_user(uint16_t keycode, keyrecord_t *record) { + static uint32_t key_timer; + switch (keycode) { case L_BRI: if (record->event.pressed) { @@ -197,7 +200,16 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { CDC_print("\r\n"); } return false; + case MD_BOOT: + if (record->event.pressed) { + key_timer = timer_read32(); + } else { + if (timer_elapsed32(key_timer) >= 500) { + reset_keyboard(); + } + } + return false; default: return true; //Process all other keycodes normally } -} \ No newline at end of file +} diff --git a/keyboards/massdrop/ctrl/keymaps/mac/keymap.c b/keyboards/massdrop/ctrl/keymaps/mac/keymap.c index 116aaa9a1..a03f891e8 100644 --- a/keyboards/massdrop/ctrl/keymaps/mac/keymap.c +++ b/keyboards/massdrop/ctrl/keymaps/mac/keymap.c @@ -19,6 +19,7 @@ enum ctrl_keycodes { DBG_MTRX, //DEBUG Toggle Matrix Prints DBG_KBD, //DEBUG Toggle Keyboard Prints DBG_MOU, //DEBUG Toggle Mouse Prints + MD_BOOT, //Restart into bootloader after hold timeout }; #define TG_NKRO MAGIC_TOGGLE_NKRO //Toggle 6KRO / NKRO mode @@ -71,6 +72,8 @@ void matrix_scan_user(void) { #define MODS_ALT (keyboard_report->mods & MOD_BIT(KC_LALT) || keyboard_report->mods & MOD_BIT(KC_RALT)) bool process_record_user(uint16_t keycode, keyrecord_t *record) { + static uint32_t key_timer; + switch (keycode) { case L_BRI: if (record->event.pressed) { @@ -197,6 +200,15 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { CDC_print("\r\n"); } return false; + case MD_BOOT: + if (record->event.pressed) { + key_timer = timer_read32(); + } else { + if (timer_elapsed32(key_timer) >= 500) { + reset_keyboard(); + } + } + return false; default: return true; //Process all other keycodes normally } diff --git a/tmk_core/common/arm_atsam/bootloader.c b/tmk_core/common/arm_atsam/bootloader.c index 5155d9ff0..9701a6219 100644 --- a/tmk_core/common/arm_atsam/bootloader.c +++ b/tmk_core/common/arm_atsam/bootloader.c @@ -15,5 +15,35 @@ */ #include "bootloader.h" +#include "samd51j18a.h" -void bootloader_jump(void) {} +//Set watchdog timer to reset. Directs the bootloader to stay in programming mode. +void bootloader_jump(void) +{ + //Keyboards released with certain bootloader can not enter bootloader from app until workaround is created + uint8_t ver_no_jump[] = "v2.18Jun 22 2018 17:28:08"; + uint8_t *ver_check = ver_no_jump; + uint8_t *boot_check = (uint8_t *)0x21A0; + while (*ver_check && *boot_check == *ver_check) + { + ver_check++; + boot_check++; + } + if (!*ver_check) + { + //Version match + //Software workaround would go here + return; //No software restart method implemented... must use hardware reset button + } + + WDT->CTRLA.bit.ENABLE = 0; + while (WDT->SYNCBUSY.bit.ENABLE) {} + while (WDT->CTRLA.bit.ENABLE) {} + WDT->CONFIG.bit.WINDOW = 0; + WDT->CONFIG.bit.PER = 0; + WDT->EWCTRL.bit.EWOFFSET = 0; + WDT->CTRLA.bit.ENABLE = 1; + while (WDT->SYNCBUSY.bit.ENABLE) {} + while (!WDT->CTRLA.bit.ENABLE) {} + while (1) {} //Wait on timeout +} diff --git a/tmk_core/protocol/arm_atsam/d51_util.c b/tmk_core/protocol/arm_atsam/d51_util.c index 91b58757c..bb63a9481 100644 --- a/tmk_core/protocol/arm_atsam/d51_util.c +++ b/tmk_core/protocol/arm_atsam/d51_util.c @@ -41,8 +41,8 @@ void m15_print(uint32_t x) //Display unsigned 32-bit number through debug led //Read as follows: 1230 = [*] [* *] [* * *] [**] (note zero is fast double flash) -#define DLED_ONTIME 600000 -#define DLED_PAUSE 1000000 +#define DLED_ONTIME 1000000 +#define DLED_PAUSE 1500000 volatile uint32_t w; void dled_print(uint32_t x, uint8_t long_pause) { diff --git a/tmk_core/protocol/arm_atsam/main_arm_atsam.c b/tmk_core/protocol/arm_atsam/main_arm_atsam.c index e9514730e..8cc776703 100644 --- a/tmk_core/protocol/arm_atsam/main_arm_atsam.c +++ b/tmk_core/protocol/arm_atsam/main_arm_atsam.c @@ -225,6 +225,8 @@ int main(void) { if (usb_state == USB_STATE_POWERDOWN) { + uint32_t timer_led = timer_read32(); + led_on; if (led_enabled) { @@ -233,7 +235,10 @@ int main(void) I2C3733_Control_Set(0); } } - while (usb_state == USB_STATE_POWERDOWN) {} + while (usb_state == USB_STATE_POWERDOWN) + { + if (timer_read32() - timer_led > 1000) led_off; //Good to indicate went to sleep, but only for a second + } if (led_enabled) { for (drvid=0;drvid Date: Wed, 5 Sep 2018 22:41:27 +0200 Subject: [PATCH 059/788] Keymap: Add am keymap (#3843) * Add am keymap * Add configuration to play nice with stuck modifiers This is in particular useful with emacs since its easy to get ctrl stuck * Deactivate mouse keys and backlight * Add control/esc and shift/enter taps * Remove DVORAK and PLOVER I won't be using this soon, so getting some free space * Raiser and Lower ideas from jeebak * Add cursor and mouse layers * Enable mouse keys * Switch underscore with minus * Disable audio and fix warnings * Update to the upstream changes * VIM line motion symbols on the raise layer * Enable sound and freeup some media keys on layers * Fix whitespace on keymap * Code review changes * Improve keymap documentation * Improve keymap to match to the default one * Restore DEFAULT_FOLDER to the default value * Fix config.h unescaped line --- keyboards/planck/keymaps/am/config.h | 41 ++++++ keyboards/planck/keymaps/am/keymap.c | 204 ++++++++++++++++++++++++++ keyboards/planck/keymaps/am/readme.md | 17 +++ keyboards/planck/keymaps/am/rules.mk | 10 ++ 4 files changed, 272 insertions(+) create mode 100644 keyboards/planck/keymaps/am/config.h create mode 100644 keyboards/planck/keymaps/am/keymap.c create mode 100644 keyboards/planck/keymaps/am/readme.md create mode 100644 keyboards/planck/keymaps/am/rules.mk diff --git a/keyboards/planck/keymaps/am/config.h b/keyboards/planck/keymaps/am/config.h new file mode 100644 index 000000000..b2b87045b --- /dev/null +++ b/keyboards/planck/keymaps/am/config.h @@ -0,0 +1,41 @@ +#pragma once + +/* Prevent stuck modifiers */ +#define PREVENT_STUCK_MODIFIERS + +#ifdef AUDIO_ENABLE + #define STARTUP_SONG SONG(PLANCK_SOUND) + + #define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \ + SONG(COLEMAK_SOUND) \ + } +#endif + +#define MUSIC_MASK (keycode != KC_NO) + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ + +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + +// Most tactile encoders have detents every 4 stages +#define ENCODER_RESOLUTION 4 diff --git a/keyboards/planck/keymaps/am/keymap.c b/keyboards/planck/keymaps/am/keymap.c new file mode 100644 index 000000000..c1fa3925f --- /dev/null +++ b/keyboards/planck/keymaps/am/keymap.c @@ -0,0 +1,204 @@ +// This is the canonical layout file for the Quantum project. If you want to add another keyboard, +// this is the style you want to emulate. + +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +enum planck_layers { + _QWERTY, + _COLEMAK, + _LOWER, + _RAISE, + _TOUCHCURSOR, + _MOUSE, + _ADJUST +}; + +enum planck_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + LOWER, + RAISE, +}; + +#define LOWER MO(_LOWER) +#define RAISE MO(_RAISE) + +// Taps +#define CTL_ESC CTL_T(KC_ESC) // Tap for Esc, hold for Ctr +#define SFT_ENT SFT_T(KC_ENT) // Tap for Enter, hold for Shift +#define LT_TC LT(_TOUCHCURSOR, KC_SPC) // L-ayer T-ap T-ouch C-ursor +#define LT_ML LT(_MOUSE, KC_A) // L-ayer T-ap M-ouse C-ursor (on A) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,--------------------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |--------+------+------+------+------+-------------+------+------+------+------+-------| + * |Ctrl/Esc| ML/A | S | D | F | G | H | J | K | L | ; | " | + * |--------+------+------+------+------+------|------+------+------+------+------+-------| + * | Shift | Z | X | C | V | B | N | M | , | . | / |Sft/Ent| + * |--------+------+------+------+------+------+------+------+------+------+------+-------| + * | Power | ~ | Alt | GUI |Lower | TC/Space |Raise | Next | Vol- | Vol+ | Play | + * `--------------------------------------------------------------------------------------' + */ +[_QWERTY] = LAYOUT_planck_grid( + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + CTL_ESC, LT_ML, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_ENT, + KC_CAPS, KC_TILD, KC_LALT, KC_LGUI, LOWER, LT_TC, LT_TC, RAISE, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY +), + +/* Colemak + * ,-------------------------------------------------------------------------------------. + * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | + * |--------+------+------+------+------+-------------+------+------+------+------+------| + * |Ctrl/Esc| ML/A | R | S | T | D | H | N | E | I | O | " | + * |--------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift | Z | X | C | V | B | K | M | , | . | / |Enter | + * |--------+------+------+------+------+------+------+------+------+------+------+------| + * | Power | ~ | Alt | GUI |Lower | TC/Space |Raise | Next | Vol- | Vol+ | Play | + * `-------------------------------------------------------------------------------------' + */ +[_COLEMAK] = LAYOUT_planck_grid( + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, + CTL_ESC, LT_ML, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, + KC_CAPS, KC_TILD, KC_LALT, KC_LGUI, LOWER, LT_TC, LT_TC, RAISE, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY + ), + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | F1 | F2 | F3 | F4 | F5 | F6 | - | + | { | } | ` | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | \ | F7 | F8 | F9 | F10 | F11 | F12 | _ | = | [ | ] | / | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Sleep | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT_planck_grid( + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, + KC_PIPE, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_PLUS, KC_LCBR, KC_RCBR, KC_GRV, + KC_BSLS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_UNDS, KC_EQL, KC_LBRC, KC_RBRC, KC_SLSH, + KC_SLEP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | ^ | 4 | 5 | 6 | . | + | * | 4 | 5 | 6 | - | $ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | = | 7 | 8 | 9 | 0 | - | / | 1 | 2 | 3 | . |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Sleep | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT_planck_grid( + KC_0, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, + KC_CIRC, KC_4, KC_5, KC_6, KC_DOT, KC_PLUS, KC_ASTR, KC_4, KC_5, KC_6, KC_MINS, KC_DLR, + KC_EQL, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_SLSH, KC_1, KC_2, KC_3, KC_DOT, KC_ENT, + KC_SLEP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +/* TouchCursor layer (http://martin-stone.github.io/touchcursor/) plus personal customizations + * ,-----------------------------------------------------------------------------------. + * | | | |Shift | GUI | ~ |Insert| Home | Up | End | Bksp | | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | Alt |Space | | Find |Again | PgUp | Left | Down |Right | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | Undo | Cut | Copy |Paste | ` | PgDn | Del | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + * + * The KC_UNDO, KC_CUT, KC_COPY, KC_PASTE, KC_FIND, and KC_AGAIN keycodes don't + * seem to work on Mac. Presumably they'll work under Windows. + */ + +[_TOUCHCURSOR] = LAYOUT_planck_grid( + _______, _______, _______, KC_LSFT, KC_LGUI, KC_TILD, KC_INS, KC_HOME, KC_UP, KC_END, KC_BSPC, _______, + _______, KC_LALT, KC_SPC, _______, KC_FIND,KC_AGAIN, KC_PGUP, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, + _______, KC_UNDO, KC_CUT, KC_COPY, KC_PASTE,KC_GRV, KC_PGDN, KC_DEL, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +/* Mouse Layer + * ,-----------------------------------------------------------------------------------. + * | | |ACCL0 |ACCL1 |ACCL2 |ACCL2 | |WHL_L | Up |WHL_R | BTN2 | | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | | BTN3 | BTN1 | BTN4 |WHL_Up| Left | Down |Right | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | BTN2 | BTN5 |WHL_Dn| BTN1 | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ + +[_MOUSE] = LAYOUT_planck_grid( + _______, _______, KC_ACL0, KC_ACL1, KC_ACL2, KC_ACL2, _______, KC_WH_L, KC_MS_U, KC_WH_R, KC_BTN2, _______, + _______, _______, _______, KC_BTN3, KC_BTN1, KC_BTN4, KC_WH_U, KC_MS_L, KC_MS_D, KC_MS_R, _______, _______, + _______, _______, _______, _______, KC_BTN2, KC_BTN5, KC_WH_D, KC_BTN1, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | Reset| | | | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk| | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof| | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = LAYOUT_planck_grid( + _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, + _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, _______, _______, _______, + _______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +) + + +}; + +uint32_t layer_state_set_user(uint32_t state) { + return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + set_single_persistent_default_layer(_COLEMAK); + } + return false; + break; + } + return true; +} + +bool music_mask_user(uint16_t keycode) { + switch (keycode) { + case RAISE: + case LOWER: + return false; + default: + return true; + } +} diff --git a/keyboards/planck/keymaps/am/readme.md b/keyboards/planck/keymaps/am/readme.md new file mode 100644 index 000000000..6e0601bf2 --- /dev/null +++ b/keyboards/planck/keymaps/am/readme.md @@ -0,0 +1,17 @@ +# The Am Planck Layout + +Heavily inspired by other layouts out there, and fine tuned to work well on emacs (most recently spacemacs with vim bindings). + +It features: + +- Media keys (bottom right) +- Focused on Qwerty and Colemak +- Number pads (normal and reversed) +- TouchCursor layer +- Mouse layer + +## Build + +Making planck/rev4 with keymap am and target dfu + + make planck/rev4:am:dfu diff --git a/keyboards/planck/keymaps/am/rules.mk b/keyboards/planck/keymaps/am/rules.mk new file mode 100644 index 000000000..696abda39 --- /dev/null +++ b/keyboards/planck/keymaps/am/rules.mk @@ -0,0 +1,10 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +AUDIO_ENABLE = yes # Audio output on port C6 From 155850187de7897dcd8f216d704fecce446f0a68 Mon Sep 17 00:00:00 2001 From: Luke Stanley Date: Wed, 5 Sep 2018 15:45:19 -0500 Subject: [PATCH 060/788] Keyboard: Add IBM 122-key Terminal keyboard and my Ergodox EZ keymap (Programmer's Dvorak + Gaming/QWERTY layer) (#3850) * added my lukaus keymap (programmers dvorak with QWERTY, function, and mouse/keypad layers) * updated ergodox_ez keymap and initial commit for IBM Model M 122 key * added my lukaus keymap (programmers dvorak with QWERTY, function, and mouse/keypad layers) * updated ergodox_ez keymap and initial commit for IBM Model M 122 key * Add keyboard information and separated my custom layout from the default * Add readme to Lukaus' Ergodox EZ keymap * added my lukaus keymap (programmers dvorak with QWERTY, function, and mouse/keypad layers) * updated ergodox_ez keymap and initial commit for IBM Model M 122 key * added my lukaus keymap (programmers dvorak with QWERTY, function, and mouse/keypad layers) * updated ergodox_ez keymap and initial commit for IBM Model M 122 key * Add keyboard information and separated my custom layout from the default * Add readme to Lukaus' Ergodox EZ keymap * added my lukaus keymap (programmers dvorak with QWERTY, function, and mouse/keypad layers) * updated ergodox_ez keymap and initial commit for IBM Model M 122 key * Fix merge conflict again? * updated ergodox_ez keymap and initial commit for IBM Model M 122 key * Add keyboard information and separated my custom layout from the default * Add readme to Lukaus' Ergodox EZ keymap * added my lukaus keymap (programmers dvorak with QWERTY, function, and mouse/keypad layers) * added my lukaus keymap (programmers dvorak with QWERTY, function, and mouse/keypad layers) * updated ergodox_ez keymap and initial commit for IBM Model M 122 key * updated ergodox_ez keymap and initial commit for IBM Model M 122 key * Add keyboard information and separated my custom layout from the default * update keymap * Update rules.mk to remove redundant commented line * Fix missing key on default layout for IBM Model M 122 key * Fix issues identified by drashna and noroadsleft * Update readme for IBM 122 key --- keyboards/ergodox_ez/keymaps/lukaus/config.h | 16 + keyboards/ergodox_ez/keymaps/lukaus/keymap.c | 843 ++++++++++++++++++ keyboards/ergodox_ez/keymaps/lukaus/readme.md | 3 + keyboards/ergodox_ez/keymaps/lukaus/rules.mk | 1 + keyboards/handwired/ibm122m/config.h | 190 ++++ keyboards/handwired/ibm122m/ibm122m.c | 43 + keyboards/handwired/ibm122m/ibm122m.h | 42 + keyboards/handwired/ibm122m/info.json | 0 .../ibm122m/keymaps/default/config.h | 19 + .../ibm122m/keymaps/default/keymap.c | 46 + .../ibm122m/keymaps/default/readme.md | 2 + .../handwired/ibm122m/keymaps/lukaus/config.h | 19 + .../handwired/ibm122m/keymaps/lukaus/keymap.c | 587 ++++++++++++ .../ibm122m/keymaps/lukaus/readme.md | 2 + keyboards/handwired/ibm122m/readme.md | 16 + keyboards/handwired/ibm122m/rules.mk | 67 ++ 16 files changed, 1896 insertions(+) create mode 100644 keyboards/ergodox_ez/keymaps/lukaus/config.h create mode 100644 keyboards/ergodox_ez/keymaps/lukaus/keymap.c create mode 100644 keyboards/ergodox_ez/keymaps/lukaus/readme.md create mode 100644 keyboards/ergodox_ez/keymaps/lukaus/rules.mk create mode 100644 keyboards/handwired/ibm122m/config.h create mode 100644 keyboards/handwired/ibm122m/ibm122m.c create mode 100644 keyboards/handwired/ibm122m/ibm122m.h create mode 100644 keyboards/handwired/ibm122m/info.json create mode 100644 keyboards/handwired/ibm122m/keymaps/default/config.h create mode 100644 keyboards/handwired/ibm122m/keymaps/default/keymap.c create mode 100644 keyboards/handwired/ibm122m/keymaps/default/readme.md create mode 100644 keyboards/handwired/ibm122m/keymaps/lukaus/config.h create mode 100644 keyboards/handwired/ibm122m/keymaps/lukaus/keymap.c create mode 100644 keyboards/handwired/ibm122m/keymaps/lukaus/readme.md create mode 100644 keyboards/handwired/ibm122m/readme.md create mode 100644 keyboards/handwired/ibm122m/rules.mk diff --git a/keyboards/ergodox_ez/keymaps/lukaus/config.h b/keyboards/ergodox_ez/keymaps/lukaus/config.h new file mode 100644 index 000000000..2b9344537 --- /dev/null +++ b/keyboards/ergodox_ez/keymaps/lukaus/config.h @@ -0,0 +1,16 @@ +#pragma once +#define CONFIG_USER_H + +#define TAPPING_TERM 200 + +#ifdef RGBLIGHT_ENABLE +#undef RGBLIGHT_SAT_STEP +#define RGBLIGHT_SAT_STEP 12 +#define RGBLIGHT_EFFECT_KNIGHT_LENGTH 7 +#define RGBLIGHT_EFFECT_SNAKE_LENGTH 7 +#define RGBLIGHT_EFFECT_BREATHE_CENTER 1 +#endif // RGBLIGHT_ENABLE + +#define FORCE_NKRO + +#define MODS_SHIFT_MASK (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) diff --git a/keyboards/ergodox_ez/keymaps/lukaus/keymap.c b/keyboards/ergodox_ez/keymaps/lukaus/keymap.c new file mode 100644 index 000000000..40156b3ff --- /dev/null +++ b/keyboards/ergodox_ez/keymaps/lukaus/keymap.c @@ -0,0 +1,843 @@ +#include QMK_KEYBOARD_H +#include "version.h" + +#include "keymap_german.h" + +#include "keymap_nordic.h" + +enum custom_keycodes { + PLACEHOLDER = SAFE_RANGE, // can always be here + + // Programmer's Dvorak "macros" : + // To be paired with get_mods to enable both + // Shift functionality and Programmer's Dvorak + + DVP_ESC, // Grave escape basically i think + DVP_AMPR, + DVP_LBRACKET, + DVP_LCBR, + DVP_RCBR, + DVP_LPRN, + DVP_AT, + + DVP_EQUAL, + DVP_ASTERISK, + DVP_RPRN, + DVP_PLUS, + DVP_RBRACKET, + DVP_EXLM, + DVP_HASH, + + RU_2, + RU_3, + RU_4, + RU_6, + RU_7, + RU_DOT, + + SHFT_COMMA, + SHFT_DOT, + + RGB_SLD, + RGB_FF0000, + RGB_008000, + RGB_0000FF, + RGB_FFFFFF, + RGB_800080 +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + // Programmer's Dvorak layer + [0] = LAYOUT_ergodox( + DVP_ESC, DVP_AMPR, DVP_LBRACKET, DVP_LCBR, DVP_RCBR, DVP_LPRN, DVP_AT, + KC_TAB, KC_SCOLON, KC_COMMA, KC_DOT, KC_P, KC_Y, MO(4), + MO(3), KC_A, KC_O, KC_E, KC_U, KC_I, + KC_LSHIFT, KC_QUOTE, KC_Q, KC_J, KC_K, KC_X, KC_HYPR, + KC_LCTL, KC_LALT, KC_LGUI, LCTL(KC_C), LCTL(KC_V), + + KC_MS_BTN3, TO(1), KC_HOME, KC_SPACE, MO(4), KC_END, + + DVP_EQUAL, DVP_ASTERISK, DVP_RPRN, DVP_PLUS, DVP_RBRACKET, DVP_EXLM, DVP_HASH, + TT(4), KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLASH, + KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINUS, + KC_MEH, KC_B, KC_M, KC_W, KC_V, KC_Z, MO(3), + KC_DELETE, KC_BSLASH, KC_RGUI, KC_RCTL, LCTL(KC_F), + + KC_F17, KC_F18, KC_PGUP, KC_PGDOWN, KC_ENTER, KC_BSPACE + ), + // Gaming QWERTY layer + [1] = LAYOUT_ergodox( + KC_ESCAPE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_F14, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_F23, + MO(3), KC_A, KC_S, KC_D, KC_F, KC_G, + KC_LSHIFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_F24, + KC_LCTL, KC_F8, KC_LALT, KC_F14, KC_F13, + + KC_HOME, TO(0), KC_F15, KC_SPACE, KC_LCTL, KC_LALT, + + KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQUAL, + KC_F24, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLASH, + KC_H, KC_J, KC_K, KC_L, KC_SCOLON, KC_QUOTE, + KC_F17, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLASH, KC_RSHIFT, + KC_DELETE, KC_F19, KC_LGUI, KC_F21, KC_F22, + + KC_F17, KC_F18, KC_PGUP, KC_PGDOWN, KC_ENTER, KC_BSPACE + ), + [2] = LAYOUT_ergodox( + KC_ESCAPE, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_C, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, TO(0), + MO(3), KC_1, KC_2, KC_3, KC_4, KC_5, + KC_LSHIFT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_NO, + KC_LCTL, KC_F8, KC_LALT, KC_I, KC_S, + + KC_MS_BTN3, TO(1), KC_HOME, KC_SPACE, KC_LSHIFT, KC_END, + + KC_NO, KC_NUMLOCK, KC_KP_SLASH, KC_KP_ASTERISK, KC_KP_MINUS, KC_NO, KC_NO, + TO(0), KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_PLUS, KC_NO, KC_NO, + KC_KP_4, KC_KP_5, KC_KP_6, KC_EQUAL, KC_NO, KC_NO, + KC_NO, KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_ENTER, KC_NO, KC_NO, + KC_KP_0, KC_KP_DOT, KC_NO, KC_NO, KC_NO, + + TO(0), KC_F18, KC_PGUP, KC_PGDOWN, KC_ENTER, KC_BSPACE + ), + // Function Layer + [3] = LAYOUT_ergodox( + KC_DLR, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRANSPARENT, + KC_TRANSPARENT, KC_TRANSPARENT, KC_MEDIA_PREV_TRACK,KC_MEDIA_PLAY_PAUSE,KC_MEDIA_NEXT_TRACK,KC_NO, TT(4), + KC_TRANSPARENT, KC_TRANSPARENT, KC_AUDIO_VOL_DOWN, KC_AUDIO_VOL_UP, KC_AUDIO_MUTE, KC_TRANSPARENT, + KC_LSHIFT, LALT(KC_Z), KC_TRANSPARENT, KC_TRANSPARENT, KC_F12, KC_TRANSPARENT, ALL_T(KC_NO), + KC_LCTL, KC_LALT, KC_LGUI, KC_CAPSLOCK, LSFT(KC_F12), + + KC_PSCREEN, KC_PGUP, KC_PGDOWN, KC_SPACE, KC_LSHIFT, KC_INSERT, + + KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, + KC_NO, KC_HOME, KC_TRANSPARENT, KC_PSCREEN, KC_SLCK, KC_TRANSPARENT, KC_TRANSPARENT, + KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_TRANSPARENT, KC_TRANSPARENT, + MEH_T(KC_NO), KC_CALCULATOR, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_RSHIFT, + KC_DELETE, KC_INSERT, KC_TRANSPARENT, KC_F19, KC_RCTL, + + TO(2),KC_TRANSPARENT,KC_TRANSPARENT,LALT(KC_F10),KC_ENTER,KC_BSPACE + ), + // Keypad, Lighting, and Mouse emulation layer + ///* + [4] = LAYOUT_ergodox( + KC_ESCAPE, KC_NO, KC_NO, KC_MS_BTN3, KC_NO, KC_NO, KC_NO, + KC_TAB, KC_NO, KC_MS_BTN2, KC_MS_UP, KC_MS_BTN1, KC_MS_WH_UP, TO(0), + KC_NO, KC_NO, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_MS_WH_DOWN, + KC_LSHIFT, KC_NO, KC_NO, KC_UP, KC_NO, KC_NO, TO(5), + KC_LCTL, KC_NO, KC_LEFT, KC_DOWN, KC_RIGHT, + + KC_MS_BTN3, TO(1), KC_HOME, KC_SPACE, KC_LSHIFT, KC_END, + + KC_NO, KC_NUMLOCK, KC_KP_SLASH, KC_KP_ASTERISK, KC_CALCULATOR, KC_NO, RGB_VAI, + TO(0), KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_MINUS, KC_NO, RGB_VAD, + KC_KP_4, KC_KP_5, KC_KP_6, KC_KP_PLUS, KC_NO, RGB_HUI, + KC_NO, KC_KP_1, KC_KP_2, KC_KP_3, KC_EQUAL, RGB_SLD, RGB_HUD, + KC_KP_0, KC_KP_DOT, KC_KP_ENTER, RGB_MOD, RGB_TOG, + + KC_F17, KC_F18, KC_PGUP, KC_PGDOWN, KC_ENTER, KC_BSPACE + ) + //*/ + /* + // Keypad, Lighting, and Mouse emulation layer + [4] = KEYMAP( + KC_ESCAPE, KC_NO, KC_NO, KC_MS_BTN3, KC_NO, KC_NO, KC_NO, + KC_TAB, KC_NO, KC_MS_BTN2, KC_MS_UP, KC_MS_BTN1, KC_MS_WH_UP, TO(0), + KC_NO, KC_NO, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_MS_WH_DOWN, + KC_LSHIFT, KC_NO, KC_NO, KC_UP, KC_NO, KC_NO, TO(5), + KC_LCTL, KC_NO, KC_LEFT, KC_DOWN, KC_RIGHT, + + KC_MS_BTN3, TO(1), KC_HOME, KC_SPACE, KC_LSHIFT, KC_END, + + KC_NO, KC_I, KC_NUMLOCK, KC_KP_SLASH, KC_KP_ASTERISK, KC_CALCULATOR, RGB_VAI, + TO(0), KC_G, KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_MINUS, RGB_VAD, + SHFT_COMMA, KC_KP_4, KC_KP_5, KC_KP_6, KC_KP_PLUS, RGB_HUI, + KC_NO, SHFT_DOT, KC_KP_1, KC_KP_2, KC_KP_3, KC_EQUAL, RGB_HUD, + KC_NO, KC_KP_0, KC_KP_DOT, KC_KP_ENTER, RGB_TOG, + + KC_F17, KC_F18, KC_PGUP, KC_PGDOWN, KC_ENTER, KC_BSPACE + ) + */ + +}; + +void led_set_keymap(uint8_t usb_led) { + +} + +void matrix_init_user (void) { + +} + + +bool left_shift_down = false; +bool right_shift_down = false; + +bool numlock = false; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + + switch (keycode) { + case KC_LSHIFT: + if (record->event.pressed) + { + left_shift_down = true; + return true; + } + else + { + left_shift_down = false; + return true; + } + break; + case KC_RSHIFT: + + if (record->event.pressed) + { + right_shift_down = true; + return true; + } + else + { + right_shift_down = false; + return true; + } + break; + case KC_NUMLOCK: + + if (record->event.pressed) + { + numlock = !numlock; + } + break; + + case DVP_ESC: + if (left_shift_down || right_shift_down) + { + if(record->event.pressed) + SEND_STRING("~"); + return false; + } + else + { + if(record->event.pressed) + SEND_STRING(SS_DOWN(X_ESCAPE)); + else + SEND_STRING(SS_UP(X_ESCAPE)); + return false; + } + break; + + case DVP_AMPR: + if (left_shift_down || right_shift_down) + { + if(record->event.pressed) + { + SEND_STRING("%"); + + } + } + else + { + if(record->event.pressed) + SEND_STRING("&"); + } + return false; + + break; + + case SHFT_DOT: + if(record->event.pressed) + SEND_STRING(">"); + break; + + case SHFT_COMMA: + if(record->event.pressed) + SEND_STRING("<"); + break; + + case DVP_LBRACKET: + if (left_shift_down || right_shift_down) + { + if(record->event.pressed) + { + if(left_shift_down) + unregister_code(KC_LSHIFT); + if(right_shift_down) + unregister_code(KC_RSHIFT); + + register_code(KC_7); + unregister_code(KC_7); + + if(left_shift_down) + register_code(KC_LSHIFT); + if(right_shift_down) + register_code(KC_RSHIFT); + } + } + else + { + if(record->event.pressed) + SEND_STRING("["); + } + return false; + + return false; + break; + + case DVP_LCBR: + if (left_shift_down || right_shift_down) + { + if(record->event.pressed) + { + if(left_shift_down) + unregister_code(KC_LSHIFT); + if(right_shift_down) + unregister_code(KC_RSHIFT); + + register_code(KC_5); + unregister_code(KC_5); + + if(left_shift_down) + register_code(KC_LSHIFT); + if(right_shift_down) + register_code(KC_RSHIFT); + } + } + else + { + if(record->event.pressed) + SEND_STRING("{"); + } + return false; + break; + + case DVP_RCBR: + if (left_shift_down || right_shift_down) + { + if(record->event.pressed) + { + if(left_shift_down) + unregister_code(KC_LSHIFT); + if(right_shift_down) + unregister_code(KC_RSHIFT); + + register_code(KC_3); + unregister_code(KC_3); + + if(left_shift_down) + register_code(KC_LSHIFT); + if(right_shift_down) + register_code(KC_RSHIFT); + } + } + else + { + if(record->event.pressed) + SEND_STRING("}"); + } + return false; + break; + + case DVP_LPRN: + if (left_shift_down || right_shift_down) + { + if(record->event.pressed) + { + if(left_shift_down) + unregister_code(KC_LSHIFT); + if(right_shift_down) + unregister_code(KC_RSHIFT); + + register_code(KC_1); + unregister_code(KC_1); + + if(left_shift_down) + register_code(KC_LSHIFT); + if(right_shift_down) + register_code(KC_RSHIFT); + } + } + else + { + if(record->event.pressed) + SEND_STRING("("); + } + return false; + break; + + case DVP_AT: + if (left_shift_down || right_shift_down) + { + if(record->event.pressed) + { + if(left_shift_down) + unregister_code(KC_LSHIFT); + if(right_shift_down) + unregister_code(KC_RSHIFT); + + register_code(KC_LSHIFT); + register_code(KC_6); + unregister_code(KC_6); + unregister_code(KC_LSHIFT); + + if(left_shift_down) + register_code(KC_LSHIFT); + if(right_shift_down) + register_code(KC_RSHIFT); + } + } + else + { + if(record->event.pressed) + SEND_STRING("@"); + } + return false; + break; + + + case DVP_EQUAL: + if (left_shift_down || right_shift_down) + { + if(record->event.pressed) + { + if(left_shift_down) + unregister_code(KC_LSHIFT); + if(right_shift_down) + unregister_code(KC_RSHIFT); + + register_code(KC_9); + unregister_code(KC_9); + + if(left_shift_down) + register_code(KC_LSHIFT); + if(right_shift_down) + register_code(KC_RSHIFT); + } + } + else + { + if(record->event.pressed) + SEND_STRING("="); + } + return false; + break; + + case DVP_ASTERISK: + if (left_shift_down || right_shift_down) + { + if(record->event.pressed) + { + if(left_shift_down) + unregister_code(KC_LSHIFT); + if(right_shift_down) + unregister_code(KC_RSHIFT); + + register_code(KC_0); + unregister_code(KC_0); + + if(left_shift_down) + register_code(KC_LSHIFT); + if(right_shift_down) + register_code(KC_RSHIFT); + } + } + else + { + if(record->event.pressed) + SEND_STRING("*"); + } + return false; + break; + + case DVP_RPRN: + if (left_shift_down || right_shift_down) + { + if(record->event.pressed) + { + if(left_shift_down) + unregister_code(KC_LSHIFT); + if(right_shift_down) + unregister_code(KC_RSHIFT); + + register_code(KC_2); + unregister_code(KC_2); + + if(left_shift_down) + register_code(KC_LSHIFT); + if(right_shift_down) + register_code(KC_RSHIFT); + } + } + else + { + if(record->event.pressed) + SEND_STRING(")"); + } + return false; + break; + + case DVP_PLUS: + if (left_shift_down || right_shift_down) + { + if(record->event.pressed) + { + if(left_shift_down) + unregister_code(KC_LSHIFT); + if(right_shift_down) + unregister_code(KC_RSHIFT); + + register_code(KC_4); + unregister_code(KC_4); + + if(left_shift_down) + register_code(KC_LSHIFT); + if(right_shift_down) + register_code(KC_RSHIFT); + } + } + else + { + if(record->event.pressed) + SEND_STRING("+"); + } + return false; + break; + + case DVP_RBRACKET: + if (left_shift_down || right_shift_down) + { + if(record->event.pressed) + { + if(left_shift_down) + unregister_code(KC_LSHIFT); + if(right_shift_down) + unregister_code(KC_RSHIFT); + + register_code(KC_6); + unregister_code(KC_6); + + if(left_shift_down) + register_code(KC_LSHIFT); + if(right_shift_down) + register_code(KC_RSHIFT); + } + } + else + { + if(record->event.pressed) + SEND_STRING("]"); + } + return false; + break; + + case DVP_EXLM: + if (left_shift_down || right_shift_down) + { + if(record->event.pressed) + { + if(left_shift_down) + unregister_code(KC_LSHIFT); + if(right_shift_down) + unregister_code(KC_RSHIFT); + + register_code(KC_8); + unregister_code(KC_8); + + if(left_shift_down) + register_code(KC_LSHIFT); + if(right_shift_down) + register_code(KC_RSHIFT); + } + } + else + { + if(record->event.pressed) + SEND_STRING("!"); + } + return false; + break; + + case DVP_HASH: + if (left_shift_down || right_shift_down) + { + if(record->event.pressed) + { + if(left_shift_down) + unregister_code(KC_LSHIFT); + if(right_shift_down) + unregister_code(KC_RSHIFT); + + register_code(KC_GRAVE); + unregister_code(KC_GRAVE); + + if(left_shift_down) + register_code(KC_LSHIFT); + if(right_shift_down) + register_code(KC_RSHIFT); + } + } + else + { + if(record->event.pressed) + SEND_STRING("#"); + } + return false; + break; + + // Russian + case RU_2: + if (left_shift_down || right_shift_down) + { + if(record->event.pressed) + { + if(left_shift_down) + unregister_code(KC_LSHIFT); + if(right_shift_down) + unregister_code(KC_RSHIFT); + + register_code(KC_GRAVE); + unregister_code(KC_GRAVE); + + if(left_shift_down) + register_code(KC_LSHIFT); + if(right_shift_down) + register_code(KC_RSHIFT); + } + } + else + { + if(record->event.pressed) + SEND_STRING("#"); + } + return false; + break; +case RU_3: + if (left_shift_down || right_shift_down) + { + if(record->event.pressed) + { + if(left_shift_down) + unregister_code(KC_LSHIFT); + if(right_shift_down) + unregister_code(KC_RSHIFT); + + register_code(KC_GRAVE); + unregister_code(KC_GRAVE); + + if(left_shift_down) + register_code(KC_LSHIFT); + if(right_shift_down) + register_code(KC_RSHIFT); + } + } + else + { + if(record->event.pressed) + SEND_STRING("#"); + } + return false; + break; +case RU_4: + if (left_shift_down || right_shift_down) + { + if(record->event.pressed) + { + if(left_shift_down) + unregister_code(KC_LSHIFT); + if(right_shift_down) + unregister_code(KC_RSHIFT); + + register_code(KC_GRAVE); + unregister_code(KC_GRAVE); + + if(left_shift_down) + register_code(KC_LSHIFT); + if(right_shift_down) + register_code(KC_RSHIFT); + } + } + else + { + if(record->event.pressed) + SEND_STRING("#"); + } + return false; + break; +case RU_6: + if (left_shift_down || right_shift_down) + { + if(record->event.pressed) + { + if(left_shift_down) + unregister_code(KC_LSHIFT); + if(right_shift_down) + unregister_code(KC_RSHIFT); + + register_code(KC_GRAVE); + unregister_code(KC_GRAVE); + + if(left_shift_down) + register_code(KC_LSHIFT); + if(right_shift_down) + register_code(KC_RSHIFT); + } + } + else + { + if(record->event.pressed) + SEND_STRING("#"); + } + return false; + break; +case RU_7: + if (left_shift_down || right_shift_down) + { + if(record->event.pressed) + { + if(left_shift_down) + unregister_code(KC_LSHIFT); + if(right_shift_down) + unregister_code(KC_RSHIFT); + + register_code(KC_GRAVE); + unregister_code(KC_GRAVE); + + if(left_shift_down) + register_code(KC_LSHIFT); + if(right_shift_down) + register_code(KC_RSHIFT); + } + } + else + { + if(record->event.pressed) + SEND_STRING("#"); + } + return false; + break; + + case RU_DOT: + if (left_shift_down || right_shift_down) + { + if(record->event.pressed) + { + if(left_shift_down) + unregister_code(KC_LSHIFT); + if(right_shift_down) + unregister_code(KC_RSHIFT); + + register_code(KC_GRAVE); + unregister_code(KC_GRAVE); + + if(left_shift_down) + register_code(KC_LSHIFT); + if(right_shift_down) + register_code(KC_RSHIFT); + } + } + else + { + if(record->event.pressed) + SEND_STRING("#"); + } + return false; + break; + + + case RGB_SLD: + if (record->event.pressed) { + rgblight_mode(1); + } + return false; + break; + + case RGB_FF0000: + if (record->event.pressed) { + #ifdef RGBLIGHT_ENABLE + rgblight_enable(); + rgblight_mode(1); + rgblight_setrgb(0xff,0x00,0x00); + #endif + } + return false; + break; + + case RGB_008000: + if (record->event.pressed) { + #ifdef RGBLIGHT_ENABLE + rgblight_enable(); + rgblight_mode(1); + rgblight_setrgb(0x00,0x80,0x00); + #endif + } + return false; + break; + + case RGB_0000FF: + if (record->event.pressed) { + #ifdef RGBLIGHT_ENABLE + rgblight_enable(); + rgblight_mode(1); + rgblight_setrgb(0x00,0x00,0xff); + #endif + } + return false; + break; + + case RGB_FFFFFF: + if (record->event.pressed) { + #ifdef RGBLIGHT_ENABLE + rgblight_enable(); + rgblight_mode(1); + rgblight_setrgb(0xff,0xff,0xff); + #endif + } + return false; + break; + + case RGB_800080: + if (record->event.pressed) { + #ifdef RGBLIGHT_ENABLE + rgblight_enable(); + rgblight_mode(1); + rgblight_setrgb(0x80,0x00,0x80); + #endif + } + return false; + break; + + } + return true; +} + +uint32_t layer_state_set_user(uint32_t state) { + + uint8_t layer = biton32(state); + + // ergodox_board_led_off(); + ergodox_right_led_1_off(); + ergodox_right_led_2_off(); + ergodox_right_led_3_off(); + switch (layer) { + case 0: + break; + case 1: + ergodox_right_led_1_on(); + break; + case 2: + ergodox_right_led_2_on(); + break; + case 3: + ergodox_right_led_3_on(); + break; + case 4: + ergodox_right_led_1_on(); + ergodox_right_led_3_on(); + break; + default: + break; + } + return state; + +}; diff --git a/keyboards/ergodox_ez/keymaps/lukaus/readme.md b/keyboards/ergodox_ez/keymaps/lukaus/readme.md new file mode 100644 index 000000000..af091bb1b --- /dev/null +++ b/keyboards/ergodox_ez/keymaps/lukaus/readme.md @@ -0,0 +1,3 @@ +# Lukaus' keymap + +Programmer's Dvorak as default layer with Qwerty gaming layer and two function layers diff --git a/keyboards/ergodox_ez/keymaps/lukaus/rules.mk b/keyboards/ergodox_ez/keymaps/lukaus/rules.mk new file mode 100644 index 000000000..fe05f599b --- /dev/null +++ b/keyboards/ergodox_ez/keymaps/lukaus/rules.mk @@ -0,0 +1 @@ +#UNICODE_ENABLE = yes diff --git a/keyboards/handwired/ibm122m/config.h b/keyboards/handwired/ibm122m/config.h new file mode 100644 index 000000000..1c8e0587d --- /dev/null +++ b/keyboards/handwired/ibm122m/config.h @@ -0,0 +1,190 @@ +/* +Copyright 2018 REPLACE_WITH_YOUR_NAME + +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 . +*/ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0000 +#define DEVICE_VER 0x0001 +#define MANUFACTURER IBM +#define PRODUCT IBM Model M 122 key +#define DESCRIPTION Mapping by github.com/lukexorz + +/* key matrix size */ +#define MATRIX_ROWS 8 +#define MATRIX_COLS 20 + +/* + * 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_COL_PINS { E6, B7, D0, D1, D2, D3, D4, D5, D6, D7, E0, E1, C0, C1, C2, C3, C4, C5, C7, F1 } +#define MATRIX_ROW_PINS { F0, B5, B4, B3, B2, B1, B0, E7 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION ROW2COL + +// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_BREATHING +// #define BACKLIGHT_LEVELS 3 + + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 15 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* 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 userful 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 + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +#define B6_AUDIO +#define C6_AUDIO + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * 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 + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +//#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 1 diff --git a/keyboards/handwired/ibm122m/ibm122m.c b/keyboards/handwired/ibm122m/ibm122m.c new file mode 100644 index 000000000..1c52b94ec --- /dev/null +++ b/keyboards/handwired/ibm122m/ibm122m.c @@ -0,0 +1,43 @@ +/* Copyright 2018 REPLACE_WITH_YOUR_NAME + * + * 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 . + */ +#include "ibm122m.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + + led_set_user(usb_led); +} diff --git a/keyboards/handwired/ibm122m/ibm122m.h b/keyboards/handwired/ibm122m/ibm122m.h new file mode 100644 index 000000000..93e18b4e6 --- /dev/null +++ b/keyboards/handwired/ibm122m/ibm122m.h @@ -0,0 +1,42 @@ +/* Copyright 2018 REPLACE_WITH_YOUR_NAME + * + * 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 . + */ +#pragma once +#include "quantum.h" + +// This a shortcut to help you visually see your layout. +// The following is an example using the Planck MIT layout +// The first section contains all of the arguments +// The second converts the arguments into a two-dimensional array +#define LAYOUT( \ + k09, k19, k1A, k29, k39, k3A, k49, k59, k5A, k69, k79, k7A, k3G, k3H, k2G, \ + k0A, k0B, k1B, k2A, k2B, k3B, k4A, k4B, k5B, k6A, k6B, k7B, k1G, k5G, k4G, \ +k31, k32, k34, k24, k25, k26, k27, k37, k38, k28, k2C, k2D, k2E, k3E, k3C, k3F, k2F, k2H, k2I, k20, \ +k21, k41, k42, k44, k45, k46, k47, k57, k58, k48, k4C, k4D, k4E, k5E, k5C, k6F, k4F, k4H, k4I, k40, \ +k51, k52, k62, k14, k15, k16, k17, k07, k08, k18, k1C, k1D, k1E, k0E, k6E, k1F, k1H, k1I, k10, \ +k11, k12, k73, k74, k64, k65, k66, k67, k77, k78, k68, k6C, k6D, k7E, k63, k0G, k61, k6H, k6I, k7J, \ +k02, k01, k00, k70, k71, k03, k72, k60, k0J, k1J, k7H, k7I, \ + k0F \ +) \ +{ \ + { k00, k01, k02, k03, KC_NO, KC_NO, KC_NO, k07, k08, k09, k0A, k0B, KC_NO, KC_NO, k0E, k0F, k0G, KC_NO, KC_NO, k0J }, \ + { k10, k11, k12, KC_NO, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, k1E, k1F, k1G, k1H, k1I, k1J }, \ + { k20, k21, KC_NO, KC_NO, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, k2E, k2F, k2G, k2H, k2I, KC_NO }, \ + { KC_NO, k31, k32, KC_NO, k34, KC_NO, KC_NO, k37, k38, k39, k3A, k3B, k3C, KC_NO, k3E, k3F, k3G, k3H, KC_NO, KC_NO }, \ + { k40, k41, k42, KC_NO, k44, k45, k46, k47, k48, k49, k4A, k4B, k4C, k4D, k4E, k4F, k4G, k4H, k4I, KC_NO }, \ + { KC_NO, k51, k52, KC_NO, KC_NO, KC_NO, KC_NO, k57, k58, k59, k5A, k5B, k5C, KC_NO, k5E, KC_NO, k5G, KC_NO, KC_NO, KC_NO }, \ + { k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6A, k6B, k6C, k6D, k6E, k6F, KC_NO, k6H, k6I, KC_NO }, \ + { k70, k71, k72, k73, k74, KC_NO, KC_NO, k77, k78, k79, k7A, k7B, KC_NO, KC_NO, k7E, KC_NO, KC_NO, k7H, k7I, k7J }, \ +} diff --git a/keyboards/handwired/ibm122m/info.json b/keyboards/handwired/ibm122m/info.json new file mode 100644 index 000000000..e69de29bb diff --git a/keyboards/handwired/ibm122m/keymaps/default/config.h b/keyboards/handwired/ibm122m/keymaps/default/config.h new file mode 100644 index 000000000..0453a7258 --- /dev/null +++ b/keyboards/handwired/ibm122m/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 REPLACE_WITH_YOUR_NAME + * + * 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 . + */ + +#pragma once + +// place overrides below diff --git a/keyboards/handwired/ibm122m/keymaps/default/keymap.c b/keyboards/handwired/ibm122m/keymaps/default/keymap.c new file mode 100644 index 000000000..633df106e --- /dev/null +++ b/keyboards/handwired/ibm122m/keymaps/default/keymap.c @@ -0,0 +1,46 @@ +/* Copyright 2018 REPLACE_WITH_YOUR_NAME + * + * 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 . + */ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +// Original Layer +[0] = LAYOUT( + KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_INS, KC_HOME, KC_PGUP, + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_END, KC_PGDN, +KC_ESC, KC_NO, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, +KC_NO, KC_NO, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,KC_ENTER, KC_P7, KC_P8, KC_P9, KC_PPLS, +KC_NO, KC_NO, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCOLON, KC_QUOT, KC_BSLS, KC_P4, KC_P5, KC_P6, KC_BSPC, +KC_NO, KC_NO, KC_LSHIFT,KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, +KC_NO, KC_NO, KC_LCTRL, KC_LALT, KC_SPC, KC_RALT, KC_RCTRL, KC_LEFT, KC_NO, KC_RIGHT,KC_P0, KC_PDOT, + KC_DOWN), +}; + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + + return true; +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/handwired/ibm122m/keymaps/default/readme.md b/keyboards/handwired/ibm122m/keymaps/default/readme.md new file mode 100644 index 000000000..aa592c973 --- /dev/null +++ b/keyboards/handwired/ibm122m/keymaps/default/readme.md @@ -0,0 +1,2 @@ +# The default keymap for ibm122m2 +The 10 keys to the left of the alphanumerics are unbound (other than Escape on the top-left one) as I have no idea what is supposed to go there. diff --git a/keyboards/handwired/ibm122m/keymaps/lukaus/config.h b/keyboards/handwired/ibm122m/keymaps/lukaus/config.h new file mode 100644 index 000000000..bf338e196 --- /dev/null +++ b/keyboards/handwired/ibm122m/keymaps/lukaus/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 REPLACE_WITH_YOUR_NAME + * + * 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 . + */ + +#pragma once +// place overrides here + diff --git a/keyboards/handwired/ibm122m/keymaps/lukaus/keymap.c b/keyboards/handwired/ibm122m/keymaps/lukaus/keymap.c new file mode 100644 index 000000000..02b69bacf --- /dev/null +++ b/keyboards/handwired/ibm122m/keymaps/lukaus/keymap.c @@ -0,0 +1,587 @@ +/* Copyright 2018 REPLACE_WITH_YOUR_NAME + * + * 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 . + */ +#include QMK_KEYBOARD_H + +enum custom_keycodes { + PLACEHOLDER = SAFE_RANGE, + + DVP_ESC, // Grave escape basically i think + DVP_AMPR, + DVP_LBRACKET, + DVP_LCBR, + DVP_RCBR, + DVP_LPRN, + DVP_AT, + DVP_EQUAL, + DVP_ASTERISK, + DVP_RPRN, + DVP_PLUS, + DVP_RBRACKET, + DVP_EXLM, + DVP_HASH, + SHFT_DOT, + SHFT_COMMA +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +// Programmer's Dvorak +[0] = LAYOUT( + KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_INS, KC_HOME, KC_PGUP, + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_END, KC_PGDN, +KC_ESC, TO(1), DVP_ESC, DVP_AMPR, DVP_LBRACKET, DVP_LCBR, DVP_RCBR, DVP_LPRN, DVP_EQUAL,DVP_ASTERISK, DVP_RPRN, DVP_PLUS, DVP_RBRACKET, DVP_EXLM, DVP_HASH, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, +KC_NO, TO(2), KC_TAB, KC_SCOLON,KC_COMMA, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, DVP_AT, KC_ENTER, KC_P7, KC_P8, KC_P9, KC_PPLS, +KC_NO, KC_NO, MO(3), KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINUS, KC_BSLS, KC_P4, KC_P5, KC_P6, MO(4), +LCTL(KC_F), KC_LALT, KC_LSHIFT,KC_ESC, KC_QUOT, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, +LCTL(KC_C), LCTL(KC_V), KC_LCTRL, KC_LGUI, KC_SPC, KC_RALT, KC_RCTRL, KC_LEFT, KC_BTN3, KC_RIGHT, KC_P0, KC_PDOT, + KC_DOWN +), + +// Qwerty layer + function +[1] = LAYOUT( + KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_INS, KC_HOME, KC_PGUP, + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_END, KC_PGDN, +KC_ESC, TO(0), KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, +KC_NO, KC_NO, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,KC_ENTER, KC_P7, KC_P8, KC_P9, KC_PPLS, +KC_NO, KC_NO, MO(3), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCOLON, KC_QUOT, KC_BSLS, KC_P4, KC_P5, KC_P6, KC_BSPC, +KC_NO, KC_NO, KC_LSHIFT,KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, +KC_NO, KC_LALT,KC_LCTRL, KC_LGUI, KC_SPC, KC_RALT, KC_RCTRL, KC_LEFT, KC_WH_D, KC_RIGHT,KC_P0, KC_PDOT, + KC_DOWN +), +// Orirginal Layer +[2] = LAYOUT( + KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_INS, KC_HOME, KC_PGUP, + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_END, KC_PGDN, +KC_ESC, TO(1), KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, +KC_NO, TO(0), KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,KC_ENTER, KC_P7, KC_P8, KC_P9, KC_PPLS, +KC_NO, KC_NO, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCOLON, KC_QUOT, KC_BSLS, KC_P4, KC_P5, KC_P6, KC_BSPC, +KC_NO, KC_NO, KC_LSHIFT,KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, +KC_NO, KC_LALT,KC_LCTRL, KC_LGUI, KC_SPC, KC_RALT, KC_RCTRL, KC_LEFT, KC_WH_D, KC_RIGHT,KC_P0, KC_PDOT, + KC_DOWN +), + +// Function Layer +[3] = LAYOUT( + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_HOME, KC_PGUP, + KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_DEL, KC_END, KC_PGDN, +MU_TOG, KC_NO, KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, +MU_MOD, KC_NO, KC_TAB, KC_NO, KC_MEDIA_PREV_TRACK, KC_MEDIA_PLAY_PAUSE, KC_MEDIA_NEXT_TRACK, KC_NO, KC_NO, KC_PGUP, KC_DEL, KC_NO, KC_NO, KC_LBRC, KC_RBRC,KC_ENTER, KC_NO, KC_NO, KC_NO, KC_PPLS, +KC_NO, KC_NO, KC_TRNS, KC_NO, KC_AUDIO_VOL_DOWN, KC_AUDIO_VOL_UP, KC_AUDIO_MUTE, KC_NO, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_SCOLON, KC_QUOT, KC_BSLS, LSFT(KC_E), LSFT(KC_F), KC_NO, KC_BSPC, +KC_NO, KC_LALT, KC_LSHIFT,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_PGDN, KC_COMMA, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, LSFT(KC_B), LSFT(KC_C), LSFT(KC_D), KC_PENT, +KC_NO, KC_NO, KC_LCTRL, KC_LGUI, KC_SPC, KC_RALT, KC_CAPS, KC_LEFT, KC_WH_D, KC_RIGHT,LSFT(KC_A), KC_PDOT, + KC_DOWN +), +// Literally just the numpad is different +[4] = LAYOUT( + KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_INS, KC_HOME, KC_PGUP, + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_END, KC_PGDN, +KC_ESC, TO(1), DVP_ESC, DVP_AMPR, DVP_LBRACKET, DVP_LCBR, DVP_RCBR, DVP_LPRN, DVP_EQUAL,DVP_ASTERISK, DVP_RPRN, DVP_PLUS, DVP_RBRACKET, DVP_EXLM, DVP_HASH, KC_BSPC, KC_NO, KC_NO, KC_NO, KC_NO, +KC_NO, TO(2), KC_TAB, KC_SCOLON,KC_COMMA, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, DVP_AT, KC_ENTER, KC_BTN1, KC_MS_U, KC_BTN2, KC_NO, +KC_NO, KC_NO, TO(0), KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINUS, KC_BSLS, KC_MS_L, KC_NO, KC_MS_R, KC_TRNS, +LCTL(KC_F), KC_LALT, KC_LSHIFT,KC_NO, KC_QUOT, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, KC_UP, KC_GT, KC_MS_D, KC_GT, KC_PENT, +LCTL(KC_C), LCTL(KC_V), KC_LCTRL, KC_LGUI, KC_SPC, KC_RALT, KC_RCTRL, KC_LEFT, KC_BTN3, KC_RIGHT, KC_BTN1, KC_PDOT, + KC_DOWN +), +/* +[4] = LAYOUT( + KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_INS, KC_HOME, KC_PGUP, + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_END, KC_PGDN, +MU_TOG, TO(0), KC_DLR, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, +MU_MOD, KC_NO, KC_TAB, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_LBRC, KC_RBRC,KC_ENTER, KC_NO, KC_NO, KC_NO, KC_PPLS, +KC_NO, KC_NO, KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_QUOT, KC_BSLS, LSFT(KC_E), LSFT(KC_F), KC_NO, KC_BSPC, +KC_NO, KC_LALT, KC_LSHIFT,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_COMMA, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, LSFT(KC_B), LSFT(KC_C), LSFT(KC_D), KC_PENT, +KC_NO, KC_LGUI, KC_LCTRL, KC_LALT, KC_SPC, KC_RALT, KC_RCTRL, KC_LEFT, KC_WH_D, KC_RIGHT, LSFT(KC_A), KC_PDOT, + KC_DOWN +),*/ +/*[0] = LAYOUT( + KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_NO,TO(1),KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, + KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, TO(2),KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, + KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, + KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_BSPC,KC_4,KC_4,KC_4, KC_4, + KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, + KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, + KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, + KC_8, KC_SPC,KC_8,KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, TO(1) + +), +[1] = LAYOUT( + KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, TO(0),KC_NO,KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, KC_T, + KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, TO(2),KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, KC_T, + KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, KC_T, + KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, KC_BSPC,KC_Q,KC_R,KC_S, KC_T, + KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, KC_T, + KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, KC_T, + KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, KC_T, + KC_A, KC_SPC,KC_C,KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, TO(0) +), +[2] = LAYOUT( + KC_LCTRL, KC_LALT, KC_C, KC_RALT, KC_E, KC_F, KC_G, KC_G, KC_H, KC_J, TO(0), TO(1), KC_M, KC_N, KC_QUOT, KC_DOWN, KC_UP, KC_R, KC_S, KC_ENTER, + KC_PPLS, KC_B, KC_C, KC_D, KC_A, KC_S, KC_D, KC_F, KC_J, KC_J, KC_K, KC_NO, KC_K, KC_L, KC_SCOLON, KC_P4, KC_DEL, KC_P5, KC_P6, KC_RIGHT, + KC_PMNS, KC_1, KC_C, KC_D, KC_1, KC_2, KC_3, KC_4, KC_7, KC_J, KC_K, KC_L, KC_8, KC_9, KC_0, KC_NLCK, KC_PGUP,KC_PSLS, KC_PAST, KC_T, + KC_A, KC_ESC, TO(0),KC_D, KC_GRV, KC_F, KC_G, KC_5, KC_6, KC_J, KC_K, KC_L, KC_EQL, KC_N, KC_MINUS, KC_BSPC, KC_INS, KC_HOME, KC_S, KC_T, + KC_PPLS, KC_NO, KC_TAB, KC_D, KC_Q, KC_W, KC_E, KC_R, KC_U, KC_J, KC_K, KC_L, KC_I, KC_O, KC_P, KC_P7, KC_PGDN,KC_P8, KC_P9, KC_T, + KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_T, KC_Y, KC_J, KC_K, KC_L, KC_RBRC, KC_N, KC_LBRC, KC_P, KC_END, KC_R, KC_S, KC_T, + KC_LEFT, KC_P1, KC_CAPS, KC_RSFT, KC_Z, KC_X, KC_C, KC_V, KC_M, KC_J, KC_K, KC_L, KC_COMMA, KC_DOT, KC_BSLS, KC_PENT, KC_Q, KC_P2, KC_P3, KC_T, + KC_LGUI, KC_SPACE, KC_RCTRL, KC_LSHIFT, KC_E, KC_F, KC_G, KC_B, KC_N, KC_J, KC_K, KC_L, KC_M, KC_N, KC_SLSH, KC_P, KC_Q, KC_P0, KC_PDOT, KC_KP_ENTER + ),*/ +}; + +const uint16_t PROGMEM fn_actions[] = { + +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; + + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +bool left_shift_down = false; +bool right_shift_down = false; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case KC_LSHIFT: + if (record->event.pressed) + { + left_shift_down = true; + return true; + } + else + { + left_shift_down = false; + return true; + } + break; + case KC_RSHIFT: + + if (record->event.pressed) + { + right_shift_down = true; + return true; + } + else + { + right_shift_down = false; + return true; + } + break; + + + case DVP_ESC: + if (left_shift_down || right_shift_down) + { + if(record->event.pressed) + SEND_STRING("~"); + return false; + } + else + { + if(record->event.pressed) + SEND_STRING("$"); + return false; + } + break; + + case DVP_AMPR: + if (left_shift_down || right_shift_down) + { + if(record->event.pressed) + { + SEND_STRING("%"); + + } + } + else + { + if(record->event.pressed) + SEND_STRING("&"); + return false; + } + break; + + case DVP_LBRACKET: + if (left_shift_down || right_shift_down) + { + if(record->event.pressed) + { + if(left_shift_down) + unregister_code(KC_LSHIFT); + if(right_shift_down) + unregister_code(KC_RSHIFT); + + register_code(KC_7); + unregister_code(KC_7); + + if(left_shift_down) + register_code(KC_LSHIFT); + if(right_shift_down) + register_code(KC_RSHIFT); + } + return false; + } + else + { + if(record->event.pressed) + SEND_STRING("["); + return false; + } + break; + + case DVP_LCBR: + if (left_shift_down || right_shift_down) + { + if(record->event.pressed) + { + if(left_shift_down) + unregister_code(KC_LSHIFT); + if(right_shift_down) + unregister_code(KC_RSHIFT); + + register_code(KC_5); + unregister_code(KC_5); + + if(left_shift_down) + register_code(KC_LSHIFT); + if(right_shift_down) + register_code(KC_RSHIFT); + } + return false; + } + else + { + if(record->event.pressed) + SEND_STRING("{"); + return false; + } + break; + + case DVP_RCBR: + if (left_shift_down || right_shift_down) + { + if(record->event.pressed) + { + if(left_shift_down) + unregister_code(KC_LSHIFT); + if(right_shift_down) + unregister_code(KC_RSHIFT); + + register_code(KC_3); + unregister_code(KC_3); + + if(left_shift_down) + register_code(KC_LSHIFT); + if(right_shift_down) + register_code(KC_RSHIFT); + } + return false; + } + else + { + if(record->event.pressed) + SEND_STRING("}"); + return false; + } + break; + + + case DVP_LPRN: + if (left_shift_down || right_shift_down) + { + if(record->event.pressed) + { + if(left_shift_down) + unregister_code(KC_LSHIFT); + if(right_shift_down) + unregister_code(KC_RSHIFT); + + register_code(KC_1); + unregister_code(KC_1); + + if(left_shift_down) + register_code(KC_LSHIFT); + if(right_shift_down) + register_code(KC_RSHIFT); + } + return false; + } + else + { + if(record->event.pressed) + SEND_STRING("("); + return false; + } + break; +// + case DVP_AT: + if (left_shift_down || right_shift_down) + { + if(record->event.pressed) + { + if(left_shift_down) + unregister_code(KC_LSHIFT); + if(right_shift_down) + unregister_code(KC_RSHIFT); + + register_code(KC_LSHIFT); + register_code(KC_6); + unregister_code(KC_6); + unregister_code(KC_LSHIFT); + + if(left_shift_down) + register_code(KC_LSHIFT); + if(right_shift_down) + register_code(KC_RSHIFT); + } + return false; + } + else + { + if(record->event.pressed) + SEND_STRING("@"); + return false; + } + break; + + + case DVP_EQUAL: + if (left_shift_down || right_shift_down) + { + if(record->event.pressed) + { + if(left_shift_down) + unregister_code(KC_LSHIFT); + if(right_shift_down) + unregister_code(KC_RSHIFT); + + register_code(KC_9); + unregister_code(KC_9); + + if(left_shift_down) + register_code(KC_LSHIFT); + if(right_shift_down) + register_code(KC_RSHIFT); + } + return false; + } + else + { + if(record->event.pressed) + SEND_STRING("="); + return false; + } + break; + + case DVP_ASTERISK: + if (left_shift_down || right_shift_down) + { + if(record->event.pressed) + { + if(left_shift_down) + unregister_code(KC_LSHIFT); + if(right_shift_down) + unregister_code(KC_RSHIFT); + + register_code(KC_0); + unregister_code(KC_0); + + if(left_shift_down) + register_code(KC_LSHIFT); + if(right_shift_down) + register_code(KC_RSHIFT); + } + return false; + } + else + { + if(record->event.pressed) + SEND_STRING("*"); + return false; + } + break; + + case DVP_RPRN: + if (left_shift_down || right_shift_down) + { + if(record->event.pressed) + { + if(left_shift_down) + unregister_code(KC_LSHIFT); + if(right_shift_down) + unregister_code(KC_RSHIFT); + + register_code(KC_2); + unregister_code(KC_2); + + if(left_shift_down) + register_code(KC_LSHIFT); + if(right_shift_down) + register_code(KC_RSHIFT); + } + return false; + } + else + { + if(record->event.pressed) + SEND_STRING(")"); + return false; + } + break; + + case DVP_PLUS: + if (left_shift_down || right_shift_down) + { + if(record->event.pressed) + { + if(left_shift_down) + unregister_code(KC_LSHIFT); + if(right_shift_down) + unregister_code(KC_RSHIFT); + + register_code(KC_4); + unregister_code(KC_4); + + if(left_shift_down) + register_code(KC_LSHIFT); + if(right_shift_down) + register_code(KC_RSHIFT); + } + } + else + { + if(record->event.pressed) + SEND_STRING("+"); + } + return false; + break; + + case DVP_RBRACKET: + if (left_shift_down || right_shift_down) + { + if(record->event.pressed) + { + if(left_shift_down) + unregister_code(KC_LSHIFT); + if(right_shift_down) + unregister_code(KC_RSHIFT); + + register_code(KC_6); + unregister_code(KC_6); + + if(left_shift_down) + register_code(KC_LSHIFT); + if(right_shift_down) + register_code(KC_RSHIFT); + } + } + else + { + if(record->event.pressed) + SEND_STRING("]"); + } + return false; + break; + + case DVP_EXLM: + if (left_shift_down || right_shift_down) + { + if(record->event.pressed) + { + if(left_shift_down) + unregister_code(KC_LSHIFT); + if(right_shift_down) + unregister_code(KC_RSHIFT); + + register_code(KC_8); + unregister_code(KC_8); + + if(left_shift_down) + register_code(KC_LSHIFT); + if(right_shift_down) + register_code(KC_RSHIFT); + } + } + else + { + if(record->event.pressed) + SEND_STRING("!"); + } + return false; + break; + + case DVP_HASH: + if (left_shift_down || right_shift_down) + { + if(record->event.pressed) + { + if(left_shift_down) + unregister_code(KC_LSHIFT); + if(right_shift_down) + unregister_code(KC_RSHIFT); + + register_code(KC_GRAVE); + unregister_code(KC_GRAVE); + + if(left_shift_down) + register_code(KC_LSHIFT); + if(right_shift_down) + register_code(KC_RSHIFT); + } + } + else + { + if(record->event.pressed) + SEND_STRING("#"); + } + return false; + break; + case SHFT_DOT: + if(record->event.pressed) + SEND_STRING(">"); + break; + + case SHFT_COMMA: + if(record->event.pressed) + SEND_STRING("<"); + break; + + } + + + + return true; +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/handwired/ibm122m/keymaps/lukaus/readme.md b/keyboards/handwired/ibm122m/keymaps/lukaus/readme.md new file mode 100644 index 000000000..5d3f6abe1 --- /dev/null +++ b/keyboards/handwired/ibm122m/keymaps/lukaus/readme.md @@ -0,0 +1,2 @@ +# Lukaus' for ibm122m2 +Programmer's Dvorak as the default layer with a Qwerty layer that can access a function layer. Also includes the default layout, slightly modified diff --git a/keyboards/handwired/ibm122m/readme.md b/keyboards/handwired/ibm122m/readme.md new file mode 100644 index 000000000..09dac49c0 --- /dev/null +++ b/keyboards/handwired/ibm122m/readme.md @@ -0,0 +1,16 @@ +# ibm122m + +![IBM Model M 122 key](https://i.imgur.com/Oo3Ozqz.jpg) + +This is a keymap for the IBM Model M 122 key terminal keyboard running on a Teensy 2.0++ +I wired it to weird pins on mine (mainly to accomodate speakers), so make sure to update the pin arrays. + +Keyboard Maintainer: [Luke Stanley](https://github.com/lukexorz) +Hardware Supported: Teensy 2.0++ +Hardware Availability: https://www.pjrc.com/store/teensypp.html + +Make example for this keyboard (after setting up your build environment): + + make handwired/ibm122m:default + +See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. diff --git a/keyboards/handwired/ibm122m/rules.mk b/keyboards/handwired/ibm122m/rules.mk new file mode 100644 index 000000000..ba4be6766 --- /dev/null +++ b/keyboards/handwired/ibm122m/rules.mk @@ -0,0 +1,67 @@ +# MCU name +MCU = at90usb1286 +BOOTLOADER = halfKay + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = yes # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = yes # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches From e72d07c22b858cf0613f0e340e2ef11bb3fa5c92 Mon Sep 17 00:00:00 2001 From: "Michael F. Lamb" Date: Wed, 5 Sep 2018 13:52:29 -0700 Subject: [PATCH 061/788] Keymap: mitosis/datagrok: bug fix (#3854) I don't know how this slipped past the test suite in the last merge, but this syntax I tried is invalid and doesn't compile. Fixed. --- keyboards/mitosis/keymaps/datagrok/keymap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/mitosis/keymaps/datagrok/keymap.c b/keyboards/mitosis/keymaps/datagrok/keymap.c index ae3b95470..d8c20bc43 100644 --- a/keyboards/mitosis/keymaps/datagrok/keymap.c +++ b/keyboards/mitosis/keymaps/datagrok/keymap.c @@ -3,7 +3,7 @@ #ifdef AUDIO_ENABLE #include "audio.h" #ifdef DEFAULT_LAYER_SONGS -extern float default_layer_songs[][][]; +extern float default_layer_songs[][16][2]; #endif #endif From c3b3f33c6a861fb2e84627333d1b4d69487fce44 Mon Sep 17 00:00:00 2001 From: Matthew Treadwell Date: Wed, 5 Sep 2018 16:39:00 -0700 Subject: [PATCH 062/788] Keymap: Update personal keymap (#3855) * Updated personal keymap * simplified keymap based on suggestions --- keyboards/levinson/keymaps/treadwell/config.h | 6 ++ keyboards/levinson/keymaps/treadwell/keymap.c | 60 ++++++------------- 2 files changed, 24 insertions(+), 42 deletions(-) diff --git a/keyboards/levinson/keymaps/treadwell/config.h b/keyboards/levinson/keymaps/treadwell/config.h index e6648db14..69783937b 100644 --- a/keyboards/levinson/keymaps/treadwell/config.h +++ b/keyboards/levinson/keymaps/treadwell/config.h @@ -16,6 +16,12 @@ #define TAPPING_TERM 150 +/* default layer sounds */ +#define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \ + SONG(GAME_SOUND), \ + SONG(COLEMAK_SOUND) \ + } + //#undef RGBLED_NUM //#define RGBLIGHT_ANIMATIONS //#define RGBLED_NUM 12 diff --git a/keyboards/levinson/keymaps/treadwell/keymap.c b/keyboards/levinson/keymaps/treadwell/keymap.c index f930ebb79..bcc744a6d 100644 --- a/keyboards/levinson/keymaps/treadwell/keymap.c +++ b/keyboards/levinson/keymaps/treadwell/keymap.c @@ -4,7 +4,7 @@ extern keymap_config_t keymap_config; #define _QWERTY 0 #define _COLEMAK 1 -#define _DVORAK 2 +#define _GAME 2 #define _NUMB 3 #define _CODE 4 #define _SYS 5 @@ -14,7 +14,7 @@ extern keymap_config_t keymap_config; enum custom_keycodes { QWERTY = SAFE_RANGE, COLEMAK, - DVORAK, + GAME, NUMB, CODE, SYS, @@ -25,13 +25,9 @@ enum custom_keycodes { #define KC_ KC_TRNS #define _______ KC_TRNS -#define KC_CAPW LGUI(LSFT(KC_3)) // Capture whole screen -#define KC_CPYW LGUI(LSFT(LCTL(KC_3))) // Copy whole screen -#define KC_CAPP LGUI(LSFT(KC_4)) // Capture portion of screen -#define KC_CPYP LGUI(LSFT(LCTL(KC_4))) // Copy portion of screen #define KC_X1 CODE #define KC_X2 NUMB -#define KC_X3 SYS +#define KC_X3 MO(_SYS) #define KC_X4 MT(MOD_LSFT, KC_ENT) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { @@ -60,25 +56,25 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //`----+----+----+----+----+----' `----+----+----+----+----+----' ), - [_DVORAK] = LAYOUT_kc( + [_GAME] = LAYOUT_kc( //,----+----+----+----+----+----. ,----+----+----+----+----+----. - TAB ,QUOT,COMM,DOT , P , Y , F , G , C , R , L ,MINS, + TAB , Q , W , E , R , T , Y , U , I , O , P ,MINS, //|----+----+----+----+----+----| |----+----+----+----+----+----| - BSPC, A , O , E , U , I , D , H , T , N , S ,SLSH, + ESC , A , S , D , F , G , H , J , K , L ,SCLN,QUOT, //|----+----+----+----+----+----| |----+----+----+----+----+----| - LSFT,SCLN, Q , J , K , X , B , M , W , V , Z , X4 , + LSFT, Z , X , C , V , B , N , M ,COMM,DOT ,SLSH, X4 , //|----+----+----+----+----+----| |----+----+----+----+----+----| - X3 ,LCTL,LALT,LGUI, X1 ,LALT, SPC , X2 ,LEFT,DOWN, UP ,RGHT + X3 ,LCTL,LALT,LGUI, X2 , SPC, SPC , X1 ,LEFT,DOWN, UP ,RGHT //`----+----+----+----+----+----' `----+----+----+----+----+----' ), [_NUMB] = LAYOUT_kc( //,----+----+----+----+----+----. ,----+----+----+----+----+----. - TILD,EXLM, AT ,HASH,DLR ,PERC, CIRC,AMPR,ASTR,LPRN,RPRN,PMNS, + TILD,EXLM, AT ,HASH,DLR ,PERC, CIRC,AMPR,ASTR,LPRN,RPRN, DEL, //|----+----+----+----+----+----| |----+----+----+----+----+----| GRV , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,UNDS, //|----+----+----+----+----+----| |----+----+----+----+----+----| - , ,MPRV,MPLY,MNXT, , ,VOLD,VOLU,MUTE, , , + , ,MPRV,MNXT,MPLY, , ,VOLD,VOLU,MUTE, , , //|----+----+----+----+----+----| |----+----+----+----+----+----| , , , , ,LALT, , , , , , //`----+----+----+----+----+----' `----+----+----+----+----+----' @@ -90,7 +86,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //|----+------+----+----+----+----| |----+----+----+----+----+----| CAPS,SELECT,LEFT,DOWN,RGHT,DEL , PGDN, END,LBRC,RBRC,MINS,UNDS, //|----+------+----+----+----+----| |----+----+----+----+----+----| - , UNDO ,CUT ,COPY,PASTE, , LEFT,RGHT,LCBR,RCBR,PLUS,PEQL, + LSFT, UNDO ,CUT ,COPY,PASTE, , LEFT,RGHT,LCBR,RCBR,PLUS,PEQL, //|----+------+----+----+----+----| |----+----+----+----+----+----| , , , , ,LALT, , , , , , //`----+------+----+----+----+----' `----+----+----+----+----+----' @@ -98,9 +94,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_SYS] = LAYOUT_kc( //,----+----+----+----+----+----. ,----+----+----+----+----+----. - F12 , F1 , F2 , F3 , F4 , F5 , F6 , F7 , F8 , F9 ,F10 ,F11 , - //|----+----+----+----+----+----| |----+----+----+----+----+----| , , , , , , , , , , , , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + F12 , F1 , F2 , F3 , F4 , F5 , F6 , F7 , F8 , F9 ,F10 ,F11 , //|----+----+----+----+----+----| |----+----+----+----+----+----| , , , , , , , , , , , , //|----+----+----+----+----+----| |----+----+----+----+----+----| @@ -121,7 +117,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_ADJUST] = LAYOUT_ortho_4x12( \ _______, RESET , RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, _______, _______, \ - _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ + _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, GAME , _______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ ) @@ -129,43 +125,23 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; -#ifdef AUDIO_ENABLE -float tone_qwerty[][2] = SONG(QWERTY_SOUND); -float tone_dvorak[][2] = SONG(DVORAK_SOUND); -float tone_colemak[][2] = SONG(COLEMAK_SOUND); -#endif - -void persistent_default_layer_set(uint16_t default_layer) { - eeconfig_update_default_layer(default_layer); - default_layer_set(default_layer); -} - bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch (keycode) { case QWERTY: if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_qwerty); - #endif - persistent_default_layer_set(1UL<<_QWERTY); + set_single_persistent_default_layer(_QWERTY); } return false; break; case COLEMAK: if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_colemak); - #endif - persistent_default_layer_set(1UL<<_COLEMAK); + set_single_persistent_default_layer(_COLEMAK); } return false; break; - case DVORAK: + case GAME: if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_dvorak); - #endif - persistent_default_layer_set(1UL<<_DVORAK); + set_single_persistent_default_layer(_GAME); } return false; break; From e0c9f1d9b94f66f2cb8ddab0c041dbea24c87e0f Mon Sep 17 00:00:00 2001 From: TheOneTrueTrench <38593283+TheOneTrueTrench@users.noreply.github.com> Date: Thu, 6 Sep 2018 15:08:16 +0000 Subject: [PATCH 063/788] Keymap: Added new Marianas keymap for DZ60 (#3858) * Added new Marianas keymap for DZ60 * Included suggestions to remove unnecessary line regarding MODS_CTRL_MASK, and added names for layers. Added enum to define names for layers, and removed unused #DEFINE --- keyboards/dz60/keymaps/marianas/keymap.c | 71 ++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 keyboards/dz60/keymaps/marianas/keymap.c diff --git a/keyboards/dz60/keymaps/marianas/keymap.c b/keyboards/dz60/keymaps/marianas/keymap.c new file mode 100644 index 000000000..dfc83fb50 --- /dev/null +++ b/keyboards/dz60/keymaps/marianas/keymap.c @@ -0,0 +1,71 @@ +#include QMK_KEYBOARD_H + +enum marianas_layers { + BASE, + NAV_CLUSTER, + RGB, + MOUSE, + GAMING, + FN_LAYER, + LAYER_SEL +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [BASE]= + LAYOUT( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_NO, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, + MO(FN_LAYER), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSPO, KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, KC_NO, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_LGUI, KC_NO, KC_APP, KC_RCTL), + + [NAV_CLUSTER]= + LAYOUT( + KC_TRNS, KC_PSCREEN, KC_SCROLLLOCK, KC_PAUSE, KC_INSERT, KC_HOME, KC_PGUP, KC_NUMLOCK, KC_KP_SLASH, KC_KP_ASTERISK, KC_KP_MINUS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DELETE, KC_END, KC_PGDOWN, KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_PLUS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_UP, KC_KP_4, KC_KP_5, KC_KP_6, KC_KP_PLUS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_ENTER, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_KP_0, KC_KP_0, KC_KP_0, KC_KP_DOT, KC_KP_ENTER, KC_TRNS, KC_TRNS, KC_TRNS), + + [RGB]= + LAYOUT( + KC_TRNS, RGB_TOG, RGB_MOD, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, RGB_M_SN, RGB_M_K, RGB_M_X, RGB_M_G, RGB_SPD, RGB_SPI, KC_TRNS, KC_TRNS, + KC_TRNS, RGB_HUI, RGB_HUD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RGB_SAI, RGB_SAD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, RGB_VAI, RGB_VAD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + [MOUSE]= + LAYOUT( + KC_TRNS, KC_ACL0, KC_ACL1, KC_ACL2, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_WH_U, KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN3, KC_BTN1, KC_MS_U, KC_BTN2, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_WH_L, KC_WH_D, KC_WH_R, KC_TRNS, KC_TRNS, KC_BTN4, KC_MS_L, KC_MS_D, KC_MS_R, KC_BTN5, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + [GAMING]= + LAYOUT( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_NO, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, + KC_TRNS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSHIFT, KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSHIFT, KC_NO, + KC_LCTL, KC_NO, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RCTL, KC_NO, KC_NO, TO(BASE)), + + [FN_LAYER]= + LAYOUT( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_DEL, + KC_CAPSLOCK, KC_MPRV, KC_MPLY, KC_MNXT, LWIN(KC_R), KC_TRNS, KC_CALC, KC_PGUP, KC_UP, KC_PGDN, KC_PSCR, KC_SLCK, KC_BRK, KC_TRNS, + KC_TRNS, KC_VOLD, KC_MUTE, KC_VOLU, KC_TRNS, KC_TRNS, KC_HOME, KC_LEFT, KC_DOWN, KC_RIGHT, KC_INS, KC_DEL, MO(LAYER_SEL), + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HYPR, KC_TRNS, KC_MEH, KC_TRNS), + + [LAYER_SEL]= + LAYOUT( + TO(BASE), TO(NAV_CLUSTER), TO(RGB), TO(MOUSE), TO(GAMING), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) + +}; From 7f7c278c3eef4739f2f0f99faa17f3467f8b534a Mon Sep 17 00:00:00 2001 From: Danny Date: Thu, 6 Sep 2018 15:49:13 -0400 Subject: [PATCH 064/788] Keyboard: Add support for Quefrency 65% right half (#3865) * Add support for Quefrency 65% right half * Add support for additional thumb key on Rev. 1.1 PCB --- keyboards/quefrency/keymaps/default/keymap.c | 4 +-- .../quefrency/keymaps/default65/config.h | 27 ++++++++++++++ .../quefrency/keymaps/default65/keymap.c | 35 +++++++++++++++++++ .../quefrency/keymaps/default65/rules.mk | 0 keyboards/quefrency/rev1/config.h | 6 ++-- keyboards/quefrency/rev1/rev1.h | 28 +++++++++++++-- 6 files changed, 93 insertions(+), 7 deletions(-) create mode 100644 keyboards/quefrency/keymaps/default65/config.h create mode 100644 keyboards/quefrency/keymaps/default65/keymap.c create mode 100644 keyboards/quefrency/keymaps/default65/rules.mk diff --git a/keyboards/quefrency/keymaps/default/keymap.c b/keyboards/quefrency/keymaps/default/keymap.c index e6aba1a27..964a997dd 100644 --- a/keyboards/quefrency/keymaps/default/keymap.c +++ b/keyboards/quefrency/keymaps/default/keymap.c @@ -22,7 +22,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, \ - KC_LCTL, KC_LALT, KC_LGUI, MO(_FN1),KC_SPC, KC_BSPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + KC_LCTL, KC_LALT, KC_LGUI, MO(_FN1),KC_SPC, MO(_FN1),KC_BSPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT ), [_FN1] = LAYOUT( @@ -30,6 +30,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { RGB_TOG, RGB_MOD, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______,\ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ - KC_TILD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + KC_TILD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ) }; diff --git a/keyboards/quefrency/keymaps/default65/config.h b/keyboards/quefrency/keymaps/default65/config.h new file mode 100644 index 000000000..f9efe78c5 --- /dev/null +++ b/keyboards/quefrency/keymaps/default65/config.h @@ -0,0 +1,27 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert +Copyright 2018 Danny Nguyen + +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 . +*/ + +#pragma once + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C diff --git a/keyboards/quefrency/keymaps/default65/keymap.c b/keyboards/quefrency/keymaps/default65/keymap.c new file mode 100644 index 000000000..b660b5d86 --- /dev/null +++ b/keyboards/quefrency/keymaps/default65/keymap.c @@ -0,0 +1,35 @@ +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _BASE 0 +#define _FN1 1 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, +}; + +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE] = LAYOUT_65( + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_DEL, KC_BSPC, KC_PGUP, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_HOME, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END, \ + KC_LCTL, KC_LALT, KC_LGUI, MO(_FN1),KC_SPC, MO(_FN1),KC_SPC, KC_RALT, KC_RCTL, KC_RGUI, KC_LEFT, KC_DOWN, KC_RGHT + ), + + [_FN1] = LAYOUT_65( + KC_GESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_BSPC, _______, \ + RGB_TOG, RGB_MOD, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + KC_TILD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ) +}; diff --git a/keyboards/quefrency/keymaps/default65/rules.mk b/keyboards/quefrency/keymaps/default65/rules.mk new file mode 100644 index 000000000..e69de29bb diff --git a/keyboards/quefrency/rev1/config.h b/keyboards/quefrency/rev1/config.h index 895ee0378..1074590ff 100644 --- a/keyboards/quefrency/rev1/config.h +++ b/keyboards/quefrency/rev1/config.h @@ -26,15 +26,15 @@ along with this program. If not, see . #define DEVICE_VER 0x0100 #define MANUFACTURER Keebio #define PRODUCT Quefrency -#define DESCRIPTION Split 60 percent staggered keyboard +#define DESCRIPTION Split 60/65 percent staggered keyboard /* key matrix size */ // Rows are doubled-up -#define MATRIX_ROWS 10 +#define MATRIX_ROWS 12 #define MATRIX_COLS 8 // wiring of each half -#define MATRIX_ROW_PINS { F4, D4, D7, E6, B4 } +#define MATRIX_ROW_PINS { F4, D4, D7, E6, B4, B5 } #define MATRIX_COL_PINS { F5, F6, F7, B1, B3, B2, B6, C6 } #define SPLIT_HAND_PIN D2 diff --git a/keyboards/quefrency/rev1/rev1.h b/keyboards/quefrency/rev1/rev1.h index 14e0f9bbf..c7dcaa9fe 100644 --- a/keyboards/quefrency/rev1/rev1.h +++ b/keyboards/quefrency/rev1/rev1.h @@ -18,7 +18,7 @@ LB1, LB2, LB3, LB4, LB5, LB6, RB1, RB2, RB3, RB4, RB5, RB6, RB7, RB8, \ LC1, LC2, LC3, LC4, LC5, LC6, RC1, RC2, RC3, RC4, RC5, RC6, RC8, \ LD1, LD3, LD4, LD5, LD6, LD7, RD1, RD2, RD3, RD4, RD6, RD7, RD8, \ - LE1, LE2, LE3, LE5, LE7, RE1, RE4, RE5, RE6, RE7, RE8 \ + LE1, LE2, LE3, LE5, LE7, RE1, RE2, RE4, RE5, RE6, RE7, RE8 \ ) \ { \ { LA1, LA2, LA3, LA4, LA5, LA6, LA7, KC_NO }, \ @@ -26,9 +26,33 @@ { LC1, LC2, LC3, LC4, LC5, LC6, KC_NO, KC_NO }, \ { LD1, KC_NO, LD3, LD4, LD5, LD6, LD7, KC_NO }, \ { LE1, LE2, LE3, KC_NO, LE5, KC_NO, LE7, KC_NO }, \ + { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ { RA1, RA2, RA3, RA4, RA5, RA6, RA7, RA8 }, \ { RB1, RB2, RB3, RB4, RB5, RB6, RB7, RB8 }, \ { RC1, RC2, RC3, RC4, RC5, RC6, KC_NO, RC8 }, \ { RD1, RD2, RD3, RD4, KC_NO, RD6, RD7, RD8 }, \ - { RE1, KC_NO, KC_NO, RE4, RE5, RE6, RE7, RE8 } \ + { RE1, RE2, KC_NO, RE4, RE5, RE6, RE7, RE8 }, \ + { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \ + } + +#define LAYOUT_65( \ + LA1, LA2, LA3, LA4, LA5, LA6, LA7, RA1, RA2, RA3, RA4, RA5, RA6, RA7, RA8, RA9, \ + LB1, LB2, LB3, LB4, LB5, LB6, RB1, RB2, RB3, RB4, RB5, RB6, RB7, RB8, RB9, \ + LC1, LC2, LC3, LC4, LC5, LC6, RC1, RC2, RC3, RC4, RC5, RC6, RC8, RC9, \ + LD1, LD3, LD4, LD5, LD6, LD7, RD1, RD2, RD3, RD4, RD6, RD7, RD8, RD9, \ + LE1, LE2, LE3, LE5, LE7, RE1, RE2, RE4, RE5, RE6, RE7, RE8, RE9 \ + ) \ + { \ + { LA1, LA2, LA3, LA4, LA5, LA6, LA7, KC_NO }, \ + { LB1, LB2, LB3, LB4, LB5, LB6, KC_NO, KC_NO }, \ + { LC1, LC2, LC3, LC4, LC5, LC6, KC_NO, KC_NO }, \ + { LD1, KC_NO, LD3, LD4, LD5, LD6, LD7, KC_NO }, \ + { LE1, LE2, LE3, KC_NO, LE5, KC_NO, LE7, KC_NO }, \ + { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ + { RA1, RA2, RA3, RA4, RA5, RA6, RA7, RA8 }, \ + { RB1, RB2, RB3, RB4, RB5, RB6, RB7, RB8 }, \ + { RC1, RC2, RC3, RC4, RC5, RC6, RC9, RC8 }, \ + { RD1, RD2, RD3, RD4, RD9, RD6, RD7, RD8 }, \ + { RE1, RE2, RE9, RE4, RE5, RE6, RE7, RE8 }, \ + { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, RA9, RB9 } \ } From e68c8f2ac6cb2db1192591059c91bc6757ccbe47 Mon Sep 17 00:00:00 2001 From: patrickmt <40182064+patrickmt@users.noreply.github.com> Date: Fri, 7 Sep 2018 17:22:12 -0400 Subject: [PATCH 065/788] Keyboard: CTRL LED scan code mapping fix (#3867) * CTRL LED scan code mapping fix Fixed scan codes to properly align with key wiring * Update scan codes for caps and scroll lock lighting Update scan codes for caps and scroll lock lighting according to previous scan code mapping update --- keyboards/massdrop/ctrl/config_led.h | 162 +++++++++++++-------------- 1 file changed, 81 insertions(+), 81 deletions(-) diff --git a/keyboards/massdrop/ctrl/config_led.h b/keyboards/massdrop/ctrl/config_led.h index 65563daa3..471ab7007 100644 --- a/keyboards/massdrop/ctrl/config_led.h +++ b/keyboards/massdrop/ctrl/config_led.h @@ -66,85 +66,85 @@ along with this program. If not, see . { .id = 6, .x = 4.875, .y = 0, .adr = { .drv = 2, .cs = 7, .swr = 5, .swg = 4, .swb = 6 }, .scan = 5 }, \ { .id = 7, .x = 5.625, .y = 0, .adr = { .drv = 2, .cs = 8, .swr = 5, .swg = 4, .swb = 6 }, .scan = 6 }, \ { .id = 8, .x = 6.375, .y = 0, .adr = { .drv = 1, .cs = 1, .swr = 5, .swg = 4, .swb = 6 }, .scan = 7 }, \ - { .id = 9, .x = 7.125, .y = 0, .adr = { .drv = 1, .cs = 2, .swr = 5, .swg = 4, .swb = 6 }, .scan = 90 }, \ - { .id = 10, .x = 8.25, .y = 0, .adr = { .drv = 1, .cs = 3, .swr = 5, .swg = 4, .swb = 6 }, .scan = 91 }, \ - { .id = 11, .x = 9, .y = 0, .adr = { .drv = 1, .cs = 4, .swr = 5, .swg = 4, .swb = 6 }, .scan = 92 }, \ - { .id = 12, .x = 9.75, .y = 0, .adr = { .drv = 1, .cs = 5, .swr = 5, .swg = 4, .swb = 6 }, .scan = 93 }, \ - { .id = 13, .x = 10.5, .y = 0, .adr = { .drv = 1, .cs = 6, .swr = 5, .swg = 4, .swb = 6 }, .scan = 94 }, \ - { .id = 14, .x = 11.625, .y = 0, .adr = { .drv = 1, .cs = 7, .swr = 5, .swg = 4, .swb = 6 }, .scan = 95 }, \ - { .id = 15, .x = 12.375, .y = 0, .adr = { .drv = 1, .cs = 8, .swr = 5, .swg = 4, .swb = 6 }, .scan = 96 }, \ - { .id = 16, .x = 13.125, .y = 0, .adr = { .drv = 1, .cs = 9, .swr = 5, .swg = 4, .swb = 6 }, .scan = 97 }, \ - { .id = 17, .x = 0, .y = -1.125, .adr = { .drv = 2, .cs = 1, .swr = 8, .swg = 7, .swb = 9 }, .scan = 15 }, \ - { .id = 18, .x = 0.75, .y = -1.125, .adr = { .drv = 2, .cs = 2, .swr = 8, .swg = 7, .swb = 9 }, .scan = 16 }, \ - { .id = 19, .x = 1.5, .y = -1.125, .adr = { .drv = 2, .cs = 3, .swr = 8, .swg = 7, .swb = 9 }, .scan = 17 }, \ - { .id = 20, .x = 2.25, .y = -1.125, .adr = { .drv = 2, .cs = 4, .swr = 8, .swg = 7, .swb = 9 }, .scan = 18 }, \ - { .id = 21, .x = 3, .y = -1.125, .adr = { .drv = 2, .cs = 5, .swr = 8, .swg = 7, .swb = 9 }, .scan = 19 }, \ - { .id = 22, .x = 3.75, .y = -1.125, .adr = { .drv = 2, .cs = 6, .swr = 8, .swg = 7, .swb = 9 }, .scan = 20 }, \ - { .id = 23, .x = 4.5, .y = -1.125, .adr = { .drv = 2, .cs = 7, .swr = 8, .swg = 7, .swb = 9 }, .scan = 21 }, \ - { .id = 24, .x = 5.25, .y = -1.125, .adr = { .drv = 2, .cs = 8, .swr = 8, .swg = 7, .swb = 9 }, .scan = 22 }, \ - { .id = 25, .x = 6, .y = -1.125, .adr = { .drv = 1, .cs = 1, .swr = 8, .swg = 7, .swb = 9 }, .scan = 105 }, \ - { .id = 26, .x = 6.75, .y = -1.125, .adr = { .drv = 1, .cs = 2, .swr = 8, .swg = 7, .swb = 9 }, .scan = 106 }, \ - { .id = 27, .x = 7.5, .y = -1.125, .adr = { .drv = 1, .cs = 3, .swr = 8, .swg = 7, .swb = 9 }, .scan = 107 }, \ - { .id = 28, .x = 8.25, .y = -1.125, .adr = { .drv = 1, .cs = 4, .swr = 8, .swg = 7, .swb = 9 }, .scan = 108 }, \ - { .id = 29, .x = 9, .y = -1.125, .adr = { .drv = 1, .cs = 5, .swr = 8, .swg = 7, .swb = 9 }, .scan = 109 }, \ - { .id = 30, .x = 10.125, .y = -1.125, .adr = { .drv = 1, .cs = 6, .swr = 8, .swg = 7, .swb = 9 }, .scan = 110 }, \ - { .id = 31, .x = 11.625, .y = -1.125, .adr = { .drv = 1, .cs = 7, .swr = 8, .swg = 7, .swb = 9 }, .scan = 111 }, \ - { .id = 32, .x = 12.375, .y = -1.125, .adr = { .drv = 1, .cs = 8, .swr = 8, .swg = 7, .swb = 9 }, .scan = 112 }, \ - { .id = 33, .x = 13.125, .y = -1.125, .adr = { .drv = 1, .cs = 9, .swr = 8, .swg = 7, .swb = 9 }, .scan = 142 }, \ - { .id = 34, .x = 0.188, .y = -1.875, .adr = { .drv = 2, .cs = 1, .swr = 11, .swg = 10, .swb = 12 }, .scan = 30 }, \ - { .id = 35, .x = 1.125, .y = -1.875, .adr = { .drv = 2, .cs = 2, .swr = 11, .swg = 10, .swb = 12 }, .scan = 31 }, \ - { .id = 36, .x = 1.875, .y = -1.875, .adr = { .drv = 2, .cs = 3, .swr = 11, .swg = 10, .swb = 12 }, .scan = 32 }, \ - { .id = 37, .x = 2.625, .y = -1.875, .adr = { .drv = 2, .cs = 4, .swr = 11, .swg = 10, .swb = 12 }, .scan = 33 }, \ - { .id = 38, .x = 3.375, .y = -1.875, .adr = { .drv = 2, .cs = 5, .swr = 11, .swg = 10, .swb = 12 }, .scan = 34 }, \ - { .id = 39, .x = 4.125, .y = -1.875, .adr = { .drv = 2, .cs = 6, .swr = 11, .swg = 10, .swb = 12 }, .scan = 35 }, \ - { .id = 40, .x = 4.875, .y = -1.875, .adr = { .drv = 2, .cs = 7, .swr = 11, .swg = 10, .swb = 12 }, .scan = 36 }, \ - { .id = 41, .x = 5.625, .y = -1.875, .adr = { .drv = 2, .cs = 8, .swr = 11, .swg = 10, .swb = 12 }, .scan = 37 }, \ - { .id = 42, .x = 6.375, .y = -1.875, .adr = { .drv = 1, .cs = 1, .swr = 11, .swg = 10, .swb = 12 }, .scan = 120 }, \ - { .id = 43, .x = 7.125, .y = -1.875, .adr = { .drv = 1, .cs = 2, .swr = 11, .swg = 10, .swb = 12 }, .scan = 121 }, \ - { .id = 44, .x = 7.875, .y = -1.875, .adr = { .drv = 1, .cs = 3, .swr = 11, .swg = 10, .swb = 12 }, .scan = 122 }, \ - { .id = 45, .x = 8.625, .y = -1.875, .adr = { .drv = 1, .cs = 4, .swr = 11, .swg = 10, .swb = 12 }, .scan = 123 }, \ - { .id = 46, .x = 9.375, .y = -1.875, .adr = { .drv = 1, .cs = 5, .swr = 11, .swg = 10, .swb = 12 }, .scan = 124 }, \ - { .id = 47, .x = 10.312, .y = -1.875, .adr = { .drv = 1, .cs = 6, .swr = 11, .swg = 10, .swb = 12 }, .scan = 125 }, \ - { .id = 48, .x = 11.625, .y = -1.875, .adr = { .drv = 1, .cs = 7, .swr = 11, .swg = 10, .swb = 12 }, .scan = 126 }, \ - { .id = 49, .x = 12.375, .y = -1.875, .adr = { .drv = 1, .cs = 8, .swr = 11, .swg = 10, .swb = 12 }, .scan = 127 }, \ - { .id = 50, .x = 13.125, .y = -1.875, .adr = { .drv = 1, .cs = 9, .swr = 11, .swg = 10, .swb = 12 }, .scan = 141 }, \ - { .id = 51, .x = 0.281, .y = -2.625, .adr = { .drv = 2, .cs = 1, .swr = 5, .swg = 4, .swb = 6 }, .scan = 45 }, \ - { .id = 52, .x = 1.313, .y = -2.625, .adr = { .drv = 2, .cs = 2, .swr = 5, .swg = 4, .swb = 6 }, .scan = 46 }, \ - { .id = 53, .x = 2.063, .y = -2.625, .adr = { .drv = 2, .cs = 13, .swr = 11, .swg = 10, .swb = 12 }, .scan = 47 }, \ - { .id = 54, .x = 2.812, .y = -2.625, .adr = { .drv = 2, .cs = 12, .swr = 11, .swg = 10, .swb = 12 }, .scan = 48 }, \ - { .id = 55, .x = 3.562, .y = -2.625, .adr = { .drv = 2, .cs = 11, .swr = 11, .swg = 10, .swb = 12 }, .scan = 49 }, \ - { .id = 56, .x = 4.312, .y = -2.625, .adr = { .drv = 2, .cs = 6, .swr = 5, .swg = 4, .swb = 6 }, .scan = 50 }, \ - { .id = 57, .x = 5.062, .y = -2.625, .adr = { .drv = 2, .cs = 10, .swr = 11, .swg = 10, .swb = 12 }, .scan = 51 }, \ - { .id = 58, .x = 5.812, .y = -2.625, .adr = { .drv = 2, .cs = 9, .swr = 11, .swg = 10, .swb = 12 }, .scan = 52 }, \ - { .id = 59, .x = 6.562, .y = -2.625, .adr = { .drv = 1, .cs = 16, .swr = 11, .swg = 10, .swb = 12 }, .scan = 135 }, \ - { .id = 60, .x = 7.312, .y = -2.625, .adr = { .drv = 1, .cs = 15, .swr = 11, .swg = 10, .swb = 12 }, .scan = 136 }, \ - { .id = 61, .x = 8.062, .y = -2.625, .adr = { .drv = 1, .cs = 14, .swr = 11, .swg = 10, .swb = 12 }, .scan = 137 }, \ - { .id = 62, .x = 8.812, .y = -2.625, .adr = { .drv = 1, .cs = 13, .swr = 11, .swg = 10, .swb = 12 }, .scan = 138 }, \ - { .id = 63, .x = 10.031, .y = -2.625, .adr = { .drv = 1, .cs = 12, .swr = 11, .swg = 10, .swb = 12 }, .scan = 139 }, \ - { .id = 64, .x = 0.469, .y = -3.375, .adr = { .drv = 2, .cs = 14, .swr = 5, .swg = 4, .swb = 6 }, .scan = 60 }, \ - { .id = 65, .x = 1.688, .y = -3.375, .adr = { .drv = 2, .cs = 13, .swr = 5, .swg = 4, .swb = 6 }, .scan = 61 }, \ - { .id = 66, .x = 2.438, .y = -3.375, .adr = { .drv = 2, .cs = 12, .swr = 8, .swg = 7, .swb = 9 }, .scan = 62 }, \ - { .id = 67, .x = 3.188, .y = -3.375, .adr = { .drv = 2, .cs = 12, .swr = 5, .swg = 4, .swb = 6 }, .scan = 63 }, \ - { .id = 68, .x = 3.938, .y = -3.375, .adr = { .drv = 2, .cs = 11, .swr = 5, .swg = 4, .swb = 6 }, .scan = 64 }, \ - { .id = 69, .x = 4.688, .y = -3.375, .adr = { .drv = 2, .cs = 10, .swr = 5, .swg = 4, .swb = 6 }, .scan = 65 }, \ - { .id = 70, .x = 5.438, .y = -3.375, .adr = { .drv = 2, .cs = 9, .swr = 5, .swg = 4, .swb = 6 }, .scan = 66 }, \ - { .id = 71, .x = 6.188, .y = -3.375, .adr = { .drv = 2, .cs = 9, .swr = 8, .swg = 7, .swb = 9 }, .scan = 67 }, \ - { .id = 72, .x = 6.938, .y = -3.375, .adr = { .drv = 1, .cs = 16, .swr = 8, .swg = 7, .swb = 9 }, .scan = 150 }, \ - { .id = 73, .x = 7.688, .y = -3.375, .adr = { .drv = 1, .cs = 15, .swr = 8, .swg = 7, .swb = 9 }, .scan = 151 }, \ - { .id = 74, .x = 8.438, .y = -3.375, .adr = { .drv = 1, .cs = 14, .swr = 8, .swg = 7, .swb = 9 }, .scan = 152 }, \ - { .id = 75, .x = 9.844, .y = -3.375, .adr = { .drv = 1, .cs = 13, .swr = 8, .swg = 7, .swb = 9 }, .scan = 153 }, \ - { .id = 76, .x = 12.375, .y = -3.375, .adr = { .drv = 1, .cs = 11, .swr = 8, .swg = 7, .swb = 9 }, .scan = 140 }, \ - { .id = 77, .x = 0.094, .y = -4.125, .adr = { .drv = 2, .cs = 14, .swr = 11, .swg = 10, .swb = 12 }, .scan = 75 }, \ - { .id = 78, .x = 1.031, .y = -4.125, .adr = { .drv = 2, .cs = 14, .swr = 8, .swg = 7, .swb = 9 }, .scan = 76 }, \ - { .id = 79, .x = 1.969, .y = -4.125, .adr = { .drv = 2, .cs = 13, .swr = 8, .swg = 7, .swb = 9 }, .scan = 77 }, \ - { .id = 80, .x = 4.781, .y = -4.125, .adr = { .drv = 2, .cs = 10, .swr = 8, .swg = 7, .swb = 9 }, .scan = 78 }, \ - { .id = 81, .x = 7.594, .y = -4.125, .adr = { .drv = 1, .cs = 16, .swr = 5, .swg = 4, .swb = 6 }, .scan = 79 }, \ - { .id = 82, .x = 8.531, .y = -4.125, .adr = { .drv = 1, .cs = 15, .swr = 5, .swg = 4, .swb = 6 }, .scan = 80 }, \ - { .id = 83, .x = 9.469, .y = -4.125, .adr = { .drv = 1, .cs = 14, .swr = 5, .swg = 4, .swb = 6 }, .scan = 81 }, \ - { .id = 84, .x = 10.406, .y = -4.125, .adr = { .drv = 1, .cs = 13, .swr = 5, .swg = 4, .swb = 6 }, .scan = 82 }, \ - { .id = 85, .x = 11.625, .y = -4.125, .adr = { .drv = 1, .cs = 12, .swr = 8, .swg = 7, .swb = 9 }, .scan = 154 }, \ - { .id = 86, .x = 12.375, .y = -4.125, .adr = { .drv = 1, .cs = 12, .swr = 5, .swg = 4, .swb = 6 }, .scan = 155 }, \ - { .id = 87, .x = 13.125, .y = -4.125, .adr = { .drv = 1, .cs = 11, .swr = 5, .swg = 4, .swb = 6 }, .scan = 156 }, \ + { .id = 9, .x = 7.125, .y = 0, .adr = { .drv = 1, .cs = 2, .swr = 5, .swg = 4, .swb = 6 }, .scan = 48 }, \ + { .id = 10, .x = 8.25, .y = 0, .adr = { .drv = 1, .cs = 3, .swr = 5, .swg = 4, .swb = 6 }, .scan = 49 }, \ + { .id = 11, .x = 9, .y = 0, .adr = { .drv = 1, .cs = 4, .swr = 5, .swg = 4, .swb = 6 }, .scan = 50 }, \ + { .id = 12, .x = 9.75, .y = 0, .adr = { .drv = 1, .cs = 5, .swr = 5, .swg = 4, .swb = 6 }, .scan = 51 }, \ + { .id = 13, .x = 10.5, .y = 0, .adr = { .drv = 1, .cs = 6, .swr = 5, .swg = 4, .swb = 6 }, .scan = 52 }, \ + { .id = 14, .x = 11.625, .y = 0, .adr = { .drv = 1, .cs = 7, .swr = 5, .swg = 4, .swb = 6 }, .scan = 53 }, \ + { .id = 15, .x = 12.375, .y = 0, .adr = { .drv = 1, .cs = 8, .swr = 5, .swg = 4, .swb = 6 }, .scan = 54 }, \ + { .id = 16, .x = 13.125, .y = 0, .adr = { .drv = 1, .cs = 9, .swr = 5, .swg = 4, .swb = 6 }, .scan = 55 }, \ + { .id = 17, .x = 0, .y = -1.125, .adr = { .drv = 2, .cs = 1, .swr = 8, .swg = 7, .swb = 9 }, .scan = 8 }, \ + { .id = 18, .x = 0.75, .y = -1.125, .adr = { .drv = 2, .cs = 2, .swr = 8, .swg = 7, .swb = 9 }, .scan = 9 }, \ + { .id = 19, .x = 1.5, .y = -1.125, .adr = { .drv = 2, .cs = 3, .swr = 8, .swg = 7, .swb = 9 }, .scan = 10 }, \ + { .id = 20, .x = 2.25, .y = -1.125, .adr = { .drv = 2, .cs = 4, .swr = 8, .swg = 7, .swb = 9 }, .scan = 11 }, \ + { .id = 21, .x = 3, .y = -1.125, .adr = { .drv = 2, .cs = 5, .swr = 8, .swg = 7, .swb = 9 }, .scan = 12 }, \ + { .id = 22, .x = 3.75, .y = -1.125, .adr = { .drv = 2, .cs = 6, .swr = 8, .swg = 7, .swb = 9 }, .scan = 13 }, \ + { .id = 23, .x = 4.5, .y = -1.125, .adr = { .drv = 2, .cs = 7, .swr = 8, .swg = 7, .swb = 9 }, .scan = 14 }, \ + { .id = 24, .x = 5.25, .y = -1.125, .adr = { .drv = 2, .cs = 8, .swr = 8, .swg = 7, .swb = 9 }, .scan = 15 }, \ + { .id = 25, .x = 6, .y = -1.125, .adr = { .drv = 1, .cs = 1, .swr = 8, .swg = 7, .swb = 9 }, .scan = 56 }, \ + { .id = 26, .x = 6.75, .y = -1.125, .adr = { .drv = 1, .cs = 2, .swr = 8, .swg = 7, .swb = 9 }, .scan = 57 }, \ + { .id = 27, .x = 7.5, .y = -1.125, .adr = { .drv = 1, .cs = 3, .swr = 8, .swg = 7, .swb = 9 }, .scan = 58 }, \ + { .id = 28, .x = 8.25, .y = -1.125, .adr = { .drv = 1, .cs = 4, .swr = 8, .swg = 7, .swb = 9 }, .scan = 59 }, \ + { .id = 29, .x = 9, .y = -1.125, .adr = { .drv = 1, .cs = 5, .swr = 8, .swg = 7, .swb = 9 }, .scan = 60 }, \ + { .id = 30, .x = 10.125, .y = -1.125, .adr = { .drv = 1, .cs = 6, .swr = 8, .swg = 7, .swb = 9 }, .scan = 61 }, \ + { .id = 31, .x = 11.625, .y = -1.125, .adr = { .drv = 1, .cs = 7, .swr = 8, .swg = 7, .swb = 9 }, .scan = 62 }, \ + { .id = 32, .x = 12.375, .y = -1.125, .adr = { .drv = 1, .cs = 8, .swr = 8, .swg = 7, .swb = 9 }, .scan = 63 }, \ + { .id = 33, .x = 13.125, .y = -1.125, .adr = { .drv = 1, .cs = 9, .swr = 8, .swg = 7, .swb = 9 }, .scan = 79 }, \ + { .id = 34, .x = 0.188, .y = -1.875, .adr = { .drv = 2, .cs = 1, .swr = 11, .swg = 10, .swb = 12 }, .scan = 16 }, \ + { .id = 35, .x = 1.125, .y = -1.875, .adr = { .drv = 2, .cs = 2, .swr = 11, .swg = 10, .swb = 12 }, .scan = 17 }, \ + { .id = 36, .x = 1.875, .y = -1.875, .adr = { .drv = 2, .cs = 3, .swr = 11, .swg = 10, .swb = 12 }, .scan = 18 }, \ + { .id = 37, .x = 2.625, .y = -1.875, .adr = { .drv = 2, .cs = 4, .swr = 11, .swg = 10, .swb = 12 }, .scan = 19 }, \ + { .id = 38, .x = 3.375, .y = -1.875, .adr = { .drv = 2, .cs = 5, .swr = 11, .swg = 10, .swb = 12 }, .scan = 20 }, \ + { .id = 39, .x = 4.125, .y = -1.875, .adr = { .drv = 2, .cs = 6, .swr = 11, .swg = 10, .swb = 12 }, .scan = 21 }, \ + { .id = 40, .x = 4.875, .y = -1.875, .adr = { .drv = 2, .cs = 7, .swr = 11, .swg = 10, .swb = 12 }, .scan = 22 }, \ + { .id = 41, .x = 5.625, .y = -1.875, .adr = { .drv = 2, .cs = 8, .swr = 11, .swg = 10, .swb = 12 }, .scan = 23 }, \ + { .id = 42, .x = 6.375, .y = -1.875, .adr = { .drv = 1, .cs = 1, .swr = 11, .swg = 10, .swb = 12 }, .scan = 64 }, \ + { .id = 43, .x = 7.125, .y = -1.875, .adr = { .drv = 1, .cs = 2, .swr = 11, .swg = 10, .swb = 12 }, .scan = 65 }, \ + { .id = 44, .x = 7.875, .y = -1.875, .adr = { .drv = 1, .cs = 3, .swr = 11, .swg = 10, .swb = 12 }, .scan = 66 }, \ + { .id = 45, .x = 8.625, .y = -1.875, .adr = { .drv = 1, .cs = 4, .swr = 11, .swg = 10, .swb = 12 }, .scan = 67 }, \ + { .id = 46, .x = 9.375, .y = -1.875, .adr = { .drv = 1, .cs = 5, .swr = 11, .swg = 10, .swb = 12 }, .scan = 68 }, \ + { .id = 47, .x = 10.312, .y = -1.875, .adr = { .drv = 1, .cs = 6, .swr = 11, .swg = 10, .swb = 12 }, .scan = 69 }, \ + { .id = 48, .x = 11.625, .y = -1.875, .adr = { .drv = 1, .cs = 7, .swr = 11, .swg = 10, .swb = 12 }, .scan = 70 }, \ + { .id = 49, .x = 12.375, .y = -1.875, .adr = { .drv = 1, .cs = 8, .swr = 11, .swg = 10, .swb = 12 }, .scan = 71 }, \ + { .id = 50, .x = 13.125, .y = -1.875, .adr = { .drv = 1, .cs = 9, .swr = 11, .swg = 10, .swb = 12 }, .scan = 78 }, \ + { .id = 51, .x = 0.281, .y = -2.625, .adr = { .drv = 2, .cs = 1, .swr = 5, .swg = 4, .swb = 6 }, .scan = 24 }, \ + { .id = 52, .x = 1.313, .y = -2.625, .adr = { .drv = 2, .cs = 2, .swr = 5, .swg = 4, .swb = 6 }, .scan = 25 }, \ + { .id = 53, .x = 2.063, .y = -2.625, .adr = { .drv = 2, .cs = 13, .swr = 11, .swg = 10, .swb = 12 }, .scan = 26 }, \ + { .id = 54, .x = 2.812, .y = -2.625, .adr = { .drv = 2, .cs = 12, .swr = 11, .swg = 10, .swb = 12 }, .scan = 27 }, \ + { .id = 55, .x = 3.562, .y = -2.625, .adr = { .drv = 2, .cs = 11, .swr = 11, .swg = 10, .swb = 12 }, .scan = 28 }, \ + { .id = 56, .x = 4.312, .y = -2.625, .adr = { .drv = 2, .cs = 6, .swr = 5, .swg = 4, .swb = 6 }, .scan = 29 }, \ + { .id = 57, .x = 5.062, .y = -2.625, .adr = { .drv = 2, .cs = 10, .swr = 11, .swg = 10, .swb = 12 }, .scan = 30 }, \ + { .id = 58, .x = 5.812, .y = -2.625, .adr = { .drv = 2, .cs = 9, .swr = 11, .swg = 10, .swb = 12 }, .scan = 31 }, \ + { .id = 59, .x = 6.562, .y = -2.625, .adr = { .drv = 1, .cs = 16, .swr = 11, .swg = 10, .swb = 12 }, .scan = 72 }, \ + { .id = 60, .x = 7.312, .y = -2.625, .adr = { .drv = 1, .cs = 15, .swr = 11, .swg = 10, .swb = 12 }, .scan = 73 }, \ + { .id = 61, .x = 8.062, .y = -2.625, .adr = { .drv = 1, .cs = 14, .swr = 11, .swg = 10, .swb = 12 }, .scan = 74 }, \ + { .id = 62, .x = 8.812, .y = -2.625, .adr = { .drv = 1, .cs = 13, .swr = 11, .swg = 10, .swb = 12 }, .scan = 75 }, \ + { .id = 63, .x = 10.031, .y = -2.625, .adr = { .drv = 1, .cs = 12, .swr = 11, .swg = 10, .swb = 12 }, .scan = 76 }, \ + { .id = 64, .x = 0.469, .y = -3.375, .adr = { .drv = 2, .cs = 14, .swr = 5, .swg = 4, .swb = 6 }, .scan = 32 }, \ + { .id = 65, .x = 1.688, .y = -3.375, .adr = { .drv = 2, .cs = 13, .swr = 5, .swg = 4, .swb = 6 }, .scan = 33 }, \ + { .id = 66, .x = 2.438, .y = -3.375, .adr = { .drv = 2, .cs = 12, .swr = 8, .swg = 7, .swb = 9 }, .scan = 34 }, \ + { .id = 67, .x = 3.188, .y = -3.375, .adr = { .drv = 2, .cs = 12, .swr = 5, .swg = 4, .swb = 6 }, .scan = 35 }, \ + { .id = 68, .x = 3.938, .y = -3.375, .adr = { .drv = 2, .cs = 11, .swr = 5, .swg = 4, .swb = 6 }, .scan = 36 }, \ + { .id = 69, .x = 4.688, .y = -3.375, .adr = { .drv = 2, .cs = 10, .swr = 5, .swg = 4, .swb = 6 }, .scan = 37 }, \ + { .id = 70, .x = 5.438, .y = -3.375, .adr = { .drv = 2, .cs = 9, .swr = 5, .swg = 4, .swb = 6 }, .scan = 38 }, \ + { .id = 71, .x = 6.188, .y = -3.375, .adr = { .drv = 2, .cs = 9, .swr = 8, .swg = 7, .swb = 9 }, .scan = 39 }, \ + { .id = 72, .x = 6.938, .y = -3.375, .adr = { .drv = 1, .cs = 16, .swr = 8, .swg = 7, .swb = 9 }, .scan = 80 }, \ + { .id = 73, .x = 7.688, .y = -3.375, .adr = { .drv = 1, .cs = 15, .swr = 8, .swg = 7, .swb = 9 }, .scan = 81 }, \ + { .id = 74, .x = 8.438, .y = -3.375, .adr = { .drv = 1, .cs = 14, .swr = 8, .swg = 7, .swb = 9 }, .scan = 82 }, \ + { .id = 75, .x = 9.844, .y = -3.375, .adr = { .drv = 1, .cs = 13, .swr = 8, .swg = 7, .swb = 9 }, .scan = 83 }, \ + { .id = 76, .x = 12.375, .y = -3.375, .adr = { .drv = 1, .cs = 11, .swr = 8, .swg = 7, .swb = 9 }, .scan = 77 }, \ + { .id = 77, .x = 0.094, .y = -4.125, .adr = { .drv = 2, .cs = 14, .swr = 11, .swg = 10, .swb = 12 }, .scan = 40 }, \ + { .id = 78, .x = 1.031, .y = -4.125, .adr = { .drv = 2, .cs = 14, .swr = 8, .swg = 7, .swb = 9 }, .scan = 41 }, \ + { .id = 79, .x = 1.969, .y = -4.125, .adr = { .drv = 2, .cs = 13, .swr = 8, .swg = 7, .swb = 9 }, .scan = 42 }, \ + { .id = 80, .x = 4.781, .y = -4.125, .adr = { .drv = 2, .cs = 10, .swr = 8, .swg = 7, .swb = 9 }, .scan = 43 }, \ + { .id = 81, .x = 7.594, .y = -4.125, .adr = { .drv = 1, .cs = 16, .swr = 5, .swg = 4, .swb = 6 }, .scan = 44 }, \ + { .id = 82, .x = 8.531, .y = -4.125, .adr = { .drv = 1, .cs = 15, .swr = 5, .swg = 4, .swb = 6 }, .scan = 45 }, \ + { .id = 83, .x = 9.469, .y = -4.125, .adr = { .drv = 1, .cs = 14, .swr = 5, .swg = 4, .swb = 6 }, .scan = 46 }, \ + { .id = 84, .x = 10.406, .y = -4.125, .adr = { .drv = 1, .cs = 13, .swr = 5, .swg = 4, .swb = 6 }, .scan = 47 }, \ + { .id = 85, .x = 11.625, .y = -4.125, .adr = { .drv = 1, .cs = 12, .swr = 8, .swg = 7, .swb = 9 }, .scan = 84 }, \ + { .id = 86, .x = 12.375, .y = -4.125, .adr = { .drv = 1, .cs = 12, .swr = 5, .swg = 4, .swb = 6 }, .scan = 85 }, \ + { .id = 87, .x = 13.125, .y = -4.125, .adr = { .drv = 1, .cs = 11, .swr = 5, .swg = 4, .swb = 6 }, .scan = 86 }, \ { .id = 88, .x = 13.433, .y = -4.43, .adr = { .drv = 1, .cs = 11, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ { .id = 89, .x = 12.285, .y = -4.535, .adr = { .drv = 1, .cs = 12, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ { .id = 90, .x = 11.14, .y = -4.535, .adr = { .drv = 1, .cs = 13, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \ @@ -182,8 +182,8 @@ along with this program. If not, see . #define USB_LED_INDICATOR_ENABLE //Comment out to disable indicator functionality #ifdef USB_LED_INDICATOR_ENABLE //Scan codes refer to actual key matrix codes, not KC_* (255 to disable) #define USB_LED_NUM_LOCK_SCANCODE 255 - #define USB_LED_CAPS_LOCK_SCANCODE 45 - #define USB_LED_SCROLL_LOCK_SCANCODE 96 + #define USB_LED_CAPS_LOCK_SCANCODE 24 + #define USB_LED_SCROLL_LOCK_SCANCODE 54 #define USB_LED_COMPOSE_SCANCODE 255 #define USB_LED_KANA_SCANCODE 255 #endif //USB_LED_INDICATOR_ENABLE From 17fffc3a51f0a1abb1576de2badb67303165e0ae Mon Sep 17 00:00:00 2001 From: Josh Date: Sun, 9 Sep 2018 22:09:53 -0400 Subject: [PATCH 066/788] Keymap: Initial PR for contributing my ortho_4x12 community layout. (#3853) * Initial keymap with no BL and with Ctrl and Enter on the home row. * Removing alternative layouts (Dvorak etc.). * Putting Enter back in the default position, moving Esc next to Alt. * Replacing grave with del. * Adding a numpad layer. * Adding operators and a triple zero to the numpad layer. * Swapping Alt and Win. * Updating to use new audio macros. * Removing numpad layer and changing left space to MOD_HYPR on hold. * Adding configurable 'clicky keys' feature. * Cleaning up clicky conditional logic. * Turning on backlight support and mapping backlight keys in the adjust layer. * Enabling backlight functionality. * Adding Adventure time theme song; increasing fake clicky randomness. * Cleaning up layer constants in my Planck keymap. * Initial implementation of porting my Planck keymap to a Let's Split. * Updating keyboards/planck/keymaps/josh to use declarations from new work on master. * Updating keyboards/lets_split/keymaps/josh to use declarations from new work on master. * Work in progress migrating Planck and Let's Split keymaps to a community keymap. Everything is working but Planck backlight. * Fixing rules.mk to enable backlight & audio correctly on Planck PCBs. Cleanup. * Tweaks to get Let's Split working with my community layout. * Switching to use EE_HANDS in my Let's Split build. * Adding vitamins_included makefile options to my ortho_4x12 layout. * Fixing planck/rev6 build -- backlight must be disabled. * Removing I2C from my rules.mk and addressing it in the config.h instead. * Moving community layout directory to my reddit username. :D * Adding a test encoder function; making lower left a media key and moving esc to a mod tap on ctrl. * Commenting out -flto in the compiler flags for the vitamins_included keyboard (couldn't figure out how else to turn it off). * Changing rotary encoder to control media volume. * Changing backlight and clicky defaults to max brightness no breathing and a low pitch click. * Initial implementation of backlight flickering. * Updating my README.md * Adding LINK_TIME_OPTIMIZATION to the vitamins_included/rev1 as a rules.mk feature. * Reverting keyboards/vitamins_included/rules.mk to master and using 'filter_out' in my layout instead. * Adding tested boards to the readme for my layout. * Per drashna, removing redundant clicky implementation and cleaning up headers. * Removing an extra include from my keymap. --- .../community/ortho_4x12/mindsound/config.h | 33 +++ .../community/ortho_4x12/mindsound/flicker.h | 5 + .../community/ortho_4x12/mindsound/keymap.c | 230 ++++++++++++++++++ .../community/ortho_4x12/mindsound/readme.md | 19 ++ .../community/ortho_4x12/mindsound/rules.mk | 26 ++ 5 files changed, 313 insertions(+) create mode 100644 layouts/community/ortho_4x12/mindsound/config.h create mode 100644 layouts/community/ortho_4x12/mindsound/flicker.h create mode 100644 layouts/community/ortho_4x12/mindsound/keymap.c create mode 100644 layouts/community/ortho_4x12/mindsound/readme.md create mode 100644 layouts/community/ortho_4x12/mindsound/rules.mk diff --git a/layouts/community/ortho_4x12/mindsound/config.h b/layouts/community/ortho_4x12/mindsound/config.h new file mode 100644 index 000000000..76e7da204 --- /dev/null +++ b/layouts/community/ortho_4x12/mindsound/config.h @@ -0,0 +1,33 @@ +#pragma once + +#define ADVENTURE_TIME \ + H__NOTE(_F5), \ + Q__NOTE(_F5), \ + H__NOTE(_F5), \ + H__NOTE(_G5), \ + H__NOTE(_E5), \ + H__NOTE(_E5), \ + H__NOTE(_D5), \ + H__NOTE(_C5), \ + HD_NOTE(_C6), + +#ifdef AUDIO_ENABLE + #define STARTUP_SONG SONG(ADVENTURE_TIME) + #define AUDIO_CLICKY + #define AUDIO_CLICKY_ON + #define AUDIO_CLICKY_FREQ_MAX 2500.0f + #define AUDIO_CLICKY_FREQ_RANDOMNESS 0.2f + #define AUDIO_CLICKY_FREQ_DEFAULT 110.0f +#endif + +// for some reason the LSvi rev1 disables action tapping... +#ifdef NO_ACTION_TAPPING + #undef NO_ACTION_TAPPING +#endif + +#undef BACKLIGHT_LEVELS +#define BACKLIGHT_LEVELS 15 + +// let's split configuration: +#define USE_I2C +#define EE_HANDS diff --git a/layouts/community/ortho_4x12/mindsound/flicker.h b/layouts/community/ortho_4x12/mindsound/flicker.h new file mode 100644 index 000000000..a982f19ae --- /dev/null +++ b/layouts/community/ortho_4x12/mindsound/flicker.h @@ -0,0 +1,5 @@ +#pragma once + +void flicker_toggle(void); +void flicker_keydown(void); +void flicker_keyup(void); diff --git a/layouts/community/ortho_4x12/mindsound/keymap.c b/layouts/community/ortho_4x12/mindsound/keymap.c new file mode 100644 index 000000000..2c9ceaf69 --- /dev/null +++ b/layouts/community/ortho_4x12/mindsound/keymap.c @@ -0,0 +1,230 @@ +#include QMK_KEYBOARD_H + +#ifdef BACKLIGHT_ENABLE +#include "flicker.h" +#endif + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. + +enum planck_layers { + _QWERTY, + _LOWER, + _RAISE, + _ADJUST +}; + +// keycodes custom to this keymap: +enum planck_keycodes { + QWERTY = SAFE_RANGE, + BL_FLICKER +}; + +// flicker state: +#ifdef BACKLIGHT_ENABLE +bool flicker_enable = true; +bool flicker_isdown = false; +const uint8_t flicker_min_levels = 2; +const uint8_t flicker_max_levels = 7; +uint8_t flicker_restore_level = 0; +#endif + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +#define LOWER MO(_LOWER) +#define RAISE MO(_RAISE) + +// mod tap definitions: +#define CTRL_ESC MT(MOD_LCTL, KC_ESC) +#define HYPR_SPC MT(MOD_HYPR, KC_SPC) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Ctrl | A | S | D | F | G | H | J | K | L | ; | ' | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Esc | Del | GUI | Alt |Lower |HyprSp|Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = LAYOUT_ortho_4x12( + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + CTRL_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ + KC_MPLY, KC_DEL, KC_LGUI, KC_LALT, LOWER, HYPR_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | Home | End | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT_ortho_4x12( + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \ + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_NUHS), S(KC_NUBS), KC_HOME, KC_END, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / |Pg Up |Pg Dn | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT_ortho_4x12( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | Reset| | | | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap| | | | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof| | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | |Clicky|ClkDn |ClkUp |ClkRst| + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = LAYOUT_ortho_4x12( + _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ + _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, _______, _______, _______, _______, _______, \ + _______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, BL_TOGG, BL_DEC, BL_INC, BL_FLICKER, \ + _______, _______, _______, _______, _______, _______, _______, _______, CLICKY_TOGGLE, CLICKY_DOWN, CLICKY_UP, CLICKY_RESET \ +), + +}; // end keymaps + +// if backlighting is enabled, configure it on boot +#ifdef BACKLIGHT_ENABLE +void matrix_init_user(void) { + // set to max + backlight_level(BACKLIGHT_LEVELS); + flicker_restore_level = get_backlight_level(); + + // if breathing happens to be compiled in, turn it off +#ifdef BACKLIGHT_BREATHING + breathing_disable(); +#endif +} +#endif + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + return MACRO_NONE; +}; + +void persistant_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + + // handle the _ADJUST layer and custom keycodes: + switch (keycode) { + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; +#ifdef BACKLIGHT_ENABLE + case BL_FLICKER: + if (record->event.pressed) { + flicker_toggle(); + } + return false; + break; +#endif + } // end switch case over custom keycodes + +#ifdef BACKLIGHT_ENABLE + if (flicker_enable) { + if (record->event.pressed) { + flicker_keydown(); + } else { + flicker_keyup(); + } + } +#endif + + return true; +} + +void encoder_update(bool clockwise) { + if (clockwise) { + register_code(KC_VOLU); + unregister_code(KC_VOLU); + } else { + register_code(KC_VOLD); + unregister_code(KC_VOLD); + } +} + +// flicker implementation: +#ifdef BACKLIGHT_ENABLE +void flicker_toggle(void) { + flicker_enable = !flicker_enable; +} + +void flicker_keydown(void) { + // guard condition: only set the level to restore if the flicker is NOT already down + if (!flicker_isdown) { + flicker_restore_level = get_backlight_level(); + flicker_isdown = true; + } + + // calculate a random flicker level between min and max + uint8_t flicker_level = (rand() % (flicker_max_levels - flicker_min_levels)) + flicker_min_levels; + uint8_t level_to_set = flicker_level <= flicker_restore_level ? flicker_restore_level - flicker_level : 0; + backlight_level(level_to_set); +} + +void flicker_keyup(void) { + backlight_level(flicker_restore_level); + flicker_isdown = false; +} +#endif diff --git a/layouts/community/ortho_4x12/mindsound/readme.md b/layouts/community/ortho_4x12/mindsound/readme.md new file mode 100644 index 000000000..e9db48049 --- /dev/null +++ b/layouts/community/ortho_4x12/mindsound/readme.md @@ -0,0 +1,19 @@ +# Josh's 4x12 layout + +Notable features: + +* Esc is Ctrl on hold +* Left space is `MOD_HYPER` on hold +* Backspace is still backspace on `RAISE` and `LOWER` +* Faux clicky controls are on the arrow keys on the `ADJUST` layer, and the backlight controls are directly above that +* Backlight breathing is disabled; backlight flickering is implemented instead +* Colemak and other layouts are thoroughly disabled +* Rotary encoder controls media volume on base layer + +This layout has been tested on: + +* Let's Split (rev 2) +* Let's Split Vitamins Included (rev 1) +* Planck (rev 4) + +It builds for the Planck rev 6 but has not been tested yet. diff --git a/layouts/community/ortho_4x12/mindsound/rules.mk b/layouts/community/ortho_4x12/mindsound/rules.mk new file mode 100644 index 000000000..c01a1ddb5 --- /dev/null +++ b/layouts/community/ortho_4x12/mindsound/rules.mk @@ -0,0 +1,26 @@ +# none of my keyboards need LTO and it screws up I2C on my LSVI: +EXTRAFLAGS:=$(filter-out -flto,$(EXTRAFLAGS)) + +# turning off backlighting and audio for the split keebs +ifneq (,$(findstring lets_split,$(KEYBOARD))) + BACKLIGHT_ENABLE = no + BACKLIGHT_BREATHING = no + AUDIO_ENABLE = no +endif +ifneq (,$(findstring vitamins_included,$(KEYBOARD))) + BACKLIGHT_ENABLE = no + BACKLIGHT_BREATHING = no + AUDIO_ENABLE = no +endif + +# both my plancks use audio but only the rev4 has backlighting +ifneq (,$(findstring planck,$(KEYBOARD))) + ifneq (,$(findstring rev4,$(KEYBOARD))) + BACKLIGHT_ENABLE = yes + BACKLIGHT_BREATHING = no + else + BACKLIGHT_ENABLE = no + BACKLIGHT_BREATHING = no + endif + AUDIO_ENABLE = yes +endif From 93b5c98fbbceb6648e1dc562c375f224d626aab5 Mon Sep 17 00:00:00 2001 From: Yasuhiro Shimizu Date: Mon, 10 Sep 2018 11:23:24 +0900 Subject: [PATCH 067/788] Keymap: remove unnecessary readme from my helix keymap (#3860) --- .../helix/rev2/keymaps/yshrsmz/readme.md | 25 ------------------- 1 file changed, 25 deletions(-) delete mode 100644 keyboards/helix/rev2/keymaps/yshrsmz/readme.md diff --git a/keyboards/helix/rev2/keymaps/yshrsmz/readme.md b/keyboards/helix/rev2/keymaps/yshrsmz/readme.md deleted file mode 100644 index 02888855b..000000000 --- a/keyboards/helix/rev2/keymaps/yshrsmz/readme.md +++ /dev/null @@ -1,25 +0,0 @@ -SSD1306 OLED Display via I2C -====== - -Features --------- - -Some features supported by the firmware: - - -* I2C connection between the two halves is required as the OLED display will use this connection as well. Note this - requires pull-up resistors on the data and clock lines. -* OLED display will connect from either side - - -Wiring ------- - - -Work in progress... - - -OLED Configuration -------------------------------- - -Work in progress... From 38c916a3686bfd1af762a1de4ccdaf7eb1123f2e Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Sun, 9 Sep 2018 19:33:30 -0700 Subject: [PATCH 068/788] Keyboard: Updated readmes for 1upkeyboards (#3864) Corrected the make examples by adding the parent directory. Updated the QMK Docs links for the build environment setup and the make instructions. Added links to the Newbs Guide. --- keyboards/1upkeyboards/1up60hse/readme.md | 4 ++-- keyboards/1upkeyboards/1up60rgb/readme.md | 4 ++-- keyboards/1upkeyboards/sweet16/readme.md | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/keyboards/1upkeyboards/1up60hse/readme.md b/keyboards/1upkeyboards/1up60hse/readme.md index 5ea040bf4..2865768b6 100644 --- a/keyboards/1upkeyboards/1up60hse/readme.md +++ b/keyboards/1upkeyboards/1up60hse/readme.md @@ -10,6 +10,6 @@ Hardware Availability: [1upkeyboards.com](https://www.1upkeyboards.com/shop/cont Make example for this keyboard (after setting up your build environment): - make 1up60hse:default + make 1upkeyboards/1up60hse:default -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. +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). diff --git a/keyboards/1upkeyboards/1up60rgb/readme.md b/keyboards/1upkeyboards/1up60rgb/readme.md index a16ab7ea8..de3ad98b7 100644 --- a/keyboards/1upkeyboards/1up60rgb/readme.md +++ b/keyboards/1upkeyboards/1up60rgb/readme.md @@ -8,6 +8,6 @@ Hardware Availability: [1upkeyboards](https://www.1upkeyboards.com/shop/controll Make example for this keyboard (after setting up your build environment): - make 1up60rgb:default + make 1upkeyboards/1up60rgb:default -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. +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). diff --git a/keyboards/1upkeyboards/sweet16/readme.md b/keyboards/1upkeyboards/sweet16/readme.md index 435aed68c..3b7b1d6f0 100644 --- a/keyboards/1upkeyboards/sweet16/readme.md +++ b/keyboards/1upkeyboards/sweet16/readme.md @@ -9,6 +9,6 @@ Hardware Availability: [1up Keyboards](https://1upkeyboards.com/) Make example for this keyboard (after setting up your build environment): - make sweet16:default + make 1upkeyboards/sweet16:default -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. \ No newline at end of file +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). From 3dbdfbd99a9efd12275abdcdcf2abe843e300f6b Mon Sep 17 00:00:00 2001 From: Danny Date: Sun, 9 Sep 2018 22:42:46 -0400 Subject: [PATCH 069/788] Add support for a different pinout on Split boards (#3869) * Add support for a different pinout for the right half of a split keyboard (number of cols/rows still has to be the same) --- quantum/split_common/matrix.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/quantum/split_common/matrix.c b/quantum/split_common/matrix.c index 4af90209f..3d2983f2e 100644 --- a/quantum/split_common/matrix.c +++ b/quantum/split_common/matrix.c @@ -71,8 +71,8 @@ static matrix_row_t matrix_debouncing[MATRIX_ROWS]; static uint8_t error_count = 0; -static const uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; -static const uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; +static uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; +static uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; /* matrix state(1:on, 0:off) */ static matrix_row_t matrix[MATRIX_ROWS]; @@ -137,6 +137,21 @@ void matrix_init(void) debug_enable = true; debug_matrix = true; debug_mouse = true; + + // Set pinout for right half if pinout for that half is defined + if (!isLeftHand) { +#ifdef MATRIX_ROW_PINS_RIGHT + const uint8_t row_pins_right[MATRIX_ROWS] = MATRIX_ROW_PINS_RIGHT; + for (uint8_t i = 0; i < MATRIX_ROWS; i++) + row_pins[i] = row_pins_right[i]; +#endif +#ifdef MATRIX_COL_PINS_RIGHT + const uint8_t col_pins_right[MATRIX_COLS] = MATRIX_COL_PINS_RIGHT; + for (uint8_t i = 0; i < MATRIX_COLS; i++) + col_pins[i] = col_pins_right[i]; +#endif + } + // initialize row and col #if (DIODE_DIRECTION == COL2ROW) unselect_rows(); From 7b8e5d4555f524895721d2e8055a5e4ac866aeb5 Mon Sep 17 00:00:00 2001 From: Damien Date: Mon, 10 Sep 2018 04:43:45 +0200 Subject: [PATCH 070/788] Keymap: Updated my FC660C config (#3870) * - Fixed DK60 version in config.h * - Updated dk60 readme with new QMK rules * - Fixed wording in readme * Added dbroqua layout for DZ60 I've also updated dz60.h to add "true HHKD" keymap definition (6U spacebar). With the default HHKB definition r_alt was not mapped and when I pressed r_menu it was r_alt. Regards * Updated dbroqua layout for HHKB keyboard Added default configuration and alternate (swap gui/alt keys). Save user choice in keyboard memory (like plank, thanks for this feature!). * Added dbroqua layout for Iris keyboard * Updated layout and fixed includes * Added personal layout for FC660C * Inverted ESC & GRV --- keyboards/fc660c/keymaps/dbroqua/keymap.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/keyboards/fc660c/keymaps/dbroqua/keymap.c b/keyboards/fc660c/keymaps/dbroqua/keymap.c index ef6f471aa..62ef234c7 100644 --- a/keyboards/fc660c/keymaps/dbroqua/keymap.c +++ b/keyboards/fc660c/keymaps/dbroqua/keymap.c @@ -3,7 +3,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* BASE layer: Default Layer * ,--------------------------------------------------------------------------------------------------. - * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Backspace | | Ins | + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Backspace | | Ins | * |-----------------------------------------------------------------------------------------+ +-----+ * | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | Bksp | | Del | * |-----------------------------------------------------------------------------------------+ +-----+ @@ -15,7 +15,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `--------------------------------------------------------------------------------------------------´ */ [0] = LAYOUT( - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL, KC_BSPC, KC_INS, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL, KC_BSPC, KC_INS, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC,KC_BSLS, KC_DEL, KC_LCTL,KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_ENT, KC_LSFT,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,KC_RSFT, KC_UP, @@ -23,7 +23,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), /* FN layer * ,--------------------------------------------------------------------------------------------------. - * | ` | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | | | | + * | Esc| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | | | | * |-----------------------------------------------------------------------------------------+ +-----+ * | | | | | | | | |PrtSc| Slck| Paus| | | | | | * |-----------------------------------------------------------------------------------------+ +-----+ @@ -35,7 +35,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `--------------------------------------------------------------------------------------------------´ */ [1] = LAYOUT( - KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______,_______,_______,_______,_______,_______,_______,_______,KC_PSCR,KC_SLCK,KC_PAUS,_______,_______,_______, _______, _______,KC_VOLD,KC_VOLU,KC_MUTE,KC_EJCT,_______,_______,_______,KC_HOME,KC_PGUP,_______,_______, _______, _______,KC_MPRV,KC_MPLY,KC_MNXT,_______,_______,_______,_______,KC_END, KC_PGDN,_______,_______, _______, From fa1e674bbbb92f70e2baaea88d3c4c38e10aac72 Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Sun, 9 Sep 2018 19:45:59 -0700 Subject: [PATCH 071/788] 65% and 68 key community layouts (#3872) * rename 68_ansi layout to 65_ansi layout * more renames and readme change * add company names * add community layouts for 68_ansi * add 68_ansi support for mf68 type boards * update readme --- keyboards/mf68/mf68.h | 4 ++-- keyboards/mf68/rules.mk | 2 ++ keyboards/mf68_ble/mf68_ble.h | 4 ++-- layouts/community/68_ansi/layout.json | 5 +++++ layouts/community/68_ansi/mechmerlin/keymap.c | 18 ++++++++++++++++++ layouts/community/68_ansi/mechmerlin/rules.mk | 1 + layouts/community/68_ansi/readme.md | 5 +++++ .../default/65_ansi/default_65_ansi/keymap.c | 11 +++++++++++ layouts/default/65_ansi/layout.json | 5 +++++ layouts/default/65_ansi/readme.md | 5 +++++ .../default/68_ansi/default_68_ansi/keymap.c | 8 ++++---- layouts/default/68_ansi/layout.json | 10 +++++----- layouts/default/68_ansi/readme.md | 4 +++- 13 files changed, 68 insertions(+), 14 deletions(-) create mode 100644 layouts/community/68_ansi/layout.json create mode 100644 layouts/community/68_ansi/mechmerlin/keymap.c create mode 100644 layouts/community/68_ansi/mechmerlin/rules.mk create mode 100644 layouts/community/68_ansi/readme.md create mode 100644 layouts/default/65_ansi/default_65_ansi/keymap.c create mode 100644 layouts/default/65_ansi/layout.json create mode 100644 layouts/default/65_ansi/readme.md diff --git a/keyboards/mf68/mf68.h b/keyboards/mf68/mf68.h index a7aefc647..a55c1d60b 100644 --- a/keyboards/mf68/mf68.h +++ b/keyboards/mf68/mf68.h @@ -3,7 +3,7 @@ #include "quantum.h" -#define LAYOUT( \ +#define LAYOUT_68_ansi( \ K00, K01, K02, K03, K04, K05, K06, K07, K08, K10, K11, K12, K13, K14, K15, K16, \ K17, K18, K20, K21, K22, K23, K24, K25, K26, K27, K28, K30, K31, K32, K33, K34, \ K35, K36, K37, K38, K40, K41, K42, K43, K44, K45, K46, K47, K48, \ @@ -26,7 +26,7 @@ K35, K36, K37, K38, K40, K41, K42, K43, K44, K45, K46, K47, K48, \ K50, K51, K52, K53, K54, K55, K56, K57, K58, K60, K61, K62, K63, \ K64, K65, K66, K67, K68, K70, K71, K72, K73, K74 \ -) LAYOUT( \ +) LAYOUT_68_ansi( \ KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, \ KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, \ KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27, KC_##K28, \ diff --git a/keyboards/mf68/rules.mk b/keyboards/mf68/rules.mk index a535a9d0e..9f6445686 100644 --- a/keyboards/mf68/rules.mk +++ b/keyboards/mf68/rules.mk @@ -64,3 +64,5 @@ MIDI_ENABLE ?= no # MIDI controls UNICODE_ENABLE ?= no # Unicode BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID AUDIO_ENABLE ?= no # Audio output on port C6 + +LAYOUTS = 68_ansi \ No newline at end of file diff --git a/keyboards/mf68_ble/mf68_ble.h b/keyboards/mf68_ble/mf68_ble.h index fa17a9390..8ef14c98d 100644 --- a/keyboards/mf68_ble/mf68_ble.h +++ b/keyboards/mf68_ble/mf68_ble.h @@ -3,7 +3,7 @@ #include "quantum.h" -#define LAYOUT( \ +#define LAYOUT_68_ansi( \ K00, K01, K02, K03, K04, K05, K06, K07, K08, K10, K11, K12, K13, K14, K15, K16, \ K17, K18, K20, K21, K22, K23, K24, K25, K26, K27, K28, K30, K31, K32, K33, K34, \ K35, K36, K37, K38, K40, K41, K42, K43, K44, K45, K46, K47, K48, \ @@ -26,7 +26,7 @@ K35, K36, K37, K38, K40, K41, K42, K43, K44, K45, K46, K47, K48, \ K50, K51, K52, K53, K54, K55, K56, K57, K58, K60, K61, K62, K63, \ K64, K65, K66, K67, K68, K70, K71, K72, K73, K74 \ -) LAYOUT( \ +) LAYOUT_68_ansi( \ KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, \ KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, \ KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27, KC_##K28, \ diff --git a/layouts/community/68_ansi/layout.json b/layouts/community/68_ansi/layout.json new file mode 100644 index 000000000..f81ee0bcb --- /dev/null +++ b/layouts/community/68_ansi/layout.json @@ -0,0 +1,5 @@ +[{a:7},"","","","","","","","","","","","","",{w:2},"",{x:0.25},"",""], +[{w:1.5},"","","","","","","","","","","","","",{w:1.5},"",{x:0.25},"",""], +[{w:1.75},"","","","","","","","","","","","",{w:2.25},""], +[{w:2.25},"","","","","","","","","","","",{w:2.75},"",{x:0.25},""], +[{w:1.25},"",{w:1.25},"",{w:1.25},"",{w:6.25},"",{w:1.25},"",{w:1.25},"",{w:1.25},"",{x:0.5},"","",""] diff --git a/layouts/community/68_ansi/mechmerlin/keymap.c b/layouts/community/68_ansi/mechmerlin/keymap.c new file mode 100644 index 000000000..5059bd7d8 --- /dev/null +++ b/layouts/community/68_ansi/mechmerlin/keymap.c @@ -0,0 +1,18 @@ +#include QMK_KEYBOARD_H +#include "mechmerlin.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BL] = LAYOUT_68_ansi(\ + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_PGUP, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_PGDN, + KC_CTCP, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(_FL), KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [_FL] = LAYOUT_68_ansi(\ + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + }; \ No newline at end of file diff --git a/layouts/community/68_ansi/mechmerlin/rules.mk b/layouts/community/68_ansi/mechmerlin/rules.mk new file mode 100644 index 000000000..e2ce3d773 --- /dev/null +++ b/layouts/community/68_ansi/mechmerlin/rules.mk @@ -0,0 +1 @@ +USER_NAME := mechmerlin \ No newline at end of file diff --git a/layouts/community/68_ansi/readme.md b/layouts/community/68_ansi/readme.md new file mode 100644 index 000000000..2180973de --- /dev/null +++ b/layouts/community/68_ansi/readme.md @@ -0,0 +1,5 @@ +# 68_ansi + + LAYOUT_68_ansi + +This is the 68 key ANSI layout made popular by boards such as the Magicforce 68 and Varmilo VA68M. \ No newline at end of file diff --git a/layouts/default/65_ansi/default_65_ansi/keymap.c b/layouts/default/65_ansi/default_65_ansi/keymap.c new file mode 100644 index 000000000..69fcccd63 --- /dev/null +++ b/layouts/default/65_ansi/default_65_ansi/keymap.c @@ -0,0 +1,11 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* layer 0: qwerty */ + [0] = LAYOUT_65_ansi(\ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_HOME, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT) + }; \ No newline at end of file diff --git a/layouts/default/65_ansi/layout.json b/layouts/default/65_ansi/layout.json new file mode 100644 index 000000000..0fa92b0f2 --- /dev/null +++ b/layouts/default/65_ansi/layout.json @@ -0,0 +1,5 @@ +["","","","","","","","","","","","","",{w:2},"",""], +[{w:1.5},"","","","","","","","","","","","","",{w:1.5},"",""], +[{w:1.75},"","","","","","","","","","","","",{w:2.25},"",""], +[{w:2.25},"","","","","","","","","","","",{w:1.75},"","",""], +[{w:1.25},"",{w:1.25},"",{w:1.25},"",{w:6.25},"","","","","","",""] diff --git a/layouts/default/65_ansi/readme.md b/layouts/default/65_ansi/readme.md new file mode 100644 index 000000000..0cde8e727 --- /dev/null +++ b/layouts/default/65_ansi/readme.md @@ -0,0 +1,5 @@ +# 65_ansi + + LAYOUT_65_ansi + +This is the 65% ANSI layout made popular by boards such as the [Input Club Whitefox](https://github.com/qmk/qmk_firmware/tree/master/keyboards/whitefox) and [RAMA M65-A](https://github.com/qmk/qmk_firmware/tree/master/keyboards/jc65). \ No newline at end of file diff --git a/layouts/default/68_ansi/default_68_ansi/keymap.c b/layouts/default/68_ansi/default_68_ansi/keymap.c index 59b0ea47d..544f9c156 100644 --- a/layouts/default/68_ansi/default_68_ansi/keymap.c +++ b/layouts/default/68_ansi/default_68_ansi/keymap.c @@ -3,9 +3,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* layer 0: qwerty */ [0] = LAYOUT_68_ansi(\ - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_HOME, - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP, - KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN, - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_PGUP, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_PGDN, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT) }; \ No newline at end of file diff --git a/layouts/default/68_ansi/layout.json b/layouts/default/68_ansi/layout.json index 0fa92b0f2..f81ee0bcb 100644 --- a/layouts/default/68_ansi/layout.json +++ b/layouts/default/68_ansi/layout.json @@ -1,5 +1,5 @@ -["","","","","","","","","","","","","",{w:2},"",""], -[{w:1.5},"","","","","","","","","","","","","",{w:1.5},"",""], -[{w:1.75},"","","","","","","","","","","","",{w:2.25},"",""], -[{w:2.25},"","","","","","","","","","","",{w:1.75},"","",""], -[{w:1.25},"",{w:1.25},"",{w:1.25},"",{w:6.25},"","","","","","",""] +[{a:7},"","","","","","","","","","","","","",{w:2},"",{x:0.25},"",""], +[{w:1.5},"","","","","","","","","","","","","",{w:1.5},"",{x:0.25},"",""], +[{w:1.75},"","","","","","","","","","","","",{w:2.25},""], +[{w:2.25},"","","","","","","","","","","",{w:2.75},"",{x:0.25},""], +[{w:1.25},"",{w:1.25},"",{w:1.25},"",{w:6.25},"",{w:1.25},"",{w:1.25},"",{w:1.25},"",{x:0.5},"","",""] diff --git a/layouts/default/68_ansi/readme.md b/layouts/default/68_ansi/readme.md index eab8f312b..2180973de 100644 --- a/layouts/default/68_ansi/readme.md +++ b/layouts/default/68_ansi/readme.md @@ -1,3 +1,5 @@ # 68_ansi - LAYOUT_68_ansi \ No newline at end of file + LAYOUT_68_ansi + +This is the 68 key ANSI layout made popular by boards such as the Magicforce 68 and Varmilo VA68M. \ No newline at end of file From 63852e7a683d1fb3634beb45a8a57da4ee7a34e9 Mon Sep 17 00:00:00 2001 From: sK0pe Date: Mon, 10 Sep 2018 10:47:14 +0800 Subject: [PATCH 072/788] Keymap: Adjusted keymaps for standardisation (#3874) * Added HHKB with 7U space bar There are backlight changers on the function Z, X and C, mediat controls have been removed. * Fixed the default layout and added a keymap GUI and ALT keys were swapped. My own keymap which adds calculator, removes power, removes eject. * Adjusted naming convention of hhkb layout layer Fixed as per required from code review. * Updated for qmk configurator I didn't realise that there was a new standardisation across all the keymaps to accommodate the configurator. Hopefully fixed now. --- keyboards/satan/keymaps/hhkb_7u/keymap.c | 56 +++++++++++++++++++ keyboards/satan/keymaps/hhkb_7u/readme.md | 9 +++ .../tokyo60/keymaps/swappedBottomRow/config.h | 3 + .../tokyo60/keymaps/swappedBottomRow/keymap.c | 47 ++++++++++++++++ 4 files changed, 115 insertions(+) create mode 100644 keyboards/satan/keymaps/hhkb_7u/keymap.c create mode 100644 keyboards/satan/keymaps/hhkb_7u/readme.md create mode 100644 keyboards/tokyo60/keymaps/swappedBottomRow/config.h create mode 100644 keyboards/tokyo60/keymaps/swappedBottomRow/keymap.c diff --git a/keyboards/satan/keymaps/hhkb_7u/keymap.c b/keyboards/satan/keymaps/hhkb_7u/keymap.c new file mode 100644 index 000000000..b0bc48b45 --- /dev/null +++ b/keyboards/satan/keymaps/hhkb_7u/keymap.c @@ -0,0 +1,56 @@ +#include QMK_KEYBOARD_H +#include "action_layer.h" + +#define _DEFAULT 0 +#define _FN 1 + +enum planck_keycodes { + DEFAULT = SAFE_RANGE +}; + +// Fillers to make layering more clear +#define ______ KC_TRNS + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Qwerty gui/alt/space/alt/gui + * ,-----------------------------------------------------------------------------------------. + * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` | + * |-----------------------------------------------------------------------------------------+ + * | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | Bksp | + * |-----------------------------------------------------------------------------------------+ + * | Ctrl | A | S | D | F | G | H | J | K | L | ; | ' | Enter | + * |-----------------------------------------------------------------------------------------+ + * | Shift | Z | X | C | V | B | N | M | , | . | / | RShift | FN | + * |-----------------------------------------------------------------------------------------+ + * |LGUI | LAlt | 7U Space | RAlt |RGUI | + * `-----------------------------------------------------------------' + */ + [_DEFAULT] = LAYOUT_60_hhkb( /* Basic QWERTY */ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,KC_BSPC, \ + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(_FN), \ + ______, KC_LGUI,KC_LALT, KC_SPC, ______,KC_RALT, KC_RGUI, ______ \ + ), + +/* FN Layer + * ,-----------------------------------------------------------------------------------------. + * | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | Ins | Del | + * |-----------------------------------------------------------------------------------------+ + * | CAPS | | | | | | | | Psc | Slck| Paus| Up | | | + * |-----------------------------------------------------------------------------------------+ + * | | Vol-| Vol+| Mute| | | * | / | Home| PgUp| Left|Right| | + * |-----------------------------------------------------------------------------------------+ + * | | BL | BL- | BL+ | | | + | - | End |PgDn| Down| | | + * |-----------------------------------------------------------------------------------------+ + * | | | | | | + * `-----------------------------------------------------------------' + */ + [_FN] = LAYOUT_60_hhkb( /* Layer 1 */ + ______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, \ + KC_CAPS, ______, ______, ______, ______, ______, ______, ______, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, ______, ______, \ + ______, KC_VOLD,KC_VOLU,KC_MUTE,______, ______, KC_PAST,KC_PSLS,KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, ______, \ + ______, BL_DEC,BL_INC,BL_TOGG,______, ______, KC_PPLS,KC_PMNS,KC_END, KC_PGDN, KC_DOWN, ______, ______, \ + ______, ______, ______, ______, ______, ______, ______, ______ \ + ) +}; diff --git a/keyboards/satan/keymaps/hhkb_7u/readme.md b/keyboards/satan/keymaps/hhkb_7u/readme.md new file mode 100644 index 000000000..39e71beed --- /dev/null +++ b/keyboards/satan/keymaps/hhkb_7u/readme.md @@ -0,0 +1,9 @@ +# Dbroqua HHKB like Layout + +Like the HHKB but with a Satan GH60 PCB :D. + +# Programming Instructions: +Enter into programming mode and run the following command. +``` +$ sudo KEYMAP=dbroqua_hhkb make dfu +``` \ No newline at end of file diff --git a/keyboards/tokyo60/keymaps/swappedBottomRow/config.h b/keyboards/tokyo60/keymaps/swappedBottomRow/config.h new file mode 100644 index 000000000..271f48d00 --- /dev/null +++ b/keyboards/tokyo60/keymaps/swappedBottomRow/config.h @@ -0,0 +1,3 @@ +#pragma once + +// place overrides here diff --git a/keyboards/tokyo60/keymaps/swappedBottomRow/keymap.c b/keyboards/tokyo60/keymaps/swappedBottomRow/keymap.c new file mode 100644 index 000000000..54b68f582 --- /dev/null +++ b/keyboards/tokyo60/keymaps/swappedBottomRow/keymap.c @@ -0,0 +1,47 @@ +#include QMK_KEYBOARD_H + +#define BL 0 +#define FN 1 +/* + * Default HHKB Layout + */ +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* 0: Default layer +┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ +│ Esc │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ \ │ ` │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │BkSpc│█████│ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│Ctrl │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │█████│Enter│█████│ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│Shift│█████│ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │█████│Shift│ Fn │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│█████│ Gui │ Alt │█████│█████│Space│█████│█████│█████│█████│█████│ Alt │ Gui │█████│█████│ +└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ + */ +[BL] = LAYOUT_60_hhkb( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, \ + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(FN), \ + KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI ), + /* 1: HHKB Fn layer +┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ +│ │ F1 │ F2 │ F3 │ F4 │ F5 │ F6 │ F7 │ F8 │ F9 │ F10 │ F11 │ F12 │ Ins │ Del │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│Caps │ RGB │RGBfw│RGBrv│BLtog│BLstp│ │ │ Psc │ Slk │ Pus │ Up │ │ │█████│ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ │ VoD │ VoU │ Mut │ │ │NP_* │NP_/ │Home │PgUp │Left │Right│█████│NPEnt│█████│ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ │█████│ │ │Calc │ │ │NP_+ │NP_- │ End │PgDwn│Down │█████│ │ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│█████│ │ │█████│█████│█████│ │█████│█████│█████│█████│ │ │█████│█████│ +└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ + */ +[FN]= LAYOUT_60_hhkb( + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, \ + KC_CAPS, RGB_TOG, RGB_MOD, RGB_RMOD, BL_TOGG, BL_STEP, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_PENT, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_CALC, KC_TRNS, KC_TRNS, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), +}; From 7d8f680b507ab16fdb1172a01a72a601694ba20a Mon Sep 17 00:00:00 2001 From: Peter Nguyen Date: Mon, 10 Sep 2018 04:49:26 +0200 Subject: [PATCH 073/788] Fix typo in keymap_swedish.h (#3877) * Fix typo in keymap_swedish.h * Update keymap_swedish.h --- quantum/keymap_extras/keymap_swedish.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/quantum/keymap_extras/keymap_swedish.h b/quantum/keymap_extras/keymap_swedish.h index 9044bb74e..d1a0f4f22 100644 --- a/quantum/keymap_extras/keymap_swedish.h +++ b/quantum/keymap_extras/keymap_swedish.h @@ -41,8 +41,8 @@ #define NO_DLR_MAC LSFT(KC_4) // $ #define NO_GRV_MAC ALGR(NO_BSLS) // ` #define NO_GRTR_MAC LSFT(KC_GRV) // > -#define NO_LCBR_MAC ALGR(LSFT(KC_8)) // } -#define NO_LESS_MAC KC_GRV // > +#define NO_LCBR_MAC ALGR(LSFT(KC_8)) // { +#define NO_LESS_MAC KC_GRV // < #define NO_PIPE_MAC ALGR(KC_7) // | #define NO_RCBR_MAC ALGR(LSFT(KC_9)) // } From e11e4a91ac18862e1f23efb070859663ffc242b6 Mon Sep 17 00:00:00 2001 From: Jeremy Herve Date: Mon, 10 Sep 2018 16:39:05 +0200 Subject: [PATCH 074/788] Keymap: Redox: add a new Colemak keymap, macOS oriented. (#3861) * Add my own keymap to the list of available Redox keymaps. This keymap is a Colemak keymap, and is meant to be used on Mac OS. More information can be found in the readme. * Fix "macOS" typo and remove mention of the license. This directory inherits the project's license. * Add missing custom keycode. * Address feedback from PR review - Remove deprecated code - Remove RGB logic since it is overwritten by code running later. --- keyboards/redox/keymaps/jeherve/config.h | 40 +++ keyboards/redox/keymaps/jeherve/keymap.c | 282 ++++++++++++++++++++++ keyboards/redox/keymaps/jeherve/readme.md | 37 +++ keyboards/redox/keymaps/jeherve/rules.mk | 3 + 4 files changed, 362 insertions(+) create mode 100644 keyboards/redox/keymaps/jeherve/config.h create mode 100644 keyboards/redox/keymaps/jeherve/keymap.c create mode 100644 keyboards/redox/keymaps/jeherve/readme.md create mode 100644 keyboards/redox/keymaps/jeherve/rules.mk diff --git a/keyboards/redox/keymaps/jeherve/config.h b/keyboards/redox/keymaps/jeherve/config.h new file mode 100644 index 000000000..939d0c8d8 --- /dev/null +++ b/keyboards/redox/keymaps/jeherve/config.h @@ -0,0 +1,40 @@ +/* +Copyright 2018 Jeremy Herve + +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 . +*/ + +#pragma once + +/* Use I2C or Serial, not both */ + +/* Change the default tapping toggle value (normally 5) */ +#define TAPPING_TOGGLE 2 + +#define USE_SERIAL +//#define USE_I2C + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + +#undef RGBLED_NUM +//#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 14 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 +#define RGBLIGHT_SLEEP diff --git a/keyboards/redox/keymaps/jeherve/keymap.c b/keyboards/redox/keymaps/jeherve/keymap.c new file mode 100644 index 000000000..d298fa9a3 --- /dev/null +++ b/keyboards/redox/keymaps/jeherve/keymap.c @@ -0,0 +1,282 @@ +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _COLEMAK 0 +#define _SYMB 1 +#define _NAV 2 +#define _INTER 3 +#define _ADJUST 4 + +enum custom_keycodes { + COLEMAK = SAFE_RANGE, + SYMB, + NAV, + INTER, + ADJUST, + // These use process_record_user() + M_BRACKET_LEFT, + M_BRACKET_RIGHT, + SHRUG, + WAVE, + YOSHI, + THUMB_UP, + NBSP +}; + +// Fillers to make layering more clear +#define KC_ KC_TRNS +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +// Make macros a bit simpler with this shortcut. +#define TAP_ONCE(code) \ + register_code (code); \ + unregister_code (code) + +// Is shift being held? Let's store this in a bool. +static bool shift_held = false; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch(keycode) { + case SHRUG: + if (record->event.pressed) { + unicode_input_start(); register_hex(0xaf); unicode_input_finish(); + TAP_ONCE (KC_BSLS); + register_code (KC_RSFT); TAP_ONCE (KC_MINS); TAP_ONCE (KC_9); unregister_code (KC_RSFT); + unicode_input_start (); register_hex(0x30c4); unicode_input_finish(); + register_code (KC_RSFT); TAP_ONCE (KC_0); TAP_ONCE (KC_MINS); unregister_code (KC_RSFT); + TAP_ONCE (KC_SLSH); + unicode_input_start (); register_hex(0xaf); unicode_input_finish(); + } + return false; + break; + case YOSHI: + if (record->event.pressed) { + SEND_STRING(":yellow_yoshi:"); + } + return false; + break; + case THUMB_UP: + if (record->event.pressed) { + SEND_STRING(SS_LALT("D83D+DC4D")); + } + return false; + break; + case WAVE: + if (record->event.pressed) { + SEND_STRING(SS_LALT("D83D+DC4B")); + } + return false; + break; + case NBSP: + if (record->event.pressed) { + SEND_STRING(" "); + } + return false; + break; + case KC_LSFT: + shift_held = record->event.pressed; + return true; + break; + case KC_RSFT: + shift_held = record->event.pressed; + return true; + break; + case M_BRACKET_LEFT: { + if (record->event.pressed) { + if (shift_held) { + unregister_code(KC_LSFT); + unregister_code(KC_RSFT); + register_code(KC_LBRC); + } else { + register_code(KC_LSFT); + register_code(KC_9); + } + } else { // Release the key + unregister_code(KC_LBRC); + unregister_code(KC_LSFT); + unregister_code(KC_RSFT); + unregister_code(KC_9); + } + return false; + break; + } + case M_BRACKET_RIGHT: { + if (record->event.pressed) { + if (shift_held) { + unregister_code(KC_LSFT); + unregister_code(KC_RSFT); + register_code(KC_RBRC); + } else { + register_code(KC_LSFT); + register_code(KC_0); + } + } else { // Release the key + unregister_code(KC_RBRC); + unregister_code(KC_LSFT); + unregister_code(KC_RSFT); + unregister_code(KC_0); + } + return false; + break; + } + } + return true; +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* COLEMAK + * ,------------------------------------------------. ,------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | Esc | | Exp | 6 | 7 | 8 | 9 | 0 | = | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | Tab | Q | W | F | P | G | ( | | ) | J | L | U | Y | ; | \ | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | Lay1 | A | R | S | T | D | Lay2 | | Lay2 | H | N | E | I | O |'/Lay1| + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | Lay1 | | Lay1 | K | M | , | . | / |Shift | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | Lay3 | Ctrl | Hyper| Alt | Cmd |Bcksp | Ctrl | |Enter |Space | Cmd | Lay4 | Hyper| Ctrl | Lay3 | + * `------------------------------------------------' `------------------------------------------------' + */ + [_COLEMAK] = LAYOUT( + //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. + KC_GRV , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 ,KC_ESC, LCTL(KC_DOWN), KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_EQL, + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + KC_TAB , KC_Q , KC_W , KC_F , KC_P , KC_G , M_BRACKET_LEFT, M_BRACKET_RIGHT , KC_J , KC_L , KC_U , KC_Y , KC_SCLN , KC_BSLS, + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + MO(_SYMB) , KC_A , KC_R , KC_S , KC_T , KC_D ,TT(_NAV), TT(_NAV) , KC_H , KC_N , KC_E , KC_I , KC_O , LT(_SYMB,KC_QUOT), + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + KC_LSFT , KC_Z , KC_X , KC_C , KC_V , KC_B ,TT(_SYMB), TT(_SYMB) , KC_K , KC_M , KC_COMM , KC_DOT , KC_SLSH , KC_RSFT, + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + MO(_INTER),KC_LCTL,KC_HYPR,KC_LALT, KC_LCMD, KC_BSPC,KC_LCTL, KC_ENT,KC_SPC , KC_RCMD , TT(_ADJUST),KC_HYPR,KC_RCTL,MO(_INTER) + //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' + ), + +/* Symbols + * ,------------------------------------------------. ,------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | 1 | 2 | 3 | 4 | 5 | | | | 6 | 7 | 8 | 9 | | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | ! | @ | # | $ | % | | | | ^ | & | * | - | _ | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | | | | | | | | | | | | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | | | | | | | | | | | | | + * `------------------------------------------------' `------------------------------------------------' + */ + + [_SYMB] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_LCBR, KC_RCBR, KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , _______, + _______, KC_EXLM, KC_AT , KC_HASH, KC_DLR , KC_PERC, _______, _______, KC_CIRC, KC_AMPR, KC_ASTR, KC_MINS, KC_UNDS, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + +/* Navigation + * ,------------------------------------------------. ,------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | | | | | | | | | | | | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | |VOLDOW|VOL UP| MUTE | | | | LEFT | DOWN | UP |RIGHT | | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | | | | | | | | | | | | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | | | | | | | | | | | | | + * `------------------------------------------------' `------------------------------------------------' + */ + [_NAV] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, KC_VOLD, KC_VOLU, KC_MUTE, XXXXXXX, _______, _______, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP , KC_RIGHT, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, _______ + ), + +/* i18n + emoji +* ,------------------------------------------------. ,------------------------------------------------. +* | | | | | | | | | | | | | | | | +* |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| +* | | à | 👋 | | | | | | | | ü | è | YOSHI| ö | | +* |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| +* | | á | |SHRUG | 👍 | | | | | | ú | é | í | ó | | +* |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| +* | | â | | ç | | | | | | | ű | ê | | ő | | +* |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| +* | | | | | | | | | | | | | | | | +* `------------------------------------------------' `------------------------------------------------' +*/ + [_INTER] = LAYOUT( + XXXXXXX, _______ , _______, _______ , _______ , _______, _______, _______, _______, _______, _______, _______, _______, _______, + XXXXXXX, UC(0x00E0), WAVE , XXXXXXX , XXXXXXX , XXXXXXX, _______, _______, XXXXXXX, UC(0x00FC), UC(0x00E8), YOSHI, UC(0x00F6), XXXXXXX, + _______, UC(0x00E1), XXXXXXX, SHRUG , THUMB_UP, XXXXXXX, _______, _______, XXXXXXX, UC(0x00F9), UC(0x00E9), UC(0x00ED) , UC(0x00F3), _______, + XXXXXXX, UC(0x00E2), XXXXXXX, UC(0x00E7), XXXXXXX , XXXXXXX, _______, _______, XXXXXXX, UC(0x0171), UC(0x00EA), XXXXXXX, UC(0x0151), XXXXXXX, + _______, XXXXXXX , XXXXXXX, XXXXXXX , XXXXXXX , XXXXXXX, _______, _______, NBSP, XXXXXXX, _______, XXXXXXX, XXXXXXX, _______ + ), + +/* Adjust keyboard settings + * ,------------------------------------------------. ,------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | | | | | | | | | | | | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | RGB- | RGB+ |RGB ON| | | | | | RESET| DEBUG|AUD ON| | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | | | | | | | | | | | | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | | | | | | | | | | | | | + * `------------------------------------------------' `------------------------------------------------' + */ + [_ADJUST] = LAYOUT( + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + _______, XXXXXXX, RGB_VAD, RGB_VAI, RGB_TOG, XXXXXXX, _______, _______, XXXXXXX, RESET , DEBUG , AU_TOG , XXXXXXX, _______, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, _______ + ) + +}; + +#ifdef AUDIO_ENABLE +float tone_colemak[][2] = SONG(ZELDA_TREASURE); +#endif + +void persistent_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +// Set unicode in Mac OS. +void matrix_init_user(void) { + set_unicode_input_mode(UC_OSX); +}; + +// Change LED colors depending on the layer. +uint32_t layer_state_set_user(uint32_t state) { + switch (biton32(state)) { + case _SYMB: + rgblight_setrgb_orange(); + break; + case _NAV: + rgblight_setrgb_springgreen(); + break; + case _INTER: + rgblight_setrgb_teal(); + break; + case _ADJUST: + rgblight_setrgb_red(); + break; + default: // for any other layers, or the default layer + rgblight_setrgb_yellow(); + break; + } + return state; +}; diff --git a/keyboards/redox/keymaps/jeherve/readme.md b/keyboards/redox/keymaps/jeherve/readme.md new file mode 100644 index 000000000..5afad5530 --- /dev/null +++ b/keyboards/redox/keymaps/jeherve/readme.md @@ -0,0 +1,37 @@ +# A Colemak keymap for the Redox keyboard + +---- +![jeherve-redox-layout-3](https://user-images.githubusercontent.com/426388/45171716-69888200-b203-11e8-822d-7bc91f9f6c07.jpg) + +---- + +This keymap is **a work in progress**, and is meant to be used on macOS, with the "Unicode Hex Input" keyboard input. + +![macOS keyboard input setting](https://user-images.githubusercontent.com/426388/43962498-1ee9e3fc-9cb8-11e8-88e3-dbb068ec5c67.png) + +I may change a lot of the keys over the next few months, and will update this repo when I do so. + +[View on KLE](http://www.keyboard-layout-editor.com/#/gists/3d5368842d87a8462c8f95d4382c4a19) + +## Layers + +My keymap uses 5 layers: + +1. The default base layer, using [Colemak](https://colemak.com/). +2. A Symbol layer, so all symbols can be accessed from the home row. (top right legends) +3. A Navigation / Media layer, with both sound control and arrows on the home row. (bottom right legends) +4. An international / Emoji layer so I can type accented characters commonly used in France and in Hungary, as well as a few Emoji I often use. (top center legends) +5. A keyboard control layer, not pictured above, allowing me to control the LED lighting as well as the keyboard debug functions. + +## Changelog + +- 2018.09.06 + - Initial submission to QMK. It's alive! ⌨️ + +## Credits + +- Redox keyboard design by [Mattia Dal Ben](https://github.com/mattdibi/redox-keyboard). +- This keymap is based off the default keymap for the Redox keyboard, available [here](https://github.com/qmk/qmk_firmware/tree/master/keyboards/redox) and also build by Mattia Dal Ben (thank you!). +- This layout uses [QMK keyboard controller firmware](https://github.com/qmk/qmk_firmware/). + +I've also read posts by [Gergely Nagy](https://asylum.madhouse-project.org/blog/2016/10/15/multi-purpose-keys/), [Rebecca Le](https://sevenseacat.net/posts/2018/unicode-in-qmk-on-osx/), and [Justin Rogers](https://implementsblog.com/2016/10/16/my-ergodox-ezs-custom-layout/#comments) for inspiration. diff --git a/keyboards/redox/keymaps/jeherve/rules.mk b/keyboards/redox/keymaps/jeherve/rules.mk new file mode 100644 index 000000000..ac2496b8c --- /dev/null +++ b/keyboards/redox/keymaps/jeherve/rules.mk @@ -0,0 +1,3 @@ +RGBLIGHT_ENABLE = yes +UNICODE_ENABLE = yes +AUDIO_ENABLE = yes From 2e0c63e0afcc128ae3865864d33f01a4e94ab218 Mon Sep 17 00:00:00 2001 From: leico Date: Tue, 11 Sep 2018 08:21:54 +0900 Subject: [PATCH 075/788] improve looks like hang up when first time execute make git-submodule (#3846) --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 0dd77d403..45e47c003 100644 --- a/Makefile +++ b/Makefile @@ -578,7 +578,7 @@ lib/%: git-submodule: git submodule sync --recursive - git submodule update --init --recursive + git submodule update --init --recursive --progress ifdef SKIP_VERSION SKIP_GIT := yes From 265eca0f7c473a5b6f4b2ab6cec6f751506cf49c Mon Sep 17 00:00:00 2001 From: Thomas Vandaele Date: Mon, 27 Aug 2018 21:07:30 +0200 Subject: [PATCH 076/788] Add manjaro asn arch-based distro --- util/linux_install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/linux_install.sh b/util/linux_install.sh index 0703db8f1..942c65813 100755 --- a/util/linux_install.sh +++ b/util/linux_install.sh @@ -9,7 +9,7 @@ elif grep ID /etc/os-release | grep -q debian; then sudo apt-get install gcc unzip wget zip gcc-avr binutils-avr avr-libc \ dfu-programmer dfu-util gcc-arm-none-eabi binutils-arm-none-eabi \ libnewlib-arm-none-eabi -elif grep ID /etc/os-release | grep -q arch; then +elif grep ID /etc/os-release | grep -q 'arch\|manjaro'; then sudo pacman -S gcc unzip wget zip avr-gcc avr-binutils avr-libc \ dfu-util arm-none-eabi-gcc arm-none-eabi-binutils \ arm-none-eabi-newlib From e9a67f8fde0ecd7528b8ad0c8bfca85dc848eebe Mon Sep 17 00:00:00 2001 From: Miguel Garcia Rodriguez Date: Mon, 27 Aug 2018 19:56:02 +0200 Subject: [PATCH 077/788] Fix installation for linux finding ID:fedora in os_release --- util/linux_install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/linux_install.sh b/util/linux_install.sh index 942c65813..d5da59e82 100755 --- a/util/linux_install.sh +++ b/util/linux_install.sh @@ -1,5 +1,5 @@ #!/bin/sh -if grep ID /etc/os-release | grep -q rhel; then +if grep ID /etc/os-release | grep -qE "rhel|fedora"; then # RPM based OS sudo dnf install gcc unzip wget zip dfu-util dfu-programmer avr-gcc \ avr-libc binutils-avr32-linux-gnu arm-none-eabi-gcc-cs \ From c7e1b53913707487b0218b984367d32fb4466aaa Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Sun, 17 Jun 2018 15:44:28 +1000 Subject: [PATCH 078/788] Remove unneccesary ATTR_CONST from stub functions (thanks to NicoHood). --- lib/lufa/LUFA/Drivers/USB/Class/Device/AudioClassDevice.h | 2 +- lib/lufa/LUFA/Drivers/USB/Class/Device/CDCClassDevice.h | 2 +- lib/lufa/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.h | 2 +- lib/lufa/LUFA/Drivers/USB/Class/Host/CDCClassHost.h | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Device/AudioClassDevice.h b/lib/lufa/LUFA/Drivers/USB/Class/Device/AudioClassDevice.h index ca63511b2..920281be5 100644 --- a/lib/lufa/LUFA/Drivers/USB/Class/Device/AudioClassDevice.h +++ b/lib/lufa/LUFA/Drivers/USB/Class/Device/AudioClassDevice.h @@ -377,7 +377,7 @@ #if !defined(__DOXYGEN__) /* Function Prototypes: */ #if defined(__INCLUDE_FROM_AUDIO_DEVICE_C) - void Audio_Device_Event_Stub(void) ATTR_CONST; + void Audio_Device_Event_Stub(void); void EVENT_Audio_Device_StreamStartStop(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) ATTR_WEAK ATTR_NON_NULL_PTR_ARG(1) ATTR_ALIAS(Audio_Device_Event_Stub); diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Device/CDCClassDevice.h b/lib/lufa/LUFA/Drivers/USB/Class/Device/CDCClassDevice.h index 9d5c4e5a0..f9a53851a 100644 --- a/lib/lufa/LUFA/Drivers/USB/Class/Device/CDCClassDevice.h +++ b/lib/lufa/LUFA/Drivers/USB/Class/Device/CDCClassDevice.h @@ -362,7 +362,7 @@ static int CDC_Device_getchar_Blocking(FILE* Stream) ATTR_NON_NULL_PTR_ARG(1); #endif - void CDC_Device_Event_Stub(void) ATTR_CONST; + void CDC_Device_Event_Stub(void); void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) ATTR_WEAK ATTR_NON_NULL_PTR_ARG(1) ATTR_ALIAS(CDC_Device_Event_Stub); diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.h b/lib/lufa/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.h index 802c5912d..5ac527935 100644 --- a/lib/lufa/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.h +++ b/lib/lufa/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.h @@ -273,7 +273,7 @@ static int PRNT_Device_getchar_Blocking(FILE* Stream) ATTR_NON_NULL_PTR_ARG(1); #endif - void PRNT_Device_Event_Stub(void) ATTR_CONST; + void PRNT_Device_Event_Stub(void); void EVENT_PRNT_Device_SoftReset(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo) ATTR_WEAK ATTR_NON_NULL_PTR_ARG(1) ATTR_ALIAS(PRNT_Device_Event_Stub); diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/CDCClassHost.h b/lib/lufa/LUFA/Drivers/USB/Class/Host/CDCClassHost.h index 86ce6def3..f5cc4906b 100644 --- a/lib/lufa/LUFA/Drivers/USB/Class/Host/CDCClassHost.h +++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/CDCClassHost.h @@ -360,7 +360,7 @@ static int CDC_Host_getchar_Blocking(FILE* Stream) ATTR_NON_NULL_PTR_ARG(1); #endif - void CDC_Host_Event_Stub(void) ATTR_CONST; + void CDC_Host_Event_Stub(void); void EVENT_CDC_Host_ControLineStateChanged(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) ATTR_WEAK ATTR_NON_NULL_PTR_ARG(1) ATTR_ALIAS(CDC_Host_Event_Stub); From df8e417032bace12d69b5d75aebf257ea5dadb86 Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Sun, 17 Jun 2018 16:06:07 +1000 Subject: [PATCH 079/788] Fix mismatched aliased event and event stub function prototypes. --- .../ClassDriver/DualVirtualSerial/DualVirtualSerial.c | 6 ++++-- .../Device/ClassDriver/VirtualSerial/VirtualSerial.c | 2 ++ .../VirtualSerialMassStorage/VirtualSerialMassStorage.c | 2 ++ .../ClassDriver/VirtualSerialMouse/VirtualSerialMouse.c | 2 ++ .../LUFA/Drivers/USB/Class/Device/AudioClassDevice.c | 2 +- .../LUFA/Drivers/USB/Class/Device/AudioClassDevice.h | 2 +- lib/lufa/LUFA/Drivers/USB/Class/Device/CDCClassDevice.c | 7 ++++++- lib/lufa/LUFA/Drivers/USB/Class/Device/CDCClassDevice.h | 5 +++-- .../LUFA/Drivers/USB/Class/Device/PrinterClassDevice.c | 2 +- .../LUFA/Drivers/USB/Class/Device/PrinterClassDevice.h | 2 +- lib/lufa/LUFA/Drivers/USB/Class/Host/CDCClassHost.c | 2 +- lib/lufa/LUFA/Drivers/USB/Class/Host/CDCClassHost.h | 2 +- lib/lufa/LUFA/Drivers/USB/Core/Events.c | 9 +++++++++ lib/lufa/LUFA/Drivers/USB/Core/Events.h | 6 ++++-- 14 files changed, 38 insertions(+), 13 deletions(-) diff --git a/lib/lufa/Demos/Device/ClassDriver/DualVirtualSerial/DualVirtualSerial.c b/lib/lufa/Demos/Device/ClassDriver/DualVirtualSerial/DualVirtualSerial.c index 9a7ff4725..0210ff55c 100644 --- a/lib/lufa/Demos/Device/ClassDriver/DualVirtualSerial/DualVirtualSerial.c +++ b/lib/lufa/Demos/Device/ClassDriver/DualVirtualSerial/DualVirtualSerial.c @@ -231,12 +231,14 @@ void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t *const C */ bool HostReady = (CDCInterfaceInfo->State.ControlLineStates.HostToDevice & CDC_CONTROL_LINE_OUT_DTR) != 0; + (void)HostReady; + if (CDCInterfaceInfo == &VirtualSerial1_CDC_Interface) { - // CDC interface 1's host is ready to send/receive data + // CDC interface 1's host is ready to send/receive data if HostReady is true } else { - // CDC interface 2's host is ready to send/receive data + // CDC interface 2's host is ready to send/receive data if HostReady is true } } diff --git a/lib/lufa/Demos/Device/ClassDriver/VirtualSerial/VirtualSerial.c b/lib/lufa/Demos/Device/ClassDriver/VirtualSerial/VirtualSerial.c index a3d419ae5..3a943e8c1 100644 --- a/lib/lufa/Demos/Device/ClassDriver/VirtualSerial/VirtualSerial.c +++ b/lib/lufa/Demos/Device/ClassDriver/VirtualSerial/VirtualSerial.c @@ -199,4 +199,6 @@ void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t *const C in the pending data from the USB endpoints. */ bool HostReady = (CDCInterfaceInfo->State.ControlLineStates.HostToDevice & CDC_CONTROL_LINE_OUT_DTR) != 0; + + (void)HostReady; } diff --git a/lib/lufa/Demos/Device/ClassDriver/VirtualSerialMassStorage/VirtualSerialMassStorage.c b/lib/lufa/Demos/Device/ClassDriver/VirtualSerialMassStorage/VirtualSerialMassStorage.c index f298e39cb..c8b1dfd2d 100644 --- a/lib/lufa/Demos/Device/ClassDriver/VirtualSerialMassStorage/VirtualSerialMassStorage.c +++ b/lib/lufa/Demos/Device/ClassDriver/VirtualSerialMassStorage/VirtualSerialMassStorage.c @@ -238,6 +238,8 @@ void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t *const C in the pending data from the USB endpoints. */ bool HostReady = (CDCInterfaceInfo->State.ControlLineStates.HostToDevice & CDC_CONTROL_LINE_OUT_DTR) != 0; + + (void)HostReady; } /** Mass Storage class driver callback function the reception of SCSI commands from the host, which must be processed. diff --git a/lib/lufa/Demos/Device/ClassDriver/VirtualSerialMouse/VirtualSerialMouse.c b/lib/lufa/Demos/Device/ClassDriver/VirtualSerialMouse/VirtualSerialMouse.c index 134958060..c299723bb 100644 --- a/lib/lufa/Demos/Device/ClassDriver/VirtualSerialMouse/VirtualSerialMouse.c +++ b/lib/lufa/Demos/Device/ClassDriver/VirtualSerialMouse/VirtualSerialMouse.c @@ -279,4 +279,6 @@ void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t *const C in the pending data from the USB endpoints. */ bool HostReady = (CDCInterfaceInfo->State.ControlLineStates.HostToDevice & CDC_CONTROL_LINE_OUT_DTR) != 0; + + (void)HostReady; } diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Device/AudioClassDevice.c b/lib/lufa/LUFA/Drivers/USB/Class/Device/AudioClassDevice.c index 08cbeb706..eb3aa5710 100644 --- a/lib/lufa/LUFA/Drivers/USB/Class/Device/AudioClassDevice.c +++ b/lib/lufa/LUFA/Drivers/USB/Class/Device/AudioClassDevice.c @@ -188,7 +188,7 @@ bool Audio_Device_ConfigureEndpoints(USB_ClassInfo_Audio_Device_t* const AudioIn return true; } -void Audio_Device_Event_Stub(void) +void Audio_Device_Event_Stub(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) { } diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Device/AudioClassDevice.h b/lib/lufa/LUFA/Drivers/USB/Class/Device/AudioClassDevice.h index 920281be5..91938af8c 100644 --- a/lib/lufa/LUFA/Drivers/USB/Class/Device/AudioClassDevice.h +++ b/lib/lufa/LUFA/Drivers/USB/Class/Device/AudioClassDevice.h @@ -377,7 +377,7 @@ #if !defined(__DOXYGEN__) /* Function Prototypes: */ #if defined(__INCLUDE_FROM_AUDIO_DEVICE_C) - void Audio_Device_Event_Stub(void); + void Audio_Device_Event_Stub(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo); void EVENT_Audio_Device_StreamStartStop(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) ATTR_WEAK ATTR_NON_NULL_PTR_ARG(1) ATTR_ALIAS(Audio_Device_Event_Stub); diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Device/CDCClassDevice.c b/lib/lufa/LUFA/Drivers/USB/Class/Device/CDCClassDevice.c index 867548c00..93930bc99 100644 --- a/lib/lufa/LUFA/Drivers/USB/Class/Device/CDCClassDevice.c +++ b/lib/lufa/LUFA/Drivers/USB/Class/Device/CDCClassDevice.c @@ -353,10 +353,15 @@ static int CDC_Device_getchar_Blocking(FILE* Stream) } #endif -void CDC_Device_Event_Stub(void) +void CDC_Device_Event_Stub(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) { } +void CDC_Device_Event_Stub_2(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, const uint8_t _1) +{ + CDC_Device_Event_Stub(CDCInterfaceInfo); +} + #endif diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Device/CDCClassDevice.h b/lib/lufa/LUFA/Drivers/USB/Class/Device/CDCClassDevice.h index f9a53851a..55dbbc726 100644 --- a/lib/lufa/LUFA/Drivers/USB/Class/Device/CDCClassDevice.h +++ b/lib/lufa/LUFA/Drivers/USB/Class/Device/CDCClassDevice.h @@ -362,7 +362,8 @@ static int CDC_Device_getchar_Blocking(FILE* Stream) ATTR_NON_NULL_PTR_ARG(1); #endif - void CDC_Device_Event_Stub(void); + void CDC_Device_Event_Stub(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo); + void CDC_Device_Event_Stub_2(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, const uint8_t _1); void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) ATTR_WEAK ATTR_NON_NULL_PTR_ARG(1) ATTR_ALIAS(CDC_Device_Event_Stub); @@ -370,7 +371,7 @@ ATTR_WEAK ATTR_NON_NULL_PTR_ARG(1) ATTR_ALIAS(CDC_Device_Event_Stub); void EVENT_CDC_Device_BreakSent(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, const uint8_t Duration) ATTR_WEAK ATTR_NON_NULL_PTR_ARG(1) - ATTR_ALIAS(CDC_Device_Event_Stub); + ATTR_ALIAS(CDC_Device_Event_Stub_2); #endif #endif diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.c b/lib/lufa/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.c index 7209c452d..668b138b7 100644 --- a/lib/lufa/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.c +++ b/lib/lufa/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.c @@ -305,7 +305,7 @@ static int PRNT_Device_getchar_Blocking(FILE* Stream) } #endif -void PRNT_Device_Event_Stub(void) +void PRNT_Device_Event_Stub(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo) { } diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.h b/lib/lufa/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.h index 5ac527935..d850842d8 100644 --- a/lib/lufa/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.h +++ b/lib/lufa/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.h @@ -273,7 +273,7 @@ static int PRNT_Device_getchar_Blocking(FILE* Stream) ATTR_NON_NULL_PTR_ARG(1); #endif - void PRNT_Device_Event_Stub(void); + void PRNT_Device_Event_Stub(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo); void EVENT_PRNT_Device_SoftReset(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo) ATTR_WEAK ATTR_NON_NULL_PTR_ARG(1) ATTR_ALIAS(PRNT_Device_Event_Stub); diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/CDCClassHost.c b/lib/lufa/LUFA/Drivers/USB/Class/Host/CDCClassHost.c index af9ed96e2..cc93f9601 100644 --- a/lib/lufa/LUFA/Drivers/USB/Class/Host/CDCClassHost.c +++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/CDCClassHost.c @@ -503,7 +503,7 @@ static int CDC_Host_getchar_Blocking(FILE* Stream) } #endif -void CDC_Host_Event_Stub(void) +void CDC_Host_Event_Stub(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) { } diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/CDCClassHost.h b/lib/lufa/LUFA/Drivers/USB/Class/Host/CDCClassHost.h index f5cc4906b..8d0d89a03 100644 --- a/lib/lufa/LUFA/Drivers/USB/Class/Host/CDCClassHost.h +++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/CDCClassHost.h @@ -360,7 +360,7 @@ static int CDC_Host_getchar_Blocking(FILE* Stream) ATTR_NON_NULL_PTR_ARG(1); #endif - void CDC_Host_Event_Stub(void); + void CDC_Host_Event_Stub(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo); void EVENT_CDC_Host_ControLineStateChanged(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) ATTR_WEAK ATTR_NON_NULL_PTR_ARG(1) ATTR_ALIAS(CDC_Host_Event_Stub); diff --git a/lib/lufa/LUFA/Drivers/USB/Core/Events.c b/lib/lufa/LUFA/Drivers/USB/Core/Events.c index 186557956..e05fd7419 100644 --- a/lib/lufa/LUFA/Drivers/USB/Core/Events.c +++ b/lib/lufa/LUFA/Drivers/USB/Core/Events.c @@ -37,3 +37,12 @@ void USB_Event_Stub(void) } +void USB_Event_Stub_2(const uint8_t _1) +{ + USB_Event_Stub(); +} + +void USB_Event_Stub_3(const uint8_t _1, const uint8_t _2) +{ + USB_Event_Stub(); +} diff --git a/lib/lufa/LUFA/Drivers/USB/Core/Events.h b/lib/lufa/LUFA/Drivers/USB/Core/Events.h index 91fb31b62..d37bb3065 100644 --- a/lib/lufa/LUFA/Drivers/USB/Core/Events.h +++ b/lib/lufa/LUFA/Drivers/USB/Core/Events.h @@ -332,19 +332,21 @@ /* Function Prototypes: */ #if defined(__INCLUDE_FROM_EVENTS_C) void USB_Event_Stub(void); + void USB_Event_Stub_2(const uint8_t _1); + void USB_Event_Stub_3(const uint8_t _1, const uint8_t _2); #if defined(USB_CAN_BE_BOTH) void EVENT_USB_UIDChange(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub); #endif #if defined(USB_CAN_BE_HOST) - void EVENT_USB_Host_HostError(const uint8_t ErrorCode) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub); + void EVENT_USB_Host_HostError(const uint8_t ErrorCode) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub_2); void EVENT_USB_Host_DeviceAttached(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub); void EVENT_USB_Host_DeviceUnattached(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub); void EVENT_USB_Host_DeviceEnumerationComplete(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub); void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode, const uint8_t SubErrorCode) - ATTR_WEAK ATTR_ALIAS(USB_Event_Stub); + ATTR_WEAK ATTR_ALIAS(USB_Event_Stub_3); void EVENT_USB_Host_StartOfFrame(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub); #endif From 32ff7be266793967b820da80ae6f3fca0a1688b4 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sat, 21 Jul 2018 14:16:14 -0700 Subject: [PATCH 080/788] Fix RG Sleep issues for Teensy Controllers Appearenly, teensy controllers have some issues with waking up. If the rgblight is called "too soon", it will cause the controller to lock up, intermittently. Adding a 10 ms delay seems to fix this issue, as it lets it have enough time to handle things properly. This has been tested extensively on my Ergodox EZ, and can be seen in the @drashna userspace, under the "suspend_wakeup_init_user" function. --- tmk_core/common/avr/suspend.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tmk_core/common/avr/suspend.c b/tmk_core/common/avr/suspend.c index 3d4a48439..73fdda6cc 100644 --- a/tmk_core/common/avr/suspend.c +++ b/tmk_core/common/avr/suspend.c @@ -189,6 +189,9 @@ void suspend_wakeup_init(void) #endif led_set(host_keyboard_leds()); #if defined(RGBLIGHT_SLEEP) && defined(RGBLIGHT_ENABLE) +#ifdef BOOTLOADER_TEENSY + wait_ms(10); +#endif rgblight_enable_noeeprom(); #ifdef RGBLIGHT_ANIMATIONS rgblight_timer_enable(); From 7551e0bbc705c9b67b27a080db2bb483c3ac22e8 Mon Sep 17 00:00:00 2001 From: Xyverz Date: Tue, 11 Sep 2018 14:22:18 -0700 Subject: [PATCH 081/788] Keymap: Fixed my ortho_5x12 layout (#3881) * Fixed my ortho_5x12 layout I've fixed the config.h file for my 5x12 ortho layout so that I can now use it with my Nyquist. * Update config.h * Update config.h --- layouts/community/ortho_5x12/xyverz/config.h | 22 +++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/layouts/community/ortho_5x12/xyverz/config.h b/layouts/community/ortho_5x12/xyverz/config.h index 0481aa814..4489c6e5f 100644 --- a/layouts/community/ortho_5x12/xyverz/config.h +++ b/layouts/community/ortho_5x12/xyverz/config.h @@ -7,16 +7,18 @@ /* ws2812 RGB LED */ #undef RGB_DI_PIN -#define RGB_DI_PIN B3 -#undef RGBLED_NUM -#define RGBLIGHT_ANIMATIONS -#define RGBLED_NUM 11 // Number of LEDs -#undef RGBLIGHT_HUE_STEP -#define RGBLIGHT_HUE_STEP 8 -#undef RGBLIGHT_SAT_STEP -#define RGBLIGHT_SAT_STEP 8 -#undef RGBLIGHT_VAL_STEP -#define RGBLIGHT_VAL_STEP 8 +#if defined(KEYBOARD_preonic_rev2) + #define RGB_DI_PIN B3 + #undef RGBLED_NUM + #define RGBLIGHT_ANIMATIONS + #define RGBLED_NUM 11 // Number of LEDs + #undef RGBLIGHT_HUE_STEP + #define RGBLIGHT_HUE_STEP 8 + #undef RGBLIGHT_SAT_STEP + #define RGBLIGHT_SAT_STEP 8 + #undef RGBLIGHT_VAL_STEP + #define RGBLIGHT_VAL_STEP 8 +#endif // for the split boards // #define USE_SERIAL From 5dd4b2af5381ee2d95fbcf45c4b3ad11285c3dec Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Thu, 13 Sep 2018 09:04:55 -0700 Subject: [PATCH 082/788] Keyboard: Updated info.json for Duck Jetfire (#3866) * Updated info.json for Duck Jetfire Generated a new info.json file. @mechmerlin asked my help in debugging this file. Firmware works as expected if built from source, but not if built from the Configurator. * Corrected the position of the arrow keys in LAYOUT_all --- keyboards/duck/jetfire/info.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/keyboards/duck/jetfire/info.json b/keyboards/duck/jetfire/info.json index db39529ac..ec88a23ac 100644 --- a/keyboards/duck/jetfire/info.json +++ b/keyboards/duck/jetfire/info.json @@ -1,16 +1,16 @@ { - "keyboard_name": "Jetfire", - "url": "", - "maintainer": "qmk", - "width": 20.5, - "height": 6.5, + "keyboard_name": "Jetfire", + "url": "", + "maintainer": "qmk", + "width": 20.5, + "height": 6.5, "layouts": { "LAYOUT_all": { - "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"F1", "x":2, "y":0}, {"label":"F2", "x":3, "y":0}, {"label":"F3", "x":4, "y":0}, {"label":"F4", "x":5, "y":0}, {"label":"F5", "x":6.5, "y":0}, {"label":"F6", "x":7.5, "y":0}, {"label":"F7", "x":8.5, "y":0}, {"label":"F8", "x":9.5, "y":0}, {"label":"F9", "x":11, "y":0}, {"label":"F10", "x":12, "y":0}, {"label":"F11", "x":13, "y":0}, {"label":"F12", "x":14, "y":0}, {"x":15.25, "y":0}, {"label":"PrtSc", "x":16.5, "y":0}, {"label":"Scroll Lock", "x":17.5, "y":0}, {"label":"Pause", "x":18.5, "y":0}, {"x":19.5, "y":0}, {"label":"~", "x":0, "y":1.25}, {"label":"!", "x":1, "y":1.25}, {"label":"@", "x":2, "y":1.25}, {"label":"#", "x":3, "y":1.25}, {"label":"$", "x":4, "y":1.25}, {"label":"%", "x":5, "y":1.25}, {"label":"^", "x":6, "y":1.25}, {"label":"&", "x":7, "y":1.25}, {"label":"*", "x":8, "y":1.25}, {"label":"(", "x":9, "y":1.25}, {"label":")", "x":10, "y":1.25}, {"label":"_", "x":11, "y":1.25}, {"label":"+", "x":12, "y":1.25}, {"x":13, "y":1.25}, {"x":14, "y":1.25}, {"label":"Insert", "x":15.25, "y":1.25}, {"label":"Num Lock", "x":16.5, "y":1.25}, {"label":"/", "x":17.5, "y":1.25}, {"label":"*", "x":18.5, "y":1.25}, {"label":"-", "x":19.5, "y":1.25}, {"label":"Tab", "x":0, "y":2.25, "w":1.5}, {"label":"Q", "x":1.5, "y":2.25}, {"label":"W", "x":2.5, "y":2.25}, {"label":"E", "x":3.5, "y":2.25}, {"label":"R", "x":4.5, "y":2.25}, {"label":"T", "x":5.5, "y":2.25}, {"label":"Y", "x":6.5, "y":2.25}, {"label":"U", "x":7.5, "y":2.25}, {"label":"I", "x":8.5, "y":2.25}, {"label":"O", "x":9.5, "y":2.25}, {"label":"P", "x":10.5, "y":2.25}, {"label":"{", "x":11.5, "y":2.25}, {"label":"}", "x":12.5, "y":2.25}, {"label":"|", "x":13.5, "y":2.25, "w":1.5}, {"label":"Delete", "x":15.25, "y":2.25}, {"label":"7", "x":16.5, "y":2.25}, {"label":"8", "x":17.5, "y":2.25}, {"label":"9", "x":18.5, "y":2.25}, {"label":"+", "x":19.5, "y":2.25}, {"label":"Caps Lock", "x":0, "y":3.25, "w":1.75}, {"label":"A", "x":1.75, "y":3.25}, {"label":"S", "x":2.75, "y":3.25}, {"label":"D", "x":3.75, "y":3.25}, {"label":"F", "x":4.75, "y":3.25}, {"label":"G", "x":5.75, "y":3.25}, {"label":"H", "x":6.75, "y":3.25}, {"label":"J", "x":7.75, "y":3.25}, {"label":"K", "x":8.75, "y":3.25}, {"label":"L", "x":9.75, "y":3.25}, {"label":":", "x":10.75, "y":3.25}, {"label":"\"", "x":11.75, "y":3.25}, {"label":"Enter", "x":12.75, "y":3.25, "w":2.25}, {"label":"4", "x":16.5, "y":3.25}, {"label":"5", "x":17.5, "y":3.25}, {"label":"6", "x":18.5, "y":3.25}, {"x":19.5, "y":3.25}, {"label":"Shift", "x":0, "y":4.25, "w":1.25}, {"x":1.25, "y":4.25}, {"label":"Z", "x":2.25, "y":4.25}, {"label":"X", "x":3.25, "y":4.25}, {"label":"C", "x":4.25, "y":4.25}, {"label":"V", "x":5.25, "y":4.25}, {"label":"B", "x":6.25, "y":4.25}, {"label":"N", "x":7.25, "y":4.25}, {"label":"M", "x":8.25, "y":4.25}, {"label":"<", "x":9.25, "y":4.25}, {"label":">", "x":10.25, "y":4.25}, {"label":"?", "x":11.25, "y":4.25}, {"label":"Shift", "x":12.25, "y":4.25, "w":1.75}, {"x":14, "y":4.25}, {"label":"1", "x":16.5, "y":4.25}, {"label":"2", "x":17.5, "y":4.25}, {"label":"3", "x":18.5, "y":4.25}, {"label":"Enter", "x":19.5, "y":4.25}, {"label":"\u2191", "x":15.25, "y":4.5}, {"label":"Ctrl", "x":0, "y":5.25, "w":1.5}, {"label":"Win", "x":1.5, "y":5.25}, {"label":"Alt", "x":2.5, "y":5.25, "w":1.5}, {"x":4, "y":5.25, "w":7}, {"label":"Alt", "x":11, "y":5.25}, {"label":"Menu", "x":12, "y":5.25}, {"x":13, "y":5.25}, {"label":"0", "x":17.5, "y":5.25}, {"label":".", "x":18.5, "y":5.25}, {"x":19.5, "y":5.25}, {"label":"\u2190", "x":14.25, "y":5.5}, {"label":"\u2193", "x":15.25, "y":5.5}, {"label":"\u2192", "x":16.25, "y":5.5}] + "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"F1", "x":2, "y":0}, {"label":"F2", "x":3, "y":0}, {"label":"F3", "x":4, "y":0}, {"label":"F4", "x":5, "y":0}, {"label":"F5", "x":6.5, "y":0}, {"label":"F6", "x":7.5, "y":0}, {"label":"F7", "x":8.5, "y":0}, {"label":"F8", "x":9.5, "y":0}, {"label":"F9", "x":11, "y":0}, {"label":"F10", "x":12, "y":0}, {"label":"F11", "x":13, "y":0}, {"label":"F12", "x":14, "y":0}, {"x":15.25, "y":0}, {"label":"PrtSc", "x":16.5, "y":0}, {"label":"Scroll Lock", "x":17.5, "y":0}, {"label":"Pause", "x":18.5, "y":0}, {"x":19.5, "y":0}, {"label":"~", "x":0, "y":1.25}, {"label":"!", "x":1, "y":1.25}, {"label":"@", "x":2, "y":1.25}, {"label":"#", "x":3, "y":1.25}, {"label":"$", "x":4, "y":1.25}, {"label":"%", "x":5, "y":1.25}, {"label":"^", "x":6, "y":1.25}, {"label":"&", "x":7, "y":1.25}, {"label":"*", "x":8, "y":1.25}, {"label":"(", "x":9, "y":1.25}, {"label":")", "x":10, "y":1.25}, {"label":"_", "x":11, "y":1.25}, {"label":"+", "x":12, "y":1.25}, {"label":"Back Space", "x":13, "y":1.25}, {"x":14, "y":1.25}, {"label":"Insert", "x":15.25, "y":1.25}, {"label":"Num Lock", "x":16.5, "y":1.25}, {"label":"/", "x":17.5, "y":1.25}, {"label":"*", "x":18.5, "y":1.25}, {"label":"-", "x":19.5, "y":1.25}, {"label":"Tab", "x":0, "y":2.25, "w":1.5}, {"label":"Q", "x":1.5, "y":2.25}, {"label":"W", "x":2.5, "y":2.25}, {"label":"E", "x":3.5, "y":2.25}, {"label":"R", "x":4.5, "y":2.25}, {"label":"T", "x":5.5, "y":2.25}, {"label":"Y", "x":6.5, "y":2.25}, {"label":"U", "x":7.5, "y":2.25}, {"label":"I", "x":8.5, "y":2.25}, {"label":"O", "x":9.5, "y":2.25}, {"label":"P", "x":10.5, "y":2.25}, {"label":"{", "x":11.5, "y":2.25}, {"label":"}", "x":12.5, "y":2.25}, {"label":"|", "x":13.5, "y":2.25, "w":1.5}, {"label":"Delete", "x":15.25, "y":2.25}, {"label":"7", "x":16.5, "y":2.25}, {"label":"8", "x":17.5, "y":2.25}, {"label":"9", "x":18.5, "y":2.25}, {"label":"+", "x":19.5, "y":2.25}, {"label":"Caps Lock", "x":0, "y":3.25, "w":1.75}, {"label":"A", "x":1.75, "y":3.25}, {"label":"S", "x":2.75, "y":3.25}, {"label":"D", "x":3.75, "y":3.25}, {"label":"F", "x":4.75, "y":3.25}, {"label":"G", "x":5.75, "y":3.25}, {"label":"H", "x":6.75, "y":3.25}, {"label":"J", "x":7.75, "y":3.25}, {"label":"K", "x":8.75, "y":3.25}, {"label":"L", "x":9.75, "y":3.25}, {"label":":", "x":10.75, "y":3.25}, {"label":"\"", "x":11.75, "y":3.25}, {"label":"Enter", "x":12.75, "y":3.25, "w":2.25}, {"label":"4", "x":16.5, "y":3.25}, {"label":"5", "x":17.5, "y":3.25}, {"label":"6", "x":18.5, "y":3.25}, {"x":19.5, "y":3.25}, {"label":"Shift", "x":0, "y":4.25, "w":1.25}, {"label":"ISO \\", "x":1.25, "y":4.25}, {"label":"Z", "x":2.25, "y":4.25}, {"label":"X", "x":3.25, "y":4.25}, {"label":"C", "x":4.25, "y":4.25}, {"label":"V", "x":5.25, "y":4.25}, {"label":"B", "x":6.25, "y":4.25}, {"label":"N", "x":7.25, "y":4.25}, {"label":"M", "x":8.25, "y":4.25}, {"label":"<", "x":9.25, "y":4.25}, {"label":">", "x":10.25, "y":4.25}, {"label":"?", "x":11.25, "y":4.25}, {"label":"Shift", "x":12.25, "y":4.25, "w":1.75}, {"x":14, "y":4.25}, {"label":"\u2191", "x":15.25, "y":4.5}, {"label":"1", "x":16.5, "y":4.25}, {"label":"2", "x":17.5, "y":4.25}, {"label":"3", "x":18.5, "y":4.25}, {"label":"Enter", "x":19.5, "y":4.25}, {"label":"Ctrl", "x":0, "y":5.25, "w":1.5}, {"label":"Win", "x":1.5, "y":5.25}, {"label":"Alt", "x":2.5, "y":5.25, "w":1.5}, {"x":4, "y":5.25, "w":6.25}, {"label":"Alt", "x":10.25, "y":5.25, "w":1.25}, {"x":11.5, "y":5.25, "w":1.25}, {"label":"Ctrl", "x":12.75, "y":5.25, "w":1.25}, {"label":"\u2190", "x":14.25, "y":5.5}, {"label":"\u2193", "x":15.25, "y":5.5}, {"label":"\u2192", "x":16.25, "y":5.5}, {"label":"0", "x":17.5, "y":5.25}, {"label":".", "x":18.5, "y":5.25}, {"x":19.5, "y":5.25}] }, "LAYOUT": { - "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"F1", "x":2, "y":0}, {"label":"F2", "x":3, "y":0}, {"label":"F3", "x":4, "y":0}, {"label":"F4", "x":5, "y":0}, {"label":"F5", "x":6.5, "y":0}, {"label":"F6", "x":7.5, "y":0}, {"label":"F7", "x":8.5, "y":0}, {"label":"F8", "x":9.5, "y":0}, {"label":"F9", "x":11, "y":0}, {"label":"F10", "x":12, "y":0}, {"label":"F11", "x":13, "y":0}, {"label":"F12", "x":14, "y":0}, {"x":15.25, "y":0}, {"label":"PrtSc", "x":16.5, "y":0}, {"label":"Scroll Lock", "x":17.5, "y":0}, {"label":"Pause", "x":18.5, "y":0}, {"x":19.5, "y":0}, {"label":"~", "x":0, "y":1.25}, {"label":"!", "x":1, "y":1.25}, {"label":"@", "x":2, "y":1.25}, {"label":"#", "x":3, "y":1.25}, {"label":"$", "x":4, "y":1.25}, {"label":"%", "x":5, "y":1.25}, {"label":"^", "x":6, "y":1.25}, {"label":"&", "x":7, "y":1.25}, {"label":"*", "x":8, "y":1.25}, {"label":"(", "x":9, "y":1.25}, {"label":")", "x":10, "y":1.25}, {"label":"_", "x":11, "y":1.25}, {"label":"+", "x":12, "y":1.25}, {"label":"Backspace", "x":13, "y":1.25, "w":2}, {"label":"Insert", "x":15.25, "y":1.25}, {"label":"Num Lock", "x":16.5, "y":1.25}, {"label":"/", "x":17.5, "y":1.25}, {"label":"*", "x":18.5, "y":1.25}, {"label":"-", "x":19.5, "y":1.25}, {"label":"Tab", "x":0, "y":2.25, "w":1.5}, {"label":"Q", "x":1.5, "y":2.25}, {"label":"W", "x":2.5, "y":2.25}, {"label":"E", "x":3.5, "y":2.25}, {"label":"R", "x":4.5, "y":2.25}, {"label":"T", "x":5.5, "y":2.25}, {"label":"Y", "x":6.5, "y":2.25}, {"label":"U", "x":7.5, "y":2.25}, {"label":"I", "x":8.5, "y":2.25}, {"label":"O", "x":9.5, "y":2.25}, {"label":"P", "x":10.5, "y":2.25}, {"label":"{", "x":11.5, "y":2.25}, {"label":"}", "x":12.5, "y":2.25}, {"label":"|", "x":13.5, "y":2.25, "w":1.5}, {"label":"Delete", "x":15.25, "y":2.25}, {"label":"7", "x":16.5, "y":2.25}, {"label":"8", "x":17.5, "y":2.25}, {"label":"9", "x":18.5, "y":2.25}, {"label":"+", "x":19.5, "y":2.25, "h":2}, {"label":"Caps Lock", "x":0, "y":3.25, "w":1.75}, {"label":"A", "x":1.75, "y":3.25}, {"label":"S", "x":2.75, "y":3.25}, {"label":"D", "x":3.75, "y":3.25}, {"label":"F", "x":4.75, "y":3.25}, {"label":"G", "x":5.75, "y":3.25}, {"label":"H", "x":6.75, "y":3.25}, {"label":"J", "x":7.75, "y":3.25}, {"label":"K", "x":8.75, "y":3.25}, {"label":"L", "x":9.75, "y":3.25}, {"label":":", "x":10.75, "y":3.25}, {"label":"\"", "x":11.75, "y":3.25}, {"label":"Enter", "x":12.75, "y":3.25, "w":2.25}, {"label":"4", "x":16.5, "y":3.25}, {"label":"5", "x":17.5, "y":3.25}, {"label":"6", "x":18.5, "y":3.25}, {"label":"Shift", "x":0, "y":4.25, "w":2.25}, {"label":"Z", "x":2.25, "y":4.25}, {"label":"X", "x":3.25, "y":4.25}, {"label":"C", "x":4.25, "y":4.25}, {"label":"V", "x":5.25, "y":4.25}, {"label":"B", "x":6.25, "y":4.25}, {"label":"N", "x":7.25, "y":4.25}, {"label":"M", "x":8.25, "y":4.25}, {"label":"<", "x":9.25, "y":4.25}, {"label":">", "x":10.25, "y":4.25}, {"label":"?", "x":11.25, "y":4.25}, {"label":"Shift", "x":12.25, "y":4.25, "w":2.75}, {"label":"1", "x":16.5, "y":4.25}, {"label":"2", "x":17.5, "y":4.25}, {"label":"3", "x":18.5, "y":4.25}, {"label":"Enter", "x":19.5, "y":4.25, "h":2}, {"label":"\u2191", "x":15.25, "y":4.5}, {"label":"Ctrl", "x":0, "y":5.25, "w":1.5}, {"label":"Win", "x":1.5, "y":5.25}, {"label":"Alt", "x":2.5, "y":5.25, "w":1.5}, {"x":4, "y":5.25, "w":7}, {"label":"Alt", "x":11, "y":5.25, "w":1.5}, {"label":"Menu", "x":12.5, "y":5.25, "w":1.5}, {"label":"0", "x":17.5, "y":5.25}, {"label":".", "x":18.5, "y":5.25}, {"label":"\u2190", "x":14.25, "y":5.5}, {"label":"\u2193", "x":15.25, "y":5.5}, {"label":"\u2192", "x":16.25, "y":5.5}] + "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"F1", "x":2, "y":0}, {"label":"F2", "x":3, "y":0}, {"label":"F3", "x":4, "y":0}, {"label":"F4", "x":5, "y":0}, {"label":"F5", "x":6.5, "y":0}, {"label":"F6", "x":7.5, "y":0}, {"label":"F7", "x":8.5, "y":0}, {"label":"F8", "x":9.5, "y":0}, {"label":"F9", "x":11, "y":0}, {"label":"F10", "x":12, "y":0}, {"label":"F11", "x":13, "y":0}, {"label":"F12", "x":14, "y":0}, {"x":15.25, "y":0}, {"label":"PrtSc", "x":16.5, "y":0}, {"label":"Scroll Lock", "x":17.5, "y":0}, {"label":"Pause", "x":18.5, "y":0}, {"x":19.5, "y":0}, {"label":"~", "x":0, "y":1.25}, {"label":"!", "x":1, "y":1.25}, {"label":"@", "x":2, "y":1.25}, {"label":"#", "x":3, "y":1.25}, {"label":"$", "x":4, "y":1.25}, {"label":"%", "x":5, "y":1.25}, {"label":"^", "x":6, "y":1.25}, {"label":"&", "x":7, "y":1.25}, {"label":"*", "x":8, "y":1.25}, {"label":"(", "x":9, "y":1.25}, {"label":")", "x":10, "y":1.25}, {"label":"_", "x":11, "y":1.25}, {"label":"+", "x":12, "y":1.25}, {"label":"Backspace", "x":13, "y":1.25, "w":2}, {"label":"Insert", "x":15.25, "y":1.25}, {"label":"Num Lock", "x":16.5, "y":1.25}, {"label":"/", "x":17.5, "y":1.25}, {"label":"*", "x":18.5, "y":1.25}, {"label":"-", "x":19.5, "y":1.25}, {"label":"Tab", "x":0, "y":2.25, "w":1.5}, {"label":"Q", "x":1.5, "y":2.25}, {"label":"W", "x":2.5, "y":2.25}, {"label":"E", "x":3.5, "y":2.25}, {"label":"R", "x":4.5, "y":2.25}, {"label":"T", "x":5.5, "y":2.25}, {"label":"Y", "x":6.5, "y":2.25}, {"label":"U", "x":7.5, "y":2.25}, {"label":"I", "x":8.5, "y":2.25}, {"label":"O", "x":9.5, "y":2.25}, {"label":"P", "x":10.5, "y":2.25}, {"label":"{", "x":11.5, "y":2.25}, {"label":"}", "x":12.5, "y":2.25}, {"label":"|", "x":13.5, "y":2.25, "w":1.5}, {"label":"Delete", "x":15.25, "y":2.25}, {"label":"7", "x":16.5, "y":2.25}, {"label":"8", "x":17.5, "y":2.25}, {"label":"9", "x":18.5, "y":2.25}, {"label":"+", "x":19.5, "y":2.25, "h":2}, {"label":"Caps Lock", "x":0, "y":3.25, "w":1.75}, {"label":"A", "x":1.75, "y":3.25}, {"label":"S", "x":2.75, "y":3.25}, {"label":"D", "x":3.75, "y":3.25}, {"label":"F", "x":4.75, "y":3.25}, {"label":"G", "x":5.75, "y":3.25}, {"label":"H", "x":6.75, "y":3.25}, {"label":"J", "x":7.75, "y":3.25}, {"label":"K", "x":8.75, "y":3.25}, {"label":"L", "x":9.75, "y":3.25}, {"label":":", "x":10.75, "y":3.25}, {"label":"\"", "x":11.75, "y":3.25}, {"label":"Enter", "x":12.75, "y":3.25, "w":2.25}, {"label":"4", "x":16.5, "y":3.25}, {"label":"5", "x":17.5, "y":3.25}, {"label":"6", "x":18.5, "y":3.25}, {"label":"Shift", "x":0, "y":4.25, "w":2.25}, {"label":"Z", "x":2.25, "y":4.25}, {"label":"X", "x":3.25, "y":4.25}, {"label":"C", "x":4.25, "y":4.25}, {"label":"V", "x":5.25, "y":4.25}, {"label":"B", "x":6.25, "y":4.25}, {"label":"N", "x":7.25, "y":4.25}, {"label":"M", "x":8.25, "y":4.25}, {"label":"<", "x":9.25, "y":4.25}, {"label":">", "x":10.25, "y":4.25}, {"label":"?", "x":11.25, "y":4.25}, {"label":"Shift", "x":12.25, "y":4.25, "w":2.75}, {"label":"\u2191", "x":15.25, "y":4.5}, {"label":"1", "x":16.5, "y":4.25}, {"label":"2", "x":17.5, "y":4.25}, {"label":"3", "x":18.5, "y":4.25}, {"label":"Enter", "x":19.5, "y":4.25, "h":2}, {"label":"Ctrl", "x":0, "y":5.25, "w":1.5}, {"label":"Win", "x":1.5, "y":5.25}, {"label":"Alt", "x":2.5, "y":5.25, "w":1.5}, {"x":4, "y":5.25, "w":7}, {"label":"Alt", "x":11, "y":5.25, "w":1.5}, {"label":"Ctrl", "x":12.5, "y":5.25, "w":1.5}, {"label":"\u2190", "x":14.25, "y":5.5}, {"label":"\u2193", "x":15.25, "y":5.5}, {"label":"\u2192", "x":16.25, "y":5.5}, {"label":"0", "x":17.5, "y":5.25}, {"label":".", "x":18.5, "y":5.25}] } } -} \ No newline at end of file +} From f1612b7fa19995064ad107f447932a416dbfe09b Mon Sep 17 00:00:00 2001 From: Erovia Date: Thu, 13 Sep 2018 18:07:21 +0200 Subject: [PATCH 083/788] Keymap: Add Contra keymap with QWERTY and COLEMAK Mod-DH (#3883) * Add own personal Contra layout * Enable auto-shifting * Enable tap dancing and implement Space Cadet-like shift with LSHIFT and ENTER * Implement Colemak Mod-DH layout, clean up Adjust layer * Implement keyboard and keymap refactor More info: https://github.com/qmk/qmk_firmware/pull/3191 * Update the readme.md and keymap.c files for Colemak * Add include guard, make layout description cleaner --- keyboards/contra/keymaps/erovia/config.h | 7 + keyboards/contra/keymaps/erovia/keymap.c | 163 ++++++++++++++++++++++ keyboards/contra/keymaps/erovia/readme.md | 76 ++++++++++ keyboards/contra/keymaps/erovia/rules.mk | 2 + 4 files changed, 248 insertions(+) create mode 100644 keyboards/contra/keymaps/erovia/config.h create mode 100644 keyboards/contra/keymaps/erovia/keymap.c create mode 100644 keyboards/contra/keymaps/erovia/readme.md create mode 100755 keyboards/contra/keymaps/erovia/rules.mk diff --git a/keyboards/contra/keymaps/erovia/config.h b/keyboards/contra/keymaps/erovia/config.h new file mode 100644 index 000000000..11d6a2c1a --- /dev/null +++ b/keyboards/contra/keymaps/erovia/config.h @@ -0,0 +1,7 @@ +#pragma once + +#define AUTO_SHIFT_TIMEOUT 150 +#define NO_AUTO_SHIFT_SPECIAL +#define NO_AUTO_SHIFT_NUMERIC + +#define TAPPING_TERM 200 diff --git a/keyboards/contra/keymaps/erovia/keymap.c b/keyboards/contra/keymaps/erovia/keymap.c new file mode 100644 index 000000000..9b72e5733 --- /dev/null +++ b/keyboards/contra/keymaps/erovia/keymap.c @@ -0,0 +1,163 @@ +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +enum planck_layers { + _QWERTY, + _COLEMAK, + _LOWER, + _RAISE, + _ADJUST +}; + +enum planck_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + LOWER, + RAISE +}; + +enum { + TD_SPACE_CADET_SHIFT = 0, + TD_SPACE_CADET_ENTER = 1 +}; + +qk_tap_dance_action_t tap_dance_actions[] = { + [TD_SPACE_CADET_SHIFT] = ACTION_TAP_DANCE_DOUBLE(KC_LSFT, KC_LPRN), + [TD_SPACE_CADET_ENTER] = ACTION_TAP_DANCE_DOUBLE(KC_ENT, KC_RPRN) +}; + +#define TD_SHFT TD(TD_SPACE_CADET_SHIFT) +#define TD_ENTR TD(TD_SPACE_CADET_ENTER) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | ` | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | S | D | F | G | H | J | K | L | ; | ' | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Ctrl | GUI | Alt | GUI |Lower | Tab |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = LAYOUT_ortho_4x12( + KC_GRV, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + TD_SHFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, TD_ENTR, + KC_LCTL, KC_LGUI, KC_LALT, KC_LGUI, LOWER, KC_TAB, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT +), + +/* Colemak + * ,-----------------------------------------------------------------------------------. + * | ` | Q | W | F | P | B | J | L | U | Y | ; | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Ctrl | A | R | S | T | G | M | N | E | I | O | ' | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | D | V | K | H | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Ctrl | GUI | Alt | GUI |Lower | Tab |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_COLEMAK] = LAYOUT_ortho_4x12( + KC_GRV, KC_Q, KC_W, KC_F, KC_P, KC_B, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, + KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_G, KC_M, KC_N, KC_E, KC_I, KC_O, KC_QUOT, + TD(TD_SPACE_CADET_SHIFT), KC_Z, KC_X, KC_C, KC_D, KC_V, KC_K, KC_H, KC_COMM, KC_DOT, KC_SLSH, TD(TD_SPACE_CADET_ENTER), + KC_LCTL, KC_LGUI, KC_LALT, KC_LGUI, LOWER, KC_TAB, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT +), + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | Home | End | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT_ortho_4x12( + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_NUHS), S(KC_NUBS), KC_HOME, KC_END, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY +), + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / |Pg Up |Pg Dn | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Prev | Vol- | Mute | Stop | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT_ortho_4x12( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MUTE, KC_MSTP +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | | | | | | | | | | | | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | | | | | |Qwerty|Colemk| | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | AuSh | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = LAYOUT_ortho_4x12( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, QWERTY, COLEMAK, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_ASTG +) + +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + set_single_persistent_default_layer(_COLEMAK); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + } + return true; +} diff --git a/keyboards/contra/keymaps/erovia/readme.md b/keyboards/contra/keymaps/erovia/readme.md new file mode 100644 index 000000000..34cbdf0a1 --- /dev/null +++ b/keyboards/contra/keymaps/erovia/readme.md @@ -0,0 +1,76 @@ +# Erovia's Contra Keymap + +My personal Contra keymap based on the *basic* keymap. + +**Features** + +* Qwerty and Colemak Mod-DH support +* autoshifting +* double tap LSHIFT and ENTER for quick access to ( and ) + +## QWERTY (Normal) Layer +``` +,-----------------------------------------------------------------------------------. +| ` | Q | W | E | R | T | Y | U | I | O | P | Bksp | +|------+------+------+------+------+-------------+------+------+------+------+------| +| Esc | A | S | D | F | G | H | J | K | L | ; | ' | +|------+------+------+------+------+------|------+------+------+------+------+------| +| Shift| Z | X | C | V | B | N | M | , | . | / |Enter | +|------+------+------+------+------+------+------+------+------+------+------+------| +| Ctrl | GUI | Alt | GUI |Lower | Tab |Space |Raise | Left | Down | Up |Right | +`-----------------------------------------------------------------------------------' +``` + +## Colemak Layer +Switch from `Adjust` layer. +``` +,-----------------------------------------------------------------------------------. +| ` | Q | W | F | P | B | J | L | U | Y | ; | Bksp | +|------+------+------+------+------+-------------+------+------+------+------+------| +| Ctrl | A | R | S | T | G | M | N | E | I | O | ' | +|------+------+------+------+------+------|------+------+------+------+------+------| +| Shift| Z | X | C | D | V | K | H | , | . | / |Enter | +|------+------+------+------+------+------+------+------+------+------+------+------| +| Ctrl | GUI | Alt | GUI |Lower | Tab |Space |Raise | Left | Down | Up |Right | +`-----------------------------------------------------------------------------------' +``` + +## Lower +``` +,-----------------------------------------------------------------------------------. +| ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | +|------+------+------+------+------+-------------+------+------+------+------+------| +| Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | +|------+------+------+------+------+------|------+------+------+------+------+------| +| | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | Home | End | | +|------+------+------+------+------+------+------+------+------+------+------+------| +| | | | | | | | Next | Vol- | Vol+ | Play | +`-----------------------------------------------------------------------------------' +``` + +## Raise +``` +,-----------------------------------------------------------------------------------. +| ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | +|------+------+------+------+------+-------------+------+------+------+------+------| +| Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | +|------+------+------+------+------+------|------+------+------+------+------+------| +| | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / |Pg Up |Pg Dn | | +|------+------+------+------+------+------+------+------+------+------+------+------| +| | | | | | | | Prev | Vol- | Mute | Stop | +`-----------------------------------------------------------------------------------' +``` + +## Adjust +`AuSh` toggles autoshifting. +``` +,-----------------------------------------------------------------------------------. +| | | | | | | | | | | | | +|------+------+------+------+------+-------------+------+------+------+------+------| +| | | | | | | |Qwerty|Colemk| | | | +|------+------+------+------+------+------|------+------+------+------+------+------| +| | | | | | | | | | | | | +|------+------+------+------+------+------+------+------+------+------+------+------| +| | | | | | | | | | | AuSh | +`-----------------------------------------------------------------------------------' +``` diff --git a/keyboards/contra/keymaps/erovia/rules.mk b/keyboards/contra/keymaps/erovia/rules.mk new file mode 100755 index 000000000..97999d9cb --- /dev/null +++ b/keyboards/contra/keymaps/erovia/rules.mk @@ -0,0 +1,2 @@ +AUTO_SHIFT_ENABLE = yes +TAP_DANCE_ENABLE = yes From 87faf55b012bb33265801e9fecae105a23c2d57e Mon Sep 17 00:00:00 2001 From: lucwastiaux Date: Fri, 14 Sep 2018 00:12:03 +0800 Subject: [PATCH 084/788] Keymap: Cleanups on the ergodox EZ / atreus dvorak 42 key layouts (#3887) * add SCREEN_NAV layer for copy/pasting within screen * working readreg/paste macros * working read reg / paste macros * write log and tran patterns, and expand * add ls -la shortcut, add tab on combined layer * put delete word on the right pinky key on shell_nav layer * add TAB on the right side, add reset key * added Cloud9 macros * add cloud9 shortcuts to atreus layout * added BROWSER_CONTROL layer * finalized browser control layer * adding comment * add browser control layer to atreus * add flashing command line * remove the tab on combined layer * remove the tomouse * remove mouse layer, change log/tran expand patterns, cleanups * add dumptlog macro * add "delete to home" shortcut * fix conflict * remove unneeded mouse layer * add meh shortcuts on the browser_control layer * add/modify some macros * explain the various layers * putty paste is right mouse button --- keyboards/ergodox_ez/keymaps/dvorak_42_key/keymap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/ergodox_ez/keymaps/dvorak_42_key/keymap.c b/keyboards/ergodox_ez/keymaps/dvorak_42_key/keymap.c index 94d035c6b..dd5ee2897 100644 --- a/keyboards/ergodox_ez/keymaps/dvorak_42_key/keymap.c +++ b/keyboards/ergodox_ez/keymaps/dvorak_42_key/keymap.c @@ -230,7 +230,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, SHELL_EXPAND_OE_TRANPATTERN, RCTL(KC_L), RCTL(KC_W), KC_HOME, KC_UP, KC_END, KC_TRNS, SHELL_EXPAND_OE_LOGPATTERN, LALT(KC_B), KC_LEFT, KC_DOWN, KC_RIGHT, LALT(KC_F), RCTL(KC_W), - RCTL(KC_C), RCTL(KC_U), LALT(KC_DOT), RCTL(KC_R), MEH(KC_V), RCTL(KC_K), SHELL_DUMPTLOG, + RCTL(KC_C), RCTL(KC_U), LALT(KC_DOT), RCTL(KC_R), KC_BTN2, RCTL(KC_K), SHELL_DUMPTLOG, // bottom row (match functionality of base layer) KC_BSPC, RCTL(KC_W), KC_DELETE, LALT(KC_D), RCTL(KC_U), // thumb cluster From 132c44bab132c63fa7994e0801e0ca37f53bd792 Mon Sep 17 00:00:00 2001 From: Stephen Tudor Date: Thu, 13 Sep 2018 12:16:39 -0400 Subject: [PATCH 085/788] Keymap: Fix Dvorak mapping for left/right brace (#3889) --- keyboards/tkc1800/keymaps/smt/keymap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/tkc1800/keymaps/smt/keymap.c b/keyboards/tkc1800/keymaps/smt/keymap.c index ffaaef297..6683416e3 100644 --- a/keyboards/tkc1800/keymaps/smt/keymap.c +++ b/keyboards/tkc1800/keymaps/smt/keymap.c @@ -117,7 +117,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [DVORAK] = LAYOUT( KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_HOME, KC_PGUP, KC_PSCR, \ KC_DEL, KC_END, KC_PGDN, KC_SLCK, \ - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, KC_NLCK, KC_PSLS, KC_PAST, KC_PAUS, \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, KC_RBRC, KC_BSLS, KC_GRV, KC_NLCK, KC_PSLS, KC_PAST, KC_PAUS, \ HPR_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, KC_EQL, KC_BSPC, KC_P7, KC_P8, KC_P9, KC_PMNS, \ CTL_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, XXXXXX, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS, \ KC_LSFT, XXXXXX, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, SFT_ENT, KC_UP, KC_P1, KC_P2, KC_P3, XXXXXX, \ From b8a0d3de3dcd39558195a8a201e859a0d4ef924d Mon Sep 17 00:00:00 2001 From: patrickmt <40182064+patrickmt@users.noreply.github.com> Date: Thu, 13 Sep 2018 12:17:26 -0400 Subject: [PATCH 086/788] Keyboard: ALT keymap update and LED driver brightness mismatch fix (#3890) * ALT keymap update Added additional End key on layer 1 to match key cap * LED driver update addressing PR #3871 Update sync between IS31FL3733 drivers is causing varying behavior in keyboards including brightness mismatch and slight flicker at very low rgb values. Visually, disabling sync is not noticeable. Ref PR #3871 by guarnacciaa. --- keyboards/massdrop/alt/keymaps/default/keymap.c | 2 +- keyboards/massdrop/alt/keymaps/mac/keymap.c | 2 +- tmk_core/protocol/arm_atsam/i2c_master.c | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/keyboards/massdrop/alt/keymaps/default/keymap.c b/keyboards/massdrop/alt/keymaps/default/keymap.c index 9d8387bb7..0cbce8629 100644 --- a/keyboards/massdrop/alt/keymaps/default/keymap.c +++ b/keyboards/massdrop/alt/keymaps/default/keymap.c @@ -36,7 +36,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT( KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_MUTE, \ - L_T_BR, L_PSD, L_BRI, L_PSI, KC_TRNS, KC_TRNS, KC_TRNS, U_T_AUTO,U_T_AGCR,KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, \ + L_T_BR, L_PSD, L_BRI, L_PSI, KC_TRNS, KC_TRNS, KC_TRNS, U_T_AUTO,U_T_AGCR,KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, KC_END, \ L_T_PTD, L_PTP, L_BRD, L_PTN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, \ KC_TRNS, L_T_MD, L_T_ONF, KC_TRNS, KC_TRNS, MD_BOOT, TG_NKRO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_VOLD, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGDN, KC_END \ diff --git a/keyboards/massdrop/alt/keymaps/mac/keymap.c b/keyboards/massdrop/alt/keymaps/mac/keymap.c index a8adbd3c8..e886290e7 100644 --- a/keyboards/massdrop/alt/keymaps/mac/keymap.c +++ b/keyboards/massdrop/alt/keymaps/mac/keymap.c @@ -36,7 +36,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT( KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_MUTE, \ - L_T_BR, L_PSD, L_BRI, L_PSI, KC_TRNS, KC_TRNS, KC_TRNS, U_T_AUTO,U_T_AGCR,KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, \ + L_T_BR, L_PSD, L_BRI, L_PSI, KC_TRNS, KC_TRNS, KC_TRNS, U_T_AUTO,U_T_AGCR,KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, KC_END, \ L_T_PTD, L_PTP, L_BRD, L_PTN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, \ KC_TRNS, L_T_MD, L_T_ONF, KC_TRNS, KC_TRNS, MD_BOOT, TG_NKRO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_VOLD, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGDN, KC_END \ diff --git a/tmk_core/protocol/arm_atsam/i2c_master.c b/tmk_core/protocol/arm_atsam/i2c_master.c index bbe909e9b..4f5a79e89 100644 --- a/tmk_core/protocol/arm_atsam/i2c_master.c +++ b/tmk_core/protocol/arm_atsam/i2c_master.c @@ -289,12 +289,12 @@ uint8_t I2C3733_Init_Drivers(void) //Set up master device i2c_led_send_CRWL(0); i2c_led_select_page(0, 3); - i2c_led_send_mode_op_gcr(0, ISSI3733_CR_SYNC_MASTER, ISSI3733_CR_SSD_NORMAL); + i2c_led_send_mode_op_gcr(0, 0, ISSI3733_CR_SSD_NORMAL); //No SYNC due to brightness mismatch with second driver //Set up slave device i2c_led_send_CRWL(1); i2c_led_select_page(1, 3); - i2c_led_send_mode_op_gcr(1, ISSI3733_CR_SYNC_SLAVE, ISSI3733_CR_SSD_NORMAL); + i2c_led_send_mode_op_gcr(1, 0, ISSI3733_CR_SSD_NORMAL); //No SYNC due to brightness mismatch with first driver and slight flicker at rgb values 1,2 i2c_led_send_CRWL(0); i2c_led_select_page(0, 3); From 7ff4faf3be32675b8f57af81b22593df286a3bc9 Mon Sep 17 00:00:00 2001 From: blindassassin111 <38090555+blindassassin111@users.noreply.github.com> Date: Thu, 13 Sep 2018 11:19:37 -0500 Subject: [PATCH 087/788] Keyboard: Fixing Omnikey lock light issue (#3891) --- keyboards/omnikey_blackheart/keymaps/default/keymap.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/keyboards/omnikey_blackheart/keymaps/default/keymap.c b/keyboards/omnikey_blackheart/keymaps/default/keymap.c index 331621870..e4865adde 100644 --- a/keyboards/omnikey_blackheart/keymaps/default/keymap.c +++ b/keyboards/omnikey_blackheart/keymaps/default/keymap.c @@ -1,9 +1,5 @@ #include QMK_KEYBOARD_H -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT(\ @@ -26,7 +22,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), }; -void led_set_kb(uint8_t usb_led) { +void led_set_user(uint8_t usb_led) { DDRB |= (1 << 4) | (1 << 5) | (1 << 6); if (usb_led & (1 << USB_LED_NUM_LOCK)) { @@ -46,4 +42,4 @@ void led_set_kb(uint8_t usb_led) { } else { PORTB &= ~(1 << 6); } -} \ No newline at end of file +} From cd3518b802071a915ff11659a32bf0a124687ea3 Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Thu, 13 Sep 2018 09:21:02 -0700 Subject: [PATCH 088/788] Keyboard: Reorganize Alf keyboards into Alf Directory (#3892) * rename alf_x2 to alf * rename to x2 * rename dependencies * Fix readme * moved x2 into alf directory * update readme for make instructions * move dc60 to alf directory * update dc60 readme for make instructions * change readme txt as per noroadsleft PR comment --- keyboards/{ => alf}/dc60/config.h | 0 keyboards/{ => alf}/dc60/dc60.c | 0 keyboards/{ => alf}/dc60/dc60.h | 0 keyboards/{ => alf}/dc60/info.json | 0 keyboards/{ => alf}/dc60/keymaps/default/config.h | 0 keyboards/{ => alf}/dc60/keymaps/default/keymap.c | 0 .../{ => alf}/dc60/keymaps/default/readme.md | 0 keyboards/{ => alf}/dc60/readme.md | 4 ++-- keyboards/{ => alf}/dc60/rules.mk | 0 keyboards/{alf_x2 => alf/x2}/config.h | 0 keyboards/{alf_x2 => alf/x2}/info.json | 0 .../{alf_x2 => alf/x2}/keymaps/default/keymap.c | 0 .../{alf_x2 => alf/x2}/keymaps/hhkb_60/keymap.c | 0 keyboards/alf/x2/readme.md | 15 +++++++++++++++ keyboards/{alf_x2 => alf/x2}/rules.mk | 0 keyboards/alf/x2/x2.c | 1 + keyboards/{alf_x2/alf_x2.h => alf/x2/x2.h} | 6 +++--- keyboards/alf_x2/alf_x2.c | 1 - keyboards/alf_x2/readme.md | 15 --------------- 19 files changed, 21 insertions(+), 21 deletions(-) rename keyboards/{ => alf}/dc60/config.h (100%) rename keyboards/{ => alf}/dc60/dc60.c (100%) rename keyboards/{ => alf}/dc60/dc60.h (100%) rename keyboards/{ => alf}/dc60/info.json (100%) rename keyboards/{ => alf}/dc60/keymaps/default/config.h (100%) rename keyboards/{ => alf}/dc60/keymaps/default/keymap.c (100%) rename keyboards/{ => alf}/dc60/keymaps/default/readme.md (100%) rename keyboards/{ => alf}/dc60/readme.md (53%) rename keyboards/{ => alf}/dc60/rules.mk (100%) rename keyboards/{alf_x2 => alf/x2}/config.h (100%) rename keyboards/{alf_x2 => alf/x2}/info.json (100%) rename keyboards/{alf_x2 => alf/x2}/keymaps/default/keymap.c (100%) rename keyboards/{alf_x2 => alf/x2}/keymaps/hhkb_60/keymap.c (100%) create mode 100644 keyboards/alf/x2/readme.md rename keyboards/{alf_x2 => alf/x2}/rules.mk (100%) create mode 100644 keyboards/alf/x2/x2.c rename keyboards/{alf_x2/alf_x2.h => alf/x2/x2.h} (99%) delete mode 100644 keyboards/alf_x2/alf_x2.c delete mode 100644 keyboards/alf_x2/readme.md diff --git a/keyboards/dc60/config.h b/keyboards/alf/dc60/config.h similarity index 100% rename from keyboards/dc60/config.h rename to keyboards/alf/dc60/config.h diff --git a/keyboards/dc60/dc60.c b/keyboards/alf/dc60/dc60.c similarity index 100% rename from keyboards/dc60/dc60.c rename to keyboards/alf/dc60/dc60.c diff --git a/keyboards/dc60/dc60.h b/keyboards/alf/dc60/dc60.h similarity index 100% rename from keyboards/dc60/dc60.h rename to keyboards/alf/dc60/dc60.h diff --git a/keyboards/dc60/info.json b/keyboards/alf/dc60/info.json similarity index 100% rename from keyboards/dc60/info.json rename to keyboards/alf/dc60/info.json diff --git a/keyboards/dc60/keymaps/default/config.h b/keyboards/alf/dc60/keymaps/default/config.h similarity index 100% rename from keyboards/dc60/keymaps/default/config.h rename to keyboards/alf/dc60/keymaps/default/config.h diff --git a/keyboards/dc60/keymaps/default/keymap.c b/keyboards/alf/dc60/keymaps/default/keymap.c similarity index 100% rename from keyboards/dc60/keymaps/default/keymap.c rename to keyboards/alf/dc60/keymaps/default/keymap.c diff --git a/keyboards/dc60/keymaps/default/readme.md b/keyboards/alf/dc60/keymaps/default/readme.md similarity index 100% rename from keyboards/dc60/keymaps/default/readme.md rename to keyboards/alf/dc60/keymaps/default/readme.md diff --git a/keyboards/dc60/readme.md b/keyboards/alf/dc60/readme.md similarity index 53% rename from keyboards/dc60/readme.md rename to keyboards/alf/dc60/readme.md index 9d7014319..d8e20a8f4 100644 --- a/keyboards/dc60/readme.md +++ b/keyboards/alf/dc60/readme.md @@ -10,6 +10,6 @@ Hardware Availability: [Geekhack GB](https://geekhack.org/index.php?topic=96616. Make example for this keyboard (after setting up your build environment): - make dc60:default + make alf/dc60:default -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. +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). diff --git a/keyboards/dc60/rules.mk b/keyboards/alf/dc60/rules.mk similarity index 100% rename from keyboards/dc60/rules.mk rename to keyboards/alf/dc60/rules.mk diff --git a/keyboards/alf_x2/config.h b/keyboards/alf/x2/config.h similarity index 100% rename from keyboards/alf_x2/config.h rename to keyboards/alf/x2/config.h diff --git a/keyboards/alf_x2/info.json b/keyboards/alf/x2/info.json similarity index 100% rename from keyboards/alf_x2/info.json rename to keyboards/alf/x2/info.json diff --git a/keyboards/alf_x2/keymaps/default/keymap.c b/keyboards/alf/x2/keymaps/default/keymap.c similarity index 100% rename from keyboards/alf_x2/keymaps/default/keymap.c rename to keyboards/alf/x2/keymaps/default/keymap.c diff --git a/keyboards/alf_x2/keymaps/hhkb_60/keymap.c b/keyboards/alf/x2/keymaps/hhkb_60/keymap.c similarity index 100% rename from keyboards/alf_x2/keymaps/hhkb_60/keymap.c rename to keyboards/alf/x2/keymaps/hhkb_60/keymap.c diff --git a/keyboards/alf/x2/readme.md b/keyboards/alf/x2/readme.md new file mode 100644 index 000000000..b171b5c79 --- /dev/null +++ b/keyboards/alf/x2/readme.md @@ -0,0 +1,15 @@ +# X2 + +![x2](https://cdn.shopify.com/s/files/1/1674/0405/products/1_088c2862-1f68-4fdd-a346-965208c3a3de_1024x1024.png?v=1511296076) + +A customizable 60% keyboard. + +Keyboard Maintainer: QMK Community +Hardware Supported: ALF X2 60% +Hardware Availability: [zFrontier](https://en.zfrontier.com/products/group-buy-alf-x2-60) + +Make example for this keyboard (after setting up your build environment): + + make alf/x2:default + +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). diff --git a/keyboards/alf_x2/rules.mk b/keyboards/alf/x2/rules.mk similarity index 100% rename from keyboards/alf_x2/rules.mk rename to keyboards/alf/x2/rules.mk diff --git a/keyboards/alf/x2/x2.c b/keyboards/alf/x2/x2.c new file mode 100644 index 000000000..111712f0b --- /dev/null +++ b/keyboards/alf/x2/x2.c @@ -0,0 +1 @@ +#include "x2.h" diff --git a/keyboards/alf_x2/alf_x2.h b/keyboards/alf/x2/x2.h similarity index 99% rename from keyboards/alf_x2/alf_x2.h rename to keyboards/alf/x2/x2.h index 4ff20cc91..c6c587aea 100644 --- a/keyboards/alf_x2/alf_x2.h +++ b/keyboards/alf/x2/x2.h @@ -1,5 +1,5 @@ -#ifndef ALF_X2_H -#define ALF_X2_H +#ifndef X2_H +#define X2_H #include "quantum.h" @@ -95,4 +95,4 @@ { K400, K401, KC_NO, K403, K404, KC_NO, K406, KC_NO, K408, KC_NO, K410, K411, K412, K413, K414 } \ } -#endif \ No newline at end of file +#endif diff --git a/keyboards/alf_x2/alf_x2.c b/keyboards/alf_x2/alf_x2.c deleted file mode 100644 index cc22d872a..000000000 --- a/keyboards/alf_x2/alf_x2.c +++ /dev/null @@ -1 +0,0 @@ -#include "alf_x2.h" diff --git a/keyboards/alf_x2/readme.md b/keyboards/alf_x2/readme.md deleted file mode 100644 index ece339fa9..000000000 --- a/keyboards/alf_x2/readme.md +++ /dev/null @@ -1,15 +0,0 @@ -# ALF X2 - -![alf_x2](https://cdn.shopify.com/s/files/1/1674/0405/products/1_088c2862-1f68-4fdd-a346-965208c3a3de_1024x1024.png?v=1511296076) - -A customizable 60% keyboard. - -Keyboard Maintainer: QMK Community -Hardware Supported: ALF X2 60% -Hardware Availability: [zFrontier](https://en.zfrontier.com/products/group-buy-alf-x2-60) - -Make example for this keyboard (after setting up your build environment): - - make alf_x2:default - -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. From ce122c4981c71d33a85db94c787d5ec7a823acc6 Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Thu, 13 Sep 2018 09:40:43 -0700 Subject: [PATCH 089/788] Keyboard: Shuffle keyboards into thevankeyboards directory (#3895) * move tv44 to thevankeyboards directory * move bananasplit to thevankeyboards * move roadkit to thevankeyboards directory * add a basic readme * update readmes to correct the make instructions and add more help text * rename tv44 to minivan as per Jack's suggestions * update readme * rename tv44 to minivan * update tv44 to minivan * change includes for tv44 to minivan * remove extra includes --- keyboards/bananasplit/README.md | 15 --------------- keyboards/roadkit/readme.md | 14 -------------- keyboards/thevankeyboards/bananasplit/README.md | 14 ++++++++++++++ .../bananasplit/bananasplit.c | 0 .../bananasplit/bananasplit.h | 0 .../{ => thevankeyboards}/bananasplit/config.h | 0 .../{ => thevankeyboards}/bananasplit/info.json | 0 .../bananasplit/keymaps/0010/config.h | 0 .../bananasplit/keymaps/0010/keymap.c | 0 .../bananasplit/keymaps/0010/rules.mk | 0 .../bananasplit/keymaps/coloneljesus/config.h | 0 .../bananasplit/keymaps/coloneljesus/keymap.c | 0 .../bananasplit/keymaps/coloneljesus/readme.md | 0 .../bananasplit/keymaps/coloneljesus/rules.mk | 0 .../bananasplit/keymaps/default/config.h | 0 .../bananasplit/keymaps/default/keymap.c | 0 .../bananasplit/keymaps/default/readme.md | 0 .../bananasplit/keymaps/default/rules.mk | 0 .../bananasplit/keymaps/hhkbanana/keymap.c | 0 .../bananasplit/keymaps/jockyxu1122_ansi/keymap.c | 0 .../keymaps/jockyxu1122_ansi/readme.md | 0 .../bananasplit/keymaps/jockyxu1122_iso/keymap.c | 0 .../bananasplit/keymaps/jockyxu1122_iso/readme.md | 0 .../bananasplit/keymaps/kamon/config.h | 0 .../bananasplit/keymaps/kamon/keymap.c | 0 .../bananasplit/keymaps/kamon/readme.md | 0 .../bananasplit/keymaps/kamon/rules.mk | 0 .../bananasplit/keymaps/nic/keymap.c | 0 .../bananasplit/keymaps/rask/README.md | 0 .../bananasplit/keymaps/rask/keymap.c | 0 .../bananasplit/keymaps/talljoe/config.h | 0 .../bananasplit/keymaps/talljoe/keymap.c | 0 .../{ => thevankeyboards}/bananasplit/rules.mk | 0 .../{tv44 => thevankeyboards/minivan}/config.h | 6 +++--- .../{tv44 => thevankeyboards/minivan}/info.json | 0 .../minivan}/keymaps/belak/config.h | 0 .../minivan}/keymaps/belak/keymap.c | 5 +---- .../minivan}/keymaps/belak/readme.md | 0 .../minivan}/keymaps/belak/rules.mk | 0 .../minivan}/keymaps/budi/config.h | 0 .../minivan}/keymaps/budi/keymap.c | 0 .../minivan}/keymaps/budi/readme.md | 0 .../minivan}/keymaps/core/keymap.c | 4 +--- .../minivan}/keymaps/core/readme.md | 0 .../minivan}/keymaps/core/rules.mk | 0 .../minivan}/keymaps/default/config.h | 0 .../minivan}/keymaps/default/keymap.c | 4 +--- .../minivan}/keymaps/default/readme.md | 0 .../minivan}/keymaps/default/rules.mk | 0 .../minivan}/keymaps/jeebak/keymap.c | 4 +--- .../minivan}/keymaps/jeebak/readme.md | 0 .../minivan/keymaps/jeebak}/rules.mk | 0 .../minivan}/keymaps/jetpacktuxedo/config.h | 0 .../minivan}/keymaps/jetpacktuxedo/keymap.c | 2 +- .../minivan}/keymaps/jetpacktuxedo/readme.md | 0 .../minivan}/keymaps/jetpacktuxedo/rules.mk | 0 .../minivan}/keymaps/mjt/config.h | 0 .../minivan}/keymaps/mjt/keymap.c | 4 +--- .../minivan}/keymaps/mjt/readme.md | 0 .../minivan}/keymaps/mjt/rules.mk | 0 .../minivan}/keymaps/smt/keymap.c | 4 +--- .../minivan}/keymaps/smt/readme.md | 0 .../minivan/keymaps/smt}/rules.mk | 0 .../minivan}/keymaps/tong92/config.h | 0 .../minivan}/keymaps/tong92/keymap.c | 4 +--- .../minivan}/keymaps/tong92/readme.md | 0 .../minivan}/keymaps/tong92/rules.mk | 0 .../minivan/keymaps/xyverz}/config.h | 0 .../minivan}/keymaps/xyverz/keymap.c | 4 +--- .../minivan}/keymaps/xyverz/readme.md | 0 .../minivan/keymaps/xyverz}/rules.mk | 0 .../tv44.c => thevankeyboards/minivan/minivan.c} | 2 +- .../tv44.h => thevankeyboards/minivan/minivan.h} | 4 ++-- keyboards/thevankeyboards/minivan/readme.md | 13 +++++++++++++ .../{tv44 => thevankeyboards/minivan}/rules.mk | 0 keyboards/thevankeyboards/readme.md | 3 +++ keyboards/{ => thevankeyboards}/roadkit/config.h | 0 keyboards/{ => thevankeyboards}/roadkit/info.json | 0 .../roadkit/keymaps/default}/config.h | 0 .../roadkit/keymaps/default/keymap.c | 0 .../roadkit/keymaps/default/readme.md | 0 .../roadkit}/keymaps/default/rules.mk | 0 .../roadkit/keymaps/flipphone}/config.h | 0 .../roadkit/keymaps/flipphone/keymap.c | 0 .../roadkit/keymaps/flipphone/readme.md | 0 .../roadkit/keymaps/flipphone}/rules.mk | 0 .../roadkit/keymaps/khord/config.h | 0 .../roadkit/keymaps/khord/keymap.c | 0 .../roadkit/keymaps/khord/rules.mk | 0 .../roadkit/keymaps/mjt}/config.h | 0 .../roadkit/keymaps/mjt/keymap.c | 0 .../roadkit/keymaps/mjt/readme.md | 0 .../roadkit/keymaps/mjt}/rules.mk | 0 .../roadkit/keymaps/singles}/config.h | 0 .../roadkit/keymaps/singles/keymap.c | 0 .../roadkit/keymaps/singles/readme.md | 0 .../roadkit/keymaps/singles}/rules.mk | 0 .../roadkit/keymaps/singlesBrent/config.h | 0 .../roadkit/keymaps/singlesBrent/keymap.c | 0 .../roadkit/keymaps/singlesBrent/readme.md | 0 .../roadkit/keymaps/singlesBrent/rules.mk | 0 keyboards/thevankeyboards/roadkit/readme.md | 13 +++++++++++++ keyboards/{ => thevankeyboards}/roadkit/roadkit.c | 0 keyboards/{ => thevankeyboards}/roadkit/roadkit.h | 0 keyboards/{ => thevankeyboards}/roadkit/rules.mk | 0 keyboards/tv44/readme.md | 14 -------------- 106 files changed, 58 insertions(+), 75 deletions(-) delete mode 100644 keyboards/bananasplit/README.md delete mode 100644 keyboards/roadkit/readme.md create mode 100644 keyboards/thevankeyboards/bananasplit/README.md rename keyboards/{ => thevankeyboards}/bananasplit/bananasplit.c (100%) rename keyboards/{ => thevankeyboards}/bananasplit/bananasplit.h (100%) rename keyboards/{ => thevankeyboards}/bananasplit/config.h (100%) rename keyboards/{ => thevankeyboards}/bananasplit/info.json (100%) rename keyboards/{ => thevankeyboards}/bananasplit/keymaps/0010/config.h (100%) rename keyboards/{ => thevankeyboards}/bananasplit/keymaps/0010/keymap.c (100%) rename keyboards/{ => thevankeyboards}/bananasplit/keymaps/0010/rules.mk (100%) rename keyboards/{ => thevankeyboards}/bananasplit/keymaps/coloneljesus/config.h (100%) rename keyboards/{ => thevankeyboards}/bananasplit/keymaps/coloneljesus/keymap.c (100%) rename keyboards/{ => thevankeyboards}/bananasplit/keymaps/coloneljesus/readme.md (100%) rename keyboards/{ => thevankeyboards}/bananasplit/keymaps/coloneljesus/rules.mk (100%) rename keyboards/{ => thevankeyboards}/bananasplit/keymaps/default/config.h (100%) rename keyboards/{ => thevankeyboards}/bananasplit/keymaps/default/keymap.c (100%) rename keyboards/{ => thevankeyboards}/bananasplit/keymaps/default/readme.md (100%) rename keyboards/{ => thevankeyboards}/bananasplit/keymaps/default/rules.mk (100%) rename keyboards/{ => thevankeyboards}/bananasplit/keymaps/hhkbanana/keymap.c (100%) rename keyboards/{ => thevankeyboards}/bananasplit/keymaps/jockyxu1122_ansi/keymap.c (100%) rename keyboards/{ => thevankeyboards}/bananasplit/keymaps/jockyxu1122_ansi/readme.md (100%) rename keyboards/{ => thevankeyboards}/bananasplit/keymaps/jockyxu1122_iso/keymap.c (100%) rename keyboards/{ => thevankeyboards}/bananasplit/keymaps/jockyxu1122_iso/readme.md (100%) rename keyboards/{ => thevankeyboards}/bananasplit/keymaps/kamon/config.h (100%) rename keyboards/{ => thevankeyboards}/bananasplit/keymaps/kamon/keymap.c (100%) rename keyboards/{ => thevankeyboards}/bananasplit/keymaps/kamon/readme.md (100%) rename keyboards/{ => thevankeyboards}/bananasplit/keymaps/kamon/rules.mk (100%) rename keyboards/{ => thevankeyboards}/bananasplit/keymaps/nic/keymap.c (100%) rename keyboards/{ => thevankeyboards}/bananasplit/keymaps/rask/README.md (100%) rename keyboards/{ => thevankeyboards}/bananasplit/keymaps/rask/keymap.c (100%) rename keyboards/{ => thevankeyboards}/bananasplit/keymaps/talljoe/config.h (100%) rename keyboards/{ => thevankeyboards}/bananasplit/keymaps/talljoe/keymap.c (100%) rename keyboards/{ => thevankeyboards}/bananasplit/rules.mk (100%) rename keyboards/{tv44 => thevankeyboards/minivan}/config.h (98%) rename keyboards/{tv44 => thevankeyboards/minivan}/info.json (100%) rename keyboards/{tv44 => thevankeyboards/minivan}/keymaps/belak/config.h (100%) rename keyboards/{tv44 => thevankeyboards/minivan}/keymaps/belak/keymap.c (97%) rename keyboards/{tv44 => thevankeyboards/minivan}/keymaps/belak/readme.md (100%) rename keyboards/{tv44 => thevankeyboards/minivan}/keymaps/belak/rules.mk (100%) rename keyboards/{tv44 => thevankeyboards/minivan}/keymaps/budi/config.h (100%) rename keyboards/{tv44 => thevankeyboards/minivan}/keymaps/budi/keymap.c (100%) rename keyboards/{tv44 => thevankeyboards/minivan}/keymaps/budi/readme.md (100%) rename keyboards/{tv44 => thevankeyboards/minivan}/keymaps/core/keymap.c (96%) rename keyboards/{tv44 => thevankeyboards/minivan}/keymaps/core/readme.md (100%) rename keyboards/{tv44 => thevankeyboards/minivan}/keymaps/core/rules.mk (100%) rename keyboards/{roadkit => thevankeyboards/minivan}/keymaps/default/config.h (100%) rename keyboards/{tv44 => thevankeyboards/minivan}/keymaps/default/keymap.c (98%) rename keyboards/{tv44 => thevankeyboards/minivan}/keymaps/default/readme.md (100%) rename keyboards/{roadkit => thevankeyboards/minivan}/keymaps/default/rules.mk (100%) rename keyboards/{tv44 => thevankeyboards/minivan}/keymaps/jeebak/keymap.c (99%) rename keyboards/{tv44 => thevankeyboards/minivan}/keymaps/jeebak/readme.md (100%) rename keyboards/{roadkit/keymaps/flipphone => thevankeyboards/minivan/keymaps/jeebak}/rules.mk (100%) rename keyboards/{tv44 => thevankeyboards/minivan}/keymaps/jetpacktuxedo/config.h (100%) rename keyboards/{tv44 => thevankeyboards/minivan}/keymaps/jetpacktuxedo/keymap.c (99%) rename keyboards/{tv44 => thevankeyboards/minivan}/keymaps/jetpacktuxedo/readme.md (100%) rename keyboards/{tv44 => thevankeyboards/minivan}/keymaps/jetpacktuxedo/rules.mk (100%) rename keyboards/{tv44 => thevankeyboards/minivan}/keymaps/mjt/config.h (100%) rename keyboards/{tv44 => thevankeyboards/minivan}/keymaps/mjt/keymap.c (98%) rename keyboards/{tv44 => thevankeyboards/minivan}/keymaps/mjt/readme.md (100%) rename keyboards/{tv44 => thevankeyboards/minivan}/keymaps/mjt/rules.mk (100%) rename keyboards/{tv44 => thevankeyboards/minivan}/keymaps/smt/keymap.c (99%) rename keyboards/{tv44 => thevankeyboards/minivan}/keymaps/smt/readme.md (100%) rename keyboards/{roadkit/keymaps/mjt => thevankeyboards/minivan/keymaps/smt}/rules.mk (100%) rename keyboards/{tv44 => thevankeyboards/minivan}/keymaps/tong92/config.h (100%) rename keyboards/{tv44 => thevankeyboards/minivan}/keymaps/tong92/keymap.c (99%) rename keyboards/{tv44 => thevankeyboards/minivan}/keymaps/tong92/readme.md (100%) rename keyboards/{tv44 => thevankeyboards/minivan}/keymaps/tong92/rules.mk (100%) rename keyboards/{roadkit/keymaps/flipphone => thevankeyboards/minivan/keymaps/xyverz}/config.h (100%) rename keyboards/{tv44 => thevankeyboards/minivan}/keymaps/xyverz/keymap.c (98%) rename keyboards/{tv44 => thevankeyboards/minivan}/keymaps/xyverz/readme.md (100%) rename keyboards/{roadkit/keymaps/singles => thevankeyboards/minivan/keymaps/xyverz}/rules.mk (100%) rename keyboards/{tv44/tv44.c => thevankeyboards/minivan/minivan.c} (96%) rename keyboards/{tv44/tv44.h => thevankeyboards/minivan/minivan.h} (98%) create mode 100644 keyboards/thevankeyboards/minivan/readme.md rename keyboards/{tv44 => thevankeyboards/minivan}/rules.mk (100%) create mode 100644 keyboards/thevankeyboards/readme.md rename keyboards/{ => thevankeyboards}/roadkit/config.h (100%) rename keyboards/{ => thevankeyboards}/roadkit/info.json (100%) rename keyboards/{roadkit/keymaps/mjt => thevankeyboards/roadkit/keymaps/default}/config.h (100%) rename keyboards/{ => thevankeyboards}/roadkit/keymaps/default/keymap.c (100%) rename keyboards/{ => thevankeyboards}/roadkit/keymaps/default/readme.md (100%) rename keyboards/{tv44 => thevankeyboards/roadkit}/keymaps/default/rules.mk (100%) rename keyboards/{roadkit/keymaps/singles => thevankeyboards/roadkit/keymaps/flipphone}/config.h (100%) rename keyboards/{ => thevankeyboards}/roadkit/keymaps/flipphone/keymap.c (100%) rename keyboards/{ => thevankeyboards}/roadkit/keymaps/flipphone/readme.md (100%) rename keyboards/{tv44/keymaps/jeebak => thevankeyboards/roadkit/keymaps/flipphone}/rules.mk (100%) rename keyboards/{ => thevankeyboards}/roadkit/keymaps/khord/config.h (100%) rename keyboards/{ => thevankeyboards}/roadkit/keymaps/khord/keymap.c (100%) rename keyboards/{ => thevankeyboards}/roadkit/keymaps/khord/rules.mk (100%) rename keyboards/{tv44/keymaps/default => thevankeyboards/roadkit/keymaps/mjt}/config.h (100%) rename keyboards/{ => thevankeyboards}/roadkit/keymaps/mjt/keymap.c (100%) rename keyboards/{ => thevankeyboards}/roadkit/keymaps/mjt/readme.md (100%) rename keyboards/{tv44/keymaps/smt => thevankeyboards/roadkit/keymaps/mjt}/rules.mk (100%) rename keyboards/{tv44/keymaps/xyverz => thevankeyboards/roadkit/keymaps/singles}/config.h (100%) rename keyboards/{ => thevankeyboards}/roadkit/keymaps/singles/keymap.c (100%) rename keyboards/{ => thevankeyboards}/roadkit/keymaps/singles/readme.md (100%) rename keyboards/{tv44/keymaps/xyverz => thevankeyboards/roadkit/keymaps/singles}/rules.mk (100%) rename keyboards/{ => thevankeyboards}/roadkit/keymaps/singlesBrent/config.h (100%) rename keyboards/{ => thevankeyboards}/roadkit/keymaps/singlesBrent/keymap.c (100%) rename keyboards/{ => thevankeyboards}/roadkit/keymaps/singlesBrent/readme.md (100%) rename keyboards/{ => thevankeyboards}/roadkit/keymaps/singlesBrent/rules.mk (100%) create mode 100644 keyboards/thevankeyboards/roadkit/readme.md rename keyboards/{ => thevankeyboards}/roadkit/roadkit.c (100%) rename keyboards/{ => thevankeyboards}/roadkit/roadkit.h (100%) rename keyboards/{ => thevankeyboards}/roadkit/rules.mk (100%) delete mode 100644 keyboards/tv44/readme.md diff --git a/keyboards/bananasplit/README.md b/keyboards/bananasplit/README.md deleted file mode 100644 index cd1e15d77..000000000 --- a/keyboards/bananasplit/README.md +++ /dev/null @@ -1,15 +0,0 @@ -BananaSplit60 -=== - -A 60% PCB featuring a split spacebar. - -Keyboard Maintainer: QMK Community -Hardware Supported: BananaSplit60 PCB -Hardware Availability: https://thevankeyboards.com/products/gb-bananasplit-60-keyboard-kit?variant=42149104910 - -Make example for this keyboard (after setting up your build environment): - - make bananasplit:default - -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. - diff --git a/keyboards/roadkit/readme.md b/keyboards/roadkit/readme.md deleted file mode 100644 index 691bd1f3e..000000000 --- a/keyboards/roadkit/readme.md +++ /dev/null @@ -1,14 +0,0 @@ -roadkit -======= - -A programmable macro pad. - -Keyboard Maintainer: QMK Community -Hardware Supported: Roadkit PCB -Hardware Availability: https://thevankeyboards.com/collections/catalog/products/road-kit-diy?variant=603645345806 - -Make example for this keyboard (after setting up your build environment): - - make roadkit:default - -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. diff --git a/keyboards/thevankeyboards/bananasplit/README.md b/keyboards/thevankeyboards/bananasplit/README.md new file mode 100644 index 000000000..41d0d407d --- /dev/null +++ b/keyboards/thevankeyboards/bananasplit/README.md @@ -0,0 +1,14 @@ +# BananaSplit60 + +A 60% PCB featuring a split spacebar. + +Keyboard Maintainer: QMK Community +Hardware Supported: BananaSplit60 PCB +Hardware Availability: https://thevankeyboards.com/products/gb-bananasplit-60-keyboard-kit?variant=42149104910 + +Make example for this keyboard (after setting up your build environment): + + make thevankeyboards/bananasplit:default + +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). + diff --git a/keyboards/bananasplit/bananasplit.c b/keyboards/thevankeyboards/bananasplit/bananasplit.c similarity index 100% rename from keyboards/bananasplit/bananasplit.c rename to keyboards/thevankeyboards/bananasplit/bananasplit.c diff --git a/keyboards/bananasplit/bananasplit.h b/keyboards/thevankeyboards/bananasplit/bananasplit.h similarity index 100% rename from keyboards/bananasplit/bananasplit.h rename to keyboards/thevankeyboards/bananasplit/bananasplit.h diff --git a/keyboards/bananasplit/config.h b/keyboards/thevankeyboards/bananasplit/config.h similarity index 100% rename from keyboards/bananasplit/config.h rename to keyboards/thevankeyboards/bananasplit/config.h diff --git a/keyboards/bananasplit/info.json b/keyboards/thevankeyboards/bananasplit/info.json similarity index 100% rename from keyboards/bananasplit/info.json rename to keyboards/thevankeyboards/bananasplit/info.json diff --git a/keyboards/bananasplit/keymaps/0010/config.h b/keyboards/thevankeyboards/bananasplit/keymaps/0010/config.h similarity index 100% rename from keyboards/bananasplit/keymaps/0010/config.h rename to keyboards/thevankeyboards/bananasplit/keymaps/0010/config.h diff --git a/keyboards/bananasplit/keymaps/0010/keymap.c b/keyboards/thevankeyboards/bananasplit/keymaps/0010/keymap.c similarity index 100% rename from keyboards/bananasplit/keymaps/0010/keymap.c rename to keyboards/thevankeyboards/bananasplit/keymaps/0010/keymap.c diff --git a/keyboards/bananasplit/keymaps/0010/rules.mk b/keyboards/thevankeyboards/bananasplit/keymaps/0010/rules.mk similarity index 100% rename from keyboards/bananasplit/keymaps/0010/rules.mk rename to keyboards/thevankeyboards/bananasplit/keymaps/0010/rules.mk diff --git a/keyboards/bananasplit/keymaps/coloneljesus/config.h b/keyboards/thevankeyboards/bananasplit/keymaps/coloneljesus/config.h similarity index 100% rename from keyboards/bananasplit/keymaps/coloneljesus/config.h rename to keyboards/thevankeyboards/bananasplit/keymaps/coloneljesus/config.h diff --git a/keyboards/bananasplit/keymaps/coloneljesus/keymap.c b/keyboards/thevankeyboards/bananasplit/keymaps/coloneljesus/keymap.c similarity index 100% rename from keyboards/bananasplit/keymaps/coloneljesus/keymap.c rename to keyboards/thevankeyboards/bananasplit/keymaps/coloneljesus/keymap.c diff --git a/keyboards/bananasplit/keymaps/coloneljesus/readme.md b/keyboards/thevankeyboards/bananasplit/keymaps/coloneljesus/readme.md similarity index 100% rename from keyboards/bananasplit/keymaps/coloneljesus/readme.md rename to keyboards/thevankeyboards/bananasplit/keymaps/coloneljesus/readme.md diff --git a/keyboards/bananasplit/keymaps/coloneljesus/rules.mk b/keyboards/thevankeyboards/bananasplit/keymaps/coloneljesus/rules.mk similarity index 100% rename from keyboards/bananasplit/keymaps/coloneljesus/rules.mk rename to keyboards/thevankeyboards/bananasplit/keymaps/coloneljesus/rules.mk diff --git a/keyboards/bananasplit/keymaps/default/config.h b/keyboards/thevankeyboards/bananasplit/keymaps/default/config.h similarity index 100% rename from keyboards/bananasplit/keymaps/default/config.h rename to keyboards/thevankeyboards/bananasplit/keymaps/default/config.h diff --git a/keyboards/bananasplit/keymaps/default/keymap.c b/keyboards/thevankeyboards/bananasplit/keymaps/default/keymap.c similarity index 100% rename from keyboards/bananasplit/keymaps/default/keymap.c rename to keyboards/thevankeyboards/bananasplit/keymaps/default/keymap.c diff --git a/keyboards/bananasplit/keymaps/default/readme.md b/keyboards/thevankeyboards/bananasplit/keymaps/default/readme.md similarity index 100% rename from keyboards/bananasplit/keymaps/default/readme.md rename to keyboards/thevankeyboards/bananasplit/keymaps/default/readme.md diff --git a/keyboards/bananasplit/keymaps/default/rules.mk b/keyboards/thevankeyboards/bananasplit/keymaps/default/rules.mk similarity index 100% rename from keyboards/bananasplit/keymaps/default/rules.mk rename to keyboards/thevankeyboards/bananasplit/keymaps/default/rules.mk diff --git a/keyboards/bananasplit/keymaps/hhkbanana/keymap.c b/keyboards/thevankeyboards/bananasplit/keymaps/hhkbanana/keymap.c similarity index 100% rename from keyboards/bananasplit/keymaps/hhkbanana/keymap.c rename to keyboards/thevankeyboards/bananasplit/keymaps/hhkbanana/keymap.c diff --git a/keyboards/bananasplit/keymaps/jockyxu1122_ansi/keymap.c b/keyboards/thevankeyboards/bananasplit/keymaps/jockyxu1122_ansi/keymap.c similarity index 100% rename from keyboards/bananasplit/keymaps/jockyxu1122_ansi/keymap.c rename to keyboards/thevankeyboards/bananasplit/keymaps/jockyxu1122_ansi/keymap.c diff --git a/keyboards/bananasplit/keymaps/jockyxu1122_ansi/readme.md b/keyboards/thevankeyboards/bananasplit/keymaps/jockyxu1122_ansi/readme.md similarity index 100% rename from keyboards/bananasplit/keymaps/jockyxu1122_ansi/readme.md rename to keyboards/thevankeyboards/bananasplit/keymaps/jockyxu1122_ansi/readme.md diff --git a/keyboards/bananasplit/keymaps/jockyxu1122_iso/keymap.c b/keyboards/thevankeyboards/bananasplit/keymaps/jockyxu1122_iso/keymap.c similarity index 100% rename from keyboards/bananasplit/keymaps/jockyxu1122_iso/keymap.c rename to keyboards/thevankeyboards/bananasplit/keymaps/jockyxu1122_iso/keymap.c diff --git a/keyboards/bananasplit/keymaps/jockyxu1122_iso/readme.md b/keyboards/thevankeyboards/bananasplit/keymaps/jockyxu1122_iso/readme.md similarity index 100% rename from keyboards/bananasplit/keymaps/jockyxu1122_iso/readme.md rename to keyboards/thevankeyboards/bananasplit/keymaps/jockyxu1122_iso/readme.md diff --git a/keyboards/bananasplit/keymaps/kamon/config.h b/keyboards/thevankeyboards/bananasplit/keymaps/kamon/config.h similarity index 100% rename from keyboards/bananasplit/keymaps/kamon/config.h rename to keyboards/thevankeyboards/bananasplit/keymaps/kamon/config.h diff --git a/keyboards/bananasplit/keymaps/kamon/keymap.c b/keyboards/thevankeyboards/bananasplit/keymaps/kamon/keymap.c similarity index 100% rename from keyboards/bananasplit/keymaps/kamon/keymap.c rename to keyboards/thevankeyboards/bananasplit/keymaps/kamon/keymap.c diff --git a/keyboards/bananasplit/keymaps/kamon/readme.md b/keyboards/thevankeyboards/bananasplit/keymaps/kamon/readme.md similarity index 100% rename from keyboards/bananasplit/keymaps/kamon/readme.md rename to keyboards/thevankeyboards/bananasplit/keymaps/kamon/readme.md diff --git a/keyboards/bananasplit/keymaps/kamon/rules.mk b/keyboards/thevankeyboards/bananasplit/keymaps/kamon/rules.mk similarity index 100% rename from keyboards/bananasplit/keymaps/kamon/rules.mk rename to keyboards/thevankeyboards/bananasplit/keymaps/kamon/rules.mk diff --git a/keyboards/bananasplit/keymaps/nic/keymap.c b/keyboards/thevankeyboards/bananasplit/keymaps/nic/keymap.c similarity index 100% rename from keyboards/bananasplit/keymaps/nic/keymap.c rename to keyboards/thevankeyboards/bananasplit/keymaps/nic/keymap.c diff --git a/keyboards/bananasplit/keymaps/rask/README.md b/keyboards/thevankeyboards/bananasplit/keymaps/rask/README.md similarity index 100% rename from keyboards/bananasplit/keymaps/rask/README.md rename to keyboards/thevankeyboards/bananasplit/keymaps/rask/README.md diff --git a/keyboards/bananasplit/keymaps/rask/keymap.c b/keyboards/thevankeyboards/bananasplit/keymaps/rask/keymap.c similarity index 100% rename from keyboards/bananasplit/keymaps/rask/keymap.c rename to keyboards/thevankeyboards/bananasplit/keymaps/rask/keymap.c diff --git a/keyboards/bananasplit/keymaps/talljoe/config.h b/keyboards/thevankeyboards/bananasplit/keymaps/talljoe/config.h similarity index 100% rename from keyboards/bananasplit/keymaps/talljoe/config.h rename to keyboards/thevankeyboards/bananasplit/keymaps/talljoe/config.h diff --git a/keyboards/bananasplit/keymaps/talljoe/keymap.c b/keyboards/thevankeyboards/bananasplit/keymaps/talljoe/keymap.c similarity index 100% rename from keyboards/bananasplit/keymaps/talljoe/keymap.c rename to keyboards/thevankeyboards/bananasplit/keymaps/talljoe/keymap.c diff --git a/keyboards/bananasplit/rules.mk b/keyboards/thevankeyboards/bananasplit/rules.mk similarity index 100% rename from keyboards/bananasplit/rules.mk rename to keyboards/thevankeyboards/bananasplit/rules.mk diff --git a/keyboards/tv44/config.h b/keyboards/thevankeyboards/minivan/config.h similarity index 98% rename from keyboards/tv44/config.h rename to keyboards/thevankeyboards/minivan/config.h index 0ae93c095..726768e0e 100644 --- a/keyboards/tv44/config.h +++ b/keyboards/thevankeyboards/minivan/config.h @@ -25,8 +25,8 @@ along with this program. If not, see . #define PRODUCT_ID 0x8844 #define DEVICE_VER 0x0002 #define MANUFACTURER Evan Sailer -#define PRODUCT TheVan 44 -#define DESCRIPTION keyboard firmware for TV44 +#define PRODUCT Minivan +#define DESCRIPTION keyboard firmware for Minivan /* key matrix size */ #define MATRIX_ROWS 4 @@ -48,7 +48,7 @@ along with this program. If not, see . /* COL2ROW or ROW2COL */ #define DIODE_DIRECTION COL2ROW - + // #define BACKLIGHT_PIN B7 // #define BACKLIGHT_BREATHING // #define BACKLIGHT_LEVELS 3 diff --git a/keyboards/tv44/info.json b/keyboards/thevankeyboards/minivan/info.json similarity index 100% rename from keyboards/tv44/info.json rename to keyboards/thevankeyboards/minivan/info.json diff --git a/keyboards/tv44/keymaps/belak/config.h b/keyboards/thevankeyboards/minivan/keymaps/belak/config.h similarity index 100% rename from keyboards/tv44/keymaps/belak/config.h rename to keyboards/thevankeyboards/minivan/keymaps/belak/config.h diff --git a/keyboards/tv44/keymaps/belak/keymap.c b/keyboards/thevankeyboards/minivan/keymaps/belak/keymap.c similarity index 97% rename from keyboards/tv44/keymaps/belak/keymap.c rename to keyboards/thevankeyboards/minivan/keymaps/belak/keymap.c index 6c0ff1a1c..19051574a 100644 --- a/keyboards/tv44/keymaps/belak/keymap.c +++ b/keyboards/thevankeyboards/minivan/keymaps/belak/keymap.c @@ -1,7 +1,4 @@ -#include "tv44.h" -#include "action_layer.h" -#include "debug.h" -#include "eeconfig.h" +#include QMK_KEYBOARD_H // Layer names. We stick to 3 letters if possible so MO(NAME) fits in 7 // characters and doesn't mess with the grid. diff --git a/keyboards/tv44/keymaps/belak/readme.md b/keyboards/thevankeyboards/minivan/keymaps/belak/readme.md similarity index 100% rename from keyboards/tv44/keymaps/belak/readme.md rename to keyboards/thevankeyboards/minivan/keymaps/belak/readme.md diff --git a/keyboards/tv44/keymaps/belak/rules.mk b/keyboards/thevankeyboards/minivan/keymaps/belak/rules.mk similarity index 100% rename from keyboards/tv44/keymaps/belak/rules.mk rename to keyboards/thevankeyboards/minivan/keymaps/belak/rules.mk diff --git a/keyboards/tv44/keymaps/budi/config.h b/keyboards/thevankeyboards/minivan/keymaps/budi/config.h similarity index 100% rename from keyboards/tv44/keymaps/budi/config.h rename to keyboards/thevankeyboards/minivan/keymaps/budi/config.h diff --git a/keyboards/tv44/keymaps/budi/keymap.c b/keyboards/thevankeyboards/minivan/keymaps/budi/keymap.c similarity index 100% rename from keyboards/tv44/keymaps/budi/keymap.c rename to keyboards/thevankeyboards/minivan/keymaps/budi/keymap.c diff --git a/keyboards/tv44/keymaps/budi/readme.md b/keyboards/thevankeyboards/minivan/keymaps/budi/readme.md similarity index 100% rename from keyboards/tv44/keymaps/budi/readme.md rename to keyboards/thevankeyboards/minivan/keymaps/budi/readme.md diff --git a/keyboards/tv44/keymaps/core/keymap.c b/keyboards/thevankeyboards/minivan/keymaps/core/keymap.c similarity index 96% rename from keyboards/tv44/keymaps/core/keymap.c rename to keyboards/thevankeyboards/minivan/keymaps/core/keymap.c index d24049696..cf1e0d3f5 100644 --- a/keyboards/tv44/keymaps/core/keymap.c +++ b/keyboards/thevankeyboards/minivan/keymaps/core/keymap.c @@ -1,6 +1,4 @@ -#include "tv44.h" -#include "action_layer.h" -#include "eeconfig.h" +#include QMK_KEYBOARD_H #define _QW 0 #define _L1 1 diff --git a/keyboards/tv44/keymaps/core/readme.md b/keyboards/thevankeyboards/minivan/keymaps/core/readme.md similarity index 100% rename from keyboards/tv44/keymaps/core/readme.md rename to keyboards/thevankeyboards/minivan/keymaps/core/readme.md diff --git a/keyboards/tv44/keymaps/core/rules.mk b/keyboards/thevankeyboards/minivan/keymaps/core/rules.mk similarity index 100% rename from keyboards/tv44/keymaps/core/rules.mk rename to keyboards/thevankeyboards/minivan/keymaps/core/rules.mk diff --git a/keyboards/roadkit/keymaps/default/config.h b/keyboards/thevankeyboards/minivan/keymaps/default/config.h similarity index 100% rename from keyboards/roadkit/keymaps/default/config.h rename to keyboards/thevankeyboards/minivan/keymaps/default/config.h diff --git a/keyboards/tv44/keymaps/default/keymap.c b/keyboards/thevankeyboards/minivan/keymaps/default/keymap.c similarity index 98% rename from keyboards/tv44/keymaps/default/keymap.c rename to keyboards/thevankeyboards/minivan/keymaps/default/keymap.c index 6055cd74e..90b188b55 100644 --- a/keyboards/tv44/keymaps/default/keymap.c +++ b/keyboards/thevankeyboards/minivan/keymaps/default/keymap.c @@ -1,6 +1,4 @@ -#include "tv44.h" -#include "action_layer.h" -#include "eeconfig.h" +#include QMK_KEYBOARD_H extern keymap_config_t keymap_config; diff --git a/keyboards/tv44/keymaps/default/readme.md b/keyboards/thevankeyboards/minivan/keymaps/default/readme.md similarity index 100% rename from keyboards/tv44/keymaps/default/readme.md rename to keyboards/thevankeyboards/minivan/keymaps/default/readme.md diff --git a/keyboards/roadkit/keymaps/default/rules.mk b/keyboards/thevankeyboards/minivan/keymaps/default/rules.mk similarity index 100% rename from keyboards/roadkit/keymaps/default/rules.mk rename to keyboards/thevankeyboards/minivan/keymaps/default/rules.mk diff --git a/keyboards/tv44/keymaps/jeebak/keymap.c b/keyboards/thevankeyboards/minivan/keymaps/jeebak/keymap.c similarity index 99% rename from keyboards/tv44/keymaps/jeebak/keymap.c rename to keyboards/thevankeyboards/minivan/keymaps/jeebak/keymap.c index 5503e1f9e..0ec9485c7 100644 --- a/keyboards/tv44/keymaps/jeebak/keymap.c +++ b/keyboards/thevankeyboards/minivan/keymaps/jeebak/keymap.c @@ -1,6 +1,4 @@ -#include "tv44.h" -#include "action_layer.h" -#include "eeconfig.h" +#include QMK_KEYBOARD_H extern keymap_config_t keymap_config; diff --git a/keyboards/tv44/keymaps/jeebak/readme.md b/keyboards/thevankeyboards/minivan/keymaps/jeebak/readme.md similarity index 100% rename from keyboards/tv44/keymaps/jeebak/readme.md rename to keyboards/thevankeyboards/minivan/keymaps/jeebak/readme.md diff --git a/keyboards/roadkit/keymaps/flipphone/rules.mk b/keyboards/thevankeyboards/minivan/keymaps/jeebak/rules.mk similarity index 100% rename from keyboards/roadkit/keymaps/flipphone/rules.mk rename to keyboards/thevankeyboards/minivan/keymaps/jeebak/rules.mk diff --git a/keyboards/tv44/keymaps/jetpacktuxedo/config.h b/keyboards/thevankeyboards/minivan/keymaps/jetpacktuxedo/config.h similarity index 100% rename from keyboards/tv44/keymaps/jetpacktuxedo/config.h rename to keyboards/thevankeyboards/minivan/keymaps/jetpacktuxedo/config.h diff --git a/keyboards/tv44/keymaps/jetpacktuxedo/keymap.c b/keyboards/thevankeyboards/minivan/keymaps/jetpacktuxedo/keymap.c similarity index 99% rename from keyboards/tv44/keymaps/jetpacktuxedo/keymap.c rename to keyboards/thevankeyboards/minivan/keymaps/jetpacktuxedo/keymap.c index 45bedaa97..02ba68421 100644 --- a/keyboards/tv44/keymaps/jetpacktuxedo/keymap.c +++ b/keyboards/thevankeyboards/minivan/keymaps/jetpacktuxedo/keymap.c @@ -1,4 +1,4 @@ -#include "tv44.h" +#include QMK_KEYBOARD_H extern keymap_config_t keymap_config; diff --git a/keyboards/tv44/keymaps/jetpacktuxedo/readme.md b/keyboards/thevankeyboards/minivan/keymaps/jetpacktuxedo/readme.md similarity index 100% rename from keyboards/tv44/keymaps/jetpacktuxedo/readme.md rename to keyboards/thevankeyboards/minivan/keymaps/jetpacktuxedo/readme.md diff --git a/keyboards/tv44/keymaps/jetpacktuxedo/rules.mk b/keyboards/thevankeyboards/minivan/keymaps/jetpacktuxedo/rules.mk similarity index 100% rename from keyboards/tv44/keymaps/jetpacktuxedo/rules.mk rename to keyboards/thevankeyboards/minivan/keymaps/jetpacktuxedo/rules.mk diff --git a/keyboards/tv44/keymaps/mjt/config.h b/keyboards/thevankeyboards/minivan/keymaps/mjt/config.h similarity index 100% rename from keyboards/tv44/keymaps/mjt/config.h rename to keyboards/thevankeyboards/minivan/keymaps/mjt/config.h diff --git a/keyboards/tv44/keymaps/mjt/keymap.c b/keyboards/thevankeyboards/minivan/keymaps/mjt/keymap.c similarity index 98% rename from keyboards/tv44/keymaps/mjt/keymap.c rename to keyboards/thevankeyboards/minivan/keymaps/mjt/keymap.c index 25f8cfc52..8f0fba11d 100644 --- a/keyboards/tv44/keymaps/mjt/keymap.c +++ b/keyboards/thevankeyboards/minivan/keymaps/mjt/keymap.c @@ -1,8 +1,6 @@ //Author: mike terhar +#include QMK_KEYBOARD_H -#include "tv44.h" -#include "action_layer.h" -#include "eeconfig.h" #ifdef BACKLIGHT_ENABLE #include "backlight.h" #endif diff --git a/keyboards/tv44/keymaps/mjt/readme.md b/keyboards/thevankeyboards/minivan/keymaps/mjt/readme.md similarity index 100% rename from keyboards/tv44/keymaps/mjt/readme.md rename to keyboards/thevankeyboards/minivan/keymaps/mjt/readme.md diff --git a/keyboards/tv44/keymaps/mjt/rules.mk b/keyboards/thevankeyboards/minivan/keymaps/mjt/rules.mk similarity index 100% rename from keyboards/tv44/keymaps/mjt/rules.mk rename to keyboards/thevankeyboards/minivan/keymaps/mjt/rules.mk diff --git a/keyboards/tv44/keymaps/smt/keymap.c b/keyboards/thevankeyboards/minivan/keymaps/smt/keymap.c similarity index 99% rename from keyboards/tv44/keymaps/smt/keymap.c rename to keyboards/thevankeyboards/minivan/keymaps/smt/keymap.c index 0e1484e82..ee117e47b 100644 --- a/keyboards/tv44/keymaps/smt/keymap.c +++ b/keyboards/thevankeyboards/minivan/keymaps/smt/keymap.c @@ -1,6 +1,4 @@ -#include "tv44.h" -#include "action_layer.h" -#include "eeconfig.h" +#include QMK_KEYBOARD_H extern keymap_config_t keymap_config; diff --git a/keyboards/tv44/keymaps/smt/readme.md b/keyboards/thevankeyboards/minivan/keymaps/smt/readme.md similarity index 100% rename from keyboards/tv44/keymaps/smt/readme.md rename to keyboards/thevankeyboards/minivan/keymaps/smt/readme.md diff --git a/keyboards/roadkit/keymaps/mjt/rules.mk b/keyboards/thevankeyboards/minivan/keymaps/smt/rules.mk similarity index 100% rename from keyboards/roadkit/keymaps/mjt/rules.mk rename to keyboards/thevankeyboards/minivan/keymaps/smt/rules.mk diff --git a/keyboards/tv44/keymaps/tong92/config.h b/keyboards/thevankeyboards/minivan/keymaps/tong92/config.h similarity index 100% rename from keyboards/tv44/keymaps/tong92/config.h rename to keyboards/thevankeyboards/minivan/keymaps/tong92/config.h diff --git a/keyboards/tv44/keymaps/tong92/keymap.c b/keyboards/thevankeyboards/minivan/keymaps/tong92/keymap.c similarity index 99% rename from keyboards/tv44/keymaps/tong92/keymap.c rename to keyboards/thevankeyboards/minivan/keymaps/tong92/keymap.c index 758c3bb15..220cc8c61 100644 --- a/keyboards/tv44/keymaps/tong92/keymap.c +++ b/keyboards/thevankeyboards/minivan/keymaps/tong92/keymap.c @@ -1,8 +1,6 @@ //Author: tong92 +#include QMK_KEYBOARD_H -#include "tv44.h" -#include "action_layer.h" -#include "eeconfig.h" #ifdef BACKLIGHT_ENABLE #include "backlight.h" #endif diff --git a/keyboards/tv44/keymaps/tong92/readme.md b/keyboards/thevankeyboards/minivan/keymaps/tong92/readme.md similarity index 100% rename from keyboards/tv44/keymaps/tong92/readme.md rename to keyboards/thevankeyboards/minivan/keymaps/tong92/readme.md diff --git a/keyboards/tv44/keymaps/tong92/rules.mk b/keyboards/thevankeyboards/minivan/keymaps/tong92/rules.mk similarity index 100% rename from keyboards/tv44/keymaps/tong92/rules.mk rename to keyboards/thevankeyboards/minivan/keymaps/tong92/rules.mk diff --git a/keyboards/roadkit/keymaps/flipphone/config.h b/keyboards/thevankeyboards/minivan/keymaps/xyverz/config.h similarity index 100% rename from keyboards/roadkit/keymaps/flipphone/config.h rename to keyboards/thevankeyboards/minivan/keymaps/xyverz/config.h diff --git a/keyboards/tv44/keymaps/xyverz/keymap.c b/keyboards/thevankeyboards/minivan/keymaps/xyverz/keymap.c similarity index 98% rename from keyboards/tv44/keymaps/xyverz/keymap.c rename to keyboards/thevankeyboards/minivan/keymaps/xyverz/keymap.c index bbdb9093e..ec0d27007 100644 --- a/keyboards/tv44/keymaps/xyverz/keymap.c +++ b/keyboards/thevankeyboards/minivan/keymaps/xyverz/keymap.c @@ -1,6 +1,4 @@ -#include "tv44.h" -#include "action_layer.h" -#include "eeconfig.h" +#include QMK_KEYBOARD_H extern keymap_config_t keymap_config; diff --git a/keyboards/tv44/keymaps/xyverz/readme.md b/keyboards/thevankeyboards/minivan/keymaps/xyverz/readme.md similarity index 100% rename from keyboards/tv44/keymaps/xyverz/readme.md rename to keyboards/thevankeyboards/minivan/keymaps/xyverz/readme.md diff --git a/keyboards/roadkit/keymaps/singles/rules.mk b/keyboards/thevankeyboards/minivan/keymaps/xyverz/rules.mk similarity index 100% rename from keyboards/roadkit/keymaps/singles/rules.mk rename to keyboards/thevankeyboards/minivan/keymaps/xyverz/rules.mk diff --git a/keyboards/tv44/tv44.c b/keyboards/thevankeyboards/minivan/minivan.c similarity index 96% rename from keyboards/tv44/tv44.c rename to keyboards/thevankeyboards/minivan/minivan.c index 6dc0efd28..b260195ce 100644 --- a/keyboards/tv44/tv44.c +++ b/keyboards/thevankeyboards/minivan/minivan.c @@ -1,4 +1,4 @@ -#include "tv44.h" +#include "minivan.h" void matrix_init_kb(void) { // put your keyboard start-up code here diff --git a/keyboards/tv44/tv44.h b/keyboards/thevankeyboards/minivan/minivan.h similarity index 98% rename from keyboards/tv44/tv44.h rename to keyboards/thevankeyboards/minivan/minivan.h index aea6179d9..27a358365 100644 --- a/keyboards/tv44/tv44.h +++ b/keyboards/thevankeyboards/minivan/minivan.h @@ -1,5 +1,5 @@ -#ifndef TV44_H -#define TV44_H +#ifndef MINIVAN_H +#define MINIVAN_H #include "quantum.h" diff --git a/keyboards/thevankeyboards/minivan/readme.md b/keyboards/thevankeyboards/minivan/readme.md new file mode 100644 index 000000000..03a868a16 --- /dev/null +++ b/keyboards/thevankeyboards/minivan/readme.md @@ -0,0 +1,13 @@ +# Minivan (tv44) + +A compact 44% keyboard. + +Keyboard Maintainer: QMK Community +Hardware Supported: Minivan PCB +Hardware Availability: https://thevankeyboards.com/collections/catalog/products/minivan-diy?variant=609138376718 + +Make example for this keyboard (after setting up your build environment): + + make thevankeyboards/minivan:default + +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). diff --git a/keyboards/tv44/rules.mk b/keyboards/thevankeyboards/minivan/rules.mk similarity index 100% rename from keyboards/tv44/rules.mk rename to keyboards/thevankeyboards/minivan/rules.mk diff --git a/keyboards/thevankeyboards/readme.md b/keyboards/thevankeyboards/readme.md new file mode 100644 index 000000000..5dfd74e57 --- /dev/null +++ b/keyboards/thevankeyboards/readme.md @@ -0,0 +1,3 @@ +# TheVan Keyboards + +[TheVan Keyboards](https://thevankeyboards.com/) is based in the United States and is responsible for boards such as the minivan. \ No newline at end of file diff --git a/keyboards/roadkit/config.h b/keyboards/thevankeyboards/roadkit/config.h similarity index 100% rename from keyboards/roadkit/config.h rename to keyboards/thevankeyboards/roadkit/config.h diff --git a/keyboards/roadkit/info.json b/keyboards/thevankeyboards/roadkit/info.json similarity index 100% rename from keyboards/roadkit/info.json rename to keyboards/thevankeyboards/roadkit/info.json diff --git a/keyboards/roadkit/keymaps/mjt/config.h b/keyboards/thevankeyboards/roadkit/keymaps/default/config.h similarity index 100% rename from keyboards/roadkit/keymaps/mjt/config.h rename to keyboards/thevankeyboards/roadkit/keymaps/default/config.h diff --git a/keyboards/roadkit/keymaps/default/keymap.c b/keyboards/thevankeyboards/roadkit/keymaps/default/keymap.c similarity index 100% rename from keyboards/roadkit/keymaps/default/keymap.c rename to keyboards/thevankeyboards/roadkit/keymaps/default/keymap.c diff --git a/keyboards/roadkit/keymaps/default/readme.md b/keyboards/thevankeyboards/roadkit/keymaps/default/readme.md similarity index 100% rename from keyboards/roadkit/keymaps/default/readme.md rename to keyboards/thevankeyboards/roadkit/keymaps/default/readme.md diff --git a/keyboards/tv44/keymaps/default/rules.mk b/keyboards/thevankeyboards/roadkit/keymaps/default/rules.mk similarity index 100% rename from keyboards/tv44/keymaps/default/rules.mk rename to keyboards/thevankeyboards/roadkit/keymaps/default/rules.mk diff --git a/keyboards/roadkit/keymaps/singles/config.h b/keyboards/thevankeyboards/roadkit/keymaps/flipphone/config.h similarity index 100% rename from keyboards/roadkit/keymaps/singles/config.h rename to keyboards/thevankeyboards/roadkit/keymaps/flipphone/config.h diff --git a/keyboards/roadkit/keymaps/flipphone/keymap.c b/keyboards/thevankeyboards/roadkit/keymaps/flipphone/keymap.c similarity index 100% rename from keyboards/roadkit/keymaps/flipphone/keymap.c rename to keyboards/thevankeyboards/roadkit/keymaps/flipphone/keymap.c diff --git a/keyboards/roadkit/keymaps/flipphone/readme.md b/keyboards/thevankeyboards/roadkit/keymaps/flipphone/readme.md similarity index 100% rename from keyboards/roadkit/keymaps/flipphone/readme.md rename to keyboards/thevankeyboards/roadkit/keymaps/flipphone/readme.md diff --git a/keyboards/tv44/keymaps/jeebak/rules.mk b/keyboards/thevankeyboards/roadkit/keymaps/flipphone/rules.mk similarity index 100% rename from keyboards/tv44/keymaps/jeebak/rules.mk rename to keyboards/thevankeyboards/roadkit/keymaps/flipphone/rules.mk diff --git a/keyboards/roadkit/keymaps/khord/config.h b/keyboards/thevankeyboards/roadkit/keymaps/khord/config.h similarity index 100% rename from keyboards/roadkit/keymaps/khord/config.h rename to keyboards/thevankeyboards/roadkit/keymaps/khord/config.h diff --git a/keyboards/roadkit/keymaps/khord/keymap.c b/keyboards/thevankeyboards/roadkit/keymaps/khord/keymap.c similarity index 100% rename from keyboards/roadkit/keymaps/khord/keymap.c rename to keyboards/thevankeyboards/roadkit/keymaps/khord/keymap.c diff --git a/keyboards/roadkit/keymaps/khord/rules.mk b/keyboards/thevankeyboards/roadkit/keymaps/khord/rules.mk similarity index 100% rename from keyboards/roadkit/keymaps/khord/rules.mk rename to keyboards/thevankeyboards/roadkit/keymaps/khord/rules.mk diff --git a/keyboards/tv44/keymaps/default/config.h b/keyboards/thevankeyboards/roadkit/keymaps/mjt/config.h similarity index 100% rename from keyboards/tv44/keymaps/default/config.h rename to keyboards/thevankeyboards/roadkit/keymaps/mjt/config.h diff --git a/keyboards/roadkit/keymaps/mjt/keymap.c b/keyboards/thevankeyboards/roadkit/keymaps/mjt/keymap.c similarity index 100% rename from keyboards/roadkit/keymaps/mjt/keymap.c rename to keyboards/thevankeyboards/roadkit/keymaps/mjt/keymap.c diff --git a/keyboards/roadkit/keymaps/mjt/readme.md b/keyboards/thevankeyboards/roadkit/keymaps/mjt/readme.md similarity index 100% rename from keyboards/roadkit/keymaps/mjt/readme.md rename to keyboards/thevankeyboards/roadkit/keymaps/mjt/readme.md diff --git a/keyboards/tv44/keymaps/smt/rules.mk b/keyboards/thevankeyboards/roadkit/keymaps/mjt/rules.mk similarity index 100% rename from keyboards/tv44/keymaps/smt/rules.mk rename to keyboards/thevankeyboards/roadkit/keymaps/mjt/rules.mk diff --git a/keyboards/tv44/keymaps/xyverz/config.h b/keyboards/thevankeyboards/roadkit/keymaps/singles/config.h similarity index 100% rename from keyboards/tv44/keymaps/xyverz/config.h rename to keyboards/thevankeyboards/roadkit/keymaps/singles/config.h diff --git a/keyboards/roadkit/keymaps/singles/keymap.c b/keyboards/thevankeyboards/roadkit/keymaps/singles/keymap.c similarity index 100% rename from keyboards/roadkit/keymaps/singles/keymap.c rename to keyboards/thevankeyboards/roadkit/keymaps/singles/keymap.c diff --git a/keyboards/roadkit/keymaps/singles/readme.md b/keyboards/thevankeyboards/roadkit/keymaps/singles/readme.md similarity index 100% rename from keyboards/roadkit/keymaps/singles/readme.md rename to keyboards/thevankeyboards/roadkit/keymaps/singles/readme.md diff --git a/keyboards/tv44/keymaps/xyverz/rules.mk b/keyboards/thevankeyboards/roadkit/keymaps/singles/rules.mk similarity index 100% rename from keyboards/tv44/keymaps/xyverz/rules.mk rename to keyboards/thevankeyboards/roadkit/keymaps/singles/rules.mk diff --git a/keyboards/roadkit/keymaps/singlesBrent/config.h b/keyboards/thevankeyboards/roadkit/keymaps/singlesBrent/config.h similarity index 100% rename from keyboards/roadkit/keymaps/singlesBrent/config.h rename to keyboards/thevankeyboards/roadkit/keymaps/singlesBrent/config.h diff --git a/keyboards/roadkit/keymaps/singlesBrent/keymap.c b/keyboards/thevankeyboards/roadkit/keymaps/singlesBrent/keymap.c similarity index 100% rename from keyboards/roadkit/keymaps/singlesBrent/keymap.c rename to keyboards/thevankeyboards/roadkit/keymaps/singlesBrent/keymap.c diff --git a/keyboards/roadkit/keymaps/singlesBrent/readme.md b/keyboards/thevankeyboards/roadkit/keymaps/singlesBrent/readme.md similarity index 100% rename from keyboards/roadkit/keymaps/singlesBrent/readme.md rename to keyboards/thevankeyboards/roadkit/keymaps/singlesBrent/readme.md diff --git a/keyboards/roadkit/keymaps/singlesBrent/rules.mk b/keyboards/thevankeyboards/roadkit/keymaps/singlesBrent/rules.mk similarity index 100% rename from keyboards/roadkit/keymaps/singlesBrent/rules.mk rename to keyboards/thevankeyboards/roadkit/keymaps/singlesBrent/rules.mk diff --git a/keyboards/thevankeyboards/roadkit/readme.md b/keyboards/thevankeyboards/roadkit/readme.md new file mode 100644 index 000000000..e4af2dcc0 --- /dev/null +++ b/keyboards/thevankeyboards/roadkit/readme.md @@ -0,0 +1,13 @@ +# Roadkit + +A programmable macro pad. + +Keyboard Maintainer: QMK Community +Hardware Supported: Roadkit PCB +Hardware Availability: https://thevankeyboards.com/collections/catalog/products/road-kit-diy?variant=603645345806 + +Make example for this keyboard (after setting up your build environment): + + make thevankeyboards/roadkit:default + +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). diff --git a/keyboards/roadkit/roadkit.c b/keyboards/thevankeyboards/roadkit/roadkit.c similarity index 100% rename from keyboards/roadkit/roadkit.c rename to keyboards/thevankeyboards/roadkit/roadkit.c diff --git a/keyboards/roadkit/roadkit.h b/keyboards/thevankeyboards/roadkit/roadkit.h similarity index 100% rename from keyboards/roadkit/roadkit.h rename to keyboards/thevankeyboards/roadkit/roadkit.h diff --git a/keyboards/roadkit/rules.mk b/keyboards/thevankeyboards/roadkit/rules.mk similarity index 100% rename from keyboards/roadkit/rules.mk rename to keyboards/thevankeyboards/roadkit/rules.mk diff --git a/keyboards/tv44/readme.md b/keyboards/tv44/readme.md deleted file mode 100644 index 28185f455..000000000 --- a/keyboards/tv44/readme.md +++ /dev/null @@ -1,14 +0,0 @@ -The Van 44 -========== - -A compact 44% keyboard. - -Keyboard Maintainer: QMK Community -Hardware Supported: The Van PCB -Hardware Availability: https://thevankeyboards.com/collections/catalog/products/minivan-diy?variant=609138376718 - -Make example for this keyboard (after setting up your build environment): - - make tv44:default - -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. From 6d6d91c834ef3415425e21d895d4ec91c67fd4b8 Mon Sep 17 00:00:00 2001 From: Takeshi ISHII <2170248+mtei@users.noreply.github.com> Date: Fri, 14 Sep 2018 02:24:10 +0900 Subject: [PATCH 090/788] rgblight.[ch] more configurable (#3582) * add temporary test code rgblight-macro-test1.[ch] * rgblight.h : mode auto numberring and auto generate mode name symbol No change in build result. * rgblight.c use RGBLIGHT_MODE_xxx symbols No change in build result. * quantum.c use RGBLIGHT_MODE_xxx symbols No change in build result. * fix build break. when RGB_MATRIX_ENABLE defined * add temporary test code rgblight-macro-test2.[ch] * modify rgblight_mode_eeprom_helper() and rgblight_sethsv_eeprom_helper() * modify rgblight_task() * configurable each effect compile on/off in config.h * update docs/feature_rgblight.md * fix conflict. docs/feature_rgblight.md * remove temporary test code rgblight-macro-test*.[ch] * fix comment typo. * remove old mode number from comment * update docs/feature_rgblight.md about effect mode * Revert "update docs/feature_rgblight.md about effect mode" This reverts commit 43890663fcc9dda1899df7a37d382fc38b1a6d6d. * some change docs/feature_rgblight.md * fix typo * docs/feature_rgblight.md update: revise mode number table --- docs/feature_rgblight.md | 40 ++++-- quantum/quantum.c | 52 +++++--- quantum/quantum.h | 6 + quantum/rgblight.c | 237 ++++++++++++++++++++++------------ quantum/rgblight.h | 87 ++++++++++++- quantum/rgblight_reconfig.h | 36 ++++++ tmk_core/common/avr/suspend.c | 1 + tmk_core/protocol/lufa/lufa.c | 1 + 8 files changed, 345 insertions(+), 115 deletions(-) create mode 100644 quantum/rgblight_reconfig.h diff --git a/docs/feature_rgblight.md b/docs/feature_rgblight.md index d48941a04..925dca724 100644 --- a/docs/feature_rgblight.md +++ b/docs/feature_rgblight.md @@ -79,20 +79,23 @@ Your RGB lighting can be configured by placing these `#define`s in your `config. ## Animations -Not only can this lighting be whatever color you want, if `RGBLIGHT_ANIMATIONS` is defined, you also have a number of animation modes at your disposal: -|Mode |Description | -|-----|---------------------| -|1 |Solid color | -|2-5 |Solid color breathing| -|6-8 |Cycling rainbow | -|9-14 |Swirling rainbow | -|15-20|Snake | -|21-23|Knight | -|24 |Christmas | -|25-34|Static gradient | -|35 |RGB Test | -|36 |Alternating | +Not only can this lighting be whatever color you want, +if `RGBLIGHT_EFFECT_xxxx` or `RGBLIGHT_ANIMATIONS` is defined, you also have a number of animation modes at your disposal: + +|Mode number symbol |Additional number |Description | +|-----------------------------|-------------------|---------------------------------------| +|`RGBLIGHT_MODE_STATIC_LIGHT` | *None* |Solid color (this mode is always enabled) | +|`RGBLIGHT_MODE_BREATHING` | 0,1,2,3 |Solid color breathing | +|`RGBLIGHT_MODE_RAINBOW_MOOD` | 0,1,2 |Cycling rainbow | +|`RGBLIGHT_MODE_RAINBOW_SWIRL`| 0,1,2,3,4,5 |Swirling rainbow | +|`RGBLIGHT_MODE_SNAKE` | 0,1,2,3,4,5 |Snake | +|`RGBLIGHT_MODE_KNIGHT` | 0,1,2 |Knight | +|`RGBLIGHT_MODE_CHRISTMAS` | *None* |Christmas | +|`RGBLIGHT_MODE_STATIC_GRADIENT`| 0,1,..,9 |Static gradient | +|`RGBLIGHT_MODE_RGB_TEST` | *None* |RGB Test | +|`RGBLIGHT_MODE_ALTERNATING` | *None* |Alternating | + Check out [this video](https://youtube.com/watch?v=VKrpPAHlisY) for a demonstration. @@ -100,7 +103,16 @@ The following options can be used to tweak the various animations: |Define |Default |Description | |------------------------------------|-------------|-------------------------------------------------------------------------------------| -|`RGBLIGHT_ANIMATIONS` |*Not defined*|If defined, enables additional animation modes | +|`RGBLIGHT_EFFECT_BREATHING` |*Not defined*|If defined, enable breathing animation mode. | +|`RGBLIGHT_EFFECT_RAINBOW_MOOD` |*Not defined*|If defined, enable rainbow mood animation mode. | +|`RGBLIGHT_EFFECT_RAINBOW_SWIRL` |*Not defined*|If defined, enable rainbow swirl animation mode. | +|`RGBLIGHT_EFFECT_SNAKE` |*Not defined*|If defined, enable snake animation mode. | +|`RGBLIGHT_EFFECT_KNIGHT` |*Not defined*|If defined, enable knight animation mode. | +|`RGBLIGHT_EFFECT_CHRISTMAS` |*Not defined*|If defined, enable christmas animation mode. | +|`RGBLIGHT_EFFECT_STATIC_GRADIENT` |*Not defined*|If defined, enable static gradient mode. | +|`RGBLIGHT_EFFECT_RGB_TEST` |*Not defined*|If defined, enable RGB test animation mode. | +|`RGBLIGHT_EFFECT_ALTERNATING` |*Not defined*|If defined, enable alternating animation mode. | +|`RGBLIGHT_ANIMATIONS` |*Not defined*|If defined, enables all additional animation modes | |`RGBLIGHT_EFFECT_BREATHE_CENTER` |`1.85` |Used to calculate the curve for the breathing animation. Valid values are 1.0 to 2.7 | |`RGBLIGHT_EFFECT_BREATHE_MAX` |`255` |The maximum brightness for the breathing mode. Valid values are 1 to 255 | |`RGBLIGHT_EFFECT_SNAKE_LENGTH` |`4` |The number of LEDs to light up for the "Snake" animation | diff --git a/quantum/quantum.c b/quantum/quantum.c index ab47fa48f..9d352a94c 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -445,75 +445,97 @@ bool process_record_quantum(keyrecord_t *record) { return false; case RGB_MODE_PLAIN: if (record->event.pressed) { - rgblight_mode(1); + rgblight_mode(RGBLIGHT_MODE_STATIC_LIGHT); #ifdef SPLIT_KEYBOARD RGB_DIRTY = true; #endif } return false; case RGB_MODE_BREATHE: + #ifdef RGBLIGHT_EFFECT_BREATHING if (record->event.pressed) { - if ((2 <= rgblight_get_mode()) && (rgblight_get_mode() < 5)) { + if ((RGBLIGHT_MODE_BREATHING <= rgblight_get_mode()) && + (rgblight_get_mode() < RGBLIGHT_MODE_BREATHING_end)) { rgblight_step(); } else { - rgblight_mode(2); + rgblight_mode(RGBLIGHT_MODE_BREATHING); } } + #endif return false; case RGB_MODE_RAINBOW: + #ifdef RGBLIGHT_EFFECT_RAINBOW_MOOD if (record->event.pressed) { - if ((6 <= rgblight_get_mode()) && (rgblight_get_mode() < 8)) { + if ((RGBLIGHT_MODE_RAINBOW_MOOD <= rgblight_get_mode()) && + (rgblight_get_mode() < RGBLIGHT_MODE_RAINBOW_MOOD_end)) { rgblight_step(); } else { - rgblight_mode(6); + rgblight_mode(RGBLIGHT_MODE_RAINBOW_MOOD); } } + #endif return false; case RGB_MODE_SWIRL: + #ifdef RGBLIGHT_EFFECT_RAINBOW_SWIRL if (record->event.pressed) { - if ((9 <= rgblight_get_mode()) && (rgblight_get_mode() < 14)) { + if ((RGBLIGHT_MODE_RAINBOW_SWIRL <= rgblight_get_mode()) && + (rgblight_get_mode() < RGBLIGHT_MODE_RAINBOW_SWIRL_end)) { rgblight_step(); } else { - rgblight_mode(9); + rgblight_mode(RGBLIGHT_MODE_RAINBOW_SWIRL); } } + #endif return false; case RGB_MODE_SNAKE: + #ifdef RGBLIGHT_EFFECT_SNAKE if (record->event.pressed) { - if ((15 <= rgblight_get_mode()) && (rgblight_get_mode() < 20)) { + if ((RGBLIGHT_MODE_SNAKE <= rgblight_get_mode()) && + (rgblight_get_mode() < RGBLIGHT_MODE_SNAKE_end)) { rgblight_step(); } else { - rgblight_mode(15); + rgblight_mode(RGBLIGHT_MODE_SNAKE); } } + #endif return false; case RGB_MODE_KNIGHT: + #ifdef RGBLIGHT_EFFECT_KNIGHT if (record->event.pressed) { - if ((21 <= rgblight_get_mode()) && (rgblight_get_mode() < 23)) { + if ((RGBLIGHT_MODE_KNIGHT <= rgblight_get_mode()) && + (rgblight_get_mode() < RGBLIGHT_MODE_KNIGHT_end)) { rgblight_step(); } else { - rgblight_mode(21); + rgblight_mode(RGBLIGHT_MODE_KNIGHT); } } + #endif return false; case RGB_MODE_XMAS: + #ifdef RGBLIGHT_EFFECT_CHRISTMAS if (record->event.pressed) { - rgblight_mode(24); + rgblight_mode(RGBLIGHT_MODE_CHRISTMAS); } + #endif return false; case RGB_MODE_GRADIENT: + #ifdef RGBLIGHT_EFFECT_STATIC_GRADIENT if (record->event.pressed) { - if ((25 <= rgblight_get_mode()) && (rgblight_get_mode() < 34)) { + if ((RGBLIGHT_MODE_STATIC_GRADIENT <= rgblight_get_mode()) && + (rgblight_get_mode() < RGBLIGHT_MODE_STATIC_GRADIENT_end)) { rgblight_step(); } else { - rgblight_mode(25); + rgblight_mode(RGBLIGHT_MODE_STATIC_GRADIENT); } } + #endif return false; case RGB_MODE_RGBTEST: + #ifdef RGBLIGHT_EFFECT_RGB_TEST if (record->event.pressed) { - rgblight_mode(35); + rgblight_mode(RGBLIGHT_MODE_RGB_TEST); } + #endif return false; #endif // defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE) #ifdef PROTOCOL_LUFA diff --git a/quantum/quantum.h b/quantum/quantum.h index b4e4de174..d1f761f17 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h @@ -32,6 +32,12 @@ #endif #ifdef RGBLIGHT_ENABLE #include "rgblight.h" +#else + #ifdef RGB_MATRIX_ENABLE + /* dummy define RGBLIGHT_MODE_xxxx */ + #define RGBLIGHT_H_DUMMY_DEFINE + #include "rgblight.h" + #endif #endif #ifdef SPLIT_KEYBOARD diff --git a/quantum/rgblight.c b/quantum/rgblight.c index 4919ae4ab..03f77cc80 100644 --- a/quantum/rgblight.c +++ b/quantum/rgblight.c @@ -14,6 +14,7 @@ * along with this program. If not, see . */ #include +#include #ifdef __AVR__ #include #include @@ -29,23 +30,27 @@ #define RGBLIGHT_LIMIT_VAL 255 #endif +#define _RGBM_SINGLE_STATIC(sym) RGBLIGHT_MODE_ ## sym, +#define _RGBM_SINGLE_DYNAMIC(sym) +#define _RGBM_MULTI_STATIC(sym) RGBLIGHT_MODE_ ## sym, +#define _RGBM_MULTI_DYNAMIC(sym) +#define _RGBM_TMP_STATIC(sym) RGBLIGHT_MODE_ ## sym, +#define _RGBM_TMP_DYNAMIC(sym) +static uint8_t static_effect_table [] = { +#include "rgblight.h" +}; + +static inline int is_static_effect(uint8_t mode) { + return memchr(static_effect_table, mode, sizeof(static_effect_table)) != NULL; +} + #define MIN(a,b) (((a)<(b))?(a):(b)) #define MAX(a,b) (((a)>(b))?(a):(b)) -__attribute__ ((weak)) -const uint8_t RGBLED_BREATHING_INTERVALS[] PROGMEM = {30, 20, 10, 5}; -__attribute__ ((weak)) -const uint8_t RGBLED_RAINBOW_MOOD_INTERVALS[] PROGMEM = {120, 60, 30}; -__attribute__ ((weak)) -const uint8_t RGBLED_RAINBOW_SWIRL_INTERVALS[] PROGMEM = {100, 50, 20}; -__attribute__ ((weak)) -const uint8_t RGBLED_SNAKE_INTERVALS[] PROGMEM = {100, 50, 20}; -__attribute__ ((weak)) -const uint8_t RGBLED_KNIGHT_INTERVALS[] PROGMEM = {127, 63, 31}; +#ifdef RGBLIGHT_EFFECT_STATIC_GRADIENT __attribute__ ((weak)) const uint16_t RGBLED_GRADIENT_RANGES[] PROGMEM = {360, 240, 180, 120, 90}; -__attribute__ ((weak)) -const uint16_t RGBLED_RGBTEST_INTERVALS[] PROGMEM = {1024}; +#endif rgblight_config_t rgblight_config; @@ -129,7 +134,7 @@ void eeconfig_update_rgblight(uint32_t val) { void eeconfig_update_rgblight_default(void) { //dprintf("eeconfig_update_rgblight_default\n"); rgblight_config.enable = 1; - rgblight_config.mode = 1; + rgblight_config.mode = RGBLIGHT_MODE_STATIC_LIGHT; rgblight_config.hue = 0; rgblight_config.sat = 255; rgblight_config.val = RGBLIGHT_LIMIT_VAL; @@ -163,9 +168,9 @@ void rgblight_init(void) { } eeconfig_debug_rgblight(); // display current eeprom values - #ifdef RGBLIGHT_ANIMATIONS +#ifdef RGBLIGHT_USE_TIMER rgblight_timer_init(); // setup the timer - #endif +#endif if (rgblight_config.enable) { rgblight_mode_noeeprom(rgblight_config.mode); @@ -178,9 +183,9 @@ void rgblight_update_dword(uint32_t dword) { if (rgblight_config.enable) rgblight_mode(rgblight_config.mode); else { - #ifdef RGBLIGHT_ANIMATIONS +#ifdef RGBLIGHT_USE_TIMER rgblight_timer_disable(); - #endif +#endif rgblight_set(); } } @@ -195,7 +200,7 @@ void rgblight_increase(void) { void rgblight_decrease(void) { uint8_t mode = 0; // Mode will never be < 1. If it ever is, eeprom needs to be initialized. - if (rgblight_config.mode > 1) { + if (rgblight_config.mode > RGBLIGHT_MODE_STATIC_LIGHT) { mode = rgblight_config.mode - 1; } rgblight_mode(mode); @@ -229,8 +234,8 @@ void rgblight_mode_eeprom_helper(uint8_t mode, bool write_to_eeprom) { if (!rgblight_config.enable) { return; } - if (mode < 1) { - rgblight_config.mode = 1; + if (mode < RGBLIGHT_MODE_STATIC_LIGHT) { + rgblight_config.mode = RGBLIGHT_MODE_STATIC_LIGHT; } else if (mode > RGBLIGHT_MODES) { rgblight_config.mode = RGBLIGHT_MODES; } else { @@ -242,30 +247,14 @@ void rgblight_mode_eeprom_helper(uint8_t mode, bool write_to_eeprom) { } else { xprintf("rgblight mode [NOEEPROM]: %u\n", rgblight_config.mode); } - if (rgblight_config.mode == 1) { - #ifdef RGBLIGHT_ANIMATIONS + if( is_static_effect(rgblight_config.mode) ) { +#ifdef RGBLIGHT_USE_TIMER rgblight_timer_disable(); - #endif - } else if ((rgblight_config.mode >= 2 && rgblight_config.mode <= 24) || - rgblight_config.mode == 35 || rgblight_config.mode == 36) { - // MODE 2-5, breathing - // MODE 6-8, rainbow mood - // MODE 9-14, rainbow swirl - // MODE 15-20, snake - // MODE 21-23, knight - // MODE 24, xmas - // MODE 35 RGB test - // MODE 36, alterating - - #ifdef RGBLIGHT_ANIMATIONS +#endif + } else { +#ifdef RGBLIGHT_USE_TIMER rgblight_timer_enable(); - #endif - } else if (rgblight_config.mode >= 25 && rgblight_config.mode <= 34) { - // MODE 25-34, static gradient - - #ifdef RGBLIGHT_ANIMATIONS - rgblight_timer_disable(); - #endif +#endif } rgblight_sethsv_noeeprom(rgblight_config.hue, rgblight_config.sat, rgblight_config.val); } @@ -317,9 +306,9 @@ void rgblight_disable(void) { rgblight_config.enable = 0; eeconfig_update_rgblight(rgblight_config.raw); xprintf("rgblight disable [EEPROM]: rgblight_config.enable = %u\n", rgblight_config.enable); - #ifdef RGBLIGHT_ANIMATIONS - rgblight_timer_disable(); - #endif +#ifdef RGBLIGHT_USE_TIMER + rgblight_timer_disable(); +#endif wait_ms(50); rgblight_set(); } @@ -327,9 +316,9 @@ void rgblight_disable(void) { void rgblight_disable_noeeprom(void) { rgblight_config.enable = 0; xprintf("rgblight disable [noEEPROM]: rgblight_config.enable = %u\n", rgblight_config.enable); - #ifdef RGBLIGHT_ANIMATIONS +#ifdef RGBLIGHT_USE_TIMER rgblight_timer_disable(); - #endif +#endif _delay_ms(50); rgblight_set(); } @@ -419,24 +408,43 @@ void rgblight_sethsv_noeeprom_old(uint16_t hue, uint8_t sat, uint8_t val) { void rgblight_sethsv_eeprom_helper(uint16_t hue, uint8_t sat, uint8_t val, bool write_to_eeprom) { if (rgblight_config.enable) { - if (rgblight_config.mode == 1) { + if (rgblight_config.mode == RGBLIGHT_MODE_STATIC_LIGHT) { // same static color LED_TYPE tmp_led; sethsv(hue, sat, val, &tmp_led); rgblight_setrgb(tmp_led.r, tmp_led.g, tmp_led.b); } else { // all LEDs in same color - if (rgblight_config.mode >= 2 && rgblight_config.mode <= 5) { + if ( 1 == 0 ) { //dummy + } +#ifdef RGBLIGHT_EFFECT_BREATHING + else if (rgblight_config.mode >= RGBLIGHT_MODE_BREATHING && + rgblight_config.mode <= RGBLIGHT_MODE_BREATHING_end) { // breathing mode, ignore the change of val, use in memory value instead val = rgblight_config.val; - } else if (rgblight_config.mode >= 6 && rgblight_config.mode <= 14) { - // rainbow mood and rainbow swirl, ignore the change of hue + } +#endif +#ifdef RGBLIGHT_EFFECT_RAINBOW_MOOD + else if (rgblight_config.mode >= RGBLIGHT_MODE_RAINBOW_MOOD && + rgblight_config.mode <= RGBLIGHT_MODE_RAINBOW_MOOD_end) { + // rainbow mood, ignore the change of hue hue = rgblight_config.hue; - } else if (rgblight_config.mode >= 25 && rgblight_config.mode <= 34) { + } +#endif +#ifdef RGBLIGHT_EFFECT_RAINBOW_SWIRL + else if (rgblight_config.mode >= RGBLIGHT_MODE_RAINBOW_SWIRL && + rgblight_config.mode <= RGBLIGHT_MODE_RAINBOW_SWIRL_end) { + // rainbow swirl, ignore the change of hue + hue = rgblight_config.hue; + } +#endif +#ifdef RGBLIGHT_EFFECT_STATIC_GRADIENT + else if (rgblight_config.mode >= RGBLIGHT_MODE_STATIC_GRADIENT && + rgblight_config.mode <= RGBLIGHT_MODE_STATIC_GRADIENT_end) { // static gradient uint16_t _hue; - int8_t direction = ((rgblight_config.mode - 25) % 2) ? -1 : 1; - uint16_t range = pgm_read_word(&RGBLED_GRADIENT_RANGES[(rgblight_config.mode - 25) / 2]); + int8_t direction = ((rgblight_config.mode - RGBLIGHT_MODE_STATIC_GRADIENT) % 2) ? -1 : 1; + uint16_t range = pgm_read_word(&RGBLED_GRADIENT_RANGES[(rgblight_config.mode - RGBLIGHT_MODE_STATIC_GRADIENT) / 2]); for (uint8_t i = 0; i < RGBLED_NUM; i++) { _hue = (range / RGBLED_NUM * i * direction + hue + 360) % 360; dprintf("rgblight rainbow set hsv: %u,%u,%d,%u\n", i, _hue, direction, range); @@ -444,6 +452,7 @@ void rgblight_sethsv_eeprom_helper(uint16_t hue, uint8_t sat, uint8_t val, bool } rgblight_set(); } +#endif } rgblight_config.hue = hue; rgblight_config.sat = sat; @@ -528,7 +537,7 @@ void rgblight_set(void) { } #endif -#ifdef RGBLIGHT_ANIMATIONS +#ifdef RGBLIGHT_USE_TIMER // Animation timer -- AVR Timer3 void rgblight_timer_init(void) { @@ -564,41 +573,77 @@ void rgblight_timer_toggle(void) { void rgblight_show_solid_color(uint8_t r, uint8_t g, uint8_t b) { rgblight_enable(); - rgblight_mode(1); + rgblight_mode(RGBLIGHT_MODE_STATIC_LIGHT); rgblight_setrgb(r, g, b); } void rgblight_task(void) { if (rgblight_timer_enabled) { - // mode = 1, static light, do nothing here - if (rgblight_config.mode >= 2 && rgblight_config.mode <= 5) { - // mode = 2 to 5, breathing mode - rgblight_effect_breathing(rgblight_config.mode - 2); - } else if (rgblight_config.mode >= 6 && rgblight_config.mode <= 8) { - // mode = 6 to 8, rainbow mood mod - rgblight_effect_rainbow_mood(rgblight_config.mode - 6); - } else if (rgblight_config.mode >= 9 && rgblight_config.mode <= 14) { - // mode = 9 to 14, rainbow swirl mode - rgblight_effect_rainbow_swirl(rgblight_config.mode - 9); - } else if (rgblight_config.mode >= 15 && rgblight_config.mode <= 20) { - // mode = 15 to 20, snake mode - rgblight_effect_snake(rgblight_config.mode - 15); - } else if (rgblight_config.mode >= 21 && rgblight_config.mode <= 23) { - // mode = 21 to 23, knight mode - rgblight_effect_knight(rgblight_config.mode - 21); - } else if (rgblight_config.mode == 24) { - // mode = 24, christmas mode + // static light mode, do nothing here + if ( 1 == 0 ) { //dummy + } +#ifdef RGBLIGHT_EFFECT_BREATHING + else if (rgblight_config.mode >= RGBLIGHT_MODE_BREATHING && + rgblight_config.mode <= RGBLIGHT_MODE_BREATHING_end) { + // breathing mode + rgblight_effect_breathing(rgblight_config.mode - RGBLIGHT_MODE_BREATHING ); + } +#endif +#ifdef RGBLIGHT_EFFECT_RAINBOW_MOOD + else if (rgblight_config.mode >= RGBLIGHT_MODE_RAINBOW_MOOD && + rgblight_config.mode <= RGBLIGHT_MODE_RAINBOW_MOOD_end) { + // rainbow mood mode + rgblight_effect_rainbow_mood(rgblight_config.mode - RGBLIGHT_MODE_RAINBOW_MOOD); + } +#endif +#ifdef RGBLIGHT_EFFECT_RAINBOW_SWIRL + else if (rgblight_config.mode >= RGBLIGHT_MODE_RAINBOW_SWIRL && + rgblight_config.mode <= RGBLIGHT_MODE_RAINBOW_SWIRL_end) { + // rainbow swirl mode + rgblight_effect_rainbow_swirl(rgblight_config.mode - RGBLIGHT_MODE_RAINBOW_SWIRL); + } +#endif +#ifdef RGBLIGHT_EFFECT_SNAKE + else if (rgblight_config.mode >= RGBLIGHT_MODE_SNAKE && + rgblight_config.mode <= RGBLIGHT_MODE_SNAKE_end) { + // snake mode + rgblight_effect_snake(rgblight_config.mode - RGBLIGHT_MODE_SNAKE); + } +#endif +#ifdef RGBLIGHT_EFFECT_KNIGHT + else if (rgblight_config.mode >= RGBLIGHT_MODE_KNIGHT && + rgblight_config.mode <= RGBLIGHT_MODE_KNIGHT_end) { + // knight mode + rgblight_effect_knight(rgblight_config.mode - RGBLIGHT_MODE_KNIGHT); + } +#endif +#ifdef RGBLIGHT_EFFECT_CHRISTMAS + else if (rgblight_config.mode == RGBLIGHT_MODE_CHRISTMAS) { + // christmas mode rgblight_effect_christmas(); - } else if (rgblight_config.mode == 35) { - // mode = 35, RGB test + } +#endif +#ifdef RGBLIGHT_EFFECT_RGB_TEST + else if (rgblight_config.mode == RGBLIGHT_MODE_RGB_TEST) { + // RGB test mode rgblight_effect_rgbtest(); - } else if (rgblight_config.mode == 36){ + } +#endif +#ifdef RGBLIGHT_EFFECT_ALTERNATING + else if (rgblight_config.mode == RGBLIGHT_MODE_ALTERNATING){ rgblight_effect_alternating(); } +#endif } } +#endif /* RGBLIGHT_USE_TIMER */ + // Effects +#ifdef RGBLIGHT_EFFECT_BREATHING +__attribute__ ((weak)) +const uint8_t RGBLED_BREATHING_INTERVALS[] PROGMEM = {30, 20, 10, 5}; + void rgblight_effect_breathing(uint8_t interval) { static uint8_t pos = 0; static uint16_t last_timer = 0; @@ -609,12 +654,17 @@ void rgblight_effect_breathing(uint8_t interval) { } last_timer = timer_read(); - // http://sean.voisen.org/blog/2011/10/breathing-led-with-arduino/ val = (exp(sin((pos/255.0)*M_PI)) - RGBLIGHT_EFFECT_BREATHE_CENTER/M_E)*(RGBLIGHT_EFFECT_BREATHE_MAX/(M_E-1/M_E)); rgblight_sethsv_noeeprom_old(rgblight_config.hue, rgblight_config.sat, val); pos = (pos + 1) % 256; } +#endif + +#ifdef RGBLIGHT_EFFECT_RAINBOW_MOOD +__attribute__ ((weak)) +const uint8_t RGBLED_RAINBOW_MOOD_INTERVALS[] PROGMEM = {120, 60, 30}; + void rgblight_effect_rainbow_mood(uint8_t interval) { static uint16_t current_hue = 0; static uint16_t last_timer = 0; @@ -626,6 +676,12 @@ void rgblight_effect_rainbow_mood(uint8_t interval) { rgblight_sethsv_noeeprom_old(current_hue, rgblight_config.sat, rgblight_config.val); current_hue = (current_hue + 1) % 360; } +#endif + +#ifdef RGBLIGHT_EFFECT_RAINBOW_SWIRL +__attribute__ ((weak)) +const uint8_t RGBLED_RAINBOW_SWIRL_INTERVALS[] PROGMEM = {100, 50, 20}; + void rgblight_effect_rainbow_swirl(uint8_t interval) { static uint16_t current_hue = 0; static uint16_t last_timer = 0; @@ -651,6 +707,12 @@ void rgblight_effect_rainbow_swirl(uint8_t interval) { } } } +#endif + +#ifdef RGBLIGHT_EFFECT_SNAKE +__attribute__ ((weak)) +const uint8_t RGBLED_SNAKE_INTERVALS[] PROGMEM = {100, 50, 20}; + void rgblight_effect_snake(uint8_t interval) { static uint8_t pos = 0; static uint16_t last_timer = 0; @@ -689,6 +751,12 @@ void rgblight_effect_snake(uint8_t interval) { pos = (pos + 1) % RGBLED_NUM; } } +#endif + +#ifdef RGBLIGHT_EFFECT_KNIGHT +__attribute__ ((weak)) +const uint8_t RGBLED_KNIGHT_INTERVALS[] PROGMEM = {127, 63, 31}; + void rgblight_effect_knight(uint8_t interval) { static uint16_t last_timer = 0; if (timer_elapsed(last_timer) < pgm_read_byte(&RGBLED_KNIGHT_INTERVALS[interval])) { @@ -730,8 +798,9 @@ void rgblight_effect_knight(uint8_t interval) { increment = -increment; } } +#endif - +#ifdef RGBLIGHT_EFFECT_CHRISTMAS void rgblight_effect_christmas(void) { static uint16_t current_offset = 0; static uint16_t last_timer = 0; @@ -748,6 +817,11 @@ void rgblight_effect_christmas(void) { } rgblight_set(); } +#endif + +#ifdef RGBLIGHT_EFFECT_RGB_TEST +__attribute__ ((weak)) +const uint16_t RGBLED_RGBTEST_INTERVALS[] PROGMEM = {1024}; void rgblight_effect_rgbtest(void) { static uint8_t pos = 0; @@ -774,7 +848,9 @@ void rgblight_effect_rgbtest(void) { rgblight_setrgb(r, g, b); pos = (pos + 1) % 3; } +#endif +#ifdef RGBLIGHT_EFFECT_ALTERNATING void rgblight_effect_alternating(void){ static uint16_t last_timer = 0; static uint16_t pos = 0; @@ -795,5 +871,4 @@ void rgblight_effect_alternating(void){ rgblight_set(); pos = (pos + 1) % 2; } - -#endif /* RGBLIGHT_ANIMATIONS */ +#endif diff --git a/quantum/rgblight.h b/quantum/rgblight.h index ba010dfae..d1e00eef3 100644 --- a/quantum/rgblight.h +++ b/quantum/rgblight.h @@ -16,11 +16,23 @@ #ifndef RGBLIGHT_H #define RGBLIGHT_H -#ifdef RGBLIGHT_ANIMATIONS - #define RGBLIGHT_MODES 36 -#else - #define RGBLIGHT_MODES 1 -#endif +#include "rgblight_reconfig.h" + +#define _RGBM_SINGLE_STATIC(sym) RGBLIGHT_MODE_ ## sym, +#define _RGBM_SINGLE_DYNAMIC(sym) RGBLIGHT_MODE_ ## sym, +#define _RGBM_MULTI_STATIC(sym) RGBLIGHT_MODE_ ## sym, +#define _RGBM_MULTI_DYNAMIC(sym) RGBLIGHT_MODE_ ## sym, +#define _RGBM_TMP_STATIC(sym) RGBLIGHT_MODE_ ## sym, +#define _RGBM_TMP_DYNAMIC(sym) RGBLIGHT_MODE_ ## sym, +enum RGBLIGHT_EFFECT_MODE { + RGBLIGHT_MODE_zero = 0, +#include "rgblight.h" + RGBLIGHT_MODE_last +}; + +#ifndef RGBLIGHT_H_DUMMY_DEFINE + +#define RGBLIGHT_MODES (RGBLIGHT_MODE_last-1) #ifndef RGBLIGHT_EFFECT_BREATHE_CENTER #define RGBLIGHT_EFFECT_BREATHE_CENTER 1.85 // 1-2.7 @@ -168,4 +180,69 @@ void rgblight_effect_christmas(void); void rgblight_effect_rgbtest(void); void rgblight_effect_alternating(void); +#endif // #ifndef RGBLIGHT_H_DUMMY_DEFINE +#endif // RGBLIGHT_H + +#ifdef _RGBM_SINGLE_STATIC + _RGBM_SINGLE_STATIC( STATIC_LIGHT ) + #ifdef RGBLIGHT_EFFECT_BREATHING + _RGBM_MULTI_DYNAMIC( BREATHING ) + _RGBM_TMP_DYNAMIC( breathing_3 ) + _RGBM_TMP_DYNAMIC( breathing_4 ) + _RGBM_TMP_DYNAMIC( BREATHING_end ) + #endif + #ifdef RGBLIGHT_EFFECT_RAINBOW_MOOD + _RGBM_MULTI_DYNAMIC( RAINBOW_MOOD ) + _RGBM_TMP_DYNAMIC( rainbow_mood_7 ) + _RGBM_TMP_DYNAMIC( RAINBOW_MOOD_end ) + #endif + #ifdef RGBLIGHT_EFFECT_RAINBOW_SWIRL + _RGBM_MULTI_DYNAMIC( RAINBOW_SWIRL ) + _RGBM_TMP_DYNAMIC( rainbow_swirl_10 ) + _RGBM_TMP_DYNAMIC( rainbow_swirl_11 ) + _RGBM_TMP_DYNAMIC( rainbow_swirl_12 ) + _RGBM_TMP_DYNAMIC( rainbow_swirl_13 ) + _RGBM_TMP_DYNAMIC( RAINBOW_SWIRL_end ) + #endif + #ifdef RGBLIGHT_EFFECT_SNAKE + _RGBM_MULTI_DYNAMIC( SNAKE ) + _RGBM_TMP_DYNAMIC( snake_16 ) + _RGBM_TMP_DYNAMIC( snake_17 ) + _RGBM_TMP_DYNAMIC( snake_18 ) + _RGBM_TMP_DYNAMIC( snake_19 ) + _RGBM_TMP_DYNAMIC( SNAKE_end ) + #endif + #ifdef RGBLIGHT_EFFECT_KNIGHT + _RGBM_MULTI_DYNAMIC( KNIGHT ) + _RGBM_TMP_DYNAMIC( knight_22 ) + _RGBM_TMP_DYNAMIC( KNIGHT_end ) + #endif + #ifdef RGBLIGHT_EFFECT_CHRISTMAS + _RGBM_SINGLE_DYNAMIC( CHRISTMAS ) + #endif + #ifdef RGBLIGHT_EFFECT_STATIC_GRADIENT + _RGBM_MULTI_STATIC( STATIC_GRADIENT ) + _RGBM_TMP_STATIC( static_gradient_26 ) + _RGBM_TMP_STATIC( static_gradient_27 ) + _RGBM_TMP_STATIC( static_gradient_28 ) + _RGBM_TMP_STATIC( static_gradient_29 ) + _RGBM_TMP_STATIC( static_gradient_30 ) + _RGBM_TMP_STATIC( static_gradient_31 ) + _RGBM_TMP_STATIC( static_gradient_32 ) + _RGBM_TMP_STATIC( static_gradient_33 ) + _RGBM_TMP_STATIC( STATIC_GRADIENT_end ) + #endif + #ifdef RGBLIGHT_EFFECT_RGB_TEST + _RGBM_SINGLE_DYNAMIC( RGB_TEST ) + #endif + #ifdef RGBLIGHT_EFFECT_ALTERNATING + _RGBM_SINGLE_DYNAMIC( ALTERNATING ) + #endif #endif + +#undef _RGBM_SINGLE_STATIC +#undef _RGBM_SINGLE_DYNAMIC +#undef _RGBM_MULTI_STATIC +#undef _RGBM_MULTI_DYNAMIC +#undef _RGBM_TMP_STATIC +#undef _RGBM_TMP_DYNAMIC diff --git a/quantum/rgblight_reconfig.h b/quantum/rgblight_reconfig.h new file mode 100644 index 000000000..11bd4fd11 --- /dev/null +++ b/quantum/rgblight_reconfig.h @@ -0,0 +1,36 @@ +#ifndef RGBLIGHT_RECONFIG_H +#define RGBLIGHT_RECONFIG_H + +#ifdef RGBLIGHT_ANIMATIONS + // for backward compatibility + #define RGBLIGHT_EFFECT_BREATHING + #define RGBLIGHT_EFFECT_RAINBOW_MOOD + #define RGBLIGHT_EFFECT_RAINBOW_SWIRL + #define RGBLIGHT_EFFECT_SNAKE + #define RGBLIGHT_EFFECT_KNIGHT + #define RGBLIGHT_EFFECT_CHRISTMAS + #define RGBLIGHT_EFFECT_STATIC_GRADIENT + #define RGBLIGHT_EFFECT_RGB_TEST + #define RGBLIGHT_EFFECT_ALTERNATING +#endif + +#ifdef RGBLIGHT_STATIC_PATTERNS + #define RGBLIGHT_EFFECT_STATIC_GRADIENT +#endif + +// check dynamic animation effects chose ? +#if defined(RGBLIGHT_EFFECT_BREATHING) || \ + defined(RGBLIGHT_EFFECT_RAINBOW_MOOD) || \ + defined(RGBLIGHT_EFFECT_RAINBOW_SWIRL) || \ + defined(RGBLIGHT_EFFECT_SNAKE) || \ + defined(RGBLIGHT_EFFECT_KNIGHT) || \ + defined(RGBLIGHT_EFFECT_CHRISTMAS) || \ + defined(RGBLIGHT_EFFECT_RGB_TEST) || \ + defined(RGBLIGHT_EFFECT_ALTERNATING) + #define RGBLIGHT_USE_TIMER + #ifndef RGBLIGHT_ANIMATIONS + #define RGBLIGHT_ANIMATIONS // for backward compatibility + #endif +#endif + +#endif // RGBLIGHT_RECONFIG_H diff --git a/tmk_core/common/avr/suspend.c b/tmk_core/common/avr/suspend.c index 73fdda6cc..d7a7f049c 100644 --- a/tmk_core/common/avr/suspend.c +++ b/tmk_core/common/avr/suspend.c @@ -10,6 +10,7 @@ #include "timer.h" #include "led.h" #include "host.h" +#include "rgblight_reconfig.h" #ifdef PROTOCOL_LUFA #include "lufa.h" diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index cb918d3dc..95e0b95b2 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -54,6 +54,7 @@ #include "quantum.h" #include #include "outputselect.h" +#include "rgblight_reconfig.h" #ifdef NKRO_ENABLE #include "keycode_config.h" From 170de1273cde78d93b3f955aca133a4d690742b2 Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Thu, 13 Sep 2018 11:22:05 -0700 Subject: [PATCH 091/788] Add an easy way to create new keymaps for your favorite keyboard (#3868) * initial commit of keymap creation script * create default keymap * pass shellcheck * provide a better usage message * change printf string to more accurately reflect the path * make it more easily understood * found another typo * add documentation regarding the new_keymap script * enforce lowercase for userinputs --- docs/newbs_building_firmware.md | 14 ++++++++++++ util/new_keymap.sh | 40 +++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100755 util/new_keymap.sh diff --git a/docs/newbs_building_firmware.md b/docs/newbs_building_firmware.md index f227d623f..ac6bff2bc 100644 --- a/docs/newbs_building_firmware.md +++ b/docs/newbs_building_firmware.md @@ -22,6 +22,20 @@ Start by navigating to the `keymaps` folder for your keyboard. Once you have the `keymaps` folder open you will want to create a copy of the `default` folder. We highly recommend you name your folder the same as your GitHub username, but you can use any name you want as long as it contains only lower case letters, numbers, and the underscore character. +To automate the process, you also have the option to run the `new_keymap.sh` script. + +Navigate to the `qmk_firmware/util` directory and type the following: + +``` +./new_keymap.sh +``` + +For example, for a user named John, trying to make a new keymap for the 1up60hse, they would type in + +``` +./new_keymap.sh 1upkeyboards/1up60hse john +``` + ## Open `keymap.c` In Your Favorite Text Editor Open up your `keymap.c`. Inside this file you'll find the structure that controls how your keyboard behaves. At the top of `keymap.c` there may be some defines and enums that make the keymap easier to read. Farther down you'll find a line that looks like this: diff --git a/util/new_keymap.sh b/util/new_keymap.sh new file mode 100755 index 000000000..b09f3dd0c --- /dev/null +++ b/util/new_keymap.sh @@ -0,0 +1,40 @@ +#!/bin/sh +# Script to make a new keymap for a keyboard of your choosing +# This script automates the copying of the default keymap into +# your own keymap + +KB_PATH=$(echo "$1" | tr 'A-Z' 'a-z') +USERNAME=$(echo "$2" | tr 'A-Z' 'a-z') + +if [ -z "$KB_PATH" ]; then + printf "Usage: %s \n" "$0" + printf "Example: %s 1upkeyboards/1up60hse yourname\n" "$0" + exit 1 +fi + +if [ -z "$USERNAME" ]; then + printf "Usage: %s \n" "$0" + printf "Example: %s 1upkeyboards/1up60hse yourname\n" "$0" + exit 1 +fi + +cd .. + +if [ ! -d "keyboards/$KB_PATH" ]; then + printf "Error! keyboards/%s does not exist!\n" "$KB_PATH" + exit 1 +fi + +if [ -d "keyboards/$KB_PATH/keymaps/$USERNAME" ]; then + printf "Error! keyboards/%s/keymaps/%s already exists!\n" "$KB_PATH" "$USERNAME" + exit 1 +fi + +# Recursively copy the chosen keyboard's default keymap +cp -r keyboards/"$KB_PATH"/keymaps/default keyboards/"$KB_PATH"/keymaps/"$USERNAME" + +printf "%s keymap directory created in: qmk_firmware/keyboards/%s/keymaps/\n\n" "$USERNAME" "$KB_PATH" + +printf "Compile a firmware file with your new keymap by typing: \n" +printf " make %s:%s\n" "$KB_PATH" "$USERNAME" +printf "from the qmk_firmware directory\n" \ No newline at end of file From 48a992f1c037658bbacccefd2709ffdcda8bb345 Mon Sep 17 00:00:00 2001 From: Wilba6582 Date: Fri, 14 Sep 2018 04:37:13 +1000 Subject: [PATCH 092/788] Zeal60/Zeal65/M60-A implementation (#3879) * Initial version of zeal60 * WIP * Fixes issue #900 * Adding RGB underglow functionality. Fixed a compile-time conflict caused by enabling RGB underglow functionality. * Refactor RPC protocol * Fix last merge * README for RGB underglow updated. * Additional README changes. * Adding RGBW strip software-based current-limiting functionality. * RGBW current-limiting functionality should be handled by RGBSTRIP_MAX_CURRENT_PER_LIGHT instead. * Updated README to reflect implementation of built-in current limiting. * Keymap readability improvements. * Minor keymap improvements. * Fixed LED driver init sequence, formatting * Dimming implementation tested, working. * Stab LEDs synced with spacebar hits in effects. * RGB underglow tested and functional. Simplified README for RGB underglow. * Undid accidental file deletion from previous merge conflict. Safer values for RGB underglow. * Improved arrow key positions in keymap. * Added functionality to correct uneven RGB underglow. Refactored related code. * Reverted to safer values for underglow. * Changes for v0.3 * Custom LED brightness scaling will take place after current adjustment in order to avoid being overridden. * Create keymap.c Added split backspace and split shift to ISO layout * Create config.h Turned on LEDs for new layout * Fixed bug where left spacebar stabilizer LED (LC06) would adopt color of row above. * Added hhkb_wilba keymap * Update keymap.c * Update keymap.c * Update keymap.c * Added indicators, full param setting via host * Added "mousekey" layout * Added Zeal65 support, factory test mode * Keycode safe range changed, caused bugs * Bumped EEPROM version due to change in QMK keycodes * Disable HHKB "blocked" LEDs if KC_NO in keymap * Added "disable_hhkb_blocker_leds" * Required overridden function for keymaps in EEPROM * Added polar coordinate mapping, effect speed * Force Raw HID interface number to 1 always * Fixed last merge from master * Added effect speed to default keymaps * add BACKLIGHT_ prefix to vars * add BACKLIGHT_ prefix to vars * Keymap speed effect; keymap improvements/fixes Readme updated to match changes * Refactored to use common IS31FL3731/I2C drivers * Fixed make rules, backlight disabled feature * Make split rightshift default for Zeal65 * Added M60-A as a "version" of Zeal60. * Renamed IS31FL3731 driver functions * Fix suspend_wakeup_init_kb() being defined twice * First pass refactor dynamic keymaps * Updated to changed I2C and ISSI drivers * Refactor zeal_color.* usage to quantum/color.* * Updated Zeal65, fixed dynamic_keymap * Major refactoring of Zeal60 backlight and API * Lots of little cleanups * Added readme.md * Added readme.md * Added LAYOUT_60*() macros, refactored and cleaned up default keymaps * Fix compile error in suspend.c * Added Zeal65 LAYOUT macros, info.json * Added rama/m60_a, deleted zeal60/keymaps/m60_a * Fixed rama/m60_a/keymaps/proto * Fixed compilation error for suspend.c * Requested changes for PR * Fixed readme.md images * Another readme.md fix * Added drashna's requested changes --- common_features.mk | 5 + keyboards/rama/m60_a/config.h | 128 ++ keyboards/rama/m60_a/info.json | 13 + keyboards/rama/m60_a/keymaps/default/keymap.c | 40 + keyboards/rama/m60_a/keymaps/proto/config.h | 5 + keyboards/rama/m60_a/keymaps/proto/keymap.c | 40 + keyboards/rama/m60_a/m60_a.c | 18 + keyboards/rama/m60_a/m60_a.h | 37 + keyboards/rama/m60_a/readme.md | 15 + keyboards/rama/m60_a/rules.mk | 79 + keyboards/zeal60/config.h | 125 ++ keyboards/zeal60/info.json | 25 + .../keymaps/ansi_split_bs_rshift/config.h | 21 + .../keymaps/ansi_split_bs_rshift/keymap.c | 38 + keyboards/zeal60/keymaps/default/config.h | 20 + keyboards/zeal60/keymaps/default/keymap.c | 38 + keyboards/zeal60/keymaps/hhkb/config.h | 20 + keyboards/zeal60/keymaps/hhkb/keymap.c | 38 + keyboards/zeal60/keymaps/iso/config.h | 20 + keyboards/zeal60/keymaps/iso/keymap.c | 38 + keyboards/zeal60/keymaps/ryanmaclean/config.h | 21 + keyboards/zeal60/keymaps/ryanmaclean/keymap.c | 84 + keyboards/zeal60/keymaps/tusing/Makefile | 6 + keyboards/zeal60/keymaps/tusing/README.md | 80 + keyboards/zeal60/keymaps/tusing/config.h | 40 + keyboards/zeal60/keymaps/tusing/keymap.c | 49 + keyboards/zeal60/readme.md | 47 + keyboards/zeal60/rgb_backlight.c | 1519 +++++++++++++++++ keyboards/zeal60/rgb_backlight.h | 101 ++ keyboards/zeal60/rgb_backlight_api.h | 42 + keyboards/zeal60/rgb_backlight_keycodes.h | 34 + keyboards/zeal60/rules.mk | 78 + keyboards/zeal60/zeal60.c | 341 ++++ keyboards/zeal60/zeal60.h | 93 + keyboards/zeal60/zeal60_api.h | 33 + keyboards/zeal60/zeal60_keycodes.h | 42 + keyboards/zeal65/config.h | 125 ++ keyboards/zeal65/info.json | 16 + keyboards/zeal65/keymaps/default/config.h | 5 + keyboards/zeal65/keymaps/default/keymap.c | 38 + keyboards/zeal65/keymaps/split_bs/config.h | 5 + keyboards/zeal65/keymaps/split_bs/keymap.c | 38 + keyboards/zeal65/readme.md | 16 + keyboards/zeal65/rules.mk | 79 + keyboards/zeal65/zeal65.c | 18 + keyboards/zeal65/zeal65.h | 50 + quantum/dynamic_keymap.c | 97 ++ quantum/dynamic_keymap.h | 31 + tmk_core/common/avr/suspend.c | 37 +- 49 files changed, 3912 insertions(+), 16 deletions(-) create mode 100644 keyboards/rama/m60_a/config.h create mode 100644 keyboards/rama/m60_a/info.json create mode 100644 keyboards/rama/m60_a/keymaps/default/keymap.c create mode 100644 keyboards/rama/m60_a/keymaps/proto/config.h create mode 100644 keyboards/rama/m60_a/keymaps/proto/keymap.c create mode 100644 keyboards/rama/m60_a/m60_a.c create mode 100644 keyboards/rama/m60_a/m60_a.h create mode 100644 keyboards/rama/m60_a/readme.md create mode 100644 keyboards/rama/m60_a/rules.mk create mode 100644 keyboards/zeal60/config.h create mode 100644 keyboards/zeal60/info.json create mode 100644 keyboards/zeal60/keymaps/ansi_split_bs_rshift/config.h create mode 100644 keyboards/zeal60/keymaps/ansi_split_bs_rshift/keymap.c create mode 100644 keyboards/zeal60/keymaps/default/config.h create mode 100644 keyboards/zeal60/keymaps/default/keymap.c create mode 100644 keyboards/zeal60/keymaps/hhkb/config.h create mode 100644 keyboards/zeal60/keymaps/hhkb/keymap.c create mode 100644 keyboards/zeal60/keymaps/iso/config.h create mode 100644 keyboards/zeal60/keymaps/iso/keymap.c create mode 100644 keyboards/zeal60/keymaps/ryanmaclean/config.h create mode 100644 keyboards/zeal60/keymaps/ryanmaclean/keymap.c create mode 100644 keyboards/zeal60/keymaps/tusing/Makefile create mode 100644 keyboards/zeal60/keymaps/tusing/README.md create mode 100644 keyboards/zeal60/keymaps/tusing/config.h create mode 100644 keyboards/zeal60/keymaps/tusing/keymap.c create mode 100644 keyboards/zeal60/readme.md create mode 100644 keyboards/zeal60/rgb_backlight.c create mode 100644 keyboards/zeal60/rgb_backlight.h create mode 100644 keyboards/zeal60/rgb_backlight_api.h create mode 100644 keyboards/zeal60/rgb_backlight_keycodes.h create mode 100644 keyboards/zeal60/rules.mk create mode 100644 keyboards/zeal60/zeal60.c create mode 100644 keyboards/zeal60/zeal60.h create mode 100644 keyboards/zeal60/zeal60_api.h create mode 100644 keyboards/zeal60/zeal60_keycodes.h create mode 100644 keyboards/zeal65/config.h create mode 100644 keyboards/zeal65/info.json create mode 100644 keyboards/zeal65/keymaps/default/config.h create mode 100644 keyboards/zeal65/keymaps/default/keymap.c create mode 100644 keyboards/zeal65/keymaps/split_bs/config.h create mode 100644 keyboards/zeal65/keymaps/split_bs/keymap.c create mode 100644 keyboards/zeal65/readme.md create mode 100644 keyboards/zeal65/rules.mk create mode 100644 keyboards/zeal65/zeal65.c create mode 100644 keyboards/zeal65/zeal65.h create mode 100644 quantum/dynamic_keymap.c create mode 100644 quantum/dynamic_keymap.h diff --git a/common_features.mk b/common_features.mk index e0d4ca297..c637582d4 100644 --- a/common_features.mk +++ b/common_features.mk @@ -227,6 +227,11 @@ ifeq ($(strip $(HD44780_ENABLE)), yes) OPT_DEFS += -DHD44780_ENABLE endif +ifeq ($(strip $(DYNAMIC_KEYMAP_ENABLE)), yes) + OPT_DEFS += -DDYNAMIC_KEYMAP_ENABLE + SRC += $(QUANTUM_DIR)/dynamic_keymap.c +endif + QUANTUM_SRC:= \ $(QUANTUM_DIR)/quantum.c \ $(QUANTUM_DIR)/keymap_common.c \ diff --git a/keyboards/rama/m60_a/config.h b/keyboards/rama/m60_a/config.h new file mode 100644 index 000000000..45e7d8896 --- /dev/null +++ b/keyboards/rama/m60_a/config.h @@ -0,0 +1,128 @@ +/* Copyright 2017 Jason Williams (Wilba) + * + * 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 . + */ +#pragma once + +#include "config_common.h" + +// USB Device descriptor parameter +#define VENDOR_ID 0xFEED // This is same as Zeal60 for now +#define PRODUCT_ID 0x6060 // This is same as Zeal60 for now +#define DEVICE_VER 0x0001 +#define MANUFACTURER RAMA.WORKS +#define PRODUCT RAMA M60-A +#define DESCRIPTION RAMA M60-A Keyboard + + + +// key matrix size +#define MATRIX_ROWS 5 +#define MATRIX_COLS 14 + +// Zeal60 PCB default pin-out +#define MATRIX_ROW_PINS { F0, F1, F4, F6, F7 } +#define MATRIX_COL_PINS { F5, D5, B1, B2, B3, D3, D2, C7, C6, B6, B5, B4, D7, D6 } +#define UNUSED_PINS + +// IS31FL3731 driver +#define DRIVER_COUNT 2 +#define DRIVER_LED_TOTAL 72 + +// COL2ROW or ROW2COL +#define DIODE_DIRECTION COL2ROW + +// Set 0 if debouncing isn't needed +#define DEBOUNCING_DELAY 5 + +// 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 + +// key combination for command +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* + * 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 + +#define RGB_BACKLIGHT_ENABLED 1 + +// This conditionally compiles the backlight code for M60-A specifics +#define RGB_BACKLIGHT_M60_A + +// enable/disable LEDs based on layout +// they aren't really used if RGB_BACKLIGHT_M60_A defined +#define RGB_BACKLIGHT_USE_SPLIT_BACKSPACE 1 +#define RGB_BACKLIGHT_USE_SPLIT_LEFT_SHIFT 0 +#define RGB_BACKLIGHT_USE_SPLIT_RIGHT_SHIFT 1 +#define RGB_BACKLIGHT_USE_7U_SPACEBAR 1 +#define RGB_BACKLIGHT_USE_ISO_ENTER 0 +#define RGB_BACKLIGHT_DISABLE_HHKB_BLOCKER_LEDS 1 + +// disable backlight when USB suspended (PC sleep/hibernate/shutdown) +#define RGB_BACKLIGHT_DISABLE_WHEN_USB_SUSPENDED 0 + +// disable backlight after timeout in minutes, 0 = no timeout +#define RGB_BACKLIGHT_DISABLE_AFTER_TIMEOUT 0 + +// the default effect (RGB test) +#define RGB_BACKLIGHT_EFFECT 255 + +// These define which keys in the matrix are alphas/mods +// Used for backlight effects so colors are different for +// alphas vs. mods +// Each value is for a row, bit 0 is column 0 +// Alpha=0 Mod=1 +#define RGB_BACKLIGHT_ALPHAS_MODS_ROW_0 0b0000000000000001 +#define RGB_BACKLIGHT_ALPHAS_MODS_ROW_1 0b0010000000000001 +#define RGB_BACKLIGHT_ALPHAS_MODS_ROW_2 0b0011000000000001 +#define RGB_BACKLIGHT_ALPHAS_MODS_ROW_3 0b0011000000000001 +#define RGB_BACKLIGHT_ALPHAS_MODS_ROW_4 0b0011100000000111 + +#define DYNAMIC_KEYMAP_LAYER_COUNT 4 + +// EEPROM usage + +// TODO: refactor with new user EEPROM code (coming soon) +#define EEPROM_MAGIC 0x451F +#define EEPROM_MAGIC_ADDR 32 +// Bump this every time we change what we store +// This will automatically reset the EEPROM with defaults +// and avoid loading invalid data from the EEPROM +#define EEPROM_VERSION 0x07 +#define EEPROM_VERSION_ADDR 34 + +// Backlight config starts after EEPROM version +#define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 35 +// Dynamic keymap starts after backlight config (35+37) +#define DYNAMIC_KEYMAP_EEPROM_ADDR 72 + diff --git a/keyboards/rama/m60_a/info.json b/keyboards/rama/m60_a/info.json new file mode 100644 index 000000000..577becd21 --- /dev/null +++ b/keyboards/rama/m60_a/info.json @@ -0,0 +1,13 @@ +{ + "keyboard_name": "M60-A", + "url": "", + "maintainer": "Wilba", + "bootloader": "DFU", + "width": 15, + "height": 5, + "layouts": { + "LAYOUT_60_hhkb": { + "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"|", "x":13, "y":0}, {"label":"~", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"Delete", "x":13.5, "y":1, "w":1.5}, {"label":"Control", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"label":"Fn", "x":14, "y":3}, {"label":"Os", "x":1.5, "y":4}, {"label":"Alt", "x":2.5, "y":4, "w":1.5}, {"x":4, "y":4, "w":7}, {"label":"Alt", "x":11, "y":4, "w":1.5}, {"label":"Os", "x":12.5, "y":4}] + } + } +} \ No newline at end of file diff --git a/keyboards/rama/m60_a/keymaps/default/keymap.c b/keyboards/rama/m60_a/keymaps/default/keymap.c new file mode 100644 index 000000000..7b6d9b756 --- /dev/null +++ b/keyboards/rama/m60_a/keymaps/default/keymap.c @@ -0,0 +1,40 @@ +// M60-A layout +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +// Default layer +[0] = LAYOUT_60_hhkb( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_DEL, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, FN_MO13, + KC_LGUI, KC_LALT, KC_SPC, KC_RALT, FN_MO23), + +// Fn1 Layer +[1] = LAYOUT_60_hhkb( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, + KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, KC_TRNS, KC_TRNS, + KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_EJCT, KC_TRNS, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +// Fn2 Layer +[2] = LAYOUT_60_hhkb( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +// Fn3 Layer (zeal60 Configuration) +[3] = LAYOUT_60_hhkb( + KC_TRNS, EF_DEC, EF_INC, H1_DEC, H1_INC, H2_DEC, H2_INC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, BR_DEC, BR_INC, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, S1_DEC, S1_INC, S2_DEC, S2_INC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, ES_DEC, ES_INC, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +}; + + diff --git a/keyboards/rama/m60_a/keymaps/proto/config.h b/keyboards/rama/m60_a/keymaps/proto/config.h new file mode 100644 index 000000000..54a185ff1 --- /dev/null +++ b/keyboards/rama/m60_a/keymaps/proto/config.h @@ -0,0 +1,5 @@ +#pragma once + +// This fixes the diodes mounted reversed (fab fail) on M60-A prototype +#undef DIODE_DIRECTION +#define DIODE_DIRECTION ROW2COL diff --git a/keyboards/rama/m60_a/keymaps/proto/keymap.c b/keyboards/rama/m60_a/keymaps/proto/keymap.c new file mode 100644 index 000000000..7b6d9b756 --- /dev/null +++ b/keyboards/rama/m60_a/keymaps/proto/keymap.c @@ -0,0 +1,40 @@ +// M60-A layout +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +// Default layer +[0] = LAYOUT_60_hhkb( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_DEL, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, FN_MO13, + KC_LGUI, KC_LALT, KC_SPC, KC_RALT, FN_MO23), + +// Fn1 Layer +[1] = LAYOUT_60_hhkb( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, + KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, KC_TRNS, KC_TRNS, + KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_EJCT, KC_TRNS, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +// Fn2 Layer +[2] = LAYOUT_60_hhkb( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +// Fn3 Layer (zeal60 Configuration) +[3] = LAYOUT_60_hhkb( + KC_TRNS, EF_DEC, EF_INC, H1_DEC, H1_INC, H2_DEC, H2_INC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, BR_DEC, BR_INC, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, S1_DEC, S1_INC, S2_DEC, S2_INC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, ES_DEC, ES_INC, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +}; + + diff --git a/keyboards/rama/m60_a/m60_a.c b/keyboards/rama/m60_a/m60_a.c new file mode 100644 index 000000000..80a98460d --- /dev/null +++ b/keyboards/rama/m60_a/m60_a.c @@ -0,0 +1,18 @@ +/* Copyright 2017 Jason Williams (Wilba) + * + * 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 . + */ +#ifndef RGB_BACKLIGHT_M60_A +#error RGB_BACKLIGHT_M60_A not defined, you done goofed somehao, brah +#endif diff --git a/keyboards/rama/m60_a/m60_a.h b/keyboards/rama/m60_a/m60_a.h new file mode 100644 index 000000000..3caab6ac0 --- /dev/null +++ b/keyboards/rama/m60_a/m60_a.h @@ -0,0 +1,37 @@ +/* Copyright 2017 Jason Williams (Wilba) + * + * 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 . + */ +#pragma once + +#include "quantum.h" +#include "../../zeal60/rgb_backlight_keycodes.h" +#include "../../zeal60/zeal60_keycodes.h" + +#define XXX KC_NO + +#define LAYOUT_60_hhkb( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K2D, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \ + K41, K42, K47, K4B, K4C \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D }, \ + { K30, XXX, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D }, \ + { XXX, K41, K42, XXX, XXX, XXX, XXX, K47, XXX, XXX, XXX, K4B, K4C, XXX } \ +} + diff --git a/keyboards/rama/m60_a/readme.md b/keyboards/rama/m60_a/readme.md new file mode 100644 index 000000000..fe54f0163 --- /dev/null +++ b/keyboards/rama/m60_a/readme.md @@ -0,0 +1,15 @@ +# RAMA M60-A + +![RAMA M60-A](https://static1.squarespace.com/static/563c788ae4b099120ae219e2/t/5aafa6a20e2e7254480b21bf/1535873164793/RAMA-M60-A-03.688.jpg?format=1500w) + +The M60-A represents the benchmark and equilibrium between function and design for us at Rama Works. The gently exaggerated design of the frame is not understated, but rather provocative. Inspiration and evolution from previous models are evident in the beautifully articulated design and the well defined aesthetic, the fingerprint of our 'Industrial Modern' designs. The M60-A offers a unique contender in the traditional 60% form factor. [More info at RAMA WORKS](https://rama.works/m60-a/) + +Keyboard Maintainer: [Wilba6582](https://github.com/Wilba6582) +Hardware Supported: RAMA M60-A PCB +Hardware Availability: [RAMA WORKS Store](https://ramaworks.store/) + +Make example for this keyboard (after setting up your build environment): + + make rama/m60_a:default + +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). \ No newline at end of file diff --git a/keyboards/rama/m60_a/rules.mk b/keyboards/rama/m60_a/rules.mk new file mode 100644 index 000000000..02617cf1c --- /dev/null +++ b/keyboards/rama/m60_a/rules.mk @@ -0,0 +1,79 @@ + + +# project specific files +SRC = ../zeal60/zeal60.c \ + ../zeal60/rgb_backlight.c \ + quantum/color.c \ + drivers/issi/is31fl3731.c \ + drivers/avr/i2c_master.c + +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + +# Boot Section +BOOTLOADER = atmel-dfu + +# Do not put the microcontroller into power saving mode +# when we get USB suspend event. We want it to keep updating +# backlight effects. +OPT_DEFS += -DNO_SUSPEND_POWER_DOWN + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +RAW_ENABLE = yes +DYNAMIC_KEYMAP_ENABLE = yes +CIE1931_CURVE = yes + diff --git a/keyboards/zeal60/config.h b/keyboards/zeal60/config.h new file mode 100644 index 000000000..baa4978a8 --- /dev/null +++ b/keyboards/zeal60/config.h @@ -0,0 +1,125 @@ +/* Copyright 2017 Jason Williams (Wilba) + * + * 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 . + */ +#pragma once + +#include "config_common.h" + +// USB Device descriptor parameter +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER ZealPC +#define PRODUCT Zeal60 +#define DESCRIPTION Zeal60 (QMK Firmware) + +// key matrix size +#define MATRIX_ROWS 5 +#define MATRIX_COLS 14 + +// Zeal60 PCB default pin-out +#define MATRIX_ROW_PINS { F0, F1, F4, F6, F7 } +#define MATRIX_COL_PINS { F5, D5, B1, B2, B3, D3, D2, C7, C6, B6, B5, B4, D7, D6 } +#define UNUSED_PINS + +// IS31FL3731 driver +#define DRIVER_COUNT 2 +#define DRIVER_LED_TOTAL 72 + +// COL2ROW or ROW2COL +#define DIODE_DIRECTION COL2ROW + +// Set 0 if debouncing isn't needed +#define DEBOUNCING_DELAY 5 + +// 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 + +// key combination for command +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* + * 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 + +#define RGB_BACKLIGHT_ENABLED 1 + +// This conditionally compiles the backlight code for Zeal60 specifics +#define RGB_BACKLIGHT_ZEAL60 + +// enable/disable LEDs based on layout +#define RGB_BACKLIGHT_USE_SPLIT_BACKSPACE 0 +#define RGB_BACKLIGHT_USE_SPLIT_LEFT_SHIFT 0 +#define RGB_BACKLIGHT_USE_SPLIT_RIGHT_SHIFT 0 +#define RGB_BACKLIGHT_USE_7U_SPACEBAR 0 +#define RGB_BACKLIGHT_USE_ISO_ENTER 0 +#define RGB_BACKLIGHT_DISABLE_HHKB_BLOCKER_LEDS 0 + +// disable backlight when USB suspended (PC sleep/hibernate/shutdown) +#define RGB_BACKLIGHT_DISABLE_WHEN_USB_SUSPENDED 0 + +// disable backlight after timeout in minutes, 0 = no timeout +#define RGB_BACKLIGHT_DISABLE_AFTER_TIMEOUT 0 + +// the default effect (RGB test) +#define RGB_BACKLIGHT_EFFECT 255 + +// These define which keys in the matrix are alphas/mods +// Used for backlight effects so colors are different for +// alphas vs. mods +// Each value is for a row, bit 0 is column 0 +// Alpha=0 Mod=1 +#define RGB_BACKLIGHT_ALPHAS_MODS_ROW_0 0b0010000000000001 +#define RGB_BACKLIGHT_ALPHAS_MODS_ROW_1 0b0000000000000001 +#define RGB_BACKLIGHT_ALPHAS_MODS_ROW_2 0b0001000000000001 +#define RGB_BACKLIGHT_ALPHAS_MODS_ROW_3 0b0011000000000001 +#define RGB_BACKLIGHT_ALPHAS_MODS_ROW_4 0b0011110000000111 + +#define DYNAMIC_KEYMAP_LAYER_COUNT 4 + +// EEPROM usage + +// TODO: refactor with new user EEPROM code (coming soon) +#define EEPROM_MAGIC 0x451F +#define EEPROM_MAGIC_ADDR 32 +// Bump this every time we change what we store +// This will automatically reset the EEPROM with defaults +// and avoid loading invalid data from the EEPROM +#define EEPROM_VERSION 0x07 +#define EEPROM_VERSION_ADDR 34 + +// Backlight config starts after EEPROM version +#define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 35 +// Dynamic keymap starts after backlight config (35+37) +#define DYNAMIC_KEYMAP_EEPROM_ADDR 72 + diff --git a/keyboards/zeal60/info.json b/keyboards/zeal60/info.json new file mode 100644 index 000000000..c4234e49a --- /dev/null +++ b/keyboards/zeal60/info.json @@ -0,0 +1,25 @@ +{ + "keyboard_name": "Zeal60", + "url": "", + "maintainer": "Wilba", + "bootloader": "DFU", + "width": 15, + "height": 5, + "layouts": { + "LAYOUT_all": { + "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}] + }, + "LAYOUT_60_ansi": { + "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}] + }, + "LAYOUT_60_iso": { + "layout": [{"label":"\u00ac", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"\"", "x":2, "y":0}, {"label":"\u00a3", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"@", "x":11.75, "y":2}, {"label":"~", "x":12.75, "y":2}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"label":"|", "x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"AltGr", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}] + }, + "LAYOUT_60_ansi_split_bs_rshift": { + "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}] + }, + "LAYOUT_60_hhkb": { + "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"|", "x":13, "y":0}, {"label":"~", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"Delete", "x":13.5, "y":1, "w":1.5}, {"label":"Control", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"label":"Fn", "x":14, "y":3}, {"label":"Os", "x":1.5, "y":4}, {"label":"Alt", "x":2.5, "y":4, "w":1.5}, {"x":4, "y":4, "w":7}, {"label":"Alt", "x":11, "y":4, "w":1.5}, {"label":"Os", "x":12.5, "y":4}] + } + } +} \ No newline at end of file diff --git a/keyboards/zeal60/keymaps/ansi_split_bs_rshift/config.h b/keyboards/zeal60/keymaps/ansi_split_bs_rshift/config.h new file mode 100644 index 000000000..011cf5c5a --- /dev/null +++ b/keyboards/zeal60/keymaps/ansi_split_bs_rshift/config.h @@ -0,0 +1,21 @@ +#pragma once + +/* enable/disable LEDs based on layout */ +#undef RGB_BACKLIGHT_USE_SPLIT_BACKSPACE +#define RGB_BACKLIGHT_USE_SPLIT_BACKSPACE 0 + +#undef RGB_BACKLIGHT_USE_SPLIT_LEFT_SHIFT +#define RGB_BACKLIGHT_USE_SPLIT_LEFT_SHIFT 0 + +#undef RGB_BACKLIGHT_USE_SPLIT_RIGHT_SHIFT +#define RGB_BACKLIGHT_USE_SPLIT_RIGHT_SHIFT 0 + +#undef RGB_BACKLIGHT_USE_7U_SPACEBAR +#define RGB_BACKLIGHT_USE_7U_SPACEBAR 0 + +#undef RGB_BACKLIGHT_USE_ISO_ENTER +#define RGB_BACKLIGHT_USE_ISO_ENTER 0 + +#undef RGB_BACKLIGHT_DISABLE_HHKB_BLOCKER_LEDS +#define RGB_BACKLIGHT_DISABLE_HHKB_BLOCKER_LEDS 0 + diff --git a/keyboards/zeal60/keymaps/ansi_split_bs_rshift/keymap.c b/keyboards/zeal60/keymaps/ansi_split_bs_rshift/keymap.c new file mode 100644 index 000000000..edb4f256b --- /dev/null +++ b/keyboards/zeal60/keymaps/ansi_split_bs_rshift/keymap.c @@ -0,0 +1,38 @@ +// ANSI split backspace/right shift layout for Zeal60 +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +// Default layer +[0] = LAYOUT_60_ansi_split_bs_rshift( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_DEL, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, FN_MO13, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, FN_MO23, KC_RCTL), + +// Fn1 Layer +[1] = LAYOUT_60_ansi_split_bs_rshift( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, + KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, KC_TRNS, KC_TRNS, + KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_EJCT, KC_TRNS, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +// Fn2 Layer +[2] = LAYOUT_60_ansi_split_bs_rshift( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +// Fn3 Layer (zeal60 Configuration) +[3] = LAYOUT_60_ansi_split_bs_rshift( + KC_TRNS, EF_DEC, EF_INC, H1_DEC, H1_INC, H2_DEC, H2_INC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, BR_DEC, BR_INC, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, S1_DEC, S1_INC, S2_DEC, S2_INC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, ES_DEC, ES_INC, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +}; diff --git a/keyboards/zeal60/keymaps/default/config.h b/keyboards/zeal60/keymaps/default/config.h new file mode 100644 index 000000000..f8478a3df --- /dev/null +++ b/keyboards/zeal60/keymaps/default/config.h @@ -0,0 +1,20 @@ +#pragma once + +/* enable/disable LEDs based on layout */ +#undef RGB_BACKLIGHT_USE_SPLIT_BACKSPACE +#define RGB_BACKLIGHT_USE_SPLIT_BACKSPACE 0 + +#undef RGB_BACKLIGHT_USE_SPLIT_LEFT_SHIFT +#define RGB_BACKLIGHT_USE_SPLIT_LEFT_SHIFT 0 + +#undef RGB_BACKLIGHT_USE_SPLIT_RIGHT_SHIFT +#define RGB_BACKLIGHT_USE_SPLIT_RIGHT_SHIFT 0 + +#undef RGB_BACKLIGHT_USE_7U_SPACEBAR +#define RGB_BACKLIGHT_USE_7U_SPACEBAR 0 + +#undef RGB_BACKLIGHT_USE_ISO_ENTER +#define RGB_BACKLIGHT_USE_ISO_ENTER 0 + +#undef RGB_BACKLIGHT_DISABLE_HHKB_BLOCKER_LEDS +#define RGB_BACKLIGHT_DISABLE_HHKB_BLOCKER_LEDS 0 diff --git a/keyboards/zeal60/keymaps/default/keymap.c b/keyboards/zeal60/keymaps/default/keymap.c new file mode 100644 index 000000000..3a13cf4d5 --- /dev/null +++ b/keyboards/zeal60/keymaps/default/keymap.c @@ -0,0 +1,38 @@ +// Default layout for Zeal60 +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +// Default layer +[0] = LAYOUT_60_ansi( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, FN_MO13, FN_MO23, KC_RCTL), + +// Fn1 Layer +[1] = LAYOUT_60_ansi( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL , + KC_CAPS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, + KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGUP, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_END, KC_PGDN, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +// Fn2 Layer +[2] = LAYOUT_60_ansi( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +// Fn3 Layer (zeal60 Configuration) +[3] = LAYOUT_60_ansi( + KC_TRNS, EF_DEC, EF_INC, H1_DEC, H1_INC, H2_DEC, H2_INC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, BR_DEC, BR_INC, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, S1_DEC, S1_INC, S2_DEC, S2_INC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, ES_DEC, ES_INC, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +}; diff --git a/keyboards/zeal60/keymaps/hhkb/config.h b/keyboards/zeal60/keymaps/hhkb/config.h new file mode 100644 index 000000000..25f74d3d2 --- /dev/null +++ b/keyboards/zeal60/keymaps/hhkb/config.h @@ -0,0 +1,20 @@ +#pragma once + +/* enable/disable LEDs based on layout */ +#undef RGB_BACKLIGHT_USE_SPLIT_BACKSPACE +#define RGB_BACKLIGHT_USE_SPLIT_BACKSPACE 1 + +#undef RGB_BACKLIGHT_USE_SPLIT_LEFT_SHIFT +#define RGB_BACKLIGHT_USE_SPLIT_LEFT_SHIFT 0 + +#undef RGB_BACKLIGHT_USE_SPLIT_RIGHT_SHIFT +#define RGB_BACKLIGHT_USE_SPLIT_RIGHT_SHIFT 1 + +#undef RGB_BACKLIGHT_USE_7U_SPACEBAR +#define RGB_BACKLIGHT_USE_7U_SPACEBAR 1 + +#undef RGB_BACKLIGHT_USE_ISO_ENTER +#define RGB_BACKLIGHT_USE_ISO_ENTER 0 + +#undef RGB_BACKLIGHT_DISABLE_HHKB_BLOCKER_LEDS +#define RGB_BACKLIGHT_DISABLE_HHKB_BLOCKER_LEDS 1 diff --git a/keyboards/zeal60/keymaps/hhkb/keymap.c b/keyboards/zeal60/keymaps/hhkb/keymap.c new file mode 100644 index 000000000..5cedc6e5e --- /dev/null +++ b/keyboards/zeal60/keymaps/hhkb/keymap.c @@ -0,0 +1,38 @@ +// HHKB layout for Zeal60 +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +// Default layer +[0] = LAYOUT_60_hhkb( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, FN_MO13, + KC_LGUI, KC_LALT, KC_SPC, KC_RALT, FN_MO23), + +// Fn1 Layer +[1] = LAYOUT_60_hhkb( + KC_PWR, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, + KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, KC_TRNS, KC_TRNS, + KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_EJCT, KC_TRNS, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +// Fn2 Layer +[2] = LAYOUT_60_hhkb( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +// Fn3 Layer (zeal60 Configuration) +[3] = LAYOUT_60_hhkb( + KC_TRNS, EF_DEC, EF_INC, H1_DEC, H1_INC, H2_DEC, H2_INC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, BR_DEC, BR_INC, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, S1_DEC, S1_INC, S2_DEC, S2_INC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, ES_DEC, ES_INC, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +}; diff --git a/keyboards/zeal60/keymaps/iso/config.h b/keyboards/zeal60/keymaps/iso/config.h new file mode 100644 index 000000000..c96ef1f05 --- /dev/null +++ b/keyboards/zeal60/keymaps/iso/config.h @@ -0,0 +1,20 @@ +#pragma once + +/* enable/disable LEDs based on layout */ +#undef RGB_BACKLIGHT_USE_SPLIT_BACKSPACE +#define RGB_BACKLIGHT_USE_SPLIT_BACKSPACE 0 + +#undef RGB_BACKLIGHT_USE_SPLIT_LEFT_SHIFT +#define RGB_BACKLIGHT_USE_SPLIT_LEFT_SHIFT 1 + +#undef RGB_BACKLIGHT_USE_SPLIT_RIGHT_SHIFT +#define RGB_BACKLIGHT_USE_SPLIT_RIGHT_SHIFT 0 + +#undef RGB_BACKLIGHT_USE_7U_SPACEBAR +#define RGB_BACKLIGHT_USE_7U_SPACEBAR 0 + +#undef RGB_BACKLIGHT_USE_ISO_ENTER +#define RGB_BACKLIGHT_USE_ISO_ENTER 1 + +#undef RGB_BACKLIGHT_DISABLE_HHKB_BLOCKER_LEDS +#define RGB_BACKLIGHT_DISABLE_HHKB_BLOCKER_LEDS 0 diff --git a/keyboards/zeal60/keymaps/iso/keymap.c b/keyboards/zeal60/keymaps/iso/keymap.c new file mode 100644 index 000000000..55120f05e --- /dev/null +++ b/keyboards/zeal60/keymaps/iso/keymap.c @@ -0,0 +1,38 @@ +// ISO layout for Zeal60 +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +// Default layer +[0] = LAYOUT_60_iso( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_ENT, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, FN_MO13, FN_MO23, KC_RCTL), + +// Fn1 Layer +[1] = LAYOUT_60_iso( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL , + KC_CAPS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, + KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGUP, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_END, KC_PGDN, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +// Fn2 Layer +[2] = LAYOUT_60_iso( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +// Fn3 Layer (zeal60 Configuration) +[3] = LAYOUT_60_iso( + KC_TRNS, EF_DEC, EF_INC, H1_DEC, H1_INC, H2_DEC, H2_INC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, BR_DEC, BR_INC, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, S1_DEC, S1_INC, S2_DEC, S2_INC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, ES_DEC, ES_INC, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +}; diff --git a/keyboards/zeal60/keymaps/ryanmaclean/config.h b/keyboards/zeal60/keymaps/ryanmaclean/config.h new file mode 100644 index 000000000..f1531eb34 --- /dev/null +++ b/keyboards/zeal60/keymaps/ryanmaclean/config.h @@ -0,0 +1,21 @@ +#pragma once + +/* enable/disable LEDs based on layout */ +#undef RGB_BACKLIGHT_USE_SPLIT_BACKSPACE +#define RGB_BACKLIGHT_USE_SPLIT_BACKSPACE 1 + +#undef RGB_BACKLIGHT_USE_SPLIT_LEFT_SHIFT +#define RGB_BACKLIGHT_USE_SPLIT_LEFT_SHIFT 0 + +#undef RGB_BACKLIGHT_USE_SPLIT_RIGHT_SHIFT +#define RGB_BACKLIGHT_USE_SPLIT_RIGHT_SHIFT 1 + +#undef RGB_BACKLIGHT_USE_7U_SPACEBAR +#define RGB_BACKLIGHT_USE_7U_SPACEBAR 0 + +#undef RGB_BACKLIGHT_USE_ISO_ENTER +#define RGB_BACKLIGHT_USE_ISO_ENTER 0 + +#undef RGB_BACKLIGHT_DISABLE_HHKB_BLOCKER_LEDS +#define RGB_BACKLIGHT_DISABLE_HHKB_BLOCKER_LEDS 0 + diff --git a/keyboards/zeal60/keymaps/ryanmaclean/keymap.c b/keyboards/zeal60/keymaps/ryanmaclean/keymap.c new file mode 100644 index 000000000..2e342b497 --- /dev/null +++ b/keyboards/zeal60/keymaps/ryanmaclean/keymap.c @@ -0,0 +1,84 @@ +// Ryan MacLean's layout for Zeal60 +// Note that LGUI and RGUI are swapped with LALT and RALT respectively, for use with Macs +// Also note that Control has replaced Caps Lock, and that pressing left or right shift once +// will output left parenthese and right parenthese respectively. +#include QMK_KEYBOARD_H + +// [0,13] is either left key of split backspace (e.g. HHKB \| key) or 2U backspace +// [1,13] is either backslash or ISO Enter +// [2,12] is either ANSI Enter or key left of ISO Enter +// [2,13] is right key of split backspace (e.g. HHKB `~ key) +// [3,1] is right key of split left-shift (e.g ISO key) +// [3,13] is right key of split right-shift (e.g. HHKB Fn key) + + + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) // this is the function signature -- just copy/paste it into your keymap file as it is. KC_LSFT KC_LALT KC_LGUI KC_4 +{ + switch(id) { + case 0: // macOS screenshot to capture are to clipboard - this would trigger when you hit a key mapped as M(0) + if (record->event.pressed) { + return MACRO( D(LSFT), D(LCTL), D(LGUI), T(4), U(LSFT), U(LCTL), U(LGUI), W(255), END ); // this sends the string 'hello' when the macro executes + } + break; + case 1: // macOS screenshot capture area to file - this would trigger when you hit a key mapped as M(1) + if (record->event.pressed) { + return MACRO( D(LSFT), D(LGUI), T(4), U(LSFT), U(LGUI), W(255), END ); // this sends the string 'hello' when the macro executes + } + break; + case 2: // macOS screenshot to clipboard - this would trigger when you hit a key mapped as M(2) + if (record->event.pressed) { + return MACRO( D(LSFT), D(LCTL), D(LGUI), T(3), U(LSFT), U(LCTL), U(LGUI), W(255), END ); // this sends the string 'hello' when the macro executes + } + break; + case 3: // macOS screenshot to file - this would trigger when you hit a key mapped as M(3) + if (record->event.pressed) { + return MACRO( D(LSFT), D(LGUI), T(3), U(LSFT), U(LGUI), W(255), END ); // this sends the string 'hello' when the macro executes + } + break; + } + return MACRO_NONE; +}; + +#define CADETL MT(KC_LSFT, KC_LBRC) +#define CADETR MT(KC_RSFT, KC_RBRC) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +// Default layer +[0] = { + {KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS}, + {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC}, + {KC_LGUI, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_GRV}, + {KC_LSPO, KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, FN_MO13}, + {KC_LCTL, KC_LALT, KC_LGUI, KC_NO, KC_NO, KC_NO, KC_NO, KC_SPC, KC_NO, KC_NO, KC_RGUI, KC_RALT, KC_RCTL, FN_MO23} +}, + +// Fn1 Layer +[1] = { + {KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS}, + {KC_CAPS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_DEL}, + {KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_LEFT, KC_UP, KC_DOWN, KC_RGHT, KC_HOME, KC_PGUP, KC_TRNS, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_END, KC_PGDN, KC_TRNS, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS} +}, + +// Fn2 Layer +[2] = { + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}, + {KC_TRNS, M(2), M(3), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}, + {KC_TRNS, M(1), M(0), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS} +}, + +// Fn3 Layer (zeal60 Configuration) +[3] = { + {KC_TRNS, EF_DEC, EF_INC, H1_DEC, H1_INC, H2_DEC, H2_INC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, BR_DEC, BR_INC, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, S1_DEC, S1_INC, S2_DEC, S2_INC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS} +} + +}; diff --git a/keyboards/zeal60/keymaps/tusing/Makefile b/keyboards/zeal60/keymaps/tusing/Makefile new file mode 100644 index 000000000..762905da0 --- /dev/null +++ b/keyboards/zeal60/keymaps/tusing/Makefile @@ -0,0 +1,6 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +RGBLIGHT_ENABLE = yes +AUDIO_ENABLE = no # Underglow cannot be used with audio. diff --git a/keyboards/zeal60/keymaps/tusing/README.md b/keyboards/zeal60/keymaps/tusing/README.md new file mode 100644 index 000000000..edddf1c58 --- /dev/null +++ b/keyboards/zeal60/keymaps/tusing/README.md @@ -0,0 +1,80 @@ +# RGB Underglow Strip on the Zeal60: A Guide + + + +## Requirements + +- WS2812B RGB strip, preferably 60 LEDs/meter +- Wire, solder +- Tape, hot glue, or some sort of adhesive + +## A. Connecting the strip +You might find the [**full PCB image**](https://cdn.shopify.com/s/files/1/0490/7329/files/zeal60jumpers.png) helpful. Ignore the red boxes! + +1. Connect V+ to the receiving end of the thermistor labeled F1; connect GND to the board's GND pin. (*Avoid connecting +V to the board's +5V pin* - you will likely overload the thermistor, and you will limit your maximum brightness.) + + + +2. Connect DI to PB0. + + + +3. Should look something like this when finished: + + + +*Optional:* To allow considerably more light to escape, consider angling the strip outwards by using some sort of fulcrum under the strip. (I used a thick wire.) + +## B. Enabling the strip +1. If it is not present already, add the following to your ***keymap's*** ```Makefile```: + + ```Makefile + RGBLIGHT_ENABLE = yes + AUDIO_ENABLE = no #Underglow animations cannot be used with audio. + ``` +2. If it is not present already, add the following to your *keymap's* ```config.h```, and edit the values as necessary: + + ```c + // Set up RGB underglow. + #define RGB_DI_PIN B0 // The pin your RGB strip is wired to + #define RGBLIGHT_ANIMATIONS // Require for fancier stuff (not compatible with audio) + #define RGBLED_NUM 35 // Number of LEDs + #define RGBLIGHT_HUE_STEP 5 // How much each press of rgb_hue changes hue + #define RGBLIGHT_SAT_STEP 10 // How much each press of rgb_sat changes sat + #define RGBLIGHT_VAL_STEP 10 // How much each press of rgb_val changes val + ``` +3. If they are not present already, add the following keycodes to your keymap to control the RGB strip: ```RGB_TOG``` (on/off), ```RGB_MOD``` (step through modes), ```RGB_HUI```, ```RGB_HUD```, ```RGB_SAI```, ```RGB_SAD```, ```RGB_VAI```, ```RGB_VAD``` (HSV increase/decrease). Add these to your keymap. + +## C. Dealing with current limits +USB 2.0 ports on laptops provide up to 500mA max, but USB 3.0 ports can provide up to 900mA; USB 3.1 up to 1.5A; and powered USB hubs even more. We can run our keyboard at a higher brightness if we draw more power. **The Zeal60 uses 500mA at max brightness.** This means that **you have about 400mA remaining for the strip to use on a USB 3.0 port**; 1000mA free on a USB 3.1 port, so on and so forth. + +***Warning:*** **This means you will need to turn *off* your RGB strip before connecting to a USB 2.0 port**, as USB 2.0 cannot sustain the current necessary! + +1. If not present already, add the following to your keymap's ```config.h```. Change the numbers based on your needs. The ones below are safe underestimates. + + ```c + // Enable current limiting for RGB underglow. + #define RGBSTRIP_CURRENT_LIMIT 400 // Strip current limit in mA. (USB amperage - 500mA for keyboard) + #define RGBSTRIP_MAX_CURRENT_PER_LIGHT 50 // mA per light when at max brightness. + ``` + *Example:* I use a USB port capable of providing 1800 mA. The keyboard uses 500mA, so my personal value (in the `tusing` keymap) for `RGBSTRIP_CURRENT_LIMIT` is 1300. The particular WS2812B RGB strip I have uses a maximum of 60 mA per LED, so that is my personal value for `RGBSTRIP_MAX_CURRENT_PER_LIGHT`. +2. Toggle on the LED strip (```RGB_TOG```) and step through animations (```RGB_MOD```) to test it out! + +## D. Sources and resources +### A. Connecting the strip. +* [In-depth description of connecting an RGB strip to the GH60](https://www.reddit.com/r/MechanicalKeyboards/comments/4d5or2/my_first_custom_build_satan_gh60_rbg_underglow_in/d1nz3o7/) +* [32U4 Pinout](https://40.media.tumblr.com/93b6bbd4113418c2b45459bb177e67c5/tumblr_mi49a20QMB1s5t695o1_1280.png) +* [Redditor describes connecting RGB strips on his Satan GH60](https://www.reddit.com/r/MechanicalKeyboards/comments/4hbjw4/finally_finished_my_satan_gh60_also_granite_o/d2qn8zx/?context=3) +* [Another Redditor on RGB with the Satan GH60](https://www.reddit.com/r/MechanicalKeyboards/comments/4ewzdx/gh60_satan_with_the_rgb_mod/d251uu6/ ) + +### B. Enabling the strip. +* [QMK Wiki portion on underglow](https://github.com/jackhumbert/qmk_firmware/wiki#rgb-under-glow-mod) +* [Planck ```Makefile```, ```config.h```, and ```keymap.c``` config example](https://github.com/jackhumbert/qmk_firmware/tree/master/keyboards/planck/keymaps/yang) +* [Video demonstrating keycode functions and RGB modes on a KC60](https://www.youtube.com/watch?v=VKrpPAHlisY) + +### C. Dealing with current limits. +* [Discussion of cutting jumpers and adding resistors to lower current from Zeal60](https://www.reddit.com/r/MechanicalKeyboards/comments/5hou92/photos_zeal60_lets_just_say_santa_came_early_this/db23qid/) +* [A selection of 900mA-1.5A current hold fuses - look for an SMD 0805-sized fuse.](https://goo.gl/748avG) +* [Video detailing technique to solder 0805 resistors](https://www.youtube.com/watch?v=PU7wLcuqc-I&t=123s&list=FLheMlKEVQ5cmVXazUt6HrxQ&index=2) +* [QMK feature request to implement max power draw limits in ```config.h```](https://github.com/jackhumbert/qmk_firmware/issues/954) +* [Commit enabling max power draw limits in ```config.h```](https://github.com/jackhumbert/qmk_firmware/commit/83e613ad239459582ae28f78b6c81535b9b138d7) \ No newline at end of file diff --git a/keyboards/zeal60/keymaps/tusing/config.h b/keyboards/zeal60/keymaps/tusing/config.h new file mode 100644 index 000000000..93f260946 --- /dev/null +++ b/keyboards/zeal60/keymaps/tusing/config.h @@ -0,0 +1,40 @@ +#pragma once + +/* Enable/disable LEDs based on layout. */ +#undef RGB_BACKLIGHT_USE_SPLIT_BACKSPACE +#define RGB_BACKLIGHT_USE_SPLIT_BACKSPACE 0 + +#undef RGB_BACKLIGHT_USE_SPLIT_LEFT_SHIFT +#define RGB_BACKLIGHT_USE_SPLIT_LEFT_SHIFT 0 + +#undef RGB_BACKLIGHT_USE_SPLIT_RIGHT_SHIFT +#define RGB_BACKLIGHT_USE_SPLIT_RIGHT_SHIFT 0 + +#undef RGB_BACKLIGHT_USE_7U_SPACEBAR +#define RGB_BACKLIGHT_USE_7U_SPACEBAR 0 + +#undef RGB_BACKLIGHT_USE_ISO_ENTER +#define RGB_BACKLIGHT_USE_ISO_ENTER 0 + +#undef RGB_BACKLIGHT_DISABLE_HHKB_BLOCKER_LEDS +#define RGB_BACKLIGHT_DISABLE_HHKB_BLOCKER_LEDS 0 + +// Set up RGB underglow. +#define RGB_DI_PIN B0 // The pin your RGB strip is wired to +#define RGBLIGHT_ANIMATIONS // Require for fancier stuff (not compatible with audio) +#define RGBLED_NUM 35 // Number of LEDs +#define RGBLIGHT_HUE_STEP 5 // How much each press of rgb_hue changes hue +#define RGBLIGHT_SAT_STEP 10 // How much each press of rgb_sat changes sat +#define RGBLIGHT_VAL_STEP 10 // How much each press of rgb_val changes val + +// Enable current limiting for RGB underglow. +#define RGBSTRIP_CURRENT_LIMIT 1300 // Strip current limit in mA. (USB amperage - 500mA for keyboard) +#define RGBSTRIP_MAX_CURRENT_PER_LIGHT 40 // mA per light when at max brightness. + +// Scale brightnes according to BRIGHTNESS_CORRECTION_TABLE in quantum/rgblight.c. +// This allows to mitigate uneven brightness from LED underglow strips. +// #define LED_BRIGHTNESS_CORRECTION + +// Prevent modifiers on layer 1 from persisting after we let go +#define PREVENT_STUCK_MODIFIERS + diff --git a/keyboards/zeal60/keymaps/tusing/keymap.c b/keyboards/zeal60/keymaps/tusing/keymap.c new file mode 100644 index 000000000..41d2effd4 --- /dev/null +++ b/keyboards/zeal60/keymaps/tusing/keymap.c @@ -0,0 +1,49 @@ +// Default layout for Zeal60 +#include QMK_KEYBOARD_H + +// For readability. +#define _______ KC_TRNS +#define _x_ KC_NO +#define AUD_PRV LCTL(KC_MPRV) // Previous music track +#define AUD_PLY LCTL(KC_MPLY) // Pause music +#define AUD_NXT LCTL(KC_MNXT) // Next music track + +// Zeal60-specific keys: +// EF_INC, EF_DEC, // next/previous backlight effect +// H1_INC, H1_DEC, // Color 1 hue increase/decrease +// S1_INC, S1_DEC, // Color 1 saturation increase/decrease +// H2_INC, H2_DEC, // Color 2 hue increase/decrease +// S2_INC, S2_DEC, // Color 2 saturation increase/decrease +// BR_INC, BR_DEC, // backlight brightness increase/decrease + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +// Default layer: Pressing caps-lock momentarily switches to Layer 1. +// This is the default layer. Pressing an empty keycode on another layer will take you here. + [0] = { + {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC}, + {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS}, + {MO(1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, _x_ }, + {KC_LSFT, _x_ , KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, _x_ }, + {KC_LCTL, KC_LGUI, KC_LALT, _x_ , _x_ , _x_ , _x_ , KC_SPC, _x_ , _x_ , KC_LEFT, KC_UP, KC_DOWN, KC_RGHT} + }, + +// Layer 1: Pressing enter switches to layer 2, where backlight controls live. +// This is a momentary layer: once you let go of caps, you'll be back in layer 1. + [1] = { + {KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL }, + {_______, KC_VOLD, KC_MUTE, KC_VOLU, _______, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUS, KC_INS, KC_DEL, _______}, + {_______, AUD_PRV, AUD_PLY, AUD_NXT, _______, _______, _______, _______, _______, _______, _______, _______, TO(2) , _x_ }, + {KC_CAPS, _x_ , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _x_ }, + {KC_RCTL, KC_RGUI, KC_RALT, _x_ , _x_ , _x_ , _x_ , _______, _x_ , _x_ , KC_HOME, KC_PGUP, KC_PGDN, KC_END} + }, + +// Layer 2: Zeal60 and backlight configuration. (Get here quickly by pressing Caps+Enter from Layer 1.) +// This is a persistent layer. Get back to the default layer by pressing enter. + [2] = { + {RESET, EF_DEC, EF_INC, BR_DEC, BR_INC, ES_DEC, ES_INC, _______, _______, _______, _______, _______, _______, _______}, + {_______, H1_DEC, H1_INC, S1_DEC, S1_INC, _______, _______, _______, _______, _______, _______, _______, _______, _______}, + {_______, H2_DEC, H2_INC, S2_DEC, S2_INC, _______, _______, _______, _______, _______, _______, _______, TO(0) , _x_ }, + {RGB_MOD, _x_ , RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, _______, _______, _______, _______, _______, _______, _______, _x_ }, + {RGB_TOG, RGB_VAD, RGB_VAI, _x_ , _x_ , _x_ , _x_ , _______, _x_ , _x_ , _______, _______, _______, _______} + } +}; diff --git a/keyboards/zeal60/readme.md b/keyboards/zeal60/readme.md new file mode 100644 index 000000000..9eca28f83 --- /dev/null +++ b/keyboards/zeal60/readme.md @@ -0,0 +1,47 @@ +Zeal60 +==== + +![Zeal60](https://cdn.shopify.com/s/files/1/0490/7329/products/Zeal60.jpg) + +This is a 60% PCB with per-key RGB LEDs and supports ANSI, ISO, winkey/winkeyless bottom row, HHKB-layout (split right shift and backspace). + +Keyboard Maintainer: [Wilba](http://wilba.tech/) and on [github](https://github.com/Wilba6582) +Hardware Supported: Zeal60 PCB Rev 0-3 +Hardware Availability: https://zealpc.net/collections/group-buy-pre-orders/products/zeal60rgb + +Make example for this keyboard (after setting up your build environment): + + make zeal60:default + +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). + + +RGB Backlight Configuration +==== + +A keymap (in the keymaps directory) can optionally configure which RGB backlight LEDs are used, depending on the needs of the layout, by adding a config.h file in the keymap's directory. +The following #define symbols will enable/disable a feature using 1 or 0. + + RGB_BACKLIGHT_USE_SPLIT_BACKSPACE + +Split backspace is being used, enables the right LED of the split backspace (the top-right corner) + + RGB_BACKLIGHT_USE_SPLIT_LEFT_SHIFT + +Split left shift is being used (i.e. ISO layout), enables the right LED of the split left shift (the ISO key) + + RGB_BACKLIGHT_USE_SPLIT_RIGHT_SHIFT + +Split right shift is being used (i.e. HHKB style layouts), enables the right LED of the split right shift (the Fn key) + + RGB_BACKLIGHT_USE_7U_SPACEBAR + +A 7U spacebar is being used, controls the LEDs under the right stabilizer (of 7U spacebar) and right Alt (if 6.25U spacebar). + + RGB_BACKLIGHT_USE_ISO_ENTER + +An ISO Enter is being used. Only used to tweak the location of the LED being used under ANSI Enter/backslash + + RGB_BACKLIGHT_DISABLE_HHKB_BLOCKER_LEDS + +Disables the LEDs under HHKB corner blockers, useful for transparent cases. diff --git a/keyboards/zeal60/rgb_backlight.c b/keyboards/zeal60/rgb_backlight.c new file mode 100644 index 000000000..9f62a8d38 --- /dev/null +++ b/keyboards/zeal60/rgb_backlight.c @@ -0,0 +1,1519 @@ +/* Copyright 2017 Jason Williams (Wilba) + * + * 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 . + */ +#if RGB_BACKLIGHT_ENABLED + +#if defined (RGB_BACKLIGHT_ZEAL60) || defined (RGB_BACKLIGHT_ZEAL65) || defined (RGB_BACKLIGHT_M60_A) +#else +#error None of the following was defined: RGB_BACKLIGHT_ZEAL60, RGB_BACKLIGHT_ZEAL65, RGB_BACKLIGHT_M60_A +#endif + +#include "zeal60.h" +#include "rgb_backlight.h" +#include "rgb_backlight_api.h" +#include "rgb_backlight_keycodes.h" + +#include +#include +#include +#include "progmem.h" + +#include "quantum/color.h" +#include "drivers/avr/i2c_master.h" +#include "drivers/issi/is31fl3731.h" + +#define BACKLIGHT_EFFECT_MAX 10 + +backlight_config g_config = { + .use_split_backspace = RGB_BACKLIGHT_USE_SPLIT_BACKSPACE, + .use_split_left_shift = RGB_BACKLIGHT_USE_SPLIT_LEFT_SHIFT, + .use_split_right_shift = RGB_BACKLIGHT_USE_SPLIT_RIGHT_SHIFT, + .use_7u_spacebar = RGB_BACKLIGHT_USE_7U_SPACEBAR, + .use_iso_enter = RGB_BACKLIGHT_USE_ISO_ENTER, + .disable_hhkb_blocker_leds = RGB_BACKLIGHT_DISABLE_HHKB_BLOCKER_LEDS, + .disable_when_usb_suspended = RGB_BACKLIGHT_DISABLE_WHEN_USB_SUSPENDED, + .disable_after_timeout = RGB_BACKLIGHT_DISABLE_AFTER_TIMEOUT, + .brightness = 255, + .effect = RGB_BACKLIGHT_EFFECT, + .effect_speed = 0, + .color_1 = { .h = 0, .s = 255, .v = 255 }, + .color_2 = { .h = 127, .s = 255, .v = 255 }, + .caps_lock_indicator = { .color = { .h = 0, .s = 0, .v = 255 }, .index = 255 }, + .layer_1_indicator = { .color = { .h = 0, .s = 0, .v = 255 }, .index = 255 }, + .layer_2_indicator = { .color = { .h = 0, .s = 0, .v = 255 }, .index = 255 }, + .layer_3_indicator = { .color = { .h = 0, .s = 0, .v = 255 }, .index = 255 }, + .alphas_mods = { + RGB_BACKLIGHT_ALPHAS_MODS_ROW_0, + RGB_BACKLIGHT_ALPHAS_MODS_ROW_1, + RGB_BACKLIGHT_ALPHAS_MODS_ROW_2, + RGB_BACKLIGHT_ALPHAS_MODS_ROW_3, + RGB_BACKLIGHT_ALPHAS_MODS_ROW_4 } +}; + +bool g_suspend_state = false; +uint8_t g_indicator_state = 0; + +// Global tick at 20 Hz +uint32_t g_tick = 0; + +// Ticks since this key was last hit. +uint8_t g_key_hit[72]; + +// Ticks since any key was last hit. +uint32_t g_any_key_hit = 0; + +// This is a 7-bit address, that gets left-shifted and bit 0 +// set to 0 for write, 1 for read (as per I2C protocol) +#define ISSI_ADDR_1 0x74 +#define ISSI_ADDR_2 0x76 + +const is31_led g_is31_leds[DRIVER_LED_TOTAL] = { +/* Refer to IS31 manual for these locations + * driver + * | R location + * | | G location + * | | | B location + * | | | | */ + {0, C2_1, C3_1, C4_1}, // LA0 + {0, C1_1, C3_2, C4_2}, // LA1 + {0, C1_2, C2_2, C4_3}, // LA2 + {0, C1_3, C2_3, C3_3}, // LA3 + {0, C1_4, C2_4, C3_4}, // LA4 + {0, C1_5, C2_5, C3_5}, // LA5 + {0, C1_6, C2_6, C3_6}, // LA6 + {0, C1_7, C2_7, C3_7}, // LA7 + {0, C1_8, C2_8, C3_8}, // LA8 + {0, C9_1, C8_1, C7_1}, // LA9 + {0, C9_2, C8_2, C7_2}, // LA10 + {0, C9_3, C8_3, C7_3}, // LA11 + {0, C9_4, C8_4, C7_4}, // LA12 + {0, C9_5, C8_5, C7_5}, // LA13 + {0, C9_6, C8_6, C7_6}, // LA14 + {0, C9_7, C8_7, C6_6}, // LA15 + {0, C9_8, C7_7, C6_7}, // LA16 + {0, C8_8, C7_8, C6_8}, // LA17 + + {0, C2_9, C3_9, C4_9}, // LB0 + {0, C1_9, C3_10, C4_10}, // LB1 + {0, C1_10, C2_10, C4_11}, // LB2 + {0, C1_11, C2_11, C3_11}, // LB3 + {0, C1_12, C2_12, C3_12}, // LB4 + {0, C1_13, C2_13, C3_13}, // LB5 + {0, C1_14, C2_14, C3_14}, // LB6 + {0, C1_15, C2_15, C3_15}, // LB7 + {0, C1_16, C2_16, C3_16}, // LB8 + {0, C9_9, C8_9, C7_9}, // LB9 + {0, C9_10, C8_10, C7_10}, // LB10 + {0, C9_11, C8_11, C7_11}, // LB11 + {0, C9_12, C8_12, C7_12}, // LB12 + {0, C9_13, C8_13, C7_13}, // LB13 + {0, C9_14, C8_14, C7_14}, // LB14 + {0, C9_15, C8_15, C6_14}, // LB15 + {0, C9_16, C7_15, C6_15}, // LB16 + {0, C8_16, C7_16, C6_16}, // LB17 + + {1, C2_1, C3_1, C4_1}, // LC0 + {1, C1_1, C3_2, C4_2}, // LC1 + {1, C1_2, C2_2, C4_3}, // LC2 + {1, C1_3, C2_3, C3_3}, // LC3 + {1, C1_4, C2_4, C3_4}, // LC4 + {1, C1_5, C2_5, C3_5}, // LC5 + {1, C1_6, C2_6, C3_6}, // LC6 + {1, C1_7, C2_7, C3_7}, // LC7 + {1, C1_8, C2_8, C3_8}, // LC8 + {1, C9_1, C8_1, C7_1}, // LC9 + {1, C9_2, C8_2, C7_2}, // LC10 + {1, C9_3, C8_3, C7_3}, // LC11 + {1, C9_4, C8_4, C7_4}, // LC12 + {1, C9_5, C8_5, C7_5}, // LC13 + {1, C9_6, C8_6, C7_6}, // LC14 + {1, C9_7, C8_7, C6_6}, // LC15 + {1, C9_8, C7_7, C6_7}, // LC16 + {1, C8_8, C7_8, C6_8}, // LC17 + + {1, C2_9, C3_9, C4_9}, // LD0 + {1, C1_9, C3_10, C4_10}, // LD1 + {1, C1_10, C2_10, C4_11}, // LD2 + {1, C1_11, C2_11, C3_11}, // LD3 + {1, C1_12, C2_12, C3_12}, // LD4 + {1, C1_13, C2_13, C3_13}, // LD5 + {1, C1_14, C2_14, C3_14}, // LD6 + {1, C1_15, C2_15, C3_15}, // LD7 + {1, C1_16, C2_16, C3_16}, // LD8 + {1, C9_9, C8_9, C7_9}, // LD9 + {1, C9_10, C8_10, C7_10}, // LD10 + {1, C9_11, C8_11, C7_11}, // LD11 + {1, C9_12, C8_12, C7_12}, // LD12 + {1, C9_13, C8_13, C7_13}, // LD13 + {1, C9_14, C8_14, C7_14}, // LD14 + {1, C9_15, C8_15, C6_14}, // LD15 + {1, C9_16, C7_15, C6_15}, // LD16 + {1, C8_16, C7_16, C6_16}, // LD17 +}; + + + +typedef struct Point { + uint8_t x; + uint8_t y; +} Point; + + +// index in range 0..71 (LA0..LA17, LB0..LB17, LC0..LC17, LD0..LD17) +// point values in range x=0..224 y=0..64 +// origin is center of top-left key (i.e Esc) +#if defined (RGB_BACKLIGHT_ZEAL65) +const Point g_map_led_to_point[72] PROGMEM = { + // LA0..LA17 + {120,16}, {104,16}, {88,16}, {72,16}, {56,16}, {40,16}, {24,16}, {4,16}, {4,32}, + {128,0}, {112,0}, {96,0}, {80,0}, {64,0}, {48,0}, {32,0}, {16,0}, {0,0}, + // LB0..LB17 + {144,0}, {160,0}, {176,0}, {192,0}, {216,0}, {224,0}, {240,0}, {240,16}, {240,32}, + {136,16}, {152,16}, {168,16}, {184,16}, {200,16}, {220,16}, {240,48}, {240,64}, {224,64}, + // LC0..LC17 + {96,64}, {100,48}, {84,48}, {68,48}, {52,48}, {36,48}, {255,255}, {48,60}, {28,64}, + {108,32}, {92,32}, {76,32}, {60,32}, {44,32}, {28,32}, {20,44}, {10,48}, {4,64}, + // LD0..LD17 + {124,32}, {140,32}, {156,32}, {172,32}, {188,32}, {214,32}, {180,48}, {202,48}, {224,48}, + {116,48}, {132,48}, {148,48}, {164,48}, {255,255}, {144,60}, {164,64}, {188,64}, {208,64} +}; +const Point g_map_led_to_point_polar[72] PROGMEM = { + // LA0..LA17 + {64,128}, {75,132}, {84,145}, {91,164}, {97,187}, {102,213}, {105,242}, {109,255}, {128,247}, + {61,255}, {67,255}, {72,255}, {77,255}, {82,255}, {86,255}, {90,255}, {93,255}, {96,255}, + // LB0..LB17 + {56,255}, {51,255}, {46,255}, {42,255}, {37,255}, {35,255}, {32,255}, {19,255}, {0,255}, + {53,132}, {44,145}, {37,164}, {31,187}, {26,213}, {22,249}, {237,255}, {224,255}, {221,255}, + // LC0..LC17 + {184,255}, {179,135}, {170,149}, {163,169}, {157,193}, {153,220}, {255,255}, {167,255}, {165,255}, + {128,26}, {128,60}, {128,94}, {128,128}, {128,162}, {128,196}, {145,233}, {148,255}, {161,255}, + // LD0..LD17 + {0,9}, {0,43}, {0,77}, {0,111}, {0,145}, {255,201}, {224,181}, {230,217}, {235,255}, + {189,128}, {200,131}, {210,141}, {218,159}, {201,228}, {201,228}, {206,255}, {213,255}, {218,255} +}; +#elif defined (RGB_BACKLIGHT_ZEAL60) || defined (RGB_BACKLIGHT_M60_A) +const Point g_map_led_to_point[72] PROGMEM = { + // LA0..LA17 + {120,16}, {104,16}, {88,16}, {72,16}, {56,16}, {40,16}, {24,16}, {4,16}, {4,32}, + {128,0}, {112,0}, {96,0}, {80,0}, {64,0}, {48,0}, {32,0}, {16,0}, {0,0}, + // LB0..LB17 + {144,0}, {160,0}, {176,0}, {192,0}, {216,0}, {224,0}, {255,255}, {255,255}, {255,255}, + {136,16}, {152,16}, {168,16}, {184,16}, {200,16}, {220,16}, {255,255}, {255,255}, {255,255}, + // LC0..LC17 + {102,64}, {100,48}, {84,48}, {68,48}, {52,48}, {36,48}, {60,64}, {43,64}, {23,64}, + {108,32}, {92,32}, {76,32}, {60,32}, {44,32}, {28,32}, {20,48}, {2,48}, {3,64}, + // LD0..LD17 + {124,32}, {140,32}, {156,32}, {172,32}, {188,32}, {214,32}, {180,48}, {210,48}, {224,48}, + {116,48}, {132,48}, {148,48}, {164,48}, {144,64}, {161,64}, {181,64}, {201,64}, {221,64} +}; +const Point g_map_led_to_point_polar[72] PROGMEM = { + // LA0..LA17 + {58,129}, {70,129}, {80,139}, {89,157}, {96,181}, {101,208}, {105,238}, {109,255}, {128,247}, {58,255}, + {64,255}, {70,255}, {75,255}, {80,255}, {85,255}, {89,255}, {93,255}, {96,255}, + // LB0..LB17 + {53,255}, {48,255}, {43,255}, {39,255}, {34,255}, {32,255}, {255,255}, {255,255}, {255,255}, + {48,139}, {39,157}, {32,181}, {27,208}, {23,238}, {19,255}, {255,255}, {255,255}, {255,255}, + // LC0..LC17 + {188,255}, {183,131}, {173,143}, {165,163}, {159,188}, {154,216}, {172,252}, {170,255}, {165,255}, + {128,9}, {128,46}, {128,82}, {128,119}, {128,155}, {128,192}, {150,244}, {147,255}, {161,255}, + // LD0..LD17 + {0,27}, {0,64}, {0,101}, {0,137}, {0,174}, {255,233}, {228,201}, {235,255}, {237,255}, + {195,128}, {206,136}, {215,152}, {222,175}, {205,234}, {209,255}, {214,255}, {219,255}, {223,255} +}; +#endif + +// This may seem counter-intuitive, but it's quite flexible. +// For each LED, get it's position to decide what color to make it. +// This solves the issue of LEDs (and switches) not aligning to a grid, +// or having a large "bitmap" and sampling them. +void map_led_to_point( uint8_t index, Point *point ) +{ + // Slightly messy way to get Point structs out of progmem. + uint8_t *addr = (uint8_t*)&g_map_led_to_point[index]; + point->x = pgm_read_byte(addr); + point->y = pgm_read_byte(addr+1); + + switch (index) + { + case 18+4: // LB4A + if ( g_config.use_split_backspace ) + point->x -= 8; + break; + case 18+14: // LB14A + if ( g_config.use_iso_enter ) + point->y += 8; // extremely pedantic + break; +#if defined (RGB_BACKLIGHT_ZEAL60) || defined (RGB_BACKLIGHT_M60_A) + case 36+0: // LC0A + if ( g_config.use_7u_spacebar ) + point->x += 10; + break; + case 36+6: // LC6A + if ( g_config.use_7u_spacebar ) + point->x += 4; + break; +#endif + case 36+16: // LC16A + if ( !g_config.use_split_left_shift ) + point->x += 8; + break; + case 54+5: // LD5A + if ( !g_config.use_iso_enter ) + point->x -= 10; + break; + case 54+7: // LD7A + if ( !g_config.use_split_right_shift ) + point->x -= 8; + break; + } +} + +void map_led_to_point_polar( uint8_t index, Point *point ) +{ + // Slightly messy way to get Point structs out of progmem. + uint8_t *addr = (uint8_t*)&g_map_led_to_point_polar[index]; + point->x = pgm_read_byte(addr); + point->y = pgm_read_byte(addr+1); +} + +// +// Maps switch matrix coordinate (row,col) to LED index +// + + +#if defined (RGB_BACKLIGHT_ZEAL65) +// Note: Left spacebar stab is at 4,3 (LC7) +// Right spacebar stab is at 4,9 (D14) +// +// A17, A16, A15, A14, A13, A12, A11, A10, A9, B0, B1, B2, B3, B4, B6 +// A7, A6, A5, A4, A3, A2, A1, A0, B9, B10, B11, B12, B13, B14, B7 +// A8, C14, C13, C12, C11, C10, C9, D0, D1, D2, D3, D4, D5, B5, B8 +// C16, C15, C5, C4, C3, C2, C1, D9, D10, D11, D12, D6, D7, D8, B15 +// C17, C8, C7, ---, ---, ---, ---, C0, ---, D14, D15, D16, D17, B17, B16 +const uint8_t g_map_row_column_to_led[MATRIX_ROWS][MATRIX_COLS] PROGMEM = { + { 0+17, 0+16, 0+15, 0+14, 0+13, 0+12, 0+11, 0+10, 0+9, 18+0, 18+1, 18+2, 18+3, 18+4, 18+6 }, + { 0+7, 0+6, 0+5, 0+4, 0+3, 0+2, 0+1, 0+0, 18+9, 18+10, 18+11, 18+12, 18+13, 18+14, 18+7 }, + { 0+8, 36+14, 36+13, 36+12, 36+11, 36+10, 36+9, 54+0, 54+1, 54+2, 54+3, 54+4, 54+5, 18+5, 18+8 }, + { 36+16, 36+15, 36+5, 36+4, 36+3, 36+2, 36+1, 54+9, 54+10, 54+11, 54+12, 54+6, 54+7, 54+8, 18+15 }, + { 36+17, 36+8, 36+7, 255, 255, 255, 255, 36+0, 255, 54+14, 54+15, 54+16, 54+17, 18+17, 18+16 } +}; +#elif defined (RGB_BACKLIGHT_ZEAL60) || defined (RGB_BACKLIGHT_M60_A) +// Note: Left spacebar stab is at 4,3 (LC6) +// Right spacebar stab is at 4,9 (LD13) or 4,10 (LD14) +// +// A17, A16, A15, A14, A13, A12, A11, A10, A9, B0, B1, B2, B3, B4, +// A7, A6, A5, A4, A3, A2, A1, A0, B9, B10, B11, B12, B13, B14, +// A8, C14, C13, C12, C11, C10, C9, D0, D1, D2, D3, D4, D5, B5, +// C16, C15, C5, C4, C3, C2, C1, D9, D10, D11, D12, D6, D7, D8, +// C17, C8, C7, C6, ---, ---, ---, C0, ---, D13, D14, D15, D16, D17, +const uint8_t g_map_row_column_to_led[MATRIX_ROWS][MATRIX_COLS] PROGMEM = { + { 0+17, 0+16, 0+15, 0+14, 0+13, 0+12, 0+11, 0+10, 0+9, 18+0, 18+1, 18+2, 18+3, 18+4 }, + { 0+7, 0+6, 0+5, 0+4, 0+3, 0+2, 0+1, 0+0, 18+9, 18+10, 18+11, 18+12, 18+13, 18+14 }, + { 0+8, 36+14, 36+13, 36+12, 36+11, 36+10, 36+9, 54+0, 54+1, 54+2, 54+3, 54+4, 54+5, 18+5 }, + { 36+16, 36+15, 36+5, 36+4, 36+3, 36+2, 36+1, 54+9, 54+10, 54+11, 54+12, 54+6, 54+7, 54+8 }, + { 36+17, 36+8, 36+7, 36+6, 255, 255, 255, 36+0, 255, 54+13, 54+14, 54+15, 54+16, 54+17 } +}; +#endif + +void map_row_column_to_led( uint8_t row, uint8_t column, uint8_t *led ) +{ + *led = 255; + if ( row < MATRIX_ROWS && column < MATRIX_COLS ) + { + *led = pgm_read_byte(&g_map_row_column_to_led[row][column]); + } +} + +void backlight_update_pwm_buffers(void) +{ + IS31FL3731_update_pwm_buffers( ISSI_ADDR_1, ISSI_ADDR_2 ); + IS31FL3731_update_led_control_registers( ISSI_ADDR_1, ISSI_ADDR_2 ); +} + +void backlight_set_color( int index, uint8_t red, uint8_t green, uint8_t blue ) +{ + IS31FL3731_set_color( index, red, green, blue ); +} + +void backlight_set_color_all( uint8_t red, uint8_t green, uint8_t blue ) +{ + IS31FL3731_set_color_all( red, green, blue ); +} + +void backlight_set_key_hit(uint8_t row, uint8_t column) +{ + uint8_t led; + map_row_column_to_led(row,column,&led); + g_key_hit[led] = 0; + + g_any_key_hit = 0; +} + +// This is (F_CPU/1024) / 20 Hz +// = 15625 Hz / 20 Hz +// = 781 +#define TIMER3_TOP 781 + +void backlight_timer_init(void) +{ + static uint8_t backlight_timer_is_init = 0; + if ( backlight_timer_is_init ) + { + return; + } + backlight_timer_is_init = 1; + + // Timer 3 setup + TCCR3B = _BV(WGM32) | // CTC mode OCR3A as TOP + _BV(CS32) | _BV(CS30); // prescale by /1024 + // Set TOP value + uint8_t sreg = SREG; + cli(); + + OCR3AH = (TIMER3_TOP >> 8) & 0xff; + OCR3AL = TIMER3_TOP & 0xff; + SREG = sreg; +} + +void backlight_timer_enable(void) +{ + TIMSK3 |= _BV(OCIE3A); +} + +void backlight_timer_disable(void) +{ + TIMSK3 &= ~_BV(OCIE3A); +} + +void backlight_set_suspend_state(bool state) +{ + g_suspend_state = state; +} + +void backlight_set_indicator_state(uint8_t state) +{ + g_indicator_state = state; +} + +void backlight_effect_rgb_test(void) +{ + // Mask out bits 4 and 5 + // This 2-bit value will stay the same for 16 ticks. + switch ( (g_tick & 0x30) >> 4 ) + { + case 0: + { + backlight_set_color_all( 255, 0, 0 ); + break; + } + case 1: + { + backlight_set_color_all( 0, 255, 0 ); + break; + } + case 2: + { + backlight_set_color_all( 0, 0, 255 ); + break; + } + case 3: + { + backlight_set_color_all( 255, 255, 255 ); + break; + } + } +} + +// This tests the LEDs +// Note that it will change the LED control registers +// in the LED drivers, and leave them in an invalid +// state for other backlight effects. +// ONLY USE THIS FOR TESTING LEDS! +void backlight_effect_single_LED_test(void) +{ + static uint8_t color = 0; // 0,1,2 for R,G,B + static uint8_t row = 0; + static uint8_t column = 0; + + static uint8_t tick = 0; + tick++; + + if ( tick > 2 ) + { + tick = 0; + column++; + } + if ( column > 14 ) + { + column = 0; + row++; + } + if ( row > 4 ) + { + row = 0; + color++; + } + if ( color > 2 ) + { + color = 0; + } + + uint8_t led; + map_row_column_to_led( row, column, &led ); + backlight_set_color_all( 255, 255, 255 ); + backlight_test_led( led, color==0, color==1, color==2 ); +} + +// All LEDs off +void backlight_effect_all_off(void) +{ + backlight_set_color_all( 0, 0, 0 ); +} + +// Solid color +void backlight_effect_solid_color(void) +{ + HSV hsv = { .h = g_config.color_1.h, .s = g_config.color_1.s, .v = g_config.brightness }; + RGB rgb = hsv_to_rgb( hsv ); + backlight_set_color_all( rgb.r, rgb.g, rgb.b ); +} + +// alphas = color1, mods = color2 +void backlight_effect_alphas_mods(void) +{ + RGB rgb1 = hsv_to_rgb( (HSV){ .h = g_config.color_1.h, .s = g_config.color_1.s, .v = g_config.brightness } ); + RGB rgb2 = hsv_to_rgb( (HSV){ .h = g_config.color_2.h, .s = g_config.color_2.s, .v = g_config.brightness } ); + + for ( int row = 0; row < MATRIX_ROWS; row++ ) + { + for ( int column = 0; column < MATRIX_COLS; column++ ) + { + uint8_t index; + map_row_column_to_led( row, column, &index ); + if ( index < 72 ) + { + if ( ( g_config.alphas_mods[row] & (1< 127 ) + { + deltaH -= 256; + } + else if ( deltaH < -127 ) + { + deltaH += 256; + } + // Divide delta by 4, this gives the delta per row + deltaH /= 4; + + int16_t s1 = g_config.color_1.s; + int16_t s2 = g_config.color_2.s; + int16_t deltaS = ( s2 - s1 ) / 4; + + HSV hsv = { .h = 0, .s = 255, .v = g_config.brightness }; + RGB rgb; + Point point; + for ( int i=0; i<72; i++ ) + { + map_led_to_point( i, &point ); + // The y range will be 0..64, map this to 0..4 + uint8_t y = (point.y>>4); + // Relies on hue being 8-bit and wrapping + hsv.h = g_config.color_1.h + ( deltaH * y ); + hsv.s = g_config.color_1.s + ( deltaS * y ); + rgb = hsv_to_rgb( hsv ); + backlight_set_color( i, rgb.r, rgb.g, rgb.b ); + } +} + +void backlight_effect_raindrops(bool initialize) +{ + int16_t h1 = g_config.color_1.h; + int16_t h2 = g_config.color_2.h; + int16_t deltaH = h2 - h1; + deltaH /= 4; + + // Take the shortest path between hues + if ( deltaH > 127 ) + { + deltaH -= 256; + } + else if ( deltaH < -127 ) + { + deltaH += 256; + } + + int16_t s1 = g_config.color_1.s; + int16_t s2 = g_config.color_2.s; + int16_t deltaS = ( s2 - s1 ) / 4; + + HSV hsv; + RGB rgb; + + // Change one LED every tick + uint8_t led_to_change = ( g_tick & 0x000 ) == 0 ? rand() % 72 : 255; + + for ( int i=0; i<72; i++ ) + { + // If initialize, all get set to random colors + // If not, all but one will stay the same as before. + if ( initialize || i == led_to_change ) + { + hsv.h = h1 + ( deltaH * ( rand() & 0x03 ) ); + hsv.s = s1 + ( deltaS * ( rand() & 0x03 ) ); + // Override brightness with global brightness control + hsv.v = g_config.brightness;; + + rgb = hsv_to_rgb( hsv ); + backlight_set_color( i, rgb.r, rgb.g, rgb.b ); + } + } +} + +void backlight_effect_cycle_all(void) +{ + uint8_t offset = ( g_tick << g_config.effect_speed ) & 0xFF; + + // Relies on hue being 8-bit and wrapping + for ( int i=0; i<72; i++ ) + { + uint16_t offset2 = g_key_hit[i]<<2; + // stabilizer LEDs use spacebar hits + if ( i == 36+6 || i == 54+13 || // LC6, LD13 + ( g_config.use_7u_spacebar && i == 54+14 ) ) // LD14 + { + offset2 = g_key_hit[36+0]<<2; + } + offset2 = (offset2<=63) ? (63-offset2) : 0; + + HSV hsv = { .h = offset+offset2, .s = 255, .v = g_config.brightness }; + RGB rgb = hsv_to_rgb( hsv ); + backlight_set_color( i, rgb.r, rgb.g, rgb.b ); + } +} + +void backlight_effect_cycle_left_right(void) +{ + uint8_t offset = ( g_tick << g_config.effect_speed ) & 0xFF; + HSV hsv = { .h = 0, .s = 255, .v = g_config.brightness }; + RGB rgb; + Point point; + for ( int i=0; i<72; i++ ) + { + uint16_t offset2 = g_key_hit[i]<<2; + // stabilizer LEDs use spacebar hits + if ( i == 36+6 || i == 54+13 || // LC6, LD13 + ( g_config.use_7u_spacebar && i == 54+14 ) ) // LD14 + { + offset2 = g_key_hit[36+0]<<2; + } + offset2 = (offset2<=63) ? (63-offset2) : 0; + + map_led_to_point( i, &point ); + // Relies on hue being 8-bit and wrapping + hsv.h = point.x + offset + offset2; + rgb = hsv_to_rgb( hsv ); + backlight_set_color( i, rgb.r, rgb.g, rgb.b ); + } +} + +void backlight_effect_cycle_up_down(void) +{ + uint8_t offset = ( g_tick << g_config.effect_speed ) & 0xFF; + HSV hsv = { .h = 0, .s = 255, .v = g_config.brightness }; + RGB rgb; + Point point; + for ( int i=0; i<72; i++ ) + { + uint16_t offset2 = g_key_hit[i]<<2; + // stabilizer LEDs use spacebar hits + if ( i == 36+6 || i == 54+13 || // LC6, LD13 + ( g_config.use_7u_spacebar && i == 54+14 ) ) // LD14 + { + offset2 = g_key_hit[36+0]<<2; + } + offset2 = (offset2<=63) ? (63-offset2) : 0; + + map_led_to_point( i, &point ); + // Relies on hue being 8-bit and wrapping + hsv.h = point.y + offset + offset2; + rgb = hsv_to_rgb( hsv ); + backlight_set_color( i, rgb.r, rgb.g, rgb.b ); + } +} + +void backlight_effect_jellybean_raindrops( bool initialize ) +{ + HSV hsv; + RGB rgb; + + // Change one LED every tick + uint8_t led_to_change = ( g_tick & 0x000 ) == 0 ? rand() % 72 : 255; + + for ( int i=0; i<72; i++ ) + { + // If initialize, all get set to random colors + // If not, all but one will stay the same as before. + if ( initialize || i == led_to_change ) + { + hsv.h = rand() & 0xFF; + hsv.s = rand() & 0xFF; + // Override brightness with global brightness control + hsv.v = g_config.brightness;; + + rgb = hsv_to_rgb( hsv ); + backlight_set_color( i, rgb.r, rgb.g, rgb.b ); + } + } +} + +void backlight_effect_cycle_radial1(void) +{ + uint8_t offset = ( g_tick << g_config.effect_speed ) & 0xFF; + HSV hsv = { .h = 0, .s = 255, .v = g_config.brightness }; + RGB rgb; + Point point; + for ( int i=0; i<72; i++ ) + { + map_led_to_point_polar( i, &point ); + // Relies on hue being 8-bit and wrapping + hsv.h = point.x + offset; + hsv.s = point.y; + rgb = hsv_to_rgb( hsv ); + backlight_set_color( i, rgb.r, rgb.g, rgb.b ); + } +} + +void backlight_effect_cycle_radial2(void) +{ + uint8_t offset = ( g_tick << g_config.effect_speed ) & 0xFF; + + HSV hsv = { .h = 0, .s = g_config.color_1.s, .v = g_config.brightness }; + RGB rgb; + Point point; + for ( int i=0; i<72; i++ ) + { + map_led_to_point_polar( i, &point ); + uint8_t offset2 = offset + point.x; + if ( offset2 & 0x80 ) + { + offset2 = ~offset2; + } + offset2 = offset2 >> 2; + hsv.h = g_config.color_1.h + offset2; + hsv.s = 127 + ( point.y >> 1 ); + rgb = hsv_to_rgb( hsv ); + backlight_set_color( i, rgb.r, rgb.g, rgb.b ); + } +} + +void backlight_effect_indicators_set_colors( uint8_t index, HSV hsv ) +{ + RGB rgb = hsv_to_rgb( hsv ); + if ( index == 254 ) + { + backlight_set_color_all( rgb.r, rgb.g, rgb.b ); + } + else + { + backlight_set_color( index, rgb.r, rgb.g, rgb.b ); + + // If the spacebar LED is the indicator, + // do the same for the spacebar stabilizers + if ( index == 36+0 ) // LC0 + { +#if defined (RGB_BACKLIGHT_ZEAL65) + backlight_set_color( 36+7, rgb.r, rgb.g, rgb.b ); // LC7 + backlight_set_color( 54+14, rgb.r, rgb.g, rgb.b ); // LD14 +#elif defined (RGB_BACKLIGHT_ZEAL60) || defined (RGB_BACKLIGHT_M60_A) + backlight_set_color( 36+6, rgb.r, rgb.g, rgb.b ); // LC6 + backlight_set_color( 54+13, rgb.r, rgb.g, rgb.b ); // LD13 + if ( g_config.use_7u_spacebar ) + { + backlight_set_color( 54+14, rgb.r, rgb.g, rgb.b ); // LD14 + } +#endif + } + } +} + +// This runs after another backlight effect and replaces +// colors already set +void backlight_effect_indicators(void) +{ + if ( g_config.caps_lock_indicator.index != 255 && + ( g_indicator_state & (1< 0 && g_any_key_hit > g_config.disable_after_timeout * 60 * 20)); + uint8_t effect = suspend_backlight ? 0 : g_config.effect; + + // Keep track of the effect used last time, + // detect change in effect, so each effect can + // have an optional initialization. + static uint8_t effect_last = 255; + bool initialize = effect != effect_last; + effect_last = effect; + + // this gets ticked at 20 Hz. + // each effect can opt to do calculations + // and/or request PWM buffer updates. + switch ( effect ) + { + case 0: + backlight_effect_all_off(); + break; + case 1: + backlight_effect_solid_color(); + break; + case 2: + backlight_effect_alphas_mods(); + break; + case 3: + backlight_effect_gradient_up_down(); + break; + case 4: + backlight_effect_raindrops( initialize ); + break; + case 5: + backlight_effect_cycle_all(); + break; + case 6: + backlight_effect_cycle_left_right(); + break; + case 7: + backlight_effect_cycle_up_down(); + break; + case 8: + backlight_effect_jellybean_raindrops( initialize ); + break; + case 9: + backlight_effect_cycle_radial1(); + break; + case 10: + backlight_effect_cycle_radial2(); + break; + default: + backlight_effect_all_off(); + break; + } + + if ( ! suspend_backlight ) + { + backlight_effect_indicators(); + } +} + +void backlight_set_indicator_index( uint8_t *index, uint8_t row, uint8_t column ) +{ + if ( row >= MATRIX_ROWS ) + { + // Special value, 255=none, 254=all + *index = row; + } + else + { + map_row_column_to_led( row, column, index ); + } +} + +// Some helpers for setting/getting HSV +void _set_color( HSV *color, uint8_t *data ) +{ + color->h = data[0]; + color->s = data[1]; + color->v = data[2]; +} + +void _get_color( HSV *color, uint8_t *data ) +{ + data[0] = color->h; + data[1] = color->s; + data[2] = color->v; +} + +void backlight_config_set_value( uint8_t *data ) +{ + bool reinitialize = false; + uint8_t *value_id = &(data[0]); + uint8_t *value_data = &(data[1]); + switch ( *value_id ) + { +#if defined (RGB_BACKLIGHT_ZEAL60) || defined(RGB_BACKLIGHT_ZEAL65) + case id_use_split_backspace: + { + g_config.use_split_backspace = (bool)*value_data; + reinitialize = true; + break; + } +#endif +#if defined (RGB_BACKLIGHT_ZEAL60) + case id_use_split_left_shift: + { + g_config.use_split_left_shift = (bool)*value_data; + reinitialize = true; + break; + } + case id_use_split_right_shift: + { + g_config.use_split_right_shift = (bool)*value_data; + reinitialize = true; + break; + } + case id_use_7u_spacebar: + { + g_config.use_7u_spacebar = (bool)*value_data; + reinitialize = true; + break; + } + case id_use_iso_enter: + { + g_config.use_iso_enter = (bool)*value_data; + reinitialize = true; + break; + } + case id_disable_hhkb_blocker_leds: + { + g_config.disable_hhkb_blocker_leds = (bool)*value_data; + reinitialize = true; + break; + } +#endif + case id_disable_when_usb_suspended: + { + g_config.disable_when_usb_suspended = (bool)*value_data; + break; + } + case id_disable_after_timeout: + { + g_config.disable_after_timeout = *value_data; + break; + } + case id_brightness: + { + g_config.brightness = *value_data; + break; + } + case id_effect: + { + g_config.effect = *value_data; + break; + } + case id_effect_speed: + { + g_config.effect_speed = *value_data; + break; + } + case id_color_1: + { + _set_color( &(g_config.color_1), value_data ); + break; + } + case id_color_2: + { + _set_color( &(g_config.color_2), value_data ); + break; + } + case id_caps_lock_indicator_color: + { + _set_color( &(g_config.caps_lock_indicator.color), value_data ); + break; + } + case id_caps_lock_indicator_row_col: + { + backlight_set_indicator_index( &(g_config.caps_lock_indicator.index), value_data[0], value_data[1] ); + break; + } + case id_layer_1_indicator_color: + { + _set_color( &(g_config.layer_1_indicator.color), value_data ); + break; + } + case id_layer_1_indicator_row_col: + { + backlight_set_indicator_index( &(g_config.layer_1_indicator.index), value_data[0], value_data[1] ); + break; + } + case id_layer_2_indicator_color: + { + _set_color( &(g_config.layer_2_indicator.color), value_data ); + break; + } + case id_layer_2_indicator_row_col: + { + backlight_set_indicator_index( &(g_config.layer_2_indicator.index), value_data[0], value_data[1] ); + break; + } + case id_layer_3_indicator_color: + { + _set_color( &(g_config.layer_3_indicator.color), value_data ); + break; + } + case id_layer_3_indicator_row_col: + { + backlight_set_indicator_index( &(g_config.layer_3_indicator.index), value_data[0], value_data[1] ); + break; + } + case id_alphas_mods: + { + for ( int i=0; i<5; i++ ) + { + g_config.alphas_mods[i] = ( *(value_data+i*2) << 8 ) | ( *(value_data+i*2+1) ); + } + } + } + + if ( reinitialize ) + { + backlight_init_drivers(); + } +} + +void backlight_config_get_value( uint8_t *data ) +{ + uint8_t *value_id = &(data[0]); + uint8_t *value_data = &(data[1]); + switch ( *value_id ) + { + case id_use_split_backspace: + { + *value_data = ( g_config.use_split_backspace ? 1 : 0 ); + break; + } + case id_use_split_left_shift: + { + *value_data = ( g_config.use_split_left_shift ? 1 : 0 ); + break; + } + case id_use_split_right_shift: + { + *value_data = ( g_config.use_split_right_shift ? 1 : 0 ); + break; + } + case id_use_7u_spacebar: + { + *value_data = ( g_config.use_7u_spacebar ? 1 : 0 ); + break; + } + case id_use_iso_enter: + { + *value_data = ( g_config.use_iso_enter ? 1 : 0 ); + break; + } + case id_disable_when_usb_suspended: + { + *value_data = ( g_config.disable_when_usb_suspended ? 1 : 0 ); + break; + } + case id_disable_hhkb_blocker_leds: + { + *value_data = ( g_config.disable_hhkb_blocker_leds ? 1 : 0 ); + break; + } + case id_disable_after_timeout: + { + *value_data = g_config.disable_after_timeout; + break; + } + case id_brightness: + { + *value_data = g_config.brightness; + break; + } + case id_effect: + { + *value_data = g_config.effect; + break; + } + case id_effect_speed: + { + *value_data = g_config.effect_speed; + break; + } + case id_color_1: + { + _get_color( &(g_config.color_1), value_data ); + break; + } + case id_color_2: + { + _get_color( &(g_config.color_2), value_data ); + break; + } + case id_caps_lock_indicator_color: + { + _get_color( &(g_config.caps_lock_indicator.color), value_data ); + break; + } + case id_caps_lock_indicator_row_col: + { + //*value_data = g_config.caps_lock_indicator.index; + break; + } + case id_layer_1_indicator_color: + { + _get_color( &(g_config.layer_1_indicator.color), value_data ); + break; + } + case id_layer_1_indicator_row_col: + { + //*value_data = g_config.layer_1_indicator.index; + break; + } + case id_layer_2_indicator_color: + { + _get_color( &(g_config.layer_2_indicator.color), value_data ); + break; + } + case id_layer_2_indicator_row_col: + { + //*value_data = g_config.layer_2_indicator.index; + break; + } + case id_layer_3_indicator_color: + { + _get_color( &(g_config.layer_3_indicator.color), value_data ); + break; + } + case id_layer_3_indicator_row_col: + { + //*value_data = g_config.layer_3_indicator.index; + break; + } + case id_alphas_mods: + { + for ( int i=0; i<5; i++ ) + { + *(value_data+i*2) = g_config.alphas_mods[i] >> 8; + *(value_data+i*2+1) = g_config.alphas_mods[i] & 0xFF; + } + } + } +} + +void backlight_config_set_alphas_mods( uint16_t *alphas_mods ) +{ + for ( int i=0; i<5; i++ ) + { + g_config.alphas_mods[i] = alphas_mods[i]; + } + + backlight_config_save(); +} + +void backlight_config_load(void) +{ + eeprom_read_block( &g_config, ((void*)RGB_BACKLIGHT_CONFIG_EEPROM_ADDR), sizeof(backlight_config) ); +} + +void backlight_config_save(void) +{ + eeprom_update_block( &g_config, ((void*)RGB_BACKLIGHT_CONFIG_EEPROM_ADDR), sizeof(backlight_config) ); +} + +void backlight_init_drivers(void) +{ + // Initialize I2C + i2c_init(); + IS31FL3731_init( ISSI_ADDR_1 ); + IS31FL3731_init( ISSI_ADDR_2 ); + + for ( int index = 0; index < 72; index++ ) + { + // OR the possible "disabled" cases together, then NOT the result to get the enabled state + // LC6 LD13 not present on Zeal65 +#if defined (RGB_BACKLIGHT_ZEAL65) + bool enabled = !( ( index == 18+5 && !g_config.use_split_backspace ) || // LB5 + ( index == 36+15 && !g_config.use_split_left_shift ) || // LC15 + ( index == 54+8 && !g_config.use_split_right_shift ) || // LD8 + ( index == 36+6 ) || // LC6 + ( index == 54+13 ) ); // LD13 +#elif defined (RGB_BACKLIGHT_M60_A) + bool enabled = !( + // LB6 LB7 LB8 LB15 LB16 LB17 not present on M60-A + ( index == 18+6 ) || // LB6 + ( index == 18+7 ) || // LB7 + ( index == 18+8 ) || // LB8 + ( index == 18+15 ) || // LB15 + ( index == 18+16 ) || // LB16 + ( index == 18+17 ) || // LB17 + // HHKB blockers (LC17, LD17) and ISO extra keys (LC15,LD13) not present on M60-A + ( index == 36+17 ) || // LC17 + ( index == 54+17 ) || // LD17 + ( index == 36+15 ) || // LC15 + ( index == 54+13 ) ); // LD13 +#elif defined (RGB_BACKLIGHT_ZEAL60) + // LB6 LB7 LB8 LB15 LB16 LB17 not present on Zeal60 + bool enabled = !( ( index == 18+5 && !g_config.use_split_backspace ) || // LB5 + ( index == 36+15 && !g_config.use_split_left_shift ) || // LC15 + ( index == 54+8 && !g_config.use_split_right_shift ) || // LD8 + ( index == 54+13 && g_config.use_7u_spacebar ) || // LD13 + ( index == 36+17 && g_config.disable_hhkb_blocker_leds ) || // LC17 + ( index == 54+17 && g_config.disable_hhkb_blocker_leds ) || // LD17 + ( index == 18+6 ) || // LB6 + ( index == 18+7 ) || // LB7 + ( index == 18+8 ) || // LB8 + ( index == 18+15 ) || // LB15 + ( index == 18+16 ) || // LB16 + ( index == 18+17 ) ); // LB17 +#endif + // This only caches it for later + IS31FL3731_set_led_control_register( index, enabled, enabled, enabled ); + } + // This actually updates the LED drivers + IS31FL3731_update_led_control_registers( ISSI_ADDR_1, ISSI_ADDR_2 ); + + // TODO: put the 1 second startup delay here? + + // clear the key hits + for ( int led=0; led<72; led++ ) + { + g_key_hit[led] = 255; + } +} + +bool process_record_backlight(uint16_t keycode, keyrecord_t *record) +{ + // Record keypresses for backlight effects + if ( record->event.pressed ) + { + backlight_set_key_hit( record->event.key.row, record->event.key.col ); + } + + switch(keycode) + { + case BR_INC: + if (record->event.pressed) + { + backlight_brightness_increase(); + } + return false; + break; + case BR_DEC: + if (record->event.pressed) + { + backlight_brightness_decrease(); + } + return false; + break; + case EF_INC: + if (record->event.pressed) + { + backlight_effect_increase(); + } + return false; + break; + case EF_DEC: + if (record->event.pressed) + { + backlight_effect_decrease(); + } + return false; + break; + case ES_INC: + if (record->event.pressed) + { + backlight_effect_speed_increase(); + } + return false; + break; + case ES_DEC: + if (record->event.pressed) + { + backlight_effect_speed_decrease(); + } + return false; + break; + case H1_INC: + if (record->event.pressed) + { + backlight_color_1_hue_increase(); + } + return false; + break; + case H1_DEC: + if (record->event.pressed) + { + backlight_color_1_hue_decrease(); + } + return false; + break; + case S1_INC: + if (record->event.pressed) + { + backlight_color_1_sat_increase(); + } + return false; + break; + case S1_DEC: + if (record->event.pressed) + { + backlight_color_1_sat_decrease(); + break; + } + return false; + break; + case H2_INC: + if (record->event.pressed) + { + backlight_color_2_hue_increase(); + } + return false; + break; + case H2_DEC: + if (record->event.pressed) + { + backlight_color_2_hue_decrease(); + } + return false; + break; + case S2_INC: + if (record->event.pressed) + { + backlight_color_2_sat_increase(); + } + return false; + break; + case S2_DEC: + if (record->event.pressed) + { + backlight_color_2_sat_decrease(); + break; + } + return false; + break; + } + + return true; +} + +// Deals with the messy details of incrementing an integer +uint8_t increment( uint8_t value, uint8_t step, uint8_t min, uint8_t max ) +{ + int16_t new_value = value; + new_value += step; + return MIN( MAX( new_value, min ), max ); +} + +uint8_t decrement( uint8_t value, uint8_t step, uint8_t min, uint8_t max ) +{ + int16_t new_value = value; + new_value -= step; + return MIN( MAX( new_value, min ), max ); +} + +void backlight_effect_increase(void) +{ + g_config.effect = increment( g_config.effect, 1, 0, BACKLIGHT_EFFECT_MAX ); + backlight_config_save(); +} + +void backlight_effect_decrease(void) +{ + g_config.effect = decrement( g_config.effect, 1, 0, BACKLIGHT_EFFECT_MAX ); + backlight_config_save(); +} + +void backlight_effect_speed_increase(void) +{ + g_config.effect_speed = increment( g_config.effect_speed, 1, 0, 3 ); + backlight_config_save(); +} + +void backlight_effect_speed_decrease(void) +{ + g_config.effect_speed = decrement( g_config.effect_speed, 1, 0, 3 ); + backlight_config_save(); +} + +void backlight_brightness_increase(void) +{ + g_config.brightness = increment( g_config.brightness, 8, 0, 255 ); + backlight_config_save(); +} + +void backlight_brightness_decrease(void) +{ + g_config.brightness = decrement( g_config.brightness, 8, 0, 255 ); + backlight_config_save(); +} + +void backlight_color_1_hue_increase(void) +{ + g_config.color_1.h = increment( g_config.color_1.h, 8, 0, 255 ); + backlight_config_save(); +} + +void backlight_color_1_hue_decrease(void) +{ + g_config.color_1.h = decrement( g_config.color_1.h, 8, 0, 255 ); + backlight_config_save(); +} + +void backlight_color_1_sat_increase(void) +{ + g_config.color_1.s = increment( g_config.color_1.s, 8, 0, 255 ); + backlight_config_save(); +} + +void backlight_color_1_sat_decrease(void) +{ + g_config.color_1.s = decrement( g_config.color_1.s, 8, 0, 255 ); + backlight_config_save(); +} + +void backlight_color_2_hue_increase(void) +{ + g_config.color_2.h = increment( g_config.color_2.h, 8, 0, 255 ); + backlight_config_save(); +} + +void backlight_color_2_hue_decrease(void) +{ + g_config.color_2.h = decrement( g_config.color_2.h, 8, 0, 255 ); + backlight_config_save(); +} + +void backlight_color_2_sat_increase(void) +{ + g_config.color_2.s = increment( g_config.color_2.s, 8, 0, 255 ); + backlight_config_save(); +} + +void backlight_color_2_sat_decrease(void) +{ + g_config.color_2.s = decrement( g_config.color_2.s, 8, 0, 255 ); + backlight_config_save(); +} + +void backlight_test_led( uint8_t index, bool red, bool green, bool blue ) +{ + for ( int i=0; i<72; i++ ) + { + if ( i == index ) + { + IS31FL3731_set_led_control_register( i, red, green, blue ); + } + else + { + IS31FL3731_set_led_control_register( i, false, false, false ); + } + } +} + +void backlight_debug_led( bool state ) +{ + if (state) + { + // Output high. + DDRE |= (1<<6); + PORTE |= (1<<6); + } + else + { + // Output low. + DDRE &= ~(1<<6); + PORTE &= ~(1<<6); + } +} + +#endif // BACKLIGHT_ENABLED diff --git a/keyboards/zeal60/rgb_backlight.h b/keyboards/zeal60/rgb_backlight.h new file mode 100644 index 000000000..60f2ace51 --- /dev/null +++ b/keyboards/zeal60/rgb_backlight.h @@ -0,0 +1,101 @@ +/* Copyright 2017 Jason Williams (Wilba) + * + * 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 . + */ +#pragma once + +#if RGB_BACKLIGHT_ENABLED +#else +#error rgb_backlight.h included when RGB_BACKLIGHT_ENABLED == 0 +#endif // RGB_BACKLIGHT_ENABLED + +#include +#include + +#include "quantum/color.h" + +typedef struct +{ + HSV color; + uint8_t index; +} backlight_config_indicator; + +typedef struct +{ + bool use_split_backspace:1; // | + bool use_split_left_shift:1; // | + bool use_split_right_shift:1; // | + bool use_7u_spacebar:1; // | + bool use_iso_enter:1; // | + bool disable_when_usb_suspended:1; // | + bool disable_hhkb_blocker_leds:1; // | + bool __pad7:1; // 1 byte + uint8_t disable_after_timeout; // 1 byte + uint8_t brightness; // 1 byte + uint8_t effect; // 1 byte + uint8_t effect_speed; // 1 byte + HSV color_1; // 3 bytes + HSV color_2; // 3 bytes + backlight_config_indicator caps_lock_indicator; // 4 bytes + backlight_config_indicator layer_1_indicator; // 4 bytes + backlight_config_indicator layer_2_indicator; // 4 bytes + backlight_config_indicator layer_3_indicator; // 4 bytes + uint16_t alphas_mods[5]; // 10 bytes +} backlight_config; // = 37 bytes + +void backlight_config_load(void); +void backlight_config_save(void); +void backlight_config_set_value( uint8_t *data ); +void backlight_config_get_value( uint8_t *data ); + +void backlight_init_drivers(void); + +void backlight_timer_init(void); +void backlight_timer_enable(void); +void backlight_timer_disable(void); + +void backlight_set_suspend_state(bool state); +void backlight_set_indicator_state(uint8_t state); + +// This should not be called from an interrupt +// (eg. from a timer interrupt). +// Call this while idle (in between matrix scans). +// If the buffer is dirty, it will update the driver with the buffer. +void backlight_update_pwm_buffers(void); + +// Handle backlight specific keycodes +bool process_record_backlight(uint16_t keycode, keyrecord_t *record); + +void backlight_set_key_hit(uint8_t row, uint8_t col); + +void backlight_effect_increase(void); +void backlight_effect_decrease(void); +void backlight_effect_speed_increase(void); +void backlight_effect_speed_decrease(void); + +void backlight_brightness_increase(void); +void backlight_brightness_decrease(void); + +void backlight_color_1_hue_increase(void); +void backlight_color_1_hue_decrease(void); +void backlight_color_1_sat_increase(void); +void backlight_color_1_sat_decrease(void); +void backlight_color_2_hue_increase(void); +void backlight_color_2_hue_decrease(void); +void backlight_color_2_sat_increase(void); +void backlight_color_2_sat_decrease(void); + +void backlight_test_led( uint8_t index, bool red, bool green, bool blue ); +void backlight_debug_led(bool state); + diff --git a/keyboards/zeal60/rgb_backlight_api.h b/keyboards/zeal60/rgb_backlight_api.h new file mode 100644 index 000000000..01827e849 --- /dev/null +++ b/keyboards/zeal60/rgb_backlight_api.h @@ -0,0 +1,42 @@ +/* Copyright 2017 Jason Williams (Wilba) + * + * 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 . + */ +#pragma once + +enum backlight_config_value +{ + id_use_split_backspace = 0x01, + id_use_split_left_shift = 0x02, + id_use_split_right_shift = 0x03, + id_use_7u_spacebar = 0x04, + id_use_iso_enter = 0x05, + id_disable_hhkb_blocker_leds = 0x06, + id_disable_when_usb_suspended = 0x07, + id_disable_after_timeout = 0x08, + id_brightness = 0x09, + id_effect = 0x0A, + id_effect_speed = 0x0B, + id_color_1 = 0x0C, + id_color_2 = 0x0D, + id_caps_lock_indicator_color = 0x0E, + id_caps_lock_indicator_row_col = 0x0F, + id_layer_1_indicator_color = 0x10, + id_layer_1_indicator_row_col = 0x11, + id_layer_2_indicator_color = 0x12, + id_layer_2_indicator_row_col = 0x13, + id_layer_3_indicator_color = 0x14, + id_layer_3_indicator_row_col = 0x15, + id_alphas_mods = 0x16 +}; diff --git a/keyboards/zeal60/rgb_backlight_keycodes.h b/keyboards/zeal60/rgb_backlight_keycodes.h new file mode 100644 index 000000000..ba7f03f89 --- /dev/null +++ b/keyboards/zeal60/rgb_backlight_keycodes.h @@ -0,0 +1,34 @@ +/* Copyright 2017 Jason Williams (Wilba) + * + * 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 . + */ +#pragma once + +// This is hardcoded at 0x5F00 so it's well after keycode value SAFE_RANGE +enum backlight_keycodes { + BR_INC = 0x5F00, // backlight brightness increase + BR_DEC, // backlight brightness decrease + EF_INC, // backlight effect increase + EF_DEC, // backlight effect decrease + ES_INC, + ES_DEC, + H1_INC, + H1_DEC, + S1_INC, + S1_DEC, + H2_INC, + H2_DEC, + S2_INC, + S2_DEC +}; diff --git a/keyboards/zeal60/rules.mk b/keyboards/zeal60/rules.mk new file mode 100644 index 000000000..c4686f985 --- /dev/null +++ b/keyboards/zeal60/rules.mk @@ -0,0 +1,78 @@ + + +# project specific files +SRC = rgb_backlight.c \ + quantum/color.c \ + drivers/issi/is31fl3731.c \ + drivers/avr/i2c_master.c + +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + +# Boot Section +BOOTLOADER = atmel-dfu + +# Do not put the microcontroller into power saving mode +# when we get USB suspend event. We want it to keep updating +# backlight effects. +OPT_DEFS += -DNO_SUSPEND_POWER_DOWN + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend + +RAW_ENABLE = yes +DYNAMIC_KEYMAP_ENABLE = yes +CIE1931_CURVE = yes + diff --git a/keyboards/zeal60/zeal60.c b/keyboards/zeal60/zeal60.c new file mode 100644 index 000000000..e516c4dbf --- /dev/null +++ b/keyboards/zeal60/zeal60.c @@ -0,0 +1,341 @@ +/* Copyright 2017 Jason Williams (Wilba) + * + * 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 . + */ +#include "zeal60.h" +#include "zeal60_api.h" + +// Check that no backlight functions are called +#if RGB_BACKLIGHT_ENABLED +#include "rgb_backlight.h" +#endif // BACKLIGHT_ENABLED + +#include "raw_hid.h" +#include "dynamic_keymap.h" +#include "timer.h" +#include "tmk_core/common/eeprom.h" + +bool eeprom_is_valid(void) +{ + return (eeprom_read_word(((void*)EEPROM_MAGIC_ADDR)) == EEPROM_MAGIC && + eeprom_read_byte(((void*)EEPROM_VERSION_ADDR)) == EEPROM_VERSION); +} + +void eeprom_set_valid(bool valid) +{ + eeprom_update_word(((void*)EEPROM_MAGIC_ADDR), valid ? EEPROM_MAGIC : 0xFFFF); + eeprom_update_byte(((void*)EEPROM_VERSION_ADDR), valid ? EEPROM_VERSION : 0xFF); +} + +#ifdef RAW_ENABLE + +void raw_hid_receive( uint8_t *data, uint8_t length ) +{ + uint8_t *command_id = &(data[0]); + uint8_t *command_data = &(data[1]); + switch ( *command_id ) + { + case id_get_protocol_version: + { + command_data[0] = PROTOCOL_VERSION >> 8; + command_data[1] = PROTOCOL_VERSION & 0xFF; + break; + } + case id_get_keyboard_value: + { + if ( command_data[0] == 0x01 ) + { + uint32_t value = timer_read32(); + command_data[1] = (value >> 24 ) & 0xFF; + command_data[2] = (value >> 16 ) & 0xFF; + command_data[3] = (value >> 8 ) & 0xFF; + command_data[4] = value & 0xFF; + } + else + { + *command_id = id_unhandled; + } + break; + } +#ifdef DYNAMIC_KEYMAP_ENABLE + case id_dynamic_keymap_get_keycode: + { + uint16_t keycode = dynamic_keymap_get_keycode( command_data[0], command_data[1], command_data[2] ); + command_data[3] = keycode >> 8; + command_data[4] = keycode & 0xFF; + break; + } + case id_dynamic_keymap_set_keycode: + { + dynamic_keymap_set_keycode( command_data[0], command_data[1], command_data[2], ( command_data[3] << 8 ) | command_data[4] ); + break; + } + case id_dynamic_keymap_clear_all: + { + dynamic_keymap_clear_all(); + break; + } +#endif // DYNAMIC_KEYMAP_ENABLE +#if RGB_BACKLIGHT_ENABLED + case id_backlight_config_set_value: + { + backlight_config_set_value(command_data); + break; + } + case id_backlight_config_get_value: + { + backlight_config_get_value(command_data); + break; + } + case id_backlight_config_save: + { + backlight_config_save(); + break; + } +#endif // RGB_BACKLIGHT_ENABLED + default: + { + // Unhandled message. + *command_id = id_unhandled; + break; + } + } + + // Return same buffer with values changed + raw_hid_send( data, length ); + +} + +#endif + +void bootmagic_lite(void) +{ + // The lite version of TMK's bootmagic. + // 100% less potential for accidentally making the + // keyboard do stupid things. + + // We need multiple scans because debouncing can't be turned off. + matrix_scan(); + wait_ms(DEBOUNCING_DELAY); + wait_ms(DEBOUNCING_DELAY); + matrix_scan(); + + // If the Esc and space bar are held down on power up, + // reset the EEPROM valid state and jump to bootloader. + // Assumes Esc is at [0,0] and spacebar is at [4,7]. + // This isn't very generalized, but we need something that doesn't + // rely on user's keymaps in firmware or EEPROM. + if ( ( matrix_get_row(0) & (1<<0) ) && + ( matrix_get_row(4) & (1<<7) ) ) + { + // Set the Zeal60 specific EEPROM state as invalid. + eeprom_set_valid(false); + // Set the TMK/QMK EEPROM state as invalid. + eeconfig_disable(); + // Jump to bootloader. + bootloader_jump(); + } +} + +void matrix_init_kb(void) +{ + bootmagic_lite(); + + // If the EEPROM has the magic, the data is good. + // OK to load from EEPROM. + if (eeprom_is_valid()) + { +#if RGB_BACKLIGHT_ENABLED + backlight_config_load(); +#endif // RGB_BACKLIGHT_ENABLED + // TODO: do something to "turn on" keymaps in EEPROM? + } + else + { +#if RGB_BACKLIGHT_ENABLED + // If the EEPROM has not been saved before, or is out of date, + // save the default values to the EEPROM. Default values + // come from construction of the zeal_backlight_config instance. + backlight_config_save(); +#endif // RGB_BACKLIGHT_ENABLED + +#ifdef DYNAMIC_KEYMAP_ENABLE + // This saves "empty" keymaps so it falls back to the keymaps + // in the firmware (aka. progmem/flash) + dynamic_keymap_clear_all(); +#endif + + // Save the magic number last, in case saving was interrupted + eeprom_set_valid(true); + } + +#if RGB_BACKLIGHT_ENABLED + // Initialize LED drivers for backlight. + backlight_init_drivers(); + + backlight_timer_init(); + backlight_timer_enable(); +#endif // RGB_BACKLIGHT_ENABLED + + matrix_init_user(); +} + +void matrix_scan_kb(void) +{ +#if RGB_BACKLIGHT_ENABLED + // This only updates the LED driver buffers if something has changed. + backlight_update_pwm_buffers(); +#endif // BACKLIGHT_ENABLED + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) +{ +#if RGB_BACKLIGHT_ENABLED + process_record_backlight(keycode, record); +#endif // BACKLIGHT_ENABLED + + switch(keycode) + { + case FN_MO13: + if (record->event.pressed) + { + layer_on(1); + update_tri_layer(1, 2, 3); + } + else + { + layer_off(1); + update_tri_layer(1, 2, 3); + } + return false; + break; + case FN_MO23: + if (record->event.pressed) + { + layer_on(2); + update_tri_layer(1, 2, 3); + } + else + { + layer_off(2); + update_tri_layer(1, 2, 3); + } + return false; + break; + } + + return process_record_user(keycode, record); +} + +// This overrides the one in quantum/keymap_common.c +uint16_t keymap_function_id_to_action( uint16_t function_id ) +{ + // Zeal60 specific "action functions" are 0xF00 to 0xFFF + // i.e. F(0xF00) to F(0xFFF) are mapped to + // enum zeal60_action_functions by masking last 8 bits. + if ( function_id >= 0x0F00 && function_id <= 0x0FFF ) + { + uint8_t id = function_id & 0xFF; + switch ( id ) + { + case TRIPLE_TAP_1_3: + case TRIPLE_TAP_2_3: + { + return ACTION_FUNCTION_TAP(id); + break; + } + default: + break; + } + } + +#if USE_KEYMAPS_IN_EEPROM + +#if 0 + // This is how to implement actions stored in EEPROM. + // Not yet implemented. Not sure if it's worth the trouble + // before we have a nice GUI for keymap editing. + if ( eeprom_is_valid() && + function_id < 32 ) // TODO: replace magic number + { + uint16_t action = keymap_action_load(function_id); + + // If action is not "empty", return it, otherwise + // drop down to return the one in flash + if ( action != 0x0000 ) // TODO: replace magic number + { + return action; + } + } +#endif + +#endif // USE_KEYMAPS_IN_EEPROM + + return pgm_read_word(&fn_actions[function_id]); +} + + +// Zeal60 specific "action functions" +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + switch (id) + { + case TRIPLE_TAP_1_3: + case TRIPLE_TAP_2_3: + if (record->event.pressed) + { + layer_on( id == TRIPLE_TAP_1_3 ? 1 : 2 ); + + if (record->tap.count && !record->tap.interrupted) + { + if (record->tap.count >= 3) + { + layer_invert(3); + } + } + else + { + record->tap.count = 0; + } + } + else + { + layer_off( id == TRIPLE_TAP_1_3 ? 1 : 2 ); + } + break; + } +} + +void led_set_kb(uint8_t usb_led) +{ +#if RGB_BACKLIGHT_ENABLED + backlight_set_indicator_state(usb_led); +#endif // RGB_BACKLIGHT_ENABLED +} + +void suspend_power_down_kb(void) +{ +#if RGB_BACKLIGHT_ENABLED + backlight_set_suspend_state(true); +#endif // RGB_BACKLIGHT_ENABLED +} + +void suspend_wakeup_init_kb(void) +{ +#if RGB_BACKLIGHT_ENABLED + backlight_set_suspend_state(false); +#endif // RGB_BACKLIGHT_ENABLED +} + diff --git a/keyboards/zeal60/zeal60.h b/keyboards/zeal60/zeal60.h new file mode 100644 index 000000000..ef9de7989 --- /dev/null +++ b/keyboards/zeal60/zeal60.h @@ -0,0 +1,93 @@ +/* Copyright 2017 Jason Williams (Wilba) + * + * 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 . + */ +#pragma once + +#include "quantum.h" +#include "rgb_backlight_keycodes.h" +#include "zeal60_keycodes.h" + +#define XXX KC_NO + +#define LAYOUT_60_all( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K2D, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \ + K40, K41, K42, K47, K4A, K4B, K4C, K4D \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D }, \ + { K40, K41, K42, XXX, XXX, XXX, XXX, K47, XXX, XXX, K4A, K4B, K4C, K4D } \ +} + +#define LAYOUT_60_ansi( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, \ + K40, K41, K42, K47, K4A, K4B, K4C, K4D \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, XXX }, \ + { K30, XXX, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, XXX }, \ + { K40, K41, K42, XXX, XXX, XXX, XXX, K47, XXX, XXX, K4A, K4B, K4C, K4D } \ +} + +#define LAYOUT_60_iso( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, \ + K40, K41, K42, K47, K4A, K4B, K4C, K4D \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, XXX }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, XXX }, \ + { K40, K41, K42, XXX, XXX, XXX, XXX, K47, XXX, XXX, K4A, K4B, K4C, K4D } \ +} + +#define LAYOUT_60_ansi_split_bs_rshift( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K2D, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \ + K40, K41, K42, K47, K4A, K4B, K4C, K4D \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D }, \ + { K30, XXX, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D }, \ + { K40, K41, K42, XXX, XXX, XXX, XXX, K47, XXX, XXX, K4A, K4B, K4C, K4D } \ +} + +#define LAYOUT_60_hhkb( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K2D, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \ + K41, K42, K47, K4B, K4C \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D }, \ + { K30, XXX, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D }, \ + { XXX, K41, K42, XXX, XXX, XXX, XXX, K47, XXX, XXX, XXX, K4B, K4C, XXX } \ +} + diff --git a/keyboards/zeal60/zeal60_api.h b/keyboards/zeal60/zeal60_api.h new file mode 100644 index 000000000..baa8ac09f --- /dev/null +++ b/keyboards/zeal60/zeal60_api.h @@ -0,0 +1,33 @@ +/* Copyright 2017 Jason Williams (Wilba) + * + * 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 . + */ +#pragma once + +#define PROTOCOL_VERSION 0x0007 + +enum zeal60_command_id +{ + id_get_protocol_version = 0x01, // always 0x01 + id_get_keyboard_value, + id_set_keyboard_value, + id_dynamic_keymap_get_keycode, + id_dynamic_keymap_set_keycode, + id_dynamic_keymap_clear_all, + id_backlight_config_set_value, + id_backlight_config_get_value, + id_backlight_config_save, + + id_unhandled = 0xFF, +}; diff --git a/keyboards/zeal60/zeal60_keycodes.h b/keyboards/zeal60/zeal60_keycodes.h new file mode 100644 index 000000000..9511801eb --- /dev/null +++ b/keyboards/zeal60/zeal60_keycodes.h @@ -0,0 +1,42 @@ +/* Copyright 2017 Jason Williams (Wilba) + * + * 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 . + */ +#pragma once + +// Can't use SAFE_RANGE here, it might change if someone adds +// new values to enum quantum_keycodes. +// Need to keep checking 0x5F10 is still in the safe range. +// TODO: merge this into quantum_keycodes +// Backlight keycodes are in range 0x5F00-0x5F0F +enum zeal60_keycodes { + FN_MO13 = 0x5F10, + FN_MO23 +}; + +// Zeal60 specific "action functions" +// These are only valid IDs in action_function() +// Use FN_TT13, FN_TT23, etc. in keymaps +enum zeal60_action_functions { + TRIPLE_TAP_1_3 = 0x31, + TRIPLE_TAP_2_3 = 0x32 +}; + +// Bitwise OR the above with 0x0F00 to use in F(x) macro +// This reserves the top 256 of the 4096 range of F(x) keycodes, +// leaving the rest for use in fn_actions[] or actions in EEPROM. +#define FN_TT13 F((0x0F00|TRIPLE_TAP_1_3)) +#define FN_TT23 F((0x0F00|TRIPLE_TAP_2_3)) + +#define TG_NKRO MAGIC_TOGGLE_NKRO diff --git a/keyboards/zeal65/config.h b/keyboards/zeal65/config.h new file mode 100644 index 000000000..2dbf61237 --- /dev/null +++ b/keyboards/zeal65/config.h @@ -0,0 +1,125 @@ +/* Copyright 2017 Jason Williams (Wilba) + * + * 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 . + */ +#pragma once + +#include "config_common.h" + +// USB Device descriptor parameter +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6065 +#define DEVICE_VER 0x0001 +#define MANUFACTURER ZealPC +#define PRODUCT Zeal65 +#define DESCRIPTION Zeal65 (QMK Firmware) + +// key matrix size +#define MATRIX_ROWS 5 +#define MATRIX_COLS 15 + +// Zeal60 PCB default pin-out +#define MATRIX_ROW_PINS { F0, F1, F4, F6, F7 } +#define MATRIX_COL_PINS { F5, D5, B1, B2, B3, D3, D2, C7, C6, B6, B5, B4, D7, D6, D4 } +#define UNUSED_PINS + +// IS31FL3731 driver +#define DRIVER_COUNT 2 +#define DRIVER_LED_TOTAL 72 + +// COL2ROW or ROW2COL +#define DIODE_DIRECTION COL2ROW + +// Set 0 if debouncing isn't needed +#define DEBOUNCING_DELAY 5 + +// 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 + +// key combination for command +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* + * 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 + +#define RGB_BACKLIGHT_ENABLED 1 + +// This conditionally compiles the backlight code for Zeal65 specifics +#define RGB_BACKLIGHT_ZEAL65 + +// enable/disable LEDs based on layout +#define RGB_BACKLIGHT_USE_SPLIT_BACKSPACE 0 +#define RGB_BACKLIGHT_USE_SPLIT_LEFT_SHIFT 0 +#define RGB_BACKLIGHT_USE_SPLIT_RIGHT_SHIFT 1 +#define RGB_BACKLIGHT_USE_7U_SPACEBAR 0 +#define RGB_BACKLIGHT_USE_ISO_ENTER 0 +#define RGB_BACKLIGHT_DISABLE_HHKB_BLOCKER_LEDS 0 + +// disable backlight when USB suspended (PC sleep/hibernate/shutdown) +#define RGB_BACKLIGHT_DISABLE_WHEN_USB_SUSPENDED 0 + +// disable backlight after timeout in minutes, 0 = no timeout +#define RGB_BACKLIGHT_DISABLE_AFTER_TIMEOUT 0 + +// the default effect (RGB test) +#define RGB_BACKLIGHT_EFFECT 255 + +// These define which keys in the matrix are alphas/mods +// Used for backlight effects so colors are different for +// alphas vs. mods +// Each value is for a row, bit 0 is column 0 +// Alpha=0 Mod=1 +#define RGB_BACKLIGHT_ALPHAS_MODS_ROW_0 0b0110000000000001 +#define RGB_BACKLIGHT_ALPHAS_MODS_ROW_1 0b0100000000000001 +#define RGB_BACKLIGHT_ALPHAS_MODS_ROW_2 0b0101000000000001 +#define RGB_BACKLIGHT_ALPHAS_MODS_ROW_3 0b0111000000000001 +#define RGB_BACKLIGHT_ALPHAS_MODS_ROW_4 0b0111110000000011 + +#define DYNAMIC_KEYMAP_LAYER_COUNT 4 + +// EEPROM usage + +// TODO: refactor with new user EEPROM code (coming soon) +#define EEPROM_MAGIC 0x451F +#define EEPROM_MAGIC_ADDR 32 +// Bump this every time we change what we store +// This will automatically reset the EEPROM with defaults +// and avoid loading invalid data from the EEPROM +#define EEPROM_VERSION 0x07 +#define EEPROM_VERSION_ADDR 34 + +// Backlight config starts after EEPROM version +#define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 35 +// Dynamic keymap starts after backlight config (35+37) +#define DYNAMIC_KEYMAP_EEPROM_ADDR 72 + diff --git a/keyboards/zeal65/info.json b/keyboards/zeal65/info.json new file mode 100644 index 000000000..94a090689 --- /dev/null +++ b/keyboards/zeal65/info.json @@ -0,0 +1,16 @@ +{ + "keyboard_name": "Zeal65", + "url": "", + "maintainer": "Wilba", + "bootloader": "DFU", + "width": 16, + "height": 5, + "layouts": { + "LAYOUT_65_split_bs": { + "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"|", "x":13, "y":0}, {"label":"Del", "x":14, "y":0}, {"label":"Home", "x":15, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"Backspace", "x":13.5, "y":1, "w":1.5}, {"label":"PgUp", "x":15, "y":1}, {"label":"Control", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"PgDn", "x":15, "y":2}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"label":"\u2191", "x":14, "y":3}, {"label":"End", "x":15, "y":3}, {"label":"Win", "x":0, "y":4, "w":1.5}, {"label":"Alt", "x":1.5, "y":4, "w":1.5}, {"x":3, "y":4, "w":7}, {"label":"Fn2", "x":10, "y":4, "w":1.5}, {"label":"Fn1", "x":11.5, "y":4, "w":1.5}, {"label":"\u2190", "x":13, "y":4}, {"label":"\u2193", "x":14, "y":4}, {"label":"\u2192", "x":15, "y":4}] + }, + "LAYOUT_65_normie": { + "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Home", "x":15, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"PgUp", "x":15, "y":1}, {"label":"Control", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"PgDn", "x":15, "y":2}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"label":"\u2191", "x":14, "y":3}, {"label":"End", "x":15, "y":3}, {"label":"Win", "x":0, "y":4, "w":1.5}, {"label":"Alt", "x":1.5, "y":4, "w":1.5}, {"x":3, "y":4, "w":7}, {"label":"Fn2", "x":10, "y":4, "w":1.5}, {"label":"Fn1", "x":11.5, "y":4, "w":1.5}, {"label":"\u2190", "x":13, "y":4}, {"label":"\u2193", "x":14, "y":4}, {"label":"\u2192", "x":15, "y":4}] + } + } +} \ No newline at end of file diff --git a/keyboards/zeal65/keymaps/default/config.h b/keyboards/zeal65/keymaps/default/config.h new file mode 100644 index 000000000..f579dfaa7 --- /dev/null +++ b/keyboards/zeal65/keymaps/default/config.h @@ -0,0 +1,5 @@ +#pragma once + +/* enable/disable LEDs based on layout */ +#undef RGB_BACKLIGHT_USE_SPLIT_BACKSPACE +#define RGB_BACKLIGHT_USE_SPLIT_BACKSPACE 0 diff --git a/keyboards/zeal65/keymaps/default/keymap.c b/keyboards/zeal65/keymaps/default/keymap.c new file mode 100644 index 000000000..dd1a715d0 --- /dev/null +++ b/keyboards/zeal65/keymaps/default/keymap.c @@ -0,0 +1,38 @@ +// Default layout for Zeal65 +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +// Default layer +[0] = LAYOUT_65_normie( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_HOME, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END, + KC_LCTL, KC_LALT, KC_SPC, FN_MO23, FN_MO13, KC_LEFT, KC_DOWN, KC_RGHT), + +// Fn1 Layer +[1] = LAYOUT_65_normie( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +// Fn2 Layer +[2] = LAYOUT_65_normie( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +// Fn3 Layer (zeal60 Configuration) +[3] = LAYOUT_65_normie( + KC_TRNS, EF_DEC, EF_INC, H1_DEC, H1_INC, H2_DEC, H2_INC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, BR_DEC, BR_INC, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, S1_DEC, S1_INC, S2_DEC, S2_INC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +}; diff --git a/keyboards/zeal65/keymaps/split_bs/config.h b/keyboards/zeal65/keymaps/split_bs/config.h new file mode 100644 index 000000000..018be8d7c --- /dev/null +++ b/keyboards/zeal65/keymaps/split_bs/config.h @@ -0,0 +1,5 @@ +#pragma once + +/* enable/disable LEDs based on layout */ +#undef RGB_BACKLIGHT_USE_SPLIT_BACKSPACE +#define RGB_BACKLIGHT_USE_SPLIT_BACKSPACE 1 diff --git a/keyboards/zeal65/keymaps/split_bs/keymap.c b/keyboards/zeal65/keymaps/split_bs/keymap.c new file mode 100644 index 000000000..96b04c358 --- /dev/null +++ b/keyboards/zeal65/keymaps/split_bs/keymap.c @@ -0,0 +1,38 @@ +// Split-backspace layout for Zeal65 +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +// Default layer +[0] = LAYOUT_65_split_bs( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_DEL, KC_HOME, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, KC_PGUP, + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END, + KC_LGUI, KC_LALT, KC_SPC, FN_MO23, FN_MO13, KC_LEFT, KC_DOWN, KC_RGHT), + +// Fn1 Layer +[1] = LAYOUT_65_split_bs( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, KC_TRNS, + KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +// Fn2 Layer +[2] = LAYOUT_65_split_bs( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +// Fn3 Layer (zeal60 Configuration) +[3] = LAYOUT_65_split_bs( + KC_TRNS, EF_DEC, EF_INC, H1_DEC, H1_INC, H2_DEC, H2_INC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, BR_DEC, BR_INC, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, S1_DEC, S1_INC, S2_DEC, S2_INC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +}; diff --git a/keyboards/zeal65/readme.md b/keyboards/zeal65/readme.md new file mode 100644 index 000000000..8f43dc243 --- /dev/null +++ b/keyboards/zeal65/readme.md @@ -0,0 +1,16 @@ +Zeal65 +==== + +![Zeal65](https://cdn.shopify.com/s/files/1/0490/7329/products/Zeal65_PCB2.jpg) + +This is a 65% PCB with per-key RGB LEDs and supports fixed, 1800-like bottom row and split backspace. It was designed for the Zephyr custom keyboard. + +Keyboard Maintainer: [Wilba](http://wilba.tech/) and on [github](https://github.com/Wilba6582) +Hardware Supported: Zeal65 PCB Rev 1 +Hardware Availability: https://zealpc.net/collections/group-buy-pre-orders/products/zephyr + +Make example for this keyboard (after setting up your build environment): + + make zeal65:default + +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). diff --git a/keyboards/zeal65/rules.mk b/keyboards/zeal65/rules.mk new file mode 100644 index 000000000..02617cf1c --- /dev/null +++ b/keyboards/zeal65/rules.mk @@ -0,0 +1,79 @@ + + +# project specific files +SRC = ../zeal60/zeal60.c \ + ../zeal60/rgb_backlight.c \ + quantum/color.c \ + drivers/issi/is31fl3731.c \ + drivers/avr/i2c_master.c + +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + +# Boot Section +BOOTLOADER = atmel-dfu + +# Do not put the microcontroller into power saving mode +# when we get USB suspend event. We want it to keep updating +# backlight effects. +OPT_DEFS += -DNO_SUSPEND_POWER_DOWN + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +RAW_ENABLE = yes +DYNAMIC_KEYMAP_ENABLE = yes +CIE1931_CURVE = yes + diff --git a/keyboards/zeal65/zeal65.c b/keyboards/zeal65/zeal65.c new file mode 100644 index 000000000..540c93080 --- /dev/null +++ b/keyboards/zeal65/zeal65.c @@ -0,0 +1,18 @@ +/* Copyright 2017 Jason Williams (Wilba) + * + * 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 . + */ +#ifndef RGB_BACKLIGHT_ZEAL65 +#error RGB_BACKLIGHT_ZEAL65 not defined, you done goofed somehao, brah +#endif diff --git a/keyboards/zeal65/zeal65.h b/keyboards/zeal65/zeal65.h new file mode 100644 index 000000000..3ee4f49e5 --- /dev/null +++ b/keyboards/zeal65/zeal65.h @@ -0,0 +1,50 @@ +/* Copyright 2017 Jason Williams (Wilba) + * + * 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 . + */ +#pragma once + +#include "quantum.h" +#include "../zeal60/rgb_backlight_keycodes.h" +#include "../zeal60/zeal60_keycodes.h" + +#define XXX KC_NO + +#define LAYOUT_65_split_bs( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K2D, K0E, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2E, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, \ + K40, K41, K47, K4A, K4B, K4C, K4D, K4E \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E }, \ + { K30, XXX, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E }, \ + { K40, K41, XXX, XXX, XXX, XXX, XXX, K47, XXX, XXX, K4A, K4B, K4C, K4D, K4E } \ +} + +#define LAYOUT_65_normie( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2E, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, \ + K40, K41, K47, K4A, K4B, K4C, K4D, K4E \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, XXX, K2E }, \ + { K30, XXX, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E }, \ + { K40, K41, XXX, XXX, XXX, XXX, XXX, K47, XXX, XXX, K4A, K4B, K4C, K4D, K4E } \ +} diff --git a/quantum/dynamic_keymap.c b/quantum/dynamic_keymap.c new file mode 100644 index 000000000..9f18612d5 --- /dev/null +++ b/quantum/dynamic_keymap.c @@ -0,0 +1,97 @@ +/* Copyright 2017 Jason Williams (Wilba) + * + * 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 . + */ + +#include "config.h" +#include "keymap.h" // to get keymaps[][][] + +#include "dynamic_keymap.h" + +#ifdef DYNAMIC_KEYMAP_ENABLE + +#ifndef DYNAMIC_KEYMAP_EEPROM_ADDR +#error DYNAMIC_KEYMAP_EEPROM_ADDR not defined +#endif + +#ifndef DYNAMIC_KEYMAP_LAYER_COUNT +#error DYNAMIC_KEYMAP_LAYER_COUNT not defined +#endif + +#define KC_EENULL 0xFFFF // TODO: move to enum quantum_keycodes + +void *dynamic_keymap_key_to_eeprom_address(uint8_t layer, uint8_t row, uint8_t column) +{ + // TODO: optimize this with some left shifts + return ((void*)DYNAMIC_KEYMAP_EEPROM_ADDR) + ( layer * MATRIX_ROWS * MATRIX_COLS * 2 ) + + ( row * MATRIX_COLS * 2 ) + ( column * 2 ); +} + +uint16_t dynamic_keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t column) +{ + void *address = dynamic_keymap_key_to_eeprom_address(layer, row, column); + // Big endian, so we can read/write EEPROM directly from host if we want + uint16_t keycode = eeprom_read_byte(address) << 8; + keycode |= eeprom_read_byte(address + 1); + return keycode; +} + +void dynamic_keymap_set_keycode(uint8_t layer, uint8_t row, uint8_t column, uint16_t keycode) +{ + void *address = dynamic_keymap_key_to_eeprom_address(layer, row, column); + // Big endian, so we can read/write EEPROM directly from host if we want + eeprom_update_byte(address, (uint8_t)(keycode >> 8)); + eeprom_update_byte(address+1, (uint8_t)(keycode & 0xFF)); +} + +void dynamic_keymap_clear_all(void) +{ + // Save "empty" keymaps. + for ( int layer = 0; layer < DYNAMIC_KEYMAP_LAYER_COUNT; layer++ ) + { + for ( int row = 0; row < MATRIX_ROWS; row++ ) + { + for ( int column = 0; column < MATRIX_COLS; column++ ) + { + dynamic_keymap_set_keycode(layer, row, column, KC_EENULL); + } + } + } +} + +// This overrides the one in quantum/keymap_common.c +uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key) +{ + // This used to test EEPROM for magic bytes, but it was redundant. + // Test for EEPROM usage change (fresh install, address change, etc.) + // externally and call dynamic_keymap_default_save() + if ( layer < DYNAMIC_KEYMAP_LAYER_COUNT && + key.row < MATRIX_ROWS && // possibly redundant + key.col < MATRIX_COLS ) // possibly redundant + { + uint16_t keycode = dynamic_keymap_get_keycode(layer, key.row, key.col); + + // If keycode is not "empty", return it, otherwise + // drop down to return the one in flash + if ( keycode != KC_EENULL) + { + return keycode; + } + } + + return pgm_read_word(&keymaps[layer][key.row][key.col]); +} + +#endif // DYNAMIC_KEYMAP_ENABLE + diff --git a/quantum/dynamic_keymap.h b/quantum/dynamic_keymap.h new file mode 100644 index 000000000..b0133aeb8 --- /dev/null +++ b/quantum/dynamic_keymap.h @@ -0,0 +1,31 @@ +/* Copyright 2017 Jason Williams (Wilba) + * + * 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 . + */ + +#ifndef DYNAMIC_KEYMAP_H +#define DYNAMIC_KEYMAP_H + +#include +#include + +void *dynamic_keymap_key_to_eeprom_address(uint8_t layer, uint8_t row, uint8_t column); +uint16_t dynamic_keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t column); +void dynamic_keymap_set_keycode(uint8_t layer, uint8_t row, uint8_t column, uint16_t keycode); +void dynamic_keymap_clear_all(void); + +// This overrides the one in quantum/keymap_common.c +// uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key); + +#endif //DYNAMIC_KEYMAP_H diff --git a/tmk_core/common/avr/suspend.c b/tmk_core/common/avr/suspend.c index d7a7f049c..5bca64685 100644 --- a/tmk_core/common/avr/suspend.c +++ b/tmk_core/common/avr/suspend.c @@ -56,6 +56,24 @@ void suspend_idle(uint8_t time) sleep_disable(); } + +// TODO: This needs some cleanup + +/** \brief Run keyboard level Power down + * + * FIXME: needs doc + */ +__attribute__ ((weak)) +void suspend_power_down_user (void) { } +/** \brief Run keyboard level Power down + * + * FIXME: needs doc + */ +__attribute__ ((weak)) +void suspend_power_down_kb(void) { + suspend_power_down_user(); +} + #ifndef NO_SUSPEND_POWER_DOWN /** \brief Power down MCU with watchdog timer * @@ -73,21 +91,6 @@ void suspend_idle(uint8_t time) */ static uint8_t wdt_timeout = 0; -/** \brief Run keyboard level Power down - * - * FIXME: needs doc - */ -__attribute__ ((weak)) -void suspend_power_down_user (void) { } -/** \brief Run keyboard level Power down - * - * FIXME: needs doc - */ -__attribute__ ((weak)) -void suspend_power_down_kb(void) { - suspend_power_down_user(); -} - /** \brief Power down * * FIXME: needs doc @@ -144,6 +147,8 @@ static void power_down(uint8_t wdto) */ void suspend_power_down(void) { + suspend_power_down_kb(); + #ifndef NO_SUSPEND_POWER_DOWN power_down(WDTO_15MS); #endif @@ -198,7 +203,7 @@ void suspend_wakeup_init(void) rgblight_timer_enable(); #endif #endif - suspend_wakeup_init_kb(); + suspend_wakeup_init_kb(); } #ifndef NO_SUSPEND_POWER_DOWN From b1f11636c63694f0e94504e5752e963c73f86c3b Mon Sep 17 00:00:00 2001 From: James Laird-Wah Date: Sat, 15 Sep 2018 11:50:12 +1000 Subject: [PATCH 093/788] docs/contributing: add `#pragma once` to Coding Conventions This supersedes the older include guard mechanism since all the compilers now support it. It's easier for new users and less prone to error. --- docs/contributing.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/contributing.md b/docs/contributing.md index 8242cc1ad..7ed7cd06a 100644 --- a/docs/contributing.md +++ b/docs/contributing.md @@ -70,6 +70,7 @@ Most of our style is pretty easy to pick up on, but right now it's not entirely * Do not write obvious comments * If you not sure if a comment is obvious, go ahead and include it. * In general we don't wrap lines, they can be as long as needed. If you do choose to wrap lines please do not wrap any wider than 76 columns. +* We use `#pragma once` at the start of header files rather than old-style include guards (`#ifndef THIS_FILE_H`, `#define THIS_FILE_H`, ..., `#endif`) # General Guidelines From db35065e1431246b5297e644a867ee6f5449a6f4 Mon Sep 17 00:00:00 2001 From: Graham P Heath Date: Sat, 15 Sep 2018 12:12:11 -0500 Subject: [PATCH 094/788] Keymap: Grahampheath: telophase fix and keymaps (#3888) * add my config * fix backlight, clean up that code * group background code, restore static var * qwerty is supposed to be in the middle * wrap layer change backlight in ifdef * backlight levels and some more 'emojis'. * Restructure to make it possible to press cmd ent on the right side of the board with one hand. * Expose the period through the number layer. Add Hyper keys to mouse layer * reduce mouse speed * add a : -P key * Thumbs up and down, remove some keys that are duplicated via function keys, clean up * fix build issues * add various emoji * duplicate default Meira keymaps * Miera updates * add documented but unmapped emoji * Sound for the Meira, was stumped by a file size! Thanks drashna! * add docs * docs * revert lib changes... * clean up * clean up * remove make file * Fixes missing key * clean up * add my lets split * add more emoji * add the telophase board (unofficially, I guess...) * add missing files * add/reset files * Review feedback implementation: Not needed. Add #define FLIP_HALF to your config.h file instead. * Review feedback implementation: All of these includes should be replaced with #include QMK_KEYBOARD_H. * Review feedback implementation: [FAILING] You may want to use LAYOUT_ortho_4x12 instead, and move this to /layouts/community/ortho_4x12/ instead. That way, you can use the same keymap for all of the boards. * clean up * add a key for command tilde (osx loves it) * at least its building again * remove adjusts and migrate layer switching to MO(_LAYER) * update the telophase readme * update the telophase readme * grahampheaths -> grahampheath * ONEHAND_ENABLE -> SWAP_HANDS_ENABLE * convert lets split to use ortho_4x12 * Move lets split keyboard layout into community/ortho_4x12 * make telophase use LAYOUT() * I did it?! * Add clap and grin * swap tabs and back and forward * whitespace * Add ellipsis and thanks emoji * Move flip_half to telophase config (conflicts with lets split layout) * Use #pragma once instead of config_user_h * remove unused stuff --- .../planck/keymaps/grahampheath/config.h | 7 +----- .../ortho_4x12/grahampheath/config.h | 2 -- .../ortho_4x12/grahampheath/keymap.c | 22 +++++++++++++++---- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/keyboards/planck/keymaps/grahampheath/config.h b/keyboards/planck/keymaps/grahampheath/config.h index 1c842420b..db24d273a 100644 --- a/keyboards/planck/keymaps/grahampheath/config.h +++ b/keyboards/planck/keymaps/grahampheath/config.h @@ -1,7 +1,4 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" +#pragma once #ifdef AUDIO_ENABLE #define STARTUP_SONG SONG(PLANCK_SOUND) @@ -39,8 +36,6 @@ /* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ //#define MIDI_TONE_KEYCODE_OCTAVES 2 -#endif - #define TAPPING_TERM 200 #undef BACKLIGHT_LEVELS diff --git a/layouts/community/ortho_4x12/grahampheath/config.h b/layouts/community/ortho_4x12/grahampheath/config.h index 21d647921..8bc3d7762 100644 --- a/layouts/community/ortho_4x12/grahampheath/config.h +++ b/layouts/community/ortho_4x12/grahampheath/config.h @@ -21,8 +21,6 @@ along with this program. If not, see . #ifndef CONFIG_USER_H #define CONFIG_USER_H -#define FLIP_HALF - #include "keyboards/lets_split/config.h" /* Use I2C or Serial, not both */ diff --git a/layouts/community/ortho_4x12/grahampheath/keymap.c b/layouts/community/ortho_4x12/grahampheath/keymap.c index e2421e9a7..0b84b66eb 100644 --- a/layouts/community/ortho_4x12/grahampheath/keymap.c +++ b/layouts/community/ortho_4x12/grahampheath/keymap.c @@ -19,6 +19,7 @@ enum custom_keycodes { CONFUSED, CRY, CLAP, + ELIP, FLIP, FNGLEFT, FNGRIGHT, @@ -35,6 +36,7 @@ enum custom_keycodes { THMBDN, THMBUP, TOUNGE, + THANKS, WINK }; @@ -114,19 +116,19 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Emoji Layer * ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ - * │HYPR0│ Q │ ;-) │ E │ 🤣 │ :-P │ Y │ U │:'-( │FLIP │ P │ │ + * │HYPR0│ Q │ ;-) │ E │ 🤣 │ :-P │ 🙏🏼 │ U │:'-( │FLIP │ P │ │ * ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ * │HYPR1│ 👆 │SHRUG│ GRIN│ :-( │ G │ <3 │ :-) │ k │LLAP │ ; │ │ * ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ - * │HYPR2│🎶^🎶│💭^💭│ 👏 | :-\ │ 🐛 │ n │ :-D │ SHIT│ . │ / │ │ + * │HYPR2│🎶^🎶│💭^💭│ 👏 | :-\ │ 🐛 │ n │ :-D │ SHIT│ ... │ / │ │ * ├─────┼─────┼─────┼─────┼─────┼─────┴─────┼─────┼─────┼─────┼─────┼─────┤ * │ │ │ │ │Brig-│ Sleep │Brig+│ 👈 │ 👎 | 👍 │ 👉 │ * └─────┴─────┴─────┴─────┴─────┴───────────┴─────┴─────┴─────┴─────┴─────┘ */ [_EMOJI] = LAYOUT_ortho_4x12( - HYPR_0, _______, WINK, _______, ROFL, TOUNGE, _______, _______, CRY, FLIP, _______, _______ , + HYPR_0, _______, WINK, _______, ROFL, TOUNGE, THANKS, _______, CRY, FLIP, _______, _______ , HYPR_1, ABOVE, SHRUG, GRIN, FROWN, _______, HEART, JOY, _______, LLAP, _______, _______ , - HYPR_2, SING, THINK, CLAP, CONFUSED, BUG, _______, _______, SHIT, _______, _______, _______ , + HYPR_2, SING, THINK, CLAP, CONFUSED, BUG, _______, _______, SHIT, ELIP, _______, _______ , _______, _______, _______, _______, KC_SLCK, KC_SLEP, KC_SLEP, KC_PAUS, FNGLEFT, THMBDN, THMBUP, FNGRIGHT ), }; @@ -174,6 +176,12 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } return false; break; + case ELIP: + if (record->event.pressed) { + SEND_STRING("..."); + } + return false; + break; case FLIP: if (record->event.pressed) { SEND_STRING("&fliptable;"); @@ -246,6 +254,12 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } return false; break; + case THANKS: + if (record->event.pressed) { + SEND_STRING("&thanks;"); + } + return false; + break; case THINK: if (record->event.pressed) { SEND_STRING("_think_"); From 9712501bf3291942067ac75b50b1675a265a3f11 Mon Sep 17 00:00:00 2001 From: Naoki Katahira Date: Sun, 16 Sep 2018 02:14:39 +0900 Subject: [PATCH 095/788] Keyboard: Add Lily58 Keyboard (#3893) * add Lily58 * file fix --- keyboards/lily58/config.h | 21 + keyboards/lily58/i2c.c | 162 ++++++++ keyboards/lily58/i2c.h | 49 +++ keyboards/lily58/keymaps/default/config.h | 41 ++ keyboards/lily58/keymaps/default/keymap.c | 155 ++++++++ keyboards/lily58/keymaps/default/rules.mk | 22 ++ keyboards/lily58/lily58.c | 1 + keyboards/lily58/lily58.h | 28 ++ keyboards/lily58/matrix.c | 459 ++++++++++++++++++++++ keyboards/lily58/readme.md | 17 + keyboards/lily58/rev1/config.h | 86 ++++ keyboards/lily58/rev1/rev1.c | 24 ++ keyboards/lily58/rev1/rev1.h | 61 +++ keyboards/lily58/rev1/rules.mk | 1 + keyboards/lily58/rules.mk | 76 ++++ keyboards/lily58/serial.c | 445 +++++++++++++++++++++ keyboards/lily58/serial.h | 80 ++++ keyboards/lily58/serial_config.h | 8 + keyboards/lily58/split_util.c | 86 ++++ keyboards/lily58/split_util.h | 20 + keyboards/lily58/ssd1306.c | 330 ++++++++++++++++ keyboards/lily58/ssd1306.h | 94 +++++ 22 files changed, 2266 insertions(+) create mode 100644 keyboards/lily58/config.h create mode 100644 keyboards/lily58/i2c.c create mode 100644 keyboards/lily58/i2c.h create mode 100644 keyboards/lily58/keymaps/default/config.h create mode 100644 keyboards/lily58/keymaps/default/keymap.c create mode 100644 keyboards/lily58/keymaps/default/rules.mk create mode 100644 keyboards/lily58/lily58.c create mode 100644 keyboards/lily58/lily58.h create mode 100644 keyboards/lily58/matrix.c create mode 100644 keyboards/lily58/readme.md create mode 100644 keyboards/lily58/rev1/config.h create mode 100644 keyboards/lily58/rev1/rev1.c create mode 100644 keyboards/lily58/rev1/rev1.h create mode 100644 keyboards/lily58/rev1/rules.mk create mode 100644 keyboards/lily58/rules.mk create mode 100644 keyboards/lily58/serial.c create mode 100644 keyboards/lily58/serial.h create mode 100644 keyboards/lily58/serial_config.h create mode 100644 keyboards/lily58/split_util.c create mode 100644 keyboards/lily58/split_util.h create mode 100644 keyboards/lily58/ssd1306.c create mode 100644 keyboards/lily58/ssd1306.h diff --git a/keyboards/lily58/config.h b/keyboards/lily58/config.h new file mode 100644 index 000000000..db4844c91 --- /dev/null +++ b/keyboards/lily58/config.h @@ -0,0 +1,21 @@ +/* +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#pragma once + +#include "serial_config.h" \ No newline at end of file diff --git a/keyboards/lily58/i2c.c b/keyboards/lily58/i2c.c new file mode 100644 index 000000000..084c890c4 --- /dev/null +++ b/keyboards/lily58/i2c.c @@ -0,0 +1,162 @@ +#include +#include +#include +#include +#include +#include +#include "i2c.h" + +#ifdef USE_I2C + +// Limits the amount of we wait for any one i2c transaction. +// Since were running SCL line 100kHz (=> 10μs/bit), and each transactions is +// 9 bits, a single transaction will take around 90μs to complete. +// +// (F_CPU/SCL_CLOCK) => # of μC cycles to transfer a bit +// poll loop takes at least 8 clock cycles to execute +#define I2C_LOOP_TIMEOUT (9+1)*(F_CPU/SCL_CLOCK)/8 + +#define BUFFER_POS_INC() (slave_buffer_pos = (slave_buffer_pos+1)%SLAVE_BUFFER_SIZE) + +volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE]; + +static volatile uint8_t slave_buffer_pos; +static volatile bool slave_has_register_set = false; + +// Wait for an i2c operation to finish +inline static +void i2c_delay(void) { + uint16_t lim = 0; + while(!(TWCR & (1<10. + // Check datasheets for more info. + TWBR = ((F_CPU/SCL_CLOCK)-16)/2; +} + +// Start a transaction with the given i2c slave address. The direction of the +// transfer is set with I2C_READ and I2C_WRITE. +// returns: 0 => success +// 1 => error +uint8_t i2c_master_start(uint8_t address) { + TWCR = (1< slave ACK +// 1 => slave NACK +uint8_t i2c_master_write(uint8_t data) { + TWDR = data; + TWCR = (1<= SLAVE_BUFFER_SIZE ) { + ack = 0; + slave_buffer_pos = 0; + } + slave_has_register_set = true; + } else { + i2c_slave_buffer[slave_buffer_pos] = TWDR; + BUFFER_POS_INC(); + } + break; + + case TW_ST_SLA_ACK: + case TW_ST_DATA_ACK: + // master has addressed this device as a slave transmitter and is + // requesting data. + TWDR = i2c_slave_buffer[slave_buffer_pos]; + BUFFER_POS_INC(); + break; + + case TW_BUS_ERROR: // something went wrong, reset twi state + TWCR = 0; + default: + break; + } + // Reset everything, so we are ready for the next TWI interrupt + TWCR |= (1< + +#ifndef F_CPU +#define F_CPU 16000000UL +#endif + +#define I2C_READ 1 +#define I2C_WRITE 0 + +#define I2C_ACK 1 +#define I2C_NACK 0 + +#define SLAVE_BUFFER_SIZE 0x10 + +// i2c SCL clock frequency +#define SCL_CLOCK 400000L + +extern volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE]; + +void i2c_master_init(void); +uint8_t i2c_master_start(uint8_t address); +void i2c_master_stop(void); +uint8_t i2c_master_write(uint8_t data); +uint8_t i2c_master_read(int); +void i2c_reset_state(void); +void i2c_slave_init(uint8_t address); + + +static inline unsigned char i2c_start_read(unsigned char addr) { + return i2c_master_start((addr << 1) | I2C_READ); +} + +static inline unsigned char i2c_start_write(unsigned char addr) { + return i2c_master_start((addr << 1) | I2C_WRITE); +} + +// from SSD1306 scrips +extern unsigned char i2c_rep_start(unsigned char addr); +extern void i2c_start_wait(unsigned char addr); +extern unsigned char i2c_readAck(void); +extern unsigned char i2c_readNak(void); +extern unsigned char i2c_read(unsigned char ack); + +#define i2c_read(ack) (ack) ? i2c_readAck() : i2c_readNak(); + +#endif diff --git a/keyboards/lily58/keymaps/default/config.h b/keyboards/lily58/keymaps/default/config.h new file mode 100644 index 000000000..3077c9463 --- /dev/null +++ b/keyboards/lily58/keymaps/default/config.h @@ -0,0 +1,41 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ +#pragma once + +#include "config.h" + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + +// Underglow +/* +#undef RGBLED_NUM +#define RGBLED_NUM 14 // Number of LEDs +#define RGBLIGHT_ANIMATIONS +#define RGBLIGHT_SLEEP +*/ \ No newline at end of file diff --git a/keyboards/lily58/keymaps/default/keymap.c b/keyboards/lily58/keymaps/default/keymap.c new file mode 100644 index 000000000..624ce210b --- /dev/null +++ b/keyboards/lily58/keymaps/default/keymap.c @@ -0,0 +1,155 @@ +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +#define _QWERTY 0 +#define _LOWER 1 +#define _RAISE 2 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + LOWER, + RAISE, + ADJUST, +}; + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* QWERTY + * ,-----------------------------------------. ,-----------------------------------------. + * | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ~ | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | Q | W | E | R | T | | Y | U | I | O | P | - | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * |LCTRL | A | S | D | F | G |-------. ,-------| H | J | K | L | ; | ' | + * |------+------+------+------+------+------| [ | | ] |------+------+------+------+------+------| + * |LShift| Z | X | C | V | B |-------| |-------| N | M | , | . | / |RShift| + * `-----------------------------------------/ / \ \-----------------------------------------' + * |LOWER | LGUI | Alt | /Space / \Enter \ |BackSP| RGUI |RAISE | + * | | | |/ / \ \ | | | | + * `-------------------''-------' '------''--------------------' + */ + + [_QWERTY] = LAYOUT( \ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_GRV, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS, \ + KC_LCTRL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LBRC, KC_RBRC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \ + LOWER,KC_LGUI, KC_LALT, KC_SPC, KC_ENT, KC_BSPC, KC_RGUI, RAISE \ +), +/* LOWER + * ,-----------------------------------------. ,-----------------------------------------. + * | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | |-------. ,-------| | _ | + | | | | + * |------+------+------+------+------+------| [ | | ] |------+------+------+------+------+------| + * | | | | | | |-------| |-------| |ISO ~ |ISO | | | | | + * `-----------------------------------------/ / \ \-----------------------------------------' + * |LOWER | LGUI | Alt | /Space / \Enter \ |BackSP| RGUI |RAISE | + * | | | |/ / \ \ | | | | + * `-------------------''-------' '------''--------------------' + */ +[_LOWER] = LAYOUT( \ + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, \ + _______, _______, _______, _______, _______, _______, _______, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______,S(KC_NUHS),S(KC_NUBS),_______, _______, _______,\ + _______, _______, _______, _______, _______, _______, _______, _______\ +), +/* RAISE + * ,-----------------------------------------. ,-----------------------------------------. + * | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | |-------. ,-------| | Left | Down | Up |Right | | + * |------+------+------+------+------+------| [ | | ] |------+------+------+------+------+------| + * | | | | | | |-------| |-------| + | - | = | [ | ] | \ | + * `-----------------------------------------/ / \ \-----------------------------------------' + * |LOWER | LGUI | Alt | /Space / \Enter \ |BackSP| RGUI |RAISE | + * | | | |/ / \ \ | | | | + * `-------------------''-------' '------''--------------------' + */ + +[_RAISE] = LAYOUT( \ + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, \ + _______, _______, _______, _______, _______, _______, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, XXXXXXX, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_PLUS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ + _______, _______, _______, _______, _______, _______, _______, _______ \ +), + +/* ADJUST (Layers for Underglow) + * ,-----------------------------------------. ,-----------------------------------------. + * | | | | | | | | | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | |-------. ,-------| | | | | | | + * |------+------+------+------+------+------| | | |------+------+------+------+------+------| + * | | | | | | |-------| |-------| | | | | | | + * `-----------------------------------------/ / \ \-----------------------------------------' + * |LOWER | LGUI | Alt | /Space / \Enter \ |BackSP| RGUI |RAISE | + * | | | |/ / \ \ | | | | + * `-------------------''-------' '------''--------------------' + */ + [_ADJUST] = LAYOUT( \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\ + _______, _______, _______, _______, _______, _______, _______, _______ \ + ) +}; + + + +void persistent_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + print("mode just switched to qwerty and this is a huge string\n"); + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + break; + } + return true; +} \ No newline at end of file diff --git a/keyboards/lily58/keymaps/default/rules.mk b/keyboards/lily58/keymaps/default/rules.mk new file mode 100644 index 000000000..73777a1b7 --- /dev/null +++ b/keyboards/lily58/keymaps/default/rules.mk @@ -0,0 +1,22 @@ + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# + +OLED_ENABLE = no +RGBLIGHT_ENABLE = no + +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = no # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +ONEHAND_ENABLE = no # Enable one-hand typing +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend \ No newline at end of file diff --git a/keyboards/lily58/lily58.c b/keyboards/lily58/lily58.c new file mode 100644 index 000000000..697e3820c --- /dev/null +++ b/keyboards/lily58/lily58.c @@ -0,0 +1 @@ + #include "lily58.h" diff --git a/keyboards/lily58/lily58.h b/keyboards/lily58/lily58.h new file mode 100644 index 000000000..1d64dd7b2 --- /dev/null +++ b/keyboards/lily58/lily58.h @@ -0,0 +1,28 @@ +#ifndef LILY58_H +#define LILY58_H + +#include "quantum.h" + +#ifdef KEYBOARD_lily58_rev1 + #include "rev1.h" +#endif + + + +// Used to create a keymap using only KC_ prefixed keys +#define LAYOUT_kc( \ + L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \ + L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \ + L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \ + L30, L31, L32, L33, L34, L35, L45, R40, R30, R31, R32, R33, R34, R35, \ + L41, L42, L43, L44, R41, R42, R43, R44 \ + ) \ + LAYOUT( \ + KC_##L00, KC_##L01, KC_##L02, KC_##L03, KC_##L04, KC_##L05, KC_##R00, KC_##R01, KC_##R02, KC_##R03, KC_##R04, KC_##R05, \ + KC_##L10, KC_##L11, KC_##L12, KC_##L13, KC_##L14, KC_##L15, KC_##R10, KC_##R11, KC_##R12, KC_##R13, KC_##R14, KC_##R15, \ + KC_##L20, KC_##L21, KC_##L22, KC_##L23, KC_##L24, KC_##L25, KC_##R20, KC_##R21, KC_##R22, KC_##R23, KC_##R24, KC_##R25, \ + KC_##L30, KC_##L31, KC_##L32, KC_##L33, KC_##L34, KC_##L35, KC_##L45, KC_##R40, KC_##R30, KC_##R31, KC_##R32, KC_##R33, KC_##R34, KC_##R35, \ + KC_##L41, KC_##L42, KC_##L43, KC_##L44, KC_##R41, KC_##R42, KC_##R43, KC_##R44 \ + ) + +#endif diff --git a/keyboards/lily58/matrix.c b/keyboards/lily58/matrix.c new file mode 100644 index 000000000..fc42dd14d --- /dev/null +++ b/keyboards/lily58/matrix.c @@ -0,0 +1,459 @@ +/* +Copyright 2012 Jun Wako + +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 . +*/ + +/* + * scan matrix + */ +#include +#include +#include +#include "wait.h" +#include "print.h" +#include "debug.h" +#include "util.h" +#include "matrix.h" +#include "split_util.h" +#include "pro_micro.h" +#include "config.h" +#include "timer.h" + +#ifdef USE_I2C +# include "i2c.h" +#else // USE_SERIAL +# include "serial.h" +#endif + +#ifndef DEBOUNCING_DELAY +# define DEBOUNCING_DELAY 5 +#endif + +#if (DEBOUNCING_DELAY > 0) + static uint16_t debouncing_time; + static bool debouncing = false; +#endif + +#if (MATRIX_COLS <= 8) +# define print_matrix_header() print("\nr/c 01234567\n") +# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row)) +# define matrix_bitpop(i) bitpop(matrix[i]) +# define ROW_SHIFTER ((uint8_t)1) +#else +# error "Currently only supports 8 COLS" +#endif +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; + +#define ERROR_DISCONNECT_COUNT 5 + +#define ROWS_PER_HAND (MATRIX_ROWS/2) + +static uint8_t error_count = 0; + +static const uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; +static const uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; + +/* matrix state(1:on, 0:off) */ +static matrix_row_t matrix[MATRIX_ROWS]; +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; + +#if (DIODE_DIRECTION == COL2ROW) + static void init_cols(void); + static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row); + static void unselect_rows(void); + static void select_row(uint8_t row); + static void unselect_row(uint8_t row); +#elif (DIODE_DIRECTION == ROW2COL) + static void init_rows(void); + static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col); + static void unselect_cols(void); + static void unselect_col(uint8_t col); + static void select_col(uint8_t col); +#endif + +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + +inline +uint8_t matrix_rows(void) +{ + return MATRIX_ROWS; +} + +inline +uint8_t matrix_cols(void) +{ + return MATRIX_COLS; +} + +void matrix_init(void) +{ + debug_enable = true; + debug_matrix = true; + debug_mouse = true; + // initialize row and col +#if (DIODE_DIRECTION == COL2ROW) + unselect_rows(); + init_cols(); +#elif (DIODE_DIRECTION == ROW2COL) + unselect_cols(); + init_rows(); +#endif + + TX_RX_LED_INIT; + + // initialize matrix state: all keys off + for (uint8_t i=0; i < MATRIX_ROWS; i++) { + matrix[i] = 0; + matrix_debouncing[i] = 0; + } + + matrix_init_quantum(); + +} + +uint8_t _matrix_scan(void) +{ + int offset = isLeftHand ? 0 : (ROWS_PER_HAND); +#if (DIODE_DIRECTION == COL2ROW) + // Set row, read cols + for (uint8_t current_row = 0; current_row < ROWS_PER_HAND; current_row++) { +# if (DEBOUNCING_DELAY > 0) + bool matrix_changed = read_cols_on_row(matrix_debouncing+offset, current_row); + + if (matrix_changed) { + debouncing = true; + debouncing_time = timer_read(); + } + +# else + read_cols_on_row(matrix+offset, current_row); +# endif + + } + +#elif (DIODE_DIRECTION == ROW2COL) + // Set col, read rows + for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) { +# if (DEBOUNCING_DELAY > 0) + bool matrix_changed = read_rows_on_col(matrix_debouncing+offset, current_col); + if (matrix_changed) { + debouncing = true; + debouncing_time = timer_read(); + } +# else + read_rows_on_col(matrix+offset, current_col); +# endif + + } +#endif + +# if (DEBOUNCING_DELAY > 0) + if (debouncing && (timer_elapsed(debouncing_time) > DEBOUNCING_DELAY)) { + for (uint8_t i = 0; i < ROWS_PER_HAND; i++) { + matrix[i+offset] = matrix_debouncing[i+offset]; + } + debouncing = false; + } +# endif + + return 1; +} + +#ifdef USE_I2C + +// Get rows from other half over i2c +int i2c_transaction(void) { + int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; + + int err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_WRITE); + if (err) goto i2c_error; + + // start of matrix stored at 0x00 + err = i2c_master_write(0x00); + if (err) goto i2c_error; + + // Start read + err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_READ); + if (err) goto i2c_error; + + if (!err) { + int i; + for (i = 0; i < ROWS_PER_HAND-1; ++i) { + matrix[slaveOffset+i] = i2c_master_read(I2C_ACK); + } + matrix[slaveOffset+i] = i2c_master_read(I2C_NACK); + i2c_master_stop(); + } else { +i2c_error: // the cable is disconnceted, or something else went wrong + i2c_reset_state(); + return err; + } + + return 0; +} + +#else // USE_SERIAL + +int serial_transaction(void) { + int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; + + if (serial_update_buffers()) { + return 1; + } + + for (int i = 0; i < ROWS_PER_HAND; ++i) { + matrix[slaveOffset+i] = serial_slave_buffer[i]; + } + return 0; +} +#endif + +uint8_t matrix_scan(void) +{ + uint8_t ret = _matrix_scan(); + +#ifdef USE_I2C + if( i2c_transaction() ) { +#else // USE_SERIAL + if( serial_transaction() ) { +#endif + // turn on the indicator led when halves are disconnected + TXLED1; + + error_count++; + + if (error_count > ERROR_DISCONNECT_COUNT) { + // reset other half if disconnected + int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; + for (int i = 0; i < ROWS_PER_HAND; ++i) { + matrix[slaveOffset+i] = 0; + } + } + } else { + // turn off the indicator led on no error + TXLED0; + error_count = 0; + } + matrix_scan_quantum(); + return ret; +} + +void matrix_slave_scan(void) { + _matrix_scan(); + + int offset = (isLeftHand) ? 0 : ROWS_PER_HAND; + +#ifdef USE_I2C + for (int i = 0; i < ROWS_PER_HAND; ++i) { + i2c_slave_buffer[i] = matrix[offset+i]; + } +#else // USE_SERIAL + for (int i = 0; i < ROWS_PER_HAND; ++i) { + serial_slave_buffer[i] = matrix[offset+i]; + } +#endif +} + +bool matrix_is_modified(void) +{ + if (debouncing) return false; + return true; +} + +inline +bool matrix_is_on(uint8_t row, uint8_t col) +{ + return (matrix[row] & ((matrix_row_t)1<> 4) + 1) &= ~_BV(pin & 0xF); // IN + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + } +} + +static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) +{ + // Store last value of row prior to reading + matrix_row_t last_row_value = current_matrix[current_row]; + + // Clear data in matrix row + current_matrix[current_row] = 0; + + // Select row and wait for row selecton to stabilize + select_row(current_row); + wait_us(30); + + // For each col... + for(uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) { + + // Select the col pin to read (active low) + uint8_t pin = col_pins[col_index]; + uint8_t pin_state = (_SFR_IO8(pin >> 4) & _BV(pin & 0xF)); + + // Populate the matrix row with the state of the col pin + current_matrix[current_row] |= pin_state ? 0 : (ROW_SHIFTER << col_index); + } + + // Unselect row + unselect_row(current_row); + + return (last_row_value != current_matrix[current_row]); +} + +static void select_row(uint8_t row) +{ + uint8_t pin = row_pins[row]; + _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT + _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW +} + +static void unselect_row(uint8_t row) +{ + uint8_t pin = row_pins[row]; + _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI +} + +static void unselect_rows(void) +{ + for(uint8_t x = 0; x < ROWS_PER_HAND; x++) { + uint8_t pin = row_pins[x]; + _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + } +} + +#elif (DIODE_DIRECTION == ROW2COL) + +static void init_rows(void) +{ + for(uint8_t x = 0; x < ROWS_PER_HAND; x++) { + uint8_t pin = row_pins[x]; + _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + } +} + +static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) +{ + bool matrix_changed = false; + + // Select col and wait for col selecton to stabilize + select_col(current_col); + wait_us(30); + + // For each row... + for(uint8_t row_index = 0; row_index < ROWS_PER_HAND; row_index++) + { + + // Store last value of row prior to reading + matrix_row_t last_row_value = current_matrix[row_index]; + + // Check row pin state + if ((_SFR_IO8(row_pins[row_index] >> 4) & _BV(row_pins[row_index] & 0xF)) == 0) + { + // Pin LO, set col bit + current_matrix[row_index] |= (ROW_SHIFTER << current_col); + } + else + { + // Pin HI, clear col bit + current_matrix[row_index] &= ~(ROW_SHIFTER << current_col); + } + + // Determine if the matrix changed state + if ((last_row_value != current_matrix[row_index]) && !(matrix_changed)) + { + matrix_changed = true; + } + } + + // Unselect col + unselect_col(current_col); + + return matrix_changed; +} + +static void select_col(uint8_t col) +{ + uint8_t pin = col_pins[col]; + _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT + _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW +} + +static void unselect_col(uint8_t col) +{ + uint8_t pin = col_pins[col]; + _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI +} + +static void unselect_cols(void) +{ + for(uint8_t x = 0; x < MATRIX_COLS; x++) { + uint8_t pin = col_pins[x]; + _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + } +} + +#endif diff --git a/keyboards/lily58/readme.md b/keyboards/lily58/readme.md new file mode 100644 index 000000000..c71365e46 --- /dev/null +++ b/keyboards/lily58/readme.md @@ -0,0 +1,17 @@ +# Lily58 + +Lily58 is 6×4+5keys column-staggered split keyboard. + +![Lily58_01](https://user-images.githubusercontent.com/6285554/45210815-92744a00-b2cb-11e8-977a-8c1a93584f17.jpg) + +![Lily58_02](https://user-images.githubusercontent.com/6285554/45337733-7b33a600-b5c4-11e8-85b0-35f1cc9bf946.png) + +Keyboard Maintainer: [Naoki Katahira](https://github.com/kata0510/) [Twitter:@F_YUUCHI](https://twitter.com/F_YUUCHI) +Hardware Supported: Lily58 PCB, ProMicro +Hardware Availability: [PCB & Case Data](https://github.com/kata0510/Lily58) + +Make example for this keyboard (after setting up your build environment): + + make lily58:default + +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). \ No newline at end of file diff --git a/keyboards/lily58/rev1/config.h b/keyboards/lily58/rev1/config.h new file mode 100644 index 000000000..9413e8d4a --- /dev/null +++ b/keyboards/lily58/rev1/config.h @@ -0,0 +1,86 @@ +/* +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert +Copyright 2017 F_YUUCHI + +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 . +*/ + +#pragma once + +//#include QMK_KEYBOARD_CONFIG_H +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFC51 +#define PRODUCT_ID 0x0058 +#define DEVICE_VER 0x0100 +#define MANUFACTURER F_YUUCHI +#define PRODUCT Lily58 +#define DESCRIPTION Lily58 is 6×4+5keys column-staggered split keyboard. + +/* key matrix size */ +// Rows are doubled-up +#define MATRIX_ROWS 10 +#define MATRIX_COLS 6 + +// wiring of each half +#define MATRIX_ROW_PINS { C6, D7, E6, B4, B5 } +#define MATRIX_COL_PINS { F6, F7, B1, B3, B2, B6 } + +#define CATERINA_BOOTLOADER + +/* define tapping term */ +#define TAPPING_TERM 100 + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCING_DELAY 5 + +/* 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 + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* ws2812 RGB LED */ +#define RGB_DI_PIN D3 +#define RGBLIGHT_TIMER +#define RGBLED_NUM 14 // Number of LEDs +#define ws2812_PORTREG PORTD +#define ws2812_DDRREG DDRD + +/* + * 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 \ No newline at end of file diff --git a/keyboards/lily58/rev1/rev1.c b/keyboards/lily58/rev1/rev1.c new file mode 100644 index 000000000..64dd084b2 --- /dev/null +++ b/keyboards/lily58/rev1/rev1.c @@ -0,0 +1,24 @@ +#include "lily58.h" + +/* +#ifdef SSD1306OLED +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + led_set_user(usb_led); +} +#endif +*/ + +void matrix_init_kb(void) { + + // // green led on + // DDRD |= (1<<5); + // PORTD &= ~(1<<5); + + // // orange led on + // DDRB |= (1<<0); + // PORTB &= ~(1<<0); + + matrix_init_user(); +}; + diff --git a/keyboards/lily58/rev1/rev1.h b/keyboards/lily58/rev1/rev1.h new file mode 100644 index 000000000..a83046358 --- /dev/null +++ b/keyboards/lily58/rev1/rev1.h @@ -0,0 +1,61 @@ +#pragma once + +#include "lily58.h" + +//void promicro_bootloader_jmp(bool program); +#include "quantum.h" + + +#ifdef USE_I2C +#include +#ifdef __AVR__ + #include + #include +#endif +#endif + + +//void promicro_bootloader_jmp(bool program); +#ifndef FLIP_HALF +#define LAYOUT( \ + L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \ + L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \ + L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \ + L30, L31, L32, L33, L34, L35, L45, R40, R30, R31, R32, R33, R34, R35, \ + L41, L42, L43, L44, R41, R42, R43, R44 \ + ) \ + { \ + { L00, L01, L02, L03, L04, L05 }, \ + { L10, L11, L12, L13, L14, L15 }, \ + { L20, L21, L22, L23, L24, L25 }, \ + { L30, L31, L32, L33, L34, L35 }, \ + { KC_NO, L41, L42, L43, L44, L45 }, \ + { R05, R04, R03, R02, R01, R00 }, \ + { R15, R14, R13, R12, R11, R10 }, \ + { R25, R24, R23, R22, R21, R20 }, \ + { R35, R34, R33, R32, R31, R30 }, \ + { KC_NO, R44, R43, R42, R41, R40 } \ + } +#else +// Keymap with right side flipped +// (TRRS jack on both halves are to the right) +#define LAYOUT( \ + L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \ + L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \ + L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \ + L30, L31, L32, L33, L34, L35, L45, R30, R31, R32, R33, R34, R35, R45, \ + L41, L42, L43, L44, R41, R42, R43, R44 \ + ) \ + { \ + { L00, L01, L02, L03, L04, L05 }, \ + { L10, L11, L12, L13, L14, L15 }, \ + { L20, L21, L22, L23, L24, L25 }, \ + { L30, L31, L32, L33, L34, L35 }, \ + { KC_NO, L41, L42, L43, L44, L45 }, \ + { R00, R01, R02, R03, R04, R05 }, \ + { R10, R11, R12, R13, R14, R15 }, \ + { R20, R21, R22, R23, R24, R25 }, \ + { R30, R31, R32, R33, R34, R35 }, \ + { KC_NO, R41, R42, R43, R44, R45 } \ + } +#endif \ No newline at end of file diff --git a/keyboards/lily58/rev1/rules.mk b/keyboards/lily58/rev1/rules.mk new file mode 100644 index 000000000..f84561674 --- /dev/null +++ b/keyboards/lily58/rev1/rules.mk @@ -0,0 +1 @@ +BACKLIGHT_ENABLE = no \ No newline at end of file diff --git a/keyboards/lily58/rules.mk b/keyboards/lily58/rules.mk new file mode 100644 index 000000000..23527476a --- /dev/null +++ b/keyboards/lily58/rules.mk @@ -0,0 +1,76 @@ +SRC += matrix.c \ + i2c.c \ + split_util.c \ + serial.c \ + ssd1306.c + +# MCU name +#MCU = at90usb1287 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader +# This definition is optional, and if your keyboard supports multiple bootloaders of +# different sizes, comment this out, and the correct address will be loaded +# automatically (+60). See bootloader.mk for all options. +BOOTLOADER = caterina + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = no # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SUBPROJECT_rev1 = no +USE_I2C = no +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +CUSTOM_MATRIX = yes + +DEFAULT_FOLDER = lily58/rev1 diff --git a/keyboards/lily58/serial.c b/keyboards/lily58/serial.c new file mode 100644 index 000000000..f85dc28dc --- /dev/null +++ b/keyboards/lily58/serial.c @@ -0,0 +1,445 @@ +/* + * WARNING: be careful changing this code, it is very timing dependent + */ + +#ifndef F_CPU +#define F_CPU 16000000 +#endif + +#include +#include +#include +#include +#include +#include "serial.h" +//#include + +#ifdef USE_SERIAL +//#ifndef USE_SERIAL_PD2 + +#ifndef SERIAL_USE_MULTI_TRANSACTION +/* --- USE Simple API (OLD API, compatible with let's split serial.c) */ + #if SERIAL_SLAVE_BUFFER_LENGTH > 0 + uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; + #endif + #if SERIAL_MASTER_BUFFER_LENGTH > 0 + uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0}; + #endif + uint8_t volatile status0 = 0; + +SSTD_t transactions[] = { + { (uint8_t *)&status0, + #if SERIAL_MASTER_BUFFER_LENGTH > 0 + sizeof(serial_master_buffer), (uint8_t *)serial_master_buffer, + #else + 0, (uint8_t *)NULL, + #endif + #if SERIAL_SLAVE_BUFFER_LENGTH > 0 + sizeof(serial_slave_buffer), (uint8_t *)serial_slave_buffer + #else + 0, (uint8_t *)NULL, + #endif + } +}; + +void serial_master_init(void) +{ soft_serial_initiator_init(transactions); } + +void serial_slave_init(void) +{ soft_serial_target_init(transactions); } + +// 0 => no error +// 1 => slave did not respond +// 2 => checksum error +int serial_update_buffers() +{ return soft_serial_transaction(); } + +#endif // Simple API (OLD API, compatible with let's split serial.c) + +#define ALWAYS_INLINE __attribute__((always_inline)) +#define NO_INLINE __attribute__((noinline)) +#define _delay_sub_us(x) __builtin_avr_delay_cycles(x) + +// Serial pulse period in microseconds. +#define TID_SEND_ADJUST 14 + +#define SELECT_SERIAL_SPEED 1 +#if SELECT_SERIAL_SPEED == 0 + // Very High speed + #define SERIAL_DELAY 4 // micro sec + #define READ_WRITE_START_ADJUST 33 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles +#elif SELECT_SERIAL_SPEED == 1 + // High speed + #define SERIAL_DELAY 6 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles +#elif SELECT_SERIAL_SPEED == 2 + // Middle speed + #define SERIAL_DELAY 12 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles +#elif SELECT_SERIAL_SPEED == 3 + // Low speed + #define SERIAL_DELAY 24 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles +#elif SELECT_SERIAL_SPEED == 4 + // Very Low speed + #define SERIAL_DELAY 50 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles +#else +#error Illegal Serial Speed +#endif + + +#define SERIAL_DELAY_HALF1 (SERIAL_DELAY/2) +#define SERIAL_DELAY_HALF2 (SERIAL_DELAY - SERIAL_DELAY/2) + +#define SLAVE_INT_WIDTH_US 1 +#ifndef SERIAL_USE_MULTI_TRANSACTION + #define SLAVE_INT_RESPONSE_TIME SERIAL_DELAY +#else + #define SLAVE_INT_ACK_WIDTH_UNIT 2 + #define SLAVE_INT_ACK_WIDTH 4 +#endif + +static SSTD_t *Transaction_table = NULL; + +inline static +void serial_delay(void) { + _delay_us(SERIAL_DELAY); +} + +inline static +void serial_delay_half1(void) { + _delay_us(SERIAL_DELAY_HALF1); +} + +inline static +void serial_delay_half2(void) { + _delay_us(SERIAL_DELAY_HALF2); +} + +inline static void serial_output(void) ALWAYS_INLINE; +inline static +void serial_output(void) { + SERIAL_PIN_DDR |= SERIAL_PIN_MASK; +} + +// make the serial pin an input with pull-up resistor +inline static void serial_input_with_pullup(void) ALWAYS_INLINE; +inline static +void serial_input_with_pullup(void) { + SERIAL_PIN_DDR &= ~SERIAL_PIN_MASK; + SERIAL_PIN_PORT |= SERIAL_PIN_MASK; +} + +inline static +uint8_t serial_read_pin(void) { + return !!(SERIAL_PIN_INPUT & SERIAL_PIN_MASK); +} + +inline static void serial_low(void) ALWAYS_INLINE; +inline static +void serial_low(void) { + SERIAL_PIN_PORT &= ~SERIAL_PIN_MASK; +} + +inline static void serial_high(void) ALWAYS_INLINE; +inline static +void serial_high(void) { + SERIAL_PIN_PORT |= SERIAL_PIN_MASK; +} + +void soft_serial_initiator_init(SSTD_t *sstd_table) +{ + Transaction_table = sstd_table; + serial_output(); + serial_high(); +} + +void soft_serial_target_init(SSTD_t *sstd_table) +{ + Transaction_table = sstd_table; + serial_input_with_pullup(); + +#if SERIAL_PIN_MASK == _BV(PD0) + // Enable INT0 + EIMSK |= _BV(INT0); + // Trigger on falling edge of INT0 + EICRA &= ~(_BV(ISC00) | _BV(ISC01)); +#elif SERIAL_PIN_MASK == _BV(PD2) + // Enable INT2 + EIMSK |= _BV(INT2); + // Trigger on falling edge of INT2 + EICRA &= ~(_BV(ISC20) | _BV(ISC21)); +#else + #error unknown SERIAL_PIN_MASK value +#endif +} + +// Used by the sender to synchronize timing with the reciver. +static void sync_recv(void) NO_INLINE; +static +void sync_recv(void) { + for (uint8_t i = 0; i < SERIAL_DELAY*5 && serial_read_pin(); i++ ) { + } + // This shouldn't hang if the target disconnects because the + // serial line will float to high if the target does disconnect. + while (!serial_read_pin()); +} + +// Used by the reciver to send a synchronization signal to the sender. +static void sync_send(void)NO_INLINE; +static +void sync_send(void) { + serial_low(); + serial_delay(); + serial_high(); +} + +// Reads a byte from the serial line +static uint8_t serial_read_chunk(uint8_t *pterrcount, uint8_t bit) NO_INLINE; +static uint8_t serial_read_chunk(uint8_t *pterrcount, uint8_t bit) { + uint8_t byte, i, p, pb; + + _delay_sub_us(READ_WRITE_START_ADJUST); + for( i = 0, byte = 0, p = 0; i < bit; i++ ) { + serial_delay_half1(); // read the middle of pulses + if( serial_read_pin() ) { + byte = (byte << 1) | 1; p ^= 1; + } else { + byte = (byte << 1) | 0; p ^= 0; + } + _delay_sub_us(READ_WRITE_WIDTH_ADJUST); + serial_delay_half2(); + } + /* recive parity bit */ + serial_delay_half1(); // read the middle of pulses + pb = serial_read_pin(); + _delay_sub_us(READ_WRITE_WIDTH_ADJUST); + serial_delay_half2(); + + *pterrcount += (p != pb)? 1 : 0; + + return byte; +} + +// Sends a byte with MSB ordering +void serial_write_chunk(uint8_t data, uint8_t bit) NO_INLINE; +void serial_write_chunk(uint8_t data, uint8_t bit) { + uint8_t b, p; + for( p = 0, b = 1<<(bit-1); b ; b >>= 1) { + if(data & b) { + serial_high(); p ^= 1; + } else { + serial_low(); p ^= 0; + } + serial_delay(); + } + /* send parity bit */ + if(p & 1) { serial_high(); } + else { serial_low(); } + serial_delay(); + + serial_low(); // sync_send() / senc_recv() need raise edge +} + +static void serial_send_packet(uint8_t *buffer, uint8_t size) NO_INLINE; +static +void serial_send_packet(uint8_t *buffer, uint8_t size) { + for (uint8_t i = 0; i < size; ++i) { + uint8_t data; + data = buffer[i]; + sync_send(); + serial_write_chunk(data,8); + } +} + +static uint8_t serial_recive_packet(uint8_t *buffer, uint8_t size) NO_INLINE; +static +uint8_t serial_recive_packet(uint8_t *buffer, uint8_t size) { + uint8_t pecount = 0; + for (uint8_t i = 0; i < size; ++i) { + uint8_t data; + sync_recv(); + data = serial_read_chunk(&pecount, 8); + buffer[i] = data; + } + return pecount == 0; +} + +inline static +void change_sender2reciver(void) { + sync_send(); //0 + serial_delay_half1(); //1 + serial_low(); //2 + serial_input_with_pullup(); //2 + serial_delay_half1(); //3 +} + +inline static +void change_reciver2sender(void) { + sync_recv(); //0 + serial_delay(); //1 + serial_low(); //3 + serial_output(); //3 + serial_delay_half1(); //4 +} + +// interrupt handle to be used by the target device +ISR(SERIAL_PIN_INTERRUPT) { + +#ifndef SERIAL_USE_MULTI_TRANSACTION + serial_low(); + serial_output(); + SSTD_t *trans = Transaction_table; +#else + // recive transaction table index + uint8_t tid; + uint8_t pecount = 0; + sync_recv(); + tid = serial_read_chunk(&pecount,4); + if(pecount> 0) + return; + serial_delay_half1(); + + serial_high(); // response step1 low->high + serial_output(); + _delay_sub_us(SLAVE_INT_ACK_WIDTH_UNIT*SLAVE_INT_ACK_WIDTH); + SSTD_t *trans = &Transaction_table[tid]; + serial_low(); // response step2 ack high->low +#endif + + // target send phase + if( trans->target2initiator_buffer_size > 0 ) + serial_send_packet((uint8_t *)trans->target2initiator_buffer, + trans->target2initiator_buffer_size); + // target switch to input + change_sender2reciver(); + + // target recive phase + if( trans->initiator2target_buffer_size > 0 ) { + if (serial_recive_packet((uint8_t *)trans->initiator2target_buffer, + trans->initiator2target_buffer_size) ) { + *trans->status = TRANSACTION_ACCEPTED; + } else { + *trans->status = TRANSACTION_DATA_ERROR; + } + } else { + *trans->status = TRANSACTION_ACCEPTED; + } + + sync_recv(); //weit initiator output to high +} + +///////// +// start transaction by initiator +// +// int soft_serial_transaction(int sstd_index) +// +// Returns: +// TRANSACTION_END +// TRANSACTION_NO_RESPONSE +// TRANSACTION_DATA_ERROR +// this code is very time dependent, so we need to disable interrupts +#ifndef SERIAL_USE_MULTI_TRANSACTION +int soft_serial_transaction(void) { + SSTD_t *trans = Transaction_table; +#else +int soft_serial_transaction(int sstd_index) { + SSTD_t *trans = &Transaction_table[sstd_index]; +#endif + cli(); + + // signal to the target that we want to start a transaction + serial_output(); + serial_low(); + _delay_us(SLAVE_INT_WIDTH_US); + +#ifndef SERIAL_USE_MULTI_TRANSACTION + // wait for the target response + serial_input_with_pullup(); + _delay_us(SLAVE_INT_RESPONSE_TIME); + + // check if the target is present + if (serial_read_pin()) { + // target failed to pull the line low, assume not present + serial_output(); + serial_high(); + *trans->status = TRANSACTION_NO_RESPONSE; + sei(); + return TRANSACTION_NO_RESPONSE; + } + +#else + // send transaction table index + sync_send(); + _delay_sub_us(TID_SEND_ADJUST); + serial_write_chunk(sstd_index, 4); + serial_delay_half1(); + + // wait for the target response (step1 low->high) + serial_input_with_pullup(); + while( !serial_read_pin() ) { + _delay_sub_us(2); + } + + // check if the target is present (step2 high->low) + for( int i = 0; serial_read_pin(); i++ ) { + if (i > SLAVE_INT_ACK_WIDTH + 1) { + // slave failed to pull the line low, assume not present + serial_output(); + serial_high(); + *trans->status = TRANSACTION_NO_RESPONSE; + sei(); + return TRANSACTION_NO_RESPONSE; + } + _delay_sub_us(SLAVE_INT_ACK_WIDTH_UNIT); + } +#endif + + // initiator recive phase + // if the target is present syncronize with it + if( trans->target2initiator_buffer_size > 0 ) { + if (!serial_recive_packet((uint8_t *)trans->target2initiator_buffer, + trans->target2initiator_buffer_size) ) { + serial_output(); + serial_high(); + *trans->status = TRANSACTION_DATA_ERROR; + sei(); + return TRANSACTION_DATA_ERROR; + } + } + + // initiator switch to output + change_reciver2sender(); + + // initiator send phase + if( trans->initiator2target_buffer_size > 0 ) { + serial_send_packet((uint8_t *)trans->initiator2target_buffer, + trans->initiator2target_buffer_size); + } + + // always, release the line when not in use + sync_send(); + + *trans->status = TRANSACTION_END; + sei(); + return TRANSACTION_END; +} + +#ifdef SERIAL_USE_MULTI_TRANSACTION +int soft_serial_get_and_clean_status(int sstd_index) { + SSTD_t *trans = &Transaction_table[sstd_index]; + cli(); + int retval = *trans->status; + *trans->status = 0;; + sei(); + return retval; +} +#endif + +#endif diff --git a/keyboards/lily58/serial.h b/keyboards/lily58/serial.h new file mode 100644 index 000000000..d2b7fd8e6 --- /dev/null +++ b/keyboards/lily58/serial.h @@ -0,0 +1,80 @@ +#ifndef SOFT_SERIAL_H +#define SOFT_SERIAL_H + +#include + +// ///////////////////////////////////////////////////////////////// +// Need Soft Serial defines in serial_config.h +// ///////////////////////////////////////////////////////////////// +// ex. +// #define SERIAL_PIN_DDR DDRD +// #define SERIAL_PIN_PORT PORTD +// #define SERIAL_PIN_INPUT PIND +// #define SERIAL_PIN_MASK _BV(PD?) ?=0,2 +// #define SERIAL_PIN_INTERRUPT INT?_vect ?=0,2 +// +// //// USE Simple API (OLD API, compatible with let's split serial.c) +// ex. +// #define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 +// #define SERIAL_MASTER_BUFFER_LENGTH 1 +// +// //// USE flexible API (using multi-type transaction function) +// #define SERIAL_USE_MULTI_TRANSACTION +// +// ///////////////////////////////////////////////////////////////// + + +#ifndef SERIAL_USE_MULTI_TRANSACTION +/* --- USE Simple API (OLD API, compatible with let's split serial.c) */ +#if SERIAL_SLAVE_BUFFER_LENGTH > 0 +extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH]; +#endif +#if SERIAL_MASTER_BUFFER_LENGTH > 0 +extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH]; +#endif + +void serial_master_init(void); +void serial_slave_init(void); +int serial_update_buffers(void); + +#endif // USE Simple API + +// Soft Serial Transaction Descriptor +typedef struct _SSTD_t { + uint8_t *status; + uint8_t initiator2target_buffer_size; + uint8_t *initiator2target_buffer; + uint8_t target2initiator_buffer_size; + uint8_t *target2initiator_buffer; +} SSTD_t; + +// initiator is transaction start side +void soft_serial_initiator_init(SSTD_t *sstd_table); +// target is interrupt accept side +void soft_serial_target_init(SSTD_t *sstd_table); + +// initiator resullt +#define TRANSACTION_END 0 +#define TRANSACTION_NO_RESPONSE 0x1 +#define TRANSACTION_DATA_ERROR 0x2 +#ifndef SERIAL_USE_MULTI_TRANSACTION +int soft_serial_transaction(void); +#else +int soft_serial_transaction(int sstd_index); +#endif + +// target status +// *SSTD_t.status has +// initiator: +// TRANSACTION_END +// or TRANSACTION_NO_RESPONSE +// or TRANSACTION_DATA_ERROR +// target: +// TRANSACTION_DATA_ERROR +// or TRANSACTION_ACCEPTED +#define TRANSACTION_ACCEPTED 0x4 +#ifdef SERIAL_USE_MULTI_TRANSACTION +int soft_serial_get_and_clean_status(int sstd_index); +#endif + +#endif /* SOFT_SERIAL_H */ diff --git a/keyboards/lily58/serial_config.h b/keyboards/lily58/serial_config.h new file mode 100644 index 000000000..fef689038 --- /dev/null +++ b/keyboards/lily58/serial_config.h @@ -0,0 +1,8 @@ +#define SERIAL_PIN_DDR DDRD +#define SERIAL_PIN_PORT PORTD +#define SERIAL_PIN_INPUT PIND +#define SERIAL_PIN_MASK _BV(PD2) +#define SERIAL_PIN_INTERRUPT INT2_vect + +#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 +#define SERIAL_MASTER_BUFFER_LENGTH 1 \ No newline at end of file diff --git a/keyboards/lily58/split_util.c b/keyboards/lily58/split_util.c new file mode 100644 index 000000000..ff069b7e2 --- /dev/null +++ b/keyboards/lily58/split_util.c @@ -0,0 +1,86 @@ +#include +#include +#include +#include +#include +#include +#include "split_util.h" +#include "matrix.h" +#include "keyboard.h" +#include "config.h" +#include "timer.h" + +#ifdef USE_I2C +# include "i2c.h" +#else +# include "serial.h" +#endif + +volatile bool isLeftHand = true; + +static void setup_handedness(void) { + #ifdef EE_HANDS + isLeftHand = eeprom_read_byte(EECONFIG_HANDEDNESS); + #else + // I2C_MASTER_RIGHT is deprecated, use MASTER_RIGHT instead, since this works for both serial and i2c + #if defined(I2C_MASTER_RIGHT) || defined(MASTER_RIGHT) + isLeftHand = !has_usb(); + #else + isLeftHand = has_usb(); + #endif + #endif +} + +static void keyboard_master_setup(void) { +#ifdef USE_I2C + i2c_master_init(); +//#ifdef SSD1306OLED +// matrix_master_OLED_init (); +//#endif +#else + serial_master_init(); +#endif +} + +static void keyboard_slave_setup(void) { + timer_init(); +#ifdef USE_I2C + i2c_slave_init(SLAVE_I2C_ADDRESS); +#else + serial_slave_init(); +#endif +} + +bool has_usb(void) { + USBCON |= (1 << OTGPADE); //enables VBUS pad + _delay_us(5); + return (USBSTA & (1< +#include "eeconfig.h" + +#define SLAVE_I2C_ADDRESS 0x32 + +extern volatile bool isLeftHand; + +// slave version of matix scan, defined in matrix.c +void matrix_slave_scan(void); + +void split_keyboard_setup(void); +bool has_usb(void); +void keyboard_slave_loop(void); + +void matrix_master_OLED_init (void); + +#endif diff --git a/keyboards/lily58/ssd1306.c b/keyboards/lily58/ssd1306.c new file mode 100644 index 000000000..d07900119 --- /dev/null +++ b/keyboards/lily58/ssd1306.c @@ -0,0 +1,330 @@ +#ifdef SSD1306OLED + +#include "ssd1306.h" +#include "i2c.h" +#include +#include "print.h" +#include "glcdfont.c" +#ifdef ADAFRUIT_BLE_ENABLE +#include "adafruit_ble.h" +#endif +#ifdef PROTOCOL_LUFA +#include "lufa.h" +#endif +#include "sendchar.h" +#include "timer.h" + +// Set this to 1 to help diagnose early startup problems +// when testing power-on with ble. Turn it off otherwise, +// as the latency of printing most of the debug info messes +// with the matrix scan, causing keys to drop. +#define DEBUG_TO_SCREEN 0 + +//static uint16_t last_battery_update; +//static uint32_t vbat; +//#define BatteryUpdateInterval 10000 /* milliseconds */ +#define ScreenOffInterval 300000 /* milliseconds */ +#if DEBUG_TO_SCREEN +static uint8_t displaying; +#endif +static uint16_t last_flush; + +// Write command sequence. +// Returns true on success. +static inline bool _send_cmd1(uint8_t cmd) { + bool res = false; + + if (i2c_start_write(SSD1306_ADDRESS)) { + xprintf("failed to start write to %d\n", SSD1306_ADDRESS); + goto done; + } + + if (i2c_master_write(0x0 /* command byte follows */)) { + print("failed to write control byte\n"); + + goto done; + } + + if (i2c_master_write(cmd)) { + xprintf("failed to write command %d\n", cmd); + goto done; + } + res = true; +done: + i2c_master_stop(); + return res; +} + +// Write 2-byte command sequence. +// Returns true on success +static inline bool _send_cmd2(uint8_t cmd, uint8_t opr) { + if (!_send_cmd1(cmd)) { + return false; + } + return _send_cmd1(opr); +} + +// Write 3-byte command sequence. +// Returns true on success +static inline bool _send_cmd3(uint8_t cmd, uint8_t opr1, uint8_t opr2) { + if (!_send_cmd1(cmd)) { + return false; + } + if (!_send_cmd1(opr1)) { + return false; + } + return _send_cmd1(opr2); +} + +#define send_cmd1(c) if (!_send_cmd1(c)) {goto done;} +#define send_cmd2(c,o) if (!_send_cmd2(c,o)) {goto done;} +#define send_cmd3(c,o1,o2) if (!_send_cmd3(c,o1,o2)) {goto done;} + +static void clear_display(void) { + matrix_clear(&display); + + // Clear all of the display bits (there can be random noise + // in the RAM on startup) + send_cmd3(PageAddr, 0, (DisplayHeight / 8) - 1); + send_cmd3(ColumnAddr, 0, DisplayWidth - 1); + + if (i2c_start_write(SSD1306_ADDRESS)) { + goto done; + } + if (i2c_master_write(0x40)) { + // Data mode + goto done; + } + for (uint8_t row = 0; row < MatrixRows; ++row) { + for (uint8_t col = 0; col < DisplayWidth; ++col) { + i2c_master_write(0); + } + } + + display.dirty = false; + +done: + i2c_master_stop(); +} + +#if DEBUG_TO_SCREEN +#undef sendchar +static int8_t capture_sendchar(uint8_t c) { + sendchar(c); + iota_gfx_write_char(c); + + if (!displaying) { + iota_gfx_flush(); + } + return 0; +} +#endif + +bool iota_gfx_init(bool rotate) { + bool success = false; + + send_cmd1(DisplayOff); + send_cmd2(SetDisplayClockDiv, 0x80); + send_cmd2(SetMultiPlex, DisplayHeight - 1); + + send_cmd2(SetDisplayOffset, 0); + + + send_cmd1(SetStartLine | 0x0); + send_cmd2(SetChargePump, 0x14 /* Enable */); + send_cmd2(SetMemoryMode, 0 /* horizontal addressing */); + + if(rotate){ + // the following Flip the display orientation 180 degrees + send_cmd1(SegRemap); + send_cmd1(ComScanInc); + }else{ + // Flips the display orientation 0 degrees + send_cmd1(SegRemap | 0x1); + send_cmd1(ComScanDec); + } + + send_cmd2(SetComPins, 0x2); + send_cmd2(SetContrast, 0x8f); + send_cmd2(SetPreCharge, 0xf1); + send_cmd2(SetVComDetect, 0x40); + send_cmd1(DisplayAllOnResume); + send_cmd1(NormalDisplay); + send_cmd1(DeActivateScroll); + send_cmd1(DisplayOn); + + send_cmd2(SetContrast, 0); // Dim + + clear_display(); + + success = true; + + iota_gfx_flush(); + +#if DEBUG_TO_SCREEN + print_set_sendchar(capture_sendchar); +#endif + +done: + return success; +} + +bool iota_gfx_off(void) { + bool success = false; + + send_cmd1(DisplayOff); + success = true; + +done: + return success; +} + +bool iota_gfx_on(void) { + bool success = false; + + send_cmd1(DisplayOn); + success = true; + +done: + return success; +} + +void matrix_write_char_inner(struct CharacterMatrix *matrix, uint8_t c) { + *matrix->cursor = c; + ++matrix->cursor; + + if (matrix->cursor - &matrix->display[0][0] == sizeof(matrix->display)) { + // We went off the end; scroll the display upwards by one line + memmove(&matrix->display[0], &matrix->display[1], + MatrixCols * (MatrixRows - 1)); + matrix->cursor = &matrix->display[MatrixRows - 1][0]; + memset(matrix->cursor, ' ', MatrixCols); + } +} + +void matrix_write_char(struct CharacterMatrix *matrix, uint8_t c) { + matrix->dirty = true; + + if (c == '\n') { + // Clear to end of line from the cursor and then move to the + // start of the next line + uint8_t cursor_col = (matrix->cursor - &matrix->display[0][0]) % MatrixCols; + + while (cursor_col++ < MatrixCols) { + matrix_write_char_inner(matrix, ' '); + } + return; + } + + matrix_write_char_inner(matrix, c); +} + +void iota_gfx_write_char(uint8_t c) { + matrix_write_char(&display, c); +} + +void matrix_write(struct CharacterMatrix *matrix, const char *data) { + const char *end = data + strlen(data); + while (data < end) { + matrix_write_char(matrix, *data); + ++data; + } +} + +void matrix_write_ln(struct CharacterMatrix *matrix, const char *data) { + char data_ln[strlen(data)+2]; + snprintf(data_ln, sizeof(data_ln), "%s\n", data); + matrix_write(matrix, data_ln); +} + +void iota_gfx_write(const char *data) { + matrix_write(&display, data); +} + +void matrix_write_P(struct CharacterMatrix *matrix, const char *data) { + while (true) { + uint8_t c = pgm_read_byte(data); + if (c == 0) { + return; + } + matrix_write_char(matrix, c); + ++data; + } +} + +void iota_gfx_write_P(const char *data) { + matrix_write_P(&display, data); +} + +void matrix_clear(struct CharacterMatrix *matrix) { + memset(matrix->display, ' ', sizeof(matrix->display)); + matrix->cursor = &matrix->display[0][0]; + matrix->dirty = true; +} + +void iota_gfx_clear_screen(void) { + matrix_clear(&display); +} + +void matrix_render(struct CharacterMatrix *matrix) { + last_flush = timer_read(); + iota_gfx_on(); +#if DEBUG_TO_SCREEN + ++displaying; +#endif + + // Move to the home position + send_cmd3(PageAddr, 0, MatrixRows - 1); + send_cmd3(ColumnAddr, 0, (MatrixCols * FontWidth) - 1); + + if (i2c_start_write(SSD1306_ADDRESS)) { + goto done; + } + if (i2c_master_write(0x40)) { + // Data mode + goto done; + } + + for (uint8_t row = 0; row < MatrixRows; ++row) { + for (uint8_t col = 0; col < MatrixCols; ++col) { + const uint8_t *glyph = font + (matrix->display[row][col] * FontWidth); + + for (uint8_t glyphCol = 0; glyphCol < FontWidth; ++glyphCol) { + uint8_t colBits = pgm_read_byte(glyph + glyphCol); + i2c_master_write(colBits); + } + + // 1 column of space between chars (it's not included in the glyph) + //i2c_master_write(0); + } + } + + matrix->dirty = false; + +done: + i2c_master_stop(); +#if DEBUG_TO_SCREEN + --displaying; +#endif +} + +void iota_gfx_flush(void) { + matrix_render(&display); +} + +__attribute__ ((weak)) +void iota_gfx_task_user(void) { +} + +void iota_gfx_task(void) { + iota_gfx_task_user(); + + if (display.dirty) { + iota_gfx_flush(); + } + + if (timer_elapsed(last_flush) > ScreenOffInterval) { + iota_gfx_off(); + } +} +#endif diff --git a/keyboards/lily58/ssd1306.h b/keyboards/lily58/ssd1306.h new file mode 100644 index 000000000..59d31c9f3 --- /dev/null +++ b/keyboards/lily58/ssd1306.h @@ -0,0 +1,94 @@ +#ifndef SSD1306_H +#define SSD1306_H + +#include +#include +#include "pincontrol.h" +#include "config.h" + +enum ssd1306_cmds { + DisplayOff = 0xAE, + DisplayOn = 0xAF, + + SetContrast = 0x81, + DisplayAllOnResume = 0xA4, + + DisplayAllOn = 0xA5, + NormalDisplay = 0xA6, + InvertDisplay = 0xA7, + SetDisplayOffset = 0xD3, + SetComPins = 0xda, + SetVComDetect = 0xdb, + SetDisplayClockDiv = 0xD5, + SetPreCharge = 0xd9, + SetMultiPlex = 0xa8, + SetLowColumn = 0x00, + SetHighColumn = 0x10, + SetStartLine = 0x40, + + SetMemoryMode = 0x20, + ColumnAddr = 0x21, + PageAddr = 0x22, + + ComScanInc = 0xc0, + ComScanDec = 0xc8, + SegRemap = 0xa0, + SetChargePump = 0x8d, + ExternalVcc = 0x01, + SwitchCapVcc = 0x02, + + ActivateScroll = 0x2f, + DeActivateScroll = 0x2e, + SetVerticalScrollArea = 0xa3, + RightHorizontalScroll = 0x26, + LeftHorizontalScroll = 0x27, + VerticalAndRightHorizontalScroll = 0x29, + VerticalAndLeftHorizontalScroll = 0x2a, +}; + +// Controls the SSD1306 128x32 OLED display via i2c + +#ifndef SSD1306_ADDRESS +#define SSD1306_ADDRESS 0x3C +#endif + +#define DisplayHeight 32 +#define DisplayWidth 128 + +#define FontHeight 8 +#define FontWidth 6 + +#define MatrixRows (DisplayHeight / FontHeight) +#define MatrixCols (DisplayWidth / FontWidth) + +struct CharacterMatrix { + uint8_t display[MatrixRows][MatrixCols]; + uint8_t *cursor; + bool dirty; +}; + +struct CharacterMatrix display; + +bool iota_gfx_init(bool rotate); +void iota_gfx_task(void); +bool iota_gfx_off(void); +bool iota_gfx_on(void); +void iota_gfx_flush(void); +void iota_gfx_write_char(uint8_t c); +void iota_gfx_write(const char *data); +void iota_gfx_write_P(const char *data); +void iota_gfx_clear_screen(void); + +void iota_gfx_task_user(void); + +void matrix_clear(struct CharacterMatrix *matrix); +void matrix_write_char_inner(struct CharacterMatrix *matrix, uint8_t c); +void matrix_write_char(struct CharacterMatrix *matrix, uint8_t c); +void matrix_write(struct CharacterMatrix *matrix, const char *data); +void matrix_write_ln(struct CharacterMatrix *matrix, const char *data); +void matrix_write_P(struct CharacterMatrix *matrix, const char *data); +void matrix_render(struct CharacterMatrix *matrix); + + + +#endif From 232ef757832d46cb63550376a38d224472075996 Mon Sep 17 00:00:00 2001 From: Pascal Greilich Date: Sat, 15 Sep 2018 13:15:36 -0400 Subject: [PATCH 096/788] Keymap: A new alternative layout for planck (#3894) * a new planck layout * layout images * layout images 2 * typo * update include following PR comment * updates following PR commments 2 * updates following PR comments --- keyboards/planck/keymaps/pascamel/config.h | 38 ++++ keyboards/planck/keymaps/pascamel/keymap.c | 237 ++++++++++++++++++++ keyboards/planck/keymaps/pascamel/readme.md | 29 +++ keyboards/planck/keymaps/pascamel/rules.mk | 1 + 4 files changed, 305 insertions(+) create mode 100644 keyboards/planck/keymaps/pascamel/config.h create mode 100644 keyboards/planck/keymaps/pascamel/keymap.c create mode 100644 keyboards/planck/keymaps/pascamel/readme.md create mode 100644 keyboards/planck/keymaps/pascamel/rules.mk diff --git a/keyboards/planck/keymaps/pascamel/config.h b/keyboards/planck/keymaps/pascamel/config.h new file mode 100644 index 000000000..679d106ca --- /dev/null +++ b/keyboards/planck/keymaps/pascamel/config.h @@ -0,0 +1,38 @@ +#pragma once + +#ifdef AUDIO_ENABLE + #define STARTUP_SONG SONG(PLANCK_SOUND) + // #define STARTUP_SONG SONG(NO_SOUND) + + #define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \ + SONG(COLEMAK_SOUND), \ + SONG(DVORAK_SOUND) \ + } +#endif + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ + +//#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + +// Most tactile encoders have detents every 4 stages +#define ENCODER_RESOLUTION 4 diff --git a/keyboards/planck/keymaps/pascamel/keymap.c b/keyboards/planck/keymaps/pascamel/keymap.c new file mode 100644 index 000000000..9ee0dde35 --- /dev/null +++ b/keyboards/planck/keymaps/pascamel/keymap.c @@ -0,0 +1,237 @@ +/* Copyright 2015-2017 Jack Humbert + * + * 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 . + */ + +#include QMK_KEYBOARD_H +#include "muse.h" + +extern keymap_config_t keymap_config; + +enum planck_layers { + _QWERTY, + _LOWER, + _RAISE, + _ADJUST +}; + +enum planck_keycodes { + QWERTY = SAFE_RANGE, + BACKLIT, + MY_PWD +}; + +#define LOWER MO(_LOWER) +#define RAISE MO(_RAISE) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Ctrl | Alt | GUI |Brite |Lower | Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = LAYOUT_planck_grid( + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , + KC_LCTL, KC_LALT, KC_LGUI, BACKLIT, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT +), + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | Prev | Play | Next | | | * | 4 | 5 | 6 | - | Del | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Pwd | Vol- | MUTE | Vol+ | | | / | 1 | 2 | 3 | + | PgUp | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | 0 | . | = | PgDn | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT_planck_grid( + _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, + _______, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______, KC_ASTR, KC_4, KC_5, KC_6, KC_MINS, KC_DEL, + MY_PWD, KC_VOLD, KC_MUTE, KC_VOLU, _______, _______, KC_SLSH, KC_1, KC_2, KC_3, KC_PLUS, KC_PGUP, + _______, _______, _______, _______, _______, _______, _______, _______, KC_0, KC_DOT, KC_EQL, KC_PGDN +), + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | ~ | | / | { | [ | ] | } | \ | - | + | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | | | | _ | = | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Home | PgDn | PgUp | End | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT_planck_grid( + + KC_GRV, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, + _______, KC_TILD, _______, KC_SLSH, KC_LCBR, KC_LBRC, KC_RBRC, KC_RCBR, KC_BSLS, KC_MINS, KC_PLUS, KC_PIPE, + _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_UNDS, KC_EQL, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | Reset| | | | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap| | | | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof| | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = LAYOUT_planck_grid( + _______, RESET, DEBUG, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_DEL , + _______, _______, MU_MOD, AU_ON, AU_OFF, AG_NORM, AG_SWAP, _______, _______, _______, _______, _______, + _______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +) + + +}; + +#ifdef AUDIO_ENABLE + float plover_song[][2] = SONG(PLOVER_SOUND); + float plover_gb_song[][2] = SONG(PLOVER_GOODBYE_SOUND); +#endif + +uint32_t layer_state_set_user(uint32_t state) { + return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case BACKLIT: + if (record->event.pressed) { + register_code(KC_RSFT); + #ifdef BACKLIGHT_ENABLE + backlight_step(); + #endif + #ifdef KEYBOARD_planck_rev5 + PORTE &= ~(1<<6); + #endif + } else { + unregister_code(KC_RSFT); + #ifdef KEYBOARD_planck_rev5 + PORTE |= (1<<6); + #endif + } + return false; + break; + case MY_PWD: + if (record->event.pressed) { + SEND_STRING("My secret password!"); + false; + } + break; + } + return true; +} + +bool muse_mode = false; +uint8_t last_muse_note = 0; +uint16_t muse_counter = 0; +uint8_t muse_offset = 70; +uint16_t muse_tempo = 50; + +void encoder_update(bool clockwise) { + if (muse_mode) { + if (IS_LAYER_ON(_RAISE)) { + if (clockwise) { + muse_offset++; + } else { + muse_offset--; + } + } else { + if (clockwise) { + muse_tempo+=1; + } else { + muse_tempo-=1; + } + } + } else { + if (clockwise) { + register_code(KC_PGDN); + unregister_code(KC_PGDN); + } else { + register_code(KC_PGUP); + unregister_code(KC_PGUP); + } + } +} + +void dip_update(uint8_t index, bool active) { + switch (index) { + case 0: + if (active) { + #ifdef AUDIO_ENABLE + PLAY_SONG(plover_song); + #endif + layer_on(_ADJUST); + } else { + #ifdef AUDIO_ENABLE + PLAY_SONG(plover_gb_song); + #endif + layer_off(_ADJUST); + } + break; + case 1: + if (active) { + muse_mode = true; + } else { + muse_mode = false; + #ifdef AUDIO_ENABLE + stop_all_notes(); + #endif + } + } +} + +void matrix_scan_user(void) { + #ifdef AUDIO_ENABLE + if (muse_mode) { + if (muse_counter == 0) { + uint8_t muse_note = muse_offset + SCALE[muse_clock_pulse()]; + if (muse_note != last_muse_note) { + stop_note(compute_freq_for_midi_note(last_muse_note)); + play_note(compute_freq_for_midi_note(muse_note), 0xF); + last_muse_note = muse_note; + } + } + muse_counter = (muse_counter + 1) % muse_tempo; + } + #endif +} + +bool music_mask_user(uint16_t keycode) { + switch (keycode) { + case RAISE: + case LOWER: + return false; + default: + return true; + } +} diff --git a/keyboards/planck/keymaps/pascamel/readme.md b/keyboards/planck/keymaps/pascamel/readme.md new file mode 100644 index 000000000..b6be21cc9 --- /dev/null +++ b/keyboards/planck/keymaps/pascamel/readme.md @@ -0,0 +1,29 @@ +#### Base Layer + +A regular QWERTY layer, with Ctrl/alt/cmd on the bottom right corner + +![Qwerty](https://i.imgur.com/FpRNJZH.png) + + + +#### Lower ⇓ + +Focused on numbers and calculations + +![Lower](https://i.imgur.com/PyXSGba.png) + + + +#### Raise ⇑ + +Symbols + +![Raise](https://i.imgur.com/pYhqcnI.png) + + + +#### Adjust ⇑+⇓ + +Settings and configurations + +![Adjust](https://i.imgur.com/JN7a0Ku.png) diff --git a/keyboards/planck/keymaps/pascamel/rules.mk b/keyboards/planck/keymaps/pascamel/rules.mk new file mode 100644 index 000000000..dcf16bef3 --- /dev/null +++ b/keyboards/planck/keymaps/pascamel/rules.mk @@ -0,0 +1 @@ +SRC += muse.c From 6bf2c077151bf6e71f5fe44f730c127eb667f5a6 Mon Sep 17 00:00:00 2001 From: Olivier Poitrey Date: Sat, 15 Sep 2018 10:50:38 -0700 Subject: [PATCH 097/788] Keymap: dz60/macos_arrow: rev3 (#3909) * Arrow keys are now arranged on hjkl (vi style) * The escape key is moved on capslock, shared with func layer switch * The grave key is now dedicated (not shared with escape) * Add a new numpad layer that can be activated with the spacebar * Fix layout mismatch between layers * Use bult-in underscore KC_TRNS alias --- keyboards/dz60/keymaps/macos_arrow/keymap.c | 77 ++++++++++++-------- keyboards/dz60/keymaps/macos_arrow/readme.md | 39 +++++++--- 2 files changed, 76 insertions(+), 40 deletions(-) diff --git a/keyboards/dz60/keymaps/macos_arrow/keymap.c b/keyboards/dz60/keymaps/macos_arrow/keymap.c index f4b03ddc9..9a3120afd 100644 --- a/keyboards/dz60/keymaps/macos_arrow/keymap.c +++ b/keyboards/dz60/keymaps/macos_arrow/keymap.c @@ -1,9 +1,9 @@ #include QMK_KEYBOARD_H -#define ______ KC_TRNS -#define _BL 0 -#define _FL 1 -#define _ML 2 +#define _BL 0 // Base layer +#define _FL 1 // Function layer +#define _ML 2 // Media layer +#define _NL 2 // Numpad layer enum my_keycodes { BR_UP = SAFE_RANGE, @@ -12,45 +12,45 @@ enum my_keycodes { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* ,-----------------------------------------------------------------------------------------. - * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Backspace | + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Backspace | * |-----------------------------------------------------------------------------------------+ * | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | * |-----------------------------------------------------------------------------------------+ - * | _FL | A | S | D | F | G | H | J | K | L | ; | ' | Enter | + * | Esc/_FL | A | S | D | F | G | H | J | K | L | ; | ' | Enter | * |-----------------------------------------------------------------------------------------+ - * | Shift | Z | X | C | V | B | N | M | , | . | / | _ML | Up |Shift| + * | Shift | Z | X | C | V | B | N | M | , | . | / | | Up |Shift| * |-----------------------------------------------------------------------------------------+ - * | Ctrl | Alt | Gui | Space |Gui/_ML| Alt | Left| Down|Right| + * | Ctrl | Alt | Gui | Space / _NL |Gui/_ML| Alt | Left| Down|Right| * `-----------------------------------------------------------------------------------------' */ [_BL] = LAYOUT_2_shifts( - KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_NO, KC_BSPC, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_NO, KC_BSPC, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, - MO(_FL), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, - KC_LSFT, KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, MO(_ML), KC_UP, KC_RSFT, - KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_SPC, KC_SPC, LM(_ML, MOD_RGUI), KC_RALT, KC_LEFT, KC_DOWN, KC_RIGHT), + LT(_FL, KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_A, KC_UP, KC_RSFT, + KC_LCTL, KC_LALT, KC_LGUI, KC_NO, LT(_NL, KC_SPC), KC_NO, LM(_ML, MOD_RGUI), KC_RALT, KC_LEFT, KC_DOWN, KC_RIGHT), /* ,-----------------------------------------------------------------------------------------. - * | ` | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | Del | + * | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | Del | * |-----------------------------------------------------------------------------------------+ - * | | | | | | | | | UP | | | | | | + * | | | | | | | |PgUp | | | | | | | * |-----------------------------------------------------------------------------------------+ - * | | | | | | | | Left| Down|Right| | | | + * | | | | | | | Left| Down| Up |Right| | | | * |-----------------------------------------------------------------------------------------+ - * | | | | | | | | | | | | | | | + * | | | | | | | |PgDwn| | | | | | | * |-----------------------------------------------------------------------------------------+ * | | | | | | | | | | * `-----------------------------------------------------------------------------------------' */ - [_FL] = LAYOUT( - KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ______, KC_DEL, - ______, ______, ______, ______, ______, ______, ______, ______, KC_UP, ______, ______, ______, ______, ______, - ______, ______, ______, ______, ______, ______, ______, KC_LEFT, KC_DOWN, KC_RIGHT, ______, ______, ______, - ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, - ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______), + [_FL] = LAYOUT_2_shifts( + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NO, KC_DEL, + _______, _______, _______, _______, _______, _______, _______, KC_PGUP, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, _______, _______, _______, + _______, KC_NO, _______, _______, _______, _______, _______, _______, KC_PGDN, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), /* ,-----------------------------------------------------------------------------------------. - * |Eject| BR- | BR+ | F3 | F4 | | |PREV |PLAY |NEXT |MUTE | V- | V+ | | + * |Eject| BR- | BR+ | | | | |PREV |PLAY |NEXT |MUTE | V- | V+ | | * |-----------------------------------------------------------------------------------------+ * | | | | | | | | | | | | | | Reset | * |-----------------------------------------------------------------------------------------+ @@ -61,12 +61,31 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | * `-----------------------------------------------------------------------------------------' */ - [_ML] = LAYOUT( - KC_MEDIA_EJECT, BR_DOWN, BR_UP, ______, ______, KC_F5, KC_F6, KC_MEDIA_PREV_TRACK, KC_MEDIA_PLAY_PAUSE, KC_MEDIA_NEXT_TRACK, KC_AUDIO_MUTE, KC_AUDIO_VOL_DOWN, KC_AUDIO_VOL_UP, ______, ______, - ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, RESET, - ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, - ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, - ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______), + [_ML] = LAYOUT_2_shifts( + KC_MEDIA_EJECT, BR_DOWN, BR_UP, _______, _______, _______, _______, KC_MEDIA_PREV_TRACK, KC_MEDIA_PLAY_PAUSE, KC_MEDIA_NEXT_TRACK, KC_AUDIO_MUTE, KC_AUDIO_VOL_DOWN, KC_AUDIO_VOL_UP, KC_NO, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, KC_NO, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + + /* ,-----------------------------------------------------------------------------------------. + * | | | | | | | | | % | ( | ) | < | > | | + * |-----------------------------------------------------------------------------------------+ + * | | | | | | | | * | 0 | 1 | 2 | 3 | | | + * |-----------------------------------------------------------------------------------------+ + * | | | | | | | | . | - | 4 | 5 | 6 | | + * |-----------------------------------------------------------------------------------------+ + * | | | | | | | | , | = | 7 | 8 | 9 | | | + * |-----------------------------------------------------------------------------------------+ + * | | | | | | | | | | + * `-----------------------------------------------------------------------------------------' + */ + [_NL] = LAYOUT_2_shifts( + _______, _______, _______, _______, _______, _______, _______, _______, KC_PERCENT, KC_LEFT_PAREN, KC_RIGHT_PAREN, KC_LEFT_ANGLE_BRACKET, KC_RIGHT_ANGLE_BRACKET, KC_NO, _______, + _______, _______, _______, _______, _______, _______, _______, KC_ASTERISK, KC_0, KC_1, KC_2, KC_3, _______, RESET, + _______, _______, _______, _______, _______, _______, _______, KC_DOT, KC_MINS, KC_4, KC_5, KC_6, _______, + _______, KC_NO, _______, _______, _______, _______, _______, _______, KC_COMMA, KC_EQL, KC_7, KC_8, KC_9, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), }; bool process_record_user(uint16_t keycode, keyrecord_t *record) { diff --git a/keyboards/dz60/keymaps/macos_arrow/readme.md b/keyboards/dz60/keymaps/macos_arrow/readme.md index bba8148ba..cb700b38f 100644 --- a/keyboards/dz60/keymaps/macos_arrow/readme.md +++ b/keyboards/dz60/keymaps/macos_arrow/readme.md @@ -15,21 +15,22 @@ My build used the following components: ``` ,-----------------------------------------------------------------------------------------. -| Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Backspace | +| ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Backspace | |-----------------------------------------------------------------------------------------+ | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | |-----------------------------------------------------------------------------------------+ -| _FL | A | S | D | F | G | H | J | K | L | ; | ' | Enter | +| _FL/Esc | A | S | D | F | G | H | J | K | L | ; | ' | Enter | |-----------------------------------------------------------------------------------------+ -| Shift | Z | X | C | V | B | N | M | , | . | / | _ML | Up |Shift| +| Shift | Z | X | C | V | B | N | M | , | . | / | | Up |Shift| |-----------------------------------------------------------------------------------------+ -| Ctrl | Alt | Cmd | Space |Cmd/_ML| Alt | Left| Down|Right| +| Ctrl | Alt | Cmd | _NL / Space |Cmd/_ML| Alt | Left| Down|Right| `-----------------------------------------------------------------------------------------' ``` -* The escape key use `KC_GESC` to get grave accent on any letter with ``Alt+Esc`` and `` ` `` alone with the ``Hyper+Esc``. The `~` is obtained with `Shift+Esc`. `GRAVE_ESC_GUI_OVERRIDE` is define so `Cmd+Alt+Esc` can still work. -* The `Caps-Lock` (`Hyper`) key switch to the function layer (`_FL`). -* The right `Cmd` key is used to switch to the media layer (`_ML`) when used with keys mapped on that layer (the top row). Any other keys just act as a `Cmd+` that key. +* The escape key is moved to the capslock to get keep grave letter pristine. +* The `Caps-Lock` (`Hyper`) key switch to the function layer (`_FL`) or escape when used alone. +* The right `Cmd` key is used to switch to the media layer (`_ML`) when used with keys mapped on that layer. +* The space key can be used to switch to the numpad layer (`_NL`) when used with one of the mapped key on that layer. ## Function Layer (_FL) @@ -37,9 +38,9 @@ My build used the following components: ,-----------------------------------------------------------------------------------------. | ` | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | Del | |-----------------------------------------------------------------------------------------+ -| | | | | | | | | UP | | | | | | +| | | | | | | |PgDwn| PgUp| | | | | | |-----------------------------------------------------------------------------------------+ -| | | | | | | | Left| Down|Right| | | | +| | | | | | | Left| Down| Up |Right| | | | |-----------------------------------------------------------------------------------------+ | | | | | | | | | | | | | | | |-----------------------------------------------------------------------------------------+ @@ -47,13 +48,13 @@ My build used the following components: `-----------------------------------------------------------------------------------------' ``` -The function layer is activated by the `Caps-Lock` (`Hyper`) key to access `F` keys. In addition, the `IJKL` are mapped as cursor keys on that layer. +The function layer is activated by the `Caps-Lock` (`Hyper`) key to access `F` keys. In addition, the `HJKL` are mapped as cursor keys on that layer. ## Media Layer (_ML) ``` ,-----------------------------------------------------------------------------------------. -| | BR- | BR+ | F3 | F4 | | |PREV |PLAY |NEXT |MUTE | V- | V+ | Eject | +|Eject| BR- | BR+ | | | | |PREV |PLAY |NEXT |MUTE | V- | V+ | | |-----------------------------------------------------------------------------------------+ | | | | | | | | | | | | | | Reset | |-----------------------------------------------------------------------------------------+ @@ -67,4 +68,20 @@ The function layer is activated by the `Caps-Lock` (`Hyper`) key to access `F` k The media layer is activated by the right `Cmd` (`FN`) key. It contains the typical macos media keys on the top row. Blank keys act as `Cmd+` that key on the base layer. +## Numpad Layer (_NL) +``` +,-----------------------------------------------------------------------------------------. +| | | | | | | | | % | ( | ) | < | > | | +|-----------------------------------------------------------------------------------------+ +| | | | | | | | * | 0 | 1 | 2 | 3 | | | +|-----------------------------------------------------------------------------------------+ +| | | | | | | | . | - | 4 | 5 | 6 | | +|-----------------------------------------------------------------------------------------+ +| | | | | | | | , | = | 7 | 8 | 9 | | | +|-----------------------------------------------------------------------------------------+ +| | | | | | | | | | +`-----------------------------------------------------------------------------------------' +``` + +The numpad layer is activated by the space bar, when hold. \ No newline at end of file From b65e2143751fd7c1721a6690597f523137c7c484 Mon Sep 17 00:00:00 2001 From: omkbd Date: Sun, 16 Sep 2018 02:57:46 +0900 Subject: [PATCH 098/788] Keyboard: add ergodash mini keyboard (#3901) * add ergodash mini add ergodash mini (4rows version) fix keymap and readme * fix replace include guard remove includes * fix audio --- keyboards/ergodash/ergodash.h | 18 +++ keyboards/ergodash/mini/config.h | 97 +++++++++++++ keyboards/ergodash/mini/info.json | 13 ++ .../ergodash/mini/keymaps/default/config.h | 39 ++++++ .../ergodash/mini/keymaps/default/keymap.c | 129 ++++++++++++++++++ .../ergodash/mini/keymaps/default/rules.mk | 0 keyboards/ergodash/mini/mini.c | 13 ++ keyboards/ergodash/mini/mini.h | 60 ++++++++ keyboards/ergodash/mini/readme.md | 18 +++ keyboards/ergodash/mini/rules.mk | 2 + keyboards/ergodash/readme.md | 4 +- keyboards/ergodash/rev2/config.h | 2 + .../ergodash/rev2/keymaps/default/keymap.c | 30 ++-- keyboards/ergodash/rev2/rules.mk | 3 +- keyboards/ergodash/rules.mk | 2 +- 15 files changed, 411 insertions(+), 19 deletions(-) create mode 100644 keyboards/ergodash/mini/config.h create mode 100644 keyboards/ergodash/mini/info.json create mode 100644 keyboards/ergodash/mini/keymaps/default/config.h create mode 100644 keyboards/ergodash/mini/keymaps/default/keymap.c create mode 100644 keyboards/ergodash/mini/keymaps/default/rules.mk create mode 100644 keyboards/ergodash/mini/mini.c create mode 100644 keyboards/ergodash/mini/mini.h create mode 100644 keyboards/ergodash/mini/readme.md create mode 100644 keyboards/ergodash/mini/rules.mk diff --git a/keyboards/ergodash/ergodash.h b/keyboards/ergodash/ergodash.h index 9900a1def..bf2bac581 100644 --- a/keyboards/ergodash/ergodash.h +++ b/keyboards/ergodash/ergodash.h @@ -43,4 +43,22 @@ ) #endif // #ifdef KEYBOARD_ergodash_rev2 +#ifdef KEYBOARD_ergodash_mini + #include "mini.h" + + // Used to create a keymap using only KC_ prefixed keys + #define LAYOUT_kc( \ + L00, L01, L02, L03, L04, L05, L06, R00, R01, R02, R03, R04, R05, R06, \ + L10, L11, L12, L13, L14, L15, L16, R10, R11, R12, R13, R14, R15, R16, \ + L20, L21, L22, L23, L24, L25, L26, R20, R21, R22, R23, R24, R25, R26, \ + L30, L31, L32, L33, L34, L35, L36, R30, R31, R32, R33, R34, R35, R36 \ + ) \ + LAYOUT( \ + KC_##L00, KC_##L01, KC_##L02, KC_##L03, KC_##L04, KC_##L05, KC_##L06, KC_##R00, KC_##R01, KC_##R02, KC_##R03, KC_##R04, KC_##R05, KC_##R06, \ + KC_##L10, KC_##L11, KC_##L12, KC_##L13, KC_##L14, KC_##L15, KC_##L16, KC_##R10, KC_##R11, KC_##R12, KC_##R13, KC_##R14, KC_##R15, KC_##R16, \ + KC_##L20, KC_##L21, KC_##L22, KC_##L23, KC_##L24, KC_##L25, KC_##L26, KC_##R20, KC_##R21, KC_##R22, KC_##R23, KC_##R24, KC_##R25, KC_##R26, \ + KC_##L30, KC_##L31, KC_##L32, KC_##L33, KC_##L34, KC_##L35, KC_##L36, KC_##R30, KC_##R31, KC_##R32, KC_##R33, KC_##R34, KC_##R35, KC_##R36 \ + ) +#endif // #ifdef KEYBOARD_ergodash_mini + #endif diff --git a/keyboards/ergodash/mini/config.h b/keyboards/ergodash/mini/config.h new file mode 100644 index 000000000..a7be1635c --- /dev/null +++ b/keyboards/ergodash/mini/config.h @@ -0,0 +1,97 @@ +/* +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0100 +#define MANUFACTURER Omkbd +#define PRODUCT ErgoDashmini +#define DESCRIPTION Power + +/* key matrix size */ +// Rows are doubled-up +#define MATRIX_ROWS 8 +#define MATRIX_COLS 7 + +// wiring of each half +#define MATRIX_ROW_PINS { D7, E6, B4, B5 } +#define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3, B2 } +// #define MATRIX_COL_PINS { B2, B3, B1, F7, F6, F5, F4 } //uncomment this line and comment line above if you need to reverse left-to-right key order + +/* define tapping term */ +#define TAPPING_TERM 120 + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +#define C6_AUDIO +#ifdef AUDIO_ENABLE + #define STARTUP_SONG SONG(STARTUP_SOUND) + #define GOODBYE_SONG SONG(GOODBYE_SOUND) +#endif + +/* number of backlight levels */ +#ifdef BACKLIGHT_ENABLE + #define BACKLIGHT_PIN B6 + #define BACKLIGHT_LEVELS 7 +// #define BACKLIGHT_BREATHING +// #define BREATHING_PERIOD 4 +#endif + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCING_DELAY 5 + +/* 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 + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* ws2812 RGB LED */ +#define RGB_DI_PIN D3 +#define RGBLIGHT_TIMER +#define RGBLED_NUM 20 // Number of LEDs +#define ws2812_PORTREG PORTD +#define ws2812_DDRREG DDRD + +/* + * 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 diff --git a/keyboards/ergodash/mini/info.json b/keyboards/ergodash/mini/info.json new file mode 100644 index 000000000..538e0b872 --- /dev/null +++ b/keyboards/ergodash/mini/info.json @@ -0,0 +1,13 @@ +{ + "keyboard_name": "ErgoDash mini", + "url": "", + "maintainer": "qmk", + "width": 18, + "height": 6.25, + "layouts": { + "LAYOUT": { + "key_count": 56, + "layout": [{"label":"L00", "x":0, "y":1.375}, {"label":"L01", "x":1, "y":1.375}, {"label":"L02", "x":2, "y":1.125}, {"label":"L03", "x":3, "y":1}, {"label":"L04", "x":4, "y":1.125}, {"label":"L05", "x":5, "y":1.25}, {"label":"L06", "x":6, "y":1.75}, {"label":"R00", "x":11, "y":1.75}, {"label":"R01", "x":12, "y":1.25}, {"label":"R02", "x":13, "y":1.125}, {"label":"R03", "x":14, "y":1}, {"label":"R04", "x":15, "y":1.125}, {"label":"R05", "x":16, "y":1.375}, {"label":"R06", "x":17, "y":1.375}, {"label":"L10", "x":0, "y":2.375}, {"label":"L11", "x":1, "y":2.375}, {"label":"L12", "x":2, "y":2.125}, {"label":"L13", "x":3, "y":2}, {"label":"L14", "x":4, "y":2.125}, {"label":"L15", "x":5, "y":2.25}, {"label":"L16", "x":6, "y":2.75}, {"label":"R10", "x":11, "y":2.75}, {"label":"R11", "x":12, "y":2.25}, {"label":"R12", "x":13, "y":2.125}, {"label":"R13", "x":14, "y":2}, {"label":"R14", "x":15, "y":2.125}, {"label":"R15", "x":16, "y":2.375}, {"label":"R16", "x":17, "y":2.375}, {"label":"L20", "x":0, "y":3.375}, {"label":"L21", "x":1, "y":3.375}, {"label":"L22", "x":2, "y":3.125}, {"label":"L23", "x":3, "y":3}, {"label":"L24", "x":4, "y":3.125}, {"label":"L25", "x":5, "y":3.25}, {"label":"L26", "x":6.5, "y":4.25}, {"label":"R20", "x":10.5, "y":4.25}, {"label":"R21", "x":12, "y":3.25}, {"label":"R22", "x":13, "y":3.125}, {"label":"R23", "x":14, "y":3}, {"label":"R24", "x":15, "y":3.125}, {"label":"R25", "x":16, "y":3.375}, {"label":"R26", "x":17, "y":3.375}, {"label":"L30", "x":0, "y":4.375}, {"label":"L31", "x":1, "y":4.375}, {"label":"L32", "x":2, "y":4.125}, {"label":"L33", "x":3, "y":4}, {"label":"L34", "x":5.5, "y":5.25}, {"label":"L35", "x":6.5, "y":5.25}, {"label":"L36", "x":7.5, "y":4.25, "h":2}, {"label":"R30", "x":9.5, "y":4.25, "h":2}, {"label":"R31", "x":10.5, "y":5.25}, {"label":"R32", "x":11.5, "y":5.25}, {"label":"R33", "x":14, "y":4}, {"label":"R34", "x":15, "y":4.125}, {"label":"R35", "x":16, "y":4.375}, {"label":"R36", "x":17, "y":4.375}] + } + } +} diff --git a/keyboards/ergodash/mini/keymaps/default/config.h b/keyboards/ergodash/mini/keymaps/default/config.h new file mode 100644 index 000000000..a5a722fb2 --- /dev/null +++ b/keyboards/ergodash/mini/keymaps/default/config.h @@ -0,0 +1,39 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#pragma once + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + +#undef RGBLED_NUM +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 20 +#define RGBLIGHT_HUE_STEP 10 +#define RGBLIGHT_SAT_STEP 17 +#define RGBLIGHT_VAL_STEP 17 diff --git a/keyboards/ergodash/mini/keymaps/default/keymap.c b/keyboards/ergodash/mini/keymaps/default/keymap.c new file mode 100644 index 000000000..ecf1f723f --- /dev/null +++ b/keyboards/ergodash/mini/keymaps/default/keymap.c @@ -0,0 +1,129 @@ +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +#define _QWERTY 0 +#define _LOWER 1 +#define _RAISE 2 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + LOWER, + RAISE, + ADJUST, +}; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO +#define EISU LALT(KC_GRV) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* Qwerty + * ,----------------------------------------------------------------------------------------------------------------------. + * | Esc | Q | W | E | R | T | - | | = | Y | U | I | O | P | \ | + * |------+------+------+------+------+------+------+--------------------+------+------+------+------+------+------+------| + * | Tab | A | S | D | F | G | [ | | ] | H | J | K | L | ; | " | + * |------+------+------+------+------+------+---------------------------+------+------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | Space| | Enter| N | M | , | . | / | Shift| + * |-------------+------+------+------+------+------+------+------+------+------+------+------+------+------+-------------| + * | Ctrl | GUI | ALt | EISU |||||||| Lower| Space|Delete|||||||| Bksp | Enter| Raise|||||||| Left | Down | Up | Right| + * ,----------------------------------------------------------------------------------------------------------------------. + */ + [_QWERTY] = LAYOUT( \ + KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_MINS, KC_EQL , KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, \ + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_LBRC, KC_RBRC, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_SPC , KC_ENT , KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \ + KC_LCTL, KC_LGUI, KC_LALT, EISU, LOWER, KC_SPC , KC_DEL, KC_BSPC,KC_ENT , RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ + ), + + /* Lower + * ,----------------------------------------------------------------------------------------------------------------------. + * | ` | ! | @ | # | $ | % | _ | | + | ^ | & | * | ( | ) | | | + * |------+------+------+------+------+------+------+--------------------+------+------+------+------+------+------+------| + * | ~ | 1 | 2 | 3 | 4 | 5 | { | | } | Left | Down | Up | Right| : | " | + * |------+------+------+------+------+------+---------------------------+------+------+------+------+------+------+------| + * | Shift| 6 | 7 | 8 | 9 | 0 | Space| | Enter| N | M | < | > | ? | Shift| + * |-------------+------+------+------+------+------+------+------+------+------+------+------+------+------+-------------| + * | Ctrl | GUI | ALt | EISU |||||||| Lower| Space|Delete|||||||| Bksp | Enter| Raise|||||||| Home |PageDn|PageUp| End | + * ,----------------------------------------------------------------------------------------------------------------------. + */ + [_LOWER] = LAYOUT( + KC_GRV , KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_UNDS, KC_PLUS, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_PIPE, \ + KC_TILD, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LCBR, KC_RCBR, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT, KC_COLN, KC_DQT , \ + KC_LSFT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_SPC , KC_ENT , KC_N, KC_M, KC_LT, KC_GT, KC_QUES, KC_RSFT, \ + KC_LCTL, KC_LGUI, KC_LALT, EISU, LOWER, KC_SPC , KC_DEL, KC_BSPC,KC_ENT , RAISE, KC_HOME, KC_PGDN, KC_PGUP, KC_END \ + ), + + /* Raise + * ,----------------------------------------------------------------------------------------------------------------------. + * | ` | ! | @ | # | $ | % | _ | | + | ^ | & | * | ( | ) | | | + * |------+------+------+------+------+------+------+--------------------+------+------+------+------+------+------+------| + * | ~ | F1 | F2 | F3 | F4 | F5 | { | | } | Left | Down | Up | Right| : | " | + * |------+------+------+------+------+------+---------------------------+------+------+------+------+------+------+------| + * | Shift| F6 | F7 | F8 | F9 | F10 | Space| | Enter| N | M | < | > | ? | Shift| + * |-------------+------+------+------+------+------+------+------+------+------+------+------+------+------+-------------| + * | Ctrl | F11 | F12 | EISU |||||||| Lower| Space|Delete|||||||| Bksp | Enter| Raise|||||||| Home |PageDn|PageUp| End | + * ,----------------------------------------------------------------------------------------------------------------------. + */ + [_RAISE] = LAYOUT( + KC_GRV , KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_UNDS, KC_PLUS, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_PIPE, \ + KC_TILD, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_LCBR, KC_RCBR, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT, KC_COLN, KC_DQT , \ + KC_LSFT, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_SPC , KC_ENT , KC_N, KC_M, KC_LT, KC_GT, KC_QUES, KC_RSFT, \ + KC_LCTL, KC_F11 , KC_F12, EISU, LOWER, KC_SPC , KC_DEL, KC_BSPC,KC_ENT , RAISE, KC_HOME, KC_PGDN, KC_PGUP, KC_END \ + ), + + /* Adjust + * ,----------------------------------------------------------------------------------------------------------------------. + * | | Reset|RGB ON| MODE| HUE-| HUE+| | | | SAT-| SAT+| VAL-| VAL+| | | + * |------+------+------+------+------+------+---------------------------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | | | | | + * |------+------+------+------+------+------+---------------------------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | | | | | + * |-------------+------+------+------+------+------+------+------+------+------+------+------+------+------+-------------| + * | | | | |||||||| | | |||||||| | | |||||||| | | | | + * ,----------------------------------------------------------------------------------------------------------------------. + */ + [_ADJUST] = LAYOUT( + _______, RESET , RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI,_______, _______, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, _______, _______, \ + _______, _______, BL_TOGG, BL_BRTG, BL_INC , BL_DEC ,_______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______,_______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______,_______,_______, _______,_______, _______, _______, _______, _______, _______ \ + ) +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + break; + } + return true; +} diff --git a/keyboards/ergodash/mini/keymaps/default/rules.mk b/keyboards/ergodash/mini/keymaps/default/rules.mk new file mode 100644 index 000000000..e69de29bb diff --git a/keyboards/ergodash/mini/mini.c b/keyboards/ergodash/mini/mini.c new file mode 100644 index 000000000..89b821297 --- /dev/null +++ b/keyboards/ergodash/mini/mini.c @@ -0,0 +1,13 @@ +#include "ergodash.h" + +#ifdef AUDIO_ENABLE + float tone_startup[][2] = SONG(STARTUP_SOUND); + float tone_goodbye[][2] = SONG(GOODBYE_SOUND); +#endif + +#ifdef SSD1306OLED +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + led_set_user(usb_led); +} +#endif diff --git a/keyboards/ergodash/mini/mini.h b/keyboards/ergodash/mini/mini.h new file mode 100644 index 000000000..74e574170 --- /dev/null +++ b/keyboards/ergodash/mini/mini.h @@ -0,0 +1,60 @@ +#ifndef MINI_H +#define MINI_H + +#include "ergodash.h" + +//void promicro_bootloader_jmp(bool program); +#include "quantum.h" + + +#ifdef USE_I2C +#include +#ifdef __AVR__ + #include + #include +#endif +#endif + +//void promicro_bootloader_jmp(bool program); + +#ifndef FLIP_HALF +// Standard Keymap +// (TRRS jack on the left half is to the right, TRRS jack on the right half is to the left) +#define LAYOUT( \ + L00, L01, L02, L03, L04, L05, L06, R00, R01, R02, R03, R04, R05, R06, \ + L10, L11, L12, L13, L14, L15, L16, R10, R11, R12, R13, R14, R15, R16, \ + L20, L21, L22, L23, L24, L25, L26, R20, R21, R22, R23, R24, R25, R26, \ + L30, L31, L32, L33, L34, L35, L36, R30, R31, R32, R33, R34, R35, R36 \ + ) \ + { \ + { L00, L01, L02, L03, L04, L05, L06 }, \ + { L10, L11, L12, L13, L14, L15, L16 }, \ + { L20, L21, L22, L23, L24, L25, L26 }, \ + { L30, L31, L32, L33, L34, L35, L36 }, \ + { R06, R05, R04, R03, R02, R01, R00 }, \ + { R16, R15, R14, R13, R12, R11, R10 }, \ + { R26, R25, R24, R23, R22, R21, R20 }, \ + { R36, R35, R34, R33, R32, R31, R30 }, \ + } +#else +// Keymap with right side flipped +// (TRRS jack on both halves are to the right) +#define LAYOUT( \ + L00, L01, L02, L03, L04, L05, L06, R00, R01, R02, R03, R04, R05, R06, \ + L10, L11, L12, L13, L14, L15, L16, R10, R11, R12, R13, R14, R15, R16, \ + L20, L21, L22, L23, L24, L25, L26, R20, R21, R22, R23, R24, R25, R26, \ + L30, L31, L32, L33, L34, L35, L36, R30, R31, R32, R33, R34, R35, R36 \ + ) \ + { \ + { L00, L01, L02, L03, L04, L05, L06 }, \ + { L10, L11, L12, L13, L14, L15, L16 }, \ + { L20, L21, L22, L23, L24, L25, L26 }, \ + { L30, L31, L32, L33, L34, L35, L36 }, \ + { R00, R01, R02, R03, R04, R05, R06 }, \ + { R10, R11, R12, R13, R14, R15, R16 }, \ + { R20, R21, R22, R23, R24, R25, R26 }, \ + { R30, R31, R32, R33, R34, R35, R36 }, \ + } +#endif + +#endif diff --git a/keyboards/ergodash/mini/readme.md b/keyboards/ergodash/mini/readme.md new file mode 100644 index 000000000..f830f3f1d --- /dev/null +++ b/keyboards/ergodash/mini/readme.md @@ -0,0 +1,18 @@ +# ErgoDash mini + +![ErgoDash mini](https://github.com/omkbd/picture/blob/master/Ergodashmini.jpg) + +Keyboard Maintainer: [omkbd](https://github.com/omkbd) [@omkbd](https://twitter.com/omkbd) +Hardware Supported: ErgoDash mini PCB, Pro Micro ATmega32u4 +Hardware Availability: Order your own [yourself](https://github.com/omkbd/ErgoDash) + + +Make example for this keyboard (after setting up your build environment): + + make ergodash/mini:default + +See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. + +# Layout +![layout](https://github.com/omkbd/picture/blob/master/ergodashmini-layout.png) +![PCB](https://github.com/omkbd/picture/blob/master/Ergodashmini_PCB.jpg) diff --git a/keyboards/ergodash/mini/rules.mk b/keyboards/ergodash/mini/rules.mk new file mode 100644 index 000000000..b6c9a2580 --- /dev/null +++ b/keyboards/ergodash/mini/rules.mk @@ -0,0 +1,2 @@ +BACKLIGHT_ENABLE = no +RGBLIGHT_ENABLE = no diff --git a/keyboards/ergodash/readme.md b/keyboards/ergodash/readme.md index d0d1dcb56..7fa76344f 100644 --- a/keyboards/ergodash/readme.md +++ b/keyboards/ergodash/readme.md @@ -1,6 +1,6 @@ # ErgoDash -![ErgoDash](https://github.com/omkbd/picture/blob/master/IMG_20180630_1702141.jpg) +![ErgoDash](https://github.com/omkbd/picture/blob/master/Ergodash.jpg) Keyboard Maintainer: [omkbd](https://github.com/omkbd) [@omkbd](https://twitter.com/omkbd) Hardware Supported: ErgoDash PCB, Pro Micro ATmega32u4 @@ -15,4 +15,4 @@ See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) # Layout ![layout](https://github.com/omkbd/picture/blob/master/ergodash-layout.png) -![PCB](https://github.com/omkbd/picture/blob/master/IMG_20180630_2022231.jpg) +![PCB](https://github.com/omkbd/picture/blob/master/Ergodash_PCB.jpg) diff --git a/keyboards/ergodash/rev2/config.h b/keyboards/ergodash/rev2/config.h index d0b396cd4..489afe017 100644 --- a/keyboards/ergodash/rev2/config.h +++ b/keyboards/ergodash/rev2/config.h @@ -45,6 +45,8 @@ along with this program. If not, see . /* define if matrix has ghost */ //#define MATRIX_HAS_GHOST +#define C6_AUDIO + /* number of backlight levels */ #ifdef BACKLIGHT_ENABLE #define BACKLIGHT_PIN B6 diff --git a/keyboards/ergodash/rev2/keymaps/default/keymap.c b/keyboards/ergodash/rev2/keymaps/default/keymap.c index dc1f6eedd..418089e1b 100644 --- a/keyboards/ergodash/rev2/keymaps/default/keymap.c +++ b/keyboards/ergodash/rev2/keymaps/default/keymap.c @@ -19,29 +19,29 @@ enum custom_keycodes { // Fillers to make layering more clear #define _______ KC_TRNS #define XXXXXXX KC_NO -#define KC_JPN LALT(KC_GRV) +#define EISU LALT(KC_GRV) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Qwerty * ,----------------------------------------------------------------------------------------------------------------------. - * | ESC | 1 | 2 | 3 | 4 | 5 | [ | | ] | 6 | 7 | 8 | 9 | 0 | Caps | + * | ESC | 1 | 2 | 3 | 4 | 5 | [ | | ] | 6 | 7 | 8 | 9 | 0 |Pscree| * |------+------+------+------+------+------+------+--------------------+------+------+------+------+------+------+------| * | ` | Q | W | E | R | T | - | | = | Y | U | I | O | P | \ | * |------+------+------+------+------+------+------+--------------------+------+------+------+------+------+------+------| * | Tab | A | S | D | F | G | Del | | Bksp | H | J | K | L | ; | " | * |------+------+------+------+------+------+---------------------------+------+------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | JPN | | Enter| N | M | , | . | / | Shift| + * | Shift| Z | X | C | V | B | Space| | Enter| N | M | , | . | / | Shift| * |-------------+------+------+------+------+------+------+------+------+------+------+------+------+------+-------------| - * | Ctrl | GUI | ALt |Adjust|||||||| Lower| Space| |||||||| | Enter| Raise|||||||| Left | Down | Up | Right| + * | Ctrl | GUI | ALt | EISU |||||||| Lower| Space| |||||||| | Enter| Raise|||||||| Left | Down | Up | Right| * ,----------------------------------------------------------------------------------------------------------------------. */ [_QWERTY] = LAYOUT( \ - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LBRC, KC_RBRC, KC_6, KC_7, KC_8, KC_9, KC_0, KC_CAPS, \ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LBRC, KC_RBRC, KC_6, KC_7, KC_8, KC_9, KC_0, KC_PSCR, \ KC_GRV, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_MINS, KC_EQL , KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, \ KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_DEL , KC_BSPC, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_JPN , KC_ENT , KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \ - KC_LCTL, KC_LGUI, KC_LALT, ADJUST, LOWER, KC_SPC ,_______, _______,KC_ENT , RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_SPC , KC_ENT , KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \ + KC_LCTL, KC_LGUI, KC_LALT, EISU, LOWER, KC_SPC ,_______, _______,KC_ENT , RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ ), /* Lower @@ -52,17 +52,17 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------+------+--------------------+------+------+------+------+------+------+------| * | Tab | 1 | 2 | 3 | 4 | 5 | Del | | Bksp | H | J | K | L | : | " | * |------+------+------+------+------+------+---------------------------+------+------+------+------+------+------+------| - * | Shift| 6 | 7 | 8 | 9 | 0 | JPN | | Enter| N | M | < | > | ? | Shift| + * | Shift| 6 | 7 | 8 | 9 | 0 | Space| | Enter| N | M | < | > | ? | Shift| * |-------------+------+------+------+------+------+------+------+------+------+------+------+------+------+-------------| - * | Ctrl | GUI | ALt |Adjust|||||||| Lower| Space| |||||||| | Enter| Raise|||||||| Home |PageDn|PageUp| End | + * | Ctrl | GUI | ALt | EISU |||||||| Lower| Space| |||||||| | Enter| Raise|||||||| Home |PageDn|PageUp| End | * ,----------------------------------------------------------------------------------------------------------------------. */ [_LOWER] = LAYOUT( KC_F11, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_LCBR, KC_RCBR, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F12, \ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_UNDS, KC_PLUS, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_PIPE, \ KC_TAB, KC_1, KC_2, KC_3, KC_4, KC_5, KC_DEL , KC_BSPC, KC_H, KC_J, KC_K, KC_L, KC_COLN, KC_DQT , \ - KC_LSFT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_JPN , KC_ENT , KC_N, KC_M, KC_LT, KC_GT, KC_QUES, KC_RSFT, \ - KC_LCTL, KC_LGUI, KC_LALT, ADJUST, LOWER, KC_SPC ,_______, _______,KC_ENT , RAISE, KC_HOME, KC_PGDN, KC_PGUP, KC_END \ + KC_LSFT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_SPC , KC_ENT , KC_N, KC_M, KC_LT, KC_GT, KC_QUES, KC_RSFT, \ + KC_LCTL, KC_LGUI, KC_LALT, EISU, LOWER, KC_SPC ,_______, _______,KC_ENT , RAISE, KC_HOME, KC_PGDN, KC_PGUP, KC_END \ ), /* Raise @@ -73,17 +73,17 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------+------+--------------------+------+------+------+------+------+------+------| * | Tab | 1 | 2 | 3 | 4 | 5 | Del | | Bksp | H | J | K | L | : | " | * |------+------+------+------+------+------+---------------------------+------+------+------+------+------+------+------| - * | Shift| 6 | 7 | 8 | 9 | 0 | JPN | | Enter| N | M | < | > | ? | Shift| + * | Shift| 6 | 7 | 8 | 9 | 0 | Space| | Enter| N | M | < | > | ? | Shift| * |-------------+------+------+------+------+------+------+------+------+------+------+------+------+------+-------------| - * | Ctrl | GUI | ALt |Adjust|||||||| Lower| Space| |||||||| | Enter| Raise|||||||| Home |PageDn|PageUp| End | + * | Ctrl | GUI | ALt | EISU |||||||| Lower| Space| |||||||| | Enter| Raise|||||||| Home |PageDn|PageUp| End | * ,----------------------------------------------------------------------------------------------------------------------. */ [_RAISE] = LAYOUT( KC_F11, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_LCBR, KC_RCBR, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F12, \ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_UNDS, KC_PLUS, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_PIPE, \ KC_TAB, KC_1, KC_2, KC_3, KC_4, KC_5, KC_DEL , KC_BSPC, KC_H, KC_J, KC_K, KC_L, KC_COLN, KC_DQT , \ - KC_LSFT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_JPN , KC_ENT , KC_N, KC_M, KC_LT, KC_GT, KC_QUES, KC_RSFT, \ - KC_LCTL, KC_LGUI, KC_LALT, ADJUST, LOWER, KC_SPC ,_______, _______,KC_ENT , RAISE, KC_HOME, KC_PGDN, KC_PGUP, KC_END \ + KC_LSFT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_SPC , KC_ENT , KC_N, KC_M, KC_LT, KC_GT, KC_QUES, KC_RSFT, \ + KC_LCTL, KC_LGUI, KC_LALT, EISU, LOWER, KC_SPC ,_______, _______,KC_ENT , RAISE, KC_HOME, KC_PGDN, KC_PGUP, KC_END \ ), /* Adjust diff --git a/keyboards/ergodash/rev2/rules.mk b/keyboards/ergodash/rev2/rules.mk index bd518d8f2..b6c9a2580 100644 --- a/keyboards/ergodash/rev2/rules.mk +++ b/keyboards/ergodash/rev2/rules.mk @@ -1 +1,2 @@ -BACKLIGHT_ENABLE = yes +BACKLIGHT_ENABLE = no +RGBLIGHT_ENABLE = no diff --git a/keyboards/ergodash/rules.mk b/keyboards/ergodash/rules.mk index fc06d60e2..bf0df4040 100644 --- a/keyboards/ergodash/rules.mk +++ b/keyboards/ergodash/rules.mk @@ -64,7 +64,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. SUBPROJECT_rev1 = yes USE_I2C = yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE From 743449472e58651ec8111e6f70811103fb0a28bd Mon Sep 17 00:00:00 2001 From: Joe Wasson Date: Mon, 17 Sep 2018 10:48:02 -0700 Subject: [PATCH 099/788] Make `PREVENT_STUCK_MODIFIERS` the default (#3107) * Remove chording as it is not documented, not used, and needs work. * Make Leader Key an optional feature. * Switch from `PREVENT_STUCK_MODIFIERS` to `STRICT_LAYER_RELEASE` * Remove `#define PREVENT_STUCK_MODIFIERS` from keymaps. --- common_features.mk | 11 ++- docs/config_options.md | 4 +- docs/feature_leader_key.md | 8 ++ docs/understanding_qmk.md | 2 +- keyboards/1upkeyboards/1up60rgb/config.h | 3 - keyboards/1upkeyboards/sweet16/config.h | 7 +- keyboards/acr60/config.h | 3 - keyboards/alf/x2/config.h | 5 +- keyboards/alpha/config.h | 2 - keyboards/alu84/config.h | 3 - keyboards/at101_blackheart/config.h | 3 - keyboards/atreus/keymaps/jeremy/keymap.c | 2 - keyboards/atreus/keymaps/khitsule/config.h | 4 +- keyboards/atreus/keymaps/xk/config.h | 3 +- keyboards/atreus62/keymaps/mneme/config.h | 1 - keyboards/atreus62/keymaps/mneme/rules.mk | 1 + .../keymaps/andylikescandy6x18/config.h | 3 - keyboards/bigseries/1key/config.h | 3 - keyboards/bigseries/2key/config.h | 3 - keyboards/bigseries/3key/config.h | 3 - keyboards/bigseries/4key/config.h | 3 - keyboards/bigswitch/config.h | 2 - keyboards/catch22/config.h | 3 - keyboards/chimera_ergo/config.h | 2 - keyboards/chimera_ls/config.h | 2 - keyboards/chimera_ortho/config.h | 2 - keyboards/chocopad/config.h | 6 +- keyboards/clueboard/60/config.h | 3 - .../clueboard/66/keymaps/bloodlvst/config.h | 1 - keyboards/comet46/config.h | 2 - keyboards/contra/config.h | 4 - keyboards/contra/keymaps/ryanm101/config.h | 5 +- keyboards/crawlpad/config.h | 3 - keyboards/crkbd/keymaps/default/config.h | 1 - keyboards/dichotemy/config.h | 2 - keyboards/dilly/config.h | 6 +- keyboards/dz60/config.h | 3 - keyboards/dz60/keymaps/LEdiodes/config.h | 3 - keyboards/ergodone/config.h | 2 - keyboards/ergodox_ez/config.h | 2 - .../keymaps/heartrobotninja/rules.mk | 3 +- keyboards/ergodox_ez/keymaps/vim/vim.h | 1 - .../ergodox_infinity/keymaps/gordon/config.h | 2 - .../ergodox_infinity/keymaps/narze/config.h | 1 - .../keymaps/not-quite-neo/rules.mk | 3 +- keyboards/ergoinu/config.h | 2 - keyboards/ergotravel/keymaps/ckofy/config.h | 3 - keyboards/felix/config.h | 4 +- keyboards/four_banger/config.h | 5 +- keyboards/fourier/keymaps/jennetters/config.h | 5 +- keyboards/fractal/config.h | 4 - .../frosty_flake/keymaps/nikchi/rules.mk | 3 +- keyboards/gh80_3000/config.h | 6 +- keyboards/gherkin/config.h | 6 +- .../gherkin/keymaps/talljoe_gherkin/config.h | 4 +- keyboards/gonnerd/keymaps/gam3cat/config.h | 1 - keyboards/hadron/keymaps/default/config.h | 1 - keyboards/hadron/keymaps/side_numpad/config.h | 1 - keyboards/handwired/MS_sculpt_mobile/config.h | 8 +- .../atreus50/keymaps/ajp10304/config.h | 2 - keyboards/handwired/dactyl/config.h | 2 - keyboards/handwired/kbod/config.h | 4 +- .../promethium/keymaps/default/config.h | 2 - .../promethium/keymaps/priyadi/config.h | 2 - keyboards/handwired/space_oddity/config.h | 4 - keyboards/helix/pico/config.h | 1 - .../helix/rev1/keymaps/OLED_sample/config.h | 3 +- keyboards/helix/rev2/config.h | 1 - keyboards/hhkb/keymaps/blakedietz/rules.mk | 1 + keyboards/infinity60/config.h | 2 - keyboards/iris/keymaps/davidrambo/config.h | 1 - keyboards/iris/keymaps/jennetters/config.h | 5 +- keyboards/iris/keymaps/krusli/config.h | 2 - keyboards/iris/keymaps/xyverz/config.h | 2 - keyboards/jc65/v32u4/keymaps/gam3cat/config.h | 1 - keyboards/jj40/keymaps/ajp10304/config.h | 8 -- keyboards/jj40/keymaps/fun40/config.h | 1 - keyboards/jj40/keymaps/krusli/config.h | 1 - keyboards/jj40/keymaps/oscillope/config.h | 1 - keyboards/jj40/keymaps/suzuken/config.h | 1 - keyboards/jj40/keymaps/waples/config.h | 1 - keyboards/jm60/config.h | 2 - keyboards/k_type/config.h | 2 - keyboards/katana60/config.h | 3 +- keyboards/kbd75/config.h | 3 - .../keymaps/insertsnideremarks/config.h | 1 - .../lets_split/keymaps/OLED_sample/config.h | 2 - keyboards/lets_split/keymaps/adam/config.h | 1 - keyboards/lets_split/keymaps/khord/config.h | 3 - keyboards/lets_split/keymaps/piemod/config.h | 1 - keyboards/lets_split/keymaps/waples/config.h | 2 - keyboards/lets_split/keymaps/xk/config.h | 1 - keyboards/m10a/keymaps/gam3cat/config.h | 2 - keyboards/mechmini/v2/config.h | 3 - keyboards/melody96/config.h | 3 - keyboards/minidox/keymaps/alairock/config.h | 1 - keyboards/minidox/keymaps/khitsule/config.h | 4 +- keyboards/mint60/config.h | 1 - keyboards/mitosis/config.h | 2 - keyboards/niu_mini/config.h | 3 - keyboards/novelpad/config.h | 3 - keyboards/noxary/268/config.h | 5 +- keyboards/ok60/config.h | 3 - keyboards/omnikey_blackheart/config.h | 6 +- keyboards/paladin64/config.h | 2 - .../pegasushoof/keymaps/citadel/config.h | 3 - keyboards/planck/keymaps/ajp10304/config.h | 8 -- keyboards/planck/keymaps/altgr/config.h | 3 - keyboards/planck/keymaps/am/config.h | 3 - .../planck/keymaps/andylikescandy/config.h | 3 - keyboards/planck/keymaps/bone2planck/config.h | 8 -- keyboards/planck/keymaps/davidrambo/config.h | 5 +- keyboards/planck/keymaps/dshields/config.h | 1 - keyboards/planck/keymaps/espynn/keymap.c | 1 - .../planck/keymaps/experimental/config.h | 2 - .../planck/keymaps/experimental/rules.mk | 3 +- keyboards/planck/keymaps/hiea/config.h | 3 - keyboards/planck/keymaps/hieax/config.h | 3 - keyboards/planck/keymaps/ishtob/config.h | 2 - keyboards/planck/keymaps/jarred/config.h | 4 +- keyboards/planck/keymaps/jeremy-dev/keymap.c | 1 - keyboards/planck/keymaps/kmontag42/rules.mk | 1 + keyboards/planck/keymaps/lae3/config.h | 8 -- keyboards/planck/keymaps/mitch/config.h | 3 +- keyboards/planck/keymaps/mitch/readme.md | 4 - keyboards/planck/keymaps/narze/config.h | 3 +- keyboards/planck/keymaps/neo2planck/config.h | 8 -- keyboards/planck/keymaps/priyadi/config.h | 2 - keyboards/planck/keymaps/sdothum/config.h | 3 - keyboards/planck/keymaps/steno/config.h | 4 +- keyboards/planck/keymaps/tehwalris/config.h | 4 +- keyboards/planck/keymaps/vifon/config.h | 3 - keyboards/planck/keymaps/yale/config.h | 11 --- keyboards/planck/keymaps/zach/config.h | 1 - keyboards/planck/rev6/config.h | 3 - keyboards/playkbtw/ca66/config.h | 2 - keyboards/playkbtw/pk60/config.h | 5 +- keyboards/preonic/keymaps/bucktooth/config.h | 1 - keyboards/preonic/keymaps/jacwib/config.h | 1 - keyboards/preonic/keymaps/kuatsure/rules.mk | 1 + .../preonic/keymaps/that_canadian/config.h | 8 -- keyboards/preonic/keymaps/zach/config.h | 1 - keyboards/preonic/rev3/config.h | 3 - keyboards/prime_r/config.h | 4 - .../keymaps/insertsnideremarks/config.h | 1 - keyboards/s60_x/keymaps/bluebear/config.h | 3 - keyboards/s60_x/rgb/config.h | 5 +- keyboards/s65_plus/config.h | 3 - keyboards/s65_x/config.h | 4 - keyboards/sx60/config.h | 4 - keyboards/telophase/config.h | 2 - keyboards/tetris/config.h | 5 +- .../bananasplit/keymaps/talljoe/config.h | 1 - keyboards/tokyo60/config.h | 3 - keyboards/tomato/config.h | 3 - keyboards/uk78/config.h | 3 - keyboards/viterbi/keymaps/drashna/config.h | 2 +- keyboards/whitefox/config.h | 2 - keyboards/xd60/keymaps/kmontag42/rules.mk | 1 + keyboards/xd75/keymaps/davidrambo/config.h | 3 +- keyboards/xd75/keymaps/tdl-jturner/config.h | 1 - keyboards/xmmx/config.h | 6 +- keyboards/ymd96/keymaps/hgoel89/config.h | 1 - keyboards/z150_blackheart/config.h | 6 +- keyboards/zeal60/keymaps/tusing/config.h | 4 - keyboards/zlant/config.h | 3 - .../community/60_ansi/talljoe-ansi/config.h | 1 - .../60_ansi_split_bs_rshift/talljoe/config.h | 1 - .../community/60_hhkb/talljoe-hhkb/config.h | 1 - layouts/community/ergodox/adam/config.h | 1 - layouts/community/ergodox/albert/rules.mk | 3 +- layouts/community/ergodox/algernon/rules.mk | 1 + layouts/community/ergodox/alphadox/config.h | 1 - layouts/community/ergodox/deadcyclo/rules.mk | 1 + .../ergodox/erez_experimental/rules.mk | 3 +- layouts/community/ergodox/familiar/rules.mk | 1 + .../community/ergodox/mclennon_osx/README.md | 4 +- layouts/community/ergodox/techtomas/readme.md | 2 +- .../community/ortho_4x12/symbolic/config.h | 4 - .../community/tkl_ansi/talljoe-tkl/config.h | 1 - quantum/process_keycode/process_chording.c | 76 ------------------- quantum/process_keycode/process_chording.h | 32 -------- quantum/process_keycode/process_leader.c | 2 +- quantum/quantum.c | 7 +- quantum/quantum.h | 7 +- quantum/quantum_keycodes.h | 6 +- tmk_core/common/action.c | 2 +- tmk_core/common/action.h | 2 +- tmk_core/common/action_layer.c | 4 +- tmk_core/common/action_layer.h | 2 +- users/333fred/333fred_config.h | 1 - users/bocaj/config.h | 1 - users/drashna/config.h | 5 -- users/ishtob/config.h | 3 +- users/replicaJunction/config.h | 6 -- users/talljoe/config.h | 1 - users/wanleg/config.h | 2 - users/zer09/config.h | 2 +- 198 files changed, 91 insertions(+), 599 deletions(-) delete mode 100644 keyboards/jj40/keymaps/ajp10304/config.h delete mode 100644 keyboards/m10a/keymaps/gam3cat/config.h delete mode 100644 keyboards/planck/keymaps/ajp10304/config.h delete mode 100644 keyboards/planck/keymaps/bone2planck/config.h delete mode 100644 keyboards/planck/keymaps/lae3/config.h delete mode 100644 keyboards/planck/keymaps/neo2planck/config.h delete mode 100644 keyboards/planck/keymaps/yale/config.h delete mode 100644 keyboards/preonic/keymaps/that_canadian/config.h create mode 100644 keyboards/xd60/keymaps/kmontag42/rules.mk delete mode 100644 quantum/process_keycode/process_chording.c delete mode 100644 quantum/process_keycode/process_chording.h diff --git a/common_features.mk b/common_features.mk index c637582d4..7af778980 100644 --- a/common_features.mk +++ b/common_features.mk @@ -221,7 +221,6 @@ ifeq ($(strip $(USB_HID_ENABLE)), yes) include $(TMK_DIR)/protocol/usb_hid.mk endif - ifeq ($(strip $(HD44780_ENABLE)), yes) SRC += drivers/avr/hd44780.c OPT_DEFS += -DHD44780_ENABLE @@ -232,11 +231,15 @@ ifeq ($(strip $(DYNAMIC_KEYMAP_ENABLE)), yes) SRC += $(QUANTUM_DIR)/dynamic_keymap.c endif +ifeq ($(strip $(LEADER_ENABLE)), yes) + SRC += $(QUANTUM_DIR)/process_keycode/process_leader.c + OPT_DEFS += -DLEADER_ENABLE +endif + QUANTUM_SRC:= \ $(QUANTUM_DIR)/quantum.c \ $(QUANTUM_DIR)/keymap_common.c \ - $(QUANTUM_DIR)/keycode_config.c \ - $(QUANTUM_DIR)/process_keycode/process_leader.c + $(QUANTUM_DIR)/keycode_config.c ifndef CUSTOM_MATRIX ifeq ($(strip $(SPLIT_KEYBOARD)), yes) @@ -251,5 +254,5 @@ ifeq ($(strip $(SPLIT_KEYBOARD)), yes) QUANTUM_SRC += $(QUANTUM_DIR)/split_common/split_flags.c \ $(QUANTUM_DIR)/split_common/split_util.c \ $(QUANTUM_DIR)/split_common/i2c.c \ - $(QUANTUM_DIR)/split_common/serial.c + $(QUANTUM_DIR)/split_common/serial.c endif diff --git a/docs/config_options.md b/docs/config_options.md index eaaa59872..072857727 100644 --- a/docs/config_options.md +++ b/docs/config_options.md @@ -119,8 +119,8 @@ If you define these options you will enable the associated feature, which may in * `#define FORCE_NKRO` * NKRO by default requires to be turned on, this forces it on during keyboard startup regardless of EEPROM setting. NKRO can still be turned off but will be turned on again if the keyboard reboots. -* `#define PREVENT_STUCK_MODIFIERS` - * stores the layer a key press came from so the same layer is used when the key is released, regardless of which layers are enabled +* `#define STRICT_LAYER_RELEASE` + * force a key release to be evaluated using the current layer stack instead of remembering which layer it came from (used for advanced cases) ## Behaviors That Can Be Configured diff --git a/docs/feature_leader_key.md b/docs/feature_leader_key.md index 46633b287..0c3f4a133 100644 --- a/docs/feature_leader_key.md +++ b/docs/feature_leader_key.md @@ -39,3 +39,11 @@ void matrix_scan_user(void) { As you can see, you have a few function. You can use `SEQ_ONE_KEY` for single-key sequences (Leader followed by just one key), and `SEQ_TWO_KEYS`, `SEQ_THREE_KEYS` up to `SEQ_FIVE_KEYS` for longer sequences. Each of these accepts one or more keycodes as arguments. This is an important point: You can use keycodes from **any layer on your keyboard**. That layer would need to be active for the leader macro to fire, obviously. + +## Adding Leader Key Support in the `rules.mk` + +To add support for Leader Key you simply need to add a single line to your keymap's `rules.mk`: + +``` +LEADER_ENABLE = yes +``` diff --git a/docs/understanding_qmk.md b/docs/understanding_qmk.md index bf695d008..35596cc69 100644 --- a/docs/understanding_qmk.md +++ b/docs/understanding_qmk.md @@ -129,6 +129,7 @@ Comparing against our keymap we can see that the pressed key is KC_NLCK. From he ##### Process Record + The `process_record()` function itself is deceptively simple, but hidden within is a gateway to overriding functionality at various levels of QMK. The chain of events is listed below, using cluecard whenever we need to look at the keyboard/keymap level functions. Depending on options set in rule.mk or elsewhere, only a subset of the functions below will be included in final firmware. * [`void process_record(keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/08c682c193f43e5d54df990680ae93fc2e06150a/tmk_core/common/action.c#L172) @@ -146,7 +147,6 @@ The `process_record()` function itself is deceptively simple, but hidden within * [`bool process_music(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_music.c#L114) * [`bool process_tap_dance(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_tap_dance.c#L136) * [`bool process_leader(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_leader.c#L38) - * [`bool process_chording(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_chording.c#L41) * [`bool process_combo(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_combo.c#L115) * [`bool process_unicode(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_unicode.c#L22) * [`bool process_ucis(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_ucis.c#L91) diff --git a/keyboards/1upkeyboards/1up60rgb/config.h b/keyboards/1upkeyboards/1up60rgb/config.h index bfdf354af..ee49211b4 100644 --- a/keyboards/1upkeyboards/1up60rgb/config.h +++ b/keyboards/1upkeyboards/1up60rgb/config.h @@ -43,9 +43,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #define RGB_DI_PIN E2 #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS diff --git a/keyboards/1upkeyboards/sweet16/config.h b/keyboards/1upkeyboards/sweet16/config.h index 77d9e276d..20d99651d 100644 --- a/keyboards/1upkeyboards/sweet16/config.h +++ b/keyboards/1upkeyboards/sweet16/config.h @@ -9,7 +9,7 @@ #define DEVICE_VER 0x0001 #define MANUFACTURER 1up Keyboards #define PRODUCT Sweet16 -#define DESCRIPTION 4x4 grid +#define DESCRIPTION 4x4 grid /* key matrix size */ #define MATRIX_ROWS 4 @@ -43,9 +43,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #define RGB_DI_PIN B1 #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS @@ -55,4 +52,4 @@ #define RGBLIGHT_VAL_STEP 8 #endif -#endif \ No newline at end of file +#endif diff --git a/keyboards/acr60/config.h b/keyboards/acr60/config.h index c44ba737e..3066f349d 100644 --- a/keyboards/acr60/config.h +++ b/keyboards/acr60/config.h @@ -41,9 +41,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #define RGB_DI_PIN E2 #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 20 diff --git a/keyboards/alf/x2/config.h b/keyboards/alf/x2/config.h index 31212ce33..f2106fa88 100644 --- a/keyboards/alf/x2/config.h +++ b/keyboards/alf/x2/config.h @@ -43,9 +43,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #define RGB_DI_PIN E2 #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS @@ -55,4 +52,4 @@ #define RGBLIGHT_VAL_STEP 8 #endif -#endif \ No newline at end of file +#endif diff --git a/keyboards/alpha/config.h b/keyboards/alpha/config.h index 029527563..1e16f5ca3 100755 --- a/keyboards/alpha/config.h +++ b/keyboards/alpha/config.h @@ -43,8 +43,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS #define RGB_DI_PIN F4 #ifdef RGB_DI_PIN diff --git a/keyboards/alu84/config.h b/keyboards/alu84/config.h index 9e013dbcc..9d2dca409 100755 --- a/keyboards/alu84/config.h +++ b/keyboards/alu84/config.h @@ -59,9 +59,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #define RGB_DI_PIN E2 #ifdef RGB_DI_PIN #define RGBLED_NUM 16 diff --git a/keyboards/at101_blackheart/config.h b/keyboards/at101_blackheart/config.h index 6a809a02f..237cb095e 100644 --- a/keyboards/at101_blackheart/config.h +++ b/keyboards/at101_blackheart/config.h @@ -38,6 +38,3 @@ #define IS_COMMAND() ( \ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) - -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS \ No newline at end of file diff --git a/keyboards/atreus/keymaps/jeremy/keymap.c b/keyboards/atreus/keymaps/jeremy/keymap.c index 42bef9d80..890980f41 100644 --- a/keyboards/atreus/keymaps/jeremy/keymap.c +++ b/keyboards/atreus/keymaps/jeremy/keymap.c @@ -4,8 +4,6 @@ #include "action_layer.h" #include "keymap_colemak.h" -#define PREVENT_STUCK_MODIFIERS - // Each layer gets a name for readability, which is then used in the keymap matrix below. #define ALPH 0 #define NUMS 1 diff --git a/keyboards/atreus/keymaps/khitsule/config.h b/keyboards/atreus/keymaps/khitsule/config.h index 19714ec7d..c74909a9f 100644 --- a/keyboards/atreus/keymaps/khitsule/config.h +++ b/keyboards/atreus/keymaps/khitsule/config.h @@ -3,8 +3,6 @@ #include "../../config.h" -#define PREVENT_STUCK_MODIFIERS - #define IGNORE_MOD_TAP_INTERRUPT -#endif \ No newline at end of file +#endif diff --git a/keyboards/atreus/keymaps/xk/config.h b/keyboards/atreus/keymaps/xk/config.h index 2f8110167..a8b9c8805 100644 --- a/keyboards/atreus/keymaps/xk/config.h +++ b/keyboards/atreus/keymaps/xk/config.h @@ -30,8 +30,7 @@ the Free Software Foundation, either version 2 of the License, or #define MOUSEKEY_WHEEL_MAX_SPEED 8 #define MOUSEKEY_WHEEL_TIME_TO_MAX 40 -#define PREVENT_STUCK_MODIFIERS #define IGNORE_MOD_TAP_INTERRUPT #define PERMISSIVE_HOLD -#endif \ No newline at end of file +#endif diff --git a/keyboards/atreus62/keymaps/mneme/config.h b/keyboards/atreus62/keymaps/mneme/config.h index 73eb0fa33..a89bf5503 100644 --- a/keyboards/atreus62/keymaps/mneme/config.h +++ b/keyboards/atreus62/keymaps/mneme/config.h @@ -1,6 +1,5 @@ #define ONESHOT_TIMEOUT 3000 #define TAPPING_TERM 200 -#define PREVENT_STUCK_MODIFIERS #define FORCE_NKRO #define LEADER_TIMEOUT 1000 diff --git a/keyboards/atreus62/keymaps/mneme/rules.mk b/keyboards/atreus62/keymaps/mneme/rules.mk index 046aec273..160ce6edb 100644 --- a/keyboards/atreus62/keymaps/mneme/rules.mk +++ b/keyboards/atreus62/keymaps/mneme/rules.mk @@ -3,3 +3,4 @@ NKRO_ENABLE = true MOUSEKEY_ENABLE = no EXTRAKEY_ENABLE = yes CONSOLE_ENABLE = no +LEADER_ENABLE = yes diff --git a/keyboards/bfo9000/keymaps/andylikescandy6x18/config.h b/keyboards/bfo9000/keymaps/andylikescandy6x18/config.h index 9d124a98e..be57e385e 100644 --- a/keyboards/bfo9000/keymaps/andylikescandy6x18/config.h +++ b/keyboards/bfo9000/keymaps/andylikescandy6x18/config.h @@ -37,7 +37,4 @@ along with this program. If not, see . #define PERMISSIVE_HOLD - #define PREVENT_STUCK_MODIFIERS - - #endif diff --git a/keyboards/bigseries/1key/config.h b/keyboards/bigseries/1key/config.h index 4e30276fc..966f2062c 100755 --- a/keyboards/bigseries/1key/config.h +++ b/keyboards/bigseries/1key/config.h @@ -47,9 +47,6 @@ along with this program. If not, see . false \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #ifdef RGBLIGHT_ENABLE #define RGB_DI_PIN D3 #define RGBLIGHT_ANIMATIONS diff --git a/keyboards/bigseries/2key/config.h b/keyboards/bigseries/2key/config.h index 83c8e3141..79b9ed378 100755 --- a/keyboards/bigseries/2key/config.h +++ b/keyboards/bigseries/2key/config.h @@ -47,9 +47,6 @@ along with this program. If not, see . false \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #ifdef RGBLIGHT_ENABLE #define RGB_DI_PIN D3 #define RGBLIGHT_ANIMATIONS diff --git a/keyboards/bigseries/3key/config.h b/keyboards/bigseries/3key/config.h index e10b14db4..9963a8219 100755 --- a/keyboards/bigseries/3key/config.h +++ b/keyboards/bigseries/3key/config.h @@ -47,9 +47,6 @@ along with this program. If not, see . false \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #ifdef RGBLIGHT_ENABLE #define RGB_DI_PIN D3 #define RGBLIGHT_ANIMATIONS diff --git a/keyboards/bigseries/4key/config.h b/keyboards/bigseries/4key/config.h index 3ebcfe091..a222512d3 100755 --- a/keyboards/bigseries/4key/config.h +++ b/keyboards/bigseries/4key/config.h @@ -47,9 +47,6 @@ along with this program. If not, see . false \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #ifdef RGBLIGHT_ENABLE #define RGB_DI_PIN D3 #define RGBLIGHT_ANIMATIONS diff --git a/keyboards/bigswitch/config.h b/keyboards/bigswitch/config.h index cc290fd79..a0ef6b555 100755 --- a/keyboards/bigswitch/config.h +++ b/keyboards/bigswitch/config.h @@ -47,8 +47,6 @@ along with this program. If not, see . false \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS #ifdef RGBLIGHT_ENABLE #define RGB_DI_PIN D3 diff --git a/keyboards/catch22/config.h b/keyboards/catch22/config.h index cb7ca7d84..f151e7048 100644 --- a/keyboards/catch22/config.h +++ b/keyboards/catch22/config.h @@ -46,9 +46,6 @@ along with this program. If not, see . false \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #ifdef RGBLIGHT_ENABLE #define RGB_DI_PIN F6 #define RGBLIGHT_ANIMATIONS diff --git a/keyboards/chimera_ergo/config.h b/keyboards/chimera_ergo/config.h index 86ee23718..8ce195cc0 100644 --- a/keyboards/chimera_ergo/config.h +++ b/keyboards/chimera_ergo/config.h @@ -52,8 +52,6 @@ along with this program. If not, see . * These options are also useful to firmware size reduction. */ -#define PREVENT_STUCK_MODIFIERS - /* disable debug print */ //#define NO_DEBUG diff --git a/keyboards/chimera_ls/config.h b/keyboards/chimera_ls/config.h index d92878026..254dad306 100644 --- a/keyboards/chimera_ls/config.h +++ b/keyboards/chimera_ls/config.h @@ -52,8 +52,6 @@ along with this program. If not, see . * These options are also useful to firmware size reduction. */ -#define PREVENT_STUCK_MODIFIERS - /* disable debug print */ //#define NO_DEBUG diff --git a/keyboards/chimera_ortho/config.h b/keyboards/chimera_ortho/config.h index 44c6212b1..4bf85eb88 100644 --- a/keyboards/chimera_ortho/config.h +++ b/keyboards/chimera_ortho/config.h @@ -52,8 +52,6 @@ along with this program. If not, see . * These options are also useful to firmware size reduction. */ -#define PREVENT_STUCK_MODIFIERS - /* disable debug print */ //#define NO_DEBUG diff --git a/keyboards/chocopad/config.h b/keyboards/chocopad/config.h index bf861ccda..2163ff8bc 100644 --- a/keyboards/chocopad/config.h +++ b/keyboards/chocopad/config.h @@ -40,10 +40,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - - #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS #define RGBLIGHT_HUE_STEP 8 @@ -56,4 +52,4 @@ #define ws2812_PORTREG PORTD #define ws2812_DDRREG DDRD -#endif \ No newline at end of file +#endif diff --git a/keyboards/clueboard/60/config.h b/keyboards/clueboard/60/config.h index 5c5a86296..a862d2cda 100644 --- a/keyboards/clueboard/60/config.h +++ b/keyboards/clueboard/60/config.h @@ -49,9 +49,6 @@ /* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ #define DEBOUNCE 6 -/* Prevent modifiers from being stuck on after layer changes. */ -#define PREVENT_STUCK_MODIFIERS - /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ //#define LOCKING_SUPPORT_ENABLE /* Locking resynchronize hack */ diff --git a/keyboards/clueboard/66/keymaps/bloodlvst/config.h b/keyboards/clueboard/66/keymaps/bloodlvst/config.h index 320401dbd..456936cf9 100644 --- a/keyboards/clueboard/66/keymaps/bloodlvst/config.h +++ b/keyboards/clueboard/66/keymaps/bloodlvst/config.h @@ -3,6 +3,5 @@ #include "../../config.h" -#define PREVENT_STUCK_MODIFIERS #define DISABLE_SPACE_CADET_ROLLOVER #endif diff --git a/keyboards/comet46/config.h b/keyboards/comet46/config.h index 90d923f90..2421f5341 100644 --- a/keyboards/comet46/config.h +++ b/keyboards/comet46/config.h @@ -52,8 +52,6 @@ along with this program. If not, see . * These options are also useful to firmware size reduction. */ -#define PREVENT_STUCK_MODIFIERS - /* disable debug print */ //#define NO_DEBUG diff --git a/keyboards/contra/config.h b/keyboards/contra/config.h index 85077ed46..c6bb374da 100755 --- a/keyboards/contra/config.h +++ b/keyboards/contra/config.h @@ -43,10 +43,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - - #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 0 diff --git a/keyboards/contra/keymaps/ryanm101/config.h b/keyboards/contra/keymaps/ryanm101/config.h index 9a458b892..224a4a37d 100644 --- a/keyboards/contra/keymaps/ryanm101/config.h +++ b/keyboards/contra/keymaps/ryanm101/config.h @@ -3,7 +3,6 @@ #include "config_common.h" -#define PREVENT_STUCK_MODIFIERS #define TAPPING_TERM 200 #ifdef AUDIO_ENABLE @@ -28,7 +27,7 @@ /* enable basic MIDI features: - MIDI notes can be sent when in Music mode is on */ - + #define MIDI_BASIC /* enable advanced MIDI features: @@ -42,4 +41,4 @@ /* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ //#define MIDI_TONE_KEYCODE_OCTAVES 2 -#endif \ No newline at end of file +#endif diff --git a/keyboards/crawlpad/config.h b/keyboards/crawlpad/config.h index a07c79cd2..c72be83f2 100755 --- a/keyboards/crawlpad/config.h +++ b/keyboards/crawlpad/config.h @@ -40,9 +40,6 @@ false \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #ifdef RGBLIGHT_ENABLE #define RGB_DI_PIN D3 #define RGBLIGHT_ANIMATIONS diff --git a/keyboards/crkbd/keymaps/default/config.h b/keyboards/crkbd/keymaps/default/config.h index 8d25f7cbc..c573530f7 100644 --- a/keyboards/crkbd/keymaps/default/config.h +++ b/keyboards/crkbd/keymaps/default/config.h @@ -36,7 +36,6 @@ along with this program. If not, see . #define USE_SERIAL_PD2 -#define PREVENT_STUCK_MODIFIERS #define TAPPING_FORCE_HOLD #define TAPPING_TERM 100 diff --git a/keyboards/dichotemy/config.h b/keyboards/dichotemy/config.h index b3bd6d942..1d92cf74e 100644 --- a/keyboards/dichotemy/config.h +++ b/keyboards/dichotemy/config.h @@ -52,8 +52,6 @@ along with this program. If not, see . * These options are also useful to firmware size reduction. */ -#define PREVENT_STUCK_MODIFIERS - /* disable debug print */ //#define NO_DEBUG diff --git a/keyboards/dilly/config.h b/keyboards/dilly/config.h index 97a6e533b..d9ca4597c 100644 --- a/keyboards/dilly/config.h +++ b/keyboards/dilly/config.h @@ -43,10 +43,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - - #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS #define RGBLIGHT_HUE_STEP 8 @@ -59,4 +55,4 @@ #define ws2812_PORTREG PORTD #define ws2812_DDRREG DDRD -#endif \ No newline at end of file +#endif diff --git a/keyboards/dz60/config.h b/keyboards/dz60/config.h index 8e1a5ae5f..e58eae085 100644 --- a/keyboards/dz60/config.h +++ b/keyboards/dz60/config.h @@ -41,9 +41,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #define RGB_DI_PIN E2 #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 16 diff --git a/keyboards/dz60/keymaps/LEdiodes/config.h b/keyboards/dz60/keymaps/LEdiodes/config.h index bb78d9bb6..4f991b9ca 100644 --- a/keyboards/dz60/keymaps/LEdiodes/config.h +++ b/keyboards/dz60/keymaps/LEdiodes/config.h @@ -41,9 +41,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #define RGB_DI_PIN E2 #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 16 diff --git a/keyboards/ergodone/config.h b/keyboards/ergodone/config.h index 1feff26aa..2c764d782 100644 --- a/keyboards/ergodone/config.h +++ b/keyboards/ergodone/config.h @@ -53,8 +53,6 @@ /* Set 0 if debouncing isn't needed */ #define DEBOUNCE 5 -#define PREVENT_STUCK_MODIFIERS - #define USB_MAX_POWER_CONSUMPTION 500 /* NKRO */ diff --git a/keyboards/ergodox_ez/config.h b/keyboards/ergodox_ez/config.h index 07a9b5497..7a350183b 100644 --- a/keyboards/ergodox_ez/config.h +++ b/keyboards/ergodox_ez/config.h @@ -97,8 +97,6 @@ along with this program. If not, see . */ #define DEBOUNCE 15 -#define PREVENT_STUCK_MODIFIERS - #define USB_MAX_POWER_CONSUMPTION 500 // RGB backlight diff --git a/keyboards/ergodox_ez/keymaps/heartrobotninja/rules.mk b/keyboards/ergodox_ez/keymaps/heartrobotninja/rules.mk index 38112a906..db5e5d155 100644 --- a/keyboards/ergodox_ez/keymaps/heartrobotninja/rules.mk +++ b/keyboards/ergodox_ez/keymaps/heartrobotninja/rules.mk @@ -13,6 +13,7 @@ AUTOLOG_ENABLE = no RGBLIGHT_ENABLE = yes RGBLIGHT_ANIMATION = yes EXTRAKEY_ENABLE = yes +LEADER_ENABLE = yes OPT_DEFS += -DUSER_PRINT @@ -31,4 +32,4 @@ OPT_DEFS += -DKEYMAP_VERSION=\"$(KEYMAP_VERSION)\\\#$(KEYMAP_BRANCH)\" ifndef QUANTUM_DIR include ../../../../Makefile -endif \ No newline at end of file +endif diff --git a/keyboards/ergodox_ez/keymaps/vim/vim.h b/keyboards/ergodox_ez/keymaps/vim/vim.h index e9b682fd3..7565c6e3e 100644 --- a/keyboards/ergodox_ez/keymaps/vim/vim.h +++ b/keyboards/ergodox_ez/keymaps/vim/vim.h @@ -9,7 +9,6 @@ #define PRESS(keycode) register_code16(keycode) #define RELEASE(keycode) unregister_code16(keycode) -#define PREVENT_STUCK_MODIFIERS uint16_t VIM_QUEUE = KC_NO; diff --git a/keyboards/ergodox_infinity/keymaps/gordon/config.h b/keyboards/ergodox_infinity/keymaps/gordon/config.h index 88d495b12..772ce0bac 100644 --- a/keyboards/ergodox_infinity/keymaps/gordon/config.h +++ b/keyboards/ergodox_infinity/keymaps/gordon/config.h @@ -15,8 +15,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#define PREVENT_STUCK_MODIFIERS - #undef IGNORE_MOD_TAP_INTERRUPT #define IGNORE_MOD_TAP_INTERRUPT diff --git a/keyboards/ergodox_infinity/keymaps/narze/config.h b/keyboards/ergodox_infinity/keymaps/narze/config.h index 8174edd35..551327a12 100644 --- a/keyboards/ergodox_infinity/keymaps/narze/config.h +++ b/keyboards/ergodox_infinity/keymaps/narze/config.h @@ -13,7 +13,6 @@ #define IGNORE_MOD_TAP_INTERRUPT #define PERMISSIVE_HOLD -#define PREVENT_STUCK_MODIFIERS #undef MOUSEKEY_DELAY #define MOUSEKEY_DELAY 100 diff --git a/keyboards/ergodox_infinity/keymaps/not-quite-neo/rules.mk b/keyboards/ergodox_infinity/keymaps/not-quite-neo/rules.mk index 75624bb8c..74505bd69 100644 --- a/keyboards/ergodox_infinity/keymaps/not-quite-neo/rules.mk +++ b/keyboards/ergodox_infinity/keymaps/not-quite-neo/rules.mk @@ -1,2 +1,3 @@ BACKLIGHT_ENABLE = yes -UNICODE_ENABLE = yes \ No newline at end of file +UNICODE_ENABLE = yes +LEADER_ENABLE = yes diff --git a/keyboards/ergoinu/config.h b/keyboards/ergoinu/config.h index 4b7c58400..de72635b1 100644 --- a/keyboards/ergoinu/config.h +++ b/keyboards/ergoinu/config.h @@ -31,8 +31,6 @@ along with this program. If not, see . #define PRODUCT ergoinu #define DESCRIPTION An (Not Portable But Small) Ergonomic split keyboard - -#define PREVENT_STUCK_MODIFIERS #define TAPPING_FORCE_HOLD #define TAPPING_TERM 100 diff --git a/keyboards/ergotravel/keymaps/ckofy/config.h b/keyboards/ergotravel/keymaps/ckofy/config.h index caae080d7..41ec06657 100644 --- a/keyboards/ergotravel/keymaps/ckofy/config.h +++ b/keyboards/ergotravel/keymaps/ckofy/config.h @@ -33,9 +33,6 @@ along with this program. If not, see . #define TAPPING_TOGGLE 2 -// required if modifiers are defined in layers besided the default one. -#define PREVENT_STUCK_MODIFIERS - #undef RGBLED_NUM #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 12 diff --git a/keyboards/felix/config.h b/keyboards/felix/config.h index f70089af4..003fe87dc 100644 --- a/keyboards/felix/config.h +++ b/keyboards/felix/config.h @@ -42,8 +42,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS /* there is no rgb underglow by default. */ #define RGB_DI_PIN @@ -53,4 +51,4 @@ #define RGBLIGHT_SAT_STEP 8 #define RGBLIGHT_VAL_STEP 8 -#endif \ No newline at end of file +#endif diff --git a/keyboards/four_banger/config.h b/keyboards/four_banger/config.h index 96011cbdf..8dceff5db 100644 --- a/keyboards/four_banger/config.h +++ b/keyboards/four_banger/config.h @@ -43,9 +43,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #define RGB_DI_PIN E6 #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS @@ -55,4 +52,4 @@ #define RGBLIGHT_VAL_STEP 8 #endif -#endif \ No newline at end of file +#endif diff --git a/keyboards/fourier/keymaps/jennetters/config.h b/keyboards/fourier/keymaps/jennetters/config.h index 87cda7b5c..5f99c65ad 100644 --- a/keyboards/fourier/keymaps/jennetters/config.h +++ b/keyboards/fourier/keymaps/jennetters/config.h @@ -22,10 +22,7 @@ along with this program. If not, see . #define TAPPING_TERM 100 -/* Try to prevent sticky keys */ -#define PREVENT_STUCK_MODIFIERS - /* Use I2C or Serial, not both */ #define USE_SERIAL -// #define USE_I2C \ No newline at end of file +// #define USE_I2C diff --git a/keyboards/fractal/config.h b/keyboards/fractal/config.h index 30b703b6e..1a5901f98 100755 --- a/keyboards/fractal/config.h +++ b/keyboards/fractal/config.h @@ -43,10 +43,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - - #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 0 diff --git a/keyboards/frosty_flake/keymaps/nikchi/rules.mk b/keyboards/frosty_flake/keymaps/nikchi/rules.mk index ad86e82d2..b21eb6404 100644 --- a/keyboards/frosty_flake/keymaps/nikchi/rules.mk +++ b/keyboards/frosty_flake/keymaps/nikchi/rules.mk @@ -1,5 +1,5 @@ # Build Options -# change to "no" to disable the options, or define them in the Makefile in +# change to "no" to disable the options, or define them in the Makefile in # the appropriate keymap folder that will get included automatically # BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) @@ -17,6 +17,7 @@ BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = yes +LEADER_ENABLE = yes ifndef QUANTUM_DIR include ../../../../Makefile diff --git a/keyboards/gh80_3000/config.h b/keyboards/gh80_3000/config.h index 83d30129a..ca72aba5a 100644 --- a/keyboards/gh80_3000/config.h +++ b/keyboards/gh80_3000/config.h @@ -43,10 +43,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - - #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 0 @@ -55,4 +51,4 @@ #define RGBLIGHT_VAL_STEP 8 #endif -#endif \ No newline at end of file +#endif diff --git a/keyboards/gherkin/config.h b/keyboards/gherkin/config.h index 4607962d7..34f38e35c 100644 --- a/keyboards/gherkin/config.h +++ b/keyboards/gherkin/config.h @@ -43,10 +43,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - - #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 0 @@ -55,4 +51,4 @@ #define RGBLIGHT_VAL_STEP 8 #endif -#endif \ No newline at end of file +#endif diff --git a/keyboards/gherkin/keymaps/talljoe_gherkin/config.h b/keyboards/gherkin/keymaps/talljoe_gherkin/config.h index 3e9e692d3..7fa3bf328 100644 --- a/keyboards/gherkin/keymaps/talljoe_gherkin/config.h +++ b/keyboards/gherkin/keymaps/talljoe_gherkin/config.h @@ -3,6 +3,4 @@ #include "../../config.h" -#define PREVENT_STUCK_MODIFIERS - -#endif \ No newline at end of file +#endif diff --git a/keyboards/gonnerd/keymaps/gam3cat/config.h b/keyboards/gonnerd/keymaps/gam3cat/config.h index a3819d3a5..d86da86e4 100644 --- a/keyboards/gonnerd/keymaps/gam3cat/config.h +++ b/keyboards/gonnerd/keymaps/gam3cat/config.h @@ -1,7 +1,6 @@ #include "../../config.h" //GRAVE_ESC override for CTRL+SHIFT+ESC Windows task manager shortcut. #define GRAVE_ESC_CTRL_OVERRIDE -#define PREVENT_STUCK_MODIFIERS //Delay matrix scan for tap dance, reduce to activate modifier keys faster. //#define TAPPING_TERM 200 diff --git a/keyboards/hadron/keymaps/default/config.h b/keyboards/hadron/keymaps/default/config.h index 0f349ad93..09922b61b 100644 --- a/keyboards/hadron/keymaps/default/config.h +++ b/keyboards/hadron/keymaps/default/config.h @@ -5,7 +5,6 @@ #define LEADER_TIMEOUT 300 //#define BACKLIGHT_BREATHING -#define PREVENT_STUCK_MODIFIERS #define USE_I2C #define SSD1306OLED diff --git a/keyboards/hadron/keymaps/side_numpad/config.h b/keyboards/hadron/keymaps/side_numpad/config.h index 0f349ad93..09922b61b 100644 --- a/keyboards/hadron/keymaps/side_numpad/config.h +++ b/keyboards/hadron/keymaps/side_numpad/config.h @@ -5,7 +5,6 @@ #define LEADER_TIMEOUT 300 //#define BACKLIGHT_BREATHING -#define PREVENT_STUCK_MODIFIERS #define USE_I2C #define SSD1306OLED diff --git a/keyboards/handwired/MS_sculpt_mobile/config.h b/keyboards/handwired/MS_sculpt_mobile/config.h index f89514278..c3bdf333e 100644 --- a/keyboards/handwired/MS_sculpt_mobile/config.h +++ b/keyboards/handwired/MS_sculpt_mobile/config.h @@ -28,10 +28,10 @@ along with this program. If not, see . #define DESCRIPTION 6000 /* key matrix size */ -#define MATRIX_ROWS 8 -#define MATRIX_COLS 18 +#define MATRIX_ROWS 8 +#define MATRIX_COLS 18 -#ifdef ASTAR +#ifdef ASTAR #define PRODUCT sculpt mobile astar /*0 1 2 3 4 5 6 7 8 */ #define MATRIX_ROW_PINS {D7, C6, D4, D0, D1, D3, D2, E2} @@ -95,6 +95,4 @@ along with this program. If not, see . //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION -#define PREVENT_STUCK_MODIFIERS - #endif diff --git a/keyboards/handwired/atreus50/keymaps/ajp10304/config.h b/keyboards/handwired/atreus50/keymaps/ajp10304/config.h index 6916d1a7d..f5e6bbabe 100644 --- a/keyboards/handwired/atreus50/keymaps/ajp10304/config.h +++ b/keyboards/handwired/atreus50/keymaps/ajp10304/config.h @@ -3,8 +3,6 @@ #include "../../config.h" -#define PREVENT_STUCK_MODIFIERS - #undef MATRIX_ROW_PINS #undef MATRIX_COL_PINS diff --git a/keyboards/handwired/dactyl/config.h b/keyboards/handwired/dactyl/config.h index a990cc720..08931ecd3 100644 --- a/keyboards/handwired/dactyl/config.h +++ b/keyboards/handwired/dactyl/config.h @@ -63,8 +63,6 @@ along with this program. If not, see . /* Set 0 if debouncing isn't needed */ #define DEBOUNCE 15 -#define PREVENT_STUCK_MODIFIERS - #define USB_MAX_POWER_CONSUMPTION 500 #endif diff --git a/keyboards/handwired/kbod/config.h b/keyboards/handwired/kbod/config.h index f3d0c8bf2..a3f3e3908 100644 --- a/keyboards/handwired/kbod/config.h +++ b/keyboards/handwired/kbod/config.h @@ -48,7 +48,7 @@ along with this program. If not, see . /* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ #define DIODE_DIRECTION COL2ROW - + // #define BACKLIGHT_PIN B7 // #define BACKLIGHT_BREATHING // #define BACKLIGHT_LEVELS 3 @@ -159,8 +159,6 @@ along with this program. If not, see . //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION -#define PREVENT_STUCK_MODIFIERS - #undef TAPPING_TOGGLE #define TAPPING_TOGGLE 2 diff --git a/keyboards/handwired/promethium/keymaps/default/config.h b/keyboards/handwired/promethium/keymaps/default/config.h index fa86e2247..2064f3676 100644 --- a/keyboards/handwired/promethium/keymaps/default/config.h +++ b/keyboards/handwired/promethium/keymaps/default/config.h @@ -11,8 +11,6 @@ /* skip bootmagic and eeconfig */ #define BOOTMAGIC_KEY_SKIP KC_SPACE -#define PREVENT_STUCK_MODIFIERS - #define RGBSPS_ENABLE #define RGBSPS_DEMO_ENABLE diff --git a/keyboards/handwired/promethium/keymaps/priyadi/config.h b/keyboards/handwired/promethium/keymaps/priyadi/config.h index fa86e2247..2064f3676 100644 --- a/keyboards/handwired/promethium/keymaps/priyadi/config.h +++ b/keyboards/handwired/promethium/keymaps/priyadi/config.h @@ -11,8 +11,6 @@ /* skip bootmagic and eeconfig */ #define BOOTMAGIC_KEY_SKIP KC_SPACE -#define PREVENT_STUCK_MODIFIERS - #define RGBSPS_ENABLE #define RGBSPS_DEMO_ENABLE diff --git a/keyboards/handwired/space_oddity/config.h b/keyboards/handwired/space_oddity/config.h index 9c9361ced..46d854099 100644 --- a/keyboards/handwired/space_oddity/config.h +++ b/keyboards/handwired/space_oddity/config.h @@ -49,10 +49,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - - #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 0 diff --git a/keyboards/helix/pico/config.h b/keyboards/helix/pico/config.h index b49f0173b..41edfcbc2 100644 --- a/keyboards/helix/pico/config.h +++ b/keyboards/helix/pico/config.h @@ -28,7 +28,6 @@ along with this program. If not, see . #define DESCRIPTION A split keyboard for the cheap makers -#define PREVENT_STUCK_MODIFIERS #define TAPPING_FORCE_HOLD #define TAPPING_TERM 100 diff --git a/keyboards/helix/rev1/keymaps/OLED_sample/config.h b/keyboards/helix/rev1/keymaps/OLED_sample/config.h index 0e1b787a5..5e8989d96 100644 --- a/keyboards/helix/rev1/keymaps/OLED_sample/config.h +++ b/keyboards/helix/rev1/keymaps/OLED_sample/config.h @@ -35,7 +35,8 @@ along with this program. If not, see . #define SSD1306OLED -#define PREVENT_STUCK_MODIFIERS +#define USE_SERIAL_PD2 + #define TAPPING_FORCE_HOLD #define TAPPING_TERM 100 diff --git a/keyboards/helix/rev2/config.h b/keyboards/helix/rev2/config.h index 058236122..b354d312d 100644 --- a/keyboards/helix/rev2/config.h +++ b/keyboards/helix/rev2/config.h @@ -28,7 +28,6 @@ along with this program. If not, see . #define DESCRIPTION A split keyboard for the cheap makers -#define PREVENT_STUCK_MODIFIERS #define TAPPING_FORCE_HOLD #define TAPPING_TERM 100 diff --git a/keyboards/hhkb/keymaps/blakedietz/rules.mk b/keyboards/hhkb/keymaps/blakedietz/rules.mk index 7c16b2c98..7d97e7a52 100644 --- a/keyboards/hhkb/keymaps/blakedietz/rules.mk +++ b/keyboards/hhkb/keymaps/blakedietz/rules.mk @@ -1,2 +1,3 @@ TAP_DANCE_ENABLE = no UNICODE_ENABLE = no +LEADER_ENABLE = yes diff --git a/keyboards/infinity60/config.h b/keyboards/infinity60/config.h index 8306c8f7e..c1e9ec5b1 100644 --- a/keyboards/infinity60/config.h +++ b/keyboards/infinity60/config.h @@ -18,8 +18,6 @@ along with this program. If not, see . #ifndef CONFIG_H #define CONFIG_H -#define PREVENT_STUCK_MODIFIERS - /* USB Device descriptor parameter */ #define VENDOR_ID 0x1c11 #define PRODUCT_ID 0xb04d diff --git a/keyboards/iris/keymaps/davidrambo/config.h b/keyboards/iris/keymaps/davidrambo/config.h index 01e078e32..2cdff4213 100644 --- a/keyboards/iris/keymaps/davidrambo/config.h +++ b/keyboards/iris/keymaps/davidrambo/config.h @@ -27,7 +27,6 @@ along with this program. If not, see . /* Select hand configuration */ #define PERMISSIVE_HOLD -#define PREVENT_STUCK_MODIFIERS #define MASTER_LEFT // #define MASTER_RIGHT // #define EE_HANDS diff --git a/keyboards/iris/keymaps/jennetters/config.h b/keyboards/iris/keymaps/jennetters/config.h index a3c0634f5..42f91bd02 100644 --- a/keyboards/iris/keymaps/jennetters/config.h +++ b/keyboards/iris/keymaps/jennetters/config.h @@ -19,9 +19,6 @@ along with this program. If not, see . #define TAPPING_TERM 150 -/* Try to prevent sticky keys */ -#define PREVENT_STUCK_MODIFIERS - /* Use I2C or Serial, not both */ #define USE_SERIAL @@ -38,4 +35,4 @@ along with this program. If not, see . #define RGBLED_NUM 12 #define RGBLIGHT_HUE_STEP 8 #define RGBLIGHT_SAT_STEP 8 -#define RGBLIGHT_VAL_STEP 8 \ No newline at end of file +#define RGBLIGHT_VAL_STEP 8 diff --git a/keyboards/iris/keymaps/krusli/config.h b/keyboards/iris/keymaps/krusli/config.h index a53c746ad..72e35c472 100644 --- a/keyboards/iris/keymaps/krusli/config.h +++ b/keyboards/iris/keymaps/krusli/config.h @@ -20,8 +20,6 @@ along with this program. If not, see . #include "config_common.h" -// #define PREVENT_STUCK_MODIFIERS - /* Use I2C or Serial, not both */ #define USE_SERIAL diff --git a/keyboards/iris/keymaps/xyverz/config.h b/keyboards/iris/keymaps/xyverz/config.h index 0c61a8eac..b820a0753 100644 --- a/keyboards/iris/keymaps/xyverz/config.h +++ b/keyboards/iris/keymaps/xyverz/config.h @@ -23,8 +23,6 @@ along with this program. If not, see . #define USE_SERIAL #define EE_HANDS -#define PREVENT_STUCK_MODIFIERS - #undef PRODUCT #define PRODUCT Iris Keyboard diff --git a/keyboards/jc65/v32u4/keymaps/gam3cat/config.h b/keyboards/jc65/v32u4/keymaps/gam3cat/config.h index a3819d3a5..d86da86e4 100644 --- a/keyboards/jc65/v32u4/keymaps/gam3cat/config.h +++ b/keyboards/jc65/v32u4/keymaps/gam3cat/config.h @@ -1,7 +1,6 @@ #include "../../config.h" //GRAVE_ESC override for CTRL+SHIFT+ESC Windows task manager shortcut. #define GRAVE_ESC_CTRL_OVERRIDE -#define PREVENT_STUCK_MODIFIERS //Delay matrix scan for tap dance, reduce to activate modifier keys faster. //#define TAPPING_TERM 200 diff --git a/keyboards/jj40/keymaps/ajp10304/config.h b/keyboards/jj40/keymaps/ajp10304/config.h deleted file mode 100644 index 11cafbefc..000000000 --- a/keyboards/jj40/keymaps/ajp10304/config.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -#define PREVENT_STUCK_MODIFIERS - -#endif diff --git a/keyboards/jj40/keymaps/fun40/config.h b/keyboards/jj40/keymaps/fun40/config.h index 89807d84a..f2b5d264e 100644 --- a/keyboards/jj40/keymaps/fun40/config.h +++ b/keyboards/jj40/keymaps/fun40/config.h @@ -4,6 +4,5 @@ #include "../../config.h" #define FORCE_NKRO -#define PREVENT_STUCK_MODIFIERS #endif diff --git a/keyboards/jj40/keymaps/krusli/config.h b/keyboards/jj40/keymaps/krusli/config.h index 6d98a37a6..e710dbbb6 100644 --- a/keyboards/jj40/keymaps/krusli/config.h +++ b/keyboards/jj40/keymaps/krusli/config.h @@ -3,7 +3,6 @@ #include "../../config.h" -#define PREVENT_STUCK_MODIFIERS // #define TAPPING_TERM 300 #endif diff --git a/keyboards/jj40/keymaps/oscillope/config.h b/keyboards/jj40/keymaps/oscillope/config.h index d7f991fa9..e812903de 100644 --- a/keyboards/jj40/keymaps/oscillope/config.h +++ b/keyboards/jj40/keymaps/oscillope/config.h @@ -3,7 +3,6 @@ #include "../../config.h" -#define PREVENT_STUCK_MODIFIERS #define TAPPING_TERM 200 #endif diff --git a/keyboards/jj40/keymaps/suzuken/config.h b/keyboards/jj40/keymaps/suzuken/config.h index 52aaa8f24..b1d74e1e6 100644 --- a/keyboards/jj40/keymaps/suzuken/config.h +++ b/keyboards/jj40/keymaps/suzuken/config.h @@ -3,7 +3,6 @@ #include "../../config.h" -#define PREVENT_STUCK_MODIFIERS #define TAPPING_TERM 300 #endif diff --git a/keyboards/jj40/keymaps/waples/config.h b/keyboards/jj40/keymaps/waples/config.h index 52aaa8f24..b1d74e1e6 100644 --- a/keyboards/jj40/keymaps/waples/config.h +++ b/keyboards/jj40/keymaps/waples/config.h @@ -3,7 +3,6 @@ #include "../../config.h" -#define PREVENT_STUCK_MODIFIERS #define TAPPING_TERM 300 #endif diff --git a/keyboards/jm60/config.h b/keyboards/jm60/config.h index 847cf2078..cb5c90bb1 100644 --- a/keyboards/jm60/config.h +++ b/keyboards/jm60/config.h @@ -18,8 +18,6 @@ along with this program. If not, see . #ifndef CONFIG_H #define CONFIG_H -#define PREVENT_STUCK_MODIFIERS - /* USB Device descriptor parameter */ #define VENDOR_ID 0xFEED #define PRODUCT_ID 0x6464 diff --git a/keyboards/k_type/config.h b/keyboards/k_type/config.h index d19e0ff64..4937d9ad9 100644 --- a/keyboards/k_type/config.h +++ b/keyboards/k_type/config.h @@ -18,8 +18,6 @@ along with this program. If not, see . #ifndef CONFIG_H #define CONFIG_H -#define PREVENT_STUCK_MODIFIERS - /* USB Device descriptor parameter */ #define VENDOR_ID 0x1c11 #define PRODUCT_ID 0xb04d diff --git a/keyboards/katana60/config.h b/keyboards/katana60/config.h index 169cffb42..aaf2b5d54 100644 --- a/keyboards/katana60/config.h +++ b/keyboards/katana60/config.h @@ -48,7 +48,7 @@ along with this program. If not, see . /* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ #define DIODE_DIRECTION ROW2COL - + // #define BACKLIGHT_PIN B7 // #define BACKLIGHT_BREATHING // #define BACKLIGHT_LEVELS 3 @@ -111,7 +111,6 @@ along with this program. If not, see . ) #define TAPPING_TERM 200 -#define PREVENT_STUCK_MODIFIERS /* control how magic key switches layers */ //#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true diff --git a/keyboards/kbd75/config.h b/keyboards/kbd75/config.h index f76d9082f..726afcaf6 100644 --- a/keyboards/kbd75/config.h +++ b/keyboards/kbd75/config.h @@ -43,9 +43,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #define RGB_DI_PIN E2 #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS diff --git a/keyboards/kinesis/keymaps/insertsnideremarks/config.h b/keyboards/kinesis/keymaps/insertsnideremarks/config.h index 3548fa348..9ce094be5 100644 --- a/keyboards/kinesis/keymaps/insertsnideremarks/config.h +++ b/keyboards/kinesis/keymaps/insertsnideremarks/config.h @@ -5,7 +5,6 @@ #include "../../config.h" // place overrides here -#define PREVENT_STUCK_MODIFIERS #define IGNORE_MOD_TAP_INTERRUPT #define TAPPING_TERM 175 #define TAPPING_TOGGLE 2 diff --git a/keyboards/lets_split/keymaps/OLED_sample/config.h b/keyboards/lets_split/keymaps/OLED_sample/config.h index e8632fe61..6aa909d28 100644 --- a/keyboards/lets_split/keymaps/OLED_sample/config.h +++ b/keyboards/lets_split/keymaps/OLED_sample/config.h @@ -38,8 +38,6 @@ along with this program. If not, see . #define SSD1306OLED //#define OLED_ROTATE180 - -#define PREVENT_STUCK_MODIFIERS #define TAPPING_FORCE_HOLD #define TAPPING_TERM 100 diff --git a/keyboards/lets_split/keymaps/adam/config.h b/keyboards/lets_split/keymaps/adam/config.h index ff29eb1bd..59a2e5db7 100644 --- a/keyboards/lets_split/keymaps/adam/config.h +++ b/keyboards/lets_split/keymaps/adam/config.h @@ -43,7 +43,6 @@ along with this program. If not, see . #undef TAPPING_TERM #define TAPPING_TERM 200 //At 500 some bad logic takes hold -#define PREVENT_STUCK_MODIFIERS #define IGNORE_MOD_TAP_INTERRUPT #define PERMISSIVE_HOLD diff --git a/keyboards/lets_split/keymaps/khord/config.h b/keyboards/lets_split/keymaps/khord/config.h index 4ebdbad76..71ec20dbc 100644 --- a/keyboards/lets_split/keymaps/khord/config.h +++ b/keyboards/lets_split/keymaps/khord/config.h @@ -25,9 +25,6 @@ along with this program. If not, see . #define TAPPING_TERM 150 -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - /* Use I2C or Serial, not both */ #define USE_SERIAL diff --git a/keyboards/lets_split/keymaps/piemod/config.h b/keyboards/lets_split/keymaps/piemod/config.h index 001b62e41..1b3fd7544 100644 --- a/keyboards/lets_split/keymaps/piemod/config.h +++ b/keyboards/lets_split/keymaps/piemod/config.h @@ -43,7 +43,6 @@ along with this program. If not, see . #define RGBLIGHT_EFFECT_KNIGHT_LENGTH 1 // Typing Options -#define PREVENT_STUCK_MODIFIERS #define QMK_KEYS_PER_SCAN 4 #endif diff --git a/keyboards/lets_split/keymaps/waples/config.h b/keyboards/lets_split/keymaps/waples/config.h index 98ebeff45..5221fd011 100644 --- a/keyboards/lets_split/keymaps/waples/config.h +++ b/keyboards/lets_split/keymaps/waples/config.h @@ -12,6 +12,4 @@ // #define MASTER_RIGHT #define EE_HANDS // We like to have choices I guess -#define PREVENT_STUCK_MODIFIERS // When switching layers, this will release all mods - #endif diff --git a/keyboards/lets_split/keymaps/xk/config.h b/keyboards/lets_split/keymaps/xk/config.h index c75ed12cc..a5cd51857 100644 --- a/keyboards/lets_split/keymaps/xk/config.h +++ b/keyboards/lets_split/keymaps/xk/config.h @@ -37,7 +37,6 @@ the Free Software Foundation, either version 2 of the License, or #define EE_HANDS -#define PREVENT_STUCK_MODIFIERS #define IGNORE_MOD_TAP_INTERRUPT #define PERMISSIVE_HOLD diff --git a/keyboards/m10a/keymaps/gam3cat/config.h b/keyboards/m10a/keymaps/gam3cat/config.h deleted file mode 100644 index 73bc50bc2..000000000 --- a/keyboards/m10a/keymaps/gam3cat/config.h +++ /dev/null @@ -1,2 +0,0 @@ -#include "../../config.h" -#define PREVENT_STUCK_MODIFIERS diff --git a/keyboards/mechmini/v2/config.h b/keyboards/mechmini/v2/config.h index 58c751e0f..e0922bb7e 100755 --- a/keyboards/mechmini/v2/config.h +++ b/keyboards/mechmini/v2/config.h @@ -62,9 +62,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #define RGB_DI_PIN E2 #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS diff --git a/keyboards/melody96/config.h b/keyboards/melody96/config.h index 6083dcf75..67123a7e5 100644 --- a/keyboards/melody96/config.h +++ b/keyboards/melody96/config.h @@ -43,9 +43,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #define RGB_DI_PIN E2 #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS diff --git a/keyboards/minidox/keymaps/alairock/config.h b/keyboards/minidox/keymaps/alairock/config.h index 445606031..3649fdd12 100644 --- a/keyboards/minidox/keymaps/alairock/config.h +++ b/keyboards/minidox/keymaps/alairock/config.h @@ -36,5 +36,4 @@ along with this program. If not, see . #define RGBLIGHT_HUE_STEP 10 #define RGBLIGHT_SAT_STEP 17 #define RGBLIGHT_VAL_STEP 17 -#define PREVENT_STUCK_MODIFIERS #endif diff --git a/keyboards/minidox/keymaps/khitsule/config.h b/keyboards/minidox/keymaps/khitsule/config.h index 702354864..645e80ee8 100644 --- a/keyboards/minidox/keymaps/khitsule/config.h +++ b/keyboards/minidox/keymaps/khitsule/config.h @@ -1,8 +1,6 @@ #ifndef CONFIG_USER_H #define CONFIG_USER_H -#define PREVENT_STUCK_MODIFIERS - #define IGNORE_MOD_TAP_INTERRUPT -#endif \ No newline at end of file +#endif diff --git a/keyboards/mint60/config.h b/keyboards/mint60/config.h index 37b69e93a..51c586e63 100644 --- a/keyboards/mint60/config.h +++ b/keyboards/mint60/config.h @@ -29,7 +29,6 @@ along with this program. If not, see . #define PRODUCT Mint60 #define DESCRIPTION A row staggered split keyboard -#define PREVENT_STUCK_MODIFIERS #define TAPPING_FORCE_HOLD #define TAPPING_TERM 100 diff --git a/keyboards/mitosis/config.h b/keyboards/mitosis/config.h index 6101ee123..5cfd2e4b1 100644 --- a/keyboards/mitosis/config.h +++ b/keyboards/mitosis/config.h @@ -52,8 +52,6 @@ along with this program. If not, see . * These options are also useful to firmware size reduction. */ -#define PREVENT_STUCK_MODIFIERS - /* disable debug print */ //#define NO_DEBUG diff --git a/keyboards/niu_mini/config.h b/keyboards/niu_mini/config.h index 2f2230616..b9d3ed4e9 100644 --- a/keyboards/niu_mini/config.h +++ b/keyboards/niu_mini/config.h @@ -64,9 +64,6 @@ along with this program. If not, see . keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #define RGB_DI_PIN E2 #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS diff --git a/keyboards/novelpad/config.h b/keyboards/novelpad/config.h index 0d6a71343..3a47c0eb6 100755 --- a/keyboards/novelpad/config.h +++ b/keyboards/novelpad/config.h @@ -53,9 +53,6 @@ along with this program. If not, see . false \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #define BACKLIGHT_LEVELS 10 #define BACKLIGHT_PIN B7 diff --git a/keyboards/noxary/268/config.h b/keyboards/noxary/268/config.h index b2cb95e95..7eec79a1b 100644 --- a/keyboards/noxary/268/config.h +++ b/keyboards/noxary/268/config.h @@ -60,9 +60,6 @@ along with this program. If not, see . keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - /* ws2812b options */ #define RGB_DI_PIN B5 #ifdef RGB_DI_PIN @@ -73,4 +70,4 @@ along with this program. If not, see . #define RGBLIGHT_VAL_STEP 16 #endif -#endif \ No newline at end of file +#endif diff --git a/keyboards/ok60/config.h b/keyboards/ok60/config.h index 61c2fa0ed..db7b74e58 100644 --- a/keyboards/ok60/config.h +++ b/keyboards/ok60/config.h @@ -71,9 +71,6 @@ along with this program. If not, see . keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #define RGB_DI_PIN F6 #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 10 diff --git a/keyboards/omnikey_blackheart/config.h b/keyboards/omnikey_blackheart/config.h index 14b4a5f17..94412cfa6 100644 --- a/keyboards/omnikey_blackheart/config.h +++ b/keyboards/omnikey_blackheart/config.h @@ -45,10 +45,6 @@ /* force n-key rollover*/ #define FORCE_NKRO -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - - #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 0 @@ -57,4 +53,4 @@ #define RGBLIGHT_VAL_STEP 8 #endif -#endif \ No newline at end of file +#endif diff --git a/keyboards/paladin64/config.h b/keyboards/paladin64/config.h index 27f54bf16..a5280f4d4 100755 --- a/keyboards/paladin64/config.h +++ b/keyboards/paladin64/config.h @@ -110,8 +110,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS #define RGB_DI_PIN D0 #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS diff --git a/keyboards/pegasushoof/keymaps/citadel/config.h b/keyboards/pegasushoof/keymaps/citadel/config.h index e8eafe2e1..2d27ff392 100644 --- a/keyboards/pegasushoof/keymaps/citadel/config.h +++ b/keyboards/pegasushoof/keymaps/citadel/config.h @@ -8,7 +8,4 @@ #undef PRODUCT #define PRODUCT Pegasus Hoof Citadel -/* necessary option for this keymap, because CAPS is redefined in Layer 0 */ -#define PREVENT_STUCK_MODIFIERS - #endif diff --git a/keyboards/planck/keymaps/ajp10304/config.h b/keyboards/planck/keymaps/ajp10304/config.h deleted file mode 100644 index 11cafbefc..000000000 --- a/keyboards/planck/keymaps/ajp10304/config.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -#define PREVENT_STUCK_MODIFIERS - -#endif diff --git a/keyboards/planck/keymaps/altgr/config.h b/keyboards/planck/keymaps/altgr/config.h index d55258c02..e517a8b24 100644 --- a/keyboards/planck/keymaps/altgr/config.h +++ b/keyboards/planck/keymaps/altgr/config.h @@ -3,9 +3,6 @@ #include "../../config.h" -// required because lower/raise modifiers are redefined by colemak-dh -#define PREVENT_STUCK_MODIFIERS - // tap dance key press termination interval #define TAPPING_TERM 250 diff --git a/keyboards/planck/keymaps/am/config.h b/keyboards/planck/keymaps/am/config.h index b2b87045b..1ae457e3b 100644 --- a/keyboards/planck/keymaps/am/config.h +++ b/keyboards/planck/keymaps/am/config.h @@ -1,8 +1,5 @@ #pragma once -/* Prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #ifdef AUDIO_ENABLE #define STARTUP_SONG SONG(PLANCK_SOUND) diff --git a/keyboards/planck/keymaps/andylikescandy/config.h b/keyboards/planck/keymaps/andylikescandy/config.h index 0de5f3db0..01169db2a 100644 --- a/keyboards/planck/keymaps/andylikescandy/config.h +++ b/keyboards/planck/keymaps/andylikescandy/config.h @@ -17,9 +17,6 @@ #define PERMISSIVE_HOLD -#define PREVENT_STUCK_MODIFIERS - - /* * MIDI options */ diff --git a/keyboards/planck/keymaps/bone2planck/config.h b/keyboards/planck/keymaps/bone2planck/config.h deleted file mode 100644 index 3e9e692d3..000000000 --- a/keyboards/planck/keymaps/bone2planck/config.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -#define PREVENT_STUCK_MODIFIERS - -#endif \ No newline at end of file diff --git a/keyboards/planck/keymaps/davidrambo/config.h b/keyboards/planck/keymaps/davidrambo/config.h index c3bebf579..2decb3dc8 100644 --- a/keyboards/planck/keymaps/davidrambo/config.h +++ b/keyboards/planck/keymaps/davidrambo/config.h @@ -3,7 +3,6 @@ #define CONFIG_USER_H #define TAPPING_TERM 200 #include "../../config.h" -#define PERMISSIVE_HOLD -#define PREVENT_STUCK_MODIFIERS +#define PERMISSIVE_HOLD -#endif \ No newline at end of file +#endif diff --git a/keyboards/planck/keymaps/dshields/config.h b/keyboards/planck/keymaps/dshields/config.h index 480ba453a..9ba854ef0 100644 --- a/keyboards/planck/keymaps/dshields/config.h +++ b/keyboards/planck/keymaps/dshields/config.h @@ -10,7 +10,6 @@ #define _______ KC_TRNS #define XXXXXXX KC_NO -#define PREVENT_STUCK_MODIFIERS #define USB_MAX_POWER_CONSUMPTION 100 #define ONESHOT_TAP_TOGGLE 2 diff --git a/keyboards/planck/keymaps/espynn/keymap.c b/keyboards/planck/keymaps/espynn/keymap.c index 9cf508af6..5615a78bf 100644 --- a/keyboards/planck/keymaps/espynn/keymap.c +++ b/keyboards/planck/keymaps/espynn/keymap.c @@ -5,7 +5,6 @@ #ifdef BACKLIGHT_ENABLE #include "backlight.h" #endif -#define PREVENT_STUCK_MODIFIERS extern keymap_config_t keymap_config; // Symbolic names for macro IDs. diff --git a/keyboards/planck/keymaps/experimental/config.h b/keyboards/planck/keymaps/experimental/config.h index 0864b5fbc..86cc4760b 100644 --- a/keyboards/planck/keymaps/experimental/config.h +++ b/keyboards/planck/keymaps/experimental/config.h @@ -5,8 +5,6 @@ #define LEADER_TIMEOUT 300 #define BACKLIGHT_BREATHING -#define PREVENT_STUCK_MODIFIERS - /* ws2812 RGB LED */ #define RGB_DI_PIN B1 diff --git a/keyboards/planck/keymaps/experimental/rules.mk b/keyboards/planck/keymaps/experimental/rules.mk index b135dfca0..168d3cb9f 100644 --- a/keyboards/planck/keymaps/experimental/rules.mk +++ b/keyboards/planck/keymaps/experimental/rules.mk @@ -18,10 +18,11 @@ BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. SWAP_HANDS_ENABLE = yes # Enable one-hand typing STENO_ENABLE = yes # Enable TX Bolt protocol for Stenography, requires VIRTSER and may not work with mouse keys +LEADER_ENABLE = yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR include ../../../../Makefile -endif \ No newline at end of file +endif diff --git a/keyboards/planck/keymaps/hiea/config.h b/keyboards/planck/keymaps/hiea/config.h index 9bb5e0873..655cdf5db 100644 --- a/keyboards/planck/keymaps/hiea/config.h +++ b/keyboards/planck/keymaps/hiea/config.h @@ -3,9 +3,6 @@ #include "../../config.h" -// required because lower/raise modifiers are redefined by colemak-dh -#define PREVENT_STUCK_MODIFIERS - // tap dance key press termination interval #define TAPPING_TERM 250 diff --git a/keyboards/planck/keymaps/hieax/config.h b/keyboards/planck/keymaps/hieax/config.h index 9bb5e0873..655cdf5db 100644 --- a/keyboards/planck/keymaps/hieax/config.h +++ b/keyboards/planck/keymaps/hieax/config.h @@ -3,9 +3,6 @@ #include "../../config.h" -// required because lower/raise modifiers are redefined by colemak-dh -#define PREVENT_STUCK_MODIFIERS - // tap dance key press termination interval #define TAPPING_TERM 250 diff --git a/keyboards/planck/keymaps/ishtob/config.h b/keyboards/planck/keymaps/ishtob/config.h index e58ade0b0..688607634 100755 --- a/keyboards/planck/keymaps/ishtob/config.h +++ b/keyboards/planck/keymaps/ishtob/config.h @@ -2,7 +2,6 @@ #ifndef USERSPACE_CONFIG_H #define USERSPACE_CONFIG_H - #ifdef AUDIO_ENABLE // #define STARTUP_SONG SONG(E1M1_DOOM) @@ -24,7 +23,6 @@ #define FORCE_NKRO #define LEADER_TIMEOUT 300 -#define PREVENT_STUCK_MODIFIERS #undef DEBOUNCE #define DEBOUNCE 0 diff --git a/keyboards/planck/keymaps/jarred/config.h b/keyboards/planck/keymaps/jarred/config.h index f98b8935e..9e8f404c1 100644 --- a/keyboards/planck/keymaps/jarred/config.h +++ b/keyboards/planck/keymaps/jarred/config.h @@ -19,8 +19,6 @@ #include "config_common.h" -#define PREVENT_STUCK_MODIFIERS - #ifdef AUDIO_ENABLE #define STARTUP_SONG SONG(PLANCK_SOUND) #endif @@ -34,6 +32,6 @@ #define MOUSEKEY_WHEEL_DELAY 0 #define MOUSEKEY_WHEEL_MAX_SPEED 4 -#define MOUSEKEY_WHEEL_TIME_TO_MAX 255 +#define MOUSEKEY_WHEEL_TIME_TO_MAX 255 #endif diff --git a/keyboards/planck/keymaps/jeremy-dev/keymap.c b/keyboards/planck/keymaps/jeremy-dev/keymap.c index 5aea44329..89b7e6b84 100644 --- a/keyboards/planck/keymaps/jeremy-dev/keymap.c +++ b/keyboards/planck/keymaps/jeremy-dev/keymap.c @@ -1,7 +1,6 @@ // This is the personal keymap of Jeremy Cowgar (@jcowgar). It is written for the programmer. // Configuration options -#define PREVENT_STUCK_MODIFIERS #pragma message "You may need to add LAYOUT_planck_grid to your keymap layers - see default for an example" #include "planck.h" diff --git a/keyboards/planck/keymaps/kmontag42/rules.mk b/keyboards/planck/keymaps/kmontag42/rules.mk index b9f73934a..0c100076b 100644 --- a/keyboards/planck/keymaps/kmontag42/rules.mk +++ b/keyboards/planck/keymaps/kmontag42/rules.mk @@ -1,4 +1,5 @@ UNICODE_ENABLE = yes +LEADER_ENABLE = yes ifndef QUANTUM_DIR include ../../../../Makefile diff --git a/keyboards/planck/keymaps/lae3/config.h b/keyboards/planck/keymaps/lae3/config.h deleted file mode 100644 index a28634e69..000000000 --- a/keyboards/planck/keymaps/lae3/config.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef LAE3_KEYMAP_H -#define LAE3_KEYMAP_H - -#include "../../config.h" - -#define PREVENT_STUCK_MODIFIERS - -#endif diff --git a/keyboards/planck/keymaps/mitch/config.h b/keyboards/planck/keymaps/mitch/config.h index 10591b3c8..bb7989d90 100644 --- a/keyboards/planck/keymaps/mitch/config.h +++ b/keyboards/planck/keymaps/mitch/config.h @@ -1,6 +1,5 @@ #include "../../config.h" -#define PREVENT_STUCK_MODIFIERS // for the broken board #undef MATRIX_COL_PINS -#define MATRIX_COL_PINS { F1, F0, B0, B2, F4, F5, F6, F7, D4, D6, B4, D7 } \ No newline at end of file +#define MATRIX_COL_PINS { F1, F0, B0, B2, F4, F5, F6, F7, D4, D6, B4, D7 } diff --git a/keyboards/planck/keymaps/mitch/readme.md b/keyboards/planck/keymaps/mitch/readme.md index 3869304f4..9ed1133ef 100644 --- a/keyboards/planck/keymaps/mitch/readme.md +++ b/keyboards/planck/keymaps/mitch/readme.md @@ -20,7 +20,3 @@ rest of the symbols, mostly mapped with the ten key numbers. The normal right shift key uses the `MT` macro to trigger Enter on tap and right shift when held. - -This keymap sets the `PREVENT_STUCK_MODIFIERS` flag to avoid the occasional WTF -moments when using a modifier keys and accidentally releasing them after moving -to a new layer. diff --git a/keyboards/planck/keymaps/narze/config.h b/keyboards/planck/keymaps/narze/config.h index e081a93b5..19d784b2b 100644 --- a/keyboards/planck/keymaps/narze/config.h +++ b/keyboards/planck/keymaps/narze/config.h @@ -33,10 +33,9 @@ #define IGNORE_MOD_TAP_INTERRUPT #define PERMISSIVE_HOLD -#define PREVENT_STUCK_MODIFIERS #define SUPER_DUPER_SOUND S__NOTE(_B1) #define MOUSEKEY_DELAY 100 -#endif \ No newline at end of file +#endif diff --git a/keyboards/planck/keymaps/neo2planck/config.h b/keyboards/planck/keymaps/neo2planck/config.h deleted file mode 100644 index 3e9e692d3..000000000 --- a/keyboards/planck/keymaps/neo2planck/config.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -#define PREVENT_STUCK_MODIFIERS - -#endif \ No newline at end of file diff --git a/keyboards/planck/keymaps/priyadi/config.h b/keyboards/planck/keymaps/priyadi/config.h index 448ae3b90..876d057bf 100644 --- a/keyboards/planck/keymaps/priyadi/config.h +++ b/keyboards/planck/keymaps/priyadi/config.h @@ -11,8 +11,6 @@ /* skip bootmagic and eeconfig */ #define BOOTMAGIC_KEY_SKIP KC_SPACE -#define PREVENT_STUCK_MODIFIERS - #define UNICODE_TYPE_DELAY 0 #define LAYOUT_DVORAK diff --git a/keyboards/planck/keymaps/sdothum/config.h b/keyboards/planck/keymaps/sdothum/config.h index 4b2cdeece..8bed79e6f 100644 --- a/keyboards/planck/keymaps/sdothum/config.h +++ b/keyboards/planck/keymaps/sdothum/config.h @@ -3,9 +3,6 @@ #include "../../config.h" -// required because lower/raise modifiers are redefined by colemak-dh -#define PREVENT_STUCK_MODIFIERS - // tap dance key press termination interval #define TAPPING_TERM 250 diff --git a/keyboards/planck/keymaps/steno/config.h b/keyboards/planck/keymaps/steno/config.h index 1879ab007..4f99c7eb8 100644 --- a/keyboards/planck/keymaps/steno/config.h +++ b/keyboards/planck/keymaps/steno/config.h @@ -15,8 +15,6 @@ #define MUSIC_MASK (keycode != KC_NO) -#define PREVENT_STUCK_MODIFIERS - /* * MIDI options */ @@ -41,4 +39,4 @@ /* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ //#define MIDI_TONE_KEYCODE_OCTAVES 2 -#endif \ No newline at end of file +#endif diff --git a/keyboards/planck/keymaps/tehwalris/config.h b/keyboards/planck/keymaps/tehwalris/config.h index 4725e1426..c5d55b969 100644 --- a/keyboards/planck/keymaps/tehwalris/config.h +++ b/keyboards/planck/keymaps/tehwalris/config.h @@ -3,8 +3,6 @@ #include "../../config.h" -#define PREVENT_STUCK_MODIFIERS - #ifdef AUDIO_ENABLE // #define STARTUP_SONG SONG(PLANCK_SOUND) #define STARTUP_SONG SONG(NO_SOUND) @@ -27,7 +25,7 @@ /* enable basic MIDI features: - MIDI notes can be sent when in Music mode is on */ - + #define MIDI_BASIC /* enable advanced MIDI features: diff --git a/keyboards/planck/keymaps/vifon/config.h b/keyboards/planck/keymaps/vifon/config.h index 4cb4a1235..be395faad 100644 --- a/keyboards/planck/keymaps/vifon/config.h +++ b/keyboards/planck/keymaps/vifon/config.h @@ -26,9 +26,6 @@ /* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ //#define MIDI_TONE_KEYCODE_OCTAVES 2 -/* prevent the modifiers from being stuck, sacrificing some memory */ -#define PREVENT_STUCK_MODIFIERS - /* A larger buffer for the dynamic macros as this keymap is not taking * up that much memory. */ diff --git a/keyboards/planck/keymaps/yale/config.h b/keyboards/planck/keymaps/yale/config.h deleted file mode 100644 index 8a916bbd0..000000000 --- a/keyboards/planck/keymaps/yale/config.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -#define PREVENT_STUCK_MODIFIERS - -#endif - - - diff --git a/keyboards/planck/keymaps/zach/config.h b/keyboards/planck/keymaps/zach/config.h index 19a3856a3..dc79bad06 100644 --- a/keyboards/planck/keymaps/zach/config.h +++ b/keyboards/planck/keymaps/zach/config.h @@ -55,7 +55,6 @@ //#define NO_ACTION_ONESHOT #define NO_ACTION_MACRO #define NO_ACTION_FUNCTION -#define PREVENT_STUCK_MODIFIERS //#define DYNAMIC_MACRO_ENABLE // Enable if you need to use the macro functionality //#define SPACE_CADET // Parenthesis on L/R shift diff --git a/keyboards/planck/rev6/config.h b/keyboards/planck/rev6/config.h index 0e462180b..afd69f7d8 100644 --- a/keyboards/planck/rev6/config.h +++ b/keyboards/planck/rev6/config.h @@ -50,9 +50,6 @@ /* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ #define DEBOUNCE 6 -/* Prevent modifiers from being stuck on after layer changes. */ -#define PREVENT_STUCK_MODIFIERS - /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ //#define LOCKING_SUPPORT_ENABLE /* Locking resynchronize hack */ diff --git a/keyboards/playkbtw/ca66/config.h b/keyboards/playkbtw/ca66/config.h index c35718042..53bbe95e3 100644 --- a/keyboards/playkbtw/ca66/config.h +++ b/keyboards/playkbtw/ca66/config.h @@ -42,8 +42,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS #define RGB_DI_PIN B1 #ifdef RGB_DI_PIN diff --git a/keyboards/playkbtw/pk60/config.h b/keyboards/playkbtw/pk60/config.h index 06101349c..601e3c8a5 100644 --- a/keyboards/playkbtw/pk60/config.h +++ b/keyboards/playkbtw/pk60/config.h @@ -43,9 +43,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #define RGB_DI_PIN E2 #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS @@ -55,4 +52,4 @@ #define RGBLIGHT_VAL_STEP 8 #endif -#endif \ No newline at end of file +#endif diff --git a/keyboards/preonic/keymaps/bucktooth/config.h b/keyboards/preonic/keymaps/bucktooth/config.h index b98883120..23e9e0ed2 100644 --- a/keyboards/preonic/keymaps/bucktooth/config.h +++ b/keyboards/preonic/keymaps/bucktooth/config.h @@ -4,6 +4,5 @@ #include "../../config.h" #define FORCE_NKRO 1 -#define PREVENT_STUCK_MODIFIERS #endif diff --git a/keyboards/preonic/keymaps/jacwib/config.h b/keyboards/preonic/keymaps/jacwib/config.h index b98883120..23e9e0ed2 100644 --- a/keyboards/preonic/keymaps/jacwib/config.h +++ b/keyboards/preonic/keymaps/jacwib/config.h @@ -4,6 +4,5 @@ #include "../../config.h" #define FORCE_NKRO 1 -#define PREVENT_STUCK_MODIFIERS #endif diff --git a/keyboards/preonic/keymaps/kuatsure/rules.mk b/keyboards/preonic/keymaps/kuatsure/rules.mk index 76d73acef..9369f99a9 100644 --- a/keyboards/preonic/keymaps/kuatsure/rules.mk +++ b/keyboards/preonic/keymaps/kuatsure/rules.mk @@ -1 +1,2 @@ BACKLIGHT_ENABLE = no +LEADER_ENABLE = yes diff --git a/keyboards/preonic/keymaps/that_canadian/config.h b/keyboards/preonic/keymaps/that_canadian/config.h deleted file mode 100644 index 11cafbefc..000000000 --- a/keyboards/preonic/keymaps/that_canadian/config.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -#define PREVENT_STUCK_MODIFIERS - -#endif diff --git a/keyboards/preonic/keymaps/zach/config.h b/keyboards/preonic/keymaps/zach/config.h index bb8913c7a..40a083da3 100644 --- a/keyboards/preonic/keymaps/zach/config.h +++ b/keyboards/preonic/keymaps/zach/config.h @@ -87,7 +87,6 @@ along with this program. If not, see . //#define NO_ACTION_ONESHOT #define NO_ACTION_MACRO #define NO_ACTION_FUNCTION -#define PREVENT_STUCK_MODIFIERS //#define DYNAMIC_MACRO_ENABLE // Enable if you need to use the macro functionality //#define SPACE_CADET // Parenthesis on L/R shift diff --git a/keyboards/preonic/rev3/config.h b/keyboards/preonic/rev3/config.h index 3f57c591a..98899dc6a 100644 --- a/keyboards/preonic/rev3/config.h +++ b/keyboards/preonic/rev3/config.h @@ -50,9 +50,6 @@ /* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ #define DEBOUNCE 6 -/* Prevent modifiers from being stuck on after layer changes. */ -#define PREVENT_STUCK_MODIFIERS - /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ //#define LOCKING_SUPPORT_ENABLE /* Locking resynchronize hack */ diff --git a/keyboards/prime_r/config.h b/keyboards/prime_r/config.h index b53f14905..ad92199a2 100644 --- a/keyboards/prime_r/config.h +++ b/keyboards/prime_r/config.h @@ -60,10 +60,6 @@ along with this program. If not, see . keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - - #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 0 diff --git a/keyboards/rorschach/keymaps/insertsnideremarks/config.h b/keyboards/rorschach/keymaps/insertsnideremarks/config.h index 90fb5120d..2048232c9 100644 --- a/keyboards/rorschach/keymaps/insertsnideremarks/config.h +++ b/keyboards/rorschach/keymaps/insertsnideremarks/config.h @@ -11,7 +11,6 @@ // #define MASTER_RIGHT #define EE_HANDS -#define PREVENT_STUCK_MODIFIERS #define IGNORE_MOD_TAP_INTERRUPT #define TAPPING_TERM 175 #define TAPPING_TOGGLE 2 diff --git a/keyboards/s60_x/keymaps/bluebear/config.h b/keyboards/s60_x/keymaps/bluebear/config.h index 35754b523..10bddf0d3 100644 --- a/keyboards/s60_x/keymaps/bluebear/config.h +++ b/keyboards/s60_x/keymaps/bluebear/config.h @@ -105,7 +105,4 @@ along with this program. If not, see . // Space Cadet Rollover - if set, allows to tap opposite shift key to cancel erroneous press #define DISABLE_SPACE_CADET_ROLLOVER -// Prevent stuck modifiers -#define PREVENT_STUCK_MODIFIERS - #endif diff --git a/keyboards/s60_x/rgb/config.h b/keyboards/s60_x/rgb/config.h index ec8b0f49e..d9c26658d 100644 --- a/keyboards/s60_x/rgb/config.h +++ b/keyboards/s60_x/rgb/config.h @@ -17,9 +17,6 @@ /* Locking resynchronize hack */ #define LOCKING_RESYNC_ENABLE -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #define RGB_DI_PIN F6 #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS @@ -29,4 +26,4 @@ #define RGBLIGHT_VAL_STEP 8 #endif -#endif \ No newline at end of file +#endif diff --git a/keyboards/s65_plus/config.h b/keyboards/s65_plus/config.h index df60e60a8..60512db46 100644 --- a/keyboards/s65_plus/config.h +++ b/keyboards/s65_plus/config.h @@ -49,7 +49,4 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #endif diff --git a/keyboards/s65_x/config.h b/keyboards/s65_x/config.h index 8288ef783..367efc526 100644 --- a/keyboards/s65_x/config.h +++ b/keyboards/s65_x/config.h @@ -49,8 +49,4 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) - -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #endif diff --git a/keyboards/sx60/config.h b/keyboards/sx60/config.h index f22fbe8be..52a1cc7a1 100755 --- a/keyboards/sx60/config.h +++ b/keyboards/sx60/config.h @@ -46,10 +46,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - - #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 0 diff --git a/keyboards/telophase/config.h b/keyboards/telophase/config.h index 09655c025..be0a36977 100644 --- a/keyboards/telophase/config.h +++ b/keyboards/telophase/config.h @@ -52,8 +52,6 @@ along with this program. If not, see . * These options are also useful to firmware size reduction. */ -#define PREVENT_STUCK_MODIFIERS - /* disable debug print */ //#define NO_DEBUG diff --git a/keyboards/tetris/config.h b/keyboards/tetris/config.h index 9c7f525a7..7e7dac7cf 100644 --- a/keyboards/tetris/config.h +++ b/keyboards/tetris/config.h @@ -41,9 +41,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #define TAPPING_TERM 200 #define PERMISSIVE_HOLD @@ -62,4 +59,4 @@ //#define RGBLIGHT_LIMIT_VAL 128 #endif -#endif \ No newline at end of file +#endif diff --git a/keyboards/thevankeyboards/bananasplit/keymaps/talljoe/config.h b/keyboards/thevankeyboards/bananasplit/keymaps/talljoe/config.h index bb2aadfa6..fc9bd3d61 100644 --- a/keyboards/thevankeyboards/bananasplit/keymaps/talljoe/config.h +++ b/keyboards/thevankeyboards/bananasplit/keymaps/talljoe/config.h @@ -3,7 +3,6 @@ #include QMK_KEYBOARD_CONFIG_H -#define PREVENT_STUCK_MODIFIERS #define SPACE_COUNT 3 #define TEMPLATE( \ diff --git a/keyboards/tokyo60/config.h b/keyboards/tokyo60/config.h index 6e6ab2215..16927be17 100644 --- a/keyboards/tokyo60/config.h +++ b/keyboards/tokyo60/config.h @@ -47,9 +47,6 @@ /* Locking resynchronize hack */ #define LOCKING_RESYNC_ENABLE -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #define RGB_DI_PIN F7 #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS diff --git a/keyboards/tomato/config.h b/keyboards/tomato/config.h index f33c13108..185cb326c 100644 --- a/keyboards/tomato/config.h +++ b/keyboards/tomato/config.h @@ -34,9 +34,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - /* eliminate lag on space cadet mods */ #define PERMISSIVE_HOLD diff --git a/keyboards/uk78/config.h b/keyboards/uk78/config.h index 35f5bf70b..34d672079 100644 --- a/keyboards/uk78/config.h +++ b/keyboards/uk78/config.h @@ -60,9 +60,6 @@ along with this program. If not, see . keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - /* ws2812b options */ #define RGB_DI_PIN F6 #ifdef RGB_DI_PIN diff --git a/keyboards/viterbi/keymaps/drashna/config.h b/keyboards/viterbi/keymaps/drashna/config.h index 687f80441..a1e361e34 100644 --- a/keyboards/viterbi/keymaps/drashna/config.h +++ b/keyboards/viterbi/keymaps/drashna/config.h @@ -53,7 +53,7 @@ along with this program. If not, see . #define NO_MUSIC_MODE #endif -#undef PREVENT_STUCK_MODIFIERS +#define STRICT_LAYER_RELEASE #define LAYOUT_ortho_5x7( \ L00, L01, L02, L03, L04, L05, L06, \ diff --git a/keyboards/whitefox/config.h b/keyboards/whitefox/config.h index 9f021fb51..a8047cf54 100644 --- a/keyboards/whitefox/config.h +++ b/keyboards/whitefox/config.h @@ -18,8 +18,6 @@ along with this program. If not, see . #ifndef CONFIG_H #define CONFIG_H -#define PREVENT_STUCK_MODIFIERS - /* USB Device descriptor parameter */ #define VENDOR_ID 0x1c11 #define PRODUCT_ID 0xb04d diff --git a/keyboards/xd60/keymaps/kmontag42/rules.mk b/keyboards/xd60/keymaps/kmontag42/rules.mk new file mode 100644 index 000000000..d0d2ef6d5 --- /dev/null +++ b/keyboards/xd60/keymaps/kmontag42/rules.mk @@ -0,0 +1 @@ +LEADER_ENABLE = yes diff --git a/keyboards/xd75/keymaps/davidrambo/config.h b/keyboards/xd75/keymaps/davidrambo/config.h index e87ccde79..f21914703 100644 --- a/keyboards/xd75/keymaps/davidrambo/config.h +++ b/keyboards/xd75/keymaps/davidrambo/config.h @@ -20,7 +20,6 @@ #include "../../config.h" #define TAPPING_TERM 200 -#define PERMISSIVE_HOLD -#define PREVENT_STUCK_MODIFIERS +#define PERMISSIVE_HOLD #endif diff --git a/keyboards/xd75/keymaps/tdl-jturner/config.h b/keyboards/xd75/keymaps/tdl-jturner/config.h index 561a48d7e..985247bb2 100644 --- a/keyboards/xd75/keymaps/tdl-jturner/config.h +++ b/keyboards/xd75/keymaps/tdl-jturner/config.h @@ -26,7 +26,6 @@ #define TAPPING_TOGGLE 2 //#define PERMISSIVE_HOLD //#define QMK_KEYS_PER_SCAN 4 -#define PREVENT_STUCK_MODIFIERS #define FORCE_NKRO #define MOUSEKEY_INTERVAL 16 diff --git a/keyboards/xmmx/config.h b/keyboards/xmmx/config.h index f3f893e28..8cb2cf82d 100644 --- a/keyboards/xmmx/config.h +++ b/keyboards/xmmx/config.h @@ -43,10 +43,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - - #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 0 @@ -55,4 +51,4 @@ #define RGBLIGHT_VAL_STEP 8 #endif -#endif \ No newline at end of file +#endif diff --git a/keyboards/ymd96/keymaps/hgoel89/config.h b/keyboards/ymd96/keymaps/hgoel89/config.h index 52aaa8f24..b1d74e1e6 100644 --- a/keyboards/ymd96/keymaps/hgoel89/config.h +++ b/keyboards/ymd96/keymaps/hgoel89/config.h @@ -3,7 +3,6 @@ #include "../../config.h" -#define PREVENT_STUCK_MODIFIERS #define TAPPING_TERM 300 #endif diff --git a/keyboards/z150_blackheart/config.h b/keyboards/z150_blackheart/config.h index d2fce9aee..362153652 100644 --- a/keyboards/z150_blackheart/config.h +++ b/keyboards/z150_blackheart/config.h @@ -39,14 +39,10 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - - #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 0 #define RGBLIGHT_HUE_STEP 8 #define RGBLIGHT_SAT_STEP 8 #define RGBLIGHT_VAL_STEP 8 -#endif \ No newline at end of file +#endif diff --git a/keyboards/zeal60/keymaps/tusing/config.h b/keyboards/zeal60/keymaps/tusing/config.h index 93f260946..64aaece50 100644 --- a/keyboards/zeal60/keymaps/tusing/config.h +++ b/keyboards/zeal60/keymaps/tusing/config.h @@ -34,7 +34,3 @@ // Scale brightnes according to BRIGHTNESS_CORRECTION_TABLE in quantum/rgblight.c. // This allows to mitigate uneven brightness from LED underglow strips. // #define LED_BRIGHTNESS_CORRECTION - -// Prevent modifiers on layer 1 from persisting after we let go -#define PREVENT_STUCK_MODIFIERS - diff --git a/keyboards/zlant/config.h b/keyboards/zlant/config.h index 456d225aa..ae9dcfef6 100755 --- a/keyboards/zlant/config.h +++ b/keyboards/zlant/config.h @@ -43,9 +43,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #define RGB_DI_PIN D6 #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS diff --git a/layouts/community/60_ansi/talljoe-ansi/config.h b/layouts/community/60_ansi/talljoe-ansi/config.h index 1990b0ee3..4326a2fd1 100644 --- a/layouts/community/60_ansi/talljoe-ansi/config.h +++ b/layouts/community/60_ansi/talljoe-ansi/config.h @@ -3,7 +3,6 @@ #include QMK_KEYBOARD_CONFIG_H -#define PREVENT_STUCK_MODIFIERS #define ENABLE_GAME_LAYER #define TEMPLATE( \ diff --git a/layouts/community/60_ansi_split_bs_rshift/talljoe/config.h b/layouts/community/60_ansi_split_bs_rshift/talljoe/config.h index 81ab5cf89..bf18fd9f7 100644 --- a/layouts/community/60_ansi_split_bs_rshift/talljoe/config.h +++ b/layouts/community/60_ansi_split_bs_rshift/talljoe/config.h @@ -3,7 +3,6 @@ #include QMK_KEYBOARD_CONFIG_H -#define PREVENT_STUCK_MODIFIERS #define ENABLE_GAME_LAYER #define TEMPLATE( \ diff --git a/layouts/community/60_hhkb/talljoe-hhkb/config.h b/layouts/community/60_hhkb/talljoe-hhkb/config.h index 938ea6cd6..9e907feeb 100644 --- a/layouts/community/60_hhkb/talljoe-hhkb/config.h +++ b/layouts/community/60_hhkb/talljoe-hhkb/config.h @@ -3,7 +3,6 @@ #include QMK_KEYBOARD_CONFIG_H -#define PREVENT_STUCK_MODIFIERS #define ENABLE_GAME_LAYER #define TEMPLATE( \ diff --git a/layouts/community/ergodox/adam/config.h b/layouts/community/ergodox/adam/config.h index 21af8c6b8..1a8fddb50 100644 --- a/layouts/community/ergodox/adam/config.h +++ b/layouts/community/ergodox/adam/config.h @@ -2,5 +2,4 @@ #undef TAPPING_TERM #define TAPPING_TERM 300 //At 500 some bad logic takes hold -#define PREVENT_STUCK_MODIFIERS #define IGNORE_MOD_TAP_INTERRUPT diff --git a/layouts/community/ergodox/albert/rules.mk b/layouts/community/ergodox/albert/rules.mk index fcd019e83..47549b50f 100644 --- a/layouts/community/ergodox/albert/rules.mk +++ b/layouts/community/ergodox/albert/rules.mk @@ -1,3 +1,2 @@ COMMAND_ENABLE = no # Commands for debug and configuration - - +LEADER_ENABLE = yes diff --git a/layouts/community/ergodox/algernon/rules.mk b/layouts/community/ergodox/algernon/rules.mk index f795a8676..53dec5153 100644 --- a/layouts/community/ergodox/algernon/rules.mk +++ b/layouts/community/ergodox/algernon/rules.mk @@ -8,6 +8,7 @@ TAP_DANCE_ENABLE = yes KEYLOGGER_ENABLE ?= yes UCIS_ENABLE = yes MOUSEKEY_ENABLE = no +LEADER_ENABLE = yes AUTOLOG_ENABLE ?= no diff --git a/layouts/community/ergodox/alphadox/config.h b/layouts/community/ergodox/alphadox/config.h index 6fc64f508..9e076dead 100644 --- a/layouts/community/ergodox/alphadox/config.h +++ b/layouts/community/ergodox/alphadox/config.h @@ -4,7 +4,6 @@ #include QMK_KEYBOARD_CONFIG_H #define FORCE_NKRO -#define PREVENT_STUCK_MODIFIERS #undef TAPPING_TERM #undef IGNORE_MOD_TAP_INTERRUPT diff --git a/layouts/community/ergodox/deadcyclo/rules.mk b/layouts/community/ergodox/deadcyclo/rules.mk index 039f07c8e..f5093529b 100644 --- a/layouts/community/ergodox/deadcyclo/rules.mk +++ b/layouts/community/ergodox/deadcyclo/rules.mk @@ -1 +1,2 @@ UNICODE_ENABLE = yes +LEADER_ENABLE = yes diff --git a/layouts/community/ergodox/erez_experimental/rules.mk b/layouts/community/ergodox/erez_experimental/rules.mk index 839dd82e1..f68b56f87 100644 --- a/layouts/community/ergodox/erez_experimental/rules.mk +++ b/layouts/community/ergodox/erez_experimental/rules.mk @@ -3,5 +3,4 @@ SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend COMMAND_ENABLE = no # Commands for debug and configuration - - +LEADER_ENABLE = yes diff --git a/layouts/community/ergodox/familiar/rules.mk b/layouts/community/ergodox/familiar/rules.mk index 31e0fcf29..4a3c58621 100644 --- a/layouts/community/ergodox/familiar/rules.mk +++ b/layouts/community/ergodox/familiar/rules.mk @@ -1 +1,2 @@ TAP_DANCE_ENABLE=yes +LEADER_ENABLE = yes diff --git a/layouts/community/ergodox/mclennon_osx/README.md b/layouts/community/ergodox/mclennon_osx/README.md index 28cdb7c10..53b3d4841 100644 --- a/layouts/community/ergodox/mclennon_osx/README.md +++ b/layouts/community/ergodox/mclennon_osx/README.md @@ -1,5 +1,5 @@ # Ergodox EZ for OS X -This keymapping is designed to be reasonably familiar to an ordinary Mac keyboard while taking advantage of the Ergodox EZ's features. Caps lock instead enables a layer which allows a user to use HJKL as arrow keys and to control media. Shift and control have additional mappings on S and D to provide easier access while holding down caps lock. +This keymapping is designed to be reasonably familiar to an ordinary Mac keyboard while taking advantage of the Ergodox EZ's features. Caps lock instead enables a layer which allows a user to use HJKL as arrow keys and to control media. Shift and control have additional mappings on S and D to provide easier access while holding down caps lock. -If you choose to compile this yourself, be sure to compile with `#define PREVENT_STUCK_MODIFIERS` in your `config.h`. Firmware built using [qmk_firmware](https://github.com/qmk/qmk_firmware/). +Firmware built using [qmk_firmware](https://github.com/qmk/qmk_firmware/). diff --git a/layouts/community/ergodox/techtomas/readme.md b/layouts/community/ergodox/techtomas/readme.md index 36e0591a8..3d1bcb9e1 100644 --- a/layouts/community/ergodox/techtomas/readme.md +++ b/layouts/community/ergodox/techtomas/readme.md @@ -39,7 +39,7 @@ The right arrow key and End key toggle the control layer on the left board. Ther On the left board you have mouse control with left & right click in the location of the G and B keys. On the right board you have vim-style arrow keys using hjkl -The left thumb cluster moves shift and alt within easy reach while holding the toggle (end). So far I've found this convient to navigate and skip around text when using the hjkl arrow keys. I found that it was easy to get the alt key stuck on depending on what key you released first so I added the PREVENT_STUCK_MODIFIERS to the config.h to help with that. +The left thumb cluster moves shift and alt within easy reach while holding the toggle (end). So far I've found this convient to navigate and skip around text when using the hjkl arrow keys. ## Changelog diff --git a/layouts/community/ortho_4x12/symbolic/config.h b/layouts/community/ortho_4x12/symbolic/config.h index 702c9226c..c29b07706 100644 --- a/layouts/community/ortho_4x12/symbolic/config.h +++ b/layouts/community/ortho_4x12/symbolic/config.h @@ -20,10 +20,6 @@ along with this program. If not, see . #pragma once -// prevent stuck modifiers -#define PREVENT_STUCK_MODIFIERS - - // hold & tapping delay setting #define TAPPING_TERM 100 diff --git a/layouts/community/tkl_ansi/talljoe-tkl/config.h b/layouts/community/tkl_ansi/talljoe-tkl/config.h index 8b27d4136..02f8a94e3 100644 --- a/layouts/community/tkl_ansi/talljoe-tkl/config.h +++ b/layouts/community/tkl_ansi/talljoe-tkl/config.h @@ -3,7 +3,6 @@ #include QMK_KEYBOARD_CONFIG_H -#define PREVENT_STUCK_MODIFIERS #define ENABLE_GAME_LAYER #define TEMPLATE_TKL(\ diff --git a/quantum/process_keycode/process_chording.c b/quantum/process_keycode/process_chording.c deleted file mode 100644 index 6c6ebe300..000000000 --- a/quantum/process_keycode/process_chording.c +++ /dev/null @@ -1,76 +0,0 @@ -/* Copyright 2016 Jack Humbert - * - * 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 . - */ - -#include "process_chording.h" - -bool keys_chord(uint8_t keys[]) { - uint8_t keys_size = sizeof(keys)/sizeof(keys[0]); - bool pass = true; - uint8_t in = 0; - for (uint8_t i = 0; i < chord_key_count; i++) { - bool found = false; - for (uint8_t j = 0; j < keys_size; j++) { - if (chord_keys[i] == (keys[j] & 0xFF)) { - in++; // detects key in chord - found = true; - break; - } - } - if (found) - continue; - if (chord_keys[i] != 0) { - pass = false; // makes sure rest are blank - } - } - return (pass && (in == keys_size)); -} - -bool process_chording(uint16_t keycode, keyrecord_t *record) { - if (keycode >= QK_CHORDING && keycode <= QK_CHORDING_MAX) { - if (record->event.pressed) { - if (!chording) { - chording = true; - for (uint8_t i = 0; i < CHORDING_MAX; i++) - chord_keys[i] = 0; - chord_key_count = 0; - chord_key_down = 0; - } - chord_keys[chord_key_count] = (keycode & 0xFF); - chord_key_count++; - chord_key_down++; - return false; - } else { - if (chording) { - chord_key_down--; - if (chord_key_down == 0) { - chording = false; - // Chord Dictionary - if (keys_chord((uint8_t[]){KC_ENTER, KC_SPACE})) { - register_code(KC_A); - unregister_code(KC_A); - return false; - } - for (uint8_t i = 0; i < chord_key_count; i++) { - register_code(chord_keys[i]); - unregister_code(chord_keys[i]); - return false; - } - } - } - } - } - return true; -} diff --git a/quantum/process_keycode/process_chording.h b/quantum/process_keycode/process_chording.h deleted file mode 100644 index 8c0f4862a..000000000 --- a/quantum/process_keycode/process_chording.h +++ /dev/null @@ -1,32 +0,0 @@ -/* Copyright 2016 Jack Humbert - * - * 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 . - */ - -#ifndef PROCESS_CHORDING_H -#define PROCESS_CHORDING_H - -#include "quantum.h" - -// Chording stuff -#define CHORDING_MAX 4 -bool chording = false; - -uint8_t chord_keys[CHORDING_MAX] = {0}; -uint8_t chord_key_count = 0; -uint8_t chord_key_down = 0; - -bool process_chording(uint16_t keycode, keyrecord_t *record); - -#endif diff --git a/quantum/process_keycode/process_leader.c b/quantum/process_keycode/process_leader.c index c87ef115a..eddbf71f7 100644 --- a/quantum/process_keycode/process_leader.c +++ b/quantum/process_keycode/process_leader.c @@ -14,7 +14,7 @@ * along with this program. If not, see . */ -#ifndef DISABLE_LEADER +#ifdef LEADER_ENABLE #include "process_leader.h" diff --git a/quantum/quantum.c b/quantum/quantum.c index 9d352a94c..9bf91eb86 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -196,7 +196,7 @@ bool process_record_quantum(keyrecord_t *record) { keypos_t key = record->event.key; uint16_t keycode; - #if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS) + #if !defined(NO_ACTION_LAYER) && !defined(STRICT_LAYER_RELEASE) /* TODO: Use store_or_get_action() or a similar function. */ if (!disable_action_cache) { uint8_t layer; @@ -251,12 +251,9 @@ bool process_record_quantum(keyrecord_t *record) { #ifdef TAP_DANCE_ENABLE process_tap_dance(keycode, record) && #endif - #ifndef DISABLE_LEADER + #ifdef LEADER_ENABLE process_leader(keycode, record) && #endif - #ifndef DISABLE_CHORDING - process_chording(keycode, record) && - #endif #ifdef COMBO_ENABLE process_combo(keycode, record) && #endif diff --git a/quantum/quantum.h b/quantum/quantum.h index d1f761f17..7cf16d81e 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h @@ -89,15 +89,10 @@ extern uint32_t default_layer_state; #include "process_music.h" #endif -#ifndef DISABLE_LEADER +#ifdef LEADER_ENABLE #include "process_leader.h" #endif -#define DISABLE_CHORDING -#ifndef DISABLE_CHORDING - #include "process_chording.h" -#endif - #ifdef UNICODE_ENABLE #include "process_unicode.h" #endif diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h index 0ecc293a8..3b8795496 100644 --- a/quantum/quantum_keycodes.h +++ b/quantum/quantum_keycodes.h @@ -63,10 +63,6 @@ enum quantum_keycodes { QK_ONE_SHOT_LAYER_MAX = 0x54FF, QK_ONE_SHOT_MOD = 0x5500, QK_ONE_SHOT_MOD_MAX = 0x55FF, -#ifndef DISABLE_CHORDING - QK_CHORDING = 0x5600, - QK_CHORDING_MAX = 0x56FF, -#endif QK_TAP_DANCE = 0x5700, QK_TAP_DANCE_MAX = 0x57FF, QK_LAYER_TAP_TOGGLE = 0x5800, @@ -123,7 +119,7 @@ enum quantum_keycodes { GRAVE_ESC, // Leader key -#ifndef DISABLE_LEADER +#ifdef LEADER_ENABLE KC_LEAD, #endif diff --git a/tmk_core/common/action.c b/tmk_core/common/action.c index ae0864749..76d02bc9d 100644 --- a/tmk_core/common/action.c +++ b/tmk_core/common/action.c @@ -120,7 +120,7 @@ void process_hand_swap(keyevent_t *event) { } #endif -#if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS) +#if !defined(NO_ACTION_LAYER) && !defined(STRICT_LAYER_RELEASE) bool disable_action_cache = false; void process_record_nocache(keyrecord_t *record) diff --git a/tmk_core/common/action.h b/tmk_core/common/action.h index acc55c7d3..0322c73ed 100644 --- a/tmk_core/common/action.h +++ b/tmk_core/common/action.h @@ -62,7 +62,7 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt); bool process_record_quantum(keyrecord_t *record); /* Utilities for actions. */ -#if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS) +#if !defined(NO_ACTION_LAYER) && !defined(STRICT_LAYER_RELEASE) extern bool disable_action_cache; #endif diff --git a/tmk_core/common/action_layer.c b/tmk_core/common/action_layer.c index f3cd381ab..62375dfbf 100644 --- a/tmk_core/common/action_layer.c +++ b/tmk_core/common/action_layer.c @@ -219,7 +219,7 @@ void layer_debug(void) } #endif -#if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS) +#if !defined(NO_ACTION_LAYER) && !defined(STRICT_LAYER_RELEASE) uint8_t source_layers_cache[(MATRIX_ROWS * MATRIX_COLS + 7) / 8][MAX_LAYER_BITS] = {{0}}; void update_source_layers_cache(keypos_t key, uint8_t layer) @@ -263,7 +263,7 @@ uint8_t read_source_layers_cache(keypos_t key) */ action_t store_or_get_action(bool pressed, keypos_t key) { -#if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS) +#if !defined(NO_ACTION_LAYER) && !defined(STRICT_LAYER_RELEASE) if (disable_action_cache) { return layer_switch_get_action(key); } diff --git a/tmk_core/common/action_layer.h b/tmk_core/common/action_layer.h index 72a6bd8f6..7bf116be2 100644 --- a/tmk_core/common/action_layer.h +++ b/tmk_core/common/action_layer.h @@ -88,7 +88,7 @@ uint32_t layer_state_set_kb(uint32_t state); #endif /* pressed actions cache */ -#if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS) +#if !defined(NO_ACTION_LAYER) && !defined(STRICT_LAYER_RELEASE) /* The number of bits needed to represent the layer number: log2(32). */ #define MAX_LAYER_BITS 5 void update_source_layers_cache(keypos_t key, uint8_t layer); diff --git a/users/333fred/333fred_config.h b/users/333fred/333fred_config.h index 7c637d8d3..b158e2d5a 100644 --- a/users/333fred/333fred_config.h +++ b/users/333fred/333fred_config.h @@ -1,4 +1,3 @@ #pragma once -#define PREVENT_STUCK_MODIFIERS #define PERMISSIVE_HOLD diff --git a/users/bocaj/config.h b/users/bocaj/config.h index ce5ec65d6..0e726598c 100644 --- a/users/bocaj/config.h +++ b/users/bocaj/config.h @@ -10,7 +10,6 @@ // actually sends Ctrl-x. That's bad.) #define IGNORE_MOD_TAP_INTERRUPT #undef PERMISSIVE_HOLD -#define PREVENT_STUCK_MODIFIERS #ifdef TAPPING_TERM #undef TAPPING_TERM diff --git a/users/drashna/config.h b/users/drashna/config.h index dd6875ceb..92efcc5c7 100644 --- a/users/drashna/config.h +++ b/users/drashna/config.h @@ -43,7 +43,6 @@ // actually sends Ctrl-x. That's bad.) #define IGNORE_MOD_TAP_INTERRUPT #undef PERMISSIVE_HOLD -#define PREVENT_STUCK_MODIFIERS // #define TAPPING_FORCE_HOLD //#define RETRO_TAPPING @@ -64,8 +63,4 @@ #define NO_ACTION_MACRO #define NO_ACTION_FUNCTION -#define DISABLE_LEADER - #define MACRO_TIMER 5 - - diff --git a/users/ishtob/config.h b/users/ishtob/config.h index 9c4a7ed8d..1f567f4a5 100755 --- a/users/ishtob/config.h +++ b/users/ishtob/config.h @@ -15,7 +15,6 @@ //#define LEADER_TIMEOUT 300 //#define BACKLIGHT_BREATHING -#define PREVENT_STUCK_MODIFIERS //#define PERMISSIVE_HOLD // #define QMK_KEYS_PER_SCAN 4 @@ -72,5 +71,5 @@ // Most tactile encoders have detents every 4 stages #define ENCODER_RESOLUTION 4 - + #endif diff --git a/users/replicaJunction/config.h b/users/replicaJunction/config.h index f3556c87e..4b58b579f 100644 --- a/users/replicaJunction/config.h +++ b/users/replicaJunction/config.h @@ -6,12 +6,6 @@ // https://docs.qmk.fm/reference/config-options#features-that-can-be-enabled //////////////////////////////////////////////////////////////////////////////// -// Prevent modifiers from sticking when switching layers -// Uses 5 bytes of memory per 8 keys, but makes sure modifiers don't get "stuck" switching layers -#define PREVENT_STUCK_MODIFIERS - - - //////////////////////////////////////////////////////////////////////////////// // Behaviors That Can Be Configured // https://docs.qmk.fm/reference/config-options#behaviors-that-can-be-configured diff --git a/users/talljoe/config.h b/users/talljoe/config.h index 15bbde6bc..1cdbb5a41 100644 --- a/users/talljoe/config.h +++ b/users/talljoe/config.h @@ -1,7 +1,6 @@ #ifndef USERSPACE_CONFIG_H #define USERSPACE_CONFIG_H -#define PREVENT_STUCK_MODIFIERS #define IGNORE_MOD_TAP_INTERRUPT #define RESET_LAYER 15 diff --git a/users/wanleg/config.h b/users/wanleg/config.h index 22073449b..28e7690e6 100644 --- a/users/wanleg/config.h +++ b/users/wanleg/config.h @@ -1,8 +1,6 @@ #ifndef USERSPACE_CONFIG_H #define USERSPACE_CONFIG_H -#define PREVENT_STUCK_MODIFIERS - //TAPPING_TERM #ifdef TAP_DANCE_ENABLE #define TAPPING_TERM 200 diff --git a/users/zer09/config.h b/users/zer09/config.h index 766806462..4cb65c258 100644 --- a/users/zer09/config.h +++ b/users/zer09/config.h @@ -11,7 +11,7 @@ // actually sends Ctrl-x. That's bad.) #define IGNORE_MOD_TAP_INTERRUPT #undef PERMISSIVE_HOLD -#undef PREVENT_STUCK_MODIFIERS +#define STRICT_LAYER_RELEASE #define FORCE_NKRO From fe3bfd91c1a085716baa2b4396709ad5d77c7c75 Mon Sep 17 00:00:00 2001 From: wanleg <32079073+wanleg@users.noreply.github.com> Date: Mon, 17 Sep 2018 13:41:59 -0700 Subject: [PATCH 100/788] Keymap: Big switch config (#3904) * bigswitch keymap * bigswitch keymap * bigswitch keymap * bigswitch keymap * recommended edits made * forgot to revert this change with the others --- keyboards/bigswitch/bigswitch.c | 2 + keyboards/bigswitch/keymaps/wanleg/config.h | 45 ++++++++++++++++ keyboards/bigswitch/keymaps/wanleg/keymap.c | 27 ++++++++++ keyboards/bigswitch/keymaps/wanleg/rules.mk | 7 +++ users/wanleg/tapdances.c | 59 +++++++++++++++++++++ users/wanleg/wanleg.h | 1 + 6 files changed, 141 insertions(+) create mode 100644 keyboards/bigswitch/keymaps/wanleg/config.h create mode 100644 keyboards/bigswitch/keymaps/wanleg/keymap.c create mode 100644 keyboards/bigswitch/keymaps/wanleg/rules.mk diff --git a/keyboards/bigswitch/bigswitch.c b/keyboards/bigswitch/bigswitch.c index dfd9710e2..b924c7017 100644 --- a/keyboards/bigswitch/bigswitch.c +++ b/keyboards/bigswitch/bigswitch.c @@ -19,10 +19,12 @@ along with this program. If not, see . volatile uint8_t runonce = true; static uint16_t my_timer; +__attribute__ ((weak)) void matrix_init_user(void) { my_timer = timer_read(); } +__attribute__ ((weak)) void matrix_scan_user(void) { if (runonce && timer_elapsed(my_timer) > 1000) { runonce = false; diff --git a/keyboards/bigswitch/keymaps/wanleg/config.h b/keyboards/bigswitch/keymaps/wanleg/config.h new file mode 100644 index 000000000..f1e169345 --- /dev/null +++ b/keyboards/bigswitch/keymaps/wanleg/config.h @@ -0,0 +1,45 @@ +/* Copyright 2018 wanleg + * + * 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 . + */ + +#pragma once + +// place overrides here +#undef MATRIX_ROW_PINS +#define MATRIX_ROW_PINS { B4 } +#undef MATRIX_COL_PINS +#define MATRIX_COL_PINS { B6 } +//#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#undef DIODE_DIRECTION +#define DIODE_DIRECTION COL2ROW + +#define BACKLIGHT_PIN B5 +#define BACKLIGHT_BREATHING +#define BACKLIGHT_LEVELS 3 +#define BREATHING_PERIOD 5 + +/* for Tap Dance */ +#undef TAPPING_TERM +#define TAPPING_TERM 700 + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +//#define DEBOUNCING_DELAY 5 +#undef DEBOUNCING_DELAY +#define DEBOUNCING_DELAY 2 + +// set flashing LED with QMK DFU +#define QMK_LED B0 diff --git a/keyboards/bigswitch/keymaps/wanleg/keymap.c b/keyboards/bigswitch/keymaps/wanleg/keymap.c new file mode 100644 index 000000000..7f4150e58 --- /dev/null +++ b/keyboards/bigswitch/keymaps/wanleg/keymap.c @@ -0,0 +1,27 @@ +/* Copyright 2018 wanleg + * + * 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 . + */ +#include QMK_KEYBOARD_H +#include "wanleg.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = LAYOUT( /* Base */ +TD(CAD_TD) \ +), +}; + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/bigswitch/keymaps/wanleg/rules.mk b/keyboards/bigswitch/keymaps/wanleg/rules.mk new file mode 100644 index 000000000..bc4a1873f --- /dev/null +++ b/keyboards/bigswitch/keymaps/wanleg/rules.mk @@ -0,0 +1,7 @@ +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default + +#If using a ProMicro and it has the QMK DFU bootloader instead of Caterina, +#run "make : dfu=qmk" when compiling to ensure it is flagged properly after being flashed +ifeq ($(strip $(dfu)), qmk) + BOOTLOADER = qmk-dfu +endif \ No newline at end of file diff --git a/users/wanleg/tapdances.c b/users/wanleg/tapdances.c index 318810b1b..6a98b896a 100644 --- a/users/wanleg/tapdances.c +++ b/users/wanleg/tapdances.c @@ -94,6 +94,64 @@ void DEL_reset (qk_tap_dance_state_t *state, void *user_data) { } DELtap_state.state = 0; } + +//instantialize an instance of 'tap' for the 'CAD' tap dance. +static tap CADtap_state = { + .is_press_action = true, + .state = 0 +}; + +void CAD_finished (qk_tap_dance_state_t *state, void *user_data) { + CADtap_state.state = cur_dance(state); + switch (CADtap_state.state) { + case SINGLE_TAP: + //register_code(KC_SPC); + SEND_STRING(SS_LGUI("l")); + backlight_set(3); + break; + case SINGLE_HOLD: + //register_code(KC_NO); + //take a screenshot of a single window, open Paint and paste + SEND_STRING(SS_LALT(SS_TAP(X_PSCREEN)) SS_LGUI("r")); + _delay_ms(500); + SEND_STRING("mspaint" SS_TAP(X_ENTER)); + _delay_ms(700); + SEND_STRING(SS_LCTRL("v")); + break; //register this keycode when button is held + case DOUBLE_TAP: + //register_code(KC_ENT); + SEND_STRING(SS_LCTRL(SS_LALT(SS_TAP(X_DELETE)))); + backlight_set(0); + break; + //case DOUBLE_HOLD: register_code(KC_NO); break; //register this keycode when button is tapped and then held + case DOUBLE_HOLD: + reset_keyboard(); + break; //register this keycode when button is tapped and then held + case DOUBLE_SINGLE_TAP: register_code(KC_NO); unregister_code(KC_NO); register_code(KC_NO); + } +} + +void CAD_reset (qk_tap_dance_state_t *state, void *user_data) { + switch (CADtap_state.state) { + case SINGLE_TAP: + //unregister_code(KC_SPC); + SEND_STRING(SS_LGUI("l")); + backlight_set(3); + break; + case SINGLE_HOLD: + register_code(KC_NO); //(un)register this keycode when button is held and then released + //SEND_STRING(SS_LCTRL("v")); + break; + case DOUBLE_TAP: + //register_code(KC_ENT); + SEND_STRING(SS_LCTRL(SS_LALT(SS_TAP(X_DELETE)))); + backlight_set(0); + break; + case DOUBLE_HOLD: register_code(KC_NO); //(un)register this keycode when button is tapped and then held, and then released + case DOUBLE_SINGLE_TAP: unregister_code(KC_NO); + } + CADtap_state.state = 0; +} ///// QUAD FUNCTION TAP DANCE PERSONALIZATION SECTION END ///// //Tap Dance Definitions @@ -104,6 +162,7 @@ qk_tap_dance_action_t tap_dance_actions[] = { ,[TD_Q_ESC] = ACTION_TAP_DANCE_DOUBLE(KC_Q, KC_ESC) ,[ENT_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, ENT_finished, ENT_reset) ,[DEL_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, DEL_finished, DEL_reset) + ,[CAD_TD] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, CAD_finished, CAD_reset) }; //In Layer declaration, add tap dance item in place of a key code diff --git a/users/wanleg/wanleg.h b/users/wanleg/wanleg.h index 5cec82e60..8b98ec7dd 100644 --- a/users/wanleg/wanleg.h +++ b/users/wanleg/wanleg.h @@ -106,6 +106,7 @@ enum { ,TD_Q_ESC ,ENT_TAP_DANCE ,DEL_TAP_DANCE + ,CAD_TD }; #endif From ed2dd3b59c5fc7856a1b01a97ba5b22ed4f69317 Mon Sep 17 00:00:00 2001 From: Anthony Wharton Date: Mon, 17 Sep 2018 21:55:49 +0100 Subject: [PATCH 101/788] Keyboard: Add YMD96 instructions for Linux + Backlight Fixes (#3908) * Add flashing instructions for Linux * Make device/manufacturer name consistent for ymd96 * Disable command mode by default for YMD96 * Add function call to fix backlight for YMD96 * Add personal YMD96 config * Replace include with QMK macro * Move KEYMAP macro to keymap-level folder * Move custom KEYMAP macro to global LAYOUT_iso macro * Change transparent keymappings to global definition * Remove unecessary import and change to pragma once - (instead of repeated ifdef) * Remove global keymap/layout definition --- keyboards/ymd96/README.md | 14 +++-- keyboards/ymd96/config.h | 1 - .../ymd96/keymaps/AnthonyWharton/README.md | 16 +++++ .../ymd96/keymaps/AnthonyWharton/config.h | 63 +++++++++++++++++++ .../ymd96/keymaps/AnthonyWharton/keymap.c | 47 ++++++++++++++ keyboards/ymd96/matrix.c | 12 ---- keyboards/ymd96/rules.mk | 2 +- keyboards/ymd96/usbconfig.h | 8 +-- keyboards/ymd96/ymd96.h | 17 +++++ 9 files changed, 158 insertions(+), 22 deletions(-) create mode 100644 keyboards/ymd96/keymaps/AnthonyWharton/README.md create mode 100644 keyboards/ymd96/keymaps/AnthonyWharton/config.h create mode 100644 keyboards/ymd96/keymaps/AnthonyWharton/keymap.c diff --git a/keyboards/ymd96/README.md b/keyboards/ymd96/README.md index 7a950223b..9cb376058 100644 --- a/keyboards/ymd96/README.md +++ b/keyboards/ymd96/README.md @@ -31,17 +31,23 @@ This firmware was modified from [ps2avrGB](https://github.com/qmk/qmk_firmware/t ## Installing and Building -Since the YMD96 uses an ATmega32a chip instead of the 32u4, you need to download [HIDBootFlash v.1.0](http://vusb.wikidot.com/project:hidbootflash) for Windows. If anyone knows of a Linux/Mac bootflasher that works, edit this readme! +Since the YMD96 uses an ATmega32a chip instead of the 32u4, you need to download [HIDBootFlash v.1.0](http://vusb.wikidot.com/project:hidbootflash) for Windows. For Linux you can use the [bootloadHID](https://www.obdev.at/products/vusb/bootloadhid.html) utility (which will require building). Arch Linux users can alternatively install this from the [AUR](https://aur.archlinux.org/packages/bootloadhid/). On Windows, I use [MINGw](http://www.mingw.org/) to compile the keymaps. On Linux, you can simply use the terminal. Once you have those two pieces of software: -Build the keyboard with +Build the keyboard by navigating to the root folder of the QMK repo and running ``` -$ make ymd96-default +$ make ymd96:default ``` If you make your own layout, change the `default` word to whatever your layout is. -And flash the compiled hex file with `HIDBootFlash`. Simply put the board in flashing mode by plugging it in while holding control, and click `find device`. Then you can specify the .hex file and flash it to the device. +To flash the compiled hex file, simply put the board in flashing mode by plugging it in while holding control. +In `HIDBootFlash` first click `find device`, then you can specify the .hex file and flash it to the device. +For `bootloadHID`, from a terminal that is in the same folder as your firmware file, run +``` +$ sudo bootloadHID ymd96_default.hex +``` +Again replacing default with your custom keymap name if required. ## Troubleshooting diff --git a/keyboards/ymd96/config.h b/keyboards/ymd96/config.h index 3122c694e..1e9497fac 100644 --- a/keyboards/ymd96/config.h +++ b/keyboards/ymd96/config.h @@ -23,7 +23,6 @@ along with this program. If not, see . #define VENDOR_ID 0x20A0 #define PRODUCT_ID 0x422D -// TODO: share these strings with usbconfig.h // Edit usbconfig.h to change these. #define MANUFACTURER ymdkey #define PRODUCT ymd96 diff --git a/keyboards/ymd96/keymaps/AnthonyWharton/README.md b/keyboards/ymd96/keymaps/AnthonyWharton/README.md new file mode 100644 index 000000000..973e336cb --- /dev/null +++ b/keyboards/ymd96/keymaps/AnthonyWharton/README.md @@ -0,0 +1,16 @@ +# Personal Config by @AnthonyWharton + +The keymap and layout macro's in the main repository are for the following +keyboard: + +![@AnthonyWharton's YMD96](https://i.imgur.com/uhKmkBz.jpg) + +**Note:** This setup has locking Caps Lock and Num Lock keys, so if you wish +to use this layout and do not have such keys, you should : + + - Change the keys `KC_LCAP` and `KC_LNUM` to `KC_CAPS` and `KC_NUMLOCK` + respectively. + - Remove the `LOCKING_SUPPORT_ENABLE` and `LOCKING_RESYNC_ENABLE` lines + from `config.h`. + +For any other questions, find my latest contact information on my github page. diff --git a/keyboards/ymd96/keymaps/AnthonyWharton/config.h b/keyboards/ymd96/keymaps/AnthonyWharton/config.h new file mode 100644 index 000000000..715e2c9a5 --- /dev/null +++ b/keyboards/ymd96/keymaps/AnthonyWharton/config.h @@ -0,0 +1,63 @@ +/* +Base Copyright 2017 Luiz Ribeiro +Modified 2017 Andrew Novak +Modified 2018 Anthony Wharton + +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 . +*/ + +#pragma once + +#define VENDOR_ID 0x20A0 +#define PRODUCT_ID 0x422D +// Edit usbconfig.h to change these. +#define MANUFACTURER ymdkey +#define PRODUCT ymd96 + +/* Matrix Size */ +#define MATRIX_ROWS 8 +#define MATRIX_COLS 15 +#define DIODE_DIRECTION COL2ROW + +/* Required for MX Locks installed */ +#define LOCKING_SUPPORT_ENABLE +#define LOCKING_RESYNC_ENABLE + +#define PREVENT_STUCK_MODIFIERS +#define TAPPING_TOGGLE 3 +#define NO_UART 1 + +#define BACKLIGHT_LEVELS 12 + +/* RGB Underglow */ +// The RGB_DI_PING value seems to be shared between all PS2AVRGB boards. +// The same pin is used on the JJ40, at least. +#define RGBLED_NUM 18 +#define RGB_DI_PIN E2 // NOTE: for PS2AVRGB boards, underglow commands are send + // via I2C to 0xB0 + +#define RGBLIGHT_ANIMATIONS + +#define RGBLIGHT_EFFECT_BREATHE_CENTER 1.85 // 1.0-2.7 +#define RGBLIGHT_EFFECT_BREATHE_MAX 255 // 1-255 +#define RGBLIGHT_EFFECT_SNAKE_LENGTH 7 +#define RGBLIGHT_EFFECT_KNIGHT_LENGTH 3 +#define RGBLIGHT_EFFECT_KNIGHT_OFFSET 0 +#define RGBLIGHT_EFFECT_KNIGHT_LED_NUM RGBLED_NUM +#define RGBLIGHT_EFFECT_CHRISTMAS_STEP 1 +#define RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL 500 + +/* key combination for command */ +#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) + diff --git a/keyboards/ymd96/keymaps/AnthonyWharton/keymap.c b/keyboards/ymd96/keymaps/AnthonyWharton/keymap.c new file mode 100644 index 000000000..2b3e2e2c7 --- /dev/null +++ b/keyboards/ymd96/keymaps/AnthonyWharton/keymap.c @@ -0,0 +1,47 @@ +/* +Base Copyright 2017 Luiz Ribeiro +Modified 2017 Andrew Novak +Modified 2018 Anthony Wharton + +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 LicensezZZ +along with this program. If not, see . +*/ + +#include QMK_KEYBOARD_H + +#define _DEFLT 0 +#define _RAISE 1 + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* Layer 0, default layer */ + [_DEFLT] = LAYOUT_iso( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_HOME, KC_END, KC_INS, KC_DEL, KC_PGUP, \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_LNUM, KC_PSLS, KC_PAST, KC_PGDN, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_ENT, KC_P7, KC_P8, KC_P9, KC_PMNS, \ + KC_LCAP, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_P4, KC_P5, KC_P6, KC_PPLS, \ + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(_RAISE), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT \ + ), + + /* Layer 1, raise layer */ + [_RAISE] = LAYOUT_iso( + _______, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, _______, KC_PAUS, KC_SLCK, _______, _______, _______, \ + _______, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW,RGB_M_SN,RGB_M_K, RGB_M_X, RGB_M_G, BL_OFF, BL_ON, BL_DEC, BL_INC, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_VAD, RGB_VAI, KC_MUTE, _______, KC_VOLU, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, BL_TOGG, KC_MPRV, KC_MPLY, KC_MNXT, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, _______, KC_VOLD, _______, KC_LOCK, \ + _______, _______, KC_RALT, _______, _______, _______, KC_HOME, KC_PGDN, KC_END, _______, _______ \ + ) +}; diff --git a/keyboards/ymd96/matrix.c b/keyboards/ymd96/matrix.c index f2ecf4d33..2932976dd 100644 --- a/keyboards/ymd96/matrix.c +++ b/keyboards/ymd96/matrix.c @@ -50,20 +50,8 @@ void matrix_init(void) { matrix[row] = 0x00; matrix_debouncing[row] = 0x00; } -/*} matrix_init_quantum(); // missing from original port by Luiz -void matrix_set_row_status(uint8_t row) { - DDRB = (1 << row); - PORTB = ~(1 << row); -}*/ - - -/*uint8_t bit_reverse(uint8_t x) { - x = ((x >> 1) & 0x55) | ((x << 1) & 0xaa); - x = ((x >> 2) & 0x33) | ((x << 2) & 0xcc); - x = ((x >> 4) & 0x0f) | ((x << 4) & 0xf0); - return x;*/ } uint8_t matrix_scan(void) { diff --git a/keyboards/ymd96/rules.mk b/keyboards/ymd96/rules.mk index 42b3d1155..1cc4060b0 100644 --- a/keyboards/ymd96/rules.mk +++ b/keyboards/ymd96/rules.mk @@ -35,7 +35,7 @@ BOOTMAGIC_ENABLE = no MOUSEKEY_ENABLE = no EXTRAKEY_ENABLE = yes CONSOLE_ENABLE = no -COMMAND_ENABLE = yes +COMMAND_ENABLE = no BACKLIGHT_ENABLE = yes BACKLIGHT_CUSTOM_DRIVER = yes diff --git a/keyboards/ymd96/usbconfig.h b/keyboards/ymd96/usbconfig.h index 50fe4ed11..a90a36f08 100644 --- a/keyboards/ymd96/usbconfig.h +++ b/keyboards/ymd96/usbconfig.h @@ -242,8 +242,8 @@ section at the end of this file). #define USB_CFG_DEVICE_VERSION 0x00, 0x02 /* Version number of the device: Minor number first, then major number. */ -#define USB_CFG_VENDOR_NAME 'w', 'i', 'n', 'k', 'e', 'y', 'l', 'e', 's', 's', '.', 'k', 'r' -#define USB_CFG_VENDOR_NAME_LEN 13 +#define USB_CFG_VENDOR_NAME 'y','m','d','k','e','y' +#define USB_CFG_VENDOR_NAME_LEN 6 /* These two values define the vendor name returned by the USB device. The name * must be given as a list of characters under single quotes. The characters * are interpreted as Unicode (UTF-16) entities. @@ -252,8 +252,8 @@ section at the end of this file). * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for * details. */ -#define USB_CFG_DEVICE_NAME 'p', 's', '2', 'a', 'v', 'r', 'G', 'B' -#define USB_CFG_DEVICE_NAME_LEN 8 +#define USB_CFG_DEVICE_NAME 'y','m','d','9','6' +#define USB_CFG_DEVICE_NAME_LEN 5 /* Same as above for the device name. If you don't want a device name, undefine * the macros. See the file USB-IDs-for-free.txt before you assign a name if * you use a shared VID/PID. diff --git a/keyboards/ymd96/ymd96.h b/keyboards/ymd96/ymd96.h index ee0926eee..9c25f2219 100644 --- a/keyboards/ymd96/ymd96.h +++ b/keyboards/ymd96/ymd96.h @@ -76,5 +76,22 @@ K411, K410, K409, K408, K404, K405, K406, K407, K403, K402, K401, K400 \ { K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411 }, \ } +#define LAYOUT_iso( \ + K0500, K0502, K0503, K0504, K0505, K0600, K0610, K0710, K0700, K0511, K0512, K0513, K0514, K0113, K0214, K0013, K0706, K0709, K0708, \ + K0400, K0401, K0402, K0403, K0404, K0405, K0601, K0611, K0711, K0701, K0410, K0411, K0412, K0414, K0406, K0407, K0408, K0409, \ + K0300, K0301, K0302, K0303, K0304, K0305, K0602, K0612, K0712, K0702, K0310, K0311, K0312, K0213, K0306, K0307, K0308, K0309, \ + K0200, K0201, K0202, K0203, K0204, K0205, K0603, K0613, K0713, K0703, K0210, K0211, K0212, K0206, K0207, K0208, K0209, \ + K0100, K0003, K0101, K0102, K0103, K0104, K0105, K0604, K0614, K0714, K0704, K0110, K0111, K0608, K0106, K0107, K0108, K0009, \ + K0000, K0001, K0002, K0605, K0705, K0011, K0606, K0607, K0609, K0006, K0008 \ +) { \ + { K0000, K0001, K0002, K0003, KC_NO, KC_NO, K0006, KC_NO, K0008, K0009, KC_NO, K0011, KC_NO, K0013, KC_NO, }, \ + { K0100, K0101, K0102, K0103, K0104, K0105, K0106, K0107, K0108, KC_NO, K0110, K0111, KC_NO, K0113, KC_NO, }, \ + { K0200, K0201, K0202, K0203, K0204, K0205, K0206, K0207, K0208, K0209, K0210, K0211, K0212, K0213, K0214, }, \ + { K0300, K0301, K0302, K0303, K0304, K0305, K0306, K0307, K0308, K0309, K0310, K0311, K0312, KC_NO, KC_NO, }, \ + { K0400, K0401, K0402, K0403, K0404, K0405, K0406, K0407, K0408, K0409, K0410, K0411, K0412, KC_NO, K0414, }, \ + { K0500, KC_NO, K0502, K0503, K0504, K0505, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, K0511, K0512, K0513, K0514, }, \ + { K0600, K0601, K0602, K0603, K0604, K0605, K0606, K0607, K0608, K0609, K0610, K0611, K0612, K0613, K0614, }, \ + { K0700, K0701, K0702, K0703, K0704, K0705, K0706, KC_NO, K0708, K0709, K0710, K0711, K0712, K0713, K0714 } \ +} #endif From 3f680a93eb38408d1fc6b0c78ee94b542cbc7aee Mon Sep 17 00:00:00 2001 From: Pascal Greilich Date: Mon, 17 Sep 2018 17:09:41 -0400 Subject: [PATCH 102/788] Keyboard: Tada68 readme img (#3918) * a new planck layout * layout images * layout images 2 * typo * update include following PR comment * updates following PR commments 2 * updates following PR comments * layout images * better layout names --- keyboards/tada68/keymaps/pascamel/readme.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/keyboards/tada68/keymaps/pascamel/readme.md b/keyboards/tada68/keymaps/pascamel/readme.md index 640ca2734..a829133fc 100755 --- a/keyboards/tada68/keymaps/pascamel/readme.md +++ b/keyboards/tada68/keymaps/pascamel/readme.md @@ -1,3 +1,11 @@ # pascamel's TADA68 layout -A layout based on raylas' layout with some updates on the fn layer especially around media keys. \ No newline at end of file +A layout based on raylas' layout with some updates on the fn layer especially around media keys. + +### Main layer + +![Imgur](https://i.imgur.com/UColvfc.png) + +### Fn layer + +![Imgur](https://i.imgur.com/pDQFoCQ.png) From 244e1c5a57eecd349c7d88e1af42d1b3467aeafe Mon Sep 17 00:00:00 2001 From: dsissitka Date: Sun, 16 Sep 2018 17:49:20 -0400 Subject: [PATCH 103/788] Fix LEADER_KEY docs. LEADER_KEY needs to be set in config.h, not keymap.c. Credit goes to @randywallace for figuring this one out: https://github.com/qmk/qmk_firmware/issues/2514#issuecomment-384847485 --- docs/feature_leader_key.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/feature_leader_key.md b/docs/feature_leader_key.md index 0c3f4a133..92aebd463 100644 --- a/docs/feature_leader_key.md +++ b/docs/feature_leader_key.md @@ -5,7 +5,7 @@ If you've ever used Vim, you know what a Leader key is. If not, you're about to That's what `KC_LEAD` does. Here's an example: 1. Pick a key on your keyboard you want to use as the Leader key. Assign it the keycode `KC_LEAD`. This key would be dedicated just for this -- it's a single action key, can't be used for anything else. -2. Include the line `#define LEADER_TIMEOUT 300` somewhere in your keymap.c file, probably near the top. The 300 there is 300ms -- that's how long you have for the sequence of keys following the leader. You can tweak this value for comfort, of course. +2. Include the line `#define LEADER_TIMEOUT 300` in your config.h. The 300 there is 300ms -- that's how long you have for the sequence of keys following the leader. You can tweak this value for comfort, of course. 3. Within your `matrix_scan_user` function, do something like this: ``` From a6d1db2c275f2e33e23135a6e410dbc8d19720a2 Mon Sep 17 00:00:00 2001 From: Joe Wasson Date: Mon, 17 Sep 2018 09:23:43 -0700 Subject: [PATCH 104/788] Create AG_TOGG code to toggle Alt/Gui swap. --- docs/feature_bootmagic.md | 1 + docs/keycodes.md | 1 + quantum/quantum.c | 11 +++++++++++ quantum/quantum_keycodes.h | 2 ++ 4 files changed, 15 insertions(+) diff --git a/docs/feature_bootmagic.md b/docs/feature_bootmagic.md index d6915d355..586b5d837 100644 --- a/docs/feature_bootmagic.md +++ b/docs/feature_bootmagic.md @@ -57,6 +57,7 @@ Hold down the Bootmagic key (Space by default) and the desired hotkey while plug |`MAGIC_UNNO_GUI` | |Enable the GUI keys | |`MAGIC_SWAP_ALT_GUI` |`AG_SWAP`|Swap Alt and GUI on both sides (for macOS)| |`MAGIC_UNSWAP_ALT_GUI` |`AG_NORM`|Unswap Left Alt and Left GUI | +|`MAGIC_TOGGLE_ALT_GUI` |`AG_TOGG`|Toggle Left Alt and GUI swap | |`MAGIC_SWAP_BACKSLASH_BACKSPACE` | |Swap `\` and Backspace | |`MAGIC_UNSWAP_BACKSLASH_BACKSPACE`| |Unswap `\` and Backspace | |`MAGIC_SWAP_CONTROL_CAPSLOCK` | |Swap Left Control and Caps Lock | diff --git a/docs/keycodes.md b/docs/keycodes.md index c344a7528..6676bb53c 100644 --- a/docs/keycodes.md +++ b/docs/keycodes.md @@ -271,6 +271,7 @@ This is a reference only. Each group of keys links to the page documenting their |`MAGIC_UNSWAP_BACKSLASH_BACKSPACE`| |Unswap `\` and Backspace | |`MAGIC_UNHOST_NKRO` | |Force NKRO off | |`MAGIC_UNSWAP_ALT_GUI` |`AG_NORM`|Unswap Alt and GUI on both sides | +|`MAGIC_TOGGLE_ALT_GUI` |`AG_TOGG`|Toggle Alt and GUI swap on both sides| |`MAGIC_TOGGLE_NKRO` | |Turn NKRO on or off | ## [Bluetooth](feature_bluetooth.md) diff --git a/quantum/quantum.c b/quantum/quantum.c index 9bf91eb86..84ccbdeab 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -626,6 +626,17 @@ bool process_record_quantum(keyrecord_t *record) { PLAY_SONG(ag_norm_song); #endif break; + case MAGIC_TOGGLE_ALT_GUI: + keymap_config.swap_lalt_lgui = !keymap_config.swap_lalt_lgui; + keymap_config.swap_ralt_rgui = !keymap_config.swap_ralt_rgui; + #ifdef AUDIO_ENABLE + if (keymap_config.swap_ralt_rgui) { + PLAY_SONG(ag_swap_song); + } else { + PLAY_SONG(ag_norm_song); + } + #endif + break; case MAGIC_TOGGLE_NKRO: keymap_config.nkro = !keymap_config.nkro; break; diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h index 3b8795496..050d2d275 100644 --- a/quantum/quantum_keycodes.h +++ b/quantum/quantum_keycodes.h @@ -116,6 +116,7 @@ enum quantum_keycodes { MAGIC_UNHOST_NKRO, MAGIC_UNSWAP_ALT_GUI, MAGIC_TOGGLE_NKRO, + MAGIC_TOGGLE_ALT_GUI, GRAVE_ESC, // Leader key @@ -590,6 +591,7 @@ enum quantum_keycodes { #define AG_SWAP MAGIC_SWAP_ALT_GUI #define AG_NORM MAGIC_UNSWAP_ALT_GUI +#define AG_TOGG MAGIC_TOGGLE_ALT_GUI // GOTO layer - 16 layers max // when: From cb8d352cb3902612b118bf813d0459a2cd68473e Mon Sep 17 00:00:00 2001 From: Olivier Poitrey Date: Mon, 17 Sep 2018 15:10:00 -0700 Subject: [PATCH 105/788] Keymap: dz60/macos_arrow: fix rev3 broken media layer (#3928) Last rev broke the media layer because of a typo in layer definition. Switched to an enum to avoid similar future typos. --- keyboards/dz60/keymaps/macos_arrow/keymap.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/keyboards/dz60/keymaps/macos_arrow/keymap.c b/keyboards/dz60/keymaps/macos_arrow/keymap.c index 9a3120afd..7106092a4 100644 --- a/keyboards/dz60/keymaps/macos_arrow/keymap.c +++ b/keyboards/dz60/keymaps/macos_arrow/keymap.c @@ -1,9 +1,11 @@ #include QMK_KEYBOARD_H -#define _BL 0 // Base layer -#define _FL 1 // Function layer -#define _ML 2 // Media layer -#define _NL 2 // Numpad layer +enum dz60_layers { + _BL, // Base layer + _FL, // Function layer + _ML, // Media layer + _NL // Numpad layer +}; enum my_keycodes { BR_UP = SAFE_RANGE, From ec64be6622f73500f852149b7ab5460b6db5bac0 Mon Sep 17 00:00:00 2001 From: Merlin04 Date: Mon, 17 Sep 2018 15:18:19 -0700 Subject: [PATCH 106/788] Keyboard: Fix pin numbers for Fractal keyboard (#3743) * Added support for the Fractal keyboard * Try to fix the issue * Add support for the Fractal keyboard. * Fix errors with files * Update config.h --- keyboards/fractal/config.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/keyboards/fractal/config.h b/keyboards/fractal/config.h index 1a5901f98..396c3b4b9 100755 --- a/keyboards/fractal/config.h +++ b/keyboards/fractal/config.h @@ -17,7 +17,8 @@ /* key matrix pins */ #define MATRIX_ROW_PINS { B1, F7, F6, F5, F4 } -#define MATRIX_COL_PINS { B3, B2, B6, B5, B4, E6, D7, C6, D4, D0, D1, D2 } +#define MATRIX_COL_PINS { B3, B2, B6, B5, B4, E6, D7, C6, D4, D0, D1, D3 } + #define UNUSED_PINS /* COL2ROW or ROW2COL */ From 03b8ce206d566bf7f75771b55e05aea6ea6dba2d Mon Sep 17 00:00:00 2001 From: James Laird-Wah Date: Tue, 18 Sep 2018 08:49:20 +1000 Subject: [PATCH 107/788] Keyboard: add Keyboardio Model 01 (#3900) * Keyboard: add Keyboardio Model01 This port implements key scanning and everything in their default keymap. It doesn't implement mouse warping; QMK can't do that (yet). LED control is mostly not implemented. The ability to set all LEDs is included because they can get stuck on coming from the bootloader otherwise. Single LED control is also implemented for numpad indication. The scanners also support batch LED transfer which is what you'd need if you wanted to do fast effects. Gamma correction is also not implemented, but is present in the original firmware. The necessary info for further implementation is in the KeyboardioScanner module for Kaleidoscope. To install on your keyboard: make model01:avrdude When prompted, hold the "prog" key on the keyboard to put it into programming mode. This can also be achieved by holding the "prog" key while plugging in the keyboard. This works even if the firmware is corrupt or missing. Hot plugging the halves seems to work fine, but there is no explicit support for eg. making sure the matrix scan rate is reconfigured. * model01: clean up includes and include guards Uses #pragma once everywhere. * model01: split LED and matrix code This makes space if someone wants to implement better LED support later on, the keyboard is a lot more capable than the current code. * model01: separate I2C timeouts for matrix vs. LED If the scanners have no data they don't ACK reads and just time out. So we want a pretty short timeout to keep scan rates high. Meanwhile the LED transfers might take longer - I don't know though, so here we are conservative. * model01: implement better LED control - gamma correction from the manufacturer's firmware - suitable delays to allow back to back LED writes - this is fast enough to write the whole keyboard without noticeable delay, in my experience - minor bug fix: RHS Fn key was not addressable * model01: add license to wire-protocol-constants.h * model01: replace gamma LUT The original was of unclear license origin. This one is functionally identical and includes a generator should people wish to adjust it. * model01: use the already-present CIE1931 lightness curve ...rather than baking in another gamma curve. It's said that CIE1931 is the right thing to be using rather than gamma. OK. Let it be so. * model01: call matrix_init_user() from matrix_init_kb() * model01: remove inapplicable config options from rules.mk * model01: readme.md: update build environment links --- keyboards/model01/config.h | 35 ++++++++ keyboards/model01/info.json | 4 + keyboards/model01/keymaps/default/config.h | 19 +++++ keyboards/model01/keymaps/default/keymap.c | 93 ++++++++++++++++++++ keyboards/model01/keymaps/default/readme.md | 3 + keyboards/model01/keymaps/default/rules.mk | 2 + keyboards/model01/leds.c | 57 +++++++++++++ keyboards/model01/leds.h | 25 ++++++ keyboards/model01/matrix.c | 94 +++++++++++++++++++++ keyboards/model01/model01.c | 38 +++++++++ keyboards/model01/model01.h | 50 +++++++++++ keyboards/model01/readme.md | 37 ++++++++ keyboards/model01/rules.mk | 62 ++++++++++++++ keyboards/model01/wire-protocol-constants.h | 53 ++++++++++++ 14 files changed, 572 insertions(+) create mode 100644 keyboards/model01/config.h create mode 100644 keyboards/model01/info.json create mode 100644 keyboards/model01/keymaps/default/config.h create mode 100644 keyboards/model01/keymaps/default/keymap.c create mode 100644 keyboards/model01/keymaps/default/readme.md create mode 100644 keyboards/model01/keymaps/default/rules.mk create mode 100644 keyboards/model01/leds.c create mode 100644 keyboards/model01/leds.h create mode 100644 keyboards/model01/matrix.c create mode 100644 keyboards/model01/model01.c create mode 100644 keyboards/model01/model01.h create mode 100644 keyboards/model01/readme.md create mode 100644 keyboards/model01/rules.mk create mode 100644 keyboards/model01/wire-protocol-constants.h diff --git a/keyboards/model01/config.h b/keyboards/model01/config.h new file mode 100644 index 000000000..796653f45 --- /dev/null +++ b/keyboards/model01/config.h @@ -0,0 +1,35 @@ +/* +Copyright 2018 James Laird-Wah + +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 . +*/ + +#pragma once + +#include + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0x1209 +#define PRODUCT_ID 0x2301 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Keyboardio +#define PRODUCT Model 01 +#define DESCRIPTION (QMK) + +/* key matrix size; rows are doubled for split */ +#define MATRIX_ROWS 8 +#define MATRIX_COLS 8 + +/* The scanners already debounce for us */ +#define DEBOUNCING_DELAY 0 diff --git a/keyboards/model01/info.json b/keyboards/model01/info.json new file mode 100644 index 000000000..daf51492d --- /dev/null +++ b/keyboards/model01/info.json @@ -0,0 +1,4 @@ +{ + "keyboard_name": "model01", + "url": "https://keyboard.io" +} diff --git a/keyboards/model01/keymaps/default/config.h b/keyboards/model01/keymaps/default/config.h new file mode 100644 index 000000000..8ab9d8b02 --- /dev/null +++ b/keyboards/model01/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 James Laird-Wah + * + * 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 . + */ + +#pragma once + +/* place overrides here */ diff --git a/keyboards/model01/keymaps/default/keymap.c b/keyboards/model01/keymaps/default/keymap.c new file mode 100644 index 000000000..cdc050cd9 --- /dev/null +++ b/keyboards/model01/keymaps/default/keymap.c @@ -0,0 +1,93 @@ +/* Copyright 2018 James Laird-Wah + * + * 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 . + */ +#include QMK_KEYBOARD_H + +/* layer constants */ +enum { + DEF = 0, + NUM, + FUN, +}; + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[DEF] = LAYOUT( + RESET , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , TG(NUM), + KC_GRV , KC_Q , KC_W , KC_E , KC_R , KC_T , _______, _______, KC_Y , KC_U , KC_I , KC_O , KC_P , KC_EQL , + KC_PGUP, KC_A , KC_S , KC_D , KC_F , KC_G , KC_TAB , KC_ENT , KC_H , KC_J , KC_K , KC_L , KC_SCLN, KC_QUOT, + KC_PGDN, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_ESC , _______, KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, KC_MINS, + KC_LCTL, KC_RCTL, + KC_BSPC, KC_SPC , + KC_LGUI, KC_RALT, + KC_LSFT, KC_RSFT, + MO(FUN), MO(FUN) + ), +[NUM] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, KC_P7 , KC_P8 , KC_P9 , KC_PMNS, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_P4 , KC_P5 , KC_P6 , KC_PPLS, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_P1 , KC_P2 , KC_P3 , KC_PEQL, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_P0 , KC_PDOT, KC_PAST, KC_PSLS, KC_PENT, + _______, _______, + _______, _______, + _______, _______, + _______, _______, + _______, _______ + ), +[FUN] = LAYOUT( + _______, KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , + KC_TAB , _______, KC_MS_U, _______, KC_BTN3, _______, _______, KC_MPRV, KC_MNXT, KC_LCBR, KC_RCBR, KC_LBRC, KC_RBRC, KC_F12 , + KC_HOME, KC_MS_L, KC_MS_D, KC_MS_R, KC_BTN1, _______, _______, KC_MPLY, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT, _______, _______, + KC_END , KC_PSCR, KC_INS , _______, KC_BTN2, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, KC_BSLS, KC_PIPE, + _______, _______, + KC_DEL , KC_ENT , + _______, _______, + _______, _______, + _______, _______ + ) +}; + +/* template for new layouts: +LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, + _______, _______, + _______, _______, + _______, _______, + _______, _______ + ) +*/ + +uint32_t layer_state_set_user(uint32_t state) { + switch (biton32(state)) { + case DEF: + set_all_leds_to(0,0,0); + break; + case NUM: + /* highlight the numpad keys when numlock is on */ + for (int i=44; i<=60; i++) { + set_led_to(i, 128,0,0); + } + set_led_to(63, 128, 0, 0); + break; + } + + return state; +} + +/* vim: set ts=2 sw=2 et: */ diff --git a/keyboards/model01/keymaps/default/readme.md b/keyboards/model01/keymaps/default/readme.md new file mode 100644 index 000000000..740515a26 --- /dev/null +++ b/keyboards/model01/keymaps/default/readme.md @@ -0,0 +1,3 @@ +# The default keymap for Keyboardio's Model01 + +This implements all of their default keymap, except for mouse warping. diff --git a/keyboards/model01/keymaps/default/rules.mk b/keyboards/model01/keymaps/default/rules.mk new file mode 100644 index 000000000..4d1abd88a --- /dev/null +++ b/keyboards/model01/keymaps/default/rules.mk @@ -0,0 +1,2 @@ +# used by default keymap +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) diff --git a/keyboards/model01/leds.c b/keyboards/model01/leds.c new file mode 100644 index 000000000..b80a749a7 --- /dev/null +++ b/keyboards/model01/leds.c @@ -0,0 +1,57 @@ +/* Copyright 2018 James Laird-Wah + * + * 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 . + */ +#include +#include +#include +#include "model01.h" + +#define I2C_TIMEOUT 1000 + +#define LINCOR(i) pgm_read_byte(&CIE1931_CURVE[i]) + +int set_all_leds_to_raw(uint8_t r, uint8_t g, uint8_t b) { + uint8_t buf[] = { + TWI_CMD_LED_SET_ALL_TO, + b, g, r + }; + int ret = 0; + ret |= i2c_transmit(I2C_ADDR(LEFT), buf, sizeof(buf), I2C_TIMEOUT); + ret |= i2c_transmit(I2C_ADDR(RIGHT), buf, sizeof(buf), I2C_TIMEOUT); + _delay_us(10); + return ret; +} + +int set_all_leds_to(uint8_t r, uint8_t g, uint8_t b) { + return set_all_leds_to_raw(LINCOR(r), LINCOR(g), LINCOR(b)); +} + +int set_led_to_raw(uint8_t led, uint8_t r, uint8_t g, uint8_t b) { + uint8_t buf[] = { + TWI_CMD_LED_SET_ONE_TO, + led & 0x1f, + b, g, r + }; + int hand = (led >= 32) ? RIGHT : LEFT; + int ret = i2c_transmit(I2C_ADDR(hand), buf, sizeof(buf), I2C_TIMEOUT); + _delay_us(10); + return ret; +} + +int set_led_to(uint8_t led, uint8_t r, uint8_t g, uint8_t b) { + return set_led_to_raw(led, LINCOR(r), LINCOR(g), LINCOR(b)); +} + +/* vim: set ts=2 sw=2 et: */ diff --git a/keyboards/model01/leds.h b/keyboards/model01/leds.h new file mode 100644 index 000000000..0aac781dd --- /dev/null +++ b/keyboards/model01/leds.h @@ -0,0 +1,25 @@ +/* Copyright 2018 James Laird-Wah + * + * 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 . + */ +#pragma once + +#include + +int set_all_leds_to(uint8_t r, uint8_t g, uint8_t b); +int set_led_to(uint8_t led, uint8_t r, uint8_t g, uint8_t b); + +/* Raw (gamma uncorrected) LED values */ +int set_all_leds_to_raw(uint8_t r, uint8_t g, uint8_t b); +int set_led_to_raw(uint8_t led, uint8_t r, uint8_t g, uint8_t b); diff --git a/keyboards/model01/matrix.c b/keyboards/model01/matrix.c new file mode 100644 index 000000000..f1f9024c7 --- /dev/null +++ b/keyboards/model01/matrix.c @@ -0,0 +1,94 @@ +/* Copyright 2018 James Laird-Wah + * + * 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 . + */ +#include +#include +#include +#include "model01.h" + +/* If no key events have occurred, the scanners will time out on reads. + * So we don't want to be too permissive here. */ +#define I2C_TIMEOUT 10 + +static matrix_row_t rows[MATRIX_ROWS]; +#define ROWS_PER_HAND (MATRIX_ROWS / 2) + +inline +uint8_t matrix_rows(void) { + return MATRIX_ROWS; +} + +inline +uint8_t matrix_cols(void) { + return MATRIX_COLS; +} + +static int i2c_read_hand(int hand) { + uint8_t buf[5]; + i2c_status_t ret = i2c_receive(I2C_ADDR(hand), buf, sizeof(buf), I2C_TIMEOUT); + if (ret != I2C_STATUS_SUCCESS) + return 1; + + if (buf[0] != TWI_REPLY_KEYDATA) + return 2; + + int start_row = hand ? ROWS_PER_HAND : 0; + uint8_t *out = &rows[start_row]; + memcpy(out, &buf[1], 4); + return 0; +} + +static int i2c_set_keyscan_interval(int hand, int delay) { + uint8_t buf[] = {TWI_CMD_KEYSCAN_INTERVAL, delay}; + i2c_status_t ret = i2c_transmit(I2C_ADDR(hand), buf, sizeof(buf), I2C_TIMEOUT); + return ret; +} + +void matrix_init(void) { + /* Ensure scanner power is on - else right hand will not work */ + DDRC |= _BV(7); + PORTC |= _BV(7); + + i2c_init(); + i2c_set_keyscan_interval(LEFT, 2); + i2c_set_keyscan_interval(RIGHT, 2); + memset(rows, 0, sizeof(rows)); + + matrix_init_quantum(); +} + +uint8_t matrix_scan(void) { + uint8_t ret = 0; + ret |= i2c_read_hand(LEFT); + ret |= i2c_read_hand(RIGHT); + matrix_scan_quantum(); + return ret; +} + +inline +matrix_row_t matrix_get_row(uint8_t row) { + return rows[row]; +} + +void matrix_print(void) { + print("\nr/c 0123456789ABCDEF\n"); + for (uint8_t row = 0; row < MATRIX_ROWS; row++) { + phex(row); print(": "); + pbin_reverse16(matrix_get_row(row)); + print("\n"); + } +} + +/* vim: set ts=2 sw=2 et: */ diff --git a/keyboards/model01/model01.c b/keyboards/model01/model01.c new file mode 100644 index 000000000..29615ca86 --- /dev/null +++ b/keyboards/model01/model01.c @@ -0,0 +1,38 @@ +/* Copyright 2018 James Laird-Wah + * + * 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 . + */ +#include +#include +#include +#include "model01.h" + +void matrix_init_kb(void) { + /* the bootloader can leave LEDs on, so */ + set_all_leds_to(0, 0, 0); + matrix_init_user(); +} + +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + diff --git a/keyboards/model01/model01.h b/keyboards/model01/model01.h new file mode 100644 index 000000000..a83e33cd8 --- /dev/null +++ b/keyboards/model01/model01.h @@ -0,0 +1,50 @@ +/* Copyright 2018 James Laird-Wah + * + * 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 . + */ +#pragma once + +#include + +#define LAYOUT( \ + L07, L06, L05, L04, L03, L02, R05, R04, R03, R02, R01, R00, \ + L17, L16, L15, L14, L13, L12, L01, R06, R15, R14, R13, R12, R11, R10, \ + L27, L26, L25, L24, L23, L22, L11, R16, R25, R24, R23, R22, R21, R20, \ + L37, L36, L35, L34, L33, L32, L21, R26, R35, R34, R33, R32, R31, R30, \ + L00, R07, \ + L10, R17, \ + L20, R27, \ + L30, R37, \ + L31, R36 \ + ) { \ + {L00, L01, L02, L03, L04, L05, L06, L07}, \ + {L10, L11, L12, L13, L14, L15, L16, L17}, \ + {L20, L21, L22, L23, L24, L25, L26, L27}, \ + {L30, L31, L32, L33, L34, L35, L36, L37}, \ + {R00, R01, R02, R03, R04, R05, R06, R07}, \ + {R10, R11, R12, R13, R14, R15, R16, R17}, \ + {R20, R21, R22, R23, R24, R25, R26, R27}, \ + {R30, R31, R32, R33, R34, R35, R36, R37} \ + } + +#include "wire-protocol-constants.h" +#define I2C_ADDR_LEFT (0x58 << 1) +#define I2C_ADDR_RIGHT (I2C_ADDR_LEFT + 6) +#define I2C_ADDR(hand) ((hand) ? I2C_ADDR_RIGHT : I2C_ADDR_LEFT) +#define LEFT 0 +#define RIGHT 1 + +#include "leds.h" + +/* vim: set ts=2 sw=2 et: */ diff --git a/keyboards/model01/readme.md b/keyboards/model01/readme.md new file mode 100644 index 000000000..34bd291e2 --- /dev/null +++ b/keyboards/model01/readme.md @@ -0,0 +1,37 @@ +# Keyboardio Model 01 + +A split keyboard. + +Keyboard Maintainer: QMK Community +Hardware Supported: Keyboardio Model 01 +Hardware Availability: [Keyboardio](https://shop.keyboard.io) + +Make example for this keyboard (after setting up your build environment): + + make model01:default + +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). + +## Programming the Keyboard + +To program the keyboard, if you have avrdude installed: + + make model01:default:avrdude + +When prompted to reset your keyboard, press the prog key at upper left. If the +keyboard does not reset, you can hold the prog key while plugging it into your +computer. The prog key will light up red in programming mode. + +## Features + +This implements the standard keymap, including mousekeys. + +It doesn't do cursor warping - QMK does not support absolute mouse positioning. + +LED support is limited. Gamma compensation and the high speed batch update +functions supported by the hardware are not implemented. The high current power +switch is also not implemented, so if you try and turn all the LEDs on at full +brightness, something may conk out. + +Hotplugging the two halves works but is not extensively tested. diff --git a/keyboards/model01/rules.mk b/keyboards/model01/rules.mk new file mode 100644 index 000000000..cab7065ff --- /dev/null +++ b/keyboards/model01/rules.mk @@ -0,0 +1,62 @@ +SRC += i2c_master.c \ + leds.c \ + matrix.c + +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + +BOOTLOADER = caterina + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = no # USB Nkey Rollover +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode + +CUSTOM_MATRIX = yes +CIE1931_CURVE = yes diff --git a/keyboards/model01/wire-protocol-constants.h b/keyboards/model01/wire-protocol-constants.h new file mode 100644 index 000000000..90a528582 --- /dev/null +++ b/keyboards/model01/wire-protocol-constants.h @@ -0,0 +1,53 @@ +/* + * This file is taken from the KeyboardioScanner module: + * https://github.com/keyboardio/KeyboardioScanner/blob/master/wire-protocol-constants.h + * + * Copyright (C) 2015-2018 Keyboard.io, Inc + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#pragma once + +#define TWI_CMD_NONE 0x00 +#define TWI_CMD_VERSION 0x01 +#define TWI_CMD_KEYSCAN_INTERVAL 0x02 +#define TWI_CMD_LED_SET_ALL_TO 0x03 +#define TWI_CMD_LED_SET_ONE_TO 0x04 +#define TWI_CMD_COLS_USE_PULLUPS 0x05 +#define TWI_CMD_LED_SPI_FREQUENCY 0x06 + +#define LED_SPI_FREQUENCY_4MHZ 0x07 +#define LED_SPI_FREQUENCY_2MHZ 0x06 +#define LED_SPI_FREQUENCY_1MHZ 0x05 +#define LED_SPI_FREQUENCY_512KHZ 0x04 +#define LED_SPI_FREQUENCY_256KHZ 0x03 +#define LED_SPI_FREQUENCY_128KHZ 0x02 +#define LED_SPI_FREQUENCY_64KHZ 0x01 +#define LED_SPI_OFF 0x00 + + +// 512KHZ seems to be the sweet spot in early testing +// so make it the default +#define LED_SPI_FREQUENCY_DEFAULT LED_SPI_FREQUENCY_512KHZ + + +#define TWI_CMD_LED_BASE 0x80 + +#define TWI_REPLY_NONE 0x00 +#define TWI_REPLY_KEYDATA 0x01 From 23da333ae3527228f101ed8cf08e3cd6a5796901 Mon Sep 17 00:00:00 2001 From: nachie Date: Mon, 17 Sep 2018 16:00:40 -0700 Subject: [PATCH 108/788] Keyboard: Added support for GSKT-00 (#3911) * Added QMK support for GSKT-00, PaladinSplit, PaladinTKL and PaladinPad pcbs * Remove the paladin boards from this PR * Changed gskt00 as per review comments. Added two new default layouts, 60_ansi_tsangan and 60_iso_tsangan * Fix the layouts/default/60_iso_tsangan/layout.json file * Removed ? from rules.mk, removed unused fn_actions from keymaps. Changed the 60_iso_tsangan to work correctly * Removed PREVENT_STUCK_MODIFIERS --- keyboards/gskt00/config.h | 39 +++++++++ keyboards/gskt00/gskt00.c | 2 + keyboards/gskt00/gskt00.h | 57 +++++++++++++ keyboards/gskt00/info.json | 16 ++++ keyboards/gskt00/keymaps/default/keymap.c | 82 +++++++++++++++++++ keyboards/gskt00/keymaps/nachie/keymap.c | 82 +++++++++++++++++++ keyboards/gskt00/readme.md | 17 ++++ keyboards/gskt00/rules.mk | 55 +++++++++++++ .../default_60_ansi_tsangan/keymap.c | 11 +++ layouts/default/60_ansi_tsangan/layout.json | 5 ++ layouts/default/60_ansi_tsangan/readme.md | 3 + .../default_60_iso_tsangan/keymap.c | 11 +++ layouts/default/60_iso_tsangan/layout.json | 5 ++ layouts/default/60_iso_tsangan/readme.md | 3 + 14 files changed, 388 insertions(+) create mode 100755 keyboards/gskt00/config.h create mode 100755 keyboards/gskt00/gskt00.c create mode 100755 keyboards/gskt00/gskt00.h create mode 100644 keyboards/gskt00/info.json create mode 100755 keyboards/gskt00/keymaps/default/keymap.c create mode 100755 keyboards/gskt00/keymaps/nachie/keymap.c create mode 100644 keyboards/gskt00/readme.md create mode 100755 keyboards/gskt00/rules.mk create mode 100644 layouts/default/60_ansi_tsangan/default_60_ansi_tsangan/keymap.c create mode 100644 layouts/default/60_ansi_tsangan/layout.json create mode 100644 layouts/default/60_ansi_tsangan/readme.md create mode 100644 layouts/default/60_iso_tsangan/default_60_iso_tsangan/keymap.c create mode 100644 layouts/default/60_iso_tsangan/layout.json create mode 100644 layouts/default/60_iso_tsangan/readme.md diff --git a/keyboards/gskt00/config.h b/keyboards/gskt00/config.h new file mode 100755 index 000000000..f36493f28 --- /dev/null +++ b/keyboards/gskt00/config.h @@ -0,0 +1,39 @@ +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6061 +#define DEVICE_VER 0x0001 +#define MANUFACTURER inachie +#define PRODUCT GSKT00 +#define DESCRIPTION GSKT00 Gasket 60 keyboard + +/* key matrix size */ +#define MATRIX_ROWS 8 +#define MATRIX_COLS 8 + +/* key matrix pins */ +#define MATRIX_ROW_PINS { F1, D1, D2, D4, D6, F7, B0, F4 } +#define MATRIX_COL_PINS { F6, D7, F5, C7, B4, C6, B6, B5 } +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCING_DELAY 5 + +/* 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 + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + + diff --git a/keyboards/gskt00/gskt00.c b/keyboards/gskt00/gskt00.c new file mode 100755 index 000000000..89a0040ff --- /dev/null +++ b/keyboards/gskt00/gskt00.c @@ -0,0 +1,2 @@ +#include "gskt00.h" + diff --git a/keyboards/gskt00/gskt00.h b/keyboards/gskt00/gskt00.h new file mode 100755 index 000000000..90e9a1ad5 --- /dev/null +++ b/keyboards/gskt00/gskt00.h @@ -0,0 +1,57 @@ +#ifndef GSKT00_H +#define GSKT00_H + +#include "quantum.h" + +#define LAYOUT_all( \ + K36, K37, K46, K47, K56, K57, K66, K67, K76, K77, K06, K07, K17, K26, K27, \ + K34, K35, K44, K45, K54, K55, K64, K65, K75, K05, K15, K16, K25, K24, \ + K32, K33, K43, K52, K53, K63, K73, K74, K03, K04, K13, K14, K23, \ + K31, K41, K42, K51, K61, K62, K71, K72, K01, K02, K11, K12, K21, K22, \ + K30, K40, K50, K60, K00, K10, K20 \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07 }, \ + { K10, K11, K12, K13, K14, K15, K16, K17 }, \ + { K20, K21, K22, K23, K24, K25, K26, K27 }, \ + { K30, K31, K32, K33, K34, K35, K36, K37 }, \ + { K40, K41, K42, K43, K44, K45, K46, K47 }, \ + { K50, K51, K52, K53, K54, K55, K56, K57 }, \ + { K60, K61, K62, K63, K64, K65, K66, K67 }, \ + { KC_NO, K71, K72, K73, K74, K75, K76, K77 } \ +} + +#define LAYOUT_60_iso_tsangan( \ + K36, K37, K46, K47, K56, K57, K66, K67, K76, K77, K06, K07, K17, K27, \ + K34, K35, K44, K45, K54, K55, K64, K65, K75, K05, K15, K16, K25, \ + K32, K33, K43, K52, K53, K63, K73, K74, K03, K04, K13, K14, K24, K23, /* enter */ \ + K31, K41, K42, K51, K61, K62, K71, K72, K01, K02, K11, K12, K21, \ + K30, K40, K50, K60, K00, K10, K20 \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07 }, \ + { KC_NO, K11, K12, K13, K14, K15, K16, K17 }, \ + { K20, K21, KC_NO, K23, K24, K25, KC_NO, K27 }, \ + { K30, K31, K32, K33, K34, K35, K36, K37 }, \ + { K40, K41, K42, K43, K44, K45, K46, K47 }, \ + { K50, K51, K52, K53, K54, K55, K56, K57 }, \ + { K60, K61, K62, K63, K64, K65, K66, K67 }, \ + { KC_NO, K71, K72, K73, K74, K75, K76, K77 } \ +} + +#define LAYOUT_60_ansi_tsangan( \ + K36, K37, K46, K47, K56, K57, K66, K67, K76, K77, K06, K07, K17, K27, \ + K34, K35, K44, K45, K54, K55, K64, K65, K75, K05, K15, K16, K25, K24, \ + K32, K33, K43, K52, K53, K63, K73, K74, K03, K04, K13, K14, K23, \ + K31, K42, K51, K61, K62, K71, K72, K01, K02, K11, K12, K21, \ + K30, K40, K50, K60, K00, K10, K20 \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07 }, \ + { K10, K11, K12, K13, K14, K15, K16, K17 }, \ + { K20, K21, KC_NO, K23, K24, K25, KC_NO, K27 }, \ + { K30, K31, K32, K33, K34, K35, K36, K37 }, \ + { K40, KC_NO, K42, K43, K44, K45, K46, K47 }, \ + { K50, K51, K52, K53, K54, K55, K56, K57 }, \ + { K60, K61, K62, K63, K64, K65, K66, K67 }, \ + { KC_NO, K71, K72, K73, K74, K75, K76, K77 } \ +} + +#endif diff --git a/keyboards/gskt00/info.json b/keyboards/gskt00/info.json new file mode 100644 index 000000000..88191240b --- /dev/null +++ b/keyboards/gskt00/info.json @@ -0,0 +1,16 @@ +{ + "keyboard_name": "gskt00", + "url": "", + "maintainer": "nachie", + "width": 15, + "height": 5, + "layouts": { + "LAYOUT_60_ansi_tsangan": { + "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.5}, {"label":"Win", "x":1.5, "y":4}, {"label":"Alt", "x":2.5, "y":4, "w":1.5}, {"x":4, "y":4, "w":7}, {"label":"Alt", "x":11, "y":4, "w":1.5}, {"label":"Win", "x":12.5, "y":4}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}] + }, + + "LAYOUT_60_iso_tsangan": { + "layout": [{"label":"\u00ac", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"\"", "x":2, "y":0}, {"label":"\u00a3", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"@", "x":11.75, "y":2}, {"label":"~", "x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":2, "w":1.25}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"label":"|", "x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.5}, {"label":"Win", "x":1.5, "y":4}, {"label":"Alt", "x":2.5, "y":4, "w":1.5}, {"x":4, "y":4, "w":7}, {"label":"AltGr", "x":11, "y":4, "w":1.5}, {"label":"Menu", "x":12.5, "y":4}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}] + } + } + } diff --git a/keyboards/gskt00/keymaps/default/keymap.c b/keyboards/gskt00/keymaps/default/keymap.c new file mode 100755 index 000000000..792ba2f41 --- /dev/null +++ b/keyboards/gskt00/keymaps/default/keymap.c @@ -0,0 +1,82 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* QWERTY */ + LAYOUT_all( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, MO(3), + KC_LGUI, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(3)), + + /* DVORAK */ + LAYOUT_all( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, KC_RBRC, KC_GRV, KC_BSLS, + KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, KC_EQL, KC_BSPC, + MO(3), KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, KC_ENT, + KC_LSFT, KC_NUBS, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_LSFT, MO(3), + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT, KC_RCTL), + + /* COLEMAK */ + LAYOUT_all( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSLS, + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LBRC, KC_RBRC, KC_BSPC, + MO(3), KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENT, + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, MO(3), + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT, KC_RCTL), + + /* FUNCTION */ + LAYOUT_all( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, + KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_SLCK, KC_PAUS, KC_UP, KC_PAUS, KC_DEL, + KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_EJCT, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_MOD, KC_TRNS, RGB_TOG) + +}; + +void matrix_init_user(void) { +} + +void matrix_scan_user(void) { +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void led_set_user(uint8_t usb_led) { + + if (usb_led & (1 << USB_LED_NUM_LOCK)) { + + } else { + + } + + if (usb_led & (1 << USB_LED_CAPS_LOCK)) { + + } else { + + } + + if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { + + } else { + + } + + if (usb_led & (1 << USB_LED_COMPOSE)) { + + } else { + + } + + if (usb_led & (1 << USB_LED_KANA)) { + + } else { + + } + +} + diff --git a/keyboards/gskt00/keymaps/nachie/keymap.c b/keyboards/gskt00/keymaps/nachie/keymap.c new file mode 100755 index 000000000..8606d2484 --- /dev/null +++ b/keyboards/gskt00/keymaps/nachie/keymap.c @@ -0,0 +1,82 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* QWERTY */ + LAYOUT_all( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSLS, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, + MO(3), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, MO(3), + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT, KC_LCTL), + + /* DVORAK */ + LAYOUT_all( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, KC_RBRC, KC_GRV, KC_BSLS, + KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, KC_EQL, KC_BSPC, + MO(3), KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, KC_ENT, + KC_LSFT, KC_NUBS, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_LSFT, MO(3), + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT, KC_RCTL), + + /* COLEMAK */ + LAYOUT_all( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSLS, + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LBRC, KC_RBRC, KC_BSPC, + MO(3), KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENT, + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, MO(3), + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT, KC_RCTL), + + /* FUNCTION */ + LAYOUT_all( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS, KC_PGUP, KC_UP, KC_PGDN, KC_PSCR, KC_SLCK, KC_PAUS, KC_BSPC, + KC_TRNS, KC_TRNS, KC_MPRV, KC_MPLY, KC_MNXT, KC_TRNS, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, + KC_CAPS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, KC_END, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_MOD, KC_TRNS, RGB_TOG) + +}; + +void matrix_init_user(void) { +} + +void matrix_scan_user(void) { +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void led_set_user(uint8_t usb_led) { + + if (usb_led & (1 << USB_LED_NUM_LOCK)) { + + } else { + + } + + if (usb_led & (1 << USB_LED_CAPS_LOCK)) { + + } else { + + } + + if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { + + } else { + + } + + if (usb_led & (1 << USB_LED_COMPOSE)) { + + } else { + + } + + if (usb_led & (1 << USB_LED_KANA)) { + + } else { + + } + +} + diff --git a/keyboards/gskt00/readme.md b/keyboards/gskt00/readme.md new file mode 100644 index 000000000..ad03ac819 --- /dev/null +++ b/keyboards/gskt00/readme.md @@ -0,0 +1,17 @@ +# GSKT-00 PCB + +Firmware for the GSKT-00 PCB + +Keyboard Maintainer: [/u/iNachie](https://github.com/nachie) +Hardware Supported: GSKT-00 PCB +Hardware Availability: [/u/iNachie](https://www.reddit.com/user/inachie/) + +Make example for this keyboard (after setting up your build environment): + + make gskt00:default + +Or to make and flash: + + make gskt00:default:dfu + +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). diff --git a/keyboards/gskt00/rules.mk b/keyboards/gskt00/rules.mk new file mode 100755 index 000000000..338384e3e --- /dev/null +++ b/keyboards/gskt00/rules.mk @@ -0,0 +1,55 @@ +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + +BOOTLOADER = atmel-dfu + +# Build Options +# comment out to disable the options. +# +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +AUDIO_ENABLE = no +RGBLIGHT_ENABLE = no + +LAYOUTS = 60_ansi_tsangan 60_iso_tsangan diff --git a/layouts/default/60_ansi_tsangan/default_60_ansi_tsangan/keymap.c b/layouts/default/60_ansi_tsangan/default_60_ansi_tsangan/keymap.c new file mode 100644 index 000000000..8f7f5f8c6 --- /dev/null +++ b/layouts/default/60_ansi_tsangan/default_60_ansi_tsangan/keymap.c @@ -0,0 +1,11 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_60_ansi( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL, KC_BSPC , + KC_TAB , KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC, KC_BSLS , + KC_CAPS , KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_ENT , + KC_LSFT , KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT , + KC_LCTL , KC_LGUI , KC_LALT , KC_SPC , KC_RALT , KC_RGUI , KC_RCTL + ) +}; diff --git a/layouts/default/60_ansi_tsangan/layout.json b/layouts/default/60_ansi_tsangan/layout.json new file mode 100644 index 000000000..f6a65beb3 --- /dev/null +++ b/layouts/default/60_ansi_tsangan/layout.json @@ -0,0 +1,5 @@ +[{a:7},"","","","","","","","","","","","","",{w:2},""], +[{w:1.5},"","","","","","","","","","","","","",{w:1.5},""], +[{w:1.75},"","","","","","","","","","","","",{w:2.25},""], +[{w:2.25},"","","","","","","","","","","",{w:2.75},""], +[{w:1.5},"",{w:1},"",{w:1.5},"",{w:7},"",{w:1.5},"",{w:1},"",{w:1.5},""] diff --git a/layouts/default/60_ansi_tsangan/readme.md b/layouts/default/60_ansi_tsangan/readme.md new file mode 100644 index 000000000..76b451403 --- /dev/null +++ b/layouts/default/60_ansi_tsangan/readme.md @@ -0,0 +1,3 @@ +# 60_ansi_tsangan + + LAYOUT_60_ansi_tsangan diff --git a/layouts/default/60_iso_tsangan/default_60_iso_tsangan/keymap.c b/layouts/default/60_iso_tsangan/default_60_iso_tsangan/keymap.c new file mode 100644 index 000000000..204a12d33 --- /dev/null +++ b/layouts/default/60_iso_tsangan/default_60_iso_tsangan/keymap.c @@ -0,0 +1,11 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_60_iso( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LCTRL, KC_LALT, KC_LGUI, KC_SPACE, KC_RGUI, KC_RALT, KC_RCTL + ) +}; diff --git a/layouts/default/60_iso_tsangan/layout.json b/layouts/default/60_iso_tsangan/layout.json new file mode 100644 index 000000000..e23185935 --- /dev/null +++ b/layouts/default/60_iso_tsangan/layout.json @@ -0,0 +1,5 @@ +[{a:7},"","","","","","","","","","","","","",{w:2},""], +[{w:1.5},"","","","","","","","","","","","","",{x:0.25,w:1.25,h:2,w2:1.5,h2:1,x2:-0.25},""], +[{w:1.75},"","","","","","","","","","","","",""], +[{w:1.25},"","","","","","","","","","","","",{w:2.75},""], +[{w:1.5},"",{w:1},"",{w:1.5},"",{w:7},"",{w:1.5},"",{w:1},"",{w:1.5},""] diff --git a/layouts/default/60_iso_tsangan/readme.md b/layouts/default/60_iso_tsangan/readme.md new file mode 100644 index 000000000..edb7f9242 --- /dev/null +++ b/layouts/default/60_iso_tsangan/readme.md @@ -0,0 +1,3 @@ +# 60_iso_tsangan + + LAYOUT_60_iso_tsangan From 92f67719cc7faf6f2708d848ae3d1c6ee2b781cb Mon Sep 17 00:00:00 2001 From: skullydazed Date: Wed, 19 Sep 2018 11:41:40 -0700 Subject: [PATCH 109/788] Keyboard: Fix the LAYOUT_iso macro for tada68 (#3943) --- keyboards/tada68/keymaps/iso-uk/keymap.c | 8 ++++---- keyboards/tada68/tada68.h | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/keyboards/tada68/keymaps/iso-uk/keymap.c b/keyboards/tada68/keymaps/iso-uk/keymap.c index d59f610f7..c843595dc 100644 --- a/keyboards/tada68/keymaps/iso-uk/keymap.c +++ b/keyboards/tada68/keymaps/iso-uk/keymap.c @@ -21,8 +21,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_BL] = LAYOUT_iso( KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_GRV, \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_NUHS, KC_DEL, \ - KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_DEL, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_PGUP, \ KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN, \ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FL), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT ), @@ -42,8 +42,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_FL] = LAYOUT_iso( _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_INS, \ - _______, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, \ - _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_END, \ + _______, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, \ + _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_END, \ _______, _______, _______, _______, BL_DEC, BL_TOGG, BL_INC, _______, KC_VOLU, KC_VOLD, KC_MUTE, _______, KC_BTN1, KC_MS_U, KC_BTN2, \ _______, _______, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R ), diff --git a/keyboards/tada68/tada68.h b/keyboards/tada68/tada68.h index 608f52e44..670b0e6c1 100755 --- a/keyboards/tada68/tada68.h +++ b/keyboards/tada68/tada68.h @@ -55,8 +55,8 @@ #define LAYOUT_iso( \ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, \ - k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k2c, k1e, \ - k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2d, k2e, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1e, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k2e, \ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e, \ k40, k41, k42, k45, k49, k4a, k4b, k4c, k4d, k4e \ ) \ @@ -102,4 +102,4 @@ void matrix_init_user(void); void matrix_scan_user(void); -#endif \ No newline at end of file +#endif From 71fe973190610bf155d864c71b8b326bc1b74eab Mon Sep 17 00:00:00 2001 From: Simon Dagfinrud Date: Wed, 19 Sep 2018 20:42:58 +0200 Subject: [PATCH 110/788] Keyboard: Add ISO-NOR keymap for TADA68 (#3944) --- keyboards/tada68/keymaps/iso-nor/config.h | 1 + keyboards/tada68/keymaps/iso-nor/keymap.c | 51 ++++++++++++++++++++++ keyboards/tada68/keymaps/iso-nor/readme.md | 17 ++++++++ keyboards/tada68/keymaps/iso-nor/rules.mk | 21 +++++++++ 4 files changed, 90 insertions(+) create mode 100644 keyboards/tada68/keymaps/iso-nor/config.h create mode 100644 keyboards/tada68/keymaps/iso-nor/keymap.c create mode 100644 keyboards/tada68/keymaps/iso-nor/readme.md create mode 100644 keyboards/tada68/keymaps/iso-nor/rules.mk diff --git a/keyboards/tada68/keymaps/iso-nor/config.h b/keyboards/tada68/keymaps/iso-nor/config.h new file mode 100644 index 000000000..6f70f09be --- /dev/null +++ b/keyboards/tada68/keymaps/iso-nor/config.h @@ -0,0 +1 @@ +#pragma once diff --git a/keyboards/tada68/keymaps/iso-nor/keymap.c b/keyboards/tada68/keymaps/iso-nor/keymap.c new file mode 100644 index 000000000..2e6a80750 --- /dev/null +++ b/keyboards/tada68/keymaps/iso-nor/keymap.c @@ -0,0 +1,51 @@ +#include QMK_KEYBOARD_H + +#define _BL 0 +#define _FL 1 + +#define _______ KC_TRNS + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Keymap _BL: (Base Layer) Default Layer + * ,----------------------------------------------------------------. + * |Esc | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| +| '|Backspa | ´| + * |----------------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| Å| ¨| Ent-|Del | + * |-------------------------------------------------------| er|----| + * |CAPS | A| S| D| F| G| H| J| K| L| Ø| Æ| @ | |PgUp| + * |----------------------------------------------------------------| + * |Shif| <>| Z| X| C| V| B| N| M| ,| .| -| Shift| Up|PgDn| + * |----------------------------------------------------------------| + * |Ctrl|Alt |Cmd | Space |Alt| FN|Ctrl|Lef|Dow|Rig | + * `----------------------------------------------------------------' + */ + [_BL] = LAYOUT_iso( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_GRV, KC_BSPC, KC_EQL, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_NUHS, KC_DEL, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP, \ + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FL), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + ), + + /* Keymap _FL1: Function Layer + * ,----------------------------------------------------------------. + * | | F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12| RESET|PSCR| + * |----------------------------------------------------------------| + * | | | Up| | | | | | | | |BL-|BL+|BL | INS| + * |----------------------------------------------------------------| + * | |Lef|Dow|Rig| | | | | | PP|PLA| PN| | |HOME| + * |----------------------------------------------------------------| + * | | | | | | | | | | V-| MV| V+| | | END| + * |----------------------------------------------------------------| + * | | | | | | | | | | | + * `----------------------------------------------------------------' + */ + [_FL] = LAYOUT_iso( + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, RESET, KC_PSCR, \ + _______, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, BL_DEC, BL_INC, BL_TOGG, KC_INS, \ + _______, KC_LEFT, KC_DOWN,KC_RIGHT, _______, _______, _______, _______, _______, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______, KC_HOME, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLD, KC_MUTE, KC_VOLU, _______, _______, KC_END, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + +}; diff --git a/keyboards/tada68/keymaps/iso-nor/readme.md b/keyboards/tada68/keymaps/iso-nor/readme.md new file mode 100644 index 000000000..5ade71ab4 --- /dev/null +++ b/keyboards/tada68/keymaps/iso-nor/readme.md @@ -0,0 +1,17 @@ +# TADA68 layout for ISO-NOR + +> An ISO-style layout for Norwegian keyboards. + +This layout was specifically made for Norwegian keyboards (i.e. includes `Æ`, `Ø` and `Å`), and is tested on a TADA68 purchased from [kbdfans](https://kbdfans.cn/) in September 2018. + +### Specifics + +As it's an ISO style keymap, it works with the fat double-row `Enter` key and the narrower left `Shift` and `<>` key. In addition, it switches the `'` key and the `´` key since the latter one is less common in Norwegian, and the first one normally is placed where the `Escape` key is located on a TADA68. + +## Installation + +Please see the [tada68 readme](../../readme.md) using the following command + +``` +make tada68:iso-nor:bin +``` diff --git a/keyboards/tada68/keymaps/iso-nor/rules.mk b/keyboards/tada68/keymaps/iso-nor/rules.mk new file mode 100644 index 000000000..4deca710b --- /dev/null +++ b/keyboards/tada68/keymaps/iso-nor/rules.mk @@ -0,0 +1,21 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif \ No newline at end of file From c23233f41ab9221577fc83bbae0a230452a38231 Mon Sep 17 00:00:00 2001 From: Joe Wasson Date: Wed, 19 Sep 2018 16:13:58 -0700 Subject: [PATCH 111/788] Keymap: Talljoe's keymap for oddball keyboards (#3910) * Create layout for JD45 * Tweak layout to better support JD45 and add more tap dancing. * Add Maltron and tweak layout for 40% enter compatibility. * Switch back to `BL_TOGGLE` for backlight. * More tweaks * Rename talljoe_gherkin to talljoe-gherkin * Make NAV layer tab C_S_T also. * Add missing RESET key. * Add Talljoe layout for minivan. * MTI is not for me * Tweak keymap. * Add talljoe keymap to Atreus. * Minor tweaks. * Fix talljoe keymaps to work with new Zeal60 commit. --- .../atreus/keymaps/talljoe-atreus/config.h | 42 +++++ .../atreus/keymaps/talljoe-atreus/keymap.c | 1 + .../atreus/keymaps/talljoe-atreus/rules.mk | 1 + .../config.h | 0 .../keymap.c | 0 .../rules.mk | 0 keyboards/jd45/keymaps/talljoe/config.h | 22 +++ keyboards/jd45/keymaps/talljoe/keymap.c | 1 + .../tv44/keymaps/talljoe-minivan/config.h | 53 ++++++ .../tv44/keymaps/talljoe-minivan/keymap.c | 1 + .../tv44/keymaps/talljoe-minivan/rules.mk | 3 + keyboards/zeal60/rules.mk | 3 +- .../60_ansi_split_bs_rshift/talljoe/keymap.c | 25 +-- .../60_ansi_split_bs_rshift/talljoe/rules.mk | 1 + .../talljoe/solarized.c | 23 +++ .../talljoe/solarized.h | 27 +++ users/talljoe/config.h | 2 +- users/talljoe/talljoe.c | 53 +++--- users/talljoe/talljoe.h | 76 +++++++-- users/talljoe/tapdance.c | 154 +++++++++++++++--- 20 files changed, 420 insertions(+), 68 deletions(-) create mode 100644 keyboards/atreus/keymaps/talljoe-atreus/config.h create mode 100644 keyboards/atreus/keymaps/talljoe-atreus/keymap.c create mode 100644 keyboards/atreus/keymaps/talljoe-atreus/rules.mk rename keyboards/gherkin/keymaps/{talljoe_gherkin => talljoe-gherkin}/config.h (100%) rename keyboards/gherkin/keymaps/{talljoe_gherkin => talljoe-gherkin}/keymap.c (100%) rename keyboards/gherkin/keymaps/{talljoe_gherkin => talljoe-gherkin}/rules.mk (100%) create mode 100644 keyboards/jd45/keymaps/talljoe/config.h create mode 100644 keyboards/jd45/keymaps/talljoe/keymap.c create mode 100644 keyboards/tv44/keymaps/talljoe-minivan/config.h create mode 100644 keyboards/tv44/keymaps/talljoe-minivan/keymap.c create mode 100644 keyboards/tv44/keymaps/talljoe-minivan/rules.mk create mode 100644 layouts/community/60_ansi_split_bs_rshift/talljoe/rules.mk create mode 100644 layouts/community/60_ansi_split_bs_rshift/talljoe/solarized.c create mode 100644 layouts/community/60_ansi_split_bs_rshift/talljoe/solarized.h diff --git a/keyboards/atreus/keymaps/talljoe-atreus/config.h b/keyboards/atreus/keymaps/talljoe-atreus/config.h new file mode 100644 index 000000000..87b68ffc6 --- /dev/null +++ b/keyboards/atreus/keymaps/talljoe-atreus/config.h @@ -0,0 +1,42 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include QMK_KEYBOARD_CONFIG_H + +#define PREVENT_STUCK_MODIFIERS +#define SPACE_COUNT 2 + +#define TEMPLATE( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K2D, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \ + K40, K41, K42, K44, K45, K46, K48, K49, K4B, K4C \ +) LAYOUT( \ + K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \ + K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, \ + K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, \ + K10, K41, K42, K30, K44, K1D, K20, K45, K3C, K0D, K2B, K3D \ +) + +#define TEMPLATE_NUM( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K2D, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \ + K40, K41, K42, K44, K45, K46, K48, K49, K4B, K4C \ +) LAYOUT( \ + K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \ + K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, \ + K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, \ + K10, K41, K42, K30, K44, K1D, K20, K45, K48, K49, K2B, K3D \ +) + + +#define TEMPLATE_RESET LAYOUT( \ + RESET , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + RESET , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX \ +) +#endif diff --git a/keyboards/atreus/keymaps/talljoe-atreus/keymap.c b/keyboards/atreus/keymaps/talljoe-atreus/keymap.c new file mode 100644 index 000000000..7812add81 --- /dev/null +++ b/keyboards/atreus/keymaps/talljoe-atreus/keymap.c @@ -0,0 +1 @@ +// This space intentionally left blank diff --git a/keyboards/atreus/keymaps/talljoe-atreus/rules.mk b/keyboards/atreus/keymaps/talljoe-atreus/rules.mk new file mode 100644 index 000000000..92007fe8a --- /dev/null +++ b/keyboards/atreus/keymaps/talljoe-atreus/rules.mk @@ -0,0 +1 @@ +USER_NAME := talljoe diff --git a/keyboards/gherkin/keymaps/talljoe_gherkin/config.h b/keyboards/gherkin/keymaps/talljoe-gherkin/config.h similarity index 100% rename from keyboards/gherkin/keymaps/talljoe_gherkin/config.h rename to keyboards/gherkin/keymaps/talljoe-gherkin/config.h diff --git a/keyboards/gherkin/keymaps/talljoe_gherkin/keymap.c b/keyboards/gherkin/keymaps/talljoe-gherkin/keymap.c similarity index 100% rename from keyboards/gherkin/keymaps/talljoe_gherkin/keymap.c rename to keyboards/gherkin/keymaps/talljoe-gherkin/keymap.c diff --git a/keyboards/gherkin/keymaps/talljoe_gherkin/rules.mk b/keyboards/gherkin/keymaps/talljoe-gherkin/rules.mk similarity index 100% rename from keyboards/gherkin/keymaps/talljoe_gherkin/rules.mk rename to keyboards/gherkin/keymaps/talljoe-gherkin/rules.mk diff --git a/keyboards/jd45/keymaps/talljoe/config.h b/keyboards/jd45/keymaps/talljoe/config.h new file mode 100644 index 000000000..f8b0333cf --- /dev/null +++ b/keyboards/jd45/keymaps/talljoe/config.h @@ -0,0 +1,22 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include QMK_KEYBOARD_CONFIG_H + +#define PREVENT_STUCK_MODIFIERS +#define SPACE_COUNT 2 + +#define TEMPLATE( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K2D, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \ + K40, K41, K42, K44, K45, K46, K48, K49, K4B, K4C \ +) { \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K0D, K1D }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2C, KC_NO }, \ + { K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, KC_NO }, \ + { K40, K00, K41, K42, K44, KC_NO, K45, KC_NO, K48, K49, K3D, K4C, KC_NO } \ +} + +#endif diff --git a/keyboards/jd45/keymaps/talljoe/keymap.c b/keyboards/jd45/keymaps/talljoe/keymap.c new file mode 100644 index 000000000..7812add81 --- /dev/null +++ b/keyboards/jd45/keymaps/talljoe/keymap.c @@ -0,0 +1 @@ +// This space intentionally left blank diff --git a/keyboards/tv44/keymaps/talljoe-minivan/config.h b/keyboards/tv44/keymaps/talljoe-minivan/config.h new file mode 100644 index 000000000..fa1f43adc --- /dev/null +++ b/keyboards/tv44/keymaps/talljoe-minivan/config.h @@ -0,0 +1,53 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include QMK_KEYBOARD_CONFIG_H + +#define SPACE_COUNT 2 + +#define TEMPLATE( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K2D, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \ + K40, K41, K42, K44, K45, K46, K48, K49, K4B, K4C \ +) KEYMAP_ARROW( \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1D, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K0D, \ + K41, K49, K42, K44, K45, K3C, K0B, K00, K3D \ +) + +#define TEMPLATE_ALT( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K2D, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \ + K40, K41, K42, K44, K45, K46, K48, K49, K4B, K4C \ +) KEYMAP_ARROW( \ + K00, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1D, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2C, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, \ + K41, K49, K42, K44, K45, K48, K49, K4B, K4C \ +) + +#define TEMPLATE_ADJUST( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K2D, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \ + K40, K41, K42, K44, K45, K46, K48, K49, K4B, K4C \ +) KEYMAP_ARROW( \ + K00, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K2D, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2C, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, \ + K40, K49, K42, K44, K45, K48, K0B, K0C, K4C \ +) + +#define TEMPLATE_RESET KEYMAP_ARROW( \ + RESET, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, RESET, \ + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, RESET) + +#endif diff --git a/keyboards/tv44/keymaps/talljoe-minivan/keymap.c b/keyboards/tv44/keymaps/talljoe-minivan/keymap.c new file mode 100644 index 000000000..7812add81 --- /dev/null +++ b/keyboards/tv44/keymaps/talljoe-minivan/keymap.c @@ -0,0 +1 @@ +// This space intentionally left blank diff --git a/keyboards/tv44/keymaps/talljoe-minivan/rules.mk b/keyboards/tv44/keymaps/talljoe-minivan/rules.mk new file mode 100644 index 000000000..a4e40d0ba --- /dev/null +++ b/keyboards/tv44/keymaps/talljoe-minivan/rules.mk @@ -0,0 +1,3 @@ +USER_NAME := talljoe + +COMMAND_ENABLE = no # Commands for debug and configuration diff --git a/keyboards/zeal60/rules.mk b/keyboards/zeal60/rules.mk index c4686f985..f099ea9fd 100644 --- a/keyboards/zeal60/rules.mk +++ b/keyboards/zeal60/rules.mk @@ -53,7 +53,7 @@ BOOTLOADER = atmel-dfu OPT_DEFS += -DNO_SUSPEND_POWER_DOWN # Build Options -# change to "no" to disable the options, or define them in the Makefile in +# change to "no" to disable the options, or define them in the Makefile in # the appropriate keymap folder that will get included automatically # BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) @@ -76,3 +76,4 @@ RAW_ENABLE = yes DYNAMIC_KEYMAP_ENABLE = yes CIE1931_CURVE = yes +LAYOUTS = 60_ansi 60_iso 60_hhkb 60_ansi_split_bs_rshift diff --git a/layouts/community/60_ansi_split_bs_rshift/talljoe/keymap.c b/layouts/community/60_ansi_split_bs_rshift/talljoe/keymap.c index b5dc54492..cfad9da8a 100644 --- a/layouts/community/60_ansi_split_bs_rshift/talljoe/keymap.c +++ b/layouts/community/60_ansi_split_bs_rshift/talljoe/keymap.c @@ -1,7 +1,7 @@ #ifdef KEYBOARD_zeal60 #include "config.h" #include "zeal60.h" -#include "zeal_backlight.h" +#include "rgb_backlight.h" #include "action_layer.h" #include "solarized.h" #include "talljoe.h" @@ -9,7 +9,7 @@ // from zeal_backlight.c // we want to be able to set indicators for the spacebar stabs // but they are not represented by a row/index. -extern zeal_backlight_config g_config; +extern backlight_config g_config; void map_row_column_to_led( uint8_t row, uint8_t column, uint8_t *led ); void set_backlight_defaults(void) { @@ -17,7 +17,7 @@ void set_backlight_defaults(void) { uint8_t caps_lock; map_row_column_to_led(3, 12, &caps_lock); map_row_column_to_led(4, 7, &space); - zeal_backlight_config default_values = { + backlight_config default_values = { .use_split_backspace = USE_SPLIT_BACKSPACE, .use_split_left_shift = USE_SPLIT_LEFT_SHIFT, .use_split_right_shift = USE_SPLIT_RIGHT_SHIFT, @@ -34,15 +34,17 @@ void set_backlight_defaults(void) { .layer_2_indicator = { .index = space, .color = solarized.yellow }, .layer_3_indicator = { .index = 254, .color = solarized.red }, .alphas_mods = { - BACKLIGHT_ALPHAS_MODS_ROW_0, - BACKLIGHT_ALPHAS_MODS_ROW_1, - BACKLIGHT_ALPHAS_MODS_ROW_2, - BACKLIGHT_ALPHAS_MODS_ROW_3, - BACKLIGHT_ALPHAS_MODS_ROW_4 } + RGB_BACKLIGHT_ALPHAS_MODS_ROW_0, + RGB_BACKLIGHT_ALPHAS_MODS_ROW_1, + RGB_BACKLIGHT_ALPHAS_MODS_ROW_2, + RGB_BACKLIGHT_ALPHAS_MODS_ROW_3, + RGB_BACKLIGHT_ALPHAS_MODS_ROW_4 } }; - memcpy(&g_config, &default_values, sizeof(zeal_backlight_config)); + memcpy(&g_config, &default_values, sizeof(backlight_config)); backlight_config_save(); +#undef CUSTOM_RGB_LAYOUTS +#ifdef CUSTOM_RGB_LAYOUTS solarized_t* S = &solarized; HSV alphas = S->base2; HSV custom_color_map[MATRIX_ROWS][MATRIX_COLS] = CM( @@ -54,9 +56,12 @@ void set_backlight_defaults(void) { ); for (uint8_t row = 0; row < MATRIX_ROWS; ++row) { for (uint8_t col = 0; col < MATRIX_COLS; ++col) { - backlight_set_key_color(row, col, custom_color_map[row][col]); + uint8_t index; + map_row_column_to_led( row, col, &index ); + set_key_color(index, custom_color_map[row][col]); } } +#endif // CUSTOM_RGB_LAYOUTS } bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { diff --git a/layouts/community/60_ansi_split_bs_rshift/talljoe/rules.mk b/layouts/community/60_ansi_split_bs_rshift/talljoe/rules.mk new file mode 100644 index 000000000..239f03091 --- /dev/null +++ b/layouts/community/60_ansi_split_bs_rshift/talljoe/rules.mk @@ -0,0 +1 @@ +SRC += $(KEYMAP_PATH)/solarized.c diff --git a/layouts/community/60_ansi_split_bs_rshift/talljoe/solarized.c b/layouts/community/60_ansi_split_bs_rshift/talljoe/solarized.c new file mode 100644 index 000000000..3e9e726b9 --- /dev/null +++ b/layouts/community/60_ansi_split_bs_rshift/talljoe/solarized.c @@ -0,0 +1,23 @@ +#include "solarized.h" + +#define MAKE_COLOR(_H, _S, _V) \ + { .h = (((uint32_t)_H) * 255) / 360, .s = (((uint16_t)_S) * 255) / 100, .v = (((uint16_t)_V) * 255) / 100 } + +solarized_t solarized = { + .base03 = MAKE_COLOR(193, 100, 21), + .base02 = MAKE_COLOR(192, 90, 26), + .base01 = MAKE_COLOR(194, 25, 46), + .base00 = MAKE_COLOR(195, 23, 51), + .base0 = MAKE_COLOR(186, 13, 59), + .base1 = MAKE_COLOR(180, 9, 63), + .base2 = MAKE_COLOR( 44, 11, 93), + .base3 = MAKE_COLOR( 44, 10, 99), + .yellow = MAKE_COLOR( 45, 100, 71), + .orange = MAKE_COLOR( 18, 89, 80), + .red = MAKE_COLOR( 1, 79, 86), + .magenta = MAKE_COLOR(331, 74, 83), + .violet = MAKE_COLOR(237, 45, 77), + .blue = MAKE_COLOR(205, 82, 82), + .cyan = MAKE_COLOR(175, 74, 63), + .green = MAKE_COLOR( 68, 100, 60), +}; diff --git a/layouts/community/60_ansi_split_bs_rshift/talljoe/solarized.h b/layouts/community/60_ansi_split_bs_rshift/talljoe/solarized.h new file mode 100644 index 000000000..3b00caea7 --- /dev/null +++ b/layouts/community/60_ansi_split_bs_rshift/talljoe/solarized.h @@ -0,0 +1,27 @@ +#ifndef SOLARIZED_H +#define SOLARIZED_H + +#include "quantum/color.h" + +typedef struct { + HSV base03; + HSV base02; + HSV base01; + HSV base00; + HSV base0; + HSV base1; + HSV base2; + HSV base3; + HSV yellow; + HSV orange; + HSV red; + HSV magenta; + HSV violet; + HSV blue; + HSV cyan; + HSV green; +} solarized_t; + +extern solarized_t solarized; + +#endif diff --git a/users/talljoe/config.h b/users/talljoe/config.h index 1cdbb5a41..0d06a0b12 100644 --- a/users/talljoe/config.h +++ b/users/talljoe/config.h @@ -1,7 +1,7 @@ #ifndef USERSPACE_CONFIG_H #define USERSPACE_CONFIG_H -#define IGNORE_MOD_TAP_INTERRUPT +#define PERMISSIVE_HOLD #define RESET_LAYER 15 diff --git a/users/talljoe/talljoe.c b/users/talljoe/talljoe.c index e9c69b016..7a343e776 100644 --- a/users/talljoe/talljoe.c +++ b/users/talljoe/talljoe.c @@ -5,10 +5,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_BASE] = TEMPLATE_TKL( KC_ESC, KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , KC_F12 , KC_PSCR, KC_SLCK, MO_ADJ , - KC_GRV , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_MINS, KC_EQL , KC_BSLS, KC_INS , KC_HOME, KC_PGUP, - KC_TAB , KC_Q, KC_W, KC_E, KC_R, KC_T , KC_Y, KC_U, KC_I, KC_O, KC_P , KC_LBRC, KC_RBRC, KC_BSPC, KC_DEL , KC_END , KC_PGDN, - US_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G , KC_H, KC_J, KC_K, KC_L, US_SCLN, US_QUOT, US_ENT , - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B , KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP , + US_GRV , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_MINS, KC_EQL , US_BSLS, KC_INS , KC_HOME, KC_PGUP, + US_TAB , KC_Q, KC_W, KC_E, KC_R, KC_T , KC_Y, KC_U, KC_I, KC_O, KC_P , KC_LBRC, KC_RBRC, KC_BSPC, KC_DEL , KC_END , KC_PGDN, + CTL_ESC, KC_A, KC_S, KC_D, KC_F, KC_G , KC_H, KC_J, KC_K, KC_L, US_SCLN, US_QUOT, US_ENT , + SH_LBRC, KC_Z, KC_X, KC_C, KC_V, KC_B , KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SH_RBRC, KC_UP , KC_LCTL, KC_LGUI, KC_LALT, KC_SPC2, KC_SPC1, KC_SPC3, KC_RALT, KC_RGUI, KC_RCTL, KC_PTT , KC_LEFT, KC_DOWN, KC_RGHT), [_WORKMAN] = TEMPLATE( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, @@ -34,41 +34,44 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, KC_A, KC_R, KC_S, KC_T, KC_D , KC_H, KC_N, KC_E, KC_I, KC_O , _______, _______, _______, KC_Z, KC_X, KC_C, KC_V, KC_B , KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), - +#if (SPACE_COUNT > 1) + // A tweaked version of the Maltron layout + [_MALTROFF] = TEMPLATE( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, KC_Q, KC_P, KC_Y, KC_G, KC_B , KC_J, KC_M, KC_U, KC_K, KC_L, _______, _______, _______, + _______, KC_A, KC_N, KC_I, KC_S, KC_F , KC_D, KC_T, KC_H, KC_O, KC_R , US_ENT , KC_BSPC, + _______, KC_Z, KC_X, KC_C, KC_V, US_QUOT, KC_SCLN, KC_W, KC_COMM, KC_DOT, KC_SLSH, _______, _______, + _______, _______, _______, MLT_E , _______, _______, _______, _______, _______, _______), +#endif #ifdef ENABLE_GAME_LAYER [_GAME] = TEMPLATE( KC_ESC , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_MINS, KC_EQL , KC_BSLS, KC_GRV, KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , KC_LBRC, KC_RBRC, KC_BSPC, MO_NAV , KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_SCLN, KC_QUOT, KC_ENT , KC_LSFT, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, KC_RSFT, MO_ADJ , - KC_LCTL, KC_PTT , KC_PGDN, KC_SPC , KC_SPC , KC_SPC , KC_RALT, KC_APP , KC_RCTL, KC_PTT ), + KC_LCTL, KC_PTT , KC_PGDN, KC_SPC , KC_SPC , KC_SPC , KC_RALT, KC_APP , KC_RCTL, KC_PTT ), #endif - [_NAV] = TEMPLATE( + [_NAV] = TEMPLATE_NAV( KC_GRV , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - KC_TAB , KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_VOLU, KC_INS , KC_PGUP, KC_UP , KC_PGDN, KC_BTN1, KC_BTN2, KC_BTN3, KC_DEL , - US_CAPS, KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_MUTE, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END , KC_RCTL, TG_ADJ , - KC_LSFT, KC_F9 , KC_F10 , KC_F11 , KC_F12 , KC_VOLD, KC_END , KC_PGDN, KC_WBAK, KC_WFWD, KC_WREF, KC_RSFT, KC_APP , + US_TAB , KC_EXLM, KC_AT , KC_HASH, KC_DLR , KC_PERC, KC_INS , KC_PGUP, KC_UP , KC_PGDN, KC_BTN1, KC_BTN3, KC_BTN2, KC_DEL , + CTL_ESC, KC_LCBR, KC_RCBR, KC_LPRN, KC_RPRN, KC_AMPR, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END , US_QUOT, TG_ADJ , + KC_LSFT, KC_EQL, KC_PLUS, KC_MINS, KC_UNDS, KC_ASTR, KC_CALC, US_GRV , KC_WBAK, KC_WFWD, KC_WREF, KC_RSFT, KC_APP , KC_LCTL, KC_LGUI, KC_LALT, NV_SPC2, NV_SPC1, NV_SPC3, KC_RALT, KC_RGUI, KC_RCTL, KC_PTT ), - [_NUM] = TEMPLATE( + [_NUM] = TEMPLATE_NUM( XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - KC_GRV , KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, XXXXXXX, KC_DEL , - US_CAPS, KC_LCBR, KC_RCBR, KC_LPRN, KC_RPRN, KC_LBRC, KC_RBRC, KC_4, KC_5, KC_6, KC_PPLS, KC_PENT, XXXXXXX, - KC_LSFT, KC_EQL, KC_PLUS, KC_BSLS, KC_PIPE, KC_SCLN, XXXXXXX, KC_1, KC_2, KC_3, KC_PAST, KC_PSLS, XXXXXXX, + KC_GRV , KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_VOLU, KC_CIRC, KC_7, KC_8, KC_9, KC_PMNS, XXXXXXX, XXXXXXX, KC_DEL , + CTL_ESC, KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_MUTE, KC_PENT, KC_4, KC_5, KC_6, KC_PPLS, XXXXXXX, KC_ENT , + KC_LSFT, KC_F9 , KC_F10 , KC_F11 , KC_F12 , KC_VOLD, KC_PIPE, KC_1, KC_2, KC_3, KC_PAST, KC_PSLS, TG_NUM , KC_LCTL, KC_LGUI, KC_LALT, NM_SPC2, NM_SPC1, NM_SPC3, KC_PDOT, KC_PCMM, KC_RCTL, KC_PTT ), // Adjust layer is on the split-shift key; or NAV+Enter (for non-split keyboards) - [_ADJUST] = TEMPLATE( - MO_RST , FX(1) , FX(2) , FX(3) , FX(4) , FX(5) , FX(6) , FX(7) , FX(8) , FX(9) , FX(10) , BR_DEC , BR_INC , XXXXXXX, MO_RST , - XXXXXXX, H1_INC , S1_INC , H2_INC , S2_INC , EF_INC , RGB_HUI, RGB_SAI, RGB_MOD, RGB_M_P, DFAULTS, RGB_VAD, RGB_VAI, KC_DEL , + [_ADJUST] = TEMPLATE_ADJUST( + MO_RST , FX(1) , FX(2) , FX(3) , FX(4) , FX(5) , FX(8) , FX(9) , FX(10) , FX(20) , FX(0) , BR_DEC , BR_INC , XXXXXXX, MO_RST , + MO_RST , H1_INC , S1_INC , H2_INC , S2_INC , EF_INC , RGB_HUI, RGB_SAI, RGB_MOD, RGB_M_P, DFAULTS, RGB_VAD, RGB_VAI, MO_RST , XXXXXXX, H1_DEC , S1_DEC , H2_DEC , S2_DEC , EF_DEC , RGB_HUD, RGB_SAD, RGB_RMOD,RGB_M_K, RGB_M_B, RGB_M_G, TG_ADJ , - TG_NKRO, LY_QWER, LY_WORK, LY_NRMN, LY_DVRK, LY_CLMK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MAKE, KC_CAPS, XXXXXXX, - MO_RST , AG_NORM, AG_SWAP, XXXXXXX, BL_STEP, XXXXXXX, RGB_TOG, XXXXXXX, XXXXXXX, TG_GAME), + TG_NKRO, LY_QWER, LY_WORK, LY_NRMN, LY_DVRK, LY_CLMK, XXXXXXX, LY_MALT, XXXXXXX, XXXXXXX, KC_MAKE, KC_CAPS, XXXXXXX, + MO_RST , AG_SWAP, AG_NORM, XXXXXXX, BL_TOGG, XXXXXXX, RGB_TOG, XXXXXXX, XXXXXXX, TG_GAME), // To Reset hit FN + ` + Esc - [_RESET] = TEMPLATE( - RESET , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET , - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - RESET , XXXXXXX, XXXXXXX, XXXXXXX, KC_SLEP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX), + [_RESET] = TEMPLATE_RESET, }; void matrix_scan_user(void) { diff --git a/users/talljoe/talljoe.h b/users/talljoe/talljoe.h index 7c34cd41f..4436c0a04 100644 --- a/users/talljoe/talljoe.h +++ b/users/talljoe/talljoe.h @@ -8,7 +8,7 @@ enum userspace_custom_keycodes { DFAULTS, TOGGLE_BACKLIGHT, EFFECT, - EFFECT_END = EFFECT + 10 + EFFECT_END = EFFECT + 20 }; #ifndef RESET_LAYER @@ -21,6 +21,7 @@ enum layers { _NORMAN, _DVORAK, _COLMAK, + _MALTROFF, _GAME, _NAV, _NUM, @@ -29,7 +30,9 @@ enum layers { }; enum tap_dancers { - TD_SEMICOLON + TD_SEMICOLON, + TD_GRAVE, + TD_QUOTE, }; #define _______ KC_TRNS @@ -39,6 +42,7 @@ enum tap_dancers { #define MO_ADJ MO(_ADJUST) #define MO_RST MO(_RESET) #define TG_ADJ TG(_ADJUST) +#define TG_NUM TG(_NUM) #ifdef ENABLE_GAME_LAYER #define TG_GAME TG(_GAME) #else @@ -49,16 +53,28 @@ enum tap_dancers { #define LY_NRMN DF(_NORMAN) #define LY_DVRK DF(_DVORAK) #define LY_CLMK DF(_COLMAK) +#if SPACE_COUNT >= 2 + #define LY_MALT DF(_MALTROFF) +#else + #define LY_MALT KC_NO +#endif #define TG_NKRO MAGIC_TOGGLE_NKRO #define KC_PTT KC_F24 #define MS_MID KC_MS_BTN3 #define FX(x) (EFFECT + x) -#define US_CAPS CTL_T(KC_ESC) -#define US_QUOT RCTL_T(KC_QUOT) +#define CTL_ESC CTL_T(KC_ESC) +#define US_ENT RCTL_T(KC_ENT) #define US_MINS RCTL_T(KC_QUOT) +#define US_BSLS LCA_T(KC_BSLS) #define US_SCLN TD(TD_SEMICOLON) -#define US_ENT LT(_NUM, KC_ENT) +#define US_GRV TD(TD_GRAVE) +#define US_QUOT TD(TD_QUOTE) +#define US_TAB C_S_T(KC_TAB) +#define SH_LBRC LSFT_T(KC_LBRC) +#define SH_RBRC RSFT_T(KC_RBRC) + +#define MLT_E LT(_NUM, KC_E) #ifndef SPACE_COUNT #define SPACE_COUNT 1 @@ -75,17 +91,34 @@ enum tap_dancers { #define NM_SPC1 _______ #define NM_SPC2 _______ #define NM_SPC3 _______ +#elif (SPACE_COUNT == 2) + #define KC_SPC1 LT(_NAV,KC_SPC) + #define KC_SPC2 LT(_NUM,KC_ENT) + + #define NV_SPC1 KC_SPC + #define NV_SPC2 KC_ENT + + #define NM_SPC1 KC_0 + #define NM_SPC2 KC_SPC + + #define KC_SPC3 XXXXXXX + #define NV_SPC3 XXXXXXX + #define NM_SPC3 XXXXXXX #elif (SPACE_COUNT == 3) - #define KC_SPC1 KC_BSPC + #ifdef SWAP_HANDS_ENABLE + #define KC_SPC1 SH_T(KC_BSPC) + #else + #define KC_SPC1 KC_BSPC + #endif #define KC_SPC2 LT(_NUM,KC_ENT) #define KC_SPC3 LT(_NAV,KC_SPC) #define NV_SPC1 KC_SPC - #define NV_SPC2 C_S_T(KC_ENT) + #define NV_SPC2 KC_ENT #define NV_SPC3 KC_SPC - #define NM_SPC2 XXXXXXX #define NM_SPC1 KC_SPC + #define NM_SPC2 XXXXXXX #define NM_SPC3 KC_0 #else #error "Unsupported space count:" SPACE_COUNT @@ -110,7 +143,7 @@ enum tap_dancers { #define FN_MO2 KC_NO #endif -#ifdef TEMPLATE_TKL +#ifndef TEMPLATE #define _X_ KC_NO #define TEMPLATE( \ KJ4, KJ7, KI7, KH7, KG7, KG4, KF4, KF7, KE7, KD7, KR7, KR4, KE4, KB2, KJ6, \ @@ -126,7 +159,8 @@ enum tap_dancers { KN2, KJ1, KI1, KH1, KG1, KG0, KF0, KF1, KE1, KD1, KR0, KN3, _X_, \ KA4, KP2, KC6, KX1, KK6, KX2, KC0, KM3, KD0, KA1, _X_, _X_, _X_ \ ) -#else +#endif +#ifndef TEMPLATE_TKL #define TEMPLATE_TKL( \ KJ6, KI4, KH4, KH2, KH6, KA7, KE6, KD2, KD4, KB4, KB7, KB6, KB0, KC7, KC5, KA5, \ KJ4, KJ7, KI7, KH7, KG7, KG4, KF4, KF7, KE7, KD7, KR7, KR4, KE4, KB2, KL4, KO4, KQ4, \ @@ -143,4 +177,26 @@ enum tap_dancers { ) #endif +#ifndef TEMPLATE_ALT + #define TEMPLATE_ALT TEMPLATE +#endif +#ifndef TEMPLATE_NUM + #define TEMPLATE_NUM TEMPLATE_ALT +#endif +#ifndef TEMPLATE_NAV + #define TEMPLATE_NAV TEMPLATE_ALT +#endif +#ifndef TEMPLATE_ADJUST + #define TEMPLATE_ADJUST TEMPLATE_ALT +#endif + +#ifndef TEMPLATE_RESET + #define TEMPLATE_RESET TEMPLATE_ALT( \ + RESET , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET , \ + RESET , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET , \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + RESET , XXXXXXX, XXXXXXX, XXXXXXX, RESET , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX) +#endif + #endif diff --git a/users/talljoe/tapdance.c b/users/talljoe/tapdance.c index 3198fc67f..c4d6025f0 100644 --- a/users/talljoe/tapdance.c +++ b/users/talljoe/tapdance.c @@ -1,34 +1,146 @@ //Tap Dance #include "talljoe.h" -// Send semin-colon + enter on two taps -void tap_dance_semicolon(qk_tap_dance_state_t *state, void *user_data) { +enum { + SINGLE_TAP = 1, + SINGLE_HOLD = 2, + DOUBLE_TAP = 3, + DOUBLE_HOLD = 4, + DOUBLE_SINGLE_TAP = 5, //send two single taps + TRIPLE_TAP = 6, + TRIPLE_HOLD = 7, + SPECIAL = 8 +}; + +static struct { + int quote; + int semicolon; +} tap_state = {0}; + +int cur_dance (qk_tap_dance_state_t *state) { + if (state->count == 1) { + //If count = 1, and it has been interrupted - it doesn't matter if it is pressed or not: Send SINGLE_TAP + if (state->interrupted) { + // if (!state->pressed) return SINGLE_TAP; + //need "permissive hold" here. + // else return SINGLE_HOLD; + //If the interrupting key is released before the tap-dance key, then it is a single HOLD + //However, if the tap-dance key is released first, then it is a single TAP + //But how to get access to the state of the interrupting key???? + return SINGLE_TAP; + } + else { + if (!state->pressed) return SINGLE_TAP; + else return SINGLE_HOLD; + } + } + //If count = 2, and it has been interrupted - assume that user is trying to type the letter associated + //with single tap. + else if (state->count == 2) { + if (state->interrupted) return DOUBLE_SINGLE_TAP; + else if (state->pressed) return DOUBLE_HOLD; + else return DOUBLE_TAP; + } + else if ((state->count == 3) && ((state->interrupted) || (!state->pressed))) return TRIPLE_TAP; + else if (state->count == 3) return TRIPLE_HOLD; + else return SPECIAL; +} + +int hold_cur_dance (qk_tap_dance_state_t *state) { + if (state->count == 1) { + if (state->interrupted) { + if (!state->pressed) return SINGLE_TAP; + else return SINGLE_HOLD; + } + else { + if (!state->pressed) return SINGLE_TAP; + else return SINGLE_HOLD; + } + } + //If count = 2, and it has been interrupted - assume that user is trying to type the letter associated + //with single tap. + else if (state->count == 2) { + if (state->pressed) return DOUBLE_HOLD; + else return DOUBLE_TAP; + } + else if (state->count == 3) { + if (!state->pressed) return TRIPLE_TAP; + else return TRIPLE_HOLD; + } + else return SPECIAL; +} + +// Send semi-colon + enter on two taps +void tap_dance_semicolon_finished(qk_tap_dance_state_t *state, void *user_data) { + tap_state.semicolon = hold_cur_dance(state); + switch (tap_state.semicolon) { + case SINGLE_TAP: case DOUBLE_HOLD: register_code(KC_SCLN); break; + case SINGLE_HOLD: layer_on(_NUM); break; + } +} + +void tap_dance_semicolon_reset(qk_tap_dance_state_t *state, void *user_data) { + switch (tap_state.semicolon) { + case SINGLE_TAP: case DOUBLE_HOLD: unregister_code(KC_SCLN); break; + case DOUBLE_TAP: { + if (get_mods()) { + SEND_STRING(";;"); // send normal when mods are pressed + } + else { + SEND_STRING(";\n"); + } + break; + } + case TRIPLE_TAP: { + SEND_STRING(";\n\n"); + } + case SPECIAL: layer_invert(_NUM); break; + case SINGLE_HOLD: layer_off(_NUM); break; + } + tap_state.semicolon = 0; +} + +// Send `. ~. ``` +void tap_dance_grave_finished(qk_tap_dance_state_t *state, void *user_data) { switch(state->count) { case 1: - register_code(KC_SCLN); - unregister_code(KC_SCLN); + SEND_STRING("`"); break; case 2: - register_code(KC_SCLN); - unregister_code(KC_SCLN); - - uint8_t mods = get_mods(); - if (mods) { - clear_mods(); - } - - register_code(KC_ENT); - unregister_code(KC_ENT); - - if (mods) { - set_mods(mods); - } - - reset_tap_dance(state); + SEND_STRING("~"); break; } } +void tap_dance_grave_each(qk_tap_dance_state_t *state, void *user_data) { + if(state->count == 3) { + SEND_STRING("```"); + } else if (state->count > 3) { + SEND_STRING("`"); + } +} + + +void tap_dance_quote_finished(qk_tap_dance_state_t *state, void *user_data) { + tap_state.quote = hold_cur_dance(state); + switch (tap_state.quote) { + case SINGLE_TAP: case DOUBLE_HOLD: register_code(KC_QUOT); break; + case SINGLE_HOLD: layer_on(_NAV); break; + } +} + +void tap_dance_quote_reset(qk_tap_dance_state_t *state, void *user_data) { + switch (tap_state.quote) { + case SINGLE_TAP: case DOUBLE_HOLD: unregister_code(KC_QUOTE); break; + case DOUBLE_TAP: SEND_STRING("\""); break; + case TRIPLE_TAP: layer_invert(_NAV); break; + case SINGLE_HOLD: layer_off(_NAV); break; + } + tap_state.quote = 0; +} + qk_tap_dance_action_t tap_dance_actions[] = { - [TD_SEMICOLON] = ACTION_TAP_DANCE_FN(tap_dance_semicolon), + [TD_SEMICOLON] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, tap_dance_semicolon_finished, tap_dance_semicolon_reset), + [TD_GRAVE] = ACTION_TAP_DANCE_FN_ADVANCED(tap_dance_grave_each, tap_dance_grave_finished, NULL), + [TD_QUOTE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, tap_dance_quote_finished, tap_dance_quote_reset), }; From 14f691d2a749c6f4fd9bf39d219da1369747cd8d Mon Sep 17 00:00:00 2001 From: Mat Greten Date: Wed, 19 Sep 2018 17:15:13 -0600 Subject: [PATCH 112/788] Keymap: meagerfindings ergodox (#3920) * initial commit * updating after review --- .../ergodox/meagerfindings/README.md | 109 ++++ .../community/ergodox/meagerfindings/config.h | 26 + .../community/ergodox/meagerfindings/keymap.c | 558 ++++++++++++++++++ .../community/ergodox/meagerfindings/rules.mk | 3 + 4 files changed, 696 insertions(+) create mode 100644 layouts/community/ergodox/meagerfindings/README.md create mode 100644 layouts/community/ergodox/meagerfindings/config.h create mode 100644 layouts/community/ergodox/meagerfindings/keymap.c create mode 100644 layouts/community/ergodox/meagerfindings/rules.mk diff --git a/layouts/community/ergodox/meagerfindings/README.md b/layouts/community/ergodox/meagerfindings/README.md new file mode 100644 index 000000000..e7e4270db --- /dev/null +++ b/layouts/community/ergodox/meagerfindings/README.md @@ -0,0 +1,109 @@ +![Base](https://meagerfindings.com/assets/img/ergodox/base.png) + +# Meagerfinding's ErgoDox Layout + + + +- [Overview](#overview) +- [Credit where credit is due](#credit-where-credit-is-due) +- [Features](#features) + - [Tap/Hold Macro Keys](#taphold-macro-keys) + - [TapDance Keys](#tapdance-keys) +- [Base Layer](#base-layer) + - [Things to note:](#things-to-note) +- [Old Base Layer](#old-base-layer) +- [Symbols Layer](#symbols-layer) +- [Mouse & Media Keys Layer](#mouse-media-keys-layer) +- [Markdown Layer](#markdown-layer) +- [Arrow/Movements Layer](#arrowmovements-layer) +- [Numpad Layer](#numpad-layer) + + + +## Overview + +The overall goals of this layout are to: +1. Use the Ergodox thumb clusters to eliminate pinky reach. +2. Place as many useful keys under the home rows as possible. + +I first decided to build an ErgoDox as I wanted to use my thumbs for more with the added ergonomic benefits of a split board and ortholinear layout. I knew my hands were hurting from the weird contortions of copying and pasting constantly on my Mac, but I had no idea how strained I really was until I started moving as many modifier keys to the thumb clusters. + +## Credit where credit is due + +The initial layout used created on the [ErgoDox EZ Configurator](https://ergodox-ez.com/pages/graphical-configurator). I went through 26+ iterations within the configurator prior to beginning my journey with QMK itself. Much of the dual function/layer keys are influenced by and adapted from the EZ Configurator. + +Many features in this layout are either directly inspired by or are adaptations of [Algernon's incredible ErgoDox layout](https://github.com/algernon/ergodox-layout). Specifically: TapDance and its usage, and the brilliant idea of using TapDance to pair down the four keys for parens, brackets, and curly braces into just 2 keys. + +## Features + +### Tap/Hold Macro Keys +* `Paste/Paste Special` key sends Paste on tap and Paste Special when held. +* `Screen/Video` key sends `||scrn` when tapped and `||video` when held + - [Typinator](http://www.ergonis.com/products/typinator/) expands `||scrn` into `(Screenshot: )`, and `||video` into `(Video: )`, the QMK macro then moves back to before the last paren, inserts a space and removes a space to create a hyperlink for use in Zendesk. +* When tapped, `Todoist` toggles quick add window for a new Todoist task (`CMD + Shift + A`) and switches to Todoist when held +* The RubyMine key opens RubyMine by triggering spotlight, typing out `Rubymine`, and submitting the enter key. +* `Zendesk` triggers spotlight and then calls Typinator expansion to open my Zendesk Agent dashboard in Chrome. + + +### TapDance Keys +* `Copy/Cut` key copies on tap, cut's on two taps. +* One tap on `Snagit` key = sends `Ctrl + Shift + C` which is Snagit's selector and two taps on `Snagit` key = `Cmd + Shift + Opt + 4`, OS X cropping screenshot that is copied to the clipboard only. +* Tapping the `[{(`/`)}]` keys once yields `[` or `{` when the shift key is engaged, tapping them twice yields `(`. + +## Base Layer + +![Base](https://meagerfindings.com/assets/img/ergodox/base.png) + +The base layer retains the alphas from the QWERTY layout without any modifications. + +### Things to note: + +- The shift key is a One Shot Modifier key, meaning shift is not submitted when the key is tapped, instead, it only submits when you either tap it again, or on the next key press. + - There is no CAPSLOCK key designated as it is pretty comfortable to simply hold down shift in this layout and continue typing. +- There is only one layer that you can fully switch to on this layout, the [Old Base layer](#old-base-layer). All other layers require holding a key to reach them. For the most part, the key that toggles a layer, will be on the opposite hand that will be typing with that layer. + - For example: the symbols layer is reached by holding down the enter key with your right thumb, and most of the symbols are located on the left hand board. + + +## Old Base Layer + +![Old Base](https://meagerfindings.com/assets/img/ergodox/old_base.png) + +I am moving into a new position (software engineering) at work from a Support position. My hope is to use my F keys more often and write fewer emails. This is my old base layer, still easily accessible, as I'm not used to having F key's on my top row quite yet. + +## Symbols Layer + +![Symbols](https://meagerfindings.com/assets/img/ergodox/symbols.png) + +Holding down the `enter` key with your right thumb toggles the symbol layer. + +I've placed my most used symbols under the homerow. Granted, right now I mainly right emails/support ticket responses, so this home row may need to change as I transition to software engineering. + +## Mouse & Media Keys Layer + +![Mouse & Media](https://meagerfindings.com/assets/img/ergodox/mouse_media.png) + +Holding down the `:` key on with your right pinky toggles the mouse and media layer. Your left hand controls the mouse directions just in a similar fashion to the keys used in the [movement layer](#arrowmovements-layer). + +The right hand has a media controls under the homerow for quick muting/pausing. + +* `XKCD #1319` Key that ironically partially-automates accessing the link to [XKCD #1319](https://xkcd.com/1319/). + +## Markdown Layer + +![Markdown](https://meagerfindings.com/assets/img/ergodox/markdown.png) + +This layer places most common markdown symbols under the right hand. You can reach this layer by holding down the `F` key on your left hand. + +## Arrow/Movements Layer + +![Movement](https://meagerfindings.com/assets/img/ergodox/movement_arrows.png) + +Toggled by holding down the space key with the right thumb. This isn't vim like movement, nope, it's `WASD` but over one column. So I guess it's actually `ESDF` on the left hand and `IJKL` on the right hand to better line up with the columns offset/staggered columns on the Dox. + +## Numpad Layer + +![Numpad](https://meagerfindings.com/assets/img/ergodox/numpad.png) + +My right hand is pretty comfortable with tenkey number input so this is easily accessible by holding down backspace with the left thumb. + +Also, on the left hand, there is a tap to copy and hold to cut macro under the `D` key, and a tap to paste and a hold to paste special macro on the `F` key. I guess I'm to too lazy to move my fingers when copying/pasting... diff --git a/layouts/community/ergodox/meagerfindings/config.h b/layouts/community/ergodox/meagerfindings/config.h new file mode 100644 index 000000000..3d4f11b43 --- /dev/null +++ b/layouts/community/ergodox/meagerfindings/config.h @@ -0,0 +1,26 @@ +#undef VENDOR_ID +#define VENDOR_ID 0xFEED +#undef PRODUCT_ID +#define PRODUCT_ID 0x1307 +#undef DEVICE_VER +#define DEVICE_VER 0x0001 +#undef MANUFACTURER +#define MANUFACTURER meagerfindings +#undef PRODUCT +#define PRODUCT ErgoDox +#undef DESCRIPTION +#define DESCRIPTION meagerfindings firmware for Ergodox + +#define USB_MAX_POWER_CONSUMPTION 500 + +#undef MOUSEKEY_INTERVAL +#define MOUSEKEY_INTERVAL 20 +#undef MOUSEKEY_DELAY +#define MOUSEKEY_DELAY 0 +#undef MOUSEKEY_TIME_TO_MAX +#define MOUSEKEY_TIME_TO_MAX 18 +#undef MOUSEKEY_MAX_SPEED +#define MOUSEKEY_MAX_SPEED 4 + +#undef TAPPING_TERM +#define TAPPING_TERM 200 diff --git a/layouts/community/ergodox/meagerfindings/keymap.c b/layouts/community/ergodox/meagerfindings/keymap.c new file mode 100644 index 000000000..62504f966 --- /dev/null +++ b/layouts/community/ergodox/meagerfindings/keymap.c @@ -0,0 +1,558 @@ +#include QMK_KEYBOARD_H +#include "version.h" + +enum { + BASE = 0, + OLD_BASE, + SYMBL, + MEDIA, + MKDWN, + ARROWS, + NUM, +}; + +enum custom_keycodes { + PLACEHOLDER = SAFE_RANGE, // can always be here + EPRM, + VRSN, + MD_LINK, + XKCD, + DBLE_ZER0, + L_ID_0, + L_ID_1, + L_ID_2, + PAST_PS, + TODO, + RUBYMINE, + ZENDESK, + DBLE_ASTR, + TRPLE_GRAVE, + H_ONE, + H_TWO, + H_THREE, + H_FOUR, + H_FIVE, + M_LINK, + M_GREATER, + TD_COPY_CUT = 6, + TD_SNAGIT = 8, + TD_B_L_SEL = 10, + CT_LBP = 11, + CT_RBP = 12 +}; + +//Redefine Key Names for Readaibilty +#define XXXXXXX KC_NO +#define SCRN_CLIPB LCTL(LGUI(LSFT(KC_4))) +#define CHRM_L LALT(LGUI(KC_LEFT)) //Move left one tab in Chrome +#define CHRM_R LALT(LGUI(KC_RIGHT)) //Move right one tab in Chrome +#define S_CMD_S LGUI_T(KC_S) //`S` when typing `CMD` when held +#define D_CMD_OPT LGUI_T(LALT_T(KC_D)) //`D` when typing `CMD + Opt` when held + +static uint16_t key_timer; //key timer for macros + +//Tap Dance Definitions +qk_tap_dance_action_t tap_dance_actions[] = { + //Tap once for Copy, twice for Paste, three times for Cut. + [TD_COPY_CUT] = ACTION_TAP_DANCE_DOUBLE(LGUI(KC_C),LGUI(KC_X)), + //Tap once for Snagit, twice for Cmd + Shift + Opt + 4 (OS X cropping screenshot that is copied to the clipboard only.) + [TD_SNAGIT] = ACTION_TAP_DANCE_DOUBLE(LCTL(LSFT(KC_C)), LCTL(LGUI(LSFT(KC_4)))), + [CT_LBP] = ACTION_TAP_DANCE_DOUBLE (KC_LBRC, KC_LPRN), + [CT_RBP] = ACTION_TAP_DANCE_DOUBLE (KC_RBRC, KC_RPRN) +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* Keymap 0: Basic layer + * ,--------------------------------------------------. ,--------------------------------------------------. + * | = | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | - | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | Tab | Q | W | E | R | T | "> " | | []() | Y | U | I | O | P | \ | + * |--------+------+------+------+------+------| | | SCRN |------+------+------+------+------+--------| + * | Hyper | A |S /CMD|D/OPT | F /MD| G |------| |------| H | J |K/OPT |L /CMD| ; /L2| '/Hyper| + * |--------+------+------+------+------+------| ( | | ) |------+------+------+------+------+--------| + * |Shft Tab|Z/Ctrl|X/Alt | C | V | B | [ { | | ] } | N | M | , | ./Alt|//Ctrl|CMD+SHFT| + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | ` |Zendsk|RBMINE|CMD+S | ToDo | | _ | | 00 | 00 |OLD BASE| + * `----------------------------------' `----------------------------------' + * ,-------------. ,--------------. + * | Esc | Home | |Layer?| Esc | + * ,------|------|------| |------+-------+------. + * | | | End | | Undo | | | + * |Shift |Backsp|------| |------| Return|Space/| + * | OSM | /NUM | DEL | | Ctrl | /SYML |Arrows| + * `--------------------' `---------------------' + * + *Copy/Cut key copies on tap, cut's on two taps. + * + *One tap on Snagit key = is Ctrl + Shift + C which is Snagit's selector. + *Two taps on Snagit key = Cmd + Shift + Opt + 4 (OS X cropping screenshot that is copied to the clipboard only.) + */ + + [BASE] = LAYOUT_ergodox( + //left hand + KC_EQUAL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, M_GREATER, + OSM(MOD_HYPR), KC_A, S_CMD_S, ALT_T(KC_D), LT(MKDWN,KC_F), KC_G, + LSFT(KC_TAB), CTL_T(KC_Z), ALT_T(KC_X), KC_C, KC_V, KC_B, TD(CT_LBP), + KC_GRAVE, ZENDESK, RUBYMINE, LGUI(KC_S), TODO, + KC_ESCAPE, KC_HOME, + KC_END, + OSM(MOD_LSFT), LT(NUM,KC_BSPACE), LT(MKDWN,KC_DELETE), + + //right hand + KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_MINUS, + MD_LINK, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLASH, + KC_H, KC_J, ALT_T(KC_K), LGUI_T(KC_L), LT(MEDIA,KC_SCOLON), ALL_T(KC_QUOTE), + TD(CT_RBP), KC_N, KC_M, KC_COMMA, ALT_T(KC_DOT), CTL_T(KC_SLASH), SCMD_T(_______), + LSFT(KC_MINUS), _______, DBLE_ZER0, DBLE_ZER0, TO(OLD_BASE), + L_ID_0, KC_ESCAPE, + LGUI(KC_Z), + LT(MEDIA,KC_LCTL), LT(SYMBL,KC_ENTER), LT(ARROWS,KC_SPACE)), + + /* Keymap 1: OLD Base layer + * ,--------------------------------------------------. ,--------------------------------------------------. + * | = | 1 | 2 | 3 | 4 | 5 | []() | |Snagit| 6 | 7 | 8 | 9 | 0 | - | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | Tab | Q | W | E | R | T | "> " | | []() | Y | U | I | O | P | \ | + * |--------+------+------+------+------+------| | | SCRN |------+------+------+------+------+--------| + * | Hyper | A |S /CMD| D | F | G |------| |------| H | J | K |L /CMD| ; /L2| '/Hyper| + * |--------+------+------+------+------+------| ( | | ) |------+------+------+------+------+--------| + * |Shft Tab|Z/Ctrl|X/Alt | C | V | B | [ { | | ] } | N | M | , | ./Alt|//Ctrl|CMD+SHFT| + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | ` |Zendsk|RBMINE|CMD+S | ToDo | | _ | | 00 | 00 |ToBase| + * `----------------------------------' `----------------------------------' + * ,-------------. ,--------------. + * | Esc | Home | |Layer?| Esc | + * ,------|------|------| |------+-------+------. + * | | | End | | Undo | | | + * |Shift |Backsp|------| |------| Return|Space/| + * | OSM | /L5 | DEL | | Ctrl | /LT1 |Arrows| + * `--------------------' `---------------------' + * + *Copy/Cut key copies on tap, cut's on two taps. + * + *One tap on Snagit key = is Ctrl + Shift + C which is Snagit's selector. + *Two taps on Snagit key = Cmd + Shift + Opt + 4 (OS X cropping screenshot that is copied to the clipboard only.) + */ + + [OLD_BASE] = LAYOUT_ergodox( + //left hand + KC_EQUAL, KC_1, KC_2, KC_3, KC_4, KC_5, M_LINK, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, M_GREATER, + OSM(MOD_HYPR), KC_A, S_CMD_S, D_CMD_OPT, LT(MKDWN,KC_F),KC_G, + LSFT(KC_TAB), CTL_T(KC_Z), ALT_T(KC_X), KC_C, KC_V, KC_B, TD(CT_LBP), + KC_GRAVE, ZENDESK, RUBYMINE, LGUI(KC_S), TODO, + KC_ESCAPE, KC_HOME, + KC_END, + OSM(MOD_LSFT), LT(NUM,KC_BSPACE), LT(MKDWN,KC_DELETE), + + //right hand + TD(TD_SNAGIT), KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, + MD_LINK, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLASH, + KC_H, KC_J, KC_K, LGUI_T(KC_L), LT(MEDIA,KC_SCOLON), ALL_T(KC_QUOTE), + TD(CT_RBP), KC_N, KC_M, KC_COMMA, ALT_T(KC_DOT), CTL_T(KC_SLASH), SCMD_T(_______), + LSFT(KC_MINUS), _______, DBLE_ZER0, DBLE_ZER0, TO(BASE), + L_ID_0, KC_ESCAPE, + LGUI(KC_Z), + LT(MEDIA,KC_LCTL), LT(SYMBL,KC_ENTER), LT(ARROWS,KC_SPACE)), + + /* Keymap 2: Symbol + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | 1 | 2 | 3 | 4 | 5 | []() | |Snagit| 6 | 7 | 8 | 9 | 0 | - | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | $ | & | ` | | | Cmd | | | | | * | | | | + * |--------+------+------+------+------+------| + K | | |------+------+------+------+------+--------| + * | | # | $ | & | ! | @ |------| |------| - | [ | ] | ( | ) | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | % | ^ | | | ~ | | | | | | | | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | |Layer?| | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ + // SYMBOLS + [SYMBL] = LAYOUT_ergodox( + //left hand + _______, KC_1, KC_2, KC_3, KC_4, KC_5, M_LINK, + _______, _______, KC_DLR, KC_AMPR, KC_GRAVE, KC_PIPE, LGUI(KC_K), + _______, KC_HASH, KC_DLR, KC_AMPR, KC_EXLM, KC_AT, + _______, KC_PERC, KC_CIRC, _______, _______, KC_TILD, _______, + _______, _______, _______, _______, _______, + _______, _______, + _______, + _______, _______, _______, + + //right hand + TD(TD_SNAGIT), KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, + _______, _______, _______, KC_PAST, _______, _______, _______, + KC_MINUS, KC_LBRC, KC_RBRC, KC_LPRN, KC_RPRN, _______, + _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, + L_ID_1, _______, + _______, + _______, _______, _______), + + /* Keymap 3: Media and mouse keys + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | XKCD | | | | | | F15 | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | |Whl Up| MsUp |Whl Dn| | | | | | | | | | F14 | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | |Ctl L |MsLeft|MsDown|MsRght| Ctl R|------| |------| | Mute | VolDn| VolUp| TL 2 | Play | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | |WHL L | |Whl R | | | | | | | Prev | Next | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | Mute | | | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | |LAYER?| | + * ,------|------|------| |------+------+------. + * | Left |Right | | | |Copy/ | paste| + * | Click|Click |------| |------| cut |/paste| + * | | | | | | |spcial| + * `--------------------' `--------------------' + */ + // MEDIA AND MOUSE + + [MEDIA] = LAYOUT_ergodox( + //left hand + _______, _______, _______, _______, _______, _______, _______, + _______, _______, KC_MS_WH_UP, KC_MS_UP, KC_MS_WH_DOWN, _______, _______, + _______, LCTL(KC_LEFT), KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, RCTL(KC_RIGHT), + XXXXXXX, _______, KC_MS_WH_LEFT, _______, KC_MS_WH_RIGHT, _______, _______, + _______, _______, _______, _______, _______, + _______, _______, + _______, + KC_MS_BTN1, KC_MS_BTN2, _______, + + //right hand + XKCD, _______, _______, _______, _______, _______, KC_F15, + _______, _______, _______, _______, _______, _______, KC_F14, + _______, KC_AUDIO_MUTE, KC_AUDIO_VOL_DOWN, KC_AUDIO_VOL_UP, _______, KC_MEDIA_PLAY_PAUSE, + _______, _______, _______, KC_MEDIA_PREV_TRACK, KC_MEDIA_NEXT_TRACK, _______, XXXXXXX, + _______, _______, _______, _______, _______, + L_ID_2, _______, + _______, + _______, TD(TD_COPY_CUT), PAST_PS), + + /* Keymap 4: Markdown Symbols + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | |SCRNCL| | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | | | | | | | | | ``` | ** | _ | ` | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | TL MD| |------| |------| - | [ | ] | ( | ) | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | | | | # | ## | ### | #### | #####| | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | |Layer?| | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + * Sc cp = OS X cropping screenshot that is copied to the clipboard only. + */ + // Markdown Layer + [MKDWN] = LAYOUT_ergodox( + //left hand + _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, + _______, _______, + _______, + _______, _______, _______, + + //right hand + SCRN_CLIPB, _______, _______, _______, _______, _______, _______, + _______, _______, TRPLE_GRAVE, DBLE_ASTR,LSFT(KC_MINUS), KC_GRAVE, _______, + KC_MINUS, KC_LBRC, KC_RBRC, KC_LPRN, KC_RPRN, _______, + _______, H_ONE, H_TWO, H_THREE, H_FOUR, H_FIVE, _______, + _______, _______, _______, _______, _______, + _______, _______, + _______, + _______, _______, _______), + + /* Keymap 5: Arrows + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | RESET | | | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | Opt+L| Up |Opt+R | | | | | | Opt+L| Up |Opt+R | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | |Ctrl+L| Left | Dn | Right|Ctrl+R|------| |------|Ctrl+L| Left | Dn | Right|Ctrl+R| | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | | | | | | | | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + * + * + * + */ + // Movement Layer + + [ARROWS] = LAYOUT_ergodox( + //left hand + RESET, _______, _______, _______, _______, _______, _______, + _______, _______, CHRM_L, KC_UP, CHRM_R, _______, _______, + _______,LCTL(KC_LEFT), KC_LEFT, KC_DOWN, KC_RIGHT, LCTL(KC_RIGHT), + _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, + _______, _______, + _______, + _______, _______, _______, + //right hand + _______, _______, _______, _______, _______, _______, _______, + _______, _______, CHRM_L, KC_UP, CHRM_R, _______, _______, + LCTL(KC_LEFT), KC_LEFT, KC_DOWN, LGUI_T(KC_RIGHT), LCTL(KC_RIGHT), _______, + _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, + _______, _______, + _______, + _______, _______, _______), + + /* Keymap 6: Numpad + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | | | | | | | | = | 7 | 8 | 9 | * | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | |Cp/Cut|paste | |------| |------| + | 4 | 5 | 6 | + | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | | | | - | 1 | 2 | 3 | / | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | 0 | . | 00 | 00 | Enter| + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | |Nupmad| | + * | | |------| |------|Enter | | + * | | | | | | | | + * `--------------------' `--------------------' + */ + // Numpad Layer + [NUM] = LAYOUT_ergodox( + //left hand + _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, TD(TD_COPY_CUT), PAST_PS, _______, + _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, + _______, _______, + _______, + _______, _______, _______, + + //right hand + _______, _______, _______, _______, _______, _______, _______, + _______, KC_EQUAL, KC_7, KC_8, KC_9, KC_ASTR, _______, + KC_PLUS, KC_4, KC_5, KC_6, KC_PLUS, _______, + _______, KC_MINUS, KC_1, KC_2, KC_3, KC_KP_SLASH, _______, + KC_KP_0, KC_DOT, DBLE_ZER0, DBLE_ZER0, KC_KP_ENTER, + _______, _______, + _______, + _______, KC_PENT, _______), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + + switch (keycode) { + case EPRM: + if (record->event.pressed) { + eeconfig_init(); + } + return false; + break; + + case VRSN: + if (record->event.pressed) { + SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); + } + return false; + break; + + case MD_LINK: + if (record->event.pressed){ + key_timer = timer_read(); + } else { + if (timer_elapsed(key_timer) > 150) { + SEND_STRING ("([Video]("); + } else { + SEND_STRING ("([Screenshot]("); + } + SEND_STRING(SS_LGUI("v")); + SEND_STRING("))"); + } + break; + + case XKCD: + if (record->event.pressed) { + SEND_STRING ("https://xkcd.com/1319/"); + } + break; + + case DBLE_ZER0: + if (record->event.pressed){ + SEND_STRING ("00"); + } + break; + + case DBLE_ASTR: + if (record->event.pressed){ + SEND_STRING ("**"); + SEND_STRING ("**"); + SEND_STRING (SS_TAP(X_LEFT)); + SEND_STRING (SS_TAP(X_LEFT)); + } + break; + + case TRPLE_GRAVE: + if (record->event.pressed){ + SEND_STRING ("```"); + } + break; + + case L_ID_0: + if (record->event.pressed) { + SEND_STRING (SS_LGUI(" ")); + SEND_STRING ("Layer 0: Base"); + } + break; + + case L_ID_1: + if (record->event.pressed) { + SEND_STRING (SS_LGUI(" ")); + SEND_STRING ("Layer 1: Symbols"); + } + break; + + case L_ID_2: + if (record->event.pressed) { + SEND_STRING (SS_LGUI(" ")); + SEND_STRING ("Layer 2: Media & Mousekeys"); + } + break; + + case PAST_PS: + if (record->event.pressed) { + key_timer = timer_read(); + } else { + if (timer_elapsed(key_timer) > 150) { + SEND_STRING (SS_LGUI("V")); // Paste special + } else { + SEND_STRING (SS_LGUI("v")); // Paste + } + } + break; + + case TODO: + if (record->event.pressed) { + key_timer = timer_read(); + } else { + if (timer_elapsed(key_timer) > 150) { //switch to Todoist when held and released + SEND_STRING (SS_LGUI(" ")); + SEND_STRING ("Todoist"); + SEND_STRING (SS_TAP(X_ENTER)); + } else { + SEND_STRING (SS_LGUI(SS_LCTRL("a"))); //macro to open Todoist new task dialog + } + } + break; + + case RUBYMINE: + if (record->event.pressed){ + SEND_STRING (SS_LGUI(" ")); + SEND_STRING ("RUBYMINE"); + SEND_STRING (SS_TAP(X_ENTER)); + } + break; + + case ZENDESK: + if (record->event.pressed){ + SEND_STRING (SS_LGUI(" ")); + SEND_STRING ("||ZEN"); + SEND_STRING (SS_TAP(X_ENTER)); + } + break; + + case H_ONE: + if (record->event.pressed){ + SEND_STRING ("# "); + } + break; + + case H_TWO: + if (record->event.pressed){ + SEND_STRING ("## "); + } + break; + + case H_THREE: + if (record->event.pressed){ + SEND_STRING ("### "); + } + break; + + case H_FOUR: + if (record->event.pressed){ + SEND_STRING ("#### "); + } + break; + + case H_FIVE: + if (record->event.pressed){ + SEND_STRING ("##### "); + } + break; + case M_LINK: + if (record->event.pressed){ + SEND_STRING ("[]()"); + } + break; + case M_GREATER: + if (record->event.pressed){ + SEND_STRING ("> "); + } + break; + } + return true; +}; + +void matrix_scan_user(void) { + uint8_t layer = biton32(layer_state); + + ergodox_board_led_off(); + ergodox_right_led_1_off(); + ergodox_right_led_2_off(); + ergodox_right_led_3_off(); + switch (layer) { + case 1: + ergodox_right_led_1_on(); + break; + case 2: + ergodox_right_led_2_on(); + break; + default: + break; + } +}; diff --git a/layouts/community/ergodox/meagerfindings/rules.mk b/layouts/community/ergodox/meagerfindings/rules.mk new file mode 100644 index 000000000..c775e1f6d --- /dev/null +++ b/layouts/community/ergodox/meagerfindings/rules.mk @@ -0,0 +1,3 @@ +COMMAND_ENABLE = no +TAP_DANCE_ENABLE = yes +FORCE_NKRO = yes From 77433b1a3140411b8b8f1b0389827c38384fc5fe Mon Sep 17 00:00:00 2001 From: itsdrdick Date: Thu, 20 Sep 2018 07:16:18 +0800 Subject: [PATCH 113/788] Keyboard: Add evil80 keyboard (#3921) * Add evil80 keyboard * Delete rules.mk * Update config.h * Update keymap.c * Update keymap.c --- keyboards/evil80/config.h | 64 +++++++++++++++++++++ keyboards/evil80/evil80.c | 47 ++++++++++++++++ keyboards/evil80/evil80.h | 23 ++++++++ keyboards/evil80/info.json | 13 +++++ keyboards/evil80/keymaps/default/keymap.c | 31 +++++++++++ keyboards/evil80/rules.mk | 68 +++++++++++++++++++++++ 6 files changed, 246 insertions(+) create mode 100644 keyboards/evil80/config.h create mode 100644 keyboards/evil80/evil80.c create mode 100644 keyboards/evil80/evil80.h create mode 100644 keyboards/evil80/info.json create mode 100644 keyboards/evil80/keymaps/default/keymap.c create mode 100644 keyboards/evil80/rules.mk diff --git a/keyboards/evil80/config.h b/keyboards/evil80/config.h new file mode 100644 index 000000000..81138a770 --- /dev/null +++ b/keyboards/evil80/config.h @@ -0,0 +1,64 @@ +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Evil +#define PRODUCT Evil80 +#define DESCRIPTION QMK keyboard firmware for Evil80 + +/* key matrix size */ +#define MATRIX_ROWS 6 +#define MATRIX_COLS 16 + +/* Planck PCB default pin-out */ +#define MATRIX_ROW_PINS { F1, F4, F5, F0, B3, B0 } +#define MATRIX_COL_PINS { B2, D0, D1, D2, D3, D5, D4, D6, D7, B4, B1, C6, C7, E6, F6, F7 } +#define UNUSED_PINS + +#define BACKLIGHT_PIN B5 +#define BACKLIGHT_BREATHING + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ +#define BACKLIGHT_LEVELS 3 + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCING_DELAY 5 + +/* 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 + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* + * 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 diff --git a/keyboards/evil80/evil80.c b/keyboards/evil80/evil80.c new file mode 100644 index 000000000..d4653d049 --- /dev/null +++ b/keyboards/evil80/evil80.c @@ -0,0 +1,47 @@ +#include "evil80.h" +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + led_init_ports(); + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} + +void led_init_ports(void) { + DDRB |= (1<<6) | (1<<7); // OUT +} + +void led_set_kb(uint8_t usb_led) { + if (usb_led & (1<", "x":10.25, "y":4.5}, {"label":"?", "x":11.25, "y":4.5}, {"label":"Shift", "x":12.25, "y":4.5, "w":1.75}, {"x":14, "y":4.5}, {"label":"\u2191", "x":16.25, "y":4.5}, {"label":"Ctrl", "x":0, "y":5.5, "w":1.25}, {"label":"Win", "x":1.25, "y":5.5, "w":1.25}, {"label":"Alt", "x":2.5, "y":5.5, "w":1.25}, {"x":3.75, "y":5.5, "w":6.25}, {"label":"Alt", "x":10, "y":5.5, "w":1.25}, {"label":"Win", "x":11.25, "y":5.5, "w":1.25}, {"label":"Menu", "x":12.5, "y":5.5, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":5.5, "w":1.25}, {"label":"\u2190", "x":15.25, "y":5.5}, {"label":"\u2193", "x":16.25, "y":5.5}, {"label":"\u2192", "x":17.25, "y":5.5}] + } + } +} \ No newline at end of file diff --git a/keyboards/evil80/keymaps/default/keymap.c b/keyboards/evil80/keymaps/default/keymap.c new file mode 100644 index 000000000..1706517a2 --- /dev/null +++ b/keyboards/evil80/keymaps/default/keymap.c @@ -0,0 +1,31 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* 0: Winkey */ + LAYOUT( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR,KC_SLCK,KC_PAUS,\ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,KC_MINS, KC_EQL,KC_BSPC, KC_INS,KC_HOME,KC_PGUP,\ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,KC_LBRC,KC_RBRC,KC_BSLS, KC_DEL, KC_END,KC_PGDN,\ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L,KC_SCLN,KC_QUOT,KC_NUHS, KC_ENT, \ + KC_LSFT,KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M,KC_COMM, KC_DOT,KC_SLSH,KC_RSFT, MO(2), KC_UP, \ + KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI, KC_APP,KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT \ + ), + /* 1: Winkeyless */ + LAYOUT( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR,KC_SLCK,KC_PAUS,\ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,KC_MINS, KC_EQL,KC_BSPC, KC_INS,KC_HOME,KC_PGUP,\ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,KC_LBRC,KC_RBRC,KC_BSLS, KC_DEL, KC_END,KC_PGDN,\ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L,KC_SCLN,KC_QUOT,KC_NUHS, KC_ENT, \ + KC_LSFT,KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M,KC_COMM, KC_DOT,KC_SLSH,KC_RSFT, MO(2), KC_UP, \ + KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_NO,KC_RALT,KC_RGUI,KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT \ + ), + /* 2: Fn */ + LAYOUT( + KC_TRNS, BL_ON, BL_OFF,BL_STEP,BL_BRTG,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,\ + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,\ + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,\ + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, \ + KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS \ + ), +}; diff --git a/keyboards/evil80/rules.mk b/keyboards/evil80/rules.mk new file mode 100644 index 000000000..1067b4344 --- /dev/null +++ b/keyboards/evil80/rules.mk @@ -0,0 +1,68 @@ +# MCU name +#MCU = at90usb1287 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +OPT_DEFS += -DBOOTLOADER_SIZE=4096 + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = no # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. +API_SYSEX_ENABLE = no + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend From 334e2629df4adb44b0ac0dff3363a6daebc072e7 Mon Sep 17 00:00:00 2001 From: Anthony Wharton Date: Thu, 20 Sep 2018 00:18:15 +0100 Subject: [PATCH 114/788] Remove redefinition of `_______` in documentation example (#3924) * Remove redefinition of `_______` in documentation example * Slight rewording to include purpose of defintions * Update include to newer macro --- docs/keymap.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/docs/keymap.md b/docs/keymap.md index b28d21a21..382a0e911 100644 --- a/docs/keymap.md +++ b/docs/keymap.md @@ -89,11 +89,15 @@ There are 3 main sections of a `keymap.c` file you'll want to concern yourself w At the top of the file you'll find this: - #include "clueboard.h" + #include QMK_KEYBOARD_H // Helpful defines #define GRAVE_MODS (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)|MOD_BIT(KC_LGUI)|MOD_BIT(KC_RGUI)|MOD_BIT(KC_LALT)|MOD_BIT(KC_RALT)) - #define _______ KC_TRNS + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * You can use _______ in place for KC_TRNS (transparent) * + * Or you can use XXXXXXX for KC_NO (NOOP) * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ // Each layer gets a name for readability. // The underscores don't mean anything - you can @@ -105,7 +109,9 @@ At the top of the file you'll find this: #define _FL 1 #define _CL 2 -These are some handy definitions we can use when building our keymap and our custom function. The `GRAVE_MODS` definition will be used later in our custom function. The `_______` define makes it easier to see what keys a layer is overriding, while the `_BL`, `_FL`, and `_CL` defines make it easier to refer to each of our layers. +These are some handy definitions we can use when building our keymap and our custom function. The `GRAVE_MODS` definition will be used later in our custom function, and the following `_BL`, `_FL`, and `_CL` defines make it easier to refer to each of our layers. + +Note: You may also find some older keymap files may also have a define(s) for `_______` and/or `XXXXXXX`. These can be used in place for `KC_TRNS` and `KC_NO` respectively, making it easier to see what keys a layer is overriding. These definitions are now unecessary, as they are included by default. ### Layers and Keymaps From 2bdeccd7baab67df2d0c04c1c8167277f7217d3e Mon Sep 17 00:00:00 2001 From: holtenc Date: Wed, 19 Sep 2018 18:20:36 -0500 Subject: [PATCH 115/788] Keyboard: Add Prime_EXL prototype to 'handwired' (#3932) * initial commit * Update readme.md * Update keymap.c added comment for description of function to control LED as layer indicator * corrected formatting as requested. * format for configurator * corrected info.json to propertly reflect layout in Configurator * updated layouts to reflect physical keyboard --- keyboards/handwired/prime_exl/config.h | 56 +++++++ keyboards/handwired/prime_exl/info.json | 12 ++ .../prime_exl/keymaps/default/config.h | 19 +++ .../prime_exl/keymaps/default/keymap.c | 143 ++++++++++++++++++ .../prime_exl/keymaps/default/readme.md | 1 + keyboards/handwired/prime_exl/prime_exl.c | 43 ++++++ keyboards/handwired/prime_exl/prime_exl.h | 40 +++++ keyboards/handwired/prime_exl/readme.md | 15 ++ keyboards/handwired/prime_exl/rules.mk | 80 ++++++++++ 9 files changed, 409 insertions(+) create mode 100644 keyboards/handwired/prime_exl/config.h create mode 100644 keyboards/handwired/prime_exl/info.json create mode 100644 keyboards/handwired/prime_exl/keymaps/default/config.h create mode 100644 keyboards/handwired/prime_exl/keymaps/default/keymap.c create mode 100644 keyboards/handwired/prime_exl/keymaps/default/readme.md create mode 100644 keyboards/handwired/prime_exl/prime_exl.c create mode 100644 keyboards/handwired/prime_exl/prime_exl.h create mode 100644 keyboards/handwired/prime_exl/readme.md create mode 100644 keyboards/handwired/prime_exl/rules.mk diff --git a/keyboards/handwired/prime_exl/config.h b/keyboards/handwired/prime_exl/config.h new file mode 100644 index 000000000..e34fbb8cc --- /dev/null +++ b/keyboards/handwired/prime_exl/config.h @@ -0,0 +1,56 @@ +/* +Copyright 2018 Holten Campbell + +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 . +*/ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x4024 +#define DEVICE_VER 0x0001 +#define MANUFACTURER PrimeKB +#define PRODUCT Prime_EXL +#define DESCRIPTION Ergo + +/* key matrix size */ +#define MATRIX_ROWS 10 +#define MATRIX_COLS 9 + +/* Keyboard Matrix Assignments */ +#define MATRIX_ROW_PINS { B1, E6, D5, D6, B4, D7, D4, F1, F0, B0 } +#define MATRIX_COL_PINS { D0, B3, B2, D1, D2, D3, F7, F6, F5 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +#define BACKLIGHT_PIN B7 +#define BACKLIGHT_LEVELS 5 + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* 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 + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) diff --git a/keyboards/handwired/prime_exl/info.json b/keyboards/handwired/prime_exl/info.json new file mode 100644 index 000000000..edab78860 --- /dev/null +++ b/keyboards/handwired/prime_exl/info.json @@ -0,0 +1,12 @@ +{ + "keyboard_name": "Prime_EXL", + "url": "https://www.primekb.com", + "maintainer": "holtenc", + "width": 18, + "height": 5, + "layouts": { + "LAYOUT": { + "layout": [{"x":0,"y":0,"w":1,"h":1}, {"x":1,"y":0,"w":1,"h":1}, {"x":2,"y":0,"w":1,"h":1}, {"x":3,"y":0,"w":1,"h":1}, {"x":4,"y":0,"w":1,"h":1}, {"x":5,"y":0,"w":1,"h":1}, {"x":6.5,"y":0,"w":1,"h":1}, {"x":7.5,"y":0,"w":1,"h":1}, {"x":8.5,"y":0,"w":1,"h":1}, {"x":9.5,"y":0,"w":1,"h":1}, {"x":10.5,"y":0,"w":1,"h":1}, {"x":11.5,"y":0,"w":1,"h":1}, {"x":13.75,"y":0,"w":1,"h":1}, {"x":14.75,"y":0,"w":1,"h":1}, {"x":15.75,"y":0,"w":1,"h":1}, {"x":16.75,"y":0,"w":1,"h":1}, {"x":17.75,"y":0,"w":1,"h":1}, {"x":18.75,"y":0,"w":2,"h":1}, {"x":0,"y":1,"w":1,"h":1}, {"x":1,"y":1,"w":1,"h":1}, {"x":2,"y":1,"w":1,"h":1}, {"x":3,"y":1,"w":1,"h":1}, {"x":4,"y":1,"w":1,"h":1}, {"x":5,"y":1,"w":1,"h":1}, {"x":6.5,"y":1,"w":1.26,"h":1}, {"x":7.75,"y":1,"w":1,"h":1}, {"x":8.75,"y":1,"w":1,"h":1}, {"x":9.75,"y":1,"w":1,"h":1}, {"x":10.75,"y":1,"w":1,"h":1}, {"x":11.75,"y":1,"w":1,"h":1}, {"x":14,"y":1,"w":1,"h":1}, {"x":15,"y":1,"w":1,"h":1}, {"x":16,"y":1,"w":1,"h":1}, {"x":17,"y":1,"w":1,"h":1}, {"x":18,"y":1,"w":1,"h":1}, {"x":19,"y":1,"w":1.75,"h":1}, {"x":0,"y":2,"w":1,"h":1}, {"x":1,"y":2,"w":1,"h":1}, {"x":2,"y":2,"w":1,"h":1}, {"x":3,"y":2,"w":1,"h":1}, {"x":4,"y":2,"w":1,"h":1}, {"x":5,"y":2,"w":1,"h":1}, {"x":6.5,"y":2,"w":1.75,"h":1}, {"x":8.25,"y":2,"w":1,"h":1}, {"x":9.25,"y":2,"w":1,"h":1}, {"x":10.25,"y":2,"w":1,"h":1}, {"x":11.25,"y":2,"w":1,"h":1}, {"x":12.25,"y":2,"w":1,"h":1}, {"x":13.5,"y":2,"w":1,"h":1}, {"x":14.5,"y":2,"w":1,"h":1}, {"x":15.5,"y":2,"w":1,"h":1}, {"x":16.5,"y":2,"w":1,"h":1}, {"x":17.5,"y":2,"w":1,"h":1}, {"x":18.5,"y":2,"w":1,"h":1}, {"x":19.5,"y":2,"w":1.25,"h":1}, {"x":0,"y":3,"w":1,"h":1}, {"x":1,"y":3,"w":1,"h":1}, {"x":2,"y":3,"w":1,"h":1}, {"x":3,"y":3,"w":1,"h":1}, {"x":4,"y":3,"w":1,"h":1}, {"x":5,"y":3,"w":1,"h":1}, {"x":6.5,"y":3,"w":1.25,"h":1}, {"x":7.75,"y":3,"w":1.25,"h":1}, {"x":9,"y":3,"w":1,"h":1}, {"x":10,"y":3,"w":1,"h":1}, {"x":11,"y":3,"w":2,"h":1}, {"x":13.5,"y":3,"w":2,"h":1}, {"x":15.5,"y":3,"w":1,"h":1}, {"x":16.5,"y":3,"w":1,"h":1}, {"x":17.5,"y":3,"w":1.5,"h":1}, {"x":19,"y":3,"w":1.5,"h":1}, {"x":0,"y":4,"w":1,"h":1}, {"x":1,"y":4,"w":1,"h":1}, {"x":2,"y":4,"w":1,"h":1}, {"x":3,"y":4,"w":1,"h":1}, {"x":4,"y":4,"w":1,"h":1}, {"x":5,"y":4,"w":1,"h":1}] + } + } +} diff --git a/keyboards/handwired/prime_exl/keymaps/default/config.h b/keyboards/handwired/prime_exl/keymaps/default/config.h new file mode 100644 index 000000000..83bd38a81 --- /dev/null +++ b/keyboards/handwired/prime_exl/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 Holten Campbell + * + * 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 . + */ + +#pragma once + +// place overrides here diff --git a/keyboards/handwired/prime_exl/keymaps/default/keymap.c b/keyboards/handwired/prime_exl/keymaps/default/keymap.c new file mode 100644 index 000000000..0e1c60d4a --- /dev/null +++ b/keyboards/handwired/prime_exl/keymaps/default/keymap.c @@ -0,0 +1,143 @@ +/* Copyright 2018 Holten Campbell + * + * 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 . + */ +#include QMK_KEYBOARD_H + +// Defines the keycodes used by our macros in process_record_user +enum custom_keycodes { + QMKBEST = SAFE_RANGE, + QMKURL +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + KC_NLCK, KC_LPRN, KC_RPRN, KC_PSLS, KC_PAST, KC_BSPC, KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_F1, KC_F2, KC_P7, KC_P8, KC_P9, KC_DEL, KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT, KC_ENT, + KC_F3, KC_F4, KC_P4, KC_P5, KC_P6, KC_PMNS, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, MO(3), KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, + KC_F5, KC_F6, KC_P1, KC_P2, KC_P3, KC_PPLS, KC_LCTL, KC_LALT, KC_LBRC, KC_RBRC, MO(1), KC_SPC, KC_MINS, KC_EQL, KC_LGUI, MO(4), + KC_F7, KC_F8, TO(2), KC_PDOT, KC_P0, KC_PENT + ), + + [1] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_DEL, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_SCLN, KC_BSLS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS, + BL_TOGG, BL_STEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + + [2] = LAYOUT( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_F9, KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT, KC_ENT, + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, MO(3), KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LCTL, KC_LALT, KC_LBRC, KC_RBRC, MO(5), KC_SPC, KC_MINS, KC_EQL, KC_LGUI, MO(4), + KC_LCTL, KC_LALT, TO(0), KC_P, KC_H, KC_SPC + ), + + [3] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + + [4] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + + [5] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_DEL, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_SCLN, KC_BSLS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS, + BL_TOGG, BL_STEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QMKBEST: + if (record->event.pressed) { + // when keycode QMKBEST is pressed + SEND_STRING("QMK is the best thing ever!"); + } else { + // when keycode QMKBEST is released + } + break; + case QMKURL: + if (record->event.pressed) { + // when keycode QMKURL is pressed + SEND_STRING("https://qmk.fm/" SS_TAP(X_ENTER)); + } else { + // when keycode QMKURL is released + } + break; + } + return true; +} + +void matrix_init_user(void) { + // set CapsLock LED to output and low + DDRC |= (1 << 6); + PORTC &= ~(1 << 6); + // set NumLock LED to output and low + DDRB |= (1 << 6); + PORTB &= ~(1 << 6); + // set ScrollLock LED to output and low + DDRB |= (1 << 5); + PORTB &= ~(1 << 5); +} + +void matrix_scan_user(void) { + +} + + +void led_set_user(uint8_t usb_led) { + if (usb_led & (1<. + */ +#include "prime_exl.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + + led_set_user(usb_led); +} diff --git a/keyboards/handwired/prime_exl/prime_exl.h b/keyboards/handwired/prime_exl/prime_exl.h new file mode 100644 index 000000000..727db5db8 --- /dev/null +++ b/keyboards/handwired/prime_exl/prime_exl.h @@ -0,0 +1,40 @@ +/* Copyright 2018 Holten Campbell + * + * 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 . + */ +#ifndef PRIME_EXL_H +#define PRIME_EXL_H + +#include "quantum.h" + +#define LAYOUT( \ + K040, K050, K041, K051, K042, K052, K043, K053, K044, K054, K045, K055, K046, K056, K047, K057, K048, K058, \ + K030, K060, K031, K061, K032, K062, K033, K063, K034, K064, K035, K065, K036, K066, K037, K067, K038, K068, \ + K020, K070, K021, K071, K022, K072, K023, K073, K024, K074, K025, K075, K085, K026, K076, K027, K077, K028, K078, \ + K010, K080, K011, K081, K012, K082, K013, K083, K014, K084, K015, K016, K086, K017, K087, K018, \ + K000, K090, K001, K091, K002, K092 \ +) { \ + { K000, K001, K002, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ + { K010, K011, K012, K013, K014, K015, K016, K017, K018 }, \ + { K020, K021, K022, K023, K024, K025, K026, K027, K028 }, \ + { K030, K031, K032, K033, K034, K035, K036, K037, K038 }, \ + { K040, K041, K042, K043, K044, K045, K046, K047, K048 }, \ + { K050, K051, K052, K053, K054, K055, K056, K057, K058 }, \ + { K060, K061, K062, K063, K064, K065, K066, K067, K068 }, \ + { K070, K071, K072, K073, K074, K075, K076, K077, K078 }, \ + { K080, K081, K082, K083, K084, K085, K086, K087, KC_NO }, \ + { K090, K091, K092, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \ +} + +#endif \ No newline at end of file diff --git a/keyboards/handwired/prime_exl/readme.md b/keyboards/handwired/prime_exl/readme.md new file mode 100644 index 000000000..f99cba004 --- /dev/null +++ b/keyboards/handwired/prime_exl/readme.md @@ -0,0 +1,15 @@ +# Prime_EXL + +![Prime_EXL](https://i.imgur.com/3t524g8.jpg) + +An ergonomic 45% keyboard with a macro/numpad added to the left side. + +Keyboard Maintainer: [Holtenc](https://github.com/holtenc/) +Hardware Supported: Prime_EXL PCB, ATMega32u4 +Hardware Availability: Prototype + +Make example for this keyboard (after setting up your build environment): + + make handwired/prime_exl:default + +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). diff --git a/keyboards/handwired/prime_exl/rules.mk b/keyboards/handwired/prime_exl/rules.mk new file mode 100644 index 000000000..5cce4e811 --- /dev/null +++ b/keyboards/handwired/prime_exl/rules.mk @@ -0,0 +1,80 @@ +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = yes # USB Nkey Rollover +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) From 14be5258a6784829b6931f348fc20d64e1a5f2a7 Mon Sep 17 00:00:00 2001 From: Rys Sommefeldt Date: Thu, 20 Sep 2018 00:23:23 +0100 Subject: [PATCH 116/788] Keymap: rys Tada68 ISO UK layout (#3934) * rys Tada68 ISO UK layout * Bring _FL more in line with my favoute WhiteFox layout * Whoops, fix - to _ * remove empty config.h * Remove legacy block --- keyboards/tada68/keymaps/rys/keymap.c | 50 ++++++++++++++++++++++++++ keyboards/tada68/keymaps/rys/readme.md | 15 ++++++++ keyboards/tada68/keymaps/rys/rules.mk | 17 +++++++++ 3 files changed, 82 insertions(+) create mode 100644 keyboards/tada68/keymaps/rys/keymap.c create mode 100644 keyboards/tada68/keymaps/rys/readme.md create mode 100644 keyboards/tada68/keymaps/rys/rules.mk diff --git a/keyboards/tada68/keymaps/rys/keymap.c b/keyboards/tada68/keymaps/rys/keymap.c new file mode 100644 index 000000000..6f32b092d --- /dev/null +++ b/keyboards/tada68/keymaps/rys/keymap.c @@ -0,0 +1,50 @@ +#include QMK_KEYBOARD_H + +#define _BL 0 +#define _FL 1 + +#define _______ KC_TRNS + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Keymap _BL: (Base Layer) Default Layer + * ,----------------------------------------------------------------. + * |Esc | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp |~ ` | + * |----------------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| |Del | + * |------------------------------------------------------- -----| + * |CAPS | A| S| D| F| G| H| J| K| L| ;| '| #|Entr|PgUp| + * |----------------------------------------------------------------| + * |Shift| \ | Z| X| C| V| B| N| M| ,| .| /|Rshift|Up|PgDn| + * |----------------------------------------------------------------| + * |Ctrl|Win |Alt | Space |Alt| FN|Ctrl|Lef|Dow|Rig | + * `----------------------------------------------------------------' + */ + [_BL] = LAYOUT_iso( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_GRV, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_NUHS, KC_DEL, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP, \ + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN, \ + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RALT, MO(_FL), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + ), + + /* Keymap _FL1: Function Layer 1 + * ,----------------------------------------------------------------. + * | | F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12| Delete| Ins| + * |----------------------------------------------------------------| + * | | | ↑ | | | | | | | | | | | |Home| + * |------------------------------------------------------- -----| + * | | ← | ↓ | → | | | | | | | | | | | End| + * |----------------------------------------------------------------| + * | | | | | L+|LED| L-| | V+| V-|Mut| | MsBtn|Up|MsBn| + * |----------------------------------------------------------------| + * | | | | | | | | Lt| Dn| Rt | + * `----------------------------------------------------------------' + */ + [_FL] = LAYOUT_iso( + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, \ + _______, KC_BTN1, KC_UP, KC_BTN2, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, \ + _______, _______, _______, _______, BL_DEC, BL_TOGG, BL_INC, _______, KC_VOLU, KC_VOLD, KC_MUTE, _______, _______, KC_MS_U, KC_END, \ + _______, _______, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R + ), +}; diff --git a/keyboards/tada68/keymaps/rys/readme.md b/keyboards/tada68/keymaps/rys/readme.md new file mode 100644 index 000000000..a9425bf06 --- /dev/null +++ b/keyboards/tada68/keymaps/rys/readme.md @@ -0,0 +1,15 @@ +# Custom Tada68 layout for ISO UK with Apple-y tweaks + +This layout is based on the [ISO UK](../iso-uk) layout, with the following +changes: + +Swap Win and Alt on the left side (Option and Command on macOS) + +## Installation + +Please see the [Tada68 readme](../../readme.md). Make the firmware wih the +following command: + +``` +make tada68:rys:bin +``` diff --git a/keyboards/tada68/keymaps/rys/rules.mk b/keyboards/tada68/keymaps/rys/rules.mk new file mode 100644 index 000000000..1915481bf --- /dev/null +++ b/keyboards/tada68/keymaps/rys/rules.mk @@ -0,0 +1,17 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend From 5b4bcfa7f2530ad12ef801101933aba6ac46acb2 Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Wed, 19 Sep 2018 16:25:58 -0700 Subject: [PATCH 117/788] Keyboard: Move Bathroom Epiphany boards into its own directory (#3936) * make bpiphany directory with simple readme file * move unloved_bastard to bpiphany directory * move frosty_flake to bpiphany directory * move pegasushoof to bpiphany directory * move tiger_lily to bpiphany directory * add a little more info to readme * move kitten_paw to bpiphany directory * update make instructions * update intro text * add missing routines to matrix.c of unloved_bastard * add missing routines --- .../{ => bpiphany}/frosty_flake/config.h | 0 .../frosty_flake/frosty_flake.c | 0 .../frosty_flake/frosty_flake.h | 0 .../frosty_flake/keymaps/QFR_JM/config.h | 0 .../frosty_flake/keymaps/QFR_JM/keymap.c | 0 .../frosty_flake/keymaps/QFR_JM/readme.md | 0 .../frosty_flake/keymaps/QFR_JM/rules.mk | 0 .../frosty_flake/keymaps/default/config.h | 0 .../frosty_flake/keymaps/default/keymap.c | 0 .../frosty_flake/keymaps/default/readme.md | 0 .../frosty_flake/keymaps/default/rules.mk | 0 .../frosty_flake/keymaps/nikchi/config.h | 0 .../frosty_flake/keymaps/nikchi/keymap.c | 0 .../frosty_flake/keymaps/nikchi/readme.md | 0 .../frosty_flake/keymaps/nikchi/rules.mk | 0 .../keymaps/nikchi/variableTapDance.md | 0 .../frosty_flake/keymaps/tkl/config.h | 0 .../frosty_flake/keymaps/tkl/keymap.c | 0 .../frosty_flake/keymaps/tkl/readme.md | 0 .../frosty_flake/keymaps/tkl/rules.mk | 0 .../{ => bpiphany}/frosty_flake/matrix.c | 18 +++++++++++++++ .../{ => bpiphany}/frosty_flake/readme.md | 11 ++++------ .../{ => bpiphany}/frosty_flake/rules.mk | 0 keyboards/{ => bpiphany}/kitten_paw/config.h | 0 keyboards/{ => bpiphany}/kitten_paw/info.json | 0 .../kitten_paw/keymaps/default/keymap.c | 0 .../kitten_paw/keymaps/ickerwx/config.h | 0 .../kitten_paw/keymaps/ickerwx/keymap.c | 0 .../kitten_paw/keymaps/ickerwx/readme.md | 0 .../{ => bpiphany}/kitten_paw/kitten_paw.c | 0 .../{ => bpiphany}/kitten_paw/kitten_paw.h | 0 keyboards/{ => bpiphany}/kitten_paw/matrix.c | 22 +++++++++++++++++-- keyboards/{ => bpiphany}/kitten_paw/readme.md | 4 ++-- keyboards/{ => bpiphany}/kitten_paw/rules.mk | 0 keyboards/bpiphany/pegasushoof/README.md | 12 ++++++++++ keyboards/{ => bpiphany}/pegasushoof/config.h | 0 .../pegasushoof/keymaps/blowrak/keymap.c | 0 .../pegasushoof/keymaps/blowrak/rules.mk | 0 .../pegasushoof/keymaps/citadel/config.h | 0 .../pegasushoof/keymaps/citadel/keymap.c | 0 .../pegasushoof/keymaps/citadel/readme.md | 0 .../pegasushoof/keymaps/citadel/rules.mk | 0 .../pegasushoof/keymaps/default/keymap.c | 0 .../pegasushoof/keymaps/default/rules.mk | 0 keyboards/{ => bpiphany}/pegasushoof/matrix.c | 18 +++++++++++++++ .../{ => bpiphany}/pegasushoof/pegasushoof.c | 0 .../{ => bpiphany}/pegasushoof/pegasushoof.h | 0 keyboards/{ => bpiphany}/pegasushoof/rules.mk | 0 keyboards/bpiphany/readme.md | 6 +++++ keyboards/{ => bpiphany}/tiger_lily/config.h | 0 keyboards/{ => bpiphany}/tiger_lily/info.json | 0 .../tiger_lily/keymaps/default/config.h | 0 .../tiger_lily/keymaps/default/keymap.c | 0 .../tiger_lily/keymaps/default/readme.md | 0 .../tiger_lily/keymaps/default/rules.mk | 0 .../tiger_lily/keymaps/default_ansi/config.h | 0 .../tiger_lily/keymaps/default_ansi/keymap.c | 0 .../tiger_lily/keymaps/default_ansi/readme.md | 0 .../tiger_lily/keymaps/default_ansi/rules.mk | 0 keyboards/{ => bpiphany}/tiger_lily/matrix.c | 20 ++++++++++++++++- keyboards/{ => bpiphany}/tiger_lily/readme.md | 4 ++-- keyboards/{ => bpiphany}/tiger_lily/rules.mk | 0 .../{ => bpiphany}/tiger_lily/tiger_lily.c | 0 .../{ => bpiphany}/tiger_lily/tiger_lily.h | 0 .../{ => bpiphany}/unloved_bastard/config.h | 0 .../{ => bpiphany}/unloved_bastard/info.json | 0 .../unloved_bastard/keymaps/default/config.h | 0 .../unloved_bastard/keymaps/default/keymap.c | 0 .../unloved_bastard/keymaps/default/readme.md | 0 .../keymaps/default_ansi/config.h | 0 .../keymaps/default_ansi/keymap.c | 0 .../keymaps/default_ansi/readme.md | 0 .../{ => bpiphany}/unloved_bastard/matrix.c | 18 +++++++++++++++ .../{ => bpiphany}/unloved_bastard/readme.md | 4 ++-- .../{ => bpiphany}/unloved_bastard/rules.mk | 0 .../unloved_bastard/unloved_bastard.c | 0 .../unloved_bastard/unloved_bastard.h | 0 keyboards/pegasushoof/README.md | 12 ---------- 78 files changed, 121 insertions(+), 28 deletions(-) rename keyboards/{ => bpiphany}/frosty_flake/config.h (100%) rename keyboards/{ => bpiphany}/frosty_flake/frosty_flake.c (100%) rename keyboards/{ => bpiphany}/frosty_flake/frosty_flake.h (100%) rename keyboards/{ => bpiphany}/frosty_flake/keymaps/QFR_JM/config.h (100%) rename keyboards/{ => bpiphany}/frosty_flake/keymaps/QFR_JM/keymap.c (100%) rename keyboards/{ => bpiphany}/frosty_flake/keymaps/QFR_JM/readme.md (100%) rename keyboards/{ => bpiphany}/frosty_flake/keymaps/QFR_JM/rules.mk (100%) rename keyboards/{ => bpiphany}/frosty_flake/keymaps/default/config.h (100%) rename keyboards/{ => bpiphany}/frosty_flake/keymaps/default/keymap.c (100%) rename keyboards/{ => bpiphany}/frosty_flake/keymaps/default/readme.md (100%) rename keyboards/{ => bpiphany}/frosty_flake/keymaps/default/rules.mk (100%) rename keyboards/{ => bpiphany}/frosty_flake/keymaps/nikchi/config.h (100%) rename keyboards/{ => bpiphany}/frosty_flake/keymaps/nikchi/keymap.c (100%) rename keyboards/{ => bpiphany}/frosty_flake/keymaps/nikchi/readme.md (100%) rename keyboards/{ => bpiphany}/frosty_flake/keymaps/nikchi/rules.mk (100%) rename keyboards/{ => bpiphany}/frosty_flake/keymaps/nikchi/variableTapDance.md (100%) rename keyboards/{ => bpiphany}/frosty_flake/keymaps/tkl/config.h (100%) rename keyboards/{ => bpiphany}/frosty_flake/keymaps/tkl/keymap.c (100%) rename keyboards/{ => bpiphany}/frosty_flake/keymaps/tkl/readme.md (100%) rename keyboards/{ => bpiphany}/frosty_flake/keymaps/tkl/rules.mk (100%) rename keyboards/{ => bpiphany}/frosty_flake/matrix.c (94%) rename keyboards/{ => bpiphany}/frosty_flake/readme.md (74%) rename keyboards/{ => bpiphany}/frosty_flake/rules.mk (100%) rename keyboards/{ => bpiphany}/kitten_paw/config.h (100%) rename keyboards/{ => bpiphany}/kitten_paw/info.json (100%) rename keyboards/{ => bpiphany}/kitten_paw/keymaps/default/keymap.c (100%) rename keyboards/{ => bpiphany}/kitten_paw/keymaps/ickerwx/config.h (100%) rename keyboards/{ => bpiphany}/kitten_paw/keymaps/ickerwx/keymap.c (100%) rename keyboards/{ => bpiphany}/kitten_paw/keymaps/ickerwx/readme.md (100%) rename keyboards/{ => bpiphany}/kitten_paw/kitten_paw.c (100%) rename keyboards/{ => bpiphany}/kitten_paw/kitten_paw.h (100%) rename keyboards/{ => bpiphany}/kitten_paw/matrix.c (94%) rename keyboards/{ => bpiphany}/kitten_paw/readme.md (65%) rename keyboards/{ => bpiphany}/kitten_paw/rules.mk (100%) create mode 100644 keyboards/bpiphany/pegasushoof/README.md rename keyboards/{ => bpiphany}/pegasushoof/config.h (100%) rename keyboards/{ => bpiphany}/pegasushoof/keymaps/blowrak/keymap.c (100%) rename keyboards/{ => bpiphany}/pegasushoof/keymaps/blowrak/rules.mk (100%) rename keyboards/{ => bpiphany}/pegasushoof/keymaps/citadel/config.h (100%) rename keyboards/{ => bpiphany}/pegasushoof/keymaps/citadel/keymap.c (100%) rename keyboards/{ => bpiphany}/pegasushoof/keymaps/citadel/readme.md (100%) rename keyboards/{ => bpiphany}/pegasushoof/keymaps/citadel/rules.mk (100%) rename keyboards/{ => bpiphany}/pegasushoof/keymaps/default/keymap.c (100%) rename keyboards/{ => bpiphany}/pegasushoof/keymaps/default/rules.mk (100%) rename keyboards/{ => bpiphany}/pegasushoof/matrix.c (94%) rename keyboards/{ => bpiphany}/pegasushoof/pegasushoof.c (100%) rename keyboards/{ => bpiphany}/pegasushoof/pegasushoof.h (100%) rename keyboards/{ => bpiphany}/pegasushoof/rules.mk (100%) create mode 100644 keyboards/bpiphany/readme.md rename keyboards/{ => bpiphany}/tiger_lily/config.h (100%) rename keyboards/{ => bpiphany}/tiger_lily/info.json (100%) rename keyboards/{ => bpiphany}/tiger_lily/keymaps/default/config.h (100%) rename keyboards/{ => bpiphany}/tiger_lily/keymaps/default/keymap.c (100%) rename keyboards/{ => bpiphany}/tiger_lily/keymaps/default/readme.md (100%) rename keyboards/{ => bpiphany}/tiger_lily/keymaps/default/rules.mk (100%) rename keyboards/{ => bpiphany}/tiger_lily/keymaps/default_ansi/config.h (100%) rename keyboards/{ => bpiphany}/tiger_lily/keymaps/default_ansi/keymap.c (100%) rename keyboards/{ => bpiphany}/tiger_lily/keymaps/default_ansi/readme.md (100%) rename keyboards/{ => bpiphany}/tiger_lily/keymaps/default_ansi/rules.mk (100%) rename keyboards/{ => bpiphany}/tiger_lily/matrix.c (94%) rename keyboards/{ => bpiphany}/tiger_lily/readme.md (72%) rename keyboards/{ => bpiphany}/tiger_lily/rules.mk (100%) rename keyboards/{ => bpiphany}/tiger_lily/tiger_lily.c (100%) rename keyboards/{ => bpiphany}/tiger_lily/tiger_lily.h (100%) rename keyboards/{ => bpiphany}/unloved_bastard/config.h (100%) rename keyboards/{ => bpiphany}/unloved_bastard/info.json (100%) rename keyboards/{ => bpiphany}/unloved_bastard/keymaps/default/config.h (100%) rename keyboards/{ => bpiphany}/unloved_bastard/keymaps/default/keymap.c (100%) rename keyboards/{ => bpiphany}/unloved_bastard/keymaps/default/readme.md (100%) rename keyboards/{ => bpiphany}/unloved_bastard/keymaps/default_ansi/config.h (100%) rename keyboards/{ => bpiphany}/unloved_bastard/keymaps/default_ansi/keymap.c (100%) rename keyboards/{ => bpiphany}/unloved_bastard/keymaps/default_ansi/readme.md (100%) rename keyboards/{ => bpiphany}/unloved_bastard/matrix.c (94%) rename keyboards/{ => bpiphany}/unloved_bastard/readme.md (56%) rename keyboards/{ => bpiphany}/unloved_bastard/rules.mk (100%) rename keyboards/{ => bpiphany}/unloved_bastard/unloved_bastard.c (100%) rename keyboards/{ => bpiphany}/unloved_bastard/unloved_bastard.h (100%) delete mode 100644 keyboards/pegasushoof/README.md diff --git a/keyboards/frosty_flake/config.h b/keyboards/bpiphany/frosty_flake/config.h similarity index 100% rename from keyboards/frosty_flake/config.h rename to keyboards/bpiphany/frosty_flake/config.h diff --git a/keyboards/frosty_flake/frosty_flake.c b/keyboards/bpiphany/frosty_flake/frosty_flake.c similarity index 100% rename from keyboards/frosty_flake/frosty_flake.c rename to keyboards/bpiphany/frosty_flake/frosty_flake.c diff --git a/keyboards/frosty_flake/frosty_flake.h b/keyboards/bpiphany/frosty_flake/frosty_flake.h similarity index 100% rename from keyboards/frosty_flake/frosty_flake.h rename to keyboards/bpiphany/frosty_flake/frosty_flake.h diff --git a/keyboards/frosty_flake/keymaps/QFR_JM/config.h b/keyboards/bpiphany/frosty_flake/keymaps/QFR_JM/config.h similarity index 100% rename from keyboards/frosty_flake/keymaps/QFR_JM/config.h rename to keyboards/bpiphany/frosty_flake/keymaps/QFR_JM/config.h diff --git a/keyboards/frosty_flake/keymaps/QFR_JM/keymap.c b/keyboards/bpiphany/frosty_flake/keymaps/QFR_JM/keymap.c similarity index 100% rename from keyboards/frosty_flake/keymaps/QFR_JM/keymap.c rename to keyboards/bpiphany/frosty_flake/keymaps/QFR_JM/keymap.c diff --git a/keyboards/frosty_flake/keymaps/QFR_JM/readme.md b/keyboards/bpiphany/frosty_flake/keymaps/QFR_JM/readme.md similarity index 100% rename from keyboards/frosty_flake/keymaps/QFR_JM/readme.md rename to keyboards/bpiphany/frosty_flake/keymaps/QFR_JM/readme.md diff --git a/keyboards/frosty_flake/keymaps/QFR_JM/rules.mk b/keyboards/bpiphany/frosty_flake/keymaps/QFR_JM/rules.mk similarity index 100% rename from keyboards/frosty_flake/keymaps/QFR_JM/rules.mk rename to keyboards/bpiphany/frosty_flake/keymaps/QFR_JM/rules.mk diff --git a/keyboards/frosty_flake/keymaps/default/config.h b/keyboards/bpiphany/frosty_flake/keymaps/default/config.h similarity index 100% rename from keyboards/frosty_flake/keymaps/default/config.h rename to keyboards/bpiphany/frosty_flake/keymaps/default/config.h diff --git a/keyboards/frosty_flake/keymaps/default/keymap.c b/keyboards/bpiphany/frosty_flake/keymaps/default/keymap.c similarity index 100% rename from keyboards/frosty_flake/keymaps/default/keymap.c rename to keyboards/bpiphany/frosty_flake/keymaps/default/keymap.c diff --git a/keyboards/frosty_flake/keymaps/default/readme.md b/keyboards/bpiphany/frosty_flake/keymaps/default/readme.md similarity index 100% rename from keyboards/frosty_flake/keymaps/default/readme.md rename to keyboards/bpiphany/frosty_flake/keymaps/default/readme.md diff --git a/keyboards/frosty_flake/keymaps/default/rules.mk b/keyboards/bpiphany/frosty_flake/keymaps/default/rules.mk similarity index 100% rename from keyboards/frosty_flake/keymaps/default/rules.mk rename to keyboards/bpiphany/frosty_flake/keymaps/default/rules.mk diff --git a/keyboards/frosty_flake/keymaps/nikchi/config.h b/keyboards/bpiphany/frosty_flake/keymaps/nikchi/config.h similarity index 100% rename from keyboards/frosty_flake/keymaps/nikchi/config.h rename to keyboards/bpiphany/frosty_flake/keymaps/nikchi/config.h diff --git a/keyboards/frosty_flake/keymaps/nikchi/keymap.c b/keyboards/bpiphany/frosty_flake/keymaps/nikchi/keymap.c similarity index 100% rename from keyboards/frosty_flake/keymaps/nikchi/keymap.c rename to keyboards/bpiphany/frosty_flake/keymaps/nikchi/keymap.c diff --git a/keyboards/frosty_flake/keymaps/nikchi/readme.md b/keyboards/bpiphany/frosty_flake/keymaps/nikchi/readme.md similarity index 100% rename from keyboards/frosty_flake/keymaps/nikchi/readme.md rename to keyboards/bpiphany/frosty_flake/keymaps/nikchi/readme.md diff --git a/keyboards/frosty_flake/keymaps/nikchi/rules.mk b/keyboards/bpiphany/frosty_flake/keymaps/nikchi/rules.mk similarity index 100% rename from keyboards/frosty_flake/keymaps/nikchi/rules.mk rename to keyboards/bpiphany/frosty_flake/keymaps/nikchi/rules.mk diff --git a/keyboards/frosty_flake/keymaps/nikchi/variableTapDance.md b/keyboards/bpiphany/frosty_flake/keymaps/nikchi/variableTapDance.md similarity index 100% rename from keyboards/frosty_flake/keymaps/nikchi/variableTapDance.md rename to keyboards/bpiphany/frosty_flake/keymaps/nikchi/variableTapDance.md diff --git a/keyboards/frosty_flake/keymaps/tkl/config.h b/keyboards/bpiphany/frosty_flake/keymaps/tkl/config.h similarity index 100% rename from keyboards/frosty_flake/keymaps/tkl/config.h rename to keyboards/bpiphany/frosty_flake/keymaps/tkl/config.h diff --git a/keyboards/frosty_flake/keymaps/tkl/keymap.c b/keyboards/bpiphany/frosty_flake/keymaps/tkl/keymap.c similarity index 100% rename from keyboards/frosty_flake/keymaps/tkl/keymap.c rename to keyboards/bpiphany/frosty_flake/keymaps/tkl/keymap.c diff --git a/keyboards/frosty_flake/keymaps/tkl/readme.md b/keyboards/bpiphany/frosty_flake/keymaps/tkl/readme.md similarity index 100% rename from keyboards/frosty_flake/keymaps/tkl/readme.md rename to keyboards/bpiphany/frosty_flake/keymaps/tkl/readme.md diff --git a/keyboards/frosty_flake/keymaps/tkl/rules.mk b/keyboards/bpiphany/frosty_flake/keymaps/tkl/rules.mk similarity index 100% rename from keyboards/frosty_flake/keymaps/tkl/rules.mk rename to keyboards/bpiphany/frosty_flake/keymaps/tkl/rules.mk diff --git a/keyboards/frosty_flake/matrix.c b/keyboards/bpiphany/frosty_flake/matrix.c similarity index 94% rename from keyboards/frosty_flake/matrix.c rename to keyboards/bpiphany/frosty_flake/matrix.c index cde7f63b9..480e3455b 100644 --- a/keyboards/frosty_flake/matrix.c +++ b/keyboards/bpiphany/frosty_flake/matrix.c @@ -32,6 +32,24 @@ static uint8_t debouncing = DEBOUNCING_DELAY; static matrix_row_t matrix[MATRIX_ROWS]; static matrix_row_t matrix_debouncing[MATRIX_ROWS]; +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + static matrix_row_t scan_col(void) { return ( (PINC&(1<<7) ? 0 : ((matrix_row_t)1<<0)) | diff --git a/keyboards/frosty_flake/readme.md b/keyboards/bpiphany/frosty_flake/readme.md similarity index 74% rename from keyboards/frosty_flake/readme.md rename to keyboards/bpiphany/frosty_flake/readme.md index 822377a71..0d6a4779f 100644 --- a/keyboards/frosty_flake/readme.md +++ b/keyboards/bpiphany/frosty_flake/readme.md @@ -25,22 +25,19 @@ Make example for this keyboard (after setting up your build environment): 104 key default layout: ``` -make frosty_flake:default +make bpiphany/frosty_flake:default ``` To directly flash the frosty_flake after compiling use ``` -make frosty_flake:default:dfu +make bpiphany/frosty_flake:default:dfu ``` 87 key tkl layout: ``` -make frosty_flake:tkl:dfu +make bpiphany/frosty_flake:tkl:dfu ``` -See [build environment -setup](https://docs.qmk.fm/build_environment_setup.html) then the -[make instructions](https://docs.qmk.fm/make_instructions.html) for -more information. +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). diff --git a/keyboards/frosty_flake/rules.mk b/keyboards/bpiphany/frosty_flake/rules.mk similarity index 100% rename from keyboards/frosty_flake/rules.mk rename to keyboards/bpiphany/frosty_flake/rules.mk diff --git a/keyboards/kitten_paw/config.h b/keyboards/bpiphany/kitten_paw/config.h similarity index 100% rename from keyboards/kitten_paw/config.h rename to keyboards/bpiphany/kitten_paw/config.h diff --git a/keyboards/kitten_paw/info.json b/keyboards/bpiphany/kitten_paw/info.json similarity index 100% rename from keyboards/kitten_paw/info.json rename to keyboards/bpiphany/kitten_paw/info.json diff --git a/keyboards/kitten_paw/keymaps/default/keymap.c b/keyboards/bpiphany/kitten_paw/keymaps/default/keymap.c similarity index 100% rename from keyboards/kitten_paw/keymaps/default/keymap.c rename to keyboards/bpiphany/kitten_paw/keymaps/default/keymap.c diff --git a/keyboards/kitten_paw/keymaps/ickerwx/config.h b/keyboards/bpiphany/kitten_paw/keymaps/ickerwx/config.h similarity index 100% rename from keyboards/kitten_paw/keymaps/ickerwx/config.h rename to keyboards/bpiphany/kitten_paw/keymaps/ickerwx/config.h diff --git a/keyboards/kitten_paw/keymaps/ickerwx/keymap.c b/keyboards/bpiphany/kitten_paw/keymaps/ickerwx/keymap.c similarity index 100% rename from keyboards/kitten_paw/keymaps/ickerwx/keymap.c rename to keyboards/bpiphany/kitten_paw/keymaps/ickerwx/keymap.c diff --git a/keyboards/kitten_paw/keymaps/ickerwx/readme.md b/keyboards/bpiphany/kitten_paw/keymaps/ickerwx/readme.md similarity index 100% rename from keyboards/kitten_paw/keymaps/ickerwx/readme.md rename to keyboards/bpiphany/kitten_paw/keymaps/ickerwx/readme.md diff --git a/keyboards/kitten_paw/kitten_paw.c b/keyboards/bpiphany/kitten_paw/kitten_paw.c similarity index 100% rename from keyboards/kitten_paw/kitten_paw.c rename to keyboards/bpiphany/kitten_paw/kitten_paw.c diff --git a/keyboards/kitten_paw/kitten_paw.h b/keyboards/bpiphany/kitten_paw/kitten_paw.h similarity index 100% rename from keyboards/kitten_paw/kitten_paw.h rename to keyboards/bpiphany/kitten_paw/kitten_paw.h diff --git a/keyboards/kitten_paw/matrix.c b/keyboards/bpiphany/kitten_paw/matrix.c similarity index 94% rename from keyboards/kitten_paw/matrix.c rename to keyboards/bpiphany/kitten_paw/matrix.c index d436ad56c..6fdbfffd6 100644 --- a/keyboards/kitten_paw/matrix.c +++ b/keyboards/bpiphany/kitten_paw/matrix.c @@ -35,6 +35,24 @@ static matrix_row_t matrix_debouncing[MATRIX_ROWS]; static uint8_t read_rows(void); static void select_col(uint8_t col); +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + inline uint8_t matrix_rows(void) { return MATRIX_ROWS; } @@ -48,7 +66,7 @@ inline uint8_t matrix_cols(void) { * col: 0 1 2 3 4 5 6 7 * pin: PC7 PD5 PD3 PD1 PC2 PD6 PD4 PD2 * - * Rrr pin configuration + * Rrr pin configuration * * These rrrs uses one 74HC154 4 to 16 bit demultiplexer (low * active), together with 2 rrrs driven directly from the micro @@ -84,7 +102,7 @@ uint8_t matrix_scan(void) { } } } - + if (debouncing) { if (--debouncing) { _delay_ms(1); diff --git a/keyboards/kitten_paw/readme.md b/keyboards/bpiphany/kitten_paw/readme.md similarity index 65% rename from keyboards/kitten_paw/readme.md rename to keyboards/bpiphany/kitten_paw/readme.md index d5fa9aa8b..15737a3a9 100644 --- a/keyboards/kitten_paw/readme.md +++ b/keyboards/bpiphany/kitten_paw/readme.md @@ -11,6 +11,6 @@ Hardware Availability: https://geekhack.org/index.php?topic=46700.0 Make example for this keyboard (after setting up your build environment): - make kitten_paw:default + make bpiphany/kitten_paw:default -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. +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). diff --git a/keyboards/kitten_paw/rules.mk b/keyboards/bpiphany/kitten_paw/rules.mk similarity index 100% rename from keyboards/kitten_paw/rules.mk rename to keyboards/bpiphany/kitten_paw/rules.mk diff --git a/keyboards/bpiphany/pegasushoof/README.md b/keyboards/bpiphany/pegasushoof/README.md new file mode 100644 index 000000000..1b3d63190 --- /dev/null +++ b/keyboards/bpiphany/pegasushoof/README.md @@ -0,0 +1,12 @@ +Pegasus Hoof Controller +=== + +Keyboard Maintainer: QMK Community +Hardware Supported: Pegasus Hoof +Hardware Availability: https://1upkeyboards.com/filco-pegasus-hoof-controller.html + +Make example for this keyboard (after setting up your build environment): + + make bpiphany/pegasus_hoof:default + +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). diff --git a/keyboards/pegasushoof/config.h b/keyboards/bpiphany/pegasushoof/config.h similarity index 100% rename from keyboards/pegasushoof/config.h rename to keyboards/bpiphany/pegasushoof/config.h diff --git a/keyboards/pegasushoof/keymaps/blowrak/keymap.c b/keyboards/bpiphany/pegasushoof/keymaps/blowrak/keymap.c similarity index 100% rename from keyboards/pegasushoof/keymaps/blowrak/keymap.c rename to keyboards/bpiphany/pegasushoof/keymaps/blowrak/keymap.c diff --git a/keyboards/pegasushoof/keymaps/blowrak/rules.mk b/keyboards/bpiphany/pegasushoof/keymaps/blowrak/rules.mk similarity index 100% rename from keyboards/pegasushoof/keymaps/blowrak/rules.mk rename to keyboards/bpiphany/pegasushoof/keymaps/blowrak/rules.mk diff --git a/keyboards/pegasushoof/keymaps/citadel/config.h b/keyboards/bpiphany/pegasushoof/keymaps/citadel/config.h similarity index 100% rename from keyboards/pegasushoof/keymaps/citadel/config.h rename to keyboards/bpiphany/pegasushoof/keymaps/citadel/config.h diff --git a/keyboards/pegasushoof/keymaps/citadel/keymap.c b/keyboards/bpiphany/pegasushoof/keymaps/citadel/keymap.c similarity index 100% rename from keyboards/pegasushoof/keymaps/citadel/keymap.c rename to keyboards/bpiphany/pegasushoof/keymaps/citadel/keymap.c diff --git a/keyboards/pegasushoof/keymaps/citadel/readme.md b/keyboards/bpiphany/pegasushoof/keymaps/citadel/readme.md similarity index 100% rename from keyboards/pegasushoof/keymaps/citadel/readme.md rename to keyboards/bpiphany/pegasushoof/keymaps/citadel/readme.md diff --git a/keyboards/pegasushoof/keymaps/citadel/rules.mk b/keyboards/bpiphany/pegasushoof/keymaps/citadel/rules.mk similarity index 100% rename from keyboards/pegasushoof/keymaps/citadel/rules.mk rename to keyboards/bpiphany/pegasushoof/keymaps/citadel/rules.mk diff --git a/keyboards/pegasushoof/keymaps/default/keymap.c b/keyboards/bpiphany/pegasushoof/keymaps/default/keymap.c similarity index 100% rename from keyboards/pegasushoof/keymaps/default/keymap.c rename to keyboards/bpiphany/pegasushoof/keymaps/default/keymap.c diff --git a/keyboards/pegasushoof/keymaps/default/rules.mk b/keyboards/bpiphany/pegasushoof/keymaps/default/rules.mk similarity index 100% rename from keyboards/pegasushoof/keymaps/default/rules.mk rename to keyboards/bpiphany/pegasushoof/keymaps/default/rules.mk diff --git a/keyboards/pegasushoof/matrix.c b/keyboards/bpiphany/pegasushoof/matrix.c similarity index 94% rename from keyboards/pegasushoof/matrix.c rename to keyboards/bpiphany/pegasushoof/matrix.c index d2a74b8d7..127433875 100644 --- a/keyboards/pegasushoof/matrix.c +++ b/keyboards/bpiphany/pegasushoof/matrix.c @@ -33,6 +33,24 @@ static matrix_row_t matrix_debouncing[MATRIX_ROWS]; static matrix_row_t read_cols(void); static void select_row(uint8_t col); +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + inline uint8_t matrix_rows(void) { return MATRIX_ROWS; diff --git a/keyboards/pegasushoof/pegasushoof.c b/keyboards/bpiphany/pegasushoof/pegasushoof.c similarity index 100% rename from keyboards/pegasushoof/pegasushoof.c rename to keyboards/bpiphany/pegasushoof/pegasushoof.c diff --git a/keyboards/pegasushoof/pegasushoof.h b/keyboards/bpiphany/pegasushoof/pegasushoof.h similarity index 100% rename from keyboards/pegasushoof/pegasushoof.h rename to keyboards/bpiphany/pegasushoof/pegasushoof.h diff --git a/keyboards/pegasushoof/rules.mk b/keyboards/bpiphany/pegasushoof/rules.mk similarity index 100% rename from keyboards/pegasushoof/rules.mk rename to keyboards/bpiphany/pegasushoof/rules.mk diff --git a/keyboards/bpiphany/readme.md b/keyboards/bpiphany/readme.md new file mode 100644 index 000000000..992b7c908 --- /dev/null +++ b/keyboards/bpiphany/readme.md @@ -0,0 +1,6 @@ +# Bathroom Epiphanies + +bpiphany is the owner and designer of [Bathroom Epiphanies](http://bathroomepiphanies.com/). + +He is based in Sweden and creates several controller boards as a swappable component for some off the shelf keyboards. + diff --git a/keyboards/tiger_lily/config.h b/keyboards/bpiphany/tiger_lily/config.h similarity index 100% rename from keyboards/tiger_lily/config.h rename to keyboards/bpiphany/tiger_lily/config.h diff --git a/keyboards/tiger_lily/info.json b/keyboards/bpiphany/tiger_lily/info.json similarity index 100% rename from keyboards/tiger_lily/info.json rename to keyboards/bpiphany/tiger_lily/info.json diff --git a/keyboards/tiger_lily/keymaps/default/config.h b/keyboards/bpiphany/tiger_lily/keymaps/default/config.h similarity index 100% rename from keyboards/tiger_lily/keymaps/default/config.h rename to keyboards/bpiphany/tiger_lily/keymaps/default/config.h diff --git a/keyboards/tiger_lily/keymaps/default/keymap.c b/keyboards/bpiphany/tiger_lily/keymaps/default/keymap.c similarity index 100% rename from keyboards/tiger_lily/keymaps/default/keymap.c rename to keyboards/bpiphany/tiger_lily/keymaps/default/keymap.c diff --git a/keyboards/tiger_lily/keymaps/default/readme.md b/keyboards/bpiphany/tiger_lily/keymaps/default/readme.md similarity index 100% rename from keyboards/tiger_lily/keymaps/default/readme.md rename to keyboards/bpiphany/tiger_lily/keymaps/default/readme.md diff --git a/keyboards/tiger_lily/keymaps/default/rules.mk b/keyboards/bpiphany/tiger_lily/keymaps/default/rules.mk similarity index 100% rename from keyboards/tiger_lily/keymaps/default/rules.mk rename to keyboards/bpiphany/tiger_lily/keymaps/default/rules.mk diff --git a/keyboards/tiger_lily/keymaps/default_ansi/config.h b/keyboards/bpiphany/tiger_lily/keymaps/default_ansi/config.h similarity index 100% rename from keyboards/tiger_lily/keymaps/default_ansi/config.h rename to keyboards/bpiphany/tiger_lily/keymaps/default_ansi/config.h diff --git a/keyboards/tiger_lily/keymaps/default_ansi/keymap.c b/keyboards/bpiphany/tiger_lily/keymaps/default_ansi/keymap.c similarity index 100% rename from keyboards/tiger_lily/keymaps/default_ansi/keymap.c rename to keyboards/bpiphany/tiger_lily/keymaps/default_ansi/keymap.c diff --git a/keyboards/tiger_lily/keymaps/default_ansi/readme.md b/keyboards/bpiphany/tiger_lily/keymaps/default_ansi/readme.md similarity index 100% rename from keyboards/tiger_lily/keymaps/default_ansi/readme.md rename to keyboards/bpiphany/tiger_lily/keymaps/default_ansi/readme.md diff --git a/keyboards/tiger_lily/keymaps/default_ansi/rules.mk b/keyboards/bpiphany/tiger_lily/keymaps/default_ansi/rules.mk similarity index 100% rename from keyboards/tiger_lily/keymaps/default_ansi/rules.mk rename to keyboards/bpiphany/tiger_lily/keymaps/default_ansi/rules.mk diff --git a/keyboards/tiger_lily/matrix.c b/keyboards/bpiphany/tiger_lily/matrix.c similarity index 94% rename from keyboards/tiger_lily/matrix.c rename to keyboards/bpiphany/tiger_lily/matrix.c index d3a0d7ebd..3b48f6b36 100644 --- a/keyboards/tiger_lily/matrix.c +++ b/keyboards/bpiphany/tiger_lily/matrix.c @@ -32,6 +32,24 @@ static uint8_t debouncing = DEBOUNCING_DELAY; static matrix_row_t matrix[MATRIX_ROWS]; static matrix_row_t matrix_debouncing[MATRIX_ROWS]; +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + static matrix_row_t scan_col(void) { return ( (PINC&(1<<2) ? 0 : ((matrix_row_t)1<<0)) | \ @@ -134,4 +152,4 @@ uint8_t matrix_key_count(void) { for (uint8_t row = 0; row < MATRIX_ROWS; row++) count += bitpop32(matrix[row]); return count; -} \ No newline at end of file +} diff --git a/keyboards/tiger_lily/readme.md b/keyboards/bpiphany/tiger_lily/readme.md similarity index 72% rename from keyboards/tiger_lily/readme.md rename to keyboards/bpiphany/tiger_lily/readme.md index 37073def5..1fcb6c3d6 100644 --- a/keyboards/tiger_lily/readme.md +++ b/keyboards/bpiphany/tiger_lily/readme.md @@ -11,6 +11,6 @@ Hardware Availability: https://geekhack.org/index.php?topic=46700.0 Make example for this keyboard (after setting up your build environment): - make tiger_lily:default + make bpiphany/tiger_lily:default -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. +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). diff --git a/keyboards/tiger_lily/rules.mk b/keyboards/bpiphany/tiger_lily/rules.mk similarity index 100% rename from keyboards/tiger_lily/rules.mk rename to keyboards/bpiphany/tiger_lily/rules.mk diff --git a/keyboards/tiger_lily/tiger_lily.c b/keyboards/bpiphany/tiger_lily/tiger_lily.c similarity index 100% rename from keyboards/tiger_lily/tiger_lily.c rename to keyboards/bpiphany/tiger_lily/tiger_lily.c diff --git a/keyboards/tiger_lily/tiger_lily.h b/keyboards/bpiphany/tiger_lily/tiger_lily.h similarity index 100% rename from keyboards/tiger_lily/tiger_lily.h rename to keyboards/bpiphany/tiger_lily/tiger_lily.h diff --git a/keyboards/unloved_bastard/config.h b/keyboards/bpiphany/unloved_bastard/config.h similarity index 100% rename from keyboards/unloved_bastard/config.h rename to keyboards/bpiphany/unloved_bastard/config.h diff --git a/keyboards/unloved_bastard/info.json b/keyboards/bpiphany/unloved_bastard/info.json similarity index 100% rename from keyboards/unloved_bastard/info.json rename to keyboards/bpiphany/unloved_bastard/info.json diff --git a/keyboards/unloved_bastard/keymaps/default/config.h b/keyboards/bpiphany/unloved_bastard/keymaps/default/config.h similarity index 100% rename from keyboards/unloved_bastard/keymaps/default/config.h rename to keyboards/bpiphany/unloved_bastard/keymaps/default/config.h diff --git a/keyboards/unloved_bastard/keymaps/default/keymap.c b/keyboards/bpiphany/unloved_bastard/keymaps/default/keymap.c similarity index 100% rename from keyboards/unloved_bastard/keymaps/default/keymap.c rename to keyboards/bpiphany/unloved_bastard/keymaps/default/keymap.c diff --git a/keyboards/unloved_bastard/keymaps/default/readme.md b/keyboards/bpiphany/unloved_bastard/keymaps/default/readme.md similarity index 100% rename from keyboards/unloved_bastard/keymaps/default/readme.md rename to keyboards/bpiphany/unloved_bastard/keymaps/default/readme.md diff --git a/keyboards/unloved_bastard/keymaps/default_ansi/config.h b/keyboards/bpiphany/unloved_bastard/keymaps/default_ansi/config.h similarity index 100% rename from keyboards/unloved_bastard/keymaps/default_ansi/config.h rename to keyboards/bpiphany/unloved_bastard/keymaps/default_ansi/config.h diff --git a/keyboards/unloved_bastard/keymaps/default_ansi/keymap.c b/keyboards/bpiphany/unloved_bastard/keymaps/default_ansi/keymap.c similarity index 100% rename from keyboards/unloved_bastard/keymaps/default_ansi/keymap.c rename to keyboards/bpiphany/unloved_bastard/keymaps/default_ansi/keymap.c diff --git a/keyboards/unloved_bastard/keymaps/default_ansi/readme.md b/keyboards/bpiphany/unloved_bastard/keymaps/default_ansi/readme.md similarity index 100% rename from keyboards/unloved_bastard/keymaps/default_ansi/readme.md rename to keyboards/bpiphany/unloved_bastard/keymaps/default_ansi/readme.md diff --git a/keyboards/unloved_bastard/matrix.c b/keyboards/bpiphany/unloved_bastard/matrix.c similarity index 94% rename from keyboards/unloved_bastard/matrix.c rename to keyboards/bpiphany/unloved_bastard/matrix.c index 65773879b..bb6de8613 100644 --- a/keyboards/unloved_bastard/matrix.c +++ b/keyboards/bpiphany/unloved_bastard/matrix.c @@ -25,6 +25,24 @@ #include "util.h" #include "matrix.h" +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + #ifndef DEBOUNCING_DELAY # define DEBOUNCING_DELAY 5 #endif diff --git a/keyboards/unloved_bastard/readme.md b/keyboards/bpiphany/unloved_bastard/readme.md similarity index 56% rename from keyboards/unloved_bastard/readme.md rename to keyboards/bpiphany/unloved_bastard/readme.md index 33c74d4b0..9909d5af3 100644 --- a/keyboards/unloved_bastard/readme.md +++ b/keyboards/bpiphany/unloved_bastard/readme.md @@ -10,6 +10,6 @@ Hardware Availability: Pretty much anywhere Make example for this keyboard (after setting up your build environment): - make unloved_bastard:default + make bpiphany/unloved_bastard:default -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. +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). diff --git a/keyboards/unloved_bastard/rules.mk b/keyboards/bpiphany/unloved_bastard/rules.mk similarity index 100% rename from keyboards/unloved_bastard/rules.mk rename to keyboards/bpiphany/unloved_bastard/rules.mk diff --git a/keyboards/unloved_bastard/unloved_bastard.c b/keyboards/bpiphany/unloved_bastard/unloved_bastard.c similarity index 100% rename from keyboards/unloved_bastard/unloved_bastard.c rename to keyboards/bpiphany/unloved_bastard/unloved_bastard.c diff --git a/keyboards/unloved_bastard/unloved_bastard.h b/keyboards/bpiphany/unloved_bastard/unloved_bastard.h similarity index 100% rename from keyboards/unloved_bastard/unloved_bastard.h rename to keyboards/bpiphany/unloved_bastard/unloved_bastard.h diff --git a/keyboards/pegasushoof/README.md b/keyboards/pegasushoof/README.md deleted file mode 100644 index debf7f737..000000000 --- a/keyboards/pegasushoof/README.md +++ /dev/null @@ -1,12 +0,0 @@ -Pegasus Hoof Controller -=== - -Keyboard Maintainer: QMK Community -Hardware Supported: Pegasus Hoof -Hardware Availability: https://1upkeyboards.com/filco-pegasus-hoof-controller.html - -Make example for this keyboard (after setting up your build environment): - - make pegasus_hoof:default - -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. From 6cab5140368c006030f35a9c7eaa946b0fdd78ef Mon Sep 17 00:00:00 2001 From: Daniel Shields Date: Thu, 20 Sep 2018 00:33:00 +0100 Subject: [PATCH 118/788] Keymap: Initial commit of dshields keymap for the model01 keyboard. (#3942) --- keyboards/model01/keymaps/dshields/config.h | 31 ++++++++++++ keyboards/model01/keymaps/dshields/keymap.c | 53 ++++++++++++++++++++ keyboards/model01/keymaps/dshields/readme.md | 10 ++++ keyboards/model01/keymaps/dshields/rules.mk | 2 + 4 files changed, 96 insertions(+) create mode 100644 keyboards/model01/keymaps/dshields/config.h create mode 100644 keyboards/model01/keymaps/dshields/keymap.c create mode 100644 keyboards/model01/keymaps/dshields/readme.md create mode 100644 keyboards/model01/keymaps/dshields/rules.mk diff --git a/keyboards/model01/keymaps/dshields/config.h b/keyboards/model01/keymaps/dshields/config.h new file mode 100644 index 000000000..86a4dd531 --- /dev/null +++ b/keyboards/model01/keymaps/dshields/config.h @@ -0,0 +1,31 @@ +#pragma once + +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +#define USB_MAX_POWER_CONSUMPTION 100 +#define ONESHOT_TAP_TOGGLE 2 +#define ONESHOT_TIMEOUT 3000 + +#define MOUSEKEY_INTERVAL 20 +#define MOUSEKEY_DELAY 0 +#define MOUSEKEY_TIME_TO_MAX 40 +#define MOUSEKEY_MAX_SPEED 7 +#define MOUSEKEY_WHEEL_DELAY 0 + +// dynamic macro keys +#define DM_PLAY DYN_MACRO_PLAY1 +#define DM_STRT DYN_REC_START1 +#define DM_STOP DYN_REC_STOP + +// one-shot layer keys +#define OSL_FUN OSL(FUN) + +// one-shot modifier keys +#define OSMLCTL OSM(MOD_LCTL) +#define OSMRCTL OSM(MOD_RCTL) +#define OSMLALT OSM(MOD_LALT) +#define OSMRALT OSM(MOD_RALT) +#define OSMLSFT OSM(MOD_LSFT) +#define OSMRSFT OSM(MOD_RSFT) + diff --git a/keyboards/model01/keymaps/dshields/keymap.c b/keyboards/model01/keymaps/dshields/keymap.c new file mode 100644 index 000000000..3a89d062b --- /dev/null +++ b/keyboards/model01/keymaps/dshields/keymap.c @@ -0,0 +1,53 @@ +#include QMK_KEYBOARD_H + +enum { DEF, FUN }; +enum { DYNAMIC_MACRO_RANGE = SAFE_RANGE }; + +#include "dynamic_macro.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[DEF] = LAYOUT( + RESET , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , _______, + KC_GRV , KC_Q , KC_W , KC_E , KC_R , KC_T , RGB_TOG, DM_PLAY, KC_Y , KC_U , KC_I , KC_O , KC_P , KC_EQL , + KC_PGUP, KC_A , KC_S , KC_D , KC_F , KC_G , KC_TAB , KC_ENT , KC_H , KC_J , KC_K , KC_L , KC_SCLN, KC_QUOT, + KC_PGDN, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_ESC , _______, KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, KC_MINS, + OSMLCTL, KC_RCTL, + KC_BSPC, KC_SPC , + KC_LGUI, OSMRALT, + OSMLSFT, OSMRSFT, + OSL_FUN, OSL_FUN + ), +[FUN] = LAYOUT( + _______, KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , + KC_TAB , _______, KC_MS_U, _______, KC_BTN3, _______, RGB_MOD, DM_STRT, _______, KC_LCBR, KC_RCBR, KC_LBRC, KC_RBRC, KC_F12 , + KC_HOME, KC_MS_L, KC_MS_D, KC_MS_R, KC_BTN1, _______, _______, DM_STOP, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT, _______, _______, + KC_END , KC_PSCR, KC_INS , _______, KC_BTN2, _______, _______, _______, _______, _______, _______, _______, KC_BSLS, KC_PIPE, + _______, _______, + KC_DEL , KC_ENT , + _______, _______, + _______, _______, + _______, _______ + ) +}; + +uint32_t layer_state_set_user(uint32_t state) { + switch (biton32(state)) { + case DEF: + set_all_leds_to(0,0,0); + break; + case FUN: + // TODO light the fn keys + // set_led_to(?, 0, 128, 0); + // set_led_to(?, 0, 128, 0); + break; + } + return state; +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (!process_record_dynamic_macro(keycode, record)) { + return false; + } + return true; +} + diff --git a/keyboards/model01/keymaps/dshields/readme.md b/keyboards/model01/keymaps/dshields/readme.md new file mode 100644 index 000000000..ead1c1aad --- /dev/null +++ b/keyboards/model01/keymaps/dshields/readme.md @@ -0,0 +1,10 @@ + +About +------ + +A lightly modded version of the default keymap. + +- One-shot modifiers and layers. +- Dynamic macros +- No num lock layer + diff --git a/keyboards/model01/keymaps/dshields/rules.mk b/keyboards/model01/keymaps/dshields/rules.mk new file mode 100644 index 000000000..4d1abd88a --- /dev/null +++ b/keyboards/model01/keymaps/dshields/rules.mk @@ -0,0 +1,2 @@ +# used by default keymap +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) From 4c22e92ce81cc5fecce713c7525d7102df39f2df Mon Sep 17 00:00:00 2001 From: Simon Dagfinrud Date: Thu, 20 Sep 2018 01:34:08 +0200 Subject: [PATCH 119/788] Keymap: Fix tada68:iso-nor to match latest ISO_layout (#3946) --- keyboards/tada68/keymaps/iso-nor/keymap.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/keyboards/tada68/keymaps/iso-nor/keymap.c b/keyboards/tada68/keymaps/iso-nor/keymap.c index 2e6a80750..c26932b0e 100644 --- a/keyboards/tada68/keymaps/iso-nor/keymap.c +++ b/keyboards/tada68/keymaps/iso-nor/keymap.c @@ -21,8 +21,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_BL] = LAYOUT_iso( KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_GRV, KC_BSPC, KC_EQL, \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_NUHS, KC_DEL, \ - KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_DEL, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_PGUP, \ KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN, \ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FL), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT ), @@ -42,9 +42,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_FL] = LAYOUT_iso( _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, RESET, KC_PSCR, \ - _______, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, BL_DEC, BL_INC, BL_TOGG, KC_INS, \ + _______, _______, KC_UP, _______, _______, _______, _______, _______, _______, BL_DEC, BL_INC, BL_TOGG, _______, KC_INS, \ _______, KC_LEFT, KC_DOWN,KC_RIGHT, _______, _______, _______, _______, _______, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______, KC_HOME, \ - _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLD, KC_MUTE, KC_VOLU, _______, _______, KC_END, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLD, KC_MUTE, KC_VOLU, _______, _______, KC_END, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), From cfdc23bbaea69039d01e57e7256b62010635c260 Mon Sep 17 00:00:00 2001 From: Danny Date: Thu, 20 Sep 2018 11:00:19 -0400 Subject: [PATCH 120/788] Keyboard: Add Quefrency 65 support in configurator (#3950) * Fix Quefrency configurator layout to support new key added * Add configurator support for Quefrency 65 --- keyboards/quefrency/info.json | 94 ++++++++++++++++++- .../quefrency/keymaps/default65/keymap.c | 8 +- 2 files changed, 94 insertions(+), 8 deletions(-) diff --git a/keyboards/quefrency/info.json b/keyboards/quefrency/info.json index f63cd1f6c..160e7896b 100644 --- a/keyboards/quefrency/info.json +++ b/keyboards/quefrency/info.json @@ -2,7 +2,7 @@ "keyboard_name": "Quefrency", "url": "https://keeb.io", "maintainer": "nooges", - "width": 16, + "width": 17, "height": 5, "layouts": { "LAYOUT": { @@ -72,17 +72,103 @@ {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Alt", "x":1.25, "y":4, "w":1.25}, - {"label":"GUI", "x":2.5, "y":4, "w":1.25}, + {"label":"Win", "x":2.5, "y":4, "w":1.25}, {"label":"Fn", "x":3.75, "y":4, "w":1.25}, {"label":"Space", "x":5, "y":4, "w":2.25}, - {"label":"Backspace", "x":8.25, "y":4, "w":2.75}, + {"label":"Fn", "x":8.25, "y":4, "w":1.25}, + {"label":"Space", "x":9.5, "y":4, "w":1.5}, {"label":"Alt", "x":11, "y":4}, {"label":"Ctrl", "x":12, "y":4}, {"label":"Left", "x":13, "y":4}, {"label":"Down", "x":14, "y":4}, {"label":"Right", "x":15, "y":4} ] - } + }, + "LAYOUT_65": { + "layout": [ + {"label":"Esc", "x":0, "y":0}, + {"label":"1", "x":1, "y":0}, + {"label":"2", "x":2, "y":0}, + {"label":"3", "x":3, "y":0}, + {"label":"4", "x":4, "y":0}, + {"label":"5", "x":5, "y":0}, + {"label":"6", "x":6, "y":0}, + + {"label":"7", "x":8, "y":0}, + {"label":"8", "x":9, "y":0}, + {"label":"9", "x":10, "y":0}, + {"label":"0", "x":11, "y":0}, + {"label":"-", "x":12, "y":0}, + {"label":"=", "x":13, "y":0}, + {"label":"Del", "x":14, "y":0}, + {"label":"Bksp", "x":15, "y":0}, + {"label":"Home", "x":16, "y":0}, + + {"label":"Tab", "x":0, "y":1, "w":1.5}, + {"label":"Q", "x":1.5, "y":1}, + {"label":"W", "x":2.5, "y":1}, + {"label":"E", "x":3.5, "y":1}, + {"label":"R", "x":4.5, "y":1}, + {"label":"T", "x":5.5, "y":1}, + + {"label":"Y", "x":7.5, "y":1}, + {"label":"U", "x":8.5, "y":1}, + {"label":"I", "x":9.5, "y":1}, + {"label":"O", "x":10.5, "y":1}, + {"label":"P", "x":11.5, "y":1}, + {"label":"[", "x":12.5, "y":1}, + {"label":"]", "x":13.5, "y":1}, + {"label":"Backslash", "x":14.5, "y":1, "w":1.5}, + {"label":"End", "x":16, "y":1}, + + {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, + {"label":"A", "x":1.75, "y":2}, + {"label":"S", "x":2.75, "y":2}, + {"label":"D", "x":3.75, "y":2}, + {"label":"F", "x":4.75, "y":2}, + {"label":"G", "x":5.75, "y":2}, + + {"label":"H", "x":7.75, "y":2}, + {"label":"J", "x":8.75, "y":2}, + {"label":"K", "x":9.75, "y":2}, + {"label":"L", "x":10.75, "y":2}, + {"label":";", "x":11.75, "y":2}, + {"label":"'", "x":12.75, "y":2}, + {"label":"Enter", "x":13.75, "y":2, "w":2.25}, + {"label":"Page Up", "x":16, "y":2}, + + {"label":"Shift", "x":0, "y":3, "w":2.25}, + {"label":"Z", "x":2.25, "y":3}, + {"label":"X", "x":3.25, "y":3}, + {"label":"C", "x":4.25, "y":3}, + {"label":"V", "x":5.25, "y":3}, + {"label":"B", "x":6.25, "y":3}, + + {"label":"N", "x":8.25, "y":3}, + {"label":"M", "x":9.25, "y":3}, + {"label":",", "x":10.25, "y":3}, + {"label":".", "x":11.25, "y":3}, + {"label":"/", "x":12.25, "y":3}, + {"label":"Shift", "x":13.25, "y":3, "w":1.75}, + {"label":"Up", "x":15, "y":3}, + {"label":"Page Down", "x":16, "y":3}, + + {"label":"Ctrl", "x":0, "y":4, "w":1.25}, + {"label":"Alt", "x":1.25, "y":4, "w":1.25}, + {"label":"Win", "x":2.5, "y":4, "w":1.25}, + {"label":"Fn", "x":3.75, "y":4, "w":1.25}, + {"label":"Space", "x":5, "y":4, "w":2.25}, + + {"label":"Fn", "x":8.25, "y":4, "w":1.25}, + {"label":"Space", "x":9.5, "y":4, "w":1.5}, + {"label":"Alt", "x":11, "y":4}, + {"label":"Ctrl", "x":12, "y":4}, + {"label":"Win", "x":13, "y":4}, + {"label":"Left", "x":14, "y":4}, + {"label":"Down", "x":15, "y":4}, + {"label":"Right", "x":16, "y":4} + ] + } } } diff --git a/keyboards/quefrency/keymaps/default65/keymap.c b/keyboards/quefrency/keymaps/default65/keymap.c index b660b5d86..4b07949b0 100644 --- a/keyboards/quefrency/keymaps/default65/keymap.c +++ b/keyboards/quefrency/keymaps/default65/keymap.c @@ -18,10 +18,10 @@ enum custom_keycodes { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_BASE] = LAYOUT_65( - KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_DEL, KC_BSPC, KC_PGUP, \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, \ - KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_HOME, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END, \ + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_DEL, KC_BSPC, KC_HOME, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_END, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN, \ KC_LCTL, KC_LALT, KC_LGUI, MO(_FN1),KC_SPC, MO(_FN1),KC_SPC, KC_RALT, KC_RCTL, KC_RGUI, KC_LEFT, KC_DOWN, KC_RGHT ), From 99c1c5bfe933865bacdebdcbcfa55954a5a946a2 Mon Sep 17 00:00:00 2001 From: Jumail Mundekkat Date: Fri, 21 Sep 2018 08:36:11 +1000 Subject: [PATCH 121/788] Keyboard: Added Prime_L, Prime_O and Prime_M, moved Prime_R into primekb folder (#3907) * Added template copies for prime_l Added first set of files for prime_m and prime_o Temporarily storing kbfirmware dumps in tmp * Completed base for prime_m, prime_o and prime_l Moved prime_r into primekb folder * Added in QMK Configurator layout files for new PrimeKB keyboards Slight modification to layout header files Added my name to licensing * Updated primekb readmes * Removed temporary working files * Updated default keymap for Prime_O * Added link to Newbs Guide in prime_r readme --- keyboards/primekb/prime_l/config.h | 57 +++++++++++++ keyboards/primekb/prime_l/info.json | 12 +++ .../primekb/prime_l/keymaps/default/config.h | 19 +++++ .../primekb/prime_l/keymaps/default/keymap.c | 74 ++++++++++++++++ .../primekb/prime_l/keymaps/default/readme.md | 1 + keyboards/primekb/prime_l/prime_l.c | 43 ++++++++++ keyboards/primekb/prime_l/prime_l.h | 35 ++++++++ keyboards/primekb/prime_l/readme.md | 15 ++++ keyboards/primekb/prime_l/rules.mk | 80 +++++++++++++++++ keyboards/primekb/prime_m/config.h | 57 +++++++++++++ keyboards/primekb/prime_m/info.json | 12 +++ .../primekb/prime_m/keymaps/default/config.h | 19 +++++ .../primekb/prime_m/keymaps/default/keymap.c | 82 ++++++++++++++++++ .../primekb/prime_m/keymaps/default/readme.md | 1 + keyboards/primekb/prime_m/prime_m.c | 43 ++++++++++ keyboards/primekb/prime_m/prime_m.h | 35 ++++++++ keyboards/primekb/prime_m/readme.md | 15 ++++ keyboards/primekb/prime_m/rules.mk | 80 +++++++++++++++++ keyboards/primekb/prime_o/config.h | 57 +++++++++++++ keyboards/primekb/prime_o/info.json | 12 +++ .../primekb/prime_o/keymaps/default/config.h | 19 +++++ .../primekb/prime_o/keymaps/default/keymap.c | 85 +++++++++++++++++++ .../primekb/prime_o/keymaps/default/readme.md | 1 + keyboards/primekb/prime_o/prime_o.c | 43 ++++++++++ keyboards/primekb/prime_o/prime_o.h | 40 +++++++++ keyboards/primekb/prime_o/readme.md | 15 ++++ keyboards/primekb/prime_o/rules.mk | 80 +++++++++++++++++ keyboards/{ => primekb}/prime_r/config.h | 0 keyboards/{ => primekb}/prime_r/info.json | 0 .../prime_r/keymaps/default/config.h | 0 .../prime_r/keymaps/default/keymap.c | 0 .../prime_r/keymaps/default/readme.md | 0 .../prime_r/keymaps/rooski/config.h | 0 .../prime_r/keymaps/rooski/keymap.c | 0 .../prime_r/keymaps/rooski/readme.md | 0 .../prime_r/keymaps/rooski/rules.mk | 0 keyboards/{ => primekb}/prime_r/prime_r.c | 0 keyboards/{ => primekb}/prime_r/prime_r.h | 0 keyboards/{ => primekb}/prime_r/readme.md | 5 +- keyboards/{ => primekb}/prime_r/rules.mk | 0 40 files changed, 1034 insertions(+), 3 deletions(-) create mode 100644 keyboards/primekb/prime_l/config.h create mode 100644 keyboards/primekb/prime_l/info.json create mode 100644 keyboards/primekb/prime_l/keymaps/default/config.h create mode 100644 keyboards/primekb/prime_l/keymaps/default/keymap.c create mode 100644 keyboards/primekb/prime_l/keymaps/default/readme.md create mode 100644 keyboards/primekb/prime_l/prime_l.c create mode 100644 keyboards/primekb/prime_l/prime_l.h create mode 100644 keyboards/primekb/prime_l/readme.md create mode 100644 keyboards/primekb/prime_l/rules.mk create mode 100644 keyboards/primekb/prime_m/config.h create mode 100644 keyboards/primekb/prime_m/info.json create mode 100644 keyboards/primekb/prime_m/keymaps/default/config.h create mode 100644 keyboards/primekb/prime_m/keymaps/default/keymap.c create mode 100644 keyboards/primekb/prime_m/keymaps/default/readme.md create mode 100644 keyboards/primekb/prime_m/prime_m.c create mode 100644 keyboards/primekb/prime_m/prime_m.h create mode 100644 keyboards/primekb/prime_m/readme.md create mode 100644 keyboards/primekb/prime_m/rules.mk create mode 100644 keyboards/primekb/prime_o/config.h create mode 100644 keyboards/primekb/prime_o/info.json create mode 100644 keyboards/primekb/prime_o/keymaps/default/config.h create mode 100644 keyboards/primekb/prime_o/keymaps/default/keymap.c create mode 100644 keyboards/primekb/prime_o/keymaps/default/readme.md create mode 100644 keyboards/primekb/prime_o/prime_o.c create mode 100644 keyboards/primekb/prime_o/prime_o.h create mode 100644 keyboards/primekb/prime_o/readme.md create mode 100644 keyboards/primekb/prime_o/rules.mk rename keyboards/{ => primekb}/prime_r/config.h (100%) rename keyboards/{ => primekb}/prime_r/info.json (100%) rename keyboards/{ => primekb}/prime_r/keymaps/default/config.h (100%) rename keyboards/{ => primekb}/prime_r/keymaps/default/keymap.c (100%) rename keyboards/{ => primekb}/prime_r/keymaps/default/readme.md (100%) rename keyboards/{ => primekb}/prime_r/keymaps/rooski/config.h (100%) rename keyboards/{ => primekb}/prime_r/keymaps/rooski/keymap.c (100%) rename keyboards/{ => primekb}/prime_r/keymaps/rooski/readme.md (100%) rename keyboards/{ => primekb}/prime_r/keymaps/rooski/rules.mk (100%) rename keyboards/{ => primekb}/prime_r/prime_r.c (100%) rename keyboards/{ => primekb}/prime_r/prime_r.h (100%) rename keyboards/{ => primekb}/prime_r/readme.md (63%) rename keyboards/{ => primekb}/prime_r/rules.mk (100%) diff --git a/keyboards/primekb/prime_l/config.h b/keyboards/primekb/prime_l/config.h new file mode 100644 index 000000000..46dd3604e --- /dev/null +++ b/keyboards/primekb/prime_l/config.h @@ -0,0 +1,57 @@ +/* +Copyright 2018 Jumail Mundekkat + +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 . +*/ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x4024 +#define DEVICE_VER 0x0001 +#define MANUFACTURER PrimeKB +#define PRODUCT Prime_L +#define DESCRIPTION Custom layout keyboard + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 16 + +/* Keyboard Matrix Assignments */ +#define MATRIX_ROW_PINS { D1, D0, B7, B3, B2 } +#define MATRIX_COL_PINS { D2, D3, D5, D4, D6, D7, B4, B5, C7, C6, F7, F6, F5, F4, F1, F0 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +#define BACKLIGHT_PIN B6 +#define BACKLIGHT_BREATHING +#define BACKLIGHT_LEVELS 4 + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* 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 + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) diff --git a/keyboards/primekb/prime_l/info.json b/keyboards/primekb/prime_l/info.json new file mode 100644 index 000000000..8a407fd3e --- /dev/null +++ b/keyboards/primekb/prime_l/info.json @@ -0,0 +1,12 @@ +{ + "keyboard_name": "Prime_L", + "url": "https://www.primekb.com", + "maintainer": "MxBlu", + "width": 16, + "height": 5, + "layouts": { + "LAYOUT": { + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":15, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":6, "y":1}, {"x":7, "y":1}, {"x":8, "y":1}, {"x":9, "y":1}, {"x":10, "y":1}, {"x":11, "y":1}, {"x":12, "y":1}, {"x":13, "y":1}, {"x":14, "y":1}, {"x":15, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2, "w":1.25}, {"x":4.25, "y":2}, {"x":5.25, "y":2}, {"x":6.25, "y":2}, {"x":7.25, "y":2}, {"x":8.25, "y":2}, {"x":9.25, "y":2}, {"x":10.25, "y":2}, {"x":11.25, "y":2}, {"x":12.25, "y":2}, {"x":13.25, "y":2}, {"x":14.25, "y":2, "w":1.75}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3, "w":1.75}, {"x":4.75, "y":3}, {"x":5.75, "y":3}, {"x":6.75, "y":3}, {"x":7.75, "y":3}, {"x":8.75, "y":3}, {"x":9.75, "y":3}, {"x":10.75, "y":3}, {"x":11.75, "y":3}, {"x":12.75, "y":3}, {"x":13.75, "y":3}, {"x":14.75, "y":3, "w":1.25}, {"x":0, "y":4}, {"x":1, "y":4}, {"x":2, "y":4}, {"x":3, "y":4, "w":1.25}, {"x":4.25, "y":4, "w":1.25}, {"x":5.5, "y":4}, {"x":6.5, "y":4}, {"x":7.5, "y":4, "w":2}, {"x":9.5, "y":4, "w":2.25}, {"x":11.75, "y":4}, {"x":12.75, "y":4}, {"x":13.75, "y":4}, {"x":14.75, "y":4, "w":1.25}] + } + } +} diff --git a/keyboards/primekb/prime_l/keymaps/default/config.h b/keyboards/primekb/prime_l/keymaps/default/config.h new file mode 100644 index 000000000..95917a65c --- /dev/null +++ b/keyboards/primekb/prime_l/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 Jumail Mundekkat + * + * 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 . + */ + +#pragma once + +// place overrides here diff --git a/keyboards/primekb/prime_l/keymaps/default/keymap.c b/keyboards/primekb/prime_l/keymaps/default/keymap.c new file mode 100644 index 000000000..8a044b955 --- /dev/null +++ b/keyboards/primekb/prime_l/keymaps/default/keymap.c @@ -0,0 +1,74 @@ +/* Copyright 2018 Jumail Mundekkat + * + * 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 . + */ +#include QMK_KEYBOARD_H + +// Defines the keycodes used by our macros in process_record_user +enum custom_keycodes { + QMKBEST = SAFE_RANGE, + QMKURL +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + KC_ESC, KC_HOME, KC_END, KC_PSCR, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_PGUP, KC_BSPC, + KC_P7, KC_P8, KC_P9, KC_NLCK, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_PGDN, KC_BSLS, + KC_P4, KC_P5, KC_P6, KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT, KC_ENT, + KC_P1, KC_P2, KC_P3, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_ENT, KC_PDOT, KC_P0, KC_LCTL, KC_LALT, KC_LBRC, KC_RBRC, MO(1), KC_SPC, KC_MINS, KC_EQL, KC_RGUI, KC_RCTL + ), + + [1] = LAYOUT( + RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, + KC_GRV, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_SCLN, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + BL_TOGG, BL_STEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DEL, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS + ) +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QMKBEST: + if (record->event.pressed) { + // when keycode QMKBEST is pressed + SEND_STRING("QMK is the best thing ever!"); + } else { + // when keycode QMKBEST is released + } + break; + case QMKURL: + if (record->event.pressed) { + // when keycode QMKURL is pressed + SEND_STRING("https://qmk.fm/" SS_TAP(X_ENTER)); + } else { + // when keycode QMKURL is released + } + break; + } + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/primekb/prime_l/keymaps/default/readme.md b/keyboards/primekb/prime_l/keymaps/default/readme.md new file mode 100644 index 000000000..4e4db8879 --- /dev/null +++ b/keyboards/primekb/prime_l/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for prime_l \ No newline at end of file diff --git a/keyboards/primekb/prime_l/prime_l.c b/keyboards/primekb/prime_l/prime_l.c new file mode 100644 index 000000000..844407a10 --- /dev/null +++ b/keyboards/primekb/prime_l/prime_l.c @@ -0,0 +1,43 @@ +/* Copyright 2018 Jumail Mundekkat + * + * 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 . + */ +#include "prime_l.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + + led_set_user(usb_led); +} diff --git a/keyboards/primekb/prime_l/prime_l.h b/keyboards/primekb/prime_l/prime_l.h new file mode 100644 index 000000000..b50898b28 --- /dev/null +++ b/keyboards/primekb/prime_l/prime_l.h @@ -0,0 +1,35 @@ +/* Copyright 2018 Jumail Mundekkat + * + * 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 . + */ +#ifndef PRIME_L_H +#define PRIME_L_H + +#include "quantum.h" + +#define LAYOUT( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215 , \ + K300, K301, K302, K303, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ + K400, K401, K402, K403, K405, K406, K407, K408, K410, K412, K413, K414, K415 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO, K215 }, \ + { K300, K301, K302, K303, KC_NO, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ + { K400, K401, K402, K403, KC_NO, K405, K406, K407, K408, KC_NO, K410, KC_NO, K412, K413, K414, K415 } \ +} + +#endif diff --git a/keyboards/primekb/prime_l/readme.md b/keyboards/primekb/prime_l/readme.md new file mode 100644 index 000000000..3f760a4cc --- /dev/null +++ b/keyboards/primekb/prime_l/readme.md @@ -0,0 +1,15 @@ +# Prime_L + +![Prime_L](https://i.imgur.com/jUWhjOD.jpg) + +A compact layout with the footprint of your typical 65% board, featuring a left mini-numpad. Pre-drilled and counter sunk holes for use with optional feet for a slight tilt. Switches are oriented so that back light LEDs are on the top of the switch. + +Keyboard Maintainer: [MxBlue](https://github.com/MxBlu) +Hardware Supported: Prime_L PCBs, ATMega32u4 +Hardware Availability: [Store Link](https://www.primekb.com/collections/keyboards/products/bundle-save) + +Make example for this keyboard (after setting up your build environment): + + make primekb/prime_l:default + +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). diff --git a/keyboards/primekb/prime_l/rules.mk b/keyboards/primekb/prime_l/rules.mk new file mode 100644 index 000000000..5cce4e811 --- /dev/null +++ b/keyboards/primekb/prime_l/rules.mk @@ -0,0 +1,80 @@ +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = yes # USB Nkey Rollover +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) diff --git a/keyboards/primekb/prime_m/config.h b/keyboards/primekb/prime_m/config.h new file mode 100644 index 000000000..82a8037c9 --- /dev/null +++ b/keyboards/primekb/prime_m/config.h @@ -0,0 +1,57 @@ +/* +Copyright 2018 Jumail Mundekkat + +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 . +*/ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x4024 +#define DEVICE_VER 0x0001 +#define MANUFACTURER PrimeKB +#define PRODUCT Prime_M +#define DESCRIPTION 6x5 Macropad + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 6 + +/* Keyboard Matrix Assignments */ +#define MATRIX_ROW_PINS { C5, B5, B2, D5, D3 } +#define MATRIX_COL_PINS { B3, C7, C6, D2, D1, D0 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +#define BACKLIGHT_PIN B7 +#define BACKLIGHT_BREATHING +#define BACKLIGHT_LEVELS 4 + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* 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 + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) diff --git a/keyboards/primekb/prime_m/info.json b/keyboards/primekb/prime_m/info.json new file mode 100644 index 000000000..533252202 --- /dev/null +++ b/keyboards/primekb/prime_m/info.json @@ -0,0 +1,12 @@ +{ + "keyboard_name": "Prime_M", + "url": "https://www.primekb.com", + "maintainer": "MxBlu", + "width": 6, + "height": 5, + "layouts": { + "LAYOUT": { + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2}, {"x":5, "y":2}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":4, "y":3}, {"x":5, "y":3}, {"x":0, "y":4}, {"x":1, "y":4}, {"x":2, "y":4}, {"x":3, "y":4}, {"x":4, "y":4}, {"x":5, "y":4}] + } + } +} diff --git a/keyboards/primekb/prime_m/keymaps/default/config.h b/keyboards/primekb/prime_m/keymaps/default/config.h new file mode 100644 index 000000000..95917a65c --- /dev/null +++ b/keyboards/primekb/prime_m/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 Jumail Mundekkat + * + * 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 . + */ + +#pragma once + +// place overrides here diff --git a/keyboards/primekb/prime_m/keymaps/default/keymap.c b/keyboards/primekb/prime_m/keymaps/default/keymap.c new file mode 100644 index 000000000..d230439d0 --- /dev/null +++ b/keyboards/primekb/prime_m/keymaps/default/keymap.c @@ -0,0 +1,82 @@ +/* Copyright 2018 Jumail Mundekkat + * + * 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 . + */ +#include QMK_KEYBOARD_H + +// Defines the keycodes used by our macros in process_record_user +enum custom_keycodes { + QMKBEST = SAFE_RANGE, + QMKURL +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + KC_ESC, KC_LPRN, KC_RPRN, KC_PSLS, KC_PAST, LT(2, KC_BSPC), + KC_F1, KC_F2, KC_P7, KC_P8, KC_P9, KC_DEL, + KC_F3, KC_F4, KC_P4, KC_P5, KC_P6, KC_PMNS, + KC_F5, KC_F6, KC_P1, KC_P2, KC_P3, KC_PPLS, + KC_LCTL, KC_LALT, TO(1), KC_P0, KC_PDOT, KC_ENT + ), + + [1] = LAYOUT( + KC_ESC, KC_1, KC_2, KC_3, KC_4, LT(2, KC_F9), + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, + KC_LCTL, KC_LALT, TO(0), KC_P, KC_H, KC_SPC + ), + + [2] = LAYOUT( + BL_TOGG, BL_STEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLD + ) +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QMKBEST: + if (record->event.pressed) { + // when keycode QMKBEST is pressed + SEND_STRING("QMK is the best thing ever!"); + } else { + // when keycode QMKBEST is released + } + break; + case QMKURL: + if (record->event.pressed) { + // when keycode QMKURL is pressed + SEND_STRING("https://qmk.fm/" SS_TAP(X_ENTER)); + } else { + // when keycode QMKURL is released + } + break; + } + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/primekb/prime_m/keymaps/default/readme.md b/keyboards/primekb/prime_m/keymaps/default/readme.md new file mode 100644 index 000000000..5654918ab --- /dev/null +++ b/keyboards/primekb/prime_m/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for prime_m \ No newline at end of file diff --git a/keyboards/primekb/prime_m/prime_m.c b/keyboards/primekb/prime_m/prime_m.c new file mode 100644 index 000000000..a33db95d8 --- /dev/null +++ b/keyboards/primekb/prime_m/prime_m.c @@ -0,0 +1,43 @@ +/* Copyright 2018 Jumail Mundekkat + * + * 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 . + */ +#include "prime_m.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + + led_set_user(usb_led); +} diff --git a/keyboards/primekb/prime_m/prime_m.h b/keyboards/primekb/prime_m/prime_m.h new file mode 100644 index 000000000..0449a66d9 --- /dev/null +++ b/keyboards/primekb/prime_m/prime_m.h @@ -0,0 +1,35 @@ +/* Copyright 2018 Jumail Mundekkat + * + * 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 . + */ +#ifndef PRIME_M_H +#define PRIME_M_H + +#include "quantum.h" + +#define LAYOUT( \ + K00, K01, K02, K03, K04, K05, \ + K10, K11, K12, K13, K14, K15, \ + K20, K21, K22, K23, K24, K25, \ + K30, K31, K32, K33, K34, K35, \ + K40, K41, K42, K43, K44, K45 \ +) { \ + { K00, K01, K02, K03, K04, K05 }, \ + { K10, K11, K12, K13, K14, K15 }, \ + { K20, K21, K22, K23, K24, K25 }, \ + { K30, K31, K32, K33, K34, K35 }, \ + { K40, K41, K42, K43, K44, K45 } \ +} + +#endif diff --git a/keyboards/primekb/prime_m/readme.md b/keyboards/primekb/prime_m/readme.md new file mode 100644 index 000000000..668b29e4a --- /dev/null +++ b/keyboards/primekb/prime_m/readme.md @@ -0,0 +1,15 @@ +# Prime_M + +![Prime_M](https://i.imgur.com/Iqa6FJw.jpg) + +The Prime_M is a premium input device that is designed to be flexible so that it can cover many needs. The case is milled from a solid block of aluminum and features an integrated switch plate, which is 4.75mm thick yet designed to allow MX style switches to properly snap in. The bottom cover is machine from solid brass and is pre-drilled/countersunk for use with optional feet to give the device a slight tilt. + +Keyboard Maintainer: [MxBlue](https://github.com/MxBlu) +Hardware Supported: Prime_M PCB, ATMega32u2 +Hardware Availability: [GB Post](https://geekhack.org/index.php?topic=91821.0), [B-Stock Listing](https://www.primekb.com/products/prime_m) + +Make example for this keyboard (after setting up your build environment): + + make primekb/prime_m:default + +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). diff --git a/keyboards/primekb/prime_m/rules.mk b/keyboards/primekb/prime_m/rules.mk new file mode 100644 index 000000000..8d3b835f1 --- /dev/null +++ b/keyboards/primekb/prime_m/rules.mk @@ -0,0 +1,80 @@ +# MCU name +MCU = atmega32u2 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = yes # USB Nkey Rollover +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) diff --git a/keyboards/primekb/prime_o/config.h b/keyboards/primekb/prime_o/config.h new file mode 100644 index 000000000..9f634474c --- /dev/null +++ b/keyboards/primekb/prime_o/config.h @@ -0,0 +1,57 @@ +/* +Copyright 2018 Jumail Mundekkat + +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 . +*/ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x4024 +#define DEVICE_VER 0x0001 +#define MANUFACTURER PrimeKB +#define PRODUCT Prime_O +#define DESCRIPTION A Large Ortholinear + +/* key matrix size */ +#define MATRIX_ROWS 10 +#define MATRIX_COLS 8 + +/* Keyboard Matrix Assignments */ +#define MATRIX_ROW_PINS { D4, D6, B1, C5, B4, B3, C4, B2, B0, D5 } +#define MATRIX_COL_PINS { B6, B5, C7, C6, D2, D1, D0, C2 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +#define BACKLIGHT_PIN B7 +#define BACKLIGHT_BREATHING +#define BACKLIGHT_LEVELS 4 + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* 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 + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) diff --git a/keyboards/primekb/prime_o/info.json b/keyboards/primekb/prime_o/info.json new file mode 100644 index 000000000..83fc14360 --- /dev/null +++ b/keyboards/primekb/prime_o/info.json @@ -0,0 +1,12 @@ +{ + "keyboard_name": "Prime_O", + "url": "https://www.primekb.com", + "maintainer": "MxBlu", + "width": 16, + "height": 5, + "layouts": { + "LAYOUT": { + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":15, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":6, "y":1}, {"x":7, "y":1}, {"x":8, "y":1}, {"x":9, "y":1}, {"x":10, "y":1}, {"x":11, "y":1}, {"x":12, "y":1}, {"x":13, "y":1}, {"x":14, "y":1}, {"x":15, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2}, {"x":5, "y":2}, {"x":6, "y":2}, {"x":7, "y":2}, {"x":8, "y":2}, {"x":9, "y":2}, {"x":10, "y":2}, {"x":11, "y":2}, {"x":12, "y":2}, {"x":13, "y":2}, {"x":14, "y":2}, {"x":15, "y":2}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":4, "y":3}, {"x":5, "y":3}, {"x":6, "y":3}, {"x":7, "y":3}, {"x":8, "y":3}, {"x":9, "y":3}, {"x":10, "y":3}, {"x":11, "y":3}, {"x":12, "y":3}, {"x":13, "y":3}, {"x":14, "y":3}, {"x":15, "y":3}, {"x":0, "y":4}, {"x":1, "y":4}, {"x":2, "y":4}, {"x":3, "y":4}, {"x":4, "y":4}, {"x":5, "y":4}, {"x":6, "y":4}, {"x":7, "y":4}, {"x":8, "y":4}, {"x":9, "y":4}, {"x":10, "y":4}, {"x":11, "y":4}, {"x":12, "y":4}, {"x":13, "y":4}, {"x":14, "y":4}, {"x":15, "y":4}] + } + } +} diff --git a/keyboards/primekb/prime_o/keymaps/default/config.h b/keyboards/primekb/prime_o/keymaps/default/config.h new file mode 100644 index 000000000..95917a65c --- /dev/null +++ b/keyboards/primekb/prime_o/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 Jumail Mundekkat + * + * 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 . + */ + +#pragma once + +// place overrides here diff --git a/keyboards/primekb/prime_o/keymaps/default/keymap.c b/keyboards/primekb/prime_o/keymaps/default/keymap.c new file mode 100644 index 000000000..f48e9e51a --- /dev/null +++ b/keyboards/primekb/prime_o/keymaps/default/keymap.c @@ -0,0 +1,85 @@ +/* Copyright 2018 Jumail Mundekkat + * + * 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 . + */ +#include QMK_KEYBOARD_H + +// Defines the keycodes used by our macros in process_record_user +enum custom_keycodes { + QMKBEST = SAFE_RANGE, + QMKURL +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + KC_ENT, KC_P0, KC_LCTL, KC_LBRC, LT(1, KC_BSPC), KC_SPC, KC_MINS, KC_RGUI, + KC_ENT, KC_P2, KC_LSFT, KC_X, KC_V, KC_N, KC_COMM, KC_SLSH, + KC_PPLS, KC_P5, KC_TAB, KC_S, KC_F, KC_H, KC_K, KC_QUOT, + KC_PPLS, KC_P8, KC_PSCR, KC_W, KC_R, KC_Y, KC_I, KC_P, + KC_ESC, KC_PSLS, KC_NLCK, KC_2, KC_4, KC_6, KC_8, KC_0, + KC_PMNS, KC_PAST, KC_1, KC_3, KC_5, KC_7, KC_9, KC_DEL, + KC_P7, KC_P9, KC_Q, KC_E, KC_T, KC_U, KC_O, KC_BSLS, + KC_P4, KC_P6, KC_A, KC_D, KC_G, KC_J, KC_L, KC_ENT, + KC_P1, KC_P3, KC_Z, KC_C, KC_B, KC_M, KC_DOT, KC_LSFT, + KC_PDOT, KC_P0, KC_LALT, KC_RBRC, LT(1, KC_BSPC), KC_SPC, KC_EQL, KC_RCTL + ), + + [1] = LAYOUT( + BL_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DEL, KC_VOLD, KC_MUTE, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DOWN, KC_SCLN, + KC_TRNS, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, + KC_GRV, KC_F2, KC_F4, KC_F2, KC_F4, KC_F6, KC_F8, KC_F10, + KC_F1, KC_F3, KC_F1, KC_F3, KC_F5, KC_F7, KC_F9, KC_DEL, + KC_F11, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_RGHT, KC_VOLU, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, + BL_STEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DEL, KC_VOLU, KC_MUTE + ), + +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QMKBEST: + if (record->event.pressed) { + // when keycode QMKBEST is pressed + SEND_STRING("QMK is the best thing ever!"); + } else { + // when keycode QMKBEST is released + } + break; + case QMKURL: + if (record->event.pressed) { + // when keycode QMKURL is pressed + SEND_STRING("https://qmk.fm/" SS_TAP(X_ENTER)); + } else { + // when keycode QMKURL is released + } + break; + } + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/primekb/prime_o/keymaps/default/readme.md b/keyboards/primekb/prime_o/keymaps/default/readme.md new file mode 100644 index 000000000..e6e7a1dc9 --- /dev/null +++ b/keyboards/primekb/prime_o/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for prime_o \ No newline at end of file diff --git a/keyboards/primekb/prime_o/prime_o.c b/keyboards/primekb/prime_o/prime_o.c new file mode 100644 index 000000000..d603cc6c9 --- /dev/null +++ b/keyboards/primekb/prime_o/prime_o.c @@ -0,0 +1,43 @@ +/* Copyright 2018 REPLACE_WITH_YOUR_NAME + * + * 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 . + */ +#include "prime_o.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + + led_set_user(usb_led); +} diff --git a/keyboards/primekb/prime_o/prime_o.h b/keyboards/primekb/prime_o/prime_o.h new file mode 100644 index 000000000..1ec7277b0 --- /dev/null +++ b/keyboards/primekb/prime_o/prime_o.h @@ -0,0 +1,40 @@ +/* Copyright 2018 Jumail Mundekkat + * + * 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 . + */ +#ifndef PRIME_O_H +#define PRIME_O_H + +#include "quantum.h" + +#define LAYOUT( \ + K000, K001, K002, K003, K004, K005, K006, K007, K010, K011, K012, K013, K014, K015, K016, K017, \ + K020, K021, K022, K023, K024, K025, K026, K027, K030, K031, K032, K033, K034, K035, K036, K037, \ + K040, K041, K042, K043, K044, K045, K046, K047, K050, K051, K052, K053, K054, K055, K056, K057, \ + K060, K061, K062, K063, K064, K065, K066, K067, K070, K071, K072, K073, K074, K075, K076, K077, \ + K080, K081, K082, K083, K084, K085, K086, K087, K090, K091, K092, K093, K094, K095, K096, K097 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007 }, \ + { K010, K011, K012, K013, K014, K015, K016, K017 }, \ + { K020, K021, K022, K023, K024, K025, K026, K027 }, \ + { K030, K031, K032, K033, K034, K035, K036, K037 }, \ + { K040, K041, K042, K043, K044, K045, K046, K047 }, \ + { K050, K051, K052, K053, K054, K055, K056, K057 }, \ + { K060, K061, K062, K063, K064, K065, K066, K067 }, \ + { K070, K071, K072, K073, K074, K075, K076, K077 }, \ + { K080, K081, K082, K083, K084, K085, K086, K087 }, \ + { K090, K091, K092, K093, K094, K095, K096, K097 } \ +} + +#endif diff --git a/keyboards/primekb/prime_o/readme.md b/keyboards/primekb/prime_o/readme.md new file mode 100644 index 000000000..fe91a86b9 --- /dev/null +++ b/keyboards/primekb/prime_o/readme.md @@ -0,0 +1,15 @@ +# Prime_O + +![Prime_O](https://i.imgur.com/ujbBdja.jpg) + +A 16x5 ortholinear keyboard that has many layout options, including: full grid, left- or right-side full sized numpads, and Many spacebar locations. Standard in-switch backlighting. See primekb.com for full details of possible layouts. + +Keyboard Maintainer: [MxBlue](https://github.com/MxBlu) +Hardware Supported: Prime_O PCB, ATMega32u2 +Hardware Availability: GB + +Make example for this keyboard (after setting up your build environment): + + make primekb/prime_o:default + +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). diff --git a/keyboards/primekb/prime_o/rules.mk b/keyboards/primekb/prime_o/rules.mk new file mode 100644 index 000000000..8d3b835f1 --- /dev/null +++ b/keyboards/primekb/prime_o/rules.mk @@ -0,0 +1,80 @@ +# MCU name +MCU = atmega32u2 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = yes # USB Nkey Rollover +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) diff --git a/keyboards/prime_r/config.h b/keyboards/primekb/prime_r/config.h similarity index 100% rename from keyboards/prime_r/config.h rename to keyboards/primekb/prime_r/config.h diff --git a/keyboards/prime_r/info.json b/keyboards/primekb/prime_r/info.json similarity index 100% rename from keyboards/prime_r/info.json rename to keyboards/primekb/prime_r/info.json diff --git a/keyboards/prime_r/keymaps/default/config.h b/keyboards/primekb/prime_r/keymaps/default/config.h similarity index 100% rename from keyboards/prime_r/keymaps/default/config.h rename to keyboards/primekb/prime_r/keymaps/default/config.h diff --git a/keyboards/prime_r/keymaps/default/keymap.c b/keyboards/primekb/prime_r/keymaps/default/keymap.c similarity index 100% rename from keyboards/prime_r/keymaps/default/keymap.c rename to keyboards/primekb/prime_r/keymaps/default/keymap.c diff --git a/keyboards/prime_r/keymaps/default/readme.md b/keyboards/primekb/prime_r/keymaps/default/readme.md similarity index 100% rename from keyboards/prime_r/keymaps/default/readme.md rename to keyboards/primekb/prime_r/keymaps/default/readme.md diff --git a/keyboards/prime_r/keymaps/rooski/config.h b/keyboards/primekb/prime_r/keymaps/rooski/config.h similarity index 100% rename from keyboards/prime_r/keymaps/rooski/config.h rename to keyboards/primekb/prime_r/keymaps/rooski/config.h diff --git a/keyboards/prime_r/keymaps/rooski/keymap.c b/keyboards/primekb/prime_r/keymaps/rooski/keymap.c similarity index 100% rename from keyboards/prime_r/keymaps/rooski/keymap.c rename to keyboards/primekb/prime_r/keymaps/rooski/keymap.c diff --git a/keyboards/prime_r/keymaps/rooski/readme.md b/keyboards/primekb/prime_r/keymaps/rooski/readme.md similarity index 100% rename from keyboards/prime_r/keymaps/rooski/readme.md rename to keyboards/primekb/prime_r/keymaps/rooski/readme.md diff --git a/keyboards/prime_r/keymaps/rooski/rules.mk b/keyboards/primekb/prime_r/keymaps/rooski/rules.mk similarity index 100% rename from keyboards/prime_r/keymaps/rooski/rules.mk rename to keyboards/primekb/prime_r/keymaps/rooski/rules.mk diff --git a/keyboards/prime_r/prime_r.c b/keyboards/primekb/prime_r/prime_r.c similarity index 100% rename from keyboards/prime_r/prime_r.c rename to keyboards/primekb/prime_r/prime_r.c diff --git a/keyboards/prime_r/prime_r.h b/keyboards/primekb/prime_r/prime_r.h similarity index 100% rename from keyboards/prime_r/prime_r.h rename to keyboards/primekb/prime_r/prime_r.h diff --git a/keyboards/prime_r/readme.md b/keyboards/primekb/prime_r/readme.md similarity index 63% rename from keyboards/prime_r/readme.md rename to keyboards/primekb/prime_r/readme.md index 7a77b2073..dfce62e1a 100644 --- a/keyboards/prime_r/readme.md +++ b/keyboards/primekb/prime_r/readme.md @@ -12,7 +12,6 @@ Hardware Availability: [Prime_KB](https://www.primekb.com/) Make example for this keyboard (after setting up your build environment): - make prime_r:default - -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. + make primekb/prime_r:default +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). diff --git a/keyboards/prime_r/rules.mk b/keyboards/primekb/prime_r/rules.mk similarity index 100% rename from keyboards/prime_r/rules.mk rename to keyboards/primekb/prime_r/rules.mk From 747cf78b5da17969fe057d77512e276fa6c59fd9 Mon Sep 17 00:00:00 2001 From: Danny Date: Thu, 20 Sep 2018 18:37:18 -0400 Subject: [PATCH 122/788] Add nano keymap for modding Spooka light (#3953) --- keyboards/nano/config.h | 5 +---- keyboards/nano/keymaps/default/rules.mk | 3 --- keyboards/nano/keymaps/spooka/config.h | 25 +++++++++++++++++++++++++ keyboards/nano/keymaps/spooka/keymap.c | 12 ++++++++++++ keyboards/nano/keymaps/spooka/rules.mk | 1 + 5 files changed, 39 insertions(+), 7 deletions(-) create mode 100644 keyboards/nano/keymaps/spooka/config.h create mode 100644 keyboards/nano/keymaps/spooka/keymap.c create mode 100644 keyboards/nano/keymaps/spooka/rules.mk diff --git a/keyboards/nano/config.h b/keyboards/nano/config.h index 5c4f920df..088fafcaa 100644 --- a/keyboards/nano/config.h +++ b/keyboards/nano/config.h @@ -33,12 +33,9 @@ along with this program. If not, see . #define MATRIX_COLS 4 /* ws2812 RGB LED */ -#define RGB_DI_PIN B1 -#define RGBLIGHT_TIMER +#define RGB_DI_PIN D3 #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 6 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD /* COL2ROW or ROW2COL */ #define DIODE_DIRECTION COL2ROW diff --git a/keyboards/nano/keymaps/default/rules.mk b/keyboards/nano/keymaps/default/rules.mk index 457a3d01d..e69de29bb 100644 --- a/keyboards/nano/keymaps/default/rules.mk +++ b/keyboards/nano/keymaps/default/rules.mk @@ -1,3 +0,0 @@ -ifndef QUANTUM_DIR - include ../../../../Makefile -endif diff --git a/keyboards/nano/keymaps/spooka/config.h b/keyboards/nano/keymaps/spooka/config.h new file mode 100644 index 000000000..05900a215 --- /dev/null +++ b/keyboards/nano/keymaps/spooka/config.h @@ -0,0 +1,25 @@ +/* +Copyright 2018 Danny Nguyen + +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 . +*/ + +#pragma once + +#undef RGBLED_NUM +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 12 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 diff --git a/keyboards/nano/keymaps/spooka/keymap.c b/keyboards/nano/keymaps/spooka/keymap.c new file mode 100644 index 000000000..63b90da09 --- /dev/null +++ b/keyboards/nano/keymaps/spooka/keymap.c @@ -0,0 +1,12 @@ +#include QMK_KEYBOARD_H + +#define _MAIN 0 + +#define _______ KC_TRNS + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_MAIN] = LAYOUT( + RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, + RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD + ) +}; diff --git a/keyboards/nano/keymaps/spooka/rules.mk b/keyboards/nano/keymaps/spooka/rules.mk new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/keyboards/nano/keymaps/spooka/rules.mk @@ -0,0 +1 @@ + From 35e76539e7257a1932ec76882892b999e21c9d4f Mon Sep 17 00:00:00 2001 From: Alexander Kagno Date: Sat, 22 Sep 2018 09:43:28 -0600 Subject: [PATCH 123/788] Keymap: Arkag Userspace and MechMini2 Layout (#3958) * deleting arkag branch, forcibly moving changes over to master * fade_color function added, not tested * added half functions some stuff * surround_type function implemented and working. * added flashing function and removed fading, flashing supports infinite flashing along with controlled number flashes * added a fade state machine and functionality * build optimizations, changed fade to bounce between bounds rather than roll over, added a HALMAK layout * changes to sleep breath function, changed how I will switch to HALMAK * support for halmak added * support for activity detection added, condensed fading and flashing state machines, removed support for HALMAK and COLEMAK because arkag is stupid * changed sleep and inactive behaviors, now the color shifting reverses on state change, yay! save_color and reset_color are made to enable layer color changing to look cooler. * reformatted some if statements in state detection * changes to force fade to pause on boot, or plug in. * Attempting to move over to userspace, pushing to repository for help * userspace stuff.... * userspace stuff.... * layout changes, working userspace, Removed left side shift and replaced it with a MT() for LSFT and SPC. Userspace seems to be working properly now! HURRAY * Layout change Removed space/shift and reset modifiers to what they were originally. Added homerow modifiers. * Removed excessive tabs in files * Moved mods on homerow around... * changes recommended by @drashna --- keyboards/mechmini/v2/keymaps/arkag/config.h | 7 + keyboards/mechmini/v2/keymaps/arkag/keymap.c | 40 ++ keyboards/mechmini/v2/keymaps/arkag/rules.mk | 16 + users/arkag/arkag.c | 573 +++++++++++++++++++ users/arkag/arkag.h | 161 ++++++ users/arkag/config.h | 5 + users/arkag/readme.md | 14 + users/arkag/rules.mk | 1 + 8 files changed, 817 insertions(+) create mode 100644 keyboards/mechmini/v2/keymaps/arkag/config.h create mode 100644 keyboards/mechmini/v2/keymaps/arkag/keymap.c create mode 100644 keyboards/mechmini/v2/keymaps/arkag/rules.mk create mode 100644 users/arkag/arkag.c create mode 100644 users/arkag/arkag.h create mode 100644 users/arkag/config.h create mode 100644 users/arkag/readme.md create mode 100644 users/arkag/rules.mk diff --git a/keyboards/mechmini/v2/keymaps/arkag/config.h b/keyboards/mechmini/v2/keymaps/arkag/config.h new file mode 100644 index 000000000..f5f3a90fa --- /dev/null +++ b/keyboards/mechmini/v2/keymaps/arkag/config.h @@ -0,0 +1,7 @@ +#pragma once + +// save me space! +#define NO_ACTION_MACRO +#define NO_ACTION_FUNCTION +#define DISABLE_LEADER +#define NO_MUSIC_MODE diff --git a/keyboards/mechmini/v2/keymaps/arkag/keymap.c b/keyboards/mechmini/v2/keymaps/arkag/keymap.c new file mode 100644 index 000000000..10502a5b6 --- /dev/null +++ b/keyboards/mechmini/v2/keymaps/arkag/keymap.c @@ -0,0 +1,40 @@ +#include QMK_KEYBOARD_H +#include "arkag.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_QWERTY] = LAYOUT_2u_space_ortho( + KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_TAB, TAP_A, TAP_S, TAP_D, TAP_F, KC_G, KC_H, TAP_J, TAP_K, TAP_L, TAP_SCN, QUOTE, + XXXXXXX, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_UP, KC_ENT, + M_PMOD, LRALT, M_SMOD, LOWER, RAISE, KC_SPC, KC_SLSH, LAZY, KC_LEFT, KC_DOWN, KC_RGHT), + + [_RAISE] = LAYOUT_2u_space_ortho( + GRAVE, KC_1, KC_2, THREE, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, + _______, OBRACK, CBRACK, TAP_EQ, HYPHEN, _______, _______, KC_4, TAP_5, KC_6, _______, KC_NLCK, + _______, _______, _______, CEDILLA, _______, KC_COMM, KC_PDOT, KC_1, KC_2, KC_3, KC_PPLS, KC_PENT, + _______, _______, _______, KEEB, _______, _______, _______, M_OS, KC_PSLS, KC_PMNS, KC_PAST), + + [_LOWER] = LAYOUT_2u_space_ortho( + _______, _______, _______, _______, _______, _______, _______, M_ULIN, M_ITAL, _______, M_P_B, M_C_A_D, + _______, _______, STRIKE, _______, _______, _______, _______, _______, _______, _______, _______, _______, + KC_CAPS, KC_DEL, _______, _______, _______, M_BOLD, _______, _______, _______, _______, KC_PGUP, _______, + _______, _______, _______, _______, _______, MEDIA, KC_BSLS, M_CALC, KC_HOME, KC_PGDN, KC_END), + + [_KEEB] = LAYOUT_2u_space_ortho( + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, + _______, BL_TOGG, BL_STEP, BL_INC, BL_DEC, BL_BRTG, _______, _______, _______, _______, _______, _______, + RGB_M_P, RGB_TOG, RGB_MOD, RGB_VAI, RGB_VAD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, _______, _______, _______, + RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + + [_MEDIA] = LAYOUT_2u_space_ortho( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_VOLU, KC_MUTE, + _______, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT), + + [_LAZY] = LAYOUT_2u_space_ortho( + _______, _______, _______, _______, _______, M_TM, _______, M_SNIPT, M_SHRUG, _______, _______, _______, + _______, _______, _______, _______, _______, M_GGT, _______, M_UF, M_LOD, M_REPO, _______, _______, + _______, _______, _______, _______, _______, _______, _______, M_TF, M_LENNY, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), +}; diff --git a/keyboards/mechmini/v2/keymaps/arkag/rules.mk b/keyboards/mechmini/v2/keymaps/arkag/rules.mk new file mode 100644 index 000000000..d6c210e9e --- /dev/null +++ b/keyboards/mechmini/v2/keymaps/arkag/rules.mk @@ -0,0 +1,16 @@ +BOOTMAGIC_ENABLE = no +MOUSEKEY_ENABLE = no +STENO_ENABLE = no +EXTRAKEY_ENABLE = yes +CONSOLE_ENABLE = no +COMMAND_ENABLE = no +SLEEP_LED_ENABLE = no +NKRO_ENABLE = yes +BACKLIGHT_ENABLE = yes +AUDIO_ENABLE = no +RGBLIGHT_ENABLE = yes +TAP_DANCE_ENABLE = yes +UNICODE_ENABLE = yes + +# save me space! +EXTRAFLAGS += -flto diff --git a/users/arkag/arkag.c b/users/arkag/arkag.c new file mode 100644 index 000000000..c716b5e93 --- /dev/null +++ b/users/arkag/arkag.c @@ -0,0 +1,573 @@ +#include "arkag.h" + +// Start: Written by konstantin: vomindoraan +#include +#include +#include + +void send_unicode_hex_string(const char *str) { + if (!str) { return; } // Saftey net + while (*str) { + // Find the next code point (token) in the string + for (; *str == ' '; str++); + size_t n = strcspn(str, " "); // Length of the current token + char code_point[n+1]; + strncpy(code_point, str, n); + code_point[n] = '\0'; // Make sure it's null-terminated + + // Normalize the code point: make all hex digits lowercase + for (char *p = code_point; *p; p++) { + *p = tolower(*p); + } + + // Send the code point as a Unicode input string + unicode_input_start(); + send_string(code_point); + unicode_input_finish(); + str += n; // Move to the first ' ' (or '\0') after the current token + } +} +// End: Written by konstantin: vomindoraan + +uint8_t current_os, mod_primary_mask, fade_delay; +uint16_t flash_timer_one, flash_timer_two, + fade_timer_one, fade_timer_two, + active_timer_one, active_timer_two, + elapsed = 0, + num_extra_flashes_off = 0; +Color underglow, + flash_color, + saved_color, + hsv_none = {0,0,0}, + hsv_white = {0,0,127}; +flashState flash_state = no_flash; +fadeState fade_state = add_fade; +activityState state = boot; + +void set_color (Color new, bool update) { + rgblight_sethsv_eeprom_helper(new.h, new.s, new.v, update); +} + +void save_color(Color to_save) { + saved_color = to_save; +} + +void reset_color(void) { + underglow = saved_color; +} + +Color mod_color(Color current_color, bool should_add, uint8_t change_amount) { + save_color(underglow); + int addlim = 359 - change_amount; + int sublim = change_amount; + int leftovers; + if (should_add) { + if (current_color.h <= addlim) { + current_color.h += change_amount; + } else { + leftovers = (359 + change_amount) % 359; + current_color.h = 0 + leftovers; + } + } else { + if (current_color.h >= sublim) { + current_color.h -= change_amount; + } else { + leftovers = change_amount - current_color.h; + current_color.h = 359 - leftovers; + } + } + return current_color; +} + +void reverse_fade (void) { + if (fade_state == add_fade){ + fade_state = sub_fade; + } else { + fade_state = add_fade; + } +} + +void check_state (void) { + static bool activated, deactivated, slept; + switch (state) { + case active: + if (!activated) { + fade_delay = LED_FADE_DELAY; + reverse_fade(); + activated = true; + deactivated = false; + } + active_timer_two = timer_read(); + elapsed = active_timer_two - active_timer_one; + if (elapsed < INACTIVE_DELAY) {return;} + state = inactive; + return; + + case inactive: + if (!deactivated) { + fade_delay = LED_FADE_DELAY * 2; + reverse_fade(); + deactivated = true; + slept = false; + activated = false; + } + active_timer_two = timer_read(); + elapsed = active_timer_two - active_timer_one; + if (elapsed < SLEEP_DELAY) {return;} + state = sleeping; + return; + + case sleeping: + if (!slept) { + fade_delay = LED_FADE_DELAY * 6; + reverse_fade(); + slept = true; + deactivated = false; + activated = false; + } + return; + + case boot: + return; + } +} + +void fade_rgb (void) { + static bool ran_once; + if (flash_state != no_flash) {return;} + if (state == boot) {return;} + switch (fade_state) { + case add_fade: + if (!ran_once) { + fade_timer_one = timer_read(); + ran_once = true; + } + fade_timer_two = timer_read(); + elapsed = fade_timer_two - fade_timer_one; + if (elapsed < fade_delay) {return;} + if (underglow.h == 359) { + fade_state = sub_fade; + return; + } + underglow.h = underglow.h + 1; + set_color(underglow, false); + // set_color_at(underglow, 0); + fade_timer_one = fade_timer_two; + return; + + case sub_fade: + fade_timer_two = timer_read(); + elapsed = fade_timer_two - fade_timer_one; + if (elapsed < fade_delay) {return;} + if (underglow.h == 0) { + fade_state = add_fade; + return; + } + underglow.h = underglow.h - 1; + set_color(underglow, false); + // set_color_at(underglow, 0); + fade_timer_one = fade_timer_two; + return; + } +} + +void flash_rgb (void) { + static bool ran_once; + switch(flash_state) { + case no_flash: + return; + + case flash_off: + if (!ran_once) { + set_color(hsv_none, false); + flash_timer_one = timer_read(); + ran_once = true; + flash_state = flash_on; + return; + } + flash_timer_two = timer_read(); + elapsed = flash_timer_two - flash_timer_one; + if (elapsed >= LED_FLASH_DELAY) { + set_color(hsv_none, false); + flash_timer_one = timer_read(); + flash_state = flash_on; + } + return; + + case flash_on: + flash_timer_two = timer_read(); + elapsed = flash_timer_two - flash_timer_one; + if (elapsed >= LED_FLASH_DELAY) { + set_color(flash_color, false); + flash_timer_one = timer_read(); + if (num_extra_flashes_off > 0) { + flash_state = flash_off; + num_extra_flashes_off--; + } else { + set_color(underglow, false); + flash_state = no_flash; + ran_once = false; + } + } + return; + } +} + +void set_os (uint8_t os, bool update) { + current_os = os; + if (update) { + eeprom_update_byte(EECONFIG_USERSPACE, current_os); + } + switch (os) { + case OS_MAC: + set_unicode_input_mode(UC_OSX); + underglow = (Color){ 300, 255, 255 }; + mod_primary_mask = MOD_GUI_MASK; + break; + case OS_WIN: + set_unicode_input_mode(UC_WINC); + underglow = (Color){ 180, 255, 255 }; + mod_primary_mask = MOD_CTL_MASK; + break; + case OS_NIX: + set_unicode_input_mode(UC_LNX); + underglow = (Color){ 60, 255, 255 }; + mod_primary_mask = MOD_CTL_MASK; + break; + default: + underglow = (Color){ 0, 0, 255 }; + mod_primary_mask = MOD_CTL_MASK; + } + set_color(underglow, update); + flash_color = underglow; + flash_state = flash_off; + num_extra_flashes_off = 1; +} + +void tap_key(uint8_t keycode) { + register_code(keycode); + unregister_code(keycode); +} + +// register GUI if Mac or Ctrl if other +void pri_mod(bool press) { + if (press) { + if (current_os == OS_MAC) { + register_code(KC_LGUI); + } else { + register_code(KC_LCTL); + } + } else { + if (current_os == OS_MAC) { + unregister_code(KC_LGUI); + } else { + unregister_code(KC_LCTL); + } + } +} + +// register Ctrl if Mac or GUI if other +void sec_mod(bool press) { + if (press) { + if (current_os == OS_MAC) { + register_code(KC_LCTL); + } else { + register_code(KC_LGUI); + } + } else { + if (current_os == OS_MAC) { + unregister_code(KC_LCTL); + } else { + unregister_code(KC_LGUI); + } + } +} + +void surround_type(uint8_t num_of_chars, uint16_t keycode, bool use_shift) { + if (use_shift) { + register_code(KC_LSFT); + } + for (int i = 0; i < num_of_chars; i++) { + tap_key(keycode); + } + if (use_shift) { + unregister_code(KC_LSFT); + } + for (int i = 0; i < (num_of_chars/2); i++) { + tap_key(KC_LEFT); + } +} + +void long_keystroke(size_t num_of_keys, uint16_t keys[]) { + for (int i = 0; i < num_of_keys-1; i++) { + register_code(keys[i]); + } + tap_key(keys[num_of_keys-1]); + for (int i = 0; i < num_of_keys-1; i++) { + unregister_code(keys[i]); + } +} + +void dance_grv (qk_tap_dance_state_t *state, void *user_data) { + if (state->count == 1) { + tap_key(KC_GRV); + } else if (state->count == 2) { + surround_type(2, KC_GRAVE, false); + } else { + surround_type(6, KC_GRAVE, false); + } +} + +void dance_quot (qk_tap_dance_state_t *state, void *user_data) { + if (state->count == 1) { + tap_key(KC_QUOT); + } else if (state->count == 2) { + surround_type(2, KC_QUOTE, false); + } else if (state->count == 3) { + surround_type(2, KC_QUOTE, true); + } +} + +void dance_strk (qk_tap_dance_state_t *state, void *user_data) { + if (state->count == 1) { + surround_type(4, KC_TILDE, true); + } else if (state->count == 2) { + if (current_os == OS_MAC) { + long_keystroke(3, (uint16_t[]){KC_LGUI, KC_LSFT, KC_4}); + } else if (current_os == OS_WIN) { + long_keystroke(3, (uint16_t[]){KC_LGUI, KC_LSFT, KC_S}); + } else { + return; + } + } +} + +void dance_3 (qk_tap_dance_state_t *state, void *user_data) { + if (state->count == 1) { + tap_key(KC_3); + } else if (state->count == 2) { + send_unicode_hex_string("00E8"); + } else if (state->count == 3) { + send_unicode_hex_string("00E9"); + } +} + +void dance_c (qk_tap_dance_state_t *state, void *user_data) { + if (state->count == 1) { + tap_key(KC_C); + } else if (state->count == 2) { + send_unicode_hex_string("00E7"); + } +} + +void matrix_init_user(void) { + current_os = eeprom_read_byte(EECONFIG_USERSPACE); + set_os(current_os, false); +} + +void matrix_scan_user(void) { + check_state(); + flash_rgb(); + fade_rgb(); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case M_PMOD: + if (record->event.pressed) { + pri_mod(true); + } else { + pri_mod(false); + } + return false; + + case M_SMOD: + if (record->event.pressed) { + sec_mod(true); + } else { + sec_mod(false); + } + return false; + + case M_P_B: + if (record->event.pressed) { + if (current_os == OS_WIN) { + SEND_STRING(SS_DOWN(X_LGUI) SS_TAP(X_PAUSE) SS_UP(X_LGUI)); + } else { + } + } + return false; + + case M_C_A_D: + if (record->event.pressed) { + if (current_os == OS_WIN) { + SEND_STRING(SS_DOWN(X_LCTRL) SS_DOWN(X_LALT) SS_TAP(X_DELETE) SS_UP(X_LALT) SS_UP(X_LCTRL)); + } else { + } + } + return false; + + case M_CALC: + if (record->event.pressed) { + if (current_os == OS_WIN) { + SEND_STRING(SS_TAP(X_CALCULATOR)); + } else if (current_os == OS_MAC) { + SEND_STRING(SS_DOWN(X_LGUI) SS_TAP(X_SPACE) SS_UP(X_LGUI) "calculator" SS_TAP(X_ENTER)); + } + } + return false; + + case M_OS: + if (record->event.pressed) { + set_os((current_os+1) % _OS_COUNT, true); + } + return false; + + case M_LOD: + if (record->event.pressed) { + send_unicode_hex_string("0CA0 005F 005F 0CA0"); + } + return false; + + case M_LENNY: + if (record->event.pressed) { + send_unicode_hex_string("0028 0020 0361 00B0 0020 035C 0296 0020 0361 00B0 0029"); + } + return false; + + + case M_TF: + if (record->event.pressed) { + send_unicode_hex_string("0028 256F 2035 0414 2032 0029 256F 5F61 253B 2501 253B"); + } + return false; + + case M_UF: + if (record->event.pressed) { + send_unicode_hex_string("252C 2500 252C 30CE 0028 0020 00BA 0020 005F 0020 00BA 0020 30CE 0029"); + } + return false; + + case M_SHRUG: + if (record->event.pressed) { + send_unicode_hex_string("00AF 005C 005F 0028 30C4 0029 005F 002F 00AF"); + } + return false; + + case M_TM: + if (record->event.pressed) { + send_unicode_hex_string("2122"); + } + return false; + + case M_REPO: + if (record->event.pressed) { + SEND_STRING("https://github.com/arkag/qmk_firmware/tree/master/keyboards/mechmini/v2/keymaps/arkag"); + } + return false; + + case M_GGT: + if (record->event.pressed) { + SEND_STRING("@GrahamGoldenTech.com"); + } + return false; + + case M_SNIPT: + if (record->event.pressed) { + surround_type(6, KC_GRAVE, false); + pri_mod(true); + tap_key(KC_V); + pri_mod(false); + tap_key(KC_RGHT); + tap_key(KC_RGHT); + tap_key(KC_RGHT); + tap_key(KC_ENTER); + } + return false; + + case M_BOLD: + if (record->event.pressed) { + surround_type(4, KC_8, true); + } + return false; + + case M_ITAL: + if (record->event.pressed) { + surround_type(2, KC_8, true); + } + return false; + + case M_ULIN: + if (record->event.pressed) { + surround_type(4, KC_MINS, true); + } + return false; + + case KC_LSFT: + if (record->event.pressed) { + set_color(mod_color(underglow, true, 50), false); + SEND_STRING(SS_DOWN(X_LSHIFT)); + } else { + set_color(underglow, false); + SEND_STRING(SS_UP(X_LSHIFT)); + } + return false; + + case MEDIA: + case LAZY: + case KEEB: + case RAISE: + case LOWER: + return true; + + default: + if (record->event.pressed) { + active_timer_one = timer_read(); + state = active; + } + return true; + } +} + +uint32_t layer_state_set_user(uint32_t state) { + switch (biton32(state)) { + case _LAZY: + save_color(underglow); + underglow = mod_color(underglow, true, 50); + break; + case _MEDIA: + save_color(underglow); + underglow = mod_color(underglow, true, 150); + break; + case _KEEB: + save_color(underglow); + underglow = mod_color(underglow, false, 150); + break; + case _LOWER: + save_color(underglow); + underglow = mod_color(underglow, false, 100); + break; + case _RAISE: + save_color(underglow); + underglow = mod_color(underglow, true, 100); + break; + default: + reset_color(); + break; + } + set_color(underglow, false); + return state; +} + +//Tap Dance Definitions +qk_tap_dance_action_t tap_dance_actions[] = { + [TD_3_GRV_ACT] = ACTION_TAP_DANCE_FN (dance_3), + [TD_C_CED] = ACTION_TAP_DANCE_FN (dance_c), + [TD_GRV_3GRV] = ACTION_TAP_DANCE_FN (dance_grv), + [TD_SING_DOUB] = ACTION_TAP_DANCE_FN (dance_quot), + [TD_STRK_SHOT] = ACTION_TAP_DANCE_FN (dance_strk), + [TD_HYPH_UNDR] = ACTION_TAP_DANCE_DOUBLE (KC_MINS, LSFT(KC_MINS)), + [TD_BRCK_PARN_O] = ACTION_TAP_DANCE_DOUBLE (KC_LBRC, LSFT(KC_9)), + [TD_BRCK_PARN_C] = ACTION_TAP_DANCE_DOUBLE (KC_RBRC, LSFT(KC_0)), + [TD_LALT_RALT] = ACTION_TAP_DANCE_DOUBLE (KC_LALT, KC_RALT), +}; diff --git a/users/arkag/arkag.h b/users/arkag/arkag.h new file mode 100644 index 000000000..9c81e4487 --- /dev/null +++ b/users/arkag/arkag.h @@ -0,0 +1,161 @@ +#pragma once + +#include "quantum.h" +#include "process_keycode/process_tap_dance.h" + +#define EECONFIG_USERSPACE (uint8_t *)20 + +#define LRALT TD(TD_LALT_RALT) +#define QUOTE TD(TD_SING_DOUB) +#define GRAVE TD(TD_GRV_3GRV) +#define OBRACK TD(TD_BRCK_PARN_O) +#define CBRACK TD(TD_BRCK_PARN_C) +#define THREE TD(TD_3_GRV_ACT) +#define STRIKE TD(TD_STRK_SHOT) +#define HYPHEN TD(TD_HYPH_UNDR) +#define CEDILLA TD(TD_C_CED) + +#define RAISE MO(1) +#define LOWER MO(2) +#define KEEB MO(3) +#define MEDIA MO(4) +#define LAZY MO(5) + +#define MOD_CTL_MASK (MOD_BIT(KC_LCTL) | MOD_BIT(KC_RCTL)) +#define MOD_GUI_MASK (MOD_BIT(KC_LGUI) | MOD_BIT(KC_RGUI)) +#define MOD_SFT_MASK (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT)) + +#define TAP_A LALT_T(KC_A) +#define TAP_SCN RALT_T(KC_SCOLON) + +#define TAP_S LCTL_T(KC_S) +#define TAP_L RCTL_T(KC_L) + +#define TAP_D LSFT_T(KC_D) +#define TAP_K RSFT_T(KC_K) + +#define TAP_F LGUI_T(KC_F) +#define TAP_J RGUI_T(KC_J) + +#define TAP_EQ LSFT_T(KC_EQUAL) +#define TAP_5 RSFT_T(KC_5) + +#define LED_FLASH_DELAY 150 +#define LED_FADE_DELAY 10 + +#define INACTIVE_DELAY 200 +#define SLEEP_DELAY 60000 + +enum { + _QWERTY = 0, + _RAISE, + _LOWER, + _KEEB, + _MEDIA, + _LAZY, +}; + +typedef enum { + OS_MAC, // Don't assign values + OS_WIN, + OS_NIX, + _OS_COUNT, +} OS; + +typedef struct { + uint16_t h; + uint8_t s; + uint8_t v; +} Color; + +typedef enum { + no_flash = 0, + flash_off, + flash_on, +} flashState; + +typedef enum { + add_fade = 0, + sub_fade, +} fadeState; + +typedef enum { + active = 0, + inactive, + sleeping, + boot, +} activityState; + +enum custom_keycodes { + M_PMOD = SAFE_RANGE, + M_SMOD, + M_P_B, + M_C_A_D, + M_CALC, + M_OS, + M_TF, + M_TM, + M_GGT, + M_LOD, + M_LENNY, + M_BOLD, + M_ITAL, + M_ULIN, + M_SNIPT, + M_REPO, + M_SHRUG, + M_UF, +}; + +enum tapdances { + TD_3_GRV_ACT = 0, + TD_C_CED, + TD_GRV_3GRV, + TD_SLSH_HTTP, + TD_SING_DOUB, + TD_HYPH_UNDR, + TD_STRK_SHOT, + TD_SPECIAL, + TD_BRCK_PARN_O, + TD_BRCK_PARN_C, + TD_LALT_RALT, + SPC_SFT_NSFT, +}; + +void send_unicode_hex_string(const char *str); + +void set_color (Color new, bool update); +void save_color(Color to_save); +void reset_color(void); + +Color mod_color(Color current_color, bool should_add, uint8_t change_amount); + +void reverse_fade (void); + +void check_state (void); + +void fade_rgb (void); + +void flash_rgb (void); + +void set_os (uint8_t os, bool update); + +void tap_key(uint8_t keycode); + +void pri_mod(bool press); + +void sec_mod(bool press); + +void surround_type(uint8_t num_of_chars, uint16_t keycode, bool use_shift); + +void long_keystroke(size_t num_of_keys, uint16_t keys[]); + +void dance_grv (qk_tap_dance_state_t *state, void *user_data); +void dance_quot (qk_tap_dance_state_t *state, void *user_data); +void dance_strk (qk_tap_dance_state_t *state, void *user_data); +void dance_3 (qk_tap_dance_state_t *state, void *user_data); +void dance_c (qk_tap_dance_state_t *state, void *user_data); + +int cur_dance (qk_tap_dance_state_t *state); +void spc_finished (qk_tap_dance_state_t *state, void *user_data); +void spc_reset (qk_tap_dance_state_t *state, void *user_data); diff --git a/users/arkag/config.h b/users/arkag/config.h new file mode 100644 index 000000000..e715e5534 --- /dev/null +++ b/users/arkag/config.h @@ -0,0 +1,5 @@ +#pragma once + +#define TAPPING_TERM 200 + +#define IGNORE_MOD_TAP_INTERRUPT diff --git a/users/arkag/readme.md b/users/arkag/readme.md new file mode 100644 index 000000000..76a5c4525 --- /dev/null +++ b/users/arkag/readme.md @@ -0,0 +1,14 @@ +Copyright 2018 arkag arkag@pm.me + +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 . diff --git a/users/arkag/rules.mk b/users/arkag/rules.mk new file mode 100644 index 000000000..3513f0ea6 --- /dev/null +++ b/users/arkag/rules.mk @@ -0,0 +1 @@ + SRC += arkag.c From 57ec309d3e05732094408834b00af9cfd1ffca62 Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Sun, 23 Sep 2018 13:48:48 -0700 Subject: [PATCH 124/788] Keyboard: Panc60 (#3961) * initial check in * figure out the column pins * temporary keymap * guess the row pins * fix matrix.c compilation errors * use the LAYOUT_60_hhkb macro and tweak the keymap a little bit * update readme * Put my name everywhere * Add QMK Configurator support * figured out the row pins * update readme to have reset info * Fill in some blanks that are documentation related * Update matrix.c * add kb functions * forego kbfirmware labeling * add arrows and caps lock to function layer. * add a LAYOUT_60 and LAYOUT_all macro * missed a comma * add configurator support for the two new LAYOUT macros * Jack helped me with a new custom matrix * add 60_ansi into rules.mk --- keyboards/panc60/config.h | 46 +++ keyboards/panc60/i2c.c | 106 ++++++ keyboards/panc60/i2c.h | 27 ++ keyboards/panc60/info.json | 20 ++ keyboards/panc60/keymaps/default/config.h | 19 + keyboards/panc60/keymaps/default/keymap.c | 60 ++++ keyboards/panc60/keymaps/default/readme.md | 1 + keyboards/panc60/matrix.c | 145 ++++++++ keyboards/panc60/panc60.c | 25 ++ keyboards/panc60/panc60.h | 71 ++++ keyboards/panc60/readme.md | 46 +++ keyboards/panc60/rules.mk | 52 +++ keyboards/panc60/usbconfig.h | 396 +++++++++++++++++++++ 13 files changed, 1014 insertions(+) create mode 100644 keyboards/panc60/config.h create mode 100644 keyboards/panc60/i2c.c create mode 100644 keyboards/panc60/i2c.h create mode 100644 keyboards/panc60/info.json create mode 100644 keyboards/panc60/keymaps/default/config.h create mode 100644 keyboards/panc60/keymaps/default/keymap.c create mode 100644 keyboards/panc60/keymaps/default/readme.md create mode 100644 keyboards/panc60/matrix.c create mode 100644 keyboards/panc60/panc60.c create mode 100644 keyboards/panc60/panc60.h create mode 100644 keyboards/panc60/readme.md create mode 100644 keyboards/panc60/rules.mk create mode 100644 keyboards/panc60/usbconfig.h diff --git a/keyboards/panc60/config.h b/keyboards/panc60/config.h new file mode 100644 index 000000000..703141beb --- /dev/null +++ b/keyboards/panc60/config.h @@ -0,0 +1,46 @@ +/* +Copyright 2017 Luiz Ribeiro + +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 . +*/ + +#pragma once + +#include "config_common.h" + +#define VENDOR_ID 0x20A0 +#define PRODUCT_ID 0x422D +#define MANUFACTURER Panc Interactive +#define PRODUCT panc60 + +#define RGBLED_NUM 12 + +#define MATRIX_ROWS 5 +#define MATRIX_COLS 15 + +#define MATRIX_ROW_PINS { B3, B4, B5, B6, B7 } +#define MATRIX_COL_PINS { A0, A1, A2, A3, A4, A5, A6, A7, C7, C6, C5, C4, C3, C2, D7 } +#define UNUSED_PINS + +#define DIODE_DIRECTION COL2ROW +#define DEBOUNCING_DELAY 5 + +#define NO_BACKLIGHT_CLOCK +#define BACKLIGHT_LEVELS 1 +#define RGBLIGHT_ANIMATIONS + +#define NO_UART 1 + +/* key combination for command */ +#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) diff --git a/keyboards/panc60/i2c.c b/keyboards/panc60/i2c.c new file mode 100644 index 000000000..e8c4455ad --- /dev/null +++ b/keyboards/panc60/i2c.c @@ -0,0 +1,106 @@ +/* +Copyright 2016 Luiz Ribeiro + +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 . +*/ + +// Please do not modify this file + +#include +#include + +#include "i2c.h" + +void i2c_set_bitrate(uint16_t bitrate_khz) { + uint8_t bitrate_div = ((F_CPU / 1000l) / bitrate_khz); + if (bitrate_div >= 16) { + bitrate_div = (bitrate_div - 16) / 2; + } + TWBR = bitrate_div; +} + +void i2c_init(void) { + // set pull-up resistors on I2C bus pins + PORTC |= 0b11; + + i2c_set_bitrate(400); + + // enable TWI (two-wire interface) + TWCR |= (1 << TWEN); + + // enable TWI interrupt and slave address ACK + TWCR |= (1 << TWIE); + TWCR |= (1 << TWEA); +} + +uint8_t i2c_start(uint8_t address) { + // reset TWI control register + TWCR = 0; + + // begin transmission and wait for it to end + TWCR = (1< + +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 . +*/ + +// Please do not modify this file + +#ifndef __I2C_H__ +#define __I2C_H__ + +void i2c_init(void); +void i2c_set_bitrate(uint16_t bitrate_khz); +uint8_t i2c_send(uint8_t address, uint8_t *data, uint16_t length); + +#endif diff --git a/keyboards/panc60/info.json b/keyboards/panc60/info.json new file mode 100644 index 000000000..fe919e8b9 --- /dev/null +++ b/keyboards/panc60/info.json @@ -0,0 +1,20 @@ +{ + "keyboard_name": "panc60", + "url": "", + "maintainer": "qmk", + "width": 15, + "height": 5, + "layouts": { + "LAYOUT_all": { + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2, "w":2.25}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":4, "y":3}, {"x":5, "y":3}, {"x":6, "y":3}, {"x":7, "y":3}, {"x":8, "y":3}, {"x":9, "y":3}, {"x":10, "y":3}, {"x":11, "y":3}, {"x":12, "y":3}, {"x":13, "y":3}, {"x":14, "y":3}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"x":10, "y":4}, {"x":11, "y":4}, {"x":12, "y":4}, {"x":13, "y":4}, {"x":14, "y":4}] + }, + + "LAYOUT_60_ansi": { + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0, "w":2}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2, "w":2.25}, {"x":0, "y":3, "w":2.25}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":2.75}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"x":10, "y":4, "w":1.25}, {"x":11.25, "y":4, "w":1.25}, {"x":12.5, "y":4, "w":1.25}, {"x":13.75, "y":4, "w":1.25}] + }, + + "LAYOUT_60_hhkb": { + "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"|", "x":13, "y":0}, {"label":"~", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"Delete", "x":13.5, "y":1, "w":1.5}, {"label":"Control", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"label":"Fn", "x":14, "y":3}, {"label":"Os", "x":1.5, "y":4}, {"label":"Alt", "x":2.5, "y":4, "w":1.5}, {"x":4, "y":4, "w":7}, {"label":"Alt", "x":11, "y":4, "w":1.5}, {"label":"Os", "x":12.5, "y":4}] + } + } +} diff --git a/keyboards/panc60/keymaps/default/config.h b/keyboards/panc60/keymaps/default/config.h new file mode 100644 index 000000000..a3ed4f762 --- /dev/null +++ b/keyboards/panc60/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 MechMerlin + * + * 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 . + */ + +#pragma once + +// place overrides here diff --git a/keyboards/panc60/keymaps/default/keymap.c b/keyboards/panc60/keymaps/default/keymap.c new file mode 100644 index 000000000..2754d89ff --- /dev/null +++ b/keyboards/panc60/keymaps/default/keymap.c @@ -0,0 +1,60 @@ +/* Copyright 2018 MechMerlin + * + * 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 . + */ +#include QMK_KEYBOARD_H + +// Defines the keycodes used by our macros in process_record_user +enum custom_keycodes { + QMKBEST = SAFE_RANGE, + QMKURL +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = LAYOUT_60_hhkb( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_DEL, + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, MO(1), + KC_RGUI, KC_LALT, KC_SPC, KC_LALT, KC_LGUI), + + [1] = LAYOUT_60_hhkb( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, + KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_RIGHT, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DOWN, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QMKBEST: + if (record->event.pressed) { + // when keycode QMKBEST is pressed + SEND_STRING("QMK is the best thing ever!"); + } else { + // when keycode QMKBEST is released + } + break; + case QMKURL: + if (record->event.pressed) { + // when keycode QMKURL is pressed + SEND_STRING("https://qmk.fm/" SS_TAP(X_ENTER)); + } else { + // when keycode QMKURL is released + } + break; + } + return true; +} diff --git a/keyboards/panc60/keymaps/default/readme.md b/keyboards/panc60/keymaps/default/readme.md new file mode 100644 index 000000000..3aa3cdb4c --- /dev/null +++ b/keyboards/panc60/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for panc60 diff --git a/keyboards/panc60/matrix.c b/keyboards/panc60/matrix.c new file mode 100644 index 000000000..cf0f63837 --- /dev/null +++ b/keyboards/panc60/matrix.c @@ -0,0 +1,145 @@ +/* +Copyright 2018 Jack Humbert + +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 . +*/ + +#include +#include +#include +#include "matrix.h" + +#ifndef DEBOUNCE +# define DEBOUNCE 5 +#endif + +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { } + +__attribute__ ((weak)) +void matrix_scan_user(void) { } + +// #define MATRIX_ROW_PINS { B3, B4, B5, B6, B7 } +// #define MATRIX_COL_PINS { A0, A1, A2, A3, A4, A5, A6, A7, C7, C6, C5, C4, C3, C2, D7 } + +static uint8_t debouncing = DEBOUNCE; + +static matrix_row_t matrix[MATRIX_ROWS]; +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; + +void matrix_init(void) { + + // disables JTAG so we can use them as columns + MCUCSR = (1<. + */ +#include "panc60.h" + +#include +#include "action_layer.h" +#include "i2c.h" +#include "quantum.h" + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} diff --git a/keyboards/panc60/panc60.h b/keyboards/panc60/panc60.h new file mode 100644 index 000000000..95dcb1f90 --- /dev/null +++ b/keyboards/panc60/panc60.h @@ -0,0 +1,71 @@ +/* Copyright 2018 MechMerlin + * + * 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 . + */ +#ifndef PANC60_H +#define PANC60_H + +#include "quantum.h" + +/* This a shortcut to help you visually see your layout. + * + * The first section contains all of the arguments representing the physical + * layout of the board and position of the keys. + * + * The second converts the arguments into a two-dimensional array which + * represents the switch matrix. + */ +#define LAYOUT_all( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, \ + K40, K41, K42, K47, K49, K4A, K4B, K4C, K4D \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, KC_NO }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, KC_NO, K2D, KC_NO }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E }, \ + { K40, K41, K42, KC_NO, KC_NO, KC_NO, KC_NO, K47, KC_NO, K49, K4A, K4B, K4C, K4D, KC_NO } \ +} + +#define LAYOUT_60_ansi( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0E, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, \ + K40, K41, K42, K47, K49, K4A, K4C, K4D \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, KC_NO, K0E }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, KC_NO }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, KC_NO, K2D, KC_NO }, \ + { K30, KC_NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, KC_NO, K3D, KC_NO }, \ + { K40, K41, K42, KC_NO, KC_NO, KC_NO, KC_NO, K47, KC_NO, K49, K4A, KC_NO, K4C, K4D, KC_NO } \ +} + +#define LAYOUT_60_hhkb( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, K3E, \ + K41, K42, K47, K4A, K4C \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, KC_NO }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, KC_NO, K2D, KC_NO }, \ + { K30, KC_NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, KC_NO, K3D, K3E }, \ + { KC_NO, K41, K42, KC_NO, KC_NO, KC_NO, KC_NO, K47, KC_NO, KC_NO, K4A, KC_NO, K4C, KC_NO, KC_NO } \ +} + +#endif diff --git a/keyboards/panc60/readme.md b/keyboards/panc60/readme.md new file mode 100644 index 000000000..05ac3d72b --- /dev/null +++ b/keyboards/panc60/readme.md @@ -0,0 +1,46 @@ +# panc60 + +![panc60](https://imgix.ttcdn.co/i/product/original/0/670893-eca4599c4aad489dbe62609ac2fed86e.jpeg?q=100&auto=format%2Ccompress&w=500) + +The panc60 is a 60% PCB with backlight and rgb underglow. + +Keyboard Maintainer: [MechMerlin](https://github.com/mechmerlin), [Jack Humbert](https://github.com/jackhumbert) +Hardware Supported: panc60 PCB +Hardware Availability: [PANC Interactive](https://store.panc.co/product/panc60-60-pcb) + +Make example for this keyboard (after setting up your build environment): + + make panc60:default + +Flashing + +ps2avr(GB) boards use an atmega32a microcontroller and a different bootloader. It is not flashable using the regular QMK methods. + +To put the panc60 into reset, hold left control while plugging in. + +Windows: +1. Download [HIDBootFlash](http://vusb.wikidot.com/project:hidbootflash). +2. Place your keyboard into reset. +3. Press the `Find Device` button and ensure that your keyboard is found. +4. Press the `Open .hex File` button and locate the `.hex` file you created. +5. Press the `Flash Device` button and wait for the process to complete. + +macOS: +1. Install homebrew by typing the following: + ``` + /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" + ``` +2. Install `crosspack-avr`. + ``` + brew cask install crosspack-avr + ``` +3. Install the following packages: + ``` + brew install python + brew install pyusb + brew install --HEAD`https://raw.githubusercontent.com/robertgzr/homebrew-tap/master/bootloadhid.rb + +4. Place your keyboard into reset. +5. Flash the board by typing `bootloadHID -r` followed by the path to your `.hex` file. + +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). diff --git a/keyboards/panc60/rules.mk b/keyboards/panc60/rules.mk new file mode 100644 index 000000000..fcb14d0ae --- /dev/null +++ b/keyboards/panc60/rules.mk @@ -0,0 +1,52 @@ +# Copyright 2017 Luiz Ribeiro +# +# 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 . + +# MCU name +MCU = atmega32a +PROTOCOL = VUSB + +# unsupported features for now +NO_UART = yes +NO_SUSPEND_POWER_DOWN = yes + +# processor frequency +F_CPU = 12000000 + +# Bootloader +# This definition is optional, and if your keyboard supports multiple bootloaders of +# different sizes, comment this out, and the correct address will be loaded +# automatically (+60). See bootloader.mk for all options. +BOOTLOADER = bootloadHID + +# build options +BOOTMAGIC_ENABLE = yes +MOUSEKEY_ENABLE = yes +EXTRAKEY_ENABLE = yes +CONSOLE_ENABLE = yes +COMMAND_ENABLE = yes +BACKLIGHT_ENABLE = no +RGBLIGHT_ENABLE = no +RGBLIGHT_CUSTOM_DRIVER = yes + +OPT_DEFS = -DDEBUG_LEVEL=0 + +# custom matrix setup +CUSTOM_MATRIX = yes +SRC = matrix.c i2c.c + +# programming options +PROGRAM_CMD = ./util/atmega32a_program.py $(TARGET).hex + +LAYOUTS = 60_ansi 60_hhkb diff --git a/keyboards/panc60/usbconfig.h b/keyboards/panc60/usbconfig.h new file mode 100644 index 000000000..d2d848fcd --- /dev/null +++ b/keyboards/panc60/usbconfig.h @@ -0,0 +1,396 @@ +/* Name: usbconfig.h + * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers + * Author: Christian Starkjohann + * Creation Date: 2005-04-01 + * Tabsize: 4 + * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $ + */ + +#ifndef __usbconfig_h_included__ +#define __usbconfig_h_included__ + +#include "config.h" + +/* +General Description: +This file is an example configuration (with inline documentation) for the USB +driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is +also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may +wire the lines to any other port, as long as D+ is also wired to INT0 (or any +other hardware interrupt, as long as it is the highest level interrupt, see +section at the end of this file). +*/ + +/* ---------------------------- Hardware Config ---------------------------- */ + +#define USB_CFG_IOPORTNAME D +/* This is the port where the USB bus is connected. When you configure it to + * "B", the registers PORTB, PINB and DDRB will be used. + */ +#define USB_CFG_DMINUS_BIT 3 +/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected. + * This may be any bit in the port. + */ +#define USB_CFG_DPLUS_BIT 2 +/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected. + * This may be any bit in the port. Please note that D+ must also be connected + * to interrupt pin INT0! [You can also use other interrupts, see section + * "Optional MCU Description" below, or you can connect D- to the interrupt, as + * it is required if you use the USB_COUNT_SOF feature. If you use D- for the + * interrupt, the USB interrupt will also be triggered at Start-Of-Frame + * markers every millisecond.] + */ +#define USB_CFG_CLOCK_KHZ (F_CPU/1000) +/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000, + * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code + * require no crystal, they tolerate +/- 1% deviation from the nominal + * frequency. All other rates require a precision of 2000 ppm and thus a + * crystal! + * Since F_CPU should be defined to your actual clock rate anyway, you should + * not need to modify this setting. + */ +#define USB_CFG_CHECK_CRC 0 +/* Define this to 1 if you want that the driver checks integrity of incoming + * data packets (CRC checks). CRC checks cost quite a bit of code size and are + * currently only available for 18 MHz crystal clock. You must choose + * USB_CFG_CLOCK_KHZ = 18000 if you enable this option. + */ + +/* ----------------------- Optional Hardware Config ------------------------ */ + +/* #define USB_CFG_PULLUP_IOPORTNAME D */ +/* If you connect the 1.5k pullup resistor from D- to a port pin instead of + * V+, you can connect and disconnect the device from firmware by calling + * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h). + * This constant defines the port on which the pullup resistor is connected. + */ +/* #define USB_CFG_PULLUP_BIT 4 */ +/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined + * above) where the 1.5k pullup resistor is connected. See description + * above for details. + */ + +/* --------------------------- Functional Range ---------------------------- */ + +#define USB_CFG_HAVE_INTRIN_ENDPOINT 1 +/* Define this to 1 if you want to compile a version with two endpoints: The + * default control endpoint 0 and an interrupt-in endpoint (any other endpoint + * number). + */ +#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1 +/* Define this to 1 if you want to compile a version with three endpoints: The + * default control endpoint 0, an interrupt-in endpoint 3 (or the number + * configured below) and a catch-all default interrupt-in endpoint as above. + * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature. + */ +#define USB_CFG_EP3_NUMBER 3 +/* If the so-called endpoint 3 is used, it can now be configured to any other + * endpoint number (except 0) with this macro. Default if undefined is 3. + */ +/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */ +/* The above macro defines the startup condition for data toggling on the + * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1. + * Since the token is toggled BEFORE sending any data, the first packet is + * sent with the oposite value of this configuration! + */ +#define USB_CFG_IMPLEMENT_HALT 0 +/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature + * for endpoint 1 (interrupt endpoint). Although you may not need this feature, + * it is required by the standard. We have made it a config option because it + * bloats the code considerably. + */ +#define USB_CFG_SUPPRESS_INTR_CODE 0 +/* Define this to 1 if you want to declare interrupt-in endpoints, but don't + * want to send any data over them. If this macro is defined to 1, functions + * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if + * you need the interrupt-in endpoints in order to comply to an interface + * (e.g. HID), but never want to send any data. This option saves a couple + * of bytes in flash memory and the transmit buffers in RAM. + */ +#define USB_CFG_INTR_POLL_INTERVAL 1 +/* If you compile a version with endpoint 1 (interrupt-in), this is the poll + * interval. The value is in milliseconds and must not be less than 10 ms for + * low speed devices. + */ +#define USB_CFG_IS_SELF_POWERED 0 +/* Define this to 1 if the device has its own power supply. Set it to 0 if the + * device is powered from the USB bus. + */ +#define USB_CFG_MAX_BUS_POWER 500 +/* Set this variable to the maximum USB bus power consumption of your device. + * The value is in milliamperes. [It will be divided by two since USB + * communicates power requirements in units of 2 mA.] + */ +#define USB_CFG_IMPLEMENT_FN_WRITE 1 +/* Set this to 1 if you want usbFunctionWrite() to be called for control-out + * transfers. Set it to 0 if you don't need it and want to save a couple of + * bytes. + */ +#define USB_CFG_IMPLEMENT_FN_READ 0 +/* Set this to 1 if you need to send control replies which are generated + * "on the fly" when usbFunctionRead() is called. If you only want to send + * data from a static buffer, set it to 0 and return the data from + * usbFunctionSetup(). This saves a couple of bytes. + */ +#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0 +/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints. + * You must implement the function usbFunctionWriteOut() which receives all + * interrupt/bulk data sent to any endpoint other than 0. The endpoint number + * can be found in 'usbRxToken'. + */ +#define USB_CFG_HAVE_FLOWCONTROL 0 +/* Define this to 1 if you want flowcontrol over USB data. See the definition + * of the macros usbDisableAllRequests() and usbEnableAllRequests() in + * usbdrv.h. + */ +#define USB_CFG_DRIVER_FLASH_PAGE 0 +/* If the device has more than 64 kBytes of flash, define this to the 64 k page + * where the driver's constants (descriptors) are located. Or in other words: + * Define this to 1 for boot loaders on the ATMega128. + */ +#define USB_CFG_LONG_TRANSFERS 0 +/* Define this to 1 if you want to send/receive blocks of more than 254 bytes + * in a single control-in or control-out transfer. Note that the capability + * for long transfers increases the driver size. + */ +/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */ +/* This macro is a hook if you want to do unconventional things. If it is + * defined, it's inserted at the beginning of received message processing. + * If you eat the received message and don't want default processing to + * proceed, do a return after doing your things. One possible application + * (besides debugging) is to flash a status LED on each packet. + */ +/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */ +/* This macro is a hook if you need to know when an USB RESET occurs. It has + * one parameter which distinguishes between the start of RESET state and its + * end. + */ +/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */ +/* This macro (if defined) is executed when a USB SET_ADDRESS request was + * received. + */ +#define USB_COUNT_SOF 1 +/* define this macro to 1 if you need the global variable "usbSofCount" which + * counts SOF packets. This feature requires that the hardware interrupt is + * connected to D- instead of D+. + */ +/* #ifdef __ASSEMBLER__ + * macro myAssemblerMacro + * in YL, TCNT0 + * sts timer0Snapshot, YL + * endm + * #endif + * #define USB_SOF_HOOK myAssemblerMacro + * This macro (if defined) is executed in the assembler module when a + * Start Of Frame condition is detected. It is recommended to define it to + * the name of an assembler macro which is defined here as well so that more + * than one assembler instruction can be used. The macro may use the register + * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages + * immediately after an SOF pulse may be lost and must be retried by the host. + * What can you do with this hook? Since the SOF signal occurs exactly every + * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in + * designs running on the internal RC oscillator. + * Please note that Start Of Frame detection works only if D- is wired to the + * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES! + */ +#define USB_CFG_CHECK_DATA_TOGGLING 0 +/* define this macro to 1 if you want to filter out duplicate data packets + * sent by the host. Duplicates occur only as a consequence of communication + * errors, when the host does not receive an ACK. Please note that you need to + * implement the filtering yourself in usbFunctionWriteOut() and + * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable + * for each control- and out-endpoint to check for duplicate packets. + */ +#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0 +/* define this macro to 1 if you want the function usbMeasureFrameLength() + * compiled in. This function can be used to calibrate the AVR's RC oscillator. + */ +#define USB_USE_FAST_CRC 0 +/* The assembler module has two implementations for the CRC algorithm. One is + * faster, the other is smaller. This CRC routine is only used for transmitted + * messages where timing is not critical. The faster routine needs 31 cycles + * per byte while the smaller one needs 61 to 69 cycles. The faster routine + * may be worth the 32 bytes bigger code size if you transmit lots of data and + * run the AVR close to its limit. + */ + +/* -------------------------- Device Description --------------------------- */ + +#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF) +/* USB vendor ID for the device, low byte first. If you have registered your + * own Vendor ID, define it here. Otherwise you may use one of obdev's free + * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules! + * *** IMPORTANT NOTE *** + * This template uses obdev's shared VID/PID pair for Vendor Class devices + * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand + * the implications! + */ +#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF) +/* This is the ID of the product, low byte first. It is interpreted in the + * scope of the vendor ID. If you have registered your own VID with usb.org + * or if you have licensed a PID from somebody else, define it here. Otherwise + * you may use one of obdev's free shared VID/PID pairs. See the file + * USB-IDs-for-free.txt for details! + * *** IMPORTANT NOTE *** + * This template uses obdev's shared VID/PID pair for Vendor Class devices + * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand + * the implications! + */ +#define USB_CFG_DEVICE_VERSION 0x00, 0x02 +/* Version number of the device: Minor number first, then major number. + */ +#define USB_CFG_VENDOR_NAME 'w', 'i', 'n', 'k', 'e', 'y', 'l', 'e', 's', 's', '.', 'k', 'r' +#define USB_CFG_VENDOR_NAME_LEN 13 +/* These two values define the vendor name returned by the USB device. The name + * must be given as a list of characters under single quotes. The characters + * are interpreted as Unicode (UTF-16) entities. + * If you don't want a vendor name string, undefine these macros. + * ALWAYS define a vendor name containing your Internet domain name if you use + * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for + * details. + */ +#define USB_CFG_DEVICE_NAME 'p', 's', '2', 'a', 'v', 'r', 'G', 'B' +#define USB_CFG_DEVICE_NAME_LEN 8 +/* Same as above for the device name. If you don't want a device name, undefine + * the macros. See the file USB-IDs-for-free.txt before you assign a name if + * you use a shared VID/PID. + */ +/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */ +/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */ +/* Same as above for the serial number. If you don't want a serial number, + * undefine the macros. + * It may be useful to provide the serial number through other means than at + * compile time. See the section about descriptor properties below for how + * to fine tune control over USB descriptors such as the string descriptor + * for the serial number. + */ +#define USB_CFG_DEVICE_CLASS 0 +#define USB_CFG_DEVICE_SUBCLASS 0 +/* See USB specification if you want to conform to an existing device class. + * Class 0xff is "vendor specific". + */ +#define USB_CFG_INTERFACE_CLASS 3 /* HID */ +#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */ +#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */ +/* See USB specification if you want to conform to an existing device class or + * protocol. The following classes must be set at interface level: + * HID class is 3, no subclass and protocol required (but may be useful!) + * CDC class is 2, use subclass 2 and protocol 1 for ACM + */ +#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0 +/* Define this to the length of the HID report descriptor, if you implement + * an HID device. Otherwise don't define it or define it to 0. + * If you use this define, you must add a PROGMEM character array named + * "usbHidReportDescriptor" to your code which contains the report descriptor. + * Don't forget to keep the array and this define in sync! + */ + +/* #define USB_PUBLIC static */ +/* Use the define above if you #include usbdrv.c instead of linking against it. + * This technique saves a couple of bytes in flash memory. + */ + +/* ------------------- Fine Control over USB Descriptors ------------------- */ +/* If you don't want to use the driver's default USB descriptors, you can + * provide our own. These can be provided as (1) fixed length static data in + * flash memory, (2) fixed length static data in RAM or (3) dynamically at + * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more + * information about this function. + * Descriptor handling is configured through the descriptor's properties. If + * no properties are defined or if they are 0, the default descriptor is used. + * Possible properties are: + * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched + * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is + * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if + * you want RAM pointers. + * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found + * in static memory is in RAM, not in flash memory. + * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash), + * the driver must know the descriptor's length. The descriptor itself is + * found at the address of a well known identifier (see below). + * List of static descriptor names (must be declared PROGMEM if in flash): + * char usbDescriptorDevice[]; + * char usbDescriptorConfiguration[]; + * char usbDescriptorHidReport[]; + * char usbDescriptorString0[]; + * int usbDescriptorStringVendor[]; + * int usbDescriptorStringDevice[]; + * int usbDescriptorStringSerialNumber[]; + * Other descriptors can't be provided statically, they must be provided + * dynamically at runtime. + * + * Descriptor properties are or-ed or added together, e.g.: + * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18)) + * + * The following descriptors are defined: + * USB_CFG_DESCR_PROPS_DEVICE + * USB_CFG_DESCR_PROPS_CONFIGURATION + * USB_CFG_DESCR_PROPS_STRINGS + * USB_CFG_DESCR_PROPS_STRING_0 + * USB_CFG_DESCR_PROPS_STRING_VENDOR + * USB_CFG_DESCR_PROPS_STRING_PRODUCT + * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER + * USB_CFG_DESCR_PROPS_HID + * USB_CFG_DESCR_PROPS_HID_REPORT + * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver) + * + * Note about string descriptors: String descriptors are not just strings, they + * are Unicode strings prefixed with a 2 byte header. Example: + * int serialNumberDescriptor[] = { + * USB_STRING_DESCRIPTOR_HEADER(6), + * 'S', 'e', 'r', 'i', 'a', 'l' + * }; + */ + +#define USB_CFG_DESCR_PROPS_DEVICE 0 +#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC +//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0 +#define USB_CFG_DESCR_PROPS_STRINGS 0 +#define USB_CFG_DESCR_PROPS_STRING_0 0 +#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0 +#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0 +#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0 +#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC +//#define USB_CFG_DESCR_PROPS_HID 0 +#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC +//#define USB_CFG_DESCR_PROPS_HID_REPORT 0 +#define USB_CFG_DESCR_PROPS_UNKNOWN 0 + +#define usbMsgPtr_t unsigned short +/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to + * a scalar type here because gcc generates slightly shorter code for scalar + * arithmetics than for pointer arithmetics. Remove this define for backward + * type compatibility or define it to an 8 bit type if you use data in RAM only + * and all RAM is below 256 bytes (tiny memory model in IAR CC). + */ + +/* ----------------------- Optional MCU Description ------------------------ */ + +/* The following configurations have working defaults in usbdrv.h. You + * usually don't need to set them explicitly. Only if you want to run + * the driver on a device which is not yet supported or with a compiler + * which is not fully supported (such as IAR C) or if you use a differnt + * interrupt than INT0, you may have to define some of these. + */ +/* #define USB_INTR_CFG MCUCR */ +/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */ +/* #define USB_INTR_CFG_CLR 0 */ +/* #define USB_INTR_ENABLE GIMSK */ +/* #define USB_INTR_ENABLE_BIT INT0 */ +/* #define USB_INTR_PENDING GIFR */ +/* #define USB_INTR_PENDING_BIT INTF0 */ +/* #define USB_INTR_VECTOR INT0_vect */ + +/* Set INT1 for D- falling edge to count SOF */ +/* #define USB_INTR_CFG EICRA */ +#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10)) +/* #define USB_INTR_CFG_CLR 0 */ +/* #define USB_INTR_ENABLE EIMSK */ +#define USB_INTR_ENABLE_BIT INT1 +/* #define USB_INTR_PENDING EIFR */ +#define USB_INTR_PENDING_BIT INTF1 +#define USB_INTR_VECTOR INT1_vect + +#endif /* __usbconfig_h_included__ */ From 58b9b22670c2c36e8502826349d8f752d8b3ab37 Mon Sep 17 00:00:00 2001 From: Luca Date: Sun, 23 Sep 2018 22:49:17 +0200 Subject: [PATCH 125/788] Circuitry sample for PS/2 Mouse (#3959) Added a sample circuitry for handling the connection of a PS/2 Mouse. Even if it's written that a circuitry is needed, there're a lot of other things and the information gets lost really fast. A really simple sample helps to remember who wants to implement the functionality about the circuitry. --- docs/feature_ps2_mouse.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/feature_ps2_mouse.md b/docs/feature_ps2_mouse.md index 909406e7d..01e2cc63d 100644 --- a/docs/feature_ps2_mouse.md +++ b/docs/feature_ps2_mouse.md @@ -6,6 +6,24 @@ To hook up a Trackpoint, you need to obtain a Trackpoint module (i.e. harvest fr There are three available modes for hooking up PS/2 devices: USART (best), interrupts (better) or busywait (not recommended). +### The Cirtuitry between Trackpoint and Controller + +To get the things working, a 4.7K drag is needed between the two lines DATA and CLK and the line 5+. + +``` + + DATA ----------+--------- PIN + | + 4.7K + | +MODULE 5+ --------+--+--------- PWR CONTROLLER + | + 4.7K + | + CLK ------+------------ PIN +``` + + ### Busywait Version Note: This is not recommended, you may encounter jerky movement or unsent inputs. Please use interrupt or USART version if possible. From ce057ea47448d0df2a05efa419f61563649a5821 Mon Sep 17 00:00:00 2001 From: listofoptions <39714365+listofoptions@users.noreply.github.com> Date: Sun, 23 Sep 2018 21:46:53 -0400 Subject: [PATCH 126/788] Keyboard: HP 46010A converter (#3967) * funged git history, restarting * tested and working (message typed on this) * updated documentation to include wiring directions * formatting * updated matrix and default layout a bit * getting ready for merge into main repo * getting ready for merge into main repo v2 * cleaning * cleaning repo of extranious files * updated documentation --- keyboards/converter/hp_46010a/config.h | 35 +++ keyboards/converter/hp_46010a/hp_46010a.c | 3 + keyboards/converter/hp_46010a/hp_46010a.h | 62 +++++ keyboards/converter/hp_46010a/info.json | 6 + .../hp_46010a/keymaps/default/keymap.c | 45 ++++ keyboards/converter/hp_46010a/matrix.c | 244 ++++++++++++++++++ keyboards/converter/hp_46010a/readme.md | 52 ++++ keyboards/converter/hp_46010a/rules.mk | 72 ++++++ 8 files changed, 519 insertions(+) create mode 100644 keyboards/converter/hp_46010a/config.h create mode 100644 keyboards/converter/hp_46010a/hp_46010a.c create mode 100644 keyboards/converter/hp_46010a/hp_46010a.h create mode 100644 keyboards/converter/hp_46010a/info.json create mode 100644 keyboards/converter/hp_46010a/keymaps/default/keymap.c create mode 100644 keyboards/converter/hp_46010a/matrix.c create mode 100644 keyboards/converter/hp_46010a/readme.md create mode 100644 keyboards/converter/hp_46010a/rules.mk diff --git a/keyboards/converter/hp_46010a/config.h b/keyboards/converter/hp_46010a/config.h new file mode 100644 index 000000000..f77ed4115 --- /dev/null +++ b/keyboards/converter/hp_46010a/config.h @@ -0,0 +1,35 @@ +/* +Copyright 2018 listofoptions + +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 . +*/ + +#pragma once + +#include "config_common.h" + +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 1 +#define MANUFACTURER QMK +#define PRODUCT 46010A keyboard converter +#define DESCRIPTION 46010A keyboard converter + +#define MATRIX_ROWS 14 +#define MATRIX_COLS 8 + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + + diff --git a/keyboards/converter/hp_46010a/hp_46010a.c b/keyboards/converter/hp_46010a/hp_46010a.c new file mode 100644 index 000000000..915a220f9 --- /dev/null +++ b/keyboards/converter/hp_46010a/hp_46010a.c @@ -0,0 +1,3 @@ +#include "hp_46010a.h" +#include +#include "quantum.h" \ No newline at end of file diff --git a/keyboards/converter/hp_46010a/hp_46010a.h b/keyboards/converter/hp_46010a/hp_46010a.h new file mode 100644 index 000000000..db64ce24a --- /dev/null +++ b/keyboards/converter/hp_46010a/hp_46010a.h @@ -0,0 +1,62 @@ +/* +Copyright 2018 listofoptions + +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 . +*/ + +#pragma once + +#include "quantum.h" + +/* ,---------. ,---------------------------------------------------------. ,---------. ,-------------------. + * | res|stop| | f1| f2| f3| f4|menu|user| f5| f6| f7| f8| |clrl|clrd| | | | | | + * `---------' `---------------------------------------------------------' `---------' `-------------------' + * ,------------------------------------------------------------------------..---------. ,-------------------. + * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| +| back||insl|dell| | *| /| +| -| + * |------------------------------------------------------------------------||---------| |-------------------| + * | tab| q| w| e| r| t| y| u| i| o| p| [| ]| \||insc|delc| | 7| 8| 9|pade| + * |------------------------------------------------------------------------||---------| |-------------------| + * |caps|ctrl| a| s| d| f| g| h| j| k| l| ;| '| retr|| cur|prev| | 4| 5| 6| ,| + * |------------------------------------------------------------------------------------ |-------------------| + * |dele|lshf | z| x| c| v| b| n| m| ,| .| /|rshf |sel | up|next| | 1| 2| 3| tab| + * |-------------------------------------------------------------------------|---------| |--------------- | + * |prnt| |lalt| space |ralt| |left|down|rght| | 0| .| | + * `-----------------------------------------------------------------------------------' `-------------------' + */ + +#define LAYOUT_HP_46010A( \ + KEY_RES, KEY_STOP, KEY_F1, KEY_F2, KEY_F3, KEY_F4,KEY_MENU,KEY_USER, KEY_F5, KEY_F6, KEY_F7, KEY_F8, KEY_CLRL, KEY_CLRD, KEY_B1, KEY_B2, KEY_B3, KEY_B4, \ + KEY_GRAV, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_0, KEY_MINU, KEY_PLUS, KEY_BACK, KEY_INSL, KEY_DELL, KEY_MULT, KEY_DIV, KEY_ADD, KEY_SUBT, \ + KEY_TAB, KEY_Q,KEY_W, KEY_E, KEY_R, KEY_T, KEY_Y, KEY_U, KEY_I, KEY_O, KEY_P, KEY_LBRA, KEY_RBRA, KEY_PIPE, KEY_INSC, KEY_DELC, KEY_P7, KEY_P8, KEY_P9, KEY_PADE, \ + KEY_CAPS, KEY_CTRL, KEY_A, KEY_S, KEY_D, KEY_F, KEY_G, KEY_H, KEY_J, KEY_K, KEY_L, KEY_SEMI, KEY_QUOT, KEY_RETR, KEY_CUR, KEY_PREV, KEY_P4, KEY_P5, KEY_P6, KEY_PCOM, \ + KEY_DELE, KEY_LSHF, KEY_Z, KEY_X, KEY_C, KEY_V, KEY_B, KEY_N, KEY_M, KEY_COMA, KEY_DOT, KEY_SLAS,KEY_RSHF, KEY_SEL, KEY_UP, KEY_NEXT, KEY_P1, KEY_P2, KEY_P3, KEY_PTAB, \ + KEY_PRNT, KEY_LALT, KEY_SPACE , KEY_RALT, KEY_LEFT, KEY_DOWN, KEY_RGHT, KEY_P0, KEY_PDOT \ +) { \ + {KEY_USER, KEY_F5, KEY_F6, KEY_F7, KEY_F8, KEY_CLRL, KEY_CLRD, KEY_MENU }, \ + {KEY_9, KEY_0, KEY_MINU, KEY_PLUS, KEY_BACK, KEY_INSL, KEY_DELL, KEY_8 }, \ + {KEY_O, KEY_P, KEY_LBRA, KEY_RBRA, KEY_PIPE, KEY_INSC, KEY_DELC, KEY_I }, \ + {KEY_K, KEY_L, KEY_SEMI, KEY_QUOT, KEY_RETR, KEY_CUR, KEY_PREV, KEY_J }, \ + {KEY_COMA, KEY_DOT, KEY_SLAS, KEY_1, KEY_SEL, KEY_UP, KEY_NEXT, KEY_M }, \ + {KEY_SPACE, KEY_LALT, KEY_RALT, KC_NO, KEY_LEFT, KEY_DOWN, KEY_RGHT, KC_NO }, \ + {KEY_F3, KEY_F2, KEY_F1, KEY_GRAV, KEY_CTRL, KEY_STOP, KEY_G, KEY_F4 }, \ + {KEY_6, KEY_5, KEY_4, KEY_3, KEY_CAPS, KEY_RSHF, KEY_LSHF, KEY_7 }, \ + {KEY_Y, KEY_T, KEY_R, KEY_E, KEY_W, KEY_Q, KEY_TAB, KEY_U }, \ + {KEY_RES, KEY_F, KEY_D, KEY_S, KEY_A, KC_NO, KEY_2, KEY_H }, \ + {KEY_P7, KEY_P4, KEY_P8, KEY_P5, KEY_P9, KEY_P6, KEY_PADE, KEY_PCOM }, \ + {KEY_MULT, KEY_P1, KEY_DIV, KEY_P2, KEY_PLUS, KEY_P3, KEY_MINU, KEY_PTAB }, \ + {KEY_B1, KEY_P0, KEY_B2, KC_NO, KEY_B3, KEY_PDOT, KEY_B4, KC_NO }, \ + {KEY_B, KEY_V, KEY_C, KEY_X, KEY_Z, KEY_PRNT, KEY_DELE, KEY_N }, \ +} + +#define LAYOUT LAYOUT_HP_46010A diff --git a/keyboards/converter/hp_46010a/info.json b/keyboards/converter/hp_46010a/info.json new file mode 100644 index 000000000..de68a1228 --- /dev/null +++ b/keyboards/converter/hp_46010a/info.json @@ -0,0 +1,6 @@ +{ + "keyboard_name": "HP_46010A", + "keyboard_folder": "converter/HP_46010A", + "url": "https://deskthority.net/wiki/HP_46010A", + "maintainer": "listofoptions", +} diff --git a/keyboards/converter/hp_46010a/keymaps/default/keymap.c b/keyboards/converter/hp_46010a/keymaps/default/keymap.c new file mode 100644 index 000000000..cb65bd422 --- /dev/null +++ b/keyboards/converter/hp_46010a/keymaps/default/keymap.c @@ -0,0 +1,45 @@ +/* +Copyright 2018 listofoptions + +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 . +*/ + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* ,---------. ,---------------------------------------------------------. ,---------. ,-------------------. + * | esc|xxxx| | f1| f2| f3| f4|xxxx|xxxx| f5| f6| f7| f8| |xxxx|xxxx| | f9| f10| f11| f12| + * `---------' `---------------------------------------------------------' `---------' `-------------------' + * ,------------------------------------------------------------------------..---------. ,-------------------. + * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| back||ins |home| | *| /| +| -| + * |------------------------------------------------------------------------||---------| |-------------------| + * | tab| q| w| e| r| t| y| u| i| o| p| [| ]| \||del | end| | 7| 8| 9|pade| + * |------------------------------------------------------------------------||---------| |-------------------| + * |caps|ctrl| a| s| d| f| g| h| j| k| l| ;| '| retr||xxxx|pgup| | 4| 5| 6| ,| + * |------------------------------------------------------------------------------------ |-------------------| + * |del |lsft | z| x| c| v| b| n| m| ,| .| /|rsft | app| up|pgdn| | 1| 2| 3| tab| + * |-------------------------------------------------------------------------|---------| |--------------- | + * | gui| |lalt| space |ralt| |left|down|rght| | 0| .| | + * `-----------------------------------------------------------------------------------' `-------------------' + */ + + [0] = LAYOUT( + KC_ESC, KC_NO, KC_F1, KC_F2, KC_F3, KC_F4,KC_NO, KC_NO, KC_F5, KC_F6, KC_F7, KC_F8, KC_NO, KC_NO, KC_F9, KC_F10, KC_F11, KC_F12, \ + KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQUAL, KC_BSPC, KC_INS, KC_HOME, KC_PAST, KC_PSLS, KC_PPLS, KC_PMNS, \ + KC_TAB, KC_Q,KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_P7, KC_P8, KC_P9, KC_PENT, \ + KC_CAPS, KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_NO, KC_PGUP, KC_P4, KC_P5, KC_P6, KC_PCMM, \ + KC_DEL, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH,KC_RSFT, KC_APP, KC_UP, KC_PGDN, KC_P1, KC_P2, KC_P3, KC_TAB, \ + KC_LGUI, KC_LALT, KC_SPACE , KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT \ + ) +} ; \ No newline at end of file diff --git a/keyboards/converter/hp_46010a/matrix.c b/keyboards/converter/hp_46010a/matrix.c new file mode 100644 index 000000000..2ca7d0357 --- /dev/null +++ b/keyboards/converter/hp_46010a/matrix.c @@ -0,0 +1,244 @@ +/* +Copyright 2018 listofoptions + +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 . +*/ + +#include +#include +#include +#if defined(__AVR__) +#include +#endif +#include + +#include "wait.h" +#include "print.h" +#include "debug.h" +#include "util.h" +#include "matrix.h" +#include "timer.h" +#include "LUFA/Drivers/Peripheral/SPI.h" + +#include "config.h" + + +#ifndef DEBOUNCING_DELAY +# define DEBOUNCING_DELAY 5 +#endif + +#if ( DEBOUNCING_DELAY > 0 ) +static uint16_t debouncing_time ; +static bool debouncing = false ; +#endif + +static uint8_t matrix [MATRIX_ROWS] = {0}; + +#if ( DEBOUNCING_DELAY > 0 ) +static uint8_t matrix_debounce_old [MATRIX_ROWS] = {0}; +static uint8_t matrix_debounce_new [MATRIX_ROWS] = {0}; +#endif + +__attribute__ ((weak)) +void matrix_init_quantum(void) { + matrix_init_kb(); +} + +__attribute__ ((weak)) +void matrix_scan_quantum(void) { + matrix_scan_kb(); +} + +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + +// the keyboard's internal wiring is such that the inputs to the logic are +// a clock signal, and a reset line. +// the output is a single output pin. im bitbanging here, but the SPI controller +// would work normally +// +// the device functions, by using the clock signal to count 128 bits, the lower +// 3 bits of this 7 bit counter are tied to a 1-of-8 multiplexer, this forms +// the columns. +// the upper 4 bits form the rows, and are decoded using bcd to decimal +// decoders, so that 14 out of 16 of the outputs are wired to the rows of the +// matrix. each switch has a diode, such that the row signal feeds into the +// switch, and then into the diode, then into one of the columns into the +// matrix. the reset pin can be used to reset the entire counter. + +#define RESET _BV(PB0) +#define SCLK _BV(PB1) +#define SDATA _BV(PB3) +#define LED _BV(PD6) + +inline +static +void SCLK_increment(void) { + PORTB &= ~SCLK ; + _delay_us( 4 ) ; // make sure the line is stable + PORTB |= SCLK ; + _delay_us( 4 ) ; + + return ; +} + +inline +static +void Matrix_Reset(void) { + PORTB |= RESET ; + _delay_us( 4 ) ; // make sure the line is stable + PORTB &= ~RESET ; + + return ; +} + +inline +static +uint8_t Matrix_ReceiveByte (void) { + uint8_t received = 0 ; + uint8_t temp = 0 ; + for ( uint8_t bit = 0; bit < MATRIX_COLS; ++bit ) { + // toggle the clock + SCLK_increment(); + temp = (PINB & SDATA) << 4 ; + received |= temp >> bit ; + } + + return received ; +} + +inline +static +void Matrix_ThrowByte(void) { + // we use MATRIX_COLS - 1 here because that would put us at 7 clocks + for ( uint8_t bit = 0; bit < MATRIX_COLS - 1; ++bit ) { + // toggle the clock + SCLK_increment(); + } + + return ; +} + +void matrix_init () { + // debug_matrix = 1; + // PB0 (SS) and PB1 (SCLK) set to outputs + DDRB |= RESET | SCLK ; + // PB2, is unused, and PB3 is our serial input + DDRB &= ~SDATA ; + + // SS is reset for this board, and is active High + // SCLK is the serial clock and is active High + PORTB &= ~RESET ; + PORTB |= SCLK ; + + // led pin + DDRD |= LED ; + PORTD &= ~LED ; + + matrix_init_quantum(); + + //toggle reset, to put the keyboard logic into a known state + Matrix_Reset() ; +} + +uint8_t matrix_scan(void) { + + // the first byte of the keyboard's output data can be ignored + Matrix_ThrowByte(); + +#if ( DEBOUNCING_DELAY > 0 ) + + for ( uint8_t row = 0 ; row < MATRIX_ROWS ; ++row ) { + //transfer old debouncing values + matrix_debounce_old[row] = matrix_debounce_new[row] ; + // read new key-states in + matrix_debounce_new[row] = Matrix_ReceiveByte() ; + + if ( matrix_debounce_new[row] != matrix_debounce_old[row] ) { + debouncing = true ; + debouncing_time = timer_read() ; + } + } + +#else + // without debouncing we simply just read in the raw matrix + for ( uint8_t row = 0 ; row < MATRIX_ROWS ; ++row ) { + matrix[row] = Matrix_ReceiveByte ; + } +#endif + + +#if ( DEBOUNCING_DELAY > 0 ) + if ( debouncing && ( timer_elapsed( debouncing_time ) > DEBOUNCING_DELAY ) ) { + + for ( uint8_t row = 0 ; row < MATRIX_ROWS ; ++row ) { + matrix[row] = matrix_debounce_new[row] ; + } + + debouncing = false ; + } +#endif + Matrix_Reset() ; + + matrix_scan_quantum() ; + return 1; +} + +inline +uint8_t matrix_get_row( uint8_t row ) { + return matrix[row]; +} + +void matrix_print(void) +{ + print("\nr/c 01234567\n"); + + for (uint8_t row = 0; row < MATRIX_ROWS; row++) { + phex(row); print(": "); + print_bin_reverse8(matrix_get_row(row)); + print("\n"); + } +} + +inline +uint8_t matrix_rows(void) { + return MATRIX_ROWS; +} + +inline +uint8_t matrix_cols(void) { + return MATRIX_COLS; +} + +// as an aside, I used the M0110 converter: +// tmk_core/common/keyboard.c, quantum/matrix.c, and the project layout of the planck +// the online ducmentation starting from : +// https://docs.qmk.fm/#/config_options +// https://docs.qmk.fm/#/understanding_qmk +// and probably a few i forgot.... \ No newline at end of file diff --git a/keyboards/converter/hp_46010a/readme.md b/keyboards/converter/hp_46010a/readme.md new file mode 100644 index 000000000..2321faa6e --- /dev/null +++ b/keyboards/converter/hp_46010a/readme.md @@ -0,0 +1,52 @@ +# HP 46010A + +![46010A](https://deskthority.net/w/images/a/a5/HP_46010A_--_top.jpg) + +A converter for the eponymous keyboard. + +Keyboard Maintainer: [Listofoptions](https://github.com/listofoptions) +Hardware Supported: HP 46010A, Teensy 2.0 + +Make example for this keyboard (after setting up your build environment): + + make converter/HP_46010A:default + +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). + +to get a matrix created if your board uses a different one (i used the US layout) please see the following gists: +for the matrix itself: https://gist.github.com/listofoptions/cdf70d94767e9c6c027741850a24c568 +for the program to generate the matrix: https://gist.github.com/listofoptions/d245e370678024edbe5bed8c8ab17999 + +to build the actual converter, you are going to need to either splice into the a connector or, use a multi-meter to buzz/ohm out which wires go where. +from the bottom of the pcb the pins are arraged as follows: + + + 4 5 6 + 3 2 1 + + +connect a six pin modular connector of the 6p6c variaty. +then lop off the other end of the cable, striping the wires inside. +use the ohm-meter to find the corresponding wire for each pin on the bottom of the pcb + +the pin meanings are as follows: +1 reset +2 no connection +3 vcc +4 data out +5 clock +6 ground + +wire the ground and power pins to ground and 5v power on the teensy (or other avr device of your choice) +connect +on the teensy the connection is as follows + + +teensy | HP 46010A +----|----- +gnd | gnd (6) +vcc | vcc (3) +PB0 | reset (1) +PB1 | clock (5) +PB3 | data out (4) +gnd | no connection (2) -- optional diff --git a/keyboards/converter/hp_46010a/rules.mk b/keyboards/converter/hp_46010a/rules.mk new file mode 100644 index 000000000..ddd2d593b --- /dev/null +++ b/keyboards/converter/hp_46010a/rules.mk @@ -0,0 +1,72 @@ +# MCU name +#MCU = at90usb1287 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + +# Bootloader +# This definition is optional, and if your keyboard supports multiple bootloaders of +# different sizes, comment this out, and the correct address will be loaded +# automatically (+60). See bootloader.mk for all options. +BOOTLOADER = halfkay + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. +API_SYSEX_ENABLE = no +SPLIT_KEYBOARD = no +WAIT_FOR_USB = yes + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +LAYOUTS_HAS_RGB = NO + +CUSTOM_MATRIX = yes +SRC = matrix.c \ No newline at end of file From 07d317ab8877f935768e8798c1560242e3687847 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Sun, 23 Sep 2018 18:47:43 -0700 Subject: [PATCH 127/788] Keyboard: Crkbd: move I2C and Serial defines to keyboard's config.h (#3970) * Crkbd: move I2C and Serial defines to keyboard's config.h per @drashna on Discord * Crkbd: remove misleading comment re: I2C and Serial USE_I2C and USE_SERIAL are usually a "one or the other"-type deal, but this keyboard uses both. --- keyboards/crkbd/config.h | 3 +++ keyboards/crkbd/keymaps/default/config.h | 4 ---- keyboards/crkbd/keymaps/like_jis/config.h | 4 ---- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/keyboards/crkbd/config.h b/keyboards/crkbd/config.h index 64fee7545..4357a218d 100644 --- a/keyboards/crkbd/config.h +++ b/keyboards/crkbd/config.h @@ -21,6 +21,9 @@ along with this program. If not, see . #include "config_common.h" #include +#define USE_I2C +#define USE_SERIAL + #ifdef USE_Link_Time_Optimization // LTO has issues with macros (action_get_macro) and "functions" (fn_actions), // so just disable them diff --git a/keyboards/crkbd/keymaps/default/config.h b/keyboards/crkbd/keymaps/default/config.h index c573530f7..644e81365 100644 --- a/keyboards/crkbd/keymaps/default/config.h +++ b/keyboards/crkbd/keymaps/default/config.h @@ -20,10 +20,6 @@ along with this program. If not, see . #pragma once -/* Use I2C or Serial */ - -#define USE_I2C -#define USE_SERIAL //#define USE_MATRIX_I2C /* Select hand configuration */ diff --git a/keyboards/crkbd/keymaps/like_jis/config.h b/keyboards/crkbd/keymaps/like_jis/config.h index 4c31cc779..0e2960a93 100644 --- a/keyboards/crkbd/keymaps/like_jis/config.h +++ b/keyboards/crkbd/keymaps/like_jis/config.h @@ -20,10 +20,6 @@ along with this program. If not, see . #pragma once -/* Use I2C or Serial */ - -#define USE_I2C -#define USE_SERIAL //#define USE_MATRIX_I2C /* Select hand configuration */ From 9012f4c2e005253574f2af2887c2317d51c70405 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Sun, 23 Sep 2018 20:50:08 -0700 Subject: [PATCH 128/788] Keyboard: Crkbd: Configurator support and readme formatting (#3971) --- keyboards/crkbd/info.json | 62 +++++++++++++++++++++++++++++++++++++++ keyboards/crkbd/readme.md | 3 +- 2 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 keyboards/crkbd/info.json diff --git a/keyboards/crkbd/info.json b/keyboards/crkbd/info.json new file mode 100644 index 000000000..d74bb4943 --- /dev/null +++ b/keyboards/crkbd/info.json @@ -0,0 +1,62 @@ +{ + "keyboard_name": "crkbd (helidox) rev. 1", + "url": "", + "maintainer": "qmk", + "width": 15, + "height": 4.5, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"Esc", "x":0, "y":0.3}, + {"label":"Q", "x":1, "y":0.3}, + {"label":"W", "x":2, "y":0.1}, + {"label":"E", "x":3, "y":0}, + {"label":"R", "x":4, "y":0.1}, + {"label":"T", "x":5, "y":0.2}, + + {"label":"Y", "x":9, "y":0.2}, + {"label":"U", "x":10, "y":0.1}, + {"label":"I", "x":11, "y":0}, + {"label":"O", "x":12, "y":0.1}, + {"label":"P", "x":13, "y":0.3}, + {"label":"Back Space", "x":14, "y":0.3}, + + {"label":"Ctrl / Tab", "x":0, "y":1.3}, + {"label":"A", "x":1, "y":1.3}, + {"label":"S", "x":2, "y":1.1}, + {"label":"D", "x":3, "y":1}, + {"label":"F", "x":4, "y":1.1}, + {"label":"G", "x":5, "y":1.2}, + + {"label":"H", "x":9, "y":1.2}, + {"label":"J", "x":10, "y":1.1}, + {"label":"K", "x":11, "y":1}, + {"label":"L", "x":12, "y":1.1}, + {"label":";", "x":13, "y":1.3}, + {"label":"'", "x":14, "y":1.3}, + + {"label":"Shift", "x":0, "y":2.3}, + {"label":"Z", "x":1, "y":2.3}, + {"label":"X", "x":2, "y":2.1}, + {"label":"C", "x":3, "y":2}, + {"label":"V", "x":4, "y":2.1}, + {"label":"B", "x":5, "y":2.2}, + + {"label":"N", "x":9, "y":2.2}, + {"label":"M", "x":10, "y":2.1}, + {"label":",", "x":11, "y":2}, + {"label":".", "x":12, "y":2.1}, + {"label":"/", "x":13, "y":2.3}, + {"label":"Shift", "x":14, "y":2.3}, + + {"label":"GUI / KC_HANJ", "x":4, "y":3.7}, + {"label":"Lower", "x":5, "y":3.7}, + {"label":"Space", "x":6, "y":3.2, "h":1.5}, + + {"label":"Enter", "x":8, "y":3.2, "h":1.5}, + {"label":"Raise", "x":9, "y":3.7}, + {"label":"Alt / KC_HAEN", "x":10, "y":3.7} + ] + } + } +} diff --git a/keyboards/crkbd/readme.md b/keyboards/crkbd/readme.md index 2f9f047a4..591fdfe0d 100644 --- a/keyboards/crkbd/readme.md +++ b/keyboards/crkbd/readme.md @@ -10,8 +10,9 @@ A split keyboard with 3x6 vertically staggered keys and 3 thumb keys. Keyboard Maintainer: [foostan](https://github.com/foostan/) [@foostan](https://twitter.com/foostan) Hardware Supported: Crkbd PCB, Pro Micro Hardware Availability: [PCB & Case Data](https://github.com/foostan/crkbd) + Make example for this keyboard (after setting up your build environment): make crkbd:default -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. +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). From b7e25f9ec4203670f2434e82608554ba284cf1f3 Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Mon, 24 Sep 2018 20:39:17 -0700 Subject: [PATCH 129/788] Keyboard: DZ60 Bug: layout_directional is shifted to the left by one (#3978) * layout_directional is shifted to the left by one * forgot to adjust the physical layout --- keyboards/dz60/dz60.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/dz60/dz60.h b/keyboards/dz60/dz60.h index b1089d3b6..3d0b0dd52 100644 --- a/keyboards/dz60/dz60.h +++ b/keyboards/dz60/dz60.h @@ -82,13 +82,13 @@ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, \ K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \ K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \ - K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K312, K313, K314, \ + K300, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, \ K400, K401, K403, K404, K406, K408, K410, K411, K412, K413, K414 \ ) { \ { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014 }, \ { K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \ { K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO }, \ - { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, KC_NO, K312, K313, K314 }, \ + { K300, KC_NO, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314 }, \ { K400, K401, KC_NO, K403, K404, KC_NO, K406, KC_NO, K408, KC_NO, K410, K411, K412, K413, K414 } \ } From e72e4b6920299176a322a2862f930b7ee5f73dff Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Tue, 8 May 2018 18:46:29 -0700 Subject: [PATCH 130/788] Store Clicky status in EEPROM --- docs/feature_audio.md | 4 +--- quantum/audio/audio.c | 8 +++---- quantum/process_keycode/process_clicky.c | 14 ++++++------ users/drashna/drashna.c | 28 +++++++++++++++++------- users/drashna/drashna.h | 3 +-- 5 files changed, 33 insertions(+), 24 deletions(-) diff --git a/docs/feature_audio.md b/docs/feature_audio.md index 039c62cdf..fe210c09b 100644 --- a/docs/feature_audio.md +++ b/docs/feature_audio.md @@ -128,13 +128,11 @@ This adds a click sound each time you hit a button, to simulate click sounds fro * `CK_UP` - Increases the frequency of the clicks * `CK_DOWN` - Decreases the frequency of the clicks + The feature is disabled by default, to save space. To enable it, add this to your `config.h`: #define AUDIO_CLICKY -Additionally, even when enabled, the feature is not enabled by default, so you would need to turn it on first. And since we don't use EEPROM to store the setting (yet), you can default this to on by adding this to your `config.h`: - - #define AUDIO_CLICKY_ON You can configure the default, min and max frequencies, the stepping and built in randomness by defining these values: diff --git a/quantum/audio/audio.c b/quantum/audio/audio.c index c948a60d6..6d6833ec1 100644 --- a/quantum/audio/audio.c +++ b/quantum/audio/audio.c @@ -223,7 +223,7 @@ void audio_init() TCCR1B = (1 << WGM13) | (1 << WGM12) | (0 << CS12) | (1 << CS11) | (0 << CS10); TIMER_1_PERIOD = (uint16_t)(((float)F_CPU) / (440 * CPU_PRESCALER)); TIMER_1_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (440 * CPU_PRESCALER)) * note_timbre); - #endif + #endif audio_initialized = true; } @@ -231,7 +231,7 @@ void audio_init() if (audio_config.enable) { PLAY_SONG(startup_song); } - + } void stop_all_notes() @@ -464,7 +464,7 @@ ISR(TIMER3_AUDIO_vect) note_position++; bool end_of_note = false; if (TIMER_3_PERIOD > 0) { - if (!note_resting) + if (!note_resting) end_of_note = (note_position >= (note_length / TIMER_3_PERIOD * 0xFFFF - 1)); else end_of_note = (note_position >= (note_length)); @@ -604,7 +604,7 @@ ISR(TIMER1_AUDIO_vect) note_position++; bool end_of_note = false; if (TIMER_1_PERIOD > 0) { - if (!note_resting) + if (!note_resting) end_of_note = (note_position >= (note_length / TIMER_1_PERIOD * 0xFFFF - 1)); else end_of_note = (note_position >= (note_length)); diff --git a/quantum/process_keycode/process_clicky.c b/quantum/process_keycode/process_clicky.c index 1e950d111..bd2f1b3b3 100644 --- a/quantum/process_keycode/process_clicky.c +++ b/quantum/process_keycode/process_clicky.c @@ -3,11 +3,6 @@ #ifdef AUDIO_CLICKY -#ifdef AUDIO_CLICKY_ON -bool clicky_enable = true; -#else // AUDIO_CLICKY_ON -bool clicky_enable = false; -#endif // AUDIO_CLICKY_ON #ifndef AUDIO_CLICKY_FREQ_DEFAULT #define AUDIO_CLICKY_FREQ_DEFAULT 440.0f #endif // !AUDIO_CLICKY_FREQ_DEFAULT @@ -27,6 +22,8 @@ bool clicky_enable = false; float clicky_freq = AUDIO_CLICKY_FREQ_DEFAULT; float clicky_song[][2] = {{AUDIO_CLICKY_FREQ_DEFAULT, 3}, {AUDIO_CLICKY_FREQ_DEFAULT, 1}}; // 3 and 1 --> durations +extern audio_config_t audio_config; + #ifndef NO_MUSIC_MODE extern bool music_activated; extern bool midi_activated; @@ -42,7 +39,10 @@ void clicky_play(void) { } bool process_clicky(uint16_t keycode, keyrecord_t *record) { - if (keycode == CLICKY_TOGGLE && record->event.pressed) { clicky_enable = !clicky_enable; } + if (keycode == CLICKY_TOGGLE && record->event.pressed) { + audio_config.clicky ^= 1; + eeconfig_update_audio(audio_config.raw); + } if (keycode == CLICKY_RESET && record->event.pressed) { clicky_freq = AUDIO_CLICKY_FREQ_DEFAULT; } @@ -60,7 +60,7 @@ bool process_clicky(uint16_t keycode, keyrecord_t *record) { } - if ( clicky_enable ) { + if ( audio_config.clicky ) { if (record->event.pressed) { clicky_play();; } diff --git a/users/drashna/drashna.c b/users/drashna/drashna.c index 20df2f4de..7bb272a26 100644 --- a/users/drashna/drashna.c +++ b/users/drashna/drashna.c @@ -133,9 +133,6 @@ void led_set_keymap(uint8_t usb_led) {} void matrix_init_user(void) { userspace_config.raw = eeprom_read_byte(EECONFIG_USERSPACE); -#ifdef AUDIO_CLICKY - clicky_enable = userspace_config.clicky_enable; -#endif #ifdef BOOTLOADER_CATERINA DDRD &= ~(1<<5); @@ -145,7 +142,6 @@ void matrix_init_user(void) { PORTB &= ~(1<<0); #endif - #if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE)) set_unicode_input_mode(UC_WINC); #endif //UNICODE_ENABLE @@ -338,11 +334,27 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { return false; break; - case CLICKY_TOGGLE: -#ifdef AUDIO_CLICKY - userspace_config.clicky_enable = clicky_enable; - eeprom_update_byte(EECONFIG_USERSPACE, userspace_config.raw); + case KC_CCCV: // One key copy/paste + if(record->event.pressed){ + copy_paste_timer = timer_read(); + } else { + if (timer_elapsed(copy_paste_timer) > TAPPING_TERM) { // Hold, copy + register_code(KC_LCTL); + tap(KC_C); + unregister_code(KC_LCTL); +#ifdef AUDIO_ENABLE + PLAY_SONG(tone_copy); #endif + } else { // Tap, paste + register_code(KC_LCTL); + tap(KC_V); + unregister_code(KC_LCTL); +#ifdef AUDIO_ENABLE + PLAY_SONG(tone_paste); +#endif + } + } + return false; break; #ifdef UNICODE_ENABLE case UC_FLIP: // (╯°□°)╯ ︵ ┻━┻ diff --git a/users/drashna/drashna.h b/users/drashna/drashna.h index dd0d1c0d7..de8c3ba94 100644 --- a/users/drashna/drashna.h +++ b/users/drashna/drashna.h @@ -49,7 +49,7 @@ enum userspace_layers { // RGB color codes are no longer located here anymore. Instead, you will want to // head to https://github.com/qmk/qmk_firmware/blob/master/quantum/rgblight_list.h -extern bool clicky_enable; +extern bool rgb_layer_change; #ifdef RGBLIGHT_ENABLE void rgblight_sethsv_default_helper(uint8_t index); @@ -64,7 +64,6 @@ bool mod_key_press (uint16_t code, uint16_t mod_code, bool pressed, uint16_t thi typedef union { uint8_t raw; struct { - bool clicky_enable :1; bool rgb_layer_change :1; bool is_overwatch :1; bool nuke_switch :1; From cfb1b353eef290ea4eddd7cfcb4617ca25d440d2 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Thu, 31 May 2018 12:24:10 -0700 Subject: [PATCH 131/788] Add functions so you can configure programatically --- quantum/audio/audio.h | 3 +- quantum/process_keycode/process_clicky.c | 60 +++++++++++++++++------- quantum/process_keycode/process_clicky.h | 9 ++++ 3 files changed, 53 insertions(+), 19 deletions(-) diff --git a/quantum/audio/audio.h b/quantum/audio/audio.h index da09b2bcd..8136c5b25 100644 --- a/quantum/audio/audio.h +++ b/quantum/audio/audio.h @@ -40,7 +40,8 @@ typedef union { uint8_t raw; struct { bool enable :1; - uint8_t level :7; + bool clicky_enable :1; + uint8_t level :6; }; } audio_config_t; diff --git a/quantum/process_keycode/process_clicky.c b/quantum/process_keycode/process_clicky.c index bd2f1b3b3..b3c8d890e 100644 --- a/quantum/process_keycode/process_clicky.c +++ b/quantum/process_keycode/process_clicky.c @@ -38,29 +38,53 @@ void clicky_play(void) { PLAY_SONG(clicky_song); } +void clicky_freq_up(void) { + float new_freq = clicky_freq * AUDIO_CLICKY_FREQ_FACTOR; + if (new_freq < AUDIO_CLICKY_FREQ_MAX) { + clicky_freq = new_freq; + } +} + +void clicky_freq_down(void) { + float new_freq = clicky_freq / AUDIO_CLICKY_FREQ_FACTOR; + if (new_freq > AUDIO_CLICKY_FREQ_MIN) { + clicky_freq = new_freq; + } +} + +void clicky_freq_reset(void) { + clicky_freq = AUDIO_CLICKY_FREQ_DEFAULT; +} + +void clicky_freq_toggle(void) { + audio_config.clicky_enable ^= 1; + eeconfig_update_audio(audio_config.raw); +} + +void clicky_freq_on(void) { + audio_config.clicky_enable = 1; + eeconfig_update_audio(audio_config.raw); +} + +void clicky_freq_off(void) { + audio_config.clicky_enable = 0; + eeconfig_update_audio(audio_config.raw); +} + +bool is_clicky_on(void) { + return (audio_config.clicky_enable != 0); +} + bool process_clicky(uint16_t keycode, keyrecord_t *record) { - if (keycode == CLICKY_TOGGLE && record->event.pressed) { - audio_config.clicky ^= 1; - eeconfig_update_audio(audio_config.raw); - } + if (keycode == CLICKY_TOGGLE && record->event.pressed) { clicky_freq_toggle(); } - if (keycode == CLICKY_RESET && record->event.pressed) { clicky_freq = AUDIO_CLICKY_FREQ_DEFAULT; } + if (keycode == CLICKY_RESET && record->event.pressed) { clicky_freq_reset(); } - if (keycode == CLICKY_UP && record->event.pressed) { - float new_freq = clicky_freq * AUDIO_CLICKY_FREQ_FACTOR; - if (new_freq < AUDIO_CLICKY_FREQ_MAX) { - clicky_freq = new_freq; - } - } - if (keycode == CLICKY_DOWN && record->event.pressed) { - float new_freq = clicky_freq / AUDIO_CLICKY_FREQ_FACTOR; - if (new_freq > AUDIO_CLICKY_FREQ_MIN) { - clicky_freq = new_freq; - } - } + if (keycode == CLICKY_UP && record->event.pressed) { clicky_freq_up(); } + if (keycode == CLICKY_DOWN && record->event.pressed) { clicky_freq_down(); } - if ( audio_config.clicky ) { + if ( audio_config.clicky_enable ) { if (record->event.pressed) { clicky_play();; } diff --git a/quantum/process_keycode/process_clicky.h b/quantum/process_keycode/process_clicky.h index e274af56f..6ee3cc5d9 100644 --- a/quantum/process_keycode/process_clicky.h +++ b/quantum/process_keycode/process_clicky.h @@ -4,4 +4,13 @@ void clicky_play(void); bool process_clicky(uint16_t keycode, keyrecord_t *record); +void clicky_freq_up(void); +void clicky_freq_down(void); +void clicky_freq_reset(void); +void clicky_freq_toggle(void); +void clicky_freq_on(void); +void clicky_freq_off(void); + +bool is_clicky_on(void); + #endif From a0309db983150fd0197eb620a6ba552d90d29f93 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 1 Jun 2018 13:29:52 -0700 Subject: [PATCH 132/788] Add On/Off keycodes --- docs/feature_audio.md | 12 +++++++----- quantum/process_keycode/process_clicky.c | 11 +++++++---- quantum/process_keycode/process_clicky.h | 7 ++++--- quantum/quantum_keycodes.h | 5 +++++ 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/docs/feature_audio.md b/docs/feature_audio.md index fe210c09b..82e0ed950 100644 --- a/docs/feature_audio.md +++ b/docs/feature_audio.md @@ -119,14 +119,16 @@ You can completely disable Music Mode as well. This is useful, if you're pressed #define NO_MUSIC_MODE -## Faux Click +## Audio Click This adds a click sound each time you hit a button, to simulate click sounds from the keyboard. And the sounds are slightly different for each keypress, so it doesn't sound like a single long note, if you type rapidly. * `CK_TOGG` - Toggles the status (will play sound if enabled) -* `CK_RST` - Resets the frequency to the default state -* `CK_UP` - Increases the frequency of the clicks -* `CK_DOWN` - Decreases the frequency of the clicks +* `CK_ON` - Turns on Audio Click (plays sound) +* `CK_OFF` - Turns off Audio Click (doesn't play sound) +* `CK_RST` - Resets the frequency to the default state (plays sound at default frequency) +* `CK_UP` - Increases the frequency of the clicks (plays sound at new frequency) +* `CK_DOWN` - Decreases the frequency of the clicks (plays sound at new frequency) The feature is disabled by default, to save space. To enable it, add this to your `config.h`: @@ -142,7 +144,7 @@ You can configure the default, min and max frequencies, the stepping and built i | `AUDIO_CLICKY_FREQ_MIN` | 65.0f | Sets the lowest frequency (under 60f are a bit buggy). | | `AUDIO_CLICKY_FREQ_MAX` | 1500.0f | Sets the the highest frequency. Too high may result in coworkers attacking you. | | `AUDIO_CLICKY_FREQ_FACTOR` | 1.18921f| Sets the stepping of UP/DOWN key codes. | -| `AUDIO_CLICKY_FREQ_RANDOMNESS` | 0.05f | Sets a factor of randomness for the clicks, Setting this to `0f` will make each click identical. | +| `AUDIO_CLICKY_FREQ_RANDOMNESS` | 0.05f | Sets a factor of randomness for the clicks, Setting this to `0f` will make each click identical, and `1.0f` will make this sound much like the 90's computer screen scrolling/typing effect. | diff --git a/quantum/process_keycode/process_clicky.c b/quantum/process_keycode/process_clicky.c index b3c8d890e..36578047a 100644 --- a/quantum/process_keycode/process_clicky.c +++ b/quantum/process_keycode/process_clicky.c @@ -56,17 +56,17 @@ void clicky_freq_reset(void) { clicky_freq = AUDIO_CLICKY_FREQ_DEFAULT; } -void clicky_freq_toggle(void) { +void clicky_toggle(void) { audio_config.clicky_enable ^= 1; eeconfig_update_audio(audio_config.raw); } -void clicky_freq_on(void) { +void clicky_on(void) { audio_config.clicky_enable = 1; eeconfig_update_audio(audio_config.raw); } -void clicky_freq_off(void) { +void clicky_off(void) { audio_config.clicky_enable = 0; eeconfig_update_audio(audio_config.raw); } @@ -76,7 +76,10 @@ bool is_clicky_on(void) { } bool process_clicky(uint16_t keycode, keyrecord_t *record) { - if (keycode == CLICKY_TOGGLE && record->event.pressed) { clicky_freq_toggle(); } + if (keycode == CLICKY_TOGGLE && record->event.pressed) { clicky_toggle(); } + + if (keycode == CLICKY_ENABLE && record->event.pressed) { clicky_on(); } + if (keycode == CLICKY_DISABLE && record->event.pressed) { clicky_off(); } if (keycode == CLICKY_RESET && record->event.pressed) { clicky_freq_reset(); } diff --git a/quantum/process_keycode/process_clicky.h b/quantum/process_keycode/process_clicky.h index 6ee3cc5d9..f746edb95 100644 --- a/quantum/process_keycode/process_clicky.h +++ b/quantum/process_keycode/process_clicky.h @@ -7,9 +7,10 @@ bool process_clicky(uint16_t keycode, keyrecord_t *record); void clicky_freq_up(void); void clicky_freq_down(void); void clicky_freq_reset(void); -void clicky_freq_toggle(void); -void clicky_freq_on(void); -void clicky_freq_off(void); + +void clicky_toggle(void); +void clicky_on(void); +void clicky_off(void); bool is_clicky_on(void); diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h index 050d2d275..e983798f2 100644 --- a/quantum/quantum_keycodes.h +++ b/quantum/quantum_keycodes.h @@ -139,10 +139,13 @@ enum quantum_keycodes { // Faux clicky as part of main audio feature CLICKY_TOGGLE, + CLICKY_ENABLE, + CLICKY_DISABLE, CLICKY_UP, CLICKY_DOWN, CLICKY_RESET, + #ifdef FAUXCLICKY_ENABLE // Faux clicky FC_ON, @@ -571,6 +574,8 @@ enum quantum_keycodes { #define CK_RST CLICKY_RESET #define CK_UP CLICKY_UP #define CK_DOWN CLICKY_DOWN +#define CK_ON CLICKY_ENABLE +#define CK_OFF CLICKY_DISABLE #define RGB_MOD RGB_MODE_FORWARD #define RGB_SMOD RGB_MODE_FORWARD From a54f09d4f32e026543903502e340e4496bfba94c Mon Sep 17 00:00:00 2001 From: Ethan Madden Date: Tue, 25 Sep 2018 15:06:48 -0700 Subject: [PATCH 133/788] Keymap: jetpacktuxedo planck keymap (#3896) * added my planck keymap based on a blend of my minivan keymap and the planck default keymap. * moved pipe to better match minivan keymap * updated as per @drashna also moved my keymap a bit after adding the quad encoder and underglow (which doesn't even work on arm right now lol) * a few smaller tweaks --- .../planck/keymaps/jetpacktuxedo/config.h | 32 ++ .../planck/keymaps/jetpacktuxedo/keymap.c | 278 ++++++++++++++++++ .../planck/keymaps/jetpacktuxedo/rules.mk | 1 + 3 files changed, 311 insertions(+) create mode 100644 keyboards/planck/keymaps/jetpacktuxedo/config.h create mode 100644 keyboards/planck/keymaps/jetpacktuxedo/keymap.c create mode 100644 keyboards/planck/keymaps/jetpacktuxedo/rules.mk diff --git a/keyboards/planck/keymaps/jetpacktuxedo/config.h b/keyboards/planck/keymaps/jetpacktuxedo/config.h new file mode 100644 index 000000000..f216dc02d --- /dev/null +++ b/keyboards/planck/keymaps/jetpacktuxedo/config.h @@ -0,0 +1,32 @@ +#pragma once + +#ifdef AUDIO_ENABLE + #define STARTUP_SONG SONG(PLANCK_SOUND) +#endif + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ + +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + +// Most tactile encoders have detents every 4 stages +#define ENCODER_RESOLUTION 4 diff --git a/keyboards/planck/keymaps/jetpacktuxedo/keymap.c b/keyboards/planck/keymaps/jetpacktuxedo/keymap.c new file mode 100644 index 000000000..2994c0c07 --- /dev/null +++ b/keyboards/planck/keymaps/jetpacktuxedo/keymap.c @@ -0,0 +1,278 @@ +/* Copyright 2015-2017 Jack Humbert + * + * 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 . + */ + +#include QMK_KEYBOARD_H +#include "muse.h" + +extern keymap_config_t keymap_config; + +enum planck_layers { + _QWERTY, + _LOWER, + _RAISE, + _PLOVER, + _ADJUST +}; + +enum planck_keycodes { + QWERTY = SAFE_RANGE, + PLOVER, + EXT_PLV +}; + +#define LOWER MO(_LOWER) +#define RAISE MO(_RAISE) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Esc | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Tab | A | S | D | F | G | H | J | K | L | ; |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | Up |Shift | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Brite | Ctrl | Alt | GUI |Lower | Space |Raise | / | Left | Down |Right | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = LAYOUT_planck_grid( + KC_GESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_UP, KC_RSFT, + RGB_TOG, KC_LCTL, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_SPC, RAISE, KC_SLSH, KC_LEFT, KC_DOWN, KC_RGHT +), + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | | | | | | | _ | + | " | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | { | } | PgUp | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | Home | PgDn | End | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT_planck_grid( + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, + _______, _______, _______, _______, _______, _______, _______, _______, KC_UNDS, KC_PLUS, KC_DQUO, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_LCBR, KC_RCBR, KC_PGUP, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_PIPE, KC_HOME, KC_PGDN, KC_END +), + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | | | | | | - | = | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | [ | ] | PgUp | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | \ | Home | PgDn | End | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT_planck_grid( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, + _______, _______, _______, _______, _______, _______, _______, _______, KC_MINS, KC_EQL, KC_QUOT, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_LBRC, KC_RBRC, KC_PGUP, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_BSLS, KC_HOME, KC_PGDN, KC_END +), + +/* Plover layer (http://opensteno.org) + * ,-----------------------------------------------------------------------------------. + * | Exit | # | # | # | # | # | # | # | # | # | # | # | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | S | T | P | H | * | * | F | P | L | T | D | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | S | K | W | R | * | * | R | B | G | S | Z | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | A | O | | E | U | | | | + * `-----------------------------------------------------------------------------------' + */ + +[_PLOVER] = LAYOUT_planck_grid( + EXT_PLV, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, + XXXXXXX, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, + XXXXXXX, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + XXXXXXX, XXXXXXX, XXXXXXX, KC_C, KC_V, XXXXXXX, XXXXXXX, KC_N, KC_M, XXXXXXX, XXXXXXX, XXXXXXX +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty| | |Plover| | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof| | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = LAYOUT_planck_grid( + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, RESET, + _______, _______, MU_MOD, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, _______, _______, PLOVER, _______, + _______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +) + + +}; + +#ifdef AUDIO_ENABLE + float plover_song[][2] = SONG(PLOVER_SOUND); + float plover_gb_song[][2] = SONG(PLOVER_GOODBYE_SOUND); +#endif + +uint32_t layer_state_set_user(uint32_t state) { + return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + print("mode just switched to qwerty and this is a huge string\n"); + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + case PLOVER: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + stop_all_notes(); + PLAY_SONG(plover_song); + #endif + layer_off(_RAISE); + layer_off(_LOWER); + layer_off(_ADJUST); + layer_on(_PLOVER); + if (!eeconfig_is_enabled()) { + eeconfig_init(); + } + keymap_config.raw = eeconfig_read_keymap(); + keymap_config.nkro = 1; + eeconfig_update_keymap(keymap_config.raw); + } + return false; + break; + case EXT_PLV: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(plover_gb_song); + #endif + layer_off(_PLOVER); + } + return false; + break; + } + return true; +} + +bool muse_mode = false; +uint8_t last_muse_note = 0; +uint16_t muse_counter = 0; +uint8_t muse_offset = 70; +uint16_t muse_tempo = 20; + +void encoder_update(bool clockwise) { + if (muse_mode) { + if (IS_LAYER_ON(_RAISE)) { + if (clockwise) { + muse_offset++; + } else { + muse_offset--; + } + } else { + if (clockwise) { + muse_tempo+=1; + } else { + muse_tempo-=1; + } + } + } else { + if (IS_LAYER_ON(_RAISE)) { + if (clockwise) { + register_code(KC_RGHT); + unregister_code(KC_RGHT); + } else { + register_code(KC_LEFT); + unregister_code(KC_LEFT); + } + } else { + if (clockwise) { + register_code(KC_DOWN); + unregister_code(KC_DOWN); + } else { + register_code(KC_UP); + unregister_code(KC_UP); + } + } + } +} + +void dip_update(uint8_t index, bool active) { + switch (index) { + case 0: + if (active) { + #ifdef AUDIO_ENABLE + PLAY_SONG(plover_song); + #endif + layer_on(_ADJUST); + } else { + #ifdef AUDIO_ENABLE + PLAY_SONG(plover_gb_song); + #endif + layer_off(_ADJUST); + } + break; + case 1: + if (active) { + muse_mode = true; + } else { + muse_mode = false; + #ifdef AUDIO_ENABLE + stop_all_notes(); + #endif + } + } +} + +void matrix_scan_user(void) { + #ifdef AUDIO_ENABLE + if (muse_mode) { + if (muse_counter == 0) { + uint8_t muse_note = muse_offset + SCALE[muse_clock_pulse()]; + if (muse_note != last_muse_note) { + stop_note(compute_freq_for_midi_note(last_muse_note)); + play_note(compute_freq_for_midi_note(muse_note), 0xF); + last_muse_note = muse_note; + } + } + muse_counter = (muse_counter + 1) % muse_tempo; + } + #endif +} + +bool music_mask_user(uint16_t keycode) { + switch (keycode) { + case RAISE: + case LOWER: + return false; + default: + return true; + } +} diff --git a/keyboards/planck/keymaps/jetpacktuxedo/rules.mk b/keyboards/planck/keymaps/jetpacktuxedo/rules.mk new file mode 100644 index 000000000..dcf16bef3 --- /dev/null +++ b/keyboards/planck/keymaps/jetpacktuxedo/rules.mk @@ -0,0 +1 @@ +SRC += muse.c From 9dc19fdb6d0fedfb0080891a8eff49a8fc3b70c2 Mon Sep 17 00:00:00 2001 From: BenRLewis <11444078+BenRLewis@users.noreply.github.com> Date: Tue, 25 Sep 2018 23:11:11 +0100 Subject: [PATCH 134/788] Keymap: FollowingGhosts v60r layout (#3926) * First version of FollowingGhosts' custom layout * Added copyright etc. * Fixed readme and added space cadet shift * Moved from RGB to HSV, updated readme and added media keys * Updated pragma * Added play/pause and updated config * Added pragma back --- .../keymaps/followingghosts/config.h | 18 +++ .../keymaps/followingghosts/keymap.c | 109 ++++++++++++++++++ .../keymaps/followingghosts/readme.md | 61 ++++++++++ .../keymaps/followingghosts/rules.mk | 4 + 4 files changed, 192 insertions(+) create mode 100644 keyboards/v60_type_r/keymaps/followingghosts/config.h create mode 100644 keyboards/v60_type_r/keymaps/followingghosts/keymap.c create mode 100644 keyboards/v60_type_r/keymaps/followingghosts/readme.md create mode 100644 keyboards/v60_type_r/keymaps/followingghosts/rules.mk diff --git a/keyboards/v60_type_r/keymaps/followingghosts/config.h b/keyboards/v60_type_r/keymaps/followingghosts/config.h new file mode 100644 index 000000000..a2612e2d3 --- /dev/null +++ b/keyboards/v60_type_r/keymaps/followingghosts/config.h @@ -0,0 +1,18 @@ +/* Copyright 2018 Ben Lewis (FollowingGhosts) + * + * 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 . + */ +#pragma once +#define V60_POLESTAR +#define RGBLIGHT_EFFECT_BREATHING diff --git a/keyboards/v60_type_r/keymaps/followingghosts/keymap.c b/keyboards/v60_type_r/keymaps/followingghosts/keymap.c new file mode 100644 index 000000000..cca95c509 --- /dev/null +++ b/keyboards/v60_type_r/keymaps/followingghosts/keymap.c @@ -0,0 +1,109 @@ +/* Copyright 2018 Ben Lewis (FollowingGhosts) + * + * 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 . + */ + +/* This is adapted from the official ANSI layout provided by the KBP V60 Type R +* as depicted in their manual and on the stock keycaps. +*/ +#include QMK_KEYBOARD_H + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Keymap 0: Default Layer (Qwerty) + * CAPS opens Layer 1 if held, acts normally if tapped + * Tab is used for Mouse Layer (2) + * ,-----------------------------------------------------------. + * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| Bs | + * |-----------------------------------------------------------| + * |L2/Tab| Q| W| E| R| T| Y| U| I| O| P| [| ]| \| + * |-----------------------------------------------------------| + * |L1/Caps| A| S| D| F| G| H| J| K| L| ;| '|Return | + * |-----------------------------------------------------------| + * |LShift( | Z| X| C| V| B| N| M| ,| .| /| RShift) | + * |-----------------------------------------------------------| + * |Ctrl|Gui |Alt | Space |Fn0 |Gui |App|Ctrl| + * `-----------------------------------------------------------' + */ + [0] = LAYOUT_60_ansi( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ + LT(2, KC_TAB), KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \ + LT(1, KC_CAPS), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ + KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(1), KC_RGUI, KC_APP, KC_RCTL), + + /* + Keymap 1: FN Layer + AGSW swaps Alt and OS keys for Windows/Mac + RGB enabled + Backlight keys are swapped as firmware is backwards? + * ,-----------------------------------------------------------. + * |` | F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12| Del | + * |-----------------------------------------------------------| + * | | |Up |RGB|HUI|SAI|VAI| |Prt|Scl|Pau|Up| | Ins | + * |-----------------------------------------------------------| + * | |Lft|Dwn|Rig|HUD|SAD|VAD| |Hme|PgU|Lef|Rig| | + * |-----------------------------------------------------------| + * | |BLD|BLT|BLI| |VolD|VolU|Mut|End|PgD|Dwn| RESET | + * |-----------------------------------------------------------| + * | | | | | |AGSW| | | + * `-----------------------------------------------------------' + */ + + [1] = LAYOUT_60_ansi( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, \ + KC_TRNS, KC_TRNS, KC_UP, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, KC_TRNS, KC_INS, \ + KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, RGB_HUD, RGB_SAD, RGB_VAD, KC_TRNS, KC_HOME, KC_PGUP, KC_LEFT, KC_RIGHT, KC_TRNS, \ + KC_TRNS, BL_INC, BL_STEP, BL_DEC, KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_END, KC_PGDN, KC_DOWN, RESET, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, AG_SWAP, KC_TRNS, KC_TRNS), + +/* +Mouse Layer +M1 = Mouse Button 1 +M2 = Mouse Button 2 +WASD are Up Left Right Down respectively +* ,-----------------------------------------------------------. +* | | | | | | | | | | | | | | | +* |-----------------------------------------------------------| +* | | M1|MUP|M2 | | | | | | | |MPLY| | | +* |-----------------------------------------------------------| +* | |ML |MDN|MR | | | | | | |MPRV|MNXT| | +* |-----------------------------------------------------------| +* | | | | | | | | | | | | | +* |-----------------------------------------------------------| +* | | | | | | | | | +* `-----------------------------------------------------------' +*/ + [2] = LAYOUT_60_ansi( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_BTN1, KC_MS_U, KC_BTN2, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + +}; + +void led_set_user(uint8_t usb_led) { + if (usb_led & (1< Date: Tue, 25 Sep 2018 18:16:35 -0400 Subject: [PATCH 135/788] Pin avr-gcc in shell.nix pending release of 8.3.0 (#3922) * Pin avr-gcc in shell.nix pending release of 8.3.0 There's apparently a critical bug in 8.2.0, which is now the nixpkgs default. This change overrides that default in favor of the known good version. Once 8.3.0 is the default, the override can be dropped. * Arch/Manjaro fix --- shell.nix | 7 +++++++ util/linux_install.sh | 4 +++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/shell.nix b/shell.nix index 715414f96..67efb46b7 100644 --- a/shell.nix +++ b/shell.nix @@ -13,6 +13,13 @@ let "-B${avrlibc}/avr/lib/avr51" "-L${avrlibc}/avr/lib/avr51" ]; + avrgcc = pkgs.avrgcc.overrideAttrs (oldAttrs: rec { + name = "avr-gcc-8.1.0"; + src = fetchurl { + url = "mirror://gcc/releases/gcc-8.1.0/gcc-8.1.0.tar.xz"; + sha256 = "0lxil8x0jjx7zbf90cy1rli650akaa6hpk8wk8s62vk2jbwnc60x"; + }; + }); in stdenv.mkDerivation { diff --git a/util/linux_install.sh b/util/linux_install.sh index d5da59e82..9b8b92d08 100755 --- a/util/linux_install.sh +++ b/util/linux_install.sh @@ -10,7 +10,9 @@ elif grep ID /etc/os-release | grep -q debian; then dfu-programmer dfu-util gcc-arm-none-eabi binutils-arm-none-eabi \ libnewlib-arm-none-eabi elif grep ID /etc/os-release | grep -q 'arch\|manjaro'; then - sudo pacman -S gcc unzip wget zip avr-gcc avr-binutils avr-libc \ + # install avr-gcc 8.1 until 8.3 is available. See #3657 for details of the bug. + sudo pacman -U https://archive.archlinux.org/packages/a/avr-gcc/avr-gcc-8.1.0-1-x86_64.pkg.tar.xz + sudo pacman -S gcc unzip wget zip avr-binutils avr-libc \ dfu-util arm-none-eabi-gcc arm-none-eabi-binutils \ arm-none-eabi-newlib git clone https://aur.archlinux.org/dfu-programmer.git /tmp/dfu-programmer From 6347a654de1ac00f6feb02e0a95b62a42aed406f Mon Sep 17 00:00:00 2001 From: takashi kono Date: Wed, 26 Sep 2018 07:18:11 +0900 Subject: [PATCH 136/788] Keymap: Ergo42: biacco-winjp (#3935) * create: biacco jis keymap for windows for Ergo42 * fix: biacco-winjp: change #ifndef to #pragma once. * fix: following: 3935#pullrequestreview-157941685 --- .../ergo42/keymaps/biacco-winjp/config.h | 33 +++++++ .../ergo42/keymaps/biacco-winjp/keymap.c | 95 +++++++++++++++++++ 2 files changed, 128 insertions(+) create mode 100644 keyboards/ergo42/keymaps/biacco-winjp/config.h create mode 100644 keyboards/ergo42/keymaps/biacco-winjp/keymap.c diff --git a/keyboards/ergo42/keymaps/biacco-winjp/config.h b/keyboards/ergo42/keymaps/biacco-winjp/config.h new file mode 100644 index 000000000..360d6a562 --- /dev/null +++ b/keyboards/ergo42/keymaps/biacco-winjp/config.h @@ -0,0 +1,33 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#pragma once + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + diff --git a/keyboards/ergo42/keymaps/biacco-winjp/keymap.c b/keyboards/ergo42/keymaps/biacco-winjp/keymap.c new file mode 100644 index 000000000..5dbca3bfc --- /dev/null +++ b/keyboards/ergo42/keymaps/biacco-winjp/keymap.c @@ -0,0 +1,95 @@ +// WindowsでJIS配列として認識しているときに、US配列として使うためのキーマップ +// hdbx から2行コピーさせて頂きました。 + +#include QMK_KEYBOARD_H +#include "keymap_jp.h" // qmk_firmware-master/quantum/keymap_extras/keymap_jp.h 日本語キーボード設定用 +// マクロが必要になったらコメントインすること +// #include // macro sendstring for jis keyboard マクロ文字列送信時に日本語キーボード設定での文字化け回避> + +extern keymap_config_t keymap_config; + +#define BASE 0 +#define META 1 +#define SYMB 2 +#define GAME 3 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* BASE + * ,------------------------------------------------. ,------------------------------------------------. + * | Tab | Q | W | E | R | T | [ | | ] | Y | U | I | O | P | @ | + * |------+------+------+------+------+------+------| |-------------+------+------+------+------+------| + * | Alt | A | S | D | F | G | ( | | ) | H | J | K | L | ; | : | + * |------+------+------+------+------+------+------| |------|------+------+------+------+------+------| + * | Sft | Z | X | C | V | B | { | | } | N | M | , | . | / |\/Sft | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | Ctrl | GUI | App |PrtSc |ESC/ |Space/|Tab/ | |Back |Enter/| Del |PrtSc |=>GAME|=>SYMB| \ | + * | | | | |~SYMB |RCtrl |Shift | |Space |~META | | | | | | + * `------------------------------------------------' `------------------------------------------------' + */ + [BASE] = LAYOUT( \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_RBRC, KC_BSLS, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, \ + KC_LALT, KC_A, KC_S, KC_D, KC_F, KC_G, S(KC_8), S(KC_9), KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, S(KC_RBRC), S(KC_BSLS), KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_RO), \ + KC_LCTRL, KC_LGUI, KC_APP, KC_PSCR, LT(SYMB, KC_ESC), RCTL_T(KC_SPC), SFT_T(KC_TAB), KC_BSPC, LT(META, KC_ENT), KC_DELT, KC_PSCR, TG(GAME), TG(SYMB), KC_JYEN \ + ), + + /* META + * ,------------------------------------------------. ,------------------------------------------------. + * | 1 | 2 | 3 | 4 | 5 | 6 | [ | | ] | 7 | 8 | 9 | 0 | - | ^ | + * |------+------+------+------+------+------+------| |-------------+------+------+------+------+------| + * | Alt | F1 | |Muhen | Henk | | ( | | ) | Left | Down | Up |Right | | | + * |------+------+------+------+------+------+------| |------|------+------+------+------+------+------| + * | Sft | F2 | F3 | F4 | F5 | F6 | { | | } | F7 | F8 | F9 | F10 | F11 |\/Sft | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | Ctrl | GUI | App |PrtSc |ESC/ |Space/|Tab/ | |Back |Enter/| Del |Reset |=>GAME|=>SYMB| \ | + * | | | | |~SYMB |RCtrl |Shift | |Space |~META | | | | | | + * `------------------------------------------------' `------------------------------------------------' + */ + [META] = LAYOUT( \ + KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, _______, _______, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, \ + _______, KC_F1, XXXXXXX, KC_MHEN, KC_HENK, XXXXXXX, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, XXXXXXX, XXXXXXX, \ + _______, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, _______, _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, SFT_T(KC_RO), \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET, _______, _______, _______ \ + ), + + /* SYMB + * ,------------------------------------------------. ,------------------------------------------------. + * | ! | " | # | $ | % | & | [ | | ] | ' | ( | ) | ~ | = | ~ | + * |------+------+------+------+------+------+------| |-------------+------+------+------+------+------| + * | Alt | | | | | | ( | | ) | | | | | + | * | + * |------+------+------+------+------+------+------| |------|------+------+------+------+------+------| + * | Sft | | | | | | { | | } | | | < | > | ? | \ | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | Ctrl | GUI | App |PrtSc |ESC/ |Space/|Tab/ | |Back |Enter/| Del |PrtSc |=>GAME|=>SYMB| \ | + * | | | | |~SYMB |RCtrl |Shift | |Space |~META | | | | | | + * `------------------------------------------------' `------------------------------------------------' + */ + [SYMB] = LAYOUT( \ + S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), _______, _______, S(KC_7), S(KC_8), S(KC_9), S(KC_0), S(KC_MINS), S(KC_EQL), \ + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, S(KC_SCLN), S(KC_QUOT), \ + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, S(KC_COMM), S(KC_DOT), S(KC_SLSH), S(KC_RO), \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), + + /* GAME + * ,------------------------------------------------. ,------------------------------------------------. + * | Tab | Q | W | E | R | T | [ | | ] | Y | U | I | O | P | @ | + * |------+------+------+------+------+------+------| |-------------+------+------+------+------+------| + * | Alt | A | S | D | F | G | ( | | ) | H | J | K | L | ; | : | + * |------+------+------+------+------+------+------| |------|------+------+------+------+------+------| + * | Sft | Z | X | C | V | B | { | | } | N | M | , | . | / |\/Sft | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | Ctrl | GUI | App |PrtSc | ESC |Space |Tab | |Back |Enter | Del |PrtSc |=>GAME|=>SYMB| \ | + * | | | | | | | | |Space | | | | | | | + * `------------------------------------------------' `------------------------------------------------' + */ + [GAME] = LAYOUT( \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_RBRC, KC_BSLS, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, \ + KC_LALT, KC_A, KC_S, KC_D, KC_F, KC_G, S(KC_8), S(KC_9), KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, S(KC_RBRC), S(KC_BSLS), KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_RO), \ + KC_LCTRL, KC_LGUI, KC_APP, KC_PSCR, KC_ESC, KC_SPC, KC_TAB, KC_BSPC, KC_ENT, KC_DELT, KC_PSCR, _______, _______, KC_JYEN \ + ) + +}; + From 118e948e355b784b22f94378b5f85285e6dd4634 Mon Sep 17 00:00:00 2001 From: johanntang Date: Tue, 25 Sep 2018 15:23:31 -0700 Subject: [PATCH 137/788] Keyboard: added mehkee96 support -JT (#3957) * added mehkee96 support -JT * making requested changes -JT * fixes -jt * fixed info.json -JT * tidy up info.json comments from noroadsleft -JT --- keyboards/mehkee96/config.h | 18 + keyboards/mehkee96/i2c.c | 106 ++++++ keyboards/mehkee96/i2c.h | 27 ++ keyboards/mehkee96/info.json | 12 + keyboards/mehkee96/keymaps/default/keymap.c | 80 ++++ keyboards/mehkee96/keymaps/johann/keymap.c | 80 ++++ keyboards/mehkee96/matrix.c | 130 +++++++ keyboards/mehkee96/mehkee96.c | 81 ++++ keyboards/mehkee96/mehkee96.h | 24 ++ keyboards/mehkee96/program | 105 ++++++ keyboards/mehkee96/readme.md | 16 + keyboards/mehkee96/rules.mk | 35 ++ keyboards/mehkee96/usbconfig.h | 396 ++++++++++++++++++++ keyboards/melody96/keymaps/default/keymap.c | 6 - 14 files changed, 1110 insertions(+), 6 deletions(-) create mode 100644 keyboards/mehkee96/config.h create mode 100644 keyboards/mehkee96/i2c.c create mode 100644 keyboards/mehkee96/i2c.h create mode 100644 keyboards/mehkee96/info.json create mode 100644 keyboards/mehkee96/keymaps/default/keymap.c create mode 100644 keyboards/mehkee96/keymaps/johann/keymap.c create mode 100644 keyboards/mehkee96/matrix.c create mode 100644 keyboards/mehkee96/mehkee96.c create mode 100644 keyboards/mehkee96/mehkee96.h create mode 100644 keyboards/mehkee96/program create mode 100644 keyboards/mehkee96/readme.md create mode 100644 keyboards/mehkee96/rules.mk create mode 100644 keyboards/mehkee96/usbconfig.h diff --git a/keyboards/mehkee96/config.h b/keyboards/mehkee96/config.h new file mode 100644 index 000000000..70ca273c3 --- /dev/null +++ b/keyboards/mehkee96/config.h @@ -0,0 +1,18 @@ +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0x20A0 +#define PRODUCT_ID 0x422D +#define MANUFACTURER mehkee +#define PRODUCT 96kee + +/* matrix size */ +#define MATRIX_ROWS 8 +#define MATRIX_COLS 15 + +#define RGBLED_NUM 16 +#define RGBLIGHT_ANIMATIONS +/* key combination for command */ +#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) diff --git a/keyboards/mehkee96/i2c.c b/keyboards/mehkee96/i2c.c new file mode 100644 index 000000000..a4f952135 --- /dev/null +++ b/keyboards/mehkee96/i2c.c @@ -0,0 +1,106 @@ +/* +Copyright 2016 Luiz Ribeiro + +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 . +*/ + +// Please do not modify this file + +#include +#include + +#include "i2c.h" + +void i2c_set_bitrate(uint16_t bitrate_khz) { + uint8_t bitrate_div = ((F_CPU / 1000l) / bitrate_khz); + if (bitrate_div >= 16) { + bitrate_div = (bitrate_div - 16) / 2; + } + TWBR = bitrate_div; +} + +void i2c_init(void) { + // set pull-up resistors on I2C bus pins + PORTC |= 0b11; + + i2c_set_bitrate(400); + + // enable TWI (two-wire interface) + TWCR |= (1 << TWEN); + + // enable TWI interrupt and slave address ACK + TWCR |= (1 << TWIE); + TWCR |= (1 << TWEA); +} + +uint8_t i2c_start(uint8_t address) { + // reset TWI control register + TWCR = 0; + + // begin transmission and wait for it to end + TWCR = (1< + +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 . +*/ + +// Please do not modify this file + +#ifndef __I2C_H__ +#define __I2C_H__ + +void i2c_init(void); +void i2c_set_bitrate(uint16_t bitrate_khz); +uint8_t i2c_send(uint8_t address, uint8_t *data, uint16_t length); + +#endif diff --git a/keyboards/mehkee96/info.json b/keyboards/mehkee96/info.json new file mode 100644 index 000000000..75da3e591 --- /dev/null +++ b/keyboards/mehkee96/info.json @@ -0,0 +1,12 @@ +{ + "keyboard_name": "mehkee96", + "url": "", + "maintainer": "qmk", + "width": 19, + "height": 6, + "layouts": { + "LAYOUT": { + "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"F1", "x":1, "y":0}, {"label":"F2", "x":2, "y":0}, {"label":"F3", "x":3, "y":0}, {"label":"F4", "x":4, "y":0}, {"label":"F5", "x":5, "y":0}, {"label":"F6", "x":6, "y":0}, {"label":"F7", "x":7, "y":0}, {"label":"F8", "x":8, "y":0}, {"label":"F9", "x":9, "y":0}, {"label":"F10", "x":10, "y":0}, {"label":"F11", "x":11, "y":0}, {"label":"F12", "x":12, "y":0}, {"label":"Print Screen", "x":13, "y":0}, {"label":"Delete", "x":14, "y":0}, {"label":"Home", "x":15, "y":0}, {"label":"End", "x":16, "y":0}, {"label":"Page Up", "x":17, "y":0}, {"label":"Page Down", "x":18, "y":0}, {"label":"`", "x":0, "y":1}, {"label":"1", "x":1, "y":1}, {"label":"2", "x":2, "y":1}, {"label":"3", "x":3, "y":1}, {"label":"4", "x":4, "y":1}, {"label":"5", "x":5, "y":1}, {"label":"6", "x":6, "y":1}, {"label":"7", "x":7, "y":1}, {"label":"8", "x":8, "y":1}, {"label":"9", "x":9, "y":1}, {"label":"0", "x":10, "y":1}, {"label":"-", "x":11, "y":1}, {"label":"=", "x":12, "y":1}, {"label":"Backspace", "x":13, "y":1, "w":2}, {"label":"Num Lock", "x":15, "y":1}, {"label":"P/", "x":16, "y":1}, {"label":"P*", "x":17, "y":1}, {"label":"P-", "x":18, "y":1}, {"label":"Tab", "x":0, "y":2, "w":1.5}, {"label":"Q", "x":1.5, "y":2}, {"label":"W", "x":2.5, "y":2}, {"label":"E", "x":3.5, "y":2}, {"label":"R", "x":4.5, "y":2}, {"label":"T", "x":5.5, "y":2}, {"label":"Y", "x":6.5, "y":2}, {"label":"U", "x":7.5, "y":2}, {"label":"I", "x":8.5, "y":2}, {"label":"O", "x":9.5, "y":2}, {"label":"P", "x":10.5, "y":2}, {"label":"[", "x":11.5, "y":2}, {"label":"]", "x":12.5, "y":2}, {"label":"\\", "x":13.5, "y":2, "w":1.5}, {"label":"P7", "x":15, "y":2}, {"label":"P8", "x":16, "y":2}, {"label":"P9", "x":17, "y":2}, {"label":"P+", "x":18, "y":2}, {"label":"Caps Lock", "x":0, "y":3, "w":1.75}, {"label":"A", "x":1.75, "y":3}, {"label":"S", "x":2.75, "y":3}, {"label":"D", "x":3.75, "y":3}, {"label":"F", "x":4.75, "y":3}, {"label":"G", "x":5.75, "y":3}, {"label":"H", "x":6.75, "y":3}, {"label":"J", "x":7.75, "y":3}, {"label":"K", "x":8.75, "y":3}, {"label":"L", "x":9.75, "y":3}, {"label":";", "x":10.75, "y":3}, {"label":"'", "x":11.75, "y":3}, {"label":"Enter", "x":12.75, "y":3, "w":2.25}, {"label":"P4", "x":15, "y":3}, {"label":"P5", "x":16, "y":3}, {"label":"P6", "x":17, "y":3}, {"label":"P+", "x":18, "y":3}, {"label":"Shift", "x":0, "y":4, "w":2.25}, {"label":"Z", "x":2.25, "y":4}, {"label":"X", "x":3.25, "y":4}, {"label":"C", "x":4.25, "y":4}, {"label":"V", "x":5.25, "y":4}, {"label":"B", "x":6.25, "y":4}, {"label":"N", "x":7.25, "y":4}, {"label":"M", "x":8.25, "y":4}, {"label":",", "x":9.25, "y":4}, {"label":".", "x":10.25, "y":4}, {"label":"/", "x":11.25, "y":4}, {"label":"Shift", "x":12.25, "y":4, "w":1.75}, {"label":"Up", "x":14, "y":4}, {"label":"P1", "x":15, "y":4}, {"label":"P2", "x":16, "y":4}, {"label":"P3", "x":17, "y":4}, {"label":"PEnter", "x":18, "y":4}, {"label":"Ctrl", "x":0, "y":5, "w":1.25}, {"label":"Win", "x":1.25, "y":5, "w":1.25}, {"label":"Alt", "x":2.5, "y":5, "w":1.25}, {"x":3.75, "y":5, "w":6.25}, {"label":"Alt", "x":10, "y":5}, {"label":"Win", "x":11, "y":5}, {"label":"Fn", "x":12, "y":5}, {"label":"Left", "x":13, "y":5}, {"label":"Down", "x":14, "y":5}, {"label":"Right", "x":15, "y":5}, {"label":"P0", "x":16, "y":5}, {"label":"P.", "x":17, "y":5}, {"label":"PEnter", "x":18, "y":5}] + } + } +} diff --git a/keyboards/mehkee96/keymaps/default/keymap.c b/keyboards/mehkee96/keymaps/default/keymap.c new file mode 100644 index 000000000..cd69fb2fe --- /dev/null +++ b/keyboards/mehkee96/keymaps/default/keymap.c @@ -0,0 +1,80 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* Layer 0, default layer +____________________________________________________________________________________________________________________________________________________________________________ +| | | | | | | | | | | | | | | | | | | | +| ESC* | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | P SCN | DEL | HOME | END | P Up | P Down | +|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________| +| | | | | | | | | | | | | | | BACK | NUM | | | | +| ~` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | _ - | = + | \ | SPACE | LOCK | / | * | - | +|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________| +| | | | | | | | | | | | [ | ] | | | | | | +| TAB | Q | W | E | R | T | Y | U | I | O | P | { | } | | \ | 7 | 8 | 9 | + | +|____________|________|________|________|________|________|________|________|________|________|________|________|________|_____________|________|________|________|________| +| | | | | | | | | | | ; | ' | | | | | | +| CAPS LOCK | A | S | D | F | G | H | J | K | L | : | " | ENTER | 4 | 5 | 6 | + | +|______________|________|________|________|________|________|________|________|________|________|________|________|____________________|________|________|________|________| +| | | | | | | | | , | . | / | | | | | | | +| SHIFT | Z | X | C | V | B | N | M | < | > | ? | SHIFT | UP | 1 | 2 | 3 | ENTER | +|__________________|________|________|________|________|________|________|________|________|________|________|________________|________|________|________|________|________| +| | | | | | | MO | | | | | | | +| CTRL | LGUI | L ALT | SPACE | R ALT | RGUI | _FN | LEFT | DOWN | RIGHT | 0 | . | ENTER | +|__________|__________|__________|________________________________________________________|________|________|________|________|________|________|________|________|________| +*/ + + + + LAYOUT( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_DEL, KC_HOME, KC_END, KC_PGUP, KC_PGDN, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PPLS, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(1), KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT), + + + + /* Layer 1, function layer +____________________________________________________________________________________________________________________________________________________________________________ +| | | | | | | | | | | | | | | VOL | VOL | | | | +| RESET | | | | | | | | | | | | | MUTE | DOWN | UP | | | | +|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________| +| | | | | | | | | | | | | | | | | | | | +| | | | | | | | | | | | | | | | | | | | +|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________| +| | RGB | | RGB | HUE | HUE | SATUR. | SATUR. | VALUE | VALUE | | | | | | | | | +| | TOGGLE | | MODE |INCREASE| DCRSE |INCREASE| DCRSE |INCREASE| DCRSE | | | | | | | | | +|____________|________|________|________|________|________|________|________|________|________|________|________|________|_____________|________|________|________|________| +| BACKLIGHT | | | | | | | | | | | | | | | | | +| TOGGLE | | | | | | | | | | | | | | | | | +|______________|________|________|________|________|________|________|________|________|________|________|________|____________________|________|________|________|________| +| | | | |BACKLHT |BACKLHT |BACKLHT | | | | | | | | | | | | +| | | | | DCRSE |TOGGLE |INCREASE| | | | | | | | | | | | +|_________|________|________|________|________|________|________|________|________|________|________|________|________________|________|________|________|________|________| +| | | | | | | | | | | | | | +| | | | | | | | | | | | | | +|__________|__________|__________|________________________________________________________|________|________|________|________|________|________|________|________|________| +BL_TOGG, BL_DEC, BL_INC changes the in-switch LEDs +*/ + + + LAYOUT( + RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RGB_TOG, _______, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, _______, _______, _______, + BL_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______ , _______, _______, BL_DEC, BL_TOGG, BL_INC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), +}; + +void matrix_init_user(void) { +} + +void matrix_scan_user(void) { +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} diff --git a/keyboards/mehkee96/keymaps/johann/keymap.c b/keyboards/mehkee96/keymaps/johann/keymap.c new file mode 100644 index 000000000..a0212702a --- /dev/null +++ b/keyboards/mehkee96/keymaps/johann/keymap.c @@ -0,0 +1,80 @@ +#include "mehkee96.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* Layer 0, default layer +____________________________________________________________________________________________________________________________________________________________________________ +| | | | | | | | | | | | | | | | | | | | +| ESC* | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | P SCN | HOME | DEL | INSERT | P Up | P Down | +|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________| +| | | | | | | | | | | | | | | BACK | NUM | | | Play | +| ~` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | _ - | = + | \ | SPACE | LOCK | / | * | Pause | +|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________| +| | | | | | | | | | | | [ | ] | | | | | | +| TAB | Q | W | E | R | T | Y | U | I | O | P | { | } | | \ | 7 | 8 | 9 | Next | +|____________|________|________|________|________|________|________|________|________|________|________|________|________|_____________|________|________|________|________| +| | | | | | | | | | | ; | ' | | | | | | +| CAPS LOCK | A | S | D | F | G | H | J | K | L | : | " | ENTER | 4 | 5 | 6 | - | +|______________|________|________|________|________|________|________|________|________|________|________|________|____________________|________|________|________|________| +| | | | | | | | | , | . | / | | | | | | | +| SHIFT | Z | X | C | V | B | N | M | < | > | ? | SHIFT | UP | 1 | 2 | 3 | + | +|__________________|________|________|________|________|________|________|________|________|________|________|________________|________|________|________|________|________| +| | | | | | | MO | | | | | | | +| CTRL | LGUI | L ALT | SPACE | R ALT | RGUI | _FN | LEFT | DOWN | RIGHT | 0 | . | ENTER | +|__________|__________|__________|________________________________________________________|________|________|________|________|________|________|________|________|________| +*/ + + + + LAYOUT( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_HOME, KC_DEL, KC_INS, KC_PGUP, KC_PGDN, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_MPLY, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_MNXT, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PMNS, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PPLS, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(1), KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT), + + + + /* Layer 1, function layer +____________________________________________________________________________________________________________________________________________________________________________ +| | | | | | | | | | | | | | | VOL | VOL | | | | +| RESET | | | | | | | | | | | | | MUTE | DOWN | UP | | | | +|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________| +| | | | | | | | | | | | | | | | | | | | +| | | | | | | | | | | | | | | | | | | | +|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________| +| | RGB | | RGB | HUE | HUE | SATUR. | SATUR. | VALUE | VALUE | | | | | | | | | +| | TOGGLE | | MODE |INCREASE| DCRSE |INCREASE| DCRSE |INCREASE| DCRSE | | | | | | | | | +|____________|________|________|________|________|________|________|________|________|________|________|________|________|_____________|________|________|________|________| +| BACKLIGHT | | | | | | | | | | | | | | | | | +| TOGGLE | | | | | | | | | | | | | | | | | +|______________|________|________|________|________|________|________|________|________|________|________|________|____________________|________|________|________|________| +| | | | |BACKLHT |BACKLHT |BACKLHT | | | | | | | | | | | | +| | | | | DCRSE |TOGGLE |INCREASE| | | | | | | | | | | | +|_________|________|________|________|________|________|________|________|________|________|________|________|________________|________|________|________|________|________| +| | | | | | | | | | | | | | +| | | | | | | | | | | | | | +|__________|__________|__________|________________________________________________________|________|________|________|________|________|________|________|________|________| +BL_TOGG, BL_DEC, BL_INC changes the in-switch LEDs +*/ + + + LAYOUT( + RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RGB_TOG, _______, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, _______, _______, _______, + BL_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______ , _______, _______, BL_DEC, BL_TOGG, BL_INC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), +}; + +void matrix_init_user(void) { +} + +void matrix_scan_user(void) { +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} diff --git a/keyboards/mehkee96/matrix.c b/keyboards/mehkee96/matrix.c new file mode 100644 index 000000000..bbb84e52e --- /dev/null +++ b/keyboards/mehkee96/matrix.c @@ -0,0 +1,130 @@ +/* +Copyright 2017 Luiz Ribeiro + +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 . +*/ + +#include +#include + +#include "matrix.h" + +#ifndef DEBOUNCE +# define DEBOUNCE 5 +#endif + +static uint8_t debouncing = DEBOUNCE; + +static matrix_row_t matrix[MATRIX_ROWS]; +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; + +void matrix_set_row_status(uint8_t row); +uint8_t bit_reverse(uint8_t x); + +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + +void matrix_init(void) { + // all outputs for rows high + DDRB = 0xFF; + PORTB = 0xFF; + // all inputs for columns + DDRA = 0x00; + DDRC &= ~(0x111111<<2); + DDRD &= ~(1< 7 + (~PINA) & 0xFF + ) | ( + // cols 8..13, PORTC 7 -> 0 + bit_reverse((~PINC) & 0xFF) << 8 + ) | ( + // col 14, PORTD 7 + ((~PIND) & (1 << PIND7)) << 7 + ); + + if (matrix_debouncing[row] != cols) { + matrix_debouncing[row] = cols; + debouncing = DEBOUNCE; + } + } + + if (debouncing) { + if (--debouncing) { + _delay_ms(1); + } else { + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + matrix[i] = matrix_debouncing[i]; + } + } + } + + matrix_scan_quantum(); + + return 1; +} + +// declarations +void matrix_set_row_status(uint8_t row) { + DDRB = (1 << row); + PORTB = ~(1 << row); +} + +uint8_t bit_reverse(uint8_t x) { + x = ((x >> 1) & 0x55) | ((x << 1) & 0xaa); + x = ((x >> 2) & 0x33) | ((x << 2) & 0xcc); + x = ((x >> 4) & 0x0f) | ((x << 4) & 0xf0); + return x; +} + +inline matrix_row_t matrix_get_row(uint8_t row) { + return matrix[row]; +} + +void matrix_print(void) { +} diff --git a/keyboards/mehkee96/mehkee96.c b/keyboards/mehkee96/mehkee96.c new file mode 100644 index 000000000..604fad803 --- /dev/null +++ b/keyboards/mehkee96/mehkee96.c @@ -0,0 +1,81 @@ +/* +Copyright 2017 Luiz Ribeiro + +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 . +*/ + +#include "mehkee96.h" +#include "rgblight.h" + +#include + +#include "action_layer.h" +#include "i2c.h" +#include "quantum.h" + +// for keyboard subdirectory level init functions +// @Override +void matrix_init_kb(void) { + // call user level keymaps, if any + matrix_init_user(); +} + +#ifdef RGBLIGHT_ENABLE +extern rgblight_config_t rgblight_config; + +// custom RGB driver +void rgblight_set(void) { + if (!rgblight_config.enable) { + for (uint8_t i=0; i, Sebastian Kaim +# +# 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 . + +from __future__ import print_function + +import os +import sys +import time +import usb + + +def checkForKeyboardInNormalMode(): + """Returns a device if a ps2avrGB device in normal made (that is in keyboard mode) or None if it is not found.""" + return usb.core.find(idVendor=0x20A0, idProduct=0x422D) + +def checkForKeyboardInBootloaderMode(): + """Returns True if a ps2avrGB device in bootloader (flashable) mode is found and False otherwise.""" + return (usb.core.find(idVendor=0x16c0, idProduct=0x05df) is not None) + +def flashKeyboard(firmware_file): + """Calls bootloadHID to flash the given file to the device.""" + print('Flashing firmware to device ...') + if os.system('bootloadHID -r "%s"' % firmware_file) == 0: + print('\nDone!') + else: + print('\nbootloadHID returned an error.') + +def printDeviceInfo(dev): + """Prints all infos for a given USB device""" + print('Device Information:') + print(' idVendor: %d (0x%04x)' % (dev.idVendor, dev.idVendor)) + print(' idProduct: %d (0x%04x)' % (dev.idProduct, dev.idProduct)) + print('Manufacturer: %s' % (dev.iManufacturer)) + print('Serial: %s' % (dev.iSerialNumber)) + print('Product: %s' % (dev.iProduct), end='\n\n') + +def sendDeviceToBootloaderMode(dev): + """Tries to send a given ps2avrGB keyboard to bootloader mode to allow flashing.""" + try: + dev.set_configuration() + + request_type = usb.util.build_request_type( + usb.util.CTRL_OUT, + usb.util.CTRL_TYPE_CLASS, + usb.util.CTRL_RECIPIENT_DEVICE) + + USBRQ_HID_SET_REPORT = 0x09 + HID_REPORT_OPTION = 0x0301 + + dev.ctrl_transfer(request_type, USBRQ_HID_SET_REPORT, HID_REPORT_OPTION, 0, [0, 0, 0xFF] + [0] * 5) + except usb.core.USBError: + # for some reason I keep getting USBError, but it works! + pass + + +if len(sys.argv) < 2: + print('Usage: %s ' % sys.argv[0]) + sys.exit(1) + +kb = checkForKeyboardInNormalMode() + +if kb is not None: + print('Found a keyboard in normal mode. Attempting to send it to bootloader mode ...', end='') + sendDeviceToBootloaderMode(kb) + print(' done.') + print("Hint: If your keyboard can't be set to bootloader mode automatically, plug it in while pressing the bootloader key to do so manually.") + print(" You can find more infos about this here: https://github.com/qmk/qmk_firmware/tree/master/keyboards/ps2avrGB#setting-the-board-to-bootloader-mode") + +attempts = 12 # 60 seconds +found = False +for attempt in range(1, attempts + 1): + print("Searching for keyboard in bootloader mode (%i/%i) ... " % (attempt, attempts), end='') + + if checkForKeyboardInBootloaderMode(): + print('Found', end='\n\n') + flashKeyboard(sys.argv[1]) + found = True + break + else: + print('Nothing.', end='') + + if attempt != attempts: # no need to wait on the last attempt + print(' Sleeping 5 seconds.', end='') + time.sleep(5) + + # print a newline + print() + +if not found: + print("Couldn't find a flashable keyboard. Aborting.") + sys.exit(2) + diff --git a/keyboards/mehkee96/readme.md b/keyboards/mehkee96/readme.md new file mode 100644 index 000000000..9dfad2a79 --- /dev/null +++ b/keyboards/mehkee96/readme.md @@ -0,0 +1,16 @@ +# Mehkee 96KEE + +![mehkee96](https://cdn.shopify.com/s/files/1/1799/1839/products/96KEE_-_1_-_Copy_1024x1024.jpg?v=1516262148) + +96-key Keyboard from mehkee + +Keyboard Maintainer: [johanntang](https://github.com/johanntang) +Hardware Supported: mehkee96 +Hardware Availability: [mehkee, group buy closed](https://mehkee.com/products/96kee?variant=46912017423) + +Make example for this keyboard (after setting up your build environment): + + make mehkee96:default + +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). + diff --git a/keyboards/mehkee96/rules.mk b/keyboards/mehkee96/rules.mk new file mode 100644 index 000000000..e6e7d4a58 --- /dev/null +++ b/keyboards/mehkee96/rules.mk @@ -0,0 +1,35 @@ +# MCU name +MCU = atmega32a +PROTOCOL = VUSB + +# unsupported features for now +NO_UART = yes +NO_SUSPEND_POWER_DOWN = yes + +# Processor frequency. +F_CPU = 12000000 + +# Bootloader +BOOTLOADER = bootloadHID + + +# Build Options +# comment out to disable the options. +# +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +RGBLIGHT_ENABLE = yes +RGBLIGHT_CUSTOM_DRIVER = yes + +OPT_DEFS = -DDEBUG_LEVEL=0 + +# custom matrix setup +CUSTOM_MATRIX = yes +SRC = matrix.c i2c.c + +# programming options +PROGRAM_CMD = ./keyboards/mehkee96/program $(TARGET).hex diff --git a/keyboards/mehkee96/usbconfig.h b/keyboards/mehkee96/usbconfig.h new file mode 100644 index 000000000..d2d848fcd --- /dev/null +++ b/keyboards/mehkee96/usbconfig.h @@ -0,0 +1,396 @@ +/* Name: usbconfig.h + * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers + * Author: Christian Starkjohann + * Creation Date: 2005-04-01 + * Tabsize: 4 + * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $ + */ + +#ifndef __usbconfig_h_included__ +#define __usbconfig_h_included__ + +#include "config.h" + +/* +General Description: +This file is an example configuration (with inline documentation) for the USB +driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is +also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may +wire the lines to any other port, as long as D+ is also wired to INT0 (or any +other hardware interrupt, as long as it is the highest level interrupt, see +section at the end of this file). +*/ + +/* ---------------------------- Hardware Config ---------------------------- */ + +#define USB_CFG_IOPORTNAME D +/* This is the port where the USB bus is connected. When you configure it to + * "B", the registers PORTB, PINB and DDRB will be used. + */ +#define USB_CFG_DMINUS_BIT 3 +/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected. + * This may be any bit in the port. + */ +#define USB_CFG_DPLUS_BIT 2 +/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected. + * This may be any bit in the port. Please note that D+ must also be connected + * to interrupt pin INT0! [You can also use other interrupts, see section + * "Optional MCU Description" below, or you can connect D- to the interrupt, as + * it is required if you use the USB_COUNT_SOF feature. If you use D- for the + * interrupt, the USB interrupt will also be triggered at Start-Of-Frame + * markers every millisecond.] + */ +#define USB_CFG_CLOCK_KHZ (F_CPU/1000) +/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000, + * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code + * require no crystal, they tolerate +/- 1% deviation from the nominal + * frequency. All other rates require a precision of 2000 ppm and thus a + * crystal! + * Since F_CPU should be defined to your actual clock rate anyway, you should + * not need to modify this setting. + */ +#define USB_CFG_CHECK_CRC 0 +/* Define this to 1 if you want that the driver checks integrity of incoming + * data packets (CRC checks). CRC checks cost quite a bit of code size and are + * currently only available for 18 MHz crystal clock. You must choose + * USB_CFG_CLOCK_KHZ = 18000 if you enable this option. + */ + +/* ----------------------- Optional Hardware Config ------------------------ */ + +/* #define USB_CFG_PULLUP_IOPORTNAME D */ +/* If you connect the 1.5k pullup resistor from D- to a port pin instead of + * V+, you can connect and disconnect the device from firmware by calling + * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h). + * This constant defines the port on which the pullup resistor is connected. + */ +/* #define USB_CFG_PULLUP_BIT 4 */ +/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined + * above) where the 1.5k pullup resistor is connected. See description + * above for details. + */ + +/* --------------------------- Functional Range ---------------------------- */ + +#define USB_CFG_HAVE_INTRIN_ENDPOINT 1 +/* Define this to 1 if you want to compile a version with two endpoints: The + * default control endpoint 0 and an interrupt-in endpoint (any other endpoint + * number). + */ +#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1 +/* Define this to 1 if you want to compile a version with three endpoints: The + * default control endpoint 0, an interrupt-in endpoint 3 (or the number + * configured below) and a catch-all default interrupt-in endpoint as above. + * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature. + */ +#define USB_CFG_EP3_NUMBER 3 +/* If the so-called endpoint 3 is used, it can now be configured to any other + * endpoint number (except 0) with this macro. Default if undefined is 3. + */ +/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */ +/* The above macro defines the startup condition for data toggling on the + * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1. + * Since the token is toggled BEFORE sending any data, the first packet is + * sent with the oposite value of this configuration! + */ +#define USB_CFG_IMPLEMENT_HALT 0 +/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature + * for endpoint 1 (interrupt endpoint). Although you may not need this feature, + * it is required by the standard. We have made it a config option because it + * bloats the code considerably. + */ +#define USB_CFG_SUPPRESS_INTR_CODE 0 +/* Define this to 1 if you want to declare interrupt-in endpoints, but don't + * want to send any data over them. If this macro is defined to 1, functions + * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if + * you need the interrupt-in endpoints in order to comply to an interface + * (e.g. HID), but never want to send any data. This option saves a couple + * of bytes in flash memory and the transmit buffers in RAM. + */ +#define USB_CFG_INTR_POLL_INTERVAL 1 +/* If you compile a version with endpoint 1 (interrupt-in), this is the poll + * interval. The value is in milliseconds and must not be less than 10 ms for + * low speed devices. + */ +#define USB_CFG_IS_SELF_POWERED 0 +/* Define this to 1 if the device has its own power supply. Set it to 0 if the + * device is powered from the USB bus. + */ +#define USB_CFG_MAX_BUS_POWER 500 +/* Set this variable to the maximum USB bus power consumption of your device. + * The value is in milliamperes. [It will be divided by two since USB + * communicates power requirements in units of 2 mA.] + */ +#define USB_CFG_IMPLEMENT_FN_WRITE 1 +/* Set this to 1 if you want usbFunctionWrite() to be called for control-out + * transfers. Set it to 0 if you don't need it and want to save a couple of + * bytes. + */ +#define USB_CFG_IMPLEMENT_FN_READ 0 +/* Set this to 1 if you need to send control replies which are generated + * "on the fly" when usbFunctionRead() is called. If you only want to send + * data from a static buffer, set it to 0 and return the data from + * usbFunctionSetup(). This saves a couple of bytes. + */ +#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0 +/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints. + * You must implement the function usbFunctionWriteOut() which receives all + * interrupt/bulk data sent to any endpoint other than 0. The endpoint number + * can be found in 'usbRxToken'. + */ +#define USB_CFG_HAVE_FLOWCONTROL 0 +/* Define this to 1 if you want flowcontrol over USB data. See the definition + * of the macros usbDisableAllRequests() and usbEnableAllRequests() in + * usbdrv.h. + */ +#define USB_CFG_DRIVER_FLASH_PAGE 0 +/* If the device has more than 64 kBytes of flash, define this to the 64 k page + * where the driver's constants (descriptors) are located. Or in other words: + * Define this to 1 for boot loaders on the ATMega128. + */ +#define USB_CFG_LONG_TRANSFERS 0 +/* Define this to 1 if you want to send/receive blocks of more than 254 bytes + * in a single control-in or control-out transfer. Note that the capability + * for long transfers increases the driver size. + */ +/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */ +/* This macro is a hook if you want to do unconventional things. If it is + * defined, it's inserted at the beginning of received message processing. + * If you eat the received message and don't want default processing to + * proceed, do a return after doing your things. One possible application + * (besides debugging) is to flash a status LED on each packet. + */ +/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */ +/* This macro is a hook if you need to know when an USB RESET occurs. It has + * one parameter which distinguishes between the start of RESET state and its + * end. + */ +/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */ +/* This macro (if defined) is executed when a USB SET_ADDRESS request was + * received. + */ +#define USB_COUNT_SOF 1 +/* define this macro to 1 if you need the global variable "usbSofCount" which + * counts SOF packets. This feature requires that the hardware interrupt is + * connected to D- instead of D+. + */ +/* #ifdef __ASSEMBLER__ + * macro myAssemblerMacro + * in YL, TCNT0 + * sts timer0Snapshot, YL + * endm + * #endif + * #define USB_SOF_HOOK myAssemblerMacro + * This macro (if defined) is executed in the assembler module when a + * Start Of Frame condition is detected. It is recommended to define it to + * the name of an assembler macro which is defined here as well so that more + * than one assembler instruction can be used. The macro may use the register + * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages + * immediately after an SOF pulse may be lost and must be retried by the host. + * What can you do with this hook? Since the SOF signal occurs exactly every + * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in + * designs running on the internal RC oscillator. + * Please note that Start Of Frame detection works only if D- is wired to the + * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES! + */ +#define USB_CFG_CHECK_DATA_TOGGLING 0 +/* define this macro to 1 if you want to filter out duplicate data packets + * sent by the host. Duplicates occur only as a consequence of communication + * errors, when the host does not receive an ACK. Please note that you need to + * implement the filtering yourself in usbFunctionWriteOut() and + * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable + * for each control- and out-endpoint to check for duplicate packets. + */ +#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0 +/* define this macro to 1 if you want the function usbMeasureFrameLength() + * compiled in. This function can be used to calibrate the AVR's RC oscillator. + */ +#define USB_USE_FAST_CRC 0 +/* The assembler module has two implementations for the CRC algorithm. One is + * faster, the other is smaller. This CRC routine is only used for transmitted + * messages where timing is not critical. The faster routine needs 31 cycles + * per byte while the smaller one needs 61 to 69 cycles. The faster routine + * may be worth the 32 bytes bigger code size if you transmit lots of data and + * run the AVR close to its limit. + */ + +/* -------------------------- Device Description --------------------------- */ + +#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF) +/* USB vendor ID for the device, low byte first. If you have registered your + * own Vendor ID, define it here. Otherwise you may use one of obdev's free + * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules! + * *** IMPORTANT NOTE *** + * This template uses obdev's shared VID/PID pair for Vendor Class devices + * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand + * the implications! + */ +#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF) +/* This is the ID of the product, low byte first. It is interpreted in the + * scope of the vendor ID. If you have registered your own VID with usb.org + * or if you have licensed a PID from somebody else, define it here. Otherwise + * you may use one of obdev's free shared VID/PID pairs. See the file + * USB-IDs-for-free.txt for details! + * *** IMPORTANT NOTE *** + * This template uses obdev's shared VID/PID pair for Vendor Class devices + * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand + * the implications! + */ +#define USB_CFG_DEVICE_VERSION 0x00, 0x02 +/* Version number of the device: Minor number first, then major number. + */ +#define USB_CFG_VENDOR_NAME 'w', 'i', 'n', 'k', 'e', 'y', 'l', 'e', 's', 's', '.', 'k', 'r' +#define USB_CFG_VENDOR_NAME_LEN 13 +/* These two values define the vendor name returned by the USB device. The name + * must be given as a list of characters under single quotes. The characters + * are interpreted as Unicode (UTF-16) entities. + * If you don't want a vendor name string, undefine these macros. + * ALWAYS define a vendor name containing your Internet domain name if you use + * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for + * details. + */ +#define USB_CFG_DEVICE_NAME 'p', 's', '2', 'a', 'v', 'r', 'G', 'B' +#define USB_CFG_DEVICE_NAME_LEN 8 +/* Same as above for the device name. If you don't want a device name, undefine + * the macros. See the file USB-IDs-for-free.txt before you assign a name if + * you use a shared VID/PID. + */ +/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */ +/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */ +/* Same as above for the serial number. If you don't want a serial number, + * undefine the macros. + * It may be useful to provide the serial number through other means than at + * compile time. See the section about descriptor properties below for how + * to fine tune control over USB descriptors such as the string descriptor + * for the serial number. + */ +#define USB_CFG_DEVICE_CLASS 0 +#define USB_CFG_DEVICE_SUBCLASS 0 +/* See USB specification if you want to conform to an existing device class. + * Class 0xff is "vendor specific". + */ +#define USB_CFG_INTERFACE_CLASS 3 /* HID */ +#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */ +#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */ +/* See USB specification if you want to conform to an existing device class or + * protocol. The following classes must be set at interface level: + * HID class is 3, no subclass and protocol required (but may be useful!) + * CDC class is 2, use subclass 2 and protocol 1 for ACM + */ +#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0 +/* Define this to the length of the HID report descriptor, if you implement + * an HID device. Otherwise don't define it or define it to 0. + * If you use this define, you must add a PROGMEM character array named + * "usbHidReportDescriptor" to your code which contains the report descriptor. + * Don't forget to keep the array and this define in sync! + */ + +/* #define USB_PUBLIC static */ +/* Use the define above if you #include usbdrv.c instead of linking against it. + * This technique saves a couple of bytes in flash memory. + */ + +/* ------------------- Fine Control over USB Descriptors ------------------- */ +/* If you don't want to use the driver's default USB descriptors, you can + * provide our own. These can be provided as (1) fixed length static data in + * flash memory, (2) fixed length static data in RAM or (3) dynamically at + * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more + * information about this function. + * Descriptor handling is configured through the descriptor's properties. If + * no properties are defined or if they are 0, the default descriptor is used. + * Possible properties are: + * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched + * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is + * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if + * you want RAM pointers. + * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found + * in static memory is in RAM, not in flash memory. + * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash), + * the driver must know the descriptor's length. The descriptor itself is + * found at the address of a well known identifier (see below). + * List of static descriptor names (must be declared PROGMEM if in flash): + * char usbDescriptorDevice[]; + * char usbDescriptorConfiguration[]; + * char usbDescriptorHidReport[]; + * char usbDescriptorString0[]; + * int usbDescriptorStringVendor[]; + * int usbDescriptorStringDevice[]; + * int usbDescriptorStringSerialNumber[]; + * Other descriptors can't be provided statically, they must be provided + * dynamically at runtime. + * + * Descriptor properties are or-ed or added together, e.g.: + * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18)) + * + * The following descriptors are defined: + * USB_CFG_DESCR_PROPS_DEVICE + * USB_CFG_DESCR_PROPS_CONFIGURATION + * USB_CFG_DESCR_PROPS_STRINGS + * USB_CFG_DESCR_PROPS_STRING_0 + * USB_CFG_DESCR_PROPS_STRING_VENDOR + * USB_CFG_DESCR_PROPS_STRING_PRODUCT + * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER + * USB_CFG_DESCR_PROPS_HID + * USB_CFG_DESCR_PROPS_HID_REPORT + * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver) + * + * Note about string descriptors: String descriptors are not just strings, they + * are Unicode strings prefixed with a 2 byte header. Example: + * int serialNumberDescriptor[] = { + * USB_STRING_DESCRIPTOR_HEADER(6), + * 'S', 'e', 'r', 'i', 'a', 'l' + * }; + */ + +#define USB_CFG_DESCR_PROPS_DEVICE 0 +#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC +//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0 +#define USB_CFG_DESCR_PROPS_STRINGS 0 +#define USB_CFG_DESCR_PROPS_STRING_0 0 +#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0 +#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0 +#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0 +#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC +//#define USB_CFG_DESCR_PROPS_HID 0 +#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC +//#define USB_CFG_DESCR_PROPS_HID_REPORT 0 +#define USB_CFG_DESCR_PROPS_UNKNOWN 0 + +#define usbMsgPtr_t unsigned short +/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to + * a scalar type here because gcc generates slightly shorter code for scalar + * arithmetics than for pointer arithmetics. Remove this define for backward + * type compatibility or define it to an 8 bit type if you use data in RAM only + * and all RAM is below 256 bytes (tiny memory model in IAR CC). + */ + +/* ----------------------- Optional MCU Description ------------------------ */ + +/* The following configurations have working defaults in usbdrv.h. You + * usually don't need to set them explicitly. Only if you want to run + * the driver on a device which is not yet supported or with a compiler + * which is not fully supported (such as IAR C) or if you use a differnt + * interrupt than INT0, you may have to define some of these. + */ +/* #define USB_INTR_CFG MCUCR */ +/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */ +/* #define USB_INTR_CFG_CLR 0 */ +/* #define USB_INTR_ENABLE GIMSK */ +/* #define USB_INTR_ENABLE_BIT INT0 */ +/* #define USB_INTR_PENDING GIFR */ +/* #define USB_INTR_PENDING_BIT INTF0 */ +/* #define USB_INTR_VECTOR INT0_vect */ + +/* Set INT1 for D- falling edge to count SOF */ +/* #define USB_INTR_CFG EICRA */ +#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10)) +/* #define USB_INTR_CFG_CLR 0 */ +/* #define USB_INTR_ENABLE EIMSK */ +#define USB_INTR_ENABLE_BIT INT1 +/* #define USB_INTR_PENDING EIFR */ +#define USB_INTR_PENDING_BIT INTF1 +#define USB_INTR_VECTOR INT1_vect + +#endif /* __usbconfig_h_included__ */ diff --git a/keyboards/melody96/keymaps/default/keymap.c b/keyboards/melody96/keymaps/default/keymap.c index 9142a0470..16f4561b5 100644 --- a/keyboards/melody96/keymaps/default/keymap.c +++ b/keyboards/melody96/keymaps/default/keymap.c @@ -73,12 +73,6 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { return MACRO_NONE; } -void matrix_init_user(void) { -} - -void matrix_scan_user(void) { -} - bool process_record_user(uint16_t keycode, keyrecord_t *record) { return true; } From 61f95410666319ac5ef0cb3d533b820f45ae237c Mon Sep 17 00:00:00 2001 From: Alexander Kagno Date: Tue, 25 Sep 2018 16:38:04 -0600 Subject: [PATCH 138/788] Keymap: Velocikey implemented at userspace, readme is more helpful (#3974) * deleting arkag branch, forcibly moving changes over to master * fade_color function added, not tested * added half functions some stuff * surround_type function implemented and working. * added flashing function and removed fading, flashing supports infinite flashing along with controlled number flashes * added a fade state machine and functionality * build optimizations, changed fade to bounce between bounds rather than roll over, added a HALMAK layout * changes to sleep breath function, changed how I will switch to HALMAK * support for halmak added * support for activity detection added, condensed fading and flashing state machines, removed support for HALMAK and COLEMAK because arkag is stupid * changed sleep and inactive behaviors, now the color shifting reverses on state change, yay! save_color and reset_color are made to enable layer color changing to look cooler. * reformatted some if statements in state detection * changes to force fade to pause on boot, or plug in. * Attempting to move over to userspace, pushing to repository for help * userspace stuff.... * userspace stuff.... * layout changes, working userspace, Removed left side shift and replaced it with a MT() for LSFT and SPC. Userspace seems to be working properly now! HURRAY * Layout change Removed space/shift and reset modifiers to what they were originally. Added homerow modifiers. * Removed excessive tabs in files * Moved mods on homerow around... * changes recommended by @drashna * removed homerow mods, more flashy lighting! * changed delays for lighting. * velocikey code retro fit into userspace to match typing speed currently "working" but isn't as reactive as I want. * Readme and other documentation hidden throughout code * Added a pretty picture * pretty picture actually added * More readme updates * Velocikey now working inside my userspace! * Changed repo macro and fixed readme * Removed media layer, moved media control to LAZY layer * fixed more merge issues when I had to merge... --- keyboards/mechmini/v2/keymaps/arkag/keymap.c | 25 +- users/arkag/arkag.c | 234 ++++++++++--------- users/arkag/arkag.h | 27 +-- users/arkag/mechmini2.jpg | Bin 0 -> 3548191 bytes users/arkag/readme.md | 28 +++ 5 files changed, 169 insertions(+), 145 deletions(-) create mode 100644 users/arkag/mechmini2.jpg diff --git a/keyboards/mechmini/v2/keymaps/arkag/keymap.c b/keyboards/mechmini/v2/keymaps/arkag/keymap.c index 10502a5b6..7038f220c 100644 --- a/keyboards/mechmini/v2/keymaps/arkag/keymap.c +++ b/keyboards/mechmini/v2/keymaps/arkag/keymap.c @@ -1,16 +1,21 @@ #include QMK_KEYBOARD_H #include "arkag.h" +/* + Userspace: + https://github.com/arkag/qmk_firmware/blob/master/users/arkag/arkag.c +*/ + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_QWERTY] = LAYOUT_2u_space_ortho( KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, - KC_TAB, TAP_A, TAP_S, TAP_D, TAP_F, KC_G, KC_H, TAP_J, TAP_K, TAP_L, TAP_SCN, QUOTE, - XXXXXXX, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_UP, KC_ENT, + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, QUOTE, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_UP, KC_ENT, M_PMOD, LRALT, M_SMOD, LOWER, RAISE, KC_SPC, KC_SLSH, LAZY, KC_LEFT, KC_DOWN, KC_RGHT), [_RAISE] = LAYOUT_2u_space_ortho( GRAVE, KC_1, KC_2, THREE, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, - _______, OBRACK, CBRACK, TAP_EQ, HYPHEN, _______, _______, KC_4, TAP_5, KC_6, _______, KC_NLCK, + _______, OBRACK, CBRACK, KC_EQL, HYPHEN, _______, _______, KC_4, KC_5, KC_6, _______, KC_NLCK, _______, _______, _______, CEDILLA, _______, KC_COMM, KC_PDOT, KC_1, KC_2, KC_3, KC_PPLS, KC_PENT, _______, _______, _______, KEEB, _______, _______, _______, M_OS, KC_PSLS, KC_PMNS, KC_PAST), @@ -18,7 +23,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, M_ULIN, M_ITAL, _______, M_P_B, M_C_A_D, _______, _______, STRIKE, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_CAPS, KC_DEL, _______, _______, _______, M_BOLD, _______, _______, _______, _______, KC_PGUP, _______, - _______, _______, _______, _______, _______, MEDIA, KC_BSLS, M_CALC, KC_HOME, KC_PGDN, KC_END), + _______, _______, _______, _______, _______, _______, KC_BSLS, M_CALC, KC_HOME, KC_PGDN, KC_END), [_KEEB] = LAYOUT_2u_space_ortho( KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, @@ -26,15 +31,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { RGB_M_P, RGB_TOG, RGB_MOD, RGB_VAI, RGB_VAD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, _______, _______, _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), - [_MEDIA] = LAYOUT_2u_space_ortho( - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_VOLU, KC_MUTE, - _______, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT), - [_LAZY] = LAYOUT_2u_space_ortho( - _______, _______, _______, _______, _______, M_TM, _______, M_SNIPT, M_SHRUG, _______, _______, _______, + _______, _______, _______, _______, _______, M_TM, _______, M_SNIPT, M_SHRUG, _______, _______, KC_MUTE, _______, _______, _______, _______, _______, M_GGT, _______, M_UF, M_LOD, M_REPO, _______, _______, - _______, _______, _______, _______, _______, _______, _______, M_TF, M_LENNY, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + _______, _______, _______, _______, _______, _______, _______, M_TF, M_LENNY, _______, KC_VOLU, KC_MPLY, + _______, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT), }; diff --git a/users/arkag/arkag.c b/users/arkag/arkag.c index c716b5e93..a35e13ed6 100644 --- a/users/arkag/arkag.c +++ b/users/arkag/arkag.c @@ -1,5 +1,10 @@ #include "arkag.h" +/* + Current Layout and Keeb: + https://github.com/arkag/qmk_firmware/blob/master/keyboards/mechmini/v2/keymaps/arkag/keymap.c +*/ + // Start: Written by konstantin: vomindoraan #include #include @@ -8,38 +13,68 @@ void send_unicode_hex_string(const char *str) { if (!str) { return; } // Saftey net while (*str) { - // Find the next code point (token) in the string - for (; *str == ' '; str++); - size_t n = strcspn(str, " "); // Length of the current token - char code_point[n+1]; - strncpy(code_point, str, n); - code_point[n] = '\0'; // Make sure it's null-terminated + // Find the next code point (token) in the string + for (; *str == ' '; str++); + size_t n = strcspn(str, " "); // Length of the current token + char code_point[n+1]; + strncpy(code_point, str, n); + code_point[n] = '\0'; // Make sure it's null-terminated - // Normalize the code point: make all hex digits lowercase - for (char *p = code_point; *p; p++) { - *p = tolower(*p); - } + // Normalize the code point: make all hex digits lowercase + for (char *p = code_point; *p; p++) { + *p = tolower(*p); + } - // Send the code point as a Unicode input string - unicode_input_start(); - send_string(code_point); - unicode_input_finish(); - str += n; // Move to the first ' ' (or '\0') after the current token + // Send the code point as a Unicode input string + unicode_input_start(); + send_string(code_point); + unicode_input_finish(); + str += n; // Move to the first ' ' (or '\0') after the current token } } // End: Written by konstantin: vomindoraan -uint8_t current_os, mod_primary_mask, fade_delay; -uint16_t flash_timer_one, flash_timer_two, - fade_timer_one, fade_timer_two, - active_timer_one, active_timer_two, - elapsed = 0, +// Start: Written by Chris Lewis +#ifndef MIN +#define MIN(a,b) (((a)<(b))?(a):(b)) +#endif +#ifndef MAX +#define MAX(a,b) (((a)>(b))?(a):(b)) +#endif + +#define TYPING_SPEED_MAX_VALUE 200 +uint8_t typing_speed = 0; + +void velocikey_accelerate() { + if (typing_speed < TYPING_SPEED_MAX_VALUE) typing_speed += (TYPING_SPEED_MAX_VALUE / 50); +} + +void velocikey_decelerate() { + static uint16_t decay_timer = 0; + + if (timer_elapsed(decay_timer) > 500 || decay_timer == 0) { + if (typing_speed > 0) typing_speed -= 1; + //Decay a little faster at half of max speed + if (typing_speed > TYPING_SPEED_MAX_VALUE / 2) typing_speed -= 1; + //Decay even faster at 3/4 of max speed + if (typing_speed > TYPING_SPEED_MAX_VALUE / 4 * 3) typing_speed -= 3; + decay_timer = timer_read(); + } +} + +uint8_t velocikey_match_speed(uint8_t minValue, uint8_t maxValue) { + return MAX(minValue, maxValue - (maxValue - minValue) * ((float)typing_speed / TYPING_SPEED_MAX_VALUE)); +} +// End: Written by Chris Lewis + +uint8_t current_os, + mod_primary_mask, + fade_interval, num_extra_flashes_off = 0; Color underglow, flash_color, saved_color, - hsv_none = {0,0,0}, - hsv_white = {0,0,127}; + hsv_none = {0,0,0}; flashState flash_state = no_flash; fadeState fade_state = add_fade; activityState state = boot; @@ -79,134 +114,103 @@ Color mod_color(Color current_color, bool should_add, uint8_t change_amount) { return current_color; } -void reverse_fade (void) { - if (fade_state == add_fade){ - fade_state = sub_fade; - } else { - fade_state = add_fade; +void check_state (void) { + static uint16_t active_timer; + if (!active_timer) {active_timer = timer_read();} + static bool activated, deactivated, slept; + switch (state) { + case active: + if (!activated) { + if (slept) {rgblight_mode_noeeprom(1);} + activated = true; + deactivated = false; + slept = false; + } + fade_interval = velocikey_match_speed(1, 25); + if (timer_elapsed(active_timer) < INACTIVE_DELAY) {return;} + active_timer = timer_read(); + state = inactive; + return; + + case inactive: + if (!deactivated) { + deactivated = true; + activated = false; + slept = false; + } + velocikey_decelerate(); + fade_interval = velocikey_match_speed(1, 25); + if (timer_elapsed(active_timer) < SLEEP_DELAY) {return;} + state = sleeping; + return; + + case sleeping: + if (!slept) { + rgblight_mode_noeeprom(4); + slept = true; + activated = false; + deactivated = false; + } + return; + + case boot: + return; } } -void check_state (void) { - static bool activated, deactivated, slept; - switch (state) { - case active: - if (!activated) { - fade_delay = LED_FADE_DELAY; - reverse_fade(); - activated = true; - deactivated = false; - } - active_timer_two = timer_read(); - elapsed = active_timer_two - active_timer_one; - if (elapsed < INACTIVE_DELAY) {return;} - state = inactive; - return; - - case inactive: - if (!deactivated) { - fade_delay = LED_FADE_DELAY * 2; - reverse_fade(); - deactivated = true; - slept = false; - activated = false; - } - active_timer_two = timer_read(); - elapsed = active_timer_two - active_timer_one; - if (elapsed < SLEEP_DELAY) {return;} - state = sleeping; - return; - - case sleeping: - if (!slept) { - fade_delay = LED_FADE_DELAY * 6; - reverse_fade(); - slept = true; - deactivated = false; - activated = false; - } - return; - - case boot: - return; - } -} - void fade_rgb (void) { - static bool ran_once; - if (flash_state != no_flash) {return;} + static uint16_t fade_timer; if (state == boot) {return;} + if (!fade_timer) {fade_timer = timer_read();} + if (timer_elapsed(fade_timer) < fade_interval) {return;} switch (fade_state) { case add_fade: - if (!ran_once) { - fade_timer_one = timer_read(); - ran_once = true; - } - fade_timer_two = timer_read(); - elapsed = fade_timer_two - fade_timer_one; - if (elapsed < fade_delay) {return;} if (underglow.h == 359) { fade_state = sub_fade; return; } underglow.h = underglow.h + 1; - set_color(underglow, false); - // set_color_at(underglow, 0); - fade_timer_one = fade_timer_two; - return; + break; case sub_fade: - fade_timer_two = timer_read(); - elapsed = fade_timer_two - fade_timer_one; - if (elapsed < fade_delay) {return;} if (underglow.h == 0) { fade_state = add_fade; return; } underglow.h = underglow.h - 1; + break; + } + fade_timer = timer_read(); + if (flash_state == no_flash) { set_color(underglow, false); - // set_color_at(underglow, 0); - fade_timer_one = fade_timer_two; - return; } } void flash_rgb (void) { - static bool ran_once; + static uint16_t flash_timer; switch(flash_state) { case no_flash: return; case flash_off: - if (!ran_once) { + if (!flash_timer) {flash_timer = timer_read();} + if (timer_elapsed(flash_timer) >= LED_FLASH_DELAY) { set_color(hsv_none, false); - flash_timer_one = timer_read(); - ran_once = true; - flash_state = flash_on; - return; - } - flash_timer_two = timer_read(); - elapsed = flash_timer_two - flash_timer_one; - if (elapsed >= LED_FLASH_DELAY) { - set_color(hsv_none, false); - flash_timer_one = timer_read(); + flash_timer = timer_read(); flash_state = flash_on; } return; case flash_on: - flash_timer_two = timer_read(); - elapsed = flash_timer_two - flash_timer_one; - if (elapsed >= LED_FLASH_DELAY) { + if (timer_elapsed(flash_timer) >= LED_FLASH_DELAY) { set_color(flash_color, false); - flash_timer_one = timer_read(); + flash_timer = timer_read(); if (num_extra_flashes_off > 0) { flash_state = flash_off; num_extra_flashes_off--; } else { set_color(underglow, false); flash_state = no_flash; - ran_once = false; } } return; @@ -239,8 +243,9 @@ void set_os (uint8_t os, bool update) { mod_primary_mask = MOD_CTL_MASK; } set_color(underglow, update); - flash_color = underglow; - flash_state = flash_off; + flash_color = underglow; + flash_state = flash_off; + state = boot; num_extra_flashes_off = 1; } @@ -462,7 +467,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { case M_REPO: if (record->event.pressed) { - SEND_STRING("https://github.com/arkag/qmk_firmware/tree/master/keyboards/mechmini/v2/keymaps/arkag"); + SEND_STRING("https://github.com/qmk/qmk_firmware/tree/master/users/arkag"); } return false; @@ -505,10 +510,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { case KC_LSFT: if (record->event.pressed) { - set_color(mod_color(underglow, true, 50), false); + save_color(underglow); + underglow = mod_color(underglow, true, 75); SEND_STRING(SS_DOWN(X_LSHIFT)); } else { - set_color(underglow, false); + reset_color(); SEND_STRING(SS_UP(X_LSHIFT)); } return false; @@ -522,8 +528,8 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { default: if (record->event.pressed) { - active_timer_one = timer_read(); state = active; + velocikey_accelerate(); } return true; } diff --git a/users/arkag/arkag.h b/users/arkag/arkag.h index 9c81e4487..a4672a8e8 100644 --- a/users/arkag/arkag.h +++ b/users/arkag/arkag.h @@ -25,26 +25,13 @@ #define MOD_GUI_MASK (MOD_BIT(KC_LGUI) | MOD_BIT(KC_RGUI)) #define MOD_SFT_MASK (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT)) -#define TAP_A LALT_T(KC_A) -#define TAP_SCN RALT_T(KC_SCOLON) - -#define TAP_S LCTL_T(KC_S) -#define TAP_L RCTL_T(KC_L) - -#define TAP_D LSFT_T(KC_D) -#define TAP_K RSFT_T(KC_K) - -#define TAP_F LGUI_T(KC_F) -#define TAP_J RGUI_T(KC_J) - -#define TAP_EQ LSFT_T(KC_EQUAL) -#define TAP_5 RSFT_T(KC_5) - #define LED_FLASH_DELAY 150 -#define LED_FADE_DELAY 10 -#define INACTIVE_DELAY 200 -#define SLEEP_DELAY 60000 +#define ACCEL_DELAY 500 +#define DEACCEL_DELAY 500 + +#define INACTIVE_DELAY 250 +#define SLEEP_DELAY 180000 enum { _QWERTY = 0, @@ -124,6 +111,10 @@ enum tapdances { void send_unicode_hex_string(const char *str); +void velocikey_accelerate(void); +void velocikey_decelerate(void); +uint8_t velocikey_match_speed(uint8_t minValue, uint8_t maxValue); + void set_color (Color new, bool update); void save_color(Color to_save); void reset_color(void); diff --git a/users/arkag/mechmini2.jpg b/users/arkag/mechmini2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..611a0859c0c431273e99013f3599816dff9204ae GIT binary patch literal 3548191 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

t^HVN(Kz2= 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 )x4rEw}05fBAb{|@JE~=hniZ&8* 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 TjK7rxWin)cxySlIGsE@nP8 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

KZZM2T#n*yHXwT& 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�wGcooD_D(=X33(5Zg3fhJ$ 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 z�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

&)pbU#u&2v%sOCwDZwqSnM?U) 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�wjgf>YUDOmYv_(8T_p!cRJa<3lsa;O-_ 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μEZ;!=%2?nnr@|KC7s2h&VX+@ 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�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

tINAM?E!}3IT-L}Nbovw!St#)4;x1L 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

^`%+L(-lHxPn;)7 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 GbBe;>_EF6n&T} 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Ο?UwRV@Xhrro)BzbT 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

cnL1p51P%~TlJ>71x;SX6OF z3bQaDD&>^-9`E-xa)9bc+71J*cr}|W7B%w{NZ*3rb(@pwN1&xhVTFV#I8U4BX61oC zl<3N0NrYviRR_-m5{LV^rG+l0A}JAfkD6C-0A>CXJwBBWaoCw|Vw|j37U`8=m}3Qp zp{nxoe&_?WMyy)lV^<2m0?6Gl>r;D_ zkmL3%R9P;ZfahwA;I=7mZEdE4NFb1+72PIDBz{y%w+iTyd2(fs%vX`cLn}cW86%PR zl^gdSGxYSN0GADJ@cFW=h{FnEUUq@hpYzh6d3vphErg8JH0X1oh`Y7D5QBmct%u{$4)5? z$c7Rmh!K)d9*zFVCZN34ZRLTa7Q`6a?qp$mWDiO#*fx?LZX$%pUBcx?5t{^@^b{n8 zlPGX^5E?;{5231N{{SxjQ66DkgtF%Y)qUzKi}b=NKlRCCKMA3tE+E z?p>F1@DcIHrB!=~L!3{zaf~_O`U-+s!B08>S($j;+zMfkkkN(t_}V)I?M*=;IkN17 z$~N+O5F>r5s&^ZT|X zcq&gB_Y~4Zxi(Mcks~>{3%Vub41xX>jdZNyPc?VO00^BA*VdTQ1wp#y6uH>hUfz_9 zLpCBC`(zH@zok1MyCiFpkupeE5}lwb;HdQ#9E>51M(Ey36S)Up&$%@jm&sYkuiY#w{DFX^dA1TBfCc_Mr8wnSyzLfN@_(t)TS6^ z%Qth>)J*KDv^Z^@Fumv#C23_VzCu~IV305|^r&X@nOa!X0voFI81|<`L%9Kf$KGcC z8c7}taAJtz-MQx(@5MBjn;Uf;KyIGp18_oT1p6PQBPt>DeqNz+qMYUlXFF}lMOEB{ z@;z!Y{$N(}TkjGvj%t<32VL?9l?ik|DJPs$Q65$SB5aJ}Fmr?JNc*tB#@?j2CmzO` z8zeUlp^He!2@3om^!n9US4EK^X7VmAqz4%+4nGQ-+UTPyMpbuXaC4E5@v08{Snr&v zz%8D}rnWCQ07gDz!5_|t9R{AI*{_ZCrR0+ZzE%Koqo*|JWViC2?p>8pPWcC?p&jas zi7QRMIShFrT!GXNN|82g4KkAw$W_$!+v`(gJF?4(9&2q#UXA!FRA&Qd<2|WjlIlpj zh!I0!n6A&ip48Z3^8mLiv>7-g{qIGm&akqJc%qeeouKafH-PYM7ZLy58Zb|kgpnIf%G>?!<CDD-r1Y_l03z@MbvH>K3U<_kEpOr*fLfHdmc=xExk;>>ACM&X(vqrvKs|ekh4Mo> zVP(Mqv&K78++Gcv|aU_)$Rz`HmVgdpD#YZ|j80DHx%&(aCdj9}H zO-BywbIvok^*r>XiQ|m!Mgb31W1f4}t01`~lSGWfLPqWtzV1(RQrqe%ksK&@a#Iid zKkXW-A(8FG_R^~>GiEcBw;lPXt*o(?a*Td&-fmtG)BGsWpe-SssFlIOsZ?&b^`(je z0>D@XbCf+ZpK5wURlxvb1dz?!-lVpVc;5t4Gwmf?t_P?dwGK@UZdte7(Ym533IGVB zk?Lwm#%EP@ViOFrV~&``Eu>Pl!1AH_i243bqtsKD(&drnc~f9s3h}r90IyizQpn>KVH57UK<+l6So(X^I15(!k`1M(vo}ft5bA zrE#Q)*4hP;THrBwhVL*OXYi{K811DBSTv22(Xbp2#8d6zo)}BC>g9sW4Eq7KMISQTH6k^b%ZmB)WR|uN$;OuT7qk#G4kzIrP?b z5J3L&`_kK4-TAWGCA(lK#yb*vlj&NP`cQ&09^KWL0m=PEV>!iYTw>Xs3{l)lu*DW* zINHs|J z_5ST;?PT^f_GuJTPH7|r$fY(6AY5Sk)XAo)ml8nE#C)iu8&9o0wF@-MJm{bthRzB0 z#WFoYBGW@>dZ%dK(>XaO`=dQRf|csMkXoADhW^$Cl%!6pFB_v~{z97+67Bn8h^SxV z#yB3;n{};P36fKXW?~BtdG0Eu-nzleZ!@D6y2sHe#UB`Lj%(QA68@-@QSGAvGf+^#-M;AWiGw>KwqZz{hs0DAiq=~tIW zj?yG|xh>ETGtaU0sn*=0eX0@^Dal6XD^Hp$VW`ROP}1!Ut2m874nB8v&e5Jg_p5>v zg_uM-{EfFNYItA~6C`RR$0(dO6}lmhsQfA$k3HmA;tCw{OO7#8G)Txi^6G?VDsi~_A8M2fP@{C< zGY{RPXRT5vR#k=>$n)WuSaF^XSoc3lnWWx4z|t8rw*X~8^~d$4n^J)mMOZ<7zr6~6 z<~s3N-gNUYwzl&~kxMhFzzdqIh}JrUh{A6$M#yjki;QEvHse-^5j6LrJ?Ck-D1KAu zanstXMP-=QMhx)hmMxt7Q|+t_5u0`;OuV8=>74UHNwY=^_qq|ZC8hH?R~^^a=}}L4 z8MTsl=R^uvFvn0S8VM0i#x}1CN(?T3ovE&}iDO0pk3zjDx-{0st4ZUzfoG0F>gj^u zaxv>n`!~V8fXcOLaF z>}e9RN4P}bV|nE8e>!aUNdzj_3G(j3vhWYF^d9u7EK=-^W>1{t2Oodi=~6wVyPvf_ zM2+&`a-@AbQXipJ@0HobsQ{i7k&*PL!l=p%N%If8AUGNK_NO(Dp02K}MCiwH5?~N} z6{oTCW5jWXW7KwP9fU~|?Piq8xw{--A8&eQ&8V|O3y_R?bDzf^m10e%Z#ETW1prdx zBR%m@&klK%kjlH2Mn-BChVE0kRbnK#0~z^Pa0&b=*o+ljQS)y8>FxzXXLmeaYDI40M1Oix4n}&? zvlfGH%BWf8$;*7C8fD0#N{UH}v3WrRDBKX>XB{cB-$?u~%myU2zyG zjGt5JD>mz0nkmJsiMcVkCOFHFLF$jt|zTNjf^Id9s19><)M%rYMr(5^{o4<(F(AbyJR~ z)YgicCz+N_!J2U$zTgUgPI+%yOKnC|a`DIl6vh;eAL;K@+T&||o#X+CA3lER^`4Qnc(_+(1FR14oZWF-x$Zzq_Ht1%@`{x@YACXK<(C=uo;ujcX0{( zGRll!fLok;)tGLixC0ergBZbIYG>Ll<&;4j z#g*TQzvr0uG-@#|?Yx8rQRZzVs0V<3aZ^ZGMv9B`E9W`n=e1XcPbD)P1dz@1lb$}E z=$)L%9FWqgj4&7ikjpFrTCs(laVMByh;yG$r?o;B7-P<7l6f5Yj*@-e{X1fuWb>Rf zEJN@~AHz{TBwesL-dK&kht{W*cM@BuqMXF8N)-d;kmT{u)tIHZ@>Us`vnw1DF^Z*S z9{B~;#gj(J`&5?e{xzW$rNhF`$()1JtyF1BZqY!S863tr!ZdrkgZW+ZXsR}WhE!F zIn#8qjf)A5RlfTimiEm)2(Io&%N}u(Iq&IRo|W*wRK0bQ;Spm~^9ay<*!Ml_qOkaX zX{Q4P#i(ZhVXyH=vqdLrP()^G#@-egpIk+<5n+(5?TpNOK)^|K&Kms>0d>L;d~`Hd-}6wK_%}q zgVO#Tn<8HF9(ItbMtau0w}tHN)Ci*USw>{qyw=dxEar$juz517kt(su@y30t-@jr{ z_$PP8@7lGK#CKAri{Ya?Ev?1eP3B(n_tkz=uzz@vKD^=LFx0Z;?xhI#db6JqI#^|P zcnyt>xkZNB##KA8KwRhat?e`6_lmXHo-IF2ot2wwd0EJQpf);j&3?Q568`{#FMI&- zWwL61D%9?^VlZTaM<|88Fb3>R$98$+ST_1-25dDe1KX}QZmqhR;u+4EU5ssN706K0sA1a=J zwgzkHZ-$@nMqiKqC6X4_QX4SkOsjm^3Vj#L&&+f0-oIWfJSX9uAp|;JiERXKesxIs zC)YJ-K!fGpKuq8uz`?H`rxH*8T|pxm<0?sLtb76R!~O_+;Exa6#C(6ROLK=Mt)oz_ zobnlnCm!4%diT$VpYToZ*^lAuf=m6|1=n&`_vW>tGznX$; zmIGraUf@@kUpL3%6{R+F`$@go&FH@iJO|->5oe(IHp;dCG^d4vg0*eXADNW47nI%i zy{fd46lI<;0^_50KA5ZYAcfT(cc3}PdX1q#PTmePPcumr+luw;kx@L3WiKBAmkd3r z#_R^&+j+1I#&(cKan`8a!0O8?5UiNxc+a(I2VjMJ4#f4St|3twxQ%mxmS0NJH$zUw z&w%`EsA$)*yUVqsY`Jbj4?;R%R~P$Oe#ZVB_`%`pzl)y^bhuvZLRVJP6al%j{WpUx#)Q5Oz*|8!?(UkB(^#o*9(XCerRaBGC1flTLRgY z1Gol6;{&BOCW&GZjz)5Jo}Sewng(2h$6tERrCCXzES2?RS`|Zpz<_d3u4)&B9oY~S z1NeyG{VKuo!2|<_`@=M>vAS($CqA8pV&>6GD9gCBB$a5$+sNmwQ@FGQa@fKAt8Q2k zjsR={#!XkA$S?{pK^+YceZ@7{=I*T8Lzsx#4=e{t&(t*Jl}vLXBOH%kYU!@5P^mx& z^=0quD?Z}OVBLaA>04ecXlJd-einRB)xIC<@!H(n%56)9k1g{jU^Co(d9SQI0prUb z6KP2-HyMB8=a7AC<4s#dHxRM~JdWLKcj0Hn-E-mYtdZY5(pvuj2^^Ipj(d@hsjr#N zGH+>m)K0t4SKIG50lVrop3^CrD<+~0(oL3|8mfsoaApA zGL-;M?Quh~L6plGxtg$E=$4q1V^z^PW=l%)n@Mi05klgAKmL%ctX2<@APAZR9 zJI?0Mioa=Zhn^9#d#!I@w}~PJzt)esI_KKHT>Yj00B`>Q9sESn?|vM9%w7n&)NXH? zt=m^vpAeEh;w~~yIVYSC%zYK6f5AWg2S+rsU+EVY%Ip?Vb#Wwt!0C|eK^$?BUH5~& z1pGMoeF#qucw*MuVr>|Re52djiqe~-30;bDoYs!V#s2{CPG9&Yh5rD;uMoG#uZ^07 zm)5~gdl^~9U^rp1}i-5p@ybd_3(x@em z1Obpc)!C!n(}Dcztbi*KD}lyKdR250tKgk-`%BaznrU55aH9Re>UY*U|lcwvFpcvxfrfTM8DD^zm2YS6!MINAIaeTrP(O$f z(zEZ-yDsGcN#GG(wCb2n2RE)Tg4N4~-r)XUO7L%snx(?YC6n1Sf!v2Geo^UO@8flj zJ4Z<(Dol7*4bb}6g81f0t|Vq>1~PURKVMGu)mEo1G-pN^o!Q7)>C#?IWxKinZ3?l0 zjAOAq&3bo(w1S#{?g7T&7=Mj&z6Q~*H9LipSR)ymY-=A}b|>DwTSc%&5yGgElo&3n z)O**BkFKVaR>!GA4Q@qkq=yBXS3;we1E@7_JsK9_BgPIJ*FN>JWn~#$JpTZE;1yoA zb}Jptwc|ViwU4EFS6vRBj9VQp*<*B$CdfGq4@2l`-L{)1&>g|!k_RN#y}gTu)D8vK+|P_+=Pv-3a!rbko3$IZXH3 zYFO=Kl}wQ%4Z{In)`puEjB%#ye!MQjIkZ8dYPD?wk-Sa9EElIf(AvjOLK( z@;*r_Jw9LOPnC?zio!5RjwZ%%3mntd(ZJk@Pi%HItsRn?JiWj^-1AO03=xW-yU8B( z)Lq4MC&|Do&KO{jahi71w5ox-r!{`!#mFU47RMQ=jlKf2k6-9;7Vz3m z5;OsZGlBAfiv5WH0D^~p!`lAy=KfH6u;8%_OB>w<{ zAb2ywLf=sMf#X}7%h21JJ9#{~WyfYuo8{@>JbTyNVKeLmaB-DMYL?wkDdDO@t)jF) zKdg1g=4MC-+9XT|ia%4*x}7q6=8i*gXLl2{U?K7d+TNU3>X(E60N|a!vnPb0iWqzz z*HS=3B-czy4bKHZ+kx0%^arhUci*uW?B{oD{hy|IRx1Q%E%HL7AwGkFl5%Btscc z0Q`LoTb|{lP|-587Cu|2UuxL!zr*|8PED_5?9yePQn@9M^sQ;pl}Tts=NfA4z_rtE zHC>Uz8U6chk;`Le*19b-z#53U^DZrxPm^LUKJoPx=)N8JPi>|^Zf>LVWc#3lfXCQZ zKzuu63P%;R1w5h5Z^={Zn)E4QDaTnJbzEb5MBy}lhyMUziWvpDP~@--Gm z;gw0tb3abLyYN1@W#TO+Ts&7FXp?9^Asm7}mHHR^BYxAizYu&YX{KK4X!@0)G2L(D ze;<45f1Yde*6mBOsaDv>8;Iam$HPw>YySWbwZzplEks8oGl?0`Nd|dS?T#zK&$4)C z6n(8Ux!2;4LoUY3g!v}@)_$;FYLe?#zEoEEjDi{S$sg9Cw6%uD0ul_cQ?WtlYso)m zpV}8l_^;sw`$nV_QCA9WqaVS}TRpLl&b?yV?jJ95voR-V=Q*#>xjAIw)tcQOMdm*G zJBPB0X~-ELG`nzdSr#@nkzWa?l)5XDq#nOoy?=P@Be!*8K_DF98iFVcFrPX=xg3%z zl4%HTtt3v$utT~-(39KVs@__JMu|vfBY-+p`&)Y_R`U<KByRNd=BxYw_-FAm!iIRfTdEtxj^G%)&I@|y z+w!ex#&qSPx-)G(8R~b6?&Z=WmCix!Su(I@EFvM(rxnoM+Q_o9lm;`--t|i2&uBXs zZ6lW3$ga4M(Teu!A7d%n!z2^PHBKlV7~a>Q$=Jm7tw}9f2YF>BnT8bAW{5_a+A_`2 zt5iv!C8>}Vk#U|Fso;CncP%gaJ5ErB%QF7}7t*zE$)76(U=n$5Y>#5^hTnHz$q1zXm&;bo8&g@A3OIxWAokWQq{MO738zo+@n%UeLT{XbRpKrF@s!j=h$my@9^mx_nmh`Jnu) zynua8dzfrZEJC&QKT*JD*lfZnQ+k!OgiEWjHQ14fT&C8>57M{V)bT}_HYSdYFyz)W@GtVwc3>q8Q;P}z~sOnX++w>F2XYZ1_rN9Sw%ah3Z z)cS^zX>O?*n|lSx#~9+7W8wRoxLWyF%Z#yDh~%;Ls~0*%#g(Oyvw?;$+*Ghi;%HJ^ z+D6mMpEfXjy{ENr__h_-)`8MmjKXm%i zS5HB^C8)m}KW6U={8G@G8DfrKHA@pBk~(xg_4!Kx;y@k0`*453I`!`c-(BjuE}1O4 zd#sYO`FZ;}1e_2CPXG~LuAUR|Ho0cT(VTfLfZ>jEKgP9udGMRTUljB~WcEqt&YNU+ zKPsP~9qV6fOA$}lV)cvb)gCrylF-Iea-|=5{$M^L{3!7!gf&TQZmkEDA>AC20yD=# zG4he={zo9u+QR-)Nbc@{%;z`+cE@V{oc+0f;F=FS`j3iyE2OQvBv_FaFTd9;2W~O> zSLK(-KiRv)e-1C^bkf=p3!gSN2Xw2RPvKuJoN)DA3ih za7%hqTzNrdR^~R{oSck*N)T*JF>;Jq#Az5lY7z4Q4@{2r8?>=nu!={DDOcr3<(TKD zdkS^P*5K+XREA1f(V`SvMYr_&V1j%4|6QL=+^ShysAT9=~`jcql| z1`#VMFP|krgvhc+rXd<- zV-2~RvHH^p$>vfq$!?(3wgcTJwT?yHQJ-~RyXP+>z7 zxR)Wx+#9Zc!hj+S@u@2)B!YzFw_H+)j@|CczL~2L1(IPTv%m_j5hPQF?T$a4M$xLN z0zla0WF9G42<8HE7{~`3Sg^+!p{4l*EXne*!BNlD8gz(A$&bt(!tt7PyPhOTAlkrV zBa9x@z+)?})oXUhKQZ*AP|8GVSsQoE#Pk&Hq1B8ehjR#F3uWog)2jq-$yM#cg_6=Y-b(g`ID z#sC$D6nulPueB*i*UK`-%@Z6fd+-VM%_9>csudvbJ5wCs57co^_F_nX+S)adRy8G) zYcT$JsN)cp5+N$9$#p+*hk9kiQmG6g&U%75#wj5RyA+`rBr(SW>L^vGeZ!Qo9qsHY zvVUp6%ufL02iM-LMXl>vekHfoXD+8I1AM2}sVbap1UJo&ozHRTDayN}GKmJr+YiCw zx?zpQLHo07=E!v7_eWKyd{prrgl>yv4B|-eWn=t?I5nc*7cb3>V)on3mNFPdu0rkU zw48PCTtrr`*p=>nLik)9VEW>iuGl9fK;VLU``6H6xWhlf!y{ZKX^|R zqQM2Dy3B@6-zWo&3imMHC2<8BYBFkGXEd^$ES>CoyjtzO)JgVfRdm3 zSlv!-<0YrgJiLr4_pcVR*ELN(C$hA^pJO0R=-+gERJOh#)E+jp{?VMr3EZJh3%98~ zabH5bP*vjT;n~DrCEPOS-z>~B3+J)x_*8qNo+BGFvSgV_>Hh%gt_q2BZfLd^IpU5clqx(? zoT`z#2dC$XpGKZFyHe9WV|=O3HlFnZ%7P@FpMA`7vqf%+fXW9C^!2A$+$FTjabv2+ z*C`uG8=_@jk&%Px{VK5a6)LfxM8Zny$5XG_+uYkhHHzTVu7^+6w4GDKBKH1i(&Oy|aU1|W2fk|_FtW?`31sqPNZEtC@sfHI z)Sv#ndYnOCh9?yol%9j>EMUlH4rL)_Quo#^36UYDuf`EI(+D3#53R zq|DNjmBx4j9X%?Y=A)-rYbyvtG*2kQLnhKc*>CWvyJNM9Q3MfxXkD`W-|_Pwm-hha z{OG&$t>J6Lw%$p@qy%I~)lcSnQ8?@=^TCA(V7co-sX^H)2LPf&lQJ5>yZ19tI< z;F_&!i$*Raj zq$#L3`ZBQj+~kB@`VRT4CiF&QmP@cDZ<0jYi4jL|4^lBzo61*hJVwOLmH=`#_4&WX zwM|$~#B$krOz{BOExm3?$G;wxI>!6eE!2>!z1~BU)7R59)GsB%PXuCCa1|0p;E`44 zDv1@VISCBK-XeZtNaacI^s3d8NK~c6BHt-Sgpm@GzGI)^By=4rdFDfF51Aj7@*zVL zH_W7cKb=7;L$}M3i#&%gq#*82GFYC#Q)ZqERNUaQ6%QFamj3{0Pp7RKuqP4=c$(UI zVitquP(~Or>(74G1gy}iM{@fkjf;nqIdFS=;*?t`x&u?(lFFgtX3o|a`9S>6aa7faZsX;OV;PTdjb95R$-zHLo-Yh)c4;j0-NkR@0Ve62 zjyhu<%~!f$k(nOZ)5}uQt3G#**z~CFZk*}O3=OnSpS@Pe-k*;_PRv>oTz#T6Yt~36 z+`u)urZBzF9nCDIBWHyIxKp`g1B6mK4mygCRDxKNPqWCQ1R)aR0CAD)NZv*xHsVrM zxQU;PpHt~g3qiM1$sB7fx_rg<#Ud{t)CK<`# z8`)yB7SqabvatwP<^!e=w;88l5)GtD6}|&9;q%WG0ze{+#SDsw$7>d1es6Q>nzbDF zPi{2joo7*(StEogIqmp=o|P0YX0ng8NgOWBj#-#4=6H@4ojt@$ z6Ub6W^3)lMa8!SuYOmT+<^IoEu_2e|aBvk*W9v_rGYdQtypGcizFHnxagfyP1;Kch z+K71?IrgfPu#K#^>Hd8xvqZ9al6h?zX68XBUU&o!l!{N7E!h$@00!gcE!Y#-cjLV) zLe80*BF!p!WP^{CcgOOg$q14=)VGcNxC*?3V@bO>Oy{SqS92T@vqVf`8*(mwW6x@I zlG{U=h1S)NkgwDnbj>G|D!R_lG_op|3WuWm1KyewyCG|dW|m8kemPkjIM6k;v2>$?eaTy8_`;PwrT4|fi zm(RElCRY<|0ZAPR0Q*x;;jocgqPj;Ku}KCOdy?7qK9n$&Vnz$(jH!HZ2>xb~S!PAr zua!T!U*i2LR39!NO~jHoT!{U1pIQVo#f%&x%5!1+tIJm(GDnpcFb*yeD#U?q+E^#1@Rf$BWZ9N1{l z+>8|<^uX)yODjQbw6JDYea>TU5xofQP1>x2NaZUNF-DXgSdPGU6yLSk`38GSeT7(w zGbZMIanrZ0D*|jDW(y!`Mw*U^b*`#rBY+~}5 zvIaoul5#l%^`@B#Kf4^L8Uc*KlbY*`{*#O}{y^r+ru698l@kUY6NH?aIE6D_q!DkPI?D;`+Wu&#+D zFh{jK(gO|7&HO|AryXfzSvL9iN)*4#9LPRZZpwWL6$84mtP(Eh%!IK&^2ql!Eu$NI zhmQ3`@H}DT^0AEi;P<8%BFjov=1H9+UzGviXSu0Flex^rOJ|k~fWUMHo9COw-!zMo z$M;}kAC*{ZWra(t>AUZG;+<&&K#?;!k7+HoQMmpFm5}vA?gFX_^TIGZ9DWD-Q!@bES$8qxX>6QR z_Q=Gl#IE=tfsRIf{{WRROB5<3F_dN}%tA&^4@2lE7g6JD7FLiHTm^Rfxjb!S>q{-M zFi7)(yksiJ(T{FBQ&FP(Jl3R^^H7j8!jgJp)}GE(fYPs+i`QZF;8L>-jD;hGRR9eA zX3Kry*+->Ht!*{Qf;mW5`|#(H{v6aMcun$Jh+R-)&1UL7NcX11B#{haNYNy6n@=uO z9Ok4%v&nlbCf+GPB$e|TK35;l6tHZKqIe3lvJwK|jPh&@v;o1tfy@@hO&8Qg=z7-pW5( zVRl7|X~<7F{Gjo-&>Edo`I~mIX$IZH?)?v?A<<2xbK2mv6iDs=5IecHx&8bB(2b z@8e5|S$w&HAfK8e!Oc6%Wo9oR=ouFrzp(eKF{H7&z5_@;c_br<$6=Gzy@e+s*_7qA z4#{kndti+G%ut+Ubg9xP<#7T4NE?`j;C+26#A)Y=7tf9`pFSIc#GG(P@~6iOUB>pZ z+mOhl$f`SM+LLU2r2`mvnMp=(;eJ8JdKwHW5W@_AFeI|OWr_Cm6=w0o&?IYWAdjCd zh#Q;NrDsnujYJH4aO0_`5?+BMaYo~GGK`;IYEcTL(Mdd!qP&3g@6-e7QBA1%)56Oj zEgEs2@Qbx45!JK13ZIXgW%r{S@@{i z>NDyg3_udhc*yPf*PZ+V)a|T%DzWMzP!MC<8#{S5>|O{y9k9|4k9Rt<$+|}QhDkn# zzoYneEBhjx<+YX1k(*B!CF**|z>kZu_;*!47}uCwX|lN+TY`riWcROO)Vv2};CUhO z-hmo5z3ALxi2T`XbDq`nzJ>5U=fqlLc#pyQq>?lUCVO&AIV;Z42UCjlZ-ibi_=DnX z_*cX}Y;jsnsA9T|0Q~@?G0XxFBPkfnPjny4I)Qx$Q0ViAWNk-US%J#{^el zr%&S(dk&)pfpdKG$g6V}!}9~&9{&JJyvmHK)Knmqy1wMbPCop;NbkNW{8wL!SMO`2 zwY{B$gvlk9x`hnKzIx)h81MCqQkra9l#39QY=|B{we32u!{6D@QusA>soMBqv~Lom zYGjr;+9n5gJG1xtXYu0|<6rQFc!WVNr)UJw?cE%?>s>ia@Y2I7bQQTBo%*wWYs&NL zeDVJP1wimswzc~@>bi})EO!>S5L`P1&qe_A>OnR65qT$^QcIwl2IW~JU8Jz|9ff|f z{{X>Fwe3#J_GQ%Up_oM+_qOSABk;(kMacIjrG8B6(FW9ZTStXbN{_EoUy^vBoHKQP zsPw3&sKl=rb#XGORaOMC?M^6NoFW$_Zu1Dh=dCf78|RugEgvzJJbE4}BFd=BFaacEjn_ry!tp+kz7#ociXXX#`0mjtcBv702E^@k?~sv`HZ)S;kTp zUziM0VWwC}#{U4_NAiCT2i`r+5?myKjBSFW=3&nwqSN4-It9NE6He5x0Z%9<-mjM0Sx(XseJ5bTt`S7V09XSZ)Nf ze-9M)Y`zcv4%BlGm512nSdGb%6FsrZ40Jw~YfsTNy+S3D9TwtJa=}tE zNKxLZ-opjVW;2vvM^nRnYw7RVbHx7u3@-dP6L^O5IHW2ecdloYMiom zB2SecGX}Ym)Y{9WNoOQQzH6B9K|RPl=`HTBCAMjdQv70UhT58gl0pKM{fxMr3zFoR*;!9IuBQbMJ%8@kFt%7y+aX{LePv58|*HNz_J zI7SJ8as4T#M_Gcp8GOkCLL*Qy*DS}N1J-4KO_fWG5k-ltvibhC2wdzu?nzAsI5V37h=AmK~@XXzR z3Z4TJNW#@HF}hIaB%fblP_&C7RRHhZmIQEql&d2R&n#{7lej47AK_gd+HF~~R3e?p zJmgdx^(sFeD;>vi;F@%|5lE$06-ixsi82cMfGQ-CMmyYcuZ^s{ z73tEOaS4+P9s`HUF&}r@u#;$OahE!xGnnnBStL=(QNo;5GHMce$Yv@`YnJkt4WFex z;>@(fd0=cmGO6dEPsXEGSRzQLkrGwNon3iB+cnEO+_93!a@izrA4FDJ=+$r)V-wux{$( zmOg@?y5uAIl8A$kmM2Y2ul_6NOIxF#PpiaP*uUpT?fJ!)OX zJIZ!(u>85k@xc_|?B$VG-dN;yLP?Qa^)+TMo><{gxwh`(kO!!zL1`%c>q>IKlAQYX ztSU;#(kkQvCfX7iHu)oTerUSaAU|n|--4ype)VDV28Uh$#oT@V%=e=FE zfo?5s8W8cspa*$d_`k#2xMe4EWfMK&I8d^ksmeCrx^c}xAbU`(u>+pt*U;ysU%4a| zQo|p@nD11libj9lI=iUO5juVq7i?`$IIaKUwQz!2(@^LV8j8F=zXdqJd1K95QYQ=B;&92#YQYl zgwFD@h9Dh6u^wX{pj2`BZ6b@Cc?@kP*&~GE_WI_aW1d@-5r|AXT0#m1`LpV2&2cxG zAf2W z9^ijUcKM=_E*>n%gyEHVD~<||)agFXv7r(b>$`hr9CW2v9ybh;o%?dGIRJes3b84; zYy&V?2%S)K)2G&v0!1o2;hsVFLF9qhQ5~wT*-21T_9qQaw6~ke-*5nuNlwr@f!pa& z+C>Q!!b=uaz;1KT|T*GIu}S z`qc9UiYU=WeCX~HMb5?B)HO*wK~R9IBz_JLLr-uTMRkoK24YH;98;}rrg@4lmUF`G z8T@(gN>f0hB3q=GpJpC2g=r4}dk^bQTT4e{GD{v?h+U6U-ll=}x?C!fV{e%mepViY zRhwN-(VAGK5zLY)jx!no<+oCCSUF3fqKY9%_gufoj?AH0^uqgl(oF@O&zEb5MOES@ zZbxk9rIbZDj@2VnWo&%S+xx`&R4IKNk<4w}7CBA8WHBAr(vs$5*mSnYkQw2IMiGsu znET&adsy3A*~tXzcQFMBJ$=5EYPyxvK>&Gzpa3cb8;7Z=f3#g>^HsJm0|ogUcgJdJ zNsB}(OB%@SB#-h}p`VE1VRhS*A@V{gNAf@u=z9m>HfFjoEI6Z3zZ({Ce= z>6TG$9D%i&4g%x(nu<75JinEOVZ?y-UrK2vh;r1C<=Gm+5#D*&rMVuts_f1qc*f^a z-#BB)%~(I#OsvveF-K4JksejLW2G?5404N@7u@Y=+Bcm}4%0M5x zB%GXnl-c1`XI4>{P#skC_NJNOjG`p0;h3|AKQKO`qnXvl(4+?#+^3-({i>Gal3^EY zYcMa4!wRDv52>Zhdsqe_ZNVyj_J5UC^S2$LfN**rN_29`EI>+uTX9?y)}4iPO%ah# znH*q&z`)KapEd`WtGD=ej9~iH4&{?>;KLhm4@yUJvTahkvI7pHi!izz#kLj>sKETY z$6szL9r1b6KpzFbJJj?wC!FKvAxoFqu^zm7)C)VvzEp~l$+(sWA1^&AsIfL#GeNjC z*uf)W`_ML|AjX8al$-|TN7AZ!=_q@3tWEVSy0}cq5nZDrJY@d>jW$-2Fa%4sLGzIOgPz8l z_N7!T*28f7t1;vJnpvk%1kmu(rrD65Mm;JNO1dOT;*19_5wr4VvwG8^lLA1J?k&N= z`={H`)fLo!$+=xZkan{b2Lsf5(|*{?yK3|wCI{X><4w~SF?!=Iz9vRqK4T{Y{VF)7 zvxaT%g`~g=taxAXsD9CLBPo!!HenF|09sUO)v+3e0DQr^gX{F6M#0QaB&4%U$_gOP z!ZDv*(?qP`1tULrh3qO36s;!Qi2)xr;m6XX-;|IvMN3EbS+S5iP?AHr9MUX%r1Jm= zkc9sLT6MC@_Uh6)7RmX2sV0g^B57d=Rz&#_oRLk8IFrZ_ z!n{L*6y#%Q#|EdEEN07Qp%|!O%*S>=gwvA3CY@v>%x&Mh+tGOB;;&gOv&!N%{m@^% zkG;)UO)1&`0MXZj!NK`J^)xx8H5Sb1;I~2%8G$F~EPHmVGT8YO%NF8J(YP?<9<_Eo zE^CS1QWgQC8J8RnrARcZ@h6zp>Z!0PX$Ri-6`PrA497N0=f;SRP!M@;r_(iN(g|8& z7$yW}DrVcAjreq{_F5>0OwBQq=Q|UoPqk^mrTJ};s=?5247^mjg~pRG?X=gKJgFy@ zL`0m2Ah7p6>p^UQNWgv&WPndUTDA5G3@sAO7#y%<9eM3aw(_LSBgm+-s-Z5u#YOH? zg@|o!_e{+>L{%A5tI4TW*>JDR9ALI^O-QhXl(~^urZROV;ROO zThyx!vb=^nfDwZ#9KPZ6d)1pQI_@3NMJkawE=z-i1m>AF&7=THbAg^>+D09HL8+5e zW=6NSk$kehFe{P|vFvIk&20)+>RQwMI}|fCqfzqZakQPM0D6kGb!}r{L{?!N9^Fr^ zWm@=&ZLXs8*aXSpj#&HsDy{am_m>RT@~f*IqGad?_kgTDm07=d*Pant8xN=mmRPr< z?p!*R!C~oCwI3G5@Ce|MRK|Ib43Gx{9)_{x{?NKB6eJV4Y?pT=Ra^Zc=G%J0-@YUG z&Otv));M@4uB1A(C89Pjd{+dMhLUx08t#kB;|-2?de(fJ^o4geNqprHec$$~nbBhl zCAg1qxEYn3sP`U%t=Q?&qpWf>At*3hWUwCom84+^?2O!}Ey!N~08qTc+Q_Sg%9dQ@ z)2uD8BZx-xC?Sie&&tI0&!uVGAoEP0W>(s`2&12^M?JuWo;QhY&OdY?tBmtcMiw2W z=z4w4+dHo1RRtq0fC=k^Qr&5AK_1v93$gOik;{Mes+!!z9Hmv(IUMkD!kSZgG?y?# zeIkr~_XD@DztX3b+F z`=dX8h}z=jIP^76Hw&a$`4Lj$85uJ8xKq)W9V*egVkBD+kl+Q}GqSOw zyBXfHsWC~x$@$oSL02s=jIp_o2wR3S071{vlY<;&nI*%O{po$6zW{%G(yT#sZ*0i( z%m(Je0C`_rih@=u#acxUK*&|>$# zsx-)RHZ13k@?jh@D3ADybo~38S)&%^M9QVZ;n7D`^fiqe-+7*Lec2y&3W1OIclEKbv++Ev5S)*^CKXscY9+gg8*=BZ%-W51;^KIp7YaKe>L6&&h zSs91~H$k7}T2RFbI!w!enBRfh)|J#lmB|@Pr(L3(i7!L6jfH?NHu1+j=xCh^s)3NC zKJH2O_N`4tk%^gY_Kn0wvGPuP)pv)4No~Tg>H~EiwA8K+1R7?IZ#1r5*~2E*WjN>3 ztod<5imeXJ3;=PQdeb9~9g2%| zrcLaHOYm}dIQ1Q>NTE!zUD<9j?VKNPN_^4ph)?Bgefv}skx0d(b|amj5`(=`86mR~ zG-1X;97&9f)wQ;^nlyPLWPFuZ2e++JOOKULB0j@Ech;v_nlqCLKiquqXj_z;C%9W% zYi3lu5}_C@qZvMxO62n-%Nv$h_~(J|ioR$2MXj}#nWi$zvOCVi?kC$Ft3Kz=kfXzE zCol6OQ?j@+8#(5k!I70$_(&gj{{XLAk*t93Kmb+FdXRl;oHqO3MHbF>rbz?t`+aJ6 z8$@ud-#Jnr2Z2fX5=*kqBxxD)Lh#Gf4*B&pB6;y60UD@b!72`a!l@hh!W2>l!II2* zVc!)Tnyhohwj7vTa&y%BdkS2wh09l0w&jFoV5-FC5PtFX9+eZBeB-glmaEY9&%IDC zk`uWYb_5oZmH9hzz4 z+T8@Q?>USffcn!>Y?nBsSh$!OT6ouUaAcDl6zso+MlUVd_RVpP$C1|_=i0JZUurT5 zVh`oA08ab>dsD8YpUM`II0HD4DstZ6O4E@TIlG!B^C$PHJjG%a)bWnT9qKo`h8Rkj ze71HWiT<9InAjM%W@Tl3?k6O1&{MqWA!m`KSvDy7d*kt^%7x6!=I%c9xo}=o*o=NagFml& z1!hAgqDm^8k>xkeh(=EDZ%Rvhxh9{@g3to24i84DX47M}yYdWp&I@CyYi z(jjIs{q`ITdwnPiJC2SBWslB|+iMpg*dLUC_382{8=;c}3JTzI57wrNSR;*WkpW2< zvj;zW=}cyhZ6miLI$=Y`fzsFdz$jKlZ zGW_NDeeY_$X)65t1GdqbbKa`FTZ<|nV0vS>wHB~8GkB0jry~u!>Bps64$==gR#?j% zge#5M`czSV;zcbPkg??d07|k=#G4jG3ZU{?dB^xwBq5O8PxgO4*^mt3Q)W+JT9q7I zJFrtI3zkAS9@Mehd8l4Y_XtyrA9`i2jns|g+#j4|?vFUF6)DQeA(iEYioCJqyQ&^b zeJPR!Tt?9`5B<}OR-Bp*{DaI`pJZcp;yDEIS{f&Wbqnk)R;=KVT1Fozu9{hXDx}g; z3p1RG3yI6TP|6}BfOGSa)O%Hkpt_kO4G~9>;c_dpw(yF>IWjRhJe+)@wBqosyi6p0 zn}2}q>U~9f6u5S+MR`ckQ=$dW11vxu=Fz;8)cF#ESphW~=sXhMyrAM)pZD4-yLE4{b1PH)FxIme1a(=bw z!klTw$rhrM(3i`K+T}BHL}20LUZ$tirh!N9;`vA%D{?sQYP3^>l?oM=cm(8;Rj%&Y zpf=J2wDuexf2CV?*t^*mEpL38Op6!V9$~PJzv{=WM{F`iT7{mw@g4<|31m|}lbqxd4h}neSL*ld z(WU7cPMvM1SzE;f7BQqY&_WU1#bIA3L*%JuHSt)kYR~=w^}U6Nwz3jHhYiRKdBqPat8HWT z0;>Ey*KE8|qO7*_Zz!Ov1HlHh?zHk;2-IU8abJ{Fi-ks+?WUxzjL$qV-Wv-{GOUgA zl6LdOS$lUGEfB!$2YP{_a*DgQkmR|?QR(ecn8>9i$1GKQfGRfxoB{ZXmPncV;YUMF zXkEY~991S3Osetxz~Fn6+L+1DCphM=7z;Pc>CS2*jE53qoZx}QUG61xRVt1*`|<2* z84#?S)a8$-VN0s&R(d6jx{jodA%#ma#HE z&tYqF6;iT~kovU+V=Tdm$5JV=nF`2-vT^rF=kTY;BIFIYAajvU!vs`(Bjl@n&<7@* zR(n}hRZe?*Q=F;!oaCN>ae+<|g+ho)IO8X+0Cs;4JbN~kD2nU@8GJH7D#Or&!4(I_ zzl3&^>F?uz1Y3{n={{?_W%<6&?0Wj`&wp{6b};Iy<96_K$I`4vs12l&G0<_|xNC0_Gm!H#k3yVgwXHRn%K;H$r?VWNb653= zy@%`~b;#;pa}EIehriaO^8Dw)AU53l5m_33t;k%4Jpn!IR?_cxBytaNT0;=zWhzM# zOK!VK#&OcA+}aVjc5~P6)~E>OfggBd8RDUu4d^#EdBDweLap~Olq_@iHiZw|`@^MT zYC2TX6D&#;5((!Nx>uvvN8gSdf_%|)SW8o!1$ zA$4OpM;s|$IL~_Vvs{v%E-rNRk=cdD%9G`m$KMg$K{R`mt7rIur|k^id>-Hm@E?P} zw3Ih7!=&qkXL(Xd;lCeR_YDWcx^}N>vfH|V+#L25@YV3uu+=##D>K`K;Zi)&WcLiA zH_UJ|$30J_Gm=SD-#I6P?ewcg3t68b!v#LQ>N}e<6OePB276X0s}N5kxBws{)6%Ol zZ(h=(?H;Sj&*O2(f_Mg%%H=+w9wP(=U=Z|!)8C~u!V+_4RH&6b(dDn`5 zJX)4E)@;SHOoTAU(08v3)I3eB>e88RujcvB+-E&0Et*ZHU9GutSGmV>J!`HQM7|*@ zC9&w|;-0U6sQKdcK#j7<0pxc4Yu^6=XU~i1jSaojXv&lSz#{X#iocK}EU$8UO^MiQH)qAoIg+Mj9u(Eb3^{y6+Ap5opllTomY$qQqa zPU;98A8wqV$MaX>K8HVr_3MZ)tz=h8JhKz7G4-#|-+*5hh4s2ab#Sd5fB+dmK8LRa z5!$>f_W1Y=x-W>E#u_ELdkt7_P^pww#(MVjIri(psmiemoquB?*M;NEkCpUK5pBd_ zSyT8Jp1!r#=-T{~lKBH+89l4Wro6h*by-WaLe(WI00b~#dE&aQ16)LGtb}oslflh< zwJE5|>tmHl==IGjTVu0ooQC_r;8x|1q9w#?;4m3w&tIi^&XcW%19ZJP0D4zRVR;iM zV8oulnwYso=tSU|*F|;?3V=?2=`;w|P|~&t898Ipv90gRe8l$PjxcLN8{aktg-{j? zlBbOO*3qnD>71vJ@2#VTMRY%O;2&D>uMi+=CE*!rsanM&)O5F6UMJg^6FZct(tESn;k-@Ygfs@pp=DV#UOerHY z5g`mdaz`p?(ewwmREBuKVgX!r0=hdLFs{;6dMU3KTC=|PMO#}XR4BO_9Z#)Zg23$o z#_V-qD*dL8=tIiDfPUhPWL2oFTy0$764mc#(`PHOiww-rFxEw`#5;hSPEr` z#D4JkGm7ib)EGaqza0A}o+A?HLY5bQYcz@YaKGw%W=q!LT+)I{McgT-J(K zrmi^Csnq#%!@slVj&J7^-dPwTSn^bYS+n2M71wD$vfK#@Hl?VB+IIomSG-Fahb*z| z?}1tOFqt24=N_NVxh0xbmdPTW7`JwL)|2or!CE8kSPYWw=L^BEg4@H|PMkcO9Wo>- z%WYmoZb<+vGB8i^RC8LB8F7LM!S(!Wnx-PHPl=kP%Cs?Nf#l41Jofb!PJ0$(wU-3@ za=!JsEx88)a7W!fwO!#T`&lxia^KRXH6)38ob1-Wyd@$9NWtCQRby#E)}% zq09Dml)N`~(T$9A{8;Ipxf~qV>X{D^(9Ghg*3zQZ=_G8$oBJT%@To}gUb==QHykG zfOx|z9KKtp*1o|_Esq|gr#J5zk7pW4t1K=uK2x3ty+UJQ0}+P#j!7LojcE&M8T03P zjU!+6C(@|gz#UE>46Boo*V7fzPNHPW1}xCW5D`QlU?=A42e0E*F0B?+!=$)h zmi;CWCnE zmJ2PhI96Vy=hyVFy1oYf(i#WE?Gg*vZ_+vZu=3kC-dD#fx3TuGfNm_-ZScnCTrTa( zI0Cdh2jkxp{4>|$)wG%1@&*+!PCK7rUpt&+aK?W6j+6Y)R|A;3U%RRB{zvM4fV0$* zXSjaBk8Jx@O>#wmAG6G$1ChJ1uMqv7KWZHx;vJQ(rOp2Uk*EL?M7Ur#cH+IZ#`4!( zwwTJQ@*%`z9zXi^@iV77Q{|e~9`)kY(<@u*5X%X}ckjhIDH?l>f(qjWdy1!W#V(0> z%C3HBz~-()c^DpK3ELcwX*F$xpK;f1Bv1(L*XHCM-LqKtHW9;a$e`zT0WHWrwW&9q zHNy279FtV_B!=7wqL4NRAf8F?YTym(VWP_%Wgun*G1^>YnxPy54euhIjMy#j=xbu- zOC70`k)AtME9jOrScI8YIopo))f8sRS5v#mf}mrjYPHR{5t%nGOLD!c%Zy?(-STtk z=~bteBFu%j>`1K|>SmiV?_*puf=FJ#a%zjH3R@s#bo4c^brirnc^jMz`_^U5Y?Hf) zaG(xPLVM!2OF=!#V1z)~2*jL5Pd{3%EMUG_vAA+ifAFiaMKpz2KpC@<>^-Uptt0^L zAe>{^nx$kSq*hHVVqlnwi2<9bBj3`QBSpXWapwaEE7qsEuoIEGMvN%rZa+8Dk!?~K z(Jj@9=*s6mh^oECVube5v+R@Sz}!>5Dhr)0lq}LbYo0R0oPULF2wX6A10eJxnx}VY zZW>q^e(ht)k%wIW01aFqSU&aJYPRRnH!PcdWaZFYT@p^4oYQFiIQ+Z|20C9p4~35L2oeSS&lL7RM0k|AhU^fly97_ z4r*JU5Lr%(YZSTivZYAsdRM0?+31g{Lp2>X;>t{v*&DZW-m)&z>g!Nb3*?5vD)h&H zsjV$ef3;hA5<7s&(Z2A{r4iUV*~dDS&UhdH{@roGJ1V0 z=~+Bas%i6muTEovcX?;H^sT=S__o(qg`x2X8zhi!*qOy^Llstn<(lS?W^-fk7<|H; zjI@_?`P==ezhiG1d_2}}HL;>iZu^^j0v<|(fTIJRpXVHS9;at5iSn*(+8dRRGQlVC zA3`hoNBye*0AfE4d{EKm)oe7#?j^j8vb1Z^0sjEk{VVbx_R9YNf`96N3iS)C;iI{V z;!+}I0J;DILH)k_9DNOVxwj9}oiD9mo!3>>ADw1dMQjyTt)cO7x#{M@ZL zgre-v8OFp@MY80p!22QE@~m8O-=E5(F&49$2az_rF*^y|gFI*6tv=Y{c)Xz-%O2Hc zen+(<+gt5hO)kmga&tVgK1`(c1Nc;9>Us95Cd3m6^%PH^%9zKsUSWl08~}alBlatZ zqE?N($UzRtC*RKl@D*-(ZEfOdro3M`p*GfhP? z>c@QNG~5Rm9PzPtSvp54WXBv6@I^mex#z&KvK6(9~XAqM2J_ zvHt*;c<1X(2FvASpEv-x-rG+;)Wwk+SD(vfBmk#(L+?__CRn^OU~CxsuArWvmjF5ofIu`t1r%PfTd04hxi+L1=`GPF@#q4N_C7-g|h`7UDnykx4k zzoGOsbIZ3EB`z|k5MlBGcJ%sGJEL20#Ww7a{q9bE4JMGtmIEt@V9w_lKkS6RNLC--*u(K8U26psOkF8o{k++x}v2n|Bv~a%1 z)}k$Sy@C}|M=ZU?PRPMT&lpVns0sVji4ouBrp$rcwIsC=#@H8nwp5OVurrTd)RK8@ zce01dV;Sj=^(rm1g?puCh`tJg&P6xM$IBXI_xe+9ffcuz=NTSDl^N%)JVvRR)DM({ z&rp47`&(*C%b%ErDtmUOGi)k&UQw>J)S=w~F#pHoaa z-P~}P?dJdixzT!a)lcJ8U0DJt$I4FLJ!$D0!iML1<#@+)n!l~$AKGH%k7HI%cTj6w z+oH&lFb-S|!yn3|gH*aRNw!x~;4hS0pcR-(mt~Lw&bY#3C)*wAvlfk4?GZL|GRx5i zZ2Q$LWp&hE&L+_D9oocn;@cuDU5HQ==cyk2Q8v8sM<|seRaEB#A=LJ)Am&Z@Q@4x~ z-3PS_%Or=*o8%mnAH;vB{{UL6>-di1_E0x0{6w)tWEZkVBU80VIV0HAE356dO|G$! z<>EoWW<81Ytk{{Pn3--c$sR%v;vR?Im8FtB?I2z4jgXQ4uh9K*N7t*{aeFBCG~@9F z`(AynX_>)&+eS8_`c#l!Lw)AlG)DF1Kfa1NiW81F&rE)`ilNG+5y&ImAqpH|l75}3 z@Z6PABr%4XJeCS@xc>G%X-64a`mwrk=#JXn*6RN4G?*h(GfBB3^Ets8$@JrzmO}GR z)2hPRIC#e~u>%>!Lp83X&`KfG5-6DM7dH#@H#y*rdj1saX18dHHM^*fB&p+bXR+)n z-O5?p#Y%wYD~~UA&gExgs`PoSsSgllj!M zUr3Cy&mf9N9#@v9{ZIp`_xJ5gneCfTU4S+itj;7ml>Y#9kMsTvww4hjXIMo*Mg&8X zf!{syD=Q;gkhE7fALuD7MH;yCt`zX9e~atdqngg%%I((2Nm($TxDv_O^(=dz{{U59 zd&sWYk_&y%l{pZetDfhsYdU=@+}_D9yKd+ADdfZ@C}SDn*Bl>kdW_W~N5m(Z-YqnR zif54d*RFApM*(r)JPg#4+(kXBhKLgTx3e}&mEd6dRTk7N((XyD_sX!chc4TKw{i!q zSytT&#$@v&l0p|`doWKqrtSh?!E*7w>taEKFdKeYzuG>P6TGp{zByue)ey%rjO^p4 zJ!rdzn!|fX7(n8XW%KI>Q97acP!kZ;nsuzV z?GTVf#^7_7C+~C9=~u9wu2Z{U(dHXvorHnBwQLp7e9?0p5=`i+u}}sGpTKd;XV*1i z>O*A$JmYQ0oD56|%lbyT;KLaJB$zyYH3O}SOX^249;AKP{a+#udtycCd(@{GO=j(I*<8e4N{|jbzp1CXSX@A@3d<=WgG{nwH6!?d{3x&p#z72_mRZVjkpYdY zd*{>InI_lTw-SEz{pH<^PLRa3MMTLY=~_n^pHF%8AUdyJdbCyxyu z9YcEhiekB5Ew-m~Fl@+nsXPxsOK!4;Ss8;q;&7wxE`K9a$G0(th~`ZBLAq}5oYYv% zVkJk7$@wDdy!ucYA@0{Vk+r+sEHdY?$YI;*PIQjlJm0m5=1v+m8D&5He$?5re|IDW z3og>GIpe)nxxJQY5wDQC#0yB zlvpp=dGm)|hiCzrm-MDfc@Sr}w~bi&VU?Wp9l#%2Y_q)cnJ14D2*4bGj0b#r(g>NO zH%SqhbD2Vnu^orfnz1(!;$4F1D2#p89T@r(NF}(Hb1;9Dovb)3?N3{IWws?EGDMkU zwEfV3ogot>QJZKC#K=*KpOw7`%`_{GQN4CWI-{>dJ%37_BaFyJv@9LYSqz!m>T~t} zbi|C|OmVYG(1rdZQX-+ma74iE0PkOVg8Xf&=g%BrSTc2cTVL}Sno=Sqd+RAATeKYCOmNp7Qi4?|u_TiAru^hb9FqEzFaIIsvy8sAI0n`j_8@+5HNs@XDz*W$?a1$$_YeG5R+xut7@Www?$?ib3C$gu5p3O??A zduE{uS~=OEm6VK)fD8=OS2B6=L{b8|atTv_c;p&w)W0G;oO897rD|@ZTzo z_w_XGaJwHBw8g%{U}uaPRd$T9rJLdcH!19Z-{y zD9|p)MX9mbJ6Z%xmEKScd;Mu#OrfLRBn-bMR|Rv{oU%L!AeKVSAtjq&$25~}`S7Si zr~z1VX)6YzGN@&VqTnBuv)>)*%WX7~O>ePUc1(<%XP%?b3XO-98sBc@bOe;@GuYIM zsT^TNywd=89gp*Vy}hY|)IP#cmv(73b1bXC!R%?T8Y+?{kZx=)PD-Czono7NTtqkR zi}&#-LY}zw_4-q!w}Ms?Ec_yeLR+UD4NoyvDJY38+TBJZB%d{y9mBRN%quf8h^>^g zpL=S7jCRjzQ5?Qws=7#70AQ=auf15axOB{4X^f+R<>5vKI-mZ%DLnx#N3WOVMR2O? z9IjGyPn3`;kXtlunX$2?!(d}0`c(0G;S%X#0StsL;gHkb>j%}&{USuo=Ngke+ zlWe;YM-1E51d*}N&RQTz9jYszx%QicV*X(aMgoD@W7e%nDYic}D(y67qeNlPvGk@} zT*lKxs)fNMI^(C-g>bScy|t!yw2}yE2SZVL-c(*eQpCtw zR~!M)6}K9v+V0@OK* z?YUx01~~)Lk0ICxlu9B-K4Hfof1Z^SMzRM)gp_ROJ%w6GT+Cak$jiqG+^dn3(>=vf zl4WV1ZX-Au-gA>vv@YO=jF5?zWgHQl0sjEjs3Z_bs`mhd?#tGxXo!<+jfr$++rtbr zluXhIW0obrha6L)NZD3S7cvmBmid4k{pr)gu_c{mP(qBM83a?0#D%SoZumwlTKIC$oWdGeQBnb;lJdx}MIIl+dIq@sRekF>}!Op)WiBWYFgYLI-E7qqvl`AJtN3uJpx=CxX?0*Ym z*E~t$6?>@(i6q{w<$R%Y(>}HJhr=%%>ee@wddG$>EoPR)?Q14b45|lwbJqv(ubJ!; z^TUSQO46_0BfB6=wK(~^{uSx^*MU4!@b^s7yiegz5r1i2PcieYZ8FcbK*`!Wa!C4C zxvGtp8ZTb`%a1JDlRGbuzZ3PJ9^Or)>Y6H87~|RG5wNPB`0jn{g429S;yo`(PY>yG z{^<@k9!3v;t$LE^{{RfUeenMC#vc%FZc|vWQm$lXNh3Q(0bFn~&JSGInO=N6*ILRy z6X?36ZDt4hlKD72_~SL#lT^Y-4eVg8D7|moxk6mYv%!Dhq<##S#=o-eyA77ZHJFa< zGOk)t8wM$lf9GG0dX39ItLFwAln_ojkM8|z_Gk9#)$VlP*~4G^9LpSr+hn5|AxRm> z*1s9`Dbh_qMzLTfL~J?yYx18J6|)#V==A8P>>^Zn-*k~E$~s|y9FJv;JcaWZwg3l_Qsvebg+>%)hYP?bvG=dZ4N?cR6C*1oNpr?I#X!bM8StA% zK43>U{3^-wcY!8Bm2s6lN58d1*3!)ahPYCs96GKEZ$s!modXhIv&$(F-mAo83L_xo zoO;u|@3X{i#6$wS6p{~?MIp9ixmc%i0618&LBf5NWX+su&V2v^mDr|BkWbHsBafy% zsdH);BZA!;GRm$HE?*3C2TawNBaNn361-@m<&lZU(~k8SM~~+Wxg%?Hz!c;{%3+1K z9A&{BDq9%%-{lZS>%)?P`T}~Adr}wk<|fr$qCu6~auk8d`X5?yq>m_!5x!xxlD!A5 zNQiz|kKaEdZR3I7fFL%LJbSIq;@QB?O<2>JG^t%fO0fmYktfQ;^*^0R(;#?^XgF<- zIuYyn(>~WDZ?`ZiL_TB;Gq}^c0?xI6sp`udmv;rs0|}MjC#U}aUYVxBY8Gf2kpq0e zv69W{?M+FiMrXSVG?FLGh&JtB!kY!Dw-PzvvSE&TXZcm8*bZcgBw*mHGLI|+fKT|- zl}b1;L{-pyfa4(Iri#+yMKi~4vd0o_k2u`9>V5vT9lR3UNEM<}{4o*K)y0a)c(+GB zY;nla?aS?d<|@^rT9jKil$nlMq63qj)ZNySY*^6S?QOFe4>=vhL?yXco@WTIfb5Y^ zQCAkmY(;Zz0gT&88(`(qZM7#z`r-6l`v8!lrB6 z;zI6KUnFi~oM+OvjY3*9ceTLtu8*2I^E{z|J@HJH*uk-&8-_?Eep#xxK53P)pC~Ij zgMz=-tfQGF^3{Z>pl=Ah0q>gL6%j35MM&h0QD6rrCPr+6Juy=imfkEoGOD(6go3BA zrl6WASZVgALeI(&Fr3r8^m(7n-5i+1?&wFYcG9SkjG|3!FK1R;dEvryiB#pu{v3{# zDGeDc6K`oZH#qeC>Xn>DZWKH2IT9Ix``=2Qc;LFbHxD->hhR@Z?Ok!Jb2k=?2!X=x zM#?cEiS?&O&y>#G7RexUQJJG{tk(fnHQ|Z&rHRY3yAc_F{fEEfSM3nFSu~RFAOtuK zxZ~2Ijwxqh8QL=6DI@OZ)}*$UHd7RGtDWZ=I3w87ptxlhFKFY+C4{3JS$>r+NurVx zD1h9c86-sIiQo@fY!GHM6w(Kkl!X9e2Rsu?HY7mhcC6g*Q|akM^LcXxd&E1y@?ur_ z!2^@@tYyr~Ru%uJ*uSkw>L=aV?Jzy=V8Gldew<;q-cS87d!dN z{*;d8GOHi~m*;;$?eADN%CStOvJ6KUO~Vo~8NumIWO%p2oT&gibHVnjR_hZ?trR13 z41DJ!9=}?GNLiG$u*e2Vf(`&9zAH8~GF#PM)3TLV#!F+5!lgG#(W3&4c_0JF)YM4< zX#fS74qZU|pITU>F{-1w?Q?**=Na!=vX#ZMm?RQ;sL0Z`5%>*&f0b)4kh4V~AQoi+ z6qD|se@e;n=Esz-a;^Q`oxX$KoG&#CSq!eI5mOQ>oE06nd)5^>8`QYnGfMkRidQm7 z!^{W)amELy)~m?L6RKLvh+`uqhT;#Ys$zGz*(4GcKyu9IIrbDB%*CUWDSQowxE;Og zigDLNbo3p%-V~NdUvW}f36zmKirTFgKi%Jq0x_<^$}O@s%v6Ye=B-d;1EW zVe;6h@H`MJJo$~JJ7UINTOWHpg$->X0Tidpz(yI`eL?M7R$6(yK+(KhL_9KGd zN=-%x;072JJEHC`Pha+b3Z7u)D5PP0$U+P<{QJ2F+MM=JaT`Z^&ZL9PM1lzEQ!t5v z!nVeUZNVI#^(~~fM&V+-XNEDux!@_sbK0f030Q(VTl;8U8+&CX)NOf38TIxxZT3dl zi~!tc1A^Vi_N%e!NhBU+q@m#hEi0V-r1h#70pnn0b-*|-y%>6rt!DLQTEufrB)({6 zZ#F@Neg-}1kL1BTer`(v^Dj6*<3N$E%lYLT1DrVOzLeiO&6E8OQc-eF`8OVVicK)) zL!Jj%H)Ipg3WhyExiRfA7}$w?!TS3O zlam6YB75NWSSX#@?qNO!<6*rzj~;~;N686E%tYTSLVSATi?EDiS82C zMU|0uE@Y7Nk)DF9NpS7}Az8X`xD<AMcAen{Mm=j~1!6A6x(djK7))$foz47W zu4$Jxwhpp=n=#DTl%KpY=~?o$lSd<4T&uFg3J>q+_(#1%ZE~uLuPb@PVdBsFzj|&L zRs`&CUTPL?F)O=o4Tf&jN@=A_xskRQgg`{=$u0G&vLvpnG;Os*Vap8UdQ;(sR!!U0 z6-G|(tUan#B#_+OBsWVmW-yG$2P?arccMw!+Cq`OK~Q32-@YlJGepb?BrnPr?-A)x z2L}?x_gS{ECp%B{rjqDGWb1JZL5zn#DJ64^lTgWVGLMw5(~#%7`_mfb6>vc~;f_Z& z8{MFAj)7VD-PnCfJ)US1H@iW`96SrtB$Ugqm2xEr9-56sMh93U_{d!}f6y6bz<;-Q9 zpP~N%8j=QOc&E2^%)SHYkdU`3iYB&VTyUSXU;Mgp#Di*OnW(=qZA5yO=Y4jnp17 zP9+;H3X;o>&fN}uDV}0Q8>G>RJinZCj!$X=<4jV=bCes=loE5o`+aJ{kVo1Xf`T!( z=}<{{@sS!r0+Etb@sCQ6`$WXs2~0>nRUdD2_=cQ5CbywRqgoH^6D2v&*jF(Ii|+J z!5jwqRC}Pex87vhK4TjzaB02h&yoY6PhE~86r(fLYC%0zkK`c>GMVpA&4 z;_?J!RZvW4kxZNIQ(H}9(gEf#%tHLi5AvmqLI?+WP5{`{*FxD%q=(^{92|O6LK5aH zpR=Th7x!aqal4XAj^>{PY+a>S3UT|wN9j=*rP$AIJjTb|9F?avlqEdwqSW$qViccpu|dO{}AGGlh85{aW?Ur`CfHn-S>2NMfV` zwENN@DK+&_q5gXx-`Z1PG(>K9=13x5gkRuweRiW=m} zv3CYic9!fv8kZvD9_0aSA{&G%gyaOzzdTbUwtqYTiWM+Xhg{Z!+w5HZpXPSYmRlqq zxToy$q%4CUE_jS^Jt}$HE0r11*_q^6h$GCDF5tZlPL?7xlI{t1gkl<1_U%^UL-uu! z2!Us8qZ7^v{b{dkAz>SgVU9L8%6-miT-yZ{h~TzR-eM$&%t3}d7sL~y0x4GgkwQvYos!AHt*_iG~KTe4I)0_kvzmcw*DgmFA~M4FP|U2ds8B)UKCACo zf7%+8U6*7f9rhBVr@u5Px44|r*y?XJy)pn2DNsJ*N&$i^HeGF_EfZQfB<>Hv;P=I6 zT-sdCBbY5Fl_S9qkTPmm^!Xsh-NdlVlhse9K3Jk$q}e^kh&gbzPjA3f_V(dpjyZzwQ_3;n>0Uht%O+;Q6p~C{W^&9j z+m1pC)U%pcBah0uCASq4jy93dk4jESmE%wlkgB0@LGCl@Qo|Dk3aF|O{KFr6H03P< zFlmD6@lNYIFx;eoM?ibju;|GI%NYtY?~D`cQe?;xEx-kiBSv2R`hPl-+SXWRG0QkA z7w1yEsXm6H?9-JL;l$PnOR>ilEaLjPhcs#(iCP2(jjgEKQgy*^rFC8 zL2Ykui6419V;m9hp0!b~;)>wFWKFwr3v?N#`L|5xF|kbK58?yTs81ElvM9hU}dznkd>b6%od9yPW5O zDdyJ2;4oZD9ITn!y9zVk{Q6aBnL549x1J*5RZDGu-YOr~uG`&DD{nRrbna-D zFD_VADO3)2$h}zlk6}`Tc$moyk@ND*fOPi*-kY;RS{4>oJi>B&XR_5nZ*a_^?>Fux zazPtMYP*fGd6O?aRaek^_ofI5k!F6|XCRS@(3A5oVk%uRX66EpSwI7E?dzJm zD-&|!G+SCi%jK&O#2gZR4O?3|IduojbQ?$aPh(VLD=y@C8A9al{ZLc?@B z6vhaRj!)K}gRzz^+?P~V`3C6;Jpt`anns8^a!cl}}N+ zHrjOFLOz)r7ow;x-E?ljbGUZVI1z z%!1nLMKVT&#{U3)&jfo4dnLJ)S=!3ua&9sclHdJmRt|FOY6^jtERD&QBd4&c8jbJn zf;{TMk1;6PbL*NTA{E$142N%+I&S(@H}f=7J-!KM7z1Yn{{TuNwG^eG!qGaEH()yD zhTwVh{HZ6GZMY9{h}e@UVT_+|N~o6)Ir3$70f-2SFhTY{wFS-Pu>{`SA}bsa=di6D z4EgM9TTN`AF}YCKA(h)X^r>|He&WtneLCbBLH+JmDhH)=w$Ru}qFC+ZF3fgF&VFH@ zKMJ;&vBsf=-ov|VDITBBp~F$BuBOhbuiok^`i07JvF>Si3?FP(K)W|q(n_?{{U%@B6gl(M&J(A)NCg%#)Q|XRZO9{Ze$IB!yExs zZZ&ty?3j>)Ef6^g>G+zj3%3ju{JAY0gMfWSH|#fz#O&DRH@GYOKh~X+A-2kw8rsVz z*=^)xFV;y8S00V)R&3z0S5xMRmpCk=2Y2{WHu=PY zJO(6j)Kr$5bS02HB&cqO(v{G1HdVKQ!kK4@*}&m|z^gMxlG+#`v>{GIW0pUSO7KDE zZ$*B%U>iC10-}<5Ap!1@plp1KTNrP81D3^A)1-)O*|R+Z58?j+8X6#=ff+gFNN$bw ztFhfpHbIZfKry?4nynhfaTF?AIN0wQ=zg>ZDk9VFEfVZrB)eH36Gl2Q?^+kP5NwX- z#O>PoR9<DfuVQLc#QK%BKf{n z$IK6UEz(HXs-f~^9H2e(>+f1o>4NTk^1}H54Vmxj#aNq2wU#H0ULlnRe6E@Q018dm z46ruF<~2oWFdc}?V00B2O^>uj83zYx`HA;5`?+l`p?M*>^B9~3Q_kW1HCW%oCCf5K zgaQ-$r@l|ERkQ;7>2g7~<~unf4ady+>B%_lQOmLwD-a4-B~+Z})Y1(?;(I(n69hR_ z4talZ?NPyFe|>MV;@(J_Qa0pZ=clD<8Z~C^6>tzdQr)DcCs4Q~yLHE7Qr*JWijx(M zcAvbQWOfFS_%~Md?VUH!^D1VHP%vAQ;CYx_6 zUD~iSY~gdpK9%e&hMZmJQ$$xUbBr1gjnfLp&2N|#KbKA_?YD)bXtxVS3R`c@UA)OO z<~g1e5&?vb6Yo>3G#yu2Cf?d5XAQ7hZvoZ43XXDXqB(97le}W&y!8CV?i}ns61BFA z?6;*DNrI(%sPy8rwBHEXK?_SNtK;qy_p#_}+kO^)!e6yN#ibGWH{e#TBbG7cUg{Rc z-X;WOGPHnhA4>X9;dlHHx8jztklp-X_<^Ko4}tc}J2+&XMm<0Wa0!vr;QJo+txQ%A z4;!}?ZLO;!Rp~)q=fLK{B9U4PH%D#;M(i)rtY}&vh&)LvTKHE@xVV`m3m}FvLX*H; z4oe=uSL@HiU-%?9?2+IY<9`+DH~uKPRaB7b8jON60mxm8fXkfl`@XgBJ`eae@O$Bm zX=&hpg*rZz!WE4rhQ=`A7oh3W>t1Di;|kYVKe>I#<(@tZ;YZ`o!v6sHCs*xp@g;+4 zKL@otSf&Vk?L|`GDtX)lj0+E73HGl*Z}=nM?Tq0~uY(fl(ZOd;LL`ii0Xs=72PdfQ z*P8uixW2uGcJGWP01Ftvz^EbdMxg|PKRuKo45++kp1-AY$A~M!%AGW3%BEyj>e?S@^cAm%Ogsv?}LGuu~ZaRHw zsQU>=1hM&*$>3IoscANzX0^J35=C}bjAS^$BalWxqev$k?g5oR8Qor76$2<@($)F?+S^Q86#ODoMJ(S!<;A{wPoyXH3F&>lq-^p(AAjq z0PuwSESvX*3miuTW4WhyxN2tHPOoeyAmJZs`D3ee&(gb3fuFO-j(=zm77Y`_md_Q0 zT;6Is4kPvi_x}JI?Ee5~57`IDpB{Wg9nrQHdNeJGCTQ?m>F?LK{{UO`d*J85e+B#~ z@ZGM5;VnI3iq!(SDmOX)BFDKWCb{a@RQKHZ%TA~R^lMvK)nSP6ar1gs*Vq;|XrmzU&<-&}+u?FzAY+`0^QB$O z)c8qrPEJyHW-Qi72bbj#nCtIZ?-RiwCBQ0scNNgwTb^=+;C<2D)^**ZV8h}M%wq{`(0ZK{nY-dg%P+CH%c1tiDMPAavZ%=x?a9{s6w zZ;bvAi%ry=TI*V7*fl$5Vi*uOEC>e#gUJIpBN+q_qSaR7Gcw~lzV18Mz#p|2z(0t; zvIoVeemHz7iczG=IccMWF-f90-wT24a;NxxabHq?%wM#pg#I`9Mh$;P)DX&0M|Eao z+|W4cr?|(Vq}`sRQk0*&Ez#;zTY$w+U*a`Z;?S;r4>>(+ZZ(eVd6C9gZNaMdmY}N= z1~HC$){!*3Fw6yCAbvE)jkCY|yzK(CCbe{Jtr^BR!Rt|ZJHXnwC)8G{+*d0`6-EaP z-1ART%BA-F!zA(2q!CH9tcn93)e7T$qTqmdBe3aCiLR|=TZkma zI-R@`Q$~Ywlh>yduL|xceAm61nt@c#hDc5_qEUe;Yz;9>2^I4N<8qJnptBH8}FK^S1K(Zw_AwZw!;Kn#ACrkai#a zYTeO1Ol~5IRc*O^fKOk>y+8J}{g?0l9BXqvpJ(Ri+J zd4}Tu0K=Cpr%50~8+?(!Bk-?!oa0ssQ8}IB?9X1(wT=G(xl(hUgQ%{TN!2jK79isX zKDFd}7l`tANUpoFi3!2arFMEYu(AXSVx;IhSN=cVuNpt#3+qFsTNRPY&`-L>@WfsNLF)nG6D-z4fhA z8$3%Pjg@nZ5rdxMt4|6@trT~XL$|pZ{YI1%}*yQ82X5Cq|o1<0E-gE6; z73@SV!ovjh$0zZuo7;1^?id3Z_pZ3k=;o5MFfL_yZcmkv5l73@Y4!ToLEzuoXI$_! z<4?NOUT9R{w6FJn#QSVMpfa(+&3ayu@t;GzjH_S7K}@r6?d@NaQF!-Pw3<73 zE}QqWaAfM9-(O1Z{2%d$$69n76I7h-a8Szm+6Pd5YvOUaH?f;^WUl}|r4BlD0i5aju@V@51Kjr%P%DXL^?RGS)3%8F!&3O;;cYi_wyPUIAQfSc#<^{G_M`BH zl8x74k05Q60Gjy9eSgGSgZ-xF{fjxn9p@Z+3XHw$rqeqX=Q%$vD|&bfzkQPCmdDfD z=k0N(B&Hh)qyw(+Uuxn!NBdN3cdxq5GavAWY!W@M3?JhsvE zWB5<4bgT^&Pqb%atbA_qW~!1W+B~Lnkg9SB_Vlh^^Tj&F+DUPHJmx}3Azwe2rAKdL ziG0aM;>QD?7u;0QS+HVu1Ci4ot#n3}IHhDyGi<9Yw>N|r2RkwI4o}zKi0x+*6CfxG zfwjFyrCy51dgXWFNe#GjRxPX}jCmxVn0$qfK|j*8yJVFT)s7CrPB2OIt2Xw#U3P{o zyQx3t6=`jwWe#NI3;;Wtku9AL)(0eX#Q-D;@)QFHJd@hAtT#m6Mi(4+HC7nJATuy3 z4oE$5R_$YwOo*X#fw;({psGk$JtN^4jVI8r)+J}p`=A|Amtl|=jPsv$C#8KhUCWKb zsV={n#Z@|098Xj5{p{hNF7gl@*M+JD|jSE-G$|I%72Y^nhvrW z67MM8j#Qq10Z~?j=*rA#sUy;?^${Q}AGa!d)zPRJ;$h};R{-awa$07vjDaL9}+N>NBf|7?oZ=YTTg4N zk? z)1=%R$ZUTR0<rz{mu3tpTUAlB~+0a!KO3KOKBt@V|sf zv5rwS#@wPQ;GchL-kllLc7nN`NyZBDX3gErhM0y;LS2BaKqIYo{{RZU8d`YtE~j~M zh)Et&D8}!te66bdMe$dQb$_&6O|}&nR0o0YUswLe{{RrQYs*M_vPm@pa`ZxgM&7QIzrRn|u%j7{eTP zq`8r!lgo_o2Vvf=-Av&fRz0Ns@&{VVx-vL3%J}CP9qTmi?l)vZc{GF-cja@DS+e0@ z2){8ty(>x4l=7j8UJ3N74{hZ)o%0dzO|nYYM5;7#ozL9kf$dbTmMDM>$0Xn!R*dMm z-0E}K3W8YU84Q^tkPTE_z|9F8IhB!$spxp!RpoyyyNvw9?vB-=a|E%Wn;p0Ut9e_H zGpPqW@mfWJpKuBRjC!$d-~D>4AbwkS2dJypaVk4M-fjR~)juuBY>*TTjyjsv5X#30 zzHnS*;GaS3RU9h0worEDy5RRc>gCHT9qI`AaLMabk60qPp8tb1VH@3e)rwxo{VBUfcb$0VyZ51moy!iuce--`G@wm z{fuwE9GNx$01uzF>5ubS-Yj_A>KhyaIOC4ph&A$;h_su{7W_qii4#b1867zFuh$(9 z#5#7bV=spMNfdWhQw^^apb|aTJqZ5*>vA}+l|O86*m7Mq+Fu>`4$JMjYcXqujy$v@ zvkY_@;~l>${Rbf8bz0bbQ?!=Px#eRp7We7wd`BeK?5lIN+0o8M>;c;ZQeNCBl-p$y zR0378oS%A+#QJWl;N3!dO-|NDR6Mkc%MO29$FuPbrOc`U+L9ft9AuAwrG46|2OFk& zDx8_2A$0(`1Oj;5)}WdUf=h14CA$i7Z!OKLzV$=9e(dBP)I%wh`5>-IJDG+C-1nk2 zTwaB^U20dF&~FQGxVih=y(+A>h(36u`P+cX-7#7y`wmnVJne9MdQ>JB-trX$l;C58 zIqUVV%5|IE!gSI`RIj=cRT~H8by)^lJ)-*^%mZh8-T`nUFU{jO~G8|`;E6vO@su=k5 zZ7%0t7acr1v(_i-4uh{~o+GtOyIBi)qjYiu!4+-MnpcWE7LV@%{59~$!VlV;TJZ6T z*I&7iT8s!IbGI1k1$|BM$Kv;g{842Tw)&E*&NA_D+(-D=#^UnqMh;e*`JVMGMJn;; zi#s`PB}s_$xb-zz{HaR?VptrxCalLQT`N3A9Zy#SwN-0Jh^YaB?j$E>u1Lnlx49Lq z%Bh$4MSvJn?^P}W$l<{mR?C4_X5J(?1wbDtKdn(&rjB=IK+n(uJ67?F-5Iu4bn|48 z?gS?!des}dHD*wZ0M2vV`&O00nG~)t#B+nzp`T)q%%cHt2dS-5H`L6QG*YD>jN!9T zTtM4dWFUfmRUKR7NzF zRJ0)vPQ88WRqf><85Ci@>tdjIfF!U}j@YYe`jTfYtZWJ~CkG@CN{-^q(ZfQyB=l4K z>qVC(A#Z$!L<56`qu3^)qzZbKWXDF(k*c7)mmeN}+VHCJ> z#Eu8jv0=HoX_h!4FD#6AF>Ww=aauCVaJC4N0l7)q*z4?lYTQ}WoL-=sHL*Tyvm&du z6gLE)ty8-2)tu9ou#kDKc7+Fw`eW9r-|DxrTt=#y>PQ{Fm9^o`X7fzFO;bq#%@XcX z$OuA43Bm7D)rt2S(HX|YhN9Y3tC@sApvE?i^ss66_Q=et@Vc=s3G44ywYC1(xLc1r zMKD5G;~VNZpp?L7zL`N0;TIg0{<<-}Sv`co1+)17G!}pOlZrwQjN8#`nj{FJY z4+GsxX{~9j$^#jgzyJ_I@4i7mz4;yeYx;Td2g2_P{9)54wZGHSZ?uE^u)RSY>+{R@ z^Zx*XXRYPD_j*p0toxg6i4X*+f!X7-FH3%H_0kt+niR6{A?`% zPckdD^Cyf8c5#poTzzp-O2P$|S@%hR6arMK?_KZ4zkq%*_;0GX*5YWHB|D=?Fb6m# za60=}0~NKzYqCq^xRx`$*Jd_@{0HCLwR{D76>#+&Dl0SQB^gE8je>AzN7HWOhA9+_ zsO1}h9=}Y~={>7?ai!ccp?ry*d6BV=qx+y$Vvw}|0BB?pxlm(G*#ifsxu-)MDny<~ zmaQ&CZgN4ah%6YDK{ApR56lTUW1f{#2L3|K@#-+9|Ztmsf4y(|fqdf%= zZECQ#?Ym+6~>t=`SnNzs+2P?4yUA$ZRv!ADivbr4;3JWNiFUkNfH!}J^pDNKl>ba?mzm})lV^sTA`7H5}O7| z9-j1?m4)g@_M4?1RI7x7KG^G;mvFGxjYCH1c!FOmF9r$xk3xTySC--^p$OK(Id|qm z)MKzdp0#Bm@>Vp8;S6!*q;k3PjyM_WO&1F?s#{K~>x}Oa<90{#{{ZXMj>S?D*y2*< z-{o*PKjH-^mL)4Jlb|fjs=<4K$pWm;xXNLU_6Ae|gY3rKj1UDwc41w{EGkC3m7A$O z&(f8`$ges5*^)S!+h_$tb*9U03e3)y{{S+e1I%)9>sDk$Q6YunQ8Yiho2YZ>J^uie zM=Irf%Vz>2p$kg9qj$|F#bUc4l?-8n61XEhDbfa(12m9`ypUB~@w*?x?@ow(_(;PO zkj62|_xe<^D>RYH*2Yvu0OAYCg~>LZOm)I+6Ud@pKkE3W&4{OIAA$GhNO}w zH)N!xoB{Fy_q{3NS=EO1Rc!py2*Je{V1y=VAr{SY0yC0SLI%)!pL&Q}t-CarS7hV< zS?wc^&CN&)Zk=y)=X@L~6tL6)553+XcpLI^|;zCMH+q#`yT{_}5}+~D;3Qi$1z!V<-PRtNm_ zsZ1eATYFV3#|;rZ$5Wovz>($Av$g*K)h>BXdFQ=ofEpxRUs}%_$reP0UjCa$p!cZ2 z0}VVsGLlJFzz5eIsAM}98IVeZo;o+s)QcSR6|lRBBgy$$SLWI7d(#1tvqHh;m`(E* z39|ud>KaI0R$)A>GNv@aL-eOd1;o-7oS!tVRRZ$KoNznUc%_TWcXyCoXZHmT6+M`J zDFHOaE?JzQ4YUKiakzSVQ&ur*H>hl=+>0O?$@TRDmmw5K<{^zT@AV_rr7WI63w9@R znK>8$8ckewB5lzyLKGG`X4{!1b_&@9Jd+B zH0OqOns{b8Z!LEP94h zA75&-1*ETTMipK%SQ#_(f3r<6d5#q}sUQNm`BYJ6D-f}7E=bsICye8zBSrR!79%;_ z#42s|^{EotLc(azEH>MN$0Mot`qCKX;RU|(I+WvR^`h+yl#HzDxdN**5)U1If{~%# z#wEy8&f~_^78o(Pd`eLQdtnE+0UBU0de2bkgG<4;s9-9yhu45ay_WJ9gj!2 zva<6Ho6N>Wj4i}cJ7lk~w@R%Zp7Bg(j_K!E*I|g0h?lX)^{a0r_Ny)3-Qc?2&9a2U zXD0|-xW`YWI#2Y4lJ3=$&M~UZmF7QUE9RV!ZKP3&Y-4yOj^v4=km4B$Am_Lg`x$QM zNv+vZ6p)-pD)Wr;N5APs>{AI|;pIs-qWPg01|i!&Uuv68vsJmvxJN66^K!tR{ExaR zUgX4JI2dB;wkoEGw} z$%g#eh}I`%B%Fdr1d-Txp`~EEEJZnYNo*{nc^scLcl@lUuHoC(p|`w-HX<335I^6M zvboQ1N|N5?Vs?jmua^)ie~t2bgH3t7S-6KQ|Wu-$M=o zAxD_m7#wHbtVw%2KiV2_n}2qIAR$k32XFDKrymY6^kolicEiPlXy-UfRWf7?!RKqGyq5LWq)R0LzwunjPul#$G z2JHU;57Yc9?$OL-I&F(QR_qpF&OE>m1-<#GwuE@@MU;|xFPUfD00Xhb9H?B<8uG|( zTV?9aAx*5fBY(F&0O?3(K46TxmQ)zs(*w7#qya72tuHNSLIIVfINEm{h0QA>O9+b1 zoo+@R2vb>UEoZy|Kq54zJyn@WiXGM}W zXNfV)r1AL==TEvzi2TT>c%gZ4sPd*=&mSVUMFSt>+MKN}P4YMYUqKXe~AgId(~7;E!LWNG^ehlvgA%-GDe0$(?0$ z8kfr;!E?%=dSbfhS$O0Qjy8E>E$=s%_f9#-ekfTLVRbhVtPa1tl~W;?*!9g(QXNA> zAu=iAO~e2_JP9%$IDv7%v;!ydG=%e`c2F0Iwd z?Hg0&MD!!pt4iv~P`jx?ovL%V`ih^{{XC0>GYz(%vYU1e$z5YM4&4; zZVHZ+k;xJ&T--{C(6KQoQ-&DiAMvE~42zQ?eX=%o;~4bCBg+&mx30eR{43rY8v<%p!01ESd@^ezy<(!$7+?ry|O&v7_^MUrvQp+27+2!!m>10 z!zNVu{KnnMIq665BD_ouk^%J>Abzywbt<{YeBcn+0AthEno=bKd9FZG-z$Glr7W-} z?<^Hy!-qXidgId+$IxWEH%hT1x&Q(PJx_XQmR-NNK+S`gw&dcU5GF;Dt;rC+LC0@@ zT4-5eQs?-XmgA7W;Xr|&RERP}!0-8k9Fj59J*r^Em_FGPv5rCs1N*{~Br=WZ(5XFo zk6M!$jT$B{!#H5PA8vb6Y-p((8>f!eH$_K$ODu;VDXR%=i7B#qKhev6{#@i09l!e3 zAzLiQ@Xa3d{{WAO*n0a^Y?8tvMvHStDa=6Q0QdK$%sU9-&&J=J5b4u)X5J4L=M!7m6fcG7zXAFR{%>D3;+Fm19DQ@&)So z>Ug1Dfjm})XUrvS-S}pgC0%{-O?imP=yns9Z!wA3u1~EWvIwDPJuV3`8lm$A9m9rXnd0V9!u z?r=x&`c&)+n3@p2YZA8a{3VCCr&=xALo+mHHgy1p+AtfskxJvS1aVIBBr;uF!w_=O z{_iD0_Z>}G4wI8Pi5-)nkAN}99+a(SvL}%xzSRRRx#tA)(yGAB@yTryAQ6-07d?Fe z_Tr5gtzyI`+yIj(InT~2v*-1EY3QB zdkR?exh|y_cQCL>FyAi#{V8lQVTvfGYj>N10`J|;HSBi`+e0*v#mubd2kH;jrCWII zq}?G17bSpFNEqu=yteYfAeohxNdExUso{+)*fcUBj_2(vMYAL_90p^~Jxy4RWCQnX zh|DmL+NXJKCYfbbA0pvZPfoxe@v7-{3PQ7}LW?0qTzBpd^UYP;7KpcRWJ0T3TgfA@ z`o}}YJ${s3#P;&}bHTWj;KFb**X9)4O-@^Tq*$CN+z&r>{fE-4UEiCuXxs&Bi3pNd z_~+Zwr(2iIk}k_Ft-Yt(FI_yJET1o-&$$&OlF6`Lz#(*=AQnYT1CGPevE3D>nJ%x9 z)nZma2UgB8`BYAq9+cb&_J#d7R7*={w{jT-rH1CcWM3#;K^Os~AV<6IuOpUG321X^7iFXWJKUy|j;Z_wOrztxx4UW8ean_UxOzU=u zv3PHl2GU1g&Z@$@B9iLW(=dt8ng}4jL;e*izuEzRFsg{a3`fi{*!?|e>h^bS<}@rB zPC!@3KJ-e~VjYE_IVB^`Fnj(Kv>2%bA7=88n#2-VlZ?<|Py|YYYZ4?-Ffocpy9pDs zNJMNf$I#Qf==PM8C5XbD{H#6ctAQ|$t|Adccg6u%i#TP+si?QClZhf3Pyk{NUuqb6 zph#og8iAEkbDsSAQ-0ErzU{#nCkj)6>4DyzhjFh0MDa&Fqhm@-Z6siI=BwP195OmO zt^q2~{uLy%OjV49P%c@HIXi?qT|gF z31N*R20#gr@I^Fv+lw>>S-*z^r>#pZznc+39&mHG_xcXh_6^bO-vt`pO%R=iRe?id zHsDvP=$BJ!hQ!%gpjDG3Dx8dWHR4~heWmTzpEZ?~(u;REEJhT*PZjU~01q_8(5;yUm3-x>G8v=>TsB)0y~I_3dJ-0 zBc^MxKMt*Y58}7+hL38^4fG@lBL4uET;wZ{*FNUHcGCVB_>%KUx$!54H7O*H-XiLR zoz0%49@Xie2R~ZI5`v8V!R|>tO?$NG&52&iPRCsiPD@W?*nAy#s(7PV zjlR){A!TQqpxfUbroOfPpEa)t>eE@-=vT2ts9FuG_a`DyMgaO`SIYVqhh^}Ng#?H( z49}V4X2>PFkUM@A>yUU`!TKkIZ9Gxn?-Jd`tZ!UH9KS9PB=qgtwa#eA*{nQ1H@hwp z_Oia#*zW%TX-^nyw;I{-{{V@+D;AS9(3RhAfl}oM0PY9o{CTfA(KRhc!~PI`8o-N$ zX?Rv*N}q2)E6^_Nbiaw-5B}Wojs4u(g|cEPCAclmT!4BHZk55w;S1O#`)-$f40+6} zjEd~ZXw!xTQ;PS~)VC{3-e;D6*?tHfHT|Ep+fx=LOE;0%cHP@RJ-?NHB-#2*mc8FeNH_o~qY z8!~gq1o7Bc<=!kpOB+g0vFhPkcx1aXJQ(F@<`I-dA2}QvO@)v`%yzCy5_%s~>q`gB z%y+9W#uGh7So zibU_u2P2QtqS{k&--RO}9@Gz&jDTt0zTwCJ09vKAQbSNNGCMvQNb=Nl$G^Qv8nMqINe2TQ15K5KC`FCB z;Id<9Hen%H*>G46RQu8hUkMwX#~569rxY!LxUZL% z3garr(~4D6cF5QS9I#$L{Z$}EZpA zc{8+S4oJxE5BSvaID%B38Bv1(0-xd->Hh%Nq>>$oj+)TMe$sQaZ&@3GgX>QgQ6y$C z;xbz$*ptU_Ju1YL&Im~3FAhSry-_sPIV}$1G=T zlDi%h{{Rj<5NeYagzWLOu*oDKlw7z@GQIx*8j5(>+I^o-pF5;28nFAGoYXA$3RD0Y zMpOX5GYXQ%NDBF^NtcjL@49_4>sFA7V@VYZeqvlYugJ^OK7=0hNoNf6d9q3)D7lIz z&+i+!;+7kGcH4IeF{#S1cJH1~6(h$Q1zb6dWTQ9ptq>6i1dD`1ykKY7ztWWhuxO@o zVnLXQA9(lXtlK~)VyiNxJCes~%W#q6{{Sht zatO!E=zVGCD2yUG=iud8)O7Ty#n9dR%edU06$!y2q+6}?Zk3c3P!SPEGwWS2xeX5~ zB<>}hqcM;aBqM1U{vdxYDmDO4S~&Ku-cE8&Lm{}jkhQ9^DjYUr&QGYPD2-(DB+ARd zRp=Yuy5lQsWYxz>aD`VPc7k}vFG`on*b&6Umf$xSsIxIq7+exgT!HefM)PmkIx`Tj z`@&Bode*8}L|anpU4a(T>yG3Ob4`}#%$y^nkfd0VAAick@rtMCTSp_sg1b~mlC+#K z&rDGi%Xbf(1cA^t17m=CRbIec`%6t5ym4+U3V^2>$ET$#-fi-vvTQQ87`_R}?NyDt zI{8i=OPmd-821$UAU;Pis1cG?k8gTSja+}4(vn<(mMq^c0Y0?BI!^JXLCci@{{R{P z019jt^F=b??*wGA>GY>PwDE;mBUHne!CvRCJu4Ym8Y{7hD-{N5N`=ow!2>lv{CvdH z6_LpY%OK!q)|(})!Ae?(tms@QoFBH<5q>N|gI6pz?C~J9RK3hUl(Ug7f_Jv_7 zXi(83TO!I`qVmo#!#sW+D#(T_h=t{ZFO26T=aK99(nDpsUo*|}?aL~-Cnf&?9>e+8 zl3EDiebONLh#OA~J#k!Bs#)lCQ-MS53%Ql!-5KX{oB-YUsqbwPFCrzDF&+t3EAwX@ zny~OZN|JebEaWP8BOQK}>y19%NW(zn%)fO8eqUVIB&ORoQAnc-xtPpVa8xHg-nAla zF$MvNjGrt6-=!>;@WUbk`8)Xtah@se&>|UHb}iXR;-R~hu*Fc!%V`b^9F#od)o`Ur zSG$E+WtC(Z*nh^RmC{JJPMffC8zXJU*VdxCmIxsqYk_kq*b4su0sjE&)PQ+Jv^PFt zkVXos<0sVmQ zc>JnZnPnujjzUyzP@g2d)}fi?k7;nAGZrjYIjZqB(T$>>K-hes#t%M}`^gRUgW9PJ zhB$ILLEkiqxQQ%|OG1ZeIR#fBW}K#F0PYN@A=hsoT2<4U-5N$JJjg!svH3v$rl#{P z;8u!AfrepG3{2aE^Sdn zkrdpje|G->cn|i6zhhNzCKoo*Pj5PTQi2MR$Ro8qWE`>{`2! z+D(b0R*G20<}Jeh6!EACnWcn8NQ^7)Kz9ECv^@<|jYRRat8HEX05@Emds8l2C@&4X zKp{j?wVNjx>S=N&7iGj~-Pxf41s^PjoKi_Sjm^Q_Ko}c;Q&oK6#ZpOHFG7FMO04>| zv<)T8N>-ddQt4qIS;tIg54J2zblfdo=3mAq=CNFcSikr5(ULE<}wfxSl^>> zQIIp(`cqc^ds~w6pOx1H5C%to!nI1shaza=j475W{{Vw3u1{S506H4*q;cE}c8sUY zat1#U-m0a{%^O_8fzL$`z&}AvMKVm$TO+)<4Jww&{{ZU_DuKwb*S4)Rf-pST)65%A zHjhv#={zkVSmN69Cg);!9)hA}TZWe4<+7s;qm?82dr>?xNgtE|Z1gAAfnAUDM$b3P z3|VovcPAasr44qYcPMZ`RR{Dn6vW29d{lxCh5N@HsAyLo ze{*pK%(Fxa5fbgd&QE*_WNj_Pe`^FnWIKN&Y@aHEw5#!$@aBIx{Nv9+d^cMoPQB zb{)%u)PIFAA==EQS3)tLEEB;$Po+D{WCfI}`Ky3)*V=$G>E)(I?Bw%9qy}Qh7>s4I zIbXtk(KqQ$eV*12?QwG5cc=06Tuu%nPinf2jx{5=iZ>$ z3OUBr3y@g#J?VqEBv8DH^Uf1t&z4E#eiahs6#VJ)Im&vET6Fg@xHlIz&cRd#+Q1$= zR9n2!=Lq@7IrO0l=&+K;8_bvu>&!(D2idAOxRP1&gbs4#4gsj7#@+0spY~e@qX{!+ zCLmyCGQ9n1q$`%~WD-gcs;cefv)AA2O)goCC{*C&fI0l?7?MJwRb|NN2XjiW+Q6$6 zttfB#>|Y*ihm*%;9X(Dcunz^wn4)uo!S%%~tiEG1;G&?wCzJjZ*Ofx$l!2UXQ_g?F zoLL4$m{!gLnY_dfK& z43bKX9Dv8pSPpaQDO`4BO&0__StR!8zTaAmMq^f)*oJ1<05}U)n#s^Ez(HsEf%Nqh z#kSb%_LIbJC5&{*r*N>s5)h>c;jqA-R-C>}YReL^+S|AF=hB=2S7!t7wn-zsPJwnZ zOg=*&-W+4!-lc+9A%fl1FiU4b{{S(`%}MqZU}Q;Dj+;h!`qjAaH(Tt2(If$Xc_}=o z=}`-WxCiXf2|@WEZy2KGSq`_3;Uf_<1;Hn2PraX7NbTk-(oe8Rr{!G!R7-XqPcC$k zwkoJ$zyq~Bhu&Zc2rHAH=~C`AOKuWae$5OenVg9oPbu$KV2AClhwSP~5`j^%kUO`% zBsN1ESy+|;F^u5-KDA~WA0|!LFcf&xC<*1W(>0rtMyWETn~Ryumjt9?h-Dwe+Mgwp zeTc;pG$J?M5`)3^KU%j04>}X&Y*MEK7$oPYt9II4u*TOD$1j((Zj&5i@u+nQj2knO z%~s&~S>G{G%uY@_egdakDU`HO;zkXLA{>^-aC=qQ?FLjdUww#mQO@5{SFLXJZ4XXq z;y{iEGQZ44X6E`9pt_kWq~D~bcYrKvGVJ3U4Km|RX=4z)Vo3LHV-djv>sl9@=97Id znFQ}HMh3>=zP{C2_4wnlHt<6j^BDPH5tjA*DPCdj73}o+Bmu49Z!80~pYES*_cbgQ zP%sY7!oSQ_jaHY$G1{-$mR-S4Jg_+CkX*_3W|cumqe9Xa98=|!+*gV&&d(W^V{^F) z!VGYtm313STzS@I#HR@0a2S0mzx+%mpUeAR7!XoDxFGt9 zuV$<+c5Y9p+L>~2#2uwn;m7{~UW2Jg9jvPhEO95yBV-J7-=3t^Xsj%mLaEzwr{{Oi zJXEQ)H0D9u2X@pN8P!vjme6h~K>OJY-u@>%Bk4PylXKllFN|oZQoh_s! zG&#u1?)#)utu-5KW^pS<5f1^_W~8{hX}E2>4^91H?jMT z>OCslwu+J?PaaO(f}~*knxkk0yV+2gLHU#);q}E#;l9jVGJqRv0LPK)Dp_jQEl+t5 zoFlPajkIit{M)$aC)SHwhj%kcDx#D3+@^Cy_AP$TJHO+tB*fNBkrbN=(+LYPi~W z5PEhsLifZ^EXiz=nIp#>bGyGjl$ALY=M$@%T^4BBEw2&Se8wPfSL?-5lKvPM5;oES zr|lA?qrpm&9+e|?h7t(bI?@s*hv#OcuxEQxR1N)ed@Vln7O3H zpI6kcWBHht4kaWAv@2?VSF+7tM=MuysFYf zp`4A37qR!Jc%VtLgmza3ATGLcRO1_mr~d$6t!b9uXN1USS1d^X0C$=%t{M`tNg@_z zI}{Gs=RVZyoJSl<6hx>2m63k=J$`^v=4}*`OqeW6zchhBC!T|vWz4qg3pt--FW%g6 z0HPFzVj6aCPSLREny-0lb37Q524%@sC3xbb1UGRtq?bk}Mh6{pmGu={7mNgopCN7= zJRhf}XsNVBf&qkD#YTs7oZqMv)jO;BDx7R(F<`uM^&a$2pF5 zI8mO&cdG)<;Un`3WSp|&jMK1Pvf@o3ix2=yWlM+@K?drDCpvOW7l2MYvBlIgdQ6uhyoH)9rJaN!p-{ zMh^t{%~TqVrY5wK+{)wv!XB!9k8ISpT99-zG)5(i0U862gSqdXw4|8PYW5OK&WON; z#=hVx>&W~ng!3)R`AmXEXE;IE6%sT{8(XXl zQc<-zz+bI31WTLfKHpL-iwqOEFrVIndVVw+=6%vT;g$CVP5=Yb>rakr1hS49)ky^G zkZ?%v^#Y;O?%-)w3#fNR=5pZRE6COj8{6O@iw$r40caBM;Mo>@Bz}ucE6`6o; zZtafg*9eDlCv)t5YV5XmGcb0Ig906)L6V~#KDBb{4K_Fmv1M>_ByLkap4?Fwh$8?B zxB!lOdKy7swbG+WyyTD}Ve6)+hdx=~-+#n$Q?uQs2fcn&prTJn54Zwga(Loi3YX zVBilal=U6zLms0eDT)9iIr+ICH>c976sk{TJ1Y|2!j|zY=`KXPF~Q)D)mKi2I~l%4 zGX^BC^MR9Bv|R@J{g~=V<7sWgKN1h&+wJ{pR@cChO(r6iOhbtzX2ArW)#_ogOm-%k zlw-JAm<_5)YJ}MFo+K>U!+KL%=UUZ^BPtIp=V%x?$8+iJU6dXNu#|}mQ4cTXKQ1y4 ze|oe1o1|$oGX>tvyveuk8ub?q%7l6A%TFNWXTfY@*&=57=03UXD}FDB zb`Z{Gljqz(-6jYJ-nwPC7O|;UQ|2+mEW>h+{Ca!V?}NM%;$Ir-14{5uhP6Ff=1>5$ z)Aac!XV3RSsoZ{)P{85oyDClj$=MR+818dc-W1as^z_VX(gx;~yxi{y*>xrHQ2-Q$IJP zhDC?>R?eew4>Nc7`c$?a9@VuOqkTLJqbLFtia<=gvY>XzBR-=Q`%Un#{s^u67JM{h zyw;ag2TXIEgM(i}d^`P~eg=FZjiLB)@QcIRJ30lDTP-dm zXI|l(Zb>-Jc=){g2RT~Om(I)XMl#02+9UAK;b-g-`&Rs0FiYT{f*vANnC1(OOG|rL zFf*3(W(udL@~@`;82xX< zuKQSoR`RrKjCpaKDIS>VQ9M!SEy>5qr?q+0;v82eB`B!G=bkd7T4;P<@W=iLqx&Uz z5;!jWWvS}EES@p@#Jio6+#de`x*L1;JAn7;UqF03{h0p%XWxUcq(2V+4`_A+cix9j zK+l1}X2x6Ue+*Zow0lS0z#Rbfs`n_aGE1()KzI=T^k(Ps@(g z6xK__M~s7z53OlM9B{B0>UdL6@&v%P!Siqc>6)Oq&qmi8ebZh;DakmL0ouJg;a9|1 zE!s^lSB)-gXN1LfZ6MqXXNCn&Y<@MxOJtEr$OMk!lT3i=6E(yPL6H9d7xJi*Z`7zw z!QCGnf5BEi;Fuam!|iRpJ$x#%5_msTV)qFIdrp}lJGS*7yUSyNg%}@nf-u`5!@n#zx$;K01R%(tvNX+4*Q-$X6qbcdq{c;1|HZ5&qB`{kMiJEPl(R+BkdN zNG=ZF?k^uRA6~+_{{RGdb5r>9wlL4E`W$ z-wr%LS*Jf`ng0NJ7&zMA-&(nQW~vN~qnhN?BxC^XAbWdL z1Vn-W9eMYww-)On@`FC2pm@d!9YDo-%^fI*%OObGc|CJb%WMm6#tG_b*44)1--Ql` zuFx<#5lLvqWzTGfJC_?r%0IknoR(mz+&*L1o`Sa75Q40qH}H~b319%^ekUDkMRZFz zUmg58@bAPw4PE#*#a3c{KK3S#QIZO0qXIcn4Wu@yDm5Rw>NXWr* zK5VZBt;JGS=D5_QC8{!|v{gAMM;RcV)fAQuk>(-E9la}Atwd>q&f|hlB#MqpQW%!+ z+Nv@^xs+^x!5BFol`*ZH4a%VN&<>TT&}69FjGszqwNsU0k5lVbm|V{CKqa;w2TF59 z9xxXLfUAZbr#a3K8K`7YAI*#$^Y2dALo=t0pvgmw@>xmti+q9)Pg<7Y1{u_I z>7KP&(HRMp?R;=4i(}C|J1&9oH^Y*AHu1%?O<{OHcI-iDBa- zSNJpHTb&zJwUvehntr4c0^tbH;l+KG@DIbV>;5;igH*ka+SW7XN?t$1k;N98x;?K&)=}9~eDw9MpGwt1U55?NW6An@SCeR-Ap@gs z!*S0HYqip~g_Hxk90GI2XRYpsWYwA8Lw&gql+1ECB-D)M)qJGEE!+5O2Ts(tuvJpS z8OC~g*0dJ|m61W@g`SaqX>b&o56Bomhq&Ea+z30c5 zYi(rFuU6`PE9b8s+%@g&j_O8S;gnzu8s4n!O8rde)A!DD!%kbBLN+Q64pjF40QJ{z zp=fOIFbKg^;k}8hp9N^5X`z;Q*;{^M zL_-{E_WRZ|k)OT!`c>$3Tr#UR(9M#g)7rJ|wEVWn*C~&^R;~2JBXCTg?~~HFlu^;K zlMa=JDha^l52am)Pu%JW00Z*^D^4vqZP~LRau=rKRufMc2{c4~daY7c74BpunuR7z zob+sVsYaM3U9v_3FvD#)Bz;9~$6&89bzzRem-{tJ{PB=8kaNWXPUbk%_poiJAYcsk z^{LZO0Pfp@c*Saq4B*HIPBBkgECNdB(0f(JEt1)kEJCgrbU9`RijY|%=X&#=Iq6zr z$3H5@a!&)+oGjULm>a?5pwc@&5qCiR}ClqbHMe7T{bf?F*5f zN$PmV;q;}GVipRtsZHqh7A8E==UTLUZ=&ncf#u%D@w|K%QH4L^O?NsrxAP*n3QFWT z1M;s{@Spq>hsAT-#{Mz!O{Kf;Eb&0(fOE$_xc09908IUWbenjVDEv`xaM7s-X9N$_ zXY{X27noqGO4l=|3E1&{2KgjakjalQ@TBLO>C#^^-C>j*54uMfHR&3k>|f)J4MpaX zA-=a9?t=v5xA<2vb@1C%u(~0cRTy2Th3_VUe*Pj}+<+HhRPq7Ds^b~1}2$-CL zNgNvVO)pP{6kua+F_Xxu9u@H1*0C!(vuz-j9YuCFx@>#Oh&Wsw$G_5{r#TI1Lu;m& zLd^I8b*r)2_c8I)rCNheU8?6J2abAGsBFN-_rT9Djs6iQ*-=>RfVNi$ zu4~c5VC7rhmWbo8id6KDtgGYCj2g#?WRp(t)vH4h7+FX0epSZ7;aj`R&#FrE%-pj- zL0#RShHNbk$rAxz18LyVK9>jtDC3|w>t5w5FrynmSn_IAsa98$IU7v_Pl28|m}hUy zeJiB!Pl<1Q5v^L^Sj*)kZO8{4ccgtL+i5`-PDx^W(`B|tgj>lN!90>Wii|}V;wZRH zT{5Xuohph;q4%HcYps&euJifLA5aA`KL+Y^Aqh6Ad zHm)3QAtVO}=04Ry<9Ro$$H3$R-nFi*tw16sJ3oc9oYr;3Zl#Qw0eD|w_Hpy7ZN#krR}C^FlK8RX-oRFd1v zZSnF!$vug!mw-sD$VfT)b5&%rXwV8-7f|~q4@aKxJG@lYdJ-l#AHZ*q3!vJ*odJ&#;$nRfVYc^5p3-)=?d2RQUjO2fX zc!$ML*iYcM#LZzZwJieOVp2#(w+s~fcOCux>$VZ0Iv(@1jHK!*t88_j3ce$0Ulued zyiMWzt@gJu2^HCKfJaPrt;wSxvmBfrFe*QWe+s-W@Sj4DK=946iUa{doMQlX9jjXI z*_ql-G3$=CoM)|yY1rrP7U#?jApth!RYxc5Ro*7suqo@f*39-?;I1-w%~PJt#7GEO z9;`c7_v}fTEGj_SxIOu(*LtbSj;Ezxy0qToYLFMu^{Vp2w3TRxz~;11K{7NXu1`;| zN|46VsVjlUYDJF<5XN$I$USN}(o~ysH_CV;(u7H17DiT$a7XcUtJ-no|+klxz{mH1vL>)gCANWPZWgPmQ!WJa6#6&5EHWTLl4| z80a|sxg9y}Uz`3s@HdD)9&6VYx}}tmG*Yq@l|E(w<2dclt$xvXd&KuTV+5X3K|4wj zki*;_2(Kvps()e+1pd&PJ=cjm5vQfTyX7`*hY4|!jBOuy_Q~hczPlviSBL$^Dcy8u z6?`W%=cm6^epJ}&F8Pb@5(eVOHEJzFIaI4LRVNHj8@`o)<6pqP82ldAjg8HVg+?*T zjHJmK8T`i`f5_wX?Q~qcYO+Saf%i^9{{ZXP=oIS4X-Y3faB{{=L$g(iNLR@$a!6+# zxaesaV|HR(rql-+>T4p?R4oezX#(!c0D9uA+28q+JZ3-xkCk7j_Z8U+i07RqXd7Gr z0-e~;JwF=PNkw*6~N4L6Tq#H34B5Er^DSqUg-LR7?nW^ z-2wKhPizsHM8vOEQ`CMn1n^-><8uYb$>TMpN;Ip(mTKsTR;fl;gR%7|!Y|t&MASaZ zqj--~@^54SIFR93`*t<&nlF!RJV_jJSl&hZ(gKxXfPH<1erVlW%8j-mh{|xC$?hvx z!rveKfAF%@+}mohPPXy^9lY*XgdMU@dRKvp;n!y>4*o~0M>eM>qfuMT{V~)uyG$4@ zuQ$vW=Op~3b|DGe^h^ zml)($bekn`q!#Dp#dMlBz2FO*TX)qwQEtn;Zz$she!c5QQ1K_gO(Iuo?;BdGa$o_} z5`FSU2fyiDGt8(_m8{>PqM=q=oOG5s1tQBi9Hm0KUDF@jM8%h?lachR9wq&!zhlo1 z7l!NNu9xS;%w&!|K^f6kslt+af)09DpZJIV3S;{xcx}q)da_@#Mi>>gayjYC0iS

&z4 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

6_^+k^0Ac?C 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

q#UF zEy^^D<;qAxLv2z$!00>BQ4IH2Xcjmva=88LD8irqy+Y3UNMyK;U1Bl>V}v6;2dS%) zLn9euQWY{6esj6|FVfj0aXbN%s`8T98&rN;E{~LauQi9Fje0Y8?ic+EKODHmd@oA2S}r zpGug?9LypS0;G>Ml<`R%63Xr6Le97ca5({eX&vdT)0xBv`O9;A0DS`h4#s4P`n z9#s0&DuG%s1fF8CA;JFuS?E2f*DjXms3a1ze5opz^{ZOkXnf+0>TqMMy3SAZ1lhqdNln{{UKNm$hP6Qp^cE zm!Qul z5>^hHgz7J)C;ISp8FO#VLbfd$@`<$nRZ}` zC6;lq6b9Z8-uE8WaUzVe7~;ux+El*-j)s)Q4aE4JwupfF3h>>j50s=5R+QU`2KG?k zWB5q_01A>dp5i6B0H_3w(7LwozD@yA+XA00ta0xRZqAY>(n#U4 z>G@I2fkdTiIg}9#ffjZU25>u^_cbw!GBE+&D9GUOgSJPlOZGKDu$b~?<~_U|j^BkV zKKTqL9iV`+78s>;QC{Ut7+)(4>-RyJ3fENO*mqJ_An&RRZ zwvZWsJC#Y`pHb^j$2-X;@^OxQzw1iMh?!l)4vJ4oh1|r-OhBl~FYoU{LfD%5l-sLC zCgK|;=cg6xf3sBjm6ePC0A!M;MahxJ&AZb*tH=vHi;@P@{6KUy>R+=qypiAB_h z%CZl$tZT{RmiDi!;JL=0eNOJzJp9Yv!ZY7u_<^n3*;~8YtTVvFazfeOJA?e|+CB(= z(B{Kag}g@w>q*yP+yHc3V;wP!*NFHA)>-w}v%Iv~#{6@@9jo^Ia)y#h$BTn+d)=Q(X}<_`8*Ose;xC47V4f)=EhtCM+<MC-8gXhm8CQa(pGIX*sxe*|J8)+#Z2_ z>*zlMTWVHzvUtMfO|nJroE{tWny;opHbx=yX& z%`I+j<8_x*hIn$fAmef$Pj7HNE9hU0-X#5%KWIOMw!acIxODFe_@>^~npCza9Fh<@ zjzm%mbl{$u_up`#8W%JbSgl$zE1~~-(07~wDIKw`j@he`@)(F6` z)nhE)G4#aj?RlXxn!CPBQ8{SMp9iilK^~KFzPWp3JV95Sz>?3pU8l z`qFxzVeeKJHj)N_iL&`t$^IVMH55=1PRW$y;1kY0#a@9gAct+EiCxJBBwT#204y4$;)(JxT9Y3_ml;6v5Im2LS#w(hIWDytuxSD|G53 z3P>L=M}KOCZkWVw9fFD2 zjR8M5Qoi*#jGK735rMd%QH8DEpT7H93Wue7J4QWk<|N&nKy+ z%&avQQxNVfg*Z$SdSLogR}s2LmK#?jh9i^otrxa=oG^$uAL{@(;CHH$*~@asNO<7M z+q~y-_4-y$Xtf4r-76M8Q3b+=5fjT(8E>JC-N_QfH(Xa zCX6De*%(X}{A%sBy9gC0bom&!PrN^^VN$B-TxqsurkNF`*;`ngDyr@>KILXTah{YL zNv!}k42LXu$K_hrFezG{{WBE+*N69cWrqgFM+tWI)8wyy`-Bd!6J>l zln_Z2VHHVjfPKzel zrh?xCI3VLPdy2vr^E49(aNB0i$r~G(bOiPk@3pnevNS0w7Xa*3}h zk!^rc9@dQU&#&{S?sdC1+YyaHBODxMvDezMB@@h~9D$50hB>P5WvR$~*rH}~n-q2@ z``*<)&MoR!J6jj-HTb;6D5M{{!*||3p4FV%w6`(&>16RJa)3$KBCJWJ3weOJws#;5 zfY>f-A#BpJ!z_!HEW-mB6=_8>F4<1vMYw_5;(xfLg(H(y{?#-~yjho({{Yny!h!Uy z18+P^FJhe=Xd)yj-`6xr9g{`{qcodW4s*b4bB;LYwNjBfkjE%Oq?QbNZ6l5<)Hd=R zt8NrF?o5L`e~mIYH&$k z0S|LcfZN;<(Kg?otfP#2k6MO7Jee?qy8tO}hu`T}?X;`5NTouKr-#o^{i z)_1v*CR78HoMxLYtW`^oHJ4y2;C_aw!Ln46HsIClG`mE#OJ@-?x0fM1i!nX(*Vi>cmTq@&X4!k;+;QfBIdobr_&Bnf$ zFnyA1V7pr)T=X5WR8F&hb8e{_Sj2NMkUHe!wtXrjwz!&9S#4W>Fp;kq9afoy-Tn zr?prD+7vRp4spE<9Byq;9 zP-Ki`oc9$qww$-N%oa~AQbGYIkH(o5xP>B#=U`Qi(m4F-+?z59pUFfLDv-qOU@%Xy zqKJ{MZS>!TIWMC6wuR=$+tv=vSHtbDrj(B<*x%T&gQ_ss=EAwNybIF(gjlg5_6f`^J_S zCrghiQpAS&qay`H09d)aM7AU3b=(f*TpiqT?@&z9E3(Tfx19d~FzzXl+FD3j86**~ zkUU3m!!~)TF0AE&y!)m=&B6eGod6{F5xN-Rn{Z=|$X$|C2p`I&WH;j2_ujA=WAzc=gZRH!K-ble;D~8XZsLC+j%NuOSI0K>gsAs%_ z;_5Yn_c%o^U4h;0#XQ2&g31mv$Rv( z$)A&8#^1)2!6YgtnZD*rI2hy9RN2y!CXBP03gDdly?WymXd0Ddy^V1Rx=`nUNa^*a zwc7wAX%%odV4N23k?TbA?Jivd$+reYTy0;cb5Wt#;zgBIDrIASPVZdR^5{*=aS7#w zhPP(hmfnZ;rb`@wW?v27HdkocPOPQoD zCg*n_?0aIRmP>HRq-BN!H*DjrFfYZaSw(JE*4)U$AeTM;Kl=4bd(gp`%ai9DPUFa^ zW{-5h0rH-zc+bDRCzW#}fEy|~Vn-v>G?GDfPP41a3z*bMg9Wq0kAI~+JdZSQG@(9n z8;-t}J&u=dZQZUW9fytEPYJ=bFKx|Ty!s1M#<{l1m zI{VQcjNw`-RLHw>Sw=E_GgefI93yUI54e%l&!&ASxFi_md!4Mr?E{PtdZdFvt)<&Q zqRnO4{#N-Hc1n8_Q5V4lBLo4#^ggvD*FJcT+If{A&Kf|!GkfR0Dk-ANHV^KXq=9&0 zPQh`wmDkEH7bGzoKKlOvg(g02;ANTcsy~O`qY<2-e>0Qww&Dv8!`M+Yl|&v8$c%PCPd)?f8&Q44gC1OWD37{_77nvJJ<+^?5!xDb#_en?-fZ9$;eLo{)S!k&P?Cvo*PYRWXW-W-wU3`v2`E7qmM zl^XrztS)EJ<-WsnG@$~Yl$@TGZrj826ky6!sr$9K_PGW{$&WY$@=2<2!Khs8uxJ)q zea+qF?1DQTJ57bBxww&z6%sWCn3KR5>S`+GQNzm6k2CJ{NF1!SV=!_FktS zDEz8u^xFe&WVne!5J1LMud(L7yZxSj;D?{LU&k#n+gtH!CjFmxi>MwB^sH=kpFd`u!^!n2aqL ze)ghGbc}ELoU+Bzi?Tm0T5EJzmP@$d9g9iEJ9AQLwpUv1!fCn#&#O+-;wx-R7*D{V>OX08l8{PX<_@)bU@sH!Lf_y6k zm|-51X+EQLpp5M~XwZE|;a{znlipmQTa89S5AcRKA3@ryZCsT(ZM=d_V=U_xwK%Ay z*&Oo6P3(_`ei{D&!2o|_&kRWo{{Y2*iC#7FjPb6?>{j)3`zgjb1~>qGaz`(d_*c?D z3O`}L*q7im0KMl-3;r3eQ)wAgsvyW50oIY&5TwR; z0m~ECxvFFFb-pRTyyu=GtooJO^HOL^#c>_7jy6FO$Bx|;0aRzSUGF>HJCZrcIAiZu zrVb=fW9z}FKJDOjFmpMZby++iC8cVly75A zk~Q3|=5pK&Ri?yd-P^)cp-{krA9(xKf5Doi?}snaOKC6z026uneLosuiKGn&*>LK_ zqwdHep=7s$M47S(KE3Mfo`X)#=*s^9f~0=InpgZ3yY^t0#$ONZVo!_T4{X}w!&i92 zYIeXAEtI|89DUrMmBNrm%p34t=S!N#?d|m)E_*5M?xceD*5nkD-c(|&rB5K_fBL#t z^l$LP$M>EU@dOue%kxF^AkGduk9znU{tNa000j21@Xo(y{{RIH_z|G8cw@v(dlUKc#q!G#AYP`tvYl!zbpRDgZ+UpD^$!7Tp(X8l9rpNSv#mH3Ha z8|fNrmGG^cv63z)1c#r~VuEqUCmk`*=yXwtkV2}zDB~Ty>(9o;;p)0K+jHeJ%-T4g z-BI{@`I11MKnos7?pxNLZA&A=BJJEhZ>1^??5czCJxxmsZvho~&n(sC&Q9meMHS|Q za4b9Y_o{bRtUsczQ(yi_i%Onq%8L&xVDNlGAgkLmIk2MByd;d z8SE=!TUFbD*$3Cwt9_0*n~~SOcuidGDxzeOv@fkZMUn#!r>CV@Xu{*=80pEOR#0{_ z;E&;9OOyzH%2`XZ0HFND_x7r{5QkTYAq&(otJ`FagrEYd-92gT8qN%;bH^!;5BO24 zC783=$2ZDGRIg!K8kUP|duuI~^}n5KGL)JbKIsR74tTDq?U<{4y$2`KtIces#3C@t z!{#i!9M+MLk@%ncV*bs)6u;n=Kee@&?Irs@PO0I2PgFM=D?))_3heJTmont+MjL{# z;2orNa!2n1~j-wrFvVx(`;IEtv z*45$j7{zXK&G(dds?q4#EYioo=xa#GhKg3?y09t9A3rrQw~$5KaO8SbhSTG4RY5{J zp2nV*@&5p;jzU276??H1-X&D?^N;p>)mcHvk%3a<<>Refn=2*|?ZM+Bt4C$HURdec;_miyi3(vn2BhE zvX&%u!1T`_hqZ8GaX!MToOee}81qKV{%Niv*L*wT3%?HQ+GMtRjitle>K2lc9^K<& zr3gHOk>0noU1UlFMQ~Nr;DC8i+co+F{{RK{{evz1E3Mo9-5&__Pa{m!Mu}m_!axM63C?-KcfzFUJc<7 z6oV3(WniR*WzH~b(>yP(qYvHP0g^VMJc{C>D5t44V&2E6*j}q3+Su+h)~(3QQ*)+w zb6nPyc&>qElO*&Y_N~i#!$r<;Iup(~h5o076T7vm+_mN)Gu{<8 z$VNf@>rUFy$=NDo zD&+02pQ%yJ-1T7v5(qT++rI#)7z4l7u3G6$aQQ%ZUtT_ydK*=i+{PE?C*)z+Rj6zb zupx33e81MR)X>j@#1>-M1PtLv6=vGRNP^*2fM9ZQ{VPf<638|u0P;ssQl+A^;iMo1 z`IHKF3z@@9RBjU?m#F@=W*t1LhS*g7bAT%Fwepd6MnbW|lg&>ZlqOYG49o^W?7q~k zah0O8L&nVU*E|oxpY~Q9BLjoUBdDzbY@suc^XX4pWMw>L9tfw%E2B8t$P|JCp2dc0 zL2AYKW9BP?#c0Q5fy7EZ`8lZtp}}POVTC_uadQ+B-)|6>LVi*@dY?-4e}KL^Zw+{sI~Kb6CSipf{NK~1aN}qzs*7}QPNkKP%Kre` zci_gq@E79-sqp^*QMM*a8<{rofbs8dE>EK-53%FvkKuh)BZ%#0Z{h$hNpC@4qo43t z&)JSYh`t)rK0J6?k}H+{#;S3{?NZUPAaHZRKkakJHTkWiS?Zc?>PM^FEv(F0qRZoM z+~kk%V;#8bU!>*Os#%U#32DrgpQ+=`Iu)E=-49vtZl!lCA{Aw0ljZf1jI5bs_);H!z_G0Qxx>ztWTV~ehBLyEZAP%{&6B$L)PUi8SG_H?A zvv=Bz%gO#D*!v3f9|`F)$8N6ZH*NeYknp90T-+wuhS0+Wxg*xSQ$f=FyI&|M!tzNR zn(*g#?2fGwYfH0LBg_PhVDVa(mTI^u85rrhooi-PsuU}Znd@41cAKyVex<5o9^q?{ z!)X!$Czf z!0&_l=C|jF0hYoJ<-7eVywH~USq?gGHSWd7WVAeaIVX0^Y2ezvTtnp_rBsp^h?a-~ zeR0~g?%)boW4B!OsxwCz&m*3k^{SPc@&tQN?91_N!0Dyk%0$uPJhNmK>`%RYF>8No zcW7mbWqhwJr;OLME4*uwAN~h&}ktX)$TyS&=|f_kF6o z(IHKyLNmusweyFfR+1%%1zx!4H4LlfH<+Xje(3e9LI+kpVJDB5G>r&3C%EQ-D7CZ4 zwnkmCib5xw~8H3IGOBkL?a>p0J?oa^vF0T1RBzuRG%p_a!W$@ z!e5JC9QeoJEjz~E8Pp)Sw$v0lyi#xS*BlJ`pH9RP&N6yewor{BQdpi4cdyMK*|+0| zjXz=Ej5j|AJ|kJ($Kku1?Tr)iwsJB509u**(6_G}PbY$Q{)=e-BeT|Y_%#a|)uEa% zGC4zKNB;m{+nRExI7-a~W~Upi%XdaKSM!{z#<_OS-4*#w{{RJt{j9Z*j2{r;{hNLm z&ezt~Kf1WIvUbhIN-M&arfr2q2OP>O11J znIbml4z7?xIJov z#EtWaa=7S4YaO)_no5I#*Bnyr5wDpfXKw6dj`d;D11KaZY~WKOjex+Ak({=A3ZV=N zW6P|7kl7ph0ZZhdJAeh7u6k6$B{^qOf7%`CR@{Z>7#_6jEr_kh*KOXhKN~J=n7-D$GdLWi-c@D+FZjGLXqEY5Wr)F~BwQua; z{t}K~h&~QJcZVl(?qO5@fW-aBAKb~#?tpc`9DLm^)z+7I(9AZjI4pPuzWVSNk2Kqu z4}*M7WS5$K>}ENlm<9|8im*OP2DpueXUzg_l%zvO2(Aetx7)Ry+K*%-a(%ou$ z9-=I+;XYe7BVmu56}zNsn}9o+NjxhYkzS?UwK>zd>H1!==Ak4GdJ+9=dcyZ{zSJNFUGVUdkQlM>N&f4C%i0%0#1oMW)XWYUR zF+r9i9F8ll8=UgcucLUgTkyo9eLCgW%Wc3fLG`a}_*wf|+QkxBYq!zIxO}oSnE-m9 zYVbW`XScPHqj8WrRDB%^)aplF8TvBv+g$`( zc|jxZ1@BSJ_C>a}(k~eyo27hTcl&u=C5pbBvX@x$5wIFRV~)SAb9%q+t>Vo^gIim= zGkxdZoc{oYa6<`-m)SP=7VP_;O-jWGVLAoRR$<4zW@_IMye(lFlIv580k9bu9)G2L zBdC7Xemc}6Z!+^@D*W3?BOczh&Fa4#yiut+k@cC~n0($*z#jPRU3Bv5@8ZyxD0DvR z)_ys7KFJ76<&YfYgN#=V;$Pa^!Ww$w&g~GPCvwTbuZ^z!ZQ>j0Ky6B59A$9*eMM*A z-D)@Y3bBE;6lCM5?lE0dvgogkkt&*5A4zzx_SCwarEMnUkQC*@jQ$y~JnNjDMAF9KQ^;waMq2H1)3>c!R_eKicmk zmL~Z;r#S>xT#oX}URK`3@K5mjRMA+O90T&4;c?sWspHdwC(Z+L&JSPkuC*A!St1*6 zay-qqSSMv5p9Zu!T=K1fEW6c&*4DS{w}EsTnlb z5ZgfeNOr=XPUF(A#TS``548UP2`8lxTF8XSAlrrc6!xodTc}aE1A)i6qRb20E!)}L zB#}AVBn-iNc*=iA0lrFA|D@g3fW ztVMGZ0HKG;j{c^&v6w$^O|`kTD!i}A^k4WWx4}&|RFC4eiDshG{Q_S+eG!1je||{k z{jX~HdSdoBjcD<&n4B{P;=fRICepq+d@8;8f2%~2{kqYX*c=ii#~Ad<y@tuTv9-bluU7 zIjJpAPt$c&V4)n~5_6nn_pPffO<4m2l1a#~KhiaD>d5yCxGww;;vSXJ>H4%2L>XlJ z!<_c62A@H_&HY_?3<7!bFBDTpxNoT)bDJBg~<-CGPthx!tOIWm9s<)enE_Z zSl%1cX1B51FI# zVK*1Eq-dj;b^^L1Ng^DK^t1$YBx955PO#85jc#cV`oma=Vn=?a_K1A?UzcEtgfDi&R!n< zoIWCWi)?omA^`lBJ#miRtI)hV`x{y#ESlD@<{V*w=)dD%L9Laa+g92ea#wD5D*UVT z_o%Ndn%;ekb01R6UpI))v6Y^dM^tds*5{r0d-iYmZ{hu-9UWztId(k>^{%2F2SL#y zHrig50uZPES&V~<*L#B-c@dGnuJ3BAHLJ@hRa4U}{e^i|F?fov-;-v_oL0!qYlT?B zmNF#I037o{xH2aAK6w;msT>cjI%q=YXCxjEtya4YX&M7Q){uPo?^&rP1tPf&`$HA` z$NQ(+s$EAF*jN%GT%WoRTDVp;Bt$T*dQ)wuTPuMyv5*-4?3Kak7wJJ<7?f`9N1DyKRyOt}h2_^s+Cx5A^H5(^`&GG?_cwqgH_*R!fE8inV zinAvGWC7e&103fm60Y}bDJz^0YQ1n}ofHsBaq=)8l~zV6D#;s-!1Iw!I|9Nldj5|s49tj=(l}WK^R=u=ABTp2K z<*6HX@JHk8RiM!>r3_?ntL|%GR*D$mjiGP@^-RCPyZ=8J4w>)HXj{e<8eC6FFnt%%+1%Uvt z7ywmR?W4E5^BLHLKOr8S>Y*vqsH#(TlG%;8$~>}HN5fyX7wkFWpMu)V^IO{=?Dmwr zT8tLN$1-{`#|Myq{Z;dI%u?xB4P|vAMCm3rh2%G>ui5);U&3BH&}8r*#9cNU-8$fH z{qlnF=ZvW!;P5Nq-`lVD0@i*MH2ym9#3uX0?l=9aBnRx{s3ec!9S>Y_+nW7Dhj_j? z#IX3sX|BD`pT}jchwmwCAISL$f*AbZ#4_h4W zcQu}-Q6Y&k3xCT&jzAs#D!<$0F^?)7zRk=R2WUNwecG!Av^>s6%XbeHXEBmHVyd)3 z8DAic$9m(aq)URx^PtM021m|9)1;X)cFG))^Jk#{018UAwjZYrutEtFD6BZZE3Cj;?4I@icQ1%5Ypr{PYs8tK;;GD91GsdvaDxEVYT zO8Yb6x5giaUmQF%mO8xA3Cx>A1M|lGaKrV@es7rMb?|a(qW5|;>S$wWVq%;(>W=F` z*L(%wEf8ticBU3N0Z7WfKE3Ju_%w{aAvwhK?$3KU^HIsAu zJ@_Y4R=GOG#L`H>Brf?xUPCY*q;cu($GU{jJuk!`4X)keo?E>(NkEA_y!k46FR&l|YVLpG5%9l^tRtII(xGV) zPS=(&3Nh=0>0Kq2j7B3H+K(i+AdG@)H;z=fc%rvJn?M0aZ(8Vu3UPPpCgjoO`mew( z64G?md@pcqW*PfLYJYbq&O>9duA@lN<+QOd-i2oX0OP0Dx_JV;PO`=c1Co6zjq67| zY|%G745vn}s#Kt)+;=l=rDLDh;jmQ}^FbW(frGqsHI-?mMwa_l(kRq1D3Pu)T?O5_n3%8KX>s4oDVhoUgc3^Gq?_FtkBG%Z$aPVA@BoN{LVtB&q{2x{MAk z^A7eL4!G$~Skx#o6&OEw^s2iWvCqq6^Q4hRWCY}t;d!Q9+efszqJX23iq@S`3nNZB zJTmk(PU)fZ6(e=rgSg<(qj0)0HA828Y>95ayaez#;<@cZM>f{)cBrcRvQ@eddg|}( z^upd-OZ&$lAx6Uk?fBF>w}+>>XGOLnY-$dA6HP_LE||}T9zWFd4PMe&H%mOXvBV+C ze=rgh1ySFy0>0XRguX5Cq){%fu^#R(GDsdlmY&6TOTUE1~ zcG}ZnAx?i2Pqxvfjc+ZbwOmMrcdk1g8yKVtf-@Rn) zm4R5F!}?~EzUob8!K9Wc13<1mLNlJfl}#o58Ai(9`Gl|Zw=nsNo1eA3el0Ad4L>e9W#^7dL`D64yA6TBUh27{n(GHw{Ast zx;}%c>7E>C)HMZ?K-`8oV~=l6D|$GY;orLSd!vsNhNE6QwK|{A-|fZ!00idoU&4P9 zUTXHXP}@OPjG&pBI_Ov*0h;w&-)%`+zW&NFe z8S%eCp3hRUjikGbt3+Y}Un3d%*X1Yt6bJqZdE(CnTi(A*V*sr1X>&0XG^LV#m{(Fd zW3co!`PAxFrzaU6MWvJHuY>b29S5(qW$mQ;iKyE{oz`t{=azr6MHzUG#*sz~ zH~T6&RFY|5Xqh9pkwYd5k`50YYg*=P$ky6@lPkss`+`T^J#p%40B&sxvdQI^Vinmk zPv=`Iw?-0+Os55^!xxna21X<{@s-AUk4mq3r{7x`r@Ycart%OB4gK?C1hJFz4k@)l^vrVTeVkv43g$!~s!3+9m{+m(%6u5;Ut zwCk%Fo(Ut7W%9hRu{mrNZ)4uHpwlgd$dcKaX?mEFLvwJ9k)6v1&b<26 zdr0>O864)d6qgDG!wBPDq9)D&IO=_Amg=!UZbrFnIEq3fbVHP3(;)Ob*I^%rA)e_` z)JYtK63xK_xb_t{_9!>%sFC7D2vkA_$np2Hj1x)Lg{)7qlQ}z0E-8{kx0Kd9n%OmE0T&3-~}JXPrV}|n?n*Wm^bB5 z1n1Bi%i6o>SFu|&h&}+jd)<)_EC}+&$tXb`54|it6qzK3YtWY2q`qKs z^8&bN(Ek7qd-G3=!*g3iWP1=ILRog8EZP2MyBK^T_f~8tm6dkjNxKcScK5|H^ZP6A z#KZS{c1~Mv-&VzD>&UNQmghGYhjnB~Q5jj%P~Kdy0&qtIKHik+yg38|5~8l@H!zL1 zo!^H_>#n>-qEB|3HkCYg49cL(7#^IF`qovYyi#gydvP*ALhVG9WXM7MhZUc-lia0F zCNx?UHpwOZsZ>*gJaQ7|QT+h)q6;4?M}#yapbQ+K%MQqWt8V*6dx!*al04Zn83Sqj zPxoqVAHvc@b0K?R0|A)Wa?RX>QtKtuJ(Ir2DRZdYX@#B!3bPz6u|_i=#rOQSF7-qWhmy#dFlgwW2hR7B5zL zewW}EFtD(KCMbjCFys{{-@R#D_(CY4kVPbF3B|&w#_|2p>CJVv`bdTd;%l7Tu_I{X zKT0&)ohI8h_X-*{kd}#u-z4-WwQ^4tR(qSqgd?%bp9aDUy4ya$zux6XztW-9Eo^kf zn#O2a?nk!WZymaU$?AFPO?n26W20;7a+68rhm*@d?f$KMgNo&RaiD)t>i0+cFBPQc=pr#qw%w2>T|ZNw15nMIKQ02e~19sTL{+8w2_Q$4^4gt|NP zuzyP5@OOm#QLIO8dvhCz@1{~fLQmbL zI_eK_jVC2@g|W5Lp^2x{;w6#GF8)S6Kq9m)d>?lW!p$D`w;wcUSCGf3KBB#IPWU-> z1?vfH5)_1}iWkE$kL%o#OX6PwCXWlrHNr9D%L=4$dmln82aMLp(llcFo_{uvdvZ(} zaWjD&Psxo&I+0fGG(vA;`!%avNw_1#oel>CXSRROrOW+AEoEy}wJdh3#v;M|{{Y6W z=z3nSbrEQ+o(UN^3fbqe_N-@GcGTHI2#&`?fQcZUK$}}P54Yw{dVUownX`YjTU)%L z30UQ1`5PXY?_E#B&jq#Yv0UEAAPig2GVslV(2q|~TJ}E%=)MQnE#yh zT=)8#^D!8h(`hYRHA+ileq39FZjr1EQh1cKlFYk+80ZIbDXv=9Hn+BOFWL|(c?RIa zugjj4mh7J<_}QHsd=d#T2tL%SsHwKNv}=Erhj0T%`RWg^^RLo3K1f8n4GD-s%E>vA zNniDRW99z<3P2<`vR;`Opg=Z|NCUYi)}cv!+i53;QN9t7k_?Fka6kj8sZ>LB37w@Z zBmV$X9~k=jpK4$-810g0YogPu5InV%sden6_7!UG?&j)wZ)AUyk2PY1D#eZfIO32O z0p*%Sg!yaa;W-LAlj~9HHj_%qKGJ-)03R)|AN}fA0b?;4F(tbIiMm$b!5)Z3Np7ktjsi#{-Z#*+GxF#o^erTNI9QI#B zObYiYD@-H0Rd5gPUJ;Ja0AZruI^^hyCFRfxEXI zfui`y-Q*;0+~wO0GwJD85&2LhgCQ}Q9m~v ze@u#!SB2SPd%-YO{{T|C7~}Ql`BXDsxV2qA))jzCNBYsY=NaFhUs_mkp&qm{i2X%aBj^uzDQRBG?RMzSAQW zmDuE9dQ)P#Sd}A=CSA;Y&BPJxM{!I^lU+>mx--hd=ESb&IT-ElL~|8E=i7u?9H@0T zVeC(>M~M`cg51npjq#u1AKny5(KL$;ZqgEdWKoUnj=q2jO$=*YAY*Q_1WAt8eY=i5 z3F}qmGqjIv!)k@;A3k6|)~rPg*J#p(I8bt!<#EPOtr9^rRxKpRUR!d{lo$#RPpPIY zNUfIo;x&de25?W9gCvpZ>}kje z7joMqQNaqn!6`2M5>WR1C<_&)iff4sLCh_Y%Z@)vS*%doi;^BZwgiWvVdyGJ?ja}% zVsgMFp!HmEKl=4y?kAUgT6!c!V+1R%@emzPxu6n6Gpow~0BV*viP{u8E*GaH0p6an zG;xTm;{$K{@hXA}cgMX}x;ED5%#pDh0ryG3bJT(FNh!HA`7uZHDyu8!gG^-Vma%Ox zxk4n~JjeNVpK5#GTZkGNV)B(qWf{)zQ%Djdj%F8-vy=suqbKqmsqxr6*U`E8NFyxg zXYX%a;ED04Yu~WoVlu@}zP2;-q5?xSQ<}`I5Jjy@nMC^~Y*u z%$DT5Fi3Z!?J}wPSa%>EgVKwE41wZ`Wk#1%j|wS8ho6 zsAIK(Wu019+ZzW}W;|r{C%r#&vP%@M9L9h%1A@Hu2fx$&Dp0UTpE6*?AZEuKeaEdJ zASkhhQiL)4rB82KN&Ksb!dpnu439O>UOt}m=yG@5!*XF$$P#?py?&JF*%<}QBXrx2 z_>V^eq4uKSAW5a%#Dai-3UUQHNLoaDiB-_5fKL8^a0V(%i(7krmq|Os?wh2Hu{`5| zDbPY=09^%Qq#0u9Up)p-e`;4jVyd)KN*&>F7>&*kZ}ZxRf;OC7G;SU~6d&Op{^qT{ zrM%NiBo4{3K?+82bN78SOZJP?crR}fHO>(i%K$M0(vD!UQANAS90wJDt5M zTT3w%PbqA?^_NCo6!cklIxxhH&`wAAq79%ySwDt{clr827TLhu*!kup|v$LM3rbpvVxxRaXVOJ6f)CSnNX8!;tsjlBBqLZFfsXStsHd+(? zl_Z2ZzE=x2-Q9WM9^@(#Rn@Kw%!w;`FGk<@-FzJRk)^IDUDeDB}tQyIl~H zM@`>K0_=N-n#e~T*>;iHz))Aq^}(k}aU#T!MC&2OWMSB1ptw6l-AblvD}q{Dc@Cd%B*B0tb)2lQe#21X?xTR*pLddsuV9yAQ?JU7ZKU{iLFCs>OT(`*VLb~y> zyP8PvQDk6_M_-C7g-n z2qhR?yE_6H_uK7M78wlbaHdOn7_axe4K$>x%?xmZB>wFz32a9mF%+V#gwlk}-$Dk4tovLa$Jl1U#ndSFlqQe{>c=*U-} z#;+S-v5z(~KX^%O)H1;!S!KUZDZ*twy@{gWM{g*OK@{*6-<`4yZ8`1rt8hUi5_t_1 z1;D^=TRzniF%icaN4p$`AI48n?M`VyC08!0GO3@LTh}!&P$q3s?4u%ri_pZ&l1S}U z-JNAIMz6V)95CQ9^z^Ft5-qbvZW*_;;R)jmbHS!eB}_>70d|a&kGy>Dz`2>XScl)Iy44JWdN5TY&aOt zU;edMD!93ohntCvgog`)0K#$ytwzu0Gb_eixY`2tKi>LOPc(;i2!AhOx_PC3sxr(s-VrJYQeD7il{6zC*7Ol+*kKaVtp{K*<@ zGmceq1~E^dUhH(GSqldFg8ayO)marmaIc3|&eCdoiI@N0Q- zS8hkh#=oGk${xXcx~+a^&ET%(%-Qtjn{VK+jk;yOiR|rdVbvgHm4&zp;f67sR<-`E zudU6$ha$OCs|rG5IkcD`Q&~T^k>6wxA>+};tfhT z+xIGEj4xB|T={J`h?z z_S)L(RQQ?j;`dYVdLK9K)>7mM^Nf&K6NAYdj02o>tF1UytIaQV5qfLCprWj;eMo#I zci`KXxYYcSc3L7Wx3S>%`cr&S;%!2I0p94Eo|^=a%M%#n1Lsqbz^FbV>7NXAokm+f z1e?29t`2Ry$K^@w$3g8}{{Z$6#27S{yn{xcQi291X*L%5I_Cg-SJy_AE7DVov|8Dd zO{G&^?tUcx)KSl6@w3F1SC%qbPZqUs7AaE%{MqLncp&8S&3T=&3z?*zb^+IxAd#Oy z1${0500lnL1&{4NsZRx~K|SrPH&Q6ZCoH8#J@B0W0KjYJtsVxF;jQLYRx*6W&)pUL zqr?f3h#%NAd~^rVV=W}K|fu)8TS^YY2iSK=KjhyP+%dFH?@jf?SdxBQkuffMf2qI?^VlEsL|j z3E&*4$j3vT)f2%aYSP@#lFNi_;9yhjf*~@p6S!fC=xVG@*(tg_%I=#<-d)88>|HSy z*8z}ZZzF(zyeVx`XrxgC$MYQJ*E#m7L@>N!(q;=9{KiFG08LhirE(jKfYC~^Wqw?F zfOS5ih~r4Mqd_jkZXCZ4p1JikacyHnQs~kvoED9{dsAewT*qG1B1m+Gbu*IPaY&O1?&qDI0l^*Gf52BW!q}5B*5T%Q=aeaDU^|Y0 z`c&K2aK2n^@+rU^2KC6Lb{4r1hvg6?icyA4Smme#%LihC^5+EP0iQ~=ZKZhy!ys2g z8wg%N_4lM}McBkC-P8_7e+oH}S(TBkn5wkJm#ElrQl#@06Gs-pj!Q`BFype-sdU*f z9u8q=;KsPxamXg5TQq4y$89FpP^50iYhfq4cLkWgD`Caut`DpC=^t98|GerKnV#GXmsHGsqoz&1$M4@-#EbfdVG- zrHTFNJ$UJgoqoy|B#!BKu_2;tUkpDy$a?ujNrGfeX7)69Mn=KmRR=|U)`ei`ukNVb+xi9 z3P*;?Ehy#HeLd*D@x90`6|xA@LNMjCwm)<0SxHZ!qHrupr+HyvyJDv~VmRa4oZ>4m z_h{gNn|Bk_9^SQyCy4GDOQu{&k;uz?b5xq{?ssy**-Bv)9Be($y$YM^OPc6(w;J7} z!tpdQ97Xd5UziVEcQu;&)Kk79eWQ#V@V@noB-Q6+^5!3We)qb8=sTX(HQGyYnTH5Q zGFJ`1+MlyXo_1Qe)Sq(+7hxb752+n7>GY@;c4cTIo>mt&cxx>Z~&~_q>8d*qbU{2OXY_}z?E5g(;$S! z8^YjiXDnECPI%_6#T0T7@UjGEz*ErrnmmPPSi=CNu&k@jd)97u9fl-uITJ>~oN>D+ zk@Tre+(Kcsfn_0BD|1a~h1h7*A@^Yj?B9hoVu;-^V+y+C&vh6dPp`E`<05vMgSaOc z+Jp?_-1?eHA+}Uf@fSjKxu28lDoB#bKw*yfhToqpPd`ejJ;s|MSGRylhTmS|JC~Oe-xeFMa!0fprXkZEV`czie_g42!If2^UvA9IvGK}>c z^Yp1aljP&e8wn(C?d|lX5h|#WcqNHD2SbjcmW69^_jQaqs5)5SGkxdIc#q0>rufhGR2s|Xv>kiA2R#YTKxt-?#)(EM21&P z?Gk;{_;;wqkC>>Fu{+$eg%|{VD$^{kuW2S)WZGhL_e7UfFd1}wb@C#d3} zx(N-~l@*>SO0tw=f_>;$0nwi&Ps|8oxr-i0wMBD0H+KR^&_Y#xc_ZH)X`#$JjJCKe z3u8PnC%2^}@=Er;QA7clvbkRU$J5%WCM%K$^IaBa%!+pvP5>X)u1O@e2`jXKGsFmt zrbu4(n|FIH#1X+WM2i^V)iA(*9crYucgE?#)nt-20l*`u^as=0pDn`XwDUrwD0OsY z=LfbreQFDRMmgtL7SNEKv|+MOxc92U)t@ zm@r+Sq>RiMGjv|Sj+G-^%wYtgZI32K3)hTsRi=tU=PJh}tdcKPJ&E)llqJb+h6u`y zp%vHy3GTpBu&zyVi99V7PqmUR0q>fUPq!q7CLphrHY_pVsqdfhst**i@46BQgk%l5 z=NZLVhV`uxgIp+O04etOp`i{fFoO*7C}K+OA2Si@NVlGS%LcUCta_-x2f3tc*e%1z z(1js#l0P{Nv-G61x+2CW=^$Pi{xc$x?rZJ-)RTsegD> z!V~VGQ2j^%U{p}YcR5*bRdQ5kzvb4g3w8{mWL%Z|>&N3&WE!#l@V3R#I|_9mP5o2XgmxGCiA8yyED*ygL53}ElMQ-DJ*I6mT-NHUC) z*c_&K$E`IGy^Dh6mjX@9TZByZ{{R|^?i+;;Sm%il<7vl3P_byE+9Hvc`{%c{MJ+7cV+wkOIDYdSlkC zG&fL{M@^)zer3i-t}3)9?3zYmHb*KDNZrR@#*+?+=^SG$L373k^!BFd(L}d6V8?Of z6Wh|PFt@gxmWiD=cWeXgL07p7vPNWzB;E>Pdz|K`j?zobu>GKJ86cDLsP#1@uv;|f z0u&_UE^)LTgNlg_y|aCuII)w4B;+yAN>1a@i{xez#c_ej-JAnRQzQZzwzfw+nz49o zq>ITmgU*S=ItIoU{Ate7$r*T{5vQuR-TZ#EY8ntE2pq<$z;zt-H8ghn3YiPwvCen{ z-k%g|G} zMRRP@szGvsK$*rmdwpsNcTN*zh{$BYSkoBesivjD({5TIv7Owq?F8f2orQAqJ>|qe zLaJEy1Dp?9mPlUH%yzsIhCoPAenaX#K9rH(q(I@*5=DSh?~m~nX;p8m^>4EQcFc=sjwr@-4{<*x2J~W79Pv+pDliB}O3RI{n|M zsqXD8po8rRytAH%*S{UAudRTjTPkp*;c%xsQ=_=Jc$Nur32Z8Xz|VRiW;roNlBfVa+@b!djhC6?nJc8`RGJLdLLS= zD_lz&{g?vBh}nk(`qxA>=p&UH;Ugp*soT_gRI%9EG^70qiCmRo(R13p81VG(??^eD z*ypW0A+20Uf>|O`vI8OWILCU}weXgd${u@%$(Q9g0M?Wx46&;)01ur(TFcf!J^#q$MTj?4MQ6aatEq4^BC5Huj6IN8m6m4!851hC~=uJK(GfRs& zUBOI~j-Is>N)-VlfV`HkPL&EY7r7LNWH5{t+lf?5HsT|KGsl?h2Lt)kHr~WksY;9- z=JZ596Y!^tz9IO!)4?APw5HT`d+hmfL=MDUfL(~;RAh5st>5rTzt|hVf3vooH;XlU zOMPR;cPD+;r*Q&1+Z-_R;Us*khHS9p@Hzko9s4DI#XbrBnY<+pt&B$h09(9Z`nIni z`KNqz1Nb8ylyTC&o&BG@R-PC5js24$%y&!j`j+pHdh)ZF$~Xx)Jx`UXoBeMVsjVZ> z`T=z1Xj^l9(WlEFIM1M@Xv%C*K<5B~-ntaCj_%Z6#75kFryQEhxVGCO#z#Aj&wBi> zPEFmN>m{CMJfp!btc5 zfbWw)C6J62^~t1P-8n^HnDLT06z9Zimp!>`Ra}u&Zu{8->&+{GK0^F@8g|kMA#;`N zI?*e{mnO-#}xGXV)T~w&b zM7Mp9q2As@EQ=BrD7%KB#1O2Z4G#`e34)`bH ztuD@6X&E(psF24IQII9r&9EFdQ-VO}I9B?3=1Z0PG=t<)cAQr3GK;ey&zd%j`EQKm z;P%BL7^Dsv2*Ui0=zVHSln)X}(kUWb5uSihLr0Rwwm`>GMTACyT?}QuVaOxWl)#d? zwz-IHU<_eI({{RJk2Kb-$h4{Opd?E0_bX%*$eP-@I`E<1nnH-;>AbOLE z{(?VmKiGf6pYT(!*&gHJG*dxi;jjVx%l`m^ zV*D1k_;F?8-xYY@Kz%dBcG~osPNQjdyCk!CLaW5!jOTD;#~kA)75kqIakd_&LnvY; zd_^_NmvzznjvT?&g5`qIpJDtp@K=UD8+boY@Hc~W^tID8%VdJl0^saXfuD2Mwq(5# zKGnwNNM7eyF$Eb z#LJpKPUQpx#~mp+UUQy4>8&e`JjP6cc-`|Ft0Y@goDBL`0nk?~xD&IEqZFG;C=q}G zKQI+Jh-G%?nr_fRK%EZ;m5`e&NEw;3PI1%Pn9=;(PkxnX#zslQE;+|hQMJ4IMaV3N zxc-z7R+=Sz?^D9@jty6qHb4TS73T-k)$s^;j>1ECCaW|Kqyy9VkM*mGNU7vth7I$s zeqt&)AtE4vu0s+)AFW+bm~vaeushC}_8gq2vtX z9cpWtp|m8+I>r@p+nbU-D=zoNdVR0U5fU&N7(J_1b0=cU#@Qg?gZwz=soZ~~qqmuW zy~*TPF|GVpwzD~y2$k36k=PBVxFWbe5qx;EmSWT0nF+{K8N%b~TE^|@B^J+2)b+hO z*c3M^#0>2nO>w?1_?2g2h+6U}imq8p^z;V2r&##K;tfF_EhowW@)_J^w%0Rxt)qP(!px-HUD5h6d1c`* zi#`U_JQ?E+J`4RLSh14JRTO+;!?ayxY{P_Off3gRQzhOVxBUSh(;zB>N z-bTIfPOJ`7P_lMnqjzUdy36z<Vx+F^njl3@exBeBpR0PTb=1W%Tm2keGf&tIV%;fovOs^St@a)l5V5-B+{3Xz} zf`murqE4qQhqwO#UcCdto*`tOB90NmVRv)RI@gmJH4QHMOI=G&dpnzXAWMZ+$xCXoe5+7OZP@=^%{_kYHDzLGtA}I=f3z?#9}!-sT4V78zj#K ztJ8cd;s!A)vZ+7C&rfRk-@^VPom~;|V-7Zv+diJP>Ru1=3~{hC$i)Z)VD6hMRwgAeL)E@QY9vkrn#Saiaf0W&t?{qzCA%u>6wlmk( zidFsVGYXXb+oQM++~Ac2VDnt3#f!zW(HcX7Ks@HREUzP)ETo_vy$SDJU&X8UxwAIA zbLE53^*F8PRW)N8aB5dP55#iZYC4RMETxpc2W~U%TK*KVjy3b5h{j6cfauBNDdjl)dR}=*Kea}F~I`3Ty7i;axvb#Y(&3zWO`KMu0GPvNf&sF<|6?GY1?Sh z#Hyh}9P&ucO<1$j!I>nOU}G3wKN`}r)1EW2;?CR13 zD?%$Rqm|AFJawtk%oDUQ9AjY>YA8hnvO5NF=sOXN`-++yHruh~RoY8!+uE;-aKU`U zAdU|-rqO`Nj1#+(PZ*}4g5@Q&GAYX7dv>XsArzrph9z(UuTxhN*;UvxZ|CJ8V;k6MvLQL$ohR{-)r4Zo;9mFX70 zvo^bOBYXXMV-C2H)o@hz$6Dz0-`W2Fz?xE{YPZwe?ohHT9088MpY*P0j>ARnK3N_o z3P~^?QWoldQP#99JQ3p!T|v`yE2a!^gvLQ9=xg2o0I|FoqeNlRygzJ_Mld(7Ngnkb z=ZWuTSBlb62LqK+kMqTH&oI09R)xkL&ok4%XRjUIF#ghbY?Xk^JN(1&uA55zo3up9 z@gIygfHGsXj{y4;dHk_m1YRK4OzJLiEJ^_mTd%bwlVO@tTju@}-A!{(7gl>a4MxN^ zp9Q`VX~s6XiuUBI5*@CvFnSCDgMsUl-!-vmrTjSX;YoC_2ijYNaKI){Aa(0mEiqDx zM;-a;Rp-8BV*wy8eotD)RVq(+a@L1gcjK#DxP^wJq*`8Dvj>XW<^^;lbN5KDcUJJ9 z?APO4cd__`@C(Bi5K0O&L#9U?H?~x9$jxNlUi`bCjlXq)=~>s8fXDugoD-ZA-`2II zD)3(GYtWfEz4bWnioftmuZKP_wwuKN0J6V{-quhWL*ZRl=8J*C#KY#!bAZI>fyWi| zhKumuTJSfBu6#Y>4Km`#QMZtb+bfP57VXEO>ImSDMSY>*{{Vc?ej*fZv-UBNG!ndieQOhQg&`E**NX*T@)x;^GwFAYx}V(#it8GT7AWt zvhsS;%8bC4QUcWTOc?DawvAR-qe@H*97fCA*N zLVMNMbUAg-N$Z-gaG5|!2PE{ZqcpcLlwFL=w@6}lkxKwL1FdC4Z6j`)cF8Aj#~XhN z+q$;%vVl)rw>4PV?M4c~VCMvKMRdkdv6Y%LE+YX+47tY+2U_3wMe#1@;qQpyvz+4I z;!qc9z*2p^&-1L=RZ1L004JKu*0iO&gqX|kUUH`d5!?~du*G3%VyQUEdK%NIDss9$ z>hLFvY_;nJng>%G#htseirkXh)j7uwAVD~uA-PY3OV%Rzc9=&HE>m&WRIi6R#l;LM?e85JpJE#Ll{y}lbmtKTAD}_ zL$X}sr~vi)Qw~FrQv=?-^Q3Q*k||ij57zYY)KJV)d{gTNWqD%q) zGCPk-`49dI9s337AG8jEH;z0Zr^j#NTP1csXGIToyFTY58;;fLc>r<^UAMWvyyroet{qO zB){yio)Xi%KjF_0%ca~{M5}3g1=O3#1N~%=yDZFkKIg4?7yJ_Q;y;5wX5Sv_-vhoT z=ob1;qpe+L&tAB38aYglu}{1PLKsLxXO?0J1Pc8y(ozX+ennL>Ai!>$Pb2H~tFMcc zYWq0oku+(>Q098Kx$tJI{{RH}{iwbL-=@F&JA7@_RwZI$v6B8%5&@izj93%X)2TV< z6<*W!sQtM<2wpCo@sr^Y)#HGdTm3!5wa9#~-rK!7m>q z!^D07)7n{30X%l<8~y}w^EaVAE5v+X{{RG+_yem=E#HLoonu6}X9aF;uK9$HcPS%t z9QG#zwku`qB&?*@s6|y(EuSJGh9|ClYrpVkiab58=r?`>@x7tF({EF4 z#8NQI9&qWL;lViv@HqsE^Y(!wl-yvEj#MAkrO{=&Ta_rRrJLnqDrzOm%(q3wwJRPU z`(FOa`nST(VCtGxv)yQS*?k`QGE`%qEsyZGd>_D(gI)z~s9ouEc^4p|-+~Wn{ax@E zgET*l-UHPB8u+rsu3+-Pj%if>;!(=5J&tShU-p{#ORRh?@y4Oyok5S(pM%I@A4uoeWy6qcSE_|)vWDJvD zIiPB(WjB=fz#QZ=9=}TMd_S$D1l$O7<{fc1E{V0JCU?Xt}r<~ z*PUrP(#wF8<0GG1>9oyEN`amBs2maAw4+tU*_hR)o~Y@XMU=#) z=O9&kTi94HBPXE^!K+d_f?hwIW7fSWG}Y0=Ey^?7yD(OD8;==U%(;zOPRHCyBaWX+ z+PH|7W5~eBK9xrD6hKUD0mnRkwbf2qm`*oG9pdSuio#u_XBaDw&b%kb*RL$|Ov;5L z$q(JWmF@ok5TuIM#zrJ(k{Z5#@vf{4vY74`KpW-Sy-%%ciK)vAF;I(?^f^0NqVxX% za~GI!N+Y&<`d3-u?JgvZu+D{(C~=>g`@j8q=X6UktZEBz@Uh<}aRMQ55RU^uy)b{Abrr$zqI1Gx6%dwPv&y3cL7P(B%7F|<-oCZF) zsp7JZ5%UwYa!p@`#3~J_*z3Ekd2H%NclJfY;xv!|SEf1|vlf;W6s%(hhG4v$diz$T zrGYWxct&?+S2!Sg)uq$OVhZ&gPeV;0yD`&DaseX%9vCl5mK`WW+eiTQBfV_LrlBPE z_0M{;x@SUgyT&&#>qjf-8W?eDV;^vmc>F3w(hPY83EXlA_iJr*_S!-w2=7uYoGyIW z+W-!f)ND4)TYWY-2Kb{n-PD}asc1*~l^-j7++-hW*cJd0Cc-)7QvHcg1!AL~6!oT% zjFhxH+Yy!AF_Jl{W3xFMxyMp?&1s7Pf*TlNflq4^5S52;$4WUx%#8H6=WrQbjf%4! zxEUa0-_ospmBuiGgPovtsbaJ&*(v}Wl6qAnE4D;~YT$S2fmYx$MEl{B2OOak*ljoS zyK^YYl|5>}w^l%`4?RHaYecLGGuA(6kBBnqTAVhsPGbG$RFlZZasCy@f5At76hnVJ zUl4R#J(k*<;`QK6k2C;!e-HlvsA4>N>5ZT)Na`+3VcyL^9 zo;!AuCSSZtjNk*@0rmN7iV0zJ2v$o*^)`RJqT=^IF=LutCs~%vsUbkx7t*@T8? zNM9j->Ji%=>kHyXhi*JQtIKh3X(#TTjLW-~Is3l&{*>JdP|69ORwbjzByc_J^ct9G z)uN=&5*3_kSnn(~Ssrl^ZGa|O$ETnIyFDUsk?jP9>-06iX!rZzTuBN9T((HdXVSXA z4_~a2A#=5HoUpH$uT4{^(dtF>Bcix=ns}jsLadxOe2iCH;JpEh`L{)Td1yKjT=s!t zZ|+sMDF+xnquRYk!ukTkZn%qcDC*t5mBCTDXp2jgT)n1gj}5wpPyzi#YTDU4fOd@g zj+HfzoC1vVlhhj2v$5L7RZNU?o_`TnN`scfN@*3MvLJ1Uh5%=A9csiDK~L_v&pSx# zSK!mWP|DmN;XS>o%yvbv>bb{XYV3swt<0R?Lp^L40x(HE@!F(Y97fF8Ommam)3yC; zMDX3IyVWk$318i={1!FjzBl;4uXvTshlZk(-Y>fI9x^?>eQTXSF{xS<)~8?N zkBeRy@Os=>`O9&296*GL#|@4FHRE0`_<`dO9bU9zM}{yyMF#+b>sF)i$eKo;_`H%x z*>+={#;@DxNMa6_=N$;IQjQ*-C9bUU>f$O@@Iy3MYw<+GTi0zya32XkMc zpR-5BJuAmP8MRG5c%^nwCuD5rwoj%GYv8Z!kg<^&`LKWeRoZ^fKN+>pgkCU?Pqh(i zDG5AsbUgl_{c8DsD9UPMDXR3hj{aw(mg1vH`#C)s`a7tZRQ~{GX`z&{=54%UvvpUF zby%TB*uN}|Qj89hnQ&a%mYf$?a0M8+Qhs@`cMMPl!*^nJx{hO%b(m~%Mvre>?$;Y zU}Ts`8B}0CI%lnDoyknbxQg=G3=oh=Yyf(J=}r(MMv%!F0bhcH?zg>5aS+6p(dG8P zKzVveZ={Kz$wLxIs$@w}ZuQ20!>w5)ckrZ41;c^#J*qD;TjqHVOJko;T5a6lX@4=B z2nZ)Vs=TiIfF$iF?^VSyH)BDqN<_`}phh|<;F_Zo$09Ij*+C}`J!#8(@_m<_A5+v) zt-CBFyo3SwPB=A5KA_)WiVQ45bzzQwt#y71@lB+fOui8Dou}LM+mtcNt^wE&Kr{Y+ zxi!i#AS!hQvQ&zY$#N#&YJ+GQahy|eZK)?_x{XTObUs%7yT9O`mYNhd9}>P0MAupj zk{KG>5tp-UbP5Lx?f88@3)i&$U&9)N@!s3A&K#<^Bu45De%a_AFZ&BVpL=SzHg_Xs z)wJL;x}FHZ;MdK6w?F(7zr&tC(C)q|{2jG#E!TbSnGoF2K6vmrCheZdxi|Sa^&Y29XlUN%<*@GwXXu| z^Xb~E`BFnEU6LVI2mPQ&2D7Ynb!bXFicSxlspwCoee7#rx~6j;dKqd$SvC!G1aVis$U^_l1O#%b&bogYBBou+$8Uvd1R&R{2IbQ(Z8w zj3+^w62TmYYY-H2+l~*@>s8*}w}rt{NEwry3b$=9+F<)#%VC71GGqck@ARdX5iDin zb;i@>vmE{&_1R9ej!KkKl`Lx_pD~$S9$&E?u~g@dRJci@JG{2cqi-8=(;l_8C8$>O z8IIsNQ_!F2Dx~l-kdjC;-zz$gyIu6^rg2oJ(UUAu+zA3XSz14pTZ}Gxao)8&E%6Ut z@IJ2v?ul~N#E>U3$GdnP3H<7_$1;}rm39CVBbN89*M?**0DZy9D}l>yd2=UE= z54WheZME7ey5%;WddcW&;+%FS_b6PLZVMwh z3P&XNsAXu{B{9ew8Q^xQ%zJRF8}X8H+Lum{5!*S#h+v{FC@n8N5OYmpFD>a9NE)!CmD*+|D4Xi-tZhG^_74rW8#((%JN5n51 zBHCzopV@X&Mhl{IGZWY5{{RZ=qel^0Hx+MECCLW4kGecn@o(Tq!B)7{wLcVCnPauz zJ)PWvq+mH>h&gO=pRIhQ@w@&CL#Ex_Tt)E4%jK7X`)~)NbNs90?-6`Y)_g;7E_F>( z;^EAkNi3wZ43YyA*Qu=Ew9Rtgynyatcw7a~(z@e<<@cVfYOF70dPcqR)5Jb4)aBH? zRjFQFT!%9&%_ignrW6i<4h4HZ?7#8Y+Fe@M-Rc3Y{J@YZo+3HVK9%ydn3<7LE=bXqQ@9rcW&B3)txoB+V}H5KSaRNQQBPOFTRk^7VIBgcAAjr>1p75&g# zrCfQilH1SsPoe(+>wRn0;ns9U(Zz%|iyi7snZW3XJN-`;`SJS%{?SW)a~_hnq32dt zNZq(`&f=%I0C%W8{ z`du@7&1Y~B$lN}CDJ0ZI)vVU`QHf)YEvDs83rKn6*m3#QORGIW?h#VhZD4Ynako9i zSkj=mvq(HOBtZ<55*In;x{_<$XVGZN@yGT%vjxgCAwXmDh7RM{)89zHj`}THE7p!k zoDV7TcM6kG(sg}0^^q|&F)=08esy2#Q{7w5bsQoKk^90Ic^s+5Cf4E5r9IBEtrxVl ziLD(^%>G~B`eUtLZ39!(T`VB-=D3W0`N`zqbQQU2ZT*d=KARNFaVR|pEV=ZoJK62w zyZc47(nB~Skp27CSG&+Ulc#{SeKOcztC*%)Ng-VE_;fVQM^V?H23Fz0hX1xnJG1a-qh-#z7!+ z{JHe6>Kgvf!Co_lT@Cd01r+(n(el|nf1P|){{RIL{{Vtt_)p?)oZ9~YhBU;tyOK6& z=0q7&f_cZkujyWPZ<68jwa-u7tN2U)3Gx|+RqTE0N!zpCAA~<*x?5;;`I~av%FM5` z=I62Xs#k*E7hA@TSX+J>i+s5BBE5^_&+N(LUxWT5xU;_wf*FVd?Cb-uINZ7D4mke+ z_2bMn4-DL26KioUWL!LujH_Vv{#E&YD-B-*RnxB?A5r`b(^JhsU=4ipKCKRzp-b)_v)s-l+WW7yk9sAEsM2y-V)`eLA6F5^(LV|=XP zB;{im&o~2*YTlCYMFjFs1-m1**XN=RL9AU``Qvt5a3hLE%wi+=Ti4#AH6%9(q+;rt zY?H+#b2E=BPn~gqM?j|?YUY*p4J%WI()E>4kmglSkx#V&F4AZo72b+Nxg(ZtiH4QAFEPFb9_|cq^XA-?eYdoOe0eY26xH-l?O&lT8Azk-rYga6ta>6@oli zseEm%%#SQizdR>#=b<&Pr}!mqnXZ+LaY+|3I}-3Zk_xxKxZsYJUgtp5^ywlt?w`DJ zCMY`l=d}@>W1vbidYO}5_@`QqSkV?S3l@1oatZYvs%vkD8rHEH)X$jciZ=!XDFd9= z-k%sMbsV|1Py>Vm=f^+~dg}ZK;vX6Pl|CA2>1v}=x!)|;QExFu$AWQ=n8z6F-=%Zb z#W;K@(i9Z*XA7nHXG%u*pq|laml2IaUb>6oJJ5{@i#bSBY%k~_)BQC-=y+*#a zgxy4>jfvMk&{p-utWRTa4Xz_x?~(QbcjFy>2c>jAAJMdpGH*LqxsEh~FETr5#@3cY zjth1JsqT3C)_$jU#^PH`dv#UXODcdu0&-Y?hg!l_T%>BLMk`Y~-Xw}CF5ROIpDt8& z$dG5K^s14FP4Iyz`2yF04{;mdfSWjnO)c#;3T) zb5rjy(AA2{#?}RSuJ*GA0wf=i9{KB6tZ&m%wEoSG;TGZ+{o)XLQ_`{Ztvc=tNOnAi z;l5!Sj)NRzR+oo#i~Bpce%o%#B!ntH2h2}6KGe2X7Vko({6^{Kw~5WXQ6Vx;{OxMO zwbJ#g;Vg38AzXZ{fSiDO*QmCMdG=Yf$t}0U;}YU9a(d%F)r+XbZEXRK-GL9m zSM^_ES*o<#(6>fiOy381e%8_nB-EMw-dW&hz)(Mn>T2GrrLLu@tLQpZvMa&^N{4c& z9W$SL=)5UyZ8OHuTK%DxUGAzzcK1{L4R%o4TuX58r1*UK=%KC3C@tY>pfTY;Y0_NhE~sOj&eO{7@Z$buM(+$2gdC!zY1D~;kE&HbEhqA;#5 z^*c>I3yaJ4d6s5onG~)DI0xxiI{u5|y>8w+yN3kG>|tb6v6s=k>q;F)8w*QmucCJ` z<8&@^9Alv!{{Z^c(s(1|H-zsrd;b6r>h?_p&mPmVAXgi>E5{uxNV>^h+8pv!V(rxA zEj$lsw$|5T-G`DwxMA}X-!-vu{fhx{WU5|d@}vOc%013I8k1S^rlW0oz8BEMCOt*G zp?xeW?{2I)E1uwVKD_p?O89yEBWk`s@K(9;5IDEe^mu;Hq+45M=f0n4XOW3Ncb-`1 zocdH$#QQXzN23#rU&3+8lj=}*vqWbYB^ITf?ToVPYZT03j(HB%E6xkC{vZ!U{{TEw;<*;X z?FkrZB_s&npvT_G?Nu&sr@OiWdzB?2RaV=ERqS}{Ocw{rOC-4SSg|iUt^()Sk7{-T zX&EB|-9Tu8C0Uo89-|${rB+?HEYTJytiVW591e$yd`4C&ZxpEQB%4^U`H!bPsaaad zWwA4FV)-glJ6EYb-7!oDJ;Ec&V7EyqF#$7$=@2yPnUc6E)2iyK%b4M=8&^qHQ*ZK~(YPMyiff6UmB-}SImHw+3bR_i$`O=j~%vmATH!*X=_T&61k<9liB#=nNe5GG* zcM5dN5Ml&`C;&zqs6D};XolwOLp*J09v8q88O}~SoOT|SAi5u63b!!?c^PgPuRt-3 z_Zc+}#814ujh6}(6Wn$Nriwl45=cf$?UyaaI~sae5cG^p=G9Q-fJ=w@NT$T8bs+l` ztRqvEA9$%fPx!jR2Y(E$l&@_s8(>ESuCR*J0(uhfiUxMGQp%#{6PA8Qc9OlyvQyWAykExHx?P- ziZ5{G8yrSu1u|Vp0ON)Pam84fRyjZuERPZ>a-0Bh=};S}1w$Cg>P~;pN@c{!Exc&)Czz5DCsF`$&~e(U z$YzB%tZuUGEb$b##pLM-WD*-Un6%m9GE6ATKwgDl12=u1?zIQAZ zGFX4C%8Y^A{{XE>ma(XUXr~iS%u;0>5(h#@rAE3ChFNarGlxYDu#@u)_VogfbTuqN zcXa+zLh-0#Oo++`ee+b7=~d=}MLf6f0{V6&)r(y_PLbQ~ak&$m2HrqZp8l13{@TI` zg}szfqA?3OW#oV|0sLv*2SYUxrEIQAIQzXAe~mQTNcq_dk`G>+exj_&vPk^nY{@FN z?==_&1EAn{p|`>eklV?<7c!&rHuo* z@bF5$-f#~i{{XK{f@ik<<-W&Dk+xTC9m&)T)S?EKXO88V#_+Dve}m8i{U~=D86;|| zvC9;Sq-9mOCyxHK*{6mFM!bNKzkF}U3-fKm*t7QM?*!yF}LlFh}lL&jsr`EnYTY@yvD<RQ%#p|Yu45>7ew`|=+mk8- z{-_g{BRD>lNeR1?3&+#Z%q+iW2pyng-I+hV>`g@$;vM8*+m1|Zc_8+w1&hqTYI}JC z#4-sVd$Hn@<_K-)3vY89jkzqx?&Nen^!kWlfz~prj2Cy_2lS_fnpIe#QrjEutbZ{+ zg!lENcDFLCEOXBIz_*W%X+$&2FWG+9R4S{C0K`5;iEpZ zkij%@#Ii=BQ7byB8Q!_#u3wKcZQZt=NqkJ*m`2AOLr{l(8GfB9B#)M?r+HOBDc<=Whz@%mD-w6j()x zZ{@kRDRxAgMt5w+2c|u$tcT2arx#2^HY0eO10&RWQ>~(QxJkfv0rrUF=*mBxJX<13 z`?xWa@*UhSsRP!kz%&M8Fc=2q$v=9hjm3(pnN~(TG4|?C4J2Y*v~jBj^3KL84)6Z8 zO>VGnjis_#eqFAp*aIC+OC5-9W()&HKK!LucX8{A35l4qNEy!@9>d$UNeUte#!-K7@Z-400r1T*RwjkR)D=dm5hNc{6Jjsa=r7H%P-RpGvKDbR0Ix1kAm0$3B!< zjGj;?U=dHsnPRKPG1{FZFvQ|$i!M<{@^UwSbdJ?kE~brh5iCb43i3UTTGQDlxZQ1W zg;XAK2Z;gvIK>TEE`dPH9N>}jsi#SHVt_n4crqCdWf=Jv9dZ3?8SZ1SW_ib*8XTaF zxnbX$iEpj;`Dm_lz|T>hXyv$EvM(dEW93edfr40Pll)jUAKHx1f`PUkas~+Zs9se@ z^R}+l!Cl>$9*5eiT|LvrEabN_8Jx7sCJ)Mb6(gYbrl84kNV%UdWUw2F1e3-oCAdpc z(o2oPJPoIiaogUjM$*i!G}etG;HhQfE83JK@+v6Ih6BVwdD?i$J@NU|=B zA9R!79jT;CkgH)kT}W-`02K}fIuqKQ@x=t?qH@v&0#}#r1N5dxb|7htl5Td3Y7xgE z(vRLMtZS6d?+$WD<4;j(VTRt?;aFVxk(_+2t%WDoiejQ5Z?Y&=ae@iRAO5dWP<5SUoo#~NDadR59(QUycK^?v6g_0PNGP)15kfh;(>MMW1 zLiSG*+CqxrHJ6W@A$|U}hvZ1fnWYNsNDGdlu4uPoLDns9p_Iz8N~P6Y=aK>aGsSo1 zbt6kKr71fk(Uo|)QIbd2o)y^AY-Ttftqg=fjYKzsdb`db(5 zrH4*7)h&KV`79SdGv<0D>A#1+5xg_;S5Hk7#y0lwUj3azGcPQ_bs6v6_P zF7n*`t^WXmx!P-Ue$xY5)pVaOJG(WOB|(Ld9PVJ=$AkX>*RPIkE@6`G*4t!i@`Z?# z#{S^@SLomT7H7c#XWL1!wKmnJjpa$F8!3(I7w*WtN zBWLF)oP7mKBvPTHMRo4kAE&h}R`+s94ZN$p2Kl0O&&kt@Nuct4tB4^aJM96w9_K#7 zmnanFxweqT*6LZM1Va>jo;v6JX@WRfQ0mx>{{XBie@ynR5YAQQhk)z@>_OYQimxrR z0?`);I+iQJ{{RX>Yn0O6T3<2Y%Jw0;)55BuKWkFlg-mv7fd0~NejeuO}in8f+A0^vI@aq|&b_Z}wSaU3xtFpfi# zR1h=R){%^vEyWjNNTGFmXyw=+4yXEbClF}(5QFzbNvgOui)A2Mi0Ln=S zPD|(7tI2VHa^`t1cNo55DhvUiYSmLSb2p>Z6;MYatR+Te&s_fiN|b7-ZT#z8JS~-z z*KqgrtOu4xnS9tr;GZ`fzxdRV*k8&OqH?du*hd(x6cBT>arJoxxJ~G>g~ok7jb=B9 zE|J(RvBR-blbyn%vbRCyL2({rl26^EHr}7aN$4tRU`Xzn;boVN{{SK4twtzUY;s=7 zaELL7jNt}&Bhrx!t9vEO&g~;AsoZn44ujjRMy^6C{H06$=tnEBZl#|?vf<%XD`9bX8<3p{~c5LfE z0AfaD&PTDL$Z40>6f;DE7X-J;+ps!P+q26so;OBRZe+*Hny#p-RaeYofs^KPPqi!- z(8nW|jzA=Qgh#*!xgw#AvL|bFY(k`unKrL2>rL|-7gt;o4&j^-51}2YJlAzCvum#) zu;sl45umxvj00=Vd6|a^{sN(ZpL2REuGYaB>+UH~D+2Od#sZ!RAK^^6WsRImaTtsZ zf#hsU|;|T&Hfb>ts^Gz`SS+T9!SsQQ9M&iY-5e~;dqsXe*@?!Yq}L0IN4ktH%XO$@Xa-AgSi7-!16{+%3WA9vN<0w)7F;aBA0m%aUU^&I3w1j zi%E~|CB?92#^(aAt-K~ANWNAoNk{0u)lN}c5Tf4Y1&N?df;Eu8PB>q!Se^-EDkD;| z2L0{^L#{dxO0c%FNTyOkuLe(-8%IDswMPA%-JlcscF5V!}Gw1rVjZb=TGH`bE4 z5=xFy83A%Z3OG3EeX0|3sVcmd;fZVvE&-%l zdE`Yx`Eutw2RJMu(_zqt-Weu@%al?<`5As=jwoVGil*7VP8S_X>C&5b zu1eP1V~KFUgpo1V+Mqg&Qte14A)*;@duE!rT^GjBAX>#S3|N;Wa~Y8SWS};|?QT zpf92Isi-;YBV=U2?=yTKG{{XL5 z7I7hEXmQYm$KE~hQyC^=R#`!8XXRXBdkR)UxVPG#r7Vi;ZxfYJ5u%JLp!CPBQ+Y00 zLggI^7$J|{KT5K(i6RT+vVvI~b6^qcNj11-@*Rq&MhrPTdiE5-+^S)@+`G}0bGraz zai_5sL>WfK>fCY-OxDa3_qPNb{_WhJaZH~}GsEXIJ9&raRqg)()}WF8d5zv!V zP0m0p#d!Rw*g$54PPj=5G5O9pT6l^%!|sK!MnKO5RA~js%f|epW>jIx9+c@Pl(10X z0CVM_rEP-Y?cQR!Df6}2ZsOq+CiwwK^fT%{* z^~kFlUx)9eRJfLC;@&`WG>0qx*it&y)bQAfuicAcx+3P%A>}${PDtC9Bhx;Vntrlv zuCi5%As`%a&2CAfXz{*h60~o@kj4gm$E^`)x>wnRgc#0neqI=Q*I)K!NNZ9_da*WQ zqzyD>#F)#I<+AgStv)R_S=(sj0!d>03|B}r*aJxnc4R}eKLeh!$5EQvmJ<%z-d>CR#mr@C+C);0E{uE685sxsD*4jwxEq0E_t$4%dgwd@@bBV( z#f$i?{uF#0@mGoDbOBpK(Pf!2ouIP-0*rz(PAloZhClE{Puu?h;tWYYh`b}={{RHq z?#Y|Q8p<@APCo2b``9)Pa7gsccfyq_YSU4QUG;x)oa<7D#LtqTuzAsps#O620bC4w z(KypItfl4cykT3C?iEIQb+6O!hrjSZzl8cN^jeq4KiXqk)`CExw0{d(jXpPiGrCtY zI}W`zp7|Xs=wF6E@K2BUC%?jJ8T>K(D(G63&cLsE;#Yl0k}=QvL2Mp7b68cy(2TUH zCf8(=FqSro*!((+SkTLZ7mF+u?ZT*;LC@DUa4a_nuW16v$iFd3I(ygj0DcU9$eMyC zhpc|b{{Rc_ZRY;~mU8$)*_Q*hHt;`6^6!m5@IwCp_$P<$LuGq?@MB5Tz72S;Qr=Ad z9J_bZrIV`pwvI|{PEdCB{Rc}KPI9x*{8CZ!2%C_nB)I1^^z#{l zhS=Z3o}XIvKiebrE&ZT>V4sW!;D_xc;pB?u;x?PZUM8>wwC@mFgM%y&+C|FwkhU2M zDZxjLo6Hp&-baRLv6LQI{_nkgCJ!A)8A(*6?vCW+C3MCDN;Gjugb;Q%KJm}3EHX3h zZ?nh@BkqR5&%HU8MTkit8Bj?IJ9>&@q)|KE$nS?yyl1E#>%B19lf^9dvU!lXiHenQ zeGOMr6e%E!Y=jJXig;6+mO~O4awT%>n8SL1g+=7xfQS`Y{&S8${d6&lmIHIJz~>-! z_NgSbfS@`eiZogLf=WJ{720ms)QpJS2*MPMZW?Z_>VTxY1GnJtfo z%=0>!$@0fYqbh4-Y|Rt^9E`gjrl<>}r0SO1geL+Ug?C^%82(kcaTAD{RCOJD);6hX z-c|~dSDrYms&dW_FRA1~a!E;aKDYRDuiJQ+!*=&}_aT-@SLW@URozm>{O_EflkSnl zc>e(GqvJyQd-!f=C82MWGvxEyy~gDdNLFGu1CV`x-ml7Y96Q6};e`gQb27CLDnWDOv?H6PyJsK-$ zxc>mYm~+;$JXNfJ!FGRW%{T4#{uplp=`U*2#cgA8ZKvE^dLoxH${QUHBk9Q*uhVN? z0?SCVk4n?@>pOTALZG*`L^vIZQIb866$R#!*9z|>&F47;$T%Xpl~^b4qFaw+@H^ml zh4nAmm-fH5_!awI{8;f8lW}{iT6Z-jFAj`j!K_nsxclIPDOqcnLDV?Bc774o0_7XJYDO1SuC@iR~Tulx_C zeUnYs-7P#tb7vP8TB?;WU5tI*`&1La+>70Tue875n;*5!r|o_FH)-0gt#=XeZ-yaV zH^nySLCor-WxxZXNs7ht+?g1jfE=@wC2h~$G$ zwN&1UFssK!UT~v|vLc0w2;U0B<SciI-cVJ(KMX(-Ce6pB=X`RDVZ zo+hRX6&j0frE>dPe2n~qzxc9=f8@RKIr&`gz){=kYW_Z zf7#E*AF)U6537F9-Y)Yd)1b}Yg>_kF-Tk4a$nE5?Zp@e{%6ZDe3ozpmF1qZ409-r|EkS z#dr>n<4wuuAPu--w;s6cYqRj@iHf3^kmbJdz`(8w)G9_st3-Vd;lC6+Ig(e&7*s%b zKK1B+9oH6U!wEqdj=-5Msufisq64vrT`9c+-9ViT0|+ZW2%wY^Q;XUQ(2)_W(1CSJl5P336S6(oT;ws zrmk@~xVsguZNrnE1~H1Iac-=bRL0)IwI(Z^5y=<^s!W~EMh9_P!I@21e9V3k~DO1P)$Fe?!aw2I7n z9@Y8bqkM4jcf)J;eG|m2u)qf7pCwoiPDdTMuUPO`?cgW1j%{;LhTbgl>iJ*Jz8@cx z%MDSuJEPs9i1x5epIpNLoiIjlF@a1r0i1)=*1Std{jGdCtXiABC&m_Xpl{x?I+Gdx z?gvBdQtKbJM}@6DvPs{UUcK58!M&fIDh=$=* zVCTLo#I>*61He}nVkNno&I&-9DR_UX_pVa+_RG;Bk2a=hwkh1MKhA4dVd_hvHq`nu z*IBoQJ=%rRY;laK`G?k`xba4j82 zjuLI_ptQE9(4HjyrgTswHmNPbspdj>bLzg`tAW>kKI>P$YH8%#<+mx%HRhgf9fVS{ z?(D>s2kF|ROGAyGcbW2nTO4QlS441>*7}owBWG3dezB=DUC(_iizxzB^9civ-j$x0 z^G&)S>>D{Cobge`ZHF=_;YT121zNYam1H58a+L%=F`C&z5n3W#q{-oDW!f?WclD`O z1elLA?`Q6-aA<-6yhh!!PI_jnKoD+dvPVvPdg7(nwAn4ZTQKUXI~V(Y^f@agxLVN|j5gEn>(^{+P- zhH_lV8bPjO=D+waU+gsx!Ow{a`(gYl@W_k9UNX8>@mkvBW}m2lL6wkn66JE;G7foQ zYv4-_L&%Y!hJDj3Za*&r*pAix6?pT&e-FQFe}MY;z(0ukV%+JTCDU2}>cBm`yH3fF zkZ|hQIrSYoSM$^HtKjF2e`ha@ULyD@xNv=Dyp5 z^975d@O3we_kBAYxT;E=x#P3k>O3*5GL%m^;2q5)uR-i9(Y!U{Hw6-ADVE^lub{6F z@aC{vYD~vGZ6l^Dy70ET>wxkFP}vMlaK7HAy_{YaP?x-M-tR-+{4=izjW@kIgcMW>OVTT>Dow ztu@}EdP&?4>@ddz+OTr7MMgZgGrTXNMw-*#t1(Gr!nE9+S7&FYNgJ4+GrK=NI}X_N zrg&pVK&pZuSn^k?#dNlsYi{#1yLUwbxT?NsXmmn0MJru25F=R01oX!uv@Pry$QZC4 zxg9G)*1-Y!kdk_0t;c4lyD`_2r>#PUrJ3>AI?40kk<*HrJ4|G50f%BbR)lup03{AP zW~EzgpsT1k9AI?%)`|kTL9GNsXPOS>`_%scvPR`p^T#;tR?G~b28$=S?@o%{j7D}F z6r3Sr)YT}VT&}4aFU=UvFn1o*M6tL&P-krN6ld_RtHHkwi!GhEn=T^uskamEss$Ab8K;ct(8T|8q+(MrG@GTcp+SjWD4 zpK9&&FWHhfRb}x$x>B^Kp*%nLjbz?ih~<(t zP1zXa^fjq8eEEflImXl5+*MhdY@DYj?-DpQ5tW!VbDzJrxLnB$NCq*92j2CpyPFvI z9ng?}iw3$KLO|cTau3ge>MJ_x7nKa#MiIMuS4?H5rfpcoDnZ_kp+UhOl_nu}E@USo z7#*qCDE@9-C|vxYb*LU<0TK*t>+e)C(s^5wGoHE0^{R6#PP4?y1E|Ph*i`Q_?pWEd z#jw288S;ZkJ1E#W?YgQuFIxRq332u^Y4pvPZIbWU%2qjzotoLeFUW@Rvcrq4`Mk6v%VetL)APve45Um zc*@Yq14IwtYw0aQ&%yrywReHm+IirE#dc7CpkHBB%fQ5L#B?~p@877+P8Sh86<%3u z7Hv335e+v!aJO*_WGQB121(C8r`nwQlyW2aPq-n&5!ly1(|6 zIXI>X12*G;!2G}CST!q`5UfKsa!oRL zk%%kwBy`O^CRs+{4t;6M8_0oxRT<E5yRZ8vPcZGt>ZhjOwuIUM$`Y{M?2m{H|=K8BPr6T{B^571p7 zS+mz|qMF)e0hi?<;gqrV0b<8Rc>UA4U9J^q7)QltD9hsW; zylxR>1Ja|GH0SqtByv3~Mn=P92ZPfUR%qHu7?cPx$u&u_8M51<$|&Rv)J<#yhb^B_ zYeq=(pVFduh*G6-$2k>hL1KZ0m9Pj>%Z!oR(wNZ#*kuPDc&oEQfCnf^>B;F;x=*c5b#j)9OGvAcf?LwDwI3B&+M$w3 zV<->I;N$eGQn1o&vv(9iFx#0|xdWl1*6Q1k(_>HBSov}1 zoL8TCgX5;Ttz3a_*tdKK+wzQK+r4P1RH(I9MI~)dy}l9rX0XsaJqCxO!*2535e`ni2i9QQYjM@Z3OY0Ch~*e#o;v&Dy!gg>b}dzd)2Y3c zXmUvWcGYced@rcWV>;nPr)15@tpX6K%s^~349q4L9|ft5fmSD+QYXQ&;U!RiJWcdcnw zaop#tMLmv>%rby{z5`%q_^PI%gl(87562&-YCBu=yDq@say{v8?pP-294HZ%Mk9i2 zt`*YM<&`I~=ARYsnglQh45~?VBOhAuZED^{7@=m|06gRRSFn6oz88sc1dPSl z5>_+M{{X7Iy30@dbn6s@%)#CvMPPrT1`LZ&cl#69gQ^>BQ84*3FD^#3YBa`fD#EE zIPLYVM6(2EkVQ)siU$ni9AuALwH7lfD<+MJh#kaW0Z$fyKGi{<>IW65EOyDcQ2gCn zJq1l2fC=S<027ed?^;GJgtRf2PXyqTmFx7Uu9~N7G(e5n&1?%Z7%Wf_1`Y>WR@2jF z3}gU;buVPP zh1r!PLO9xB03mQdUX>}dSXCn~GQ&9?tE$pI6?oUgC;baZWF3r%M&ap5b%{txG zW%Y}Z2yA(P9F!H!I@o%9$ribp~--k#$Ocgt-J-GDYv_ooJk~`B0z9SC#cSS`gN(i5B~rJ&eJVXEI{fa&q-msTN@d>w; zTkbF$TplpPo}ICZ+lZ{T>JCF>mR;O8xTuBhqo&+6!gm|FE`0}T^CyeOPFHg}6e+HU zE35v<{wVN9+uLn9E-aMpTdPGbxbAr6eZlEd*yuCZZMC_Cj9@D-^{-&~WATqt@b$_? zsVCZPNyN~ygS}5)ynl^#pAdcwcw@#oBY5-SmCAjP#$=yO11yB~1JGyu_p70qPui+= z7tEW1=g?ZIA@H#_wOksoHpM(#_1WNLohw(l>hFk_p|M)2!Z+Iju)W);vpl{h_Vi zbYTN8!tRXg0V~%DfD8HPD?gc3{Lte(M^B=FOXE+5ldMxvrSiO<8DiI6K{# z4PdAOg%Vc(~$zf11tAkagw`Xu01ogn_R^8US2`fDhT>X{4J!<|IG58}<)aCmW zvu=-^>^_G*y)o11E9|`^T(H-|%Calr0FP^M#~o|)GdGqq{{U!OGe+siF`OT*eINTW z{?MOow;meTE=tTc?RIW=dS}wVIpPeT>b0F}OWkMDU@?By9FyH2PijEqsQHt8RS->N9v%F-5$5)RxE z?M#^@iZ}Z)Q0_63Gqd08Q@l3?zR@C}C;eIh%KDOh>GmOBDR#uW*#7YP)Q0<+aznZ! z3aMN!3+MH!nv%pV)(cqJx@5@bs~_+ctnu53N+TYpb7!}uQSuoTi~Zij`c;x7Mm&`g!h|0df{3+7mou(y0|xYz5voe8W8|gwX}dCeQ>y z2dz-lpq}IXE?A1D>>wS;?^+LU_L;n?F}07$pIT&*MRBqTgDHuR&5j8F01DAN8M~Qx zR@2WLTq=wp%f<&S#Zi@xBW6E%r|4dp;41e z@{ikB_5$#i?FXY={6qLxWo;I&Q+?K&$^N{7_g5XsOT(Rxc>m!ul6taar*z+%RcXqe2#~T!8E+Ph&r4oTB7rGXzP*8(L6EhL#aKAys>MGfVwCRJro&fVjO8S7eik&vvY z(YkHU0LjO3?rS?zRA|`?m6fCUTieiz>w~&EB${OUPs9yt!ncV$H);uUwp2LUan#qZ z{4xEw^)Cv`4wxwW`eRuq??D-4$6sS!Gw}xh08!HmHk~m^ zV>pf6{lV>A8IB7Lh^6ntUgx8i*R2`pEf3c(hW`My{{Vn|b80PN)}u43gCUjhLG;CX zwugPEc#>2WIK@tejvEXy6Xt#KM#6ZVPBq%-IERE}}}73iN2KX0$v zH^KJnABTP+-9~~9s*-JX9PmkCbAjvp`LBqtmDf^!#$S2#v8@X(WA|%J_*`{6VS9J0 zM{0}D?;jh!oK=h8gqjYQ8cC^mx)3IB^=lx=Us8U*&)C=E$K}s% zm6qNw)DeDLnGuFdM;mQio}go(^%O21#8hkA)opeMiG+RxkJ!&1{{X>Me`c=$Lw9B1 z`@ikGg^aS>+St0sD|En_z)qaY?4~6^(adPN6Tf4s@LFf^TVX}B1 zcZ_$h&AXov>YAi+MsJ;nbMkKHvgWy(`&X6ku3ZWsb&6l%ZiMmEiu5S(?gl!$vngX| zYadj6NdEwWn|y8YY%*!ue9K{Ov4$4#3`h=6PX4$bop=|FJ~RA6@x-zp5O|8>@>$Db zIj3wn&Uqf)jdJMHeU*yKwnB2VD9L3M>5@x@V;qZ<%z+o3zvEub93CEwQjAuIB&yC% z_ZoFe`^kL!nBVP@#!P7^IPIP(`gPi0`CfDze2lc2#y3=u0cCWuK&Q-D#xj40(w}bv z*|~}1XH19OxCOTykUo{y7%Le{PpM!>7Bb8NH$0AptiuF}DM0G16n^;q(fN8APBT0lT<#@`dAFW4pWk@%IhEh)8-PC$}*FPoM(5Ga35A5^tcI&|2D6-V; z@6~PLzYGA7?pEo^>@mlouhtKO{{SB?^`8mYYsT&~1jwqWg9;BqJ#(7;JkqsA(dCdq zy<>F;=jt2$EAOxPC*Q@${vvn=Uxm89v_9CU7Sb$)7^XjUm$(OxKc9aW7ecNZ6ssqp z^_(}GJS6#J^FL7hJL3-q__FR)c9A3d8i5+O-jnOtRX}C3*JF|=XY!l|I1G0FHSurk z`}=3VfIcKa@b}|=^}U_ZxiG_am=VvCLSU1|K zo%!^|dsOR5OO~RuYfm%vye1}&E{ds5{{X-@Qp$P9+v1pjT(sg|ayt)d#nx|b*HM-` zTYoS=F~b`22(4R*Z7yVXce>u9ZR&YNfx zYHb)7i7Udu;zGT>jT*IphUG6UCs`sa3hvGsvB>tQ=hC0-WLhtn1cW(bj5mDNwXTR~ z(w0~O@|5EeoOy>Fl^uq7{3$+EEy?^NVl`c2JKI}mU~5Dr*`Jrsw@g(J6>rK`8$t#ZMC}E-kYaG^GArv5y8)Ti94|;siK}H@r9}zsWfzqK1<3IsLyX&+3??v zuDnwj(>2`^EvUprCOIk7pHB5uYj!%caNAtZG(l5iDFd!Osrojdpb4`SsYr+F(_aLq_?rZFy+n@dk%dY$=)$aUF zqWE#=w^1WpJSrmyfRYi{(*vmEJ%H))9;>D5$ju7bNp5g9w5x(S;ZJ(}!#m;pW=&s` zuCaSbY|-I4IOx@yGe?*rV`7V%t5VKkQzPWd}xXov?R`PNn5 zo2uLuk5eH$mN|@Y!||y!O#<8)gm<}SfS3p|!5`sNRV1>D z&c3)C)X(W-}A~=M(;2M zqhiAZ=cX~mFZO)vx*JGC#-lTUIZXE+`K`(H^$r;)i<6cpG1PR=tu^A8ObZ*h3|Dk; z?fpsbnwL~umN~g}i<_C+?%+!lfU3r0IP)VNGmgBPs~3mv?_@@}Vv@&je$>yxs`dm| zO?7%=A84^a(kp`|G4lHl{?32|F{A zLmyxX&uX&=g?`0rn~gQ|8=u|F#^&#j#<8C(cWk)dqB8I1y}X3Y9m%?Po!qPM|l1k>8-^4qPMl?r8%N8KmVwl3`g?2_Z>1%i;E23|cqD|5i!2(r8J5IUXFb1ZxU zaIucPJDSdQp%hZ5C%MTtgZxK*pv$U3s3C?Z^R<3r%l+D7_%m3wuvnU76ENJ<%1H`4 zEql$Di{Vpb`fZ+;kf~5N=axOrJ^NHT<-dlW(mVY(O%Y3FC||SOe9IsMzp1WQikx1? zp27_BOAiWPM&c`p49Hg^XvP$bagWnAr5}V~mgz6rAd)Z$8Alurwc2YkX%pV9{lHit z5$!R;penXGtjT;$paq%>XbjTZsM&D_3a~vxXYPP9e+rMS)Ne#TV*@5Tc|O?Iz$VV4^pcF{9qKY*)Ksa}|^8ge}YUzbm9F5M6vuef4aZ95kGk4sx4G#501fng6I#$2w9Ab-E?k*4EW|Sr&)pt}+NSXripPiT+RH|< zfJwg-mW*#<{oZ<4IbrbWbyi(k()Md4W>b45uqtF;>A?Wwx2Lvgw;mBX46^Epc_iXi zBg?vw$YWndC#kM?QWBnwc4-TLAIectLpcOWoKh6OSB@qU=YZ7?jji?j>kaz>7c3NCEchDU(Oq4a`ahEYk&lSJn8yzyn-u4|{-Bj9J`LSHayF+g3 zxadggKD^O9!cl`!Mt@X`mD!hZ@ZZ4Ce06CdpY3u;R^BbdDgZd$*ptsS)OcsZ{v)}T z-p|7Nh0U$RZSqHFDM68rN$=C2rD*&&@D8)$KM!Ac%1d+opA?={a%V2w`X0mA{3|0> z)bF&5x%Ay)2GgaFF)k*?A{>VVdi(zX_3O)>O0|;bH;SbTsH3LvZ^YX_g+3v>xwq5f zmPvt%?pA-A8S#T4Ugz}hT(^q#y<5e)>D6>p@}NVQrja_o@f>!kBJkFoZKjP!Q@M^+ zm;GC*F6?vn78xDoKXQp;Lwcb*Yjo zW}MqC${AWP7E-?==e9es?dkQe*pG!Pm~QRJwvsKVm}w?t&isyp)YK*j$t`*l?}Al{ z1K1k4sT?xL71Ze)Lfc!+Y=i0a82258OC-ZK9cM2k~ zX&;m9q<<=R0u7ELS)+l7Ku%8pXRhjVvMeClNY?=Tt|1)c4!riI&DfXi$rf$h0=ye? zNgmZb@R~WzrO1joBTc~}000OF9Cbg+fFYS9ia8~BXL(mKtTJ*NjBoSPh>zWktDYL08eF?vKa(bWzx82%)tvtT7hot8BbF3H>dTctZ}5CRl}qWCN{?_kY7E;HRfMECXanq}b9X!7~q-;PH=2j>kT6vm}_j!RD1rzt9uXqzx3WEv$u$ml)ib+9*cm zaFB>OvC zU;Ucm8Cg{n`J4K2*q={IU6DK~cItvQa)igm8{a>kd(&Pho#lutT$YG4EK;65bLa&? z>?4J&T!R@Kyrn-kJ?H{cYV)ZJ!#8y ziz_|4$AgWejN{kqOuD~oc-BM_D=TG7DC<;!dW5r)ZYGLFSy(GdPs*#;KUyG;C|YTE z`RHHDe=zl4y*(*zZyM^?A8A%(QbPn7Ku2*^2Y&pooD3GY1c(ea&Q!NK9uPXny9f_v_)L*4In#*W1iIPq`O^Y8<=BeFnAc^ln78Fv=Tq= z@?+hC=g=O)fD2fdqpsirf zy2QzE1+LhE%Namyu^mC}^rdY;k%R?STX&VWjjkE;S029AEvBERZgZ%!I)RlTuusyU zca>ushzi-q9GZaKgmMI*KGC>isQPxNV7e~Hbv3t@CAG*%{M_x8a^-yq6)C+~LASDq zEFp<^lN-6~kH)ghrr`jQ8uxln|I3$&maqiYn9(QqSMK(I8?z(LM3 z5BbG5J3@{O5jj_EvZ>&|Qht?mC{{Lh%O=9Xq>zl^eLp&`k;QjD^kRiyoy38kPCuPH zv9w2T3q=^SLZC?Pmu1gh-qm8>(%*4eu0%kfRNa!!-rnC@dRqY*ifdL6ypgwnr~E2g zDAkbLT)K^ibIG@o3F$?_BD~3SZ?Z_xD@BvHZ{E*CPAKMO&9)vj{ply}A5cB&)y1^X z$XaOI2%DQ3CvW&wXzbqFHMbD6G@m-TImkSUH4T{icmt*Z$zz9AY!JS@RiP1i3tF)e z3~iCu1xWSxs>biiCRpMn$^?+EGwn_;v8zVOBYC6cJHF}lK7x}{D(I5!ZN;s{xaGKJ z7~&!8^)(recFo}q!H*?}%0l-8@#{>RP=Vc|f>OmJ{qXKPW8R~at7glV5Sc1P=YpX!=N9OLwBXG~xnxk>%J~ph30nf?6{{Zz<9$95( zOm7T93p*^wNwK5r|+M?`$Vt^&a&YfJnQHAfe_{zvc(HpcsxI46(%6605d)_RnuxVRA^|W{G4mxIrOOLFaE^ zeQDAeM2RV9%5(|bVwnW!>-KnNW=O#xk;5OadU1wNC(I*a?Z|c+0)QWdVf=||xV(LLTl@kyt51ev;olK~!7y?Dk zPE?weVUG4`11VQk+yQ^Qy*R1H*rW5Hgk%h$kmvEF-h<^Ty|RWLT$|D}{;)4NBb-&4 zEun=lu(D-$C@;t!zWJx=sT?9ZtJuGC(va#~ocjGJz83S`wZMu?i9EbVGB(ho>FMoD zTa=ZNT*YxHNbTDtrQ8TifH7BX?B|tc$Cjtc0a&jm6;|3gBsqdX43VFZyL_bn6(nnM zECk%lzG4%+L@*E1leprwCAy7PHM8%9y7-Nxx1oH!6sX6&^OKoZ{ za~olt9vx{GMv+owY$I}2hdA}kDb1ArakKNdWU)0p)T*GwyiP_!JV0XBRyi6GI6P%AdG|G1;z*)mHjo1bD(53P%|@t zvbD6s22^1nJOj|@-;R~*nmjhz29)+%iOv zUHY@%z7TwHw(#DM{{RTquR6Y%=%Pz$PF5dNpT@n4&p`0*pQp*IcrQ{z42iwcC*g8B zdRK+~JopjeUx~gDX|yeAt$aZu?~Pr*buK!i4}Wfl714Y!(7aoq-=~8$@hlqw4Q%9q z$__F;tBMkeslA!)QBrANW8HoQN#WlN+)v{F02RR{!Bsv~6LiV%j+_eh?*sf|@b%Te zowUn~IM}pt&Z~i+LG9MOZ&B5>h_w417ey+!1cXSjxU+g1_m2ViKG))phb%l9tf0`6 zEHu~fLK;HDo-@XKbH#eN%8{KFN(#`A#LSdew!F7y1fDv!UlU6XucM2*VoRmQ(l)o# zq5lBu)qPV|@hqC`9w^d*wn&?Z)MZHi=^Y0cuAAZ)hL6JOuRJgjHH#LEJ*ED@C0;rZ zD~`91UAoiZx{^8Vt(}jQvZgom=bHLFwxv8p3Ua0Jtu^Y1noyHW_~-r$VP)biW8og3 z;`?nsDQ~F5_QSj7R&o?RIuplJ(2?hG-|3j9OGOd6q{DvMPm`5wL- zS`jE%>_}r-BVCLO5Z~RaNo$z+ZNbkCyMgsRs(50B;xXGp%#D&{BOv;F4{BkW+{i-> z%bl`D1_AZrzbn3m_GD5hng+Hos;Uo|j(2*~THFhHCh~S6J0eg%ZNt{AD%;;H#cskE zQIZECNB4fUWi9^Dn~7hMcSMiCVmQr1or+Lw%@(O8yS2lBn{dD!7e189VTBKrju;{W zF!{kfaavZ|Kih5`-$=27yW<_Y;;U*_PaN^uq)QVAn_aT&wo00Eqy zl`@sx#-hyM?CWFzN*+Zc8&Qr&9qB_PfesbaACRfqcv zZkr>a%QiO(sjC9$?x&Uu;!L^=XvuX#j9? zPhu%9ar>qC?PJP`A|JfY8$2R^Z^$w!qm>Vtm2Uh(W4nsp2#UOK z^091=M@)LtM!zgFwocb0FUKaI7MZ4bqA@3wN65vFLY~A_{{UdJvw=^ZS@&g|90C3{ ze(4_h4Zf>+cXF!RL~?KeB|!EjogUeltQgFtKxnfjWEni1`U;-et>B2Dwr?!tnPtEX zJAf(k>rtf0)|XJlA_XCQyzN|f_o}k!8ucZ#hC^@`8>KQTa=>s8_|{|)D#_W1z>cy=Glq%9jE)j06ppTo0GnpI>@vJ?C&89LhB11sIh>k7X%UfMx7PRFct+o zq-=?I5J3mFJ!vACU5An-^79x7E;@`JbBd(Hax)l!869_Ht106ZAC|Ib_v)(S0SGzz z=8Le14ABSQ85_`?p9f_ zi5n3{!y$<3O+j$iQ{jYxamjTZM|yR=q<2{{66&Knw|(R3>?sVDq>#v95V2)l%m+|C zsaE9-iEha%`HO)e9A=p$VPj?LaqE`)eJag`+?syrBHZ$@C1rKxoBfb}=pCwEhF6;5 zRo)gx-xuEnu~FQOLFP{)R9Lo#BpjIzIt*0)Q^|0UL2S$Ak1>RY?=i?Lnhep#Pm>vf zHB5yd5~sPPa2qUsVj-F`C0+Mk58bcT~WX%I8agD1W`F{~p!8}bI zl3RS+cy%YIsUM9=9judp{(LyV7}|12x2+biSvh&`S+J+>gS5$y=~=gO$Yi^7C?!r0 z8DHV|s2WCS+3aBwJB_|!KPvm;wP60sP$ipkWcv2{cdD|BU$vO6B=a9|K3`6~sSd;t zSY2F69l28FhFATj^gh*M2;knifRu=zF$3VC^%W#)qd#YG%&nOf4=Ov+`HS2$J5e_D+SAUw`{je<|S2BQM4SX_s`{7lf}AX)5juXJ7o>P�@e zmPmZNNTmmE9VBdw)IVobM^srGjixMQoc{nS1Xq%1AemyjTyIPygy0IF%Roc35X5c9 z?kV%y#~Z!7#8k4VK48udsG|N`80L=AW>z49lHE=-PjPHV_Jk5nk*hO6fbH*-REuiU z$i7{ULu9*&OTknI^`=3h9I-;=%ZJhxe4mlpQ)%yw9OJQ?0s>Kw* zD>1;35<~Rk+LqS9#;Gnqc4E>rykrmMRhvMeXP>P#bb!611~pRW~zOfYk79f457i@01v|EmUu

b%;3P!(j`xc$%XAAf4FG}pJbh9#6tuaIPB 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

bF`i}KtIb)7jmg?d$EQ6V*AA*Hmz;S>op}bZg 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%0AYdPx)Yok{smml|&l(a#rseOR^^VCdlXLd{7VM$j zmx)JH^{xBFeWl3AJuo>nm46&azG+jF*dF!S7{a3EmZ_OZxazk%&xIeg4!hvX$gFi) z9icJ}`^hRt^slD=8-CDU5b=e&O<}1-M1v>`46A1Z9^aLGAF9o=G8wiL-yN%rZ;5^( z@J-QeA6b&#HKY-o9rv;XE~8-cfw5^yqpxT-v2Sc6y`rZVhuw)FU%T zaG7p4?(a^LD4Y`Uz)xP{{VuBYn~X8E$+6PBf@$2gd=mu9N_Xm9SwUo!|(Vg zw}$l-9NNaEZt?9ZP|1Ol{7Oet{&=s1#bp@mESi)ZyPrct5layp#h+h2vDn3%BRJxr zdqP5$Obp|b-n8pEn<6A)pJBy=ajQ01eZxH_g!AZUo>B2I%yQM`qc+)CK z>_=jMFM9L+ooCI3V+19eAt$3b&;K!%y?4 zk8o(;01Th**PD2^{tAoY8>1rW3h)*B=VnVZ1v=H zJ-Dwn@dw7=80&Eu=hrXTs*@ONmS*RnB%Xg7^{C`HseD#OF0>LqN_=rrA_l=8{{UL}qT^rHFQJ& zaZ$+1o0$nah8UhmHR#gFsl!=2nYzuM%kd}n$oR420L?D6=?k5qQL(W4o_RIq8n=%% z-DYF`qo};>$CZ_`GwWGUX}WZlfW&5L03?=^f_*6(%LFgd%-4kDBLTek@F75szGkCf+9{jvhU9|Hu!^iLg(g8F$&lN zHLIl_h+NH=VntWXuDMZ_kw;VLYUCx+fIGJq`L}le01BaO%BmJLWkPZly5#k#e9*k? zC$Zhr6`O}k6r^cKdcrn|TL6sh#z^-Dx(|l_HoEYBxo>tFOswIUqYyFlt~^}1ULR=W z62qE&H#6H@hlW4|U;xDAu{FzE2@0@rms42PacQIV1NJ}o{bR3M!vyz2;yDw`xP_12 z2Z9gbUo8Is!A1TA%kZn>)#k6FK$2-%yEWyR3$<5rg3HqblbjBjJwY^~O!JF*^uwOLYgedC!Y<`7|#RN^av3 z2a%$W%NSfK?tN<4hx|z$z*%CEokMM6I`RE0?kZu_wLG}bO%G?&wdYvXWqc6F3)3RD z^xbi#MUcz8s0Djsyt7N!qIiS5smE6HIBs|Xx=lA;W{)zGnK>-D$Kza1grhAsG?b#^ zcXR8e7?`55ESOyX01@wAG4Zp+vzvESal8^8n0&GQee1fv@fr(uk}I)~Cn3n=@UIT| zp|8)VHOBjr!0-SaeR3BkH)TBY0Qo0OBpSnmvQY=rk-U}6T}!d@Mi}Vv|!l{>Qjc* z)-^)7JC5dI%{^?;#zLzDxaWD~{XHu3*()~1iJx%eo}Seyw~geC#6w{G*gS)dm8z!6 zaxz2`C{g8{F(8sNimiOIz>fnXD=_)lx}U?fZd}@zmoO#+5HpXudz#GFQeoyhIrBf| zo3}5n-gK?h4#U*cR;dgs=9|#CQ*~XD^L>wn zbsbgB%vLPO=mAm+u&%elf3okyFB;CVTIo_ojxwdAIZ!&1Ywqt0e$Iagd?1$7YI-|K zcQ7%}=0*pW!W(+bNu-45g%aqY)XdQo#?ki2o*n{Y|Wjx*0u zTYBtzwc)k5{?QDPC_-iA0q8viW8K&bSBF`9XCTN^dHb#hUOfTtSUQua?>BQrWV9;F zCY=?u>U>rc72l)>dQ zCf&&R>U}@LpQu{gqe*Qrb)Clr2g-BnOk1gJr;AV2q;0_fMhBtoOz_x-OqFBUH8K8iuc|Fzy87TEVlQS6Gw~4 zCmZ9HPf>%K=XDJ#<4x3arKy@5qz(7CZ3K4qru~ae(O{NMLf7rG%NE;wov9P|IPQNM zCwhq|@_kB=x^jQEH|#~>FCSrz9#r1SMXPe zO}?>VG!iQq+7^h$>K8vFaqF7oBG&EhB4pgbqils^%IEpl-8%8L`W_OZ*|2WaWOcZ4 z8U!2Mb*9|k#UeYxq%sUf18{z|lG?Gu89w_Bzb-ypccqU|ZM&Jn1vzIc`c!*(u=Wx( zq?wBt;|(H}!}^{n(XezZP_qT&Y3b~0f?qIiDQC(YFmA^+J72{LH14d3qn12^YL!^B zT`445Yk4J2tC5aF0i07YBp}Hv#v=**YuD-TMXk(FE=0wdIglajdsE7W22mLSMpQRA zt&`Bjr*f6WyiFLo^4^C{?DzJ^- zH;teGxx)tP-%m;`g{kVFvsdjgvuXYi+oWsU)k{tO~;wnEKgrS`1Y=E z_EG)6ye08_NrvBExsKNI2*>(7&Ot5H5*Rf;=c%Kemu5^S$lMXZJCbg01Tx6 z0F8cCi@;W+E?SZ0k@Yd0TDo^f8>oB=iqd;cYvKO3VYs$Zs}#Jf(VT8ldV+92Dzjnn zR$mQF{ul9|h1pVBfm@O?0O`U09(`-F&@^37!wvRpsa8b@8W{qdW7@Q*w$pWZCVR~; z3zoQy4bK?MbNUL$>Z(z@+@&VAJlk2Y)jT<7-Y)nyTt_+FV7cX6oRU2_&O3Cg{u|XS z{we7v{u2KH5BazIe7!@>hs)pTk>~-&eXFR`^xJD&sVwXYv_tMF8$usIJu1$lrrcOU z%;gKpGOnwP)x!%IwBF-#Z61IB016kwPiQo&9d7Ey4&aRxt^2&5FnWr`)<0%eTbqmR zPsCE)+uOznkhdi9#(z5X2<1qSvrMi)=R6GhRUKiju25USbF?@)2b@<;Ixt#Ti@TnG z;g5uV9q^m~0Bh+GsQW|y_EqGPI#)q+6bo}aMTd~F24FeC{_cHy;-{GmJ7q$v4<1Tm z`1_xwSMdyAYPCy<4(~7K2NW!+M+T zPh1>yCbi}5y)7n?NnzCO>Ljs~m%e9oT2DO6sR% zkrTP2@RQ;`vEi>1+smcNC)m&*wFwyTz4#qTuep8?{8Ed>o)nJi_VyuZCIoUg%Of6u z0nL0Z;g5%U`a-uYZeg;TZH8N;v^w|4d=K;5zMEf(-v&M({4&zKJ@Eek#1UUTlegQi z?U)q0l!2TKovNf94}6|YaAL7FFxZH?O6SnznT<>6eY4TmBBgeXChm&b}D9(_a$CL2}=9y$)(kM@zj~ z((3vs;%O~`k24G^j+n<%dR1%vF3B|*H7^iLBxd|>h|9te(6)Z2u6U!u`YomM>5@w{ zvdD@prh@C`jAJE$>53HN8Kj=~{{Vy3%i2?n;-d9;zh7HwXIS1zHSA*bBnc4`c|8QZ zKm_`C$FQiiO=d}Nrm+#b*-iesI8Q6=eL(A01S{eH0JQ1~($5)SvBunxGqjb>KG#L? z-Sxcbaep?RblsAs&`Ft2cLGW0IP27MYga01^EIdS(B5;S7tYq7*F!*T(W8nKoWGk8 zlHDyx3`aqdcmRL(srSj@sWn)xFQmAR?&*QMvv}B~s-rmvpcolE{d-n+&kE|1%5;yl zMwe&^6EF@y#zDty@kOoXqo>O4sJu*s2<$|sC5OMKrC{mvYj=OSoHC*97c*@?xb8Gt z{{RhZS~QaCw$fbLUa^YaMq*wPo0NhHTFnfR6aOn$bbv73IY_`%{Tty<@TF&vwWg3w1FgU|00EVh>;k|On zcIwcVX(T&YBEf+>9(tPm!mO&&ovI_AP`-u#0EBw2*M@vdbvs7S+2JBvV7X?`83fl; zrE41ZiZx4(JHr}8i8`+EzGl#;%W|^UBQR+7nMAu0sGGCp&f%^K_MQ`y! z(?-*0x3<&bf(Z#}=0wD;)8+RA9V?Pja(aoTm67L~pM$UT?Mi(`^%EqGAu4W^^4#|9 zKb={y(PGqfYi%|wxUC_YMH1ghlA*i(2iJz2h)4?+N zC~eRYA`pLi2*(4{J%wgme$ko+iG6vY>KakJw0JB38788lncH@3Qhu(&N;~*{ME0AehKhjiM1O$KZ#cAw)WRM;dsG}NJrgSaClxb z)O~9YXGzK3T#MgRf%wI5@dsYHvY*46a|``QD0or6NYL|w-GCqGwR9c`Zx?C4A!s~7 z;plZeBF@k(<6#d3nCh>dI_L5|E77c_*X%wdY91fcbO<&3Tg3v**aQo1PbveF017e= zNX|V+8(t6i&*0DaMLa>^om=7L>2GHN`*yC8jj*vNB=O1PILOcCi=9qr@~sGN+Sum2 zL*f4b2WVPtrn}&O5;exsCc1#lmwcb~c)$z?L+es_$M(F`wZ9GOo)ghLAqCC!R=#w$ zklVAE?ZzV{9)*b~zZvPluOhRw@eSqMrIxl)omkrHHlT=RO~eL|Ju(MQ$B%mSPleta z@t4AXhZmkA(QRyA;%Qnqt){dy`RmC(VaRStCmH7%>@lCQrw@I-N2}2zg3^3Z<4Coo zvG5kDe`R}l8hLi9F_xn%EP(yqdSr@;=e3x}1XlM_EN)s! zcW374RQeA}oCz5cRh$_a$!3$4hz^90(-l?~#yz`Co>Wk}AQ_bj&e7?gU+}4!;mjAd zw+k$BH_g3HGmK}R-t;P5JW>%N42(R0ee8M;)Y;x9x%)ywK$QTSJg)<$J5grEpi1)@ zWb)H!C^t>z@T1UrR3RW_nmI!sIxwo}NI#WC_T(_SdDt6)Yt56b!sMxNbLxTX33UR1gUPP9*6$` zuThJc5;1XiIwvP|ZoEjj>J1Ss-<=Vf?M1RVbcs_L&#CWCMXf~G^EHGZB(gg!Y8W&x z!{-^~_o(7#wwZ;z(=c}2R#CjK=h~blg3>vMoM4`Dh=$F`8#(;X`$dy*iEsJJ6*FNnG}PDRy?n#N_5tjw-S_j9zyB^2*FYmaZN0n8SbTte5Kv8 zCHvg<`q2g3#ECw_C1xtfIm-6P^s7vrNDYVDS+C|}50En)LCGfv9ebYjVlTAGVdlN8 zzE?Y(sKl-4PhdM#R~ECvCAYh`*(p=BDZnK5{Ha=BJVqh71ItgE76;`6s5tMQ^;Z>z zlgaYgg9TlsS~X%BM;%Qyq(IC2<->fcROG40LVan->h}otvxR|(59X*Xw2nchM>pCc z@?w<{)yVTDPmzaiG5XU&WNnqVEoT$P>Q45QW}~{eSQXgCC}$W@2L%5BcnWmW+&=jv zof$&m;@OUAP!#!#7Xd)|{{W|@QUQX}JDYf-xRyw+OP%h$5OIP)sV$+nOJCnWKv_?h zH>n*@txkqjhDfbdQ+gH40L6XsY4+j-Wtgdy!nr^X@pLVUU{pw>$&b!mqC&;TQJ?eD zo=`UHg9hSPy0e?deV10?KzriZ+FP(sTT{phohdeV#H=nS$@fOq3DkFd8OI{KNRYv*|!?M{Nb*mOF^!VgbaYryV*9k~<_@b-5RLa_zb|$uWWa z^HE&R%B(If^AfIAM+ct5q>FSmUQ?uil3k3QR2pbku^T*U>ncfw-I6=xQG2(TVpUzr z9I#w66Xm(VA9aREKjBk(NOqt`Mq+W3#y-CF8~IU3=g%Ubf0U`}NbG43QW-Y}C2$Tp z;9w8&rHIJ{=`>^&3xz)Z^&>)2u{3O0kCf-P^`}OmRIE;@8|8L!oc{oY0wE}h#n7oZ z{p5WJ_dlgRM0AtqLc1_j5sdwD+N6;Asq)AhCu@9weh1cwBU6~CZM>Yg=Lgb&7?Bl+ z=20T=C9rT$`#kobLR^<15_n>xABHL68r^r9(a1P54xg85Ng3pJZylmn)9Fue!Mwy=jDVq!IUVXp6EIj7Ron?a zQ5fL&r=So+357hghj5XIW<36M)`~{T-~a}CbDFbn98B5V<|XDTjKO0&ixtU9 zHsB2R#Z|(@Z3+mBzuoG^Pw@R|$sBGh@23`s;L-qHhD0hrD z7Z?ghL*AH&Mr1`I5wt4)@PXEbc-2dt%Gm7L$E8QKkOoIzT$4{-icZ#0a1L|EeJBE1 zZ<(W87Evb$GGKh9^vyz&yhy+T2vfCBaw$ZTNTLqHmmt-C${6z(*af)5)cOkPk(=<1l*9x8EwD3 zag2}~ADQ%`DH1jfG8qX!^3Ack*!xp*>;pS|yS{V-sPv=+?*Pn;gTN!22Xe`g+CAvK z9PU2U;UXz9thr6!eDy)ztEmh^w4qeC9f`-~QmGE@^W}DoU{Eq)mR;cIcTx^Ml%hM4 zA#oa&F@v!OC`DHnD?a4=JC32T(66YeVz}~^S!55i=PWw=8UUFUSrp?TjuH29nwQL& z{L@5VY5+0E1GuX3xo6s{M{-EQf_*6r*@(6q3QriNVW(o$yAbWTSqx+Y!*h&rO*c{` zaxy;9Q|Dz)p8m$6R*Fe>qrNs}S3HyHO^B;Tq32vP5a*Hj5%^Uk7i98DaK&MP5k>;5!_q=q6b!-*W>_neQVBnCE_72(R30o5Dt4_dJrT+2Lb94^t4ROLE#q!(jj zh{-1Kk~fx|mFlF_(D_crGjFh{-b9QT6Vq`1qM?U;id`ED4o-Th9mQCCgtfO>iYjIE zyYC0%oO%jPHc}jH#m%_LEP_n9jQ*8o7=Upc(gYy*)>}jkrCA(ZUJhnSF`kzBl&vOiNIf^U>i)lwW3f;|7y12ZZ zgm!GPvBG(!awFrDk6I&|X<Rf=e#SUnB*q3u zZ^E6J3^p@7KWUCu1&>APpKjGCwQFg7xi-rpkCdt5PpPU)aeEklAQlWUCf~b{QA=q0 zxk9#frtzL5rMY#RqI8^AT+LLw*T%&Jb(#Pb-D{Qw@`>7l5x!~l{3{n79 z?S$C`ZB^tCTD3DxZv@S61{u&P80Q(zX_po(K#JHp1{rxveeOSp=xDviV1hYeh_%Iw z?JI}#2P^^O6-326?qQX-iAe>I@OxGGG!|UkjZ#(ekT6*Z$v%Rr{edjt5nGcXRwbk@ zlFWaHniB?@ojZrRPq9q-P6@GFfuv8>z^;z zk5f&Rq_GPd0Fk%M1E(Y(tv+j#5y3Eo6B$)g$tMJ6p=(4-wDM%$(#X5{;S?O7#;uli zok)ytz$P*}jCB;rrM4FBCDg(_tWM=$xGB?{gw(q+*)?P7--W+r)jSa#bE=360=EUZ z1o|58tToRJM`a$Ds%j|z05J;@QI+gY?!Se2@4$=b^-qV8+uPj9EI}7(2Oy9zc&}9O z--Y1SG|4W4tK35n@{nV3$>$#R{Ur#~#^n^M^FMki{s{S4PubU$Udh_$seBdqtsjMT z2eh>bb7%+_@JOF4566sG&>s%wi`d98=as^s!VU^8De{3Y<7fpj0k z-X?i1FJvG=a_!7()MFh_@~>9V{tft&+r+CbwJeu9RMzSup4pC1pkdm+TC5c++^O99 z3?$_`UiQb)p8`BP;7wD+cRJt19bQ#SIJT*`n1zs&$81-vd_2{EXb*)N)ISlt4P#^C zUk@XBPo_mGtd}u*6)Ff}$IZ=n4x6ND{vXg{(kv|{cuED7iGE{VweXX|`hJTpop0km zh}Sv{cM_y9TulD}C`Lc)4toz%f%@0GPL3}dg>a_%V3)mhfA}XYSyQD_?^gCZ&)O^F z*X-5te(y!q{5|m7Sn%e#<(1S-_DqVW?wI85ob#M^UU@j>ej?fUM@55AgTh+EUCAU1 zBSjJ7GJ1k*(Ed070Kq@LEc`d{!1%xL_r~@fG0~ZP+kh^Wrt;4v#{fSZ;c|YxYsPK# z%e(aw+*`>C4g+n#HS|0oTLo7K8dxgMT#erU0Il`(7A0M$C1c2c;Gvpam;V5=cZu)Q zOp@f;TMLsEaRwhFE9X72w>j;M_OHgzHe9&+ zW+vOQe(xVjf_SHq$Co-e$vD~GzZkMT4Ti}LsztOrNaH7B9B=do+Lqc#rrxGL^qh<>s1=EEK?@=T% z6p`hXk5L+{5G29=RU^f6Kt`Q6Gv^y{t^UnQkTOq;fKVwiGi~{kj+}ogYBwl~J;@@) z8sW<3IHcz}_NZjFo&)B-<=lUJ9BYyF_N&Ir?H1m27b@?wcb=f+kM4?#?32wBMFGT& z{70Ta{{U;+tC5VPNQqfOfP`dYl7AY7O10v@M%cqz1##i#!hm5sP=EL8Ij6c_h(RsLZq_nPH=twsl_Hk{)-0nWG8WKZf{O% zb+EOxjx~k}V^JyGPb}H(^c5+(v5po=esH{#oDgYP3JV;p7~ER4Ag?PS+zmiOD9^AI_zjd3b z_NvUNW@m?TtF948UERs{rD&zN23R9Iqd5*6fDiMg#Hzr$OSu%0APdm3Q42$*-J#cC`Dp%oC=nS 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%0AmB1_01c=J_+!4y>j{< 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

( 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

tvX)G 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�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%0ALtgk^>RAY7$O@-!bLv+k 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

XA)@AkIT%AD9t^+D8~Q!M2|pLnKZJ3~`?0 z@u-(ef+M{rJ8|=?bSKx^u*Fb@DiK`ri;R;_Evwt3w&~wzp#8MDwERVtE(;kfpk;>` zCmm~A!omfz5=oUVK2$w(>r`TpBx2Ycj@;8(sdOEhGSwfWOYO zmRl;;yRpvwn|dCVboy7CWfQK}JfA`DTgsZexi#Z| z5o6Y^K{{TY8!NUXGJgQ~uS3=TCEHoSCH!-N6eH#`a(0N(??A63tgtIa{c_(Xf zeXAnhQPS>jLwSB;qh|`;{VQ%AcExNBxwk7MZFHi!ZQ`ptI|iOR(AaOC4^iz4~%ik85 zo@k7K$K{L_?0=@Tmk;I)lsU%H-mYEhQfV?Q8r{|urdfwlwU_$UQdI7l zqRA<#Y;@PYG1APd=7v>_d5rF)hCbDW;=dMH>M^0VzzoA<=b^4~d~<80PA%`Pjm@mG z;h(%}e~5bHxU6k=#4_LNazUZn`N$LZC5F`9{VV42{7op(cXw>`Xl1nFG918PYLhHna!cAWE*4+7)JZJ z{Js#`}VpBw=uLI@`q&!D9L0ED7Q)!fb(e=X<@d9lt_nwz<+!8LA$$$UGjYLYaP zYb^_@4Y@cULrHh`39Q>s)UKhFqhaJu2|o2f_4%yqn(Hh>L;4 z`Fj2}rs&rCb&9-XovW1t zA2G*qUpYK2S>k_)?9SeAb5vqNWRaW9Sz>k@c;_GDYi7$&)1!mTy}3|SeZkeK@@Y1@ zm9V%(F|-Z1^ViUQeX51%5X!NxAB9*x>gbYs7I^(rPXXjhY(IS};{{XBf zlDYJ#ubr*n-wc`g&&qq(U)Ez92{o{-cYBv@t)bO!-WH4%C=N?wZ>?oKQCm*fpXF8| zNjU&|Q!h1!T|CPRe()T&?i=VUBkhx4BP`0{uyDEQp7rG8GYU54wxe1zdJBk^ij%fX zal57}hNXQHLQ6921cyBdKHh?Gi(RkJ4w%zIR}x{UBm=0J9V_lX~^EV^QefQ*OW9jHCKRQ9$+OtD27mBIrc zLBJoC;eGGtxsuVi6bhx+SzfAgWjLFy3yFb zXCj`DXL+eGY2rU1%ewn@t6GnTwA;o}Z*CNp3|MvP$*pZCPL;P!Ya*yWDPHU|SFNo~ zQZn3IfOsLtrAv~M)U`=1&Td^XVo;_s<8MUttytdP9W`Wt~36j(8tqFD8`=E`CDl12 zXxSu)DT~U^J!*qP6_n=G+>b1;&A9T1)9Fyf;zxpU1+?U;ZW#w7)~U$XnwFqVlv2wy zjkTFq3)vd5!Qn-{N%dLE+vRfaE(0G=r87}F9GZg93%en3WGdVP*i{?* zI4$mttjKN-!RI3%lpjj1DqFq6#PX^!AL_$$KMzXbo+Z5y?#VB;2xE7G%H`8C9A}j$ z(yK!0ZFRHFUooHW$J0O3oQl!Luq=DnIl&!I=SX67l?tXD9{dBJTIF+X-HEHK78^~H z{@~0}Zex!OrbG7+am`9Cl zlT=0J?aap3)Vimc`?hYQo=$x#+&&f5F5?##le(_r2y>8IzC9~BNiL#Iy@(rCg-Chi zU5}By4*>d9t%(s@I9Z1~%P%?XN3|gE{*U3I=4$t7U&}a&k1S8GY}SlEEYY$7cEz0DRwUM23s9cXNT0ffMcKLmFU~!sD-wXJJFi)|ZChytEl03F_=lU|Rc zcuvyV$?q1*IpdCBytvMLRZUaG+7^#`kEmY2>`;kBr{!N^=~=4ITNmt7SCcCEUdK^= zIj!$ye=X1NeD*j54&UKhRvM>=bhs8f+=phyG4hX2dsYvNJ|yUCq^_5t-TkKF5VSA^ z`^-i{mIJ>`*EY7^Kk+r12|PS3;J*1DNna}w9dHL+{uP^YZtT%YG14mMpxWs=1yPcc}2<&W`u^ZC*rfI44;5*=?_@yFYl!b>_^ zO!#FWA1sXaBc*jZ_lNC%9O-tq7nZQg1^h_yq$`$HZkhM@tesf*xvUi0)mY8&?whV% zO3>=IZ*dYnEoN_(8OJ;x-;HbPCMhf&Ev(SHADY#ikc|4ihT43!z+bI%$=%(ZP;M!tWNID-@ou*ezwuv*-1x;RscxZPXA<44sZ9u~e2YF)p3G=DbFa68nx?Xtn8 zm?XA08C)PkwC+90$4Zjc_8ZGderY`S17XL?Kl=39bqRF%)$M^-cE;(KaK~~hDN0Xv zXp&nHKZB803;Qz@GkmO#kli|BlG5sHB>OParDl=JPZBnEs2RyUx>fkKZxK&;rt%n_ z7v_!9FaS8~P+g<~C7S;5TZ@u>#si_O+?(8OE`x2Pn)!ZY^41<=hjApY$xvqo$5REZy?jCzmzD>9RWpZ9e_5T1pXwQwurc13nEG(fKT=N@u3=dCZ^{#Wp9~P3-sLA zsVjG8 z%NcUtTG6riac!xVhf>qsWJUtvBsjqz!hI`6I#5<-Je8`uqXE2Ni+dTiNiIstv6&)L zRxyvfdsd#M;yrUziIKFWQ4tI#L<-NwI6a58bQb;+(KNfSvgvO2&mv)xMGQYYRq6Ce zw4k=KNfhk3cVtd5M;H|nuTP>ig$k>7b2|0@tK!`;G#z3$vk^uGypXxxMg~rOYD*6S z&*3`~wtA?$l~fg)1uj*67_b>*{cF31$}M78ppw=LeW{;0lqhr4iq4Nj@m7~}befgE z*m0fkuMD}YRwZq*qr*Gh>SO5M7rpUBEYoU=o_p<mIH9P zEgUiv^N+`|tNL`)#R{eLZD|{G8?s|Q$JV9$O}v_i_J*;pM8R>0A#Az<$Kl0eI<+M& zHaCqbaax9_sLOF0!KUbNz_!P6jG)S#cdGvY+t>HksP@*OWk^6}G3|^WsPA0fyYV`0 zHLjrW=A8F3NQG7zQ!K!qK5msImA13vy$Z(KSsK#l&9dqUn<|aiJNSu(_>6IRpx;!gln*FwoZ(^}R&CIecS~2JV>c^nz)}gu-^u5ZD zwwA3}vuGrJW$tWNXd;sjYL0nN$Gvqn7bfpYxYHwrWSRc+5z3C_*DZ5vZ*By$tkIa{ z!z{93t~kdPtv86I8c4R63n3+AbWjVZ?AYXi>s)iQcSlrOO3Y14+}db&mts*cwnAl? zJ~8M8aQAw@jWv4)lf$}usxQj7Qk*Z>BfWK}T(i5=(@nZ$@`zw$BL)3N2WmAfcEZ<2 zRr@lm0O2E#p&iXsUnvqweNJP;zYhFI;u6>1EV*M~7i7}91>Cvmk@vBl^&?QS%w;@b?P%!9MD+kN9amI1Mu7gj~Y%T4TEuv?2 zL%$E41NHAwyPX;bwwq3dGOEHkok3{)kd4_L$4m??MuS8l1VhuYLnc^ zjxfQ#PEJW9*0nWTtp?U8bm%mdmhwz)mNWr*9+=}5$oOl-zAL$o?#9DMMEiQ?DJ~x> zgz^B#IIfc7H_#!9&s5iv_IKJu%O2gYj+pE?tr}}XB`C>UsjvJm@s!q5>blOAZq{B& zSd4!tnQ{95HA70$v>iLcBT8Fuv$RnbwngQ4WN>RkRM++25naBIsrZU$tY84VU>p*A zE;BigVclet?Q zu_viC+ucJ^@$++Ntw3-BVqSR`t_|^wv6U& zG*#Ah-w^70gx)IAygLS^f2dx(m!-<0G>l1*?E?XcB=9<#gT;Oe)9&rJU)yqtJ1ZeQRsO@@Y{=BqrIF(sFaV0LV@cPJ*A~ZwTs|1^vWP&-S>2tlo0u z?@}}J{{V;QO-UwCDk%6D{t#(yPKugYgUL)Z?D#BCf788BHMPfwu4lTACyYxOP5I96 zLIsvk@f?pRm_K1RGEO}XCZh#It3MA1{>}pwf zf5qMv)UEtQZ>!j>_b>*xxeg^TF$Xzb%mEz#03s`Az*Zj$JY(V=THoT;z21)#LFc93 zlDlJhfWQC%#0ET&tBju6HO)S^;Yef?%63Ntg=N^}H_O+K^+F#R>UVxFdAucIaeEb{ zDNYxdt$(C8o*s6K5y(!?xZFoVc>YxF6XB1D{As8g zD@&_alH>uhjUsc912+uZ4`Z+{c{T(BX4IQ(-~JOSYazMgTby2&h3 z{G_Mc$@{n+=}A)Mx)gn{HJN)yzOnIHIxVh&C)?6((cDESK{50z-?u;HY-o>j;B9?1 zTdR26<=G@NeA`&{M)dqEq0#&&;fq@(MzR*ymd?apD|OGcW$LY^X?mPH%w|dW-6LgK z`{#jJbEfn+aB*6fbV&6FvAeppnC!gFawgyPv4fBgV}g3uH>lg{8a1TQ{jpNPrvg~5 z-wtK!6_2NUcluS`Ht)r^bAzNtsSljXvHFAQj^ePd^zCZ%#p6i5(58=25N?>2+Y_iH zt_kXToOb+Zg1fO3m9;0Z*X$b5*jd_boH=I_INGb+k9xP^%}i?XTwhtVcFS(WEOJN- z%tu!P(0kTpwZ6%o<~v=JvTZ9bs66pmcA6fdlQyStq&wwAu$&+n=tXJE7L2{5lQd?t zy751X?LV~j8<@1YC);^*W|?9DJf?U*FaUwhG6oMK--)zH{5z$MHrHC3=gDG3!Xh^z zKQ4QNis)zfpW@v|Nw%?lI?5xYz!xZ>$iNIKC$<3X{VIPHiM6c`)5ZJYc&;NJYe1ZE zIr{q6Zc@2cOy#~G-KCF-wBHqY)4}bl=+WE}Erf5dFd&V@^*AIPcgLu%x5U~{f?odT zUhurLTSs>4TETKmYmPZRa6Nk0FKw%oku7ag%#q~4P;kHfYS;UH{P!~HcdW5XBx7zP z8?opQLyS~O>vH2A4rf%fhD*k}duAoRRdCoKj`dqvmRsv4hT`2+pumYv-!qJDBy`WO zYU-Q8I^>p3dp4Op$`iHVvO@0}!TZE?&JX2Ov`srf(r;tA)TS#DZOI&`b13)ETCZsv z2eXrBV%{R~NBkqOO=IElWNhtH87)W$aUf;K9CMn$)7CHTR=JB;dru|9+e*KCf48^R zjZP@q^L)}PiP(8;4g-vJ#WrbQ%o4+GzF-E>7j{7QtQoq|Sl+s}*7aQ?T~_Whb0Czn z6u`>*;ip5V>Xyc)TE)Jh^+GWzD?{yX-80y4lueD#Y(KNViplwob zGIJX%*oGh{zI|!dc2h}srs7CcB&KLEKyALHp4GXk$>4bW7bl4t`Miwj!t+g zdk);yIb2Ct$I~P5<<^wiWy4J@(dA)a{SWYi-2VVt$kZ%jip6a84MsQ;DGNrvW*_Q( zt1m?H9=mz2MR%lVj~lxXvCh9P2d*n;!~XyU+r;{<--tda{kq&t1d#1JA>j2)bsc#1 z{3@-}_w>0LUYi0|{15p#K1S z=~ZRbd^7&B-SF$FrdwkH# zaeXSsZLzrro(5ZJ=NQI$>rC;_?CtTxK=9oDC)GSVZ!U*vHv60VYpCQ*vjqbR#em$( zIu5z%&2ip2_3ZZtj{Uw~a_^KooHPy>XvoRlGOxr{X4qJ?F!J5ctyem)31^%>~ZVcHl7}V4m1H0QMEFDicqd=RI1xCAoXS9~Z5>H*>9cVjl$C-6p4C zvFa1B0NU)|wc`MA#J@S}0O`$g5qQGiOu4q!A5FNpvA4J%YPMhXo>qB%zr;c9{dlg& z#_!?HJ4EPlq1cTze1rN)D$Ri6xAvcqD_&FB@UT*D9*rb6+sp_;~5p z&1-LNw{HXP2N)6)>z;#(_WdK{j*n;X-VGb!ufzM@15lFDWAR(qU(F?r>!`<{<+Jr9 zvD>!@bA#OTVlQN=jw(*>MUMe^FG{)b_3n|N>k`~SVQ}`EkJ<)W;v`~>r8}ID!yFo| z@gX$}En85~{4wFBo(p-zF)5F6EsvNg^#ly{^fkfwYh3Xsg(Uv~gxgFqM{V#@YbL3)BY8XoAEc{ABnXX{6g?&#u|3I@R2m^tBI|)6M)WG6v@ar z!sDK4N~9#6u4yYCMey%Vm&INuxYzZaOr2Z9*Y=8UqiEJ+wC+zb(n z*V&#F@t49qGgI*fyQqH5nsxM=yf&vulTOo8XzgSX>?pC4M0^AzYUGmHJ*(p%7U-Iu zu-c!BwI2^lDm1D6rFRr0MH4w}Bd{1<+glmxMSAzZ{{Y$#S@?af>5_PDXV!GxJ`|Q+ z0!c(c+~l))q#u|z56zH5<0J15d_)~@dM1#H`$uEre}~%Mi}5c-_EDy~2YagpyB}*dfk0U}q#(j{Hl~d~xu<#(Kqv#Jzgv9~3+y+8euVN=aUH3O0@T z`IH3&X9xAKp}s$OE5V*S_$U7W3nu7zgGKnLmz%s-p=*$=HrDOtzQJy+rN}V(Y#CgF zU5MyF`Ab{YwY@J}xz@ESqHnEY-8IeeGGGn@?QG+L{b|sPs~hwyp2yVx00F;he}|qw z)bu;w+CRh7*=t@A(wg%_)|Mx?I=CC7aJxvym%un;A353vRC(u&d^czNMf`S1wM|0w zXw&(($*9_ZOQWoXB^$n8W!aE<3K$F?o=vQH^T!&`gY9(vLekpfLYiilDNHI16P4J= z7!Aq_lhcEf>0fSs%wHY82Cu}A4rm`5yb1pR2)~5&JteJm-A}`|(8`EXDIVTULw=H(QyWeg1qz|n#tt#a#{#;IJN6&(ckL3|=foe1e-d<;xQ;jpvC=t@ zJAU%Yag`V+8+&6sbI_{7F^uH5Uo$s(Cu7Av5PVV9J|5eRXIMTY)9i0y7UNik&Q-I& zjy7_j$jT#?kgS_|ByDUF&3y~-llIp5iSW0?1H?Di!^O5YdS}_KWY;a-ZyF-ZVv%Jz zGMLzqpyU-SHx3Bd@ki|0_H75jAF_|d4~g0c(DfLuE;Nl+&h5X^SeJAX%lCJ*o1XQ{4AwG^6m z-$FT~cAC)Rbl(|%#@`q8ooiC@{r3_@`1~I_u!w z+rbGNSdaq{y)l!VjybDZUxL4AEn~sjZ^V5+!?Wm`9pW21N0U$yOQ|G-ZW0wcoHGtL z1>=#Bb6YBMjit?FRN-ZzABFW_9_SwsyfyIyMzPeaZM2KjYpqj8Nnu4sR)`mwFtLUt zsb*oEk)BAeq5lBjq23z!HQ>!#N!4vNA+73K+M_kS@`0#mHyd{y<{}lrD%m_C85v_# zb=Cc<{{Uw1*}^Z2{ss7PrRg3WyD{k=EU?yONhf*aNpTF;$LEJJt2#)eBMDPGg8)4H z!*{<2zC3(5(S93gb{fZrJVSf0t)0%bsfgvZxf8jKFjh_#GY}(ca5w~-&)K@ay_ViY z&Z6eDdLDuB_eAig#?RUtN%+a({{Vs-PKlvIqWL#I5b!!iEp5bqT2lhuF<`BWfC6v!u!m=7V!^XSUR*0hT+vS7Y)lo1NGx#^6f>fX5TzXTg7n8u#q>`c3wo z_74r{+SDh-*V1^6Wq~f{a=PlWt8<6n>71OEVo zli+=ZpKarh2>$?Y!D!Z6bSiD5znG)K?%RlsWG}Z8kgmw#Nim#m_yhK+_@UvEd;2&1 zYVbmRhf&vU+Un9^u)dV*I&X+MVyHJJO5l!I4tPGf{{RH;_>Ft;OXCNMwQmOa0uLJ6 z_@eRjD;+A{^KHy=MJ2@WT!ooQK(QPbVhV{Eb@^+5#((fniystfm)F|2#UW|&3s=9E zOD_ssTc?sDmD!@(atTtvaCdcJM?4Zs6HQccs|!ZUV|Y`PWn_i@qrNd~-xGEJ01SL8 z@SlqOW8jAL6f*{sex`pS6GN_uvMzNmMdP78oqS*tYG;!OFG)Cb~Nh+XuitBe%Tp7sS65>be!F zo-6+V1ln276|J>-WtHTD-YFQMGD|FHZwk%H#xNuOr~Uz7*0m zn;-2fPY}9KJ;W;{doe6II|0I#B%P!XMgoqj#@;*qkUwS(Yg733@bgg7d~bbh z7U=JD;r&w5`F3a*at7a&j!X}kkg09Vp>cvibKyP#_^aW+A9#~h@n6QD5b5{&XNmOU z68`$}(XAs%Tm2EE+yu#nz>o}rnPJG=+x#4l!QKV`0EC}O_+{Xfm%}>ra6{p*6c+z~%Qn2p;v|b?iji-DM@tg>{#F{7kO@HAT z)>6qOhBa5k;5$+>iczwDQ;e?D@~^Aw-WUCx{0pdQ8b5?QTYcioy-Lo?CmN$)^ z(c>HAm=7(!a7a5;dY8c85d1y(GpP9g0O0nweXQ%YI%kL_zqD;K+?KQQ!MX zKu1;~OQd)?$gX;oUq`FD`GnyaY1sN7;>W`KZw34h7dl3nW#b(t(s-rT?`33~<4@Vc zh!bz_l~kxWJAf=m!8PGNDEOEE00@VO7vhb-g4@EDml~a=t>x{53)rphA|zW~qbesw zAW0cg-zGME(YcCa$tLPo@m0aNBE1(lp3 z`2yF=()fM}{swr0_f7bkl4}}O^zry-!f57M^=rn+^U^UOFzqrCorIq$z+t!n!%kA1 zVyCA60Py3bPIT$FEl+FkzsG+Tc*nZh zbym(WqkEpAOpy4$#l8^zp}r#C$MM_Y(n)op*&wmi{5f$H*7ierB_(e#d8+tUQ<7Df z{GjI?ufhKS+ArcZso|Rsh~F2yA8<8q1lyf1FBEt-#wNJZ$&91gYF1M)Sl6Z;DFA{n zubg$BB=Aap&^{VnYQw@7dM}Eu?qe}r$$N37!>&NBiJ1&UB$6XxTLrKj{nNKGc~hO6 z(SBd3B?YTqo=5UaB-Z0GM{tIC&^Tb+Wc1_uQnODLvoc%9y$d-JsK(>`v(}v2bKZ}# z7!LGZ%2j#COwvbhZv;ikIDeQlOnE0idmS-fyfl1f<1OHt`LMQoHZJRjX)vKlzy}@k z%_I=a*6yBC+$)v^3gaC09@I#PV~{&>w=4qkeT5N0ceyuN$pnc10KG@+v$6K2VUe<| zb04!vva0~HY&j@LZhCg5SY(DKy0?rm4Y`i)ap+H_IEi9~=F;q(NRC+~ZbJ^|2e-XR zEwp#0OM588o0QwRe(Sez2VvHRhhd&rS(4k$jS?~>o-%Umxb5_$Sl-@2EclK$ljcG9 zU3uhs6G{X(7VEJ~%glaaj5Y@t&$l#^8)*rO2}C8p3bzfM;Bt8SQ&t^_?xTtV^Vn*C zzHx`Ql#*3PL+MSpxRO)m%89dJ4ACeEPC4SEyak{aGR6pVv;-%ddKz?5c~dpHgzZSf zyl&a*IRoCEv>2u$vB+m_uYs}l@_jK&I?l|AaTtn4KRU#?1bhDgI);0h79b&jwn1mh zWT>VWX-gy!i4=fYk+=e#fOP&~GRh$eLH*bt!S9Mk4;=eZlrcctr5Oj)!*o(-%T@cp590bz1VzkEzBf`3h6M089;4c;D4sb4aG~;i#wA^{ zMth35wlZ9UB3qe)ug(Y<1J~Y%wTb3l142L6GaMHf>^llUWjw$X{*qhP)ct*qa&KHbe9s`s@qItnLsX^amG7UAhm=NNU=D! zxB=9VRmMOx_=}x5`S9SQGc>9&2=^5PQ%uguYhdmdhD89MbMMVs%t{PmVdnn;%S(Q{ zl=t?lT8M_}8U#jmDxZ9|I)XUno=`iXjI3zD+5kl0s{oMM&oW7H!)!=^BQd~!dQ=G< zk_NZ9j|_g}E8q{Wy-g%fZ0Qt4Ow*II`>}(`!1bhaZ*v+v4g_pUyDueJdehKkbHgmJ z_N5+KMGG<$l2@@Gr67pF&*q(upcg`U!Rb+?5Xl+3GA`^Da#-U7+NOzZ*-G0vWWX|( zY@GJT_)|zkfTVFw5rH01JGsjOdQ|fHlKqjcHUb!|ii785#}!#tY1!Bnlg*D|RZe*9 z4Ox!bF#|Lx?ec{_WAdl4`c{z`&Hhw|NQ#MY0}^wA*nLGTR}eoKBlbN*~Wq6R0a#4sS)FWez^{tY! z9g4RIA#X0`7AMTwp$-@yPo-V8hY>OIS=v9ktM|8lH58KrDy8(ON`bI#!NKfm#f!PQ zjU|1EB-*kbPu8@8)TpgVwE&T#=Fq_!ft7R6o~P?o+6nx&d7uc&-@8D0Z$MAITer7% z23b+VIc@7W%BUUcSB}|Wf>)J{sWw@U3hGCvxAd)&xu*M>&i2m`j(bL#8bXsr6q{L3 z)}weyA7^2oDN7`M9leR}D%_uEA>@k<8p(!Yz=kb;xeziec&fK410lEG232Tz`9e(zA-LVSVkCR{kltW3~HDKUJ?Ny>nIed;R>M#lQyVHg3y%N_aNy#^^;YsO$PO3}*LcSh;# zeXFe`(M9Vh($-Nr#pbBxus?{`N8v@0rzs$81{rhE`&TD#coOqzNAkupibgZ*n(8!b zxa^%8TcupbgAY>P;=OFCsN$mEMtM1n`A>KFQF8wPX*RRQE1DWSuIDKGPYcwf8}0ZWS~hUthQ`AutzX?BM75^%Bv#ej%g;oS%1*d z*`jFw0M#zGsZOI$>3K$Guj8s~p<|M4=7G%E0h_jWc^R;&}iwWPRW;2s96Qf!@20&Qt@#W~H#X9Klebx{u2_B*y0i4_bl;xePps77}ywGUssgsV9(0 zyh`E87<`_C(xIQ_Wm6kB&4o%$TpJM>Iv*N1M-?oOh_mE2 z5y>*K>Ftj6%b3J2gh*e_8IWUuF~w&%f|DCzI>%x~%#pNbal$Vk*9Y-H+1*F>c$CIu z9F=cRTJ3J5xOfZ^N;1csE-*c7nfQaH{hLMt&@6=f%vf``y?I%LCn`^r+MJ@dJiJ8l ziQabFTm{^ufQk?EHNWuU{KMiHF3}3aq+!@{$BO4?ySJWKjwuVMd>@;&ZTM#BG%)X7 zimWzn10>g}z<8HOKc`mz01Hp?JY42H*e4$6(smvqiS3o-l(--Tje3!f(y3nS=`oto zcB-(%irrND=e2X12BjNms?5x+6cu6A(rQ;SN*XfXHa_tkMSp!!#=@=+H5Tn3jXEt= zYpIpuo7fGsk*(`Uf%X8zB9U{vgWkU@;w(eNPNMR$^mJ&rVYJ^ydyF@eEM_%wJlP0hi|Nxf zz3|sm7M?4L3z%|`obBUp(08tR+Uv{vTmcAh1G29QPh1bJU(qL%OxG8492d2S`h3Jip=%lHcX^A{HyvR-GogKg1?cMi}fSU6HxFvnBZ z@u=j5o#klcQ5vW2R1BTtuQe*|WW>M@bLIn#dQ!>&TstVi%y{l=i$r$X@bW3n{y0CnP1FD*yc%ycIHbwxhPS)q}rU}+X#B7=55LfQ|{b}0adl6X1VRW}D zUpYI7&H?uJt2Vaw-fPWqBTMCju_HVw^)#m5TXe&W5}?A&Ij4yh-)U&U1Rszb5`V&l z5jhQqOk)#Fu@?!JZN8rL=klagjnD$0Go1SL6(ix*giW+<8Ad!GZYno*C72R$Fu*TL zv`G}(gl-Fb#2f?P+N0SUKEs2M11j|&;ZrKhB*_XN-WI~XI0B)OWYgqZHihGn$ynke z=4^Fip5ErEE0QDZjZKocD(nDGz$KONYY+Zh%ybt!e@|D$nwx z?#RKY<1a91njA)hr+4)<)yZg%SV%4*LfHf4^)$k`XZZ@dU_U;UG=Uuqj~n3zPdGlG zjYi6q(ev{SVXNl+mbfzA$q-1dQHx1DmssQ{}lr}^}%y@|49zF#E_XDGR12g{DY`_f%XVMB7(#hE}X zk&p-;qN?2ZvrE%$e9NhlO`R1F&G>rPC$Ica(rqD`3bz)euj8+#i@C2i8HLq<8Wn@<$rwoRQ@E<;Jk&d4jXvL zE8O<4oPHF1UW|R4Op-?-K-%iVYL8E?d&hmYR%Ps^aIQ#Vxl!7?FB0hX_fWj*R0SC$JfEd;I+CTN!Y7a* zkl`8qE25QeX$^M{RGrTW{jT(@Yu^T4&2tQRk|T`datB)ctMRpj_MRh_3#rLvxM>yR z8$ii875eAi0o|fNtQIo6k2xOSjeb*nZ`0(q@odQ(g)1?60}OQIBig(0Z6xox z&r%JXoQ!|GHxrD1T8c$>a}iVmPBw+m~9 ze@geT@^?ubQ;oGWbZdvVlh05DVOnzmDN}!`7dT?_?48(m#-5HJ`~0~ zde)|kAZ1ikWsD8kX6aRRizR_W#kq>yX@Fw6RBkeTsgPp<-GhfXD7-SVJ8@37pcAS?}z!ZWd#v=I(91_PMejc=3q!X%c-j5sMg30%|^r}kiItv(u zyAG~|<*i@|?X|<(RKQ})%IqVHMLcc7G z31Q10>084OZILcTWQiCn8B4BC@~0T~G<}_z89)rk+noncy#-iUaOE}~$CeA}>r%&V zCR1>X3YFya$o~Ke-WV#A*%IessD?)X!8)KX^8%emtt2+LGEX6$q?Di^Gq!$Sfb-U^ zt*4mA?qwux5ypyeGwW6%)0Q;-;+Bzs-_HPhS7i*QtywR3LpfKBdX(j}D6O*Pa94~D zR;)#BD#pWRLJX)UCpBqdB4lJx$__Sd<-Z?FLYQ!TwhG6PqosPV$|=WWV(|^3j|!JS z=yn{C%hY=sjqRJuOzjLDk`HlK;euCC@qloCeAMY^#5N-XjI$Bb>0MFDT}?SmC5ut& zWv-cUw+%DO%9}>mvB3KJnzIaY$a#eAU%YXgdR3tUtOd5YKr^|s(vT#wf~vqfcLM;9 z+*d?0CCsA)?qu<;E4D!#VbpFQ4aadks${pf5`4HD@s{7(odAhEl06l+p4d7|zlMIp>;4ZSSPoi5@^~ zxyNHxMvrkEPdP(|1Dsc}gyCF9CKptmh7~c&F5Ja-S4RR)ynLYG4|)lF9jbcdWYxVh z!rJD&GF#Z#ODk^4DyN@8(z@L@;75(_j5A$n(!w1c7&!STe)|L7r?}N3cV~`W%*QgXOnX*!!G+^+l5LZ&Gn(&#dR&U;g!KGxGUKAroG8A?ME5MLVDE)w7ZD}O&Mb&0DtM9)||E%4Ip_@&d>)V z3M=C3aZV0}M@~;u+=f|NaZ-xVnmtZ?8>p^UV-$%XC{erSzMS}H@vB6*@T^w)j-o}v zMS}9SFmdX7*UdlJ_E#Gr)FC@_#G8-Gaomc~((z=H8&YN1LByYQ`;Tht$vj(*Lpi}m zniB8ac&-(eVNNbi%^v-%{?Jx1CjBmQ;n(DlkGt>hT!z2#%Uah-ic97@6t-8tYV&Dt zF0W)J;Q;w@g*+~M3P>fnw}IlAq>^peBnk#rmSN+TZ(4Vu9#mZ}3BbC1wKX-hFA>~p zmk%pyjWJQU#UbE*J!>_u7T6hFvjT7!e+@*EZI3ZTRA&GjesvtsG=-G5_2X(N{LOxM zn{oDQnM<9?^FK4)!ekgMB2kQ0k!W7Xp`u9C##bd<)~mI=*TsDO+mx09KC4P#k)&TO zwrv9{dy26XYP$+KMrJ$MkGd=4>f`a4hk3~MVM3KP?x2Mv5bt?1M?eQ(tw`{rOxF{t zyDE*ScV99KPI%lOs(8VSknLqZ#ZcA8HKX105#NKJ^&~cKWFggZ zahUoMPlhOp>~`Ch_09!KVBCzX7D9MCdx}X2t|4VCc9n8419VDRBZ@^>?VRH|BdKQZ z^c6c>lq1b!fN_SPO*ByCd1w@n%v2r1sRvS^X(OAGPI~ds{{TvtqAL9N;#~JxsCBKT1W;@4|^9|T-$2?aou``iMHZ3&kvo{U7xxqnz zKg88Lz4Erv82}vbJq0zU$SeaG(a9%0{iwH+XLUlDBoKFh54~Y2ISg|&l1{4;8x(Vu z?^2*Ig87i4$Whv(4uj-rkxKHwpS&tZo93L0!`#X)f>C1ne^;HwZg z9+d5^1a4agl5z)1nA;t>G42HI-H+0N8Z-XzeAwW7Qso`eE2wiB0kE&sFzN480K|u5 z^uWM4sTeB;$OVYw9jaKZr(&$Q+)jBMA8Mr#xeQjrdoqW1WBbw%<;P44kSJ){HH#QH z$@TT8#u9ks9$SNq0F91)4L(TA5RxGn{xtNFp&v2^3QpjiN1&)= znHDsJW#nlH`3E3lsrIK9P|Ywrg$uVGYU2>Si)D=G%XMHjg6GpUR3I6ONq%FUxIIQ` z9fL?-R(;B&8(RbNq-g@MP^FG=6b{vDn4FM0tHcsy0YefO7|+(4z`D6e%Y3~TgZ}{P zpPdX=+ks~DM3Nokofu=puD;F7Iv;=iOC^b$? z=(3LU{l+`t~2X4evCgMRN&Wr(5(xdy# zrHR3AIN;M<p981Lu0LenWTqQ<<3NP~?$-38PROuoNy(k<;ryQmwGAJN2g(=gUw?C#UnE z1J2>~G{8j*7|8>J#!q@(q#P5xo=F|4amWOWXN>ls2OEkF*cl)W)Bq}gGNXcdr2rq9 z4n+(1l|znr9CV=a;Ik+>10Zqrrj^IA1{m5TKuI_zoHsEWWJc~W>qL83=8*wHaM<;y zGDNOO0dfY=Pg=DRtFd-@Y8pZSW5GQ$=xOof5bYM=cyaCODXN75MPk4VuwLW6DCA^D zQ_LSL9{&JJq=#YfpkFdCIE~|!Jd^$ck~qAq<#Kb!910K2Ho3v+yQXQy)lj)?VB>M< zDWowFNQ52y{Wvr#9H#PIhsg`T$E7$Dha?ZXftp}{HFm3vA8z#Q0O6PxQVzO0LNvnb&b69XQCQLRWqya8wSxGHKDH zh(ra8g(R^es>}z)<|BEM5P85Gc*Q7$avk>)P5{po!z55Tv6pG;p{eY4D>EIS_aDxw zCITE0y~AXZti8JKR_vx$r*1f?p7QI=n2P6P^t;}+YUPM!KO=gBoZ=! zs~9n$Eu3-*?N3LFCfy=%23zLnY69{Bj_e2}M{inBI6|Pva!X(p=tr$mb_B~&7?oL0 zK;?mcK{@G3BF+(Jcn%*sKs|?gi0*z5&CU-!MJuw#T1f+8R}2a5S}nFJ;_qHp%*X>I z3Tr2rg#jdO$Rd&EDJsJ_*_GT5260IpDZDP>o`3q)S?)LI$P0o#az`iHj!8>MqGZtKxRy5B@dn&D1ac}V zE)^8MdXJQP8g;du_NzL@1-y>@<6@KjE4J`g?9K6G#^GN~@XV3LkW7~cU<20#XCH-q zHci0%Rm30eSZPUjv$x)P*sRk7gkQa=m(1Y>)PQeA@kkHT4I> z{{Ywwg^y72&b*F(R(p5`Lwc@ppU`x#Z18XF)m9`e&f}SM3=O z(bF@;(~V5m5UGE5KJ>rK@jg2p$Jh!oaG;!;>(Ka8A zrdSI0Z--y7F14s!$1jdGK@dge)-G~=+aKrFzO>V{Z4%K{?QNpK`=B5c`-#I66#&OV zJ6G*oKjAk8k=@j8h4IgJpDl4){ zFS#EtSL-;Z&sI&pGR=ma1As0q@w>10sFo{jG@Yz+Tjo>JnfAt!0|jlvp%o6Zo7h#C z>+ETo z)}w7D+49HApa1}=ZM5MGC7H=RIX!AiI}1rB5u`cX!|71x6+UL}RXZfFp^C;h!|ox2FKTtJn{*YLHVzJR$K4fWqjJJWiI)TAVtUZtYmKnXFgbiy zKGJPkdeDChovHEXdd{TU<< zsy18@H)n1tDHVXqFu>>sP-@@UCfc_KJSXrI)EbB^ak%sF3H~1DrAc1sPNe15#1dJ{ zFfy3I$KC>upI&rw9$lWCBW3Ffqfr0%RrmbPq=At%ix zH!10kqN~k%>vUci_JtV0=soJBw=+pLB4Tj3ZadXEZe87Cl6|Cg-`=_@(QWEn9IAXK zpZ2_Ny9!_fmSTFKf=rStC3G2ygD^ zu6^pHGa_3`h;~Mxv$HoD^c9O7@@fs|OE8W+kdWh&M|$!lno5N(NITr<_Azt3j)zRu ztfigcxZATEi9f}j`KciBC9S={Rw1^Y06nV;Ej~t(T13Y0mC5J_rCk2Vw6TNCNQv_> z2RX;Mr%yG-D68}os72n$*Mr4VqLXHuUHHfxnw!tnuho9hAZBcr4g4apUI>293^#~A zZylgwHs<&-xW zJ;hcli0GuKDD!!f3>%B*gR?yj8?S})_+_TK^B+`J`J;==!>#kb}wO9@)(%p)k<()bTHa zF6Dya*~E~_kA_cd_N%@j_=l?a%gegfZWc*_#GLY{*1cMfB>IzsO;qpD@}nHb>nc~g zKNBiX3u@-rLp9#mO7pOA!@WnP_&(=ED?NlObkecJVRG2?HFjM>K@f^obG5SAILP#- z+RJ?$k2S^8+Jnq08z-KCk>0#j3?!;ww{y}-qz3YBG`x}6Du(Kt21m7LTx%M%k{HFl z#cUY&sL1scx}L2p1%O~(cpw~_&68C7b-=Z_M_0z=2iCld#~n>RSTlN1X=;rFs81C8 zV^Rw)H@9zWQbP9|{KF|`JoLsYHM5ZtF?A^=zzdGGZr((KKPv+O;|O_jym-;E}?kV z#yf{%<(Zjt(xPi)69}im_g4q46Ixu6yD4Jm3#XnhOg_BG~XUvXa}&clH&HuPc{tcGfD!M3NLB z@-fK!)QYm~F|_EaP71tv-R+uu5TgF^tymv0oxA?$q5l9rwIPi8QObEODcZYnoOi6; z*2a;h(;4=7+=oZlV)KHlc5UNLBz1(Yu1jGi%F4xO)f zYRkc~>DM=D9oWjY#W|3AA8OMN3RR^gIr7^9!q*t8%uS0VKOOFK2kY9ony}=YZ?(-lr+6KJZ}_Rwx8m0!1W@o+gf=7-8R-@AH8q^zv^6jB-l}XyqpXMr#tFGxfJf$Q8Nfc*;_i^o6&ZjE8jg(@Lg4MMf zlN1aP>?LE)2sL$Lv$eF}dvLKa8(qo47_5P=wy$urHMl}!+^-sK%~RC$OT9wnFK;dg zK-gR{!CZAC*0|@0NnH)kO%0oke?+v5N@gQ$m<1oLLOfGF+@)=!ZO(9^#sZI8&W}s6 zf;JJxp;(WRn}$E*TEAquk|w&h(hR`iWx(N2sH~-nscS{pk9oVZPs6?k@u!Kj$@Q%x zQ@4`d5@VXuW&zK-`_^l&rEBI`+{CKGF|xAq2c!)}XSuzOex; z?}m4hq>fy6$?PinPb|sygEKM(*g;<1Dy8rCZ=5cT%8?q6m#HSXT}IfI*yd?nm>Du8 zcYQ>EVPnsEVTHiFE^PYw|}i>-$|_A++1B;Tqu%e=oA2h zumhk2r8zZu?X?KxpG9t)L3IEeXP>1=Z(C7jhI?>NS7jIj+Ou=1_cZakYV7hy# zVv(j%g3S5C`&OiSBr(hO+n+8dk+UQB82?RZ%y!BiIOiQ#-zW^=4FF=;<_y(M3}1C$tuMo5+Z$^3c_<&w&wArHuccrBk*P3 zw{&9F@4V6o``<3s{`cWqvG{+(dL6tcP_zv^a*(Dc7~PM*)2=IT#d-z!k{dYe(+q$a zVi?aHlTx;cq}yrYJ0wf%$l}19oT`#ATL-^hYZ+E+b7)ZPj!CZMww3Low4ZTp(oHbx zPaqFLj8k46b5vtp!<_o+sYrc74a_1MT8 zI9J-B9;b?jUMUszdEavbNbppW!{ofiYjXRxI}@;;{?*r~h9-wbc#_H}gm8>3NB{${ zIHu|LEnzb)tbwD(W69?q)~{S#+)Uf$bA~`T>0Grj6Kv|ILMatAodW80Sen%50|iGM z_Z26Ib<58QY1aw=00_J;pkWL0+3$heny0C2ms)a|-Zn^LOfiW1_pW~9;vK8cEK=Le zbWjf_CLo;pigA>hx-zTDA9twzEj)AL*j{)QtfUzR5cvRS(09dE(|!$H+G>k&;yrZA zt_j;Dgn2;rJo0_(pwnjY8${REdR%2DP81v!K8N0;i@_cv*KP!Qo}$pi&->t=Ks}8w zZqt1T_G(FJ+cfmF_5H{crIvy#B;{9vHU+9`vk@jnF?VFa1O;NG zh{C3tThN9J8<(?+Ul3{#hnp&P3~pR^9jjIpx0V&QiXF3#&GQX|fq~ki{>XqAX)Q}i zkp@|_g>3b}rd}qea*I3&LVyPJ9N>4XoUYD@q>(JV?0gGU5xK2#_8vD1M~ z)pcD)+SyIDydps1aTo!m9{&JJc9-VbFQ0pP8zCE&O7iEuQSldzd_UpV7Z(vm*B1&_ z-C2fn{uM2&jmj}sW|USkUg^`s*DV8idzmwa8R`J(R&+SDJ5LKHo2^D(>7B6I!A$fZ zA6nsuiFHkXNNZ~#zHyM^;!(=`sUCwOv=_toLr#wCTf8@ttK`Y%l`;GA{(985wrrnk z*&P+0t)baVC9%6#cNfCmjH}{!?+!)9ERqa)Ybn0grsS<&uMiWiyr>~ znUj-_`Tqb44~QaZT-aPJ&>;jXrgQ2?rC{7^`W~k$Z!<+doHmkvNi*2{Qq3jv-y5r# zV~Pm55uo{HZpujL4MUT;Jo4ymUR~Pj){{dmm z8iZvhJILq>?V5{9HdDnh)pYx*XN?P`$Z#S|o|{KfDumjUHnX(zU5VYn4;mge_Q<8o z!czWX3!D9F85(%nHa%g57XdvhQsYw8p57bxnnq;WC-l!ueJhu}@uj|vGA+HIo*d*j zIb)_ zSnwx+buC+7irV{HNX^{)-|Z!yG>m%ZsXwK3@aUF`vB7o}xF5PHz#|<9?_C9%k4dpU zRkTC}&y>hF9QOvH)lt$TjvcpoyP3MTf_yRIFA+m;9IdFUxOXxf2R(L<*c~cw6~09IM? z$US+i`Q&fO1hhtmg{^8jEx3b8msbCd*Do(G zy!$I=ara^)1MsY_>Pp4gL0r3dZJ{FDS(Ky}{0WmfZ6qkmjjvrnWoTsm#nh1mkc{9iN8l>%pWtg7Qbmo8%iRXuaX6Wn6ZoD0 z^yyu+G0zUBB+x#_BS^o|rnrG*cw_?wmp%DE{cKaMB9}nZn>Py5O2>ZGA5%o}R$Q=F zM8^!Tc{{U}i%p8g>F!e4dF_rQjC1c>7TyxQ)HK6+1+ljm4o+h@%MWo@B!+vNDK#1I zA~wpUQIbEI2Y;=X+<+H!_ReVFP6^?fpSAK z{KSvpC%sL7s%sKm4Q|jtw~!1536KEv9^SP+p>JhtB186%wlls}ELRK({v3MMJO2O- z>*m?7=eBED)D`k&7;;ZzSY0`4Yi?DcQLf{?)1Ey>BJv(qVBvGm>s6gB=6USql*uAS zH!40ELFh#qX6Wv|&m?h$+IK92=UjSJaqAa0R@eIekEKI)nt4yONYW`eCxsPzBQ1KG z9v;wiyVQa^0B#mMi551@jC+s5tN4Rl@O_%KkiH?Uq#_84_s1aOvL)4~)vwc5(C>e< z<&IA^8WLA&!Oj5cdeyCR&ri6GA5Db3mx@VJ2J-z`fX4$g($pN1j)>RrHoTr0@s5}A z3Usu){>_~yw$ttykv873pI$w4jySHD#(xt$MXBod9yrlr^5E4;H~KWlj!{&SjTtx! z25?7k2hzA-4eJ_GT|;N8cyUVEpq0m)w{wHT5;_l2-;rG|hpy?~E7ZobuITpON0a5e z7S3Z=3;b#cfuO+jv;` zspir&=t#6#5kuPN8B*Y7utC8mp{IDt-$sVwIlL_fVOYp`<-w7EAM={4YoJeQX>a09 z2V9P8S=1}RJVj(la&z+ZBhdPOLr6;6qdD2=atrXj_rv#bKBKM0dt-O|$Yw|0Q1v|I z{ztuOTfUE?*j^>Bj8@`B2HE60ytW-!FHT2l)Y0J4>@_Q!Jx=sN$7SwTBK=(X_WlKu^8%2T&Cr@lqp6V9M^`$wxe*KA-dM%b7KjX3tMyx z=E!&);~W!`2R}|tN8$)|m?o0-E#!efW>;*2H zuXs~bidY*|lCX?f<%cQrPQ%MO`oqN$+l7f+lpuZ99{sAU-XOHI(xv+*lNx6!zBL52oq+h~7b zy6=bW!Z2i(Nud7#TrrMzoQkkKG2!bwxbHQ+MIw;D5HTlk?~hI>l}GT%ae`W*{v)^4 z_5Cg0=HXN;nInKl!+K=*Z+fHQchoeL*=mw`(y<}I<|ZBg01wu+d_#F>WCZqdB3l#- z6|#~@Aax}A)&cREx|lATr^_T$f2+Aw0|(dCsXv`4sY*6m4qU2NJDoR8(yugcw(A#j zJgFw>?jB4RUt#N5jpF?e!WxTQXhnRxf=q4`AfJDH_o_EK*NCsQforPTc~-m_LNr`{oTd6*kd@xa66jd{3ob@casNFq~q?QIdusyCKftl8QN7=w_@La zJmQ%*hdfbvtDO)^_LC#8p9|$!5zns+#dZs%_)|>M?F_JaZxfa?TTA=Kd~m+QjQiEU z8hmr`jNS~j(hr9$Cf6)v!PG<}&JprQnIX$C0FW0r_5-A_x^lRtq*eTj+CD@ zqHK7F#4-3^RQ|-DNVj7=yCl3U0U102?@0R1=B;$PcZc-(B>NfjCYQ_Qxad39mxO#N zWu*AB$Hv!og5j;M#HKA$KQcUyqiOcY9+lGg$HY2C_lmA{y$;ShNUm3Fh>$FMPf!5p zD~-us$n00PrQe0VH}OY+uNv<`yq3=TXiCVTLkZ(?%x#_zZ=o5j`Ss6&{wDB6#-HOa z4UIR%F)=Z^42e$SId7&8I&`l)(QWnr02XQx>0SzoH=fx{&`ozCRO2~P!=GV{@_JTI zso^b0U%Fi@Qt`ltTGXyuA!hL$InT(ej&e`Sj^`e=gsDbO_pz&!N$6PAZeh}`XIw_{ zrcx2+Ze&n+$vsXhEqs1#R%E`0D4GBzwz`RcB!6_)rmOI;#TK3)Xf?%q8Equ;?rhpK z=PZN*H+n8H{{Vdo;52^>YjbOoL$2EGk0oGp#^KzN_;s$zQK2=t%Tjezm5#nYjCYn7 zQ{3t{+miMrL`{KMfA#BIMAWsP5X5zBNz&FLyEY>NS0CQ=`qv+=Xi{s_q*oTXj$k9P z<8PM3j1yPjcGtLKcO-)L4d2b!Uoa(pl8+wm~^$Xh=^(53@ zU>vIzQm638Z|7PE`zulK;%PUtBvaZQ*AW)xMCpwG06MK@b>dAURVgb66GjP*InQx{ z+LOf7*y4 zG5kF_=C*7+RjS|U%cbeMw0BU#!D51U+#y~DMtX1ui8r3+f&^ zxcGvxY8J8p+G}B!RD9s6Bw***^!!GZ$H5z2E5VZZ!u6wABe_@_b(C=ZKqIL7oz`k0<#k;^CNH%1b8DK-xdMh3D#j8shb@h&KA9HwVCN zxl|m0oAPmvI(H(dYFcf#k6>R8>Dokd>XJ-hMNYD&avz?A5Adu101Es^u6zOU`{*7n z@M!xL#6CoZMILpt<0&HNhW8%ho;d7<2*ql0&b*}bAMql`LHiA+q2Ui0TwU1T*vC74 ztxC;jF$Z)mmWcf(h@x5Me);!g_M>el*pD*t-6;cBpde;?t*o(!{wYr)rX|H>8E8vffJO%K} zR`D*I@l)XbgW}5_OH4~^E332*b){V@$`WWd3^Efa4y26iL(b4Eht@1&Tbbk0G`Q`& z$=_nd!a@%!K;w^Z%Dq4KmGEc6Ehoh=>pudlbwQ=c5=kJul*#0~5;)wPqtyZ-0ewC+qu`YZicXIZq=gf^^$})4E*&Q=p(eVS}-@?xw{>Qo( z#9xQM33Qzz_f5Kz(^;ELyfR8Im6|goihtF4m@WVSZIL~(;$9Thj*oY9VQ!I#yqr!7 z2@JsS$EV5%tvXYUNZsg5(df>y%fSBt68<1-_IBPB@T$!f*UX-19!ekto!pI}`*FwR z-+VdnXNtTZe{H4Z$++WF~YEA@p<^09p-x=d0*V{M- zv3%2&x()1Wd_4W3^)G_|02D7gZ{dq;eOBK7-b-8UKIToZ+=f>XvkjyTj#Y;lBXHw( zMxVl8h8{QlslFxMf5Iba3jA~G0j_QvuNQnj)~>agFK4t{Tfej2$qZ$@ zv;>EJxxoE)g;Ff;*qv58(%nd@Xfp;eUtEdEyu?3@Cg;*DoP55>8{3oU{GlS8?EU#}(v1 z3sTZQi#mV9pBBE8rM=z!cGt7&fupxKE%#w?0rIzzv=heW9XPCEJJD`0VL3U*$?9(S zi}qms0MbA$zoB)HjJk*HnedNK(!6P^MSC>SMHSRGtcwWT^F;EC zpBOHDA>-XEQ%ijo>c>@=?J%^8MpelL(bTdPByLhirF`Z4Q+yBcF1hl_UTT8net7 z!>;=k2Bo3qKOS{i^v?|I-wZ8&5MQ^6d?+Q`t?3Xkv+~_W*)G*j$Q*N?LBZpIN2~lG z@sI2;@E=G&v?s&;d&Ku%Db;itt?n)L+vY!EouVrxr;xuWLdWEBkbYd1?Tvr&-@)ED zpH}f*{{Vt@Z6imT$+UY*>8@gx^~MUqB)W|K#5r8e+(nPhHlb0?qI%Ar^v_< zG`7rJosuhWRRC@;yC-q1=TaWq>hE>ctpz22cITS>VEv-?FNi)Qy3;gI5?aJx`4rC$bic1n>kl?JTB3Vyp`);I(Re0 zo&)`!JZhg9t?vH-;V|(wmEudQO>^PayI{#}41Ror&4Jem=C0JiW^kpq#0& z;V*&jFU37iO}@1FrFnNWnnm`dcFhK%Zz~md$CzW>u{4SDu16WIi(dhckN*G}bi0i^ z;f4O0FN`${X!VQ8BbDqXc^y#9vqz68F(nFyR|k=|?+!0#PAX2T(9$i1iJc&-#4Je(*e0C`#CjCjwF?WXZ}gf%4az3+*e z!`==uHj`w@G?q3vX8D=&L?MD-L;2Q3~Z2tg>Ukg4Md_IT7AG0m3wZ@Nf?FYmi zWZ1`W+VjjvcxAVhPmuzbcMKI|V9YlirH)Xk2-LI{&|N4bv^nn*_!HnSfd2qz&jb8+ z{hF>N@E?z^VS@hvRIrlzHe0loCQ&`2Jd7}Kav}2_w(X_nIeEW;;V{5Ax&#UsiY<;itmCgWnRoA*uW;_*Jj`Lh!-U zFHywyi+8AMxQQ8LTYamzMYDg-p|p%`};(AL&rZH zd^PcR;&s=GH9a%ILN@TFt)7}?xYce{viXI!qDtU0g8AIr@CFMJ5BwC5_J#O;@iS1h z)e=7vcxPAhnKa)F>RLROv09|$`In5vR0nOXA=+|W<0PHc++KG` z;Xf8!-nWIM(F*?nXU9B~tJ}@FN07iYsjvb^J4Q*{%6`_r4E4W`-?cWGq}<#~s3Fil zv@RvO)KVv4#eA)yxGfsSss}k6z3V!3RHx5=g#1-pn>*i%Uj#p7580#Oq`$Ld-y1F2 zJXfQOoBse7d8;c?-RvK(qA850& zm6`n6t=zWQz!Eac2*JrulniB2y*iH1Mobz}QN7uV@uT41!w-s@V)&opzrbG+_!@Dg z#U=jDBKF$W(^FM&Atq>oM89_hF`VJJuTJ=H@UF*3_($U3g4$Qa>z@?pT6LM#Ei|nd z3ExwhgFpHcMC6nVb0le=LEs#g^i410AI1-lk$BtoHj}|~TifaEE;TepUmwz_PI z63dH5c+ACCMZrf?^YEjW8$SmA2Ke*gzlgLQ8^*I+>srTwFE8TLto~~!)@<&h+6e#` zfr7{|2qkiGPBKZ(N}9Xc=BdSKjvL{Jg}xK~IM5-!(EJ81V7$=`)7^Og07MgRxGtq4 zNxyfO0Ftg4l>-N#yQkrg+CD!A{>rd;KUA}Z=SS6b`LxYe^3rYEiaJXqyJQ3f!ieKi zNy!~JYV~g)x5J-^F~{Kl032LiczWAF*LV1X!pBmEN$gC6bXRtlOn^%m6EB#O4als- zj402}x|hT61K4~x@n)ak8T7qf)5K{uuc>J|v~Ov4>{TO?A~KbOdKDN@03otT1lJ`u z8q3UX4cnpYH{Z99!aot&X9T0Cc2o<0qUB z#J7`tE%Eff3qCLZ0Bz`+){~)lqr`Xj2GKQmURx%&xRA-UUkkmJwy4eyM<4^owfr*u zojg&Y_&ZFW!P+NWjk#0jU$&2iejIpf z_FB}u6XESX-gY;UJ=OG5!7av*a?G#x2|Tv>cpygKbd_FDB$TCxbv>U~{W6s`2siQ`OYzGA-u};8 zkHwunKN|cn_+6{t>y};~)$NU_xzrQRw-ZL&;#Qktn8U>X0CcA(l{?#Sf_wq-XT^^g z=>Gr=wciwJvFm;w@JdE?&38sgq|_eRt_1R=OPJOufZD-}WgO=?3++0u?FsO!;Lf2p zg?uaETWjg=ucw|3OT^j}MKeJxjOD!M2`qySKvqz|a9M{n%TAObUJ$9WzT4~flUg#I zT8h2xzfbF-{F2}4Pi1K&m&nN!(BpDSM}D9EYNt2ap_(bBO|gUus_F9*J^PBANs2jS zFlnnIMHn)=Ud!eMJr7>z{{XL4Z<%z}YGv)C#UZzXIiyjKG#AS_`uYx)7Kx}_MRJDvCXhtRVVJfSM(nx&06i;0 z{^Bc(*(aI_A@f)y({IYD`gR;r0ucM+k%(sbeqcDl^w?@CBX2RLMJS4aRI41XzG)_s zC3Uc#<~_$dRd^1*-TG6}Af9tF7En=CWxnVgay!vs+*??k5;cjK2(nZG)SkPl3DyEl z+-v5z`B!8A0IMMKYHyMl=eTb@-vFrdIP2+5xVl@(RmemM9#;#rx2eFVWHT}1ns#_C zWOn(oyG8*d^!KY9ZyA~^n3gwOaHAOY#ZPYxu#%T3BVymWBw=!UQ)AMgj`;Zu%vnH? zBa@PUi`t#gSc&aka_7jv5Uhvyoe1_c%a~@lW(;3sSZqdi1KE#`_xA8T^tumFR!<3G-& zYq*hBO{-;P;zHh?IP|Md!W686Un_iWn@0Q$7>~cbN#$*0J49Mt;Z?f~cBQkPD}|Eb zqeujZMC{9wz#gL=DUB=3ZlX3Uk&@ZQI{HnPb)&S!Bzcn?vA@b6cc2ET zFtx~AJ6N7r*_fA*CUB?PoVLPC zhQ+CkFcl?d`8Rj^RmBe4j4?+PD7Ns-<|#>1jf@gI(y)w4DT?7FR8Us{f*ZIazcnI6 z(=tqC5y@^(8?(Jg#t850p4Bw7xU@2xSewXPpj8U*?eAK}D~%!*c#(|o#kt);khTcG z{vTsf!)#%>6Gj=%11d2rPakx93P)>eSxlDMjvp;c25s939H~9cN~p2UH%wD#4H^C% zk=WLeu~sIwj?xIqNgFyk_#yoNpSDf(>EK!`7;j5LLY(mBR@{VK3V z)Fo7pvPl_u{K(oh0IIxy zF+RVA4FdvQ9ob}av6OtM{lWC4NhLFVoT+C20A+i6AEj7^*I@Fr=-M<>xcQHg+3TNd z*6~e&TkU&tw%Uww@&n1YI}g2Cx46{jD-JhYO2uDl?FZcd06K!_PP>}iC8SD{JGSl1 zo#LD#Fk42G%q77;C8I_m02^0_#k&Ql5BWdSxMWUkxAr_dX`z9IZV;3VelISe3f0z)XHI;hC8?+K;YH+ z9QGY68Sdq{xwR_M#GYJd9CrNbREvL=6oFPjFEVHNPfUugSSyxAz+e#-o1NXw8}lqd zWE;`4SdPBl^z19PO@vurb-*~l058hIpCqj}8=)hys_k#R32RVk3mtp6-M7K9H8Bf-iI_?PUH<5kQkQvSe=Y`WA9Fhu^~XjDrL5t}JU`SCG@QJT6V^s9eNX_hGXTzyzM+ zujtUpE}*8uR&X5y{ovdVmE~~c z`7zY4?76ov$EN7Y-H%i7)!RLQji%f;;~BwTD&C=XZPb?xLY@e2YXieKu(X@wak0iW zw+6STlp9kMsyK7^n12m_b7Z)$tYxrDTO;zUMJ`N6#tx;j>f%L`DON`ypxw6=cxpjq z;z+*Gu7NRz2MxNc>oTE|IVG4r1{HwD&^ix#%z|kSryRa!)($w$eC~A!Q|C`sdK9lZ zHu62&M@TLphDfGh8L$;toF97FvX_0!G$0^XA1mkO!Q|IHq2IzRZ0>DCZBHtN*uWZ zf-Azhx$Kb;yYdr_z50q#9MG8F;?dYR=VEsC`clgbLQ=pLE(a4fKpxbBM~34j^fZZW$R9Bs%9YLKi^-m;k@!$}>&`EsT>6z$$y7|OJ4peSeaxQ|5|Vu;pyqxV#cfjw0U)AzK_1#b>U!V-&b&W{D*s z)zju4-v0nv;`MKf5JfA;6v1$vTljI@SD$O&8twG*!SxVXvQ_tT$JBaO62!$ck*sjD zmqXU|?;YFN$u+5-JQ08h&INJ4BKWOjEQ~gwpn*E}sy3b0M9x+DE*Nn9rn7rG#UFGKrkAR~*XV$Y|@g2p)4>Wt0W+Vmo^{n|N zX$r;}@Wh;Fk^cbJr!hN@=t}~*^HlWwD}q%gC#yP?PLo9ORGJ;go+)ILaO#JQ_sx2r zgZ?7@o+ze{>uAOdC^5VIE5j|Wj8?C9XG0uoou`7wIO4Q)t!CoRMwJ>sSw4Y z(zLZf%CB^NqwweAxQfYk-IS4r#R}PAeQW6Ng`XKhm~5tyG)WjHRXI8I_ci&w;LnMz zq`J)|=wZ7mr04RldH8AZl0}scrJUW+_=6IuGr`Z;#KoZOW_i#Er@KHSV4t@s+Np z0<2Q+h{d~WH%7)yc~isAoUV;jqS59502_4olfpL^w^@t`nIgdL+~d7|ResU-k8SY^ z?TA+%VOa6guU~5YfB3_u$*5=}QGpz>$c=ym1s!;=%a7Y1!t-gKHNDgl(HSP((k=k< zkRGGd*Jd79k(B+|9szZC0tQ$lPCoLUpGvDZnMz$J?(*0iaB9f2iaT#MB;Kz4GcVry z)oG%Tsgal!543U9>0a##Ei7@(S&q@JBU{rZ&{+=|_v>DT@c!h-cq3^+=dL>%^Jryp zIEpy1(44clz-;k>U4Mk`WJrOd3n2>ojjik!5w5rI(WF!zy3j5Z+p)_*CvT)>u`9hokKdoWMm@fBnr#VF( z2iCtA@j8$1)Z0DGt=|r!bkg7d0H8FJGZgYR?eD<#?_PW28Do^F6Ed^DUKivr71!L~ zx>$LGm1OzkkYFA=57NB%TGVc}8C`t6ks-p!dY^G$&)MYH)#AFJO_tJr(Y}QXhTS6_ zj8}2oM^zoM^rtGi%&#C^1sGw_@y{N#^{3C0iZGr8#jTACNl(hGD=ypo&+7f@F=sIL<-i z=tXLx$hZ_qiZqLbXCz0Tn;7<~0d{6!!FLQ0!>FjXT^nDuLu}G*&KPhrQ~7YoZMI33 ziy`B<^%bOG*bx--8;?o*_~W-U3 zgdtBXqp#As>Cm|@Rz+y-iaz9#oG;CXIT)pDX$yR=ypNS|Mn4*~V%&x`AS)c4_dc9c zqqULA+A>gOi63-&S6ncSkmgm65F|xr*rcB}SLYmd9=YPI#)Xu|vLHC>M@o_#P-G-4 z0zd#~x3yf3*<*wlQ*cp`WFIm5*R6xgDpglV=c!sTc4ali(xfGoQL?N+r$cVCNU@a& z%19DP(EC-WEru~9qyTv(dY?*gwvfoMx|SHpVz@trdUUd?oXIu0l(7-BDm9vJVJtx8 zVM`vSm2IVbL*^cOl^Cs0?Bh1scj3X@rI+-p7W!~>No62zW4MLL74&!>7_V8i%dzLy z%&Ea%<~rH5sA4O$9vjq(we~wnPuYM9rG9=o)}!fuUqvjZ?wnB;lLgHFU|cj~fOr7c z(&0E)5gBs0rr+dnRm~~2boMh6#Y=-DE`0#N!0l4Ck~)p3qbC?X)vmfKV|4Lu812Sr zhfYY}w~KBi^OtX`%f*|;84hLCP0wj5zXslZc^q*ly& zVx#$vrGVm#jXj=BLc2&KA%{xzp~6Zlna2J`Z!(;nu4l!j!3wi40F1Y$Xj^F>BfR{W z$j7B^$D_79z1z18s2;U7mxZn)3?yDX4?rv5!|GY)k0EBjVup+fAHyo7)yH^BPlTVlMGXB!1+~nl4 zWIsMn`$To9rL&qDe8Ag>Wyf0d9Y5jBy0dJ%fT+&{9Ok_Pz~8e{YmgakB?aC80Fi}E`wL0(-tV$JBHr3rf|xDYm>>0fc>}#_LExQM^r2fvNaP$j z7{z;TxA2Ed@LsN^qe4pMK~4|Wx3oP!K-BFGwxF>rs0me7=nZ`~8-lX>cy&6G=3Yqh zYVjUgh*{ute8x33)qeC}2}2~??{yAEbIp1=xgOK+B)+~zwzhWGzl1k7w_2r01@{3QQ|L& z8tvuo>-(o-?}C`hsPr6G2BR>&x$`6-0zY<#kSp=tI`KyXR|h;U30>b)^o*N^rABN`_Gz$>x{aB6KIJ_M?@It>r5MAE9hA6OuitL{o)TNQiC3 z65R;wDsyT)sKvT~2RY7j>V3^=X%`l8u@gdMA$Vhqdx~6xxsMcVk+G5utVKQSA)?V5bH0kE03HXrt549^y zVghD~vJO#4@-#&&?l8$P+*=`3V~R=OxMVv%RbE38!KY>bFzW2GjfCW{aqUvU6teRi zBoIDedE%fEG^IpiXf)vqOQ#2t7UOTkbSD5tx)%h>-L2`qIde z%*(nU@~Pu#;~w;|#Vh=<{O^G)SH@sM8$ zqK9*3b>@myf*dSJxF;Vo=eB(X6Y8SwEVa`7gox8TpIp`gT{Xq(#8@P1KX}A)J%_C# zOCem!26r8tS3lQg?pGo-8u@M96qKPqbZ4zpZ9*_SsU`VClE5CBs_$~Ea2%uZ0QJYc zHOy}o1SMHm`I*5F>0I)!DHM_$EXuQqqlJ~n45hyCq3(q6vs#uQ95#6?{!Kr5M-ryo zft6Mr{S7bx!{$sf9Ffo*{VOZ6q&=Efb(4%B<`v^3)X@yCW!ToIZtt0gK}>AM42vG; z9f9pn-nQSoX3j{+6-wn;)6xx`amvpI?=yju-l^V&c^OqUXYVTd(dMt14ZD>J+-^O6 zX$!ov9FR8-r@yhP)sm7<Nf&AFzns(5G+~TT?kq4Duj9{3TwtkS4;cqN>FE(n zkO5X7IL>!_RVanVk-3ez4ma{}IuCkzVIeN)az5bCP(3Mr&V)zA?kQW%IW*taC1eA{}+yXOF7@1w-Boe9^{xtLpoV1&JVE3k!Vh5hB%MrbJ6-q6Q z3FNs^CJ6<;@Er{Y%HHs_pS%NbUD(IHNt`H;kgR_0dVAAI5+cChZDK)UK5x&`sX?&V z2_d$sVHcL#I)C-)#1O_gaM>9`zsS-ovMPw!uY9l_N3}Fd1Zo;dHYV&jC-kjVCMP6F z01U=LGqeU=_N8*F<8T3=?(>0)h2~KUd5XJ8Bx9V4XP6Y>RIu6^4_>{+TBerdxulCF z+E)v2g;ige`ihNZLfZ_PAKqS-QcJ+ce8oXHR0oP=mqIlWNi1X+_$?82Si(aF=7$p7nS6k^JkoX<_^|3+fEfsh&jL(+kE&sID2~ zZd!q%b*lM+VVX0Djz^crKBU!2^)VaytV*2lok095nU%tZMj>)}BQ(OygLZdsIt&m$w6iJK%6atCT^2AG|!KiOYjTEbOlEyrR>E+Y$> z8!87lsK}XEwDJYxn=SoW;-Vz9?a+afgw1Cx$ve1RH( z2?4no_5PJ1{q_=3jD6jQtu}RkIKFVa1wuIYG^{HPBw(=I!#DtX_oHbU3P9t5=zZzM zfEz@Bocy5r`cmx~*v-K_;B}yO5l{pMMcM%A{o_bgPFRDSaY~?WFO!~|OLV6dFT;(* z46p+j6vD)Aj0rL(-1MNX20Xq=$R38C>PXKV_6CzGTt&Eg5srd^2vh>cJF>lKE0Dz$ z{J(jPF4DtlGJ-iEcN7pDlB1TuDzxkX;XZ6<453Fn=j%-%50@ZgxisevssuO$oQ>YJ z)XqXkpl;91-3=BP63vaHc26L8qmWCfz{lfC$fa?HTpkGMMJE6bPC?Fb#XDF+Wm!Y> zjPg5*T%JY&AoED98HAgH<*>``>rLLMr{yiqcpWLACRdFxc9Q3UGsQ}vNAnp24Do@} z+Ms}KkVpXlbuG<3r6e?Hm^jHjfc2|e6qzcsU@S|t7C(BGiiPsPIQ|e1L+U*$1a(yo z=v@ncdj!*jgNV0do&h|Mtx)beF`-gimOKoaayZFFe1;e?k^ElXl^U_g%i!mXie1Ef ztBirb#Wi7$Qmp0hz^}^6e}~?ji#tT%Mq6p&)MEoQ#c#SvQ-kT+pA+qWm4Y06!~4V9 zs=x%HJ3!p6!N*#6A#%f>bM)$^{KAYk+Boz10}K4Qwx?C6Ud}QtU>2JaY#1En}51a3Z9h*ot@G% z0077*f={J5{^?Ni6y&;|wO7zNiSBRhC5d6aSsF}yldc9o3aSuBX?_&9ia?+%2*yr5Yp=BM z=9nJ>1&oeBj9}ulrJH$Km79!$rlJ~vw?Al%C}r!B)K}k9y()grlvGzlm6G`*#hhJP zbJde?%t?Ga@xsws;W9ECJcCt!#)y2WcQXO=NJarZ)iiqNo*b4tw(-wOuLh*gC)sBs z0B#OzSgO`{Gjy=-%v7G|$Y|mNIN_LaOlcJ-4DJJ9V>Fk#)ueK)ae8;Lu!>q`=OtR4`h zPg7G_=^%r?LA~?0)KO|w^|6m7o#aClNTfyx|mDI>AF zvSS42b~Mf6sXcyiqxp-aV@}0dvaLg<|B%T!hamQ+X zuZE_Q*{)22CK)3fk}Aq+^Tj8dCU$PX;;&jw95FmYEX3r4Q99C!_Y7q={x_mAtSx-U zKWKU$u?@ui>~x|<(u(xs)#uq-Tn8tv0NN zu@sxUjO&d&7Ti<<2LM!SZXx+x_3w(ks@_5)6NUMR;Cj|nmvRh9Ny#|ID|&8oiC&O*1{k-B~rmi{7|+EX>Onc3HP$Q20Ht}n2+dWi!B zrW1|FwRFP^C_B3y6!6t1Pk(XGDKRNUimYS`c&@)FTOzZ`_*DXE8?WM~_d3Eyw zO8nlvsRXhus?P(3JC7~f)}2g77MyK;k7Esz)SRu{-@Df(5~8Sl}{6#hFUU)!?<7oMDk9x=P zR-veiIW3wp*-_ho4^x`>?8iT;H7bedeGU^VrB2bc*{OfyYbz^o@X3(a%CmEm{Hrfq z*YyZ(&BmK)mLsHxv93StuJWSXPR1cs^fFG^z16+6WS%QbSzy|hA+usRs2V$7trIlf?`#h<{9~_ zgc|*d>Bc+DMpjev6+Dq&F<&;7D$X;Nx}C7X!H z!U9#1mGgoROjpC=v9Ie5-%f|48W)M7A)4aI$rNTtH*Qx4<6>Q3Z0DWEf(e(S{hZ=t*`FqlV(WXagmzm zA-$3*7(@>$2+81kW~PTwk)(K1-K5H46%SKb;c@VT=5O8;=4(T1QrB#u4H8@i3de54 z*EOGUs6#woySynFe6UlFed@iAiKj}Nq>E#>@Dso_Gh0Ck{r=OmWZ-d%>Yg_dHRa@F z;-0Lzruc@-N`a)gwvfjoVn)Xe?@4ju9VYHyIJ|I{01TbGhpDLUHG6GNIU~5W+F3%z zsnZ<+;s(UD(yJ#qPf%$jYiV|n z-Nx6FNTO~J-230*RW&!amN45!RgV7vC}6E+&8(_Mj*>F&Y!91;_NqpE+mj>9e~qh$ z0B~2+-kp5Tk1C8+$X(H*y2Li=x(Uk=#G#S76(!!c3&gV-PBHU8yryFscB~ zLgQ{lLb_@p9$bWgG6R1~v1FlKNhmyZQ{JLDiONY#uVUJ|9S4V_GZ{t()*H(Q%C!|+`CEhW2P&5lc#$@e8mbcc@SU3 z#@$T8WF(a^jE1EN8^st~HW8*khj$=ju6xzVRx4%6BuW^M-i+k`0EJYNcqQ5z_lu&Ru#ZgI$9++v*4pqWnX&A?^#^~ErP7b_{) zry)u0S<0+NpwPEl(iMi+Ex7#8kGe5RueCyXq?5)EImIzo&H3bgxjg5;pcN#rO+2At zO^0XSVZp5Zs(nk<>?=(ig&e3>L6Y6DJ!-MJogJe~X(VS-RH)#4`wFr&DXv*nT*CmO>#=4mgW6fH+ITtp~q&pwYJ6+vt)zo zRxLE8L*&bc+PPI8zO`}W(;%>E8eoDk(|08OY8zh@TD9)WWdv*+vYmbN=~??oz1gaa zAZckf4$^{h7=wn#L0TG|T0yi1-tZ)-`&)Z_vMxD3)z07R7xCM#_H-xAR${83#HOlS zOM7yU{it$7WdR(D&+F9T9#o2Zn%a)96^*~ytYB+{jG2_={XYt#b?3WfhQ`>&0|O)a zpK42IhQi~|1LPlaKK#)+i+`Ak*mldJfHr&AB=Itm(?Hd`vgMwuJ=~8C^i1J^DULSQ zb6Dx(X)Z3Ugv0~4ob4H_5yKMU(nHTs&CWgQRLa95l+=Vs0q4GlS{v#O+}OE}(^kBn%R79+e66q2v+b@fZ5cK} znFAGV<0@CC4QN^DkbhpX(H(8lP~GhEq496A8>rKA;%turnJ+ouXRr&L@>hAE(h9Qe=9Dpv7lux|PlIs?_Ng0P-b`f@HbNrw9jj+b z@U@gTjF)P~iU8_|0DWtDbm^nEZ8|ty7Gh)AaKImbN_L>LTE`Ru2f#a8Wl`7Ox#d#k z@u3)%G>tP!OTQ^%53?r>JAYcgZt`A{Xu3RWypbD|j(zB`(<8o>ATtppV|M-cKTbN- z*H7om3^71tC5R0e>GiCoH*`b7zQgecT`qj?sHKEZMA@SWQq~^XrxDPp#8RCd1q<9c$YX{nDzFl=kTmLbgd=SNL|KQ4#t6gnsj0aWhAjEgq#vT z!meLgM|WtSWx8$qK6VEqjH*Vnu`#UIRSh*3-@v}jMgp9#IG?+ zdv;|f^0@mxY8|n=K(fDXw1Y#Cq-B%AG3ON4JX(joFFnKD8~bgRXdme$C=dMXljNWRVaM z%BQvmdW&0GGWpZeC|zg7mT=s*l>z%hf?H%ml77CGt>K8SuOdsiu2CC1z?+VH4|=Dk zS$K0w3k{{Lh1i@sH$nLItWOYlYvLz~uAVOn-XdFDAD@hM><_O7t*E!|vnM%4YK{Ai zat$_VjpBw#zHqTggS?(bKPt)9{wZ8W(P^4in(+yV3nPvYo|!*d#?ibVeI$#iYTkL4 z2~V5m1Dx_Pj{gAXwRBez*u;FeQ+$!2X28x@(D6!6F?tcrQhr7?#+~B*LfD;8R*KaX z!?Qz@SbKVXD%6@*lwYhY* zx(x~6k0c+Rhp(`xZ@7{`F6}JAk;X&Zm;q$xum<&po(dd z`q+}FaC6Q-tyXO%qSEEmBZX#{XA!Bu{AzR=ZcBy`FnM;nsS&d-20g1L?$XZm#T2TM zHpU1f7%%nudeR+0n?;86=XnVe4$1Dn%AmZKX$lFT`#^=mD=FqKIHh4b7vZ(AS#7PY zT=B$!u6)ysV?BVSztq)L?6n&sYcO)H6ShN+%snzO_|WjZQ{1muH{|vl4DLopIlZZlc(y} zi6*CaJloPN1q*GfW?c>#Z|MvRO2(O6oyz6CW{Ih#Rxh z@aa>(q#-ImWj{Jj;)^5?MiJ&#ByHEqu9dMmUimXNh<&bbMpQq9AJJGk!?KpaV$_q ziwi3(@v-@V_Ms5ni}xNNPYr7@YnpD!W_A)O-_Z5Qr}(epR=eXnnC8{5z*v}k$bbNG z*N&&_T*I%G|zG>UYM&gO6U7N-aiBf9%p~a->XfvWR|FAaR@yp0w2@ z)y&;ZP3;3teP&%oSueNEZxEO4(f#&Pa5Mbz{{YvjcXH@9%9bea1hX+I5I776Q;z)8 zG)rIfDK7MQrHqN1HelHfp#FHSe^R&cHnDU@kD^Z?w~+q**buC8IR5TNYNHFiSu>lA zbVqNjYWgRJ{5YEZ#*mR(xG`^I^6tmq8R`B%rwI?lI~(m{J3kJzmkn$Rq=4sqy>{of z(zEm}B3(+x?@I9&oqscl8xhNJN<))^LZ7Ez+}EX9YC0O|S{{>S;Y(O!(d^dU<%Ts6 zAOjv_db#dN633;8;)RE0e&pk+ z_V%q~PVVf*)oEF3ZE5k#DTh+m{7D*Gh1}1Rv5)t$?}1!zjXon^>e9`mS?lIf-yw%? zS7;}Zj+qs$pmaxu}(mZ>Ub-a=}z-;r1*@r~_&bwB&0QtLBaJ(xH zQJuXsL7T~gBPba!hgDD1)wP5(!yNmSri2ja zcrl#*hp6Mzl31y?q8xCkZq8pzchclrWU@|&HzW*}K7-buHk+

k;^IY?j_jhZ}C# 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⪼Zl?db?OwVCA``G6N779~r1 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%0D+!PeQ02Il~mjhp~eTT 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 -?3ae#FiIQ|k&U4A8TF@#BYR@0 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

dRUoy5GfZH^MutYy!&if`@vB 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 HS(Akqz&?tdgs!)^KzP8 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

J(Yx8}1yg&`WcJ?_A9KrOt;D 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%0A8%eZe@XP8Zsl^SIo{6aO?D@ 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

HKPi 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 literal 0 HcmV?d00001 diff --git a/users/arkag/readme.md b/users/arkag/readme.md index 76a5c4525..c685892f8 100644 --- a/users/arkag/readme.md +++ b/users/arkag/readme.md @@ -1,3 +1,26 @@ +# Shot on Pixel 2 XL with Cheap Lamp at Work + +![mmm, tasty](mechmini2.jpg) + +# I don't know what I'm doing + +Some links: +* [Layout File: Mech Mini 2](layout_mm2) +* [Userspace Header](arkag_h) +* [Userspace Main](arkag_c) + +Here's a list of some things I have working with my currently [keyboard](mm2_home): + +* Reactive (sort of) fading while typing, ported from [Velocikey](https://github.com/qmk/qmk_firmware/pull/3754). +* OS Switching, storing to EEPROM +* OS Specific Macros and Shortcuts(WIN+SHIFT+S for Windows and CMD+SHIFT+4 for MacOS) +* Flashing RGB LED on OS change +* Hex Unicode Macros dependent on OS(half works on Windows due to [WinCompose](https://github.com/SamHocevar/wincompose) not functioning properly just yet). +* "Sleep" function activates after 3 minutes (breathing). +* Markdown style macros for surround type __eve__ ~~ryw~~ *her* **eee** (apparently only certain places support underline and strikethrough ಠ__ಠ) + +# License Stuff + Copyright 2018 arkag arkag@pm.me This program is free software: you can redistribute it and/or modify @@ -12,3 +35,8 @@ 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 . + +[arkag_c]: /users/arkag/arkag.c +[arkag_h]: /users/arkag/arkag.h +[layout_mm2]: /keyboards/mechmini/v2/keymaps/arkag/keymap.c +[mm2_home]: https://cartel.ltd/projects/mechmini2/ From 223081bf2b201a53fb0383d6be0cacb8cde39140 Mon Sep 17 00:00:00 2001 From: wanleg <32079073+wanleg@users.noreply.github.com> Date: Tue, 25 Sep 2018 15:39:41 -0700 Subject: [PATCH 139/788] Keymap: 4x4 pro micro (#3976) * 4x4 - pro micro version * pro-micro setup on 4x4 * tap dance LCTL/RESET key * remove test file * more research * revert a couple un-intended edits * opt_defs version of adding custom rules.mk variables * cleanup * cleanup * cleanup * cleanup * layout edits * layout edits * keymap edit * numpad layout change * got tap dance layer-switch working * keymap changes * temporary revert * restore previous settings * misc fixes * layer order change * fix layout matrix * Update tapdances.c --- keyboards/4x4/4x4.h | 4 +- layouts/community/ortho_4x12/wanleg/config.h | 19 ++++- layouts/community/ortho_4x12/wanleg/keymap.c | 17 +++++ users/wanleg/rules.mk | 12 +-- users/wanleg/tapdances.c | 77 ++++++++++++++++++-- users/wanleg/wanleg.c | 6 ++ users/wanleg/wanleg.h | 51 +++++++++---- 7 files changed, 158 insertions(+), 28 deletions(-) diff --git a/keyboards/4x4/4x4.h b/keyboards/4x4/4x4.h index db67ab34e..ec75c3e28 100644 --- a/keyboards/4x4/4x4.h +++ b/keyboards/4x4/4x4.h @@ -43,7 +43,7 @@ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0a, K0b, ___, ___, ___, ___}, \ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1a, K1b, ___, ___, ___, ___}, \ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2a, K2b, ___, ___, ___, ___}, \ - { K30, K31, K32, K33, K34, K35, K35, K37, K38, K39, K3a, K3b, ___, ___, ___, ___} \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3a, K3b, ___, ___, ___, ___} \ } #define LAYOUT_ortho_4x16( \ @@ -56,7 +56,7 @@ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0a, K0b, K0c, K0d, K0e, K0f }, \ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1a, K1b, K1c, K1d, K1e, K1f }, \ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2a, K2b, K2c, K2d, K2e, K2f }, \ - { K30, K31, K32, K33, K34, K35, K35, K37, K38, K39, K3a, K3b, K3c, K3d, K3e, K3f } \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3a, K3b, K3c, K3d, K3e, K3f } \ } #endif diff --git a/layouts/community/ortho_4x12/wanleg/config.h b/layouts/community/ortho_4x12/wanleg/config.h index 0d2cc591e..2444b8b97 100644 --- a/layouts/community/ortho_4x12/wanleg/config.h +++ b/layouts/community/ortho_4x12/wanleg/config.h @@ -1,7 +1,7 @@ #ifndef CONFIG_USER_H #define CONFIG_USER_H -//QMK DFU settings (ProMicro boards) +//QMK DFU settings (ProMicro boards with QMK bootloader) // set top left key as bootloader mode escape key on Lets Split rev2 #if defined(KEYBOARD_lets_split_rev2) #define QMK_LED B0 @@ -13,10 +13,25 @@ #endif // set top left key as bootloader mode escape key on 4x4 48key layout -#if defined(KEYBOARD_4x4) +#if defined(KEYBOARD_4x4) && !defined(PRO_MICRO) #define QMK_LED B0 #define QMK_ESC_OUTPUT C6 // usually COL #define QMK_ESC_INPUT B2 // usually ROW #endif +// use alternate settings for 4x4 board using ProMicro instead of Micro +// usage: make 4x4:wanleg PM=yes +#if defined(KEYBOARD_4x4) && defined(PRO_MICRO) +#define QMK_ESC_OUTPUT F4 // usually COL +#define QMK_ESC_INPUT D1 // usually ROW +#define QMK_LED B0 + +//need to undefine standard 4x4 array before defining alternate ProMicro array +#undef MATRIX_ROW_PINS +#undef MATRIX_COL_PINS +#define MATRIX_ROW_PINS { D1, D0, D4, C6 } +//last 4 elements of the column array are are not broken out on a ProMicro (included only to preserve array structure) +#define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3, B2, B6, B5, B4, E6, D7, F0, B7, D6, F1 } +#endif + #endif diff --git a/layouts/community/ortho_4x12/wanleg/keymap.c b/layouts/community/ortho_4x12/wanleg/keymap.c index f6030469c..6fe8446f6 100644 --- a/layouts/community/ortho_4x12/wanleg/keymap.c +++ b/layouts/community/ortho_4x12/wanleg/keymap.c @@ -15,6 +15,22 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______________Qwerty_Row__2_______________, KC_LCTL, KC_LGUI, KC_LALT, GHERKIN, SUBTER, SH_T(KC_SPC), SH_T(KC_SPC), SUPRA, KC_RGUI, KC_RALT, GHERKIN, KC_RCTL ), + +#elif defined(KEYBOARD_4x4) +[_GK] = LAYOUT_ortho_4x12_wrapper( + _______________GherkinLike_0_______________, + _______________GherkinLike_1_______________, + _______________GherkinLike_2_______________, + TD(RST_TAP_DANCE), KC_LGUI, KC_LALT, NUMPAD, NUMBER, ETCETERA, KC_SPC,DIRECTION, KC_RGUI, KC_RALT, KC_DEL, KC_RCTL +), + +[PAD] = LAYOUT_ortho_4x4_wrapper( + _______________NUMPAD_Row__0_______________, + _______________NUMPAD_Row__1_______________, + _______________NUMPAD_Row__2_______________, + _______________NUMPAD_Row__3_______________ +), + #else [_GK] = LAYOUT_ortho_4x12_wrapper( _______________GherkinLike_0_______________, @@ -64,4 +80,5 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ______________ETCETERA_Row__2______________, ______________ETCETERA_Row__3______________ ), + }; diff --git a/users/wanleg/rules.mk b/users/wanleg/rules.mk index ac8676953..563040131 100644 --- a/users/wanleg/rules.mk +++ b/users/wanleg/rules.mk @@ -1,8 +1,4 @@ -ifeq ($(strip $(KEYBOARD)), lets_split_rev2) -SRC += ../../keyboards/lets_split/lets_split.c -endif - -SRC += wanleg.c tapdances.c +SRC += wanleg.c tapdances.c TAP_DANCE_ENABLE = yes MOUSEKEY_ENABLE = yes @@ -12,3 +8,9 @@ MOUSEKEY_ENABLE = yes ifeq ($(strip $(dfu)), qmk) BOOTLOADER = qmk-dfu endif + +#use alternate settings for 4x4 board using ProMicro instead of Micro +#usage: make 4x4:wanleg PM=yes +ifeq ($(strip $(PM)), yes) + OPT_DEFS += -DPRO_MICRO +endif diff --git a/users/wanleg/tapdances.c b/users/wanleg/tapdances.c index 6a98b896a..0778bf5f7 100644 --- a/users/wanleg/tapdances.c +++ b/users/wanleg/tapdances.c @@ -36,7 +36,7 @@ int cur_dance (qk_tap_dance_state_t *state) { } ///// QUAD FUNCTION TAP DANCE GENERAL SETUP SECTION END ///// ///// QUAD FUNCTION TAP DANCE PERSONALIZATION SECTION START ///// -//instantialize an instance of 'tap' for the 'ENT' tap dance. +//instantiate 'tap' for the 'ENT' tap dance. static tap ENTtap_state = { .is_press_action = true, .state = 0 @@ -67,7 +67,7 @@ void ENT_reset (qk_tap_dance_state_t *state, void *user_data) { ENTtap_state.state = 0; } -//instanalize an instance of 'tap' for the 'DEL' tap dance. +//instantiate 'tap' for the 'DEL' tap dance. static tap DELtap_state = { .is_press_action = true, .state = 0 @@ -95,7 +95,7 @@ void DEL_reset (qk_tap_dance_state_t *state, void *user_data) { DELtap_state.state = 0; } -//instantialize an instance of 'tap' for the 'CAD' tap dance. +//instantiate 'tap' for the 'CAD' tap dance. static tap CADtap_state = { .is_press_action = true, .state = 0 @@ -107,7 +107,9 @@ void CAD_finished (qk_tap_dance_state_t *state, void *user_data) { case SINGLE_TAP: //register_code(KC_SPC); SEND_STRING(SS_LGUI("l")); + #ifdef BACKLIGHT_ENABLE backlight_set(3); + #endif break; case SINGLE_HOLD: //register_code(KC_NO); @@ -121,7 +123,9 @@ void CAD_finished (qk_tap_dance_state_t *state, void *user_data) { case DOUBLE_TAP: //register_code(KC_ENT); SEND_STRING(SS_LCTRL(SS_LALT(SS_TAP(X_DELETE)))); + #ifdef BACKLIGHT_ENABLE backlight_set(0); + #endif break; //case DOUBLE_HOLD: register_code(KC_NO); break; //register this keycode when button is tapped and then held case DOUBLE_HOLD: @@ -136,7 +140,9 @@ void CAD_reset (qk_tap_dance_state_t *state, void *user_data) { case SINGLE_TAP: //unregister_code(KC_SPC); SEND_STRING(SS_LGUI("l")); + #ifdef BACKLIGHT_ENABLE backlight_set(3); + #endif break; case SINGLE_HOLD: register_code(KC_NO); //(un)register this keycode when button is held and then released @@ -145,13 +151,71 @@ void CAD_reset (qk_tap_dance_state_t *state, void *user_data) { case DOUBLE_TAP: //register_code(KC_ENT); SEND_STRING(SS_LCTRL(SS_LALT(SS_TAP(X_DELETE)))); + #ifdef BACKLIGHT_ENABLE backlight_set(0); + #endif break; case DOUBLE_HOLD: register_code(KC_NO); //(un)register this keycode when button is tapped and then held, and then released case DOUBLE_SINGLE_TAP: unregister_code(KC_NO); } CADtap_state.state = 0; -} +} + +//instantiate 'tap' for the 'RST' tap dance. +static tap RSTtap_state = { + .is_press_action = true, + .state = 0 +}; + +void RST_finished (qk_tap_dance_state_t *state, void *user_data) { + RSTtap_state.state = cur_dance(state); + switch (RSTtap_state.state) { + case SINGLE_TAP: register_code(KC_LCTL); break; + case SINGLE_HOLD: register_code(KC_LCTL); break; + case DOUBLE_TAP: reset_keyboard(); break; + case DOUBLE_HOLD: register_code(KC_NO); break; + case DOUBLE_SINGLE_TAP: register_code(KC_LCTL); unregister_code(KC_LCTL); register_code(KC_LCTL); + } +} + +void RST_reset (qk_tap_dance_state_t *state, void *user_data) { + switch (RSTtap_state.state) { + case SINGLE_TAP: unregister_code(KC_LCTL); break; + case SINGLE_HOLD: unregister_code(KC_LCTL); break; + case DOUBLE_TAP: unregister_code(KC_NO); break; + case DOUBLE_HOLD: unregister_code(KC_NO); + case DOUBLE_SINGLE_TAP: unregister_code(KC_LCTL); + } + RSTtap_state.state = 0; +} + +//instantiate 'tap' for the 'LYR' tap dance. +static tap LYRtap_state = { + .is_press_action = true, + .state = 0 +}; + +void LYR_finished (qk_tap_dance_state_t *state, void *user_data) { + LYRtap_state.state = cur_dance(state); + switch (LYRtap_state.state) { + case SINGLE_TAP: register_code(KC_PSLS); break; + case SINGLE_HOLD: register_code(KC_NO); break; + case DOUBLE_TAP: set_single_persistent_default_layer(_GK); break; + case DOUBLE_HOLD: register_code(KC_NO); break; + case DOUBLE_SINGLE_TAP: register_code(KC_PSLS); unregister_code(KC_PSLS); register_code(KC_PSLS); + } +} + +void LYR_reset (qk_tap_dance_state_t *state, void *user_data) { + switch (LYRtap_state.state) { + case SINGLE_TAP: unregister_code(KC_PSLS); break; + case SINGLE_HOLD: unregister_code(KC_NO); break; + case DOUBLE_TAP: set_single_persistent_default_layer(_GK); break; + case DOUBLE_HOLD: unregister_code(KC_NO); + case DOUBLE_SINGLE_TAP: unregister_code(KC_PSLS); + } + LYRtap_state.state = 0; +} ///// QUAD FUNCTION TAP DANCE PERSONALIZATION SECTION END ///// //Tap Dance Definitions @@ -162,8 +226,11 @@ qk_tap_dance_action_t tap_dance_actions[] = { ,[TD_Q_ESC] = ACTION_TAP_DANCE_DOUBLE(KC_Q, KC_ESC) ,[ENT_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, ENT_finished, ENT_reset) ,[DEL_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, DEL_finished, DEL_reset) + ,[RST_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, RST_finished, RST_reset) ,[CAD_TD] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, CAD_finished, CAD_reset) + ,[LYR_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, LYR_finished, LYR_reset) + }; //In Layer declaration, add tap dance item in place of a key code -//TD(TD_SFT_CAPS) \ No newline at end of file +//TD(TD_SFT_CAPS) diff --git a/users/wanleg/wanleg.c b/users/wanleg/wanleg.c index 931546c15..f22c34ba3 100644 --- a/users/wanleg/wanleg.c +++ b/users/wanleg/wanleg.c @@ -41,6 +41,12 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } return false; break; + case NUMPAD: + if (record->event.pressed) { + set_single_persistent_default_layer(PAD); + } + return false; + break; case SUBTER: if (record->event.pressed) { layer_on(SUB); diff --git a/users/wanleg/wanleg.h b/users/wanleg/wanleg.h index 8b98ec7dd..65028751a 100644 --- a/users/wanleg/wanleg.h +++ b/users/wanleg/wanleg.h @@ -25,7 +25,8 @@ enum userspace_layers { NUM75, DIR75, ETC75, - FN75 + FN75, + PAD, }; #elif KEYBOARD_xd75 enum userspace_layers { @@ -49,29 +50,31 @@ enum userspace_layers { gNUM, gDIR, gETC, + PAD, }; #else enum userspace_layers { _GK = 0, + PAD, _QW, - QW75, - GK75, - gGK, ONE, SUB, SUP, NUM, DIR, ETC, + gGK, gNUM, gDIR, gETC, + QW75, + GK75, SUB75, SUP75, NUM75, DIR75, ETC75, - FN75 + FN75, }; #endif @@ -95,7 +98,8 @@ enum userspace_custom_keycodes { NUMBER75, DIRECTION75, ETCETERA75, - FUNCTION75 + FUNCTION75, + NUMPAD, }; @@ -107,6 +111,8 @@ enum { ,ENT_TAP_DANCE ,DEL_TAP_DANCE ,CAD_TD + ,RST_TAP_DANCE + ,LYR_TAP_DANCE }; #endif @@ -123,6 +129,7 @@ enum { #define LAYOUT_ortho_5x10_wrapper(...) LAYOUT_ortho_5x10(__VA_ARGS__) #define LAYOUT_ortho_4x12_wrapper(...) LAYOUT_ortho_4x12(__VA_ARGS__) #define LAYOUT_ortho_5x15_wrapper(...) LAYOUT_ortho_5x15(__VA_ARGS__) +#define LAYOUT_ortho_4x4_wrapper(...) LAYOUT_ortho_4x4(__VA_ARGS__) // Blocks for each of the major keyboard layouts // Organized so we can quickly adapt and modify all of them @@ -141,7 +148,7 @@ enum { * | A | S | D | F | G | H | J | K | L | SPACE | * | | | | | | | | | |SFThold | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - * | Z | X | C | V/gNUM | B/gETC | N | M/gDIR | ,/GUI | ./ALT | BKSC | + * | Z | X | C | V/gNUM | B/gETC | N | M/gDIR | ,/GUI | ./ALT | BSPC | * | SFThold| | | | | | | | |CTRLhold| * '-----------------------------------------------------------------------------------------' */ @@ -168,7 +175,7 @@ enum { * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| * | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - * | F11 | F12 | | | | ENTER | SHIFT | GUI | ./ALT | BKSC | + * | F11 | F12 | | | | ENTER | SHIFT | GUI | ./ALT | BSPC | * | | | | | | | | | |CTRLhold| * '-----------------------------------------------------------------------------------------' */ @@ -191,12 +198,12 @@ enum { /* Gherkin-Like * .-----------------------------------------------------------------------------------------------------------. - * | ESC | Q//ESC | W | E | R | T | Y | U | I | O | P | BACKSP | + * | ESC | Q//ESC | W | E | R | T | Y | U | I | O | P | BSPC | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| * | TAB | A | S | D | F | G | H | J | K | L | SPACE | ' | * | | | | | | | | | | |SFThold | | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - * |SFT/CAPS| Z | X | C | V/NUM | B/ETC | N | M/DIR | ,/GUI | ./ALT | BKSC | ENT/SFT| + * |SFT/CAPS| Z | X | C | V/NUM | B/ETC | N | M/DIR | ,/GUI | ./ALT | BSPC | ENT/SFT| * | |SFThold | | | | | | | | |CTRLhold| | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| * | LCTRL | LGUI | ALT | ONEHAND| NUM | ETC | SPACE | DIR | RGUI | ALT | DEL | CTRL | @@ -210,7 +217,7 @@ enum { /* Qwerty * .-------------------------------------------------------------------------------------. - * | Esc | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * | Esc | Q | W | E | R | T | Y | U | I | O | P | BSPC | * |-------+------+------+------+------+-------------+------+------+------+------+-------| * | Tab | A | S | D | F | G | H | J | K | L | ; | ' | * |-------+------+------+------+------+------|------+------+------+------+------+-------| @@ -246,7 +253,7 @@ enum { * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - * | | F11 | F12 | | | | | | RGUI | ./ALT | BKSC | | + * | | F11 | F12 | | | | | | RGUI | ./ALT | BSPC | | * | | | | | | | | | | |CTRLhold| | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| * | | | gherkin| | | | ENTER | SHIFT | | | | | @@ -259,11 +266,11 @@ enum { /* Gherkin Numbers * .-----------------------------------------------------------------------------------------------------------. - * | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | BACKSP | + * | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | BSPC | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| * | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - * | | F11 | F12 | | | | ENTER | SHIFT | RGUI | ./ALT | BKSC | | + * | | F11 | F12 | | | | ENTER | SHIFT | RGUI | ./ALT | BSPC | | * | | | | | | | | | | |CTRLhold| | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| * | | | | | | | ENTER | SHIFT | RGUI | | | | @@ -307,4 +314,20 @@ enum { #define ______________ETCETERA_Row__2______________ _______, _______________Gherkin_ETC_2_______________, _______ #define ______________ETCETERA_Row__3______________ _______, _______, _______, _______, _______, _______, LALT(LCTL(KC_DEL)), _______, _______, _______, _______, _______ +/* Single 4x4 board only + * .-----------------------------------. + * | 7 | 8 | 9 | BSPC | + * |--------+--------+--------+--------| + * | 4 | 5 | 6 | SPACE | + * |--------+--------+--------+--------| + * | 1 | 2 | 3 | ENTER | + * |--------+--------+--------+--------| + * | 0 |/ //_GK | . | - | + * '-----------------------------------' + */ + +#define _______________NUMPAD_Row__0_______________ KC_KP_7, KC_KP_8, KC_KP_9, KC_BSPC +#define _______________NUMPAD_Row__1_______________ KC_KP_4, KC_KP_5, KC_KP_6, KC_SPC +#define _______________NUMPAD_Row__2_______________ KC_KP_1, KC_KP_2, KC_KP_3, KC_PENT +#define _______________NUMPAD_Row__3_______________ KC_KP_0, TD(LYR_TAP_DANCE), KC_KP_DOT, KC_PMNS #endif // !USERSPACE From 627ee050b491cc9d6ab57f90ac0f0779f6be47c9 Mon Sep 17 00:00:00 2001 From: holtenc Date: Tue, 25 Sep 2018 17:48:01 -0500 Subject: [PATCH 140/788] Keyboard: Remove BACKLIGHT BREATHING as default config for Prime Keyboards (#3979) * initial commit * Update readme.md * Update keymap.c added comment for description of function to control LED as layer indicator * corrected formatting as requested. * format for configurator * corrected info.json to propertly reflect layout in Configurator * updated layouts to reflect physical keyboard * comment out BACKLIGHT BREATHING in config.h --- keyboards/primekb/prime_l/config.h | 2 +- keyboards/primekb/prime_m/config.h | 2 +- keyboards/primekb/prime_o/config.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/keyboards/primekb/prime_l/config.h b/keyboards/primekb/prime_l/config.h index 46dd3604e..8e2457816 100644 --- a/keyboards/primekb/prime_l/config.h +++ b/keyboards/primekb/prime_l/config.h @@ -40,7 +40,7 @@ along with this program. If not, see . #define DIODE_DIRECTION COL2ROW #define BACKLIGHT_PIN B6 -#define BACKLIGHT_BREATHING +/*#define BACKLIGHT_BREATHING*/ #define BACKLIGHT_LEVELS 4 /* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ diff --git a/keyboards/primekb/prime_m/config.h b/keyboards/primekb/prime_m/config.h index 82a8037c9..366504375 100644 --- a/keyboards/primekb/prime_m/config.h +++ b/keyboards/primekb/prime_m/config.h @@ -40,7 +40,7 @@ along with this program. If not, see . #define DIODE_DIRECTION COL2ROW #define BACKLIGHT_PIN B7 -#define BACKLIGHT_BREATHING +/*#define BACKLIGHT_BREATHING*/ #define BACKLIGHT_LEVELS 4 /* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ diff --git a/keyboards/primekb/prime_o/config.h b/keyboards/primekb/prime_o/config.h index 9f634474c..eb897ef8f 100644 --- a/keyboards/primekb/prime_o/config.h +++ b/keyboards/primekb/prime_o/config.h @@ -40,7 +40,7 @@ along with this program. If not, see . #define DIODE_DIRECTION COL2ROW #define BACKLIGHT_PIN B7 -#define BACKLIGHT_BREATHING +/*#define BACKLIGHT_BREATHING*/ #define BACKLIGHT_LEVELS 4 /* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ From 4d5705ea6ceeb11cd2adc018644ec87c51af4e86 Mon Sep 17 00:00:00 2001 From: Daniel Shields Date: Mon, 3 Sep 2018 08:26:53 +0100 Subject: [PATCH 141/788] Add new RGB matrix effect digital rain aka The Matrix --- quantum/rgb_matrix.c | 66 ++++++++++++++++++++++++++++++++++++++++++++ quantum/rgb_matrix.h | 1 + 2 files changed, 67 insertions(+) diff --git a/quantum/rgb_matrix.c b/quantum/rgb_matrix.c index 197bc1ac5..8ad00c37d 100644 --- a/quantum/rgb_matrix.c +++ b/quantum/rgb_matrix.c @@ -510,6 +510,69 @@ void rgb_matrix_jellybean_raindrops( bool initialize ) { } } +void rgb_matrix_digital_rain( const bool initialize ) { + // algorithm ported from https://github.com/tremby/Kaleidoscope-LEDEffect-DigitalRain + const uint8_t drop_ticks = 28; + const uint8_t new_drop_probability = 24; + const uint8_t pure_green_intensity = 0xd0; + const uint8_t max_brightness_boost = 0xc0; + const uint8_t max_intensity = 0xff; + + static uint8_t map[MATRIX_COLS][MATRIX_ROWS] = {{0}}; + static uint8_t drop = 0; + + if (initialize) { + rgb_matrix_set_color_all(0, 0, 0); + memset(map, 0, sizeof map); + drop = 0; + } + for (uint8_t col = 0; col < MATRIX_COLS; col++) { + for (uint8_t row = 0; row < MATRIX_ROWS; row++) { + if (row == 0 && drop == 0 && rand() < RAND_MAX / new_drop_probability) { + // top row, pixels have just fallen and we're + // making a new rain drop in this column + map[col][row] = max_intensity; + } + else if (map[col][row] > 0 && map[col][row] < max_intensity) { + // neither fully bright nor dark, decay it + map[col][row]--; + } + // set the pixel colour + uint8_t led, led_count; + map_row_column_to_led(row, col, &led, &led_count); + + if (map[col][row] > pure_green_intensity) { + const uint8_t boost = (uint8_t) ((uint16_t) max_brightness_boost + * (map[col][row] - pure_green_intensity) / (max_intensity - pure_green_intensity)); + rgb_matrix_set_color(led, boost, max_intensity, boost); + } + else { + const uint8_t green = (uint8_t) ((uint16_t) max_intensity * map[col][row] / pure_green_intensity); + rgb_matrix_set_color(led, 0, green, 0); + } + } + } + if (++drop > drop_ticks) { + // reset drop timer + drop = 0; + for (uint8_t row = MATRIX_ROWS - 1; row > 0; row--) { + for (uint8_t col = 0; col < MATRIX_COLS; col++) { + // if ths is on the bottom row and bright allow decay + if (row == MATRIX_ROWS - 1 && map[col][row] == max_intensity) { + map[col][row]--; + } + // check if the pixel above is bright + if (map[col][row - 1] == max_intensity) { + // allow old bright pixel to decay + map[col][row - 1]--; + // make this pixel bright + map[col][row] = max_intensity; + } + } + } + } +} + void rgb_matrix_multisplash(void) { // if (g_any_key_hit < 0xFF) { HSV hsv = { .h = rgb_matrix_config.hue, .s = rgb_matrix_config.sat, .v = rgb_matrix_config.val }; @@ -685,6 +748,9 @@ void rgb_matrix_task(void) { case RGB_MATRIX_JELLYBEAN_RAINDROPS: rgb_matrix_jellybean_raindrops( initialize ); break; + case RGB_MATRIX_DIGITAL_RAIN: + rgb_matrix_digital_rain( initialize ); + break; #ifdef RGB_MATRIX_KEYPRESSES case RGB_MATRIX_SOLID_REACTIVE: rgb_matrix_solid_reactive(); diff --git a/quantum/rgb_matrix.h b/quantum/rgb_matrix.h index b91c9fba5..046d98790 100644 --- a/quantum/rgb_matrix.h +++ b/quantum/rgb_matrix.h @@ -81,6 +81,7 @@ enum rgb_matrix_effects { RGB_MATRIX_RAINBOW_PINWHEELS, RGB_MATRIX_RAINBOW_MOVING_CHEVRON, RGB_MATRIX_JELLYBEAN_RAINDROPS, + RGB_MATRIX_DIGITAL_RAIN, #ifdef RGB_MATRIX_KEYPRESSES RGB_MATRIX_SOLID_REACTIVE, RGB_MATRIX_SPLASH, From 7f1268f35edb24d57f424a1936265ced78eb3daa Mon Sep 17 00:00:00 2001 From: Savio Fernandes Date: Thu, 27 Sep 2018 02:03:42 +0800 Subject: [PATCH 142/788] Keymap: add artbycrunk iris layout (#3964) * version 1 * version 1.1 * version 1.2 --- keyboards/iris/keymaps/saviof/config.h | 39 +++++++++ keyboards/iris/keymaps/saviof/keymap.c | 107 +++++++++++++++++++++++++ keyboards/iris/keymaps/saviof/rules.mk | 3 + 3 files changed, 149 insertions(+) create mode 100644 keyboards/iris/keymaps/saviof/config.h create mode 100644 keyboards/iris/keymaps/saviof/keymap.c create mode 100644 keyboards/iris/keymaps/saviof/rules.mk diff --git a/keyboards/iris/keymaps/saviof/config.h b/keyboards/iris/keymaps/saviof/config.h new file mode 100644 index 000000000..eb4c7328e --- /dev/null +++ b/keyboards/iris/keymaps/saviof/config.h @@ -0,0 +1,39 @@ +/* +Copyright 2018 Savio Fernandes + +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 . +*/ + +#pragma once + +/* Use I2C or Serial, not both */ + +//#define USE_SERIAL +#define USE_I2C + +/* Select hand configuration */ + +//#define MASTER_LEFT +#define MASTER_RIGHT +// #define BACKLIGHT_BREATHING +// #define EE_HANDS + +#define TAPPING_TERM 200 + +// #undef RGBLED_NUM +// #define RGBLIGHT_ANIMATIONS +// #define RGBLED_NUM 30 +// #define RGBLIGHT_HUE_STEP 8 +// #define RGBLIGHT_SAT_STEP 8 +// #define RGBLIGHT_VAL_STEP 8 diff --git a/keyboards/iris/keymaps/saviof/keymap.c b/keyboards/iris/keymaps/saviof/keymap.c new file mode 100644 index 000000000..a63e60682 --- /dev/null +++ b/keyboards/iris/keymaps/saviof/keymap.c @@ -0,0 +1,107 @@ +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +#define _QWERTY 0 +#define _LOWER 1 +#define _RAISE 2 +#define _ADJ 3 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + LOWER, + RAISE, + ADJ, +}; + +//Tap Dance Declarations +enum { + TD_SPC_ENT = 0 +}; + +//Tap Dance Definitions +qk_tap_dance_action_t tap_dance_actions[] = { + [TD_SPC_ENT] = ACTION_TAP_DANCE_DOUBLE(KC_SPC, KC_ENT) +}; + +#define KC_ KC_TRNS + +#define KC_LOWR LT(_LOWER, KC_LEFT) //LOWER +#define KC_RASE LT(_RAISE, KC_RIGHT) //RAISE +#define KC_ADJT LT(_ADJ, KC_LGUI) //RAISE +#define KC_SCET TD(TD_SPC_ENT) +#define KC_RST RESET +#define KC_BL_S BL_STEP +#define KC_DBUG DEBUG +#define KC_RTOG RGB_TOG +#define KC_RMOD RGB_MOD +#define KC_LMOD RGB_RMOD +#define KC_RHUI RGB_HUI +#define KC_RHUD RGB_HUD +#define KC_RSAI RGB_SAI +#define KC_RSAD RGB_SAD +#define KC_RVAI RGB_VAI +#define KC_RVAD RGB_VAD +#define KC_BTOG BL_TOGG +#define KC_BLVL BL_STEP +#define KC_BRTG BL_BRTG + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_QWERTY] = LAYOUT_kc( + //,----+----+----+----+----+----. ,----+----+----+----+----+----. + ESC , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,BSPC, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + TAB , Q , W , E , R , T , Y , U , I , O , P ,DEL , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + LSFT, A , S , D , F , G , H , J , K , L ,SCLN,QUOT, + //|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----| + LCTL, Z , X , C , V , B ,HOME, END , N , M ,COMM,DOT ,SLSH,RSFT, + //`----+----+----+--+-+----+----+----/ \----+----+----+----+----+----+----' + ADJT,LOWR, SPC, SCET,RASE, ENT + // `----+----+----' `----+----+----' + ), + + [_LOWER] = LAYOUT_kc( + //,----+----+----+----+----+----. ,----+----+----+----+----+----. + TILD,EXLM, AT ,HASH, DLR,PERC, CIRC,AMPR,ASTR,LPRN,RPRN,BSPC, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + RST , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 , , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + DEL , ,LEFT,RGHT, UP ,LBRC, RBRC, P4 , P5 , P6 ,PLUS,PIPE, + //|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----| + BL_S, , , ,DOWN,LCBR,LPRN, RPRN,RCBR, P1 , P2 , P3 ,MINS, , + //`----+----+----+--+-+----+----+----/ \----+----+----+----+----+----+----' + , ,DEL , DEL , , P0 + // `----+----+----' `----+----+----' + ), + + [_RAISE] = LAYOUT_kc( + //,----+----+----+----+----+----. ,----+----+----+----+----+----. + F12 , F1 , F2 , F3 , F4 , F5 , F6 , F7 , F8 , F9 ,F10 ,F11 , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + ,EXLM, AT ,HASH,DLR ,PERC, CIRC,AMPR,ASTR,LPRN,RPRN, , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + ,MPRV,MNXT,VOLU,PGUP,UNDS, EQL ,HOME, , , ,BSLS, + //|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----| + MUTE,MSTP,MPLY,VOLD,PGDN,MINS, , ,PLUS,END , , , , , + //`----+----+----+--+-+----+----+----/ \----+----+----+----+----+----+----' + , , , , , + // `----+----+----' `----+----+----' + ), + + [_ADJ] = LAYOUT_kc( + //,----+----+----+----+----+----. ,----+----+----+----+----+----. + ,LMOD, , , , , , , , , , , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + RTOG,RMOD,RHUI,RSAI,RVAI, , BTOG,BLVL,BRTG, , , , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + ,DBUG,RHUD,RSAD,RVAD, , , , , , , , + //|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----| + BL_S,RST , , , , , , , , , , , , , + //`----+----+----+--+-+----+----+----/ \----+----+----+----+----+----+----' + , , , , , + // `----+----+----' `----+----+----' + ) + +}; diff --git a/keyboards/iris/keymaps/saviof/rules.mk b/keyboards/iris/keymaps/saviof/rules.mk new file mode 100644 index 000000000..0e1023be1 --- /dev/null +++ b/keyboards/iris/keymaps/saviof/rules.mk @@ -0,0 +1,3 @@ +RGBLIGHT_ENABLE = yes +BACKLIGHT_ENABLE = yes +TAP_DANCE_ENABLE=yes From f3551747b3cd071bc242fd646f32567fb89f5356 Mon Sep 17 00:00:00 2001 From: KOBAYASHI Daisuke Date: Thu, 27 Sep 2018 03:04:31 +0900 Subject: [PATCH 143/788] Keymap: Add Koba's keymap for Ergo42. (#3965) * Keymap: Add Koba's keymap for Ergo42. * Fix: Remove unnecessary #define. * Fix: Rename readme files to lowercase. --- keyboards/ergo42/keymaps/koba/config.h | 33 ++++++ keyboards/ergo42/keymaps/koba/keymap.c | 128 +++++++++++++++++++++ keyboards/ergo42/keymaps/koba/readme.md | 57 +++++++++ keyboards/ergo42/keymaps/koba/readme_ja.md | 62 ++++++++++ 4 files changed, 280 insertions(+) create mode 100644 keyboards/ergo42/keymaps/koba/config.h create mode 100644 keyboards/ergo42/keymaps/koba/keymap.c create mode 100644 keyboards/ergo42/keymaps/koba/readme.md create mode 100644 keyboards/ergo42/keymaps/koba/readme_ja.md diff --git a/keyboards/ergo42/keymaps/koba/config.h b/keyboards/ergo42/keymaps/koba/config.h new file mode 100644 index 000000000..360d6a562 --- /dev/null +++ b/keyboards/ergo42/keymaps/koba/config.h @@ -0,0 +1,33 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#pragma once + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + diff --git a/keyboards/ergo42/keymaps/koba/keymap.c b/keyboards/ergo42/keymaps/koba/keymap.c new file mode 100644 index 000000000..f05f78b9e --- /dev/null +++ b/keyboards/ergo42/keymaps/koba/keymap.c @@ -0,0 +1,128 @@ +/* Copyright 2018 Daisuke Kobayashi + * + * 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 . + */ + +#include QMK_KEYBOARD_H +#include "keymap_jp.h" + +enum { + _WIN, + _MACOS, + _LOWER, + _RAISE, + _FUNC +}; + +#define KC_KNA KC_LANG1 +#define KC_EISU KC_LANG2 +#define LOWER MO(_LOWER) +#define RAISE MO(_RAISE) +#define FN MO(_FUNC) +#define WIN DF(_WIN) +#define MACOS DF(_MACOS) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* WIN + * ,------------------------------------------------. ,------------------------------------------------. + * | Esc | Tab | Q | W | E | R | T | | Y | U | I | O | P | @ ` | Bksp | + * |------+------+------+------+------+------+------| |-------------+------+------+------+------+------| + * | Del | Ctrl | A | S | D | F | G | | H | J | K | L | ; + | ; * |Enter | + * |------+------+------+------+------+------+------| |------|------+------+------+------+------+------| + * | H/Z |Shift | Z | X | C | V | B | | N | M | , < | . > | / ? | Up |Shift | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | Fn | Ctrl | Win | Alt | Mhen |LOWER |Space | |Space |RAISE | Henk | Menu | Left | Down |Right | + * `------------------------------------------------' `------------------------------------------------' + */ + [_WIN] = LAYOUT( \ + KC_ESC, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, JP_AT, KC_BSPC, \ + KC_DELT, KC_RCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, JP_COLN, KC_ENT, \ + KC_ZKHK, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_UP, KC_RSFT, \ + FN, KC_LCTL, KC_LGUI, KC_LALT, KC_MHEN, LOWER, KC_SPC, KC_SPC, RAISE, KC_HENK, KC_APP, KC_LEFT, KC_DOWN, KC_RGHT \ + ), + + /* MACOS + * ,------------------------------------------------. ,------------------------------------------------. + * | Esc | Tab | Q | W | E | R | T | | Y | U | I | O | P | @ ` | Bksp | + * |------+------+------+------+------+------+------| |-------------+------+------+------+------+------| + * | Del | Ctrl | A | S | D | F | G | | H | J | K | L | ; + | ; * |Enter | + * |------+------+------+------+------+------+------| |------|------+------+------+------+------+------| + * | Caps |Shift | Z | X | C | V | B | | N | M | , < | . > | / ? | Up |Shift | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | Fn | Ctrl | Opt | Cmd | Eisu |LOWER |Space | |Space |RAISE | Kana | Cmd | Left | Down |Right | + * `------------------------------------------------' `------------------------------------------------' + */ + [_MACOS] = LAYOUT( \ + KC_ESC, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, JP_AT, KC_BSPC, \ + KC_DELT, KC_RCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, JP_COLN, KC_ENT, \ + KC_CAPS, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_UP, KC_RSFT, \ + FN, KC_LCTL, KC_LALT, KC_LGUI, KC_EISU, LOWER, KC_SPC, KC_SPC, RAISE, KC_KNA, KC_RGUI, KC_LEFT, KC_DOWN, KC_RGHT \ + ), + + /* LOWER + * ,------------------------------------------------. ,------------------------------------------------. + * | | | ! | " | # | $ | % | | & | ' | ( | ) | | = | | + * |------+------+------+------+------+------+------| |-------------+------+------+------+------+------| + * | | | XXXX | XXXX | XXXX | { | ( | | ) | } | XXXX | ~ | | | _ | | + * |------+------+------+------+------+------+------| |------|------+------+------+------+------+------| + * | | | XXXX | XXXX | XXXX | XXXX | XXXX | | XXXX | XXXX | XXXX | XXXX | XXXX | PgUp | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | | | | | | | | | | Home | PgDn | End | + * `------------------------------------------------' `------------------------------------------------' + */ + [_LOWER] = LAYOUT( \ + _______, _______, S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), S(KC_7), S(KC_8), S(KC_9), S(KC_0), JP_EQL, _______, \ + _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, JP_LCBR, JP_LPRN, JP_RPRN, JP_RCBR, XXXXXXX, JP_TILD, JP_PIPE, JP_UNDS, _______, \ + _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_PGUP, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_END \ + ), + + /* RAISE + * ,------------------------------------------------. ,------------------------------------------------. + * | | | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | - | | + * |------+------+------+------+------+------+------| |-------------+------+------+------+------+------| + * | | | F11 | F12 | XXXX | [ | ( | | ) | ] | XXXX | ^ | \ | \ | | + * |------+------+------+------+------+------+------| |------|------+------+------+------+------+------| + * | | | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | | | | | | | | | | | | | + * `------------------------------------------------' `------------------------------------------------' + */ + [_RAISE] = LAYOUT( \ + _______, _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, _______, \ + _______, _______, KC_F11, KC_F12, XXXXXXX, JP_LBRC, JP_LPRN, JP_RPRN, JP_RBRC, XXXXXXX, JP_CIRC, KC_JYEN, KC_RO, _______, \ + _______, _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), + + /* FUNC + * ,------------------------------------------------. ,------------------------------------------------. + * |Reset | | XXXX | XXXX | XXXX | XXXX | XXXX | |PrtSc |SLock |Pause | XXXX | XXXX | XXXX | | + * |------+------+------+------+------+------+------| |-------------+------+------+------+------+------| + * | | | XXXX | XXXX | XXXX | XXXX | >Win | | Ins | XXXX | XXXX | XXXX | XXXX | XXXX | | + * |------+------+------+------+------+------+------| |------|------+------+------+------+------+------| + * | | | XXXX | XXXX | XXXX | XXXX | >Mac | | XXXX | XXXX | XXXX | XXXX | XXXX | Vol+ | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | | | | | | | | | | | Vol- | Play | + * `------------------------------------------------' `------------------------------------------------' + */ + [_FUNC] = LAYOUT( \ + RESET, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_PSCR, KC_SLCK, KC_PAUS, XXXXXXX, XXXXXXX, XXXXXXX, _______, \ + _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, WIN, KC_INS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, \ + _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, MACOS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_VOLU, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, XXXXXXX, KC_VOLD, KC_MPLY \ + ) +}; + diff --git a/keyboards/ergo42/keymaps/koba/readme.md b/keyboards/ergo42/keymaps/koba/readme.md new file mode 100644 index 000000000..1fe054390 --- /dev/null +++ b/keyboards/ergo42/keymaps/koba/readme.md @@ -0,0 +1,57 @@ +# Keymap for Ergo42 + +## About + +This keymap is for Ergo42. + +- JIS layout. +- Independent Windows layout/MacOS layout layers. +- Bottom row keys arranged like a standard keyboard. +- Arrow keys are designed in the inverted-T. + +## Layout + +![keyboard-layout](https://user-images.githubusercontent.com/1042121/45888288-aa35ed00-bdf8-11e8-8741-71fe9a0fadc6.png) + +## Windows mode/MacOS mode + +|mode |key | +|------------|------------| +|Windows mode|Function + g| +|MacOS mode |Function + b| + +When switching mode, the following keys switches. + +|Windows |MacOS | +|---------------|------------| +|Alt |Command(GUI)| +|Windows(GUI) |Option(Alt) | +|Menu(App) |Command(GUI)| +|Muhenkan |Eisu | +|Henkan |Kana | +|Hankaku/Zenkaku|Caps | + +## Layers + +|No.|Name |Description | +|---|--------|---------------------------| +| 4 |Function|Mode switch, Media | +| 3 |Raise |Number, Function | +| 2 |Lower |Symbol, Home/End, PgUp/PgDn| +| 1 |MacOS |MacOS layout | +| 0 |Windows |Windows layout | + +When power is turn on, No.0 Windows layer becomes enabled. + +## Windows/MacOS layers + +Standard layers for Windows mode/MacOS mode. + +## Raise/Lower layers + +Layer enabled during pressing Raise or Lower key. + +## Function layer + +Layer enabled during pressing Function key. + diff --git a/keyboards/ergo42/keymaps/koba/readme_ja.md b/keyboards/ergo42/keymaps/koba/readme_ja.md new file mode 100644 index 000000000..e1dbda821 --- /dev/null +++ b/keyboards/ergo42/keymaps/koba/readme_ja.md @@ -0,0 +1,62 @@ +# Keymap for Ergo42 + +## 概要 + +Ergo42 用キーマップです。 + +- JIS 配列 +- 独立した Windows 配列/MacOS 配列レイヤー +- 普通のキーボード配列に似せた最下段キー +- 逆 T 字 (凸型) 配列の矢印キー + +## レイアウト + +![keyboard-layout](https://user-images.githubusercontent.com/1042121/45888288-aa35ed00-bdf8-11e8-8741-71fe9a0fadc6.png) + +## Windows モード/MacOS モード + +|モード |キー | +|--------------|------------| +|Windows モード|Function + g| +|MacOS モード |Function + b| + +モードを切り替えることで下記のキーが切り替わります。 + +|Windows |MacOS | +|------------|------------| +|Alt |Command(GUI)| +|Windows(GUI)|Option(Alt) | +|Menu(App) |Command(GUI)| +|無変換 |英数 | +|変換 |かな | +|半角/全角 |Caps | + +## レイヤー + +|No.|名称 |内容 | +|---|--------|--------------------------| +| 4 |Function|モード切替, メディア | +| 3 |Raise |数字, ファンクションキー | +| 2 |Lower |記号, Home/End, PgUp/PgDn | +| 1 |MacOS |MacOS 配列 | +| 0 |Windows |Windows 配列 | + +電源 ON により No.0 の Windows レイヤーが有効になります。 + +## Windows/MacOS レイヤー + +Windows モード/MacOS モードの標準レイヤー。 + +## Raise/Lower レイヤー + +Raise キーまたは Lower キーを押している間だけ有効になるレイヤー。 + +普通のキーボードの最上段キー (数字/記号) に加えて、標準レイヤーに入らなかった記号キーが3つ (`[{`, `]}`, `\_`) 入っています。 +括弧キー `[{`, `]}` は `(`, `)` を加えて、左右対称に配置しました。 + +## Function レイヤー + +Function キーを押している間だけ有効になるレイヤー。 + +Windows モード/MacOS モードの切り替え、メディア系の操作、標準レイヤーに入らなかった機能キーのレイヤーです。 + From 722f06ff8c7c77843cc5be14d9fdb7d68a16ebf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20=C4=90or=C4=91evi=C4=87?= Date: Wed, 26 Sep 2018 20:08:56 +0200 Subject: [PATCH 144/788] Keymap: Update whitefox/konstantin keymap (#3980) * Rename constexpr keymap folder to konstantin * Replace numpad comma with Unicode comma * Rename tap dance constants * Move record->event.pressed check into switch * Use RShift as a dedicated Fn key --- .../{constexpr => konstantin}/config.h | 4 +- .../{constexpr => konstantin}/keymap.c | 50 ++++++++++--------- .../{constexpr => konstantin}/rules.mk | 0 3 files changed, 29 insertions(+), 25 deletions(-) rename keyboards/whitefox/keymaps/{constexpr => konstantin}/config.h (100%) rename keyboards/whitefox/keymaps/{constexpr => konstantin}/keymap.c (80%) rename keyboards/whitefox/keymaps/{constexpr => konstantin}/rules.mk (100%) diff --git a/keyboards/whitefox/keymaps/constexpr/config.h b/keyboards/whitefox/keymaps/konstantin/config.h similarity index 100% rename from keyboards/whitefox/keymaps/constexpr/config.h rename to keyboards/whitefox/keymaps/konstantin/config.h index b4bc05acf..ad40105a7 100644 --- a/keyboards/whitefox/keymaps/constexpr/config.h +++ b/keyboards/whitefox/keymaps/konstantin/config.h @@ -2,9 +2,9 @@ #define FORCE_NKRO -#define TAPPING_TOGGLE 2 -#define TAPPING_TERM 200 #define PERMISSIVE_HOLD +#define TAPPING_TERM 200 +#define TAPPING_TOGGLE 2 #define MOUSEKEY_DELAY 50 #define MOUSEKEY_INTERVAL 15 diff --git a/keyboards/whitefox/keymaps/constexpr/keymap.c b/keyboards/whitefox/keymaps/konstantin/keymap.c similarity index 80% rename from keyboards/whitefox/keymaps/constexpr/keymap.c rename to keyboards/whitefox/keymaps/konstantin/keymap.c index b19f1c81f..6998798e3 100644 --- a/keyboards/whitefox/keymaps/constexpr/keymap.c +++ b/keyboards/whitefox/keymaps/konstantin/keymap.c @@ -1,12 +1,14 @@ #include QMK_KEYBOARD_H +#define FN MO(L_FN) #define FN_CAPS LT(L_FN, KC_CAPS) -#define FN_CTRL TD(TD_FN_CTRL) -#define RL_ALT TD(TD_RL_ALT) // Unused +#define FN_RCTL TD(TD_FN_RCTL) // Unused +#define RLALT TD(TD_RLALT) // Unused #define TOP LCTL(KC_HOME) #define BOTTOM LCTL(KC_END) +#define UC_COMM UC(0x002C) #define UC_LPRN UC(0x0028) #define UC_RPRN UC(0x0029) #define UC_EQLS UC(0x003D) @@ -32,19 +34,21 @@ enum custom_keycodes { bool process_record_user(uint16_t keycode, keyrecord_t *record) { - if (!record->event.pressed) { return true; } - switch (keycode) { case CLEAR: - SEND_STRING(SS_LCTRL("a") SS_TAP(X_DELETE)); + if (record->event.pressed) { + SEND_STRING(SS_LCTRL("a") SS_TAP(X_DELETE)); + } return false; case NUMPAD: - layer_invert(L_NUMPAD); - bool num_lock = host_keyboard_leds() & 1<event.pressed) { + layer_invert(L_NUMPAD); + bool num_lock = host_keyboard_leds() & 1< Date: Thu, 27 Sep 2018 03:13:19 +0900 Subject: [PATCH 145/788] Keyboard: Crkbd stands for Corne Keyboard, not helidox (#3985) --- keyboards/crkbd/info.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/crkbd/info.json b/keyboards/crkbd/info.json index d74bb4943..45a0255c1 100644 --- a/keyboards/crkbd/info.json +++ b/keyboards/crkbd/info.json @@ -1,5 +1,5 @@ { - "keyboard_name": "crkbd (helidox) rev. 1", + "keyboard_name": "crkbd rev. 1", "url": "", "maintainer": "qmk", "width": 15, From dbdbbbd5c9b1458f682eec661d0a17f91dccb4dc Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Wed, 26 Sep 2018 12:17:54 -0700 Subject: [PATCH 146/788] Keyboard: Refactor XMMX keyboard to XMMX and Toad (#3955) * pull out toad keyboard and get it compiling * refactor xmmx * use the correct LAYOUT macros * move LED code out to toad.c file * move LED code out to xmmx.c file * adjust for correct number of columns and pins used * remove led set user --- keyboards/toad/config.h | 54 +++++++++++ .../keymaps/ansi_wk}/keymap.c | 19 +--- .../keymaps/ansi_wkl}/keymap.c | 21 +--- .../toad => toad/keymaps/default}/keymap.c | 21 +--- .../keymaps/iso_wk}/keymap.c | 21 +--- .../keymaps/iso_wkl}/keymap.c | 21 +--- keyboards/toad/readme.md | 14 +++ keyboards/toad/rules.mk | 56 +++++++++++ keyboards/toad/toad.c | 18 ++++ keyboards/toad/toad.h | 91 ++++++++++++++++++ .../{xmmx_ansi_wk => ansi_wk}/keymap.c | 21 +--- .../{xmmx_ansi_wkl => ansi_wkl}/keymap.c | 21 +--- keyboards/xmmx/keymaps/default/keymap.c | 21 +--- .../keymaps/{xmmx_iso_wk => iso_wk}/keymap.c | 21 +--- .../{xmmx_iso_wkl => iso_wkl}/keymap.c | 21 +--- keyboards/xmmx/readme.md | 8 +- keyboards/xmmx/xmmx.c | 17 ++++ keyboards/xmmx/xmmx.h | 96 +------------------ 18 files changed, 276 insertions(+), 286 deletions(-) create mode 100644 keyboards/toad/config.h rename keyboards/{xmmx/keymaps/toad_ansi_wk => toad/keymaps/ansi_wk}/keymap.c (68%) rename keyboards/{xmmx/keymaps/toad_ansi_wkl => toad/keymaps/ansi_wkl}/keymap.c (67%) rename keyboards/{xmmx/keymaps/toad => toad/keymaps/default}/keymap.c (69%) rename keyboards/{xmmx/keymaps/toad_iso_wk => toad/keymaps/iso_wk}/keymap.c (68%) rename keyboards/{xmmx/keymaps/toad_iso_wkl => toad/keymaps/iso_wkl}/keymap.c (67%) create mode 100644 keyboards/toad/readme.md create mode 100644 keyboards/toad/rules.mk create mode 100644 keyboards/toad/toad.c create mode 100644 keyboards/toad/toad.h rename keyboards/xmmx/keymaps/{xmmx_ansi_wk => ansi_wk}/keymap.c (73%) rename keyboards/xmmx/keymaps/{xmmx_ansi_wkl => ansi_wkl}/keymap.c (73%) rename keyboards/xmmx/keymaps/{xmmx_iso_wk => iso_wk}/keymap.c (73%) rename keyboards/xmmx/keymaps/{xmmx_iso_wkl => iso_wkl}/keymap.c (73%) diff --git a/keyboards/toad/config.h b/keyboards/toad/config.h new file mode 100644 index 000000000..f1d32c15b --- /dev/null +++ b/keyboards/toad/config.h @@ -0,0 +1,54 @@ +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6776 +#define DEVICE_VER 0x0001 +#define MANUFACTURER farmakon +#define PRODUCT "TOAD" +#define DESCRIPTION "TOAD" + +/* key matrix size */ +#define MATRIX_ROWS 6 +#define MATRIX_COLS 14 + +/* key matrix pins */ +#define MATRIX_ROW_PINS { B0, F6, F5, F4, F1, F0 } +#define MATRIX_COL_PINS { B3, B2, B1, E6, B7, C7, C6, D4, D6, D7, B4, D0, D1, F7 } +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* number of backlight levels */ + +#ifdef BACKLIGHT_PIN +#define BACKLIGHT_LEVELS 0 +#endif + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCING_DELAY 5 + +/* 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 + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +#ifdef RGB_DI_PIN +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 0 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 +#endif + +#endif diff --git a/keyboards/xmmx/keymaps/toad_ansi_wk/keymap.c b/keyboards/toad/keymaps/ansi_wk/keymap.c similarity index 68% rename from keyboards/xmmx/keymaps/toad_ansi_wk/keymap.c rename to keyboards/toad/keymaps/ansi_wk/keymap.c index 5e61dfffb..a4fd348f0 100644 --- a/keyboards/xmmx/keymaps/toad_ansi_wk/keymap.c +++ b/keyboards/toad/keymaps/ansi_wk/keymap.c @@ -1,8 +1,8 @@ -#include "xmmx.h" +#include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - TOAD_KEYMAP_ANSI_WK( + LAYOUT_ansi_wk( KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,KC_MINS, KC_EQL, KC_BSPC, \ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,KC_LBRC, KC_RBRC, KC_BSLS, \ @@ -12,19 +12,4 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ) }; -void led_set_user(uint8_t usb_led) { - //LED1 - if (usb_led & (1 << USB_LED_CAPS_LOCK)) { - DDRB |= (1 << 6); PORTB &= ~(1 << 6); - } else { - DDRB &= ~(1 << 6); PORTB &= ~(1 << 6); - } - - //LED2 - if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { - DDRB |= (1 << 5); PORTB &= ~(1 << 5); - } else { - DDRB &= ~(1 << 5); PORTB &= ~(1 << 5); - } -} diff --git a/keyboards/xmmx/keymaps/toad_ansi_wkl/keymap.c b/keyboards/toad/keymaps/ansi_wkl/keymap.c similarity index 67% rename from keyboards/xmmx/keymaps/toad_ansi_wkl/keymap.c rename to keyboards/toad/keymaps/ansi_wkl/keymap.c index 7778b0652..7fb6b3b59 100644 --- a/keyboards/xmmx/keymaps/toad_ansi_wkl/keymap.c +++ b/keyboards/toad/keymaps/ansi_wkl/keymap.c @@ -1,8 +1,8 @@ -#include "xmmx.h" +#include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - TOAD_KEYMAP_ANSI_WKL( + LAYOUT_ansi_wkl( KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,KC_MINS, KC_EQL, KC_BSPC, \ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,KC_LBRC, KC_RBRC, KC_BSLS, \ @@ -11,20 +11,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LALT, KC_SPC, KC_RALT, KC_RCTL ) }; - -void led_set_user(uint8_t usb_led) { - - //LED1 - if (usb_led & (1 << USB_LED_CAPS_LOCK)) { - DDRB |= (1 << 6); PORTB &= ~(1 << 6); - } else { - DDRB &= ~(1 << 6); PORTB &= ~(1 << 6); - } - - //LED2 - if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { - DDRB |= (1 << 5); PORTB &= ~(1 << 5); - } else { - DDRB &= ~(1 << 5); PORTB &= ~(1 << 5); - } -} diff --git a/keyboards/xmmx/keymaps/toad/keymap.c b/keyboards/toad/keymaps/default/keymap.c similarity index 69% rename from keyboards/xmmx/keymaps/toad/keymap.c rename to keyboards/toad/keymaps/default/keymap.c index c13dc8f67..4c30bdc44 100644 --- a/keyboards/xmmx/keymaps/toad/keymap.c +++ b/keyboards/toad/keymaps/default/keymap.c @@ -1,8 +1,8 @@ -#include "xmmx.h" +#include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - TOAD_KEYMAP( + LAYOUT_all( KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, \ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \ @@ -11,20 +11,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL ) }; - -void led_set_user(uint8_t usb_led) { - - //LED1 - if (usb_led & (1 << USB_LED_CAPS_LOCK)) { - DDRB |= (1 << 6); PORTB &= ~(1 << 6); - } else { - DDRB &= ~(1 << 6); PORTB &= ~(1 << 6); - } - - //LED2 - if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { - DDRB |= (1 << 5); PORTB &= ~(1 << 5); - } else { - DDRB &= ~(1 << 5); PORTB &= ~(1 << 5); - } -} diff --git a/keyboards/xmmx/keymaps/toad_iso_wk/keymap.c b/keyboards/toad/keymaps/iso_wk/keymap.c similarity index 68% rename from keyboards/xmmx/keymaps/toad_iso_wk/keymap.c rename to keyboards/toad/keymaps/iso_wk/keymap.c index c51ff862a..202550432 100644 --- a/keyboards/xmmx/keymaps/toad_iso_wk/keymap.c +++ b/keyboards/toad/keymaps/iso_wk/keymap.c @@ -1,8 +1,8 @@ -#include "xmmx.h" +#include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - TOAD_KEYMAP_ISO_WK( + LAYOUT_iso_wk( KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,KC_MINS, KC_EQL, KC_BSPC, \ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,KC_LBRC, KC_RBRC, \ @@ -11,20 +11,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI, KC_APP,KC_RCTL ) }; - -void led_set_user(uint8_t usb_led) { - - //LED1 - if (usb_led & (1 << USB_LED_CAPS_LOCK)) { - DDRB |= (1 << 6); PORTB &= ~(1 << 6); - } else { - DDRB &= ~(1 << 6); PORTB &= ~(1 << 6); - } - - //LED2 - if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { - DDRB |= (1 << 5); PORTB &= ~(1 << 5); - } else { - DDRB &= ~(1 << 5); PORTB &= ~(1 << 5); - } -} diff --git a/keyboards/xmmx/keymaps/toad_iso_wkl/keymap.c b/keyboards/toad/keymaps/iso_wkl/keymap.c similarity index 67% rename from keyboards/xmmx/keymaps/toad_iso_wkl/keymap.c rename to keyboards/toad/keymaps/iso_wkl/keymap.c index efcebc713..1659d7b38 100644 --- a/keyboards/xmmx/keymaps/toad_iso_wkl/keymap.c +++ b/keyboards/toad/keymaps/iso_wkl/keymap.c @@ -1,8 +1,8 @@ -#include "xmmx.h" +#include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - TOAD_KEYMAP_ISO_WKL( + LAYOUT_iso_wkl( KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,KC_MINS, KC_EQL, KC_BSPC, \ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,KC_LBRC, KC_RBRC, \ @@ -11,20 +11,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LALT, KC_SPC, KC_RALT, KC_RCTL ) }; - -void led_set_user(uint8_t usb_led) { - - //LED1 - if (usb_led & (1 << USB_LED_CAPS_LOCK)) { - DDRB |= (1 << 6); PORTB &= ~(1 << 6); - } else { - DDRB &= ~(1 << 6); PORTB &= ~(1 << 6); - } - - //LED2 - if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { - DDRB |= (1 << 5); PORTB &= ~(1 << 5); - } else { - DDRB &= ~(1 << 5); PORTB &= ~(1 << 5); - } -} diff --git a/keyboards/toad/readme.md b/keyboards/toad/readme.md new file mode 100644 index 000000000..3f3bff5b5 --- /dev/null +++ b/keyboards/toad/readme.md @@ -0,0 +1,14 @@ +# Toad + +Toad: 70% Mechanical Keyboard PCB. + +Toad schematic and PCB are available opensource under Creative Commons BY-SA 3.0 license on EasyEDA at [this link](https://easyeda.com/farmakon/70_Keyboard-d4f6baf4792d4ada9c0571fa3713e461) + +For more informations on the Toad please visit this [geekhack.org thread](https://geekhack.org/index.php?topic=91388.0) + +Make examples for these keyboards (after setting up your build environment): + + make toad:default + + +See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. diff --git a/keyboards/toad/rules.mk b/keyboards/toad/rules.mk new file mode 100644 index 000000000..ee87c6e8d --- /dev/null +++ b/keyboards/toad/rules.mk @@ -0,0 +1,56 @@ +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* +OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# comment out to disable the options. +# +BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE ?= no # Mouse keys(+4700) +EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) +CONSOLE_ENABLE ?= no # Console for debug(+400) +COMMAND_ENABLE ?= no # Commands for debug and configuration +SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend +NKRO_ENABLE ?= yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality +AUDIO_ENABLE ?= no +RGBLIGHT_ENABLE ?= no \ No newline at end of file diff --git a/keyboards/toad/toad.c b/keyboards/toad/toad.c new file mode 100644 index 000000000..bc4db0339 --- /dev/null +++ b/keyboards/toad/toad.c @@ -0,0 +1,18 @@ +#include "toad.h" + +void led_set_user(uint8_t usb_led) { + + //LED1 + if (usb_led & (1 << USB_LED_CAPS_LOCK)) { + DDRB |= (1 << 6); PORTB &= ~(1 << 6); + } else { + DDRB &= ~(1 << 6); PORTB &= ~(1 << 6); + } + + //LED2 + if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { + DDRB |= (1 << 5); PORTB &= ~(1 << 5); + } else { + DDRB &= ~(1 << 5); PORTB &= ~(1 << 5); + } +} diff --git a/keyboards/toad/toad.h b/keyboards/toad/toad.h new file mode 100644 index 000000000..154068e42 --- /dev/null +++ b/keyboards/toad/toad.h @@ -0,0 +1,91 @@ +#ifndef TOAD +#define TOAD + +#include "quantum.h" + +// 70% keyboard: default - all keys +#define LAYOUT_all( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K013, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \ + K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, \ + K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, \ + K500, K501, K502, K507, K510, K511, K512, K513 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113 }, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213 }, \ + { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313 }, \ + { K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413 }, \ + { K500, K501, K502, KC_NO,KC_NO,KC_NO,KC_NO,K507, KC_NO,KC_NO,K510, K511, K512, K513 } \ +} + +// 70% keyboard: ANSI Winkey +#define LAYOUT_ansi_wk( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K013, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \ + K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, \ + K400, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, \ + K500, K501, K502, K507, K510, K511, K512, K513 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, KC_NO}, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213 }, \ + { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO,K313 }, \ + { K400, KC_NO,K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, KC_NO}, \ + { K500, K501, K502, KC_NO,KC_NO,KC_NO,KC_NO,K507, KC_NO,KC_NO,K510, K511, K512, K513 } \ +} + +// 70% keyboard: ANSI Winkeyless +#define LAYOUT_ansi_wkl( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K013, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \ + K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, \ + K400, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, \ + K500, K502, K507, K511, K513 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, KC_NO}, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213 }, \ + { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO,K313 }, \ + { K400, KC_NO,K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, KC_NO}, \ + { K500, KC_NO,K502, KC_NO,KC_NO,KC_NO,KC_NO,K507, KC_NO,KC_NO,KC_NO,K511, KC_NO,K513 } \ +} + +// 70% keyboard: ISO Winkey +#define LAYOUT_iso_wk( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K013, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, \ + K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, \ + K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, \ + K500, K501, K502, K507, K510, K511, K512, K513 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, KC_NO}, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, KC_NO}, \ + { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313 }, \ + { K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, KC_NO}, \ + { K500, K501, K502, KC_NO,KC_NO,KC_NO,KC_NO,K507, KC_NO,KC_NO,K510, K511, K512, K513 } \ +} + +// 70% keyboard: ISO Winkeyless +#define LAYOUT_iso_wkl( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K013, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, \ + K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, \ + K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, \ + K500, K502, K507, K511, K513 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, KC_NO}, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, KC_NO}, \ + { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313 }, \ + { K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, KC_NO}, \ + { K500, KC_NO,K502, KC_NO,KC_NO,KC_NO,KC_NO,K507, KC_NO,KC_NO,KC_NO,K511, KC_NO,K513 } \ +} + +#endif diff --git a/keyboards/xmmx/keymaps/xmmx_ansi_wk/keymap.c b/keyboards/xmmx/keymaps/ansi_wk/keymap.c similarity index 73% rename from keyboards/xmmx/keymaps/xmmx_ansi_wk/keymap.c rename to keyboards/xmmx/keymaps/ansi_wk/keymap.c index 20d55c1fd..abdba99ba 100644 --- a/keyboards/xmmx/keymaps/xmmx_ansi_wk/keymap.c +++ b/keyboards/xmmx/keymaps/ansi_wk/keymap.c @@ -1,8 +1,8 @@ -#include "xmmx.h" +#include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - KEYMAP_ANSI_WK( + LAYOUT_ansi_wk( KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, \ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,KC_MINS, KC_EQL, KC_BSPC, KC_INS,KC_HOME, KC_PGUP, \ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, \ @@ -11,20 +11,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI, KC_APP,KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT ) }; - -void led_set_user(uint8_t usb_led) { - - //LED1 - if (usb_led & (1 << USB_LED_CAPS_LOCK)) { - DDRB |= (1 << 6); PORTB &= ~(1 << 6); - } else { - DDRB &= ~(1 << 6); PORTB &= ~(1 << 6); - } - - //LED2 - if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { - DDRB |= (1 << 5); PORTB &= ~(1 << 5); - } else { - DDRB &= ~(1 << 5); PORTB &= ~(1 << 5); - } -} diff --git a/keyboards/xmmx/keymaps/xmmx_ansi_wkl/keymap.c b/keyboards/xmmx/keymaps/ansi_wkl/keymap.c similarity index 73% rename from keyboards/xmmx/keymaps/xmmx_ansi_wkl/keymap.c rename to keyboards/xmmx/keymaps/ansi_wkl/keymap.c index 3c8ba436f..aeb61ff2c 100644 --- a/keyboards/xmmx/keymaps/xmmx_ansi_wkl/keymap.c +++ b/keyboards/xmmx/keymaps/ansi_wkl/keymap.c @@ -1,8 +1,8 @@ -#include "xmmx.h" +#include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - KEYMAP_ANSI_WKL( + LAYOUT_ansi_wkl( KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, \ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,KC_MINS, KC_EQL, KC_BSPC, KC_INS,KC_HOME, KC_PGUP, \ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, \ @@ -11,20 +11,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT ) }; - -void led_set_user(uint8_t usb_led) { - - //LED1 - if (usb_led & (1 << USB_LED_CAPS_LOCK)) { - DDRB |= (1 << 6); PORTB &= ~(1 << 6); - } else { - DDRB &= ~(1 << 6); PORTB &= ~(1 << 6); - } - - //LED2 - if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { - DDRB |= (1 << 5); PORTB &= ~(1 << 5); - } else { - DDRB &= ~(1 << 5); PORTB &= ~(1 << 5); - } -} diff --git a/keyboards/xmmx/keymaps/default/keymap.c b/keyboards/xmmx/keymaps/default/keymap.c index 6b0a11432..a7522fe25 100644 --- a/keyboards/xmmx/keymaps/default/keymap.c +++ b/keyboards/xmmx/keymaps/default/keymap.c @@ -1,8 +1,8 @@ -#include "xmmx.h" +#include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - KEYMAP( + LAYOUT_all( KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, \ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, KC_INS,KC_HOME, KC_PGUP, \ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, \ @@ -11,20 +11,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI, KC_APP,KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT ) }; - -void led_set_user(uint8_t usb_led) { - - //LED1 - if (usb_led & (1 << USB_LED_CAPS_LOCK)) { - DDRB |= (1 << 6); PORTB &= ~(1 << 6); - } else { - DDRB &= ~(1 << 6); PORTB &= ~(1 << 6); - } - - //LED2 - if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { - DDRB |= (1 << 5); PORTB &= ~(1 << 5); - } else { - DDRB &= ~(1 << 5); PORTB &= ~(1 << 5); - } -} diff --git a/keyboards/xmmx/keymaps/xmmx_iso_wk/keymap.c b/keyboards/xmmx/keymaps/iso_wk/keymap.c similarity index 73% rename from keyboards/xmmx/keymaps/xmmx_iso_wk/keymap.c rename to keyboards/xmmx/keymaps/iso_wk/keymap.c index ee68253c7..882cb224a 100644 --- a/keyboards/xmmx/keymaps/xmmx_iso_wk/keymap.c +++ b/keyboards/xmmx/keymaps/iso_wk/keymap.c @@ -1,8 +1,8 @@ -#include "xmmx.h" +#include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - KEYMAP_ISO_WK( + LAYOUT_iso_wk( KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, \ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,KC_MINS, KC_EQL, KC_BSPC, KC_INS,KC_HOME, KC_PGUP, \ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,KC_LBRC, KC_RBRC, KC_DEL, KC_END, KC_PGDN, \ @@ -11,20 +11,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI, KC_APP,KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT ) }; - -void led_set_user(uint8_t usb_led) { - - //LED1 - if (usb_led & (1 << USB_LED_CAPS_LOCK)) { - DDRB |= (1 << 6); PORTB &= ~(1 << 6); - } else { - DDRB &= ~(1 << 6); PORTB &= ~(1 << 6); - } - - //LED2 - if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { - DDRB |= (1 << 5); PORTB &= ~(1 << 5); - } else { - DDRB &= ~(1 << 5); PORTB &= ~(1 << 5); - } -} diff --git a/keyboards/xmmx/keymaps/xmmx_iso_wkl/keymap.c b/keyboards/xmmx/keymaps/iso_wkl/keymap.c similarity index 73% rename from keyboards/xmmx/keymaps/xmmx_iso_wkl/keymap.c rename to keyboards/xmmx/keymaps/iso_wkl/keymap.c index c27914e45..18ba79e1f 100644 --- a/keyboards/xmmx/keymaps/xmmx_iso_wkl/keymap.c +++ b/keyboards/xmmx/keymaps/iso_wkl/keymap.c @@ -1,8 +1,8 @@ -#include "xmmx.h" +#include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - KEYMAP_ISO_WKL( + LAYOUT_iso_wkl( KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, \ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,KC_MINS, KC_EQL, KC_BSPC, KC_INS,KC_HOME, KC_PGUP, \ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,KC_LBRC, KC_RBRC, KC_DEL, KC_END, KC_PGDN, \ @@ -11,20 +11,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT ) }; - -void led_set_user(uint8_t usb_led) { - - //LED1 - if (usb_led & (1 << USB_LED_CAPS_LOCK)) { - DDRB |= (1 << 6); PORTB &= ~(1 << 6); - } else { - DDRB &= ~(1 << 6); PORTB &= ~(1 << 6); - } - - //LED2 - if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { - DDRB |= (1 << 5); PORTB &= ~(1 << 5); - } else { - DDRB &= ~(1 << 5); PORTB &= ~(1 << 5); - } -} diff --git a/keyboards/xmmx/readme.md b/keyboards/xmmx/readme.md index cf16231e1..8f94df4b9 100644 --- a/keyboards/xmmx/readme.md +++ b/keyboards/xmmx/readme.md @@ -1,20 +1,14 @@ -XMMX and Toad -======== +# XMMX XMMX: Tenkeyless Mechanical Keyboard PCB designed to fit Filco Majestouch TKL and Cooler Master Quickfire Rapid cases -Toad: 70% Mechanical Keyboard PCB. XMMX schematic and PCB are available opensource under Creative Commons BY-SA 3.0 license on EasyEDA at [this link](https://easyeda.com/farmakon/XMMX-0447d28c1e4644b88fd04905d983684d) -Toad schematic and PCB are available opensource under Creative Commons BY-SA 3.0 license on EasyEDA at [this link](https://easyeda.com/farmakon/70_Keyboard-d4f6baf4792d4ada9c0571fa3713e461) For more informations on the XMMX please visit this [geekhack.org thread](https://geekhack.org/index.php?topic=93422.0) -For more informations on the Toad please visit this [geekhack.org thread](https://geekhack.org/index.php?topic=91388.0) Make examples for these keyboards (after setting up your build environment): make xmmx:default - make xmmx:toad - See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. diff --git a/keyboards/xmmx/xmmx.c b/keyboards/xmmx/xmmx.c index 399ae4eb4..4d410e90a 100644 --- a/keyboards/xmmx/xmmx.c +++ b/keyboards/xmmx/xmmx.c @@ -1 +1,18 @@ #include "xmmx.h" + +void led_set_user(uint8_t usb_led) { + + //LED1 + if (usb_led & (1 << USB_LED_CAPS_LOCK)) { + DDRB |= (1 << 6); PORTB &= ~(1 << 6); + } else { + DDRB &= ~(1 << 6); PORTB &= ~(1 << 6); + } + + //LED2 + if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { + DDRB |= (1 << 5); PORTB &= ~(1 << 5); + } else { + DDRB &= ~(1 << 5); PORTB &= ~(1 << 5); + } +} diff --git a/keyboards/xmmx/xmmx.h b/keyboards/xmmx/xmmx.h index ad6ae3014..22d0f1480 100644 --- a/keyboards/xmmx/xmmx.h +++ b/keyboards/xmmx/xmmx.h @@ -4,7 +4,7 @@ #include "quantum.h" // 80% keyboard: default - all keys -#define KEYMAP( \ +#define LAYOUT_all( \ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K015, K016, \ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K013, K114, K115, K116, \ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216, \ @@ -21,7 +21,7 @@ } // 80% keyboard: ANSI Winkey -#define KEYMAP_ANSI_WK( \ +#define LAYOUT_ansi_wk( \ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K015, K016, \ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116, \ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216, \ @@ -38,7 +38,7 @@ } // 80% keyboard: ANSI Winkeyless -#define KEYMAP_ANSI_WKL( \ +#define LAYOUT_ansi_wkl( \ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K015, K016, \ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116, \ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216, \ @@ -55,7 +55,7 @@ } // 80% keyboard: ISO Winkey -#define KEYMAP_ISO_WK( \ +#define LAYOUT_iso_wk( \ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K015, K016, \ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116, \ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K214, K215, K216, \ @@ -72,7 +72,7 @@ } // 80% keyboard: ISO Winkeyless -#define KEYMAP_ISO_WKL( \ +#define LAYOUT_iso_wkl( \ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K015, K016, \ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116, \ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K214, K215, K216, \ @@ -88,90 +88,4 @@ { K500, KC_NO,K502, KC_NO,KC_NO,KC_NO,KC_NO,K507, KC_NO,KC_NO,KC_NO,K511, KC_NO,K513, K514, K515, K516 } \ } - -// 70% keyboard: default - all keys -#define TOAD_KEYMAP( \ - K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, \ - K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K013, \ - K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \ - K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, \ - K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, \ - K500, K501, K502, K507, K510, K511, K512, K513 \ -) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013 }, \ - { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113 }, \ - { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213 }, \ - { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313 }, \ - { K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413 }, \ - { K500, K501, K502, KC_NO,KC_NO,KC_NO,KC_NO,K507, KC_NO,KC_NO,K510, K511, K512, K513 } \ -} - -// 70% keyboard: ANSI Winkey -#define TOAD_KEYMAP_ANSI_WK( \ - K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, \ - K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K013, \ - K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \ - K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, \ - K400, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, \ - K500, K501, K502, K507, K510, K511, K512, K513 \ -) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013 }, \ - { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, KC_NO}, \ - { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213 }, \ - { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO,K313 }, \ - { K400, KC_NO,K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, KC_NO}, \ - { K500, K501, K502, KC_NO,KC_NO,KC_NO,KC_NO,K507, KC_NO,KC_NO,K510, K511, K512, K513 } \ -} - -// 70% keyboard: ANSI Winkeyless -#define TOAD_KEYMAP_ANSI_WKL( \ - K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, \ - K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K013, \ - K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \ - K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, \ - K400, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, \ - K500, K502, K507, K511, K513 \ -) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013 }, \ - { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, KC_NO}, \ - { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213 }, \ - { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO,K313 }, \ - { K400, KC_NO,K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, KC_NO}, \ - { K500, KC_NO,K502, KC_NO,KC_NO,KC_NO,KC_NO,K507, KC_NO,KC_NO,KC_NO,K511, KC_NO,K513 } \ -} - -// 70% keyboard: ISO Winkey -#define TOAD_KEYMAP_ISO_WK( \ - K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, \ - K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K013, \ - K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, \ - K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, \ - K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, \ - K500, K501, K502, K507, K510, K511, K512, K513 \ -) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013 }, \ - { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, KC_NO}, \ - { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, KC_NO}, \ - { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313 }, \ - { K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, KC_NO}, \ - { K500, K501, K502, KC_NO,KC_NO,KC_NO,KC_NO,K507, KC_NO,KC_NO,K510, K511, K512, K513 } \ -} - -// 70% keyboard: ISO Winkeyless -#define TOAD_KEYMAP_ISO_WKL( \ - K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, \ - K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K013, \ - K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, \ - K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, \ - K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, \ - K500, K502, K507, K511, K513 \ -) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013 }, \ - { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, KC_NO}, \ - { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, KC_NO}, \ - { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313 }, \ - { K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, KC_NO}, \ - { K500, KC_NO,K502, KC_NO,KC_NO,KC_NO,KC_NO,K507, KC_NO,KC_NO,KC_NO,K511, KC_NO,K513 } \ -} - #endif From 96648a133de7f297157b7d447be59354c1200c09 Mon Sep 17 00:00:00 2001 From: mtdjr Date: Wed, 26 Sep 2018 15:23:30 -0400 Subject: [PATCH 147/788] Keymap: mtdjr userspace changes and Nyquist keymap addition (#3940) * holefully correct error in mtdjr userspace for layer_state_set_user * return state and wrap rgb actions in their own conditional * mtdjr nyquist and userspace updates * mtdjr updates as requested --- keyboards/nyquist/keymaps/mtdjr/config.h | 36 +++++++++++++ keyboards/nyquist/keymaps/mtdjr/keymap.c | 64 ++++++++++++++++++++++++ keyboards/nyquist/keymaps/mtdjr/rules.mk | 2 + users/mtdjr/mtdjr.c | 2 +- users/mtdjr/mtdjr.h | 2 +- 5 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 keyboards/nyquist/keymaps/mtdjr/config.h create mode 100644 keyboards/nyquist/keymaps/mtdjr/keymap.c create mode 100644 keyboards/nyquist/keymaps/mtdjr/rules.mk diff --git a/keyboards/nyquist/keymaps/mtdjr/config.h b/keyboards/nyquist/keymaps/mtdjr/config.h new file mode 100644 index 000000000..0fa606f29 --- /dev/null +++ b/keyboards/nyquist/keymaps/mtdjr/config.h @@ -0,0 +1,36 @@ +/* +Copyright 2017 Danny Nguyen + +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 . +*/ + +#pragma once + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + +#undef RGBLED_NUM +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 12 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 diff --git a/keyboards/nyquist/keymaps/mtdjr/keymap.c b/keyboards/nyquist/keymaps/mtdjr/keymap.c new file mode 100644 index 000000000..668e7964b --- /dev/null +++ b/keyboards/nyquist/keymaps/mtdjr/keymap.c @@ -0,0 +1,64 @@ +#include QMK_KEYBOARD_H +#include "mtdjr.h" + +extern keymap_config_t keymap_config; + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_QWERTY] = LAYOUT_kc ( +// ,-----------------------------. .-----------------------------. + GESC, 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,BSPC, +// |----+----+----+----+----+----| |----+----+----+----+----+----| + TAB, Q , W , E , R , T , Y , U , I , O , P ,QUOT, +// |----+----+----+----+----+----| |----+----+----+----+----+----| + RASE, A , S , D , F , G , H , J , K , L ,SCLN, ENT, +// |----+----+----+----+----+----| |----+----+----+----+----+----| + LSFT, Z , X , C , V , B , N , M ,COMM, DOT,SLSH,xxxx, +// |----+----+----+----+----+----| |----+----+----+----+----+----| + LOWR,LCTL,LALT,LGUI, SPC, SPC, SPC, SPC,LEFT,DOWN, UP ,RGHT +// '-----------------------------' '-----------------------------' +), + + [_LOWER] = LAYOUT_kc( +// ,-----------------------------. .-----------------------------. + TILD,xxxx,xxxx,xxxx,xxxx,xxxx, xxxx,xxxx,xxxx,UNDS,PLUS, DEL, +// |----+----+----+----+----+----| |----+----+----+----+----+----| + xxxx,xxxx,xxxx,xxxx,xxxx,xxxx, xxxx,xxxx,xxxx,LBRC,RBRC,BSLS, +// |----+----+----+----+----+----| |----+----+----+----+----+----| + ,xxxx,xxxx,xxxx,xxxx,xxxx, xxxx,xxxx,xxxx,xxxx,xxxx, , +// |----+----+----+----+----+----| |----+----+----+----+----+----| + xxxx,UNDO, CUT,XCPY,XINS,xxxx, xxxx,xxxx,xxxx,xxxx,xxxx,xxxx, +// |----+----+----+----+----+----| |----+----+----+----+----+----| + , , , , , , , ,MNXT,VOLD,VOLU,MPLY +// '-----------------------------' '-----------------------------' +), + + [_RAISE] = LAYOUT_kc( +// ,-----------------------------. .-----------------------------. + xxxx,xxxx,xxxx,xxxx,xxxx,xxxx, xxxx,xxxx,xxxx,MINS, EQL, , +// |----+----+----+----+----+----| |----+----+----+----+----+----| + xxxx,xxxx,xxxx,xxxx,xxxx,xxxx, xxxx,xxxx,xxxx,LCBR,RCBR,PIPE, +// |----+----+----+----+----+----| |----+----+----+----+----+----| + ,xxxx,xxxx,xxxx,xxxx,xxxx, xxxx,xxxx,xxxx,xxxx,xxxx, , +// |----+----+----+----+----+----| |----+----+----+----+----+----| + xxxx,xxxx,xxxx,xxxx,xxxx,xxxx, xxxx,xxxx,xxxx,xxxx,xxxx,xxxx, +// |----+----+----+----+----+----| |----+----+----+----+----+----| + , , , , , , , ,MNXT,VOLD,VOLU,MPLY +// '-----------------------------' '-----------------------------' +), + + [_ADJUST] = LAYOUT_kc( +// ,-----------------------------. .-----------------------------. + xxxx,ROOT,PPLY,PSEF,xxxx,xxxx, F1 , F2 , F3 , F4 , F5 , F6 , +// |----+----+----+----+----+----| |----+----+----+----+----+----| + xxxx,xxxx,xxxx,xxxx, RST,xxxx, F7 , F8 , F9 , F10, F11, F12, +// |----+----+----+----+----+----| |----+----+----+----+----+----| + , RGB,RHUI,RSAI,RVAI, MOD, xxxx,xxxx,xxxx,xxxx,xxxx, , +// |----+----+----+----+----+----| |----+----+----+----+----+----| + xxxx,RBTH,RHUD,RSAD,RVAD,RMOD, xxxx,xxxx,xxxx,xxxx,xxxx, BLB, +// |----+----+----+----+----+----| |----+----+----+----+----+----| + ,xxxx,xxxx,xxxx, , , , ,BLOF, BLD, BLI,BLON +// '-----------------------------' '-----------------------------' +) + +}; diff --git a/keyboards/nyquist/keymaps/mtdjr/rules.mk b/keyboards/nyquist/keymaps/mtdjr/rules.mk new file mode 100644 index 000000000..d7463419b --- /dev/null +++ b/keyboards/nyquist/keymaps/mtdjr/rules.mk @@ -0,0 +1,2 @@ +RGBLIGHT_ENABLE = yes +BACKLIGHT_ENABLE = yes diff --git a/users/mtdjr/mtdjr.c b/users/mtdjr/mtdjr.c index d8d6871a1..c31b077b4 100644 --- a/users/mtdjr/mtdjr.c +++ b/users/mtdjr/mtdjr.c @@ -5,7 +5,7 @@ #endif #ifndef RGB_MODE - #define RGB_MODE 16 + #define RGB_MODE 2 #endif #ifndef RGB_HUE #define RGB_HUE 285 diff --git a/users/mtdjr/mtdjr.h b/users/mtdjr/mtdjr.h index 3efcb45ec..85ca1596d 100644 --- a/users/mtdjr/mtdjr.h +++ b/users/mtdjr/mtdjr.h @@ -95,7 +95,7 @@ enum user_tapdance { #define KC_BLD BL_DEC #define KC_BLB BL_BRTG #define KC_BLON BL_ON -#define KB_BLOF BL_OFF +#define KC_BLOF BL_OFF #endif From c7ce0d21dc07e1154b6a40cd621eb2eef075483b Mon Sep 17 00:00:00 2001 From: Florian Didron Date: Tue, 25 Sep 2018 11:32:23 +0900 Subject: [PATCH 148/788] Moves animation calculation logic out of the for loops --- quantum/rgb_matrix.c | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/quantum/rgb_matrix.c b/quantum/rgb_matrix.c index 8ad00c37d..5fb59af8c 100644 --- a/quantum/rgb_matrix.c +++ b/quantum/rgb_matrix.c @@ -438,10 +438,12 @@ void rgb_matrix_cycle_up_down(void) { void rgb_matrix_dual_beacon(void) { HSV hsv = { .h = rgb_matrix_config.hue, .s = rgb_matrix_config.sat, .v = rgb_matrix_config.val }; RGB rgb; - rgb_led led; + Point point; + double cos_value = cos(g_tick * PI / 128) / 32; + double sin_value = sin(g_tick * PI / 128) / 112; for (uint8_t i = 0; i < DRIVER_LED_TOTAL; i++) { - led = g_rgb_leds[i]; - hsv.h = ((led.point.y - 32.0)* cos(g_tick * PI / 128) / 32 + (led.point.x - 112.0) * sin(g_tick * PI / 128) / (112)) * (180) + rgb_matrix_config.hue; + point = g_rgb_leds[i].point; + hsv.h = ((point.y - 32.0)* cos_value + (point.x - 112.0) * sin_value) * (180) + rgb_matrix_config.hue; rgb = hsv_to_rgb( hsv ); rgb_matrix_set_color( i, rgb.r, rgb.g, rgb.b ); } @@ -450,10 +452,12 @@ void rgb_matrix_dual_beacon(void) { void rgb_matrix_rainbow_beacon(void) { HSV hsv = { .h = rgb_matrix_config.hue, .s = rgb_matrix_config.sat, .v = rgb_matrix_config.val }; RGB rgb; - rgb_led led; + Point point; + double cos_value = cos(g_tick * PI / 128); + double sin_value = sin(g_tick * PI / 128); for (uint8_t i = 0; i < DRIVER_LED_TOTAL; i++) { - led = g_rgb_leds[i]; - hsv.h = (1.5 * (rgb_matrix_config.speed == 0 ? 1 : rgb_matrix_config.speed)) * (led.point.y - 32.0)* cos(g_tick * PI / 128) + (1.5 * (rgb_matrix_config.speed == 0 ? 1 : rgb_matrix_config.speed)) * (led.point.x - 112.0) * sin(g_tick * PI / 128) + rgb_matrix_config.hue; + point = g_rgb_leds[i].point; + hsv.h = (1.5 * (rgb_matrix_config.speed == 0 ? 1 : rgb_matrix_config.speed)) * (point.y - 32.0)* cos_value + (1.5 * (rgb_matrix_config.speed == 0 ? 1 : rgb_matrix_config.speed)) * (point.x - 112.0) * sin_value + rgb_matrix_config.hue; rgb = hsv_to_rgb( hsv ); rgb_matrix_set_color( i, rgb.r, rgb.g, rgb.b ); } @@ -462,10 +466,12 @@ void rgb_matrix_rainbow_beacon(void) { void rgb_matrix_rainbow_pinwheels(void) { HSV hsv = { .h = rgb_matrix_config.hue, .s = rgb_matrix_config.sat, .v = rgb_matrix_config.val }; RGB rgb; - rgb_led led; + Point point; + double cos_value = cos(g_tick * PI / 128); + double sin_value = sin(g_tick * PI / 128); for (uint8_t i = 0; i < DRIVER_LED_TOTAL; i++) { - led = g_rgb_leds[i]; - hsv.h = (2 * (rgb_matrix_config.speed == 0 ? 1 : rgb_matrix_config.speed)) * (led.point.y - 32.0)* cos(g_tick * PI / 128) + (2 * (rgb_matrix_config.speed == 0 ? 1 : rgb_matrix_config.speed)) * (66 - abs(led.point.x - 112.0)) * sin(g_tick * PI / 128) + rgb_matrix_config.hue; + point = g_rgb_leds[i].point; + hsv.h = (2 * (rgb_matrix_config.speed == 0 ? 1 : rgb_matrix_config.speed)) * (point.y - 32.0)* cos_value + (2 * (rgb_matrix_config.speed == 0 ? 1 : rgb_matrix_config.speed)) * (66 - abs(point.x - 112.0)) * sin_value + rgb_matrix_config.hue; rgb = hsv_to_rgb( hsv ); rgb_matrix_set_color( i, rgb.r, rgb.g, rgb.b ); } @@ -474,12 +480,14 @@ void rgb_matrix_rainbow_pinwheels(void) { void rgb_matrix_rainbow_moving_chevron(void) { HSV hsv = { .h = rgb_matrix_config.hue, .s = rgb_matrix_config.sat, .v = rgb_matrix_config.val }; RGB rgb; - rgb_led led; + Point point; + uint8_t r = 128; + double cos_value = cos(r * PI / 128); + double sin_value = sin(r * PI / 128); + double multiplier = (g_tick / 256.0 * 224); for (uint8_t i = 0; i < DRIVER_LED_TOTAL; i++) { - led = g_rgb_leds[i]; - // uint8_t r = g_tick; - uint8_t r = 128; - hsv.h = (1.5 * (rgb_matrix_config.speed == 0 ? 1 : rgb_matrix_config.speed)) * abs(led.point.y - 32.0)* sin(r * PI / 128) + (1.5 * (rgb_matrix_config.speed == 0 ? 1 : rgb_matrix_config.speed)) * (led.point.x - (g_tick / 256.0 * 224)) * cos(r * PI / 128) + rgb_matrix_config.hue; + point = g_rgb_leds[i].point; + hsv.h = (1.5 * (rgb_matrix_config.speed == 0 ? 1 : rgb_matrix_config.speed)) * abs(point.y - 32.0)* sin_value + (1.5 * (rgb_matrix_config.speed == 0 ? 1 : rgb_matrix_config.speed)) * (point.x - multiplier) * cos_value + rgb_matrix_config.hue; rgb = hsv_to_rgb( hsv ); rgb_matrix_set_color( i, rgb.r, rgb.g, rgb.b ); } From ec0297027d5ad180af06d41dbfa351d313fe91e8 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Wed, 26 Sep 2018 19:19:38 -0700 Subject: [PATCH 149/788] Bugfix for 60_ansi_tsangan and 60_iso_tsangan layouts (#3987) This corrects the matrix macro reference for both of the keymap.c files in layouts/default. --- .../60_ansi_tsangan/default_60_ansi_tsangan/keymap.c | 12 ++++++------ .../60_iso_tsangan/default_60_iso_tsangan/keymap.c | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/layouts/default/60_ansi_tsangan/default_60_ansi_tsangan/keymap.c b/layouts/default/60_ansi_tsangan/default_60_ansi_tsangan/keymap.c index 8f7f5f8c6..e4562ede5 100644 --- a/layouts/default/60_ansi_tsangan/default_60_ansi_tsangan/keymap.c +++ b/layouts/default/60_ansi_tsangan/default_60_ansi_tsangan/keymap.c @@ -1,11 +1,11 @@ #include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = LAYOUT_60_ansi( - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL, KC_BSPC , - KC_TAB , KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC, KC_BSLS , - KC_CAPS , KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_ENT , - KC_LSFT , KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT , - KC_LCTL , KC_LGUI , KC_LALT , KC_SPC , KC_RALT , KC_RGUI , KC_RCTL + [0] = LAYOUT_60_ansi_tsangan( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL ) }; diff --git a/layouts/default/60_iso_tsangan/default_60_iso_tsangan/keymap.c b/layouts/default/60_iso_tsangan/default_60_iso_tsangan/keymap.c index 204a12d33..94d763020 100644 --- a/layouts/default/60_iso_tsangan/default_60_iso_tsangan/keymap.c +++ b/layouts/default/60_iso_tsangan/default_60_iso_tsangan/keymap.c @@ -1,11 +1,11 @@ #include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = LAYOUT_60_iso( - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, - KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, - KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, - KC_LCTRL, KC_LALT, KC_LGUI, KC_SPACE, KC_RGUI, KC_RALT, KC_RCTL + [0] = LAYOUT_60_iso_tsangan( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT, KC_RCTL ) }; From 12ad59f99de0ecd2c81b92587c2858b3fb39523c Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Wed, 26 Sep 2018 22:09:05 -0700 Subject: [PATCH 150/788] Keyboard: Treasure Macropad (#3988) * port macropad over to qmk * add bootloader size --- keyboards/macropad/config.h | 224 +++++++++++++++++++ keyboards/macropad/info.json | 12 + keyboards/macropad/keymaps/default/config.h | 19 ++ keyboards/macropad/keymaps/default/keymap.c | 64 ++++++ keyboards/macropad/keymaps/default/readme.md | 1 + keyboards/macropad/macropad.c | 43 ++++ keyboards/macropad/macropad.h | 40 ++++ keyboards/macropad/readme.md | 13 ++ keyboards/macropad/rules.mk | 81 +++++++ 9 files changed, 497 insertions(+) create mode 100644 keyboards/macropad/config.h create mode 100644 keyboards/macropad/info.json create mode 100644 keyboards/macropad/keymaps/default/config.h create mode 100644 keyboards/macropad/keymaps/default/keymap.c create mode 100644 keyboards/macropad/keymaps/default/readme.md create mode 100644 keyboards/macropad/macropad.c create mode 100644 keyboards/macropad/macropad.h create mode 100644 keyboards/macropad/readme.md create mode 100644 keyboards/macropad/rules.mk diff --git a/keyboards/macropad/config.h b/keyboards/macropad/config.h new file mode 100644 index 000000000..00f2e7811 --- /dev/null +++ b/keyboards/macropad/config.h @@ -0,0 +1,224 @@ +/* +Copyright 2018 MechMerlin + +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 . +*/ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0000 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Treasure +#define PRODUCT Macropad Type 9 +#define DESCRIPTION A custom macropad + +/* key matrix size */ +#define MATRIX_ROWS 3 +#define MATRIX_COLS 3 + +/* + * 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 { E6, D7, C6 } +#define MATRIX_COL_PINS { D1, D0, D4 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +#define BACKLIGHT_PIN B5 +// #define BACKLIGHT_BREATHING +#define BACKLIGHT_LEVELS 10 + +// #define RGB_DI_PIN E2 +// #ifdef RGB_DI_PIN +// #define RGBLIGHT_ANIMATIONS +// #define RGBLED_NUM 16 +// #define RGBLIGHT_HUE_STEP 8 +// #define RGBLIGHT_SAT_STEP 8 +// #define RGBLIGHT_VAL_STEP 8 +// #endif + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* 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 userful 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 + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * 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 + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +//#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ + diff --git a/keyboards/macropad/info.json b/keyboards/macropad/info.json new file mode 100644 index 000000000..f946ed153 --- /dev/null +++ b/keyboards/macropad/info.json @@ -0,0 +1,12 @@ +{ + "keyboard_name": "Macropad", + "url": "", + "maintainer": "qmk", + "width": 3, + "height": 3, + "layouts": { + "LAYOUT": { + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}] + } + } +} diff --git a/keyboards/macropad/keymaps/default/config.h b/keyboards/macropad/keymaps/default/config.h new file mode 100644 index 000000000..a3ed4f762 --- /dev/null +++ b/keyboards/macropad/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 MechMerlin + * + * 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 . + */ + +#pragma once + +// place overrides here diff --git a/keyboards/macropad/keymaps/default/keymap.c b/keyboards/macropad/keymaps/default/keymap.c new file mode 100644 index 000000000..300d5b1e4 --- /dev/null +++ b/keyboards/macropad/keymaps/default/keymap.c @@ -0,0 +1,64 @@ +/* Copyright 2018 MechMerlin + * + * 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 . + */ +#include QMK_KEYBOARD_H + +// Defines the keycodes used by our macros in process_record_user +enum custom_keycodes { + QMKBEST = SAFE_RANGE, + QMKURL +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( /* Base */ + KC_0, KC_1, KC_2, \ + KC_3, KC_4, KC_5, \ + KC_6, KC_7, KC_8 \ + ), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QMKBEST: + if (record->event.pressed) { + // when keycode QMKBEST is pressed + SEND_STRING("QMK is the best thing ever!"); + } else { + // when keycode QMKBEST is released + } + break; + case QMKURL: + if (record->event.pressed) { + // when keycode QMKURL is pressed + SEND_STRING("https://qmk.fm/" SS_TAP(X_ENTER)); + } else { + // when keycode QMKURL is released + } + break; + } + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/macropad/keymaps/default/readme.md b/keyboards/macropad/keymaps/default/readme.md new file mode 100644 index 000000000..bd3d78af2 --- /dev/null +++ b/keyboards/macropad/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for macropad diff --git a/keyboards/macropad/macropad.c b/keyboards/macropad/macropad.c new file mode 100644 index 000000000..0219746e1 --- /dev/null +++ b/keyboards/macropad/macropad.c @@ -0,0 +1,43 @@ +/* Copyright 2018 MechMerlin + * + * 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 . + */ +#include "macropad.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + + led_set_user(usb_led); +} diff --git a/keyboards/macropad/macropad.h b/keyboards/macropad/macropad.h new file mode 100644 index 000000000..94471d7c5 --- /dev/null +++ b/keyboards/macropad/macropad.h @@ -0,0 +1,40 @@ +/* Copyright 2018 MechMerlin + * + * 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 . + */ +#ifndef MACROPAD_H +#define MACROPAD_H + +#include "quantum.h" + +/* This a shortcut to help you visually see your layout. + * + * The first section contains all of the arguments representing the physical + * layout of the board and position of the keys. + * + * The second converts the arguments into a two-dimensional array which + * represents the switch matrix. + */ +#define LAYOUT( \ + K00, K01, K02, \ + K10, K11, K12, \ + K20, K21, K22 \ +) \ +{ \ + { K00, K01, K02 }, \ + { K10, K11, K12 }, \ + { K20, K21, K22 }, \ +} + +#endif diff --git a/keyboards/macropad/readme.md b/keyboards/macropad/readme.md new file mode 100644 index 000000000..204ec1fd2 --- /dev/null +++ b/keyboards/macropad/readme.md @@ -0,0 +1,13 @@ +# Macropad + +3x3 Macropad. + +Keyboard Maintainer: [MechMerlin](https://github.com/mechmerlin) +Hardware Supported: Treasure Macropad Type-9 +Hardware Availability: [Treasure](http://macropad.co/) + +Make example for this keyboard (after setting up your build environment): + + make macropad:default + +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). diff --git a/keyboards/macropad/rules.mk b/keyboards/macropad/rules.mk new file mode 100644 index 000000000..599974d25 --- /dev/null +++ b/keyboards/macropad/rules.mk @@ -0,0 +1,81 @@ +# MCU name +#MCU = at90usb1286 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = no # USB Nkey Rollover +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) From f70f45ee677a2a39a759052a356e0c5d82e25424 Mon Sep 17 00:00:00 2001 From: James Laird-Wah Date: Fri, 28 Sep 2018 00:40:18 +1000 Subject: [PATCH 151/788] RGB Matrix refactoring to open up for new drivers (#3913) * rgb_matrix: use a driver ops struct This is intended to avoid #ifdef proliferation on adding more drivers, eg. model01, which use different architectures. * rgb_matrix: document driver struct members * rgb_matrix: remove unused LED testing code * rgb_matrix: don't build into IS31x drivers unless being used * rgb_matrix: refactor make config options This ensures that the necessary files are included for any custom RGB_MATRIX_ENABLE value, without having to add entries here for specific boards. This particularly affects model01 because its controller is integrated and won't be used anywhere else, so it's preferable not to put it in common_features.mk. This now validates the value of RGB_MATRIX_ENABLE. It was necessary to fix an error in ergodox_ez rules.mk using the wrong comment separator, yielding an invalid value. * IS31x drivers: don't write the control registers all the time This is only needed when they are changed. This is done in init() and board- or keymap-specific code is free to make further changes. * rgb_matrix: move structs from chip drivers to rgb_matrix_drivers.c This approach is specific to the rgb_matrix functionality, so keep it neatly separated from the raw chip drivers. --- common_features.mk | 24 ++++---- drivers/issi/is31fl3731.c | 1 - drivers/issi/is31fl3733.c | 3 +- keyboards/ergodox_ez/rules.mk | 2 +- quantum/rgb_matrix.c | 113 ++-------------------------------- quantum/rgb_matrix.h | 17 ++++- quantum/rgb_matrix_drivers.c | 82 ++++++++++++++++++++++++ 7 files changed, 113 insertions(+), 129 deletions(-) create mode 100644 quantum/rgb_matrix_drivers.c diff --git a/common_features.mk b/common_features.mk index 7af778980..6c835abde 100644 --- a/common_features.mk +++ b/common_features.mk @@ -114,37 +114,35 @@ ifeq ($(strip $(RGBLIGHT_ENABLE)), yes) endif endif -ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes) +RGB_MATRIX_ENABLE ?= no +VALID_MATRIX_TYPES := yes IS31FL3731L IS31FL3733L custom +ifneq ($(strip $(RGB_MATRIX_ENABLE)), no) +ifeq ($(filter $(RGB_MATRIX_ENABLE),$(VALID_MATRIX_TYPES)),) + $(error RGB_MATRIX_ENABLE="$(RGB_MATRIX_ENABLE)" is not a valid matrix type) +endif OPT_DEFS += -DRGB_MATRIX_ENABLE - OPT_DEFS += -DIS31FL3731 - COMMON_VPATH += $(DRIVER_PATH)/issi - SRC += is31fl3731.c - SRC += i2c_master.c SRC += $(QUANTUM_DIR)/color.c SRC += $(QUANTUM_DIR)/rgb_matrix.c + SRC += $(QUANTUM_DIR)/rgb_matrix_drivers.c CIE1931_CURVE = yes endif +ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes) + RGB_MATRIX_ENABLE = IS31FL3731 +endif + ifeq ($(strip $(RGB_MATRIX_ENABLE)), IS31FL3731) - OPT_DEFS += -DRGB_MATRIX_ENABLE OPT_DEFS += -DIS31FL3731 COMMON_VPATH += $(DRIVER_PATH)/issi SRC += is31fl3731.c SRC += i2c_master.c - SRC += $(QUANTUM_DIR)/color.c - SRC += $(QUANTUM_DIR)/rgb_matrix.c - CIE1931_CURVE = yes endif ifeq ($(strip $(RGB_MATRIX_ENABLE)), IS31FL3733) - OPT_DEFS += -DRGB_MATRIX_ENABLE OPT_DEFS += -DIS31FL3733 COMMON_VPATH += $(DRIVER_PATH)/issi SRC += is31fl3733.c SRC += i2c_master.c - SRC += $(QUANTUM_DIR)/color.c - SRC += $(QUANTUM_DIR)/rgb_matrix.c - CIE1931_CURVE = yes endif ifeq ($(strip $(TAP_DANCE_ENABLE)), yes) diff --git a/drivers/issi/is31fl3731.c b/drivers/issi/is31fl3731.c index 4d0d6b8a5..c9155f5a3 100644 --- a/drivers/issi/is31fl3731.c +++ b/drivers/issi/is31fl3731.c @@ -268,4 +268,3 @@ void IS31FL3731_update_led_control_registers( uint8_t addr1, uint8_t addr2 ) } } } - diff --git a/drivers/issi/is31fl3733.c b/drivers/issi/is31fl3733.c index 4098b5468..c198ec517 100644 --- a/drivers/issi/is31fl3733.c +++ b/drivers/issi/is31fl3733.c @@ -24,10 +24,10 @@ #include "wait.h" #endif -#include "is31fl3733.h" #include #include "i2c_master.h" #include "progmem.h" +#include "rgb_matrix.h" // This is a 7-bit address, that gets left-shifted and bit 0 // set to 0 for write, 1 for read (as per I2C protocol) @@ -250,4 +250,3 @@ void IS31FL3733_update_led_control_registers( uint8_t addr1, uint8_t addr2 ) } } } - diff --git a/keyboards/ergodox_ez/rules.mk b/keyboards/ergodox_ez/rules.mk index dfbdba10d..ef2aefbb9 100644 --- a/keyboards/ergodox_ez/rules.mk +++ b/keyboards/ergodox_ez/rules.mk @@ -83,6 +83,6 @@ SWAP_HANDS_ENABLE= yes # Allow swapping hands of keyboard SLEEP_LED_ENABLE = no API_SYSEX_ENABLE = no RGBLIGHT_ENABLE = yes -RGB_MATRIX_ENABLE = no // enable later +RGB_MATRIX_ENABLE = no # enable later LAYOUTS = ergodox diff --git a/quantum/rgb_matrix.c b/quantum/rgb_matrix.c index 5fb59af8c..807e4d62d 100644 --- a/quantum/rgb_matrix.c +++ b/quantum/rgb_matrix.c @@ -18,7 +18,6 @@ #include "rgb_matrix.h" -#include "i2c_master.h" #include "progmem.h" #include "config.h" #include "eeprom.h" @@ -111,29 +110,15 @@ void map_row_column_to_led( uint8_t row, uint8_t column, uint8_t *led_i, uint8_t } void rgb_matrix_update_pwm_buffers(void) { -#ifdef IS31FL3731 - IS31FL3731_update_pwm_buffers( DRIVER_ADDR_1, DRIVER_ADDR_2 ); - IS31FL3731_update_led_control_registers( DRIVER_ADDR_1, DRIVER_ADDR_2 ); -#elif defined(IS31FL3733) - IS31FL3733_update_pwm_buffers( DRIVER_ADDR_1, DRIVER_ADDR_2 ); - IS31FL3733_update_led_control_registers( DRIVER_ADDR_1, DRIVER_ADDR_2 ); -#endif + rgb_matrix_driver.flush(); } void rgb_matrix_set_color( int index, uint8_t red, uint8_t green, uint8_t blue ) { -#ifdef IS31FL3731 - IS31FL3731_set_color( index, red, green, blue ); -#elif defined(IS31FL3733) - IS31FL3733_set_color( index, red, green, blue ); -#endif + rgb_matrix_driver.set_color(index, red, green, blue); } void rgb_matrix_set_color_all( uint8_t red, uint8_t green, uint8_t blue ) { -#ifdef IS31FL3731 - IS31FL3731_set_color_all( red, green, blue ); -#elif defined(IS31FL3733) - IS31FL3733_set_color_all( red, green, blue ); -#endif + rgb_matrix_driver.set_color_all(red, green, blue); } bool process_rgb_matrix(uint16_t keycode, keyrecord_t *record) { @@ -196,47 +181,6 @@ void rgb_matrix_test(void) { } } -// This tests the LEDs -// Note that it will change the LED control registers -// in the LED drivers, and leave them in an invalid -// state for other backlight effects. -// ONLY USE THIS FOR TESTING LEDS! -void rgb_matrix_single_LED_test(void) { - static uint8_t color = 0; // 0,1,2 for R,G,B - static uint8_t row = 0; - static uint8_t column = 0; - - static uint8_t tick = 0; - tick++; - - if ( tick > 2 ) - { - tick = 0; - column++; - } - if ( column > MATRIX_COLS ) - { - column = 0; - row++; - } - if ( row > MATRIX_ROWS ) - { - row = 0; - color++; - } - if ( color > 2 ) - { - color = 0; - } - - uint8_t led[8], led_count; - map_row_column_to_led(row,column,led,&led_count); - for(uint8_t i = 0; i < led_count; i++) { - rgb_matrix_set_color_all( 40, 40, 40 ); - rgb_matrix_test_led( led[i], color==0, color==1, color==2 ); - } -} - // All LEDs off void rgb_matrix_all_off(void) { rgb_matrix_set_color_all( 0, 0, 0 ); @@ -817,7 +761,7 @@ void rgb_matrix_indicators_user(void) {} // } void rgb_matrix_init(void) { - rgb_matrix_setup_drivers(); + rgb_matrix_driver.init(); // TODO: put the 1 second startup delay here? @@ -841,33 +785,6 @@ void rgb_matrix_init(void) { eeconfig_debug_rgb_matrix(); // display current eeprom values } -void rgb_matrix_setup_drivers(void) { - // Initialize TWI - i2c_init(); -#ifdef IS31FL3731 - IS31FL3731_init( DRIVER_ADDR_1 ); - IS31FL3731_init( DRIVER_ADDR_2 ); -#elif defined (IS31FL3733) - IS31FL3733_init( DRIVER_ADDR_1 ); -#endif - - for ( int index = 0; index < DRIVER_LED_TOTAL; index++ ) { - bool enabled = true; - // This only caches it for later -#ifdef IS31FL3731 - IS31FL3731_set_led_control_register( index, enabled, enabled, enabled ); -#elif defined (IS31FL3733) - IS31FL3733_set_led_control_register( index, enabled, enabled, enabled ); -#endif - } - // This actually updates the LED drivers -#ifdef IS31FL3731 - IS31FL3731_update_led_control_registers( DRIVER_ADDR_1, DRIVER_ADDR_2 ); -#elif defined (IS31FL3733) - IS31FL3733_update_led_control_registers( DRIVER_ADDR_1, DRIVER_ADDR_2 ); -#endif -} - // Deals with the messy details of incrementing an integer uint8_t increment( uint8_t value, uint8_t step, uint8_t min, uint8_t max ) { int16_t new_value = value; @@ -910,28 +827,6 @@ uint8_t decrement( uint8_t value, uint8_t step, uint8_t min, uint8_t max ) { // } // } -void rgb_matrix_test_led( uint8_t index, bool red, bool green, bool blue ) { - for ( int i=0; i. + */ + +#include "rgb_matrix.h" + +/* Each driver needs to define the struct + * const rgb_matrix_driver_t rgb_matrix_driver; + * All members must be provided. + * Keyboard custom drivers can define this in their own files, it should only + * be here if shared between boards. + */ + +#if defined(IS31FL3731) || defined(IS31FL3733) + +#include "i2c_master.h" + +static void init( void ) +{ + i2c_init(); +#ifdef IS31FL3731 + IS31FL3731_init( DRIVER_ADDR_1 ); + IS31FL3731_init( DRIVER_ADDR_2 ); +#else + IS31FL3733_init( DRIVER_ADDR_1 ); +#endif + for ( int index = 0; index < DRIVER_LED_TOTAL; index++ ) { + bool enabled = true; + // This only caches it for later +#ifdef IS31FL3731 + IS31FL3731_set_led_control_register( index, enabled, enabled, enabled ); +#else + IS31FL3733_set_led_control_register( index, enabled, enabled, enabled ); +#endif + } + // This actually updates the LED drivers +#ifdef IS31FL3731 + IS31FL3731_update_led_control_registers( DRIVER_ADDR_1, DRIVER_ADDR_2 ); +#else + IS31FL3733_update_led_control_registers( DRIVER_ADDR_1, DRIVER_ADDR_2 ); +#endif +} + +#ifdef IS31FL3731 +static void flush( void ) +{ + IS31FL3731_update_pwm_buffers( DRIVER_ADDR_1, DRIVER_ADDR_2 ); +} + +const rgb_matrix_driver_t rgb_matrix_driver = { + .init = init, + .flush = flush, + .set_color = IS31FL3731_set_color, + .set_color_all = IS31FL3731_set_color_all, +}; +#else +static void flush( void ) +{ + IS31FL3733_update_pwm_buffers( DRIVER_ADDR_1, DRIVER_ADDR_2 ); +} + +const rgb_matrix_driver_t rgb_matrix_driver = { + .init = init, + .flush = flush, + .set_color = IS31FL3733_set_color, + .set_color_all = IS31FL3733_set_color_all, +}; +#endif + +#endif From 13e166d9c42845e2622605e94d4a0c38fa5443a0 Mon Sep 17 00:00:00 2001 From: Wilba6582 Date: Fri, 28 Sep 2018 00:40:44 +1000 Subject: [PATCH 152/788] RAMA U80-A, wilba.tech WT60-A, WT65-A, WT80-A, IS31FL3736 driver (#3925) * Initial commit of RAMA U80-A * Initial commit of RAMA U80-A * Moved IS31FL3736 driver, minor cleanups * Superficial stuff * Review changes * Refactored to use common code. --- drivers/issi/is31fl3736.c | 306 ++++++++++++++++++ drivers/issi/is31fl3736.h | 172 ++++++++++ keyboards/rama/readme.md | 2 + keyboards/rama/u80_a/config.h | 187 +++++++++++ keyboards/rama/u80_a/info.json | 13 + keyboards/rama/u80_a/keymaps/default/keymap.c | 22 ++ keyboards/rama/u80_a/readme.md | 15 + keyboards/rama/u80_a/rules.mk | 68 ++++ keyboards/rama/u80_a/u80_a.c | 17 + keyboards/rama/u80_a/u80_a.h | 43 +++ keyboards/wilba_tech/wt60_a/config.h | 187 +++++++++++ keyboards/wilba_tech/wt60_a/info.json | 16 + .../keymaps/ansi_split_bs_rshift/keymap.c | 38 +++ .../wt60_a/keymaps/default/keymap.c | 38 +++ keyboards/wilba_tech/wt60_a/readme.md | 15 + keyboards/wilba_tech/wt60_a/rules.mk | 68 ++++ keyboards/wilba_tech/wt60_a/wt60_a.c | 17 + keyboards/wilba_tech/wt60_a/wt60_a.h | 52 +++ keyboards/wilba_tech/wt65_a/config.h | 187 +++++++++++ keyboards/wilba_tech/wt65_a/info.json | 13 + .../wt65_a/keymaps/default/keymap.c | 37 +++ keyboards/wilba_tech/wt65_a/readme.md | 15 + keyboards/wilba_tech/wt65_a/rules.mk | 68 ++++ keyboards/wilba_tech/wt65_a/wt65_a.c | 17 + keyboards/wilba_tech/wt65_a/wt65_a.h | 41 +++ keyboards/wilba_tech/wt80_a/config.h | 187 +++++++++++ keyboards/wilba_tech/wt80_a/info.json | 13 + .../wt80_a/keymaps/default/keymap.c | 22 ++ keyboards/wilba_tech/wt80_a/readme.md | 15 + keyboards/wilba_tech/wt80_a/rules.mk | 68 ++++ keyboards/wilba_tech/wt80_a/wt80_a.c | 17 + keyboards/wilba_tech/wt80_a/wt80_a.h | 43 +++ keyboards/wilba_tech/wt_main.c | 55 ++++ keyboards/wilba_tech/wt_mono_backlight.c | 116 +++++++ keyboards/wilba_tech/wt_mono_backlight.h | 33 ++ 35 files changed, 2223 insertions(+) create mode 100644 drivers/issi/is31fl3736.c create mode 100644 drivers/issi/is31fl3736.h create mode 100644 keyboards/rama/u80_a/config.h create mode 100644 keyboards/rama/u80_a/info.json create mode 100644 keyboards/rama/u80_a/keymaps/default/keymap.c create mode 100644 keyboards/rama/u80_a/readme.md create mode 100644 keyboards/rama/u80_a/rules.mk create mode 100644 keyboards/rama/u80_a/u80_a.c create mode 100644 keyboards/rama/u80_a/u80_a.h create mode 100644 keyboards/wilba_tech/wt60_a/config.h create mode 100644 keyboards/wilba_tech/wt60_a/info.json create mode 100644 keyboards/wilba_tech/wt60_a/keymaps/ansi_split_bs_rshift/keymap.c create mode 100644 keyboards/wilba_tech/wt60_a/keymaps/default/keymap.c create mode 100644 keyboards/wilba_tech/wt60_a/readme.md create mode 100644 keyboards/wilba_tech/wt60_a/rules.mk create mode 100644 keyboards/wilba_tech/wt60_a/wt60_a.c create mode 100644 keyboards/wilba_tech/wt60_a/wt60_a.h create mode 100644 keyboards/wilba_tech/wt65_a/config.h create mode 100644 keyboards/wilba_tech/wt65_a/info.json create mode 100644 keyboards/wilba_tech/wt65_a/keymaps/default/keymap.c create mode 100644 keyboards/wilba_tech/wt65_a/readme.md create mode 100644 keyboards/wilba_tech/wt65_a/rules.mk create mode 100644 keyboards/wilba_tech/wt65_a/wt65_a.c create mode 100644 keyboards/wilba_tech/wt65_a/wt65_a.h create mode 100644 keyboards/wilba_tech/wt80_a/config.h create mode 100644 keyboards/wilba_tech/wt80_a/info.json create mode 100644 keyboards/wilba_tech/wt80_a/keymaps/default/keymap.c create mode 100644 keyboards/wilba_tech/wt80_a/readme.md create mode 100644 keyboards/wilba_tech/wt80_a/rules.mk create mode 100644 keyboards/wilba_tech/wt80_a/wt80_a.c create mode 100644 keyboards/wilba_tech/wt80_a/wt80_a.h create mode 100644 keyboards/wilba_tech/wt_main.c create mode 100644 keyboards/wilba_tech/wt_mono_backlight.c create mode 100644 keyboards/wilba_tech/wt_mono_backlight.h diff --git a/drivers/issi/is31fl3736.c b/drivers/issi/is31fl3736.c new file mode 100644 index 000000000..c5d431097 --- /dev/null +++ b/drivers/issi/is31fl3736.c @@ -0,0 +1,306 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 . + */ + + +#ifdef __AVR__ +#include +#include +#include +#else +#include "wait.h" +#endif + +#include "is31fl3736.h" +#include +#include "i2c_master.h" +#include "progmem.h" + + + +// This is a 7-bit address, that gets left-shifted and bit 0 +// set to 0 for write, 1 for read (as per I2C protocol) +// The address will vary depending on your wiring: +// 00 <-> GND +// 01 <-> SCL +// 10 <-> SDA +// 11 <-> VCC +// ADDR1 represents A1:A0 of the 7-bit address. +// ADDR2 represents A3:A2 of the 7-bit address. +// The result is: 0b101(ADDR2)(ADDR1) +#define ISSI_ADDR_DEFAULT 0x50 + +#define ISSI_COMMANDREGISTER 0xFD +#define ISSI_COMMANDREGISTER_WRITELOCK 0xFE +#define ISSI_INTERRUPTMASKREGISTER 0xF0 +#define ISSI_INTERRUPTSTATUSREGISTER 0xF1 + +#define ISSI_PAGE_LEDCONTROL 0x00 //PG0 +#define ISSI_PAGE_PWM 0x01 //PG1 +#define ISSI_PAGE_AUTOBREATH 0x02 //PG2 +#define ISSI_PAGE_FUNCTION 0x03 //PG3 + +#define ISSI_REG_CONFIGURATION 0x00 //PG3 +#define ISSI_REG_GLOBALCURRENT 0x01 //PG3 +#define ISSI_REG_RESET 0x11// PG3 +#define ISSI_REG_SWPULLUP 0x0F //PG3 +#define ISSI_REG_CSPULLUP 0x10 //PG3 + +#ifndef ISSI_TIMEOUT + #define ISSI_TIMEOUT 100 +#endif + +#ifndef ISSI_PERSISTENCE + #define ISSI_PERSISTENCE 0 +#endif + +// Transfer buffer for TWITransmitData() +uint8_t g_twi_transfer_buffer[20]; + +// These buffers match the IS31FL3736 PWM registers. +// The control buffers match the PG0 LED On/Off registers. +// Storing them like this is optimal for I2C transfers to the registers. +// We could optimize this and take out the unused registers from these +// buffers and the transfers in IS31FL3736_write_pwm_buffer() but it's +// probably not worth the extra complexity. +uint8_t g_pwm_buffer[DRIVER_COUNT][192]; +bool g_pwm_buffer_update_required = false; + +uint8_t g_led_control_registers[DRIVER_COUNT][24] = { { 0 }, { 0 } }; +bool g_led_control_registers_update_required = false; + +void IS31FL3736_write_register( uint8_t addr, uint8_t reg, uint8_t data ) +{ + g_twi_transfer_buffer[0] = reg; + g_twi_transfer_buffer[1] = data; + + #if ISSI_PERSISTENCE > 0 + for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) { + if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT) == 0) + break; + } + #else + i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT); + #endif +} + +void IS31FL3736_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer ) +{ + // assumes PG1 is already selected + + // transmit PWM registers in 12 transfers of 16 bytes + // g_twi_transfer_buffer[] is 20 bytes + + // iterate over the pwm_buffer contents at 16 byte intervals + for ( int i = 0; i < 192; i += 16 ) { + g_twi_transfer_buffer[0] = i; + // copy the data from i to i+15 + // device will auto-increment register for data after the first byte + // thus this sets registers 0x00-0x0F, 0x10-0x1F, etc. in one transfer + for ( int j = 0; j < 16; j++ ) { + g_twi_transfer_buffer[1 + j] = pwm_buffer[i + j]; + } + + #if ISSI_PERSISTENCE > 0 + for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) { + if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT) == 0) + break; + } + #else + i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT); + #endif + } +} + +void IS31FL3736_init( uint8_t addr ) +{ + // In order to avoid the LEDs being driven with garbage data + // in the LED driver's PWM registers, shutdown is enabled last. + // Set up the mode and other settings, clear the PWM registers, + // then disable software shutdown. + + // Unlock the command register. + IS31FL3736_write_register( addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 ); + + // Select PG0 + IS31FL3736_write_register( addr, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL ); + // Turn off all LEDs. + for ( int i = 0x00; i <= 0x17; i++ ) + { + IS31FL3736_write_register( addr, i, 0x00 ); + } + + // Unlock the command register. + IS31FL3736_write_register( addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 ); + + // Select PG1 + IS31FL3736_write_register( addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM ); + // Set PWM on all LEDs to 0 + // No need to setup Breath registers to PWM as that is the default. + for ( int i = 0x00; i <= 0xBF; i++ ) + { + IS31FL3736_write_register( addr, i, 0x00 ); + } + + // Unlock the command register. + IS31FL3736_write_register( addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 ); + + // Select PG3 + IS31FL3736_write_register( addr, ISSI_COMMANDREGISTER, ISSI_PAGE_FUNCTION ); + // Set global current to maximum. + IS31FL3736_write_register( addr, ISSI_REG_GLOBALCURRENT, 0xFF ); + // Disable software shutdown. + IS31FL3736_write_register( addr, ISSI_REG_CONFIGURATION, 0x01 ); + + // Wait 10ms to ensure the device has woken up. + #ifdef __AVR__ + _delay_ms( 10 ); + #else + wait_ms(10); + #endif +} + +void IS31FL3736_set_color( int index, uint8_t red, uint8_t green, uint8_t blue ) +{ + if ( index >= 0 && index < DRIVER_LED_TOTAL ) { + is31_led led = g_is31_leds[index]; + + g_pwm_buffer[led.driver][led.r] = red; + g_pwm_buffer[led.driver][led.g] = green; + g_pwm_buffer[led.driver][led.b] = blue; + g_pwm_buffer_update_required = true; + } +} + +void IS31FL3736_set_color_all( uint8_t red, uint8_t green, uint8_t blue ) +{ + for ( int i = 0; i < DRIVER_LED_TOTAL; i++ ) + { + IS31FL3736_set_color( i, red, green, blue ); + } +} + +void IS31FL3736_set_led_control_register( uint8_t index, bool red, bool green, bool blue ) +{ + is31_led led = g_is31_leds[index]; + + // IS31FL3733 + // The PWM register for a matrix position (0x00 to 0xBF) can be + // divided by 8 to get the LED control register (0x00 to 0x17), + // then mod 8 to get the bit position within that register. + + // IS31FL3736 + // The PWM register for a matrix position (0x00 to 0xBF) is interleaved, so: + // A1=0x00 A2=0x02 A3=0x04 A4=0x06 A5=0x08 A6=0x0A A7=0x0C A8=0x0E + // B1=0x10 B2=0x12 B3=0x14 + // But also, the LED control registers (0x00 to 0x17) are also interleaved, so: + // A1-A4=0x00 A5-A8=0x01 + // So, the same math applies. + + uint8_t control_register_r = led.r / 8; + uint8_t control_register_g = led.g / 8; + uint8_t control_register_b = led.b / 8; + + uint8_t bit_r = led.r % 8; + uint8_t bit_g = led.g % 8; + uint8_t bit_b = led.b % 8; + + if ( red ) { + g_led_control_registers[led.driver][control_register_r] |= (1 << bit_r); + } else { + g_led_control_registers[led.driver][control_register_r] &= ~(1 << bit_r); + } + if ( green ) { + g_led_control_registers[led.driver][control_register_g] |= (1 << bit_g); + } else { + g_led_control_registers[led.driver][control_register_g] &= ~(1 << bit_g); + } + if ( blue ) { + g_led_control_registers[led.driver][control_register_b] |= (1 << bit_b); + } else { + g_led_control_registers[led.driver][control_register_b] &= ~(1 << bit_b); + } + + g_led_control_registers_update_required = true; + +} + +void IS31FL3736_mono_set_brightness( int index, uint8_t value ) +{ + if ( index >= 0 && index < 96 ) { + // Index in range 0..95 -> A1..A8, B1..B8, etc. + // Map index 0..95 to registers 0x00..0xBE (interleaved) + uint8_t pwm_register = index * 2; + g_pwm_buffer[0][pwm_register] = value; + g_pwm_buffer_update_required = true; + } +} + +void IS31FL3736_mono_set_brightness_all( uint8_t value ) +{ + for ( int i = 0; i < 96; i++ ) + { + IS31FL3736_mono_set_brightness( i, value ); + } +} + +void IS31FL3736_mono_set_led_control_register( uint8_t index, bool enabled ) +{ + // Index in range 0..95 -> A1..A8, B1..B8, etc. + + // Map index 0..95 to registers 0x00..0xBE (interleaved) + uint8_t pwm_register = index * 2; + // Map register 0x00..0xBE (interleaved) into control register and bit + uint8_t control_register = pwm_register / 8; + uint8_t bit = pwm_register % 8; + + if ( enabled ) { + g_led_control_registers[0][control_register] |= (1 << bit); + } else { + g_led_control_registers[0][control_register] &= ~(1 << bit); + } + + g_led_control_registers_update_required = true; +} + +void IS31FL3736_update_pwm_buffers( uint8_t addr1, uint8_t addr2 ) +{ + if ( g_pwm_buffer_update_required ) + { + // Firstly we need to unlock the command register and select PG1 + IS31FL3736_write_register( addr1, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 ); + IS31FL3736_write_register( addr1, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM ); + + IS31FL3736_write_pwm_buffer( addr1, g_pwm_buffer[0] ); + //IS31FL3736_write_pwm_buffer( addr2, g_pwm_buffer[1] ); + } + g_pwm_buffer_update_required = false; +} + +void IS31FL3736_update_led_control_registers( uint8_t addr1, uint8_t addr2 ) +{ + if ( g_led_control_registers_update_required ) + { + // Firstly we need to unlock the command register and select PG0 + IS31FL3736_write_register( addr1, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 ); + IS31FL3736_write_register( addr1, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL ); + for ( int i=0; i<24; i++ ) + { + IS31FL3736_write_register(addr1, i, g_led_control_registers[0][i] ); + //IS31FL3736_write_register(addr2, i, g_led_control_registers[1][i] ); + } + } +} + diff --git a/drivers/issi/is31fl3736.h b/drivers/issi/is31fl3736.h new file mode 100644 index 000000000..cff50fd0d --- /dev/null +++ b/drivers/issi/is31fl3736.h @@ -0,0 +1,172 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 . + */ + +#pragma once + +#include +#include + + +// Simple interface option. +// If these aren't defined, just define them to make it compile + + +#ifndef DRIVER_COUNT +#define DRIVER_COUNT 2 +#endif + +#ifndef DRIVER_LED_TOTAL +#define DRIVER_LED_TOTAL 96 +#endif + + +typedef struct is31_led { + uint8_t driver:2; + uint8_t r; + uint8_t g; + uint8_t b; +} __attribute__((packed)) is31_led; + +extern const is31_led g_is31_leds[DRIVER_LED_TOTAL]; + +void IS31FL3736_init( uint8_t addr ); +void IS31FL3736_write_register( uint8_t addr, uint8_t reg, uint8_t data ); +void IS31FL3736_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer ); + +void IS31FL3736_set_color( int index, uint8_t red, uint8_t green, uint8_t blue ); +void IS31FL3736_set_color_all( uint8_t red, uint8_t green, uint8_t blue ); + +void IS31FL3736_set_led_control_register( uint8_t index, bool red, bool green, bool blue ); + +void IS31FL3736_mono_set_brightness( int index, uint8_t value ); +void IS31FL3736_mono_set_brightness_all( uint8_t value ); +void IS31FL3736_mono_set_led_control_register( uint8_t index, bool enabled ); + +// This should not be called from an interrupt +// (eg. from a timer interrupt). +// Call this while idle (in between matrix scans). +// If the buffer is dirty, it will update the driver with the buffer. +void IS31FL3736_update_pwm_buffers( uint8_t addr1, uint8_t addr2 ); +void IS31FL3736_update_led_control_registers( uint8_t addr1, uint8_t addr2 ); + +#define A_1 0x00 +#define A_2 0x02 +#define A_3 0x04 +#define A_4 0x06 +#define A_5 0x08 +#define A_6 0x0A +#define A_7 0x0C +#define A_8 0x0E + +#define B_1 0x10 +#define B_2 0x12 +#define B_3 0x14 +#define B_4 0x16 +#define B_5 0x18 +#define B_6 0x1A +#define B_7 0x1C +#define B_8 0x1E + +#define C_1 0x20 +#define C_2 0x22 +#define C_3 0x24 +#define C_4 0x26 +#define C_5 0x28 +#define C_6 0x2A +#define C_7 0x2C +#define C_8 0x2E + +#define D_1 0x30 +#define D_2 0x32 +#define D_3 0x34 +#define D_4 0x36 +#define D_5 0x38 +#define D_6 0x3A +#define D_7 0x3C +#define D_8 0x3E + +#define E_1 0x40 +#define E_2 0x42 +#define E_3 0x44 +#define E_4 0x46 +#define E_5 0x48 +#define E_6 0x4A +#define E_7 0x4C +#define E_8 0x4E + +#define F_1 0x50 +#define F_2 0x52 +#define F_3 0x54 +#define F_4 0x56 +#define F_5 0x58 +#define F_6 0x5A +#define F_7 0x5C +#define F_8 0x5E + +#define G_1 0x60 +#define G_2 0x62 +#define G_3 0x64 +#define G_4 0x66 +#define G_5 0x68 +#define G_6 0x6A +#define G_7 0x6C +#define G_8 0x6E + +#define H_1 0x70 +#define H_2 0x72 +#define H_3 0x74 +#define H_4 0x76 +#define H_5 0x78 +#define H_6 0x7A +#define H_7 0x7C +#define H_8 0x7E + +#define I_1 0x80 +#define I_2 0x82 +#define I_3 0x84 +#define I_4 0x86 +#define I_5 0x88 +#define I_6 0x8A +#define I_7 0x8C +#define I_8 0x8E + +#define J_1 0x90 +#define J_2 0x92 +#define J_3 0x94 +#define J_4 0x96 +#define J_5 0x98 +#define J_6 0x9A +#define J_7 0x9C +#define J_8 0x9E + +#define K_1 0xA0 +#define K_2 0xA2 +#define K_3 0xA4 +#define K_4 0xA6 +#define K_5 0xA8 +#define K_6 0xAA +#define K_7 0xAC +#define K_8 0xAE + +#define L_1 0xB0 +#define L_2 0xB2 +#define L_3 0xB4 +#define L_4 0xB6 +#define L_5 0xB8 +#define L_6 0xBA +#define L_7 0xBC +#define L_8 0xBE + diff --git a/keyboards/rama/readme.md b/keyboards/rama/readme.md index 4625eb1ef..c7ddf6d11 100644 --- a/keyboards/rama/readme.md +++ b/keyboards/rama/readme.md @@ -6,4 +6,6 @@ Firmware for keyboards designed by [RAMA WORKS](https://rama.works) [RAMA M60-A](https://rama.works/#/m60-a/) +[RAMA U80-A](https://rama.works/#/tkl-a/) + [RAMA M10-B](https://www.massdrop.com/buy/rama-m10-a?mode=guest_open) diff --git a/keyboards/rama/u80_a/config.h b/keyboards/rama/u80_a/config.h new file mode 100644 index 000000000..bfd972828 --- /dev/null +++ b/keyboards/rama/u80_a/config.h @@ -0,0 +1,187 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 . + */ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0x5241 // "RW" +#define PRODUCT_ID 0x080A // 80-A +#define DEVICE_VER 0x0001 +#define MANUFACTURER RAMA.WORKS +#define PRODUCT RAMA U80-A +#define DESCRIPTION RAMA U80-A Keyboard + +/* key matrix size */ +#define MATRIX_ROWS 6 +#define MATRIX_COLS 17 + +/* + * 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 { F1, F0, E6, F4, F6, F7 } +#define MATRIX_COL_PINS { F5, D5, B1, B2, B3, D3, D2, C7, C6, B6, B5, B4, D7, D6, D4, B7, B0 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION ROW2COL + +// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_BREATHING +// #define BACKLIGHT_LEVELS 3 + + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* 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 userful 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 + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * 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 + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +//#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 1 + diff --git a/keyboards/rama/u80_a/info.json b/keyboards/rama/u80_a/info.json new file mode 100644 index 000000000..cb61c89b8 --- /dev/null +++ b/keyboards/rama/u80_a/info.json @@ -0,0 +1,13 @@ +{ + "keyboard_name": "RAMA U80-A", + "url": "https://rama.works/#/tkl-a/", + "maintainer": "Wilba", + "bootloader": "atmel-dfu", + "width": 18.25, + "height": 6.5, + "layouts": { + "LAYOUT_all": { + "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"F1", "x":2, "y":0}, {"label":"F2", "x":3, "y":0}, {"label":"F3", "x":4, "y":0}, {"label":"F4", "x":5, "y":0}, {"label":"F5", "x":6.5, "y":0}, {"label":"F6", "x":7.5, "y":0}, {"label":"F7", "x":8.5, "y":0}, {"label":"F8", "x":9.5, "y":0}, {"label":"F9", "x":11, "y":0}, {"label":"F10", "x":12, "y":0}, {"label":"F11", "x":13, "y":0}, {"label":"F12", "x":14, "y":0}, {"label":"PrtSc", "x":15.25, "y":0}, {"label":"Scroll Lock", "x":16.25, "y":0}, {"label":"Pause", "x":17.25, "y":0}, {"label":"~", "x":0, "y":1.5}, {"label":"!", "x":1, "y":1.5}, {"label":"@", "x":2, "y":1.5}, {"label":"#", "x":3, "y":1.5}, {"label":"$", "x":4, "y":1.5}, {"label":"%", "x":5, "y":1.5}, {"label":"^", "x":6, "y":1.5}, {"label":"&", "x":7, "y":1.5}, {"label":"*", "x":8, "y":1.5}, {"label":"(", "x":9, "y":1.5}, {"label":")", "x":10, "y":1.5}, {"label":"_", "x":11, "y":1.5}, {"label":"+", "x":12, "y":1.5}, {"label":"Backspace", "x":13, "y":1.5}, {"x":14, "y":1.5}, {"label":"Insert", "x":15.25, "y":1.5}, {"label":"Home", "x":16.25, "y":1.5}, {"label":"PgUp", "x":17.25, "y":1.5}, {"label":"Tab", "x":0, "y":2.5, "w":1.5}, {"label":"Q", "x":1.5, "y":2.5}, {"label":"W", "x":2.5, "y":2.5}, {"label":"E", "x":3.5, "y":2.5}, {"label":"R", "x":4.5, "y":2.5}, {"label":"T", "x":5.5, "y":2.5}, {"label":"Y", "x":6.5, "y":2.5}, {"label":"U", "x":7.5, "y":2.5}, {"label":"I", "x":8.5, "y":2.5}, {"label":"O", "x":9.5, "y":2.5}, {"label":"P", "x":10.5, "y":2.5}, {"label":"{", "x":11.5, "y":2.5}, {"label":"}", "x":12.5, "y":2.5}, {"label":"|", "x":13.5, "y":2.5, "w":1.5}, {"label":"Delete", "x":15.25, "y":2.5}, {"label":"End", "x":16.25, "y":2.5}, {"label":"PgDn", "x":17.25, "y":2.5}, {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75}, {"label":"A", "x":1.75, "y":3.5}, {"label":"S", "x":2.75, "y":3.5}, {"label":"D", "x":3.75, "y":3.5}, {"label":"F", "x":4.75, "y":3.5}, {"label":"G", "x":5.75, "y":3.5}, {"label":"H", "x":6.75, "y":3.5}, {"label":"J", "x":7.75, "y":3.5}, {"label":"K", "x":8.75, "y":3.5}, {"label":"L", "x":9.75, "y":3.5}, {"label":":", "x":10.75, "y":3.5}, {"label":"\"", "x":11.75, "y":3.5}, {"label":"Enter", "x":12.75, "y":3.5, "w":2.25}, {"label":"Shift", "x":0, "y":4.5, "w":2.25}, {"label":"Z", "x":2.25, "y":4.5}, {"label":"X", "x":3.25, "y":4.5}, {"label":"C", "x":4.25, "y":4.5}, {"label":"V", "x":5.25, "y":4.5}, {"label":"B", "x":6.25, "y":4.5}, {"label":"N", "x":7.25, "y":4.5}, {"label":"M", "x":8.25, "y":4.5}, {"label":"<", "x":9.25, "y":4.5}, {"label":">", "x":10.25, "y":4.5}, {"label":"?", "x":11.25, "y":4.5}, {"label":"Shift", "x":12.25, "y":4.5, "w":1.75}, {"x":14, "y":4.5}, {"label":"\u2191", "x":16.25, "y":4.5}, {"label":"Ctrl", "x":0, "y":5.5, "w":1.25}, {"label":"Win", "x":1.25, "y":5.5, "w":1.25}, {"label":"Alt", "x":2.5, "y":5.5, "w":1.25}, {"x":3.75, "y":5.5, "w":6.25}, {"label":"Alt", "x":10, "y":5.5, "w":1.25}, {"label":"Win", "x":11.25, "y":5.5, "w":1.25}, {"label":"Menu", "x":12.5, "y":5.5, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":5.5, "w":1.25}, {"label":"\u2190", "x":15.25, "y":5.5}, {"label":"\u2193", "x":16.25, "y":5.5}, {"label":"\u2192", "x":17.25, "y":5.5}] + } + } +} diff --git a/keyboards/rama/u80_a/keymaps/default/keymap.c b/keyboards/rama/u80_a/keymaps/default/keymap.c new file mode 100644 index 000000000..cf9225e3e --- /dev/null +++ b/keyboards/rama/u80_a/keymaps/default/keymap.c @@ -0,0 +1,22 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [0] = LAYOUT_all( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_TRNS, KC_UP, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [1] = LAYOUT_all( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +}; + diff --git a/keyboards/rama/u80_a/readme.md b/keyboards/rama/u80_a/readme.md new file mode 100644 index 000000000..c98d00cb6 --- /dev/null +++ b/keyboards/rama/u80_a/readme.md @@ -0,0 +1,15 @@ +# RAMA U80-A + +![RAMA U80-A](https://something.com/something.jpg) + +A TKL keyboard. [More info at RAMA WORKS](https://rama.works/#/tkl-a/) + +Keyboard Maintainer: [Wilba6582](https://github.com/Wilba6582) +Hardware Supported: RAMA U80-A PCB +Hardware Availability: [RAMA WORKS Store](https://ramaworks.store/) + +Make example for this keyboard (after setting up your build environment): + + make rama/u80_a:default + +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). \ No newline at end of file diff --git a/keyboards/rama/u80_a/rules.mk b/keyboards/rama/u80_a/rules.mk new file mode 100644 index 000000000..99224c247 --- /dev/null +++ b/keyboards/rama/u80_a/rules.mk @@ -0,0 +1,68 @@ +# project specific files +SRC = drivers/issi/is31fl3736.c \ + drivers/avr/i2c_master.c \ + keyboards/wilba_tech/wt_mono_backlight.c \ + keyboards/wilba_tech/wt_main.c + +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section +BOOTLOADER = atmel-dfu + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = no # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches diff --git a/keyboards/rama/u80_a/u80_a.c b/keyboards/rama/u80_a/u80_a.c new file mode 100644 index 000000000..ccff6d62c --- /dev/null +++ b/keyboards/rama/u80_a/u80_a.c @@ -0,0 +1,17 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 . + */ + +// Nothing to see here, move along... ;-) diff --git a/keyboards/rama/u80_a/u80_a.h b/keyboards/rama/u80_a/u80_a.h new file mode 100644 index 000000000..26403ef34 --- /dev/null +++ b/keyboards/rama/u80_a/u80_a.h @@ -0,0 +1,43 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 . + */ + +#pragma once + +#include "quantum.h" + +#define ____ KC_NO + +// Right switch of split backspace is at 3,13 and is the only switch +// whose physical position doesn't match switch matrix position :-( +// However, it also makes no sense to view the physical as 18 columns, +// so the numbering goes 00 to 16. Deal with it. + +#define LAYOUT_all( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K015, K016, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K313, K114, K115, K116, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216, \ + K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, \ + K400, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K415, \ + K500, K501, K502, K506, K510, K511, K512, K513, K514, K515, K516 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, ____, K014, K015, K016 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116 }, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216 }, \ + { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, ____, ____, ____ }, \ + { K400, ____, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, ____, K415, ____ }, \ + { K500, K501, K502, ____, ____, ____, K506, ____, ____, ____, K510, K511, K512, K513, K514, K515, K516 } \ +} + diff --git a/keyboards/wilba_tech/wt60_a/config.h b/keyboards/wilba_tech/wt60_a/config.h new file mode 100644 index 000000000..95f4c786e --- /dev/null +++ b/keyboards/wilba_tech/wt60_a/config.h @@ -0,0 +1,187 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 . + */ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0x6582 // wilba.tech +#define PRODUCT_ID 0x060A // 60-A +#define DEVICE_VER 0x0001 +#define MANUFACTURER wilba.tech +#define PRODUCT wilba.tech WT60-A +#define DESCRIPTION wilba.tech WT60-A + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 14 + +/* + * 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 { F0, E6, F4, F6, F7 } +#define MATRIX_COL_PINS { F5, D5, B1, B2, B3, D3, D2, C7, C6, B6, B5, B4, D7, D6 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION ROW2COL + +// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_BREATHING +// #define BACKLIGHT_LEVELS 3 + + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* 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 userful 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 + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * 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 + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +//#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 1 + diff --git a/keyboards/wilba_tech/wt60_a/info.json b/keyboards/wilba_tech/wt60_a/info.json new file mode 100644 index 000000000..3b3614a8b --- /dev/null +++ b/keyboards/wilba_tech/wt60_a/info.json @@ -0,0 +1,16 @@ +{ + "keyboard_name": "wilba.tech WT60-A", + "url": "https://wilba.tech", + "maintainer": "Wilba", + "bootloader": "atmel-dfu", + "width": 15, + "height": 5, + "layouts": { + "LAYOUT_60_ansi": { + "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}] + }, + "LAYOUT_60_ansi_split_bs_rshift": { + "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}] + } + } +} \ No newline at end of file diff --git a/keyboards/wilba_tech/wt60_a/keymaps/ansi_split_bs_rshift/keymap.c b/keyboards/wilba_tech/wt60_a/keymaps/ansi_split_bs_rshift/keymap.c new file mode 100644 index 000000000..95e01fc2c --- /dev/null +++ b/keyboards/wilba_tech/wt60_a/keymaps/ansi_split_bs_rshift/keymap.c @@ -0,0 +1,38 @@ +// ANSI split backspace/right shift layout for WT60-A +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +// Default layer +[0] = LAYOUT_60_ansi_split_bs_rshift( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_DEL, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1), + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL), + +// Fn1 Layer +[1] = LAYOUT_60_ansi_split_bs_rshift( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, + KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, KC_TRNS, KC_TRNS, + KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_EJCT, KC_TRNS, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +// Fn2 Layer +[2] = LAYOUT_60_ansi_split_bs_rshift( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +// Fn3 Layer +[3] = LAYOUT_60_ansi_split_bs_rshift( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +}; diff --git a/keyboards/wilba_tech/wt60_a/keymaps/default/keymap.c b/keyboards/wilba_tech/wt60_a/keymaps/default/keymap.c new file mode 100644 index 000000000..566736f5e --- /dev/null +++ b/keyboards/wilba_tech/wt60_a/keymaps/default/keymap.c @@ -0,0 +1,38 @@ +// Default layout for WT60-A +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +// Default layer +[0] = LAYOUT_60_ansi( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(1), KC_RCTL), + +// Fn1 Layer +[1] = LAYOUT_60_ansi( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL , + KC_CAPS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, + KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGUP, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_END, KC_PGDN, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +// Fn2 Layer +[2] = LAYOUT_60_ansi( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +// Fn3 Layer +[3] = LAYOUT_60_ansi( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +}; diff --git a/keyboards/wilba_tech/wt60_a/readme.md b/keyboards/wilba_tech/wt60_a/readme.md new file mode 100644 index 000000000..d7a73165d --- /dev/null +++ b/keyboards/wilba_tech/wt60_a/readme.md @@ -0,0 +1,15 @@ +# WILBA.TECH WT60-A + +![WILBA.TECH WT60-A](https://wilba.tech) + +WT60-A is a keyboard PCB supporting 60% layout. [More info at wilba.tech](https://wilba.tech/) + +Keyboard Maintainer: [Wilba6582](https://github.com/Wilba6582) +Hardware Supported: WILBA.TECH WT65-A +Hardware Availability: Custom keyboard group buys + +Make example for this keyboard (after setting up your build environment): + + make wilba_tech/wt60_a:default + +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). \ No newline at end of file diff --git a/keyboards/wilba_tech/wt60_a/rules.mk b/keyboards/wilba_tech/wt60_a/rules.mk new file mode 100644 index 000000000..99224c247 --- /dev/null +++ b/keyboards/wilba_tech/wt60_a/rules.mk @@ -0,0 +1,68 @@ +# project specific files +SRC = drivers/issi/is31fl3736.c \ + drivers/avr/i2c_master.c \ + keyboards/wilba_tech/wt_mono_backlight.c \ + keyboards/wilba_tech/wt_main.c + +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section +BOOTLOADER = atmel-dfu + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = no # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches diff --git a/keyboards/wilba_tech/wt60_a/wt60_a.c b/keyboards/wilba_tech/wt60_a/wt60_a.c new file mode 100644 index 000000000..ccff6d62c --- /dev/null +++ b/keyboards/wilba_tech/wt60_a/wt60_a.c @@ -0,0 +1,17 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 . + */ + +// Nothing to see here, move along... ;-) diff --git a/keyboards/wilba_tech/wt60_a/wt60_a.h b/keyboards/wilba_tech/wt60_a/wt60_a.h new file mode 100644 index 000000000..8ac8d9216 --- /dev/null +++ b/keyboards/wilba_tech/wt60_a/wt60_a.h @@ -0,0 +1,52 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 . + */ + +#pragma once + +#include "quantum.h" + +#define ____ KC_NO + +#define LAYOUT_60_ansi_split_bs_rshift( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K213, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, \ + K300, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, \ + K400, K401, K402, K406, K410, K411, K412, K413 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113 }, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213 }, \ + { K300, ____, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313 }, \ + { K400, K401, K402, ____, ____, ____, K406, ____, ____, ____, K410, K411, K412, K413 } \ +} + +#define LAYOUT_60_ansi( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, \ + K300, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, \ + K400, K401, K402, K406, K410, K411, K412, K413 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113 }, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, ____ }, \ + { K300, ____, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, ____ }, \ + { K400, K401, K402, ____, ____, ____, K406, ____, ____, ____, K410, K411, K412, K413 } \ +} + + + diff --git a/keyboards/wilba_tech/wt65_a/config.h b/keyboards/wilba_tech/wt65_a/config.h new file mode 100644 index 000000000..fa919f186 --- /dev/null +++ b/keyboards/wilba_tech/wt65_a/config.h @@ -0,0 +1,187 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 . + */ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0x6582 // wilba.tech +#define PRODUCT_ID 0x065A // 65-A +#define DEVICE_VER 0x0001 +#define MANUFACTURER wilba.tech +#define PRODUCT wilba.tech WT65-A +#define DESCRIPTION wilba.tech WT65-A + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 15 + +/* + * 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 { F0, E6, F4, F6, F7 } +#define MATRIX_COL_PINS { F5, D5, B1, B2, B3, D3, D2, C7, C6, B6, B5, B4, D7, D6, D4 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION ROW2COL + +// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_BREATHING +// #define BACKLIGHT_LEVELS 3 + + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* 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 userful 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 + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * 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 + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +//#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 1 + diff --git a/keyboards/wilba_tech/wt65_a/info.json b/keyboards/wilba_tech/wt65_a/info.json new file mode 100644 index 000000000..f2b18dadd --- /dev/null +++ b/keyboards/wilba_tech/wt65_a/info.json @@ -0,0 +1,13 @@ +{ + "keyboard_name": "wilba.tech WT65-A", + "url": "https://wilba.tech", + "maintainer": "Wilba", + "bootloader": "atmel-dfu", + "width": 16, + "height": 5, + "layouts": { + "LAYOUT_all": { + "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"|", "x":13, "y":0}, {"label":"Del", "x":14, "y":0}, {"label":"Home", "x":15, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"Backspace", "x":13.5, "y":1, "w":1.5}, {"label":"PgUp", "x":15, "y":1}, {"label":"Control", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"PgDn", "x":15, "y":2}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"label":"\u2191", "x":14, "y":3}, {"label":"End", "x":15, "y":3}, {"label":"Fn", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"\u2190", "x":13, "y":4}, {"label":"\u2193", "x":14, "y":4}, {"label":"\u2192", "x":15, "y":4}] + } + } +} \ No newline at end of file diff --git a/keyboards/wilba_tech/wt65_a/keymaps/default/keymap.c b/keyboards/wilba_tech/wt65_a/keymaps/default/keymap.c new file mode 100644 index 000000000..c5ae81168 --- /dev/null +++ b/keyboards/wilba_tech/wt65_a/keymaps/default/keymap.c @@ -0,0 +1,37 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + // Default layer + [0] = LAYOUT_all( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, KC_HOME, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT), + + // Fn1 Layer + [1] = LAYOUT_all( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_DEL, KC_TRNS, + KC_CAPS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGUP, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_END, KC_PGDN, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + // Fn2 Layer + [2] = LAYOUT_all( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + // Fn3 Layer + [3] = LAYOUT_all( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), +}; + diff --git a/keyboards/wilba_tech/wt65_a/readme.md b/keyboards/wilba_tech/wt65_a/readme.md new file mode 100644 index 000000000..1551b55b5 --- /dev/null +++ b/keyboards/wilba_tech/wt65_a/readme.md @@ -0,0 +1,15 @@ +# WILBA.TECH WT65-A + +![WILBA.TECH WT65-A](https://wilba.tech) + +WT65-A is a keyboard PCB supporting 65% layout with 0.25U blocker. [More info at wilba.tech](https://wilba.tech/) + +Keyboard Maintainer: [Wilba6582](https://github.com/Wilba6582) +Hardware Supported: WILBA.TECH WT65-A +Hardware Availability: Custom keyboard group buys + +Make example for this keyboard (after setting up your build environment): + + make wilba_tech/wt65_a:default + +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). \ No newline at end of file diff --git a/keyboards/wilba_tech/wt65_a/rules.mk b/keyboards/wilba_tech/wt65_a/rules.mk new file mode 100644 index 000000000..99224c247 --- /dev/null +++ b/keyboards/wilba_tech/wt65_a/rules.mk @@ -0,0 +1,68 @@ +# project specific files +SRC = drivers/issi/is31fl3736.c \ + drivers/avr/i2c_master.c \ + keyboards/wilba_tech/wt_mono_backlight.c \ + keyboards/wilba_tech/wt_main.c + +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section +BOOTLOADER = atmel-dfu + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = no # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches diff --git a/keyboards/wilba_tech/wt65_a/wt65_a.c b/keyboards/wilba_tech/wt65_a/wt65_a.c new file mode 100644 index 000000000..ccff6d62c --- /dev/null +++ b/keyboards/wilba_tech/wt65_a/wt65_a.c @@ -0,0 +1,17 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 . + */ + +// Nothing to see here, move along... ;-) diff --git a/keyboards/wilba_tech/wt65_a/wt65_a.h b/keyboards/wilba_tech/wt65_a/wt65_a.h new file mode 100644 index 000000000..9c3e6e12b --- /dev/null +++ b/keyboards/wilba_tech/wt65_a/wt65_a.h @@ -0,0 +1,41 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 . + */ + +#pragma once + +#include "quantum.h" + +#define ____ KC_NO + +// Right switch of split backspace is at 2,13 and is the only switch +// whose physical position doesn't match switch matrix position :-( +// However, it also makes no sense to view the physical as 16 columns, +// so the numbering goes 00 to 14. Deal with it. + +#define LAYOUT_all( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K213, K014, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K214, \ + K300, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, \ + K400, K401, K402, K406, K410, K411, K412, K413, K414 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214 }, \ + { K300, ____, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314 }, \ + { K400, K401, K402, ____, ____, ____, K406, ____, ____, ____, K410, K411, K412, K413, K414 } \ +} + diff --git a/keyboards/wilba_tech/wt80_a/config.h b/keyboards/wilba_tech/wt80_a/config.h new file mode 100644 index 000000000..9687cb6d6 --- /dev/null +++ b/keyboards/wilba_tech/wt80_a/config.h @@ -0,0 +1,187 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 . + */ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0x6582 // wilba.tech +#define PRODUCT_ID 0x080A // 80-A +#define DEVICE_VER 0x0001 +#define MANUFACTURER wilba.tech +#define PRODUCT wilba.tech WT80-A +#define DESCRIPTION wilba.tech WT80-A + +/* key matrix size */ +#define MATRIX_ROWS 6 +#define MATRIX_COLS 17 + +/* + * 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 { F1, F0, E6, F4, F6, F7 } +#define MATRIX_COL_PINS { F5, D5, B1, B2, B3, D3, D2, C7, C6, B6, B5, B4, D7, D6, D4, B7, B0 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION ROW2COL + +// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_BREATHING +// #define BACKLIGHT_LEVELS 3 + + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* 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 userful 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 + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * 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 + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +//#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 1 + diff --git a/keyboards/wilba_tech/wt80_a/info.json b/keyboards/wilba_tech/wt80_a/info.json new file mode 100644 index 000000000..a43acb2f5 --- /dev/null +++ b/keyboards/wilba_tech/wt80_a/info.json @@ -0,0 +1,13 @@ +{ + "keyboard_name": "wilba.tech WT80-A", + "url": "https://wilba.tech", + "maintainer": "Wilba", + "bootloader": "atmel-dfu", + "width": 18.25, + "height": 6.5, + "layouts": { + "LAYOUT_all": { + "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"F1", "x":2, "y":0}, {"label":"F2", "x":3, "y":0}, {"label":"F3", "x":4, "y":0}, {"label":"F4", "x":5, "y":0}, {"label":"F5", "x":6.5, "y":0}, {"label":"F6", "x":7.5, "y":0}, {"label":"F7", "x":8.5, "y":0}, {"label":"F8", "x":9.5, "y":0}, {"label":"F9", "x":11, "y":0}, {"label":"F10", "x":12, "y":0}, {"label":"F11", "x":13, "y":0}, {"label":"F12", "x":14, "y":0}, {"label":"PrtSc", "x":15.25, "y":0}, {"label":"Scroll Lock", "x":16.25, "y":0}, {"label":"Pause", "x":17.25, "y":0}, {"label":"~", "x":0, "y":1.5}, {"label":"!", "x":1, "y":1.5}, {"label":"@", "x":2, "y":1.5}, {"label":"#", "x":3, "y":1.5}, {"label":"$", "x":4, "y":1.5}, {"label":"%", "x":5, "y":1.5}, {"label":"^", "x":6, "y":1.5}, {"label":"&", "x":7, "y":1.5}, {"label":"*", "x":8, "y":1.5}, {"label":"(", "x":9, "y":1.5}, {"label":")", "x":10, "y":1.5}, {"label":"_", "x":11, "y":1.5}, {"label":"+", "x":12, "y":1.5}, {"label":"Backspace", "x":13, "y":1.5}, {"x":14, "y":1.5}, {"label":"Insert", "x":15.25, "y":1.5}, {"label":"Home", "x":16.25, "y":1.5}, {"label":"PgUp", "x":17.25, "y":1.5}, {"label":"Tab", "x":0, "y":2.5, "w":1.5}, {"label":"Q", "x":1.5, "y":2.5}, {"label":"W", "x":2.5, "y":2.5}, {"label":"E", "x":3.5, "y":2.5}, {"label":"R", "x":4.5, "y":2.5}, {"label":"T", "x":5.5, "y":2.5}, {"label":"Y", "x":6.5, "y":2.5}, {"label":"U", "x":7.5, "y":2.5}, {"label":"I", "x":8.5, "y":2.5}, {"label":"O", "x":9.5, "y":2.5}, {"label":"P", "x":10.5, "y":2.5}, {"label":"{", "x":11.5, "y":2.5}, {"label":"}", "x":12.5, "y":2.5}, {"label":"|", "x":13.5, "y":2.5, "w":1.5}, {"label":"Delete", "x":15.25, "y":2.5}, {"label":"End", "x":16.25, "y":2.5}, {"label":"PgDn", "x":17.25, "y":2.5}, {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75}, {"label":"A", "x":1.75, "y":3.5}, {"label":"S", "x":2.75, "y":3.5}, {"label":"D", "x":3.75, "y":3.5}, {"label":"F", "x":4.75, "y":3.5}, {"label":"G", "x":5.75, "y":3.5}, {"label":"H", "x":6.75, "y":3.5}, {"label":"J", "x":7.75, "y":3.5}, {"label":"K", "x":8.75, "y":3.5}, {"label":"L", "x":9.75, "y":3.5}, {"label":":", "x":10.75, "y":3.5}, {"label":"\"", "x":11.75, "y":3.5}, {"label":"Enter", "x":12.75, "y":3.5, "w":2.25}, {"label":"Shift", "x":0, "y":4.5, "w":2.25}, {"label":"Z", "x":2.25, "y":4.5}, {"label":"X", "x":3.25, "y":4.5}, {"label":"C", "x":4.25, "y":4.5}, {"label":"V", "x":5.25, "y":4.5}, {"label":"B", "x":6.25, "y":4.5}, {"label":"N", "x":7.25, "y":4.5}, {"label":"M", "x":8.25, "y":4.5}, {"label":"<", "x":9.25, "y":4.5}, {"label":">", "x":10.25, "y":4.5}, {"label":"?", "x":11.25, "y":4.5}, {"label":"Shift", "x":12.25, "y":4.5, "w":1.75}, {"x":14, "y":4.5}, {"label":"\u2191", "x":16.25, "y":4.5}, {"label":"Ctrl", "x":0, "y":5.5, "w":1.25}, {"label":"Win", "x":1.25, "y":5.5, "w":1.25}, {"label":"Alt", "x":2.5, "y":5.5, "w":1.25}, {"x":3.75, "y":5.5, "w":6.25}, {"label":"Alt", "x":10, "y":5.5, "w":1.25}, {"label":"Win", "x":11.25, "y":5.5, "w":1.25}, {"label":"Menu", "x":12.5, "y":5.5, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":5.5, "w":1.25}, {"label":"\u2190", "x":15.25, "y":5.5}, {"label":"\u2193", "x":16.25, "y":5.5}, {"label":"\u2192", "x":17.25, "y":5.5}] + } + } +} diff --git a/keyboards/wilba_tech/wt80_a/keymaps/default/keymap.c b/keyboards/wilba_tech/wt80_a/keymaps/default/keymap.c new file mode 100644 index 000000000..cf9225e3e --- /dev/null +++ b/keyboards/wilba_tech/wt80_a/keymaps/default/keymap.c @@ -0,0 +1,22 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [0] = LAYOUT_all( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_TRNS, KC_UP, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [1] = LAYOUT_all( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +}; + diff --git a/keyboards/wilba_tech/wt80_a/readme.md b/keyboards/wilba_tech/wt80_a/readme.md new file mode 100644 index 000000000..011805748 --- /dev/null +++ b/keyboards/wilba_tech/wt80_a/readme.md @@ -0,0 +1,15 @@ +# WILBA.TECH WT80-A + +![WILBA.TECH WT80-A](https://wilba./tech) + +WT80-A is a keyboard PCB supporting TKL layout with 0.25U gaps. [More info at wilba.tech](https://wilba.tech/) + +Keyboard Maintainer: [Wilba6582](https://github.com/Wilba6582) +Hardware Supported: WILBA.TECH WT80-A +Hardware Availability: Custom keyboard group buys + +Make example for this keyboard (after setting up your build environment): + + make wilba_tech/wt80_a:default + +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). \ No newline at end of file diff --git a/keyboards/wilba_tech/wt80_a/rules.mk b/keyboards/wilba_tech/wt80_a/rules.mk new file mode 100644 index 000000000..99224c247 --- /dev/null +++ b/keyboards/wilba_tech/wt80_a/rules.mk @@ -0,0 +1,68 @@ +# project specific files +SRC = drivers/issi/is31fl3736.c \ + drivers/avr/i2c_master.c \ + keyboards/wilba_tech/wt_mono_backlight.c \ + keyboards/wilba_tech/wt_main.c + +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section +BOOTLOADER = atmel-dfu + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = no # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches diff --git a/keyboards/wilba_tech/wt80_a/wt80_a.c b/keyboards/wilba_tech/wt80_a/wt80_a.c new file mode 100644 index 000000000..ccff6d62c --- /dev/null +++ b/keyboards/wilba_tech/wt80_a/wt80_a.c @@ -0,0 +1,17 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 . + */ + +// Nothing to see here, move along... ;-) diff --git a/keyboards/wilba_tech/wt80_a/wt80_a.h b/keyboards/wilba_tech/wt80_a/wt80_a.h new file mode 100644 index 000000000..26403ef34 --- /dev/null +++ b/keyboards/wilba_tech/wt80_a/wt80_a.h @@ -0,0 +1,43 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 . + */ + +#pragma once + +#include "quantum.h" + +#define ____ KC_NO + +// Right switch of split backspace is at 3,13 and is the only switch +// whose physical position doesn't match switch matrix position :-( +// However, it also makes no sense to view the physical as 18 columns, +// so the numbering goes 00 to 16. Deal with it. + +#define LAYOUT_all( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K015, K016, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K313, K114, K115, K116, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216, \ + K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, \ + K400, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K415, \ + K500, K501, K502, K506, K510, K511, K512, K513, K514, K515, K516 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, ____, K014, K015, K016 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116 }, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216 }, \ + { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, ____, ____, ____ }, \ + { K400, ____, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, ____, K415, ____ }, \ + { K500, K501, K502, ____, ____, ____, K506, ____, ____, ____, K510, K511, K512, K513, K514, K515, K516 } \ +} + diff --git a/keyboards/wilba_tech/wt_main.c b/keyboards/wilba_tech/wt_main.c new file mode 100644 index 000000000..f514dbefc --- /dev/null +++ b/keyboards/wilba_tech/wt_main.c @@ -0,0 +1,55 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 . + */ + +#include "quantum.h" +#include "keyboards/wilba_tech/wt_mono_backlight.h" + +void bootmagic_lite(void) +{ + // The lite version of TMK's bootmagic. + // 100% less potential for accidentally making the + // keyboard do stupid things. + + // We need multiple scans because debouncing can't be turned off. + matrix_scan(); + wait_ms(DEBOUNCING_DELAY); + wait_ms(DEBOUNCING_DELAY); + matrix_scan(); + + // If the Esc (matrix 0,0) is held down on power up, + // reset the EEPROM valid state and jump to bootloader. + if ( matrix_get_row(0) & (1<<0) ) { + // Set the TMK/QMK EEPROM state as invalid. + eeconfig_disable(); + // Jump to bootloader. + bootloader_jump(); + } +} + +void matrix_init_kb(void) +{ + bootmagic_lite(); + backlight_init_drivers(); + backlight_timer_init(); + backlight_timer_enable(); + matrix_init_user(); +} + +void matrix_scan_kb(void) +{ + backlight_update_pwm_buffers(); + matrix_scan_user(); +} diff --git a/keyboards/wilba_tech/wt_mono_backlight.c b/keyboards/wilba_tech/wt_mono_backlight.c new file mode 100644 index 000000000..bf485bce1 --- /dev/null +++ b/keyboards/wilba_tech/wt_mono_backlight.c @@ -0,0 +1,116 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 . + */ + +#include "wt_mono_backlight.h" +#include "drivers/avr/i2c_master.h" +#include "drivers/issi/is31fl3736.h" + +#include + +#define ISSI_ADDR_DEFAULT 0x50 + +bool g_suspend_state = false; + +// Global tick at 20 Hz +uint32_t g_tick = 0; +uint8_t g_config_effect_speed = 0; +uint8_t g_config_brightness = 255; + +void backlight_init_drivers(void) +{ + // Initialize I2C + i2c_init(); + IS31FL3736_init( ISSI_ADDR_DEFAULT ); + + for ( uint8_t index = 0; index < 96; index++ ) { + IS31FL3736_mono_set_led_control_register( index, true ); + } + IS31FL3736_update_led_control_registers( ISSI_ADDR_DEFAULT, 0x00 ); +} + + +// This is (F_CPU/1024) / 20 Hz +// = 15625 Hz / 20 Hz +// = 781 +#define TIMER3_TOP 781 + +void backlight_timer_init(void) +{ + static uint8_t backlight_timer_is_init = 0; + if ( backlight_timer_is_init ) { + return; + } + backlight_timer_is_init = 1; + + // Timer 3 setup + TCCR3B = _BV(WGM32) | // CTC mode OCR3A as TOP + _BV(CS32) | _BV(CS30); // prescale by /1024 + // Set TOP value + uint8_t sreg = SREG; + cli(); + + OCR3AH = (TIMER3_TOP >> 8) & 0xff; + OCR3AL = TIMER3_TOP & 0xff; + SREG = sreg; +} + +void backlight_timer_enable(void) +{ + TIMSK3 |= _BV(OCIE3A); +} + +void backlight_timer_disable(void) +{ + TIMSK3 &= ~_BV(OCIE3A); +} + +void backlight_set_suspend_state(bool state) +{ + g_suspend_state = state; +} + +void backlight_effect_cycle_all(void) +{ + uint8_t offset = ( g_tick << g_config_effect_speed ) & 0xFF; + + backlight_set_brightness_all( offset ); +} + +ISR(TIMER3_COMPA_vect) +{ + // delay 1 second before driving LEDs or doing anything else + static uint8_t startup_tick = 0; + if ( startup_tick < 20 ) { + startup_tick++; + return; + } + + g_tick++; + + //backlight_effect_cycle_all(); + backlight_set_brightness_all( 255 ); +} + +void backlight_update_pwm_buffers(void) +{ + IS31FL3736_update_pwm_buffers(ISSI_ADDR_DEFAULT,0x00); +} + +void backlight_set_brightness_all( uint8_t value ) +{ + IS31FL3736_mono_set_brightness_all( value ); +} + diff --git a/keyboards/wilba_tech/wt_mono_backlight.h b/keyboards/wilba_tech/wt_mono_backlight.h new file mode 100644 index 000000000..70031bedc --- /dev/null +++ b/keyboards/wilba_tech/wt_mono_backlight.h @@ -0,0 +1,33 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 . + */ + +#pragma once + +#include +#include + +void backlight_init_drivers(void); + +void backlight_timer_init(void); +void backlight_timer_enable(void); +void backlight_timer_disable(void); + +void backlight_set_suspend_state(bool state); + +void backlight_update_pwm_buffers(void); + +void backlight_set_brightness_all( uint8_t value ); + From 8b2591c707abe670dbd1ab21237870bc989d0614 Mon Sep 17 00:00:00 2001 From: Daniel Shields Date: Thu, 27 Sep 2018 19:47:26 +0100 Subject: [PATCH 153/788] Keymap: Clean-up of dshields keymaps. (#3983) --- keyboards/model01/keymaps/dshields/config.h | 3 -- keyboards/model01/keymaps/dshields/rules.mk | 3 +- keyboards/planck/keymaps/dshields/config.h | 15 +------ keyboards/planck/keymaps/dshields/keymap.c | 44 --------------------- 4 files changed, 2 insertions(+), 63 deletions(-) diff --git a/keyboards/model01/keymaps/dshields/config.h b/keyboards/model01/keymaps/dshields/config.h index 86a4dd531..4d609e436 100644 --- a/keyboards/model01/keymaps/dshields/config.h +++ b/keyboards/model01/keymaps/dshields/config.h @@ -1,8 +1,5 @@ #pragma once -#define _______ KC_TRNS -#define XXXXXXX KC_NO - #define USB_MAX_POWER_CONSUMPTION 100 #define ONESHOT_TAP_TOGGLE 2 #define ONESHOT_TIMEOUT 3000 diff --git a/keyboards/model01/keymaps/dshields/rules.mk b/keyboards/model01/keymaps/dshields/rules.mk index 4d1abd88a..6c605daec 100644 --- a/keyboards/model01/keymaps/dshields/rules.mk +++ b/keyboards/model01/keymaps/dshields/rules.mk @@ -1,2 +1 @@ -# used by default keymap -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +MOUSEKEY_ENABLE = yes diff --git a/keyboards/planck/keymaps/dshields/config.h b/keyboards/planck/keymaps/dshields/config.h index 9ba854ef0..b149530b8 100644 --- a/keyboards/planck/keymaps/dshields/config.h +++ b/keyboards/planck/keymaps/dshields/config.h @@ -1,15 +1,4 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -#define QMK_ESC_OUTPUT F1 -#define QMK_ESC_INPUT D5 -#define QMK_LED E6 -#define QMK_SPEAKER C6 - -#define _______ KC_TRNS -#define XXXXXXX KC_NO +#pragma once #define USB_MAX_POWER_CONSUMPTION 100 #define ONESHOT_TAP_TOGGLE 2 @@ -39,5 +28,3 @@ // mod-tap keys #define MT_SPC SFT_T(KC_SPC) -#endif - diff --git a/keyboards/planck/keymaps/dshields/keymap.c b/keyboards/planck/keymaps/dshields/keymap.c index a39dc5e77..11abaa6b0 100644 --- a/keyboards/planck/keymaps/dshields/keymap.c +++ b/keyboards/planck/keymaps/dshields/keymap.c @@ -17,68 +17,24 @@ enum planck_keycodes { DYNAMIC_MACRO_RANGE = SAFE_RANGE }; #endif const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* Default - * ,-----------------------------------------------------------------------------------. - * | Q | W | E | R | T | Esc | Bksp | Y | U | I | O | P | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | A | S | D | F | G | Tab | Enter| H | J | K | L | ; | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Z | X | C | V | B | Shift|DmPlay| N | M | , | . | / | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Ctrl | Super| Alt | Fun | Lower| Space | Raise| Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' - */ [DEF] = LAYOUT_planck_grid( KC_Q, KC_W, KC_E, KC_R, KC_T, KC_ESC, KC_BSPC, KC_Y, KC_U, KC_I, KC_O, KC_P , KC_A, KC_S, KC_D, KC_F, KC_G, KC_TAB, KC_ENT, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_Z, KC_X, KC_C, KC_V, KC_B, OSM_SFT, DM_PLAY, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, OSM_CTL, KC_LGUI, OSM_ALT, OSL_FUN, OSL_LWR, MT_SPC, MT_SPC, OSL_RSE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT ), - /* Lower - * ,-----------------------------------------------------------------------------------. - * | ! | @ | # | $ | % | | | ^ | & | * | ( | ) | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | ~ | | | | | | | _ | + | | { | } | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | | | | | | | | | | " | | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | Home | PgDn | PgUp | End | - * `-----------------------------------------------------------------------------------' - */ [LWR] = LAYOUT_planck_grid( KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, _______, _______, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_TILD, _______, _______, _______, _______, _______, _______, KC_UNDS, KC_PLUS, _______, KC_LCBR, KC_RCBR, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DQUO, KC_PIPE, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END ), - /* Raise - * ,-----------------------------------------------------------------------------------. - * | 1 | 2 | 3 | 4 | 5 | | | 6 | 7 | 8 | 9 | 0 | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | ` | | | | | | | - | = | | [ | ] | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | | | | | | | | | | ' | \ | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | Home | PgDn | PgUp | End | - * `-----------------------------------------------------------------------------------' - */ [RSE] = LAYOUT_planck_grid( KC_1, KC_2, KC_3, KC_4, KC_5, _______, _______, KC_6, KC_7, KC_8, KC_9, KC_0 , KC_GRV, _______, _______, _______, _______, _______, _______, KC_MINS, KC_EQL, _______, KC_LBRC, KC_RBRC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_QUOT, KC_BSLS, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END ), - /* Function - * ,-----------------------------------------------------------------------------------. - * | F1 | F2 | F3 | F4 | F5 | Reset|Delete| F6 | F7 | F8 | F9 | F10 | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | F11 | F12 | F13 | F14 | F15 | | | |MsWhLt|MsWhDn|MsWhUp|MsWhRt| - * |------+------+------+------+------+------|------+------+------+------+------+------| - * |BlTggl|BlStep| | | |DmStrt|DmStop| | |MsBtn1|MsBtn2|MsBtn3| - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | |MsLeft|MsDown| MsUp |MsRght| - * `-----------------------------------------------------------------------------------' - */ [FUN] = LAYOUT_planck_grid( KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, RESET, KC_DEL, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10 , KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, _______, _______, _______, KC_WH_L, KC_WH_D, KC_WH_U, KC_WH_R, From 8ef747accf6e59ff50a3dde1cb34f56e4edce9fe Mon Sep 17 00:00:00 2001 From: skullydazed Date: Thu, 27 Sep 2018 13:32:01 -0700 Subject: [PATCH 154/788] Treat too-large firmwares as an error, not a warning (#3956) * Treat too-large firmwares as an error, not a warning * switch the order of printing * I think I have it * adjust the formatting some more --- message.mk | 6 +++--- tmk_core/rules.mk | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/message.mk b/message.mk index 427925dac..6894dd8cb 100644 --- a/message.mk +++ b/message.mk @@ -77,6 +77,6 @@ endef MSG_MAKE_TEST = $(eval $(call GENERATE_MSG_MAKE_TEST))$(MSG_MAKE_TEST_ACTUAL) MSG_TEST = Testing $(BOLD)$(TEST_NAME)$(NO_COLOR) MSG_CHECK_FILESIZE = Checking file size of $(TARGET).hex -MSG_FILE_TOO_BIG = $(ERROR_COLOR)Your file is too big!$(NO_COLOR) $(CURRENT_SIZE)/$(MAX_SIZE) ($(OVER_SIZE) over)\n -MSG_FILE_TOO_SMALL = Your file is too small! $(CURRENT_SIZE)/$(MAX_SIZE)\n -MSG_FILE_JUST_RIGHT = File size is fine - $(CURRENT_SIZE)/$(MAX_SIZE) ($(FREE_SIZE) free)\n +MSG_FILE_TOO_BIG = $(ERROR_COLOR)The firmware is too large!$(NO_COLOR) $(CURRENT_SIZE)/$(MAX_SIZE) ($(OVER_SIZE) bytes over)\n +MSG_FILE_TOO_SMALL = The firmware is too small! $(CURRENT_SIZE)/$(MAX_SIZE)\n +MSG_FILE_JUST_RIGHT = The firmware size is fine - $(CURRENT_SIZE)/$(MAX_SIZE) ($(FREE_SIZE) bytes free)\n diff --git a/tmk_core/rules.mk b/tmk_core/rules.mk index 5b1858b71..f1ef733f6 100644 --- a/tmk_core/rules.mk +++ b/tmk_core/rules.mk @@ -378,7 +378,7 @@ check-size: $(eval OVER_SIZE=$(shell expr $(CURRENT_SIZE) - $(MAX_SIZE))) if [ $(MAX_SIZE) -gt 0 ] && [ $(CURRENT_SIZE) -gt 0 ]; then \ $(SILENT) || printf "$(MSG_CHECK_FILESIZE)" | $(AWK_CMD); \ - if [ $(CURRENT_SIZE) -gt $(MAX_SIZE) ]; then $(PRINT_WARNING_PLAIN); $(SILENT) || printf " * $(MSG_FILE_TOO_BIG)" ; else $(PRINT_OK); $(SILENT) || printf " * $(MSG_FILE_JUST_RIGHT)"; fi \ + if [ $(CURRENT_SIZE) -gt $(MAX_SIZE) ]; then printf "\n * $(MSG_FILE_TOO_BIG)"; $(PRINT_ERROR_PLAIN); else $(PRINT_OK); $(SILENT) || printf " * $(MSG_FILE_JUST_RIGHT)"; fi \ fi else check-size: From a65085a89354e89ddd3517aa63c74ef6dd32ca8b Mon Sep 17 00:00:00 2001 From: Pekaso Date: Fri, 28 Sep 2018 10:06:19 +0900 Subject: [PATCH 155/788] Keyboard: [Fortitude60] LED fix and Serial improvement (#3982) * arrangement Underglow * modified serial function references from helix * Remove defines (ws2812_*REG) --- keyboards/fortitude60/config.h | 1 + .../fortitude60/keymaps/default/config.h | 1 - .../fortitude60/keymaps/default/keymap.c | 4 +- .../fortitude60/keymaps/default/rules.mk | 1 + keyboards/fortitude60/rev1/config.h | 11 +- keyboards/fortitude60/rev1/rules.mk | 1 - keyboards/fortitude60/serial.c | 455 +++++++++++++----- keyboards/fortitude60/serial.h | 86 +++- keyboards/fortitude60/serial_config.h | 14 + 9 files changed, 422 insertions(+), 152 deletions(-) create mode 100644 keyboards/fortitude60/serial_config.h diff --git a/keyboards/fortitude60/config.h b/keyboards/fortitude60/config.h index 863722d7d..27a44ab92 100644 --- a/keyboards/fortitude60/config.h +++ b/keyboards/fortitude60/config.h @@ -19,5 +19,6 @@ along with this program. If not, see . #define CONFIG_H #include "config_common.h" +#include #endif // CONFIG_H diff --git a/keyboards/fortitude60/keymaps/default/config.h b/keyboards/fortitude60/keymaps/default/config.h index b356791fc..174837348 100644 --- a/keyboards/fortitude60/keymaps/default/config.h +++ b/keyboards/fortitude60/keymaps/default/config.h @@ -28,7 +28,6 @@ along with this program. If not, see . // #define MASTER_RIGHT #define EE_HANDS -#define USE_SERIAL_PD2 /* #undef RGBLED_NUM */ /* #define RGBLIGHT_ANIMATIONS */ /* #define RGBLED_NUM 12 */ diff --git a/keyboards/fortitude60/keymaps/default/keymap.c b/keyboards/fortitude60/keymaps/default/keymap.c index 18d2527e4..9d724a8ec 100644 --- a/keyboards/fortitude60/keymaps/default/keymap.c +++ b/keyboards/fortitude60/keymaps/default/keymap.c @@ -119,9 +119,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * ,-----------------------------------------. ,-----------------------------------------. * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | * |------+------+------+------+------+------. ,------+------+------+------+------+------| - * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bksp | + * | ` | 1 | ↑ | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bksp | * |------+------+------+------+------+------. ,------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | | F6 | - | = | [ | ] | | | + * | Del | ← | ↓ | → | F4 | F5 | | F6 | - | = | [ | ] | | | * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| * | | F7 | F8 | F9 | F10 | F11 | | | F12 |ISO # |ISO / | | | | * `-------------+------+------+------+------+------+------+------+------+------+------+-------------' diff --git a/keyboards/fortitude60/keymaps/default/rules.mk b/keyboards/fortitude60/keymaps/default/rules.mk index e0ed6f0c2..1964bd0a7 100644 --- a/keyboards/fortitude60/keymaps/default/rules.mk +++ b/keyboards/fortitude60/keymaps/default/rules.mk @@ -1 +1,2 @@ RGBLIGHT_ENABLE = no +BACKLIGHT_ENABLE = no \ No newline at end of file diff --git a/keyboards/fortitude60/rev1/config.h b/keyboards/fortitude60/rev1/config.h index 4ba195ff8..8c6f21afe 100644 --- a/keyboards/fortitude60/rev1/config.h +++ b/keyboards/fortitude60/rev1/config.h @@ -64,12 +64,11 @@ along with this program. If not, see . ) /* ws2812 RGB LED */ -/* #define RGB_DI_PIN D3 */ -/* #define RGBLIGHT_TIMER */ -/* #define RGBLED_NUM 16 // Number of LEDs */ -/* #define ws2812_PORTREG PORTD */ -/* #define ws2812_DDRREG DDRD */ - +#ifdef RGBLIGHT_ENABLE + #define RGB_DI_PIN B5 + #define RGBLIGHT_TIMER + #define RGBLED_NUM 18 // Number of LEDs */ +#endif /* * Feature disable options * These options are also useful to firmware size reduction. diff --git a/keyboards/fortitude60/rev1/rules.mk b/keyboards/fortitude60/rev1/rules.mk index bd518d8f2..e69de29bb 100644 --- a/keyboards/fortitude60/rev1/rules.mk +++ b/keyboards/fortitude60/rev1/rules.mk @@ -1 +0,0 @@ -BACKLIGHT_ENABLE = yes diff --git a/keyboards/fortitude60/serial.c b/keyboards/fortitude60/serial.c index 46dfad021..cea1a5f6c 100644 --- a/keyboards/fortitude60/serial.c +++ b/keyboards/fortitude60/serial.c @@ -9,34 +9,128 @@ #include #include #include +#include #include #include "serial.h" +//#include -#ifndef USE_I2C +#ifdef USE_SERIAL -// Serial pulse period in microseconds. Its probably a bad idea to lower this -// value. -#define SERIAL_DELAY 24 +#ifndef SERIAL_USE_MULTI_TRANSACTION +/* --- USE Simple API (OLD API, compatible with let's split serial.c) */ + #if SERIAL_SLAVE_BUFFER_LENGTH > 0 + uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; + #endif + #if SERIAL_MASTER_BUFFER_LENGTH > 0 + uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0}; + #endif + uint8_t volatile status0 = 0; -uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; -uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0}; +SSTD_t transactions[] = { + { (uint8_t *)&status0, + #if SERIAL_MASTER_BUFFER_LENGTH > 0 + sizeof(serial_master_buffer), (uint8_t *)serial_master_buffer, + #else + 0, (uint8_t *)NULL, + #endif + #if SERIAL_SLAVE_BUFFER_LENGTH > 0 + sizeof(serial_slave_buffer), (uint8_t *)serial_slave_buffer + #else + 0, (uint8_t *)NULL, + #endif + } +}; -#define SLAVE_DATA_CORRUPT (1<<0) -volatile uint8_t status = 0; +void serial_master_init(void) +{ soft_serial_initiator_init(transactions); } + +void serial_slave_init(void) +{ soft_serial_target_init(transactions); } + +// 0 => no error +// 1 => slave did not respond +// 2 => checksum error +int serial_update_buffers() +{ return soft_serial_transaction(); } + +#endif // Simple API (OLD API, compatible with let's split serial.c) + +#define ALWAYS_INLINE __attribute__((always_inline)) +#define NO_INLINE __attribute__((noinline)) +#define _delay_sub_us(x) __builtin_avr_delay_cycles(x) + +// Serial pulse period in microseconds. +#define TID_SEND_ADJUST 14 + +#define SELECT_SERIAL_SPEED 1 +#if SELECT_SERIAL_SPEED == 0 + // Very High speed + #define SERIAL_DELAY 4 // micro sec + #define READ_WRITE_START_ADJUST 33 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles +#elif SELECT_SERIAL_SPEED == 1 + // High speed + #define SERIAL_DELAY 6 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles +#elif SELECT_SERIAL_SPEED == 2 + // Middle speed + #define SERIAL_DELAY 12 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles +#elif SELECT_SERIAL_SPEED == 3 + // Low speed + #define SERIAL_DELAY 24 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles +#elif SELECT_SERIAL_SPEED == 4 + // Very Low speed + #define SERIAL_DELAY 50 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles +#else +#error Illegal Serial Speed +#endif + + +#define SERIAL_DELAY_HALF1 (SERIAL_DELAY/2) +#define SERIAL_DELAY_HALF2 (SERIAL_DELAY - SERIAL_DELAY/2) + +#define SLAVE_INT_WIDTH_US 1 +#ifndef SERIAL_USE_MULTI_TRANSACTION + #define SLAVE_INT_RESPONSE_TIME SERIAL_DELAY +#else + #define SLAVE_INT_ACK_WIDTH_UNIT 2 + #define SLAVE_INT_ACK_WIDTH 4 +#endif + +static SSTD_t *Transaction_table = NULL; inline static void serial_delay(void) { _delay_us(SERIAL_DELAY); } +inline static +void serial_delay_half1(void) { + _delay_us(SERIAL_DELAY_HALF1); +} + +inline static +void serial_delay_half2(void) { + _delay_us(SERIAL_DELAY_HALF2); +} + +inline static void serial_output(void) ALWAYS_INLINE; inline static void serial_output(void) { SERIAL_PIN_DDR |= SERIAL_PIN_MASK; } // make the serial pin an input with pull-up resistor +inline static void serial_input_with_pullup(void) ALWAYS_INLINE; inline static -void serial_input(void) { +void serial_input_with_pullup(void) { SERIAL_PIN_DDR &= ~SERIAL_PIN_MASK; SERIAL_PIN_PORT |= SERIAL_PIN_MASK; } @@ -46,190 +140,305 @@ uint8_t serial_read_pin(void) { return !!(SERIAL_PIN_INPUT & SERIAL_PIN_MASK); } +inline static void serial_low(void) ALWAYS_INLINE; inline static void serial_low(void) { SERIAL_PIN_PORT &= ~SERIAL_PIN_MASK; } +inline static void serial_high(void) ALWAYS_INLINE; inline static void serial_high(void) { SERIAL_PIN_PORT |= SERIAL_PIN_MASK; } -void serial_master_init(void) { - serial_output(); - serial_high(); +void soft_serial_initiator_init(SSTD_t *sstd_table) +{ + Transaction_table = sstd_table; + serial_output(); + serial_high(); } -void serial_slave_init(void) { - serial_input(); +void soft_serial_target_init(SSTD_t *sstd_table) +{ + Transaction_table = sstd_table; + serial_input_with_pullup(); -#ifndef USE_SERIAL_PD2 - // Enable INT0 - EIMSK |= _BV(INT0); - // Trigger on falling edge of INT0 - EICRA &= ~(_BV(ISC00) | _BV(ISC01)); +#if SERIAL_PIN_MASK == _BV(PD0) + // Enable INT0 + EIMSK |= _BV(INT0); + // Trigger on falling edge of INT0 + EICRA &= ~(_BV(ISC00) | _BV(ISC01)); +#elif SERIAL_PIN_MASK == _BV(PD2) + // Enable INT2 + EIMSK |= _BV(INT2); + // Trigger on falling edge of INT2 + EICRA &= ~(_BV(ISC20) | _BV(ISC21)); #else - // Enable INT2 - EIMSK |= _BV(INT2); - // Trigger on falling edge of INT2 - EICRA &= ~(_BV(ISC20) | _BV(ISC21)); + #error unknown SERIAL_PIN_MASK value #endif } -// Used by the master to synchronize timing with the slave. +// Used by the sender to synchronize timing with the reciver. +static void sync_recv(void) NO_INLINE; static void sync_recv(void) { - serial_input(); - // This shouldn't hang if the slave disconnects because the - // serial line will float to high if the slave does disconnect. + for (uint8_t i = 0; i < SERIAL_DELAY*5 && serial_read_pin(); i++ ) { + } + // This shouldn't hang if the target disconnects because the + // serial line will float to high if the target does disconnect. while (!serial_read_pin()); - serial_delay(); } -// Used by the slave to send a synchronization signal to the master. +// Used by the reciver to send a synchronization signal to the sender. +static void sync_send(void)NO_INLINE; static void sync_send(void) { - serial_output(); - serial_low(); serial_delay(); - serial_high(); } // Reads a byte from the serial line -static -uint8_t serial_read_byte(void) { - uint8_t byte = 0; - serial_input(); - for ( uint8_t i = 0; i < 8; ++i) { - byte = (byte << 1) | serial_read_pin(); - serial_delay(); - _delay_us(1); +static uint8_t serial_read_chunk(uint8_t *pterrcount, uint8_t bit) NO_INLINE; +static uint8_t serial_read_chunk(uint8_t *pterrcount, uint8_t bit) { + uint8_t byte, i, p, pb; + + _delay_sub_us(READ_WRITE_START_ADJUST); + for( i = 0, byte = 0, p = 0; i < bit; i++ ) { + serial_delay_half1(); // read the middle of pulses + if( serial_read_pin() ) { + byte = (byte << 1) | 1; p ^= 1; + } else { + byte = (byte << 1) | 0; p ^= 0; + } + _delay_sub_us(READ_WRITE_WIDTH_ADJUST); + serial_delay_half2(); } + /* recive parity bit */ + serial_delay_half1(); // read the middle of pulses + pb = serial_read_pin(); + _delay_sub_us(READ_WRITE_WIDTH_ADJUST); + serial_delay_half2(); + + *pterrcount += (p != pb)? 1 : 0; return byte; } // Sends a byte with MSB ordering -static -void serial_write_byte(uint8_t data) { - uint8_t b = 8; - serial_output(); - while( b-- ) { - if(data & (1 << b)) { - serial_high(); - } else { - serial_low(); +void serial_write_chunk(uint8_t data, uint8_t bit) NO_INLINE; +void serial_write_chunk(uint8_t data, uint8_t bit) { + uint8_t b, p; + for( p = 0, b = 1<<(bit-1); b ; b >>= 1) { + if(data & b) { + serial_high(); p ^= 1; + } else { + serial_low(); p ^= 0; + } + serial_delay(); } + /* send parity bit */ + if(p & 1) { serial_high(); } + else { serial_low(); } serial_delay(); + + serial_low(); // sync_send() / senc_recv() need raise edge +} + +static void serial_send_packet(uint8_t *buffer, uint8_t size) NO_INLINE; +static +void serial_send_packet(uint8_t *buffer, uint8_t size) { + for (uint8_t i = 0; i < size; ++i) { + uint8_t data; + data = buffer[i]; + sync_send(); + serial_write_chunk(data,8); } } -// interrupt handle to be used by the slave device +static uint8_t serial_recive_packet(uint8_t *buffer, uint8_t size) NO_INLINE; +static +uint8_t serial_recive_packet(uint8_t *buffer, uint8_t size) { + uint8_t pecount = 0; + for (uint8_t i = 0; i < size; ++i) { + uint8_t data; + sync_recv(); + data = serial_read_chunk(&pecount, 8); + buffer[i] = data; + } + return pecount == 0; +} + +inline static +void change_sender2reciver(void) { + sync_send(); //0 + serial_delay_half1(); //1 + serial_low(); //2 + serial_input_with_pullup(); //2 + serial_delay_half1(); //3 +} + +inline static +void change_reciver2sender(void) { + sync_recv(); //0 + serial_delay(); //1 + serial_low(); //3 + serial_output(); //3 + serial_delay_half1(); //4 +} + +// interrupt handle to be used by the target device ISR(SERIAL_PIN_INTERRUPT) { - sync_send(); - uint8_t checksum = 0; - for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) { - serial_write_byte(serial_slave_buffer[i]); - sync_send(); - checksum += serial_slave_buffer[i]; - } - serial_write_byte(checksum); - sync_send(); +#ifndef SERIAL_USE_MULTI_TRANSACTION + serial_low(); + serial_output(); + SSTD_t *trans = Transaction_table; +#else + // recive transaction table index + uint8_t tid; + uint8_t pecount = 0; + sync_recv(); + tid = serial_read_chunk(&pecount,4); + if(pecount> 0) + return; + serial_delay_half1(); - // wait for the sync to finish sending - serial_delay(); + serial_high(); // response step1 low->high + serial_output(); + _delay_sub_us(SLAVE_INT_ACK_WIDTH_UNIT*SLAVE_INT_ACK_WIDTH); + SSTD_t *trans = &Transaction_table[tid]; + serial_low(); // response step2 ack high->low +#endif - // read the middle of pulses - _delay_us(SERIAL_DELAY/2); + // target send phase + if( trans->target2initiator_buffer_size > 0 ) + serial_send_packet((uint8_t *)trans->target2initiator_buffer, + trans->target2initiator_buffer_size); + // target switch to input + change_sender2reciver(); - uint8_t checksum_computed = 0; - for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) { - serial_master_buffer[i] = serial_read_byte(); - sync_send(); - checksum_computed += serial_master_buffer[i]; - } - uint8_t checksum_received = serial_read_byte(); - sync_send(); - - serial_input(); // end transaction - - if ( checksum_computed != checksum_received ) { - status |= SLAVE_DATA_CORRUPT; + // target recive phase + if( trans->initiator2target_buffer_size > 0 ) { + if (serial_recive_packet((uint8_t *)trans->initiator2target_buffer, + trans->initiator2target_buffer_size) ) { + *trans->status = TRANSACTION_ACCEPTED; + } else { + *trans->status = TRANSACTION_DATA_ERROR; + } } else { - status &= ~SLAVE_DATA_CORRUPT; + *trans->status = TRANSACTION_ACCEPTED; } + + sync_recv(); //weit initiator output to high } -inline -bool serial_slave_DATA_CORRUPT(void) { - return status & SLAVE_DATA_CORRUPT; -} - -// Copies the serial_slave_buffer to the master and sends the -// serial_master_buffer to the slave. +///////// +// start transaction by initiator +// +// int soft_serial_transaction(int sstd_index) // // Returns: -// 0 => no error -// 1 => slave did not respond -int serial_update_buffers(void) { - // this code is very time dependent, so we need to disable interrupts +// TRANSACTION_END +// TRANSACTION_NO_RESPONSE +// TRANSACTION_DATA_ERROR +// this code is very time dependent, so we need to disable interrupts +#ifndef SERIAL_USE_MULTI_TRANSACTION +int soft_serial_transaction(void) { + SSTD_t *trans = Transaction_table; +#else +int soft_serial_transaction(int sstd_index) { + SSTD_t *trans = &Transaction_table[sstd_index]; +#endif cli(); - // signal to the slave that we want to start a transaction + // signal to the target that we want to start a transaction serial_output(); serial_low(); - _delay_us(1); + _delay_us(SLAVE_INT_WIDTH_US); - // wait for the slaves response - serial_input(); - serial_high(); - _delay_us(SERIAL_DELAY); +#ifndef SERIAL_USE_MULTI_TRANSACTION + // wait for the target response + serial_input_with_pullup(); + _delay_us(SLAVE_INT_RESPONSE_TIME); - // check if the slave is present + // check if the target is present if (serial_read_pin()) { - // slave failed to pull the line low, assume not present + // target failed to pull the line low, assume not present + serial_output(); + serial_high(); + *trans->status = TRANSACTION_NO_RESPONSE; sei(); - return 1; + return TRANSACTION_NO_RESPONSE; } - // if the slave is present syncronize with it - sync_recv(); +#else + // send transaction table index + sync_send(); + _delay_sub_us(TID_SEND_ADJUST); + serial_write_chunk(sstd_index, 4); + serial_delay_half1(); - uint8_t checksum_computed = 0; - // receive data from the slave - for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) { - serial_slave_buffer[i] = serial_read_byte(); - sync_recv(); - checksum_computed += serial_slave_buffer[i]; - } - uint8_t checksum_received = serial_read_byte(); - sync_recv(); - - if (checksum_computed != checksum_received) { - sei(); - return 2; + // wait for the target response (step1 low->high) + serial_input_with_pullup(); + while( !serial_read_pin() ) { + _delay_sub_us(2); } - uint8_t checksum = 0; - // send data to the slave - for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) { - serial_write_byte(serial_master_buffer[i]); - sync_recv(); - checksum += serial_master_buffer[i]; + // check if the target is present (step2 high->low) + for( int i = 0; serial_read_pin(); i++ ) { + if (i > SLAVE_INT_ACK_WIDTH + 1) { + // slave failed to pull the line low, assume not present + serial_output(); + serial_high(); + *trans->status = TRANSACTION_NO_RESPONSE; + sei(); + return TRANSACTION_NO_RESPONSE; + } + _delay_sub_us(SLAVE_INT_ACK_WIDTH_UNIT); + } +#endif + + // initiator recive phase + // if the target is present syncronize with it + if( trans->target2initiator_buffer_size > 0 ) { + if (!serial_recive_packet((uint8_t *)trans->target2initiator_buffer, + trans->target2initiator_buffer_size) ) { + serial_output(); + serial_high(); + *trans->status = TRANSACTION_DATA_ERROR; + sei(); + return TRANSACTION_DATA_ERROR; + } + } + + // initiator switch to output + change_reciver2sender(); + + // initiator send phase + if( trans->initiator2target_buffer_size > 0 ) { + serial_send_packet((uint8_t *)trans->initiator2target_buffer, + trans->initiator2target_buffer_size); } - serial_write_byte(checksum); - sync_recv(); // always, release the line when not in use - serial_output(); - serial_high(); + sync_send(); + *trans->status = TRANSACTION_END; sei(); - return 0; + return TRANSACTION_END; } +#ifdef SERIAL_USE_MULTI_TRANSACTION +int soft_serial_get_and_clean_status(int sstd_index) { + SSTD_t *trans = &Transaction_table[sstd_index]; + cli(); + int retval = *trans->status; + *trans->status = 0;; + sei(); + return retval; +} #endif + +#endif \ No newline at end of file diff --git a/keyboards/fortitude60/serial.h b/keyboards/fortitude60/serial.h index 361f1881b..d00898055 100644 --- a/keyboards/fortitude60/serial.h +++ b/keyboards/fortitude60/serial.h @@ -1,32 +1,80 @@ -#ifndef MY_SERIAL_H -#define MY_SERIAL_H +#ifndef SOFT_SERIAL_H +#define SOFT_SERIAL_H -#include "config.h" #include -/* TODO: some defines for interrupt setup */ -#define SERIAL_PIN_DDR DDRD -#define SERIAL_PIN_PORT PORTD -#define SERIAL_PIN_INPUT PIND +// ///////////////////////////////////////////////////////////////// +// Need Soft Serial defines in serial_config.h +// ///////////////////////////////////////////////////////////////// +// ex. +// #define SERIAL_PIN_DDR DDRD +// #define SERIAL_PIN_PORT PORTD +// #define SERIAL_PIN_INPUT PIND +// #define SERIAL_PIN_MASK _BV(PD?) ?=0,2 +// #define SERIAL_PIN_INTERRUPT INT?_vect ?=0,2 +// +// //// USE Simple API (OLD API, compatible with let's split serial.c) +// ex. +// #define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 +// #define SERIAL_MASTER_BUFFER_LENGTH 1 +// +// //// USE flexible API (using multi-type transaction function) +// #define SERIAL_USE_MULTI_TRANSACTION +// +// ///////////////////////////////////////////////////////////////// -#ifndef USE_SERIAL_PD2 -#define SERIAL_PIN_MASK _BV(PD0) -#define SERIAL_PIN_INTERRUPT INT0_vect -#else -#define SERIAL_PIN_MASK _BV(PD2) -#define SERIAL_PIN_INTERRUPT INT2_vect -#endif -#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 -#define SERIAL_MASTER_BUFFER_LENGTH 1 - -// Buffers for master - slave communication +#ifndef SERIAL_USE_MULTI_TRANSACTION +/* --- USE Simple API (OLD API, compatible with let's split serial.c) */ +#if SERIAL_SLAVE_BUFFER_LENGTH > 0 extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH]; +#endif +#if SERIAL_MASTER_BUFFER_LENGTH > 0 extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH]; +#endif void serial_master_init(void); void serial_slave_init(void); int serial_update_buffers(void); -bool serial_slave_data_corrupt(void); +#endif // USE Simple API + +// Soft Serial Transaction Descriptor +typedef struct _SSTD_t { + uint8_t *status; + uint8_t initiator2target_buffer_size; + uint8_t *initiator2target_buffer; + uint8_t target2initiator_buffer_size; + uint8_t *target2initiator_buffer; +} SSTD_t; + +// initiator is transaction start side +void soft_serial_initiator_init(SSTD_t *sstd_table); +// target is interrupt accept side +void soft_serial_target_init(SSTD_t *sstd_table); + +// initiator resullt +#define TRANSACTION_END 0 +#define TRANSACTION_NO_RESPONSE 0x1 +#define TRANSACTION_DATA_ERROR 0x2 +#ifndef SERIAL_USE_MULTI_TRANSACTION +int soft_serial_transaction(void); +#else +int soft_serial_transaction(int sstd_index); #endif + +// target status +// *SSTD_t.status has +// initiator: +// TRANSACTION_END +// or TRANSACTION_NO_RESPONSE +// or TRANSACTION_DATA_ERROR +// target: +// TRANSACTION_DATA_ERROR +// or TRANSACTION_ACCEPTED +#define TRANSACTION_ACCEPTED 0x4 +#ifdef SERIAL_USE_MULTI_TRANSACTION +int soft_serial_get_and_clean_status(int sstd_index); +#endif + +#endif /* SOFT_SERIAL_H */ \ No newline at end of file diff --git a/keyboards/fortitude60/serial_config.h b/keyboards/fortitude60/serial_config.h new file mode 100644 index 000000000..96a54afbd --- /dev/null +++ b/keyboards/fortitude60/serial_config.h @@ -0,0 +1,14 @@ +#ifndef SOFT_SERIAL_CONFIG_H +#define SOFT_SERIAL_CONFIG_H + +/* Soft Serial defines */ +#define SERIAL_PIN_DDR DDRD +#define SERIAL_PIN_PORT PORTD +#define SERIAL_PIN_INPUT PIND +#define SERIAL_PIN_MASK _BV(PD2) +#define SERIAL_PIN_INTERRUPT INT2_vect + +#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 +#define SERIAL_MASTER_BUFFER_LENGTH 1 + +#endif /* SOFT_SERIAL_CONFIG_H */ \ No newline at end of file From 246d539f295c70846aa4ecaf9cfbe79b959bf3c7 Mon Sep 17 00:00:00 2001 From: Ethan Madden Date: Thu, 27 Sep 2018 18:09:23 -0700 Subject: [PATCH 156/788] Keymap: add clicky support to jetpacktuxedo keymap (#3990) controlled by dip 3 with pitch modulated by the knob --- keyboards/planck/keymaps/jetpacktuxedo/config.h | 2 ++ keyboards/planck/keymaps/jetpacktuxedo/keymap.c | 13 +++++++++++++ 2 files changed, 15 insertions(+) diff --git a/keyboards/planck/keymaps/jetpacktuxedo/config.h b/keyboards/planck/keymaps/jetpacktuxedo/config.h index f216dc02d..7efe97a57 100644 --- a/keyboards/planck/keymaps/jetpacktuxedo/config.h +++ b/keyboards/planck/keymaps/jetpacktuxedo/config.h @@ -2,6 +2,7 @@ #ifdef AUDIO_ENABLE #define STARTUP_SONG SONG(PLANCK_SOUND) + #define AUDIO_CLICKY #endif /* @@ -30,3 +31,4 @@ // Most tactile encoders have detents every 4 stages #define ENCODER_RESOLUTION 4 + diff --git a/keyboards/planck/keymaps/jetpacktuxedo/keymap.c b/keyboards/planck/keymaps/jetpacktuxedo/keymap.c index 2994c0c07..132405686 100644 --- a/keyboards/planck/keymaps/jetpacktuxedo/keymap.c +++ b/keyboards/planck/keymaps/jetpacktuxedo/keymap.c @@ -189,6 +189,13 @@ uint8_t muse_offset = 70; uint16_t muse_tempo = 20; void encoder_update(bool clockwise) { + if (is_clicky_on()) { + if (clockwise) { + clicky_freq_up(); + } else { + clicky_freq_down(); + } + } else if (muse_mode) { if (IS_LAYER_ON(_RAISE)) { if (clockwise) { @@ -248,6 +255,12 @@ void dip_update(uint8_t index, bool active) { stop_all_notes(); #endif } + case 2: + if (active) { + clicky_on(); + } else { + clicky_off(); + } } } From edeace279b1cdc5a5450cc5b41d49b341a3a121f Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Thu, 27 Sep 2018 18:12:32 -0700 Subject: [PATCH 157/788] Make Audio Clicky's randomness a float Rather than a define, but read from the define. This way, a smart coder could externally configure the randomness, changing it on the fly This is also a precursor step to adding full on support for configurable randomness. --- quantum/process_keycode/process_clicky.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/quantum/process_keycode/process_clicky.c b/quantum/process_keycode/process_clicky.c index 36578047a..8238c263f 100644 --- a/quantum/process_keycode/process_clicky.c +++ b/quantum/process_keycode/process_clicky.c @@ -20,6 +20,7 @@ #endif // !AUDIO_CLICKY_FREQ_RANDOMNESS float clicky_freq = AUDIO_CLICKY_FREQ_DEFAULT; +float clicky_rand = AUDIO_CLICKY_FREQ_RANDOMNESS; float clicky_song[][2] = {{AUDIO_CLICKY_FREQ_DEFAULT, 3}, {AUDIO_CLICKY_FREQ_DEFAULT, 1}}; // 3 and 1 --> durations extern audio_config_t audio_config; @@ -33,8 +34,8 @@ void clicky_play(void) { #ifndef NO_MUSIC_MODE if (music_activated || midi_activated) return; #endif // !NO_MUSIC_MODE - clicky_song[0][0] = 2.0f * clicky_freq * (1.0f + AUDIO_CLICKY_FREQ_RANDOMNESS * ( ((float)rand()) / ((float)(RAND_MAX)) ) ); - clicky_song[1][0] = clicky_freq * (1.0f + AUDIO_CLICKY_FREQ_RANDOMNESS * ( ((float)rand()) / ((float)(RAND_MAX)) ) ); + clicky_song[0][0] = 2.0f * clicky_freq * (1.0f + clicky_rand * ( ((float)rand()) / ((float)(RAND_MAX)) ) ); + clicky_song[1][0] = clicky_freq * (1.0f + clicky_rand * ( ((float)rand()) / ((float)(RAND_MAX)) ) ); PLAY_SONG(clicky_song); } From baebbc096702c3ecc0ee89b4fbf5749e79f02375 Mon Sep 17 00:00:00 2001 From: Takeshi ISHII <2170248+mtei@users.noreply.github.com> Date: Fri, 28 Sep 2018 11:02:12 +0900 Subject: [PATCH 158/788] add 'mavrdude' target into tmk_core/avr.mk (#3986) * add 'mavrdude' target into tmk_core/avr.mk I made it a little convenient when writing the same binary to multiple Pro Micro. * rename target name 'mavrdude' to 'avrdude-loop' * modify docs/flashing.md about avrdude-loop * mdify docs/flashing.md again * modifi docs/flashing.md 3rd --- docs/flashing.md | 6 ++++++ tmk_core/avr.mk | 12 +++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/docs/flashing.md b/docs/flashing.md index e5fe59f8f..66c08a361 100644 --- a/docs/flashing.md +++ b/docs/flashing.md @@ -78,6 +78,12 @@ or make ::avrdude +or if you want to flash multiple boards, use the following command + + make ::avrdude-loop + +When you're done flashing boards, you'll need to hit Ctrl + C or whatever the correct keystroke is for your operating system to break the loop. + ## Halfkay Halfkay is a super-slim protocol developed by PJRC that uses HID, and come on all Teensys (namely the 2.0). diff --git a/tmk_core/avr.mk b/tmk_core/avr.mk index 2f955b18f..add904c9c 100644 --- a/tmk_core/avr.mk +++ b/tmk_core/avr.mk @@ -169,7 +169,8 @@ dfu-ee: $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).eep fi $(DFU_PROGRAMMER) $(MCU) reset -avrdude: $(BUILD_DIR)/$(TARGET).hex check-size cpfirmware +define EXEC_AVRDUDE + USB= ;\ if $(GREP) -q -s Microsoft /proc/version; then \ echo 'ERROR: AVR flashing cannot be automated within the Windows Subsystem for Linux (WSL) currently. Instead, take the .hex file generated and flash it using AVRDUDE, AVRDUDESS, or XLoader.'; \ else \ @@ -191,6 +192,15 @@ avrdude: $(BUILD_DIR)/$(TARGET).hex check-size cpfirmware sleep 1; \ avrdude -p $(MCU) -c avr109 -P $$USB -U flash:w:$(BUILD_DIR)/$(TARGET).hex; \ fi +endef + +avrdude: $(BUILD_DIR)/$(TARGET).hex check-size cpfirmware + $(call EXEC_AVRDUDE) + +avrdude-loop: $(BUILD_DIR)/$(TARGET).hex check-size cpfirmware + while true; do \ + $(call EXEC_AVRDUDE) ; \ + done # Convert hex to bin. bin: $(BUILD_DIR)/$(TARGET).hex From 96c9ebc2e48b8f327bca2a2d5db77c0ab2ef6c8a Mon Sep 17 00:00:00 2001 From: Chiang Fong Lee Date: Sat, 18 Aug 2018 12:19:29 +0800 Subject: [PATCH 159/788] Revert "Split Common: Serial Backlight LED fix (#3586)" This reverts commit 3eabd7946ec5e47d12d603d591e8d8658d82fa42. --- quantum/split_common/matrix.c | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/quantum/split_common/matrix.c b/quantum/split_common/matrix.c index 3d2983f2e..ff6738b58 100644 --- a/quantum/split_common/matrix.c +++ b/quantum/split_common/matrix.c @@ -355,24 +355,6 @@ void matrix_slave_scan(void) { for (int i = 0; i < ROWS_PER_HAND; ++i) { serial_slave_buffer[i] = matrix[offset+i]; } -#endif -#ifdef USE_I2C -#ifdef BACKLIGHT_ENABLE - // Read backlight level sent from master and update level on slave - backlight_set(i2c_slave_buffer[0]); -#endif - for (int i = 0; i < ROWS_PER_HAND; ++i) { - i2c_slave_buffer[i+1] = matrix[offset+i]; - } -#else // USE_SERIAL - for (int i = 0; i < ROWS_PER_HAND; ++i) { - serial_slave_buffer[i] = matrix[offset+i]; - } - -#ifdef BACKLIGHT_ENABLE - // Read backlight level sent from master and update level on slave - backlight_set(serial_master_buffer[SERIAL_BACKLIT_START]); -#endif #endif matrix_slave_scan_user(); } From 7d2d0c6795eaaa87d4e13fc159807b64ca2d71f9 Mon Sep 17 00:00:00 2001 From: Chiang Fong Lee Date: Sat, 18 Aug 2018 12:46:12 +0800 Subject: [PATCH 160/788] split_common: fix backlight update for serial boards --- quantum/split_common/split_util.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/quantum/split_common/split_util.c b/quantum/split_common/split_util.c index 13b09d5b8..7c87de4d9 100644 --- a/quantum/split_common/split_util.c +++ b/quantum/split_common/split_util.c @@ -106,14 +106,14 @@ void keyboard_slave_loop(void) { // Read Backlight Info #ifdef BACKLIGHT_ENABLE - if (BACKLIT_DIRTY) { - #ifdef USE_I2C + #ifdef USE_I2C + if (BACKLIT_DIRTY) { backlight_set(i2c_slave_buffer[I2C_BACKLIT_START]); - #else // USE_SERIAL - backlight_set(serial_master_buffer[SERIAL_BACKLIT_START]); - #endif - BACKLIT_DIRTY = false; - } + BACKLIT_DIRTY = false; + } + #else // USE_SERIAL + backlight_set(serial_master_buffer[SERIAL_BACKLIT_START]); + #endif #endif // Read RGB Info #ifdef RGBLIGHT_ENABLE From b382076ad1a6d857b6f185077b5f3635801b4ad6 Mon Sep 17 00:00:00 2001 From: James Laird-Wah Date: Fri, 28 Sep 2018 13:53:36 +1000 Subject: [PATCH 161/788] Keyboard: keyboardio model01: rgbmatrix support (#3989) * model01: implement RGB matrix feature LEDs can still be individually controlled if this is switched off. * model01: use fast banked LED setting commands * model01: update default keymap to use RGB matrix * model01: update RGB matrix support to match common_features.mk * rgb_matrix: include This was missing after commit 4d5705ea6ceeb11cd2adc018644ec87c51af4e86 which introduces a use of memset(). * model01: make g_rgb_leds weak This allows users to override which LEDs are configured as modifiers, or tweak the x/y coordinates, should they so choose. --- keyboards/model01/config.h | 3 + keyboards/model01/keymaps/default/keymap.c | 57 ++++++-- keyboards/model01/leds.c | 144 ++++++++++++++++++--- keyboards/model01/leds.h | 9 +- keyboards/model01/rules.mk | 4 +- quantum/rgb_matrix.c | 1 + 6 files changed, 182 insertions(+), 36 deletions(-) diff --git a/keyboards/model01/config.h b/keyboards/model01/config.h index 796653f45..167310731 100644 --- a/keyboards/model01/config.h +++ b/keyboards/model01/config.h @@ -33,3 +33,6 @@ along with this program. If not, see . /* The scanners already debounce for us */ #define DEBOUNCING_DELAY 0 + +/* RGB matrix constants */ +#define DRIVER_LED_TOTAL 64 diff --git a/keyboards/model01/keymaps/default/keymap.c b/keyboards/model01/keymaps/default/keymap.c index cdc050cd9..a6e5303fe 100644 --- a/keyboards/model01/keymaps/default/keymap.c +++ b/keyboards/model01/keymaps/default/keymap.c @@ -26,7 +26,7 @@ enum { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [DEF] = LAYOUT( RESET , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , TG(NUM), - KC_GRV , KC_Q , KC_W , KC_E , KC_R , KC_T , _______, _______, KC_Y , KC_U , KC_I , KC_O , KC_P , KC_EQL , + KC_GRV , KC_Q , KC_W , KC_E , KC_R , KC_T , RGB_MOD, _______, KC_Y , KC_U , KC_I , KC_O , KC_P , KC_EQL , KC_PGUP, KC_A , KC_S , KC_D , KC_F , KC_G , KC_TAB , KC_ENT , KC_H , KC_J , KC_K , KC_L , KC_SCLN, KC_QUOT, KC_PGDN, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_ESC , _______, KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, KC_MINS, KC_LCTL, KC_RCTL, @@ -48,7 +48,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [FUN] = LAYOUT( _______, KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , - KC_TAB , _______, KC_MS_U, _______, KC_BTN3, _______, _______, KC_MPRV, KC_MNXT, KC_LCBR, KC_RCBR, KC_LBRC, KC_RBRC, KC_F12 , + KC_TAB , _______, KC_MS_U, _______, KC_BTN3, _______, RGB_TOG, KC_MPRV, KC_MNXT, KC_LCBR, KC_RCBR, KC_LBRC, KC_RBRC, KC_F12 , KC_HOME, KC_MS_L, KC_MS_D, KC_MS_R, KC_BTN1, _______, _______, KC_MPLY, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT, _______, _______, KC_END , KC_PSCR, KC_INS , _______, KC_BTN2, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, KC_BSLS, KC_PIPE, _______, _______, @@ -73,21 +73,52 @@ LAYOUT( ) */ +static void set_numpad_colours(int on, void (*write)(int, uint8_t, uint8_t, uint8_t)) { + if (!on) { + for (int i=44; i<=60; i++) + write(i, 0, 0, 0); + write(63, 0, 0, 0); + return; + } + + /* main number keys */ + for (int i=44; i<=47; i++) + write(i, 255, 0, 0); + for (int i=49; i<=54; i++) + write(i, 255, 0, 0); + + /* accessory keys */ + write(48, 128, 128, 0); + for (int i=55; i<=59; i++) + write(i, 128, 128, 0); + + // enter + write(63, 0, 128, 0); + + // num key + write(60, 128, 0, 128); +} + +#ifdef RGB_MATRIX_ENABLE +/* the RGB matrix effects will overwrite the numpad indicator. + * this handy mechanism allows to override the matrix effects. + */ +void rgb_matrix_indicators_user(void) { + if (layer_state & (1< #include #include +#include +#include #include "model01.h" #define I2C_TIMEOUT 1000 -#define LINCOR(i) pgm_read_byte(&CIE1931_CURVE[i]) - -int set_all_leds_to_raw(uint8_t r, uint8_t g, uint8_t b) { +void set_all_leds_to(uint8_t r, uint8_t g, uint8_t b) { uint8_t buf[] = { TWI_CMD_LED_SET_ALL_TO, b, g, r }; - int ret = 0; - ret |= i2c_transmit(I2C_ADDR(LEFT), buf, sizeof(buf), I2C_TIMEOUT); - ret |= i2c_transmit(I2C_ADDR(RIGHT), buf, sizeof(buf), I2C_TIMEOUT); + i2c_transmit(I2C_ADDR(LEFT), buf, sizeof(buf), I2C_TIMEOUT); + i2c_transmit(I2C_ADDR(RIGHT), buf, sizeof(buf), I2C_TIMEOUT); _delay_us(10); - return ret; } -int set_all_leds_to(uint8_t r, uint8_t g, uint8_t b) { - return set_all_leds_to_raw(LINCOR(r), LINCOR(g), LINCOR(b)); -} - -int set_led_to_raw(uint8_t led, uint8_t r, uint8_t g, uint8_t b) { +void set_led_to(int led, uint8_t r, uint8_t g, uint8_t b) { uint8_t buf[] = { TWI_CMD_LED_SET_ONE_TO, led & 0x1f, b, g, r }; int hand = (led >= 32) ? RIGHT : LEFT; - int ret = i2c_transmit(I2C_ADDR(hand), buf, sizeof(buf), I2C_TIMEOUT); + i2c_transmit(I2C_ADDR(hand), buf, sizeof(buf), I2C_TIMEOUT); _delay_us(10); - return ret; } -int set_led_to(uint8_t led, uint8_t r, uint8_t g, uint8_t b) { - return set_led_to_raw(led, LINCOR(r), LINCOR(g), LINCOR(b)); +#ifdef RGB_MATRIX_ENABLE + +__attribute__ ((weak)) +const rgb_led g_rgb_leds[DRIVER_LED_TOTAL] = { + {{0x73}, { 3, 35}, 0}, + {{0x72}, { 0, 26}, 0}, + {{0x71}, { 0, 17}, 0}, + {{0x70}, { 0, 6}, 0}, + {{0x60}, { 14, 5}, 0}, + {{0x61}, { 15, 16}, 0}, + {{0x62}, { 16, 25}, 0}, + {{0x63}, { 17, 34}, 0}, + {{0x53}, { 31, 29}, 0}, + {{0x52}, { 31, 19}, 0}, + {{0x51}, { 30, 11}, 0}, + {{0x50}, { 30, 1}, 0}, + {{0x40}, { 45, 0}, 0}, + {{0x41}, { 45, 8}, 0}, + {{0x42}, { 46, 17}, 0}, + {{0x43}, { 46, 27}, 0}, + {{0x33}, { 60, 27}, 0}, + {{0x32}, { 60, 18}, 0}, + {{0x31}, { 60, 9}, 0}, + {{0x30}, { 60, 0}, 0}, + {{0x20}, { 74, 2}, 0}, + {{0x21}, { 74, 11}, 0}, + {{0x22}, { 75, 20}, 0}, + {{0x23}, { 74, 28}, 0}, + {{0x12}, { 89, 30}, 0}, + {{0x11}, { 89, 19}, 0}, + {{0x10}, { 89, 7}, 0}, + {{0x00}, { 70, 38}, 1}, + {{0x01}, { 82, 41}, 1}, + {{0x02}, { 93, 45}, 1}, + {{0x03}, {104, 50}, 1}, + {{0x13}, { 74, 64}, 1}, + {{0x67}, {149, 64}, 1}, + {{0x77}, {119, 50}, 1}, + {{0x76}, {130, 45}, 1}, + {{0x75}, {141, 41}, 1}, + {{0x74}, {153, 38}, 1}, + {{0x64}, {134, 7}, 0}, + {{0x65}, {134, 19}, 0}, + {{0x66}, {134, 30}, 0}, + {{0x57}, {149, 28}, 0}, + {{0x56}, {148, 20}, 0}, + {{0x55}, {149, 11}, 0}, + {{0x54}, {149, 2}, 0}, + {{0x44}, {163, 0}, 0}, + {{0x45}, {163, 9}, 0}, + {{0x46}, {163, 18}, 0}, + {{0x47}, {163, 27}, 0}, + {{0x37}, {177, 27}, 0}, + {{0x36}, {177, 17}, 0}, + {{0x35}, {178, 8}, 0}, + {{0x34}, {178, 0}, 0}, + {{0x24}, {193, 1}, 0}, + {{0x25}, {193, 11}, 0}, + {{0x26}, {192, 19}, 0}, + {{0x27}, {192, 29}, 0}, + {{0x17}, {206, 34}, 0}, + {{0x16}, {207, 25}, 0}, + {{0x15}, {208, 16}, 0}, + {{0x14}, {209, 5}, 0}, + {{0x04}, {224, 6}, 0}, + {{0x05}, {223, 17}, 0}, + {{0x06}, {223, 26}, 0}, + {{0x07}, {220, 35}, 0}, +}; + +static struct { + uint8_t b; + uint8_t g; + uint8_t r; +} __attribute__((packed)) led_state[64]; + +static void set_color(int index, uint8_t r, uint8_t g, uint8_t b) { + led_state[index].r = r; + led_state[index].g = g; + led_state[index].b = b; } +static void set_color_all(uint8_t r, uint8_t g, uint8_t b) { + for (int i=0; i +#include -int set_all_leds_to(uint8_t r, uint8_t g, uint8_t b); -int set_led_to(uint8_t led, uint8_t r, uint8_t g, uint8_t b); - -/* Raw (gamma uncorrected) LED values */ -int set_all_leds_to_raw(uint8_t r, uint8_t g, uint8_t b); -int set_led_to_raw(uint8_t led, uint8_t r, uint8_t g, uint8_t b); +void set_all_leds_to(uint8_t r, uint8_t g, uint8_t b); +void set_led_to(int led, uint8_t r, uint8_t g, uint8_t b); diff --git a/keyboards/model01/rules.mk b/keyboards/model01/rules.mk index cab7065ff..49ab981d1 100644 --- a/keyboards/model01/rules.mk +++ b/keyboards/model01/rules.mk @@ -59,4 +59,6 @@ MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) UNICODE_ENABLE = no # Unicode CUSTOM_MATRIX = yes -CIE1931_CURVE = yes + +# You can set RGB_MATRIX_ENABLE = no in your rules.mk to disable this and save the Flash +RGB_MATRIX_ENABLE = custom # Enable RGB matrix effects (+10000). diff --git a/quantum/rgb_matrix.c b/quantum/rgb_matrix.c index 807e4d62d..b282284a1 100644 --- a/quantum/rgb_matrix.c +++ b/quantum/rgb_matrix.c @@ -21,6 +21,7 @@ #include "progmem.h" #include "config.h" #include "eeprom.h" +#include #include rgb_config_t rgb_matrix_config; From a173eda6d28bd09b2d59448a6532edb7a6c8e358 Mon Sep 17 00:00:00 2001 From: Wilba6582 Date: Fri, 28 Sep 2018 14:09:14 +1000 Subject: [PATCH 162/788] Improved dynamic keymaps (#3972) * Improved dynamic keymaps * K&R sucks --- keyboards/zeal60/zeal60.c | 9 ++++---- keyboards/zeal60/zeal60_api.h | 2 +- quantum/dynamic_keymap.c | 42 +++++++++++++---------------------- quantum/dynamic_keymap.h | 7 ++---- 4 files changed, 22 insertions(+), 38 deletions(-) diff --git a/keyboards/zeal60/zeal60.c b/keyboards/zeal60/zeal60.c index e516c4dbf..092235ca6 100644 --- a/keyboards/zeal60/zeal60.c +++ b/keyboards/zeal60/zeal60.c @@ -81,9 +81,9 @@ void raw_hid_receive( uint8_t *data, uint8_t length ) dynamic_keymap_set_keycode( command_data[0], command_data[1], command_data[2], ( command_data[3] << 8 ) | command_data[4] ); break; } - case id_dynamic_keymap_clear_all: + case id_dynamic_keymap_reset: { - dynamic_keymap_clear_all(); + dynamic_keymap_reset(); break; } #endif // DYNAMIC_KEYMAP_ENABLE @@ -171,9 +171,8 @@ void matrix_init_kb(void) #endif // RGB_BACKLIGHT_ENABLED #ifdef DYNAMIC_KEYMAP_ENABLE - // This saves "empty" keymaps so it falls back to the keymaps - // in the firmware (aka. progmem/flash) - dynamic_keymap_clear_all(); + // This resets the keymaps in EEPROM to what is in flash. + dynamic_keymap_reset(); #endif // Save the magic number last, in case saving was interrupted diff --git a/keyboards/zeal60/zeal60_api.h b/keyboards/zeal60/zeal60_api.h index baa8ac09f..eaac3ad7c 100644 --- a/keyboards/zeal60/zeal60_api.h +++ b/keyboards/zeal60/zeal60_api.h @@ -24,7 +24,7 @@ enum zeal60_command_id id_set_keyboard_value, id_dynamic_keymap_get_keycode, id_dynamic_keymap_set_keycode, - id_dynamic_keymap_clear_all, + id_dynamic_keymap_reset, id_backlight_config_set_value, id_backlight_config_get_value, id_backlight_config_save, diff --git a/quantum/dynamic_keymap.c b/quantum/dynamic_keymap.c index 9f18612d5..2c989d691 100644 --- a/quantum/dynamic_keymap.c +++ b/quantum/dynamic_keymap.c @@ -16,6 +16,8 @@ #include "config.h" #include "keymap.h" // to get keymaps[][][] +#include "tmk_core/common/eeprom.h" +#include "progmem.h"// to read default from flash #include "dynamic_keymap.h" @@ -29,8 +31,6 @@ #error DYNAMIC_KEYMAP_LAYER_COUNT not defined #endif -#define KC_EENULL 0xFFFF // TODO: move to enum quantum_keycodes - void *dynamic_keymap_key_to_eeprom_address(uint8_t layer, uint8_t row, uint8_t column) { // TODO: optimize this with some left shifts @@ -55,16 +55,15 @@ void dynamic_keymap_set_keycode(uint8_t layer, uint8_t row, uint8_t column, uint eeprom_update_byte(address+1, (uint8_t)(keycode & 0xFF)); } -void dynamic_keymap_clear_all(void) +void dynamic_keymap_reset(void) { - // Save "empty" keymaps. - for ( int layer = 0; layer < DYNAMIC_KEYMAP_LAYER_COUNT; layer++ ) - { - for ( int row = 0; row < MATRIX_ROWS; row++ ) - { - for ( int column = 0; column < MATRIX_COLS; column++ ) - { - dynamic_keymap_set_keycode(layer, row, column, KC_EENULL); + // Reset the keymaps in EEPROM to what is in flash. + // All keyboards using dynamic keymaps should define a layout + // for the same number of layers as DYNAMIC_KEYMAP_LAYER_COUNT. + for ( int layer = 0; layer < DYNAMIC_KEYMAP_LAYER_COUNT; layer++ ) { + for ( int row = 0; row < MATRIX_ROWS; row++ ) { + for ( int column = 0; column < MATRIX_COLS; column++ ) { + dynamic_keymap_set_keycode(layer, row, column, pgm_read_word(&keymaps[layer][row][column])); } } } @@ -73,24 +72,13 @@ void dynamic_keymap_clear_all(void) // This overrides the one in quantum/keymap_common.c uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key) { - // This used to test EEPROM for magic bytes, but it was redundant. - // Test for EEPROM usage change (fresh install, address change, etc.) - // externally and call dynamic_keymap_default_save() if ( layer < DYNAMIC_KEYMAP_LAYER_COUNT && - key.row < MATRIX_ROWS && // possibly redundant - key.col < MATRIX_COLS ) // possibly redundant - { - uint16_t keycode = dynamic_keymap_get_keycode(layer, key.row, key.col); - - // If keycode is not "empty", return it, otherwise - // drop down to return the one in flash - if ( keycode != KC_EENULL) - { - return keycode; - } + key.row < MATRIX_ROWS && + key.col < MATRIX_COLS ) { + return dynamic_keymap_get_keycode(layer, key.row, key.col); + } else { + return KC_NO; } - - return pgm_read_word(&keymaps[layer][key.row][key.col]); } #endif // DYNAMIC_KEYMAP_ENABLE diff --git a/quantum/dynamic_keymap.h b/quantum/dynamic_keymap.h index b0133aeb8..bd76adae2 100644 --- a/quantum/dynamic_keymap.h +++ b/quantum/dynamic_keymap.h @@ -13,9 +13,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ - -#ifndef DYNAMIC_KEYMAP_H -#define DYNAMIC_KEYMAP_H +#pragma once #include #include @@ -23,9 +21,8 @@ void *dynamic_keymap_key_to_eeprom_address(uint8_t layer, uint8_t row, uint8_t column); uint16_t dynamic_keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t column); void dynamic_keymap_set_keycode(uint8_t layer, uint8_t row, uint8_t column, uint16_t keycode); -void dynamic_keymap_clear_all(void); +void dynamic_keymap_reset(void); // This overrides the one in quantum/keymap_common.c // uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key); -#endif //DYNAMIC_KEYMAP_H From 31afdd81a1e7cdb8808c8eb32e0ebe69c3d15f5c Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 28 Sep 2018 07:15:20 -0700 Subject: [PATCH 163/788] Optimize size of JC65/v32a keyboard --- keyboards/jc65/v32a/config.h | 7 ++++--- keyboards/jc65/v32a/rules.mk | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/keyboards/jc65/v32a/config.h b/keyboards/jc65/v32a/config.h index dc6d280f5..466cb7a28 100644 --- a/keyboards/jc65/v32a/config.h +++ b/keyboards/jc65/v32a/config.h @@ -15,8 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef CONFIG_H -#define CONFIG_H +#pragma once #include "config_common.h" @@ -43,4 +42,6 @@ along with this program. If not, see . /* key combination for command */ #define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) -#endif +#define NO_ACTION_MACRO +#define NO_ACTION_FUNCTION + diff --git a/keyboards/jc65/v32a/rules.mk b/keyboards/jc65/v32a/rules.mk index 1ea19fe00..5c8e63283 100644 --- a/keyboards/jc65/v32a/rules.mk +++ b/keyboards/jc65/v32a/rules.mk @@ -26,7 +26,7 @@ F_CPU = 12000000 # Bootloader # This definition is optional, and if your keyboard supports multiple bootloaders of -# different sizes, comment this out, and the correct address will be loaded +# different sizes, comment this out, and the correct address will be loaded # automatically (+60). See bootloader.mk for all options. BOOTLOADER = bootloadHID From a4bdab68370bc1497a7d5aa32d05bd8a6b3c3c14 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 28 Sep 2018 07:09:46 -0700 Subject: [PATCH 164/788] Optimize size of Hadron keyboard --- keyboards/hadron/config.h | 17 ++++-------- keyboards/hadron/keymaps/default/rules.mk | 4 +-- keyboards/hadron/rules.mk | 32 +++++++++++------------ keyboards/hadron/ver0/config.h | 7 ++--- keyboards/hadron/ver2/config.h | 7 ++--- keyboards/hadron/ver2/rules.mk | 2 +- 6 files changed, 27 insertions(+), 42 deletions(-) diff --git a/keyboards/hadron/config.h b/keyboards/hadron/config.h index 0c19d6c79..9111ad727 100644 --- a/keyboards/hadron/config.h +++ b/keyboards/hadron/config.h @@ -15,8 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef CONFIG_H -#define CONFIG_H +#pragma once #include "config_common.h" @@ -30,7 +29,7 @@ along with this program. If not, see . -//#define AUDIO_VOICES +//#define AUDIO_VOICES //#define BACKLIGHT_PIN B7 @@ -71,13 +70,7 @@ along with this program. If not, see . //#define NO_ACTION_LAYER //#define NO_ACTION_TAPPING //#define NO_ACTION_ONESHOT -//#define NO_ACTION_MACRO -//#define NO_ACTION_FUNCTION -#ifdef SUBPROJECT_ver0 - #include "ver0/config.h" -#endif -#ifdef SUBPROJECT_ver2 - #include "ver2/config.h" -#endif +#define NO_ACTION_MACRO +#define NO_ACTION_FUNCTION + -#endif diff --git a/keyboards/hadron/keymaps/default/rules.mk b/keyboards/hadron/keymaps/default/rules.mk index 1f3975255..4d08544f3 100644 --- a/keyboards/hadron/keymaps/default/rules.mk +++ b/keyboards/hadron/keymaps/default/rules.mk @@ -21,6 +21,4 @@ SWAP_HANDS_ENABLE = no # Enable one-hand typing # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend -ifndef QUANTUM_DIR - include ../../../../Makefile -endif \ No newline at end of file +EXTRAFLAGS += -flto diff --git a/keyboards/hadron/rules.mk b/keyboards/hadron/rules.mk index 66a900825..1f835e066 100644 --- a/keyboards/hadron/rules.mk +++ b/keyboards/hadron/rules.mk @@ -44,30 +44,30 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT # Atmel DFU loader 4096 # LUFA bootloader 4096 # USBaspLoader 2048 -OPT_DEFS += -DBOOTLOADER_SIZE=512 +BOOTLOADER = halfkay # Build Options -# change to "no" to disable the options, or define them in the Makefile in +# change to "no" to disable the options, or define them in the Makefile in # the appropriate keymap folder that will get included automatically # -BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE ?= no # Mouse keys(+4700) -EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) -CONSOLE_ENABLE ?= no # Console for debug(+400) -COMMAND_ENABLE ?= no # Commands for debug and configuration -NKRO_ENABLE ?= no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality -MIDI_ENABLE ?= no # MIDI controls -AUDIO_ENABLE ?= no # Audio output on port C6 -UNICODE_ENABLE ?= no # Unicode -BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE ?= no # Enable WS2812 RGB underlight. +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. API_SYSEX_ENABLE = yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE -SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend SRC = i2c.c \ ssd1306.c -DEFAULT_FOLDER = hadron/ver2 \ No newline at end of file +DEFAULT_FOLDER = hadron/ver2 diff --git a/keyboards/hadron/ver0/config.h b/keyboards/hadron/ver0/config.h index 039d4f1c7..2157a52ce 100644 --- a/keyboards/hadron/ver0/config.h +++ b/keyboards/hadron/ver0/config.h @@ -14,10 +14,7 @@ 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 . */ -#ifndef VER0_CONFIG_H -#define VER0_CONFIG_H - -#include "../config.h" +#pragma once /* USB Device descriptor parameter */ #define DEVICE_VER 0x0001 @@ -32,4 +29,4 @@ along with this program. If not, see . #define UNUSED_PINS -#endif + diff --git a/keyboards/hadron/ver2/config.h b/keyboards/hadron/ver2/config.h index 71a0ab5b3..5ee3f931f 100644 --- a/keyboards/hadron/ver2/config.h +++ b/keyboards/hadron/ver2/config.h @@ -14,10 +14,7 @@ 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 . */ -#ifndef VER2_CONFIG_H -#define VER2_CONFIG_H - -#include "../config.h" +#pragma once /* USB Device descriptor parameter */ #define DEVICE_VER 0x0002 @@ -32,4 +29,4 @@ along with this program. If not, see . #define UNUSED_PINS -#endif + diff --git a/keyboards/hadron/ver2/rules.mk b/keyboards/hadron/ver2/rules.mk index a3952a5d3..521493b3d 100644 --- a/keyboards/hadron/ver2/rules.mk +++ b/keyboards/hadron/ver2/rules.mk @@ -1 +1 @@ -#AUDIO_ENABLE ?= yes # Audio output on port C6 \ No newline at end of file +#AUDIO_ENABLE = yes # Audio output on port C6 From 8847b2abbff5c6d55cf43402d394e9db751f728f Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 28 Sep 2018 07:24:08 -0700 Subject: [PATCH 165/788] Optimize size of Vitamins_Included keyboard --- keyboards/vitamins_included/config.h | 10 +--------- keyboards/vitamins_included/keymaps/default/config.h | 7 +------ keyboards/vitamins_included/keymaps/default/keymap.c | 12 +++--------- keyboards/vitamins_included/keymaps/default/rules.mk | 4 +--- keyboards/vitamins_included/rules.mk | 5 ++--- 5 files changed, 8 insertions(+), 30 deletions(-) diff --git a/keyboards/vitamins_included/config.h b/keyboards/vitamins_included/config.h index 27924ae46..abbb31056 100644 --- a/keyboards/vitamins_included/config.h +++ b/keyboards/vitamins_included/config.h @@ -16,20 +16,12 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef CONFIG_H -#define CONFIG_H +#pragma once #include "config_common.h" -#if !defined(NO_DEBUG) && !defined(CONSOLE_ENABLE) -#define NO_DEBUG -#endif // !NO_DEBUG -#if !defined(NO_PRINT) && !defined(CONSOLE_ENABLE) -#define NO_PRINT -#endif // !NO_PRINT #define NO_ACTION_MACRO #define NO_ACTION_FUNCTION #define DISABLE_LEADER -#endif diff --git a/keyboards/vitamins_included/keymaps/default/config.h b/keyboards/vitamins_included/keymaps/default/config.h index 35f641a94..aba9fa7d4 100644 --- a/keyboards/vitamins_included/keymaps/default/config.h +++ b/keyboards/vitamins_included/keymaps/default/config.h @@ -18,10 +18,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" +#pragma once /* Use I2C or Serial, not both */ @@ -40,5 +37,3 @@ along with this program. If not, see . SONG(COLEMAK_SOUND) \ } #endif - -#endif diff --git a/keyboards/vitamins_included/keymaps/default/keymap.c b/keyboards/vitamins_included/keymaps/default/keymap.c index f25e2fd32..13b48e764 100644 --- a/keyboards/vitamins_included/keymaps/default/keymap.c +++ b/keyboards/vitamins_included/keymaps/default/keymap.c @@ -1,6 +1,4 @@ #include QMK_KEYBOARD_H -#include "action_layer.h" -#include "eeconfig.h" extern keymap_config_t keymap_config; @@ -141,28 +139,24 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; -void persistent_default_layer_set(uint16_t default_layer) { - eeconfig_update_default_layer(default_layer); - default_layer_set(default_layer); -} bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch (keycode) { case QWERTY: if (record->event.pressed) { - persistent_default_layer_set(1UL<<_QWERTY); + set_single_persistent_default_layer(_QWERTY); } return false; break; case COLEMAK: if (record->event.pressed) { - persistent_default_layer_set(1UL<<_COLEMAK); + set_single_persistent_default_layer(_COLEMAK); } return false; break; case DVORAK: if (record->event.pressed) { - persistent_default_layer_set(1UL<<_DVORAK); + set_single_persistent_default_layer(_DVORAK); } return false; break; diff --git a/keyboards/vitamins_included/keymaps/default/rules.mk b/keyboards/vitamins_included/keymaps/default/rules.mk index 457a3d01d..8b1378917 100644 --- a/keyboards/vitamins_included/keymaps/default/rules.mk +++ b/keyboards/vitamins_included/keymaps/default/rules.mk @@ -1,3 +1 @@ -ifndef QUANTUM_DIR - include ../../../../Makefile -endif + diff --git a/keyboards/vitamins_included/rules.mk b/keyboards/vitamins_included/rules.mk index 2291b2116..8ac39dffb 100644 --- a/keyboards/vitamins_included/rules.mk +++ b/keyboards/vitamins_included/rules.mk @@ -56,7 +56,7 @@ BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) MOUSEKEY_ENABLE = yes # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) CONSOLE_ENABLE = no # Console for debug(+400) -COMMAND_ENABLE = yes # Commands for debug and configuration +COMMAND_ENABLE = no # Commands for debug and configuration NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality MIDI_ENABLE = no # MIDI controls @@ -64,7 +64,6 @@ AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. -USE_I2C = no # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend @@ -74,4 +73,4 @@ LAYOUTS = ortho_4x12 DEFAULT_FOLDER = vitamins_included/rev1 -EXTRAFLAGS += -flto \ No newline at end of file +EXTRAFLAGS += -flto From ebc143297c24bdd894340ffece2d93f15fbd5c1c Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 28 Sep 2018 07:18:43 -0700 Subject: [PATCH 166/788] Optimize size of Pearl keyboard --- keyboards/pearl/config.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/keyboards/pearl/config.h b/keyboards/pearl/config.h index 9f7a148f9..c0594bf91 100644 --- a/keyboards/pearl/config.h +++ b/keyboards/pearl/config.h @@ -15,8 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef PEARL_CONFIG_H -#define PEARL_CONFIG_H +#pragma once #include "config_common.h" @@ -46,4 +45,6 @@ along with this program. If not, see . /* key combination for command */ #define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) -#endif +#define NO_ACTION_MACRO +#define NO_ACTION_FUNCTION + From 9ade35a9fedbc6e4e77f422ed5fb514348e754ad Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 28 Sep 2018 07:00:11 -0700 Subject: [PATCH 167/788] Optimize size of USB_USB BLE Converter --- keyboards/converter/usb_usb/ble/config.h | 8 ++++---- keyboards/converter/usb_usb/ble/rules.mk | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/keyboards/converter/usb_usb/ble/config.h b/keyboards/converter/usb_usb/ble/config.h index 45aa778d5..5333e17c8 100644 --- a/keyboards/converter/usb_usb/ble/config.h +++ b/keyboards/converter/usb_usb/ble/config.h @@ -1,13 +1,13 @@ -#ifndef CONFIG_BLE_H -#define CONFIG_BLE_H +#pragma once #undef PRODUCT #define PRODUCT QMK BLE Adapter #undef DESCRIPTION -#define DESCRIPTION +#define DESCRIPTION // Turn off the mode leds on the BLE module #define ADAFRUIT_BLE_ENABLE_MODE_LEDS 0 #define ADAFRUIT_BLE_ENABLE_POWER_LED 0 -#endif +#define NO_ACTION_MACRO +#define NO_ACTION_FUNCTION diff --git a/keyboards/converter/usb_usb/ble/rules.mk b/keyboards/converter/usb_usb/ble/rules.mk index 16090962d..84aa767f5 100644 --- a/keyboards/converter/usb_usb/ble/rules.mk +++ b/keyboards/converter/usb_usb/ble/rules.mk @@ -1,3 +1,23 @@ BLUETOOTH = AdafruitBLE ADAFRUIT_BLE_ENABLE = yes F_CPU = 8000000 + +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = no # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) + +EXTRAFLAGS += -flto From 8454fa5e9faab3a969168447d42369828f8ade91 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 28 Sep 2018 09:04:30 -0700 Subject: [PATCH 168/788] Update Document Templates to reflect newer wording and URLs (#4006) * Add pragma once info to contributing guidelines * Fix links in readme template to match doc site * Revert changes to contributing doc as somebody already changed it --- docs/documentation_templates.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/documentation_templates.md b/docs/documentation_templates.md index 18829ed0f..ba3830b64 100644 --- a/docs/documentation_templates.md +++ b/docs/documentation_templates.md @@ -36,7 +36,7 @@ Make example for this keyboard (after setting up your build environment): make planck/rev4:default -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. +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). ``` There needs to be two spaces at the end of the `Keyboard Maintainer` and `Hardware Supported` lines for it to render correctly with Markdown. From fa47f5fb15cca3bea9ab4de1001fcfecd43dac19 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 28 Sep 2018 09:27:51 -0700 Subject: [PATCH 169/788] Update to the Userspace documentation (#4005) * Overhaul to Userspace Documentation * Formatting issues * Additionaly formatting fixes * Add Readme info * Additionaly Readme info * Formatting fixes --- docs/feature_userspace.md | 190 ++++++++++++++++++++++++++++---------- 1 file changed, 139 insertions(+), 51 deletions(-) diff --git a/docs/feature_userspace.md b/docs/feature_userspace.md index 5f7c05b83..b7fc9d809 100644 --- a/docs/feature_userspace.md +++ b/docs/feature_userspace.md @@ -5,15 +5,12 @@ If you use more than one keyboard with a similar keymap, you might see the benef * `/users//` (added to the path automatically) * `readme.md` (optional, recommended) * `rules.mk` (included automatically) + * `config.h` (included automatically) * `.h` (optional) * `.c` (optional) - * `config.h` (optional) + * `cool_rgb_stuff.c` (optional) + * `cool_rgb_stuff.h` (optional) -`.c` will need to be added to the SRC in `rules.mk` like this: - - SRC += .c - -Additional files may be added in the same way - it's recommended you have one named ``.c/.h though. All this only happens when you build a keymap named ``, like this: @@ -23,82 +20,179 @@ For example, make planck:jack -Will include the `/users/jack/` folder in the path, along with `/users/jack/rules.mk`. +Will include the `/users/jack/` folder in the path, along with `/users/jack/rules.mk`. + +!> This `name` can be [overridden](#override-default-userspace), if needed. + +## `Rules.mk` + +The `rules.mk` is one of the two files that gets processed automatically. This is how you add additional source files (such as `.c`) will be added when compiling. + +It's highly recommended that you use `.c` as the default source file to be added. And to add it, you need to add it the SRC in `rules.mk` like this: + + SRC += .c + +Additional files may be added in the same way - it's recommended you have one named ``.c/.h to start off with, though. + +The `/users//rules.mk` file will be included in the build _after_ the `rules.mk` from your keymap. This allows you to have features in your userspace `rules.mk` that depend on individual QMK features that may or may not be available on a specific keyboard. + +For example, if you have RGB control features shared between all your keyboards that support RGB lighting, you can add support for that if the RGBLIGHT feature is enabled: +```make +ifeq ($(strip $(RGBLIGHT_ENABLE)), yes) + # Include my fancy rgb functions source here + SRC += cool_rgb_stuff.c +endif +``` + +Alternatively, you can `define RGB_ENABLE` in your keymap's `rules.mk` and then check for the variable in your userspace's `rules.mk` like this: +```make +ifdef RGB_ENABLE + # Include my fancy rgb functions source here + SRC += cool_rgb_stuff.c +endif +``` + +### Override default userspace + +By default the userspace used will be the same as the keymap name. In some situations this isn't desirable. For instance, if you use the [layout](feature_layouts.md) feature you can't use the same name for different keymaps (e.g. ANSI and ISO). You can name your layouts `mylayout-ansi` and `mylayout-iso` and add the following line to your layout's `rules.mk`: + +``` +USER_NAME := mylayout +``` + +This is also useful if you have multiple different keyboards with different features physically present on the board (such as one with RGB Lights, and one with Audio, or different number of LEDs, or connected to a different PIN on the controller). + +## Configuration Options (`config.h`) Additionally, `config.h` here will be processed like the same file in your keymap folder. This is handled separately from the `.h` file. The reason for this, is that `.h` won't be added in time to add settings (such as `#define TAPPING_TERM 100`), and including the `` file in any `config.h` files will result in compile issues. -So you should use the `config.h` for QMK settings, and the `.h` file for user or keymap specific settings. +!>You should use the `config.h` for [configuration options](config_options.md), and the `.h` file for user or keymap specific settings (such as the enum for layer or keycodes) -`/users//rules.mk` will be included in the build _after_ the `rules.mk` from your keymap. This allows you to have features in your userspace `rules.mk` that depend on individual QMK features that may or may not be available on a specific keyboard. For example, if you have RGB control features shared between all your keyboards that support RGB lighting, you can `define RGB_ENABLE` in your keymap `rules.mk` and then check for the variable in your userspace `rules.mk` like this: -```make -ifdef RGB_ENABLE - # Include my fancy rgb functions source here -endif -``` -Because of this, any time you turn on QMK features in your `users//rules.mk`, you should conditionally enable them only if the flag isn't already defined, like this: -```make -ifndef TAP_DANCE_ENABLE - TAP_DANCE_ENABLE = yes -endif -``` -This will ensure that you can explicitly turn off features for an individual keymap. -## Readme +## Readme (`readme.md`) Please include authorship (your name, github username, email), and optionally [a license that's GPL compatible](https://www.gnu.org/licenses/license-list.html#GPLCompatibleLicenses). -## `Config.h` +You can use this as a template: +``` +Copyright @ -If you do add a `config,h` file, you want to make sure that it only gets processed once. So you may want to start off with something like this: +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. -```c -#ifndef USERSPACE_CONFIG_H -#define USERSPACE_CONFIG_H +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. -// Put normal config.h settings here: - -#endif // !USERSPACE_CONFIG_H +You should have received a copy of the GNU General Public License +along with this program. If not, see . ``` -You can use any option hre that you could use in your keymap's `config.h` file. You can find a list of vales [here](config_options.md). +You'd want to replace the year, name, email and github username with your info. -## Example +Additionally, this is a good place to document your code, if you wish to share it with others. -For a brief example, checkout `/users/_example/` , or for a more detailed examples check out [`template.h`](https://github.com/qmk/qmk_firmware/blob/master/users/drashna/template.h) and [`template.c`](https://github.com/qmk/qmk_firmware/blob/master/users/drashna/template.c) in `/users/drashna/` . +# Examples -### Consolidated Macros +For a brief example, checkout [`/users/_example/`](https://github.com/qmk/qmk_firmware/tree/master/users/drashna). +For a more complicaed example, checkout [`/users/drashna/`](https://github.com/qmk/qmk_firmware/tree/master/users/drashna)'s userspace. -If you wanted to consolidate macros and other functions into your userspace for all of your keymaps, you can do that. The issue is that you then cannot call any function defined in your userspace, or it gets complicated. To better handle this, you can call the functions here and create new functions to use in individual keymaps. + +## Customized Functions + +QMK has a bunch of [functions](custom_quantum_functions.md) that have [`_quantum`, `_kb`, and `_user` versions](custom_quantum_functions.md#a-word-on-core-vs-keyboards-vs-keymap) that you can use. You will pretty much always want to use the user version of these functions. But the problem is that if you use them in your userspace, then you don't have a version that you can use in your keymap. + +However, you can actually add support for keymap version, so that you can use it in both your userspace and your keymap! + + +For instance, lets looks at the `layer_state_set_user` function. Lets enable the [Tri Layer State](ref_functions.md#olkb-tri-layers) functionalitly to all of our boards, and then still have your `keymap.c` still able to use this functionality. + +In your `` file, you'd want to add this: +```c +__attribute__ ((weak)) +uint32_t layer_state_set_keymap (uint32_t state) { + return state; +} + +uint32_t layer_state_set_user (uint32_t state) { + state = update_tri_layer_state(state, 2, 3, 5); + return layer_state_set_keymap (state); +} +``` +The `__attribute__ ((weak))` part tells the compiler that this is a placce holder function that can then be replaced by a version in your `keymap.c`. That way, you don't need to add it to your `keymap.c`, but if you do, you won't get any conflicts because the function is the same name. + +The `_keymap` part here doesn't matter, it just needs to be something other than `_quantum`, `_kb`, or `_user`, since those are already in use. So you could use `layer_state_set_mine`, `layer_state_set_fn`, or anything else. + +You can see a list of this and other common functions in [`template.c`](https://github.com/qmk/qmk_firmware/blob/master/users/drashna/template.c) in [`users/drashna`](https://github.com/qmk/qmk_firmware/tree/master/users/drashna). + +## Custom Features + +Since the Userspace feature can support a staggering number of boards, you may have boards that you want to enable certain functionality for, but not for others. And you can actually create "features" that you can enable or disable in your own userspace. + +For instance, if you wanted to have a bunch of macros available, but only on certain boards (to save space), you could "hide" them being a `#ifdef MACROS_ENABLED`, and then enable it per board. To do this, add this to your rules.mk +```make +ifeq ($(strip $(MACROS_ENABLED)), yes) + OPT_DEFS += -DMACROS_ENABLED +endif +``` +The `OPT_DEFS` setting causee `MACROS_ENABLED` to be defined for your keyboards (note the `-D` in front of the name), and you could use `#ifdef MACROS_ENABLED` to check the status in your c/h files, and handle that code based on that. + +Then you add `MACROS_ENABLED = yes` to the `rules.mk` for you keymap to enable this feature and the code in your userspace. + +And in your `process_record_user` function, you'd do something like this: +```c +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { +#ifdef MACROS_ENABLED + case MACRO1: + if (!record->event.pressed) { + SEND_STRING("This is macro 1!"); + } + break; + case MACRO2: + if (!record->event.pressed) { + SEND_STRING("This is macro 2!"); + } + break; +#endif + } + return true; +} +``` + + +## Consolidated Macros + +If you wanted to consolidate macros and other functions into your userspace for all of your keymaps, you can do that. This builds upon the [Customized Functions](#customized-functions) example above. This lets you maintain a bunch of macros that are shared between the different keyboards, and allow for keyboard specific macros, too. First, you'd want to go through all of your `keymap.c` files and replace `process_record_user` with `process_record_keymap` instead. This way, you can still use keyboard specific codes on those boards, and use your custom "global" keycodes as well. You'll also want to replace `SAFE_RANGE` with `NEW_SAFE_RANGE` so that you wont have any overlapping keycodes Then add `#include ` to all of your keymap.c files. This allows you to use these new keycodes without having to redefine them in each keymap. Once you've done that, you'll want to set the keycode definitions that you need to the `.h` file. For instance: -``` -#ifndef USERSPACE -#define USERSPACE +```c +#pragma once #include "quantum.h" +#include "action.h" +#include "version.h" // Define all of enum custom_keycodes { KC_MAKE = SAFE_RANGE, NEW_SAFE_RANGE //use "NEW_SAFE_RANGE" for keymap specific codes }; - -#endif ``` Now you want to create the `.c` file, and add this content to it: -``` +```c #include ".h" -#include "quantum.h" -#include "action.h" -#include "version.h" __attribute__ ((weak)) bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { @@ -126,14 +220,8 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } ``` -This will add a new `KC_MAKE` keycode that can be used in any of your keymaps. And this keycode will output `make :`, making frequent compiling easier. And this will work with any keyboard and any keymap as it will output the current boards info, so that you don't have to type this out every time. +This will add a new `KC_MAKE` keycode that can be used in any of your keymaps. And this keycode will output `make :`, making frequent compiling easier. And this will work with any keyboard and any keymap as it will output the current boards info, so that you don't have to type this out every time. Additionally, this should flash the newly compiled firmware automatically, using the correct utility, based on the bootloader settings (or default to just generating the HEX file). However, it should be noted that this may not work on all systems. AVRDUDE doesn't work on WSL, namely (and will dump the HEX in the ".build" folder instead). -## Override default userspace -By default the userspace used will be the same as the keymap name. In some situations this isn't desirable. For instance, if you use the [layout](feature_layouts.md) feature you can't use the same name for different keymaps (e.g. ANSI and ISO). You can name your layouts `mylayout-ansi` and `mylayout-iso` and add the following line to your layout's `rules.mk`: - -``` -USER_NAME := mylayout -``` From 7fe03d085c2ecaa324779093eceb1a12313ca25d Mon Sep 17 00:00:00 2001 From: yiancar Date: Fri, 28 Sep 2018 17:33:11 +0100 Subject: [PATCH 170/788] Update quantum matrix to support both AVR and Chibios ARM (#3968) * Update quantum matrix to support both AVR and Chibios ARM - Addition of STM32 pin definitions - Created abstruction layer defines to control GPIO (This is a bit pointless for Chibios as we are creating a PAL ontop of a PAL but it is necessary for uniformity with AVR) - Modified matrix.c to use the above functions * minor ifdef fix * Rename of functions and docs - Added documentation. - Renamed functions according to Jack's spec. * Massdrop fix * Update matrix.c * Update quantum.h * Update quantum.h * Update quantum.h * Update internals_gpio_control.md --- docs/internals_gpio_control.md | 23 ++++ quantum/config_common.h | 199 ++++++++++++++++++++++++--------- quantum/matrix.c | 49 +++----- quantum/quantum.h | 69 ++++++++++-- 4 files changed, 244 insertions(+), 96 deletions(-) create mode 100644 docs/internals_gpio_control.md diff --git a/docs/internals_gpio_control.md b/docs/internals_gpio_control.md new file mode 100644 index 000000000..21643d30c --- /dev/null +++ b/docs/internals_gpio_control.md @@ -0,0 +1,23 @@ +# GPIO Control + +QMK has a GPIO control abstraction layer which is micro-controller agnostic. This is done to allow easy access to pin control across different platforms. + +## Functions + +The following functions can provide basic control of GPIOs and are found in `quantum/quantum.h`. + +|Function |Description | +|----------------------|------------------------------------------------------------------| +|`setPinInput(pin)` |Set pin as input with high impedance (High-Z) | +|`setPinInputHigh(pin)`|Set pin as input with build in pull-up | +|`setPinInputLow(pin)` |Set pin as input with build in pull-down (Supported only on STM32)| +|`setPinOutput(pin)` |Set pin as output | +|`writePinHige(pin)` |Set pin level as high, assuming it is an output | +|`writePinLow(pin)` |Set pin level as low, assuming it is an output | +|`writePin(pin, level)`|Set pin level, assuming it is an output | +|`readPin(pin)` |Returns the level of the pin | + +## Advance settings + +Each micro-controller can have multiple advance settings regarding its GPIO. This abstraction layer does not limit the use of architecture specific functions. Advance users should consult the datasheet of there desired device and include any needed libraries. For AVR the standard avr/io.h library is used and for STM32 the Chibios [PAL library](http://chibios.sourceforge.net/docs3/hal/group___p_a_l.html) is used. + diff --git a/quantum/config_common.h b/quantum/config_common.h index f6f51b367..288617255 100644 --- a/quantum/config_common.h +++ b/quantum/config_common.h @@ -23,57 +23,154 @@ #define CUSTOM_MATRIX 2 /* Disables built-in matrix scanning code */ #ifdef __AVR__ - /* I/O pins */ - #ifndef F0 - #define B0 0x30 - #define B1 0x31 - #define B2 0x32 - #define B3 0x33 - #define B4 0x34 - #define B5 0x35 - #define B6 0x36 - #define B7 0x37 - #define C0 0x60 - #define C1 0x61 - #define C2 0x62 - #define C3 0x63 - #define C4 0x64 - #define C5 0x65 - #define C6 0x66 - #define C7 0x67 - #define D0 0x90 - #define D1 0x91 - #define D2 0x92 - #define D3 0x93 - #define D4 0x94 - #define D5 0x95 - #define D6 0x96 - #define D7 0x97 - #define E0 0xC0 - #define E1 0xC1 - #define E2 0xC2 - #define E3 0xC3 - #define E4 0xC4 - #define E5 0xC5 - #define E6 0xC6 - #define E7 0xC7 - #define F0 0xF0 - #define F1 0xF1 - #define F2 0xF2 - #define F3 0xF3 - #define F4 0xF4 - #define F5 0xF5 - #define F6 0xF6 - #define F7 0xF7 - #define A0 0x00 - #define A1 0x01 - #define A2 0x02 - #define A3 0x03 - #define A4 0x04 - #define A5 0x05 - #define A6 0x06 - #define A7 0x07 - #endif + /* I/O pins */ + #ifndef F0 + #define B0 0x30 + #define B1 0x31 + #define B2 0x32 + #define B3 0x33 + #define B4 0x34 + #define B5 0x35 + #define B6 0x36 + #define B7 0x37 + #define C0 0x60 + #define C1 0x61 + #define C2 0x62 + #define C3 0x63 + #define C4 0x64 + #define C5 0x65 + #define C6 0x66 + #define C7 0x67 + #define D0 0x90 + #define D1 0x91 + #define D2 0x92 + #define D3 0x93 + #define D4 0x94 + #define D5 0x95 + #define D6 0x96 + #define D7 0x97 + #define E0 0xC0 + #define E1 0xC1 + #define E2 0xC2 + #define E3 0xC3 + #define E4 0xC4 + #define E5 0xC5 + #define E6 0xC6 + #define E7 0xC7 + #define F0 0xF0 + #define F1 0xF1 + #define F2 0xF2 + #define F3 0xF3 + #define F4 0xF4 + #define F5 0xF5 + #define F6 0xF6 + #define F7 0xF7 + #define A0 0x00 + #define A1 0x01 + #define A2 0x02 + #define A3 0x03 + #define A4 0x04 + #define A5 0x05 + #define A6 0x06 + #define A7 0x07 + #endif +#elif defined(PROTOCOL_CHIBIOS) + #define A0 PAL_LINE(GPIOA, 0) + #define A1 PAL_LINE(GPIOA, 1) + #define A2 PAL_LINE(GPIOA, 2) + #define A3 PAL_LINE(GPIOA, 3) + #define A4 PAL_LINE(GPIOA, 4) + #define A5 PAL_LINE(GPIOA, 5) + #define A6 PAL_LINE(GPIOA, 6) + #define A7 PAL_LINE(GPIOA, 7) + #define A8 PAL_LINE(GPIOA, 8) + #define A9 PAL_LINE(GPIOA, 9) + #define A10 PAL_LINE(GPIOA, 10) + #define A11 PAL_LINE(GPIOA, 11) + #define A12 PAL_LINE(GPIOA, 12) + #define A13 PAL_LINE(GPIOA, 13) + #define A14 PAL_LINE(GPIOA, 14) + #define A15 PAL_LINE(GPIOA, 15) + #define B0 PAL_LINE(GPIOB, 0) + #define B1 PAL_LINE(GPIOB, 1) + #define B2 PAL_LINE(GPIOB, 2) + #define B3 PAL_LINE(GPIOB, 3) + #define B4 PAL_LINE(GPIOB, 4) + #define B5 PAL_LINE(GPIOB, 5) + #define B6 PAL_LINE(GPIOB, 6) + #define B7 PAL_LINE(GPIOB, 7) + #define B8 PAL_LINE(GPIOB, 8) + #define B9 PAL_LINE(GPIOB, 9) + #define B10 PAL_LINE(GPIOB, 10) + #define B11 PAL_LINE(GPIOB, 11) + #define B12 PAL_LINE(GPIOB, 12) + #define B13 PAL_LINE(GPIOB, 13) + #define B14 PAL_LINE(GPIOB, 14) + #define B15 PAL_LINE(GPIOB, 15) + #define C0 PAL_LINE(GPIOC, 0) + #define C1 PAL_LINE(GPIOC, 1) + #define C2 PAL_LINE(GPIOC, 2) + #define C3 PAL_LINE(GPIOC, 3) + #define C4 PAL_LINE(GPIOC, 4) + #define C5 PAL_LINE(GPIOC, 5) + #define C6 PAL_LINE(GPIOC, 6) + #define C7 PAL_LINE(GPIOC, 7) + #define C8 PAL_LINE(GPIOC, 8) + #define C9 PAL_LINE(GPIOC, 9) + #define C10 PAL_LINE(GPIOC, 10) + #define C11 PAL_LINE(GPIOC, 11) + #define C12 PAL_LINE(GPIOC, 12) + #define C13 PAL_LINE(GPIOC, 13) + #define C14 PAL_LINE(GPIOC, 14) + #define C15 PAL_LINE(GPIOC, 15) + #define D0 PAL_LINE(GPIOD, 0) + #define D1 PAL_LINE(GPIOD, 1) + #define D2 PAL_LINE(GPIOD, 2) + #define D3 PAL_LINE(GPIOD, 3) + #define D4 PAL_LINE(GPIOD, 4) + #define D5 PAL_LINE(GPIOD, 5) + #define D6 PAL_LINE(GPIOD, 6) + #define D7 PAL_LINE(GPIOD, 7) + #define D8 PAL_LINE(GPIOD, 8) + #define D9 PAL_LINE(GPIOD, 9) + #define D10 PAL_LINE(GPIOD, 10) + #define D11 PAL_LINE(GPIOD, 11) + #define D12 PAL_LINE(GPIOD, 12) + #define D13 PAL_LINE(GPIOD, 13) + #define D14 PAL_LINE(GPIOD, 14) + #define D15 PAL_LINE(GPIOD, 15) + #define E0 PAL_LINE(GPIOE, 0) + #define E1 PAL_LINE(GPIOE, 1) + #define E2 PAL_LINE(GPIOE, 2) + #define E3 PAL_LINE(GPIOE, 3) + #define E4 PAL_LINE(GPIOE, 4) + #define E5 PAL_LINE(GPIOE, 5) + #define E6 PAL_LINE(GPIOE, 6) + #define E7 PAL_LINE(GPIOE, 7) + #define E8 PAL_LINE(GPIOE, 8) + #define E9 PAL_LINE(GPIOE, 9) + #define E10 PAL_LINE(GPIOE, 10) + #define E11 PAL_LINE(GPIOE, 11) + #define E12 PAL_LINE(GPIOE, 12) + #define E13 PAL_LINE(GPIOE, 13) + #define E14 PAL_LINE(GPIOE, 14) + #define E15 PAL_LINE(GPIOE, 15) + #define F0 PAL_LINE(GPIOF, 0) + #define F1 PAL_LINE(GPIOF, 1) + #define F2 PAL_LINE(GPIOF, 2) + #define F3 PAL_LINE(GPIOF, 3) + #define F4 PAL_LINE(GPIOF, 4) + #define F5 PAL_LINE(GPIOF, 5) + #define F6 PAL_LINE(GPIOF, 6) + #define F7 PAL_LINE(GPIOF, 7) + #define F8 PAL_LINE(GPIOF, 8) + #define F9 PAL_LINE(GPIOF, 9) + #define F10 PAL_LINE(GPIOF, 10) + #define F11 PAL_LINE(GPIOF, 11) + #define F12 PAL_LINE(GPIOF, 12) + #define F13 PAL_LINE(GPIOF, 13) + #define F14 PAL_LINE(GPIOF, 14) + #define F15 PAL_LINE(GPIOF, 15) #endif /* USART configuration */ diff --git a/quantum/matrix.c b/quantum/matrix.c index 3600d4e7b..9b5ce33d2 100644 --- a/quantum/matrix.c +++ b/quantum/matrix.c @@ -1,5 +1,5 @@ /* -Copyright 2012-2017 Jun Wako, Jack Humbert +Copyright 2012-2018 Jun Wako, Jack Humbert, Yiancar 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 @@ -16,15 +16,13 @@ along with this program. If not, see . */ #include #include -#if defined(__AVR__) -#include -#endif #include "wait.h" #include "print.h" #include "debug.h" #include "util.h" #include "matrix.h" #include "timer.h" +#include "quantum.h" /* Set 0 if debouncing isn't needed */ @@ -60,8 +58,8 @@ along with this program. If not, see . #endif #if (DIODE_DIRECTION == ROW2COL) || (DIODE_DIRECTION == COL2ROW) -static const uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; -static const uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; +static const pin_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; +static const pin_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; #endif /* matrix state(1:on, 0:off) */ @@ -271,9 +269,7 @@ uint8_t matrix_key_count(void) static void init_cols(void) { for(uint8_t x = 0; x < MATRIX_COLS; x++) { - uint8_t pin = col_pins[x]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + setPinInputHigh(col_pins[x]); } } @@ -293,8 +289,7 @@ static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) for(uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) { // Select the col pin to read (active low) - uint8_t pin = col_pins[col_index]; - uint8_t pin_state = (_SFR_IO8(pin >> 4) & _BV(pin & 0xF)); + uint8_t pin_state = readPin(col_pins[col_index]); // Populate the matrix row with the state of the col pin current_matrix[current_row] |= pin_state ? 0 : (ROW_SHIFTER << col_index); @@ -308,24 +303,19 @@ static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) static void select_row(uint8_t row) { - uint8_t pin = row_pins[row]; - _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT - _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW + setPinOutput(row_pins[row]); + writePinLow(row_pins[row]); } static void unselect_row(uint8_t row) { - uint8_t pin = row_pins[row]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + setPinInputHigh(row_pins[row]); } static void unselect_rows(void) { for(uint8_t x = 0; x < MATRIX_ROWS; x++) { - uint8_t pin = row_pins[x]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + setPinInput(row_pins[x]); } } @@ -334,9 +324,7 @@ static void unselect_rows(void) static void init_rows(void) { for(uint8_t x = 0; x < MATRIX_ROWS; x++) { - uint8_t pin = row_pins[x]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + setPinInputHigh(row_pins[x]); } } @@ -356,7 +344,7 @@ static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) matrix_row_t last_row_value = current_matrix[row_index]; // Check row pin state - if ((_SFR_IO8(row_pins[row_index] >> 4) & _BV(row_pins[row_index] & 0xF)) == 0) + if (readPin(row_pins[row_index]) == 0) { // Pin LO, set col bit current_matrix[row_index] |= (ROW_SHIFTER << current_col); @@ -382,24 +370,19 @@ static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) static void select_col(uint8_t col) { - uint8_t pin = col_pins[col]; - _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT - _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW + setPinOutput(col_pins[col]); + writePinLow(col_pins[col]); } static void unselect_col(uint8_t col) { - uint8_t pin = col_pins[col]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + setPinInputHigh(col_pins[col]); } static void unselect_cols(void) { for(uint8_t x = 0; x < MATRIX_COLS; x++) { - uint8_t pin = col_pins[x]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + setPinInputHigh(col_pins[x]); } } diff --git a/quantum/quantum.h b/quantum/quantum.h index 7cf16d81e..683333211 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h @@ -1,4 +1,4 @@ -/* Copyright 2016-2017 Erez Zukerman, Jack Humbert +/* Copyright 2016-2018 Erez Zukerman, Jack Humbert, Yiancar * * 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 @@ -17,9 +17,12 @@ #define QUANTUM_H #if defined(__AVR__) -#include -#include -#include + #include + #include + #include +#endif +#if defined(PROTOCOL_CHIBIOS) + #include "hal.h" #endif #include "wait.h" #include "matrix.h" @@ -33,11 +36,11 @@ #ifdef RGBLIGHT_ENABLE #include "rgblight.h" #else - #ifdef RGB_MATRIX_ENABLE - /* dummy define RGBLIGHT_MODE_xxxx */ - #define RGBLIGHT_H_DUMMY_DEFINE - #include "rgblight.h" - #endif + #ifdef RGB_MATRIX_ENABLE + /* dummy define RGBLIGHT_MODE_xxxx */ + #define RGBLIGHT_H_DUMMY_DEFINE + #include "rgblight.h" + #endif #endif #ifdef SPLIT_KEYBOARD @@ -76,9 +79,9 @@ extern uint32_t default_layer_state; #ifdef AUDIO_ENABLE #include "audio.h" #include "process_audio.h" - #ifdef AUDIO_CLICKY - #include "process_clicky.h" - #endif // AUDIO_CLICKY + #ifdef AUDIO_CLICKY + #include "process_clicky.h" + #endif // AUDIO_CLICKY #endif #ifdef STENO_ENABLE @@ -133,6 +136,48 @@ extern uint32_t default_layer_state; #include "hd44780.h" #endif +//Function substitutions to ease GPIO manipulation +#ifdef __AVR__ + #define pin_t uint8_t + #define setPinInput(pin) _SFR_IO8((pin >> 4) + 1) &= ~ _BV(pin & 0xF) + #define setPinInputHigh(pin) ({\ + _SFR_IO8((pin >> 4) + 1) &= ~ _BV(pin & 0xF);\ + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF);\ + }) + #define setPinInputLow(pin) _Static_assert(0, "AVR Processors cannot impliment an input as pull low") + #define setPinOutput(pin) _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF) + + #define writePinHigh(pin) _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF) + #define writePinLow(pin) _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF) + static inline void writePin(pin_t pin, uint8_t level){ + if (level){ + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); + } else { + _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); + } + } + + #define readPin(pin) (_SFR_IO8(pin >> 4) & _BV(pin & 0xF)) +#elif defined(PROTOCOL_CHIBIOS) + #define pin_t ioline_t + #define setPinInput(pin) palSetLineMode(pin, PAL_MODE_INPUT) + #define setPinInputHigh(pin) palSetLineMode(pin, PAL_MODE_INPUT_PULLUP) + #define setPinInputLow(pin) palSetLineMode(pin, PAL_MODE_INPUT_PULLDOWN) + #define setPinOutput(pin) palSetLineMode(pin, PAL_MODE_OUTPUT_PUSHPULL) + + #define writePinHigh(pin) palSetLine(pin) + #define writePinLow(pin) palClearLine(pin) + static inline void writePin(pin_t pin, uint8_t level){ + if (level){ + palSetLine(pin); + } else { + palClearLine(pin); + } + } + + #define readPin(pin) palReadLine(pin) +#endif + #define STRINGIZE(z) #z #define ADD_SLASH_X(y) STRINGIZE(\x ## y) #define SYMBOL_STR(x) ADD_SLASH_X(x) From daa11dc414d505076ebdf147a4e2c800b8a06190 Mon Sep 17 00:00:00 2001 From: Wilba6582 Date: Sat, 29 Sep 2018 02:01:00 +1000 Subject: [PATCH 171/788] Changed VID/PID, added commands, refactoring --- keyboards/rama/m60_a/config.h | 4 +- keyboards/zeal60/zeal60.c | 146 ++++++++++++++++------------------ keyboards/zeal60/zeal60_api.h | 9 ++- 3 files changed, 80 insertions(+), 79 deletions(-) diff --git a/keyboards/rama/m60_a/config.h b/keyboards/rama/m60_a/config.h index 45e7d8896..03794965f 100644 --- a/keyboards/rama/m60_a/config.h +++ b/keyboards/rama/m60_a/config.h @@ -18,8 +18,8 @@ #include "config_common.h" // USB Device descriptor parameter -#define VENDOR_ID 0xFEED // This is same as Zeal60 for now -#define PRODUCT_ID 0x6060 // This is same as Zeal60 for now +#define VENDOR_ID 0x5241 // "RW" +#define PRODUCT_ID 0x060A // 60-A #define DEVICE_VER 0x0001 #define MANUFACTURER RAMA.WORKS #define PRODUCT RAMA M60-A diff --git a/keyboards/zeal60/zeal60.c b/keyboards/zeal60/zeal60.c index 092235ca6..be54f75f3 100644 --- a/keyboards/zeal60/zeal60.c +++ b/keyboards/zeal60/zeal60.c @@ -38,6 +38,14 @@ void eeprom_set_valid(bool valid) eeprom_update_byte(((void*)EEPROM_VERSION_ADDR), valid ? EEPROM_VERSION : 0xFF); } +void eeprom_reset(void) +{ + // Set the Zeal60 specific EEPROM state as invalid. + eeprom_set_valid(false); + // Set the TMK/QMK EEPROM state as invalid. + eeconfig_disable(); +} + #ifdef RAW_ENABLE void raw_hid_receive( uint8_t *data, uint8_t length ) @@ -54,7 +62,7 @@ void raw_hid_receive( uint8_t *data, uint8_t length ) } case id_get_keyboard_value: { - if ( command_data[0] == 0x01 ) + if ( command_data[0] == id_uptime ) { uint32_t value = timer_read32(); command_data[1] = (value >> 24 ) & 0xFF; @@ -104,6 +112,21 @@ void raw_hid_receive( uint8_t *data, uint8_t length ) break; } #endif // RGB_BACKLIGHT_ENABLED + case id_eeprom_reset: + { + eeprom_reset(); + break; + } + case id_bootloader_jump: + { + // Need to send data back before the jump + // Informs host that the command is handled + raw_hid_send( data, length ); + // Give host time to read it + wait_ms(100); + bootloader_jump(); + break; + } default: { // Unhandled message. @@ -119,6 +142,37 @@ void raw_hid_receive( uint8_t *data, uint8_t length ) #endif +void main_init(void) +{ + // If the EEPROM has the magic, the data is good. + // OK to load from EEPROM. + if (eeprom_is_valid()) { +#if RGB_BACKLIGHT_ENABLED + backlight_config_load(); +#endif // RGB_BACKLIGHT_ENABLED + } else { +#if RGB_BACKLIGHT_ENABLED + // If the EEPROM has not been saved before, or is out of date, + // save the default values to the EEPROM. Default values + // come from construction of the zeal_backlight_config instance. + backlight_config_save(); +#endif // RGB_BACKLIGHT_ENABLED +#ifdef DYNAMIC_KEYMAP_ENABLE + // This resets the keymaps in EEPROM to what is in flash. + dynamic_keymap_reset(); +#endif + // Save the magic number last, in case saving was interrupted + eeprom_set_valid(true); + } +#if RGB_BACKLIGHT_ENABLED + // Initialize LED drivers for backlight. + backlight_init_drivers(); + + backlight_timer_init(); + backlight_timer_enable(); +#endif // RGB_BACKLIGHT_ENABLED +} + void bootmagic_lite(void) { // The lite version of TMK's bootmagic. @@ -131,19 +185,10 @@ void bootmagic_lite(void) wait_ms(DEBOUNCING_DELAY); matrix_scan(); - // If the Esc and space bar are held down on power up, + // If the Esc (matrix 0,0) is held down on power up, // reset the EEPROM valid state and jump to bootloader. - // Assumes Esc is at [0,0] and spacebar is at [4,7]. - // This isn't very generalized, but we need something that doesn't - // rely on user's keymaps in firmware or EEPROM. - if ( ( matrix_get_row(0) & (1<<0) ) && - ( matrix_get_row(4) & (1<<7) ) ) - { - // Set the Zeal60 specific EEPROM state as invalid. - eeprom_set_valid(false); - // Set the TMK/QMK EEPROM state as invalid. - eeconfig_disable(); - // Jump to bootloader. + if ( matrix_get_row(0) & (1<<0) ) { + eeprom_reset(); bootloader_jump(); } } @@ -151,42 +196,7 @@ void bootmagic_lite(void) void matrix_init_kb(void) { bootmagic_lite(); - - // If the EEPROM has the magic, the data is good. - // OK to load from EEPROM. - if (eeprom_is_valid()) - { -#if RGB_BACKLIGHT_ENABLED - backlight_config_load(); -#endif // RGB_BACKLIGHT_ENABLED - // TODO: do something to "turn on" keymaps in EEPROM? - } - else - { -#if RGB_BACKLIGHT_ENABLED - // If the EEPROM has not been saved before, or is out of date, - // save the default values to the EEPROM. Default values - // come from construction of the zeal_backlight_config instance. - backlight_config_save(); -#endif // RGB_BACKLIGHT_ENABLED - -#ifdef DYNAMIC_KEYMAP_ENABLE - // This resets the keymaps in EEPROM to what is in flash. - dynamic_keymap_reset(); -#endif - - // Save the magic number last, in case saving was interrupted - eeprom_set_valid(true); - } - -#if RGB_BACKLIGHT_ENABLED - // Initialize LED drivers for backlight. - backlight_init_drivers(); - - backlight_timer_init(); - backlight_timer_enable(); -#endif // RGB_BACKLIGHT_ENABLED - + main_init(); matrix_init_user(); } @@ -205,29 +215,22 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) process_record_backlight(keycode, record); #endif // BACKLIGHT_ENABLED - switch(keycode) - { + switch(keycode) { case FN_MO13: - if (record->event.pressed) - { + if (record->event.pressed) { layer_on(1); update_tri_layer(1, 2, 3); - } - else - { + } else { layer_off(1); update_tri_layer(1, 2, 3); } return false; break; case FN_MO23: - if (record->event.pressed) - { + if (record->event.pressed) { layer_on(2); update_tri_layer(1, 2, 3); - } - else - { + } else { layer_off(2); update_tri_layer(1, 2, 3); } @@ -247,8 +250,7 @@ uint16_t keymap_function_id_to_action( uint16_t function_id ) if ( function_id >= 0x0F00 && function_id <= 0x0FFF ) { uint8_t id = function_id & 0xFF; - switch ( id ) - { + switch ( id ) { case TRIPLE_TAP_1_3: case TRIPLE_TAP_2_3: { @@ -293,24 +295,16 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { case TRIPLE_TAP_1_3: case TRIPLE_TAP_2_3: - if (record->event.pressed) - { + if (record->event.pressed) { layer_on( id == TRIPLE_TAP_1_3 ? 1 : 2 ); - - if (record->tap.count && !record->tap.interrupted) - { - if (record->tap.count >= 3) - { + if (record->tap.count && !record->tap.interrupted) { + if (record->tap.count >= 3) { layer_invert(3); } - } - else - { + } else { record->tap.count = 0; } - } - else - { + } else { layer_off( id == TRIPLE_TAP_1_3 ? 1 : 2 ); } break; diff --git a/keyboards/zeal60/zeal60_api.h b/keyboards/zeal60/zeal60_api.h index eaac3ad7c..a65bf2f50 100644 --- a/keyboards/zeal60/zeal60_api.h +++ b/keyboards/zeal60/zeal60_api.h @@ -28,6 +28,13 @@ enum zeal60_command_id id_backlight_config_set_value, id_backlight_config_get_value, id_backlight_config_save, - + id_eeprom_reset, + id_bootloader_jump, id_unhandled = 0xFF, }; + +enum zeal60_keyboard_value_id +{ + id_uptime = 0x01 +}; + From f1b2d46eafbec2b834dc4bcb5ba2dac9f913eed8 Mon Sep 17 00:00:00 2001 From: noroadsleft Date: Fri, 28 Sep 2018 11:34:40 -0700 Subject: [PATCH 172/788] Spell-check update for Userspace documentation Because leaving review comments on a PR that's already been merged doesn't make any sense. --- docs/feature_userspace.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/feature_userspace.md b/docs/feature_userspace.md index b7fc9d809..5a9fc287b 100644 --- a/docs/feature_userspace.md +++ b/docs/feature_userspace.md @@ -100,7 +100,7 @@ Additionally, this is a good place to document your code, if you wish to share i # Examples For a brief example, checkout [`/users/_example/`](https://github.com/qmk/qmk_firmware/tree/master/users/drashna). -For a more complicaed example, checkout [`/users/drashna/`](https://github.com/qmk/qmk_firmware/tree/master/users/drashna)'s userspace. +For a more complicated example, checkout [`/users/drashna/`](https://github.com/qmk/qmk_firmware/tree/master/users/drashna)'s userspace. ## Customized Functions @@ -124,7 +124,7 @@ uint32_t layer_state_set_user (uint32_t state) { return layer_state_set_keymap (state); } ``` -The `__attribute__ ((weak))` part tells the compiler that this is a placce holder function that can then be replaced by a version in your `keymap.c`. That way, you don't need to add it to your `keymap.c`, but if you do, you won't get any conflicts because the function is the same name. +The `__attribute__ ((weak))` part tells the compiler that this is a placeholder function that can then be replaced by a version in your `keymap.c`. That way, you don't need to add it to your `keymap.c`, but if you do, you won't get any conflicts because the function is the same name. The `_keymap` part here doesn't matter, it just needs to be something other than `_quantum`, `_kb`, or `_user`, since those are already in use. So you could use `layer_state_set_mine`, `layer_state_set_fn`, or anything else. @@ -140,7 +140,7 @@ ifeq ($(strip $(MACROS_ENABLED)), yes) OPT_DEFS += -DMACROS_ENABLED endif ``` -The `OPT_DEFS` setting causee `MACROS_ENABLED` to be defined for your keyboards (note the `-D` in front of the name), and you could use `#ifdef MACROS_ENABLED` to check the status in your c/h files, and handle that code based on that. +The `OPT_DEFS` setting causes `MACROS_ENABLED` to be defined for your keyboards (note the `-D` in front of the name), and you could use `#ifdef MACROS_ENABLED` to check the status in your c/h files, and handle that code based on that. Then you add `MACROS_ENABLED = yes` to the `rules.mk` for you keymap to enable this feature and the code in your userspace. @@ -220,7 +220,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } ``` -This will add a new `KC_MAKE` keycode that can be used in any of your keymaps. And this keycode will output `make :`, making frequent compiling easier. And this will work with any keyboard and any keymap as it will output the current boards info, so that you don't have to type this out every time. +This will add a new `KC_MAKE` keycode that can be used in any of your keymaps. And this keycode will output `make :`, making frequent compiling easier. And this will work with any keyboard and any keymap as it will output the current boards info, so that you don't have to type this out every time. Additionally, this should flash the newly compiled firmware automatically, using the correct utility, based on the bootloader settings (or default to just generating the HEX file). However, it should be noted that this may not work on all systems. AVRDUDE doesn't work on WSL, namely (and will dump the HEX in the ".build" folder instead). From cb468e030712731cffb288cb6d8433cf3b953491 Mon Sep 17 00:00:00 2001 From: Ethan Madden Date: Fri, 28 Sep 2018 12:44:15 -0700 Subject: [PATCH 173/788] Keymap: Clicky frequency modulation (#4012) Also worked around my busted dipswitch 2... --- .../planck/keymaps/jetpacktuxedo/keymap.c | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/keyboards/planck/keymaps/jetpacktuxedo/keymap.c b/keyboards/planck/keymaps/jetpacktuxedo/keymap.c index 132405686..b344bd076 100644 --- a/keyboards/planck/keymaps/jetpacktuxedo/keymap.c +++ b/keyboards/planck/keymaps/jetpacktuxedo/keymap.c @@ -188,15 +188,24 @@ uint16_t muse_counter = 0; uint8_t muse_offset = 70; uint16_t muse_tempo = 20; +extern float clicky_rand; + void encoder_update(bool clockwise) { if (is_clicky_on()) { - if (clockwise) { - clicky_freq_up(); + if (IS_LAYER_ON(_RAISE)) { + if (clockwise) { + clicky_rand += 0.5f; + } else { + clicky_rand -= 0.5f; + } } else { - clicky_freq_down(); + if (clockwise) { + clicky_freq_up(); + } else { + clicky_freq_down(); + } } - } else - if (muse_mode) { + } else if (muse_mode) { if (IS_LAYER_ON(_RAISE)) { if (clockwise) { muse_offset++; @@ -255,7 +264,8 @@ void dip_update(uint8_t index, bool active) { stop_all_notes(); #endif } - case 2: + break; + case 3: if (active) { clicky_on(); } else { From e4eeb1eb230a4d92f1c88197b71a07b342966e73 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 28 Sep 2018 13:32:54 -0700 Subject: [PATCH 174/788] Fix RGB Matrix feature processing in common_features.mk Specifically, an "L" got appended to the controller names for te "valid types", but did not get appended to the blocks that include the specific drives. So, this breaks anything that isn't "Yes". --- common_features.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common_features.mk b/common_features.mk index 6c835abde..65ff6b5b3 100644 --- a/common_features.mk +++ b/common_features.mk @@ -115,7 +115,7 @@ ifeq ($(strip $(RGBLIGHT_ENABLE)), yes) endif RGB_MATRIX_ENABLE ?= no -VALID_MATRIX_TYPES := yes IS31FL3731L IS31FL3733L custom +VALID_MATRIX_TYPES := yes IS31FL3731 IS31FL3733 custom ifneq ($(strip $(RGB_MATRIX_ENABLE)), no) ifeq ($(filter $(RGB_MATRIX_ENABLE),$(VALID_MATRIX_TYPES)),) $(error RGB_MATRIX_ENABLE="$(RGB_MATRIX_ENABLE)" is not a valid matrix type) From e2dee054d0649cb7b5b051a04a9bd82d14a0fdcd Mon Sep 17 00:00:00 2001 From: Takuya Urakawa Date: Sat, 29 Sep 2018 10:30:44 +0900 Subject: [PATCH 175/788] add st-link_cli flashing (#3899) * add st-link_cli support * format names --- tmk_core/chibios.mk | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tmk_core/chibios.mk b/tmk_core/chibios.mk index 25c49204b..014c8d502 100644 --- a/tmk_core/chibios.mk +++ b/tmk_core/chibios.mk @@ -198,10 +198,13 @@ ifneq ("$(SERIAL)","") DFU_ARGS += -S $(SERIAL) endif +ST_LINK_ARGS ?= + # List any extra directories to look for libraries here. EXTRALIBDIRS = $(RULESPATH)/ld DFU_UTIL ?= dfu-util +ST_LINK_CLI ?= st-link_cli # Generate a .qmk for the QMK-FF qmk: $(BUILD_DIR)/$(TARGET).bin @@ -230,5 +233,8 @@ qmk: $(BUILD_DIR)/$(TARGET).bin dfu-util: $(BUILD_DIR)/$(TARGET).bin cpfirmware sizeafter $(DFU_UTIL) $(DFU_ARGS) -D $(BUILD_DIR)/$(TARGET).bin +st-link-cli: $(BUILD_DIR)/$(TARGET).hex sizeafter + $(ST_LINK_CLI) $(ST_LINK_ARGS) -q -c SWD -p $(BUILD_DIR)/$(TARGET).hex -Rst + bin: $(BUILD_DIR)/$(TARGET).bin sizeafter $(COPY) $(BUILD_DIR)/$(TARGET).bin $(TARGET).bin; From 239f02408e219567be060be7e65e92e888304ed0 Mon Sep 17 00:00:00 2001 From: patrickmt <40182064+patrickmt@users.noreply.github.com> Date: Fri, 28 Sep 2018 21:32:15 -0400 Subject: [PATCH 176/788] Massdrop keyboard updates for SEND_STRING, syscalls, stdio, debug prints, Auto Shift (#3973) * Update for SEND_STRING usage Update for SEND_STRING usage. Sending keyboard reports (kbd, nkro) now obey the minimum polling time. While attempting to send a keyboard report and waiting for a USB poll, other functions of the keyboard, including LED effects and power management, will continue to operate at their intended intervals. * Updates for send string, syscalls, stdio, debug prints, auto shift Now properly waiting for previous keys sent over USB to complete before sending new. Added heap to linker and now compiling with syscalls support. Removed custom string functions and now using stdio. dprintf now works as intended through virtser device. * CTRL and ALT keymap updates CTRL mac keymap updated ALT default and mac keymap updated ALT rules.mk added Auto Shift with default no * Code cleanup as per discussion with vomindoraan Code cleanup as per discussion with vomindoraan --- keyboards/massdrop/alt/alt.h | 10 + .../massdrop/alt/keymaps/default/keymap.c | 35 +-- keyboards/massdrop/alt/keymaps/mac/keymap.c | 33 +-- keyboards/massdrop/alt/rules.mk | 1 + keyboards/massdrop/ctrl/ctrl.h | 10 + .../massdrop/ctrl/keymaps/default/keymap.c | 39 +-- keyboards/massdrop/ctrl/keymaps/mac/keymap.c | 41 +-- keyboards/massdrop/ctrl/rules.mk | 1 + .../1.0.70/gcc/gcc/samd51j18a_flash.ld | 16 +- tmk_core/arm_atsam.mk | 2 +- tmk_core/common/arm_atsam/printf.h | 2 +- tmk_core/common/print.h | 2 +- tmk_core/protocol/arm_atsam.mk | 1 - .../protocol/arm_atsam/arm_atsam_protocol.h | 1 - tmk_core/protocol/arm_atsam/d51_util.h | 10 + tmk_core/protocol/arm_atsam/main_arm_atsam.c | 136 +++++---- tmk_core/protocol/arm_atsam/usb/spfssf.c | 268 ------------------ tmk_core/protocol/arm_atsam/usb/spfssf.h | 57 ---- tmk_core/protocol/arm_atsam/usb/udi_cdc.c | 8 +- tmk_core/protocol/arm_atsam/usb/udi_cdc.h | 10 +- tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c | 10 +- tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h | 2 + 22 files changed, 175 insertions(+), 520 deletions(-) delete mode 100644 tmk_core/protocol/arm_atsam/usb/spfssf.c delete mode 100644 tmk_core/protocol/arm_atsam/usb/spfssf.h diff --git a/keyboards/massdrop/alt/alt.h b/keyboards/massdrop/alt/alt.h index 387985512..8dfed8d2d 100644 --- a/keyboards/massdrop/alt/alt.h +++ b/keyboards/massdrop/alt/alt.h @@ -22,3 +22,13 @@ { K45, KC_NO, K46, K47, K48, K49, K50, K51, K52, K53, K54, K55, K56, K57, K58, }, \ { K59, K60, K61, KC_NO, KC_NO, KC_NO, K62, KC_NO, KC_NO, KC_NO, K63, K64, K65, K66, K67, }, \ } + +#define TOGGLE_FLAG_AND_PRINT(var, name) { \ + if (var) { \ + dprintf(name " disabled\r\n"); \ + var = !var; \ + } else { \ + var = !var; \ + dprintf(name " enabled\r\n"); \ + } \ + } diff --git a/keyboards/massdrop/alt/keymaps/default/keymap.c b/keyboards/massdrop/alt/keymaps/default/keymap.c index 0cbce8629..a5c443ffc 100644 --- a/keyboards/massdrop/alt/keymaps/default/keymap.c +++ b/keyboards/massdrop/alt/keymaps/default/keymap.c @@ -136,8 +136,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { case L_T_BR: if (record->event.pressed) { led_animation_breathing = !led_animation_breathing; - if (led_animation_breathing) - { + if (led_animation_breathing) { gcr_breathe = gcr_desired; led_animation_breathe_cur = BREATHE_MIN_STEP; breathe_dir = 1; @@ -151,50 +150,32 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { return false; case U_T_AUTO: if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { - usb_extra_manual = !usb_extra_manual; - CDC_print("USB extra port manual mode "); - CDC_print(usb_extra_manual ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(usb_extra_manual, "USB extra port manual mode"); } return false; case U_T_AGCR: if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { - usb_gcr_auto = !usb_gcr_auto; - CDC_print("USB GCR auto mode "); - CDC_print(usb_gcr_auto ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode"); } return false; case DBG_TOG: if (record->event.pressed) { - debug_enable = !debug_enable; - CDC_print("Debug mode "); - CDC_print(debug_enable ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(debug_enable, "Debug mode"); } return false; case DBG_MTRX: if (record->event.pressed) { - debug_matrix = !debug_matrix; - CDC_print("Debug matrix "); - CDC_print(debug_matrix ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(debug_matrix, "Debug matrix"); } return false; case DBG_KBD: if (record->event.pressed) { - debug_keyboard = !debug_keyboard; - CDC_print("Debug keyboard "); - CDC_print(debug_keyboard ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(debug_keyboard, "Debug keyboard"); } return false; case DBG_MOU: if (record->event.pressed) { - debug_mouse = !debug_mouse; - CDC_print("Debug mouse "); - CDC_print(debug_mouse ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(debug_mouse, "Debug mouse"); } return false; case MD_BOOT: @@ -209,4 +190,4 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { default: return true; //Process all other keycodes normally } -} \ No newline at end of file +} diff --git a/keyboards/massdrop/alt/keymaps/mac/keymap.c b/keyboards/massdrop/alt/keymaps/mac/keymap.c index e886290e7..d6978fd80 100644 --- a/keyboards/massdrop/alt/keymaps/mac/keymap.c +++ b/keyboards/massdrop/alt/keymaps/mac/keymap.c @@ -136,8 +136,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { case L_T_BR: if (record->event.pressed) { led_animation_breathing = !led_animation_breathing; - if (led_animation_breathing) - { + if (led_animation_breathing) { gcr_breathe = gcr_desired; led_animation_breathe_cur = BREATHE_MIN_STEP; breathe_dir = 1; @@ -151,50 +150,32 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { return false; case U_T_AUTO: if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { - usb_extra_manual = !usb_extra_manual; - CDC_print("USB extra port manual mode "); - CDC_print(usb_extra_manual ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(usb_extra_manual, "USB extra port manual mode"); } return false; case U_T_AGCR: if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { - usb_gcr_auto = !usb_gcr_auto; - CDC_print("USB GCR auto mode "); - CDC_print(usb_gcr_auto ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode"); } return false; case DBG_TOG: if (record->event.pressed) { - debug_enable = !debug_enable; - CDC_print("Debug mode "); - CDC_print(debug_enable ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(debug_enable, "Debug mode"); } return false; case DBG_MTRX: if (record->event.pressed) { - debug_matrix = !debug_matrix; - CDC_print("Debug matrix "); - CDC_print(debug_matrix ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(debug_matrix, "Debug matrix"); } return false; case DBG_KBD: if (record->event.pressed) { - debug_keyboard = !debug_keyboard; - CDC_print("Debug keyboard "); - CDC_print(debug_keyboard ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(debug_keyboard, "Debug keyboard"); } return false; case DBG_MOU: if (record->event.pressed) { - debug_mouse = !debug_mouse; - CDC_print("Debug mouse "); - CDC_print(debug_mouse ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(debug_mouse, "Debug mouse"); } return false; case MD_BOOT: diff --git a/keyboards/massdrop/alt/rules.mk b/keyboards/massdrop/alt/rules.mk index daf679585..c5539158f 100644 --- a/keyboards/massdrop/alt/rules.mk +++ b/keyboards/massdrop/alt/rules.mk @@ -30,3 +30,4 @@ FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) VIRTSER_ENABLE = no # USB Serial Driver RAW_ENABLE = no # Raw device +AUTO_SHIFT_ENABLE = no # Auto Shift diff --git a/keyboards/massdrop/ctrl/ctrl.h b/keyboards/massdrop/ctrl/ctrl.h index dc7c7eabe..c83efca16 100644 --- a/keyboards/massdrop/ctrl/ctrl.h +++ b/keyboards/massdrop/ctrl/ctrl.h @@ -30,3 +30,13 @@ { K59, K60, K61, K62, K63, K76, K50, K33 }, \ { K72, K73, K74, K75, K85, K86, K87, }, \ } + +#define TOGGLE_FLAG_AND_PRINT(var, name) { \ + if (var) { \ + dprintf(name " disabled\r\n"); \ + var = !var; \ + } else { \ + var = !var; \ + dprintf(name " enabled\r\n"); \ + } \ + } diff --git a/keyboards/massdrop/ctrl/keymaps/default/keymap.c b/keyboards/massdrop/ctrl/keymaps/default/keymap.c index 9bfb7fec5..88c1ac312 100644 --- a/keyboards/massdrop/ctrl/keymaps/default/keymap.c +++ b/keyboards/massdrop/ctrl/keymaps/default/keymap.c @@ -33,7 +33,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, \ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, \ - KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT \ ), [1] = LAYOUT( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_TRNS, KC_TRNS, \ @@ -41,7 +41,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { L_T_BR, L_PSD, L_BRI, L_PSI, KC_TRNS, KC_TRNS, KC_TRNS, U_T_AUTO,U_T_AGCR,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_VOLD, \ L_T_PTD, L_PTP, L_BRD, L_PTN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ KC_TRNS, L_T_MD, L_T_ONF, KC_TRNS, KC_TRNS, MD_BOOT, TG_NKRO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ ), /* [X] = LAYOUT( @@ -50,7 +50,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, TG_NKRO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ ), */ }; @@ -139,8 +139,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { case L_T_BR: if (record->event.pressed) { led_animation_breathing = !led_animation_breathing; - if (led_animation_breathing) - { + if (led_animation_breathing) { gcr_breathe = gcr_desired; led_animation_breathe_cur = BREATHE_MIN_STEP; breathe_dir = 1; @@ -154,50 +153,32 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { return false; case U_T_AUTO: if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { - usb_extra_manual = !usb_extra_manual; - CDC_print("USB extra port manual mode "); - CDC_print(usb_extra_manual ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(usb_extra_manual, "USB extra port manual mode"); } return false; case U_T_AGCR: if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { - usb_gcr_auto = !usb_gcr_auto; - CDC_print("USB GCR auto mode "); - CDC_print(usb_gcr_auto ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode"); } return false; case DBG_TOG: if (record->event.pressed) { - debug_enable = !debug_enable; - CDC_print("Debug mode "); - CDC_print(debug_enable ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(debug_enable, "Debug mode"); } return false; case DBG_MTRX: if (record->event.pressed) { - debug_matrix = !debug_matrix; - CDC_print("Debug matrix "); - CDC_print(debug_matrix ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(debug_matrix, "Debug matrix"); } return false; case DBG_KBD: if (record->event.pressed) { - debug_keyboard = !debug_keyboard; - CDC_print("Debug keyboard "); - CDC_print(debug_keyboard ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(debug_keyboard, "Debug keyboard"); } return false; case DBG_MOU: if (record->event.pressed) { - debug_mouse = !debug_mouse; - CDC_print("Debug mouse "); - CDC_print(debug_mouse ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(debug_mouse, "Debug mouse"); } return false; case MD_BOOT: diff --git a/keyboards/massdrop/ctrl/keymaps/mac/keymap.c b/keyboards/massdrop/ctrl/keymaps/mac/keymap.c index a03f891e8..6c5dfe19c 100644 --- a/keyboards/massdrop/ctrl/keymaps/mac/keymap.c +++ b/keyboards/massdrop/ctrl/keymaps/mac/keymap.c @@ -33,15 +33,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, \ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, \ - KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, MO(1), KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT \ + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, MO(1), KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT \ ), [1] = LAYOUT( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_TRNS, KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_MSTP, KC_VOLU, \ L_T_BR, L_PSD, L_BRI, L_PSI, KC_TRNS, KC_TRNS, KC_TRNS, U_T_AUTO,U_T_AGCR,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_VOLD, \ L_T_PTD, L_PTP, L_BRD, L_PTN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, L_T_MD, L_T_ONF, KC_TRNS, KC_TRNS, KC_TRNS, TG_NKRO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ + KC_TRNS, L_T_MD, L_T_ONF, KC_TRNS, KC_TRNS, MD_BOOT, TG_NKRO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ ), /* [X] = LAYOUT( @@ -50,7 +50,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, TG_NKRO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ ), */ }; @@ -139,8 +139,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { case L_T_BR: if (record->event.pressed) { led_animation_breathing = !led_animation_breathing; - if (led_animation_breathing) - { + if (led_animation_breathing) { gcr_breathe = gcr_desired; led_animation_breathe_cur = BREATHE_MIN_STEP; breathe_dir = 1; @@ -154,50 +153,32 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { return false; case U_T_AUTO: if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { - usb_extra_manual = !usb_extra_manual; - CDC_print("USB extra port manual mode "); - CDC_print(usb_extra_manual ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(usb_extra_manual, "USB extra port manual mode"); } return false; case U_T_AGCR: if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { - usb_gcr_auto = !usb_gcr_auto; - CDC_print("USB GCR auto mode "); - CDC_print(usb_gcr_auto ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode"); } return false; case DBG_TOG: if (record->event.pressed) { - debug_enable = !debug_enable; - CDC_print("Debug mode "); - CDC_print(debug_enable ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(debug_enable, "Debug mode"); } return false; case DBG_MTRX: if (record->event.pressed) { - debug_matrix = !debug_matrix; - CDC_print("Debug matrix "); - CDC_print(debug_matrix ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(debug_matrix, "Debug matrix"); } return false; case DBG_KBD: if (record->event.pressed) { - debug_keyboard = !debug_keyboard; - CDC_print("Debug keyboard "); - CDC_print(debug_keyboard ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(debug_keyboard, "Debug keyboard"); } return false; case DBG_MOU: if (record->event.pressed) { - debug_mouse = !debug_mouse; - CDC_print("Debug mouse "); - CDC_print(debug_mouse ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(debug_mouse, "Debug mouse"); } return false; case MD_BOOT: diff --git a/keyboards/massdrop/ctrl/rules.mk b/keyboards/massdrop/ctrl/rules.mk index daf679585..c5539158f 100644 --- a/keyboards/massdrop/ctrl/rules.mk +++ b/keyboards/massdrop/ctrl/rules.mk @@ -30,3 +30,4 @@ FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) VIRTSER_ENABLE = no # USB Serial Driver RAW_ENABLE = no # Raw device +AUTO_SHIFT_ENABLE = no # Auto Shift diff --git a/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/gcc/gcc/samd51j18a_flash.ld b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/gcc/gcc/samd51j18a_flash.ld index 3d114f5b7..35db61971 100644 --- a/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/gcc/gcc/samd51j18a_flash.ld +++ b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/gcc/gcc/samd51j18a_flash.ld @@ -35,7 +35,7 @@ SEARCH_DIR(.) /* Memory Spaces Definitions */ MEMORY { - //rom (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 +/*rom (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000*/ rom (rx) : ORIGIN = 0x00004000, LENGTH = 0x0003C000 ram (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00020000 bkupram (rwx) : ORIGIN = 0x47000000, LENGTH = 0x00002000 @@ -45,6 +45,9 @@ MEMORY /* The stack size used by the application. NOTE: you need to adjust according to your application. */ STACK_SIZE = DEFINED(STACK_SIZE) ? STACK_SIZE : DEFINED(__stack_size__) ? __stack_size__ : 0x8000; +/* The heap size used by the application. */ +HEAP_SIZE = DEFINED(HEAP_SIZE) ? HEAP_SIZE : DEFINED(__heap_size__) ? __heap_size__ : 0x800; + _srom = ORIGIN(rom); _lrom = LENGTH(rom); _erom = ORIGIN(rom) + LENGTH(rom); @@ -153,6 +156,17 @@ SECTIONS _ezero = .; } > ram + /* .heap section for syscalls */ + .heap (NOLOAD) : + { + . = ALIGN(4); + _end = .; + end = .; + _heap_start = .; + . = . + HEAP_SIZE; + _heap_end = .; + } > ram + /* stack section */ .stack (NOLOAD): { diff --git a/tmk_core/arm_atsam.mk b/tmk_core/arm_atsam.mk index ef412d59d..06823fb62 100644 --- a/tmk_core/arm_atsam.mk +++ b/tmk_core/arm_atsam.mk @@ -36,7 +36,7 @@ LDFLAGS +=-Wl,--gc-sections LDFLAGS += -Wl,-Map="%OUT%%PROJ_NAME%.map" LDFLAGS += -Wl,--start-group LDFLAGS += -Wl,--end-group -LDFLAGS += -Wl,--gc-sections +LDFLAGS += --specs=rdimon.specs LDFLAGS += -T$(LIB_PATH)/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/gcc/gcc/samd51j18a_flash.ld OPT_DEFS += -DPROTOCOL_ARM_ATSAM diff --git a/tmk_core/common/arm_atsam/printf.h b/tmk_core/common/arm_atsam/printf.h index 582c83bf5..3206b40bd 100644 --- a/tmk_core/common/arm_atsam/printf.h +++ b/tmk_core/common/arm_atsam/printf.h @@ -1,8 +1,8 @@ #ifndef _PRINTF_H_ #define _PRINTF_H_ -#define __xprintf dpf int dpf(const char *_Format, ...); +#define __xprintf dpf #endif //_PRINTF_H_ diff --git a/tmk_core/common/print.h b/tmk_core/common/print.h index 9cbe67bad..d94527657 100644 --- a/tmk_core/common/print.h +++ b/tmk_core/common/print.h @@ -29,7 +29,7 @@ #include #include "util.h" -#if defined(PROTOCOL_CHIBIOS) +#if defined(PROTOCOL_CHIBIOS) || defined(PROTOCOL_ARM_ATSAM) #define PSTR(x) x #endif diff --git a/tmk_core/protocol/arm_atsam.mk b/tmk_core/protocol/arm_atsam.mk index d535b64cd..04e02790a 100644 --- a/tmk_core/protocol/arm_atsam.mk +++ b/tmk_core/protocol/arm_atsam.mk @@ -10,7 +10,6 @@ SRC += $(ARM_ATSAM_DIR)/spi.c SRC += $(ARM_ATSAM_DIR)/startup.c SRC += $(ARM_ATSAM_DIR)/usb/main_usb.c -SRC += $(ARM_ATSAM_DIR)/usb/spfssf.c SRC += $(ARM_ATSAM_DIR)/usb/udc.c SRC += $(ARM_ATSAM_DIR)/usb/udi_cdc.c SRC += $(ARM_ATSAM_DIR)/usb/udi_hid.c diff --git a/tmk_core/protocol/arm_atsam/arm_atsam_protocol.h b/tmk_core/protocol/arm_atsam/arm_atsam_protocol.h index be73beccd..2ba099174 100644 --- a/tmk_core/protocol/arm_atsam/arm_atsam_protocol.h +++ b/tmk_core/protocol/arm_atsam/arm_atsam_protocol.h @@ -36,7 +36,6 @@ along with this program. If not, see . #include "issi3733_driver.h" #include "./usb/compiler.h" #include "./usb/udc.h" -#include "./usb/spfssf.h" #include "./usb/udi_cdc.h" #endif //MD_BOOTLOADER diff --git a/tmk_core/protocol/arm_atsam/d51_util.h b/tmk_core/protocol/arm_atsam/d51_util.h index 465889c7c..7a35f7989 100644 --- a/tmk_core/protocol/arm_atsam/d51_util.h +++ b/tmk_core/protocol/arm_atsam/d51_util.h @@ -32,6 +32,16 @@ along with this program. If not, see . #define m15_on REG_PORT_OUTSET1 = 0x40000000 //PB30 High #define m15_off REG_PORT_OUTCLR1 = 0x40000000 //PB30 Low +//Debug Port PB23 +#define m27_ena REG_PORT_DIRSET1 = 0x800000 //PB23 Output +#define m27_on REG_PORT_OUTSET1 = 0x800000 //PB23 High +#define m27_off REG_PORT_OUTCLR1 = 0x800000 //PB23 Low + +//Debug Port PB31 +#define m28_ena REG_PORT_DIRSET1 = 0x80000000 //PB31 Output +#define m28_on REG_PORT_OUTSET1 = 0x80000000 //PB31 High +#define m28_off REG_PORT_OUTCLR1 = 0x80000000 //PB31 Low + #define m15_loop(M15X) {uint8_t M15L=M15X; while(M15L--){m15_on;CLK_delay_us(1);m15_off;}} void m15_print(uint32_t x); diff --git a/tmk_core/protocol/arm_atsam/main_arm_atsam.c b/tmk_core/protocol/arm_atsam/main_arm_atsam.c index 8cc776703..676dac4ea 100644 --- a/tmk_core/protocol/arm_atsam/main_arm_atsam.c +++ b/tmk_core/protocol/arm_atsam/main_arm_atsam.c @@ -31,6 +31,7 @@ along with this program. If not, see . //From keyboard's directory #include "config_led.h" +void main_subtasks(void); uint8_t keyboard_leds(void); void send_keyboard(report_keyboard_t *report); void send_mouse(report_mouse_t *report); @@ -65,7 +66,7 @@ void send_keyboard(report_keyboard_t *report) if (!keymap_config.nkro) { #endif //NKRO_ENABLE - dprint("s-kbd\r\n"); + while (udi_hid_kbd_b_report_trans_ongoing) { main_subtasks(); } //Run other tasks while waiting for USB to be free irqflags = __get_PRIMASK(); __disable_irq(); @@ -81,7 +82,7 @@ void send_keyboard(report_keyboard_t *report) } else { - dprint("s-nkro\r\n"); + while (udi_hid_nkro_b_report_trans_ongoing) { main_subtasks(); } //Run other tasks while waiting for USB to be free irqflags = __get_PRIMASK(); __disable_irq(); @@ -102,8 +103,6 @@ void send_mouse(report_mouse_t *report) #ifdef MOUSEKEY_ENABLE uint32_t irqflags; - dprint("s-mou\r\n"); - irqflags = __get_PRIMASK(); __disable_irq(); __DMB(); @@ -120,8 +119,6 @@ void send_mouse(report_mouse_t *report) void send_system(uint16_t data) { #ifdef EXTRAKEY_ENABLE - dprintf("s-exks %i\r\n", data); - uint32_t irqflags; irqflags = __get_PRIMASK(); @@ -142,8 +139,6 @@ void send_system(uint16_t data) void send_consumer(uint16_t data) { #ifdef EXTRAKEY_ENABLE - dprintf("s-exkc %i\r\n",data); - uint32_t irqflags; irqflags = __get_PRIMASK(); @@ -160,6 +155,77 @@ void send_consumer(uint16_t data) #endif //EXTRAKEY_ENABLE } +uint8_t g_drvid; + +void main_subtask_usb_state(void) +{ + if (usb_state == USB_STATE_POWERDOWN) + { + uint32_t timer_led = timer_read32(); + + led_on; + if (led_enabled) + { + for (g_drvid = 0; g_drvid < ISSI3733_DRIVER_COUNT; g_drvid++) + { + I2C3733_Control_Set(0); + } + } + while (usb_state == USB_STATE_POWERDOWN) + { + if (timer_read32() - timer_led > 1000) led_off; //Good to indicate went to sleep, but only for a second + } + if (led_enabled) + { + for (g_drvid = 0; g_drvid < ISSI3733_DRIVER_COUNT; g_drvid++) + { + I2C3733_Control_Set(1); + } + } + led_off; + } +} + +void main_subtask_led(void) +{ + led_matrix_task(); +} + +void main_subtask_power_check(void) +{ + static uint64_t next_5v_checkup = 0; + + if (CLK_get_ms() > next_5v_checkup) + { + next_5v_checkup = CLK_get_ms() + 5; + + v_5v = adc_get(ADC_5V); + v_5v_avg = 0.9 * v_5v_avg + 0.1 * v_5v; + + gcr_compute(); + } +} + +void main_subtask_usb_extra_device(void) +{ + static uint64_t next_usb_checkup = 0; + + if (CLK_get_ms() > next_usb_checkup) + { + next_usb_checkup = CLK_get_ms() + 10; + + USB_HandleExtraDevice(); + } +} + +void main_subtasks(void) +{ + main_subtask_usb_state(); + main_subtask_led(); + main_subtask_power_check(); + main_subtask_usb_extra_device(); +} + int main(void) { led_ena; @@ -201,9 +267,8 @@ int main(void) i2c_led_q_init(); - uint8_t drvid; - for (drvid=0;drvid 1000) led_off; //Good to indicate went to sleep, but only for a second - } - if (led_enabled) - { - for (drvid=0;drvid next_5v_checkup) - { - next_5v_checkup = CLK_get_ms() + 5; - - v_5v = adc_get(ADC_5V); - v_5v_avg = 0.9 * v_5v_avg + 0.1 * v_5v; - - gcr_compute(); - } - - if (CLK_get_ms() > next_usb_checkup) - { - next_usb_checkup = CLK_get_ms() + 10; - - USB_HandleExtraDevice(); - } + main_subtasks(); //Note these tasks will also be run while waiting for USB keyboard polling intervals #ifdef VIRTSER_ENABLE if (CLK_get_ms() > next_print) { next_print = CLK_get_ms() + 250; - //dpf("5v=%i 5vu=%i dlow=%i dhi=%i gca=%i gcd=%i\r\n",v_5v,v_5v_avg,v_5v_avg-V5_LOW,v_5v_avg-V5_HIGH,gcr_actual,gcr_desired); + dprintf("5v=%u 5vu=%u dlow=%u dhi=%u gca=%u gcd=%u\r\n",v_5v,v_5v_avg,v_5v_avg-V5_LOW,v_5v_avg-V5_HIGH,gcr_actual,gcr_desired); } #endif //VIRTSER_ENABLE } diff --git a/tmk_core/protocol/arm_atsam/usb/spfssf.c b/tmk_core/protocol/arm_atsam/usb/spfssf.c deleted file mode 100644 index 449a8bb7d..000000000 --- a/tmk_core/protocol/arm_atsam/usb/spfssf.c +++ /dev/null @@ -1,268 +0,0 @@ -#include "samd51j18a.h" -#include "stdarg.h" -#include "spfssf.h" -#include "usb_util.h" - -int vspf(char *_Dest, const char *_Format, va_list va) -{ - //va_list va; //Variable argument list variable - char *d = _Dest; //Pointer to dest - - //va_start(va,_Format); //Initialize the variable argument list - while (*_Format) //While not end of format string - { - if (*_Format == SPF_SPEC_START) //If current format string character is the specifier start character - { - _Format++; //Skip over the character - while (*_Format && *_Format <= 64) _Format++; //Forward past any options - if (*_Format == SPF_SPEC_START) *d++ = *_Format; //If the character is the specifier start character, output the character and advance dest - else if (*_Format == SPF_SPEC_LONG) //If the character is the long type - { - _Format++; //Skip over the character - if (*_Format == SPF_SPEC_DECIMAL) //If the character is the decimal type - { - int64_t buf = va_arg(va,int64_t); //Get the next value from the va list - //if (buf < 0) { *d++ = '-'; buf = -buf; } //If the given number is negative, add a negative sign to the dest and invert number - //spf_uint2str_32_3t(&d,buf,32); //Perform the conversion - d += UTIL_ltoa_radix(buf, d, 10); - } - else if (*_Format == SPF_SPEC_UNSIGNED) //If the character is the unsigned type - { - uint64_t num = va_arg(va,uint64_t); //Get the next value from the va list - //spf_uint2str_32_3t(&d,num,32); //Perform the conversion - d += UTIL_ltoa_radix(num, d, 10); - } - else if (*_Format == SPF_SPEC_UHINT || *_Format == SPF_SPEC_UHINT_UP) //If the character is the unsigned type - { - uint64_t buf = va_arg(va,uint64_t); //Get the next value from the va list - //spf_uint2hex_32(&d,(unsigned long) buf); - d += UTIL_ltoa_radix(buf, d, 16); - } - else //If the character was not a known type - { - *d++ = SPF_SPEC_START; //Output the start specifier - *d++ = SPF_SPEC_LONG; //Output the long type - *d++ = *_Format; //Output the unknown type - } - } - else if (*_Format == SPF_SPEC_DECIMAL) //If the character is the decimal type - { - int buf = va_arg(va,int); //Get the next value from the va list - //if (buf < 0) { *d++ = '-'; buf = -buf; } //If the given number is negative, add a negative sign to the dest and invert number - //spf_uint2str_32_3t(&d,buf,16); //Perform the conversion - d += UTIL_itoa(buf, d); - } - else if (*_Format == SPF_SPEC_INT) //If the character is the integer type - { - int buf = va_arg(va,int); //Get the next value from the va list - //if (buf < 0) { *d++ = '-'; buf = -buf; } //If the given number is negative, add a negative sign to the dest and inverted number - //spf_uint2str_32_3t(&d,buf,16); //Perform the conversion - d += UTIL_itoa(buf, d); - } - else if (*_Format == SPF_SPEC_UINT) //If the character is the unsigned integer type - { - int buf = va_arg(va,int); //Get the next value from the va list - //spf_uint2str_32_3t(&d,buf,16); //Perform the conversion - d += UTIL_utoa(buf, d); - } - else if (*_Format == SPF_SPEC_STRING) //If the character is the string type - { - char *buf = va_arg(va,char*); //Get the next value from the va list - while (*buf) *d++ = *buf++; //Perform the conversion (simply output characters and adcance pointers) - } - else if (*_Format == SPF_SPEC_UHINT || *_Format == SPF_SPEC_UHINT_UP) //If the character is the short type - { - int buf = va_arg(va,unsigned int); //Get the next value from the va list - //spf_uint2hex_32(&d,(unsigned long) buf); //Perform the conversion - d += UTIL_utoa(buf, d); - } - else //If the character type is unknown - { - *d++ = SPF_SPEC_START; //Output the start specifier - *d++ = *_Format; //Output the unknown type - } - } - else *d++ = *_Format; //If the character is unknown, output it to dest and advance dest - _Format++; //Advance the format buffer pointer to next character - } - //va_end(va); //End the variable argument list - - *d = '\0'; //Cap off the destination string with a zero - - return d - _Dest; //Return the length of the destintion buffer -} - -int spf(char *_Dest, const char *_Format, ...) -{ - va_list va; //Variable argument list variable - int result; - - va_start(va,_Format); //Initialize the variable argument list - result = vspf(_Dest, _Format, va); - va_end(va); - return result; -} - -//sscanf string to number (integer types) -int64_t ssf_ston(const char **_Src, uint32_t count, uint32_t *conv_count) -{ - int64_t value = 0; //Return value accumulator - uint32_t counter=count; //Counter to keep track of numbers converted - const char* p; //Pointer to first non space character - - while (*(*_Src) == SSF_SKIP_SPACE) (*_Src)++; //Forward through the whitespace to next non whitespace - - p = (*_Src); //Set pointer to first non space character - if (*p == '+' || *p == '-') (*_Src)++; //Skip over sign if any - while (*(*_Src) >= ASCII_NUM_START && - *(*_Src) <= ASCII_NUM_END && - counter) //While the source character is a digit and counter is not zero - { - value *= 10; //Multiply result by 10 to make room for next 1's place number - value += *(*_Src)++ - ASCII_NUM_START; //Add source number to value - counter--; //Decrement counter - } - if (counter - count == 0) return 0; //If no number conversion were performed, return 0 - if (*p == '-') value = -value; //If the number given was negative, make the result negative - - if (conv_count) (*conv_count)++; //Increment the converted count - return value; //Return the value -} - -uint64_t ssf_hton(const char **_Src, uint32_t count,uint32_t *conv_count) -{ - int64_t value=0; //Return value accumulator - uint32_t counter=count; //Counter to keep track of numbers converted - //const char* p; //Pointer to first non space character - char c; - - while (*(*_Src) == SSF_SKIP_SPACE) (*_Src)++; //Forward through the whitespace to next non whitespace - - //p = (*_Src); //Set pointer to first non space character - - while (counter) - { - c = *(*_Src)++; - if (c >= 'a' && c <= 'f') c -= ('a'-'A'); //toupper - if (c < '0' || (c > '9' && c < 'A') || c > 'F') break; - value *= 16; //Multiply result by 10 to make room for next 1's place number - c = c - '0'; - if (c > 9) c -= 7; - value += c; //Add source number to value - counter--; //Decrement counter - } - - if (counter - count == 0) return 0; //If no number conversion were performed, return 0 - //if (*p == '-') value = -value; //If the number given was negative, make the result negative - - if (conv_count) (*conv_count)++; //Increment the converted count - return value; -} - -//sscanf -int ssf(const char *_Src, const char *_Format, ...) -{ - va_list va; //Variable argument list variable - unsigned char looking_for=0; //Static char specified in format to be found in source - uint32_t conv_count=0; //Count of conversions made - - va_start(va,_Format); //Initialize the variable argument list - while (*_Format) //While the format string has not been fully read - { - if (looking_for != 0) //If we are looking for a matching character in the source string - { - while (*_Src != looking_for && *_Src) _Src++; //While the character is not found in the source string and not the end of the source - // string, increment the pointer position - if (*_Src == looking_for) _Src++; //If the character was found, step over it - else break; //Else the end was reached and the scan is now invalid (Could not find static character) - looking_for = 0; //Clear the looking for character - } - if (*_Format == SSF_SPEC_START) //If the current format character is the specifier start character - { - _Format++; //Step over the specifier start character - if (*_Format == SSF_SPEC_DECIMAL) //If the decimal specifier type is found - { - int *value=va_arg(va,int*); //User given destination address - //*value = (int)ssf_ston(&_Src,5,&conv_count); //Run conversion - *value = (int)ssf_ston(&_Src,10,&conv_count); //Run conversion - } - else if (*_Format == SSF_SPEC_LONG) //If the long specifier type is found - { - _Format++; //Skip over the specifier type - if (*_Format == SSF_SPEC_DECIMAL) //If the decimal specifier type is found - { - int64_t *value=va_arg(va,int64_t*); //User given destination address - //*value = (int64_t)ssf_ston(&_Src,10,&conv_count); //Run conversion - *value = (int64_t)ssf_ston(&_Src,19,&conv_count); //Run conversion - } - else if (*_Format == SSF_SPEC_UHINT) //If the decimal specifier type is found - { - uint64_t *value=va_arg(va,uint64_t *); //User given destination address - //*value = (uint64_t int)ssf_hton(&_Src,12,&conv_count); //Run conversion - *value = (uint64_t)ssf_hton(&_Src,16,&conv_count); //Run conversion - } - } - else if (*_Format == SSF_SPEC_SHORTINT) //If the short int specifier type is found - { - _Format++; //Skip over the specifier type - if (*_Format == SSF_SPEC_SHORTINT) //If the short int specifier type is found - { - _Format++; //Skip over the specifier type - if (*_Format == SSF_SPEC_DECIMAL) //If the decimal specifier type is found - { - unsigned char *value=va_arg(va,unsigned char*); //User given destination address - //*value = (unsigned char)ssf_ston(&_Src,3,&conv_count); //Run conversion - *value = (unsigned char)ssf_ston(&_Src,5,&conv_count); //Run conversion - } - } - } - else if (*_Format == SSF_SPEC_STRING) //If the specifier type is string - { - char *value=va_arg(va,char*); //User given destination address, max chars read pointer - while (*_Src == SSF_SKIP_SPACE) _Src++; //Forward through the whitespace to next non whitespace - while (*_Src != SSF_SKIP_SPACE && *_Src) *value++ = *_Src++; //While any character but space and not end of string and not end location, copy char to dest - *value = 0; //Cap off the string pointer with zero - conv_count++; //Increment the converted count - } - else if (*_Format == SSF_SPEC_VERSION) //If the specifier type is string - { - char *value=va_arg(va,char*); //User given destination address, max chars read pointer - while (*_Src == SSF_SKIP_SPACE) _Src++; //Forward through the whitespace to next non whitespace - while (*_Src != SSF_DELIM_COMMA && *_Src) *value++ = *_Src++; //While any character but space and not end of string and not end location, copy char to dest - *value = 0; //Cap off the string pointer with zero - conv_count++; //Increment the converted count - } - else if (*_Format >= ASCII_NUM_START && *_Format <= ASCII_NUM_END) - { - uint32_t len = (uint32_t)ssf_ston(&_Format,3,NULL); //Convert the given length - if (*_Format == SSF_SPEC_STRING) //If the specifier type is string - { - char *value=va_arg(va,char*),*e; //User given destination address, max chars read pointer - while (*_Src == SSF_SKIP_SPACE) _Src++; //Forward through the whitespace to next non whitespace - e = (char*)_Src+len; //Set a maximum length pointer location - while (*_Src != SSF_SKIP_SPACE && *_Src && _Src != e) *value++ = *_Src++; //While any character but space and not end of string and not end location, copy char to dest - *value = 0; //Cap off the string pointer with zero - conv_count++; //Increment the converted count - } - else if (*_Format == SSF_SPEC_VERSION) //If the specifier type is string - { - char *value=va_arg(va,char*),*e; //User given destination address, max chars read pointer - while (*_Src == SSF_SKIP_SPACE) _Src++; //Forward through the whitespace to next non whitespace - e = (char*)_Src+len; //Set a maximum length pointer location - while (*_Src != SSF_DELIM_COMMA && *_Src && _Src != e) *value++ = *_Src++; //While any character but space and not end of string and not end location, copy char to dest - *value = 0; //Cap off the string pointer with zero - conv_count++; //Increment the converted count - } - } - else if (*_Format == SSF_SPEC_START) looking_for = *_Format; //If another start specifier character is found, output a specifier character - else break; //Scan is now invalid (Uknown type specified) - } - else if (*_Format == SSF_SKIP_SPACE) { } //If a space is found, ignore it - else looking_for = *_Format; //If any other character is found, it is static and should be found in src as well - _Format++; //Skip over current format character - } - - va_end(va); //End the variable argument list - return conv_count; //Return the number of conversions made -} - diff --git a/tmk_core/protocol/arm_atsam/usb/spfssf.h b/tmk_core/protocol/arm_atsam/usb/spfssf.h deleted file mode 100644 index 337a904df..000000000 --- a/tmk_core/protocol/arm_atsam/usb/spfssf.h +++ /dev/null @@ -1,57 +0,0 @@ -#ifndef ____spfssf_h -#define ____spfssf_h - -#include - -#define sprintf spf -#define sscanf ssf - -#define SIZEOF_OFFSET 1 - -#ifndef NULL -#define NULL 0 -#endif - -#define SPF_NONE 0 - -#define SPF_SPEC_START 37 //% -#define SPF_SPEC_DECIMAL 100 //d 16bit dec signed (-32767 to 32767) DONE same as i -#define SPF_SPEC_INT 105 //i 16bit dec signed (-32767 to 32767) DONE same as d -#define SPF_SPEC_UINT 117 //u 16bit dec unsigned (0 to 65535) DONE -#define SPF_SPEC_STRING 115 //s variable length (abcd...) DONE -#define SPF_SPEC_UHINT 120 //x 16bit hex lwrc (7fa) DONE -#define SPF_SPEC_UHINT_UP 88 //x 16bit hex lwrc (7fa) DONE -#define SPF_SPEC_LONG 108 //l start of either ld or lu DONE -#define SPF_SPEC_DECIMAL 100 //ld 32bit dec signed (-2147483647 to 2147483647) DONE -#define SPF_SPEC_UNSIGNED 117 //lu 32bit dec unsigned (0 to 4294967295) DONE -#define SPF_SPEC_UHINT 120 //lx 32bit hex unsigned (0 to ffffffff) DONE - -#define SSF_SPEC_START 37 //% -#define SSF_SPEC_SHORTINT 104 //h 8bit dec signed (-127 to 127) DONE -#define SSF_LEN_SHORTINT 3 //hhd -#define SSF_SPEC_DECIMAL 100 //d 16bit dec signed (-32767 to 32767) DONE -#define SSF_LEN_DECIMAL 5 //32767 -#define SSF_SPEC_INT 105 //i 16bit dec signed (-32767 to 32767) DONE -#define SSF_LEN_INT 5 //32767 -#define SSF_SPEC_LONG 108 //l start of either ld or lu DONE -#define SSF_SPEC_DECIMAL 100 //ld 32bit dec signed (-2147483647 to 2147483647) DONE -#define SSF_SPEC_UHINT 120 //lx 32bit hex unsigned DONE -#define SSF_LEN_LDECIMAL 10 //2147483647 -#define SSF_SPEC_STRING 115 //s variable length (abcd...) DONE -#define SSF_SKIP_SPACE 32 //space - -#define SSF_SPEC_VERSION 118 //v collect to comma delimiter - special -#define SSF_DELIM_COMMA 44 //, - -#define ASCII_NUM_START 48 //0 -#define ASCII_NUM_END 58 //9 - -#define T_UINT32_0_LIMIT 14 -#define T_UINT32_1_LIMIT 27 - -int vspf(char *_Dest, const char *_Format, va_list va); -int spf(char *_Dest, const char *_Format, ...); -int ssf(const char *_Src, const char *_Format, ...); - -#endif //____spfssf_h - diff --git a/tmk_core/protocol/arm_atsam/usb/udi_cdc.c b/tmk_core/protocol/arm_atsam/usb/udi_cdc.c index b4159d325..15f0f760c 100644 --- a/tmk_core/protocol/arm_atsam/usb/udi_cdc.c +++ b/tmk_core/protocol/arm_atsam/usb/udi_cdc.c @@ -54,7 +54,6 @@ #include #include "udi_cdc_conf.h" #include "udi_device_conf.h" -#include "spfssf.h" #include "stdarg.h" #include "tmk_core/protocol/arm_atsam/clks.h" @@ -1259,7 +1258,6 @@ uint32_t CDC_print(char *printbuf) return 1; } - char printbuf[CDC_PRINTBUF_SIZE]; int dpf(const char *_Format, ...) @@ -1267,8 +1265,8 @@ int dpf(const char *_Format, ...) va_list va; //Variable argument list variable int result; - va_start(va,_Format); //Initialize the variable argument list - result = vspf(printbuf, _Format, va); + va_start(va, _Format); //Initialize the variable argument list + result = vsnprintf(printbuf, CDC_PRINTBUF_SIZE, _Format, va); va_end(va); CDC_print(printbuf); @@ -1377,8 +1375,6 @@ void CDC_init(void) printbuf[0]=0; } -char printbuf[CDC_PRINTBUF_SIZE]; - #endif //CDC line 62 //@} diff --git a/tmk_core/protocol/arm_atsam/usb/udi_cdc.h b/tmk_core/protocol/arm_atsam/usb/udi_cdc.h index 6b70e96d0..e134cf236 100644 --- a/tmk_core/protocol/arm_atsam/usb/udi_cdc.h +++ b/tmk_core/protocol/arm_atsam/usb/udi_cdc.h @@ -57,8 +57,8 @@ #include "udi.h" // Check the number of port -#ifndef UDI_CDC_PORT_NB -# define UDI_CDC_PORT_NB 1 +#ifndef UDI_CDC_PORT_NB +# define UDI_CDC_PORT_NB 1 #endif #if (UDI_CDC_PORT_NB > 1) # error UDI_CDC_PORT_NB must be at most 1 @@ -86,9 +86,6 @@ extern UDC_DESC_STORAGE udi_api_t udi_api_cdc_data; //! CDC data endpoints size for FS speed (8B, 16B, 32B, 64B) #define UDI_CDC_DATA_EPS_FS_SIZE CDC_RX_SIZE -#define CDC_PRINT_BUF_SIZE 256 -extern char printbuf[CDC_PRINT_BUF_SIZE]; - //@} /** @@ -371,9 +368,6 @@ uint32_t CDC_print(char *printbuf); uint32_t CDC_input(void); void CDC_init(void); -#define __xprintf dpf -int dpf(const char *_Format, ...); - #ifdef __cplusplus } #endif diff --git a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c index 18f69350c..1a6f7905e 100644 --- a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c +++ b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c @@ -45,6 +45,7 @@ */ #include "samd51j18a.h" +#include "d51_util.h" #include "conf_usb.h" #include "usb_protocol.h" #include "udd.h" @@ -86,7 +87,7 @@ bool udi_hid_kbd_b_report_valid; COMPILER_WORD_ALIGNED uint8_t udi_hid_kbd_report[UDI_HID_KBD_REPORT_SIZE]; -static bool udi_hid_kbd_b_report_trans_ongoing; +volatile bool udi_hid_kbd_b_report_trans_ongoing; COMPILER_WORD_ALIGNED static uint8_t udi_hid_kbd_report_trans[UDI_HID_KBD_REPORT_SIZE]; @@ -186,8 +187,7 @@ bool udi_hid_kbd_send_report(void) return false; } - memcpy(udi_hid_kbd_report_trans, udi_hid_kbd_report, - UDI_HID_KBD_REPORT_SIZE); + memcpy(udi_hid_kbd_report_trans, udi_hid_kbd_report, UDI_HID_KBD_REPORT_SIZE); udi_hid_kbd_b_report_valid = false; udi_hid_kbd_b_report_trans_ongoing = udd_ep_run(UDI_HID_KBD_EP_IN | USB_EP_DIR_IN, @@ -249,7 +249,7 @@ bool udi_hid_nkro_b_report_valid; COMPILER_WORD_ALIGNED uint8_t udi_hid_nkro_report[UDI_HID_NKRO_REPORT_SIZE]; -static bool udi_hid_nkro_b_report_trans_ongoing; +volatile bool udi_hid_nkro_b_report_trans_ongoing; COMPILER_WORD_ALIGNED static uint8_t udi_hid_nkro_report_trans[UDI_HID_NKRO_REPORT_SIZE]; @@ -355,7 +355,7 @@ bool udi_hid_nkro_send_report(void) return false; } - memcpy(udi_hid_nkro_report_trans, udi_hid_nkro_report,UDI_HID_NKRO_REPORT_SIZE); + memcpy(udi_hid_nkro_report_trans, udi_hid_nkro_report, UDI_HID_NKRO_REPORT_SIZE); udi_hid_nkro_b_report_valid = false; udi_hid_nkro_b_report_trans_ongoing = udd_ep_run(UDI_HID_NKRO_EP_IN | USB_EP_DIR_IN, diff --git a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h index 9a2741534..babfdb7a7 100644 --- a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h +++ b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h @@ -60,6 +60,7 @@ extern "C" { #ifdef KBD extern UDC_DESC_STORAGE udi_api_t udi_api_hid_kbd; extern bool udi_hid_kbd_b_report_valid; +extern volatile bool udi_hid_kbd_b_report_trans_ongoing; extern uint8_t udi_hid_kbd_report_set; bool udi_hid_kbd_send_report(void); #endif //KBD @@ -70,6 +71,7 @@ bool udi_hid_kbd_send_report(void); #ifdef NKRO extern UDC_DESC_STORAGE udi_api_t udi_api_hid_nkro; extern bool udi_hid_nkro_b_report_valid; +extern volatile bool udi_hid_nkro_b_report_trans_ongoing; bool udi_hid_nkro_send_report(void); #endif //NKRO From ab83aedfabd7f11d914466d008ab5938b3e0107f Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 28 Sep 2018 19:22:31 -0700 Subject: [PATCH 177/788] Second attempt to reduce the size of the USB BLE Converter (#4010) * Disable Leader to reduce firmware size for Travis * Additionaly fixes to USB_USB\BLE Keyboard converter * Disable One Shots to get USB to USB BLE converter to fit --- keyboards/converter/usb_usb/ble/config.h | 2 + keyboards/converter/usb_usb/ble/rules.mk | 2 +- keyboards/converter/usb_usb/keymap.c | 288 ----------------------- 3 files changed, 3 insertions(+), 289 deletions(-) delete mode 100644 keyboards/converter/usb_usb/keymap.c diff --git a/keyboards/converter/usb_usb/ble/config.h b/keyboards/converter/usb_usb/ble/config.h index 5333e17c8..3bf3b2963 100644 --- a/keyboards/converter/usb_usb/ble/config.h +++ b/keyboards/converter/usb_usb/ble/config.h @@ -11,3 +11,5 @@ #define NO_ACTION_MACRO #define NO_ACTION_FUNCTION +#define NO_ACTION_ONESHOT + diff --git a/keyboards/converter/usb_usb/ble/rules.mk b/keyboards/converter/usb_usb/ble/rules.mk index 84aa767f5..f5ab3880b 100644 --- a/keyboards/converter/usb_usb/ble/rules.mk +++ b/keyboards/converter/usb_usb/ble/rules.mk @@ -4,7 +4,7 @@ F_CPU = 8000000 BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) MOUSEKEY_ENABLE = no # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +EXTRAKEY_ENABLE = no # Audio control and System control(+450) CONSOLE_ENABLE = no # Console for debug(+400) COMMAND_ENABLE = no # Commands for debug and configuration # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/converter/usb_usb/keymap.c b/keyboards/converter/usb_usb/keymap.c deleted file mode 100644 index 16f2a2809..000000000 --- a/keyboards/converter/usb_usb/keymap.c +++ /dev/null @@ -1,288 +0,0 @@ -/* -Copyright 2017 Balz Guenat - -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 . -*/ - -#include "keymap_common.h" - - -const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { - /* 0: plain Qwerty without layer switching - * ,---------------. ,---------------. ,---------------. - * |F13|F14|F15|F16| |F17|F18|F19|F20| |F21|F22|F23|F24| - * ,---. |---------------| |---------------| |---------------| ,-----------. ,---------------. ,-------. - * |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| |VDn|VUp|Mut|Pwr| | Help | - * `---' `---------------' `---------------' `---------------' `-----------' `---------------' `-------' - * ,-----------------------------------------------------------. ,-----------. ,---------------. ,-------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|JPY|Bsp| |Ins|Hom|PgU| |NmL| /| *| -| |Stp|Agn| - * |-----------------------------------------------------------| |-----------| |---------------| |-------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | |Del|End|PgD| | 7| 8| 9| +| |Mnu|Und| - * |-----------------------------------------------------------| `-----------' |---------------| |-------| - * |CapsL | A| S| D| F| G| H| J| K| L| ;| :| #|Retn| | 4| 5| 6|KP,| |Sel|Cpy| - * |-----------------------------------------------------------| ,---. |---------------| |-------| - * |Shft| <| Z| X| C| V| B| N| M| ,| ,| /| RO|Shift | |Up | | 1| 2| 3|KP=| |Exe|Pst| - * |-----------------------------------------------------------| ,-----------. |---------------| |-------| - * |Ctl|Gui|Alt|MHEN|HNJ| Space |H/E|HENK|KANA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0 | .|Ent| |Fnd|Cut| - * `-----------------------------------------------------------' `-----------' `---------------' `-------' - */ - // KEYMAP_ALL( - // F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, - // ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, VOLD,VOLU,MUTE,PWR, HELP, - // GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, JYEN,BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, STOP,AGIN, - // TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, BSLS, DEL, END, PGDN, P7, P8, P9, PPLS, MENU,UNDO, - // CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT, NUHS,ENT, P4, P5, P6, PCMM, SLCT,COPY, - // LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RO, RSFT, UP, P1, P2, P3, PEQL, EXEC,PSTE, - // LCTL,LGUI,LALT,MHEN,HANJ, SPC, HAEN,HENK,KANA,RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT, FIND,CUT - // ), - KEYMAP_ALL( - F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, VOLD,VOLU,MUTE,PWR, HELP, - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, JYEN,BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, STOP,AGIN, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, BSLS, DEL, END, PGDN, P7, P8, P9, PPLS, MENU,UNDO, - FN0, A, S, D, F, G, H, J, K, L, SCLN,QUOT, NUHS,ENT, P4, P5, P6, PCMM, SLCT,COPY, - LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RO, RSFT, UP, P1, P2, P3, PEQL, EXEC,PSTE, - LCTL,LGUI,LALT,MHEN,HANJ, SPC, HAEN,HENK,KANA,RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT, FIND,CUT - ), - KEYMAP_ALL( - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, - TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, TRNS, - GRV, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS, - CAPS,MPRV,VOLU,MNXT,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS, - TRNS,MUTE,VOLD,MPLY,TRNS,TRNS,LEFT,DOWN,UP, RGHT,TRNS,TRNS, TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS, - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS, - TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, TRNS, TRNS,TRNS, TRNS,TRNS - ), -}; - -// const action_t fn_actions[] PROGMEM = {}; - -const action_t PROGMEM fn_actions[] = { - [0] = ACTION_LAYER_MOMENTARY(1), -}; - - - -/* - * Keymap samples - */ -#if 0 - /* ANSI layout - * ,---. ,---------------. ,---------------. ,---------------. ,-----------. - * |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| - * `---' `---------------' `---------------' `---------------' `-----------' - * ,-----------------------------------------------------------. ,-----------. ,---------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| Bsp| |Ins|Hom|PgU| |NmL| /| *| -| - * |-----------------------------------------------------------| |-----------| |---------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | |Del|End|PgD| | 7| 8| 9| +| - * |-----------------------------------------------------------| `-----------' |-----------| | - * |CapsL | A| S| D| F| G| H| J| K| L| ;| '| Return| | 4| 5| 6| | - * |-----------------------------------------------------------| ,---. |---------------| - * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shift | |Up | | 1| 2| 3| | - * |-----------------------------------------------------------| ,-----------. |-----------| | - * |Ctl|Gui|Alt| Space |Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0| .|Ent| - * `-----------------------------------------------------------' `-----------' `---------------' - */ - KEYMAP( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, DEL, END, PGDN, P7, P8, P9, - LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, P4, P5, P6, PPLS, - LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT, UP, P1, P2, P3, - LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT - ), - - /* ISO layout - * ,---. ,---------------. ,---------------. ,---------------. ,-----------. - * |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| - * `---' `---------------' `---------------' `---------------' `-----------' - * ,-----------------------------------------------------------. ,-----------. ,---------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| ^| Bsp| |Ins|Hom|PgU| |NmL| /| *| -| - * |-----------------------------------------------------------| |-----------| |---------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| Retn| |Del|End|PgD| | 7| 8| 9| +| - * |------------------------------------------------------` | `-----------' |-----------| | - * |CapsL | A| S| D| F| G| H| J| K| L| ;| '| #| | | 4| 5| 6| | - * |-----------------------------------------------------------| ,---. |---------------| - * |Shft|\ | Z| X| C| V| B| N| M| ,| ,| /|Shift | |Up | | 1| 2| 3|Ent| - * |-----------------------------------------------------------| ,-----------. |-----------| | - * |Ctl|Gui|Alt| Space |HNK|KNA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0| .| | - * `-----------------------------------------------------------' `-----------' `---------------' - */ - KEYMAP_ISO( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,ENT, DEL, END, PGDN, P7, P8, P9, PPLS, - LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT,NUHS, P4, P5, P6, - LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT, UP, P1, P2, P3, PENT, - LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT - ), - - /* JIS layout - * ,---. ,---------------. ,---------------. ,---------------. ,-----------. - * |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| - * `---' `---------------' `---------------' `---------------' `-----------' - * ,-----------------------------------------------------------. ,-----------. ,---------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| ^|JPY|Bsp| |Ins|Hom|PgU| |NmL| /| *| -| - * |-----------------------------------------------------------| |-----------| |---------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| @| [| Retn| |Del|End|PgD| | 7| 8| 9| +| - * |------------------------------------------------------` | `-----------' |-----------| | - * |CapsL | A| S| D| F| G| H| J| K| L| ;| :| ]| | | 4| 5| 6| | - * |-----------------------------------------------------------| ,---. |---------------| - * |Shft | Z| X| C| V| B| N| M| ,| ,| /| RO|Shift | |Up | | 1| 2| 3|Ent| - * |-----------------------------------------------------------| ,-----------. |-----------| | - * |Ctl|Gui|Alt|MHEN| Space |HENK|KNA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0| .| | - * `-----------------------------------------------------------' `-----------' `---------------' - */ - KEYMAP_JIS( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, JPY, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, ENT, DEL, END, PGDN, P7, P8, P9, PPLS, - LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT,NUHS, P4, P5, P6, - LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RO, RSFT, UP, P1, P2, P3, PENT, - LCTL,LGUI,LALT,MHEN, SPC, HENK,KANA,RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT - ), - - /* Colemak http://colemak.com - * ,-----------------------------------------------------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backspa| - * |-----------------------------------------------------------| - * |Tab | Q| W| F| P| G| J| L| U| Y| ;| [| ]| \| - * |-----------------------------------------------------------| - * |BackSp| A| R| S| T| D| H| N| E| I| O| '|Return | - * |-----------------------------------------------------------| - * |Shift | Z| X| C| V| B| K| M| ,| ,| /|Shift | - * |-----------------------------------------------------------| - * |Ctrl |Gui |Alt | Space |Alt |Gui |Menu|Ctrl| - * `----------------------------------------------------------' - */ - KEYMAP_ALL( - F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, VOLD,VOLU,MUTE,PWR, HELP, - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, JYEN,BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, STOP,AGIN, - TAB, Q, W, F, P, G, J, L, U, Y, SCLN,LBRC,RBRC, BSLS, DEL, END, PGDN, P7, P8, P9, PPLS, MENU,UNDO, - BSPC,A, R, S, T, D, H, N, E, I, O, QUOT, NUHS,ENT, P4, P5, P6, PCMM, SLCT,COPY, - LSFT,NUBS,Z, X, C, V, B, K, M, COMM,DOT, SLSH, RO, RSFT, UP, P1, P2, P3, PEQL, EXEC,PSTE, - LCTL,LGUI,LALT,MHEN,HANJ, SPC, HAEN,HENK,KANA,RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT, FIND,CUT - ), - - /* Dvorak http://en.wikipedia.org/wiki/Dvorak_Simplified_Keyboard - * ,-----------------------------------------------------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| [| ]|Backspa| - * |-----------------------------------------------------------| - * |Tab | '| ,| .| P| Y| F| G| C| R| L| /| =| \| - * |-----------------------------------------------------------| - * |BackSp| A| O| E| U| I| D| H| T| N| S| -|Return | - * |-----------------------------------------------------------| - * |Shift | ;| Q| J| K| X| B| M| Wl V| Z|Shift | - * |-----------------------------------------------------------| - * |Ctrl |Gui |Alt | Space |Alt |Gui |Menu|Ctrl| - * `-----------------------------------------------------------' - */ - KEYMAP_ALL( - F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, VOLD,VOLU,MUTE,PWR, HELP, - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, LBRC,RBRC,JYEN,BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, STOP,AGIN, - TAB, QUOT,COMM,DOT, P, Y, F, G, C, R, L, SLSH,EQL, BSLS, DEL, END, PGDN, P7, P8, P9, PPLS, MENU,UNDO, - CAPS,A, O, E, U, I, D, H, T, N, S, MINS, NUHS,ENT, P4, P5, P6, PCMM, SLCT,COPY, - LSFT,NUBS,SCLN,Q, J, K, X, B, M, W, V, Z, RO, RSFT, UP, P1, P2, P3, PEQL, EXEC,PSTE, - LCTL,LGUI,LALT,MHEN,HANJ, SPC, HAEN,HENK,KANA,RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT, FIND,CUT - ), - - /* Workman http://viralintrospection.wordpress.com/2010/09/06/a-different-philosophy-in-designing-keyboard-layouts/ - * ,-----------------------------------------------------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backspa| - * |-----------------------------------------------------------| - * |Tab | Q| D| R| W| B| J| F| U| P| ;| [| ]| \| - * |-----------------------------------------------------------| - * |CapsLo| A| S| H| T| G| Y| N| E| O| I| '|Return | - * |-----------------------------------------------------------| - * |Shift | Z| X| M| C| V| K| L| ,| ,| /|Shift | - * |-----------------------------------------------------------| - * |Ctrl |Gui |Alt | Space |Alt |Gui |Menu|Ctrl| - * `-----------------------------------------------------------' - */ - KEYMAP_ALL( - F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, VOLD,VOLU,MUTE,PWR, HELP, - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, JYEN,BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, STOP,AGIN, - TAB, Q, D, R, W, B, J, F, U, P, SCLN,LBRC,RBRC, BSLS, DEL, END, PGDN, P7, P8, P9, PPLS, MENU,UNDO, - CAPS,A, S, H, T, G, Y, N, E, O, I, QUOT, NUHS,ENT, P4, P5, P6, PCMM, SLCT,COPY, - LSFT,NUBS,Z, X, M, C, V, K, L, COMM,DOT, SLSH, RO, RSFT, UP, P1, P2, P3, PEQL, EXEC,PSTE, - LCTL,LGUI,LALT,MHEN,HANJ, SPC, HAEN,HENK,KANA,RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT, FIND,CUT - ), - - -/* - * SpaceFN layout - * http://geekhack.org/index.php?topic=51069.0 - */ -const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* 0: plain Qwerty - * ,---------------. ,---------------. ,---------------. - * |F13|F14|F15|F16| |F17|F18|F19|F20| |F21|F22|F23|F24| - * ,---. |---------------| |---------------| |---------------| ,-----------. ,---------------. ,-------. - * |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| |VDn|VUp|Mut|Pwr| | Help | - * `---' `---------------' `---------------' `---------------' `-----------' `---------------' `-------' - * ,-----------------------------------------------------------. ,-----------. ,---------------. ,-------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|JPY|Bsp| |Ins|Hom|PgU| |NmL| /| *| -| |Stp|Agn| - * |-----------------------------------------------------------| |-----------| |---------------| |-------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | |Del|End|PgD| | 7| 8| 9| +| |Mnu|Und| - * |-----------------------------------------------------------| `-----------' |---------------| |-------| - * |LCtrl | A| S| D| F| G| H| J| K| L| ;| :| #|Retn| | 4| 5| 6|KP,| |Sel|Cpy| - * |-----------------------------------------------------------| ,---. |---------------| |-------| - * |Shft| <| Z| X| C| V| B| N| M| ,| ,| /| RO|Shift | |Up | | 1| 2| 3|KP=| |Exe|Pst| - * |-----------------------------------------------------------| ,-----------. |---------------| |-------| - * |Ctl|Gui|Alt|MHEN|HNJ| Space |H/E|HENK|KANA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0 | .|Ent| |Fnd|Cut| - * `-----------------------------------------------------------' `-----------' `---------------' `-------' - */ - [0] = KEYMAP_ALL( - F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, VOLD,VOLU,MUTE,PWR, HELP, - ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, JYEN,BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, STOP,AGIN, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, BSLS, DEL, END, PGDN, P7, P8, P9, PPLS, MENU,UNDO, - LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT, NUHS,ENT, P4, P5, P6, PCMM, SLCT,COPY, - LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RO, RSFT, UP, P1, P2, P3, PEQL, EXEC,PSTE, - LCTL,LGUI,LALT,MHEN,HANJ, FN0, HAEN,HENK,KANA,RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT, FIND,CUT - ), - - /* 1: SpaceFN - * ,-----------------------------------------------------------. - * |` | F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delete | - * |-----------------------------------------------------------| - * |Caps | | |Esc| | | |Hom|Up |End|Psc|Slk|Pau|Ins | - * |-----------------------------------------------------------| - * | | | | | | |PgU|Lef|Dow|Rig| | | | - * |-----------------------------------------------------------| - * | | | | | |Spc|PgD|` |~ | |Men| | - * |-----------------------------------------------------------| - * | | | | | | | | | - * `-----------------------------------------------------------' - */ - [1] = KEYMAP_ALL( - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, - TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, TRNS, - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS,DEL, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS, - CAPS,TRNS,TRNS,ESC, TRNS,TRNS,TRNS,HOME,UP, END, PSCR,SLCK,PAUS, INS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS, - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PGUP,LEFT,DOWN,RGHT,TRNS,TRNS, TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS, - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,SPC, PGDN,GRV, FN1, TRNS,APP, TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS, - TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, TRNS, TRNS,TRNS, TRNS,TRNS - ), -}; - -const action_t PROGMEM fn_actions[] = { - [0] = ACTION_LAYER_TAP_KEY(1, KC_SPACE), - [1] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), // tilde -}; - -#endif From 3d767e4aab5a6c87cb334a22ffaa9b6ad8e76393 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 28 Sep 2018 10:37:50 -0700 Subject: [PATCH 178/788] Disable Moueskeys to reduce Vitamins Included firmware size --- keyboards/vitamins_included/config.h | 2 +- keyboards/vitamins_included/rules.mk | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/vitamins_included/config.h b/keyboards/vitamins_included/config.h index abbb31056..bcaf777c7 100644 --- a/keyboards/vitamins_included/config.h +++ b/keyboards/vitamins_included/config.h @@ -23,5 +23,5 @@ along with this program. If not, see . #define NO_ACTION_MACRO #define NO_ACTION_FUNCTION -#define DISABLE_LEADER + diff --git a/keyboards/vitamins_included/rules.mk b/keyboards/vitamins_included/rules.mk index 8ac39dffb..4f6d497a6 100644 --- a/keyboards/vitamins_included/rules.mk +++ b/keyboards/vitamins_included/rules.mk @@ -53,7 +53,7 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT # the appropriate keymap folder that will get included automatically # BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) CONSOLE_ENABLE = no # Console for debug(+400) COMMAND_ENABLE = no # Commands for debug and configuration From 20a10bd0846d502069203419f57e36fd7467df5e Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 28 Sep 2018 19:23:13 -0700 Subject: [PATCH 179/788] Size fix for Hadron, take 2 (#4009) * Add Link Time Optimization to reduce firmware size * Disable Mousekeys on Hadron to save room --- keyboards/hadron/keymaps/default/rules.mk | 2 +- keyboards/hadron/rules.mk | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/keyboards/hadron/keymaps/default/rules.mk b/keyboards/hadron/keymaps/default/rules.mk index 4d08544f3..545ffa75c 100644 --- a/keyboards/hadron/keymaps/default/rules.mk +++ b/keyboards/hadron/keymaps/default/rules.mk @@ -5,7 +5,7 @@ # the appropriate keymap folder that will get included automatically # BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) EXTRAKEY_ENABLE = no # Audio control and System control(+450) CONSOLE_ENABLE = no # Console for debug(+400) COMMAND_ENABLE = no # Commands for debug and configuration diff --git a/keyboards/hadron/rules.mk b/keyboards/hadron/rules.mk index 1f835e066..2a8b78045 100644 --- a/keyboards/hadron/rules.mk +++ b/keyboards/hadron/rules.mk @@ -71,3 +71,5 @@ SRC = i2c.c \ ssd1306.c DEFAULT_FOLDER = hadron/ver2 + +EXTRAFLAGS += -flto From daf0cc60bff54be948c923cdc40aa80b82a27f6d Mon Sep 17 00:00:00 2001 From: patrickmt <40182064+patrickmt@users.noreply.github.com> Date: Fri, 28 Sep 2018 22:34:56 -0400 Subject: [PATCH 180/788] CTRL keyboard bootloader_jump support Adds support for CTRL keyboards to enter bootloader via bootloader_jump() --- .../1.0.70/gcc/gcc/samd51j18a_flash.ld | 3 ++ tmk_core/common/arm_atsam/bootloader.c | 32 ++++++++++--------- tmk_core/protocol/arm_atsam/md_bootloader.h | 7 ++++ tmk_core/protocol/arm_atsam/startup.c | 11 +++++++ 4 files changed, 38 insertions(+), 15 deletions(-) diff --git a/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/gcc/gcc/samd51j18a_flash.ld b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/gcc/gcc/samd51j18a_flash.ld index 35db61971..1c6354786 100644 --- a/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/gcc/gcc/samd51j18a_flash.ld +++ b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/gcc/gcc/samd51j18a_flash.ld @@ -51,6 +51,9 @@ HEAP_SIZE = DEFINED(HEAP_SIZE) ? HEAP_SIZE : DEFINED(__heap_size__) ? __heap_siz _srom = ORIGIN(rom); _lrom = LENGTH(rom); _erom = ORIGIN(rom) + LENGTH(rom); +_sram = ORIGIN(ram); +_lram = LENGTH(ram); +_eram = ORIGIN(ram) + LENGTH(ram); /* Section Definitions */ SECTIONS diff --git a/tmk_core/common/arm_atsam/bootloader.c b/tmk_core/common/arm_atsam/bootloader.c index 9701a6219..ba71bfeb0 100644 --- a/tmk_core/common/arm_atsam/bootloader.c +++ b/tmk_core/common/arm_atsam/bootloader.c @@ -16,25 +16,27 @@ #include "bootloader.h" #include "samd51j18a.h" +#include "md_bootloader.h" //Set watchdog timer to reset. Directs the bootloader to stay in programming mode. -void bootloader_jump(void) -{ - //Keyboards released with certain bootloader can not enter bootloader from app until workaround is created - uint8_t ver_no_jump[] = "v2.18Jun 22 2018 17:28:08"; - uint8_t *ver_check = ver_no_jump; - uint8_t *boot_check = (uint8_t *)0x21A0; - while (*ver_check && *boot_check == *ver_check) - { - ver_check++; - boot_check++; +void bootloader_jump(void) { +#ifdef KEYBOARD_massdrop_ctrl + //CTRL keyboards released with bootloader version below must use RAM method. Otherwise use WDT method. + uint8_t ver_ram_method[] = "v2.18Jun 22 2018 17:28:08"; //The version to match (NULL terminated by compiler) + uint8_t *ver_check = ver_ram_method; //Pointer to version match string for traversal + uint8_t *ver_rom = (uint8_t *)0x21A0; //Pointer to address in ROM where this specific bootloader version would exist + + while (*ver_check && *ver_rom == *ver_check) { //While there are check version characters to match and bootloader's version matches check's version + ver_check++; //Move check version pointer to next character + ver_rom++; //Move ROM version pointer to next character } - if (!*ver_check) - { - //Version match - //Software workaround would go here - return; //No software restart method implemented... must use hardware reset button + + if (!*ver_check) { //If check version pointer is NULL, all characters have matched + *MAGIC_ADDR = BOOTLOADER_MAGIC; //Set magic number into RAM + NVIC_SystemReset(); //Perform system reset + while (1) {} //Won't get here } +#endif WDT->CTRLA.bit.ENABLE = 0; while (WDT->SYNCBUSY.bit.ENABLE) {} diff --git a/tmk_core/protocol/arm_atsam/md_bootloader.h b/tmk_core/protocol/arm_atsam/md_bootloader.h index 1316876c8..956145c31 100644 --- a/tmk_core/protocol/arm_atsam/md_bootloader.h +++ b/tmk_core/protocol/arm_atsam/md_bootloader.h @@ -7,6 +7,13 @@ extern uint32_t _erom; #define BOOTLOADER_SERIAL_MAX_SIZE 20 //DO NOT MODIFY! +#ifdef KEYBOARD_massdrop_ctrl +//WARNING: These are only for CTRL bootloader release "v2.18Jun 22 2018 17:28:08" for bootloader_jump support +extern uint32_t _eram; +#define BOOTLOADER_MAGIC 0x3B9ACA00 +#define MAGIC_ADDR (uint32_t *)(&_eram - 4) +#endif + #ifdef MD_BOOTLOADER #define MCU_HZ 48000000 diff --git a/tmk_core/protocol/arm_atsam/startup.c b/tmk_core/protocol/arm_atsam/startup.c index a62d02f1c..f29fac179 100644 --- a/tmk_core/protocol/arm_atsam/startup.c +++ b/tmk_core/protocol/arm_atsam/startup.c @@ -28,6 +28,7 @@ */ #include "samd51.h" +#include "md_bootloader.h" /* Initialize segments */ extern uint32_t _sfixed; @@ -500,6 +501,16 @@ const DeviceVectors exception_table = { */ void Reset_Handler(void) { +#ifdef KEYBOARD_massdrop_ctrl + /* WARNING: This is only for CTRL bootloader release "v2.18Jun 22 2018 17:28:08" for bootloader_jump support */ + if (*MAGIC_ADDR == BOOTLOADER_MAGIC) { + /* At this point, the bootloader's memory is initialized properly, so undo the jump to here, then jump back */ + *MAGIC_ADDR = 0x00000000; /* Change value to prevent potential bootloader entrance loop */ + __set_MSP(0x20008818); /* MSP according to bootloader */ + SCB->VTOR = 0x00000000; /* Vector table back to bootloader's */ + asm("bx %0"::"r"(0x00001267)); /* Jump past bootloader RCAUSE check using THUMB */ + } +#endif uint32_t *pSrc, *pDest; /* Initialize the relocate segment */ From 9f8bbe2f3f30c39f1ed44a6a2de63f39b405391f Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Sat, 29 Sep 2018 08:47:16 -0700 Subject: [PATCH 181/788] Keyboard: converter/hp_46010a: Configurator support (#4017) --- keyboards/converter/hp_46010a/info.json | 115 ++++++++++++++++++++++++ 1 file changed, 115 insertions(+) diff --git a/keyboards/converter/hp_46010a/info.json b/keyboards/converter/hp_46010a/info.json index de68a1228..91dcf97ec 100644 --- a/keyboards/converter/hp_46010a/info.json +++ b/keyboards/converter/hp_46010a/info.json @@ -3,4 +3,119 @@ "keyboard_folder": "converter/HP_46010A", "url": "https://deskthority.net/wiki/HP_46010A", "maintainer": "listofoptions", + "width": 22, + "height": 7, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"Reset", "x":0, "y":0}, + {"label":"Stop", "x":1, "y":0}, + {"label":"F1", "x":2.5, "y":0, "w":1.25}, + {"label":"F2", "x":3.75, "y":0, "w":1.25}, + {"label":"F3", "x":5, "y":0, "w":1.25}, + {"label":"F4", "x":6.25, "y":0, "w":1.25}, + {"label":"Menu", "x":7.5, "y":0}, + {"label":"User", "x":8.5, "y":0}, + {"label":"F5", "x":9.5, "y":0, "w":1.25}, + {"label":"F6", "x":10.75, "y":0, "w":1.25}, + {"label":"F7", "x":12, "y":0, "w":1.25}, + {"label":"F8", "x":13.25, "y":0, "w":1.25}, + {"label":"Clear line", "x":15, "y":0}, + {"label":"Clear display", "x":16, "y":0}, + {"x":18, "y":0}, + {"x":19, "y":0}, + {"x":20, "y":0}, + {"x":21, "y":0}, + {"label":"`", "x":0, "y":2, "w":1.25}, + {"label":"1", "x":1.25, "y":2}, + {"label":"2", "x":2.25, "y":2}, + {"label":"3", "x":3.25, "y":2}, + {"label":"4", "x":4.25, "y":2}, + {"label":"5", "x":5.25, "y":2}, + {"label":"6", "x":6.25, "y":2}, + {"label":"7", "x":7.25, "y":2}, + {"label":"8", "x":8.25, "y":2}, + {"label":"9", "x":9.25, "y":2}, + {"label":"0", "x":10.25, "y":2}, + {"label":"-", "x":11.25, "y":2}, + {"label":"=", "x":12.25, "y":2}, + {"label":"Backspace", "x":13.25, "y":2, "w":1.5}, + {"label":"Insert line", "x":15, "y":2}, + {"label":"Delete line", "x":16, "y":2}, + {"label":"*", "x":18, "y":2}, + {"label":"/", "x":19, "y":2}, + {"label":"+", "x":20, "y":2}, + {"label":"-", "x":21, "y":2}, + {"label":"Tab", "x":0, "y":3, "w":1.75}, + {"label":"Q", "x":1.75, "y":3}, + {"label":"W", "x":2.75, "y":3}, + {"label":"E", "x":3.75, "y":3}, + {"label":"R", "x":4.75, "y":3}, + {"label":"T", "x":5.75, "y":3}, + {"label":"Y", "x":6.75, "y":3}, + {"label":"U", "x":7.75, "y":3}, + {"label":"I", "x":8.75, "y":3}, + {"label":"O", "x":9.75, "y":3}, + {"label":"P", "x":10.75, "y":3}, + {"label":"[", "x":11.75, "y":3}, + {"label":"]", "x":12.75, "y":3}, + {"label":"\\", "x":13.75, "y":3}, + {"label":"Insert char", "x":15, "y":3}, + {"label":"Delete char", "x":16, "y":3}, + {"label":"7", "x":18, "y":3}, + {"label":"8", "x":19, "y":3}, + {"label":"9", "x":20, "y":3}, + {"label":"Enter", "x":21, "y":3}, + {"label":"Caps Lock", "x":0, "y":4}, + {"label":"Ctrl", "x":1, "y":4}, + {"label":"A", "x":2, "y":4}, + {"label":"S", "x":3, "y":4}, + {"label":"D", "x":4, "y":4}, + {"label":"F", "x":5, "y":4}, + {"label":"G", "x":6, "y":4}, + {"label":"H", "x":7, "y":4}, + {"label":"J", "x":8, "y":4}, + {"label":"K", "x":9, "y":4}, + {"label":"L", "x":10, "y":4}, + {"label":";", "x":11, "y":4}, + {"label":"'", "x":12, "y":4}, + {"label":"Return", "x":13, "y":4, "w":1.75}, + {"label":"Cursor", "x":15, "y":4}, + {"label":"Prev", "x":16, "y":4}, + {"label":"4", "x":18, "y":4}, + {"label":"5", "x":19, "y":4}, + {"label":"6", "x":20, "y":4}, + {"label":",", "x":21, "y":4}, + {"label":"Del", "x":0, "y":5}, + {"label":"Shift", "x":1.25, "y":5, "w":1.25}, + {"label":"Z", "x":2.5, "y":5}, + {"label":"X", "x":3.5, "y":5}, + {"label":"C", "x":4.5, "y":5}, + {"label":"V", "x":5.5, "y":5}, + {"label":"B", "x":6.5, "y":5}, + {"label":"N", "x":7.5, "y":5}, + {"label":"M", "x":8.5, "y":5}, + {"label":",", "x":9.5, "y":5}, + {"label":".", "x":10.5, "y":5}, + {"label":"/", "x":11.5, "y":5}, + {"label":"Shift", "x":12.5, "y":5, "w":1.25}, + {"label":"Select", "x":14, "y":5}, + {"label":"Up", "x":15, "y":5}, + {"label":"Next", "x":16, "y":5}, + {"label":"1", "x":18, "y":5}, + {"label":"2", "x":19, "y":5}, + {"label":"3", "x":20, "y":5}, + {"label":"Tab", "x":21, "y":5, "h":2}, + {"label":"Win", "x":0, "y":6}, + {"label":"Extend Char", "x":2.5, "y":6}, + {"x":3.5, "y":6, "w":8}, + {"label":"Extend Char", "x":11.5, "y":6}, + {"label":"Left", "x":14, "y":6}, + {"label":"Down", "x":15, "y":6}, + {"label":"Right", "x":16, "y":6}, + {"label":"0", "x":18, "y":6, "w":2}, + {"label":".", "x":20, "y":6} + ] + } + } } From 1da2f8d5467e5a9b9300437d2afc86d2c1f63370 Mon Sep 17 00:00:00 2001 From: Shaleen Jain Date: Sat, 29 Sep 2018 21:19:51 +0530 Subject: [PATCH 182/788] Keymap: tada68: add shalzz's layout (#4019) --- keyboards/tada68/keymaps/shalzz/config.h | 4 ++ keyboards/tada68/keymaps/shalzz/keymap.c | 53 +++++++++++++++++++++++ keyboards/tada68/keymaps/shalzz/readme.md | 43 ++++++++++++++++++ keyboards/tada68/keymaps/shalzz/rules.mk | 12 +++++ 4 files changed, 112 insertions(+) create mode 100644 keyboards/tada68/keymaps/shalzz/config.h create mode 100644 keyboards/tada68/keymaps/shalzz/keymap.c create mode 100644 keyboards/tada68/keymaps/shalzz/readme.md create mode 100644 keyboards/tada68/keymaps/shalzz/rules.mk diff --git a/keyboards/tada68/keymaps/shalzz/config.h b/keyboards/tada68/keymaps/shalzz/config.h new file mode 100644 index 000000000..3214a33fb --- /dev/null +++ b/keyboards/tada68/keymaps/shalzz/config.h @@ -0,0 +1,4 @@ +#pragma once + +#define DISABLE_SPACE_CADET_ROLLOVER +#define GRAVE_ESC_ALT_OVERRIDE diff --git a/keyboards/tada68/keymaps/shalzz/keymap.c b/keyboards/tada68/keymaps/shalzz/keymap.c new file mode 100644 index 000000000..e2b4c170e --- /dev/null +++ b/keyboards/tada68/keymaps/shalzz/keymap.c @@ -0,0 +1,53 @@ +#include QMK_KEYBOARD_H + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _BL 0 +#define _FL 1 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Keymap _BL: (Base Layer) Default Layer + * ,----------------------------------------------------------------. + * |Esc | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp |~ ` | + * |----------------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ |Del | + * |----------------------------------------------------------------| + * |CAPS | A| S| D| F| G| H| J| K| L| ;| '|Return |PgUp| + * |----------------------------------------------------------------| + * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | Up|PgDn| + * |----------------------------------------------------------------| + * |Ctrl|Win |Alt | Space |FN |Alt|Ctrl|Lef|Dow|Rig | + * `----------------------------------------------------------------' + * + * Note: Shift + Esc = ~ + * Win + Esc = ` + */ +[_BL] = LAYOUT_ansi( + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,KC_GRV, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,KC_BSLS,KC_DEL, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_ENT,KC_PGUP, \ + KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSPC,KC_UP,KC_PGDN, \ + KC_LCTL, KC_LGUI,KC_LALT, LT(_BL, KC_SPC), MO(_FL),KC_RALT,KC_RCTRL, KC_LEFT,KC_DOWN,KC_RGHT), + + /* Keymap _FL: Function Layer + * ,----------------------------------------------------------------. + * | | F1|F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12|Del |PRSC| + * |----------------------------------------------------------------| + * | | |Up | | | | | | | | | | | |Ins | + * |----------------------------------------------------------------| + * | |<- |Dn | ->| | |<- |Dn |Up | ->| | | |Hme | + * |----------------------------------------------------------------| + * | ( | | |Bl-|BL |BL+| | |VU-|VU+|MUT| ) | |End | + * |----------------------------------------------------------------| + * | | | | | | | | | | | + * `----------------------------------------------------------------' + */ +[_FL] = LAYOUT_ansi( + _______, KC_F1 ,KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_PSCR, \ + _______,_______, KC_UP,_______,_______, _______,_______,_______,_______,_______,_______,_______,_______, _______,KC_INS, \ + _______,KC_LEFT,KC_DOWN,KC_RIGHT,_______,_______,KC_LEFT,KC_DOWN,KC_UP,KC_RGHT,_______,_______, _______,KC_HOME, \ + KC_LPRN,_______,_______,BL_DEC, BL_TOGG,BL_INC, _______,_______,KC_VOLD,KC_VOLU,KC_MUTE,KC_RPRN, _______, KC_END, \ + _______,_______,_______, _______, _______,_______,_______,_______,_______, _______), +}; diff --git a/keyboards/tada68/keymaps/shalzz/readme.md b/keyboards/tada68/keymaps/shalzz/readme.md new file mode 100644 index 000000000..3e4cf6067 --- /dev/null +++ b/keyboards/tada68/keymaps/shalzz/readme.md @@ -0,0 +1,43 @@ +# Shalzz's Unix layout + +This layout is based on the Unix Layout with a few changes. + +``` + Base Layer +,----------------------------------------------------------------. +|Esc | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp |~ ` | +|----------------------------------------------------------------| +|Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ |Del | +|----------------------------------------------------------------| +|CAPS | A| S| D| F| G| H| J| K| L| ;| '|Return |PgUp| +|----------------------------------------------------------------| +|Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | Up|PgDn| +|----------------------------------------------------------------| +|Ctrl|Win |Alt | Space |Alt| FN|Ctrl|Lef|Dow|Rig | +`----------------------------------------------------------------' +Note: Shift + Esc = ~ + Win + Esc = ` + Fn + LShift = ( + Fn + RShift = ) + + Fn Layer +,----------------------------------------------------------------. +| | F1|F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12|Del |PRSC| +|----------------------------------------------------------------| +| | |Up | | | | | | | | | | | |Ins | +|----------------------------------------------------------------| +| |<- |Dn | ->| | |<- |Dn |Up | ->| | | |Hme | +|----------------------------------------------------------------| +| ( | | |Bl-|BL |BL+| | |VU-|VU+|MUT| ) | |End | +|----------------------------------------------------------------| +| | | | | | | | | | | +`----------------------------------------------------------------' + +``` + +The changes that were applied over the Unix layout: + +* Left and Right Shift when pressed alone emit `(` and `)` respectively. Hold shift for normal behaviour. +* Fn + Left and Right Shift also act as actual `(` and `)` keys respectively. +* Changed PrintSc to `Fn+`` +* Fixed Holding down space activating the function layer instead of the lower layer. diff --git a/keyboards/tada68/keymaps/shalzz/rules.mk b/keyboards/tada68/keymaps/shalzz/rules.mk new file mode 100644 index 000000000..1df3af955 --- /dev/null +++ b/keyboards/tada68/keymaps/shalzz/rules.mk @@ -0,0 +1,12 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +AUDIO_ENABLE = no # Audio output on port C6 +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend From 4f6495108087da13d7ee44c1f6ced03ebdfb934d Mon Sep 17 00:00:00 2001 From: marksard <38324387+marksard@users.noreply.github.com> Date: Sun, 30 Sep 2018 02:25:03 +0900 Subject: [PATCH 183/788] Keymap: Fixed a possible of buffer overflow. (#4016) Update inline funnction to static inline function. Fixed error of if enabe ADJUST_MACRO_ENABLE. --- .../helix/rev2/keymaps/five_rows_jis/keymap.c | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/keyboards/helix/rev2/keymaps/five_rows_jis/keymap.c b/keyboards/helix/rev2/keymaps/five_rows_jis/keymap.c index 141b22275..df00366e3 100644 --- a/keyboards/helix/rev2/keymaps/five_rows_jis/keymap.c +++ b/keyboards/helix/rev2/keymaps/five_rows_jis/keymap.c @@ -214,7 +214,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #endif #ifdef SSD1306OLED -char keylog[20] = {}; +char keylog[24] = {}; const char code_to_name[60] = { ' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', @@ -223,7 +223,7 @@ const char code_to_name[60] = { 'R', 'E', 'B', 'T', ' ', '-', ' ', '@', ' ', ' ', ' ', ';', ':', ' ', ',', '.', '/', ' ', ' ', ' '}; -inline void set_keylog(uint16_t keycode, keyrecord_t *record) +static inline void set_keylog(uint16_t keycode, keyrecord_t *record) { char name = ' '; uint8_t leds = host_keyboard_leds(); @@ -246,6 +246,12 @@ inline void set_keylog(uint16_t keycode, keyrecord_t *record) } #endif +#ifdef RGBLIGHT_ENABLE +#define RGBLIGHT(mode) rgblight_mode(mode) +#else +#define RGBLIGHT(mode) +#endif + // define variables for reactive RGB int RGB_current_mode; #ifdef ADJUST_MACRO_ENABLE @@ -263,12 +269,6 @@ void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) { #define ADJUST_MACRO(layer1, layer2, layer3) #endif -#ifdef RGBLIGHT_ENABLE -#define RGBLIGHT(mode) rgblight_mode(mode) -#else -#define RGBLIGHT(mode) -#endif - bool process_record_user(uint16_t keycode, keyrecord_t *record) { #ifdef SSD1306OLED if (record->event.pressed) { @@ -344,7 +344,7 @@ void matrix_scan_user(void) { iota_gfx_task(); // this is what updates the display continuously } -inline void matrix_update(struct CharacterMatrix *dest, +static inline void matrix_update(struct CharacterMatrix *dest, const struct CharacterMatrix *source) { if (memcmp(dest->display, source->display, sizeof(dest->display))) { memcpy(dest->display, source->display, sizeof(dest->display)); @@ -367,13 +367,15 @@ const char helix_logo[]={ 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4, 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4, 0}; -inline void render_logo(struct CharacterMatrix *matrix) { + +static inline void render_logo(struct CharacterMatrix *matrix) { matrix_write(matrix, helix_logo); } const char mac_win_logo[][2][3]={{{0x95,0x96,0},{0xb5,0xb6,0}},{{0x97,0x98,0},{0xb7,0xb8,0}}}; -inline void render_status(struct CharacterMatrix *matrix) { + +static inline void render_status(struct CharacterMatrix *matrix) { char buf[20]; // Render to mode icon From cd215209efb0e236b691b51c3397495d4449623b Mon Sep 17 00:00:00 2001 From: Takeshi ISHII <2170248+mtei@users.noreply.github.com> Date: Sun, 30 Sep 2018 02:40:54 +0900 Subject: [PATCH 184/788] Helix led_test keymap reduce size (#4023) * Helix: make rgblight modes selectable. No change in build result. * edit the comment of helix/rev2/keymaps/default/keymap.c * Helix led_test keymap: reduced the size. --- keyboards/helix/config.h | 13 +++++++++++++ keyboards/helix/rev2/keymaps/default/keymap.c | 2 +- keyboards/helix/rev2/keymaps/led_test/config.h | 16 +++++++++++++--- .../helix/rev2/keymaps/led_test/led_test_init.c | 4 ++-- 4 files changed, 29 insertions(+), 6 deletions(-) diff --git a/keyboards/helix/config.h b/keyboards/helix/config.h index fbfbd3280..b79093d87 100644 --- a/keyboards/helix/config.h +++ b/keyboards/helix/config.h @@ -48,4 +48,17 @@ along with this program. If not, see . #define DISABLE_LEADER #endif // USE_Link_Time_Optimization +#if defined(LED_ANIMATIONS) || defined(RGBLIGHT_ANIMATIONS) + #undef RGBLIGHT_ANIMATIONS + #define RGBLIGHT_EFFECT_BREATHING + #define RGBLIGHT_EFFECT_RAINBOW_MOOD + #define RGBLIGHT_EFFECT_RAINBOW_SWIRL + #define RGBLIGHT_EFFECT_SNAKE + #define RGBLIGHT_EFFECT_KNIGHT + #define RGBLIGHT_EFFECT_CHRISTMAS + #define RGBLIGHT_EFFECT_STATIC_GRADIENT + #define RGBLIGHT_EFFECT_RGB_TEST + #define RGBLIGHT_EFFECT_ALTERNATING +#endif + #endif /* CONFIG_H */ diff --git a/keyboards/helix/rev2/keymaps/default/keymap.c b/keyboards/helix/rev2/keymaps/default/keymap.c index dca9be9a4..087bd8e51 100644 --- a/keyboards/helix/rev2/keymaps/default/keymap.c +++ b/keyboards/helix/rev2/keymaps/default/keymap.c @@ -512,7 +512,7 @@ void music_scale_user(void) // hook point for 'led_test' keymap // 'default' keymap's led_test_init() is empty function, do nothing -// 'led_test' keymap's led_test_init() force rgblight_mode_noeeprom(35); +// 'led_test' keymap's led_test_init() force rgblight_mode_noeeprom(RGBLIGHT_MODE_RGB_TEST); __attribute__ ((weak)) void led_test_init(void) {} diff --git a/keyboards/helix/rev2/keymaps/led_test/config.h b/keyboards/helix/rev2/keymaps/led_test/config.h index 043825452..094195fc6 100644 --- a/keyboards/helix/rev2/keymaps/led_test/config.h +++ b/keyboards/helix/rev2/keymaps/led_test/config.h @@ -21,9 +21,19 @@ along with this program. If not, see . #ifndef CONFIG_USER_H #define CONFIG_USER_H -// if you need more program area, try uncomment follow line -#include "serial_config_simpleapi.h" - // place overrides here +// If you need more program area, try select and reduce rgblight modes to use. + +// Selection of RGBLIGHT MODE to use. +#undef RGBLIGHT_EFFECT_BREATHING +#undef RGBLIGHT_EFFECT_RAINBOW_MOOD +#undef RGBLIGHT_EFFECT_RAINBOW_SWIRL +#undef RGBLIGHT_EFFECT_SNAKE +#undef RGBLIGHT_EFFECT_KNIGHT +#undef RGBLIGHT_EFFECT_CHRISTMAS +#undef RGBLIGHT_EFFECT_STATIC_GRADIENT +//#undef RGBLIGHT_EFFECT_RGB_TEST // led_test keymap need only this. +#undef RGBLIGHT_EFFECT_ALTERNATING + #endif /* CONFIG_USER_H */ diff --git a/keyboards/helix/rev2/keymaps/led_test/led_test_init.c b/keyboards/helix/rev2/keymaps/led_test/led_test_init.c index 1d9cb4ebd..85f5d1aa7 100644 --- a/keyboards/helix/rev2/keymaps/led_test/led_test_init.c +++ b/keyboards/helix/rev2/keymaps/led_test/led_test_init.c @@ -5,7 +5,7 @@ void led_test_init(void) { static int scan_count = 0; if( scan_count == 2 ) { rgblight_enable_noeeprom(); - rgblight_mode_noeeprom(35); + rgblight_mode_noeeprom(RGBLIGHT_MODE_RGB_TEST); } if( scan_count < 3 ) scan_count ++; } @@ -15,6 +15,6 @@ void led_test_init(void) { // can use this? void startup_user(void) { rgblight_enable_noeeprom(); - rgblight_mode_noeeprom(35); + rgblight_mode_noeeprom(RGBLIGHT_MODE_RGB_TEST); } #endif From 68854f0735ecfa69e383c1f7c93211a6ad89e13b Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Sat, 29 Sep 2018 12:44:12 -0700 Subject: [PATCH 185/788] Keyboard: converter/hp_46010a: rename layout macro to LAYOUT (#4024) Messed up in my previous PR (#4017) by providing the wrong matrix name. Fixing by changing the matrix name instead, because there's only one at this point. Thought it made more sense this way. --- keyboards/converter/hp_46010a/hp_46010a.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/keyboards/converter/hp_46010a/hp_46010a.h b/keyboards/converter/hp_46010a/hp_46010a.h index db64ce24a..fd5adfc63 100644 --- a/keyboards/converter/hp_46010a/hp_46010a.h +++ b/keyboards/converter/hp_46010a/hp_46010a.h @@ -35,7 +35,7 @@ along with this program. If not, see . * `-----------------------------------------------------------------------------------' `-------------------' */ -#define LAYOUT_HP_46010A( \ +#define LAYOUT( \ KEY_RES, KEY_STOP, KEY_F1, KEY_F2, KEY_F3, KEY_F4,KEY_MENU,KEY_USER, KEY_F5, KEY_F6, KEY_F7, KEY_F8, KEY_CLRL, KEY_CLRD, KEY_B1, KEY_B2, KEY_B3, KEY_B4, \ KEY_GRAV, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_0, KEY_MINU, KEY_PLUS, KEY_BACK, KEY_INSL, KEY_DELL, KEY_MULT, KEY_DIV, KEY_ADD, KEY_SUBT, \ KEY_TAB, KEY_Q,KEY_W, KEY_E, KEY_R, KEY_T, KEY_Y, KEY_U, KEY_I, KEY_O, KEY_P, KEY_LBRA, KEY_RBRA, KEY_PIPE, KEY_INSC, KEY_DELC, KEY_P7, KEY_P8, KEY_P9, KEY_PADE, \ @@ -58,5 +58,3 @@ along with this program. If not, see . {KEY_B1, KEY_P0, KEY_B2, KC_NO, KEY_B3, KEY_PDOT, KEY_B4, KC_NO }, \ {KEY_B, KEY_V, KEY_C, KEY_X, KEY_Z, KEY_PRNT, KEY_DELE, KEY_N }, \ } - -#define LAYOUT LAYOUT_HP_46010A From 92d95ba1e1223538f8c16fe2d17a23fa0dd67725 Mon Sep 17 00:00:00 2001 From: izzy84075 Date: Sat, 29 Sep 2018 12:44:54 -0700 Subject: [PATCH 186/788] Keyboard: Add basic support for the YD68 / YD68v2 PCBs. (#4020) * Add basic support for the YD68 / YD68v2. Keymap and WS2812 underlighting work. Capslock LED should work, though I don't have one populated to test. Backlight LEDs are not set up, as they're not on a hardware PWM pin, could be set up as software. * Fix Imgur link * Fix default keymap to match the stock firmware * Fix the Hardware Supported line and add a short description --- keyboards/yd68/config.h | 224 +++++++++++++++++++++++ keyboards/yd68/info.json | 13 ++ keyboards/yd68/keymaps/default/config.h | 19 ++ keyboards/yd68/keymaps/default/keymap.c | 65 +++++++ keyboards/yd68/keymaps/default/readme.md | 1 + keyboards/yd68/readme.md | 15 ++ keyboards/yd68/rules.mk | 81 ++++++++ keyboards/yd68/yd68.c | 73 ++++++++ keyboards/yd68/yd68.h | 62 +++++++ 9 files changed, 553 insertions(+) create mode 100644 keyboards/yd68/config.h create mode 100644 keyboards/yd68/info.json create mode 100644 keyboards/yd68/keymaps/default/config.h create mode 100644 keyboards/yd68/keymaps/default/keymap.c create mode 100644 keyboards/yd68/keymaps/default/readme.md create mode 100644 keyboards/yd68/readme.md create mode 100644 keyboards/yd68/rules.mk create mode 100644 keyboards/yd68/yd68.c create mode 100644 keyboards/yd68/yd68.h diff --git a/keyboards/yd68/config.h b/keyboards/yd68/config.h new file mode 100644 index 000000000..1b4d7f7a1 --- /dev/null +++ b/keyboards/yd68/config.h @@ -0,0 +1,224 @@ +/* +Copyright 2018 Ryan "Izzy" Bales + +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 . +*/ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0002 +#define MANUFACTURER YANG +#define PRODUCT YD68v2 +#define DESCRIPTION 65% board with Bluetooth + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 15 + +/* + * 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 { B5, C6, C7, D7, B4 } +#define MATRIX_COL_PINS { B6, F7, F6, F5, F4, F1, F0, E6, B0, B7, D0, D1, D2, D3, D5 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_BREATHING +// #define BACKLIGHT_LEVELS 3 + +#define RGB_DI_PIN B3 +#ifdef RGB_DI_PIN +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 10 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 +#endif + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* 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 userful 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 + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * 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 + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +//#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ + diff --git a/keyboards/yd68/info.json b/keyboards/yd68/info.json new file mode 100644 index 000000000..b392f0386 --- /dev/null +++ b/keyboards/yd68/info.json @@ -0,0 +1,13 @@ +{ + "keyboard_name": "YD68", + "url": "", + "maintainer": "qmk", + "width": 16, + "height": 5, + "layouts": { + "LAYOUT_ansi": { + "key_count": 68, + "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"x":15, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"x":15, "y":1}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"x":15, "y":2}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"x":15, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4}, {"label":"Win", "x":11, "y":4}, {"x":12, "y":4}, {"x":13, "y":4}, {"x":14, "y":4}, {"x":15, "y":4}] + } + } +} \ No newline at end of file diff --git a/keyboards/yd68/keymaps/default/config.h b/keyboards/yd68/keymaps/default/config.h new file mode 100644 index 000000000..405f93550 --- /dev/null +++ b/keyboards/yd68/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 Ryan "Izzy" Bales + * + * 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 . + */ + +#pragma once + +// place overrides here diff --git a/keyboards/yd68/keymaps/default/keymap.c b/keyboards/yd68/keymaps/default/keymap.c new file mode 100644 index 000000000..290aa0d61 --- /dev/null +++ b/keyboards/yd68/keymaps/default/keymap.c @@ -0,0 +1,65 @@ +/* Copyright 2018 Ryan "Izzy" Bales + * + * 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 . + */ +#include QMK_KEYBOARD_H + +// Defines the keycodes used by our macros in process_record_user +enum custom_keycodes { + YD68_BT_PWR = SAFE_RANGE, + YD68_RGB_PWR, +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_ansi( /* Base */ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,KC_HOME, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,KC_BSLS,KC_END, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_ENT, KC_PGUP, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT,KC_UP, KC_PGDN, \ + KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI,KC_RCTRL,KC_LEFT,KC_DOWN,KC_RGHT \ + ), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case YD68_BT_PWR: + if (record->event.pressed) { + // when keycode YD68_BT_PWR is pressed + } else { + // when keycode YD68_BT_PWR is released + } + break; + case YD68_RGB_PWR: + if (record->event.pressed) { + // when keycode YD68_RGB_PWR is pressed + PORTE ^= (1<<2); + } else { + // when keycode YD68_RGB_PWR is released + } + break; + } + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/yd68/keymaps/default/readme.md b/keyboards/yd68/keymaps/default/readme.md new file mode 100644 index 000000000..877e64f18 --- /dev/null +++ b/keyboards/yd68/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for yd68 \ No newline at end of file diff --git a/keyboards/yd68/readme.md b/keyboards/yd68/readme.md new file mode 100644 index 000000000..7e5e83bcc --- /dev/null +++ b/keyboards/yd68/readme.md @@ -0,0 +1,15 @@ +# yd68 + +[yd68](https://imgur.com/gallery/Ygo668L) + +A 68-key board with RGB underlighting and bluetooth. + +Keyboard Maintainer: [Izzy84075](https://github.com/izzy84075) +Hardware Supported: YD68/YD68v2 +Hardware Availability: [KBDFans](https://kbdfans.cn/collections/diy-kit/products/yd68-65-bluetooth-custom-keyboard-pcb) + +Make example for this keyboard (after setting up your build environment): + + make yd68:default + +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). diff --git a/keyboards/yd68/rules.mk b/keyboards/yd68/rules.mk new file mode 100644 index 000000000..197402e8a --- /dev/null +++ b/keyboards/yd68/rules.mk @@ -0,0 +1,81 @@ +# MCU name +#MCU = at90usb1286 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = no # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) diff --git a/keyboards/yd68/yd68.c b/keyboards/yd68/yd68.c new file mode 100644 index 000000000..f34661dd3 --- /dev/null +++ b/keyboards/yd68/yd68.c @@ -0,0 +1,73 @@ +/* Copyright 2018 Ryan "Izzy" Bales + * + * 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 . + */ +#include "yd68.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + //Capslock LED Output Low + DDRD |= (1<<4); + PORTD &= ~(1<<4); + + //Backlight LEDs Output Low + DDRD |= (1<<6); + PORTD &= ~(1<<6); + + //RGB power output low + DDRE |= (1<<2); + PORTE &= ~(1<<2); + + //Bluetooth power output high + DDRB |= (1<<2); + PORTB |= (1<<2); + + //RGB data output low + DDRB |= (1<<3); + PORTB &= ~(1<<3); + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + + if (usb_led & (1<. + */ +#ifndef YD68_H +#define YD68_H + +#include "quantum.h" + +#define XXX KC_NO + +/* This a shortcut to help you visually see your layout. + * + * The first section contains all of the arguments representing the physical + * layout of the board and position of the keys. + * + * The second converts the arguments into a two-dimensional array which + * represents the switch matrix. + */ +/* YD68 ANSI layout + * ,----------------------------------------------------------------. + * | 00 |01| 02| 03| 04| 05| 06| 07| 08| 09| 0a| 0b| 0c| 0e | 48 | + * |----------------------------------------------------------------| + * | 10 | 11| 12| 13| 14| 15| 16| 17| 18| 19| 1a| 1b| 1c| 1d | 1e | + * |----------------------------------------------------------------| + * | 20 | 21| 22| 23| 24| 25| 26| 27| 28| 29| 2a| 2b| 2d | 2e | + * |----------------------------------------------------------------| + * | 30 | 32| 33| 34| 35| 36| 37| 38| 39| 3a| 3b| 3c | 3d| 3e | + * |----------------------------------------------------------------| + * | 40 | 41 | 42 | 46 | 49| 4a| 4b| 4c| 4d| 4e | + * `----------------------------------------------------------------' + */ +// The first section contains all of the arguments +// The second converts the arguments into a two-dimensional array + +#define LAYOUT_ansi( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0e, k48, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2d, k2e, \ + k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e, \ + k40, k41, k42, k46, k49, k4a, k4b, k4c, k4d, k4e \ +) \ +{ \ + {k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, XXX, k0e}, \ + {k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e}, \ + {k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, XXX, k2d, k2e}, \ + {k30, XXX, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e}, \ + {k40, k41, k42, XXX, XXX, XXX, k46, XXX, k48, k49, k4a, k4b, k4c, k4d, k4e} \ +} + +#endif From 170507896d4d7fe12e1fa2c31ab8589e4cbdf7ba Mon Sep 17 00:00:00 2001 From: Yan-Fa Li Date: Sat, 29 Sep 2018 16:16:21 -0700 Subject: [PATCH 187/788] Keyboard: Update info.json to match LAYOUT (#4027) * Update info.json to match LAYOUT * update mf68_ble info.json LAYOUT -> LAYOUT_68_ansi --- keyboards/mf68/info.json | 2 +- keyboards/mf68_ble/info.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/mf68/info.json b/keyboards/mf68/info.json index d41c2176a..fae15aaf5 100644 --- a/keyboards/mf68/info.json +++ b/keyboards/mf68/info.json @@ -5,7 +5,7 @@ "width": 17.25, "height": 5, "layouts": { - "LAYOUT": { + "LAYOUT_68_ansi": { "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"x":15.25, "y":0}, {"x":16.25, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"x":15.25, "y":1}, {"x":16.25, "y":1}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"x":15.25, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"x":14.25, "y":4}, {"x":15.25, "y":4}, {"x":16.25, "y":4}] } } diff --git a/keyboards/mf68_ble/info.json b/keyboards/mf68_ble/info.json index 1f8aaed92..4cd9b2c83 100644 --- a/keyboards/mf68_ble/info.json +++ b/keyboards/mf68_ble/info.json @@ -5,7 +5,7 @@ "width": 17.25, "height": 5, "layouts": { - "LAYOUT": { + "LAYOUT_68_ansi": { "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"x":15.25, "y":0}, {"x":16.25, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"x":15.25, "y":1}, {"x":16.25, "y":1}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"x":15.25, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"x":14.25, "y":4}, {"x":15.25, "y":4}, {"x":16.25, "y":4}] } } From 3875d6f5815bf263cb3ee5d18b74c5ec8ab865f2 Mon Sep 17 00:00:00 2001 From: Alexander Kagno Date: Sat, 29 Sep 2018 18:51:06 -0600 Subject: [PATCH 188/788] Keymap: Added Leader Key Functionality (#4025) * deleting arkag branch, forcibly moving changes over to master * fade_color function added, not tested * added half functions some stuff * surround_type function implemented and working. * added flashing function and removed fading, flashing supports infinite flashing along with controlled number flashes * added a fade state machine and functionality * build optimizations, changed fade to bounce between bounds rather than roll over, added a HALMAK layout * changes to sleep breath function, changed how I will switch to HALMAK * support for halmak added * support for activity detection added, condensed fading and flashing state machines, removed support for HALMAK and COLEMAK because arkag is stupid * changed sleep and inactive behaviors, now the color shifting reverses on state change, yay! save_color and reset_color are made to enable layer color changing to look cooler. * reformatted some if statements in state detection * changes to force fade to pause on boot, or plug in. * Attempting to move over to userspace, pushing to repository for help * userspace stuff.... * userspace stuff.... * layout changes, working userspace, Removed left side shift and replaced it with a MT() for LSFT and SPC. Userspace seems to be working properly now! HURRAY * Layout change Removed space/shift and reset modifiers to what they were originally. Added homerow modifiers. * Removed excessive tabs in files * Moved mods on homerow around... * changes recommended by @drashna * removed homerow mods, more flashy lighting! * changed delays for lighting. * velocikey code retro fit into userspace to match typing speed currently "working" but isn't as reactive as I want. * Readme and other documentation hidden throughout code * Added a pretty picture * pretty picture actually added * More readme updates * Velocikey now working inside my userspace! * Changed repo macro and fixed readme * Removed media layer, moved media control to LAZY layer * fixed more merge issues when I had to merge... * implemented some leader key stuff * removed merge garbage... * changes requested by @drashna, leader key switch from macros --- keyboards/mechmini/v2/keymaps/arkag/config.h | 2 +- keyboards/mechmini/v2/keymaps/arkag/keymap.c | 14 +- keyboards/mechmini/v2/keymaps/arkag/rules.mk | 1 + users/arkag/arkag.c | 261 ++++++++----------- users/arkag/config.h | 5 +- 5 files changed, 117 insertions(+), 166 deletions(-) diff --git a/keyboards/mechmini/v2/keymaps/arkag/config.h b/keyboards/mechmini/v2/keymaps/arkag/config.h index f5f3a90fa..e89adc097 100644 --- a/keyboards/mechmini/v2/keymaps/arkag/config.h +++ b/keyboards/mechmini/v2/keymaps/arkag/config.h @@ -3,5 +3,5 @@ // save me space! #define NO_ACTION_MACRO #define NO_ACTION_FUNCTION -#define DISABLE_LEADER +// #define DISABLE_LEADER #define NO_MUSIC_MODE diff --git a/keyboards/mechmini/v2/keymaps/arkag/keymap.c b/keyboards/mechmini/v2/keymaps/arkag/keymap.c index 7038f220c..29e125394 100644 --- a/keyboards/mechmini/v2/keymaps/arkag/keymap.c +++ b/keyboards/mechmini/v2/keymaps/arkag/keymap.c @@ -8,10 +8,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_QWERTY] = LAYOUT_2u_space_ortho( - KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_LEAD, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, QUOTE, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_UP, KC_ENT, - M_PMOD, LRALT, M_SMOD, LOWER, RAISE, KC_SPC, KC_SLSH, LAZY, KC_LEFT, KC_DOWN, KC_RGHT), + M_PMOD, LRALT, M_SMOD, LOWER, RAISE, KC_SPC, KC_SLSH, KC_BSLS, KC_LEFT, KC_DOWN, KC_RGHT), [_RAISE] = LAYOUT_2u_space_ortho( GRAVE, KC_1, KC_2, THREE, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, @@ -20,10 +20,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, KEEB, _______, _______, _______, M_OS, KC_PSLS, KC_PMNS, KC_PAST), [_LOWER] = LAYOUT_2u_space_ortho( - _______, _______, _______, _______, _______, _______, _______, M_ULIN, M_ITAL, _______, M_P_B, M_C_A_D, - _______, _______, STRIKE, _______, _______, _______, _______, _______, _______, _______, _______, _______, - KC_CAPS, KC_DEL, _______, _______, _______, M_BOLD, _______, _______, _______, _______, KC_PGUP, _______, - _______, _______, _______, _______, _______, _______, KC_BSLS, M_CALC, KC_HOME, KC_PGDN, KC_END), + KC_ESC, _______, _______, _______, _______, _______, _______, _______, _______, _______, M_P_B, M_C_A_D, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + KC_CAPS, KC_DEL, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_END), [_KEEB] = LAYOUT_2u_space_ortho( KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, @@ -35,5 +35,5 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, M_TM, _______, M_SNIPT, M_SHRUG, _______, _______, KC_MUTE, _______, _______, _______, _______, _______, M_GGT, _______, M_UF, M_LOD, M_REPO, _______, _______, _______, _______, _______, _______, _______, _______, _______, M_TF, M_LENNY, _______, KC_VOLU, KC_MPLY, - _______, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT), + _______, _______, _______, _______, _______, _______, M_CALC, _______, KC_MPRV, KC_VOLD, KC_MNXT), }; diff --git a/keyboards/mechmini/v2/keymaps/arkag/rules.mk b/keyboards/mechmini/v2/keymaps/arkag/rules.mk index d6c210e9e..c1d5afa1e 100644 --- a/keyboards/mechmini/v2/keymaps/arkag/rules.mk +++ b/keyboards/mechmini/v2/keymaps/arkag/rules.mk @@ -11,6 +11,7 @@ AUDIO_ENABLE = no RGBLIGHT_ENABLE = yes TAP_DANCE_ENABLE = yes UNICODE_ENABLE = yes +LEADER_ENABLE = yes # save me space! EXTRAFLAGS += -flto diff --git a/users/arkag/arkag.c b/users/arkag/arkag.c index a35e13ed6..212d06de6 100644 --- a/users/arkag/arkag.c +++ b/users/arkag/arkag.c @@ -370,10 +370,115 @@ void matrix_init_user(void) { set_os(current_os, false); } +LEADER_EXTERNS(); + void matrix_scan_user(void) { check_state(); flash_rgb(); fade_rgb(); + LEADER_DICTIONARY() { + leading = false; + leader_end(); + + // begin OS functions + SEQ_TWO_KEYS(KC_P, KC_B) { + if (current_os == OS_WIN) { + SEND_STRING(SS_DOWN(X_LGUI) SS_TAP(X_PAUSE) SS_UP(X_LGUI)); + } else { + } + } + SEQ_THREE_KEYS(KC_C, KC_A, KC_D) { + if (current_os == OS_WIN) { + SEND_STRING(SS_DOWN(X_LCTRL) SS_DOWN(X_LALT) SS_TAP(X_DELETE) SS_UP(X_LALT) SS_UP(X_LCTRL)); + } else { + } + } + SEQ_FOUR_KEYS(KC_C, KC_A, KC_L, KC_C) { + if (current_os == OS_WIN) { + SEND_STRING(SS_TAP(X_CALCULATOR)); + } else if (current_os == OS_MAC) { + SEND_STRING(SS_DOWN(X_LGUI) SS_TAP(X_SPACE) SS_UP(X_LGUI) "calculator" SS_TAP(X_ENTER)); + } + } + // end OS functions + + // begin format functions + SEQ_ONE_KEY(KC_B) { + surround_type(4, KC_8, true); + } + SEQ_ONE_KEY(KC_I) { + surround_type(2, KC_8, true); + } + SEQ_ONE_KEY(KC_U) { + surround_type(4, KC_MINS, true); + } + SEQ_ONE_KEY(KC_S) { + surround_type(4, KC_GRAVE, true); + } + SEQ_TWO_KEYS(KC_S, KC_S) { + if (current_os == OS_MAC) { + long_keystroke(3, (uint16_t[]){KC_LGUI, KC_LSFT, KC_4}); + } else if (current_os == OS_WIN) { + long_keystroke(3, (uint16_t[]){KC_LGUI, KC_LSFT, KC_S}); + } else { + return; + } + } + SEQ_ONE_KEY(KC_C) { + surround_type(2, KC_GRAVE, false); + } + SEQ_TWO_KEYS(KC_C, KC_C) { + surround_type(6, KC_GRAVE, false); + } + // end format functions + + // start fancy functions + SEQ_THREE_KEYS(KC_C, KC_C, KC_C) { + surround_type(6, KC_GRAVE, false); + pri_mod(true); + tap_key(KC_V); + pri_mod(false); + tap_key(KC_RGHT); + tap_key(KC_RGHT); + tap_key(KC_RGHT); + tap_key(KC_ENTER); + } + // end fancy functions + + // start typing functions + SEQ_TWO_KEYS(KC_T, KC_M) { + // ™ + send_unicode_hex_string("2122"); + } + SEQ_THREE_KEYS(KC_G, KC_G, KC_T) { + SEND_STRING("@GrahamGoldenTech.com"); + } + SEQ_THREE_KEYS(KC_L, KC_O, KC_D) { + // ಠ__ಠ + send_unicode_hex_string("0CA0 005F 005F 0CA0"); + } + SEQ_FOUR_KEYS(KC_R, KC_E, KC_P, KC_O) { + SEND_STRING("https://github.com/qmk/qmk_firmware/tree/master/users/arkag"); + } + SEQ_FOUR_KEYS(KC_F, KC_L, KC_I, KC_P) { + // (╯‵Д′)╯彡┻━┻ + send_unicode_hex_string("0028 256F 2035 0414 2032 0029 256F 5F61 253B 2501 253B"); + } + SEQ_FIVE_KEYS(KC_U, KC_F, KC_L, KC_I, KC_P) { + // ┬─┬ノ( º _ º ノ) + send_unicode_hex_string("252C 2500 252C 30CE 0028 0020 00BA 0020 005F 0020 00BA 0020 30CE 0029"); + } + SEQ_FIVE_KEYS(KC_L, KC_E, KC_N, KC_N, KC_Y) { + // ( ͡° ͜ʖ ͡°) + send_unicode_hex_string("0028 0020 0361 00B0 0020 035C 0296 0020 0361 00B0 0029"); + } + SEQ_FIVE_KEYS(KC_S, KC_H, KC_R, KC_U, KC_G) { + // ¯\_(ツ)_/¯ + send_unicode_hex_string("00AF 005C 005F 0028 30C4 0029 005F 002F 00AF"); + } + // end typing functions + + } } bool process_record_user(uint16_t keycode, keyrecord_t *record) { @@ -394,138 +499,12 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } return false; - case M_P_B: - if (record->event.pressed) { - if (current_os == OS_WIN) { - SEND_STRING(SS_DOWN(X_LGUI) SS_TAP(X_PAUSE) SS_UP(X_LGUI)); - } else { - } - } - return false; - - case M_C_A_D: - if (record->event.pressed) { - if (current_os == OS_WIN) { - SEND_STRING(SS_DOWN(X_LCTRL) SS_DOWN(X_LALT) SS_TAP(X_DELETE) SS_UP(X_LALT) SS_UP(X_LCTRL)); - } else { - } - } - return false; - - case M_CALC: - if (record->event.pressed) { - if (current_os == OS_WIN) { - SEND_STRING(SS_TAP(X_CALCULATOR)); - } else if (current_os == OS_MAC) { - SEND_STRING(SS_DOWN(X_LGUI) SS_TAP(X_SPACE) SS_UP(X_LGUI) "calculator" SS_TAP(X_ENTER)); - } - } - return false; - case M_OS: if (record->event.pressed) { set_os((current_os+1) % _OS_COUNT, true); } return false; - case M_LOD: - if (record->event.pressed) { - send_unicode_hex_string("0CA0 005F 005F 0CA0"); - } - return false; - - case M_LENNY: - if (record->event.pressed) { - send_unicode_hex_string("0028 0020 0361 00B0 0020 035C 0296 0020 0361 00B0 0029"); - } - return false; - - - case M_TF: - if (record->event.pressed) { - send_unicode_hex_string("0028 256F 2035 0414 2032 0029 256F 5F61 253B 2501 253B"); - } - return false; - - case M_UF: - if (record->event.pressed) { - send_unicode_hex_string("252C 2500 252C 30CE 0028 0020 00BA 0020 005F 0020 00BA 0020 30CE 0029"); - } - return false; - - case M_SHRUG: - if (record->event.pressed) { - send_unicode_hex_string("00AF 005C 005F 0028 30C4 0029 005F 002F 00AF"); - } - return false; - - case M_TM: - if (record->event.pressed) { - send_unicode_hex_string("2122"); - } - return false; - - case M_REPO: - if (record->event.pressed) { - SEND_STRING("https://github.com/qmk/qmk_firmware/tree/master/users/arkag"); - } - return false; - - case M_GGT: - if (record->event.pressed) { - SEND_STRING("@GrahamGoldenTech.com"); - } - return false; - - case M_SNIPT: - if (record->event.pressed) { - surround_type(6, KC_GRAVE, false); - pri_mod(true); - tap_key(KC_V); - pri_mod(false); - tap_key(KC_RGHT); - tap_key(KC_RGHT); - tap_key(KC_RGHT); - tap_key(KC_ENTER); - } - return false; - - case M_BOLD: - if (record->event.pressed) { - surround_type(4, KC_8, true); - } - return false; - - case M_ITAL: - if (record->event.pressed) { - surround_type(2, KC_8, true); - } - return false; - - case M_ULIN: - if (record->event.pressed) { - surround_type(4, KC_MINS, true); - } - return false; - - case KC_LSFT: - if (record->event.pressed) { - save_color(underglow); - underglow = mod_color(underglow, true, 75); - SEND_STRING(SS_DOWN(X_LSHIFT)); - } else { - reset_color(); - SEND_STRING(SS_UP(X_LSHIFT)); - } - return false; - - case MEDIA: - case LAZY: - case KEEB: - case RAISE: - case LOWER: - return true; - default: if (record->event.pressed) { state = active; @@ -535,36 +514,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } } -uint32_t layer_state_set_user(uint32_t state) { - switch (biton32(state)) { - case _LAZY: - save_color(underglow); - underglow = mod_color(underglow, true, 50); - break; - case _MEDIA: - save_color(underglow); - underglow = mod_color(underglow, true, 150); - break; - case _KEEB: - save_color(underglow); - underglow = mod_color(underglow, false, 150); - break; - case _LOWER: - save_color(underglow); - underglow = mod_color(underglow, false, 100); - break; - case _RAISE: - save_color(underglow); - underglow = mod_color(underglow, true, 100); - break; - default: - reset_color(); - break; - } - set_color(underglow, false); - return state; -} - //Tap Dance Definitions qk_tap_dance_action_t tap_dance_actions[] = { [TD_3_GRV_ACT] = ACTION_TAP_DANCE_FN (dance_3), diff --git a/users/arkag/config.h b/users/arkag/config.h index e715e5534..2e0a9ad01 100644 --- a/users/arkag/config.h +++ b/users/arkag/config.h @@ -1,5 +1,6 @@ #pragma once -#define TAPPING_TERM 200 +#define TAPPING_TERM 200 +#define LEADER_TIMEOUT 250 -#define IGNORE_MOD_TAP_INTERRUPT +#define LEADER_PER_KEY_TIMING From 6734cd9c5c7b63677d3d4cf9bef8ccf878fd3551 Mon Sep 17 00:00:00 2001 From: Wilba6582 Date: Mon, 1 Oct 2018 00:31:23 +1000 Subject: [PATCH 189/788] Keyboard: Zeal60: Fix getting backlight values "id_*_indicator_row_col" (#4030) --- keyboards/zeal60/rgb_backlight.c | 33 ++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/keyboards/zeal60/rgb_backlight.c b/keyboards/zeal60/rgb_backlight.c index 9f62a8d38..ce8b1cb17 100644 --- a/keyboards/zeal60/rgb_backlight.c +++ b/keyboards/zeal60/rgb_backlight.c @@ -916,6 +916,31 @@ void backlight_set_indicator_index( uint8_t *index, uint8_t row, uint8_t column } } +void backlight_get_indicator_row_col( uint8_t index, uint8_t *row, uint8_t *column ) +{ + if ( index == 255 || index == 254 ) + { + // Special value, 255=none, 254=all + *row = index; + *column = 0; + return; + } + for ( uint8_t r = 0; r < MATRIX_ROWS; r++ ) + { + for ( uint8_t c = 0; c < MATRIX_COLS; c++ ) + { + uint8_t i = 255; + map_row_column_to_led( r, c, &i ); + if ( i == index ) + { + *row = r; + *column = c; + return; + } + } + } +} + // Some helpers for setting/getting HSV void _set_color( HSV *color, uint8_t *data ) { @@ -1146,7 +1171,7 @@ void backlight_config_get_value( uint8_t *data ) } case id_caps_lock_indicator_row_col: { - //*value_data = g_config.caps_lock_indicator.index; + backlight_get_indicator_row_col( g_config.caps_lock_indicator.index, &(value_data[0]), &(value_data[1]) ); break; } case id_layer_1_indicator_color: @@ -1156,7 +1181,7 @@ void backlight_config_get_value( uint8_t *data ) } case id_layer_1_indicator_row_col: { - //*value_data = g_config.layer_1_indicator.index; + backlight_get_indicator_row_col( g_config.layer_1_indicator.index, &(value_data[0]), &(value_data[1]) ); break; } case id_layer_2_indicator_color: @@ -1166,7 +1191,7 @@ void backlight_config_get_value( uint8_t *data ) } case id_layer_2_indicator_row_col: { - //*value_data = g_config.layer_2_indicator.index; + backlight_get_indicator_row_col( g_config.layer_2_indicator.index, &(value_data[0]), &(value_data[1]) ); break; } case id_layer_3_indicator_color: @@ -1176,7 +1201,7 @@ void backlight_config_get_value( uint8_t *data ) } case id_layer_3_indicator_row_col: { - //*value_data = g_config.layer_3_indicator.index; + backlight_get_indicator_row_col( g_config.layer_3_indicator.index, &(value_data[0]), &(value_data[1]) ); break; } case id_alphas_mods: From 66ef1e3d6770e388d631d25e4cd1c6b1640cea24 Mon Sep 17 00:00:00 2001 From: Wilba6582 Date: Mon, 1 Oct 2018 01:35:10 +1000 Subject: [PATCH 190/788] RAMA M6-B and IS31FL3218 driver (#4021) * Initial RAMA M6-B commit. * Moved IS31FL3218 driver, minor cleanups * Refactor, added dynamic keymap. * Added dynamic keymaps to RAMA M6-A * Refactor M6-A and M6-B to use common code. * Formatting * Cleanup * Cleanup * Changes from review --- drivers/issi/is31fl3218.c | 102 ++++++ .../config.h => drivers/issi/is31fl3218.h | 16 +- keyboards/rama/m6_a/config.h | 24 +- keyboards/rama/m6_a/keymaps/default/keymap.c | 316 +----------------- keyboards/rama/m6_a/m6_a.c | 31 +- keyboards/rama/m6_a/readme.md | 2 +- keyboards/rama/m6_a/rules.mk | 44 ++- keyboards/rama/m6_b/config.h | 129 +++++++ keyboards/rama/m6_b/info.json | 19 ++ keyboards/rama/m6_b/keymaps/default/keymap.c | 16 + keyboards/rama/m6_b/m6_b.c | 230 +++++++++++++ keyboards/rama/m6_b/m6_b.h | 28 ++ keyboards/rama/m6_b/m6_b_api.h | 39 +++ keyboards/rama/m6_b/readme.md | 15 + keyboards/rama/m6_b/rgb_backlight.c | 139 ++++++++ keyboards/rama/m6_b/rgb_backlight.h | 34 ++ keyboards/rama/m6_b/rules.mk | 77 +++++ quantum/dynamic_keymap.c | 2 +- 18 files changed, 885 insertions(+), 378 deletions(-) create mode 100644 drivers/issi/is31fl3218.c rename keyboards/rama/m6_a/keymaps/default/config.h => drivers/issi/is31fl3218.h (67%) create mode 100644 keyboards/rama/m6_b/config.h create mode 100644 keyboards/rama/m6_b/info.json create mode 100644 keyboards/rama/m6_b/keymaps/default/keymap.c create mode 100644 keyboards/rama/m6_b/m6_b.c create mode 100644 keyboards/rama/m6_b/m6_b.h create mode 100644 keyboards/rama/m6_b/m6_b_api.h create mode 100644 keyboards/rama/m6_b/readme.md create mode 100644 keyboards/rama/m6_b/rgb_backlight.c create mode 100644 keyboards/rama/m6_b/rgb_backlight.h create mode 100644 keyboards/rama/m6_b/rules.mk diff --git a/drivers/issi/is31fl3218.c b/drivers/issi/is31fl3218.c new file mode 100644 index 000000000..db44f7256 --- /dev/null +++ b/drivers/issi/is31fl3218.c @@ -0,0 +1,102 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 . + */ +#include "is31fl3218.h" +#include "i2c_master.h" + +// This is the full 8-bit address +#define ISSI_ADDRESS 0b10101000 + +// These are the register addresses +#define ISSI_REG_SHUTDOWN 0x00 +#define ISSI_REG_PWM 0x01 +#define ISSI_REG_CONTROL 0x13 +#define ISSI_REG_UPDATE 0x16 +#define ISSI_REG_RESET 0x17 + +// Default timeout if no I2C response +#define ISSI_TIMEOUT 100 + +// Reusable buffer for transfers +uint8_t g_twi_transfer_buffer[20]; + +// IS31FL3218 has 18 PWM outputs and a fixed I2C address, so no chaining. +// If used as RGB LED driver, LEDs are assigned RGB,RGB,RGB,RGB,RGB,RGB +uint8_t g_pwm_buffer[18]; +bool g_pwm_buffer_update_required = false; + +void IS31FL3218_write_register( uint8_t reg, uint8_t data ) +{ + g_twi_transfer_buffer[0] = reg; + g_twi_transfer_buffer[1] = data; + i2c_transmit( ISSI_ADDRESS, g_twi_transfer_buffer, 2, ISSI_TIMEOUT); +} + +void IS31FL3218_write_pwm_buffer( uint8_t *pwm_buffer ) +{ + g_twi_transfer_buffer[0] = ISSI_REG_PWM; + for ( int i=0; i<18; i++ ) { + g_twi_transfer_buffer[1+i] = pwm_buffer[i]; + } + + i2c_transmit( ISSI_ADDRESS, g_twi_transfer_buffer, 19, ISSI_TIMEOUT); +} + +void IS31FL3218_init(void) +{ + // In case we ever want to reinitialize (?) + IS31FL3218_write_register( ISSI_REG_RESET, 0x00 ); + + // Turn off software shutdown + IS31FL3218_write_register( ISSI_REG_SHUTDOWN, 0x01 ); + + // Set all PWM values to zero + for ( uint8_t i = 0; i < 18; i++ ) { + IS31FL3218_write_register( ISSI_REG_PWM+i, 0x00 ); + } + + // Enable all channels + for ( uint8_t i = 0; i < 3; i++ ) { + IS31FL3218_write_register( ISSI_REG_CONTROL+i, 0b00111111 ); + } + + // Load PWM registers and LED Control register data + IS31FL3218_write_register( ISSI_REG_UPDATE, 0x01 ); +} + +void IS31FL3218_set_color( int index, uint8_t red, uint8_t green, uint8_t blue ) +{ + g_pwm_buffer[index * 3 + 0] = red; + g_pwm_buffer[index * 3 + 1] = green; + g_pwm_buffer[index * 3 + 2] = blue; + g_pwm_buffer_update_required = true; +} + +void IS31FL3218_set_color_all( uint8_t red, uint8_t green, uint8_t blue ) +{ + for ( int i = 0; i < 6; i++ ) { + IS31FL3218_set_color( i, red, green, blue ); + } +} + +void IS31FL3218_update_pwm_buffers(void) +{ + if ( g_pwm_buffer_update_required ) { + IS31FL3218_write_pwm_buffer( g_pwm_buffer ); + // Load PWM registers and LED Control register data + IS31FL3218_write_register( ISSI_REG_UPDATE, 0x01 ); + } + g_pwm_buffer_update_required = false; +} diff --git a/keyboards/rama/m6_a/keymaps/default/config.h b/drivers/issi/is31fl3218.h similarity index 67% rename from keyboards/rama/m6_a/keymaps/default/config.h rename to drivers/issi/is31fl3218.h index d150575c1..2d24e5146 100644 --- a/keyboards/rama/m6_a/keymaps/default/config.h +++ b/drivers/issi/is31fl3218.h @@ -1,4 +1,4 @@ -/* Copyright 2018 Wilba +/* Copyright 2018 Jason Williams (Wilba) * * 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 @@ -13,12 +13,12 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +#pragma once -#ifndef CONFIG_USER_H -#define CONFIG_USER_H +#include +#include -#include "../../config.h" - -// place overrides here - -#endif +void IS31FL3218_init(void); +void IS31FL3218_set_color( int index, uint8_t red, uint8_t green, uint8_t blue ); +void IS31FL3218_set_color_all( uint8_t red, uint8_t green, uint8_t blue ); +void IS31FL3218_update_pwm_buffers(void); diff --git a/keyboards/rama/m6_a/config.h b/keyboards/rama/m6_a/config.h index 0c5355f4a..8d77f5339 100644 --- a/keyboards/rama/m6_a/config.h +++ b/keyboards/rama/m6_a/config.h @@ -15,8 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef CONFIG_H -#define CONFIG_H +#pragma once #include "config_common.h" @@ -187,4 +186,23 @@ along with this program. If not, see . /* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ //#define MIDI_TONE_KEYCODE_OCTAVES 1 -#endif +#define RGB_BACKLIGHT_ENABLED 0 + +#define DYNAMIC_KEYMAP_LAYER_COUNT 4 + + +// EEPROM usage + +// TODO: refactor with new user EEPROM code (coming soon) +#define EEPROM_MAGIC 0x451F +#define EEPROM_MAGIC_ADDR 32 +// Bump this every time we change what we store +// This will automatically reset the EEPROM with defaults +// and avoid loading invalid data from the EEPROM +#define EEPROM_VERSION 0x07 +#define EEPROM_VERSION_ADDR 34 + +// Backlight config starts after EEPROM version +#define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 35 +// Dynamic keymap starts after backlight config (35+37) +#define DYNAMIC_KEYMAP_EEPROM_ADDR 72 diff --git a/keyboards/rama/m6_a/keymaps/default/keymap.c b/keyboards/rama/m6_a/keymaps/default/keymap.c index 6b15f3cd1..7a408fa8a 100644 --- a/keyboards/rama/m6_a/keymaps/default/keymap.c +++ b/keyboards/rama/m6_a/keymaps/default/keymap.c @@ -3,322 +3,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LAYOUT( - TO(1), KC_A, KC_B, KC_C, KC_D, KC_E), + KC_1, KC_2, KC_3, KC_4, KC_5, KC_6), LAYOUT( - TO(2), KC_F, KC_G, KC_H, KC_I, KC_J), + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO), LAYOUT( - TO(3), KC_K, KC_L, KC_M, KC_N, KC_O), + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO), LAYOUT( - TO(4), KC_P, KC_Q, KC_R, KC_S, KC_T), + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO) }; - LAYOUT( - TO(5), KC_U, KC_V, KC_W, KC_X, KC_Y), - - LAYOUT( - TO(0), KC_Z, KC_1, KC_2, KC_3, KC_4)}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - //keyevent_t event = record->event; - - switch (id) - { - case 0: - if (record->event.pressed) - { - return MACRO(T(T), T(G), T(L), T(H), T(F), T(ENT), END); - } - break; - case 1: - if (record->event.pressed) - { - return MACRO(T(T), T(G), T(G), T(ENT), END); - } - break; - case 2: - if (record->event.pressed) - { - return MACRO(D(NO), T(L), U(NO), END); - } - break; - case 3: - if (record->event.pressed) - { - return MACRO(D(LCTL), T(Z), U(LCTL), END); - } - break; - case 4: - if (record->event.pressed) - { - return MACRO(D(LCTL), D(LSFT), T(Z), U(LSFT), U(LCTL), END); - } - break; - case 5: - if (record->event.pressed) - { - return MACRO(D(LCTL), T(X), U(LCTL), END); - } - break; - case 6: - if (record->event.pressed) - { - return MACRO(D(LCTL), T(C), U(LCTL), END); - } - break; - case 7: - if (record->event.pressed) - { - return MACRO(D(LCTL), T(V), U(LCTL), END); - } - break; - } - return MACRO_NONE; -} - -// M6-A LEDs are connected to D6, B6, F5, B4, C7, F7 -// This is 1-based because I copied it from Knops code. -void set_switch_led(int ledId, bool state) -{ - if (state) - { - switch (ledId) - { - case 1: - PORTD |= (1 << 6); - break; - case 2: - PORTB |= (1 << 6); - break; - case 3: - PORTF |= (1 << 5); - break; - case 4: - PORTB |= (1 << 4); - break; - case 5: - PORTC |= (1 << 7); - break; - case 6: - PORTF |= (1 << 7); - break; - } - } - else - { - switch (ledId) - { - case 1: - PORTD &= ~(1 << 6); - break; - case 2: - PORTB &= ~(1 << 6); - break; - case 3: - PORTF &= ~(1 << 5); - break; - case 4: - PORTB &= ~(1 << 4); - break; - case 5: - PORTC &= ~(1 << 7); - break; - case 6: - PORTF &= ~(1 << 7); - break; - } - } -} - -void set_layer_led(int layerId) -{ - // UNUSED -} - -void led_set_layer(int layer); - -void matrix_init_user(void) -{ - led_init_ports(); - led_set_layer(0); -} - -void matrix_scan_user(void) -{ -} - -// M6-A LEDs are connected to D6, B6, F5, B4, C7, F7 -void led_init_ports() -{ - // Switch #1 - DDRD |= (1 << 6); - PORTD &= ~(1 << 6); - - // Switch #2 - DDRB |= (1 << 6); - PORTB &= ~(1 << 6); - - // Switch #3 - DDRF |= (1 << 5); - PORTF &= ~(1 << 5); - - // Switch #4 - DDRB |= (1 << 4); - PORTB &= ~(1 << 4); - - // Switch #5 - DDRC |= (1 << 7); - PORTC &= ~(1 << 7); - - // Switch #6 - DDRF |= (1 << 7); - PORTF &= ~(1 << 7); -} - -void led_set_user(uint8_t usb_led) -{ - - if (usb_led & (1 << USB_LED_NUM_LOCK)) - { - } - else - { - } - - if (usb_led & (1 << USB_LED_CAPS_LOCK)) - { - } - else - { - } - - if (usb_led & (1 << USB_LED_SCROLL_LOCK)) - { - } - else - { - } - - if (usb_led & (1 << USB_LED_COMPOSE)) - { - } - else - { - } - - if (usb_led & (1 << USB_LED_KANA)) - { - } - else - { - } -} - -void led_set_layer(int layer) -{ - switch (layer) - { - case 0: - set_switch_led(1, true); - set_switch_led(2, false); - set_switch_led(3, false); - set_switch_led(4, false); - set_switch_led(5, false); - set_switch_led(6, false); - break; - case 1: - set_switch_led(1, false); - set_switch_led(2, true); - set_switch_led(3, false); - set_switch_led(4, false); - set_switch_led(5, false); - set_switch_led(6, false); - break; - case 2: - set_switch_led(1, false); - set_switch_led(2, false); - set_switch_led(3, true); - set_switch_led(4, false); - set_switch_led(5, false); - set_switch_led(6, false); - break; - case 3: - set_switch_led(1, false); - set_switch_led(2, false); - set_switch_led(3, false); - set_switch_led(4, true); - set_switch_led(5, false); - set_switch_led(6, false); - break; - case 4: - set_switch_led(1, false); - set_switch_led(2, false); - set_switch_led(3, false); - set_switch_led(4, false); - set_switch_led(5, true); - set_switch_led(6, false); - break; - case 5: - set_switch_led(1, false); - set_switch_led(2, false); - set_switch_led(3, false); - set_switch_led(4, false); - set_switch_led(5, false); - set_switch_led(6, true); - break; - default: - set_switch_led(1, true); - set_switch_led(2, true); - set_switch_led(3, true); - set_switch_led(4, true); - set_switch_led(5, true); - set_switch_led(6, true); - break; - } -} - -bool process_record_user(uint16_t keycode, keyrecord_t *record) -{ - switch (keycode) - { - case TO(0): - if (record->event.pressed) - { - led_set_layer(0); - } - break; - case TO(1): - if (record->event.pressed) - { - led_set_layer(1); - } - break; - case TO(2): - if (record->event.pressed) - { - led_set_layer(2); - } - break; - case TO(3): - if (record->event.pressed) - { - led_set_layer(3); - } - break; - case TO(4): - if (record->event.pressed) - { - led_set_layer(4); - } - break; - case TO(5): - if (record->event.pressed) - { - led_set_layer(5); - } - break; - } - return true; -} diff --git a/keyboards/rama/m6_a/m6_a.c b/keyboards/rama/m6_a/m6_a.c index 1c84ea2b8..fa1900360 100644 --- a/keyboards/rama/m6_a/m6_a.c +++ b/keyboards/rama/m6_a/m6_a.c @@ -1,4 +1,4 @@ -/* Copyright 2018 Wilba +/* Copyright 2018 Jason Williams (Wilba) * * 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 @@ -13,32 +13,3 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#include "m6_a.h" -/* -void matrix_init_kb(void) { - // put your keyboard start-up code here - // runs once when the firmware starts up - - matrix_init_user(); -} - -void matrix_scan_kb(void) { - // put your looping keyboard code here - // runs every cycle (a lot) - - matrix_scan_user(); -} - -bool process_record_kb(uint16_t keycode, keyrecord_t *record) { - // put your per-action keyboard code here - // runs for every action, just before processing by the firmware - - return process_record_user(keycode, record); -} - -void led_set_kb(uint8_t usb_led) { - // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here - - led_set_user(usb_led); -} -*/ diff --git a/keyboards/rama/m6_a/readme.md b/keyboards/rama/m6_a/readme.md index 5dd2b92e1..ceaf6a88d 100644 --- a/keyboards/rama/m6_a/readme.md +++ b/keyboards/rama/m6_a/readme.md @@ -12,4 +12,4 @@ Make example for this keyboard (after setting up your build environment): make rama/m6_a:default -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. \ No newline at end of file +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). \ No newline at end of file diff --git a/keyboards/rama/m6_a/rules.mk b/keyboards/rama/m6_a/rules.mk index ca2a2a5f8..ed85ac36d 100644 --- a/keyboards/rama/m6_a/rules.mk +++ b/keyboards/rama/m6_a/rules.mk @@ -1,5 +1,7 @@ +# project specific files +SRC = keyboards/rama/m6_b/m6_b.c + # MCU name -#MCU = at90usb1286 MCU = atmega32u4 # Processor frequency. @@ -38,31 +40,27 @@ F_USB = $(F_CPU) # Interrupt driven control endpoint task(+60) OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT - -# Boot Section Size in *bytes* -# Teensy halfKay 512 -# Teensy++ halfKay 1024 -# Atmel DFU loader 4096 -# LUFA bootloader 4096 -# USBaspLoader 2048 -OPT_DEFS += -DBOOTLOADER_SIZE=4096 - +# Boot Section +BOOTLOADER = atmel-dfu # Build Options # change yes to no to disable # -BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700) -EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) -CONSOLE_ENABLE ?= yes # Console for debug(+400) -COMMAND_ENABLE ?= yes # Commands for debug and configuration +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE -SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend # if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -NKRO_ENABLE ?= no # USB Nkey Rollover -BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality on B7 by default -MIDI_ENABLE ?= no # MIDI support (+2400 to 4200, depending on config) -UNICODE_ENABLE ?= no # Unicode -BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID -AUDIO_ENABLE ?= no # Audio output on port C6 -FAUXCLICKY_ENABLE ?= no # Use buzzer to emulate clicky switches +NKRO_ENABLE = yes # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches + +RAW_ENABLE = yes +DYNAMIC_KEYMAP_ENABLE = yes \ No newline at end of file diff --git a/keyboards/rama/m6_b/config.h b/keyboards/rama/m6_b/config.h new file mode 100644 index 000000000..1adaad3f9 --- /dev/null +++ b/keyboards/rama/m6_b/config.h @@ -0,0 +1,129 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 . + */ +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0x5241 // "RW" +#define PRODUCT_ID 0x006B // 6-B +#define DEVICE_VER 0x0001 +#define MANUFACTURER RAMA.WORKS +#define PRODUCT RAMA M6-B +#define DESCRIPTION RAMA M6-B Macropad + +/* key matrix size */ +#define MATRIX_ROWS 1 +#define MATRIX_COLS 6 + +/* + * 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 { E6 } +#define MATRIX_COL_PINS { D4, B5, F4, D7, C6, F6 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_BREATHING +// #define BACKLIGHT_LEVELS 3 + + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* 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 userful 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 + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +#define RGB_BACKLIGHT_ENABLED 1 + +#define DYNAMIC_KEYMAP_LAYER_COUNT 4 + + +// EEPROM usage + +// TODO: refactor with new user EEPROM code (coming soon) +#define EEPROM_MAGIC 0x451F +#define EEPROM_MAGIC_ADDR 32 +// Bump this every time we change what we store +// This will automatically reset the EEPROM with defaults +// and avoid loading invalid data from the EEPROM +#define EEPROM_VERSION 0x07 +#define EEPROM_VERSION_ADDR 34 + +// Backlight config starts after EEPROM version +#define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 35 +// Dynamic keymap starts after backlight config (35+37) +#define DYNAMIC_KEYMAP_EEPROM_ADDR 72 diff --git a/keyboards/rama/m6_b/info.json b/keyboards/rama/m6_b/info.json new file mode 100644 index 000000000..c88a3cc61 --- /dev/null +++ b/keyboards/rama/m6_b/info.json @@ -0,0 +1,19 @@ +{ + "keyboard_name": "m6-b", + "url": "", + "maintainer": "qmk", + "width": 3, + "height": 2, + "layouts": { + "LAYOUT": { + "layout": [ + { "x": 0, "y": 0 }, + { "x": 1, "y": 0 }, + { "x": 2, "y": 0 }, + { "x": 0, "y": 1 }, + { "x": 1, "y": 1 }, + { "x": 2, "y": 1 } + ] + } + } +} diff --git a/keyboards/rama/m6_b/keymaps/default/keymap.c b/keyboards/rama/m6_b/keymaps/default/keymap.c new file mode 100644 index 000000000..7a408fa8a --- /dev/null +++ b/keyboards/rama/m6_b/keymaps/default/keymap.c @@ -0,0 +1,16 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + LAYOUT( + KC_1, KC_2, KC_3, KC_4, KC_5, KC_6), + + LAYOUT( + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO), + + LAYOUT( + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO), + + LAYOUT( + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO) }; + diff --git a/keyboards/rama/m6_b/m6_b.c b/keyboards/rama/m6_b/m6_b.c new file mode 100644 index 000000000..e7cd2f628 --- /dev/null +++ b/keyboards/rama/m6_b/m6_b.c @@ -0,0 +1,230 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 . + */ +#include "m6_b.h" +#include "m6_b_api.h" + +// Check that no backlight functions are called +#if RGB_BACKLIGHT_ENABLED +#include "rgb_backlight.h" +#endif // RGB_BACKLIGHT_ENABLED + +#include "raw_hid.h" +#include "dynamic_keymap.h" +#include "timer.h" +#include "tmk_core/common/eeprom.h" + +bool eeprom_is_valid(void) +{ + return (eeprom_read_word(((void*)EEPROM_MAGIC_ADDR)) == EEPROM_MAGIC && + eeprom_read_byte(((void*)EEPROM_VERSION_ADDR)) == EEPROM_VERSION); +} + +void eeprom_set_valid(bool valid) +{ + eeprom_update_word(((void*)EEPROM_MAGIC_ADDR), valid ? EEPROM_MAGIC : 0xFFFF); + eeprom_update_byte(((void*)EEPROM_VERSION_ADDR), valid ? EEPROM_VERSION : 0xFF); +} + +void eeprom_reset(void) +{ + // Set the keyboard-specific EEPROM state as invalid. + eeprom_set_valid(false); + // Set the TMK/QMK EEPROM state as invalid. + eeconfig_disable(); +} + +#ifdef RAW_ENABLE + +void raw_hid_receive( uint8_t *data, uint8_t length ) +{ + uint8_t *command_id = &(data[0]); + uint8_t *command_data = &(data[1]); + switch ( *command_id ) + { + case id_get_protocol_version: + { + command_data[0] = PROTOCOL_VERSION >> 8; + command_data[1] = PROTOCOL_VERSION & 0xFF; + break; + } + case id_get_keyboard_value: + { + if ( command_data[0] == id_uptime ) + { + uint32_t value = timer_read32(); + command_data[1] = (value >> 24 ) & 0xFF; + command_data[2] = (value >> 16 ) & 0xFF; + command_data[3] = (value >> 8 ) & 0xFF; + command_data[4] = value & 0xFF; + } + else + { + *command_id = id_unhandled; + } + break; + } +#ifdef DYNAMIC_KEYMAP_ENABLE + case id_dynamic_keymap_get_keycode: + { + uint16_t keycode = dynamic_keymap_get_keycode( command_data[0], command_data[1], command_data[2] ); + command_data[3] = keycode >> 8; + command_data[4] = keycode & 0xFF; + break; + } + case id_dynamic_keymap_set_keycode: + { + dynamic_keymap_set_keycode( command_data[0], command_data[1], command_data[2], ( command_data[3] << 8 ) | command_data[4] ); + break; + } + case id_dynamic_keymap_reset: + { + dynamic_keymap_reset(); + break; + } +#endif // DYNAMIC_KEYMAP_ENABLE +#if RGB_BACKLIGHT_ENABLED + case id_backlight_config_set_value: + { + //backlight_config_set_value(command_data); + break; + } + case id_backlight_config_get_value: + { + //backlight_config_get_value(command_data); + break; + } + case id_backlight_config_save: + { + //backlight_config_save(); + break; + } +#endif // RGB_BACKLIGHT_ENABLED + case id_eeprom_reset: + { + eeprom_reset(); + break; + } + case id_bootloader_jump: + { + // Need to send data back before the jump + // Informs host that the command is handled + raw_hid_send( data, length ); + // Give host time to read it + wait_ms(100); + bootloader_jump(); + break; + } + default: + { + // Unhandled message. + *command_id = id_unhandled; + break; + } + } + + // Return same buffer with values changed + raw_hid_send( data, length ); + +} + +#endif + +void main_init(void) +{ + // If the EEPROM has the magic, the data is good. + // OK to load from EEPROM. + if (eeprom_is_valid()) { +#if RGB_BACKLIGHT_ENABLED + //backlight_config_load(); +#endif // RGB_BACKLIGHT_ENABLED + } else { +#if RGB_BACKLIGHT_ENABLED + // If the EEPROM has not been saved before, or is out of date, + // save the default values to the EEPROM. Default values + // come from construction of the zeal_backlight_config instance. + //backlight_config_save(); +#endif // RGB_BACKLIGHT_ENABLED +#ifdef DYNAMIC_KEYMAP_ENABLE + // This resets the keymaps in EEPROM to what is in flash. + dynamic_keymap_reset(); +#endif + // Save the magic number last, in case saving was interrupted + eeprom_set_valid(true); + } +#if RGB_BACKLIGHT_ENABLED + // Initialize LED drivers for backlight. + backlight_init_drivers(); + + backlight_timer_init(); + backlight_timer_enable(); +#endif // RGB_BACKLIGHT_ENABLED +} + +void bootmagic_lite(void) +{ + // The lite version of TMK's bootmagic. + // 100% less potential for accidentally making the + // keyboard do stupid things. + + // We need multiple scans because debouncing can't be turned off. + matrix_scan(); + wait_ms(DEBOUNCING_DELAY); + wait_ms(DEBOUNCING_DELAY); + matrix_scan(); + + // If the Esc (matrix 0,0) is held down on power up, + // reset the EEPROM valid state and jump to bootloader. + if ( matrix_get_row(0) & (1<<0) ) { + eeprom_reset(); + bootloader_jump(); + } +} + +void matrix_init_kb(void) { + bootmagic_lite(); + main_init(); + matrix_init_user(); +} + +void matrix_scan_kb(void) { +#if RGB_BACKLIGHT_ENABLED + // This only updates the LED driver buffers if something has changed. + backlight_update_pwm_buffers(); +#endif // BACKLIGHT_ENABLED + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + led_set_user(usb_led); +} + +void suspend_power_down_kb(void) +{ +#if RGB_BACKLIGHT_ENABLED + //backlight_set_suspend_state(true); +#endif // BACKLIGHT_ENABLED +} + +void suspend_wakeup_init_kb(void) +{ +#if RGB_BACKLIGHT_ENABLED + //backlight_set_suspend_state(false); +#endif // BACKLIGHT_ENABLED +} diff --git a/keyboards/rama/m6_b/m6_b.h b/keyboards/rama/m6_b/m6_b.h new file mode 100644 index 000000000..bd4158bcb --- /dev/null +++ b/keyboards/rama/m6_b/m6_b.h @@ -0,0 +1,28 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 . + */ +#pragma once + +#include "quantum.h" + +// This a shortcut to help you visually see your layout. +// The first section contains all of the arguments +// The second converts the arguments into a two-dimensional array +#define LAYOUT( \ + K00, K01, K02, K03, K04, K05) \ + { \ + {K00, K01, K02, K03, K04, K05}, \ + } + diff --git a/keyboards/rama/m6_b/m6_b_api.h b/keyboards/rama/m6_b/m6_b_api.h new file mode 100644 index 000000000..041fd6e6e --- /dev/null +++ b/keyboards/rama/m6_b/m6_b_api.h @@ -0,0 +1,39 @@ +/* Copyright 2017 Jason Williams (Wilba) + * + * 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 . + */ +#pragma once + +#define PROTOCOL_VERSION 0x0001 + +enum m6_b_command_id +{ + id_get_protocol_version = 0x01, // always 0x01 + id_get_keyboard_value, + id_set_keyboard_value, + id_dynamic_keymap_get_keycode, + id_dynamic_keymap_set_keycode, + id_dynamic_keymap_reset, + id_backlight_config_set_value, + id_backlight_config_get_value, + id_backlight_config_save, + id_eeprom_reset, + id_bootloader_jump, + id_unhandled = 0xFF, +}; + +enum m6_b_keyboard_value_id +{ + id_uptime = 0x01 +}; diff --git a/keyboards/rama/m6_b/readme.md b/keyboards/rama/m6_b/readme.md new file mode 100644 index 000000000..d6bdd0c4c --- /dev/null +++ b/keyboards/rama/m6_b/readme.md @@ -0,0 +1,15 @@ +# RAMA M6-B + +![RAMA M6-B](https://static1.squarespace.com/static/563c788ae4b099120ae219e2/t/59fc7b1053450adf5bf9a852/1515932239307/RAMA-RAMA-M6-DSA-XO-CAPS.73-3_1.jpg?format=1500w) + +A 6-key companion keyboard. [More info at RAMA WORKS](https://rama.works/m6a) + +Keyboard Maintainer: [Wilba6582](https://github.com/Wilba6582) +Hardware Supported: RAMA M6-B PCB +Hardware Availability: [RAMA WORKS Store](https://ramaworks.store/) + +Make example for this keyboard (after setting up your build environment): + + make rama/m6_b:default + +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). \ No newline at end of file diff --git a/keyboards/rama/m6_b/rgb_backlight.c b/keyboards/rama/m6_b/rgb_backlight.c new file mode 100644 index 000000000..8f7ac0630 --- /dev/null +++ b/keyboards/rama/m6_b/rgb_backlight.c @@ -0,0 +1,139 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 . + */ +#if RGB_BACKLIGHT_ENABLED + +#include "rgb_backlight.h" +//#include "rgb_backlight_api.h" + +#include +#include +#include +#include "progmem.h" + +#include "quantum/color.h" +#include "drivers/avr/i2c_master.h" +#include "drivers/issi/is31fl3218.h" + +bool g_suspend_state = false; + +// Global tick at 20 Hz +uint32_t g_tick = 0; +uint8_t g_config_effect_speed = 0; +uint8_t g_config_brightness = 255; + +void backlight_update_pwm_buffers(void) +{ + IS31FL3218_update_pwm_buffers(); +} + +void backlight_set_color( int index, uint8_t red, uint8_t green, uint8_t blue ) +{ + IS31FL3218_set_color( index, red, green, blue ); +} + +void backlight_set_color_all( uint8_t red, uint8_t green, uint8_t blue ) +{ + IS31FL3218_set_color_all( red, green, blue ); +} + + +// This is (F_CPU/1024) / 20 Hz +// = 15625 Hz / 20 Hz +// = 781 +#define TIMER3_TOP 260 + +void backlight_timer_init(void) +{ + static uint8_t backlight_timer_is_init = 0; + if ( backlight_timer_is_init ) + { + return; + } + backlight_timer_is_init = 1; + + // Timer 3 setup + TCCR3B = _BV(WGM32) | // CTC mode OCR3A as TOP + _BV(CS32) | _BV(CS30); // prescale by /1024 + // Set TOP value + uint8_t sreg = SREG; + cli(); + + OCR3AH = (TIMER3_TOP >> 8) & 0xff; + OCR3AL = TIMER3_TOP & 0xff; + SREG = sreg; +} + +void backlight_timer_enable(void) +{ + TIMSK3 |= _BV(OCIE3A); +} + +void backlight_timer_disable(void) +{ + TIMSK3 &= ~_BV(OCIE3A); +} + +void backlight_set_suspend_state(bool state) +{ + g_suspend_state = state; +} + +void backlight_effect_cycle_all(void) +{ + uint8_t hueOffset = ( g_tick << g_config_effect_speed ) & 0xFF; + uint8_t satOffset = 127; + // Relies on hue being 8-bit and wrapping + for ( int i=0; i<6; i++ ) + { + HSV hsv = { .h = hueOffset, .s = satOffset, .v = g_config_brightness }; + RGB rgb = hsv_to_rgb( hsv ); + backlight_set_color( i, rgb.r, rgb.g, rgb.b ); + } +} + +ISR(TIMER3_COMPA_vect) +{ + // delay 1 second before driving LEDs or doing anything else + static uint8_t startup_tick = 0; + if ( startup_tick < 20 ) + { + startup_tick++; + return; + } + + g_tick++; + + if ( g_suspend_state ) + { + backlight_set_color_all( 0, 0, 0 ); + } + else + { + //HSV hsv = { .h = 240, .s = 255, .v = g_config_brightness }; + //RGB rgb = hsv_to_rgb( hsv ); + //backlight_set_color_all( rgb.r, rgb.g, rgb.b ); + backlight_effect_cycle_all(); + } +} + +void backlight_init_drivers(void) +{ + // Initialize I2C + i2c_init(); + IS31FL3218_init(); +} + +#endif // RGB_BACKLIGHT_ENABLED diff --git a/keyboards/rama/m6_b/rgb_backlight.h b/keyboards/rama/m6_b/rgb_backlight.h new file mode 100644 index 000000000..bbf605284 --- /dev/null +++ b/keyboards/rama/m6_b/rgb_backlight.h @@ -0,0 +1,34 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 . + */ +#pragma once + +#if RGB_BACKLIGHT_ENABLED +#else +#error rgb_backlight.h included when RGB_BACKLIGHT_ENABLED == 0 +#endif // RGB_BACKLIGHT_ENABLED + +#include +#include + +#include "quantum/color.h" + +void backlight_init_drivers(void); +void backlight_update_pwm_buffers(void); +void backlight_timer_init(void); +void backlight_timer_enable(void); +void backlight_timer_disable(void); +void backlight_set_suspend_state(bool state); + diff --git a/keyboards/rama/m6_b/rules.mk b/keyboards/rama/m6_b/rules.mk new file mode 100644 index 000000000..8226debd4 --- /dev/null +++ b/keyboards/rama/m6_b/rules.mk @@ -0,0 +1,77 @@ +# project specific files +SRC = rgb_backlight.c \ + quantum/color.c \ + drivers/issi/is31fl3218.c \ + drivers/avr/i2c_master.c + + +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + +# Boot Section +BOOTLOADER = atmel-dfu + +# Do not put the microcontroller into power saving mode +# when we get USB suspend event. We want it to keep updating +# backlight effects. +OPT_DEFS += -DNO_SUSPEND_POWER_DOWN + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = yes # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches + +RAW_ENABLE = yes +DYNAMIC_KEYMAP_ENABLE = yes +CIE1931_CURVE = yes diff --git a/quantum/dynamic_keymap.c b/quantum/dynamic_keymap.c index 2c989d691..ee39a2025 100644 --- a/quantum/dynamic_keymap.c +++ b/quantum/dynamic_keymap.c @@ -17,7 +17,7 @@ #include "config.h" #include "keymap.h" // to get keymaps[][][] #include "tmk_core/common/eeprom.h" -#include "progmem.h"// to read default from flash +#include "progmem.h" // to read default from flash #include "dynamic_keymap.h" From a7d46f1b0f4d18699a38898ff68114204d4c087d Mon Sep 17 00:00:00 2001 From: Erovia Date: Sun, 30 Sep 2018 20:14:06 +0200 Subject: [PATCH 191/788] Keymap: Add ErgoDone keymap with QWERTY and COLEMAK Mod-DH (#3884) * Custom keymap for the ErgoDone The keymap supports QWERTY and COLEMAK MOD-DH with LED indication. * Enable Space Cadet Shift * Fix after-boot layer indicator LED * Implement keyboard suspend, move layer LED handling to function, unify identation * Add readme.md with layout * Optimize LED handling, add include guard Read the default layer via the proper EEPROM function, so the calling of bootmagic() is no longer necessary. Fix bug when the CapsLock LED wasn't working anymore after a layer switch. --- keyboards/ergodone/keymaps/erovia/config.h | 3 + keyboards/ergodone/keymaps/erovia/keymap.c | 233 ++++++++++++++++++++ keyboards/ergodone/keymaps/erovia/readme.md | 76 +++++++ keyboards/ergodone/keymaps/erovia/rules.mk | 1 + 4 files changed, 313 insertions(+) create mode 100644 keyboards/ergodone/keymaps/erovia/config.h create mode 100644 keyboards/ergodone/keymaps/erovia/keymap.c create mode 100644 keyboards/ergodone/keymaps/erovia/readme.md create mode 100644 keyboards/ergodone/keymaps/erovia/rules.mk diff --git a/keyboards/ergodone/keymaps/erovia/config.h b/keyboards/ergodone/keymaps/erovia/config.h new file mode 100644 index 000000000..60c6ad4a1 --- /dev/null +++ b/keyboards/ergodone/keymaps/erovia/config.h @@ -0,0 +1,3 @@ +#pragma once + +#define DISABLE_SPACE_CADET_ROLLOVER diff --git a/keyboards/ergodone/keymaps/erovia/keymap.c b/keyboards/ergodone/keymaps/erovia/keymap.c new file mode 100644 index 000000000..627805afb --- /dev/null +++ b/keyboards/ergodone/keymaps/erovia/keymap.c @@ -0,0 +1,233 @@ +#include QMK_KEYBOARD_H +#include "version.h" +#include "bootmagic.h" + +#define QWERTY 0 // qwerty layer +#define COLEMAK 1 // colemak layer +#define FN 2 // function layer + +enum custom_keycodes { + QWRTY = SAFE_RANGE, // can always be here + CLMK, + VRSN, + FNCTN +}; + +/* false: Caps Lock LED is off + true: Caps Lock LED is on */ +bool CAPS_LED = false; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Keymap 0: Qwerty layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | Copy | | Paste| 6 | 7 | 8 | 9 | 0 | Sleep | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | Tab | Q | W | E | R | T | Mute | | { | Y | U | I | O | P | \ | + * |--------+------+------+------+------+------| | | [ |------+------+------+------+------+--------| + * | Esc | A | S | D | F | G |------| |------| H | J | K | L | ; | ' | + * |--------+------+------+------+------+------| Fn1 | | } |------+------+------+------+------+--------| + * | LShift | Z | X | C | V | B | | | ] | N | M | , | . | / | RShift | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * |LCtrl | LGui | LAlt | Left | Right| | Down | Up | - | = | RCtrl | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | Caps | LGui | | Ins | Del | + * ,------|------|------| |------+--------+------. + * | | | Home | | PgUp | | | + * | Space|Backsp|------| |------| Tab |Enter | + * | |ace | End | | PgDn | | | + * `--------------------' `----------------------' + */ +// If it accepts an argument (i.e, is a function), it doesn't need KC_. +// Otherwise, it needs KC_* +[QWERTY] = LAYOUT_ergodox( // layer 0 : qwerty + // left hand + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_COPY, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_MUTE, + KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, + KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_FN1, + KC_LCTL, KC_LGUI, KC_LALT, KC_LEFT, KC_RGHT, + KC_CAPS, KC_LGUI, + KC_HOME, + KC_SPC, KC_BSPC, KC_END, + // right hand + KC_PASTE, KC_6, KC_7, KC_8, KC_9, KC_0, KC_SLEP, + KC_LBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, + KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOTE, + KC_RBRC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, + KC_DOWN, KC_UP, KC_MINS, KC_EQL, KC_RCTL, + KC_INS, KC_DEL, + KC_PGUP, + KC_PGDN, KC_TAB, KC_ENT +), +/* Keymap 1: Colemak layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | Copy | | Paste| 6 | 7 | 8 | 9 | 0 | Sleep | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | Tab | Q | W | F | P | B | Mute | | { | J | L | U | Y | ; | \ | + * |--------+------+------+------+------+------| | | [ |------+------+------+------+------+--------| + * | Esc | A | R | S | T | G |------| |------| M | N | E | I | O | ' | + * |--------+------+------+------+------+------| Fn1 | | } |------+------+------+------+------+--------| + * | LShift | Z | X | C | D | V | | | ] | K | H | , | . | / | RShift | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * |LCtrl | LGui | LAlt | Left | Right| | Down | Up | - | = | RCtrl | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | Caps | LGui | | Ins | Del | + * ,------|------|------| |------+--------+------. + * | | | Home | | PgUp | | | + * | Space|Backsp|------| |------| Tab |Enter | + * | |ace | End | | PgDn | | | + * `--------------------' `----------------------' + */ +[COLEMAK] = LAYOUT_ergodox( // layer 1 : colemak + // left hand + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_COPY, + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_B, KC_MUTE, + KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_G, + KC_LSPO, KC_Z, KC_X, KC_C, KC_D, KC_V, KC_FN1, + KC_LCTL, KC_LGUI, KC_LALT, KC_LEFT, KC_RGHT, + KC_CAPS, KC_LGUI, + KC_HOME, + KC_SPC, KC_BSPC, KC_END, + // right hand + KC_PASTE, KC_6, KC_7, KC_8, KC_9, KC_0, KC_SLEP, + KC_LBRC, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSLS, + KC_M, KC_N, KC_E, KC_I, KC_O, KC_QUOTE, + KC_RBRC, KC_K, KC_H, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, + KC_DOWN, KC_UP, KC_MINS, KC_EQL, KC_RCTL, + KC_INS, KC_DEL, + KC_PGUP, + KC_PGDN, KC_TAB, KC_ENT +), +/* Keymap 2: Function Layer + * + * ,---------------------------------------------------. ,--------------------------------------------------. + * |Version | F1 | F2 | F3 | F4 | F5 | F11 | | F12 | F6 | F7 | F8 | F9 | F10 | | + * |---------+------+------+------+------+------+------| |------+------+------+------+------+------+--------| + * | | | | Prev | Play | Next | | | | | | | | | | + * |---------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | |VolDn | VolUp|------| |------| |QWRTY | CLMK | | | | + * |---------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | | | | | | | | | | + * `---------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | | | | | + * `-----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// Functions +[FN] = LAYOUT_ergodox( + // left hand + VRSN, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11, + KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MPLY, KC_MNXT, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD, KC_VOLU, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + // right hand + KC_F12, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, QWRTY, CLMK, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_TAP_TOGGLE(FN) // FN1 - Momentary Layer 1 +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case VRSN: + if (record->event.pressed) { + SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); + } + return false; + break; + case QWRTY: + if (record->event.pressed) { + set_single_persistent_default_layer(QWERTY); + } + return false; + break; + case CLMK: + if (record->event.pressed) { + set_single_persistent_default_layer(COLEMAK); + } + return false; + break; + case KC_CAPS: + if (record->event.pressed) { + // Turn LED1 On/Off for Caps Lock + if (CAPS_LED) { + ergodox_right_led_1_off(); + CAPS_LED = false; + } else { + ergodox_right_led_1_on(); + CAPS_LED = true; + } + } + return true; + break; + } + return true; +}; + +// Set LED according to the default layer +void default_layer_led_set(void) { + switch (biton32(eeconfig_read_default_layer())) { + case COLEMAK: + // LED2 for COLEMAK + ergodox_right_led_2_on(); + break; + case QWERTY: + // LED3 for QWERTY + ergodox_right_led_3_on(); + break; + }; +}; + +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { + default_layer_led_set(); +}; + +uint32_t layer_state_set_user(uint32_t state) { + ergodox_led_all_off(); + switch (biton32(state)) { + case FN: + // Red led on Pro Micro for Fn layer + ergodox_board_led_on(); + break; + }; + + if (CAPS_LED) { + ergodox_right_led_1_on(); + } + + default_layer_led_set(); + + return state; +}; + +void suspend_power_down_user(void) { + ergodox_led_all_off(); +}; + +void suspend_wakeup_init_user(void) { + default_layer_led_set(); +}; diff --git a/keyboards/ergodone/keymaps/erovia/readme.md b/keyboards/ergodone/keymaps/erovia/readme.md new file mode 100644 index 000000000..160c87598 --- /dev/null +++ b/keyboards/ergodone/keymaps/erovia/readme.md @@ -0,0 +1,76 @@ +# Erovia's ErdoDone Keymap + +My personal ErgoDone keymap based on the *default* keymap. + +**Features** + +* Qwerty and Colemak Mod-DH support +* Space Cadet Shift +* LED indicator for: active layout, CapsLock, Function layer + +## QWERTY (Normal) Layer +``` +,--------------------------------------------------. ,--------------------------------------------------. +| ` | 1 | 2 | 3 | 4 | 5 | Copy | | Paste| 6 | 7 | 8 | 9 | 0 | Sleep | +|--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| +| Tab | Q | W | E | R | T | Mute | | { | Y | U | I | O | P | \ | +|--------+------+------+------+------+------| | | [ |------+------+------+------+------+--------| +| Esc | A | S | D | F | G |------| |------| H | J | K | L | ; | ' | +|--------+------+------+------+------+------| Fn1 | | } |------+------+------+------+------+--------| +| LShift | Z | X | C | V | B | | | ] | N | M | , | . | / | RShift | +`--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + |LCtrl | LGui | LAlt | Left | Right| | Down | Up | - | = | RCtrl | + `----------------------------------' `----------------------------------' + ,-------------. ,-------------. + | Caps | LGui | | Ins | Del | + ,------|------|------| |------+--------+------. + | | | Home | | PgUp | | | + | Space|Backsp|------| |------| Tab |Enter | + | |ace | End | | PgDn | | | + `--------------------' `----------------------' +``` + +## Colemak Layer +Switch from `Fn1` layer. +``` +,--------------------------------------------------. ,--------------------------------------------------. +| ` | 1 | 2 | 3 | 4 | 5 | Copy | | Paste| 6 | 7 | 8 | 9 | 0 | Sleep | +|--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| +| Tab | Q | W | F | P | B | Mute | | { | J | L | U | Y | ; | \ | +|--------+------+------+------+------+------| | | [ |------+------+------+------+------+--------| +| Esc | A | R | S | T | G |------| |------| M | N | E | I | O | ' | +|--------+------+------+------+------+------| Fn1 | | } |------+------+------+------+------+--------| +| LShift | Z | X | C | D | V | | | ] | K | H | , | . | / | RShift | +`--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + |LCtrl | LGui | LAlt | Left | Right| | Down | Up | - | = | RCtrl | + `----------------------------------' `----------------------------------' + ,-------------. ,-------------. + | Caps | LGui | | Ins | Del | + ,------|------|------| |------+--------+------. + | | | Home | | PgUp | | | + | Space|Backsp|------| |------| Tab |Enter | + | |ace | End | | PgDn | | | + `--------------------' `----------------------' +``` + +## Function Layer +``` +,---------------------------------------------------. ,--------------------------------------------------. +|Version | F1 | F2 | F3 | F4 | F5 | F11 | | F12 | F6 | F7 | F8 | F9 | F10 | | +|---------+------+------+------+------+------+------| |------+------+------+------+------+------+--------| +| | | | Prev | Play | Next | | | | | | | | | | +|---------+------+------+------+------+------| | | |------+------+------+------+------+--------| +| | | | |VolDn | VolUp|------| |------| |QWRTY | CLMK | | | | +|---------+------+------+------+------+------| | | |------+------+------+------+------+--------| +| | | | | | | | | | | | | | | | +`---------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + | | | | | | | | | | | | + `-----------------------------------' `----------------------------------' + ,-------------. ,-------------. + | | | | | | + ,------|------|------| |------+------+------. + | | | | | | | | + | | |------| |------| | | + | | | | | | | | + `--------------------' `--------------------' +``` diff --git a/keyboards/ergodone/keymaps/erovia/rules.mk b/keyboards/ergodone/keymaps/erovia/rules.mk new file mode 100644 index 000000000..f7b7da719 --- /dev/null +++ b/keyboards/ergodone/keymaps/erovia/rules.mk @@ -0,0 +1 @@ +COMMAND_ENABLE = no # Commands for debug and configuration From a6c85f1c2383616e875e7cdc6ce31873d6fb0ce3 Mon Sep 17 00:00:00 2001 From: OlliGranlund Date: Sun, 30 Sep 2018 23:50:16 +0300 Subject: [PATCH 192/788] Keymap: add olligranlund Iris + satan layouts (#4031) * init * function layout planning * nordic keymap v1.0 * Added latest satan layouts, updated readmes * Cleaning code * Renamed ISO -> iso --- .../iris/keymaps/olligranlund_nordic/config.h | 36 +++++ .../iris/keymaps/olligranlund_nordic/keymap.c | 131 ++++++++++++++++++ .../keymaps/olligranlund_nordic/readme.md | 11 ++ .../iris/keymaps/olligranlund_nordic/rules.mk | 2 + .../satan/keymaps/olligranlund_iso/config.h | 17 +++ .../satan/keymaps/olligranlund_iso/keymap.c | 99 +++++++++++++ .../satan/keymaps/olligranlund_iso/readme.md | 18 +++ .../satan/keymaps/olligranlund_iso/rules.mk | 17 +++ 8 files changed, 331 insertions(+) create mode 100644 keyboards/iris/keymaps/olligranlund_nordic/config.h create mode 100644 keyboards/iris/keymaps/olligranlund_nordic/keymap.c create mode 100644 keyboards/iris/keymaps/olligranlund_nordic/readme.md create mode 100644 keyboards/iris/keymaps/olligranlund_nordic/rules.mk create mode 100644 keyboards/satan/keymaps/olligranlund_iso/config.h create mode 100644 keyboards/satan/keymaps/olligranlund_iso/keymap.c create mode 100644 keyboards/satan/keymaps/olligranlund_iso/readme.md create mode 100644 keyboards/satan/keymaps/olligranlund_iso/rules.mk diff --git a/keyboards/iris/keymaps/olligranlund_nordic/config.h b/keyboards/iris/keymaps/olligranlund_nordic/config.h new file mode 100644 index 000000000..259f2a742 --- /dev/null +++ b/keyboards/iris/keymaps/olligranlund_nordic/config.h @@ -0,0 +1,36 @@ +/* +Copyright 2017 Danny Nguyen + +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 . +*/ + +#pragma once + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +//#define USE_I2C + +/* Select hand configuration */ + +// #define MASTER_LEFT +// #define MASTER_RIGHT +#define EE_HANDS + +#undef RGBLED_NUM +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 18 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 diff --git a/keyboards/iris/keymaps/olligranlund_nordic/keymap.c b/keyboards/iris/keymaps/olligranlund_nordic/keymap.c new file mode 100644 index 000000000..65ed6d289 --- /dev/null +++ b/keyboards/iris/keymaps/olligranlund_nordic/keymap.c @@ -0,0 +1,131 @@ +#include QMK_KEYBOARD_H +#include "keymap_swedish.h" + +extern keymap_config_t keymap_config; + +#define _QWERTY 0 +#define _LOWER 1 +#define _RAISE 2 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + LOWER, + RAISE, + ADJUST +}; + +#define KC_ KC_TRNS + +#define KC_LOWER LOWER +#define KC_RAISE RAISE +#define KC_ADJ ADJUST +#define KC_RST RESET + +#define KC_AA NO_AA +#define KC_AE NO_AE +#define KC_OE NO_OSLH + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_QWERTY] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ +LT(_LOWER, KC_TAB),KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_AA, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_OE, KC_AE, + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_LCTL, KC_Z, KC_X, KC_C, KC_V, KC_B, RAISE, KC_BSPC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_MINS, + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + KC_LGUI, KC_LALT, KC_SPC, KC_ENT, ADJUST, KC_RALT + // └────────┴────────┴────────┘ └────────┴────────┴────────┘ + ), + + [_LOWER] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + NO_TILD, KC_EXLM, NO_AT, KC_HASH, NO_DLR, KC_PERC, NO_CIRC, NO_AMPR, NO_ASTR, NO_SLSH, NO_LPRN, NO_RPRN, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + KC_TRNS, KC_MPRV, KC_MPLY, KC_MNXT, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_UP, KC_PGDOWN, NO_LCBR, NO_RCBR, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + KC_TRNS, KC_VOLD, KC_MUTE, KC_VOLU, KC_TRNS, NO_BSLS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, NO_LBRC, NO_RBRC, + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DEL, KC_TRNS, KC_GRAVE, KC_CIRC, KC_QUOTE, NO_LESS, NO_GRTR, + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + // └────────┴────────┴────────┘ └────────┴────────┴────────┘ + ), + + [_RAISE] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_F12, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + NO_GRV, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_7, KC_8, KC_9, NO_MINS, NO_ASTR, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_4, KC_5, KC_6, NO_PLUS, NO_SLSH, + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_1, KC_2, KC_3, KC_0, KC_TRNS, + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + // └────────┴────────┴────────┘ └────────┴────────┴────────┘ + ), + + [_ADJUST] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + BL_TOGG, BL_STEP, BL_BRTG, RGB_TOG, RGB_RMOD, RGB_MOD, _______, _______, _______, _______, _______, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + BL_DEC, _______, BL_INC, RGB_VAD, RGB_SAI, RGB_VAI, _______, _______, _______, _______, _______, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + _______, _______, _______, RGB_HUD, RGB_SAD, RGB_HUI, _______, _______, _______, _______, _______, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + _______, _______, _______, _______, _______, _______ + // └────────┴────────┴────────┘ └────────┴────────┴────────┘ + ) +}; + +void persistent_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + break; + } + return true; +} diff --git a/keyboards/iris/keymaps/olligranlund_nordic/readme.md b/keyboards/iris/keymaps/olligranlund_nordic/readme.md new file mode 100644 index 000000000..72eccde10 --- /dev/null +++ b/keyboards/iris/keymaps/olligranlund_nordic/readme.md @@ -0,0 +1,11 @@ +# Iris Nordic Layout +### by Oliver Granlund + +![Finished product](https://i.imgur.com/zqSBc3t.jpg) + +This is for those who insist to use keyboard with ÅÄÖ. Also thought about the +gaming aspect with this keyboard, therefore space on left side. + +At first I thought about having backspace in the upper right corner of the +slave side, but that made it really clunky to fix your text. Thumbs should take +care of this job instead. diff --git a/keyboards/iris/keymaps/olligranlund_nordic/rules.mk b/keyboards/iris/keymaps/olligranlund_nordic/rules.mk new file mode 100644 index 000000000..d7463419b --- /dev/null +++ b/keyboards/iris/keymaps/olligranlund_nordic/rules.mk @@ -0,0 +1,2 @@ +RGBLIGHT_ENABLE = yes +BACKLIGHT_ENABLE = yes diff --git a/keyboards/satan/keymaps/olligranlund_iso/config.h b/keyboards/satan/keymaps/olligranlund_iso/config.h new file mode 100644 index 000000000..eab4c8e97 --- /dev/null +++ b/keyboards/satan/keymaps/olligranlund_iso/config.h @@ -0,0 +1,17 @@ +// Backlight configuration +#undef BACKLIGHT_LEVELS +#define BACKLIGHT_LEVELS 10 + +// Underlight configuration +#undef RGB_DI_PIN +#define RGB_DI_PIN B2 +#undef RGBLED_NUM +#define RGBLED_NUM 16 // Number of LEDs +#undef RGBLIGHT_HUE_STEP +#define RGBLIGHT_HUE_STEP 8 +#undef RGBLIGHT_SAT_STEP +#define RGBLIGHT_SAT_STEP 8 +#undef RGBLIGHT_VAL_STEP +#define RGBLIGHT_VAL_STEP 8 + +#define RGBLIGHT_ANIMATIONS diff --git a/keyboards/satan/keymaps/olligranlund_iso/keymap.c b/keyboards/satan/keymaps/olligranlund_iso/keymap.c new file mode 100644 index 000000000..5016d4377 --- /dev/null +++ b/keyboards/satan/keymaps/olligranlund_iso/keymap.c @@ -0,0 +1,99 @@ +#include QMK_KEYBOARD_H + +#define BASE 0 // Default layer +#define MOUSE 1 // Space layer +#define NUMPAD 2 // Alt layer +#define CAPS 3 // Caps layer + +// General shortenings +#define ESCA KC_ESC +#define MINS KC_MINS +#define EQUL KC_EQL +#define BSPC KC_BSPC +#define DELE KC_DEL +#define LBRC KC_LBRC +#define RBRC KC_RBRC +#define ALTR KC_RALT +#define SCLN KC_SCLN +#define QUOT KC_QUOT +#define NUHS KC_NUHS +#define ENTE KC_ENT +#define NUBS KC_NUBS // Less/ greater sign +#define COMM KC_COMM // Comma +#define FSTO KC_DOT // Full stop +#define SLSH KC_SLSH +#define ALTL KC_LALT +#define GUIL KC_LGUI +#define GUIR KC_RGUI +#define MENO KC_MENU + +// Special Actions and Media Keys +#define INSE KC_INS // Insert here +#define HOME KC_HOME // Go to beginning of line +#define ENDI KC_END // go to end of line +#define PSCR KC_PSCR // Print Screen +#define SLCK KC_SLCK // go to end of line +#define PGDN KC_PGDN // go to end of line +#define PGUP KC_PGUP // go to end of line +#define PLPS KC_MPLY // Play/Pause +#define PAUS KC_PAUS // Pause button +#define MUTE KC_MUTE // Mute sound +#define VOLU KC_VOLU // Volume increase +#define VOLD KC_VOLD // Volume decrease +#define MNXT KC_MNXT // next track +#define MPRV KC_MPRV // prev track +#define MSTP KC_MSTP // stop playing +#define MSEL KC_MSEL // Select media (Start playing it) +#define MAIL KC_MAIL // Open default mail app +#define CALC KC_CALC // Open default calculator app +#define MYCM KC_MYCM // Open default file manager + +// increase readability +#define _______ KC_TRNS +#define XXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Keymap BASE: (Base Layer) Default Layer + * ,-----------------------------------------------------------. + * |Esc~| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | + * |-----------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| R | + * |-----------------------------------------------------------| + * |CAPS | A| S| D| F| G| H| J| K| L| ;| '| # | R | + * |-----------------------------------------------------------| + * |Shft| \ | Z| X| C| V| B| N| M| ,| .| /|Shift | + * |-----------------------------------------------------------| + * |Ctrl|Gui |Alt | Space |Alt |Gui |FN |Ctrl | + * `-----------------------------------------------------------| + */ + +[ BASE ] = KEYMAP_ISO_SPLITRSHIFT( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, XXXXX, \ + LT(CAPS, KC_CAPS), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_NUHS, KC_ENT, \ + KC_LSFT, KC_NUBS,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT, XXXXX, \ + KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT, MO(CAPS), TG(NUMPAD), TG(MOUSE)), + +[ MOUSE ] = KEYMAP( // Mouse controls + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, XXXXX,\ + _______, _______, _______, _______, _______, _______, _______, KC_MS_BTN1, KC_MS_U, KC_MS_BTN2, _______, _______, _______, _______,\ + _______, _______, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R, _______, _______, _______, _______,\ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, XXXXX,\ + _______, _______, _______, _______, _______, _______, _______, _______), + +[ NUMPAD ] = KEYMAP( //Numpad and alt shortcuts + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, XXXXX,\ + _______, BL_TOGG, BL_DEC, BL_INC, _______, _______, _______, KC_1, KC_2, KC_3, _______, _______, _______, _______,\ + _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, _______, _______, KC_4, KC_5, KC_6, _______, _______, _______, _______,\ + _______, _______, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, KC_7, KC_8, KC_9, KC_0, _______, _______, XXXXX,\ + _______, _______, _______, _______, _______, _______, _______, _______), + +[ CAPS ] = KEYMAP( // Main "function" key, arrows, media control + KC_GRAVE, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, XXXXX,\ + _______, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______, _______, PGDN, KC_UP, PGUP, PSCR, SLCK, PAUS, _______,\ + _______, KC__VOLDOWN, KC__MUTE, KC__VOLUP, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, _______, _______,\ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, XXXXX,\ + _______, _______, _______, _______, _______, _______, _______, _______) + +}; diff --git a/keyboards/satan/keymaps/olligranlund_iso/readme.md b/keyboards/satan/keymaps/olligranlund_iso/readme.md new file mode 100644 index 000000000..e0801ef85 --- /dev/null +++ b/keyboards/satan/keymaps/olligranlund_iso/readme.md @@ -0,0 +1,18 @@ +# ISO layout for the Satan GH60 +### Originally by Ben James, forked by Oliver Granlund + +![Finished product](https://i.imgur.com/s5HAgr6.jpg) + +I've wanted to make this as close to a P0ker as possible, but some macros in +the P0ker don't make sense... + +Some of the features: +* Caps activates special features when held: + * Arrow keys directly under right hand + * Volume control + * Fn keys on number row + * PageUp/PageDn/Home/other general buttons +* Mouse control +* Numpad (works so much better if this would be ortho) +### RGB-strip +![Behind the scenes](https://i.imgur.com/reHLXrc.jpg) diff --git a/keyboards/satan/keymaps/olligranlund_iso/rules.mk b/keyboards/satan/keymaps/olligranlund_iso/rules.mk new file mode 100644 index 000000000..c96deccaa --- /dev/null +++ b/keyboards/satan/keymaps/olligranlund_iso/rules.mk @@ -0,0 +1,17 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend From a398d2cece1ee69006cf26e9a86fbf38e1acb0d1 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Sun, 30 Sep 2018 22:06:29 -0700 Subject: [PATCH 193/788] Keymap: Add noroadsleft keymap for KC60 (#3876) * Add personal KC60 keymap * Update personal KC60 keymap * Keymap update 2018-05-30 01:53 UTC-7 * Added macro: T_PEEKR * Added macro for MacOS Select All; modified MacOS function layer * Added git branch-name macro * Added GitHub signature macro * Added readme files * Added Quake 2 and System layers * Refactored keymap readme * Refactored to add userspace files; added Colemak layer * Minor code cleanup; updated readme files * Reverted use of userspace Decided not to make use of the Userspace feature at this time. Reverted its addition, and updated the readme files where needed (they were linking to userspace files). * Updated per review comments by @drashna * Refactor buggy macros I'm still not sure these work properly * Fix Windows shortcuts * Fix Mac shortcuts, possibly Untested; still may be broken. * Remove PREVENT_STUCK_MODIFIERS from config.h Deprecated by #3107 --- keyboards/kc60/keymaps/noroadsleft/config.h | 8 + keyboards/kc60/keymaps/noroadsleft/keymap.c | 393 ++++++++++++++++++ keyboards/kc60/keymaps/noroadsleft/readme.md | 29 ++ .../kc60/keymaps/noroadsleft/readme_ch1.md | 70 ++++ .../kc60/keymaps/noroadsleft/readme_ch2.md | 26 ++ .../kc60/keymaps/noroadsleft/readme_ch3.md | 39 ++ .../kc60/keymaps/noroadsleft/readme_ch4.md | 54 +++ .../kc60/keymaps/noroadsleft/readme_ch5.md | 84 ++++ .../kc60/keymaps/noroadsleft/readme_git.md | 56 +++ keyboards/kc60/keymaps/noroadsleft/rules.mk | 2 + 10 files changed, 761 insertions(+) create mode 100644 keyboards/kc60/keymaps/noroadsleft/config.h create mode 100644 keyboards/kc60/keymaps/noroadsleft/keymap.c create mode 100644 keyboards/kc60/keymaps/noroadsleft/readme.md create mode 100644 keyboards/kc60/keymaps/noroadsleft/readme_ch1.md create mode 100644 keyboards/kc60/keymaps/noroadsleft/readme_ch2.md create mode 100644 keyboards/kc60/keymaps/noroadsleft/readme_ch3.md create mode 100644 keyboards/kc60/keymaps/noroadsleft/readme_ch4.md create mode 100644 keyboards/kc60/keymaps/noroadsleft/readme_ch5.md create mode 100644 keyboards/kc60/keymaps/noroadsleft/readme_git.md create mode 100644 keyboards/kc60/keymaps/noroadsleft/rules.mk diff --git a/keyboards/kc60/keymaps/noroadsleft/config.h b/keyboards/kc60/keymaps/noroadsleft/config.h new file mode 100644 index 000000000..e216d050b --- /dev/null +++ b/keyboards/kc60/keymaps/noroadsleft/config.h @@ -0,0 +1,8 @@ +#pragma once + +#define PERMISSIVE_HOLD // https://docs.qmk.fm/#/feature_advanced_keycodes?id=permissive-hold + +// Enable single-color backlighting +#define BACKLIGHT_BREATHING +#define BACKLIGHT_LEVELS 5 +#define BREATHING_PERIOD 4 diff --git a/keyboards/kc60/keymaps/noroadsleft/keymap.c b/keyboards/kc60/keymaps/noroadsleft/keymap.c new file mode 100644 index 000000000..f28f2144f --- /dev/null +++ b/keyboards/kc60/keymaps/noroadsleft/keymap.c @@ -0,0 +1,393 @@ +#include QMK_KEYBOARD_H +#include +//#include +#include + + +/********************** +** LAYER DEFINITIONS ** +**********************/ +enum layers_keymap { + // BASE LAYERS + _QWERTY = 0, + _DVORAK, + _COLEMAK, + _MAC, + _QUAKE2, + _QUAKE2_DVORAK, + _QUAKE2_CONSOLE, + + // FUNCTION LAYERS + _FUNCWIN, + _FUNCMAC, + _FUNCQ2, + + // OTHER LAYERS + _NUMPAD, + _MACROS, + _SYSTEM +}; + +// LAYER SHORT CODES +#define _QW _QWERTY +#define _DV _DVORAK +#define _CM _COLEMAK +#define _MC _MAC +#define _Q2 _QUAKE2 +#define _QD _QUAKE2_DVORAK +#define _QC _QUAKE2_CONSOLE +#define _FW _FUNCWIN +#define _FM _FUNCMAC +#define _FQ _FUNCQ2 +#define _NP _NUMPAD +#define _MA _MACROS +#define _SY _SYSTEM + + +// KEYCODE DEFINITIONS +#define NO_CHNG KC_TRNS // Note for me for keys I need to leave as Pass-through + +#define FW_CAPS LT(_FUNCWIN, KC_CAPS) // _FUNCWIN when held, Caps Lock when tapped +#define FM_CAPS LT(_FUNCMAC, KC_CAPS) // _FUNCMAC when held, Caps Lock when tapped +#define Q2_CAPS LT(_FUNCQ2, KC_CAPS) // _FUNCQ2 when held, Caps Lock when tapped + +#define WN_SALL LCTL(DV_A) // Windows/Linux Select All +#define WN_UNDO LCTL(DV_Z) // Windows/Linux Undo +#define WN_CUT LCTL(DV_X) // Windows/Linux Cut +#define WN_COPY LCTL(DV_C) // Windows/Linux Copy +#define WN_PSTE LCTL(DV_V) // Windows/Linux Paste + +#define MC_PSCR LGUI(LSFT(KC_3)) // MacOS Print Screen (Command + Shift + 3) +#define MC_HOME LGUI(KC_LEFT) // MacOS Home (Command + Left Arrow) +#define MC_END LGUI(KC_RGHT) // MacOS End (Command + Right Arrow) +#define MC_SALL LGUI(KC_A) // MacOS Select All +//#define MC_UNDO LGUI(KC_Z) // MacOS Undo // replaced by macro +#define MC_CUT LGUI(KC_X) // MacOS Cut +#define MC_COPY LGUI(KC_C) // MacOS Copy +//#define MC_PSTE LGUI(KC_V) // MacOS Paste // replaced by macro + + +// MACRO DEFINITIONS +enum custom_keycodes { + F_CAPS = SAFE_RANGE, + T_L3DED, + G_PUSH, + G_FTCH, + G_COMM, + G_RST, + G_C10R, + G_BRCH, + SIGNA, + GO_Q2, + Q2_ON, + Q2_OFF, + Q2_ESC, + Q2_GRV, + MC_UNDO, + MC_PSTE +}; + + +// define modifiers +#define MODS_SHIFT_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) +#define MODS_CTRL_MASK (MOD_BIT(KC_LCTL)|MOD_BIT(KC_RCTRL)) +#define MODS_ALT_MASK (MOD_BIT(KC_LALT)|MOD_BIT(KC_RALT)) +#define MODS_GUI_MASK (MOD_BIT(KC_LGUI)|MOD_BIT(KC_RGUI)) + + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + uint8_t modifiers = get_mods(); + switch(keycode) { + // these are our macros! + case F_CAPS: + /* + Objective: write a macro that checks the current layers that are + enabled, and activates the appropriate function layer. + */ + if ( biton32(layer_state) == _MAC ) { + if (record->event.pressed) { + layer_on(_FUNCMAC); + } else { + layer_off(_FUNCMAC); + } + } else { + if (record->event.pressed) { + layer_on(_FUNCWIN); + } else { + layer_off(_FUNCWIN); + } + }; + return false; + break; + case T_L3DED: + if (record->event.pressed) { + SEND_STRING("lavak3DED "); + }; + return false; + break; + case G_PUSH: + if (record->event.pressed) { + SEND_STRING("git push origin "); + }; + return false; + break; + case G_FTCH: + if (record->event.pressed) { + SEND_STRING("git fetch upstream"); + }; + return false; + break; + case G_COMM: + if (record->event.pressed) { + SEND_STRING("git commit -m \"\"" SS_TAP(X_LEFT)); + layer_off(_MACROS); + }; + return false; + break; + case G_RST: + if (record->event.pressed) { + SEND_STRING("git histt -n 10" SS_TAP(X_ENTER) "git reset --soft "); + layer_off(_MACROS); + }; + return false; + break; + case G_C10R: + if (record->event.pressed) { + SEND_STRING("cf/"); + layer_off(_MACROS); + }; + return false; + break; + case G_BRCH: + if (record->event.pressed) { + SEND_STRING("$(git branch-name)"); + layer_off(_MACROS); + }; + return false; + break; + case SIGNA: + if (record->event.pressed) { + SEND_STRING("\\- @noroadsleft" SS_TAP(X_ENTER)); + layer_off(_MACROS); + }; + return false; + break; + case GO_Q2: + if (record->event.pressed) { + //default_layer_set(_QWERTY); + layer_move(_QWERTY); // TO(_QWERTY); + layer_on(_QUAKE2); + //layer_off(_SYSTEM); + }; + return false; + break; + case Q2_ON: + if (record->event.pressed) { + SEND_STRING(SS_TAP(X_ENTER)); + layer_on(_DVORAK); + layer_on(_QUAKE2_DVORAK); + }; + return false; + break; + case Q2_OFF: + if (record->event.pressed) { + SEND_STRING(SS_TAP(X_ENTER)); + layer_move(_QWERTY); // TO(_QWERTY); + layer_on(_QUAKE2); + }; + return false; + break; + case Q2_ESC: + if (record->event.pressed) { + SEND_STRING(SS_TAP(X_ESCAPE)); + layer_move(_QWERTY); // TO(_QWERTY); + layer_on(_QUAKE2); + }; + return false; + break; + case Q2_GRV: + if (record->event.pressed) { + SEND_STRING(SS_TAP(X_GRAVE)); + layer_on(_DVORAK); + layer_on(_QUAKE2_DVORAK); + layer_on(_QUAKE2_CONSOLE); + }; + return false; + break; + case MC_UNDO: + if (record->event.pressed) { + if ( modifiers & MODS_SHIFT_MASK ) { + SEND_STRING( SS_DOWN(X_LSHIFT) SS_DOWN(X_LGUI) SS_TAP(X_Z) SS_UP(X_LGUI) SS_UP(X_LSHIFT) ); + } else { + SEND_STRING( SS_DOWN(X_LGUI) SS_TAP(X_Z) SS_UP(X_LGUI) ); + } + }; + return false; + break; + case MC_PSTE: + if (record->event.pressed) { + if ( modifiers & MODS_SHIFT_MASK ) { + SEND_STRING( SS_DOWN(X_LSHIFT) SS_DOWN(X_LGUI) SS_DOWN(X_LALT) SS_TAP(X_V) SS_UP(X_LALT) SS_UP(X_LGUI) SS_UP(X_LSHIFT) ); + } else { + SEND_STRING( SS_DOWN(X_LGUI) SS_TAP(X_V) SS_UP(X_LGUI) ); + } + }; + return false; + break; + } // switch() + return true; +}; + + +// KEYMAPS +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /**************** + ** BASE LAYERS ** + ****************/ + + /* QWERTY */ + [_QWERTY] = LAYOUT_60_ansi( + // 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \ + FW_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(_FW), KC_RCTL \ + ), + + /* Dvorak */ + [_DVORAK] = LAYOUT_60_ansi( + // 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, KC_RBRC, KC_BSPC, \ + KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, KC_EQL, KC_BSLS, \ + FW_CAPS, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, KC_ENT, \ + KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(_FW), KC_RCTL \ + ), + + /* Colemak */ + [_COLEMAK] = LAYOUT_60_ansi( + // 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LBRC, KC_RBRC, KC_BSLS, \ + FW_CAPS, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(_FW), KC_RCTL \ + ), + + /**************** + ** OS OVERLAYS ** + ****************/ + + /* Mac */ + [_MAC] = LAYOUT_60_ansi( + // 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + FM_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, MO(_FM), _______ \ + ), + + /********************* + ** QUAKE 2 OVERLAYS ** + *********************/ + + /* Quake 2 */ + [_QUAKE2] = LAYOUT_60_ansi( + // 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + Q2_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, Q2_ON, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, MO(_FQ), _______ \ + ), + + [_QUAKE2_DVORAK] = LAYOUT_60_ansi( + // 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 + Q2_ESC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + Q2_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, Q2_OFF, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, MO(_FQ), _______ \ + ), + + [_QUAKE2_CONSOLE] = LAYOUT_60_ansi( + // 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 + Q2_ESC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + Q2_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_ENT, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, MO(_FQ), _______ \ + ), + + /******************** + ** FUNCTION LAYERS ** + ********************/ + + /* Windows Fn layer */ + [_FUNCWIN] = LAYOUT_60_ansi( + // 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, \ + _______, KC_CALC, KC_APP, _______, _______, _______, KC_INS, KC_HOME, KC_UP, KC_END, KC_PGUP, KC_PSCR, KC_SLCK, KC_PAUS, \ + NO_CHNG, WN_SALL, _______, _______, _______, _______, KC_DEL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______, KC_PENT, \ + _______, WN_UNDO, WN_CUT, WN_COPY, WN_PSTE, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, TG(_SY), _______, \ + _______, _______, _______, TG(_NP), _______, TG(_MA), NO_CHNG, _______ \ + ), + + /* MacOS Fn layer */ + [_FUNCMAC] = LAYOUT_60_ansi( + // 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, \ + _______, _______, _______, _______, _______, _______, KC_INS, MC_HOME, KC_UP, MC_END, KC_PGUP, MC_PSCR, _______, _______, \ + NO_CHNG, MC_SALL, _______, _______, _______, _______, KC_DEL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______, _______, \ + _______, MC_UNDO, MC_CUT, MC_COPY, MC_PSTE, _______, _______, _______, _______, _______, TG(_SY), _______, \ + _______, _______, _______, TG(_NP), _______, _______, NO_CHNG, _______ \ + ), + + /* Quake 2 Fn layer */ + [_FUNCQ2] = LAYOUT_60_ansi( + // 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 + Q2_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, \ + _______, _______, _______, _______, _______, _______, KC_INS, KC_HOME, KC_UP, KC_END, KC_PGUP, KC_PSCR, KC_SLCK, KC_PAUS, \ + NO_CHNG, _______, _______, _______, _______, _______, KC_DEL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______, KC_ENT, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, TG(_SY), _______, \ + _______, _______, _______, _______, _______, _______, NO_CHNG, _______ \ + ), + + /***************** + ** OTHER LAYERS ** + *****************/ + + /* Numpad layer */ + [_NUMPAD] = LAYOUT_60_ansi( + // 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 + _______, _______, _______, _______, _______, _______, _______, KC_P7, KC_P8, KC_P9, _______, _______, _______, _______, \ + _______, _______, _______, _______, KC_E, KC_F, _______, KC_P4, KC_P5, KC_P6, KC_PAST, KC_PSLS, KC_PEQL, _______, \ + _______, _______, _______, _______, KC_C, KC_D, _______, KC_P1, KC_P2, KC_P3, KC_PPLS, KC_PMNS, KC_PENT, \ + _______, _______, _______, _______, KC_A, KC_B, _______, KC_P0, _______, KC_PDOT, _______, _______, \ + _______, _______, _______, TG(_NP), _______, _______, NO_CHNG, _______ \ + ), + + /* Macro layer */ + [_MACROS] = LAYOUT_60_ansi( + // 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 + TG(_MA), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, G_PUSH, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, G_RST, G_FTCH, G_COMM, _______, _______, _______, _______, T_L3DED, _______, _______, _______, \ + _______, _______, _______, G_C10R, _______, G_BRCH, SIGNA, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, NO_CHNG, _______ \ + ), + + /* System layer */ + [_SYSTEM] = LAYOUT_60_ansi( + // 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 + TG(_SY), TO(_QW), TO(_DV), TO(_CM), GO_Q2, XXXXXXX, XXXXXXX, XXXXXXX, RESET, XXXXXXX, DEBUG, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, TG(_MC), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, BL_DEC, BL_TOGG, BL_INC, BL_BRTG, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, NO_CHNG, XXXXXXX \ + ), + +}; diff --git a/keyboards/kc60/keymaps/noroadsleft/readme.md b/keyboards/kc60/keymaps/noroadsleft/readme.md new file mode 100644 index 000000000..737fdc06b --- /dev/null +++ b/keyboards/kc60/keymaps/noroadsleft/readme.md @@ -0,0 +1,29 @@ +# @noroadsleft's KC60 keymap + +### Last updated: September 2, 2018, 1:03 PM UTC-0700 + +![](https://i.imgur.com/tzhXQYI.jpg) + +I am a full-time Dvorak typist, and occasional semi-serious FPS gamer. The layers are oriented towards a mix of typing and gaming. + + +---- + +# Outline + +- [Base Layers](./readme_ch1.md) + - Layer 0: QWERTY `_QW` + - Layer 1: Hardware Dvorak `_DV` + - Layer 2: Hardware Colemak `_CM` +- [OS Overlays](./readme_ch2.md) + - Layer 3: MacOS Overlay `_MC` +- [Quake 2 Overlays](./readme_ch3.md) + - Layers 4, 5 and 6: Quake 2 `_Q2`, Quake 2 Dvorak `_QD`, and Quake 2 Console `_QC` +- [Function Layers](./readme_ch4.md) + - Layer 7: Windows Fn layer `_FW` + - Layer 8: MacOS-oriented Fn layer `_FM` + - Layer 9: Quake 2 Fn layer `_FQ` +- [Other Layers](./readme_ch5.md) + - Layer 10: Numpad layer `_NP` + - Layer 11: Macro layer `_MA` + - Layer 12: System layer `_SY` diff --git a/keyboards/kc60/keymaps/noroadsleft/readme_ch1.md b/keyboards/kc60/keymaps/noroadsleft/readme_ch1.md new file mode 100644 index 000000000..bee0709f4 --- /dev/null +++ b/keyboards/kc60/keymaps/noroadsleft/readme_ch1.md @@ -0,0 +1,70 @@ +# @noroadsleft's KC60 keymap + +- [Table of Contents](./readme.md) + 1. **Base Layers** + 2. [**OS Overlays**](./readme_ch2.md) + 3. [Quake 2 Overlays](./readme_ch3.md) + 4. [Function Layers](./readme_ch4.md) + 5. [Other Layers](./readme_ch5.md) + +### Last updated: September 2, 2018, 1:03 PM UTC-0700 + + +---- + +## Layer 0: QWERTY - `_QW` + +Standard QWERTY layout, with three QMK features: + +- The `Menu` key has been replaced by `MO(_FW)`, which moves to my Windows Fn layer when held. +- The `Caps Lock` key has been replaced with a dual function `LT()` key, which opens the Windows Fn layer when held, and is `Caps Lock` when tapped +- The `Escape` key has been replaced with a `KC_GESC` `` ` ~ `` key when used with a `Fn` key or a `Shift` key + +###### For the rest of this readme, the physical location of keys will be referred to by their function in a US QWERTY layout. + +![QWERTY layer](https://i.imgur.com/2eVsefw.png) + +Keycode(s) Sent | Notes +:---------------------------------------------------- | :---- +[`KC_GESC`](https://docs.qmk.fm/#/feature_grave_esc) | `Esc` when tapped alone, `` ` ~ `` when used with a `Shift` or `GUI` key. +`LT(_FW, KC_CAPS)` | Opens the Windows Fn layer when held; toggles Caps Lock when tapped. +`MO(_FW)` | Opens the Windows Fn layer when held. + + +---- + +## Layer 1: Hardware Dvorak - `_DV` + +### Accessed by holding either `Fn` and tapping `/?` key, then tapping `2@`. + +A hardware-based Dvorak Simplified layout. At my weekend job, I use a shared computer that runs MacOS Sierra, in US QWERTY layout. In this layer, I can leave the system in QWERTY, plug my keyboard in, and still type in Dvorak. + +![Hardware Dvorak layer](https://i.imgur.com/a6hYedB.png) + +Keycode(s) Sent | Notes +:---------------------------------------------------- | :---- +[`KC_GESC`](https://docs.qmk.fm/#/feature_grave_esc) | `Esc` when tapped alone, `` ` ~ `` when used with a `Shift` or `GUI` key. +`LT(_FW, KC_CAPS)` | Opens the Windows Fn layer when held; toggles Caps Lock when tapped. +`MO(_FW)` | Opens the Windows Fn layer when held. + + +---- + +## Layer 2: Hardware Colemak `_CM` + +### Accessed by holding either `Fn` and tapping `/?` key, then tapping `3#`. + +A hardware-based Colemak layout. Been thinking of trying it, so it's here. + +![Hardware Colemak layer](https://i.imgur.com/dbQ6HDW.png) + +Keycode(s) Sent | Notes +:---------------------------------------------------- | :---- +[`KC_GESC`](https://docs.qmk.fm/#/feature_grave_esc) | `Esc` when tapped alone, `` ` ~ `` when used with a `Shift` or `GUI` key. +`LT(_FW, KC_CAPS)` | Opens the Windows Fn layer when held; toggles Caps Lock when tapped. +`MO(_FW)` | Opens the Windows Fn layer when held. + + +---- + +Next Chapter: [OS Overlays](./readme_ch2.md) diff --git a/keyboards/kc60/keymaps/noroadsleft/readme_ch2.md b/keyboards/kc60/keymaps/noroadsleft/readme_ch2.md new file mode 100644 index 000000000..75a4fc524 --- /dev/null +++ b/keyboards/kc60/keymaps/noroadsleft/readme_ch2.md @@ -0,0 +1,26 @@ +# @noroadsleft's KC60 keymap + +- [Table of Contents](./readme.md) + 1. [Base Layers](./readme_ch1.md) + 2. **OS Overlays** + 3. [Quake 2 Overlays](./readme_ch3.md) + 4. [Function Layers](./readme_ch4.md) + 5. [Other Layers](./readme_ch5.md) + +### Last updated: September 2, 2018, 1:03 PM UTC-0700 + + +---- + +## Layer 3: Layer 3: MacOS Overlay `_MC` + +### Toggled by holding either `Fn` and tapping `/?` key, then tapping `W`. + +This layer overrides the `Fn` keys on whichever base layer is currently enabled, sending the keyboard to the MacOS-oriented Fn layer `_FM`, instead of the Windows Fn layer `_FW`. + +![MacOS Overlay](https://i.imgur.com/lxsEVpm.png) + + +---- + +Next Chapter: [Quake 2 Overlays](./readme_ch3.md) diff --git a/keyboards/kc60/keymaps/noroadsleft/readme_ch3.md b/keyboards/kc60/keymaps/noroadsleft/readme_ch3.md new file mode 100644 index 000000000..80549ba5c --- /dev/null +++ b/keyboards/kc60/keymaps/noroadsleft/readme_ch3.md @@ -0,0 +1,39 @@ +# @noroadsleft's KC60 keymap + +- [Table of Contents](./readme.md) + 1. [Base Layers](./readme_ch1.md) + 2. [OS Overlays](./readme_ch2.md) + 3. **Quake 2 Overlays** + 4. [Function Layers](./readme_ch4.md) + 5. [Other Layers](./readme_ch5.md) + +### Last updated: September 2, 2018, 1:03 PM UTC-0700 + + +---- + +## Layers 4, 5 and 6: Quake 2 `_Q2`, Quake 2 Dvorak `_QD`, and Quake 2 Console `_QC` + +### Accessed by holding either `Fn` key and tapping the `/?` key, then tapping `4$` + +These layers were born out of the confusion I have had trying to use the in-game chat and the console in [Quake 2](https://en.wikipedia.org/wiki/Quake_II). When Quake 2 came out, alternate keyboard layouts weren't really a thing. As a result, all in-game text input is hard-locked to US QWERTY, regardless of what the operating system is using for its input method. + +I'm attempting to solve this by some creative use of QMK's macro feature. The keycode in the System layer that enables these layers, [`GO_Q2`](./keymap.c#L386), is a [macro](./keymap.c#L175-183) that sets the default layer to the QWERTY layer, then turns the Quake 2 layer `_Q2` on. The result is a partially-overwritten QWERTY layer, that has some keycodes with some creative layer switching. + +When I hit the `Enter` key (bound in-game to text chat), the [macro keycode](./keymap.c#L184-L191) I've created sends the keycode for `Enter`, then follows with enabling the Hardware Dvorak layer and its corresponding overlay. Now the game is in text chat mode, and my keyboard is in Dvorak. When I hit `Enter` again, another `Enter` [keycode macro](./keymap.c#L192-L199) is sent, which sends the message, then the macro brings me back to the standard QWERTY+Quake 2 setup. Hitting `Escape` instead runs a [macro](./keymap.c#L200-L207) that cancels the sending of the message, and undoes the layers. + +I have been testing this configuration for a few months. Sometimes I end up still in Dvorak mode without any text input systems (in-game chat or the console) running, but it pretty much always happens when I'm focused on the game, so I don't know the cause yet. + +### Layer 4: Quake 2 +![Quake 2](https://i.imgur.com/WEZ9p2u.png) + +### Layer 5: Quake 2 Dvorak +![Quake 2 Dvorak](https://i.imgur.com/rhugHN4.png) + +### Layer 6: Quake 2 Console +![Quake 2 Console](https://i.imgur.com/dRTAjcy.png) + + +---- + +Next Chapter: [Function Layers](./readme_ch4.md) diff --git a/keyboards/kc60/keymaps/noroadsleft/readme_ch4.md b/keyboards/kc60/keymaps/noroadsleft/readme_ch4.md new file mode 100644 index 000000000..f1b50846d --- /dev/null +++ b/keyboards/kc60/keymaps/noroadsleft/readme_ch4.md @@ -0,0 +1,54 @@ +# @noroadsleft's KC60 keymap + +- [Table of Contents](./readme.md) + 1. [Base Layers](./readme_ch1.md) + 2. [OS Overlays](./readme_ch2.md) + 3. [Quake 2 Overlays](./readme_ch3.md) + 4. **Function Layers** + 5. [Other Layers](./readme_ch5.md) + +### Last updated: September 2, 2018, 1:03 PM UTC-0700 + + +---- + +## Layer 7: Windows Fn layer - `_FW` + +### Accessed by holding either `Fn` key in Layer 0 + +Arrows, Navigation keys (Insert, Home, Page Up, etc.), and Function keys are here. Also has keys for Calculator, Menu, Volume Control, and shortcuts for Select All, Undo, Cut, Copy, and Paste. Numpad Enter for when I'm working in Adobe Photoshop, because it treats Numpad Enter differently from the regular Enter key. + +![Windows Fn layer](https://i.imgur.com/XwCshcz.png) + + +---- + +## Layer 8: MacOS-oriented Fn layer - `_FM` + +### Accessed by holding either `Fn` key in Layer 1 + +Based on my Windows Fn layer, but swaps a few functions for a MacOS environment. Arrow, Navigation, and Function keys are basically unchanged from Layer 2. This layer enables using either `Fn` key as a sort of simulated `Command` key, which I find easier to reach and use. + +![MacOS-oriented Fn layer](https://i.imgur.com/Z11kRu2.png) + + +---- + +## Layer 9: Quake 2 Fn layer - `_FQ` + +### Accessed by holding either `Fn` key while either Quake 2 overlay is active. + +Based on the Windows function layer, but removes some functions that are pointless to have while in the game. + +![Quake 2 Fn layer](https://i.imgur.com/9PG7yWb.png) + +Keycode(s) Sent | Notes +:-------------------------------- | :---- +[`Q2_GRV`](./keymap.c#L208-L216) | Sends `KC_GRV`, then enables the Dvorak, Quake 2 Dvorak, and Quake 2 Console layers. + + + + +---- + +Next Chapter: [Other Layers](./readme_ch5.md) diff --git a/keyboards/kc60/keymaps/noroadsleft/readme_ch5.md b/keyboards/kc60/keymaps/noroadsleft/readme_ch5.md new file mode 100644 index 000000000..64102eb88 --- /dev/null +++ b/keyboards/kc60/keymaps/noroadsleft/readme_ch5.md @@ -0,0 +1,84 @@ +# @noroadsleft's KC60 keymap + +- [Table of Contents](./readme.md) + 1. [Base Layers](./readme_ch1.md) + 2. [OS Overlays](./readme_ch2.md) + 3. [Quake 2 Overlays](./readme_ch3.md) + 4. [Function Layers](./readme_ch4.md) + 5. **Other Layers** + +### Last updated: September 2, 2018, 1:03 PM UTC-0700 + + +---- + +## Layer 10: Numpad layer - `_NP` + +### Accessed by holding either `Fn` key and tapping `Space`, from any of the Base Layers + +Puts a Numpad on the right-hand side of the keyboard. A through F included for hexadecimal input. Tapping `Space` returns to the previous Base Layer. + +![Numpad layer](https://i.imgur.com/fKVRkGH.png) + + +---- + +## Layer 11: Macro layer - `_MA` + +### Accessed by holding the `Fn` key and tapping the right-side `Win` key + +Has some macros that I use in Git, and some frequently-typed strings. + +Tapping `Esc` exits the Macro layer, if the macro used doesn't do it automatically. + +![Macro layer](https://i.imgur.com/wgbsluI.png) + + +### Macros + +[![lavak3DED](https://static-cdn.jtvnw.net/emoticons/v1/821796/1.0)](./keymap.c#L122-L127) +Inputs: `lavak3DED ` +Twitch emote for [a streamer I watch a lot](https://www.twitch.tv/lavak3_). + +[G_PUSH](./keymap.c#L128-L133) +Inputs: `git push origin ` +Everything from here down is related to Git or GitHub. + +[G_FTCH](./keymap.c#L134-L139) +Inputs: `git fetch upstream` + +[G_COMM](./keymap.c#L140-L146) +Inputs: `git commit -m ""` `[Left]` +Readies a `git commit` command, moves the cursor between the quotation marks, then disables the Macro layer. + +[G_RST](./keymap.c#L147-L153) +Inputs: `git histt -n 10`, Enter, `git reset --soft ` +Runs a [git alias](./readme_git.md) that shows my last ten commits, then readies a `git reset --soft`. For when I commit something too soon. Disables the Macro layer when complete. + +[G_C10R](./keymap.c#L154-L160) +Inputs: `cf/` +A branch prefix I use for my current work in QMK. Disables the Macro layer when finished. + +[G_BRCH](./keymap.c#L161-L167) +Inputs: `$(git branch-name)` +A [git alias](./readme_git.md) that returns the name of the current branch. Disables the Macro layer when finished. + +[SIGNA](./keymap.c#L168-L174) +Inputs: `\- @noroadsleft` `[Enter]` +Sometimes on GitHub, I sign my comments. Types my GitHub name in Markdown syntax, and then taps the `Enter` key. Disables the Macro layer when finished. + + +---- + +### Layer 12: System layer - `_SY` + +#### Accessed by holding either `Fn` key and tapping the `/?` key + +This is where I change my keyboard function. Base layer select on `1` through `3`, Backlight controls on `C` through `N`, Reset on `8*`, Debug on `0)`. + +![System layer](https://i.imgur.com/95ovTBn.png) + + +---- + +[Back to the index.](./) diff --git a/keyboards/kc60/keymaps/noroadsleft/readme_git.md b/keyboards/kc60/keymaps/noroadsleft/readme_git.md new file mode 100644 index 000000000..585d9c890 --- /dev/null +++ b/keyboards/kc60/keymaps/noroadsleft/readme_git.md @@ -0,0 +1,56 @@ +# @noroadsleft's Git aliases + +[Return to the directory index.](./) + +``` +[alias] + # change branches + co = checkout + cob = checkout -b + + # sync master + sync = "!f() { if [ $(git branch-name) != "master" ]; then git checkout master; fi; git pull upstream master; git push origin master; }; f" + + # Return the last five commits on the branch, in a more compact format + hist = log --pretty=format:\"%C(yellow)%h%Creset %Cgreen%ad%Creset%n %w(100,0,3)%s%d [%an]%n\" --graph --date=iso-local -n 5 + histm = log --pretty=format:\"%C(yellow)%h%Creset %w(100,0,3)%s%d [%an]\" --graph --date=iso-local -n 5 + histt = log --pretty=format:\"%C(yellow)%h%Creset %<(88,trunc)%s [%an]\" --graph --date=iso-local -n 5 + histb = log --reverse --pretty=format:\"- %<(98,trunc)%s [%an]\" --date=iso-local -n 5 + + # compact diff + df = "diff --compact-summary" + + # Short-form status + st = "!git status --short" + + # Returns the name of the current branch + branch-name = "!git rev-parse --abbrev-ref HEAD" + + # short-form of the above + bn = "!git branch-name" + + po = "push origin ($(git branch-name))" + + # List the stashes + sl = "stash list" + + # Show the contents of a numbered stash + # Syntax: + # git st-show + st-show = "!f() { git stash show stash@{$1} -p; }; f" + + # Apply a stash, without deleting it from the list of stashes + # Syntax: + # git st-copy + st-copy = "!f() { git stash apply stash@{$1}; }; f" + + # Unstage a file + unstage = "reset HEAD" + + # Restore a file to the state it was in when checked out + restore = "checkout --" + + # Compare local master repo to its upstream branch. If anything is returned, local branch has diverged from upstream. + cm = "!f() { git fetch upstream master; git diff $(git branch-name) upstream/master --compact-summary; }; f" + cml = "!f() { git fetch upstream master; git diff $(git branch-name) upstream/master; }; f" +``` diff --git a/keyboards/kc60/keymaps/noroadsleft/rules.mk b/keyboards/kc60/keymaps/noroadsleft/rules.mk new file mode 100644 index 000000000..9d78fc0fb --- /dev/null +++ b/keyboards/kc60/keymaps/noroadsleft/rules.mk @@ -0,0 +1,2 @@ +# https://github.com/qmk/qmk_firmware/issues/3448#issuecomment-406636125 +EXTRAFLAGS += -flto From 9d949389f92b6b397ed62246b60ead86d80a57a1 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 1 Oct 2018 08:09:05 -0700 Subject: [PATCH 194/788] Adds default value for TAPPING_TERM if Tap Dance is enabled (#2785) * Force require TAPPING_TERM if Tap Dance is enabled * Handle lack of TAPPING_TERM more gracefully --- quantum/process_keycode/process_tap_dance.c | 4 ++++ quantum/quantum.h | 6 ++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/quantum/process_keycode/process_tap_dance.c b/quantum/process_keycode/process_tap_dance.c index 833780691..b55ace5ba 100644 --- a/quantum/process_keycode/process_tap_dance.c +++ b/quantum/process_keycode/process_tap_dance.c @@ -16,6 +16,10 @@ #include "quantum.h" #include "action_tapping.h" +#ifndef TAPPING_TERM +#define TAPPING_TERM 200 +#endif + #ifndef NO_ACTION_ONESHOT uint8_t get_oneshot_mods(void); #endif diff --git a/quantum/quantum.h b/quantum/quantum.h index 683333211..87a61356c 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h @@ -31,7 +31,7 @@ #include "backlight.h" #endif #if !defined(RGBLIGHT_ENABLE) && !defined(RGB_MATRIX_ENABLE) - #include "rgb.h" + #include "rgb.h" #endif #ifdef RGBLIGHT_ENABLE #include "rgblight.h" @@ -108,7 +108,9 @@ extern uint32_t default_layer_state; #include "process_unicodemap.h" #endif -#include "process_tap_dance.h" +#ifdef TAP_DANCE_ENABLE + #include "process_tap_dance.h" +#endif #ifdef PRINTING_ENABLE #include "process_printer.h" From 3907ed034bec6730d8bff401ac632161540ea3cb Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 1 Oct 2018 08:09:57 -0700 Subject: [PATCH 195/788] Fix YMDK NP21 keyboard to use proper keyboard level functions (#3042) * Use proper function levels * Add matrix init functions * Convert KEYMAP to LAYOUT Or @mechmerlin is going to hunt me down and harm me... probably :) * Fix conflict issues --- keyboards/ymdk_np21/keymaps/default/keymap.c | 7 +++---- keyboards/ymdk_np21/matrix.c | 11 +++++++++++ keyboards/ymdk_np21/ymdk_np21.c | 6 ++++-- keyboards/ymdk_np21/ymdk_np21.h | 4 +--- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/keyboards/ymdk_np21/keymaps/default/keymap.c b/keyboards/ymdk_np21/keymaps/default/keymap.c index e79d326b7..3ade30479 100644 --- a/keyboards/ymdk_np21/keymaps/default/keymap.c +++ b/keyboards/ymdk_np21/keymaps/default/keymap.c @@ -1,5 +1,4 @@ -#include "ymdk_np21.h" -#include "action_layer.h" +#include QMK_KEYBOARD_H #define _NP 0 #define _BL 1 @@ -21,7 +20,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Enter| Enter| + | + | - | FN | * `-----------------------------------------' */ -[_NP] = KEYMAP( \ +[_NP] = LAYOUT( \ KC_KP_0, KC_KP_1, KC_KP_4, KC_KP_7, KC_NUMLOCK, KC_ESC, \ KC_DOT, KC_KP_2, KC_KP_5, KC_KP_8, KC_KP_SLASH, KC_TAB, \ KC_KP_DOT, KC_KP_3, KC_KP_6, KC_KP_9, KC_KP_ASTERISK, KC_BSPACE, \ @@ -38,7 +37,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | BL_DEC | BL_DEC | BL_INC | BL_INC | | | * `---------------------------------------------' */ -[_BL] = KEYMAP( \ +[_BL] = LAYOUT( \ BL_BRTG, _______, _______, _______, _______, _______, \ _______, BL_OFF, BL_TOGG, BL_ON, _______, _______, \ _______, _______, _______, _______, _______, _______, \ diff --git a/keyboards/ymdk_np21/matrix.c b/keyboards/ymdk_np21/matrix.c index a9e9cb539..b2bfb2f0b 100644 --- a/keyboards/ymdk_np21/matrix.c +++ b/keyboards/ymdk_np21/matrix.c @@ -91,12 +91,23 @@ uint8_t matrix_scan(void) { return 1; } +__attribute__ ((weak)) +void matrix_scan_user(void) {}; + +__attribute__ ((weak)) void matrix_scan_kb(void) { // Looping keyboard code goes here // This runs every cycle (a lot) matrix_scan_user(); }; +__attribute__ ((weak)) +void matrix_init_user(void) {}; + +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} // declarations void matrix_set_row_status(uint8_t row) { DDRB = (1 << row); diff --git a/keyboards/ymdk_np21/ymdk_np21.c b/keyboards/ymdk_np21/ymdk_np21.c index 670083a11..c1b11b404 100644 --- a/keyboards/ymdk_np21/ymdk_np21.c +++ b/keyboards/ymdk_np21/ymdk_np21.c @@ -34,7 +34,7 @@ extern rgblight_config_t rgblight_config; // @Override void matrix_init_kb(void) { // call user level keymaps, if any - // matrix_init_user(); + matrix_init_user(); } #ifdef BACKLIGHT_ENABLE @@ -67,7 +67,7 @@ void rgblight_set(void) { } bool rgb_init = false; -void matrix_scan_user(void) { +void matrix_scan_kb(void) { // if LEDs were previously on before poweroff, turn them back on if (rgb_init == false && rgblight_config.enable) { i2c_init(); @@ -77,4 +77,6 @@ void matrix_scan_user(void) { rgblight_task(); /* Nothing else for now. */ + + matrix_scan_user(); } diff --git a/keyboards/ymdk_np21/ymdk_np21.h b/keyboards/ymdk_np21/ymdk_np21.h index babdc8483..728406d6e 100644 --- a/keyboards/ymdk_np21/ymdk_np21.h +++ b/keyboards/ymdk_np21/ymdk_np21.h @@ -25,7 +25,7 @@ along with this program. If not, see . void matrix_init_user(void); // TODO port this to other PS2AVRGB boards -#define KEYMAP_GRID( \ +#define LAYOUT( \ K01, K02, K03, K04, K05, K06, \ K11, K12, K13, K14, K15, K16, \ K21, K22, K23, K24, K25, K26, \ @@ -38,6 +38,4 @@ void matrix_init_user(void); // TODO port this to other PS2AVRGB boards { K36, K35, K34, K33, K32, K31 } \ } -#define KEYMAP KEYMAP_GRID - #endif From 45a4a0a7fc32f521ad6487c19201340b81aaad5c Mon Sep 17 00:00:00 2001 From: Andrew Kannan Date: Mon, 1 Oct 2018 12:25:16 -0400 Subject: [PATCH 196/788] Keyboard: Adding initial luddite keyboard framework (#4029) * Adding initial luddite keyboard framework * Use pragma and update readme * Remove duplicate macro definitions --- keyboards/luddite/README.md | 18 +++++++ keyboards/luddite/config.h | 48 ++++++++++++++++++ keyboards/luddite/keymaps/default/keymap.c | 32 ++++++++++++ keyboards/luddite/luddite.c | 1 + keyboards/luddite/luddite.h | 21 ++++++++ keyboards/luddite/rules.mk | 59 ++++++++++++++++++++++ 6 files changed, 179 insertions(+) create mode 100644 keyboards/luddite/README.md create mode 100644 keyboards/luddite/config.h create mode 100644 keyboards/luddite/keymaps/default/keymap.c create mode 100644 keyboards/luddite/luddite.c create mode 100644 keyboards/luddite/luddite.h create mode 100644 keyboards/luddite/rules.mk diff --git a/keyboards/luddite/README.md b/keyboards/luddite/README.md new file mode 100644 index 000000000..72666dda5 --- /dev/null +++ b/keyboards/luddite/README.md @@ -0,0 +1,18 @@ +# Luddite + +Luddite 60% keyboard with backlight and RGB underglow. + +* [The original TMK firmware](https://github.com/di0ib/tmk_keyboard/tree/master/keyboard/luddite) + +Keyboard Maintainer: QMK Community +Hardware Supported: Luddite PCB +Hardware Availability: [Luddite project on 40% Keyboards](http://www.40percent.club/search/label/luddite) + +Make example for this keyboard (after setting up your build environment): + + make luddite:default + +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). + +First pass at adding support for the luddite keyboard. Compiles but completely +untested. Intended to kick-start development. diff --git a/keyboards/luddite/config.h b/keyboards/luddite/config.h new file mode 100644 index 000000000..62ff72bb0 --- /dev/null +++ b/keyboards/luddite/config.h @@ -0,0 +1,48 @@ +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0A0C +#define DEVICE_VER 0x1001 +#define MANUFACTURER di0ib +#define PRODUCT Luddite +#define DESCRIPTION Luddite Keyboard + +/* key matrix size */ +#define MATRIX_ROWS 8 +#define MATRIX_COLS 8 + +/* key matrix pins */ +#define MATRIX_ROW_PINS { D3, D2, D1, D0, D4, C6, D7, E6 } +#define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3, B2, B6 } +#define UNUSED_PINS + +/* number of backlight levels */ +#define BACKLIGHT_PIN B5 +#ifdef BACKLIGHT_PIN +#define BACKLIGHT_LEVELS 4 +#endif + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCING_DELAY 5 + +/* 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 + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* ws2812 RGB LED */ +#define RGB_DI_PIN B4 +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 8 // Number of LEDs +// #define RGBLIGHT_HUE_STEP 10 +// #define RGBLIGHT_SAT_STEP 17 +// #define RGBLIGHT_VAL_STEP 17 diff --git a/keyboards/luddite/keymaps/default/keymap.c b/keyboards/luddite/keymaps/default/keymap.c new file mode 100644 index 000000000..4d6ae0d52 --- /dev/null +++ b/keyboards/luddite/keymaps/default/keymap.c @@ -0,0 +1,32 @@ +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _BASE 0 +#define _FN1 1 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE] = LAYOUT_60_ansi( + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \ + KC_LCTL , KC_LGUI , KC_LALT , KC_SPC , KC_RALT , KC_RGUI , MO(_FN1) , KC_RCTL + ), + + [_FN1] = LAYOUT_60_ansi( + KC_GESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_BSPC, \ + RGB_TOG, RGB_MOD, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______,\ + BL_INC, BL_DEC, BL_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + KC_GRV, _______, _______, _______, _______, _______, _______, _______ + ) +}; diff --git a/keyboards/luddite/luddite.c b/keyboards/luddite/luddite.c new file mode 100644 index 000000000..3e720ad57 --- /dev/null +++ b/keyboards/luddite/luddite.c @@ -0,0 +1 @@ +#include "luddite.h" diff --git a/keyboards/luddite/luddite.h b/keyboards/luddite/luddite.h new file mode 100644 index 000000000..1ba743e9e --- /dev/null +++ b/keyboards/luddite/luddite.h @@ -0,0 +1,21 @@ +#pragma once + +#include "quantum.h" + +#define LAYOUT_60_ansi( \ + K00, K01, K02, K03, K04, K05, K06, K07, K10, K11, K12, K13, K14, K15, \ + K16, K17, K20, K21, K22, K23, K24, K25, K26, K27, K30, K31, K32, K33, \ + K34, K35, K36, K37, K40, K41, K42, K43, K44, K45, K46, K47, K50, \ + K51, K52, K53, K54, K55, K56, K57, K60, K61, K62, K63, K64, \ + K65, K66, K67, K70, K71, K72, K73, K74\ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07 }, \ + { K10, K11, K12, K13, K14, K15, K16, K17 }, \ + { K20, K21, K22, K23, K24, K25, K26, K27 }, \ + { K30, K31, K32, K33, K34, K35, K36, K37 }, \ + { K40, K41, K42, K43, K44, K45, K46, K47 }, \ + { K50, K51, K52, K53, K54, K55, K56, K57 }, \ + { K60, K61, K62, K63, K64, K65, K66, K67 }, \ + { K70, K71, K72, K73, K74 }, \ +} + diff --git a/keyboards/luddite/rules.mk b/keyboards/luddite/rules.mk new file mode 100644 index 000000000..2f7d847bf --- /dev/null +++ b/keyboards/luddite/rules.mk @@ -0,0 +1,59 @@ +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Bootloader +# This definition is optional, and if your keyboard supports multiple bootloaders of +# different sizes, comment this out, and the correct address will be loaded +# automatically (+60). See bootloader.mk for all options. +BOOTLOADER = caterina + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + +# Build Options +# comment out to disable the options. +# +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +AUDIO_ENABLE = no +RGBLIGHT_ENABLE = yes + +LAYOUTS = 60_ansi From 285ed08867931e967d2660f6179a57d247191d4c Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Mon, 1 Oct 2018 09:34:20 -0700 Subject: [PATCH 197/788] Keyboard: Rename macropad to treasure/type9 (#4035) * rename macropad keyboard to type9 under the treasure directory * fixup the readme * rename macropad to type9 * moar renames --- keyboards/macropad/keymaps/default/readme.md | 1 - keyboards/{macropad => treasure/type9}/config.h | 2 +- keyboards/{macropad => treasure/type9}/info.json | 2 +- .../{macropad => treasure/type9}/keymaps/default/config.h | 0 .../{macropad => treasure/type9}/keymaps/default/keymap.c | 0 keyboards/treasure/type9/keymaps/default/readme.md | 1 + keyboards/{macropad => treasure/type9}/readme.md | 4 ++-- keyboards/{macropad => treasure/type9}/rules.mk | 0 keyboards/{macropad/macropad.c => treasure/type9/type9.c} | 2 +- keyboards/{macropad/macropad.h => treasure/type9/type9.h} | 4 ++-- 10 files changed, 8 insertions(+), 8 deletions(-) delete mode 100644 keyboards/macropad/keymaps/default/readme.md rename keyboards/{macropad => treasure/type9}/config.h (99%) rename keyboards/{macropad => treasure/type9}/info.json (90%) rename keyboards/{macropad => treasure/type9}/keymaps/default/config.h (100%) rename keyboards/{macropad => treasure/type9}/keymaps/default/keymap.c (100%) create mode 100644 keyboards/treasure/type9/keymaps/default/readme.md rename keyboards/{macropad => treasure/type9}/readme.md (92%) rename keyboards/{macropad => treasure/type9}/rules.mk (100%) rename keyboards/{macropad/macropad.c => treasure/type9/type9.c} (98%) rename keyboards/{macropad/macropad.h => treasure/type9/type9.h} (96%) diff --git a/keyboards/macropad/keymaps/default/readme.md b/keyboards/macropad/keymaps/default/readme.md deleted file mode 100644 index bd3d78af2..000000000 --- a/keyboards/macropad/keymaps/default/readme.md +++ /dev/null @@ -1 +0,0 @@ -# The default keymap for macropad diff --git a/keyboards/macropad/config.h b/keyboards/treasure/type9/config.h similarity index 99% rename from keyboards/macropad/config.h rename to keyboards/treasure/type9/config.h index 00f2e7811..55f0a8595 100644 --- a/keyboards/macropad/config.h +++ b/keyboards/treasure/type9/config.h @@ -24,7 +24,7 @@ along with this program. If not, see . #define PRODUCT_ID 0x0000 #define DEVICE_VER 0x0001 #define MANUFACTURER Treasure -#define PRODUCT Macropad Type 9 +#define PRODUCT Type 9 #define DESCRIPTION A custom macropad /* key matrix size */ diff --git a/keyboards/macropad/info.json b/keyboards/treasure/type9/info.json similarity index 90% rename from keyboards/macropad/info.json rename to keyboards/treasure/type9/info.json index f946ed153..7e7b1d0bd 100644 --- a/keyboards/macropad/info.json +++ b/keyboards/treasure/type9/info.json @@ -1,5 +1,5 @@ { - "keyboard_name": "Macropad", + "keyboard_name": "Type-9", "url": "", "maintainer": "qmk", "width": 3, diff --git a/keyboards/macropad/keymaps/default/config.h b/keyboards/treasure/type9/keymaps/default/config.h similarity index 100% rename from keyboards/macropad/keymaps/default/config.h rename to keyboards/treasure/type9/keymaps/default/config.h diff --git a/keyboards/macropad/keymaps/default/keymap.c b/keyboards/treasure/type9/keymaps/default/keymap.c similarity index 100% rename from keyboards/macropad/keymaps/default/keymap.c rename to keyboards/treasure/type9/keymaps/default/keymap.c diff --git a/keyboards/treasure/type9/keymaps/default/readme.md b/keyboards/treasure/type9/keymaps/default/readme.md new file mode 100644 index 000000000..94784bacc --- /dev/null +++ b/keyboards/treasure/type9/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for Type-9 diff --git a/keyboards/macropad/readme.md b/keyboards/treasure/type9/readme.md similarity index 92% rename from keyboards/macropad/readme.md rename to keyboards/treasure/type9/readme.md index 204ec1fd2..7c567f91b 100644 --- a/keyboards/macropad/readme.md +++ b/keyboards/treasure/type9/readme.md @@ -1,4 +1,4 @@ -# Macropad +# Type-9 3x3 Macropad. @@ -8,6 +8,6 @@ Hardware Availability: [Treasure](http://macropad.co/) Make example for this keyboard (after setting up your build environment): - make macropad:default + make treasure/type9:default 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). diff --git a/keyboards/macropad/rules.mk b/keyboards/treasure/type9/rules.mk similarity index 100% rename from keyboards/macropad/rules.mk rename to keyboards/treasure/type9/rules.mk diff --git a/keyboards/macropad/macropad.c b/keyboards/treasure/type9/type9.c similarity index 98% rename from keyboards/macropad/macropad.c rename to keyboards/treasure/type9/type9.c index 0219746e1..58a9c8f52 100644 --- a/keyboards/macropad/macropad.c +++ b/keyboards/treasure/type9/type9.c @@ -13,7 +13,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#include "macropad.h" +#include "type9.h" void matrix_init_kb(void) { // put your keyboard start-up code here diff --git a/keyboards/macropad/macropad.h b/keyboards/treasure/type9/type9.h similarity index 96% rename from keyboards/macropad/macropad.h rename to keyboards/treasure/type9/type9.h index 94471d7c5..4e3c235d1 100644 --- a/keyboards/macropad/macropad.h +++ b/keyboards/treasure/type9/type9.h @@ -13,8 +13,8 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#ifndef MACROPAD_H -#define MACROPAD_H +#ifndef TYPE9_H +#define TYPE9_H #include "quantum.h" From b3f6aa9480a5ddb0b0ba0d611d988121c0ff848b Mon Sep 17 00:00:00 2001 From: Anthony Som Date: Mon, 1 Oct 2018 17:39:45 +0100 Subject: [PATCH 198/788] Correct small typo A small typo (it -> in) that I noticed while reading through the documentation --- docs/flashing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/flashing.md b/docs/flashing.md index 66c08a361..1edbe2225 100644 --- a/docs/flashing.md +++ b/docs/flashing.md @@ -2,7 +2,7 @@ There are quite a few different types of bootloaders that keyboards use, and just about all of the use a different flashing method. Luckily, projects like the [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) aim to be compatible with all the different types without having to think about it much, but this article will describe the different types of bootloaders, and available methods for flashing them. -If you have a bootloader selected with the `BOOTLOADER` variable in your `rules.mk`, QMK will automatically calculate if your .hex file is the right size to be flashed to the device, and output the total size it bytes (along with the max). To run this process manually, compile with the target `check-size`, eg `make planck/rev4:default:check-size`. +If you have a bootloader selected with the `BOOTLOADER` variable in your `rules.mk`, QMK will automatically calculate if your .hex file is the right size to be flashed to the device, and output the total size in bytes (along with the max). To run this process manually, compile with the target `check-size`, eg `make planck/rev4:default:check-size`. ## DFU From da6c58175a74e4bb5a6c67f7e8b63567c14800d7 Mon Sep 17 00:00:00 2001 From: Daniel Shields Date: Fri, 28 Sep 2018 09:33:51 +0100 Subject: [PATCH 199/788] Make digital rain RGB matrix effect #define configurable. --- docs/feature_rgb_matrix.md | 1 + keyboards/model01/keymaps/dshields/config.h | 1 + keyboards/planck/keymaps/dshields/config.h | 1 + quantum/rgb_matrix.c | 8 ++++++-- 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/docs/feature_rgb_matrix.md b/docs/feature_rgb_matrix.md index 4f827f8dc..809d034bd 100644 --- a/docs/feature_rgb_matrix.md +++ b/docs/feature_rgb_matrix.md @@ -140,6 +140,7 @@ These are the effects that are currently available: RGB_MATRIX_RAINBOW_PINWHEELS, RGB_MATRIX_RAINBOW_MOVING_CHEVRON, RGB_MATRIX_JELLYBEAN_RAINDROPS, + RGB_MATRIX_DIGITAL_RAIN, #ifdef RGB_MATRIX_KEYPRESSES RGB_MATRIX_SOLID_REACTIVE, RGB_MATRIX_SPLASH, diff --git a/keyboards/model01/keymaps/dshields/config.h b/keyboards/model01/keymaps/dshields/config.h index 4d609e436..4de2d3cbb 100644 --- a/keyboards/model01/keymaps/dshields/config.h +++ b/keyboards/model01/keymaps/dshields/config.h @@ -1,5 +1,6 @@ #pragma once +#define RGB_DIGITAL_RAIN_DROPS 18 #define USB_MAX_POWER_CONSUMPTION 100 #define ONESHOT_TAP_TOGGLE 2 #define ONESHOT_TIMEOUT 3000 diff --git a/keyboards/planck/keymaps/dshields/config.h b/keyboards/planck/keymaps/dshields/config.h index b149530b8..512e2fbc6 100644 --- a/keyboards/planck/keymaps/dshields/config.h +++ b/keyboards/planck/keymaps/dshields/config.h @@ -1,5 +1,6 @@ #pragma once +#define RGB_DIGITAL_RAIN_DROPS 24 #define USB_MAX_POWER_CONSUMPTION 100 #define ONESHOT_TAP_TOGGLE 2 #define ONESHOT_TIMEOUT 3000 diff --git a/quantum/rgb_matrix.c b/quantum/rgb_matrix.c index b282284a1..f0c2ddfdf 100644 --- a/quantum/rgb_matrix.c +++ b/quantum/rgb_matrix.c @@ -50,6 +50,11 @@ rgb_config_t rgb_matrix_config; #define RGB_MATRIX_MAXIMUM_BRIGHTNESS 255 #endif +#ifndef RGB_DIGITAL_RAIN_DROPS + // lower the number for denser effect/wider keyboard + #define RGB_DIGITAL_RAIN_DROPS 24 +#endif + bool g_suspend_state = false; // Global tick at 20 Hz @@ -466,7 +471,6 @@ void rgb_matrix_jellybean_raindrops( bool initialize ) { void rgb_matrix_digital_rain( const bool initialize ) { // algorithm ported from https://github.com/tremby/Kaleidoscope-LEDEffect-DigitalRain const uint8_t drop_ticks = 28; - const uint8_t new_drop_probability = 24; const uint8_t pure_green_intensity = 0xd0; const uint8_t max_brightness_boost = 0xc0; const uint8_t max_intensity = 0xff; @@ -481,7 +485,7 @@ void rgb_matrix_digital_rain( const bool initialize ) { } for (uint8_t col = 0; col < MATRIX_COLS; col++) { for (uint8_t row = 0; row < MATRIX_ROWS; row++) { - if (row == 0 && drop == 0 && rand() < RAND_MAX / new_drop_probability) { + if (row == 0 && drop == 0 && rand() < RAND_MAX / RGB_DIGITAL_RAIN_DROPS) { // top row, pixels have just fallen and we're // making a new rain drop in this column map[col][row] = max_intensity; From 4318797d198b58bb807b3e436c7d8924d8b4a6fe Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 27 Aug 2018 09:16:54 -0700 Subject: [PATCH 200/788] Add user level to default_layer_state_set --- tmk_core/common/action_layer.c | 11 ++++++++++- tmk_core/common/action_layer.h | 2 ++ users/drashna/drashna.c | 4 ++-- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/tmk_core/common/action_layer.c b/tmk_core/common/action_layer.c index 62375dfbf..b8dcb34f3 100644 --- a/tmk_core/common/action_layer.c +++ b/tmk_core/common/action_layer.c @@ -15,13 +15,22 @@ */ uint32_t default_layer_state = 0; +/** \brief Default Layer State Set At user Level + * + * FIXME: Needs docs + */ +__attribute__((weak)) +uint32_t default_layer_state_set_user(uint32_t state) { + return state; +} + /** \brief Default Layer State Set At Keyboard Level * * FIXME: Needs docs */ __attribute__((weak)) uint32_t default_layer_state_set_kb(uint32_t state) { - return state; + return default_layer_state_set_user(state); } /** \brief Default Layer State Set diff --git a/tmk_core/common/action_layer.h b/tmk_core/common/action_layer.h index 7bf116be2..6d48321f9 100644 --- a/tmk_core/common/action_layer.h +++ b/tmk_core/common/action_layer.h @@ -31,6 +31,8 @@ void default_layer_set(uint32_t state); __attribute__((weak)) uint32_t default_layer_state_set_kb(uint32_t state); +__attribute__((weak)) +uint32_t default_layer_state_set_user(uint32_t state); #ifndef NO_ACTION_LAYER /* bitwise operation */ diff --git a/users/drashna/drashna.c b/users/drashna/drashna.c index 7bb272a26..9489fb456 100644 --- a/users/drashna/drashna.c +++ b/users/drashna/drashna.c @@ -403,8 +403,8 @@ uint32_t layer_state_set_user(uint32_t state) { } -uint32_t default_layer_state_set_kb(uint32_t state) { - return default_layer_state_set_keymap (state); +uint32_t default_layer_state_set_user(uint32_t state) { + return default_layer_state_set_keymap(state); } From e885c793bcffcba03e18e93e41120b21cdfb6b75 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 1 Oct 2018 17:53:14 -0700 Subject: [PATCH 201/788] Add Function level EECONFIG code for EEPROM (#3084) * Add Function level EEPROM configuration Add kb and user functions for EEPROM, and example of how to use it. * Bug fixes and demo * Additional cleanup * Add EEPROM reset macro to example * Forgot init function in list * Move eeconfig_init_quantum function to quantum.c and actually set default layer * See if removing weak quantum function fixes issue * Fix travis compile error * Remove ifdef blocks from EECONFIG so settings are always set * Fix for ARM EEPROM updates * Fix merge issues * Fix potential STM32 EEPROM issues --- docs/custom_quantum_functions.md | 140 +++++++++ .../ergodox_ez/keymaps/rgb_layer/config.h | 24 ++ .../ergodox_ez/keymaps/rgb_layer/keymap.c | 271 ++++++++++++++++++ quantum/quantum.c | 3 + tmk_core/common/eeconfig.c | 107 +++++-- tmk_core/common/eeconfig.h | 44 ++- 6 files changed, 547 insertions(+), 42 deletions(-) create mode 100644 keyboards/ergodox_ez/keymaps/rgb_layer/config.h create mode 100644 keyboards/ergodox_ez/keymaps/rgb_layer/keymap.c diff --git a/docs/custom_quantum_functions.md b/docs/custom_quantum_functions.md index 10c5c75a2..f8b84cd6b 100644 --- a/docs/custom_quantum_functions.md +++ b/docs/custom_quantum_functions.md @@ -244,3 +244,143 @@ uint32_t layer_state_set_user(uint32_t state) { * Keymap: `uint32_t layer_state_set_user(uint32_t state)` The `state` is the bitmask of the active layers, as explained in the [Keymap Overview](keymap.md#keymap-layer-status) + + +# Persistent Configuration (EEPROM) + +This allows you to configure persistent settings for your keyboard. These settings are stored in the EEPROM of your controller, and are retained even after power loss. The settings can be read with `eeconfig_read_kb` and `eeconfig_read_user`, and can be written to using `eeconfig_update_kb` and `eeconfig_update_user`. This is useful for features that you want to be able to toggle (like toggling rgb layer indication). Additionally, you can use `eeconfig_init_kb` and `eeconfig_init_user` to set the default values for the EEPROM. + +The complicated part here, is that there are a bunch of ways that you can store and access data via EEPROM, and there is no "correct" way to do this. However, you only have a DWORD (4 bytes) for each function. + +Keep in mind that EEPROM has a limited number of writes. While this is very high, it's not the only thing writing to the EEPROM, and if you write too often, you can potentially drastically shorten the life of your MCU. + +* If you don't understand the example, then you may want to avoid using this feature, as it is rather complicated. + +### Example Implementation + +This is an example of how to add settings, and read and write it. We're using the user keymap for the example here. This is a complex function, and has a lot going on. In fact, it uses a lot of the above functions to work! + + +In your keymap.c file, add this to the top: +``` +typedef union { + uint32_t raw; + struct { + bool rgb_layer_change :1; + }; +} user_config_t; + +user_config_t user_config; +``` + +This sets up a 32 bit structure that we can store settings with in memory, and write to the EEPROM. Using this removes the need to define variables, since they're defined in this structure. Remember that `bool` (boolean) values use 1 bit, `uint8_t` uses 8 bits, `uint16_t` uses up 16 bits. You can mix and match, but changing the order can cause issues, as it will change the values that are read and written. + +We're using `rgb_layer_change`, for the `layer_state_set_*` function, and use `matrix_init_user` and `process_record_user` to configure everything. + +Now, using the `matrix_init_user` code above, you want to add `eeconfig_read_user()` to it, to populate the structure you've just created. And you can then immediately use this structure to control functionality in your keymap. And It should look like: +``` +void matrix_init_user(void) { + // Call the keymap level matrix init. + + // Read the user config from EEPROM + user_config.raw = eeconfig_read_user(); + + // Set default layer, if enabled + if (user_config.rgb_layer_change) { + rgblight_enable_noeeprom(); + rgblight_sethsv_noeeprom_cyan(); + rgblight_mode_noeeprom(1); + } +} +``` +The above function will use the EEPROM config immediately after reading it, to set the default layer's RGB color. The "raw" value of it is converted in a usable structure based on the "union" that you created above. + +``` +uint32_t layer_state_set_user(uint32_t state) { + switch (biton32(state)) { + case _RAISE: + if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_magenta(); rgblight_mode_noeeprom(1); } + break; + case _LOWER: + if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_red(); rgblight_mode_noeeprom(1); } + break; + case _PLOVER: + if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_green(); rgblight_mode_noeeprom(1); } + break; + case _ADJUST: + if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_white(); rgblight_mode_noeeprom(1); } + break; + default: // for any other layers, or the default layer + if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_cyan(); rgblight_mode_noeeprom(1); } + break; + } + return state; +} +``` +This will cause the RGB underglow to be changed ONLY if the value was enabled. Now to configure this value, create a new keycode for `process_record_user` called `RGB_LYR` and `EPRM`. Additionally, we want to make sure that if you use the normal RGB codes, that it turns off Using the example above, make it look this: +``` + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case FOO: + if (record->event.pressed) { + // Do something when pressed + } else { + // Do something else when release + } + return false; // Skip all further processing of this key + case KC_ENTER: + // Play a tone when enter is pressed + if (record->event.pressed) { + PLAY_NOTE_ARRAY(tone_qwerty); + } + return true; // Let QMK send the enter press/release events + case EPRM: + if (record->event.pressed) { + eeconfig_init(); // resets the EEPROM to default + } + return false; + case RGB_LYR: // This allows me to use underglow as layer indication, or as normal + if (record->event.pressed) { + user_config.rgb_layer_change ^= 1; // Toggles the status + eeconfig_update_user(user_config.raw); // Writes the new status to EEPROM + if (user_config.rgb_layer_change) { // if layer state indication is enabled, + layer_state_set(layer_state); // then immediately update the layer color + } + } + return false; break; + case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // For any of the RGB codes (see quantum_keycodes.h, L400 for reference) + if (record->event.pressed) { //This disables layer indication, as it's assumed that if you're changing this ... you want that disabled + if (user_config.rgb_layer_change) { // only if this is enabled + user_config.rgb_layer_change = false; // disable it, and + eeconfig_update_user(user_config.raw); // write the setings to EEPROM + } + } + return true; break; + default: + return true; // Process all other keycodes normally + } +} +``` +And lastly, you want to add the `eeconfig_init_user` function, so that when the EEPROM is reset, you can specify default values, and even custom actions. For example, if you want to set rgb layer indication by default, and save the default valued. + +``` +void eeconfig_init_user(void) { // EEPROM is getting reset! + user_config.rgb_layer_change = true; // We want this enabled by default + eeconfig_update_user(user_config.raw); // Write default value to EEPROM now + + // use the non noeeprom versions, to write these values to EEPROM too + rgblight_enable(); // Enable RGB by default + rgblight_sethsv_cyan(); // Set it to CYAN by default + rgblight_mode(1); // set to solid by default +} +``` + +And you're done. The RGB layer indication will only work if you want it to. And it will be saved, even after unplugging the board. And if you use any of the RGB codes, it will disable the layer indication, so that it stays on the mode and color that you set it to. + +### 'EECONFIG' Function Documentation + +* Keyboard/Revision: `void eeconfig_init_kb(void)`, `uint32_t eeconfig_read_kb(void)` and `void eeconfig_update_kb(uint32_t val)` +* Keymap: `void eeconfig_init_user(void)`, `uint32_t eeconfig_read_user(void)` and `void eeconfig_update_user(uint32_t val)` + +The `val` is the value of the data that you want to write to EEPROM. And the `eeconfig_read_*` function return a 32 bit (DWORD) value from the EEPROM. diff --git a/keyboards/ergodox_ez/keymaps/rgb_layer/config.h b/keyboards/ergodox_ez/keymaps/rgb_layer/config.h new file mode 100644 index 000000000..59302b800 --- /dev/null +++ b/keyboards/ergodox_ez/keymaps/rgb_layer/config.h @@ -0,0 +1,24 @@ +#ifndef KEYMAP_CONFIG_H +#define KEYMAP_CONFIG_H + + + #define RGBLIGHT_SLEEP + + +#ifndef QMK_KEYS_PER_SCAN +#define QMK_KEYS_PER_SCAN 4 +#endif // !QMK_KEYS_PER_SCAN + +#define IGNORE_MOD_TAP_INTERRUPT +#undef PERMISSIVE_HOLD +#undef PREVENT_STUCK_MODIFIERS + + +#define FORCE_NKRO + +#ifndef TAPPING_TOGGLE +#define TAPPING_TOGGLE 1 +#endif + +#endif // !USERSPACE_CONFIG_H + diff --git a/keyboards/ergodox_ez/keymaps/rgb_layer/keymap.c b/keyboards/ergodox_ez/keymaps/rgb_layer/keymap.c new file mode 100644 index 000000000..384d7d094 --- /dev/null +++ b/keyboards/ergodox_ez/keymaps/rgb_layer/keymap.c @@ -0,0 +1,271 @@ +#include QMK_KEYBOARD_H +#include "version.h" + +#define BASE 0 // default layer +#define SYMB 1 // symbols +#define MDIA 2 // media keys + +enum custom_keycodes { + PLACEHOLDER = SAFE_RANGE, // can always be here + EPRM, + VRSN, + RGB_SLD, + RGB_LYR +}; + +typedef union { + uint32_t raw; + struct { + bool rgb_layer_change :1; + }; +} user_config_t; + +user_config_t user_config; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Keymap 0: Basic layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | = | 1 | 2 | 3 | 4 | 5 | LEFT | | RIGHT| 6 | 7 | 8 | 9 | 0 | - | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | Del | Q | W | E | R | T | L1 | | L1 | Y | U | I | O | P | \ | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | BkSp | A | S | D | F | G |------| |------| H | J | K | L |; / L2|' / Cmd | + * |--------+------+------+------+------+------| Hyper| | Meh |------+------+------+------+------+--------| + * | LShift |Z/Ctrl| X | C | V | B | | | | N | M | , | . |//Ctrl| RShift | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * |Grv/L1| '" |AltShf| Left | Right| | Up | Down | [ | ] | ~L1 | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | App | LGui | | Alt |Ctrl/Esc| + * ,------|------|------| |------+--------+------. + * | | | Home | | PgUp | | | + * | Space|Backsp|------| |------| Tab |Enter | + * | |ace | End | | PgDn | | | + * `--------------------' `----------------------' + */ +// If it accepts an argument (i.e, is a function), it doesn't need KC_. +// Otherwise, it needs KC_* +[BASE] = LAYOUT_ergodox( // layer 0 : default + // left hand + KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT, + KC_DELT, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB), + KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G, + KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO), + LT(SYMB,KC_GRV),KC_QUOT, LALT(KC_LSFT), KC_LEFT,KC_RGHT, + ALT_T(KC_APP), KC_LGUI, + KC_HOME, + KC_SPC,KC_BSPC,KC_END, + // right hand + KC_RGHT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, + TG(SYMB), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, + KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN),GUI_T(KC_QUOT), + MEH_T(KC_NO),KC_N, KC_M, KC_COMM,KC_DOT, CTL_T(KC_SLSH), KC_RSFT, + KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, TT(SYMB), + KC_LALT, CTL_T(KC_ESC), + KC_PGUP, + KC_PGDN,KC_TAB, KC_ENT + ), +/* Keymap 1: Symbol Layer + * + * ,---------------------------------------------------. ,--------------------------------------------------. + * |Version | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 | + * |---------+------+------+------+------+------+------| |------+------+------+------+------+------+--------| + * | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 | + * |---------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | | + * |---------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | | + * `---------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | EPRM | | | | | | | . | 0 | = | | + * `-----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * |Animat| LYR | |Toggle|Solid | + * ,------|------|------| |------+------+------. + * |Bright|Bright| | | |Hue- |Hue+ | + * |ness- |ness+ |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// SYMBOLS +[SYMB] = LAYOUT_ergodox( + // left hand + VRSN, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, + RESET, KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS, + KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV, + EPRM,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + RGB_MOD,RGB_LYR, + KC_TRNS, + RGB_VAD,RGB_VAI,KC_TRNS, + // right hand + KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12, + KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS, + KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS, + KC_TRNS,KC_DOT, KC_0, KC_EQL, KC_TRNS, + RGB_TOG, RGB_SLD, + KC_TRNS, + KC_TRNS, RGB_HUD, RGB_HUI +), +/* Keymap 2: Media and mouse keys + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | | MsUp | | | | | | | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | Play | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | | | | | | Prev | Next | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | Lclk | Rclk | |VolUp |VolDn | Mute | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | |Brwser| + * | | |------| |------| |Back | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// MEDIA AND MOUSE +[MDIA] = LAYOUT_ergodox( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + // right hand + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, + KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS, + KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_WBAK +), +}; + +void eeconfig_init_user(void) { + rgblight_enable(); + rgblight_sethsv_cyan(); + rgblight_mode(1); + user_config.rgb_layer_change = true; + eeconfig_update_user(user_config.raw); +} + + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + // dynamically generate these. + case EPRM: + if (record->event.pressed) { + eeconfig_init(); + } + return false; + break; + case VRSN: + if (record->event.pressed) { + SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); + } + return false; + break; + case RGB_SLD: + if (record->event.pressed) { + #ifdef RGBLIGHT_ENABLE + rgblight_mode(1); + #endif + } + return false; + break; + case RGB_LYR: // This allows me to use underglow as layer indication, or as normal + if (record->event.pressed) { + user_config.rgb_layer_change ^= 1; // Toggles the status + eeconfig_update_user(user_config.raw); // Writes the new status to EEPROM + if (user_config.rgb_layer_change) { // if layer state indication is enabled, + layer_state_set(layer_state); // then immediately update the layer color + } + } + return false; break; + case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // For any of the RGB codes (see quantum_keycodes.h, L400 for reference) + if (record->event.pressed) { //This disables layer indication, as it's assumed that if you're changing this ... you want that disabled + if (user_config.rgb_layer_change) { // only if this is enabled + user_config.rgb_layer_change = false; // disable it, and + eeconfig_update_user(user_config.raw); // write the setings to EEPROM + } + } + return true; break; + } + return true; +} + +void matrix_init_user(void) { + // Call the keymap level matrix init. + + // Read the user config from EEPROM + user_config.raw = eeconfig_read_user(); + + // Set default layer, if enabled + if (user_config.rgb_layer_change) { + rgblight_enable_noeeprom(); + rgblight_sethsv_noeeprom_cyan(); + rgblight_mode_noeeprom(1); + } +} + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { + +}; + +uint32_t layer_state_set_user(uint32_t state) { + ergodox_board_led_off(); + ergodox_right_led_1_off(); + ergodox_right_led_2_off(); + ergodox_right_led_3_off(); + switch (biton32(state)) { + case SYMB: + ergodox_right_led_1_on(); + if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_red(); rgblight_mode_noeeprom(1); } + break; + case MDIA: + ergodox_right_led_2_on(); + if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_green(); rgblight_mode_noeeprom(1); } + break; + case 3: + ergodox_right_led_3_on(); + if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_blue(); rgblight_mode_noeeprom(1); } + break; + case 4: + ergodox_right_led_1_on(); + ergodox_right_led_2_on(); + if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_orange(); rgblight_mode_noeeprom(1); } + break; + case 5: + ergodox_right_led_1_on(); + ergodox_right_led_3_on(); + if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_yellow(); rgblight_mode_noeeprom(1); } + break; + case 6: + ergodox_right_led_2_on(); + ergodox_right_led_3_on(); + if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_pink(); rgblight_mode_noeeprom(1); } + break; + case 7: + ergodox_right_led_1_on(); + ergodox_right_led_2_on(); + ergodox_right_led_3_on(); + if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_white(); rgblight_mode_noeeprom(1); } + break; + default: // for any other layers, or the default layer + if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_cyan(); rgblight_mode_noeeprom(1); } + break; + } + return state; +} + diff --git a/quantum/quantum.c b/quantum/quantum.c index 84ccbdeab..eed59f811 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -945,6 +945,9 @@ void tap_random_base64(void) { } void matrix_init_quantum() { + if (!eeconfig_is_enabled() && !eeconfig_is_disabled()) { + eeconfig_init(); + } #ifdef BACKLIGHT_ENABLE backlight_init_ports(); #endif diff --git a/tmk_core/common/eeconfig.c b/tmk_core/common/eeconfig.c index 35de574a9..0fec410a9 100644 --- a/tmk_core/common/eeconfig.c +++ b/tmk_core/common/eeconfig.c @@ -8,32 +8,54 @@ #include "eeprom_stm32.h" #endif +extern uint32_t default_layer_state; +/** \brief eeconfig enable + * + * FIXME: needs doc + */ +__attribute__ ((weak)) +void eeconfig_init_user(void) { + // Reset user EEPROM value to blank, rather than to a set value + eeconfig_update_user(0); +} + +__attribute__ ((weak)) +void eeconfig_init_kb(void) { + // Reset Keyboard EEPROM value to blank, rather than to a set value + eeconfig_update_kb(0); + + eeconfig_init_user(); +} + + +/* + * FIXME: needs doc + */ +void eeconfig_init_quantum(void) { +#ifdef STM32F303xC + EEPROM_format(); +#endif + eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER); + eeprom_update_byte(EECONFIG_DEBUG, 0); + eeprom_update_byte(EECONFIG_DEFAULT_LAYER, 0); + default_layer_state = 0; + eeprom_update_byte(EECONFIG_KEYMAP, 0); + eeprom_update_byte(EECONFIG_MOUSEKEY_ACCEL, 0); + eeprom_update_byte(EECONFIG_BACKLIGHT, 0); + eeprom_update_byte(EECONFIG_AUDIO, 0xFF); // On by default + eeprom_update_dword(EECONFIG_RGBLIGHT, 0); + eeprom_update_byte(EECONFIG_STENOMODE, 0); + + eeconfig_init_kb(); +} + /** \brief eeconfig initialization * * FIXME: needs doc */ -void eeconfig_init(void) -{ -#ifdef STM32F303xC - EEPROM_format(); -#endif - eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER); - eeprom_update_byte(EECONFIG_DEBUG, 0); - eeprom_update_byte(EECONFIG_DEFAULT_LAYER, 0); - eeprom_update_byte(EECONFIG_KEYMAP, 0); - eeprom_update_byte(EECONFIG_MOUSEKEY_ACCEL, 0); -#ifdef BACKLIGHT_ENABLE - eeprom_update_byte(EECONFIG_BACKLIGHT, 0); -#endif -#ifdef AUDIO_ENABLE - eeprom_update_byte(EECONFIG_AUDIO, 0xFF); // On by default -#endif -#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE) - eeprom_update_dword(EECONFIG_RGBLIGHT, 0); -#endif -#ifdef STENO_ENABLE - eeprom_update_byte(EECONFIG_STENOMODE, 0); -#endif +void eeconfig_init(void) { + + eeconfig_init_quantum(); } /** \brief eeconfig enable @@ -54,7 +76,7 @@ void eeconfig_disable(void) #ifdef STM32F303xC EEPROM_format(); #endif - eeprom_update_word(EECONFIG_MAGIC, 0xFFFF); + eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER_OFF); } /** \brief eeconfig is enabled @@ -66,6 +88,15 @@ bool eeconfig_is_enabled(void) return (eeprom_read_word(EECONFIG_MAGIC) == EECONFIG_MAGIC_NUMBER); } +/** \brief eeconfig is disabled + * + * FIXME: needs doc + */ +bool eeconfig_is_disabled(void) +{ + return (eeprom_read_word(EECONFIG_MAGIC) == EECONFIG_MAGIC_NUMBER_OFF); +} + /** \brief eeconfig read debug * * FIXME: needs doc @@ -99,7 +130,6 @@ uint8_t eeconfig_read_keymap(void) { return eeprom_read_byte(EECONFIG_KEYMA */ void eeconfig_update_keymap(uint8_t val) { eeprom_update_byte(EECONFIG_KEYMAP, val); } -#ifdef BACKLIGHT_ENABLE /** \brief eeconfig read backlight * * FIXME: needs doc @@ -110,9 +140,8 @@ uint8_t eeconfig_read_backlight(void) { return eeprom_read_byte(EECONFIG_BA * FIXME: needs doc */ void eeconfig_update_backlight(uint8_t val) { eeprom_update_byte(EECONFIG_BACKLIGHT, val); } -#endif -#ifdef AUDIO_ENABLE + /** \brief eeconfig read audio * * FIXME: needs doc @@ -123,4 +152,28 @@ uint8_t eeconfig_read_audio(void) { return eeprom_read_byte(EECONFIG_AUDIO) * FIXME: needs doc */ void eeconfig_update_audio(uint8_t val) { eeprom_update_byte(EECONFIG_AUDIO, val); } -#endif + + +/** \brief eeconfig read kb + * + * FIXME: needs doc + */ +uint32_t eeconfig_read_kb(void) { return eeprom_read_dword(EECONFIG_KEYBOARD); } +/** \brief eeconfig update kb + * + * FIXME: needs doc + */ + +void eeconfig_update_kb(uint32_t val) { eeprom_update_dword(EECONFIG_KEYBOARD, val); } +/** \brief eeconfig read user + * + * FIXME: needs doc + */ +uint32_t eeconfig_read_user(void) { return eeprom_read_dword(EECONFIG_USER); } +/** \brief eeconfig update user + * + * FIXME: needs doc + */ +void eeconfig_update_user(uint32_t val) { eeprom_update_dword(EECONFIG_USER, val); } + + diff --git a/tmk_core/common/eeconfig.h b/tmk_core/common/eeconfig.h index fa498df48..a45cb8b12 100644 --- a/tmk_core/common/eeconfig.h +++ b/tmk_core/common/eeconfig.h @@ -23,36 +23,41 @@ along with this program. If not, see . #define EECONFIG_MAGIC_NUMBER (uint16_t)0xFEED +#define EECONFIG_MAGIC_NUMBER_OFF (uint16_t)0xFFFF /* eeprom parameteter address */ #if !defined(STM32F303xC) #define EECONFIG_MAGIC (uint16_t *)0 -#define EECONFIG_DEBUG (uint8_t *)2 -#define EECONFIG_DEFAULT_LAYER (uint8_t *)3 -#define EECONFIG_KEYMAP (uint8_t *)4 -#define EECONFIG_MOUSEKEY_ACCEL (uint8_t *)5 -#define EECONFIG_BACKLIGHT (uint8_t *)6 -#define EECONFIG_AUDIO (uint8_t *)7 +#define EECONFIG_DEBUG (uint8_t *)2 +#define EECONFIG_DEFAULT_LAYER (uint8_t *)3 +#define EECONFIG_KEYMAP (uint8_t *)4 +#define EECONFIG_MOUSEKEY_ACCEL (uint8_t *)5 +#define EECONFIG_BACKLIGHT (uint8_t *)6 +#define EECONFIG_AUDIO (uint8_t *)7 #define EECONFIG_RGBLIGHT (uint32_t *)8 #define EECONFIG_UNICODEMODE (uint8_t *)12 #define EECONFIG_STENOMODE (uint8_t *)13 // EEHANDS for two handed boards -#define EECONFIG_HANDEDNESS (uint8_t *)14 +#define EECONFIG_HANDEDNESS (uint8_t *)14 +#define EECONFIG_KEYBOARD (uint32_t *)15 +#define EECONFIG_USER (uint32_t *)19 #else /* STM32F3 uses 16byte block. Reconfigure memory map */ #define EECONFIG_MAGIC (uint16_t *)0 -#define EECONFIG_DEBUG (uint8_t *)1 -#define EECONFIG_DEFAULT_LAYER (uint8_t *)2 -#define EECONFIG_KEYMAP (uint8_t *)3 -#define EECONFIG_MOUSEKEY_ACCEL (uint8_t *)4 -#define EECONFIG_BACKLIGHT (uint8_t *)5 -#define EECONFIG_AUDIO (uint8_t *)6 +#define EECONFIG_DEBUG (uint8_t *)1 +#define EECONFIG_DEFAULT_LAYER (uint8_t *)2 +#define EECONFIG_KEYMAP (uint8_t *)3 +#define EECONFIG_MOUSEKEY_ACCEL (uint8_t *)4 +#define EECONFIG_BACKLIGHT (uint8_t *)5 +#define EECONFIG_AUDIO (uint8_t *)6 #define EECONFIG_RGBLIGHT (uint32_t *)7 -#define EECONFIG_UNICODEMODE (uint8_t *)9 +#define EECONFIG_UNICODEMODE (uint8_t *)9 #define EECONFIG_STENOMODE (uint8_t *)10 // EEHANDS for two handed boards -#define EECONFIG_HANDEDNESS (uint8_t *)11 +#define EECONFIG_HANDEDNESS (uint8_t *)11 +#define EECONFIG_KEYBOARD (uint32_t *)12 +#define EECONFIG_USER (uint32_t *)14 #endif /* debug bit */ @@ -73,8 +78,12 @@ along with this program. If not, see . bool eeconfig_is_enabled(void); +bool eeconfig_is_disabled(void); void eeconfig_init(void); +void eeconfig_init_quantum(void); +void eeconfig_init_kb(void); +void eeconfig_init_user(void); void eeconfig_enable(void); @@ -99,4 +108,9 @@ uint8_t eeconfig_read_audio(void); void eeconfig_update_audio(uint8_t val); #endif +uint32_t eeconfig_read_kb(void); +void eeconfig_update_kb(uint32_t val); +uint32_t eeconfig_read_user(void); +void eeconfig_update_user(uint32_t val); + #endif From 26f4e7031a643ce2760ae7b6df3bd2c79710451a Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 1 Oct 2018 17:53:47 -0700 Subject: [PATCH 202/788] Add tap_code function (#3784) * Add tap_code * formatting * Doc clarification * Rename variable to make more consistent --- docs/feature_macros.md | 4 ++++ tmk_core/common/action.h | 1 + 2 files changed, 5 insertions(+) diff --git a/docs/feature_macros.md b/docs/feature_macros.md index 673153081..ba5d91882 100644 --- a/docs/feature_macros.md +++ b/docs/feature_macros.md @@ -228,6 +228,10 @@ This sends the `` keydown event to the computer. Some examples would be `KC_ Parallel to `register_code` function, this sends the `` keyup event to the computer. If you don't use this, the key will be held down until it's sent. +### `tap_code();` + +This will send `register_code()` and then `unregister_code()`. This is useful if you want to send both the press and release events ("tap" the key, rather than hold it). + ### `clear_keyboard();` This will clear all mods and keys currently pressed. diff --git a/tmk_core/common/action.h b/tmk_core/common/action.h index 0322c73ed..833febe9c 100644 --- a/tmk_core/common/action.h +++ b/tmk_core/common/action.h @@ -88,6 +88,7 @@ void process_record(keyrecord_t *record); void process_action(keyrecord_t *record, action_t action); void register_code(uint8_t code); void unregister_code(uint8_t code); +inline void tap_code(uint8_t code) { register_code(code); unregister_code(code); } void register_mods(uint8_t mods); void unregister_mods(uint8_t mods); //void set_mods(uint8_t mods); From f5ae3760c6be7e927fba74aca4a0cf21a44113af Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 1 Oct 2018 17:56:04 -0700 Subject: [PATCH 203/788] Add send_unicode_hex_string function (#3828) * Add send_string_unicode function Co-authored-by: kdb424 Co-authored-by: Konstantin * Clean up code based on feedback * Fix includes --- docs/feature_unicode.md | 7 ++++- .../process_keycode/process_unicode_common.c | 28 +++++++++++++++++++ .../process_keycode/process_unicode_common.h | 1 + 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/docs/feature_unicode.md b/docs/feature_unicode.md index ecad6c60c..278b93ad7 100644 --- a/docs/feature_unicode.md +++ b/docs/feature_unicode.md @@ -19,7 +19,7 @@ table. TBD Unicode input in QMK works by inputing a sequence of characters to the OS, -sort of like macro. Unfortunately, each OS has different ideas on how Unicode is inputted. +sort of like macro. Unfortunately, each OS has different ideas on how Unicode is input. This is the current list of Unicode input method in QMK: @@ -29,6 +29,11 @@ This is the current list of Unicode input method in QMK: * UC_WIN: (not recommended) Windows built-in Unicode input. To enable: create registry key under `HKEY_CURRENT_USER\Control Panel\Input Method\EnableHexNumpad` of type `REG_SZ` called `EnableHexNumpad`, set its value to 1, and reboot. This method is not recommended because of reliability and compatibility issue, use WinCompose method below instead. * UC_WINC: Windows Unicode input using WinCompose. Requires [WinCompose](https://github.com/samhocevar/wincompose). Works reliably under many (all?) variations of Windows. +To type multiple characters for things like (ノಠ痊ಠ)ノ彡┻━┻, you can use `send_unicode_hex_string()` much like `SEND_STRING()` except you would use hex values seperated by spaces. +For example, the table flip seen above would be `send_unicode_hex_string("0028 30CE 0CA0 75CA 0CA0 0029 30CE 5F61 253B 2501 253B")` + +There are many ways to get a hex code, but an easy one is [this site](https://r12a.github.io/app-conversion/). Just make sure to convert to hexadecimal, and that is your string. + # Additional Language Support In `quantum/keymap_extras/`, you'll see various language files - these work the same way as the alternative layout ones do. Most are defined by their two letter country/language code followed by an underscore and a 4-letter abbreviation of its name. `FR_UGRV` which will result in a `ù` when using a software-implemented AZERTY layout. It's currently difficult to send such characters in just the firmware. diff --git a/quantum/process_keycode/process_unicode_common.c b/quantum/process_keycode/process_unicode_common.c index 7f34ad57c..e6620b7ea 100644 --- a/quantum/process_keycode/process_unicode_common.c +++ b/quantum/process_keycode/process_unicode_common.c @@ -16,6 +16,8 @@ #include "process_unicode_common.h" #include "eeprom.h" +#include +#include static uint8_t input_mode; uint8_t mods; @@ -120,3 +122,29 @@ void register_hex(uint16_t hex) { unregister_code(hex_to_keycode(digit)); } } + +void send_unicode_hex_string(const char *str) +{ + if (!str) { return; } // Safety net + + while (*str) { + // Find the next code point (token) in the string + for (; *str == ' '; str++); + size_t n = strcspn(str, " "); // Length of the current token + char code_point[n+1]; + strncpy(code_point, str, n); + code_point[n] = '\0'; // Make sure it's null-terminated + + // Normalize the code point: make all hex digits lowercase + for (char *p = code_point; *p; p++) { + *p = tolower((unsigned char)*p); + } + + // Send the code point as a Unicode input string + unicode_input_start(); + send_string(code_point); + unicode_input_finish(); + + str += n; // Move to the first ' ' (or '\0') after the current token + } +} diff --git a/quantum/process_keycode/process_unicode_common.h b/quantum/process_keycode/process_unicode_common.h index 4d2b04fb3..814b60c57 100644 --- a/quantum/process_keycode/process_unicode_common.h +++ b/quantum/process_keycode/process_unicode_common.h @@ -31,6 +31,7 @@ uint8_t get_unicode_input_mode(void); void unicode_input_start(void); void unicode_input_finish(void); void register_hex(uint16_t hex); +void send_unicode_hex_string(const char *str); #define UC_OSX 0 // Mac OS X #define UC_LNX 1 // Linux From 1512a6bfd48fb75619a1f77394d41bdca7ea28b1 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 1 Oct 2018 18:00:14 -0700 Subject: [PATCH 204/788] Keymap: Update to drashna keymaps and userspace (#3992) * Enabled unicode support and send_unicode function * Unicode cleanup * More unicode tweaking * Update EEPROM stuff * Account for keyboard macros * Switch Equal to Plus on Ergodox * more tweaks * Minor Unicode tweaks * Correct matrix printing for keylogger * Fix unicode functions * Fix unicode mode set since it actually uses EEPROM * Re-add DISABLE_LEADER * Ergodox is easier to hit the tapping term, fix that * Fix stupid type on unicode mode check * Preliminary CRKBD/HeliDox support * Fixes to Helidox * Cleanup userspace from old merge stuff * Remove CCCV sounds * Make Mode NOEEPROM Again --- keyboards/crkbd/keymaps/drashna/config.h | 43 +++ keyboards/crkbd/keymaps/drashna/glcdfont.c | 244 ++++++++++++++++++ keyboards/crkbd/keymaps/drashna/keymap.c | 173 +++++++++++++ keyboards/crkbd/keymaps/drashna/rules.mk | 30 +++ layouts/community/ergodox/drashna/keymap.c | 18 +- layouts/community/ergodox/drashna/rules.mk | 4 +- users/drashna/config.h | 10 +- users/drashna/drashna.c | 75 +++--- users/drashna/drashna.h | 28 +- users/drashna/rgb_stuff.c | 5 +- users/drashna/rules.mk | 7 +- users/drashna/send_unicode.c | 58 +++++ .../{drashna_unicode.h => send_unicode.h} | 10 +- 13 files changed, 639 insertions(+), 66 deletions(-) create mode 100644 keyboards/crkbd/keymaps/drashna/config.h create mode 100644 keyboards/crkbd/keymaps/drashna/glcdfont.c create mode 100644 keyboards/crkbd/keymaps/drashna/keymap.c create mode 100644 keyboards/crkbd/keymaps/drashna/rules.mk create mode 100644 users/drashna/send_unicode.c rename users/drashna/{drashna_unicode.h => send_unicode.h} (90%) diff --git a/keyboards/crkbd/keymaps/drashna/config.h b/keyboards/crkbd/keymaps/drashna/config.h new file mode 100644 index 000000000..366f013dc --- /dev/null +++ b/keyboards/crkbd/keymaps/drashna/config.h @@ -0,0 +1,43 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#pragma once + + +/* Select hand configuration */ + +// #define MASTER_LEFT +// #define MASTER_RIGHT +#define EE_HANDS + +#define SSD1306OLED + +#define USE_SERIAL_PD2 + +// #define TAPPING_FORCE_HOLD +// #define TAPPING_TERM 100 + +#undef RGBLED_NUM +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 27 +#define RGBLIGHT_LIMIT_VAL 120 +#define RGBLIGHT_HUE_STEP 10 +#define RGBLIGHT_SAT_STEP 17 +#define RGBLIGHT_VAL_STEP 17 diff --git a/keyboards/crkbd/keymaps/drashna/glcdfont.c b/keyboards/crkbd/keymaps/drashna/glcdfont.c new file mode 100644 index 000000000..4e7b27bc0 --- /dev/null +++ b/keyboards/crkbd/keymaps/drashna/glcdfont.c @@ -0,0 +1,244 @@ +// This is the 'classic' fixed-space bitmap font for Adafruit_GFX since 1.0. +// See gfxfont.h for newer custom bitmap font info. + +#ifndef FONT5X7_H +#define FONT5X7_H + +#ifdef __AVR__ + #include + #include +#elif defined(ESP8266) + #include +#else + #define PROGMEM +#endif + +// Standard ASCII 5x7 font + +static const unsigned char font[] PROGMEM = { +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x00, +0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x00, +0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x00, +0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x00, +0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x00, +0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00, +0x00, 0x18, 0x3C, 0x18, 0x00, 0x00, +0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00, +0x00, 0x18, 0x24, 0x18, 0x00, 0x00, +0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x00, +0x30, 0x48, 0x3A, 0x06, 0x0E, 0x00, +0x26, 0x29, 0x79, 0x29, 0x26, 0x00, +0x40, 0x7F, 0x05, 0x05, 0x07, 0x00, +0x40, 0x7F, 0x05, 0x25, 0x3F, 0x00, +0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x00, +0x7F, 0x3E, 0x1C, 0x1C, 0x08, 0x00, +0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x00, +0x14, 0x22, 0x7F, 0x22, 0x14, 0x00, +0x5F, 0x5F, 0x00, 0x5F, 0x5F, 0x00, +0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00, +0x00, 0x66, 0x89, 0x95, 0x6A, 0x00, +0x60, 0x60, 0x60, 0x60, 0x60, 0x00, +0x94, 0xA2, 0xFF, 0xA2, 0x94, 0x00, +0x08, 0x04, 0x7E, 0x04, 0x08, 0x00, +0x10, 0x20, 0x7E, 0x20, 0x10, 0x00, +0x08, 0x08, 0x2A, 0x1C, 0x08, 0x00, +0x08, 0x1C, 0x2A, 0x08, 0x08, 0x00, +0x1E, 0x10, 0x10, 0x10, 0x10, 0x00, +0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x00, +0x30, 0x38, 0x3E, 0x38, 0x30, 0x00, +0x06, 0x0E, 0x3E, 0x0E, 0x06, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, +0x00, 0x07, 0x00, 0x07, 0x00, 0x00, +0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00, +0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00, +0x23, 0x13, 0x08, 0x64, 0x62, 0x00, +0x36, 0x49, 0x56, 0x20, 0x50, 0x00, +0x00, 0x08, 0x07, 0x03, 0x00, 0x00, +0x00, 0x1C, 0x22, 0x41, 0x00, 0x00, +0x00, 0x41, 0x22, 0x1C, 0x00, 0x00, +0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x00, +0x08, 0x08, 0x3E, 0x08, 0x08, 0x00, +0x00, 0x80, 0x70, 0x30, 0x00, 0x00, +0x08, 0x08, 0x08, 0x08, 0x08, 0x00, +0x00, 0x00, 0x60, 0x60, 0x00, 0x00, +0x20, 0x10, 0x08, 0x04, 0x02, 0x00, +0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00, +0x00, 0x42, 0x7F, 0x40, 0x00, 0x00, +0x72, 0x49, 0x49, 0x49, 0x46, 0x00, +0x21, 0x41, 0x49, 0x4D, 0x33, 0x00, +0x18, 0x14, 0x12, 0x7F, 0x10, 0x00, +0x27, 0x45, 0x45, 0x45, 0x39, 0x00, +0x3C, 0x4A, 0x49, 0x49, 0x31, 0x00, +0x41, 0x21, 0x11, 0x09, 0x07, 0x00, +0x36, 0x49, 0x49, 0x49, 0x36, 0x00, +0x46, 0x49, 0x49, 0x29, 0x1E, 0x00, +0x00, 0x00, 0x14, 0x00, 0x00, 0x00, +0x00, 0x40, 0x34, 0x00, 0x00, 0x00, +0x00, 0x08, 0x14, 0x22, 0x41, 0x00, +0x14, 0x14, 0x14, 0x14, 0x14, 0x00, +0x00, 0x41, 0x22, 0x14, 0x08, 0x00, +0x02, 0x01, 0x59, 0x09, 0x06, 0x00, +0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x00, +0x7C, 0x12, 0x11, 0x12, 0x7C, 0x00, +0x7F, 0x49, 0x49, 0x49, 0x36, 0x00, +0x3E, 0x41, 0x41, 0x41, 0x22, 0x00, +0x7F, 0x41, 0x41, 0x41, 0x3E, 0x00, +0x7F, 0x49, 0x49, 0x49, 0x41, 0x00, +0x7F, 0x09, 0x09, 0x09, 0x01, 0x00, +0x3E, 0x41, 0x41, 0x51, 0x73, 0x00, +0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00, +0x00, 0x41, 0x7F, 0x41, 0x00, 0x00, +0x20, 0x40, 0x41, 0x3F, 0x01, 0x00, +0x7F, 0x08, 0x14, 0x22, 0x41, 0x00, +0x7F, 0x40, 0x40, 0x40, 0x40, 0x00, +0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x00, +0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00, +0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00, +0x7F, 0x09, 0x09, 0x09, 0x06, 0x00, +0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00, +0x7F, 0x09, 0x19, 0x29, 0x46, 0x00, +0x26, 0x49, 0x49, 0x49, 0x32, 0x00, +0x03, 0x01, 0x7F, 0x01, 0x03, 0x00, +0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00, +0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00, +0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00, +0x63, 0x14, 0x08, 0x14, 0x63, 0x00, +0x03, 0x04, 0x78, 0x04, 0x03, 0x00, +0x61, 0x59, 0x49, 0x4D, 0x43, 0x00, +0x00, 0x7F, 0x41, 0x41, 0x41, 0x00, +0x02, 0x04, 0x08, 0x10, 0x20, 0x00, +0x00, 0x41, 0x41, 0x41, 0x7F, 0x00, +0x04, 0x02, 0x01, 0x02, 0x04, 0x00, +0x40, 0x40, 0x40, 0x40, 0x40, 0x00, +0x00, 0x03, 0x07, 0x08, 0x00, 0x00, +0x20, 0x54, 0x54, 0x78, 0x40, 0x00, +0x7F, 0x28, 0x44, 0x44, 0x38, 0x00, +0x38, 0x44, 0x44, 0x44, 0x28, 0x00, +0x38, 0x44, 0x44, 0x28, 0x7F, 0x00, +0x38, 0x54, 0x54, 0x54, 0x18, 0x00, +0x00, 0x08, 0x7E, 0x09, 0x02, 0x00, +0x18, 0xA4, 0xA4, 0x9C, 0x78, 0x00, +0x7F, 0x08, 0x04, 0x04, 0x78, 0x00, +0x00, 0x44, 0x7D, 0x40, 0x00, 0x00, +0x20, 0x40, 0x40, 0x3D, 0x00, 0x00, +0x7F, 0x10, 0x28, 0x44, 0x00, 0x00, +0x00, 0x41, 0x7F, 0x40, 0x00, 0x00, +0x7C, 0x04, 0x78, 0x04, 0x78, 0x00, +0x7C, 0x08, 0x04, 0x04, 0x78, 0x00, +0x38, 0x44, 0x44, 0x44, 0x38, 0x00, +0xFC, 0x18, 0x24, 0x24, 0x18, 0x00, +0x18, 0x24, 0x24, 0x18, 0xFC, 0x00, +0x7C, 0x08, 0x04, 0x04, 0x08, 0x00, +0x48, 0x54, 0x54, 0x54, 0x24, 0x00, +0x04, 0x04, 0x3F, 0x44, 0x24, 0x00, +0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00, +0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00, +0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00, +0x44, 0x28, 0x10, 0x28, 0x44, 0x00, +0x4C, 0x90, 0x90, 0x90, 0x7C, 0x00, +0x44, 0x64, 0x54, 0x4C, 0x44, 0x00, +0x00, 0x08, 0x36, 0x41, 0x00, 0x00, +0x00, 0x00, 0x77, 0x00, 0x00, 0x00, +0x00, 0x41, 0x36, 0x08, 0x00, 0x00, +0x02, 0x01, 0x02, 0x04, 0x02, 0x00, +0x3C, 0x26, 0x23, 0x26, 0x3C, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x0E, 0x3F, 0xFF, 0xFF, +0xFF, 0xFF, 0xFE, 0xE0, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x1E, 0xBE, +0x7F, 0xFF, 0xFF, 0xFE, 0xFE, 0xF0, +0xE0, 0xC0, 0x80, 0x00, 0x0E, 0xEF, +0xDF, 0xDE, 0xBE, 0x3C, 0x38, 0x70, +0xE0, 0xDD, 0xBB, 0x7B, 0x07, 0x0E, +0x0E, 0x0C, 0x98, 0xF0, 0xE0, 0xF0, +0xF0, 0xF8, 0x78, 0x3C, 0x1C, 0x1E, +0x0E, 0x0E, 0x0F, 0x0F, 0x0F, 0x0F, +0x1F, 0xFE, 0xFE, 0xF8, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xE0, 0xF0, 0xF0, 0xF0, 0xE0, 0xEC, +0xEE, 0xF7, 0xF3, 0x70, 0x20, 0x00, +0x7C, 0x7C, 0x7C, 0x7E, 0x00, 0x7E, +0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x00, +0x00, 0x80, 0xC0, 0xE0, 0x7E, 0x5B, +0x4F, 0x5B, 0xFE, 0xC0, 0x00, 0x00, +0xC0, 0x00, 0xDC, 0xD7, 0xDE, 0xDE, +0xDE, 0xD7, 0xDC, 0x00, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x03, +0x0F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFE, +0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x7F, +0xFF, 0xFE, 0xFD, 0xFB, 0x1B, 0x07, +0x07, 0x0F, 0x1F, 0x1F, 0x1E, 0x1D, +0x0B, 0x07, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, +0xF8, 0xFE, 0xFF, 0xFF, 0x1F, 0x07, +0x01, 0x01, 0x01, 0x03, 0x06, 0x06, +0x0C, 0x0C, 0x08, 0x0C, 0x0C, 0x0E, +0x07, 0x83, 0xC1, 0xE0, 0x70, 0x30, +0x18, 0x1C, 0x7C, 0xCC, 0x8C, 0xDC, +0xF8, 0xC0, 0xE0, 0xE0, 0x70, 0xB8, +0xF0, 0x60, 0x00, 0x00, 0x80, 0xC0, +0xE0, 0xF0, 0x70, 0xF8, 0xFC, 0xFC, +0x3C, 0x30, 0x38, 0xF8, 0xF8, 0xF8, +0x78, 0x00, 0x80, 0x80, 0xC0, 0xE0, +0x70, 0x38, 0x38, 0x9C, 0xDC, 0xFC, +0x7C, 0x38, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0F, 0x1F, 0x3F, 0x7F, 0x7F, 0x7F, +0x7F, 0x7F, 0x3F, 0x1E, 0x0C, 0x00, +0x1F, 0x1F, 0x1F, 0x3F, 0x00, 0x3F, +0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x00, +0x30, 0x7B, 0x7F, 0x78, 0x30, 0x20, +0x20, 0x30, 0x78, 0x7F, 0x3B, 0x00, +0x03, 0x00, 0x0F, 0x7F, 0x0F, 0x0F, +0x0F, 0x7F, 0x0F, 0x00, 0x03, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x03, 0x07, +0x1F, 0x3F, 0x3F, 0x7F, 0x7F, 0x7F, +0x7E, 0x7D, 0x3B, 0x17, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x07, +0x0F, 0x1F, 0x3F, 0x3F, 0x7E, 0x7C, +0x78, 0x70, 0x70, 0x70, 0x70, 0x70, +0x70, 0x78, 0x38, 0x18, 0x1C, 0x0E, +0x07, 0x0F, 0x1F, 0x3F, 0x3C, 0x38, +0x38, 0x18, 0x0C, 0x06, 0x03, 0x01, +0x01, 0x01, 0x01, 0x0E, 0x1F, 0x1F, +0x1C, 0x1C, 0x1E, 0x0F, 0x0F, 0x03, +0x1D, 0x0E, 0x07, 0x03, 0x01, 0x00, +0x00, 0x0E, 0x1F, 0x1F, 0x1D, 0x1E, +0x0F, 0x07, 0x03, 0x03, 0x0F, 0x1F, +0x1F, 0x19, 0x19, 0x19, 0x19, 0x0C, +0x0C, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; +#endif // FONT5X7_H diff --git a/keyboards/crkbd/keymaps/drashna/keymap.c b/keyboards/crkbd/keymaps/drashna/keymap.c new file mode 100644 index 000000000..7bced8de3 --- /dev/null +++ b/keyboards/crkbd/keymaps/drashna/keymap.c @@ -0,0 +1,173 @@ +#include QMK_KEYBOARD_H +#include "drashna.h" +#ifdef PROTOCOL_LUFA + #include "lufa.h" + #include "split_util.h" +#endif +#ifdef SSD1306OLED + #include "ssd1306.h" +#endif + +extern keymap_config_t keymap_config; +extern uint8_t is_master; + +#ifdef RGBLIGHT_ENABLE +//Following line allows macro to read current RGB settings +extern rgblight_config_t rgblight_config; +#endif + +enum crkbd_keycodes { + RGBRST = NEW_SAFE_RANGE +}; + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_QWERTY] = LAYOUT_wrapper( + KC_ESC, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_BSPC, + KC_TAB, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_QUOT, + KC_MLSF, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_MRSF, + LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE + ), + [_COLEMAK] = LAYOUT_wrapper( + KC_ESC, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_BSPC, + KC_TAB, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_QUOT, + KC_MLSF, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_MRSF, + LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE + ), + [_DVORAK] = LAYOUT_wrapper( + KC_ESC, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_BSPC, + KC_TAB, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_QUOT, + KC_MLSF, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_MRSF, + LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE + ), + [_WORKMAN] = LAYOUT_wrapper( + KC_ESC, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_BSPC, + KC_TAB, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_QUOT, + KC_MLSF, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_MRSF, + LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE + ), + + [_MODS] = LAYOUT_wrapper( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_RSFT, + _______, _______, _______, _______, _______, _______ + ), + + [_LOWER] = LAYOUT_wrapper( + KC_TILD, _________________LOWER_L1__________________, _________________LOWER_R1__________________, KC_BSPC, + KC_F11, _________________LOWER_L2__________________, _________________LOWER_R2__________________, KC_PIPE, + KC_F12, _________________LOWER_L3__________________, _________________LOWER_R3__________________, _______, + _______, _______, _______, _______, _______, _______ + ), + + [_RAISE] = LAYOUT_wrapper( \ + KC_GRV, _________________RAISE_L1__________________, _________________RAISE_R1__________________, KC_BSPC, + _______, _________________RAISE_L2__________________, _________________RAISE_R2__________________, KC_BSLS, + _______, _________________RAISE_L3__________________, _________________RAISE_R3__________________, _______, + _______, _______, _______, _______, _______, _______ //`--------------------' `--------------------' + ), + + [_ADJUST] = LAYOUT_wrapper( \ + KC_MAKE, _________________ADJUST_L1_________________, _________________ADJUST_R1_________________, KC_RESET, + VRSN, _________________ADJUST_L2_________________, _________________ADJUST_R2_________________, EPRM, + TG_MODS, _________________ADJUST_L3_________________, _________________ADJUST_R3_________________, KC_MPLY, + _______, _______, _______, _______, _______, _______ + ) +}; + +int RGB_current_mode; + +void matrix_init_keymap(void) { + #ifdef RGBLIGHT_ENABLE + RGB_current_mode = rgblight_config.mode; + #endif + //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h + #ifdef SSD1306OLED + iota_gfx_init(!has_usb()); // turns on the display + #endif + + DDRD &= ~(1<<5); + PORTD &= ~(1<<5); + + DDRB &= ~(1<<0); + PORTB &= ~(1<<0);} + +//SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h +#ifdef SSD1306OLED + +// When add source files to SRC in rules.mk, you can use functions. +const char *read_layer_state(void); +const char *read_logo(void); +void set_keylog(uint16_t keycode, keyrecord_t *record); +const char *read_keylog(void); +const char *read_keylogs(void); + +// const char *read_mode_icon(bool swap); +// const char *read_host_led_state(void); +// void set_timelog(void); +// const char *read_timelog(void); + +void matrix_scan_keymap(void) { + iota_gfx_task(); +} + +void matrix_render_user(struct CharacterMatrix *matrix) { + if (is_master) { + // If you want to change the display of OLED, you need to change here + matrix_write_ln(matrix, read_layer_state()); + matrix_write_ln(matrix, read_keylog()); + matrix_write_ln(matrix, read_keylogs()); + //matrix_write_ln(matrix, read_mode_icon(keymap_config.swap_lalt_lgui)); + //matrix_write_ln(matrix, read_host_led_state()); + //matrix_write_ln(matrix, read_timelog()); + } else { + matrix_write(matrix, read_logo()); + } +} + +void matrix_update(struct CharacterMatrix *dest, const struct CharacterMatrix *source) { + if (memcmp(dest->display, source->display, sizeof(dest->display))) { + memcpy(dest->display, source->display, sizeof(dest->display)); + dest->dirty = true; + } +} + +void iota_gfx_task_user(void) { + struct CharacterMatrix matrix; + matrix_clear(&matrix); + matrix_render_user(&matrix); + matrix_update(&display, &matrix); +} + +bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { + if (record->event.pressed) { + set_keylog(keycode, record); + // set_timelog(); + } + + switch (keycode) { + case RGB_MOD: + #ifdef RGBLIGHT_ENABLE + if (record->event.pressed) { + rgblight_mode_noeeprom(RGB_current_mode); + rgblight_step(); + RGB_current_mode = rgblight_config.mode; + } + #endif + return false; + break; + case RGBRST: + #ifdef RGBLIGHT_ENABLE + if (record->event.pressed) { + eeconfig_update_rgblight_default(); + rgblight_enable(); + RGB_current_mode = rgblight_config.mode; + } + #endif + break; + } + return true; +} + +#endif diff --git a/keyboards/crkbd/keymaps/drashna/rules.mk b/keyboards/crkbd/keymaps/drashna/rules.mk new file mode 100644 index 000000000..f490aa2ea --- /dev/null +++ b/keyboards/crkbd/keymaps/drashna/rules.mk @@ -0,0 +1,30 @@ + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SWAP_HANDS_ENABLE = no # Enable one-hand typing + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +# If you want to change the display of OLED, you need to change here +SRC += ./lib/rgb_state_reader.c \ + ./lib/layer_state_reader.c \ + ./lib/logo_reader.c \ + ./lib/keylogger.c \ + # ./lib/mode_icon_reader.c \ + # ./lib/host_led_state_reader.c \ + # ./lib/timelogger.c \ diff --git a/layouts/community/ergodox/drashna/keymap.c b/layouts/community/ergodox/drashna/keymap.c index 4d7700f19..15153c469 100644 --- a/layouts/community/ergodox/drashna/keymap.c +++ b/layouts/community/ergodox/drashna/keymap.c @@ -57,11 +57,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_QWERTY] = LAYOUT_ergodox_pretty_wrapper( // left hand // right hand - KC_EQL, ________________NUMBER_LEFT________________, _______, _______, ________________NUMBER_RIGHT_______________, KC_MINS, + KC_ESC, ________________NUMBER_LEFT________________, UC_FLIP, UC_TABL, ________________NUMBER_RIGHT_______________, KC_MINS, KC_TAB, _________________QWERTY_L1_________________, TG(_DIABLO), TG(_DIABLO), _________________QWERTY_R1_________________, KC_BSLS, KC_C1R3, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_QUOT, KC_MLSF, _________________QWERTY_L3_________________, TG(_GAMEPAD), TG(_GAMEPAD), _________________QWERTY_R3_________________, KC_MRSF, - KC_GRV, ___________ERGODOX_BOTTOM_LEFT_____________, ___________ERGODOX_BOTTOM_RIGHT____________, KC_NO, + KC_GRV, ___________ERGODOX_BOTTOM_LEFT_____________, ___________ERGODOX_BOTTOM_RIGHT____________, UC_IRNY, __________________ERGODOX_THUMB_CLUSTER_____________________ ), /* Keymap 0: COLEMAK layer @@ -89,11 +89,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // Otherwise, it needs KC_* [_COLEMAK] = LAYOUT_ergodox_pretty_wrapper( // left hand // right hand - KC_EQL, ________________NUMBER_LEFT________________, _______, _______, ________________NUMBER_RIGHT_______________, KC_MINS, + KC_ESC, ________________NUMBER_LEFT________________, UC_FLIP, UC_TABL, ________________NUMBER_RIGHT_______________, KC_MINS, KC_TAB, _________________COLEMAK_L1________________, TG(_DIABLO), TG(_DIABLO), _________________COLEMAK_R1________________, KC_BSLS, KC_C1R3, _________________COLEMAK_L2________________, _________________COLEMAK_R2________________, KC_QUOT, KC_MLSF, _________________COLEMAK_L3________________, TG(_GAMEPAD), TG(_GAMEPAD), _________________COLEMAK_R3________________, KC_MRSF, - KC_GRV, ___________ERGODOX_BOTTOM_LEFT_____________, ___________ERGODOX_BOTTOM_RIGHT____________, KC_NO, + KC_GRV, ___________ERGODOX_BOTTOM_LEFT_____________, ___________ERGODOX_BOTTOM_RIGHT____________, UC_IRNY, __________________ERGODOX_THUMB_CLUSTER_____________________ ), /* Keymap 0: DVORAK Layout @@ -121,11 +121,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // Otherwise, it needs KC_* [_DVORAK] = LAYOUT_ergodox_pretty_wrapper( // left hand // right hand - KC_EQL, ________________NUMBER_LEFT________________, _______, _______, ________________NUMBER_RIGHT_______________, KC_BSLS, + KC_ESC, ________________NUMBER_LEFT________________, UC_FLIP, UC_TABL, ________________NUMBER_RIGHT_______________, KC_BSLS, KC_TAB, _________________DVORAK_L1_________________, TG(_DIABLO), TG(_DIABLO), _________________DVORAK_R1_________________, KC_SLSH, KC_C1R3, _________________DVORAK_L2_________________, _________________DVORAK_R2_________________, KC_MINS, KC_MLSF, _________________DVORAK_L3_________________, TG(_GAMEPAD), TG(_GAMEPAD), _________________DVORAK_R3_________________, KC_MRSF, - KC_GRV, ___________ERGODOX_BOTTOM_LEFT_____________, ___________ERGODOX_BOTTOM_RIGHT____________, KC_NO, + KC_GRV, ___________ERGODOX_BOTTOM_LEFT_____________, ___________ERGODOX_BOTTOM_RIGHT____________, UC_IRNY, __________________ERGODOX_THUMB_CLUSTER_____________________ ), /* Keymap 0: WORKMAN layer @@ -153,11 +153,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // Otherwise, it needs KC_* [_WORKMAN] = LAYOUT_ergodox_pretty_wrapper( // left hand - KC_EQL, ________________NUMBER_LEFT________________, _______, _______, ________________NUMBER_RIGHT_______________, KC_MINS, + KC_ESC, ________________NUMBER_LEFT________________, UC_FLIP, UC_TABL, ________________NUMBER_RIGHT_______________, KC_MINS, KC_TAB, _________________WORKMAN_L1________________, TG(_DIABLO), TG(_DIABLO), _________________WORKMAN_R1________________, KC_BSLS, KC_C1R3, _________________WORKMAN_L2________________, _________________WORKMAN_R2________________, KC_QUOT, KC_MLSF, _________________WORKMAN_L3________________, TG(_GAMEPAD), TG(_GAMEPAD), _________________WORKMAN_R3________________, KC_MRSF, - KC_GRV, ___________ERGODOX_BOTTOM_LEFT_____________, ___________ERGODOX_BOTTOM_RIGHT____________, KC_NO, + KC_GRV, ___________ERGODOX_BOTTOM_LEFT_____________, ___________ERGODOX_BOTTOM_RIGHT____________, UC_IRNY, __________________ERGODOX_THUMB_CLUSTER_____________________ ), @@ -197,7 +197,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_GAMEPAD] = LAYOUT_ergodox_pretty_wrapper( KC_ESC, KC_NO, KC_1, KC_2, KC_3, HYPR(KC_Q), HYPR(KC_GRV), KC_TRNS, KC_F9, KC_F10, KC_F11, KC_F12, KC_NO, KC_NO, - KC_F1, KC_K, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_F1, KC_K, KC_Q, KC_W, KC_E, KC_R, KC_T, UC_SHRG, UC_DISA, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TAB, KC_G, KC_A, KC_S, KC_D, KC_F, KC_I, KC_O, KC_NO, KC_NO, KC_NO, KC_NO, KC_LCTL, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_TRNS, TG(_GAMEPAD), KC_N, KC_M, KC_NO, KC_NO, KC_NO, KC_NO, KC_GRV, KC_U, KC_I, KC_Y, KC_T, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_NO, diff --git a/layouts/community/ergodox/drashna/rules.mk b/layouts/community/ergodox/drashna/rules.mk index 30d513c91..8bf53950e 100644 --- a/layouts/community/ergodox/drashna/rules.mk +++ b/layouts/community/ergodox/drashna/rules.mk @@ -8,8 +8,8 @@ endif CONSOLE_ENABLE = no BOOTMAGIC_ENABLE = yes -UNICODE_ENABLE = no -UNICDOEMAP_ENABLE = yes +UNICODE_ENABLE = yes +UNICDOEMAP_ENABLE = no MACROS_ENABLED = no RGBLIGHT_TWINKLE = no diff --git a/users/drashna/config.h b/users/drashna/config.h index 92efcc5c7..3ddec93b1 100644 --- a/users/drashna/config.h +++ b/users/drashna/config.h @@ -55,7 +55,11 @@ #ifdef TAPPING_TERM #undef TAPPING_TERM #endif // TAPPING_TERM -#define TAPPING_TERM 175 +#ifdef KEYBOARD_ergodox_ez + #define TAPPING_TERM 185 +#else + #define TAPPING_TERM 175 +#endif // Disable action_get_macro and fn_actions, since we don't use these @@ -63,4 +67,8 @@ #define NO_ACTION_MACRO #define NO_ACTION_FUNCTION +#define DISABLE_LEADER + #define MACRO_TIMER 5 + + diff --git a/users/drashna/drashna.c b/users/drashna/drashna.c index 9489fb456..aad9fab61 100644 --- a/users/drashna/drashna.c +++ b/users/drashna/drashna.c @@ -21,6 +21,7 @@ along with this program. If not, see . userspace_config_t userspace_config; +uint16_t copy_paste_timer; // Helper Functions @@ -131,7 +132,7 @@ void led_set_keymap(uint8_t usb_led) {} // Call user matrix init, set default RGB colors and then // call the keymap's init function void matrix_init_user(void) { - userspace_config.raw = eeprom_read_byte(EECONFIG_USERSPACE); + userspace_config.raw = eeprom_read_dword(EECONFIG_USERSPACE); #ifdef BOOTLOADER_CATERINA @@ -143,7 +144,9 @@ void matrix_init_user(void) { #endif #if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE)) - set_unicode_input_mode(UC_WINC); + if (eeprom_read_byte(EECONFIG_UNICODEMODE) != UC_WIN) { + set_unicode_input_mode(UC_WIN); + } #endif //UNICODE_ENABLE matrix_init_keymap(); } @@ -173,17 +176,12 @@ void shutdown_user (void) { shutdown_keymap(); } -void suspend_power_down_user(void) -{ +void suspend_power_down_user(void) { suspend_power_down_keymap(); } -void suspend_wakeup_init_user(void) -{ +void suspend_wakeup_init_user(void) { suspend_wakeup_init_keymap(); - #ifdef KEYBOARD_ergodox_ez - wait_ms(10); - #endif } @@ -216,7 +214,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { // If console is enabled, it will print the matrix position and status of each key pressed #ifdef KEYLOGGER_ENABLE - xprintf("KL: row: %u, column: %u, pressed: %u\n", record->event.key.col, record->event.key.row, record->event.pressed); + #if defined(KEYBOARD_ergodox_ez) || defined(KEYBOARD_iris_rev2) + xprintf("KL: col: %u, row: %u, pressed: %u\n", record->event.key.row, record->event.key.col, record->event.pressed); + #else + xprintf("KL: col: %u, row: %u, pressed: %u\n", record->event.key.col, record->event.key.row, record->event.pressed); + #endif #endif //KEYLOGGER_ENABLE switch (keycode) { @@ -249,7 +251,9 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { case KC_MAKE: // Compiles the firmware, and adds the flash command based on keyboard bootloader if (!record->event.pressed) { send_string_with_delay_P(PSTR("make " QMK_KEYBOARD ":" QMK_KEYMAP -#if (defined(BOOTLOADER_DFU) || defined(BOOTLOADER_LUFA_DFU) || defined(BOOTLOADER_QMK_DFU)) +#if defined(__ARM__) + ":dfu-util" +#elif defined(BOOTLOADER_DFU) ":dfu" #elif defined(BOOTLOADER_HALFKAY) ":teensy" @@ -291,7 +295,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { // to save on firmware space, since it's limited. #ifdef MACROS_ENABLED case KC_OVERWATCH: // Toggle's if we hit "ENTER" or "BACKSPACE" to input macros - if (record->event.pressed) { userspace_config.is_overwatch ^= 1; eeprom_update_byte(EECONFIG_USERSPACE, userspace_config.raw); } + if (record->event.pressed) { userspace_config.is_overwatch ^= 1; eeprom_update_dword(EECONFIG_USERSPACE, userspace_config.raw); } #ifdef RGBLIGHT_ENABLE userspace_config.is_overwatch ? rgblight_mode_noeeprom(17) : rgblight_mode_noeeprom(18); #endif //RGBLIGHT_ENABLE @@ -342,45 +346,40 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { register_code(KC_LCTL); tap(KC_C); unregister_code(KC_LCTL); -#ifdef AUDIO_ENABLE - PLAY_SONG(tone_copy); -#endif } else { // Tap, paste register_code(KC_LCTL); tap(KC_V); unregister_code(KC_LCTL); -#ifdef AUDIO_ENABLE - PLAY_SONG(tone_paste); -#endif } } return false; break; #ifdef UNICODE_ENABLE - case UC_FLIP: // (╯°□°)╯ ︵ ┻━┻ + case UC_FLIP: // (ノಠ痊ಠ)ノ彡┻━┻ if (record->event.pressed) { - register_code(KC_RSFT); - tap(KC_9); - unregister_code(KC_RSFT); - process_unicode((0x256F | QK_UNICODE), record); // Arm - process_unicode((0x00B0 | QK_UNICODE), record); // Eye - process_unicode((0x25A1 | QK_UNICODE), record); // Mouth - process_unicode((0x00B0 | QK_UNICODE), record); // Eye - register_code(KC_RSFT); - tap(KC_0); - unregister_code(KC_RSFT); - process_unicode((0x256F | QK_UNICODE), record); // Arm - tap(KC_SPC); - process_unicode((0x0361 | QK_UNICODE), record); // Flippy - tap(KC_SPC); - process_unicode((0x253B | QK_UNICODE), record); // Table - process_unicode((0x2501 | QK_UNICODE), record); // Table - process_unicode((0x253B | QK_UNICODE), record); // Table + send_unicode_hex_string("0028 30CE 0CA0 75CA 0CA0 0029 30CE 5F61 253B 2501 253B"); } return false; break; -#endif // UNICODE_ENABLE - + case UC_TABL: // ┬─┬ノ( º _ ºノ) + if (record->event.pressed) { + send_unicode_hex_string("252C 2500 252C 30CE 0028 0020 00BA 0020 005F 0020 00BA 30CE 0029"); + } + return false; + break; + case UC_SHRG: // ¯\_(ツ)_/¯ + if (record->event.pressed) { + send_unicode_hex_string("00AF 005C 005F 0028 30C4 0029 005F 002F 00AF"); + } + return false; + break; + case UC_DISA: // ಠ_ಠ + if (record->event.pressed) { + send_unicode_hex_string("0CA0 005F 0CA0"); + } + return false; + break; +#endif } return process_record_keymap(keycode, record) && #ifdef RGBLIGHT_ENABLE diff --git a/users/drashna/drashna.h b/users/drashna/drashna.h index de8c3ba94..49e3fc870 100644 --- a/users/drashna/drashna.h +++ b/users/drashna/drashna.h @@ -19,9 +19,13 @@ along with this program. If not, see . #include "quantum.h" #include "version.h" #include "eeprom.h" +#include "send_unicode.h" + #ifdef RGB_MATRIX_ENABLE #include "rgb_matrix.h" #endif + + // Define layer names enum userspace_layers { _QWERTY = 0, @@ -59,19 +63,26 @@ inline void tap(uint16_t keycode){ register_code(keycode); unregister_code(keyco bool mod_key_press_timer (uint16_t code, uint16_t mod_code, bool pressed); bool mod_key_press (uint16_t code, uint16_t mod_code, bool pressed, uint16_t this_timer); -#define EECONFIG_USERSPACE (uint8_t *)19 +#define EECONFIG_USERSPACE (uint32_t *)19 typedef union { - uint8_t raw; + uint32_t raw; struct { bool rgb_layer_change :1; bool is_overwatch :1; bool nuke_switch :1; + uint8_t unicode_mod :4; }; } userspace_config_t; +#if defined(KEYMAP_SAFE_RANGE) + #define PLACEHOLDER_SAFE_RANGE KEYMAP_SAFE_RANGE +#else + #define PLACEHOLDER_SAFE_RANGE SAFE_RANGE +#endif + enum userspace_custom_keycodes { - EPRM = SAFE_RANGE, // Resets EEPROM do defaults (as in eeconfig_init) + EPRM = PLACEHOLDER_SAFE_RANGE, // Resets EEPROM do defaults (as in eeconfig_init) VRSN, // Prints QMK Firmware and board info KC_QWERTY, // Sets default layer to QWERTY KC_COLEMAK, // Sets default layer to COLEMAK @@ -99,13 +110,14 @@ enum userspace_custom_keycodes { KC_SECRET_5, // test5 KC_CCCV, // Hold to copy, tap to paste KC_NUKE, // NUCLEAR LAUNCH DETECTED!!! - -#ifdef UNICODE_ENABLE - UC_FLIP, // Table flip (not working?) -#endif //UNICODE_ENABLE + UC_FLIP, // (ಠ痊ಠ)┻━┻ + UC_TABL, // ┬─┬ノ( º _ ºノ) + UC_SHRG, // ¯\_(ツ)_/¯ + UC_DISA, // ಠ_ಠ NEW_SAFE_RANGE //use "NEWPLACEHOLDER for keymap specific codes }; + #define LOWER MO(_LOWER) #define RAISE MO(_RAISE) #define ADJUST MO(_ADJUST) @@ -153,6 +165,8 @@ enum userspace_custom_keycodes { #define MG_NKRO MAGIC_TOGGLE_NKRO +#define UC_IRNY UC(0x2E2E) +#define UC_CLUE UC(0x203D) #ifdef TAP_DANCE_ENABLE enum { diff --git a/users/drashna/rgb_stuff.c b/users/drashna/rgb_stuff.c index 03c55b132..4a1a8de69 100644 --- a/users/drashna/rgb_stuff.c +++ b/users/drashna/rgb_stuff.c @@ -230,7 +230,7 @@ bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) { if (record->event.pressed) { userspace_config.rgb_layer_change ^= 1; xprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change); - eeprom_update_byte(EECONFIG_USERSPACE, userspace_config.raw); + eeprom_update_dword(EECONFIG_USERSPACE, userspace_config.raw); if (userspace_config.rgb_layer_change) { layer_state_set(layer_state); // This is needed to immediately set the layer color (looks better) } @@ -243,7 +243,7 @@ bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) { if (userspace_config.rgb_layer_change) { userspace_config.rgb_layer_change = false; xprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change); - eeprom_update_byte(EECONFIG_USERSPACE, userspace_config.raw); + eeprom_update_dword(EECONFIG_USERSPACE, userspace_config.raw); } } return true; break; @@ -273,6 +273,7 @@ void matrix_init_rgb(void) { default: rgblight_sethsv_noeeprom_cyan(); break; } + rgblight_mode_noeeprom(1); } } diff --git a/users/drashna/rules.mk b/users/drashna/rules.mk index e299f24a1..3d6213eff 100644 --- a/users/drashna/rules.mk +++ b/users/drashna/rules.mk @@ -1,4 +1,3 @@ - SRC += drashna.c ifneq ("$(wildcard $(USER_PATH)/secrets.c)","") @@ -9,7 +8,7 @@ ifeq ($(strip $(TAP_DANCE_ENABLE)), yes) SRC += tap_dances.c endif -EXTRAFLAGS += -flto +EXTRAFLAGS += -flto ifeq ($(strip $(NO_SECRETS)), yes) OPT_DEFS += -DNO_SECRETS @@ -37,3 +36,7 @@ ifdef CONSOLE_ENABLE OPT_DEFS += -DKEYLOGGER_ENABLE endif endif + +ifeq ($(strip $(UNICODE_ENABLE)), yes) + SRC += send_unicode.c +endif diff --git a/users/drashna/send_unicode.c b/users/drashna/send_unicode.c new file mode 100644 index 000000000..cacfe1dc8 --- /dev/null +++ b/users/drashna/send_unicode.c @@ -0,0 +1,58 @@ +// Written by konstantin: vomindoraan +#include "send_unicode.h" +#include +#include + +__attribute__((weak)) +void send_unicode_hex_string(const char* str) { + if (!str) { return; } // Safety net + + while (*str) { + // Find the next code point (token) in the string + for (; *str == ' '; str++); + size_t n = strcspn(str, " "); // Length of the current token + char code_point[n+1]; + strncpy(code_point, str, n); + code_point[n] = '\0'; // Make sure it's null-terminated + + // Normalize the code point: make all hex digits lowercase + for (char *p = code_point; *p; p++) { + *p = tolower((unsigned char)*p); + } + + // Send the code point as a Unicode input string + unicode_input_start(); + send_string(code_point); + unicode_input_finish(); + + str += n; // Move to the first ' ' (or '\0') after the current token + } +} + +// (ノಠ痊ಠ)ノ彡┻━┻ +// send_unicode_hex_string("0028 30CE 0CA0 75CA 0CA0 0029 30CE 5F61 253B 2501 253B"); + +//Old code +// (╯°□°)╯ ︵ ┻━┻ + #if 0 + register_code(KC_RSFT); + tap(KC_9); + unregister_code(KC_RSFT); + process_unicode((0x256F | QK_UNICODE), record); // Arm + process_unicode((0x00B0 | QK_UNICODE), record); // Eye + process_unicode((0x25A1 | QK_UNICODE), record); // Mouth + process_unicode((0x00B0 | QK_UNICODE), record); // Eye + register_code(KC_RSFT); + tap(KC_0); + unregister_code(KC_RSFT); + process_unicode((0x256F | QK_UNICODE), record); // Arm + tap(KC_SPC); + process_unicode((0x0361 | QK_UNICODE), record); // Flippy + tap(KC_SPC); + process_unicode((0x253B | QK_UNICODE), record); // Table + process_unicode((0x2501 | QK_UNICODE), record); // Table + process_unicode((0x253B | QK_UNICODE), record); // Table + #endif + + +// If you need a good converter: https://r12a.github.io/app-conversion/ diff --git a/users/drashna/drashna_unicode.h b/users/drashna/send_unicode.h similarity index 90% rename from users/drashna/drashna_unicode.h rename to users/drashna/send_unicode.h index 3d1bc03f9..818b6e571 100644 --- a/users/drashna/drashna_unicode.h +++ b/users/drashna/send_unicode.h @@ -1,10 +1,11 @@ -#ifndef UNICODE_USERSPACE_H -#define UNICODE_USERSPACE_H +#pragma once +#include "quantum.h" +void send_unicode_hex_string(const char* str); /* use X(n) to call the */ - +#ifdef UNICODEMAP_ENABLE enum unicode_name { THINK, // thinking face 🤔 GRIN, // grinning face 😊 @@ -67,5 +68,4 @@ const uint32_t PROGMEM unicode_map[] = { [IRONY] = 0x02E2E, [DEGREE] = 0x000B0 }; - - #endif +#endif // UNICODEMAP_ENABLE From 713ec91147aa56849f9e2ff93ee98ef1eb6eebc0 Mon Sep 17 00:00:00 2001 From: Yan-Fa Li Date: Mon, 1 Oct 2018 19:50:14 -0700 Subject: [PATCH 205/788] Add C hint to inline code --- docs/custom_quantum_functions.md | 38 ++++++++++++++++---------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/custom_quantum_functions.md b/docs/custom_quantum_functions.md index f8b84cd6b..b077e4b78 100644 --- a/docs/custom_quantum_functions.md +++ b/docs/custom_quantum_functions.md @@ -27,7 +27,7 @@ The first step to creating your own custom keycode(s) is to enumerate them. This Here is an example of enumerating 2 keycodes. After adding this block to your `keymap.c` you will be able to use `FOO` and `BAR` inside your keymap. -``` +```c enum my_keycodes { FOO = SAFE_RANGE, BAR @@ -44,7 +44,7 @@ These function are called every time a key is pressed or released. This example does two things. It defines the behavior for a custom keycode called `FOO`, and it supplements our Enter key by playing a tone whenever it is pressed. -``` +```c bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch (keycode) { case FOO: @@ -75,16 +75,16 @@ The `keycode` argument is whatever is defined in your keymap, eg `MO(1)`, `KC_L` The `record` argument contains information about the actual press: -``` +```c keyrecord_t record { -+-keyevent_t event { -| +-keypos_t key { -| | +-uint8_t col -| | +-uint8_t row -| | } -| +-bool pressed -| +-uint16_t time -| } + keyevent_t event { + keypos_t key { + uint8_t col + uint8_t row + } + bool pressed + uint16_t time + } } ``` @@ -100,7 +100,7 @@ This allows you to control the 5 LED's defined as part of the USB Keyboard spec. ### Example `led_set_user()` Implementation -``` +```c void led_set_user(uint8_t usb_led) { if (usb_led & (1< Date: Mon, 1 Oct 2018 20:35:09 -0700 Subject: [PATCH 206/788] Keyboard: DZ60 cleanup (#3994) * DZ60: Deleted K214 from LAYOUT_all * DZ60: Delete matrix LAYOUT_2_shifts; replace with LAYOUT_all After the deletion of K214 from LAYOUT_all, LAYOUT_all and LAYOUT_2_shifts are identical. Deprecated LAYOUT_2_shifts in favor of LAYOUT_all. * DZ60: refactor 256k_HHKB and itsaferbie keymaps to use LAYOUT_60_hhkb macro Both keymaps previously used the LAYOUT_hhkb macro. After comparing the macros, the only difference between them was that LAYOUT_hhkb included the place of the ISO Backslash key. Neither keymap used this key, so both were refactored to use LAYOUT_60_hhkb instead. LAYOUT_hhkb is now essentially unused by any keymaps in the repo. (More on that in a moment.) * DZ60: bugfix for dbroqua keymap This keymap had two layers that used the LAYOUT_true_hhkb macro and a third that used LAYOUT_hhkb. These macros have the same number of keys, but represent different physical layouts. As the "main" layers used LAYOUT_true_hhkb, switched the third layer to LAYOUT_true_hhkb as well. The LAYOUT_hhkb macro is now unused by any DZ60 keymaps in the repo, and can be safely deleted. * DZ60: bugfix for 60_ansi_arrow_fkeys, 60_plus_arrows, and stephengrier keymaps All three keymaps had one layer in LAYOUT_all and one in LAYOUT_directional. Only difference between these macros is LAYOUT_all excludes the ISO Backslash position. As none of the keymaps used this position, all layers were switched to use LAYOUT_directional. * DZ60: added layout mock-ups to dz60.h Documenting the physical layouts that go with each matrix. * DZ60: replace TMK SHIFT_ESC with QMK Grave Escape Replaced all instances of keycodes that called TMK's ACTION_FUNCTION(SHIFT_ESC) with QMK's KC_GESC, and added config.h files so KC_GESC behaves as the deprecated TMK function did, except for the default keymap, which I thought should have the QMK standard behavior. * DZ60: delete SHIFT_ESC code blocks Deleted ACTION_FUNCTION(SHIFT_ESC) code blocks from keymaps that didn't use the functionality it provided. * DZ60: deleted unused MODS_CTRL_MASk definitions Was used in the now-deleted SHIFT_ESC code blocks. Interestingly named MODS_CTRL_MASK when it was actually checking the Shift keys. *shrug* * DZ60: refactor jkbone keymap to use process_record_user Replaced TMK action_function keycodes with QMK process_record_user equivalents. * DZ60: delete unused layout macros The macros LAYOUT_hhkb, LAYOUT_directional_625_space, and LAYOUT_60_ansi_split_bs_rshift_5x1u were unused by any keymaps in the repo, and have thus been deleted. * DZ60: refactor iso_6u_space and iso_7u_space keymaps Both keymaps refactored to use the LAYOUT_60_iso macro. * DZ60: refactor dz60.h Updated the notation of the switch arguments. Format is now: `k` where `` is `[0-4]` and `` is `[0-9a-e]`. * DZ60: refactor LAYOUT_60_iso_5x1u matrix Updated matrix so `KC_ENT` belongs on the home row, which is consistent with LAYOUT_60_iso for the DZ60 as well as the ISO community layouts. * DZ60: fix white space in dz60.h I hate when indentation is inconsistent within a file. --- keyboards/dz60/dz60.h | 320 ++++++++++-------- keyboards/dz60/info.json | 22 +- keyboards/dz60/keymaps/256k_HHKB/keymap.c | 20 +- .../dz60/keymaps/60_ansi_arrow_fkeys/config.h | 1 + .../dz60/keymaps/60_ansi_arrow_fkeys/keymap.c | 42 +-- .../dz60/keymaps/60_plus_arrows/keymap.c | 40 +-- .../dz60/keymaps/Ansi_plus_fn_arrows/config.h | 1 + .../dz60/keymaps/Ansi_plus_fn_arrows/keymap.c | 38 +-- keyboards/dz60/keymaps/dbroqua/keymap.c | 2 +- keyboards/dz60/keymaps/default/keymap.c | 38 +-- keyboards/dz60/keymaps/eric/keymap.c | 36 -- keyboards/dz60/keymaps/f3d3/keymap.c | 40 +-- keyboards/dz60/keymaps/frogger/keymap.c | 8 +- keyboards/dz60/keymaps/hailbreno/keymap.c | 16 +- keyboards/dz60/keymaps/iso_6u_space/keymap.c | 102 ++---- keyboards/dz60/keymaps/iso_7u_space/keymap.c | 105 +++--- keyboards/dz60/keymaps/iso_uk/keymap.c | 36 -- keyboards/dz60/keymaps/iso_vim_arrow/keymap.c | 44 +-- keyboards/dz60/keymaps/itsaferbie/keymap.c | 12 +- keyboards/dz60/keymaps/jkbone/keymap.c | 73 ++-- keyboards/dz60/keymaps/krusli/keymap.c | 1 - keyboards/dz60/keymaps/macos_arrow/keymap.c | 8 +- keyboards/dz60/keymaps/stephengrier/config.h | 1 + keyboards/dz60/keymaps/stephengrier/keymap.c | 42 +-- keyboards/dz60/keymaps/weeheavy/keymap.c | 6 +- 25 files changed, 349 insertions(+), 705 deletions(-) create mode 100644 keyboards/dz60/keymaps/60_ansi_arrow_fkeys/config.h create mode 100644 keyboards/dz60/keymaps/Ansi_plus_fn_arrows/config.h create mode 100644 keyboards/dz60/keymaps/stephengrier/config.h diff --git a/keyboards/dz60/dz60.h b/keyboards/dz60/dz60.h index 3d0b0dd52..6d80b2c7c 100644 --- a/keyboards/dz60/dz60.h +++ b/keyboards/dz60/dz60.h @@ -7,173 +7,221 @@ // 标准配列 +/* Standard arrangement / LAYOUT + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ + * │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0a │0b │0c │0d │0e │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ + * │10 │12 │13 │14 │15 │16 │17 │18 │19 │1a │1b │1c │1d │1e │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ + * │20 │22 │23 │24 │25 │26 │27 │28 │29 │2a │2b │2c │2d │ + * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ + * │30 │31 │32 │33 │34 │35 │36 │37 │38 │39 │3a │3b │3d │3e │ + * ├────┼───┴┬──┴─┬─┴───┴──┬┴───┼───┴───┴──┬┴──┬┴──┬┴──┬───┼───┤ + * │40 │41 │43 │44 │46 │48 │4a │4b │4c │4d │4e │ + * └────┴────┴────┴────────┴────┴──────────┴───┴───┴───┴───┴───┘ +*/ #define LAYOUT( \ - K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, \ - K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \ - K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \ - K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, K314, \ - K400, K401, K403, K404, K406, K408, K410, K411, K412, K413, K414 \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, \ + k10, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, \ + k20, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, \ + k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3d, k3e, \ + k40, k41, k43, k44, k46, k48, k4a, k4b, k4c, k4d, k4e \ ) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014 }, \ - { K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \ - { K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO }, \ - { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO, K313, K314 }, \ - { K400, K401, KC_NO, K403, K404, KC_NO, K406, KC_NO, K408, KC_NO, K410, K411, K412, K413, K414 } \ -} - -#define LAYOUT_hhkb( \ - K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, \ - K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \ - K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \ - K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, K314, \ - K401, K403, K406, K411, K413 \ -) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014 }, \ - { K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \ - { K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO }, \ - { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO, K313, K314 }, \ - { KC_NO, K401, KC_NO, K403, KC_NO, KC_NO, K406, KC_NO, KC_NO, KC_NO, KC_NO, K411, KC_NO, K413, KC_NO } \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e }, \ + { k10, KC_NO, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e }, \ + { k20, KC_NO, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, KC_NO }, \ + { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, KC_NO, k3d, k3e }, \ + { k40, k41, KC_NO, k43, k44, KC_NO, k46, KC_NO, k48, KC_NO, k4a, k4b, k4c, k4d, k4e } \ } +/* LAYOUT_true_hhkb + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ + * │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0a │0b │0c │0d │0e │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ + * │10 │12 │13 │14 │15 │16 │17 │18 │19 │1a │1b │1c │1d │1e │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ + * │20 │22 │23 │24 │25 │26 │27 │28 │29 │2a │2b │2c │2d │ + * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ + * │30 │31 │32 │33 │34 │35 │36 │37 │38 │39 │3a │3b │3d │3e │ + * ├────┴┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴──┬┴───┴┬──┴┬─────┴───┤ + * │▓▓▓▓▓│41 │43 │46 (6u) │4a │4b │▓▓▓▓▓▓▓▓▓│ + * └─────┴───┴─────┴───────────────────────┴─────┴───┴─────────┘ +*/ #define LAYOUT_true_hhkb( \ - K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, \ - K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \ - K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \ - K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, K314, \ - K401, K403, K406, K410, K411 \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, \ + k10, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, \ + k20, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, \ + k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3d, k3e, \ + k41, k43, k46, k4a, k4b \ ) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014 }, \ - { K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \ - { K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO }, \ - { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO, K313, K314 }, \ - { KC_NO, K401, KC_NO, K403, KC_NO, KC_NO, K406, KC_NO, KC_NO, KC_NO, K410, K411, KC_NO, KC_NO, KC_NO } \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e }, \ + { k10, KC_NO, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e }, \ + { k20, KC_NO, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, KC_NO }, \ + { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, KC_NO, k3d, k3e }, \ + { KC_NO, k41, KC_NO, k43, KC_NO, KC_NO, k46, KC_NO, KC_NO, KC_NO, k4a, k4b, KC_NO, KC_NO, KC_NO } \ } +/* LAYOUT_60_hhkb + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ + * │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0a │0b │0c │0d │0e │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ + * │10 │12 │13 │14 │15 │16 │17 │18 │19 │1a │1b │1c │1d │1e │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ + * │20 │22 │23 │24 │25 │26 │27 │28 │29 │2a │2b │2c │2d │ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ + * │30 │32 │33 │34 │35 │36 │37 │38 │39 │3a │3b │3d │3e │ + * ├─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴──────┬┴───┴┬───┬─┴───┤ + * │▓▓▓▓▓│41 │43 │46 (7u) │4b │4d │▓▓▓▓▓│ + * └─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘ +*/ #define LAYOUT_60_hhkb( \ - K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, \ - K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \ - K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \ - K300, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, K314, \ - K401, K403, K406, K411, K413 \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, \ + k10, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, \ + k20, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, \ + k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3d, k3e, \ + k41, k43, k46, k4b, k4d \ ) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014 }, \ - { K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \ - { K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO }, \ - { K300, KC_NO, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO, K313, K314 }, \ - { KC_NO, K401, KC_NO, K403, KC_NO, KC_NO, K406, KC_NO, KC_NO, KC_NO, KC_NO, K411, KC_NO, K413, KC_NO } \ -} - -#define LAYOUT_2_shifts( \ - K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, \ - K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \ - K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \ - K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, \ - K400, K401, K403, K404, K406, K408, K410, K411, K412, K413, K414 \ -) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014 }, \ - { K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \ - { K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO }, \ - { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314 }, \ - { K400, K401, KC_NO, K403, K404, KC_NO, K406, KC_NO, K408, KC_NO, K410, K411, K412, K413, K414 } \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e }, \ + { k10, KC_NO, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e }, \ + { k20, KC_NO, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, KC_NO }, \ + { k30, KC_NO, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, KC_NO, k3d, k3e }, \ + { KC_NO, k41, KC_NO, k43, KC_NO, KC_NO, k46, KC_NO, KC_NO, KC_NO, KC_NO, k4b, KC_NO, k4d, KC_NO } \ } // 带方向配列 +/* Directional arrangement | LAYOUT_directional + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ + * │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0a │0b │0c │0d │0e │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ + * │10 │12 │13 │14 │15 │16 │17 │18 │19 │1a │1b │1c │1d │1e │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ + * │20 │22 │23 │24 │25 │26 │27 │28 │29 │2a │2b │2c │2d │ + * ├──────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬───┬───┤ + * │30 │32 │33 │34 │35 │36 │37 │38 │39 │3a │3b │3c │3d │3e │ + * ├────┬──┴─┬─┴──┬┴───┴───┼───┴┬──┴───┴───┼───┼───┼───┼───┼───┤ + * │40 │41 │43 │44 │46 │48 │4a │4b │4c │4d │4e │ + * └────┴────┴────┴────────┴────┴──────────┴───┴───┴───┴───┴───┘ +*/ #define LAYOUT_directional( \ - K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, \ - K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \ - K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \ - K300, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, \ - K400, K401, K403, K404, K406, K408, K410, K411, K412, K413, K414 \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, \ + k10, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, \ + k20, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, \ + k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e, \ + k40, k41, k43, k44, k46, k48, k4a, k4b, k4c, k4d, k4e \ ) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014 }, \ - { K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \ - { K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO }, \ - { K300, KC_NO, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314 }, \ - { K400, K401, KC_NO, K403, K404, KC_NO, K406, KC_NO, K408, KC_NO, K410, K411, K412, K413, K414 } \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e }, \ + { k10, KC_NO, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e }, \ + { k20, KC_NO, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, KC_NO }, \ + { k30, KC_NO, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e }, \ + { k40, k41, KC_NO, k43, k44, KC_NO, k46, KC_NO, k48, KC_NO, k4a, k4b, k4c, k4d, k4e } \ } +/* LAYOUT_all + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ + * │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0a │0b │0c │0d │0e │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ + * │10 │12 │13 │14 │15 │16 │17 │18 │19 │1a │1b │1c │1d │1e │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ + * │20 │22 │23 │24 │25 │26 │27 │28 │29 │2a │2b │2c │2d │ + * ├───┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬───┬───┤ + * │30 │31 │32 │33 │34 │35 │36 │37 │38 │39 │3a │3b │3c │3d │3e │ + * ├───┴┬──┴─┬─┴──┬┴───┴───┼───┴┬──┴───┴───┼───┼───┼───┼───┼───┤ + * │40 │41 │43 │44 │46 │48 │4a │4b │4c │4d │4e │ + * └────┴────┴────┴────────┴────┴──────────┴───┴───┴───┴───┴───┘ +*/ #define LAYOUT_all( \ - K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, \ - K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \ - K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, \ - K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, \ - K400, K401, K403, K404, K406, K408, K410, K411, K412, K413, K414 \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, \ + k10, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, \ + k20, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, \ + k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e, \ + k40, k41, k43, k44, k46, k48, k4a, k4b, k4c, k4d, k4e \ ) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014 }, \ - { K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \ - { K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214 }, \ - { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314 }, \ - { K400, K401, KC_NO, K403, K404, KC_NO, K406, KC_NO, K408, KC_NO, K410, K411, K412, K413, K414 } \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e }, \ + { k10, KC_NO, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e }, \ + { k20, KC_NO, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, KC_NO }, \ + { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e }, \ + { k40, k41, KC_NO, k43, k44, KC_NO, k46, KC_NO, k48, KC_NO, k4a, k4b, k4c, k4d, k4e } \ } +/* LAYOUT_60_ansi + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ + * │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0a │0b │0c │0e │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ + * │10 │12 │13 │14 │15 │16 │17 │18 │19 │1a │1b │1c │1d │1e │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ + * │20 │22 │23 │24 │25 │26 │27 │28 │29 │2a │2b │2c │2d │ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ + * │30 │32 │33 │34 │35 │36 │37 │38 │39 │3a │3b │3d │ + * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ + * │40 │41 │43 │46 │4a │4b │4d │4e │ + * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ +*/ #define LAYOUT_60_ansi( \ - K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, \ - K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \ - K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \ - K300, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, \ - K400, K401, K403, K406, K410, K411, K413, K414 \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0e, \ + k10, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, \ + k20, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, \ + k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3d, \ + k40, k41, k43, k46, k4a, k4b, k4d, k4e \ ) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, KC_NO, K014 }, \ - { K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \ - { K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO }, \ - { K300, KC_NO, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO, K313, KC_NO }, \ - { K400, K401, KC_NO, K403, KC_NO, KC_NO, K406, KC_NO, KC_NO, KC_NO, K410, K411, KC_NO, K413, K414 } \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, KC_NO, k0e }, \ + { k10, KC_NO, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e }, \ + { k20, KC_NO, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, KC_NO }, \ + { k30, KC_NO, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, KC_NO, k3d, KC_NO }, \ + { k40, k41, KC_NO, k43, KC_NO, KC_NO, k46, KC_NO, KC_NO, KC_NO, k4a, k4b, KC_NO, k4d, k4e } \ } +/* LAYOUT_60_iso + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ + * │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0a │0b │0c │0e │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ + * │10 │12 │13 │14 │15 │16 │17 │18 │19 │1a │1b │1c │1d │ │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐2d │ + * │20 │22 │23 │24 │25 │26 │27 │28 │29 │2a │2b │2c │1e │ │ + * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤ + * │30 │31 │32 │33 │34 │35 │36 │37 │38 │39 │3a │3b │3d │ + * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ + * │40 │41 │43 │46 │4a │4b │4d │4e │ + * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ +*/ #define LAYOUT_60_iso( \ - K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, \ - K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, \ - K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K114, K213, \ - K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, \ - K400, K401, K403, K406, K410, K411, K413, K414 \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0e, \ + k10, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, \ + k20, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k1e, k2d, \ + k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3d, \ + k40, k41, k43, k46, k4a, k4b, k4d, k4e \ ) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, KC_NO, K014 }, \ - { K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \ - { K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO }, \ - { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO, K313, KC_NO }, \ - { K400, K401, KC_NO, K403, KC_NO, KC_NO, K406, KC_NO, KC_NO, KC_NO, K410, K411, KC_NO, K413, K414 } \ -} - -#define LAYOUT_directional_625_space( \ - K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, \ - K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \ - K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \ - K300, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, \ - K400, K401, K403, K406, K410, K411, K412, K413, K414 \ -) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014 }, \ - { K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \ - { K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO }, \ - { K300, KC_NO, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314 }, \ - { K400, K401, KC_NO, K403, KC_NO, KC_NO, K406, KC_NO, KC_NO, KC_NO, K410, K411, K412, K413, K414 } \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, KC_NO, k0e }, \ + { k10, KC_NO, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e }, \ + { k20, KC_NO, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, KC_NO }, \ + { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, KC_NO, k3d, KC_NO }, \ + { k40, k41, KC_NO, k43, KC_NO, KC_NO, k46, KC_NO, KC_NO, KC_NO, k4a, k4b, KC_NO, k4d, k4e } \ } +/* LAYOUT_60_iso_5x1u + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ + * │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0a │0b │0c │0e │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ + * │10 │12 │13 │14 │15 │16 │17 │18 │19 │1a │1b │1c │1d │ │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐2d │ + * │20 │22 │23 │24 │25 │26 │27 │28 │29 │2a │2b │2c │1e │ │ + * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤ + * │30 │31 │32 │33 │34 │35 │36 │37 │38 │39 │3a │3b │3d │ + * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴──┬┴──┬┴──┬───┬───┤ + * │40 │41 │43 │46 │4a │4b │4c │4d │4e │ + * └────┴────┴────┴────────────────────────┴───┴───┴───┴───┴───┘ +*/ #define LAYOUT_60_iso_5x1u( \ - K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, \ - K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K213, \ - K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K114, \ - K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, \ - K400, K401, K403, K406, K410, K411, K412, K413, K414 \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0e, \ + k10, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, \ + k20, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k1e, k2d, \ + k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3d, \ + k40, k41, k43, k46, k4a, k4b, k4c, k4d, k4e \ ) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, KC_NO, K014 }, \ - { K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \ - { K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO }, \ - { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO, K313, KC_NO }, \ - { K400, K401, KC_NO, K403, KC_NO, KC_NO, K406, KC_NO, KC_NO, KC_NO, K410, K411, K412, K413, K414 } \ -} - -#define LAYOUT_60_ansi_split_bs_rshift_5x1u( \ - K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, \ - K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \ - K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \ - K300, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, K314, \ - K400, K401, K403, K406, K410, K411, K412, K413, K414 \ -) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014 }, \ - { K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \ - { K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO }, \ - { K300, KC_NO, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO, K313, K314 }, \ - { K400, K401, KC_NO, K403, KC_NO, KC_NO, K406, KC_NO, KC_NO, KC_NO, K410, K411, K412, K413, K414 } \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, KC_NO, k0e }, \ + { k10, KC_NO, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e }, \ + { k20, KC_NO, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, KC_NO }, \ + { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, KC_NO, k3d, KC_NO }, \ + { k40, k41, KC_NO, k43, KC_NO, KC_NO, k46, KC_NO, KC_NO, KC_NO, k4a, k4b, k4c, k4d, k4e } \ } #endif diff --git a/keyboards/dz60/info.json b/keyboards/dz60/info.json index 54d675375..4855c3b81 100644 --- a/keyboards/dz60/info.json +++ b/keyboards/dz60/info.json @@ -9,25 +9,17 @@ "key_count": 67, "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"~", "x":13, "y":0}, {"label":"Del", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"label":"Fn", "x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":2.25}, {"x":6, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"x":10, "y":4}, {"label":"Alt", "x":11, "y":4}, {"label":"Win", "x":12, "y":4}, {"label":"Menu", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}] }, - "LAYOUT_hhkb": { - "key_count": 61, - "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"~", "x":13, "y":0}, {"label":"Del", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Ctrl", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"label":"Fn", "x":14, "y":3}, {"label":"Alt", "x":1.5, "y":4}, {"x":2.5, "y":4, "w":1.5}, {"x":4, "y":4, "w":6}, {"x":10, "y":4, "w":1.5}, {"label":"Alt", "x":11.5, "y":4}] - }, "LAYOUT_true_hhkb": { "key_count": 61, "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"~", "x":13, "y":0}, {"label":"Del", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Ctrl", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"label":"Fn", "x":14, "y":3}, {"label":"Alt", "x":1.5, "y":4}, {"x":2.5, "y":4, "w":1.5}, {"x":4, "y":4, "w":6}, {"x":10, "y":4, "w":1.5}, {"label":"Alt", "x":11.5, "y":4}] }, - "LAYOUT_2_shifts": { - "key_count": 68, - "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"~", "x":13, "y":0}, {"label":"Del", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3}, {"x":1, "y":3}, {"label":"Z", "x":2, "y":3}, {"label":"X", "x":3, "y":3}, {"label":"C", "x":4, "y":3}, {"label":"V", "x":5, "y":3}, {"label":"B", "x":6, "y":3}, {"label":"N", "x":7, "y":3}, {"label":"M", "x":8, "y":3}, {"label":"<", "x":9, "y":3}, {"label":">", "x":10, "y":3}, {"label":"?", "x":11, "y":3}, {"label":"Shift", "x":12, "y":3}, {"x":13, "y":3}, {"label":"Fn", "x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":2.25}, {"x":6, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"x":10, "y":4}, {"label":"Alt", "x":11, "y":4}, {"label":"Win", "x":12, "y":4}, {"label":"Menu", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}] - }, "LAYOUT_directional": { "key_count": 67, "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"~", "x":13, "y":0}, {"label":"Del", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2}, {"label":"Z", "x":2, "y":3}, {"label":"X", "x":3, "y":3}, {"label":"C", "x":4, "y":3}, {"label":"V", "x":5, "y":3}, {"label":"B", "x":6, "y":3}, {"label":"N", "x":7, "y":3}, {"label":"M", "x":8, "y":3}, {"label":"<", "x":9, "y":3}, {"label":">", "x":10, "y":3}, {"label":"?", "x":11, "y":3}, {"label":"Shift", "x":12, "y":3}, {"x":13, "y":3}, {"label":"Fn", "x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":2.25}, {"x":6, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"x":10, "y":4}, {"label":"Alt", "x":11, "y":4}, {"label":"Win", "x":12, "y":4}, {"label":"Menu", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}] }, "LAYOUT_all": { - "key_count": 69, - "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":2, "w":1.25}, {"label":"Shift", "x":0, "y":3}, {"x":1, "y":3}, {"label":"Z", "x":2, "y":3}, {"label":"X", "x":3, "y":3}, {"label":"C", "x":4, "y":3}, {"label":"V", "x":5, "y":3}, {"label":"B", "x":6, "y":3}, {"label":"N", "x":7, "y":3}, {"label":"M", "x":8, "y":3}, {"label":"<", "x":9, "y":3}, {"label":">", "x":10, "y":3}, {"label":"?", "x":11, "y":3}, {"label":"Shift", "x":12, "y":3}, {"x":13, "y":3}, {"x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":2.25}, {"x":6, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"x":10, "y":4}, {"label":"Alt", "x":11, "y":4}, {"label":"Win", "x":12, "y":4}, {"label":"Menu", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}] + "key_count": 68, + "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3}, {"x":1, "y":3}, {"label":"Z", "x":2, "y":3}, {"label":"X", "x":3, "y":3}, {"label":"C", "x":4, "y":3}, {"label":"V", "x":5, "y":3}, {"label":"B", "x":6, "y":3}, {"label":"N", "x":7, "y":3}, {"label":"M", "x":8, "y":3}, {"label":"<", "x":9, "y":3}, {"label":">", "x":10, "y":3}, {"label":"?", "x":11, "y":3}, {"label":"Shift", "x":12, "y":3}, {"x":13, "y":3}, {"x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":2.25}, {"x":6, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"x":10, "y":4}, {"label":"Alt", "x":11, "y":4}, {"label":"Win", "x":12, "y":4}, {"label":"Menu", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}] }, "LAYOUT_60_ansi": { "key_count": 61, @@ -41,17 +33,9 @@ "key_count": 60, "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"1", "x":1, "y":0}, {"label":"2", "x":2, "y":0}, {"label":"3", "x":3, "y":0}, {"label":"4", "x":4, "y":0}, {"label":"5", "x":5, "y":0}, {"label":"6", "x":6, "y":0}, {"label":"7", "x":7, "y":0}, {"label":"8", "x":8, "y":0}, {"label":"9", "x":9, "y":0}, {"label":"0", "x":10, "y":0}, {"label":"-", "x":11, "y":0}, {"label":"=", "x":12, "y":0}, {"label":"\\", "x":13, "y":0}, {"label":"`", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"[", "x":11.5, "y":1}, {"label":"]", "x":12.5, "y":1}, {"label":"Backspace", "x":13.5, "y":1, "w":1.5}, {"label":"Control", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":";", "x":10.75, "y":2}, {"label":"'", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":",", "x":9.25, "y":3}, {"label":".", "x":10.25, "y":3}, {"label":"/", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"label":"Fn", "x":14, "y":3}, {"label":"Os", "x":1.5, "y":4}, {"label":"Alt", "x":2.5, "y":4, "w":1.5}, {"x":4, "y":4, "w":7}, {"label":"Alt", "x":11, "y":4, "w":1.5}, {"label":"Os", "x":12.5, "y":4}] }, - "LAYOUT_directional_625_space": { - "key_count": 65, - "layout": [{"label":"K000", "x":0, "y":0}, {"label":"K001", "x":1, "y":0}, {"label":"K002", "x":2, "y":0}, {"label":"K003", "x":3, "y":0}, {"label":"K004", "x":4, "y":0}, {"label":"K005", "x":5, "y":0}, {"label":"K006", "x":6, "y":0}, {"label":"K007", "x":7, "y":0}, {"label":"K008", "x":8, "y":0}, {"label":"K009", "x":9, "y":0}, {"label":"K010", "x":10, "y":0}, {"label":"K011", "x":11, "y":0}, {"label":"K012", "x":12, "y":0}, {"label":"K013", "x":13, "y":0}, {"label":"K014", "x":14, "y":0}, {"label":"K100", "x":0, "y":1, "w":1.5}, {"label":"K102", "x":1.5, "y":1}, {"label":"K103", "x":2.5, "y":1}, {"label":"K104", "x":3.5, "y":1}, {"label":"K105", "x":4.5, "y":1}, {"label":"K106", "x":5.5, "y":1}, {"label":"K107", "x":6.5, "y":1}, {"label":"K108", "x":7.5, "y":1}, {"label":"K109", "x":8.5, "y":1}, {"label":"K110", "x":9.5, "y":1}, {"label":"K111", "x":10.5, "y":1}, {"label":"K112", "x":11.5, "y":1}, {"label":"K113", "x":12.5, "y":1}, {"label":"K114", "x":13.5, "y":1, "w":1.5}, {"label":"K200", "x":0, "y":2, "w":1.75}, {"label":"K202", "x":1.75, "y":2}, {"label":"K203", "x":2.75, "y":2}, {"label":"K204", "x":3.75, "y":2}, {"label":"K205", "x":4.75, "y":2}, {"label":"K206", "x":5.75, "y":2}, {"label":"K207", "x":6.75, "y":2}, {"label":"K208", "x":7.75, "y":2}, {"label":"K209", "x":8.75, "y":2}, {"label":"K210", "x":9.75, "y":2}, {"label":"K211", "x":10.75, "y":2}, {"label":"K212", "x":11.75, "y":2}, {"label":"K213", "x":12.75, "y":2, "w":2.25}, {"label":"K300", "x":0, "y":3, "w":2}, {"label":"K301", "x":2, "y":3}, {"label":"K302", "x":3, "y":3}, {"label":"K303", "x":4, "y":3}, {"label":"K304", "x":5, "y":3}, {"label":"K305", "x":6, "y":3}, {"label":"K306", "x":7, "y":3}, {"label":"K307", "x":8, "y":3}, {"label":"K308", "x":9, "y":3}, {"label":"K309", "x":10, "y":3}, {"label":"K310", "x":11, "y":3}, {"label":"K312", "x":12, "y":3}, {"label":"K313", "x":13, "y":3}, {"label":"K314", "x":14, "y":3}, {"label":"K400", "x":0, "y":4, "w":1.25}, {"label":"K401", "x":1.25, "y":4, "w":1.25}, {"label":"K403", "x":2.5, "y":4, "w":1.25}, {"label":"K406", "x":3.75, "y":4, "w":6.25}, {"label":"K410", "x":10, "y":4}, {"label":"K411", "x":11, "y":4}, {"label":"K412", "x":12, "y":4}, {"label":"K413", "x":13, "y":4}, {"label":"K414", "x":14, "y":4}] - }, "LAYOUT_60_iso_5x1u": { "key_count": 63, - "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"|", "x":12.75, "y":2}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"label":"~", "x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"/", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Fn", "x":10, "y":4}, {"label":"←", "x":11, "y":4}, {"label":"↓", "x":12, "y":4}, {"label":"↑", "x":13, "y":4}, {"label":"→", "x":14, "y":4}] - }, - "LAYOUT_60_ansi_split_bs_rshift_5x1u": { - "key_count": 64, - "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"1", "x":1, "y":0}, {"label":"2", "x":2, "y":0}, {"label":"3", "x":3, "y":0}, {"label":"4", "x":4, "y":0}, {"label":"5", "x":5, "y":0}, {"label":"6", "x":6, "y":0}, {"label":"7", "x":7, "y":0}, {"label":"8", "x":8, "y":0}, {"label":"9", "x":9, "y":0}, {"label":"0", "x":10, "y":0}, {"label":"-", "x":11, "y":0}, {"label":"=", "x":12, "y":0}, {"label":"\\", "x":13, "y":0}, {"label":"`", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"[", "x":11.5, "y":1}, {"label":"]", "x":12.5, "y":1}, {"label":"Backspace", "x":13.5, "y":1, "w":1.5}, {"label":"Control", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":";", "x":10.75, "y":2}, {"label":"'", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":",", "x":9.25, "y":3}, {"label":".", "x":10.25, "y":3}, {"label":"/", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"label":"Fn", "x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4}, {"label":"←", "x":11, "y":4}, {"label":"↓", "x":12, "y":4}, {"label":"↑", "x":13, "y":4}, {"label":"→", "x":14, "y":4}] + "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"|", "x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"label":"~", "x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"/", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Fn", "x":10, "y":4}, {"label":"←", "x":11, "y":4}, {"label":"↓", "x":12, "y":4}, {"label":"↑", "x":13, "y":4}, {"label":"→", "x":14, "y":4}] } } } diff --git a/keyboards/dz60/keymaps/256k_HHKB/keymap.c b/keyboards/dz60/keymaps/256k_HHKB/keymap.c index f426e3d1f..1448e4ddc 100644 --- a/keyboards/dz60/keymaps/256k_HHKB/keymap.c +++ b/keyboards/dz60/keymaps/256k_HHKB/keymap.c @@ -29,11 +29,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ - [_DEFAULT] = LAYOUT_hhkb( + [_DEFAULT] = LAYOUT_60_hhkb( KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, - KC_LSFT, KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(_FN), + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(_FN), KC_LGUI, KC_LALT, KC_SPC, MO(_ALTFN), MO(_LIGHTS)), @@ -55,12 +55,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `---------------------------------------------------------------------------------------------------------------------' */ - [_ALTFN] = LAYOUT_hhkb( + [_ALTFN] = LAYOUT_60_hhkb( MO(_MOUSEFN), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ______, KC_PSCR, KC_CAPS, ______, ______, ______, ______, ______, ______, ______, ______, ______, KC_UP, KC_VOLD, KC_VOLU, KC_DEL, ______, ______, ______, ______, ______, ______, ______, KC_HOME, KC_END, KC_LEFT, KC_DOWN, KC_RIGHT, ______, - ______, ______, ______, ______, ______, ______, ______, ______, ______, KC_MPRV, KC_MNXT, KC_MPLY, ______, ______, + ______, ______, ______, ______, ______, ______, ______, ______, KC_MPRV, KC_MNXT, KC_MPLY, ______, ______, ______, ______, ______, ______, ______), @@ -85,12 +85,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ - [_MOUSEFN] = LAYOUT_hhkb( + [_MOUSEFN] = LAYOUT_60_hhkb( ______, KC_ACL0, KC_ACL1, KC_ACL2, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, KC_MS_UP, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, ______, - ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, + ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______), @@ -116,11 +116,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_FN] = LAYOUT_hhkb( + [_FN] = LAYOUT_60_hhkb( ______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, ______, KC_CAPS, ______, ______, ______, ______, ______, ______, ______, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, ______, KC_DEL, ______, KC_VOLD, KC_VOLU, KC_MUTE, ______, ______, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, ______, - ______, ______, KC_MPRV, KC_MPLY, KC_MNXT, ______, ______, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, ______, ______, + ______, KC_MPRV, KC_MPLY, KC_MNXT, ______, ______, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, ______, ______, ______, ______, ______, ______, ______), @@ -146,11 +146,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_LIGHTS] = LAYOUT_hhkb( + [_LIGHTS] = LAYOUT_60_hhkb( RGB_TOG, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, RGB_M_SN, RGB_M_K, RGB_M_X, RGB_M_G, ______, ______, ______, ______, ______, ______, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, RGB_HUD, RGB_SAD, RGB_VAD, ______, ______, ______, ______, ______, ______, ______, ______, ______, - ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, + ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______), }; diff --git a/keyboards/dz60/keymaps/60_ansi_arrow_fkeys/config.h b/keyboards/dz60/keymaps/60_ansi_arrow_fkeys/config.h new file mode 100644 index 000000000..9560d51a6 --- /dev/null +++ b/keyboards/dz60/keymaps/60_ansi_arrow_fkeys/config.h @@ -0,0 +1 @@ +#define GRAVE_ESC_GUI_OVERRIDE # Always send Escape if GUI is pressed diff --git a/keyboards/dz60/keymaps/60_ansi_arrow_fkeys/keymap.c b/keyboards/dz60/keymaps/60_ansi_arrow_fkeys/keymap.c index 76804670c..0d3b65363 100644 --- a/keyboards/dz60/keymaps/60_ansi_arrow_fkeys/keymap.c +++ b/keyboards/dz60/keymaps/60_ansi_arrow_fkeys/keymap.c @@ -1,7 +1,5 @@ #include QMK_KEYBOARD_H -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) - #define ______ KC_TRNS const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { @@ -20,11 +18,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------------' */ - LAYOUT_2_shifts( - F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, ______, KC_BSPC, + LAYOUT_directional( + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, ______, KC_BSPC, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, - KC_LSFT, ______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_DEL, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_DEL, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RIGHT ), @@ -50,37 +48,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______ ), }; - -enum function_id { - SHIFT_ESC, -}; - -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_FUNCTION(SHIFT_ESC), -}; - -void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { - static uint8_t shift_esc_shift_mask; - switch (id) { - case SHIFT_ESC: - shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK; - if (record->event.pressed) { - if (shift_esc_shift_mask) { - add_key(KC_GRV); - send_keyboard_report(); - } else { - add_key(KC_ESC); - send_keyboard_report(); - } - } else { - if (shift_esc_shift_mask) { - del_key(KC_GRV); - send_keyboard_report(); - } else { - del_key(KC_ESC); - send_keyboard_report(); - } - } - break; - } -} diff --git a/keyboards/dz60/keymaps/60_plus_arrows/keymap.c b/keyboards/dz60/keymaps/60_plus_arrows/keymap.c index a4b2dc29e..f38cdb285 100644 --- a/keyboards/dz60/keymaps/60_plus_arrows/keymap.c +++ b/keyboards/dz60/keymaps/60_plus_arrows/keymap.c @@ -1,7 +1,5 @@ #include QMK_KEYBOARD_H -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) - #define ______ KC_TRNS const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { @@ -20,11 +18,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------------' */ - LAYOUT_2_shifts( + LAYOUT_directional( KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, ______, KC_BSPC, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, - KC_LSFT, ______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, MO(1), + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, MO(1), KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_SPC, KC_SPC, KC_RGUI, KC_RALT, KC_LEFT, KC_DOWN, KC_RIGHT ), @@ -50,37 +48,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______ ), }; - -enum function_id { - SHIFT_ESC, -}; - -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_FUNCTION(SHIFT_ESC), -}; - -void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { - static uint8_t shift_esc_shift_mask; - switch (id) { - case SHIFT_ESC: - shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK; - if (record->event.pressed) { - if (shift_esc_shift_mask) { - add_key(KC_GRV); - send_keyboard_report(); - } else { - add_key(KC_ESC); - send_keyboard_report(); - } - } else { - if (shift_esc_shift_mask) { - del_key(KC_GRV); - send_keyboard_report(); - } else { - del_key(KC_ESC); - send_keyboard_report(); - } - } - break; - } -} diff --git a/keyboards/dz60/keymaps/Ansi_plus_fn_arrows/config.h b/keyboards/dz60/keymaps/Ansi_plus_fn_arrows/config.h new file mode 100644 index 000000000..9560d51a6 --- /dev/null +++ b/keyboards/dz60/keymaps/Ansi_plus_fn_arrows/config.h @@ -0,0 +1 @@ +#define GRAVE_ESC_GUI_OVERRIDE # Always send Escape if GUI is pressed diff --git a/keyboards/dz60/keymaps/Ansi_plus_fn_arrows/keymap.c b/keyboards/dz60/keymaps/Ansi_plus_fn_arrows/keymap.c index 778a5ac03..4c6552675 100644 --- a/keyboards/dz60/keymaps/Ansi_plus_fn_arrows/keymap.c +++ b/keyboards/dz60/keymaps/Ansi_plus_fn_arrows/keymap.c @@ -1,11 +1,9 @@ #include QMK_KEYBOARD_H -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LAYOUT( - F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_NO, KC_BSPC, + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_NO, KC_BSPC, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_LSFT, KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_NO, @@ -25,37 +23,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), }; - -enum function_id { - SHIFT_ESC, -}; - -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_FUNCTION(SHIFT_ESC), -}; - -void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { - static uint8_t shift_esc_shift_mask; - switch (id) { - case SHIFT_ESC: - shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK; - if (record->event.pressed) { - if (shift_esc_shift_mask) { - add_key(KC_GRV); - send_keyboard_report(); - } else { - add_key(KC_ESC); - send_keyboard_report(); - } - } else { - if (shift_esc_shift_mask) { - del_key(KC_GRV); - send_keyboard_report(); - } else { - del_key(KC_ESC); - send_keyboard_report(); - } - } - break; - } -} diff --git a/keyboards/dz60/keymaps/dbroqua/keymap.c b/keyboards/dz60/keymaps/dbroqua/keymap.c index c6c77210d..0b4deae51 100644 --- a/keyboards/dz60/keymaps/dbroqua/keymap.c +++ b/keyboards/dz60/keymaps/dbroqua/keymap.c @@ -64,7 +64,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | * `-----------------------------------------------------------------' */ - [_SFX] = LAYOUT_hhkb( + [_SFX] = LAYOUT_true_hhkb( ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, \ ______, BL_TOGG,BL_STEP,BL_DEC, BL_INC, ______, ______, ______, ______, ______, ______, ______, ______, ______, \ ______, RGB_TOG,RGB_MOD,______, ______, ______, ______, ______, ______, ______, ______, ______, ______, \ diff --git a/keyboards/dz60/keymaps/default/keymap.c b/keyboards/dz60/keymaps/default/keymap.c index 426b10989..1d375a3c6 100644 --- a/keyboards/dz60/keymaps/default/keymap.c +++ b/keyboards/dz60/keymaps/default/keymap.c @@ -1,11 +1,9 @@ #include QMK_KEYBOARD_H -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LAYOUT( - F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_NO, KC_BSPC, + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_NO, KC_BSPC, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_LSFT, KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_NO, @@ -25,37 +23,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), }; - -enum function_id { - SHIFT_ESC, -}; - -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_FUNCTION(SHIFT_ESC), -}; - -void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { - static uint8_t shift_esc_shift_mask; - switch (id) { - case SHIFT_ESC: - shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK; - if (record->event.pressed) { - if (shift_esc_shift_mask) { - add_key(KC_GRV); - send_keyboard_report(); - } else { - add_key(KC_ESC); - send_keyboard_report(); - } - } else { - if (shift_esc_shift_mask) { - del_key(KC_GRV); - send_keyboard_report(); - } else { - del_key(KC_ESC); - send_keyboard_report(); - } - } - break; - } -} diff --git a/keyboards/dz60/keymaps/eric/keymap.c b/keyboards/dz60/keymaps/eric/keymap.c index d2cabebe7..a384de480 100644 --- a/keyboards/dz60/keymaps/eric/keymap.c +++ b/keyboards/dz60/keymaps/eric/keymap.c @@ -1,7 +1,5 @@ #include QMK_KEYBOARD_H -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Layer 0 @@ -56,37 +54,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO), }; - -enum function_id { - SHIFT_ESC, -}; - -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_FUNCTION(SHIFT_ESC) -}; - -void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { - static uint8_t shift_esc_shift_mask; - switch (id) { - case SHIFT_ESC: - shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK; - if (record->event.pressed) { - if (shift_esc_shift_mask) { - add_key(KC_GRV); - send_keyboard_report(); - } else { - add_key(KC_ESC); - send_keyboard_report(); - } - } else { - if (shift_esc_shift_mask) { - del_key(KC_GRV); - send_keyboard_report(); - } else { - del_key(KC_ESC); - send_keyboard_report(); - } - } - break; - } -} diff --git a/keyboards/dz60/keymaps/f3d3/keymap.c b/keyboards/dz60/keymaps/f3d3/keymap.c index 85bb05a1d..1e92aabc1 100644 --- a/keyboards/dz60/keymaps/f3d3/keymap.c +++ b/keyboards/dz60/keymaps/f3d3/keymap.c @@ -1,7 +1,5 @@ #include QMK_KEYBOARD_H -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Layer 0 @@ -18,7 +16,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------------' */ - LAYOUT_2_shifts( + LAYOUT_all( KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSPC, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, @@ -42,44 +40,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ - LAYOUT_2_shifts( + LAYOUT_all( KC_PWR, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_DEL, KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, BL_TOGG, BL_DEC, BL_INC, BL_STEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MSTP, KC_TRNS, KC_TRNS, KC_MPRV, KC_VOLD, KC_MNXT), }; - -enum function_id { - SHIFT_ESC, -}; - -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_FUNCTION(SHIFT_ESC), -}; - -void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { - static uint8_t shift_esc_shift_mask; - switch (id) { - case SHIFT_ESC: - shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK; - if (record->event.pressed) { - if (shift_esc_shift_mask) { - add_key(KC_GRV); - send_keyboard_report(); - } else { - add_key(KC_ESC); - send_keyboard_report(); - } - } else { - if (shift_esc_shift_mask) { - del_key(KC_GRV); - send_keyboard_report(); - } else { - del_key(KC_ESC); - send_keyboard_report(); - } - } - break; - } -} diff --git a/keyboards/dz60/keymaps/frogger/keymap.c b/keyboards/dz60/keymaps/frogger/keymap.c index 86a468791..75e805cd9 100644 --- a/keyboards/dz60/keymaps/frogger/keymap.c +++ b/keyboards/dz60/keymaps/frogger/keymap.c @@ -1,7 +1,5 @@ #include QMK_KEYBOARD_H -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) - #define ______ KC_TRNS #define LAYER_1 1 @@ -24,7 +22,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------------' */ - LAYOUT_2_shifts( + LAYOUT_all( KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, ______, KC_BSPC, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, @@ -52,7 +50,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_MPRV, KC_MPLY, KC_MNXT, */ - LAYOUT_2_shifts( + LAYOUT_all( KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ______, KC_DEL, ______, KC_MPRV, KC_MPLY, KC_MNXT, ______, ______, ______, ______, KC_UP, ______, ______, ______, ______, ______, @@ -78,7 +76,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------------' */ - LAYOUT_2_shifts( + LAYOUT_all( RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ______, RESET, ______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, ______, ______, ______, ______, ______, diff --git a/keyboards/dz60/keymaps/hailbreno/keymap.c b/keyboards/dz60/keymaps/hailbreno/keymap.c index cc718c393..edc22a5a2 100644 --- a/keyboards/dz60/keymaps/hailbreno/keymap.c +++ b/keyboards/dz60/keymaps/hailbreno/keymap.c @@ -44,7 +44,7 @@ enum keycodes { * | | | | | | | | | | | | * `-----------------------------------------------------------------------------------------' - [LAYOUT] = LAYOUT_2_shifts( + [LAYOUT] = LAYOUT_all( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, @@ -67,7 +67,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Ctrl | Alt | Gui | Backspace | Fn2 | Space | Alt | App | Left| Down|Right| * `-----------------------------------------------------------------------------------------' */ -[_QWERTY] = LAYOUT_2_shifts( +[_QWERTY] = LAYOUT_all( KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_DEL, LT(_FUNC,KC_CAPS), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, @@ -87,7 +87,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Ctrl | Alt | Gui | Backspace | Fn2 | Space | Alt | App | Left| Down|Right| * `-----------------------------------------------------------------------------------------' */ -[_COLEMAK] = LAYOUT_2_shifts( +[_COLEMAK] = LAYOUT_all( KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LBRC, KC_RBRC, KC_DEL, LT(_FUNC,KC_CAPS), KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENT, @@ -107,7 +107,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Ctrl | Alt | Gui | Backspace | Fn2 | Space | Alt | App | Left| Down|Right| * `-----------------------------------------------------------------------------------------' */ -[_DVORAK] = LAYOUT_2_shifts( +[_DVORAK] = LAYOUT_all( KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, KC_RBRC, KC_BSLS, KC_GRV, KC_TAB, KC_QUOTE, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, KC_EQL, KC_DEL, LT(_FUNC,KC_CAPS), KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, KC_ENT, @@ -127,7 +127,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | Home| PgDn| End | * `-----------------------------------------------------------------------------------------' */ -[_FUNC] = LAYOUT_2_shifts( +[_FUNC] = LAYOUT_all( _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_INS, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, KC_UP, KC_PGDN, KC_CIRC, _______, _______, KC_BSPC, _______, _______, _______, _______, _______, _______, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, _______, KC_TILD, _______, @@ -147,7 +147,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | | | * `-----------------------------------------------------------------------------------------' */ -[_FUNC2] = LAYOUT_2_shifts( +[_FUNC2] = LAYOUT_all( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, @@ -167,7 +167,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | | | * `-----------------------------------------------------------------------------------------' */ -[_RGB] = LAYOUT_2_shifts( +[_RGB] = LAYOUT_all( _______, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, RGB_M_SN, RGB_M_K, RGB_M_X, RGB_M_G, _______, _______, _______, _______, _______, _______, _______, RGB_VAI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_HUD, RGB_VAD, RGB_HUI, _______, _______, _______, _______, _______, _______, _______, _______, _______, @@ -187,7 +187,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | |Qwerty|Colemk|Dvorak| * `-----------------------------------------------------------------------------------------' */ -[_ADJUST] = LAYOUT_2_shifts( +[_ADJUST] = LAYOUT_all( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, diff --git a/keyboards/dz60/keymaps/iso_6u_space/keymap.c b/keyboards/dz60/keymaps/iso_6u_space/keymap.c index 15ad72f3e..e0085b490 100644 --- a/keyboards/dz60/keymaps/iso_6u_space/keymap.c +++ b/keyboards/dz60/keymaps/iso_6u_space/keymap.c @@ -1,74 +1,44 @@ #include QMK_KEYBOARD_H -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * _______ can be used in place of KC_TRNS (transparent) * + * XXXXXXX can be used in place of KC_NO (No Operation) * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -/* ISO 6u layout layer 0 -* ,-----------------------------------------------------------------------------------------. -* | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | ß | ´ | BSPC | -* |-----------------------------------------------------------------------------------------+ -* | Tab | Q | W | E | R | T | Z | U | I | O | P | P | Ü | * | | -* |-------------------------------------------------------------------------------------| + -* | Layer_1 | A | S | D | F | G | H | J | K | L | Ö | Ä | # |Enter | -* |-----------------------------------------------------------------------------------------+ -* | Shift| < | Y | X | C | V | B | N | M | , | . | . | - | RShift | -* |-----------------------------------------------------------------------------------------+ -* | LCtrl | LGUI | LAlt | Space | RAlt | RGUI | Layer_2 | RCtrl | -* `-----------------------------------------------------------------------------------------' -*/ - LAYOUT( - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_NO, KC_BSPC, - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, - MO(1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, - KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_NO, - KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT,KC_RGUI, KC_NO, MO(2), KC_RCTL), + /* ISO 6u layout layer 0 (UK Layout shown) + * ,-----------------------------------------------------------. + * |Esc|1 !|2 "|3 £|4 $|5 %|6 ^|7 &|8 *|9 (|0 )|- _|= +| Bksp | + * |-----------------------------------------------------------| + * | Tab | Q | W | E | R | T | Y | U | I | O | P |[ {|] }|Enter| + * |------------------------------------------------------. | + * | Fn1 | A | S | D | F | G | H | J | K | L |; :|' @|# ~| | + * |-----------------------------------------------------------| + * |Sft |\ || Z | X | C | V | B | N | M |, <|. >|/ ?| Shift | + * |-----------------------------------------------------------| + * |Ctrl |GUI|Alt | Space |Alt |GUI|Fn2|Ctrl | + * `-----------------------------------------------------------' + */ + [0] = LAYOUT_60_iso( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, + MO(1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(2), KC_RCTL), - LAYOUT( - KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NO, KC_DEL, - KC_NO, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - KC_LSFT, KC_NO, KC_NO, KC_NO, BL_DEC, BL_TOGG, BL_INC, BL_STEP, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - KC_LCTL, KC_LGUI, KC_LGUI, KC_NO, KC_NO, KC_NO, KC_RALT, KC_RGUI, KC_NO, KC_NO, KC_RCTL), + [1] = LAYOUT_60_iso( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, + XXXXXXX, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_LSFT, XXXXXXX, XXXXXXX, XXXXXXX, BL_DEC, BL_TOGG, BL_INC, BL_STEP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_LCTL, KC_LGUI, KC_LGUI, XXXXXXX, KC_RALT, KC_RGUI, _______, KC_RCTL), + + [2] = LAYOUT_60_iso( + KC_GRV, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_DEL, + XXXXXXX, XXXXXXX, KC_UP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + _______, KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_LCTL, KC_LGUI, KC_LALT, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX), - LAYOUT( - KC_GRV, KC_MPRV, KC_MPLY, KC_MNXT, M(4), M(5), M(6), M(7), M(8), M(9), M(10), M(11), M(12), KC_NO, KC_DEL, - KC_NO, KC_NO, KC_UP, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - KC_NO, KC_LEFT, KC_DOWN, KC_RIGHT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - KC_LSFT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - KC_LCTL, KC_LGUI, KC_LALT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO), }; - -enum function_id { - SHIFT_ESC, -}; - -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_FUNCTION(SHIFT_ESC), -}; - -void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { - static uint8_t shift_esc_shift_mask; - switch (id) { - case SHIFT_ESC: - shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK; - if (record->event.pressed) { - if (shift_esc_shift_mask) { - add_key(KC_GRV); - send_keyboard_report(); - } else { - add_key(KC_ESC); - send_keyboard_report(); - } - } else { - if (shift_esc_shift_mask) { - del_key(KC_GRV); - send_keyboard_report(); - } else { - del_key(KC_ESC); - send_keyboard_report(); - } - } - break; - } -} diff --git a/keyboards/dz60/keymaps/iso_7u_space/keymap.c b/keyboards/dz60/keymaps/iso_7u_space/keymap.c index 2de244598..016fe9a6a 100644 --- a/keyboards/dz60/keymaps/iso_7u_space/keymap.c +++ b/keyboards/dz60/keymaps/iso_7u_space/keymap.c @@ -1,76 +1,47 @@ #include QMK_KEYBOARD_H -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * _______ can be used in place of KC_TRNS (transparent) * + * XXXXXXX can be used in place of KC_NO (No Operation) * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -/* ISO 7u layout layer 0 -* ,-----------------------------------------------------------------------------------------. -* | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | ß | ´ | BSPC | -* |-----------------------------------------------------------------------------------------+ -* | Tab | Q | W | E | R | T | Z | U | I | O | P | P | Ü | * | | -* |-------------------------------------------------------------------------------------| + -* | Layer_1 | A | S | D | F | G | H | J | K | L | Ö | Ä | # |Enter | -* |-----------------------------------------------------------------------------------------+ -* | Shift| < | Y | X | C | V | B | N | M | , | . | . | - | RShift | -* |-----------------------------------------------------------------------------------------+ -* | LCtrl | LGUI | LAlt | Space | RAlt | Layer_2 | RCtrl | -* `-----------------------------------------------------------------------------------------' -*/ + /* ISO 7u layout layer 0 + * ,-----------------------------------------------------------. + * |Esc|1 !|2 "|3 £|4 $|5 %|6 ^|7 &|8 *|9 (|0 )|- _|= +| Bksp | + * |-----------------------------------------------------------| + * | Tab | Q | W | E | R | T | Y | U | I | O | P |[ {|] }|Enter| + * |------------------------------------------------------. | + * | Fn1 | A | S | D | F | G | H | J | K | L |; :|' @|# ~| | + * |-----------------------------------------------------------| + * |Sft |\ || Z | X | C | V | B | N | M |, <|. >|/ ?| Shift | + * |-----------------------------------------------------------| + * |Ctrl |GUI|Alt | Space |Alt |Fn2|Ctrl | + * `-----------------------------------------------------------' + */ + [0] = LAYOUT_60_iso( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, + MO(1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_BSLS, KC_ENT, + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, XXXXXXX, KC_RALT, MO(2), KC_RCTL + ), - LAYOUT( - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_NO, KC_BSPC, - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, - MO(1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, - KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, - KC_LCTL, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_NO, KC_RALT, KC_NO, MO(2), KC_RCTL), + [1] = LAYOUT_60_iso( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, + XXXXXXX, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_PGUP, XXXXXXX, XXXXXXX, XXXXXXX, BL_DEC, BL_TOGG, BL_INC, BL_STEP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_PGDN, KC_LGUI, KC_LGUI, XXXXXXX, XXXXXXX, KC_RGUI, _______, KC_RCTL + ), + [2] = LAYOUT_60_iso( + KC_GRV, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_DEL, + XXXXXXX, XXXXXXX, KC_UP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + _______, KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_LCTL, KC_LGUI, KC_LALT, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX + ), - LAYOUT( - KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NO, KC_DEL, - KC_NO, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - KC_PGUP, KC_NO, KC_NO, KC_NO, BL_DEC, BL_TOGG, BL_INC, BL_STEP, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - KC_PGDOWN, KC_LGUI, KC_LGUI, KC_NO, KC_NO, KC_NO, KC_RALT, KC_RGUI, KC_NO, KC_NO, KC_RCTL), - - LAYOUT( - KC_GRV, KC_MPRV, KC_MPLY, KC_MNXT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_DEL, - KC_NO, KC_NO, KC_UP, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - KC_NO, KC_LEFT, KC_DOWN, KC_RIGHT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - KC_LSFT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - KC_LCTL, KC_LGUI, KC_LALT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO), }; - -enum function_id { - SHIFT_ESC, -}; - -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_FUNCTION(SHIFT_ESC), -}; - -void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { - static uint8_t shift_esc_shift_mask; - switch (id) { - case SHIFT_ESC: - shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK; - if (record->event.pressed) { - if (shift_esc_shift_mask) { - add_key(KC_GRV); - send_keyboard_report(); - } else { - add_key(KC_ESC); - send_keyboard_report(); - } - } else { - if (shift_esc_shift_mask) { - del_key(KC_GRV); - send_keyboard_report(); - } else { - del_key(KC_ESC); - send_keyboard_report(); - } - } - break; - } -} diff --git a/keyboards/dz60/keymaps/iso_uk/keymap.c b/keyboards/dz60/keymaps/iso_uk/keymap.c index 1c15a59df..13e6e1859 100644 --- a/keyboards/dz60/keymaps/iso_uk/keymap.c +++ b/keyboards/dz60/keymaps/iso_uk/keymap.c @@ -18,8 +18,6 @@ #define MO_FN MO(1) #define MO_FN MO(1) -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_QWERTY] = LAYOUT_60_iso( @@ -50,37 +48,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), }; - -enum function_id { - SHIFT_ESC, -}; - -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_FUNCTION(SHIFT_ESC), -}; - -void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { - static uint8_t shift_esc_shift_mask; - switch (id) { - case SHIFT_ESC: - shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK; - if (record->event.pressed) { - if (shift_esc_shift_mask) { - add_key(KC_GRV); - send_keyboard_report(); - } else { - add_key(KC_ESC); - send_keyboard_report(); - } - } else { - if (shift_esc_shift_mask) { - del_key(KC_GRV); - send_keyboard_report(); - } else { - del_key(KC_ESC); - send_keyboard_report(); - } - } - break; - } -} diff --git a/keyboards/dz60/keymaps/iso_vim_arrow/keymap.c b/keyboards/dz60/keymaps/iso_vim_arrow/keymap.c index 9e85a89ee..4dad9e19f 100644 --- a/keyboards/dz60/keymaps/iso_vim_arrow/keymap.c +++ b/keyboards/dz60/keymaps/iso_vim_arrow/keymap.c @@ -1,7 +1,5 @@ #include QMK_KEYBOARD_H -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* ISO 5x1u layout (ISO German keyboard layout shown) @@ -23,8 +21,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ LAYOUT_60_iso_5x1u( KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_ENT, - MO(1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_BSLS, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, + MO(1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_BSLS, KC_ENT, KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT ), @@ -32,44 +30,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LAYOUT_60_iso_5x1u( KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, - KC_NO, KC_NO, KC_NO, KC_NO, RESET, KC_NO, KC_HOME, KC_PGDN, KC_PGUP, KC_END, KC_PSCR, KC_NO, KC_NO, KC_NO, - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_END, KC_DEL, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, RESET, KC_NO, KC_HOME, KC_PGDN, KC_PGUP, KC_END, KC_PSCR, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_END, KC_DEL, KC_NO, KC_NO, KC_LSFT, BL_TOGG, KC_APP, KC_PAUS, KC_INS, KC_NO, KC_MPLY, KC_MSTP, KC_MUTE, KC_VOLD, KC_VOLU, KC_NO, KC_RSFT, KC_LCTL, KC_LGUI, KC_LALT, KC_BSPC, KC_DEL, KC_HOME, KC_PGDN, KC_PGUP, KC_END ), }; - -enum function_id { - SHIFT_ESC, -}; - -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_FUNCTION(SHIFT_ESC), -}; - -void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { - static uint8_t shift_esc_shift_mask; - switch (id) { - case SHIFT_ESC: - shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK; - if (record->event.pressed) { - if (shift_esc_shift_mask) { - add_key(KC_GRV); - send_keyboard_report(); - } else { - add_key(KC_ESC); - send_keyboard_report(); - } - } else { - if (shift_esc_shift_mask) { - del_key(KC_GRV); - send_keyboard_report(); - } else { - del_key(KC_ESC); - send_keyboard_report(); - } - } - break; - } -} diff --git a/keyboards/dz60/keymaps/itsaferbie/keymap.c b/keyboards/dz60/keymaps/itsaferbie/keymap.c index ecc99cc75..de30e0538 100644 --- a/keyboards/dz60/keymaps/itsaferbie/keymap.c +++ b/keyboards/dz60/keymaps/itsaferbie/keymap.c @@ -9,25 +9,25 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_DEFAULT] = LAYOUT_hhkb( + [_DEFAULT] = LAYOUT_60_hhkb( KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, - KC_LSFT, KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(_FN), + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(_FN), KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_LIGHTS)), - [_FN] = LAYOUT_hhkb( + [_FN] = LAYOUT_60_hhkb( ______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, KC_CAPS, ______, ______, ______, ______, ______, ______, ______, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, ______, RESET, ______, KC_VOLD, KC_VOLU, KC_MUTE, ______, ______, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, ______, - ______, ______, KC_MPRV, KC_MPLY, KC_MNXT, ______, ______, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, ______, ______, + ______, KC_MPRV, KC_MPLY, KC_MNXT, ______, ______, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, ______, ______, ______, ______, ______, ______, ______), - [_LIGHTS] = LAYOUT_hhkb( + [_LIGHTS] = LAYOUT_60_hhkb( RGB_TOG, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, RGB_M_SN, RGB_M_K, RGB_M_X, RGB_M_G, ______, ______, ______, ______, ______, ______, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, RGB_HUD, RGB_SAD, RGB_VAD, ______, ______, ______, ______, ______, ______, ______, ______, ______, - ______, ______, ______, ______, BL_DEC, BL_TOGG, BL_INC, ______, ______, ______, ______, ______, ______, ______, + ______, ______, ______, BL_DEC, BL_TOGG, BL_INC, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______), }; diff --git a/keyboards/dz60/keymaps/jkbone/keymap.c b/keyboards/dz60/keymaps/jkbone/keymap.c index ecc391785..1efcbe38f 100644 --- a/keyboards/dz60/keymaps/jkbone/keymap.c +++ b/keyboards/dz60/keymaps/jkbone/keymap.c @@ -1,7 +1,6 @@ #include QMK_KEYBOARD_H #define ____ KC_TRNS -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) #define FL_ESC LT(_FL, KC_ESC) #define FL MO(_FL) @@ -11,60 +10,56 @@ enum layers_idx { _FL // Functions }; -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_BL] = LAYOUT_60_iso_5x1u( - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_ENT, - FL_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_BSLS, - KC_LSFT, KC_GRV, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, - KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, FL, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT - ), - [_ML] = LAYOUT_60_iso_5x1u( - ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, - ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, - ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, - ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, - KC_LGUI, KC_LALT, KC_LCTL, ____, ____, ____, ____, ____, ____ - ), - [_FL] = LAYOUT_60_iso_5x1u( - RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, - ____, ____, DF(_BL), DF(_ML), ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, - ____, ____, ____, ____, ____, ____, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, ____, ____, ____, - ____, F(3), F(2), F(1), F(0), ____, ____, ____, KC_MUTE, KC_MPRV, KC_MNXT, KC_MPLY, ____, - ____, ____, ____, ____, ____, ____, ____, ____, ____ - ) -}; - -enum function_id { - RGB_VAZ, +enum custom_keycodes { + RGB_VAZ = SAFE_RANGE, RGB_OAZ, RGB_WAN, RGB_000 }; -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_FUNCTION(RGB_VAZ), - [1] = ACTION_FUNCTION(RGB_OAZ), - [2] = ACTION_FUNCTION(RGB_WAN), - [3] = ACTION_FUNCTION(RGB_000) +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BL] = LAYOUT_60_iso_5x1u( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, + FL_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_BSLS,KC_ENT, + KC_LSFT, KC_GRV, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, FL, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT + ), + [_ML] = LAYOUT_60_iso_5x1u( + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, + KC_LGUI, KC_LALT, KC_LCTL, ____, ____, ____, ____, ____, ____ + ), + [_FL] = LAYOUT_60_iso_5x1u( + RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, + ____, ____, DF(_BL), DF(_ML), ____, ____, ____, ____, ____, ____, ____, ____, ____, + ____, ____, ____, ____, ____, ____, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, ____, ____, ____, ____, + ____, RGB_000, RGB_WAN, RGB_OAZ, RGB_VAZ, ____, ____, ____, KC_MUTE, KC_MPRV, KC_MNXT, KC_MPLY, ____, + ____, ____, ____, ____, ____, ____, ____, ____, ____ + ) }; -void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { - switch (id) { - case RGB_VAZ: +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (record->event.pressed) { + switch(keycode) { + case RGB_VAZ: rgblight_enable(); rgblight_setrgb(0, 204, 33); break; - case RGB_OAZ: + case RGB_OAZ: rgblight_enable(); rgblight_setrgb(229, 65, 0); break; - case RGB_WAN: + case RGB_WAN: rgblight_enable(); rgblight_setrgb(255, 255, 255); break; - case RGB_000: + case RGB_000: rgblight_disable(); break; + } } -} + return true; +}; diff --git a/keyboards/dz60/keymaps/krusli/keymap.c b/keyboards/dz60/keymaps/krusli/keymap.c index 36e7b801a..0ad6f1b2b 100644 --- a/keyboards/dz60/keymaps/krusli/keymap.c +++ b/keyboards/dz60/keymaps/krusli/keymap.c @@ -1,6 +1,5 @@ #include QMK_KEYBOARD_H -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) #define _______ KC_TRNS const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { diff --git a/keyboards/dz60/keymaps/macos_arrow/keymap.c b/keyboards/dz60/keymaps/macos_arrow/keymap.c index 7106092a4..81d61a59a 100644 --- a/keyboards/dz60/keymaps/macos_arrow/keymap.c +++ b/keyboards/dz60/keymaps/macos_arrow/keymap.c @@ -25,7 +25,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Ctrl | Alt | Gui | Space / _NL |Gui/_ML| Alt | Left| Down|Right| * `-----------------------------------------------------------------------------------------' */ - [_BL] = LAYOUT_2_shifts( + [_BL] = LAYOUT_all( KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_NO, KC_BSPC, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, LT(_FL, KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, @@ -44,7 +44,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | * `-----------------------------------------------------------------------------------------' */ - [_FL] = LAYOUT_2_shifts( + [_FL] = LAYOUT_all( _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NO, KC_DEL, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, _______, _______, _______, @@ -63,7 +63,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | * `-----------------------------------------------------------------------------------------' */ - [_ML] = LAYOUT_2_shifts( + [_ML] = LAYOUT_all( KC_MEDIA_EJECT, BR_DOWN, BR_UP, _______, _______, _______, _______, KC_MEDIA_PREV_TRACK, KC_MEDIA_PLAY_PAUSE, KC_MEDIA_NEXT_TRACK, KC_AUDIO_MUTE, KC_AUDIO_VOL_DOWN, KC_AUDIO_VOL_UP, KC_NO, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, @@ -82,7 +82,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | * `-----------------------------------------------------------------------------------------' */ - [_NL] = LAYOUT_2_shifts( + [_NL] = LAYOUT_all( _______, _______, _______, _______, _______, _______, _______, _______, KC_PERCENT, KC_LEFT_PAREN, KC_RIGHT_PAREN, KC_LEFT_ANGLE_BRACKET, KC_RIGHT_ANGLE_BRACKET, KC_NO, _______, _______, _______, _______, _______, _______, _______, _______, KC_ASTERISK, KC_0, KC_1, KC_2, KC_3, _______, RESET, _______, _______, _______, _______, _______, _______, _______, KC_DOT, KC_MINS, KC_4, KC_5, KC_6, _______, diff --git a/keyboards/dz60/keymaps/stephengrier/config.h b/keyboards/dz60/keymaps/stephengrier/config.h new file mode 100644 index 000000000..9560d51a6 --- /dev/null +++ b/keyboards/dz60/keymaps/stephengrier/config.h @@ -0,0 +1 @@ +#define GRAVE_ESC_GUI_OVERRIDE # Always send Escape if GUI is pressed diff --git a/keyboards/dz60/keymaps/stephengrier/keymap.c b/keyboards/dz60/keymaps/stephengrier/keymap.c index d9403f59e..f6bbe7893 100644 --- a/keyboards/dz60/keymaps/stephengrier/keymap.c +++ b/keyboards/dz60/keymaps/stephengrier/keymap.c @@ -1,7 +1,5 @@ #include QMK_KEYBOARD_H -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) - #define ______ KC_TRNS const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { @@ -20,11 +18,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------------' */ - LAYOUT_2_shifts( - F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, ______, KC_BSPC, + LAYOUT_directional( + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, ______, KC_BSPC, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, MO(1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, - KC_LSFT, ______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, MO(1), + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, MO(1), KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_SPC, KC_SPC, KC_RGUI, KC_RALT, KC_LEFT, KC_DOWN, KC_RIGHT ), @@ -50,37 +48,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______ ), }; - -enum function_id { - SHIFT_ESC, -}; - -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_FUNCTION(SHIFT_ESC), -}; - -void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { - static uint8_t shift_esc_shift_mask; - switch (id) { - case SHIFT_ESC: - shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK; - if (record->event.pressed) { - if (shift_esc_shift_mask) { - add_key(KC_GRV); - send_keyboard_report(); - } else { - add_key(KC_ESC); - send_keyboard_report(); - } - } else { - if (shift_esc_shift_mask) { - del_key(KC_GRV); - send_keyboard_report(); - } else { - del_key(KC_ESC); - send_keyboard_report(); - } - } - break; - } -} diff --git a/keyboards/dz60/keymaps/weeheavy/keymap.c b/keyboards/dz60/keymaps/weeheavy/keymap.c index a98e3eeb2..cb9697e10 100644 --- a/keyboards/dz60/keymaps/weeheavy/keymap.c +++ b/keyboards/dz60/keymaps/weeheavy/keymap.c @@ -12,7 +12,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // Base layer - ANSI QWERTY -[L0] = LAYOUT_2_shifts( +[L0] = LAYOUT_all( KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, XXXX, KC_BSPC, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, @@ -20,7 +20,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(L1), KC_SPC, KC_RALT, MO(L2), KC_LEFT, KC_DOWN, KC_RIGHT), // Utility layer - RGB and multimedia control -[L1] = LAYOUT_2_shifts( +[L1] = LAYOUT_all( ____, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ____, ____, ____, RGB_TOG, RGB_MOD, RGB_M_K, RGB_M_R, ____, ____, KC_PSCR, ____, KC_PAUS, ____, ____, ____, ____, ____, RGB_HUI, RGB_HUD, ____, ____, ____, ____, KC_INS, KC_HOME, KC_PGUP, ____, ____, ____, @@ -28,7 +28,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ____, RGB_VAI, RGB_VAD, ____, ____, ____, ____, ____, KC_MPRV, KC_VOLD, KC_MNXT), // Setup layer - Reset an additional "b" button -[L2] = LAYOUT_2_shifts( +[L2] = LAYOUT_all( RESET, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, KC_B, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, RESET, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, From 9f2e39732f2458b1bfe5d546581da508c2be577e Mon Sep 17 00:00:00 2001 From: Rebecca Le <543859+sevenseacat@users.noreply.github.com> Date: Tue, 2 Oct 2018 11:43:43 +0800 Subject: [PATCH 207/788] Keyboard: Add support for the KBD4x (#4036) * Generate a new project for the KBD4x * Specify the possible layouts for the KBD4x - MIT and grid * Fill out the readme for the KBD4x * Configure the default keymap and wiring configuration as specified on http://qmkeyboard.cn/ * Add info.json for QMK Configurator * Enable backlight support for the KBD4x * Standardise on LAYOUT_planck_mit/LAYOUT_ortho_4x12 layout names * Add whitespace so the Readme will render correctly * Disable mouse keys support for the KBD4x to make the firmware small enough --- keyboards/kbd4x/config.h | 223 ++++++++++++++++++++++ keyboards/kbd4x/info.json | 112 +++++++++++ keyboards/kbd4x/kbd4x.c | 43 +++++ keyboards/kbd4x/kbd4x.h | 48 +++++ keyboards/kbd4x/keymaps/default/config.h | 19 ++ keyboards/kbd4x/keymaps/default/keymap.c | 52 +++++ keyboards/kbd4x/keymaps/default/readme.md | 1 + keyboards/kbd4x/readme.md | 15 ++ keyboards/kbd4x/rules.mk | 81 ++++++++ 9 files changed, 594 insertions(+) create mode 100644 keyboards/kbd4x/config.h create mode 100644 keyboards/kbd4x/info.json create mode 100644 keyboards/kbd4x/kbd4x.c create mode 100644 keyboards/kbd4x/kbd4x.h create mode 100644 keyboards/kbd4x/keymaps/default/config.h create mode 100644 keyboards/kbd4x/keymaps/default/keymap.c create mode 100644 keyboards/kbd4x/keymaps/default/readme.md create mode 100644 keyboards/kbd4x/readme.md create mode 100644 keyboards/kbd4x/rules.mk diff --git a/keyboards/kbd4x/config.h b/keyboards/kbd4x/config.h new file mode 100644 index 000000000..b967ab8f7 --- /dev/null +++ b/keyboards/kbd4x/config.h @@ -0,0 +1,223 @@ +/* +Copyright 2018 sevenseacat + +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 . +*/ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0000 +#define DEVICE_VER 0x0001 +#define MANUFACTURER KBDFans +#define PRODUCT KBD4x +#define DESCRIPTION A compact 40% (12x4) ortholinear keyboard kit. + +/* key matrix size */ +#define MATRIX_ROWS 4 +#define MATRIX_COLS 12 + +/* + * 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 { D0, D1, D2, D3 } +#define MATRIX_COL_PINS { F0, F1, F4, F5, F6, F7, B3, B1, B0, D5, B7, C7 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +#define BACKLIGHT_PIN B6 +#define BACKLIGHT_BREATHING +#define BACKLIGHT_LEVELS 3 + +#define RGB_DI_PIN E2 +#ifdef RGB_DI_PIN +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 16 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 +#endif + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* 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 userful 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 + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * 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 + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +//#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ diff --git a/keyboards/kbd4x/info.json b/keyboards/kbd4x/info.json new file mode 100644 index 000000000..78d011e2c --- /dev/null +++ b/keyboards/kbd4x/info.json @@ -0,0 +1,112 @@ +{ + "keyboard_name": "kbd4x", + "url": "", + "maintainer": "qmk", + "width": 14, + "height": 4, + "layouts": { + "LAYOUT_planck_mit": { + "layout": [ + {"label":"ESC", "x":0, "y":0}, + {"label":"Q", "x":1, "y":0}, + {"label":"W", "x":2, "y":0}, + {"label":"E", "x":3, "y":0}, + {"label":"R", "x":4, "y":0}, + {"label":"T", "x":5, "y":0}, + {"label":"Y", "x":6, "y":0}, + {"label":"U", "x":7, "y":0}, + {"label":"I", "x":8, "y":0}, + {"label":"O", "x":9, "y":0}, + {"label":"P", "x":10, "y":0}, + {"label":"BKSP", "x":11, "y":0}, + {"label":"TAB", "x":0, "y":1}, + {"label":"A", "x":1, "y":1}, + {"label":"S", "x":2, "y":1}, + {"label":"D", "x":3, "y":1}, + {"label":"F", "x":4, "y":1}, + {"label":"G", "x":5, "y":1}, + {"label":"H", "x":6, "y":1}, + {"label":"J", "x":7, "y":1}, + {"label":"K", "x":8, "y":1}, + {"label":"L", "x":9, "y":1}, + {"label":";", "x":10, "y":1}, + {"label":"'", "x":11, "y":1}, + {"label":"SHIFT", "x":0, "y":2}, + {"label":"Z", "x":1, "y":2}, + {"label":"X", "x":2, "y":2}, + {"label":"C", "x":3, "y":2}, + {"label":"V", "x":4, "y":2}, + {"label":"B", "x":5, "y":2}, + {"label":"N", "x":6, "y":2}, + {"label":"M", "x":7, "y":2}, + {"label":",", "x":8, "y":2}, + {"label":".", "x":9, "y":2}, + {"label":"UP", "x":10, "y":2}, + {"label":"ENTER", "x":11, "y":2}, + {"label":"LCTRL", "x":0, "y":3}, + {"label":"LGUI", "x":1, "y":3}, + {"label":"1", "x":2, "y":3}, + {"label":"2", "x":3, "y":3}, + {"label":"3", "x":4, "y":3}, + {"label":"SPACE", "x":5, "y":3, "w":2}, + {"label":"MO(1)", "x":7, "y":3}, + {"label":"/", "x":8, "y":3}, + {"label":"LEFT", "x":9, "y":3}, + {"label":"DOWN", "x":10, "y":3}, + {"label":"RIGHT", "x":11, "y":3}, + ] + }, + "LAYOUT_ortho_4x12": { + "layout": [ + {"label":"ESC", "x":0, "y":0}, + {"label":"Q", "x":1, "y":0}, + {"label":"W", "x":2, "y":0}, + {"label":"E", "x":3, "y":0}, + {"label":"R", "x":4, "y":0}, + {"label":"T", "x":5, "y":0}, + {"label":"Y", "x":6, "y":0}, + {"label":"U", "x":7, "y":0}, + {"label":"I", "x":8, "y":0}, + {"label":"O", "x":9, "y":0}, + {"label":"P", "x":10, "y":0}, + {"label":"BKSP", "x":11, "y":0}, + {"label":"TAB", "x":0, "y":1}, + {"label":"A", "x":1, "y":1}, + {"label":"S", "x":2, "y":1}, + {"label":"D", "x":3, "y":1}, + {"label":"F", "x":4, "y":1}, + {"label":"G", "x":5, "y":1}, + {"label":"H", "x":6, "y":1}, + {"label":"J", "x":7, "y":1}, + {"label":"K", "x":8, "y":1}, + {"label":"L", "x":9, "y":1}, + {"label":";", "x":10, "y":1}, + {"label":"'", "x":11, "y":1}, + {"label":"SHIFT", "x":0, "y":2}, + {"label":"Z", "x":1, "y":2}, + {"label":"X", "x":2, "y":2}, + {"label":"C", "x":3, "y":2}, + {"label":"V", "x":4, "y":2}, + {"label":"B", "x":5, "y":2}, + {"label":"N", "x":6, "y":2}, + {"label":"M", "x":7, "y":2}, + {"label":",", "x":8, "y":2}, + {"label":".", "x":9, "y":2}, + {"label":"UP", "x":10, "y":2}, + {"label":"ENTER", "x":11, "y":2}, + {"label":"LCTRL", "x":0, "y":3}, + {"label":"LGUI", "x":1, "y":3}, + {"label":"1", "x":2, "y":3}, + {"label":"2", "x":3, "y":3}, + {"label":"3", "x":4, "y":3}, + {"label":"SPACE", "x":5, "y":3}, + {"label":"MO(2)", "x":6, "y":3}, + {"label":"MO(1)", "x":7, "y":3}, + {"label":"/", "x":8, "y":3}, + {"label":"LEFT", "x":9, "y":3}, + {"label":"DOWN", "x":10, "y":3}, + {"label":"RIGHT", "x":11, "y":3}, + ] + } + } +} diff --git a/keyboards/kbd4x/kbd4x.c b/keyboards/kbd4x/kbd4x.c new file mode 100644 index 000000000..84ada250d --- /dev/null +++ b/keyboards/kbd4x/kbd4x.c @@ -0,0 +1,43 @@ +/* Copyright 2018 sevenseacat + * + * 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 . + */ +#include "kbd4x.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + + led_set_user(usb_led); +} diff --git a/keyboards/kbd4x/kbd4x.h b/keyboards/kbd4x/kbd4x.h new file mode 100644 index 000000000..d7a851e3e --- /dev/null +++ b/keyboards/kbd4x/kbd4x.h @@ -0,0 +1,48 @@ +/* Copyright 2018 sevenseacat + * + * 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 . + */ +#ifndef KBD4X_H +#define KBD4X_H + +#include "quantum.h" + +#define LAYOUT_planck_mit( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ + k30, k31, k32, k33, k34, k35, k37, k38, k39, k3a, k3b \ +) \ +{ \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b }, \ + { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b }, \ + { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b }, \ + { k30, k31, k32, k33, k34, k35, KC_NO, k37, k38, k39, k3a, k3b } \ +} + +// The PCB does support a grid layout, but the case does not. +#define LAYOUT_ortho_4x12( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ + k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b \ +) \ +{ \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b }, \ + { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b }, \ + { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b }, \ + { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b } \ +} + +#endif diff --git a/keyboards/kbd4x/keymaps/default/config.h b/keyboards/kbd4x/keymaps/default/config.h new file mode 100644 index 000000000..7f3bd7dd5 --- /dev/null +++ b/keyboards/kbd4x/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 sevenseacat + * + * 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 . + */ + +#pragma once + +// place overrides here diff --git a/keyboards/kbd4x/keymaps/default/keymap.c b/keyboards/kbd4x/keymaps/default/keymap.c new file mode 100644 index 000000000..ad49b3799 --- /dev/null +++ b/keyboards/kbd4x/keymaps/default/keymap.c @@ -0,0 +1,52 @@ +/* Copyright 2018 sevenseacat + * + * 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 . + */ +#include QMK_KEYBOARD_H + +#define ___ KC_TRNS + +// Defines the keycodes used by our macros in process_record_user +enum custom_keycodes { + KBD4X = SAFE_RANGE, +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_planck_mit( + KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_UP, KC_ENTER, + KC_LCTL, KC_LGUI, KC_1, KC_2, KC_3, KC_SPACE, MO(1), KC_SLSH, KC_LEFT, KC_DOWN, KC_RIGHT + ), + + [1] = LAYOUT_planck_mit( + KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, ___, + ___, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, ___, ___, ___, ___, ___, ___, RESET, + ___, BL_TOGG, BL_STEP, ___, ___, ___, ___, ___, ___, ___, ___, ___, + ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___ + ), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void matrix_init_user(void) { +} + +void matrix_scan_user(void) { +} + +void led_set_user(uint8_t usb_led) { +} diff --git a/keyboards/kbd4x/keymaps/default/readme.md b/keyboards/kbd4x/keymaps/default/readme.md new file mode 100644 index 000000000..a950a25ac --- /dev/null +++ b/keyboards/kbd4x/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for kbd4x diff --git a/keyboards/kbd4x/readme.md b/keyboards/kbd4x/readme.md new file mode 100644 index 000000000..42dc45024 --- /dev/null +++ b/keyboards/kbd4x/readme.md @@ -0,0 +1,15 @@ +# KBD4x + +![KBD4x](https://cdn.shopify.com/s/files/1/1473/3902/products/1_ef8d3ad0-fc70-4d4f-9e36-8438c781a581_1800x1800.jpg) + +A compact 40% (12x4) ortholinear keyboard kit sold by KBDFans. + +Keyboard Maintainer: ![sevenseacat](https://github.com/sevenseacat) +Hardware Supported: KBD4x PCB +Hardware Availability: https://kbdfans.cn/collections/diy-kit/products/kbd4x-custom-mechanical-keyboard-hot-swap-diy-kit + +Make example for this keyboard (after setting up your build environment): + + make kbd4x:default + +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). diff --git a/keyboards/kbd4x/rules.mk b/keyboards/kbd4x/rules.mk new file mode 100644 index 000000000..6cfd92bc6 --- /dev/null +++ b/keyboards/kbd4x/rules.mk @@ -0,0 +1,81 @@ +# MCU name +#MCU = at90usb1286 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = no # USB Nkey Rollover +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) From 1a33054a3586fa69812a249762e24ecc08a40423 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Tue, 2 Oct 2018 07:54:18 -0700 Subject: [PATCH 208/788] Reduce firmware size of KBD8x to fix Travis Compile issues --- keyboards/kbd8x/config.h | 5 ++--- keyboards/kbd8x/kbd8x.h | 8 +++----- keyboards/kbd8x/keymaps/default/config.h | 9 +-------- keyboards/kbd8x/keymaps/default_backlighting/config.h | 9 +-------- keyboards/kbd8x/keymaps/default_backlighting/rules.mk | 2 +- keyboards/kbd8x/rules.mk | 3 +-- 6 files changed, 9 insertions(+), 27 deletions(-) diff --git a/keyboards/kbd8x/config.h b/keyboards/kbd8x/config.h index c021fb40b..7749e0472 100644 --- a/keyboards/kbd8x/config.h +++ b/keyboards/kbd8x/config.h @@ -15,8 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef CONFIG_H -#define CONFIG_H +#pragma once #include "config_common.h" @@ -196,4 +195,4 @@ along with this program. If not, see . /* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ //#define MIDI_TONE_KEYCODE_OCTAVES 1 -#endif + diff --git a/keyboards/kbd8x/kbd8x.h b/keyboards/kbd8x/kbd8x.h index 02a743644..f28b8ca7a 100644 --- a/keyboards/kbd8x/kbd8x.h +++ b/keyboards/kbd8x/kbd8x.h @@ -13,8 +13,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#ifndef KBD8X_H -#define KBD8X_H +#pragma once #include "quantum.h" #include "led.h" @@ -31,7 +30,7 @@ inline void scroll_led_off(void) { DDRB &= ~(1<<2); PORTB &= ~(1<<2); } // LAYOUT depicting all possible switch positions. -// LAYOUT_all supports ISO, split backspace and split left/right shift. +// LAYOUT_all supports ISO, split backspace and split left/right shift. #define LAYOUT_all( \ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K3D, \ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K5B, K5C, K3E, \ @@ -49,7 +48,7 @@ inline void scroll_led_off(void) { DDRB &= ~(1<<2); PORTB &= ~(1<<2); } { K50, K51, K52, K53, K54, K55, K56, K57, K58, K59, K5A, K5B, K5C, K5D, K5E } \ } -// LAYOUT depicting only switch positions for a standard TKL ANSI keyboard. +// LAYOUT depicting only switch positions for a standard TKL ANSI keyboard. // TODO: Double check location of backspace key for 2u layout (It's either K1D or K1C). #define LAYOUT_tkl_ansi( \ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K3D, \ @@ -68,4 +67,3 @@ inline void scroll_led_off(void) { DDRB &= ~(1<<2); PORTB &= ~(1<<2); } { K50, K51, K52, K53, K54, K55, K56, K57, K58, K59, K5A, K5B, K5C, K5D, K5E } \ } -#endif diff --git a/keyboards/kbd8x/keymaps/default/config.h b/keyboards/kbd8x/keymaps/default/config.h index 63bef2a73..fa7db0bc1 100644 --- a/keyboards/kbd8x/keymaps/default/config.h +++ b/keyboards/kbd8x/keymaps/default/config.h @@ -14,11 +14,4 @@ * along with this program. If not, see . */ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "config_common.h" - -// place overrides here - -#endif +#pragma once diff --git a/keyboards/kbd8x/keymaps/default_backlighting/config.h b/keyboards/kbd8x/keymaps/default_backlighting/config.h index 63bef2a73..fa7db0bc1 100644 --- a/keyboards/kbd8x/keymaps/default_backlighting/config.h +++ b/keyboards/kbd8x/keymaps/default_backlighting/config.h @@ -14,11 +14,4 @@ * along with this program. If not, see . */ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "config_common.h" - -// place overrides here - -#endif +#pragma once diff --git a/keyboards/kbd8x/keymaps/default_backlighting/rules.mk b/keyboards/kbd8x/keymaps/default_backlighting/rules.mk index e806a1ca5..07b9f81fd 100644 --- a/keyboards/kbd8x/keymaps/default_backlighting/rules.mk +++ b/keyboards/kbd8x/keymaps/default_backlighting/rules.mk @@ -1,7 +1,7 @@ #Build Options BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) CONSOLE_ENABLE = yes # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration diff --git a/keyboards/kbd8x/rules.mk b/keyboards/kbd8x/rules.mk index 46e9732ea..e5925463e 100644 --- a/keyboards/kbd8x/rules.mk +++ b/keyboards/kbd8x/rules.mk @@ -45,7 +45,6 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT # Atmel DFU loader 4096 # LUFA bootloader 4096 # USBaspLoader 2048 -OPT_DEFS += -DBOOTLOADER_SIZE=4096 BOOTLOADER = atmel-dfu @@ -53,7 +52,7 @@ BOOTLOADER = atmel-dfu # change yes to no to disable # BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) CONSOLE_ENABLE = yes # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration From 5c2ac733afe9f6d68d2ad42c9d58fbff466a7874 Mon Sep 17 00:00:00 2001 From: Jarred Steenvoorden Date: Wed, 3 Oct 2018 01:14:37 +1000 Subject: [PATCH 209/788] Keymap: Adding my DZ60, Satan, XD75 kemaps and updates to userspace (#4039) * Update userspace with common config.h * Add my dz60, satan and xd75 keyboard keymaps * Fixing executable bits changed during last upstream merge * Cleanup unnecessary files and defines * Remove unnecessary defines from userspace config --- keyboards/dz60/keymaps/jarred/keymap.c | 21 +++++++++ keyboards/planck/keymaps/jarred/rules.mk | 4 -- keyboards/satan/keymaps/jarred/keymap.c | 22 ++++++++++ keyboards/satan/keymaps/jarred/readme.md | 1 + keyboards/xd75/keymaps/daniel/keymap.c | 29 +++++++++++++ keyboards/xd75/keymaps/daniel/readme.md | 1 + keyboards/xd75/keymaps/jarred/keymap.c | 37 ++++++++++++++++ keyboards/xd75/keymaps/jarred/readme.md | 1 + .../planck/keymaps => users}/jarred/config.h | 43 ++++++++++++------- users/jarred/jarred.c | 15 +++++++ users/jarred/jarred.h | 8 ++-- users/jarred/rules.mk | 15 +++++++ 12 files changed, 174 insertions(+), 23 deletions(-) create mode 100644 keyboards/dz60/keymaps/jarred/keymap.c delete mode 100644 keyboards/planck/keymaps/jarred/rules.mk create mode 100644 keyboards/satan/keymaps/jarred/keymap.c create mode 100644 keyboards/satan/keymaps/jarred/readme.md create mode 100644 keyboards/xd75/keymaps/daniel/keymap.c create mode 100644 keyboards/xd75/keymaps/daniel/readme.md create mode 100644 keyboards/xd75/keymaps/jarred/keymap.c create mode 100644 keyboards/xd75/keymaps/jarred/readme.md rename {keyboards/planck/keymaps => users}/jarred/config.h (54%) diff --git a/keyboards/dz60/keymaps/jarred/keymap.c b/keyboards/dz60/keymaps/jarred/keymap.c new file mode 100644 index 000000000..9e6850683 --- /dev/null +++ b/keyboards/dz60/keymaps/jarred/keymap.c @@ -0,0 +1,21 @@ +#include QMK_KEYBOARD_H + +#define _QW 0 +#define _NV 1 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_QW] = LAYOUT( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, XXXXXXX, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,KC_BSLS, + MO(_NV), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_ENT, + KC_LSFT, XXXXXXX,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT,XXXXXXX, + KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT,KC_RGUI, XXXXXXX,KC_APP, KC_RCTL), + + [_NV] = LAYOUT( + KC_GRV ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 ,KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,KC_F11 ,KC_F12 ,_______,_______, + _______,_______,_______,_______,KC_DEL ,KC_BSPC,_______,KC_HOME,KC_UP ,KC_END ,KC_INS ,_______,_______,_______, + _______,_______,_______,KC_LSFT,KC_LCTL,KC_ENT ,_______,KC_LEFT,KC_DOWN,KC_RGHT,KC_DEL ,KC_DEL , _______, + _______,_______,_______,_______,_______,_______,_______,_______,KC_PGUP,KC_PGDN,_______,_______,_______,_______, + _______,_______,_______, _______,_______,_______, _______,_______,_______, RESET, _______) +}; diff --git a/keyboards/planck/keymaps/jarred/rules.mk b/keyboards/planck/keymaps/jarred/rules.mk deleted file mode 100644 index cd14c41e1..000000000 --- a/keyboards/planck/keymaps/jarred/rules.mk +++ /dev/null @@ -1,4 +0,0 @@ -# Build options - -BACKLIGHT_ENABLE = no # Switch LEDs -MOUSEKEY_ENABLE = no # Emulates mouse key using keypresses diff --git a/keyboards/satan/keymaps/jarred/keymap.c b/keyboards/satan/keymaps/jarred/keymap.c new file mode 100644 index 000000000..c6852e4eb --- /dev/null +++ b/keyboards/satan/keymaps/jarred/keymap.c @@ -0,0 +1,22 @@ +#include QMK_KEYBOARD_H + +#define _QW 0 +#define _NV 1 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +[_QW] = LAYOUT_60_ansi( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,KC_BSLS, \ + MO(_NV), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT, \ + KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI, KC_APP, KC_RCTL), + +[_NV] = LAYOUT_60_ansi( + KC_GRV ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 ,KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,KC_F11 ,KC_F12 ,_______, \ + _______,_______,_______,_______,KC_DEL ,KC_BSPC,_______,KC_HOME,KC_UP ,KC_END ,KC_INS ,_______,_______,_______, \ + _______,_______,_______,KC_LSFT,KC_LCTL,KC_ENT ,_______,KC_LEFT,KC_DOWN,KC_RGHT,KC_DEL ,KC_DEL , _______, \ + _______,_______,_______,_______,_______,_______,_______,KC_PGUP,KC_PGDN,_______,_______,_______, \ + _______,_______,_______, _______, _______,_______, RESET, _______), + +}; diff --git a/keyboards/satan/keymaps/jarred/readme.md b/keyboards/satan/keymaps/jarred/readme.md new file mode 100644 index 000000000..522cb19b6 --- /dev/null +++ b/keyboards/satan/keymaps/jarred/readme.md @@ -0,0 +1 @@ +# Jarred's Satan GH60 layout diff --git a/keyboards/xd75/keymaps/daniel/keymap.c b/keyboards/xd75/keymaps/daniel/keymap.c new file mode 100644 index 000000000..2804a6cd0 --- /dev/null +++ b/keyboards/xd75/keymaps/daniel/keymap.c @@ -0,0 +1,29 @@ +#include QMK_KEYBOARD_H + +#define _QW 0 +#define _NV 1 +#define _NM 2 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_QW] = { + { KC_ESC , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_MINS, KC_EQL , KC_GRV , KC_BSPC }, + { KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL }, + { MO(_NV), KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_SCLN, KC_QUOT, KC_ENT , MO(_NM), KC_PGUP }, + { KC_LSFT, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, _______, KC_RSFT, KC_UP , KC_PGDN }, + { KC_LCTL, KC_LGUI, KC_LALT, KC_SPC , KC_SPC , KC_SPC , KC_SPC , KC_SPC , KC_SPC , KC_RALT, KC_RGUI, KC_APP , KC_LEFT, KC_DOWN, KC_RGHT }, + }, + [_NV] = { + { KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , KC_F12 , _______, _______, _______ }, + { _______, _______, _______, _______, KC_DEL , KC_BSPC, _______, KC_HOME, KC_UP , KC_END , KC_INS , _______, _______, _______, _______ }, + { _______, _______, _______, KC_LSFT, KC_LCTL, KC_ENT , _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_DEL , _______, _______, _______, _______ }, + { _______, _______, _______, _______, _______, _______, _______, KC_PGUP, KC_PGDN, _______, _______, _______, _______, _______, _______ }, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, + }, + [_NM] = { + { _______, RGB_TOG, RGB_MOD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, + { _______, RGB_HUD, RGB_HUI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, + { _______, RGB_SAD, RGB_SAI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, + { _______, RGB_VAD, RGB_VAI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, + { RESET , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, + } +}; diff --git a/keyboards/xd75/keymaps/daniel/readme.md b/keyboards/xd75/keymaps/daniel/readme.md new file mode 100644 index 000000000..3305d0f30 --- /dev/null +++ b/keyboards/xd75/keymaps/daniel/readme.md @@ -0,0 +1 @@ +# Daniels xd75 keymap diff --git a/keyboards/xd75/keymaps/jarred/keymap.c b/keyboards/xd75/keymaps/jarred/keymap.c new file mode 100644 index 000000000..f85178711 --- /dev/null +++ b/keyboards/xd75/keymaps/jarred/keymap.c @@ -0,0 +1,37 @@ +#include QMK_KEYBOARD_H + +#define _QW 0 +#define _LW 1 +#define _NV 2 +#define _NM 3 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_QW] = { + { KC_ESC , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_MUTE, KC_VOLD, KC_VOLU, KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_BSPC }, + { KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_INS , KC_HOME, KC_PGUP, KC_Y , KC_U , KC_I , KC_O , KC_P , KC_BSPC }, + { MO(_NV), KC_A , KC_S , KC_D , KC_F , KC_G , KC_DEL , KC_END , KC_PGDN, KC_H , KC_J , KC_K , KC_L , KC_SCLN, KC_QUOT }, + { KC_LSFT, KC_Z , KC_X , KC_C , KC_V , KC_B , _______, KC_UP , _______, KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, KC_RSFT }, + { KC_LCTL, KC_LGUI, MO(_NM), KC_LALT, MO(_LW), KC_SPC , KC_LEFT, KC_DOWN, KC_RGHT, KC_ENT , MO(_LW), KC_RALT, KC_RGUI, KC_APP , KC_RCTL }, + }, + [_LW] = { + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, + { KC_ESC , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , _______, _______, _______, KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , _______ }, + { _______, KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , _______, _______, _______, KC_F11 , KC_MINS, KC_EQL , KC_LBRC, KC_RBRC, KC_BSLS }, + { _______, KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , _______, _______, _______, KC_F12 , KC_GRV , _______, _______, _______, _______ }, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, + }, + [_NV] = { + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, + { _______, _______, _______, _______, KC_DEL , KC_BSPC, _______, _______, _______, _______, KC_HOME, KC_UP , KC_END , KC_INS , _______ }, + { _______, _______, _______, KC_LSFT, KC_LCTL, KC_ENT , _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_DEL , _______ }, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, KC_PGDN, _______, _______, _______ }, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, + }, + [_NM] = { + { _______, _______, _______, _______, _______, _______, RGB_TOG, RGB_MOD, _______, _______, _______, _______, _______, _______, _______ }, + { _______, _______, _______, _______, _______, _______, RGB_HUD, RGB_HUI, _______, _______, _______, _______, _______, _______, _______ }, + { _______, _______, _______, _______, _______, _______, RGB_SAD, RGB_SAI, _______, _______, _______, _______, _______, _______, _______ }, + { _______, _______, _______, _______, _______, _______, RGB_VAD, RGB_VAI, _______, _______, _______, _______, _______, _______, _______ }, + { RESET , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, + } +}; diff --git a/keyboards/xd75/keymaps/jarred/readme.md b/keyboards/xd75/keymaps/jarred/readme.md new file mode 100644 index 000000000..4070bb3ee --- /dev/null +++ b/keyboards/xd75/keymaps/jarred/readme.md @@ -0,0 +1 @@ +# Jarreds xd75 keymap diff --git a/keyboards/planck/keymaps/jarred/config.h b/users/jarred/config.h similarity index 54% rename from keyboards/planck/keymaps/jarred/config.h rename to users/jarred/config.h index 9e8f404c1..f28208814 100644 --- a/keyboards/planck/keymaps/jarred/config.h +++ b/users/jarred/config.h @@ -14,24 +14,37 @@ * along with this program. If not, see . */ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H +#pragma once -#include "config_common.h" +// Sets good default for the speed of the mouse. +#undef MOUSEKEY_INTERVAL +#undef MOUSEKEY_DELAY +#undef MOUSEKEY_TIME_TO_MAX +#undef MOUSEKEY_MAX_SPEED + +#define MOUSEKEY_INTERVAL 16 +#define MOUSEKEY_DELAY 0 +#define MOUSEKEY_TIME_TO_MAX 40 +#define MOUSEKEY_MAX_SPEED 5 + +#undef MOUSEKEY_WHEEL_MAX_SPEED +#undef MOUSEKEY_WHEEL_TIME_TO_MAX +#undef MOUSEKEY_WHEEL_DELAY + +#define MOUSEKEY_WHEEL_MAX_SPEED 4 +#define MOUSEKEY_WHEEL_TIME_TO_MAX 255 +#define MOUSEKEY_WHEEL_DELAY 0 + +#undef TAPPING_TOGGLE +#undef TAPPING_TERM +#undef IGNORE_MOD_TAP_INTERRUPT + +#define TAPPING_TOGGLE 1 +#define TAPPING_TERM 200 +#define IGNORE_MOD_TAP_INTERRUPT #ifdef AUDIO_ENABLE #define STARTUP_SONG SONG(PLANCK_SOUND) #endif -#define TAPPING_TERM 200 - -#define MOUSEKEY_DELAY 0 -#define MOUSEKEY_INTERVAL 16 -#define MOUSEKEY_TIME_TO_MAX 40 -#define MOUSEKEY_MAX_SPEED 5 - -#define MOUSEKEY_WHEEL_DELAY 0 -#define MOUSEKEY_WHEEL_MAX_SPEED 4 -#define MOUSEKEY_WHEEL_TIME_TO_MAX 255 - -#endif +#define MACRO_TIMER 5 diff --git a/users/jarred/jarred.c b/users/jarred/jarred.c index f8413ca3b..33162b689 100644 --- a/users/jarred/jarred.c +++ b/users/jarred/jarred.c @@ -15,3 +15,18 @@ */ #include "jarred.h" +#include "version.h" + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + + switch (keycode) { + case VRSN: // Prints firmware version + if (record->event.pressed) { + send_string_with_delay_P(PSTR(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION ", Built on: " QMK_BUILDDATE), MACRO_TIMER); + } + return false; + break; + } + + return true; +} diff --git a/users/jarred/jarred.h b/users/jarred/jarred.h index b1253f76a..a6774ce26 100644 --- a/users/jarred/jarred.h +++ b/users/jarred/jarred.h @@ -19,9 +19,9 @@ #include "quantum.h" -// Use 7 wide characters for keymaps -#define _______ KC_TRNS -#define XXXXXXX KC_NO +enum userspace_custom_keycodes { + VRSN = SAFE_RANGE // Prints QMK Firmware and board info +}; // Layers #define _QW 0 @@ -72,7 +72,7 @@ #define NUMPAD_L1 RGB_TOG, RGB_MOD, _______, _______, RGB_HUD, RGB_HUI #define NUMPAD_L2 BL_TOGG, BL_STEP, BL_BRTG, _______, RGB_SAD, RGB_SAI #define NUMPAD_L3 _______, _______, _______, _______, RGB_VAD, RGB_VAI -#define NUMPAD_L4 RESET, _______, _______, _______, RGB_SPD, RGB_SPI +#define NUMPAD_L4 RESET, VRSN, _______, _______, RGB_SPD, RGB_SPI #define NUMPAD_R1 _______, KC_P7, KC_P8, KC_P9, KC_PMNS, _______ #define NUMPAD_R2 _______, KC_P4, KC_P5, KC_P6, KC_PPLS, _______ diff --git a/users/jarred/rules.mk b/users/jarred/rules.mk index 3c15cd0f9..9a00cbf72 100644 --- a/users/jarred/rules.mk +++ b/users/jarred/rules.mk @@ -1 +1,16 @@ SRC += jarred.c + +ifneq (,$(findstring planck,$(KEYBOARD))) + # Enable backlight for rev4 planck only + ifneq (,$(findstring rev4,$(KEYBOARD))) + BACKLIGHT_ENABLE = yes + BACKLIGHT_BREATHING = yes + else + BACKLIGHT_ENABLE = no + BACKLIGHT_BREATHING = no + endif + + AUDIO_ENABLE = yes +endif + +MOUSEKEY_ENABLE = no From 66b793730ead28e409cbc152606a769e1c7b6a0b Mon Sep 17 00:00:00 2001 From: Bramver Date: Tue, 2 Oct 2018 22:06:31 +0200 Subject: [PATCH 210/788] Keymap: Personal XD75 keymap added. (#4045) * Personal XD75 keymap added. Nothing fancy, has emojisupport. * Converted to spaces to follow guidelines * Fixed requested changes. Replacing include guards with pragma once. Omitting unnecessary lines. PR #4045 --- keyboards/xd75/keymaps/bramver/README.md | 43 +++++++++ keyboards/xd75/keymaps/bramver/config.h | 25 +++++ keyboards/xd75/keymaps/bramver/keymap.c | 115 +++++++++++++++++++++++ keyboards/xd75/keymaps/bramver/rules.mk | 7 ++ 4 files changed, 190 insertions(+) create mode 100644 keyboards/xd75/keymaps/bramver/README.md create mode 100644 keyboards/xd75/keymaps/bramver/config.h create mode 100644 keyboards/xd75/keymaps/bramver/keymap.c create mode 100644 keyboards/xd75/keymaps/bramver/rules.mk diff --git a/keyboards/xd75/keymaps/bramver/README.md b/keyboards/xd75/keymaps/bramver/README.md new file mode 100644 index 000000000..2dcac5f0e --- /dev/null +++ b/keyboards/xd75/keymaps/bramver/README.md @@ -0,0 +1,43 @@ +# XD75 Layout + +Standard qwerty layout. +Limited emoji support and proper mouse settings. + +## Keymap + +``` +_BASE + | GESC | 1 | 2 | 3 | 4 | 5 | MPRV | MPLY | MNXT | 6 | 7 | 8 | 9 | 0 | BSPC | + | TAB | Q | W | E | R | T | MINS | EQL | BSLS | Y | U | I | O | P | ENT | + | MO(3) | A | S | D | F | G | LBRC | MUTE | RBRC | H | J | K | L | SCLN | QUOT | + | LSFT | Z | X | C | V | B | HOME | SLEP | END | N | M | COMM | DOT | SLSH | RSFT | + | LCTL | MO(4) | LALT | LGUI | SPC | SPC | MO(1) | DEL | MO(2) | SPC | LEFT | DOWN | UP | RGHT | RGUI | + +_LOWER + | _______ | _______ | _______ | _______ | _______ | _______ | BL_TOGG | BL_DEC | BL_INC | _______ | _______ | _______ | _______ | _______ | _______ | + | _______ | WH_L | BTN1 | MS_U | BTN2 | WH_U | BL_STEP | RGB_TOG | RGB_MOD | _______ | _______ | _______ | _______ | _______ | _______ | + | _______ | WH_R | MS_L | MS_D | MS_R | WH_D | RGB_HUI | RGB_HUD | RGB_SAI | _______ | LEFT | DOWN | UP | RGHT | _______ | + | _______ | _______ | _______ | _______ | _______ | _______ | RGB_SAD | RGB_VAI | RGB_VAD | _______ | _______ | _______ | _______ | _______ | _______ | + | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | + +_LINVERT + | _______ | _______ | _______ | _______ | _______ | _______ | BL_TOGG | BL_DEC | BL_INC | _______ | _______ | _______ | _______ | _______ | _______ | + | _______ | _______ | _______ | _______ | _______ | _______ | BL_STEP | RGB_TOG | RGB_MOD | WH_U | BTN1 | MS_U | BTN2 | WH_L | _______ | + | _______ | LEFT | DOWN | UP | RGHT | _______ | RGB_SAI | RGB_HUI | RGB_HUD | WH_D | MS_L | MS_D | MS_R | WH_R | _______ | + | _______ | _______ | _______ | _______ | _______ | _______ | RGB_SAD | RGB_VAI | RGB_VAD | _______ | _______ | _______ | _______ | _______ | _______ | + | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | + +_RAISE + | F1 | F2 | F3 | F4 | F5 | F6 | _______ | _______ | _______ | F7 | F8 | F9 | F10 | F11 | F12 | + | _______ | _______ | 7 | 8 | 9 | _______ | _______ | _______ | _______ | _______ | MUTE | VOLD | VOLU | _______ | _______ | + | _______ | _______ | 4 | 5 | 6 | _______ | _______ | _______ | _______ | _______ | MPRV | MPLY | MNXT | _______ | _______ | + | _______ | _______ | 1 | 2 | 3 | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | + | _______ | _______ | _______ | 0 | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | + +_EMOJIFY + | TO(0) | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | RESET | + | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | + | _______ | X(CELE) | X(PRAY) | X(NAIL) | X(OK) | X(THNK) | _______ | _______ | _______ | X(UNAM) | X(HEYE) | X(COOL) | X(EYES) | X(SMIR) | _______ | + | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | + | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | +``` \ No newline at end of file diff --git a/keyboards/xd75/keymaps/bramver/config.h b/keyboards/xd75/keymaps/bramver/config.h new file mode 100644 index 000000000..2264af74c --- /dev/null +++ b/keyboards/xd75/keymaps/bramver/config.h @@ -0,0 +1,25 @@ +/* Copyright 2018 darm + * + * 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 . + */ + +#pragma once + +#define MOUSEKEY_DELAY 0 +#define MOUSEKEY_INTERVAL 16 +#define MOUSEKEY_MAX_SPEED 7 +#define MOUSEKEY_TIME_TO_MAX 60 +#define MOUSEKEY_WHEEL_MAX_SPEED 8 +#define MOUSEKEY_WHEEL_TIME_TO_MAX 40 +#define MOUSEKEY_WHEEL_DELAY 0 diff --git a/keyboards/xd75/keymaps/bramver/keymap.c b/keyboards/xd75/keymaps/bramver/keymap.c new file mode 100644 index 000000000..831278d00 --- /dev/null +++ b/keyboards/xd75/keymaps/bramver/keymap.c @@ -0,0 +1,115 @@ +/* Copyright 2018 darm + * + * 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 . + */ +#include QMK_KEYBOARD_H + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +// Layer shorthand +#define _BASE 0 +#define _LOWER 1 +#define _LINVERT 2 +#define _RAISE 3 +#define _EMOJIFY 4 + +enum emoji_map { + UNAM, // unamused 😒 + HEYE, // smiling face with heart shaped eyes 😍 + OK, // ok hand sign 👌 + SMIR, // smirk 😏 + PRAY, // pray 🙏 + CELE, // celebration 🙌 + COOL, // smile with sunglasses 😎 + EYES, // eyes + THNK, // BIG THONK + NAIL, // Nailcare 💅 +}; + +const uint32_t PROGMEM unicode_map[] = { + [UNAM] = 0x1F612, + [HEYE] = 0x1f60d, + [OK] = 0x1F44C, + [SMIR] = 0x1F60F, + [PRAY] = 0x1F64F, + [CELE] = 0x1F64C, + [COOL] = 0x1F60E, + [EYES] = 0x1F440, + [THNK] = 0x1F914, + [NAIL] = 0x1F485, +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_BASE] = { + { KC_GESC , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_MPRV , KC_MPLY , KC_MNXT , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_BSPC }, + { KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_MINS , KC_EQL , KC_BSLS , KC_Y , KC_U , KC_I , KC_O , KC_P , KC_ENT }, + { MO(3) , KC_A , KC_S , KC_D , KC_F , KC_G , KC_LBRC , KC_MUTE , KC_RBRC , KC_H , KC_J , KC_K , KC_L , KC_SCLN , KC_QUOT }, + { KC_LSFT , KC_Z , KC_X , KC_C , KC_V , KC_B , KC_HOME , KC_SLEP , KC_END , KC_N , KC_M , KC_COMM , KC_DOT , KC_SLSH , KC_RSFT }, + { KC_LCTL , MO(4) , KC_LALT , KC_LGUI , KC_SPC , KC_SPC , MO(1) , KC_DEL , MO(2) , KC_SPC , KC_LEFT , KC_DOWN , KC_UP , KC_RGHT , KC_RGUI }, + }, + + [_LOWER] = { + { _______ , _______ , _______ , _______ , _______ , _______ , BL_TOGG , BL_DEC , BL_INC , _______ , _______ , _______ , _______ , _______ , _______ }, + { _______ , KC_WH_L , KC_BTN1 , KC_MS_U , KC_BTN2 , KC_WH_U , BL_STEP , RGB_TOG , RGB_MOD , _______ , _______ , _______ , _______ , _______ , _______ }, + { _______ , KC_WH_R , KC_MS_L , KC_MS_D , KC_MS_R , KC_WH_D , RGB_HUI , RGB_HUD , RGB_SAI , _______ , KC_LEFT , KC_DOWN , KC_UP , KC_RGHT , _______ }, + { _______ , _______ , _______ , _______ , _______ , _______ , RGB_SAD , RGB_VAI , RGB_VAD , _______ , _______ , _______ , _______ , _______ , _______ }, + { _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ }, + }, + + [_LINVERT] = { + { _______ , _______ , _______ , _______ , _______ , _______ , BL_TOGG , BL_DEC , BL_INC , _______ , _______ , _______ , _______ , _______ , _______ }, + { _______ , _______ , _______ , _______ , _______ , _______ , BL_STEP , RGB_TOG , RGB_MOD , KC_WH_U , KC_BTN1 , KC_MS_U , KC_BTN2 , KC_WH_L , _______ }, + { _______ , KC_LEFT , KC_DOWN , KC_UP , KC_RGHT , _______ , RGB_SAI , RGB_HUI , RGB_HUD , KC_WH_D , KC_MS_L , KC_MS_D , KC_MS_R , KC_WH_R , _______ }, + { _______ , _______ , _______ , _______ , _______ , _______ , RGB_SAD , RGB_VAI , RGB_VAD , _______ , _______ , _______ , _______ , _______ , _______ }, + { _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ }, + }, + + [_RAISE] = { + { KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , _______ , _______ , _______ , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , KC_F12 }, + { _______ , _______ , KC_7 , KC_8 , KC_9 , _______ , _______ , _______ , _______ , _______ , KC_MUTE , KC_VOLD , KC_VOLU , _______ , _______ }, + { _______ , _______ , KC_4 , KC_5 , KC_6 , _______ , _______ , _______ , _______ , _______ , KC_MPRV , KC_MPLY , KC_MNXT , _______ , _______ }, + { _______ , _______ , KC_1 , KC_2 , KC_3 , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ }, + { _______ , _______ , _______ , KC_0 , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ }, + }, + + [_EMOJIFY] = { + { TO(0) , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , RESET }, + { _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ }, + { _______ , X(CELE) , X(PRAY) , X(NAIL) , X(OK) , X(THNK) , _______ , _______ , _______ , X(UNAM) , X(HEYE) , X(COOL) , X(EYES) , X(SMIR) , _______ }, + { _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ }, + { _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ }, + }, + +}; + +const uint16_t PROGMEM fn_actions[] = {}; + +void matrix_init_user(void) { + _delay_ms(20); // Gets rid of tick + set_unicode_input_mode(UC_LNX); +} + +/* Template for future layers + [_LAYER_NAME] = { + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, + } +}; +*/ diff --git a/keyboards/xd75/keymaps/bramver/rules.mk b/keyboards/xd75/keymaps/bramver/rules.mk new file mode 100644 index 000000000..1c3d4d8cd --- /dev/null +++ b/keyboards/xd75/keymaps/bramver/rules.mk @@ -0,0 +1,7 @@ +# Build options +BACKLIGHT_ENABLE = yes # Switch LEDs +MOUSEKEY_ENABLE = yes # Emulates mouse key using keypresses +RGBLIGHT_ENABLE = yes # LED strips +EXTRAKEY_ENABLE = yes # Use system and audio control key codes +TAP_DANCE_ENABLE = no # Use multi-tap features +UNICODEMAP_ENABLE = yes # Emojify me pls From 9aecf4ccfdbef6123bbf0a1e6670f85f4763ee89 Mon Sep 17 00:00:00 2001 From: Florian Didron Date: Tue, 2 Oct 2018 08:41:19 +0900 Subject: [PATCH 211/788] Adds a method allowing to set custom colors to the rgb matrix --- quantum/rgb_matrix.c | 7 +++++++ quantum/rgb_matrix.h | 1 + 2 files changed, 8 insertions(+) diff --git a/quantum/rgb_matrix.c b/quantum/rgb_matrix.c index f0c2ddfdf..1f00e9d99 100644 --- a/quantum/rgb_matrix.c +++ b/quantum/rgb_matrix.c @@ -903,3 +903,10 @@ void rgblight_mode(uint8_t mode) { uint32_t rgblight_get_mode(void) { return rgb_matrix_config.mode; } + +void rgblight_sethsv(uint16_t hue, uint8_t sat, uint8_t val) { + rgb_matrix_config.hue = hue; + rgb_matrix_config.sat = sat; + rgb_matrix_config.val = val; + eeconfig_update_rgb_matrix(rgb_matrix_config.raw); +} diff --git a/quantum/rgb_matrix.h b/quantum/rgb_matrix.h index 45caaac42..d2450a7d9 100644 --- a/quantum/rgb_matrix.h +++ b/quantum/rgb_matrix.h @@ -128,6 +128,7 @@ uint32_t rgb_matrix_get_tick(void); void rgblight_toggle(void); void rgblight_step(void); +void rgblight_sethsv(uint16_t hue, uint8_t sat, uint8_t val); void rgblight_step_reverse(void); void rgblight_increase_hue(void); void rgblight_decrease_hue(void); From 1741e39e3463ac3cc6164656b0cc7afa8c33cc00 Mon Sep 17 00:00:00 2001 From: yiancar Date: Wed, 3 Oct 2018 00:03:50 +0100 Subject: [PATCH 212/788] New keyboard: Baguette (#4047) * Bagette Addition of Baguette a close group buy custom * Add json --- keyboards/baguette/baguette.c | 71 ++++++ keyboards/baguette/baguette.h | 59 +++++ keyboards/baguette/config.h | 224 +++++++++++++++++++ keyboards/baguette/info.json | 16 ++ keyboards/baguette/keymaps/default/keymap.c | 50 +++++ keyboards/baguette/keymaps/default/readme.md | 9 + keyboards/baguette/keymaps/iso/keymap.c | 50 +++++ keyboards/baguette/keymaps/iso/readme.md | 10 + keyboards/baguette/readme.md | 16 ++ keyboards/baguette/rules.mk | 81 +++++++ 10 files changed, 586 insertions(+) create mode 100644 keyboards/baguette/baguette.c create mode 100644 keyboards/baguette/baguette.h create mode 100644 keyboards/baguette/config.h create mode 100644 keyboards/baguette/info.json create mode 100644 keyboards/baguette/keymaps/default/keymap.c create mode 100644 keyboards/baguette/keymaps/default/readme.md create mode 100644 keyboards/baguette/keymaps/iso/keymap.c create mode 100644 keyboards/baguette/keymaps/iso/readme.md create mode 100644 keyboards/baguette/readme.md create mode 100644 keyboards/baguette/rules.mk diff --git a/keyboards/baguette/baguette.c b/keyboards/baguette/baguette.c new file mode 100644 index 000000000..6a8df873a --- /dev/null +++ b/keyboards/baguette/baguette.c @@ -0,0 +1,71 @@ +/* Copyright 2018 Yiancar + * + * 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 . + */ +#include "baguette.h" + +void bootmagic_lite(void) +{ + // The lite version of TMK's bootmagic made by Wilba. + // 100% less potential for accidentally making the + // keyboard do stupid things. + + // We need multiple scans because debouncing can't be turned off. + matrix_scan(); + wait_ms(DEBOUNCING_DELAY); + matrix_scan(); + + // If the Esc and space bar are held down on power up, + // reset the EEPROM valid state and jump to bootloader. + // Assumes Esc is at [0,0] and spacebar is at [4,7]. + // This isn't very generalized, but we need something that doesn't + // rely on user's keymaps in firmware or EEPROM. + if ( ( matrix_get_row(0) & (1<<0) ) && + ( matrix_get_row(4) & (1<<7) ) ) + { + // Set the TMK/QMK EEPROM state as invalid. + eeconfig_disable(); + //eeprom_set_valid(false); + // Jump to bootloader. + bootloader_jump(); + } +} + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + bootmagic_lite(); + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + + led_set_user(usb_led); +} diff --git a/keyboards/baguette/baguette.h b/keyboards/baguette/baguette.h new file mode 100644 index 000000000..e3945bea7 --- /dev/null +++ b/keyboards/baguette/baguette.h @@ -0,0 +1,59 @@ +/* Copyright 2018 Yiancar + * + * 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 . + */ +#ifndef BAGUETTE_H +#define BAGUETTE_H + +#include "quantum.h" + +/* This a shortcut to help you visually see your layout. + * + * The first section contains all of the arguments representing the physical + * layout of the board and position of the keys. + * + * The second converts the arguments into a two-dimensional array which + * represents the switch matrix. + */ +#define LAYOUT_ansi( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1F, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, \ + K42, K43, K47, K4B, K4C, K4D, K4E, K4F \ +) \ +{ \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, KC_NO, K1F }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, KC_NO, K2D, KC_NO, KC_NO }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, KC_NO }, \ + { KC_NO, KC_NO, K42, K43, KC_NO, KC_NO, KC_NO, K47, KC_NO, KC_NO, KC_NO, K4B, K4C, K4D, K4E, K4F } \ +} + +#define LAYOUT_iso( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1F, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K1D, K2D, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, \ + K42, K43, K47, K4B, K4C, K4D, K4E, K4F \ +) \ +{ \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, KC_NO, KC_NO, K1F }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K1D, K2D, KC_NO, KC_NO }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, KC_NO }, \ + { KC_NO, KC_NO, K42, K43, KC_NO, KC_NO, KC_NO, K47, KC_NO, KC_NO, KC_NO, K4B, K4C, K4D, K4E, K4F } \ +} + +#endif diff --git a/keyboards/baguette/config.h b/keyboards/baguette/config.h new file mode 100644 index 000000000..806f9fb4f --- /dev/null +++ b/keyboards/baguette/config.h @@ -0,0 +1,224 @@ +/* +Copyright 2018 Yiancar + +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 . +*/ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x5050 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Yiancar +#define PRODUCT Baguette +#define DESCRIPTION A French Custom + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 16 + +/* + * 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 { B3, B2, B1, E6, D6 } +#define MATRIX_COL_PINS { B6, C6, C7, F7, F6, F5, F4, F1, F0, B0, D0, D1, D2, D3, D5, D4 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +#define BACKLIGHT_PIN B7 +#define BACKLIGHT_BREATHING +#define BACKLIGHT_LEVELS 5 + +// #define RGB_DI_PIN E2 +// #ifdef RGB_DI_PIN +// #define RGBLIGHT_ANIMATIONS +// #define RGBLED_NUM 16 +// #define RGBLIGHT_HUE_STEP 8 +// #define RGBLIGHT_SAT_STEP 8 +// #define RGBLIGHT_VAL_STEP 8 +// #endif + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* 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 userful 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 + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * 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 + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +//#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ + diff --git a/keyboards/baguette/info.json b/keyboards/baguette/info.json new file mode 100644 index 000000000..777899a60 --- /dev/null +++ b/keyboards/baguette/info.json @@ -0,0 +1,16 @@ +{ + "keyboard_name": "Baguette", + "url": "", + "maintainer": "qmk", + "bootloader": "atmel-dfu", + "width": 19.75, + "height": 6.5, + "layouts": { + "LAYOUT_ansi": { + "layout": [{"label":"~", "x":3.25, "y":1.5}, {"label":"!", "x":4.25, "y":1.5}, {"label":"@", "x":5.25, "y":1.5}, {"label":"#", "x":6.25, "y":1.5}, {"label":"$", "x":7.25, "y":1.5}, {"label":"%", "x":8.25, "y":1.5}, {"label":"^", "x":9.25, "y":1.5}, {"label":"&", "x":10.25, "y":1.5}, {"label":"*", "x":11.25, "y":1.5}, {"label":"(", "x":12.25, "y":1.5}, {"label":")", "x":13.25, "y":1.5}, {"label":"_", "x":14.25, "y":1.5}, {"label":"+", "x":15.25, "y":1.5}, {"label":"|", "x":16.25, "y":1.5}, {"label":"Del", "x":17.25, "y":1.5}, {"label":"Insert", "x":18.75, "y":1.5}, {"label":"Tab", "x":3.25, "y":2.5, "w":1.5}, {"label":"Q", "x":4.75, "y":2.5}, {"label":"W", "x":5.75, "y":2.5}, {"label":"E", "x":6.75, "y":2.5}, {"label":"R", "x":7.75, "y":2.5}, {"label":"T", "x":8.75, "y":2.5}, {"label":"Y", "x":9.75, "y":2.5}, {"label":"U", "x":10.75, "y":2.5}, {"label":"I", "x":11.75, "y":2.5}, {"label":"O", "x":12.75, "y":2.5}, {"label":"P", "x":13.75, "y":2.5}, {"label":"{", "x":14.75, "y":2.5}, {"label":"}", "x":15.75, "y":2.5}, {"label":"|", "x":16.75, "y":2.5, "w":1.5}, {"label":"Delete", "x":18.75, "y":2.5}, {"label":"Control", "x":3.25, "y":3.5, "w":1.75}, {"label":"A", "x":5, "y":3.5}, {"label":"S", "x":6, "y":3.5}, {"label":"D", "x":7, "y":3.5}, {"label":"F", "x":8, "y":3.5}, {"label":"G", "x":9, "y":3.5}, {"label":"H", "x":10, "y":3.5}, {"label":"J", "x":11, "y":3.5}, {"label":"K", "x":12, "y":3.5}, {"label":"L", "x":13, "y":3.5}, {"label":":", "x":14, "y":3.5}, {"label":"\"", "x":15, "y":3.5}, {"label":"Enter", "x":16, "y":3.5, "w":2.25}, {"x":3.25, "y":4.5, "w":1.25}, {"x":4.5, "y":4.5}, {"label":"Z", "x":5.5, "y":4.5}, {"label":"X", "x":6.5, "y":4.5}, {"label":"C", "x":7.5, "y":4.5}, {"label":"V", "x":8.5, "y":4.5}, {"label":"B", "x":9.5, "y":4.5}, {"label":"N", "x":10.5, "y":4.5}, {"label":"M", "x":11.5, "y":4.5}, {"label":"<", "x":12.5, "y":4.5}, {"label":">", "x":13.5, "y":4.5}, {"label":"?", "x":14.5, "y":4.5}, {"x":15.5, "y":4.5}, {"label":"Shift", "x":16.5, "y":4.5, "w":1.25}, {"label":"\u2191", "x":17.75, "y":4.5}, {"label":"Win", "x":4.5, "y":5.5}, {"label":"Alt", "x":5.5, "y":5.5, "w":1.25}, {"x":6.75, "y":5.5, "w":6.25}, {"label":"Ctrl", "x":13, "y":5.5, "w":1.25}, {"label":"Fn", "x":14.25, "y":5.5}, {"label":"\u2190", "x":16.75, "y":5.5}, {"label":"\u2193", "x":17.75, "y":5.5}, {"label":"\u2192", "x":18.75, "y":5.5}] + }, + "LAYOUT_iso": { + "layout": [{"label":"~", "x":3.25, "y":1.5}, {"label":"!", "x":4.25, "y":1.5}, {"label":"@", "x":5.25, "y":1.5}, {"label":"#", "x":6.25, "y":1.5}, {"label":"$", "x":7.25, "y":1.5}, {"label":"%", "x":8.25, "y":1.5}, {"label":"^", "x":9.25, "y":1.5}, {"label":"&", "x":10.25, "y":1.5}, {"label":"*", "x":11.25, "y":1.5}, {"label":"(", "x":12.25, "y":1.5}, {"label":")", "x":13.25, "y":1.5}, {"label":"_", "x":14.25, "y":1.5}, {"label":"+", "x":15.25, "y":1.5}, {"label":"|", "x":16.25, "y":1.5}, {"label":"Del", "x":17.25, "y":1.5}, {"label":"Insert", "x":18.75, "y":1.5}, {"label":"Tab", "x":3.25, "y":2.5, "w":1.5}, {"label":"Q", "x":4.75, "y":2.5}, {"label":"W", "x":5.75, "y":2.5}, {"label":"E", "x":6.75, "y":2.5}, {"label":"R", "x":7.75, "y":2.5}, {"label":"T", "x":8.75, "y":2.5}, {"label":"Y", "x":9.75, "y":2.5}, {"label":"U", "x":10.75, "y":2.5}, {"label":"I", "x":11.75, "y":2.5}, {"label":"O", "x":12.75, "y":2.5}, {"label":"P", "x":13.75, "y":2.5}, {"label":"{", "x":14.75, "y":2.5}, {"label":"}", "x":15.75, "y":2.5}, {"label":"Enter", "x":17, "y":2.5, "w":1.25, "h":2}, {"label":"Delete", "x":18.75, "y":2.5}, {"label":"Control", "x":3.25, "y":3.5, "w":1.75}, {"label":"A", "x":5, "y":3.5}, {"label":"S", "x":6, "y":3.5}, {"label":"D", "x":7, "y":3.5}, {"label":"F", "x":8, "y":3.5}, {"label":"G", "x":9, "y":3.5}, {"label":"H", "x":10, "y":3.5}, {"label":"J", "x":11, "y":3.5}, {"label":"K", "x":12, "y":3.5}, {"label":"L", "x":13, "y":3.5}, {"label":":", "x":14, "y":3.5}, {"label":"\"", "x":15, "y":3.5}, {"x":16, "y":3.5}, {"x":3.25, "y":4.5, "w":1.25}, {"x":4.5, "y":4.5}, {"label":"Z", "x":5.5, "y":4.5}, {"label":"X", "x":6.5, "y":4.5}, {"label":"C", "x":7.5, "y":4.5}, {"label":"V", "x":8.5, "y":4.5}, {"label":"B", "x":9.5, "y":4.5}, {"label":"N", "x":10.5, "y":4.5}, {"label":"M", "x":11.5, "y":4.5}, {"label":"<", "x":12.5, "y":4.5}, {"label":">", "x":13.5, "y":4.5}, {"label":"?", "x":14.5, "y":4.5}, {"x":15.5, "y":4.5}, {"label":"Shift", "x":16.5, "y":4.5, "w":1.25}, {"label":"\u2191", "x":17.75, "y":4.5}, {"label":"Win", "x":4.5, "y":5.5}, {"label":"Alt", "x":5.5, "y":5.5, "w":1.25}, {"x":6.75, "y":5.5, "w":6.25}, {"label":"Ctrl", "x":13, "y":5.5, "w":1.25}, {"label":"Fn", "x":14.25, "y":5.5}, {"label":"\u2190", "x":16.75, "y":5.5}, {"label":"\u2193", "x":17.75, "y":5.5}, {"label":"\u2192", "x":18.75, "y":5.5}] + } + } +} diff --git a/keyboards/baguette/keymaps/default/keymap.c b/keyboards/baguette/keymaps/default/keymap.c new file mode 100644 index 000000000..4dfcb837a --- /dev/null +++ b/keyboards/baguette/keymaps/default/keymap.c @@ -0,0 +1,50 @@ +/* Copyright 2018 Yiancar + * + * 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 . + */ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = LAYOUT_ansi( /* Base */ + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_TRNS, KC_INS,\ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL,\ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ + KC_LSFT, KC_TRNS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_TRNS, KC_RSFT, KC_UP, \ + KC_LGUI, KC_LALT, KC_SPC, KC_RCTL, MO(1), KC_LEFT, KC_DOWN, KC_RGHT), + +[1] = LAYOUT_ansi( /* FN */ + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS,\ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS,\ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, BL_TOGG, BL_STEP, BL_BRTG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_RCTL, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), +}; + + + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/baguette/keymaps/default/readme.md b/keyboards/baguette/keymaps/default/readme.md new file mode 100644 index 000000000..1e74a02cd --- /dev/null +++ b/keyboards/baguette/keymaps/default/readme.md @@ -0,0 +1,9 @@ +# The default ANSI keymap for baguette + +Typical ANSI keymap. Please note: +- Left key from split backspace is connected to 2u key. +- Left key from split left Shift is connected to 2u key. +- Right key from split right Shift is connected to 2u key. +- Backlight control is on the Z, X and C keys of the FN layer. +- Reset key combination is FN + ]. +- Holding ESC and Space while plugging in the USB erases the EEPROM. diff --git a/keyboards/baguette/keymaps/iso/keymap.c b/keyboards/baguette/keymaps/iso/keymap.c new file mode 100644 index 000000000..ea8baf08e --- /dev/null +++ b/keyboards/baguette/keymaps/iso/keymap.c @@ -0,0 +1,50 @@ +/* Copyright 2018 Yiancar + * + * 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 . + */ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = LAYOUT_iso( /* Base */ + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_TRNS, KC_INS,\ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_DEL,\ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_QUOT, KC_ENT, \ + KC_LSFT, KC_TRNS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_TRNS, KC_RSFT, KC_UP, \ + KC_LGUI, KC_LALT, KC_SPC, KC_RCTL, MO(1), KC_LEFT, KC_DOWN, KC_RGHT), + +[0] = LAYOUT_iso( /* FN */ + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS,\ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS,\ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, BL_TOGG, BL_STEP, BL_BRTG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_RCTL, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), +}; + + + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/baguette/keymaps/iso/readme.md b/keyboards/baguette/keymaps/iso/readme.md new file mode 100644 index 000000000..9256820a5 --- /dev/null +++ b/keyboards/baguette/keymaps/iso/readme.md @@ -0,0 +1,10 @@ +# The default ISO keymap for baguette + +Typical ISO keymap. Please note: +- Left key from split backspace is connected to 2u key. +- Left key from split left Shift is connected to 2u key. +- Right key from split right Shift is connected to 2u key. +- Backlight control is on the Z, X and C keys of the FN layer. +- Reset key combination is FN + ]. +- Holding ESC and Space while plugging in the USB erases the EEPROM. + diff --git a/keyboards/baguette/readme.md b/keyboards/baguette/readme.md new file mode 100644 index 000000000..d211af16a --- /dev/null +++ b/keyboards/baguette/readme.md @@ -0,0 +1,16 @@ +Baguette +======== + +![Baguette](https://cdn.discordapp.com/attachments/426880953143525384/479788409263489035/scecre2.png) + +This is a custom keyboard with backlight inspired by France. + +Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [github](https://github.com/yiancar) +Hardware Supported: ATMEGA 32u4 MCU with backlight support. +Hardware Availability: Closed group-buy please contact the runners (Tesletron and Enjoy) + +Make example for this keyboard (after setting up your build environment): + + make baguette:default + +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). diff --git a/keyboards/baguette/rules.mk b/keyboards/baguette/rules.mk new file mode 100644 index 000000000..062ff1b22 --- /dev/null +++ b/keyboards/baguette/rules.mk @@ -0,0 +1,81 @@ +# MCU name +#MCU = at90usb1286 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = no # USB Nkey Rollover +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) From 37cfd2c5009b932cfddec815c63c6846a5ef3854 Mon Sep 17 00:00:00 2001 From: takashiski Date: Wed, 3 Oct 2018 09:51:43 +0900 Subject: [PATCH 213/788] add JP keycode for MacOSX (#4033) --- quantum/keymap_extras/keymap_jp.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/quantum/keymap_extras/keymap_jp.h b/quantum/keymap_extras/keymap_jp.h index fb74bce8d..b0235f112 100644 --- a/quantum/keymap_extras/keymap_jp.h +++ b/quantum/keymap_extras/keymap_jp.h @@ -40,6 +40,9 @@ #define JP_HENK KC_INT4 // henkan #define JP_KANA KC_INT2 // katakana/hiragana|ro-mazi +#define JP_MKANA KC_LANG1 //kana on MacOSX +#define JP_MEISU KC_LANG2 //eisu on MacOSX + //Aliases for shifted symbols #define JP_DQT LSFT(KC_2) // " From 2d671a7e1a75bb9d03a40c0e440f897c7e52a15e Mon Sep 17 00:00:00 2001 From: Chris Johnston Date: Tue, 2 Oct 2018 22:16:49 -0700 Subject: [PATCH 214/788] Enable support for Linux Mint 18 with linux_install.sh (#4042) Enable support for ubuntu-derived linux-es in installer Checks /etc/os-release for mention of ubuntu and debian. Linux Mint uses ID_LIKE=ubuntu, not ID_LIKE=debian (as seen in Ubuntu 16.04, unsure about others) --- util/linux_install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/util/linux_install.sh b/util/linux_install.sh index 9b8b92d08..0e4e26fd9 100755 --- a/util/linux_install.sh +++ b/util/linux_install.sh @@ -4,7 +4,7 @@ if grep ID /etc/os-release | grep -qE "rhel|fedora"; then sudo dnf install gcc unzip wget zip dfu-util dfu-programmer avr-gcc \ avr-libc binutils-avr32-linux-gnu arm-none-eabi-gcc-cs \ arm-none-eabi-binutils-cs arm-none-eabi-newlib -elif grep ID /etc/os-release | grep -q debian; then +elif grep ID /etc/os-release | grep -qE 'debian|ubuntu'; then sudo apt-get update sudo apt-get install gcc unzip wget zip gcc-avr binutils-avr avr-libc \ dfu-programmer dfu-util gcc-arm-none-eabi binutils-arm-none-eabi \ @@ -38,5 +38,5 @@ fi else echo "Sorry, we don't recognize your OS. Help us by contributing support!" echo - echo "https://docs.qmk.fm/contributing.html" + echo "https://docs.qmk.fm/#/contributing" fi From 76f0b3cc70d8d1173f9145abc4d2725fd8f47302 Mon Sep 17 00:00:00 2001 From: "James D. Marble" Date: Tue, 2 Oct 2018 20:13:04 -0700 Subject: [PATCH 215/788] Add missing F-keys to ergodox_infinity input_club F11 and F12 were in the ascii art, but not the actual mapping. This corrects the error. --- keyboards/ergodox_infinity/keymaps/input_club/keymap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/ergodox_infinity/keymaps/input_club/keymap.c b/keyboards/ergodox_infinity/keymaps/input_club/keymap.c index e77319d2c..45ad1f51f 100644 --- a/keyboards/ergodox_infinity/keymaps/input_club/keymap.c +++ b/keyboards/ergodox_infinity/keymaps/input_club/keymap.c @@ -93,7 +93,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | * +-----+-----+-----+ */ - KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, @@ -120,7 +120,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | * +-----+-----+-----+ */ - KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS, + KC_F12, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, From d435dabefb6b6870de2e1d2a660c0e9be8fa25e5 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Wed, 3 Oct 2018 08:29:29 -0700 Subject: [PATCH 216/788] Keyboard: Mint60: Configurator support and readme cleanup (#4057) * Mint60: add Configurator support * Mint60: readme cleanup Fixed the imgur url so the photo shows up, and updated the links to the docs. --- keyboards/mint60/info.json | 78 ++++++++++++++++++++++++++++++++++++++ keyboards/mint60/readme.md | 4 +- 2 files changed, 80 insertions(+), 2 deletions(-) diff --git a/keyboards/mint60/info.json b/keyboards/mint60/info.json index e69de29bb..f03e6371b 100644 --- a/keyboards/mint60/info.json +++ b/keyboards/mint60/info.json @@ -0,0 +1,78 @@ +{ + "keyboard_name": "Mint60", + "url": "", + "maintainer": "eucalyn", + "width": 16, + "height": 5, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"~", "x":0, "y":0}, + {"label":"!", "x":1, "y":0}, + {"label":"@", "x":2, "y":0}, + {"label":"#", "x":3, "y":0}, + {"label":"$", "x":4, "y":0}, + {"label":"%", "x":5, "y":0}, + {"label":"^", "x":7, "y":0}, + {"label":"&", "x":8, "y":0}, + {"label":"*", "x":9, "y":0}, + {"label":"(", "x":10, "y":0}, + {"label":")", "x":11, "y":0}, + {"label":"_", "x":12, "y":0}, + {"label":"+", "x":13, "y":0}, + {"label":"Backspace", "x":14, "y":0, "w":2}, + {"label":"Tab", "x":0, "y":1, "w":1.5}, + {"label":"Q", "x":1.5, "y":1}, + {"label":"W", "x":2.5, "y":1}, + {"label":"E", "x":3.5, "y":1}, + {"label":"R", "x":4.5, "y":1}, + {"label":"T", "x":5.5, "y":1}, + {"label":"Y", "x":7.5, "y":1}, + {"label":"U", "x":8.5, "y":1}, + {"label":"I", "x":9.5, "y":1}, + {"label":"O", "x":10.5, "y":1}, + {"label":"P", "x":11.5, "y":1}, + {"label":"{", "x":12.5, "y":1}, + {"label":"}", "x":13.5, "y":1}, + {"label":"|", "x":14.5, "y":1, "w":1.5}, + {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, + {"label":"A", "x":1.75, "y":2}, + {"label":"S", "x":2.75, "y":2}, + {"label":"D", "x":3.75, "y":2}, + {"label":"F", "x":4.75, "y":2}, + {"label":"G", "x":5.75, "y":2}, + {"label":"H", "x":7.75, "y":2}, + {"label":"J", "x":8.75, "y":2}, + {"label":"K", "x":9.75, "y":2}, + {"label":"L", "x":10.75, "y":2}, + {"label":":", "x":11.75, "y":2}, + {"label":"\"", "x":12.75, "y":2}, + {"label":"Enter", "x":13.75, "y":2, "w":2.25}, + {"label":"Shift", "x":0, "y":3, "w":2}, + {"label":"Z", "x":2, "y":3}, + {"label":"X", "x":3, "y":3}, + {"label":"C", "x":4, "y":3}, + {"label":"V", "x":5, "y":3}, + {"label":"B", "x":6, "y":3}, + {"label":"N", "x":8, "y":3}, + {"label":"M", "x":9, "y":3}, + {"label":"<", "x":10, "y":3}, + {"label":">", "x":11, "y":3}, + {"label":"?", "x":12, "y":3}, + {"label":"Shift", "x":13, "y":3}, + {"label":"Up", "x":14, "y":3}, + {"label":"Fn", "x":15, "y":3}, + {"label":"Esc", "x":0, "y":4}, + {"label":"Ctrl", "x":1, "y":4, "w":1.25}, + {"label":"Win", "x":2.25, "y":4, "w":1.25}, + {"label":"Alt", "x":3.5, "y":4, "w":1.25}, + {"label":"Space", "x":4.75, "y":4, "w":2.25}, + {"label":"Space", "x":7.75, "y":4, "w":2.75}, + {"label":"Win", "x":10.5, "y":4, "w":1.25}, + {"label":"Ctrl", "x":11.75, "y":4, "w":1.25}, + {"label":"Left", "x":13, "y":4}, + {"label":"Down", "x":14, "y":4}, + {"label":"Right", "x":15, "y":4}] + } + } +} diff --git a/keyboards/mint60/readme.md b/keyboards/mint60/readme.md index b8ae720f5..1824c682f 100644 --- a/keyboards/mint60/readme.md +++ b/keyboards/mint60/readme.md @@ -1,6 +1,6 @@ # Mint60 -![Mint60](https://imgur.com/a/8xnTS4U) +![Mint60](https://i.imgur.com/suOE8HN.jpg) A short description of the keyboard/project @@ -12,4 +12,4 @@ Make example for this keyboard (after setting up your build environment): make mint60:default -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. +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). From b9c503085191ea1fb0f9d80c7d083e316e9f0f7c Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Wed, 3 Oct 2018 08:30:13 -0700 Subject: [PATCH 217/788] Keyboard: KBD4x: corrected info.json file (#4056) The `info.json` file for the KBD4x was invalid due to a couple of extra commas. --- keyboards/kbd4x/info.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/kbd4x/info.json b/keyboards/kbd4x/info.json index 78d011e2c..f9952e790 100644 --- a/keyboards/kbd4x/info.json +++ b/keyboards/kbd4x/info.json @@ -53,7 +53,7 @@ {"label":"/", "x":8, "y":3}, {"label":"LEFT", "x":9, "y":3}, {"label":"DOWN", "x":10, "y":3}, - {"label":"RIGHT", "x":11, "y":3}, + {"label":"RIGHT", "x":11, "y":3} ] }, "LAYOUT_ortho_4x12": { @@ -105,7 +105,7 @@ {"label":"/", "x":8, "y":3}, {"label":"LEFT", "x":9, "y":3}, {"label":"DOWN", "x":10, "y":3}, - {"label":"RIGHT", "x":11, "y":3}, + {"label":"RIGHT", "x":11, "y":3} ] } } From b1c2849500df4d8fedeaf3a4d01bec1a15cf4cd0 Mon Sep 17 00:00:00 2001 From: Daniel Shields Date: Wed, 3 Oct 2018 16:30:44 +0100 Subject: [PATCH 218/788] Keymap: Add RGB matrix keypress effects and reduce firmware size. (#4055) --- keyboards/model01/keymaps/dshields/config.h | 1 + keyboards/model01/keymaps/dshields/rules.mk | 2 ++ keyboards/planck/keymaps/dshields/config.h | 1 + keyboards/planck/keymaps/dshields/rules.mk | 1 + 4 files changed, 5 insertions(+) diff --git a/keyboards/model01/keymaps/dshields/config.h b/keyboards/model01/keymaps/dshields/config.h index 4de2d3cbb..1c78217f2 100644 --- a/keyboards/model01/keymaps/dshields/config.h +++ b/keyboards/model01/keymaps/dshields/config.h @@ -1,5 +1,6 @@ #pragma once +#define RGB_MATRIX_KEYPRESSES #define RGB_DIGITAL_RAIN_DROPS 18 #define USB_MAX_POWER_CONSUMPTION 100 #define ONESHOT_TAP_TOGGLE 2 diff --git a/keyboards/model01/keymaps/dshields/rules.mk b/keyboards/model01/keymaps/dshields/rules.mk index 6c605daec..d3754cc1f 100644 --- a/keyboards/model01/keymaps/dshields/rules.mk +++ b/keyboards/model01/keymaps/dshields/rules.mk @@ -1 +1,3 @@ MOUSEKEY_ENABLE = yes +EXTRAKEY_ENABLE = no +CONSOLE_ENABLE = no diff --git a/keyboards/planck/keymaps/dshields/config.h b/keyboards/planck/keymaps/dshields/config.h index 512e2fbc6..63434f60c 100644 --- a/keyboards/planck/keymaps/dshields/config.h +++ b/keyboards/planck/keymaps/dshields/config.h @@ -1,5 +1,6 @@ #pragma once +#define RGB_MATRIX_KEYPRESSES #define RGB_DIGITAL_RAIN_DROPS 24 #define USB_MAX_POWER_CONSUMPTION 100 #define ONESHOT_TAP_TOGGLE 2 diff --git a/keyboards/planck/keymaps/dshields/rules.mk b/keyboards/planck/keymaps/dshields/rules.mk index 8799c78f0..033e3c9c4 100644 --- a/keyboards/planck/keymaps/dshields/rules.mk +++ b/keyboards/planck/keymaps/dshields/rules.mk @@ -5,6 +5,7 @@ endif MOUSEKEY_ENABLE = yes # Mouse keys(+4700) COMMAND_ENABLE = no # Commands for debug and configuration CONSOLE_ENABLE = no # Console for debug(+400) +EXTRAKEY_ENABLE = no SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend API_SYSEX_ENABLE = no From 4d1d1b7196e4aec3f91cc17856aa15c9a92d6ace Mon Sep 17 00:00:00 2001 From: Jumail Mundekkat Date: Thu, 4 Oct 2018 01:32:56 +1000 Subject: [PATCH 219/788] Keyboard: Added JN68M keyboard to handwired (#4053) --- keyboards/handwired/jn68m/config.h | 54 +++++++++++++ keyboards/handwired/jn68m/info.json | 16 ++++ keyboards/handwired/jn68m/jn68m.c | 37 +++++++++ keyboards/handwired/jn68m/jn68m.h | 49 +++++++++++ .../handwired/jn68m/keymaps/default/config.h | 19 +++++ .../handwired/jn68m/keymaps/default/keymap.c | 75 +++++++++++++++++ keyboards/handwired/jn68m/readme.md | 14 ++++ keyboards/handwired/jn68m/rules.mk | 81 +++++++++++++++++++ 8 files changed, 345 insertions(+) create mode 100644 keyboards/handwired/jn68m/config.h create mode 100644 keyboards/handwired/jn68m/info.json create mode 100644 keyboards/handwired/jn68m/jn68m.c create mode 100644 keyboards/handwired/jn68m/jn68m.h create mode 100644 keyboards/handwired/jn68m/keymaps/default/config.h create mode 100644 keyboards/handwired/jn68m/keymaps/default/keymap.c create mode 100644 keyboards/handwired/jn68m/readme.md create mode 100644 keyboards/handwired/jn68m/rules.mk diff --git a/keyboards/handwired/jn68m/config.h b/keyboards/handwired/jn68m/config.h new file mode 100644 index 000000000..22ab1158d --- /dev/null +++ b/keyboards/handwired/jn68m/config.h @@ -0,0 +1,54 @@ +/* +Copyright 2018 Jumail Mundekkat / MxBlue + +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 . +*/ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xC714 +#define PRODUCT_ID 0x1010 +#define DEVICE_VER 0x0001 +#define MANUFACTURER MxBlue +#define PRODUCT JN68M +#define DESCRIPTION Custom PCB for VA68M + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 16 + +/* key matrix pins */ +#define MATRIX_ROW_PINS { B0, B1, D5, D3, D2 } +#define MATRIX_COL_PINS { F0, F1, F4, F5, F6, F7, C7, C6, B6, B5, B4, D7, D6, D4, E6, D1 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* 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 + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) diff --git a/keyboards/handwired/jn68m/info.json b/keyboards/handwired/jn68m/info.json new file mode 100644 index 000000000..ce95563e9 --- /dev/null +++ b/keyboards/handwired/jn68m/info.json @@ -0,0 +1,16 @@ +{ + "keyboard_name": "JN68M", + "url": "", + "maintainer": "qmk", + "bootloader": "atmel-dfu", + "width": 17.25, + "height": 5, + "layouts": { + "LAYOUT": { + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0, "w":2}, {"x":15.25, "y":0}, {"x":16.25, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":15.25, "y":1}, {"x":16.25, "y":1}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2, "w":2.25}, {"x":0, "y":3, "w":2.25}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":2.75}, {"x":15.25, "y":3}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"x":10, "y":4, "w":1.25}, {"x":11.25, "y":4, "w":1.25}, {"x":12.5, "y":4, "w":1.25}, {"x":14.25, "y":4}, {"x":15.25, "y":4}, {"x":16.25, "y":4}] + }, + "LAYOUT_splitbs": { + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":15.25, "y":0}, {"x":16.25, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":15.25, "y":1}, {"x":16.25, "y":1}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2, "w":2.25}, {"x":0, "y":3, "w":2.25}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":2.75}, {"x":15.25, "y":3}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"x":10, "y":4, "w":1.25}, {"x":11.25, "y":4, "w":1.25}, {"x":12.5, "y":4, "w":1.25}, {"x":14.25, "y":4}, {"x":15.25, "y":4}, {"x":16.25, "y":4}] + } + } +} diff --git a/keyboards/handwired/jn68m/jn68m.c b/keyboards/handwired/jn68m/jn68m.c new file mode 100644 index 000000000..b61b17aa9 --- /dev/null +++ b/keyboards/handwired/jn68m/jn68m.c @@ -0,0 +1,37 @@ +/* Copyright 2018 Jumail Mundekkat / MxBlue + * + * 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 . + */ +#include "jn68m.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} diff --git a/keyboards/handwired/jn68m/jn68m.h b/keyboards/handwired/jn68m/jn68m.h new file mode 100644 index 000000000..d47f9f6c9 --- /dev/null +++ b/keyboards/handwired/jn68m/jn68m.h @@ -0,0 +1,49 @@ +/* Copyright 2018 Jumail Mundekkat / MxBlue + * + * 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 . + */ +#ifndef JN68M_H +#define JN68M_H + +#include "quantum.h" + +#define LAYOUT( \ + K1 , K2 , K3 , K4 , K5 , K6 , K7 , K8 , K9 , K10, K11, K12, K13, K14, K67, K68,\ + K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K69, K70,\ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K40, K41, K42, \ + K43, K44, K45, K46, K47, K48, K49, K50, K51, K52, K53, K54, K55, \ + K56, K57, K58, K59, K60, K61, K63, K64, K65, K66 \ +) { \ + { K1 , K2 , K3 , K4 , K5 , K6 , K7 , K8 , K9 , K10, K11, K12, K13, K14, K67, K68 }, \ + { K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K69, K70 }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K40, K41, K42,KC_NO,KC_NO,KC_NO}, \ + { K43, K44, K45, K46, K47, K48, K49, K50, K51, K52,KC_NO,K53, K54,KC_NO,K55,KC_NO}, \ + { K56, K57, K58,KC_NO,KC_NO,K59,KC_NO,KC_NO,KC_NO,K60,KC_NO,K61, K63, K64, K65, K66} \ +} + +#define LAYOUT_splitbs( \ + K1 , K2 , K3 , K4 , K5 , K6 , K7 , K8 , K9 , K10, K11, K12, K13, K14, K15, K67, K68,\ + K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K69, K70,\ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K40, K41, K42, \ + K43, K44, K45, K46, K47, K48, K49, K50, K51, K52, K53, K54, K55, \ + K56, K57, K58, K59, K60, K61, K63, K64, K65, K66 \ +) { \ + { K1 , K2 , K3 , K4 , K5 , K6 , K7 , K8 , K9 , K10, K11, K12, K13, K14, K67, K68 }, \ + { K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K69, K70 }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K40, K41, K42, K15,KC_NO,KC_NO}, \ + { K43, K44, K45, K46, K47, K48, K49, K50, K51, K52,KC_NO,K53, K54,KC_NO,K55,KC_NO}, \ + { K56, K57, K58,KC_NO,KC_NO,K59,KC_NO,KC_NO,KC_NO,K60,KC_NO,K61, K63, K64, K65, K66} \ +} + +#endif diff --git a/keyboards/handwired/jn68m/keymaps/default/config.h b/keyboards/handwired/jn68m/keymaps/default/config.h new file mode 100644 index 000000000..4496c5910 --- /dev/null +++ b/keyboards/handwired/jn68m/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 REPLACE_WITH_YOUR_NAME + * + * 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 . + */ + +#pragma once + +// place overrides here diff --git a/keyboards/handwired/jn68m/keymaps/default/keymap.c b/keyboards/handwired/jn68m/keymaps/default/keymap.c new file mode 100644 index 000000000..98eede94c --- /dev/null +++ b/keyboards/handwired/jn68m/keymaps/default/keymap.c @@ -0,0 +1,75 @@ +/* Copyright 2018 Jumail Mundekkat / MxBlue + * + * 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 . + */ +#include QMK_KEYBOARD_H + +// Defines the keycodes used by our macros in process_record_user +enum custom_keycodes { + QMKBEST = SAFE_RANGE, + QMKURL +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + KC_GESC, KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_MINS, KC_EQL , KC_BSPC, KC_INS, KC_PGUP, + KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_PGDN, + KC_CAPS, KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, KC_RSFT, KC_UP, + KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + ), + + [1] = LAYOUT( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_PSCR, KC_HOME, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_END, KC_TRNS, KC_TRNS, KC_TRNS, + RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_APP, KC_TRNS, KC_TRNS, KC_TRNS + ), + +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QMKBEST: + if (record->event.pressed) { + // when keycode QMKBEST is pressed + SEND_STRING("QMK is the best thing ever!"); + } else { + // when keycode QMKBEST is released + } + break; + case QMKURL: + if (record->event.pressed) { + // when keycode QMKURL is pressed + SEND_STRING("https://qmk.fm/" SS_TAP(X_ENTER)); + } else { + // when keycode QMKURL is released + } + break; + } + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/handwired/jn68m/readme.md b/keyboards/handwired/jn68m/readme.md new file mode 100644 index 000000000..f219564ca --- /dev/null +++ b/keyboards/handwired/jn68m/readme.md @@ -0,0 +1,14 @@ +# JN68M + +A custom replacement PCB for the VA68M and a birthday present for a mate. +PCB designed by /u/Xelus22 + +Keyboard Maintainer: [MxBlue](https://github.com/mxblu) +Hardware Supported: ATMega32u4 +Hardware Availability: Unavailable unless you happen to be Justin ;) + +Make example for this keyboard (after setting up your build environment): + + make handwired/jn68m:default + +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). diff --git a/keyboards/handwired/jn68m/rules.mk b/keyboards/handwired/jn68m/rules.mk new file mode 100644 index 000000000..42d85ada1 --- /dev/null +++ b/keyboards/handwired/jn68m/rules.mk @@ -0,0 +1,81 @@ +# MCU name +#MCU = at90usb1286 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = no # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) From 404db1d06fa9c0dd25fff3bfa1b2ebed7273a8fc Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Wed, 3 Oct 2018 08:33:14 -0700 Subject: [PATCH 220/788] handwired/ibm122m: refactor and Configurator support (#4054) * handwired/ibm122m: refactor Refactored layout macro and keymaps to more closely resemble the keyboard's physical layout. * handwired/ibm122m: add Configurator support --- keyboards/handwired/ibm122m/ibm122m.h | 15 +- keyboards/handwired/ibm122m/info.json | 136 ++++++++ .../ibm122m/keymaps/default/keymap.c | 22 +- .../handwired/ibm122m/keymaps/lukaus/keymap.c | 305 +++++++++--------- 4 files changed, 306 insertions(+), 172 deletions(-) diff --git a/keyboards/handwired/ibm122m/ibm122m.h b/keyboards/handwired/ibm122m/ibm122m.h index 93e18b4e6..a52bf4bc4 100644 --- a/keyboards/handwired/ibm122m/ibm122m.h +++ b/keyboards/handwired/ibm122m/ibm122m.h @@ -21,14 +21,13 @@ // The first section contains all of the arguments // The second converts the arguments into a two-dimensional array #define LAYOUT( \ - k09, k19, k1A, k29, k39, k3A, k49, k59, k5A, k69, k79, k7A, k3G, k3H, k2G, \ - k0A, k0B, k1B, k2A, k2B, k3B, k4A, k4B, k5B, k6A, k6B, k7B, k1G, k5G, k4G, \ -k31, k32, k34, k24, k25, k26, k27, k37, k38, k28, k2C, k2D, k2E, k3E, k3C, k3F, k2F, k2H, k2I, k20, \ -k21, k41, k42, k44, k45, k46, k47, k57, k58, k48, k4C, k4D, k4E, k5E, k5C, k6F, k4F, k4H, k4I, k40, \ -k51, k52, k62, k14, k15, k16, k17, k07, k08, k18, k1C, k1D, k1E, k0E, k6E, k1F, k1H, k1I, k10, \ -k11, k12, k73, k74, k64, k65, k66, k67, k77, k78, k68, k6C, k6D, k7E, k63, k0G, k61, k6H, k6I, k7J, \ -k02, k01, k00, k70, k71, k03, k72, k60, k0J, k1J, k7H, k7I, \ - k0F \ + k09, k19, k1A, k29, k39, k3A, k49, k59, k5A, k69, k79, k7A, \ + k0A, k0B, k1B, k2A, k2B, k3B, k4A, k4B, k5B, k6A, k6B, k7B, \ + k31, k32, k34, k24, k25, k26, k27, k37, k38, k28, k2C, k2D, k2E, k3E, k3C, k3F, k3G, k3H, k2G, k2F, k2H, k2I, k20, \ + k21, k41, k42, k44, k45, k46, k47, k57, k58, k48, k4C, k4D, k4E, k5E, k5C, k6F, k1G, k5G, k4G, k4F, k4H, k4I, k40, \ + k51, k52, k62, k14, k15, k16, k17, k07, k08, k18, k1C, k1D, k1E, k0E, k6E, k0G, k1F, k1H, k1I, k10, \ + k11, k12, k73, k74, k64, k65, k66, k67, k77, k78, k68, k6C, k6D, k7E, k63, k60, k0J, k1J, k61, k6H, k6I, k7J, \ + k02, k01, k00, k70, k71, k03, k72, k0F, k7H, k7I \ ) \ { \ { k00, k01, k02, k03, KC_NO, KC_NO, KC_NO, k07, k08, k09, k0A, k0B, KC_NO, KC_NO, k0E, k0F, k0G, KC_NO, KC_NO, k0J }, \ diff --git a/keyboards/handwired/ibm122m/info.json b/keyboards/handwired/ibm122m/info.json index e69de29bb..b9ce9e8f8 100644 --- a/keyboards/handwired/ibm122m/info.json +++ b/keyboards/handwired/ibm122m/info.json @@ -0,0 +1,136 @@ +{ + "keyboard_name": "IBM Model M 122-key", + "url": "", + "maintainer": "qmk", + "bootloader": "", + "width": 24.75, + "height": 8, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"F13", "x":3.25, "y":0}, + {"label":"F14", "x":4.25, "y":0}, + {"label":"F15", "x":5.25, "y":0}, + {"label":"F16", "x":6.25, "y":0}, + {"label":"F17", "x":7.25, "y":0}, + {"label":"F18", "x":8.25, "y":0}, + {"label":"F19", "x":9.25, "y":0}, + {"label":"F20", "x":10.25, "y":0}, + {"label":"F21", "x":11.25, "y":0}, + {"label":"F22", "x":12.25, "y":0}, + {"label":"F23", "x":13.25, "y":0}, + {"label":"F24", "x":14.25, "y":0}, + {"label":"F1", "x":3.25, "y":1}, + {"label":"F2", "x":4.25, "y":1}, + {"label":"F3", "x":5.25, "y":1}, + {"label":"F4", "x":6.25, "y":1}, + {"label":"F5", "x":7.25, "y":1}, + {"label":"F6", "x":8.25, "y":1}, + {"label":"F7", "x":9.25, "y":1}, + {"label":"F8", "x":10.25, "y":1}, + {"label":"F9", "x":11.25, "y":1}, + {"label":"F10", "x":12.25, "y":1}, + {"label":"F11", "x":13.25, "y":1}, + {"label":"F12", "x":14.25, "y":1}, + {"label":"Esc", "x":0, "y":3}, + {"x":1, "y":3}, + {"label":"`", "x":2.25, "y":3}, + {"label":"1", "x":3.25, "y":3}, + {"label":"2", "x":4.25, "y":3}, + {"label":"3", "x":5.25, "y":3}, + {"label":"4", "x":6.25, "y":3}, + {"label":"5", "x":7.25, "y":3}, + {"label":"6", "x":8.25, "y":3}, + {"label":"7", "x":9.25, "y":3}, + {"label":"8", "x":10.25, "y":3}, + {"label":"9", "x":11.25, "y":3}, + {"label":"0", "x":12.25, "y":3}, + {"label":"-", "x":13.25, "y":3}, + {"label":"=", "x":14.25, "y":3}, + {"label":"Backspace", "x":15.25, "y":3, "w":2}, + {"label":"Insert", "x":17.5, "y":3}, + {"label":"Home", "x":18.5, "y":3}, + {"label":"Page Up", "x":19.5, "y":3}, + {"label":"Num Lock", "x":20.75, "y":3}, + {"label":"/", "x":21.75, "y":3}, + {"label":"*", "x":22.75, "y":3}, + {"label":"-", "x":23.75, "y":3}, + {"x":0, "y":4}, + {"x":1, "y":4}, + {"label":"Tab", "x":2.25, "y":4, "w":1.5}, + {"label":"Q", "x":3.75, "y":4}, + {"label":"W", "x":4.75, "y":4}, + {"label":"E", "x":5.75, "y":4}, + {"label":"R", "x":6.75, "y":4}, + {"label":"T", "x":7.75, "y":4}, + {"label":"Y", "x":8.75, "y":4}, + {"label":"U", "x":9.75, "y":4}, + {"label":"I", "x":10.75, "y":4}, + {"label":"O", "x":11.75, "y":4}, + {"label":"P", "x":12.75, "y":4}, + {"label":"[", "x":13.75, "y":4}, + {"label":"]", "x":14.75, "y":4}, + {"label":"Enter", "x":16, "y":4, "w":1.25, "h":2}, + {"label":"Delete", "x":17.5, "y":4}, + {"label":"End", "x":18.5, "y":4}, + {"label":"Page Down", "x":19.5, "y":4}, + {"label":"7", "x":20.75, "y":4}, + {"label":"8", "x":21.75, "y":4}, + {"label":"9", "x":22.75, "y":4}, + {"label":"+", "x":23.75, "y":4}, + {"x":0, "y":5}, + {"x":1, "y":5}, + {"label":"Caps Lock", "x":2.25, "y":5, "w":1.75}, + {"label":"A", "x":4, "y":5}, + {"label":"S", "x":5, "y":5}, + {"label":"D", "x":6, "y":5}, + {"label":"F", "x":7, "y":5}, + {"label":"G", "x":8, "y":5}, + {"label":"H", "x":9, "y":5}, + {"label":"J", "x":10, "y":5}, + {"label":"K", "x":11, "y":5}, + {"label":"L", "x":12, "y":5}, + {"label":";", "x":13, "y":5}, + {"label":"'", "x":14, "y":5}, + {"label":"#", "x":15, "y":5}, + {"label":"Up", "x":18.5, "y":5}, + {"label":"4", "x":20.75, "y":5}, + {"label":"5", "x":21.75, "y":5}, + {"label":"6", "x":22.75, "y":5}, + {"x":23.75, "y":5}, + {"x":0, "y":6}, + {"x":1, "y":6}, + {"label":"Shift", "x":2.25, "y":6, "w":1.25}, + {"label":"\\", "x":3.5, "y":6}, + {"label":"Z", "x":4.5, "y":6}, + {"label":"X", "x":5.5, "y":6}, + {"label":"C", "x":6.5, "y":6}, + {"label":"V", "x":7.5, "y":6}, + {"label":"B", "x":8.5, "y":6}, + {"label":"N", "x":9.5, "y":6}, + {"label":"M", "x":10.5, "y":6}, + {"label":",", "x":11.5, "y":6}, + {"label":".", "x":12.5, "y":6}, + {"label":"/", "x":13.5, "y":6}, + {"label":"Shift", "x":14.5, "y":6, "w":2.75}, + {"label":"Left", "x":17.5, "y":6}, + {"x":18.5, "y":6}, + {"label":"Right", "x":19.5, "y":6}, + {"label":"1", "x":20.75, "y":6}, + {"label":"2", "x":21.75, "y":6}, + {"label":"3", "x":22.75, "y":6}, + {"label":"Enter", "x":23.75, "y":6, "h":2}, + {"x":0, "y":7}, + {"x":1, "y":7}, + {"label":"Ctrl", "x":2.25, "y":7, "w":1.5}, + {"label":"Alt", "x":4.75, "y":7, "w":1.5}, + {"x":6.25, "y":7, "w":7}, + {"label":"AltGr", "x":13.25, "y":7, "w":1.5}, + {"label":"Ctrl", "x":15.75, "y":7, "w":1.5}, + {"label":"Down", "x":18.5, "y":7}, + {"label":"0", "x":20.75, "y":7, "w":2}, + {"label":".", "x":22.75, "y":7} + ] + } + } +} diff --git a/keyboards/handwired/ibm122m/keymaps/default/keymap.c b/keyboards/handwired/ibm122m/keymaps/default/keymap.c index 633df106e..fc383498a 100644 --- a/keyboards/handwired/ibm122m/keymaps/default/keymap.c +++ b/keyboards/handwired/ibm122m/keymaps/default/keymap.c @@ -16,16 +16,16 @@ #include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -// Original Layer -[0] = LAYOUT( - KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_INS, KC_HOME, KC_PGUP, - KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_END, KC_PGDN, -KC_ESC, KC_NO, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, -KC_NO, KC_NO, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,KC_ENTER, KC_P7, KC_P8, KC_P9, KC_PPLS, -KC_NO, KC_NO, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCOLON, KC_QUOT, KC_BSLS, KC_P4, KC_P5, KC_P6, KC_BSPC, -KC_NO, KC_NO, KC_LSHIFT,KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, -KC_NO, KC_NO, KC_LCTRL, KC_LALT, KC_SPC, KC_RALT, KC_RCTRL, KC_LEFT, KC_NO, KC_RIGHT,KC_P0, KC_PDOT, - KC_DOWN), + // Original Layer + [0] = LAYOUT( + KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, + KC_ESC, KC_NO, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, + KC_NO, KC_NO, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_ENT, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, KC_PPLS, + KC_NO, KC_NO, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_BSLS, KC_UP, KC_P4, KC_P5, KC_P6, KC_BSPC, + KC_NO, KC_NO, KC_LSFT, KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_LEFT, KC_NO, KC_RIGHT, KC_P1, KC_P2, KC_P3, KC_PENT, + KC_NO, KC_NO, KC_LCTL, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_DOWN, KC_P0, KC_PDOT + ), }; void matrix_init_user(void) { @@ -37,7 +37,7 @@ void matrix_scan_user(void) { } bool process_record_user(uint16_t keycode, keyrecord_t *record) { - + return true; } diff --git a/keyboards/handwired/ibm122m/keymaps/lukaus/keymap.c b/keyboards/handwired/ibm122m/keymaps/lukaus/keymap.c index 02b69bacf..9cd58c0ec 100644 --- a/keyboards/handwired/ibm122m/keymaps/lukaus/keymap.c +++ b/keyboards/handwired/ibm122m/keymaps/lukaus/keymap.c @@ -16,7 +16,7 @@ #include QMK_KEYBOARD_H enum custom_keycodes { - PLACEHOLDER = SAFE_RANGE, + PLACEHOLDER = SAFE_RANGE, DVP_ESC, // Grave escape basically i think DVP_AMPR, @@ -37,105 +37,104 @@ enum custom_keycodes { }; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -// Programmer's Dvorak -[0] = LAYOUT( - KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_INS, KC_HOME, KC_PGUP, - KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_END, KC_PGDN, -KC_ESC, TO(1), DVP_ESC, DVP_AMPR, DVP_LBRACKET, DVP_LCBR, DVP_RCBR, DVP_LPRN, DVP_EQUAL,DVP_ASTERISK, DVP_RPRN, DVP_PLUS, DVP_RBRACKET, DVP_EXLM, DVP_HASH, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, -KC_NO, TO(2), KC_TAB, KC_SCOLON,KC_COMMA, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, DVP_AT, KC_ENTER, KC_P7, KC_P8, KC_P9, KC_PPLS, -KC_NO, KC_NO, MO(3), KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINUS, KC_BSLS, KC_P4, KC_P5, KC_P6, MO(4), -LCTL(KC_F), KC_LALT, KC_LSHIFT,KC_ESC, KC_QUOT, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, -LCTL(KC_C), LCTL(KC_V), KC_LCTRL, KC_LGUI, KC_SPC, KC_RALT, KC_RCTRL, KC_LEFT, KC_BTN3, KC_RIGHT, KC_P0, KC_PDOT, - KC_DOWN -), + // Programmer's Dvorak + [0] = LAYOUT( + KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, + KC_ESC, TO(1), DVP_ESC, DVP_AMPR, DVP_LBRACKET, DVP_LCBR, DVP_RCBR, DVP_LPRN, DVP_EQUAL,DVP_ASTERISK, DVP_RPRN, DVP_PLUS, DVP_RBRACKET, DVP_EXLM, DVP_HASH, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, + KC_NO, TO(2), KC_TAB, KC_SCOLON,KC_COMMA, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, DVP_AT, KC_ENTER, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, KC_PPLS, + KC_NO, KC_NO, MO(3), KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINUS, KC_BSLS, KC_UP, KC_P4, KC_P5, KC_P6, MO(4), + LCTL(KC_F), KC_LALT, KC_LSHIFT,KC_ESC, KC_QUOT, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, KC_LEFT, KC_BTN3, KC_RIGHT, KC_P1, KC_P2, KC_P3, KC_PENT, + LCTL(KC_C), LCTL(KC_V), KC_LCTRL, KC_LGUI, KC_SPC, KC_RALT, KC_RCTRL, KC_DOWN, KC_P0, KC_PDOT + ), -// Qwerty layer + function -[1] = LAYOUT( - KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_INS, KC_HOME, KC_PGUP, - KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_END, KC_PGDN, -KC_ESC, TO(0), KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, -KC_NO, KC_NO, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,KC_ENTER, KC_P7, KC_P8, KC_P9, KC_PPLS, -KC_NO, KC_NO, MO(3), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCOLON, KC_QUOT, KC_BSLS, KC_P4, KC_P5, KC_P6, KC_BSPC, -KC_NO, KC_NO, KC_LSHIFT,KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, -KC_NO, KC_LALT,KC_LCTRL, KC_LGUI, KC_SPC, KC_RALT, KC_RCTRL, KC_LEFT, KC_WH_D, KC_RIGHT,KC_P0, KC_PDOT, - KC_DOWN -), -// Orirginal Layer -[2] = LAYOUT( - KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_INS, KC_HOME, KC_PGUP, - KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_END, KC_PGDN, -KC_ESC, TO(1), KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, -KC_NO, TO(0), KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,KC_ENTER, KC_P7, KC_P8, KC_P9, KC_PPLS, -KC_NO, KC_NO, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCOLON, KC_QUOT, KC_BSLS, KC_P4, KC_P5, KC_P6, KC_BSPC, -KC_NO, KC_NO, KC_LSHIFT,KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, -KC_NO, KC_LALT,KC_LCTRL, KC_LGUI, KC_SPC, KC_RALT, KC_RCTRL, KC_LEFT, KC_WH_D, KC_RIGHT,KC_P0, KC_PDOT, - KC_DOWN -), + // Qwerty layer + function + [1] = LAYOUT( + KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, + KC_ESC, TO(0), KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, + KC_NO, KC_NO, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,KC_ENTER, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, KC_PPLS, + KC_NO, KC_NO, MO(3), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCOLON, KC_QUOT, KC_BSLS, KC_UP, KC_P4, KC_P5, KC_P6, KC_BSPC, + KC_NO, KC_NO, KC_LSHIFT,KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLSH, KC_RSFT, KC_LEFT, KC_WH_D, KC_RIGHT, KC_P1, KC_P2, KC_P3, KC_PENT, + KC_NO, KC_LALT,KC_LCTRL, KC_LGUI, KC_SPC, KC_RALT, KC_RCTRL, KC_DOWN, KC_P0, KC_PDOT + ), + + // Orirginal Layer + [2] = LAYOUT( + KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, + KC_ESC, TO(1), KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, + KC_NO, TO(0), KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,KC_ENTER, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, KC_PPLS, + KC_NO, KC_NO, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCOLON, KC_QUOT, KC_BSLS, KC_UP, KC_P4, KC_P5, KC_P6, KC_BSPC, + KC_NO, KC_NO, KC_LSHIFT,KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLSH, KC_RSFT, KC_LEFT, KC_WH_D, KC_RIGHT, KC_P1, KC_P2, KC_P3, KC_PENT, + KC_NO, KC_LALT,KC_LCTRL, KC_LGUI, KC_SPC, KC_RALT, KC_RCTRL, KC_DOWN, KC_P0, KC_PDOT + ), + + // Function Layer + [3] = LAYOUT( + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, + KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, + MU_TOG, KC_NO, KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, + MU_MOD, KC_NO, KC_TAB, KC_NO, KC_MEDIA_PREV_TRACK, KC_MEDIA_PLAY_PAUSE, KC_MEDIA_NEXT_TRACK, KC_NO, KC_NO, KC_PGUP, KC_DEL, KC_NO, KC_NO, KC_LBRC, KC_RBRC,KC_ENTER, KC_DEL, KC_END, KC_PGDN, KC_NO, KC_NO, KC_NO, KC_PPLS, + KC_NO, KC_NO, KC_TRNS, KC_NO, KC_AUDIO_VOL_DOWN, KC_AUDIO_VOL_UP, KC_AUDIO_MUTE, KC_NO, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_SCOLON, KC_QUOT, KC_BSLS, KC_UP, LSFT(KC_E), LSFT(KC_F), KC_NO, KC_BSPC, + KC_NO, KC_LALT, KC_LSHIFT,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_PGDN, KC_COMMA, KC_DOT, KC_SLSH, KC_RSFT, KC_LEFT, KC_WH_D, KC_RIGHT, LSFT(KC_B), LSFT(KC_C), LSFT(KC_D), KC_PENT, + KC_NO, KC_NO, KC_LCTRL, KC_LGUI, KC_SPC, KC_RALT, KC_CAPS, KC_DOWN, LSFT(KC_A), KC_PDOT + ), + + // Literally just the numpad is different + [4] = LAYOUT( + KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, + KC_ESC, TO(1), DVP_ESC, DVP_AMPR, DVP_LBRACKET, DVP_LCBR, DVP_RCBR, DVP_LPRN, DVP_EQUAL,DVP_ASTERISK, DVP_RPRN, DVP_PLUS, DVP_RBRACKET, DVP_EXLM, DVP_HASH, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, TO(2), KC_TAB, KC_SCOLON,KC_COMMA, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, DVP_AT, KC_ENTER, KC_DEL, KC_END, KC_PGDN, KC_BTN1, KC_MS_U, KC_BTN2, KC_NO, + KC_NO, KC_NO, TO(0), KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINUS, KC_BSLS, KC_UP, KC_MS_L, KC_NO, KC_MS_R, KC_TRNS, + LCTL(KC_F), KC_LALT, KC_LSHIFT,KC_NO, KC_QUOT, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, KC_LEFT, KC_BTN3, KC_RIGHT, KC_GT, KC_MS_D, KC_GT, KC_PENT, + LCTL(KC_C), LCTL(KC_V), KC_LCTRL, KC_LGUI, KC_SPC, KC_RALT, KC_RCTRL, KC_DOWN, KC_BTN1, KC_PDOT + + ), + + /* + [4] = LAYOUT( + KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, + MU_TOG, TO(0), KC_DLR, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, + MU_MOD, KC_NO, KC_TAB, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_LBRC, KC_RBRC,KC_ENTER, KC_DEL, KC_END, KC_PGDN, KC_NO, KC_NO, KC_NO, KC_PPLS, + KC_NO, KC_NO, KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_QUOT, KC_BSLS, KC_UP, LSFT(KC_E), LSFT(KC_F), KC_NO, KC_BSPC, + KC_NO, KC_LALT, KC_LSHIFT,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_COMMA, KC_DOT, KC_SLSH, KC_RSFT, KC_LEFT, KC_WH_D, KC_RIGHT, LSFT(KC_B), LSFT(KC_C), LSFT(KC_D), KC_PENT, + KC_NO, KC_LGUI, KC_LCTRL, KC_LALT, KC_SPC, KC_RALT, KC_RCTRL, KC_DOWN, LSFT(KC_A), KC_PDOT -// Function Layer -[3] = LAYOUT( - KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_HOME, KC_PGUP, - KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_DEL, KC_END, KC_PGDN, -MU_TOG, KC_NO, KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, -MU_MOD, KC_NO, KC_TAB, KC_NO, KC_MEDIA_PREV_TRACK, KC_MEDIA_PLAY_PAUSE, KC_MEDIA_NEXT_TRACK, KC_NO, KC_NO, KC_PGUP, KC_DEL, KC_NO, KC_NO, KC_LBRC, KC_RBRC,KC_ENTER, KC_NO, KC_NO, KC_NO, KC_PPLS, -KC_NO, KC_NO, KC_TRNS, KC_NO, KC_AUDIO_VOL_DOWN, KC_AUDIO_VOL_UP, KC_AUDIO_MUTE, KC_NO, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_SCOLON, KC_QUOT, KC_BSLS, LSFT(KC_E), LSFT(KC_F), KC_NO, KC_BSPC, -KC_NO, KC_LALT, KC_LSHIFT,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_PGDN, KC_COMMA, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, LSFT(KC_B), LSFT(KC_C), LSFT(KC_D), KC_PENT, -KC_NO, KC_NO, KC_LCTRL, KC_LGUI, KC_SPC, KC_RALT, KC_CAPS, KC_LEFT, KC_WH_D, KC_RIGHT,LSFT(KC_A), KC_PDOT, - KC_DOWN -), -// Literally just the numpad is different -[4] = LAYOUT( - KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_INS, KC_HOME, KC_PGUP, - KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_END, KC_PGDN, -KC_ESC, TO(1), DVP_ESC, DVP_AMPR, DVP_LBRACKET, DVP_LCBR, DVP_RCBR, DVP_LPRN, DVP_EQUAL,DVP_ASTERISK, DVP_RPRN, DVP_PLUS, DVP_RBRACKET, DVP_EXLM, DVP_HASH, KC_BSPC, KC_NO, KC_NO, KC_NO, KC_NO, -KC_NO, TO(2), KC_TAB, KC_SCOLON,KC_COMMA, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, DVP_AT, KC_ENTER, KC_BTN1, KC_MS_U, KC_BTN2, KC_NO, -KC_NO, KC_NO, TO(0), KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINUS, KC_BSLS, KC_MS_L, KC_NO, KC_MS_R, KC_TRNS, -LCTL(KC_F), KC_LALT, KC_LSHIFT,KC_NO, KC_QUOT, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, KC_UP, KC_GT, KC_MS_D, KC_GT, KC_PENT, -LCTL(KC_C), LCTL(KC_V), KC_LCTRL, KC_LGUI, KC_SPC, KC_RALT, KC_RCTRL, KC_LEFT, KC_BTN3, KC_RIGHT, KC_BTN1, KC_PDOT, - KC_DOWN -), -/* -[4] = LAYOUT( - KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_INS, KC_HOME, KC_PGUP, - KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_END, KC_PGDN, -MU_TOG, TO(0), KC_DLR, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, -MU_MOD, KC_NO, KC_TAB, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_LBRC, KC_RBRC,KC_ENTER, KC_NO, KC_NO, KC_NO, KC_PPLS, -KC_NO, KC_NO, KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_QUOT, KC_BSLS, LSFT(KC_E), LSFT(KC_F), KC_NO, KC_BSPC, -KC_NO, KC_LALT, KC_LSHIFT,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_COMMA, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, LSFT(KC_B), LSFT(KC_C), LSFT(KC_D), KC_PENT, -KC_NO, KC_LGUI, KC_LCTRL, KC_LALT, KC_SPC, KC_RALT, KC_RCTRL, KC_LEFT, KC_WH_D, KC_RIGHT, LSFT(KC_A), KC_PDOT, - KC_DOWN -),*/ -/*[0] = LAYOUT( - KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_NO,TO(1),KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, - KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, TO(2),KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, - KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, - KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_BSPC,KC_4,KC_4,KC_4, KC_4, - KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, - KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, - KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, - KC_8, KC_SPC,KC_8,KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, TO(1) - -), -[1] = LAYOUT( - KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, TO(0),KC_NO,KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, KC_T, - KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, TO(2),KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, KC_T, - KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, KC_T, - KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, KC_BSPC,KC_Q,KC_R,KC_S, KC_T, - KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, KC_T, - KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, KC_T, - KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, KC_T, - KC_A, KC_SPC,KC_C,KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, TO(0) -), -[2] = LAYOUT( - KC_LCTRL, KC_LALT, KC_C, KC_RALT, KC_E, KC_F, KC_G, KC_G, KC_H, KC_J, TO(0), TO(1), KC_M, KC_N, KC_QUOT, KC_DOWN, KC_UP, KC_R, KC_S, KC_ENTER, - KC_PPLS, KC_B, KC_C, KC_D, KC_A, KC_S, KC_D, KC_F, KC_J, KC_J, KC_K, KC_NO, KC_K, KC_L, KC_SCOLON, KC_P4, KC_DEL, KC_P5, KC_P6, KC_RIGHT, - KC_PMNS, KC_1, KC_C, KC_D, KC_1, KC_2, KC_3, KC_4, KC_7, KC_J, KC_K, KC_L, KC_8, KC_9, KC_0, KC_NLCK, KC_PGUP,KC_PSLS, KC_PAST, KC_T, - KC_A, KC_ESC, TO(0),KC_D, KC_GRV, KC_F, KC_G, KC_5, KC_6, KC_J, KC_K, KC_L, KC_EQL, KC_N, KC_MINUS, KC_BSPC, KC_INS, KC_HOME, KC_S, KC_T, - KC_PPLS, KC_NO, KC_TAB, KC_D, KC_Q, KC_W, KC_E, KC_R, KC_U, KC_J, KC_K, KC_L, KC_I, KC_O, KC_P, KC_P7, KC_PGDN,KC_P8, KC_P9, KC_T, - KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_T, KC_Y, KC_J, KC_K, KC_L, KC_RBRC, KC_N, KC_LBRC, KC_P, KC_END, KC_R, KC_S, KC_T, - KC_LEFT, KC_P1, KC_CAPS, KC_RSFT, KC_Z, KC_X, KC_C, KC_V, KC_M, KC_J, KC_K, KC_L, KC_COMMA, KC_DOT, KC_BSLS, KC_PENT, KC_Q, KC_P2, KC_P3, KC_T, - KC_LGUI, KC_SPACE, KC_RCTRL, KC_LSHIFT, KC_E, KC_F, KC_G, KC_B, KC_N, KC_J, KC_K, KC_L, KC_M, KC_N, KC_SLSH, KC_P, KC_Q, KC_P0, KC_PDOT, KC_KP_ENTER ),*/ + /*[0] = LAYOUT( + KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_NO,TO(1),KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, + KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, TO(2),KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, + KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, + KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_BSPC,KC_4,KC_4,KC_4, KC_4, + KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, + KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, + KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, + KC_8, KC_SPC,KC_8,KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, TO(1) + + ), + [1] = LAYOUT( + KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, TO(0),KC_NO,KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, KC_T, + KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, TO(2),KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, KC_T, + KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, KC_T, + KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, KC_BSPC,KC_Q,KC_R,KC_S, KC_T, + KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, KC_T, + KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, KC_T, + KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, KC_T, + KC_A, KC_SPC,KC_C,KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, TO(0) + ), + [2] = LAYOUT( + KC_LCTRL, KC_LALT, KC_C, KC_RALT, KC_E, KC_F, KC_G, KC_G, KC_H, KC_J, TO(0), TO(1), KC_M, KC_N, KC_QUOT, KC_DOWN, KC_UP, KC_R, KC_S, KC_ENTER, + KC_PPLS, KC_B, KC_C, KC_D, KC_A, KC_S, KC_D, KC_F, KC_J, KC_J, KC_K, KC_NO, KC_K, KC_L, KC_SCOLON, KC_P4, KC_DEL, KC_P5, KC_P6, KC_RIGHT, + KC_PMNS, KC_1, KC_C, KC_D, KC_1, KC_2, KC_3, KC_4, KC_7, KC_J, KC_K, KC_L, KC_8, KC_9, KC_0, KC_NLCK, KC_PGUP,KC_PSLS, KC_PAST, KC_T, + KC_A, KC_ESC, TO(0),KC_D, KC_GRV, KC_F, KC_G, KC_5, KC_6, KC_J, KC_K, KC_L, KC_EQL, KC_N, KC_MINUS, KC_BSPC, KC_INS, KC_HOME, KC_S, KC_T, + KC_PPLS, KC_NO, KC_TAB, KC_D, KC_Q, KC_W, KC_E, KC_R, KC_U, KC_J, KC_K, KC_L, KC_I, KC_O, KC_P, KC_P7, KC_PGDN,KC_P8, KC_P9, KC_T, + KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_T, KC_Y, KC_J, KC_K, KC_L, KC_RBRC, KC_N, KC_LBRC, KC_P, KC_END, KC_R, KC_S, KC_T, + KC_LEFT, KC_P1, KC_CAPS, KC_RSFT, KC_Z, KC_X, KC_C, KC_V, KC_M, KC_J, KC_K, KC_L, KC_COMMA, KC_DOT, KC_BSLS, KC_PENT, KC_Q, KC_P2, KC_P3, KC_T, + KC_LGUI, KC_SPACE, KC_RCTRL, KC_LSHIFT, KC_E, KC_F, KC_G, KC_B, KC_N, KC_J, KC_K, KC_L, KC_M, KC_N, KC_SLSH, KC_P, KC_Q, KC_P0, KC_PDOT, KC_KP_ENTER + ),*/ }; const uint16_t PROGMEM fn_actions[] = { @@ -166,7 +165,7 @@ void matrix_scan_user(void) { } -bool left_shift_down = false; +bool left_shift_down = false; bool right_shift_down = false; bool process_record_user(uint16_t keycode, keyrecord_t *record) { @@ -196,11 +195,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { return true; } break; - - + + case DVP_ESC: if (left_shift_down || right_shift_down) - { + { if(record->event.pressed) SEND_STRING("~"); return false; @@ -214,7 +213,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { break; case DVP_AMPR: - if (left_shift_down || right_shift_down) + if (left_shift_down || right_shift_down) { if(record->event.pressed) { @@ -228,10 +227,10 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { SEND_STRING("&"); return false; } - break; - + break; + case DVP_LBRACKET: - if (left_shift_down || right_shift_down) + if (left_shift_down || right_shift_down) { if(record->event.pressed) { @@ -256,13 +255,13 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { SEND_STRING("["); return false; } - break; - + break; + case DVP_LCBR: - if (left_shift_down || right_shift_down) + if (left_shift_down || right_shift_down) { if(record->event.pressed) - { + { if(left_shift_down) unregister_code(KC_LSHIFT); if(right_shift_down) @@ -270,7 +269,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { register_code(KC_5); unregister_code(KC_5); - + if(left_shift_down) register_code(KC_LSHIFT); if(right_shift_down) @@ -284,10 +283,10 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { SEND_STRING("{"); return false; } - break; - + break; + case DVP_RCBR: - if (left_shift_down || right_shift_down) + if (left_shift_down || right_shift_down) { if(record->event.pressed) { @@ -298,7 +297,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { register_code(KC_3); unregister_code(KC_3); - + if(left_shift_down) register_code(KC_LSHIFT); if(right_shift_down) @@ -312,11 +311,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { SEND_STRING("}"); return false; } - break; + break; case DVP_LPRN: - if (left_shift_down || right_shift_down) + if (left_shift_down || right_shift_down) { if(record->event.pressed) { @@ -327,7 +326,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { register_code(KC_1); unregister_code(KC_1); - + if(left_shift_down) register_code(KC_LSHIFT); if(right_shift_down) @@ -341,10 +340,10 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { SEND_STRING("("); return false; } - break; -// + break; +// case DVP_AT: - if (left_shift_down || right_shift_down) + if (left_shift_down || right_shift_down) { if(record->event.pressed) { @@ -357,7 +356,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { register_code(KC_6); unregister_code(KC_6); unregister_code(KC_LSHIFT); - + if(left_shift_down) register_code(KC_LSHIFT); if(right_shift_down) @@ -371,11 +370,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { SEND_STRING("@"); return false; } - break; + break; + - case DVP_EQUAL: - if (left_shift_down || right_shift_down) + if (left_shift_down || right_shift_down) { if(record->event.pressed) { @@ -386,7 +385,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { register_code(KC_9); unregister_code(KC_9); - + if(left_shift_down) register_code(KC_LSHIFT); if(right_shift_down) @@ -400,10 +399,10 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { SEND_STRING("="); return false; } - break; - + break; + case DVP_ASTERISK: - if (left_shift_down || right_shift_down) + if (left_shift_down || right_shift_down) { if(record->event.pressed) { @@ -414,7 +413,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { register_code(KC_0); unregister_code(KC_0); - + if(left_shift_down) register_code(KC_LSHIFT); if(right_shift_down) @@ -428,10 +427,10 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { SEND_STRING("*"); return false; } - break; - + break; + case DVP_RPRN: - if (left_shift_down || right_shift_down) + if (left_shift_down || right_shift_down) { if(record->event.pressed) { @@ -442,7 +441,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { register_code(KC_2); unregister_code(KC_2); - + if(left_shift_down) register_code(KC_LSHIFT); if(right_shift_down) @@ -456,10 +455,10 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { SEND_STRING(")"); return false; } - break; + break; case DVP_PLUS: - if (left_shift_down || right_shift_down) + if (left_shift_down || right_shift_down) { if(record->event.pressed) { @@ -470,7 +469,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { register_code(KC_4); unregister_code(KC_4); - + if(left_shift_down) register_code(KC_LSHIFT); if(right_shift_down) @@ -483,10 +482,10 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { SEND_STRING("+"); } return false; - break; - + break; + case DVP_RBRACKET: - if (left_shift_down || right_shift_down) + if (left_shift_down || right_shift_down) { if(record->event.pressed) { @@ -497,7 +496,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { register_code(KC_6); unregister_code(KC_6); - + if(left_shift_down) register_code(KC_LSHIFT); if(right_shift_down) @@ -510,10 +509,10 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { SEND_STRING("]"); } return false; - break; - + break; + case DVP_EXLM: - if (left_shift_down || right_shift_down) + if (left_shift_down || right_shift_down) { if(record->event.pressed) { @@ -524,7 +523,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { register_code(KC_8); unregister_code(KC_8); - + if(left_shift_down) register_code(KC_LSHIFT); if(right_shift_down) @@ -537,10 +536,10 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { SEND_STRING("!"); } return false; - break; - + break; + case DVP_HASH: - if (left_shift_down || right_shift_down) + if (left_shift_down || right_shift_down) { if(record->event.pressed) { @@ -551,7 +550,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { register_code(KC_GRAVE); unregister_code(KC_GRAVE); - + if(left_shift_down) register_code(KC_LSHIFT); if(right_shift_down) @@ -564,7 +563,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { SEND_STRING("#"); } return false; - break; + break; case SHFT_DOT: if(record->event.pressed) SEND_STRING(">"); @@ -575,10 +574,10 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { SEND_STRING("<"); break; - } - - - + } + + + return true; } From 5368235f223d0537c7456cd8d36d5430f4b58312 Mon Sep 17 00:00:00 2001 From: takashiski Date: Thu, 4 Oct 2018 00:34:43 +0900 Subject: [PATCH 221/788] Keyboard: Add namecard keyboard (#4044) * create namecard2x4 * create default keymaps * Update README * fixed typo and func remove dont need. * update infomation on readme * update missed point * remove explicit initialize * update default keymap's readme * add my name to copyright * change keymap style to LAYOUT macro and fixed typo LAYOUT macro --- keyboards/namecard2x4/config.h | 223 ++++++++++++++++++ keyboards/namecard2x4/info.json | 0 .../namecard2x4/keymaps/default/config.h | 19 ++ .../namecard2x4/keymaps/default/keymap.c | 60 +++++ .../namecard2x4/keymaps/default/readme.md | 9 + keyboards/namecard2x4/namecard2x4.c | 43 ++++ keyboards/namecard2x4/namecard2x4.h | 33 +++ keyboards/namecard2x4/readme.md | 24 ++ keyboards/namecard2x4/rules.mk | 81 +++++++ 9 files changed, 492 insertions(+) create mode 100644 keyboards/namecard2x4/config.h create mode 100644 keyboards/namecard2x4/info.json create mode 100644 keyboards/namecard2x4/keymaps/default/config.h create mode 100644 keyboards/namecard2x4/keymaps/default/keymap.c create mode 100644 keyboards/namecard2x4/keymaps/default/readme.md create mode 100644 keyboards/namecard2x4/namecard2x4.c create mode 100644 keyboards/namecard2x4/namecard2x4.h create mode 100644 keyboards/namecard2x4/readme.md create mode 100644 keyboards/namecard2x4/rules.mk diff --git a/keyboards/namecard2x4/config.h b/keyboards/namecard2x4/config.h new file mode 100644 index 000000000..d0c26193c --- /dev/null +++ b/keyboards/namecard2x4/config.h @@ -0,0 +1,223 @@ +/* +Copyright 2018 takashiski + +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 . +*/ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0000 +#define DEVICE_VER 0x0001 +#define MANUFACTURER takashiski +#define PRODUCT namecard2x4 +#define DESCRIPTION A custom keyboard + +/* key matrix size */ +#define MATRIX_ROWS 2 +#define MATRIX_COLS 4 + +/* + * 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 { B4,B5 } +#define MATRIX_COL_PINS { E6,D7,C6,D4 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +#define RGB_DI_PIN F4 +#define RGBLED_NUM 4 +#define RGBLIGHT_ANIMATIONS +#define RGBLIGHT_HUE_STEP 10 +#define RGBLIGHT_SAT_STEP 10 +#define RGBLIGHT_VAL_STEP 10 + +//#define BACKLIGHT_PIN F4 +//#define BACKLIGHT_BREATHING +//#define BACKLIGHT_LEVELS 1 + + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* 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 userful 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 + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * 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 + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +//#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ + diff --git a/keyboards/namecard2x4/info.json b/keyboards/namecard2x4/info.json new file mode 100644 index 000000000..e69de29bb diff --git a/keyboards/namecard2x4/keymaps/default/config.h b/keyboards/namecard2x4/keymaps/default/config.h new file mode 100644 index 000000000..dbacdcce5 --- /dev/null +++ b/keyboards/namecard2x4/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 takashiski + * + * 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 . + */ + +#pragma once + +// place overrides here diff --git a/keyboards/namecard2x4/keymaps/default/keymap.c b/keyboards/namecard2x4/keymaps/default/keymap.c new file mode 100644 index 000000000..1a0a727fc --- /dev/null +++ b/keyboards/namecard2x4/keymaps/default/keymap.c @@ -0,0 +1,60 @@ +/* Copyright 2018 takashiski + * + * 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 . + */ +#include QMK_KEYBOARD_H + +enum Layer +{ + DF, + LW, + RS +}; + + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[DF] = LAYOUT( + KC_1,KC_2,KC_3,LT(LW,KC_4), + KC_5,KC_6,KC_7,LT(RS,KC_8) + ), +[LW]= LAYOUT( + + RGB_VAD,RGB_VAI,RGB_HUI,RGB_HUD, + KC_TRNS,RGB_MOD,RGB_RMOD,KC_TRNS + ), +[RS]= LAYOUT( + + KC_MYCM,KC_MAIL,KC_VOLU,KC_MUTE, + KC_WSCH,KC_CALC,KC_VOLD,KC_TRNS + ) + +}; + + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/namecard2x4/keymaps/default/readme.md b/keyboards/namecard2x4/keymaps/default/readme.md new file mode 100644 index 000000000..83601c9cf --- /dev/null +++ b/keyboards/namecard2x4/keymaps/default/readme.md @@ -0,0 +1,9 @@ +# The default keymap for namecard2x4 + +this is test keymap. + +| 1 | 2 | 3 | 4 | +| 5 | 6 | 7 | 8 | + +if hold 4, change to Backlight settings Layer. +if hold 8, change to Windows action Layer(Open my computer, Open calculater and others). diff --git a/keyboards/namecard2x4/namecard2x4.c b/keyboards/namecard2x4/namecard2x4.c new file mode 100644 index 000000000..349923daf --- /dev/null +++ b/keyboards/namecard2x4/namecard2x4.c @@ -0,0 +1,43 @@ +/* Copyright 2018 takashiski + * + * 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 . + */ +#include "namecard2x4.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + + led_set_user(usb_led); +} diff --git a/keyboards/namecard2x4/namecard2x4.h b/keyboards/namecard2x4/namecard2x4.h new file mode 100644 index 000000000..f2e27a010 --- /dev/null +++ b/keyboards/namecard2x4/namecard2x4.h @@ -0,0 +1,33 @@ +/* Copyright 2018 takashiski + * + * 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 . + */ +#ifndef NAMECARD2X4_H +#define NAMECARD2X4_H + +#include "quantum.h" + +// This a shortcut to help you visually see your layout. +// The following is an example using the Planck MIT layout +// The first section contains all of the arguments +// The second converts the arguments into a two-dimensional array +#define LAYOUT( \ + k00, k01, k02, k03, \ + k10, k11, k12, k13 \ +) { \ + { k00, k01, k02, k03 }, \ + { k10, k11, k12, k13 }, \ +} + +#endif diff --git a/keyboards/namecard2x4/readme.md b/keyboards/namecard2x4/readme.md new file mode 100644 index 000000000..ec98bc673 --- /dev/null +++ b/keyboards/namecard2x4/readme.md @@ -0,0 +1,24 @@ +# namecard2x4 + +日本式名刺サイズのキーボードです(55x91mm)。 +Kailh PCB SocketとWS2812/SK6812に対応しています。 + +This keyboard is Japanese namecard size(55x91mm) keyboard. + +namecard2x4 has 8 switch and kailh PCB socket. + +![namecard2x4](https://i.imgur.com/Bi9SV9A.jpg) + +![namecard2x4 with case](https://i.imgur.com/yTv1vSz.jpg) + + + +Keyboard Maintainer: [takashiski](https://github.com/takashiski) + + +Make example for this keyboard (after setting up your build environment): + + make namecard2x4:default + +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). + diff --git a/keyboards/namecard2x4/rules.mk b/keyboards/namecard2x4/rules.mk new file mode 100644 index 000000000..51d2cbcb2 --- /dev/null +++ b/keyboards/namecard2x4/rules.mk @@ -0,0 +1,81 @@ +# MCU name +#MCU = at90usb1286 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = no # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) + +#UNICODEMAP_ENABLE = yes # for emoji user +#RGBLIGHT_ENABLE = yes # uncomment if you want addressable led strips From e58ea882e40eff146b9cebf9e1c99e89f25260ac Mon Sep 17 00:00:00 2001 From: Jumail Mundekkat Date: Thu, 4 Oct 2018 01:36:40 +1000 Subject: [PATCH 222/788] Keyboard: Added split backspace layout for the b.mini (#4051) --- keyboards/bmini/bmini.h | 18 ++++++++++++++++++ keyboards/bmini/info.json | 4 ++++ 2 files changed, 22 insertions(+) diff --git a/keyboards/bmini/bmini.h b/keyboards/bmini/bmini.h index 9a70f9204..7bdf66fd2 100644 --- a/keyboards/bmini/bmini.h +++ b/keyboards/bmini/bmini.h @@ -38,6 +38,24 @@ along with this program. If not, see . { K07, K17, K27, K37, K47, K57, K67, K77, KC_NO, KC_NO, KA7, KB7, KC7, KD7, KE7 } \ } +#define LAYOUT_splitbs( \ + K05, K25, K35, K45, K55, K06, KA6, KA7, K07, KB5, KC5, KD5, KE5, KD1, KE1, KE2, \ + K04, K14, K24, K34, K44, K54, K16, KB6, KB7, K17, KA4, KB4, KC4, KE4, KD4, KD0, \ + K03, K13, K23, K33, K43, K53, K26, KC6, KC7, K27, KA3, KB3, KC3, KD3, K67, \ + K02, K12, K22, K32, K42, K52, K36, KD6, KD7, K37, KA2, KB2, KD2, KE0, \ + K01, K11, K21, K31, K41, K51, K46, KE6, KE7, K47, KA1, KB1, K86, K77, \ + K00, K10, K20, K56, K57, KB0, KC0, K66, K76, K96 \ +){ \ + { K00, K10, K20, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KB0, KC0, KD0, KE0 }, \ + { K01, K11, K21, K31, K41, K51, KC_NO, KC_NO, KC_NO, KC_NO, KA1, KB1, KC_NO, KD1, KE1 }, \ + { K02, K12, K22, K32, K42, K52, KC_NO, KC_NO, KC_NO, KC_NO, KA2, KB2, KC_NO, KD2, KE2 }, \ + { K03, K13, K23, K33, K43, K53, KC_NO, KC_NO, KC_NO, KC_NO, KA3, KB3, KC3, KD3, KC_NO }, \ + { K04, K14, K24, K34, K44, K54, KC_NO, KC_NO, KC_NO, KC_NO, KA4, KB4, KC4, KD4, KE4 }, \ + { K05, KC_NO, K25, K35, K45, K55, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KB5, KC5, KD5, KE5 }, \ + { K06, K16, K26, K36, K46, K56, K66, K76, K86, K96, KA6, KB6, KC6, KD6, KE6 }, \ + { K07, K17, K27, K37, K47, K57, K67, K77, KC_NO, KC_NO, KA7, KB7, KC7, KD7, KE7 } \ +} + #define LAYOUT_kc( \ K05, K25, K35, K45, K55, K06, KA6, KA7, K07, KB5, KC5, KD5, KE5, KD1, KE1, KE2, \ K04, K14, K24, K34, K44, K54, K16, KB6, KB7, K17, KA4, KB4, KC4, KE4, KD0, \ diff --git a/keyboards/bmini/info.json b/keyboards/bmini/info.json index a047a3ef5..ab4d01c02 100644 --- a/keyboards/bmini/info.json +++ b/keyboards/bmini/info.json @@ -8,6 +8,10 @@ "LAYOUT": { "key_count": 84, "layout": [{"label":"K05", "x":0, "y":0}, {"label":"K25", "x":1, "y":0}, {"label":"K35", "x":2, "y":0}, {"label":"K45", "x":3, "y":0}, {"label":"K55", "x":4, "y":0}, {"label":"K06", "x":5, "y":0}, {"label":"KA6", "x":6, "y":0}, {"label":"KA7", "x":7, "y":0}, {"label":"K07", "x":8, "y":0}, {"label":"KB5", "x":9, "y":0}, {"label":"KC5", "x":10, "y":0}, {"label":"KD5", "x":11, "y":0}, {"label":"KE5", "x":12, "y":0}, {"label":"KD1", "x":13, "y":0}, {"label":"KE1", "x":14, "y":0}, {"label":"KE2", "x":15, "y":0}, {"label":"K04", "x":0, "y":1}, {"label":"K14", "x":1, "y":1}, {"label":"K24", "x":2, "y":1}, {"label":"K34", "x":3, "y":1}, {"label":"K44", "x":4, "y":1}, {"label":"K54", "x":5, "y":1}, {"label":"K16", "x":6, "y":1}, {"label":"KB6", "x":7, "y":1}, {"label":"KB7", "x":8, "y":1}, {"label":"K17", "x":9, "y":1}, {"label":"KA4", "x":10, "y":1}, {"label":"KB4", "x":11, "y":1}, {"label":"KC4", "x":12, "y":1}, {"label":"KE4", "x":13, "y":1, "w":2}, {"label":"KD0", "x":15, "y":1}, {"label":"K03", "x":0, "y":2, "w":1.5}, {"label":"K13", "x":1.5, "y":2}, {"label":"K23", "x":2.5, "y":2}, {"label":"K33", "x":3.5, "y":2}, {"label":"K43", "x":4.5, "y":2}, {"label":"K53", "x":5.5, "y":2}, {"label":"K26", "x":6.5, "y":2}, {"label":"KC6", "x":7.5, "y":2}, {"label":"KC7", "x":8.5, "y":2}, {"label":"K27", "x":9.5, "y":2}, {"label":"KA3", "x":10.5, "y":2}, {"label":"KB3", "x":11.5, "y":2}, {"label":"KC3", "x":12.5, "y":2}, {"label":"KD3", "x":13.5, "y":2, "w":1.5}, {"label":"K67", "x":15, "y":2}, {"label":"K02", "x":0, "y":3, "w":1.75}, {"label":"K12", "x":1.75, "y":3}, {"label":"K22", "x":2.75, "y":3}, {"label":"K32", "x":3.75, "y":3}, {"label":"K42", "x":4.75, "y":3}, {"label":"K52", "x":5.75, "y":3}, {"label":"K36", "x":6.75, "y":3}, {"label":"KD6", "x":7.75, "y":3}, {"label":"KD7", "x":8.75, "y":3}, {"label":"K37", "x":9.75, "y":3}, {"label":"KA2", "x":10.75, "y":3}, {"label":"KB2", "x":11.75, "y":3}, {"label":"KD2", "x":12.75, "y":3, "w":2.25}, {"label":"KE0", "x":15, "y":3}, {"label":"K01", "x":0, "y":4, "w":2.25}, {"label":"K11", "x":2.25, "y":4}, {"label":"K21", "x":3.25, "y":4}, {"label":"K31", "x":4.25, "y":4}, {"label":"K41", "x":5.25, "y":4}, {"label":"K51", "x":6.25, "y":4}, {"label":"K46", "x":7.25, "y":4}, {"label":"KE6", "x":8.25, "y":4}, {"label":"KE7", "x":9.25, "y":4}, {"label":"K47", "x":10.25, "y":4}, {"label":"KA1", "x":11.25, "y":4}, {"label":"KB1", "x":12.25, "y":4, "w":1.75}, {"label":"K86", "x":14, "y":4}, {"label":"K77", "x":15, "y":4}, {"label":"K00", "x":0, "y":5, "w":1.25}, {"label":"K10", "x":1.25, "y":5, "w":1.25}, {"label":"K20", "x":2.5, "y":5, "w":1.25}, {"label":"K56", "x":3.75, "y":5, "w":6.25}, {"label":"K57", "x":10, "y":5}, {"label":"KB0", "x":11, "y":5}, {"label":"KC0", "x":12, "y":5}, {"label":"K66", "x":13, "y":5}, {"label":"K76", "x":14, "y":5}, {"label":"K96", "x":15, "y":5}] + }, + "LAYOUT_splitbs": { + "key_count": 85, + "layout": [{"label":"K05", "x":0, "y":0}, {"label":"K25", "x":1, "y":0}, {"label":"K35", "x":2, "y":0}, {"label":"K45", "x":3, "y":0}, {"label":"K55", "x":4, "y":0}, {"label":"K06", "x":5, "y":0}, {"label":"KA6", "x":6, "y":0}, {"label":"KA7", "x":7, "y":0}, {"label":"K07", "x":8, "y":0}, {"label":"KB5", "x":9, "y":0}, {"label":"KC5", "x":10, "y":0}, {"label":"KD5", "x":11, "y":0}, {"label":"KE5", "x":12, "y":0}, {"label":"KD1", "x":13, "y":0}, {"label":"KE1", "x":14, "y":0}, {"label":"KE2", "x":15, "y":0}, {"label":"K04", "x":0, "y":1}, {"label":"K14", "x":1, "y":1}, {"label":"K24", "x":2, "y":1}, {"label":"K34", "x":3, "y":1}, {"label":"K44", "x":4, "y":1}, {"label":"K54", "x":5, "y":1}, {"label":"K16", "x":6, "y":1}, {"label":"KB6", "x":7, "y":1}, {"label":"KB7", "x":8, "y":1}, {"label":"K17", "x":9, "y":1}, {"label":"KA4", "x":10, "y":1}, {"label":"KB4", "x":11, "y":1}, {"label":"KC4", "x":12, "y":1}, {"label":"KE4", "x":13, "y":1}, {"label":"KD4", "x":14, "y":1}, {"label":"KD0", "x":15, "y":1}, {"label":"K03", "x":0, "y":2, "w":1.5}, {"label":"K13", "x":1.5, "y":2}, {"label":"K23", "x":2.5, "y":2}, {"label":"K33", "x":3.5, "y":2}, {"label":"K43", "x":4.5, "y":2}, {"label":"K53", "x":5.5, "y":2}, {"label":"K26", "x":6.5, "y":2}, {"label":"KC6", "x":7.5, "y":2}, {"label":"KC7", "x":8.5, "y":2}, {"label":"K27", "x":9.5, "y":2}, {"label":"KA3", "x":10.5, "y":2}, {"label":"KB3", "x":11.5, "y":2}, {"label":"KC3", "x":12.5, "y":2}, {"label":"KD3", "x":13.5, "y":2, "w":1.5}, {"label":"K67", "x":15, "y":2}, {"label":"K02", "x":0, "y":3, "w":1.75}, {"label":"K12", "x":1.75, "y":3}, {"label":"K22", "x":2.75, "y":3}, {"label":"K32", "x":3.75, "y":3}, {"label":"K42", "x":4.75, "y":3}, {"label":"K52", "x":5.75, "y":3}, {"label":"K36", "x":6.75, "y":3}, {"label":"KD6", "x":7.75, "y":3}, {"label":"KD7", "x":8.75, "y":3}, {"label":"K37", "x":9.75, "y":3}, {"label":"KA2", "x":10.75, "y":3}, {"label":"KB2", "x":11.75, "y":3}, {"label":"KD2", "x":12.75, "y":3, "w":2.25}, {"label":"KE0", "x":15, "y":3}, {"label":"K01", "x":0, "y":4, "w":2.25}, {"label":"K11", "x":2.25, "y":4}, {"label":"K21", "x":3.25, "y":4}, {"label":"K31", "x":4.25, "y":4}, {"label":"K41", "x":5.25, "y":4}, {"label":"K51", "x":6.25, "y":4}, {"label":"K46", "x":7.25, "y":4}, {"label":"KE6", "x":8.25, "y":4}, {"label":"KE7", "x":9.25, "y":4}, {"label":"K47", "x":10.25, "y":4}, {"label":"KA1", "x":11.25, "y":4}, {"label":"KB1", "x":12.25, "y":4, "w":1.75}, {"label":"K86", "x":14, "y":4}, {"label":"K77", "x":15, "y":4}, {"label":"K00", "x":0, "y":5, "w":1.25}, {"label":"K10", "x":1.25, "y":5, "w":1.25}, {"label":"K20", "x":2.5, "y":5, "w":1.25}, {"label":"K56", "x":3.75, "y":5, "w":6.25}, {"label":"K57", "x":10, "y":5}, {"label":"KB0", "x":11, "y":5}, {"label":"KC0", "x":12, "y":5}, {"label":"K66", "x":13, "y":5}, {"label":"K76", "x":14, "y":5}, {"label":"K96", "x":15, "y":5}] } } } From f01133d08918b3d1dd7b349309b02ffd37273f5c Mon Sep 17 00:00:00 2001 From: Filip Sund Date: Wed, 3 Oct 2018 19:12:27 +0200 Subject: [PATCH 223/788] Keyboard: Add handwired/pteron config and keymaps (#4060) * Added pteron files made via from kbfirmware.com. * Added readme. * Made some progress on Pteron keymap. * More keymap. * Updated bootloader, added some keymap illustrations. * Moved default keymap to FSund, made default keymap from default preonic keymap. * Fixed typo in default pteron keymap. * Made changes recommended by drashna. --- keyboards/handwired/pteron/config.h | 34 +++++ .../handwired/pteron/keymaps/FSund/keymap.c | 118 ++++++++++++++++++ .../handwired/pteron/keymaps/default/keymap.c | 104 +++++++++++++++ keyboards/handwired/pteron/pteron.c | 1 + keyboards/handwired/pteron/pteron.h | 17 +++ keyboards/handwired/pteron/readme.md | 15 +++ keyboards/handwired/pteron/rules.mk | 58 +++++++++ 7 files changed, 347 insertions(+) create mode 100644 keyboards/handwired/pteron/config.h create mode 100644 keyboards/handwired/pteron/keymaps/FSund/keymap.c create mode 100644 keyboards/handwired/pteron/keymaps/default/keymap.c create mode 100644 keyboards/handwired/pteron/pteron.c create mode 100644 keyboards/handwired/pteron/pteron.h create mode 100644 keyboards/handwired/pteron/readme.md create mode 100644 keyboards/handwired/pteron/rules.mk diff --git a/keyboards/handwired/pteron/config.h b/keyboards/handwired/pteron/config.h new file mode 100644 index 000000000..9650839e3 --- /dev/null +++ b/keyboards/handwired/pteron/config.h @@ -0,0 +1,34 @@ +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER QMK Community +#define PRODUCT Pteron Keyboard +#define DESCRIPTION Pteron Keyboard + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 12 + +/* key matrix pins */ +#define MATRIX_ROW_PINS { D7, E6, B4, B5, B6 } +#define MATRIX_COL_PINS { F4, F6, F5, F7, B1, B3, C6, D4, D0, D1, D2, D3 } +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION ROW2COL + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCING_DELAY 5 // 5 is default + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* prevent stuck modifiers */ +#define PREVENT_STUCK_MODIFIERS diff --git a/keyboards/handwired/pteron/keymaps/FSund/keymap.c b/keyboards/handwired/pteron/keymaps/FSund/keymap.c new file mode 100644 index 000000000..f34beae06 --- /dev/null +++ b/keyboards/handwired/pteron/keymaps/FSund/keymap.c @@ -0,0 +1,118 @@ +#include QMK_KEYBOARD_H + +enum pteron_layers { + _QWERTY, + _LOWER, + _RAISE, + _ADJUST +}; + +#define LOWER MO(_LOWER) +#define RAISE MO(_RAISE) + +// use S() to produce shifted versions of keys +// #define S(kc) LSFT(kc) // defined by default + +// alt gr +#define G(kc) RALT(kc) + +// custom keycodes +// use F_ prefix to avoid problems + +// NB! I use Norwegian keyboard layout on my machines, so the keymap probably +// doesn't make much sense for US/ANSI users + +#define F_FSLH S(KC_7) // forward slash +#define F_BSLH KC_EQL // backward slash +#define F_EQL S(KC_0) // equals sign +#define F_APOS KC_BSLS // ' +#define F_TIMES S(KC_BSLS) // * +#define F_PLUS KC_MINS // + +#define F_QUEST S(KC_MINS) // ? +#define F_HAT S(KC_RBRC) // ^ +#define F_TILD G(KC_RBRC) // ~ +#define F_UML KC_RBRC // ¨ (umlaut) +#define F_SECT S(KC_GRV) // section sign ("law sign") (shifted key below esc) +#define F_GRAVE S(KC_EQL) +#define F_ACUTE G(KC_EQL) + +#define KC_AA KC_LBRC +#define KC_OE KC_SCLN +#define KC_AE KC_QUOT + +// brackets +#define F_SBRL G(KC_8) // square bracket left +#define F_SBRR G(KC_9) // square bracket right +#define F_CBRL G(KC_7) // curly bracket left +#define F_CBRR G(KC_0) // curly bracket right +#define F_RBRL S(KC_8) // round bracket left +#define F_RBRR S(KC_9) // round bracket right +#define F_ABRL KC_NUBS // angle bracket left +#define F_ABRR S(KC_NUBS) // angle bracket right + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* QWERTY + * +-----------------------------------------+ +-----------------------------------------+ + * | Esc | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | Q | W | E | R | T | | Y | U | I | O | P | Å | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | A | S | D | F | G | | H | J | K | L | Ø | Æ | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shft | Z | X | C | V | B | | N | M | , | . | - | Shft | + * +---------------------------+------+------+-------------+ +-------------+------+------+---------------------------+ + * | LOWR | Spc | Alt | Win | | Win | Alt | Spc | RISE | + * +---------------------------+ +---------------------------+ + */ + +[_QWERTY] = LAYOUT( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_AA, + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_OE, KC_AE, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSHIFT, + LOWER, KC_SPC, KC_LALT, KC_LGUI, KC_RGUI, KC_RALT, KC_ENT, RAISE + ), + +/* LOWER + * +-----------------------------------------+ +-----------------------------------------+ + * | | | | | | | | | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | \ | / | [ | ] | = | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | F1 | F2 | F3 | F4 | F5 | | < | > | ( | ) | * | ~ | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | F6 | F7 | F8 | F9 | F10 | | F11 | F12 | { | } | + | | + * +---------------------------+------+------+-------------+ +-------------+------+------+---------------------------+ + * | | | | | | | | | | + * +---------------------------+ +---------------------------+ + */ + +[_LOWER] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, F_BSLH, F_FSLH, F_SBRL, F_SBRR, F_EQL, KC_DEL, + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, F_ABRL, F_ABRR, F_RBRL, F_RBRR, F_TIMES, F_TILD, + _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, F_CBRL, F_CBRR, F_PLUS, _______, + _______, _______, _______, _______, _______, _______, _______, _______ + ), + +[_RAISE] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_AA, + F_SECT, S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), F_QUEST, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, F_APOS, + _______, S(KC_6), G(KC_2), G(KC_3), G(KC_4), G(KC_5), F_HAT, KC_HOME, KC_PGDN, KC_PGUP, KC_END, _______, + _______, _______, _______, _______, _______, _______, _______, _______ + ), + +[_ADJUST] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, F_UML, F_GRAVE, F_ACUTE, _______, RESET, _______, _______, _______, _______, KC_PSCR, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_VOLU, KC_MNXT, _______, + _______, _______, _______, _______, _______, _______, _______, _______ + ) +}; + +uint32_t layer_state_set_user(uint32_t state) { + return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST); +} diff --git a/keyboards/handwired/pteron/keymaps/default/keymap.c b/keyboards/handwired/pteron/keymaps/default/keymap.c new file mode 100644 index 000000000..3079cc7af --- /dev/null +++ b/keyboards/handwired/pteron/keymaps/default/keymap.c @@ -0,0 +1,104 @@ +#include QMK_KEYBOARD_H + +enum pteron_layers { + _QWERTY, + _LOWER, + _RAISE, + _ADJUST +}; + + +#define LOWER MO(_LOWER) +#define RAISE MO(_RAISE) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * +-----------------------------------------+ +-----------------------------------------+ + * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | Q | W | E | R | T | | Y | U | I | O | P | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Esc | A | S | D | F | G | | H | J | K | L | ; | " | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | | N | M | , | . | / |Enter | + * +-------------+------+------+------+------| |------+------+------+------+-------------+ + * |Lower | SPC | Alt | GUI | | Alt | GUI | SPC |Raise | + * +---------------------------+ +---------------------------+ + */ +[_QWERTY] = LAYOUT( \ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL, \ + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, \ + LOWER, KC_SPC, KC_LALT, KC_LGUI, KC_RALT, KC_RGUI, KC_SPC, RAISE \ +), + +/* Lower + * +-----------------------------------------+ +-----------------------------------------+ + * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | | F6 | _ | + | { | } | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | | F12 |ISO ~ |ISO | | | | | + * +-------------+------+------+------+------| |------+------+------+------+-------------+ + * | | | | | | Next | Vol- | Vol+ | Play | + * +---------------------------+ +---------------------------+ + */ +[_LOWER] = LAYOUT( \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),KC_HOME, KC_END, _______, \ + _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Raise + * +-----------------------------------------+ +-----------------------------------------+ + * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | | F12 |ISO # |ISO / | | | | + * +-------------+------+------+------+------| |------+------+------+------+-------------+ + * | | | | | | Next | Vol- | Vol+ | Play | + * +---------------------------+ +---------------------------+ + */ +[_RAISE] = LAYOUT( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, _______, \ + _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Adjust (Lower + Raise) + * +-----------------------------------------+ +-----------------------------------------+ + * | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | Reset| | | | | | | | | | | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | |Aud on|AudOff|AGnorm| |AGswap|Qwerty|Colemk|Dvorak| | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | |Voice-|Voice+|Mus on|MusOff|MidiOn| |MidOff| | | | | | + * +-------------+------+------+------+------| |------+------+------+------+-------------+ + * | | | | | | | | | | + * +---------------------------+ +---------------------------+ + */ +[_ADJUST] = LAYOUT( \ + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ + _______, RESET, DEBUG, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______ \ +) + +}; + +uint32_t layer_state_set_user(uint32_t state) { + return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST); +} diff --git a/keyboards/handwired/pteron/pteron.c b/keyboards/handwired/pteron/pteron.c new file mode 100644 index 000000000..972b45aa2 --- /dev/null +++ b/keyboards/handwired/pteron/pteron.c @@ -0,0 +1 @@ +#include "pteron.h" diff --git a/keyboards/handwired/pteron/pteron.h b/keyboards/handwired/pteron/pteron.h new file mode 100644 index 000000000..f29c2619a --- /dev/null +++ b/keyboards/handwired/pteron/pteron.h @@ -0,0 +1,17 @@ +#pragma once + +#include "quantum.h" + +#define LAYOUT( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, \ + K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, \ + K402, K403, K404, K405, K406, K407, K408, K409 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111 }, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211 }, \ + { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311 }, \ + { KC_NO, KC_NO, K402, K403, K404, K405, K406, K407, K408, K409, KC_NO, KC_NO } \ +} diff --git a/keyboards/handwired/pteron/readme.md b/keyboards/handwired/pteron/readme.md new file mode 100644 index 000000000..a66d41edb --- /dev/null +++ b/keyboards/handwired/pteron/readme.md @@ -0,0 +1,15 @@ +# Pteron + +![Pteron](https://i.imgur.com/9QhPlVD.jpg) + +An ergonomic keyboard heavily inspired by the [Atreus](https://github.com/technomancy/atreus), [Iris](https://github.com/keebio/iris-case) and [Atreis](https://github.com/dekonnection/atreis) keyboards. More info and files for laser cutting plates and case are in the [Pteron repository](https://github.com/FSund/pteron-keyboard). + +Keyboard Maintainer: [Filip Sund](https://github.com/FSund) +Hardware Supported: Pro Micro +Hardware Availability: Handwired, no PCB's available (for now) + +Make example for this keyboard (after setting up your build environment): + + make handwired/pteron:default + +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). \ No newline at end of file diff --git a/keyboards/handwired/pteron/rules.mk b/keyboards/handwired/pteron/rules.mk new file mode 100644 index 000000000..10218020e --- /dev/null +++ b/keyboards/handwired/pteron/rules.mk @@ -0,0 +1,58 @@ +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + +# Bootloader +# This definition is optional, and if your keyboard supports multiple bootloaders of +# different sizes, comment this out, and the correct address will be loaded +# automatically (+60). See bootloader.mk for all options. +BOOTLOADER = caterina + +# Build Options +# comment out to disable the options. +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +RGBLIGHT_ENABLE = no +UNICODE_ENABLE = no +UNICODEMAP_ENABLE = no \ No newline at end of file From d55468c18d666870cfe095d32153e5e503e50649 Mon Sep 17 00:00:00 2001 From: Filip Sund Date: Wed, 3 Oct 2018 21:04:01 +0200 Subject: [PATCH 224/788] Keyboard: Added dactyl-manuform 4x6 and keymap. (#4058) * Added dactyl-manuform 4x6 and keymap. * Did changes recommended by drashna. --- .../4x5/keymaps/default/config.h | 5 +- .../4x5/keymaps/dvorak/config.h | 5 +- keyboards/handwired/dactyl_manuform/4x6/4x6.c | 14 +++ keyboards/handwired/dactyl_manuform/4x6/4x6.h | 36 ++++++++ .../handwired/dactyl_manuform/4x6/config.h | 40 +++++++++ .../4x6/keymaps/default/config.h | 31 +++++++ .../4x6/keymaps/default/keymap.c | 87 +++++++++++++++++++ .../handwired/dactyl_manuform/4x6/rules.mk | 21 +++++ .../dactyl_manuform/dactyl_manuform.h | 10 ++- 9 files changed, 237 insertions(+), 12 deletions(-) create mode 100644 keyboards/handwired/dactyl_manuform/4x6/4x6.c create mode 100644 keyboards/handwired/dactyl_manuform/4x6/4x6.h create mode 100644 keyboards/handwired/dactyl_manuform/4x6/config.h create mode 100644 keyboards/handwired/dactyl_manuform/4x6/keymaps/default/config.h create mode 100644 keyboards/handwired/dactyl_manuform/4x6/keymaps/default/keymap.c create mode 100644 keyboards/handwired/dactyl_manuform/4x6/rules.mk diff --git a/keyboards/handwired/dactyl_manuform/4x5/keymaps/default/config.h b/keyboards/handwired/dactyl_manuform/4x5/keymaps/default/config.h index 216917ed7..682c7a868 100644 --- a/keyboards/handwired/dactyl_manuform/4x5/keymaps/default/config.h +++ b/keyboards/handwired/dactyl_manuform/4x5/keymaps/default/config.h @@ -18,8 +18,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H +#pragma once #include "../../config.h" @@ -33,5 +32,3 @@ along with this program. If not, see . // #define MASTER_LEFT // #define MASTER_RIGHT #define EE_HANDS - -#endif diff --git a/keyboards/handwired/dactyl_manuform/4x5/keymaps/dvorak/config.h b/keyboards/handwired/dactyl_manuform/4x5/keymaps/dvorak/config.h index 216917ed7..682c7a868 100644 --- a/keyboards/handwired/dactyl_manuform/4x5/keymaps/dvorak/config.h +++ b/keyboards/handwired/dactyl_manuform/4x5/keymaps/dvorak/config.h @@ -18,8 +18,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H +#pragma once #include "../../config.h" @@ -33,5 +32,3 @@ along with this program. If not, see . // #define MASTER_LEFT // #define MASTER_RIGHT #define EE_HANDS - -#endif diff --git a/keyboards/handwired/dactyl_manuform/4x6/4x6.c b/keyboards/handwired/dactyl_manuform/4x6/4x6.c new file mode 100644 index 000000000..1d305c854 --- /dev/null +++ b/keyboards/handwired/dactyl_manuform/4x6/4x6.c @@ -0,0 +1,14 @@ +#include "4x6.h" + + +#ifdef SSD1306OLED +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + led_set_user(usb_led); +} +#endif + +void matrix_init_kb(void) { + matrix_init_user(); +}; + diff --git a/keyboards/handwired/dactyl_manuform/4x6/4x6.h b/keyboards/handwired/dactyl_manuform/4x6/4x6.h new file mode 100644 index 000000000..25741be57 --- /dev/null +++ b/keyboards/handwired/dactyl_manuform/4x6/4x6.h @@ -0,0 +1,36 @@ +#pragma once + +#include "dactyl_manuform.h" +#include "quantum.h" + +#ifdef USE_I2C +#include +#ifdef __AVR__ + #include + #include +#endif +#endif + +#define LAYOUT(\ + L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \ + L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \ + L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \ + L32, L33, R32, R33, \ + L34, L35, R30, R31, \ + L44, L45, R40, R41, \ + L42, L43, R42, R43 \ + ) \ + { \ + { L00, L01, L02, L03, L04, L05 }, \ + { L10, L11, L12, L13, L14, L15 }, \ + { L20, L21, L22, L23, L24, L25 }, \ + { KC_NO, KC_NO, L32, L33, L34, L35 }, \ + { KC_NO, KC_NO, L42, L43, L44, L45 }, \ +\ + { R00, R01, R02, R03, R04, R05 }, \ + { R10, R11, R12, R13, R14, R15 }, \ + { R20, R21, R22, R23, R24, R25 }, \ + { R30, R31, R32, R33, KC_NO, KC_NO }, \ + { R40, R41, R42, R43, KC_NO, KC_NO } \ +\ + } diff --git a/keyboards/handwired/dactyl_manuform/4x6/config.h b/keyboards/handwired/dactyl_manuform/4x6/config.h new file mode 100644 index 000000000..d4a192287 --- /dev/null +++ b/keyboards/handwired/dactyl_manuform/4x6/config.h @@ -0,0 +1,40 @@ +/* +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x3060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER tshort +#define DESCRIPTION A split keyboard for the cheap makers + +/* key matrix size */ +// Rows are doubled-up +#define MATRIX_ROWS 10 +#define MATRIX_COLS 6 + +// row-driven +#define MATRIX_ROW_PINS { F7, B1, B3, B2, B6 } +#define MATRIX_COL_PINS { D4, C6, D7, E6, B4, B5 } + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW diff --git a/keyboards/handwired/dactyl_manuform/4x6/keymaps/default/config.h b/keyboards/handwired/dactyl_manuform/4x6/keymaps/default/config.h new file mode 100644 index 000000000..1fc2c617f --- /dev/null +++ b/keyboards/handwired/dactyl_manuform/4x6/keymaps/default/config.h @@ -0,0 +1,31 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#pragma once + +/* Use I2C or Serial, not both */ +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +// #define MASTER_LEFT +// #define MASTER_RIGHT +#define EE_HANDS diff --git a/keyboards/handwired/dactyl_manuform/4x6/keymaps/default/keymap.c b/keyboards/handwired/dactyl_manuform/4x6/keymaps/default/keymap.c new file mode 100644 index 000000000..ad23beef5 --- /dev/null +++ b/keyboards/handwired/dactyl_manuform/4x6/keymaps/default/keymap.c @@ -0,0 +1,87 @@ +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +#define _BASE 0 +#define _RAISE 1 +#define _LOWER 2 + +// Fillers to make layering more clear + +#define ____ KC_TRNS + +#define SFT_ESC SFT_T(KC_ESC) +#define CTL_BSPC CTL_T(KC_BSPC) +#define ALT_SPC ALT_T(KC_SPC) +#define SFT_ENT SFT_T(KC_ENT) + +#define KC_ML KC_MS_LEFT +#define KC_MR KC_MS_RIGHT +#define KC_MU KC_MS_UP +#define KC_MD KC_MS_DOWN +#define KC_MB1 KC_MS_BTN1 +#define KC_MB2 KC_MS_BTN1 + +#define RAISE MO(_RAISE) +#define LOWER MO(_LOWER) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Base (qwerty) + * +-----------------------------------------+ +-----------------------------------------+ + * | ESC | q | w | e | r | t | | y | u | i | o | p | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | TAB | a | s | d | f | g | | h | j | k | l | ; | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | SHFT | z | x | c | v | b | | n | m | , | . | / | | + * +------+------+------+------+-------------+ +-------------+------+------+------+------+ + * | [ | ] | | | | + * +-------------+-------------+ +-------------+-------------+ + * | | | | | | + * |------+------| |------+------| + * | | | | | | + * +-------------+ +-------------+ + * +-------------+ +-------------+ + * | | | | | | + * |------+------| |------+------| + * | | | | | | + * +-------------+ +-------------+ + */ + +[_BASE] = LAYOUT( \ + KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS, \ + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,KC_BSLASH, \ + KC_LBRC,KC_RBRC, KC_PLUS,KC_EQL, \ + RAISE, KC_SPC, KC_ENT, LOWER, \ + KC_TAB, KC_HOME, KC_END, KC_DEL, \ + KC_BSPC,KC_GRV, KC_LGUI,KC_LALT \ +), + +[_LOWER] = LAYOUT( + _______,_______,_______,_______,_______,KC_LBRC, KC_RBRC, KC_P7, KC_P8, KC_P9, RESET, KC_PLUS, \ + _______,KC_HOME,KC_PGUP,KC_PGDN,KC_END ,KC_LPRN, KC_RPRN, KC_P4, KC_P5, KC_P6, KC_MINS,KC_PIPE, \ + _______,_______,_______,_______,_______,_______, _______, KC_P1, KC_P2, KC_P3, KC_EQL, KC_UNDS, \ + _______,KC_PSCR, _______, KC_P0, \ + _______,_______, _______,_______, \ + _______,_______, _______,_______, \ + _______,_______, _______,_______ \ +), + +[_RAISE] = LAYOUT( + _______,RESET, _______,_______,_______,KC_LBRC, KC_RBRC,_______,KC_NLCK,KC_INS, KC_SLCK,KC_MUTE, \ + _______,KC_LEFT,KC_UP ,KC_DOWN,KC_RGHT,KC_LPRN, KC_RPRN,KC_MPRV,KC_MPLY,KC_MNXT,_______,KC_VOLU, \ + _______,_______,_______,_______,_______,_______, _______,_______,_______,_______,_______,KC_VOLD, \ + _______,_______, KC_EQL, _______, \ + _______,_______, _______,_______, \ + _______,_______, _______,_______, \ + _______,_______, _______,_______ \ +) +}; + + +void persistent_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + diff --git a/keyboards/handwired/dactyl_manuform/4x6/rules.mk b/keyboards/handwired/dactyl_manuform/4x6/rules.mk new file mode 100644 index 000000000..14b6e1e4e --- /dev/null +++ b/keyboards/handwired/dactyl_manuform/4x6/rules.mk @@ -0,0 +1,21 @@ + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + diff --git a/keyboards/handwired/dactyl_manuform/dactyl_manuform.h b/keyboards/handwired/dactyl_manuform/dactyl_manuform.h index 8b60097bc..eea0757d5 100644 --- a/keyboards/handwired/dactyl_manuform/dactyl_manuform.h +++ b/keyboards/handwired/dactyl_manuform/dactyl_manuform.h @@ -1,13 +1,15 @@ #pragma once -#ifdef KEYBOARD_handwired_dactyl_manuform_6x6 - #include "6x6.h" +#ifdef KEYBOARD_handwired_dactyl_manuform_4x5 + #include "4x5.h" +#elif KEYBOARD_handwired_dactyl_manuform_4x6 + #include "4x6.h" #elif KEYBOARD_handwired_dactyl_manuform_5x6 #include "5x6.h" -#elif KEYBOARD_handwired_dactyl_manuform_4x5 - #include "4x5.h" #elif KEYBOARD_handwired_dactyl_manuform_5x7 #include "5x7.h" +#elif KEYBOARD_handwired_dactyl_manuform_6x6 + #include "6x6.h" #endif //void promicro_bootloader_jmp(bool program); From 9c4b6d21003290abd92644d882165a95ffee4470 Mon Sep 17 00:00:00 2001 From: Pittyolo Date: Wed, 3 Oct 2018 21:14:36 +0200 Subject: [PATCH 225/788] Keyboard: Adding Split Space support for Mechmini 1 (#4052) * Adding Split Space support * Adding my keymap * update * Made the requested updates * Made the requested update --- keyboards/mechmini/v1/keymaps/pitty/keymap.c | 54 ++++++++++++++++++++ keyboards/mechmini/v1/v1.h | 17 ++++++ 2 files changed, 71 insertions(+) create mode 100644 keyboards/mechmini/v1/keymaps/pitty/keymap.c diff --git a/keyboards/mechmini/v1/keymaps/pitty/keymap.c b/keyboards/mechmini/v1/keymaps/pitty/keymap.c new file mode 100644 index 000000000..7db2dc183 --- /dev/null +++ b/keyboards/mechmini/v1/keymaps/pitty/keymap.c @@ -0,0 +1,54 @@ +/* +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 . +*/ + +#include QMK_KEYBOARD_H + +#define _QWERTY 0 +#define _NMBR 1 +#define _NAV 2 +#define _MOUSE 3 +#define _FUNCT 4 + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_QWERTY] = LAYOUT_split_space( + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, LT(_FUNCT, KC_ENT), + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, + KC_LCTL, KC_LGUI, KC_LALT, LT(_NAV, KC_SPC), KC_BSPC, KC_RALT, TT(_MOUSE), TT(_NMBR) + ), + [_NAV] = LAYOUT_split_space( + _______, _______, KC_UP, _______, KC_LPRN, KC_RPRN, _______, KC_7, KC_8, KC_9, KC_KP_SLASH, KC_DEL, + _______, KC_LEFT, KC_DOWN, KC_RIGHT, KC_LCBR, KC_RCBR, _______, KC_4, KC_5, KC_6, KC_KP_ASTERISK, + _______, _______, _______, _______, KC_LABK, KC_RABK, KC_GRV, KC_1, KC_2, KC_3, KC_KP_MINUS, + _______, _______, _______, _______, _______, _______, KC_KP_DOT, KC_KP_PLUS + ), + [_NMBR] = LAYOUT_split_space( + KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, + _______, KC_4, KC_5, KC_6, _______, _______, _______, _______, _______, _______, _______, + _______, KC_7, KC_8, KC_9, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, TO(_QWERTY), _______, _______, _______ + ), + [_MOUSE] = LAYOUT_split_space( + _______, KC_BTN1, KC_MS_U, KC_BTN2, _______, _______, _______, _______, KC_WH_U, _______, _______, _______, + _______, KC_MS_L, KC_MS_D, KC_MS_R, _______, _______, _______, KC_WH_L, KC_WH_D, KC_WH_R, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, TO(_QWERTY), _______, _______, _______ + ), + [_FUNCT] = LAYOUT_split_space( + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, + _______, KC_INS, KC_HOME, KC_PGUP, _______, _______, _______, _______, _______, _______, _______, + _______, KC_DEL, KC_END, KC_PGDN, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, RGB_TOG, RGB_MOD, _______, _______, RESET + ) +}; diff --git a/keyboards/mechmini/v1/v1.h b/keyboards/mechmini/v1/v1.h index 501bd89c5..1e392b353 100644 --- a/keyboards/mechmini/v1/v1.h +++ b/keyboards/mechmini/v1/v1.h @@ -40,4 +40,21 @@ along with this program. If not, see . { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \ } +#define LAYOUT_split_space( \ + K03, K13, K23, K33, K43, K53, K26, KC6, KC7, K27, KA3, KB3, \ + K02, K12, K22, K32, K42, K52, K36, KD6, KD7, K37, KA2, \ + K01, K11, K21, K31, K41, K51, K46, KE6, KE7, K47, KA1, \ + K00, K10, K20, K56, K57, KB0, KC0, K66 \ +) \ +{ \ + { K00, K10, K20, K56, KC_NO, KC_NO, K57, KC_NO, KB0, KC0, K66, KC_NO, KC_NO, KC_NO, KC_NO }, \ + { K01, K11, K21, K31, K41, K51, K46, KE6, KE7, K47, KA1, KC_NO, KC_NO, KC_NO, KC_NO }, \ + { K02, K12, K22, K32, K42, K52, K36, KD6, KD7, K37, KA2, KC_NO, KC_NO, KC_NO, KC_NO }, \ + { K03, K13, K23, K33, K43, K53, K26, KC6, KC7, K27, KA3, KB3, KC_NO, KC_NO, KC_NO }, \ + { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ + { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ + { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ + { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \ +} + #endif From ac27b62fa17859b61a5b5f6c26b1e3113f219b39 Mon Sep 17 00:00:00 2001 From: takashiski Date: Thu, 4 Oct 2018 04:22:18 +0900 Subject: [PATCH 226/788] Keyboard: add info.json for qmk configurator (#4063) --- keyboards/namecard2x4/info.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/keyboards/namecard2x4/info.json b/keyboards/namecard2x4/info.json index e69de29bb..3d6c33215 100644 --- a/keyboards/namecard2x4/info.json +++ b/keyboards/namecard2x4/info.json @@ -0,0 +1,13 @@ +{ + "keyboard_name": "namecard2x4", + "url": "https://skyhigh-works.hatenablog.com/", + "maintainer": "takashiski", + "bootloader": "atmel-dfu", + "width": 4, + "height": 2, + "layouts": { + "LAYOUT": { + "layout": [{"label":"1", "x":0, "y":0}, {"label":"2", "x":1, "y":0}, {"label":"3", "x":2, "y":0}, {"label":"4", "x":3, "y":0}, {"label":"5", "x":0, "y":1}, {"label":"6", "x":1, "y":1}, {"label":"7", "x":2, "y":1}, {"label":"8", "x":3, "y":1}] + } + } +} From 0d61e612f063b91568bf8098878051c4ea405ab3 Mon Sep 17 00:00:00 2001 From: martinakcsilla Date: Wed, 3 Oct 2018 23:38:02 +0200 Subject: [PATCH 227/788] process_ucis: Add a callback for success (#4067) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There is `qk_ucis_symbol_fallback` for the case where symbol lookup fails, but there wasn't one for the success case. This adds `qk_ucis_success`, called after successfully finishing the UCIS symbol input. Thanks to @drashna for the idea! Signed-off-by: Csilla Nagyné Martinák --- quantum/process_keycode/process_ucis.c | 8 ++++++++ quantum/process_keycode/process_ucis.h | 1 + 2 files changed, 9 insertions(+) diff --git a/quantum/process_keycode/process_ucis.c b/quantum/process_keycode/process_ucis.c index 86c0937f5..5de2e41fc 100644 --- a/quantum/process_keycode/process_ucis.c +++ b/quantum/process_keycode/process_ucis.c @@ -32,6 +32,10 @@ void qk_ucis_start_user(void) { unicode_input_finish(); } +__attribute__((weak)) +void qk_ucis_success(uint8_t symbol_index) { +} + static bool is_uni_seq(char *seq) { uint8_t i; @@ -142,6 +146,10 @@ bool process_ucis (uint16_t keycode, keyrecord_t *record) { } unicode_input_finish(); + if (symbol_found) { + qk_ucis_success(i); + } + qk_ucis_state.in_progress = false; return false; } diff --git a/quantum/process_keycode/process_ucis.h b/quantum/process_keycode/process_ucis.h index 3f736a709..d4aa34cde 100644 --- a/quantum/process_keycode/process_ucis.h +++ b/quantum/process_keycode/process_ucis.h @@ -45,6 +45,7 @@ extern const qk_ucis_symbol_t ucis_symbol_table[]; void qk_ucis_start(void); void qk_ucis_start_user(void); void qk_ucis_symbol_fallback (void); +void qk_ucis_success(uint8_t symbol_index); void register_ucis(const char *hex); bool process_ucis (uint16_t keycode, keyrecord_t *record); From f13ca593618b9f5ed6c175496a0d84633f541a94 Mon Sep 17 00:00:00 2001 From: Enochen Date: Wed, 3 Oct 2018 18:02:24 -0400 Subject: [PATCH 228/788] rn42 compilation error fix (#4050) * rn42 compile fix Fixes a compilation error * simpler rn42 compile fix good idea drashna :) --- keyboards/hhkb/rn42/rn42.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/hhkb/rn42/rn42.c b/keyboards/hhkb/rn42/rn42.c index 859e40149..154da4e10 100644 --- a/keyboards/hhkb/rn42/rn42.c +++ b/keyboards/hhkb/rn42/rn42.c @@ -1,7 +1,7 @@ #include #include "host.h" #include "host_driver.h" -#include "serial.h" +#include "../serial.h" #include "rn42.h" #include "print.h" #include "timer.h" From dad579c8f81bdde08e598f9d99249893d5d779a8 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Wed, 3 Oct 2018 22:33:06 -0700 Subject: [PATCH 229/788] Add mousekey_send to (un)register_code --- tmk_core/common/action.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tmk_core/common/action.c b/tmk_core/common/action.c index 76d02bc9d..8bdcd54e3 100644 --- a/tmk_core/common/action.c +++ b/tmk_core/common/action.c @@ -777,6 +777,7 @@ void register_code(uint8_t code) #ifdef MOUSEKEY_ENABLE else if IS_MOUSEKEY(code) { mousekey_on(code); + mousekey_send(); } #endif } @@ -841,6 +842,7 @@ void unregister_code(uint8_t code) #ifdef MOUSEKEY_ENABLE else if IS_MOUSEKEY(code) { mousekey_off(code); + mousekey_send(); } #endif } From 26adf3706a7822e05977c0eadb6963c0db2e1c3b Mon Sep 17 00:00:00 2001 From: SpacebarRacecar <42380065+SpacebarRacecar@users.noreply.github.com> Date: Fri, 5 Oct 2018 00:00:33 +0200 Subject: [PATCH 230/788] Keymap: Added personal userspace and keymaps. (#4073) * added personal userspace, niu mini, planck and fc660c keymaps * removed unnecessary include and some other minor corrections --- .../fc660c/keymaps/spacebarracecar/README.md | 4 + .../fc660c/keymaps/spacebarracecar/config.h | 9 + .../fc660c/keymaps/spacebarracecar/keymap.c | 38 +++ .../fc660c/keymaps/spacebarracecar/rules.mk | 6 + .../niu_mini/keymaps/spacebarracecar/config.h | 0 .../niu_mini/keymaps/spacebarracecar/keymap.c | 126 ++++++++ .../keymaps/spacebarracecar/readme.md | 3 + .../niu_mini/keymaps/spacebarracecar/rules.mk | 22 ++ .../planck/keymaps/spacebarracecar/config.h | 3 + .../planck/keymaps/spacebarracecar/keymap.c | 148 +++++++++ .../planck/keymaps/spacebarracecar/readme.md | 4 + .../planck/keymaps/spacebarracecar/rules.mk | 23 ++ users/spacebarracecar/config.h | 0 users/spacebarracecar/rules.mk | 5 + users/spacebarracecar/spacebarracecar.c | 305 ++++++++++++++++++ users/spacebarracecar/spacebarracecar.h | 242 ++++++++++++++ 16 files changed, 938 insertions(+) create mode 100644 keyboards/fc660c/keymaps/spacebarracecar/README.md create mode 100644 keyboards/fc660c/keymaps/spacebarracecar/config.h create mode 100644 keyboards/fc660c/keymaps/spacebarracecar/keymap.c create mode 100644 keyboards/fc660c/keymaps/spacebarracecar/rules.mk create mode 100644 keyboards/niu_mini/keymaps/spacebarracecar/config.h create mode 100644 keyboards/niu_mini/keymaps/spacebarracecar/keymap.c create mode 100644 keyboards/niu_mini/keymaps/spacebarracecar/readme.md create mode 100644 keyboards/niu_mini/keymaps/spacebarracecar/rules.mk create mode 100644 keyboards/planck/keymaps/spacebarracecar/config.h create mode 100644 keyboards/planck/keymaps/spacebarracecar/keymap.c create mode 100644 keyboards/planck/keymaps/spacebarracecar/readme.md create mode 100644 keyboards/planck/keymaps/spacebarracecar/rules.mk create mode 100644 users/spacebarracecar/config.h create mode 100644 users/spacebarracecar/rules.mk create mode 100644 users/spacebarracecar/spacebarracecar.c create mode 100644 users/spacebarracecar/spacebarracecar.h diff --git a/keyboards/fc660c/keymaps/spacebarracecar/README.md b/keyboards/fc660c/keymaps/spacebarracecar/README.md new file mode 100644 index 000000000..7d87ef8cf --- /dev/null +++ b/keyboards/fc660c/keymaps/spacebarracecar/README.md @@ -0,0 +1,4 @@ +# US International keymap for PCs with German set as input language + +This keymap emulates a US International layout including a deadkey layer on PCs that have German set as the input language. +This allows the use of the keyboard on any PC in Germany without the need of changing the input language. diff --git a/keyboards/fc660c/keymaps/spacebarracecar/config.h b/keyboards/fc660c/keymaps/spacebarracecar/config.h new file mode 100644 index 000000000..9c9b00656 --- /dev/null +++ b/keyboards/fc660c/keymaps/spacebarracecar/config.h @@ -0,0 +1,9 @@ +#pragma once + +// higher value means deeper actuation point, less sensitive +// be careful and only make small adjustments (steps of 1 or 2). +// too high and keys will fail to actuate. too low and keys will actuate spontaneously. +// test all keys before further adjustment. +// this should probably stay in the range +/-5. +#undef ACTUATION_DEPTH_ADJUSTMENT +#define ACTUATION_DEPTH_ADJUSTMENT +2 diff --git a/keyboards/fc660c/keymaps/spacebarracecar/keymap.c b/keyboards/fc660c/keymaps/spacebarracecar/keymap.c new file mode 100644 index 000000000..2cbef10bb --- /dev/null +++ b/keyboards/fc660c/keymaps/spacebarracecar/keymap.c @@ -0,0 +1,38 @@ +#include QMK_KEYBOARD_H +#include "spacebarracecar.h" + +enum layers { + _BASE +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_BASE] = LAYOUT( + KC_ESC, DE_1, DE_2, CU_3, DE_4, DE_5, CU_6, CU_7, CU_8, CU_9, CU_0, DE_MINS,CU_EQL, KC_BSPC, KC_INS, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, CU_Z, KC_U, KC_I, KC_O, KC_P, CU_LBRC,CU_RBRC,CU_BSLS, KC_DEL, + CU_NAV, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, CU_SCLN,CU_QUOT, KC_ENT, + CU_LSFT,CU_Y, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, CU_COMM,CU_DOT, CU_SLSH,CU_RSFT, KC_UP, + KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI,KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT + ), + + [_DEADKEY] = LAYOUT( + CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, _______, CU_ED, + _______,CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_UE, CU_ED, CU_OE, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, + _______,CU_AE, CU_SS, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_DDQ, CU_DDQ , + _______,CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, _______, _______, + _______,_______,_______, CU_DDQ, _______,_______,_______, _______,_______,_______ + ), + + [_NAV] = LAYOUT( + CU_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, CU_GAME, + _______,KC_PGDN,KC_UP, KC_PGUP,KC_HOME,XXXXXXX,XXXXXXX,XXXXXXX,GUIU, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, CU_ESCT, + _______,KC_LEFT,KC_DOWN,KC_RGHT,KC_END, XXXXXXX,XXXXXXX,GUIL, GUID, GUIR, XXXXXXX,XXXXXXX, KC_ENT, + _______,KC_MPRV,KC_MPLY,KC_MNXT,KC_VOLD,KC_VOLU,KC_MUTE,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,_______, KC_PGUP, + RESET, _______,_______, _______, _______,_______,_______, KC_HOME,KC_PGDN,KC_END + ) + +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return process_record_userspace(keycode, record); +} diff --git a/keyboards/fc660c/keymaps/spacebarracecar/rules.mk b/keyboards/fc660c/keymaps/spacebarracecar/rules.mk new file mode 100644 index 000000000..8ee642a4a --- /dev/null +++ b/keyboards/fc660c/keymaps/spacebarracecar/rules.mk @@ -0,0 +1,6 @@ +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work + +# Userspace defines +GERMAN_ENABLE = yes # Enable Custom US Ansi Keycodes for PC with German set as input language diff --git a/keyboards/niu_mini/keymaps/spacebarracecar/config.h b/keyboards/niu_mini/keymaps/spacebarracecar/config.h new file mode 100644 index 000000000..e69de29bb diff --git a/keyboards/niu_mini/keymaps/spacebarracecar/keymap.c b/keyboards/niu_mini/keymaps/spacebarracecar/keymap.c new file mode 100644 index 000000000..b850e5fda --- /dev/null +++ b/keyboards/niu_mini/keymaps/spacebarracecar/keymap.c @@ -0,0 +1,126 @@ +#include QMK_KEYBOARD_H +#include "spacebarracecar.h" + +#define LOWER MO(_LOWER) +#define RAISE MO(_RAISE) + +enum layers { + _BASE, + _LOWER, + _RAISE +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Base Layer +,-----------------------------------------------------------------------------------------------------------------------. +|Tab |Q |W |E |R |T |Z |U |I |O |P |Backspace| +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Esc/Nav |A |S |D |F |G |H |J |K |L |; |' | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Shift |Y |X |C |V |B |N |M |, |. |/ |Shift | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|LCtrl | |Win |Alt |Lower |Space |Enter |Raise |AltGr |Win |Menu |RCtrl | +`-----------------------------------------------------------------------------------------------------------------------' +*/ + +[_BASE] = LAYOUT_ortho_4x12( + KC_TAB, DE_Q, DE_W, DE_E, DE_R, DE_T, CU_Z, DE_U, DE_I, DE_O, DE_P, KC_BSPC, + CU_NAV, DE_A, DE_S, DE_D, DE_F, DE_G, DE_H, DE_J, DE_K, DE_L, CU_SCLN, CU_QUOT, + CU_LSFT, CU_Y, DE_X, DE_C, DE_V, DE_B, DE_N, DE_M, CU_COMM, CU_DOT, CU_SLSH, CU_RSFT, + KC_LCTL, XXXXXXX, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_ENT, RAISE, KC_RALT, KC_RGUI, KC_APP, KC_RCTL +), + +/* Lower +,-----------------------------------------------------------------------------------------------------------------------. +|~ |! |" |# |$ |% |^ |& |* |( |) | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |@ |Strg+X |Strg+C |Strg+V | | |_ |+ |{ |} || | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |? | | | | | | | | | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | | | | | | | | | +`-----------------------------------------------------------------------------------------------------------------------' +*/ +[_LOWER] = LAYOUT_ortho_4x12( + DE_TILD, DE_EXLM, DE_DQOT, DE_HASH, DE_DLR, DE_PERC, CU_CIRC, DE_AMPR, DE_ASTR, DE_LPRN, DE_RPRN, _______, + _______, DE_AT, CTRLX, CTRLC, CTRLV, XXXXXXX, XXXXXXX, DE_UNDS, DE_PLUS, DE_LCBR, DE_RCBR, DE_PIPE, + _______, DE_EURO, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +/* Raise +,-----------------------------------------------------------------------------------------------------------------------. +|` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |F1 |F2 |F3 |F4 |F5 |F6 |- |= |[ |] |\ | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |F7 |F8 |F9 |F10 |F11 |F12 | | | | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | | | | | | | | | +`-----------------------------------------------------------------------------------------------------------------------' +*/ + +[_RAISE] = LAYOUT_ortho_4x12( + CU_GRV, DE_1, DE_2, CU_3, DE_4, DE_5, CU_6, CU_7, CU_8, CU_9, CU_0, _______, + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, DE_MINS, CU_EQL, CU_LBRC, CU_RBRC, CU_BSLS, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +/* Dead-Key +,-----------------------------------------------------------------------------------------------------------------------. +| | | | | | | |Ü | |Ö | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |Ä |ß | | | | | | | | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | | | | | | | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | |" |" | | | | | | +`-----------------------------------------------------------------------------------------------------------------------' +*/ + +[_DEADKEY] = LAYOUT_ortho_4x12( + KC_TAB, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_UE, CU_ED, CU_OE, CU_ED, _______, + _______, CU_AE, CU_SS, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_DDQ, + _______, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, _______, + _______, _______, _______, _______, _______, CU_DDQ, CU_DDQ, _______, _______, _______, _______, _______ +), + +/* Nav +,-----------------------------------------------------------------------------------------------------------------------. +|Caps Lock|PageDown |Up |PageUp |Home | | | |Win+Up | | |Del | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |Left |Down |Right |End | | |Win+Left |Win+Down |Win+Right| |Enter | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |Prev |Pause |Next |LowerVol |RaiseVol |Mute | | | | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | | | | | | |RESET | | +`-----------------------------------------------------------------------------------------------------------------------' +*/ + +[_NAV] = LAYOUT_ortho_4x12( + CU_ESCT, KC_PGDN, KC_UP, KC_PGUP, KC_HOME, XXXXXXX, XXXXXXX, XXXXXXX, GUIU, XXXXXXX, XXXXXXX, KC_DEL, + _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, XXXXXXX, XXXXXXX, GUIL, GUID, GUIR, RGB_M_P, KC_ENT, + _______, KC_MPRV, KC_MPLY, KC_MNXT, KC_VOLD, KC_VOLU, KC_MUTE, RGB_TOG, RGB_MOD, RGB_HUI, CU_RGBV, _______, + RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, CU_GAME +) + +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { +switch (keycode) { + case MO(_LOWER): + if (game){ + if(record->event.pressed) { + register_code(KC_SPC); + } else { + unregister_code(KC_SPC); + } + return false; + } else { + return true; + } + } + return process_record_userspace(keycode, record); +} diff --git a/keyboards/niu_mini/keymaps/spacebarracecar/readme.md b/keyboards/niu_mini/keymaps/spacebarracecar/readme.md new file mode 100644 index 000000000..88d722186 --- /dev/null +++ b/keyboards/niu_mini/keymaps/spacebarracecar/readme.md @@ -0,0 +1,3 @@ +# US-International like Niu Mini layout for PCs with German set as input language + +This layout aims to provide a US-International like layout for PCs that have German set as Input Language. This is useful for users living in germany, because it enables the use of the Niu Mini on any pc without having to switch the input language. It's mostly based on the Planck default layout, but adds essential features for german input, like a dead key layer to access ä, ö, ü. diff --git a/keyboards/niu_mini/keymaps/spacebarracecar/rules.mk b/keyboards/niu_mini/keymaps/spacebarracecar/rules.mk new file mode 100644 index 000000000..b1d7055da --- /dev/null +++ b/keyboards/niu_mini/keymaps/spacebarracecar/rules.mk @@ -0,0 +1,22 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +# Userspace defines +GERMAN_ENABLE = yes # Enable Custom US Ansi Keycodes for PC with German set as input language diff --git a/keyboards/planck/keymaps/spacebarracecar/config.h b/keyboards/planck/keymaps/spacebarracecar/config.h new file mode 100644 index 000000000..9b55fa93a --- /dev/null +++ b/keyboards/planck/keymaps/spacebarracecar/config.h @@ -0,0 +1,3 @@ +#ifdef AUDIO_ENABLE + #define STARTUP_SONG SONG(NO_SOUND) +#endif diff --git a/keyboards/planck/keymaps/spacebarracecar/keymap.c b/keyboards/planck/keymaps/spacebarracecar/keymap.c new file mode 100644 index 000000000..705f78f8e --- /dev/null +++ b/keyboards/planck/keymaps/spacebarracecar/keymap.c @@ -0,0 +1,148 @@ +#include QMK_KEYBOARD_H +#include "spacebarracecar.h" + +#define LOWER MO(_LOWER) +#define RAISE MO(_RAISE) + +enum layers { + _BASE, + _LOWER, + _RAISE, + _MUSICMODE +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Base Layer +,-----------------------------------------------------------------------------------------------------------------------. +|Tab |Q |W |E |R |T |Z |U |I |O |P |Backspace| +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Esc/Nav |A |S |D |F |G |H |J |K |L |; |' | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Shift |Y |X |C |V |B |N |M |, |. |/ |Shift | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|LCtrl | |Win |Alt |Lower |Space |Enter |Raise |AltGr |Win |Menu |RCtrl | +`-----------------------------------------------------------------------------------------------------------------------' +*/ + +[_BASE] = LAYOUT_ortho_4x12( + KC_TAB, DE_Q, DE_W, DE_E, DE_R, DE_T, CU_Z, DE_U, DE_I, DE_O, DE_P, KC_BSPC, + CU_NAV, DE_A, DE_S, DE_D, DE_F, DE_G, DE_H, DE_J, DE_K, DE_L, CU_SCLN, CU_QUOT, + CU_LSFT, CU_Y, DE_X, DE_C, DE_V, DE_B, DE_N, DE_M, CU_COMM, CU_DOT, CU_SLSH, CU_RSFT, + KC_LCTL, XXXXXXX, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_ENT, RAISE, KC_RALT, KC_RGUI, KC_APP, KC_RCTL +), + +/* Lower +,-----------------------------------------------------------------------------------------------------------------------. +|~ |! |" |# |$ |% |^ |& |* |( |) | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |@ |Strg+X |Strg+C |Strg+V | | |_ |+ |{ |} || | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |? | | | | | | | | | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | | | | | | | | | +`-----------------------------------------------------------------------------------------------------------------------' +*/ +[_LOWER] = LAYOUT_ortho_4x12( + DE_TILD, DE_EXLM, DE_DQOT, DE_HASH, DE_DLR, DE_PERC, CU_CIRC, DE_AMPR, DE_ASTR, DE_LPRN, DE_RPRN, _______, + _______, DE_AT, CTRLX, CTRLC, CTRLV, XXXXXXX, XXXXXXX, DE_UNDS, DE_PLUS, DE_LCBR, DE_RCBR, DE_PIPE, + _______, DE_EURO, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +/* Raise +,-----------------------------------------------------------------------------------------------------------------------. +|` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |F1 |F2 |F3 |F4 |F5 |F6 |- |= |[ |] |\ | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |F7 |F8 |F9 |F10 |F11 |F12 | | | | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | | | | | | | | | +`-----------------------------------------------------------------------------------------------------------------------' +*/ + +[_RAISE] = LAYOUT_ortho_4x12( + CU_GRV, DE_1, DE_2, CU_3, DE_4, DE_5, CU_6, CU_7, CU_8, CU_9, CU_0, _______, + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, DE_MINS, CU_EQL, CU_LBRC, CU_RBRC, CU_BSLS, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +[_MUSICMODE] = LAYOUT_ortho_4x12( + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_LCTL, KC_LALT, KC_LGUI, KC_DOWN, KC_UP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, MU_MOD, MU_OFF +), + +/* Dead-Key +,-----------------------------------------------------------------------------------------------------------------------. +| | | | | | | |Ü | |Ö | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |Ä |ß | | | | | | | | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | | | | | | | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | |" |" | | | | | | +`-----------------------------------------------------------------------------------------------------------------------' +*/ + +[_DEADKEY] = LAYOUT_ortho_4x12( + KC_TAB, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_UE, CU_ED, CU_OE, CU_ED, KC_BSPC, + CU_NAV, CU_AE, CU_SS, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_DDQ, + CU_LSFT, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_RSFT, + KC_LCTL, XXXXXXX, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_ENT, RAISE, KC_RALT, KC_RGUI, KC_APP, KC_RCTL +), + +/* Nav +,-----------------------------------------------------------------------------------------------------------------------. +|Caps Lock|PageDown |Up |PageUp |Home | | | |Win+Up | | |Del | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |Left |Down |Right |End | | |Win+Left |Win+Down |Win+Right| |Enter | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |Prev |Pause |Next |LowerVol |RaiseVol |Mute | | | | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | | | | | | |RESET | | +`-----------------------------------------------------------------------------------------------------------------------' +*/ + +[_NAV] = LAYOUT_ortho_4x12( + CU_ESCT, KC_PGDN, KC_UP, KC_PGUP, KC_HOME, XXXXXXX, XXXXXXX, XXXXXXX, GUIU, XXXXXXX, XXXXXXX, KC_DEL, + _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, XXXXXXX, XXXXXXX, GUIL, GUID, GUIR, XXXXXXX, KC_ENT, + _______, KC_MPRV, KC_MPLY, KC_MNXT, KC_VOLD, KC_VOLU, KC_MUTE, MU_ON, XXXXXXX, XXXXXXX, XXXXXXX, _______, + RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, CU_GAME +) + +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { +switch (keycode) { + case MO(_LOWER): + if (game){ + if(record->event.pressed) { + register_code(KC_SPC); + } else { + unregister_code(KC_SPC); + } + return false; + } else { + return true; + } + case MU_ON: + if(record->event.pressed) { + layer_off(_LOWER); + layer_off(_RAISE); + layer_off(_NAV); + layer_off(_DEADKEY); + layer_on(_MUSICMODE); + } + return true; + case MU_OFF: + if(record->event.pressed) { + layer_off(_MUSICMODE); + } + return true; + } + return process_record_userspace(keycode, record); +} diff --git a/keyboards/planck/keymaps/spacebarracecar/readme.md b/keyboards/planck/keymaps/spacebarracecar/readme.md new file mode 100644 index 000000000..daa9c4ad2 --- /dev/null +++ b/keyboards/planck/keymaps/spacebarracecar/readme.md @@ -0,0 +1,4 @@ +# US-International like Planck layout for PCs with German set as input language + +This layout aims to provide a US-International like layout for PCs that have German set as Input Language. This is useful for users living in germany, because it enables the use of the planck on any pc without having to switch the input language. It's mostly based on the Planck default layout, but adds essential features for german input, like a dead key layer to access ä, ö, ü. + diff --git a/keyboards/planck/keymaps/spacebarracecar/rules.mk b/keyboards/planck/keymaps/spacebarracecar/rules.mk new file mode 100644 index 000000000..fbdd1217c --- /dev/null +++ b/keyboards/planck/keymaps/spacebarracecar/rules.mk @@ -0,0 +1,23 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = yes # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +# Userspace defines +GERMAN_ENABLE = yes # Enable Custom US Ansi Keycodes for PC with German set as input language + diff --git a/users/spacebarracecar/config.h b/users/spacebarracecar/config.h new file mode 100644 index 000000000..e69de29bb diff --git a/users/spacebarracecar/rules.mk b/users/spacebarracecar/rules.mk new file mode 100644 index 000000000..319e887ae --- /dev/null +++ b/users/spacebarracecar/rules.mk @@ -0,0 +1,5 @@ +SRC += spacebarracecar.c + +ifeq ($(strip $(GERMAN_ENABLE)), yes) + OPT_DEFS += -DGERMAN_ENABLE +endif diff --git a/users/spacebarracecar/spacebarracecar.c b/users/spacebarracecar/spacebarracecar.c new file mode 100644 index 000000000..404331f8d --- /dev/null +++ b/users/spacebarracecar/spacebarracecar.c @@ -0,0 +1,305 @@ +#include "spacebarracecar.h" + +#ifdef GERMAN_ENABLE +bool lshift = false; +bool rshift = false; +bool lshiftp = false; +bool rshiftp = false; +uint16_t lshift_timer = 0; +uint16_t rshift_timer = 0; + +uint8_t prev_indx = 0; +uint16_t prev_kcs[6] = {0, 0, 0, 0, 0, 0}; + +bool esct = false; + +void add_to_prev(uint16_t kc){ + for (int i=0; i0; i--){ + prev_kcs[i] = prev_kcs[i-1]; + } + prev_kcs[0] = kc; + } else { + prev_kcs[prev_indx] = kc; + prev_indx++; + } +} + +void unreg_prev(void){ + if (prev_indx == 0) + return; + for (int i=0; ievent.pressed) { + game = !game; + } + return false; + case KC_LGUI: + case KC_RGUI: + if (game) + return false; + else + return true; + case CU_NAV: + if(record->event.pressed) { + navesc = true; + navesc_timer = timer_read(); + layer_on(_NAV); + } else { + if (timer_elapsed(navesc_timer) < 200 && navesc) { + register_code(KC_ESC); + unregister_code(KC_ESC); + } + layer_off(_NAV); + } + return false; + + #ifdef RGBLIGHT_ENABLE + case CU_RGBV: + if(record->event.pressed) { + if (rgblight_get_val()+32>255) + rgblight_sethsv(rgblight_get_hue(), rgblight_get_sat(), 31); + else + rgblight_sethsv(rgblight_get_hue(), rgblight_get_sat(), rgblight_get_val()+32); + } + return false; + #endif + + #ifdef GERMAN_ENABLE + case CU_LSFT: + if(record->event.pressed) { + lshiftp = true; + lshift_timer = timer_read(); + unregister_code(KC_LSFT); + register_code(KC_LSFT); + lshift = true; + } else { + if (timer_elapsed(lshift_timer) < 200 && lshiftp && !game) { + register_code(KC_LSFT); + register_code(KC_8); + unregister_code(KC_8); + unregister_code(KC_LSFT); + } + unreg_prev(); + if (!rshift) + unregister_code(KC_LSFT); + lshift = false; + } + return false; + case CU_RSFT: + if(record->event.pressed) { + rshiftp = true; + rshift_timer = timer_read(); + unregister_code(KC_LSFT); + register_code(KC_LSFT); + rshift = true; + } else { + if (timer_elapsed(rshift_timer) < 200 && rshiftp && !game) { + register_code(KC_LSFT); + register_code(KC_9); + unregister_code(KC_9); + unregister_code(KC_LSFT); + } + unreg_prev(); + if (!lshift) + unregister_code(KC_LSFT); + rshift = false; + } + return false; + case CU_ESCT: + if(record->event.pressed) { + esct = !esct; + } + return false; + case CU_AE: + UML(DE_AE) + case CU_OE: + UML(DE_OE) + case CU_UE: + UML(DE_UE) + case CU_SS: + if(record->event.pressed) { + timer_timeout(); + unregister_code(KC_LSFT); + register_code(DE_SS); + unregister_code(DE_SS); + if (lshift || rshift) + register_code(KC_LSFT); + layer_off(_DEADKEY); + } + return false; + case CU_DDQ: + if(record->event.pressed) { + timer_timeout(); + register_code(KC_LSFT); + register_code(KC_2); + unregister_code(KC_2); + if (!lshift && !rshift) + unregister_code(KC_LSFT); + layer_off(_DEADKEY); + } + return false; + case CU_ED: + if(record->event.pressed) { + timer_timeout(); + layer_off(_DEADKEY); + } + return false; + case CU_GRV: + if(record->event.pressed) { + timer_timeout(); + if (lshift || rshift){ + unregister_code(KC_LSFT); + register_code(DE_ALGR); + unregister_code(DE_PLUS); + register_code(DE_PLUS); + unregister_code(DE_PLUS); + unregister_code(DE_ALGR); + register_code(KC_LSFT); + } else { + register_code(KC_LSFT); + unregister_code(DE_ACUT); + register_code(DE_ACUT); + unregister_code(DE_ACUT); + unregister_code(KC_LSFT); + if (!esct) { + register_code(KC_SPC); + unregister_code(KC_SPC); + } + } + } + return false; + case CU_CIRC: + if(record->event.pressed) { + timer_timeout(); + unregister_code(KC_LSFT); + unregister_code(DE_CIRC); + register_code(DE_CIRC); + unregister_code(DE_CIRC); + if (!esct) { + register_code(KC_SPC); + unregister_code(KC_SPC); + } + if (lshift || rshift) + register_code(KC_LSFT); + } + return false; + case CU_QUOT: + if(record->event.pressed){ + timer_timeout(); + register_code(KC_LSFT); + if (lshift || rshift){ + layer_on(_DEADKEY); + } else { + unregister_code(DE_HASH); + register_code(DE_HASH); + add_to_prev(DE_HASH); + } + } else { + unregister_code(DE_HASH); + unreg_prev(); + if (lshift || rshift) + register_code(KC_LSFT); + else + unregister_code(KC_LSFT); + } + return false; + case CU_6: + if(record->event.pressed){ + timer_timeout(); + unregister_code(KC_LSFT); + if (lshift || rshift){ + unregister_code(DE_CIRC); + register_code(DE_CIRC); + unregister_code(DE_CIRC); + if (!esct) { + register_code(KC_SPC); + unregister_code(KC_SPC); + } + register_code(KC_LSFT); + } else { + register_code(DE_6); + } + } else { + unregister_code(DE_6); + } + return false; + case CU_COMM: + SHIFT_NO(DE_COMM, DE_LESS) + case CU_DOT: + SHIFT_NORM(DE_DOT, DE_LESS) + case CU_SLSH: + SHIFT_ALL(DE_7, DE_SS) + case CU_SCLN: + SHIFT_ALL(DE_COMM, DE_DOT) + case CU_3: + SHIFT_NO(DE_3, DE_HASH) + case CU_7: + SHIFT_NORM(DE_7, DE_6) + case CU_8: + SHIFT_NORM(DE_8, DE_PLUS) + case CU_9: + SHIFT_NORM(DE_9, DE_8) + case CU_0: + SHIFT_NORM(DE_0, DE_9) + case CU_EQL: + SHIFT_SWITCH(DE_0, DE_PLUS) + case CU_LBRC: + SHIFT_ALGR(DE_8, DE_7) + case CU_RBRC: + SHIFT_ALGR(DE_9, DE_0) + case CU_BSLS: + SHIFT_ALGR(DE_SS, DE_LESS) + case CU_Z: + CTRL(DE_Z, KC_Z) + case CU_Y: + CTRL(DE_Y, KC_Y) + case KC_LCTL: + case KC_RCTL: + if(!record->event.pressed) { + unregister_code(KC_Z); + unregister_code(KC_Y); + } + return true; + #endif + + default: + if(record->event.pressed) { + timer_timeout(); + + #ifdef GERMAN_ENABLE + if (lshift || rshift) + register_code(KC_LSFT); + else + unregister_code(KC_LSFT); + #endif + + } + return true; + } +} diff --git a/users/spacebarracecar/spacebarracecar.h b/users/spacebarracecar/spacebarracecar.h new file mode 100644 index 000000000..42879d2ef --- /dev/null +++ b/users/spacebarracecar/spacebarracecar.h @@ -0,0 +1,242 @@ +#pragma once + +#include "quantum.h" +#include "keymap_german.h" + +enum userspace_layers { + _DEADKEY = 14, //change if more than 16 layers are required + _NAV +}; + +enum userspace_custom_keycodes { + CU_GAME = SAFE_RANGE, // Toggle game mode on/off + CU_NAV, // NAV | ESC + + #ifdef GERMAN_ENABLE + CU_LSFT, // LSFT | ( + CU_RSFT, // LSFT | ) + CU_COMM, // , | < + CU_DOT, // . | > + CU_SLSH, // / | ? + CU_SCLN, // ; | : + CU_QUOT, // ' | Enable deadkey layer + CU_GRV, // ` | ~ + CU_CIRC, // ^ + CU_3, // 3 | # + CU_6, // 6 | ^ + CU_7, // 7 | & + CU_8, // 8 | * + CU_9, // 9 | ( + CU_0, // 0 | ) + CU_EQL, // = | + + CU_LBRC, // [ | { + CU_RBRC, // ] | } + CU_BSLS, // \ | | + CU_Z, // Z | Y in conjunction with ctrl + CU_Y, // Y | Z in conjunction wiht ctrl + CU_ESCT, // Toggle escape of grv and circ on/off + // Deadkey Layer + CU_AE, // Ä + CU_OE, // Ö + CU_UE, // Ü + CU_SS, // ß + CU_DDQ, // " + CU_ED, // Escape deadkey layer + #endif + + #ifdef RGBLIGHT_ENABLE + CU_RGBV, // Cycle through RGB brightness + #endif + + NEW_SAFE_RANGE // Use for keymap specific keycodes +}; + +#ifdef GERMAN_ENABLE +// these save the current shift status +extern bool lshift; +extern bool rshift; +// stuff for custom space cadet shift +extern bool lshiftp; +extern bool rshiftp; +extern uint16_t lshift_timer; +extern uint16_t rshift_timer; + +extern uint8_t prev_indx; +extern uint16_t prev_kcs[6]; + +void add_to_prev(uint16_t kc); +void unreg_prev(void); + +extern bool esct; +#endif + +// stuff for nav esc +extern bool navesc; +extern uint16_t navesc_timer; + +extern bool game; + +void timer_timeout(void); + +bool process_record_userspace(uint16_t keycode, keyrecord_t *record); + +#define CTRLX LCTL(KC_X) +#define CTRLC LCTL(KC_C) +#define CTRLV LCTL(KC_V) + +#define GUIU LGUI(KC_UP) +#define GUID LGUI(KC_DOWN) +#define GUIL LGUI(KC_LEFT) +#define GUIR RGUI(KC_RIGHT) + +// +// Templates for Keys, with custom shifted and non shifted Characters +// + +// Normal shift status +#define SHIFT_NORM(kc1, kc2) \ +if (record->event.pressed) { \ + timer_timeout(); \ + if (lshift || rshift) { \ + register_code(KC_LSFT); \ + unregister_code(kc2); \ + register_code(kc2); \ + add_to_prev(kc2); \ + } else { \ + unregister_code(KC_LSFT); \ + unregister_code(kc1); \ + register_code(kc1); \ + } \ +} else { \ + unregister_code(kc1); \ + unregister_code(kc2); \ +} \ +return false; + +// Inverted shift status +#define SHIFT_SWITCH(kc1, kc2) \ +if (record->event.pressed) { \ + timer_timeout(); \ + if (lshift || rshift) { \ + unregister_code(KC_LSFT); \ + unregister_code(kc2); \ + register_code(kc2); \ + add_to_prev(kc2); \ + } else { \ + register_code(KC_LSFT); \ + unregister_code(kc1); \ + register_code(kc1); \ + add_to_prev(kc1); \ + } \ +} else { \ + unregister_code(kc1); \ + unregister_code(kc2); \ + unreg_prev(); \ + if (lshift || rshift) \ + register_code(KC_LSFT); \ + else \ + unregister_code(KC_LSFT); \ +} \ +return false; + +// All shift +#define SHIFT_ALL(kc1, kc2) \ +if (record->event.pressed) { \ + timer_timeout(); \ + register_code(KC_LSFT); \ + if (lshift || rshift) { \ + unregister_code(kc2); \ + register_code(kc2); \ + add_to_prev(kc2); \ + } else { \ + unregister_code(kc1); \ + register_code(kc1); \ + add_to_prev(kc1); \ + } \ +} else { \ + unregister_code(kc1); \ + unregister_code(kc2); \ + unreg_prev(); \ + if (lshift || rshift) \ + register_code(KC_LSFT); \ + else \ + unregister_code(KC_LSFT); \ +} \ +return false; + +// All no shift +#define SHIFT_NO(kc1, kc2) \ +if (record->event.pressed) { \ + timer_timeout(); \ + unregister_code(KC_LSFT); \ + if (lshift || rshift) { \ + unregister_code(kc2); \ + register_code(kc2); \ + add_to_prev(kc2); \ + } else { \ + unregister_code(kc1); \ + register_code(kc1); \ + } \ +} else { \ + unregister_code(kc1); \ + unregister_code(kc2); \ + unreg_prev(); \ + if (lshift || rshift) \ + register_code(KC_LSFT); \ + else \ + unregister_code(KC_LSFT); \ +} \ +return false; + +// All algr +#define SHIFT_ALGR(kc1, kc2) \ +if (record->event.pressed) { \ + timer_timeout(); \ + unregister_code(KC_LSFT); \ + register_code(DE_ALGR); \ + if (lshift || rshift) { \ + unregister_code(kc2); \ + register_code(kc2); \ + unregister_code(kc2); \ + register_code(KC_LSFT); \ + } else { \ + unregister_code(kc1); \ + register_code(kc1); \ + unregister_code(kc1); \ + } \ + unregister_code(DE_ALGR); \ +} \ +return false; + +// Different keycode for ctrl +#define CTRL(kc1, kc2) \ +if(record->event.pressed) { \ + timer_timeout(); \ + if (lshift || rshift) \ + register_code(KC_LSFT); \ + else \ + unregister_code(KC_LSFT); \ + if (keyboard_report->mods & (MOD_BIT(KC_LCTL) | MOD_BIT(KC_RCTL))){ \ + register_code(kc2); \ + } else { \ + register_code(kc1); \ + } \ +} else { \ + unregister_code(kc1); \ + unregister_code(kc2); \ +} \ +return false; + +// Umlaute for deadkey layer +#define UML(kc) \ +if(record->event.pressed) { \ + timer_timeout(); \ + if (lshift || rshift) \ + register_code(KC_LSFT); \ + else \ + unregister_code(KC_LSFT); \ + register_code(kc); \ + unregister_code(kc); \ + layer_off(_DEADKEY); \ +} \ +return false; From 0c3137d8ff0b84ee6b39ea8b85aeb4f82fcd7a9c Mon Sep 17 00:00:00 2001 From: James Laird-Wah Date: Sat, 15 Sep 2018 22:28:25 +1000 Subject: [PATCH 231/788] rgb_matrix: continue calling rgb_matrix_indicators() when toggled off This allows user code to continue to use the matrix for indication, even when the RGB toggle is off, using rgb_matrix_set_color(). Without this change, it's impossible for user code to use the matrix when the toggle is off, as any changes get overwritten with black on the next task cycle, and the indicator code is not called at all. --- quantum/rgb_matrix.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/quantum/rgb_matrix.c b/quantum/rgb_matrix.c index 1f00e9d99..26ee57f5c 100644 --- a/quantum/rgb_matrix.c +++ b/quantum/rgb_matrix.c @@ -620,7 +620,8 @@ void rgb_matrix_custom(void) { void rgb_matrix_task(void) { static uint8_t toggle_enable_last = 255; if (!rgb_matrix_config.enable) { - rgb_matrix_all_off(); + rgb_matrix_all_off(); + rgb_matrix_indicators(); toggle_enable_last = rgb_matrix_config.enable; return; } From b4f26a46164996f5bce58fbf958145ae64e8ae59 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Thu, 4 Oct 2018 20:34:47 -0700 Subject: [PATCH 232/788] Keyboard: DZ60: add Plate B layouts (#4076) Adds maximized DZ60 Plate B layout macros in ANSI and ISO, featuring 2.25u Left Shift (1.25u/1u split for ISO) and 1.75u Right Shift with Inverted-T arrow keys. Also supports Split Spacebar and Split Backspace. --- keyboards/dz60/dz60.h | 56 +++++++++++++++++++++++++++++++++++++++- keyboards/dz60/info.json | 8 ++++++ 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/keyboards/dz60/dz60.h b/keyboards/dz60/dz60.h index 6d80b2c7c..fac5fa32f 100644 --- a/keyboards/dz60/dz60.h +++ b/keyboards/dz60/dz60.h @@ -70,7 +70,7 @@ * │20 │22 │23 │24 │25 │26 │27 │28 │29 │2a │2b │2c │2d │ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ * │30 │32 │33 │34 │35 │36 │37 │38 │39 │3a │3b │3d │3e │ - * ├─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴──────┬┴───┴┬───┬─┴───┤ + * ├─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬───┬─┴───┤ * │▓▓▓▓▓│41 │43 │46 (7u) │4b │4d │▓▓▓▓▓│ * └─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘ */ @@ -224,4 +224,58 @@ { k40, k41, KC_NO, k43, KC_NO, KC_NO, k46, KC_NO, KC_NO, KC_NO, k4a, k4b, k4c, k4d, k4e } \ } +/* LAYOUT_60_b_ansi (maximized DZ60 Plate B layout for ANSI) + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ + * │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0a │0b │0c │0d │0e │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ + * │10 │12 │13 │14 │15 │16 │17 │18 │19 │1a │1b │1c │1d │1e │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ + * │20 │22 │23 │24 │25 │26 │27 │28 │29 │2a │2b │2c │2d │ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴┬───┬───┤ + * │30 │32 │33 │34 │35 │36 │37 │38 │39 │3a │3c │3d │3e │ + * ├────┬───┴┬──┴─┬─┴───┴──┬┴───┼───┴───┴──┬┴──┬┴──┬───┼───┼───┤ + * │40 │41 │43 │44 │46 │48 │4a │4b │4c │4d │4e │ + * └────┴────┴────┴────────┴────┴──────────┴───┴───┴───┴───┴───┘ +*/ +#define LAYOUT_60_b_ansi( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, \ + k10, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, \ + k20, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, \ + k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3c, k3d, k3e, \ + k40, k41, k43, k44, k46, k48, k4a, k4b, k4c, k4d, k4e \ +) { \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e }, \ + { k10, KC_NO, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e }, \ + { k20, KC_NO, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, KC_NO }, \ + { k30, KC_NO, k32, k33, k34, k35, k36, k37, k38, k39, k3a, KC_NO, k3c, k3d, k3e }, \ + { k40, k41, KC_NO, k43, k44, KC_NO, k46, KC_NO, k48, KC_NO, k4a, k4b, k4c, k4d, k4e } \ +} + +/* LAYOUT_60_b_iso (maximized DZ60 Plate B layout for ISO) + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ + * │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0a │0b │0c │0d │0e │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ + * │10 │12 │13 │14 │15 │16 │17 │18 │19 │1a │1b │1c │1d │ │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐2d │ + * │20 │22 │23 │24 │25 │26 │27 │28 │29 │2a │2b │2c │1e │ │ + * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴┬──┴────┤ + * │30 │31 │32 │33 │34 │35 │36 │37 │38 │39 │3a │3c │3d │3e │ + * ├────┼───┴┬──┴─┬─┴───┴──┬┴───┼───┴───┴──┬┴──┬┴──┬───┼───┼───┤ + * │40 │41 │43 │44 │46 │48 │4a │4b │4c │4d │4e │ + * └────┴────┴────┴────────┴────┴──────────┴───┴───┴───┴───┴───┘ +*/ +#define LAYOUT_60_b_iso( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, \ + k10, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, \ + k20, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k1e, k2d, \ + k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3c, k3d, k3e, \ + k40, k41, k43, k44, k46, k48, k4a, k4b, k4c, k4d, k4e \ +) { \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e }, \ + { k10, KC_NO, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e }, \ + { k20, KC_NO, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, KC_NO }, \ + { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, KC_NO, k3c, k3d, k3e }, \ + { k40, k41, KC_NO, k43, k44, KC_NO, k46, KC_NO, k48, KC_NO, k4a, k4b, k4c, k4d, k4e } \ +} + #endif diff --git a/keyboards/dz60/info.json b/keyboards/dz60/info.json index 4855c3b81..56e3677b7 100644 --- a/keyboards/dz60/info.json +++ b/keyboards/dz60/info.json @@ -36,6 +36,14 @@ "LAYOUT_60_iso_5x1u": { "key_count": 63, "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"|", "x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"label":"~", "x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"/", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Fn", "x":10, "y":4}, {"label":"←", "x":11, "y":4}, {"label":"↓", "x":12, "y":4}, {"label":"↑", "x":13, "y":4}, {"label":"→", "x":14, "y":4}] + }, + "LAYOUT_60_b_ansi": { + "key_count": 66, + "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"1", "x":1, "y":0}, {"label":"2", "x":2, "y":0}, {"label":"3", "x":3, "y":0}, {"label":"4", "x":4, "y":0}, {"label":"5", "x":5, "y":0}, {"label":"6", "x":6, "y":0}, {"label":"7", "x":7, "y":0}, {"label":"8", "x":8, "y":0}, {"label":"9", "x":9, "y":0}, {"label":"0", "x":10, "y":0}, {"label":"-", "x":11, "y":0}, {"label":"=", "x":12, "y":0}, {"x":13, "y":0}, {"label":"Back Space", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"[", "x":11.5, "y":1}, {"label":"]", "x":12.5, "y":1}, {"label":"\\", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":";", "x":10.75, "y":2}, {"label":"'", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":",", "x":9.25, "y":3}, {"label":".", "x":10.25, "y":3}, {"label":"Shift", "x":11.25, "y":3, "w":1.75}, {"label":"Up", "x":13, "y":3}, {"label":"Del", "x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"GUI", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"label":"Space", "x":3.75, "y":4, "w":2.25}, {"label":"Space", "x":6, "y":4, "w":1.25}, {"label":"Space", "x":7.25, "y":4, "w":2.75}, {"label":"Alt", "x":10, "y":4}, {"label":"Fn", "x":11, "y":4}, {"label":"Left", "x":12, "y":4}, {"label":"Down", "x":13, "y":4}, {"label":"Right", "x":14, "y":4}] + }, + "LAYOUT_60_b_iso": { + "key_count": 67, + "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"1", "x":1, "y":0}, {"label":"2", "x":2, "y":0}, {"label":"3", "x":3, "y":0}, {"label":"4", "x":4, "y":0}, {"label":"5", "x":5, "y":0}, {"label":"6", "x":6, "y":0}, {"label":"7", "x":7, "y":0}, {"label":"8", "x":8, "y":0}, {"label":"9", "x":9, "y":0}, {"label":"0", "x":10, "y":0}, {"label":"-", "x":11, "y":0}, {"label":"=", "x":12, "y":0}, {"x":13, "y":0}, {"label":"Back Space", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"[", "x":11.5, "y":1}, {"label":"]", "x":12.5, "y":1}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":";", "x":10.75, "y":2}, {"label":"'", "x":11.75, "y":2}, {"label":"#", "x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"label":"\\", "x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":",", "x":9.25, "y":3}, {"label":".", "x":10.25, "y":3}, {"label":"Shift", "x":11.25, "y":3, "w":1.75}, {"label":"Up", "x":13, "y":3}, {"label":"Del", "x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"GUI", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"label":"Space", "x":3.75, "y":4, "w":2.25}, {"label":"Space", "x":6, "y":4, "w":1.25}, {"label":"Space", "x":7.25, "y":4, "w":2.75}, {"label":"AltGr", "x":10, "y":4}, {"label":"Fn", "x":11, "y":4}, {"label":"Left", "x":12, "y":4}, {"label":"Down", "x":13, "y":4}, {"label":"Right", "x":14, "y":4}] } } } From 13d67200df2337a2b4dbe86574e77f0e1732aef6 Mon Sep 17 00:00:00 2001 From: eucalyn Date: Sat, 6 Oct 2018 00:43:04 +0900 Subject: [PATCH 233/788] Keyboard: set SAFE_RANGE (#4078) --- keyboards/mint60/keymaps/default/keymap.c | 2 +- keyboards/mint60/keymaps/eucalyn/keymap.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/mint60/keymaps/default/keymap.c b/keyboards/mint60/keymaps/default/keymap.c index 42c61ffaa..36895cb47 100644 --- a/keyboards/mint60/keymaps/default/keymap.c +++ b/keyboards/mint60/keymaps/default/keymap.c @@ -31,7 +31,7 @@ extern rgblight_config_t rgblight_config; #define XXXXXXX KC_NO enum custom_keycodes { - RGBRST + RGBRST = SAFE_RANGE }; diff --git a/keyboards/mint60/keymaps/eucalyn/keymap.c b/keyboards/mint60/keymaps/eucalyn/keymap.c index 09b30730a..566d734a5 100644 --- a/keyboards/mint60/keymaps/eucalyn/keymap.c +++ b/keyboards/mint60/keymaps/eucalyn/keymap.c @@ -31,7 +31,7 @@ extern rgblight_config_t rgblight_config; #define XXXXXXX KC_NO enum custom_keycodes { - RGBRST + RGBRST = SAFE_RANGE }; From ac7b2d92bf1254803ec97c075e6d0c833dfd4146 Mon Sep 17 00:00:00 2001 From: yiancar Date: Thu, 4 Oct 2018 22:37:26 +0100 Subject: [PATCH 234/788] ARM SWD guide - Added a detailed (but saddly long) debugging guide. - Modified sidebar and summary to include the links. --- docs/_sidebar.md | 1 + docs/_summary.md | 1 + docs/arm_debugging.md | 87 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 89 insertions(+) create mode 100644 docs/arm_debugging.md diff --git a/docs/_sidebar.md b/docs/_sidebar.md index a35014dd8..973428c9e 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -74,6 +74,7 @@ * For Makers and Modders * [Hand Wiring Guide](hand_wire.md) * [ISP Flashing Guide](isp_flashing_guide.md) + * [ARM Debugging Guide](arm_debugging.md) * For a Deeper Understanding * [How Keyboards Work](how_keyboards_work.md) diff --git a/docs/_summary.md b/docs/_summary.md index a35014dd8..973428c9e 100644 --- a/docs/_summary.md +++ b/docs/_summary.md @@ -74,6 +74,7 @@ * For Makers and Modders * [Hand Wiring Guide](hand_wire.md) * [ISP Flashing Guide](isp_flashing_guide.md) + * [ARM Debugging Guide](arm_debugging.md) * For a Deeper Understanding * [How Keyboards Work](how_keyboards_work.md) diff --git a/docs/arm_debugging.md b/docs/arm_debugging.md new file mode 100644 index 000000000..491dfe8ad --- /dev/null +++ b/docs/arm_debugging.md @@ -0,0 +1,87 @@ +# ARM Debugging usign Eclipse + +This page describes how to setup debugging for ARM MCUs using an SWD adapter and open-source/free tools. In this guide we will install GNU MCU Eclipse IDE for C/C++ Developers and OpenOCD together with all the necessary dependencies. + +This guide is catered towards advance users and assumes you can compile an ARM compatible keyboard on your machine using the MAKE flow. + +## Installing the software + +The main objective here is to get the MCU Eclipse IDE correcly installed on our machine. The necesarry instructions are derived from [this](https://gnu-mcu-eclipse.github.io/install/) install guide. + +### The xPack Manager + +This tool is a software package manager and it is used to help us get the necesarry depencencies. + +XPM runs using Node.js so grab that form [here](https://nodejs.org/en/). After installation, open a terminal and type `npm -v`. A reply with the version number means that the instalation was successful. + +XPM instalation instructions can be found [here](https://www.npmjs.com/package/xpm) and are OS specific. Entering `xpm --version` to your terminal should return the software version. + +### The ARM Toolchain + +Using XPM it is very easy to install the ARM toolchain. Enter the command `xpm install --global @gnu-mcu-eclipse/arm-none-eabi-gcc`. + +### Windows build tools + +If you are using windows you need to install this! + +`xpm install --global @gnu-mcu-eclipse/windows-build-tools` + +### Programer/Debugger Drivers + +Now its the time to install your programer's drivers. This tutorial was made using an ST-Link v2 which you can get from almost anywhere. +If you have an ST-Link the drivers can be found [here](https://www.st.com/en/development-tools/stsw-link009.html) otherwise consult the manufuturer of your tool. + +### OpenOCD + +This dependency allows SWD access from GDB and it is essential for debugging. Run `xpm install --global @gnu-mcu-eclipse/openocd`. + +### Java + +Java is needed by Eclipse so please download it from [here](https://www.oracle.com/technetwork/java/javase/downloads/index.html). + +### GNU MCU Eclipse IDE + +Now its finally time to install the IDE. Use the Release page [here](https://github.com/gnu-mcu-eclipse/org.eclipse.epp.packages/releases/) to get the latest version. + +## Configuring Eclipse + +Open up the Eclipse IDE we just downloaded. To import our QMK directory select File -> Import -> C/C++ -> Existing code as Makefile Project. Select next and use Browse to select your QMK folder. In the tool-chain list select ARM Cross GCC and select Finish. + +Now you can see the QMK folder on the left hand side. Right click it and select Properties. On the left hand side, expand MCU and select ARM Toolchain Paths. Press xPack and OK. Repeat for OpenOCD Path and if you are on windows for Build Tool Path. Select Apply and Close. + +Now its time to install the necessary MCU packages. Go to Packs perspective by selecting Window -> Open Perspective -> Others -> Packs. Now select the yellow refresh symbol next to the Packs tab. This will take a long time as it is requesting the MCU definitions from various places. If some of the links fail you can probably select Ignore. + +When this finishes you must find the MCU which we will be building/debugging for. In this example I will be using the STM32F3 series MCUs. On the left, select STMicroelectonics -> STM32F3 Series. On the middle window we can see the pack. Right click and select Install. Once that is done we can go back to the default perspective, Window -> Open Perspective -> Others -> C/C++. + +We need to let eclipse know the device we intent to build QMK on. Right click on the QMK folder -> Properties -> C/C++ Build -> Settings. Select the Devices tab and under devices select the appropriate variant of your MCU. For my example it is STM32F303CC + +While we are here let's setup the build command as well. Select C/C++ Build and then the Behavior tab. On the build command, replace `all` with your necessary make command. For example for a rev6 Planck with the default keymap this would be `planck/rev6:default`. Select Apply and Close. + +## Building + +If you have setup everything correctly pressing the hammer button should build the firmware for you and a .bin file should appear. + +## Debugging + +### Connecting the Debugger + +ARM MCUs use the Single Wire Debug (SWD) protocol which comprises of the clock (SWCLK) signal and the data (SWDIO) signal. Connecting this two wires and ground should be enough to allow full manipulation of the MCU. Here we assume that the keyboard will be powered though USB. The RESET signal is not necessary as we can manually assert it using the reset button. For a more advance setup, the SWO signal can be used which pipes printf and scanf asynchronously to the host but for our setup we will ignore it. + +NOTE: Make sure the SWCLK and SWDIO pins are not used in the matrix of your keyboard. If they are you can temporarily switch them for some other pins. + +### Configuring the Debugger + +Right click on your QMK folder, select Debug As -> Debug Configuration. Here double click on GDB OpenOCD Debugging. Select the debugger tab and enter the configuration necessary for your MCU. This might take some fiddling and googleing to find out. The default script for the STM32F3 is called stm32f3discovery.cfg. To let OpenOCD know, in the Config options enter `-f board/stm32f3discovery.cfg`. + +NOTE: In my case this configuration script requires editing to disable the reset assertion. The locations of the scripts can be found in the actual executable field usually under the path `openocd/version/.content/scripts/board`. Here I edited `reset_config srst_only` to `reset_config none`. + +Select Apply and Close. + +### Running the Debugger. + +Reset your keyboard. + +Press the bug icon and if all goes well you should soon find yourself in the debug perspective. Here the program counter will pause at the beginning of the main function and way for you to press Play. Most of the features of all debuggers work on ARM MCUs but for exact details google is your friend! + + +Happy debugging! \ No newline at end of file From 27e216fc1a481bb3e65832458bd2b199cb499e0b Mon Sep 17 00:00:00 2001 From: thomasviaud Date: Fri, 5 Oct 2018 21:00:24 +0200 Subject: [PATCH 235/788] Keymap: Add french iso layout for dz60 (thomasviaud) (#4080) --- keyboards/dz60/keymaps/thomasviaud/README.md | 4 ++++ keyboards/dz60/keymaps/thomasviaud/keymap.c | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 keyboards/dz60/keymaps/thomasviaud/README.md create mode 100644 keyboards/dz60/keymaps/thomasviaud/keymap.c diff --git a/keyboards/dz60/keymaps/thomasviaud/README.md b/keyboards/dz60/keymaps/thomasviaud/README.md new file mode 100644 index 000000000..f5bf221a2 --- /dev/null +++ b/keyboards/dz60/keymaps/thomasviaud/README.md @@ -0,0 +1,4 @@ +## French ISO Layout + +Here is a very simple version of a French ISO Layout (handled by OS). +Feel free to take this as base for your own layout. diff --git a/keyboards/dz60/keymaps/thomasviaud/keymap.c b/keyboards/dz60/keymaps/thomasviaud/keymap.c new file mode 100644 index 000000000..02fdb5a4a --- /dev/null +++ b/keyboards/dz60/keymaps/thomasviaud/keymap.c @@ -0,0 +1,18 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + LAYOUT_60_iso( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS , KC_ENT, + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(1), KC_RCTL), + + LAYOUT_60_iso( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, + _______, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, + _______, _______, _______, RESET, _______, _______, _______, _______), +}; \ No newline at end of file From 54b61b508be7f0b0d85ecd7c45bc8b6bd51d2140 Mon Sep 17 00:00:00 2001 From: Johannes Huber Date: Fri, 5 Oct 2018 23:49:30 +0200 Subject: [PATCH 236/788] E6V2 LE HHKB love (#4079) * Keyboard: E6V2 LE HHKB layout support * Keymap: Add johu's E6V2 LE HHKB layout --- keyboards/e6v2/le/info.json | 7 +- keyboards/e6v2/le/keymaps/johu/keymap.c | 98 ++++++++++++++++++++++++ keyboards/e6v2/le/keymaps/johu/readme.md | 40 ++++++++++ keyboards/e6v2/le/le.h | 28 +++++++ keyboards/e6v2/readme.md | 2 +- 5 files changed, 172 insertions(+), 3 deletions(-) create mode 100644 keyboards/e6v2/le/keymaps/johu/keymap.c create mode 100644 keyboards/e6v2/le/keymaps/johu/readme.md diff --git a/keyboards/e6v2/le/info.json b/keyboards/e6v2/le/info.json index 9016f413e..5a44eab18 100644 --- a/keyboards/e6v2/le/info.json +++ b/keyboards/e6v2/le/info.json @@ -8,9 +8,12 @@ "LAYOUT": { "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"x":0, "y":3}, {"x":1, "y":3}, {"label":"Z", "x":2, "y":3}, {"label":"X", "x":3, "y":3}, {"label":"C", "x":4, "y":3}, {"label":"V", "x":5, "y":3}, {"label":"B", "x":6, "y":3}, {"label":"N", "x":7, "y":3}, {"label":"M", "x":8, "y":3}, {"label":"<", "x":9, "y":3}, {"label":">", "x":10, "y":3}, {"label":"?", "x":11, "y":3}, {"x":12, "y":3}, {"x":13, "y":3}, {"x":14, "y":3}, {"x":0, "y":4, "w":1.75}, {"label":"Ctrl", "x":1.75, "y":4, "w":1.25}, {"label":"Win", "x":3, "y":4, "w":1.25}, {"label":"Alt", "x":4.25, "y":4, "w":1.25}, {"x":5.5, "y":4, "w":2.75}, {"x":8.25, "y":4, "w":1.75}, {"x":10, "y":4}, {"label":"Alt", "x":11, "y":4}, {"label":"Win", "x":12, "y":4}, {"label":"Menu", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}] }, - "LAYOUT_60_ansi": { "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}] + }, + "LAYOUT_60_hhkb": { + "key_count": 60, + "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"1", "x":1, "y":0}, {"label":"2", "x":2, "y":0}, {"label":"3", "x":3, "y":0}, {"label":"4", "x":4, "y":0}, {"label":"5", "x":5, "y":0}, {"label":"6", "x":6, "y":0}, {"label":"7", "x":7, "y":0}, {"label":"8", "x":8, "y":0}, {"label":"9", "x":9, "y":0}, {"label":"0", "x":10, "y":0}, {"label":"-", "x":11, "y":0}, {"label":"=", "x":12, "y":0}, {"label":"\\", "x":13, "y":0}, {"label":"`", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"[", "x":11.5, "y":1}, {"label":"]", "x":12.5, "y":1}, {"label":"Backspace", "x":13.5, "y":1, "w":1.5}, {"label":"Control", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":";", "x":10.75, "y":2}, {"label":"'", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":",", "x":9.25, "y":3}, {"label":".", "x":10.25, "y":3}, {"label":"/", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"label":"Fn", "x":14, "y":3}, {"label":"Os", "x":1.5, "y":4}, {"label":"Alt", "x":2.5, "y":4, "w":1.5}, {"x":4, "y":4, "w":7}, {"label":"Alt", "x":11, "y":4, "w":1.5}, {"label":"Os", "x":12.5, "y":4}] } } -} \ No newline at end of file +} diff --git a/keyboards/e6v2/le/keymaps/johu/keymap.c b/keyboards/e6v2/le/keymaps/johu/keymap.c new file mode 100644 index 000000000..691f0e73c --- /dev/null +++ b/keyboards/e6v2/le/keymaps/johu/keymap.c @@ -0,0 +1,98 @@ +#include QMK_KEYBOARD_H + +#define _BL 0 +#define _FL 1 +#define _SL 2 +#define _CL 3 + +// Tap dance defines +#define CTL_ESC CTL_T(KC_ESC) // Tap for Esc, hold for Ctrl +#define HPR_TAB ALL_T(KC_TAB) // Tap for Tab, hold for Hyper (Super+Ctrl+Shift+Alt) +#define SFT_ENT SFT_T(KC_ENT) // Tap for Enter, hold for Shift +#define KC_SPFN LT(_SL, KC_SPC) // Tap for space, hold for function layer (aka SpaceFN) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Layer 0: Base layer (Default layer) + * ,-----------------------------------------------------------------------------------------. + * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` | + * |-----------------------------------------------------------------------------------------+ + * |Tab/Hyper| Q | W | E | R | T | Y | U | I | O | P | [ | ] | Bksp | + * |-----------------------------------------------------------------------------------------+ + * | Ctrl/Esc | A | S | D | F | G | H | J | K | L | ; | ' | Enter | + * |-----------------------------------------------------------------------------------------+ + * | Shift | Z | X | C | V | B | N | M | , | . | / | Shift/Ent | FN | + * |-----------------------------------------------------------------------------------------+ + * |LGUI | LAlt | Space | RAlt |RGUI | + * `--------------------------------------------------------------------' + */ + [_BL] = LAYOUT_60_hhkb( + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, + HPR_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, + CTL_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_ENT, MO(_FL), + KC_LGUI, KC_LALT, KC_SPFN, KC_RALT, KC_RGUI + ), + +/* Layer 1: FN Layer + * ,-----------------------------------------------------------------------------------------. + * | CL | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | Ins | Del | + * |-----------------------------------------------------------------------------------------+ + * | | | | | | | | | Psc | Slck| Paus| Up | | Del | + * |-----------------------------------------------------------------------------------------+ + * | | Vol-| Vol+| Mute| | | * | / | Home| PgUp| Left|Right| | + * |-----------------------------------------------------------------------------------------+ + * | | Prev| Play| Next| | | + | - | End |PgDn| Down| | | + * |-----------------------------------------------------------------------------------------+ + * | | | | Stop | CL | + * `--------------------------------------------------------------------' + */ + [_FL] = LAYOUT_60_hhkb( + TG(_CL), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, + _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, _______, KC_DEL, + _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, _______, + _______, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, _______, _______, + _______, _______, _______, KC_MSTP, MO(_CL) + ), + +/* Layer 2: Space FN Layer +* ,-----------------------------------------------------------------------------------------. +* | CL | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | Ins | Del | +* |-----------------------------------------------------------------------------------------+ +* | | | | | | | | PgUp| | PgDn| | | | Del | +* |-----------------------------------------------------------------------------------------+ +* | | Vol-| Vol+| Mute| | | Left| Down| Up |Right| | | | +* |-----------------------------------------------------------------------------------------+ +* | | Prev| Play| Next| | | Home| End | | | | | | +* |-----------------------------------------------------------------------------------------+ +* | | | | | CL | +* `--------------------------------------------------------------------' +*/ + [_SL] = LAYOUT_60_hhkb( + TG(_CL), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, + _______, _______, _______, _______, _______, _______, _______, KC_PGUP, _______, KC_PGDN, _______, _______, _______, KC_DEL, + _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, _______, + _______, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______, KC_HOME, KC_END, _______, _______, _______, _______, _______, + _______, _______, _______, _______, MO(_CL) + ), + +/* Layer 3: Control Layer + * ,-----------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |-----------------------------------------------------------------------------------------+ + * | | BL- | BL+ | BL | | | | | | | | | | RESET | + * |-----------------------------------------------------------------------------------------+ + * | | RGBT| RGBM| | | | | | | | | | | + * |-----------------------------------------------------------------------------------------+ + * | CAPS | Hue+| Hue-| Sat+| Sat-| Val+| Val-| | | | | | | + * |-----------------------------------------------------------------------------------------+ + * | | | | | | + * `--------------------------------------------------------------------' + */ + [_CL] = LAYOUT_60_hhkb( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, BL_TOGG, BL_STEP, BL_DEC, BL_INC, _______, _______, _______, _______, _______, _______, _______, _______, RESET, + _______, RGB_TOG, RGB_MOD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + KC_CAPS, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______ + ) +}; diff --git a/keyboards/e6v2/le/keymaps/johu/readme.md b/keyboards/e6v2/le/keymaps/johu/readme.md new file mode 100644 index 000000000..605a14a1c --- /dev/null +++ b/keyboards/e6v2/le/keymaps/johu/readme.md @@ -0,0 +1,40 @@ +# johu's E6-V2 Last Edition (LE) HHKB +Make example for this keyboard (after setting up your build environment): +```bash +$ make e6v2/le:johu +``` + +Or to make and flash: +```bash +$ make e6v2/le:johu:dfu +``` + +See the [build environment setup] and the [make instructions] for more +information. Brand new to QMK? Start with our [Complete Newbs Guide]. + +## Layer 0: Base Layer +* HHKB Qwerty layout plus some specials: + * The Space key sends `Space` when tapped, toggles to *Space FN Layer* when held + * [Grave Escape] + * The Ctrl key sends `Esc` when tapped, `Ctrl` when held + * The Tab key sends `Tab` when tapped, [Hyper] (`Super+Ctrl+Alt+Shift`) when held + * The right Shift key sends `Enter` when tapped, `Shift` when held + +## Layer 1: Function Layer +* Default HHKB function layer includig the iconic diamond arrow cluster +* Multimedia controls + +## Layer 2: Space FN Layer +* VIM style arrow cluster +* Multimedia controls + +## Layer 3: Control Layer +* Reset button +* RGB controls +* Caps Lock + +[build environment setup]: https://docs.qmk.fm/#/getting_started_build_tools +[make instructions]: https://docs.qmk.fm/#/getting_started_make_guide +[Complete Newbs Guide]: https://docs.qmk.fm/#/newbs +[Grave Escape]: https://beta.docs.qmk.fm/features/feature_grave_esc +[Hyper]: http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key diff --git a/keyboards/e6v2/le/le.h b/keyboards/e6v2/le/le.h index 380efd2a7..d52560dfb 100644 --- a/keyboards/e6v2/le/le.h +++ b/keyboards/e6v2/le/le.h @@ -33,4 +33,32 @@ { K40, KC_NO, K42, K43, KC_NO, KC_NO, KC_NO, K47, KC_NO, KC_NO, K4A, K4B, KC_NO, K4D, K4E }, \ } +/* LAYOUT_60_hhkb + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ + * │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0a │0b │0c │0e │0d │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ + * │10 │12 │13 │14 │15 │16 │17 │18 │19 │1a │1b │1c │1d │1e │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ + * │20 │22 │23 │24 │25 │26 │27 │28 │29 │2a │2b │2c │2d │ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ + * │30 │32 │33 │34 │35 │36 │37 │38 │39 │3a │3b │3c │3e │ + * ├─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴──────┬┴───┴┬───┬─┴───┤ + * │▓▓▓▓▓│42 │43 │47 (7u) │4b │4d │▓▓▓▓▓│ + * └─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘ +*/ +#define LAYOUT_60_hhkb( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0E, K0D, \ + K10, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, \ + K20, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3E, \ + K42, K43, K47, K4B, K4D \ +)\ +{\ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E }, \ + { K10, KC_NO, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E }, \ + { K20, KC_NO, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, KC_NO }, \ + { K30, KC_NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, KC_NO, K3E }, \ + { KC_NO, KC_NO, K42, K43, KC_NO, KC_NO, KC_NO, K47, KC_NO, KC_NO, KC_NO, K4B, KC_NO, K4D, KC_NO }, \ +} + #endif diff --git a/keyboards/e6v2/readme.md b/keyboards/e6v2/readme.md index 9ebfac4a7..c09d1ccf1 100644 --- a/keyboards/e6v2/readme.md +++ b/keyboards/e6v2/readme.md @@ -17,4 +17,4 @@ The E6V2 has been available with either a bootmapper client or QMK powered PCB. Please use the appropriate version when making your firmware. Flashing one in place of the other, can brick your PCB. Please be certain whether you have a OE or LE PCB. -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. +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). From f1003aaccfdd4210103e796206e6ac40285dab5b Mon Sep 17 00:00:00 2001 From: Takeshi ISHII <2170248+mtei@users.noreply.github.com> Date: Sat, 6 Oct 2018 06:51:34 +0900 Subject: [PATCH 237/788] Keyboard: Helix five_rows keymap reduced size (#4082) * add PERMISSIVE_HOLD in helix:five_rows/config.h * add Eucalyn char layout into helix:five_rows * Helix five_rows keymap: make rgblight modes selectable. No change in build result. * fix keymap.c map comment, add console compile option No change in build result. * Helix five_rows keymap: reduced the size. --- keyboards/helix/config.h | 13 --- .../helix/rev2/keymaps/five_rows/config.h | 23 ++++- .../helix/rev2/keymaps/five_rows/keymap.c | 96 +++++++++++++------ .../helix/rev2/keymaps/five_rows/rules.mk | 15 ++- .../helix/rev2/keymaps/led_test/config.h | 20 ++-- .../helix/rev2/keymaps/led_test/rules.mk | 2 +- 6 files changed, 112 insertions(+), 57 deletions(-) diff --git a/keyboards/helix/config.h b/keyboards/helix/config.h index b79093d87..fbfbd3280 100644 --- a/keyboards/helix/config.h +++ b/keyboards/helix/config.h @@ -48,17 +48,4 @@ along with this program. If not, see . #define DISABLE_LEADER #endif // USE_Link_Time_Optimization -#if defined(LED_ANIMATIONS) || defined(RGBLIGHT_ANIMATIONS) - #undef RGBLIGHT_ANIMATIONS - #define RGBLIGHT_EFFECT_BREATHING - #define RGBLIGHT_EFFECT_RAINBOW_MOOD - #define RGBLIGHT_EFFECT_RAINBOW_SWIRL - #define RGBLIGHT_EFFECT_SNAKE - #define RGBLIGHT_EFFECT_KNIGHT - #define RGBLIGHT_EFFECT_CHRISTMAS - #define RGBLIGHT_EFFECT_STATIC_GRADIENT - #define RGBLIGHT_EFFECT_RGB_TEST - #define RGBLIGHT_EFFECT_ALTERNATING -#endif - #endif /* CONFIG_H */ diff --git a/keyboards/helix/rev2/keymaps/five_rows/config.h b/keyboards/helix/rev2/keymaps/five_rows/config.h index 837219460..538859bc3 100644 --- a/keyboards/helix/rev2/keymaps/five_rows/config.h +++ b/keyboards/helix/rev2/keymaps/five_rows/config.h @@ -21,12 +21,27 @@ along with this program. If not, see . #ifndef CONFIG_USER_H #define CONFIG_USER_H -// if you need more program area, try uncomment follow line -//#include "serial_config_simpleapi.h" - #undef TAPPING_TERM -#define TAPPING_TERM 140 +#define TAPPING_TERM 300 +#define PERMISSIVE_HOLD +/* when TAPPING_TERM >= 500 same effect PERMISSIVE_HOLD. + see tmk_core/common/action_tapping.c */ // place overrides here +// If you need more program area, try select and reduce rgblight modes to use. + +// Selection of RGBLIGHT MODE to use. +#if defined(LED_ANIMATIONS) + #define RGBLIGHT_EFFECT_BREATHING + #define RGBLIGHT_EFFECT_RAINBOW_MOOD + #define RGBLIGHT_EFFECT_RAINBOW_SWIRL + //#define RGBLIGHT_EFFECT_SNAKE + //#define RGBLIGHT_EFFECT_KNIGHT + #define RGBLIGHT_EFFECT_CHRISTMAS + #define RGBLIGHT_EFFECT_STATIC_GRADIENT + //#define RGBLIGHT_EFFECT_RGB_TEST + //#define RGBLIGHT_EFFECT_ALTERNATING +#endif + #endif /* CONFIG_USER_H */ diff --git a/keyboards/helix/rev2/keymaps/five_rows/keymap.c b/keyboards/helix/rev2/keymaps/five_rows/keymap.c index 548caf822..983bbe937 100644 --- a/keyboards/helix/rev2/keymaps/five_rows/keymap.c +++ b/keyboards/helix/rev2/keymaps/five_rows/keymap.c @@ -10,6 +10,9 @@ #ifdef SSD1306OLED #include "ssd1306.h" #endif +#ifdef CONSOLE_ENABLE + #include +#endif extern keymap_config_t keymap_config; @@ -28,6 +31,7 @@ enum layer_number { _QWERTY = 0, _COLEMAK, _DVORAK, + _EUCALYN, _KEYPAD, _AUX, _KAUX, @@ -41,6 +45,7 @@ enum custom_keycodes { QWERTY = SAFE_RANGE, COLEMAK, DVORAK, + EUCALYN, KEYPAD, EISU, KANA, @@ -72,7 +77,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| * | Shift| Z | X | C | V | B | ` | ' | N | M | , | . | / | Shift| * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * |Lower | Lower| Caps | GUI | Alt | Space| BS | Enter| Space| Alt | GUI | Menu |Lower |Lower | + * |Lower | Lower| Caps | Alt | GUI | Space| BS | Enter| Space| GUI | Alt | Menu |Lower |Lower | * `-------------------------------------------------------------------------------------------------' */ [_QWERTY] = LAYOUT( \ @@ -94,7 +99,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| * | Shift| Z | X | C | V | B | ` | ' | K | M | , | . | / | Shift| * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * |Lower | Lower| Caps | GUI | Alt | Space| BS | Enter| Space| Alt | GUI | Menu |Lower |Lower | + * |Lower | Lower| Caps | Alt | GUI | Space| BS | Enter| Space| GUI | Alt | Menu |Lower |Lower | * `-------------------------------------------------------------------------------------------------' */ [_COLEMAK] = LAYOUT( \ @@ -116,7 +121,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| * | Shift| ; | Q | J | K | X | ` | / | B | M | W | V | Z | Shift| * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * |Lower | Lower| Caps | GUI | Alt | Space| BS | Enter| Space| Alt | GUI | Menu |Lower |Lower | + * |Lower | Lower| Caps | Alt | GUI | Space| BS | Enter| Space| GUI | Alt | Menu |Lower |Lower | * `-------------------------------------------------------------------------------------------------' */ [_DVORAK] = LAYOUT( \ @@ -128,6 +133,28 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LT(_RAISE,KC_ENT), KC_SPC, KC_RGUI, KC_RALT, KC_APP,MO(_LOWER),MO(_LOWER) \ ), + /* Eucalyn (http://eucalyn.hatenadiary.jp/entry/about-eucalyn-layout) + * ,-----------------------------------------. ,-----------------------------------------. + * | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | Q | W | , | . | ; | | M | R | D | Y | P | \ | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | A | O | E | I | U | | G | T | K | S | N | Ctrl | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | Shift| Z | X | C | V | F | ` | ' | B | H | J | L | / | Shift| + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * |Lower | Lower| Caps | Alt | GUI | Space| BS | Enter| Space| GUI | Alt | Menu |Lower |Lower | + * `-------------------------------------------------------------------------------------------------' + */ + [_EUCALYN] = LAYOUT( \ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_COMM, KC_DOT, KC_SCLN, KC_M, KC_R, KC_D, KC_Y, KC_P, KC_BSLS, \ + KC_LCTL, KC_A, KC_O, KC_E, KC_I, KC_U, KC_G, KC_T, KC_K, KC_S, KC_N, KC_RCTL, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_F, KC_GRV, KC_QUOT, KC_B, KC_H, KC_J, KC_L, KC_SLSH, KC_RSFT, \ + MO(_LOWER),MO(_LOWER), KC_CAPS, KC_LALT, KC_LGUI, KC_SPC, LT(_RAISE,KC_BSPC), \ + LT(_RAISE,KC_ENT), KC_SPC, KC_RGUI, KC_RALT, KC_APP,MO(_LOWER),MO(_LOWER) \ + ), + /* Keypad * ,-----------------------------------------. ,-----------------------------------------. * | Tab | / | * | Del | F1 | F6 | | F1 | F6 | Del | Tab | / | * | @@ -239,7 +266,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Adjust (Lower + Raise) * ,-----------------------------------------. ,-----------------------------------------. - * | | |Keypad|Dvorak|Colemk|Qwerty| |Qwerty|Colemk|Dvorak|Keypad| | | + * | |Keypad|Dvorak|Colemk|Euclyn|Qwerty| |Qwerty|Euclyn|Colemk|Dvorak|Keypad| | * |------+------+------+------+------+------| |------+------+------+------+------+------| * | | Reset|RGBRST|RGB ON|Aud on| Win | | Win |Aud on|RGB ON|RGBRST| | | * |------+------+------+------+------+------| |------+------+------+------+------+------| @@ -251,7 +278,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-------------------------------------------------------------------------------------------------' */ [_ADJUST] = LAYOUT( \ - XXXXXXX, XXXXXXX, KEYPAD, DVORAK, COLEMAK, QWERTY, QWERTY, COLEMAK, DVORAK, KEYPAD, XXXXXXX, XXXXXXX, \ + XXXXXXX, KEYPAD, DVORAK, COLEMAK, EUCALYN, QWERTY, QWERTY, EUCALYN, COLEMAK, DVORAK, KEYPAD, XXXXXXX, \ XXXXXXX, RESET, RGBRST, RGB_TOG, AU_ON, AG_SWAP, AG_SWAP, AU_ON, RGB_TOG, RGBRST, XXXXXXX, XXXXXXX, \ RGB_HUI, RGB_SAI, RGB_VAI,RGB_SMOD, AU_OFF, AG_NORM, AG_NORM, AU_OFF,RGB_SMOD, RGB_VAI, RGB_SAI, RGB_HUI, \ RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, RGB_VAD, RGB_SAD, RGB_HUD, \ @@ -304,23 +331,25 @@ uint32_t default_layer_state_set_kb(uint32_t state) { current_default_layer = state - 1; // 1<<_DVORAK - 2 == 4 - 2 == _DVORAK (=2) if ( current_default_layer == 3 ) current_default_layer -= 1; - // 1<<_KEYPAD - 5 == 8 - 5 == _KEYPAD (=3) + // 1<<_EUCALYN - 5 == 8 - 5 == _EUCALYN (=3) if ( current_default_layer == 7 ) current_default_layer -= 4; + // 1<<_KEYPAD - 12 == 16 - 12 == _KEYPAD (=4) + if ( current_default_layer == 15 ) current_default_layer -= 11; return state; } void update_base_layer(int base) { if( current_default_layer != base ) { - eeconfig_update_default_layer(1UL<event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_dvorak); + #endif + update_base_layer(_EUCALYN); } return false; break; @@ -358,7 +396,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { #ifdef AUDIO_ENABLE PLAY_SONG(tone_dvorak); #endif - update_base_layer(_KEYPAD); + update_base_layer(_KEYPAD); } return false; break; @@ -468,10 +506,10 @@ static void render_logo(struct CharacterMatrix *matrix) { char buf[30]; if(rgblight_config.enable) { snprintf(buf, sizeof(buf), " LED %2d: %d,%d,%d ", - rgblight_config.mode, - rgblight_config.hue/RGBLIGHT_HUE_STEP, - rgblight_config.sat/RGBLIGHT_SAT_STEP, - rgblight_config.val/RGBLIGHT_VAL_STEP); + rgblight_config.mode, + rgblight_config.hue/RGBLIGHT_HUE_STEP, + rgblight_config.sat/RGBLIGHT_SAT_STEP, + rgblight_config.val/RGBLIGHT_VAL_STEP); matrix_write(matrix, buf); } #endif @@ -481,6 +519,7 @@ static void render_logo(struct CharacterMatrix *matrix) { static const char Qwerty_name[] PROGMEM = " Qwerty"; static const char Colemak_name[] PROGMEM = " Colemak"; static const char Dvorak_name[] PROGMEM = " Dvorak"; +static const char Eucalyn_name[] PROGMEM = " Eucalyn"; static const char Keypad_name[] PROGMEM = " Keypad"; static const char AUX_name[] PROGMEM = ":AUX"; @@ -494,6 +533,7 @@ static const char *layer_names[] = { [_QWERTY] = Qwerty_name, [_COLEMAK] = Colemak_name, [_DVORAK] = Dvorak_name, + [_EUCALYN]= Eucalyn_name, [_KEYPAD] = Keypad_name, [_AUX] = AUX_name, [_KAUX] = KAUX_name, @@ -526,18 +566,18 @@ void render_status(struct CharacterMatrix *matrix) { lstate && name_num < sizeof(layer_names)/sizeof(char *); lstate >>=1, name_num++ ) { if( (lstate & 1) != 0 ) { - if( layer_names[name_num] ) { - matrix_write_P(matrix, layer_names[name_num]); - } + if( layer_names[name_num] ) { + matrix_write_P(matrix, layer_names[name_num]); + } } } // Host Keyboard LED Status char led[40]; snprintf(led, sizeof(led), "\n%s %s %s", - (host_keyboard_leds() & (1<. // If you need more program area, try select and reduce rgblight modes to use. // Selection of RGBLIGHT MODE to use. -#undef RGBLIGHT_EFFECT_BREATHING -#undef RGBLIGHT_EFFECT_RAINBOW_MOOD -#undef RGBLIGHT_EFFECT_RAINBOW_SWIRL -#undef RGBLIGHT_EFFECT_SNAKE -#undef RGBLIGHT_EFFECT_KNIGHT -#undef RGBLIGHT_EFFECT_CHRISTMAS -#undef RGBLIGHT_EFFECT_STATIC_GRADIENT -//#undef RGBLIGHT_EFFECT_RGB_TEST // led_test keymap need only this. -#undef RGBLIGHT_EFFECT_ALTERNATING +#if defined(LED_ANIMATIONS) + //#define RGBLIGHT_EFFECT_BREATHING + //#define RGBLIGHT_EFFECT_RAINBOW_MOOD + //#define RGBLIGHT_EFFECT_RAINBOW_SWIRL + //#define RGBLIGHT_EFFECT_SNAKE + //#define RGBLIGHT_EFFECT_KNIGHT + //#define RGBLIGHT_EFFECT_CHRISTMAS + //#define RGBLIGHT_EFFECT_STATIC_GRADIENT + #define RGBLIGHT_EFFECT_RGB_TEST // led_test keymap need only this. + //#define RGBLIGHT_EFFECT_ALTERNATING +#endif #endif /* CONFIG_USER_H */ diff --git a/keyboards/helix/rev2/keymaps/led_test/rules.mk b/keyboards/helix/rev2/keymaps/led_test/rules.mk index c7ee75c36..f599cd4f3 100644 --- a/keyboards/helix/rev2/keymaps/led_test/rules.mk +++ b/keyboards/helix/rev2/keymaps/led_test/rules.mk @@ -100,7 +100,7 @@ ifeq ($(strip $(IOS_DEVICE_ENABLE)), yes) endif ifeq ($(strip $(LED_ANIMATIONS)), yes) - OPT_DEFS += -DRGBLIGHT_ANIMATIONS + OPT_DEFS += -DLED_ANIMATIONS endif ifeq ($(strip $(OLED_ENABLE)), yes) From 2c1402aa3208d450a7724790b0eb9f2d352a1d9d Mon Sep 17 00:00:00 2001 From: Jereme Corrado Date: Fri, 5 Oct 2018 17:52:46 -0400 Subject: [PATCH 238/788] Keymap: Added Planck keymap: jcorrado (#4083) --- keyboards/planck/keymaps/jcorrado/keymap.c | 115 ++++++++++++++++++++ keyboards/planck/keymaps/jcorrado/readme.md | 9 ++ 2 files changed, 124 insertions(+) create mode 100644 keyboards/planck/keymaps/jcorrado/keymap.c create mode 100644 keyboards/planck/keymaps/jcorrado/readme.md diff --git a/keyboards/planck/keymaps/jcorrado/keymap.c b/keyboards/planck/keymaps/jcorrado/keymap.c new file mode 100644 index 000000000..35ca76d51 --- /dev/null +++ b/keyboards/planck/keymaps/jcorrado/keymap.c @@ -0,0 +1,115 @@ +/* Copyright 2015-2017 Jack Humbert + * Copyright 2018 Jereme Corrado + * + * 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 . + */ + +#include QMK_KEYBOARD_H + +enum { + _QWERTY = 0, + _NUM, + _SYM_L, + _SYM_R +}; + +#define LMOD_0 LT(_SYM_L, KC_TAB) /* Tab, hold: Sym layer */ +#define LMOD_1 LT(_NUM, KC_ESC) /* Esc, hold: Num layer */ +#define LMOD_2 LSFT_T(KC_CAPS) /* Caps Lock, hold: Left Shift */ + +#define RMOD_0 LT(_SYM_R, KC_BSPC) /* Backspace, hold: Sym layer */ +#define RMOD_1 LT(_NUM, KC_QUOT) /* Quote, hold: Nu layer */ +#define RMOD_2 RSFT_T(KC_ENT) /* Enter, hold: Right Shift */ + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | Tab/ | Q | W | E | R | T | Y | U | I | O | P | BacSp/ | + * | Sym | | | | | | | | | | | Sym | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | Esc/ | A | S | D | F | G | H | J | K | L | : | " | + * | Num | | | | | | | | | | ; | '/Num | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | CapLk/ | Z | X | C | V | B | N | M | < | > | ? | Shift/ | + * | Shift | | | | | | | | , | . | / | Enter | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | Toggle | ~ | {pipe} | Alt | Ctrl | Space | Space | Ctrl | Alt | { | } | | + * | Num | ` | \ | | | | | | | [ | ] | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + */ + +[_QWERTY] = LAYOUT_planck_grid( + LMOD_0, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, RMOD_0, + LMOD_1, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, RMOD_1, + LMOD_2, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, RMOD_2, + _______, KC_GRV, KC_BSLS, KC_LALT, KC_LCTL, KC_SPC, KC_SPC, KC_RCTL, KC_RALT, KC_LBRC, KC_RBRC, _______ +), + + +/* + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | = | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | + * | | | | | | | | | | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | | | | | Left | Down | Up | Right | | | + * | | | | | | | | | | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | | | | | Home | PgDown | PgUp | End | | | + * | | | | | | | | | | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | | | | | | | | | | | + * | | | | | | | | | | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + */ + +[_NUM] = LAYOUT_planck_grid( + KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, + _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, + _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + + +/* + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | + | ! | @ | # | $ | % | ^ | & | * | ( | ) | _ | + * | | | | | | | | | | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | F1 | F2 | F3 | F4 | F5 | F6 | | | | | | + * | | | | | | | | | | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | | | | | | + * | | | | | | | | | | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | | | | | | | | | | | + * | | | | | | | | | | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + */ + +[_SYM_L] = LAYOUT_planck_grid( + _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_UNDS, + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, _______, _______, _______, _______, _______, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +[_SYM_R] = LAYOUT_planck_grid( + KC_PLUS, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, _______, _______, _______, _______, _______, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +) + +}; diff --git a/keyboards/planck/keymaps/jcorrado/readme.md b/keyboards/planck/keymaps/jcorrado/readme.md new file mode 100644 index 000000000..3a600dea1 --- /dev/null +++ b/keyboards/planck/keymaps/jcorrado/readme.md @@ -0,0 +1,9 @@ +# jcorrado Planck keymap + +A keymap for the Planck modeled after the way I remap my Kinesis +Advantage keyboards. + +The layout is designed to minimize awkward contortions: all modifier and +layer-activation combinations can be performed with either hand's thumb +and pinky. This leaves the other hand free to complete commands +comfortably. From 60f5ce8890453751a00ab63b150dded25c39db42 Mon Sep 17 00:00:00 2001 From: Wojciech Siewierski Date: Sat, 6 Oct 2018 16:49:04 +0200 Subject: [PATCH 239/788] Keymap: Update keyboards/planck/keymaps/vifon (#4084) * Implement macro recording * Remove off-by-one from the macro recorder * Holding both modifiers enables the third layer * Exit the 3rd layer into one of the secondary ones * Regular Enter and Escape on the secondary layers Useful for the macro recording because the "tap" modifiers always act as modifiers there. * Remove the buffer overflow from the macro recorder When the limit is reached, the backlight blinks with each keypress. * More robust macro recording implementation * Macro record refactoring and improvement - support for a second macro (saved using the end of the macro buffer) - improved reliability * Add comments to my macros * Macro recording: remove a redundant code * Separate the raise+lower layer from the special layer * Add back/forward keys * Bind mouse movement * More readable KC_TRNS * Improve the mouse bindings * Use a convenience macro instead of the low-level ACTION macro * Add mouse to the Dual layer; make most of the layer transparent * New "mouse" layer; clean up the "special" layer * CapsLock, NumLock and ScrollLock on the Special layer * Enable my fix for the stuck modifiers and adjust the dual layer to it * Fix the macro recording after enabling the stuck mods fix * Click with Lower/Raise+Space * Reduce the memory used by the macro recording Previously the auxiliary layers were numbered 30 and 31 which resulted in all 32 array elements being allocated regardless of the actually used layers in the user code. * Optimize source_layers_cache for the cache memory Swapping the array indices should increase the locality of the memory access. * Remove the mouse layer * Use update_tri_layer to simplify the code * Add some custom per-keymap build options * Add ShiftLock * Secure the reset button * Add numeric layer * Remove explicit layer keys on LW and RS layers * Replace Alt+left/right with Back/Forward keys * Sleep/delay key (for macro recording) * App/menu key * Fix stuff after merging to master * Local per-keymap config.h; minor cleanup * Remove the old macro_record.h Replaced with dynamic_macro.h * Adjust my keymap to the current API * Pure Pro Gaming layer Accessible by double tapping the Pure Pro layer. It features switched Lower and Raise layers, for one-handed access to numbers. * Pure Pro Gaming layer: no Mod4, persistent number layer under RShift * Pure Pro Gaming layer activated with long press, not double press * Reduce the size of the vifon keymap See: issue #930 * Increase the dynamic macro buffer The default was actually decreased. The actual used value didn't change. * Add the context menu key * No more strange ideas in the gaming layer * Reduce the firmware size by disabling API_SYSEX_ENABLE * Make slash available on the PP layer (replaces the RESET key) * Add a generic "hold this key" macro * Add a missing undef * Turn LGUI in the gaming layer into LW instead of disabling it It's not as disruptive as LGUI and it makes the LW/RS order kind of more consistent (LW on the left, RS on the right). * Refactor the Pure Pro Gaming layer * Try out the 1st party qmk KC_LOCK (vs my own KM_HOLD) * Alternative way to switch keyboard layouts with the left hand * Add dot & slash to the Pure Pro layer (but not to the Gaming layer) * Now that there is a second KM_LW, we can simplify the layout a bit It was confusing to have the modifiers completely swapped. Just moving them is much more natural. * Disable the console now that qmk got bigger * Update the keymap for the modern qmk standards --- keyboards/planck/keymaps/vifon/keymap.c | 179 ++++++++++++++---------- keyboards/planck/keymaps/vifon/rules.mk | 2 + 2 files changed, 105 insertions(+), 76 deletions(-) diff --git a/keyboards/planck/keymaps/vifon/keymap.c b/keyboards/planck/keymaps/vifon/keymap.c index 0fa8d9066..6398accc2 100644 --- a/keyboards/planck/keymaps/vifon/keymap.c +++ b/keyboards/planck/keymaps/vifon/keymap.c @@ -1,11 +1,5 @@ -#pragma message "You may need to add LAYOUT_planck_grid to your keymap layers - see default for an example" -#include "planck.h" -#ifdef BACKLIGHT_ENABLE -# include "backlight.h" -#endif -#include "timer.h" -#include +#include QMK_KEYBOARD_H // Each layer gets a name for readability, which is then used in the keymap matrix below. // The underscores don't mean anything - you can have a layer called STUFF or any other name. @@ -27,90 +21,98 @@ enum planck_keycodes { KM_LW = SAFE_RANGE, KM_RS, KM_SHLK, /* ShiftLock */ + KM_HOLD, /* Any-key Lock */ KM_RST, /* Reset */ KM_NUM, /* Numeric layer */ KM_SLP, /* Sleep 250 ms */ - KM_PPLR, /* Pure Pro layer */ + KM_PP_GAME, /* Pure Pro Gaming layer */ + KM_PP_HOLD, /* Pure Pro / PP Gaming layer */ DYNAMIC_MACRO_RANGE, }; #include "dynamic_macro.h" -#define _______ KC_TRNS -#define XXXXXXX KC_NO - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[_QW] = { /* Qwerty */ - {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, - {CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, - {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_FN0 }, - {KC_LCTL, MO(_DYN),KC_LGUI, KC_LALT, KM_LW, KC_SPC, KC_SPC, KM_RS, KC_RALT, KC_DOWN, KC_UP, KC_RCTL} -}, -[_CM] = { /* Colemak */ - {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, - {CTL_T(KC_ESC), KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, - {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_FN0 }, - {KC_LCTL, MO(_DYN),KC_LGUI, KC_LALT, KM_LW, KC_SPC, KC_SPC, KM_RS, KC_RALT, KC_DOWN, KC_UP, KC_RCTL} -}, -[_PP] = { /* Pure Pro */ - {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, - {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT }, - {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_RSFT, KC_UP, KC_RCTL}, - {KC_LCTL, MO(_DYN),KC_LGUI, KC_LALT, KM_LW, KC_SPC, KC_SPC, KM_RS, KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT} -}, -[_PPG] = { /* Pure Pro: Gaming */ - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, - {_______, _______, XXXXXXX, _______, KM_RS , _______, _______, KM_LW , _______, _______, _______, _______}, -}, -[_NM] = { /* Numeric */ - {KC_TAB, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, - {KC_LSFT, _______, _______, _______, _______, _______, _______, _______, KC_COMM, KC_DOT, _______, KC_FN0 }, - {_______, _______, _______, _______, _______, KC_SPC, KC_SPC, _______, _______, _______, _______, _______} -}, -[_LW]= { /* LOWER */ - {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC}, - {KC_ESC, LGUI(KC_1), LGUI(KC_2), LGUI(KC_3), LGUI(KC_4), LGUI(KC_5), KM_NUM, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, - {_______, LGUI(KC_6), LGUI(KC_7), LGUI(KC_8), LGUI(KC_9), LGUI(KC_0), KM_SLP, KC_HOME, KC_PGDN, KC_PGUP, KC_END, KC_ENT }, - {_______, BL_TOGG, _______, _______, _______, KC_BTN1, KC_BTN1, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} -}, -[_RS]= { /* RAISE */ - {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL }, - {KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, - {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), KM_PPLR, KM_RST, KC_ENT }, - {_______, BL_STEP, _______, _______, _______, KC_BTN2, KC_BTN2, _______, KC_MPLY, KC_VOLD, KC_VOLU, _______} -}, -[_DL]= { /* DUAL */ - {_______, _______, KC_WH_U, KC_MS_U, KC_WH_D, _______, _______, KC_APP, KC_INS, _______, KC_PSCR, _______}, - {_______, _______, KC_MS_L, KC_MS_D, KC_MS_R, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_ACL0, KC_ACL2}, - {_______, _______, KC_BTN2, KC_BTN3, KC_BTN1, KC_WWW_BACK, KC_WWW_FORWARD, KC_MUTE, _______, _______, _______, _______}, - {_______, _______, KC_LGUI, KC_LALT, _______, _______, _______, _______, _______, _______, _______, _______} -}, -[_DYN]= { /* special */ - {_______, DYN_REC_START1, DYN_MACRO_PLAY1, _______, _______, _______, _______, KC_APP, KC_INS, _______, KC_PSCR, KC_PAUS}, - {_______, DYN_REC_START2, DYN_MACRO_PLAY2, _______, _______, _______, _______, _______, _______, KC_CAPS, KC_SLCK, KC_NLCK}, - {KM_SHLK, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} -}, -}; - -#undef _______ - -const uint16_t PROGMEM fn_actions[] = { - ACTION_MODS_TAP_KEY(MOD_RSFT, KC_ENT), + [_QW] = LAYOUT_planck_mit( /* Qwerty */ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, MT(MOD_RSFT, KC_ENT), + KC_LCTL, MO(_DYN), KC_LGUI, KC_LALT, KM_LW, KC_SPC, KM_RS, KC_RALT, KC_DOWN, KC_UP, KC_RCTL + ), + [_CM] = LAYOUT_planck_mit( /* Colemak */ + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, + CTL_T(KC_ESC), KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, MT(MOD_RSFT, KC_ENT), + KC_LCTL, MO(_DYN), KC_LGUI, KC_LALT, KM_LW, KC_SPC, KM_RS, KC_RALT, KC_DOWN, KC_UP, KC_RCTL + ), + [_PP] = LAYOUT_planck_mit( /* Pure Pro */ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, MT(MOD_RSFT, KC_DOT), KC_UP, MT(MOD_RCTL, KC_SLSH), + KC_LCTL, MO(_DYN), KC_LGUI, KC_LALT, KM_LW, KC_SPC, KM_RS, KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT + ), + [_PPG] = LAYOUT_planck_mit( /* Pure Pro: Gaming */ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_RSFT, _______, KC_RCTL, + _______, _______, KM_LW, _______, KM_RS, _______, KM_RS , _______, _______, _______, _______ + ), + [_NM] = LAYOUT_planck_mit( /* Numeric */ + KC_TAB, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + KC_LSFT, _______, _______, _______, _______, _______, _______, _______, KC_COMM, KC_DOT, _______, MT(MOD_RSFT, KC_ENT), + _______, _______, _______, _______, _______, KC_SPC, _______, _______, _______, _______, _______ + ), + [_LW] = LAYOUT_planck_mit( /* LOWER */ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, + KC_ESC, LGUI(KC_1), LGUI(KC_2), LGUI(KC_3), LGUI(KC_4), LGUI(KC_5), KM_NUM, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, + _______, LGUI(KC_6), LGUI(KC_7), LGUI(KC_8), LGUI(KC_9), LGUI(KC_0), KM_SLP, KC_HOME, KC_PGDN, KC_PGUP, KC_END, KC_ENT, + _______, BL_TOGG, _______, _______, _______, KC_BTN1, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT + ), + [_RS] = LAYOUT_planck_mit( /* RAISE */ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), KM_PP_HOLD, KM_RST, KC_ENT, + _______, BL_STEP, _______, _______, _______, KC_BTN2, _______, KC_MPLY, KC_VOLD, KC_VOLU, _______ + ), + [_DL] = LAYOUT_planck_mit( /* DUAL */ + _______, _______, KC_WH_U, KC_MS_U, KC_WH_D, _______, _______, KC_APP, KC_INS, _______, KC_PSCR, _______, + _______, _______, KC_MS_L, KC_MS_D, KC_MS_R, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_ACL0, KC_ACL2, + _______, _______, KC_BTN2, KC_BTN3, KC_BTN1, KC_WWW_BACK, KC_WWW_FORWARD, KC_MUTE, _______, _______, _______, _______, + _______, _______, KC_LGUI, KC_LALT, _______, _______, _______, _______, _______, _______, _______ + ), + [_DYN] = LAYOUT_planck_mit( /* special */ + KM_HOLD, DYN_REC_START1, DYN_MACRO_PLAY1, _______, _______, _______, _______, KC_APP, KC_INS, _______, KC_PSCR, KC_PAUS, + KC_LOCK, DYN_REC_START2, DYN_MACRO_PLAY2, _______, _______, _______, _______, _______, _______, KC_CAPS, KC_SLCK, KC_NLCK, + KM_SHLK, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, KM_PP_GAME, DF(_QW), DF(_PP), _______, _______, _______, _______ + ), }; +/* It's a pseudo-layer composed of two real layers, we need a function for this. */ +void enable_gaming_layer(void) { + default_layer_set((1UL << _PP) | (1UL << _PPG)); +#ifdef BACKLIGHT_ENABLE + backlight_toggle(); + _delay_ms(100); + backlight_toggle(); +#endif +} bool process_record_user(uint16_t keycode, keyrecord_t *record) { static uint16_t key_timer; + static uint8_t ignore_up_events = 0; uint16_t macro_kc = (keycode == MO(_DYN) ? DYN_REC_STOP : keycode); if (!process_record_dynamic_macro(macro_kc, record)) { return false; } + if (ignore_up_events > 0 && keycode != MO(_DYN) && keycode != KM_HOLD && !record->event.pressed) { + ignore_up_events -= 1; + return false; + } + switch (keycode) { case KM_LW: if (record->event.pressed) { @@ -133,7 +135,30 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { case KM_SHLK: register_code(KC_LSFT); break; + case KM_HOLD: + if (!record->event.pressed) { + ignore_up_events += 1; + } + break; case KM_RST: + { + /* Make slash available on the PP layer. */ + if ((1UL << _PP) & default_layer_state) { + int32_t old_default_layer_state = default_layer_state; + int32_t old_layer_state = layer_state; + + layer_state = 0; + default_layer_state = (1UL << _QW); + + process_record(record); + + layer_state = old_layer_state; + default_layer_state = old_default_layer_state; + + return false; + } + } + if (record->event.pressed) { key_timer = timer_read(); } else { @@ -146,15 +171,17 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } } break; - case KM_PPLR: + case KM_PP_GAME: + if (!record->event.pressed) { + enable_gaming_layer(); + } + break; + case KM_PP_HOLD: if (record->event.pressed) { key_timer = timer_read(); } else { if (timer_elapsed(key_timer) >= 250) { - default_layer_set((1UL << _PP) | (1UL << _PPG)); - backlight_toggle(); - _delay_ms(100); - backlight_toggle(); + enable_gaming_layer(); } else { default_layer_set(1UL << _PP); } diff --git a/keyboards/planck/keymaps/vifon/rules.mk b/keyboards/planck/keymaps/vifon/rules.mk index 15a7b736f..da83096d6 100644 --- a/keyboards/planck/keymaps/vifon/rules.mk +++ b/keyboards/planck/keymaps/vifon/rules.mk @@ -16,6 +16,8 @@ AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +API_SYSEX_ENABLE = no # https://www.reddit.com/r/olkb/comments/5swhij/_/ddie6zq/ +KEY_LOCK_ENABLE = yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend From cfa9f6ba6da7e6d3435610d6d3b4b7971d3dd547 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Thu, 4 Oct 2018 10:17:41 -0700 Subject: [PATCH 240/788] Add non-US Hash and Backslash to AutoShift handling --- quantum/process_keycode/process_auto_shift.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/quantum/process_keycode/process_auto_shift.c b/quantum/process_keycode/process_auto_shift.c index 01d99445b..0d0930ee6 100644 --- a/quantum/process_keycode/process_auto_shift.c +++ b/quantum/process_keycode/process_auto_shift.c @@ -173,6 +173,8 @@ bool process_auto_shift(uint16_t keycode, keyrecord_t *record) { case KC_DOT: case KC_SLSH: case KC_GRAVE: + case KC_NONUS_BSLASH: + case KC_NONUS_HASH: #endif autoshift_flush(); From 7458ac94897afa7f67d98bc40aa1e090c11c235d Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sat, 6 Oct 2018 17:43:37 -0700 Subject: [PATCH 241/788] Update Contrib doc (#4068) * Add link for style * ignore java * Add example and update link? * Minor fixes * Change 1TBS text * comments --- docs/contributing.md | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/docs/contributing.md b/docs/contributing.md index 7ed7cd06a..bcedcaf97 100644 --- a/docs/contributing.md +++ b/docs/contributing.md @@ -57,14 +57,14 @@ Never made an open source contribution before? Wondering how contributions work Most of our style is pretty easy to pick up on, but right now it's not entirely consistent. You should match the style of the code surrounding your change, but if that code is inconsistent or unclear use the following guidelines: * We indent using two spaces (soft tabs) -* We use One True Brace Style +* We use a modified One True Brace Style * Opening Brace: At the end of the same line as the statement that opens the block * Closing Brace: Lined up with the first character of the statement that opens the block * Else If: Place the closing brace at the beginning of the line and the next opening brace at the end of the same line. * Optional Braces: Always include optional braces. * Good: if (condition) { return false; } * Bad: if (condition) return false; -* We use C style comments: `/* */` +* We encourage use of C style comments: `/* */` * Think of them as a story describing the feature * Use them liberally to explain why particular decisions were made. * Do not write obvious comments @@ -72,6 +72,25 @@ Most of our style is pretty easy to pick up on, but right now it's not entirely * In general we don't wrap lines, they can be as long as needed. If you do choose to wrap lines please do not wrap any wider than 76 columns. * We use `#pragma once` at the start of header files rather than old-style include guards (`#ifndef THIS_FILE_H`, `#define THIS_FILE_H`, ..., `#endif`) +Here is an example for easy reference: + +```c +/* Enums for foo */ +enum foo_state { + FOO_BAR, + FOO_BAZ, +}; + +/* Returns a value */ +int foo(void) { + if (some_condition) { + return FOO_BAR; + } else { + return -1; + } +} +``` + # General Guidelines We have a few different types of changes in QMK, each requiring a different level of rigor. We'd like you to keep the following guidelines in mind no matter what type of change you're making. From f86c0c2643a665dd09bc7a9a2beaaf37f97b9b61 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sat, 6 Oct 2018 17:44:33 -0700 Subject: [PATCH 242/788] Update and clarify Unicode documentation (#4065) * Update and clarify Unicode documentation * Fixed UCIS info based on feedback from algernon * Further clarifications and cleanup * Formatting * Add an example for unicode map * fix AutoHotKey title --- docs/feature_unicode.md | 107 +++++++++++++++++++++++++++++++++------- 1 file changed, 89 insertions(+), 18 deletions(-) diff --git a/docs/feature_unicode.md b/docs/feature_unicode.md index 278b93ad7..f13eed05b 100644 --- a/docs/feature_unicode.md +++ b/docs/feature_unicode.md @@ -4,45 +4,108 @@ There are three Unicode keymap definition method available in QMK: ## UNICODE_ENABLE -Supports Unicode input up to 0xFFFF. The keycode function is `UC(n)` in -keymap file, where *n* is a 4 digit hexadecimal. +Supports Unicode input up to 0xFFFF. The keycode function is `UC(n)` in keymap file, where *n* is a 4 digit hexadecimal. ## UNICODEMAP_ENABLE -Supports Unicode up to 0xFFFFFFFF. You need to maintain a separate mapping -table `const uint32_t PROGMEM unicode_map[] = {...}` in your keymap file. -The keycode function is `X(n)` where *n* is the array index of the mapping -table. +Supports Unicode up to 0xFFFFFFFF. You need to maintain a separate mapping table `const uint32_t PROGMEM unicode_map[] = {...}` in your keymap file. The keycode function is `X(n)` where *n* is the array index of the mapping table. + +And you may want to have an enum to make reference easier. So you'd want to add something like this to your keymap: + +```c +enum unicode_name { + BANG, // ‽ + IRONY, // ⸮ + SNEK // snke 🐍 +}; + +const uint32_t PROGMEM unicode_map[] = { + [BANG] = 0x0203D, // ‽ + [IRONY] = 0x02E2E, // ⸮ + [SNEK] = 0x1F40D // snke 🐍 +}: +``` + +Make sure that the order for both matches. ## UCIS_ENABLE -TBD +Supports Unicode up to 0xFFFFFFFF. As with `UNICODE_MAP`, you may want to main a mapping table in your keymap file. However, there is no keycodes for this feature, you will have to add a keycode or function to call `qk_ucis_start()`. Once you've run that, you can just type the text for your unicode, and then hit space or enter to complete it, or ESC to cancel it. And if it matches an entry in your table, it will automatically "backspace" the trigger word (from your table) and then will input the unicode sequence. -Unicode input in QMK works by inputing a sequence of characters to the OS, +For instance, you would need to have a table like this in your keymap: + +```c +const qk_ucis_symbol_t ucis_symbol_table[] = UCIS_TABLE +( + UCIS_SYM("poop", 0x1f4a9), + UCIS_SYM("rofl", 0x1f923), + UCIS_SYM("kiss", 0x1f619) +); +``` + +You run the function, and then type "rofl" and hit enter, it should backspace remove "rofl" and input the `0x1f923` unicode. + +### Customization + +There are several functions that you can add to your keymap to customize the functionality of this feature. + +* `void qk_ucis_start_user(void)` - This runs when you run the "start" function, and can be used to provide feedback. By default, it types out a keyboard emoji. +* `void qk_ucis_success(uint8_t symbol_index)` - This runs when the unicode input has matched something, and has completed. Default doesn't do anything. +* `void qk_ucis_symbol_fallback (void)` - This runs if the input text doesn't match anything. The default function falls back to trying that input as a unicode code. + +The default code for these are: + +```c +void qk_ucis_start_user(void) { // outputs keyboard emoji + unicode_input_start(); + register_hex(0x2328); + unicode_input_finish(); +} + +void qk_ucis_success(uint8_t symbol_index) { +} + +void qk_ucis_symbol_fallback (void) { // falls back to manual unicode entry + for (uint8_t i = 0; i < qk_ucis_state.count - 1; i++) { + uint8_t code = qk_ucis_state.codes[i]; + register_code(code); + unregister_code(code); + wait_ms(UNICODE_TYPE_DELAY); + } +} +``` + +## Unicode Input methods + +Unicode input in QMK works by inputting a sequence of characters to the OS, sort of like macro. Unfortunately, each OS has different ideas on how Unicode is input. This is the current list of Unicode input method in QMK: -* UC_OSX: MacOS Unicode Hex Input support. Works only up to 0xFFFF. Disabled by default. To enable: go to System Preferences -> Keyboard -> Input Sources, and enable Unicode Hex. -* UC_OSX_RALT: Same as UC_OSX, but sends the Right Alt key for unicode input -* UC_LNX: Unicode input method under Linux. Works up to 0xFFFFF. Should work almost anywhere on ibus enabled distros. Without ibus, this works under GTK apps, but rarely anywhere else. -* UC_WIN: (not recommended) Windows built-in Unicode input. To enable: create registry key under `HKEY_CURRENT_USER\Control Panel\Input Method\EnableHexNumpad` of type `REG_SZ` called `EnableHexNumpad`, set its value to 1, and reboot. This method is not recommended because of reliability and compatibility issue, use WinCompose method below instead. -* UC_WINC: Windows Unicode input using WinCompose. Requires [WinCompose](https://github.com/samhocevar/wincompose). Works reliably under many (all?) variations of Windows. +* _UC_OSX_: MacOS Unicode Hex Input support. Works only up to 0xFFFF. Disabled by default. To enable: go to System Preferences -> Keyboard -> Input Sources, and enable Unicode Hex. +* _UC_OSX_RALT_: Same as UC_OSX, but sends the Right Alt key for unicode input +* _UC_LNX_: Unicode input method under Linux. Works up to 0xFFFFF. Should work almost anywhere on ibus enabled distros. Without ibus, this works under GTK apps, but rarely anywhere else. +* _UC_WIN_: (not recommended) Windows built-in Unicode input. To enable: create registry key under `HKEY_CURRENT_USER\Control Panel\Input Method\EnableHexNumpad` of type `REG_SZ` called `EnableHexNumpad`, set its value to 1, and reboot. This method is not recommended because of reliability and compatibility issue, use WinCompose method below instead. +* _UC_WINC_: Windows Unicode input using WinCompose. Requires [WinCompose](https://github.com/samhocevar/wincompose). Works reliably under many (all?) variations of Windows. -To type multiple characters for things like (ノಠ痊ಠ)ノ彡┻━┻, you can use `send_unicode_hex_string()` much like `SEND_STRING()` except you would use hex values seperated by spaces. +At some point, you need to call `set_unicode_input_mode(x)` to set the correct unicode method. This sets the method that is used to send the unicode, and stores it in EEPROM, so you only need to call this once. + +## `send_unicode_hex_string` + +To type multiple characters for things like (ノಠ痊ಠ)ノ彡┻━┻, you can use `send_unicode_hex_string()` much like `SEND_STRING()` except you would use hex values separate by spaces. For example, the table flip seen above would be `send_unicode_hex_string("0028 30CE 0CA0 75CA 0CA0 0029 30CE 5F61 253B 2501 253B")` There are many ways to get a hex code, but an easy one is [this site](https://r12a.github.io/app-conversion/). Just make sure to convert to hexadecimal, and that is your string. -# Additional Language Support +## Additional Language Support In `quantum/keymap_extras/`, you'll see various language files - these work the same way as the alternative layout ones do. Most are defined by their two letter country/language code followed by an underscore and a 4-letter abbreviation of its name. `FR_UGRV` which will result in a `ù` when using a software-implemented AZERTY layout. It's currently difficult to send such characters in just the firmware. -# International Characters on Windows +## International Characters on Windows -[AutoHotkey](https://autohotkey.com) allows Windows users to create custom hotkeys among others. +### AutoHotkey allows Windows users to create custom hotkeys among others. -The method does not require Unicode support in the keyboard itself but depends instead of AutoHotkey running in the background. +The method does not require Unicode support in the keyboard itself but depends instead of [AutoHotkey](https://autohotkey.com) running in the background. First you need to select a modifier combination that is not in use by any of your programs. CtrlAltWin is not used very widely and should therefore be perfect for this. @@ -57,3 +120,11 @@ In the default script of AutoHotkey you can define custom hotkeys. The hotkeys above are for the combination CtrlAltGui and CtrlAltGuiShift plus the letter a. AutoHotkey inserts the Text right of `Send, ` when this combination is pressed. + +### US International + +If you enable the US International layout on the system, it will use punctuation to accent the characters. + +For instance, typing "`a" will result in à. + +You can find details on how to enable this [here](https://support.microsoft.com/en-us/help/17424/windows-change-keyboard-layout). From 370fdb89c2b63dafcbbe7deae40189dad26a820f Mon Sep 17 00:00:00 2001 From: Brian Mock Date: Sat, 6 Oct 2018 20:55:48 -0700 Subject: [PATCH 243/788] Keymap: Adds TheVan RoadKit Gamepad Layout (#4090) * adds prototype firmware for wavebeem-gamepad * adds installer script * updates readme * updates title * adds prototype firmware for wavebeem-gamepad * adds installer script * updates readme * updates title * removes unused code * removes more code * simplify code --- .../roadkit/keymaps/wavebeem-gamepad/keymap.c | 10 ++++++ .../keymaps/wavebeem-gamepad/readme.md | 35 +++++++++++++++++++ .../roadkit/keymaps/wavebeem-gamepad/rules.mk | 17 +++++++++ 3 files changed, 62 insertions(+) create mode 100644 keyboards/thevankeyboards/roadkit/keymaps/wavebeem-gamepad/keymap.c create mode 100644 keyboards/thevankeyboards/roadkit/keymaps/wavebeem-gamepad/readme.md create mode 100644 keyboards/thevankeyboards/roadkit/keymaps/wavebeem-gamepad/rules.mk diff --git a/keyboards/thevankeyboards/roadkit/keymaps/wavebeem-gamepad/keymap.c b/keyboards/thevankeyboards/roadkit/keymaps/wavebeem-gamepad/keymap.c new file mode 100644 index 000000000..dfdded8e7 --- /dev/null +++ b/keyboards/thevankeyboards/roadkit/keymaps/wavebeem-gamepad/keymap.c @@ -0,0 +1,10 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_ortho_4x4( + KC_TAB, KC_Q, KC_W, KC_E, + KC_ESC, KC_A, KC_S, KC_D, + KC_LSFT, KC_Z, KC_X, KC_C, + KC_F, KC_LALT, KC_LCTL, KC_SPC + ), +}; diff --git a/keyboards/thevankeyboards/roadkit/keymaps/wavebeem-gamepad/readme.md b/keyboards/thevankeyboards/roadkit/keymaps/wavebeem-gamepad/readme.md new file mode 100644 index 000000000..7eeb07ede --- /dev/null +++ b/keyboards/thevankeyboards/roadkit/keymaps/wavebeem-gamepad/readme.md @@ -0,0 +1,35 @@ +![Keymap Diagram](https://i.imgur.com/hRjbhEn.png) + +# Gamepad Layout by @wavebeem + +The concept behind this layout is the left side of a computer keyboard, +optimized with essential keys for playing FPS games. It was designed for TheVan +RoadKit, but it should work for any 4x4 ortholinear keyboard. + +I play with my pinky on `Shift`, thumb on `Space`, and the rest of my fingers on +`W A S D`. I use my thumb for `Control`, `X`, and sometimes `C`. I usually use +`Z` with my ring finger. It also helps to angle my fingers more perpendicular to +the board in order to allow my thumb to more easily access the `Z X C` row. + +The number keys `1 2 3` are missing for weapon switching, but you can usually +switch with the mouse wheel or rebind those to `Z X C` or something else. + +The key `R` for reloading is missing, but I prefer to use my extra mouse buttons +for that. + +I don't really use `Alt` for games, but I kept it around for `Alt-Tab` in +Windows. + +# Keymap Text Diagram + +``` ++-------+-------+-------+-------+ +| Tab | Q | W | E | ++-------+-------+-------+-------+ +| Esc | A | S | D | ++-------+-------+-------+-------+ +| Shift | Z | X | C | ++-------+-------+-------+-------+ +| F | Alt | Ctrl | Space | ++-------+-------+-------+-------+ +``` diff --git a/keyboards/thevankeyboards/roadkit/keymaps/wavebeem-gamepad/rules.mk b/keyboards/thevankeyboards/roadkit/keymaps/wavebeem-gamepad/rules.mk new file mode 100644 index 000000000..72fd3d30b --- /dev/null +++ b/keyboards/thevankeyboards/roadkit/keymaps/wavebeem-gamepad/rules.mk @@ -0,0 +1,17 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend From aa707c6b9e1e60592e8d7434214eb1549ce9053b Mon Sep 17 00:00:00 2001 From: Bramver Date: Sun, 7 Oct 2018 16:36:01 +0200 Subject: [PATCH 244/788] Keymap: Personal Nyquist keymap added. (#4059) * Personal Nyquist keymap added. * Responded to comments for PR. Removed unnecessary imports. Updated way of macros. Removed tick from unicode inputs. * formatting in keymap --- keyboards/nyquist/keymaps/bramver/README.md | 100 +++++++ keyboards/nyquist/keymaps/bramver/config.h | 31 +++ keyboards/nyquist/keymaps/bramver/keymap.c | 281 ++++++++++++++++++++ keyboards/nyquist/keymaps/bramver/rules.mk | 6 + 4 files changed, 418 insertions(+) create mode 100644 keyboards/nyquist/keymaps/bramver/README.md create mode 100644 keyboards/nyquist/keymaps/bramver/config.h create mode 100644 keyboards/nyquist/keymaps/bramver/keymap.c create mode 100644 keyboards/nyquist/keymaps/bramver/rules.mk diff --git a/keyboards/nyquist/keymaps/bramver/README.md b/keyboards/nyquist/keymaps/bramver/README.md new file mode 100644 index 000000000..2768acdf7 --- /dev/null +++ b/keyboards/nyquist/keymaps/bramver/README.md @@ -0,0 +1,100 @@ +# Nyquist Layout - rev 02 + +Standard qwerty layout. +Limited emoji support and proper mouse settings. + +Mostly based off of my XD75 layout. + +## Keymap + +``` + +/* Base + * ,-----------------------------------------. ,-----------------------------------------. + * | GEsc | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | Q | W | E | R | T | | Y | U | I | O | P | Entr | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | LOW | A | S | D | F | G | | H | J | K | L | ; | " | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shft | Z | X | C | V | B | | N | M | , | . | / | Shft | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | EMO | Alt | GUI | SPCE |SP_LMS| |SP_RMS|SP_RMS| GUI | Alt | RAI | Ctrl | + * `-----------------------------------------' `-----------------------------------------' + */ + + + /* Lower + * ,-----------------------------------------. ,-----------------------------------------. + * | GESC | ! | @ | # | $ | % | | ^ | & | * | ( | ) | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | ! | @ | # | $ | % | | ^ | & | * | ( | ) | Entr | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | \ | - | = | [ | ] | | [ | ] | - | = | \ | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shft | ^Z | ^X | ^C | ^V | | | Play | Vol+ | Vol- | Mute | Next | Shft | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | | Alt | GUI | | | | | | GUI | Alt | | Ctrl | + * `-----------------------------------------' `-----------------------------------------' + */ + + +/* Raise + * ,-----------------------------------------. .-----------------------------------------. + * | GESC | | | | | | | | = | / | * | - | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | F9 | F10 | F11 | F12 | | | | 7 | 8 | 9 | + | Entr | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | F5 | F6 | F7 | F8 | | | | 4 | 5 | 6 | , | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shft | F1 | F2 | F3 | F4 | | | | 1 | 2 | 3 | . | Shft | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | | Alt | GUI | | | | | 0 | GUI | Alt | | Ctrl | + * `-----------------------------------------' `-----------------------------------------' + */ + + +/* LMOUSE (Lower + Raise) + * ,-----------------------------------------. ,-----------------------------------------. + * | GESC | | Home | End | PGUP | PGDN | | | | | | | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | WH_L | BTN1 | MS_U | BTN2 | WH_U | | | | | | | Entr | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | WH_R | MS_L | MS_D | MS_R | WH_D | | | | | | | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shft | LEFT | DOWN | UP |RIGHT | | | | | | | | Shft | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | | Alt | GUI | | | | | | GUI | Alt | | Ctrl | + * `-----------------------------------------' `-----------------------------------------' + */ + + +/* RMOUSE (Lower + Raise) + * ,-----------------------------------------. ,-----------------------------------------. + * | GESC | | | | | | | PGUP | PGDN | Home | End | | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | | | | | | | WH_U | BTN1 | MS_U | BTN2 | WH_L | Entr | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | WH_D | MS_L | MS_D | MS_R | WH_R | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shft | | | | | | | | LEFT | DOWN | UP |RIGHT | Shft | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | | Alt | GUI | | | | | | GUI | Alt | | Ctrl | + * `-----------------------------------------' `-----------------------------------------' + */ + + +/* Emojis + * ,-----------------------------------------. ,-----------------------------------------. + * | GESC | | | | | | | RSET | | | | | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | CLAP | CUM | BNIS | BUTT | CAR | | FIRE | REDB | MONY | 100 | SOS | Entr | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | CELE | PRAY | NAIL | OK | THNK | | UNAM | HEYE | COOL | EYES | SMIR | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shft | TRIU | SCRM | VOMI | DTIV | EXPL | | HAIR | DANC | STRN | LEFT | RGHT | Shft | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | | Alt | GUI | | | | | | GUI | Alt | | Ctrl | + * `-----------------------------------------' `-----------------------------------------' + */ +``` \ No newline at end of file diff --git a/keyboards/nyquist/keymaps/bramver/config.h b/keyboards/nyquist/keymaps/bramver/config.h new file mode 100644 index 000000000..c908386e2 --- /dev/null +++ b/keyboards/nyquist/keymaps/bramver/config.h @@ -0,0 +1,31 @@ +/* Copyright 2018 darm + * + * 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 . + */ + +#pragma once + +#define USE_SERIAL +#define MASTER_LEFT + +#define TAPPING_TERM 200 +#define TAPPING_TOGGLE 2 + +#define MOUSEKEY_DELAY 0 +#define MOUSEKEY_INTERVAL 16 +#define MOUSEKEY_MAX_SPEED 7 +#define MOUSEKEY_TIME_TO_MAX 60 +#define MOUSEKEY_WHEEL_MAX_SPEED 8 +#define MOUSEKEY_WHEEL_TIME_TO_MAX 40 +#define MOUSEKEY_WHEEL_DELAY 0 diff --git a/keyboards/nyquist/keymaps/bramver/keymap.c b/keyboards/nyquist/keymaps/bramver/keymap.c new file mode 100644 index 000000000..c5eac853c --- /dev/null +++ b/keyboards/nyquist/keymaps/bramver/keymap.c @@ -0,0 +1,281 @@ +/* Copyright 2018 darm + * + * 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 . + */ +#include QMK_KEYBOARD_H + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _BASE 0 +#define _LOWER 1 +#define _RAISE 2 +#define _LMOUSE 3 +#define _RMOUSE 4 +#define _EMOJI 5 + +enum emoji_map { + UNAM, // unamused 😒 + HEYE, // smiling face with heart shaped eyes 😍 + OK, // ok hand sign 👌 + SMIR, // smirk 😏 + PRAY, // pray 🙏 + CELE, // celebration 🙌 + COOL, // smile with sunglasses 😎 + EYES, // eyes + THNK, // BIG THONK + NAIL, // Nailcare + SOS, // Vuile sos + REDB, // Red B + HNDR, // 100 + MONY, + FIRE, + CAR, + BUTT, + BNIS, + CUM, + CLAP, + TRIU, // Fart from nose + SCRM, + VOMI, + DTIV, // Detective + EXPL, // Brainsplosion + HAIR, // Haircut + DANC, // Salsa dancer + STRN, // Stronk + LEFT, // Point Left + RGHT, // Point Right +}; + +const uint32_t PROGMEM unicode_map[] = { + [UNAM] = 0x1F612, + [HEYE] = 0x1f60d, + [OK] = 0x1F44C, + [SMIR] = 0x1F60F, + [PRAY] = 0x1F64F, + [CELE] = 0x1F64C, + [COOL] = 0x1F60E, + [EYES] = 0x1F440, + [THNK] = 0x1F914, + [NAIL] = 0x1F485, + [SOS] = 0x1F198, + [REDB] = 0x1F171, + [HNDR] = 0x1F4AF, + [MONY] = 0x1F480, + [FIRE] = 0x1F525, + [CAR] = 0x1F697, + [BUTT] = 0x1F351, + [BNIS] = 0x1F346, + [CUM] = 0x1F4A6, + [CLAP] = 0x1F44F, + [TRIU] = 0x1F624, + [SCRM] = 0x1F631, + [VOMI] = 0x1F92E, + [DTIV] = 0x1F575, + [EXPL] = 0x1F92F, + [HAIR] = 0x2640, + [DANC] = 0x1F483, + [STRN] = 0x1F4AA, + [LEFT] = 0x1F448, + [RGHT] = 0x1F449, +}; + +enum custom_keycodes { + CTRL_Z = SAFE_RANGE, + CTRL_X, + CTRL_C, + CTRL_V +}; + +// Enable these functions using FUNC(n) macro. +// const uint16_t PROGMEM fn_actions[] = { //ACTION_LAYER_TAP_TOGGLE requires that number of taps be defined in *config.h* - default set to 5 +// [0] = , //Hold for momentary LMouse layer, Tap for Space, +// [1] = , //Hold for momentary RMouse layer, Tap for Space, +// [2] = , //Hold for momentary Lower +// [3] = , //Hold for momentary Raise +// [4] = , //Hold for momentary Emoji +// }; + +#define SP_LMS LT(_LMOUSE, KC_SPC) +#define SP_RMS LT(_RMOUSE, KC_SPC) +#define LOW TT(_LOWER) +#define RAI TT(_RAISE) +#define EMO TT(_EMOJI) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* Base + * ,-----------------------------------------. ,-----------------------------------------. + * | GEsc | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | Q | W | E | R | T | | Y | U | I | O | P | Entr | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | LOW | A | S | D | F | G | | H | J | K | L | ; | " | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shft | Z | X | C | V | B | | N | M | , | . | / | Shft | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | EMO | Alt | GUI | SPCE |SP_LMS| |SP_RMS|SP_RMS| GUI | Alt | RAI | Ctrl | + * `-----------------------------------------' `-----------------------------------------' + */ + [_BASE] = LAYOUT( \ + KC_GESC , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , /**/ KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_BSPC , \ + KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T , /**/ KC_Y , KC_U , KC_I , KC_O , KC_P , KC_ENT , \ + LOW , KC_A , KC_S , KC_D , KC_F , KC_G , /**/ KC_H , KC_J , KC_K , KC_L , KC_SCLN , KC_QUOT , \ + KC_LSFT , KC_Z , KC_X , KC_C , KC_V , KC_B , /**/ KC_N , KC_M , KC_COMM , KC_DOT , KC_SLSH , KC_RSFT , \ + KC_LCTL , EMO , KC_LALT , KC_LGUI , KC_SPC , SP_LMS , /**/ SP_RMS , KC_SPC , KC_RGUI , KC_RALT , RAI , KC_RCTL \ + ), + + + /* Lower + * ,-----------------------------------------. ,-----------------------------------------. + * | GESC | ! | @ | # | $ | % | | ^ | & | * | ( | ) | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | ! | @ | # | $ | % | | ^ | & | * | ( | ) | Entr | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | \ | - | = | [ | ] | | [ | ] | - | = | \ | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shft | ^Z | ^X | ^C | ^V | | | Play | Vol+ | Vol- | Mute | Next | Shft | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | | Alt | GUI | | | | | | GUI | Alt | | Ctrl | + * `-----------------------------------------' `-----------------------------------------' + */ + [_LOWER] = LAYOUT( \ + TO(0) , KC_EXLM , KC_AT , KC_HASH , KC_DLR , KC_PERC , /**/ KC_CIRC , KC_AMPR , KC_ASTR , KC_LPRN , KC_RPRN , _______ , \ + _______ , KC_EXLM , KC_AT , KC_HASH , KC_DLR , KC_PERC , /**/ KC_CIRC , KC_AMPR , KC_ASTR , KC_LPRN , KC_RPRN , _______ , \ + _______ , KC_RCBR , KC_MINS , KC_EQL , KC_LBRC , KC_RBRC , /**/ KC_LBRC , KC_RBRC , KC_MINS , KC_EQL , KC_BSLS , KC_DEL , \ + _______ , CTRL_Z , CTRL_X , CTRL_C , CTRL_V , XXXXXXX , /**/ KC_MPLY , KC_VOLU , KC_VOLD , KC_MUTE , KC_MNXT , _______ , \ + _______ , XXXXXXX , _______ , _______ , _______ , XXXXXXX , /**/ XXXXXXX , _______ , _______ , _______ , XXXXXXX , _______ \ + ), + + /* Raise + * ,-----------------------------------------. .-----------------------------------------. + * | GESC | | | | | | | | = | / | * | - | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | F9 | F10 | F11 | F12 | | | | 7 | 8 | 9 | + | Entr | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | F5 | F6 | F7 | F8 | | | | 4 | 5 | 6 | , | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shft | F1 | F2 | F3 | F4 | | | | 1 | 2 | 3 | . | Shft | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | | Alt | GUI | | | | | 0 | GUI | Alt | | Ctrl | + * `-----------------------------------------' `-----------------------------------------' + */ + + [_RAISE] = LAYOUT( \ + TO(0) , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , /**/ XXXXXXX , KC_EQL , KC_SLSH , KC_ASTR , KC_MINS , _______ , \ + _______ , KC_F9 , KC_F10 , KC_F11 , KC_F12 , XXXXXXX , /**/ XXXXXXX , KC_7 , KC_8 , KC_9 , KC_PLUS , _______ , \ + XXXXXXX , KC_F5 , KC_F6 , KC_F7 , KC_F8 , XXXXXXX , /**/ XXXXXXX , KC_4 , KC_5 , KC_6 , KC_COMM , KC_DEL , \ + _______ , KC_F1 , KC_F2 , KC_F3 , KC_F4 , XXXXXXX , /**/ XXXXXXX , KC_1 , KC_2 , KC_3 , KC_DOT , _______ , \ + _______ , XXXXXXX , _______ , _______ , _______ , XXXXXXX , /**/ XXXXXXX , KC_0 , _______ , _______ , _______ , _______ \ + ), + + /* LMOUSE (Lower + Raise) + * ,-----------------------------------------. ,-----------------------------------------. + * | GESC | | Home | End | PGUP | PGDN | | | | | | | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | WH_L | BTN1 | MS_U | BTN2 | WH_U | | | | | | | Entr | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | WH_R | MS_L | MS_D | MS_R | WH_D | | | | | | | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shft | LEFT | DOWN | UP |RIGHT | | | | | | | | Shft | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | | Alt | GUI | | | | | | GUI | Alt | | Ctrl | + * `-----------------------------------------' `-----------------------------------------' + */ + + [_LMOUSE] = LAYOUT( \ + TO(0) , XXXXXXX , KC_HOME , KC_END , KC_PGUP , KC_PGDN , /**/ XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , _______ , \ + _______ , KC_WH_L , KC_BTN1 , KC_MS_U , KC_BTN2 , KC_WH_U , /**/ XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , _______ , \ + XXXXXXX , KC_WH_R , KC_MS_L , KC_MS_D , KC_MS_R , KC_WH_D , /**/ XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , KC_DEL , \ + _______ , KC_LEFT , KC_DOWN , KC_UP , KC_RGHT , XXXXXXX , /**/ XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , _______ , \ + _______ , XXXXXXX , _______ , _______ , _______ , _______ , /**/ XXXXXXX , _______ , _______ , _______ , XXXXXXX , _______ \ + ), + + /* RMOUSE (Lower + Raise) + * ,-----------------------------------------. ,-----------------------------------------. + * | GESC | | | | | | | PGUP | PGDN | Home | End | | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | | | | | | | WH_U | BTN1 | MS_U | BTN2 | WH_L | Entr | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | WH_D | MS_L | MS_D | MS_R | WH_R | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shft | | | | | | | | LEFT | DOWN | UP |RIGHT | Shft | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | | Alt | GUI | | | | | | GUI | Alt | | Ctrl | + * `-----------------------------------------' `-----------------------------------------' + */ + + [_RMOUSE] = LAYOUT( \ + TO(0) , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , /**/ KC_PGUP , KC_PGDN , KC_HOME , KC_END , XXXXXXX , _______ , \ + _______ , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , /**/ KC_WH_U , KC_BTN1 , KC_MS_U , KC_BTN2 , KC_WH_L , _______ , \ + XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , /**/ KC_WH_D , KC_MS_L , KC_MS_D , KC_MS_R , KC_WH_R , KC_DEL , \ + _______ , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , /**/ XXXXXXX , KC_LEFT , KC_DOWN , KC_UP , KC_RGHT , _______ , \ + _______ , XXXXXXX , _______ , _______ , _______ , XXXXXXX , /**/ _______ , _______ , _______ , _______ , XXXXXXX , _______ \ + ), + + /* Emojis + * ,-----------------------------------------. ,-----------------------------------------. + * | GESC | | | | | | | RSET | | | | | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | CLAP | CUM | BNIS | BUTT | CAR | | FIRE | REDB | MONY | 100 | SOS | Entr | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | CELE | PRAY | NAIL | OK | THNK | | UNAM | HEYE | COOL | EYES | SMIR | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shft | TRIU | SCRM | VOMI | DTIV | EXPL | | HAIR | DANC | STRN | LEFT | RGHT | Shft | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | | Alt | GUI | | | | | | GUI | Alt | | Ctrl | + * `-----------------------------------------' `-----------------------------------------' + */ + + [_EMOJI] = LAYOUT( \ + TO(0) , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , /**/ RESET , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , _______ , \ + _______ , X(CLAP) , X(CUM) , X(BNIS) , X(BUTT) , X(CAR) , /**/ X(FIRE) , X(REDB) , X(MONY) , X(HNDR) , X(SOS) , _______ , \ + XXXXXXX , X(CELE) , X(PRAY) , X(NAIL) , X(OK) , X(THNK) , /**/ X(UNAM) , X(HEYE) , X(COOL) , X(EYES) , X(SMIR) , KC_DEL , \ + _______ , X(TRIU) , X(SCRM) , X(VOMI) , X(DTIV) , X(EXPL) , /**/ X(HAIR) , X(DANC) , X(STRN) , X(LEFT) , X(RGHT) , _______ , \ + _______ , _______ , _______ , _______ , _______ , XXXXXXX , /**/ XXXXXXX , _______ , _______ , _______ , XXXXXXX , _______ \ + ), + +}; + +void matrix_init_user(void) { + set_unicode_input_mode(UC_LNX); +}; + + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + + if (record->event.pressed) { + switch(keycode) { + case CTRL_Z: + SEND_STRING(SS_LCTRL("z")); + return false; + case CTRL_X: + SEND_STRING(SS_LCTRL("x")); + return false; + case CTRL_C: + SEND_STRING(SS_LCTRL("c")); + return false; + case CTRL_V: + SEND_STRING(SS_LCTRL("v")); + return false; + } + } + + return true; +} diff --git a/keyboards/nyquist/keymaps/bramver/rules.mk b/keyboards/nyquist/keymaps/bramver/rules.mk new file mode 100644 index 000000000..d211d7b4c --- /dev/null +++ b/keyboards/nyquist/keymaps/bramver/rules.mk @@ -0,0 +1,6 @@ +# Build options +MOUSEKEY_ENABLE = yes # Emulates mouse key using keypresses +EXTRAKEY_ENABLE = yes # Use system and audio control key codes +TAP_DANCE_ENABLE = no # Use multi-tap features +UNICODEMAP_ENABLE = yes # Emojify me pls +NKRO_ENABLE = yes From be2610b6da8e7466107678a4782ddafac7002b1d Mon Sep 17 00:00:00 2001 From: sbstjn Date: Fri, 5 Oct 2018 23:59:05 +0200 Subject: [PATCH 245/788] feat: Add 68Keys.io --- keyboards/68keys/68keys.c | 6 ++ keyboards/68keys/68keys.h | 20 ++++++ keyboards/68keys/README.md | 23 +++++++ keyboards/68keys/config.h | 42 ++++++++++++ keyboards/68keys/info.json | 81 +++++++++++++++++++++++ keyboards/68keys/keymaps/default/keymap.c | 10 +++ keyboards/68keys/rules.mk | 22 ++++++ 7 files changed, 204 insertions(+) create mode 100644 keyboards/68keys/68keys.c create mode 100644 keyboards/68keys/68keys.h create mode 100644 keyboards/68keys/README.md create mode 100644 keyboards/68keys/config.h create mode 100644 keyboards/68keys/info.json create mode 100644 keyboards/68keys/keymaps/default/keymap.c create mode 100644 keyboards/68keys/rules.mk diff --git a/keyboards/68keys/68keys.c b/keyboards/68keys/68keys.c new file mode 100644 index 000000000..dcf04e6a3 --- /dev/null +++ b/keyboards/68keys/68keys.c @@ -0,0 +1,6 @@ +#include "68keys.h" + +void matrix_init_kb(void) +{ + matrix_init_user(); +} diff --git a/keyboards/68keys/68keys.h b/keyboards/68keys/68keys.h new file mode 100644 index 000000000..e8a2c4aee --- /dev/null +++ b/keyboards/68keys/68keys.h @@ -0,0 +1,20 @@ +#include "quantum.h" + +#define LAYOUT_68_ansi( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K10, K11, K12, K13, K14, K15, K16, \ + K17, K18, K20, K21, K22, K23, K24, K25, K26, K27, K28, K30, K31, K32, K33, K34, \ + K35, K36, K37, K38, K40, K41, K42, K43, K44, K45, K46, K47, K48, \ + K50, K51, K52, K53, K54, K55, K56, K57, K58, K60, K61, K62, K63, \ + K64, K65, K66, K67, K68, K70, K71, K72, K73, K74) \ + { \ + {K00, K01, K02, K03, K04, K05, K06, K07, K08}, \ + {K10, K11, K12, K13, K14, K15, K16, K17, K18}, \ + {K20, K21, K22, K23, K24, K25, K26, K27, K28}, \ + {K30, K31, K32, K33, K34, K35, K36, K37, K38}, \ + {K40, K41, K42, K43, K44, K45, K46, K47, K48}, \ + {K50, K51, K52, K53, K54, K55, K56, K57, K58}, \ + {K60, K61, K62, K63, K64, K65, K66, K67, K68}, \ + { \ + K70, K71, K72, K73, K74 \ + } \ + } diff --git a/keyboards/68keys/README.md b/keyboards/68keys/README.md new file mode 100644 index 000000000..082a47a75 --- /dev/null +++ b/keyboards/68keys/README.md @@ -0,0 +1,23 @@ +# 68Keys.io + +Custom [68Keys.io](https://68keys.io) DIY keyboard. + +Keyboard Maintainer: [sbstjn](https://sbstjn.com) +Hardware Supported: Pro Micro +Hardware Availability: [DIY Guide](https://68keys.io) + +Make example for this keyboard (after setting up your build environment): + +```bash +$ > cd qmk_firmware/ +$ > make 68keys:default +``` + +Example of flashing this keyboard: + +```bash +$ > cd qmk_firmware/ +$ > make 68keys:default:avrdude +``` + +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). diff --git a/keyboards/68keys/config.h b/keyboards/68keys/config.h new file mode 100644 index 000000000..07c87563d --- /dev/null +++ b/keyboards/68keys/config.h @@ -0,0 +1,42 @@ +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0A0C +#define DEVICE_VER 0x0068 +#define MANUFACTURER 68Keys.io +#define PRODUCT The 68Keys.io Keyboard +#define DESCRIPTION A 68 keys mechanical keyboard + +/* key matrix size */ +#define MATRIX_ROWS 8 +#define MATRIX_COLS 9 + +#define MATRIX_ROW_PINS \ + { \ + B6, B2, B3, B1, F7, F6, F5, F4 \ + } +#define MATRIX_COL_PINS \ + { \ + D3, D2, D1, D0, D4, C6, D7, E6, B4 \ + } +#define UNUSED_PINS + +#define DIODE_DIRECTION COL2ROW + +#define BACKLIGHT_PIN B5 +#define BACKLIGHT_BREATHING +#define BACKLIGHT_LEVELS 3 + +#define DEBOUNCING_DELAY 5 + +/* 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 + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) diff --git a/keyboards/68keys/info.json b/keyboards/68keys/info.json new file mode 100644 index 000000000..b24e22b0a --- /dev/null +++ b/keyboards/68keys/info.json @@ -0,0 +1,81 @@ +{ + "keyboard_name": "68Keys.io", + "url": "https://68keys.io", + "maintainer": "qmk", + "width": 17.25, + "height": 5, + "layouts": { + "LAYOUT_68_ansi": { + "layout": [ + { "label": "~", "x": 0, "y": 0 }, + { "label": "!", "x": 1, "y": 0 }, + { "label": "@", "x": 2, "y": 0 }, + { "label": "#", "x": 3, "y": 0 }, + { "label": "$", "x": 4, "y": 0 }, + { "label": "%", "x": 5, "y": 0 }, + { "label": "^", "x": 6, "y": 0 }, + { "label": "&", "x": 7, "y": 0 }, + { "label": "*", "x": 8, "y": 0 }, + { "label": "(", "x": 9, "y": 0 }, + { "label": ")", "x": 10, "y": 0 }, + { "label": "_", "x": 11, "y": 0 }, + { "label": "+", "x": 12, "y": 0 }, + { "label": "Backspace", "x": 13, "y": 0, "w": 2 }, + { "label": "ESC", "x": 15.25, "y": 0 }, + { "label": "PGUP", "x": 16.25, "y": 0 }, + { "label": "Tab", "x": 0, "y": 1, "w": 1.5 }, + { "label": "Q", "x": 1.5, "y": 1 }, + { "label": "W", "x": 2.5, "y": 1 }, + { "label": "E", "x": 3.5, "y": 1 }, + { "label": "R", "x": 4.5, "y": 1 }, + { "label": "T", "x": 5.5, "y": 1 }, + { "label": "Y", "x": 6.5, "y": 1 }, + { "label": "U", "x": 7.5, "y": 1 }, + { "label": "I", "x": 8.5, "y": 1 }, + { "label": "O", "x": 9.5, "y": 1 }, + { "label": "P", "x": 10.5, "y": 1 }, + { "label": "{", "x": 11.5, "y": 1 }, + { "label": "}", "x": 12.5, "y": 1 }, + { "label": "|", "x": 13.5, "y": 1, "w": 1.5 }, + { "label": "DEL", "x": 15.25, "y": 1 }, + { "label": "PGDN", "x": 16.25, "y": 1 }, + { "label": "Caps Lock", "x": 0, "y": 2, "w": 1.75 }, + { "label": "A", "x": 1.75, "y": 2 }, + { "label": "S", "x": 2.75, "y": 2 }, + { "label": "D", "x": 3.75, "y": 2 }, + { "label": "F", "x": 4.75, "y": 2 }, + { "label": "G", "x": 5.75, "y": 2 }, + { "label": "H", "x": 6.75, "y": 2 }, + { "label": "J", "x": 7.75, "y": 2 }, + { "label": "K", "x": 8.75, "y": 2 }, + { "label": "L", "x": 9.75, "y": 2 }, + { "label": ":", "x": 10.75, "y": 2 }, + { "label": "\"", "x": 11.75, "y": 2 }, + { "label": "Enter", "x": 12.75, "y": 2, "w": 2.25 }, + { "label": "Shift", "x": 0, "y": 3, "w": 2.25 }, + { "label": "Z", "x": 2.25, "y": 3 }, + { "label": "X", "x": 3.25, "y": 3 }, + { "label": "C", "x": 4.25, "y": 3 }, + { "label": "V", "x": 5.25, "y": 3 }, + { "label": "B", "x": 6.25, "y": 3 }, + { "label": "N", "x": 7.25, "y": 3 }, + { "label": "M", "x": 8.25, "y": 3 }, + { "label": "<", "x": 9.25, "y": 3 }, + { "label": ">", "x": 10.25, "y": 3 }, + { "label": "?", "x": 11.25, "y": 3 }, + { "label": "Shift", "x": 12.25, "y": 3, "w": 2.75 }, + { "x": 15.25, "y": 3 }, + { "label": "CTRL", "x": 0, "y": 4, "w": 1.25 }, + { "label": "ALT", "x": 1.25, "y": 4, "w": 1.25 }, + { "label": "GUI", "x": 2.5, "y": 4, "w": 1.25 }, + { "x": 3.75, "y": 4, "w": 6.25 }, + { "label": "GUI", "x": 10, "y": 4, "w": 1.25 }, + { "label": "ALT", "x": 11.25, "y": 4, "w": 1.25 }, + { "label": "CTRL", "x": 12.5, "y": 4, "w": 1.25 }, + { "x": 14.25, "y": 4 }, + { "x": 15.25, "y": 4 }, + { "x": 16.25, "y": 4 } + ] + } + } +} diff --git a/keyboards/68keys/keymaps/default/keymap.c b/keyboards/68keys/keymaps/default/keymap.c new file mode 100644 index 000000000..8f23d2246 --- /dev/null +++ b/keyboards/68keys/keymaps/default/keymap.c @@ -0,0 +1,10 @@ +#include QMK_KEYBOARD_H +#include "68keys.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_68_ansi( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_ESC, KC_PGUP, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_PGDN, + KC_CAPSLOCK, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT)}; diff --git a/keyboards/68keys/rules.mk b/keyboards/68keys/rules.mk new file mode 100644 index 000000000..f1a56d496 --- /dev/null +++ b/keyboards/68keys/rules.mk @@ -0,0 +1,22 @@ +LAYOUTS = 68_ansi + +MCU = atmega32u4 +F_CPU = 16000000 +ARCH = AVR8 +F_USB = $(F_CPU) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT +BOOTLOADER = atmel-dfu + +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration (+1000) +MOUSEKEY_ENABLE = no # Mouse keys (+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control (+450) +CONSOLE_ENABLE = no # Console for debug (+400) +COMMAND_ENABLE = no # Commands for debug and configuration +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +NKRO_ENABLE = no # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +MIDI_ENABLE = no # MIDI controls +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 + From 914d42acd01cae9fa03d9368f9316a1e1017fb17 Mon Sep 17 00:00:00 2001 From: chipperdoodles Date: Sun, 7 Oct 2018 11:23:41 -0700 Subject: [PATCH 246/788] Update Bluetooth docs (#4062) * syncing upstream * Bluetooth Doc update More Description in bluetooth section, Addition to Config options rules.mk section. * merge upstream chibios * lib/chibios checkout * Additional EZ key Section added back EZ-Key diy link, Cleaned up some errors --- docs/config_options.md | 4 +++- docs/feature_bluetooth.md | 32 +++++++++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/docs/config_options.md b/docs/config_options.md index 072857727..4678a7146 100644 --- a/docs/config_options.md +++ b/docs/config_options.md @@ -245,7 +245,9 @@ Use these to enable or disable building certain features. The more you have enab * `UNICODE_ENABLE` * Unicode * `BLUETOOTH_ENABLE` - * Enable Bluetooth with the Adafruit EZ-Key HID + * Legacy option to Enable Bluetooth with the Adafruit EZ-Key HID. See BLUETOOTH +* `BLUETOOTH` + * Current options are AdafruitEzKey, AdafruitBLE, RN42 * `SPLIT_KEYBOARD` * Enables split keyboard support (dual MCU like the let's split and bakingpy's boards) and includes all necessary files located at quantum/split_common * `WAIT_FOR_USB` diff --git a/docs/feature_bluetooth.md b/docs/feature_bluetooth.md index f647adc72..3ffbfa068 100644 --- a/docs/feature_bluetooth.md +++ b/docs/feature_bluetooth.md @@ -1,10 +1,40 @@ # Bluetooth -## Bluetooth Functionality +## Bluetooth Known Supported Hardware +Currently Bluetooth support is limited to AVR based chips. For Bluetooth 2.1 Qmk has support for RN-42 HID Firmware and Bluefruit EZ Key the later of which is not produced anymore. For more recent BLE protocols currently only the Adafruit Bluefruit SPI friend is directly supported. BLE is needed to connect to iOS devices. Note iOS does not support Mouse Input. + +|Board |Bluetooth Protocol |Connection Type |Rules.mk |Bluetooth Chip| +|----------------------------------------------------------------|----------------------------|----------------|---------------------------|--------------| +|[Adafruit EzKey HID]("https://www.adafruit.com/product/1535") |Bluetooth Classic | UART | BLUETOOTH = AdafruitEZKey | | +|Rover Networks RN-42 (Sparkfun Bluesmirf) |Bluetooth Classic | UART | BLUETOOTH = RN42 | RN-42 | +|[Bluefruit LE SPI Friend](https://www.adafruit.com/product/2633)|Bluetooth Low Energy | SPI | BLUETOOTH = AdafruitBLE | nRF5182 | + +Not Supported Yet but possible: +* [Bluefruit LE UART Friend](https://www.adafruit.com/product/2479). [Possible tmk implementation found in](https://github.com/tmk/tmk_keyboard/issues/514) +* HC-05 boards flashed with RN-42 firmware. They apparently both use the CSR BC417 Chip. Flashing it with RN-42 firmware gives it HID capability. +* [Sparkfun Bluetooth mate](https://www.sparkfun.com/products/14839) +* HM-13 based boards + +### Adafruit BLE SPI Friend +Currently The only bluetooth chipset supported by QMK is the Adafruit Bluefruit SPI Friend. It's a Nordic nRF5182 based chip running Adafruit's custom firmware. Data is transmitted via Adafruit's SDEP over Hardware SPI. The [Feather 32u4 Bluefruit LE](https://www.adafruit.com/product/2829) is supported as it's an AVR mcu connected via SPI to the Nordic BLE chip with Adafruit firmware. If Building a custom board with the SPI friend it would be easiest to just use the pin selection that the 32u4 feather uses but you can change the pins in the config.h options with the following defines: +* #define AdafruitBleResetPin D4 +* #define AdafruitBleCSPin B4 +* #define AdafruitBleIRQPin E6 + +A Bluefruit UART friend can be converted to an SPI friend, however this [requires](https://github.com/qmk/qmk_firmware/issues/2274) some reflashing and soldering directly to the MDBT40 chip. + +## Adafruit EZ-Key hid This requires [some hardware changes](https://www.reddit.com/r/MechanicalKeyboards/comments/3psx0q/the_planck_keyboard_with_bluetooth_guide_and/?ref=search_posts), but can be enabled via the Makefile. The firmware will still output characters via USB, so be aware of this when charging via a computer. It would make sense to have a switch on the Bluefruit to turn it off at will. + +## Bluetooth Rules.mk Options +Use only one of these +* BLUETOOTH_ENABLE = yes (Legacy Option) +* BLUETOOTH = RN42 +* BLUETOOTH = AdafruitEZKey +* BLUETOOTH = AdafruitBLE ## Bluetooth Keycodes From 98a63d8d6e91fcd0de4e8496d21ceef17b81d5d1 Mon Sep 17 00:00:00 2001 From: yiancar Date: Mon, 8 Oct 2018 23:27:04 +0100 Subject: [PATCH 247/788] DC01 updates and I2C avr speed overwrite (#4088) * DC01 updates and I2C avr speed overwrite - General updating of DC01 - Made F_SCL define in AVR I2C driver overwritable from config.h * Update drivers/avr/i2c_master.c --- drivers/avr/i2c_master.c | 2 ++ keyboards/dc01/left/config.h | 2 ++ keyboards/dc01/left/matrix.c | 41 ++++++++++++------------------------ 3 files changed, 17 insertions(+), 28 deletions(-) diff --git a/drivers/avr/i2c_master.c b/drivers/avr/i2c_master.c index 47c6f8e6c..a04e6570d 100755 --- a/drivers/avr/i2c_master.c +++ b/drivers/avr/i2c_master.c @@ -8,7 +8,9 @@ #include "i2c_master.h" #include "timer.h" +#ifndef F_SCL #define F_SCL 400000UL // SCL frequency +#endif #define Prescaler 1 #define TWBR_val ((((F_CPU / F_SCL) / Prescaler) - 16 ) / 2) diff --git a/keyboards/dc01/left/config.h b/keyboards/dc01/left/config.h index 68484d835..e3d49404e 100644 --- a/keyboards/dc01/left/config.h +++ b/keyboards/dc01/left/config.h @@ -46,6 +46,8 @@ along with this program. If not, see . #define MATRIX_COL_PINS { F4, F1, F0, F7, F6, F5 } #define UNUSED_PINS +#define F_SCL 300000UL + /* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ #define DIODE_DIRECTION COL2ROW diff --git a/keyboards/dc01/left/matrix.c b/keyboards/dc01/left/matrix.c index 792376635..806583580 100644 --- a/keyboards/dc01/left/matrix.c +++ b/keyboards/dc01/left/matrix.c @@ -43,7 +43,7 @@ static uint8_t error_count_arrow = 0; /* Set 0 if debouncing isn't needed */ #ifndef DEBOUNCING_DELAY -# define DEBOUNCING_DELAY 5 +# define DEBOUNCING_DELAY 5 #endif #if (DEBOUNCING_DELAY > 0) @@ -135,10 +135,7 @@ uint8_t matrix_cols(void) { return MATRIX_COLS; } - i2c_status_t i2c_transaction(uint8_t address, uint32_t mask, uint8_t col_offset); -//uint8_t i2c_transaction_numpad(void); -//uint8_t i2c_transaction_arrow(void); //this replases tmk code void matrix_setup(void){ @@ -220,7 +217,7 @@ uint8_t matrix_scan(void) matrix[i] &= 0x3F; //mask bits to keep } } - }else{ //no error + }else{ //no error error_count_right = 0; } @@ -440,40 +437,28 @@ static void unselect_cols(void) // Complete rows from other modules over i2c i2c_status_t i2c_transaction(uint8_t address, uint32_t mask, uint8_t col_offset) { i2c_status_t err = i2c_start((address << 1) | I2C_WRITE, 10); - if (err) return err; - i2c_write(0x01, 10); - if (err) return err; + i2c_write(0x01, 10); //request data in address 1 - i2c_start((address << 1) | I2C_READ, 10); - if (err) return err; + i2c_start((address << 1) | I2C_READ, 5); err = i2c_read_ack(10); if (err == 0x55) { //synchronization byte - for (uint8_t i = 0; i < MATRIX_ROWS-1 ; i++) { //assemble slave matrix in main matrix - matrix[i] &= mask; //mask bits to keep - err = i2c_read_ack(10); - if (err >= 0) { - matrix[i] |= ((uint32_t)err << (MATRIX_COLS_SCANNED + col_offset)); //add new bits at the end - } else { - return err; - } - } - //last read request must be followed by a NACK - matrix[MATRIX_ROWS - 1] &= mask; //mask bits to keep - err = i2c_read_nack(10); - if (err >= 0) { + for (uint8_t i = 0; i < MATRIX_ROWS-1 ; i++) { //assemble slave matrix in main matrix + matrix[i] &= mask; //mask bits to keep + err = i2c_read_ack(10); + matrix[i] |= ((uint32_t)err << (MATRIX_COLS_SCANNED + col_offset)); //add new bits at the end + } + //last read request must be followed by a NACK + matrix[MATRIX_ROWS - 1] &= mask; //mask bits to keep + err = i2c_read_nack(10); matrix[MATRIX_ROWS - 1] |= ((uint32_t)err << (MATRIX_COLS_SCANNED + col_offset)); //add new bits at the end - } else { - return err; - } + } else { i2c_stop(10); return 1; } i2c_stop(10); - if (err) return err; - return 0; } \ No newline at end of file From be227b43174f6ec9effbbfc25eb9a853b42cbf2f Mon Sep 17 00:00:00 2001 From: captsis <34025500+captsis@users.noreply.github.com> Date: Mon, 8 Oct 2018 15:20:31 -1000 Subject: [PATCH 248/788] Keyboard: add orange75 (#4093) * New Keyboard: orange75 Co-Authored-By: fox-lab * Update keyboards/orange75/info.json corrected * #4093 corrections * added del to layout again * clarified supported hardware * directives... * Update keyboards/orange75/config.h * Update keyboards/orange75/readme.md --- keyboards/orange75/config.h | 35 ++++++++++ keyboards/orange75/info.json | 12 ++++ keyboards/orange75/keymaps/default/keymap.c | 53 +++++++++++++++ keyboards/orange75/orange75.c | 1 + keyboards/orange75/orange75.h | 29 ++++++++ keyboards/orange75/readme.md | 16 +++++ keyboards/orange75/rules.mk | 73 +++++++++++++++++++++ 7 files changed, 219 insertions(+) create mode 100644 keyboards/orange75/config.h create mode 100644 keyboards/orange75/info.json create mode 100644 keyboards/orange75/keymaps/default/keymap.c create mode 100644 keyboards/orange75/orange75.c create mode 100644 keyboards/orange75/orange75.h create mode 100644 keyboards/orange75/readme.md create mode 100644 keyboards/orange75/rules.mk diff --git a/keyboards/orange75/config.h b/keyboards/orange75/config.h new file mode 100644 index 000000000..7d1b497be --- /dev/null +++ b/keyboards/orange75/config.h @@ -0,0 +1,35 @@ +#pragma once + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEEB +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Fox-Lab +#define PRODUCT Orange75 +#define DESCRIPTION Keyboard + +/* key matrix size */ +#define MATRIX_ROWS 15 +#define MATRIX_COLS 6 + +/* key matrix pins */ +#define MATRIX_ROW_PINS { E6,F0, F1, F4, F5, F6, F7, C7, C6, B6, B4, D7, D4, D5, D6 } +#define MATRIX_COL_PINS { D3, D2, D1, D0, B7, B3 } +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* number of backlight levels */ +#define BACKLIGHT_PIN B5 +#define BACKLIGHT_LEVELS 3 + + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCING_DELAY 5 + +/* 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 diff --git a/keyboards/orange75/info.json b/keyboards/orange75/info.json new file mode 100644 index 000000000..093b4cd4e --- /dev/null +++ b/keyboards/orange75/info.json @@ -0,0 +1,12 @@ +{ + "keyboard_name": "Orange75", + "url": "", + "maintainer": "qmk", + "width": 16, + "height": 6.25, + "layouts": { + "LAYOUT": { + "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"F1", "x":2, "y":0}, {"label":"F2", "x":3, "y":0}, {"label":"F3", "x":4, "y":0}, {"label":"F4", "x":5, "y":0}, {"label":"F5", "x":6.5, "y":0}, {"label":"F6", "x":7.5, "y":0}, {"label":"F7", "x":8.5, "y":0}, {"label":"F8", "x":9.5, "y":0}, {"label":"F9", "x":11, "y":0}, {"label":"F10", "x":12, "y":0}, {"label":"F11", "x":13, "y":0}, {"label":"F12", "x":14, "y":0}, {"label":"~", "x":0, "y":1.25}, {"label":"!", "x":1, "y":1.25}, {"label":"@", "x":2, "y":1.25}, {"label":"#", "x":3, "y":1.25}, {"label":"$", "x":4, "y":1.25}, {"label":"%", "x":5, "y":1.25}, {"label":"^", "x":6, "y":1.25}, {"label":"&", "x":7, "y":1.25}, {"label":"*", "x":8, "y":1.25}, {"label":"(", "x":9, "y":1.25}, {"label":")", "x":10, "y":1.25}, {"label":"_", "x":11, "y":1.25}, {"label":"+", "x":12, "y":1.25}, {"label":"Backspace", "x":13, "y":1.25, "w":2}, {"label":"Home", "x":15, "y":1.25}, {"label":"Tab", "x":0, "y":2.25, "w":1.5}, {"label":"Q", "x":1.5, "y":2.25}, {"label":"W", "x":2.5, "y":2.25}, {"label":"E", "x":3.5, "y":2.25}, {"label":"R", "x":4.5, "y":2.25}, {"label":"T", "x":5.5, "y":2.25}, {"label":"Y", "x":6.5, "y":2.25}, {"label":"U", "x":7.5, "y":2.25}, {"label":"I", "x":8.5, "y":2.25}, {"label":"O", "x":9.5, "y":2.25}, {"label":"P", "x":10.5, "y":2.25}, {"label":"{", "x":11.5, "y":2.25}, {"label":"}", "x":12.5, "y":2.25}, {"label":"|", "x":13.5, "y":2.25, "w":1.5}, {"label":"End", "x":15, "y":2.25}, {"label":"Caps Lock", "x":0, "y":3.25, "w":1.75}, {"label":"A", "x":1.75, "y":3.25}, {"label":"S", "x":2.75, "y":3.25}, {"label":"D", "x":3.75, "y":3.25}, {"label":"F", "x":4.75, "y":3.25}, {"label":"G", "x":5.75, "y":3.25}, {"label":"H", "x":6.75, "y":3.25}, {"label":"J", "x":7.75, "y":3.25}, {"label":"K", "x":8.75, "y":3.25}, {"label":"L", "x":9.75, "y":3.25}, {"label":":", "x":10.75, "y":3.25}, {"label":"\"", "x":11.75, "y":3.25}, {"label":"Enter", "x":12.75, "y":3.25, "w":2.25}, {"label":"Page Up", "x":15, "y":3.25}, {"label":"Shift", "x":0, "y":4.25, "w":2.25}, {"label":"Z", "x":2.25, "y":4.25}, {"label":"X", "x":3.25, "y":4.25}, {"label":"C", "x":4.25, "y":4.25}, {"label":"V", "x":5.25, "y":4.25}, {"label":"B", "x":6.25, "y":4.25}, {"label":"N", "x":7.25, "y":4.25}, {"label":"M", "x":8.25, "y":4.25}, {"label":"<", "x":9.25, "y":4.25}, {"label":">", "x":10.25, "y":4.25}, {"label":"?", "x":11.25, "y":4.25}, {"label":"Shift", "x":12.25, "y":4.25, "w":1.75}, {"label":"Up", "x":14, "y":4.25}, {"label":"Page Down", "x":15, "y":4.25}, {"label":"Ctrl", "x":0, "y":5.25, "w":1.25}, {"label":"Win", "x":1.25, "y":5.25, "w":1.25}, {"label":"Alt", "x":2.5, "y":5.25, "w":1.25}, {"x":3.75, "y":5.25, "w":6.25}, {"label":"Alt", "x":10, "y":5.25, "w":1.25}, {"label":"Fn", "x":11.25, "y":5.25, "w":1.25}, {"label":"Left", "x":13, "y":5.25}, {"label":"Down", "x":14, "y":5.25}, {"label":"Right", "x":15, "y":5.25}] + } + } +} \ No newline at end of file diff --git a/keyboards/orange75/keymaps/default/keymap.c b/keyboards/orange75/keymaps/default/keymap.c new file mode 100644 index 000000000..50aaf718e --- /dev/null +++ b/keyboards/orange75/keymaps/default/keymap.c @@ -0,0 +1,53 @@ + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + LAYOUT( + KC_ESC, KC_F1,KC_F2,KC_F3,KC_F4,KC_F5,KC_F6,KC_F7,KC_F8,KC_F9,KC_F10,KC_F11, KC_F12, KC_DEL, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_HOME, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_END, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP, + KC_LSFT, LT(1, KC_NO), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, KC_UP, KC_PGDN, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_LALT, LT(1, KC_NO), KC_LEFT, KC_DOWN, KC_RGHT), + + LAYOUT( + RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, BL_TOGG, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, BL_STEP, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, BL_INC, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, BL_DEC, + _______, _______, _______, _______, _______, _______, _______, _______, _______) +}; + + +void matrix_init_user(void) { +} + +void matrix_scan_user(void) { +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void led_set_user(uint8_t usb_led) { + + if (usb_led & (1 << USB_LED_NUM_LOCK)) { + DDRB |= (1 << 0); PORTB &= ~(1 << 0); + } else { + DDRB &= ~(1 << 0); PORTB &= ~(1 << 0); + } + + if (usb_led & (1 << USB_LED_CAPS_LOCK)) { + DDRB |= (1 << 1); PORTB &= ~(1 << 1); + } else { + DDRB &= ~(1 << 1); PORTB &= ~(1 << 1); + } + + if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { + DDRB |= (1 << 2); PORTB &= ~(1 << 2); + } else { + DDRB &= ~(1 << 2); PORTB &= ~(1 << 2); + } +} \ No newline at end of file diff --git a/keyboards/orange75/orange75.c b/keyboards/orange75/orange75.c new file mode 100644 index 000000000..2d5f73048 --- /dev/null +++ b/keyboards/orange75/orange75.c @@ -0,0 +1 @@ +#include "orange75.h" \ No newline at end of file diff --git a/keyboards/orange75/orange75.h b/keyboards/orange75/orange75.h new file mode 100644 index 000000000..1b351a595 --- /dev/null +++ b/keyboards/orange75/orange75.h @@ -0,0 +1,29 @@ +#pragma once + +#include "quantum.h" + +#define LAYOUT( \ + K000, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, \ + K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K314, \ + K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414, \ + K500, K501, K502, K506, K510, K511, K512, K513, K514 \ +) { \ + { K000, K100, K200, K300, K400, K500 }, \ + { KC_NO, K101, K201, K301, K401, K501 }, \ + { K002, K102, K202, K302, K402, K502 }, \ + { K003, K103, K203, K303, K403, KC_NO}, \ + { K004, K104, K204, K304, K404, KC_NO}, \ + { K005, K105, K205, K305, K405, KC_NO}, \ + { K006, K106, K206, K306, K406, K506 }, \ + { K007, K107, K207, K307, K407, KC_NO}, \ + { K008, K108, K208, K308, K408, KC_NO}, \ + { K009, K109, K209, K309, K409, KC_NO}, \ + { K010, K110, K210, K310, K410, K510 }, \ + { K011, K111, K211, K311, K411, K511 }, \ + { K012, K112, K212, K312, K412, K512 }, \ + { K013, K113, K213, KC_NO,K413, K513 }, \ + { K014, K114, K214, K314, K414, K514 } \ +} + diff --git a/keyboards/orange75/readme.md b/keyboards/orange75/readme.md new file mode 100644 index 000000000..910674406 --- /dev/null +++ b/keyboards/orange75/readme.md @@ -0,0 +1,16 @@ +# Orange75 + +![Orange75](https://i.imgur.com/eAfiwwM.jpg) + +A 75% made by Fox Lab. + +Keyboard Maintainer: [captsis](https://github.com/captsis), [fox-lab](https://github.com/fox-lab) +Hardware Supported: Orange75 powered by the ATmega32U4 +Hardware Availability: [zFrontier](https://en.zfrontier.com/collections/keyboards/products/foxlab-orange75), [Geekhack GB](https://geekhack.org/index.php?topic=95080.0) + + +Make example for this keyboard (after setting up your build environment): + + make orange75:default + +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). \ No newline at end of file diff --git a/keyboards/orange75/rules.mk b/keyboards/orange75/rules.mk new file mode 100644 index 000000000..0f9672a51 --- /dev/null +++ b/keyboards/orange75/rules.mk @@ -0,0 +1,73 @@ +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# comment out to disable the options. +# +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +AUDIO_ENABLE = no +RGBLIGHT_ENABLE = no \ No newline at end of file From 42add5450d453d734833a7b978e4ab6907ab1fe1 Mon Sep 17 00:00:00 2001 From: Grady Sigler Date: Mon, 8 Oct 2018 20:50:42 -0600 Subject: [PATCH 249/788] Keymap: Iris Keymap (#4100) * IRIS Keyboard Keymap I wanted a keymap that really changed things up. I also found that as a programmer I need as many symbols as I can get. * Make cmd-option-escape work on a mac * Add more prettyfication. * Add other types of hold * More work on the layer keys * tweaks * More tweaks. * more tweaks * Remove OSL/OSM they didnt seem to work very well --- keyboards/iris/keymaps/gsigler/config.h | 33 +++++++++++ keyboards/iris/keymaps/gsigler/keymap.c | 74 +++++++++++++++++++++++++ keyboards/iris/keymaps/gsigler/rules.mk | 3 + 3 files changed, 110 insertions(+) create mode 100644 keyboards/iris/keymaps/gsigler/config.h create mode 100644 keyboards/iris/keymaps/gsigler/keymap.c create mode 100644 keyboards/iris/keymaps/gsigler/rules.mk diff --git a/keyboards/iris/keymaps/gsigler/config.h b/keyboards/iris/keymaps/gsigler/config.h new file mode 100644 index 000000000..e1793fb1b --- /dev/null +++ b/keyboards/iris/keymaps/gsigler/config.h @@ -0,0 +1,33 @@ +/* +Copyright 2018 Grady Sigler + +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 . +*/ + +#pragma once + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + +#define AUTO_SHIFT_TIMEOUT 95 +#define ONESHOT_TAP_TOGGLE 5 /* Tapping this number of times holds the key until tapped this number of times again. */ +#define ONESHOT_TIMEOUT 5000 /* Time (in ms) before the one shot key is released */ diff --git a/keyboards/iris/keymaps/gsigler/keymap.c b/keyboards/iris/keymaps/gsigler/keymap.c new file mode 100644 index 000000000..f8753cbdc --- /dev/null +++ b/keyboards/iris/keymaps/gsigler/keymap.c @@ -0,0 +1,74 @@ +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +enum iris_layers { + _QWERTY, + _LOWER, + _RAISE +}; + +#define LOWER MO(_LOWER) +#define RAISE MO(_RAISE) + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_QWERTY] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + //| `/~ | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | _/- | + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + //| TAB | Q | W | E | R | T | | Y | U | I | O | P | +/= | + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_EQL, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + //| RAISE | A | S | D | F | G | | H | J | K | L | :/; | "/' | + RAISE, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + //| LOWER | Z | X | C | V | B | ESC | | ALT | N | M | /. | ?-/ | |-\ | + LOWER, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_ESC, KC_LALT, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_BSLS, + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + // | CTRL | COMMAND| BKSPACE| | SPACE | ENTER | SHIFT | + KC_LCTL, KC_LGUI, KC_BSPC, KC_SPC, KC_ENT, KC_LSFT + // └────────┴────────┴────────┘ └────────┴────────┴────────┘ + ), +//KC_LALT ALT + [_RAISE] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + //| `/~ | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 | + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + //| TAB | ! | @ | { | } | | | | | | ↑ | | | F12 | + KC_TRNS, KC_EXLM, KC_AT, KC_LCBR, KC_RCBR, KC_PIPE, XXXXXXX, XXXXXXX, KC_UP, XXXXXXX, XXXXXXX, KC_F12, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + //| RAISE | # | $ | ( | ) | ` | | ? | ← | ↓ | → | | VOLUP | + KC_TRNS, KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, KC_GRV, KC_QUES, KC_LEFT,KC_DOWN, KC_RGHT, XXXXXXX, KC__VOLUP, + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + //| | % | ^ | [ | ] | ~ | ESC | ALT | & | | | | MUTE | VOLDN | + XXXXXXX, KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_TILD, KC_TRNS, KC_TRNS, KC_AMPR, XXXXXXX, XXXXXXX,XXXXXXX, KC__MUTE,KC__VOLDOWN, + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + // | CTRL | COMMAND| BKSPACE| | SPACE | ENTER | SHIFT| + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + // └────────┴────────┴────────┘ └────────┴────────┴────────┘ + ), + + [_LOWER] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + //| | | | | | | | | 7 | 8 | 9 | * | / | + KC_ASUP, KC_ASON, KC_ASRP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_P7, KC_P8, KC_P9, KC_PAST, KC_PSLS, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + //| | | | | | | | | 4 | 5 | 6 | + | - | + KC_ASDN, KC_ASOFF, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_P4, KC_P5, KC_P6, KC_PPLS, KC_PMNS, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + //| | | | | | | | | 1 | 2 | 3 | | | + XXXXXXX, KC_ASTG, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_P1, KC_P2, KC_P3, XXXXXXX, XXXXXXX, + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + //| LOWER | | | | | | ESC | | ALT | | 0 | . | ENTER | = | | + KC_TRNS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_TRNS, KC_TRNS, XXXXXXX, KC_P0, KC_PDOT, KC_PENT, KC_PEQL, XXXXXXX, + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + // | CTRL | COMMAND| BKSPACE | | SPACE | ENTER | SHIFT | + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + // └────────┴────────┴────────┘ └────────┴────────┴────────┘ + ), + +}; diff --git a/keyboards/iris/keymaps/gsigler/rules.mk b/keyboards/iris/keymaps/gsigler/rules.mk new file mode 100644 index 000000000..0abc28fc5 --- /dev/null +++ b/keyboards/iris/keymaps/gsigler/rules.mk @@ -0,0 +1,3 @@ +RGBLIGHT_ENABLE = yes +BACKLIGHT_ENABLE = yes +AUTO_SHIFT_ENABLE = yes From 04e28470bcf22b05ca2bd52746c2254cae281836 Mon Sep 17 00:00:00 2001 From: Brian Choromanski Date: Mon, 8 Oct 2018 09:48:44 -0400 Subject: [PATCH 250/788] Added OSL to list of layer toggles --- docs/feature_advanced_keycodes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/feature_advanced_keycodes.md b/docs/feature_advanced_keycodes.md index 5f30359e0..0f5b8618a 100644 --- a/docs/feature_advanced_keycodes.md +++ b/docs/feature_advanced_keycodes.md @@ -27,6 +27,7 @@ These functions allow you to activate layers in various ways. Note that layers a * `MO(layer)` - momentarily activates *layer*. As soon as you let go of the key, the layer is deactivated. * `LM(layer, mod)` - Momentarily activates *layer* (like `MO`), but with modifier(s) *mod* active. Only supports layers 0-15 and the left modifiers. * `LT(layer, kc)` - momentarily activates *layer* when held, and sends *kc* when tapped. +* `OSL(layer)` - momentarily activates *layer* until the next key is pressed. * `TG(layer)` - toggles *layer*, activating it if it's inactive and vice versa * `TO(layer)` - activates *layer* and de-activates all other layers (except your default layer). This function is special, because instead of just adding/removing one layer to your active layer stack, it will completely replace your current active layers, uniquely allowing you to replace higher layers with a lower one. This is activated on keydown (as soon as the key is pressed). * `TT(layer)` - Layer Tap-Toggle. If you hold the key down, *layer* is activated, and then is de-activated when you let go (like `MO`). If you repeatedly tap it, the layer will be toggled on or off (like `TG`). It needs 5 taps by default, but you can change this by defining `TAPPING_TOGGLE` -- for example, `#define TAPPING_TOGGLE 2` to toggle on just two taps. From 7f6bb82b9daf51fb79972871e9f85696f783aa7a Mon Sep 17 00:00:00 2001 From: Brian Choromanski Date: Tue, 9 Oct 2018 13:20:09 -0400 Subject: [PATCH 251/788] Added link to One Shot Keys --- docs/feature_advanced_keycodes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/feature_advanced_keycodes.md b/docs/feature_advanced_keycodes.md index 0f5b8618a..2ca533a28 100644 --- a/docs/feature_advanced_keycodes.md +++ b/docs/feature_advanced_keycodes.md @@ -27,7 +27,7 @@ These functions allow you to activate layers in various ways. Note that layers a * `MO(layer)` - momentarily activates *layer*. As soon as you let go of the key, the layer is deactivated. * `LM(layer, mod)` - Momentarily activates *layer* (like `MO`), but with modifier(s) *mod* active. Only supports layers 0-15 and the left modifiers. * `LT(layer, kc)` - momentarily activates *layer* when held, and sends *kc* when tapped. -* `OSL(layer)` - momentarily activates *layer* until the next key is pressed. +* `OSL(layer)` - momentarily activates *layer* until the next key is pressed. See [One Shot Keys.](#one-shot-keys) * `TG(layer)` - toggles *layer*, activating it if it's inactive and vice versa * `TO(layer)` - activates *layer* and de-activates all other layers (except your default layer). This function is special, because instead of just adding/removing one layer to your active layer stack, it will completely replace your current active layers, uniquely allowing you to replace higher layers with a lower one. This is activated on keydown (as soon as the key is pressed). * `TT(layer)` - Layer Tap-Toggle. If you hold the key down, *layer* is activated, and then is de-activated when you let go (like `MO`). If you repeatedly tap it, the layer will be toggled on or off (like `TG`). It needs 5 taps by default, but you can change this by defining `TAPPING_TOGGLE` -- for example, `#define TAPPING_TOGGLE 2` to toggle on just two taps. From 5a127293e7dfb348102afcb47d0e21b6fefad50a Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sat, 6 Oct 2018 18:02:02 -0700 Subject: [PATCH 252/788] Fix formatting in Unicode text --- docs/feature_unicode.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/feature_unicode.md b/docs/feature_unicode.md index f13eed05b..b1527b848 100644 --- a/docs/feature_unicode.md +++ b/docs/feature_unicode.md @@ -82,11 +82,11 @@ sort of like macro. Unfortunately, each OS has different ideas on how Unicode is This is the current list of Unicode input method in QMK: -* _UC_OSX_: MacOS Unicode Hex Input support. Works only up to 0xFFFF. Disabled by default. To enable: go to System Preferences -> Keyboard -> Input Sources, and enable Unicode Hex. -* _UC_OSX_RALT_: Same as UC_OSX, but sends the Right Alt key for unicode input -* _UC_LNX_: Unicode input method under Linux. Works up to 0xFFFFF. Should work almost anywhere on ibus enabled distros. Without ibus, this works under GTK apps, but rarely anywhere else. -* _UC_WIN_: (not recommended) Windows built-in Unicode input. To enable: create registry key under `HKEY_CURRENT_USER\Control Panel\Input Method\EnableHexNumpad` of type `REG_SZ` called `EnableHexNumpad`, set its value to 1, and reboot. This method is not recommended because of reliability and compatibility issue, use WinCompose method below instead. -* _UC_WINC_: Windows Unicode input using WinCompose. Requires [WinCompose](https://github.com/samhocevar/wincompose). Works reliably under many (all?) variations of Windows. +* __UC_OSX__: MacOS Unicode Hex Input support. Works only up to 0xFFFF. Disabled by default. To enable: go to System Preferences -> Keyboard -> Input Sources, and enable Unicode Hex. +* __UC_OSX_RALT__: Same as UC_OSX, but sends the Right Alt key for unicode input +* __UC_LNX__: Unicode input method under Linux. Works up to 0xFFFFF. Should work almost anywhere on ibus enabled distros. Without ibus, this works under GTK apps, but rarely anywhere else. +* __UC_WIN__: (not recommended) Windows built-in Unicode input. To enable: create registry key under `HKEY_CURRENT_USER\Control Panel\Input Method\EnableHexNumpad` of type `REG_SZ` called `EnableHexNumpad`, set its value to 1, and reboot. This method is not recommended because of reliability and compatibility issue, use WinCompose method below instead. +* __UC_WINC__: Windows Unicode input using WinCompose. Requires [WinCompose](https://github.com/samhocevar/wincompose). Works reliably under many (all?) variations of Windows. At some point, you need to call `set_unicode_input_mode(x)` to set the correct unicode method. This sets the method that is used to send the unicode, and stores it in EEPROM, so you only need to call this once. From 1df10ae3bfc146805c75b06dc0c126cd1ef3a60a Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sat, 6 Oct 2018 07:57:55 -0700 Subject: [PATCH 253/788] Update default Planck layout to be more in line with standard conventions --- keyboards/planck/keymaps/default/config.h | 6 +----- keyboards/planck/keymaps/default/keymap.c | 21 +++++++++++++++------ 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/keyboards/planck/keymaps/default/config.h b/keyboards/planck/keymaps/default/config.h index fbd2fdb27..6fa31cc8a 100644 --- a/keyboards/planck/keymaps/default/config.h +++ b/keyboards/planck/keymaps/default/config.h @@ -1,7 +1,4 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "config_common.h" +#pragma once #ifdef AUDIO_ENABLE #define STARTUP_SONG SONG(PLANCK_SOUND) @@ -40,4 +37,3 @@ // Most tactile encoders have detents every 4 stages #define ENCODER_RESOLUTION 4 -#endif diff --git a/keyboards/planck/keymaps/default/keymap.c b/keyboards/planck/keymaps/default/keymap.c index cffa5a5df..0b787cd12 100644 --- a/keyboards/planck/keymaps/default/keymap.c +++ b/keyboards/planck/keymaps/default/keymap.c @@ -14,8 +14,7 @@ * along with this program. If not, see . */ -#include "planck.h" -#include "action_layer.h" +#include QMK_KEYBOARD_H #include "muse.h" extern keymap_config_t keymap_config; @@ -276,11 +275,21 @@ void encoder_update(bool clockwise) { } } else { if (clockwise) { - register_code(KC_PGDN); - unregister_code(KC_PGDN); + #ifdef MOUSEKEY_ENABLE + register_code(KC_MS_WH_DOWN); + unregister_code(KC_MS_WH_DOWN); + #else + register_code(KC_PGDN); + unregister_code(KC_PGDN); + #endif } else { - register_code(KC_PGUP); - unregister_code(KC_PGUP); + #ifdef MOUSEKEY_ENABLE + register_code(KC_MS_WH_UP); + unregister_code(KC_MS_WH_UP); + #else + register_code(KC_PGUP); + unregister_code(KC_PGUP); + #endif } } } From f2965e1eeaf1769e106145a9d19f102fcd8fe4d4 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Wed, 10 Oct 2018 08:00:41 -0700 Subject: [PATCH 254/788] Specify max layers supported in layer keycodes --- docs/feature_advanced_keycodes.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/feature_advanced_keycodes.md b/docs/feature_advanced_keycodes.md index 2ca533a28..15109e545 100644 --- a/docs/feature_advanced_keycodes.md +++ b/docs/feature_advanced_keycodes.md @@ -26,8 +26,8 @@ These functions allow you to activate layers in various ways. Note that layers a * `DF(layer)` - switches the default layer. The default layer is the always-active base layer that other layers stack on top of. See below for more about the default layer. This might be used to switch from QWERTY to Dvorak layout. (Note that this is a temporary switch that only persists until the keyboard loses power. To modify the default layer in a persistent way requires deeper customization, such as calling the `set_single_persistent_default_layer` function inside of [process_record_user](custom_quantum_functions.md#programming-the-behavior-of-any-keycode).) * `MO(layer)` - momentarily activates *layer*. As soon as you let go of the key, the layer is deactivated. * `LM(layer, mod)` - Momentarily activates *layer* (like `MO`), but with modifier(s) *mod* active. Only supports layers 0-15 and the left modifiers. -* `LT(layer, kc)` - momentarily activates *layer* when held, and sends *kc* when tapped. -* `OSL(layer)` - momentarily activates *layer* until the next key is pressed. See [One Shot Keys.](#one-shot-keys) +* `LT(layer, kc)` - momentarily activates *layer* when held, and sends *kc* when tapped. Only supports layers 0-15. +* `OSL(layer)` - momentarily activates *layer* until the next key is pressed. See [One Shot Keys](#one-shot-keys) for details and additional functionality. * `TG(layer)` - toggles *layer*, activating it if it's inactive and vice versa * `TO(layer)` - activates *layer* and de-activates all other layers (except your default layer). This function is special, because instead of just adding/removing one layer to your active layer stack, it will completely replace your current active layers, uniquely allowing you to replace higher layers with a lower one. This is activated on keydown (as soon as the key is pressed). * `TT(layer)` - Layer Tap-Toggle. If you hold the key down, *layer* is activated, and then is de-activated when you let go (like `MO`). If you repeatedly tap it, the layer will be toggled on or off (like `TG`). It needs 5 taps by default, but you can change this by defining `TAPPING_TOGGLE` -- for example, `#define TAPPING_TOGGLE 2` to toggle on just two taps. From ab91e07753720f8114d6c427139a1436e6efa3ce Mon Sep 17 00:00:00 2001 From: patrickmt <40182064+patrickmt@users.noreply.github.com> Date: Tue, 9 Oct 2018 15:14:13 -0400 Subject: [PATCH 255/788] Massdrop keyboards console device support for hid_listen Added hid_listen USB device for arm_atsam USB protocol. Debug printing is now done through the console device (CONSOLE_ENABLE = yes) rather than the virtser device, for viewing in hid_listen. Function dpf(...) renamed to CDC_printf(...) and should now be called directly if intending to print to the virtual serial device. --- tmk_core/common.mk | 1 + tmk_core/common/arm_atsam/printf.c | 66 ++++++++ tmk_core/common/arm_atsam/printf.h | 7 +- tmk_core/protocol/arm_atsam/main_arm_atsam.c | 12 +- tmk_core/protocol/arm_atsam/usb/conf_usb.h | 5 + tmk_core/protocol/arm_atsam/usb/main_usb.c | 14 ++ tmk_core/protocol/arm_atsam/usb/udi_cdc.c | 4 +- tmk_core/protocol/arm_atsam/usb/udi_cdc.h | 1 + .../protocol/arm_atsam/usb/udi_device_conf.h | 88 +++++++++-- tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c | 146 ++++++++++++++++++ tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h | 11 ++ .../protocol/arm_atsam/usb/udi_hid_kbd_desc.c | 6 + tmk_core/protocol/arm_atsam/usb/usb_main.h | 6 + 13 files changed, 347 insertions(+), 20 deletions(-) create mode 100644 tmk_core/common/arm_atsam/printf.c diff --git a/tmk_core/common.mk b/tmk_core/common.mk index 319d196ae..4a0f7dcf9 100644 --- a/tmk_core/common.mk +++ b/tmk_core/common.mk @@ -43,6 +43,7 @@ endif endif ifeq ($(PLATFORM),ARM_ATSAM) + TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/printf.c TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom.c endif diff --git a/tmk_core/common/arm_atsam/printf.c b/tmk_core/common/arm_atsam/printf.c new file mode 100644 index 000000000..d49d234de --- /dev/null +++ b/tmk_core/common/arm_atsam/printf.c @@ -0,0 +1,66 @@ +/* +Copyright 2018 Massdrop Inc. + +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 . +*/ + +#ifdef CONSOLE_PRINT + +#include "samd51j18a.h" +#include "arm_atsam_protocol.h" +#include "printf.h" +#include +#include + +void console_printf(char *fmt, ...) { + while (udi_hid_con_b_report_trans_ongoing) {} //Wait for any previous transfers to complete + + static char console_printbuf[CONSOLE_PRINTBUF_SIZE]; //Print and send buffer + va_list va; + int result; + + va_start(va, fmt); + result = vsnprintf(console_printbuf, CONSOLE_PRINTBUF_SIZE, fmt, va); + va_end(va); + + uint32_t irqflags; + char *pconbuf = console_printbuf; //Pointer to start send from + int send_out = CONSOLE_EPSIZE; //Bytes to send per transfer + + while (result > 0) { //While not error and bytes remain + while (udi_hid_con_b_report_trans_ongoing) {} //Wait for any previous transfers to complete + + irqflags = __get_PRIMASK(); + __disable_irq(); + __DMB(); + + if (result < CONSOLE_EPSIZE) { //If remaining bytes are less than console epsize + memset(udi_hid_con_report, 0, CONSOLE_EPSIZE); //Clear the buffer + send_out = result; //Send remaining size + } + + memcpy(udi_hid_con_report, pconbuf, send_out); //Copy data into the send buffer + + udi_hid_con_b_report_valid = 1; //Set report valid + udi_hid_con_send_report(); //Send report + + __DMB(); + __set_PRIMASK(irqflags); + + result -= send_out; //Decrement result by bytes sent + pconbuf += send_out; //Increment buffer point by bytes sent + } +} + +#endif //CONSOLE_PRINT diff --git a/tmk_core/common/arm_atsam/printf.h b/tmk_core/common/arm_atsam/printf.h index 3206b40bd..1f1c2280b 100644 --- a/tmk_core/common/arm_atsam/printf.h +++ b/tmk_core/common/arm_atsam/printf.h @@ -1,8 +1,11 @@ #ifndef _PRINTF_H_ #define _PRINTF_H_ -int dpf(const char *_Format, ...); -#define __xprintf dpf +#define CONSOLE_PRINTBUF_SIZE 512 + +void console_printf(char *fmt, ...); + +#define __xprintf console_printf #endif //_PRINTF_H_ diff --git a/tmk_core/protocol/arm_atsam/main_arm_atsam.c b/tmk_core/protocol/arm_atsam/main_arm_atsam.c index 676dac4ea..54d056a14 100644 --- a/tmk_core/protocol/arm_atsam/main_arm_atsam.c +++ b/tmk_core/protocol/arm_atsam/main_arm_atsam.c @@ -276,9 +276,9 @@ int main(void) host_set_driver(&arm_atsam_driver); -#ifdef VIRTSER_ENABLE +#ifdef CONSOLE_ENABLE uint64_t next_print = 0; -#endif //VIRTSER_ENABLE +#endif //CONSOLE_ENABLE v_5v_avg = adc_get(ADC_5V); @@ -290,15 +290,17 @@ int main(void) main_subtasks(); //Note these tasks will also be run while waiting for USB keyboard polling intervals -#ifdef VIRTSER_ENABLE +#ifdef CONSOLE_ENABLE if (CLK_get_ms() > next_print) { next_print = CLK_get_ms() + 250; - dprintf("5v=%u 5vu=%u dlow=%u dhi=%u gca=%u gcd=%u\r\n",v_5v,v_5v_avg,v_5v_avg-V5_LOW,v_5v_avg-V5_HIGH,gcr_actual,gcr_desired); + //Add any debug information here that you want to see very often + //dprintf("5v=%u 5vu=%u dlow=%u dhi=%u gca=%u gcd=%u\r\n", v_5v, v_5v_avg, v_5v_avg - V5_LOW, v_5v_avg - V5_HIGH, gcr_actual, gcr_desired); } -#endif //VIRTSER_ENABLE +#endif //CONSOLE_ENABLE } + return 1; } diff --git a/tmk_core/protocol/arm_atsam/usb/conf_usb.h b/tmk_core/protocol/arm_atsam/usb/conf_usb.h index 8f0f47268..c91caffe0 100644 --- a/tmk_core/protocol/arm_atsam/usb/conf_usb.h +++ b/tmk_core/protocol/arm_atsam/usb/conf_usb.h @@ -134,6 +134,11 @@ #define UDI_HID_EXK_DISABLE_EXT() main_exk_disable() #endif +#ifdef CON +#define UDI_HID_CON_ENABLE_EXT() main_con_enable() +#define UDI_HID_CON_DISABLE_EXT() main_con_disable() +#endif + #ifdef MOU #define UDI_HID_MOU_ENABLE_EXT() main_mou_enable() #define UDI_HID_MOU_DISABLE_EXT() main_mou_disable() diff --git a/tmk_core/protocol/arm_atsam/usb/main_usb.c b/tmk_core/protocol/arm_atsam/usb/main_usb.c index e943cbcdc..0f676ab63 100644 --- a/tmk_core/protocol/arm_atsam/usb/main_usb.c +++ b/tmk_core/protocol/arm_atsam/usb/main_usb.c @@ -88,6 +88,20 @@ void main_exk_disable(void) } #endif +#ifdef CON +volatile bool main_b_con_enable = false; +bool main_con_enable(void) +{ + main_b_con_enable = true; + return true; +} + +void main_con_disable(void) +{ + main_b_con_enable = false; +} +#endif + #ifdef MOU volatile bool main_b_mou_enable = false; bool main_mou_enable(void) diff --git a/tmk_core/protocol/arm_atsam/usb/udi_cdc.c b/tmk_core/protocol/arm_atsam/usb/udi_cdc.c index 15f0f760c..5f3c289e8 100644 --- a/tmk_core/protocol/arm_atsam/usb/udi_cdc.c +++ b/tmk_core/protocol/arm_atsam/usb/udi_cdc.c @@ -1260,7 +1260,7 @@ uint32_t CDC_print(char *printbuf) char printbuf[CDC_PRINTBUF_SIZE]; -int dpf(const char *_Format, ...) +int CDC_printf(const char *_Format, ...) { va_list va; //Variable argument list variable int result; @@ -1356,7 +1356,7 @@ uint32_t CDC_print(char *printbuf) return 0; } -int dpf(const char *_Format, ...) +int CDC_printf(const char *_Format, ...) { return 0; } diff --git a/tmk_core/protocol/arm_atsam/usb/udi_cdc.h b/tmk_core/protocol/arm_atsam/usb/udi_cdc.h index e134cf236..86077ce53 100644 --- a/tmk_core/protocol/arm_atsam/usb/udi_cdc.h +++ b/tmk_core/protocol/arm_atsam/usb/udi_cdc.h @@ -365,6 +365,7 @@ extern inbuf_t inbuf; #endif //CDC uint32_t CDC_print(char *printbuf); +int CDC_printf(const char *_Format, ...); uint32_t CDC_input(void); void CDC_init(void); diff --git a/tmk_core/protocol/arm_atsam/usb/udi_device_conf.h b/tmk_core/protocol/arm_atsam/usb/udi_device_conf.h index c78726234..1e82b9ecc 100644 --- a/tmk_core/protocol/arm_atsam/usb/udi_device_conf.h +++ b/tmk_core/protocol/arm_atsam/usb/udi_device_conf.h @@ -44,10 +44,10 @@ along with this program. If not, see . #define RAW #endif -//#define CONSOLE_ENABLE //deferred implementation -//#ifdef CONSOLE_ENABLE -//#define CON -//#endif +//#define CONSOLE_ENABLE //rules.mk +#ifdef CONSOLE_ENABLE +#define CON +#endif //#define NKRO_ENABLE //rules.mk #ifdef NKRO_ENABLE @@ -110,8 +110,9 @@ along with this program. If not, see . #endif #ifdef CON -#define CONSOLE_INTERFACE NEXT_INTERFACE_4 -#define NEXT_INTERFACE_5 (CONSOLE_INTERFACE + 1) +#define CON_INTERFACE NEXT_INTERFACE_4 +#define NEXT_INTERFACE_5 (CON_INTERFACE + 1) +#define UDI_HID_CON_IFACE_NUMBER CON_INTERFACE #else #define NEXT_INTERFACE_5 NEXT_INTERFACE_4 #endif @@ -211,11 +212,16 @@ along with this program. If not, see . #endif #ifdef CON -#define CONSOLE_IN_EPNUM NEXT_IN_EPNUM_4 -#define NEXT_IN_EPNUM_5 (CONSOLE_IN_EPNUM + 1) -#define CONSOLE_OUT_EPNUM NEXT_OUT_EPNUM_1 -#define NEXT_OUT_EPNUM_2 (CONSOLE_OUT_EPNUM + 1) -#define CONSOLE_POLLING_INTERVAL 1 +#define CON_IN_EPNUM NEXT_IN_EPNUM_4 +#define UDI_HID_CON_EP_IN CON_IN_EPNUM +#define NEXT_IN_EPNUM_5 (CON_IN_EPNUM + 1) +#define CON_OUT_EPNUM NEXT_OUT_EPNUM_1 +#define UDI_HID_CON_EP_OUT CON_OUT_EPNUM +#define NEXT_OUT_EPNUM_2 (CON_OUT_EPNUM + 1) +#define CON_POLLING_INTERVAL 1 +#ifndef UDI_HID_CON_STRING_ID +#define UDI_HID_CON_STRING_ID 0 +#endif #else #define NEXT_IN_EPNUM_5 NEXT_IN_EPNUM_4 #define NEXT_OUT_EPNUM_2 NEXT_OUT_EPNUM_1 @@ -558,6 +564,66 @@ COMPILER_PACK_RESET() #endif //RAW +// ********************************************************************** +// CON Descriptor structure and content +// ********************************************************************** +#ifdef CON + +COMPILER_PACK_SET(1) + +typedef struct { + usb_iface_desc_t iface; + usb_hid_descriptor_t hid; + usb_ep_desc_t ep_out; + usb_ep_desc_t ep_in; +} udi_hid_con_desc_t; + +typedef struct { + uint8_t array[34]; +} udi_hid_con_report_desc_t; + +#define UDI_HID_CON_DESC {\ + .iface.bLength = sizeof(usb_iface_desc_t),\ + .iface.bDescriptorType = USB_DT_INTERFACE,\ + .iface.bInterfaceNumber = UDI_HID_CON_IFACE_NUMBER,\ + .iface.bAlternateSetting = 0,\ + .iface.bNumEndpoints = 2,\ + .iface.bInterfaceClass = HID_CLASS,\ + .iface.bInterfaceSubClass = HID_SUB_CLASS_NOBOOT,\ + .iface.bInterfaceProtocol = HID_SUB_CLASS_NOBOOT,\ + .iface.iInterface = UDI_HID_CON_STRING_ID,\ + .hid.bLength = sizeof(usb_hid_descriptor_t),\ + .hid.bDescriptorType = USB_DT_HID,\ + .hid.bcdHID = LE16(USB_HID_BDC_V1_11),\ + .hid.bCountryCode = USB_HID_NO_COUNTRY_CODE,\ + .hid.bNumDescriptors = USB_HID_NUM_DESC,\ + .hid.bRDescriptorType = USB_DT_HID_REPORT,\ + .hid.wDescriptorLength = LE16(sizeof(udi_hid_con_report_desc_t)),\ + .ep_out.bLength = sizeof(usb_ep_desc_t),\ + .ep_out.bDescriptorType = USB_DT_ENDPOINT,\ + .ep_out.bEndpointAddress = UDI_HID_CON_EP_OUT | USB_EP_DIR_OUT,\ + .ep_out.bmAttributes = USB_EP_TYPE_INTERRUPT,\ + .ep_out.wMaxPacketSize = LE16(CONSOLE_EPSIZE),\ + .ep_out.bInterval = CON_POLLING_INTERVAL,\ + .ep_in.bLength = sizeof(usb_ep_desc_t),\ + .ep_in.bDescriptorType = USB_DT_ENDPOINT,\ + .ep_in.bEndpointAddress = UDI_HID_CON_EP_IN | USB_EP_DIR_IN,\ + .ep_in.bmAttributes = USB_EP_TYPE_INTERRUPT,\ + .ep_in.wMaxPacketSize = LE16(CONSOLE_EPSIZE),\ + .ep_in.bInterval = CON_POLLING_INTERVAL,\ +} + +#define UDI_HID_CON_REPORT_SIZE CONSOLE_EPSIZE + +extern uint8_t udi_hid_con_report_set[UDI_HID_CON_REPORT_SIZE]; + +//report buffer +extern uint8_t udi_hid_con_report[UDI_HID_CON_REPORT_SIZE]; + +COMPILER_PACK_RESET() + +#endif //CON + // ********************************************************************** // CDC Descriptor structure and content // ********************************************************************** diff --git a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c index 1a6f7905e..18f9784ae 100644 --- a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c +++ b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c @@ -843,3 +843,149 @@ static void udi_hid_raw_setreport_valid(void) } #endif //RAW + +//******************************************************************************************** +// CON +//******************************************************************************************** +#ifdef CON + +bool udi_hid_con_enable(void); +void udi_hid_con_disable(void); +bool udi_hid_con_setup(void); +uint8_t udi_hid_con_getsetting(void); + +UDC_DESC_STORAGE udi_api_t udi_api_hid_con = { + .enable = (bool(*)(void))udi_hid_con_enable, + .disable = (void (*)(void))udi_hid_con_disable, + .setup = (bool(*)(void))udi_hid_con_setup, + .getsetting = (uint8_t(*)(void))udi_hid_con_getsetting, + .sof_notify = NULL, +}; + +COMPILER_WORD_ALIGNED +static uint8_t udi_hid_con_rate; + +COMPILER_WORD_ALIGNED +static uint8_t udi_hid_con_protocol; + +COMPILER_WORD_ALIGNED +uint8_t udi_hid_con_report_set[UDI_HID_CON_REPORT_SIZE]; + +bool udi_hid_con_b_report_valid; + +COMPILER_WORD_ALIGNED +uint8_t udi_hid_con_report[UDI_HID_CON_REPORT_SIZE]; + +volatile bool udi_hid_con_b_report_trans_ongoing; + +COMPILER_WORD_ALIGNED +static uint8_t udi_hid_con_report_trans[UDI_HID_CON_REPORT_SIZE]; + +COMPILER_WORD_ALIGNED +UDC_DESC_STORAGE udi_hid_con_report_desc_t udi_hid_con_report_desc = { + { + 0x06, 0x31, 0xFF, // Vendor Page (PJRC Teensy compatible) + 0x09, 0x74, // Vendor Usage (PJRC Teensy compatible) + 0xA1, 0x01, // Collection (Application) + 0x09, 0x75, // Usage (Vendor) + 0x15, 0x00, // Logical Minimum (0x00) + 0x26, 0xFF, 0x00, // Logical Maximum (0x00FF) + 0x95, CONSOLE_EPSIZE, // Report Count + 0x75, 0x08, // Report Size (8) + 0x81, 0x02, // Input (Data) + 0x09, 0x76, // Usage (Vendor) + 0x15, 0x00, // Logical Minimum (0x00) + 0x26, 0xFF, 0x00, // Logical Maximum (0x00FF) + 0x95, CONSOLE_EPSIZE, // Report Count + 0x75, 0x08, // Report Size (8) + 0x91, 0x02, // Output (Data) + 0xC0, // End Collection + } +}; + +static bool udi_hid_con_setreport(void); +static void udi_hid_con_setreport_valid(void); + +static void udi_hid_con_report_sent(udd_ep_status_t status, iram_size_t nb_sent, udd_ep_id_t ep); + +bool udi_hid_con_enable(void) +{ + // Initialize internal values + udi_hid_con_rate = 0; + udi_hid_con_protocol = 0; + udi_hid_con_b_report_trans_ongoing = false; + memset(udi_hid_con_report, 0, UDI_HID_CON_REPORT_SIZE); + udi_hid_con_b_report_valid = false; + return UDI_HID_CON_ENABLE_EXT(); +} + +void udi_hid_con_disable(void) +{ + UDI_HID_CON_DISABLE_EXT(); +} + +bool udi_hid_con_setup(void) +{ + return udi_hid_setup(&udi_hid_con_rate, + &udi_hid_con_protocol, + (uint8_t *) &udi_hid_con_report_desc, + udi_hid_con_setreport); +} + +uint8_t udi_hid_con_getsetting(void) +{ + return 0; +} + +static bool udi_hid_con_setreport(void) +{ + if ((USB_HID_REPORT_TYPE_OUTPUT == (udd_g_ctrlreq.req.wValue >> 8)) + && (0 == (0xFF & udd_g_ctrlreq.req.wValue)) + && (UDI_HID_CON_REPORT_SIZE == udd_g_ctrlreq.req.wLength)) { + udd_g_ctrlreq.payload = udi_hid_con_report_set; + udd_g_ctrlreq.callback = udi_hid_con_setreport_valid; + udd_g_ctrlreq.payload_size = UDI_HID_CON_REPORT_SIZE; + return true; + } + return false; +} + +bool udi_hid_con_send_report(void) +{ + if (!main_b_con_enable) { + return false; + } + + if (udi_hid_con_b_report_trans_ongoing) { + return false; + } + + memcpy(udi_hid_con_report_trans, udi_hid_con_report,UDI_HID_CON_REPORT_SIZE); + udi_hid_con_b_report_valid = false; + udi_hid_con_b_report_trans_ongoing = + udd_ep_run(UDI_HID_CON_EP_IN | USB_EP_DIR_IN, + false, + udi_hid_con_report_trans, + UDI_HID_CON_REPORT_SIZE, + udi_hid_con_report_sent); + + return udi_hid_con_b_report_trans_ongoing; +} + +static void udi_hid_con_report_sent(udd_ep_status_t status, iram_size_t nb_sent, udd_ep_id_t ep) +{ + UNUSED(status); + UNUSED(nb_sent); + UNUSED(ep); + udi_hid_con_b_report_trans_ongoing = false; + if (udi_hid_con_b_report_valid) { + udi_hid_con_send_report(); + } +} + +static void udi_hid_con_setreport_valid(void) +{ + +} + +#endif //CON diff --git a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h index babfdb7a7..e442919a9 100644 --- a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h +++ b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h @@ -85,6 +85,17 @@ extern uint8_t udi_hid_exk_report_set; bool udi_hid_exk_send_report(void); #endif //EXK +//******************************************************************************************** +// CON Console +//******************************************************************************************** +#ifdef CON +extern UDC_DESC_STORAGE udi_api_t udi_api_hid_con; +extern bool udi_hid_con_b_report_valid; +extern uint8_t udi_hid_con_report_set[UDI_HID_CON_REPORT_SIZE]; +extern volatile bool udi_hid_con_b_report_trans_ongoing; +bool udi_hid_con_send_report(void); +#endif //CON + //******************************************************************************************** // MOU Mouse //******************************************************************************************** diff --git a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd_desc.c b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd_desc.c index 16bd4e514..2d6e35e25 100644 --- a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd_desc.c +++ b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd_desc.c @@ -134,6 +134,9 @@ UDC_DESC_STORAGE udc_desc_t udc_desc = { #ifdef EXK .hid_exk = UDI_HID_EXK_DESC, #endif +#ifdef CON + .hid_con = UDI_HID_CON_DESC, +#endif #ifdef NKRO .hid_nkro = UDI_HID_NKRO_DESC, #endif @@ -155,6 +158,9 @@ UDC_DESC_STORAGE udi_api_t *udi_apis[USB_DEVICE_NB_INTERFACE] = { #ifdef EXK &udi_api_hid_exk, #endif + #ifdef CON + &udi_api_hid_con, + #endif #ifdef NKRO &udi_api_hid_nkro, #endif diff --git a/tmk_core/protocol/arm_atsam/usb/usb_main.h b/tmk_core/protocol/arm_atsam/usb/usb_main.h index b7adaa1a7..76ced474d 100644 --- a/tmk_core/protocol/arm_atsam/usb/usb_main.h +++ b/tmk_core/protocol/arm_atsam/usb/usb_main.h @@ -82,6 +82,12 @@ bool main_exk_enable(void); void main_exk_disable(void); #endif //EXK +#ifdef CON +extern volatile bool main_b_con_enable; +bool main_con_enable(void); +void main_con_disable(void); +#endif //CON + #ifdef MOU extern volatile bool main_b_mou_enable; bool main_mou_enable(void); From 79bff502471d8fd534e9266954a184aa0f7d55c3 Mon Sep 17 00:00:00 2001 From: MakotoKurauchi Date: Thu, 11 Oct 2018 04:53:18 +0900 Subject: [PATCH 256/788] Keymaps: Helix rgblight mode update (#4091) * Helix each keymap's using rgblight mode symbol instead magic number No change in build result. * Helix pico keymaps: make rgblight modes selectable. No change in build result. * Helix rev2 keymaps: make rgblight modes selectable. No change in build result. * fixed Helix froggy/keymap.c: invalid rgblight mode value 0 to 1 (=RGBLIGHT_MODE_STATIC_LIGHT) * Deselect RGB_TEST and ALTERNATING in Helix rev2,pico keymaps config.h. --- keyboards/helix/pico/keymaps/biacco/config.h | 14 ++++++++++++++ keyboards/helix/pico/keymaps/biacco/rules.mk | 2 +- keyboards/helix/pico/keymaps/default/config.h | 15 +++++++++++++++ keyboards/helix/pico/keymaps/default/keymap.c | 4 ++-- keyboards/helix/pico/keymaps/default/rules.mk | 2 +- .../helix/rev1/keymaps/OLED_sample/keymap.c | 4 ++-- keyboards/helix/rev2/keymaps/default/config.h | 18 +++++++++++++++--- keyboards/helix/rev2/keymaps/default/keymap.c | 4 ++-- keyboards/helix/rev2/keymaps/default/rules.mk | 2 +- .../helix/rev2/keymaps/edvorakjp/config.h | 18 +++++++++++++++--- .../helix/rev2/keymaps/edvorakjp/keymap.c | 4 ++-- .../helix/rev2/keymaps/edvorakjp/rules.mk | 2 +- .../helix/rev2/keymaps/five_rows_jis/config.h | 18 +++++++++++++++--- .../helix/rev2/keymaps/five_rows_jis/rules.mk | 2 +- keyboards/helix/rev2/keymaps/froggy/config.h | 18 +++++++++++++++--- keyboards/helix/rev2/keymaps/froggy/keymap.c | 8 ++++---- keyboards/helix/rev2/keymaps/froggy/rules.mk | 2 +- keyboards/helix/rev2/keymaps/yshrsmz/config.h | 15 +++++++++++++++ keyboards/helix/rev2/keymaps/yshrsmz/keymap.c | 6 +++--- keyboards/helix/rev2/keymaps/yshrsmz/rules.mk | 2 +- 20 files changed, 126 insertions(+), 34 deletions(-) diff --git a/keyboards/helix/pico/keymaps/biacco/config.h b/keyboards/helix/pico/keymaps/biacco/config.h index 776eecfb6..765318519 100644 --- a/keyboards/helix/pico/keymaps/biacco/config.h +++ b/keyboards/helix/pico/keymaps/biacco/config.h @@ -27,3 +27,17 @@ along with this program. If not, see . #define AUDIO_CLICKY #endif +// If you need more program area, try select and reduce rgblight modes to use. + +// Selection of RGBLIGHT MODE to use. +#if defined(LED_ANIMATIONS) + #define RGBLIGHT_EFFECT_BREATHING + #define RGBLIGHT_EFFECT_RAINBOW_MOOD + #define RGBLIGHT_EFFECT_RAINBOW_SWIRL + #define RGBLIGHT_EFFECT_SNAKE + #define RGBLIGHT_EFFECT_KNIGHT + #define RGBLIGHT_EFFECT_CHRISTMAS + #define RGBLIGHT_EFFECT_STATIC_GRADIENT + //#define RGBLIGHT_EFFECT_RGB_TEST + //#define RGBLIGHT_EFFECT_ALTERNATING +#endif diff --git a/keyboards/helix/pico/keymaps/biacco/rules.mk b/keyboards/helix/pico/keymaps/biacco/rules.mk index 0a720002d..4f264fa95 100644 --- a/keyboards/helix/pico/keymaps/biacco/rules.mk +++ b/keyboards/helix/pico/keymaps/biacco/rules.mk @@ -92,7 +92,7 @@ ifeq ($(strip $(IOS_DEVICE_ENABLE)), yes) endif ifeq ($(strip $(LED_ANIMATIONS)), yes) - OPT_DEFS += -DRGBLIGHT_ANIMATIONS + OPT_DEFS += -DLED_ANIMATIONS endif ifeq ($(strip $(OLED_ENABLE)), yes) diff --git a/keyboards/helix/pico/keymaps/default/config.h b/keyboards/helix/pico/keymaps/default/config.h index 6084b0970..20dfc9f98 100644 --- a/keyboards/helix/pico/keymaps/default/config.h +++ b/keyboards/helix/pico/keymaps/default/config.h @@ -28,4 +28,19 @@ along with this program. If not, see . #define AUDIO_CLICKY #endif +// If you need more program area, try select and reduce rgblight modes to use. + +// Selection of RGBLIGHT MODE to use. +#if defined(LED_ANIMATIONS) + #define RGBLIGHT_EFFECT_BREATHING + #define RGBLIGHT_EFFECT_RAINBOW_MOOD + #define RGBLIGHT_EFFECT_RAINBOW_SWIRL + #define RGBLIGHT_EFFECT_SNAKE + #define RGBLIGHT_EFFECT_KNIGHT + #define RGBLIGHT_EFFECT_CHRISTMAS + #define RGBLIGHT_EFFECT_STATIC_GRADIENT + //#define RGBLIGHT_EFFECT_RGB_TEST + //#define RGBLIGHT_EFFECT_ALTERNATING +#endif + #endif /* CONFIG_USER_H */ diff --git a/keyboards/helix/pico/keymaps/default/keymap.c b/keyboards/helix/pico/keymaps/default/keymap.c index 75221d485..4c5878517 100644 --- a/keyboards/helix/pico/keymaps/default/keymap.c +++ b/keyboards/helix/pico/keymaps/default/keymap.c @@ -238,7 +238,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } else { TOG_STATUS = !TOG_STATUS; #ifdef RGBLIGHT_ENABLE - //rgblight_mode(16); + //rgblight_mode(RGBLIGHT_MODE_SNAKE + 1); #endif } layer_on(_LOWER); @@ -261,7 +261,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } else { TOG_STATUS = !TOG_STATUS; #ifdef RGBLIGHT_ENABLE - //rgblight_mode(15); + //rgblight_mode(RGBLIGHT_MODE_SNAKE); #endif } layer_on(_RAISE); diff --git a/keyboards/helix/pico/keymaps/default/rules.mk b/keyboards/helix/pico/keymaps/default/rules.mk index afb124068..b1e219537 100644 --- a/keyboards/helix/pico/keymaps/default/rules.mk +++ b/keyboards/helix/pico/keymaps/default/rules.mk @@ -92,7 +92,7 @@ ifeq ($(strip $(IOS_DEVICE_ENABLE)), yes) endif ifeq ($(strip $(LED_ANIMATIONS)), yes) - OPT_DEFS += -DRGBLIGHT_ANIMATIONS + OPT_DEFS += -DLED_ANIMATIONS endif ifeq ($(strip $(OLED_ENABLE)), yes) diff --git a/keyboards/helix/rev1/keymaps/OLED_sample/keymap.c b/keyboards/helix/rev1/keymaps/OLED_sample/keymap.c index fa51501e6..9b81979ff 100644 --- a/keyboards/helix/rev1/keymaps/OLED_sample/keymap.c +++ b/keyboards/helix/rev1/keymaps/OLED_sample/keymap.c @@ -368,7 +368,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false } else { TOG_STATUS = !TOG_STATUS; - rgblight_mode(16); + rgblight_mode(RGBLIGHT_MODE_SNAKE + 1); } layer_on(_LOWER); update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); @@ -387,7 +387,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false } else { TOG_STATUS = !TOG_STATUS; - rgblight_mode(15); + rgblight_mode(RGBLIGHT_MODE_SNAKE); } layer_on(_RAISE); update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); diff --git a/keyboards/helix/rev2/keymaps/default/config.h b/keyboards/helix/rev2/keymaps/default/config.h index 185e67838..ed3767579 100644 --- a/keyboards/helix/rev2/keymaps/default/config.h +++ b/keyboards/helix/rev2/keymaps/default/config.h @@ -21,9 +21,21 @@ along with this program. If not, see . #ifndef CONFIG_USER_H #define CONFIG_USER_H -// if you need more program area, try uncomment follow line -//#include "serial_config_simpleapi.h" - // place overrides here +// If you need more program area, try select and reduce rgblight modes to use. + +// Selection of RGBLIGHT MODE to use. +#if defined(LED_ANIMATIONS) + #define RGBLIGHT_EFFECT_BREATHING + #define RGBLIGHT_EFFECT_RAINBOW_MOOD + #define RGBLIGHT_EFFECT_RAINBOW_SWIRL + #define RGBLIGHT_EFFECT_SNAKE + #define RGBLIGHT_EFFECT_KNIGHT + #define RGBLIGHT_EFFECT_CHRISTMAS + #define RGBLIGHT_EFFECT_STATIC_GRADIENT + //#define RGBLIGHT_EFFECT_RGB_TEST + //#define RGBLIGHT_EFFECT_ALTERNATING +#endif + #endif /* CONFIG_USER_H */ diff --git a/keyboards/helix/rev2/keymaps/default/keymap.c b/keyboards/helix/rev2/keymaps/default/keymap.c index 087bd8e51..92393208c 100644 --- a/keyboards/helix/rev2/keymaps/default/keymap.c +++ b/keyboards/helix/rev2/keymaps/default/keymap.c @@ -373,7 +373,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } else { TOG_STATUS = !TOG_STATUS; #ifdef RGBLIGHT_ENABLE - //rgblight_mode(16); + //rgblight_mode(RGBLIGHT_MODE_SNAKE + 1); #endif } layer_on(_LOWER); @@ -396,7 +396,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } else { TOG_STATUS = !TOG_STATUS; #ifdef RGBLIGHT_ENABLE - //rgblight_mode(15); + //rgblight_mode(RGBLIGHT_MODE_SNAKE); #endif } layer_on(_RAISE); diff --git a/keyboards/helix/rev2/keymaps/default/rules.mk b/keyboards/helix/rev2/keymaps/default/rules.mk index 5340a74ba..14c353d50 100644 --- a/keyboards/helix/rev2/keymaps/default/rules.mk +++ b/keyboards/helix/rev2/keymaps/default/rules.mk @@ -100,7 +100,7 @@ ifeq ($(strip $(IOS_DEVICE_ENABLE)), yes) endif ifeq ($(strip $(LED_ANIMATIONS)), yes) - OPT_DEFS += -DRGBLIGHT_ANIMATIONS + OPT_DEFS += -DLED_ANIMATIONS endif ifeq ($(strip $(OLED_ENABLE)), yes) diff --git a/keyboards/helix/rev2/keymaps/edvorakjp/config.h b/keyboards/helix/rev2/keymaps/edvorakjp/config.h index ead31605b..643220383 100644 --- a/keyboards/helix/rev2/keymaps/edvorakjp/config.h +++ b/keyboards/helix/rev2/keymaps/edvorakjp/config.h @@ -1,11 +1,23 @@ #ifndef CONFIG_USER_H #define CONFIG_USER_H -// if you need more program area, try uncomment follow line -//#include "serial_config_simpleapi.h" - #undef TAPPING_FORCE_HOLD #undef TAPPING_TERM #define TAPPING_TERM 120 +// If you need more program area, try select and reduce rgblight modes to use. + +// Selection of RGBLIGHT MODE to use. +#if defined(LED_ANIMATIONS) + #define RGBLIGHT_EFFECT_BREATHING + #define RGBLIGHT_EFFECT_RAINBOW_MOOD + #define RGBLIGHT_EFFECT_RAINBOW_SWIRL + #define RGBLIGHT_EFFECT_SNAKE + #define RGBLIGHT_EFFECT_KNIGHT + #define RGBLIGHT_EFFECT_CHRISTMAS + #define RGBLIGHT_EFFECT_STATIC_GRADIENT + //#define RGBLIGHT_EFFECT_RGB_TEST + //#define RGBLIGHT_EFFECT_ALTERNATING +#endif + #endif /* CONFIG_USER_H */ diff --git a/keyboards/helix/rev2/keymaps/edvorakjp/keymap.c b/keyboards/helix/rev2/keymaps/edvorakjp/keymap.c index 650a39115..22940f7cb 100644 --- a/keyboards/helix/rev2/keymaps/edvorakjp/keymap.c +++ b/keyboards/helix/rev2/keymaps/edvorakjp/keymap.c @@ -35,7 +35,7 @@ void matrix_scan_user(void) { #ifdef RGBLIGHT_ENABLE uint32_t layer_state_set_keymap(uint32_t state) { - rgblight_mode_noeeprom(1); + rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT); switch (biton32(state)) { case _EDVORAKJ1: case _EDVORAKJ2: @@ -52,7 +52,7 @@ uint32_t layer_state_set_keymap(uint32_t state) { rgblight_sethsv_noeeprom_green(); break; default: // for any other layers, or the default layer - rgblight_mode_noeeprom(28); + rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_GRADIENT + 3); rgblight_sethsv_noeeprom_red(); break; } diff --git a/keyboards/helix/rev2/keymaps/edvorakjp/rules.mk b/keyboards/helix/rev2/keymaps/edvorakjp/rules.mk index 67da9c370..9bd46fabc 100644 --- a/keyboards/helix/rev2/keymaps/edvorakjp/rules.mk +++ b/keyboards/helix/rev2/keymaps/edvorakjp/rules.mk @@ -102,7 +102,7 @@ ifeq ($(strip $(IOS_DEVICE_ENABLE)), yes) endif ifeq ($(strip $(LED_ANIMATIONS)), yes) - OPT_DEFS += -DRGBLIGHT_ANIMATIONS + OPT_DEFS += -DLED_ANIMATIONS endif ifeq ($(strip $(OLED_ENABLE)), yes) diff --git a/keyboards/helix/rev2/keymaps/five_rows_jis/config.h b/keyboards/helix/rev2/keymaps/five_rows_jis/config.h index c380b7db4..97494c937 100644 --- a/keyboards/helix/rev2/keymaps/five_rows_jis/config.h +++ b/keyboards/helix/rev2/keymaps/five_rows_jis/config.h @@ -23,9 +23,6 @@ along with this program. If not, see . // place overrides here -// if you need more program area, try uncomment follow line -//#include "serial_config_simpleapi.h" - #ifdef MOUSEKEY_ENABLE #undef MOUSEKEY_INTERVAL #define MOUSEKEY_INTERVAL 0 @@ -43,4 +40,19 @@ along with this program. If not, see . #define MOUSEKEY_DELAY 0 #endif +// If you need more program area, try select and reduce rgblight modes to use. + +// Selection of RGBLIGHT MODE to use. +#if defined(LED_ANIMATIONS) + #define RGBLIGHT_EFFECT_BREATHING + #define RGBLIGHT_EFFECT_RAINBOW_MOOD + #define RGBLIGHT_EFFECT_RAINBOW_SWIRL + #define RGBLIGHT_EFFECT_SNAKE + #define RGBLIGHT_EFFECT_KNIGHT + #define RGBLIGHT_EFFECT_CHRISTMAS + #define RGBLIGHT_EFFECT_STATIC_GRADIENT + //#define RGBLIGHT_EFFECT_RGB_TEST + //#define RGBLIGHT_EFFECT_ALTERNATING +#endif + #endif /* CONFIG_USER_H */ diff --git a/keyboards/helix/rev2/keymaps/five_rows_jis/rules.mk b/keyboards/helix/rev2/keymaps/five_rows_jis/rules.mk index 5340a74ba..14c353d50 100644 --- a/keyboards/helix/rev2/keymaps/five_rows_jis/rules.mk +++ b/keyboards/helix/rev2/keymaps/five_rows_jis/rules.mk @@ -100,7 +100,7 @@ ifeq ($(strip $(IOS_DEVICE_ENABLE)), yes) endif ifeq ($(strip $(LED_ANIMATIONS)), yes) - OPT_DEFS += -DRGBLIGHT_ANIMATIONS + OPT_DEFS += -DLED_ANIMATIONS endif ifeq ($(strip $(OLED_ENABLE)), yes) diff --git a/keyboards/helix/rev2/keymaps/froggy/config.h b/keyboards/helix/rev2/keymaps/froggy/config.h index dad248303..517368ae9 100644 --- a/keyboards/helix/rev2/keymaps/froggy/config.h +++ b/keyboards/helix/rev2/keymaps/froggy/config.h @@ -21,12 +21,24 @@ along with this program. If not, see . #ifndef CONFIG_USER_H #define CONFIG_USER_H -// if you need more program area, try uncomment follow line -//#include "serial_config_simpleapi.h" - #undef TAPPING_TERM #define TAPPING_TERM 200 #define ONESHOT_TAP_TOGGLE 5 /* Tapping this number of times holds the key until tapped this number of times again. */ #define ONESHOT_TIMEOUT 5000 /* Time (in ms) before the one shot key is released */ +// If you need more program area, try select and reduce rgblight modes to use. + +// Selection of RGBLIGHT MODE to use. +#if defined(LED_ANIMATIONS) + #define RGBLIGHT_EFFECT_BREATHING + #define RGBLIGHT_EFFECT_RAINBOW_MOOD + #define RGBLIGHT_EFFECT_RAINBOW_SWIRL + #define RGBLIGHT_EFFECT_SNAKE + #define RGBLIGHT_EFFECT_KNIGHT + #define RGBLIGHT_EFFECT_CHRISTMAS + #define RGBLIGHT_EFFECT_STATIC_GRADIENT + //#define RGBLIGHT_EFFECT_RGB_TEST + //#define RGBLIGHT_EFFECT_ALTERNATING +#endif + #endif /* CONFIG_USER_H */ diff --git a/keyboards/helix/rev2/keymaps/froggy/keymap.c b/keyboards/helix/rev2/keymaps/froggy/keymap.c index 81a28dfa5..75c6f0811 100644 --- a/keyboards/helix/rev2/keymaps/froggy/keymap.c +++ b/keyboards/helix/rev2/keymaps/froggy/keymap.c @@ -399,7 +399,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { #ifdef RGBLIGHT_ENABLE if (record->event.pressed) { RGBAnimation = true; - rgblight_mode(6); + rgblight_mode(RGBLIGHT_MODE_RAINBOW_MOOD); RGB_current_mode = rgblight_config.mode; } #endif @@ -408,7 +408,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { #ifdef RGBLIGHT_ENABLE if (record->event.pressed) { RGBAnimation = true; - rgblight_mode(10); + rgblight_mode(RGBLIGHT_MODE_RAINBOW_SWIRL + 1); RGB_current_mode = rgblight_config.mode; } #endif @@ -417,7 +417,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { #ifdef RGBLIGHT_ENABLE if (record->event.pressed) { RGBAnimation = true; - rgblight_mode(21); + rgblight_mode(RGBLIGHT_MODE_KNIGHT); RGB_current_mode = rgblight_config.mode; } #endif @@ -508,7 +508,7 @@ void led_ripple_effect(char r, char g, char b) { if (scan_count == -1) { rgblight_enable_noeeprom(); - rgblight_mode(0); + rgblight_mode(RGBLIGHT_MODE_STATIC_LIGHT); } else if (scan_count >= 0 && scan_count < 5) { for (unsigned char c=keybuf_begin; c!=keybuf_end; c++) { int i = c; diff --git a/keyboards/helix/rev2/keymaps/froggy/rules.mk b/keyboards/helix/rev2/keymaps/froggy/rules.mk index aa9796413..e52e4a373 100644 --- a/keyboards/helix/rev2/keymaps/froggy/rules.mk +++ b/keyboards/helix/rev2/keymaps/froggy/rules.mk @@ -100,7 +100,7 @@ ifeq ($(strip $(IOS_DEVICE_ENABLE)), yes) endif ifeq ($(strip $(LED_ANIMATIONS)), yes) - OPT_DEFS += -DRGBLIGHT_ANIMATIONS + OPT_DEFS += -DLED_ANIMATIONS endif ifeq ($(strip $(OLED_ENABLE)), yes) diff --git a/keyboards/helix/rev2/keymaps/yshrsmz/config.h b/keyboards/helix/rev2/keymaps/yshrsmz/config.h index a1cd126ee..d70f23c3e 100644 --- a/keyboards/helix/rev2/keymaps/yshrsmz/config.h +++ b/keyboards/helix/rev2/keymaps/yshrsmz/config.h @@ -21,3 +21,18 @@ along with this program. If not, see . /* auto shift config */ #define AUTO_SHIFT_TIMEOUT 150 + +// If you need more program area, try select and reduce rgblight modes to use. + +// Selection of RGBLIGHT MODE to use. +#if defined(LED_ANIMATIONS) + #define RGBLIGHT_EFFECT_BREATHING + #define RGBLIGHT_EFFECT_RAINBOW_MOOD + #define RGBLIGHT_EFFECT_RAINBOW_SWIRL + #define RGBLIGHT_EFFECT_SNAKE + #define RGBLIGHT_EFFECT_KNIGHT + #define RGBLIGHT_EFFECT_CHRISTMAS + #define RGBLIGHT_EFFECT_STATIC_GRADIENT + //#define RGBLIGHT_EFFECT_RGB_TEST + //#define RGBLIGHT_EFFECT_ALTERNATING +#endif diff --git a/keyboards/helix/rev2/keymaps/yshrsmz/keymap.c b/keyboards/helix/rev2/keymaps/yshrsmz/keymap.c index cce28796e..049a864c1 100644 --- a/keyboards/helix/rev2/keymaps/yshrsmz/keymap.c +++ b/keyboards/helix/rev2/keymaps/yshrsmz/keymap.c @@ -312,7 +312,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } else { TOG_STATUS = !TOG_STATUS; #ifdef RGBLIGHT_ENABLE - //rgblight_mode(16); + //rgblight_mode(RGBLIGHT_MODE_SNAKE + 1); #endif } layer_on(_LOWER); @@ -335,7 +335,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } else { TOG_STATUS = !TOG_STATUS; #ifdef RGBLIGHT_ENABLE - //rgblight_mode(15); + //rgblight_mode(RGBLIGHT_MODE_SNAKE); #endif } layer_on(_RAISE); @@ -450,7 +450,7 @@ void music_scale_user(void) // hook point for 'led_test' keymap // 'default' keymap's led_test_init() is empty function, do nothing -// 'led_test' keymap's led_test_init() force rgblight_mode_noeeprom(35); +// 'led_test' keymap's led_test_init() force rgblight_mode_noeeprom(RGBLIGHT_MODE_RGB_TEST); __attribute__ ((weak)) void led_test_init(void) {} diff --git a/keyboards/helix/rev2/keymaps/yshrsmz/rules.mk b/keyboards/helix/rev2/keymaps/yshrsmz/rules.mk index da439dc9b..8331a2e1d 100644 --- a/keyboards/helix/rev2/keymaps/yshrsmz/rules.mk +++ b/keyboards/helix/rev2/keymaps/yshrsmz/rules.mk @@ -99,7 +99,7 @@ ifeq ($(strip $(IOS_DEVICE_ENABLE)), yes) endif ifeq ($(strip $(LED_ANIMATIONS)), yes) - OPT_DEFS += -DRGBLIGHT_ANIMATIONS + OPT_DEFS += -DLED_ANIMATIONS endif ifeq ($(strip $(OLED_ENABLE)), yes) From 7d156263ab81ff960adab6b80134f5202df67048 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Wed, 10 Oct 2018 12:56:45 -0700 Subject: [PATCH 257/788] Orange75: cleanup and Configurator support update (#4101) * Orange75: cleanup and Configurator support update `orange75.h`: Moved `K014` to the second (number row) as the left half of a split Backspace (guessing at its true location; will need to be checked/tested after merge). `info.json`: Updated to match new `LAYOUT` macro. `keymaps/default/keymap.c`: - Updated to match new `LAYOUT` macro. - Added layer mock-ups as block comments. - Formatted to be a bit more readable. * Orange75: deleted an extra comma from keymap.c --- keyboards/orange75/info.json | 98 +++++++++++++++++++-- keyboards/orange75/keymaps/default/keymap.c | 56 +++++++++--- keyboards/orange75/orange75.h | 12 +-- 3 files changed, 141 insertions(+), 25 deletions(-) diff --git a/keyboards/orange75/info.json b/keyboards/orange75/info.json index 093b4cd4e..e6a70c102 100644 --- a/keyboards/orange75/info.json +++ b/keyboards/orange75/info.json @@ -1,12 +1,96 @@ { - "keyboard_name": "Orange75", - "url": "", - "maintainer": "qmk", - "width": 16, - "height": 6.25, + "keyboard_name": "Orange75", + "url": "", + "maintainer": "qmk", + "width": 16, + "height": 6.25, "layouts": { "LAYOUT": { - "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"F1", "x":2, "y":0}, {"label":"F2", "x":3, "y":0}, {"label":"F3", "x":4, "y":0}, {"label":"F4", "x":5, "y":0}, {"label":"F5", "x":6.5, "y":0}, {"label":"F6", "x":7.5, "y":0}, {"label":"F7", "x":8.5, "y":0}, {"label":"F8", "x":9.5, "y":0}, {"label":"F9", "x":11, "y":0}, {"label":"F10", "x":12, "y":0}, {"label":"F11", "x":13, "y":0}, {"label":"F12", "x":14, "y":0}, {"label":"~", "x":0, "y":1.25}, {"label":"!", "x":1, "y":1.25}, {"label":"@", "x":2, "y":1.25}, {"label":"#", "x":3, "y":1.25}, {"label":"$", "x":4, "y":1.25}, {"label":"%", "x":5, "y":1.25}, {"label":"^", "x":6, "y":1.25}, {"label":"&", "x":7, "y":1.25}, {"label":"*", "x":8, "y":1.25}, {"label":"(", "x":9, "y":1.25}, {"label":")", "x":10, "y":1.25}, {"label":"_", "x":11, "y":1.25}, {"label":"+", "x":12, "y":1.25}, {"label":"Backspace", "x":13, "y":1.25, "w":2}, {"label":"Home", "x":15, "y":1.25}, {"label":"Tab", "x":0, "y":2.25, "w":1.5}, {"label":"Q", "x":1.5, "y":2.25}, {"label":"W", "x":2.5, "y":2.25}, {"label":"E", "x":3.5, "y":2.25}, {"label":"R", "x":4.5, "y":2.25}, {"label":"T", "x":5.5, "y":2.25}, {"label":"Y", "x":6.5, "y":2.25}, {"label":"U", "x":7.5, "y":2.25}, {"label":"I", "x":8.5, "y":2.25}, {"label":"O", "x":9.5, "y":2.25}, {"label":"P", "x":10.5, "y":2.25}, {"label":"{", "x":11.5, "y":2.25}, {"label":"}", "x":12.5, "y":2.25}, {"label":"|", "x":13.5, "y":2.25, "w":1.5}, {"label":"End", "x":15, "y":2.25}, {"label":"Caps Lock", "x":0, "y":3.25, "w":1.75}, {"label":"A", "x":1.75, "y":3.25}, {"label":"S", "x":2.75, "y":3.25}, {"label":"D", "x":3.75, "y":3.25}, {"label":"F", "x":4.75, "y":3.25}, {"label":"G", "x":5.75, "y":3.25}, {"label":"H", "x":6.75, "y":3.25}, {"label":"J", "x":7.75, "y":3.25}, {"label":"K", "x":8.75, "y":3.25}, {"label":"L", "x":9.75, "y":3.25}, {"label":":", "x":10.75, "y":3.25}, {"label":"\"", "x":11.75, "y":3.25}, {"label":"Enter", "x":12.75, "y":3.25, "w":2.25}, {"label":"Page Up", "x":15, "y":3.25}, {"label":"Shift", "x":0, "y":4.25, "w":2.25}, {"label":"Z", "x":2.25, "y":4.25}, {"label":"X", "x":3.25, "y":4.25}, {"label":"C", "x":4.25, "y":4.25}, {"label":"V", "x":5.25, "y":4.25}, {"label":"B", "x":6.25, "y":4.25}, {"label":"N", "x":7.25, "y":4.25}, {"label":"M", "x":8.25, "y":4.25}, {"label":"<", "x":9.25, "y":4.25}, {"label":">", "x":10.25, "y":4.25}, {"label":"?", "x":11.25, "y":4.25}, {"label":"Shift", "x":12.25, "y":4.25, "w":1.75}, {"label":"Up", "x":14, "y":4.25}, {"label":"Page Down", "x":15, "y":4.25}, {"label":"Ctrl", "x":0, "y":5.25, "w":1.25}, {"label":"Win", "x":1.25, "y":5.25, "w":1.25}, {"label":"Alt", "x":2.5, "y":5.25, "w":1.25}, {"x":3.75, "y":5.25, "w":6.25}, {"label":"Alt", "x":10, "y":5.25, "w":1.25}, {"label":"Fn", "x":11.25, "y":5.25, "w":1.25}, {"label":"Left", "x":13, "y":5.25}, {"label":"Down", "x":14, "y":5.25}, {"label":"Right", "x":15, "y":5.25}] + "key_count": 82, + "layout": [ + {"label":"Esc", "x":0, "y":0}, + {"label":"F1", "x":2, "y":0}, + {"label":"F2", "x":3, "y":0}, + {"label":"F3", "x":4, "y":0}, + {"label":"F4", "x":5, "y":0}, + {"label":"F5", "x":6.5, "y":0}, + {"label":"F6", "x":7.5, "y":0}, + {"label":"F7", "x":8.5, "y":0}, + {"label":"F8", "x":9.5, "y":0}, + {"label":"F9", "x":11, "y":0}, + {"label":"F10", "x":12, "y":0}, + {"label":"F11", "x":13, "y":0}, + {"label":"F12", "x":14, "y":0}, + {"label":"`", "x":0, "y":1.25}, + {"label":"1", "x":1, "y":1.25}, + {"label":"2", "x":2, "y":1.25}, + {"label":"3", "x":3, "y":1.25}, + {"label":"4", "x":4, "y":1.25}, + {"label":"5", "x":5, "y":1.25}, + {"label":"6", "x":6, "y":1.25}, + {"label":"7", "x":7, "y":1.25}, + {"label":"8", "x":8, "y":1.25}, + {"label":"9", "x":9, "y":1.25}, + {"label":"0", "x":10, "y":1.25}, + {"label":"-", "x":11, "y":1.25}, + {"label":"=", "x":12, "y":1.25}, + {"label":"Delete", "x":13, "y":1.25}, + {"label":"Back Space", "x":14, "y":1.25}, + {"label":"Home", "x":15, "y":1.25}, + {"label":"Tab", "x":0, "y":2.25, "w":1.5}, + {"label":"Q", "x":1.5, "y":2.25}, + {"label":"W", "x":2.5, "y":2.25}, + {"label":"E", "x":3.5, "y":2.25}, + {"label":"R", "x":4.5, "y":2.25}, + {"label":"T", "x":5.5, "y":2.25}, + {"label":"Y", "x":6.5, "y":2.25}, + {"label":"U", "x":7.5, "y":2.25}, + {"label":"I", "x":8.5, "y":2.25}, + {"label":"O", "x":9.5, "y":2.25}, + {"label":"P", "x":10.5, "y":2.25}, + {"label":"[", "x":11.5, "y":2.25}, + {"label":"]", "x":12.5, "y":2.25}, + {"label":"\\", "x":13.5, "y":2.25, "w":1.5}, + {"label":"End", "x":15, "y":2.25}, + {"label":"Caps Lock", "x":0, "y":3.25, "w":1.75}, + {"label":"A", "x":1.75, "y":3.25}, + {"label":"S", "x":2.75, "y":3.25}, + {"label":"D", "x":3.75, "y":3.25}, + {"label":"F", "x":4.75, "y":3.25}, + {"label":"G", "x":5.75, "y":3.25}, + {"label":"H", "x":6.75, "y":3.25}, + {"label":"J", "x":7.75, "y":3.25}, + {"label":"K", "x":8.75, "y":3.25}, + {"label":"L", "x":9.75, "y":3.25}, + {"label":";", "x":10.75, "y":3.25}, + {"label":"'", "x":11.75, "y":3.25}, + {"label":"Enter", "x":12.75, "y":3.25, "w":2.25}, + {"label":"PgUp", "x":15, "y":3.25}, + {"label":"Shift", "x":0, "y":4.25, "w":1.25}, + {"label":"ISO\\", "x":1.25, "y":4.25}, + {"label":"Z", "x":2.25, "y":4.25}, + {"label":"X", "x":3.25, "y":4.25}, + {"label":"C", "x":4.25, "y":4.25}, + {"label":"V", "x":5.25, "y":4.25}, + {"label":"B", "x":6.25, "y":4.25}, + {"label":"N", "x":7.25, "y":4.25}, + {"label":"M", "x":8.25, "y":4.25}, + {"label":",", "x":9.25, "y":4.25}, + {"label":".", "x":10.25, "y":4.25}, + {"label":"/", "x":11.25, "y":4.25}, + {"label":"Shift", "x":12.25, "y":4.25, "w":1.75}, + {"label":"Up", "x":14, "y":4.25}, + {"label":"PgDn", "x":15, "y":4.25}, + {"label":"Ctrl", "x":0, "y":5.25, "w":1.25}, + {"label":"GUI", "x":1.25, "y":5.25, "w":1.25}, + {"label":"Alt", "x":2.5, "y":5.25, "w":1.25}, + {"label":"Space", "x":3.75, "y":5.25, "w":6.25}, + {"label":"Alt", "x":10, "y":5.25, "w":1.25}, + {"label":"Fn", "x":11.25, "y":5.25, "w":1.25}, + {"label":"Left", "x":13, "y":5.25}, + {"label":"Down", "x":14, "y":5.25}, + {"label":"Right", "x":15, "y":5.25} + ] } } -} \ No newline at end of file +} diff --git a/keyboards/orange75/keymaps/default/keymap.c b/keyboards/orange75/keymaps/default/keymap.c index 50aaf718e..37e198f99 100644 --- a/keyboards/orange75/keymaps/default/keymap.c +++ b/keyboards/orange75/keymaps/default/keymap.c @@ -3,21 +3,53 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* + * ,---------------------------------------------------------------. + * |Esc|▓▓▓|F1 |F2 |F3 |F4 |▓|F5 |F6 |F7 |F8 |▓|F9 |F10|F11|F12|▓▓▓| + * |---------------------------------------------------------------| + * |` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 |- |= |Del|Bsp|Hm | + * |---------------------------------------------------------------| + * |Tab |Q |W |E |R |T |Y |U |I |O |P |[ |] |\ |End| + * |---------------------------------------------------------------| + * |Caps |A |S |D |F |G |H |J |K |L |; |' |Enter |PgU| + * |---------------------------------------------------------------| + * |Shft|\ |Z |X |C |V |B |N |M |, |. |/ |Shift |Up |PgD| + * |---------------------------------------------------------------| + * |Ctrl|GUI |Alt |Space |Alt |Fn |▓|Lt |Dn |Rt | + * `---------------------------------------------------------------' + */ LAYOUT( - KC_ESC, KC_F1,KC_F2,KC_F3,KC_F4,KC_F5,KC_F6,KC_F7,KC_F8,KC_F9,KC_F10,KC_F11, KC_F12, KC_DEL, - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_HOME, - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_END, - KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP, - KC_LSFT, LT(1, KC_NO), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, KC_UP, KC_PGDN, - KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_LALT, LT(1, KC_NO), KC_LEFT, KC_DOWN, KC_RGHT), + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_DEL, KC_BSPC, KC_HOME, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_END, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP, + KC_LSFT, LT(1, KC_NO), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, KC_UP, KC_PGDN, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_LALT, LT(1, KC_NO), KC_LEFT, KC_DOWN, KC_RGHT + ), + /* + * ,---------------------------------------------------------------. + * |RST|▓▓▓| | | | |▓| | | | |▓| | | | |▓▓▓| + * |---------------------------------------------------------------| + * |` | | | | | | | | | | | | | | |Tog| + * |---------------------------------------------------------------| + * | | | | | | | | | | | | | | |Stp| + * |---------------------------------------------------------------| + * | | | | | | | | | | | | | |BL+| + * |---------------------------------------------------------------| + * | | | | | | | | | | | | | | |BL-| + * |---------------------------------------------------------------| + * | | | | | | |▓| | | | + * `---------------------------------------------------------------' + */ LAYOUT( - RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, BL_TOGG, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, BL_STEP, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, BL_INC, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, BL_DEC, - _______, _______, _______, _______, _______, _______, _______, _______, _______) + RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, BL_TOGG, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, BL_STEP, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, BL_INC, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, BL_DEC, + _______, _______, _______, _______, _______, _______, _______, _______, _______ + ) }; diff --git a/keyboards/orange75/orange75.h b/keyboards/orange75/orange75.h index 1b351a595..a7ddd5a06 100644 --- a/keyboards/orange75/orange75.h +++ b/keyboards/orange75/orange75.h @@ -3,12 +3,12 @@ #include "quantum.h" #define LAYOUT( \ - K000, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, \ - K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \ - K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, \ - K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K314, \ - K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414, \ - K500, K501, K502, K506, K510, K511, K512, K513, K514 \ + K000, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K014, K113, K114, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, \ + K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K314, \ + K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414, \ + K500, K501, K502, K506, K510, K511, K512, K513, K514 \ ) { \ { K000, K100, K200, K300, K400, K500 }, \ { KC_NO, K101, K201, K301, K401, K501 }, \ From d17421d074402765204c0e7b09007906e91af7dc Mon Sep 17 00:00:00 2001 From: pgillan145 Date: Wed, 10 Oct 2018 15:58:11 -0400 Subject: [PATCH 258/788] Added cheese keymap to tada68. (#4105) * Added cheese keymap to tada68. * Removed extraneous definitions. --- keyboards/tada68/keymaps/cheese/keymap.c | 107 ++++++++++++++++++++++ keyboards/tada68/keymaps/cheese/readme.md | 20 ++++ keyboards/tada68/keymaps/cheese/rules.mk | 18 ++++ 3 files changed, 145 insertions(+) create mode 100755 keyboards/tada68/keymaps/cheese/keymap.c create mode 100755 keyboards/tada68/keymaps/cheese/readme.md create mode 100644 keyboards/tada68/keymaps/cheese/rules.mk diff --git a/keyboards/tada68/keymaps/cheese/keymap.c b/keyboards/tada68/keymaps/cheese/keymap.c new file mode 100755 index 000000000..b2395282c --- /dev/null +++ b/keyboards/tada68/keymaps/cheese/keymap.c @@ -0,0 +1,107 @@ +#include QMK_KEYBOARD_H + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _BL 0 +#define _FL 1 +#define _CL 2 +#define _AL 3 + +enum custom_keycodes { + SPX4 = SAFE_RANGE +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (record->event.pressed) { + switch(keycode) { + case SPX4: + SEND_STRING(" "); + return false; + } + } + return true; +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Keymap _BL: (Base Layer) Default Layer + * ,----------------------------------------------------------------. + * |Esc | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp |~ ` | + * |----------------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ |PgUp| + * |----------------------------------------------------------------| + * |CAPS | A| S| D| F| G| H| J| K| L| ;| '|Return |PgDn| + * |----------------------------------------------------------------| + * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | Up|Del | + * |----------------------------------------------------------------| + * |Ctrl|Win |Win | Space |Win| FN|Ctrl|Lef|Dow|Rig | + * `----------------------------------------------------------------' + */ +[_BL] = LAYOUT_ansi( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,KC_BSLS, KC_PGUP, \ + MO(_CL), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_ENT, KC_PGDN, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_DEL, \ + KC_LCTL, KC_LALT,LM(_AL,0x08), KC_SPC, LM(_AL,0x18),MO(_FL),KC_RCTRL, KC_LEFT,KC_DOWN,KC_RGHT), + + /* Keymap _FL: Function Layer + * ,----------------------------------------------------------------. + * | | F1|F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12|Del |` ~ | + * |----------------------------------------------------------------| + * | | |Up | | | | | | | | | | | |Hme | + * |----------------------------------------------------------------| + * | |<- |Dn | ->| | | | | | | | | |End | + * |----------------------------------------------------------------| + * | | | |Bl-|BL |BL+| |MUT|VU-|VU+| | | | | + * |----------------------------------------------------------------| + * | | | | | | | | | | | + * `----------------------------------------------------------------' + */ +[_FL] = LAYOUT_ansi( + _______, KC_F1 ,KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_GRV, \ + SPX4,_______, KC_UP,_______,_______, _______,_______,_______,_______,_______,_______,_______,_______, _______,KC_HOME, \ + _______,KC_LEFT,KC_DOWN,KC_RIGHT,_______,_______,_______,_______,_______,_______,_______,_______, _______,KC_END, \ + _______,_______,_______,BL_DEC, BL_TOGG,BL_INC, _______,KC_MUTE,KC_VOLD,KC_VOLU,_______,_______, _______, _______, \ + _______,_______,_______, _______, _______,_______,_______,_______,_______, _______), + + /* Keymap _CL: Caps Layer + * ,----------------------------------------------------------------. + * | | F1|F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12|Del |` ~ | + * |----------------------------------------------------------------| + * | | |Up | | | | | | | | | | | |Hme | + * |----------------------------------------------------------------| + * | |<- |Dn | ->| | | | | | | | | |End | + * |----------------------------------------------------------------| + * | | | |Bl-|BL |BL+| |MUT|VU-|VU+| | McL|MsU|McR | + * |----------------------------------------------------------------| + * | | | | | | | |MsL|MsD|MsR | + * `----------------------------------------------------------------' + */ +[_CL] = LAYOUT_ansi( + _______, KC_F1 ,KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_GRV , \ + _______,_______, KC_UP,_______,_______, _______,_______,_______,_______,_______,_______,_______,_______, _______,KC_HOME, \ + _______,KC_LEFT,KC_DOWN,KC_RIGHT,_______,_______,_______,_______,_______,_______,_______,_______, _______,KC_END, \ + _______,_______,_______,BL_DEC, BL_TOGG,BL_INC, _______,KC_MUTE,KC_VOLD,KC_VOLU,_______,KC_BTN1, KC_MS_U, KC_BTN2, \ + _______,_______,_______, _______, _______,_______,_______,KC_MS_L,KC_MS_D, KC_MS_R), + + /* Keymap _AL: ALT Layer + * ,----------------------------------------------------------------. + * |` ~| | | | | | | | | | | | | | ` ~| + * |----------------------------------------------------------------| + * | | | | | | | | | | | | | | | | + * |----------------------------------------------------------------| + * | | | | | | | | | | | | | | | + * |----------------------------------------------------------------| + * | | | | | | | | | | | | | | | + * |----------------------------------------------------------------| + * | | | | | | | | | | | + * `----------------------------------------------------------------' + */ +[_AL] = LAYOUT_ansi( + KC_GRV, _______ ,_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_GRV , \ + _______,_______, _______, _______,_______, _______,_______,_______,_______,_______,_______,_______,_______, _______,_______, \ + _______,_______, _______, _______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______, \ + _______,_______,_______, _______, _______, _______, _______, _______, _______, _______,_______, _______, _______, _______, \ + _______,_______,_______, _______, _______,_______,_______, _______, _______, _______), +}; diff --git a/keyboards/tada68/keymaps/cheese/readme.md b/keyboards/tada68/keymaps/cheese/readme.md new file mode 100755 index 000000000..8374e469b --- /dev/null +++ b/keyboards/tada68/keymaps/cheese/readme.md @@ -0,0 +1,20 @@ +# pgillan's Cheese TADA68 layout + +A collection of tweaks to make the keyboard more mac friendly and increase personal usability, +based on the default keymap. + +* Turned the caps-lock into an additional function key so I didn't have to try to hit the + the keys on the right with one hand. +* Moved the arrow/mouse controls to the caps-lock layer from the function layer. +* Swapped the Windows key and Alt keys, I didn't have to do it in OS X. +* Made the escape key work as a backtick when "Alt" is depressed, so I can 1) reverse + direction when I Alt-Tab through current applications, and Alt-Backtick through + open windows. +* Turned the backtick/tilde key into another backspace key, so I can just go all the way + up to the corner without overshooting. +* Adjusted the volume controles so M is "mute", the "," ( or "<") is "down", and "." (or ">") + is "up". It just makes a ton more sense, I have no idea why it would have been done any + differently. +* Moved PageUp/PageDown up above the delete key, and made the Home and End on the capslock + and function layers. +* Made the tab key on the function layer output 4 spaces instead of a tab character. diff --git a/keyboards/tada68/keymaps/cheese/rules.mk b/keyboards/tada68/keymaps/cheese/rules.mk new file mode 100644 index 000000000..fdbd25ea8 --- /dev/null +++ b/keyboards/tada68/keymaps/cheese/rules.mk @@ -0,0 +1,18 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + From 0e142138aa5c4daa3f113f5a402060cde3efdea9 Mon Sep 17 00:00:00 2001 From: noroadsleft Date: Tue, 9 Oct 2018 01:21:38 -0700 Subject: [PATCH 259/788] evil80: Add readme.md file --- keyboards/evil80/readme.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 keyboards/evil80/readme.md diff --git a/keyboards/evil80/readme.md b/keyboards/evil80/readme.md new file mode 100644 index 000000000..bc21855eb --- /dev/null +++ b/keyboards/evil80/readme.md @@ -0,0 +1,15 @@ +# Evil 80 + +![Evil 80](https://i.imgur.com/f5dKuML.jpg) + +Also known as the Odyssey, the Evil 80 is a QMK-powered aluminum TKL keyboard featuring an Aviator connector cable. Sold via a Geekhack group buy in January of 2018. + +Keyboard Maintainer: [The QMK Community](https://github.com/qmk) +Hardware Supported: Evil 80-Odyssey QMK version +Hardware Availability: [Geekhack](https://geekhack.org/index.php?topic=93434.0) + +Make example for this keyboard (after setting up your build environment): + + make evil80:default + +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). From 6c55e8cab5a1cc43c0c024344727ceb243d98f5a Mon Sep 17 00:00:00 2001 From: Boris Burger Date: Wed, 10 Oct 2018 23:17:42 +0200 Subject: [PATCH 260/788] Keymap: DZ60 layout based on stephengrier's with PgUp/PgDn/Home/End, Insert, etc. (#4110) * DZ60 layout based on stephengrier's with customisations. * CapsLock is used as Fn key. * Del is available as Fn+Backspace & Shift+Backspace (using a macro) * PgUp / PgDn / Home / End = Fn+Arrows (as on macOS, Microsoft Surface) * Tilde = Shift+Esc * Backtick = Fn+Esc * Underglow toggle and mode selection are available as Fn+Q and Fn+W * Reset (bootloader mode) = Fn+B * Standardised layout formatting and Ctrl+Del & Shift+Del support. Using 7 underscores for KC_TRNS in layouts and aligning the keycodes according to LAYOUT_directional. Del is now only Fn+Del, Ctrl+Backspace translates to Ctrl+Del, Shift+Backspace translates to Shift+Del. * Documented new Backspace/Del related macros. Del is now just Fn+Backspace, pressing Ctrl+Backspace sends Ctrl+Del, pressing Shift+Backspace sends Shift+Del --- keyboards/dz60/keymaps/boris_burger/README.md | 52 +++++++++++ keyboards/dz60/keymaps/boris_burger/config.h | 1 + keyboards/dz60/keymaps/boris_burger/keymap.c | 87 +++++++++++++++++++ 3 files changed, 140 insertions(+) create mode 100644 keyboards/dz60/keymaps/boris_burger/README.md create mode 100644 keyboards/dz60/keymaps/boris_burger/config.h create mode 100644 keyboards/dz60/keymaps/boris_burger/keymap.c diff --git a/keyboards/dz60/keymaps/boris_burger/README.md b/keyboards/dz60/keymaps/boris_burger/README.md new file mode 100644 index 000000000..64062f823 --- /dev/null +++ b/keyboards/dz60/keymaps/boris_burger/README.md @@ -0,0 +1,52 @@ +### boris_burger's DZ60 layout + +This layout is for a DZ60 with a 2U left shift, 1U right shift and an arrow cluster in +the bottom right. + +It is based off stephengrier's layout adding support for Home/End/PgUp/PgDn using Fn+arrows +as used on macOS and Microsoft Surface. It has Insert instead of Fn near the arrow cluster +and other smaller tweaks: +- CapsLock is the only Fn key (CapsLock by itself is not available) +- Del is available as Fn+Backspace +- Ctrl+Del is available as Ctrl+Backspace (e.g. deleting word to the right of the cursor) +- Shift+Del is available as Shift+Backspace (e.g. permanently deleting file or e-mail) +- PgUp = Fn+Up +- PgDn = Fn+Down +- Home = Fn+Left +- End = Fn+Right +- Tilde = Shift+Esc +- Backtick = Fn+Esc +- Underglow toggle and mode selection are available as Fn+Q and Fn+W +- Reset (bootloader mode) = Fn+B + +### 0 Qwerty +``` +,-----------------------------------------------------------------------------------------. +| Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Bkspc | +|-----------------------------------------------------------------------------------------+ +| Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | +|-----------------------------------------------------------------------------------------+ +| Fn | A | S | D | F | G | H | J | K | L | ; | ' | Enter | +|-----------------------------------------------------------------------------------------+ +| Shift | Z | X | C | V | B | N | M | , | . | / | RSh | U | Ins | +|-----------------------------------------------------------------------------------------+ +| Ctrl | Win | Alt | Space | Alt | Menu | L | D | R | +`-----------------------------------------------------------------------------------------' +``` + +### 1 Fn Layer +``` +FN Layer +,-----------------------------------------------------------------------------------------. +| ` | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | DEL | +|-----------------------------------------------------------------------------------------+ +| |RBB T|RGB M| Hue+| Hue-| Sat+| Sat-| Val+| Val-| | | | | | +|-----------------------------------------------------------------------------------------+ +| | BL T| BL M| BL+ | BL- | | | | | | | | | +|-----------------------------------------------------------------------------------------+ +| | | | | |RESET| | | | | | | PgUp| | +|-----------------------------------------------------------------------------------------+ +| | | | | | | Home| PgDn| End | +`-----------------------------------------------------------------------------------------' +``` + diff --git a/keyboards/dz60/keymaps/boris_burger/config.h b/keyboards/dz60/keymaps/boris_burger/config.h new file mode 100644 index 000000000..9560d51a6 --- /dev/null +++ b/keyboards/dz60/keymaps/boris_burger/config.h @@ -0,0 +1 @@ +#define GRAVE_ESC_GUI_OVERRIDE # Always send Escape if GUI is pressed diff --git a/keyboards/dz60/keymaps/boris_burger/keymap.c b/keyboards/dz60/keymaps/boris_burger/keymap.c new file mode 100644 index 000000000..5dcadf34c --- /dev/null +++ b/keyboards/dz60/keymaps/boris_burger/keymap.c @@ -0,0 +1,87 @@ +#include QMK_KEYBOARD_H + +/* Holds state of modifiers when Backspace was pressed. + * Used to ensure that the correct keycode is unregistered when Backspace is released. + */ +static uint8_t bspc_mods = 0; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* Qwerty + * ,-----------------------------------------------------------------------------------------. + * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Bkspc | + * |-----------------------------------------------------------------------------------------+ + * | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | + * |-----------------------------------------------------------------------------------------+ + * | Fn | A | S | D | F | G | H | J | K | L | ; | ' | Enter | + * |-----------------------------------------------------------------------------------------+ + * | Shift | Z | X | C | V | B | N | M | , | . | / | RSh | U | Ins | + * |-----------------------------------------------------------------------------------------+ + * | Ctrl | Win | Alt | Space | Alt | Menu | L | D | R | + * `-----------------------------------------------------------------------------------------' + */ + LAYOUT_directional( + KC_GESC, KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_MINS, KC_EQL , _______, KC_BSPC, + KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , KC_LBRC, KC_RBRC, KC_BSLS, + MO(1) , KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_SCLN, KC_QUOT, KC_ENT , + KC_LSFT, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, KC_RSFT, KC_UP , KC_INS , + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC , KC_SPC , KC_SPC , KC_RALT, KC_RGUI, KC_LEFT, KC_DOWN, KC_RIGHT + ), + + /* FN Layer + * ,-----------------------------------------------------------------------------------------. + * | ` | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | DEL | + * |-----------------------------------------------------------------------------------------+ + * | |RBB T|RGB M| Hue+| Hue-| Sat+| Sat-| Val+| Val-| | | | | | + * |-----------------------------------------------------------------------------------------+ + * | | BL T| BL M| BL+ | BL- | | | | | | | | | + * |-----------------------------------------------------------------------------------------+ + * | | | | | |RESET| | | | | | | PgUp| | + * |-----------------------------------------------------------------------------------------+ + * | | | | | | | Home| PgDn| End | + * `-----------------------------------------------------------------------------------------' + */ + LAYOUT_directional( + KC_GRV , KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , KC_F12 , _______, KC_DEL , + _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, + _______, BL_TOGG, BL_STEP, BL_INC , BL_DEC , _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, RESET , _______, _______, _______, _______, _______, _______, KC_PGUP, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_END + ), +}; + + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch(keycode) { + case KC_BSPC: { + if (record->event.pressed) { + const uint8_t current_mods = get_mods(); + const uint8_t shift = current_mods & (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)); + const uint8_t ctrl = current_mods & (MOD_BIT(KC_LCTL)|MOD_BIT(KC_RCTL)); + bspc_mods = current_mods; + if(shift || ctrl) { + add_key(KC_DEL); + add_mods(current_mods); + send_keyboard_report(); + } else { + return true; + } + } + else { + if(bspc_mods & (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)|MOD_BIT(KC_LCTL)|MOD_BIT(KC_RCTL))) { + // if Shift or Ctrl was pressed with Backspace, than that was intepreted as Del, so we need + // to unregister the Del key + del_key(KC_DEL); + } else { + // Either Backspace was pressed without mods, or with a modifier other than Shift or Ctrl + // so it is simply taken as Backspace + del_key(KC_BSPC); + } + send_keyboard_report(); + } + return false; + } + default: + return true; + } +} From 0e4374042c5aef32762637f6fefd4662106bd5af Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Wed, 10 Oct 2018 16:32:38 -0700 Subject: [PATCH 261/788] Update and cleanup AVR Hardware docs --- docs/hardware_avr.md | 44 +++++++++++++++++++++----------------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/docs/hardware_avr.md b/docs/hardware_avr.md index be6932406..4d81a23d7 100644 --- a/docs/hardware_avr.md +++ b/docs/hardware_avr.md @@ -8,7 +8,7 @@ If you have not yet you should read the [Keyboard Guidelines](hardware_keyboard_ QMK has a number of features to simplify working with AVR keyboards. For most keyboards you don't have to write a single line of code. To get started run the `util/new_project.sh` script: -``` +```bash $ util/new_project.sh my_awesome_keyboard ###################################################### # /keyboards/my_awesome_keyboard project created. To start @@ -30,7 +30,7 @@ This is where all the custom logic for your keyboard goes. Many keyboards do not This is the file you define your [Layout Macro(s)](feature_layouts.md) in. At minimum you should have a `#define LAYOUT` for your keyboard that looks something like this: -``` +```c #define LAYOUT( \ k00, k01, k02, \ k10, k11 \ @@ -57,7 +57,7 @@ At the top of the `config.h` you'll find USB related settings. These control how Do change the `MANUFACTURER`, `PRODUCT`, and `DESCRIPTION` lines to accurately reflect your keyboard. -``` +```c #define VENDOR_ID 0xFEED #define PRODUCT_ID 0x6060 #define DEVICE_VER 0x0001 @@ -72,14 +72,14 @@ Do change the `MANUFACTURER`, `PRODUCT`, and `DESCRIPTION` lines to accurately r The next section of the `config.h` file deals with your keyboard's matrix. The first thing you should set is the matrix's size. This is usually, but not always, the same number of rows and columns as the physical key arrangement. -``` +```c #define MATRIX_ROWS 2 #define MATRIX_COLS 3 ``` Once you've defined the size of your matrix you need to define which pins on your MCU are connected to rows and columns. To do so simply specify the names of those pins: -``` +```c #define MATRIX_ROW_PINS { D0, D5 } #define MATRIX_COL_PINS { F1, F0, B0 } #define UNUSED_PINS @@ -89,7 +89,7 @@ The number of `MATRIX_ROW_PINS` entries must be the same as the number you assig Finally, you can specify the direction your diodes point. This can be `COL2ROW`, `ROW2COL`, or `CUSTOM_MATRIX`. -``` +```c #define DIODE_DIRECTION COL2ROW ``` @@ -97,16 +97,14 @@ Finally, you can specify the direction your diodes point. This can be `COL2ROW`, By default QMK supports backlighting on pins `B5`, `B6`, and `B7`. If you are using one of those you can simply enable it here. For more details see the [Backlight Documentation](feature_backlight.md). -``` +```c #define BACKLIGHT_PIN B7 #define BACKLIGHT_LEVELS 3 #define BACKLIGHT_BREATHING #define BREATHING_PERIOD 6 ``` -{% hint style='info' %} -You can use backlighting on any pin you like, but you will have to do more work to support that. See the [Backlight Documentation](feature_backlight.md) for more details. -{% endhint %} +?> You can use backlighting on any pin you like, but you will have to do more work to support that. See the [Backlight Documentation](feature_backlight.md) for more details. ### Other Configuration Options @@ -120,7 +118,7 @@ You use the `rules.mk` file to tell QMK what files to build and what features to These options tell the build system what CPU to build for. Be very careful if you change any of these settings, you can render your keyboard inoperable. -``` +```make MCU = atmega32u4 F_CPU = 16000000 ARCH = AVR8 @@ -128,26 +126,26 @@ F_USB = $(F_CPU) OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT ``` -### Bootloader Size +### Bootloaders -The bootloader is a special section of your MCU that allows you to upgrade the code stored on the MCU. Think of it like a Rescue Partition for your keyboard. If you are using a teensy 2.0, or a device like the Ergodox EZ that uses the teensy bootloader you should set this to `512`. Most other bootloaders should be set to `4096`, but `1024` and `2048` are other possible values you may encounter. +The bootloader is a special section of your MCU that allows you to upgrade the code stored on the MCU. Think of it like a Rescue Partition for your keyboard. -#### Teensy 2.0 Bootloader Example +#### Teensy Bootloader Example -``` -OPT_DEFS += -DBOOTLOADER_SIZE=512 -``` - -#### Teensy 2.0++ Bootloader Example - -``` -OPT_DEFS += -DBOOTLOADER_SIZE=1024 +```make +BOOTLOADER = halfkay ``` #### Atmel DFU Loader Example +```make +BOOTLOADER = atmel-dfu ``` -OPT_DEFS += -DBOOTLOADER_SIZE=4096 + +#### Pro Micro Bootloader Example + +```make +BOOTLOADER = caterina ``` ### Build Options From 43757cd985153ba4f620336003c20b3554c03678 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Wed, 10 Oct 2018 16:10:30 -0700 Subject: [PATCH 262/788] Cleanup learning newb links --- docs/_sidebar.md | 1 + docs/newbs.md | 3 +-- docs/newbs_learn_more_resources.md | 12 ++++++------ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/_sidebar.md b/docs/_sidebar.md index 973428c9e..32e3c7eca 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -3,6 +3,7 @@ * [Building Your First Firmware](newbs_building_firmware.md) * [Flashing Firmware](newbs_flashing.md) * [Testing and Debugging](newbs_testing_debugging.md) + * [Learning Resources](newbs_learn_more_resources.md) * [QMK Basics](README.md) * [QMK Introduction](getting_started_introduction.md) diff --git a/docs/newbs.md b/docs/newbs.md index 87933b018..38a9607d4 100644 --- a/docs/newbs.md +++ b/docs/newbs.md @@ -6,7 +6,7 @@ Not sure if your keyboard can run QMK? If it's a mechanical keyboard you built y ## Overview -There are 4 main sections to this guide: +There are 5 main sections to this guide: * [Getting Started](newbs_getting_started.md) * [Building Your First Firmware](newbs_building_firmware.md) @@ -15,4 +15,3 @@ There are 4 main sections to this guide: * [Learn More with these Resources](newbs_learn_more_resources.md) This guide is focused on helping someone who has never compiled software before. It makes choices and recommendations based on that viewpoint. There are alternative methods for many of these procedures, and we support most of those alternatives. If you have any doubt about how to accomplish a task you can [ask us for guidance](getting_started_getting_help.md). - diff --git a/docs/newbs_learn_more_resources.md b/docs/newbs_learn_more_resources.md index 69d165c2b..23b99f470 100644 --- a/docs/newbs_learn_more_resources.md +++ b/docs/newbs_learn_more_resources.md @@ -2,12 +2,12 @@ These resources are aimed at giving new members in the qmk community more understanding to the information provided in the newbs docs. Git resources: -* -*[Great General Tutorial](https://www.codecademy.com/learn/learn-git) -*[Git Game To Learn From Examples](https://learngitbranching.js.org/) -*[Git Resources to Learn More About Github](getting_started_github.md) -*[Git Resources Aimed Specificly toward QMK](contributing.md) + +* [Great General Tutorial](https://www.codecademy.com/learn/learn-git) +* [Git Game To Learn From Examples](https://learngitbranching.js.org/) +* [Git Resources to Learn More About Github](getting_started_github.md) +* [Git Resources Aimed Specificly toward QMK](contributing.md) Command Line resources: -*[Good General Tutorial on Command Line](https://www.codecademy.com/learn/learn-the-command-line) \ No newline at end of file +* [Good General Tutorial on Command Line](https://www.codecademy.com/learn/learn-the-command-line) From a7d05820a6258178b7ea440ee2781edf074d8f41 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Wed, 10 Oct 2018 12:38:10 -0700 Subject: [PATCH 263/788] Add documentation for Combo feature --- docs/_sidebar.md | 1 + docs/_summary.md | 1 + docs/config_options.md | 6 +++ docs/feature_combo.md | 88 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 96 insertions(+) create mode 100644 docs/feature_combo.md diff --git a/docs/_sidebar.md b/docs/_sidebar.md index 32e3c7eca..56a646391 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -48,6 +48,7 @@ * [Backlight](feature_backlight.md) * [Bluetooth](feature_bluetooth.md) * [Bootmagic](feature_bootmagic.md) + * [Combos](feature_combo) * [Command](feature_command.md) * [Dynamic Macros](feature_dynamic_macros.md) * [Grave Escape](feature_grave_esc.md) diff --git a/docs/_summary.md b/docs/_summary.md index 973428c9e..11aeb7cd3 100644 --- a/docs/_summary.md +++ b/docs/_summary.md @@ -47,6 +47,7 @@ * [Backlight](feature_backlight.md) * [Bluetooth](feature_bluetooth.md) * [Bootmagic](feature_bootmagic.md) + * [Combos](feature_combo) * [Command](feature_command.md) * [Dynamic Macros](feature_dynamic_macros.md) * [Grave Escape](feature_grave_esc.md) diff --git a/docs/config_options.md b/docs/config_options.md index 4678a7146..19861c9d2 100644 --- a/docs/config_options.md +++ b/docs/config_options.md @@ -155,6 +155,10 @@ If you define these options you will enable the associated feature, which may in going to produce the 500 keystrokes a second needed to actually get more than a few ms of delay from this. But if you're doing chording on something with 3-4ms scan times? You probably want this. +* `#define COMBO_COUNT 2` + * Set this to the number of combos that you're using in the [Combo](feature_combo.md) feature. +* `#define COMBO_TERM 200` + * how long for the Combo keys to be detected. Defaults to `TAPPING_TERM` if not defined. ## RGB Light Configuration @@ -234,6 +238,8 @@ Use these to enable or disable building certain features. The more you have enab * Console for debug(+400) * `COMMAND_ENABLE` * Commands for debug and configuration +* `COMBO_ENABLE` + * Key combo feature * `NKRO_ENABLE` * USB N-Key Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work * `AUDIO_ENABLE` diff --git a/docs/feature_combo.md b/docs/feature_combo.md new file mode 100644 index 000000000..f509e9f33 --- /dev/null +++ b/docs/feature_combo.md @@ -0,0 +1,88 @@ +# Combos + +The Combo feature is a chording type solution for adding custom actions. It lets you hit multiple keys at once and produce a different effect. For instance, hitting `A` and `S` within the tapping term would hit `ESC` instead, or have it perform even more complex tasks. + +To enable this feature, yu need to add `COMBO_ENABLE = yes` to your `rules.mk`. + +Additionally, in your `config.h`, you'll need to specify the number of combos that you'll be using, by adding `#define COMBO_COUNT 1` (replacing 1 with the number that you're using). + + +Also, by default, the tapping term for the Combos is set to the same value as `TAPPING_TERM` (200 by default on most boards). But you can specify a different value by defining it in your `config.h`. For instance: `#define COMBO_TERM 300` would set the time out period for combos to 300ms. + +Then, your `keymap.c` file, you'll need to define a sequence of keys, terminated with `COMBO_END`, and a structure to list the combination of keys, and it's resulting action. + +```c +const uint16_t PROGMEM test_combo[] = {KC_A, KC_B, COMBO_END}; +combo_t key_combos[COMBO_COUNT] = {COMBO(test_combo, KC_ESC)}; +``` + +This will send "Escape" if you hit the A and B keys. + +!> This method only supports [basic keycodes](keycodes_basic.md). See the examples for more control. + +## Examples + +If you want to add a list, then you'd use something like this: + +```c +enum combos { + AB_ESC, + JK_TAB +} +const uint16_t PROGMEM ab_combo[] = {KC_A, KC_B, COMBO_END}; +const uint16_t PROGMEM jk_combo[] = {KC_J, KC_K, COMBO_END}; + +combo_t key_combos[COMBO_COUNT] = { + [AB_ESC] = COMBO(ab_combo, KC_ESC), + [JK_TAB] = COMBO(jk_combo, KC_TAB) +}; +``` + +For a more complicated implementation, you can use the `process_combo_event` function to add custom handling. + +```c +enum combo_events { + ZC_COPY, + ZV_PASTE + }; + +const uint16_t PROGMEM copy_combo[] = {KC_Z, KC_C, COMBO_END}; +const uint16_t PROGMEM paste_combo[] = {KC_Z, KC_V, COMBO_END}; + +combo_t key_combos[COMBO_COUNT] = { + [ZC_COPY] = COMBO_ACTION(copy_combo), + [ZV_PASTE] = COMBO_ACTION(paste_combo), +}; + +void process_combo_event(uint8_t combo_index, bool pressed) { + switch(combo_index) { + case ZC_COPY: + if (pressed) { + register_code(KC_LCTL); + register_code(KC_C); + unregister_code(KC_C); + unregister_code(KC_LCTL); + } + break; + + case ZV_PASTE: + if (pressed) { + register_code(KC_LCTL); + register_code(KC_V); + unregister_code(KC_V); + unregister_code(KC_LCTL); + } + break; + } +} +``` + +This will send Ctrl+C if you hit Z and C, and Ctrl+V if you hit Z and V. But you could change this to do stuff like change layers, play sounds, or change settings. + +## Additional Configuration + +If you're using long combos, or even longer combos, you may run into issues with this, as the structure may not be large enough to accommodate what you're doing. + +In this case, you can add either `#define EXTRA_LONG_COMBOS` or `#define EXTRA_EXTRA_LONG_COMBOS` in your `config.h` file. + +You may also be able to enable action keys by defining `COMBO_ALLOW_ACTION_KEYS`. From 8a778d656dc42289b4cc344c8ef0abae2de73eff Mon Sep 17 00:00:00 2001 From: Oscillope Date: Thu, 11 Oct 2018 20:00:17 -0400 Subject: [PATCH 264/788] Keymap: Undo my backlight workaround (#4122) * Update jj40 keymap for easier pgup/pgdn * Backlight problem fixed by a previous commit --- keyboards/jj40/keymaps/oscillope/backlight.c | 60 -------------------- keyboards/jj40/keymaps/oscillope/keymap.c | 4 +- 2 files changed, 2 insertions(+), 62 deletions(-) delete mode 100644 keyboards/jj40/keymaps/oscillope/backlight.c diff --git a/keyboards/jj40/keymaps/oscillope/backlight.c b/keyboards/jj40/keymaps/oscillope/backlight.c deleted file mode 100644 index 14c677cd6..000000000 --- a/keyboards/jj40/keymaps/oscillope/backlight.c +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Backlighting code for PS2AVRGB boards (ATMEGA32A) - * Kenneth A. (github.com/krusli | krusli.me) - */ - -#include "quantum.h" - -#include -#include - -// Port D: digital pins of the AVR chipset -#define NUMLOCK_PORT (1 << 0) // D0 -#define CAPSLOCK_PORT (1 << 1) // D1 -#define BACKLIGHT_PORT (1 << 4) // D4 -#define SCROLLLOCK_PORT (1 << 6) // D6 - -/** - * References - * Port Registers: https://www.arduino.cc/en/Reference/PortManipulation - * TCCR1A: https://electronics.stackexchange.com/questions/92350/what-is-the-difference-between-tccr1a-and-tccr1b - * Timers: http://www.avrbeginners.net/architecture/timers/timers.html - * 16-bit timer setup: http://sculland.com/ATmega168/Interrupts-And-Timers/16-Bit-Timer-Setup/ - * PS2AVRGB firmware: https://github.com/showjean/ps2avrU/tree/master/firmware - */ - -// @Override -// turn LEDs on and off depending on USB caps/num/scroll lock states. -__attribute__ ((weak)) -void led_set_user(uint8_t usb_led) { -/* It appears that these cause the v1 JJ40 PCB to hang. - * I haven't looked into why, but I don't have any LEDs on my board anyway. */ -#if 0 - if (usb_led & (1 << USB_LED_NUM_LOCK)) { - // turn on - DDRD |= NUMLOCK_PORT; - PORTD |= NUMLOCK_PORT; - } else { - // turn off - DDRD &= ~NUMLOCK_PORT; - PORTD &= ~NUMLOCK_PORT; - } - - if (usb_led & (1 << USB_LED_CAPS_LOCK)) { - DDRD |= CAPSLOCK_PORT; - PORTD |= CAPSLOCK_PORT; - } else { - DDRD &= ~CAPSLOCK_PORT; - PORTD &= ~CAPSLOCK_PORT; - } - - if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { - DDRD |= SCROLLLOCK_PORT; - PORTD |= SCROLLLOCK_PORT; - } else { - DDRD &= ~SCROLLLOCK_PORT; - PORTD &= ~SCROLLLOCK_PORT; - } -#endif -} - diff --git a/keyboards/jj40/keymaps/oscillope/keymap.c b/keyboards/jj40/keymaps/oscillope/keymap.c index 49ceff864..8b30f52c8 100644 --- a/keyboards/jj40/keymaps/oscillope/keymap.c +++ b/keyboards/jj40/keymaps/oscillope/keymap.c @@ -62,7 +62,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * ,-----------------------------------------------------------------------------------. * | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Ins | | | () | [] | {} | Left | Down | Up |Right | | | + * | Ins | | | () | [] | {} | Home | PgDn | PgUp | End | | | * |------+------+------+------+------+------|------+------+------+------+------+------| * |RESET | Back | Fwd | | | | | | Mute | Vol- | Vol+ | | * |------+------+------+------+------+------+------+------+------+------+------+------| @@ -71,7 +71,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_LOWER] = KEYMAP( \ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ - KC_INS, _______, _______, CC_PRN, CC_BRC, CC_CBR, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, \ + KC_INS, _______, _______, CC_PRN, CC_BRC, CC_CBR, KC_HOME, KC_PGDN, KC_PGUP, KC_END, _______, _______, \ RESET, KC_WBAK, KC_WFWD, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, \ _______, _______, _______, _______, KC_LOCK, _______, _______, KC_MPRV, KC_MSTP, KC_MPLY, KC_MNXT \ ), From ae489efee4512790e38f173bcd2e2f1e2547da07 Mon Sep 17 00:00:00 2001 From: Jason Thigpen Date: Thu, 11 Oct 2018 17:00:53 -0700 Subject: [PATCH 265/788] Keymap: Add crd's simple layout (#4117) * Add crd's simple layout * Fix transparent mapping in crd's config * Add secondary navigation to fn layer --- keyboards/dz60/keymaps/crd/keymap.c | 48 +++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 keyboards/dz60/keymaps/crd/keymap.c diff --git a/keyboards/dz60/keymaps/crd/keymap.c b/keyboards/dz60/keymaps/crd/keymap.c new file mode 100644 index 000000000..5e9242c9d --- /dev/null +++ b/keyboards/dz60/keymaps/crd/keymap.c @@ -0,0 +1,48 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* Qwerty + * ,-----------------------------------------------------------------------------------------. + * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Bkspc | + * |-----------------------------------------------------------------------------------------+ + * | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | + * |-----------------------------------------------------------------------------------------+ + * | Ctrl/Esc| A | S | D | F | G | H | J | K | L | ; | ' | Enter | + * |-----------------------------------------------------------------------------------------+ + * | Shift | Z | X | C | V | B | N | M | , | . | / | RSh | U | DEL | + * |-----------------------------------------------------------------------------------------+ + * | Ctrl | Alt | Cmd | Space | Cmd | FN | L | D | R | + * `-----------------------------------------------------------------------------------------' + */ + + LAYOUT_directional( + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, _______, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, + CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_DEL, + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_SPC, KC_SPC, KC_RGUI, MO(1), KC_LEFT, KC_DOWN, KC_RIGHT + ), + + /* FN Layer + * ,-----------------------------------------------------------------------------------------. + * | ` ~ | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | RESET | + * |-----------------------------------------------------------------------------------------+ + * | |RBB T|RGB M| Hue+| Hue-| Sat+| Sat-| Val+| Val-| | | | | | + * |-----------------------------------------------------------------------------------------+ + * | | BL T| BL M| BL+ | BL- | | | | | | | | | + * |-----------------------------------------------------------------------------------------+ + * | | | | | | | | | | | | |PgUp | | + * |-----------------------------------------------------------------------------------------+ + * | | | | | | |Home |PgDn | End | + * `-----------------------------------------------------------------------------------------' + */ + + LAYOUT_directional( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, RESET, + _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, + _______, BL_TOGG, BL_STEP, BL_INC, BL_DEC, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDOWN, KC_END + ), +}; From 661e304033d704084a85930a4ff2c91e13c270af Mon Sep 17 00:00:00 2001 From: mtei <2170248+mtei@users.noreply.github.com> Date: Sat, 29 Sep 2018 23:45:22 +0900 Subject: [PATCH 266/788] Add a temporary comment to quantum/rgblight.h to aid migration. Add a temporary comment. The content is a contrast table of old magic number and new symbol. --- quantum/rgblight.h | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/quantum/rgblight.h b/quantum/rgblight.h index d1e00eef3..50567b5b2 100644 --- a/quantum/rgblight.h +++ b/quantum/rgblight.h @@ -18,6 +18,52 @@ #include "rgblight_reconfig.h" +/***** rgblight_mode(mode)/rgblight_mode_noeeprom(mode) **** + + old mode number (before 0.6.117) to new mode name table + +|-----------------|-----------------------------------| +| old mode number | new mode name | +|-----------------|-----------------------------------| +| 1 | RGBLIGHT_MODE_STATIC_LIGHT | +| 2 | RGBLIGHT_MODE_BREATHING | +| 3 | RGBLIGHT_MODE_BREATHING + 1 | +| 4 | RGBLIGHT_MODE_BREATHING + 2 | +| 5 | RGBLIGHT_MODE_BREATHING + 3 | +| 6 | RGBLIGHT_MODE_RAINBOW_MOOD | +| 7 | RGBLIGHT_MODE_RAINBOW_MOOD + 1 | +| 8 | RGBLIGHT_MODE_RAINBOW_MOOD + 2 | +| 9 | RGBLIGHT_MODE_RAINBOW_SWIRL | +| 10 | RGBLIGHT_MODE_RAINBOW_SWIRL + 1 | +| 11 | RGBLIGHT_MODE_RAINBOW_SWIRL + 2 | +| 12 | RGBLIGHT_MODE_RAINBOW_SWIRL + 3 | +| 13 | RGBLIGHT_MODE_RAINBOW_SWIRL + 4 | +| 14 | RGBLIGHT_MODE_RAINBOW_SWIRL + 5 | +| 15 | RGBLIGHT_MODE_SNAKE | +| 16 | RGBLIGHT_MODE_SNAKE + 1 | +| 17 | RGBLIGHT_MODE_SNAKE + 2 | +| 18 | RGBLIGHT_MODE_SNAKE + 3 | +| 19 | RGBLIGHT_MODE_SNAKE + 4 | +| 20 | RGBLIGHT_MODE_SNAKE + 5 | +| 21 | RGBLIGHT_MODE_KNIGHT | +| 22 | RGBLIGHT_MODE_KNIGHT + 1 | +| 23 | RGBLIGHT_MODE_KNIGHT + 2 | +| 24 | RGBLIGHT_MODE_CHRISTMAS | +| 25 | RGBLIGHT_MODE_STATIC_GRADIENT | +| 26 | RGBLIGHT_MODE_STATIC_GRADIENT + 1 | +| 27 | RGBLIGHT_MODE_STATIC_GRADIENT + 2 | +| 28 | RGBLIGHT_MODE_STATIC_GRADIENT + 3 | +| 29 | RGBLIGHT_MODE_STATIC_GRADIENT + 4 | +| 30 | RGBLIGHT_MODE_STATIC_GRADIENT + 5 | +| 31 | RGBLIGHT_MODE_STATIC_GRADIENT + 6 | +| 32 | RGBLIGHT_MODE_STATIC_GRADIENT + 7 | +| 33 | RGBLIGHT_MODE_STATIC_GRADIENT + 8 | +| 34 | RGBLIGHT_MODE_STATIC_GRADIENT + 9 | +| 35 | RGBLIGHT_MODE_RGB_TEST | +| 36 | RGBLIGHT_MODE_ALTERNATING | +|-----------------|-----------------------------------| + *****/ + #define _RGBM_SINGLE_STATIC(sym) RGBLIGHT_MODE_ ## sym, #define _RGBM_SINGLE_DYNAMIC(sym) RGBLIGHT_MODE_ ## sym, #define _RGBM_MULTI_STATIC(sym) RGBLIGHT_MODE_ ## sym, From ec59556cd7896e359340feb961f10f3f12a48b95 Mon Sep 17 00:00:00 2001 From: mtei <2170248+mtei@users.noreply.github.com> Date: Wed, 10 Oct 2018 06:50:11 +0900 Subject: [PATCH 267/788] add a notice into docs/feature_rgblight.md --- docs/feature_rgblight.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/feature_rgblight.md b/docs/feature_rgblight.md index 925dca724..a2820347d 100644 --- a/docs/feature_rgblight.md +++ b/docs/feature_rgblight.md @@ -96,9 +96,10 @@ if `RGBLIGHT_EFFECT_xxxx` or `RGBLIGHT_ANIMATIONS` is defined, you also have a n |`RGBLIGHT_MODE_RGB_TEST` | *None* |RGB Test | |`RGBLIGHT_MODE_ALTERNATING` | *None* |Alternating | - Check out [this video](https://youtube.com/watch?v=VKrpPAHlisY) for a demonstration. +Note: For versions older than 0.6.117, The mode numbers were written directly. In `quantum/rgblight.h` there is a contrast table between the old mode number and the current symbol. + The following options can be used to tweak the various animations: |Define |Default |Description | From 4bb0fb2ffc2d3fd136f5803b92f1a55792645a28 Mon Sep 17 00:00:00 2001 From: mtei <2170248+mtei@users.noreply.github.com> Date: Thu, 11 Oct 2018 22:15:31 +0900 Subject: [PATCH 268/788] A comment indicating the insertion location of the new mode was added. --- quantum/rgblight.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/quantum/rgblight.h b/quantum/rgblight.h index 50567b5b2..33b279f08 100644 --- a/quantum/rgblight.h +++ b/quantum/rgblight.h @@ -284,6 +284,10 @@ void rgblight_effect_alternating(void); #ifdef RGBLIGHT_EFFECT_ALTERNATING _RGBM_SINGLE_DYNAMIC( ALTERNATING ) #endif + //// Add a new mode here. + // #ifdef RGBLIGHT_EFFECT_ + // _RGBM__( ) + // #endif #endif #undef _RGBM_SINGLE_STATIC From 52ecc76e28bbcde9e35d35eb48a4d5b78aa204e2 Mon Sep 17 00:00:00 2001 From: Yann Hodique Date: Thu, 11 Oct 2018 15:26:56 -0700 Subject: [PATCH 269/788] port sun_usb converter from tmk initial import --- keyboards/converter/sun_usb/command_extra.c | 64 ++++++ keyboards/converter/sun_usb/config.h | 88 ++++++++ keyboards/converter/sun_usb/led.c | 32 +++ keyboards/converter/sun_usb/matrix.c | 197 ++++++++++++++++++ keyboards/converter/sun_usb/readme.md | 89 ++++++++ keyboards/converter/sun_usb/rules.mk | 42 ++++ .../sun_usb/type3/keymaps/default/keymap.c | 29 +++ keyboards/converter/sun_usb/type3/rules.mk | 0 keyboards/converter/sun_usb/type3/type3.h | 66 ++++++ .../sun_usb/type5/keymaps/default/keymap.c | 30 +++ keyboards/converter/sun_usb/type5/rules.mk | 0 keyboards/converter/sun_usb/type5/type5.h | 148 +++++++++++++ 12 files changed, 785 insertions(+) create mode 100644 keyboards/converter/sun_usb/command_extra.c create mode 100644 keyboards/converter/sun_usb/config.h create mode 100644 keyboards/converter/sun_usb/led.c create mode 100644 keyboards/converter/sun_usb/matrix.c create mode 100644 keyboards/converter/sun_usb/readme.md create mode 100644 keyboards/converter/sun_usb/rules.mk create mode 100644 keyboards/converter/sun_usb/type3/keymaps/default/keymap.c create mode 100644 keyboards/converter/sun_usb/type3/rules.mk create mode 100644 keyboards/converter/sun_usb/type3/type3.h create mode 100644 keyboards/converter/sun_usb/type5/keymaps/default/keymap.c create mode 100644 keyboards/converter/sun_usb/type5/rules.mk create mode 100644 keyboards/converter/sun_usb/type5/type5.h diff --git a/keyboards/converter/sun_usb/command_extra.c b/keyboards/converter/sun_usb/command_extra.c new file mode 100644 index 000000000..756a9160b --- /dev/null +++ b/keyboards/converter/sun_usb/command_extra.c @@ -0,0 +1,64 @@ +#include QMK_KEYBOARD_H +#include "protocol/serial.h" + +bool sun_bell = false; +bool sun_click = false; + + +bool command_extra(uint8_t code) +{ + switch (code) { + case KC_H: + case KC_SLASH: /* ? */ + print("\n\n----- Sun converter Help -----\n"); + print("Home: Toggle Bell\n"); + print("End: Toggle Click\n"); + print("PgUp: LED all On\n"); + print("PgDown: LED all Off\n"); + print("Insert: Layout\n"); + print("Delete: Reset\n"); + return false; + case KC_DEL: + print("Reset\n"); + serial_send(0x01); + break; + case KC_HOME: + sun_bell = !sun_bell; + if (sun_bell) { + print("Bell On\n"); + serial_send(0x02); + } else { + print("Bell Off\n"); + serial_send(0x03); + } + break; + case KC_END: + sun_click = !sun_click; + if (sun_click) { + print("Click On\n"); + serial_send(0x0A); + } else { + print("Click Off\n"); + serial_send(0x0B); + } + break; + case KC_PGUP: + print("LED all on\n"); + serial_send(0x0E); + serial_send(0xFF); + break; + case KC_PGDOWN: + print("LED all off\n"); + serial_send(0x0E); + serial_send(0x00); + break; + case KC_INSERT: + print("layout\n"); + serial_send(0x0F); + break; + default: + xprintf("Unknown extra command: %02X\n", code); + return false; + } + return true; +} diff --git a/keyboards/converter/sun_usb/config.h b/keyboards/converter/sun_usb/config.h new file mode 100644 index 000000000..f7ad41639 --- /dev/null +++ b/keyboards/converter/sun_usb/config.h @@ -0,0 +1,88 @@ +/* +Copyright 2012 Jun Wako + +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 . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#define CUSTOM_MATRIX 2 + +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x3333 +#define DEVICE_VER 0x0100 +#define MANUFACTURER QMK +#define PRODUCT Sun keyboard converter +#define DESCRIPTION USB converter for Sun type 5 keyboard + +/* matrix size */ +#define MATRIX_ROWS 16 +#define MATRIX_COLS 8 + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LALT) | MOD_BIT(KC_RALT)) || \ + keyboard_report->mods == (MOD_BIT(KC_LGUI) | MOD_BIT(KC_RGUI)) || \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + + +/* Serial(USART) configuration + * asynchronous, negative logic, 1200baud, no flow control + * 1-start bit, 8-data bit, non parity, 1-stop bit + */ +#define SERIAL_SOFT_BAUD 1200 +#define SERIAL_SOFT_PARITY_NONE +#define SERIAL_SOFT_BIT_ORDER_LSB +#define SERIAL_SOFT_LOGIC_NEGATIVE +/* RXD Port */ +#define SERIAL_SOFT_RXD_ENABLE +#define SERIAL_SOFT_RXD_DDR DDRD +#define SERIAL_SOFT_RXD_PORT PORTD +#define SERIAL_SOFT_RXD_PIN PIND +#define SERIAL_SOFT_RXD_BIT 2 +#define SERIAL_SOFT_RXD_VECT INT2_vect +/* RXD Interupt */ +#define SERIAL_SOFT_RXD_INIT() do { \ + /* pin configuration: input with pull-up */ \ + SERIAL_SOFT_RXD_DDR &= ~(1< + +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 . +*/ + +#include QMK_KEYBOARD_H +#include "protocol/serial.h" + +void led_set(uint8_t usb_led) +{ + uint8_t sun_led = 0; + if (usb_led & (1< + +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 . +*/ + +#include QMK_KEYBOARD_H +#include "protocol/serial.h" + +/* + * Matrix Array usage: + * + * ROW: 16(4bits) + * COL: 8(3bits) + * + * 8bit wide + * +---------+ + * 0|00 ... 07| + * 1|08 ... 0F| + * :| ... | + * :| ... | + * E|70 ... 77| + * F|78 ... 7F| + * +---------+ + */ +static uint8_t matrix[MATRIX_ROWS]; +#define ROW(code) ((code>>3)&0xF) +#define COL(code) (code&0x07) + +static bool is_modified = false; + +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + +inline +uint8_t matrix_rows(void) +{ + return MATRIX_ROWS; +} + +inline +uint8_t matrix_cols(void) +{ + return MATRIX_COLS; +} + +void matrix_init(void) +{ + /* DDRD |= (1<<6); */ + /* PORTD |= (1<<6); */ + debug_enable = true; + + serial_init(); + + // initialize matrix state: all keys off + for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00; + + /* // wait for keyboard coming up */ + /* // otherwise LED status update fails */ + /* print("Reseting "); */ + /* while (1) { */ + /* print("."); */ + /* while (serial_recv()); */ + /* serial_send(0x01); */ + /* _delay_ms(500); */ + /* if (serial_recv() == 0xFF) { */ + /* _delay_ms(500); */ + /* if (serial_recv() == 0x04) */ + /* break; */ + /* } */ + /* } */ + /* print(" Done\n"); */ + + /* PORTD &= ~(1<<6); */ + + matrix_init_quantum(); + return; +} + +uint8_t matrix_scan(void) +{ + uint8_t code; + code = serial_recv(); + if (!code) return 0; + + debug_hex(code); debug(" "); + + switch (code) { + case 0xFF: // reset success: FF 04 + print("reset: "); + _delay_ms(500); + code = serial_recv(); + xprintf("%02X\n", code); + if (code == 0x04) { + // LED status + led_set(host_keyboard_leds()); + } + return 0; + case 0xFE: // layout: FE + print("layout: "); + _delay_ms(500); + xprintf("%02X\n", serial_recv()); + return 0; + case 0x7E: // reset fail: 7E 01 + print("reset fail: "); + _delay_ms(500); + xprintf("%02X\n", serial_recv()); + return 0; + case 0x7F: + // all keys up + for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00; + return 0; + } + + if (code&0x80) { + // break code + if (matrix_is_on(ROW(code), COL(code))) { + matrix[ROW(code)] &= ~(1< + + 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 . +*/ + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + LAYOUT( + KC_F10,KC_F11, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_BSPC, KC_VOLD, KC_MUTE, KC_VOLU, + KC_F12,KC_F13, KC_ESC,KC_1,KC_2,KC_3,KC_4,KC_5,KC_6,KC_7,KC_8,KC_9,KC_0,KC_MINS,KC_EQL,KC_BSLS,KC_GRV, KC_MPRV, KC_MPLY, KC_MNXT, + KC_F14,KC_F15, KC_TAB, KC_Q,KC_W,KC_E,KC_R,KC_T,KC_Y,KC_U,KC_I,KC_O,KC_P, KC_LBRC,KC_RBRC, KC_DEL, KC_HOME, KC_UP, KC_PGUP, + KC_F16,KC_F17, KC_LCTL, KC_A,KC_S,KC_D,KC_F,KC_G,KC_H,KC_J,KC_K,KC_L,KC_SCLN,KC_QUOT, KC_ENT, KC_LEFT,KC_INSERT,KC_RIGHT, + KC_F18,KC_F19, KC_LSFT, KC_Z,KC_X,KC_C,KC_V,KC_B,KC_N,KC_M,KC_COMM,KC_DOT,KC_SLSH,KC_RSFT,KC_RCTL, KC_END, KC_DOWN,KC_PGDOWN, + KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI + ), +}; diff --git a/keyboards/converter/sun_usb/type3/rules.mk b/keyboards/converter/sun_usb/type3/rules.mk new file mode 100644 index 000000000..e69de29bb diff --git a/keyboards/converter/sun_usb/type3/type3.h b/keyboards/converter/sun_usb/type3/type3.h new file mode 100644 index 000000000..f6f14f4ef --- /dev/null +++ b/keyboards/converter/sun_usb/type3/type3.h @@ -0,0 +1,66 @@ +/* +Copyright 2012 Jun Wako + +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 . +*/ + +#ifndef TYPE3_H +#define TYPE3_H + +#include "quantum.h" + +/* Sun type 3 keyboard +,-------. ,-----------------------------------------------------------. ,-----------. +| 01| 03| | 05| 06| 08| 0A| 0C| 0E| 10| 11| 12| 2B| | 15| 16| 17| +|-------| |-----------------------------------------------------------| |-----------| +| 19| 1A| | 1D| 1E| 1F| 20| 21| 22| 23| 24| 25| 26| 27| 28| 29| 58| 2A| | 2D| 2E| 2F| +|-------| |-----------------------------------------------------------| |-----------| +| 31| 33| | 35 | 36| 37| 38| 39| 3A| 3B| 3C| 3D| 3E| 3F| 40| 41| 42 | | 44| 45| 46| +|-------| |-----------------------------------------------------------| |-----------| +| 48| 49| | 4C | 4D| 4E| 4F| 50| 51| 52| 53| 54| 55| 56| 57| 59 | | 5B| 5C| 5D| +|-------| |-----------------------------------------------------------| |-----------| +| 5F| 61| | 63 | 64| 65| 66| 67| 68| 69| 6A| 6B| 6C| 6D| 6E| 6F| | 70| 71| 72| +`-------' |-----------------------------------------------------------| `-----------' + | 77 | 78 | 79 | 7A | 13 | + `-----------------------------------------------------------' +*/ + + +#define LAYOUT( \ + K01,K03, K05,K06, K08, K0A, K0C, K0E, K10,K11,K12,K2B, K15,K16,K17, \ + K19,K1A, K1D,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K28,K29,K58,K2A, K2D,K2E,K2F, \ + K31,K33, K35, K36,K37,K38,K39,K3A,K3B,K3C,K3D,K3E,K3F,K40,K41, K42, K44,K45,K46, \ + K48,K49, K4C, K4D,K4E,K4F,K50,K51,K52,K53,K54,K55,K56,K57, K59, K5B,K5C,K5D, \ + K5F,K61, K63, K64,K65,K66,K67,K68,K69,K6A,K6B,K6C,K6D, K6E,K6F, K70,K71,K72, \ + K77,K78, K79, K7A,K13 \ +) { \ + { KC_NO, K01 , KC_NO, K03 , KC_NO, K05 , K06 , KC_NO }, \ + { K08 , KC_NO, K0A , KC_NO, K0C , KC_NO, K0E , KC_NO }, \ + { K10 , K11 , K12 , K13 , KC_NO, K15 , K16 , K17 }, \ + { KC_NO, K19 , K1A , KC_NO, KC_NO, K1D , K1E , K1F }, \ + { K20 , K21 , K22 , K23 , K24 , K25 , K26 , K27 }, \ + { K28 , K29 , K2A , K2B , KC_NO, K2D , K2E , K2F }, \ + { KC_NO, K31 , KC_NO, K33 , KC_NO, K35 , K36 , K37 }, \ + { K38 , K39 , K3A , K3B , K3C , K3D , K3E , K3F }, \ + { K40 , K41 , K42 , KC_NO, K44 , K45 , K46 , KC_NO }, \ + { K48 , K49 , KC_NO, KC_NO, K4C , K4D , K4E , K4F }, \ + { K50 , K51 , K52 , K53 , K54 , K55 , K56 , K57 }, \ + { K58 , K59 , KC_NO, K5B , K5C , K5D , KC_NO, K5F }, \ + { KC_NO, K61 , KC_NO, K63 , K64 , K65 , K66 , K67 }, \ + { K68 , K69 , K6A , K6B , K6C , K6D , K6E , K6F }, \ + { K70 , K71 , K72 , KC_NO, KC_NO, KC_NO, KC_NO, K77 }, \ + { K78 , K79 , K7A , KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \ +} + +#endif diff --git a/keyboards/converter/sun_usb/type5/keymaps/default/keymap.c b/keyboards/converter/sun_usb/type5/keymaps/default/keymap.c new file mode 100644 index 000000000..5e04ff4b3 --- /dev/null +++ b/keyboards/converter/sun_usb/type5/keymaps/default/keymap.c @@ -0,0 +1,30 @@ +/* +Copyright 2012 Jun Wako + +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 . +*/ + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* LAYOUT_jp_unix is a superset of the other layouts, hence the default */ + LAYOUT_jp_unix( + KC_HELP, KC_NO, KC_F1,KC_F2,KC_F3,KC_F4, KC_F5,KC_F6,KC_F7,KC_F8, KC_F9,KC_F10,KC_F11,KC_F12, KC_PSCR,KC_SLCK,KC_PAUS, KC_MUTE,KC_VOLD,KC_VOLU,KC_PWR, + KC_STOP, KC_AGAIN, KC_ESC,KC_1,KC_2,KC_3,KC_4,KC_5,KC_6,KC_7,KC_8,KC_9,KC_0,KC_MINS,KC_EQL,KC_BSLS,KC_GRV, KC_INS, KC_HOME,KC_PGUP, KC_NLCK,KC_PSLS,KC_PAST,KC_PMNS, + KC_MENU, KC_UNDO, KC_TAB, KC_Q,KC_W,KC_E,KC_R,KC_T,KC_Y,KC_U,KC_I,KC_O,KC_P,KC_LBRC,KC_RBRC, KC_BSPC, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, KC_PPLS, + KC_SELECT, KC_COPY, KC_LCTL, KC_A,KC_S,KC_D,KC_F,KC_G,KC_H,KC_J,KC_K,KC_L,KC_SCLN,KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, + KC_EXECUTE,KC_PASTE, KC_LSFT, KC_Z,KC_X,KC_C,KC_V,KC_B,KC_N,KC_M,KC_COMM,KC_DOT,KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, + KC_FIND, KC_CUT, KC_CAPS,KC_LALT,KC_LGUI,KC_HENK, KC_SPC, KC_MHEN,KC_KANA,KC_RGUI,KC_APP,KC_RALT, KC_LEFT,KC_DOWN,KC_RGHT, KC_P0, KC_PDOT + ), +}; diff --git a/keyboards/converter/sun_usb/type5/rules.mk b/keyboards/converter/sun_usb/type5/rules.mk new file mode 100644 index 000000000..e69de29bb diff --git a/keyboards/converter/sun_usb/type5/type5.h b/keyboards/converter/sun_usb/type5/type5.h new file mode 100644 index 000000000..da66d80ab --- /dev/null +++ b/keyboards/converter/sun_usb/type5/type5.h @@ -0,0 +1,148 @@ +/* + Copyright 2012 Jun Wako + + 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 . +*/ + +#ifndef TYPE5_H +#define TYPE5_H + +#include "quantum.h" + +/* sun type 5 keyboard, JP Unix-style +,-------. ,---, ,---------------. ,---------------. ,---------------. ,-----------. ,---------------. +| 76 | | 0F| | 05| 06| 08| 0A| | 0C| 0E| 10| 11| | 12| 07| 09| 0B| | 16| 17| 15| | 2D| 02| 04| 30| +`-------' `---' `---------------' `---------------' `---------------' `-----------' `---------------' +,-------. ,-----------------------------------------------------------. ,-----------. ,---------------. +| 01| 03| | 1D| 1E| 1F| 20| 21| 22| 23| 24| 25| 26| 27| 28| 29| 58| 2A| | 2C| 34| 60| | 62| 2E| 2F| 47| +|-------| |-----------------------------------------------------------| |------------ |---------------| +| 19| 1A| | 35 | 36| 37| 38| 39| 3A| 3B| 3C| 3D| 3E| 3F| 40| 41| 2B | | 42| 4A| 7B| | 44| 45| 46| | +|-------| |-----------------------------------------------------------| `-----------' |-----------| 7D| +| 31| 33| | 4C | 4D| 4E| 4F| 50| 51| 52| 53| 54| 55| 56| 57| 59 | | 5B| 5C| 5D| | +|-------| |-----------------------------------------------------------| ,---. |-----------|---| +| 48| 49| | 63 | 64| 65| 66| 67| 68| 69| 6A| 6B| 6C| 6D| 6E | | 14| | 70| 71| 72| | +|-------| |-----------------------------------------------------------| .-----------. |-----------| 5A| +| 5F| 61| | 77 | 13| 78 |*73 | 79 |*74 |*75| 7A | 43| 0D| | 18| 1B| 1C| | 5E | 32| | +`-------' `-----------------------------------------------------------' `-----------' `---------------' +*/ +#define LAYOUT_jp_unix( \ + K76, K0F, K05,K06,K08,K0A, K0C,K0E,K10,K11, K12,K07,K09,K0B, K16,K17,K15, K2D,K02,K04,K30, \ + K01,K03, K1D,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K28,K29,K58,K2A, K2C,K34,K60, K62,K2E,K2F,K47, \ + K19,K1A, K35, K36,K37,K38,K39,K3A,K3B,K3C,K3D,K3E,K3F,K40,K41, K2B, K42,K4A,K7B, K44,K45,K46,K7D, \ + K31,K33, K4C, K4D,K4E,K4F,K50,K51,K52,K53,K54,K55,K56,K57, K59, K5B,K5C,K5D, \ + K48,K49, K63, K64,K65,K66,K67,K68,K69,K6A,K6B,K6C,K6D, K6E, K14, K70,K71,K72,K5A, \ + K5F,K61, K77,K13, K78, K73, K79, K74, K75, K7A, K43, K0D, K18,K1B,K1C, K5E, K32 \ +) { \ + { KC_NO, K01 , K02 , K03 , K04 , K05 , K06 , K07 }, \ + { K08 , K09 , K0A , K0B , K0C , K0D , K0E , K0F ,}, \ + { K10 , K11 , K12 , K13 , K14 , K15 , K16 , K17 }, \ + { K18 , K19 , K1A , K1B , K1C , K1D , K1E , K1F }, \ + { K20 , K21 , K22 , K23 , K24 , K25 , K26 , K27 }, \ + { K28 , K29 , K2A , K2B , K2C , K2D , K2E , K2F }, \ + { K30 , K31 , K32 , K33 , K34 , K35 , K36 , K37 }, \ + { K38 , K39 , K3A , K3B , K3C , K3D , K3E , K3F }, \ + { K40 , K41 , K42 , K43 , K44 , K45 , K46 , K47 }, \ + { K48 , K49 , K4A , KC_NO, K4C , K4D , K4E , K4F }, \ + { K50 , K51 , K52 , K53 , K54 , K55 , K56 , K57 }, \ + { K58 , K59 , K5A , K5B , K5C , K5D , K5E , K5F }, \ + { K60 , K61 , K62 , K63 , K64 , K65 , K66 , K67 }, \ + { K68 , K69 , K6A , K6B , K6C , K6D , K6E , KC_NO }, \ + { K70 , K71 , K72 , K73 , K74 , K75 , K76 , K77 }, \ + { K78 , K79 , K7A , K7B , KC_NO, K7D , KC_NO, KC_NO } \ +} + +/* Sun type 5 keyboard, US Unix-style +,-------. ,---, ,---------------. ,---------------. ,---------------. ,-----------. ,---------------. +| 76 | | 0F| | 05| 06| 08| 0A| | 0C| 0E| 10| 11| | 12| 07| 09| 0B| | 16| 17| 15| | 2D| 02| 04| 30| +`-------' `---' `---------------' `---------------' `---------------' `-----------' `---------------' +,-------. ,-----------------------------------------------------------. ,-----------. ,---------------. +| 01| 03| | 1D| 1E| 1F| 20| 21| 22| 23| 24| 25| 26| 27| 28| 29| 58| 2A| | 2C| 34| 60| | 62| 2E| 2F| 47| +|-------| |-----------------------------------------------------------| |------------ |---------------| +| 19| 1A| | 35 | 36| 37| 38| 39| 3A| 3B| 3C| 3D| 3E| 3F| 40| 41| 2B | | 42| 4A| 7B| | 44| 45| 46| | +|-------| |-----------------------------------------------------------| `-----------' |-----------| 7D| +| 31| 33| | 4C | 4D| 4E| 4F| 50| 51| 52| 53| 54| 55| 56| 57| 59 | | 5B| 5C| 5D| | +|-------| |-----------------------------------------------------------| ,---. |-----------|---| +| 48| 49| | 63 | 64| 65| 66| 67| 68| 69| 6A| 6B| 6C| 6D| 6E | | 14| | 70| 71| 72| | +|-------| |-----------------------------------------------------------| .-----------. |-----------| 5A| +| 5F| 61| | 77 | 13| 78 | 79 | 7A | 43| 0D| | 18| 1B| 1C| | 5E | 32| | +`-------' `-----------------------------------------------------------' `-----------' `---------------' +*/ +#define LAYOUT_us_unix( \ + K76, K0F, K05,K06,K08,K0A, K0C,K0E,K10,K11, K12,K07,K09,K0B, K16,K17,K15, K2D,K02,K04,K30, \ + K01,K03, K1D,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K28,K29,K58,K2A, K2C,K34,K60, K62,K2E,K2F,K47, \ + K19,K1A, K35, K36,K37,K38,K39,K3A,K3B,K3C,K3D,K3E,K3F,K40,K41, K2B, K42,K4A,K7B, K44,K45,K46,K7D, \ + K31,K33, K4C, K4D,K4E,K4F,K50,K51,K52,K53,K54,K55,K56,K57, K59, K5B,K5C,K5D, \ + K48,K49, K63, K64,K65,K66,K67,K68,K69,K6A,K6B,K6C,K6D, K6E, K14, K70,K71,K72,K5A, \ + K5F,K61, K77,K13, K78, K79, K7A, K43, K0D, K18,K1B,K1C, K5E, K32 \ +) { \ + { KC_NO, K01 , K02 , K03 , K04 , K05 , K06 , K07 }, \ + { K08 , K09 , K0A , K0B , K0C , K0D , K0E , K0F ,}, \ + { K10 , K11 , K12 , K13 , K14 , K15 , K16 , K17 }, \ + { K18 , K19 , K1A , K1B , K1C , K1D , K1E , K1F }, \ + { K20 , K21 , K22 , K23 , K24 , K25 , K26 , K27 }, \ + { K28 , K29 , K2A , K2B , K2C , K2D , K2E , K2F }, \ + { K30 , K31 , K32 , K33 , K34 , K35 , K36 , K37 }, \ + { K38 , K39 , K3A , K3B , K3C , K3D , K3E , K3F }, \ + { K40 , K41 , K42 , K43 , K44 , K45 , K46 , K47 }, \ + { K48 , K49 , K4A , KC_NO, K4C , K4D , K4E , K4F }, \ + { K50 , K51 , K52 , K53 , K54 , K55 , K56 , K57 }, \ + { K58 , K59 , K5A , K5B , K5C , K5D , K5E , K5F }, \ + { K60 , K61 , K62 , K63 , K64 , K65 , K66 , K67 }, \ + { K68 , K69 , K6A , K6B , K6C , K6D , K6E , KC_NO }, \ + { K70 , K71 , K72 , KC_NO, KC_NO, KC_NO, K76 , K77 }, \ + { K78 , K79 , K7A , K7B , KC_NO, K7D , KC_NO, KC_NO } \ +} + +/* Sun type 5 keyboard, US ANSI-style + ,-------. ,---, ,---------------. ,---------------. ,---------------. ,-----------. ,---------------. + | 76 | | 1D| | 05| 06| 08| 0A| | 0C| 0E| 10| 11| | 12| 07| 09| 0B| | 16| 17| 15| | 2D| 02| 04| 30| + `-------' `---' `---------------' `---------------' `---------------' `-----------' `---------------' + ,-------. ,-----------------------------------------------------------. ,-----------. ,---------------. + | 01| 03| | 2A| 1E| 1F| 20| 21| 22| 23| 24| 25| 26| 27| 28| 29| 2B | | 2C| 34| 60| | 62| 2E| 2F| 47| + |-------| |-----------------------------------------------------------| |------------ |---------------| + | 19| 1A| | 35 | 36| 37| 38| 39| 3A| 3B| 3C| 3D| 3E| 3F| 40| 41| 58 | | 42| 4A| 7B| | 44| 45| 46| | + |-------| |-----------------------------------------------------------| `-----------' |-----------| 7D| + | 31| 33| | 77 | 4D| 4E| 4F| 50| 51| 52| 53| 54| 55| 56| 57| 59 | | 5B| 5C| 5D| | + |-------| |-----------------------------------------------------------| ,---. |-----------|---| + | 48| 49| | 63 | 64| 65| 66| 67| 68| 69| 6A| 6B| 6C| 6D| 6E | | 14| | 70| 71| 72| | + |-------| |-----------------------------------------------------------| .-----------. |-----------| 5A| + | 5F| 61| | 4C | 13| 78 | 79 | 7A | 43| 0D| | 18| 1B| 1C| | 5E | 32| | + `-------' `-----------------------------------------------------------' `-----------' `---------------' +*/ +#define LAYOUT_ansi( \ + K76, K1D, K05,K06,K08,K0A, K0C,K0E,K10,K11, K12,K07,K09,K0B, K16,K17,K15, K2D,K02,K04,K30, \ + K01,K03, K2A,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K28,K29, K2B, K2C,K34,K60, K62,K2E,K2F,K47, \ + K19,K1A, K35, K36,K37,K38,K39,K3A,K3B,K3C,K3D,K3E,K3F,K40,K41, K58, K42,K4A,K7B, K44,K45,K46,K7D, \ + K31,K33, K77, K4D,K4E,K4F,K50,K51,K52,K53,K54,K55,K56,K57, K59, K5B,K5C,K5D, \ + K48,K49, K63, K64,K65,K66,K67,K68,K69,K6A,K6B,K6C,K6D, K6E, K14, K70,K71,K72,K5A, \ + K5F,K61, K4C,K13, K78, K79, K7A, K43, K0D, K18,K1B,K1C, K5E, K32 \ +) { \ + { KC_NO, K01 , K02 , K03 , K04 , K05 , K06 , K07 }, \ + { K08 , K09 , K0A , K0B , K0C , K0D , K0E , KC_NO,}, \ + { K10 , K11 , K12 , K13 , K14 , K15 , K16 , K17 }, \ + { K18 , K19 , K1A , K1B , K1C , K1D , K1E , K1F }, \ + { K20 , K21 , K22 , K23 , K24 , K25 , K26 , K27 }, \ + { K28 , K29 , K2A , K2B , K2C , K2D , K2E , K2F }, \ + { K30 , K31 , K32 , K33 , K34 , K35 , K36 , K37 }, \ + { K38 , K39 , K3A , K3B , K3C , K3D , K3E , K3F }, \ + { K40 , K41 , K42 , K43 , K44 , K45 , K46 , K47 }, \ + { K48 , K49 , K4A , KC_NO, K4C , K4D , K4E , K4F }, \ + { K50 , K51 , K52 , K53 , K54 , K55 , K56 , K57 }, \ + { K58 , K59 , K5A , K5B , K5C , K5D , K5E , K5F }, \ + { K60 , K61 , K62 , K63 , K64 , K65 , K66 , K67 }, \ + { K68 , K69 , K6A , K6B , K6C , K6D , K6E , KC_NO }, \ + { K70 , K71 , K72 , KC_NO, KC_NO, KC_NO, K76 , K77 }, \ + { K78 , K79 , K7A , K7B , KC_NO, K7D , KC_NO, KC_NO } \ +} +#endif From 0793abfd19d994e68f4b449eb2fed7ea51aa3e2f Mon Sep 17 00:00:00 2001 From: Patrick Hener Date: Fri, 12 Oct 2018 19:31:08 +0200 Subject: [PATCH 270/788] Add sendstring_german.h (#4124) * added sweet16 test keymap and touched sendstring_german.h * added sendstring_german.h * Delete keymap.c As suggested deleted the keymap file. --- quantum/keymap_extras/sendstring_german.h | 81 +++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 quantum/keymap_extras/sendstring_german.h diff --git a/quantum/keymap_extras/sendstring_german.h b/quantum/keymap_extras/sendstring_german.h new file mode 100644 index 000000000..1eaafee31 --- /dev/null +++ b/quantum/keymap_extras/sendstring_german.h @@ -0,0 +1,81 @@ +/* Copyright 2018 Patrick Hener + * + * 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 . + */ +/* Sendstring definitions for the German layout */ +#ifndef SENDSTRING_GERMAN +#define SENDSTRING_GERMAN + +#include "keymap_german.h" + +const bool ascii_to_shift_lut[0x80] PROGMEM = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 1, 1, 0, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 0 +}; + +/* Until an ALT table/functionality is added, the following symbols will not work: +* § @ [ ] { } \ ~ äA öÖ ß ´ +* Following characters can be printed using other characters like so: +* [ in makro will be ü +* { in makro will be Ü +* ~ in makro will be ° +*/ +const uint8_t ascii_to_keycode_lut[0x80] PROGMEM = { + 0, 0, 0, 0, 0, 0, 0, 0, + KC_BSPC, KC_TAB, KC_ENT, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, KC_ESC, 0, 0, 0, 0, + + /* SPACE ! " # $ % & ' */ + KC_SPC, KC_1, KC_2, DE_HASH, KC_4, KC_5, KC_6, DE_HASH, + /* ( ) * + , - . / */ + KC_8, KC_9, DE_PLUS, DE_PLUS, KC_COMM, DE_MINS, KC_DOT, KC_7, + /* 0 1 2 3 4 5 6 7 */ + KC_0, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, + /* 8 9 : ; < = > ? */ + KC_8, KC_9, KC_DOT, KC_COMM, DE_LESS, KC_0, DE_LESS, KC_MINS, + /* @ A B C D E F G */ + KC_2, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, + /* H I J K L M N O */ + KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, + /* P Q R S T U V W */ + KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W, + /* X Y Z [ \ ] ^ _ */ + KC_X, KC_Y, KC_Z, KC_LBRC, KC_BSLS, KC_RBRC, DE_CIRC, DE_MINS, + /* ` a b c d e f g */ + DE_ACUT, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, + /* h i j k l m n o */ + KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, + /* p q r s t u v w */ + KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W, + /* x y z { | } ~ DELETE */ + KC_X, KC_Y, KC_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_GRV, KC_DEL +}; + +#endif From e5c315f961a55ba31b44b70e4554a3969a788a99 Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Fri, 12 Oct 2018 10:34:52 -0700 Subject: [PATCH 271/788] Treasure Type9 Fix: change diode direction to ROW2COL (#4125) --- keyboards/treasure/type9/config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/treasure/type9/config.h b/keyboards/treasure/type9/config.h index 55f0a8595..367c53cb9 100644 --- a/keyboards/treasure/type9/config.h +++ b/keyboards/treasure/type9/config.h @@ -46,7 +46,7 @@ along with this program. If not, see . #define UNUSED_PINS /* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ -#define DIODE_DIRECTION COL2ROW +#define DIODE_DIRECTION ROW2COL #define BACKLIGHT_PIN B5 // #define BACKLIGHT_BREATHING From d81d216d72fe4e50da22259558e86c70a4f14a8d Mon Sep 17 00:00:00 2001 From: asakuno Date: Sat, 13 Oct 2018 16:40:42 +0900 Subject: [PATCH 272/788] Fix Typo in Custom Quantum functions document (led_state) (#4129) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit *_LOCK   ↓ DEL --- docs/custom_quantum_functions.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/custom_quantum_functions.md b/docs/custom_quantum_functions.md index b077e4b78..5b95450f2 100644 --- a/docs/custom_quantum_functions.md +++ b/docs/custom_quantum_functions.md @@ -117,12 +117,12 @@ void led_set_user(uint8_t usb_led) { } else { PORTB &= ~(1<<2); } - if (usb_led & (1< Date: Sat, 13 Oct 2018 21:46:46 +0100 Subject: [PATCH 273/788] Keymap: Move navigation buttons closer to the middle on XD75:skewwhiffy (#4118) * RGB toggle button * Remove custom lighting effects * Fix small bug in Symbols layer * Ignore mod tap interrupt in XD75 for skewwhiffy, and split layers into two for more flexibility and fix persistent layer issue * Replace shift in nav layer with IntelliJ omnibox shortcut to avoid a sticky shift * Remove custom setting in config, because it were annoying, it were. * Move navigation buttons in one key * Some review markups * Use enums for layers * Use LAYOUT_ortho_5x15 * Revert some capitalization changes made by accident --- keyboards/xd75/keymaps/skewwhiffy/config.h | 24 -- keyboards/xd75/keymaps/skewwhiffy/keymap.c | 277 +++++++++------------ 2 files changed, 111 insertions(+), 190 deletions(-) delete mode 100644 keyboards/xd75/keymaps/skewwhiffy/config.h diff --git a/keyboards/xd75/keymaps/skewwhiffy/config.h b/keyboards/xd75/keymaps/skewwhiffy/config.h deleted file mode 100644 index f52a97bbc..000000000 --- a/keyboards/xd75/keymaps/skewwhiffy/config.h +++ /dev/null @@ -1,24 +0,0 @@ -/* Copyright 2017 REPLACE_WITH_YOUR_NAME - * - * 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 . - */ - -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -// place overrides here - -#endif diff --git a/keyboards/xd75/keymaps/skewwhiffy/keymap.c b/keyboards/xd75/keymaps/skewwhiffy/keymap.c index 11fa2f0e6..33f386808 100644 --- a/keyboards/xd75/keymaps/skewwhiffy/keymap.c +++ b/keyboards/xd75/keymaps/skewwhiffy/keymap.c @@ -13,41 +13,49 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#include "xd75.h" +#include QMK_KEYBOARD_H #include "keymap_uk.h" -// Fillers to make layering more clear -#define _______ KC_TRNS // Layer shorthand -#define _CM 0 // Colemak -#define _DV 1 // Dvorak -#define _QW 2 // QWERTY -#define _NB 3 // Numbers -#define _SY 4 // Symbols -#define _NAV 5 // Navigation +enum Layers { + cm, // colemak + dv, // dvorak + qw, // qwerty + nbl, // numbers left + nbr, // numbers right + syl, // symbols left + syr, // symbols right + nal, // navigation left + nar // navigation right +}; // Layer buttons #define _Z_SFT SFT_T(UK_Z) #define _SCLSH SFT_T(UK_SCLN) #define _SLSH SFT_T(UK_SLSH) -#define _X_NB LT(_NB, UK_X) -#define _Q_NB LT(_NB, UK_Q) -#define _DOT_NB LT(_NB, UK_DOT) -#define _V_NB LT(_NB, UK_V) -#define _C_SY LT(_SY, UK_C) -#define _J_SY LT(_SY, UK_J) -#define _W_SY LT(_SY, UK_W) -#define _COM_SY LT(_SY, UK_COMM) -#define _AST_SY LT(_SY, UK_PAST) -#define _B_NAV LT(_NAV, UK_B) -#define _X_NAV LT(_NAV, UK_X) -#define _K_NAV LT(_NAV, UK_K) -#define _N_NAV LT(_NAV, UK_N) -#define _F1_NB LT(_NB, UK_F1) -#define _3_NB LT(_NB, UK_3) + +#define _X_NB LT(nbl, UK_X) +#define _Q_NB LT(nbl, UK_Q) +#define _DOT_NB LT(nbr, UK_DOT) +#define _V_NB LT(nbr, UK_V) +#define __NBL LT(nbl, _______) +#define __NBR LT(nbr, _______) + +#define _C_SY LT(syl, UK_C) +#define _J_SY LT(syl, UK_J) +#define _W_SY LT(syr, UK_W) +#define _COM_SY LT(syr, UK_COMM) +#define __SYL LT(syl, _______) +#define __SYR LT(syr, _______) + +#define _V_NAL LT(nal, UK_V) +#define _K_NAL LT(nal, UK_K) +#define _M_NAR LT(nar, UK_M) +#define __NAL LT(nal, _______) +#define __NAR LT(nar, _______) // Custom hotkeys -#define _TERM LCTL(UK_QUOT) // Hotkey for Cmder or iTerm +#define _TERM LCTL(UK_QUOT) // Hotkey for terminal #define _S_TAB S(UK_TAB) #define _C_LEFT LCTL(UK_LEFT) #define _C_RGHT LCTL(UK_RGHT) @@ -55,35 +63,34 @@ #define _A_RGHT LALT(UK_RGHT) enum custom_keycodes { - L_NEXT = SAFE_RANGE, - L_SB + IJ_OMN = SAFE_RANGE // IntelliJ Omnibox }; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -/* Colemak _CM +/* Colemak * .--------------------------------------------------------------------------------------------------------------------------------------. - * | | | | | | | | | | | | | | L_NEXT | L_SB | + * | | | | | | | | | | | | | | | | * |--------------------------------------------------------------------------------------------------------------------------------------| * | Q | W | F | P | G | | | | | | J | L | U | Y | ; | * |--------------------------------------------------------------------------------------------------------------------------------------| * | A | R | S | T | D | | | | | | H | N | E | I | O | * |--------------------------------------------------------------------------------------------------------------------------------------| * | Z | X | C | V | B | | | | | | K | M | , | . | / | - * | SHIFT | NUMBER | SYMBOL | | NAV | | | | | | NAV | | SYMBOL | FUNC | SHIFT | + * | SHIFT | NUMBER | SYMBOL | NAV | | | | | | | | NAV | SYMBOL | FUNC | SHIFT | * |--------------------------------------------------------------------------------------------------------------------------------------| * | LSHIFT | LCTRL | LALT | LGUI | SPACE | ENT | | | | DEL | BKSPC | RGUI | RALT | RCTRL | RSHIFT | * .--------------------------------------------------------------------------------------------------------------------------------------. */ - [_CM] = { - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, L_NEXT, L_SB }, - { UK_Q, UK_W, UK_F, UK_P, UK_G, _______, _______, _______, _______, _______, UK_J, UK_L, UK_U, UK_Y, UK_SCLN }, - { UK_A, UK_R, UK_S, UK_T, UK_D, _______, _______, _______, _______, _______, UK_H, UK_N, UK_E, UK_I, UK_O }, - { _Z_SFT, _X_NB, _C_SY, UK_V, _B_NAV, _______, _______, _______, _______, _______, _K_NAV, UK_M, _COM_SY, _DOT_NB, _SLSH }, - { UK_LSFT, UK_LCTL, UK_LALT, UK_LGUI, UK_SPC, UK_ENT, _______, _______, _______, UK_DEL, UK_BSPC, UK_RGUI, UK_RALT, UK_RCTL, UK_RSFT } - }, + [cm] = LAYOUT_ortho_5x15( \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + UK_Q, UK_W, UK_F, UK_P, UK_G, _______, _______, _______, _______, _______, UK_J, UK_L, UK_U, UK_Y, UK_SCLN, \ + UK_A, UK_R, UK_S, UK_T, UK_D, _______, _______, _______, _______, _______, UK_H, UK_N, UK_E, UK_I, UK_O , \ + _Z_SFT, _X_NB, _C_SY, _V_NAL, UK_B, _______, _______, _______, _______, _______, UK_K, _M_NAR, _COM_SY, _DOT_NB, _SLSH , \ + UK_LSFT, UK_LCTL, UK_LALT, UK_LGUI, UK_SPC, UK_ENT, _______, _______, _______, UK_DEL, UK_BSPC, UK_RGUI, UK_RALT, UK_RCTL, UK_RSFT \ + ), -/* DVORAK _DV +/* Dvorak * .--------------------------------------------------------------------------------------------------------------------------------------. * | | | | | | | | | | | | | | | | * |--------------------------------------------------------------------------------------------------------------------------------------| @@ -92,18 +99,18 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | A | O | E | U | I | | | | | | D | H | T | N | S | * |--------------------------------------------------------------------------------------------------------------------------------------| * | ; | Q | J | K | X | | | | | | B | M | W | V | Z | - * | SHIFT | NUMBER | SYMBOL | | NAV | | | | | | NAV | | SYMBOL | FUNC | SHIFT | + * | SHIFT | NUMBER | SYMBOL | NAV | | | | | | | | NAV | SYMBOL | FUNC | SHIFT | * |--------------------------------------------------------------------------------------------------------------------------------------| * | | | | | | | | | | | | | | | | * |--------------------------------------------------------------------------------------------------------------------------------------| */ - [_DV] = { - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, - { UK_QUOT, UK_COMM, UK_DOT, UK_P, UK_Y, _______, _______, _______, _______, _______, UK_F, UK_G, UK_C, UK_R, UK_L }, - { UK_A, UK_O, UK_E, UK_U, UK_I, _______, _______, _______, _______, _______, UK_D, UK_H, UK_T, UK_N, UK_S }, - { _SCLSH, _Q_NB, _J_SY, UK_K, _X_NAV, _______, _______, _______, _______, _______, _B_NAV, UK_M, _W_SY, _V_NB, _Z_SFT }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ } - }, + [dv] = LAYOUT_ortho_5x15( \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + UK_QUOT, UK_COMM, UK_DOT, UK_P, UK_Y, _______, _______, _______, _______, _______, UK_F, UK_G, UK_C, UK_R, UK_L , \ + UK_A, UK_O, UK_E, UK_U, UK_I, _______, _______, _______, _______, _______, UK_D, UK_H, UK_T, UK_N, UK_S , \ + _SCLSH, _Q_NB, _J_SY, _K_NAL, UK_X, _______, _______, _______, _______, _______, UK_B, _M_NAR, _W_SY, _V_NB, _Z_SFT , \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), /* QWERTY _QW * .--------------------------------------------------------------------------------------------------------------------------------------. @@ -114,20 +121,20 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | A | S | D | F | G | | | | | | H | J | K | L | ; | * |--------------------------------------------------------------------------------------------------------------------------------------| * | Z | X | C | V | B | | | | | | N | M | , | . | / | - * | SHIFT | NUMBER | SYMBOL | | NAV | | | | | | NAV | | SYMBOL | FUNC | SHIFT | + * | SHIFT | NUMBER | SYMBOL | NAV | | | | | | | | NAV | SYMBOL | FUNC | SHIFT | * |--------------------------------------------------------------------------------------------------------------------------------------| * | | | | | | | | | | | | | | | | * |--------------------------------------------------------------------------------------------------------------------------------------| * | LSHIFT | LCTRL | LALT | LGUI | SPACE | ENT | | | | DEL | BKSPC | RGUI | RALT | RCTRL | RSHIFT | * .--------------------------------------------------------------------------------------------------------------------------------------. */ - [_QW] = { - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, - { UK_Q, UK_W, UK_E, UK_R, UK_T, _______, _______, _______, _______, _______, UK_Y, UK_U, UK_I, UK_O, UK_P }, - { UK_A, UK_S, UK_D, UK_F, UK_G, _______, _______, _______, _______, _______, UK_H, UK_J, UK_K, UK_L, UK_SCLN }, - { _Z_SFT, _X_NB, _C_SY, UK_V, _B_NAV, _______, _______, _______, _______, _______, _N_NAV, UK_M, _COM_SY, _DOT_NB, _SLSH }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ } - }, + [qw] = LAYOUT_ortho_5x15( \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + UK_Q, UK_W, UK_E, UK_R, UK_T, _______, _______, _______, _______, _______, UK_Y, UK_U, UK_I, UK_O, UK_P , \ + UK_A, UK_S, UK_D, UK_F, UK_G, _______, _______, _______, _______, _______, UK_H, UK_J, UK_K, UK_L, UK_SCLN, \ + _Z_SFT, _X_NB, _C_SY, _V_NAL, UK_B, _______, _______, _______, _______, _______, UK_N, _M_NAR, _COM_SY, _DOT_NB, _SLSH , \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), /* Numbers _NB * .--------------------------------------------------------------------------------------------------------------------------------------. @@ -142,15 +149,22 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | | | | | | | * '--------------------------------------------------------------------------------------------------------------------------------------' */ - [_NB] = { - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, - { _______, UK_F7, UK_F8, UK_F9, UK_F10, _______, _______, _______, _______, _______, _______, UK_7, UK_8, UK_9, _______ }, - { _______, UK_F4, UK_F5, UK_F6, UK_F11, _______, _______, _______, _______, _______, _______, UK_4, UK_5, UK_6, _______ }, - { _______, _F1_NB, UK_F2, UK_F3, UK_F12, _______, _______, _______, _______, _______, UK_0, UK_1, UK_2, _3_NB, UK_DOT }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ } - }, + [nbl] = LAYOUT_ortho_5x15( \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, UK_F7, UK_F8, UK_F9, UK_F10, _______, _______, _______, _______, _______, _______, UK_7, UK_8, UK_9, _______, \ + _______, UK_F4, UK_F5, UK_F6, UK_F11, _______, _______, _______, _______, _______, _______, UK_4, UK_5, UK_6, _______, \ + _______, __NBL, UK_F2, UK_F3, UK_F12, _______, _______, _______, _______, _______, UK_0, UK_1, UK_2, UK_3, UK_DOT, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), + [nbr] = LAYOUT_ortho_5x15( \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, UK_F7, UK_F8, UK_F9, UK_F10, _______, _______, _______, _______, _______, _______, UK_7, UK_8, UK_9, _______, \ + _______, UK_F4, UK_F5, UK_F6, UK_F11, _______, _______, _______, _______, _______, _______, UK_4, UK_5, UK_6, _______, \ + _______, UK_F1, UK_F2, UK_F3, UK_F12, _______, _______, _______, _______, _______, UK_0, UK_1, UK_2, __NBR, UK_DOT , \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), -/* Symbols _SY + /* Symbols _SY * .--------------------------------------------------------------------------------------------------------------------------------------. * | | | | | | | | | | | | | | | | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| @@ -163,17 +177,24 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | | | | | | | * '--------------------------------------------------------------------------------------------------------------------------------------' */ - [_SY] = { - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, - { UK_EXLM, UK_PND, UK_UNDS, UK_MINS, UK_TILD, _______, _______, _______, _______, _______, UK_BSLS, UK_LCBR, UK_RCBR, UK_SLSH, UK_HASH }, - { UK_DLR, UK_PERC, UK_PLUS, UK_EQL, _______, _______, _______, _______, _______, _______, UK_DQUO, UK_LPRN, UK_RPRN, UK_QUOT, UK_AT }, - { UK_CIRC, UK_AMPR, _AST_SY, UK_PIPE, _______, _______, _______, _______, _______, _______, UK_LABK, UK_LBRC, _COM_SY, UK_RABK, UK_GRV }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ } - }, + [syl] = LAYOUT_ortho_5x15( \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + UK_EXLM, UK_PND, UK_UNDS, UK_MINS, UK_TILD, _______, _______, _______, _______, _______, UK_BSLS, UK_LCBR, UK_RCBR, UK_SLSH, UK_HASH, \ + UK_DLR, UK_PERC, UK_PLUS, UK_EQL, _______, _______, _______, _______, _______, _______, UK_DQUO, UK_LPRN, UK_RPRN, UK_QUOT, UK_AT , \ + UK_CIRC, UK_AMPR, __SYL, UK_PIPE, _______, _______, _______, _______, _______, _______, UK_LABK, UK_LBRC, UK_RBRC, UK_RABK, UK_GRV , \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), + [syr] = LAYOUT_ortho_5x15( \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + UK_EXLM, UK_PND, UK_UNDS, UK_MINS, UK_TILD, _______, _______, _______, _______, _______, UK_BSLS, UK_LCBR, UK_RCBR, UK_SLSH, UK_HASH, \ + UK_DLR, UK_PERC, UK_PLUS, UK_EQL, _______, _______, _______, _______, _______, _______, UK_DQUO, UK_LPRN, UK_RPRN, UK_QUOT, UK_AT , \ + UK_CIRC, UK_AMPR, UK_ASTR, UK_PIPE, _______, _______, _______, _______, _______, _______, UK_LABK, UK_LBRC, __SYR, UK_RABK, UK_GRV , \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), /* - * Navigation + * Navigation _NA * .--------------------------------------------------------------------------------------------------------------------------------------. - * | RESET | COLEMA | DVORAK | QWERTY | | | | | | | | | | | | + * | RESET | COLEMA | DVORAK | QWERTY | | RGB_TG | | | | | | | | | | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| * | Esc | Ctrl L | Up | Ctrl R | | RGB HD | RGB HI | | | | | PtSn | ScLk | Pause | | * +--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| @@ -184,105 +205,29 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | RGB RMD| RGB MD | | | | | | | | | * '--------------------------------------------------------------------------------------------------------------------------------------' */ - [_NAV] = { - { RESET, DF(_CM), DF(_DV), DF(_QW), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, - { UK_ESC, _C_LEFT, UK_UP , _C_RGHT, _______, RGB_HUD, RGB_HUI, _______, _______, _______, _______, UK_PSCR, UK_SLCK, UK_PAUS, _______ }, - { UK_TAB, UK_LEFT, UK_DOWN, UK_RGHT, _______, RGB_SAD, RGB_SAI, _______, _______, _______, _______, UK_INS, UK_HOME, UK_PGUP, _TERM }, - { _S_TAB, _A_LEFT, UK_LSFT, _A_RGHT, _B_NAV, RGB_VAD, RGB_VAI, _______, _______, _______, _K_NAV, UK_SLCK, UK_END, UK_PGDN, _______ }, - { _______, _______, _______, _______, _______, RGB_RMOD,RGB_MOD, _______, _______, _______, _______, _______, _______, _______, _______ } - }, + [nal] = LAYOUT_ortho_5x15( \ + RESET, DF(cm), DF(dv), DF(qw), _______, RGB_TOG, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + UK_ESC, _C_LEFT, UK_UP , _C_RGHT, _______, RGB_HUD, RGB_HUI, _______, _______, _______, _______, UK_PSCR, UK_SLCK, UK_PAUS, _______, \ + UK_TAB, UK_LEFT, UK_DOWN, UK_RGHT, _______, RGB_SAD, RGB_SAI, _______, _______, _______, _______, UK_INS, UK_HOME, UK_PGUP, _TERM , \ + _S_TAB, _A_LEFT, IJ_OMN, __NAL, _______, RGB_VAD, RGB_VAI, _______, _______, _______, _______, UK_SLCK, UK_END, UK_PGDN, _______, \ + _______, _______, _______, _______, _______, RGB_RMOD,RGB_MOD, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), + [nar] = LAYOUT_ortho_5x15( \ + RESET, DF(cm), DF(dv), DF(qw), _______, RGB_TOG, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + UK_ESC, _C_LEFT, UK_UP , _C_RGHT, _______, RGB_HUD, RGB_HUI, _______, _______, _______, _______, UK_PSCR, UK_SLCK, UK_PAUS, _______, \ + UK_TAB, UK_LEFT, UK_DOWN, UK_RGHT, _______, RGB_SAD, RGB_SAI, _______, _______, _______, _______, UK_INS, UK_HOME, UK_PGUP, _TERM , \ + _S_TAB, _A_LEFT, IJ_OMN, _A_RGHT, _______, RGB_VAD, RGB_VAI, _______, _______, _______, _______, __NAR, UK_END, UK_PGDN, _______, \ + _______, _______, _______, _______, _______, RGB_RMOD,RGB_MOD, _______, _______, _______, _______, _______, _______, _______, _______ \ + ) }; -const uint16_t PROGMEM fn_actions[] = { - -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - // MACRODOWN only works in this function - switch(id) { - case 0: - if (record->event.pressed) { - register_code(KC_RSFT); - #ifdef BACKLIGHT_ENABLE - backlight_step(); - #endif - } else { - unregister_code(KC_RSFT); - } - break; - } - return MACRO_NONE; -}; - -bool lightsOn = true; -int keyPresses = 0; -int effect = 0; -uint32_t key_timer; - -void resetCounts(void) { - effect++; - keyPresses = 0; - key_timer = timer_read32(); -} - -void matrix_scan_user(void) { - if (!lightsOn) { - rgblight_setrgb(0, 0, 0); - return; - } - if (timer_elapsed32(key_timer) > 60000) { - resetCounts(); - } - switch (effect) { - case 0: - rgblight_effect_breathing(3); - break; - case 1: - rgblight_effect_knight(3); - break; - case 2: - rgblight_effect_rainbow_swirl(128); - break; - case 3: - rgblight_effect_snake(30); - break; - case 4: - rgblight_effect_rainbow_swirl(128); - break; - case 5: - rgblight_effect_rainbow_mood(128); - break; - case 6: - rgblight_effect_christmas(); - break; - case 7: - rgblight_effect_rgbtest(); - break; - default: - effect = 0; - break; - } -} - bool process_record_user(uint16_t keycode, keyrecord_t *record) { - if (!record->event.pressed) return true; - if (keycode == L_SB) { - lightsOn = !lightsOn; - if (!lightsOn) { - keyPresses = 0; - } else { - resetCounts(); + if (record->event.pressed) { + switch(keycode) { + case IJ_OMN: + SEND_STRING(SS_TAP(X_LSHIFT)SS_TAP(X_LSHIFT)); + return false; } - return true; - } - if (keycode == L_NEXT) { - resetCounts(); - return true; - } - keyPresses++; - if (keyPresses > 100) { - resetCounts(); } return true; } From d7dea0e6d9a6e9a8ed7e760a996aac8f89560a5b Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 15 Oct 2018 08:31:26 -0700 Subject: [PATCH 274/788] Fix ErgoTravel Board It was not properly including the "config_common" files, and was causing it to break on the configurator. Additionally, updated this to use the split common code. --- keyboards/ergotravel/config.h | 73 +-- keyboards/ergotravel/ergotravel.h | 4 +- keyboards/ergotravel/i2c.c | 162 ------ keyboards/ergotravel/i2c.h | 49 -- keyboards/ergotravel/keymaps/ckofy/config.h | 6 +- keyboards/ergotravel/keymaps/ckofy/keymap.c | 12 +- keyboards/ergotravel/keymaps/ckofy/rules.mk | 3 - keyboards/ergotravel/keymaps/default/config.h | 7 +- keyboards/ergotravel/keymaps/default/rules.mk | 3 - keyboards/ergotravel/keymaps/ian/config.h | 7 +- keyboards/ergotravel/keymaps/ian/rules.mk | 3 - .../keymaps/jpconstantineau/config.h | 7 +- .../keymaps/jpconstantineau/rules.mk | 3 - keyboards/ergotravel/keymaps/viet/config.h | 6 +- keyboards/ergotravel/keymaps/viet/rules.mk | 3 - keyboards/ergotravel/matrix.c | 482 ------------------ keyboards/ergotravel/rev1/config.h | 6 +- keyboards/ergotravel/rules.mk | 10 +- keyboards/ergotravel/serial.c | 228 --------- keyboards/ergotravel/serial.h | 26 - keyboards/ergotravel/split_util.c | 86 ---- keyboards/ergotravel/split_util.h | 20 - 22 files changed, 20 insertions(+), 1186 deletions(-) delete mode 100644 keyboards/ergotravel/i2c.c delete mode 100644 keyboards/ergotravel/i2c.h delete mode 100644 keyboards/ergotravel/matrix.c delete mode 100644 keyboards/ergotravel/serial.c delete mode 100644 keyboards/ergotravel/serial.h delete mode 100644 keyboards/ergotravel/split_util.c delete mode 100644 keyboards/ergotravel/split_util.h diff --git a/keyboards/ergotravel/config.h b/keyboards/ergotravel/config.h index beda546a0..213080181 100644 --- a/keyboards/ergotravel/config.h +++ b/keyboards/ergotravel/config.h @@ -15,76 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef REV1_CONFIG_H -#define REV1_CONFIG_H +#pragma once -#include QMK_KEYBOARD_CONFIG_H +#include "config_common.h" -/* USB Device descriptor parameter */ -#define VENDOR_ID 0xCEEB -#define PRODUCT_ID 0x1256 -#define DEVICE_VER 0x0100 -#define MANUFACTURER JPConstantineau.com -#define PRODUCT ErgoTravel Keyboard -#define DESCRIPTION Split 45 percent ergonomic keyboard - -/* key matrix size */ -// Rows are doubled-up -#define MATRIX_ROWS 8 -#define MATRIX_COLS 7 - -// wiring of each half -#define MATRIX_ROW_PINS { C6, D7, E6, B4 } -#define MATRIX_COL_PINS { F5, F6, F7, B1, B3, B2, B6 } - -/* COL2ROW or ROW2COL */ -#define DIODE_DIRECTION COL2ROW - -/* define if matrix has ghost */ -//#define MATRIX_HAS_GHOST - -/* number of backlight levels */ -// #define BACKLIGHT_LEVELS 3 - -/* Set 0 if debouncing isn't needed */ -#define DEBOUNCING_DELAY 5 - -/* 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 - -/* key combination for command */ -#define IS_COMMAND() ( \ - keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ -) - -#define BACKLIGHT_PIN B5 -#define BACKLIGHT_LEVELS 5 - -/* ws2812 RGB LED */ -#define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER -#define RGBLED_NUM 12 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD - -/* - * 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 - -#endif diff --git a/keyboards/ergotravel/ergotravel.h b/keyboards/ergotravel/ergotravel.h index 10bc4e2bb..7201db788 100644 --- a/keyboards/ergotravel/ergotravel.h +++ b/keyboards/ergotravel/ergotravel.h @@ -1,5 +1,4 @@ -#ifndef ERGOTRAVEL_H -#define ERGOTRAVEL_H +#pragma once #ifdef KEYBOARD_ergotravel_rev1 #include "rev1.h" @@ -21,4 +20,3 @@ KC_##L30, KC_##L31, KC_##L32, KC_##L33, KC_##L34, KC_##L35, KC_##R30, KC_##R31, KC_##R32, KC_##R33, KC_##R34, KC_##R35 \ ) -#endif \ No newline at end of file diff --git a/keyboards/ergotravel/i2c.c b/keyboards/ergotravel/i2c.c deleted file mode 100644 index 084c890c4..000000000 --- a/keyboards/ergotravel/i2c.c +++ /dev/null @@ -1,162 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include "i2c.h" - -#ifdef USE_I2C - -// Limits the amount of we wait for any one i2c transaction. -// Since were running SCL line 100kHz (=> 10μs/bit), and each transactions is -// 9 bits, a single transaction will take around 90μs to complete. -// -// (F_CPU/SCL_CLOCK) => # of μC cycles to transfer a bit -// poll loop takes at least 8 clock cycles to execute -#define I2C_LOOP_TIMEOUT (9+1)*(F_CPU/SCL_CLOCK)/8 - -#define BUFFER_POS_INC() (slave_buffer_pos = (slave_buffer_pos+1)%SLAVE_BUFFER_SIZE) - -volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE]; - -static volatile uint8_t slave_buffer_pos; -static volatile bool slave_has_register_set = false; - -// Wait for an i2c operation to finish -inline static -void i2c_delay(void) { - uint16_t lim = 0; - while(!(TWCR & (1<10. - // Check datasheets for more info. - TWBR = ((F_CPU/SCL_CLOCK)-16)/2; -} - -// Start a transaction with the given i2c slave address. The direction of the -// transfer is set with I2C_READ and I2C_WRITE. -// returns: 0 => success -// 1 => error -uint8_t i2c_master_start(uint8_t address) { - TWCR = (1< slave ACK -// 1 => slave NACK -uint8_t i2c_master_write(uint8_t data) { - TWDR = data; - TWCR = (1<= SLAVE_BUFFER_SIZE ) { - ack = 0; - slave_buffer_pos = 0; - } - slave_has_register_set = true; - } else { - i2c_slave_buffer[slave_buffer_pos] = TWDR; - BUFFER_POS_INC(); - } - break; - - case TW_ST_SLA_ACK: - case TW_ST_DATA_ACK: - // master has addressed this device as a slave transmitter and is - // requesting data. - TWDR = i2c_slave_buffer[slave_buffer_pos]; - BUFFER_POS_INC(); - break; - - case TW_BUS_ERROR: // something went wrong, reset twi state - TWCR = 0; - default: - break; - } - // Reset everything, so we are ready for the next TWI interrupt - TWCR |= (1< - -#ifndef F_CPU -#define F_CPU 16000000UL -#endif - -#define I2C_READ 1 -#define I2C_WRITE 0 - -#define I2C_ACK 1 -#define I2C_NACK 0 - -#define SLAVE_BUFFER_SIZE 0x10 - -// i2c SCL clock frequency -#define SCL_CLOCK 100000L - -extern volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE]; - -void i2c_master_init(void); -uint8_t i2c_master_start(uint8_t address); -void i2c_master_stop(void); -uint8_t i2c_master_write(uint8_t data); -uint8_t i2c_master_read(int); -void i2c_reset_state(void); -void i2c_slave_init(uint8_t address); - - -static inline unsigned char i2c_start_read(unsigned char addr) { - return i2c_master_start((addr << 1) | I2C_READ); -} - -static inline unsigned char i2c_start_write(unsigned char addr) { - return i2c_master_start((addr << 1) | I2C_WRITE); -} - -// from SSD1306 scrips -extern unsigned char i2c_rep_start(unsigned char addr); -extern void i2c_start_wait(unsigned char addr); -extern unsigned char i2c_readAck(void); -extern unsigned char i2c_readNak(void); -extern unsigned char i2c_read(unsigned char ack); - -#define i2c_read(ack) (ack) ? i2c_readAck() : i2c_readNak(); - -#endif diff --git a/keyboards/ergotravel/keymaps/ckofy/config.h b/keyboards/ergotravel/keymaps/ckofy/config.h index 41ec06657..7c99c093c 100644 --- a/keyboards/ergotravel/keymaps/ckofy/config.h +++ b/keyboards/ergotravel/keymaps/ckofy/config.h @@ -15,10 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "config_common.h" +#pragma once /* Use I2C or Serial, not both */ @@ -40,4 +37,3 @@ along with this program. If not, see . #define RGBLIGHT_SAT_STEP 8 #define RGBLIGHT_VAL_STEP 8 -#endif diff --git a/keyboards/ergotravel/keymaps/ckofy/keymap.c b/keyboards/ergotravel/keymaps/ckofy/keymap.c index cc2c33cca..9de5fa2b8 100644 --- a/keyboards/ergotravel/keymaps/ckofy/keymap.c +++ b/keyboards/ergotravel/keymaps/ckofy/keymap.c @@ -100,7 +100,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| , , , , , , , ,COMM, P1 , P2 , P3 ,PLUS, , //|----+----+----+----+----+----+----. .----+----+----+----+----+----+----| - , , , , , , , P0 ,NLCK, , , + , , , , , , , P0 ,NLCK, , , //`----+----+----+--+-+----/----/ \----\----+----+----+----+----' ), @@ -112,7 +112,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| ,UDO ,CUT ,CPY ,PST ,XXXX, , ,XXXX,XXXX,COMM,DOT ,SLSH, , //|----+----+----+----+----+----+----. .----+----+----+----+----+----+----| - , , , , , , , , , , , + , , , , , , , , , , , //`----+----+----+--+-+----/----/ \----\----+----+----+----+----' ), @@ -124,7 +124,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| , GRV,TILD,XXXX,EQL ,PLUS, , ,UNDS,MINS,COMM,DOT ,SLSH,ENT , //|----+----+----+----+----+----+----. .----+----+----+----+----+----+----| - , , , , , , , , , , , + , , , , , , , , , , , //`----+----+----+--+-+----/----/ \----\----+----+----+----+----' ), @@ -139,7 +139,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //|----+----+----+----+----+----+----. .----+----+----+----+----+----+----| , , , , , , , , ,VOLD,VOLU,MUTE //`----+----+----+--+-+----/----/ \----\----+----+----+----+----' - ) + ) }; @@ -148,9 +148,9 @@ const uint16_t PROGMEM fn_actions[] = { ,[F_ALT] = ACTION_MODS_ONESHOT (MOD_LALT) ,[F_CTRL] = ACTION_MODS_ONESHOT (MOD_LCTL) ,[F_NUMPAD] = ACTION_LAYER_TAP_TOGGLE(_NUMPAD) -// ,[F_LOWER] = ACTION_LAYER_TAP_TOGGLE(LOWER) // FN1 - Momentary Layer 1 (Lower) +// ,[F_LOWER] = ACTION_LAYER_TAP_TOGGLE(LOWER) // FN1 - Momentary Layer 1 (Lower) // ,[F_RAISE] = ACTION_LAYER_TAP_TOGGLE(RAISE) // FN2 - Momentary Layer 2 (Raise) -}; +}; diff --git a/keyboards/ergotravel/keymaps/ckofy/rules.mk b/keyboards/ergotravel/keymaps/ckofy/rules.mk index 457a3d01d..e69de29bb 100644 --- a/keyboards/ergotravel/keymaps/ckofy/rules.mk +++ b/keyboards/ergotravel/keymaps/ckofy/rules.mk @@ -1,3 +0,0 @@ -ifndef QUANTUM_DIR - include ../../../../Makefile -endif diff --git a/keyboards/ergotravel/keymaps/default/config.h b/keyboards/ergotravel/keymaps/default/config.h index abb8cfa8e..eeca26ce1 100644 --- a/keyboards/ergotravel/keymaps/default/config.h +++ b/keyboards/ergotravel/keymaps/default/config.h @@ -15,10 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "config_common.h" +#pragma once /* Use I2C or Serial, not both */ @@ -38,4 +35,4 @@ along with this program. If not, see . #define RGBLIGHT_SAT_STEP 8 #define RGBLIGHT_VAL_STEP 8 -#endif + diff --git a/keyboards/ergotravel/keymaps/default/rules.mk b/keyboards/ergotravel/keymaps/default/rules.mk index 457a3d01d..e69de29bb 100644 --- a/keyboards/ergotravel/keymaps/default/rules.mk +++ b/keyboards/ergotravel/keymaps/default/rules.mk @@ -1,3 +0,0 @@ -ifndef QUANTUM_DIR - include ../../../../Makefile -endif diff --git a/keyboards/ergotravel/keymaps/ian/config.h b/keyboards/ergotravel/keymaps/ian/config.h index b2e8ca9b5..dea5b121e 100644 --- a/keyboards/ergotravel/keymaps/ian/config.h +++ b/keyboards/ergotravel/keymaps/ian/config.h @@ -15,10 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "config_common.h" +#pragma once /* Use I2C or Serial, not both */ @@ -38,4 +35,4 @@ along with this program. If not, see . #define RGBLIGHT_SAT_STEP 8 #define RGBLIGHT_VAL_STEP 8 -#endif + diff --git a/keyboards/ergotravel/keymaps/ian/rules.mk b/keyboards/ergotravel/keymaps/ian/rules.mk index 457a3d01d..e69de29bb 100644 --- a/keyboards/ergotravel/keymaps/ian/rules.mk +++ b/keyboards/ergotravel/keymaps/ian/rules.mk @@ -1,3 +0,0 @@ -ifndef QUANTUM_DIR - include ../../../../Makefile -endif diff --git a/keyboards/ergotravel/keymaps/jpconstantineau/config.h b/keyboards/ergotravel/keymaps/jpconstantineau/config.h index abb8cfa8e..eeca26ce1 100644 --- a/keyboards/ergotravel/keymaps/jpconstantineau/config.h +++ b/keyboards/ergotravel/keymaps/jpconstantineau/config.h @@ -15,10 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "config_common.h" +#pragma once /* Use I2C or Serial, not both */ @@ -38,4 +35,4 @@ along with this program. If not, see . #define RGBLIGHT_SAT_STEP 8 #define RGBLIGHT_VAL_STEP 8 -#endif + diff --git a/keyboards/ergotravel/keymaps/jpconstantineau/rules.mk b/keyboards/ergotravel/keymaps/jpconstantineau/rules.mk index 457a3d01d..e69de29bb 100644 --- a/keyboards/ergotravel/keymaps/jpconstantineau/rules.mk +++ b/keyboards/ergotravel/keymaps/jpconstantineau/rules.mk @@ -1,3 +0,0 @@ -ifndef QUANTUM_DIR - include ../../../../Makefile -endif diff --git a/keyboards/ergotravel/keymaps/viet/config.h b/keyboards/ergotravel/keymaps/viet/config.h index 24e95b2b9..1c6c400b4 100644 --- a/keyboards/ergotravel/keymaps/viet/config.h +++ b/keyboards/ergotravel/keymaps/viet/config.h @@ -15,10 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "config_common.h" +#pragma once /* Use I2C or Serial, not both */ @@ -39,4 +36,3 @@ along with this program. If not, see . #define RGBLIGHT_VAL_STEP 20 #define RGBLIGHT_LIMIT_VAL 220 -#endif diff --git a/keyboards/ergotravel/keymaps/viet/rules.mk b/keyboards/ergotravel/keymaps/viet/rules.mk index da4752731..24963d46b 100644 --- a/keyboards/ergotravel/keymaps/viet/rules.mk +++ b/keyboards/ergotravel/keymaps/viet/rules.mk @@ -2,6 +2,3 @@ RGBLIGHT_ENABLE = yes BACKLIGHT_ENABLE = no UNICODE_ENABLE = yes -ifndef QUANTUM_DIR - include ../../../../Makefile -endif diff --git a/keyboards/ergotravel/matrix.c b/keyboards/ergotravel/matrix.c deleted file mode 100644 index 4061924dc..000000000 --- a/keyboards/ergotravel/matrix.c +++ /dev/null @@ -1,482 +0,0 @@ -/* -Copyright 2018 Pierre Constantineau - -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 . -*/ - -/* - * scan matrix - */ -#include -#include -#include -#include "wait.h" -#include "print.h" -#include "debug.h" -#include "util.h" -#include "matrix.h" -#include "split_util.h" -#include "pro_micro.h" -#include "config.h" -#include "timer.h" -#include "backlight.h" - -#ifdef USE_I2C -# include "i2c.h" -#else // USE_SERIAL -# include "serial.h" -#endif - -#ifndef DEBOUNCING_DELAY -# define DEBOUNCING_DELAY 5 -#endif - -#if (DEBOUNCING_DELAY > 0) - static uint16_t debouncing_time; - static bool debouncing = false; -#endif - -#if (MATRIX_COLS <= 8) -# define print_matrix_header() print("\nr/c 01234567\n") -# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row)) -# define matrix_bitpop(i) bitpop(matrix[i]) -# define ROW_SHIFTER ((uint8_t)1) -#else -# error "Currently only supports 8 COLS" -#endif -static matrix_row_t matrix_debouncing[MATRIX_ROWS]; - -#define ERROR_DISCONNECT_COUNT 5 - -#define SERIAL_LED_ADDR 0x00 - -#define ROWS_PER_HAND (MATRIX_ROWS/2) - -static uint8_t error_count = 0; - -static const uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; -static const uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; - -/* matrix state(1:on, 0:off) */ -static matrix_row_t matrix[MATRIX_ROWS]; -static matrix_row_t matrix_debouncing[MATRIX_ROWS]; - -#if (DIODE_DIRECTION == COL2ROW) - static void init_cols(void); - static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row); - static void unselect_rows(void); - static void select_row(uint8_t row); - static void unselect_row(uint8_t row); -#elif (DIODE_DIRECTION == ROW2COL) - static void init_rows(void); - static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col); - static void unselect_cols(void); - static void unselect_col(uint8_t col); - static void select_col(uint8_t col); -#endif - - -__attribute__ ((weak)) -void matrix_init_kb(void) { - matrix_init_user(); -} - -__attribute__ ((weak)) -void matrix_scan_kb(void) { - matrix_scan_user(); -} - -__attribute__ ((weak)) -void matrix_init_user(void) { -} - -__attribute__ ((weak)) -void matrix_scan_user(void) { -} - -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - -void matrix_init(void) -{ - debug_enable = true; - debug_matrix = true; - debug_mouse = true; - // initialize row and col - unselect_rows(); - init_cols(); - - TX_RX_LED_INIT; - - // initialize matrix state: all keys off - for (uint8_t i=0; i < MATRIX_ROWS; i++) { - matrix[i] = 0; - matrix_debouncing[i] = 0; - } - - matrix_init_quantum(); - -} - -uint8_t _matrix_scan(void) -{ - int offset = isLeftHand ? 0 : (ROWS_PER_HAND); -#if (DIODE_DIRECTION == COL2ROW) - // Set row, read cols - for (uint8_t current_row = 0; current_row < ROWS_PER_HAND; current_row++) { -# if (DEBOUNCING_DELAY > 0) - bool matrix_changed = read_cols_on_row(matrix_debouncing+offset, current_row); - - if (matrix_changed) { - debouncing = true; - debouncing_time = timer_read(); - PORTD ^= (1 << 2); - } - -# else - read_cols_on_row(matrix+offset, current_row); -# endif - - } - -#elif (DIODE_DIRECTION == ROW2COL) - // Set col, read rows - for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) { -# if (DEBOUNCING_DELAY > 0) - bool matrix_changed = read_rows_on_col(matrix_debouncing+offset, current_col); - if (matrix_changed) { - debouncing = true; - debouncing_time = timer_read(); - } -# else - read_rows_on_col(matrix+offset, current_col); -# endif - - } -#endif - -# if (DEBOUNCING_DELAY > 0) - if (debouncing && (timer_elapsed(debouncing_time) > DEBOUNCING_DELAY)) { - for (uint8_t i = 0; i < ROWS_PER_HAND; i++) { - matrix[i+offset] = matrix_debouncing[i+offset]; - } - debouncing = false; - } -# endif - - return 1; -} - -#ifdef USE_I2C - -// Get rows from other half over i2c -int i2c_transaction(void) { - int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; - - int err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_WRITE); - if (err) goto i2c_error; - - // start of matrix stored at 0x00 - err = i2c_master_write(0x00); - if (err) goto i2c_error; - -#ifdef BACKLIGHT_ENABLE - // Write backlight level for slave to read - err = i2c_master_write(get_backlight_level()); -#else - // Write zero, so our byte index is the same - err = i2c_master_write(0x00); -#endif - if (err) goto i2c_error; - - // Start read - err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_READ); - if (err) goto i2c_error; - - if (!err) { - int i; - for (i = 0; i < ROWS_PER_HAND-1; ++i) { - matrix[slaveOffset+i] = i2c_master_read(I2C_ACK); - } - matrix[slaveOffset+i] = i2c_master_read(I2C_NACK); - i2c_master_stop(); - } else { -i2c_error: // the cable is disconnceted, or something else went wrong - i2c_reset_state(); - return err; - } - - return 0; -} - -#else // USE_SERIAL - -int serial_transaction(void) { - int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; - - if (serial_update_buffers()) { - return 1; - } - - for (int i = 0; i < ROWS_PER_HAND; ++i) { - matrix[slaveOffset+i] = serial_slave_buffer[i]; - } - -#ifdef BACKLIGHT_ENABLE - // Write backlight level for slave to read - serial_master_buffer[SERIAL_LED_ADDR] = get_backlight_level(); -#endif - return 0; -} -#endif - -uint8_t matrix_scan(void) -{ - uint8_t ret = _matrix_scan(); - -#ifdef USE_I2C - if( i2c_transaction() ) { -#else // USE_SERIAL - if( serial_transaction() ) { -#endif - // turn on the indicator led when halves are disconnected - TXLED1; - - error_count++; - - if (error_count > ERROR_DISCONNECT_COUNT) { - // reset other half if disconnected - int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; - for (int i = 0; i < ROWS_PER_HAND; ++i) { - matrix[slaveOffset+i] = 0; - } - } - } else { - // turn off the indicator led on no error - TXLED0; - error_count = 0; - } - matrix_scan_quantum(); - return ret; -} - -void matrix_slave_scan(void) { - _matrix_scan(); - - int offset = (isLeftHand) ? 0 : ROWS_PER_HAND; - -#ifdef USE_I2C -#ifdef BACKLIGHT_ENABLE - // Read backlight level sent from master and update level on slave - backlight_set(i2c_slave_buffer[0]); -#endif - for (int i = 0; i < ROWS_PER_HAND; ++i) { - i2c_slave_buffer[i+1] = matrix[offset+i]; - } -#else // USE_SERIAL - for (int i = 0; i < ROWS_PER_HAND; ++i) { - serial_slave_buffer[i] = matrix[offset+i]; - } - -#ifdef BACKLIGHT_ENABLE - // Read backlight level sent from master and update level on slave - backlight_set(serial_master_buffer[SERIAL_LED_ADDR]); -#endif -#endif -} - -bool matrix_is_modified(void) -{ - if (debouncing) return false; - return true; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ - return (matrix[row] & ((matrix_row_t)1<> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI - } -} - -static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) -{ - // Store last value of row prior to reading - matrix_row_t last_row_value = current_matrix[current_row]; - - // Clear data in matrix row - current_matrix[current_row] = 0; - - // Select row and wait for row selecton to stabilize - select_row(current_row); - wait_us(30); - - // For each col... - for(uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) { - - // Select the col pin to read (active low) - uint8_t pin = col_pins[col_index]; - uint8_t pin_state = (_SFR_IO8(pin >> 4) & _BV(pin & 0xF)); - - // Populate the matrix row with the state of the col pin - current_matrix[current_row] |= pin_state ? 0 : (ROW_SHIFTER << col_index); - } - - // Unselect row - unselect_row(current_row); - - return (last_row_value != current_matrix[current_row]); -} - -static void select_row(uint8_t row) -{ - uint8_t pin = row_pins[row]; - _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT - _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW -} - -static void unselect_row(uint8_t row) -{ - uint8_t pin = row_pins[row]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI -} - -static void unselect_rows(void) -{ - for(uint8_t x = 0; x < ROWS_PER_HAND; x++) { - uint8_t pin = row_pins[x]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI - } -} - -#elif (DIODE_DIRECTION == ROW2COL) - -static void init_rows(void) -{ - for(uint8_t x = 0; x < ROWS_PER_HAND; x++) { - uint8_t pin = row_pins[x]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI - } -} - -static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) -{ - bool matrix_changed = false; - - // Select col and wait for col selecton to stabilize - select_col(current_col); - wait_us(30); - - // For each row... - for(uint8_t row_index = 0; row_index < ROWS_PER_HAND; row_index++) - { - - // Store last value of row prior to reading - matrix_row_t last_row_value = current_matrix[row_index]; - - // Check row pin state - if ((_SFR_IO8(row_pins[row_index] >> 4) & _BV(row_pins[row_index] & 0xF)) == 0) - { - // Pin LO, set col bit - current_matrix[row_index] |= (ROW_SHIFTER << current_col); - } - else - { - // Pin HI, clear col bit - current_matrix[row_index] &= ~(ROW_SHIFTER << current_col); - } - - // Determine if the matrix changed state - if ((last_row_value != current_matrix[row_index]) && !(matrix_changed)) - { - matrix_changed = true; - } - } - - // Unselect col - unselect_col(current_col); - - return matrix_changed; -} - -static void select_col(uint8_t col) -{ - uint8_t pin = col_pins[col]; - _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT - _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW -} - -static void unselect_col(uint8_t col) -{ - uint8_t pin = col_pins[col]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI -} - -static void unselect_cols(void) -{ - for(uint8_t x = 0; x < MATRIX_COLS; x++) { - uint8_t pin = col_pins[x]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI - } -} - -#endif diff --git a/keyboards/ergotravel/rev1/config.h b/keyboards/ergotravel/rev1/config.h index beda546a0..5fa447da7 100644 --- a/keyboards/ergotravel/rev1/config.h +++ b/keyboards/ergotravel/rev1/config.h @@ -15,10 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef REV1_CONFIG_H -#define REV1_CONFIG_H - -#include QMK_KEYBOARD_CONFIG_H +#pragma once /* USB Device descriptor parameter */ #define VENDOR_ID 0xCEEB @@ -87,4 +84,3 @@ along with this program. If not, see . //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION -#endif diff --git a/keyboards/ergotravel/rules.mk b/keyboards/ergotravel/rules.mk index fceb56edf..d2da78806 100644 --- a/keyboards/ergotravel/rules.mk +++ b/keyboards/ergotravel/rules.mk @@ -1,7 +1,3 @@ -SRC += matrix.c \ - i2c.c \ - split_util.c \ - serial.c # MCU name #MCU = at90usb1287 @@ -41,7 +37,7 @@ F_USB = $(F_CPU) # Bootloader # This definition is optional, and if your keyboard supports multiple bootloaders of -# different sizes, comment this out, and the correct address will be loaded +# different sizes, comment this out, and the correct address will be loaded # automatically (+60). See bootloader.mk for all options. BOOTLOADER = caterina @@ -64,11 +60,9 @@ AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. -SUBPROJECT_rev1 = yes -USE_I2C = yes # I2C is used between the sides # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend -CUSTOM_MATRIX = yes +SPLIT_KEYBOARD = yes DEFAULT_FOLDER = ergotravel/rev1 diff --git a/keyboards/ergotravel/serial.c b/keyboards/ergotravel/serial.c deleted file mode 100644 index 74bcbb6bf..000000000 --- a/keyboards/ergotravel/serial.c +++ /dev/null @@ -1,228 +0,0 @@ -/* - * WARNING: be careful changing this code, it is very timing dependent - */ - -#ifndef F_CPU -#define F_CPU 16000000 -#endif - -#include -#include -#include -#include -#include "serial.h" - -#ifndef USE_I2C - -// Serial pulse period in microseconds. Its probably a bad idea to lower this -// value. -#define SERIAL_DELAY 24 - -uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; -uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0}; - -#define SLAVE_DATA_CORRUPT (1<<0) -volatile uint8_t status = 0; - -inline static -void serial_delay(void) { - _delay_us(SERIAL_DELAY); -} - -inline static -void serial_output(void) { - SERIAL_PIN_DDR |= SERIAL_PIN_MASK; -} - -// make the serial pin an input with pull-up resistor -inline static -void serial_input(void) { - SERIAL_PIN_DDR &= ~SERIAL_PIN_MASK; - SERIAL_PIN_PORT |= SERIAL_PIN_MASK; -} - -inline static -uint8_t serial_read_pin(void) { - return !!(SERIAL_PIN_INPUT & SERIAL_PIN_MASK); -} - -inline static -void serial_low(void) { - SERIAL_PIN_PORT &= ~SERIAL_PIN_MASK; -} - -inline static -void serial_high(void) { - SERIAL_PIN_PORT |= SERIAL_PIN_MASK; -} - -void serial_master_init(void) { - serial_output(); - serial_high(); -} - -void serial_slave_init(void) { - serial_input(); - - // Enable INT0 - EIMSK |= _BV(INT0); - // Trigger on falling edge of INT0 - EICRA &= ~(_BV(ISC00) | _BV(ISC01)); -} - -// Used by the master to synchronize timing with the slave. -static -void sync_recv(void) { - serial_input(); - // This shouldn't hang if the slave disconnects because the - // serial line will float to high if the slave does disconnect. - while (!serial_read_pin()); - serial_delay(); -} - -// Used by the slave to send a synchronization signal to the master. -static -void sync_send(void) { - serial_output(); - - serial_low(); - serial_delay(); - - serial_high(); -} - -// Reads a byte from the serial line -static -uint8_t serial_read_byte(void) { - uint8_t byte = 0; - serial_input(); - for ( uint8_t i = 0; i < 8; ++i) { - byte = (byte << 1) | serial_read_pin(); - serial_delay(); - _delay_us(1); - } - - return byte; -} - -// Sends a byte with MSB ordering -static -void serial_write_byte(uint8_t data) { - uint8_t b = 8; - serial_output(); - while( b-- ) { - if(data & (1 << b)) { - serial_high(); - } else { - serial_low(); - } - serial_delay(); - } -} - -// interrupt handle to be used by the slave device -ISR(SERIAL_PIN_INTERRUPT) { - sync_send(); - - uint8_t checksum = 0; - for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) { - serial_write_byte(serial_slave_buffer[i]); - sync_send(); - checksum += serial_slave_buffer[i]; - } - serial_write_byte(checksum); - sync_send(); - - // wait for the sync to finish sending - serial_delay(); - - // read the middle of pulses - _delay_us(SERIAL_DELAY/2); - - uint8_t checksum_computed = 0; - for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) { - serial_master_buffer[i] = serial_read_byte(); - sync_send(); - checksum_computed += serial_master_buffer[i]; - } - uint8_t checksum_received = serial_read_byte(); - sync_send(); - - serial_input(); // end transaction - - if ( checksum_computed != checksum_received ) { - status |= SLAVE_DATA_CORRUPT; - } else { - status &= ~SLAVE_DATA_CORRUPT; - } -} - -inline -bool serial_slave_DATA_CORRUPT(void) { - return status & SLAVE_DATA_CORRUPT; -} - -// Copies the serial_slave_buffer to the master and sends the -// serial_master_buffer to the slave. -// -// Returns: -// 0 => no error -// 1 => slave did not respond -int serial_update_buffers(void) { - // this code is very time dependent, so we need to disable interrupts - cli(); - - // signal to the slave that we want to start a transaction - serial_output(); - serial_low(); - _delay_us(1); - - // wait for the slaves response - serial_input(); - serial_high(); - _delay_us(SERIAL_DELAY); - - // check if the slave is present - if (serial_read_pin()) { - // slave failed to pull the line low, assume not present - sei(); - return 1; - } - - // if the slave is present syncronize with it - sync_recv(); - - uint8_t checksum_computed = 0; - // receive data from the slave - for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) { - serial_slave_buffer[i] = serial_read_byte(); - sync_recv(); - checksum_computed += serial_slave_buffer[i]; - } - uint8_t checksum_received = serial_read_byte(); - sync_recv(); - - if (checksum_computed != checksum_received) { - sei(); - return 1; - } - - uint8_t checksum = 0; - // send data to the slave - for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) { - serial_write_byte(serial_master_buffer[i]); - sync_recv(); - checksum += serial_master_buffer[i]; - } - serial_write_byte(checksum); - sync_recv(); - - // always, release the line when not in use - serial_output(); - serial_high(); - - sei(); - return 0; -} - -#endif diff --git a/keyboards/ergotravel/serial.h b/keyboards/ergotravel/serial.h deleted file mode 100644 index 15fe4db7b..000000000 --- a/keyboards/ergotravel/serial.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef MY_SERIAL_H -#define MY_SERIAL_H - -#include "config.h" -#include - -/* TODO: some defines for interrupt setup */ -#define SERIAL_PIN_DDR DDRD -#define SERIAL_PIN_PORT PORTD -#define SERIAL_PIN_INPUT PIND -#define SERIAL_PIN_MASK _BV(PD0) -#define SERIAL_PIN_INTERRUPT INT0_vect - -#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 -#define SERIAL_MASTER_BUFFER_LENGTH 1 - -// Buffers for master - slave communication -extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH]; -extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH]; - -void serial_master_init(void); -void serial_slave_init(void); -int serial_update_buffers(void); -bool serial_slave_data_corrupt(void); - -#endif diff --git a/keyboards/ergotravel/split_util.c b/keyboards/ergotravel/split_util.c deleted file mode 100644 index 346cbc908..000000000 --- a/keyboards/ergotravel/split_util.c +++ /dev/null @@ -1,86 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include "split_util.h" -#include "matrix.h" -#include "keyboard.h" -#include "config.h" -#include "timer.h" - -#ifdef USE_I2C -# include "i2c.h" -#else -# include "serial.h" -#endif - -volatile bool isLeftHand = true; - -static void setup_handedness(void) { - #ifdef EE_HANDS - isLeftHand = eeprom_read_byte(EECONFIG_HANDEDNESS); - #else - // I2C_MASTER_RIGHT is deprecated, use MASTER_RIGHT instead, since this works for both serial and i2c - #if defined(I2C_MASTER_RIGHT) || defined(MASTER_RIGHT) - isLeftHand = !has_usb(); - #else - isLeftHand = has_usb(); - #endif - #endif -} - -static void keyboard_master_setup(void) { -#ifdef USE_I2C - i2c_master_init(); -#ifdef SSD1306OLED - matrix_master_OLED_init (); -#endif -#else - serial_master_init(); -#endif -} - -static void keyboard_slave_setup(void) { - timer_init(); -#ifdef USE_I2C - i2c_slave_init(SLAVE_I2C_ADDRESS); -#else - serial_slave_init(); -#endif -} - -bool has_usb(void) { - USBCON |= (1 << OTGPADE); //enables VBUS pad - _delay_us(5); - return (USBSTA & (1< -#include "eeconfig.h" - -#define SLAVE_I2C_ADDRESS 0x32 - -extern volatile bool isLeftHand; - -// slave version of matix scan, defined in matrix.c -void matrix_slave_scan(void); - -void split_keyboard_setup(void); -bool has_usb(void); -void keyboard_slave_loop(void); - -void matrix_master_OLED_init (void); - -#endif From 9fbd7eb7a58ff5a39ffcaa3fcc50320e63c8ec08 Mon Sep 17 00:00:00 2001 From: QMK Bot Date: Mon, 15 Oct 2018 16:24:29 +0000 Subject: [PATCH 275/788] convert to unix line-endings [skip ci] --- keyboards/ergotravel/keymaps/ckofy/keymap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/ergotravel/keymaps/ckofy/keymap.c b/keyboards/ergotravel/keymaps/ckofy/keymap.c index 9de5fa2b8..7b3b333a5 100644 --- a/keyboards/ergotravel/keymaps/ckofy/keymap.c +++ b/keyboards/ergotravel/keymaps/ckofy/keymap.c @@ -1,4 +1,4 @@ -#include QMK_KEYBOARD_H +#include QMK_KEYBOARD_H extern keymap_config_t keymap_config; From f0f9283d02cf4a61f185ed0bf5fc83ee8247f41d Mon Sep 17 00:00:00 2001 From: Vyolle <44031868+Vyolle@users.noreply.github.com> Date: Mon, 15 Oct 2018 12:21:14 -0500 Subject: [PATCH 276/788] Keymap: add new keymap for Iris (#4119) * Add files via upload * Delete config.h * Delete keymap.c * Delete rules.mk * Keymap w/mirror mode and steno support. Keymap w/mirror mode and steno support. Can be used entirely one handed. * Fixed some niggling issues. --- keyboards/iris/keymaps/vyolle_steno/config.h | 34 +++++ keyboards/iris/keymaps/vyolle_steno/keymap.c | 149 +++++++++++++++++++ keyboards/iris/keymaps/vyolle_steno/rules.mk | 7 + 3 files changed, 190 insertions(+) create mode 100644 keyboards/iris/keymaps/vyolle_steno/config.h create mode 100644 keyboards/iris/keymaps/vyolle_steno/keymap.c create mode 100644 keyboards/iris/keymaps/vyolle_steno/rules.mk diff --git a/keyboards/iris/keymaps/vyolle_steno/config.h b/keyboards/iris/keymaps/vyolle_steno/config.h new file mode 100644 index 000000000..9cbc148e4 --- /dev/null +++ b/keyboards/iris/keymaps/vyolle_steno/config.h @@ -0,0 +1,34 @@ +/* +Copyright 2017 Danny Nguyen + +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 . +*/ + +#pragma once + +/* Use I2C or Serial, not both */ + +#define USE_I2C +// #define USE_SERIAL + + +#define FORCE_NKRO //For Steno. + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + + diff --git a/keyboards/iris/keymaps/vyolle_steno/keymap.c b/keyboards/iris/keymaps/vyolle_steno/keymap.c new file mode 100644 index 000000000..3ad117655 --- /dev/null +++ b/keyboards/iris/keymaps/vyolle_steno/keymap.c @@ -0,0 +1,149 @@ +#include QMK_KEYBOARD_H +#include "keymap_steno.h" + +extern keymap_config_t keymap_config; + +#define _QWERTY 0 +#define _LOWER 1 +#define _RAISE 2 +#define _PLOVER 3 +#define _ADJUST 4 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + LOWER, + RAISE, + ADJUST, + PLOVER, + EXT_PLV, +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_QWERTY] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, PLOVER, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + RAISE, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT, KC_RBRC, + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_BSPC, KC_RSFT, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LGUI, + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + KC_LCTL, LOWER, KC_SPC, KC_BSPC, KC_ENT, KC_LALT + // └────────┴────────┴────────┘ └────────┴────────┴────────┘ + ), + + [_LOWER] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_DEL, KC_0, KC_9, KC_8, KC_7, KC_6, _______, _______, _______, _______, _______, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + KC_SCLN, KC_P, KC_O, KC_I, KC_U, KC_Y, _______, _______, _______, _______, _______, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + _______, KC_QUOT, KC_L, KC_K, KC_J, KC_H, _______, KC_LEFT, KC_UP, KC_RGHT, KC_SCLN, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_ENT, KC_SLSH, KC_DOT, KC_COMM, KC_M, KC_N, KC_LALT, _______, _______, _______, KC_DOWN, _______, _______, _______, + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + _______, _______, KC_LGUI, _______, _______, _______ + // └────────┴────────┴────────┘ └────────┴────────┴────────┘ + ), + + [_RAISE] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, _______, _______, _______, _______, _______, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + _______, KC_VOLU, KC_LEFT, KC_UP, KC_RGHT, KC_INS, _______, _______, _______, _______, _______, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_MUTE, KC_VOLD, KC_PGUP, KC_DOWN, KC_PGDN, KC_DEL, _______, _______, _______, _______, _______, _______, _______, _______, + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + _______, _______, KC_LALT, _______, _______, _______ + // └────────┴────────┴────────┘ └────────┴────────┴────────┘ + ), + + [_ADJUST] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_GRV, KC_HOME, KC_LBRC, KC_RBRC, KC_PIPE, KC_APP, KC_SLCK, _______, _______, _______, _______, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + KC_PSCR, KC_END, KC_LCBR, KC_RCBR, KC_PLUS, KC_EQL, KC_PAUS, _______, _______, _______, _______, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + _______, _______, _______, KC_BSLS, KC_MINS, KC_UNDS, _______, _______, _______, _______, _______, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + _______, _______, _______, _______, _______, _______ + // └────────┴────────┴────────┘ └────────┴────────┴────────┘ + ), + + [_PLOVER] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + STN_PWR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, EXT_PLV, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + STN_N1, STN_N2, STN_N3, STN_N4, STN_N5, STN_N6, STN_N7, STN_N8, STN_N9, STN_NA, STN_NB, STN_NC, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + STN_FN, STN_S1, STN_TL, STN_PL, STN_HL, STN_ST1, STN_ST3, STN_FR, STN_PR, STN_LR, STN_TR, STN_DR, + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX, STN_S2, STN_KL, STN_WL, STN_RL, STN_ST2, STN_RE1, STN_RE2, STN_ST4, STN_RR, STN_BR, STN_GR, STN_SR, STN_ZR, + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + XXXXXXX, STN_A, STN_O, STN_E, STN_U, XXXXXXX + // └────────┴────────┴────────┘ └────────┴────────┴────────┘ + ) +}; + + +void matrix_init_user() { + steno_set_mode(STENO_MODE_GEMINI); // or STENO_MODE_BOLT +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + break; + case PLOVER: + if (!record->event.pressed) { + layer_on(_PLOVER); + } + return false; + break; + case EXT_PLV: + if (record->event.pressed) { + layer_off(_PLOVER); + } + return false; + break; + } + return true; +} diff --git a/keyboards/iris/keymaps/vyolle_steno/rules.mk b/keyboards/iris/keymaps/vyolle_steno/rules.mk new file mode 100644 index 000000000..e41231683 --- /dev/null +++ b/keyboards/iris/keymaps/vyolle_steno/rules.mk @@ -0,0 +1,7 @@ +EXTRAKEY_ENABLE = no +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +STENO_ENABLE = yes # Additional protocols for Stenography(+1700), requires VIRTSER +AUDIO_ENABLE = no # Audio output on port C6 +MIDI_ENABLE = no # MIDI controls +NKRO_ENABLE = yes +BOOTMAGIC_ENABLE = yes \ No newline at end of file From ec86141a4a558fc51b9ebfdcb14106b8a8d051d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=BDan=20Pevec?= Date: Mon, 15 Oct 2018 19:39:58 +0200 Subject: [PATCH 277/788] Basic Slovenian keymap added (#4128) * Basic Slovenian keymap added * Author fixed --- quantum/keymap_extras/keymap_slovenian.h | 106 +++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 quantum/keymap_extras/keymap_slovenian.h diff --git a/quantum/keymap_extras/keymap_slovenian.h b/quantum/keymap_extras/keymap_slovenian.h new file mode 100644 index 000000000..8b197e6c5 --- /dev/null +++ b/quantum/keymap_extras/keymap_slovenian.h @@ -0,0 +1,106 @@ +/* Copyright 2018 Žan Pevec + * + * 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 . + */ + +#ifndef KEYMAP_SLOVENIAN +#define KEYMAP_SLOVENIAN +#include "keymap.h" + + +//Swapped Z and Y +#define SI_Z KC_Y +#define SI_Y KC_Z + +//Special characters +#define SI_CV KC_SCLN +#define SI_SV KC_LBRC +#define SI_ZV KC_BSLS + +#define SI_A KC_A +#define SI_B KC_B +#define SI_C KC_C +#define SI_D KC_D +#define SI_E KC_E +#define SI_F KC_F +#define SI_G KC_G +#define SI_H KC_H +#define SI_I KC_I +#define SI_J KC_J +#define SI_K KC_K +#define SI_L KC_L +#define SI_M KC_M +#define SI_N KC_N +#define SI_O KC_O +#define SI_P KC_P +#define SI_Q KC_Q +#define SI_R KC_R +#define SI_S KC_S +#define SI_T KC_T +#define SI_U KC_U +#define SI_V KC_V +#define SI_W KC_W +#define SI_X KC_X + +#define SI_0 KC_0 +#define SI_1 KC_1 +#define SI_2 KC_2 +#define SI_3 KC_3 +#define SI_4 KC_4 +#define SI_5 KC_5 +#define SI_6 KC_6 +#define SI_7 KC_7 +#define SI_8 KC_8 +#define SI_9 KC_9 + +#define SI_DOT KC_DOT +#define SI_COMM KC_COMM + +#define SI_PLUS KC_EQL // + and * and ~ +#define SI_QOT KC_MINS // Single quote +#define SI_MINS KC_SLSH // - and _ + +// shifted characters +#define SI_EXLM LSFT(KC_1) // ! +#define SO_DQOT LSFT(KC_2) // " +#define SI_HASH LSFT(KC_3) // # +#define SI_DLR LSFT(KC_4) // $ +#define SI_PERC LSFT(KC_5) // % +#define SI_AMPR LSFT(KC_6) // & +#define SI_SLSH LSFT(KC_7) // / +#define SI_LPRN LSFT(KC_8) // ( +#define SI_RPRN LSFT(KC_9) // ) +#define SI_EQL LSFT(KC_0) // = +#define SI_QST LSFT(SI_QOT) // ? +#define SI_ASTR LSFT(SI_PLUS) // * +#define SI_COLN LSFT(KC_DOT) // : +#define SI_SCLN LSFT(KC_COMM) // ; +#define SI_UNDS LSFT(SI_MINS) // _ + +// Alt Gr-ed characters +#define SI_CIRC ALGR(KC_3) // ^ +#define SI_DEG ALGR(KC_5) // ° +#define SI_GRV ALGR(KC_7) // ` +#define SI_ACCU ALGR(KC_9) // ´ +#define SI_LCBR ALGR(KC_B) // { +#define SI_RCBR ALGR(KC_N) // } +#define SI_LBRC ALGR(KC_F) // [ +#define SI_RBRC ALGR(KC_G) // ] +#define SI_BSLS ALGR(KC_Q) // backslash +#define SI_AT ALGR(KC_V) // @ +#define SI_EURO ALGR(KC_E) // € +#define SI_TILD ALGR(KC_1) // ~ +#define SI_PIPE ALGR(KC_W) // | + +#endif From 47e29754c215d02af39f3ee6158d4d6b76a7bffc Mon Sep 17 00:00:00 2001 From: Chris <38164944+ChrisUC@users.noreply.github.com> Date: Mon, 15 Oct 2018 12:41:43 -0500 Subject: [PATCH 278/788] Keymap: added default layout to the kbd6x for the tofu hhkb (#4132) * added layouts * fixed * might aswell fix the default layout aswell --- keyboards/kbd6x/keymaps/default/keymap.c | 19 ------- .../keymaps/hhkb-default-improved/keymap.c | 50 ++++++++++++++++++ .../keymaps/hhkb-default-improved/readme.md | 1 + keyboards/kbd6x/keymaps/hhkb-default/keymap.c | 51 +++++++++++++++++++ .../kbd6x/keymaps/hhkb-default/readme.md | 1 + 5 files changed, 103 insertions(+), 19 deletions(-) create mode 100644 keyboards/kbd6x/keymaps/hhkb-default-improved/keymap.c create mode 100644 keyboards/kbd6x/keymaps/hhkb-default-improved/readme.md create mode 100644 keyboards/kbd6x/keymaps/hhkb-default/keymap.c create mode 100644 keyboards/kbd6x/keymaps/hhkb-default/readme.md diff --git a/keyboards/kbd6x/keymaps/default/keymap.c b/keyboards/kbd6x/keymaps/default/keymap.c index fd73b1445..00adbf887 100644 --- a/keyboards/kbd6x/keymaps/default/keymap.c +++ b/keyboards/kbd6x/keymaps/default/keymap.c @@ -33,25 +33,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), }; -const uint16_t PROGMEM fn_actions[] = { - -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - // MACRODOWN only works in this function - switch(id) { - case 0: - if (record->event.pressed) { - register_code(KC_RSFT); - } else { - unregister_code(KC_RSFT); - } - break; - } - return MACRO_NONE; -}; - void matrix_init_user(void) { diff --git a/keyboards/kbd6x/keymaps/hhkb-default-improved/keymap.c b/keyboards/kbd6x/keymaps/hhkb-default-improved/keymap.c new file mode 100644 index 000000000..80c22e5d9 --- /dev/null +++ b/keyboards/kbd6x/keymaps/hhkb-default-improved/keymap.c @@ -0,0 +1,50 @@ +/* Copyright 2018 MechMerlin + * + * 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 . + */ +#include QMK_KEYBOARD_H + +// iproved hhkb layout with more functionality + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1), + KC_LCTL, KC_LGUI, KC_LALT, KC_SPACE, KC_RALT, KC_RGUI, KC_RCTL + ), + + [1] = LAYOUT( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, RESET, + KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, KC_TRNS, KC_DEL, + KC_RCTL, KC_VOLU, KC_VOLD, KC_MUTE, KC_MPLY, KC_MSTP, KC_ASTR, KC_SLSH, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PLUS, KC_UNDS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), +}; + + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + diff --git a/keyboards/kbd6x/keymaps/hhkb-default-improved/readme.md b/keyboards/kbd6x/keymaps/hhkb-default-improved/readme.md new file mode 100644 index 000000000..be22dd16c --- /dev/null +++ b/keyboards/kbd6x/keymaps/hhkb-default-improved/readme.md @@ -0,0 +1 @@ +# this is the default hhkb layout in a more useable normalized form (aka the way i use mine) \ No newline at end of file diff --git a/keyboards/kbd6x/keymaps/hhkb-default/keymap.c b/keyboards/kbd6x/keymaps/hhkb-default/keymap.c new file mode 100644 index 000000000..03153b67a --- /dev/null +++ b/keyboards/kbd6x/keymaps/hhkb-default/keymap.c @@ -0,0 +1,51 @@ +/* Copyright 2018 MechMerlin + * + * 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 . + */ +#include QMK_KEYBOARD_H + +// stock hhkb as referenced by https://i.imgur.com/QoBTDHf.png + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1), + KC_TRNS, KC_LALT, KC_LGUI, KC_SPACE, KC_RGUI, KC_RALT, KC_TRNS + ), + + [1] = LAYOUT( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, + KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, KC_TRNS, RESET, + KC_TRNS, KC_VOLU, KC_VOLD, KC_MUTE, KC_MSTP, KC_TRNS, KC_ASTR, KC_SLSH, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PLUS, KC_UNDS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), +}; + + + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + diff --git a/keyboards/kbd6x/keymaps/hhkb-default/readme.md b/keyboards/kbd6x/keymaps/hhkb-default/readme.md new file mode 100644 index 000000000..cf93c3553 --- /dev/null +++ b/keyboards/kbd6x/keymaps/hhkb-default/readme.md @@ -0,0 +1 @@ +# default hhkb layout adapted to the 6x (for tofu hhkb) \ No newline at end of file From 64459fedbff54d8e8c3943e75624377a6b70464c Mon Sep 17 00:00:00 2001 From: Christoffer Holmberg Date: Mon, 15 Oct 2018 20:42:38 +0300 Subject: [PATCH 279/788] Keymap: Reworked layout (#4133) * Reworked layout * Remove redundant defines https://github.com/qmk/qmk_firmware/pull/4133#discussion_r224977420 * fix typo --- keyboards/planck/keymaps/skug/config.h | 13 +- keyboards/planck/keymaps/skug/keymap.c | 272 ++++++++++++------------ keyboards/planck/keymaps/skug/readme.md | 7 +- keyboards/planck/keymaps/skug/rules.mk | 2 + 4 files changed, 156 insertions(+), 138 deletions(-) diff --git a/keyboards/planck/keymaps/skug/config.h b/keyboards/planck/keymaps/skug/config.h index 0a1d8d289..79f77786a 100644 --- a/keyboards/planck/keymaps/skug/config.h +++ b/keyboards/planck/keymaps/skug/config.h @@ -1,13 +1,20 @@ #pragma once +// Override SpaceCadet Settings +#undef LSPO_KEY +#undef RSPC_KEY +#define LSPO_KEY KC_8 // Nordic Left SpaceCadet +#define RSPC_KEY KC_9 // Nordic Right SpaceCadet + +// Audio #ifdef AUDIO_ENABLE - #define STARTUP_SONG SONG(PLANCK_SOUND) - // #define STARTUP_SONG SONG(NO_SOUND) + #define STARTUP_SONG SONG(COIN_SOUND) #define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \ SONG(COLEMAK_SOUND), \ SONG(DVORAK_SOUND) \ } +#endif /* * MIDI options @@ -35,5 +42,3 @@ // Most tactile encoders have detents every 4 stages #define ENCODER_RESOLUTION 4 - -#endif diff --git a/keyboards/planck/keymaps/skug/keymap.c b/keyboards/planck/keymaps/skug/keymap.c index 00b2ab21c..29324a09e 100644 --- a/keyboards/planck/keymaps/skug/keymap.c +++ b/keyboards/planck/keymaps/skug/keymap.c @@ -1,4 +1,4 @@ -/* Copyright 2015-2017 Jack Humbert +/* Copyright 2015-2017 Jack Humbert, Christoffer Holmberg * * 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 @@ -15,158 +15,124 @@ */ #include QMK_KEYBOARD_H +#include "keymap_swedish.h" #include "muse.h" extern keymap_config_t keymap_config; enum planck_layers { - _QWERTY, - _COLEMAK, - _DVORAK, + _DEFAULT, _LOWER, _RAISE, - _PLOVER, + _UTILITY, _ADJUST }; enum planck_keycodes { - QWERTY = SAFE_RANGE, - COLEMAK, - DVORAK, - PLOVER, + DEFAULT = SAFE_RANGE, + RAISE, + LOWER, + UTILITY, BACKLIT, - EXT_PLV + S1, S2, S3, S4, S5, S6, S7, S8, S9 }; -#define LOWER MO(_LOWER) -#define RAISE MO(_RAISE) +#define ESC_LOW LT(_LOWER, KC_ESC) +#define BSP_RAI LT(_RAISE, KC_BSPC) +#define LFT_CTR CTL_T(NO_APOS) +#define RGT_CTR CTL_T(KC_TILD) +#define UTILITY MO(_UTILITY) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Qwerty * ,-----------------------------------------------------------------------------------. - * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Å | * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | S | D | F | G | H | J | K | L | ; | " | + * | Fn | A | S | D | F | G | H | J | K | L | Ö | Ä | * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | + * | Shift| Z | X | C | V | B | N | M | , | . | - |Shift | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | + * | Ctrl | Super| Alt | |L/Esc | Ret | Space|R/Bspc| |AltGr | * | ¨ | * `-----------------------------------------------------------------------------------' */ -[_QWERTY] = LAYOUT_planck_grid( - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, - KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , - BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT -), - -/* Colemak - * ,-----------------------------------------------------------------------------------. - * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | R | S | T | D | H | N | E | I | O | " | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' - */ -[_COLEMAK] = LAYOUT_planck_grid( - KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, - KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , - BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT -), - -/* Dvorak - * ,-----------------------------------------------------------------------------------. - * | Tab | " | , | . | P | Y | F | G | C | R | L | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | O | E | U | I | D | H | T | N | S | / | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' - */ -[_DVORAK] = LAYOUT_planck_grid( - KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, - KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, - KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT , - BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT -), - -/* Lower - * ,-----------------------------------------------------------------------------------. - * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | Home | End | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | Next | Vol- | Vol+ | Play | - * `-----------------------------------------------------------------------------------' - */ -[_LOWER] = LAYOUT_planck_grid( - KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, - KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_NUHS), S(KC_NUBS), KC_HOME, KC_END, _______, - _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY +[_DEFAULT] = LAYOUT_planck_grid( + KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , NO_AA , + UTILITY, KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , NO_OSLH, NO_AE , + KC_LSPO, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM, KC_DOT , NO_MINS, KC_RSPC, + LFT_CTR, KC_LALT, KC_LGUI, NO_AT , ESC_LOW, KC_ENT , KC_SPC , BSP_RAI, _______, NO_ALGR, NO_ASTR, RGT_CTR ), /* Raise * ,-----------------------------------------------------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | + | * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | + * | | | | | | | | | | | | | * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / |Pg Up |Pg Dn | | + * | | | | | | | | | | | | | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | Next | Vol- | Vol+ | Play | + * | | | | | | | | | | | | | * `-----------------------------------------------------------------------------------' */ [_RAISE] = LAYOUT_planck_grid( - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, - KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, _______, - _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_PLUS, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, NO_GRTR, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), -/* Plover layer (http://opensteno.org) +/* Lower * ,-----------------------------------------------------------------------------------. - * | # | # | # | # | # | # | # | # | # | # | # | # | + * | | | | | | | | | | | | | * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | S | T | P | H | * | * | F | P | L | T | D | + * | | | | | | | | | | | | | * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | S | K | W | R | * | * | R | B | G | S | Z | + * | | | | | | | | | | | | | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Exit | | | A | O | | E | U | | | | + * | | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT_planck_grid( + NO_HALF, LSFT(KC_1), NO_QUO2, LSFT(KC_3), NO_BULT, LSFT(KC_5), NO_AMPR, NO_SLSH, NO_LPRN, NO_RPRN, NO_EQL , NO_QUES, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, NO_LESS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +/* Utility layer + * ,-----------------------------------------------------------------------------------. + * | | | up | | | | | | S1 | S2 | S3 | | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | left | down | right| | | | | S4 | S5 | S6 | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | | | S7 | S8 | S9 | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Del | | | | | * `-----------------------------------------------------------------------------------' */ -[_PLOVER] = LAYOUT_planck_grid( - KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1 , - XXXXXXX, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, - XXXXXXX, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, - EXT_PLV, XXXXXXX, XXXXXXX, KC_C, KC_V, XXXXXXX, XXXXXXX, KC_N, KC_M, XXXXXXX, XXXXXXX, XXXXXXX +[_UTILITY] = LAYOUT_planck_grid( + _______, _______, KC_UP , _______, _______, _______, _______, _______, S1 , S2 , S3 , _______, + _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, S4 , S5 , S6 , _______, + _______, _______, _______, _______, _______, _______, _______, _______, S7 , S8 , S9 , _______, + _______, _______, _______, _______, _______, _______, _______, KC_DEL , _______, _______, _______, _______ ), /* Adjust (Lower + Raise) * ,-----------------------------------------------------------------------------------. - * | | Reset| | | | | | | | | | Del | + * | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak|Plover| | + * | |Reset | |Aud on|Audoff|AGnorm|AGswap|Qwerty| | |Utilit| | * |------+------+------+------+------+------|------+------+------+------+------+------| - * | |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof| | | | | | + * | | | | | | | | | | | | | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | | + * | | | | | | | | | | | | | * `-----------------------------------------------------------------------------------' */ [_ADJUST] = LAYOUT_planck_grid( - _______, RESET, DEBUG, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_DEL , - _______, _______, MU_MOD, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, PLOVER, _______, - _______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, TERM_ON, TERM_OFF, _______, _______, _______, + KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , KC_F12 , + _______, RESET , MU_MOD , AU_ON , AU_OFF , AG_NORM, AG_SWAP, DEFAULT, XXXXXXX , XXXXXXX, UTILITY, _______, + _______, NO_PIPE, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ) @@ -176,6 +142,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #ifdef AUDIO_ENABLE float plover_song[][2] = SONG(PLOVER_SOUND); float plover_gb_song[][2] = SONG(PLOVER_GOODBYE_SOUND); + float s1[][2] = SONG(NUMBER_ONE); + float s2[][2] = SONG(ZELDA_PUZZLE); + float s3[][2] = SONG(ZELDA_TREASURE); + float s4[][2] = SONG(OVERWATCH_THEME); + float s5[][2] = SONG(IMPERIAL_MARCH); + float s6[][2] = SONG(E1M1_DOOM); + float s7[][2] = SONG(COIN_SOUND); + float s8[][2] = SONG(ONE_UP_SOUND); + float s9[][2] = SONG(SONIC_RING); #endif uint32_t layer_state_set_user(uint32_t state) { @@ -184,22 +159,9 @@ uint32_t layer_state_set_user(uint32_t state) { bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch (keycode) { - case QWERTY: + case DEFAULT: if (record->event.pressed) { - print("mode just switched to qwerty and this is a huge string\n"); - set_single_persistent_default_layer(_QWERTY); - } - return false; - break; - case COLEMAK: - if (record->event.pressed) { - set_single_persistent_default_layer(_COLEMAK); - } - return false; - break; - case DVORAK: - if (record->event.pressed) { - set_single_persistent_default_layer(_DVORAK); + set_single_persistent_default_layer(_DEFAULT); } return false; break; @@ -220,31 +182,75 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } return false; break; - case PLOVER: + case S1: if (record->event.pressed) { #ifdef AUDIO_ENABLE - stop_all_notes(); - PLAY_SONG(plover_song); - #endif - layer_off(_RAISE); - layer_off(_LOWER); - layer_off(_ADJUST); - layer_on(_PLOVER); - if (!eeconfig_is_enabled()) { - eeconfig_init(); - } - keymap_config.raw = eeconfig_read_keymap(); - keymap_config.nkro = 1; - eeconfig_update_keymap(keymap_config.raw); + PLAY_SONG(s1); + #endif //AUDIO_ENABLE } return false; break; - case EXT_PLV: + case S2: if (record->event.pressed) { #ifdef AUDIO_ENABLE - PLAY_SONG(plover_gb_song); - #endif - layer_off(_PLOVER); + PLAY_SONG(s2); + #endif //AUDIO_ENABLE + } + return false; + break; + case S3: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(s3); + #endif //AUDIO_ENABLE + } + return false; + break; + case S4: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(s4); + #endif //AUDIO_ENABLE + } + return false; + break; + case S5: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(s5); + #endif //AUDIO_ENABLE + } + return false; + break; + case S6: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(s6); + #endif //AUDIO_ENABLE + } + return false; + break; + case S7: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(s7); + #endif //AUDIO_ENABLE + } + return false; + break; + case S8: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(s8); + #endif //AUDIO_ENABLE + } + return false; + break; + case S9: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(s9); + #endif //AUDIO_ENABLE } return false; break; diff --git a/keyboards/planck/keymaps/skug/readme.md b/keyboards/planck/keymaps/skug/readme.md index 259b52f86..aa3e6cda0 100644 --- a/keyboards/planck/keymaps/skug/readme.md +++ b/keyboards/planck/keymaps/skug/readme.md @@ -1,3 +1,8 @@ +![Nordic Planck](https://i.imgur.com/0ZOLnx2.png) + # Nordic Planck -TODO: Add layout image +This is my attempt at making a Nordic layout for the planck with all nordic +characters available in the default layer, things to note are the bottom row +with Esc, Enter, Space and Backspace in the middle for easy thumb access and +an arrow cluster on the left. diff --git a/keyboards/planck/keymaps/skug/rules.mk b/keyboards/planck/keymaps/skug/rules.mk index dcf16bef3..9721fcd74 100644 --- a/keyboards/planck/keymaps/skug/rules.mk +++ b/keyboards/planck/keymaps/skug/rules.mk @@ -1 +1,3 @@ SRC += muse.c +EXTRAKEY_ENABLE = no +CONSOLE_ENABLE = no From bf0bb1a4db98864fe04d40ca68fe6bc5a0184395 Mon Sep 17 00:00:00 2001 From: Christoffer Holmberg Date: Mon, 15 Oct 2018 20:43:11 +0300 Subject: [PATCH 280/788] Keymap: Update to ergodox layout (#4134) * Disable KB mouse & cleanup * fix ascii-layout * _______ is now defined by qmk and apparently has been for a year already ;) --- keyboards/ergodox_ez/keymaps/skug/config.h | 2 ++ keyboards/ergodox_ez/keymaps/skug/keymap.c | 30 ++++++++++------------ 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/keyboards/ergodox_ez/keymaps/skug/config.h b/keyboards/ergodox_ez/keymaps/skug/config.h index d97281392..abf1c635f 100644 --- a/keyboards/ergodox_ez/keymaps/skug/config.h +++ b/keyboards/ergodox_ez/keymaps/skug/config.h @@ -1,5 +1,7 @@ #pragma once +#define FORCE_NKRO + #undef LSPO_KEY #undef RSPC_KEY #define LSPO_KEY KC_8 // Nordic Left SpaceCadet diff --git a/keyboards/ergodox_ez/keymaps/skug/keymap.c b/keyboards/ergodox_ez/keymaps/skug/keymap.c index 0d2ec1dd9..d17990481 100644 --- a/keyboards/ergodox_ez/keymaps/skug/keymap.c +++ b/keyboards/ergodox_ez/keymaps/skug/keymap.c @@ -22,8 +22,6 @@ #include "version.h" #include "keymap_swedish.h" -#define _______ KC_TRNS - #define BASE 0 // default layer #define SYMB 1 // symbols #define MDIA 2 // media keys @@ -47,8 +45,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | | | | | | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| * | L4 | A | S | D | F | G |------| |------| H | J | K | L |Ö / L3| Ä/L2 | - * | | | | | | | Hypr/| | Meh/ | | | | | | | - * |--------+------+------+------+------+------| Esc | | Ent |------+------+------+------+------+--------| + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+------| Back | |Forwd |------+------+------+------+------+--------| * | LShift/| Z | X | C | V | B | | | | N | M | ; | : | _ | RShift/| * | ( | | | | | | | | | | | , | . | - | ) | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' @@ -71,8 +69,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { NO_HALF, KC_1, KC_2, KC_3, KC_4, KC_5, KC_INS, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB), MO(ARRW), KC_A, KC_S, KC_D, KC_F, KC_G, - KC_LSPO, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_ESC), - CTL_T(NO_APOS), NO_ACUT, KC_LALT, KC_BSPC, KC_SPC, + KC_LSPO, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, KC_WBAK, + CTL_T(NO_APOS), NO_ACUT, KC_LALT, KC_BSPC, KC_SPC, NO_LESS, KC_END, KC_LEFT, KC_RIGHT, KC_PGDN, CTL_T(KC_ENT), ALT_T(KC_ESC), KC_LGUI, @@ -81,7 +79,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TO(ARRW), KC_6, KC_7, KC_8, KC_9, KC_0, NO_PLUS, TG(SYMB), KC_Y, KC_U, KC_I, KC_O, KC_P, NO_AA, KC_H, KC_J, KC_K, KC_L, LT(MDIA, NO_OSLH), LT(SYMB, NO_AE), - MEH_T(KC_ENT), KC_N, KC_M, KC_COMM, KC_DOT, NO_MINS, KC_RSPC, + KC_WFWD, KC_N, KC_M, KC_COMM, KC_DOT, NO_MINS, KC_RSPC, KC_SPC, KC_BSPC, NO_ALGR, NO_ASTR, CTL_T(NO_TILD), KC_HOME, NO_CIRC, KC_PGUP, KC_UP, KC_DOWN, @@ -101,11 +99,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | . | 0 | = | | * `----------------------------------' `----------------------------------' * ,-------------. ,-------------. - * |Animat| | |Toggle|Solid | + * | | | | | | * ,------|------|------| |------+------+------. * | | | | | | | | * |------|------|------| |------|------|------| - * |BNess-|Bness+| | | |Hue- |Hue+ | + * | | | | | | | | * `--------------------' `--------------------' */ // SYMBOLS @@ -116,18 +114,18 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______,KC_HASH,NO_DLR, NO_LPRN,NO_RPRN,NO_GRV, _______,KC_PERC,NO_CIRC,NO_LBRC,NO_RBRC,NO_TILD,_______, EPRM,_______,_______,_______,_______, - RGB_MOD,_______, + _______,_______, + _______,_______,_______, _______,_______,_______, - RGB_VAD,RGB_VAI,_______, // right hand _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, _______, KC_UP, KC_7, KC_8, KC_9, NO_ASTR, KC_F12, KC_DOWN, KC_4, KC_5, KC_6, NO_PLUS, _______, _______, NO_AMPR, KC_1, KC_2, KC_3, NO_MINS, _______, _______,KC_DOT, KC_0, NO_EQL, _______, - RGB_TOG, RGB_SLD, + _______, _______, _______, _______, _______, - _______, RGB_HUD, RGB_HUI + _______, _______, _______ ), /* Keymap: Media and mouse keys @@ -183,10 +181,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, // right hand TO(BASE), _______, _______, _______, _______, _______, _______, - _______, _______, KC_BTN4, KC_MS_U, KC_BTN5, _______, _______, - _______, KC_MS_L, KC_MS_D, KC_MS_R, _______, _______, _______, _______, _______, _______, _______, _______, _______, - KC_BTN1, KC_BTN3, KC_BTN2, _______, _______, + _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ From 0beb945554e043172f344eb4a48aaede28a529a0 Mon Sep 17 00:00:00 2001 From: Kenny Hung Date: Mon, 15 Oct 2018 18:44:19 +0100 Subject: [PATCH 281/788] Keymap: add JJ40 Skewwhiffy layout (#4135) --- keyboards/jj40/keymaps/skewwhiffy/keymap.c | 219 +++++++++++++++++++++ 1 file changed, 219 insertions(+) create mode 100644 keyboards/jj40/keymaps/skewwhiffy/keymap.c diff --git a/keyboards/jj40/keymaps/skewwhiffy/keymap.c b/keyboards/jj40/keymaps/skewwhiffy/keymap.c new file mode 100644 index 000000000..6b193a15c --- /dev/null +++ b/keyboards/jj40/keymaps/skewwhiffy/keymap.c @@ -0,0 +1,219 @@ +/* Copyright 2017 Kenny Hung + * + * 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 . + */ +#include QMK_KEYBOARD_H +#include "keymap_uk.h" + +// Layer shorthand +enum Layers { + cm, // colemak + dv, // dvorak + qw, // qwerty + nbl, // numbers left + nbr, // numbers right + syl, // symbols left + syr, // symbols right + nal, // navigation left + nar // navigation right +}; + +// Layer buttons +#define _Z_SFT SFT_T(UK_Z) +#define _SCLSH SFT_T(UK_SCLN) +#define _SLSH SFT_T(UK_SLSH) + +#define _X_NB LT(nbl, UK_X) +#define _Q_NB LT(nbl, UK_Q) +#define _DOT_NB LT(nbr, UK_DOT) +#define _V_NB LT(nbr, UK_V) +#define __NBL LT(nbl, _______) +#define __NBR LT(nbr, _______) + +#define _C_SY LT(syl, UK_C) +#define _J_SY LT(syl, UK_J) +#define _W_SY LT(syr, UK_W) +#define _COM_SY LT(syr, UK_COMM) +#define __SYL LT(syl, _______) +#define __SYR LT(syr, _______) + +#define _V_NAL LT(nal, UK_V) +#define _K_NAL LT(nal, UK_K) +#define _M_NAR LT(nar, UK_M) +#define __NAL LT(nal, _______) +#define __NAR LT(nar, _______) + +// Custom hotkeys +#define _TERM LCTL(UK_QUOT) // Hotkey for terminal +#define _S_TAB S(UK_TAB) +#define _C_LEFT LCTL(UK_LEFT) +#define _C_RGHT LCTL(UK_RGHT) +#define _A_LEFT LALT(UK_LEFT) +#define _A_RGHT LALT(UK_RGHT) + +// Custom hotkeys +#define _TERM LCTL(UK_QUOT) // Hotkey for terminal +#define _S_TAB S(UK_TAB) +#define _C_LEFT LCTL(UK_LEFT) +#define _C_RGHT LCTL(UK_RGHT) +#define _A_LEFT LALT(UK_LEFT) +#define _A_RGHT LALT(UK_RGHT) + +enum custom_keycodes { + IJ_OMN = SAFE_RANGE // IntelliJ Omnibox +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Colemak + * .-----------------------------------------------------------------------------------------------------------. + * | Q | W | F | P | G | | | J | L | U | Y | ; | + * |-----------------------------------------------------------------------------------------------------------| + * | A | R | S | T | D | | | H | N | E | I | O | + * |-----------------------------------------------------------------------------------------------------------| + * | Z | X | C | V | B | | | K | M | , | . | / | + * | SHIFT | NUMBER | SYMBOL | NAV | | | | | NAV | SYMBOL | FUNC | SHIFT | + * |-----------------------------------------------------------------------------------------------------------| + * | LSHIFT | LCTRL | LALT | LGUI | SPACE | ENT | DEL | BKSPC | RGUI | RALT | RCTRL | RSHIFT | + * .-----------------------------------------------------------------------------------------------------------. + */ + [cm] = LAYOUT_ortho_4x12( \ + UK_Q, UK_W, UK_F, UK_P, UK_G, _______, _______, UK_J, UK_L, UK_U, UK_Y, UK_SCLN, \ + UK_A, UK_R, UK_S, UK_T, UK_D, _______, _______, UK_H, UK_N, UK_E, UK_I, UK_O, \ + _Z_SFT, _X_NB, _C_SY, _V_NAL, UK_B, _______, _______, UK_K, _M_NAR, _COM_SY, _DOT_NB, _SLSH, \ + UK_LSFT, UK_LCTL, UK_LALT, UK_LGUI, UK_SPC, UK_ENT, UK_DEL, UK_BSPC, UK_RGUI, UK_RALT, UK_RCTL, UK_RSFT \ + ), + +/* Dvorak + * .-----------------------------------------------------------------------------------------------------------. + * | ' | , | . | P | Y | | | F | G | C | R | L | + * |-----------------------------------------------------------------------------------------------------------| + * | A | O | E | U | I | | | D | H | T | N | S | + * |-----------------------------------------------------------------------------------------------------------| + * | ; | Q | J | K | X | | | B | M | W | V | Z | + * | SHIFT | NUMBER | SYMBOL | NAV | | | | | NAV | SYMBOL | FUNC | SHIFT | + * |-----------------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | + * |-----------------------------------------------------------------------------------------------------------| + */ + [dv] = LAYOUT_ortho_4x12( \ + UK_QUOT, UK_COMM, UK_DOT, UK_P, UK_Y, _______, _______, UK_F, UK_G, UK_C, UK_R, UK_L, \ + UK_A, UK_O, UK_E, UK_U, UK_I, _______, _______, UK_D, UK_H, UK_T, UK_N, UK_S, \ + _SCLSH, _Q_NB, _J_SY, _K_NAL, UK_X, _______, _______, UK_B, _M_NAR, _W_SY, _V_NB, _Z_SFT, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), + +/* QWERTY + * .-----------------------------------------------------------------------------------------------------------. + * | Q | W | E | R | T | | | Y | U | I | O | P | + * |-----------------------------------------------------------------------------------------------------------| + * | A | S | D | F | G | | | H | J | K | L | ; | + * |-----------------------------------------------------------------------------------------------------------| + * | Z | X | C | V | B | | | N | M | , | . | / | + * | SHIFT | NUMBER | SYMBOL | NAV | | | | | NAV | SYMBOL | FUNC | SHIFT | + * |-----------------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | + * .-----------------------------------------------------------------------------------------------------------. + */ + [qw] = LAYOUT_ortho_4x12( \ + UK_Q, UK_W, UK_E, UK_R, UK_T, _______, _______, UK_Y, UK_U, UK_I, UK_O, UK_P, \ + UK_A, UK_S, UK_D, UK_F, UK_G, _______, _______, UK_H, UK_J, UK_K, UK_L, UK_SCLN, \ + _Z_SFT, _X_NB, _C_SY, _V_NAL, UK_B, _______, _______, UK_N, _M_NAR, _COM_SY, _DOT_NB, _SLSH, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), + +/* Numbers _NB + * .-----------------------------------------------------------------------------------------------------------. + * | | F7 | F8 | F9 | F10 | | | | 7 | 8 | 9 | | + * |-----------------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | F4 | F5 | F6 | F11 | | | | 4 | 5 | 6 | | + * |-----------------+--------+--------+--------+--------+--------+--------+--------------------------+--------| + * | | F1 | F2 | F3 | F12 | | | 0 | 1 | 2 | 3 | . | + * |-----------------+--------+--------+--------+--------+--------+--------+-----------------+--------+--------| + * | | | | | | | | | | | | | + * '-----------------------------------------------------------------------------------------------------------' + */ + [nbl] = LAYOUT_ortho_4x12( \ + _______, UK_F7, UK_F8, UK_F9, UK_F10, _______, _______, _______, UK_7, UK_8, UK_9, _______, \ + _______, UK_F4, UK_F5, UK_F6, UK_F11, _______, _______, _______, UK_4, UK_5, UK_6, _______, \ + _______, __NBL, UK_F2, UK_F3, UK_F12, _______, _______, UK_0, UK_1, UK_2, UK_3, UK_DOT, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), + [nbr] = LAYOUT_ortho_4x12( \ + _______, UK_F7, UK_F8, UK_F9, UK_F10, _______, _______, _______, UK_7, UK_8, UK_9, _______, \ + _______, UK_F4, UK_F5, UK_F6, UK_F11, _______, _______, _______, UK_4, UK_5, UK_6, _______, \ + _______, UK_F1, UK_F2, UK_F3, UK_F12, _______, _______, UK_0, UK_1, UK_2, __NBR, UK_DOT, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), + +/* Symbols _SY + * .-----------------------------------------------------------------------------------------------------------. + * | ! | £ | _ | - | ~ | | | \ | { | } | / | # | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | $ | % | + | = | | | | " | ( | ) | ' | @ | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | ^ | & | * | | | | | | < | [ | ] | > | ` | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | | | | | | | | | | | + * '-----------------------------------------------------------------------------------------------------------' + */ + [syl] = LAYOUT_ortho_4x12( \ + UK_EXLM, UK_PND, UK_UNDS, UK_MINS, UK_TILD, _______, _______, UK_BSLS, UK_LCBR, UK_RCBR, UK_SLSH, UK_HASH, \ + UK_DLR, UK_PERC, UK_PLUS, UK_EQL, _______, _______, _______, UK_DQUO, UK_LPRN, UK_RPRN, UK_QUOT, UK_AT, \ + UK_CIRC, UK_AMPR, __SYL, UK_PIPE, _______, _______, _______, UK_LABK, UK_LBRC, UK_RBRC, UK_RABK, UK_GRV, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), + [syr] = LAYOUT_ortho_4x12( \ + UK_EXLM, UK_PND, UK_UNDS, UK_MINS, UK_TILD, _______, _______, UK_BSLS, UK_LCBR, UK_RCBR, UK_SLSH, UK_HASH, \ + UK_DLR, UK_PERC, UK_PLUS, UK_EQL, _______, _______, _______, UK_DQUO, UK_LPRN, UK_RPRN, UK_QUOT, UK_AT, \ + UK_CIRC, UK_AMPR, UK_ASTR, UK_PIPE, _______, _______, _______, UK_LABK, UK_LBRC, __SYR, UK_RABK, UK_GRV, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), + +/* + * Navigation + * .-----------------------------------------------------------------------------------------------------------. + * | Esc | Ctrl L | Up | Ctrl R | RGB RMD| RGB HD | RGB HI | RGB_TG | PtSn | ScLk | Pause | DVORAK | + * +--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | Tab | Left | Down | Right | RGB MD | RGB SD | RGB SI | COLEMAK| Insert | Home | PgUp | Term | + * +--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | ShTab | Alt L | IJ Omni| Alt R | | RGB VD | RGB VI | | ScLk | End | PgDn | QWERTY | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | | | | | | | | | | | + * '-----------------------------------------------------------------------------------------------------------' + */ + [nal] = LAYOUT_ortho_4x12( \ + UK_ESC, _C_LEFT, UK_UP, _C_RGHT, RGB_RMOD,RGB_HUD, RGB_HUI, RGB_TOG, UK_PSCR, UK_SLCK, UK_PAUS, DF(dv), \ + UK_TAB, UK_LEFT, UK_DOWN, UK_RGHT, RGB_MOD, RGB_SAD, RGB_SAI, DF(cm), UK_INS, UK_HOME, UK_PGUP, _TERM, \ + _S_TAB, _A_LEFT, IJ_OMN, __NAL, _______, RGB_VAD, RGB_VAI, _______, UK_SLCK, UK_END, UK_PGDN, DF(qw), \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), + [nar] = LAYOUT_ortho_4x12( \ + UK_ESC, _C_LEFT, UK_UP, _C_RGHT, RGB_RMOD,RGB_HUD, RGB_HUI, RGB_TOG, UK_PSCR, UK_SLCK, UK_PAUS, DF(dv), \ + UK_TAB, UK_LEFT, UK_DOWN, UK_RGHT, RGB_MOD, RGB_SAD, RGB_SAI, DF(cm), UK_INS, UK_HOME, UK_PGUP, _TERM, \ + _S_TAB, _A_LEFT, IJ_OMN, _A_RGHT, _______, RGB_VAD, RGB_VAI, _______, __NAR, UK_END, UK_PGDN, DF(qw), \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (record->event.pressed) { + switch(keycode) { + case IJ_OMN: + SEND_STRING(SS_TAP(X_LSHIFT)SS_TAP(X_LSHIFT)); + return false; + } + } + return true; +} From 4930e22dda408420332831781c4fde002a89915e Mon Sep 17 00:00:00 2001 From: Jason Thigpen Date: Mon, 15 Oct 2018 10:44:55 -0700 Subject: [PATCH 282/788] Keymap: Move multimedia events to dedicated layer and format config (#4136) --- keyboards/dz60/keymaps/crd/keymap.c | 48 +++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/keyboards/dz60/keymaps/crd/keymap.c b/keyboards/dz60/keymaps/crd/keymap.c index 5e9242c9d..a17d32caa 100644 --- a/keyboards/dz60/keymaps/crd/keymap.c +++ b/keyboards/dz60/keymaps/crd/keymap.c @@ -12,25 +12,25 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |-----------------------------------------------------------------------------------------+ * | Shift | Z | X | C | V | B | N | M | , | . | / | RSh | U | DEL | * |-----------------------------------------------------------------------------------------+ - * | Ctrl | Alt | Cmd | Space | Cmd | FN | L | D | R | + * | FN2 | Alt | Cmd | Space | Cmd | FN1 | L | D | R | * `-----------------------------------------------------------------------------------------' */ LAYOUT_directional( - KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, _______, KC_BSPC, - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, - CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_DEL, - KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_SPC, KC_SPC, KC_RGUI, MO(1), KC_LEFT, KC_DOWN, KC_RIGHT + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, _______, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, + CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_DEL, + MO(2), KC_LALT, KC_LGUI, KC_SPC, KC_SPC, KC_SPC, KC_RGUI, MO(1), KC_LEFT, KC_DOWN, KC_RIGHT ), - /* FN Layer + /* FN1 Layer * ,-----------------------------------------------------------------------------------------. - * | ` ~ | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | RESET | + * | ` ~ | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | | * |-----------------------------------------------------------------------------------------+ - * | |RBB T|RGB M| Hue+| Hue-| Sat+| Sat-| Val+| Val-| | | | | | + * | | | | | | | | | | | | | | | * |-----------------------------------------------------------------------------------------+ - * | | BL T| BL M| BL+ | BL- | | | | | | | | | + * | | | | | | | | | | | | | | * |-----------------------------------------------------------------------------------------+ * | | | | | | | | | | | | |PgUp | | * |-----------------------------------------------------------------------------------------+ @@ -39,10 +39,32 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ LAYOUT_directional( - KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, RESET, - _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, - _______, BL_TOGG, BL_STEP, BL_INC, BL_DEC, _______, _______, _______, _______, _______, _______, _______, + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDOWN, KC_END ), + + /* FN2 Layer (Media) + * ,-----------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | RESET | + * |-----------------------------------------------------------------------------------------+ + * | |RBB T|RGB M| Hue+| Hue-| Sat+| Sat-| Val+| Val-| | | | | | + * |-----------------------------------------------------------------------------------------+ + * | | | | | | | | | | | | | | + * |-----------------------------------------------------------------------------------------+ + * | | | | | | | | | | | |Pl/Ps|Vol+ |Mute | + * |-----------------------------------------------------------------------------------------+ + * | | | | | | |Prev |Vol- |Next | + * `-----------------------------------------------------------------------------------------' + */ + + LAYOUT_directional( + KC_SLEP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET, + _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_VOLU, KC_MUTE, + _______, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT + ), }; From 4c9372a0819b3fa062105803668d3b277222dc1a Mon Sep 17 00:00:00 2001 From: Yann Hodique Date: Mon, 15 Oct 2018 10:45:30 -0700 Subject: [PATCH 283/788] Keyboard: Make type 5 the default sun keyboard. (#4137) Type 5 is better polished, and probably more common as the last non-USB Sun keyboard. --- keyboards/converter/sun_usb/rules.mk | 2 ++ 1 file changed, 2 insertions(+) diff --git a/keyboards/converter/sun_usb/rules.mk b/keyboards/converter/sun_usb/rules.mk index e03b374f3..6e36a1905 100644 --- a/keyboards/converter/sun_usb/rules.mk +++ b/keyboards/converter/sun_usb/rules.mk @@ -40,3 +40,5 @@ ifdef HARDWARE_SERIAL else SRC += protocol/serial_soft.c endif + +DEFAULT_FOLDER = converter/sun_usb/type5 From 088b476343bf97c4bca6855a4ff2152f1bf0785e Mon Sep 17 00:00:00 2001 From: Yann Hodique Date: Mon, 15 Oct 2018 10:49:51 -0700 Subject: [PATCH 284/788] Keymap: add sun_usb keymap for sigma (#4138) Also add users/sigma, which contains useful code for keymaps. --- .../sun_usb/type5/keymaps/sigma/keymap.c | 31 ++ .../sun_usb/type5/keymaps/sigma/readme.md | 12 + .../sun_usb/type5/keymaps/sigma/rules.mk | 1 + users/sigma/config.h | 21 ++ users/sigma/rules.mk | 3 + users/sigma/sigma.c | 276 ++++++++++++++++++ users/sigma/sigma.h | 58 ++++ 7 files changed, 402 insertions(+) create mode 100644 keyboards/converter/sun_usb/type5/keymaps/sigma/keymap.c create mode 100644 keyboards/converter/sun_usb/type5/keymaps/sigma/readme.md create mode 100644 keyboards/converter/sun_usb/type5/keymaps/sigma/rules.mk create mode 100644 users/sigma/config.h create mode 100644 users/sigma/rules.mk create mode 100644 users/sigma/sigma.c create mode 100644 users/sigma/sigma.h diff --git a/keyboards/converter/sun_usb/type5/keymaps/sigma/keymap.c b/keyboards/converter/sun_usb/type5/keymaps/sigma/keymap.c new file mode 100644 index 000000000..1c7ea3efc --- /dev/null +++ b/keyboards/converter/sun_usb/type5/keymaps/sigma/keymap.c @@ -0,0 +1,31 @@ +/* +Copyright 2018 Yann Hodique @sigma + +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 . +*/ + +#include QMK_KEYBOARD_H +#include "sigma.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = + { + [_QWERTY] = LAYOUT_us_unix( + KC_LEAD, KC_SCRT, KC_F1,KC_F2,KC_F3,KC_F4, KC_F5,KC_F6,KC_F7,KC_F8, KC_F9,KC_F10,KC_F11,KC_F12, KC_PSCR,KC_SLCK,KC_PAUS, KC_MUTE,KC_VOLD,KC_VOLU,KC_OS_LOCK, + KC_STOP, KC_OS_REDO, KC_ESC,KC_1,KC_2,KC_3,KC_4,KC_5,KC_6,KC_7,KC_8,KC_9,KC_0,KC_MINS,KC_EQL,KC_BSLS,KC_GRV, KC_INS, KC_HOME,KC_PGUP, KC_NLCK,KC_PSLS,KC_PAST,KC_PMNS, + VRSN, KC_OS_UNDO, KC_TAB, KC_Q,KC_W,KC_E,KC_R,KC_T,KC_Y,KC_U,KC_I,KC_O,KC_P,KC_LBRC,KC_RBRC, KC_BSPC, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, KC_PPLS, + KC_MAKE, KC_OS_COPY, KC_LCTL, KC_A,KC_S,KC_D,KC_F,KC_G,KC_H,KC_J,KC_K,KC_L,KC_SCLN,KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, + KC_EXECUTE,KC_OS_PASTE, KC_LSFT, KC_Z,KC_X,KC_C,KC_V,KC_B,KC_N,KC_M,KC_COMM,KC_DOT,KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, + KC_FIND, KC_OS_CUT, KC_CAPS,KC_LGUI,KC_LALT, KC_SPC, KC_RGUI,KC_APP,KC_RALT, KC_LEFT,KC_DOWN,KC_RGHT, KC_P0, KC_PDOT + ), + }; diff --git a/keyboards/converter/sun_usb/type5/keymaps/sigma/readme.md b/keyboards/converter/sun_usb/type5/keymaps/sigma/readme.md new file mode 100644 index 000000000..6ae011f86 --- /dev/null +++ b/keyboards/converter/sun_usb/type5/keymaps/sigma/readme.md @@ -0,0 +1,12 @@ +Overview +======== + +This is my personal Sun Type 5 configuration. + +How to build +------------ + + make converter/sun_usb/type5:sigma:teensy + +Layers +------ diff --git a/keyboards/converter/sun_usb/type5/keymaps/sigma/rules.mk b/keyboards/converter/sun_usb/type5/keymaps/sigma/rules.mk new file mode 100644 index 000000000..09a3af829 --- /dev/null +++ b/keyboards/converter/sun_usb/type5/keymaps/sigma/rules.mk @@ -0,0 +1 @@ +BOOTLOADER = halfkay diff --git a/users/sigma/config.h b/users/sigma/config.h new file mode 100644 index 000000000..53b986cda --- /dev/null +++ b/users/sigma/config.h @@ -0,0 +1,21 @@ +/* + Copyright 2018 Yann Hodique @sigma + + 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 . +*/ +#pragma once + +#define LEADER_TIMEOUT 1000 + +#define MACRO_TIMER 5 diff --git a/users/sigma/rules.mk b/users/sigma/rules.mk new file mode 100644 index 000000000..a4cd2b34d --- /dev/null +++ b/users/sigma/rules.mk @@ -0,0 +1,3 @@ +LEADER_ENABLE = yes + +SRC += sigma.c diff --git a/users/sigma/sigma.c b/users/sigma/sigma.c new file mode 100644 index 000000000..b2bf40d57 --- /dev/null +++ b/users/sigma/sigma.c @@ -0,0 +1,276 @@ +/* + Copyright 2018 Yann Hodique @sigma + + 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 . +*/ +#include "sigma.h" + +userspace_config_t runtime_userspace_config; +userspace_config_t stored_userspace_config; + +__attribute__ ((weak)) +void matrix_init_keymap(void) {} + +__attribute__ ((weak)) +void startup_keymap(void) {} + +__attribute__ ((weak)) +void shutdown_keymap(void) {} + +__attribute__ ((weak)) +void suspend_power_down_keymap(void) {} + +__attribute__ ((weak)) +void suspend_wakeup_init_keymap(void) {} + +__attribute__ ((weak)) +void matrix_scan_keymap(void) {} + +__attribute__ ((weak)) +bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { + return true; +} + +__attribute__ ((weak)) +bool process_record_secrets(uint16_t keycode, keyrecord_t *record) { + return true; +} + + +__attribute__ ((weak)) +uint32_t layer_state_set_keymap (uint32_t state) { + return state; +} + +__attribute__ ((weak)) +uint32_t default_layer_state_set_keymap (uint32_t state) { + return state; +} + +__attribute__ ((weak)) +void led_set_keymap(uint8_t usb_led) {} + +void set_os(uint8_t os) { + runtime_userspace_config.os_target = os; + + switch (os) { + case _OS_MACOS: + set_unicode_input_mode(UC_OSX); + break; + case _OS_LINUX: + set_unicode_input_mode(UC_LNX); + break; + case _OS_WINDOWS: + set_unicode_input_mode(UC_WIN); + break; + } +} + +void matrix_init_user(void) { + stored_userspace_config.raw = eeconfig_read_user(); + runtime_userspace_config.raw = stored_userspace_config.raw; + + set_os(runtime_userspace_config.os_target); +} + +void store_userspace_config(void) { + eeconfig_update_user(stored_userspace_config.raw); +} + +LEADER_EXTERNS(); + +void matrix_scan_user(void) { + LEADER_DICTIONARY() { + leading = false; + leader_end(); + + SEQ_TWO_KEYS(KC_F1, KC_L) { + set_os(_OS_LINUX); + } + SEQ_TWO_KEYS(KC_F1, KC_M) { + set_os(_OS_MACOS); + } + SEQ_TWO_KEYS(KC_F1, KC_W) { + set_os(_OS_WINDOWS); + } + SEQ_TWO_KEYS(KC_F1, KC_S) { + stored_userspace_config.raw = runtime_userspace_config.raw; + store_userspace_config(); + } + } +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + uint8_t os_target = runtime_userspace_config.os_target; + bool pressed = record->event.pressed; + + switch (keycode) { + case KC_QWERTY: + if (pressed) { + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + + case KC_MAKE: // Compiles the firmware, and adds the flash command based on keyboard bootloader + if (!pressed) { + send_string_with_delay_P(PSTR("make " QMK_KEYBOARD ":" QMK_KEYMAP +#if defined(__ARM__) + ":dfu-util" +#elif defined(BOOTLOADER_DFU) + ":dfu" +#elif defined(BOOTLOADER_HALFKAY) + ":teensy" +#elif defined(BOOTLOADER_CATERINA) + ":avrdude" +#endif // bootloader options + SS_TAP(X_ENTER)), 10); + } + return false; + break; + + case EPRM: // Resets EEPROM + if (pressed) { + eeconfig_init(); + default_layer_set(1UL< @sigma + + 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 . +*/ +#pragma once + +#include "quantum.h" +#include "version.h" +#include "eeprom.h" + +// Define os types +enum os_types + { + _OS_MACOS = 0, + _OS_LINUX, + _OS_WINDOWS, + }; + +// Define layer names +enum userspace_layers + { + _QWERTY = 0, + }; + +typedef union { + uint32_t raw; + struct { + uint8_t os_target :2; + }; +} userspace_config_t; + +enum userspace_custom_keycodes + { + EPRM = SAFE_RANGE, // Resets EEPROM + VRSN, // Prints QMK Firmware and board info + KC_QWERTY, // Sets default layer to QWERTY + KC_MAKE, // Rebuild the current firmware + KC_OS_CUT, + KC_OS_COPY, + KC_OS_PASTE, + KC_OS_UNDO, + KC_OS_REDO, + KC_OS_LOCK, + KC_SCRT, + NEW_SAFE_RANGE //use NEW_SAFE_RANGE for keymap specific codes + }; From 85f315ad6508d96af4497ea433c54f13c0296a90 Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Mon, 8 Oct 2018 22:56:07 -0400 Subject: [PATCH 286/788] Add Iris Rev. 3 --- keyboards/iris/iris.h | 4 +- keyboards/iris/rev1/config.h | 2 - keyboards/iris/rev1_led/config.h | 2 - keyboards/iris/rev2/config.h | 2 - keyboards/iris/rev3/config.h | 85 ++++++++++++++++++++++++++++++++ keyboards/iris/rev3/rev3.c | 42 ++++++++++++++++ keyboards/iris/rev3/rev3.h | 35 +++++++++++++ keyboards/iris/rev3/rules.mk | 2 + 8 files changed, 167 insertions(+), 7 deletions(-) create mode 100644 keyboards/iris/rev3/config.h create mode 100644 keyboards/iris/rev3/rev3.c create mode 100644 keyboards/iris/rev3/rev3.h create mode 100644 keyboards/iris/rev3/rules.mk diff --git a/keyboards/iris/iris.h b/keyboards/iris/iris.h index 8d33b6b21..afad9a0d6 100644 --- a/keyboards/iris/iris.h +++ b/keyboards/iris/iris.h @@ -4,8 +4,10 @@ #include "rev1.h" #elif KEYBOARD_iris_rev1_led #include "rev1_led.h" -#else +#elif KEYBOARD_iris_rev2 #include "rev2.h" +#else + #include "rev3.h" #endif #include "quantum.h" diff --git a/keyboards/iris/rev1/config.h b/keyboards/iris/rev1/config.h index fd9b2ced3..cc7f2d8d4 100644 --- a/keyboards/iris/rev1/config.h +++ b/keyboards/iris/rev1/config.h @@ -65,8 +65,6 @@ along with this program. If not, see . #define RGB_DI_PIN D3 #define RGBLIGHT_TIMER #define RGBLED_NUM 12 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD /* * Feature disable options diff --git a/keyboards/iris/rev1_led/config.h b/keyboards/iris/rev1_led/config.h index 18d783ae7..e9eac2455 100644 --- a/keyboards/iris/rev1_led/config.h +++ b/keyboards/iris/rev1_led/config.h @@ -65,8 +65,6 @@ along with this program. If not, see . #define RGB_DI_PIN D3 #define RGBLIGHT_TIMER #define RGBLED_NUM 12 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD /* * Feature disable options diff --git a/keyboards/iris/rev2/config.h b/keyboards/iris/rev2/config.h index 2ea31a154..368d21c98 100644 --- a/keyboards/iris/rev2/config.h +++ b/keyboards/iris/rev2/config.h @@ -65,8 +65,6 @@ along with this program. If not, see . #define RGB_DI_PIN D3 #define RGBLIGHT_TIMER #define RGBLED_NUM 12 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD /* * Feature disable options diff --git a/keyboards/iris/rev3/config.h b/keyboards/iris/rev3/config.h new file mode 100644 index 000000000..7f68180c2 --- /dev/null +++ b/keyboards/iris/rev3/config.h @@ -0,0 +1,85 @@ +/* +Copyright 2017 Danny Nguyen + +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 . +*/ + +#pragma once + +#include QMK_KEYBOARD_CONFIG_H + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xCEEB +#define PRODUCT_ID 0x1256 +#define DEVICE_VER 0x0300 +#define MANUFACTURER Keebio +#define PRODUCT Iris Keyboard +#define DESCRIPTION Split 50 percent ergonomic keyboard + +/* key matrix size */ +// Rows are doubled-up +#define MATRIX_ROWS 10 +#define MATRIX_COLS 6 + +// wiring of each half +#define MATRIX_ROW_PINS { D2, D3, D5, D7, D6 } +#define MATRIX_COL_PINS { F1, F4, F5, F6, D4, B4 } + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ +// #define BACKLIGHT_LEVELS 3 + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCING_DELAY 5 + +/* 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 + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +#define BACKLIGHT_PIN B5 +#define BACKLIGHT_LEVELS 5 + +/* ws2812 RGB LED */ +#define RGB_DI_PIN F7 +#define RGBLIGHT_TIMER +#define RGBLED_NUM 12 // Number of LEDs + +/* + * 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 diff --git a/keyboards/iris/rev3/rev3.c b/keyboards/iris/rev3/rev3.c new file mode 100644 index 000000000..d8272db0f --- /dev/null +++ b/keyboards/iris/rev3/rev3.c @@ -0,0 +1,42 @@ +#include "rev3.h" + +#ifdef SSD1306OLED +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + led_set_user(usb_led); +} +#endif + +void matrix_init_kb(void) { + + // // green led on + // DDRD |= (1<<5); + // PORTD &= ~(1<<5); + + // // orange led on + // DDRB |= (1<<0); + // PORTB &= ~(1<<0); + + matrix_init_user(); +}; + + +#ifdef SWAP_HANDS_ENABLE +__attribute__ ((weak)) +// swap-hands action needs a matrix to define the swap +const keypos_t hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = { + /* Left hand, matrix positions */ + {{0,5}, {1,5}, {2,5}, {3,5}, {4,5}, {5,5}}, + {{0,6}, {1,6}, {2,6}, {3,6}, {4,6}, {5,6}}, + {{0,7}, {1,7}, {2,7}, {3,7}, {4,7}, {5,7}}, + {{0,8}, {1,8}, {2,8}, {3,8}, {4,8}, {5,8}}, + {{0,9}, {1,9}, {2,9}, {3,9}, {4,9}, {5,9}}, + /* Right hand, matrix positions */ + {{0,0}, {1,0}, {2,0}, {3,0}, {4,0}, {5,0}}, + {{0,1}, {1,1}, {2,1}, {3,1}, {4,1}, {5,1}}, + {{0,2}, {1,2}, {2,2}, {3,2}, {4,2}, {5,2}}, + {{0,3}, {1,3}, {2,3}, {3,3}, {4,3}, {5,3}}, + {{0,4}, {1,4}, {2,4}, {3,4}, {4,4}, {5,4}}, +}; +#endif + diff --git a/keyboards/iris/rev3/rev3.h b/keyboards/iris/rev3/rev3.h new file mode 100644 index 000000000..d44cef9a6 --- /dev/null +++ b/keyboards/iris/rev3/rev3.h @@ -0,0 +1,35 @@ +#pragma once + +#include "iris.h" +#include "quantum.h" + + +#ifdef USE_I2C +#include +#ifdef __AVR__ + #include + #include +#endif +#endif + +//void promicro_bootloader_jmp(bool program); + +#define LAYOUT( \ + L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \ + L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \ + L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \ + L30, L31, L32, L33, L34, L35, LT4, RT4, R30, R31, R32, R33, R34, R35, \ + LT1, LT2, LT3, RT3, RT2, RT1 \ + ) \ + { \ + { L00, L01, L02, L03, L04, L05 }, \ + { L10, L11, L12, L13, L14, L15 }, \ + { L20, L21, L22, L23, L24, L25 }, \ + { L30, L31, L32, L33, L34, L35 }, \ + { KC_NO, KC_NO, LT4, LT1, LT2, LT3 }, \ + { R05, R04, R03, R02, R01, R00 }, \ + { R15, R14, R13, R12, R11, R10 }, \ + { R25, R24, R23, R22, R21, R20 }, \ + { R35, R34, R33, R32, R31, R30 }, \ + { KC_NO, KC_NO, RT4, RT1, RT2, RT3 } \ + } diff --git a/keyboards/iris/rev3/rules.mk b/keyboards/iris/rev3/rules.mk new file mode 100644 index 000000000..d7463419b --- /dev/null +++ b/keyboards/iris/rev3/rules.mk @@ -0,0 +1,2 @@ +RGBLIGHT_ENABLE = yes +BACKLIGHT_ENABLE = yes From 44a348d56f661d22144202f440b87c26832a8170 Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Mon, 15 Oct 2018 12:46:33 -0400 Subject: [PATCH 287/788] Use DFU bootloader for rev 3 --- keyboards/iris/rules.mk | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/keyboards/iris/rules.mk b/keyboards/iris/rules.mk index fa261adc6..88dd66c18 100644 --- a/keyboards/iris/rules.mk +++ b/keyboards/iris/rules.mk @@ -37,7 +37,11 @@ F_USB = $(F_CPU) # This definition is optional, and if your keyboard supports multiple bootloaders of # different sizes, comment this out, and the correct address will be loaded # automatically (+60). See bootloader.mk for all options. -BOOTLOADER = caterina +ifeq ($(strip $(KEYBOARD)), iris/rev3) + BOOTLOADER = dfu +else + BOOTLOADER = caterina +endif # Interrupt driven control endpoint task(+60) OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT From 31d12662bde435e6636347ee842108b1cb3d8d48 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 15 Oct 2018 12:34:49 -0700 Subject: [PATCH 288/788] Update to drashna keymaps and userspace - RGB edition (#4143) * Fix up userspace after feature merges * Add new macros for keyboard layouts * Keep new layouts in keymap for easy reference * Cleanup layouts * Fix CRKBD wrappers * Fix up comments * Fix spacing in orthodox base layer * ergodox related cleanup * Make KC_MAKE only flash when holding shift * Add option to fast compile boards * Clean up rgb modes to save space * Re-enable Swap Hands on my Iris --- keyboards/crkbd/keymaps/drashna/config.h | 10 +- keyboards/crkbd/keymaps/drashna/keymap.c | 59 +++++---- keyboards/iris/keymaps/drashna/config.h | 2 +- keyboards/iris/keymaps/drashna/keymap.c | 67 +++++----- keyboards/iris/keymaps/drashna/rules.mk | 4 +- keyboards/orthodox/keymaps/drashna/config.h | 2 +- keyboards/orthodox/keymaps/drashna/keymap.c | 52 ++++---- keyboards/orthodox/keymaps/drashna/rules.mk | 2 +- keyboards/viterbi/keymaps/drashna/config.h | 4 +- layouts/community/ergodox/drashna/config.h | 5 +- layouts/community/ergodox/drashna/keymap.c | 77 ++++++------ layouts/community/ortho_4x12/drashna/config.h | 2 +- layouts/community/ortho_4x12/drashna/keymap.c | 50 +++++--- users/drashna/config.h | 6 +- users/drashna/drashna.c | 35 ++++-- users/drashna/drashna.h | 118 ++++++++---------- users/drashna/rgb_stuff.c | 20 +-- users/drashna/rules.mk | 3 - users/drashna/tap_dances.c | 10 +- 19 files changed, 281 insertions(+), 247 deletions(-) diff --git a/keyboards/crkbd/keymaps/drashna/config.h b/keyboards/crkbd/keymaps/drashna/config.h index 366f013dc..adfd79044 100644 --- a/keyboards/crkbd/keymaps/drashna/config.h +++ b/keyboards/crkbd/keymaps/drashna/config.h @@ -34,10 +34,12 @@ along with this program. If not, see . // #define TAPPING_FORCE_HOLD // #define TAPPING_TERM 100 +#ifdef RGBLIGHT_ENABLE #undef RGBLED_NUM -#define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 27 + +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 #define RGBLIGHT_LIMIT_VAL 120 -#define RGBLIGHT_HUE_STEP 10 -#define RGBLIGHT_SAT_STEP 17 -#define RGBLIGHT_VAL_STEP 17 +#endif diff --git a/keyboards/crkbd/keymaps/drashna/keymap.c b/keyboards/crkbd/keymaps/drashna/keymap.c index 7bced8de3..a293d5337 100644 --- a/keyboards/crkbd/keymaps/drashna/keymap.c +++ b/keyboards/crkbd/keymaps/drashna/keymap.c @@ -20,37 +20,48 @@ enum crkbd_keycodes { RGBRST = NEW_SAFE_RANGE }; +#define LAYOUT_crkbd_base( \ + K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, \ + K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \ + K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A \ + ) \ + LAYOUT_wrapper( \ + KC_ESC, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, KC_BSPC, \ + KC_TAB, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, KC_QUOT, \ + KC_MLSF, CTL_T(K21), K22, K23, K24, K25, K26, K27, K28, K29, CTL_T(K2A), KC_MRSF, \ + LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE \ + ) +#define LAYOUT_crkbd_base_wrapper(...) LAYOUT_crkbd_base(__VA_ARGS__) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_QWERTY] = LAYOUT_wrapper( - KC_ESC, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_BSPC, - KC_TAB, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_QUOT, - KC_MLSF, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_MRSF, - LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE + [_QWERTY] = LAYOUT_crkbd_base_wrapper( + _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, + _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, + _________________QWERTY_L3_________________, _________________QWERTY_R3_________________ ), - [_COLEMAK] = LAYOUT_wrapper( - KC_ESC, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_BSPC, - KC_TAB, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_QUOT, - KC_MLSF, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_MRSF, - LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE + + [_COLEMAK] = LAYOUT_crkbd_base_wrapper( + _________________COLEMAK_L1________________, _________________COLEMAK_R1________________, + _________________COLEMAK_L2________________, _________________COLEMAK_R2________________, + _________________COLEMAK_L3________________, _________________COLEMAK_R3________________ ), - [_DVORAK] = LAYOUT_wrapper( - KC_ESC, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_BSPC, - KC_TAB, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_QUOT, - KC_MLSF, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_MRSF, - LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE + + [_DVORAK] = LAYOUT_crkbd_base_wrapper( + _________________DVORAK_L1_________________, _________________DVORAK_R1_________________, + _________________DVORAK_L2_________________, _________________DVORAK_R2_________________, + _________________DVORAK_L3_________________, _________________DVORAK_R3_________________ ), - [_WORKMAN] = LAYOUT_wrapper( - KC_ESC, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_BSPC, - KC_TAB, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_QUOT, - KC_MLSF, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_MRSF, - LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE + + [_WORKMAN] = LAYOUT_crkbd_base_wrapper( + _________________WORKMAN_L1________________, _________________WORKMAN_R1________________, + _________________WORKMAN_L2________________, _________________WORKMAN_R2________________, + _________________WORKMAN_L3________________, _________________WORKMAN_R3________________ ), [_MODS] = LAYOUT_wrapper( - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_RSFT, + _______, ___________________BLANK___________________, ___________________BLANK___________________, _______, + _______, ___________________BLANK___________________, ___________________BLANK___________________, _______, + KC_LSFT, ___________________BLANK___________________, ___________________BLANK___________________, KC_RSFT, _______, _______, _______, _______, _______, _______ ), @@ -65,7 +76,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_GRV, _________________RAISE_L1__________________, _________________RAISE_R1__________________, KC_BSPC, _______, _________________RAISE_L2__________________, _________________RAISE_R2__________________, KC_BSLS, _______, _________________RAISE_L3__________________, _________________RAISE_R3__________________, _______, - _______, _______, _______, _______, _______, _______ //`--------------------' `--------------------' + _______, _______, _______, _______, _______, _______ ), [_ADJUST] = LAYOUT_wrapper( \ diff --git a/keyboards/iris/keymaps/drashna/config.h b/keyboards/iris/keymaps/drashna/config.h index 47276845f..027486715 100644 --- a/keyboards/iris/keymaps/drashna/config.h +++ b/keyboards/iris/keymaps/drashna/config.h @@ -31,7 +31,7 @@ along with this program. If not, see . #ifdef RGBLIGHT_ENABLE #undef RGBLED_NUM #define RGBLED_NUM 18 // Number of LEDs -#define RGBLIGHT_ANIMATIONS + #define RGBLIGHT_HUE_STEP 12 #define RGBLIGHT_SAT_STEP 12 #define RGBLIGHT_VAL_STEP 12 diff --git a/keyboards/iris/keymaps/drashna/keymap.c b/keyboards/iris/keymaps/drashna/keymap.c index 37c3f97f5..60f41f9d9 100644 --- a/keyboards/iris/keymaps/drashna/keymap.c +++ b/keyboards/iris/keymaps/drashna/keymap.c @@ -2,42 +2,53 @@ #include QMK_KEYBOARD_H #include "drashna.h" + +#define LAYOUT_iris_base( \ + K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, \ + K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \ + K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A \ + ) \ + LAYOUT_wrapper( \ + KC_ESC, ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________, KC_MINS, \ + KC_TAB , K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, KC_BSLS, \ + KC_C1R3, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, KC_QUOT, \ + KC_MLSF, CTL_T(K21), K22, K23, K24, K25, ALT_APP, OS_RGUI, K26, K27, K28, K29, CTL_T(K2A), KC_MRSF, \ + LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE \ + ) +#define LAYOUT_iris_base_wrapper(...) LAYOUT_iris_base(__VA_ARGS__) + + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_QWERTY] = LAYOUT_wrapper( - KC_ESC, ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________, KC_MINS, - KC_TAB , _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_BSLS, - KC_C1R3, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_QUOT, - KC_MLSF, _________________QWERTY_L3_________________, ALT_APP, OS_RGUI, _________________QWERTY_R3_________________, KC_MRSF, - LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE + [_QWERTY] = LAYOUT_iris_base_wrapper( + _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, + _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, + _________________QWERTY_L3_________________, _________________QWERTY_R3_________________ ), - [_COLEMAK] = LAYOUT_wrapper( - KC_ESC , ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________, KC_MINS, - KC_TAB , _________________COLEMAK_L1________________, _________________COLEMAK_R1________________, KC_BSLS, - KC_C1R3, _________________COLEMAK_L2________________, _________________COLEMAK_R2________________, KC_QUOT, - KC_MLSF, _________________COLEMAK_L3________________, ALT_APP, OS_RGUI, _________________COLEMAK_R3________________, KC_MRSF, - LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE + + [_COLEMAK] = LAYOUT_iris_base_wrapper( + _________________COLEMAK_L1________________, _________________COLEMAK_R1________________, + _________________COLEMAK_L2________________, _________________COLEMAK_R2________________, + _________________COLEMAK_L3________________, _________________COLEMAK_R3________________ ), - [_DVORAK] = LAYOUT_wrapper( - KC_ESC, ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________, KC_MINS, - KC_TAB , _________________DVORAK_L1_________________, _________________DVORAK_R1_________________, KC_BSLS, - KC_C1R3, _________________DVORAK_L2_________________, _________________DVORAK_R2_________________, KC_QUOT, - KC_MLSF, _________________DVORAK_L3_________________, ALT_APP, OS_RGUI, _________________DVORAK_R3_________________, KC_MRSF, - LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE + + [_DVORAK] = LAYOUT_iris_base_wrapper( + _________________DVORAK_L1_________________, _________________DVORAK_R1_________________, + _________________DVORAK_L2_________________, _________________DVORAK_R2_________________, + _________________DVORAK_L3_________________, _________________DVORAK_R3_________________ ), - [_WORKMAN] = LAYOUT_wrapper( - KC_ESC, ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________, KC_MINS, - KC_TAB , _________________WORKMAN_L1________________, _________________WORKMAN_R1________________, KC_BSLS, - KC_C1R3, _________________WORKMAN_L2________________, _________________WORKMAN_R2________________, KC_QUOT, - KC_MLSF, _________________WORKMAN_L3________________, ALT_APP, OS_RGUI, _________________WORKMAN_R3________________, KC_MRSF, - LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE + + [_WORKMAN] = LAYOUT_iris_base_wrapper( + _________________WORKMAN_L1________________, _________________WORKMAN_R1________________, + _________________WORKMAN_L2________________, _________________WORKMAN_R2________________, + _________________WORKMAN_L3________________, _________________WORKMAN_R3________________ ), [_MODS] = LAYOUT_wrapper( - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_RSFT, + _______, ___________________BLANK___________________, ___________________BLANK___________________, _______, + _______, ___________________BLANK___________________, ___________________BLANK___________________, _______, + _______, ___________________BLANK___________________, ___________________BLANK___________________, _______, + KC_LSFT, ___________________BLANK___________________, _______, _______, ___________________BLANK___________________, KC_RSFT, _______, _______, _______, _______, _______, _______ ), diff --git a/keyboards/iris/keymaps/drashna/rules.mk b/keyboards/iris/keymaps/drashna/rules.mk index e8035176e..89e568f39 100644 --- a/keyboards/iris/keymaps/drashna/rules.mk +++ b/keyboards/iris/keymaps/drashna/rules.mk @@ -8,10 +8,10 @@ RGBLIGHT_ENABLE = yes AUDIO_ENABLE = yes NKRO_ENABLE = yes BACKLIGHT_ENABLE = no -SWAP_HANDS_ENABLE = no +SWAP_HANDS_ENABLE = yes INDICATOR_LIGHTS = yes MACROS_ENABLED = no -RGBLIGHT_TWINKLE = no +RGBLIGHT_TWINKLE = yes BOOTLOADER = qmk-dfu diff --git a/keyboards/orthodox/keymaps/drashna/config.h b/keyboards/orthodox/keymaps/drashna/config.h index 2257b62fd..09df12d9e 100644 --- a/keyboards/orthodox/keymaps/drashna/config.h +++ b/keyboards/orthodox/keymaps/drashna/config.h @@ -45,7 +45,7 @@ along with this program. If not, see . #ifdef RGBLIGHT_ENABLE #define RGB_DI_PIN D3 #define RGBLED_NUM 16 // Number of LEDs -#define RGBLIGHT_ANIMATIONS + #define RGBLIGHT_HUE_STEP 12 #define RGBLIGHT_SAT_STEP 12 #define RGBLIGHT_VAL_STEP 12 diff --git a/keyboards/orthodox/keymaps/drashna/keymap.c b/keyboards/orthodox/keymaps/drashna/keymap.c index 67f732c12..25296ca4f 100644 --- a/keyboards/orthodox/keymaps/drashna/keymap.c +++ b/keyboards/orthodox/keymaps/drashna/keymap.c @@ -30,41 +30,47 @@ uint8_t last_led; uint8_t last_osm; #endif -// Each layer gets a name for readability, which is then used in the keymap matrix below. -// The underscores don't mean anything - you can have a layer called STUFF or any other name. -// Layer names don't all need to be of the same length, obviously, and you can also skip them -// entirely and just use numbers. -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO +#define LAYOUT_orthodox_base( \ + K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, \ + K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \ + K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A \ + ) \ + LAYOUT_wrapper( \ + KC_ESC, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, KC_BSPC, \ + KC_TAB, K11, K12, K13, K14, K15, ALT_APP, OS_LGUI, KC_LALT, OS_RGUI, K16, K17, K18, K19, K1A, KC_QUOT, \ + KC_MLSF, CTL_T(K21), K22, K23, K24, K25, LOWER, KC_SPACE,KC_BSPC, KC_DEL, KC_ENT, RAISE, K26, K27, K28, K29, CTL_T(K2A), KC_MRSF \ + ) +#define LAYOUT_orthodox_base_wrapper(...) LAYOUT_orthodox_base(__VA_ARGS__) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[_QWERTY] = LAYOUT_wrapper(\ - KC_ESC, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_BSPC, - KC_TAB, _________________QWERTY_L2_________________, ___________ORTHODOX_THUMP_TOP_____________, _________________QWERTY_R2_________________, KC_QUOT, - KC_MLSF, _________________QWERTY_L3_________________, ___________________ORTHODOX_THUMB_BOTTOM____________________, _________________QWERTY_R3_________________, KC_MRSF +[_QWERTY] = LAYOUT_orthodox_base_wrapper( + _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, + _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, + _________________QWERTY_L3_________________, _________________QWERTY_R3_________________ ), -[_COLEMAK] = LAYOUT_wrapper(\ - KC_ESC, _________________COLEMAK_L1________________, _________________COLEMAK_R1________________, KC_BSPC, - KC_TAB, _________________COLEMAK_L2________________, ___________ORTHODOX_THUMP_TOP_____________, _________________COLEMAK_R2________________, KC_QUOT, - KC_MLSF, _________________COLEMAK_L3________________, ___________________ORTHODOX_THUMB_BOTTOM____________________, _________________COLEMAK_R3________________, KC_MRSF +[_COLEMAK] = LAYOUT_orthodox_base_wrapper( + _________________COLEMAK_L1________________, _________________COLEMAK_R1________________, + _________________COLEMAK_L2________________, _________________COLEMAK_R2________________, + _________________COLEMAK_L3________________, _________________COLEMAK_R3________________ ), -[_DVORAK] = LAYOUT_wrapper(\ - KC_ESC, _________________DVORAK_L1_________________, _________________DVORAK_R1_________________, KC_BSPC, - KC_TAB, _________________DVORAK_L2_________________, ___________ORTHODOX_THUMP_TOP_____________, _________________DVORAK_R2_________________, KC_MINS, - KC_MLSF, _________________DVORAK_L3_________________, ___________________ORTHODOX_THUMB_BOTTOM____________________, _________________DVORAK_R3_________________, KC_MRSF +[_DVORAK] = LAYOUT_orthodox_base_wrapper( + _________________DVORAK_L1_________________, _________________DVORAK_R1_________________, + _________________DVORAK_L2_________________, _________________DVORAK_R2_________________, + _________________DVORAK_L3_________________, _________________DVORAK_R3_________________ ), -[_WORKMAN] = LAYOUT_wrapper(\ - KC_ESC, _________________WORKMAN_L1________________, _________________WORKMAN_R1________________, KC_BSPC, - KC_TAB, _________________WORKMAN_L2________________, ___________ORTHODOX_THUMP_TOP_____________, _________________WORKMAN_R2________________, KC_MINS, - KC_MLSF, _________________WORKMAN_L3________________, ___________________ORTHODOX_THUMB_BOTTOM____________________, _________________WORKMAN_R3________________, KC_MRSF + +[_WORKMAN] = LAYOUT_orthodox_base_wrapper( + _________________WORKMAN_L1________________, _________________WORKMAN_R1________________, + _________________WORKMAN_L2________________, _________________WORKMAN_R2________________, + _________________WORKMAN_L3________________, _________________WORKMAN_R3________________ ), + [_MODS] = LAYOUT_wrapper(\ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, diff --git a/keyboards/orthodox/keymaps/drashna/rules.mk b/keyboards/orthodox/keymaps/drashna/rules.mk index a826c664a..f870c3a7d 100644 --- a/keyboards/orthodox/keymaps/drashna/rules.mk +++ b/keyboards/orthodox/keymaps/drashna/rules.mk @@ -10,6 +10,6 @@ NKRO_ENABLE = yes INDICATOR_LIGHTS = yes MACROS_ENABLED = no -RGBLIGHT_TWINKLE = no +RGBLIGHT_TWINKLE = yes BOOTLOADER = qmk-dfu diff --git a/keyboards/viterbi/keymaps/drashna/config.h b/keyboards/viterbi/keymaps/drashna/config.h index a1e361e34..6eb871a50 100644 --- a/keyboards/viterbi/keymaps/drashna/config.h +++ b/keyboards/viterbi/keymaps/drashna/config.h @@ -19,16 +19,14 @@ along with this program. If not, see . #ifdef RGBLIGHT_ENABLE #undef RGBLED_NUM -#define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 16 + #define RGBLIGHT_HUE_STEP 8 #define RGBLIGHT_SAT_STEP 8 #define RGBLIGHT_VAL_STEP 8 #define RGBLIGHT_EFFECT_KNIGHT_LENGTH 2 #define RGBLIGHT_EFFECT_SNAKE_LENGTH 2 #define RGBLIGHT_EFFECT_BREATHE_CENTER 1 -#define RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL 300 -#define RGBLIGHT_EFFECT_CHRISTMAS_STEP 1 #endif // RGBLIGHT_ENABLE diff --git a/layouts/community/ergodox/drashna/config.h b/layouts/community/ergodox/drashna/config.h index 3ced18593..fee954d17 100644 --- a/layouts/community/ergodox/drashna/config.h +++ b/layouts/community/ergodox/drashna/config.h @@ -5,8 +5,9 @@ #ifdef RGBLIGHT_ENABLE #undef RGBLIGHT_SAT_STEP #define RGBLIGHT_SAT_STEP 12 -#define RGBLIGHT_EFFECT_KNIGHT_LENGTH 7 -#define RGBLIGHT_EFFECT_SNAKE_LENGTH 7 + +#define RGBLIGHT_EFFECT_KNIGHT_LENGTH 3 +#define RGBLIGHT_EFFECT_SNAKE_LENGTH 3 #define RGBLIGHT_EFFECT_BREATHE_CENTER 1 #endif // RGBLIGHT_ENABLE diff --git a/layouts/community/ergodox/drashna/keymap.c b/layouts/community/ergodox/drashna/keymap.c index 15153c469..b9a2eb7a8 100644 --- a/layouts/community/ergodox/drashna/keymap.c +++ b/layouts/community/ergodox/drashna/keymap.c @@ -30,6 +30,24 @@ along with this program. If not, see . //define layer change stuff for underglow indicator bool skip_leds = false; +#define LAYOUT_ergodox_pretty_base( \ + K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, \ + K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \ + K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A \ + ) \ + LAYOUT_ergodox_pretty_wrapper( \ + KC_ESC, ________________NUMBER_LEFT________________, UC_FLIP, UC_TABL, ________________NUMBER_RIGHT_______________, KC_MINS, \ + KC_TAB, K01, K02, K03, K04, K05, TG(_DIABLO), TG(_DIABLO), K06, K07, K08, K09, K0A, KC_BSLS, \ + KC_C1R3, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, KC_QUOT, \ + KC_MLSF, CTL_T(K21), K22, K23, K24, K25, TG(_GAMEPAD), TG(_GAMEPAD), K26, K27, K28, K29, CTL_T(K2A), KC_MRSF, \ + KC_GRV, OSM(MOD_MEH),OSM(MOD_LGUI),KC_LBRC, KC_RBRC, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, UC_IRNY, \ + ALT_T(KC_APP), OSM(MOD_LGUI), OSM(MOD_RGUI), CTL_T(KC_ESCAPE), \ + KC_HOME, KC_PGUP, \ + LT(_LOWER, KC_SPACE),KC_BSPC, KC_END, KC_PGDN, KC_DEL, LT(_RAISE, KC_ENTER) \ + ) + +#define LAYOUT_ergodox_pretty_base_wrapper(...) LAYOUT_ergodox_pretty_base(__VA_ARGS__) + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { @@ -55,15 +73,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | End | | PgDn | | | * `---------------------' `---------------------' */ - [_QWERTY] = LAYOUT_ergodox_pretty_wrapper( - // left hand // right hand - KC_ESC, ________________NUMBER_LEFT________________, UC_FLIP, UC_TABL, ________________NUMBER_RIGHT_______________, KC_MINS, - KC_TAB, _________________QWERTY_L1_________________, TG(_DIABLO), TG(_DIABLO), _________________QWERTY_R1_________________, KC_BSLS, - KC_C1R3, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_QUOT, - KC_MLSF, _________________QWERTY_L3_________________, TG(_GAMEPAD), TG(_GAMEPAD), _________________QWERTY_R3_________________, KC_MRSF, - KC_GRV, ___________ERGODOX_BOTTOM_LEFT_____________, ___________ERGODOX_BOTTOM_RIGHT____________, UC_IRNY, - __________________ERGODOX_THUMB_CLUSTER_____________________ - ), + [_QWERTY] = LAYOUT_ergodox_pretty_base_wrapper( + _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, + _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, + _________________QWERTY_L3_________________, _________________QWERTY_R3_________________ + ), /* Keymap 0: COLEMAK layer * * ,--------------------------------------------------. ,--------------------------------------------------. @@ -87,15 +101,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ // If it accepts an argument (i.e, is a function), it doesn't need KC_. // Otherwise, it needs KC_* - [_COLEMAK] = LAYOUT_ergodox_pretty_wrapper( - // left hand // right hand - KC_ESC, ________________NUMBER_LEFT________________, UC_FLIP, UC_TABL, ________________NUMBER_RIGHT_______________, KC_MINS, - KC_TAB, _________________COLEMAK_L1________________, TG(_DIABLO), TG(_DIABLO), _________________COLEMAK_R1________________, KC_BSLS, - KC_C1R3, _________________COLEMAK_L2________________, _________________COLEMAK_R2________________, KC_QUOT, - KC_MLSF, _________________COLEMAK_L3________________, TG(_GAMEPAD), TG(_GAMEPAD), _________________COLEMAK_R3________________, KC_MRSF, - KC_GRV, ___________ERGODOX_BOTTOM_LEFT_____________, ___________ERGODOX_BOTTOM_RIGHT____________, UC_IRNY, - __________________ERGODOX_THUMB_CLUSTER_____________________ - ), + [_COLEMAK] = LAYOUT_ergodox_pretty_base_wrapper( + _________________COLEMAK_L1________________, _________________COLEMAK_R1________________, + _________________COLEMAK_L2________________, _________________COLEMAK_R2________________, + _________________COLEMAK_L3________________, _________________COLEMAK_R3________________ + ), /* Keymap 0: DVORAK Layout * * ,--------------------------------------------------. ,--------------------------------------------------. @@ -119,15 +129,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ // If it accepts an argument (i.e, is a function), it doesn't need KC_. // Otherwise, it needs KC_* - [_DVORAK] = LAYOUT_ergodox_pretty_wrapper( - // left hand // right hand - KC_ESC, ________________NUMBER_LEFT________________, UC_FLIP, UC_TABL, ________________NUMBER_RIGHT_______________, KC_BSLS, - KC_TAB, _________________DVORAK_L1_________________, TG(_DIABLO), TG(_DIABLO), _________________DVORAK_R1_________________, KC_SLSH, - KC_C1R3, _________________DVORAK_L2_________________, _________________DVORAK_R2_________________, KC_MINS, - KC_MLSF, _________________DVORAK_L3_________________, TG(_GAMEPAD), TG(_GAMEPAD), _________________DVORAK_R3_________________, KC_MRSF, - KC_GRV, ___________ERGODOX_BOTTOM_LEFT_____________, ___________ERGODOX_BOTTOM_RIGHT____________, UC_IRNY, - __________________ERGODOX_THUMB_CLUSTER_____________________ - ), + [_DVORAK] = LAYOUT_ergodox_pretty_base_wrapper( + _________________DVORAK_L1_________________, _________________DVORAK_R1_________________, + _________________DVORAK_L2_________________, _________________DVORAK_R2_________________, + _________________DVORAK_L3_________________, _________________DVORAK_R3_________________ + ), /* Keymap 0: WORKMAN layer * * ,--------------------------------------------------. ,--------------------------------------------------. @@ -149,17 +155,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | |ace | End | | PgDn | | | * `--------------------' `----------------------' */ -// If it accepts an argument (i.e, is a function), it doesn't need KC_. -// Otherwise, it needs KC_* - [_WORKMAN] = LAYOUT_ergodox_pretty_wrapper( - // left hand - KC_ESC, ________________NUMBER_LEFT________________, UC_FLIP, UC_TABL, ________________NUMBER_RIGHT_______________, KC_MINS, - KC_TAB, _________________WORKMAN_L1________________, TG(_DIABLO), TG(_DIABLO), _________________WORKMAN_R1________________, KC_BSLS, - KC_C1R3, _________________WORKMAN_L2________________, _________________WORKMAN_R2________________, KC_QUOT, - KC_MLSF, _________________WORKMAN_L3________________, TG(_GAMEPAD), TG(_GAMEPAD), _________________WORKMAN_R3________________, KC_MRSF, - KC_GRV, ___________ERGODOX_BOTTOM_LEFT_____________, ___________ERGODOX_BOTTOM_RIGHT____________, UC_IRNY, - __________________ERGODOX_THUMB_CLUSTER_____________________ - ), + + [_WORKMAN] = LAYOUT_ergodox_pretty_base_wrapper( + _________________WORKMAN_L1________________, _________________WORKMAN_R1________________, + _________________WORKMAN_L2________________, _________________WORKMAN_R2________________, + _________________WORKMAN_L3________________, _________________WORKMAN_R3________________ + ), // Reverts OSM(Shift) to normal Shifts. However, may not need since we fixed the issue with RDP (LOCAL RESOURCES) [_MODS] = LAYOUT_ergodox_pretty_wrapper( diff --git a/layouts/community/ortho_4x12/drashna/config.h b/layouts/community/ortho_4x12/drashna/config.h index cbd5bb460..b4c780cc1 100644 --- a/layouts/community/ortho_4x12/drashna/config.h +++ b/layouts/community/ortho_4x12/drashna/config.h @@ -5,7 +5,7 @@ #if defined(RGBLIGHT_ENABLE) && !defined(RGBLED_NUM) #define RGB_DI_PIN D3 #define RGBLED_NUM 16 // Number of LEDs -#define RGBLIGHT_ANIMATIONS + #define RGBLIGHT_HUE_STEP 12 #define RGBLIGHT_SAT_STEP 12 #define RGBLIGHT_VAL_STEP 12 diff --git a/layouts/community/ortho_4x12/drashna/keymap.c b/layouts/community/ortho_4x12/drashna/keymap.c index 39f901b14..108df6931 100644 --- a/layouts/community/ortho_4x12/drashna/keymap.c +++ b/layouts/community/ortho_4x12/drashna/keymap.c @@ -25,34 +25,44 @@ enum planck_keycodes { #define BACKLIT OSM(MOD_LSFT) #endif +#define LAYOUT_ortho_4x12_base( \ + K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, \ + K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \ + K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A \ + ) \ + LAYOUT_ortho_4x12_wrapper( \ + KC_ESC, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, KC_BSPC, \ + KC_TAB, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, KC_QUOT, \ + KC_MLSF, CTL_T(K21), K22, K23, K24, K25, K26, K27, K28, K29, CTL_T(K2A), KC_ENT, \ + BACKLIT, OS_LCTL, OS_LALT, OS_LGUI, SP_LWER, BK_LWER, DL_RAIS, ET_RAIS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ + ) +#define LAYOUT_ortho_4x12_base_wrapper(...) LAYOUT_ortho_4x12_base(__VA_ARGS__) + + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[_QWERTY] = LAYOUT_ortho_4x12_wrapper( - KC_ESC, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_BSPC, - KC_TAB, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_QUOT, - KC_MLSF, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_ENT, - BACKLIT, OS_LCTL, OS_LALT, OS_LGUI, SP_LWER, BK_LWER, DL_RAIS, ET_RAIS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT +[_QWERTY] = LAYOUT_ortho_4x12_base_wrapper( + _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, + _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, + _________________QWERTY_L3_________________, _________________QWERTY_R3_________________ ), -[_COLEMAK] = LAYOUT_ortho_4x12_wrapper( - KC_ESC, _________________COLEMAK_L1________________, _________________COLEMAK_R1________________, KC_BSPC, - KC_TAB, _________________COLEMAK_L2________________, _________________COLEMAK_R2________________, KC_QUOT, - KC_MLSF, _________________COLEMAK_L3________________, _________________COLEMAK_R3________________, KC_ENT, - BACKLIT, OS_LCTL, OS_LALT, OS_LGUI, SP_LWER, BK_LWER, DL_RAIS, ET_RAIS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT +[_COLEMAK] = LAYOUT_ortho_4x12_base_wrapper( + _________________COLEMAK_L1________________, _________________COLEMAK_R1________________, + _________________COLEMAK_L2________________, _________________COLEMAK_R2________________, + _________________COLEMAK_L3________________, _________________COLEMAK_R3________________ ), -[_DVORAK] = LAYOUT_ortho_4x12_wrapper( - KC_ESC, _________________DVORAK_L1_________________, _________________DVORAK_R1_________________, KC_BSPC, - KC_TAB, _________________DVORAK_L2_________________, _________________DVORAK_R2_________________, KC_SLSH, - KC_MLSF, _________________DVORAK_L3_________________, _________________DVORAK_R3_________________, KC_ENT, - BACKLIT, OS_LCTL, OS_LALT, OS_LGUI, SP_LWER, BK_LWER, DL_RAIS, ET_RAIS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT +[_DVORAK] = LAYOUT_ortho_4x12_base_wrapper( + _________________DVORAK_L1_________________, _________________DVORAK_R1_________________, + _________________DVORAK_L2_________________, _________________DVORAK_R2_________________, + _________________DVORAK_L3_________________, _________________DVORAK_R3_________________ ), -[_WORKMAN] = LAYOUT_ortho_4x12_wrapper( - KC_TAB, _________________WORKMAN_L1________________, _________________WORKMAN_R1________________, KC_BSPC, - KC_ESC, _________________WORKMAN_L2________________, _________________WORKMAN_R2________________, KC_QUOT, - KC_MLSF, _________________WORKMAN_L3________________, _________________WORKMAN_R3________________, KC_ENT, - BACKLIT, OS_LCTL, OS_LALT, OS_LGUI, SP_LWER, BK_LWER, DL_RAIS, ET_RAIS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT +[_WORKMAN] = LAYOUT_ortho_4x12_base_wrapper( + _________________WORKMAN_L1________________, _________________WORKMAN_R1________________, + _________________WORKMAN_L2________________, _________________WORKMAN_R2________________, + _________________WORKMAN_L3________________, _________________WORKMAN_R3________________ ), [_MODS] = LAYOUT_ortho_4x12_wrapper( diff --git a/users/drashna/config.h b/users/drashna/config.h index 3ddec93b1..4545b34ef 100644 --- a/users/drashna/config.h +++ b/users/drashna/config.h @@ -19,10 +19,12 @@ #ifdef RGBLIGHT_ENABLE #define RGBLIGHT_SLEEP +#undef RGBLIGHT_ANIMATIONS +#define RGBLIGHT_EFFECT_BREATHING +#define RGBLIGHT_EFFECT_SNAKE +#define RGBLIGHT_EFFECT_KNIGHT #endif // RGBLIGHT_ENABLE - - #ifndef ONESHOT_TAP_TOGGLE #define ONESHOT_TAP_TOGGLE 2 #endif // !ONESHOT_TAP_TOGGLE diff --git a/users/drashna/drashna.c b/users/drashna/drashna.c index aad9fab61..5b6620cf3 100644 --- a/users/drashna/drashna.c +++ b/users/drashna/drashna.c @@ -36,11 +36,11 @@ bool send_game_macro(const char *str, keyrecord_t *record, bool override) { keycode = KC_ENTER; } clear_keyboard(); - tap(keycode); + tap_code(keycode); wait_ms(50); send_string_with_delay(str, MACRO_TIMER); wait_ms(50); - tap(KC_ENTER); + tap_code(KC_ENTER); } if (override) wait_ms(3000); return false; @@ -127,13 +127,13 @@ uint32_t default_layer_state_set_keymap (uint32_t state) { __attribute__ ((weak)) void led_set_keymap(uint8_t usb_led) {} - +__attribute__ ((weak)) +void eeconfig_init_keymap(void) {} // Call user matrix init, set default RGB colors and then // call the keymap's init function void matrix_init_user(void) { - userspace_config.raw = eeprom_read_dword(EECONFIG_USERSPACE); - + userspace_config.raw = eeconfig_read_user(); #ifdef BOOTLOADER_CATERINA DDRD &= ~(1<<5); @@ -250,7 +250,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { case KC_MAKE: // Compiles the firmware, and adds the flash command based on keyboard bootloader if (!record->event.pressed) { - send_string_with_delay_P(PSTR("make " QMK_KEYBOARD ":" QMK_KEYMAP + uint8_t temp_mod = get_mods(); + clear_mods(); + send_string_with_delay_P(PSTR("make " QMK_KEYBOARD ":" QMK_KEYMAP), 10); + if (temp_mod & MODS_SHIFT_MASK) { + send_string_with_delay_P(PSTR( #if defined(__ARM__) ":dfu-util" #elif defined(BOOTLOADER_DFU) @@ -260,7 +264,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { #elif defined(BOOTLOADER_CATERINA) ":avrdude" #endif // bootloader options - SS_TAP(X_ENTER)), 10); + ), 10); + } + if (temp_mod & MODS_CTRL_MASK) { send_string_with_delay_P(PSTR(" -j8 --output-sync"), 10); } + send_string_with_delay_P(PSTR(SS_TAP(X_ENTER)), 10); + set_mods(temp_mod); } return false; break; @@ -268,8 +276,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { case EPRM: // Resets EEPROM if (record->event.pressed) { eeconfig_init(); - default_layer_set(1UL<event.pressed) { userspace_config.is_overwatch ^= 1; eeprom_update_dword(EECONFIG_USERSPACE, userspace_config.raw); } + if (record->event.pressed) { userspace_config.is_overwatch ^= 1; eeconfig_update_user(userspace_config.raw); } #ifdef RGBLIGHT_ENABLE userspace_config.is_overwatch ? rgblight_mode_noeeprom(17) : rgblight_mode_noeeprom(18); #endif //RGBLIGHT_ENABLE @@ -344,11 +350,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } else { if (timer_elapsed(copy_paste_timer) > TAPPING_TERM) { // Hold, copy register_code(KC_LCTL); - tap(KC_C); + tap_code(KC_C); unregister_code(KC_LCTL); } else { // Tap, paste register_code(KC_LCTL); - tap(KC_V); + tap_code(KC_V); unregister_code(KC_LCTL); } } @@ -413,3 +419,8 @@ uint32_t default_layer_state_set_user(uint32_t state) { void led_set_user(uint8_t usb_led) { led_set_keymap(usb_led); } + +void eeconfig_init_user(void) { + userspace_config.raw = 0; + eeconfig_update_user(userspace_config.raw); +} diff --git a/users/drashna/drashna.h b/users/drashna/drashna.h index 49e3fc870..7e69a9f8d 100644 --- a/users/drashna/drashna.h +++ b/users/drashna/drashna.h @@ -19,14 +19,13 @@ along with this program. If not, see . #include "quantum.h" #include "version.h" #include "eeprom.h" -#include "send_unicode.h" #ifdef RGB_MATRIX_ENABLE #include "rgb_matrix.h" #endif -// Define layer names +/* Define layer names */ enum userspace_layers { _QWERTY = 0, _NUMLOCK = 0, @@ -43,28 +42,27 @@ enum userspace_layers { _ADJUST, }; -//define modifiers +/* +define modifiers here, since MOD_* doesn't seem to work for these + */ #define MODS_SHIFT_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) #define MODS_CTRL_MASK (MOD_BIT(KC_LCTL)|MOD_BIT(KC_RCTRL)) #define MODS_ALT_MASK (MOD_BIT(KC_LALT)|MOD_BIT(KC_RALT)) #define MODS_GUI_MASK (MOD_BIT(KC_LGUI)|MOD_BIT(KC_RGUI)) -// RGB color codes are no longer located here anymore. Instead, you will want to -// head to https://github.com/qmk/qmk_firmware/blob/master/quantum/rgblight_list.h - -extern bool rgb_layer_change; +/* +RGB color codes are no longer located here anymore. Instead, you will want to +head to https://github.com/qmk/qmk_firmware/blob/master/quantum/rgblight_list.h +*/ #ifdef RGBLIGHT_ENABLE void rgblight_sethsv_default_helper(uint8_t index); #endif // RGBLIGHT_ENABLE -inline void tap(uint16_t keycode){ register_code(keycode); unregister_code(keycode); }; bool mod_key_press_timer (uint16_t code, uint16_t mod_code, bool pressed); bool mod_key_press (uint16_t code, uint16_t mod_code, bool pressed, uint16_t this_timer); -#define EECONFIG_USERSPACE (uint32_t *)19 - typedef union { uint32_t raw; struct { @@ -149,7 +147,7 @@ enum userspace_custom_keycodes { #define DL_RAIS LT(_RAISE, KC_DEL) #define ET_RAIS LT(_RAISE, KC_ENTER) -// OSM keycodes, to keep things clean and easy to change +/* OSM keycodes, to keep things clean and easy to change */ #define KC_MLSF OSM(MOD_LSFT) #define KC_MRSF OSM(MOD_RSFT) @@ -178,9 +176,11 @@ enum { #endif // TAP_DANCE_ENABLE -// Custom Keycodes for Diablo 3 layer -// But since TD() doesn't work when tap dance is disabled -// We use custom codes here, so we can substitute the right stuff +/* +Custom Keycodes for Diablo 3 layer +But since TD() doesn't work when tap dance is disabled +We use custom codes here, so we can substitute the right stuff +*/ #ifdef TAP_DANCE_ENABLE #define KC_D3_1 TD(TD_D3_1) #define KC_D3_2 TD(TD_D3_2) @@ -193,11 +193,11 @@ enum { #define KC_D3_4 KC_4 #endif // TAP_DANCE_ENABLE - - -// Since our quirky block definitions are basically a list of comma separated -// arguments, we need a wrapper in order for these definitions to be -// expanded before being used as arguments to the LAYOUT_xxx macro. +/* +Since our quirky block definitions are basically a list of comma separated +arguments, we need a wrapper in order for these definitions to be +expanded before being used as arguments to the LAYOUT_xxx macro. +*/ #if (!defined(LAYOUT) && defined(KEYMAP)) #define LAYOUT KEYMAP #endif @@ -208,112 +208,114 @@ enum { #define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__) #define LAYOUT_ortho_4x12_wrapper(...) LAYOUT_ortho_4x12(__VA_ARGS__) -// Blocks for each of the four major keyboard layouts -// Organized so we can quickly adapt and modify all of them -// at once, rather than for each keyboard, one at a time. -// And this allows for much cleaner blocks in the keymaps. -// For instance Tap/Hold for Control on all of the layouts +/* +Blocks for each of the four major keyboard layouts +Organized so we can quickly adapt and modify all of them +at once, rather than for each keyboard, one at a time. +And this allows for much cleaner blocks in the keymaps. +For instance Tap/Hold for Control on all of the layouts -// NOTE: These are all the same length. If you do a search/replace -// then you need to add/remove underscores to keep the -// lengths consistent. +NOTE: These are all the same length. If you do a search/replace + then you need to add/remove underscores to keep the + lengths consistent. +*/ #define _________________QWERTY_L1_________________ KC_Q, KC_W, KC_E, KC_R, KC_T #define _________________QWERTY_L2_________________ KC_A, KC_S, KC_D, KC_F, KC_G -#define _________________QWERTY_L3_________________ CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B +#define _________________QWERTY_L3_________________ KC_Z, KC_X, KC_C, KC_V, KC_B #define _________________QWERTY_R1_________________ KC_Y, KC_U, KC_I, KC_O, KC_P #define _________________QWERTY_R2_________________ KC_H, KC_J, KC_K, KC_L, KC_SCLN -#define _________________QWERTY_R3_________________ KC_N, KC_M, KC_COMM, KC_DOT, CTL_T(KC_SLASH) +#define _________________QWERTY_R3_________________ KC_N, KC_M, KC_COMM, KC_DOT, KC_SLASH #define _________________COLEMAK_L1________________ KC_Q, KC_W, KC_F, KC_P, KC_G #define _________________COLEMAK_L2________________ KC_A, KC_R, KC_S, KC_T, KC_D -#define _________________COLEMAK_L3________________ CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B +#define _________________COLEMAK_L3________________ KC_Z, KC_X, KC_C, KC_V, KC_B #define _________________COLEMAK_R1________________ KC_J, KC_L, KC_U, KC_Y, KC_SCLN #define _________________COLEMAK_R2________________ KC_H, KC_N, KC_E, KC_I, KC_O -#define _________________COLEMAK_R3________________ KC_K, KC_M, KC_COMM, KC_DOT, CTL_T(KC_SLASH) +#define _________________COLEMAK_R3________________ KC_K, KC_M, KC_COMM, KC_DOT, KC_SLASH #define ______________COLEMAK_MOD_DH_L1____________ KC_Q, KC_W, KC_F, KC_P, KC_B #define ______________COLEMAK_MOD_DH_L2____________ KC_A, KC_R, KC_S, KC_T, KC_G -#define ______________COLEMAK_MOD_DH_L3____________ CTL_T(KC_Z), KC_X, KC_C, KC_D, KC_V +#define ______________COLEMAK_MOD_DH_L3____________ KC_Z, KC_X, KC_C, KC_D, KC_V #define ______________COLEMAK_MOD_DH_R1____________ KC_J, KC_L, KC_U, KC_Y, KC_SCLN #define ______________COLEMAK_MOD_DH_R2____________ KC_M, KC_N, KC_E, KC_I, KC_O -#define ______________COLEMAK_MOD_DH_R3____________ KC_K, KC_H, KC_COMM, KC_DOT, CTL_T(KC_SLASH) +#define ______________COLEMAK_MOD_DH_R3____________ KC_K, KC_H, KC_COMM, KC_DOT, KC_SLASH #define _________________DVORAK_L1_________________ KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y #define _________________DVORAK_L2_________________ KC_A, KC_O, KC_E, KC_U, KC_I -#define _________________DVORAK_L3_________________ CTL_T(KC_SCLN),KC_Q, KC_J, KC_K, KC_X +#define _________________DVORAK_L3_________________ KC_SCLN, KC_Q, KC_J, KC_K, KC_X #define _________________DVORAK_R1_________________ KC_F, KC_G, KC_C, KC_R, KC_L #define _________________DVORAK_R2_________________ KC_D, KC_H, KC_T, KC_N, KC_S -#define _________________DVORAK_R3_________________ KC_B, KC_M, KC_W, KC_V, CTL_T(KC_Z) +#define _________________DVORAK_R3_________________ KC_B, KC_M, KC_W, KC_V, KC_Z #define _________________WORKMAN_L1________________ KC_Q, KC_D, KC_R, KC_W, KC_B #define _________________WORKMAN_L2________________ KC_A, KC_S, KC_H, KC_T, KC_G -#define _________________WORKMAN_L3________________ CTL_T(KC_Z), KC_X, KC_M, KC_C, KC_V +#define _________________WORKMAN_L3________________ KC_Z, KC_X, KC_M, KC_C, KC_V #define _________________WORKMAN_R1________________ KC_J, KC_F, KC_U, KC_P, KC_SCLN #define _________________WORKMAN_R2________________ KC_Y, KC_N, KC_E, KC_O, KC_I -#define _________________WORKMAN_R3________________ KC_K, KC_L, KC_COMM, KC_DOT, CTL_T(KC_SLASH) +#define _________________WORKMAN_R3________________ KC_K, KC_L, KC_COMM, KC_DOT, KC_SLASH #define _________________NORMAN_L1_________________ KC_Q, KC_W, KC_D, KC_F, KC_K #define _________________NORMAN_L2_________________ KC_A, KC_S, KC_E, KC_T, KC_G -#define _________________NORMAN_L3_________________ CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B +#define _________________NORMAN_L3_________________ KC_Z, KC_X, KC_C, KC_V, KC_B #define _________________NORMAN_R1_________________ KC_J, KC_U, KC_R, KC_L, KC_SCLN #define _________________NORMAN_R2_________________ KC_Y, KC_N, KC_I, KC_O, KC_U -#define _________________NORMAN_R3_________________ KC_P, KC_M, KC_COMM, KC_DOT, CTL_T(KC_SLASH) +#define _________________NORMAN_R3_________________ KC_P, KC_M, KC_COMM, KC_DOT, KC_SLASH #define _________________MALTRON_L1________________ KC_Q, KC_P, KC_Y, KC_C, KC_B #define _________________MALTRON_L2________________ KC_A, KC_N, KC_I, KC_S, KC_F -#define _________________MALTRON_L3________________ CTL_T(KC_SCLN), KC_SLSH, KC_J KC_G, KC_COMM +#define _________________MALTRON_L3________________ KC_SCLN, KC_SLSH, KC_J KC_G, KC_COMM #define _________________MALTRON_R1________________ KC_V, KC_M, KC_U, KC_Z, KC_L #define _________________MALTRON_R2________________ KC_D, KC_T, KC_D, KC_O, KC_R -#define _________________MALTRON_R3________________ KC_DOT, KC_W, KC_K, KC_MINS, CTL_T(KC_x) +#define _________________MALTRON_R3________________ KC_DOT, KC_W, KC_K, KC_MINS, KC_X #define _________________EUCALYN_L1________________ KC_SLSH, KC_COMM, KC_DOT, KC_F, KC_Q #define _________________EUCALYN_L2________________ KC_A, KC_O, KC_E, KC_I, KC_U -#define _________________EUCALYN_L3________________ CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_W +#define _________________EUCALYN_L3________________ KC_Z, KC_X, KC_C, KC_V, KC_W #define _________________EUCALYN_R1________________ KC_M, KC_R, KC_D, KC_Y, KC_P #define _________________EUCALYN_R2________________ KC_G, KC_T, KC_K, KC_S, KC_N -#define _________________EUCALYN_R3________________ KC_B, KC_H, KC_J, KC_L, CTL_T(KC_SCLN) +#define _________________EUCALYN_R3________________ KC_B, KC_H, KC_J, KC_L, KC_SCLN #define _____________CARPLAX_QFMLWY_L1_____________ KC_Q, KC_F, KC_M, KC_L, KC_W #define _____________CARPLAX_QFMLWY_L2_____________ KC_D, KC_S, KC_T, KC_N, KC_R -#define _____________CARPLAX_QFMLWY_L3_____________ CTL_T(KC_Z), KC_V, KC_G, KC_C, KC_X +#define _____________CARPLAX_QFMLWY_L3_____________ KC_Z, KC_V, KC_G, KC_C, KC_X #define _____________CARPLAX_QFMLWY_R1_____________ KC_Y, KC_U, KC_O, KC_B, KC_J #define _____________CARPLAX_QFMLWY_R2_____________ KC_I, KC_A, KC_E, KC_H, KC_SCLN -#define _____________CARPLAX_QFMLWY_R3_____________ KC_P, KC_K, KC_COMM, KC_DOT, CTL_T(KC_SLSH) +#define _____________CARPLAX_QFMLWY_R3_____________ KC_P, KC_K, KC_COMM, KC_DOT, KC_SLSH #define _____________CARPLAX_QGMLWB_L1_____________ KC_Q, KC_G, KC_M, KC_L, KC_W #define _____________CARPLAX_QGMLWB_L2_____________ KC_D, KC_S, KC_T, KC_N, KC_R -#define _____________CARPLAX_QGMLWB_L3_____________ CTL_T(KC_Z), KC_X, KC_C, KC_F, KC_J +#define _____________CARPLAX_QGMLWB_L3_____________ KC_Z, KC_X, KC_C, KC_F, KC_J #define _____________CARPLAX_QGMLWB_R1_____________ KC_B, KC_Y, KC_U, KC_V, KC_SCLN #define _____________CARPLAX_QGMLWB_R2_____________ KC_I, KC_A, KC_E, KC_O, KC_H -#define _____________CARPLAX_QGMLWB_R3_____________ KC_K, KC_P, KC_COMM, KC_DOT, CTL_T(KC_SLSH) +#define _____________CARPLAX_QGMLWB_R3_____________ KC_K, KC_P, KC_COMM, KC_DOT, KC_SLSH #define _____________CARPLAX_QGMLWY_L1_____________ KC_Q, KC_G, KC_M, KC_L, KC_W #define _____________CARPLAX_QGMLWY_L2_____________ KC_D, KC_S, KC_T, KC_N, KC_R -#define _____________CARPLAX_QGMLWY_L3_____________ CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_J +#define _____________CARPLAX_QGMLWY_L3_____________ KC_Z, KC_X, KC_C, KC_V, KC_J #define _____________CARPLAX_QGMLWY_R1_____________ KC_Y, KC_F, KC_U, KC_B, KC_SCLN #define _____________CARPLAX_QGMLWY_R2_____________ KC_I, KC_A, KC_E, KC_O, KC_H -#define _____________CARPLAX_QGMLWY_R3_____________ KC_K, KC_P, KC_COMM, KC_DOT, CTL_T(KC_SLSH) +#define _____________CARPLAX_QGMLWY_R3_____________ KC_K, KC_P, KC_COMM, KC_DOT, KC_SLSH #define ________________NUMBER_LEFT________________ KC_1, KC_2, KC_3, KC_4, KC_5 @@ -352,21 +354,3 @@ enum { #define _________________ADJUST_R2_________________ AG_SWAP, QWERTY, COLEMAK, DVORAK, WORKMAN #define _________________ADJUST_R3_________________ MG_NKRO, KC_MUTE, KC_VOLD, KC_VOLU, KC_MNXT - -// Since we have 4 default layouts (QWERTY, DVORAK, COLEMAK and WORKMAN), -// this allows us to quickly modify the bottom row for all of the layouts -// so we don't have to alter it 4 times and hope that we haven't missed -// anything -#define ___________ERGODOX_BOTTOM_LEFT_____________ OSM(MOD_MEH), OSM(MOD_LGUI), KC_LBRC, KC_RBRC -#define ___________ERGODOX_BOTTOM_RIGHT____________ KC_LEFT, KC_DOWN, KC_UP, KC_RGHT - - -#define ___________ORTHODOX_THUMP_TOP_____________ ALT_APP, OS_LGUI, KC_LALT, OS_RGUI -#define ___________________ORTHODOX_THUMB_BOTTOM____________________ LOWER, KC_SPACE,KC_BSPC, KC_DEL, KC_ENT, RAISE - - -#define __________________ERGODOX_THUMB_CLUSTER_____________________ ALT_T(KC_APP), OSM(MOD_LGUI), OSM(MOD_RGUI), CTL_T(KC_ESCAPE), \ - KC_HOME, KC_PGUP, \ - LT(_LOWER, KC_SPACE),KC_BSPC, KC_END, KC_PGDN, KC_DEL, LT(_RAISE, KC_ENTER) - - diff --git a/users/drashna/rgb_stuff.c b/users/drashna/rgb_stuff.c index 4a1a8de69..dc6075320 100644 --- a/users/drashna/rgb_stuff.c +++ b/users/drashna/rgb_stuff.c @@ -230,7 +230,7 @@ bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) { if (record->event.pressed) { userspace_config.rgb_layer_change ^= 1; xprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change); - eeprom_update_dword(EECONFIG_USERSPACE, userspace_config.raw); + eeconfig_update_user(userspace_config.raw); if (userspace_config.rgb_layer_change) { layer_state_set(layer_state); // This is needed to immediately set the layer color (looks better) } @@ -243,7 +243,7 @@ bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) { if (userspace_config.rgb_layer_change) { userspace_config.rgb_layer_change = false; xprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change); - eeprom_update_dword(EECONFIG_USERSPACE, userspace_config.raw); + eeconfig_update_user(userspace_config.raw); } } return true; break; @@ -295,31 +295,31 @@ uint32_t layer_state_set_rgb(uint32_t state) { switch (biton32(state)) { case _MACROS: rgblight_sethsv_noeeprom_orange(); - userspace_config.is_overwatch ? rgblight_mode_noeeprom(17) : rgblight_mode_noeeprom(18); + userspace_config.is_overwatch ? rgblight_effect_snake(RGBLIGHT_MODE_SNAKE + 2) : rgblight_effect_snake(RGBLIGHT_MODE_SNAKE + 3); break; case _MEDIA: rgblight_sethsv_noeeprom_chartreuse(); - rgblight_mode_noeeprom(22); + rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 1); break; case _GAMEPAD: rgblight_sethsv_noeeprom_orange(); - rgblight_mode_noeeprom(17); + rgblight_mode_noeeprom(RGBLIGHT_MODE_SNAKE + 2); break; case _DIABLO: rgblight_sethsv_noeeprom_red(); - rgblight_mode_noeeprom(5); + rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3); break; case _RAISE: rgblight_sethsv_noeeprom_yellow(); - rgblight_mode_noeeprom(5); + rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3); break; case _LOWER: rgblight_sethsv_noeeprom_green(); - rgblight_mode_noeeprom(5); + rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3); break; case _ADJUST: rgblight_sethsv_noeeprom_red(); - rgblight_mode_noeeprom(23); + rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2); break; default: // for any other layers, or the default layer switch (biton32(default_layer_state)) { @@ -332,7 +332,7 @@ uint32_t layer_state_set_rgb(uint32_t state) { default: rgblight_sethsv_noeeprom_cyan(); break; } - biton32(state) == _MODS ? rgblight_mode_noeeprom(2) : rgblight_mode_noeeprom(1); // if _MODS layer is on, then breath to denote it + biton32(state) == _MODS ? rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING) : rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT); // if _MODS layer is on, then breath to denote it break; } // layer_state_set_indicator(); // Runs every scan, so need to call this here .... since I can't get it working "right" anyhow diff --git a/users/drashna/rules.mk b/users/drashna/rules.mk index 3d6213eff..964c96c52 100644 --- a/users/drashna/rules.mk +++ b/users/drashna/rules.mk @@ -37,6 +37,3 @@ ifdef CONSOLE_ENABLE endif endif -ifeq ($(strip $(UNICODE_ENABLE)), yes) - SRC += send_unicode.c -endif diff --git a/users/drashna/tap_dances.c b/users/drashna/tap_dances.c index c9e4b1d0f..346675853 100644 --- a/users/drashna/tap_dances.c +++ b/users/drashna/tap_dances.c @@ -38,16 +38,16 @@ qk_tap_dance_action_t tap_dance_actions[] = { // Sends the key press to system, but only if on the Diablo layer void send_diablo_keystroke(uint8_t diablo_key) { - if (biton32(layer_state) == _DIABLO) { + if (IS_LAYER_ON(_DIABLO)) { switch (diablo_key) { case 0: - tap(KC_1); break; + tap_code(KC_1); break; case 1: - tap(KC_2); break; + tap_code(KC_2); break; case 2: - tap(KC_3); break; + tap_code(KC_3); break; case 3: - tap(KC_4); break; + tap_code(KC_4); break; } } } From 4e2817eff18f868b6d62710b67f46808d6efd22d Mon Sep 17 00:00:00 2001 From: Max Rumpf Date: Mon, 15 Oct 2018 22:23:19 +0200 Subject: [PATCH 289/788] Keymap: Some tweaks to Maxr1998's Contra layout (#4144) * Make some keys more accessible, prevent mistypings * Add "Gaming" layer which maps L-Ctrl to space (left-handed jumping compatibility-mode for all games) --- keyboards/contra/keymaps/maxr1998/keymap.c | 70 +++++++++++++++++----- 1 file changed, 55 insertions(+), 15 deletions(-) diff --git a/keyboards/contra/keymaps/maxr1998/keymap.c b/keyboards/contra/keymaps/maxr1998/keymap.c index afdd3d94a..87bf33894 100644 --- a/keyboards/contra/keymaps/maxr1998/keymap.c +++ b/keyboards/contra/keymaps/maxr1998/keymap.c @@ -20,13 +20,17 @@ enum contra_layers { _QWERTZ, _FUNC, - _NUMROW + _NUMROW, + _NUMROW_L3, + _GAMING }; #define KC_I3 LM(_NUMROW, MOD_LALT) #define KC_NR MO(_NUMROW) #define NR_L3 SAFE_RANGE #define FUN MO(_FUNC) +#define G_1 TO(_GAMING) +#define G_0 TG(_GAMING) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { @@ -52,7 +56,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * ,-----------------------------------------------------------------------------------. * | | | | | | | | Ü | | Ö | | Del | * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Lock | Ä | ß | | | | | RGBS | RGBB | RGBS | | | + * | Lock | Ä | ß | | | GAME | | RGBS | RGBB | RGBS | | | * |------+------+------+------+------+------|------+------+------+------+------+------| * | | | | | | | | RGBH-| RGBT | RGBH+| PgUp | | * |------+------+------+------+------+------+------+------+------+------+------+------| @@ -61,14 +65,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_FUNC] = { {_______, _______, _______, _______, _______, _______, _______, DE_UE, _______, DE_OE, _______, KC_DEL }, - {KC_LOCK, DE_AE, DE_SS, _______, _______, _______, _______, RGB_M_P, RGB_M_B, RGB_M_SW,_______, _______}, + {KC_LOCK, DE_AE, DE_SS, _______, _______, G_1, _______, RGB_M_P, RGB_M_B, RGB_M_SW,_______, _______}, {_______, _______, _______, _______, _______, _______, _______, RGB_HUD, RGB_TOG, RGB_HUI, KC_PGUP, _______}, {_______, _______, _______, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, KC_HOME, KC_PGDN, KC_END } }, /* Numrow layer (special characters with Shift and ISO_L3_Shift) * ,-----------------------------------------------------------------------------------. - * | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | ß | + * | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | | * |------+------+------+------+------+-------------+------+------+------+------+------| * | | | | | | | | | | | #' | | * |------+------+------+------+------+------|------+------+------+------+------+------| @@ -78,25 +82,61 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_NUMROW] = { - {_______, DE_1, DE_2, DE_3, DE_4, DE_5, DE_6, DE_7, DE_8, DE_9, DE_0, DE_SS }, + {_______, DE_1, DE_2, DE_3, DE_4, DE_5, DE_6, DE_7, DE_8, DE_9, DE_0, _______}, {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, DE_HASH, _______}, {_______, DE_LESS, _______, _______, _______, _______, _______, _______, _______, _______, DE_MINS, _______}, {_______, _______, _______, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, _______, _______, _______} +}, +[_NUMROW_L3] = { + {_______, DE_1, DE_2, DE_3, DE_4, DE_5, DE_6, DE_7, DE_8, DE_9, DE_0, _______}, + {_______, DE_Q, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, + {_______, DE_LESS, _______, _______, _______, _______, _______, _______, _______, _______, DE_MINS, _______}, + {_______, _______, _______, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, _______, _______, _______} +}, + +/* Gaming + * ,-----------------------------------------------------------------------------------. + * | | | | | | | | | | | | | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | | | | | | | | | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Space| | | | | | | | Reset| | | | + * `-----------------------------------------------------------------------------------' + */ +[_GAMING] = { + {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, + {KC_SPC, _______, _______, _______, _______, _______, _______, _______, G_0, _______, _______, _______} } }; bool process_record_user(uint16_t keycode, keyrecord_t *record) { - if (keycode == NR_L3) { - if (record->event.pressed) { - register_code(DE_ALGR); - layer_on(_NUMROW); - } else { - layer_off(_NUMROW); - unregister_code(DE_ALGR); - } - return false; + switch(keycode) { + case KC_BSPC: + if (record->event.pressed) { + if (get_mods() & (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT))) { + register_code(DE_SS); + return false; + } + } else { + unregister_code(DE_SS); + } + return true; + case NR_L3: + if (record->event.pressed) { + register_code(DE_ALGR); + layer_on(_NUMROW_L3); + } else { + layer_off(_NUMROW_L3); + unregister_code(DE_ALGR); + } + return false; + default: + return true; } - return true; } void led_set_user(uint8_t usb_led) { From 423b419138f78118a0fde0144053284ab64ab88e Mon Sep 17 00:00:00 2001 From: jshuf <44121348+jshuf@users.noreply.github.com> Date: Mon, 15 Oct 2018 16:27:09 -0400 Subject: [PATCH 290/788] Keymap: 60_ansi keymap for DZ60 (#4139) * 60_ansi keymap for DZ60 * 60_ansi keymap for DZ60 Amend author * 60_ansi keymap for DZ60 --- keyboards/dz60/keymaps/60_ansi/keymap.c | 18 ++++++++++++++++++ keyboards/dz60/keymaps/60_ansi/readme.md | 9 +++++++++ 2 files changed, 27 insertions(+) create mode 100644 keyboards/dz60/keymaps/60_ansi/keymap.c create mode 100644 keyboards/dz60/keymaps/60_ansi/readme.md diff --git a/keyboards/dz60/keymaps/60_ansi/keymap.c b/keyboards/dz60/keymaps/60_ansi/keymap.c new file mode 100644 index 000000000..9a9e11ac9 --- /dev/null +++ b/keyboards/dz60/keymaps/60_ansi/keymap.c @@ -0,0 +1,18 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + LAYOUT_60_ansi( + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(1), KC_RCTL), + + LAYOUT_60_ansi( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, + KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, RESET, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, KC_HOME, KC_PGUP, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, BL_DEC, BL_TOGG, BL_INC, BL_STEP, KC_TRNS, KC_DEL, KC_END, KC_PGDN, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) +}; diff --git a/keyboards/dz60/keymaps/60_ansi/readme.md b/keyboards/dz60/keymaps/60_ansi/readme.md new file mode 100644 index 000000000..edbc16c04 --- /dev/null +++ b/keyboards/dz60/keymaps/60_ansi/readme.md @@ -0,0 +1,9 @@ +![60_ansi DZ60 base layer](https://i.imgur.com/MqBLh3D.png) + +![60_ansi DZ60 fn layer](https://i.imgur.com/ml1djHi.png) + +# 60_ansi DZ60 Layout + +This is a basic keymap for the 60_ansi layout of the DZ60. +The default layer is normal ANSI and the Fn layer is used for RGB +and backlighting functions. From 76aa2baf3ea169b976c4cef7013b2020d93a69c3 Mon Sep 17 00:00:00 2001 From: Jim Tittsler Date: Tue, 16 Oct 2018 08:36:20 +0900 Subject: [PATCH 291/788] Fix doc typo --- docs/getting_started_github.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/getting_started_github.md b/docs/getting_started_github.md index 7a3531c75..aeb8738b7 100644 --- a/docs/getting_started_github.md +++ b/docs/getting_started_github.md @@ -8,7 +8,7 @@ Start on the [QMK Github page](https://github.com/qmk/qmk_firmware), and you'll ![Fork on Github](http://i.imgur.com/8Toomz4.jpg) -If you're apart of an organization, you'll need to choose which account to fork it to. In most circumstances, you'll want to fork it to your personal account. Once your fork is completed (sometimes this takes a little while), click the "Clone or Download" button: +If you're a part of an organization, you'll need to choose which account to fork it to. In most circumstances, you'll want to fork it to your personal account. Once your fork is completed (sometimes this takes a little while), click the "Clone or Download" button: ![Download from Github](http://i.imgur.com/N1NYcSz.jpg) From 6cf9402cbc8156dd7c0892822ba949a1a1d8a4ba Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Tue, 16 Oct 2018 11:14:52 -0700 Subject: [PATCH 292/788] Fix LAYOUT define generation (#4148) * Fix LAYOUT define generation Prior to this, only the full keyboard path was defined. Eg `KEYBOARD_planck_rev6`. But the docs mention `KEYBOAD_planck`, which never actually gets defined. This addresses this, and creates a define for each level of the keyboard folder, so that stuff like `KEYBOARD_planck` actually exists. * Clean up changes to make it more readable --- build_keyboard.mk | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/build_keyboard.mk b/build_keyboard.mk index a73741bb3..d225fe821 100644 --- a/build_keyboard.mk +++ b/build_keyboard.mk @@ -110,8 +110,28 @@ ifneq ("$(wildcard $(KEYBOARD_C_1))","") KEYBOARD_SRC += $(KEYBOARD_C_1) endif -OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE) +# Generate KEYBOARD_name_subname for all levels of the keyboard folder +KEYBOARD_FILESAFE_1 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_1))) +KEYBOARD_FILESAFE_2 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_2))) +KEYBOARD_FILESAFE_3 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_3))) +KEYBOARD_FILESAFE_4 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_4))) +KEYBOARD_FILESAFE_5 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_5))) +ifneq ("$(wildcard $(KEYBOARD_PATH_5)/)","") + OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_5) +endif +ifneq ("$(wildcard $(KEYBOARD_PATH_4)/)","") + OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_4) +endif +ifneq ("$(wildcard $(KEYBOARD_PATH_3)/)","") + OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_3) +endif +ifneq ("$(wildcard $(KEYBOARD_PATH_2)/)","") + OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_2) +endif +ifneq ("$(wildcard $(KEYBOARD_PATH_1)/)","") + OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_1) +endif # Setup the define for QMK_KEYBOARD_H. This is used inside of keymaps so # that the same keymap may be used on multiple keyboards. From 1dc1e12fec6b8ce06792ac2e2224b6466b4de2a3 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Tue, 16 Oct 2018 11:35:43 -0700 Subject: [PATCH 293/788] Only include lufa.h if AVR in quantum/api.h --- quantum/api.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/quantum/api.h b/quantum/api.h index efc0ddca1..fc016391b 100644 --- a/quantum/api.h +++ b/quantum/api.h @@ -17,7 +17,9 @@ #ifndef _API_H_ #define _API_H_ +#ifdef __AVR__ #include "lufa.h" +#endif enum MESSAGE_TYPE { MT_GET_DATA = 0x10, // Get data from keyboard @@ -28,7 +30,7 @@ enum MESSAGE_TYPE { MT_SEND_DATA_ACK = 0x31, // returned data/action confirmation (ACK) MT_EXE_ACTION = 0x40, // executing actions on keyboard MT_EXE_ACTION_ACK =0x41, // return confirmation/value (ACK) - MT_TYPE_ERROR = 0x80 // type not recofgnised (ACK) + MT_TYPE_ERROR = 0x80 // type not recognised (ACK) }; enum DATA_TYPE { From 8ce9e3255ee324174c7dbcc553ff089c54fc5265 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=BDan=20Pevec?= Date: Wed, 17 Oct 2018 00:45:05 +0200 Subject: [PATCH 294/788] Fixes on slovenian keymap --- quantum/keymap_extras/keymap_slovenian.h | 28 ++++++++++++------------ 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/quantum/keymap_extras/keymap_slovenian.h b/quantum/keymap_extras/keymap_slovenian.h index 8b197e6c5..364bd90b8 100644 --- a/quantum/keymap_extras/keymap_slovenian.h +++ b/quantum/keymap_extras/keymap_slovenian.h @@ -73,7 +73,7 @@ // shifted characters #define SI_EXLM LSFT(KC_1) // ! -#define SO_DQOT LSFT(KC_2) // " +#define SI_DQOT LSFT(KC_2) // " #define SI_HASH LSFT(KC_3) // # #define SI_DLR LSFT(KC_4) // $ #define SI_PERC LSFT(KC_5) // % @@ -89,18 +89,18 @@ #define SI_UNDS LSFT(SI_MINS) // _ // Alt Gr-ed characters -#define SI_CIRC ALGR(KC_3) // ^ -#define SI_DEG ALGR(KC_5) // ° -#define SI_GRV ALGR(KC_7) // ` -#define SI_ACCU ALGR(KC_9) // ´ -#define SI_LCBR ALGR(KC_B) // { -#define SI_RCBR ALGR(KC_N) // } -#define SI_LBRC ALGR(KC_F) // [ -#define SI_RBRC ALGR(KC_G) // ] -#define SI_BSLS ALGR(KC_Q) // backslash -#define SI_AT ALGR(KC_V) // @ -#define SI_EURO ALGR(KC_E) // € -#define SI_TILD ALGR(KC_1) // ~ -#define SI_PIPE ALGR(KC_W) // | +#define SI_CIRC ALTG(KC_3) // ^ +#define SI_DEG ALTG(KC_5) // ° +#define SI_GRV ALTG(KC_7) // ` +#define SI_ACCU ALTG(KC_9) // ´ +#define SI_LCBR ALTG(KC_B) // { +#define SI_RCBR ALTG(KC_N) // } +#define SI_LBRC ALTG(KC_F) // [ +#define SI_RBRC ALTG(KC_G) // ] +#define SI_BSLS ALTG(KC_Q) // backslash +#define SI_AT ALTG(KC_V) // @ +#define SI_EURO ALTG(KC_E) // € +#define SI_TILD ALTG(KC_1) // ~ +#define SI_PIPE ALTG(KC_W) // | #endif From 1d03af876c122cf16ed78025eb753e1d838edcac Mon Sep 17 00:00:00 2001 From: QMK Bot Date: Tue, 16 Oct 2018 23:11:58 +0000 Subject: [PATCH 295/788] convert to unix line-endings [skip ci] --- quantum/keymap_extras/keymap_slovenian.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quantum/keymap_extras/keymap_slovenian.h b/quantum/keymap_extras/keymap_slovenian.h index 364bd90b8..53d07837e 100644 --- a/quantum/keymap_extras/keymap_slovenian.h +++ b/quantum/keymap_extras/keymap_slovenian.h @@ -1,4 +1,4 @@ -/* Copyright 2018 Žan Pevec +/* Copyright 2018 Žan Pevec * * 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 From 1f13254460db4ad4cb3c4868b69fbb35cca9c764 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=BDan=20Pevec?= Date: Wed, 17 Oct 2018 01:56:39 +0200 Subject: [PATCH 296/788] Keymap: Personal keymap for planck (#4061) * added my keymap * Adde more changes * Moved to pevecyan folder * Added slovenian mapping * Slovenian keymap completed * Suggestions updates * Fixes on slovenian keymap Made some typos in previous iteration --- keyboards/planck/keymaps/pevecyan/config.h | 38 ++++ keyboards/planck/keymaps/pevecyan/keymap.c | 226 ++++++++++++++++++++ keyboards/planck/keymaps/pevecyan/readme.md | 2 + keyboards/planck/keymaps/pevecyan/rules.mk | 1 + 4 files changed, 267 insertions(+) create mode 100644 keyboards/planck/keymaps/pevecyan/config.h create mode 100644 keyboards/planck/keymaps/pevecyan/keymap.c create mode 100644 keyboards/planck/keymaps/pevecyan/readme.md create mode 100644 keyboards/planck/keymaps/pevecyan/rules.mk diff --git a/keyboards/planck/keymaps/pevecyan/config.h b/keyboards/planck/keymaps/pevecyan/config.h new file mode 100644 index 000000000..e8c13caac --- /dev/null +++ b/keyboards/planck/keymaps/pevecyan/config.h @@ -0,0 +1,38 @@ +#pragma once + +#ifdef AUDIO_ENABLE + #define STARTUP_SONG SONG(PLANCK_SOUND) + // #define STARTUP_SONG SONG(NO_SOUND) + + #define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \ + SONG(COLEMAK_SOUND), \ + SONG(DVORAK_SOUND) \ + } +#endif + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ + +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + +// Most tactile encoders have detents every 4 stages +#define ENCODER_RESOLUTION 4 diff --git a/keyboards/planck/keymaps/pevecyan/keymap.c b/keyboards/planck/keymaps/pevecyan/keymap.c new file mode 100644 index 000000000..7bc43a373 --- /dev/null +++ b/keyboards/planck/keymaps/pevecyan/keymap.c @@ -0,0 +1,226 @@ +/* Copyright 2015-2017 Jack Humbert + * + * 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 . + */ + +#include QMK_KEYBOARD_H + +#include "action_layer.h" +#include "muse.h" +#include "keymap_slovenian.h" + +extern keymap_config_t keymap_config; + +enum planck_layers { + _QWERTY, + _LOWER, + _RAISE, + _ADJUST, + _ALTGR, + _CAPS +}; + +enum planck_keycodes { + QWERTY = SAFE_RANGE, +}; + +#define LOWER MO(_LOWER) +#define RAISE MO(_RAISE) +#define CAPS MO(_CAPS) +#define ALTGR MO(_ALTGR) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Z | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | CAPS | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Y | X | C | V | B | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Ctrl | GUI | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = LAYOUT_planck_grid( + KC_TAB, SI_Q, SI_W, SI_E, SI_R, SI_T, SI_Z, SI_U, SI_I, SI_O, SI_P, KC_BSPC, + CAPS, SI_A, SI_S, SI_D, SI_F, SI_G, SI_H, SI_J, SI_K, SI_L, KC_SCLN, KC_ENT, + KC_LSFT, SI_Y, SI_X, SI_C, SI_V, SI_B, SI_N, SI_M, SI_COMM, SI_DOT, SI_MINS, KC_RSFT , + KC_LCTL, KC_LGUI, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, ALTGR, KC_DOWN, KC_UP, KC_F5 +), + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | Home | End | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT_planck_grid( + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_MINS, KC_PPLS , KC_ENT, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_NUHS), S(KC_NUBS), KC_HOME, KC_END, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY +), + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / |Pg Up |Pg Dn | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT_planck_grid( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | Reset| | | | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak|Plover| | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof| | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = LAYOUT_planck_grid( + _______, RESET, DEBUG, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_DEL , + _______, _______, MU_MOD, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, _______, _______, _______, _______, + _______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, TERM_ON, TERM_OFF, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +[_ALTGR] = LAYOUT_planck_grid( + _______, ALTG(KC_Q), ALTG(KC_W), ALTG(KC_E), _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, ALTG(KC_F), ALTG(KC_G), _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, ALTG(KC_V), ALTG(KC_B), ALTG(KC_N), _______, ALTG(KC_COMM), ALTG(KC_DOT), _______, _______ , + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +[_CAPS] = LAYOUT_planck_grid( + KC_ESC , KC_BSPC, KC_UP , KC_DEL , _______, _______, _______, _______, _______, _______, _______, KC_DEL , + _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +) + + +}; + +#ifdef AUDIO_ENABLE + float plover_song[][2] = SONG(PLOVER_SOUND); + float plover_gb_song[][2] = SONG(PLOVER_GOODBYE_SOUND); +#endif + +uint32_t layer_state_set_user(uint32_t state) { + return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST); +} + +bool muse_mode = false; +uint8_t last_muse_note = 0; +uint16_t muse_counter = 0; +uint8_t muse_offset = 70; +uint16_t muse_tempo = 50; + +void encoder_update(bool clockwise) { + if (muse_mode) { + if (IS_LAYER_ON(_RAISE)) { + if (clockwise) { + muse_offset++; + } else { + muse_offset--; + } + } else { + if (clockwise) { + muse_tempo+=1; + } else { + muse_tempo-=1; + } + } + } else { + if (clockwise) { + register_code(KC_PGDN); + unregister_code(KC_PGDN); + } else { + register_code(KC_PGUP); + unregister_code(KC_PGUP); + } + } +} + +void dip_update(uint8_t index, bool active) { + switch (index) { + case 0: + if (active) { + #ifdef AUDIO_ENABLE + PLAY_SONG(plover_song); + #endif + layer_on(_ADJUST); + } else { + #ifdef AUDIO_ENABLE + PLAY_SONG(plover_gb_song); + #endif + layer_off(_ADJUST); + } + break; + case 1: + if (active) { + muse_mode = true; + } else { + muse_mode = false; + #ifdef AUDIO_ENABLE + stop_all_notes(); + #endif + } + } +} + +void matrix_scan_user(void) { + #ifdef AUDIO_ENABLE + if (muse_mode) { + if (muse_counter == 0) { + uint8_t muse_note = muse_offset + SCALE[muse_clock_pulse()]; + if (muse_note != last_muse_note) { + stop_note(compute_freq_for_midi_note(last_muse_note)); + play_note(compute_freq_for_midi_note(muse_note), 0xF); + last_muse_note = muse_note; + } + } + muse_counter = (muse_counter + 1) % muse_tempo; + } + #endif +} + +bool music_mask_user(uint16_t keycode) { + switch (keycode) { + case RAISE: + case LOWER: + return false; + default: + return true; + } +} diff --git a/keyboards/planck/keymaps/pevecyan/readme.md b/keyboards/planck/keymaps/pevecyan/readme.md new file mode 100644 index 000000000..de9680b49 --- /dev/null +++ b/keyboards/planck/keymaps/pevecyan/readme.md @@ -0,0 +1,2 @@ +# The Default Planck Layout + diff --git a/keyboards/planck/keymaps/pevecyan/rules.mk b/keyboards/planck/keymaps/pevecyan/rules.mk new file mode 100644 index 000000000..dcf16bef3 --- /dev/null +++ b/keyboards/planck/keymaps/pevecyan/rules.mk @@ -0,0 +1 @@ +SRC += muse.c From 9de4ace6f274c5bebfcfd8d31fa793f8d9060cb5 Mon Sep 17 00:00:00 2001 From: jshuf <44121348+jshuf@users.noreply.github.com> Date: Tue, 16 Oct 2018 20:13:53 -0400 Subject: [PATCH 297/788] Keyboard: Add tkl_ansi_plus_five layout for Phantom (#4145) * 60_ansi keymap for DZ60 * 60_ansi keymap for DZ60 Amend author * 60_ansi keymap for DZ60 * Merge new phantom layout from dev branch --- keyboards/phantom/info.json | 474 ++++++++++++++++++++++++++++++++++++ keyboards/phantom/phantom.h | 18 ++ 2 files changed, 492 insertions(+) diff --git a/keyboards/phantom/info.json b/keyboards/phantom/info.json index cf7b16180..6a1e4f72f 100644 --- a/keyboards/phantom/info.json +++ b/keyboards/phantom/info.json @@ -459,6 +459,480 @@ } ] }, + "LAYOUT_tkl_ansi_plus_five": { + "key_count": 92, + "layout": [ + { + "label": "Esc", + "x": 0, + "y": 0 + }, + { + "label": "F1", + "x": 2, + "y": 0 + }, + { + "label": "F2", + "x": 3, + "y": 0 + }, + { + "label": "F3", + "x": 4, + "y": 0 + }, + { + "label": "F4", + "x": 5, + "y": 0 + }, + { + "label": "F5", + "x": 6.5, + "y": 0 + }, + { + "label": "F6", + "x": 7.5, + "y": 0 + }, + { + "label": "F7", + "x": 8.5, + "y": 0 + }, + { + "label": "F8", + "x": 9.5, + "y": 0 + }, + { + "label": "F9", + "x": 11, + "y": 0 + }, + { + "label": "F10", + "x": 12, + "y": 0 + }, + { + "label": "F11", + "x": 13, + "y": 0 + }, + { + "label": "F12", + "x": 14, + "y": 0 + }, + { + "label": "PrtSc", + "x": 15.25, + "y": 0 + }, + { + "label": "Scroll Lock", + "x": 16.25, + "y": 0 + }, + { + "label": "Pause", + "x": 17.25, + "y": 0 + }, + { + "label": "~", + "x": 0, + "y": 1.5 + }, + { + "label": "!", + "x": 1, + "y": 1.5 + }, + { + "label": "@", + "x": 2, + "y": 1.5 + }, + { + "label": "#", + "x": 3, + "y": 1.5 + }, + { + "label": "$", + "x": 4, + "y": 1.5 + }, + { + "label": "%", + "x": 5, + "y": 1.5 + }, + { + "label": "^", + "x": 6, + "y": 1.5 + }, + { + "label": "&", + "x": 7, + "y": 1.5 + }, + { + "label": "*", + "x": 8, + "y": 1.5 + }, + { + "label": "(", + "x": 9, + "y": 1.5 + }, + { + "label": ")", + "x": 10, + "y": 1.5 + }, + { + "label": "_", + "x": 11, + "y": 1.5 + }, + { + "label": "+", + "x": 12, + "y": 1.5 + }, + { + "label": "Backspace", + "x": 13, + "y": 1.5, + "w": 2 + }, + { + "label": "Insert", + "x": 15.25, + "y": 1.5 + }, + { + "label": "Home", + "x": 16.25, + "y": 1.5 + }, + { + "label": "PgUp", + "x": 17.25, + "y": 1.5 + }, + { + "label": "Tab", + "x": 0, + "y": 2.5, + "w": 1.5 + }, + { + "label": "Q", + "x": 1.5, + "y": 2.5 + }, + { + "label": "W", + "x": 2.5, + "y": 2.5 + }, + { + "label": "E", + "x": 3.5, + "y": 2.5 + }, + { + "label": "R", + "x": 4.5, + "y": 2.5 + }, + { + "label": "T", + "x": 5.5, + "y": 2.5 + }, + { + "label": "Y", + "x": 6.5, + "y": 2.5 + }, + { + "label": "U", + "x": 7.5, + "y": 2.5 + }, + { + "label": "I", + "x": 8.5, + "y": 2.5 + }, + { + "label": "O", + "x": 9.5, + "y": 2.5 + }, + { + "label": "P", + "x": 10.5, + "y": 2.5 + }, + { + "label": "{", + "x": 11.5, + "y": 2.5 + }, + { + "label": "}", + "x": 12.5, + "y": 2.5 + }, + { + "label": "|", + "x": 13.5, + "y": 2.5, + "w": 1.5 + }, + { + "label": "Delete", + "x": 15.25, + "y": 2.5 + }, + { + "label": "End", + "x": 16.25, + "y": 2.5 + }, + { + "label": "PgDn", + "x": 17.25, + "y": 2.5 + }, + { + "label": "Caps Lock", + "x": 0, + "y": 3.5, + "w": 1.75 + }, + { + "label": "A", + "x": 1.75, + "y": 3.5 + }, + { + "label": "S", + "x": 2.75, + "y": 3.5 + }, + { + "label": "D", + "x": 3.75, + "y": 3.5 + }, + { + "label": "F", + "x": 4.75, + "y": 3.5 + }, + { + "label": "G", + "x": 5.75, + "y": 3.5 + }, + { + "label": "H", + "x": 6.75, + "y": 3.5 + }, + { + "label": "J", + "x": 7.75, + "y": 3.5 + }, + { + "label": "K", + "x": 8.75, + "y": 3.5 + }, + { + "label": "L", + "x": 9.75, + "y": 3.5 + }, + { + "label": ":", + "x": 10.75, + "y": 3.5 + }, + { + "label": "\"", + "x": 11.75, + "y": 3.5 + }, + { + "label": "Enter", + "x": 12.75, + "y": 3.5, + "w": 2.25 + }, + { + "x": 15.25, + "y": 3.5 + }, + { + "x": 16.25, + "y": 3.5 + }, + { + "x": 17.25, + "y": 3.5 + }, + { + "label": "Shift", + "x": 0, + "y": 4.5, + "w": 2.25 + }, + { + "label": "Z", + "x": 2.25, + "y": 4.5 + }, + { + "label": "X", + "x": 3.25, + "y": 4.5 + }, + { + "label": "C", + "x": 4.25, + "y": 4.5 + }, + { + "label": "V", + "x": 5.25, + "y": 4.5 + }, + { + "label": "B", + "x": 6.25, + "y": 4.5 + }, + { + "label": "N", + "x": 7.25, + "y": 4.5 + }, + { + "label": "M", + "x": 8.25, + "y": 4.5 + }, + { + "label": "<", + "x": 9.25, + "y": 4.5 + }, + { + "label": ">", + "x": 10.25, + "y": 4.5 + }, + { + "label": "?", + "x": 11.25, + "y": 4.5 + }, + { + "label": "Shift", + "x": 12.25, + "y": 4.5, + "w": 2.75 + }, + { + "x": 15.25, + "y": 4.5 + }, + { + "label": "\\u2191", + "x": 16.25, + "y": 4.5 + }, + { + "x": 17.25, + "y": 4.5 + }, + { + "label": "Ctrl", + "x": 0, + "y": 5.5, + "w": 1.25 + }, + { + "label": "Win", + "x": 1.25, + "y": 5.5, + "w": 1.25 + }, + { + "label": "Alt", + "x": 2.5, + "y": 5.5, + "w": 1.25 + }, + { + "x": 3.75, + "y": 5.5, + "w": 6.25 + }, + { + "label": "Alt", + "x": 10, + "y": 5.5, + "w": 1.25 + }, + { + "label": "Win", + "x": 11.25, + "y": 5.5, + "w": 1.25 + }, + { + "label": "FN", + "x": 12.5, + "y": 5.5, + "w": 1.25 + }, + { + "label": "Ctrl", + "x": 13.75, + "y": 5.5, + "w": 1.25 + }, + { + "label": "\\u2190", + "x": 15.25, + "y": 5.5 + }, + { + "label": "\\u2193", + "x": 16.25, + "y": 5.5 + }, + { + "label": "\\u2192", + "x": 17.25, + "y": 5.5 + } + ] + }, "LAYOUT_tkl_ansi_wkl": { "key_count": 86, "layout": [ diff --git a/keyboards/phantom/phantom.h b/keyboards/phantom/phantom.h index bed840f19..fa77634d3 100644 --- a/keyboards/phantom/phantom.h +++ b/keyboards/phantom/phantom.h @@ -54,6 +54,24 @@ K50, K51, K52, KC_NO, KC_NO, K57, KC_NO, K5A, K5B, K5C, K5D, K5E, K5F, K5G \ ) +// Keymap for a standard ANSI layout plus the five extra keys +// above the arrow block. +#define LAYOUT_tkl_ansi_plus_five( \ + K00, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, K0G, \ + K01, K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1D, K1E, K1F, K1G, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, K2F, K2G, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, K3E, K3F, K3G, \ + K40, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4D, K4E, K4F, K4G, \ + K50, K51, K52, K57, K5A, K5B, K5C, K5D, K5E, K5F, K5G \ +) LAYOUT_7bit( \ + K00, KC_NO, K02, K03, K04, K05, KC_NO, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, K0G, \ + K01, K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, KC_NO, K1D, K1E, K1F, K1G, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, K2F, K2G, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, KC_NO, K3D, K3E, K3F, K3G, \ + K40, KC_NO, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, KC_NO, K4D, K4E, K4F, K4G, \ + K50, K51, K52, KC_NO, KC_NO, K57, KC_NO, K5A, K5B, K5C, K5D, K5E, K5F, K5G \ +) + #define LAYOUT_tkl_ansi_wkl( \ K00, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, K0G, \ K01, K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1D, K1E, K1F, K1G, \ From 397d404ce0b2a0730e493897f72a86f7a40f4207 Mon Sep 17 00:00:00 2001 From: Bramver Date: Wed, 17 Oct 2018 22:42:26 +0200 Subject: [PATCH 298/788] Keymap: Added personal Quefrency layout (#4156) --- keyboards/quefrency/keymaps/bramver/README.md | 61 ++++++++ keyboards/quefrency/keymaps/bramver/config.h | 31 ++++ keyboards/quefrency/keymaps/bramver/keymap.c | 134 ++++++++++++++++++ keyboards/quefrency/keymaps/bramver/rules.mk | 6 + 4 files changed, 232 insertions(+) create mode 100644 keyboards/quefrency/keymaps/bramver/README.md create mode 100644 keyboards/quefrency/keymaps/bramver/config.h create mode 100644 keyboards/quefrency/keymaps/bramver/keymap.c create mode 100644 keyboards/quefrency/keymaps/bramver/rules.mk diff --git a/keyboards/quefrency/keymaps/bramver/README.md b/keyboards/quefrency/keymaps/bramver/README.md new file mode 100644 index 000000000..76310ed73 --- /dev/null +++ b/keyboards/quefrency/keymaps/bramver/README.md @@ -0,0 +1,61 @@ +# Quefrency Layout - initial 60% + +Standard qwerty layout. +Limited emoji support and proper mouse settings. + +Mostly based off of my other XD75 and Nyquist layouts. + +## Keymap + +``` +/* BASE + * + * KC_GESC , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , /**/ KC_7 , KC_8 , KC_9 , KC_0 , KC_MINS , KC_EQL , KC_DEL , KC_BSPC , \ + * KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T , /**/ KC_Y , KC_U , KC_I , KC_O , KC_P , KC_LBRC , KC_RBRC , KC_BSLS , \ + * MO_EMOJ , KC_A , KC_S , KC_D , KC_F , KC_G , /**/ KC_H , KC_J , KC_K , KC_L , KC_SCLN , KC_QUOT , KC_ENT , \ + * KC_LSFT , KC_Z , KC_X , KC_C , KC_V , KC_B , /**/ KC_N , KC_M , KC_COMM , KC_DOT , KC_SLSH , KC_RSFT , KC_UP , \ + * KC_LCTL , KC_LALT , KC_LGUI , MO_SYMB , SP_LMS , /**/ SP_RMS , KC_BSPC , KC_RGUI , KC_LEFT , KC_DOWN , KC_UP , KC_RGHT + * + */ + +/* LMSE + * + * _______ , _______ , _______ , _______ , _______ , _______ , _______ , /**/ _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , \ + * _______ , KC_WH_L , KC_BTN1 , KC_MS_U , KC_BTN2 , KC_WH_U , /**/ _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , \ + * _______ , KC_WH_R , KC_MS_L , KC_MS_D , KC_MS_R , KC_WH_D , /**/ _______ , _______ , _______ , _______ , _______ , _______ , _______ ,\ + * _______ , _______ , KC_PGDN , KC_PGUP , KC_END , KC_HOME , /**/ _______ , _______ , _______ , _______ , _______ , _______ , _______ , \ + * _______ , _______ , _______ , _______ , _______ , /**/ _______ , _______ , _______ , _______ , _______ , _______ , _______ + * + */ + +/* RMSE + * + * _______ , _______ , _______ , _______ , _______ , _______ , _______ , /**/ _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , \ + * _______ , _______ , _______ , _______ , _______ , _______ , /**/ KC_WH_U , KC_BTN1 , KC_MS_U , KC_BTN2 , KC_WH_L , _______ , _______ , _______ , \ + * _______ , _______ , _______ , _______ , _______ , _______ , /**/ KC_WH_D , KC_MS_L , KC_MS_D , KC_MS_R , KC_WH_R , _______ , _______ ,\ + * _______ , _______ , _______ , _______ , _______ , _______ , /**/ KC_HOME , KC_END , KC_PGUP , KC_PGDN , _______ , _______ , _______ , \ + * _______ , _______ , _______ , _______ , _______ , /**/ _______ , _______ , _______ , _______ , _______ , _______ , _______ + * + */ + +/* SYMB + * + * KC_GESC , KC_F1 , KC_F12 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , /**/ KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , KC_F12 , KC_DEL , KC_BSPC , \ + * _______ , _______ , _______ , _______ , _______ , _______ , /**/ _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , \ + * _______ , KC_EXLM , KC_AT , KC_HASH , KC_DLR , KC_PERC , /**/ KC_CIRC , KC_AMPR , KC_ASTR , KC_LPRN , KC_RPRN , _______ , _______ ,\ + * _______ , _______ , _______ , _______ , _______ , _______ , /**/ _______ , _______ , _______ , _______ , _______ , _______ , _______ , \ + * _______ , _______ , _______ , _______ , _______ , /**/ _______ , _______ , _______ , _______ , _______ , _______ , _______ + * + */ + +/* EMOJ + * + * _______ , _______ , _______ , _______ , _______ , _______ , _______ , /**/ _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , \ + * _______ , X(CLAP) , X(CUM) , X(BNIS) , X(BUTT) , X(CAR) , /**/ X(FIRE) , X(REDB) , X(MONY) , X(HNDR) , X(SOS) , _______ , _______ , _______ , \ + * _______ , X(CELE) , X(PRAY) , X(NAIL) , X(OK) , X(THNK) , /**/ X(UNAM) , X(HEYE) , X(COOL) , X(EYES) , X(SMIR) , _______ , _______ ,\ + * _______ , X(TRIU) , X(SCRM) , X(VOMI) , X(DTIV) , X(EXPL) , /**/ X(HAIR) , X(DANC) , X(STRN) , X(LEFT) , X(RGHT) , _______ , _______ , \ + * _______ , _______ , _______ , _______ , _______ , /**/ _______ , _______ , _______ , _______ , _______ , _______ , _______ + * + */ + +``` \ No newline at end of file diff --git a/keyboards/quefrency/keymaps/bramver/config.h b/keyboards/quefrency/keymaps/bramver/config.h new file mode 100644 index 000000000..c908386e2 --- /dev/null +++ b/keyboards/quefrency/keymaps/bramver/config.h @@ -0,0 +1,31 @@ +/* Copyright 2018 darm + * + * 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 . + */ + +#pragma once + +#define USE_SERIAL +#define MASTER_LEFT + +#define TAPPING_TERM 200 +#define TAPPING_TOGGLE 2 + +#define MOUSEKEY_DELAY 0 +#define MOUSEKEY_INTERVAL 16 +#define MOUSEKEY_MAX_SPEED 7 +#define MOUSEKEY_TIME_TO_MAX 60 +#define MOUSEKEY_WHEEL_MAX_SPEED 8 +#define MOUSEKEY_WHEEL_TIME_TO_MAX 40 +#define MOUSEKEY_WHEEL_DELAY 0 diff --git a/keyboards/quefrency/keymaps/bramver/keymap.c b/keyboards/quefrency/keymaps/bramver/keymap.c new file mode 100644 index 000000000..527f5de04 --- /dev/null +++ b/keyboards/quefrency/keymaps/bramver/keymap.c @@ -0,0 +1,134 @@ +#include QMK_KEYBOARD_H + +enum custom_keycodes { + QWERTY = SAFE_RANGE, +}; + +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +#define _BASE 0 +#define _LMSE 1 +#define _RMSE 2 +#define _SYMB 3 +#define _EMOJ 4 + +#define SP_LMS LT(_LMSE, KC_SPC) +#define SP_RMS LT(_RMSE, KC_SPC) +#define MO_SYMB TT(_SYMB) +#define MO_EMOJ TT(_EMOJ) + + +enum emoji_map { + UNAM, // unamused 😒 + HEYE, // smiling face with heart shaped eyes 😍 + OK, // ok hand sign 👌 + SMIR, // smirk 😏 + PRAY, // pray 🙏 + CELE, // celebration 🙌 + COOL, // smile with sunglasses 😎 + EYES, // eyes + THNK, // BIG THONK + NAIL, // Nailcare + SOS, // Vuile sos + REDB, // Red B + HNDR, // 100 + MONY, + FIRE, + CAR, + BUTT, + BNIS, + CUM, + CLAP, + TRIU, // Fart from nose + SCRM, + VOMI, + DTIV, // Detective + EXPL, // Brainsplosion + HAIR, // Haircut + DANC, // Salsa dancer + STRN, // Stronk + LEFT, // Point Left + RGHT, // Point Right +}; + +const uint32_t PROGMEM unicode_map[] = { + [UNAM] = 0x1F612, + [HEYE] = 0x1f60d, + [OK] = 0x1F44C, + [SMIR] = 0x1F60F, + [PRAY] = 0x1F64F, + [CELE] = 0x1F64C, + [COOL] = 0x1F60E, + [EYES] = 0x1F440, + [THNK] = 0x1F914, + [NAIL] = 0x1F485, + [SOS] = 0x1F198, + [REDB] = 0x1F171, + [HNDR] = 0x1F4AF, + [MONY] = 0x1F480, + [FIRE] = 0x1F525, + [CAR] = 0x1F697, + [BUTT] = 0x1F351, + [BNIS] = 0x1F346, + [CUM] = 0x1F4A6, + [CLAP] = 0x1F44F, + [TRIU] = 0x1F624, + [SCRM] = 0x1F631, + [VOMI] = 0x1F92E, + [DTIV] = 0x1F575, + [EXPL] = 0x1F92F, + [HAIR] = 0x2640, + [DANC] = 0x1F483, + [STRN] = 0x1F4AA, + [LEFT] = 0x1F448, + [RGHT] = 0x1F449, +}; + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE] = LAYOUT( + KC_GESC , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_MINS , KC_EQL , KC_DEL , KC_BSPC , \ + KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , KC_LBRC , KC_RBRC , KC_BSLS , \ + MO_EMOJ , KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_SCLN , KC_QUOT , KC_ENT , \ + KC_LSFT , KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM , KC_DOT , KC_SLSH , KC_RSFT , KC_UP , \ + KC_LCTL , KC_LALT , KC_LGUI , MO_SYMB , SP_LMS , SP_RMS , KC_BSPC , KC_RGUI , KC_LEFT , KC_DOWN , KC_UP , KC_RGHT + ), + + [_LMSE] = LAYOUT( + _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , \ + _______ , KC_WH_L , KC_BTN1 , KC_MS_U , KC_BTN2 , KC_WH_U , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , \ + _______ , KC_WH_R , KC_MS_L , KC_MS_D , KC_MS_R , KC_WH_D , _______ , _______ , _______ , _______ , _______ , _______ , _______ ,\ + _______ , _______ , KC_PGDN , KC_PGUP , KC_END , KC_HOME , _______ , _______ , _______ , _______ , _______ , _______ , _______ , \ + _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ + ), + + [_RMSE] = LAYOUT( + _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , \ + _______ , _______ , _______ , _______ , _______ , _______ , KC_WH_U , KC_BTN1 , KC_MS_U , KC_BTN2 , KC_WH_L , _______ , _______ , _______ , \ + _______ , _______ , _______ , _______ , _______ , _______ , KC_WH_D , KC_MS_L , KC_MS_D , KC_MS_R , KC_WH_R , _______ , _______ ,\ + _______ , _______ , _______ , _______ , _______ , _______ , KC_HOME , KC_END , KC_PGUP , KC_PGDN , _______ , _______ , _______ , \ + _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ + ), + + [_SYMB] = LAYOUT( + KC_GESC , KC_F1 , KC_F12 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , KC_F12 , KC_DEL , KC_BSPC , \ + _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , \ + _______ , KC_EXLM , KC_AT , KC_HASH , KC_DLR , KC_PERC , KC_CIRC , KC_AMPR , KC_ASTR , KC_LPRN , KC_RPRN , _______ , _______ ,\ + _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , \ + _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ + ), + + [_EMOJ] = LAYOUT( + _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , \ + _______ , X(CLAP) , X(CUM) , X(BNIS) , X(BUTT) , X(CAR) , X(FIRE) , X(REDB) , X(MONY) , X(HNDR) , X(SOS) , _______ , _______ , _______ , \ + _______ , X(CELE) , X(PRAY) , X(NAIL) , X(OK) , X(THNK) , X(UNAM) , X(HEYE) , X(COOL) , X(EYES) , X(SMIR) , _______ , _______ ,\ + _______ , X(TRIU) , X(SCRM) , X(VOMI) , X(DTIV) , X(EXPL) , X(HAIR) , X(DANC) , X(STRN) , X(LEFT) , X(RGHT) , _______ , _______ , \ + _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ + ), + +}; + +void matrix_init_user(void) { + set_unicode_input_mode(UC_LNX); +}; diff --git a/keyboards/quefrency/keymaps/bramver/rules.mk b/keyboards/quefrency/keymaps/bramver/rules.mk new file mode 100644 index 000000000..d211d7b4c --- /dev/null +++ b/keyboards/quefrency/keymaps/bramver/rules.mk @@ -0,0 +1,6 @@ +# Build options +MOUSEKEY_ENABLE = yes # Emulates mouse key using keypresses +EXTRAKEY_ENABLE = yes # Use system and audio control key codes +TAP_DANCE_ENABLE = no # Use multi-tap features +UNICODEMAP_ENABLE = yes # Emojify me pls +NKRO_ENABLE = yes From d08f9cb6e4d5f14409d49ea5df93cb91777357da Mon Sep 17 00:00:00 2001 From: Christoffer Holmberg Date: Wed, 17 Oct 2018 21:54:37 +0300 Subject: [PATCH 299/788] Fix grammar, typos, and the link to HID specification --- docs/how_keyboards_work.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/how_keyboards_work.md b/docs/how_keyboards_work.md index fac2b5a48..cc54e566a 100644 --- a/docs/how_keyboards_work.md +++ b/docs/how_keyboards_work.md @@ -27,17 +27,17 @@ This usually happens with a periodic scan of key presses. This speed often is li ## 2. What the Firmware Sends -The [HID specification](http://www.usb.org/developers/hidpage/Hut1_12v2.pdf) tells what a keyboard can actually send through USB to have a chance to be properly recognised. This includes a pre-defined list of scancodes which are simple numbers from `0x00` to `0xE7`. The firmware assigns a scancode to each key of the keyboard. +The [HID specification](https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf) tells what a keyboard can actually send through USB to have a chance to be properly recognised. This includes a pre-defined list of scancodes which are simple numbers from `0x00` to `0xE7`. The firmware assigns a scancode to each key of the keyboard. -The firmware does not send actually letters or characters, but only scancodes. -Thus, by modifying the firmware, you only can modify what scancode is sent over +The firmware does not send actual letters or characters, but only scancodes. +Thus, by modifying the firmware, you can only modify what scancode is sent over USB for a given key. ## 3. What the Operating System Does Once the keycode reaches the operating system, a piece of software has to have it match an actual character thanks to a keyboard layout. For example, if your -layout is set to QWERTY, a sample of the matching table is as follow: +layout is set to QWERTY, a sample of the matching table is as follows: | keycode | character | |---------|-----------| @@ -55,11 +55,11 @@ As the layout is generally fixed (unless you create your own), the firmware can ## List of Characters You Can Send -Putting aside shortcuts, having a limited set of keycodes mapped to a limited layout means that **the list of characters you can assign to a given key only is the ones present in the layout**. +Putting aside shortcuts, having a limited set of keycodes mapped to a limited layout means that **the list of characters you can assign to a given key are only the ones present in the layout**. -For example, this means that if you have a QWERTY US layout, and you want to assign 1 key to produce `€` (euro currency symbol), you are unable to do so, because the QWERTY US layout does not have such mapping. You could fix that by using a QWERTY UK layout, or a QWERTY US International. +For example, this means that if you have a QWERTY US layout, and you want to assign one key to produce `€` (euro currency symbol), you are unable to do so, because the QWERTY US layout does not have such mapping. You could fix that by using a QWERTY UK layout, or a QWERTY US International. -You may wonder why a keyboard layout containing all of Unicode is not devised then? The limited number of keycode available through USB simply disallow such a thing. +You may wonder why a keyboard layout containing all of Unicode is not devised then? The limited number of keycodes available through USB simply disallows such a thing. ## How to (Maybe) Enter Unicode Characters From dad79cafcd9b3401b68fb29aaa311e999c4c4e6e Mon Sep 17 00:00:00 2001 From: Christoffer Holmberg Date: Wed, 17 Oct 2018 23:27:16 +0300 Subject: [PATCH 300/788] Fix more broken links to the HID spec --- docs/keycodes_basic.md | 2 +- docs/reference_glossary.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/keycodes_basic.md b/docs/keycodes_basic.md index 8445b05ef..82e94aa5e 100644 --- a/docs/keycodes_basic.md +++ b/docs/keycodes_basic.md @@ -1,6 +1,6 @@ # Basic Keycodes -The basic set of keycodes are based on the [HID Keyboard/Keypad Usage Page (0x07)](http://www.usb.org/developers/hidpage/Hut1_12v2.pdf) with the exception of `KC_NO`, `KC_TRNS` and keycodes in the `0xA5-DF` range. See below for more details. +The basic set of keycodes are based on the [HID Keyboard/Keypad Usage Page (0x07)](https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf) with the exception of `KC_NO`, `KC_TRNS` and keycodes in the `0xA5-DF` range. See below for more details. ## Letters and Numbers diff --git a/docs/reference_glossary.md b/docs/reference_glossary.md index 29d07f26d..422abb2ec 100644 --- a/docs/reference_glossary.md +++ b/docs/reference_glossary.md @@ -128,7 +128,7 @@ The standard Deutsche (German) keyboard layout. Named for the first 6 letters on The term for pressing a key while a key is already held down. Variants include 2KRO, 6KRO, and NKRO. ## Scancode -A 1 byte number that is sent as part of a HID report over USB that represents a single key. These numbers are documented in the [HID Usage Tables](http://www.usb.org/developers/hidpage/Hut1_12v2.pdf) published by the [USB-IF](http://www.usb.org/). +A 1 byte number that is sent as part of a HID report over USB that represents a single key. These numbers are documented in the [HID Usage Tables](https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf) published by the [USB-IF](http://www.usb.org/). ## Space Cadet Shift A special set of shift keys which allow you to type various types of braces by tapping the left or right shift one or more times. From 4a7baaaf50bc9cce3886ff7e1b6455e028d92ab9 Mon Sep 17 00:00:00 2001 From: TheOneTrueTrench <38593283+TheOneTrueTrench@users.noreply.github.com> Date: Thu, 18 Oct 2018 00:38:24 -0400 Subject: [PATCH 301/788] Keymap: Adding new functionality to personal keymap, smart macros (#4159) * Added base keymap * Added initial layers and mirrored most of Pok3r behavior. * Some stuff for Space Captain * Added new Marianas keymap for DZ60 * Included suggestions to remove unnecessary line regarding MODS_CTRL_MASK, and added names for layers. Added enum to define names for layers, and removed unused #DEFINE * Added DVORAK and COLEMAK * Caps + enter + space for flashing mode. * Added RGB status * added flash script * Changed lighting modes to make layers more apparent * fixed issue with not being able to exit gaming mode. * Added abbreviation constructor * Changed lighting modes to make layers more apparent * fixed issue with not being able to exit gaming mode. * Added abbreviation constructor * Fixed bug with SQL Table Macro generator. * restructured file. No Logical changes. * literals only for smart macros * removed extraneous pointer declaration. * Smart Macros * Added Makefile and header file * extended smart macros to be able to cover the whole alphas. * removed non-relavent keymaps. * didn't mean to include this guy. --- keyboards/dz60/keymaps/marianas/keymap.c | 592 ++++++++++++++++++++--- keyboards/dz60/keymaps/marianas/keymap.h | 103 ++++ keyboards/dz60/keymaps/marianas/rules.mk | 17 + 3 files changed, 657 insertions(+), 55 deletions(-) create mode 100644 keyboards/dz60/keymaps/marianas/keymap.h create mode 100644 keyboards/dz60/keymaps/marianas/rules.mk diff --git a/keyboards/dz60/keymaps/marianas/keymap.c b/keyboards/dz60/keymaps/marianas/keymap.c index dfc83fb50..e40bc6897 100644 --- a/keyboards/dz60/keymaps/marianas/keymap.c +++ b/keyboards/dz60/keymaps/marianas/keymap.c @@ -1,71 +1,553 @@ #include QMK_KEYBOARD_H +#include "keymap.h" enum marianas_layers { - BASE, + QWERTY, +/* + COLEMAK, + DVORAK, +*/ NAV_CLUSTER, - RGB, - MOUSE, GAMING, - FN_LAYER, - LAYER_SEL + SQLMACROS, + SQLNAMES, + FN_LAYER +}; + +enum sql_macros { + S_LFTJN = SAFE_RANGE, // L + S_INRJN, // I + S_SLCT, // S + S_FROM, // F + S_DSNCT, // D + S_ORDER, // O + S_WHERE, // W + S_ALTER, // Esc + S_ASTRK, // * + + TD_A, + TD_B, + TD_C, // Corp, Corporation, Company + TD_D, // Distribution, Dist, Distributor + TD_E, + TD_F, + TD_G, // GlobalLookup + TD_H, + TD_I, // Instance, Item + TD_J, + TD_K, + TD_L, + TD_M, + TD_N, // NadRate + TD_O, + TD_P, // Product, Person, + TD_Q, // Darden + TD_R, + TD_S, // Supplier, Step + TD_T, // Task, Type + TD_U, + TD_V, + TD_W, // Workflow, + TD_X, + TD_Y, + TD_Z, + TD_BSPC, + TD_ENT, + TD_ESC +}; + +uint16_t *macroTaps = 0; + +char *tableNameList = 0; + +uint8_t *charCount = 0; +uint8_t countPointer = 0; + +bool shifted = false; + +bool sendAbbr = false; + + +void initStringData(void) +{ + if (macroTaps == 0) + { + macroTaps = malloc(macroTapsLen*sizeof(uint16_t)); + for(int i = 0; i < macroTapsLen; i++) + { + macroTaps[i] = 0; + } + } + if (tableNameList == 0) + { + tableNameList = malloc(tableNameListLen*sizeof(char)); + for(int i = 0; i < tableNameListLen; i++) + { + tableNameList[i] = 0; + } + } + if (charCount == 0) + { + charCount = malloc(charCountLen*sizeof(uint8_t)); + for (int i = 0; i < charCountLen; i++) + { + charCount[i] = 0; + } + } +} + + +uint32_t layer_state_set_user(uint32_t state) +{ + switch (biton32(state)) + { + case QWERTY: + rgblight_mode(9); + break; + case NAV_CLUSTER: + rgblight_mode(29); + break; + case GAMING: + rgblight_mode(26); + break; + case SQLMACROS: + rgblight_mode(1); + rgblight_setrgb(0x00, 0xFF, 0x80); + break; + case SQLNAMES: + rgblight_mode(1); + rgblight_setrgb(0x80, 0xFF, 0x00); + break; + case FN_LAYER: + rgblight_mode(1); + rgblight_setrgb(0x00, 0x80, 0xFF); + break; + } + return state; +} + +bool containsCode(uint16_t kc) +{ + for (int i = 0; i < macroTapsLen && macroTaps[i] > 0; i++) + { + if (macroTaps[i] == kc) return true; + } + return false; +} + +bool lastCodeIs(uint16_t kc) +{ + for (int i = 0; i < macroTapsLen-1 && macroTaps[i] > 0; i++) + { + if (macroTaps[i] == kc && macroTaps[i+1] == 0) return true; + } + return false; +} + +bool last2CodeAre(uint16_t kc) +{ + for (int i = 0; i < macroTapsLen-2 && macroTaps[i] > 0; i++) + { + if (macroTaps[i] == kc && macroTaps[i+1] == kc && macroTaps[i+2] == 0) return true; + } + return false; +} + +bool last2CodesAre(uint16_t kc, uint16_t kc2) +{ + for (int i = 0; i < macroTapsLen-2 && macroTaps[i] > 0; i++) + { + if (macroTaps[i] == kc && macroTaps[i+1] == kc2 && macroTaps[i+2] == 0) return true; + } + return false; +} + +void addKeyCode(uint16_t kc) +{ + int i = 0; + while (i < macroTapsLen-2 && macroTaps[i] > 0) i++; + if (macroTaps[i] == 0) + { + macroTaps[i] = kc; + macroTaps[i+1] = 0; + } +} + +void eraseKeyCodes(void) +{ + int i = 0; + while (i < macroTapsLen && macroTaps[i] > 0) macroTaps[i++] = 0; +} + +void eraseCharCounts(void) +{ + int i = 0; + while (i < charCountLen) + { + charCount[i] = 0; + } +} + +void printTableAbbreviation(void) +{ + initStringData(); + if (tableNameList[0] == 0) + { + return; + } + send_char(0x20); + int i = 0; + for (i = 0; i < tableNameListLen && tableNameList[i] > 0; i++) + { + if (tableNameList[i] >= 65 && tableNameList[i] <= 90) + { + send_char(tableNameList[i]+32); + } + else + { + send_char(tableNameList[i]); + } + } + send_char(0x20); +} + +void eraseTableAbbreviation(void) +{ + initStringData(); + for (int i = 0; i < tableNameListLen && tableNameList[i] > 0; i++) + { + tableNameList[i] = '\0'; + } +} + +void printString(char* str) +{ + + if (str[0] != '\0') + { + int i = 0; + while (true) + { + if (str[i] == 0) + { + break; + } + send_char(str[i++]); + charCount[countPointer]++; + } + } +} + +void printStringAndQueueChar(char* str) +{ + initStringData(); + if (charCount[countPointer] != 0) + { + countPointer++; + } + sendAbbr = true; + if (str[0] != '\0') + { + printString(str); + + for (int i = 0; i < tableNameListLen-1; i++) + { + if (tableNameList[i] == '\0') + { + tableNameList[i] = str[0]; + tableNameList[i+1] = '\0'; + break; + } + else if (i == tableNameListLen-2) + { + printTableAbbreviation(); + break; + } + } + //for (i = 0; i < tableNameListLen && tableNameList[i] > 0; i++) + //{ + // send_char(tableNameList[i]); + //} + //send_string_P("Darden"); + //send_string_P(&myarray); + //send_string_P(str); + } +} + +void ReplaceString(char *orig, char *repl) +{ + int i = 0; + while((orig[i] != 0x0 && repl[i] != 0x0) && orig[i] == repl[i]) + i++; + + if(orig[i] != 0x0) + { + int o = i; + while (orig[o++] != 0x0) { + charCount[countPointer]--; + register_code(KC_BSPC); + unregister_code(KC_BSPC); + } + } + printString(repl+i); +} + +void deletePrev(void) +{ + for (int i = 0; i < charCount[countPointer]; i++) + { + register_code(KC_BSPC); + unregister_code(KC_BSPC); + } + charCount[countPointer] = 0; + countPointer--; + int i = 1; + for (;i < tableNameListLen-1; i++) + { + if (tableNameList[i] == 0x0) + { + break; + } + } + tableNameList[i-1] = 0x0; +} + +void processSmartMacroTap(uint16_t kc) +{ + initStringData(); + switch(kc) + { + case TD_C: + if (containsCode(TD_D)) + { + printString("ribution"); + printStringAndQueueChar("Center"); + } + else if (last2CodeAre(TD_C)) + { + ReplaceString("Corporation", "Contact"); + } + else if(lastCodeIs(TD_C)) + { + printString("oration"); + } + else + { + printStringAndQueueChar("Corp"); + } + break; + case TD_D: + if (last2CodeAre(TD_D)) + { + ReplaceString("Distribution", "Distributor"); + } + else if(lastCodeIs(TD_D)) + { + printString("ribution"); + } + else + { + printStringAndQueueChar("Dist"); + } + break; + case TD_G: + printStringAndQueueChar("Global"); + printStringAndQueueChar("Lookup"); + break; + case TD_I: + if (containsCode(TD_W)) + printStringAndQueueChar("Instance"); + else + printStringAndQueueChar("Item"); + break; + case TD_N: + printStringAndQueueChar("NadRate"); + break; + case TD_P: + if (last2CodesAre(TD_D, TD_C)) + { + ReplaceString("DistributionCenter", "DistCenter"); + printStringAndQueueChar("Pricing"); + } + else if (last2CodeAre(TD_P)) + { + } + else if(lastCodeIs(TD_P)) + { + ReplaceString("Product", "Person"); + } + else + { + printStringAndQueueChar("Product"); + } + break; + case TD_Q: + printStringAndQueueChar("Darden"); + break; + case TD_S: + if (containsCode(TD_W)) + if (containsCode(TD_S) || containsCode(TD_D)) + printStringAndQueueChar("Step"); + else + printStringAndQueueChar("Session"); + else + printStringAndQueueChar("Supplier"); + break; + case TD_T: + if (containsCode(TD_W)) + printStringAndQueueChar("Task"); + else + printStringAndQueueChar("Type"); + break; + case TD_W: + printStringAndQueueChar("Workflow"); + break; + } + addKeyCode(kc); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) +{ + if (record->event.pressed) + { + switch (keycode) + { + case KC_LSPO: + case KC_RSPC: + shifted = true; + return true; + + case S_LFTJN: SEND_STRING("LEFT JOIN"); return false; + case S_INRJN: SEND_STRING("INNER JOIN "); return false; + case S_SLCT: SEND_STRING("SELECT "); return false; + case S_FROM: SEND_STRING("FROM "); return false; + case S_DSNCT: SEND_STRING("DISTINCT "); return false; + case S_ORDER: SEND_STRING("ORDER "); return false; + case S_WHERE: SEND_STRING("WHERE "); return false; + case S_ALTER: SEND_STRING("ALTER SESSION SET CURRENT_SCHEMA = "); return false; + case S_ASTRK: SEND_STRING("* "); return false; + + case KC_BSLS: + initStringData(); + layer_on(SQLNAMES); + return false; + + case TD_BSPC: + if (!shifted){ + deletePrev(); + } + else { + register_code(KC_BSPC); + unregister_code(KC_BSPC); + } + return false; + + case TD_A: + case TD_B: + case TD_C: + case TD_D: + case TD_E: + case TD_F: + case TD_G: + case TD_H: + case TD_I: + case TD_J: + case TD_K: + case TD_L: + case TD_M: + case TD_N: + case TD_O: + case TD_P: + case TD_Q: + case TD_R: + case TD_S: + case TD_T: + case TD_U: + case TD_V: + case TD_W: + case TD_X: + case TD_Y: + case TD_Z: + processSmartMacroTap(keycode); + return false; + + case TD_ENT: + printTableAbbreviation(); + case TD_ESC: + eraseKeyCodes(); + eraseTableAbbreviation(); + layer_off(SQLNAMES); + return true; + } + } + else + { + switch (keycode) + { + + case KC_BSLS: + if (macroTaps[0] == 0) + { + SEND_STRING("\\"); + layer_off(SQLNAMES); + } + return true; + case KC_LSPO: + case KC_RSPC: + shifted = false; + return true; + } + } + return true; }; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [BASE]= - LAYOUT( - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_NO, KC_BSPC, - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, - MO(FN_LAYER), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, - KC_LSPO, KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, KC_NO, - KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_LGUI, KC_NO, KC_APP, KC_RCTL), + [QWERTY]= + LAYOUT_60_ansi( + ESCAP, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, MNUS, EQUL, BACKSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, LBRC, RBRC, BSLASH, + MO_FNLR, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, COLN, QUOT, ENTER_OR_SQL, + LEFTSHFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, CMMA, PRRD, SLSH, RIGHT_SHIFT__PAREN, + CTLL, WINL, ALTL, SPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACE, ALTR, WINR, APPR, CTLR), [NAV_CLUSTER]= - LAYOUT( - KC_TRNS, KC_PSCREEN, KC_SCROLLLOCK, KC_PAUSE, KC_INSERT, KC_HOME, KC_PGUP, KC_NUMLOCK, KC_KP_SLASH, KC_KP_ASTERISK, KC_KP_MINUS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DELETE, KC_END, KC_PGDOWN, KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_PLUS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_UP, KC_KP_4, KC_KP_5, KC_KP_6, KC_KP_PLUS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_ENTER, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_KP_0, KC_KP_0, KC_KP_0, KC_KP_DOT, KC_KP_ENTER, KC_TRNS, KC_TRNS, KC_TRNS), - - [RGB]= - LAYOUT( - KC_TRNS, RGB_TOG, RGB_MOD, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, RGB_M_SN, RGB_M_K, RGB_M_X, RGB_M_G, RGB_SPD, RGB_SPI, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_HUI, RGB_HUD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_SAI, RGB_SAD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, RGB_VAI, RGB_VAD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), - - [MOUSE]= - LAYOUT( - KC_TRNS, KC_ACL0, KC_ACL1, KC_ACL2, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_WH_U, KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN3, KC_BTN1, KC_MS_U, KC_BTN2, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_WH_L, KC_WH_D, KC_WH_R, KC_TRNS, KC_TRNS, KC_BTN4, KC_MS_L, KC_MS_D, KC_MS_R, KC_BTN5, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + LAYOUT_60_ansi( + _____, PSCR, SCRL, PAUS, NSRT, HOME, PGUP, NMLK, KSSH, STAR, KMIN, ____, ____, ______, + ______, ____, ____, ____, DELT, END_, PGDN, KP_7, KP_8, KP_9, PLUS, ____, ____, _____, + _______, ____, ____, ____, ____, UPUP, UPUP, KP_4, KP_5, KP_6, PLUS, ____, ___________, + ________, ____, ____, ____, LEFT, D_WN, RGHT, KP_1, KP_2, KP_3, KNTR, _________________, + ____, ____, ____, /*-----------------*/KC_KP_0/*-----------------*/, KDOT, KNTR, ____, ____), [GAMING]= - LAYOUT( - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_NO, KC_BSPC, - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, - KC_TRNS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, - KC_LSHIFT, KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSHIFT, KC_NO, - KC_LCTL, KC_NO, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RCTL, KC_NO, KC_NO, TO(BASE)), + LAYOUT_60_ansi( + _____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ______, + ______, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, _____, + KCNO, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ___________, + ________, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, _________________, + ____, KCNO, ____, /*------------------*/_____/*------------------*/, ____, KCNO, ____, QWRTY), + + [SQLMACROS]= + LAYOUT_60_ansi( + S_ALTER, ____, ____, ____, ____, ____, ____, ____, S_ASTRK, ____, ____, ____, ____, ___________, + ______, ____, S_WHERE, ____, ____, ____, ____, ____, S_INRJN, S_ORDER, ____, ____, ____, ______, + _______, KC_LBRC, S_SLCT, KC_PAST,S_FROM, ____, ____, ____, ____, S_LFTJN, ____, RBRC, ___________, + ________, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, _________________, + ____, ____, ____, /*------------------*/_____/*------------------*/, ____, ____, ____, ____), + + [SQLNAMES]= + LAYOUT_60_ansi( + TD_ESC, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, TD_BSPC, + ________, TD_Q, TD_W, TD_E, TD_R, TD_T, TD_Y, TD_U, TD_I, TD_O, TD_P, ____, ____, _____, + ___________, TD_A, TD_S, TD_D, TD_F, TD_G, TD_H, TD_J, TD_K, TD_L, ____, ____, TD_ENT, + ___________, TD_Z, TD_X, TD_C, TD_V, TD_B, TD_N, TD_M, ____, ____, ____, _________________, + ____, ____, ____, /*----------------------*/TD_ENT/*-----------------------*/, ____, ____, ____, RESET), [FN_LAYER]= - LAYOUT( - KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_DEL, - KC_CAPSLOCK, KC_MPRV, KC_MPLY, KC_MNXT, LWIN(KC_R), KC_TRNS, KC_CALC, KC_PGUP, KC_UP, KC_PGDN, KC_PSCR, KC_SLCK, KC_BRK, KC_TRNS, - KC_TRNS, KC_VOLD, KC_MUTE, KC_VOLU, KC_TRNS, KC_TRNS, KC_HOME, KC_LEFT, KC_DOWN, KC_RIGHT, KC_INS, KC_DEL, MO(LAYER_SEL), - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HYPR, KC_TRNS, KC_MEH, KC_TRNS), - - [LAYER_SEL]= - LAYOUT( - TO(BASE), TO(NAV_CLUSTER), TO(RGB), TO(MOUSE), TO(GAMING), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) - + LAYOUT_60_ansi( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, + KC_CAPSLOCK, KC_MPRV, KC_MPLY, KC_MNXT, LWIN(KC_R), ____, KC_CALC, KC_PGUP, KC_UP, KC_PGDN, KC_PSCR, KC_SLCK, KC_BRK, ____, + ____, KC_VOLD, KC_MUTE, KC_VOLU, ____, ____, KC_HOME, KC_LEFT, KC_DOWN, KC_RIGHT, KC_INS, KC_DEL, ____, + ____, ____, ____, ____, ____, ____, KC_END, ____, QWRTY, NAVS, GAME, ____, + ____, ____, ____, _________________, ____, KC_HYPR, KC_MEH, ____) }; diff --git a/keyboards/dz60/keymaps/marianas/keymap.h b/keyboards/dz60/keymaps/marianas/keymap.h new file mode 100644 index 000000000..01de5c6e2 --- /dev/null +++ b/keyboards/dz60/keymaps/marianas/keymap.h @@ -0,0 +1,103 @@ +//Control +#define MO_FNLR MO(FN_LAYER) +#define BACKSPC KC_BSPC +#define ENTER_OR_SQL LT(SQLMACROS,KC_ENT) +#define ESCAP KC_ESC +#define PSCR KC_PSCREEN +#define SCRL KC_SCROLLLOCK +#define PAUS KC_PAUSE +#define NSRT KC_INSERT +#define HOME KC_HOME +#define PGUP KC_PGUP +#define PGDN KC_PGDN +#define END_ KC_END +#define DELT KC_DELETE +#define UPUP KC_UP +#define D_WN KC_DOWN +#define LEFT KC_LEFT +#define RGHT KC_RIGHT + +//KEYPAD +#define KP_1 KC_KP_1 +#define KP_2 KC_KP_2 +#define KP_3 KC_KP_3 +#define KP_4 KC_KP_4 +#define KP_5 KC_KP_5 +#define KP_6 KC_KP_6 +#define KP_7 KC_KP_7 +#define KP_8 KC_KP_8 +#define KP_9 KC_KP_9 +#define KP_0 KC_KP_0 +#define NMLK KC_NUMLOCK +#define STAR KC_KP_ASTERISK +#define KSSH KC_KP_SLASH +#define KMIN KC_KP_MINUS +#define PLUS KC_KP_PLUS +#define KNTR KC_KP_ENTER +#define KDOT KC_KP_DOT + +//Modifiers +#define CTLL KC_LCTL +#define LEFTSHFT KC_LSPO +#define WINL KC_LGUI +#define ALTL KC_LALT +#define CTLR KC_RCTL +#define RIGHT_SHIFT__PAREN KC_RSPC +#define WINR KC_RGUI +#define ALTR KC_RALT +#define APPR KC_APP + + +//Punctuation +#define CMMA KC_COMM +#define PRRD KC_DOT +#define SLSH KC_SLSH +#define QUOT KC_QUOT +#define COLN KC_SCLN +#define LBRC KC_LBRC +#define RBRC KC_RBRC +#define EQUL KC_EQL +#define MNUS KC_MINS +#define BSLASH KC_BSLS + +//Layers +#define QWRTY TO(QWERTY) +#define NAVS TO(NAV_CLUSTER) +#define GAME TO(GAMING) + +//Space +#define ____ KC_TRNS +#define _____ KC_TRNS +#define ______ KC_TRNS +#define _______ KC_TRNS +#define ________ KC_TRNS +#define ___________ KC_TRNS +#define _________________ KC_TRNS +#define SPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACE KC_SPC +#define KCNO KC_NO + + + + + +#define macroTapsLen 32 +#define tableNameListLen 32 +#define charCountLen 32 + +void initStringData(void); +uint32_t layer_state_set_user(uint32_t state); +bool containsCode(uint16_t kc); +bool lastCodeIs(uint16_t kc); +bool last2CodeAre(uint16_t kc); +bool last2CodesAre(uint16_t kc, uint16_t kc2); +void addKeyCode(uint16_t kc); +void eraseKeyCodes(void); +void eraseCharCounts(void); +void printTableAbbreviation(void); +void eraseTableAbbreviation(void); +void printString(char* str); +void printStringAndQueueChar(char* str); +void ReplaceString(char *orig, char *repl); +void deletePrev(void); +void processSmartMacroTap(uint16_t kc); +bool process_record_user(uint16_t keycode, keyrecord_t *record); diff --git a/keyboards/dz60/keymaps/marianas/rules.mk b/keyboards/dz60/keymaps/marianas/rules.mk new file mode 100644 index 000000000..ab188f3b2 --- /dev/null +++ b/keyboards/dz60/keymaps/marianas/rules.mk @@ -0,0 +1,17 @@ +# Build Options +# comment out to disable the options. +# + + +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +NKRO_ENABLE = no # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +AUDIO_ENABLE = no +RGBLIGHT_ENABLE = yes +TAP_DANCE_ENABLE = no +AUTO_SHIFT_ENABLE = no From f45bc9b362363f6f3f848026eefad7d7a1842c2c Mon Sep 17 00:00:00 2001 From: mwpeterson Date: Thu, 18 Oct 2018 16:00:30 -0400 Subject: [PATCH 302/788] Keymap: Add Planck keymap (#4154) * remove clmk and dvrk and backlight; switch esc and enter to be modtap; add meh key * change songs * space cadet; move enter; move '"; move pgup pgdn * remove extra songs * update from noahfredrick keymap * make it easier to type ../../thing/*/* * move pipe * requested changes --- keyboards/planck/keymaps/mwpeterson/config.h | 40 +++ keyboards/planck/keymaps/mwpeterson/keymap.c | 295 +++++++++++++++++++ keyboards/planck/keymaps/mwpeterson/rules.mk | 6 + 3 files changed, 341 insertions(+) create mode 100644 keyboards/planck/keymaps/mwpeterson/config.h create mode 100644 keyboards/planck/keymaps/mwpeterson/keymap.c create mode 100644 keyboards/planck/keymaps/mwpeterson/rules.mk diff --git a/keyboards/planck/keymaps/mwpeterson/config.h b/keyboards/planck/keymaps/mwpeterson/config.h new file mode 100644 index 000000000..d66557b29 --- /dev/null +++ b/keyboards/planck/keymaps/mwpeterson/config.h @@ -0,0 +1,40 @@ +#pragma once + +#define PERMISSIVE_HOLD +#define IGNORE_MOD_TAP_INTERRUPT + +#ifdef AUDIO_ENABLE + #define STARTUP_SONG SONG(ONE_UP_SOUND) + // #define STARTUP_SONG SONG(PLANCK_SOUND) + // #define STARTUP_SONG SONG(NO_SOUND) + #define GOODBYE_SONG SONG(COIN_SOUND) + + #define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND) } +#endif + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ + +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + +// Most tactile encoders have detents every 4 stages +#define ENCODER_RESOLUTION 4 diff --git a/keyboards/planck/keymaps/mwpeterson/keymap.c b/keyboards/planck/keymaps/mwpeterson/keymap.c new file mode 100644 index 000000000..bfb015c7a --- /dev/null +++ b/keyboards/planck/keymaps/mwpeterson/keymap.c @@ -0,0 +1,295 @@ +// from event.pressed) { +#ifdef AUDIO_ENABLE + stop_all_notes(); + PLAY_SONG(plover_song); +#endif + layer_off(RAISE_LAYER); + layer_off(LOWER_LAYER); + layer_off(ADJUST_LAYER); + layer_on(STENO_LAYER); + if (!eeconfig_is_enabled()) { + eeconfig_init(); + } + keymap_config.raw = eeconfig_read_keymap(); + keymap_config.nkro = 1; + eeconfig_update_keymap(keymap_config.raw); + plover_resume(); + } + return false; + case PV_EXIT: + if (record->event.pressed) { +#ifdef AUDIO_ENABLE + PLAY_SONG(plover_gb_song); +#endif + plover_suspend(); + layer_off(STENO_LAYER); + } + return false; + case PV_LOOK: + if (record->event.pressed) { + plover_lookup(); + } + return false; + case SEND_VERSION: + if (record->event.pressed) { + SEND_STRING(QMK_KEYBOARD "/" QMK_KEYMAP "@" QMK_VERSION " (" QMK_BUILDDATE ")"); + } + return false; + case SEND_MAKE: + if (record->event.pressed) { + SEND_STRING("make " QMK_KEYBOARD ":" QMK_KEYMAP ":dfu\n"); + } + return false; + } + return true; +} diff --git a/keyboards/planck/keymaps/mwpeterson/rules.mk b/keyboards/planck/keymaps/mwpeterson/rules.mk new file mode 100644 index 000000000..de8aa389c --- /dev/null +++ b/keyboards/planck/keymaps/mwpeterson/rules.mk @@ -0,0 +1,6 @@ +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +CONSOLE_ENABLE = no # Console for debug +COMMAND_ENABLE = no # Disable shift combination, which conflicts with shift-parens +MOUSEKEY_ENABLE = yes # Mouse keys (disabled to save space) +NKRO_ENABLE = no # N-key rollover required for use as a steno board +AUDIO_ENABLE = yes # Audio output on port C6 From 14bdd5ed2a808075130bac26fc72dcb9b158ae2c Mon Sep 17 00:00:00 2001 From: sm0g <38926679+sm0ggles@users.noreply.github.com> Date: Thu, 18 Oct 2018 16:51:02 -0400 Subject: [PATCH 303/788] Keymap: added my tada68's from Gitlab. (#4146) * added my tada68 from Gitlab. * Removed unneeded code and the sm0gunix layout. --- keyboards/tada68/keymaps/sm0g/config.h | 3 + keyboards/tada68/keymaps/sm0g/keymap.c | 100 ++++++++++++++++++++++++ keyboards/tada68/keymaps/sm0g/readme.md | 15 ++++ keyboards/tada68/keymaps/sm0g/rules.mk | 18 +++++ 4 files changed, 136 insertions(+) create mode 100644 keyboards/tada68/keymaps/sm0g/config.h create mode 100644 keyboards/tada68/keymaps/sm0g/keymap.c create mode 100644 keyboards/tada68/keymaps/sm0g/readme.md create mode 100644 keyboards/tada68/keymaps/sm0g/rules.mk diff --git a/keyboards/tada68/keymaps/sm0g/config.h b/keyboards/tada68/keymaps/sm0g/config.h new file mode 100644 index 000000000..3a2370b62 --- /dev/null +++ b/keyboards/tada68/keymaps/sm0g/config.h @@ -0,0 +1,3 @@ +#pragma once + +#define BACKLIGHT_BREATHING \ No newline at end of file diff --git a/keyboards/tada68/keymaps/sm0g/keymap.c b/keyboards/tada68/keymaps/sm0g/keymap.c new file mode 100644 index 000000000..25312cd98 --- /dev/null +++ b/keyboards/tada68/keymaps/sm0g/keymap.c @@ -0,0 +1,100 @@ +#include QMK_KEYBOARD_H + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _BL 0 +#define _FL 1 +#define _GM 2 +#define _GF 3 + + +// Tap dance declarations (These must go above the keymaps) +enum { + TD_F1 = 0, + TD_F2, + TD_F3, + TD_F4, + TD_F5, + TD_F6, + TD_F7, + TD_F8, + TD_F9, + TD_F10, + TD_F11, + TD_F12, +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Keymap _BL: (Base Layer) Default Layer + * ,----------------------------------------------------------------. + * |Esc | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \ |~ ` | + * |----------------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]|Bksp |Del | + * |----------------------------------------------------------------| + * |Ctrl | A| S| D| F| G| H| J| K| L| ;| '|Return |PgUp| + * |----------------------------------------------------------------| + * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | Up|PgDn| + * |----------------------------------------------------------------| + * |Caps|Win |Alt | Space |Alt|Ctrl| FN|Lef|Dow|Rig | + * `----------------------------------------------------------------' + */ +[_BL] = LAYOUT_ansi( + KC_ESC, TD(TD_F1), TD(TD_F2), TD(TD_F3), TD(TD_F4), TD(TD_F5), TD(TD_F6), TD(TD_F7), TD(TD_F8), TD(TD_F9), TD(TD_F10), TD(TD_F11), TD(TD_F12), KC_BSLS,KC_GRV, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,KC_BSPC,KC_DEL, \ + CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_ENT,KC_PGUP, \ + KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSPC,KC_UP,KC_PGDN, \ + KC_CAPS, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RCTL,MO(_FL), KC_LEFT,KC_DOWN,KC_RGHT), + + /* Keymap _FL: Function Layer + * ,----------------------------------------------------------------. + * | | F1|F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12| |Ins | + * |----------------------------------------------------------------| + * | | |Up | | | | | | | | | | | |Hme | + * |----------------------------------------------------------------| + * | Caps |<- |Dn | ->| | | | | | | | | |End | + * |----------------------------------------------------------------| + * | | | |Bl-|BL |BL+| |VU-|VU+|MUT| | McL|MsU|McR | + * |----------------------------------------------------------------| + * | | | | | | | |Prev|P/P|Next| + * `----------------------------------------------------------------' + */ +[_FL] = LAYOUT_ansi( + _______, KC_F1 ,KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, TG(_GM), KC_INS , \ + _______,_______, KC_UP,_______,_______, _______,_______,_______,_______,_______,_______,_______,_______, _______,KC_HOME, \ + KC_CAPS,KC_LEFT,KC_DOWN,KC_RIGHT,_______,_______,_______,_______,_______,_______,_______,_______, _______,KC_END, \ + _______,_______,_______,BL_DEC, BL_TOGG,BL_INC, BL_BRTG,KC_VOLD,KC_VOLU,KC_MUTE,_______,_______, _______, _______, \ + _______,_______,_______, _______, _______,_______,_______,KC_MPRV,KC_MPLY, KC_MNXT), + +[_GM] = LAYOUT_ansi( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, _______,KC_GRV, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,KC_BSPC,KC_DEL, \ + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_ENT,KC_PGUP, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT,KC_UP,KC_PGDN, \ + KC_CAPS, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RCTL,MO(_GF), KC_LEFT,KC_DOWN,KC_RGHT), + +[_GF] = LAYOUT_ansi( + _______, KC_F1 ,KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, TG(_GM), KC_INS , \ + _______,_______, KC_UP,_______,_______, _______,_______,_______,_______,_______,_______,_______,_______, _______,KC_HOME, \ + KC_CAPS,KC_LEFT,KC_DOWN,KC_RIGHT,_______,_______,_______,_______,_______,_______,_______,_______, _______,KC_END, \ + _______,_______,_______,BL_DEC, BL_TOGG,BL_INC, BL_BRTG,KC_VOLD,KC_VOLU,KC_MUTE,_______,_______, _______, _______, \ + _______,_______,_______, _______, _______,_______,_______,KC_MPRV,KC_MPLY, KC_MNXT), + +}; + +// Tapdance definitions. Tap Dance F Keys. +qk_tap_dance_action_t tap_dance_actions[] = { + [TD_F1] = ACTION_TAP_DANCE_DOUBLE(KC_1, KC_F1), + [TD_F2] = ACTION_TAP_DANCE_DOUBLE(KC_2, KC_F2), + [TD_F3] = ACTION_TAP_DANCE_DOUBLE(KC_3, KC_F3), + [TD_F4] = ACTION_TAP_DANCE_DOUBLE(KC_4, KC_F4), + [TD_F5] = ACTION_TAP_DANCE_DOUBLE(KC_5, KC_F5), + [TD_F6] = ACTION_TAP_DANCE_DOUBLE(KC_6, KC_F6), + [TD_F7] = ACTION_TAP_DANCE_DOUBLE(KC_7, KC_F7), + [TD_F8] = ACTION_TAP_DANCE_DOUBLE(KC_8, KC_F8), + [TD_F9] = ACTION_TAP_DANCE_DOUBLE(KC_9, KC_F9), + [TD_F10] = ACTION_TAP_DANCE_DOUBLE(KC_0, KC_F10), + [TD_F11] = ACTION_TAP_DANCE_DOUBLE(KC_MINS, KC_F11), + [TD_F12] = ACTION_TAP_DANCE_DOUBLE(KC_EQL, KC_F12), +}; diff --git a/keyboards/tada68/keymaps/sm0g/readme.md b/keyboards/tada68/keymaps/sm0g/readme.md new file mode 100644 index 000000000..9916dcabd --- /dev/null +++ b/keyboards/tada68/keymaps/sm0g/readme.md @@ -0,0 +1,15 @@ +``` + ______ __ __ ______ ______ +.-----.--------.| |.-----. | |_.---.-.--| |.---.-.| __| __ | +|__ --| || -- || _ | | _| _ | _ || _ || __ | __ | +|_____|__|__|__||______||___ | |____|___._|_____||___._||______|______| + |_____| +``` + +Just my simple layout for the Tada68. +Space [Cadet Shift](https://docs.qmk.fm/#/feature_space_cadet_shift) is enabled. +LCTRL and Caps have been swapped and the new CTRL also acts as ESC when tapped and CTRL when held. +This is helpful for me as a VIM user. +Some other changes. + +Tap Dance for the F Row.. i.e double tap 1 and get F1 instead. diff --git a/keyboards/tada68/keymaps/sm0g/rules.mk b/keyboards/tada68/keymaps/sm0g/rules.mk new file mode 100644 index 000000000..bd4bb3249 --- /dev/null +++ b/keyboards/tada68/keymaps/sm0g/rules.mk @@ -0,0 +1,18 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend +TAP_DANCE_ENABLE = yes # Tappa Dance \ No newline at end of file From db03b76910c486cd27c175ae85efeeaa183b1c98 Mon Sep 17 00:00:00 2001 From: mtei <2170248+mtei@users.noreply.github.com> Date: Fri, 19 Oct 2018 01:30:48 +0900 Subject: [PATCH 304/788] optimize rgblight_effect_alternating(void) rgblight_effect_alternating (void) calls rgblight_sethsv_at () RGBLED_NUM times. As a result, rgblight_set () is called RGBLED_NUM + 1 times. This is wasteful processing. --- quantum/rgblight.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/quantum/rgblight.c b/quantum/rgblight.c index 03f77cc80..94e9c0a3b 100644 --- a/quantum/rgblight.c +++ b/quantum/rgblight.c @@ -860,13 +860,13 @@ void rgblight_effect_alternating(void){ last_timer = timer_read(); for(int i = 0; i=RGBLED_NUM/2 && !pos){ - rgblight_sethsv_at(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, i); - }else{ - rgblight_sethsv_at(rgblight_config.hue, rgblight_config.sat, 0, i); - } + if(i=RGBLED_NUM/2 && !pos){ + sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[i]); + }else{ + sethsv(rgblight_config.hue, rgblight_config.sat, 0, (LED_TYPE *)&led[i]); + } } rgblight_set(); pos = (pos + 1) % 2; From 53a43dbe995640632be834f406007a72f8fa4d3e Mon Sep 17 00:00:00 2001 From: Jason Thigpen Date: Thu, 18 Oct 2018 13:53:40 -0700 Subject: [PATCH 305/788] Keymap: Swap func layer keys and add vim navigation to navigation layer (#4163) --- keyboards/dz60/keymaps/crd/keymap.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/keyboards/dz60/keymaps/crd/keymap.c b/keyboards/dz60/keymaps/crd/keymap.c index a17d32caa..2aedc0b72 100644 --- a/keyboards/dz60/keymaps/crd/keymap.c +++ b/keyboards/dz60/keymaps/crd/keymap.c @@ -12,7 +12,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |-----------------------------------------------------------------------------------------+ * | Shift | Z | X | C | V | B | N | M | , | . | / | RSh | U | DEL | * |-----------------------------------------------------------------------------------------+ - * | FN2 | Alt | Cmd | Space | Cmd | FN1 | L | D | R | + * | FN1 | Alt | Cmd | Space | Cmd | FN2 | L | D | R | * `-----------------------------------------------------------------------------------------' */ @@ -21,7 +21,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_DEL, - MO(2), KC_LALT, KC_LGUI, KC_SPC, KC_SPC, KC_SPC, KC_RGUI, MO(1), KC_LEFT, KC_DOWN, KC_RIGHT + MO(1), KC_LALT, KC_LGUI, KC_SPC, KC_SPC, KC_SPC, KC_RGUI, MO(2), KC_LEFT, KC_DOWN, KC_RIGHT ), /* FN1 Layer @@ -30,7 +30,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |-----------------------------------------------------------------------------------------+ * | | | | | | | | | | | | | | | * |-----------------------------------------------------------------------------------------+ - * | | | | | | | | | | | | | | + * | | | | | | | L | D | U | R | | | | * |-----------------------------------------------------------------------------------------+ * | | | | | | | | | | | | |PgUp | | * |-----------------------------------------------------------------------------------------+ @@ -41,7 +41,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LAYOUT_directional( KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDOWN, KC_END ), From 480651cf9df5c0b7453f60dffe13ae5de665a120 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Thu, 18 Oct 2018 15:12:11 -0700 Subject: [PATCH 306/788] Docs: Adding QMK Git Conventions doc; formatting cleanup on Learning Resources doc (#3902) * Docs: newbs_learn_more_resources.md: formatting * Added QMK Git Conventions doc, initial version * Renamed contributing_qmk.md to newbs_best_practices.md * Updated per review by @drashna * Added navigation links * Updated to Best Practices doc * Minor updates to Learn More Resources doc Markdown formatting consistency because I'm particular about it. * Added Merge Conflict section to Best Practices doc --- docs/_sidebar.md | 1 + docs/_summary.md | 2 + docs/newbs.md | 1 + docs/newbs_best_practices.md | 163 +++++++++++++++++++++++++++++ docs/newbs_learn_more_resources.md | 6 +- 5 files changed, 171 insertions(+), 2 deletions(-) create mode 100644 docs/newbs_best_practices.md diff --git a/docs/_sidebar.md b/docs/_sidebar.md index 56a646391..465f4657c 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -3,6 +3,7 @@ * [Building Your First Firmware](newbs_building_firmware.md) * [Flashing Firmware](newbs_flashing.md) * [Testing and Debugging](newbs_testing_debugging.md) + * [Best Practices](newbs_best_practices.md) * [Learning Resources](newbs_learn_more_resources.md) * [QMK Basics](README.md) diff --git a/docs/_summary.md b/docs/_summary.md index 11aeb7cd3..465f4657c 100644 --- a/docs/_summary.md +++ b/docs/_summary.md @@ -3,6 +3,8 @@ * [Building Your First Firmware](newbs_building_firmware.md) * [Flashing Firmware](newbs_flashing.md) * [Testing and Debugging](newbs_testing_debugging.md) + * [Best Practices](newbs_best_practices.md) + * [Learning Resources](newbs_learn_more_resources.md) * [QMK Basics](README.md) * [QMK Introduction](getting_started_introduction.md) diff --git a/docs/newbs.md b/docs/newbs.md index 38a9607d4..e687fd227 100644 --- a/docs/newbs.md +++ b/docs/newbs.md @@ -12,6 +12,7 @@ There are 5 main sections to this guide: * [Building Your First Firmware](newbs_building_firmware.md) * [Flashing Firmware](newbs_flashing.md) * [Testing and Debugging](newbs_testing_debugging.md) +* [Best Practices](newbs_best_practices.md) * [Learn More with these Resources](newbs_learn_more_resources.md) This guide is focused on helping someone who has never compiled software before. It makes choices and recommendations based on that viewpoint. There are alternative methods for many of these procedures, and we support most of those alternatives. If you have any doubt about how to accomplish a task you can [ask us for guidance](getting_started_getting_help.md). diff --git a/docs/newbs_best_practices.md b/docs/newbs_best_practices.md new file mode 100644 index 000000000..61bcc0c6a --- /dev/null +++ b/docs/newbs_best_practices.md @@ -0,0 +1,163 @@ +# Best Practices + +## Or, "How I Learned to Stop Worrying and Love Git." + +This document aims to instruct novices in the best ways to have a smooth experience in contributing to QMK. We will walk through the process of contributing to QMK, detailing some ways to make this task easier, and then later we'll break some things in order to teach you how to fix them. + +This document assumes a few things: + +1. You have a GitHub account, and have [forked the qmk_firmware repository](getting_started_github.md) to your account. +2. You've [set up your build environment](newbs_getting_started.md?id=environment-setup). + + +## Your fork's master: Update Often, Commit Never + +It is highly recommended for QMK development, regardless of what is being done or where, to keep your `master` branch updated, but ***never*** commit to it. Instead, do all your changes in a development branch and issue pull requests from your branches when you're developing. + +To reduce the chances of merge conflicts — instances where two or more users have edited the same part of a file concurrently — keep your `master` branch relatively up-to-date, and start any new developments by creating a new branch. + +### Updating your master branch + +To keep your `master` branch updated, it is recommended to add the QMK Firmware repository ("repo") as a remote repository in git. To do this, open your Git command line interface and enter: + +``` +git remote add upstream https://github.com/qmk/qmk_firmware.git +``` + +To verify that the repository has been added, run `git remote -v`, which should return the following: + +``` +$ git remote -v +origin https://github.com//qmk_firmware.git (fetch) +origin https://github.com//qmk_firmware.git (push) +upstream https://github.com/qmk/qmk_firmware.git (fetch) +upstream https://github.com/qmk/qmk_firmware.git (push) +``` + +Now that this is done, you can check for updates to the repo by running `git fetch upstream`. This retrieves the branches and tags — collectively referred to as "refs" — from the QMK repo, which now has the nickname `upstream`. We can now compare the data on our fork `origin` to that held by QMK. + +To update your fork's master, run the following, hitting the Enter key after each line: + +``` +git checkout master +git fetch upstream +git pull upstream master +git push origin master +``` + +This switches you to your `master` branch, retrieves the refs from the QMK repo, downloads the current QMK `master` branch to your computer, and then uploads it to your fork. + +### Making Changes + +To make changes, create a new branch by entering: + +``` +git checkout -b dev_branch +git push --set-upstream origin dev_branch +``` + +This creates a new branch named `dev_branch`, checks it out, and then saves the new branch to your fork. The `--set-upstream` argument tells git to use your fork and the `dev_branch` branch every time you use `git push` or `git pull` from this branch. It only needs to be used on the first push; after that, you can safely use `git push` or `git pull`, without the rest of the arguments. + +!> With `git push`, you can use `-u` in place of `--set-upstream` — `-u` is an alias for `--set-upstream`. + +You can name your branch nearly anything you want, though it is recommended to name it something related to the changes you are going to make. + +By default `git checkout -b` will base your new branch on the branch that is checked out. You can base your new branch on an existing branch that is not checked out by adding the name of the existing branch to the command: + +``` +git checkout -b dev_branch master +``` + +Now that you have a development branch, open your text editor and make whatever changes you need to make. It is recommended to make many small commits to your branch; that way, any change that causes issues can be more easily traced and undone if needed. To make your changes, edit and save any files that need to be updated, add them to Git's *staging area*, and then commit them to your branch: + +``` +git add path/to/updated_file +git commit -m "My commit message." +``` + +`git add` adds files that have been changed to Git's *staging area*, which is Git's "loading zone." This contains the changes that are going to be *committed* by `git commit`, which saves the changes to the repo. Use descriptive commit messages so you can know what was changed at a glance. + +!> If you've changed a lot of files, but all the files are part of the same change, you can use `git add .` to add all the changed files that are in your current directory, rather than having to add each file individually. + +### Publishing Your Changes + +The last step is to push your changes to your fork. To do this, enter `git push`. Git now publishes the current state of `dev_branch` to your fork. + + +## Resolving Merge Conflicts + +Sometimes when your work in a branch takes a long time to complete, changes that have been made by others conflict with changes you have made to your branch when you open a pull request. This is called a *merge conflict*, and is what happens when multiple people edit the same parts of the same files. + +### Rebasing Your Changes + +A *rebase* is Git's way of taking changes that were applied at one point, reversing them, and then applying the same changes to another point. In the case of a merge conflict, you can rebase your branch to grab the changes that were made between when you created your branch and the present time. + +To start, run the following: + +``` +git fetch upstream +git rev-list --left-right --count HEAD...upstream/master +``` + +The `git rev-list` command entered here returns the number of commits that differ between the current branch and QMK's master branch. We run `git fetch` first to make sure we have the refs that represent the current state of the upstream repo. The output of the `git rev-list` command entered returns two numbers: + +``` +$ git rev-list --left-right --count HEAD...upstream/master +7 35 +``` + +The first number represents the number of commits on the current branch since it was created, and the second number is the number of commits made to `upstream/master` since the current branch was created, and thus, the changes that are not recorded in the current branch. + +Now that the current states of both the current branch and the upstream repo are known, we can start a rebase operation: + +``` +git rebase upstream/master +``` + +This tells Git to undo the commits on the current branch, and then reapply them against QMK's master branch. + +``` +$ git rebase upstream/master +First, rewinding head to replay your work on top of it... +Applying: Commit #1 +Using index info to reconstruct a base tree... +M conflicting_file_1.txt +Falling back to patching base and 3-way merge... +Auto-merging conflicting_file_1.txt +CONFLICT (content): Merge conflict in conflicting_file_1.txt +error: Failed to merge in the changes. +hint: Use 'git am --show-current-patch' to see the failed patch +Patch failed at 0001 Commit #1 + +Resolve all conflicts manually, mark them as resolved with +"git add/rm ", then run "git rebase --continue". +You can instead skip this commit: run "git rebase --skip". +To abort and get back to the state before "git rebase", run "git rebase --abort". +``` + +This tells us that we have a merge conflict, and gives the name of the file with the conflict. Open the conflicting file in your text editor, and somewhere in the file, you'll find something like this: + +``` +<<<<<<< HEAD +

For help with any issues, email us at support@webhost.us.

+======= +

Need help? Email support@webhost.us.

+>>>>>>> Commit #1 +``` + +The line `<<<<<<< HEAD` marks the beginning of a merge conflict, and the `>>>>>>> Commit #1` line marks the end, with the conflicting sections separated by `=======`. The part on the `HEAD` side is from the QMK master version of the file, and the part marked with the commit message is from the current branch and commit. + +Because Git tracks *changes to files* rather than the contents of the files directly, if Git can't find the text that was in the file previous to the commit that was made, it won't know how to edit the file. Re-editing the file will solve the conflict. Make your changes, and then save the file. + +``` +

Need help? Email support@webhost.us.

+``` + +Now run: + +``` +git add conflicting_file_1.txt +git rebase --continue +``` + +Git logs the changes to the conflicting file, and continues applying the commits from our branch until it reaches the end. diff --git a/docs/newbs_learn_more_resources.md b/docs/newbs_learn_more_resources.md index 23b99f470..9b77db8fd 100644 --- a/docs/newbs_learn_more_resources.md +++ b/docs/newbs_learn_more_resources.md @@ -1,13 +1,15 @@ # Learning Resources -These resources are aimed at giving new members in the qmk community more understanding to the information provided in the newbs docs. + +These resources are aimed at giving new members in the QMK community more understanding to the information provided in the Newbs docs. Git resources: * [Great General Tutorial](https://www.codecademy.com/learn/learn-git) * [Git Game To Learn From Examples](https://learngitbranching.js.org/) * [Git Resources to Learn More About Github](getting_started_github.md) -* [Git Resources Aimed Specificly toward QMK](contributing.md) +* [Git Resources Aimed Specifically toward QMK](contributing.md) Command Line resources: + * [Good General Tutorial on Command Line](https://www.codecademy.com/learn/learn-the-command-line) From fc1c692f710fcd65be250d43662ee9742b221f0d Mon Sep 17 00:00:00 2001 From: lexworth <30760424+lexworth@users.noreply.github.com> Date: Thu, 18 Oct 2018 18:36:30 -0400 Subject: [PATCH 307/788] Keymap: Adding my Minivan layout (#4162) * adding my keymap * adding my Minivan keymap * deleted old incomplete keymap * added link to layout image * adding my minivan keymap --- .../minivan/keymaps/lexworth/config.h | 5 ++++ .../minivan/keymaps/lexworth/keymap.c | 29 +++++++++++++++++++ .../minivan/keymaps/lexworth/readme.md | 7 +++++ .../minivan/keymaps/lexworth/rules.mk | 5 ++++ 4 files changed, 46 insertions(+) create mode 100644 keyboards/thevankeyboards/minivan/keymaps/lexworth/config.h create mode 100644 keyboards/thevankeyboards/minivan/keymaps/lexworth/keymap.c create mode 100644 keyboards/thevankeyboards/minivan/keymaps/lexworth/readme.md create mode 100644 keyboards/thevankeyboards/minivan/keymaps/lexworth/rules.mk diff --git a/keyboards/thevankeyboards/minivan/keymaps/lexworth/config.h b/keyboards/thevankeyboards/minivan/keymaps/lexworth/config.h new file mode 100644 index 000000000..36062c47b --- /dev/null +++ b/keyboards/thevankeyboards/minivan/keymaps/lexworth/config.h @@ -0,0 +1,5 @@ +#pragma once + +// place overrides here +#define BACKLIGHT_PIN B7 +#define BACKLIGHT_LEVELS 5 \ No newline at end of file diff --git a/keyboards/thevankeyboards/minivan/keymaps/lexworth/keymap.c b/keyboards/thevankeyboards/minivan/keymaps/lexworth/keymap.c new file mode 100644 index 000000000..1824f3cf3 --- /dev/null +++ b/keyboards/thevankeyboards/minivan/keymaps/lexworth/keymap.c @@ -0,0 +1,29 @@ +#include QMK_KEYBOARD_H + +// Helpful defines + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT + (KC_GESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + LT(1,KC_TAB), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, LT(1,KC_QUOT), + KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, + KC_LCTL, KC_LALT, KC_LGUI, KC_ENT, KC_SPC, TG(2), LT(3,KC_APP), KC_DEL), + + [1] = LAYOUT + (KC_CAPS, KC_PGUP, KC_UP, KC_PGDN, KC_INS, KC_HOME, KC_UNDS, KC_P7, KC_P8, KC_P9, KC_EQL, KC_TRNS, + KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_DEL, KC_END, KC_PMNS, KC_P4, KC_P5, KC_P6, KC_PPLS, KC_TRNS, + KC_MUTE, KC_VOLD, KC_VOLU, KC_MPLY, KC_MPRV, KC_MNXT, KC_PAST, KC_P1, KC_P2, KC_P3, KC_PSLS, KC_NLCK, + KC_TRNS, KC_TRNS, KC_MSTP, KC_PENT, KC_P0, KC_PDOT, KC_APP, KC_TRNS), + + [2] = LAYOUT + (KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS, + KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS, + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F11, KC_F12), + + [3] = LAYOUT + (KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LCBR, KC_RCBR, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LBRC, KC_RBRC, KC_PIPE, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LPRN, KC_RPRN, KC_TRNS, + BL_TOGG, BL_DEC, BL_INC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET) +}; diff --git a/keyboards/thevankeyboards/minivan/keymaps/lexworth/readme.md b/keyboards/thevankeyboards/minivan/keymaps/lexworth/readme.md new file mode 100644 index 000000000..5ac3aafdc --- /dev/null +++ b/keyboards/thevankeyboards/minivan/keymaps/lexworth/readme.md @@ -0,0 +1,7 @@ +# Minivan + +![Layout Image](https://drive.google.com/file/d/1rDbtoOBvw5lxfvUBLYmjTt6MJPoeXngr/view?usp=sharing) + +# Custom keymap for the minivan with backlight enabled and 5 backlight levels. +# Hardware Supported: Minivan +# Hardware Availability: [thevankeyboards.com](https://thevankeyboards.com/) \ No newline at end of file diff --git a/keyboards/thevankeyboards/minivan/keymaps/lexworth/rules.mk b/keyboards/thevankeyboards/minivan/keymaps/lexworth/rules.mk new file mode 100644 index 000000000..9c7dc2e12 --- /dev/null +++ b/keyboards/thevankeyboards/minivan/keymaps/lexworth/rules.mk @@ -0,0 +1,5 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically + +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality From 8efe8b498d344928fb55ea78a289d9eb32145e48 Mon Sep 17 00:00:00 2001 From: 194h <38110558+194h@users.noreply.github.com> Date: Fri, 19 Oct 2018 02:09:06 +0200 Subject: [PATCH 308/788] Keymap: Added 194h atreus62 keymap (#4164) * Added my(194h) atreus62 keymap * Fixed what noroadsleft remarked in my pull request, hopefully got it all. * Followed drashna's suggestion. --- keyboards/atreus62/keymaps/194h/config.h | 6 + keyboards/atreus62/keymaps/194h/keymap.c | 160 +++++++++++++++++++++++ keyboards/atreus62/keymaps/194h/rules.mk | 8 ++ 3 files changed, 174 insertions(+) create mode 100644 keyboards/atreus62/keymaps/194h/config.h create mode 100644 keyboards/atreus62/keymaps/194h/keymap.c create mode 100644 keyboards/atreus62/keymaps/194h/rules.mk diff --git a/keyboards/atreus62/keymaps/194h/config.h b/keyboards/atreus62/keymaps/194h/config.h new file mode 100644 index 000000000..f5306a07f --- /dev/null +++ b/keyboards/atreus62/keymaps/194h/config.h @@ -0,0 +1,6 @@ +#pragma once +#define ONESHOT_TIMEOUT 3000 +#define TAPPING_TERM 200 +#define FORCE_NKRO +#define LEADER_TIMEOUT 1000 +#define TAPPING_TOGGLE 3 diff --git a/keyboards/atreus62/keymaps/194h/keymap.c b/keyboards/atreus62/keymaps/194h/keymap.c new file mode 100644 index 000000000..9b397fce4 --- /dev/null +++ b/keyboards/atreus62/keymaps/194h/keymap.c @@ -0,0 +1,160 @@ +#include QMK_KEYBOARD_H + +//The current Nordic and Norwegian layout files are a mess. I'll do it myself: +//Norwegian +#define NO_AE KC_QUOT // Æ +#define NO_AO KC_LBRC // Å +#define NO_BSLS KC_EQL // Backslash +#define NO_LT KC_NUBS // < +#define NO_MINS KC_SLSH // - +#define NO_OE KC_SCLN // Ø +#define NO_PIPE KC_GRV // | +#define NO_PLUS KC_MINS // + +#define NO_QUOT KC_NUHS // ' +#define NO_UMLA KC_RBRC // ¨ +//Norwegian - Modifier dependant definitions +#define NO_EXLM LSFT(KC_1) // ! +#define NO_DQT LSFT(KC_2) // " +#define NO_AT RALT(KC_2) // @ +#define NO_HASH LSFT(KC_3) // # +#define NO_EUR LSFT(KC_4) // € +#define NO_DLR RALT(KC_4) // $ +#define NO_PERC LSFT(KC_5) // % +#define NO_AND LSFT(KC_6) // & +#define NO_SLSH LSFT(KC_7) // / +#define NO_PO LSFT(KC_8) // ( +#define NO_PC LSFT(KC_9) // ) +#define NO_EQL LSFT(KC_0) // = +#define NO_LCBR RALT(KC_7) // { +#define NO_LBRC RALT(KC_8) // [ +#define NO_RBRC RALT(KC_9) // ] +#define NO_RCBR RALT(KC_0) // } +#define NO_COLN LSFT(KC_DOT) // : +#define NO_SCLN LSFT(KC_COMM) // ; +#define NO_MU RALT(KC_M) // µ +#define NO_EURO RALT(KC_E) // € +#define NO_SECT LSFT(KC_GRV) // § +#define NO_GERC RALT(KC_COMM) // ¸ +#define NO_QUAR LSFT(RALT(KC_4)) // ¼ +//Norwegian layout - dependant on previous definitions +#define NO_UNDS LSFT(NO_MINS) // _ +#define NO_QUES LSFT(NO_PLUS) // ? +#define NO_GRAV LSFT(NO_BSLS) // ` +#define NO_GT LSFT(NO_LT) // > +#define NO_HALF RALT(NO_LT) // ½ +#define NO_HAT LSFT(NO_UMLA) // ^ +#define NO_ASTR LSFT(NO_QUOT) // * +#define NO_TILD RALT(NO_UMLA) // ~ + +//One Shot Modifier +#define OSM_LCTL OSM(MOD_LCTL) +#define OSM_LALT OSM(MOD_LALT) +#define OSM_LSFT OSM(MOD_LSFT) +#define OSM_LGUI OSM(MOD_LGUI) +#define OSM_RCTL OSM(MOD_RCTL) +#define OSM_RALT OSM(MOD_RALT) +#define OSM_RSFT OSM(MOD_RSFT) +#define OSM_RGUI OSM(MOD_RGUI) + +//Layers +#define L1 0 +#define L2 1 +#define L3 2 +#define L4 3 +#define L5 4 + +// Momentary switch to layer - One Shot Layer +#define OSL_L3 OSL(L3) +#define OSL_L4 OSL(L4) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [L1] = LAYOUT( + KC_LGUI, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_RGUI, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, NO_DQT, + KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, NO_SCLN, NO_QUOT, + OSM_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, NO_MINS, OSM_RSFT, + CTL_T(KC_ESC), MO(L5), KC_LEAD, OSM_LALT, MO(L4), OSL_L3, KC_SPC, KC_ENT, OSL_L3, MO(L4), OSM_RALT, NO_EQL, NO_PLUS, KC_RCTL + ), + [L2] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, NO_AO, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, NO_OE, NO_AE, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + [L3] = LAYOUT( + NO_LBRC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, NO_RBRC, + NO_LCBR, XXXXXXX, XXXXXXX, NO_AT, XXXXXXX, NO_TILD, NO_QUES, NO_EXLM, NO_PIPE, XXXXXXX, XXXXXXX, NO_RCBR, + _______, NO_ASTR, NO_BSLS, NO_DLR, NO_HASH, XXXXXXX, NO_HAT, XXXXXXX, NO_COLN, NO_SLSH, NO_SCLN, NO_QUOT, + NO_PO, KC_0, NO_SECT, NO_PERC, XXXXXXX, NO_GRAV, NO_AND, NO_UMLA, NO_LT, NO_GT, NO_UNDS, NO_PC, + XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX + ), + [L4] = LAYOUT( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_HOME, KC_PGDN, KC_PGUP, KC_END, XXXXXXX, XXXXXXX, + _______, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, XXXXXXX, KC_DEL, + XXXXXXX, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, XXXXXXX, KC_APP, XXXXXXX, XXXXXXX, KC_VOLD, XXXXXXX, + OSM_LCTL, _______, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MUTE, KC_VOLU, OSM_RCTL + ), + [L5] = LAYOUT( + XXXXXXX, TO(L1), TO(L2), TO(L3), TO(L4), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, NO_AO, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, NO_OE, NO_AE, + XXXXXXX, XXXXXXX, XXXXXXX, KC_CAPS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX + ) +}; + + +// Unicode Linux +void matrix_init_user(void) { + set_unicode_input_mode(UC_LNX); +}; + + +#define TAP_ONCE(code) \ + register_code (code); \ + unregister_code (code) + + +LEADER_EXTERNS(); + +// Runs constantly in the background, in a loop. Only supports basic keycodes. +void matrix_scan_user(void) { + LEADER_DICTIONARY() { + leading = false; + leader_end(); + + //probably useless in practice, but cool + SEQ_ONE_KEY (KC_P) { + tap_random_base64(); + tap_random_base64(); + tap_random_base64(); + tap_random_base64(); + tap_random_base64(); + tap_random_base64(); + tap_random_base64(); + tap_random_base64(); + } + + SEQ_ONE_KEY (KC_G) { + SEND_STRING("grep something !"); + register_code(KC_RALT); + TAP_ONCE(KC_4); + unregister_code(KC_RALT); + } + SEQ_ONE_KEY (KC_T) { + SEND_STRING("tail "); + TAP_ONCE(KC_SLSH); + SEND_STRING("f !"); + register_code(KC_RALT); + TAP_ONCE(KC_4); + unregister_code(KC_RALT); + } + SEQ_ONE_KEY (KC_S) { + SEND_STRING("sudo !!"); + TAP_ONCE(KC_ENT); + } + } +} diff --git a/keyboards/atreus62/keymaps/194h/rules.mk b/keyboards/atreus62/keymaps/194h/rules.mk new file mode 100644 index 000000000..5246909a3 --- /dev/null +++ b/keyboards/atreus62/keymaps/194h/rules.mk @@ -0,0 +1,8 @@ +TAP_DANCE_ENABLE = no +NKRO_ENABLE = true +MOUSEKEY_ENABLE = no +EXTRAKEY_ENABLE = yes +CONSOLE_ENABLE = no +KEY_LOCK_ENABLE = no +AUTO_SHIFT_ENABLE = no +LEADER_ENABLE = yes From f4094930a393ec3dc597e06e95cd3365e3f8cb97 Mon Sep 17 00:00:00 2001 From: Takuya Urakawa Date: Fri, 19 Oct 2018 13:33:23 +0900 Subject: [PATCH 309/788] stm32f1xx EEPROM emulation (#3914) * * Add stm32f1xx EEPROM emulation * Fix eeprom update compare bug Squashed commit of the following: commit b8f248ae08cec0cd81ecbb8854d9b39221d4d573 Author: hsgw Date: Sat Sep 15 19:13:48 2018 +0900 fix EEPROM_update wrong compare commit d4ed4e6ea864e967a3e17f7edee4b0c3b4a25541 Author: hsgw Date: Sat Sep 15 17:43:47 2018 +0900 eeprom fix initialization define commit b61aa7c04d70c64df3416d63e5da08b73b6053af Author: hsgw Date: Sat Sep 15 16:33:40 2018 +0900 maybe working * Fix FLASH_KEY defines --- tmk_core/common.mk | 7 +++++++ tmk_core/common/chibios/eeprom_stm32.c | 8 ++++---- tmk_core/common/chibios/eeprom_stm32.h | 12 +++++++++--- tmk_core/common/chibios/flash_stm32.c | 24 ++++++++++++++++-------- tmk_core/common/eeconfig.c | 6 +++--- tmk_core/common/eeconfig.h | 2 +- tmk_core/protocol/chibios/main.c | 4 ++-- 7 files changed, 42 insertions(+), 21 deletions(-) diff --git a/tmk_core/common.mk b/tmk_core/common.mk index 4a0f7dcf9..33bcc97b2 100644 --- a/tmk_core/common.mk +++ b/tmk_core/common.mk @@ -34,6 +34,13 @@ ifeq ($(PLATFORM),CHIBIOS) ifeq ($(MCU_SERIES), STM32F3xx) TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom_stm32.c TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/flash_stm32.c + TMK_COMMON_DEFS += -DEEPROM_EMU_STM32F303xC + TMK_COMMON_DEFS += -DSTM32_EEPROM_ENABLE + else ifeq ($(MCU_SERIES), STM32F1xx) + TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom_stm32.c + TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/flash_stm32.c + TMK_COMMON_DEFS += -DEEPROM_EMU_STM32F103xB + TMK_COMMON_DEFS += -DSTM32_EEPROM_ENABLE else TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom_teensy.c endif diff --git a/tmk_core/common/chibios/eeprom_stm32.c b/tmk_core/common/chibios/eeprom_stm32.c index 3c1945122..a86998550 100755 --- a/tmk_core/common/chibios/eeprom_stm32.c +++ b/tmk_core/common/chibios/eeprom_stm32.c @@ -10,7 +10,7 @@ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. * - * This files are free to use from https://github.com/rogerclarkmelbourne/Arduino_STM32 and + * This files are free to use from https://github.com/rogerclarkmelbourne/Arduino_STM32 and * https://github.com/leaflabs/libmaple * * Modifications for QMK and STM32F303 by Yiancar @@ -274,7 +274,7 @@ uint16_t EE_VerifyPageFullWriteVariable(uint16_t Address, uint16_t Data) // Check each active page address starting from begining for (idx = pageBase + 4; idx < pageEnd; idx += 4) - if ((*(__IO uint32_t*)idx) == 0xFFFFFFFF) // Verify if element + if ((*(__IO uint32_t*)idx) == 0xFFFFFFFF) // Verify if element { // contents are 0xFFFFFFFF FlashStatus = FLASH_ProgramHalfWord(idx, Data); // Set variable data if (FlashStatus != FLASH_COMPLETE) @@ -517,7 +517,7 @@ uint16_t EEPROM_read(uint16_t Address, uint16_t *Data) // Get the valid Page end Address pageEnd = pageBase + ((uint32_t)(PageSize - 2)); - + // Check each active page address starting from end for (pageBase += 6; pageEnd >= pageBase; pageEnd -= 4) if ((*(__IO uint16_t*)pageEnd) == Address) // Compare the read address with the virtual address @@ -574,7 +574,7 @@ uint16_t EEPROM_update(uint16_t Address, uint16_t Data) { uint16_t temp; EEPROM_read(Address, &temp); - if (Address == Data) + if (temp == Data) return EEPROM_SAME_VALUE; else return EEPROM_write(Address, Data); diff --git a/tmk_core/common/chibios/eeprom_stm32.h b/tmk_core/common/chibios/eeprom_stm32.h index 68aa14f6d..09229530c 100755 --- a/tmk_core/common/chibios/eeprom_stm32.h +++ b/tmk_core/common/chibios/eeprom_stm32.h @@ -10,7 +10,7 @@ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. * - * This files are free to use from https://github.com/rogerclarkmelbourne/Arduino_STM32 and + * This files are free to use from https://github.com/rogerclarkmelbourne/Arduino_STM32 and * https://github.com/leaflabs/libmaple * * Modifications for QMK and STM32F303 by Yiancar @@ -27,8 +27,14 @@ #include "flash_stm32.h" // HACK ALERT. This definition may not match your processor -// To Do. Work out correct value for EEPROM_PAGE_SIZE on the STM32F103CT6 etc -#define MCU_STM32F303CC +// To Do. Work out correct value for EEPROM_PAGE_SIZE on the STM32F103CT6 etc +#if defined(EEPROM_EMU_STM32F303xC) + #define MCU_STM32F303CC +#elif defined(EEPROM_EMU_STM32F103xB) + #define MCU_STM32F103RB +#else + #error "not implemented." +#endif #ifndef EEPROM_PAGE_SIZE #if defined (MCU_STM32F103RB) diff --git a/tmk_core/common/chibios/flash_stm32.c b/tmk_core/common/chibios/flash_stm32.c index e7199ac7b..273593484 100755 --- a/tmk_core/common/chibios/flash_stm32.c +++ b/tmk_core/common/chibios/flash_stm32.c @@ -10,19 +10,27 @@ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. * - * This files are free to use from https://github.com/rogerclarkmelbourne/Arduino_STM32 and + * This files are free to use from https://github.com/rogerclarkmelbourne/Arduino_STM32 and * https://github.com/leaflabs/libmaple * * Modifications for QMK and STM32F303 by Yiancar */ -#define STM32F303xC +#if defined(EEPROM_EMU_STM32F303xC) + #define STM32F303xC + #include "stm32f3xx.h" +#elif defined(EEPROM_EMU_STM32F103xB) + #define STM32F103xB + #include "stm32f1xx.h" +#else + #error "not implemented." +#endif -#include "stm32f3xx.h" #include "flash_stm32.h" -#define FLASH_KEY1 ((uint32_t)0x45670123) -#define FLASH_KEY2 ((uint32_t)0xCDEF89AB) +#if defined(EEPROM_EMU_STM32F103xB) + #define FLASH_SR_WRPERR FLASH_SR_WRPRTERR +#endif /* Delay definition */ #define EraseTimeout ((uint32_t)0x00000FFF) @@ -71,7 +79,7 @@ FLASH_Status FLASH_GetStatus(void) * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. */ FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout) -{ +{ FLASH_Status status; /* Check for the Flash Status */ @@ -102,7 +110,7 @@ FLASH_Status FLASH_ErasePage(uint32_t Page_Address) ASSERT(IS_FLASH_ADDRESS(Page_Address)); /* Wait for last operation to be completed */ status = FLASH_WaitForLastOperation(EraseTimeout); - + if(status == FLASH_COMPLETE) { /* if the previous operation is completed, proceed to erase the page */ @@ -128,7 +136,7 @@ FLASH_Status FLASH_ErasePage(uint32_t Page_Address) * @param Address: specifies the address to be programmed. * @param Data: specifies the data to be programmed. * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, - * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. */ FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data) { diff --git a/tmk_core/common/eeconfig.c b/tmk_core/common/eeconfig.c index 0fec410a9..d8bab7d2e 100644 --- a/tmk_core/common/eeconfig.c +++ b/tmk_core/common/eeconfig.c @@ -3,7 +3,7 @@ #include "eeprom.h" #include "eeconfig.h" -#ifdef STM32F303xC +#ifdef STM32_EEPROM_ENABLE #include "hal.h" #include "eeprom_stm32.h" #endif @@ -32,7 +32,7 @@ void eeconfig_init_kb(void) { * FIXME: needs doc */ void eeconfig_init_quantum(void) { -#ifdef STM32F303xC +#ifdef STM32_EEPROM_ENABLE EEPROM_format(); #endif eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER); @@ -73,7 +73,7 @@ void eeconfig_enable(void) */ void eeconfig_disable(void) { -#ifdef STM32F303xC +#ifdef STM32_EEPROM_ENABLE EEPROM_format(); #endif eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER_OFF); diff --git a/tmk_core/common/eeconfig.h b/tmk_core/common/eeconfig.h index a45cb8b12..8d4e1d4d0 100644 --- a/tmk_core/common/eeconfig.h +++ b/tmk_core/common/eeconfig.h @@ -26,7 +26,7 @@ along with this program. If not, see . #define EECONFIG_MAGIC_NUMBER_OFF (uint16_t)0xFFFF /* eeprom parameteter address */ -#if !defined(STM32F303xC) +#if !defined(STM32_EEPROM_ENABLE) #define EECONFIG_MAGIC (uint16_t *)0 #define EECONFIG_DEBUG (uint8_t *)2 #define EECONFIG_DEFAULT_LAYER (uint8_t *)3 diff --git a/tmk_core/protocol/chibios/main.c b/tmk_core/protocol/chibios/main.c index dcc6d9d07..6cceccd23 100644 --- a/tmk_core/protocol/chibios/main.c +++ b/tmk_core/protocol/chibios/main.c @@ -44,7 +44,7 @@ #ifdef MIDI_ENABLE #include "qmk_midi.h" #endif -#ifdef STM32F303xC +#ifdef STM32_EEPROM_ENABLE #include "eeprom_stm32.h" #endif #include "suspend.h" @@ -112,7 +112,7 @@ int main(void) { halInit(); chSysInit(); -#ifdef STM32F303xC +#ifdef STM32_EEPROM_ENABLE EEPROM_init(); #endif From 7e1b57add42dcc3330d9d99e28c9b7f96eb2eee8 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Thu, 18 Oct 2018 21:34:40 -0700 Subject: [PATCH 310/788] Some cleanup of the Useful Functions docs (#4064) * Add examples for tri layers * Clean up and spelling fixes --- docs/ref_functions.md | 78 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 64 insertions(+), 14 deletions(-) diff --git a/docs/ref_functions.md b/docs/ref_functions.md index 7d0cda322..9b5be7a88 100644 --- a/docs/ref_functions.md +++ b/docs/ref_functions.md @@ -1,28 +1,79 @@ # List of Useful Core Functions To Make Your Keyboard Better -There are a lot of hidden functions in QMK that are incredible useful, or may add a bit of functionality that you've been wanting. Functions that are specific to certain features are not included here, as those will be on their respective feature page. +There are a lot of hidden functions in QMK that are incredible useful, or may add a bit of functionality that you've been wanting. Functions that are specific to certain features are not included here, as those will be on their respective feature page. ## (OLKB) Tri Layers -There are actually separate functions that you can use there, depending on what you're after. +There are actually separate functions that you can use there, depending on what you're after. -The first is the `update_tri_layer(x, y, z)` function. This function check to see if layers `x` and `y` are both on. If they are both on, then it runs on layer `z`. Otherwise, if both `x` and `y` are not both on (either only one is, or neither is), then it runs off layer `z`. +### `update_tri_layer(x, y, z)` -This function is useful if you want to create specific keys that have this functionality, but other layer keycodes won't do this. +The first is the `update_tri_layer(x, y, z)` function. This function check to see if layers `x` and `y` are both on. If they are both on, then it runs on layer `z`. Otherwise, if both `x` and `y` are not both on (either only one is, or neither is), then it runs off layer `z`. -The other function is `update_tri_layer_state(state, x, y, z)`. This function is meant to be called from they [`layer_state_set_*` functions](custom_quantum_functions.md#layer-change-code). This means that any time that you use a keycode to change the layer, this will be checked. So you could use `LT(layer, kc)` to change the layer and it will trigger the same layer check. +This function is useful if you want to create specific keys that have this functionality, but other layer keycodes won't do this. -The caveat to this method is that you cannot access the `z` layer without having `x` and `y` layers on, since if you try to activate just layer `z`, it will run this code and turn off layer `z` before you could use it. +#### Example + +```c +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + } + return true; +} +``` + +### `update_tri_layer_state(state, x, y, z)` +The other function is `update_tri_layer_state(state, x, y, z)`. This function is meant to be called from they [`layer_state_set_*` functions](custom_quantum_functions.md#layer-change-code). This means that any time that you use a keycode to change the layer, this will be checked. So you could use `LT(layer, kc)` to change the layer and it will trigger the same layer check. + +The caveat to this method is that you cannot access the `z` layer without having `x` and `y` layers on, since if you try to activate just layer `z`, it will run this code and turn off layer `z` before you could use it. + +#### Example + +```c +uint32_t layer_state_set_user(uint32_t state) { + return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST); +} +``` + +Alternatively, you don't have to immediately "return" the value. This is useful if you want to add multiple tri layers, or if you want to add additional effects. + +```c +uint32_t layer_state_set_user(uint32_t state) { + state = update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST); + state = update_tri_layer_state(state, _RAISE, _SYMB, _SPECIAL); + return state; +} +``` ## Setting the Persistent Default Layer -Do you want to set the default layer, so that it's retained even after you unplug the board? If so, this is the function for you. +Do you want to set the default layer, so that it's retained even after you unplug the board? If so, this is the function for you. -To use this, you would use `set_single_persistent_default_layer(layer)`. If you have a name defined for your layer, you can use that instead (such as _QWERTY, _DVORAK or _COLEMAK). +To use this, you would use `set_single_persistent_default_layer(layer)`. If you have a name defined for your layer, you can use that instead (such as _QWERTY, _DVORAK or _COLEMAK). -This will set the default layer, update the persistent settings, and play a tune if you have [Audio](feature_audio.md) enabled on your board, and the default layer sounds set. +This will set the default layer, update the persistent settings, and play a tune if you have [Audio](feature_audio.md) enabled on your board, and the default layer sounds set. -To configure the default layer sounds, you would want to define this in your `config.h` file, like this: +To configure the default layer sounds, you would want to define this in your `config.h` file, like this: ```c #define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \ @@ -36,13 +87,12 @@ To configure the default layer sounds, you would want to define this in your `co ## Reseting the keyboard -There is the `RESET` quantum keycode that you can use. But if you want to reset the board as part of a macro, rather than hitting a key separately, you can do that. +There is the `RESET` quantum keycode that you can use. But if you want to reset the board as part of a macro, rather than hitting a key separately, you can do that. And to do so, add `reset_keyboard()` to your function or macro, and this will reset to bootloader. ## Wiping the EEPROM (Persistent Storage) -If you're having issues with Audio, RGB Underglow, backlighting or keys acting weird, then you can reset the EEPROM (persistent setting storage). Bootmagic is one way to do this, but if that isn't enabled, then you can use a custom macro to do so. - -To wipe the EEPROM, run `eeconfig_init()` from your function or macro to reset most of the settings to default. +If you're having issues with Audio, RGB Underglow, backlighting or keys acting weird, then you can reset the EEPROM (persistent setting storage). Bootmagic is one way to do this, but if that isn't enabled, then you can use a custom macro to do so. +To wipe the EEPROM, run `eeconfig_init()` from your function or macro to reset most of the settings to default. From 7222e3691b18128c4822f6bb5db008010f5e41dd Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Thu, 18 Oct 2018 21:35:15 -0700 Subject: [PATCH 311/788] Fix Unicode EEPROM handling so it is consistent. (#4066) * Fix Unicode EEPROM handling so it's consistant * Remove changes to my userspace * Optimize variables used * fix functions * additional cleanup * Add False Flag * rename function --- quantum/process_keycode/process_ucis.c | 6 +++--- quantum/process_keycode/process_unicode.c | 7 +------ .../process_keycode/process_unicode_common.c | 17 +++++++++++------ .../process_keycode/process_unicode_common.h | 1 + quantum/process_keycode/process_unicodemap.c | 1 + 5 files changed, 17 insertions(+), 15 deletions(-) diff --git a/quantum/process_keycode/process_ucis.c b/quantum/process_keycode/process_ucis.c index 5de2e41fc..380199771 100644 --- a/quantum/process_keycode/process_ucis.c +++ b/quantum/process_keycode/process_ucis.c @@ -93,7 +93,7 @@ void register_ucis(const char *hex) { } bool process_ucis (uint16_t keycode, keyrecord_t *record) { - uint8_t i; + unicode_input_mode_init(); if (!qk_ucis_state.in_progress) return true; @@ -122,7 +122,7 @@ bool process_ucis (uint16_t keycode, keyrecord_t *record) { if (keycode == KC_ENT || keycode == KC_SPC || keycode == KC_ESC) { bool symbol_found = false; - for (i = qk_ucis_state.count; i > 0; i--) { + for (uint8_t i = qk_ucis_state.count; i > 0; i--) { register_code (KC_BSPC); unregister_code (KC_BSPC); wait_ms(UNICODE_TYPE_DELAY); @@ -134,7 +134,7 @@ bool process_ucis (uint16_t keycode, keyrecord_t *record) { } unicode_input_start(); - for (i = 0; ucis_symbol_table[i].symbol; i++) { + for (uint8_t i = 0; ucis_symbol_table[i].symbol; i++) { if (is_uni_seq (ucis_symbol_table[i].symbol)) { symbol_found = true; register_ucis(ucis_symbol_table[i].code + 2); diff --git a/quantum/process_keycode/process_unicode.c b/quantum/process_keycode/process_unicode.c index fd008eca1..f39c4a36e 100644 --- a/quantum/process_keycode/process_unicode.c +++ b/quantum/process_keycode/process_unicode.c @@ -17,15 +17,10 @@ #include "action_util.h" #include "eeprom.h" -static uint8_t first_flag = 0; - bool process_unicode(uint16_t keycode, keyrecord_t *record) { if (keycode > QK_UNICODE && record->event.pressed) { - if (first_flag == 0) { - set_unicode_input_mode(eeprom_read_byte(EECONFIG_UNICODEMODE)); - first_flag = 1; - } uint16_t unicode = keycode & 0x7FFF; + unicode_input_mode_init(); unicode_input_start(); register_hex(unicode); unicode_input_finish(); diff --git a/quantum/process_keycode/process_unicode_common.c b/quantum/process_keycode/process_unicode_common.c index e6620b7ea..4285d20a1 100644 --- a/quantum/process_keycode/process_unicode_common.c +++ b/quantum/process_keycode/process_unicode_common.c @@ -22,8 +22,7 @@ static uint8_t input_mode; uint8_t mods; -void set_unicode_input_mode(uint8_t os_target) -{ +void set_unicode_input_mode(uint8_t os_target) { input_mode = os_target; eeprom_update_byte(EECONFIG_UNICODEMODE, os_target); } @@ -32,6 +31,14 @@ uint8_t get_unicode_input_mode(void) { return input_mode; } +void unicode_input_mode_init(void) { + static bool first_flag = false; + if (!first_flag) { + input_mode = eeprom_read_byte(EECONFIG_UNICODEMODE); + first_flag = true; + } +} + __attribute__((weak)) void unicode_input_start (void) { // save current mods @@ -104,8 +111,7 @@ void unicode_input_finish (void) { } __attribute__((weak)) -uint16_t hex_to_keycode(uint8_t hex) -{ +uint16_t hex_to_keycode(uint8_t hex) { if (hex == 0x0) { return KC_0; } else if (hex < 0xA) { @@ -123,8 +129,7 @@ void register_hex(uint16_t hex) { } } -void send_unicode_hex_string(const char *str) -{ +void send_unicode_hex_string(const char *str) { if (!str) { return; } // Safety net while (*str) { diff --git a/quantum/process_keycode/process_unicode_common.h b/quantum/process_keycode/process_unicode_common.h index 814b60c57..e78e1cec6 100644 --- a/quantum/process_keycode/process_unicode_common.h +++ b/quantum/process_keycode/process_unicode_common.h @@ -28,6 +28,7 @@ static uint8_t input_mode; void set_unicode_input_mode(uint8_t os_target); uint8_t get_unicode_input_mode(void); +void unicode_input_mode_init(void); void unicode_input_start(void); void unicode_input_finish(void); void register_hex(uint16_t hex); diff --git a/quantum/process_keycode/process_unicodemap.c b/quantum/process_keycode/process_unicodemap.c index 47c27b911..ab5717ba3 100644 --- a/quantum/process_keycode/process_unicodemap.c +++ b/quantum/process_keycode/process_unicodemap.c @@ -45,6 +45,7 @@ __attribute__((weak)) void unicode_map_input_error() {} bool process_unicode_map(uint16_t keycode, keyrecord_t *record) { + unicode_input_mode_init(); uint8_t input_mode = get_unicode_input_mode(); if ((keycode & QK_UNICODE_MAP) == QK_UNICODE_MAP && record->event.pressed) { const uint32_t* map = unicode_map; From ae31eb564a340cab53f18fe5290ee5033704be1f Mon Sep 17 00:00:00 2001 From: Trigotometry <25544371+Trigotometry@users.noreply.github.com> Date: Sat, 20 Oct 2018 02:40:46 +1100 Subject: [PATCH 312/788] Keymap: Trigotometry's Preonic (#4158) * adding my keymap * updated pull request comments from dashna, including redundancies and DVORAK entirely * changed over visual representation to use 'LAYOUT_preonic_grid()' * added a ReadMe and commented out AUDIO_ENABLED related stuff in keymap.c until I can align with current QMK standards * Update readme.md * readme corrections and adjustments --- .../preonic/keymaps/trigotometry/config.h | 8 + .../preonic/keymaps/trigotometry/keymap.c | 165 ++++++++++++++++++ .../preonic/keymaps/trigotometry/readme.md | 75 ++++++++ .../preonic/keymaps/trigotometry/rules.mk | 2 + 4 files changed, 250 insertions(+) create mode 100644 keyboards/preonic/keymaps/trigotometry/config.h create mode 100644 keyboards/preonic/keymaps/trigotometry/keymap.c create mode 100644 keyboards/preonic/keymaps/trigotometry/readme.md create mode 100644 keyboards/preonic/keymaps/trigotometry/rules.mk diff --git a/keyboards/preonic/keymaps/trigotometry/config.h b/keyboards/preonic/keymaps/trigotometry/config.h new file mode 100644 index 000000000..eaf6997db --- /dev/null +++ b/keyboards/preonic/keymaps/trigotometry/config.h @@ -0,0 +1,8 @@ +#pragma once + +#define STARTUP_SONG SONG(PREONIC_SOUND) +#define MUSIC_MASK (keycode != KC_NO) + +#define FORCE_NKRO 1 +#define PREVENT_STUCK_MODIFIERS +#define GRAVE_ESC_GUI_OVERRIDE \ No newline at end of file diff --git a/keyboards/preonic/keymaps/trigotometry/keymap.c b/keyboards/preonic/keymaps/trigotometry/keymap.c new file mode 100644 index 000000000..31cee4a4c --- /dev/null +++ b/keyboards/preonic/keymaps/trigotometry/keymap.c @@ -0,0 +1,165 @@ +#include QMK_KEYBOARD_H +#ifdef AUDIO_ENABLE + #include "audio.h" +#endif + +// Layer declarations +enum preonic_layers { + _QWERTY = 1, + _GAMING = 2, + _LOWER = 3, + _RAISE = 4, +}; + +enum preonic_keycodes { + QWERTY = SAFE_RANGE, + GAMING, + LOWER, + RAISE, +}; + +// QMK predefined macros +#define SFT_ENT SFT_T(KC_ENT) // Tap for Enter, hold for Shift + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* QWERTY + * ,-----------------------------------------------------------------------------------. + * | GEsc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Shft | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * |SFTENT| Z | X | C | V | B | N | M | , | . | / | Entr | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | Ctrl | Alt | Supr |Lower | Space | Raise| Left | Down | Up | Rght | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = LAYOUT_preonic_grid( + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + SFT_ENT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_ENT, \ + XXXXXXX, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Gaming + * ,-----------------------------------------------------------------------------------. + * | Grve | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Shft | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shft | Z | X | C | V | B | N | M | , | . | / | Entr | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Ctrl | Ctrl | Alt | Alt |Lower | Space | Raise| Left | Down | Up | Rght | + * `-----------------------------------------------------------------------------------' + */ +[_GAMING] = LAYOUT_preonic_grid( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, \ + KC_LCTL, KC_LCTL, KC_LALT, KC_LALT, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | Esc | F1 | F2 | F3 | F4 | F5 | F6 | | * | / | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | VolD | Up | VolU | | | 7 | 8 | 9 | - | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | Left | Down | Rght | | | 4 | 5 | 6 | + | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | Prev | Play | Skip | | | 1 | 2 | 3 | = | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | Supr | | | 0 | Home |PageDn|PageUp| End | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT_preonic_grid( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, XXXXXXX, KC_PAST, KC_PSLS, XXXXXXX, KC_DEL, \ + _______, XXXXXXX, KC_VOLD, KC_UP, KC_VOLU, XXXXXXX, XXXXXXX, KC_7, KC_8, KC_9, KC_PMNS, KC_BSPC, \ + _______, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX, XXXXXXX, KC_4, KC_5, KC_6, KC_PPLS, XXXXXXX, \ + _______, XXXXXXX, KC_MRWD, KC_MPLY, KC_MFFD, XXXXXXX, XXXXXXX, KC_1, KC_2, KC_3, KC_PEQL, KC_ENT, \ + _______, _______, _______, KC_LGUI, _______, _______, _______, KC_0, KC_HOME, KC_PGDN, KC_PGUP, KC_END \ +), + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | F12 | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | \ | | | / | | | | | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | | [ | { | ( | < | > | ) | } | ] | | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | + | - | _ | = | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | |Qwerty| Game | | Reset| + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT_preonic_grid( + KC_F12, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11 , \ + _______, XXXXXXX, XXXXXXX, XXXXXXX, KC_BSLS, XXXXXXX, XXXXXXX, KC_PSLS, XXXXXXX, XXXXXXX, XXXXXXX, _______, \ + _______, KC_PIPE, KC_LBRC, KC_LCBR, KC_LPRN, KC_LABK, KC_RABK, KC_RPRN, KC_RCBR, KC_RBRC, KC_PIPE, XXXXXXX, \ + _______, XXXXXXX, XXXXXXX, XXXXXXX, KC_PPLS, KC_PMNS, KC_UNDS, KC_EQL, XXXXXXX, XXXXXXX, XXXXXXX, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, QWERTY , GAMING, XXXXXXX, RESET \ +) + +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + + case QWERTY: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + } else { + layer_off(_LOWER); + } + return false; + break; + + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + } else { + layer_off(_RAISE); + } + return false; + break; + + case GAMING: + if (record->event.pressed) { + set_single_persistent_default_layer(_GAMING); + } + return false; + break; + + } + return true; +}; + +// NFI how to bring this inline with current QMK standards yet, or it's redundant and don't use it. +// #ifdef AUDIO_ENABLE +// float tone_startup[][2] = { +// {NOTE_D5, 8}, +// {NOTE_E6, 8}, +// {NOTE_D6, 8}, +// {NOTE_E5, 8} +// }; + +// void startup_user() +// { +// _delay_ms(20); // gets rid of tick +// PLAY_SONG(tone_startup); +// } +// #endif diff --git a/keyboards/preonic/keymaps/trigotometry/readme.md b/keyboards/preonic/keymaps/trigotometry/readme.md new file mode 100644 index 000000000..aff01a22e --- /dev/null +++ b/keyboards/preonic/keymaps/trigotometry/readme.md @@ -0,0 +1,75 @@ +# Trigotometry's v1.0 + +This layout is the confluence of the standard Preonic QWERTY layout and some of my own tweaks to make it's software as logical and straight cut as it's physical presence, at least in my eyes. Some might say there's wasted space, though possibly true, I believe in keeping it minimal and only adding what is really needed. So if, like me, you're also beginning your journey of coding and enjoy some downtime with friends on the battlefield I think you'll find this layout a stellar place to kick off your customisation. + +## Qwerty + /* Qwerty + * ,-----------------------------------------------------------------------------------. + * | GEsc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Shft | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * |SFTENT| Z | X | C | V | B | N | M | , | . | / | ENT | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | Ctrl | Alt | Supr |Lower | Space | Raise| Left | Down | Up | Rght | + * `----------------------------------------------------------------------------------- + */ +Take note of the dual Enter keys, located where normally there'd be a pair of Shifts. I did this to ensure the alphas stayed in the same spot when compared to a staggered and standard board. My brain found it easier to switch the mods across keyboard than the relative position in the alphas, however it's easy to reverse the Enters/Shifts and you'll be back an (nearly) square one! + +Also, LEnter acts as a Shift if it's held. + + + +## Gaming + /* Gaming + * ,-----------------------------------------------------------------------------------. + * | Grve | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Shft | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shft | Z | X | C | V | B | N | M | , | . | / | Entr | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Ctrl | Ctrl | Alt | Alt |Lower | Space | Raise| Left | Down | Up | Rght | + * `-----------------------------------------------------------------------------------' + */ +Honestly it's pretty standard, however I've doubled up on the important modifiers and removed the Super. It's still accessable readily by holding Lower and the key to it's left. Neato? I thought so. + + + +## Raise Layer + /* Raise + * ,-----------------------------------------------------------------------------------. + * | F12 | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | \ | | | / | | | | | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | | [ | { | ( | < | > | ) | } | ] | | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | + | - | _ | = | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | |Qwerty| Game | | Reset| + * `-----------------------------------------------------------------------------------' + */ +Pretty self explanatory I think. + + + +## Lower Layer + /* Lower + * ,-----------------------------------------------------------------------------------. + * | Esc | F1 | F2 | F3 | F4 | F5 | F6 | | * | / | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | VolD | Up | VolU | | | 7 | 8 | 9 | - | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | Left | Down | Rght | | | 4 | 5 | 6 | + | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | Prev | Play | Skip | | | 1 | 2 | 3 | = | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | Supr | | | 0 | Home |PageDn|PageUp| End | + * `-----------------------------------------------------------------------------------' + */ + Music controls and arrows in prime location. F1-F6 there for extra mappings when in the Gaming layer. diff --git a/keyboards/preonic/keymaps/trigotometry/rules.mk b/keyboards/preonic/keymaps/trigotometry/rules.mk new file mode 100644 index 000000000..a6bcd5637 --- /dev/null +++ b/keyboards/preonic/keymaps/trigotometry/rules.mk @@ -0,0 +1,2 @@ +#Build Options +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) From 6c6897f7789f67076ea2f3f9cfe47da814e599fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20=C4=90or=C4=91evi=C4=87?= Date: Fri, 19 Oct 2018 17:42:01 +0200 Subject: [PATCH 313/788] Keymap: Update whitefox/konstantin keymap (#4169) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * td_fn_ctrl_* → td_fn_rctl_* * Swap Fn and RCtrl * Change key combination for Command feature * Replace register/unregister_code call with tap_code * Add virtual desktop controls to keymap * Add/close virtual desktop on Fn+GUI tap dance --- .../whitefox/keymaps/konstantin/config.h | 3 ++ .../whitefox/keymaps/konstantin/keymap.c | 34 +++++++++++-------- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/keyboards/whitefox/keymaps/konstantin/config.h b/keyboards/whitefox/keymaps/konstantin/config.h index ad40105a7..725609b46 100644 --- a/keyboards/whitefox/keymaps/konstantin/config.h +++ b/keyboards/whitefox/keymaps/konstantin/config.h @@ -12,3 +12,6 @@ #define MOUSEKEY_TIME_TO_MAX 50 #define MOUSEKEY_WHEEL_MAX_SPEED 1 #define MOUSEKEY_WHEEL_TIME_TO_MAX 50 + +#undef IS_COMMAND +#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RCTL))) diff --git a/keyboards/whitefox/keymaps/konstantin/keymap.c b/keyboards/whitefox/keymaps/konstantin/keymap.c index 6998798e3..247bc6bbf 100644 --- a/keyboards/whitefox/keymaps/konstantin/keymap.c +++ b/keyboards/whitefox/keymaps/konstantin/keymap.c @@ -2,9 +2,12 @@ #define FN MO(L_FN) #define FN_CAPS LT(L_FN, KC_CAPS) -#define FN_RCTL TD(TD_FN_RCTL) // Unused -#define RLALT TD(TD_RLALT) // Unused +#define FN_RCTL TD(TD_FN_RCTL) // Unused +#define RLALT TD(TD_RLALT) // Unused +#define DESKTOP TD(TD_DESKTOP) +#define DESKT_L LCTL(LGUI(KC_LEFT)) +#define DESKT_R LCTL(LGUI(KC_RGHT)) #define TOP LCTL(KC_HOME) #define BOTTOM LCTL(KC_END) @@ -46,8 +49,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) layer_invert(L_NUMPAD); bool num_lock = host_keyboard_leds() & 1<count & 1) { layer_on(L_FN); } if (state->count & 2) { register_code(KC_RCTL); } } -void td_fn_ctrl_reset(qk_tap_dance_state_t *state, void *user_data) +void td_fn_rctl_reset(qk_tap_dance_state_t *state, void *user_data) { if (state->count & 1) { layer_off(L_FN); } if (state->count & 2) { unregister_code(KC_RCTL); } } qk_tap_dance_action_t tap_dance_actions[] = { - [TD_FN_RCTL] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, td_fn_ctrl_finished, td_fn_ctrl_reset), + [TD_FN_RCTL] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, td_fn_rctl_finished, td_fn_rctl_reset), [TD_RLALT] = ACTION_TAP_DANCE_DOUBLE(KC_RALT, KC_LALT), + [TD_DESKTOP] = ACTION_TAP_DANCE_DOUBLE(LCTL(LGUI(KC_D)), LCTL(LGUI(KC_F4))), // Add/close virtual desktop }; const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { @@ -89,17 +93,17 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |---------------------------------------------------------------| * |FnCaps| A | S | D | F | G | H | J | K | L | ; | ' | Enter |PgU| * |---------------------------------------------------------------| - * | LShift | Z | X | C | V | B | N | M | , | . | / | Fn | ↑ |PgD| + * | LShift | Z | X | C | V | B | N | M | , | . | / |RCtrl | ↑ |PgD| * |---------------------------------------------------------------| - * |LCtl|LGui|LAlt| Space |RAlt|RCtl| | ← | ↓ | → | + * |LCtl|LGui|LAlt| Space |RAlt| Fn | | ← | ↓ | → | * `---------------------------------------------------------------' */ [L_BASE] = LAYOUT_truefox( \ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL, KC_BSLS,KC_GRV, KC_PSCR, \ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC,KC_BSPC, KC_DEL, \ FN_CAPS,KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_ENT, KC_PGUP, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,FN, KC_UP, KC_PGDN, \ - KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,KC_RCTL, KC_UP, KC_PGDN, \ + KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,FN, KC_LEFT,KC_DOWN,KC_RGHT \ ), /* Function layer @@ -110,17 +114,17 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |---------------------------------------------------------------| * | |M← |M↓ |M→ |MW↑| | | | | | | | |Top| * |---------------------------------------------------------------| - * | |MA0|MA2|MW←|MW→| | | |VoD|VoU|Mut| |PgU|Btm| + * | |MA0|MA2|MW←|MW→| | | |VoD|VoU|Mut| App |PgU|Btm| * |---------------------------------------------------------------| - * | | | | MW↓ | |Menu| |Hom|PgD|End| + * | |Dstp|Dst←| MW↓ |Dst→| | |Hom|PgD|End| * `---------------------------------------------------------------' */ [L_FN] = LAYOUT_truefox( \ _______,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, NUMPAD, KC_SLCK,KC_PAUS, \ KC_BTN4,KC_BTN2,KC_MS_U,KC_BTN1,KC_BTN3,KC_BTN5,_______,_______,_______,KC_MSTP,KC_MPLY,KC_MPRV,KC_MNXT,CLEAR, KC_INS, \ _______,KC_MS_L,KC_MS_D,KC_MS_R,KC_WH_U,_______,_______,_______,_______,_______,_______,_______, _______, TOP, \ - _______, KC_ACL0,KC_ACL2,KC_WH_L,KC_WH_R,_______,_______,_______,KC_VOLD,KC_VOLU,KC_MUTE,_______, KC_PGUP,BOTTOM, \ - _______,_______,_______, KC_WH_D, _______,KC_APP, KC_HOME,KC_PGDN,KC_END \ + _______, KC_ACL0,KC_ACL2,KC_WH_L,KC_WH_R,_______,_______,_______,KC_VOLD,KC_VOLU,KC_MUTE,KC_APP, KC_PGUP,BOTTOM, \ + _______,DESKTOP,DESKT_L, KC_WH_D, DESKT_R,_______, KC_HOME,KC_PGDN,KC_END \ ), /* Numpad layer From efc88a0b16055dc0b2f94da8c46ea8fadeab70f4 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 20 Oct 2018 02:43:55 +1100 Subject: [PATCH 314/788] Keymap: qwerty_code_friendly: use numpad layout for f-keys (#4170) --- .../ergodox/qwerty_code_friendly/keymap.c | 26 +++++++++---------- .../ergodox/qwerty_code_friendly/readme.md | 13 ++++++---- lib/chibios-contrib | 2 +- 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/layouts/community/ergodox/qwerty_code_friendly/keymap.c b/layouts/community/ergodox/qwerty_code_friendly/keymap.c index f882d0e00..2a441be0e 100644 --- a/layouts/community/ergodox/qwerty_code_friendly/keymap.c +++ b/layouts/community/ergodox/qwerty_code_friendly/keymap.c @@ -403,16 +403,16 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, K80(L1K2), K80(L1K3), KC_TRNS, KC_TRNS, KC_TRNS ), -/* Keymap 2: Numbers, media and mouse keys +/* Keymap 2: FKeys, media & mouse keys * * .--------------------------------------------------. .--------------------------------------------------. - * | | 1 | 2 | 3 | 4 | 5 | | | Mute | 6 | 7 | 8 | 9 | 0 | | + * | | | | | | | | | Mute | | F10 | F11 | F12 | | | * |--------+------+------+------+------+------+------| |------+------+------+------+------+------+--------| - * | | | | MsUp | | |MWhlUp| |VolUp | | | | | | | + * | | | | MsUp | | |MWhlUp| |VolUp | | F7 | F8 | F9 | | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | |MsLeft|MsDown|MsRght| |------| |------| Left | Down | Up |Right | | | + * | | |MsLeft|MsDown|MsRght| |------| |------| | F4 | F5 | F6 | | | * |--------+------+------+------+------+------|MWhlDn| |VolDn |------+------+------+------+------+--------| - * | | | Rclk | Mclk | Lclk | | | | | | | | | | | + * | | | Rclk | Mclk | Lclk | | | | | | F1 | F2 | F3 | | | * '--------+------+------+------+------+-------------' '-------------+------+------+------+------+--------' * | | | | | | | | | | | | * '----------------------------------' '----------------------------------' @@ -427,7 +427,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* MEDIA, MOUSE & NUMBERS */ [LAYER_MDIA] = LAYOUT_ergodox_76_or_80( /* left hand */ - KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_WH_U, KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN2, KC_BTN3, KC_BTN1, KC_TRNS, KC_WH_D, @@ -436,10 +436,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { K80(L2K0), K80(L2K1), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, /* right hand */ - KC_MUTE, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS, - KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_TRNS, KC_TRNS, - KC_VOLD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_MUTE, KC_TRNS, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS, + KC_VOLU, KC_TRNS, KC_F7, KC_F8, KC_F9, KC_TRNS, KC_TRNS, + KC_TRNS, KC_F4, KC_F5, KC_F6, KC_TRNS, KC_TRNS, + KC_VOLD, KC_TRNS, KC_F1, KC_F2, KC_F3, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MRWD, KC_MFFD, KC_MPRV, K80(L2K2), K80(L2K3), @@ -448,7 +448,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Keymap 3: Entire Words (one for each key) * * .--------------------------------------------------. .--------------------------------------------------. - * | | F1 | F2 | F3 | F4 | F5 | F11 | | F12 | F6 | F7 | F8 | F9 | F10 | | + * | | 1 | 2 | 3 | 4 | 5 | | | | 6 | 7 | 8 | 9 | 0 | | * |--------+------+------+------+------+------+------| |------+------+------+------+------+------+--------| * | | Q | W | E | R | T | | | | Y | U | I | O | P | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| @@ -470,7 +470,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* FKEY & WORDS */ [LAYER_FKEY] = LAYOUT_ergodox_76_or_80( /* left hand */ - KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11, + KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_TRNS, KC_TRNS, M_WORD_Q, M_WORD_W, M_WORD_E, M_WORD_R, M_WORD_T, KC_TRNS, KC_TRNS, M_WORD_A, M_WORD_S, M_WORD_D, M_WORD_F, M_WORD_G, KC_TRNS, M_WORD_Z, M_WORD_X, M_WORD_C, M_WORD_V, M_WORD_B, KC_TRNS, @@ -479,7 +479,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { K80(L3K0), K80(L3K1), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, /* right hand */ - KC_F12, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS, + KC_TRNS, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS, KC_TRNS, M_WORD_Y, M_WORD_U, M_WORD_I, M_WORD_O, M_WORD_P, KC_TRNS, M_WORD_H, M_WORD_J, M_WORD_K, M_WORD_L, KC_TRNS, KC_TRNS, KC_TRNS, M_WORD_N, M_WORD_M, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, diff --git a/layouts/community/ergodox/qwerty_code_friendly/readme.md b/layouts/community/ergodox/qwerty_code_friendly/readme.md index 8bc15dd31..23afa656f 100644 --- a/layouts/community/ergodox/qwerty_code_friendly/readme.md +++ b/layouts/community/ergodox/qwerty_code_friendly/readme.md @@ -131,13 +131,13 @@ Notes: ``` .--------------------------------------------------. .--------------------------------------------------. -| | 1 | 2 | 3 | 4 | 5 | | | Mute | 6 | 7 | 8 | 9 | 0 | | +| | | | | | | | | Mute | | F10 | F11 | F12 | | | |--------+------+------+------+------+------+------| |------+------+------+------+------+------+--------| -| | | | MsUp | | |MWhlUp| |VolUp | | | | | | | +| | | | MsUp | | |MWhlUp| |VolUp | | F7 | F8 | F9 | | | |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| -| | |MsLeft|MsDown|MsRght| |------| |------| Left | Down | Up |Right | | | +| | |MsLeft|MsDown|MsRght| |------| |------| | F4 | F5 | F6 | | | |--------+------+------+------+------+------|MWhlDn| |VolDn |------+------+------+------+------+--------| -| | | Rclk | Mclk | Lclk | | | | | | | | | | | +| | | Rclk | Mclk | Lclk | | | | | | F1 | F2 | F3 | | | '--------+------+------+------+------+-------------' '-------------+------+------+------+------+--------' | | | | | | | | | | | | '----------------------------------' '----------------------------------' @@ -158,7 +158,7 @@ eg: `-DCFQ_WORD_E=\"my@email.com\"` ``` .--------------------------------------------------. .--------------------------------------------------. -| | F1 | F2 | F3 | F4 | F5 | F11 | | F12 | F6 | F7 | F8 | F9 | F10 | | +| | 1 | 2 | 3 | 4 | 5 | | | | 6 | 7 | 8 | 9 | 0 | | |--------+------+------+------+------+------+------| |------+------+------+------+------+------+--------| | | Q | W | E | R | T | | | | Y | U | I | O | P | | |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| @@ -179,6 +179,9 @@ eg: `-DCFQ_WORD_E=\"my@email.com\"` ## Changelog +- 2018/10/19 + Move F-Keys to numpad like layout. + - 2018/05/29 Add number keys for cases when keypad numbers are handled differently. diff --git a/lib/chibios-contrib b/lib/chibios-contrib index ede48346e..2de67e2f4 160000 --- a/lib/chibios-contrib +++ b/lib/chibios-contrib @@ -1 +1 @@ -Subproject commit ede48346eee4b8d6847c19bc01420bee76a5e486 +Subproject commit 2de67e2f4a268eae072c5fd76a1b160124cee4f6 From 78b48371aac3bc4ba468c9f7efcb742bafb81965 Mon Sep 17 00:00:00 2001 From: Kosuke Adachi Date: Sat, 20 Oct 2018 01:12:55 +0900 Subject: [PATCH 315/788] Keyboard: Update logo and commonize it (#4151) * Update logo and commonize it * Move the glcdfont.c to the lib and add it to the SRC values of the rules.mk in the keymap folders * Add static --- keyboards/crkbd/keymaps/default/rules.mk | 15 +- keyboards/crkbd/keymaps/drashna/glcdfont.c | 244 ------------------ keyboards/crkbd/keymaps/drashna/rules.mk | 15 +- keyboards/crkbd/keymaps/like_jis/glcdfont.c | 244 ------------------ keyboards/crkbd/keymaps/like_jis/keymap.c | 6 +- keyboards/crkbd/keymaps/like_jis/rules.mk | 15 +- .../crkbd/{keymaps/default => lib}/glcdfont.c | 113 ++++---- keyboards/crkbd/ssd1306.c | 3 +- 8 files changed, 85 insertions(+), 570 deletions(-) delete mode 100644 keyboards/crkbd/keymaps/drashna/glcdfont.c delete mode 100644 keyboards/crkbd/keymaps/like_jis/glcdfont.c rename keyboards/crkbd/{keymaps/default => lib}/glcdfont.c (76%) diff --git a/keyboards/crkbd/keymaps/default/rules.mk b/keyboards/crkbd/keymaps/default/rules.mk index 0edf1181f..5ee01e89e 100644 --- a/keyboards/crkbd/keymaps/default/rules.mk +++ b/keyboards/crkbd/keymaps/default/rules.mk @@ -4,24 +4,25 @@ # the appropriate keymap folder that will get included automatically # BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = no # Mouse keys(+4700) -EXTRAKEY_ENABLE = no # Audio control and System control(+450) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = no # Audio control and System control(+450) CONSOLE_ENABLE = no # Console for debug(+400) -COMMAND_ENABLE = no # Commands for debug and configuration +COMMAND_ENABLE = no # Commands for debug and configuration NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. -SWAP_HANDS_ENABLE = no # Enable one-hand typing +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SWAP_HANDS_ENABLE = no # Enable one-hand typing # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend # If you want to change the display of OLED, you need to change here -SRC += ./lib/rgb_state_reader.c \ +SRC += ./lib/glcdfont.c \ + ./lib/rgb_state_reader.c \ ./lib/layer_state_reader.c \ ./lib/logo_reader.c \ ./lib/keylogger.c \ diff --git a/keyboards/crkbd/keymaps/drashna/glcdfont.c b/keyboards/crkbd/keymaps/drashna/glcdfont.c deleted file mode 100644 index 4e7b27bc0..000000000 --- a/keyboards/crkbd/keymaps/drashna/glcdfont.c +++ /dev/null @@ -1,244 +0,0 @@ -// This is the 'classic' fixed-space bitmap font for Adafruit_GFX since 1.0. -// See gfxfont.h for newer custom bitmap font info. - -#ifndef FONT5X7_H -#define FONT5X7_H - -#ifdef __AVR__ - #include - #include -#elif defined(ESP8266) - #include -#else - #define PROGMEM -#endif - -// Standard ASCII 5x7 font - -static const unsigned char font[] PROGMEM = { -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x00, -0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x00, -0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x00, -0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x00, -0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x00, -0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00, -0x00, 0x18, 0x3C, 0x18, 0x00, 0x00, -0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00, -0x00, 0x18, 0x24, 0x18, 0x00, 0x00, -0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x00, -0x30, 0x48, 0x3A, 0x06, 0x0E, 0x00, -0x26, 0x29, 0x79, 0x29, 0x26, 0x00, -0x40, 0x7F, 0x05, 0x05, 0x07, 0x00, -0x40, 0x7F, 0x05, 0x25, 0x3F, 0x00, -0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x00, -0x7F, 0x3E, 0x1C, 0x1C, 0x08, 0x00, -0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x00, -0x14, 0x22, 0x7F, 0x22, 0x14, 0x00, -0x5F, 0x5F, 0x00, 0x5F, 0x5F, 0x00, -0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00, -0x00, 0x66, 0x89, 0x95, 0x6A, 0x00, -0x60, 0x60, 0x60, 0x60, 0x60, 0x00, -0x94, 0xA2, 0xFF, 0xA2, 0x94, 0x00, -0x08, 0x04, 0x7E, 0x04, 0x08, 0x00, -0x10, 0x20, 0x7E, 0x20, 0x10, 0x00, -0x08, 0x08, 0x2A, 0x1C, 0x08, 0x00, -0x08, 0x1C, 0x2A, 0x08, 0x08, 0x00, -0x1E, 0x10, 0x10, 0x10, 0x10, 0x00, -0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x00, -0x30, 0x38, 0x3E, 0x38, 0x30, 0x00, -0x06, 0x0E, 0x3E, 0x0E, 0x06, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, -0x00, 0x07, 0x00, 0x07, 0x00, 0x00, -0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00, -0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00, -0x23, 0x13, 0x08, 0x64, 0x62, 0x00, -0x36, 0x49, 0x56, 0x20, 0x50, 0x00, -0x00, 0x08, 0x07, 0x03, 0x00, 0x00, -0x00, 0x1C, 0x22, 0x41, 0x00, 0x00, -0x00, 0x41, 0x22, 0x1C, 0x00, 0x00, -0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x00, -0x08, 0x08, 0x3E, 0x08, 0x08, 0x00, -0x00, 0x80, 0x70, 0x30, 0x00, 0x00, -0x08, 0x08, 0x08, 0x08, 0x08, 0x00, -0x00, 0x00, 0x60, 0x60, 0x00, 0x00, -0x20, 0x10, 0x08, 0x04, 0x02, 0x00, -0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00, -0x00, 0x42, 0x7F, 0x40, 0x00, 0x00, -0x72, 0x49, 0x49, 0x49, 0x46, 0x00, -0x21, 0x41, 0x49, 0x4D, 0x33, 0x00, -0x18, 0x14, 0x12, 0x7F, 0x10, 0x00, -0x27, 0x45, 0x45, 0x45, 0x39, 0x00, -0x3C, 0x4A, 0x49, 0x49, 0x31, 0x00, -0x41, 0x21, 0x11, 0x09, 0x07, 0x00, -0x36, 0x49, 0x49, 0x49, 0x36, 0x00, -0x46, 0x49, 0x49, 0x29, 0x1E, 0x00, -0x00, 0x00, 0x14, 0x00, 0x00, 0x00, -0x00, 0x40, 0x34, 0x00, 0x00, 0x00, -0x00, 0x08, 0x14, 0x22, 0x41, 0x00, -0x14, 0x14, 0x14, 0x14, 0x14, 0x00, -0x00, 0x41, 0x22, 0x14, 0x08, 0x00, -0x02, 0x01, 0x59, 0x09, 0x06, 0x00, -0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x00, -0x7C, 0x12, 0x11, 0x12, 0x7C, 0x00, -0x7F, 0x49, 0x49, 0x49, 0x36, 0x00, -0x3E, 0x41, 0x41, 0x41, 0x22, 0x00, -0x7F, 0x41, 0x41, 0x41, 0x3E, 0x00, -0x7F, 0x49, 0x49, 0x49, 0x41, 0x00, -0x7F, 0x09, 0x09, 0x09, 0x01, 0x00, -0x3E, 0x41, 0x41, 0x51, 0x73, 0x00, -0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00, -0x00, 0x41, 0x7F, 0x41, 0x00, 0x00, -0x20, 0x40, 0x41, 0x3F, 0x01, 0x00, -0x7F, 0x08, 0x14, 0x22, 0x41, 0x00, -0x7F, 0x40, 0x40, 0x40, 0x40, 0x00, -0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x00, -0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00, -0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00, -0x7F, 0x09, 0x09, 0x09, 0x06, 0x00, -0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00, -0x7F, 0x09, 0x19, 0x29, 0x46, 0x00, -0x26, 0x49, 0x49, 0x49, 0x32, 0x00, -0x03, 0x01, 0x7F, 0x01, 0x03, 0x00, -0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00, -0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00, -0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00, -0x63, 0x14, 0x08, 0x14, 0x63, 0x00, -0x03, 0x04, 0x78, 0x04, 0x03, 0x00, -0x61, 0x59, 0x49, 0x4D, 0x43, 0x00, -0x00, 0x7F, 0x41, 0x41, 0x41, 0x00, -0x02, 0x04, 0x08, 0x10, 0x20, 0x00, -0x00, 0x41, 0x41, 0x41, 0x7F, 0x00, -0x04, 0x02, 0x01, 0x02, 0x04, 0x00, -0x40, 0x40, 0x40, 0x40, 0x40, 0x00, -0x00, 0x03, 0x07, 0x08, 0x00, 0x00, -0x20, 0x54, 0x54, 0x78, 0x40, 0x00, -0x7F, 0x28, 0x44, 0x44, 0x38, 0x00, -0x38, 0x44, 0x44, 0x44, 0x28, 0x00, -0x38, 0x44, 0x44, 0x28, 0x7F, 0x00, -0x38, 0x54, 0x54, 0x54, 0x18, 0x00, -0x00, 0x08, 0x7E, 0x09, 0x02, 0x00, -0x18, 0xA4, 0xA4, 0x9C, 0x78, 0x00, -0x7F, 0x08, 0x04, 0x04, 0x78, 0x00, -0x00, 0x44, 0x7D, 0x40, 0x00, 0x00, -0x20, 0x40, 0x40, 0x3D, 0x00, 0x00, -0x7F, 0x10, 0x28, 0x44, 0x00, 0x00, -0x00, 0x41, 0x7F, 0x40, 0x00, 0x00, -0x7C, 0x04, 0x78, 0x04, 0x78, 0x00, -0x7C, 0x08, 0x04, 0x04, 0x78, 0x00, -0x38, 0x44, 0x44, 0x44, 0x38, 0x00, -0xFC, 0x18, 0x24, 0x24, 0x18, 0x00, -0x18, 0x24, 0x24, 0x18, 0xFC, 0x00, -0x7C, 0x08, 0x04, 0x04, 0x08, 0x00, -0x48, 0x54, 0x54, 0x54, 0x24, 0x00, -0x04, 0x04, 0x3F, 0x44, 0x24, 0x00, -0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00, -0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00, -0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00, -0x44, 0x28, 0x10, 0x28, 0x44, 0x00, -0x4C, 0x90, 0x90, 0x90, 0x7C, 0x00, -0x44, 0x64, 0x54, 0x4C, 0x44, 0x00, -0x00, 0x08, 0x36, 0x41, 0x00, 0x00, -0x00, 0x00, 0x77, 0x00, 0x00, 0x00, -0x00, 0x41, 0x36, 0x08, 0x00, 0x00, -0x02, 0x01, 0x02, 0x04, 0x02, 0x00, -0x3C, 0x26, 0x23, 0x26, 0x3C, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x0E, 0x3F, 0xFF, 0xFF, -0xFF, 0xFF, 0xFE, 0xE0, 0x80, 0x00, -0x00, 0x00, 0x00, 0x00, 0x1E, 0xBE, -0x7F, 0xFF, 0xFF, 0xFE, 0xFE, 0xF0, -0xE0, 0xC0, 0x80, 0x00, 0x0E, 0xEF, -0xDF, 0xDE, 0xBE, 0x3C, 0x38, 0x70, -0xE0, 0xDD, 0xBB, 0x7B, 0x07, 0x0E, -0x0E, 0x0C, 0x98, 0xF0, 0xE0, 0xF0, -0xF0, 0xF8, 0x78, 0x3C, 0x1C, 0x1E, -0x0E, 0x0E, 0x0F, 0x0F, 0x0F, 0x0F, -0x1F, 0xFE, 0xFE, 0xF8, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xE0, 0xF0, 0xF0, 0xF0, 0xE0, 0xEC, -0xEE, 0xF7, 0xF3, 0x70, 0x20, 0x00, -0x7C, 0x7C, 0x7C, 0x7E, 0x00, 0x7E, -0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x00, -0x00, 0x80, 0xC0, 0xE0, 0x7E, 0x5B, -0x4F, 0x5B, 0xFE, 0xC0, 0x00, 0x00, -0xC0, 0x00, 0xDC, 0xD7, 0xDE, 0xDE, -0xDE, 0xD7, 0xDC, 0x00, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x03, -0x0F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFE, -0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x7F, -0xFF, 0xFE, 0xFD, 0xFB, 0x1B, 0x07, -0x07, 0x0F, 0x1F, 0x1F, 0x1E, 0x1D, -0x0B, 0x07, 0x01, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, -0xF8, 0xFE, 0xFF, 0xFF, 0x1F, 0x07, -0x01, 0x01, 0x01, 0x03, 0x06, 0x06, -0x0C, 0x0C, 0x08, 0x0C, 0x0C, 0x0E, -0x07, 0x83, 0xC1, 0xE0, 0x70, 0x30, -0x18, 0x1C, 0x7C, 0xCC, 0x8C, 0xDC, -0xF8, 0xC0, 0xE0, 0xE0, 0x70, 0xB8, -0xF0, 0x60, 0x00, 0x00, 0x80, 0xC0, -0xE0, 0xF0, 0x70, 0xF8, 0xFC, 0xFC, -0x3C, 0x30, 0x38, 0xF8, 0xF8, 0xF8, -0x78, 0x00, 0x80, 0x80, 0xC0, 0xE0, -0x70, 0x38, 0x38, 0x9C, 0xDC, 0xFC, -0x7C, 0x38, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x0F, 0x1F, 0x3F, 0x7F, 0x7F, 0x7F, -0x7F, 0x7F, 0x3F, 0x1E, 0x0C, 0x00, -0x1F, 0x1F, 0x1F, 0x3F, 0x00, 0x3F, -0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x00, -0x30, 0x7B, 0x7F, 0x78, 0x30, 0x20, -0x20, 0x30, 0x78, 0x7F, 0x3B, 0x00, -0x03, 0x00, 0x0F, 0x7F, 0x0F, 0x0F, -0x0F, 0x7F, 0x0F, 0x00, 0x03, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x03, 0x07, -0x1F, 0x3F, 0x3F, 0x7F, 0x7F, 0x7F, -0x7E, 0x7D, 0x3B, 0x17, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x07, -0x0F, 0x1F, 0x3F, 0x3F, 0x7E, 0x7C, -0x78, 0x70, 0x70, 0x70, 0x70, 0x70, -0x70, 0x78, 0x38, 0x18, 0x1C, 0x0E, -0x07, 0x0F, 0x1F, 0x3F, 0x3C, 0x38, -0x38, 0x18, 0x0C, 0x06, 0x03, 0x01, -0x01, 0x01, 0x01, 0x0E, 0x1F, 0x1F, -0x1C, 0x1C, 0x1E, 0x0F, 0x0F, 0x03, -0x1D, 0x0E, 0x07, 0x03, 0x01, 0x00, -0x00, 0x0E, 0x1F, 0x1F, 0x1D, 0x1E, -0x0F, 0x07, 0x03, 0x03, 0x0F, 0x1F, -0x1F, 0x19, 0x19, 0x19, 0x19, 0x0C, -0x0C, 0x04, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; -#endif // FONT5X7_H diff --git a/keyboards/crkbd/keymaps/drashna/rules.mk b/keyboards/crkbd/keymaps/drashna/rules.mk index f490aa2ea..8fca70448 100644 --- a/keyboards/crkbd/keymaps/drashna/rules.mk +++ b/keyboards/crkbd/keymaps/drashna/rules.mk @@ -4,24 +4,25 @@ # the appropriate keymap folder that will get included automatically # BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = no # Mouse keys(+4700) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) CONSOLE_ENABLE = no # Console for debug(+400) -COMMAND_ENABLE = no # Commands for debug and configuration -NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. -SWAP_HANDS_ENABLE = no # Enable one-hand typing +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SWAP_HANDS_ENABLE = no # Enable one-hand typing # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend # If you want to change the display of OLED, you need to change here -SRC += ./lib/rgb_state_reader.c \ +SRC += ./lib/glcdfont.c \ + ./lib/rgb_state_reader.c \ ./lib/layer_state_reader.c \ ./lib/logo_reader.c \ ./lib/keylogger.c \ diff --git a/keyboards/crkbd/keymaps/like_jis/glcdfont.c b/keyboards/crkbd/keymaps/like_jis/glcdfont.c deleted file mode 100644 index 4e7b27bc0..000000000 --- a/keyboards/crkbd/keymaps/like_jis/glcdfont.c +++ /dev/null @@ -1,244 +0,0 @@ -// This is the 'classic' fixed-space bitmap font for Adafruit_GFX since 1.0. -// See gfxfont.h for newer custom bitmap font info. - -#ifndef FONT5X7_H -#define FONT5X7_H - -#ifdef __AVR__ - #include - #include -#elif defined(ESP8266) - #include -#else - #define PROGMEM -#endif - -// Standard ASCII 5x7 font - -static const unsigned char font[] PROGMEM = { -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x00, -0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x00, -0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x00, -0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x00, -0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x00, -0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00, -0x00, 0x18, 0x3C, 0x18, 0x00, 0x00, -0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00, -0x00, 0x18, 0x24, 0x18, 0x00, 0x00, -0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x00, -0x30, 0x48, 0x3A, 0x06, 0x0E, 0x00, -0x26, 0x29, 0x79, 0x29, 0x26, 0x00, -0x40, 0x7F, 0x05, 0x05, 0x07, 0x00, -0x40, 0x7F, 0x05, 0x25, 0x3F, 0x00, -0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x00, -0x7F, 0x3E, 0x1C, 0x1C, 0x08, 0x00, -0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x00, -0x14, 0x22, 0x7F, 0x22, 0x14, 0x00, -0x5F, 0x5F, 0x00, 0x5F, 0x5F, 0x00, -0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00, -0x00, 0x66, 0x89, 0x95, 0x6A, 0x00, -0x60, 0x60, 0x60, 0x60, 0x60, 0x00, -0x94, 0xA2, 0xFF, 0xA2, 0x94, 0x00, -0x08, 0x04, 0x7E, 0x04, 0x08, 0x00, -0x10, 0x20, 0x7E, 0x20, 0x10, 0x00, -0x08, 0x08, 0x2A, 0x1C, 0x08, 0x00, -0x08, 0x1C, 0x2A, 0x08, 0x08, 0x00, -0x1E, 0x10, 0x10, 0x10, 0x10, 0x00, -0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x00, -0x30, 0x38, 0x3E, 0x38, 0x30, 0x00, -0x06, 0x0E, 0x3E, 0x0E, 0x06, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, -0x00, 0x07, 0x00, 0x07, 0x00, 0x00, -0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00, -0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00, -0x23, 0x13, 0x08, 0x64, 0x62, 0x00, -0x36, 0x49, 0x56, 0x20, 0x50, 0x00, -0x00, 0x08, 0x07, 0x03, 0x00, 0x00, -0x00, 0x1C, 0x22, 0x41, 0x00, 0x00, -0x00, 0x41, 0x22, 0x1C, 0x00, 0x00, -0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x00, -0x08, 0x08, 0x3E, 0x08, 0x08, 0x00, -0x00, 0x80, 0x70, 0x30, 0x00, 0x00, -0x08, 0x08, 0x08, 0x08, 0x08, 0x00, -0x00, 0x00, 0x60, 0x60, 0x00, 0x00, -0x20, 0x10, 0x08, 0x04, 0x02, 0x00, -0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00, -0x00, 0x42, 0x7F, 0x40, 0x00, 0x00, -0x72, 0x49, 0x49, 0x49, 0x46, 0x00, -0x21, 0x41, 0x49, 0x4D, 0x33, 0x00, -0x18, 0x14, 0x12, 0x7F, 0x10, 0x00, -0x27, 0x45, 0x45, 0x45, 0x39, 0x00, -0x3C, 0x4A, 0x49, 0x49, 0x31, 0x00, -0x41, 0x21, 0x11, 0x09, 0x07, 0x00, -0x36, 0x49, 0x49, 0x49, 0x36, 0x00, -0x46, 0x49, 0x49, 0x29, 0x1E, 0x00, -0x00, 0x00, 0x14, 0x00, 0x00, 0x00, -0x00, 0x40, 0x34, 0x00, 0x00, 0x00, -0x00, 0x08, 0x14, 0x22, 0x41, 0x00, -0x14, 0x14, 0x14, 0x14, 0x14, 0x00, -0x00, 0x41, 0x22, 0x14, 0x08, 0x00, -0x02, 0x01, 0x59, 0x09, 0x06, 0x00, -0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x00, -0x7C, 0x12, 0x11, 0x12, 0x7C, 0x00, -0x7F, 0x49, 0x49, 0x49, 0x36, 0x00, -0x3E, 0x41, 0x41, 0x41, 0x22, 0x00, -0x7F, 0x41, 0x41, 0x41, 0x3E, 0x00, -0x7F, 0x49, 0x49, 0x49, 0x41, 0x00, -0x7F, 0x09, 0x09, 0x09, 0x01, 0x00, -0x3E, 0x41, 0x41, 0x51, 0x73, 0x00, -0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00, -0x00, 0x41, 0x7F, 0x41, 0x00, 0x00, -0x20, 0x40, 0x41, 0x3F, 0x01, 0x00, -0x7F, 0x08, 0x14, 0x22, 0x41, 0x00, -0x7F, 0x40, 0x40, 0x40, 0x40, 0x00, -0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x00, -0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00, -0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00, -0x7F, 0x09, 0x09, 0x09, 0x06, 0x00, -0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00, -0x7F, 0x09, 0x19, 0x29, 0x46, 0x00, -0x26, 0x49, 0x49, 0x49, 0x32, 0x00, -0x03, 0x01, 0x7F, 0x01, 0x03, 0x00, -0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00, -0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00, -0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00, -0x63, 0x14, 0x08, 0x14, 0x63, 0x00, -0x03, 0x04, 0x78, 0x04, 0x03, 0x00, -0x61, 0x59, 0x49, 0x4D, 0x43, 0x00, -0x00, 0x7F, 0x41, 0x41, 0x41, 0x00, -0x02, 0x04, 0x08, 0x10, 0x20, 0x00, -0x00, 0x41, 0x41, 0x41, 0x7F, 0x00, -0x04, 0x02, 0x01, 0x02, 0x04, 0x00, -0x40, 0x40, 0x40, 0x40, 0x40, 0x00, -0x00, 0x03, 0x07, 0x08, 0x00, 0x00, -0x20, 0x54, 0x54, 0x78, 0x40, 0x00, -0x7F, 0x28, 0x44, 0x44, 0x38, 0x00, -0x38, 0x44, 0x44, 0x44, 0x28, 0x00, -0x38, 0x44, 0x44, 0x28, 0x7F, 0x00, -0x38, 0x54, 0x54, 0x54, 0x18, 0x00, -0x00, 0x08, 0x7E, 0x09, 0x02, 0x00, -0x18, 0xA4, 0xA4, 0x9C, 0x78, 0x00, -0x7F, 0x08, 0x04, 0x04, 0x78, 0x00, -0x00, 0x44, 0x7D, 0x40, 0x00, 0x00, -0x20, 0x40, 0x40, 0x3D, 0x00, 0x00, -0x7F, 0x10, 0x28, 0x44, 0x00, 0x00, -0x00, 0x41, 0x7F, 0x40, 0x00, 0x00, -0x7C, 0x04, 0x78, 0x04, 0x78, 0x00, -0x7C, 0x08, 0x04, 0x04, 0x78, 0x00, -0x38, 0x44, 0x44, 0x44, 0x38, 0x00, -0xFC, 0x18, 0x24, 0x24, 0x18, 0x00, -0x18, 0x24, 0x24, 0x18, 0xFC, 0x00, -0x7C, 0x08, 0x04, 0x04, 0x08, 0x00, -0x48, 0x54, 0x54, 0x54, 0x24, 0x00, -0x04, 0x04, 0x3F, 0x44, 0x24, 0x00, -0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00, -0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00, -0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00, -0x44, 0x28, 0x10, 0x28, 0x44, 0x00, -0x4C, 0x90, 0x90, 0x90, 0x7C, 0x00, -0x44, 0x64, 0x54, 0x4C, 0x44, 0x00, -0x00, 0x08, 0x36, 0x41, 0x00, 0x00, -0x00, 0x00, 0x77, 0x00, 0x00, 0x00, -0x00, 0x41, 0x36, 0x08, 0x00, 0x00, -0x02, 0x01, 0x02, 0x04, 0x02, 0x00, -0x3C, 0x26, 0x23, 0x26, 0x3C, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x0E, 0x3F, 0xFF, 0xFF, -0xFF, 0xFF, 0xFE, 0xE0, 0x80, 0x00, -0x00, 0x00, 0x00, 0x00, 0x1E, 0xBE, -0x7F, 0xFF, 0xFF, 0xFE, 0xFE, 0xF0, -0xE0, 0xC0, 0x80, 0x00, 0x0E, 0xEF, -0xDF, 0xDE, 0xBE, 0x3C, 0x38, 0x70, -0xE0, 0xDD, 0xBB, 0x7B, 0x07, 0x0E, -0x0E, 0x0C, 0x98, 0xF0, 0xE0, 0xF0, -0xF0, 0xF8, 0x78, 0x3C, 0x1C, 0x1E, -0x0E, 0x0E, 0x0F, 0x0F, 0x0F, 0x0F, -0x1F, 0xFE, 0xFE, 0xF8, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xE0, 0xF0, 0xF0, 0xF0, 0xE0, 0xEC, -0xEE, 0xF7, 0xF3, 0x70, 0x20, 0x00, -0x7C, 0x7C, 0x7C, 0x7E, 0x00, 0x7E, -0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x00, -0x00, 0x80, 0xC0, 0xE0, 0x7E, 0x5B, -0x4F, 0x5B, 0xFE, 0xC0, 0x00, 0x00, -0xC0, 0x00, 0xDC, 0xD7, 0xDE, 0xDE, -0xDE, 0xD7, 0xDC, 0x00, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x03, -0x0F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFE, -0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x7F, -0xFF, 0xFE, 0xFD, 0xFB, 0x1B, 0x07, -0x07, 0x0F, 0x1F, 0x1F, 0x1E, 0x1D, -0x0B, 0x07, 0x01, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, -0xF8, 0xFE, 0xFF, 0xFF, 0x1F, 0x07, -0x01, 0x01, 0x01, 0x03, 0x06, 0x06, -0x0C, 0x0C, 0x08, 0x0C, 0x0C, 0x0E, -0x07, 0x83, 0xC1, 0xE0, 0x70, 0x30, -0x18, 0x1C, 0x7C, 0xCC, 0x8C, 0xDC, -0xF8, 0xC0, 0xE0, 0xE0, 0x70, 0xB8, -0xF0, 0x60, 0x00, 0x00, 0x80, 0xC0, -0xE0, 0xF0, 0x70, 0xF8, 0xFC, 0xFC, -0x3C, 0x30, 0x38, 0xF8, 0xF8, 0xF8, -0x78, 0x00, 0x80, 0x80, 0xC0, 0xE0, -0x70, 0x38, 0x38, 0x9C, 0xDC, 0xFC, -0x7C, 0x38, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x0F, 0x1F, 0x3F, 0x7F, 0x7F, 0x7F, -0x7F, 0x7F, 0x3F, 0x1E, 0x0C, 0x00, -0x1F, 0x1F, 0x1F, 0x3F, 0x00, 0x3F, -0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x00, -0x30, 0x7B, 0x7F, 0x78, 0x30, 0x20, -0x20, 0x30, 0x78, 0x7F, 0x3B, 0x00, -0x03, 0x00, 0x0F, 0x7F, 0x0F, 0x0F, -0x0F, 0x7F, 0x0F, 0x00, 0x03, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x03, 0x07, -0x1F, 0x3F, 0x3F, 0x7F, 0x7F, 0x7F, -0x7E, 0x7D, 0x3B, 0x17, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x07, -0x0F, 0x1F, 0x3F, 0x3F, 0x7E, 0x7C, -0x78, 0x70, 0x70, 0x70, 0x70, 0x70, -0x70, 0x78, 0x38, 0x18, 0x1C, 0x0E, -0x07, 0x0F, 0x1F, 0x3F, 0x3C, 0x38, -0x38, 0x18, 0x0C, 0x06, 0x03, 0x01, -0x01, 0x01, 0x01, 0x0E, 0x1F, 0x1F, -0x1C, 0x1C, 0x1E, 0x0F, 0x0F, 0x03, -0x1D, 0x0E, 0x07, 0x03, 0x01, 0x00, -0x00, 0x0E, 0x1F, 0x1F, 0x1D, 0x1E, -0x0F, 0x07, 0x03, 0x03, 0x0F, 0x1F, -0x1F, 0x19, 0x19, 0x19, 0x19, 0x0C, -0x0C, 0x04, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; -#endif // FONT5X7_H diff --git a/keyboards/crkbd/keymaps/like_jis/keymap.c b/keyboards/crkbd/keymaps/like_jis/keymap.c index 90e5b7ec1..05d31845c 100644 --- a/keyboards/crkbd/keymaps/like_jis/keymap.c +++ b/keyboards/crkbd/keymaps/like_jis/keymap.c @@ -109,7 +109,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { int RGB_current_mode; // Setting ADJUST layer RGB back to default -inline void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) { +static inline void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) { if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) { layer_on(layer3); } else { @@ -155,7 +155,7 @@ void matrix_scan_user(void) { iota_gfx_task(); } -inline void matrix_render_user(struct CharacterMatrix *matrix) { +static inline void matrix_render_user(struct CharacterMatrix *matrix) { if (is_master) { // If you want to change the display of OLED, you need to change here matrix_write_ln(matrix, read_layer_state()); @@ -171,7 +171,7 @@ inline void matrix_render_user(struct CharacterMatrix *matrix) { } } -inline void matrix_update(struct CharacterMatrix *dest, const struct CharacterMatrix *source) { +static inline void matrix_update(struct CharacterMatrix *dest, const struct CharacterMatrix *source) { if (memcmp(dest->display, source->display, sizeof(dest->display))) { memcpy(dest->display, source->display, sizeof(dest->display)); dest->dirty = true; diff --git a/keyboards/crkbd/keymaps/like_jis/rules.mk b/keyboards/crkbd/keymaps/like_jis/rules.mk index 0edf1181f..5ee01e89e 100644 --- a/keyboards/crkbd/keymaps/like_jis/rules.mk +++ b/keyboards/crkbd/keymaps/like_jis/rules.mk @@ -4,24 +4,25 @@ # the appropriate keymap folder that will get included automatically # BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = no # Mouse keys(+4700) -EXTRAKEY_ENABLE = no # Audio control and System control(+450) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = no # Audio control and System control(+450) CONSOLE_ENABLE = no # Console for debug(+400) -COMMAND_ENABLE = no # Commands for debug and configuration +COMMAND_ENABLE = no # Commands for debug and configuration NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. -SWAP_HANDS_ENABLE = no # Enable one-hand typing +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SWAP_HANDS_ENABLE = no # Enable one-hand typing # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend # If you want to change the display of OLED, you need to change here -SRC += ./lib/rgb_state_reader.c \ +SRC += ./lib/glcdfont.c \ + ./lib/rgb_state_reader.c \ ./lib/layer_state_reader.c \ ./lib/logo_reader.c \ ./lib/keylogger.c \ diff --git a/keyboards/crkbd/keymaps/default/glcdfont.c b/keyboards/crkbd/lib/glcdfont.c similarity index 76% rename from keyboards/crkbd/keymaps/default/glcdfont.c rename to keyboards/crkbd/lib/glcdfont.c index 4e7b27bc0..f7567c57c 100644 --- a/keyboards/crkbd/keymaps/default/glcdfont.c +++ b/keyboards/crkbd/lib/glcdfont.c @@ -14,8 +14,7 @@ #endif // Standard ASCII 5x7 font - -static const unsigned char font[] PROGMEM = { +const unsigned char font[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x00, 0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x00, @@ -119,7 +118,7 @@ static const unsigned char font[] PROGMEM = { 0x38, 0x44, 0x44, 0x28, 0x7F, 0x00, 0x38, 0x54, 0x54, 0x54, 0x18, 0x00, 0x00, 0x08, 0x7E, 0x09, 0x02, 0x00, -0x18, 0xA4, 0xA4, 0x9C, 0x78, 0x00, +0x18, 0x24, 0x24, 0x1C, 0x78, 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78, 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00, 0x00, 0x20, 0x40, 0x40, 0x3D, 0x00, 0x00, @@ -128,8 +127,8 @@ static const unsigned char font[] PROGMEM = { 0x7C, 0x04, 0x78, 0x04, 0x78, 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78, 0x00, 0x38, 0x44, 0x44, 0x44, 0x38, 0x00, -0xFC, 0x18, 0x24, 0x24, 0x18, 0x00, -0x18, 0x24, 0x24, 0x18, 0xFC, 0x00, +0x7C, 0x18, 0x24, 0x24, 0x18, 0x00, +0x18, 0x24, 0x24, 0x18, 0x7C, 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08, 0x00, 0x48, 0x54, 0x54, 0x54, 0x24, 0x00, 0x04, 0x04, 0x3F, 0x44, 0x24, 0x00, @@ -145,24 +144,24 @@ static const unsigned char font[] PROGMEM = { 0x02, 0x01, 0x02, 0x04, 0x02, 0x00, 0x3C, 0x26, 0x23, 0x26, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x0E, 0x3F, 0xFF, 0xFF, -0xFF, 0xFF, 0xFE, 0xE0, 0x80, 0x00, -0x00, 0x00, 0x00, 0x00, 0x1E, 0xBE, -0x7F, 0xFF, 0xFF, 0xFE, 0xFE, 0xF0, -0xE0, 0xC0, 0x80, 0x00, 0x0E, 0xEF, -0xDF, 0xDE, 0xBE, 0x3C, 0x38, 0x70, -0xE0, 0xDD, 0xBB, 0x7B, 0x07, 0x0E, -0x0E, 0x0C, 0x98, 0xF0, 0xE0, 0xF0, -0xF0, 0xF8, 0x78, 0x3C, 0x1C, 0x1E, -0x0E, 0x0E, 0x0F, 0x0F, 0x0F, 0x0F, -0x1F, 0xFE, 0xFE, 0xF8, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, +0xF0, 0xF8, 0xF8, 0x18, 0x00, 0xC0, +0xF0, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0xC0, 0xE0, 0xE0, +0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, +0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, +0x80, 0xC0, 0xE0, 0xE0, 0xE0, 0xE0, +0xE0, 0xE0, 0xE0, 0xE0, 0xC0, 0x80, +0x00, 0x00, 0x00, 0xE0, 0xE0, 0xC0, +0xC0, 0xE0, 0xE0, 0xE0, 0xE0, 0x00, +0x00, 0xE0, 0xE0, 0xC0, 0xC0, 0xE0, +0xE0, 0xE0, 0xE0, 0xE0, 0xC0, 0x80, +0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, +0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, +0xE0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xF0, 0xF0, 0xF0, 0xE0, 0xEC, @@ -177,25 +176,25 @@ static const unsigned char font[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x03, -0x0F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFE, -0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x7F, -0xFF, 0xFE, 0xFD, 0xFB, 0x1B, 0x07, -0x07, 0x0F, 0x1F, 0x1F, 0x1E, 0x1D, -0x0B, 0x07, 0x01, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, -0xF8, 0xFE, 0xFF, 0xFF, 0x1F, 0x07, -0x01, 0x01, 0x01, 0x03, 0x06, 0x06, -0x0C, 0x0C, 0x08, 0x0C, 0x0C, 0x0E, -0x07, 0x83, 0xC1, 0xE0, 0x70, 0x30, -0x18, 0x1C, 0x7C, 0xCC, 0x8C, 0xDC, -0xF8, 0xC0, 0xE0, 0xE0, 0x70, 0xB8, -0xF0, 0x60, 0x00, 0x00, 0x80, 0xC0, -0xE0, 0xF0, 0x70, 0xF8, 0xFC, 0xFC, -0x3C, 0x30, 0x38, 0xF8, 0xF8, 0xF8, -0x78, 0x00, 0x80, 0x80, 0xC0, 0xE0, -0x70, 0x38, 0x38, 0x9C, 0xDC, 0xFC, -0x7C, 0x38, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xF8, 0xFC, 0xFE, +0xFF, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0x1F, 0x07, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x81, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x81, +0xC3, 0xC3, 0xC3, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x81, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x81, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x01, 0x00, +0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x9D, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, +0x1C, 0x9D, 0xDF, 0xDF, 0xDF, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x1F, 0x3F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x3F, 0x1E, 0x0C, 0x00, @@ -209,26 +208,26 @@ static const unsigned char font[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x03, 0x0F, 0x1F, +0x3F, 0x3F, 0x3F, 0x3F, 0x1F, 0x1F, +0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x3F, +0x3F, 0x1F, 0x3F, 0x7F, 0x7F, 0x7F, +0x7F, 0x7C, 0x78, 0x78, 0x38, 0x1C, +0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x03, 0x07, 0x07, +0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +0x03, 0x01, 0x00, 0x00, 0x00, 0x00, +0x01, 0x03, 0x07, 0x07, 0x07, 0x07, +0x07, 0x07, 0x07, 0x07, 0x03, 0x01, +0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x03, 0x07, -0x1F, 0x3F, 0x3F, 0x7F, 0x7F, 0x7F, -0x7E, 0x7D, 0x3B, 0x17, 0x00, 0x00, +0x00, 0x07, 0x07, 0x07, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x07, 0x07, +0x07, 0x00, 0x00, 0x00, 0x01, 0x03, +0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +0x07, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x07, -0x0F, 0x1F, 0x3F, 0x3F, 0x7E, 0x7C, -0x78, 0x70, 0x70, 0x70, 0x70, 0x70, -0x70, 0x78, 0x38, 0x18, 0x1C, 0x0E, -0x07, 0x0F, 0x1F, 0x3F, 0x3C, 0x38, -0x38, 0x18, 0x0C, 0x06, 0x03, 0x01, -0x01, 0x01, 0x01, 0x0E, 0x1F, 0x1F, -0x1C, 0x1C, 0x1E, 0x0F, 0x0F, 0x03, -0x1D, 0x0E, 0x07, 0x03, 0x01, 0x00, -0x00, 0x0E, 0x1F, 0x1F, 0x1D, 0x1E, -0x0F, 0x07, 0x03, 0x03, 0x0F, 0x1F, -0x1F, 0x19, 0x19, 0x19, 0x19, 0x0C, -0x0C, 0x04, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, diff --git a/keyboards/crkbd/ssd1306.c b/keyboards/crkbd/ssd1306.c index b8f9512e3..205ce67a9 100644 --- a/keyboards/crkbd/ssd1306.c +++ b/keyboards/crkbd/ssd1306.c @@ -4,7 +4,6 @@ #include "i2c.h" #include #include "print.h" -#include "glcdfont.c" #ifdef ADAFRUIT_BLE_ENABLE #include "adafruit_ble.h" #endif @@ -14,6 +13,8 @@ #include "sendchar.h" #include "timer.h" +static const unsigned char font[] PROGMEM; + // Set this to 1 to help diagnose early startup problems // when testing power-on with ble. Turn it off otherwise, // as the latency of printing most of the debug info messes From 9ca73a9edcb8cfaeba13baae16b8c8cc5c9fafe6 Mon Sep 17 00:00:00 2001 From: Andy Date: Fri, 19 Oct 2018 19:57:44 +0200 Subject: [PATCH 316/788] Keymap: Add dz60 iso-de layout (#4173) --- .../dz60/keymaps/iso_de_andys8/README.md | 3 ++ keyboards/dz60/keymaps/iso_de_andys8/keymap.c | 38 +++++++++++++++++++ keyboards/dz60/keymaps/iso_de_andys8/rules.mk | 15 ++++++++ 3 files changed, 56 insertions(+) create mode 100644 keyboards/dz60/keymaps/iso_de_andys8/README.md create mode 100644 keyboards/dz60/keymaps/iso_de_andys8/keymap.c create mode 100644 keyboards/dz60/keymaps/iso_de_andys8/rules.mk diff --git a/keyboards/dz60/keymaps/iso_de_andys8/README.md b/keyboards/dz60/keymaps/iso_de_andys8/README.md new file mode 100644 index 000000000..504726adf --- /dev/null +++ b/keyboards/dz60/keymaps/iso_de_andys8/README.md @@ -0,0 +1,3 @@ +# ISO DE layout + +This layout is ISO-DE and similar to a standard 60 ISO layout. There are vim style arrow keys on the function layer. The bottom right is the expected default. diff --git a/keyboards/dz60/keymaps/iso_de_andys8/keymap.c b/keyboards/dz60/keymaps/iso_de_andys8/keymap.c new file mode 100644 index 000000000..3039914c6 --- /dev/null +++ b/keyboards/dz60/keymaps/iso_de_andys8/keymap.c @@ -0,0 +1,38 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* ISO 60 layout by andys8 (ISO German keyboard layout shown) + * + * This layout starts from a standard ISO 60% layout, and adds a function layer. + * + * ,-----------------------------------------------------------------------------------------. + * | Esc | 1 ! | 2 " | 3 § | 4 $ | 5 % | 6 & | 7 / | 8 ( | 9 ) | 0 = | ß ? | ´ ` | Backspace | + * |-----------------------------------------------------------------------------------------| + * | Tab | Q | W | E | R | T | Z | U | I | O | P | Ä | + * | Enter | + * |---------------------------------------------------------------------------------- | + * | Layer_1 | A | S | D | F | G | H | J | K | L | Ö | Ü | # ' | | + * |-----------------------------------------------------------------------------------------| + * | Shift | < > | Y | X | C | V | B | N | M | , ; | . : | - _ | Shift | + * |-----------------------------------------------------------------------------------------| + * | LCtl | LGUI | LAlt | Space | RAlt | RGUI | App | RCtl | + * `-----------------------------------------------------------------------------------------' + */ + LAYOUT_60_iso( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, + MO(1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_BSLS, KC_ENT, + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL + ), + + + LAYOUT_60_iso( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, + KC_NO, KC_NO, KC_NO, KC_NO, RESET, KC_NO, KC_HOME, KC_PGDN, KC_PGUP, KC_END, KC_PSCR, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_END, KC_DEL, KC_NO, KC_NO, + KC_LSFT, BL_TOGG, KC_APP, KC_PAUS, KC_INS, KC_NO, KC_MPLY, KC_MSTP, KC_MUTE, KC_VOLD, KC_VOLU, KC_NO, KC_RSFT, + KC_LCTL, KC_LGUI, KC_LALT, KC_BSPC, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT + ), + +}; diff --git a/keyboards/dz60/keymaps/iso_de_andys8/rules.mk b/keyboards/dz60/keymaps/iso_de_andys8/rules.mk new file mode 100644 index 000000000..b5f45d7aa --- /dev/null +++ b/keyboards/dz60/keymaps/iso_de_andys8/rules.mk @@ -0,0 +1,15 @@ +# Build Options +# comment out to disable the options. +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +AUDIO_ENABLE = no +RGBLIGHT_ENABLE = no +AUTO_SHIFT_ENABLE = no # If the time depressed is greater than or equal to the AUTO_SHIFT_TIMEOUT, then a shifted version of the key is emitted. If the time is less than the AUTO_SHIFT_TIMEOUT time, then the normal state is emitted +TAP_DANCE_ENABLE = no From 6f6d28fa8d81063691d2fd11540675eaa5b6989c Mon Sep 17 00:00:00 2001 From: wanleg <32079073+wanleg@users.noreply.github.com> Date: Fri, 19 Oct 2018 11:01:40 -0700 Subject: [PATCH 317/788] Big Switch and 5x5 edits (#4168) * 4x4 - pro micro version * pro-micro setup on 4x4 * tap dance LCTL/RESET key * remove test file * more research * revert a couple un-intended edits * opt_defs version of adding custom rules.mk variables * cleanup * cleanup * cleanup * cleanup * layout edits * layout edits * keymap edit * numpad layout change * got tap dance layer-switch working * keymap changes * temporary revert * restore previous settings * misc fixes * layer order change * fix layout matrix * Update tapdances.c * playing around with triple tap dance * sync with upstream * quick edit * tapdance cleanup * mod tap interrupt * tapping term edit * tapping term adjust * 5x5 board edits * set gherkin tapping term * big switch tap dance edit * tapping term refinements * 5x10 layout setup * add audio for bigswitch * keymap change * keymap change & created testing board * sound setup for big_switch * more big switch size testing * bigswitch testing finished * final touch-ups --- keyboards/5x5/5x5.h | 4 +- keyboards/bigswitch/bigswitch.c | 2 + keyboards/bigswitch/keymaps/wanleg/config.h | 11 +- keyboards/bigswitch/keymaps/wanleg/keymap.c | 9 +- keyboards/bigswitch/keymaps/wanleg/rules.mk | 15 +- layouts/community/ortho_3x10/wanleg/readme.md | 9 +- layouts/community/ortho_5x10/wanleg/config.h | 9 - layouts/community/ortho_5x10/wanleg/keymap.c | 38 --- layouts/community/ortho_5x10/wanleg/rules.mk | 3 - layouts/community/ortho_5x15/wanleg/config.h | 11 +- layouts/community/ortho_5x15/wanleg/keymap.c | 89 +++++-- layouts/community/ortho_5x5/layout.json | 1 + layouts/community/ortho_5x5/readme.md | 3 + users/wanleg/config.h | 18 +- users/wanleg/rules.mk | 4 +- users/wanleg/tapdances.c | 246 ++++++++++-------- users/wanleg/wanleg.c | 6 + users/wanleg/wanleg.h | 39 ++- 18 files changed, 305 insertions(+), 212 deletions(-) delete mode 100644 layouts/community/ortho_5x10/wanleg/config.h delete mode 100644 layouts/community/ortho_5x10/wanleg/keymap.c delete mode 100644 layouts/community/ortho_5x10/wanleg/rules.mk create mode 100644 layouts/community/ortho_5x5/layout.json create mode 100644 layouts/community/ortho_5x5/readme.md diff --git a/keyboards/5x5/5x5.h b/keyboards/5x5/5x5.h index cbfc28a90..45fb80a4f 100644 --- a/keyboards/5x5/5x5.h +++ b/keyboards/5x5/5x5.h @@ -35,7 +35,7 @@ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, ___, ___, ___, ___, ___}, \ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, ___, ___, ___, ___, ___}, \ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, ___, ___, ___, ___, ___}, \ - { K30, K31, K32, K33, K34, K35, K35, K37, K38, K39, ___, ___, ___, ___, ___}, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, ___, ___, ___, ___, ___}, \ { K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, ___, ___, ___, ___, ___} \ } @@ -50,7 +50,7 @@ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0a, K0b, K0c, K0d, K0e}, \ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1a, K1b, K1c, K1d, K1e}, \ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2a, K2b, K2c, K2d, K2e}, \ - { K30, K31, K32, K33, K34, K35, K35, K37, K38, K39, K3a, K3b, K3c, K3d, K3e}, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3a, K3b, K3c, K3d, K3e}, \ { K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4a, K4b, K4c, K4d, K4e} \ } diff --git a/keyboards/bigswitch/bigswitch.c b/keyboards/bigswitch/bigswitch.c index b924c7017..32f9f7fab 100644 --- a/keyboards/bigswitch/bigswitch.c +++ b/keyboards/bigswitch/bigswitch.c @@ -26,10 +26,12 @@ void matrix_init_user(void) { __attribute__ ((weak)) void matrix_scan_user(void) { +#if defined(RGBLIGHT_ENABLE) if (runonce && timer_elapsed(my_timer) > 1000) { runonce = false; rgblight_sethsv_noeeprom(0x0, 0xff, 0x80); rgblight_mode_noeeprom(9); rgblight_enable_noeeprom(); } +#endif } diff --git a/keyboards/bigswitch/keymaps/wanleg/config.h b/keyboards/bigswitch/keymaps/wanleg/config.h index f1e169345..8ac82f40d 100644 --- a/keyboards/bigswitch/keymaps/wanleg/config.h +++ b/keyboards/bigswitch/keymaps/wanleg/config.h @@ -21,7 +21,6 @@ #define MATRIX_ROW_PINS { B4 } #undef MATRIX_COL_PINS #define MATRIX_COL_PINS { B6 } -//#define UNUSED_PINS /* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ #undef DIODE_DIRECTION @@ -32,14 +31,12 @@ #define BACKLIGHT_LEVELS 3 #define BREATHING_PERIOD 5 -/* for Tap Dance */ -#undef TAPPING_TERM -#define TAPPING_TERM 700 - /* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ -//#define DEBOUNCING_DELAY 5 #undef DEBOUNCING_DELAY -#define DEBOUNCING_DELAY 2 +#define DEBOUNCING_DELAY 5 // set flashing LED with QMK DFU #define QMK_LED B0 + +// set audio pin +#define C6_AUDIO diff --git a/keyboards/bigswitch/keymaps/wanleg/keymap.c b/keyboards/bigswitch/keymaps/wanleg/keymap.c index 7f4150e58..76d0808fd 100644 --- a/keyboards/bigswitch/keymaps/wanleg/keymap.c +++ b/keyboards/bigswitch/keymaps/wanleg/keymap.c @@ -20,8 +20,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT( /* Base */ TD(CAD_TD) \ ), -}; - -void led_set_user(uint8_t usb_led) { - -} +[1] = LAYOUT( /*Secondary*/ +TD(BSW_TAP_DANCE) \ +), +}; \ No newline at end of file diff --git a/keyboards/bigswitch/keymaps/wanleg/rules.mk b/keyboards/bigswitch/keymaps/wanleg/rules.mk index bc4a1873f..a6c7d1d3f 100644 --- a/keyboards/bigswitch/keymaps/wanleg/rules.mk +++ b/keyboards/bigswitch/keymaps/wanleg/rules.mk @@ -1,7 +1,16 @@ -BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default - #If using a ProMicro and it has the QMK DFU bootloader instead of Caterina, #run "make : dfu=qmk" when compiling to ensure it is flagged properly after being flashed ifeq ($(strip $(dfu)), qmk) BOOTLOADER = qmk-dfu -endif \ No newline at end of file +endif + +AUDIO_ENABLE = yes # Audio output on port C6 +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) \ No newline at end of file diff --git a/layouts/community/ortho_3x10/wanleg/readme.md b/layouts/community/ortho_3x10/wanleg/readme.md index ef6c1f9db..8696cccf6 100644 --- a/layouts/community/ortho_3x10/wanleg/readme.md +++ b/layouts/community/ortho_3x10/wanleg/readme.md @@ -1,13 +1,10 @@ ![Gherkin Wanleg Layout Image](https://i.imgur.com/nCPog2W.png) # Gherkin Wanleg Layout This is the layout I came up with to preserve a standard QWERTY 104 key ANSI layout as much as possible, in as few layers as possible for a 30 key board. -I originally set up a few Tap Dance keys, but dropped half of them in favor of chorded versions since in actual use, they tended to impede typing speed more than their current two-key versions. -I've left them in my `keymap.c` ready for use if anyone wants to try them out: +Here are the two Tap Dance keys I've set up for this board: -Legend Name | Single Tap | Double Tap | Hold ---- | --- | --- | --- -*null* | space | enter | shift -*null* | backspace | delete | control +Legend Name | Single Tap | Double Tap | Hold +--- | --- | --- | --- Sft//Cp | shift | caps lock | *null* Q//Esc | KC_Q | escape | *null* diff --git a/layouts/community/ortho_5x10/wanleg/config.h b/layouts/community/ortho_5x10/wanleg/config.h deleted file mode 100644 index 2d24f2771..000000000 --- a/layouts/community/ortho_5x10/wanleg/config.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -//QMK DFU settings (ProMicro boards) -// set top left key as bootloader mode escape key on Gherkin -#if defined(KEYBOARD_5x5) -#define QMK_LED B0 -#define QMK_ESC_OUTPUT D7 // usually COL -#define QMK_ESC_INPUT B2 // usually ROW -#endif diff --git a/layouts/community/ortho_5x10/wanleg/keymap.c b/layouts/community/ortho_5x10/wanleg/keymap.c deleted file mode 100644 index 5d06e53ae..000000000 --- a/layouts/community/ortho_5x10/wanleg/keymap.c +++ /dev/null @@ -1,38 +0,0 @@ -#include QMK_KEYBOARD_H -#include "wanleg.h" - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[gGK] = LAYOUT_ortho_5x10_wrapper( - _______________Gherkin_NUM_0_______________, - _______________Gherkin_Row_0_______________, - _______________Gherkin_Row_1_______________, - _______________Gherkin_Row_2_______________, - _______, _______, _______, gNUMBER, gETCETERA, KC_SPC,gDIRECTION, KC_RGUI, _______, _______ -), - - -[gNUM] = LAYOUT_ortho_5x10_wrapper( - _______________Gherkin_NUM_0_______________, - _______________Gherkin_NUM_0_______________, - _______________Gherkin_NUM_1_______________, - _______________Gherkin_NUM_2_______________, - _______, _______, _______, _______, _______, KC_ENT, KC_RSFT, KC_RGUI, _______, _______ -), - -[gDIR] = LAYOUT_ortho_5x10_wrapper( - _______________Gherkin_NUM_0_______________, - _______________Gherkin_DIR_0_______________, - _______________Gherkin_DIR_1_______________, - _______________Gherkin_DIR_2_______________, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ -), - -[gETC] = LAYOUT_ortho_5x10_wrapper( - _______________Gherkin_NUM_0_______________, - _______________Gherkin_ETC_0_______________, - _______________Gherkin_ETC_1_______________, - _______________Gherkin_ETC_2_______________, - _______, _______, _______, _______, _______, LALT(LCTL(KC_DEL)), _______, _______, _______, _______ -), - -}; diff --git a/layouts/community/ortho_5x10/wanleg/rules.mk b/layouts/community/ortho_5x10/wanleg/rules.mk deleted file mode 100644 index 90841d2ab..000000000 --- a/layouts/community/ortho_5x10/wanleg/rules.mk +++ /dev/null @@ -1,3 +0,0 @@ -SWAP_HANDS_ENABLE = no - -BOOTLOADER = qmk-dfu \ No newline at end of file diff --git a/layouts/community/ortho_5x15/wanleg/config.h b/layouts/community/ortho_5x15/wanleg/config.h index a55fc6a3e..1043986f7 100644 --- a/layouts/community/ortho_5x15/wanleg/config.h +++ b/layouts/community/ortho_5x15/wanleg/config.h @@ -1,3 +1,8 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H -#endif +#pragma once + +// set top left key as bootloader mode escape key on 5x5 75key layout +#if defined(KEYBOARD_5x5) && !defined(PRO_MICRO) +#define QMK_LED B0 +#define QMK_ESC_OUTPUT D7 // usually COL +#define QMK_ESC_INPUT B2 // usually ROW +#endif \ No newline at end of file diff --git a/layouts/community/ortho_5x15/wanleg/keymap.c b/layouts/community/ortho_5x15/wanleg/keymap.c index 7731edb6a..df7424115 100644 --- a/layouts/community/ortho_5x15/wanleg/keymap.c +++ b/layouts/community/ortho_5x15/wanleg/keymap.c @@ -2,30 +2,36 @@ #include "wanleg.h" #define _________________BLANK_75__________________ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +#define _________________BLANK_50__________________ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ #define _________________Num_Row_75________________ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_NLCK const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* QWERTY 75 - * .--------------------------------------------------------------------------------------------------------------------------------------. - * | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | NUMLOCK| gherkin| | FN | - * |-----------------------------------------------------------------------------------------------------------+--------+--------+--------| - * | | 7 | 8 | 9 | - * | |--------+--------+--------| - * | 4x12 QWERTY LAYOUT | 4 | 5 | 6 | - * | |--------+--------+--------| - * | | 1 | 2 | 3 | - * | |--------+--------+--------| - * | | 0 | 0 | . | - * '--------------------------------------------------------------------------------------------------------------------------------------' - */ -[QW75] = LAYOUT_ortho_5x15_wrapper( - _________________Num_Row_75________________, GHERKIN75, XXXXXXX, FUNCTION75, - _______________Qwerty_Row__0_______________, KC_KP_7, KC_KP_8, KC_KP_9, - _______________Qwerty_Row__1_______________, KC_KP_4, KC_KP_5, KC_KP_6, - _______________Qwerty_Row__2_______________, KC_KP_1, KC_KP_2, KC_KP_3, - KC_LCTL, KC_LGUI, KC_LALT, KC_LALT, SUBTER75, KC_LSFT, KC_SPC, SUPRA75, KC_RGUI, KC_RALT, KC_DEL, KC_RCTL, KC_KP_0, KC_KP_0, KC_KP_DOT +#if defined(KEYBOARD_5x5) +[GK75] = LAYOUT_ortho_5x15_wrapper( + _________________Num_Row_75________________, QWERTY75, XXXXXXX, FUNCTION75, + _______________GherkinLike_0_______________, KC_KP_7, KC_KP_8, KC_KP_9, + _______________GherkinLike_1_______________, KC_KP_4, KC_KP_5, KC_KP_6, + TD(TD_SFT_CAPS), SFT_T(KC_Z), KC_X, KC_C, LT(NUM75, KC_V), LT(ETC75, KC_B), KC_N, LT(DIR75, KC_M), GUI_T(KC_COMM), ALT_T(KC_DOT), CTL_T(KC_BSPC), SFT_T(KC_ENT), KC_KP_1, KC_KP_2, KC_KP_3, + TD(RST_TAP_DANCE), GHERKIN50, KC_LALT, NUMPAD, NUMBER75, ETCETERA75, KC_SPC,DIRECTION75, KC_RGUI, KC_RALT, KC_DEL, KC_RCTL, KC_KP_0, KC_KP_0, KC_KP_DOT ), +[PAD] = LAYOUT_ortho_5x5_wrapper( + _______, _______, _______, _______, _______, + _______________NUMPAD_Row__0_______________, _______, + _______________NUMPAD_Row__1_______________, _______, + _______________NUMPAD_Row__2_______________, _______, + KC_KP_0, TD(LYR50_TAP_DANCE), KC_KP_DOT, KC_PMNS, _______ +), + +[GK50] = LAYOUT_ortho_5x10_wrapper( + KC_ESC, _______, _______, _______, _______, _______, _______, _______, _______, KC_BSPC, + _______________Gherkin_Row_0_______________, + _______________Gherkin_Row_1_______________, + _______________Gherkin_Row_2_______________, + TD(RST_TAP_DANCE), GHERKIN75, NUMPAD, gNUMBER, gETCETERA, KC_SPC,gDIRECTION, KC_RGUI, KC_RALT, KC_RGUI +), + +#else /* Gherkin 75 * .--------------------------------------------------------------------------------------------------------------------------------------. * | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | NUMLOCK| qwerty | | FN | @@ -46,6 +52,27 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TD(TD_SFT_CAPS), SFT_T(KC_Z), KC_X, KC_C, LT(NUM75, KC_V), LT(ETC75, KC_B), KC_N, LT(DIR75, KC_M), GUI_T(KC_COMM), ALT_T(KC_DOT), CTL_T(KC_BSPC), SFT_T(KC_ENT), KC_KP_1, KC_KP_2, KC_KP_3, KC_LCTL, KC_LGUI, KC_LALT, KC_LALT, NUMBER75, ETCETERA75, KC_SPC,DIRECTION75, KC_RGUI, KC_RALT, KC_DEL, KC_RCTL, KC_KP_0, KC_KP_0, KC_KP_DOT ), +#endif + /* QWERTY 75 + * .--------------------------------------------------------------------------------------------------------------------------------------. + * | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | NUMLOCK| gherkin| | FN | + * |-----------------------------------------------------------------------------------------------------------+--------+--------+--------| + * | | 7 | 8 | 9 | + * | |--------+--------+--------| + * | 4x12 QWERTY LAYOUT | 4 | 5 | 6 | + * | |--------+--------+--------| + * | | 1 | 2 | 3 | + * | |--------+--------+--------| + * | | 0 | 0 | . | + * '--------------------------------------------------------------------------------------------------------------------------------------' + */ +[QW75] = LAYOUT_ortho_5x15_wrapper( + _________________Num_Row_75________________, GHERKIN75, XXXXXXX, FUNCTION75, + _______________Qwerty_Row__0_______________, KC_KP_7, KC_KP_8, KC_KP_9, + _______________Qwerty_Row__1_______________, KC_KP_4, KC_KP_5, KC_KP_6, + _______________Qwerty_Row__2_______________, KC_KP_1, KC_KP_2, KC_KP_3, + KC_LCTL, KC_LGUI, KC_LALT, KC_LALT, SUBTER75, KC_LSFT, KC_SPC, SUPRA75, KC_RGUI, KC_RALT, KC_DEL, KC_RCTL, KC_KP_0, KC_KP_0, KC_KP_DOT +), /* SUBTER75 * .--------------------------------------------------------------------------------------------------------------------------------------. @@ -173,4 +200,28 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, BL_TOGG, BL_INC, BL_DEC, _______, _______, KC_MS_U, KC_WH_D, _______, _______, _______, _______, _______, _______, KC_BTN1, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R ), + +[gNUM] = LAYOUT_ortho_5x10_wrapper( + _________________BLANK_50__________________, + _______________Gherkin_NUM_0_______________, + _______________Gherkin_NUM_1_______________, + _______________Gherkin_NUM_2_______________, + _______, _______, _______, _______, _______, KC_ENT, KC_RSFT, KC_RGUI, _______, _______ +), + +[gDIR] = LAYOUT_ortho_5x10_wrapper( + _________________BLANK_50__________________, + _______________Gherkin_DIR_0_______________, + _______________Gherkin_DIR_1_______________, + _______________Gherkin_DIR_2_______________, + _________________BLANK_50__________________ +), + +[gETC] = LAYOUT_ortho_5x10_wrapper( + _________________BLANK_50__________________, + _______________Gherkin_ETC_0_______________, + _______________Gherkin_ETC_1_______________, + _______________Gherkin_ETC_2_______________, + _______, KC_CAPS, _______, _______, _______, LALT(LCTL(KC_DEL)), _______, _______, _______, _______ +), }; diff --git a/layouts/community/ortho_5x5/layout.json b/layouts/community/ortho_5x5/layout.json new file mode 100644 index 000000000..ab4eef8e1 --- /dev/null +++ b/layouts/community/ortho_5x5/layout.json @@ -0,0 +1 @@ +["","","","",""],["","","","",""],["","","","",""],["","","","",""],["","","","",""] diff --git a/layouts/community/ortho_5x5/readme.md b/layouts/community/ortho_5x5/readme.md new file mode 100644 index 000000000..3dd75765d --- /dev/null +++ b/layouts/community/ortho_5x5/readme.md @@ -0,0 +1,3 @@ +# ortho_5x5 + + LAYOUT_ortho_5x5 \ No newline at end of file diff --git a/users/wanleg/config.h b/users/wanleg/config.h index 28e7690e6..f2e785659 100644 --- a/users/wanleg/config.h +++ b/users/wanleg/config.h @@ -2,8 +2,17 @@ #define USERSPACE_CONFIG_H //TAPPING_TERM -#ifdef TAP_DANCE_ENABLE -#define TAPPING_TERM 200 +//tapping term short (<100): on multi-purpose keys, slow taps may not register, but "holds" register easier. multi-tap keys may be difficult to activate. +//tapping term long (>200): holds don't register as easily - noticeable when typing quickly (e.g. shift doesn't want to engage.) +#if defined(TAP_DANCE_ENABLE) && defined(KEYBOARD_lets_split_rev2) +//Kailh Coppers activate quickly and don't need a long tapping term +#define TAPPING_TERM 100 + +#elif defined(TAP_DANCE_ENABLE) && defined(KEYBOARD_bigswitch) +#define TAPPING_TERM 700 + +#else +#define TAPPING_TERM 145 #endif //Mousekey Settings @@ -27,4 +36,9 @@ #define NO_ACTION_FUNCTION #define NO_ACTION_ONESHOT +// Disable mod tap interrrupt +#ifndef IGNORE_MOD_TAP_INTERRUPT +#define IGNORE_MOD_TAP_INTERRUPT +#endif // !mod tap interrrupt + #endif // !USERSPACE_CONFIG_H diff --git a/users/wanleg/rules.mk b/users/wanleg/rules.mk index 563040131..2a2a65cfe 100644 --- a/users/wanleg/rules.mk +++ b/users/wanleg/rules.mk @@ -9,8 +9,8 @@ ifeq ($(strip $(dfu)), qmk) BOOTLOADER = qmk-dfu endif -#use alternate settings for 4x4 board using ProMicro instead of Micro -#usage: make 4x4:wanleg PM=yes +#use alternate settings for boards using ProMicro instead of Micro +#example usage: make 4x4:wanleg PM=yes ifeq ($(strip $(PM)), yes) OPT_DEFS += -DPRO_MICRO endif diff --git a/users/wanleg/tapdances.c b/users/wanleg/tapdances.c index 0778bf5f7..3878e6d31 100644 --- a/users/wanleg/tapdances.c +++ b/users/wanleg/tapdances.c @@ -1,6 +1,12 @@ //Tap Dance Settings #include "wanleg.h" +//audio settings for one of the tap dances below +#ifdef AUDIO_ENABLE + float lyrup_song[][2] = SONG(MUSIC_ON_SOUND); + float lyrdown_song[][2] = SONG(MUSIC_OFF_SOUND); +#endif + ///// QUAD FUNCTION TAP DANCE GENERAL SETUP SECTION START ///// ///// (no need to edit this section) ///// //Enums used to clearly convey the state of the tap dance @@ -9,7 +15,10 @@ enum { SINGLE_HOLD = 2, DOUBLE_TAP = 3, DOUBLE_HOLD = 4, - DOUBLE_SINGLE_TAP = 5 //send SINGLE_TAP twice - NOT DOUBLE_TAP + DOUBLE_SINGLE_TAP = 5, //send SINGLE_TAP twice - NOT DOUBLE_TAP + TRIPLE_TAP = 6, + TRIPLE_HOLD = 7, + TRIPLE_SINGLE_TAP = 8 // Add more enums here if you want for triple, quadruple, etc. }; @@ -32,69 +41,18 @@ int cur_dance (qk_tap_dance_state_t *state) { else if (state->pressed) return DOUBLE_HOLD; else return DOUBLE_TAP; } - else return 6; //magic number. At some point this method will expand to work for more presses + + //If count = 3, and it has been interrupted - assume that user is trying to type the letter associated + //with double tap. + else if (state->count == 3) { + if (state->interrupted) return TRIPLE_SINGLE_TAP; + else if (state->pressed) return TRIPLE_HOLD; + else return TRIPLE_TAP; + } + else return 9; //magic number. At some point this method will expand to work for more presses } ///// QUAD FUNCTION TAP DANCE GENERAL SETUP SECTION END ///// ///// QUAD FUNCTION TAP DANCE PERSONALIZATION SECTION START ///// -//instantiate 'tap' for the 'ENT' tap dance. -static tap ENTtap_state = { - .is_press_action = true, - .state = 0 -}; - -void ENT_finished (qk_tap_dance_state_t *state, void *user_data) { - ENTtap_state.state = cur_dance(state); - switch (ENTtap_state.state) { - case SINGLE_TAP: register_code(KC_SPC); break; - case SINGLE_HOLD: register_code(KC_LSFT); break; - case DOUBLE_TAP: register_code(KC_ENT); break; - case DOUBLE_HOLD: register_code(KC_NO); break; // setting double hold to do nothing (change this if you want) - case DOUBLE_SINGLE_TAP: register_code(KC_SPC); unregister_code(KC_SPC); register_code(KC_SPC); - //Last case is for fast typing. Assuming your key is `f`: - //For example, when typing the word `buffer`, and you want to make sure that you send `ff` and not `Esc`. - //In order to type `ff` when typing fast, the next character will have to be hit within the `TAPPING_TERM`, which by default is 200ms. - } -} - -void ENT_reset (qk_tap_dance_state_t *state, void *user_data) { - switch (ENTtap_state.state) { - case SINGLE_TAP: unregister_code(KC_SPC); break; - case SINGLE_HOLD: unregister_code(KC_LSFT); break; - case DOUBLE_TAP: unregister_code(KC_ENT); break; - case DOUBLE_HOLD: unregister_code(KC_NO); - case DOUBLE_SINGLE_TAP: unregister_code(KC_SPC); - } - ENTtap_state.state = 0; -} - -//instantiate 'tap' for the 'DEL' tap dance. -static tap DELtap_state = { - .is_press_action = true, - .state = 0 -}; - -void DEL_finished (qk_tap_dance_state_t *state, void *user_data) { - DELtap_state.state = cur_dance(state); - switch (DELtap_state.state) { - case SINGLE_TAP: register_code(KC_BSPC); break; - case SINGLE_HOLD: register_code(KC_LCTL); break; - case DOUBLE_TAP: register_code(KC_DEL); break; - case DOUBLE_HOLD: register_code(KC_NO); break; - case DOUBLE_SINGLE_TAP: register_code(KC_BSPC); unregister_code(KC_BSPC); register_code(KC_BSPC); - } -} - -void DEL_reset (qk_tap_dance_state_t *state, void *user_data) { - switch (DELtap_state.state) { - case SINGLE_TAP: unregister_code(KC_BSPC); break; - case SINGLE_HOLD: unregister_code(KC_LCTL); break; - case DOUBLE_TAP: unregister_code(KC_DEL); break; - case DOUBLE_HOLD: unregister_code(KC_NO); - case DOUBLE_SINGLE_TAP: unregister_code(KC_BSPC); - } - DELtap_state.state = 0; -} - //instantiate 'tap' for the 'CAD' tap dance. static tap CADtap_state = { .is_press_action = true, @@ -104,14 +62,14 @@ static tap CADtap_state = { void CAD_finished (qk_tap_dance_state_t *state, void *user_data) { CADtap_state.state = cur_dance(state); switch (CADtap_state.state) { - case SINGLE_TAP: - //register_code(KC_SPC); + case SINGLE_TAP: + //register_code(KC_SPC); SEND_STRING(SS_LGUI("l")); #ifdef BACKLIGHT_ENABLE - backlight_set(3); + backlight_level(3); #endif break; - case SINGLE_HOLD: + case SINGLE_HOLD: //register_code(KC_NO); //take a screenshot of a single window, open Paint and paste SEND_STRING(SS_LALT(SS_TAP(X_PSCREEN)) SS_LGUI("r")); @@ -120,47 +78,37 @@ void CAD_finished (qk_tap_dance_state_t *state, void *user_data) { _delay_ms(700); SEND_STRING(SS_LCTRL("v")); break; //register this keycode when button is held - case DOUBLE_TAP: - //register_code(KC_ENT); + case DOUBLE_TAP: + //register_code(KC_ENT); SEND_STRING(SS_LCTRL(SS_LALT(SS_TAP(X_DELETE)))); #ifdef BACKLIGHT_ENABLE - backlight_set(0); + backlight_level(0); #endif break; //case DOUBLE_HOLD: register_code(KC_NO); break; //register this keycode when button is tapped and then held - case DOUBLE_HOLD: - reset_keyboard(); + case DOUBLE_HOLD: + reset_keyboard(); break; //register this keycode when button is tapped and then held - case DOUBLE_SINGLE_TAP: register_code(KC_NO); unregister_code(KC_NO); register_code(KC_NO); + case TRIPLE_TAP: + SEND_STRING("wanleg@github.com"); + break; + case TRIPLE_HOLD: + set_single_persistent_default_layer(1); + #ifdef AUDIO_ENABLE + stop_all_notes(); + PLAY_SONG(lyrup_song); + #endif + break; } } void CAD_reset (qk_tap_dance_state_t *state, void *user_data) { switch (CADtap_state.state) { - case SINGLE_TAP: - //unregister_code(KC_SPC); - SEND_STRING(SS_LGUI("l")); - #ifdef BACKLIGHT_ENABLE - backlight_set(3); - #endif - break; - case SINGLE_HOLD: - register_code(KC_NO); //(un)register this keycode when button is held and then released - //SEND_STRING(SS_LCTRL("v")); - break; - case DOUBLE_TAP: - //register_code(KC_ENT); - SEND_STRING(SS_LCTRL(SS_LALT(SS_TAP(X_DELETE)))); - #ifdef BACKLIGHT_ENABLE - backlight_set(0); - #endif - break; - case DOUBLE_HOLD: register_code(KC_NO); //(un)register this keycode when button is tapped and then held, and then released - case DOUBLE_SINGLE_TAP: unregister_code(KC_NO); +//nothing to do } CADtap_state.state = 0; -} - +} + //instantiate 'tap' for the 'RST' tap dance. static tap RSTtap_state = { .is_press_action = true, @@ -173,21 +121,18 @@ void RST_finished (qk_tap_dance_state_t *state, void *user_data) { case SINGLE_TAP: register_code(KC_LCTL); break; case SINGLE_HOLD: register_code(KC_LCTL); break; case DOUBLE_TAP: reset_keyboard(); break; - case DOUBLE_HOLD: register_code(KC_NO); break; - case DOUBLE_SINGLE_TAP: register_code(KC_LCTL); unregister_code(KC_LCTL); register_code(KC_LCTL); + case DOUBLE_SINGLE_TAP: register_code(KC_LCTL); unregister_code(KC_LCTL); register_code(KC_LCTL); break; } -} +} void RST_reset (qk_tap_dance_state_t *state, void *user_data) { switch (RSTtap_state.state) { case SINGLE_TAP: unregister_code(KC_LCTL); break; case SINGLE_HOLD: unregister_code(KC_LCTL); break; - case DOUBLE_TAP: unregister_code(KC_NO); break; - case DOUBLE_HOLD: unregister_code(KC_NO); - case DOUBLE_SINGLE_TAP: unregister_code(KC_LCTL); + case DOUBLE_SINGLE_TAP: unregister_code(KC_LCTL); break; } RSTtap_state.state = 0; -} +} //instantiate 'tap' for the 'LYR' tap dance. static tap LYRtap_state = { @@ -199,23 +144,106 @@ void LYR_finished (qk_tap_dance_state_t *state, void *user_data) { LYRtap_state.state = cur_dance(state); switch (LYRtap_state.state) { case SINGLE_TAP: register_code(KC_PSLS); break; - case SINGLE_HOLD: register_code(KC_NO); break; case DOUBLE_TAP: set_single_persistent_default_layer(_GK); break; - case DOUBLE_HOLD: register_code(KC_NO); break; case DOUBLE_SINGLE_TAP: register_code(KC_PSLS); unregister_code(KC_PSLS); register_code(KC_PSLS); } -} +} void LYR_reset (qk_tap_dance_state_t *state, void *user_data) { switch (LYRtap_state.state) { case SINGLE_TAP: unregister_code(KC_PSLS); break; - case SINGLE_HOLD: unregister_code(KC_NO); break; case DOUBLE_TAP: set_single_persistent_default_layer(_GK); break; - case DOUBLE_HOLD: unregister_code(KC_NO); case DOUBLE_SINGLE_TAP: unregister_code(KC_PSLS); } LYRtap_state.state = 0; -} +} + +//instantiate 'tap' for the 'LYR75' tap dance. +static tap LYR75tap_state = { + .is_press_action = true, + .state = 0 +}; + +void LYR75_finished (qk_tap_dance_state_t *state, void *user_data) { + LYR75tap_state.state = cur_dance(state); + switch (LYR75tap_state.state) { + case SINGLE_TAP: register_code(KC_PSLS); break; + case DOUBLE_TAP: set_single_persistent_default_layer(GK75); break; + case DOUBLE_SINGLE_TAP: register_code(KC_PSLS); unregister_code(KC_PSLS); register_code(KC_PSLS); + } +} + +void LYR75_reset (qk_tap_dance_state_t *state, void *user_data) { + switch (LYR75tap_state.state) { + case SINGLE_TAP: unregister_code(KC_PSLS); break; + case DOUBLE_TAP: set_single_persistent_default_layer(GK75); break; + case DOUBLE_SINGLE_TAP: unregister_code(KC_PSLS); + } + LYR75tap_state.state = 0; +} + +//instantiate 'tap' for the 'LYR50' tap dance. +static tap LYR50tap_state = { + .is_press_action = true, + .state = 0 +}; + +void LYR50_finished (qk_tap_dance_state_t *state, void *user_data) { + LYR50tap_state.state = cur_dance(state); + switch (LYR75tap_state.state) { + case SINGLE_TAP: register_code(KC_PSLS); break; + case DOUBLE_TAP: set_single_persistent_default_layer(GK50); break; + case DOUBLE_SINGLE_TAP: register_code(KC_PSLS); unregister_code(KC_PSLS); register_code(KC_PSLS); + } +} + +void LYR50_reset (qk_tap_dance_state_t *state, void *user_data) { + switch (LYR50tap_state.state) { + case SINGLE_TAP: unregister_code(KC_PSLS); break; + case DOUBLE_TAP: set_single_persistent_default_layer(GK50); break; + case DOUBLE_SINGLE_TAP: unregister_code(KC_PSLS); + } + LYR50tap_state.state = 0; +} + +//instantiate 'tap' for the 'BSW' tap dance. +static tap BSWtap_state = { + .is_press_action = true, + .state = 0 +}; + +void BSW_finished (qk_tap_dance_state_t *state, void *user_data) { + BSWtap_state.state = cur_dance(state); + switch (BSWtap_state.state) { + case SINGLE_TAP: register_code(KC_ENTER); break; + case SINGLE_HOLD: + set_single_persistent_default_layer(0); + #ifdef AUDIO_ENABLE + stop_all_notes(); + PLAY_SONG(lyrdown_song); + #endif + break; + case DOUBLE_TAP: + register_code(KC_LCTRL); + register_code(KC_C); + break; + case DOUBLE_HOLD: + reset_keyboard(); + break; //register this keycode when button is tapped and then held + } +} + +void BSW_reset (qk_tap_dance_state_t *state, void *user_data) { + switch (BSWtap_state.state) { + case SINGLE_TAP: unregister_code(KC_ENTER); break; + case DOUBLE_TAP: + unregister_code(KC_LCTRL); + unregister_code(KC_C); + break; + } + BSWtap_state.state = 0; +} + ///// QUAD FUNCTION TAP DANCE PERSONALIZATION SECTION END ///// //Tap Dance Definitions @@ -224,12 +252,12 @@ qk_tap_dance_action_t tap_dance_actions[] = { [TD_SFT_CAPS] = ACTION_TAP_DANCE_DOUBLE(KC_LSFT, KC_CAPS) // Other declarations would go here, separated by commas, if you have them ,[TD_Q_ESC] = ACTION_TAP_DANCE_DOUBLE(KC_Q, KC_ESC) - ,[ENT_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, ENT_finished, ENT_reset) - ,[DEL_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, DEL_finished, DEL_reset) ,[RST_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, RST_finished, RST_reset) ,[CAD_TD] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, CAD_finished, CAD_reset) ,[LYR_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, LYR_finished, LYR_reset) - + ,[LYR75_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, LYR75_finished, LYR75_reset) + ,[LYR50_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, LYR50_finished, LYR50_reset) + ,[BSW_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, BSW_finished, BSW_reset) }; //In Layer declaration, add tap dance item in place of a key code diff --git a/users/wanleg/wanleg.c b/users/wanleg/wanleg.c index f22c34ba3..4e60c422f 100644 --- a/users/wanleg/wanleg.c +++ b/users/wanleg/wanleg.c @@ -47,6 +47,12 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } return false; break; + case GHERKIN50: + if (record->event.pressed) { + set_single_persistent_default_layer(GK50); + } + return false; + break; case SUBTER: if (record->event.pressed) { layer_on(SUB); diff --git a/users/wanleg/wanleg.h b/users/wanleg/wanleg.h index 65028751a..9e0cf3ee5 100644 --- a/users/wanleg/wanleg.h +++ b/users/wanleg/wanleg.h @@ -27,10 +27,12 @@ enum userspace_layers { ETC75, FN75, PAD, + GK50, }; #elif KEYBOARD_xd75 enum userspace_layers { GK75 = 0, + PAD, QW75, SUB75, SUP75, @@ -50,7 +52,32 @@ enum userspace_layers { gNUM, gDIR, gETC, + GK50, +}; +#elif KEYBOARD_5x5 +enum userspace_layers { + GK50 = 0, + gNUM, + gDIR, + gETC, + GK75, + QW75, + SUB75, + SUP75, + NUM75, + DIR75, + ETC75, + FN75, PAD, + gGK, + _GK, + _QW, + ONE, + SUB, + SUP, + NUM, + DIR, + ETC, }; #else enum userspace_layers { @@ -75,6 +102,7 @@ enum userspace_layers { DIR75, ETC75, FN75, + GK50, }; #endif @@ -100,6 +128,7 @@ enum userspace_custom_keycodes { ETCETERA75, FUNCTION75, NUMPAD, + GHERKIN50, }; @@ -108,11 +137,12 @@ enum userspace_custom_keycodes { enum { TD_SFT_CAPS = 0 ,TD_Q_ESC - ,ENT_TAP_DANCE - ,DEL_TAP_DANCE ,CAD_TD ,RST_TAP_DANCE ,LYR_TAP_DANCE + ,LYR50_TAP_DANCE + ,LYR75_TAP_DANCE + ,BSW_TAP_DANCE }; #endif @@ -130,6 +160,7 @@ enum { #define LAYOUT_ortho_4x12_wrapper(...) LAYOUT_ortho_4x12(__VA_ARGS__) #define LAYOUT_ortho_5x15_wrapper(...) LAYOUT_ortho_5x15(__VA_ARGS__) #define LAYOUT_ortho_4x4_wrapper(...) LAYOUT_ortho_4x4(__VA_ARGS__) +#define LAYOUT_ortho_5x5_wrapper(...) LAYOUT_ortho_5x5(__VA_ARGS__) // Blocks for each of the major keyboard layouts // Organized so we can quickly adapt and modify all of them @@ -189,12 +220,12 @@ enum { * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| * | mLeft | mDown | mRight | | SHIFT | mBtn3 | mBtn1 | mBtn2 | ; | ' | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - * | Sft//Cp| | | | | C-A-D | mScrL | mScrR | ALT | DEL | + * | Sft//Cp| CAPS | | | | C-A-D | mScrL | mScrR | ALT | DEL | * '-----------------------------------------------------------------------------------------' */ #define _______________Gherkin_ETC_0_______________ KC_GRV, KC_MS_U, _______,_______, RESET, KC_RSFT, KC_WH_U, KC_WH_D, _______, KC_BSLS #define _______________Gherkin_ETC_1_______________ KC_MS_L, KC_MS_D, KC_MS_R,_______, KC_LSFT, KC_BTN3, KC_BTN1, KC_BTN2, KC_SCLN, KC_QUOT -#define _______________Gherkin_ETC_2_______________ TD(TD_SFT_CAPS),_______, _______,_______, _______, LALT(LCTL(KC_DEL)), KC_WH_L, KC_WH_R, KC_LALT, KC_DEL +#define _______________Gherkin_ETC_2_______________ TD(TD_SFT_CAPS),KC_CAPS, _______,_______, _______, LALT(LCTL(KC_DEL)), KC_WH_L, KC_WH_R, KC_LALT, KC_DEL /* Gherkin-Like * .-----------------------------------------------------------------------------------------------------------. From 0d1e0a0d972c77231062e2ff84742f168a6010a6 Mon Sep 17 00:00:00 2001 From: mcarni Date: Fri, 19 Oct 2018 21:05:34 +0200 Subject: [PATCH 318/788] added an ISO split spacebar layout, keymap and readme files (#4165) --- keyboards/dz60/dz60.h | 14 ++ keyboards/dz60/info.json | 4 + .../dz60/keymaps/iso_split-spacebar/README.md | 69 +++++++ .../dz60/keymaps/iso_split-spacebar/keymap.c | 193 ++++++++++++++++++ 4 files changed, 280 insertions(+) create mode 100644 keyboards/dz60/keymaps/iso_split-spacebar/README.md create mode 100644 keyboards/dz60/keymaps/iso_split-spacebar/keymap.c diff --git a/keyboards/dz60/dz60.h b/keyboards/dz60/dz60.h index fac5fa32f..36ddb7ade 100644 --- a/keyboards/dz60/dz60.h +++ b/keyboards/dz60/dz60.h @@ -196,6 +196,20 @@ { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, KC_NO, k3d, KC_NO }, \ { k40, k41, KC_NO, k43, KC_NO, KC_NO, k46, KC_NO, KC_NO, KC_NO, k4a, k4b, KC_NO, k4d, k4e } \ } +// iso split +#define LAYOUT_60_iso_split( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, \ + K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, \ + K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K114, K213, \ + K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, \ + K400, K401, K403, K404, K406, K408, K410, K411, K413, K414 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, KC_NO, K014 }, \ + { K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \ + { K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO }, \ + { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO, K313, KC_NO }, \ + { K400, K401, KC_NO, K403, K404, KC_NO, K406, KC_NO, K408, KC_NO, K410, K411, KC_NO, K413, K414 } \ +} /* LAYOUT_60_iso_5x1u * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ diff --git a/keyboards/dz60/info.json b/keyboards/dz60/info.json index 56e3677b7..1f621360b 100644 --- a/keyboards/dz60/info.json +++ b/keyboards/dz60/info.json @@ -28,6 +28,10 @@ "LAYOUT_60_iso": { "key_count": 62, "layout": [{"label":"¬", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"\"", "x":2, "y":0}, {"label":"£", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"@", "x":11.75, "y":2}, {"label":"~", "x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"label":"|", "x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"AltGr", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}] + }, + "LAYOUT_60_iso_split": { + "key_count": 64, + "layout": [{"label":"¬", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"\"", "x":2, "y":0}, {"label":"£", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"@", "x":11.75, "y":2}, {"label":"~", "x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"label":"|", "x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":2.25}, {"label":"FN", "x":6.00, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"label":"AltGr", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}] }, "LAYOUT_60_hhkb": { "key_count": 60, diff --git a/keyboards/dz60/keymaps/iso_split-spacebar/README.md b/keyboards/dz60/keymaps/iso_split-spacebar/README.md new file mode 100644 index 000000000..7d96f2225 --- /dev/null +++ b/keyboards/dz60/keymaps/iso_split-spacebar/README.md @@ -0,0 +1,69 @@ +# iso layout with a split spacebar + +i needed to have an ISO layout +and i wanted to have a split spacebar +i couldn't find anything ready so i cobbled this together + + + +---- Layer 0 - BL +this is basically the standard iso layout with the addition of the split spacebar +menu key (KC_APP) is used to move to the next layer +the key in between the two spacebars is the function key + *,-----------------------------------------------------------. + *| ' | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |Backsp | + *|-----------------------------------------------------------| + *| Tab | q | w | e | r | t | y | u | i | o | p | [ | ] |enter| + *|------------------------------------------------------ | + *| Caps | a | s | d | f | g | h | j | k | l | ; | ' | # | | + *|-----------------------------------------------------------| + *|Shft| < | z | x | c | v | b | n | m | , | . | / | Shift | + *|-----------------------------------------------------------| + *|Ctrl|Gui |Alt | Space | FN | Space |Alt |Gui | NL |Ctrl | + *`-----------------------------------------------------------' + +---- Layer 1 - FL +quite standard function layer +arrow keys and mouse movement/buttons on the home row + *,-----------------------------------------------------------. + *|ESC|F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12| DEL | + *|-----------------------------------------------------------| + *| | | | | | | | | | |prt| | | | + *|------------------------------------------------------ | + *| |m l|m d|m u|m r| | | l | d | u | r | | | | + *|-----------------------------------------------------------| + *| | | | | |mb1|mb2| |hm |pgd|pgu|end| | + *|-----------------------------------------------------------| + *| | | | | | | | | | | + *`-----------------------------------------------------------' + +---- Layer 2 - NL +numbers numbers numbers... +first key (top left) to return to BL +menu key (KC_APP) is used to move to the next layer + *,-----------------------------------------------------------. + *|BL | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | | | | + *|-----------------------------------------------------------| + *| | 4 | 5 | 6 | * | / | | 4 | 5 | 6 | * | / | ] | | + *|------------------------------------------------------ | + *| | 7 | 8 | 9 | + | - | | 1 | 2 | 3 | + | - | | | + *|-----------------------------------------------------------| + *| | | 0 | , | . | = | | | 0 | , | . | = | | + *|-----------------------------------------------------------| + *| | | | | | | | | RL | | + *`-----------------------------------------------------------' + +---- Layer 3 - BL +all the fancy lights +and useful reset button (top right) + *,-----------------------------------------------------------. + *|BL | | | | | | | | | | | | |Reset | + *|-----------------------------------------------------------| + *| |tog|mod|hui|hud| | |sai|sad|vai|vad| | | | + *|------------------------------------------------------ | + *| |sta|bre|rai|swi| | |sna|kni|gra|xms| | | | + *|-----------------------------------------------------------| + *| | |bd |bt |bi |bs | | | | | | | | + *|-----------------------------------------------------------| + *| | | | | | | | | BL | | + *`-----------------------------------------------------------' diff --git a/keyboards/dz60/keymaps/iso_split-spacebar/keymap.c b/keyboards/dz60/keymaps/iso_split-spacebar/keymap.c new file mode 100644 index 000000000..7c17a6f5f --- /dev/null +++ b/keyboards/dz60/keymaps/iso_split-spacebar/keymap.c @@ -0,0 +1,193 @@ +// using as reference +// https://docs.qmk.fm/#/keymap + +// thanks to atlacat, hailbreno, itsaferbie and weeheavy... + +// and special thanks to AGausmann and drashna for the layer-activated RGB underglow +// https://www.reddit.com/r/olkb/comments/6t1vdu/update_layeractivated_rgb_underglow/ +// https://github.com/AGausmann/qmk_firmware/blob/agausmann-v3.x/keyboards/nyquist/keymaps/agausmann/keymap.c + +#include QMK_KEYBOARD_H + + +// Helpful defines +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +/* +* Each layer gets a name for readability. +* The underscores don't mean anything - you can +* have a layer called STUFF or any other name. +* Layer names don't all need to be of the same +* length, and you can also skip them entirely +* and just use numbers. +* +*/ +#define BL 0 // Base Layer +#define FL 1 // Function Layer +#define NL 2 // Numpad Layer +#define RL 3 // RGB Layer + +/* +* Let's give an easier name to the RGB modes +* and assign the ones we want to the different layer +* these will then be used by the function below +* +*/ +#define RGB_STA RGB_M_P //rgb static +#define RGB_BRE RGB_M_B //rgb breathe +#define RGB_RAI RGB_M_R //rgb rainbow +#define RGB_SWI RGB_M_SW //rgb swirl +#define RGB_SNA RGB_M_SN //rgb snake +#define RGB_KNI RGB_M_K //rgb knight +#define RGB_GRA RGB_M_G //rgb gradient +#define RGB_XMS RGB_M_X //rgb christmas +// +#define RGB_BL_MODE rgblight_mode_noeeprom(3) //rgb mode for BL layer +#define RGB_BL_LIGHT rgblight_sethsv_noeeprom_turquoise() //rgb light for BL layer +// +#define RGB_FL_MODE rgblight_mode_noeeprom(1) //rgb mode for FL layer +#define RGB_FL_LIGHT rgblight_sethsv_noeeprom_orange() //rgb light for FL layer +// +#define RGB_NL_MODE rgblight_mode_noeeprom(12) //rgb mode for NL layer +#define RGB_NL_LIGHT rgblight_sethsv_noeeprom_turquoise() //rgb light for NL layer +// +#define RGB_RL_MODE rgblight_mode_noeeprom(22) //rgb mode for RL layer +#define RGB_RL_LIGHT rgblight_sethsv_noeeprom_red() //rgb light for RL layer + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* Keymap BL: Base Layer (Default Layer) + * + * ,-----------------------------------------------------------. + * | ' | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |Backsp | + * |-----------------------------------------------------------| + * | Tab | q | w | e | r | t | y | u | i | o | p | [ | ] |enter| + * |------------------------------------------------------ | + * | Caps | a | s | d | f | g | h | j | k | l | ; | ' | # | | + * |-----------------------------------------------------------| + * |Shft| < | z | x | c | v | b | n | m | , | . | / | Shift | + * |-----------------------------------------------------------| + * |Ctrl|Gui |Alt | Space | FN | Space |Alt |Gui | NL |Ctrl | + * `-----------------------------------------------------------' + */ + [BL] = LAYOUT_60_iso_split( + // 1 2 3 4 5 6 7 8 9 10 11 12 13 14 + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, + KC_TAB , KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(FL), KC_SPC, KC_RALT, KC_RGUI, TO(NL), KC_RCTL), + + /* Keymap FL: Function Layer + * + * ,-----------------------------------------------------------. + * |ESC|F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12| DEL | + * |-----------------------------------------------------------| + * | | | | | | | | | | |prt| | | | + * |------------------------------------------------------ | + * | |m l|m d|m u|m r| | | l | d | u | r | | | | + * |-----------------------------------------------------------| + * | | | | | |mb1|mb2| |hm |pgd|pgu|end| | + * |-----------------------------------------------------------| + * | | | | | | | | | | | + * `-----------------------------------------------------------' + */ + [FL] = LAYOUT_60_iso_split( + // 1 2 3 4 5 6 7 8 9 10 11 12 13 14 + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, + _______ , _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, _______, _______, + _______, KC_MS_LEFT,KC_MS_DOWN,KC_MS_UP, KC_MS_RIGHT,_______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, _______, _______, _______, + _______, _______, _______, _______, _______, KC_MS_BTN1,KC_MS_BTN2,_______, KC_HOME, KC_PGDOWN, KC_PGUP, KC_END, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + + /* Keymap NL: Numpad Layer + * + * ,-----------------------------------------------------------. + * |BL | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | | | | + * |-----------------------------------------------------------| + * | | 4 | 5 | 6 | * | / | | 4 | 5 | 6 | * | / | ] | | + * |------------------------------------------------------ | + * | | 7 | 8 | 9 | + | - | | 1 | 2 | 3 | + | - | | | + * |-----------------------------------------------------------| + * | | | 0 | , | . | = | | | 0 | , | . | = | | + * |-----------------------------------------------------------| + * | | | | | | | | | RL | | + * `-----------------------------------------------------------' + */ + [NL] = LAYOUT_60_iso_split( + // 1 2 3 4 5 6 7 8 9 10 11 12 13 14 + TG(NL), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, _______, + _______, KC_4, KC_5, KC_6, KC_PAST, KC_PSLS, _______, KC_4, KC_5, KC_6, KC_PAST, KC_PSLS, _______, + _______, KC_7, KC_8, KC_9, KC_PPLS, KC_PMNS, _______, KC_1, KC_2, KC_3, KC_PPLS, KC_PMNS, _______, _______, + _______, KC_0, KC_COMM, KC_DOT, KC_EQL, _______, _______, _______, KC_0, KC_COMM, KC_DOT, KC_EQL, _______, + _______, _______, _______, _______, MO(FL), _______, _______, _______, TG(RL), _______), + + /* Keymap RL: RGB Layer + * + * ,-----------------------------------------------------------. + * |BL | | | | | | | | | | | | |Reset | + * |-----------------------------------------------------------| + * | |tog|mod|hui|hud| | |sai|sad|vai|vad| | | | + * |------------------------------------------------------ | + * | |sta|bre|rai|swi| | |sna|kni|gra|xms| | | | + * |-----------------------------------------------------------| + * | | |bd |bt |bi |bs | | | | | | | | + * |-----------------------------------------------------------| + * | | | | | | | | | BL | | + * `-----------------------------------------------------------' + */ + [RL] = LAYOUT_60_iso_split( + // 1 2 3 4 5 6 7 8 9 10 11 12 13 14 + TG(RL), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET, + _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, _______, _______, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, + _______, RGB_STA, RGB_BRE, RGB_RAI, RGB_SWI, _______, _______, RGB_SNA, RGB_KNI, RGB_GRA, RGB_XMS, _______, _______, _______, + _______, BL_DEC, BL_TOGG, BL_INC, BL_STEP, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, MO(FL), _______, _______, _______, TO(BL), _______), + + +}; + + +void persistent_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + + +// layer-activated RGB underglow + +void matrix_scan_user(void) { + + #ifdef RGBLIGHT_ENABLE + + static uint8_t old_layer = 1; + uint8_t new_layer = biton32(layer_state); + + if (old_layer != new_layer) { + switch (new_layer) { + case BL: + RGB_BL_MODE; + RGB_BL_LIGHT; + break; + case FL: + RGB_FL_MODE; + RGB_FL_LIGHT; + break; + case NL: + RGB_NL_MODE; + // RGB_NL_LIGHT; + break; + case RL: + RGB_RL_MODE; + // RGB_RL_LIGHT; + break; + } + + old_layer = new_layer; + } + + #endif //RGBLIGHT_ENABLE + +} From 6c086f2b6d340c22462f6d6d3cb1d9b583123a65 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 19 Oct 2018 12:42:28 -0700 Subject: [PATCH 319/788] Revert changes to chibiOS-contrib (#4176) * Revert "Keymap: qwerty_code_friendly: use numpad layout for f-keys (#4170)" This reverts commit efc88a0b16055dc0b2f94da8c46ea8fadeab70f4. * Fix keymap --- lib/chibios-contrib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/chibios-contrib b/lib/chibios-contrib index 2de67e2f4..ede48346e 160000 --- a/lib/chibios-contrib +++ b/lib/chibios-contrib @@ -1 +1 @@ -Subproject commit 2de67e2f4a268eae072c5fd76a1b160124cee4f6 +Subproject commit ede48346eee4b8d6847c19bc01420bee76a5e486 From f775168c4fa870c045984069a1b55eb9d269098c Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 20 Oct 2018 10:47:59 +1100 Subject: [PATCH 320/788] Keymap: qwerty_code_friendly: update readme, comments (#4178) --- .../ergodox/qwerty_code_friendly/keymap.c | 2 +- .../ergodox/qwerty_code_friendly/readme.md | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/layouts/community/ergodox/qwerty_code_friendly/keymap.c b/layouts/community/ergodox/qwerty_code_friendly/keymap.c index 2a441be0e..43a1d1ad8 100644 --- a/layouts/community/ergodox/qwerty_code_friendly/keymap.c +++ b/layouts/community/ergodox/qwerty_code_friendly/keymap.c @@ -445,7 +445,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_MPRV, K80(L2K2), K80(L2K3), KC_MNXT, KC_TRNS, KC_MPLY ), -/* Keymap 3: Entire Words (one for each key) +/* Keymap 3: Entire Words (one for each key) & Numbers * * .--------------------------------------------------. .--------------------------------------------------. * | | 1 | 2 | 3 | 4 | 5 | | | | 6 | 7 | 8 | 9 | 0 | | diff --git a/layouts/community/ergodox/qwerty_code_friendly/readme.md b/layouts/community/ergodox/qwerty_code_friendly/readme.md index 23afa656f..9abd071b9 100644 --- a/layouts/community/ergodox/qwerty_code_friendly/readme.md +++ b/layouts/community/ergodox/qwerty_code_friendly/readme.md @@ -30,7 +30,7 @@ Some optional behavior is configurable without editing the code using `CFQ_` prefixed defines which can be set by passing `EXTRAFLAGS` to make. - `CFQ_USER_KEY0` - (0..7) are used for custom-keys + (0..8) are used for custom-keys - `CFQ_USE_MOMENTARY_LAYER_KEYS` is used to prevent layer keys from toggling when tapped. - `CFQ_USE_SHIFT_QUOTES` @@ -122,12 +122,7 @@ Notes: '--------------------' '--------------------' ``` -## Keymap 2: Media, Mouse Keys and Numbers - -Notes: - -- Numbers are included on this layer since some applications differentiate - between numbers top row and keypad. +## Keymap 2: F-Keys, Media & Mouse Keys ``` .--------------------------------------------------. .--------------------------------------------------. @@ -150,12 +145,17 @@ Notes: '--------------------' '--------------------' ``` -## Keymap 3: F-Keys & User Defined Words +## Keymap 3: User Defined Words & Numbers This is for assigning whole words to single keys. You can define the arguments (which must be quoted) using: `CFQ_WORD_[A-Z]` eg: `-DCFQ_WORD_E=\"my@email.com\"` +Notes: + +- Numbers are included on this layer since some applications differentiate + between numbers top row and keypad. + ``` .--------------------------------------------------. .--------------------------------------------------. | | 1 | 2 | 3 | 4 | 5 | | | | 6 | 7 | 8 | 9 | 0 | | @@ -180,7 +180,7 @@ eg: `-DCFQ_WORD_E=\"my@email.com\"` ## Changelog - 2018/10/19 - Move F-Keys to numpad like layout. + Move F-Keys to key-pad like layout. - 2018/05/29 Add number keys for cases when keypad numbers are handled differently. From 26d2ef2ad1c9b040151d1aac19c4fff3f8b55dd5 Mon Sep 17 00:00:00 2001 From: Alex Mayer Date: Sat, 20 Oct 2018 01:07:48 -0400 Subject: [PATCH 321/788] Ergodox EZ: Use Correct Const For LED Color --- keyboards/ergodox_ez/keymaps/default/keymap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/ergodox_ez/keymaps/default/keymap.c b/keyboards/ergodox_ez/keymaps/default/keymap.c index e400ffcd3..ef70decd5 100644 --- a/keyboards/ergodox_ez/keymaps/default/keymap.c +++ b/keyboards/ergodox_ez/keymaps/default/keymap.c @@ -266,7 +266,7 @@ uint32_t layer_state_set_user(uint32_t state) { ergodox_right_led_2_on(); ergodox_right_led_3_on(); #ifdef RGBLIGHT_COLOR_LAYER_7 - rgblight_setrgb(RGBLIGHT_COLOR_LAYER_6); + rgblight_setrgb(RGBLIGHT_COLOR_LAYER_7); #endif break; default: From ea17e363a61b925c1c6da0146fe383630a7848c0 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sat, 20 Oct 2018 08:40:32 -0700 Subject: [PATCH 322/788] Add instructions for zadig when bootloader device is unknown --- docs/faq_build.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/docs/faq_build.md b/docs/faq_build.md index 7d17df074..00a0d386b 100644 --- a/docs/faq_build.md +++ b/docs/faq_build.md @@ -17,7 +17,7 @@ or just: Note that running `make` with `sudo` is generally *not* a good idea, and you should use one of the former methods, if possible. -## Linux `udev` Rules +### Linux `udev` Rules On Linux, you'll need proper privileges to access the MCU. You can either use `sudo` when flashing firmware, or place these files in `/etc/udev/rules.d/`. @@ -37,6 +37,14 @@ SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2ff0", MODE:="066 SUBSYSTEMS=="usb", ATTRS{idVendor}=="feed", MODE:="0666" ``` +## Unknown Device for DFU Bootloader + +If you're using Windows to flash your keyboard, and you are running into issues, check the Device Manager. If you see an "Unknown Device" when the keyboard is in "bootloader mode", then you may have a driver issue. + +Re-running the installation script for MSYS2 may help (eg run `./util/qmk_install.sh` from MSYS2/WSL) or reinstalling the QMK Toolbox may fix the issue. + +If that doesn't work, then you may need to grab the [Zadig Utility](https://zadig.akeo.ie/). Download this, find the device in question, and select the `WinUS(libusb-1.0)` option, and hit "Reinstall driver". Once you've done that, try flashing your board, again. + ## WINAVR is Obsolete It is no longer recommended and may cause some problem. See [TMK Issue #99](https://github.com/tmk/tmk_keyboard/issues/99). From 4fffef88535dd62c19e7a1db10c557895ef9cd86 Mon Sep 17 00:00:00 2001 From: Dylan Khor Date: Sun, 21 Oct 2018 12:05:45 -0400 Subject: [PATCH 323/788] Keymap: add initial khord iris keymap (#4188) --- keyboards/iris/keymaps/khord/config.h | 38 +++++++ keyboards/iris/keymaps/khord/keymap.c | 136 ++++++++++++++++++++++++++ keyboards/iris/keymaps/khord/rules.mk | 3 + 3 files changed, 177 insertions(+) create mode 100644 keyboards/iris/keymaps/khord/config.h create mode 100644 keyboards/iris/keymaps/khord/keymap.c create mode 100644 keyboards/iris/keymaps/khord/rules.mk diff --git a/keyboards/iris/keymaps/khord/config.h b/keyboards/iris/keymaps/khord/config.h new file mode 100644 index 000000000..9b44bca79 --- /dev/null +++ b/keyboards/iris/keymaps/khord/config.h @@ -0,0 +1,38 @@ +/* +Copyright 2017 Danny Nguyen + +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 . +*/ + +#pragma once + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + +#define TAPPING_TERM 150 + +#undef RGBLED_NUM +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 12 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 diff --git a/keyboards/iris/keymaps/khord/keymap.c b/keyboards/iris/keymaps/khord/keymap.c new file mode 100644 index 000000000..379617a8b --- /dev/null +++ b/keyboards/iris/keymaps/khord/keymap.c @@ -0,0 +1,136 @@ +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +#define _QWERTY 0 +#define _LOWER 1 +#define _RAISE 2 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + LOWER, + RAISE, + ADJUST, + ADMIN, + SMSPC1 +}; + +enum { + SFT_CAP = 0 +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_QWERTY] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_TAB, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_QUOT, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + TD(SFT_CAP),KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, SFT_T(KC_ENT), + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_LCTL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_HOME, KC_END, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + KC_LGUI, LOWER, KC_ENT, KC_SPC, RAISE, KC_LALT + // └────────┴────────┴────────┘ └────────┴────────┴────────┘ + ), + + [_LOWER] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + RESET, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + KC_DEL, _______, KC_LEFT, KC_RGHT, KC_UP, KC_LBRC, KC_RBRC, KC_P4, KC_P5, KC_P6, KC_PLUS, KC_PIPE, + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + BL_STEP, _______, _______, _______, KC_DOWN, KC_LCBR, KC_LPRN, KC_RPRN, KC_RCBR, KC_P1, KC_P2, KC_P3, KC_MINS, _______, + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + _______, _______, KC_DEL, KC_DEL, _______, KC_P0 + // └────────┴────────┴────────┘ └────────┴────────┴────────┘ + ), + + [_RAISE] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_F12, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + RGB_TOG, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + RGB_MOD, KC_MPRV, KC_MNXT, KC_VOLU, KC_PGUP, KC_UNDS, KC_EQL, KC_HOME, RGB_HUI, RGB_SAI, RGB_VAI, KC_BSLS, + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_MUTE, KC_MSTP, KC_MPLY, KC_VOLD, KC_PGDN, KC_MINS, KC_LPRN, _______, KC_PLUS, KC_END, RGB_HUD, RGB_SAD, RGB_VAD, _______, + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + _______, _______, _______, _______, _______, _______ + // └────────┴────────┴────────┘ └────────┴────────┴────────┘ + ), + + [_ADJUST] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + _______, _______, _______, _______, _______, _______ + // └────────┴────────┴────────┘ └────────┴────────┴────────┘ + ) +}; + +qk_tap_dance_action_t tap_dance_actions[] = { + [SFT_CAP] = ACTION_TAP_DANCE_DOUBLE(KC_LSFT, KC_CAPS) +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + break; + case ADMIN: + if (record->event.pressed) { + SEND_STRING("Administrator"); + } + return false; + break; + case SMSPC1: + if (record->event.pressed) { + SEND_STRING("Simspace1!"); + } + return false; + break; + } + return true; +} diff --git a/keyboards/iris/keymaps/khord/rules.mk b/keyboards/iris/keymaps/khord/rules.mk new file mode 100644 index 000000000..c46edbd12 --- /dev/null +++ b/keyboards/iris/keymaps/khord/rules.mk @@ -0,0 +1,3 @@ +RGBLIGHT_ENABLE = yes +BACKLIGHT_ENABLE = yes +TAP_DANCE_ENABLE = yes From 877c285ec8c5509f665b558cb2bcaa89d6093055 Mon Sep 17 00:00:00 2001 From: Vyolle <44031868+Vyolle@users.noreply.github.com> Date: Sun, 21 Oct 2018 11:15:48 -0500 Subject: [PATCH 324/788] Keymap: Renabled EXTRAKEYS in layout (#4174) * Renabled EXTRAKEYS. * Update keyboards/iris/keymaps/vyolle_steno/rules.mk Co-Authored-By: Vyolle --- keyboards/iris/keymaps/vyolle_steno/rules.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/keyboards/iris/keymaps/vyolle_steno/rules.mk b/keyboards/iris/keymaps/vyolle_steno/rules.mk index e41231683..ebe1c86a0 100644 --- a/keyboards/iris/keymaps/vyolle_steno/rules.mk +++ b/keyboards/iris/keymaps/vyolle_steno/rules.mk @@ -1,7 +1,7 @@ -EXTRAKEY_ENABLE = no -MOUSEKEY_ENABLE = no # Mouse keys(+4700) -STENO_ENABLE = yes # Additional protocols for Stenography(+1700), requires VIRTSER +EXTRAKEY_ENABLE = yes # Disable if you run out of usb endpoints. Media keys need this to work. +MOUSEKEY_ENABLE = no # Mouse keys(+4700) Uses extra usb endpoints. +STENO_ENABLE = yes # Additional protocols for Stenography(+1700), requires VIRTSER. AUDIO_ENABLE = no # Audio output on port C6 MIDI_ENABLE = no # MIDI controls NKRO_ENABLE = yes -BOOTMAGIC_ENABLE = yes \ No newline at end of file +BOOTMAGIC_ENABLE = yes From 8e3330bbf6f8c4faf39a3df20fa3ab62910c8b19 Mon Sep 17 00:00:00 2001 From: a-chol Date: Sun, 21 Oct 2018 18:20:24 +0200 Subject: [PATCH 325/788] Keyboard: bminiex : Working backlight (#4171) * bminiex : Working backlight * bminiex keyboard with fixes * bminiex keyboard more fixes --- keyboards/bminiex/backlight.c | 211 +++++++++++ keyboards/bminiex/backlight_custom.h | 13 + keyboards/bminiex/bminiex.c | 97 +++++ keyboards/bminiex/bminiex.h | 58 +++ keyboards/bminiex/breathing_custom.h | 140 ++++++++ keyboards/bminiex/config.h | 41 +++ keyboards/bminiex/i2c.c | 106 ++++++ keyboards/bminiex/i2c.h | 25 ++ keyboards/bminiex/keymaps/default/keymap.c | 29 ++ keyboards/bminiex/matrix.c | 122 +++++++ keyboards/bminiex/readme.md | 14 + keyboards/bminiex/rules.mk | 56 +++ keyboards/bminiex/usbconfig.h | 396 +++++++++++++++++++++ tmk_core/common/backlight.h | 5 +- 14 files changed, 1309 insertions(+), 4 deletions(-) create mode 100644 keyboards/bminiex/backlight.c create mode 100644 keyboards/bminiex/backlight_custom.h create mode 100644 keyboards/bminiex/bminiex.c create mode 100644 keyboards/bminiex/bminiex.h create mode 100644 keyboards/bminiex/breathing_custom.h create mode 100644 keyboards/bminiex/config.h create mode 100644 keyboards/bminiex/i2c.c create mode 100644 keyboards/bminiex/i2c.h create mode 100644 keyboards/bminiex/keymaps/default/keymap.c create mode 100644 keyboards/bminiex/matrix.c create mode 100644 keyboards/bminiex/readme.md create mode 100644 keyboards/bminiex/rules.mk create mode 100644 keyboards/bminiex/usbconfig.h diff --git a/keyboards/bminiex/backlight.c b/keyboards/bminiex/backlight.c new file mode 100644 index 000000000..94e8126d8 --- /dev/null +++ b/keyboards/bminiex/backlight.c @@ -0,0 +1,211 @@ +/** + * Backlighting code for PS2AVRGB boards (ATMEGA32A) + * Kenneth A. (github.com/krusli | krusli.me) + */ + +#include "backlight.h" +#include "quantum.h" + +#include +#include + +#include "backlight_custom.h" +#include "breathing_custom.h" + +// DEBUG +#include +#include + +// Port D: digital pins of the AVR chipset +#define NUMLOCK_PORT (1 << 0) // D0 +#define CAPSLOCK_PORT (1 << 1) // D1 +#define BACKLIGHT_PORT (1 << 4) // D4 +#define SCROLLLOCK_PORT (1 << 6) // D6 + +#define TIMER_CLK_DIV64 0x03 ///< Timer clocked at F_CPU/64 +#define TIMER1PRESCALE TIMER_CLK_DIV64 ///< timer 1 prescaler default + +#define TIMER_PRESCALE_MASK 0x07 ///< Timer Prescaler Bit-Mask + +#define PWM_MAX 0xFF +#define TIMER_TOP 255 // 8 bit PWM + +extern backlight_config_t backlight_config; + +/** + * References + * Port Registers: https://www.arduino.cc/en/Reference/PortManipulation + * TCCR1A: https://electronics.stackexchange.com/questions/92350/what-is-the-difference-between-tccr1a-and-tccr1b + * Timers: http://www.avrbeginners.net/architecture/timers/timers.html + * 16-bit timer setup: http://sculland.com/ATmega168/Interrupts-And-Timers/16-Bit-Timer-Setup/ + * PS2AVRGB firmware: https://github.com/showjean/ps2avrU/tree/master/firmware + */ + +// @Override +// turn LEDs on and off depending on USB caps/num/scroll lock states. +__attribute__ ((weak)) +void led_set_user(uint8_t usb_led) { + if (usb_led & (1 << USB_LED_NUM_LOCK)) { + // turn on + DDRD |= NUMLOCK_PORT; + PORTD |= NUMLOCK_PORT; + } else { + // turn off + DDRD &= ~NUMLOCK_PORT; + PORTD &= ~NUMLOCK_PORT; + } + + if (usb_led & (1 << USB_LED_CAPS_LOCK)) { + DDRD |= CAPSLOCK_PORT; + PORTD |= CAPSLOCK_PORT; + } else { + DDRD &= ~CAPSLOCK_PORT; + PORTD &= ~CAPSLOCK_PORT; + } + + if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { + DDRD |= SCROLLLOCK_PORT; + PORTD |= SCROLLLOCK_PORT; + } else { + DDRD &= ~SCROLLLOCK_PORT; + PORTD &= ~SCROLLLOCK_PORT; + } +} + +#ifdef BACKLIGHT_ENABLE + +// sets up Timer 1 for 8-bit PWM +void timer1PWMSetup(void) { // NOTE ONLY CALL THIS ONCE + // default 8 bit mode + TCCR1A &= ~(1 << 1); // cbi(TCCR1A,PWM11); <- set PWM11 bit to HIGH + TCCR1A |= (1 << 0); // sbi(TCCR1A,PWM10); <- set PWM10 bit to LOW + + // clear output compare value A + // outb(OCR1AH, 0); + // outb(OCR1AL, 0); + + // clear output comparator registers for B + OCR1BH = 0; // outb(OCR1BH, 0); + OCR1BL = 0; // outb(OCR1BL, 0); +} + +bool is_init = false; +void timer1Init(void) { + // timer1SetPrescaler(TIMER1PRESCALE) + // set to DIV/64 + (TCCR1B) = ((TCCR1B) & ~TIMER_PRESCALE_MASK) | TIMER1PRESCALE; + + // reset TCNT1 + TCNT1H = 0; // outb(TCNT1H, 0); + TCNT1L = 0; // outb(TCNT1L, 0); + + // TOIE1: Timer Overflow Interrupt Enable (Timer 1); + TIMSK |= _BV(TOIE1); // sbi(TIMSK, TOIE1); + + is_init = true; +} + +void timer1UnInit(void) { + // set prescaler back to NONE + (TCCR1B) = ((TCCR1B) & ~TIMER_PRESCALE_MASK) | 0x00; // TIMERRTC_CLK_STOP + + // disable timer overflow interrupt + TIMSK &= ~_BV(TOIE1); // overflow bit? + + setPWM(0); + + is_init = false; +} + + +// handle TCNT1 overflow +//! Interrupt handler for tcnt1 overflow interrupt +ISR(TIMER1_OVF_vect, ISR_NOBLOCK) +{ + // sei(); + // handle breathing here + #ifdef BACKLIGHT_BREATHING + if (is_breathing()) { + custom_breathing_handler(); + } + #endif +} + +// enable timer 1 PWM +// timer1PWMBOn() +void timer1PWMBEnable(void) { + // turn on channel B (OC1B) PWM output + // set OC1B as non-inverted PWM + TCCR1A |= _BV(COM1B1); + TCCR1A &= ~_BV(COM1B0); +} + +// disable timer 1 PWM +// timer1PWMBOff() +void timer1PWMBDisable(void) { + TCCR1A &= ~_BV(COM1B1); + TCCR1A &= ~_BV(COM1B0); +} + +void enableBacklight(void) { + DDRD |= BACKLIGHT_PORT; // set digital pin 4 as output + PORTD |= BACKLIGHT_PORT; // set digital pin 4 to high +} + +void disableBacklight(void) { + // DDRD &= ~BACKLIGHT_PORT; // set digital pin 4 as input + PORTD &= ~BACKLIGHT_PORT; // set digital pin 4 to low +} + +void startPWM(void) { + timer1Init(); + timer1PWMBEnable(); + enableBacklight(); +} + +void stopPWM(void) { + timer1UnInit(); + disableBacklight(); + timer1PWMBDisable(); +} + +void b_led_init_ports(void) { + /* turn backlight on/off depending on user preference */ + #if BACKLIGHT_ON_STATE == 0 + // DDRx register: sets the direction of Port D + // DDRD &= ~BACKLIGHT_PORT; // set digital pin 4 as input + PORTD &= ~BACKLIGHT_PORT; // set digital pin 4 to low + #else + DDRD |= BACKLIGHT_PORT; // set digital pin 4 as output + PORTD |= BACKLIGHT_PORT; // set digital pin 4 to high + #endif + + timer1PWMSetup(); + startPWM(); + + #ifdef BACKLIGHT_BREATHING + breathing_enable(); + #endif +} + +void b_led_set(uint8_t level) { + if (level > BACKLIGHT_LEVELS) { + level = BACKLIGHT_LEVELS; + } + + setPWM((int)(TIMER_TOP * (float) level / BACKLIGHT_LEVELS)); +} + +// called every matrix scan +void b_led_task(void) { + // do nothing for now +} + +void setPWM(uint16_t xValue) { + if (xValue > TIMER_TOP) { + xValue = TIMER_TOP; + } + OCR1B = xValue; // timer1PWMBSet(xValue); +} + +#endif // BACKLIGHT_ENABLE diff --git a/keyboards/bminiex/backlight_custom.h b/keyboards/bminiex/backlight_custom.h new file mode 100644 index 000000000..51365fe3b --- /dev/null +++ b/keyboards/bminiex/backlight_custom.h @@ -0,0 +1,13 @@ +/** + * Backlighting code for PS2AVRGB boards (ATMEGA32A) + * Kenneth A. (github.com/krusli | krusli.me) + */ + +#pragma once + +#include +void b_led_init_ports(void); +void b_led_set(uint8_t level); +void b_led_task(void); +void setPWM(uint16_t xValue); + diff --git a/keyboards/bminiex/bminiex.c b/keyboards/bminiex/bminiex.c new file mode 100644 index 000000000..d9b05aba5 --- /dev/null +++ b/keyboards/bminiex/bminiex.c @@ -0,0 +1,97 @@ +/* +Copyright 2017 Luiz Ribeiro + +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 . +*/ + +#include "bminiex.h" +#include "rgblight.h" + +#include + +#include "action_layer.h" +#include "i2c.h" +#include "quantum.h" + +#include "backlight.h" +#include "backlight_custom.h" + +// for keyboard subdirectory level init functions +// @Override +void matrix_init_kb(void) { + // call user level keymaps, if any + matrix_init_user(); +} + +#ifdef BACKLIGHT_ENABLE +/// Overrides functions in `quantum.c` +void backlight_init_ports(void) { + b_led_init_ports(); +} + +void backlight_task(void) { + b_led_task(); +} + +void backlight_set(uint8_t level) { + b_led_set(level); +} +#endif + +#ifdef RGBLIGHT_ENABLE +extern rgblight_config_t rgblight_config; + +// custom RGB driver +void rgblight_set(void) { + if (!rgblight_config.enable) { + for (uint8_t i=0; i + +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 . +*/ + +#pragma once + +#include "quantum.h" + +#define LAYOUT( \ + K05, K25, K35, K45, K55, K06, KA6, KA7, K07, KB5, KC5, KD5, KE5, KD1, KE1, KE2, K65, K75, K85, K95, \ + K04, K14, K24, K34, K44, K54, K16, KB6, KB7, K17, KA4, KB4, KC4, KE4, KD0, K64, K74, K84, K94, \ + K03, K13, K23, K33, K43, K53, K26, KC6, KC7, K27, KA3, KB3, KC3, KD3, K67, K63, K73, K83, \ + K02, K12, K22, K32, K42, K52, K36, KD6, KD7, K37, KA2, KB2, KC2, KD2, KE0, K62, K72, K82, K92, \ + K01, K30, K11, K21, K31, K41, K51, K46, KE6, KE7, K47, KA1, KB1, K86, K77, K61, K71, K81, \ + K00, K10, K20, K56, K57, KB0, KC0, K66, K76, K96, K60, K80, K90 \ +){ \ + { K00, K10, K20, K30, KC_NO, KC_NO, K60, KC_NO, K80, K90, KC_NO, KB0, KC0, KD0, KE0 }, \ + { K01, K11, K21, K31, K41, K51, K61, K71, K81, KC_NO, KA1, KB1, KC_NO, KD1, KE1 }, \ + { K02, K12, K22, K32, K42, K52, K62, K72, K82, K92, KA2, KB2, KC2, KD2, KE2 }, \ + { K03, K13, K23, K33, K43, K53, K63, K73, K83, KC_NO, KA3, KB3, KC3, KD3, KC_NO }, \ + { K04, K14, K24, K34, K44, K54, K64, K74, K84, K94, KA4, KB4, KC4, KC_NO, KE4 }, \ + { K05, KC_NO, K25, K35, K45, K55, K65, K75, K85, K95, KC_NO, KB5, KC5, KD5, KE5 }, \ + { K06, K16, K26, K36, K46, K56, K66, K76, K86, K96, KA6, KB6, KC6, KD6, KE6 }, \ + { K07, K17, K27, K37, K47, K57, K67, K77, KC_NO, KC_NO, KA7, KB7, KC7, KD7, KE7 } \ +} + +#define LAYOUT_kc( \ + K05, K25, K35, K45, K55, K06, KA6, KA7, K07, KB5, KC5, KD5, KE5, KD1, KE1, KE2, K65, K75, K85, K95, \ + K04, K14, K24, K34, K44, K54, K16, KB6, KB7, K17, KA4, KB4, KC4, KE4, KD0, K64, K74, K84, K94, \ + K03, K13, K23, K33, K43, K53, K26, KC6, KC7, K27, KA3, KB3, KC3, KD3, K67, K63, K73, K83, \ + K02, K12, K22, K32, K42, K52, K36, KD6, KD7, K37, KA2, KB2, KC2, KD2, KE0, K62, K72, K82, K92, \ + K01, K30, K11, K21, K31, K41, K51, K46, KE6, KE7, K47, KA1, KB1, K86, K77, K61, K71, K81, \ + K00, K10, K20, K56, K57, KB0, KC0, K66, K76, K96, K60, K80, K90 \ +) \ +{ \ + { KC_##K00, KC_##K10, KC_##K20, KC_##K30, KC_NO, KC_NO, KC_##K60, KC_NO, KC_##K80, KC_##K90, KC_NO, KC_##KB0, KC_##KC0, KC_##KD0, KC_##KE0 }, \ + { KC_##K01, KC_##K11, KC_##K21, KC_##K31, KC_##K41, KC_##K51, KC_##K61, KC_##K71, KC_##K81, KC_NO, KC_##KA1, KC_##KB1, KC_NO, KC_##KD1, KC_##KE1 }, \ + { KC_##K02, KC_##K12, KC_##K22, KC_##K32, KC_##K42, KC_##K52, KC_##K62, KC_##K72, KC_##K82, KC_##K92, KC_##KA2, KC_##KB2, KC_##KC2, KC_##KD2, KC_##KE2 }, \ + { KC_##K03, KC_##K13, KC_##K23, KC_##K33, KC_##K43, KC_##K53, KC_##K63, KC_##K73, KC_##K83, KC_NO, KC_##KA3, KC_##KB3, KC_##KC3, KC_##KD3, KC_NO }, \ + { KC_##K04, KC_##K14, KC_##K24, KC_##K34, KC_##K44, KC_##K54, KC_##K64, KC_##K74, KC_##K84, KC_##K94, KC_##KA4, KC_##KB4, KC_##KC4, KC_NO, KC_##KE4 }, \ + { KC_##K05, KC_NO, KC_##K25, KC_##K35, KC_##K45, KC_##K55, KC_##K65, KC_##K75, KC_##K85, KC_##K95, KC_NO, KC_##KB5, KC_##KC5, KC_##KD5, KC_##KE5 }, \ + { KC_##K06, KC_##K16, KC_##K26, KC_##K36, KC_##K46, KC_##K56, KC_##K66, KC_##K76, KC_##K86, KC_##K96, KC_##KA6, KC_##KB6, KC_##KC6, KC_##KD6, KC_##KE6 }, \ + { KC_##K07, KC_##K17, KC_##K27, KC_##K37, KC_##K47, KC_##K57, KC_##K67, KC_##K77, KC_NO, KC_NO, KC_##KA7, KC_##KB7, KC_##KC7, KC_##KD7, KC_##KE7 } \ +} + diff --git a/keyboards/bminiex/breathing_custom.h b/keyboards/bminiex/breathing_custom.h new file mode 100644 index 000000000..71416b1b4 --- /dev/null +++ b/keyboards/bminiex/breathing_custom.h @@ -0,0 +1,140 @@ +/** + * Breathing effect code for PS2AVRGB boards (ATMEGA32A) + * Works in conjunction with `backlight.c`. + * + * Code adapted from `quantum.c` to register with the existing TIMER1 overflow + * handler in `backlight.c` instead of setting up its own timer. + * Kenneth A. (github.com/krusli | krusli.me) + */ + +#ifdef BACKLIGHT_ENABLE +#ifdef BACKLIGHT_BREATHING + +#include "backlight_custom.h" + +#ifndef BREATHING_PERIOD +#define BREATHING_PERIOD 6 +#endif + +#define breathing_min() do {breathing_counter = 0;} while (0) +#define breathing_max() do {breathing_counter = breathing_period * 244 / 2;} while (0) + +// TODO make this share code with quantum.c + +#define BREATHING_NO_HALT 0 +#define BREATHING_HALT_OFF 1 +#define BREATHING_HALT_ON 2 +#define BREATHING_STEPS 128 + +static uint8_t breathing_period = BREATHING_PERIOD; +static uint8_t breathing_halt = BREATHING_NO_HALT; +static uint16_t breathing_counter = 0; + +static bool breathing = false; + +bool is_breathing(void) { + return breathing; +} + +// See http://jared.geek.nz/2013/feb/linear-led-pwm +static uint16_t cie_lightness(uint16_t v) { + if (v <= 5243) // if below 8% of max + return v / 9; // same as dividing by 900% + else { + uint32_t y = (((uint32_t) v + 10486) << 8) / (10486 + 0xFFFFUL); // add 16% of max and compare + // to get a useful result with integer division, we shift left in the expression above + // and revert what we've done again after squaring. + y = y * y * y >> 8; + if (y > 0xFFFFUL) // prevent overflow + return 0xFFFFU; + else + return (uint16_t) y; + } +} + +void breathing_enable(void) { + breathing = true; + breathing_counter = 0; + breathing_halt = BREATHING_NO_HALT; + // interrupt already registered +} + +void breathing_pulse(void) { + if (get_backlight_level() == 0) + breathing_min(); + else + breathing_max(); + breathing_halt = BREATHING_HALT_ON; + // breathing_interrupt_enable(); + breathing = true; +} + +void breathing_disable(void) { + breathing = false; + // backlight_set(get_backlight_level()); + b_led_set(get_backlight_level()); // custom implementation of backlight_set() +} + +void breathing_self_disable(void) +{ + if (get_backlight_level() == 0) + breathing_halt = BREATHING_HALT_OFF; + else + breathing_halt = BREATHING_HALT_ON; +} + +void breathing_toggle(void) { + if (is_breathing()) + breathing_disable(); + else + breathing_enable(); +} + +void breathing_period_set(uint8_t value) +{ + if (!value) + value = 1; + breathing_period = value; +} + +void breathing_period_default(void) { + breathing_period_set(BREATHING_PERIOD); +} + +void breathing_period_inc(void) +{ + breathing_period_set(breathing_period+1); +} + +void breathing_period_dec(void) +{ + breathing_period_set(breathing_period-1); +} + +/* To generate breathing curve in python: + * from math import sin, pi; [int(sin(x/128.0*pi)**4*255) for x in range(128)] + */ +static const uint8_t breathing_table[BREATHING_STEPS] PROGMEM = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 4, 5, 6, 8, 10, 12, 15, 17, 20, 24, 28, 32, 36, 41, 46, 51, 57, 63, 70, 76, 83, 91, 98, 106, 113, 121, 129, 138, 146, 154, 162, 170, 178, 185, 193, 200, 207, 213, 220, 225, 231, 235, 240, 244, 247, 250, 252, 253, 254, 255, 254, 253, 252, 250, 247, 244, 240, 235, 231, 225, 220, 213, 207, 200, 193, 185, 178, 170, 162, 154, 146, 138, 129, 121, 113, 106, 98, 91, 83, 76, 70, 63, 57, 51, 46, 41, 36, 32, 28, 24, 20, 17, 15, 12, 10, 8, 6, 5, 4, 3, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +// Use this before the cie_lightness function. +static inline uint16_t scale_backlight(uint16_t v) { + return v / BACKLIGHT_LEVELS * get_backlight_level(); +} + +void custom_breathing_handler(void) { + uint16_t interval = (uint16_t) breathing_period * 244 / BREATHING_STEPS; + // resetting after one period to prevent ugly reset at overflow. + breathing_counter = (breathing_counter + 1) % (breathing_period * 244); + uint8_t index = breathing_counter / interval % BREATHING_STEPS; + + if (((breathing_halt == BREATHING_HALT_ON) && (index == BREATHING_STEPS / 2)) || + ((breathing_halt == BREATHING_HALT_OFF) && (index == BREATHING_STEPS - 1))) + { + // breathing_interrupt_disable(); + } + + setPWM(cie_lightness(scale_backlight((uint16_t) pgm_read_byte(&breathing_table[index]) * 0x0101U))); +} + +#endif // BACKLIGHT_BREATHING +#endif // BACKLIGHT_ENABLE diff --git a/keyboards/bminiex/config.h b/keyboards/bminiex/config.h new file mode 100644 index 000000000..3f160109e --- /dev/null +++ b/keyboards/bminiex/config.h @@ -0,0 +1,41 @@ +/* +Copyright 2017 Luiz Ribeiro + +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 . +*/ + +#pragma once + +#include "config_common.h" + +#define VENDOR_ID 0x20A0 +#define PRODUCT_ID 0x422E +#define MANUFACTURER winkeyless.kr +#define PRODUCT B.mini Ex + +#define RGBLED_NUM 20 + +/* matrix size */ +#define MATRIX_ROWS 8 +#define MATRIX_COLS 15 + +#define RGBLIGHT_ANIMATIONS + +#define BACKLIGHT_LEVELS 5 + +#define NO_UART 1 + +/* key combination for command */ +#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) + diff --git a/keyboards/bminiex/i2c.c b/keyboards/bminiex/i2c.c new file mode 100644 index 000000000..a4f952135 --- /dev/null +++ b/keyboards/bminiex/i2c.c @@ -0,0 +1,106 @@ +/* +Copyright 2016 Luiz Ribeiro + +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 . +*/ + +// Please do not modify this file + +#include +#include + +#include "i2c.h" + +void i2c_set_bitrate(uint16_t bitrate_khz) { + uint8_t bitrate_div = ((F_CPU / 1000l) / bitrate_khz); + if (bitrate_div >= 16) { + bitrate_div = (bitrate_div - 16) / 2; + } + TWBR = bitrate_div; +} + +void i2c_init(void) { + // set pull-up resistors on I2C bus pins + PORTC |= 0b11; + + i2c_set_bitrate(400); + + // enable TWI (two-wire interface) + TWCR |= (1 << TWEN); + + // enable TWI interrupt and slave address ACK + TWCR |= (1 << TWIE); + TWCR |= (1 << TWEA); +} + +uint8_t i2c_start(uint8_t address) { + // reset TWI control register + TWCR = 0; + + // begin transmission and wait for it to end + TWCR = (1< + +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 . +*/ + +// Please do not modify this file + +#pragma once + +void i2c_init(void); +void i2c_set_bitrate(uint16_t bitrate_khz); +uint8_t i2c_send(uint8_t address, uint8_t *data, uint16_t length); + diff --git a/keyboards/bminiex/keymaps/default/keymap.c b/keyboards/bminiex/keymaps/default/keymap.c new file mode 100644 index 000000000..ed949d74f --- /dev/null +++ b/keyboards/bminiex/keymaps/default/keymap.c @@ -0,0 +1,29 @@ +/* +Copyright 2017 Luiz Ribeiro + +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 . +*/ + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR,KC_HOME,KC_END, KC_NO, KC_NO, KC_NO, KC_NO, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL, KC_BSPC, KC_DEL, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC,KC_NO, KC_INS, KC_P7, KC_P8, KC_P9, + KC_LCAP, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT,KC_NUHS,KC_ENT, KC_PGUP, KC_P4, KC_P5, KC_P6, KC_PPLS, + KC_LSFT,KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,KC_RSFT, KC_UP, KC_PGDN, KC_P1, KC_P2, KC_P3, + KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_APP ,KC_RCTL,KC_LEFT,KC_DOWN,KC_RGHT, KC_P0, KC_PDOT, KC_PENT + ) +}; diff --git a/keyboards/bminiex/matrix.c b/keyboards/bminiex/matrix.c new file mode 100644 index 000000000..8faaed8ac --- /dev/null +++ b/keyboards/bminiex/matrix.c @@ -0,0 +1,122 @@ +/* +Copyright 2017 Luiz Ribeiro + +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 . +*/ + +#include +#include + +#include "matrix.h" +#include "backlight.h" + +#ifndef DEBOUNCE +#define DEBOUNCE 5 +#endif + +static uint8_t debouncing = DEBOUNCE; + +static matrix_row_t matrix[MATRIX_ROWS]; +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; + +__attribute__ ((weak)) +void matrix_init_user(void) {} +__attribute__ ((weak)) +void matrix_scan_user(void) {} +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +void matrix_init(void) { + // all outputs for rows high + DDRB = 0xFF; + PORTB = 0xFF; + // all inputs for columns + DDRA = 0x00; + DDRC &= ~(0x111111<<2); + DDRD &= ~(1<> 1) & 0x55) | ((x << 1) & 0xaa); + x = ((x >> 2) & 0x33) | ((x << 2) & 0xcc); + x = ((x >> 4) & 0x0f) | ((x << 4) & 0xf0); + return x; +} + +uint8_t matrix_scan(void) { + for (uint8_t row = 0; row < MATRIX_ROWS; row++) { + matrix_set_row_status(row); + _delay_us(5); + + matrix_row_t cols = ( + // cols 0..7, PORTA 0 -> 7 + (~PINA) & 0xFF + ) | ( + // cols 8..13, PORTC 7 -> 0 + bit_reverse((~PINC) & 0xFF) << 8 + ) | ( + // col 14, PORTD 7 + ((~PIND) & (1 << PIND7)) << 7 + ); + + if (matrix_debouncing[row] != cols) { + matrix_debouncing[row] = cols; + debouncing = DEBOUNCE; + } + } + + if (debouncing) { + if (--debouncing) { + _delay_ms(1); + } else { + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + matrix[i] = matrix_debouncing[i]; + } + } + } + + matrix_scan_quantum(); + + return 1; +} + +inline matrix_row_t matrix_get_row(uint8_t row) { + return matrix[row]; +} + +void matrix_print(void) { +} diff --git a/keyboards/bminiex/readme.md b/keyboards/bminiex/readme.md new file mode 100644 index 000000000..204bcbbb1 --- /dev/null +++ b/keyboards/bminiex/readme.md @@ -0,0 +1,14 @@ +B.mini EX +========= + +A compact fullsize keyboard with RGB + +Keyboard Maintainer: QMK Community +Hardware Supported: B.mini EX PCB +Hardware Availability: https://winkeyless.kr/product/b-mini-ex-x2-pcb/ + +Make example for this keyboard (after setting up your build environment): + + make bminiex:default + +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). \ No newline at end of file diff --git a/keyboards/bminiex/rules.mk b/keyboards/bminiex/rules.mk new file mode 100644 index 000000000..e5d3a2a88 --- /dev/null +++ b/keyboards/bminiex/rules.mk @@ -0,0 +1,56 @@ +# Copyright 2017 Luiz Ribeiro +# +# 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 . + +# MCU name +MCU = atmega32a +PROTOCOL = VUSB + +# unsupported features for now +NO_UART = yes +NO_SUSPEND_POWER_DOWN = yes + +# processor frequency +F_CPU = 12000000 + +# Bootloader +# This definition is optional, and if your keyboard supports multiple bootloaders of +# different sizes, comment this out, and the correct address will be loaded +# automatically (+60). See bootloader.mk for all options. +BOOTLOADER = bootloadHID + +# build options +BOOTMAGIC_ENABLE = yes +MOUSEKEY_ENABLE = yes +EXTRAKEY_ENABLE = yes +CONSOLE_ENABLE = no +DEBUG_ENABLE = no +COMMAND_ENABLE = no +BACKLIGHT_ENABLE = yes +BACKLIGHT_CUSTOM_DRIVER = yes +RGBLIGHT_ENABLE = yes +RGBLIGHT_CUSTOM_DRIVER = yes +TAP_DANCE_ENABLE = no + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +OPT_DEFS = -DDEBUG_LEVEL=0 + +# custom matrix setup +CUSTOM_MATRIX = yes +SRC = matrix.c i2c.c backlight.c + +# programming options +PROGRAM_CMD = ./util/atmega32a_program.py $(TARGET).hex diff --git a/keyboards/bminiex/usbconfig.h b/keyboards/bminiex/usbconfig.h new file mode 100644 index 000000000..d2d848fcd --- /dev/null +++ b/keyboards/bminiex/usbconfig.h @@ -0,0 +1,396 @@ +/* Name: usbconfig.h + * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers + * Author: Christian Starkjohann + * Creation Date: 2005-04-01 + * Tabsize: 4 + * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $ + */ + +#ifndef __usbconfig_h_included__ +#define __usbconfig_h_included__ + +#include "config.h" + +/* +General Description: +This file is an example configuration (with inline documentation) for the USB +driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is +also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may +wire the lines to any other port, as long as D+ is also wired to INT0 (or any +other hardware interrupt, as long as it is the highest level interrupt, see +section at the end of this file). +*/ + +/* ---------------------------- Hardware Config ---------------------------- */ + +#define USB_CFG_IOPORTNAME D +/* This is the port where the USB bus is connected. When you configure it to + * "B", the registers PORTB, PINB and DDRB will be used. + */ +#define USB_CFG_DMINUS_BIT 3 +/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected. + * This may be any bit in the port. + */ +#define USB_CFG_DPLUS_BIT 2 +/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected. + * This may be any bit in the port. Please note that D+ must also be connected + * to interrupt pin INT0! [You can also use other interrupts, see section + * "Optional MCU Description" below, or you can connect D- to the interrupt, as + * it is required if you use the USB_COUNT_SOF feature. If you use D- for the + * interrupt, the USB interrupt will also be triggered at Start-Of-Frame + * markers every millisecond.] + */ +#define USB_CFG_CLOCK_KHZ (F_CPU/1000) +/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000, + * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code + * require no crystal, they tolerate +/- 1% deviation from the nominal + * frequency. All other rates require a precision of 2000 ppm and thus a + * crystal! + * Since F_CPU should be defined to your actual clock rate anyway, you should + * not need to modify this setting. + */ +#define USB_CFG_CHECK_CRC 0 +/* Define this to 1 if you want that the driver checks integrity of incoming + * data packets (CRC checks). CRC checks cost quite a bit of code size and are + * currently only available for 18 MHz crystal clock. You must choose + * USB_CFG_CLOCK_KHZ = 18000 if you enable this option. + */ + +/* ----------------------- Optional Hardware Config ------------------------ */ + +/* #define USB_CFG_PULLUP_IOPORTNAME D */ +/* If you connect the 1.5k pullup resistor from D- to a port pin instead of + * V+, you can connect and disconnect the device from firmware by calling + * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h). + * This constant defines the port on which the pullup resistor is connected. + */ +/* #define USB_CFG_PULLUP_BIT 4 */ +/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined + * above) where the 1.5k pullup resistor is connected. See description + * above for details. + */ + +/* --------------------------- Functional Range ---------------------------- */ + +#define USB_CFG_HAVE_INTRIN_ENDPOINT 1 +/* Define this to 1 if you want to compile a version with two endpoints: The + * default control endpoint 0 and an interrupt-in endpoint (any other endpoint + * number). + */ +#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1 +/* Define this to 1 if you want to compile a version with three endpoints: The + * default control endpoint 0, an interrupt-in endpoint 3 (or the number + * configured below) and a catch-all default interrupt-in endpoint as above. + * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature. + */ +#define USB_CFG_EP3_NUMBER 3 +/* If the so-called endpoint 3 is used, it can now be configured to any other + * endpoint number (except 0) with this macro. Default if undefined is 3. + */ +/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */ +/* The above macro defines the startup condition for data toggling on the + * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1. + * Since the token is toggled BEFORE sending any data, the first packet is + * sent with the oposite value of this configuration! + */ +#define USB_CFG_IMPLEMENT_HALT 0 +/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature + * for endpoint 1 (interrupt endpoint). Although you may not need this feature, + * it is required by the standard. We have made it a config option because it + * bloats the code considerably. + */ +#define USB_CFG_SUPPRESS_INTR_CODE 0 +/* Define this to 1 if you want to declare interrupt-in endpoints, but don't + * want to send any data over them. If this macro is defined to 1, functions + * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if + * you need the interrupt-in endpoints in order to comply to an interface + * (e.g. HID), but never want to send any data. This option saves a couple + * of bytes in flash memory and the transmit buffers in RAM. + */ +#define USB_CFG_INTR_POLL_INTERVAL 1 +/* If you compile a version with endpoint 1 (interrupt-in), this is the poll + * interval. The value is in milliseconds and must not be less than 10 ms for + * low speed devices. + */ +#define USB_CFG_IS_SELF_POWERED 0 +/* Define this to 1 if the device has its own power supply. Set it to 0 if the + * device is powered from the USB bus. + */ +#define USB_CFG_MAX_BUS_POWER 500 +/* Set this variable to the maximum USB bus power consumption of your device. + * The value is in milliamperes. [It will be divided by two since USB + * communicates power requirements in units of 2 mA.] + */ +#define USB_CFG_IMPLEMENT_FN_WRITE 1 +/* Set this to 1 if you want usbFunctionWrite() to be called for control-out + * transfers. Set it to 0 if you don't need it and want to save a couple of + * bytes. + */ +#define USB_CFG_IMPLEMENT_FN_READ 0 +/* Set this to 1 if you need to send control replies which are generated + * "on the fly" when usbFunctionRead() is called. If you only want to send + * data from a static buffer, set it to 0 and return the data from + * usbFunctionSetup(). This saves a couple of bytes. + */ +#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0 +/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints. + * You must implement the function usbFunctionWriteOut() which receives all + * interrupt/bulk data sent to any endpoint other than 0. The endpoint number + * can be found in 'usbRxToken'. + */ +#define USB_CFG_HAVE_FLOWCONTROL 0 +/* Define this to 1 if you want flowcontrol over USB data. See the definition + * of the macros usbDisableAllRequests() and usbEnableAllRequests() in + * usbdrv.h. + */ +#define USB_CFG_DRIVER_FLASH_PAGE 0 +/* If the device has more than 64 kBytes of flash, define this to the 64 k page + * where the driver's constants (descriptors) are located. Or in other words: + * Define this to 1 for boot loaders on the ATMega128. + */ +#define USB_CFG_LONG_TRANSFERS 0 +/* Define this to 1 if you want to send/receive blocks of more than 254 bytes + * in a single control-in or control-out transfer. Note that the capability + * for long transfers increases the driver size. + */ +/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */ +/* This macro is a hook if you want to do unconventional things. If it is + * defined, it's inserted at the beginning of received message processing. + * If you eat the received message and don't want default processing to + * proceed, do a return after doing your things. One possible application + * (besides debugging) is to flash a status LED on each packet. + */ +/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */ +/* This macro is a hook if you need to know when an USB RESET occurs. It has + * one parameter which distinguishes between the start of RESET state and its + * end. + */ +/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */ +/* This macro (if defined) is executed when a USB SET_ADDRESS request was + * received. + */ +#define USB_COUNT_SOF 1 +/* define this macro to 1 if you need the global variable "usbSofCount" which + * counts SOF packets. This feature requires that the hardware interrupt is + * connected to D- instead of D+. + */ +/* #ifdef __ASSEMBLER__ + * macro myAssemblerMacro + * in YL, TCNT0 + * sts timer0Snapshot, YL + * endm + * #endif + * #define USB_SOF_HOOK myAssemblerMacro + * This macro (if defined) is executed in the assembler module when a + * Start Of Frame condition is detected. It is recommended to define it to + * the name of an assembler macro which is defined here as well so that more + * than one assembler instruction can be used. The macro may use the register + * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages + * immediately after an SOF pulse may be lost and must be retried by the host. + * What can you do with this hook? Since the SOF signal occurs exactly every + * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in + * designs running on the internal RC oscillator. + * Please note that Start Of Frame detection works only if D- is wired to the + * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES! + */ +#define USB_CFG_CHECK_DATA_TOGGLING 0 +/* define this macro to 1 if you want to filter out duplicate data packets + * sent by the host. Duplicates occur only as a consequence of communication + * errors, when the host does not receive an ACK. Please note that you need to + * implement the filtering yourself in usbFunctionWriteOut() and + * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable + * for each control- and out-endpoint to check for duplicate packets. + */ +#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0 +/* define this macro to 1 if you want the function usbMeasureFrameLength() + * compiled in. This function can be used to calibrate the AVR's RC oscillator. + */ +#define USB_USE_FAST_CRC 0 +/* The assembler module has two implementations for the CRC algorithm. One is + * faster, the other is smaller. This CRC routine is only used for transmitted + * messages where timing is not critical. The faster routine needs 31 cycles + * per byte while the smaller one needs 61 to 69 cycles. The faster routine + * may be worth the 32 bytes bigger code size if you transmit lots of data and + * run the AVR close to its limit. + */ + +/* -------------------------- Device Description --------------------------- */ + +#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF) +/* USB vendor ID for the device, low byte first. If you have registered your + * own Vendor ID, define it here. Otherwise you may use one of obdev's free + * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules! + * *** IMPORTANT NOTE *** + * This template uses obdev's shared VID/PID pair for Vendor Class devices + * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand + * the implications! + */ +#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF) +/* This is the ID of the product, low byte first. It is interpreted in the + * scope of the vendor ID. If you have registered your own VID with usb.org + * or if you have licensed a PID from somebody else, define it here. Otherwise + * you may use one of obdev's free shared VID/PID pairs. See the file + * USB-IDs-for-free.txt for details! + * *** IMPORTANT NOTE *** + * This template uses obdev's shared VID/PID pair for Vendor Class devices + * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand + * the implications! + */ +#define USB_CFG_DEVICE_VERSION 0x00, 0x02 +/* Version number of the device: Minor number first, then major number. + */ +#define USB_CFG_VENDOR_NAME 'w', 'i', 'n', 'k', 'e', 'y', 'l', 'e', 's', 's', '.', 'k', 'r' +#define USB_CFG_VENDOR_NAME_LEN 13 +/* These two values define the vendor name returned by the USB device. The name + * must be given as a list of characters under single quotes. The characters + * are interpreted as Unicode (UTF-16) entities. + * If you don't want a vendor name string, undefine these macros. + * ALWAYS define a vendor name containing your Internet domain name if you use + * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for + * details. + */ +#define USB_CFG_DEVICE_NAME 'p', 's', '2', 'a', 'v', 'r', 'G', 'B' +#define USB_CFG_DEVICE_NAME_LEN 8 +/* Same as above for the device name. If you don't want a device name, undefine + * the macros. See the file USB-IDs-for-free.txt before you assign a name if + * you use a shared VID/PID. + */ +/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */ +/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */ +/* Same as above for the serial number. If you don't want a serial number, + * undefine the macros. + * It may be useful to provide the serial number through other means than at + * compile time. See the section about descriptor properties below for how + * to fine tune control over USB descriptors such as the string descriptor + * for the serial number. + */ +#define USB_CFG_DEVICE_CLASS 0 +#define USB_CFG_DEVICE_SUBCLASS 0 +/* See USB specification if you want to conform to an existing device class. + * Class 0xff is "vendor specific". + */ +#define USB_CFG_INTERFACE_CLASS 3 /* HID */ +#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */ +#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */ +/* See USB specification if you want to conform to an existing device class or + * protocol. The following classes must be set at interface level: + * HID class is 3, no subclass and protocol required (but may be useful!) + * CDC class is 2, use subclass 2 and protocol 1 for ACM + */ +#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0 +/* Define this to the length of the HID report descriptor, if you implement + * an HID device. Otherwise don't define it or define it to 0. + * If you use this define, you must add a PROGMEM character array named + * "usbHidReportDescriptor" to your code which contains the report descriptor. + * Don't forget to keep the array and this define in sync! + */ + +/* #define USB_PUBLIC static */ +/* Use the define above if you #include usbdrv.c instead of linking against it. + * This technique saves a couple of bytes in flash memory. + */ + +/* ------------------- Fine Control over USB Descriptors ------------------- */ +/* If you don't want to use the driver's default USB descriptors, you can + * provide our own. These can be provided as (1) fixed length static data in + * flash memory, (2) fixed length static data in RAM or (3) dynamically at + * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more + * information about this function. + * Descriptor handling is configured through the descriptor's properties. If + * no properties are defined or if they are 0, the default descriptor is used. + * Possible properties are: + * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched + * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is + * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if + * you want RAM pointers. + * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found + * in static memory is in RAM, not in flash memory. + * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash), + * the driver must know the descriptor's length. The descriptor itself is + * found at the address of a well known identifier (see below). + * List of static descriptor names (must be declared PROGMEM if in flash): + * char usbDescriptorDevice[]; + * char usbDescriptorConfiguration[]; + * char usbDescriptorHidReport[]; + * char usbDescriptorString0[]; + * int usbDescriptorStringVendor[]; + * int usbDescriptorStringDevice[]; + * int usbDescriptorStringSerialNumber[]; + * Other descriptors can't be provided statically, they must be provided + * dynamically at runtime. + * + * Descriptor properties are or-ed or added together, e.g.: + * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18)) + * + * The following descriptors are defined: + * USB_CFG_DESCR_PROPS_DEVICE + * USB_CFG_DESCR_PROPS_CONFIGURATION + * USB_CFG_DESCR_PROPS_STRINGS + * USB_CFG_DESCR_PROPS_STRING_0 + * USB_CFG_DESCR_PROPS_STRING_VENDOR + * USB_CFG_DESCR_PROPS_STRING_PRODUCT + * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER + * USB_CFG_DESCR_PROPS_HID + * USB_CFG_DESCR_PROPS_HID_REPORT + * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver) + * + * Note about string descriptors: String descriptors are not just strings, they + * are Unicode strings prefixed with a 2 byte header. Example: + * int serialNumberDescriptor[] = { + * USB_STRING_DESCRIPTOR_HEADER(6), + * 'S', 'e', 'r', 'i', 'a', 'l' + * }; + */ + +#define USB_CFG_DESCR_PROPS_DEVICE 0 +#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC +//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0 +#define USB_CFG_DESCR_PROPS_STRINGS 0 +#define USB_CFG_DESCR_PROPS_STRING_0 0 +#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0 +#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0 +#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0 +#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC +//#define USB_CFG_DESCR_PROPS_HID 0 +#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC +//#define USB_CFG_DESCR_PROPS_HID_REPORT 0 +#define USB_CFG_DESCR_PROPS_UNKNOWN 0 + +#define usbMsgPtr_t unsigned short +/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to + * a scalar type here because gcc generates slightly shorter code for scalar + * arithmetics than for pointer arithmetics. Remove this define for backward + * type compatibility or define it to an 8 bit type if you use data in RAM only + * and all RAM is below 256 bytes (tiny memory model in IAR CC). + */ + +/* ----------------------- Optional MCU Description ------------------------ */ + +/* The following configurations have working defaults in usbdrv.h. You + * usually don't need to set them explicitly. Only if you want to run + * the driver on a device which is not yet supported or with a compiler + * which is not fully supported (such as IAR C) or if you use a differnt + * interrupt than INT0, you may have to define some of these. + */ +/* #define USB_INTR_CFG MCUCR */ +/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */ +/* #define USB_INTR_CFG_CLR 0 */ +/* #define USB_INTR_ENABLE GIMSK */ +/* #define USB_INTR_ENABLE_BIT INT0 */ +/* #define USB_INTR_PENDING GIFR */ +/* #define USB_INTR_PENDING_BIT INTF0 */ +/* #define USB_INTR_VECTOR INT0_vect */ + +/* Set INT1 for D- falling edge to count SOF */ +/* #define USB_INTR_CFG EICRA */ +#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10)) +/* #define USB_INTR_CFG_CLR 0 */ +/* #define USB_INTR_ENABLE EIMSK */ +#define USB_INTR_ENABLE_BIT INT1 +/* #define USB_INTR_PENDING EIFR */ +#define USB_INTR_PENDING_BIT INTF1 +#define USB_INTR_VECTOR INT1_vect + +#endif /* __usbconfig_h_included__ */ diff --git a/tmk_core/common/backlight.h b/tmk_core/common/backlight.h index f57309267..ef8ab9b2b 100644 --- a/tmk_core/common/backlight.h +++ b/tmk_core/common/backlight.h @@ -15,8 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef BACKLIGHT_H -#define BACKLIGHT_H +#pragma once #include #include @@ -37,5 +36,3 @@ void backlight_step(void); void backlight_set(uint8_t level); void backlight_level(uint8_t level); uint8_t get_backlight_level(void); - -#endif From dedbc37196d5b9d9ccbb5654441fd84f820c4a7b Mon Sep 17 00:00:00 2001 From: Yan-Fa Li Date: Sun, 21 Oct 2018 18:27:33 -0700 Subject: [PATCH 326/788] Doesn't need a 50ms debounce Set it to default. I have no idea what I was thinking. --- keyboards/catch22/config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/catch22/config.h b/keyboards/catch22/config.h index f151e7048..c5cf8233d 100644 --- a/keyboards/catch22/config.h +++ b/keyboards/catch22/config.h @@ -39,7 +39,7 @@ along with this program. If not, see . #define DIODE_DIRECTION COL2ROW /* Set 0 if debouncing isn't needed */ -#define DEBOUNCING_DELAY 50 +// #define DEBOUNCING_DELAY 0 /* key combination for command */ #define IS_COMMAND() ( \ From 91bfbb62560cc237066de2392eefbb271eff9d6b Mon Sep 17 00:00:00 2001 From: "Colin T.A. Gray" Date: Mon, 22 Oct 2018 14:19:51 -0400 Subject: [PATCH 327/788] Updates docs - planck 6 and macos instructions (#4201) * add note about how to install rev6 (dfu-util) * include instructions on installing dfu-util on macOS --- docs/faq_build.md | 2 ++ docs/getting_started_build_tools.md | 1 + keyboards/planck/readme.md | 4 ++++ 3 files changed, 7 insertions(+) diff --git a/docs/faq_build.md b/docs/faq_build.md index 00a0d386b..465a283ae 100644 --- a/docs/faq_build.md +++ b/docs/faq_build.md @@ -105,10 +105,12 @@ The solution is to remove and reinstall all affected modules. ``` brew rm avr-gcc brew rm dfu-programmer +brew rm dfu-util brew rm gcc-arm-none-eabi brew rm avrdude brew install avr-gcc brew install dfu-programmer +brew install dfu-util brew install gcc-arm-none-eabi brew install avrdude ``` diff --git a/docs/getting_started_build_tools.md b/docs/getting_started_build_tools.md index c1e02d4e0..dd3e7805a 100644 --- a/docs/getting_started_build_tools.md +++ b/docs/getting_started_build_tools.md @@ -58,6 +58,7 @@ If you're using [homebrew,](http://brew.sh/) you can use the following commands: brew update brew install avr-gcc@7 brew install dfu-programmer + brew install dfu-util brew install gcc-arm-none-eabi brew install avrdude diff --git a/keyboards/planck/readme.md b/keyboards/planck/readme.md index f857c546c..083279e8a 100644 --- a/keyboards/planck/readme.md +++ b/keyboards/planck/readme.md @@ -13,4 +13,8 @@ Make example for this keyboard (after setting up your build environment): make planck/rev4:default +Install examples: + + make planck/rev6:default:dfu-util + See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. From fbc6bd82664f7286e358e14da6c7945aa061ee3b Mon Sep 17 00:00:00 2001 From: Dylan Khor Date: Mon, 22 Oct 2018 14:29:04 -0400 Subject: [PATCH 328/788] Minor updates to build tools docs revised (#4195) * add initial khord iris keymap * correct path of windows qmk install script --- docs/getting_started_build_tools.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/getting_started_build_tools.md b/docs/getting_started_build_tools.md index dd3e7805a..88f3642b2 100644 --- a/docs/getting_started_build_tools.md +++ b/docs/getting_started_build_tools.md @@ -62,7 +62,7 @@ If you're using [homebrew,](http://brew.sh/) you can use the following commands: brew install gcc-arm-none-eabi brew install avrdude -This is the recommended method. If you don't have homebrew, [install it!](http://brew.sh/) It's very much worth it for anyone who works in the command line. Note that the `make` and `make install` portion during the homebrew installation of avr-libc can take over 20 minutes and exhibit high CPU usage. +This is the recommended method. If you don't have homebrew, [install it!](http://brew.sh/) It's very much worth it for anyone who works in the command line. Note that the `make` and `make install` portion during the homebrew installation of `avr-gcc@7` can take over 20 minutes and exhibit high CPU usage. ## Windows with msys2 (recommended) @@ -70,9 +70,9 @@ The best environment to use, for Windows Vista through any later version (tested * Install msys2 by downloading it and following the instructions here: http://www.msys2.org * Open the ``MSYS2 MingGW 64-bit`` shortcut -* Navigate to your qmk checkout. For example, if it's in the root of your c drive: +* Navigate to your QMK repository. For example, if it's in the root of your c drive: * `$ cd /c/qmk_firmware` -* Run `util/msys2_install.sh` and follow the prompts +* Run `util/qmk_install.sh` and follow the prompts ## Windows 10 (deprecated) These are the old instructions for Windows 10. We recommend you use [MSYS2 as outlined above](#windows-with-msys2-recommended). From 4665e4ffffcdfc6fe6f498928963adc64f6fefd7 Mon Sep 17 00:00:00 2001 From: Takeshi ISHII <2170248+mtei@users.noreply.github.com> Date: Tue, 23 Oct 2018 03:38:05 +0900 Subject: [PATCH 329/788] Keyboard: Helix serial.c, split_scom.c bug fix and update (#4191) * helix/serial.c add support PD1,PD3,PE6 and configuration simplify * Add comment about ATmega32U4 I2C * Add compile time check for ATmega32U4 I2C * change TAB code to 8 SPACE code * Helix serial.c PORTD,PD0 test. OK OK PD0 - PD1 OK PD2 - PD3 - PE6 * Helix serial.c PORTD,PD1 test. OK OK PD0 OK PD1 OK PD2 - PD3 - PE6 * Helix serial.c PORTD,PD3 test. OK OK PD0 OK PD1 OK PD2 OK PD3 - PE6 * Helix serial.c PORTE,PD6 test. OK OK PD0 OK PD1 OK PD2 OK PD3 OK PE6 * Helix serial.c: PD0,PD1,PD3,PE6 all test end * Helix serial.c: rename SOFT_SERIAL_PORT to SOFT_SERIAL_PIN * Helix serial.c add debug code * Helix serial.c: add transaction ID range check * Helix serial.c debug code update * Helix serial.c debug code update * Helix serial.c: Strict checking of the value of tid. * adjust the delay of serial.c * Helix serial.c: remove debug code * remove EXTRAFLAGS += -DCONSOLE_ENABLE from five_rows/rules.mk tmk_core/common.mk has >ifeq ($(strip $(CONSOLE_ENABLE)), yes) > TMK_COMMON_DEFS += -DCONSOLE_ENABLE * Fix error handling in split_scomm.c * add some comment to serial.c * add some comment about SELECT_SOFT_SERIAL_SPEED --- keyboards/helix/pico/serial_config.h | 15 +- .../rev1/keymaps/OLED_sample/serial_config.h | 15 +- keyboards/helix/rev1/serial_config.h | 15 +- .../helix/rev2/keymaps/five_rows/rules.mk | 4 - keyboards/helix/rev2/serial_config.h | 19 +- keyboards/helix/rev2/split_scomm.c | 48 +++- keyboards/helix/serial.c | 228 +++++++++++++----- keyboards/helix/serial.h | 22 +- 8 files changed, 229 insertions(+), 137 deletions(-) diff --git a/keyboards/helix/pico/serial_config.h b/keyboards/helix/pico/serial_config.h index 82c6e4e83..fc8736d47 100644 --- a/keyboards/helix/pico/serial_config.h +++ b/keyboards/helix/pico/serial_config.h @@ -1,16 +1,9 @@ -#ifndef SOFT_SERIAL_CONFIG_H -#define SOFT_SERIAL_CONFIG_H +//// #error rev2 serial config +#ifndef SOFT_SERIAL_PIN /* Soft Serial defines */ -#define SERIAL_PIN_DDR DDRD -#define SERIAL_PIN_PORT PORTD -#define SERIAL_PIN_INPUT PIND -#define SERIAL_PIN_MASK _BV(PD2) -#define SERIAL_PIN_INTERRUPT INT2_vect +#define SOFT_SERIAL_PIN D2 #define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 #define SERIAL_MASTER_BUFFER_LENGTH MATRIX_ROWS/2 - -//// #error rev2 serial config - -#endif /* SOFT_SERIAL_CONFIG_H */ +#endif diff --git a/keyboards/helix/rev1/keymaps/OLED_sample/serial_config.h b/keyboards/helix/rev1/keymaps/OLED_sample/serial_config.h index b991b874b..f56951e70 100644 --- a/keyboards/helix/rev1/keymaps/OLED_sample/serial_config.h +++ b/keyboards/helix/rev1/keymaps/OLED_sample/serial_config.h @@ -1,16 +1,9 @@ -#ifndef SOFT_SERIAL_CONFIG_H -#define SOFT_SERIAL_CONFIG_H +//// #error rev1/keymaps/OLED_sample serial config +#ifndef SOFT_SERIAL_PIN /* Soft Serial defines */ -#define SERIAL_PIN_DDR DDRD -#define SERIAL_PIN_PORT PORTD -#define SERIAL_PIN_INPUT PIND -#define SERIAL_PIN_MASK _BV(PD2) -#define SERIAL_PIN_INTERRUPT INT2_vect +#define SOFT_SERIAL_PIN D2 #define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 #define SERIAL_MASTER_BUFFER_LENGTH 0 - -//// #error rev1/keymaps/OLED_sample serial config - -#endif /* SOFT_SERIAL_CONFIG_H */ +#endif diff --git a/keyboards/helix/rev1/serial_config.h b/keyboards/helix/rev1/serial_config.h index 51c6aa375..32218f9bb 100644 --- a/keyboards/helix/rev1/serial_config.h +++ b/keyboards/helix/rev1/serial_config.h @@ -1,16 +1,9 @@ -#ifndef SOFT_SERIAL_CONFIG_H -#define SOFT_SERIAL_CONFIG_H +/// #error rev1 serial config +#ifndef SOFT_SERIAL_PIN /* Soft Serial defines */ -#define SERIAL_PIN_DDR DDRD -#define SERIAL_PIN_PORT PORTD -#define SERIAL_PIN_INPUT PIND -#define SERIAL_PIN_MASK _BV(PD0) -#define SERIAL_PIN_INTERRUPT INT0_vect +#define SOFT_SERIAL_PIN D0 #define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 #define SERIAL_MASTER_BUFFER_LENGTH 0 - -/// #error rev1 serial config - -#endif /* SOFT_SERIAL_CONFIG_H */ +#endif diff --git a/keyboards/helix/rev2/keymaps/five_rows/rules.mk b/keyboards/helix/rev2/keymaps/five_rows/rules.mk index 63106df76..f771c94c9 100644 --- a/keyboards/helix/rev2/keymaps/five_rows/rules.mk +++ b/keyboards/helix/rev2/keymaps/five_rows/rules.mk @@ -122,10 +122,6 @@ ifeq ($(strip $(Link_Time_Optimization)),yes) EXTRAFLAGS += -flto -DUSE_Link_Time_Optimization endif -ifeq ($(strip $(CONSOLE_ENABLE)),yes) - EXTRAFLAGS += -DCONSOLE_ENABLE -endif - # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/helix/rev2/serial_config.h b/keyboards/helix/rev2/serial_config.h index 8d7e62837..37135213d 100644 --- a/keyboards/helix/rev2/serial_config.h +++ b/keyboards/helix/rev2/serial_config.h @@ -1,15 +1,8 @@ -#ifndef SOFT_SERIAL_CONFIG_H -#define SOFT_SERIAL_CONFIG_H - -/* Soft Serial defines */ -#define SERIAL_PIN_DDR DDRD -#define SERIAL_PIN_PORT PORTD -#define SERIAL_PIN_INPUT PIND -#define SERIAL_PIN_MASK _BV(PD2) -#define SERIAL_PIN_INTERRUPT INT2_vect - -#define SERIAL_USE_MULTI_TRANSACTION - //// #error rev2 serial config -#endif /* SOFT_SERIAL_CONFIG_H */ +#ifndef SOFT_SERIAL_PIN +/* Soft Serial defines */ +#define SOFT_SERIAL_PIN D2 + +#define SERIAL_USE_MULTI_TRANSACTION +#endif diff --git a/keyboards/helix/rev2/split_scomm.c b/keyboards/helix/rev2/split_scomm.c index 9719eb22e..50d233ce9 100644 --- a/keyboards/helix/rev2/split_scomm.c +++ b/keyboards/helix/rev2/split_scomm.c @@ -10,6 +10,9 @@ #ifdef SERIAL_DEBUG_MODE #include #endif +#ifdef CONSOLE_ENABLE + #include +#endif uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0}; @@ -17,6 +20,7 @@ uint8_t volatile status_com = 0; uint8_t volatile status1 = 0; uint8_t slave_buffer_change_count = 0; uint8_t s_change_old = 0xff; +uint8_t s_change_new = 0xff; SSTD_t transactions[] = { #define GET_SLAVE_STATUS 0 @@ -41,12 +45,12 @@ SSTD_t transactions[] = { void serial_master_init(void) { - soft_serial_initiator_init(transactions); + soft_serial_initiator_init(transactions, TID_LIMIT(transactions)); } void serial_slave_init(void) { - soft_serial_target_init(transactions); + soft_serial_target_init(transactions, TID_LIMIT(transactions)); } // 0 => no error @@ -54,19 +58,37 @@ void serial_slave_init(void) // 2 => checksum error int serial_update_buffers(int master_update) { - int status; + int status, smatstatus; static int need_retry = 0; - if( s_change_old != slave_buffer_change_count ) { - status = soft_serial_transaction(GET_SLAVE_BUFFER); - if( status == TRANSACTION_END ) - s_change_old = slave_buffer_change_count; + + if( s_change_old != s_change_new ) { + smatstatus = soft_serial_transaction(GET_SLAVE_BUFFER); + if( smatstatus == TRANSACTION_END ) { + s_change_old = s_change_new; +#ifdef CONSOLE_ENABLE + uprintf("slave matrix = %b %b %b %b %b\n", + serial_slave_buffer[0], serial_slave_buffer[1], + serial_slave_buffer[2], serial_slave_buffer[3], + serial_slave_buffer[4] ); +#endif + } + } else { + // serial_slave_buffer dosen't change + smatstatus = TRANSACTION_END; // dummy status } - if( !master_update && !need_retry) - status = soft_serial_transaction(GET_SLAVE_STATUS); - else - status = soft_serial_transaction(PUT_MASTER_GET_SLAVE_STATUS); - need_retry = ( status == TRANSACTION_END ) ? 0 : 1; - return status; + + if( !master_update && !need_retry) { + status = soft_serial_transaction(GET_SLAVE_STATUS); + } else { + status = soft_serial_transaction(PUT_MASTER_GET_SLAVE_STATUS); + } + if( status == TRANSACTION_END ) { + s_change_new = slave_buffer_change_count; + need_retry = 0; + } else { + need_retry = 1; + } + return smatstatus; } #endif // SERIAL_USE_MULTI_TRANSACTION diff --git a/keyboards/helix/serial.c b/keyboards/helix/serial.c index 11ceff0b3..830f86b55 100644 --- a/keyboards/helix/serial.c +++ b/keyboards/helix/serial.c @@ -14,7 +14,56 @@ #include "serial.h" //#include -#ifdef USE_SERIAL +#ifdef SOFT_SERIAL_PIN + +#ifdef __AVR_ATmega32U4__ + // if using ATmega32U4 I2C, can not use PD0 and PD1 in soft serial. + #ifdef USE_I2C + #if SOFT_SERIAL_PIN == D0 || SOFT_SERIAL_PIN == D1 + #error Using ATmega32U4 I2C, so can not use PD0, PD1 + #endif + #endif + + #if SOFT_SERIAL_PIN >= D0 && SOFT_SERIAL_PIN <= D3 + #define SERIAL_PIN_DDR DDRD + #define SERIAL_PIN_PORT PORTD + #define SERIAL_PIN_INPUT PIND + #if SOFT_SERIAL_PIN == D0 + #define SERIAL_PIN_MASK _BV(PD0) + #define EIMSK_BIT _BV(INT0) + #define EICRx_BIT (~(_BV(ISC00) | _BV(ISC01))) + #define SERIAL_PIN_INTERRUPT INT0_vect + #elif SOFT_SERIAL_PIN == D1 + #define SERIAL_PIN_MASK _BV(PD1) + #define EIMSK_BIT _BV(INT1) + #define EICRx_BIT (~(_BV(ISC10) | _BV(ISC11))) + #define SERIAL_PIN_INTERRUPT INT1_vect + #elif SOFT_SERIAL_PIN == D2 + #define SERIAL_PIN_MASK _BV(PD2) + #define EIMSK_BIT _BV(INT2) + #define EICRx_BIT (~(_BV(ISC20) | _BV(ISC21))) + #define SERIAL_PIN_INTERRUPT INT2_vect + #elif SOFT_SERIAL_PIN == D3 + #define SERIAL_PIN_MASK _BV(PD3) + #define EIMSK_BIT _BV(INT3) + #define EICRx_BIT (~(_BV(ISC30) | _BV(ISC31))) + #define SERIAL_PIN_INTERRUPT INT3_vect + #endif + #elif SOFT_SERIAL_PIN == E6 + #define SERIAL_PIN_DDR DDRE + #define SERIAL_PIN_PORT PORTE + #define SERIAL_PIN_INPUT PINE + #define SERIAL_PIN_MASK _BV(PE6) + #define EIMSK_BIT _BV(INT6) + #define EICRx_BIT (~(_BV(ISC60) | _BV(ISC61))) + #define SERIAL_PIN_INTERRUPT INT6_vect + #else + #error invalid SOFT_SERIAL_PIN value + #endif + +#else + #error serial.c now support ATmega32U4 only +#endif #ifndef SERIAL_USE_MULTI_TRANSACTION /* --- USE Simple API (OLD API, compatible with let's split serial.c) */ @@ -42,16 +91,20 @@ SSTD_t transactions[] = { }; void serial_master_init(void) -{ soft_serial_initiator_init(transactions); } +{ soft_serial_initiator_init(transactions, TID_LIMIT(transactions)); } void serial_slave_init(void) -{ soft_serial_target_init(transactions); } +{ soft_serial_target_init(transactions, TID_LIMIT(transactions)); } // 0 => no error // 1 => slave did not respond // 2 => checksum error int serial_update_buffers() -{ return soft_serial_transaction(); } +{ + int result; + result = soft_serial_transaction(); + return result; +} #endif // Simple API (OLD API, compatible with let's split serial.c) @@ -59,39 +112,66 @@ int serial_update_buffers() #define NO_INLINE __attribute__((noinline)) #define _delay_sub_us(x) __builtin_avr_delay_cycles(x) -// Serial pulse period in microseconds. -#define TID_SEND_ADJUST 14 +// parity check +#define ODD_PARITY 1 +#define EVEN_PARITY 0 +#define PARITY EVEN_PARITY -#define SELECT_SERIAL_SPEED 1 -#if SELECT_SERIAL_SPEED == 0 +#ifdef SERIAL_DELAY + // custom setup in config.h + // #define TID_SEND_ADJUST 2 + // #define SERIAL_DELAY 6 // micro sec + // #define READ_WRITE_START_ADJUST 30 // cycles + // #define READ_WRITE_WIDTH_ADJUST 8 // cycles +#else +// ============ Standard setups ============ + +#ifndef SELECT_SOFT_SERIAL_SPEED +#define SELECT_SOFT_SERIAL_SPEED 1 +// 0: about 189kbps +// 1: about 137kbps (default) +// 2: about 75kbps +// 3: about 39kbps +// 4: about 26kbps +// 5: about 20kbps +#endif + +#define TID_SEND_ADJUST 2 + +#if SELECT_SOFT_SERIAL_SPEED == 0 // Very High speed #define SERIAL_DELAY 4 // micro sec #define READ_WRITE_START_ADJUST 33 // cycles - #define READ_WRITE_WIDTH_ADJUST 3 // cycles -#elif SELECT_SERIAL_SPEED == 1 + #define READ_WRITE_WIDTH_ADJUST 6 // cycles +#elif SELECT_SOFT_SERIAL_SPEED == 1 // High speed #define SERIAL_DELAY 6 // micro sec #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 3 // cycles -#elif SELECT_SERIAL_SPEED == 2 + #define READ_WRITE_WIDTH_ADJUST 7 // cycles +#elif SELECT_SOFT_SERIAL_SPEED == 2 // Middle speed #define SERIAL_DELAY 12 // micro sec #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 3 // cycles -#elif SELECT_SERIAL_SPEED == 3 + #define READ_WRITE_WIDTH_ADJUST 7 // cycles +#elif SELECT_SOFT_SERIAL_SPEED == 3 // Low speed #define SERIAL_DELAY 24 // micro sec #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 3 // cycles -#elif SELECT_SERIAL_SPEED == 4 + #define READ_WRITE_WIDTH_ADJUST 7 // cycles +#elif SELECT_SOFT_SERIAL_SPEED == 4 // Very Low speed - #define SERIAL_DELAY 50 // micro sec + #define SERIAL_DELAY 36 // micro sec #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #define READ_WRITE_WIDTH_ADJUST 7 // cycles +#elif SELECT_SOFT_SERIAL_SPEED == 5 + // Ultra Low speed + #define SERIAL_DELAY 48 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 7 // cycles #else -#error Illegal Serial Speed -#endif - +#error invalid SELECT_SOFT_SERIAL_SPEED value +#endif /* SELECT_SOFT_SERIAL_SPEED */ +#endif /* SERIAL_DELAY */ #define SERIAL_DELAY_HALF1 (SERIAL_DELAY/2) #define SERIAL_DELAY_HALF2 (SERIAL_DELAY - SERIAL_DELAY/2) @@ -105,6 +185,7 @@ int serial_update_buffers() #endif static SSTD_t *Transaction_table = NULL; +static uint8_t Transaction_table_size = 0; inline static void serial_delay(void) { @@ -152,30 +233,28 @@ void serial_high(void) { SERIAL_PIN_PORT |= SERIAL_PIN_MASK; } -void soft_serial_initiator_init(SSTD_t *sstd_table) +void soft_serial_initiator_init(SSTD_t *sstd_table, int sstd_table_size) { Transaction_table = sstd_table; + Transaction_table_size = (uint8_t)sstd_table_size; serial_output(); serial_high(); } -void soft_serial_target_init(SSTD_t *sstd_table) +void soft_serial_target_init(SSTD_t *sstd_table, int sstd_table_size) { Transaction_table = sstd_table; + Transaction_table_size = (uint8_t)sstd_table_size; serial_input_with_pullup(); -#if SERIAL_PIN_MASK == _BV(PD0) - // Enable INT0 - EIMSK |= _BV(INT0); - // Trigger on falling edge of INT0 - EICRA &= ~(_BV(ISC00) | _BV(ISC01)); -#elif SERIAL_PIN_MASK == _BV(PD2) - // Enable INT2 - EIMSK |= _BV(INT2); - // Trigger on falling edge of INT2 - EICRA &= ~(_BV(ISC20) | _BV(ISC21)); + // Enable INT0-INT3,INT6 + EIMSK |= EIMSK_BIT; +#if SERIAL_PIN_MASK == _BV(PE6) + // Trigger on falling edge of INT6 + EICRB &= EICRx_BIT; #else - #error unknown SERIAL_PIN_MASK value + // Trigger on falling edge of INT0-INT3 + EICRA &= EICRx_BIT; #endif } @@ -205,12 +284,12 @@ static uint8_t serial_read_chunk(uint8_t *pterrcount, uint8_t bit) { uint8_t byte, i, p, pb; _delay_sub_us(READ_WRITE_START_ADJUST); - for( i = 0, byte = 0, p = 0; i < bit; i++ ) { + for( i = 0, byte = 0, p = PARITY; i < bit; i++ ) { serial_delay_half1(); // read the middle of pulses if( serial_read_pin() ) { - byte = (byte << 1) | 1; p ^= 1; + byte = (byte << 1) | 1; p ^= 1; } else { - byte = (byte << 1) | 0; p ^= 0; + byte = (byte << 1) | 0; p ^= 0; } _delay_sub_us(READ_WRITE_WIDTH_ADJUST); serial_delay_half2(); @@ -230,13 +309,13 @@ static uint8_t serial_read_chunk(uint8_t *pterrcount, uint8_t bit) { void serial_write_chunk(uint8_t data, uint8_t bit) NO_INLINE; void serial_write_chunk(uint8_t data, uint8_t bit) { uint8_t b, p; - for( p = 0, b = 1<<(bit-1); b ; b >>= 1) { - if(data & b) { - serial_high(); p ^= 1; - } else { - serial_low(); p ^= 0; - } - serial_delay(); + for( p = PARITY, b = 1<<(bit-1); b ; b >>= 1) { + if(data & b) { + serial_high(); p ^= 1; + } else { + serial_low(); p ^= 0; + } + serial_delay(); } /* send parity bit */ if(p & 1) { serial_high(); } @@ -288,6 +367,13 @@ void change_reciver2sender(void) { serial_delay_half1(); //4 } +static inline uint8_t nibble_bits_count(uint8_t bits) +{ + bits = (bits & 0x5) + (bits >> 1 & 0x5); + bits = (bits & 0x3) + (bits >> 2 & 0x3); + return bits; +} + // interrupt handle to be used by the target device ISR(SERIAL_PIN_INTERRUPT) { @@ -297,12 +383,15 @@ ISR(SERIAL_PIN_INTERRUPT) { SSTD_t *trans = Transaction_table; #else // recive transaction table index - uint8_t tid; + uint8_t tid, bits; uint8_t pecount = 0; sync_recv(); - tid = serial_read_chunk(&pecount,4); - if(pecount> 0) + bits = serial_read_chunk(&pecount,7); + tid = bits>>3; + bits = (bits&7) != nibble_bits_count(tid); + if( bits || pecount> 0 || tid > Transaction_table_size ) { return; + } serial_delay_half1(); serial_high(); // response step1 low->high @@ -315,17 +404,17 @@ ISR(SERIAL_PIN_INTERRUPT) { // target send phase if( trans->target2initiator_buffer_size > 0 ) serial_send_packet((uint8_t *)trans->target2initiator_buffer, - trans->target2initiator_buffer_size); + trans->target2initiator_buffer_size); // target switch to input change_sender2reciver(); // target recive phase if( trans->initiator2target_buffer_size > 0 ) { if (serial_recive_packet((uint8_t *)trans->initiator2target_buffer, - trans->initiator2target_buffer_size) ) { - *trans->status = TRANSACTION_ACCEPTED; + trans->initiator2target_buffer_size) ) { + *trans->status = TRANSACTION_ACCEPTED; } else { - *trans->status = TRANSACTION_DATA_ERROR; + *trans->status = TRANSACTION_DATA_ERROR; } } else { *trans->status = TRANSACTION_ACCEPTED; @@ -349,6 +438,8 @@ int soft_serial_transaction(void) { SSTD_t *trans = Transaction_table; #else int soft_serial_transaction(int sstd_index) { + if( sstd_index > Transaction_table_size ) + return TRANSACTION_TYPE_ERROR; SSTD_t *trans = &Transaction_table[sstd_index]; #endif cli(); @@ -375,9 +466,10 @@ int soft_serial_transaction(int sstd_index) { #else // send transaction table index + int tid = (sstd_index<<3) | (7 & nibble_bits_count(sstd_index)); sync_send(); _delay_sub_us(TID_SEND_ADJUST); - serial_write_chunk(sstd_index, 4); + serial_write_chunk(tid, 7); serial_delay_half1(); // wait for the target response (step1 low->high) @@ -389,12 +481,12 @@ int soft_serial_transaction(int sstd_index) { // check if the target is present (step2 high->low) for( int i = 0; serial_read_pin(); i++ ) { if (i > SLAVE_INT_ACK_WIDTH + 1) { - // slave failed to pull the line low, assume not present - serial_output(); - serial_high(); - *trans->status = TRANSACTION_NO_RESPONSE; - sei(); - return TRANSACTION_NO_RESPONSE; + // slave failed to pull the line low, assume not present + serial_output(); + serial_high(); + *trans->status = TRANSACTION_NO_RESPONSE; + sei(); + return TRANSACTION_NO_RESPONSE; } _delay_sub_us(SLAVE_INT_ACK_WIDTH_UNIT); } @@ -404,12 +496,12 @@ int soft_serial_transaction(int sstd_index) { // if the target is present syncronize with it if( trans->target2initiator_buffer_size > 0 ) { if (!serial_recive_packet((uint8_t *)trans->target2initiator_buffer, - trans->target2initiator_buffer_size) ) { - serial_output(); - serial_high(); - *trans->status = TRANSACTION_DATA_ERROR; - sei(); - return TRANSACTION_DATA_ERROR; + trans->target2initiator_buffer_size) ) { + serial_output(); + serial_high(); + *trans->status = TRANSACTION_DATA_ERROR; + sei(); + return TRANSACTION_DATA_ERROR; } } @@ -419,7 +511,7 @@ int soft_serial_transaction(int sstd_index) { // initiator send phase if( trans->initiator2target_buffer_size > 0 ) { serial_send_packet((uint8_t *)trans->initiator2target_buffer, - trans->initiator2target_buffer_size); + trans->initiator2target_buffer_size); } // always, release the line when not in use @@ -442,3 +534,9 @@ int soft_serial_get_and_clean_status(int sstd_index) { #endif #endif + +// Helix serial.c history +// 2018-1-29 fork from let's split (#2308) +// 2018-6-28 bug fix master to slave comm (#3255) +// 2018-8-11 improvements (#3608) +// 2018-10-21 fix serial and RGB animation conflict (#4191) diff --git a/keyboards/helix/serial.h b/keyboards/helix/serial.h index d2b7fd8e6..7e0c0847a 100644 --- a/keyboards/helix/serial.h +++ b/keyboards/helix/serial.h @@ -4,14 +4,16 @@ #include // ///////////////////////////////////////////////////////////////// -// Need Soft Serial defines in serial_config.h +// Need Soft Serial defines in config.h // ///////////////////////////////////////////////////////////////// // ex. -// #define SERIAL_PIN_DDR DDRD -// #define SERIAL_PIN_PORT PORTD -// #define SERIAL_PIN_INPUT PIND -// #define SERIAL_PIN_MASK _BV(PD?) ?=0,2 -// #define SERIAL_PIN_INTERRUPT INT?_vect ?=0,2 +// #define SOFT_SERIAL_PIN ?? // ?? = D0,D1,D2,D3,E6 +// OPTIONAL: #define SELECT_SOFT_SERIAL_SPEED ? // ? = 1,2,3,4,5 +// // 1: about 137kbps (default) +// // 2: about 75kbps +// // 3: about 39kbps +// // 4: about 26kbps +// // 5: about 20kbps // // //// USE Simple API (OLD API, compatible with let's split serial.c) // ex. @@ -47,16 +49,18 @@ typedef struct _SSTD_t { uint8_t target2initiator_buffer_size; uint8_t *target2initiator_buffer; } SSTD_t; +#define TID_LIMIT( table ) (sizeof(table) / sizeof(SSTD_t)) // initiator is transaction start side -void soft_serial_initiator_init(SSTD_t *sstd_table); +void soft_serial_initiator_init(SSTD_t *sstd_table, int sstd_table_size); // target is interrupt accept side -void soft_serial_target_init(SSTD_t *sstd_table); +void soft_serial_target_init(SSTD_t *sstd_table, int sstd_table_size); // initiator resullt #define TRANSACTION_END 0 #define TRANSACTION_NO_RESPONSE 0x1 #define TRANSACTION_DATA_ERROR 0x2 +#define TRANSACTION_TYPE_ERROR 0x4 #ifndef SERIAL_USE_MULTI_TRANSACTION int soft_serial_transaction(void); #else @@ -72,7 +76,7 @@ int soft_serial_transaction(int sstd_index); // target: // TRANSACTION_DATA_ERROR // or TRANSACTION_ACCEPTED -#define TRANSACTION_ACCEPTED 0x4 +#define TRANSACTION_ACCEPTED 0x8 #ifdef SERIAL_USE_MULTI_TRANSACTION int soft_serial_get_and_clean_status(int sstd_index); #endif From f69333a0e57ca767d49b3155a31fd6d30114dced Mon Sep 17 00:00:00 2001 From: Naoki Katahira Date: Tue, 23 Oct 2018 03:39:26 +0900 Subject: [PATCH 330/788] Lily58 default keymap fix / add keymap (#4190) * keymap fix/add * keymap fix * file fix * typo fix --- keyboards/lily58/keymaps/default/config.h | 2 - keyboards/lily58/keymaps/default/keymap.c | 60 ++-- keyboards/lily58/keymaps/default/rules.mk | 1 - keyboards/lily58/keymaps/yuchi/config.h | 39 +++ keyboards/lily58/keymaps/yuchi/keymap.c | 148 ++++++++++ keyboards/lily58/keymaps/yuchi/rules.mk | 22 ++ keyboards/lily58/rev1/rev1.c | 12 +- keyboards/lily58/rules.mk | 4 +- keyboards/lily58/split_util.c | 3 - keyboards/lily58/ssd1306.c | 330 ---------------------- keyboards/lily58/ssd1306.h | 94 ------ 11 files changed, 237 insertions(+), 478 deletions(-) create mode 100644 keyboards/lily58/keymaps/yuchi/config.h create mode 100644 keyboards/lily58/keymaps/yuchi/keymap.c create mode 100644 keyboards/lily58/keymaps/yuchi/rules.mk delete mode 100644 keyboards/lily58/ssd1306.c delete mode 100644 keyboards/lily58/ssd1306.h diff --git a/keyboards/lily58/keymaps/default/config.h b/keyboards/lily58/keymaps/default/config.h index 3077c9463..fd0978559 100644 --- a/keyboards/lily58/keymaps/default/config.h +++ b/keyboards/lily58/keymaps/default/config.h @@ -19,8 +19,6 @@ along with this program. If not, see . */ #pragma once -#include "config.h" - /* Use I2C or Serial, not both */ #define USE_SERIAL diff --git a/keyboards/lily58/keymaps/default/keymap.c b/keyboards/lily58/keymaps/default/keymap.c index 624ce210b..8d7705812 100644 --- a/keyboards/lily58/keymaps/default/keymap.c +++ b/keyboards/lily58/keymaps/default/keymap.c @@ -19,7 +19,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* QWERTY * ,-----------------------------------------. ,-----------------------------------------. - * | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ~ | + * | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` | * |------+------+------+------+------+------| |------+------+------+------+------+------| * | Tab | Q | W | E | R | T | | Y | U | I | O | P | - | * |------+------+------+------+------+------| |------+------+------+------+------+------| @@ -27,9 +27,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------| [ | | ] |------+------+------+------+------+------| * |LShift| Z | X | C | V | B |-------| |-------| N | M | , | . | / |RShift| * `-----------------------------------------/ / \ \-----------------------------------------' - * |LOWER | LGUI | Alt | /Space / \Enter \ |BackSP| RGUI |RAISE | + * | LAlt | LGUI |LOWER | /Space / \Enter \ |RAISE |BackSP| RGUI | * | | | |/ / \ \ | | | | - * `-------------------''-------' '------''--------------------' + * `----------------------------' '------''--------------------' */ [_QWERTY] = LAYOUT( \ @@ -37,53 +37,52 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS, \ KC_LCTRL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LBRC, KC_RBRC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \ - LOWER,KC_LGUI, KC_LALT, KC_SPC, KC_ENT, KC_BSPC, KC_RGUI, RAISE \ + KC_LALT, KC_LGUI,LOWER, KC_SPC, KC_ENT, RAISE, KC_BSPC, KC_RGUI \ ), /* LOWER * ,-----------------------------------------. ,-----------------------------------------. + * | | | | | | | | | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| * | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | | | | | |-------. ,-------| | _ | + | | | | + * | ` | ! | @ | # | $ | % |-------. ,-------| ^ | & | * | ( | ) | - | * |------+------+------+------+------+------| [ | | ] |------+------+------+------+------+------| - * | | | | | | |-------| |-------| |ISO ~ |ISO | | | | | + * | | | | | | |-------| |-------| | _ | + | { | } | | | * `-----------------------------------------/ / \ \-----------------------------------------' - * |LOWER | LGUI | Alt | /Space / \Enter \ |BackSP| RGUI |RAISE | + * | LAlt | LGUI |LOWER | /Space / \Enter \ |RAISE |BackSP| RGUI | * | | | |/ / \ \ | | | | - * `-------------------''-------' '------''--------------------' + * `----------------------------' '------''--------------------' */ [_LOWER] = LAYOUT( \ - KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ - KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, \ - _______, _______, _______, _______, _______, _______, _______, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______,S(KC_NUHS),S(KC_NUBS),_______, _______, _______,\ + _______, _______, _______, _______, _______, _______, _______, _______, _______,_______, _______, _______,\ + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ + KC_GRV, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_TILD, \ + _______, _______, _______, _______, _______, _______, _______, _______, XXXXXXX, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ _______, _______, _______, _______, _______, _______, _______, _______\ ), /* RAISE * ,-----------------------------------------. ,-----------------------------------------. - * | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | + * | | | | | | | | | | | | | | * |------+------+------+------+------+------| |------+------+------+------+------+------| * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | | | | | |-------. ,-------| | Left | Down | Up |Right | | + * | F1 | F2 | F3 | F4 | F5 | F6 |-------. ,-------| | Left | Down | Up |Right | | * |------+------+------+------+------+------| [ | | ] |------+------+------+------+------+------| - * | | | | | | |-------| |-------| + | - | = | [ | ] | \ | + * | F7 | F8 | F9 | F10 | F11 | F12 |-------| |-------| + | - | = | [ | ] | \ | * `-----------------------------------------/ / \ \-----------------------------------------' - * |LOWER | LGUI | Alt | /Space / \Enter \ |BackSP| RGUI |RAISE | + * | LAlt | LGUI |LOWER | /Space / \Enter \ |RAISE |BackSP| RGUI | * | | | |/ / \ \ | | | | - * `-------------------''-------' '------''--------------------' + * `----------------------------' '------''--------------------' */ [_RAISE] = LAYOUT( \ - KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, \ - _______, _______, _______, _______, _______, _______, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, XXXXXXX, \ - _______, _______, _______, _______, _______, _______, _______, _______, KC_PLUS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, XXXXXXX, \ + KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, KC_PLUS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ _______, _______, _______, _______, _______, _______, _______, _______ \ ), - -/* ADJUST (Layers for Underglow) +/* ADJUST * ,-----------------------------------------. ,-----------------------------------------. * | | | | | | | | | | | | | | * |------+------+------+------+------+------| |------+------+------+------+------+------| @@ -93,9 +92,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------| | | |------+------+------+------+------+------| * | | | | | | |-------| |-------| | | | | | | * `-----------------------------------------/ / \ \-----------------------------------------' - * |LOWER | LGUI | Alt | /Space / \Enter \ |BackSP| RGUI |RAISE | + * | LAlt | LGUI |LOWER | /Space / \Enter \ |RAISE |BackSP| RGUI | * | | | |/ / \ \ | | | | - * `-------------------''-------' '------''--------------------' + * `----------------------------' '------''--------------------' */ [_ADJUST] = LAYOUT( \ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ @@ -107,17 +106,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; - -void persistent_default_layer_set(uint16_t default_layer) { - eeconfig_update_default_layer(default_layer); - default_layer_set(default_layer); -} - bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch (keycode) { case QWERTY: - if (record->event.pressed) { - print("mode just switched to qwerty and this is a huge string\n"); + if (record->event.pressed) { set_single_persistent_default_layer(_QWERTY); } return false; diff --git a/keyboards/lily58/keymaps/default/rules.mk b/keyboards/lily58/keymaps/default/rules.mk index 73777a1b7..3d2d3c9e0 100644 --- a/keyboards/lily58/keymaps/default/rules.mk +++ b/keyboards/lily58/keymaps/default/rules.mk @@ -4,7 +4,6 @@ # the appropriate keymap folder that will get included automatically # -OLED_ENABLE = no RGBLIGHT_ENABLE = no BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) diff --git a/keyboards/lily58/keymaps/yuchi/config.h b/keyboards/lily58/keymaps/yuchi/config.h new file mode 100644 index 000000000..fd0978559 --- /dev/null +++ b/keyboards/lily58/keymaps/yuchi/config.h @@ -0,0 +1,39 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ +#pragma once + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + +// Underglow +/* +#undef RGBLED_NUM +#define RGBLED_NUM 14 // Number of LEDs +#define RGBLIGHT_ANIMATIONS +#define RGBLIGHT_SLEEP +*/ \ No newline at end of file diff --git a/keyboards/lily58/keymaps/yuchi/keymap.c b/keyboards/lily58/keymaps/yuchi/keymap.c new file mode 100644 index 000000000..d708dbec7 --- /dev/null +++ b/keyboards/lily58/keymaps/yuchi/keymap.c @@ -0,0 +1,148 @@ +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +#define _QWERTY 0 +#define _LOWER 1 +#define _RAISE 2 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + LOWER, + RAISE, + ADJUST, +}; + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* QWERTY + * ,-----------------------------------------. ,-----------------------------------------. + * | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ~ | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | Q | W | E | R | T | | Y | U | I | O | P | - | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * |LCTRL | A | S | D | F | G |-------. ,-------| H | J | K | L | ; | ' | + * |------+------+------+------+------+------| [ | | ] |------+------+------+------+------+------| + * |LShift| Z | X | C | V | B |-------| |-------| N | M | , | . | / |RShift| + * `-----------------------------------------/ / \ \-----------------------------------------' + * |LOWER | LGUI | Alt | /Space / \Enter \ |BackSP| RGUI |RAISE | + * | | | |/ / \ \ | | | | + * `-------------------''-------' '------''--------------------' + */ + + [_QWERTY] = LAYOUT( \ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_GRV, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS, \ + KC_LCTRL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LBRC, KC_RBRC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \ + LOWER,KC_LGUI, KC_LALT, KC_SPC, KC_ENT, KC_BSPC, KC_RGUI, RAISE \ +), +/* LOWER + * ,-----------------------------------------. ,-----------------------------------------. + * | | | | | | | | | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | ~ | ! | @ | # | $ | % |-------. ,-------| ^ | & | * | ( | ) | - | + * |------+------+------+------+------+------| [ | | ] |------+------+------+------+------+------| + * | | | | | | |-------| |-------| | _ | + | { | } | | | + * `-----------------------------------------/ / \ \-----------------------------------------' + * |LOWER | LGUI | Alt | /Space / \Enter \ |BackSP| RGUI |RAISE | + * | | | |/ / \ \ | | | | + * `-------------------''-------' '------''--------------------' + */ +[_LOWER] = LAYOUT( \ + _______, _______, _______, _______, _______, _______, _______, _______, _______,_______, _______, _______,\ + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ + _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_TILD, \ + _______, _______, _______, _______, _______, _______, _______, _______, XXXXXXX, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ + _______, _______, _______, _______, _______, _______, _______, _______\ +), +/* RAISE + * ,-----------------------------------------. ,-----------------------------------------. + * | | | | | | | | | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | F1 | F2 | F3 | F4 | F5 | F6 |-------. ,-------| | Left | Down | Up |Right | | + * |------+------+------+------+------+------| [ | | ] |------+------+------+------+------+------| + * | F7 | F8 | F9 | F10 | F11 | F12 |-------| |-------| + | - | = | [ | ] | \ | + * `-----------------------------------------/ / \ \-----------------------------------------' + * |LOWER | LGUI | Alt | /Space / \Enter \ |BackSP| RGUI |RAISE | + * | | | |/ / \ \ | | | | + * `-------------------''-------' '------''--------------------' + */ + +[_RAISE] = LAYOUT( \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, \ + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, XXXXXXX, \ + KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, KC_PLUS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ + _______, _______, _______, _______, _______, _______, _______, _______ \ +), + +/* ADJUST + * ,-----------------------------------------. ,-----------------------------------------. + * | | | | | | | | | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | |-------. ,-------| | | | | | | + * |------+------+------+------+------+------| | | |------+------+------+------+------+------| + * | | | | | | |-------| |-------| | | | | | | + * `-----------------------------------------/ / \ \-----------------------------------------' + * |LOWER | LGUI | Alt | /Space / \Enter \ |BackSP| RGUI |RAISE | + * | | | |/ / \ \ | | | | + * `-------------------''-------' '------''--------------------' + */ + [_ADJUST] = LAYOUT( \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\ + _______, _______, _______, _______, _______, _______, _______, _______ \ + ) +}; + + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + break; + } + return true; +} \ No newline at end of file diff --git a/keyboards/lily58/keymaps/yuchi/rules.mk b/keyboards/lily58/keymaps/yuchi/rules.mk new file mode 100644 index 000000000..73777a1b7 --- /dev/null +++ b/keyboards/lily58/keymaps/yuchi/rules.mk @@ -0,0 +1,22 @@ + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# + +OLED_ENABLE = no +RGBLIGHT_ENABLE = no + +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = no # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +ONEHAND_ENABLE = no # Enable one-hand typing +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend \ No newline at end of file diff --git a/keyboards/lily58/rev1/rev1.c b/keyboards/lily58/rev1/rev1.c index 64dd084b2..4c54d7717 100644 --- a/keyboards/lily58/rev1/rev1.c +++ b/keyboards/lily58/rev1/rev1.c @@ -1,14 +1,5 @@ #include "lily58.h" -/* -#ifdef SSD1306OLED -void led_set_kb(uint8_t usb_led) { - // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here - led_set_user(usb_led); -} -#endif -*/ - void matrix_init_kb(void) { // // green led on @@ -20,5 +11,4 @@ void matrix_init_kb(void) { // PORTB &= ~(1<<0); matrix_init_user(); -}; - +}; \ No newline at end of file diff --git a/keyboards/lily58/rules.mk b/keyboards/lily58/rules.mk index 23527476a..72964fca1 100644 --- a/keyboards/lily58/rules.mk +++ b/keyboards/lily58/rules.mk @@ -1,9 +1,7 @@ SRC += matrix.c \ i2c.c \ split_util.c \ - serial.c \ - ssd1306.c - + serial.c # MCU name #MCU = at90usb1287 MCU = atmega32u4 diff --git a/keyboards/lily58/split_util.c b/keyboards/lily58/split_util.c index ff069b7e2..49b065518 100644 --- a/keyboards/lily58/split_util.c +++ b/keyboards/lily58/split_util.c @@ -34,9 +34,6 @@ static void setup_handedness(void) { static void keyboard_master_setup(void) { #ifdef USE_I2C i2c_master_init(); -//#ifdef SSD1306OLED -// matrix_master_OLED_init (); -//#endif #else serial_master_init(); #endif diff --git a/keyboards/lily58/ssd1306.c b/keyboards/lily58/ssd1306.c deleted file mode 100644 index d07900119..000000000 --- a/keyboards/lily58/ssd1306.c +++ /dev/null @@ -1,330 +0,0 @@ -#ifdef SSD1306OLED - -#include "ssd1306.h" -#include "i2c.h" -#include -#include "print.h" -#include "glcdfont.c" -#ifdef ADAFRUIT_BLE_ENABLE -#include "adafruit_ble.h" -#endif -#ifdef PROTOCOL_LUFA -#include "lufa.h" -#endif -#include "sendchar.h" -#include "timer.h" - -// Set this to 1 to help diagnose early startup problems -// when testing power-on with ble. Turn it off otherwise, -// as the latency of printing most of the debug info messes -// with the matrix scan, causing keys to drop. -#define DEBUG_TO_SCREEN 0 - -//static uint16_t last_battery_update; -//static uint32_t vbat; -//#define BatteryUpdateInterval 10000 /* milliseconds */ -#define ScreenOffInterval 300000 /* milliseconds */ -#if DEBUG_TO_SCREEN -static uint8_t displaying; -#endif -static uint16_t last_flush; - -// Write command sequence. -// Returns true on success. -static inline bool _send_cmd1(uint8_t cmd) { - bool res = false; - - if (i2c_start_write(SSD1306_ADDRESS)) { - xprintf("failed to start write to %d\n", SSD1306_ADDRESS); - goto done; - } - - if (i2c_master_write(0x0 /* command byte follows */)) { - print("failed to write control byte\n"); - - goto done; - } - - if (i2c_master_write(cmd)) { - xprintf("failed to write command %d\n", cmd); - goto done; - } - res = true; -done: - i2c_master_stop(); - return res; -} - -// Write 2-byte command sequence. -// Returns true on success -static inline bool _send_cmd2(uint8_t cmd, uint8_t opr) { - if (!_send_cmd1(cmd)) { - return false; - } - return _send_cmd1(opr); -} - -// Write 3-byte command sequence. -// Returns true on success -static inline bool _send_cmd3(uint8_t cmd, uint8_t opr1, uint8_t opr2) { - if (!_send_cmd1(cmd)) { - return false; - } - if (!_send_cmd1(opr1)) { - return false; - } - return _send_cmd1(opr2); -} - -#define send_cmd1(c) if (!_send_cmd1(c)) {goto done;} -#define send_cmd2(c,o) if (!_send_cmd2(c,o)) {goto done;} -#define send_cmd3(c,o1,o2) if (!_send_cmd3(c,o1,o2)) {goto done;} - -static void clear_display(void) { - matrix_clear(&display); - - // Clear all of the display bits (there can be random noise - // in the RAM on startup) - send_cmd3(PageAddr, 0, (DisplayHeight / 8) - 1); - send_cmd3(ColumnAddr, 0, DisplayWidth - 1); - - if (i2c_start_write(SSD1306_ADDRESS)) { - goto done; - } - if (i2c_master_write(0x40)) { - // Data mode - goto done; - } - for (uint8_t row = 0; row < MatrixRows; ++row) { - for (uint8_t col = 0; col < DisplayWidth; ++col) { - i2c_master_write(0); - } - } - - display.dirty = false; - -done: - i2c_master_stop(); -} - -#if DEBUG_TO_SCREEN -#undef sendchar -static int8_t capture_sendchar(uint8_t c) { - sendchar(c); - iota_gfx_write_char(c); - - if (!displaying) { - iota_gfx_flush(); - } - return 0; -} -#endif - -bool iota_gfx_init(bool rotate) { - bool success = false; - - send_cmd1(DisplayOff); - send_cmd2(SetDisplayClockDiv, 0x80); - send_cmd2(SetMultiPlex, DisplayHeight - 1); - - send_cmd2(SetDisplayOffset, 0); - - - send_cmd1(SetStartLine | 0x0); - send_cmd2(SetChargePump, 0x14 /* Enable */); - send_cmd2(SetMemoryMode, 0 /* horizontal addressing */); - - if(rotate){ - // the following Flip the display orientation 180 degrees - send_cmd1(SegRemap); - send_cmd1(ComScanInc); - }else{ - // Flips the display orientation 0 degrees - send_cmd1(SegRemap | 0x1); - send_cmd1(ComScanDec); - } - - send_cmd2(SetComPins, 0x2); - send_cmd2(SetContrast, 0x8f); - send_cmd2(SetPreCharge, 0xf1); - send_cmd2(SetVComDetect, 0x40); - send_cmd1(DisplayAllOnResume); - send_cmd1(NormalDisplay); - send_cmd1(DeActivateScroll); - send_cmd1(DisplayOn); - - send_cmd2(SetContrast, 0); // Dim - - clear_display(); - - success = true; - - iota_gfx_flush(); - -#if DEBUG_TO_SCREEN - print_set_sendchar(capture_sendchar); -#endif - -done: - return success; -} - -bool iota_gfx_off(void) { - bool success = false; - - send_cmd1(DisplayOff); - success = true; - -done: - return success; -} - -bool iota_gfx_on(void) { - bool success = false; - - send_cmd1(DisplayOn); - success = true; - -done: - return success; -} - -void matrix_write_char_inner(struct CharacterMatrix *matrix, uint8_t c) { - *matrix->cursor = c; - ++matrix->cursor; - - if (matrix->cursor - &matrix->display[0][0] == sizeof(matrix->display)) { - // We went off the end; scroll the display upwards by one line - memmove(&matrix->display[0], &matrix->display[1], - MatrixCols * (MatrixRows - 1)); - matrix->cursor = &matrix->display[MatrixRows - 1][0]; - memset(matrix->cursor, ' ', MatrixCols); - } -} - -void matrix_write_char(struct CharacterMatrix *matrix, uint8_t c) { - matrix->dirty = true; - - if (c == '\n') { - // Clear to end of line from the cursor and then move to the - // start of the next line - uint8_t cursor_col = (matrix->cursor - &matrix->display[0][0]) % MatrixCols; - - while (cursor_col++ < MatrixCols) { - matrix_write_char_inner(matrix, ' '); - } - return; - } - - matrix_write_char_inner(matrix, c); -} - -void iota_gfx_write_char(uint8_t c) { - matrix_write_char(&display, c); -} - -void matrix_write(struct CharacterMatrix *matrix, const char *data) { - const char *end = data + strlen(data); - while (data < end) { - matrix_write_char(matrix, *data); - ++data; - } -} - -void matrix_write_ln(struct CharacterMatrix *matrix, const char *data) { - char data_ln[strlen(data)+2]; - snprintf(data_ln, sizeof(data_ln), "%s\n", data); - matrix_write(matrix, data_ln); -} - -void iota_gfx_write(const char *data) { - matrix_write(&display, data); -} - -void matrix_write_P(struct CharacterMatrix *matrix, const char *data) { - while (true) { - uint8_t c = pgm_read_byte(data); - if (c == 0) { - return; - } - matrix_write_char(matrix, c); - ++data; - } -} - -void iota_gfx_write_P(const char *data) { - matrix_write_P(&display, data); -} - -void matrix_clear(struct CharacterMatrix *matrix) { - memset(matrix->display, ' ', sizeof(matrix->display)); - matrix->cursor = &matrix->display[0][0]; - matrix->dirty = true; -} - -void iota_gfx_clear_screen(void) { - matrix_clear(&display); -} - -void matrix_render(struct CharacterMatrix *matrix) { - last_flush = timer_read(); - iota_gfx_on(); -#if DEBUG_TO_SCREEN - ++displaying; -#endif - - // Move to the home position - send_cmd3(PageAddr, 0, MatrixRows - 1); - send_cmd3(ColumnAddr, 0, (MatrixCols * FontWidth) - 1); - - if (i2c_start_write(SSD1306_ADDRESS)) { - goto done; - } - if (i2c_master_write(0x40)) { - // Data mode - goto done; - } - - for (uint8_t row = 0; row < MatrixRows; ++row) { - for (uint8_t col = 0; col < MatrixCols; ++col) { - const uint8_t *glyph = font + (matrix->display[row][col] * FontWidth); - - for (uint8_t glyphCol = 0; glyphCol < FontWidth; ++glyphCol) { - uint8_t colBits = pgm_read_byte(glyph + glyphCol); - i2c_master_write(colBits); - } - - // 1 column of space between chars (it's not included in the glyph) - //i2c_master_write(0); - } - } - - matrix->dirty = false; - -done: - i2c_master_stop(); -#if DEBUG_TO_SCREEN - --displaying; -#endif -} - -void iota_gfx_flush(void) { - matrix_render(&display); -} - -__attribute__ ((weak)) -void iota_gfx_task_user(void) { -} - -void iota_gfx_task(void) { - iota_gfx_task_user(); - - if (display.dirty) { - iota_gfx_flush(); - } - - if (timer_elapsed(last_flush) > ScreenOffInterval) { - iota_gfx_off(); - } -} -#endif diff --git a/keyboards/lily58/ssd1306.h b/keyboards/lily58/ssd1306.h deleted file mode 100644 index 59d31c9f3..000000000 --- a/keyboards/lily58/ssd1306.h +++ /dev/null @@ -1,94 +0,0 @@ -#ifndef SSD1306_H -#define SSD1306_H - -#include -#include -#include "pincontrol.h" -#include "config.h" - -enum ssd1306_cmds { - DisplayOff = 0xAE, - DisplayOn = 0xAF, - - SetContrast = 0x81, - DisplayAllOnResume = 0xA4, - - DisplayAllOn = 0xA5, - NormalDisplay = 0xA6, - InvertDisplay = 0xA7, - SetDisplayOffset = 0xD3, - SetComPins = 0xda, - SetVComDetect = 0xdb, - SetDisplayClockDiv = 0xD5, - SetPreCharge = 0xd9, - SetMultiPlex = 0xa8, - SetLowColumn = 0x00, - SetHighColumn = 0x10, - SetStartLine = 0x40, - - SetMemoryMode = 0x20, - ColumnAddr = 0x21, - PageAddr = 0x22, - - ComScanInc = 0xc0, - ComScanDec = 0xc8, - SegRemap = 0xa0, - SetChargePump = 0x8d, - ExternalVcc = 0x01, - SwitchCapVcc = 0x02, - - ActivateScroll = 0x2f, - DeActivateScroll = 0x2e, - SetVerticalScrollArea = 0xa3, - RightHorizontalScroll = 0x26, - LeftHorizontalScroll = 0x27, - VerticalAndRightHorizontalScroll = 0x29, - VerticalAndLeftHorizontalScroll = 0x2a, -}; - -// Controls the SSD1306 128x32 OLED display via i2c - -#ifndef SSD1306_ADDRESS -#define SSD1306_ADDRESS 0x3C -#endif - -#define DisplayHeight 32 -#define DisplayWidth 128 - -#define FontHeight 8 -#define FontWidth 6 - -#define MatrixRows (DisplayHeight / FontHeight) -#define MatrixCols (DisplayWidth / FontWidth) - -struct CharacterMatrix { - uint8_t display[MatrixRows][MatrixCols]; - uint8_t *cursor; - bool dirty; -}; - -struct CharacterMatrix display; - -bool iota_gfx_init(bool rotate); -void iota_gfx_task(void); -bool iota_gfx_off(void); -bool iota_gfx_on(void); -void iota_gfx_flush(void); -void iota_gfx_write_char(uint8_t c); -void iota_gfx_write(const char *data); -void iota_gfx_write_P(const char *data); -void iota_gfx_clear_screen(void); - -void iota_gfx_task_user(void); - -void matrix_clear(struct CharacterMatrix *matrix); -void matrix_write_char_inner(struct CharacterMatrix *matrix, uint8_t c); -void matrix_write_char(struct CharacterMatrix *matrix, uint8_t c); -void matrix_write(struct CharacterMatrix *matrix, const char *data); -void matrix_write_ln(struct CharacterMatrix *matrix, const char *data); -void matrix_write_P(struct CharacterMatrix *matrix, const char *data); -void matrix_render(struct CharacterMatrix *matrix); - - - -#endif From 387bd555c7e6c88a78e0d388ea7eda5b1ce7958b Mon Sep 17 00:00:00 2001 From: Mattia Dal Ben Date: Mon, 22 Oct 2018 20:41:57 +0200 Subject: [PATCH 331/788] Keyboard: Add Redox Wireless keyboard (#4180) * Added folder and default keymap * Added italian keymap * Fixed readme.md * Added layer display through RGB led * Added layer status display to italian keymap * Fixed indentation * Removed obsolete comments * Updated instructions * Fixed keymaps readmes and removed RGB controls on ADJUST layer * Removed redundant KC_* definitions * Fixed readme file * Changed include guards to pragma once * Removed unused audio functions * Fixed rules.mk file * Added spaces in readme to fix rendering * Reconfigured keymap macro to resemble physical layout * Updated default keymap * Updated italian keymap * Removed unused persistent_default_layer_set function --- keyboards/redox_w/config.h | 81 ++++++++++ keyboards/redox_w/keymaps/default/keymap.c | 115 ++++++++++++++ keyboards/redox_w/keymaps/default/readme.md | 1 + keyboards/redox_w/keymaps/italian/keymap.c | 125 +++++++++++++++ keyboards/redox_w/keymaps/italian/readme.md | 1 + keyboards/redox_w/matrix.c | 162 ++++++++++++++++++++ keyboards/redox_w/readme.md | 34 ++++ keyboards/redox_w/redox_w.c | 42 +++++ keyboards/redox_w/redox_w.h | 40 +++++ keyboards/redox_w/rules.mk | 76 +++++++++ 10 files changed, 677 insertions(+) create mode 100644 keyboards/redox_w/config.h create mode 100644 keyboards/redox_w/keymaps/default/keymap.c create mode 100644 keyboards/redox_w/keymaps/default/readme.md create mode 100644 keyboards/redox_w/keymaps/italian/keymap.c create mode 100644 keyboards/redox_w/keymaps/italian/readme.md create mode 100644 keyboards/redox_w/matrix.c create mode 100644 keyboards/redox_w/readme.md create mode 100644 keyboards/redox_w/redox_w.c create mode 100644 keyboards/redox_w/redox_w.h create mode 100644 keyboards/redox_w/rules.mk diff --git a/keyboards/redox_w/config.h b/keyboards/redox_w/config.h new file mode 100644 index 000000000..810a236d9 --- /dev/null +++ b/keyboards/redox_w/config.h @@ -0,0 +1,81 @@ +/* Copyright 2017 Mattia Dal Ben + * + * 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 . + */ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ + +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Mattia Dal Ben +#define PRODUCT Redox_wireless +#define DESCRIPTION q.m.k. keyboard firmware for Redox-w + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 14 + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ +//#define BACKLIGHT_LEVELS 3 + +#define ONESHOT_TIMEOUT 500 + + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* + * 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 + +//UART settings for communication with the RF microcontroller +#define SERIAL_UART_BAUD 1000000 +#define SERIAL_UART_DATA UDR1 +#define SERIAL_UART_UBRR (F_CPU / (16UL * SERIAL_UART_BAUD) - 1) +#define SERIAL_UART_TXD_READY (UCSR1A & _BV(UDRE1)) +#define SERIAL_UART_RXD_PRESENT (UCSR1A & _BV(RXC1)) +#define SERIAL_UART_INIT() do { \ + /* baud rate */ \ + UBRR1L = SERIAL_UART_UBRR; \ + /* baud rate */ \ + UBRR1H = SERIAL_UART_UBRR >> 8; \ + /* enable TX and RX */ \ + UCSR1B = _BV(TXEN1) | _BV(RXEN1); \ + /* 8-bit data */ \ + UCSR1C = _BV(UCSZ11) | _BV(UCSZ10); \ + } while(0) diff --git a/keyboards/redox_w/keymaps/default/keymap.c b/keyboards/redox_w/keymaps/default/keymap.c new file mode 100644 index 000000000..9cfc1734e --- /dev/null +++ b/keyboards/redox_w/keymaps/default/keymap.c @@ -0,0 +1,115 @@ +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _SYMB 1 +#define _NAV 2 +#define _ADJUST 3 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + SYMB, + NAV, + ADJUST, +}; + +// Shortcut to make keymap more readable +#define KC_BKSL KC_BSLASH +#define SYM_L MO(_SYMB) + +#define KC_ALAS LALT_T(KC_PAST) +#define KC_CTPL LCTL_T(KC_PSLS) + +#define KC_NAGR LT(_NAV, KC_GRV) +#define KC_NAMI LT(_NAV, KC_MINS) + +#define KC_ADEN LT(_ADJUST, KC_END) +#define KC_ADPU LT(_ADJUST, KC_PGUP) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_QWERTY] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_NAGR ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 , KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,KC_NAMI , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_TAB ,KC_Q ,KC_W ,KC_E ,KC_R ,KC_T ,SYM_L , SYM_L ,KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,KC_EQL , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_ESC ,KC_A ,KC_S ,KC_D ,KC_F ,KC_G ,KC_LBRC , KC_RBRC ,KC_H ,KC_J ,KC_K ,KC_L ,KC_SCLN ,KC_QUOT , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_LSFT ,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,KC_ADPU ,KC_PGDN , KC_HOME ,KC_ADEN ,KC_N ,KC_M ,KC_COMM ,KC_DOT ,KC_BKSL ,KC_RSFT , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + KC_LGUI ,KC_PPLS ,KC_PMNS ,KC_ALAS , KC_CTPL , KC_BSPC ,KC_DEL , KC_ENT ,KC_SPC , KC_RALT , KC_LEFT ,KC_DOWN ,KC_UP ,KC_RGHT + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ + ), + + [_SYMB] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + _______ ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 , KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,KC_EXLM ,KC_AT ,KC_LCBR ,KC_RCBR ,KC_PIPE ,_______ , _______ ,XXXXXXX ,KC_KP_7 ,KC_KP_8 ,KC_KP_9 ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,KC_HASH ,KC_DLR ,KC_LBRC ,KC_RBRC ,KC_GRV ,_______ , _______ ,XXXXXXX ,KC_KP_4 ,KC_KP_5 ,KC_KP_6 ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,KC_PERC ,KC_CIRC ,KC_LPRN ,KC_RPRN ,KC_TILD ,_______ ,_______ , _______ ,_______ ,XXXXXXX ,KC_KP_1 ,KC_KP_2 ,KC_KP_3 ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + _______ ,_______ ,_______ ,_______ , _______ , _______ ,_______ , _______ ,_______ , KC_KP_0 , KC_KP_0 ,KC_PDOT ,XXXXXXX ,XXXXXXX + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ + ), + + [_NAV] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + _______ ,_______ ,_______ ,_______ ,_______ ,_______ , _______ ,_______ ,_______ ,_______ ,_______ ,_______ , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,KC_MS_U ,XXXXXXX ,KC_WH_U ,XXXXXXX ,_______ , _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_WH_D ,XXXXXXX ,_______ , _______ ,KC_LEFT ,KC_DOWN ,KC_UP ,KC_RIGHT,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ ,_______ , _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , KC_BTN1 , KC_BTN2 ,_______ , _______ ,_______ , XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ + ), + + [_ADJUST] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + XXXXXXX ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 , KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,RESET ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ ,XXXXXXX , XXXXXXX ,_______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ + ) + +}; + +void matrix_scan_user(void) { + uint8_t layer = biton32(layer_state); + + switch (layer) { + case _QWERTY: + set_led_off; + break; + case _SYMB: + set_led_green; + break; + case _NAV: + set_led_blue; + break; + case _ADJUST: + set_led_red; + break; + default: + break; + } +}; + + diff --git a/keyboards/redox_w/keymaps/default/readme.md b/keyboards/redox_w/keymaps/default/readme.md new file mode 100644 index 000000000..32ab1253d --- /dev/null +++ b/keyboards/redox_w/keymaps/default/readme.md @@ -0,0 +1 @@ +# Default keymap for Redox Wireless diff --git a/keyboards/redox_w/keymaps/italian/keymap.c b/keyboards/redox_w/keymaps/italian/keymap.c new file mode 100644 index 000000000..6e23a32d4 --- /dev/null +++ b/keyboards/redox_w/keymaps/italian/keymap.c @@ -0,0 +1,125 @@ +#include QMK_KEYBOARD_H + +#include "keymap_italian.h" + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _SYMB 1 +#define _NAV 2 +#define _ADJUST 3 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + SYMB, + NAV, + ADJUST, +}; + +// Shortcut to make keymap more readable +#define KC_BKSL KC_BSLASH +#define SYM_L MO(_SYMB) + +#define KC_ALAS LALT_T(KC_PAST) +#define KC_CTPL LCTL_T(KC_PSLS) + +#define KC_NAGR LT(_NAV, KC_GRV) +#define KC_NAMI LT(_NAV, KC_MINS) + +#define KC_ADEN LT(_ADJUST, KC_END) +#define KC_ADPU LT(_ADJUST, KC_PGUP) + +// Italian specific shortcuts +#define ALT_IACC RALT_T(IT_IACC) +#define GUI_LESS LGUI_T(IT_LESS) + +#define IT_SHSL RSFT_T(KC_SLSH) +#define IT_GRV RALT(KC_MINS) +#define IT_TILD RALT(KC_EQL) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_QWERTY] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_NAGR ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 , KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,KC_NAMI , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_TAB ,KC_Q ,KC_W ,KC_E ,KC_R ,KC_T ,SYM_L , SYM_L ,KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,IT_EACC , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_ESC ,KC_A ,KC_S ,KC_D ,KC_F ,KC_G ,IT_LBRC , IT_RBRC ,KC_H ,KC_J ,KC_K ,KC_L ,IT_OACC ,IT_AACC , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_LSFT ,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,KC_ADPU ,KC_PGDN , KC_HOME ,KC_ADEN ,KC_N ,KC_M ,KC_COMM ,KC_DOT ,IT_UACC ,IT_SHSL , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + GUI_LESS,KC_PPLS ,KC_PMNS ,KC_ALAS , KC_CTPL , KC_BSPC ,KC_DEL , KC_ENT ,KC_SPC , ALT_IACC, KC_LEFT ,KC_DOWN ,KC_UP ,KC_RGHT + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ + ), + + [_SYMB] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + _______ ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 , KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,IT_EXLM ,IT_AT ,IT_LCBR ,IT_RCBR ,IT_PIPE ,_______ , _______ ,XXXXXXX ,KC_KP_7 ,KC_KP_8 ,KC_KP_9 ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,IT_SHRP ,IT_DLR ,IT_LBRC ,IT_RBRC ,IT_GRV ,_______ , _______ ,XXXXXXX ,KC_KP_4 ,KC_KP_5 ,KC_KP_6 ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,IT_PERC ,IT_CRC ,IT_LPRN ,IT_RPRN ,IT_TILD ,_______ ,_______ , _______ ,_______ ,XXXXXXX ,KC_KP_1 ,KC_KP_2 ,KC_KP_3 ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + _______ ,_______ ,_______ ,_______ , _______ , _______ ,_______ , _______ ,_______ , KC_KP_0 , KC_KP_0 ,KC_PDOT ,XXXXXXX ,XXXXXXX + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ + ), + + [_NAV] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + _______ ,_______ ,_______ ,_______ ,_______ ,_______ , _______ ,_______ ,_______ ,_______ ,_______ ,_______ , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,KC_MS_U ,XXXXXXX ,KC_WH_U ,XXXXXXX ,_______ , _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_WH_D ,XXXXXXX ,_______ , _______ ,KC_LEFT ,KC_DOWN ,KC_UP ,KC_RIGHT,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ ,_______ , _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , KC_BTN1 , KC_BTN2 ,_______ , _______ ,_______ , XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ + ), + + [_ADJUST] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + XXXXXXX ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 , KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,RESET ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ ,XXXXXXX , XXXXXXX ,_______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ + ) + +}; + +void matrix_scan_user(void) { + uint8_t layer = biton32(layer_state); + + switch (layer) { + case _QWERTY: + set_led_off; + break; + case _SYMB: + set_led_green; + break; + case _NAV: + set_led_blue; + break; + case _ADJUST: + set_led_red; + break; + default: + break; + } +}; + + diff --git a/keyboards/redox_w/keymaps/italian/readme.md b/keyboards/redox_w/keymaps/italian/readme.md new file mode 100644 index 000000000..a2b5ef707 --- /dev/null +++ b/keyboards/redox_w/keymaps/italian/readme.md @@ -0,0 +1 @@ +# Italian keymap for Redox Wireless diff --git a/keyboards/redox_w/matrix.c b/keyboards/redox_w/matrix.c new file mode 100644 index 000000000..5e61103f2 --- /dev/null +++ b/keyboards/redox_w/matrix.c @@ -0,0 +1,162 @@ +/* Copyright 2017 Mattia Dal Ben + * + * 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 . + */ +#include +#include +#if defined(__AVR__) +#include +#endif +#include "wait.h" +#include "print.h" +#include "debug.h" +#include "util.h" +#include "matrix.h" +#include "timer.h" + +#if (MATRIX_COLS <= 8) +# define print_matrix_header() print("\nr/c 01234567\n") +# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row)) +# define matrix_bitpop(i) bitpop(matrix[i]) +# define ROW_SHIFTER ((uint8_t)1) +#elif (MATRIX_COLS <= 16) +# define print_matrix_header() print("\nr/c 0123456789ABCDEF\n") +# define print_matrix_row(row) print_bin_reverse16(matrix_get_row(row)) +# define matrix_bitpop(i) bitpop16(matrix[i]) +# define ROW_SHIFTER ((uint16_t)1) +#elif (MATRIX_COLS <= 32) +# define print_matrix_header() print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n") +# define print_matrix_row(row) print_bin_reverse32(matrix_get_row(row)) +# define matrix_bitpop(i) bitpop32(matrix[i]) +# define ROW_SHIFTER ((uint32_t)1) +#endif + +/* matrix state(1:on, 0:off) */ +static matrix_row_t matrix[MATRIX_ROWS]; + +__attribute__ ((weak)) +void matrix_init_quantum(void) { + matrix_init_kb(); +} + +__attribute__ ((weak)) +void matrix_scan_quantum(void) { + matrix_scan_kb(); +} + +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + +inline +uint8_t matrix_rows(void) { + return MATRIX_ROWS; +} + +inline +uint8_t matrix_cols(void) { + return MATRIX_COLS; +} + +void matrix_init(void) { + + matrix_init_quantum(); +} + +uint8_t matrix_scan(void) +{ + SERIAL_UART_INIT(); + + uint32_t timeout = 0; + + //the s character requests the RF slave to send the matrix + SERIAL_UART_DATA = 's'; + + //trust the external keystates entirely, erase the last data + uint8_t uart_data[11] = {0}; + + //there are 14 bytes corresponding to 14 columns, and an end byte + for (uint8_t i = 0; i < 11; i++) { + //wait for the serial data, timeout if it's been too long + //this only happened in testing with a loose wire, but does no + //harm to leave it in here + while(!SERIAL_UART_RXD_PRESENT){ + timeout++; + if (timeout > 10000){ + break; + } + } + uart_data[i] = SERIAL_UART_DATA; + } + + //check for the end packet, the key state bytes use the LSBs, so 0xE0 + //will only show up here if the correct bytes were recieved + if (uart_data[10] == 0xE0) + { + //shifting and transferring the keystates to the QMK matrix variable + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + matrix[i] = (uint16_t) uart_data[i*2] | (uint16_t) uart_data[i*2+1] << 7; + } + } + + + matrix_scan_quantum(); + return 1; +} + +inline +bool matrix_is_on(uint8_t row, uint8_t col) +{ + return (matrix[row] & ((matrix_row_t)1 +Redox logo +

+ +**Redox**: the **R**educed **E**rgo**dox** project. More information and building instruction [here](https://github.com/mattdibi/redox-keyboard). + +A wireless version of the Redox keyboard. + +- Keyboard Maintainer: [@mattdibi](https://github.com/mattdibi) +- Hardware Supported: Redox-w rev1.0W PCB +- Hardware Availability: Falbatech + +Make example for this keyboard (after setting up your build environment): + +```sh +make redox_w:default +``` + +Example of flashing this keyboard: + +```sh +make redox_w/rev1:default:avrdude +``` + +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). + +For nRF51822 firmware upload instruction and development see [the Redox wireless firmware repository](https://github.com/mattdibi/redox-w-firmware). + +## Redox-w Notes + +These configuration files were based off the [Mitosis](https://github.com/qmk/qmk_firmware/tree/master/keyboards/mitosis) and [Atreus](https://github.com/technomancy/atreus) keyboard. It assumes a Pro Micro is being used, however retains the 'make upload' feature from the Atreus branch. This keyboard uses a completely different 'matrix scan' system to other keyboards, it relies on an external nRF51822 microcontroller maintaining a matrix of keystates received from the keyboard halves. The matrix.c file contains the code to poll the external microcontroller for the key matrix. As long as this file is not changed, all other QMK features are supported. diff --git a/keyboards/redox_w/redox_w.c b/keyboards/redox_w/redox_w.c new file mode 100644 index 000000000..75df91066 --- /dev/null +++ b/keyboards/redox_w/redox_w.c @@ -0,0 +1,42 @@ +#include "redox_w.h" + +void uart_init(void) { + SERIAL_UART_INIT(); +} + +void led_init(void) { + DDRD |= (1<<1); + PORTD |= (1<<1); + DDRF |= (1<<4) | (1<<5); + PORTF |= (1<<4) | (1<<5); +} + + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + matrix_init_user(); + uart_init(); + led_init(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + matrix_scan_user(); +} + +void led_set_kb(uint8_t usb_led) { + +} + +#ifdef ONEHAND_ENABLE +__attribute__ ((weak)) +const keypos_t hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = { +{{13, 0}, {12, 0}, {11, 0}, {10, 0}, {9, 0}, {8, 0}, {7, 0}, {6, 0}, {5, 0}, {4, 0}, {3, 0}, {2, 0}, {1, 0}, {0, 0}}, +{{13, 1}, {12, 1}, {11, 1}, {10, 1}, {9, 1}, {8, 1}, {7, 1}, {6, 1}, {5, 1}, {4, 1}, {3, 1}, {2, 1}, {1, 1}, {0, 1}}, +{{13, 2}, {12, 2}, {11, 2}, {10, 2}, {9, 2}, {8, 2}, {7, 2}, {6, 2}, {5, 2}, {4, 2}, {3, 2}, {2, 2}, {1, 2}, {0, 2}}, +{{13, 3}, {12, 3}, {11, 3}, {10, 3}, {9, 3}, {8, 3}, {7, 3}, {6, 3}, {5, 3}, {4, 3}, {3, 3}, {2, 3}, {1, 3}, {0, 3}}, +{{13, 4}, {12, 4}, {11, 4}, {10, 4}, {9, 4}, {8, 4}, {7, 4}, {6, 4}, {5, 4}, {4, 4}, {3, 4}, {2, 4}, {1, 4}, {0, 4}}, +}; +#endif diff --git a/keyboards/redox_w/redox_w.h b/keyboards/redox_w/redox_w.h new file mode 100644 index 000000000..3adcb121d --- /dev/null +++ b/keyboards/redox_w/redox_w.h @@ -0,0 +1,40 @@ +#pragma once + +#include "quantum.h" +#include "matrix.h" +#include "backlight.h" +#include + +#define red_led_off PORTF |= (1<<5) +#define red_led_on PORTF &= ~(1<<5) +#define blu_led_off PORTF |= (1<<4) +#define blu_led_on PORTF &= ~(1<<4) +#define grn_led_off PORTD |= (1<<1) +#define grn_led_on PORTD &= ~(1<<1) + +#define set_led_off red_led_off; grn_led_off; blu_led_off +#define set_led_red red_led_on; grn_led_off; blu_led_off +#define set_led_blue red_led_off; grn_led_off; blu_led_on +#define set_led_green red_led_off; grn_led_on; blu_led_off +#define set_led_yellow red_led_on; grn_led_on; blu_led_off +#define set_led_magenta red_led_on; grn_led_off; blu_led_on +#define set_led_cyan red_led_off; grn_led_on; blu_led_on +#define set_led_white red_led_on; grn_led_on; blu_led_on + +// This a shortcut to help you visually see your layout. +// The first section contains all of the arguements +// The second converts the arguments into a two-dimensional array +#define LAYOUT( \ + k00, k01, k02, k03, k04, k05, k08, k09, k10, k11, k12, k13, \ + k14, k15, k16, k17, k18, k19, k06, k07, k22, k23, k24, k25, k26, k27, \ + k28, k29, k30, k31, k32, k33, k20, k21, k36, k37, k38, k39, k40, k41, \ + k42, k43, k44, k45, k46, k47, k34, k48, k49, k35, k50, k51, k52, k53, k54, k55, \ + k56, k57, k58, k59, k60, k61, k62, k63, k64, k65, k66, k67, k68, k69 \ +) \ +{ \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k10, k11, k12, k13 }, \ + { k14, k15, k16, k17, k18, k19, k20, k21, k22, k23, k24, k25, k26, k27 }, \ + { k28, k29, k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k40, k41 }, \ + { k42, k43, k44, k45, k46, k47, k48, k49, k50, k51, k52, k53, k54, k55 }, \ + { k56, k57, k58, k59, k60, k61, k62, k63, k64, k65, k66, k67, k68, k69 } \ +} diff --git a/keyboards/redox_w/rules.mk b/keyboards/redox_w/rules.mk new file mode 100644 index 000000000..f2f73d5c5 --- /dev/null +++ b/keyboards/redox_w/rules.mk @@ -0,0 +1,76 @@ + +OPT_DEFS += -DREDOX_W_PROMICRO +INTERPHASE_UPLOAD_COMMAND = while [ ! -r $(USB) ]; do sleep 1; done; \ + avrdude -p $(MCU) -c avr109 -U flash:w:$(TARGET).hex -P $(USB) + +# # project specific files +SRC = matrix.c + + +# MCU name +#MCU = at90usb1287 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Bootloader +# This definition is optional, and if your keyboard supports multiple bootloaders of +# different sizes, comment this out, and the correct address will be loaded +# automatically (+60). See bootloader.mk for all options. +BOOTLOADER = caterina + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + +# Build Options +# comment out to disable the options. +# +#BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +CUSTOM_MATRIX = yes # Remote matrix from the wireless bridge +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +# SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA +# BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +# MIDI_ENABLE = YES # MIDI controls +UNICODE_ENABLE = YES # Unicode +# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID + +USB = /dev/ttyACM0 + +# upload: build +# $(REDOX_W_UPLOAD_COMMAND) From cf19cb0dbeda15d51df9c513a51cd2d985747b36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20Pazos=20Est=C3=A9vez?= <30479687+fpazos@users.noreply.github.com> Date: Mon, 22 Oct 2018 20:45:46 +0200 Subject: [PATCH 332/788] Add Bluepill (stm32f103) handwired keyboard (#4126) * Main folder Main folder with some changes like the base layout and matrix for uploading in a future to the qmk repositorie * First Commit Firsts non previously commited changes: -Changed to keyboards/handwired -Basic credit to Xydane -70% Layout * Modified file structure for several keyboards As I don't want to create several folders and overcrowd the main folders I made a few modifications to being able of configure several keyboards as revisions of the main keyboard. Added a second variant. Compiling tests went right but I haven't tried it on the controller. * Starting leds * Started dual color leds PWM functions and configs I started to create the PWM functions and configs based on internet examples, it doesn't compile yet * Backtraced a bit to establish and try debug before continuing the pwm Just this, algo some doc as a new pinout image, space cadet modification to try if it works and little more * Deleted unuseful stuff After trying the reestructure to being compatible with several keyboards and that it worked I deleted the other keyboard. Added space cadet shift to ISO. Finally I couldn't debug everything and I'm getting quite frustrated to continue much more than just adding pwm leds * Changed again Iso fix for Space Cadet * Renamed keyboard, future pull I just renamed the keyboard and made some simplifying changes in order to make a pull request sometime soon. I'm too frustrated, tired and knowledge limited to achive using the PWM for leds, I didn't even get to use the debug mode... I intend to end basic led color change using layers (if I can), document everything properly and make a pull request so other users can continue/use this project. * Writed Readme.md file I also corrected a previous compilation problem and ordered a bit the keymaps * Corrected readme * Try to add layer activated light * Revert "Try to add layer activated light" This reverts commit 205af820d845dab08988f329b9f062f558060220. * Progress to fork Coming back to work, upcoming pull * Linked image Corrected readme * Some cleanning Added images to readme, som cleaning, burning after commit. * Almost finished (working) Finally * Finished bluepill firmware Just finished and tried layer dependant led colors. Going for merge * Deleted innecesary stuff and trailing spaces Just as commit title said. * Coding conventions Just modified some files to respect coding conventions * Deleted XXXXXX define Checking some other PR seen this improvement * Changes suggested on PR Firs doing the easy changes * More changes for the PR -I also deleted one unused function for led toggling on matrix.c (Now it uses layer dependent baklight, algo on of on start) -Deleted commented function on keymaps. Right now only needs testing and all pragma replaces. * Almost every pragma change on PR That's almost finished, only waiting for reply due to compiling errors * Revert "Almost every pragma change on PR" This reverts commit 07f23aa862b370cdf0ae37d6f2130c9e9856f491. * Revert last commit I moddified by mistake a file from another keyboard * Solved last pragma Compiles fine. Now I only need to test it, I say you if it works to include it in the main repository. --- keyboards/handwired/bluepill/bluepill.c | 1 + keyboards/handwired/bluepill/bluepill.h | 54 ++ .../bluepill/bluepill70/bluepill70.c | 1 + .../bluepill/bluepill70/bluepill70.h | 4 + .../bluepill/bluepill70/bootloader_defs.h | 10 + .../handwired/bluepill/bluepill70/chconf.h | 524 ++++++++++++++++++ .../handwired/bluepill/bluepill70/config.h | 25 + .../handwired/bluepill/bluepill70/flash.sh | 2 + .../handwired/bluepill/bluepill70/halconf.h | 354 ++++++++++++ keyboards/handwired/bluepill/bluepill70/led.c | 38 ++ .../handwired/bluepill/bluepill70/matrix.c | 225 ++++++++ .../handwired/bluepill/bluepill70/mcuconf.h | 209 +++++++ .../handwired/bluepill/bluepill70/rules.mk | 47 ++ .../boards/GENERIC_STM32_F103/board.c | 49 ++ .../boards/GENERIC_STM32_F103/board.h | 170 ++++++ .../boards/GENERIC_STM32_F103/board.mk | 5 + keyboards/handwired/bluepill/config.h | 58 ++ .../bluepill/keymaps/default/keymap.c | 69 +++ .../handwired/bluepill/keymaps/iso/keymap.c | 69 +++ keyboards/handwired/bluepill/ld/MKL26Z64.ld | 105 ++++ .../ld/STM32F103x8_stm32duino_bootloader.ld | 88 +++ keyboards/handwired/bluepill/readme.md | 60 ++ keyboards/handwired/bluepill/rules.mk | 10 + 23 files changed, 2177 insertions(+) create mode 100644 keyboards/handwired/bluepill/bluepill.c create mode 100644 keyboards/handwired/bluepill/bluepill.h create mode 100644 keyboards/handwired/bluepill/bluepill70/bluepill70.c create mode 100644 keyboards/handwired/bluepill/bluepill70/bluepill70.h create mode 100644 keyboards/handwired/bluepill/bluepill70/bootloader_defs.h create mode 100644 keyboards/handwired/bluepill/bluepill70/chconf.h create mode 100644 keyboards/handwired/bluepill/bluepill70/config.h create mode 100644 keyboards/handwired/bluepill/bluepill70/flash.sh create mode 100644 keyboards/handwired/bluepill/bluepill70/halconf.h create mode 100644 keyboards/handwired/bluepill/bluepill70/led.c create mode 100644 keyboards/handwired/bluepill/bluepill70/matrix.c create mode 100644 keyboards/handwired/bluepill/bluepill70/mcuconf.h create mode 100644 keyboards/handwired/bluepill/bluepill70/rules.mk create mode 100644 keyboards/handwired/bluepill/boards/GENERIC_STM32_F103/board.c create mode 100644 keyboards/handwired/bluepill/boards/GENERIC_STM32_F103/board.h create mode 100644 keyboards/handwired/bluepill/boards/GENERIC_STM32_F103/board.mk create mode 100644 keyboards/handwired/bluepill/config.h create mode 100644 keyboards/handwired/bluepill/keymaps/default/keymap.c create mode 100644 keyboards/handwired/bluepill/keymaps/iso/keymap.c create mode 100644 keyboards/handwired/bluepill/ld/MKL26Z64.ld create mode 100644 keyboards/handwired/bluepill/ld/STM32F103x8_stm32duino_bootloader.ld create mode 100644 keyboards/handwired/bluepill/readme.md create mode 100644 keyboards/handwired/bluepill/rules.mk diff --git a/keyboards/handwired/bluepill/bluepill.c b/keyboards/handwired/bluepill/bluepill.c new file mode 100644 index 000000000..85c92dfe9 --- /dev/null +++ b/keyboards/handwired/bluepill/bluepill.c @@ -0,0 +1 @@ +#include "bluepill.h" \ No newline at end of file diff --git a/keyboards/handwired/bluepill/bluepill.h b/keyboards/handwired/bluepill/bluepill.h new file mode 100644 index 000000000..a686d155c --- /dev/null +++ b/keyboards/handwired/bluepill/bluepill.h @@ -0,0 +1,54 @@ +#pragma once + +#include "quantum.h" +#include "led.h" + +/* ANSI LAYOUT + ESC| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10| F11| F12| PSC| PGU| PGD + GRA| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | ' | ¡ | BCKS | DEL + TAB| Q | W | E | R | T | Y | U | I | O | P | ` | + | | HOM + CAP| A | S | D | F | G | H | J | K | L | Ñ | ´ | Ç | ENTER | END + LSI| (<)| Z | X | C | V | B | N | M | , | . | - | RSHIF | UP | FNL + LCT| WIN| ALT| ESPACE | ALG| FN | RCT| LEF| DOW| RIG +*/ + +#define LAYOUT_seventy_ansi( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, \ + K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4D, K4E, \ + K50, K51, K52, K53, K54, K55, K56, K57, K58, K59 \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0F }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K0E, K1E }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K1D, K2D }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E }, \ + { K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4D, K4E }, \ + { K50, K51, K52, KC_NO, KC_NO, KC_NO, K53, KC_NO, KC_NO,K54, K55, K56, K57, K58, K59 } \ +} + +/* ISO LAYOUT + ESC| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10| F11| F12| PSC| PGU| PGD + GRA| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | ' | ¡ | BCKS | DEL + TAB| Q | W | E | R | T | Y | U | I | O | P | ` | + | | HOM + CAP| A | S | D | F | G | H | J | K | L | Ñ | ´ | Ç | ENTER | END + LSI| < | Z | X | C | V | B | N | M | , | . | - | RSHIF | UP | FNL + LCT| WIN| ALT| ESPACE | ALG| FN | RCT| LEF| DOW| RIG +*/ + +#define LAYOUT_seventy_iso( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, \ + K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4D, K4E, \ + K50, K51, K52, K53, K54, K55, K56, K57, K58, K59 \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0F }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K0E, K1E }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K1D, K2D }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E }, \ + { K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4D, K4E }, \ + { K50, K51, K52, KC_NO, KC_NO, KC_NO, K53, KC_NO, KC_NO,K54, K55, K56, K57, K58, K59 } \ +} diff --git a/keyboards/handwired/bluepill/bluepill70/bluepill70.c b/keyboards/handwired/bluepill/bluepill70/bluepill70.c new file mode 100644 index 000000000..511c602d4 --- /dev/null +++ b/keyboards/handwired/bluepill/bluepill70/bluepill70.c @@ -0,0 +1 @@ +#include "bluepill70.h" \ No newline at end of file diff --git a/keyboards/handwired/bluepill/bluepill70/bluepill70.h b/keyboards/handwired/bluepill/bluepill70/bluepill70.h new file mode 100644 index 000000000..8a313cc50 --- /dev/null +++ b/keyboards/handwired/bluepill/bluepill70/bluepill70.h @@ -0,0 +1,4 @@ +#pragma once +#include "bluepill.h" +// Modified by Xydane +// #define LAYOUT(k00) {{ k00 }} \ No newline at end of file diff --git a/keyboards/handwired/bluepill/bluepill70/bootloader_defs.h b/keyboards/handwired/bluepill/bluepill70/bootloader_defs.h new file mode 100644 index 000000000..0f45203cb --- /dev/null +++ b/keyboards/handwired/bluepill/bluepill70/bootloader_defs.h @@ -0,0 +1,10 @@ +/* Address for jumping to bootloader on STM32 chips. */ +/* It is chip dependent, the correct number can be looked up here (page 175): + * http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf + * This also requires a patch to chibios: + * /tmk_core/tool/chibios/ch-bootloader-jump.patch + */ + +// STM32F103* does NOT have an USB bootloader in ROM (only serial), +// so setting anything here does not make much sense +// #define STM32_BOOTLOADER_ADDRESS 0x1FFFC800 diff --git a/keyboards/handwired/bluepill/bluepill70/chconf.h b/keyboards/handwired/bluepill/bluepill70/chconf.h new file mode 100644 index 000000000..dfb1f9dfb --- /dev/null +++ b/keyboards/handwired/bluepill/bluepill70/chconf.h @@ -0,0 +1,524 @@ +/* + 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. +*/ + +/** + * @file templates/chconf.h + * @brief Configuration file template. + * @details A copy of this file must be placed in each project directory, it + * contains the application specific kernel settings. + * + * @addtogroup config + * @details Kernel related settings and hooks. + * @{ + */ + +#ifndef CHCONF_H +#define CHCONF_H + +#define _CHIBIOS_RT_CONF_ + +/*===========================================================================*/ +/** + * @name System timers settings + * @{ + */ +/*===========================================================================*/ + +/** + * @brief System time counter resolution. + * @note Allowed values are 16 or 32 bits. + */ +#define CH_CFG_ST_RESOLUTION 16 + +/** + * @brief System tick frequency. + * @details Frequency of the system timer that drives the system ticks. This + * setting also defines the system tick time unit. + */ +#define CH_CFG_ST_FREQUENCY 2000 + +/** + * @brief Time delta constant for the tick-less mode. + * @note If this value is zero then the system uses the classic + * periodic tick. This value represents the minimum number + * of ticks that is safe to specify in a timeout directive. + * The value one is not valid, timeouts are rounded up to + * this value. + */ +#define CH_CFG_ST_TIMEDELTA 2 + +/** @} */ + +/*===========================================================================*/ +/** + * @name Kernel parameters and options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Round robin interval. + * @details This constant is the number of system ticks allowed for the + * threads before preemption occurs. Setting this value to zero + * disables the preemption for threads with equal priority and the + * round robin becomes cooperative. Note that higher priority + * threads can still preempt, the kernel is always preemptive. + * @note Disabling the round robin preemption makes the kernel more compact + * and generally faster. + * @note The round robin preemption is not supported in tickless mode and + * must be set to zero in that case. + */ +#define CH_CFG_TIME_QUANTUM 0 + +/** + * @brief Managed RAM size. + * @details Size of the RAM area to be managed by the OS. If set to zero + * then the whole available RAM is used. The core memory is made + * available to the heap allocator and/or can be used directly through + * the simplified core memory allocator. + * + * @note In order to let the OS manage the whole RAM the linker script must + * provide the @p __heap_base__ and @p __heap_end__ symbols. + * @note Requires @p CH_CFG_USE_MEMCORE. + */ +#define CH_CFG_MEMCORE_SIZE 0 + +/** + * @brief Idle thread automatic spawn suppression. + * @details When this option is activated the function @p chSysInit() + * does not spawn the idle thread. The application @p main() + * function becomes the idle thread and must implement an + * infinite loop. + */ +#define CH_CFG_NO_IDLE_THREAD FALSE + +/* Use __WFI in the idle thread for waiting. Does lower the power + * consumption. */ +#define CORTEX_ENABLE_WFI_IDLE TRUE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Performance options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief OS optimization. + * @details If enabled then time efficient rather than space efficient code + * is used when two possible implementations exist. + * + * @note This is not related to the compiler optimization options. + * @note The default is @p TRUE. + */ +#define CH_CFG_OPTIMIZE_SPEED TRUE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Subsystem options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Time Measurement APIs. + * @details If enabled then the time measurement APIs are included in + * the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_TM FALSE + +/** + * @brief Threads registry APIs. + * @details If enabled then the registry APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_REGISTRY TRUE + +/** + * @brief Threads synchronization APIs. + * @details If enabled then the @p chThdWait() function is included in + * the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_WAITEXIT TRUE + +/** + * @brief Semaphores APIs. + * @details If enabled then the Semaphores APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_SEMAPHORES TRUE + +/** + * @brief Semaphores queuing mode. + * @details If enabled then the threads are enqueued on semaphores by + * priority rather than in FIFO order. + * + * @note The default is @p FALSE. Enable this if you have special + * requirements. + * @note Requires @p CH_CFG_USE_SEMAPHORES. + */ +#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE + +/** + * @brief Mutexes APIs. + * @details If enabled then the mutexes APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MUTEXES TRUE + +/** + * @brief Enables recursive behavior on mutexes. + * @note Recursive mutexes are heavier and have an increased + * memory footprint. + * + * @note The default is @p FALSE. + * @note Requires @p CH_CFG_USE_MUTEXES. + */ +#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE + +/** + * @brief Conditional Variables APIs. + * @details If enabled then the conditional variables APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_MUTEXES. + */ +#define CH_CFG_USE_CONDVARS TRUE + +/** + * @brief Conditional Variables APIs with timeout. + * @details If enabled then the conditional variables APIs with timeout + * specification are included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_CONDVARS. + */ +#define CH_CFG_USE_CONDVARS_TIMEOUT FALSE + +/** + * @brief Events Flags APIs. + * @details If enabled then the event flags APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_EVENTS TRUE + +/** + * @brief Events Flags APIs with timeout. + * @details If enabled then the events APIs with timeout specification + * are included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_EVENTS. + */ +#define CH_CFG_USE_EVENTS_TIMEOUT TRUE + +/** + * @brief Synchronous Messages APIs. + * @details If enabled then the synchronous messages APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MESSAGES TRUE + +/** + * @brief Synchronous Messages queuing mode. + * @details If enabled then messages are served by priority rather than in + * FIFO order. + * + * @note The default is @p FALSE. Enable this if you have special + * requirements. + * @note Requires @p CH_CFG_USE_MESSAGES. + */ +#define CH_CFG_USE_MESSAGES_PRIORITY FALSE + +/** + * @brief Mailboxes APIs. + * @details If enabled then the asynchronous messages (mailboxes) APIs are + * included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_SEMAPHORES. + */ +#define CH_CFG_USE_MAILBOXES TRUE + +/** + * @brief Core Memory Manager APIs. + * @details If enabled then the core memory manager APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MEMCORE TRUE + +/** + * @brief Heap Allocator APIs. + * @details If enabled then the memory heap allocator APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or + * @p CH_CFG_USE_SEMAPHORES. + * @note Mutexes are recommended. + */ +#define CH_CFG_USE_HEAP TRUE + +/** + * @brief Memory Pools Allocator APIs. + * @details If enabled then the memory pools allocator APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MEMPOOLS FALSE + +/** + * @brief Dynamic Threads APIs. + * @details If enabled then the dynamic threads creation APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_WAITEXIT. + * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. + */ +#define CH_CFG_USE_DYNAMIC FALSE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Debug options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Debug option, kernel statistics. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_STATISTICS FALSE + +/** + * @brief Debug option, system state check. + * @details If enabled the correct call protocol for system APIs is checked + * at runtime. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_SYSTEM_STATE_CHECK FALSE + +/** + * @brief Debug option, parameters checks. + * @details If enabled then the checks on the API functions input + * parameters are activated. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_ENABLE_CHECKS FALSE + +/** + * @brief Debug option, consistency checks. + * @details If enabled then all the assertions in the kernel code are + * activated. This includes consistency checks inside the kernel, + * runtime anomalies and port-defined checks. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_ENABLE_ASSERTS FALSE + +/** + * @brief Debug option, trace buffer. + * @details If enabled then the trace buffer is activated. + * + * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. + */ +#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_DISABLED + +/** + * @brief Trace buffer entries. + * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is + * different from @p CH_DBG_TRACE_MASK_DISABLED. + */ +#define CH_DBG_TRACE_BUFFER_SIZE 128 + +/** + * @brief Debug option, stack checks. + * @details If enabled then a runtime stack check is performed. + * + * @note The default is @p FALSE. + * @note The stack check is performed in a architecture/port dependent way. + * It may not be implemented or some ports. + * @note The default failure mode is to halt the system with the global + * @p panic_msg variable set to @p NULL. + */ +#define CH_DBG_ENABLE_STACK_CHECK FALSE + +/** + * @brief Debug option, stacks initialization. + * @details If enabled then the threads working area is filled with a byte + * value when a thread is created. This can be useful for the + * runtime measurement of the used stack. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_FILL_THREADS FALSE + +/** + * @brief Debug option, threads profiling. + * @details If enabled then a field is added to the @p thread_t structure that + * counts the system ticks occurred while executing the thread. + * + * @note The default is @p FALSE. + * @note This debug option is not currently compatible with the + * tickless mode. + */ +#define CH_DBG_THREADS_PROFILING FALSE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Kernel hooks + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Threads descriptor structure extension. + * @details User fields added to the end of the @p thread_t structure. + */ +#define CH_CFG_THREAD_EXTRA_FIELDS \ + /* Add threads custom fields here.*/ + +/** + * @brief Threads initialization hook. + * @details User initialization code added to the @p chThdInit() API. + * + * @note It is invoked from within @p chThdInit() and implicitly from all + * the threads creation APIs. + */ +#define CH_CFG_THREAD_INIT_HOOK(tp) { \ + /* Add threads initialization code here.*/ \ +} + +/** + * @brief Threads finalization hook. + * @details User finalization code added to the @p chThdExit() API. + */ +#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ + /* Add threads finalization code here.*/ \ +} + +/** + * @brief Context switch hook. + * @details This hook is invoked just before switching between threads. + */ +#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ + /* Context switch code here.*/ \ +} + +/** + * @brief ISR enter hook. + */ +#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ + /* IRQ prologue code here.*/ \ +} + +/** + * @brief ISR exit hook. + */ +#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ + /* IRQ epilogue code here.*/ \ +} + +/** + * @brief Idle thread enter hook. + * @note This hook is invoked within a critical zone, no OS functions + * should be invoked from here. + * @note This macro can be used to activate a power saving mode. + */ +#define CH_CFG_IDLE_ENTER_HOOK() { \ + /* Idle-enter code here.*/ \ +} + +/** + * @brief Idle thread leave hook. + * @note This hook is invoked within a critical zone, no OS functions + * should be invoked from here. + * @note This macro can be used to deactivate a power saving mode. + */ +#define CH_CFG_IDLE_LEAVE_HOOK() { \ + /* Idle-leave code here.*/ \ +} + +/** + * @brief Idle Loop hook. + * @details This hook is continuously invoked by the idle thread loop. + */ +#define CH_CFG_IDLE_LOOP_HOOK() { \ + /* Idle loop code here.*/ \ +} + +/** + * @brief System tick event hook. + * @details This hook is invoked in the system tick handler immediately + * after processing the virtual timers queue. + */ +#define CH_CFG_SYSTEM_TICK_HOOK() { \ + /* System tick event code here.*/ \ +} + +/** + * @brief System halt hook. + * @details This hook is invoked in case to a system halting error before + * the system is halted. + */ +#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ + /* System halt code here.*/ \ +} + +/** + * @brief Trace hook. + * @details This hook is invoked each time a new record is written in the + * trace buffer. + */ +#define CH_CFG_TRACE_HOOK(tep) { \ + /* Trace code here.*/ \ +} + +/** @} */ + +/*===========================================================================*/ +/* Port-specific settings (override port settings defaulted in chcore.h). */ +/*===========================================================================*/ + +#endif /* CHCONF_H */ + +/** @} */ diff --git a/keyboards/handwired/bluepill/bluepill70/config.h b/keyboards/handwired/bluepill/bluepill70/config.h new file mode 100644 index 000000000..87fd74633 --- /dev/null +++ b/keyboards/handwired/bluepill/bluepill70/config.h @@ -0,0 +1,25 @@ +#pragma once + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6464 +#define DEVICE_VER 0x0001 +/* in python2: list(u"whatever".encode('utf-16-le')) */ +/* at most 32 characters or the ugly hack in usb_main.c works */ + +// Modified by Xydane +#define MANUFACTURER "QMK" +#define USBSTR_MANUFACTURER 'T', '\x00', 'M', '\x00', 'K', '\x00', ' ', '\x00', '\xc6', '\x00' +#define PRODUCT "BluePill70" +#define USBSTR_PRODUCT 'C', '\x00', 'h', '\x00', 'i', '\x00', 'b', '\x00', 'i', '\x00', 'O', '\x00', 'S', '\x00', ' ', '\x00', 'Q', '\x00', 'M', '\x00', 'K', '\x00' +#define DESCRIPTION "QMK keyboard firmware with ChibiOS" + +/* key matrix size */ +// Modified by Xydane +#define MATRIX_ROWS 6 +#define MATRIX_COLS 15 +#define DIODE_DIRECTION COL2ROW + +// Iso fix for Space Cadet, comment for ANSI layouts +#define LSPO_KEY KC_8 +#define RSPC_KEY KC_9 \ No newline at end of file diff --git a/keyboards/handwired/bluepill/bluepill70/flash.sh b/keyboards/handwired/bluepill/bluepill70/flash.sh new file mode 100644 index 000000000..d001ff007 --- /dev/null +++ b/keyboards/handwired/bluepill/bluepill70/flash.sh @@ -0,0 +1,2 @@ +#!/bin/bash +Arduino_STM32_usb_hid/tools/linux/maple_upload ttyACM0 2 1EAF:0003 build/ch.bin \ No newline at end of file diff --git a/keyboards/handwired/bluepill/bluepill70/halconf.h b/keyboards/handwired/bluepill/bluepill70/halconf.h new file mode 100644 index 000000000..5be284cd3 --- /dev/null +++ b/keyboards/handwired/bluepill/bluepill70/halconf.h @@ -0,0 +1,354 @@ +/* + 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. +*/ + +/** + * @file templates/halconf.h + * @brief HAL configuration header. + * @details HAL configuration file, this file allows to enable or disable the + * various device drivers from your application. You may also use + * this file in order to override the device drivers default settings. + * + * @addtogroup HAL_CONF + * @{ + */ + +#ifndef _HALCONF_H_ +#define _HALCONF_H_ + +#include "mcuconf.h" + +/** + * @brief Enables the PAL subsystem. + */ +#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) +#define HAL_USE_PAL TRUE +#endif + +/** + * @brief Enables the ADC subsystem. + */ +#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) +#define HAL_USE_ADC FALSE +#endif + +/** + * @brief Enables the CAN subsystem. + */ +#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) +#define HAL_USE_CAN FALSE +#endif + +/** + * @brief Enables the DAC subsystem. + */ +#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) +#define HAL_USE_DAC FALSE +#endif + +/** + * @brief Enables the EXT subsystem. + */ +#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) +#define HAL_USE_EXT FALSE +#endif + +/** + * @brief Enables the GPT subsystem. + */ +#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) +#define HAL_USE_GPT FALSE +#endif + +/** + * @brief Enables the I2C subsystem. + */ +#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) +#define HAL_USE_I2C FALSE +#endif + +/** + * @brief Enables the I2S subsystem. + */ +#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) +#define HAL_USE_I2S FALSE +#endif + +/** + * @brief Enables the ICU subsystem. + */ +#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) +#define HAL_USE_ICU FALSE +#endif + +/** + * @brief Enables the MAC subsystem. + */ +#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) +#define HAL_USE_MAC FALSE +#endif + +/** + * @brief Enables the MMC_SPI subsystem. + */ +#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) +#define HAL_USE_MMC_SPI FALSE +#endif + +/** + * @brief Enables the PWM subsystem. + */ +#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) +#define HAL_USE_PWM TRUE +#endif + +/** + * @brief Enables the RTC subsystem. + */ +#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) +#define HAL_USE_RTC FALSE +#endif + +/** + * @brief Enables the SDC subsystem. + */ +#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) +#define HAL_USE_SDC FALSE +#endif + +/** + * @brief Enables the SERIAL subsystem. + */ +#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) +#define HAL_USE_SERIAL FALSE +#endif + +/** + * @brief Enables the SERIAL over USB subsystem. + */ +#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) +#define HAL_USE_SERIAL_USB FALSE +#endif + +/** + * @brief Enables the SPI subsystem. + */ +#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) +#define HAL_USE_SPI FALSE +#endif + +/** + * @brief Enables the UART subsystem. + */ +#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) +#define HAL_USE_UART FALSE +#endif + +/** + * @brief Enables the USB subsystem. + */ +#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) +#define HAL_USE_USB TRUE +#endif + +/** + * @brief Enables the WDG subsystem. + */ +#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) +#define HAL_USE_WDG FALSE +#endif + +/*===========================================================================*/ +/* ADC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) +#define ADC_USE_WAIT TRUE +#endif + +/** + * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define ADC_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* CAN driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Sleep mode related APIs inclusion switch. + */ +#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) +#define CAN_USE_SLEEP_MODE TRUE +#endif + +/*===========================================================================*/ +/* I2C driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables the mutual exclusion APIs on the I2C bus. + */ +#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define I2C_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* MAC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables an event sources for incoming packets. + */ +#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) +#define MAC_USE_ZERO_COPY FALSE +#endif + +/** + * @brief Enables an event sources for incoming packets. + */ +#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) +#define MAC_USE_EVENTS TRUE +#endif + +/*===========================================================================*/ +/* MMC_SPI driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Delays insertions. + * @details If enabled this options inserts delays into the MMC waiting + * routines releasing some extra CPU time for the threads with + * lower priority, this may slow down the driver a bit however. + * This option is recommended also if the SPI driver does not + * use a DMA channel and heavily loads the CPU. + */ +#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) +#define MMC_NICE_WAITING TRUE +#endif + +/*===========================================================================*/ +/* SDC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Number of initialization attempts before rejecting the card. + * @note Attempts are performed at 10mS intervals. + */ +#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) +#define SDC_INIT_RETRY 100 +#endif + +/** + * @brief Include support for MMC cards. + * @note MMC support is not yet implemented so this option must be kept + * at @p FALSE. + */ +#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) +#define SDC_MMC_SUPPORT FALSE +#endif + +/** + * @brief Delays insertions. + * @details If enabled this options inserts delays into the MMC waiting + * routines releasing some extra CPU time for the threads with + * lower priority, this may slow down the driver a bit however. + */ +#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) +#define SDC_NICE_WAITING TRUE +#endif + +/*===========================================================================*/ +/* SERIAL driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Default bit rate. + * @details Configuration parameter, this is the baud rate selected for the + * default configuration. + */ +#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) +#define SERIAL_DEFAULT_BITRATE 38400 +#endif + +/** + * @brief Serial buffers size. + * @details Configuration parameter, you can change the depth of the queue + * buffers depending on the requirements of your application. + * @note The default is 64 bytes for both the transmission and receive + * buffers. + */ +#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) +#define SERIAL_BUFFERS_SIZE 16 +#endif + +/*===========================================================================*/ +/* SERIAL_USB driver related setting. */ +/*===========================================================================*/ + +/** + * @brief Serial over USB buffers size. + * @details Configuration parameter, the buffer size must be a multiple of + * the USB data endpoint maximum packet size. + * @note The default is 64 bytes for both the transmission and receive + * buffers. + */ +// Modified by Xydane +#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) +#define SERIAL_USB_BUFFERS_SIZE 256 +#endif + +/*===========================================================================*/ +/* SPI driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) +#define SPI_USE_WAIT TRUE +#endif + +/** + * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define SPI_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* USB driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) +#define USB_USE_WAIT TRUE +#endif + +#endif /* _HALCONF_H_ */ + +/** @} */ diff --git a/keyboards/handwired/bluepill/bluepill70/led.c b/keyboards/handwired/bluepill/bluepill70/led.c new file mode 100644 index 000000000..5c557bbee --- /dev/null +++ b/keyboards/handwired/bluepill/bluepill70/led.c @@ -0,0 +1,38 @@ +/* +Copyright 2012 Jun Wako + +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 . +*/ + +#include "hal.h" +#include "led.h" + + +void led_set(uint8_t usb_led){ + if (usb_led & (1< + +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 . +*/ + +#include "ch.h" +#include "hal.h" + +/* + * scan matrix + */ +#include "print.h" +#include "debug.h" +#include "util.h" +#include "matrix.h" +#include "wait.h" + +//#include "pwm.c" + +#ifndef DEBOUNCE +# define DEBOUNCE 5 +#endif +static uint8_t debouncing = DEBOUNCE; + +/* matrix state(1:on, 0:off) */ +static matrix_row_t matrix[MATRIX_ROWS]; +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; + +static matrix_row_t read_cols(void); +static void init_cols(void); +static void unselect_rows(void); +static void select_row(uint8_t row); + +inline uint8_t matrix_rows(void){ + return MATRIX_ROWS; +} + +inline uint8_t matrix_cols(void){ + return MATRIX_COLS; +} + +/* generic STM32F103C8T6 board */ +#ifdef BOARD_GENERIC_STM32_F103 +// This could be removed, only used now in matrix_init() +#define LED_ON() do { palClearPad(GPIOA, 1) ;} while (0) +#define LED_OFF() do { palSetPad(GPIOA, 1); } while (0) +#endif + +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + +void matrix_init(void) +{ + // initialize row and col + unselect_rows(); + init_cols(); + // initialize matrix state: all keys off + for (uint8_t i=0; i < MATRIX_ROWS; i++) { + matrix[i] = 0; + matrix_debouncing[i] = 0; + } + //debug + debug_matrix = true; + LED_ON(); + wait_ms(500); + LED_OFF(); + + matrix_init_quantum(); +} + +uint8_t matrix_scan(void){ + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + select_row(i); + wait_us(30); // without this wait read unstable value. + matrix_row_t cols = read_cols(); + if (matrix_debouncing[i] != cols) { + matrix_debouncing[i] = cols; + if (debouncing) { + debug("bounce!: "); debug_hex(debouncing); debug("\n"); + } + debouncing = DEBOUNCE; + } + unselect_rows(); + } + + if (debouncing) { + if (--debouncing) { + wait_ms(1); + } else { + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + matrix[i] = matrix_debouncing[i]; + } + } + } + matrix_scan_quantum(); + return 1; +} + +inline bool matrix_is_on(uint8_t row, uint8_t col){ + return (matrix[row] & ((matrix_row_t)1</os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES) +MCU_FAMILY = STM32 +MCU_SERIES = STM32F1xx +# linker script to use +# it should exist either in /os/common/ports/ARMCMx/compilers/GCC/ld/ +# or /ld/ +# startup code to use +# is should exist in /os/common/ports/ARMCMx/compilers/GCC/mk/ +MCU_STARTUP = stm32f1xx +# it should exist either in /os/hal/boards/ +# or /boards +# Cortex version +# Teensy LC is cortex-m0; Teensy 3.x are cortex-m4 +MCU = cortex-m3 +# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7 +ARMV = 7 +# If you want to be able to jump to bootloader from firmware on STM32 MCUs, +# set the correct BOOTLOADER_ADDRESS. Either set it here, or define it in +# ./bootloader_defs.h or in ./boards//bootloader_defs.h (if you have +# a custom board definition that you plan to reuse). +# If you're not setting it here, leave it commented out. +# It is chip dependent, the correct number can be looked up here (page 175): +# http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf +# This also requires a patch to chibios: +# /tmk_core/tool/chibios/ch-bootloader-jump.patch +#STM32_BOOTLOADER_ADDRESS = 0x1FFFC800 \ No newline at end of file diff --git a/keyboards/handwired/bluepill/boards/GENERIC_STM32_F103/board.c b/keyboards/handwired/bluepill/boards/GENERIC_STM32_F103/board.c new file mode 100644 index 000000000..2809c9d18 --- /dev/null +++ b/keyboards/handwired/bluepill/boards/GENERIC_STM32_F103/board.c @@ -0,0 +1,49 @@ +/* + 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. +*/ + +#include "hal.h" + +/** + * @brief PAL setup. + * @details Digital I/O ports static configuration as defined in @p board.h. + * This variable is used by the HAL when initializing the PAL driver. + */ +#if HAL_USE_PAL || defined(__DOXYGEN__) +const PALConfig pal_default_config = +{ + {VAL_GPIOAODR, VAL_GPIOACRL, VAL_GPIOACRH}, + {VAL_GPIOBODR, VAL_GPIOBCRL, VAL_GPIOBCRH}, + {VAL_GPIOCODR, VAL_GPIOCCRL, VAL_GPIOCCRH}, + {VAL_GPIODODR, VAL_GPIODCRL, VAL_GPIODCRH}, + {VAL_GPIOEODR, VAL_GPIOECRL, VAL_GPIOECRH}, +}; +#endif + +/* + * Early initialization code. + * This initialization must be performed just after stack setup and before + * any other initialization. + */ +void __early_init(void) { + + stm32_clock_init(); +} + +/* + * Board-specific initialization code. + */ +void boardInit(void) { +} diff --git a/keyboards/handwired/bluepill/boards/GENERIC_STM32_F103/board.h b/keyboards/handwired/bluepill/boards/GENERIC_STM32_F103/board.h new file mode 100644 index 000000000..75bb848fd --- /dev/null +++ b/keyboards/handwired/bluepill/boards/GENERIC_STM32_F103/board.h @@ -0,0 +1,170 @@ +/* + 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 _BOARD_H_ +#define _BOARD_H_ + +/* + * Setup for a Generic STM32F103 board. + */ + +/* + * Board identifier. + */ +#define BOARD_GENERIC_STM32_F103 +#define BOARD_NAME "Generic STM32F103x board" + +/* + * Board frequencies. + */ +#define STM32_LSECLK 32768 +#define STM32_HSECLK 8000000 + +/* + * MCU type, supported types are defined in ./os/hal/platforms/hal_lld.h. + */ +#define STM32F103xB + +/* + * IO pins assignments + */ + +/* on-board */ + +#define GPIOC_LED 13 +#define GPIOD_OSC_IN 0 +#define GPIOD_OSC_OUT 1 + +/* Backlighting */ + +/*#define GPIOC_BACKLIGHT_PIN 15*/ + +/* In case your board has a "USB enable" hardware + controlled by a pin, define it here. (It could be just + a 1.5k resistor connected to D+ line.) +*/ +/* +#define GPIOB_USB_DISC 10 +*/ + +/* + * I/O ports initial setup, this configuration is established soon after reset + * in the initialization code. + * + * The digits have the following meaning: + * 0 - Analog input. + * 1 - Push Pull output 10MHz. + * 2 - Push Pull output 2MHz. + * 3 - Push Pull output 50MHz. + * 4 - Digital input. + * 5 - Open Drain output 10MHz. + * 6 - Open Drain output 2MHz. + * 7 - Open Drain output 50MHz. + * 8 - Digital input with PullUp or PullDown resistor depending on ODR. + * 9 - Alternate Push Pull output 10MHz. + * A - Alternate Push Pull output 2MHz. + * B - Alternate Push Pull output 50MHz. + * C - Reserved. + * D - Alternate Open Drain output 10MHz. + * E - Alternate Open Drain output 2MHz. + * F - Alternate Open Drain output 50MHz. + * Please refer to the STM32 Reference Manual for details. + */ + +/* + * Port A setup. + * Everything input with pull-up except: + * PA2 - Alternate output (USART2 TX). + * PA3 - Normal input (USART2 RX). + * PA9 - Alternate output (USART1 TX). + * PA10 - Normal input (USART1 RX). + */ +#define VAL_GPIOACRL 0x88884B88 /* PA7...PA0 */ +#define VAL_GPIOACRH 0x888884B8 /* PA15...PA8 */ +#define VAL_GPIOAODR 0xFFFFFFFF + +/* + * Port B setup. + * Everything input with pull-up except: + * PB10 - Push Pull output (USB switch). + */ +#define VAL_GPIOBCRL 0x88888888 /* PB7...PB0 */ +#define VAL_GPIOBCRH 0x88888388 /* PB15...PB8 */ +#define VAL_GPIOBODR 0xFFFFFFFF + +/* + * Port C setup. + * Everything input with pull-up except: + * PC13 - Push Pull output (LED). + */ +#define VAL_GPIOCCRL 0x88888888 /* PC7...PC0 */ +#define VAL_GPIOCCRH 0x88388888 /* PC15...PC8 */ +#define VAL_GPIOCODR 0xFFFFFFFF + +/* + * Port D setup. + * Everything input with pull-up except: + * PD0 - Normal input (XTAL). + * PD1 - Normal input (XTAL). + */ +#define VAL_GPIODCRL 0x88888844 /* PD7...PD0 */ +#define VAL_GPIODCRH 0x88888888 /* PD15...PD8 */ +#define VAL_GPIODODR 0xFFFFFFFF + +/* + * Port E setup. + * Everything input with pull-up except: + */ +#define VAL_GPIOECRL 0x88888888 /* PE7...PE0 */ +#define VAL_GPIOECRH 0x88888888 /* PE15...PE8 */ +#define VAL_GPIOEODR 0xFFFFFFFF + +/* + * USB bus activation macro, required by the USB driver. + */ +/* The point is that most of the generic STM32F103* boards + have a 1.5k resistor connected on one end to the D+ line + and on the other end to some pin. Or even a slightly more + complicated "USB enable" circuit, controlled by a pin. + That should go here. + + However on some boards (e.g. one that I have), there's no + such hardware. In which case it's better to not do anything. +*/ +/* +#define usb_lld_connect_bus(usbp) palClearPad(GPIOB, GPIOB_USB_DISC) +*/ +#define usb_lld_connect_bus(usbp) palSetPadMode(GPIOA, 12, PAL_MODE_INPUT); + +/* + * USB bus de-activation macro, required by the USB driver. + */ +/* +#define usb_lld_disconnect_bus(usbp) palSetPad(GPIOB, GPIOB_USB_DISC) +*/ +#define usb_lld_disconnect_bus(usbp) palSetPadMode(GPIOA, 12, PAL_MODE_OUTPUT_PUSHPULL); palClearPad(GPIOA, 12); + +#if !defined(_FROM_ASM_) +#ifdef __cplusplus +extern "C" { +#endif + void boardInit(void); +#ifdef __cplusplus +} +#endif +#endif /* _FROM_ASM_ */ + +#endif /* _BOARD_H_ */ diff --git a/keyboards/handwired/bluepill/boards/GENERIC_STM32_F103/board.mk b/keyboards/handwired/bluepill/boards/GENERIC_STM32_F103/board.mk new file mode 100644 index 000000000..6b8b312fd --- /dev/null +++ b/keyboards/handwired/bluepill/boards/GENERIC_STM32_F103/board.mk @@ -0,0 +1,5 @@ +# List of all the board related files. +BOARDSRC = $(BOARD_PATH)/boards/GENERIC_STM32_F103/board.c + +# Required include directories +BOARDINC = $(BOARD_PATH)/boards/GENERIC_STM32_F103 diff --git a/keyboards/handwired/bluepill/config.h b/keyboards/handwired/bluepill/config.h new file mode 100644 index 000000000..aeab1808a --- /dev/null +++ b/keyboards/handwired/bluepill/config.h @@ -0,0 +1,58 @@ +/* +Copyright 2015 Jun Wako + +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 . +*/ + +#pragma once + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +/* Set 0 if debouncing isn't needed */ +// Modified by Xydane +#define DEBOUNCE 1 + +/* 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 + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* Backlighting include */ +/*#define BACKLIGHT_PIN 19 +#define BACKLIGHT_LEVELS 5 +#define BACKLIGHT_BREATHING +#define BREATHING_PERIOD 6*/ +/* + * 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 \ No newline at end of file diff --git a/keyboards/handwired/bluepill/keymaps/default/keymap.c b/keyboards/handwired/bluepill/keymaps/default/keymap.c new file mode 100644 index 000000000..8a3493039 --- /dev/null +++ b/keyboards/handwired/bluepill/keymaps/default/keymap.c @@ -0,0 +1,69 @@ +/* +Copyright 2012,2013 Jun Wako + +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 . +*/ + +#include QMK_KEYBOARD_H + +// Define layer names +#define _NORMAL 0 +#define _FNONE 1 +#define _FNTWO 2 + +// Highly Modified by Xydane +const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_NORMAL] = LAYOUT_seventy_ansi( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCREEN,KC_HOME, KC_END, \ +KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DELETE, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_PGUP, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_ENT, KC_SLASH,KC_PGDOWN, \ + KC_LSPO, XXXXXXX,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSPC,KC_UP, TT(2), \ + KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT ), + + [_FNONE] = LAYOUT_seventy_ansi( + KC_TRNS, KC_MPRV, KC_MSTP, KC_MPLY, KC_MNXT, KC_TRNS,KC_MUTE,KC_VOLD,KC_VOLU, KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_P7, KC_P8, KC_P9, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_P4, KC_P5, KC_P6, KC_PPLS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_P1, KC_P2, KC_P3, KC_PAST, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, \ + KC_TRNS, XXXXXXX, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_P0, KC_PDOT,KC_PENT, KC_PSLS, KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS ), + + [_FNTWO] = LAYOUT_seventy_ansi( + KC_TRNS, KC_MPRV, KC_MSTP, KC_MPLY, KC_MNXT, KC_TRNS, KC_MUTE,KC_VOLD,KC_VOLU,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_P7, KC_P8, KC_P9, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_P4, KC_P5, KC_P6, KC_PPLS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_P1, KC_P2, KC_P3, KC_PAST, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, \ + KC_TRNS, XXXXXXX, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_P0, KC_PDOT,KC_PENT, KC_PSLS, KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS ), +}; + +/* Layer based ilumination, just binary */ +uint32_t layer_state_set_user(uint32_t state) { + switch (biton32(state)) { + case _FNONE: + palSetPad(GPIOA, 0); //OFF Color A + palClearPad(GPIOA, 1); //ON Color B + break; + case _FNTWO: + palClearPad(GPIOA, 0); //ON Color A + palClearPad(GPIOA, 1); //ON Color B + break; + default: // for any other layers, or the default layer + palClearPad(GPIOA, 0); //ON Color A + palSetPad(GPIOA, 1); //OFF Color B + break; + } + return state; +} \ No newline at end of file diff --git a/keyboards/handwired/bluepill/keymaps/iso/keymap.c b/keyboards/handwired/bluepill/keymaps/iso/keymap.c new file mode 100644 index 000000000..a6aedde7a --- /dev/null +++ b/keyboards/handwired/bluepill/keymaps/iso/keymap.c @@ -0,0 +1,69 @@ +/* +Copyright 2012,2013 Jun Wako + +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 . +*/ + +#include QMK_KEYBOARD_H + +// Define layer names +#define _NORMAL 0 +#define _FNONE 1 +#define _FNTWO 2 + +// Highly Modified by Xydane +const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_NORMAL] = LAYOUT_seventy_iso( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCREEN,KC_HOME, KC_END, \ +KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DELETE, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_PGUP, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_NUHS, KC_ENT,KC_PGDOWN, \ + KC_LSPO, KC_NUBS,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSPC,KC_UP, TT(2), \ + KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT ), + + [_FNONE] = LAYOUT_seventy_iso( + KC_TRNS, KC_MPRV, KC_MSTP, KC_MPLY, KC_MNXT, KC_TRNS,KC_MUTE,KC_VOLD,KC_VOLU, KC_TRNS,KC_TRNS,KC_NLCK, KC_CALC, KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_P7, KC_P8, KC_P9, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_P4, KC_P5, KC_P6, KC_PPLS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_P1, KC_P2, KC_P3, KC_PAST, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_P0, KC_PDOT,KC_PENT, KC_PSLS, KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS ), + + [_FNTWO] = LAYOUT_seventy_iso( + KC_TRNS, KC_MPRV, KC_MSTP, KC_MPLY, KC_MNXT, KC_TRNS,KC_MUTE,KC_VOLD,KC_VOLU, KC_TRNS,KC_TRNS,KC_NLCK, KC_CALC, KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_P7, KC_P8, KC_P9, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_P4, KC_P5, KC_P6, KC_PPLS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_P1, KC_P2, KC_P3, KC_PAST, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_P0, KC_PDOT,KC_PENT, KC_PSLS, KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS ), +}; + +/* Layer based ilumination, just binary */ +uint32_t layer_state_set_user(uint32_t state) { + switch (biton32(state)) { + case _FNONE: + palSetPad(GPIOA, 0); //OFF Color A + palClearPad(GPIOA, 1); //ON Color B + break; + case _FNTWO: + palClearPad(GPIOA, 0); //ON Color A + palClearPad(GPIOA, 1); //ON Color B + break; + default: // for any other layers, or the default layer + palClearPad(GPIOA, 0); //ON Color A + palSetPad(GPIOA, 1); //OFF Color B + break; + } + return state; +} \ No newline at end of file diff --git a/keyboards/handwired/bluepill/ld/MKL26Z64.ld b/keyboards/handwired/bluepill/ld/MKL26Z64.ld new file mode 100644 index 000000000..c4ca8b874 --- /dev/null +++ b/keyboards/handwired/bluepill/ld/MKL26Z64.ld @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2013-2016 Fabio Utzig, http://fabioutzig.com + * (C) 2016 flabbergast + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* + * KL26Z64 memory setup. + */ +MEMORY +{ + flash0 : org = 0x00000000, len = 0x100 + flash1 : org = 0x00000400, len = 0x10 + flash2 : org = 0x00000410, len = 62k - 0x410 + flash3 : org = 0x0000F800, len = 2k + flash4 : org = 0x00000000, len = 0 + flash5 : org = 0x00000000, len = 0 + flash6 : org = 0x00000000, len = 0 + flash7 : org = 0x00000000, len = 0 + ram0 : org = 0x1FFFF800, len = 8k + ram1 : org = 0x00000000, len = 0 + ram2 : org = 0x00000000, len = 0 + ram3 : org = 0x00000000, len = 0 + ram4 : org = 0x00000000, len = 0 + ram5 : org = 0x00000000, len = 0 + ram6 : org = 0x00000000, len = 0 + ram7 : org = 0x00000000, len = 0 +} + +/* Flash region for the configuration bytes.*/ +SECTIONS +{ + .cfmprotect : ALIGN(4) SUBALIGN(4) + { + KEEP(*(.cfmconfig)) + } > flash1 +} + +/* For each data/text section two region are defined, a virtual region + and a load region (_LMA suffix).*/ + +/* Flash region to be used for exception vectors.*/ +REGION_ALIAS("VECTORS_FLASH", flash0); +REGION_ALIAS("VECTORS_FLASH_LMA", flash0); + +/* Flash region to be used for constructors and destructors.*/ +REGION_ALIAS("XTORS_FLASH", flash2); +REGION_ALIAS("XTORS_FLASH_LMA", flash2); + +/* Flash region to be used for code text.*/ +REGION_ALIAS("TEXT_FLASH", flash2); +REGION_ALIAS("TEXT_FLASH_LMA", flash2); + +/* Flash region to be used for read only data.*/ +REGION_ALIAS("RODATA_FLASH", flash2); +REGION_ALIAS("RODATA_FLASH_LMA", flash2); + +/* Flash region to be used for various.*/ +REGION_ALIAS("VARIOUS_FLASH", flash2); +REGION_ALIAS("VARIOUS_FLASH_LMA", flash2); + +/* Flash region to be used for RAM(n) initialization data.*/ +REGION_ALIAS("RAM_INIT_FLASH_LMA", flash2); + +/* RAM region to be used for Main stack. This stack accommodates the processing + of all exceptions and interrupts.*/ +REGION_ALIAS("MAIN_STACK_RAM", ram0); + +/* RAM region to be used for the process stack. This is the stack used by + the main() function.*/ +REGION_ALIAS("PROCESS_STACK_RAM", ram0); + +/* RAM region to be used for data segment.*/ +REGION_ALIAS("DATA_RAM", ram0); +REGION_ALIAS("DATA_RAM_LMA", flash2); + +/* RAM region to be used for BSS segment.*/ +REGION_ALIAS("BSS_RAM", ram0); + +/* RAM region to be used for the default heap.*/ +REGION_ALIAS("HEAP_RAM", ram0); + +__eeprom_workarea_start__ = ORIGIN(flash3); +__eeprom_workarea_size__ = LENGTH(flash3); +__eeprom_workarea_end__ = __eeprom_workarea_start__ + __eeprom_workarea_size__; + +/* Generic rules inclusion.*/ +INCLUDE rules.ld diff --git a/keyboards/handwired/bluepill/ld/STM32F103x8_stm32duino_bootloader.ld b/keyboards/handwired/bluepill/ld/STM32F103x8_stm32duino_bootloader.ld new file mode 100644 index 000000000..f9bfe9c00 --- /dev/null +++ b/keyboards/handwired/bluepill/ld/STM32F103x8_stm32duino_bootloader.ld @@ -0,0 +1,88 @@ +/* + ChibiOS - Copyright (C) 2006..2016 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. +*/ + +/* + * ST32F103xB memory setup for use with the maplemini bootloader. + * You will have to + * #define CORTEX_VTOR_INIT 0x5000 + * in your projects chconf.h + */ +MEMORY +{ + flash0 : org = 0x08002000, len = 128k - 0x2000 + flash1 : org = 0x00000000, len = 0 + flash2 : org = 0x00000000, len = 0 + flash3 : org = 0x00000000, len = 0 + flash4 : org = 0x00000000, len = 0 + flash5 : org = 0x00000000, len = 0 + flash6 : org = 0x00000000, len = 0 + flash7 : org = 0x00000000, len = 0 + ram0 : org = 0x20000000, len = 20k + ram1 : org = 0x00000000, len = 0 + ram2 : org = 0x00000000, len = 0 + ram3 : org = 0x00000000, len = 0 + ram4 : org = 0x00000000, len = 0 + ram5 : org = 0x00000000, len = 0 + ram6 : org = 0x00000000, len = 0 + ram7 : org = 0x00000000, len = 0 +} + +/* For each data/text section two region are defined, a virtual region + and a load region (_LMA suffix).*/ + +/* Flash region to be used for exception vectors.*/ +REGION_ALIAS("VECTORS_FLASH", flash0); +REGION_ALIAS("VECTORS_FLASH_LMA", flash0); + +/* Flash region to be used for constructors and destructors.*/ +REGION_ALIAS("XTORS_FLASH", flash0); +REGION_ALIAS("XTORS_FLASH_LMA", flash0); + +/* Flash region to be used for code text.*/ +REGION_ALIAS("TEXT_FLASH", flash0); +REGION_ALIAS("TEXT_FLASH_LMA", flash0); + +/* Flash region to be used for read only data.*/ +REGION_ALIAS("RODATA_FLASH", flash0); +REGION_ALIAS("RODATA_FLASH_LMA", flash0); + +/* Flash region to be used for various.*/ +REGION_ALIAS("VARIOUS_FLASH", flash0); +REGION_ALIAS("VARIOUS_FLASH_LMA", flash0); + +/* Flash region to be used for RAM(n) initialization data.*/ +REGION_ALIAS("RAM_INIT_FLASH_LMA", flash0); + +/* RAM region to be used for Main stack. This stack accommodates the processing + of all exceptions and interrupts.*/ +REGION_ALIAS("MAIN_STACK_RAM", ram0); + +/* RAM region to be used for the process stack. This is the stack used by + the main() function.*/ +REGION_ALIAS("PROCESS_STACK_RAM", ram0); + +/* RAM region to be used for data segment.*/ +REGION_ALIAS("DATA_RAM", ram0); +REGION_ALIAS("DATA_RAM_LMA", flash0); + +/* RAM region to be used for BSS segment.*/ +REGION_ALIAS("BSS_RAM", ram0); + +/* RAM region to be used for the default heap.*/ +REGION_ALIAS("HEAP_RAM", ram0); + +/* Generic rules inclusion.*/ +INCLUDE rules.ld diff --git a/keyboards/handwired/bluepill/readme.md b/keyboards/handwired/bluepill/readme.md new file mode 100644 index 000000000..8b53f12f4 --- /dev/null +++ b/keyboards/handwired/bluepill/readme.md @@ -0,0 +1,60 @@ + +# BluePill handwired + +Keyboards using a BluePill controller (generic Chinese STM32F103C8T6) and based on the [KC64 of Xydane](https://github.com/Xydane/qmk_firmware). + +Keyboard Maintainer: [FPazos](https://github.com/fpazos), but I hope to leave the project in better hands. +Hardware Supported: Bluepill STM32F103C8T6 +Hardware Availability: Everywhere + +Make example for BluePill70 (after setting up your build environment): + +make handwired/bluepill/bluepill70:default + +See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. + +Read everything before using it. + +## Introduction + +First of all thanks to [Xydane](https://github.com/Xydane) at [GeekHack](https://geekhack.org/) for his advice and his repository, without it you couldn't be reading this. + +That's was an attempt to create a firmware using an STM32F103C8T6, and in a "future", also developing a revision for split keyboards. But... +As I'm mainly a web developer I didn't even get to debug the controller, not to speak about ChibiOS. So I just structured everything, created a working 70% layout and leave the project to someone with more knowledge and patience. + +## Resistor fix + +If you want to use the Bluepill USB port, it's very likely that you need to solder a 1.8 kΩ between PA12 and 3.3V. That depends on the PC's motherboard but I needed, more info [here](https://wiki.stm32duino.com/index.php?title=Blue_Pill). + +## No bootloader + +Neither Xydane or I used the bootloader, the code for it is commented and you can use it if you want. I didn't achieve to run it and just used a serial programmer (FTDI, ST-LINK). + +## Adding layouts and revisions + +If you want to create new layouts just add them to the keymaps folder. If you prefer to develop a more complex revision just copy the bluepill70 folder, rename it and create a new keymap in /keymap.c (I tried to divide the project even more but it didn't worked). + +## Pinout + +That's the pinout; + + A5 A15 A10 A9 A8 B15 B14 B13 B12 B11 B10 B1 B0 A7 A6 + B9 ESC| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10| F11| F12| PSC| PGU| PGD + B8 GRA| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | ' | ¡ | BCKS | DEL + B7 TAB| Q | W | E | R | T | Y | U | I | O | P | ` | + | | HOM + B6 CAP| A | S | D | F | G | H | J | K | L | Ñ | ´ | Ç | ENTER | END + B5 LSI| < | Z | X | C | V | B | N | M | , | . | - | RSHIF | UP | FNT + A4 LCT| WIN| ALT| ESPACE | ALG| FN | RCT| LEF| DOW| RIG + +And the wiring: +ISO +![Wiring](https://i.imgur.com/ZCaxVzs.jpg) +ANSI +![Wiring](https://i.imgur.com/dBUJCdD.jpg) + +It also uses: +PC13: Caps Lock led. + +Backlight dual color leds, my version is for common anode that's more common, for leds with common anode just replace the palSetPad with palClearPad and viceversa. +PA1: Backlight color A. +PA0: Backlight color B. \ No newline at end of file diff --git a/keyboards/handwired/bluepill/rules.mk b/keyboards/handwired/bluepill/rules.mk new file mode 100644 index 000000000..38bacae34 --- /dev/null +++ b/keyboards/handwired/bluepill/rules.mk @@ -0,0 +1,10 @@ +#BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration +EXTRAKEY_ENABLE = yes # Audio control and System control +CONSOLE_ENABLE = yes # Console for debug +COMMAND_ENABLE = yes # Commands for debug and configuration +SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover +CUSTOM_MATRIX = yes # Custom matrix file +MOUSEKEY_ENABLE = no + +DEFAULT_FOLDER = handwired/bluepill/bluepill70 \ No newline at end of file From 5694e7b6a60e0a1b60c1bd7fce51e99a8314abb7 Mon Sep 17 00:00:00 2001 From: ROMUSKING <38523153+ROMUSKING@users.noreply.github.com> Date: Mon, 22 Oct 2018 19:54:31 +0100 Subject: [PATCH 333/788] Keymap: add new keymap (#4127) * an attempt at own layout * typematrixed dvorak * columns shifted columns shifted out, second pinky column moved to the inside. * Update users/romus/romus.h * code cleanup Changes requested by Drashna + Tap Dance enabled * Fixed EOF Fixed the no newline at the end of file alert. * rgblight fight eeprom writes * rgb code simplification * Update users/romus/README.md * Update quantum/keymap_extras/keymap_slovenian.h --- .../keymaps/doxish_dvorak/config.h | 21 + .../keymaps/doxish_dvorak/keymap.c | 161 +++++ .../keymaps/doxish_dvorak/rules.mk | 0 .../lets_split_eh/keymaps/romus/README.md | 7 + .../lets_split_eh/keymaps/romus/keymap.c | 28 + .../lets_split_eh/keymaps/romus/rules.mk | 7 + quantum/keymap_extras/keymap_slovenian.h | 1 + users/romus/README.md | 45 ++ users/romus/config.h | 8 + users/romus/romus.c | 557 ++++++++++++++++++ users/romus/romus.h | 272 +++++++++ users/romus/rules.mk | 24 + 12 files changed, 1131 insertions(+) create mode 100644 keyboards/lets_split_eh/keymaps/doxish_dvorak/config.h create mode 100644 keyboards/lets_split_eh/keymaps/doxish_dvorak/keymap.c create mode 100644 keyboards/lets_split_eh/keymaps/doxish_dvorak/rules.mk create mode 100644 keyboards/lets_split_eh/keymaps/romus/README.md create mode 100644 keyboards/lets_split_eh/keymaps/romus/keymap.c create mode 100644 keyboards/lets_split_eh/keymaps/romus/rules.mk create mode 100644 users/romus/README.md create mode 100644 users/romus/config.h create mode 100644 users/romus/romus.c create mode 100644 users/romus/romus.h create mode 100644 users/romus/rules.mk diff --git a/keyboards/lets_split_eh/keymaps/doxish_dvorak/config.h b/keyboards/lets_split_eh/keymaps/doxish_dvorak/config.h new file mode 100644 index 000000000..526c0837c --- /dev/null +++ b/keyboards/lets_split_eh/keymaps/doxish_dvorak/config.h @@ -0,0 +1,21 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#pragma once diff --git a/keyboards/lets_split_eh/keymaps/doxish_dvorak/keymap.c b/keyboards/lets_split_eh/keymaps/doxish_dvorak/keymap.c new file mode 100644 index 000000000..897608154 --- /dev/null +++ b/keyboards/lets_split_eh/keymaps/doxish_dvorak/keymap.c @@ -0,0 +1,161 @@ +#include "eeconfig.h" + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _DVORAK 0 + +#define _LOWER 3 +#define _RAISE 4 +#define _FUNCTION 15 +#define _ADJUST 16 + +enum custom_keycodes { + DVORAK = SAFE_RANGE, + LOWER, + RAISE, + ADJUST +}; + +// Defines for task manager and such +#define CALTDEL LCTL(LALT(KC_DEL)) +#define TSKMGR LCTL(LSFT(KC_ESC)) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Func | A | S | D | F | G | H | J | K | L | ; | Enter| + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / | ' | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Ctrl | ` | GUI | Alt |Lower | Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_DVORAK] = LAYOUT( \ + KC_QUOTE, KC_COMMA, KC_DOT, KC_P, KC_Y, KC_TAB, KC_BSPC, KC_F, KC_G, KC_C, KC_R, KC_L, \ + KC_A, KC_O, KC_E, KC_U, KC_I, KC_ENT, KC_ENT, KC_D, KC_H, KC_T, KC_N, KC_S, \ + KC_SCOLON, KC_Q, KC_J, KC_K, KC_X, OSM(MOD_LSFT), OSM(MOD_RSFT), KC_B, KC_M, KC_W, KC_V, KC_Z, \ + KC_LCTL, KC_LGUI, KC_LALT, OSM(MOD_LSFT), KC_SPC, LOWER, RAISE, KC_SPC, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/*[BASE] = LAYOUT( + * KC_QUOTE, KC_COMMA, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, + * KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, + * KC_SCOLON, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, + * OSM(MOD_LSFT), OSM(MOD_LCTL), MO(KEYSEL), MO(BROWSER_CONTROL), MO(COMBINED), MO(KEYNAV), KC_ENTER, KC_SPACE, KC_BSPC, RCTL(KC_BSPC), KC_CAPSLOCK, OSM(MOD_LSFT) + * ), + *KC_GRV, + */ +/* Lower + * ,-----------------------------------------------------------------------------------. + * | Esc | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } |Enter | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | | | Mute | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | |Lower | Bksp | Bksp |Raise | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT( \ + KC_ESC, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \ + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, _______, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, KC_MUTE, _______, KC_PIPE, \ + _______, _______, _______, _______, KC_BSPC, _______, _______, KC_BSPC, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | 4 | 5 | 6 | + | F5 | F6 | - | = | [ | ] |Enter | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * |Enter | 7 | 8 | 9 | - | F11 | F12 |ISO # |ISO / | Mute | | \ | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | , | 0 | . |Lower | Bksp | Bksp |Raise | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT( \ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \ + _______, KC_4, KC_5, KC_6, KC_PLUS, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, _______, \ + KC_ENT, KC_7, KC_8, KC_9, KC_MINS, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_MUTE, _______, KC_BSLS, \ + _______, KC_COMM, KC_0, KC_DOT, _______, KC_BSPC, KC_BSPC, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * |Taskmg| | | | | | | |RGBVAI|RGBSAI|RGBHUI|caltde| + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | | | | | |Qwerty|RGBVAD|RGBSAD|RGBHUD|RGBTOG| + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | | | | | |BLSTEP| + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | RESET| + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = LAYOUT( \ + TSKMGR, _______, _______, _______, _______, _______, KC_DEL, _______, RGB_VAI, RGB_SAI, RGB_HUI, CALTDEL, \ + _______, _______, _______, _______, _______, _______, _______, DVORAK, RGB_VAD, RGB_SAD, RGB_HUD, RGB_TOG, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, BL_STEP, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET \ +), + +/* Function + * ,-----------------------------------------------------------------------------------. + * | | | | | | | | | Up | | | | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | | | | | | Left | Down |Right | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Caps | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_FUNCTION] = LAYOUT( \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_UP, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, \ + KC_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ +) + +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + break; + } + return true; +} diff --git a/keyboards/lets_split_eh/keymaps/doxish_dvorak/rules.mk b/keyboards/lets_split_eh/keymaps/doxish_dvorak/rules.mk new file mode 100644 index 000000000..e69de29bb diff --git a/keyboards/lets_split_eh/keymaps/romus/README.md b/keyboards/lets_split_eh/keymaps/romus/README.md new file mode 100644 index 000000000..d54ed6856 --- /dev/null +++ b/keyboards/lets_split_eh/keymaps/romus/README.md @@ -0,0 +1,7 @@ +# Lets Split Eh Layout + +Check out [user readme](../../../../users/romus/README.md) for more info. + +# Usage + +Fill in after flashing diff --git a/keyboards/lets_split_eh/keymaps/romus/keymap.c b/keyboards/lets_split_eh/keymaps/romus/keymap.c new file mode 100644 index 000000000..ba5b75a5c --- /dev/null +++ b/keyboards/lets_split_eh/keymaps/romus/keymap.c @@ -0,0 +1,28 @@ +#include QMK_KEYBOARD_H +#include "romus.h" + + +void matrix_init_keymap (void) { +} + +uint32_t layer_state_set_keymap(uint32_t state) { + + return state; +} + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + // Main Dvorak layer + [_DV] = LAYOUT_letssplit_wrapper(DVORAK), + // Turkish and special character overlay + [_AL] = LAYOUT_letssplit_wrapper(ALTCHAR), + // Gaming layer + [_GA] = LAYOUT_letssplit_wrapper(GAME), + // Numbers layer + [_NU] = LAYOUT_letssplit_wrapper(NUMBERS), + // Settings layer + [_SE] = LAYOUT_letssplit_wrapper(SETTINGS), + // Mouse emulation layer + [_MO] = LAYOUT_letssplit_wrapper(MOUSE), + // Music layer + [_MU] = LAYOUT_letssplit_wrapper(MUSIC), +}; diff --git a/keyboards/lets_split_eh/keymaps/romus/rules.mk b/keyboards/lets_split_eh/keymaps/romus/rules.mk new file mode 100644 index 000000000..ad7dd4c47 --- /dev/null +++ b/keyboards/lets_split_eh/keymaps/romus/rules.mk @@ -0,0 +1,7 @@ +# Build options + +BACKLIGHT_ENABLE = no # Switch LEDs +MOUSEKEY_ENABLE = yes # Emulates mouse key using keypresses +RGBLIGHT_ENABLE = yes # LED strips +TAP_DANCE_ENABLE = yes # Use multi-tap features +AUDIO_ENABLE = no # Audio stuff diff --git a/quantum/keymap_extras/keymap_slovenian.h b/quantum/keymap_extras/keymap_slovenian.h index 53d07837e..a9db17bec 100644 --- a/quantum/keymap_extras/keymap_slovenian.h +++ b/quantum/keymap_extras/keymap_slovenian.h @@ -1,4 +1,5 @@ /* Copyright 2018 Žan Pevec + * * 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 diff --git a/users/romus/README.md b/users/romus/README.md new file mode 100644 index 000000000..0de9d9a81 --- /dev/null +++ b/users/romus/README.md @@ -0,0 +1,45 @@ +# overview + + this is a modified version of let's split keyboard from bbaserdem. i don't like standard dvorak overuses right pinky + so i shifted the columns out. i'm not sure if this is any good, time will tell. + + i have ortholinear let's split eh, which share a lot of functions with other ortholinear keyboards. + +# layout + +i use dvorak with an unorthodox off layout. +if you wanna grab my code, and you used a layout with a persistent base +layer change, change it to layer 0 before proceeding. + +# layers + +* **dvorak**: base layer,with dvorak layout. +* **alternative**: has alternate characters. +* **game**: toggled from *function*, comfortable for gaming use. +* **numeric**: has numericals and symbols. can be locked. +* **function**: layer has media and function keys. +* **mouse**: manipulates mouse. can be locked. +* **music** allows playing sounds. + +# functionality + +* **rgb backlight**: with layer indication, and ability to change base layer lighting mode. +* **secrets**: by placing a secrets.h, and not tracking it, passwords can be stored. +* **mouse**: mouse emulation, complete with diagonal keys. +* **turkish**: an altgr-like overlay that allows some non-common letters, in unicode. + +i suggest checking out how i enabled turkish keys, +how i planned out rgb lighting, +and my mouse implementation; +they might offer some insight into fringe user cases. + +# issues + +all features are too big for the 32kb bootloader. +offenders are audio and rgb lights; it comes down to one or the other. + +~the proton board, and rev 6 might fix that.~ + +# credits + +this is a modified version of let's split keyboard from bbaserdem who has previously written his keymap by himself before, but rewrote it here. diff --git a/users/romus/config.h b/users/romus/config.h new file mode 100644 index 000000000..9332febe6 --- /dev/null +++ b/users/romus/config.h @@ -0,0 +1,8 @@ +#pragma once + +#ifdef TAP_DANCE_ENABLE + #define TAPPING_TERM 300 + #define TAPPING_TOGGLE 1 +#endif + +// !USERSPACE_CONFIG_H diff --git a/users/romus/romus.c b/users/romus/romus.c new file mode 100644 index 000000000..35b524f94 --- /dev/null +++ b/users/romus/romus.c @@ -0,0 +1,557 @@ +#include "romus.h" + +/*---------------*\ +|*-----MOUSE-----*| +\*---------------*/ +#ifdef MOUSEKEY_ENABLE +#include "mousekey.h" +#endif + +/*-------------*\ +|*-----RGB-----*| +\*-------------*/ +#ifdef RGBLIGHT_ENABLE +#include "rgblight.h" +#endif + +/*-------------*\ +|*---UNICODE---*| +\*-------------*/ +#ifdef UNICODE_ENABLE +#endif + +/*-----------------*\ +|*-----SECRETS-----*| +\*-----------------*/ +// Enabled by adding a non-tracked secrets.h to this dir. +#if (__has_include("secrets.h")) +#include "secrets.h" +#endif + +/*---------------*\ +|*-----MUSIC-----*| +\*---------------*/ +#ifdef AUDIO_ENABLE +float tone_game[][2] = SONG(ZELDA_PUZZLE); +float tone_return[][2] = SONG(ZELDA_TREASURE); +float tone_linux[][2] = SONG(UNICODE_LINUX); +float tone_windows[][2] = SONG(UNICODE_WINDOWS); +#endif + +/*-------------------*\ +|*-----TAP-DANCE-----*| +\*-------------------*/ +#ifdef TAP_DANCE_ENABLE +qk_tap_dance_action_t tap_dance_actions[] = { + // Shift on double tap of semicolon + [SCL] = ACTION_TAP_DANCE_DOUBLE( KC_SCLN, KC_COLN ) +}; +#endif + +/* In keymaps, instead of writing _user functions, write _keymap functions + * The __attribute__((weak)) allows for empty definitions here, and during + * compilation, if these functions are defined elsewhere, they are written + * over. This allows to include custom code from keymaps in the generic code + * in this file. + */ +__attribute__ ((weak)) void matrix_init_keymap(void) { } +__attribute__ ((weak)) void matrix_scan_keymap(void) { } +__attribute__ ((weak)) bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { + return true; +} +__attribute__ ((weak)) uint32_t layer_state_set_keymap (uint32_t state) { + return state; +} +__attribute__ ((weak)) void led_set_keymap(uint8_t usb_led) { } + +/* ----------------------- *\ + * -----RGB Functions----- * +\* ----------------------- */ +#ifdef RGBLIGHT_ENABLE + +// Set RGBLIGHT state depending on layer +void rgblight_change( uint8_t this_layer ) { + // Enable RGB light; will not work without this + //rgblight_enable_noeeprom(); + // Change RGB light + switch ( this_layer ) { + case _DV: + // Load base layer + rgblight_disable_noeeprom(); + break; + case _AL: + // Do yellow for alternate + rgblight_enable_noeeprom(); + rgblight_sethsv_noeeprom( 60,255,255); + + + break; + case _GA: + // Do purple for game + rgblight_enable_noeeprom(); + rgblight_sethsv_noeeprom(285,255,255); + + + break; + case _NU: + // Do azure for number + rgblight_enable_noeeprom(); + rgblight_sethsv_noeeprom(186,200,255); + + + break; + case _SE: + // Do red for settings + rgblight_enable_noeeprom(); + + rgblight_sethsv_noeeprom( 16,255,255); + + break; + case _MO: + // Do green for mouse + rgblight_enable_noeeprom(); + rgblight_sethsv_noeeprom(120,255,255); + + + break; + case _MU: + // Do orange for music + + rgblight_enable_noeeprom(); + rgblight_sethsv_noeeprom( 39,255,255); + + break; + default: + // Something went wrong + rgblight_enable_noeeprom(); + rgblight_sethsv_noeeprom( 0,255,255); + + break; + } +} + +#endif + +/*---------------------*\ +|*-----MATRIX INIT-----*| +\*---------------------*/ +void matrix_init_user (void) { + + // Keymap specific things, do it first thing to allow for delays etc + matrix_init_keymap(); + + // Correct unicode +#ifdef UNICODE_ENABLE + set_unicode_input_mode(UC_LNX); +#endif + + // Make beginning layer DVORAK + set_single_persistent_default_layer(_DV); + +} + +/*---------------------*\ +|*-----MATRIX SCAN-----*| +\*---------------------*/ +void matrix_scan_user (void) { + // Keymap specific, do it first + matrix_scan_keymap(); +} + +/*------------------*\ +|*-----KEYCODES-----*| +\*------------------*/ +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + + // Shift check + bool is_capital = ( keyboard_report->mods & (MOD_BIT(KC_LSFT)|MOD_BIT(KC_RSFT)) ); + static bool lock_flag = false; + uint8_t layer = biton32 (layer_state); + + switch (keycode) { + // Secrets implementation +#if (__has_include("secrets.h")) + case SECRET1: + if( !record->event.pressed ) { + send_string_P( secret[ keycode - SECRET1 ] ); + } + return false; + break; + case SECRET2: + if( !record->event.pressed ) { + send_string_P( secret[ keycode - SECRET2 ] ); + } + return false; + break; + case SECRET3: + if( !record->event.pressed ) { + send_string_P( secret[ keycode - SECRET3 ] ); + } + return false; + break; +#endif + + // Lock functionality: These layers are locked if the LOCKED buttons are + // pressed. Otherwise, they are momentary toggles + case K_LOCK: + if (record->event.pressed) { + lock_flag = !lock_flag; + } + return false; + break; + case K_MOUSE: + if (record->event.pressed) { + layer_on(_MO); + lock_flag = false; + } else { + if ( lock_flag ) { + lock_flag = false; + } else { + layer_off(_MO); + } + } + return false; + break; + case K_NUMBR: + if (record->event.pressed) { + layer_on(_NU); + lock_flag = false; + } else { + if ( lock_flag ) { + lock_flag = false; + } else { + layer_off(_NU); + } + } + return false; + break; + + // Layer switches with sound + case K_GAMES: + if (record->event.pressed) { + // On press, turn off layer if active + if ( layer == _GA ) { +#ifdef AUDIO_ENABLE + stop_all_notes(); + PLAY_SONG(tone_return); +#endif + layer_off(_GA); + } + } else { + // After click, turn on layer if accessed from setting + if ( layer == _SE ) { +#ifdef AUDIO_ENABLE + stop_all_notes(); + PLAY_SONG(tone_game); +#endif + layer_on(_GA); + layer_off(_SE); + } + } + return false; + break; + case MU_TOG: + if (record->event.pressed) { + // On press, turn off layer if active + if ( layer == _SE ) { + layer_off(_SE); + layer_on(_MU); + } else { + layer_off(_MU); + } + } + return true; + break; + +//------UNICODE + // Unicode switches with sound +#ifdef UNICODE_ENABLE + case UNI_LI: + if (record->event.pressed) { +#ifdef AUDIO_ENABLE + stop_all_notes(); + PLAY_SONG(tone_linux); +#endif + set_unicode_input_mode(UC_LNX); + } + return false; + break; + case UNI_WN: + if (record->event.pressed) { +#ifdef AUDIO_ENABLE + stop_all_notes(); + PLAY_SONG(tone_windows); +#endif + set_unicode_input_mode(UC_WIN); + } + return false; + break; + + // Turkish letters, with capital functionality + case TUR_A: + if (record->event.pressed) { + if ( is_capital ) { + unicode_input_start(); + register_hex(0x00c2); + unicode_input_finish(); + } else { + unicode_input_start(); + register_hex(0x00e2); + unicode_input_finish(); + } + } + return false; + break; + case TUR_O: + if (record->event.pressed) { + if ( is_capital ) { + unicode_input_start(); + register_hex(0x00d6); + unicode_input_finish(); + } else { + unicode_input_start(); + register_hex(0x00f6); + unicode_input_finish(); + } + } + return false; + break; + case TUR_U: + if (record->event.pressed) { + if ( is_capital ) { + unicode_input_start(); + register_hex(0x00dc); + unicode_input_finish(); + } else { + unicode_input_start(); + register_hex(0x00fc); + unicode_input_finish(); + } + } + return false; + break; + case TUR_I: + if (record->event.pressed) { + if ( is_capital ) { + unicode_input_start(); + register_hex(0x0130); + unicode_input_finish(); + } else { + unicode_input_start(); + register_hex(0x0131); + unicode_input_finish(); + } + } + return false; + break; + case TUR_G: + if (record->event.pressed) { + if ( is_capital ) { + unicode_input_start(); + register_hex(0x011e); + unicode_input_finish(); + } else { + unicode_input_start(); + register_hex(0x011f); + unicode_input_finish(); + } + } + return false; + break; + case TUR_C: + if (record->event.pressed) { + if ( is_capital ) { + unicode_input_start(); + register_hex(0x00c7); + unicode_input_finish(); + } else { + unicode_input_start(); + register_hex(0x00e7); + unicode_input_finish(); + } + } + return false; + break; + case TUR_S: + if (record->event.pressed) { + if ( is_capital ) { + unicode_input_start(); + register_hex(0x015e); + unicode_input_finish(); + } else { + unicode_input_start(); + register_hex(0x015f); + unicode_input_finish(); + } + } + return false; + break; +#endif + +//-------Diagonal mouse movements +#ifdef MOUSEKEY_ENABLE + case MO_NE: + if( record->event.pressed ) { + mousekey_on(MO_N); + mousekey_on(MO_E); + mousekey_send(); + } else { + mousekey_off(MO_N); + mousekey_off(MO_E); + mousekey_send(); + } + return false; + break; + case MO_NW: + if( record->event.pressed ) { + mousekey_on(MO_N); + mousekey_on(MO_W); + mousekey_send(); + } else { + mousekey_off(MO_N); + mousekey_off(MO_W); + mousekey_send(); + } + return false; + break; + case MO_SE: + if( record->event.pressed ) { + mousekey_on(MO_S); + mousekey_on(MO_E); + mousekey_send(); + } else { + mousekey_off(MO_S); + mousekey_off(MO_E); + mousekey_send(); + } + return false; + break; + case MO_SW: + if( record->event.pressed ) { + mousekey_on(MO_S); + mousekey_on(MO_W); + mousekey_send(); + } else { + mousekey_off(MO_S); + mousekey_off(MO_W); + mousekey_send(); + } + return false; + break; + case MO_S_NE: + if( record->event.pressed ) { + mousekey_on(MO_S_N); + mousekey_on(MO_S_E); + mousekey_send(); + } else { + mousekey_off(MO_S_N); + mousekey_off(MO_S_E); + mousekey_send(); + } + return false; + break; + case MO_S_NW: + if( record->event.pressed ) { + mousekey_on(MO_S_N); + mousekey_on(MO_S_W); + mousekey_send(); + } else { + mousekey_off(MO_S_N); + mousekey_off(MO_S_W); + mousekey_send(); + } + return false; + break; + case MO_S_SE: + if( record->event.pressed ) { + mousekey_on(MO_S_S); + mousekey_on(MO_S_E); + mousekey_send(); + } else { + mousekey_off(MO_S_S); + mousekey_off(MO_S_E); + mousekey_send(); + } + return false; + break; + case MO_S_SW: + if( record->event.pressed ) { + mousekey_on(MO_S_S); + mousekey_on(MO_S_W); + mousekey_send(); + } else { + mousekey_off(MO_S_S); + mousekey_off(MO_S_W); + mousekey_send(); + } + return false; + break; +#endif + +//------DOUBLE PRESS, with added left navigation + case DBL_SPC: + if( record->event.pressed ) { + SEND_STRING(" "SS_TAP(X_LEFT)); + } + return false; + break; + case DBL_ANG: + if( record->event.pressed ) { + SEND_STRING("<>"SS_TAP(X_LEFT)); + } + return false; + break; + case DBL_PAR: + if( record->event.pressed ) { + SEND_STRING("()"SS_TAP(X_LEFT)); + } + return false; + break; + case DBL_SQR: + if( record->event.pressed ) { + SEND_STRING("[]"SS_TAP(X_LEFT)); + } + return false; + break; + case DBL_BRC: + if( record->event.pressed ) { + SEND_STRING("{}"SS_TAP(X_LEFT)); + } + return false; + break; + case DBL_QUO: + if( record->event.pressed ) { + SEND_STRING("\'\'"SS_TAP(X_LEFT)); + } + return false; + break; + case DBL_DQT: + if( record->event.pressed ) { + SEND_STRING("\"\""SS_TAP(X_LEFT)); + } + return false; + break; + case DBL_GRV: + if( record->event.pressed ) { + SEND_STRING("``"SS_TAP(X_LEFT)); + } + return false; + break; +// END OF KEYCODES + } + return process_record_keymap(keycode, record); +} + +/*----------------------*\ +|*-----LAYER CHANGE-----*| +\*----------------------*/ + +uint32_t layer_state_set_user(uint32_t state) { + + state = layer_state_set_keymap (state); +#ifdef RGBLIGHT_ENABLE + // Change RGB lighting depending on the last layer activated + rgblight_change( biton32(state) ); +#endif + return state; +} \ No newline at end of file diff --git a/users/romus/romus.h b/users/romus/romus.h new file mode 100644 index 000000000..265c942e9 --- /dev/null +++ b/users/romus/romus.h @@ -0,0 +1,272 @@ +// This is a modified version of Let's Split keyboard from bbaserdem + +#pragma once + +#include "quantum.h" + +// Use 7 wide characters for keymaps +#define _______ KC_TRNS +#define XXX KC_NO + +// Layers +#define _DV 0 // Base layer +#define _AL 1 // Alt char overlay +#define _GA 2 // Game layer +#define _NU 3 // Numbers layer +#define _SE 4 // Settings layer +#define _MO 5 // Mouse emulation +#define _MU 6 // Music mode + +// Define short macros +#define UNDO LCTL(KC_Z) +#define REDO LCTL(KC_Y) +#define COPY LCTL(KC_C) +#define CUT LCTL(KC_X) +#define PASTE LCTL(KC_V) +#define EXIT LALT(KC_F4) +#define CAPS SFT_T(KC_CAPS) + + +// Rename mouse keys with 7 letters +#ifdef MOUSEKEY_ENABLE +#define MO_S_N KC_MS_WH_UP +#define MO_S_S KC_MS_WH_DOWN +#define MO_S_E KC_MS_WH_RIGHT +#define MO_S_W KC_MS_WH_LEFT +#define MO_N KC_MS_UP +#define MO_S KC_MS_DOWN +#define MO_E KC_MS_RIGHT +#define MO_W KC_MS_LEFT +#define MO_CL_L KC_MS_BTN1 +#define MO_CL_R KC_MS_BTN2 +#define MO_CL_M KC_MS_BTN3 +#define MO_CL_4 KC_MS_BTN4 +#define MO_CL_5 KC_MS_BTN5 +#define MO_AC_0 KC_MS_ACCEL0 +#define MO_AC_1 KC_MS_ACCEL1 +#define MO_AC_2 KC_MS_ACCEL2 +#else +#define MO_S_N KC_NO +#define MO_S_S KC_NO +#define MO_S_E KC_NO +#define MO_S_W KC_NO +#define MO_N KC_NO +#define MO_S KC_NO +#define MO_E KC_NO +#define MO_W KC_NO +#define MO_CL_L KC_NO +#define MO_CL_R KC_NO +#define MO_CL_M KC_NO +#define MO_CL_1 KC_NO +#define MO_CL_2 KC_NO +#define MO_AC_0 KC_NO +#define MO_AC_1 KC_NO +#define MO_AC_2 KC_NO +#endif + +// Rename music keys with <8 letters +#ifdef AUDIO_ENABLE +#define MU_REC KC_LCTL +#define MU_STOP KC_LALT +#define MU_PLAY KC_LGUI +#define MU_PLAY KC_LGUI +#define MU_FAST KC_UP +#define MU_SLOW KC_DOWN +#define MU_MASK KC_A +#else +#define MU_REC KC_NO +#define MU_STOP KC_NO +#define MU_PLAY KC_NO +#define MU_PLAY KC_NO +#define MU_FAST KC_NO +#define MU_SLOW KC_NO +#define MU_MASK KC_NO +#endif + +// Define non-capitalized UTF shortcuts here +#ifdef UNICODE_ENABLE +#define PHY_HBR UC(0x0127) +#define PHY_DEG UC(0x00b0) +#define CUR_LIR UC(0x20ba) +#define CUR_BIT UC(0x20bf) +#define CUR_EUR UC(0x20ac) +#define CUR_BPN UC(0x00a3) +#define CUR_YEN UC(0x00a5) +#else +#define PHY_HBR KC_NO +#define PHY_DEG KC_NO +#define CUR_LIR KC_NO +#define CUR_BIT KC_NO +#define CUR_EUR KC_NO +#define CUR_BPN KC_NO +#define CUR_YEN KC_NO +#endif + +// Custom keycodes +enum userspace_custom_keycodes { + // Turkish letters, with shifting + TUR_A = SAFE_RANGE, + TUR_C, + TUR_G, + TUR_I, + TUR_O, + TUR_S, + TUR_U, + // Unicode mode switch + UNI_LI, + UNI_WN, + // Double keys + DBL_SPC, + DBL_ANG, + DBL_PAR, + DBL_SQR, + DBL_BRC, + DBL_QUO, + DBL_DQT, + DBL_GRV, + // Diagonal mouse movements + MO_NE, + MO_NW, + MO_SE, + MO_SW, + MO_S_NE, + MO_S_NW, + MO_S_SE, + MO_S_SW, + // Layer switches and lock functionality + K_MOUSE, + K_NUMBR, + K_LOCK, + K_GAMES, + // Secret macros + SECRET1, + SECRET2, + SECRET3 +}; + +// Do tap dancable semicolon key if available +#ifdef TAP_DANCE_ENABLE +enum { + SCL = 0 +}; +#define MY_SCL TD(SCL) +#else +#define MY_SCL KC_SCLN +#endif + +// Shared keymaps +#define LAYOUT_planck_wrapper(...) LAYOUT_planck_grid(__VA_ARGS__) +#define LAYOUT_letssplit_wrapper(...) LAYOUT_ortho_4x12(__VA_ARGS__) + +/* Dvorak + * ,------------------------------------------------------------------------. + * | ' " | , | . | P | Y | Esc || Del | F | G | C | R | L | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | A | O | E | U | I | Bkp || Ent | D | H | T | N | S | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | ; : | Q | J | K | X | Spc || SET | B | M | W | V | Z | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | Ctrl| OS | Alt | Tab | Cps | ACH || SYM | Spc | Lft | Up | Dwn | Rght| + * `------------------------------------------------------------------------' */ +#define DVORAK \ + KC_QUOT,KC_COMM,KC_DOT, KC_P, KC_Y, KC_ESC, KC_DEL, KC_F, KC_G, KC_C, KC_R, KC_L, \ + KC_A, KC_O, KC_E, KC_U, KC_I, KC_BSPC,KC_ENT, KC_D, KC_H, KC_T, KC_N, KC_S, \ + MY_SCL, KC_Q, KC_J, KC_K, KC_X, KC_SPC, MO(_SE),KC_B, KC_M, KC_W, KC_V, KC_Z, \ + KC_LCTL,KC_LGUI,KC_LALT,KC_TAB, CAPS, MO(_AL),K_NUMBR,KC_SPC, KC_LEFT,KC_UP, KC_DOWN,KC_RGHT + +/* Alternative character overlay + * ,------------------------------------------------------------------------. + * | ` ~ | ' ' | " " | Euro|Pound| || Del | Home| PgUp| Prn | \ | | / ? | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | Redo| < > | ( ) | [ ] | { } | Alt || Ins | End |PgDwn| Scl | BTC | - _ | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | Undo| Cut | Copy|Paste| EXIT| Shf || | | | | Yen | = + | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | | | | | | || | | | | | | + * `------------------------------------------------------------------------' */ +#define ALTCHAR \ + KC_GRV, DBL_QUO,DBL_DQT,CUR_EUR,CUR_BPN,_______,_______,KC_HOME,KC_PGUP,KC_PSCREEN, KC_BSLASH, KC_SLSH, \ + REDO, DBL_ANG,DBL_PAR,DBL_SQR,DBL_BRC,KC_LALT,KC_INS, KC_END, KC_PGDN,KC_SCROLLLOCK, CUR_BIT, KC_MINUS, \ + UNDO, CUT, COPY, PASTE, EXIT, KC_LSFT,_______,_______,_______,_______, CUR_YEN, KC_EQUAL, \ + _______,_______,_______,_______,_______,_______,_______,DBL_SPC,_______,_______, _______, _______ + +/* Game layer + * ,------------------------------------------------------------------------. + * | OFF | Q | W | E | R | T || Esc | 7 | 8 | 9 |NumLk|Bkspc| + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | Tab | A | S | D | F | G || F1 | 4 | 5 | 6 | \ | Ent | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | Shf | Z | X | C | V | B || F2 | 1 | 2 | 3 | ^ | MSE | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | Ctrl| Alt | / | ` | SYM | Spc || F5 | Ent | 0 | < | v | > | + * `------------------------------------------------------------------------' */ +#define GAME \ + K_GAMES,KC_Q, KC_W, KC_E, KC_R, KC_T, KC_ESC, KC_P7, KC_P8, KC_P9, KC_NLCK,KC_BSPC, \ + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_F1, KC_P4, KC_P5, KC_P6, KC_BSLS,KC_ENT , \ + KC_LSFT,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_F2, KC_P1, KC_P2, KC_P3, KC_UP,K_MOUSE, \ + KC_LCTL,KC_LALT,KC_SLSH,KC_GRV, K_NUMBR,KC_SPC, KC_F5, KC_ENT, KC_P0, KC_LEFT,KC_DOWN,KC_RGHT + +/* Symbols layer + * ,------------------------------------------------------------------------. + * | OFF | ` | ~ | \ | [ | { || } | ] | - | _ | = | + | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | 1 | 2 | 3 | 4 | 5 | || LCK | 6 | 7 | 8 | 9 | 0 | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | ! | @ | # | $ | % | ||Vol +| ^ | & | * | ( | ) | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | | | | | | | || | | | | | | + * `------------------------------------------------------------------------' */ +#define NUMBERS \ + K_NUMBR,KC_GRV, KC_TILD,KC_BSLS,KC_LBRC,KC_LCBR,KC_RCBR,KC_RBRC,KC_MINS,KC_UNDS,KC_EQL, KC_PLUS, \ + KC_1, KC_2, KC_3, KC_4, KC_5, _______,K_LOCK, KC_6, KC_7, KC_8, KC_9, KC_0, \ + KC_EXLM,KC_AT, KC_HASH,KC_DLR, KC_PERC,_______,KC_VOLU,KC_CIRC,KC_AMPR,KC_ASTR,KC_LPRN,KC_RPRN, \ + KC_PIPE,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______ + +/* Settings layer + * ,------------------------------------------------------------------------. + * |BLLed| F1 | F2 | F3 | F4 | Lin || Win | Wake| |Hue -|Hue +|Reset| + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | | F5 | F6 | F7 | F8 | ||Vol 0| |RGBto|Sat -|Sat +| | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | Game| F9 | F10 | F11 | F12 |Vol 0|| |PrtSc|RGBan|Bri -|Bri +| | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * |Musir| | | | |Vol +||Vol -| Prev| Stop|TogMu| Next| | + * `------------------------------------------------------------------------' */ +#define SETTINGS \ + BL_STEP,KC_F1, KC_F2, KC_F3, KC_F4, UNI_LI, UNI_WN, KC_WAKE,_______,RGB_HUD,RGB_HUI,RESET , \ + _______,KC_F5, KC_F6, KC_F7, KC_F8, _______,KC_MUTE,_______,RGB_TOG,RGB_SAD,RGB_SAI,_______, \ + K_GAMES,KC_F9, KC_F10, KC_F11, KC_F12, KC_MUTE,_______,KC_PSCR,RGB_MOD,RGB_VAD,RGB_VAI,_______, \ + MU_TOG, _______,_______,_______,_______,KC_VOLU,KC_VOLD,KC_MPRV,KC_MSTP,KC_MPLY,KC_MNXT,_______ + +/* Mouse layer + * ,------------------------------------------------------------------------. + * |Ulock| \ | ^ | / |.....|.....||.....|.....| |\|.| |^| | |/|.| | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | | < | Mid | > |Btn 4|.....||.....|Btn 5| <-- | Mid | --> | | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | | / | v | \ |.....|.....||.....|.....| |/| | |v| | |\| | LCK | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | | | | | | Left||Right| | |Accl0|Accl1|Accl2| + * `------------------------------------------------------------------------' */ +#define MOUSE \ + K_MOUSE,MO_NW, MO_N, MO_NE, XXX, XXX ,XXX, XXX, MO_S_NW,MO_S_N, MO_S_NE,_______, \ + _______,MO_W, MO_CL_M,MO_E, MO_CL_4,XXX ,XXX, MO_CL_5,MO_S_W, MO_CL_M,MO_S_E, _______, \ + _______,MO_SW, MO_S, MO_SE, XXX, XXX ,XXX, XXX, MO_S_SW,MO_S_S, MO_S_SE,K_LOCK , \ + _______,_______,_______,_______,_______,MO_CL_L,MO_CL_R,_______,MO_AC_0,MO_AC_1,MO_AC_2,_______ + +/* Music layer + * ,------------------------------------------------------------------------. + * |.....|.....|.....|.....|.....|.....||.....|.....|.....|.....|.....|.....| + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * |.....|.....|.....|.....|.....|.....||.....|.....|.....|.....|.....|.....| + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * |.....|.....|.....|.....|.....|.....||.....|.....|.....|.....|.....|.....| + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | togg| rec | stop| play| slow| fast||modes|.....|.....|.....|.....|.....| + * `------------------------------------------------------------------------' + */ +#define MUSIC \ + MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK, \ + MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK, \ + MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK, \ + MU_TOG, MU_REC, MU_STOP,MU_PLAY,MU_SLOW,MU_FAST,MU_MOD, MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK diff --git a/users/romus/rules.mk b/users/romus/rules.mk new file mode 100644 index 000000000..78ce2e93f --- /dev/null +++ b/users/romus/rules.mk @@ -0,0 +1,24 @@ +SRC += romus.c +EXTRAFLAGS += -flto # Used to make code smaller + +# ENABLE +UNICODE_ENABLE = yes # Used for unicode character emulation +EXTRAKEY_ENABLE = yes # OS signals like volume control + +# DISABLE +ifndef BLUETOOTH_ENABLE + BLUETOOTH_ENABLE = no # No bluetooth +endif +COMMAND_ENABLE = no # Some bootmagic thing i dont use +BOOTMAGIC_ENABLE = no # Access to EEPROM settings, not needed +CONSOLE_ENABLE = no # Allows console output with a command +SLEEP_LED_ENABLE = no # Breathes LED's when computer is asleep. Untested. +NKRO_ENABLE = no # Default is 6KRO which is plenty +MIDI_ENABLE = no # Untested feature +FAUXCLICKY_ENABLE = no # Emulates clicks using speaker +KEY_LOCK_ENABLE = no # Allows locking any key. Not used +API_SYSEX_ENABLE = no # Allows OS to send signals. + + +# Disabling this makes it compile, i dont know why +# VARIABLE_TRACE = no # Allows debugging variables From 00b6f14821f44ead75504e28d7fed26791cb2875 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 22 Oct 2018 08:57:37 -0700 Subject: [PATCH 334/788] Replace outdated RGB/Audio information --- keyboards/amj40/keymaps/default/rules.mk | 4 ++-- keyboards/amj40/keymaps/fabian/rules.mk | 2 +- keyboards/amj40/keymaps/jetpacktuxedo/rules.mk | 2 +- keyboards/amj40/keymaps/myee/rules.mk | 2 +- keyboards/amj60/keymaps/iso_split_rshift/rules.mk | 2 +- keyboards/atomic/keymaps/pvc/rules.mk | 2 +- keyboards/atomic/rules.mk | 2 +- keyboards/atreus/keymaps/xk/rules.mk | 2 +- keyboards/bfo9000/rules.mk | 2 +- keyboards/bpiphany/frosty_flake/keymaps/QFR_JM/rules.mk | 2 +- keyboards/bpiphany/frosty_flake/keymaps/default/rules.mk | 2 +- keyboards/bpiphany/frosty_flake/keymaps/nikchi/rules.mk | 2 +- keyboards/bpiphany/frosty_flake/keymaps/tkl/rules.mk | 2 +- keyboards/bpiphany/pegasushoof/keymaps/blowrak/rules.mk | 2 +- keyboards/bpiphany/pegasushoof/keymaps/citadel/rules.mk | 2 +- keyboards/bpiphany/pegasushoof/keymaps/default/rules.mk | 2 +- keyboards/bpiphany/pegasushoof/rules.mk | 2 +- keyboards/bpiphany/tiger_lily/keymaps/default/rules.mk | 2 +- keyboards/bpiphany/tiger_lily/keymaps/default_ansi/rules.mk | 2 +- keyboards/clueboard/66/keymaps/xyverz/rules.mk | 2 +- keyboards/comet46/keymaps/satt/rules.mk | 2 +- keyboards/contra/keymaps/losinggeneration/rules.mk | 2 +- keyboards/converter/ibm_terminal/keymaps/default/rules.mk | 2 +- keyboards/converter/ibm_terminal/keymaps/priyadi/rules.mk | 2 +- keyboards/converter/ibm_terminal/rules.mk | 2 +- keyboards/converter/sun_usb/rules.mk | 2 +- keyboards/crkbd/keymaps/default/rules.mk | 2 +- keyboards/crkbd/keymaps/drashna/rules.mk | 2 +- keyboards/crkbd/keymaps/like_jis/rules.mk | 2 +- keyboards/crkbd/rules.mk | 2 +- keyboards/daisy/rules.mk | 2 +- keyboards/deltasplit75/keymaps/itsaferbie/rules.mk | 2 +- keyboards/deltasplit75/rules.mk | 6 +++--- keyboards/diverge3/rules.mk | 2 +- keyboards/divergetm2/rules.mk | 2 +- keyboards/do60/rules.mk | 2 +- keyboards/eco/keymaps/default/rules.mk | 2 +- keyboards/eco/keymaps/hexwire/rules.mk | 2 +- keyboards/eco/keymaps/that_canadian/rules.mk | 2 +- keyboards/eco/keymaps/xyverz/rules.mk | 2 +- keyboards/ergo42/rules.mk | 2 +- keyboards/ergodash/rules.mk | 2 +- keyboards/ergodox_infinity/keymaps/narze/rules.mk | 2 +- keyboards/ergoinu/keymaps/default/rules.mk | 2 +- keyboards/ergoinu/keymaps/default_jis/rules.mk | 2 +- keyboards/ergoinu/rules.mk | 2 +- keyboards/ergotravel/rules.mk | 2 +- keyboards/fortitude60/rules.mk | 2 +- keyboards/fourier/rules.mk | 2 +- keyboards/gherkin/keymaps/mjt/rules.mk | 2 +- keyboards/gonnerd/keymaps/default/rules.mk | 2 +- keyboards/gonnerd/keymaps/gam3cat/rules.mk | 2 +- keyboards/gonnerd/keymaps/mauin/rules.mk | 2 +- keyboards/gonnerd/keymaps/tkl/rules.mk | 2 +- keyboards/hadron/keymaps/default/rules.mk | 2 +- keyboards/hadron/keymaps/side_numpad/rules.mk | 2 +- .../handwired/MS_sculpt_mobile/keymaps/default/rules.mk | 2 +- .../handwired/MS_sculpt_mobile/keymaps/milestogo/rules.mk | 2 +- keyboards/handwired/arrow_pad/keymaps/pad_21/rules.mk | 2 +- keyboards/handwired/arrow_pad/keymaps/pad_24/rules.mk | 2 +- keyboards/handwired/atreus50/rules.mk | 2 +- keyboards/handwired/dactyl_manuform/4x5/rules.mk | 3 +-- keyboards/handwired/dactyl_manuform/4x6/rules.mk | 3 +-- keyboards/handwired/dactyl_manuform/5x6/rules.mk | 3 +-- keyboards/handwired/dactyl_manuform/5x7/rules.mk | 2 +- keyboards/handwired/dactyl_manuform/6x6/rules.mk | 3 +-- keyboards/handwired/dactyl_manuform/rules.mk | 2 +- keyboards/handwired/kbod/keymaps/default/rules.mk | 2 +- keyboards/handwired/minorca/keymaps/default/rules.mk | 2 +- keyboards/handwired/minorca/keymaps/rgb/rules.mk | 2 +- keyboards/handwired/minorca/rules.mk | 2 +- keyboards/handwired/not_so_minidox/rules.mk | 2 +- keyboards/handwired/pilcrow/keymaps/default/rules.mk | 2 +- keyboards/handwired/promethium/keymaps/default/rules.mk | 2 +- keyboards/handwired/promethium/keymaps/priyadi/rules.mk | 2 +- keyboards/handwired/promethium/rules.mk | 2 +- keyboards/handwired/qc60/rules.mk | 2 +- keyboards/handwired/terminus_mini/keymaps/default/rules.mk | 2 +- keyboards/handwired/terminus_mini/rules.mk | 2 +- keyboards/handwired/woodpad/keymaps/default/rules.mk | 2 +- keyboards/handwired/xealous/rules.mk | 2 +- keyboards/helix/pico/keymaps/biacco/rules.mk | 2 +- keyboards/helix/pico/keymaps/default/rules.mk | 2 +- keyboards/helix/rev1/keymaps/OLED_sample/rules.mk | 2 +- keyboards/helix/rev2/keymaps/default/rules.mk | 2 +- keyboards/helix/rev2/keymaps/edvorakjp/rules.mk | 2 +- keyboards/helix/rev2/keymaps/five_rows/rules.mk | 2 +- keyboards/helix/rev2/keymaps/five_rows_jis/rules.mk | 2 +- keyboards/helix/rev2/keymaps/froggy/rules.mk | 2 +- keyboards/helix/rev2/keymaps/led_test/rules.mk | 2 +- keyboards/helix/rev2/keymaps/yshrsmz/rules.mk | 2 +- keyboards/helix/rules.mk | 2 +- keyboards/hhkb/keymaps/cinaeco/rules.mk | 2 +- keyboards/iris/keymaps/edvorakjp/rules.mk | 2 +- keyboards/iris/rules.mk | 2 +- keyboards/jd45/keymaps/mjt/rules.mk | 2 +- keyboards/jd45/keymaps/mjt6u/rules.mk | 2 +- keyboards/kinesis/keymaps/carpalx/rules.mk | 2 +- keyboards/kinesis/keymaps/default/rules.mk | 2 +- keyboards/kinesis/keymaps/default_pretty/rules.mk | 2 +- keyboards/kinesis/keymaps/dvorak/rules.mk | 2 +- keyboards/kinesis/keymaps/insertsnideremarks/rules.mk | 2 +- keyboards/kinesis/keymaps/milestogo/rules.mk | 2 +- keyboards/kinesis/keymaps/xyverz/rules.mk | 2 +- keyboards/launchpad/keymaps/default/rules.mk | 2 +- keyboards/lets_split/keymaps/OLED_sample/rules.mk | 2 +- keyboards/lets_split/keymaps/heartrobotninja/rules.mk | 3 +-- keyboards/lets_split/keymaps/mjt/rules.mk | 2 +- keyboards/lets_split/keymaps/piemod/rules.mk | 2 +- keyboards/lets_split/keymaps/xk/rules.mk | 2 +- keyboards/lets_split/rules.mk | 2 +- keyboards/levinson/keymaps/losinggeneration/rules.mk | 2 +- keyboards/levinson/rules.mk | 2 +- keyboards/lfkeyboards/lfk78/keymaps/default/rules.mk | 2 +- keyboards/lfkeyboards/lfk78/keymaps/iso/rules.mk | 2 +- keyboards/lfkeyboards/lfk78/keymaps/split_bs_osx/rules.mk | 2 +- keyboards/lfkeyboards/lfkpad/keymaps/default/rules.mk | 2 +- keyboards/lily58/rules.mk | 2 +- keyboards/meira/rules.mk | 2 +- keyboards/minidox/keymaps/alairock/rules.mk | 2 +- keyboards/minidox/keymaps/that_canadian/rules.mk | 2 +- keyboards/minidox/keymaps/xyverz/rules.mk | 2 +- keyboards/minidox/rules.mk | 2 +- keyboards/mint60/rules.mk | 2 +- keyboards/miuni32/keymaps/adam-lee/rules.mk | 2 +- keyboards/miuni32/keymaps/default/rules.mk | 2 +- keyboards/miuni32/keymaps/ht_156/rules.mk | 2 +- keyboards/miuni32/keymaps/ki/rules.mk | 2 +- keyboards/mt40/rules.mk | 2 +- keyboards/niu_mini/keymaps/spacebarracecar/rules.mk | 2 +- keyboards/nyquist/keymaps/DivergeJM/rules.mk | 2 +- keyboards/nyquist/keymaps/danielhklein/rules.mk | 2 +- keyboards/nyquist/keymaps/losinggeneration/rules.mk | 2 +- keyboards/nyquist/rules.mk | 2 +- keyboards/org60/rules.mk | 2 +- keyboards/orthodox/rules.mk | 2 +- keyboards/planck/keymaps/ab/rules.mk | 2 +- keyboards/planck/keymaps/alexey/rules.mk | 2 +- keyboards/planck/keymaps/angerthosenear/rules.mk | 2 +- keyboards/planck/keymaps/austin/rules.mk | 2 +- keyboards/planck/keymaps/basic/rules.mk | 2 +- keyboards/planck/keymaps/bone2planck/rules.mk | 2 +- keyboards/planck/keymaps/callum/rules.mk | 2 +- keyboards/planck/keymaps/cbbrowne/rules.mk | 2 +- keyboards/planck/keymaps/chance/rules.mk | 2 +- keyboards/planck/keymaps/charlie/rules.mk | 2 +- keyboards/planck/keymaps/circuit/rules.mk | 2 +- keyboards/planck/keymaps/daniel/rules.mk | 2 +- keyboards/planck/keymaps/danielhklein/rules.mk | 2 +- keyboards/planck/keymaps/david/rules.mk | 2 +- keyboards/planck/keymaps/dc/rules.mk | 2 +- keyboards/planck/keymaps/dlaroe/rules.mk | 2 +- keyboards/planck/keymaps/dr_notsokind/rules.mk | 2 +- keyboards/planck/keymaps/dzobert/rules.mk | 2 +- keyboards/planck/keymaps/espynn/rules.mk | 2 +- keyboards/planck/keymaps/experimental/rules.mk | 2 +- keyboards/planck/keymaps/gabriel/rules.mk | 2 +- keyboards/planck/keymaps/gunp/rules.mk | 2 +- keyboards/planck/keymaps/impossible/rules.mk | 2 +- keyboards/planck/keymaps/jacob/rules.mk | 2 +- keyboards/planck/keymaps/jeebak/rules.mk | 2 +- keyboards/planck/keymaps/jhenahan/rules.mk | 2 +- keyboards/planck/keymaps/joe/rules.mk | 2 +- keyboards/planck/keymaps/johannes/rules.mk | 2 +- keyboards/planck/keymaps/kyle/rules.mk | 2 +- keyboards/planck/keymaps/lae3/rules.mk | 2 +- keyboards/planck/keymaps/leo/rules.mk | 2 +- keyboards/planck/keymaps/lucas/rules.mk | 2 +- keyboards/planck/keymaps/lukas/rules.mk | 2 +- keyboards/planck/keymaps/luke/rules.mk | 2 +- keyboards/planck/keymaps/max/rules.mk | 2 +- keyboards/planck/keymaps/mollat/rules.mk | 2 +- keyboards/planck/keymaps/myoung34/rules.mk | 2 +- keyboards/planck/keymaps/narze/rules.mk | 2 +- keyboards/planck/keymaps/neo2planck/rules.mk | 2 +- keyboards/planck/keymaps/nico/rules.mk | 2 +- keyboards/planck/keymaps/not-quite-neo/rules.mk | 2 +- keyboards/planck/keymaps/pickle_jr/rules.mk | 2 +- keyboards/planck/keymaps/premek/rules.mk | 2 +- keyboards/planck/keymaps/priyadi/rules.mk | 2 +- keyboards/planck/keymaps/pvc/rules.mk | 2 +- keyboards/planck/keymaps/rai-suta/rules.mk | 2 +- keyboards/planck/keymaps/sgoodwin/rules.mk | 2 +- keyboards/planck/keymaps/spacebarracecar/rules.mk | 3 +-- keyboards/planck/keymaps/tak3over/rules.mk | 2 +- keyboards/planck/keymaps/thermal_printer/rules.mk | 2 +- keyboards/planck/keymaps/tong92/rules.mk | 2 +- keyboards/planck/keymaps/vifon/rules.mk | 2 +- keyboards/planck/keymaps/yale/rules.mk | 2 +- keyboards/planck/keymaps/yang/rules.mk | 2 +- keyboards/planck/keymaps/zach/rules.mk | 2 +- keyboards/planck/keymaps/zrichard/rules.mk | 2 +- keyboards/preonic/keymaps/bucktooth/rules.mk | 2 +- keyboards/preonic/keymaps/dlaroe/rules.mk | 2 +- keyboards/preonic/keymaps/jacwib/rules.mk | 2 +- keyboards/preonic/keymaps/kinesis/rules.mk | 2 +- keyboards/preonic/keymaps/seph/rules.mk | 2 +- keyboards/preonic/keymaps/zach/rules.mk | 2 +- keyboards/quefrency/rules.mk | 2 +- keyboards/qwertyydox/rules.mk | 2 +- keyboards/rama/m60_a/rules.mk | 3 +-- keyboards/redox/rules.mk | 2 +- keyboards/rorschach/keymaps/insertsnideremarks/rules.mk | 4 +--- keyboards/rorschach/rules.mk | 2 +- keyboards/s60_x/keymaps/ansi_qwertz/rules.mk | 2 +- keyboards/s60_x/keymaps/bluebear/rules.mk | 2 +- keyboards/satan/keymaps/addcninblue/rules.mk | 2 +- keyboards/satan/keymaps/admiralStrokers/rules.mk | 2 +- keyboards/satan/keymaps/ben_iso/rules.mk | 2 +- keyboards/satan/keymaps/chaser/rules.mk | 2 +- keyboards/satan/keymaps/colemak/rules.mk | 2 +- keyboards/satan/keymaps/default/rules.mk | 2 +- keyboards/satan/keymaps/dende_iso/rules.mk | 2 +- keyboards/satan/keymaps/dkrieger/rules.mk | 2 +- keyboards/satan/keymaps/isoHHKB/rules.mk | 2 +- keyboards/satan/keymaps/lepa/rules.mk | 2 +- keyboards/satan/keymaps/midi/rules.mk | 2 +- keyboards/satan/keymaps/olligranlund_iso/rules.mk | 2 +- keyboards/satan/keymaps/sethbc/rules.mk | 2 +- keyboards/satan/keymaps/smt/rules.mk | 2 +- keyboards/satan/keymaps/unxmaal/rules.mk | 2 +- keyboards/tada68/keymaps/ardakilic/rules.mk | 2 +- keyboards/tada68/keymaps/bazooka/rules.mk | 2 +- keyboards/tada68/keymaps/cheese/rules.mk | 3 +-- keyboards/tada68/keymaps/default/rules.mk | 2 +- keyboards/tada68/keymaps/fakb/rules.mk | 2 +- keyboards/tada68/keymaps/fezzant/rules.mk | 2 +- keyboards/tada68/keymaps/iso-nor/rules.mk | 2 +- keyboards/tada68/keymaps/iso-uk/rules.mk | 2 +- keyboards/tada68/keymaps/isoish/rules.mk | 2 +- keyboards/tada68/keymaps/mattdicarlo/rules.mk | 2 +- keyboards/tada68/keymaps/mlechner/rules.mk | 2 +- keyboards/tada68/keymaps/mtdjr/rules.mk | 2 +- keyboards/tada68/keymaps/pascamel/rules.mk | 2 +- keyboards/tada68/keymaps/raylas/rules.mk | 2 +- keyboards/tada68/keymaps/rbong/rules.mk | 2 +- keyboards/tada68/keymaps/rgb/rules.mk | 2 +- keyboards/tada68/keymaps/rys/rules.mk | 2 +- keyboards/tada68/keymaps/shalzz/rules.mk | 2 +- keyboards/tada68/keymaps/sm0g/rules.mk | 2 +- keyboards/tada68/keymaps/stephengrier/rules.mk | 2 +- keyboards/tada68/keymaps/trashcat/rules.mk | 2 +- keyboards/tada68/keymaps/tshack/rules.mk | 2 +- keyboards/tada68/keymaps/unix/rules.mk | 2 +- keyboards/tada68/keymaps/wamsm_tada/rules.mk | 2 +- keyboards/the_ruler/keymaps/default/rules.mk | 2 +- keyboards/the_ruler/rules.mk | 2 +- keyboards/thevankeyboards/bananasplit/keymaps/0010/rules.mk | 2 +- .../bananasplit/keymaps/coloneljesus/rules.mk | 2 +- .../thevankeyboards/bananasplit/keymaps/default/rules.mk | 2 +- .../thevankeyboards/bananasplit/keymaps/kamon/rules.mk | 2 +- keyboards/thevankeyboards/minivan/keymaps/default/rules.mk | 2 +- keyboards/thevankeyboards/minivan/keymaps/jeebak/rules.mk | 2 +- .../thevankeyboards/minivan/keymaps/jetpacktuxedo/rules.mk | 2 +- keyboards/thevankeyboards/minivan/keymaps/mjt/rules.mk | 2 +- keyboards/thevankeyboards/minivan/keymaps/smt/rules.mk | 2 +- keyboards/thevankeyboards/minivan/keymaps/tong92/rules.mk | 2 +- keyboards/thevankeyboards/minivan/keymaps/xyverz/rules.mk | 2 +- keyboards/thevankeyboards/roadkit/keymaps/default/rules.mk | 2 +- .../thevankeyboards/roadkit/keymaps/flipphone/rules.mk | 2 +- keyboards/thevankeyboards/roadkit/keymaps/khord/rules.mk | 2 +- keyboards/thevankeyboards/roadkit/keymaps/mjt/rules.mk | 2 +- keyboards/thevankeyboards/roadkit/keymaps/singles/rules.mk | 2 +- .../thevankeyboards/roadkit/keymaps/singlesBrent/rules.mk | 2 +- .../roadkit/keymaps/wavebeem-gamepad/rules.mk | 2 +- keyboards/vision_division/keymaps/default/rules.mk | 2 +- keyboards/vitamins_included/rules.mk | 2 +- keyboards/viterbi/rules.mk | 2 +- keyboards/wavelet/rules.mk | 2 +- keyboards/xd60/rules.mk | 2 +- keyboards/xd75/keymaps/fabian/rules.mk | 2 +- keyboards/xd75/keymaps/germanized/rules.mk | 2 +- keyboards/xd75/rules.mk | 2 +- keyboards/zeal60/rules.mk | 2 +- keyboards/zeal65/rules.mk | 3 +-- keyboards/zen/rules.mk | 2 +- layouts/community/ergodox/alphadox/rules.mk | 4 +--- 277 files changed, 280 insertions(+), 293 deletions(-) diff --git a/keyboards/amj40/keymaps/default/rules.mk b/keyboards/amj40/keymaps/default/rules.mk index 034e697bc..41a198224 100644 --- a/keyboards/amj40/keymaps/default/rules.mk +++ b/keyboards/amj40/keymaps/default/rules.mk @@ -1,5 +1,5 @@ # Build Options -# change to "no" to disable the options, or define them in the Makefile in +# change to "no" to disable the options, or define them in the Makefile in # the appropriate keymap folder that will get included automatically # BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/amj40/keymaps/fabian/rules.mk b/keyboards/amj40/keymaps/fabian/rules.mk index a914e4c0c..7e0634e09 100644 --- a/keyboards/amj40/keymaps/fabian/rules.mk +++ b/keyboards/amj40/keymaps/fabian/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/amj40/keymaps/jetpacktuxedo/rules.mk b/keyboards/amj40/keymaps/jetpacktuxedo/rules.mk index d7f3e7605..6ad923668 100644 --- a/keyboards/amj40/keymaps/jetpacktuxedo/rules.mk +++ b/keyboards/amj40/keymaps/jetpacktuxedo/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. It uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/amj40/keymaps/myee/rules.mk b/keyboards/amj40/keymaps/myee/rules.mk index 034e697bc..c35191cef 100644 --- a/keyboards/amj40/keymaps/myee/rules.mk +++ b/keyboards/amj40/keymaps/myee/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/amj60/keymaps/iso_split_rshift/rules.mk b/keyboards/amj60/keymaps/iso_split_rshift/rules.mk index 2969ed8ae..931affcd5 100644 --- a/keyboards/amj60/keymaps/iso_split_rshift/rules.mk +++ b/keyboards/amj60/keymaps/iso_split_rshift/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/atomic/keymaps/pvc/rules.mk b/keyboards/atomic/keymaps/pvc/rules.mk index c7c04485f..8414b40fb 100644 --- a/keyboards/atomic/keymaps/pvc/rules.mk +++ b/keyboards/atomic/keymaps/pvc/rules.mk @@ -9,7 +9,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend \ No newline at end of file diff --git a/keyboards/atomic/rules.mk b/keyboards/atomic/rules.mk index 3bd04a00a..eee6c2530 100644 --- a/keyboards/atomic/rules.mk +++ b/keyboards/atomic/rules.mk @@ -63,7 +63,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/atreus/keymaps/xk/rules.mk b/keyboards/atreus/keymaps/xk/rules.mk index fe431f28a..2e76f9da5 100644 --- a/keyboards/atreus/keymaps/xk/rules.mk +++ b/keyboards/atreus/keymaps/xk/rules.mk @@ -10,7 +10,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = yes # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) ifndef QUANTUM_DIR diff --git a/keyboards/bfo9000/rules.mk b/keyboards/bfo9000/rules.mk index 8a7e56f46..d11f9a54e 100644 --- a/keyboards/bfo9000/rules.mk +++ b/keyboards/bfo9000/rules.mk @@ -63,7 +63,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/bpiphany/frosty_flake/keymaps/QFR_JM/rules.mk b/keyboards/bpiphany/frosty_flake/keymaps/QFR_JM/rules.mk index 0ae0b9646..856481d03 100644 --- a/keyboards/bpiphany/frosty_flake/keymaps/QFR_JM/rules.mk +++ b/keyboards/bpiphany/frosty_flake/keymaps/QFR_JM/rules.mk @@ -13,5 +13,5 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/bpiphany/frosty_flake/keymaps/default/rules.mk b/keyboards/bpiphany/frosty_flake/keymaps/default/rules.mk index 9d3df5964..93f927c7d 100644 --- a/keyboards/bpiphany/frosty_flake/keymaps/default/rules.mk +++ b/keyboards/bpiphany/frosty_flake/keymaps/default/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/bpiphany/frosty_flake/keymaps/nikchi/rules.mk b/keyboards/bpiphany/frosty_flake/keymaps/nikchi/rules.mk index b21eb6404..fc5761c05 100644 --- a/keyboards/bpiphany/frosty_flake/keymaps/nikchi/rules.mk +++ b/keyboards/bpiphany/frosty_flake/keymaps/nikchi/rules.mk @@ -14,7 +14,7 @@ AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode UNICODEMAP_ENABLE = yes # unicodemap BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = yes LEADER_ENABLE = yes diff --git a/keyboards/bpiphany/frosty_flake/keymaps/tkl/rules.mk b/keyboards/bpiphany/frosty_flake/keymaps/tkl/rules.mk index f29756f22..c76a5a80e 100644 --- a/keyboards/bpiphany/frosty_flake/keymaps/tkl/rules.mk +++ b/keyboards/bpiphany/frosty_flake/keymaps/tkl/rules.mk @@ -13,5 +13,5 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/bpiphany/pegasushoof/keymaps/blowrak/rules.mk b/keyboards/bpiphany/pegasushoof/keymaps/blowrak/rules.mk index 168fb625b..7a616ee5f 100644 --- a/keyboards/bpiphany/pegasushoof/keymaps/blowrak/rules.mk +++ b/keyboards/bpiphany/pegasushoof/keymaps/blowrak/rules.mk @@ -14,7 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. ifndef QUANTUM_DIR diff --git a/keyboards/bpiphany/pegasushoof/keymaps/citadel/rules.mk b/keyboards/bpiphany/pegasushoof/keymaps/citadel/rules.mk index 0dd8a79f4..4cec29477 100644 --- a/keyboards/bpiphany/pegasushoof/keymaps/citadel/rules.mk +++ b/keyboards/bpiphany/pegasushoof/keymaps/citadel/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. TAP_DANCE_ENABLE = yes # see https://docs.qmk.fm/#/feature_tap_dance (+1000) diff --git a/keyboards/bpiphany/pegasushoof/keymaps/default/rules.mk b/keyboards/bpiphany/pegasushoof/keymaps/default/rules.mk index 168fb625b..7a616ee5f 100644 --- a/keyboards/bpiphany/pegasushoof/keymaps/default/rules.mk +++ b/keyboards/bpiphany/pegasushoof/keymaps/default/rules.mk @@ -14,7 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. ifndef QUANTUM_DIR diff --git a/keyboards/bpiphany/pegasushoof/rules.mk b/keyboards/bpiphany/pegasushoof/rules.mk index c5a35428c..0cfe115aa 100644 --- a/keyboards/bpiphany/pegasushoof/rules.mk +++ b/keyboards/bpiphany/pegasushoof/rules.mk @@ -60,7 +60,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. CUSTOM_MATRIX = yes diff --git a/keyboards/bpiphany/tiger_lily/keymaps/default/rules.mk b/keyboards/bpiphany/tiger_lily/keymaps/default/rules.mk index 9d3df5964..93f927c7d 100644 --- a/keyboards/bpiphany/tiger_lily/keymaps/default/rules.mk +++ b/keyboards/bpiphany/tiger_lily/keymaps/default/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/bpiphany/tiger_lily/keymaps/default_ansi/rules.mk b/keyboards/bpiphany/tiger_lily/keymaps/default_ansi/rules.mk index 9d3df5964..93f927c7d 100644 --- a/keyboards/bpiphany/tiger_lily/keymaps/default_ansi/rules.mk +++ b/keyboards/bpiphany/tiger_lily/keymaps/default_ansi/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/clueboard/66/keymaps/xyverz/rules.mk b/keyboards/clueboard/66/keymaps/xyverz/rules.mk index 950dadf84..fc02ecb7e 100644 --- a/keyboards/clueboard/66/keymaps/xyverz/rules.mk +++ b/keyboards/clueboard/66/keymaps/xyverz/rules.mk @@ -42,7 +42,7 @@ # change to "no" to disable the options, or define them in the makefile.mk in # the appropriate keymap folder that will get included automatically # -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. ifndef QUANTUM_DIR include ../../../../Makefile diff --git a/keyboards/comet46/keymaps/satt/rules.mk b/keyboards/comet46/keymaps/satt/rules.mk index 08af2e70a..dc4355c78 100644 --- a/keyboards/comet46/keymaps/satt/rules.mk +++ b/keyboards/comet46/keymaps/satt/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. ONEHAND_ENABLE = no # Enable one-hand typing # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/contra/keymaps/losinggeneration/rules.mk b/keyboards/contra/keymaps/losinggeneration/rules.mk index 1728afd85..ea2b7165d 100644 --- a/keyboards/contra/keymaps/losinggeneration/rules.mk +++ b/keyboards/contra/keymaps/losinggeneration/rules.mk @@ -10,7 +10,7 @@ COMMAND_ENABLE = no # Commands for debug and configuration CONSOLE_ENABLE = no # Console for debug(+400) MIDI_ENABLE = no # MIDI controls NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. ifndef QUANTUM_DIR include ../../../../Makefile diff --git a/keyboards/converter/ibm_terminal/keymaps/default/rules.mk b/keyboards/converter/ibm_terminal/keymaps/default/rules.mk index 19eb5972e..76d349920 100644 --- a/keyboards/converter/ibm_terminal/keymaps/default/rules.mk +++ b/keyboards/converter/ibm_terminal/keymaps/default/rules.mk @@ -14,7 +14,7 @@ AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode UNICODEMAP_ENABLE = yes BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. PS2_USE_USART = yes API_SYSEX_ENABLE = no diff --git a/keyboards/converter/ibm_terminal/keymaps/priyadi/rules.mk b/keyboards/converter/ibm_terminal/keymaps/priyadi/rules.mk index 19eb5972e..76d349920 100644 --- a/keyboards/converter/ibm_terminal/keymaps/priyadi/rules.mk +++ b/keyboards/converter/ibm_terminal/keymaps/priyadi/rules.mk @@ -14,7 +14,7 @@ AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode UNICODEMAP_ENABLE = yes BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. PS2_USE_USART = yes API_SYSEX_ENABLE = no diff --git a/keyboards/converter/ibm_terminal/rules.mk b/keyboards/converter/ibm_terminal/rules.mk index 9401cf199..77b3a6f3f 100644 --- a/keyboards/converter/ibm_terminal/rules.mk +++ b/keyboards/converter/ibm_terminal/rules.mk @@ -61,7 +61,7 @@ AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode UNICODEMAP_ENABLE = yes BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. PS2_USE_USART = yes API_SYSEX_ENABLE = n CUSTOM_MATRIX = yes diff --git a/keyboards/converter/sun_usb/rules.mk b/keyboards/converter/sun_usb/rules.mk index 6e36a1905..3cf503b1d 100644 --- a/keyboards/converter/sun_usb/rules.mk +++ b/keyboards/converter/sun_usb/rules.mk @@ -24,7 +24,7 @@ AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode UNICODEMAP_ENABLE = yes BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. CUSTOM_MATRIX = yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/crkbd/keymaps/default/rules.mk b/keyboards/crkbd/keymaps/default/rules.mk index 5ee01e89e..16deaf45d 100644 --- a/keyboards/crkbd/keymaps/default/rules.mk +++ b/keyboards/crkbd/keymaps/default/rules.mk @@ -14,7 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/crkbd/keymaps/drashna/rules.mk b/keyboards/crkbd/keymaps/drashna/rules.mk index 8fca70448..8f69cba72 100644 --- a/keyboards/crkbd/keymaps/drashna/rules.mk +++ b/keyboards/crkbd/keymaps/drashna/rules.mk @@ -14,7 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/crkbd/keymaps/like_jis/rules.mk b/keyboards/crkbd/keymaps/like_jis/rules.mk index 5ee01e89e..16deaf45d 100644 --- a/keyboards/crkbd/keymaps/like_jis/rules.mk +++ b/keyboards/crkbd/keymaps/like_jis/rules.mk @@ -14,7 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/crkbd/rules.mk b/keyboards/crkbd/rules.mk index 6396b115d..426ed0c03 100644 --- a/keyboards/crkbd/rules.mk +++ b/keyboards/crkbd/rules.mk @@ -65,7 +65,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SUBPROJECT_rev1 = no USE_I2C = yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/daisy/rules.mk b/keyboards/daisy/rules.mk index f24df2fd6..8157b168e 100644 --- a/keyboards/daisy/rules.mk +++ b/keyboards/daisy/rules.mk @@ -62,5 +62,5 @@ MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend \ No newline at end of file diff --git a/keyboards/deltasplit75/keymaps/itsaferbie/rules.mk b/keyboards/deltasplit75/keymaps/itsaferbie/rules.mk index bab3b4c56..75db99ebe 100644 --- a/keyboards/deltasplit75/keymaps/itsaferbie/rules.mk +++ b/keyboards/deltasplit75/keymaps/itsaferbie/rules.mk @@ -1,4 +1,4 @@ -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. AUDIO_ENABLE = no # Audio disabled while using RGB underlight. EXTRAKEY_ENABLE = yes diff --git a/keyboards/deltasplit75/rules.mk b/keyboards/deltasplit75/rules.mk index 2a13dbdfc..5c7571b9d 100644 --- a/keyboards/deltasplit75/rules.mk +++ b/keyboards/deltasplit75/rules.mk @@ -41,7 +41,7 @@ F_USB = $(F_CPU) # Bootloader # This definition is optional, and if your keyboard supports multiple bootloaders of -# different sizes, comment this out, and the correct address will be loaded +# different sizes, comment this out, and the correct address will be loaded # automatically (+60). See bootloader.mk for all options. BOOTLOADER = caterina @@ -63,7 +63,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SUBPROJECT_rev1 = yes USE_I2C = yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE @@ -71,4 +71,4 @@ SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend CUSTOM_MATRIX = yes -DEFAULT_FOLDER = deltasplit75/v2 \ No newline at end of file +DEFAULT_FOLDER = deltasplit75/v2 diff --git a/keyboards/diverge3/rules.mk b/keyboards/diverge3/rules.mk index aa7453054..38f3ee4e6 100644 --- a/keyboards/diverge3/rules.mk +++ b/keyboards/diverge3/rules.mk @@ -66,7 +66,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/divergetm2/rules.mk b/keyboards/divergetm2/rules.mk index 2be853a2a..084a3bf63 100644 --- a/keyboards/divergetm2/rules.mk +++ b/keyboards/divergetm2/rules.mk @@ -64,7 +64,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/do60/rules.mk b/keyboards/do60/rules.mk index e7314caf9..8003914fa 100644 --- a/keyboards/do60/rules.mk +++ b/keyboards/do60/rules.mk @@ -59,7 +59,7 @@ EXTRAKEY_ENABLE = yes # Audio control and System control(+450) MIDI_ENABLE = no # MIDI controls MOUSEKEY_ENABLE = yes # Mouse keys(+4700) NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend UNICODE_ENABLE = no # Unicode diff --git a/keyboards/eco/keymaps/default/rules.mk b/keyboards/eco/keymaps/default/rules.mk index 7dab97942..099660232 100644 --- a/keyboards/eco/keymaps/default/rules.mk +++ b/keyboards/eco/keymaps/default/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/eco/keymaps/hexwire/rules.mk b/keyboards/eco/keymaps/hexwire/rules.mk index 7dab97942..099660232 100644 --- a/keyboards/eco/keymaps/hexwire/rules.mk +++ b/keyboards/eco/keymaps/hexwire/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/eco/keymaps/that_canadian/rules.mk b/keyboards/eco/keymaps/that_canadian/rules.mk index 7dab97942..099660232 100644 --- a/keyboards/eco/keymaps/that_canadian/rules.mk +++ b/keyboards/eco/keymaps/that_canadian/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/eco/keymaps/xyverz/rules.mk b/keyboards/eco/keymaps/xyverz/rules.mk index 9a3059e71..9e7b9c202 100644 --- a/keyboards/eco/keymaps/xyverz/rules.mk +++ b/keyboards/eco/keymaps/xyverz/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/ergo42/rules.mk b/keyboards/ergo42/rules.mk index 252411cab..cdc9da908 100644 --- a/keyboards/ergo42/rules.mk +++ b/keyboards/ergo42/rules.mk @@ -67,7 +67,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SUBPROJECT_rev1 = yes USE_I2C = yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/ergodash/rules.mk b/keyboards/ergodash/rules.mk index bf0df4040..e25346dac 100644 --- a/keyboards/ergodash/rules.mk +++ b/keyboards/ergodash/rules.mk @@ -64,7 +64,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SUBPROJECT_rev1 = yes USE_I2C = yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/ergodox_infinity/keymaps/narze/rules.mk b/keyboards/ergodox_infinity/keymaps/narze/rules.mk index 7d2e00d0e..bd89bb9d9 100644 --- a/keyboards/ergodox_infinity/keymaps/narze/rules.mk +++ b/keyboards/ergodox_infinity/keymaps/narze/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/ergoinu/keymaps/default/rules.mk b/keyboards/ergoinu/keymaps/default/rules.mk index 7d7a475d1..92dde90ff 100644 --- a/keyboards/ergoinu/keymaps/default/rules.mk +++ b/keyboards/ergoinu/keymaps/default/rules.mk @@ -14,7 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/ergoinu/keymaps/default_jis/rules.mk b/keyboards/ergoinu/keymaps/default_jis/rules.mk index 7d7a475d1..92dde90ff 100644 --- a/keyboards/ergoinu/keymaps/default_jis/rules.mk +++ b/keyboards/ergoinu/keymaps/default_jis/rules.mk @@ -14,7 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/ergoinu/rules.mk b/keyboards/ergoinu/rules.mk index a00cc16de..de4bcad52 100644 --- a/keyboards/ergoinu/rules.mk +++ b/keyboards/ergoinu/rules.mk @@ -60,7 +60,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SUBPROJECT_rev1 = no USE_I2C = no # i2c is not supported # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/ergotravel/rules.mk b/keyboards/ergotravel/rules.mk index d2da78806..55155b5a3 100644 --- a/keyboards/ergotravel/rules.mk +++ b/keyboards/ergotravel/rules.mk @@ -59,7 +59,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/fortitude60/rules.mk b/keyboards/fortitude60/rules.mk index 7b2557b70..3d1745c6f 100644 --- a/keyboards/fortitude60/rules.mk +++ b/keyboards/fortitude60/rules.mk @@ -62,7 +62,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. USE_SERIAL = yes # Serial support only on fortitude60 # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend diff --git a/keyboards/fourier/rules.mk b/keyboards/fourier/rules.mk index 151339bc9..9ec05e874 100644 --- a/keyboards/fourier/rules.mk +++ b/keyboards/fourier/rules.mk @@ -63,7 +63,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SUBPROJECT_rev1 = yes USE_I2C = yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/gherkin/keymaps/mjt/rules.mk b/keyboards/gherkin/keymaps/mjt/rules.mk index b397f86d0..afb93b674 100644 --- a/keyboards/gherkin/keymaps/mjt/rules.mk +++ b/keyboards/gherkin/keymaps/mjt/rules.mk @@ -20,7 +20,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE=yes diff --git a/keyboards/gonnerd/keymaps/default/rules.mk b/keyboards/gonnerd/keymaps/default/rules.mk index 772d7aee3..e34aba692 100644 --- a/keyboards/gonnerd/keymaps/default/rules.mk +++ b/keyboards/gonnerd/keymaps/default/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/gonnerd/keymaps/gam3cat/rules.mk b/keyboards/gonnerd/keymaps/gam3cat/rules.mk index a32d22e41..a22683842 100644 --- a/keyboards/gonnerd/keymaps/gam3cat/rules.mk +++ b/keyboards/gonnerd/keymaps/gam3cat/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/gonnerd/keymaps/mauin/rules.mk b/keyboards/gonnerd/keymaps/mauin/rules.mk index 772d7aee3..e34aba692 100644 --- a/keyboards/gonnerd/keymaps/mauin/rules.mk +++ b/keyboards/gonnerd/keymaps/mauin/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/gonnerd/keymaps/tkl/rules.mk b/keyboards/gonnerd/keymaps/tkl/rules.mk index 5854366f9..b96663efe 100644 --- a/keyboards/gonnerd/keymaps/tkl/rules.mk +++ b/keyboards/gonnerd/keymaps/tkl/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/hadron/keymaps/default/rules.mk b/keyboards/hadron/keymaps/default/rules.mk index 545ffa75c..4c6d04f1e 100644 --- a/keyboards/hadron/keymaps/default/rules.mk +++ b/keyboards/hadron/keymaps/default/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/hadron/keymaps/side_numpad/rules.mk b/keyboards/hadron/keymaps/side_numpad/rules.mk index d9fabc1ac..687c285bd 100644 --- a/keyboards/hadron/keymaps/side_numpad/rules.mk +++ b/keyboards/hadron/keymaps/side_numpad/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = yes # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/handwired/MS_sculpt_mobile/keymaps/default/rules.mk b/keyboards/handwired/MS_sculpt_mobile/keymaps/default/rules.mk index b3c01678f..3955a3ff4 100644 --- a/keyboards/handwired/MS_sculpt_mobile/keymaps/default/rules.mk +++ b/keyboards/handwired/MS_sculpt_mobile/keymaps/default/rules.mk @@ -13,5 +13,5 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/handwired/MS_sculpt_mobile/keymaps/milestogo/rules.mk b/keyboards/handwired/MS_sculpt_mobile/keymaps/milestogo/rules.mk index 4f62657b3..ddfea8255 100644 --- a/keyboards/handwired/MS_sculpt_mobile/keymaps/milestogo/rules.mk +++ b/keyboards/handwired/MS_sculpt_mobile/keymaps/milestogo/rules.mk @@ -13,5 +13,5 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/handwired/arrow_pad/keymaps/pad_21/rules.mk b/keyboards/handwired/arrow_pad/keymaps/pad_21/rules.mk index af51976a8..d2403c9ec 100644 --- a/keyboards/handwired/arrow_pad/keymaps/pad_21/rules.mk +++ b/keyboards/handwired/arrow_pad/keymaps/pad_21/rules.mk @@ -9,7 +9,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/handwired/arrow_pad/keymaps/pad_24/rules.mk b/keyboards/handwired/arrow_pad/keymaps/pad_24/rules.mk index e31bfe1af..b305f8482 100644 --- a/keyboards/handwired/arrow_pad/keymaps/pad_24/rules.mk +++ b/keyboards/handwired/arrow_pad/keymaps/pad_24/rules.mk @@ -9,7 +9,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/handwired/atreus50/rules.mk b/keyboards/handwired/atreus50/rules.mk index 2e2d48f6a..21c4704e0 100644 --- a/keyboards/handwired/atreus50/rules.mk +++ b/keyboards/handwired/atreus50/rules.mk @@ -63,7 +63,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/handwired/dactyl_manuform/4x5/rules.mk b/keyboards/handwired/dactyl_manuform/4x5/rules.mk index 14b6e1e4e..750807051 100644 --- a/keyboards/handwired/dactyl_manuform/4x5/rules.mk +++ b/keyboards/handwired/dactyl_manuform/4x5/rules.mk @@ -14,8 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend - diff --git a/keyboards/handwired/dactyl_manuform/4x6/rules.mk b/keyboards/handwired/dactyl_manuform/4x6/rules.mk index 14b6e1e4e..750807051 100644 --- a/keyboards/handwired/dactyl_manuform/4x6/rules.mk +++ b/keyboards/handwired/dactyl_manuform/4x6/rules.mk @@ -14,8 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend - diff --git a/keyboards/handwired/dactyl_manuform/5x6/rules.mk b/keyboards/handwired/dactyl_manuform/5x6/rules.mk index 14b6e1e4e..750807051 100644 --- a/keyboards/handwired/dactyl_manuform/5x6/rules.mk +++ b/keyboards/handwired/dactyl_manuform/5x6/rules.mk @@ -14,8 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend - diff --git a/keyboards/handwired/dactyl_manuform/5x7/rules.mk b/keyboards/handwired/dactyl_manuform/5x7/rules.mk index fc9cbcccd..750807051 100644 --- a/keyboards/handwired/dactyl_manuform/5x7/rules.mk +++ b/keyboards/handwired/dactyl_manuform/5x7/rules.mk @@ -14,7 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/handwired/dactyl_manuform/6x6/rules.mk b/keyboards/handwired/dactyl_manuform/6x6/rules.mk index 14b6e1e4e..750807051 100644 --- a/keyboards/handwired/dactyl_manuform/6x6/rules.mk +++ b/keyboards/handwired/dactyl_manuform/6x6/rules.mk @@ -14,8 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend - diff --git a/keyboards/handwired/dactyl_manuform/rules.mk b/keyboards/handwired/dactyl_manuform/rules.mk index adb058c8a..a93de3685 100644 --- a/keyboards/handwired/dactyl_manuform/rules.mk +++ b/keyboards/handwired/dactyl_manuform/rules.mk @@ -58,7 +58,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/handwired/kbod/keymaps/default/rules.mk b/keyboards/handwired/kbod/keymaps/default/rules.mk index eb6bf940a..5b9ff0bfd 100644 --- a/keyboards/handwired/kbod/keymaps/default/rules.mk +++ b/keyboards/handwired/kbod/keymaps/default/rules.mk @@ -13,5 +13,5 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/handwired/minorca/keymaps/default/rules.mk b/keyboards/handwired/minorca/keymaps/default/rules.mk index 0ea7a6935..584798d1a 100644 --- a/keyboards/handwired/minorca/keymaps/default/rules.mk +++ b/keyboards/handwired/minorca/keymaps/default/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/handwired/minorca/keymaps/rgb/rules.mk b/keyboards/handwired/minorca/keymaps/rgb/rules.mk index da44256f9..6e430d59e 100644 --- a/keyboards/handwired/minorca/keymaps/rgb/rules.mk +++ b/keyboards/handwired/minorca/keymaps/rgb/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/handwired/minorca/rules.mk b/keyboards/handwired/minorca/rules.mk index ce502b820..3e408e2b9 100644 --- a/keyboards/handwired/minorca/rules.mk +++ b/keyboards/handwired/minorca/rules.mk @@ -61,7 +61,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend \ No newline at end of file diff --git a/keyboards/handwired/not_so_minidox/rules.mk b/keyboards/handwired/not_so_minidox/rules.mk index fe4cc014e..833dd4b79 100644 --- a/keyboards/handwired/not_so_minidox/rules.mk +++ b/keyboards/handwired/not_so_minidox/rules.mk @@ -63,7 +63,7 @@ MIDI_ENABLE ?= no # MIDI controls AUDIO_ENABLE ?= no # Audio output on port C6 UNICODE_ENABLE ?= no # Unicode BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE ?= no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE ?= no # Enable WS2812 RGB underlight. USE_I2C ?= no # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend diff --git a/keyboards/handwired/pilcrow/keymaps/default/rules.mk b/keyboards/handwired/pilcrow/keymaps/default/rules.mk index b3c01678f..3955a3ff4 100644 --- a/keyboards/handwired/pilcrow/keymaps/default/rules.mk +++ b/keyboards/handwired/pilcrow/keymaps/default/rules.mk @@ -13,5 +13,5 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/handwired/promethium/keymaps/default/rules.mk b/keyboards/handwired/promethium/keymaps/default/rules.mk index a0d4261fa..5761be517 100644 --- a/keyboards/handwired/promethium/keymaps/default/rules.mk +++ b/keyboards/handwired/promethium/keymaps/default/rules.mk @@ -16,7 +16,7 @@ AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode UNICODEMAP_ENABLE = yes BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. PS2_MOUSE_ENABLE = yes PS2_USE_INT = yes FAUXCLICKY_ENABLE = yes diff --git a/keyboards/handwired/promethium/keymaps/priyadi/rules.mk b/keyboards/handwired/promethium/keymaps/priyadi/rules.mk index a0d4261fa..5761be517 100644 --- a/keyboards/handwired/promethium/keymaps/priyadi/rules.mk +++ b/keyboards/handwired/promethium/keymaps/priyadi/rules.mk @@ -16,7 +16,7 @@ AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode UNICODEMAP_ENABLE = yes BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. PS2_MOUSE_ENABLE = yes PS2_USE_INT = yes FAUXCLICKY_ENABLE = yes diff --git a/keyboards/handwired/promethium/rules.mk b/keyboards/handwired/promethium/rules.mk index 69903dceb..21328b7f8 100644 --- a/keyboards/handwired/promethium/rules.mk +++ b/keyboards/handwired/promethium/rules.mk @@ -62,7 +62,7 @@ AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode UNICODEMAP_ENABLE = yes BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. PS2_MOUSE_ENABLE = yes PS2_USE_INT = yes API_SYSEX_ENABLE = no diff --git a/keyboards/handwired/qc60/rules.mk b/keyboards/handwired/qc60/rules.mk index 1be83d5f8..e61b18b00 100644 --- a/keyboards/handwired/qc60/rules.mk +++ b/keyboards/handwired/qc60/rules.mk @@ -58,7 +58,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SPLIT_KEYBOARD = yes diff --git a/keyboards/handwired/terminus_mini/keymaps/default/rules.mk b/keyboards/handwired/terminus_mini/keymaps/default/rules.mk index 1485c0832..42ab51f15 100644 --- a/keyboards/handwired/terminus_mini/keymaps/default/rules.mk +++ b/keyboards/handwired/terminus_mini/keymaps/default/rules.mk @@ -29,6 +29,6 @@ MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = no # Enable Tap Dance diff --git a/keyboards/handwired/terminus_mini/rules.mk b/keyboards/handwired/terminus_mini/rules.mk index d7acbf7d5..9ecba25d8 100644 --- a/keyboards/handwired/terminus_mini/rules.mk +++ b/keyboards/handwired/terminus_mini/rules.mk @@ -63,7 +63,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = no # Enable tap dance diff --git a/keyboards/handwired/woodpad/keymaps/default/rules.mk b/keyboards/handwired/woodpad/keymaps/default/rules.mk index b8879076b..f060db79c 100644 --- a/keyboards/handwired/woodpad/keymaps/default/rules.mk +++ b/keyboards/handwired/woodpad/keymaps/default/rules.mk @@ -29,7 +29,7 @@ MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/handwired/xealous/rules.mk b/keyboards/handwired/xealous/rules.mk index 717895960..eebd11d86 100644 --- a/keyboards/handwired/xealous/rules.mk +++ b/keyboards/handwired/xealous/rules.mk @@ -59,7 +59,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SPLIT_KEYBOARD = yes # Use shared split_common code SUBPROJECT_rev1 = yes diff --git a/keyboards/helix/pico/keymaps/biacco/rules.mk b/keyboards/helix/pico/keymaps/biacco/rules.mk index 4f264fa95..d6b36580e 100644 --- a/keyboards/helix/pico/keymaps/biacco/rules.mk +++ b/keyboards/helix/pico/keymaps/biacco/rules.mk @@ -14,7 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port B5 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing define HELIX_CUSTOMISE_MSG diff --git a/keyboards/helix/pico/keymaps/default/rules.mk b/keyboards/helix/pico/keymaps/default/rules.mk index b1e219537..c5ee8acb2 100644 --- a/keyboards/helix/pico/keymaps/default/rules.mk +++ b/keyboards/helix/pico/keymaps/default/rules.mk @@ -14,7 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port B5 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing define HELIX_CUSTOMISE_MSG diff --git a/keyboards/helix/rev1/keymaps/OLED_sample/rules.mk b/keyboards/helix/rev1/keymaps/OLED_sample/rules.mk index 3f8fd5dc6..c56d6f37e 100644 --- a/keyboards/helix/rev1/keymaps/OLED_sample/rules.mk +++ b/keyboards/helix/rev1/keymaps/OLED_sample/rules.mk @@ -14,7 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/helix/rev2/keymaps/default/rules.mk b/keyboards/helix/rev2/keymaps/default/rules.mk index 14c353d50..3f84b895a 100644 --- a/keyboards/helix/rev2/keymaps/default/rules.mk +++ b/keyboards/helix/rev2/keymaps/default/rules.mk @@ -14,7 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing define HELIX_CUSTOMISE_MSG diff --git a/keyboards/helix/rev2/keymaps/edvorakjp/rules.mk b/keyboards/helix/rev2/keymaps/edvorakjp/rules.mk index 9bd46fabc..4257d004d 100644 --- a/keyboards/helix/rev2/keymaps/edvorakjp/rules.mk +++ b/keyboards/helix/rev2/keymaps/edvorakjp/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing define HELIX_CUSTOMISE_MSG diff --git a/keyboards/helix/rev2/keymaps/five_rows/rules.mk b/keyboards/helix/rev2/keymaps/five_rows/rules.mk index f771c94c9..bd7130cfc 100644 --- a/keyboards/helix/rev2/keymaps/five_rows/rules.mk +++ b/keyboards/helix/rev2/keymaps/five_rows/rules.mk @@ -18,7 +18,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing define HELIX_CUSTOMISE_MSG diff --git a/keyboards/helix/rev2/keymaps/five_rows_jis/rules.mk b/keyboards/helix/rev2/keymaps/five_rows_jis/rules.mk index 14c353d50..3f84b895a 100644 --- a/keyboards/helix/rev2/keymaps/five_rows_jis/rules.mk +++ b/keyboards/helix/rev2/keymaps/five_rows_jis/rules.mk @@ -14,7 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing define HELIX_CUSTOMISE_MSG diff --git a/keyboards/helix/rev2/keymaps/froggy/rules.mk b/keyboards/helix/rev2/keymaps/froggy/rules.mk index e52e4a373..f46017071 100644 --- a/keyboards/helix/rev2/keymaps/froggy/rules.mk +++ b/keyboards/helix/rev2/keymaps/froggy/rules.mk @@ -14,7 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing define HELIX_CUSTOMISE_MSG diff --git a/keyboards/helix/rev2/keymaps/led_test/rules.mk b/keyboards/helix/rev2/keymaps/led_test/rules.mk index f599cd4f3..a9cd251bc 100644 --- a/keyboards/helix/rev2/keymaps/led_test/rules.mk +++ b/keyboards/helix/rev2/keymaps/led_test/rules.mk @@ -14,7 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing define HELIX_CUSTOMISE_MSG diff --git a/keyboards/helix/rev2/keymaps/yshrsmz/rules.mk b/keyboards/helix/rev2/keymaps/yshrsmz/rules.mk index 8331a2e1d..3f390b48f 100644 --- a/keyboards/helix/rev2/keymaps/yshrsmz/rules.mk +++ b/keyboards/helix/rev2/keymaps/yshrsmz/rules.mk @@ -14,7 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing define HELIX_CUSTOMISE_MSG diff --git a/keyboards/helix/rules.mk b/keyboards/helix/rules.mk index 7c1d56527..be234e60e 100644 --- a/keyboards/helix/rules.mk +++ b/keyboards/helix/rules.mk @@ -62,7 +62,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SUBPROJECT_rev1 = no USE_I2C = yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/hhkb/keymaps/cinaeco/rules.mk b/keyboards/hhkb/keymaps/cinaeco/rules.mk index 05b724051..efed95492 100644 --- a/keyboards/hhkb/keymaps/cinaeco/rules.mk +++ b/keyboards/hhkb/keymaps/cinaeco/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/iris/keymaps/edvorakjp/rules.mk b/keyboards/iris/keymaps/edvorakjp/rules.mk index 1c88fbc7b..58d244c38 100644 --- a/keyboards/iris/keymaps/edvorakjp/rules.mk +++ b/keyboards/iris/keymaps/edvorakjp/rules.mk @@ -13,4 +13,4 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. diff --git a/keyboards/iris/rules.mk b/keyboards/iris/rules.mk index 88dd66c18..e93d7dae8 100644 --- a/keyboards/iris/rules.mk +++ b/keyboards/iris/rules.mk @@ -61,7 +61,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/jd45/keymaps/mjt/rules.mk b/keyboards/jd45/keymaps/mjt/rules.mk index 1f4b391d5..a22e71b0d 100644 --- a/keyboards/jd45/keymaps/mjt/rules.mk +++ b/keyboards/jd45/keymaps/mjt/rules.mk @@ -13,5 +13,5 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/jd45/keymaps/mjt6u/rules.mk b/keyboards/jd45/keymaps/mjt6u/rules.mk index f9cec3b84..1df8b9754 100644 --- a/keyboards/jd45/keymaps/mjt6u/rules.mk +++ b/keyboards/jd45/keymaps/mjt6u/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend DEBUG_ENABLE = yes diff --git a/keyboards/kinesis/keymaps/carpalx/rules.mk b/keyboards/kinesis/keymaps/carpalx/rules.mk index 1854d35df..c7753fae0 100644 --- a/keyboards/kinesis/keymaps/carpalx/rules.mk +++ b/keyboards/kinesis/keymaps/carpalx/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/kinesis/keymaps/default/rules.mk b/keyboards/kinesis/keymaps/default/rules.mk index 9d3df5964..93f927c7d 100644 --- a/keyboards/kinesis/keymaps/default/rules.mk +++ b/keyboards/kinesis/keymaps/default/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/kinesis/keymaps/default_pretty/rules.mk b/keyboards/kinesis/keymaps/default_pretty/rules.mk index 9d3df5964..93f927c7d 100644 --- a/keyboards/kinesis/keymaps/default_pretty/rules.mk +++ b/keyboards/kinesis/keymaps/default_pretty/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/kinesis/keymaps/dvorak/rules.mk b/keyboards/kinesis/keymaps/dvorak/rules.mk index 9d3df5964..93f927c7d 100644 --- a/keyboards/kinesis/keymaps/dvorak/rules.mk +++ b/keyboards/kinesis/keymaps/dvorak/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/kinesis/keymaps/insertsnideremarks/rules.mk b/keyboards/kinesis/keymaps/insertsnideremarks/rules.mk index 8e4a8ffad..24b16ba9b 100644 --- a/keyboards/kinesis/keymaps/insertsnideremarks/rules.mk +++ b/keyboards/kinesis/keymaps/insertsnideremarks/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = yes # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = yes # Enable Tap Dancing function diff --git a/keyboards/kinesis/keymaps/milestogo/rules.mk b/keyboards/kinesis/keymaps/milestogo/rules.mk index 9d3df5964..93f927c7d 100644 --- a/keyboards/kinesis/keymaps/milestogo/rules.mk +++ b/keyboards/kinesis/keymaps/milestogo/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/kinesis/keymaps/xyverz/rules.mk b/keyboards/kinesis/keymaps/xyverz/rules.mk index c21f8aea6..94dc4cdfe 100644 --- a/keyboards/kinesis/keymaps/xyverz/rules.mk +++ b/keyboards/kinesis/keymaps/xyverz/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/launchpad/keymaps/default/rules.mk b/keyboards/launchpad/keymaps/default/rules.mk index 260b9d8fa..9bf35a59d 100644 --- a/keyboards/launchpad/keymaps/default/rules.mk +++ b/keyboards/launchpad/keymaps/default/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/lets_split/keymaps/OLED_sample/rules.mk b/keyboards/lets_split/keymaps/OLED_sample/rules.mk index 874d09eab..a14e84d4e 100644 --- a/keyboards/lets_split/keymaps/OLED_sample/rules.mk +++ b/keyboards/lets_split/keymaps/OLED_sample/rules.mk @@ -14,7 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/lets_split/keymaps/heartrobotninja/rules.mk b/keyboards/lets_split/keymaps/heartrobotninja/rules.mk index 2261a848a..36f5e5b6d 100644 --- a/keyboards/lets_split/keymaps/heartrobotninja/rules.mk +++ b/keyboards/lets_split/keymaps/heartrobotninja/rules.mk @@ -14,7 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE @@ -23,4 +23,3 @@ SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR include ../../../../Makefile endif - diff --git a/keyboards/lets_split/keymaps/mjt/rules.mk b/keyboards/lets_split/keymaps/mjt/rules.mk index 874d09eab..a14e84d4e 100644 --- a/keyboards/lets_split/keymaps/mjt/rules.mk +++ b/keyboards/lets_split/keymaps/mjt/rules.mk @@ -14,7 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/lets_split/keymaps/piemod/rules.mk b/keyboards/lets_split/keymaps/piemod/rules.mk index 027ea977e..e2bb583cd 100644 --- a/keyboards/lets_split/keymaps/piemod/rules.mk +++ b/keyboards/lets_split/keymaps/piemod/rules.mk @@ -9,5 +9,5 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = yes # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SUBPROJECT_rev1 = no diff --git a/keyboards/lets_split/keymaps/xk/rules.mk b/keyboards/lets_split/keymaps/xk/rules.mk index 84bf8e1f5..195f01577 100644 --- a/keyboards/lets_split/keymaps/xk/rules.mk +++ b/keyboards/lets_split/keymaps/xk/rules.mk @@ -11,7 +11,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = yes # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) ifndef QUANTUM_DIR diff --git a/keyboards/lets_split/rules.mk b/keyboards/lets_split/rules.mk index 951723edc..4cd972786 100644 --- a/keyboards/lets_split/rules.mk +++ b/keyboards/lets_split/rules.mk @@ -64,7 +64,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SUBPROJECT_rev1 = yes USE_I2C = yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/levinson/keymaps/losinggeneration/rules.mk b/keyboards/levinson/keymaps/losinggeneration/rules.mk index f3e47b4c2..c8eef2cb3 100644 --- a/keyboards/levinson/keymaps/losinggeneration/rules.mk +++ b/keyboards/levinson/keymaps/losinggeneration/rules.mk @@ -10,7 +10,7 @@ COMMAND_ENABLE = no # Commands for debug and configuration CONSOLE_ENABLE = no # Console for debug(+400) MIDI_ENABLE = no # MIDI controls NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. ifndef QUANTUM_DIR include ../../../../Makefile diff --git a/keyboards/levinson/rules.mk b/keyboards/levinson/rules.mk index 4805ed99e..8f1fa130f 100644 --- a/keyboards/levinson/rules.mk +++ b/keyboards/levinson/rules.mk @@ -22,7 +22,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/lfkeyboards/lfk78/keymaps/default/rules.mk b/keyboards/lfkeyboards/lfk78/keymaps/default/rules.mk index 20030f17d..555ad9723 100644 --- a/keyboards/lfkeyboards/lfk78/keymaps/default/rules.mk +++ b/keyboards/lfkeyboards/lfk78/keymaps/default/rules.mk @@ -14,7 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. RGBLIGHT_CUSTOM_DRIVER = yes # RGB code is implemented in lefkeyboards, not qmk base SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = no diff --git a/keyboards/lfkeyboards/lfk78/keymaps/iso/rules.mk b/keyboards/lfkeyboards/lfk78/keymaps/iso/rules.mk index ab20ac0db..147e95bc8 100644 --- a/keyboards/lfkeyboards/lfk78/keymaps/iso/rules.mk +++ b/keyboards/lfkeyboards/lfk78/keymaps/iso/rules.mk @@ -14,7 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. RGBLIGHT_CUSTOM_DRIVER = yes # RGB code is implemented in lefkeyboards, not qmk base SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = no diff --git a/keyboards/lfkeyboards/lfk78/keymaps/split_bs_osx/rules.mk b/keyboards/lfkeyboards/lfk78/keymaps/split_bs_osx/rules.mk index 20030f17d..555ad9723 100644 --- a/keyboards/lfkeyboards/lfk78/keymaps/split_bs_osx/rules.mk +++ b/keyboards/lfkeyboards/lfk78/keymaps/split_bs_osx/rules.mk @@ -14,7 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. RGBLIGHT_CUSTOM_DRIVER = yes # RGB code is implemented in lefkeyboards, not qmk base SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = no diff --git a/keyboards/lfkeyboards/lfkpad/keymaps/default/rules.mk b/keyboards/lfkeyboards/lfkpad/keymaps/default/rules.mk index d2ddd1578..1653f4e30 100644 --- a/keyboards/lfkeyboards/lfkpad/keymaps/default/rules.mk +++ b/keyboards/lfkeyboards/lfkpad/keymaps/default/rules.mk @@ -14,7 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. RGBLIGHT_CUSTOM_DRIVER = yes # RGB code is implemented in lefkeyboards, not qmk base SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = no diff --git a/keyboards/lily58/rules.mk b/keyboards/lily58/rules.mk index 72964fca1..ad8ad585e 100644 --- a/keyboards/lily58/rules.mk +++ b/keyboards/lily58/rules.mk @@ -63,7 +63,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SUBPROJECT_rev1 = no USE_I2C = no # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/meira/rules.mk b/keyboards/meira/rules.mk index d3e45fc8d..6c2472f43 100644 --- a/keyboards/meira/rules.mk +++ b/keyboards/meira/rules.mk @@ -59,7 +59,7 @@ MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID AUDIO_ENABLE = no # Audio output on port C6 -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches BACKLIGHT_CUSTOM_DRIVER = yes BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality, also set ISSI_ENABLE below for Miera diff --git a/keyboards/minidox/keymaps/alairock/rules.mk b/keyboards/minidox/keymaps/alairock/rules.mk index cd7ab91c2..ebada165a 100644 --- a/keyboards/minidox/keymaps/alairock/rules.mk +++ b/keyboards/minidox/keymaps/alairock/rules.mk @@ -1,2 +1,2 @@ -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. EXTRAKEY_ENABLE = yes diff --git a/keyboards/minidox/keymaps/that_canadian/rules.mk b/keyboards/minidox/keymaps/that_canadian/rules.mk index 52ef1ad3e..7637dfc09 100644 --- a/keyboards/minidox/keymaps/that_canadian/rules.mk +++ b/keyboards/minidox/keymaps/that_canadian/rules.mk @@ -1,4 +1,4 @@ -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. ifndef QUANTUM_DIR include ../../../../Makefile diff --git a/keyboards/minidox/keymaps/xyverz/rules.mk b/keyboards/minidox/keymaps/xyverz/rules.mk index d34df5b19..c777cb1b9 100644 --- a/keyboards/minidox/keymaps/xyverz/rules.mk +++ b/keyboards/minidox/keymaps/xyverz/rules.mk @@ -1 +1 @@ -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. diff --git a/keyboards/minidox/rules.mk b/keyboards/minidox/rules.mk index 0c3a03bd7..861976e15 100644 --- a/keyboards/minidox/rules.mk +++ b/keyboards/minidox/rules.mk @@ -63,7 +63,7 @@ MIDI_ENABLE ?= no # MIDI controls AUDIO_ENABLE ?= no # Audio output on port C6 UNICODE_ENABLE ?= no # Unicode BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE ?= no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE ?= no # Enable WS2812 RGB underlight. USE_I2C ?= no # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend diff --git a/keyboards/mint60/rules.mk b/keyboards/mint60/rules.mk index b4d4bddd3..b4472153b 100644 --- a/keyboards/mint60/rules.mk +++ b/keyboards/mint60/rules.mk @@ -75,4 +75,4 @@ HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) CUSTOM_MATRIX = yes USE_I2C = yes -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. diff --git a/keyboards/miuni32/keymaps/adam-lee/rules.mk b/keyboards/miuni32/keymaps/adam-lee/rules.mk index 88a3aea74..3138ab57f 100644 --- a/keyboards/miuni32/keymaps/adam-lee/rules.mk +++ b/keyboards/miuni32/keymaps/adam-lee/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/miuni32/keymaps/default/rules.mk b/keyboards/miuni32/keymaps/default/rules.mk index 88a3aea74..3138ab57f 100644 --- a/keyboards/miuni32/keymaps/default/rules.mk +++ b/keyboards/miuni32/keymaps/default/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/miuni32/keymaps/ht_156/rules.mk b/keyboards/miuni32/keymaps/ht_156/rules.mk index 88a3aea74..3138ab57f 100644 --- a/keyboards/miuni32/keymaps/ht_156/rules.mk +++ b/keyboards/miuni32/keymaps/ht_156/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/miuni32/keymaps/ki/rules.mk b/keyboards/miuni32/keymaps/ki/rules.mk index 8a72a6e4e..7639c2b3f 100644 --- a/keyboards/miuni32/keymaps/ki/rules.mk +++ b/keyboards/miuni32/keymaps/ki/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/mt40/rules.mk b/keyboards/mt40/rules.mk index 64e7413f5..db6ec93f5 100644 --- a/keyboards/mt40/rules.mk +++ b/keyboards/mt40/rules.mk @@ -27,7 +27,7 @@ MIDI_ENABLE ?= no # MIDI controls AUDIO_ENABLE ?= no # Audio output on port C6 UNICODE_ENABLE ?= no # Unicode BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE ?= yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE ?= yes # Enable WS2812 RGB underlight. RGBLIGHT_CUSTOM_DRIVER = yes TAP_DANCE_ENABLE = no diff --git a/keyboards/niu_mini/keymaps/spacebarracecar/rules.mk b/keyboards/niu_mini/keymaps/spacebarracecar/rules.mk index b1d7055da..124de79de 100644 --- a/keyboards/niu_mini/keymaps/spacebarracecar/rules.mk +++ b/keyboards/niu_mini/keymaps/spacebarracecar/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/nyquist/keymaps/DivergeJM/rules.mk b/keyboards/nyquist/keymaps/DivergeJM/rules.mk index 654e82a10..2c26b47ea 100644 --- a/keyboards/nyquist/keymaps/DivergeJM/rules.mk +++ b/keyboards/nyquist/keymaps/DivergeJM/rules.mk @@ -29,6 +29,6 @@ MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = no # Enable Tap Dance diff --git a/keyboards/nyquist/keymaps/danielhklein/rules.mk b/keyboards/nyquist/keymaps/danielhklein/rules.mk index 0b540a471..12ad2fec5 100644 --- a/keyboards/nyquist/keymaps/danielhklein/rules.mk +++ b/keyboards/nyquist/keymaps/danielhklein/rules.mk @@ -29,6 +29,6 @@ MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = no # Enable Tap Dance diff --git a/keyboards/nyquist/keymaps/losinggeneration/rules.mk b/keyboards/nyquist/keymaps/losinggeneration/rules.mk index 1728afd85..ea2b7165d 100644 --- a/keyboards/nyquist/keymaps/losinggeneration/rules.mk +++ b/keyboards/nyquist/keymaps/losinggeneration/rules.mk @@ -10,7 +10,7 @@ COMMAND_ENABLE = no # Commands for debug and configuration CONSOLE_ENABLE = no # Console for debug(+400) MIDI_ENABLE = no # MIDI controls NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. ifndef QUANTUM_DIR include ../../../../Makefile diff --git a/keyboards/nyquist/rules.mk b/keyboards/nyquist/rules.mk index e8f184041..74d5625f8 100644 --- a/keyboards/nyquist/rules.mk +++ b/keyboards/nyquist/rules.mk @@ -64,7 +64,7 @@ AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID USE_I2C = yes -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/org60/rules.mk b/keyboards/org60/rules.mk index c79e6e270..53e9a28fe 100644 --- a/keyboards/org60/rules.mk +++ b/keyboards/org60/rules.mk @@ -59,7 +59,7 @@ EXTRAKEY_ENABLE = yes # Audio control and System control(+450) MIDI_ENABLE = no # MIDI controls MOUSEKEY_ENABLE = yes # Mouse keys(+4700) NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend UNICODE_ENABLE = no # Unicode diff --git a/keyboards/orthodox/rules.mk b/keyboards/orthodox/rules.mk index 7132a915b..715f25c3a 100644 --- a/keyboards/orthodox/rules.mk +++ b/keyboards/orthodox/rules.mk @@ -61,7 +61,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SUBPROJECT_rev1 = yes USE_I2C = yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/planck/keymaps/ab/rules.mk b/keyboards/planck/keymaps/ab/rules.mk index 44a030ba3..0b025a231 100644 --- a/keyboards/planck/keymaps/ab/rules.mk +++ b/keyboards/planck/keymaps/ab/rules.mk @@ -53,7 +53,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/planck/keymaps/alexey/rules.mk b/keyboards/planck/keymaps/alexey/rules.mk index 581e08cd0..caff043c5 100644 --- a/keyboards/planck/keymaps/alexey/rules.mk +++ b/keyboards/planck/keymaps/alexey/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/planck/keymaps/angerthosenear/rules.mk b/keyboards/planck/keymaps/angerthosenear/rules.mk index 581e08cd0..caff043c5 100644 --- a/keyboards/planck/keymaps/angerthosenear/rules.mk +++ b/keyboards/planck/keymaps/angerthosenear/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/planck/keymaps/austin/rules.mk b/keyboards/planck/keymaps/austin/rules.mk index 581e08cd0..caff043c5 100644 --- a/keyboards/planck/keymaps/austin/rules.mk +++ b/keyboards/planck/keymaps/austin/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/planck/keymaps/basic/rules.mk b/keyboards/planck/keymaps/basic/rules.mk index 0c0632da0..6f88a28d5 100644 --- a/keyboards/planck/keymaps/basic/rules.mk +++ b/keyboards/planck/keymaps/basic/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/planck/keymaps/bone2planck/rules.mk b/keyboards/planck/keymaps/bone2planck/rules.mk index 39635192e..699726948 100644 --- a/keyboards/planck/keymaps/bone2planck/rules.mk +++ b/keyboards/planck/keymaps/bone2planck/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/planck/keymaps/callum/rules.mk b/keyboards/planck/keymaps/callum/rules.mk index 8ee9a45ab..67fe8d284 100644 --- a/keyboards/planck/keymaps/callum/rules.mk +++ b/keyboards/planck/keymaps/callum/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/planck/keymaps/cbbrowne/rules.mk b/keyboards/planck/keymaps/cbbrowne/rules.mk index d5026e2d9..c7cef55a9 100644 --- a/keyboards/planck/keymaps/cbbrowne/rules.mk +++ b/keyboards/planck/keymaps/cbbrowne/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. API_SYSEX_ENABLE = no # Enable SYSEX API (+5390) # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/planck/keymaps/chance/rules.mk b/keyboards/planck/keymaps/chance/rules.mk index 00d09e974..5c9798a57 100644 --- a/keyboards/planck/keymaps/chance/rules.mk +++ b/keyboards/planck/keymaps/chance/rules.mk @@ -1,4 +1,4 @@ -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. AUDIO_ENABLE = no ifndef QUANTUM_DIR diff --git a/keyboards/planck/keymaps/charlie/rules.mk b/keyboards/planck/keymaps/charlie/rules.mk index 581e08cd0..caff043c5 100644 --- a/keyboards/planck/keymaps/charlie/rules.mk +++ b/keyboards/planck/keymaps/charlie/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/planck/keymaps/circuit/rules.mk b/keyboards/planck/keymaps/circuit/rules.mk index 1ed0ff956..e9a02e31e 100644 --- a/keyboards/planck/keymaps/circuit/rules.mk +++ b/keyboards/planck/keymaps/circuit/rules.mk @@ -14,7 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. TAP_DANCE_ENABLE = yes # Enables the double-tap functionality of keys # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/planck/keymaps/daniel/rules.mk b/keyboards/planck/keymaps/daniel/rules.mk index 581e08cd0..caff043c5 100644 --- a/keyboards/planck/keymaps/daniel/rules.mk +++ b/keyboards/planck/keymaps/daniel/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/planck/keymaps/danielhklein/rules.mk b/keyboards/planck/keymaps/danielhklein/rules.mk index a73d85183..72386fae7 100644 --- a/keyboards/planck/keymaps/danielhklein/rules.mk +++ b/keyboards/planck/keymaps/danielhklein/rules.mk @@ -9,6 +9,6 @@ MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = no # Enable Tap Dance \ No newline at end of file diff --git a/keyboards/planck/keymaps/david/rules.mk b/keyboards/planck/keymaps/david/rules.mk index 581e08cd0..caff043c5 100644 --- a/keyboards/planck/keymaps/david/rules.mk +++ b/keyboards/planck/keymaps/david/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/planck/keymaps/dc/rules.mk b/keyboards/planck/keymaps/dc/rules.mk index 6106b40e1..ea4341b4f 100644 --- a/keyboards/planck/keymaps/dc/rules.mk +++ b/keyboards/planck/keymaps/dc/rules.mk @@ -17,7 +17,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. TAP_DANCE_ENABLE = yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/planck/keymaps/dlaroe/rules.mk b/keyboards/planck/keymaps/dlaroe/rules.mk index 22a08c668..0064f622b 100644 --- a/keyboards/planck/keymaps/dlaroe/rules.mk +++ b/keyboards/planck/keymaps/dlaroe/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/planck/keymaps/dr_notsokind/rules.mk b/keyboards/planck/keymaps/dr_notsokind/rules.mk index 7f691ebe4..eea90f8e6 100644 --- a/keyboards/planck/keymaps/dr_notsokind/rules.mk +++ b/keyboards/planck/keymaps/dr_notsokind/rules.mk @@ -14,7 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. TAP_DANCE_ENABLE = yes # Enables the double-tap functionality of keys # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/planck/keymaps/dzobert/rules.mk b/keyboards/planck/keymaps/dzobert/rules.mk index 581e08cd0..caff043c5 100644 --- a/keyboards/planck/keymaps/dzobert/rules.mk +++ b/keyboards/planck/keymaps/dzobert/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/planck/keymaps/espynn/rules.mk b/keyboards/planck/keymaps/espynn/rules.mk index 44a030ba3..0b025a231 100644 --- a/keyboards/planck/keymaps/espynn/rules.mk +++ b/keyboards/planck/keymaps/espynn/rules.mk @@ -53,7 +53,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/planck/keymaps/experimental/rules.mk b/keyboards/planck/keymaps/experimental/rules.mk index 168d3cb9f..721e887b9 100644 --- a/keyboards/planck/keymaps/experimental/rules.mk +++ b/keyboards/planck/keymaps/experimental/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = yes # Enable one-hand typing STENO_ENABLE = yes # Enable TX Bolt protocol for Stenography, requires VIRTSER and may not work with mouse keys LEADER_ENABLE = yes diff --git a/keyboards/planck/keymaps/gabriel/rules.mk b/keyboards/planck/keymaps/gabriel/rules.mk index 581e08cd0..caff043c5 100644 --- a/keyboards/planck/keymaps/gabriel/rules.mk +++ b/keyboards/planck/keymaps/gabriel/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/planck/keymaps/gunp/rules.mk b/keyboards/planck/keymaps/gunp/rules.mk index 1ad30423b..7d03482ab 100644 --- a/keyboards/planck/keymaps/gunp/rules.mk +++ b/keyboards/planck/keymaps/gunp/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = yes # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/planck/keymaps/impossible/rules.mk b/keyboards/planck/keymaps/impossible/rules.mk index 247a1fd2a..1e877943d 100644 --- a/keyboards/planck/keymaps/impossible/rules.mk +++ b/keyboards/planck/keymaps/impossible/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend \ No newline at end of file diff --git a/keyboards/planck/keymaps/jacob/rules.mk b/keyboards/planck/keymaps/jacob/rules.mk index 581e08cd0..caff043c5 100644 --- a/keyboards/planck/keymaps/jacob/rules.mk +++ b/keyboards/planck/keymaps/jacob/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/planck/keymaps/jeebak/rules.mk b/keyboards/planck/keymaps/jeebak/rules.mk index 247a1fd2a..1e877943d 100644 --- a/keyboards/planck/keymaps/jeebak/rules.mk +++ b/keyboards/planck/keymaps/jeebak/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend \ No newline at end of file diff --git a/keyboards/planck/keymaps/jhenahan/rules.mk b/keyboards/planck/keymaps/jhenahan/rules.mk index bb12dd865..f8d1f0d8f 100644 --- a/keyboards/planck/keymaps/jhenahan/rules.mk +++ b/keyboards/planck/keymaps/jhenahan/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend \ No newline at end of file diff --git a/keyboards/planck/keymaps/joe/rules.mk b/keyboards/planck/keymaps/joe/rules.mk index 247a1fd2a..1e877943d 100644 --- a/keyboards/planck/keymaps/joe/rules.mk +++ b/keyboards/planck/keymaps/joe/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend \ No newline at end of file diff --git a/keyboards/planck/keymaps/johannes/rules.mk b/keyboards/planck/keymaps/johannes/rules.mk index 0c0632da0..6f88a28d5 100644 --- a/keyboards/planck/keymaps/johannes/rules.mk +++ b/keyboards/planck/keymaps/johannes/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/planck/keymaps/kyle/rules.mk b/keyboards/planck/keymaps/kyle/rules.mk index 581e08cd0..caff043c5 100644 --- a/keyboards/planck/keymaps/kyle/rules.mk +++ b/keyboards/planck/keymaps/kyle/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/planck/keymaps/lae3/rules.mk b/keyboards/planck/keymaps/lae3/rules.mk index 595803e32..89b147f81 100644 --- a/keyboards/planck/keymaps/lae3/rules.mk +++ b/keyboards/planck/keymaps/lae3/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/planck/keymaps/leo/rules.mk b/keyboards/planck/keymaps/leo/rules.mk index 247a1fd2a..1e877943d 100644 --- a/keyboards/planck/keymaps/leo/rules.mk +++ b/keyboards/planck/keymaps/leo/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend \ No newline at end of file diff --git a/keyboards/planck/keymaps/lucas/rules.mk b/keyboards/planck/keymaps/lucas/rules.mk index 247a1fd2a..1e877943d 100644 --- a/keyboards/planck/keymaps/lucas/rules.mk +++ b/keyboards/planck/keymaps/lucas/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend \ No newline at end of file diff --git a/keyboards/planck/keymaps/lukas/rules.mk b/keyboards/planck/keymaps/lukas/rules.mk index 581e08cd0..caff043c5 100644 --- a/keyboards/planck/keymaps/lukas/rules.mk +++ b/keyboards/planck/keymaps/lukas/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/planck/keymaps/luke/rules.mk b/keyboards/planck/keymaps/luke/rules.mk index 847686873..76ed281c1 100644 --- a/keyboards/planck/keymaps/luke/rules.mk +++ b/keyboards/planck/keymaps/luke/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = yes # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/planck/keymaps/max/rules.mk b/keyboards/planck/keymaps/max/rules.mk index 581e08cd0..caff043c5 100644 --- a/keyboards/planck/keymaps/max/rules.mk +++ b/keyboards/planck/keymaps/max/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/planck/keymaps/mollat/rules.mk b/keyboards/planck/keymaps/mollat/rules.mk index be3f69280..249f422a5 100644 --- a/keyboards/planck/keymaps/mollat/rules.mk +++ b/keyboards/planck/keymaps/mollat/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/planck/keymaps/myoung34/rules.mk b/keyboards/planck/keymaps/myoung34/rules.mk index c47418104..b1aaafd3a 100644 --- a/keyboards/planck/keymaps/myoung34/rules.mk +++ b/keyboards/planck/keymaps/myoung34/rules.mk @@ -7,5 +7,5 @@ CONSOLE_ENABLE = no # Console for debug(+400) MIDI_ENABLE = no # MIDI controls MOUSEKEY_ENABLE = no # Mouse keys(+4700) NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. BACKLIGHT_ENABLE = yes diff --git a/keyboards/planck/keymaps/narze/rules.mk b/keyboards/planck/keymaps/narze/rules.mk index 05c2ce455..286a2ffdc 100644 --- a/keyboards/planck/keymaps/narze/rules.mk +++ b/keyboards/planck/keymaps/narze/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/planck/keymaps/neo2planck/rules.mk b/keyboards/planck/keymaps/neo2planck/rules.mk index 2122dd349..cedf3095e 100644 --- a/keyboards/planck/keymaps/neo2planck/rules.mk +++ b/keyboards/planck/keymaps/neo2planck/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/planck/keymaps/nico/rules.mk b/keyboards/planck/keymaps/nico/rules.mk index 247a1fd2a..1e877943d 100644 --- a/keyboards/planck/keymaps/nico/rules.mk +++ b/keyboards/planck/keymaps/nico/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend \ No newline at end of file diff --git a/keyboards/planck/keymaps/not-quite-neo/rules.mk b/keyboards/planck/keymaps/not-quite-neo/rules.mk index 316a3ea7b..90e6353f6 100644 --- a/keyboards/planck/keymaps/not-quite-neo/rules.mk +++ b/keyboards/planck/keymaps/not-quite-neo/rules.mk @@ -20,7 +20,7 @@ AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode (can't be used with unicodemap) UNICODEMAP_ENABLE = no # Enable extended unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/planck/keymaps/pickle_jr/rules.mk b/keyboards/planck/keymaps/pickle_jr/rules.mk index d452c706d..43e0b843f 100644 --- a/keyboards/planck/keymaps/pickle_jr/rules.mk +++ b/keyboards/planck/keymaps/pickle_jr/rules.mk @@ -12,7 +12,7 @@ BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend \ No newline at end of file diff --git a/keyboards/planck/keymaps/premek/rules.mk b/keyboards/planck/keymaps/premek/rules.mk index 247a1fd2a..1e877943d 100644 --- a/keyboards/planck/keymaps/premek/rules.mk +++ b/keyboards/planck/keymaps/premek/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend \ No newline at end of file diff --git a/keyboards/planck/keymaps/priyadi/rules.mk b/keyboards/planck/keymaps/priyadi/rules.mk index 27c2638e2..282c047ee 100644 --- a/keyboards/planck/keymaps/priyadi/rules.mk +++ b/keyboards/planck/keymaps/priyadi/rules.mk @@ -14,7 +14,7 @@ AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode UNICODEMAP_ENABLE = yes # Unicode map BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. API_SYSEX_ENABLE = no FAUXCLICKY_ENABLE = yes diff --git a/keyboards/planck/keymaps/pvc/rules.mk b/keyboards/planck/keymaps/pvc/rules.mk index 8a73eab58..3fb98eca8 100644 --- a/keyboards/planck/keymaps/pvc/rules.mk +++ b/keyboards/planck/keymaps/pvc/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend \ No newline at end of file diff --git a/keyboards/planck/keymaps/rai-suta/rules.mk b/keyboards/planck/keymaps/rai-suta/rules.mk index 38efe374c..ce13befd9 100644 --- a/keyboards/planck/keymaps/rai-suta/rules.mk +++ b/keyboards/planck/keymaps/rai-suta/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/planck/keymaps/sgoodwin/rules.mk b/keyboards/planck/keymaps/sgoodwin/rules.mk index 279e16eb7..cdcb4a887 100644 --- a/keyboards/planck/keymaps/sgoodwin/rules.mk +++ b/keyboards/planck/keymaps/sgoodwin/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. API_SYSEX_ENABLE = no # Disable extra stuff for ergodoxen # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/planck/keymaps/spacebarracecar/rules.mk b/keyboards/planck/keymaps/spacebarracecar/rules.mk index fbdd1217c..bc817a140 100644 --- a/keyboards/planck/keymaps/spacebarracecar/rules.mk +++ b/keyboards/planck/keymaps/spacebarracecar/rules.mk @@ -13,11 +13,10 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend # Userspace defines GERMAN_ENABLE = yes # Enable Custom US Ansi Keycodes for PC with German set as input language - diff --git a/keyboards/planck/keymaps/tak3over/rules.mk b/keyboards/planck/keymaps/tak3over/rules.mk index 247a1fd2a..1e877943d 100644 --- a/keyboards/planck/keymaps/tak3over/rules.mk +++ b/keyboards/planck/keymaps/tak3over/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend \ No newline at end of file diff --git a/keyboards/planck/keymaps/thermal_printer/rules.mk b/keyboards/planck/keymaps/thermal_printer/rules.mk index 7c50d87a0..3c0e340d1 100644 --- a/keyboards/planck/keymaps/thermal_printer/rules.mk +++ b/keyboards/planck/keymaps/thermal_printer/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. PRINTING_ENABLE = yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/planck/keymaps/tong92/rules.mk b/keyboards/planck/keymaps/tong92/rules.mk index e6608e74c..df9e7918c 100644 --- a/keyboards/planck/keymaps/tong92/rules.mk +++ b/keyboards/planck/keymaps/tong92/rules.mk @@ -52,7 +52,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/planck/keymaps/vifon/rules.mk b/keyboards/planck/keymaps/vifon/rules.mk index da83096d6..5caec1afa 100644 --- a/keyboards/planck/keymaps/vifon/rules.mk +++ b/keyboards/planck/keymaps/vifon/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. API_SYSEX_ENABLE = no # https://www.reddit.com/r/olkb/comments/5swhij/_/ddie6zq/ KEY_LOCK_ENABLE = yes diff --git a/keyboards/planck/keymaps/yale/rules.mk b/keyboards/planck/keymaps/yale/rules.mk index 581e08cd0..caff043c5 100644 --- a/keyboards/planck/keymaps/yale/rules.mk +++ b/keyboards/planck/keymaps/yale/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/planck/keymaps/yang/rules.mk b/keyboards/planck/keymaps/yang/rules.mk index 6b18762fa..173fe2989 100644 --- a/keyboards/planck/keymaps/yang/rules.mk +++ b/keyboards/planck/keymaps/yang/rules.mk @@ -2,7 +2,7 @@ # change to "no" to disable the options, or define them in the Makefile in # the appropriate keymap folder that will get included automatically # -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. AUDIO_ENABLE = no ifndef QUANTUM_DIR diff --git a/keyboards/planck/keymaps/zach/rules.mk b/keyboards/planck/keymaps/zach/rules.mk index 9d86fc81f..ca24b4792 100644 --- a/keyboards/planck/keymaps/zach/rules.mk +++ b/keyboards/planck/keymaps/zach/rules.mk @@ -20,7 +20,7 @@ AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode (can't be used with unicodemap) UNICODEMAP_ENABLE = yes # Enable extended unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/planck/keymaps/zrichard/rules.mk b/keyboards/planck/keymaps/zrichard/rules.mk index 0b87bc988..7b17f58ce 100755 --- a/keyboards/planck/keymaps/zrichard/rules.mk +++ b/keyboards/planck/keymaps/zrichard/rules.mk @@ -20,7 +20,7 @@ MIDI_ENABLE = yes # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. TAP_DANCE_ENABLE = no # Enable double or n tap macros # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/preonic/keymaps/bucktooth/rules.mk b/keyboards/preonic/keymaps/bucktooth/rules.mk index 3e87d41d3..9dbdfcbd3 100644 --- a/keyboards/preonic/keymaps/bucktooth/rules.mk +++ b/keyboards/preonic/keymaps/bucktooth/rules.mk @@ -11,7 +11,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/preonic/keymaps/dlaroe/rules.mk b/keyboards/preonic/keymaps/dlaroe/rules.mk index b35624471..eea316849 100644 --- a/keyboards/preonic/keymaps/dlaroe/rules.mk +++ b/keyboards/preonic/keymaps/dlaroe/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/preonic/keymaps/jacwib/rules.mk b/keyboards/preonic/keymaps/jacwib/rules.mk index 3e87d41d3..9dbdfcbd3 100644 --- a/keyboards/preonic/keymaps/jacwib/rules.mk +++ b/keyboards/preonic/keymaps/jacwib/rules.mk @@ -11,7 +11,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/preonic/keymaps/kinesis/rules.mk b/keyboards/preonic/keymaps/kinesis/rules.mk index 6c8d2897c..f37fe4338 100644 --- a/keyboards/preonic/keymaps/kinesis/rules.mk +++ b/keyboards/preonic/keymaps/kinesis/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/preonic/keymaps/seph/rules.mk b/keyboards/preonic/keymaps/seph/rules.mk index 4333bf455..dd26cd906 100644 --- a/keyboards/preonic/keymaps/seph/rules.mk +++ b/keyboards/preonic/keymaps/seph/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/preonic/keymaps/zach/rules.mk b/keyboards/preonic/keymaps/zach/rules.mk index eebf41349..f00af4396 100644 --- a/keyboards/preonic/keymaps/zach/rules.mk +++ b/keyboards/preonic/keymaps/zach/rules.mk @@ -20,7 +20,7 @@ AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode UNICODEMAP_ENABLE = yes # Enable extended unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/quefrency/rules.mk b/keyboards/quefrency/rules.mk index b78dc5df7..3ec04fbf1 100644 --- a/keyboards/quefrency/rules.mk +++ b/keyboards/quefrency/rules.mk @@ -22,7 +22,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SUBPROJECT_rev1 = yes USE_I2C = yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/qwertyydox/rules.mk b/keyboards/qwertyydox/rules.mk index d8a287bbc..d04a4b9f3 100644 --- a/keyboards/qwertyydox/rules.mk +++ b/keyboards/qwertyydox/rules.mk @@ -58,7 +58,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SUBPROJECT_rev1 = yes USE_I2C = yes # I2C is used between the sides # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/rama/m60_a/rules.mk b/keyboards/rama/m60_a/rules.mk index 02617cf1c..7ab1b7d3b 100644 --- a/keyboards/rama/m60_a/rules.mk +++ b/keyboards/rama/m60_a/rules.mk @@ -68,7 +68,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend @@ -76,4 +76,3 @@ SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend RAW_ENABLE = yes DYNAMIC_KEYMAP_ENABLE = yes CIE1931_CURVE = yes - diff --git a/keyboards/redox/rules.mk b/keyboards/redox/rules.mk index c74a3bda2..748d89dcf 100644 --- a/keyboards/redox/rules.mk +++ b/keyboards/redox/rules.mk @@ -66,7 +66,7 @@ UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID AUDIO_ENABLE = no # Audio output on port C6 FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SUBPROJECT_rev1 = yes USE_I2C = yes diff --git a/keyboards/rorschach/keymaps/insertsnideremarks/rules.mk b/keyboards/rorschach/keymaps/insertsnideremarks/rules.mk index 6beaae7ae..b9e39c053 100644 --- a/keyboards/rorschach/keymaps/insertsnideremarks/rules.mk +++ b/keyboards/rorschach/keymaps/insertsnideremarks/rules.mk @@ -14,8 +14,6 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = yes # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = yes # Enable Tap Dancing function - - diff --git a/keyboards/rorschach/rules.mk b/keyboards/rorschach/rules.mk index 9de068d2f..320125348 100644 --- a/keyboards/rorschach/rules.mk +++ b/keyboards/rorschach/rules.mk @@ -17,7 +17,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/s60_x/keymaps/ansi_qwertz/rules.mk b/keyboards/s60_x/keymaps/ansi_qwertz/rules.mk index 6a078bcc3..cf5012252 100644 --- a/keyboards/s60_x/keymaps/ansi_qwertz/rules.mk +++ b/keyboards/s60_x/keymaps/ansi_qwertz/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/s60_x/keymaps/bluebear/rules.mk b/keyboards/s60_x/keymaps/bluebear/rules.mk index 78d770d26..b7c9a0479 100644 --- a/keyboards/s60_x/keymaps/bluebear/rules.mk +++ b/keyboards/s60_x/keymaps/bluebear/rules.mk @@ -9,6 +9,6 @@ MIDI_ENABLE = yes # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = no # Enable tap dancing keys \ No newline at end of file diff --git a/keyboards/satan/keymaps/addcninblue/rules.mk b/keyboards/satan/keymaps/addcninblue/rules.mk index c2937fd57..fd7f34300 100644 --- a/keyboards/satan/keymaps/addcninblue/rules.mk +++ b/keyboards/satan/keymaps/addcninblue/rules.mk @@ -16,6 +16,6 @@ UNICODEMAP_ENABLE = no # This allows sending unicode symbols using X() UNICODE_ENABLE =no # Unicode UCIS_ENABLE = no # Keep in mind that not all will work (See WinCompose for details on Windows). BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no# Breathing sleep LED during USB suspend API_SYSEX_ENABLE = no # This enables using the Quantum SYSEX API to send strings ifndef QUANTUM_DIR diff --git a/keyboards/satan/keymaps/ben_iso/rules.mk b/keyboards/satan/keymaps/ben_iso/rules.mk index 2a7ff2779..bb535beb3 100644 --- a/keyboards/satan/keymaps/ben_iso/rules.mk +++ b/keyboards/satan/keymaps/ben_iso/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/satan/keymaps/chaser/rules.mk b/keyboards/satan/keymaps/chaser/rules.mk index 2a7ff2779..bb535beb3 100644 --- a/keyboards/satan/keymaps/chaser/rules.mk +++ b/keyboards/satan/keymaps/chaser/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/satan/keymaps/colemak/rules.mk b/keyboards/satan/keymaps/colemak/rules.mk index 2a7ff2779..bb535beb3 100644 --- a/keyboards/satan/keymaps/colemak/rules.mk +++ b/keyboards/satan/keymaps/colemak/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/satan/keymaps/default/rules.mk b/keyboards/satan/keymaps/default/rules.mk index 2a7ff2779..bb535beb3 100644 --- a/keyboards/satan/keymaps/default/rules.mk +++ b/keyboards/satan/keymaps/default/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/satan/keymaps/dende_iso/rules.mk b/keyboards/satan/keymaps/dende_iso/rules.mk index 2a7ff2779..bb535beb3 100644 --- a/keyboards/satan/keymaps/dende_iso/rules.mk +++ b/keyboards/satan/keymaps/dende_iso/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/satan/keymaps/dkrieger/rules.mk b/keyboards/satan/keymaps/dkrieger/rules.mk index 4c280ceb0..f2434d30e 100644 --- a/keyboards/satan/keymaps/dkrieger/rules.mk +++ b/keyboards/satan/keymaps/dkrieger/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = yes diff --git a/keyboards/satan/keymaps/isoHHKB/rules.mk b/keyboards/satan/keymaps/isoHHKB/rules.mk index 026b33c7d..80ce56058 100644 --- a/keyboards/satan/keymaps/isoHHKB/rules.mk +++ b/keyboards/satan/keymaps/isoHHKB/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/satan/keymaps/lepa/rules.mk b/keyboards/satan/keymaps/lepa/rules.mk index 636dd1b1d..72ca00646 100644 --- a/keyboards/satan/keymaps/lepa/rules.mk +++ b/keyboards/satan/keymaps/lepa/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = yes diff --git a/keyboards/satan/keymaps/midi/rules.mk b/keyboards/satan/keymaps/midi/rules.mk index 89c34b394..d144314de 100644 --- a/keyboards/satan/keymaps/midi/rules.mk +++ b/keyboards/satan/keymaps/midi/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = yes # MIDI support (+2400 to 4200, depending on config) AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/satan/keymaps/olligranlund_iso/rules.mk b/keyboards/satan/keymaps/olligranlund_iso/rules.mk index c96deccaa..73106b674 100644 --- a/keyboards/satan/keymaps/olligranlund_iso/rules.mk +++ b/keyboards/satan/keymaps/olligranlund_iso/rules.mk @@ -13,5 +13,5 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/satan/keymaps/sethbc/rules.mk b/keyboards/satan/keymaps/sethbc/rules.mk index 2a7ff2779..bb535beb3 100644 --- a/keyboards/satan/keymaps/sethbc/rules.mk +++ b/keyboards/satan/keymaps/sethbc/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/satan/keymaps/smt/rules.mk b/keyboards/satan/keymaps/smt/rules.mk index 0c9ae824f..806c2cb84 100644 --- a/keyboards/satan/keymaps/smt/rules.mk +++ b/keyboards/satan/keymaps/smt/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/satan/keymaps/unxmaal/rules.mk b/keyboards/satan/keymaps/unxmaal/rules.mk index ee94a67b4..470d621b1 100644 --- a/keyboards/satan/keymaps/unxmaal/rules.mk +++ b/keyboards/satan/keymaps/unxmaal/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/tada68/keymaps/ardakilic/rules.mk b/keyboards/tada68/keymaps/ardakilic/rules.mk index 2a7ff2779..bb535beb3 100644 --- a/keyboards/tada68/keymaps/ardakilic/rules.mk +++ b/keyboards/tada68/keymaps/ardakilic/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/tada68/keymaps/bazooka/rules.mk b/keyboards/tada68/keymaps/bazooka/rules.mk index 1915481bf..b2789a78a 100644 --- a/keyboards/tada68/keymaps/bazooka/rules.mk +++ b/keyboards/tada68/keymaps/bazooka/rules.mk @@ -13,5 +13,5 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/tada68/keymaps/cheese/rules.mk b/keyboards/tada68/keymaps/cheese/rules.mk index fdbd25ea8..b2789a78a 100644 --- a/keyboards/tada68/keymaps/cheese/rules.mk +++ b/keyboards/tada68/keymaps/cheese/rules.mk @@ -13,6 +13,5 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend - diff --git a/keyboards/tada68/keymaps/default/rules.mk b/keyboards/tada68/keymaps/default/rules.mk index 2a7ff2779..bb535beb3 100644 --- a/keyboards/tada68/keymaps/default/rules.mk +++ b/keyboards/tada68/keymaps/default/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/tada68/keymaps/fakb/rules.mk b/keyboards/tada68/keymaps/fakb/rules.mk index 54b79fc9d..642e16de5 100644 --- a/keyboards/tada68/keymaps/fakb/rules.mk +++ b/keyboards/tada68/keymaps/fakb/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/tada68/keymaps/fezzant/rules.mk b/keyboards/tada68/keymaps/fezzant/rules.mk index f2439cc7d..8df84ae95 100644 --- a/keyboards/tada68/keymaps/fezzant/rules.mk +++ b/keyboards/tada68/keymaps/fezzant/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = yes # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/tada68/keymaps/iso-nor/rules.mk b/keyboards/tada68/keymaps/iso-nor/rules.mk index 4deca710b..baaca071c 100644 --- a/keyboards/tada68/keymaps/iso-nor/rules.mk +++ b/keyboards/tada68/keymaps/iso-nor/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/tada68/keymaps/iso-uk/rules.mk b/keyboards/tada68/keymaps/iso-uk/rules.mk index 4deca710b..baaca071c 100644 --- a/keyboards/tada68/keymaps/iso-uk/rules.mk +++ b/keyboards/tada68/keymaps/iso-uk/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/tada68/keymaps/isoish/rules.mk b/keyboards/tada68/keymaps/isoish/rules.mk index 4deca710b..baaca071c 100644 --- a/keyboards/tada68/keymaps/isoish/rules.mk +++ b/keyboards/tada68/keymaps/isoish/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/tada68/keymaps/mattdicarlo/rules.mk b/keyboards/tada68/keymaps/mattdicarlo/rules.mk index c92000665..ac92f99f4 100644 --- a/keyboards/tada68/keymaps/mattdicarlo/rules.mk +++ b/keyboards/tada68/keymaps/mattdicarlo/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/tada68/keymaps/mlechner/rules.mk b/keyboards/tada68/keymaps/mlechner/rules.mk index 2a7ff2779..bb535beb3 100644 --- a/keyboards/tada68/keymaps/mlechner/rules.mk +++ b/keyboards/tada68/keymaps/mlechner/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/tada68/keymaps/mtdjr/rules.mk b/keyboards/tada68/keymaps/mtdjr/rules.mk index 2a7ff2779..bb535beb3 100644 --- a/keyboards/tada68/keymaps/mtdjr/rules.mk +++ b/keyboards/tada68/keymaps/mtdjr/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/tada68/keymaps/pascamel/rules.mk b/keyboards/tada68/keymaps/pascamel/rules.mk index 2a7ff2779..bb535beb3 100644 --- a/keyboards/tada68/keymaps/pascamel/rules.mk +++ b/keyboards/tada68/keymaps/pascamel/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/tada68/keymaps/raylas/rules.mk b/keyboards/tada68/keymaps/raylas/rules.mk index 2a7ff2779..bb535beb3 100644 --- a/keyboards/tada68/keymaps/raylas/rules.mk +++ b/keyboards/tada68/keymaps/raylas/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/tada68/keymaps/rbong/rules.mk b/keyboards/tada68/keymaps/rbong/rules.mk index 1915481bf..b2789a78a 100644 --- a/keyboards/tada68/keymaps/rbong/rules.mk +++ b/keyboards/tada68/keymaps/rbong/rules.mk @@ -13,5 +13,5 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/tada68/keymaps/rgb/rules.mk b/keyboards/tada68/keymaps/rgb/rules.mk index ee94a67b4..470d621b1 100644 --- a/keyboards/tada68/keymaps/rgb/rules.mk +++ b/keyboards/tada68/keymaps/rgb/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/tada68/keymaps/rys/rules.mk b/keyboards/tada68/keymaps/rys/rules.mk index 1915481bf..b2789a78a 100644 --- a/keyboards/tada68/keymaps/rys/rules.mk +++ b/keyboards/tada68/keymaps/rys/rules.mk @@ -13,5 +13,5 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/tada68/keymaps/shalzz/rules.mk b/keyboards/tada68/keymaps/shalzz/rules.mk index 1df3af955..4595aa8c2 100644 --- a/keyboards/tada68/keymaps/shalzz/rules.mk +++ b/keyboards/tada68/keymaps/shalzz/rules.mk @@ -8,5 +8,5 @@ COMMAND_ENABLE = no # Commands for debug and configuration NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality AUDIO_ENABLE = no # Audio output on port C6 -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend diff --git a/keyboards/tada68/keymaps/sm0g/rules.mk b/keyboards/tada68/keymaps/sm0g/rules.mk index bd4bb3249..0826db755 100644 --- a/keyboards/tada68/keymaps/sm0g/rules.mk +++ b/keyboards/tada68/keymaps/sm0g/rules.mk @@ -13,6 +13,6 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = yes # Tappa Dance \ No newline at end of file diff --git a/keyboards/tada68/keymaps/stephengrier/rules.mk b/keyboards/tada68/keymaps/stephengrier/rules.mk index 2a7ff2779..bb535beb3 100644 --- a/keyboards/tada68/keymaps/stephengrier/rules.mk +++ b/keyboards/tada68/keymaps/stephengrier/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/tada68/keymaps/trashcat/rules.mk b/keyboards/tada68/keymaps/trashcat/rules.mk index 644b6a814..6fb496919 100644 --- a/keyboards/tada68/keymaps/trashcat/rules.mk +++ b/keyboards/tada68/keymaps/trashcat/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = yes # Tappa Dance Bitch ifndef QUANTUM_DIR diff --git a/keyboards/tada68/keymaps/tshack/rules.mk b/keyboards/tada68/keymaps/tshack/rules.mk index 061907d3a..86d22dd3f 100644 --- a/keyboards/tada68/keymaps/tshack/rules.mk +++ b/keyboards/tada68/keymaps/tshack/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/tada68/keymaps/unix/rules.mk b/keyboards/tada68/keymaps/unix/rules.mk index 46f0b65a9..aade51459 100644 --- a/keyboards/tada68/keymaps/unix/rules.mk +++ b/keyboards/tada68/keymaps/unix/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/tada68/keymaps/wamsm_tada/rules.mk b/keyboards/tada68/keymaps/wamsm_tada/rules.mk index 2a7ff2779..bb535beb3 100644 --- a/keyboards/tada68/keymaps/wamsm_tada/rules.mk +++ b/keyboards/tada68/keymaps/wamsm_tada/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/the_ruler/keymaps/default/rules.mk b/keyboards/the_ruler/keymaps/default/rules.mk index fac9327db..b491f5b3f 100644 --- a/keyboards/the_ruler/keymaps/default/rules.mk +++ b/keyboards/the_ruler/keymaps/default/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/the_ruler/rules.mk b/keyboards/the_ruler/rules.mk index 30d76a3c9..6362176fe 100644 --- a/keyboards/the_ruler/rules.mk +++ b/keyboards/the_ruler/rules.mk @@ -65,4 +65,4 @@ MIDI_ENABLE = no # MIDI controls UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID AUDIO_ENABLE = no # Audio output on port C6 -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. diff --git a/keyboards/thevankeyboards/bananasplit/keymaps/0010/rules.mk b/keyboards/thevankeyboards/bananasplit/keymaps/0010/rules.mk index 7d09c322e..159fd7dc6 100644 --- a/keyboards/thevankeyboards/bananasplit/keymaps/0010/rules.mk +++ b/keyboards/thevankeyboards/bananasplit/keymaps/0010/rules.mk @@ -29,7 +29,7 @@ # AUDIO_ENABLE = no # Audio output on port C6 # UNICODE_ENABLE = no # Unicode # BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -# RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +# RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/thevankeyboards/bananasplit/keymaps/coloneljesus/rules.mk b/keyboards/thevankeyboards/bananasplit/keymaps/coloneljesus/rules.mk index 7d09c322e..159fd7dc6 100644 --- a/keyboards/thevankeyboards/bananasplit/keymaps/coloneljesus/rules.mk +++ b/keyboards/thevankeyboards/bananasplit/keymaps/coloneljesus/rules.mk @@ -29,7 +29,7 @@ # AUDIO_ENABLE = no # Audio output on port C6 # UNICODE_ENABLE = no # Unicode # BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -# RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +# RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/thevankeyboards/bananasplit/keymaps/default/rules.mk b/keyboards/thevankeyboards/bananasplit/keymaps/default/rules.mk index 7d09c322e..159fd7dc6 100644 --- a/keyboards/thevankeyboards/bananasplit/keymaps/default/rules.mk +++ b/keyboards/thevankeyboards/bananasplit/keymaps/default/rules.mk @@ -29,7 +29,7 @@ # AUDIO_ENABLE = no # Audio output on port C6 # UNICODE_ENABLE = no # Unicode # BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -# RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +# RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/thevankeyboards/bananasplit/keymaps/kamon/rules.mk b/keyboards/thevankeyboards/bananasplit/keymaps/kamon/rules.mk index 7d09c322e..159fd7dc6 100644 --- a/keyboards/thevankeyboards/bananasplit/keymaps/kamon/rules.mk +++ b/keyboards/thevankeyboards/bananasplit/keymaps/kamon/rules.mk @@ -29,7 +29,7 @@ # AUDIO_ENABLE = no # Audio output on port C6 # UNICODE_ENABLE = no # Unicode # BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -# RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +# RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/thevankeyboards/minivan/keymaps/default/rules.mk b/keyboards/thevankeyboards/minivan/keymaps/default/rules.mk index f4671a9d1..3ff147725 100644 --- a/keyboards/thevankeyboards/minivan/keymaps/default/rules.mk +++ b/keyboards/thevankeyboards/minivan/keymaps/default/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/thevankeyboards/minivan/keymaps/jeebak/rules.mk b/keyboards/thevankeyboards/minivan/keymaps/jeebak/rules.mk index f4671a9d1..3ff147725 100644 --- a/keyboards/thevankeyboards/minivan/keymaps/jeebak/rules.mk +++ b/keyboards/thevankeyboards/minivan/keymaps/jeebak/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/thevankeyboards/minivan/keymaps/jetpacktuxedo/rules.mk b/keyboards/thevankeyboards/minivan/keymaps/jetpacktuxedo/rules.mk index ebc9f810f..d7ca73ac5 100644 --- a/keyboards/thevankeyboards/minivan/keymaps/jetpacktuxedo/rules.mk +++ b/keyboards/thevankeyboards/minivan/keymaps/jetpacktuxedo/rules.mk @@ -13,5 +13,5 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/thevankeyboards/minivan/keymaps/mjt/rules.mk b/keyboards/thevankeyboards/minivan/keymaps/mjt/rules.mk index 41afd9a55..b2c421c4d 100644 --- a/keyboards/thevankeyboards/minivan/keymaps/mjt/rules.mk +++ b/keyboards/thevankeyboards/minivan/keymaps/mjt/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/thevankeyboards/minivan/keymaps/smt/rules.mk b/keyboards/thevankeyboards/minivan/keymaps/smt/rules.mk index f4671a9d1..3ff147725 100644 --- a/keyboards/thevankeyboards/minivan/keymaps/smt/rules.mk +++ b/keyboards/thevankeyboards/minivan/keymaps/smt/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/thevankeyboards/minivan/keymaps/tong92/rules.mk b/keyboards/thevankeyboards/minivan/keymaps/tong92/rules.mk index e60e3c5c5..1e006e947 100644 --- a/keyboards/thevankeyboards/minivan/keymaps/tong92/rules.mk +++ b/keyboards/thevankeyboards/minivan/keymaps/tong92/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/thevankeyboards/minivan/keymaps/xyverz/rules.mk b/keyboards/thevankeyboards/minivan/keymaps/xyverz/rules.mk index f4671a9d1..3ff147725 100644 --- a/keyboards/thevankeyboards/minivan/keymaps/xyverz/rules.mk +++ b/keyboards/thevankeyboards/minivan/keymaps/xyverz/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/thevankeyboards/roadkit/keymaps/default/rules.mk b/keyboards/thevankeyboards/roadkit/keymaps/default/rules.mk index f4671a9d1..3ff147725 100644 --- a/keyboards/thevankeyboards/roadkit/keymaps/default/rules.mk +++ b/keyboards/thevankeyboards/roadkit/keymaps/default/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/thevankeyboards/roadkit/keymaps/flipphone/rules.mk b/keyboards/thevankeyboards/roadkit/keymaps/flipphone/rules.mk index f4671a9d1..3ff147725 100644 --- a/keyboards/thevankeyboards/roadkit/keymaps/flipphone/rules.mk +++ b/keyboards/thevankeyboards/roadkit/keymaps/flipphone/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/thevankeyboards/roadkit/keymaps/khord/rules.mk b/keyboards/thevankeyboards/roadkit/keymaps/khord/rules.mk index 9f3c958bd..ba4b4fec0 100644 --- a/keyboards/thevankeyboards/roadkit/keymaps/khord/rules.mk +++ b/keyboards/thevankeyboards/roadkit/keymaps/khord/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = no # Enable Tap Dance functionality diff --git a/keyboards/thevankeyboards/roadkit/keymaps/mjt/rules.mk b/keyboards/thevankeyboards/roadkit/keymaps/mjt/rules.mk index f4671a9d1..3ff147725 100644 --- a/keyboards/thevankeyboards/roadkit/keymaps/mjt/rules.mk +++ b/keyboards/thevankeyboards/roadkit/keymaps/mjt/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/thevankeyboards/roadkit/keymaps/singles/rules.mk b/keyboards/thevankeyboards/roadkit/keymaps/singles/rules.mk index f4671a9d1..3ff147725 100644 --- a/keyboards/thevankeyboards/roadkit/keymaps/singles/rules.mk +++ b/keyboards/thevankeyboards/roadkit/keymaps/singles/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/thevankeyboards/roadkit/keymaps/singlesBrent/rules.mk b/keyboards/thevankeyboards/roadkit/keymaps/singlesBrent/rules.mk index b61d6cca2..030d27f2a 100644 --- a/keyboards/thevankeyboards/roadkit/keymaps/singlesBrent/rules.mk +++ b/keyboards/thevankeyboards/roadkit/keymaps/singlesBrent/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = yes # Enable Tap Dance functionality diff --git a/keyboards/thevankeyboards/roadkit/keymaps/wavebeem-gamepad/rules.mk b/keyboards/thevankeyboards/roadkit/keymaps/wavebeem-gamepad/rules.mk index 72fd3d30b..d8284e6bd 100644 --- a/keyboards/thevankeyboards/roadkit/keymaps/wavebeem-gamepad/rules.mk +++ b/keyboards/thevankeyboards/roadkit/keymaps/wavebeem-gamepad/rules.mk @@ -13,5 +13,5 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/vision_division/keymaps/default/rules.mk b/keyboards/vision_division/keymaps/default/rules.mk index 28060947a..342f37453 100644 --- a/keyboards/vision_division/keymaps/default/rules.mk +++ b/keyboards/vision_division/keymaps/default/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/vitamins_included/rules.mk b/keyboards/vitamins_included/rules.mk index 4f6d497a6..34f423f59 100644 --- a/keyboards/vitamins_included/rules.mk +++ b/keyboards/vitamins_included/rules.mk @@ -63,7 +63,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/viterbi/rules.mk b/keyboards/viterbi/rules.mk index af24c15f5..ee043cca3 100644 --- a/keyboards/viterbi/rules.mk +++ b/keyboards/viterbi/rules.mk @@ -63,7 +63,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SUBPROJECT_rev1 = yes USE_I2C = yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/wavelet/rules.mk b/keyboards/wavelet/rules.mk index 86149c562..cfff50a41 100644 --- a/keyboards/wavelet/rules.mk +++ b/keyboards/wavelet/rules.mk @@ -22,7 +22,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/xd60/rules.mk b/keyboards/xd60/rules.mk index 50fba97e5..8a60252dc 100644 --- a/keyboards/xd60/rules.mk +++ b/keyboards/xd60/rules.mk @@ -61,7 +61,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend LAYOUTS = 60_ansi \ No newline at end of file diff --git a/keyboards/xd75/keymaps/fabian/rules.mk b/keyboards/xd75/keymaps/fabian/rules.mk index 6e8941fdf..f1ae8d44a 100644 --- a/keyboards/xd75/keymaps/fabian/rules.mk +++ b/keyboards/xd75/keymaps/fabian/rules.mk @@ -29,7 +29,7 @@ MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/xd75/keymaps/germanized/rules.mk b/keyboards/xd75/keymaps/germanized/rules.mk index d72bcf575..f57fb8c54 100644 --- a/keyboards/xd75/keymaps/germanized/rules.mk +++ b/keyboards/xd75/keymaps/germanized/rules.mk @@ -29,7 +29,7 @@ MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = yes # Enable Tap Dancing diff --git a/keyboards/xd75/rules.mk b/keyboards/xd75/rules.mk index 5f6e85648..e99272943 100644 --- a/keyboards/xd75/rules.mk +++ b/keyboards/xd75/rules.mk @@ -62,7 +62,7 @@ MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend LAYOUTS = ortho_5x15 \ No newline at end of file diff --git a/keyboards/zeal60/rules.mk b/keyboards/zeal60/rules.mk index f099ea9fd..1327d8821 100644 --- a/keyboards/zeal60/rules.mk +++ b/keyboards/zeal60/rules.mk @@ -67,7 +67,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend diff --git a/keyboards/zeal65/rules.mk b/keyboards/zeal65/rules.mk index 02617cf1c..7ab1b7d3b 100644 --- a/keyboards/zeal65/rules.mk +++ b/keyboards/zeal65/rules.mk @@ -68,7 +68,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend @@ -76,4 +76,3 @@ SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend RAW_ENABLE = yes DYNAMIC_KEYMAP_ENABLE = yes CIE1931_CURVE = yes - diff --git a/keyboards/zen/rules.mk b/keyboards/zen/rules.mk index 32d3dc51c..4e8268911 100644 --- a/keyboards/zen/rules.mk +++ b/keyboards/zen/rules.mk @@ -62,7 +62,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SUBPROJECT_rev1 = yes USE_I2C = no # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/layouts/community/ergodox/alphadox/rules.mk b/layouts/community/ergodox/alphadox/rules.mk index f93ff3bb6..57c62a5e6 100644 --- a/layouts/community/ergodox/alphadox/rules.mk +++ b/layouts/community/ergodox/alphadox/rules.mk @@ -9,7 +9,5 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend - - From 7e99d869deb57251dc15620beff34d5fd53066e4 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 22 Oct 2018 10:26:19 -0700 Subject: [PATCH 335/788] Remove all of the deprecated RGB defines Fixes #3641 --- drivers/avr/ws2812.h | 3 --- keyboards/6ball/config.h | 4 +--- keyboards/9key/config.h | 4 +--- keyboards/amj40/keymaps/default/rules.mk | 3 --- keyboards/amj40/keymaps/fabian/rules.mk | 10 +--------- keyboards/amj40/keymaps/jetpacktuxedo/rules.mk | 8 -------- keyboards/amj40/keymaps/myee/rules.mk | 10 +--------- keyboards/bfo9000/config.h | 2 +- keyboards/blockey/config.h | 5 +---- keyboards/chocopad/config.h | 4 +--- keyboards/crkbd/rev1/config.h | 4 +--- keyboards/deltasplit75/v2/config.h | 6 ++---- keyboards/dilly/config.h | 4 +--- keyboards/ergo42/rev1/config.h | 4 +--- keyboards/ergodash/mini/config.h | 4 +--- keyboards/ergodash/rev1/config.h | 4 +--- keyboards/ergodash/rev2/config.h | 4 +--- keyboards/ergotravel/rev1/config.h | 5 +---- keyboards/fortitude60/rev1/config.h | 2 +- keyboards/fourier/rev1/config.h | 4 +--- keyboards/gh60/keymaps/dbroqua/config.h | 13 +++---------- keyboards/gh60/keymaps/robotmaxtron/config.h | 13 +++---------- keyboards/handwired/dactyl_manuform/config.h | 4 +--- keyboards/handwired/qc60/proto/config.h | 2 -- keyboards/helix/pico/config.h | 4 +--- keyboards/helix/rev1/config.h | 5 +---- keyboards/helix/rev2/config.h | 4 +--- keyboards/iris/rev1/config.h | 2 +- keyboards/iris/rev1_led/config.h | 2 +- keyboards/iris/rev2/config.h | 2 +- keyboards/iris/rev3/config.h | 2 +- keyboards/lets_split/keymaps/zer09/config.h | 4 +--- keyboards/lets_split/rev1/config.h | 4 +--- keyboards/lets_split/rev2/config.h | 4 +--- keyboards/lets_split/sockets/config.h | 4 +--- keyboards/levinson/rev1/config.h | 2 +- keyboards/levinson/rev2/config.h | 2 +- keyboards/lily58/rev1/config.h | 8 +++----- keyboards/meira/config.h | 2 +- keyboards/minidox/keymaps/alairock/config.h | 2 +- keyboards/minidox/keymaps/that_canadian/config.h | 2 +- keyboards/minidox/keymaps/xyverz/config.h | 2 +- keyboards/mint60/config.h | 4 +--- keyboards/miuni32/config.h | 7 +++---- keyboards/nyquist/rev1/config.h | 4 +--- keyboards/nyquist/rev2/config.h | 2 +- keyboards/orthodox/rev1/config.h | 3 --- keyboards/orthodox/rev3/config.h | 4 +--- keyboards/orthodox/rev3_teensy/config.h | 4 +--- keyboards/preonic/keymaps/zach/config.h | 2 +- keyboards/qwertyydox/config.h | 4 +--- keyboards/qwertyydox/rev1/config.h | 4 +--- keyboards/redox/rev1/config.h | 4 +--- keyboards/the_ruler/config.h | 3 +-- keyboards/vitamins_included/rev1/config.h | 4 +--- keyboards/viterbi/rev1/config.h | 4 +--- keyboards/wavelet/config.h | 2 +- keyboards/zen/rev1/config.h | 4 +--- 58 files changed, 62 insertions(+), 180 deletions(-) diff --git a/drivers/avr/ws2812.h b/drivers/avr/ws2812.h index f7e0c3144..1f9299ffb 100644 --- a/drivers/avr/ws2812.h +++ b/drivers/avr/ws2812.h @@ -69,7 +69,4 @@ void ws2812_sendarray_mask(uint8_t *array,uint16_t length, uint8_t pinmask); #define CONCAT_EXP(a, b) CONCAT(a, b) #endif -// #define ws2812_PORTREG CONCAT_EXP(PORT,ws2812_port) -// #define ws2812_DDRREG CONCAT_EXP(DDR,ws2812_port) - #endif /* LIGHT_WS2812_H_ */ diff --git a/keyboards/6ball/config.h b/keyboards/6ball/config.h index 19d24486c..b0e59f20c 100644 --- a/keyboards/6ball/config.h +++ b/keyboards/6ball/config.h @@ -39,11 +39,9 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN F7 -#define RGBLIGHT_TIMER + #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 6 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD /* COL2ROW or ROW2COL */ #define DIODE_DIRECTION COL2ROW diff --git a/keyboards/9key/config.h b/keyboards/9key/config.h index eee8407cc..4e5a2fd45 100644 --- a/keyboards/9key/config.h +++ b/keyboards/9key/config.h @@ -39,10 +39,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN F7 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 1 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD /* COL2ROW or ROW2COL */ #define DIODE_DIRECTION COL2ROW diff --git a/keyboards/amj40/keymaps/default/rules.mk b/keyboards/amj40/keymaps/default/rules.mk index 41a198224..fe9867220 100644 --- a/keyboards/amj40/keymaps/default/rules.mk +++ b/keyboards/amj40/keymaps/default/rules.mk @@ -18,9 +18,6 @@ RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD - ifndef QUANTUM_DIR include ../../../../Makefile diff --git a/keyboards/amj40/keymaps/fabian/rules.mk b/keyboards/amj40/keymaps/fabian/rules.mk index 7e0634e09..90559e0dd 100644 --- a/keyboards/amj40/keymaps/fabian/rules.mk +++ b/keyboards/amj40/keymaps/fabian/rules.mk @@ -1,5 +1,5 @@ # Build Options -# change to "no" to disable the options, or define them in the Makefile in +# change to "no" to disable the options, or define them in the Makefile in # the appropriate keymap folder that will get included automatically # BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) @@ -17,11 +17,3 @@ RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend - -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD - - -ifndef QUANTUM_DIR - include ../../../../Makefile -endif diff --git a/keyboards/amj40/keymaps/jetpacktuxedo/rules.mk b/keyboards/amj40/keymaps/jetpacktuxedo/rules.mk index 6ad923668..2b613b28e 100644 --- a/keyboards/amj40/keymaps/jetpacktuxedo/rules.mk +++ b/keyboards/amj40/keymaps/jetpacktuxedo/rules.mk @@ -17,11 +17,3 @@ RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. It uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend - -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD - - -ifndef QUANTUM_DIR - include ../../../../Makefile -endif diff --git a/keyboards/amj40/keymaps/myee/rules.mk b/keyboards/amj40/keymaps/myee/rules.mk index c35191cef..fe07e43d8 100644 --- a/keyboards/amj40/keymaps/myee/rules.mk +++ b/keyboards/amj40/keymaps/myee/rules.mk @@ -1,5 +1,5 @@ # Build Options -# change to "no" to disable the options, or define them in the Makefile in +# change to "no" to disable the options, or define them in the Makefile in # the appropriate keymap folder that will get included automatically # BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) @@ -17,11 +17,3 @@ RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend - -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD - - -ifndef QUANTUM_DIR - include ../../../../Makefile -endif diff --git a/keyboards/bfo9000/config.h b/keyboards/bfo9000/config.h index 561d2d114..893fa5ab6 100644 --- a/keyboards/bfo9000/config.h +++ b/keyboards/bfo9000/config.h @@ -53,7 +53,7 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN B4 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 20 // Number of LEDs /* diff --git a/keyboards/blockey/config.h b/keyboards/blockey/config.h index b099a816b..53860bfbc 100644 --- a/keyboards/blockey/config.h +++ b/keyboards/blockey/config.h @@ -51,11 +51,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN B1 -#define RGBLIGHT_TIMER -#define RGBLED_NUM 4 -#define ws2812_PORTREG PORTB -#define ws2812_DDRREG DDRB +#define RGBLED_NUM 4 #define RGBLIGHT_HUE_STEP 10 #define RGBLIGHT_SAT_STEP 17 diff --git a/keyboards/chocopad/config.h b/keyboards/chocopad/config.h index 2163ff8bc..d2a1a7b48 100644 --- a/keyboards/chocopad/config.h +++ b/keyboards/chocopad/config.h @@ -47,9 +47,7 @@ #define RGBLIGHT_VAL_STEP 8 #endif #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 4 -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD #endif diff --git a/keyboards/crkbd/rev1/config.h b/keyboards/crkbd/rev1/config.h index efce13a49..915779060 100644 --- a/keyboards/crkbd/rev1/config.h +++ b/keyboards/crkbd/rev1/config.h @@ -57,10 +57,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 12 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD /* * Feature disable options diff --git a/keyboards/deltasplit75/v2/config.h b/keyboards/deltasplit75/v2/config.h index 319a149fb..475a5c9dc 100644 --- a/keyboards/deltasplit75/v2/config.h +++ b/keyboards/deltasplit75/v2/config.h @@ -61,10 +61,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 12 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD /* * Feature disable options @@ -85,4 +83,4 @@ along with this program. If not, see . //#define NO_ACTION_FUNCTION -#endif \ No newline at end of file +#endif diff --git a/keyboards/dilly/config.h b/keyboards/dilly/config.h index d9ca4597c..084186fc6 100644 --- a/keyboards/dilly/config.h +++ b/keyboards/dilly/config.h @@ -50,9 +50,7 @@ #define RGBLIGHT_VAL_STEP 8 #endif #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 10 -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD #endif diff --git a/keyboards/ergo42/rev1/config.h b/keyboards/ergo42/rev1/config.h index 1a674a858..a7edb4097 100644 --- a/keyboards/ergo42/rev1/config.h +++ b/keyboards/ergo42/rev1/config.h @@ -66,10 +66,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 12 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD /* * Feature disable options diff --git a/keyboards/ergodash/mini/config.h b/keyboards/ergodash/mini/config.h index a7be1635c..11cff145e 100644 --- a/keyboards/ergodash/mini/config.h +++ b/keyboards/ergodash/mini/config.h @@ -73,10 +73,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 20 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD /* * Feature disable options diff --git a/keyboards/ergodash/rev1/config.h b/keyboards/ergodash/rev1/config.h index 09dd6604e..d3f3314ee 100644 --- a/keyboards/ergodash/rev1/config.h +++ b/keyboards/ergodash/rev1/config.h @@ -63,10 +63,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 24 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD /* * Feature disable options diff --git a/keyboards/ergodash/rev2/config.h b/keyboards/ergodash/rev2/config.h index 489afe017..5f9c68991 100644 --- a/keyboards/ergodash/rev2/config.h +++ b/keyboards/ergodash/rev2/config.h @@ -70,10 +70,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 24 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD /* * Feature disable options diff --git a/keyboards/ergotravel/rev1/config.h b/keyboards/ergotravel/rev1/config.h index 5fa447da7..3af1147a7 100644 --- a/keyboards/ergotravel/rev1/config.h +++ b/keyboards/ergotravel/rev1/config.h @@ -61,10 +61,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 12 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD /* * Feature disable options @@ -83,4 +81,3 @@ along with this program. If not, see . //#define NO_ACTION_ONESHOT //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION - diff --git a/keyboards/fortitude60/rev1/config.h b/keyboards/fortitude60/rev1/config.h index 8c6f21afe..b89f5c7df 100644 --- a/keyboards/fortitude60/rev1/config.h +++ b/keyboards/fortitude60/rev1/config.h @@ -66,7 +66,7 @@ along with this program. If not, see . /* ws2812 RGB LED */ #ifdef RGBLIGHT_ENABLE #define RGB_DI_PIN B5 - #define RGBLIGHT_TIMER + #define RGBLED_NUM 18 // Number of LEDs */ #endif /* diff --git a/keyboards/fourier/rev1/config.h b/keyboards/fourier/rev1/config.h index c13752226..3bd67228c 100644 --- a/keyboards/fourier/rev1/config.h +++ b/keyboards/fourier/rev1/config.h @@ -56,11 +56,9 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 14 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD /* * Feature disable options diff --git a/keyboards/gh60/keymaps/dbroqua/config.h b/keyboards/gh60/keymaps/dbroqua/config.h index 0b8218d28..fd63c9a8f 100644 --- a/keyboards/gh60/keymaps/dbroqua/config.h +++ b/keyboards/gh60/keymaps/dbroqua/config.h @@ -158,26 +158,19 @@ along with this program. If not, see . /* * RGB Underglow * These settings are for the F4 by default: - * * - * #define ws2812_PORTREG PORTF - * #define ws2812_DDRREG DDRF + * * #define ws2812_pin PF4 * #define RGBLED_NUM 14 // Number of LEDs * #define RGBLIGHT_HUE_STEP 10 * #define RGBLIGHT_SAT_STEP 17 * #define RGBLIGHT_VAL_STEP 17 * - * The firmware supports 5 different light effects, and the color (hue, saturation, brightness) can be customized in most effects. - * To control the underglow, you need to modify your keymap file to assign those functions to some keys/key combinations. + * The firmware supports 5 different light effects, and the color (hue, saturation, brightness) can be customized in most effects. + * To control the underglow, you need to modify your keymap file to assign those functions to some keys/key combinations. * For details, please check this keymap. keyboard/planck/keymaps/yang/keymap.c */ -/* Deprecated code below -#define ws2812_PORTREG PORTF -#define ws2812_DDRREG DDRF -#define ws2812_pin PF4 -*/ #define RGB_DI_PIN F4 #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 11 // Number of LEDs diff --git a/keyboards/gh60/keymaps/robotmaxtron/config.h b/keyboards/gh60/keymaps/robotmaxtron/config.h index abaddb71f..925a69efe 100644 --- a/keyboards/gh60/keymaps/robotmaxtron/config.h +++ b/keyboards/gh60/keymaps/robotmaxtron/config.h @@ -161,26 +161,19 @@ along with this program. If not, see . /* * RGB Underglow * These settings are for the F4 by default: - * * - * #define ws2812_PORTREG PORTF - * #define ws2812_DDRREG DDRF + * * #define ws2812_pin PF4 * #define RGBLED_NUM 14 // Number of LEDs * #define RGBLIGHT_HUE_STEP 10 * #define RGBLIGHT_SAT_STEP 17 * #define RGBLIGHT_VAL_STEP 17 * - * The firmware supports 5 different light effects, and the color (hue, saturation, brightness) can be customized in most effects. - * To control the underglow, you need to modify your keymap file to assign those functions to some keys/key combinations. + * The firmware supports 5 different light effects, and the color (hue, saturation, brightness) can be customized in most effects. + * To control the underglow, you need to modify your keymap file to assign those functions to some keys/key combinations. * For details, please check this keymap. keyboard/planck/keymaps/yang/keymap.c */ -/* Deprecated code below -#define ws2812_PORTREG PORTF -#define ws2812_DDRREG DDRF -#define ws2812_pin PF4 -*/ #define RGB_DI_PIN F4 #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 8 // Number of LEDs diff --git a/keyboards/handwired/dactyl_manuform/config.h b/keyboards/handwired/dactyl_manuform/config.h index 19cd356d8..320ce3c48 100644 --- a/keyboards/handwired/dactyl_manuform/config.h +++ b/keyboards/handwired/dactyl_manuform/config.h @@ -53,7 +53,7 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 12 // Number of LEDs @@ -74,5 +74,3 @@ along with this program. If not, see . //#define NO_ACTION_ONESHOT //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION - - diff --git a/keyboards/handwired/qc60/proto/config.h b/keyboards/handwired/qc60/proto/config.h index 81466b019..8c21fa926 100644 --- a/keyboards/handwired/qc60/proto/config.h +++ b/keyboards/handwired/qc60/proto/config.h @@ -10,5 +10,3 @@ /* ws2812 RGB LED */ #define RGB_DI_PIN D3 #define RGBLED_NUM 1 // Number of LEDs -// #define ws2812_PORTREG PORTD -// #define ws2812_DDRREG DDRD diff --git a/keyboards/helix/pico/config.h b/keyboards/helix/pico/config.h index 41edfcbc2..b8822e227 100644 --- a/keyboards/helix/pico/config.h +++ b/keyboards/helix/pico/config.h @@ -83,10 +83,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + //#define RGBLED_NUM 12 // Number of LEDs. see ./keymaps/default/config.h -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD // Helix keyboard RGB LED support //#define RGBLIGHT_ANIMATIONS : see ./rules.mk: LED_ANIMATIONS = yes or no diff --git a/keyboards/helix/rev1/config.h b/keyboards/helix/rev1/config.h index 7fec62fc8..07b5c4f6f 100644 --- a/keyboards/helix/rev1/config.h +++ b/keyboards/helix/rev1/config.h @@ -74,11 +74,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER -#define RGBLED_NUM 12 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD +#define RGBLED_NUM 12 // Number of LEDs /* * Feature disable options * These options are also useful to firmware size reduction. diff --git a/keyboards/helix/rev2/config.h b/keyboards/helix/rev2/config.h index b354d312d..f7d35b371 100644 --- a/keyboards/helix/rev2/config.h +++ b/keyboards/helix/rev2/config.h @@ -87,10 +87,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + //#define RGBLED_NUM 12 // Number of LEDs. see ./keymaps/default/config.h -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD // Helix keyboard RGB LED support //#define RGBLIGHT_ANIMATIONS : see ./rules.mk: LED_ANIMATIONS = yes or no diff --git a/keyboards/iris/rev1/config.h b/keyboards/iris/rev1/config.h index cc7f2d8d4..3c088f671 100644 --- a/keyboards/iris/rev1/config.h +++ b/keyboards/iris/rev1/config.h @@ -63,7 +63,7 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 12 // Number of LEDs /* diff --git a/keyboards/iris/rev1_led/config.h b/keyboards/iris/rev1_led/config.h index e9eac2455..d8571f8da 100644 --- a/keyboards/iris/rev1_led/config.h +++ b/keyboards/iris/rev1_led/config.h @@ -63,7 +63,7 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 12 // Number of LEDs /* diff --git a/keyboards/iris/rev2/config.h b/keyboards/iris/rev2/config.h index 368d21c98..087e0f69e 100644 --- a/keyboards/iris/rev2/config.h +++ b/keyboards/iris/rev2/config.h @@ -63,7 +63,7 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 12 // Number of LEDs /* diff --git a/keyboards/iris/rev3/config.h b/keyboards/iris/rev3/config.h index 7f68180c2..3329a4edb 100644 --- a/keyboards/iris/rev3/config.h +++ b/keyboards/iris/rev3/config.h @@ -63,7 +63,7 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN F7 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 12 // Number of LEDs /* diff --git a/keyboards/lets_split/keymaps/zer09/config.h b/keyboards/lets_split/keymaps/zer09/config.h index 73438d8a9..14be4ccc5 100644 --- a/keyboards/lets_split/keymaps/zer09/config.h +++ b/keyboards/lets_split/keymaps/zer09/config.h @@ -52,8 +52,6 @@ along with this program. If not, see . /* ws2812 RGB LED */ #undef RGBLED_NUM #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 50 -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD #endif diff --git a/keyboards/lets_split/rev1/config.h b/keyboards/lets_split/rev1/config.h index 73f90e715..c0e4d1fbc 100644 --- a/keyboards/lets_split/rev1/config.h +++ b/keyboards/lets_split/rev1/config.h @@ -60,10 +60,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 16 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD /* * Feature disable options diff --git a/keyboards/lets_split/rev2/config.h b/keyboards/lets_split/rev2/config.h index 1c48f38e0..1ff25cd48 100644 --- a/keyboards/lets_split/rev2/config.h +++ b/keyboards/lets_split/rev2/config.h @@ -60,10 +60,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 12 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD /* * Feature disable options diff --git a/keyboards/lets_split/sockets/config.h b/keyboards/lets_split/sockets/config.h index d004b26bd..a45cdd13b 100644 --- a/keyboards/lets_split/sockets/config.h +++ b/keyboards/lets_split/sockets/config.h @@ -60,10 +60,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D4 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 12 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD /* Audio settings */ #ifdef AUDIO_ENABLE diff --git a/keyboards/levinson/rev1/config.h b/keyboards/levinson/rev1/config.h index 52a644e82..8161b4e32 100644 --- a/keyboards/levinson/rev1/config.h +++ b/keyboards/levinson/rev1/config.h @@ -53,7 +53,7 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 12 // Number of LEDs /* Backlight LEDs */ diff --git a/keyboards/levinson/rev2/config.h b/keyboards/levinson/rev2/config.h index 4845c935e..03b98b45c 100644 --- a/keyboards/levinson/rev2/config.h +++ b/keyboards/levinson/rev2/config.h @@ -53,7 +53,7 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 12 // Number of LEDs /* Backlight LEDs */ diff --git a/keyboards/lily58/rev1/config.h b/keyboards/lily58/rev1/config.h index 9413e8d4a..a991e8832 100644 --- a/keyboards/lily58/rev1/config.h +++ b/keyboards/lily58/rev1/config.h @@ -24,7 +24,7 @@ along with this program. If not, see . /* USB Device descriptor parameter */ #define VENDOR_ID 0xFC51 -#define PRODUCT_ID 0x0058 +#define PRODUCT_ID 0x0058 #define DEVICE_VER 0x0100 #define MANUFACTURER F_YUUCHI #define PRODUCT Lily58 @@ -62,10 +62,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 14 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD /* * Feature disable options @@ -83,4 +81,4 @@ along with this program. If not, see . //#define NO_ACTION_TAPPING //#define NO_ACTION_ONESHOT //#define NO_ACTION_MACRO -//#define NO_ACTION_FUNCTION \ No newline at end of file +//#define NO_ACTION_FUNCTION diff --git a/keyboards/meira/config.h b/keyboards/meira/config.h index 5e9dd6837..ff39f90eb 100644 --- a/keyboards/meira/config.h +++ b/keyboards/meira/config.h @@ -42,7 +42,7 @@ along with this program. If not, see . #ifdef RGBLIGHT_ENABLE #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 15 // Number of LEDs #endif diff --git a/keyboards/minidox/keymaps/alairock/config.h b/keyboards/minidox/keymaps/alairock/config.h index 3649fdd12..6b0069f4b 100644 --- a/keyboards/minidox/keymaps/alairock/config.h +++ b/keyboards/minidox/keymaps/alairock/config.h @@ -30,7 +30,7 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D7 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 8 // Number of LEDs #define RGBLIGHT_ANIMATIONS #define RGBLIGHT_HUE_STEP 10 diff --git a/keyboards/minidox/keymaps/that_canadian/config.h b/keyboards/minidox/keymaps/that_canadian/config.h index 5832d1866..b85609127 100644 --- a/keyboards/minidox/keymaps/that_canadian/config.h +++ b/keyboards/minidox/keymaps/that_canadian/config.h @@ -29,7 +29,7 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D7 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 8 // Number of LEDs #define RGBLIGHT_ANIMATIONS #define RGBLIGHT_HUE_STEP 10 diff --git a/keyboards/minidox/keymaps/xyverz/config.h b/keyboards/minidox/keymaps/xyverz/config.h index 6d7b6256a..ae26f9499 100644 --- a/keyboards/minidox/keymaps/xyverz/config.h +++ b/keyboards/minidox/keymaps/xyverz/config.h @@ -29,7 +29,7 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D7 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 8 // Number of LEDs #define RGBLIGHT_ANIMATIONS #define RGBLIGHT_HUE_STEP 10 diff --git a/keyboards/mint60/config.h b/keyboards/mint60/config.h index 51c586e63..a762c5ffe 100644 --- a/keyboards/mint60/config.h +++ b/keyboards/mint60/config.h @@ -152,10 +152,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 8 -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD #define RGBLIGHT_HUE_STEP 10 #define RGBLIGHT_SAT_STEP 17 diff --git a/keyboards/miuni32/config.h b/keyboards/miuni32/config.h index 9f26b2291..a56a818f5 100644 --- a/keyboards/miuni32/config.h +++ b/keyboards/miuni32/config.h @@ -24,7 +24,7 @@ along with this program. If not, see . #define VENDOR_ID 0xFEED #define PRODUCT_ID 0x6060 #define DEVICE_VER 0x0001 -#define MANUFACTURER Bigtuna.io +#define MANUFACTURER Bigtuna.io #define PRODUCT Miuni32 #define DESCRIPTION A custom keyboard for writers @@ -48,7 +48,7 @@ along with this program. If not, see . /* COL2ROW or ROW2COL */ #define DIODE_DIRECTION ROW2COL - + // #define BACKLIGHT_PIN B7 // #define BACKLIGHT_BREATHING // #define BACKLIGHT_LEVELS 3 @@ -159,9 +159,8 @@ along with this program. If not, see . //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION -#define RGBLIGHT_TIMER + #define RGB_DI_PIN D0 // The pin your RGB strip is wired to -#define RGBLIGHT_TIMER // Require for fancier stuff (not compatible with audio) #define RGBLED_NUM 7 // Number of LEDs #define RGBLIGHT_ANIMATIONS #define RGBLIGHT_HUE_STEP 10 diff --git a/keyboards/nyquist/rev1/config.h b/keyboards/nyquist/rev1/config.h index 61bcb80e2..eec084ecc 100644 --- a/keyboards/nyquist/rev1/config.h +++ b/keyboards/nyquist/rev1/config.h @@ -61,10 +61,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 16 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD /* * Feature disable options diff --git a/keyboards/nyquist/rev2/config.h b/keyboards/nyquist/rev2/config.h index 75d2e9393..ab062c920 100644 --- a/keyboards/nyquist/rev2/config.h +++ b/keyboards/nyquist/rev2/config.h @@ -58,7 +58,7 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 16 // Number of LEDs /* Backlight LEDs */ diff --git a/keyboards/orthodox/rev1/config.h b/keyboards/orthodox/rev1/config.h index 98c24c8c0..03936e737 100644 --- a/keyboards/orthodox/rev1/config.h +++ b/keyboards/orthodox/rev1/config.h @@ -70,10 +70,7 @@ along with this program. If not, see . /* ws2812 RGB LED */ //#define RGB_DI_PIN D3 -//#define RGBLIGHT_TIMER //#define RGBLED_NUM 16 // Number of LEDs -//#define ws2812_PORTREG PORTD -//#define ws2812_DDRREG DDRD /* * Feature disable options diff --git a/keyboards/orthodox/rev3/config.h b/keyboards/orthodox/rev3/config.h index 851499176..2e4018e91 100644 --- a/keyboards/orthodox/rev3/config.h +++ b/keyboards/orthodox/rev3/config.h @@ -75,10 +75,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ //#define RGB_DI_PIN D3 -//#define RGBLIGHT_TIMER + //#define RGBLED_NUM 16 // Number of LEDs -//#define ws2812_PORTREG PORTD -//#define ws2812_DDRREG DDRD /* * Feature disable options diff --git a/keyboards/orthodox/rev3_teensy/config.h b/keyboards/orthodox/rev3_teensy/config.h index daba627fa..e2e693079 100644 --- a/keyboards/orthodox/rev3_teensy/config.h +++ b/keyboards/orthodox/rev3_teensy/config.h @@ -67,10 +67,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ //#define RGB_DI_PIN D3 -//#define RGBLIGHT_TIMER + //#define RGBLED_NUM 16 // Number of LEDs -//#define ws2812_PORTREG PORTD -//#define ws2812_DDRREG DDRD /* * Feature disable options diff --git a/keyboards/preonic/keymaps/zach/config.h b/keyboards/preonic/keymaps/zach/config.h index 40a083da3..25f88afdc 100644 --- a/keyboards/preonic/keymaps/zach/config.h +++ b/keyboards/preonic/keymaps/zach/config.h @@ -65,7 +65,7 @@ along with this program. If not, see . /* ws2812 RGB LED */ //#define RGB_DI_PIN D1 -//#define RGBLIGHT_TIMER + //#define RGBLED_NUM 28 // Number of LEDs //#define RGBLIGHT_HUE_STEP 10 //#define RGBLIGHT_SAT_STEP 17 diff --git a/keyboards/qwertyydox/config.h b/keyboards/qwertyydox/config.h index 5c4f8a6b2..b22ca534e 100644 --- a/keyboards/qwertyydox/config.h +++ b/keyboards/qwertyydox/config.h @@ -64,10 +64,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D6 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 12 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD /* * Feature disable options diff --git a/keyboards/qwertyydox/rev1/config.h b/keyboards/qwertyydox/rev1/config.h index c5c4daa3d..3d4c9b0d0 100644 --- a/keyboards/qwertyydox/rev1/config.h +++ b/keyboards/qwertyydox/rev1/config.h @@ -64,10 +64,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D6 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 12 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD /* diff --git a/keyboards/redox/rev1/config.h b/keyboards/redox/rev1/config.h index f8041f235..fe951f722 100644 --- a/keyboards/redox/rev1/config.h +++ b/keyboards/redox/rev1/config.h @@ -62,10 +62,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 14 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD /* * Feature disable options diff --git a/keyboards/the_ruler/config.h b/keyboards/the_ruler/config.h index 16135bbd1..e72875c76 100644 --- a/keyboards/the_ruler/config.h +++ b/keyboards/the_ruler/config.h @@ -155,9 +155,8 @@ along with this program. If not, see . //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION -#define RGBLIGHT_TIMER + #define RGB_DI_PIN E6 // The pin your RGB strip is wired to -#define RGBLIGHT_TIMER // Require for fancier stuff (not compatible with audio) #define RGBLED_NUM 1 // Number of LEDs #define RGBLIGHT_ANIMATIONS #define RGBLIGHT_HUE_STEP 10 diff --git a/keyboards/vitamins_included/rev1/config.h b/keyboards/vitamins_included/rev1/config.h index 26023bfea..0347477ee 100644 --- a/keyboards/vitamins_included/rev1/config.h +++ b/keyboards/vitamins_included/rev1/config.h @@ -59,10 +59,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN F0 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 16 // Number of LEDs -#define ws2812_PORTREG PORTF -#define ws2812_DDRREG DDRF #define RGBLIGHT_ANIMATIONS /* Audio settings */ diff --git a/keyboards/viterbi/rev1/config.h b/keyboards/viterbi/rev1/config.h index 3400ea31a..d6a66408e 100644 --- a/keyboards/viterbi/rev1/config.h +++ b/keyboards/viterbi/rev1/config.h @@ -61,10 +61,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 16 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD /* * Feature disable options diff --git a/keyboards/wavelet/config.h b/keyboards/wavelet/config.h index 4e45ef8e1..ac6c96696 100644 --- a/keyboards/wavelet/config.h +++ b/keyboards/wavelet/config.h @@ -53,7 +53,7 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 12 // Number of LEDs /* Backlight LEDs */ diff --git a/keyboards/zen/rev1/config.h b/keyboards/zen/rev1/config.h index efae55892..890d30757 100644 --- a/keyboards/zen/rev1/config.h +++ b/keyboards/zen/rev1/config.h @@ -65,10 +65,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D1 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 16 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD /* * Feature disable options From ab3fbfdb3b36533125f520b540212a88349ceae6 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 22 Oct 2018 10:13:08 -0700 Subject: [PATCH 336/788] Update hardware config warnings to be more accurate Closes #3565 --- docs/hardware_avr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/hardware_avr.md b/docs/hardware_avr.md index 4d81a23d7..2c3652a02 100644 --- a/docs/hardware_avr.md +++ b/docs/hardware_avr.md @@ -66,7 +66,7 @@ Do change the `MANUFACTURER`, `PRODUCT`, and `DESCRIPTION` lines to accurately r #define DESCRIPTION A custom keyboard ``` -?> Note: On Windows and macOS the `MANUFACTURER`, `PRODUCT`, and `DESCRIPTION` fields will be displayed in the list of USB devices. On Linux these values will not be visible in `lsusb`, since Linux takes that information from the list published by the USB-IF. +?> Note: On Windows and macOS the `MANUFACTURER`, `PRODUCT`, and `DESCRIPTION` fields will be displayed in the list of USB devices. ?> On Linux these values will not be visible in lsusb by default, since Linux takes the information from the list maintained by [USB ID Repository](http://www.linux-usb.org/usb-ids.html) by default. lsusb will show the information reported by the device when executed with -v option. It is also present in kernel logs after plugging in the device. ### Keyboard Matrix Configuration From 9374c0c9db317932d78356b2f92a7993145ea9a2 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 22 Oct 2018 11:57:15 -0700 Subject: [PATCH 337/788] Add caveats for shifted characters (#4192) * Add caveats for shifted characters And some formatting and grammar corrections. Closes #1037 * Fix spelling of remote * Fix spelling error * Remote not Remove * Remote not Remove --- docs/feature_advanced_keycodes.md | 20 ++++++++++++++------ docs/keycodes_us_ansi_shifted.md | 4 ++++ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/docs/feature_advanced_keycodes.md b/docs/feature_advanced_keycodes.md index 15109e545..85f4fa1bf 100644 --- a/docs/feature_advanced_keycodes.md +++ b/docs/feature_advanced_keycodes.md @@ -2,7 +2,7 @@ Your keymap can include keycodes that are more advanced than normal, for example keys that switch layers or send modifiers when held, but send regular keycodes when tapped. This page documents the functions that are available to you. -### Assigning Custom Names +## Assigning Custom Names People often define custom names using `#define`. For example: @@ -13,7 +13,7 @@ People often define custom names using `#define`. For example: This will allow you to use `FN_CAPS` and `ALT_TAB` in your `KEYMAP()`, keeping it more readable. -### Caveats +## Caveats Currently, `LT()` and `MT()` are limited to the [Basic Keycode set](keycodes_basic.md), meaning you can't use keycodes like `LCTL()`, `KC_TILD`, or anything greater than `0xFF`. Modifiers specified as part of a Layer Tap or Mod Tap's keycode will be ignored. @@ -36,7 +36,7 @@ These functions allow you to activate layers in various ways. Note that layers a Care must be taken when switching layers, it's possible to lock yourself into a layer with no way to deactivate that layer (without unplugging your keyboard.) We've created some guidelines to help users avoid the most common problems. -### Beginners +## Beginners If you are just getting started with QMK you will want to keep everything simple. Follow these guidelines when setting up your layers: @@ -44,11 +44,11 @@ If you are just getting started with QMK you will want to keep everything simple * Arrange your layers in a "tree" layout, with layer 0 as the root. Do not try to enter the same layer from more than one other layer. * In a layer's keymap, only reference higher-numbered layers. Because layers are processed from the highest-numbered (topmost) active layer down, modifying the state of lower layers can be tricky and error-prone. -### Intermediate Users +## Intermediate Users Sometimes you need more than one base layer. For example, if you want to switch between QWERTY and Dvorak, switch between layouts for different countries, or switch your layout for different videogames. Your base layers should always be the lowest numbered layers. When you have multiple base layers you should always treat them as mutually exclusive. When one base layer is on the others are off. -### Advanced Users +## Advanced Users Once you have a good feel for how layers work and what you can do, you can get more creative. The rules listed in the beginner section will help you be successful by avoiding some of the tricker details but they can be constraining, especially for ultra-compact keyboard users. Understanding how layers work will allow you to use them in more advanced ways. @@ -126,6 +126,14 @@ For convenience, QMK includes some Mod-Tap shortcuts to make common combinations |`SGUI_T(kc)`|`SCMD_T(kc)`, `SWIN_T(kc)` |Left Shift and GUI when held, `kc` when tapped | |`LCA_T(kc)` | |Left Control and Alt when held, `kc` when tapped | +## Caveats + +Unfortunately, these keycodes cannot be used in Mod-Taps or Layer-Taps, since any modifiers specified in the keycode are ignored. + +Additionally, you may run into issues when using Remote Desktop Connection on Windows. Because these codes send shift very fast, Remote Desktop may miss the codes. + +To fix this, open Remote Desktop Connection, click on "Show Options", open the the "Local Resources" tab. In the keyboard section, change the drop down to "On this Computer". This will fix the issue, and allow the characters to work correctly. + # One Shot Keys One shot keys are keys that remain active until the next key is pressed, and then are released. This allows you to type keyboard combinations without pressing more than one key at a time. These keys are usually called "Sticky keys" or "Dead keys". @@ -146,7 +154,7 @@ You can control the behavior of one shot keys by defining these in `config.h`: Sometimes, you want to activate a one-shot layer as part of a macro or tap dance routine. To do this, you need to call `set_oneshot_layer(LAYER, ONESHOT_START)` on key down, and `set_oneshot_layer(ONESHOT_PRESSED)` on key up. If you want to cancel the oneshot, call `reset_oneshot_layer()`. For more complicated actions, take a look at the oneshot implementation in [`process_record`](https://github.com/qmk/qmk_firmware/blob/master/tmk_core/common/action.c#L429). -If you're having issues with OSM translating over Remote Desktop Connection, this can be fixed by opening the settings, going to the "Local Resources" tap, and in the keyboard section, change the drop down to "On this Computer". This will fix the issue and allow OSM to function properly over Remote Desktop. +If you're having issues with OSM translating over Remote Desktop Connection, this can be fixed by clicking on "Show Options", going to the "Local Resources" tab, and in the keyboard section, change the drop down to "On this Computer". This will fix the issue and allow OSM to function properly over Remote Desktop. # Permissive Hold diff --git a/docs/keycodes_us_ansi_shifted.md b/docs/keycodes_us_ansi_shifted.md index e7abaa709..41d603592 100644 --- a/docs/keycodes_us_ansi_shifted.md +++ b/docs/keycodes_us_ansi_shifted.md @@ -6,6 +6,10 @@ These keycodes correspond to characters that are "shifted" on a standard US ANSI Unfortunately, these keycodes cannot be used in Mod-Taps or Layer-Taps, since any modifiers specified in the keycode are ignored. +Additionally, you may run into issues when using Remote Desktop Connection on Windows. Because these codes send shift very fast, Remote Desktop may miss the codes. + +To fix this, open Remote Desktop Connection, click on "Show Options", open the the "Local Resources" tab. In the keyboard section, change the drop down to "On this Computer". This will fix the issue, and allow the characters to work correctly. + ## Keycodes |Key |Aliases |Description | From a2b650df474420b2003978fbf391393b2cccbd33 Mon Sep 17 00:00:00 2001 From: Michael MacDougall Date: Mon, 22 Oct 2018 14:59:40 -0400 Subject: [PATCH 338/788] Keymap: Add mmacdougall keymap (#3852) * Add mmacdougall keymap * Make requested changes --- .../levinson/keymaps/mmacdougall/README.md | 21 ++ .../keymaps/mmacdougall/keymap/config.h | 20 ++ .../keymaps/mmacdougall/keymap/keymap.c | 201 ++++++++++++++++++ .../keymaps/mmacdougall/keymap/rules.mk | 2 + 4 files changed, 244 insertions(+) create mode 100644 keyboards/levinson/keymaps/mmacdougall/README.md create mode 100644 keyboards/levinson/keymaps/mmacdougall/keymap/config.h create mode 100644 keyboards/levinson/keymaps/mmacdougall/keymap/keymap.c create mode 100644 keyboards/levinson/keymaps/mmacdougall/keymap/rules.mk diff --git a/keyboards/levinson/keymaps/mmacdougall/README.md b/keyboards/levinson/keymaps/mmacdougall/README.md new file mode 100644 index 000000000..bae8c8a4b --- /dev/null +++ b/keyboards/levinson/keymaps/mmacdougall/README.md @@ -0,0 +1,21 @@ +mmacdougall's Levinson Layout +============================ + +Similar to default layout, however RGB & backlight controls are mapped to adjust layer + +## Layouts + +### Adjust (Lower + Raise) + +``` +/* Adjust (Lower + Raise) + ,-----------------------------------------------------------------------------------. + | | Reset| | | | | | | | | | Del | + |------+------+------+------+------+-------------+------+------+------+------+------| + | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | + |------+------+------+------+------+------|------+------+------+------+------+------| + |B Step|RGB Tg|RGB Md|Hue Up|Hue Dn|Sat Up|Sat Dn|Val Up|Val Dn| | | | + |------+------+------+------+------+------+------+------+------+------+------+------| + | | | | | | | | | | | | + `-----------------------------------------------------------------------------------' +``` diff --git a/keyboards/levinson/keymaps/mmacdougall/keymap/config.h b/keyboards/levinson/keymaps/mmacdougall/keymap/config.h new file mode 100644 index 000000000..63dd5bc88 --- /dev/null +++ b/keyboards/levinson/keymaps/mmacdougall/keymap/config.h @@ -0,0 +1,20 @@ +#pragma once + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + + +#undef RGBLED_NUM +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 12 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 diff --git a/keyboards/levinson/keymaps/mmacdougall/keymap/keymap.c b/keyboards/levinson/keymaps/mmacdougall/keymap/keymap.c new file mode 100644 index 000000000..dec47a761 --- /dev/null +++ b/keyboards/levinson/keymaps/mmacdougall/keymap/keymap.c @@ -0,0 +1,201 @@ +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _LOWER 3 +#define _RAISE 4 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + LOWER, + RAISE, + ADJUST, +}; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = LAYOUT_ortho_4x12( \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ + ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Colemak + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | R | S | T | D | H | N | E | I | O | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_COLEMAK] = LAYOUT_ortho_4x12( \ + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, \ + KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ + ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Dvorak + * ,-----------------------------------------------------------------------------------. + * | Tab | " | , | . | P | Y | F | G | C | R | L | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | O | E | U | I | D | H | T | N | S | / | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_DVORAK] = LAYOUT_ortho_4x12( \ + KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, \ + KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, \ + KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT , \ + ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | | \ | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT_ortho_4x12( \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT_ortho_4x12( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | Reset| | | | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * |B Step|RGB Tg|RGB Md|Hue Up|Hue Dn|Sat Up|Sat Dn|Val Up|Val Dn| | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = LAYOUT_ortho_4x12( \ + _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ + _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ + BL_STEP, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ +) + + +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_qwerty); + #endif + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_colemak); + #endif + set_single_persistent_default_layer(_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_dvorak); + #endif + set_single_persistent_default_layer(_DVORAK); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + break; + } + return true; +} diff --git a/keyboards/levinson/keymaps/mmacdougall/keymap/rules.mk b/keyboards/levinson/keymaps/mmacdougall/keymap/rules.mk new file mode 100644 index 000000000..d7463419b --- /dev/null +++ b/keyboards/levinson/keymaps/mmacdougall/keymap/rules.mk @@ -0,0 +1,2 @@ +RGBLIGHT_ENABLE = yes +BACKLIGHT_ENABLE = yes From 47dcda1087a2aa3bbb46d69c5cf682bf45650a8b Mon Sep 17 00:00:00 2001 From: Levi Olson Date: Mon, 22 Oct 2018 14:04:28 -0500 Subject: [PATCH 339/788] Diverge3 - Workman Layout (#3682) * Diverge3: Workman Programmers Layout * Diverge3: Comment Removal * Diverge3: Image Links Fixed * Diverge3: Images added * Diverge3: Images cleaned up * Diverge3: Images cleaned up * Diverge3: Removing Images * Diverge3: Improving readme.md * Diverge3: Improving readme.md * Diverge3: Add supporting Comments * Diverge3: Update readme * Diverge3: Update readme * Diverge3: Updates per comments in PR * Diverge3: Updates per comments in PR * Diverge3: Updates per comments in PR * Diverge3: Updates per comments in PR * Diverge3: Updates per comments in PR * Diverge3: Updates per comments in PR --- keyboards/diverge3/.gitignore | 1 + keyboards/diverge3/config.h | 9 +- keyboards/diverge3/keymaps/workman/config.h | 5 + keyboards/diverge3/keymaps/workman/keymap.c | 212 +++++++++++++++++++ keyboards/diverge3/keymaps/workman/readme.md | 21 ++ keyboards/diverge3/keymaps/workman/rules.mk | 1 + keyboards/diverge3/readme.md | 6 +- 7 files changed, 250 insertions(+), 5 deletions(-) create mode 100644 keyboards/diverge3/.gitignore create mode 100644 keyboards/diverge3/keymaps/workman/config.h create mode 100644 keyboards/diverge3/keymaps/workman/keymap.c create mode 100644 keyboards/diverge3/keymaps/workman/readme.md create mode 100644 keyboards/diverge3/keymaps/workman/rules.mk diff --git a/keyboards/diverge3/.gitignore b/keyboards/diverge3/.gitignore new file mode 100644 index 000000000..722d5e71d --- /dev/null +++ b/keyboards/diverge3/.gitignore @@ -0,0 +1 @@ +.vscode diff --git a/keyboards/diverge3/config.h b/keyboards/diverge3/config.h index db3c6a6f7..f3ed06739 100644 --- a/keyboards/diverge3/config.h +++ b/keyboards/diverge3/config.h @@ -31,7 +31,9 @@ along with this program. If not, see . /* key matrix size */ #define MATRIX_ROWS 10 #define MATRIX_COLS 8 -// SERIAL is the only supported +// Only SERIAL is currently supported +// By converting this to use I2C, backlight +// would/should be fully functional as well #define USE_SERIAL /* @@ -51,7 +53,7 @@ along with this program. If not, see . /* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ #define DIODE_DIRECTION ROW2COL -// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_PIN C6 // #define BACKLIGHT_BREATHING // #define BACKLIGHT_LEVELS 3 @@ -61,8 +63,7 @@ along with this program. If not, see . /* define if matrix has ghost (lacks anti-ghosting diodes) */ //#define MATRIX_HAS_GHOST - -/* number of backlight levels */ + /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ #define LOCKING_SUPPORT_ENABLE diff --git a/keyboards/diverge3/keymaps/workman/config.h b/keyboards/diverge3/keymaps/workman/config.h new file mode 100644 index 000000000..9829a604f --- /dev/null +++ b/keyboards/diverge3/keymaps/workman/config.h @@ -0,0 +1,5 @@ +#pragma once + +// place overrides here +#define PERMISSIVE_HOLD +#define TAPPING_TERM 150 \ No newline at end of file diff --git a/keyboards/diverge3/keymaps/workman/keymap.c b/keyboards/diverge3/keymaps/workman/keymap.c new file mode 100644 index 000000000..5e681f418 --- /dev/null +++ b/keyboards/diverge3/keymaps/workman/keymap.c @@ -0,0 +1,212 @@ +/* Copyright 2017 IslandMan93 + * + * 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 . + */ +#include QMK_KEYBOARD_H + +// KEYMAP +extern keymap_config_t keymap_config; + +#define _WORKMAN_P 0 +#define _GAME 1 +#define _RAISE 2 + +#define _______ KC_TRNS + +#define SHIFT_MOD MOD_BIT(KC_LSFT) +#define SPACE_RAISE LT(_RAISE, KC_SPC) +#define ENT_RAISE LT(_RAISE, KC_ENT) +#define PAGE_PREV S(LCTL(KC_TAB)) +#define PAGE_NEXT LCTL(KC_TAB) + +enum custom_keycodes +{ + LO_BSPC = SAFE_RANGE, + LO_1, + LO_2, + LO_3, + LO_4, + LO_5, + LO_6, + LO_7, + LO_8, + LO_9, + LO_0, +}; + +bool process_record_user(uint16_t keycode, keyrecord_t* record) +{ + if (record->event.pressed) { + switch (keycode) { + case LO_BSPC: + if (record->event.pressed) { + if (get_mods() & SHIFT_MOD) { + uint8_t current_mods = get_mods(); + clear_mods(); + SEND_STRING(SS_TAP(X_DELETE)); + set_mods(current_mods); + } else { + SEND_STRING(SS_TAP(X_BSPACE)); + } + } + return false; + case LO_1: + if (record->event.pressed) { + uint8_t current_mods = get_mods(); + if (current_mods & SHIFT_MOD) { + clear_mods(); + SEND_STRING("1"); + set_mods(current_mods); + } else { + SEND_STRING("!"); + } + } + return false; + case LO_2: + if (record->event.pressed) { + uint8_t current_mods = get_mods(); + if (current_mods & SHIFT_MOD) { + clear_mods(); + SEND_STRING("2"); + set_mods(current_mods); + } else { + SEND_STRING("@"); + } + } + return false; + case LO_3: + if (record->event.pressed) { + uint8_t current_mods = get_mods(); + if (current_mods & SHIFT_MOD) { + clear_mods(); + SEND_STRING("3"); + set_mods(current_mods); + } else { + SEND_STRING("#"); + } + } + return false; + case LO_4: + if (record->event.pressed) { + uint8_t current_mods = get_mods(); + if (current_mods & SHIFT_MOD) { + clear_mods(); + SEND_STRING("4"); + set_mods(current_mods); + } else { + SEND_STRING("$"); + } + } + return false; + case LO_5: + if (record->event.pressed) { + uint8_t current_mods = get_mods(); + if (current_mods & SHIFT_MOD) { + clear_mods(); + SEND_STRING("5"); + set_mods(current_mods); + } else { + SEND_STRING("%"); + } + } + return false; + case LO_6: + if (record->event.pressed) { + uint8_t current_mods = get_mods(); + if (current_mods & SHIFT_MOD) { + clear_mods(); + SEND_STRING("6"); + set_mods(current_mods); + } else { + SEND_STRING("^"); + } + } + return false; + case LO_7: + if (record->event.pressed) { + uint8_t current_mods = get_mods(); + if (current_mods & SHIFT_MOD) { + clear_mods(); + SEND_STRING("7"); + set_mods(current_mods); + } else { + SEND_STRING("&"); + } + } + return false; + case LO_8: + if (record->event.pressed) { + uint8_t current_mods = get_mods(); + if (current_mods & SHIFT_MOD) { + clear_mods(); + SEND_STRING("8"); + set_mods(current_mods); + } else { + SEND_STRING("*"); + } + } + return false; + case LO_9: + if (record->event.pressed) { + uint8_t current_mods = get_mods(); + if (current_mods & SHIFT_MOD) { + clear_mods(); + SEND_STRING("9"); + set_mods(current_mods); + } else { + SEND_STRING("("); + } + } + return false; + case LO_0: + if (record->event.pressed) { + uint8_t current_mods = get_mods(); + if (current_mods & SHIFT_MOD) { + clear_mods(); + SEND_STRING("0"); + set_mods(current_mods); + } else { + SEND_STRING(")"); + } + } + return false; + } + } + return true; +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_WORKMAN_P] = LAYOUT( + KC_ESC, LO_1, LO_2, LO_3, LO_4, LO_5, LO_6, LO_6, LO_7, LO_8, LO_9, LO_0, KC_MINS, KC_ESC, + KC_GRV, KC_Q, KC_D, KC_R, KC_W, KC_B, KC_LPRN, KC_RPRN, KC_J, KC_F, KC_U, KC_P, KC_SCLN, KC_EQL, + KC_TAB, KC_A, KC_S, KC_H, KC_T, KC_G, KC_LCBR, KC_RCBR, KC_Y, KC_N, KC_E, KC_O, KC_I, KC_BSLS, + KC_LCTL, KC_Z, KC_X, KC_M, KC_C, KC_V, KC_LBRC, KC_RBRC, KC_K, KC_L, KC_COMM, KC_DOT, KC_SLSH, KC_QUOT, + KC_LSFT, RESET, PAGE_PREV, PAGE_NEXT, KC_END, KC_LGUI, KC_LALT, TG(_GAME), LO_BSPC, ENT_RAISE, SPACE_RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_RCTL), + + [_GAME] = LAYOUT( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_ESC, + KC_GRV, KC_Q, KC_D, KC_R, KC_W, KC_B, KC_LPRN, KC_RPRN, KC_J, KC_F, KC_U, KC_P, KC_SCLN, KC_EQL, + KC_TAB, KC_A, KC_S, KC_H, KC_T, KC_G, KC_LCBR, KC_RCBR, KC_Y, KC_N, KC_E, KC_O, KC_I, KC_BSLS, + KC_LCTL, KC_Z, KC_X, KC_M, KC_C, KC_V, KC_LBRC, KC_RBRC, KC_K, KC_L, KC_COMM, KC_DOT, KC_SLSH, KC_QUOT, + KC_LSFT, KC_F1, KC_F2, KC_3, KC_F5, KC_SPC, KC_LALT, TG(_GAME), LO_BSPC, ENT_RAISE, SPACE_RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_RCTL), + + [_RAISE] = LAYOUT( + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, RESET, + _______, _______, _______, _______, _______, _______, BL_INC, KC_VOLU, _______, _______, _______, _______, _______, KC_F12, + _______, _______, _______, _______, _______, _______, BL_DEC, KC_VOLD, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, + _______, _______, _______, _______, _______, _______, BL_BRTG, KC_MUTE, _______, _______, KC_MPRV, KC_MNXT, KC_MPLY, _______, + _______, _______, _______, _______, _______, _______, BL_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______), + +}; \ No newline at end of file diff --git a/keyboards/diverge3/keymaps/workman/readme.md b/keyboards/diverge3/keymaps/workman/readme.md new file mode 100644 index 000000000..48ba482fe --- /dev/null +++ b/keyboards/diverge3/keymaps/workman/readme.md @@ -0,0 +1,21 @@ +# The Workman keymap for diverge3 + +Basic example of the [Workman Programming Layout](https://github.com/ojbucao/workman) which uses the `SHIFT`ed variants of the number row, by default. + +## Layer 1 - Default Layer + +Workman programming layout. + +![Workman Layout Picture](https://i.imgur.com/IOOmRfI.png) + +## Layer 2 - Gaming Layer + +Reverts the number row to the normal 1, 2, 3, etc... for better gaming compatibility. + +![Gaming Layer Picture](https://i.imgur.com/E0vmEAa.png) + +## Layer 3 - Raise Layer + +Volume and backlight controls (although backlight is not fully functional using `USE_SERIAL` in `../config.h`). + +![Raise Layer Misc Buttons Picture](https://i.imgur.com/50L3O62.png) diff --git a/keyboards/diverge3/keymaps/workman/rules.mk b/keyboards/diverge3/keymaps/workman/rules.mk new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/keyboards/diverge3/keymaps/workman/rules.mk @@ -0,0 +1 @@ + diff --git a/keyboards/diverge3/readme.md b/keyboards/diverge3/readme.md index 2ecfbca3b..43add9d99 100644 --- a/keyboards/diverge3/readme.md +++ b/keyboards/diverge3/readme.md @@ -10,7 +10,11 @@ Make example for this keyboard (after setting up your build environment): make diverge3:default +Or for the [Workman](https://github.com/ojbucao/workman) layout: + + make diverge3:workman + See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. # Reflashing Animus -Reflashing the stock firmware is pretty easy. Just follow the same steps in the [original guide](https://imgur.com/a/8UapN). You will have to manually reset the Pro Micro (by shorting the GND and RST) during the upload step. Then reapply your keymap through Arbites. \ No newline at end of file +Reflashing the stock firmware is pretty easy. Just follow the same steps in the [original guide](https://imgur.com/a/8UapN). You will have to manually reset the Pro Micro (by shorting the GND and RST pins) during the upload step. Then reapply your keymap through Arbites. \ No newline at end of file From bf57587e6203e3bcabbc161c1d45b9a6cc7abfaa Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Mon, 22 Oct 2018 12:35:09 -0700 Subject: [PATCH 340/788] Keyboard: Zlant refactor and Configurator support (#3678) * Matrix/keymap refactor White space and readability updates * Configurator support Added info.json file. * Readme update Markdown formatting * Add support for ortho_4x12 keymaps * Added planck_mit layout support * Disable SWAP_HANDS_ENABLE for zlant:wanleg keymap * Disable BACKLIGHT_ENABLE for zlant:bakingpy keymap --- keyboards/zlant/info.json | 17 +++++++ keyboards/zlant/keymaps/default/keymap.c | 22 +++++----- keyboards/zlant/readme.md | 6 +-- keyboards/zlant/rules.mk | 2 + keyboards/zlant/zlant.h | 44 +++++++++++++++---- .../community/ortho_4x12/bakingpy/rules.mk | 6 ++- layouts/community/ortho_4x12/wanleg/rules.mk | 4 ++ 7 files changed, 77 insertions(+), 24 deletions(-) create mode 100644 keyboards/zlant/info.json diff --git a/keyboards/zlant/info.json b/keyboards/zlant/info.json new file mode 100644 index 000000000..b1f20555c --- /dev/null +++ b/keyboards/zlant/info.json @@ -0,0 +1,17 @@ +{ + "keyboard_name": "Zlant", + "url": "", + "maintainer": "qmk", + "width": 12.75, + "height": 4, + "layouts": { + "LAYOUT_ortho_4x12": { + "key_count": 48, + "layout": [{"label":"K000", "x":0, "y":0}, {"label":"K001", "x":1, "y":0}, {"label":"K002", "x":2, "y":0}, {"label":"K003", "x":3, "y":0}, {"label":"K004", "x":4, "y":0}, {"label":"K005", "x":5, "y":0}, {"label":"K006", "x":6, "y":0}, {"label":"K007", "x":7, "y":0}, {"label":"K008", "x":8, "y":0}, {"label":"K009", "x":9, "y":0}, {"label":"K010", "x":10, "y":0}, {"label":"K011", "x":11, "y":0}, {"label":"K100", "x":0.25, "y":1}, {"label":"K101", "x":1.25, "y":1}, {"label":"K102", "x":2.25, "y":1}, {"label":"K103", "x":3.25, "y":1}, {"label":"K104", "x":4.25, "y":1}, {"label":"K105", "x":5.25, "y":1}, {"label":"K106", "x":6.25, "y":1}, {"label":"K107", "x":7.25, "y":1}, {"label":"K108", "x":8.25, "y":1}, {"label":"K109", "x":9.25, "y":1}, {"label":"K110", "x":10.25, "y":1}, {"label":"K111", "x":11.25, "y":1}, {"label":"K200", "x":0.5, "y":2}, {"label":"K201", "x":1.5, "y":2}, {"label":"K202", "x":2.5, "y":2}, {"label":"K203", "x":3.5, "y":2}, {"label":"K204", "x":4.5, "y":2}, {"label":"K205", "x":5.5, "y":2}, {"label":"K206", "x":6.5, "y":2}, {"label":"K207", "x":7.5, "y":2}, {"label":"K208", "x":8.5, "y":2}, {"label":"K209", "x":9.5, "y":2}, {"label":"K210", "x":10.5, "y":2}, {"label":"K211", "x":11.5, "y":2}, {"label":"K300", "x":0.75, "y":3}, {"label":"K301", "x":1.75, "y":3}, {"label":"K302", "x":2.75, "y":3}, {"label":"K303", "x":3.75, "y":3}, {"label":"K304", "x":4.75, "y":3}, {"label":"K305", "x":5.75, "y":3}, {"label":"K306", "x":6.75, "y":3}, {"label":"K307", "x":7.75, "y":3}, {"label":"K308", "x":8.75, "y":3}, {"label":"K309", "x":9.75, "y":3}, {"label":"K310", "x":10.75, "y":3}, {"label":"K311", "x":11.75, "y":3}] + }, + "LAYOUT_planck_mit": { + "key_count": 47, + "layout": [{"label":"K000", "x":0, "y":0}, {"label":"K001", "x":1, "y":0}, {"label":"K002", "x":2, "y":0}, {"label":"K003", "x":3, "y":0}, {"label":"K004", "x":4, "y":0}, {"label":"K005", "x":5, "y":0}, {"label":"K006", "x":6, "y":0}, {"label":"K007", "x":7, "y":0}, {"label":"K008", "x":8, "y":0}, {"label":"K009", "x":9, "y":0}, {"label":"K010", "x":10, "y":0}, {"label":"K011", "x":11, "y":0}, {"label":"K100", "x":0.25, "y":1}, {"label":"K101", "x":1.25, "y":1}, {"label":"K102", "x":2.25, "y":1}, {"label":"K103", "x":3.25, "y":1}, {"label":"K104", "x":4.25, "y":1}, {"label":"K105", "x":5.25, "y":1}, {"label":"K106", "x":6.25, "y":1}, {"label":"K107", "x":7.25, "y":1}, {"label":"K108", "x":8.25, "y":1}, {"label":"K109", "x":9.25, "y":1}, {"label":"K110", "x":10.25, "y":1}, {"label":"K111", "x":11.25, "y":1}, {"label":"K200", "x":0.5, "y":2}, {"label":"K201", "x":1.5, "y":2}, {"label":"K202", "x":2.5, "y":2}, {"label":"K203", "x":3.5, "y":2}, {"label":"K204", "x":4.5, "y":2}, {"label":"K205", "x":5.5, "y":2}, {"label":"K206", "x":6.5, "y":2}, {"label":"K207", "x":7.5, "y":2}, {"label":"K208", "x":8.5, "y":2}, {"label":"K209", "x":9.5, "y":2}, {"label":"K210", "x":10.5, "y":2}, {"label":"K211", "x":11.5, "y":2}, {"label":"K300", "x":0.75, "y":3}, {"label":"K301", "x":1.75, "y":3}, {"label":"K302", "x":2.75, "y":3}, {"label":"K303", "x":3.75, "y":3}, {"label":"K304", "x":4.75, "y":3, "w":1.25}, {"label":"K305", "x":6, "y":3, "w":1.5}, {"label":"K307", "x":7.5, "y":3, "w":1.25}, {"label":"K308", "x":8.75, "y":3}, {"label":"K309", "x":9.75, "y":3}, {"label":"K310", "x":10.75, "y":3}, {"label":"K311", "x":11.75, "y":3}] + } + } +} diff --git a/keyboards/zlant/keymaps/default/keymap.c b/keyboards/zlant/keymaps/default/keymap.c index d586c841d..a701a7965 100755 --- a/keyboards/zlant/keymaps/default/keymap.c +++ b/keyboards/zlant/keymaps/default/keymap.c @@ -5,16 +5,18 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [BASE] = LAYOUT( - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, - KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, - KC_ESC, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, - RGB_HUI, RGB_HUD, KC_LGUI, KC_LALT, KC_LSFT, KC_SPC, KC_SPC, MO(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT), + [BASE] = LAYOUT( + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_ESC, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, \ + RGB_HUI, RGB_HUD, KC_LGUI, KC_LALT, KC_LSFT, KC_SPC, KC_SPC, MO(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ + ), - [FN] = LAYOUT( - KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS, - KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, - KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_PGUP, KC_HOME, KC_TRNS, KC_TRNS, - RGB_VAI, RGB_VAD, RESET, KC_PSCR, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGDN, KC_END, KC_TRNS, KC_DEL) + [FN] = LAYOUT( + _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, \ + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_PGUP, KC_HOME, _______, _______, \ + RGB_VAI, RGB_VAD, RESET, KC_PSCR, _______, _______, _______, _______, KC_PGDN, KC_END, _______, KC_DEL \ + ) }; diff --git a/keyboards/zlant/readme.md b/keyboards/zlant/readme.md index 0780cedeb..8f50e6d4c 100644 --- a/keyboards/zlant/readme.md +++ b/keyboards/zlant/readme.md @@ -4,10 +4,8 @@ A compact 40% inspired by the Plank with a staggered layout instead. -Keyboard Maintainer: [Felipe Coury](https://github.com/fcoury) - -Hardware Supported: Zlant Prototype PCB - +Keyboard Maintainer: [Felipe Coury](https://github.com/fcoury) +Hardware Supported: Zlant Prototype PCB Hardware Availability: Group buy soon Make example for this keyboard (after setting up your build environment): diff --git a/keyboards/zlant/rules.mk b/keyboards/zlant/rules.mk index 482f99b22..0bc5c8aae 100755 --- a/keyboards/zlant/rules.mk +++ b/keyboards/zlant/rules.mk @@ -54,3 +54,5 @@ NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https:/ BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality AUDIO_ENABLE = no RGBLIGHT_ENABLE = yes + +LAYOUTS = ortho_4x12 planck_mit diff --git a/keyboards/zlant/zlant.h b/keyboards/zlant/zlant.h index 48c7b3f40..6310a14e3 100755 --- a/keyboards/zlant/zlant.h +++ b/keyboards/zlant/zlant.h @@ -3,16 +3,42 @@ #include "quantum.h" -#define LAYOUT( \ - K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, \ - K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, \ - K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, \ - K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311 \ +#define LAYOUT_ortho_4x12( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, \ + K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311 \ ) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011 }, \ - { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111 }, \ - { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211 }, \ - { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311 } \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111 }, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211 }, \ + { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311 } \ } +#define LAYOUT_planck_mit( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, \ + K300, K301, K302, K303, K304, K305, K307, K308, K309, K310, K311 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111 }, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211 }, \ + { K300, K301, K302, K303, K304, K305, K305, K307, K308, K309, K310, K311 } \ +} + +#define LAYOUT_kc_ortho_4x12( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, \ + K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311 \ +) LAYOUT( \ + KC_##K000, KC_##K001, KC_##K002, KC_##K003, KC_##K004, KC_##K005, KC_##K006, KC_##K007, KC_##K008, KC_##K009, KC_##K010, KC_##K011, \ + KC_##K100, KC_##K101, KC_##K102, KC_##K103, KC_##K104, KC_##K105, KC_##K106, KC_##K107, KC_##K108, KC_##K109, KC_##K110, KC_##K111, \ + KC_##K200, KC_##K201, KC_##K202, KC_##K203, KC_##K204, KC_##K205, KC_##K206, KC_##K207, KC_##K208, KC_##K209, KC_##K210, KC_##K211, \ + KC_##K300, KC_##K301, KC_##K302, KC_##K303, KC_##K304, KC_##K305, KC_##K306, KC_##K307, KC_##K308, KC_##K309, KC_##K310, KC_##K311 \ +) + +#define LAYOUT LAYOUT_ortho_4x12 + #endif diff --git a/layouts/community/ortho_4x12/bakingpy/rules.mk b/layouts/community/ortho_4x12/bakingpy/rules.mk index 0d568c401..490ebbf77 100644 --- a/layouts/community/ortho_4x12/bakingpy/rules.mk +++ b/layouts/community/ortho_4x12/bakingpy/rules.mk @@ -3,4 +3,8 @@ ifeq ($(LAYOUTS_HAS_RGB),yes) RGBLIGHT_ENABLE = yes endif AUDIO_ENABLE = no -BACKLIGHT_ENABLE = yes +ifeq ($(strip $(KEYBOARD)), zlant) + BACKLIGHT_ENABLE = no +else + BACKLIGHT_ENABLE = yes +endif diff --git a/layouts/community/ortho_4x12/wanleg/rules.mk b/layouts/community/ortho_4x12/wanleg/rules.mk index 69f377a01..fa433a6b0 100644 --- a/layouts/community/ortho_4x12/wanleg/rules.mk +++ b/layouts/community/ortho_4x12/wanleg/rules.mk @@ -7,4 +7,8 @@ endif ifeq ($(strip $(KEYBOARD)), 4x4) SWAP_HANDS_ENABLE = no +endif + +ifeq ($(strip $(KEYBOARD)), zlant) + SWAP_HANDS_ENABLE = no endif \ No newline at end of file From 6d7745a110daad815fe5edbb35a2e33702f24aaa Mon Sep 17 00:00:00 2001 From: markspanbroek Date: Mon, 22 Oct 2018 21:37:03 +0200 Subject: [PATCH 341/788] Keyboard: Port of TMK XT USB Converter (#3619) * Converter: add XT USB converter from TMK * Converter: port TMK code for USB converter to QMK * Apply requested changes after code review by @drashna - use "pragma once" instead of include guards - use LAYOUT instead of KEYMAP - allow customisation with matrix_init_user() and matrix_scan_user() - set BOOTLOADER instead of BOOTLOADER_SIZE - Add XT_ENABLE to OPT_DEFS * Remove unnecessary lines --- keyboards/converter/xt_usb/README.md | 17 + keyboards/converter/xt_usb/config.h | 78 +++++ .../converter/xt_usb/keymaps/default/config.h | 1 + .../converter/xt_usb/keymaps/default/keymap.c | 55 ++++ keyboards/converter/xt_usb/led.c | 22 ++ keyboards/converter/xt_usb/matrix.c | 309 ++++++++++++++++++ keyboards/converter/xt_usb/rules.mk | 62 ++++ keyboards/converter/xt_usb/xt_usb.c | 1 + keyboards/converter/xt_usb/xt_usb.h | 132 ++++++++ tmk_core/protocol.mk | 5 + tmk_core/protocol/xt.h | 71 ++++ tmk_core/protocol/xt_interrupt.c | 173 ++++++++++ 12 files changed, 926 insertions(+) create mode 100644 keyboards/converter/xt_usb/README.md create mode 100644 keyboards/converter/xt_usb/config.h create mode 100644 keyboards/converter/xt_usb/keymaps/default/config.h create mode 100644 keyboards/converter/xt_usb/keymaps/default/keymap.c create mode 100644 keyboards/converter/xt_usb/led.c create mode 100644 keyboards/converter/xt_usb/matrix.c create mode 100644 keyboards/converter/xt_usb/rules.mk create mode 100644 keyboards/converter/xt_usb/xt_usb.c create mode 100644 keyboards/converter/xt_usb/xt_usb.h create mode 100644 tmk_core/protocol/xt.h create mode 100644 tmk_core/protocol/xt_interrupt.c diff --git a/keyboards/converter/xt_usb/README.md b/keyboards/converter/xt_usb/README.md new file mode 100644 index 000000000..40b265a18 --- /dev/null +++ b/keyboards/converter/xt_usb/README.md @@ -0,0 +1,17 @@ +XT to USB keyboard converter +============================== +This is a port of TMK's converter/xt_usb to QMK. + +This firmware converts XT keyboard protocol to USB.(It supports Scan Code Set 1.) + + +Connect Wires +------------- +1. Connect **Vcc** and **GND**. +2. Connect **Clock** and **Data** line. **Clock** is on `PD1`, **Data** on `PD0` by default. And optionally you can use `PB7` for **Reset**.(Compatible to Soarer's converter) To change pin configuration edit `config.h`. +3. You need pull-up resistor. **1K-10K Ohm** will be OK. + + +XT keyboard protocol resource +------------------------------ +https://github.com/tmk/tmk_keyboard/wiki/IBM-PC-XT-Keyboard-Protocol diff --git a/keyboards/converter/xt_usb/config.h b/keyboards/converter/xt_usb/config.h new file mode 100644 index 000000000..963a3c639 --- /dev/null +++ b/keyboards/converter/xt_usb/config.h @@ -0,0 +1,78 @@ +/* +Copyright 2012 Jun Wako + +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 . +*/ + +#pragma once + +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6512 +#define DEVICE_VER 0x0001 +#define MANUFACTURER QMK +#define PRODUCT XT keyboard converter +#define DESCRIPTION convert XT keyboard to USB + + +/* matrix size */ +#define MATRIX_ROWS 16 // keycode bit: 3-0 +#define MATRIX_COLS 8 // keycode bit: 6-4 + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) || \ + keyboard_report->mods == (MOD_BIT(KC_LCTRL) | MOD_BIT(KC_RSHIFT)) \ +) + + +//#define NO_SUSPEND_POWER_DOWN + +/* + * XT Pin interrupt + */ +#define XT_CLOCK_PORT PORTD +#define XT_CLOCK_PIN PIND +#define XT_CLOCK_DDR DDRD +#define XT_CLOCK_BIT 1 +#define XT_DATA_PORT PORTD +#define XT_DATA_PIN PIND +#define XT_DATA_DDR DDRD +#define XT_DATA_BIT 0 +#define XT_RST_PORT PORTB +#define XT_RST_PIN PINB +#define XT_RST_DDR DDRB +#define XT_RST_BIT 7 + +/* hard reset: low pulse for 500ms and after that HiZ for safety */ +#define XT_RESET() do { \ + XT_RST_PORT &= ~(1< + +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 . +*/ + +#include "led.h" + +void led_set(uint8_t usb_led) { + //XT Keyboards do not have LEDs, nothing to do. +} diff --git a/keyboards/converter/xt_usb/matrix.c b/keyboards/converter/xt_usb/matrix.c new file mode 100644 index 000000000..e2d7117b1 --- /dev/null +++ b/keyboards/converter/xt_usb/matrix.c @@ -0,0 +1,309 @@ +/* +Copyright 2011 Jun Wako +Copyright 2016 Ethan Apodaca + +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 . +*/ + +#include +#include +#include "action.h" +#include "print.h" +#include "util.h" +#include "debug.h" +#include "xt.h" +#include "matrix.h" + + +static void matrix_make(uint8_t code); +static void matrix_break(uint8_t code); + +static uint8_t matrix[MATRIX_ROWS]; +#define ROW(code) (code>>3) +#define COL(code) (code&0x07) + +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + +void matrix_init(void) +{ + debug_enable = true; + xt_host_init(); + + // initialize matrix state: all keys off + for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00; + + matrix_init_quantum(); +} + +// convert E0-escaped codes into unused area +static uint8_t move_e0code(uint8_t code) { + switch(code) { + // Original IBM XT keyboard has these keys + case 0x37: return 0x54; // Print Screen + case 0x46: return 0x55; // Ctrl + Pause + case 0x1C: return 0x6F; // Keypad Enter + case 0x35: return 0x7F; // Keypad / + + // Any XT keyobard with these keys? + // http://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/translate.pdf + // https://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/scancode.doc + case 0x5B: return 0x5A; // Left GUI + case 0x5C: return 0x5B; // Right GUI + case 0x5D: return 0x5C; // Application + case 0x5E: return 0x5D; // Power(not used) + case 0x5F: return 0x5E; // Sleep(not used) + case 0x63: return 0x5F; // Wake (not used) + case 0x48: return 0x60; // Up + case 0x4B: return 0x61; // Left + case 0x50: return 0x62; // Down + case 0x4D: return 0x63; // Right + case 0x52: return 0x71; // Insert + case 0x53: return 0x72; // Delete + case 0x47: return 0x74; // Home + case 0x4F: return 0x75; // End + case 0x49: return 0x77; // Home + case 0x51: return 0x78; // End + case 0x1D: return 0x7A; // Right Ctrl + case 0x38: return 0x7C; // Right Alt + } + return 0x00; +} + +uint8_t matrix_scan(void) +{ + static enum { + INIT, + E0, + // Pause: E1 1D 45, E1 9D C5 + E1, + E1_1D, + E1_9D, + } state = INIT; + + uint8_t code = xt_host_recv(); + if (!code) return 0; + xprintf("%02X ", code); + switch (state) { + case INIT: + switch (code) { + case 0xE0: + state = E0; + break; + case 0xE1: + state = E1; + break; + default: + if (code < 0x80) + matrix_make(code); + else + matrix_break(code & 0x7F); + break; + } + break; + case E0: + switch (code) { + case 0x2A: + case 0xAA: + case 0x36: + case 0xB6: + //ignore fake shift + state = INIT; + break; + default: + if (code < 0x80) + matrix_make(move_e0code(code)); + else + matrix_break(move_e0code(code & 0x7F)); + state = INIT; + break; + } + break; + case E1: + switch (code) { + case 0x1D: + state = E1_1D; + break; + case 0x9D: + state = E1_9D; + break; + default: + state = INIT; + break; + } + break; + case E1_1D: + switch (code) { + case 0x45: + matrix_make(0x55); + break; + default: + state = INIT; + break; + } + break; + case E1_9D: + switch (code) { + case 0x45: + matrix_break(0x55); + break; + default: + state = INIT; + break; + } + break; + default: + state = INIT; + } + matrix_scan_quantum(); + return 1; +} + +inline +uint8_t matrix_get_row(uint8_t row) +{ + return matrix[row]; +} + +inline +static void matrix_make(uint8_t code) +{ + if (!matrix_is_on(ROW(code), COL(code))) { + matrix[ROW(code)] |= 1< + +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 . +*/ +#pragma once + +#include "quantum.h" + +/* IBM XT keyboard layout + * ,-------. ,--------------------------------------------------------------------------. + * | F1| F2| |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| BS |NumLck |ScrLck | + * |-------| |--------------------------------------------------------------------------| + * | F3| F4| | Tab | Q| W| E| R| T| Y| U| I| O| P| [| ] | | 7| 8| 9| -| + * |-------| |------------------------------------------------------|Ent|---------------| + * | F5| F6| | Ctrl | A| S| D| F| G| H| J| K| L| ;| '| `| | 4| 5| 6| | + * |-------| |----------------------------------------------------------------------| | + * | F7| F8| |Shif| \| Z| X| C| V| B| N| M| ,| .| /|Shift|PrS| 1| 2| 3| +| + * |-------| |----------------------------------------------------------------------| | + * | F9|F10| | Alt | Space |CapsLck| 0 | . | | + * `-------' `--------------------------------------------------------------------------' + * Scan code set 1 + * ,-------. ,--------------------------------------------------------------------------. + * | 3B| 3C| | 01| 02| 03| 04| 05| 06| 07| 08| 09| 0A| 0B| 0C| 0D| 0E | 45 | 46 | + * |-------| |--------------------------------------------------------------------------| + * | 3D| 3E| | 0F | 10| 11| 12| 13| 14| 15| 16| 17| 18| 19| 1A| 1B | | 47| 48| 49| 4A| + * |-------| |------------------------------------------------------| 1C|---------------| + * | 3F| 40| | 1D | 1E| 1F| 20| 21| 22| 23| 24| 25| 26| 27| 28| 29| | 4B| 4C| 4D| | + * |-------| |----------------------------------------------------------------------| | + * | 41| 42| | 2A | 2B| 2C| 2D| 2E| 2F| 30| 31| 32| 33| 34| 35| 36 |*37| 4F| 50| 51| 4E| + * |-------| |----------------------------------------------------------------------| | + * | 43| 44| | 38 | 39 | 3A | 52 | 53 | | + * `-------' `--------------------------------------------------------------------------' + */ +#define LAYOUT_xt( \ + K3B,K3C, K01,K02,K03,K04,K05,K06,K07,K08,K09,K0A,K0B,K0C,K0D,K0E, K45, K46, \ + K3D,K3E, K0F,K10,K11,K12,K13,K14,K15,K16,K17,K18,K19,K1A,K1B, K47,K48,K49,K4A, \ + K3F,K40, K1D,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K28,K29,K1C,K4B,K4C,K4D, \ + K41,K42, K2A,K2B,K2C,K2D,K2E,K2F,K30,K31,K32,K33,K34,K35,K36,K54,K4F,K50,K51,K4E, \ + K43,K44, K38, K39, K3A, K52, K53 \ +) { \ + { KC_NO, K01, K02, K03, K04, K05, K06, K07 }, \ + { K08, K09, K0A, K0B, K0C, K0D, K0E, K0F }, \ + { K10, K11, K12, K13, K14, K15, K16, K17 }, \ + { K18, K19, K1A, K1B, K1C, K1D, K1E, K1F }, \ + { K20, K21, K22, K23, K24, K25, K26, K27 }, \ + { K28, K29, K2A, K2B, K2C, K2D, K2E, K2F }, \ + { K30, K31, K32, K33, K34, K35, K36, KC_NO }, \ + { K38, K39, K3A, K3B, K3C, K3D, K3E, K3F }, \ + { K40, K41, K42, K43, K44, K45, K46, K47 }, \ + { K48, K49, K4A, K4B, K4C, K4D, K4E, K4F }, \ + { K50, K51, K52, K53, K54, KC_NO, KC_NO, KC_NO }, \ + { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ + { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ + { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ + { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ + { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \ +} + +/* Extended keyboard layout + * ,-----------------------------------------------. + * |F13|F14|F15|F16|F17|F18|F19|F20|F21|F22|F23|F24| + * ,---. |-----------------------------------------------| ,-----------. ,-----------. + * |Esc| |F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12| |PrS|ScL|Pau| |VDn|VUp|Mut| + * `---' `-----------------------------------------------' `-----------' `-----------' + * ,-----------------------------------------------------------. ,-----------. ,---------------. + * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|JPY|Bsp| |Ins|Hom|PgU| |NmL| /| *| -| + * |-----------------------------------------------------------| |-----------| |---------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | |Del|End|PgD| | 7| 8| 9| +| + * |-----------------------------------------------------------| `-----------' |---------------| + * |CapsL | A| S| D| F| G| H| J| K| L| ;| '| #|Entr| | 4| 5| 6|KP,| + * |-----------------------------------------------------------| ,---. |---------------| + * |Shft| <| Z| X| C| V| B| N| M| ,| .| /| RO|Shift | |Up | | 1| 2| 3|Ent| + * |-----------------------------------------------------------| ,-----------. |---------------| + * |Ctl|Gui|Alt|MHEN| Space |HENK|KANA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0| .|KP=| + * `-----------------------------------------------------------' `-----------' `---------------' + * ,-----------------------------------------------. + * | 64| 65| 66| 67| 68| 69| 6A| 6B| 6C| 6D| 6E| 76| + * ,---. |-----------------------------------------------| ,-----------. ,-----------. + * | 01| | 3B| 3C| 3D| 3E| 3F| 40| 41| 42| 43| 44| 57| 58| |*37| 46|*45| |e5E|e5F|e63| + * `---' `-----------------------------------------------' `-----------' `-----------' + * ,-----------------------------------------------------------. ,-----------. ,---------------. + * | 29| 02| 03| 04| 05| 06| 07| 08| 09| 0A| 0B| 0C| 0D| 7D| 0E| |e52|e47|e49| | 45|e35| 37| 4A| + * |-----------------------------------------------------------| |-----------| |---------------| + * | 0F | 10| 11| 12| 13| 14| 15| 16| 17| 18| 19| 1A| 1B| 2B | |e53|e4F|e51| | 47| 48| 49| 4E| + * |-----------------------------------------------------------| `-----------' |---------------| + * | 3A | 1E| 1F| 20| 21| 22| 23| 24| 25| 26| 27| 28| 00| 1C | | 4B| 4C| 4D| 7E| + * |-----------------------------------------------------------| ,---. |---------------| + * | 2A | 56| 2C| 2D| 2E| 2F| 30| 31| 32| 33| 34| 35| 73| 36 | |e48| | 4F| 50| 51|e1C| + * |-----------------------------------------------------------| ,-----------. |---------------| + * | 1D|e5B| 38| 7B | 39 | 79 | 70 |e38|e5C|e5D|e1D| |e4B|e50|e4D| | 52| 53| 59| + * `-----------------------------------------------------------' `-----------' `---------------' + * e: E0-escaped codes + * *: special handling codes + */ +#define LAYOUT( \ + K64,K65,K66,K67,K68,K69,K6A,K6B,K6C,K6D,K6E,K76, \ + K01, K3B,K3C,K3D,K3E,K3F,K40,K41,K42,K43,K44,K57,K58, K54,K46,K55, K5D,K5E,K5F, \ + K29,K02,K03,K04,K05,K06,K07,K08,K09,K0A,K0B,K0C,K0D,K7D,K0E, K71,K74,K77, K45,K7F,K37,K4A, \ + K0F,K10,K11,K12,K13,K14,K15,K16,K17,K18,K19,K1A,K1B, K2B, K72,K75,K78, K47,K48,K49,K4E, \ + K3A,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K28, K00,K1C, K4B,K4C,K4D,K7E, \ + K2A,K56,K2C,K2D,K2E,K2F,K30,K31,K32,K33,K34,K35, K73,K36, K60, K4F,K50,K51,K6F, \ + K1D,K5A,K38,K7B, K39, K79,K70,K7C,K5B,K5C,K7A, K61,K62,K63, K52,K53,K59 \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07 }, \ + { K08, K09, K0A, K0B, K0C, K0D, K0E, K0F }, \ + { K10, K11, K12, K13, K14, K15, K16, K17 }, \ + { K18, K19, K1A, K1B, K1C, K1D, K1E, K1F }, \ + { K20, K21, K22, K23, K24, K25, K26, K27 }, \ + { K28, K29, K2A, K2B, K2C, K2D, K2E, K2F }, \ + { K30, K31, K32, K33, K34, K35, K36, K37 }, \ + { K38, K39, K3A, K3B, K3C, K3D, K3E, K3F }, \ + { K40, K41, K42, K43, K44, K45, K46, K47 }, \ + { K48, K49, K4A, K4B, K4C, K4D, K4E, K4F }, \ + { K50, K51, K52, K53, K54, K55, K56, K57 }, \ + { K58, K59, K5A, K5B, K5C, K5D, K5E, K5F }, \ + { K60, K61, K62, K63, K64, K65, K66, K67 }, \ + { K68, K69, K6A, K6B, K6C, K6D, K6E, K6F }, \ + { K70, K71, K72, K73, K74, K75, K76, K77 }, \ + { K78, K79, K7A, K7B, K7C, K7D, K7E, K7F } \ +} diff --git a/tmk_core/protocol.mk b/tmk_core/protocol.mk index 54913329e..78b9deb29 100644 --- a/tmk_core/protocol.mk +++ b/tmk_core/protocol.mk @@ -50,5 +50,10 @@ ifdef ADB_MOUSE_ENABLE OPT_DEFS += -DADB_MOUSE_ENABLE -DMOUSE_ENABLE endif +ifdef XT_ENABLE + SRC += $(PROTOCOL_DIR)/xt_interrupt.c + OPT_DEFS += -DXT_ENABLE +endif + # Search Path VPATH += $(TMK_DIR)/protocol diff --git a/tmk_core/protocol/xt.h b/tmk_core/protocol/xt.h new file mode 100644 index 000000000..93bc5daf8 --- /dev/null +++ b/tmk_core/protocol/xt.h @@ -0,0 +1,71 @@ +/* +Copyright 2018 Jun WAKO +Copyright 2016 Ethan Apodaca + +This software is licensed with a Modified BSD License. +All of this is supposed to be Free Software, Open Source, DFSG-free, +GPL-compatible, and OK to use in both free and proprietary applications. +Additions and corrections to this file are welcome. + + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holders nor the names of + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef XT_H +#define XT_H + +#define XT_DATA_IN() do { \ + XT_DATA_DDR &= ~(1< +Copyright 2016 Ethan Apodaca + +This software is licensed with a Modified BSD License. +All of this is supposed to be Free Software, Open Source, DFSG-free, +GPL-compatible, and OK to use in both free and proprietary applications. +Additions and corrections to this file are welcome. + + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holders nor the names of + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#include +#include "xt.h" +#include "wait.h" +#include "print.h" + +static inline uint8_t pbuf_dequeue(void); +static inline void pbuf_enqueue(uint8_t data); +static inline bool pbuf_has_data(void); +static inline void pbuf_clear(void); + +void xt_host_init(void) +{ + XT_INT_INIT(); + XT_INT_OFF(); + + /* hard reset */ +#ifdef XT_RESET + XT_RESET(); +#endif + + /* soft reset: pull clock line down for 20ms */ + XT_DATA_LO(); + XT_CLOCK_LO(); + _delay_ms(20); + + /* input mode with pullup */ + XT_CLOCK_IN(); + XT_DATA_IN(); + + XT_INT_ON(); +} + +/* get data received by interrupt */ +uint8_t xt_host_recv(void) +{ + if (pbuf_has_data()) { + return pbuf_dequeue(); + } else { + return 0; + } +} + +ISR(XT_INT_VECT) +{ + /* + * XT signal format consits of 10 or 9 clocks and sends start bits and 8-bit data, + * which should be read on falling edge of clock. + * + * start(0), start(1), bit0, bit1, bit2, bit3, bit4, bit5, bit6, bit7 + * + * Original IBM XT keyboard sends start(0) bit while some of clones don't. + * Start(0) bit is read as low on data line while start(1) as high. + * + * https://github.com/tmk/tmk_keyboard/wiki/IBM-PC-XT-Keyboard-Protocol + */ + static enum { + START, BIT0, BIT1, BIT2, BIT3, BIT4, BIT5, BIT6, BIT7 + } state = START; + static uint8_t data = 0; + + uint8_t dbit = XT_DATA_READ(); + + // This is needed if using PCINT which can be called on both falling and rising edge + //if (XT_CLOCK_READ()) return; + + switch (state) { + case START: + // ignore start(0) bit + if (!dbit) return; + break; + case BIT0 ... BIT7: + data >>= 1; + if (dbit) + data |= 0x80; + break; + } + if (state++ == BIT7) { + pbuf_enqueue(data); + state = START; + data = 0; + } + return; +} + +/*-------------------------------------------------------------------- + * Ring buffer to store scan codes from keyboard + *------------------------------------------------------------------*/ +#define PBUF_SIZE 32 +static uint8_t pbuf[PBUF_SIZE]; +static uint8_t pbuf_head = 0; +static uint8_t pbuf_tail = 0; +static inline void pbuf_enqueue(uint8_t data) +{ + uint8_t sreg = SREG; + cli(); + uint8_t next = (pbuf_head + 1) % PBUF_SIZE; + if (next != pbuf_tail) { + pbuf[pbuf_head] = data; + pbuf_head = next; + } else { + print("pbuf: full\n"); + } + SREG = sreg; +} +static inline uint8_t pbuf_dequeue(void) +{ + uint8_t val = 0; + + uint8_t sreg = SREG; + cli(); + if (pbuf_head != pbuf_tail) { + val = pbuf[pbuf_tail]; + pbuf_tail = (pbuf_tail + 1) % PBUF_SIZE; + } + SREG = sreg; + + return val; +} +static inline bool pbuf_has_data(void) +{ + uint8_t sreg = SREG; + cli(); + bool has_data = (pbuf_head != pbuf_tail); + SREG = sreg; + return has_data; +} +static inline void pbuf_clear(void) +{ + uint8_t sreg = SREG; + cli(); + pbuf_head = pbuf_tail = 0; + SREG = sreg; +} From 352bef99a9a1dfe4c80d8b50677c7cbd8c78f87b Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Mon, 22 Oct 2018 12:58:23 -0700 Subject: [PATCH 342/788] Keyboard: JJ40 Refactor and Configurator support (#3197) * Deleted LAYOUTS = planck_grid from rules.mk * Refactor * Configurator support * Fixed offset layout matrix macro * Readded LAYOUT_kc_ortho_4x12 matrix alias * Refactor: rename LAYOUT_offset_right macro as LAYOUT_planck_1x2uR --- keyboards/jj40/info.json | 23 +++++++++ keyboards/jj40/jj40.h | 60 +++++++++++------------ keyboards/jj40/keymaps/cockpit/keymap.c | 8 +-- keyboards/jj40/keymaps/default/keymap.c | 6 +-- keyboards/jj40/keymaps/krusli/keymap.c | 35 ++++++++++--- keyboards/jj40/keymaps/oscillope/keymap.c | 13 ++--- keyboards/jj40/rules.mk | 2 +- 7 files changed, 92 insertions(+), 55 deletions(-) create mode 100644 keyboards/jj40/info.json diff --git a/keyboards/jj40/info.json b/keyboards/jj40/info.json new file mode 100644 index 000000000..c6416ce16 --- /dev/null +++ b/keyboards/jj40/info.json @@ -0,0 +1,23 @@ +{ + "keyboard_name": "jj40", + "url": "", + "maintainer": "qmk", + "width": 12, + "height": 4, + "layouts": { + "LAYOUT_planck_mit": { + "key_count": 47, + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":6, "y":1}, {"x":7, "y":1}, {"x":8, "y":1}, {"x":9, "y":1}, {"x":10, "y":1}, {"x":11, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2}, {"x":5, "y":2}, {"x":6, "y":2}, {"x":7, "y":2}, {"x":8, "y":2}, {"x":9, "y":2}, {"x":10, "y":2}, {"x":11, "y":2}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":4, "y":3}, {"x":5, "y":3, "w":2}, {"x":7, "y":3}, {"x":8, "y":3}, {"x":9, "y":3}, {"x":10, "y":3}, {"x":11, "y":3}] + }, + + "LAYOUT_ortho_4x12": { + "key_count": 48, + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":6, "y":1}, {"x":7, "y":1}, {"x":8, "y":1}, {"x":9, "y":1}, {"x":10, "y":1}, {"x":11, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2}, {"x":5, "y":2}, {"x":6, "y":2}, {"x":7, "y":2}, {"x":8, "y":2}, {"x":9, "y":2}, {"x":10, "y":2}, {"x":11, "y":2}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":4, "y":3}, {"x":5, "y":3}, {"x":6, "y":3}, {"x":7, "y":3}, {"x":8, "y":3}, {"x":9, "y":3}, {"x":10, "y":3}, {"x":11, "y":3}] + }, + + "LAYOUT_planck_1x2uR": { + "key_count": 47, + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":6, "y":1}, {"x":7, "y":1}, {"x":8, "y":1}, {"x":9, "y":1}, {"x":10, "y":1}, {"x":11, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2}, {"x":5, "y":2}, {"x":6, "y":2}, {"x":7, "y":2}, {"x":8, "y":2}, {"x":9, "y":2}, {"x":10, "y":2}, {"x":11, "y":2}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":4, "y":3}, {"x":5, "y":3}, {"x":6, "y":3, "w":2}, {"x":8, "y":3}, {"x":9, "y":3}, {"x":10, "y":3}, {"x":11, "y":3}] + } + } +} diff --git a/keyboards/jj40/jj40.h b/keyboards/jj40/jj40.h index bb7068fdc..731f2ff45 100644 --- a/keyboards/jj40/jj40.h +++ b/keyboards/jj40/jj40.h @@ -25,7 +25,10 @@ along with this program. If not, see . void matrix_init_user(void); // TODO port this to other PS2AVRGB boards -#define KEYMAP_GRID( \ +#define XXX KC_NO + + +#define LAYOUT_ortho_4x12( \ K01, K02, K03, K04, K05, K06, K07, K08, K09, K010, K011, K012, \ K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, K112, \ K21, K22, K23, K24, K25, K26, K27, K28, K29, K210, K211, K212, \ @@ -34,61 +37,58 @@ void matrix_init_user(void); // TODO port this to other PS2AVRGB boards { \ { K012, K011, K010, K09, K05, K06, K07, K08, K04, K03, K02, K01 }, \ { K112, K111, K110, K19, K15, K16, K17, K18, K14, K13, K12, K11 }, \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ + { XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX }, \ { K212, K211, K210, K29, K25, K26, K27, K28, K24, K23, K22, K21 }, \ { K312, K311, K310, K39, K35, K36, K37, K38, K34, K33, K32, K31 } \ } -#define KEYMAP_MIT( \ + +#define LAYOUT_planck_mit( \ K01, K02, K03, K04, K05, K06, K07, K08, K09, K010, K011, K012, \ K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, K112, \ K21, K22, K23, K24, K25, K26, K27, K28, K29, K210, K211, K212, \ K31, K32, K33, K34, K35, K3X, K38, K39, K310, K311, K312 \ ) \ { \ - { K012, K011, K010, K09, K05, K06, K07, K08, K04, K03, K02, K01 }, \ - { K112, K111, K110, K19, K15, K16, K17, K18, K14, K13, K12, K11 }, \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ - { K212, K211, K210, K29, K25, K26, K27, K28, K24, K23, K22, K21 }, \ - { K312, K311, K310, K39, K35, K3X, KC_NO, K38, K34, K33, K32, K31 } \ + { K012, K011, K010, K09, K05, K06, K07, K08, K04, K03, K02, K01 }, \ + { K112, K111, K110, K19, K15, K16, K17, K18, K14, K13, K12, K11 }, \ + { XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX }, \ + { K212, K211, K210, K29, K25, K26, K27, K28, K24, K23, K22, K21 }, \ + { K312, K311, K310, K39, K35, K3X, XXX, K38, K34, K33, K32, K31 } \ } -#define KEYMAP_OFFSET( \ + +#define LAYOUT_planck_1x2uR( \ K01, K02, K03, K04, K05, K06, K07, K08, K09, K010, K011, K012, \ K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, K112, \ K21, K22, K23, K24, K25, K26, K27, K28, K29, K210, K211, K212, \ K31, K32, K33, K34, K35, K36, K3X, K39, K310, K311, K312 \ ) \ { \ - { K012, K011, K010, K09, K05, K06, K07, K08, K04, K03, K02, K01 }, \ - { K112, K111, K110, K19, K15, K16, K17, K18, K14, K13, K12, K11 }, \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ - { K212, K211, K210, K29, K25, K26, K27, K28, K24, K23, K22, K21 }, \ - { K312, K311, K310, K39, K35, K36, K3X, KC_NO, K34, K33, K32, K31 } \ + { K012, K011, K010, K09, K05, K06, K07, K08, K04, K03, K02, K01 }, \ + { K112, K111, K110, K19, K15, K16, K17, K18, K14, K13, K12, K11 }, \ + { XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX }, \ + { K212, K211, K210, K29, K25, K26, K27, K28, K24, K23, K22, K21 }, \ + { K312, K311, K310, K39, K35, K36, K3X, XXX, K34, K33, K32, K31 } \ } -#define KC_KEYMAP( \ - k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \ - k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \ - k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ - k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b \ + +#define LAYOUT_kc( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ + k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b \ ) \ - KEYMAP_GRID( \ + LAYOUT_ortho_4x12( \ KC_##k00, KC_##k01, KC_##k02, KC_##k03, KC_##k04, KC_##k05, KC_##k06, KC_##k07, KC_##k08, KC_##k09, KC_##k0a, KC_##k0b, \ KC_##k10, KC_##k11, KC_##k12, KC_##k13, KC_##k14, KC_##k15, KC_##k16, KC_##k17, KC_##k18, KC_##k19, KC_##k1a, KC_##k1b, \ KC_##k20, KC_##k21, KC_##k22, KC_##k23, KC_##k24, KC_##k25, KC_##k26, KC_##k27, KC_##k28, KC_##k29, KC_##k2a, KC_##k2b, \ - KC_##k30, KC_##k31, KC_##k32, KC_##k33, KC_##k34, KC_##k35, KC_##k36, KC_##k37, KC_##k38, KC_##k39, KC_##k3a, KC_##k3b \ - ) + KC_##k30, KC_##k31, KC_##k32, KC_##k33, KC_##k34, KC_##k35, KC_##k36, KC_##k37, KC_##k38, KC_##k39, KC_##k3a, KC_##k3b \ +) -#define KEYMAP KEYMAP_MIT +#define LAYOUT LAYOUT_planck_mit -#define LAYOUT_ortho_4x12 KEYMAP_GRID - -#define LAYOUT_2U_space KEYMAP_MIT -#define LAYOUT_planck_mit KEYMAP_MIT - -#define KC_LAYOUT_ortho_4x12 KC_KEYMAP -#define LAYOUT_kc_ortho_4x12 KC_KEYMAP +#define LAYOUT_kc_ortho_4x12 LAYOUT_kc #endif diff --git a/keyboards/jj40/keymaps/cockpit/keymap.c b/keyboards/jj40/keymaps/cockpit/keymap.c index 02deaaa8e..12ed62b6b 100644 --- a/keyboards/jj40/keymaps/cockpit/keymap.c +++ b/keyboards/jj40/keymaps/cockpit/keymap.c @@ -63,7 +63,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Ctrl | Fn | GUI | Alt |Lower | Space |Raise | Left | Down | Up |Right | * `-----------------------------------------------------------------------------------' */ -[_QWERTY] = LAYOUT_2U_space( \ +[_QWERTY] = LAYOUT_planck_mit( \ KC_GESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ @@ -85,7 +85,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Ctrl | | | Alt |Lower|| Space | | Home | PgDn | PgUp | End | * `-----------------------------------------------------------------------------------' */ -[_LOWER] = LAYOUT_2U_space( \ +[_LOWER] = LAYOUT_planck_mit( \ KC_GRV, LT_A_OG, LT_C_CA, LT_E_OG, LT_E_DO, LT_I_OG, LT_S_CA, LT_U_OG, LT_U_MA, LT_Z_CA, KC_MINS, KC_BSPC, \ KC_TAB, LT_EXLM, LT_AT, LT_HASH, LT_DLR, LT_PERC, LT_CIRC, LT_AMPR, LT_ASTR, KC_LPRN, KC_RPRN, KC_DEL , \ KC_LSFT, KC_PEQL, KC_PPLS, KC_PMNS, KC_PIPE, KC_LBRC, KC_RBRC, KC_LABK, KC_RABK, KC_LCBR, KC_RCBR, KC_INS , \ @@ -107,7 +107,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Ctrl | | | Alt | | Space |Raise|| Left | Down | Up |Right | * `-----------------------------------------------------------------------------------' */ -[_RAISE] = LAYOUT_2U_space( \ +[_RAISE] = LAYOUT_planck_mit( \ KC_GRV, LT_1, LT_2, LT_3, LT_4, LT_5, LT_6, LT_7, LT_8, LT_9, LT_0, KC_BSPC, \ KC_TAB, LT_4, LT_5, LT_6, _______, _______, _______, _______, _______, _______, _______, KC_BSLS, \ KC_LSFT, LT_7, LT_8, LT_9, LT_0, _______, _______, _______, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ @@ -130,7 +130,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Ctrl |||Fn||| Mode | Alt | | Space |MPrev |MStop |MNext |MPlay | Lock | * `-----------------------------------------------------------------------------------' */ -[_FUNC] = LAYOUT_2U_space( \ +[_FUNC] = LAYOUT_planck_mit( \ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ KC_CAPS, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, BL_TOGG, BL_BRTG, BL_INC, _______, _______, _______, KC_VOLU, \ KC_LSFT, KC_CALC, RGB_HUD, RGB_SAD, RGB_VAD, KC_WBAK, KC_WFWD, BL_DEC, _______, _______, KC_PSCR, KC_VOLD, \ diff --git a/keyboards/jj40/keymaps/default/keymap.c b/keyboards/jj40/keymaps/default/keymap.c index 1db887bd0..d84b01b15 100644 --- a/keyboards/jj40/keymaps/default/keymap.c +++ b/keyboards/jj40/keymaps/default/keymap.c @@ -23,7 +23,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | * `-----------------------------------------------------------------------------------' */ -[_QWERTY] = LAYOUT_2U_space( \ +[_QWERTY] = LAYOUT_planck_mit( \ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ @@ -41,7 +41,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | Next | Vol- | Vol+ | Play | * `-----------------------------------------------------------------------------------' */ -[_LOWER] = LAYOUT_2U_space( \ +[_LOWER] = LAYOUT_planck_mit( \ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \ KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______, \ @@ -59,7 +59,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | Next | Vol- | Vol+ | Play | * `-----------------------------------------------------------------------------------' */ -[_RAISE] = LAYOUT_2U_space( \ +[_RAISE] = LAYOUT_planck_mit( \ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, _______, _______, _______, \ diff --git a/keyboards/jj40/keymaps/krusli/keymap.c b/keyboards/jj40/keymaps/krusli/keymap.c index 6fea9d314..f996fbf35 100644 --- a/keyboards/jj40/keymaps/krusli/keymap.c +++ b/keyboards/jj40/keymaps/krusli/keymap.c @@ -26,11 +26,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | Ctrl | GUI | Alt |Lower | Space |Raise | Left | Down | Up |Right | * `-----------------------------------------------------------------------------------' */ - [_QWERTY] = LAYOUT_2U_space( \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ - KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ - _______, KC_LCTL, KC_LGUI, KC_LALT, MO(_LOWER), KC_SPC, MO(_RAISE), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ + + [_QWERTY] = LAYOUT_planck_mit( \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ + TO(_NUMPAD),KC_LCTL, KC_LGUI, KC_LALT, MO(_LOWER), KC_SPC, MO(_RAISE), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ ), /* Lower @@ -41,10 +42,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------|------+------+------+------+------+------| * | | F7 | F8 | F9 | F10 | F11 | F12 | RGB | RGB | RGB | RGB |Enter | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | RGB | RGB | RGB | | | Next | Vol- | Vol+ | Play | | + * | | RGB | RGB | RGB | | | Next | Vol- | Vol+ | Play | | * `-----------------------------------------------------------------------------------' */ - [_LOWER] = LAYOUT_2U_space( \ + [_LOWER] = LAYOUT_planck_mit( \ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \ KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, RGB_TOG, RGB_MOD, RGB_VAD, RGB_VAI, _______, \ @@ -62,10 +63,28 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | Prev | Play | Next | | | | Next | Vol- | Vol+ | Play | * `-----------------------------------------------------------------------------------' */ - [_RAISE] = LAYOUT_2U_space( \ + [_RAISE] = LAYOUT_planck_mit( \ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_HOME, KC_END, KC_PGUP, KC_PGDN, _______, \ _______, KC_MRWD, KC_MPLY, KC_MNXT, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ + ), + + /* Numpad + * ,-----------------------------------------------------------------------------------. + * | Esc | 7 | 8 | 9 | * | / | | | | | | | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | <-- | 4 | 5 | 6 | + | - | | | | | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | 1 | 2 | 3 |Enter |Enter | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Qwerty| 0 | . | . |Enter | | | | | | | + * `-----------------------------------------------------------------------------------' + */ + [_NUMPAD] = LAYOUT_planck_mit( \ + KC_ESC, KC_P7, KC_P8, KC_P9, KC_PAST, KC_PSLS, _______, _______, _______, _______, _______, _______, \ + KC_BSPC, KC_P4, KC_P5, KC_P6, KC_PPLS, KC_PMNS, _______, _______, _______, _______, _______, _______, \ + _______, KC_P1, KC_P2, KC_P3, KC_PENT, KC_PENT, _______, _______, _______, _______, _______, _______, \ + TO(_QWERTY),KC_P0, KC_PDOT, KC_PDOT, KC_PENT, _______, _______, _______, _______, _______, _______ \ ) }; diff --git a/keyboards/jj40/keymaps/oscillope/keymap.c b/keyboards/jj40/keymaps/oscillope/keymap.c index 8b30f52c8..1a4226194 100644 --- a/keyboards/jj40/keymaps/oscillope/keymap.c +++ b/keyboards/jj40/keymaps/oscillope/keymap.c @@ -17,11 +17,6 @@ along with this program. If not, see . #include QMK_KEYBOARD_H -#ifdef KEYMAP -#undef KEYMAP -#endif -#define KEYMAP KEYMAP_OFFSET - #define _QWERTY 0 #define _LOWER 1 #define _RAISE 2 @@ -51,7 +46,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Ctrl | OS | Alt |Lower |Shift |Raise | Space | Left | Down | Up |Right | * `-----------------------------------------------------------------------------------' */ -[_QWERTY] = KEYMAP( \ +[_QWERTY] = LAYOUT_planck_1x2uR( \ KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT, \ KC_GRV, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_QUOT, \ @@ -69,7 +64,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | Lock | | | Prev | Stop | Play | Next | * `-----------------------------------------------------------------------------------' */ -[_LOWER] = KEYMAP( \ +[_LOWER] = LAYOUT_planck_1x2uR( \ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ KC_INS, _______, _______, CC_PRN, CC_BRC, CC_CBR, KC_HOME, KC_PGDN, KC_PGUP, KC_END, _______, _______, \ RESET, KC_WBAK, KC_WFWD, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, \ @@ -87,14 +82,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Ctrl | OS | Alt | |Shift | | 0 | Home | PgDn | PgUp | End | * `-----------------------------------------------------------------------------------' */ -[_RAISE] = KEYMAP( \ +[_RAISE] = LAYOUT_planck_1x2uR( \ KC_CAPS, KC_AMPR, KC_ASTR, KC_UNDS, KC_LPRN, KC_RPRN, KC_7, KC_8, KC_9, KC_EQL, KC_BSPC, KC_DEL, \ KC_TAB, KC_DLR, KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_4, KC_5, KC_6, KC_MINS, KC_PLUS, _______, \ CC_ARRW, KC_EXLM, KC_AT, KC_HASH, KC_LCBR, KC_RCBR, KC_1, KC_2, KC_3, _______, KC_BSLS, KC_PIPE, \ _______, _______, _______, _______, _______, _______, KC_0, KC_HOME, KC_PGDN, KC_PGUP, KC_END \ ), -[_NAV] = KEYMAP( \ +[_NAV] = LAYOUT_planck_1x2uR( \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ diff --git a/keyboards/jj40/rules.mk b/keyboards/jj40/rules.mk index 4e6f62617..697e17a01 100644 --- a/keyboards/jj40/rules.mk +++ b/keyboards/jj40/rules.mk @@ -57,4 +57,4 @@ SRC = matrix.c i2c.c backlight.c # programming options PROGRAM_CMD = ./util/atmega32a_program.py $(TARGET).hex -LAYOUTS = ortho_4x12 planck_mit planck_grid +LAYOUTS = ortho_4x12 planck_mit From e7451448361b0d1490f74aae6dfe4f80e86ea1ca Mon Sep 17 00:00:00 2001 From: SpacebarRacecar <42380065+SpacebarRacecar@users.noreply.github.com> Date: Mon, 22 Oct 2018 22:22:20 +0200 Subject: [PATCH 343/788] Keyboard: Prime_O layout/matrix fix (#4205) --- .../primekb/prime_o/keymaps/default/keymap.c | 38 ++++++++----------- keyboards/primekb/prime_o/prime_o.h | 30 +++++++-------- 2 files changed, 30 insertions(+), 38 deletions(-) diff --git a/keyboards/primekb/prime_o/keymaps/default/keymap.c b/keyboards/primekb/prime_o/keymaps/default/keymap.c index f48e9e51a..a2d9e807c 100644 --- a/keyboards/primekb/prime_o/keymaps/default/keymap.c +++ b/keyboards/primekb/prime_o/keymaps/default/keymap.c @@ -15,6 +15,8 @@ */ #include QMK_KEYBOARD_H +#define L1BS LT(1, KC_BSPC) + // Defines the keycodes used by our macros in process_record_user enum custom_keycodes { QMKBEST = SAFE_RANGE, @@ -22,31 +24,21 @@ enum custom_keycodes { }; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = LAYOUT( - KC_ENT, KC_P0, KC_LCTL, KC_LBRC, LT(1, KC_BSPC), KC_SPC, KC_MINS, KC_RGUI, - KC_ENT, KC_P2, KC_LSFT, KC_X, KC_V, KC_N, KC_COMM, KC_SLSH, - KC_PPLS, KC_P5, KC_TAB, KC_S, KC_F, KC_H, KC_K, KC_QUOT, - KC_PPLS, KC_P8, KC_PSCR, KC_W, KC_R, KC_Y, KC_I, KC_P, - KC_ESC, KC_PSLS, KC_NLCK, KC_2, KC_4, KC_6, KC_8, KC_0, - KC_PMNS, KC_PAST, KC_1, KC_3, KC_5, KC_7, KC_9, KC_DEL, - KC_P7, KC_P9, KC_Q, KC_E, KC_T, KC_U, KC_O, KC_BSLS, - KC_P4, KC_P6, KC_A, KC_D, KC_G, KC_J, KC_L, KC_ENT, - KC_P1, KC_P3, KC_Z, KC_C, KC_B, KC_M, KC_DOT, KC_LSFT, - KC_PDOT, KC_P0, KC_LALT, KC_RBRC, LT(1, KC_BSPC), KC_SPC, KC_EQL, KC_RCTL - ), + [0] = LAYOUT( + KC_ESC, KC_PMNS, KC_PSLS, KC_PAST, KC_NLCK, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_9, KC_DEL, + KC_PPLS, KC_P7, KC_P8, KC_P9, KC_PSCR, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, + KC_PPLS, KC_P4, KC_P5, KC_P6, KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT,KC_ENT, + KC_ENT, KC_P1, KC_P2, KC_P3, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,KC_LSFT, + KC_ENT, KC_PDOT, KC_P0, KC_P0, KC_LCTL, KC_LALT,KC_LBRC,KC_RBRC,L1BS, L1BS, KC_SPC, KC_SPC, KC_MINS,KC_EQL, KC_RGUI,KC_RCTL + ), [1] = LAYOUT( - BL_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DEL, KC_VOLD, KC_MUTE, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DOWN, KC_SCLN, - KC_TRNS, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, - KC_GRV, KC_F2, KC_F4, KC_F2, KC_F4, KC_F6, KC_F8, KC_F10, - KC_F1, KC_F3, KC_F1, KC_F3, KC_F5, KC_F7, KC_F9, KC_DEL, - KC_F11, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_RGHT, KC_VOLU, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, - BL_STEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DEL, KC_VOLU, KC_MUTE - ), + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_DEL, + KC_TRNS, KC_F11, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_UP, KC_TRNS,KC_TRNS,KC_VOLU, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_CAPS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_LEFT,KC_DOWN,KC_RGHT,KC_SCLN,KC_VOLU, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_MUTE, + BL_TOGG, BL_STEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_DEL, KC_DEL, KC_VOLD,KC_VOLU,KC_MUTE,KC_MUTE + ), }; diff --git a/keyboards/primekb/prime_o/prime_o.h b/keyboards/primekb/prime_o/prime_o.h index 1ec7277b0..99a805452 100644 --- a/keyboards/primekb/prime_o/prime_o.h +++ b/keyboards/primekb/prime_o/prime_o.h @@ -19,22 +19,22 @@ #include "quantum.h" #define LAYOUT( \ - K000, K001, K002, K003, K004, K005, K006, K007, K010, K011, K012, K013, K014, K015, K016, K017, \ - K020, K021, K022, K023, K024, K025, K026, K027, K030, K031, K032, K033, K034, K035, K036, K037, \ - K040, K041, K042, K043, K044, K045, K046, K047, K050, K051, K052, K053, K054, K055, K056, K057, \ - K060, K061, K062, K063, K064, K065, K066, K067, K070, K071, K072, K073, K074, K075, K076, K077, \ - K080, K081, K082, K083, K084, K085, K086, K087, K090, K091, K092, K093, K094, K095, K096, K097 \ + K001, K008, K013, K018, K023, K029, K035, K041, K046, K052, K058, K064, K071, K076, K081, K086, \ + K002, K009, K014, K019, K024, K030, K036, K042, K047, K053, K059, K065, K072, K077, K082, K087, \ + K004, K010, K015, K020, K025, K031, K037, K043, K048, K054, K060, K066, K073, K078, K083, K089, \ + K005, K011, K016, K021, K026, K032, K038, K044, K049, K055, K061, K067, K074, K079, K084, K090, \ + K007, K012, K017, K022, K028, K034, K040, K045, K051, K057, K063, K069, K075, K080, K085, K092 \ ) { \ - { K000, K001, K002, K003, K004, K005, K006, K007 }, \ - { K010, K011, K012, K013, K014, K015, K016, K017 }, \ - { K020, K021, K022, K023, K024, K025, K026, K027 }, \ - { K030, K031, K032, K033, K034, K035, K036, K037 }, \ - { K040, K041, K042, K043, K044, K045, K046, K047 }, \ - { K050, K051, K052, K053, K054, K055, K056, K057 }, \ - { K060, K061, K062, K063, K064, K065, K066, K067 }, \ - { K070, K071, K072, K073, K074, K075, K076, K077 }, \ - { K080, K081, K082, K083, K084, K085, K086, K087 }, \ - { K090, K091, K092, K093, K094, K095, K096, K097 } \ + { K007, K017, K028, K040, K051, K063, K075, K085 }, \ + { K005, K016, K026, K038, K049, K061, K074, K084 }, \ + { K004, K015, K025, K037, K048, K060, K073, K083 }, \ + { K002, K014, K024, K036, K047, K059, K072, K082 }, \ + { K001, K013, K023, K035, K046, K058, K071, K081 }, \ + { K008, K018, K029, K041, K052, K064, K076, K086 }, \ + { K009, K019, K030, K042, K053, K065, K077, K087 }, \ + { K010, K020, K031, K043, K054, K066, K078, K089 }, \ + { K011, K021, K032, K044, K055, K067, K079, K090 }, \ + { K012, K022, K034, K045, K057, K069, K080, K092 } \ } #endif From 704a2e8d3c0bd15f6c8accd5a39fb88ca6c9e2d5 Mon Sep 17 00:00:00 2001 From: SpacebarRacecar <42380065+SpacebarRacecar@users.noreply.github.com> Date: Mon, 22 Oct 2018 22:23:22 +0200 Subject: [PATCH 344/788] Keymap: Updates to personal userspace and keymaps (#4206) * - updated personal userspace - updated fc660c, niu mini and planck keymaps - added prime_o keymap * Rename README.md to readme.md --- .../fc660c/keymaps/spacebarracecar/README.md | 4 - .../fc660c/keymaps/spacebarracecar/config.h | 11 +- .../fc660c/keymaps/spacebarracecar/keymap.c | 6 +- .../fc660c/keymaps/spacebarracecar/readme.md | 5 + .../niu_mini/keymaps/spacebarracecar/config.h | 1 + .../niu_mini/keymaps/spacebarracecar/keymap.c | 17 +- .../keymaps/spacebarracecar/readme.md | 6 +- .../planck/keymaps/spacebarracecar/config.h | 2 + .../planck/keymaps/spacebarracecar/keymap.c | 19 +- .../planck/keymaps/spacebarracecar/readme.md | 7 +- .../prime_o/keymaps/spacebarracecar/config.h | 1 + .../prime_o/keymaps/spacebarracecar/keymap.c | 286 ++++++++++++++++++ .../prime_o/keymaps/spacebarracecar/readme.md | 6 + .../prime_o/keymaps/spacebarracecar/rules.mk | 22 ++ users/spacebarracecar/spacebarracecar.c | 47 ++- users/spacebarracecar/spacebarracecar.h | 25 +- 16 files changed, 411 insertions(+), 54 deletions(-) delete mode 100644 keyboards/fc660c/keymaps/spacebarracecar/README.md create mode 100644 keyboards/fc660c/keymaps/spacebarracecar/readme.md create mode 100644 keyboards/primekb/prime_o/keymaps/spacebarracecar/config.h create mode 100644 keyboards/primekb/prime_o/keymaps/spacebarracecar/keymap.c create mode 100644 keyboards/primekb/prime_o/keymaps/spacebarracecar/readme.md create mode 100644 keyboards/primekb/prime_o/keymaps/spacebarracecar/rules.mk diff --git a/keyboards/fc660c/keymaps/spacebarracecar/README.md b/keyboards/fc660c/keymaps/spacebarracecar/README.md deleted file mode 100644 index 7d87ef8cf..000000000 --- a/keyboards/fc660c/keymaps/spacebarracecar/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# US International keymap for PCs with German set as input language - -This keymap emulates a US International layout including a deadkey layer on PCs that have German set as the input language. -This allows the use of the keyboard on any PC in Germany without the need of changing the input language. diff --git a/keyboards/fc660c/keymaps/spacebarracecar/config.h b/keyboards/fc660c/keymaps/spacebarracecar/config.h index 9c9b00656..9d83a2700 100644 --- a/keyboards/fc660c/keymaps/spacebarracecar/config.h +++ b/keyboards/fc660c/keymaps/spacebarracecar/config.h @@ -1,9 +1,8 @@ #pragma once -// higher value means deeper actuation point, less sensitive -// be careful and only make small adjustments (steps of 1 or 2). -// too high and keys will fail to actuate. too low and keys will actuate spontaneously. -// test all keys before further adjustment. -// this should probably stay in the range +/-5. +/* +higher value means deeper actuation point, less sensitive +this should probably stay in the range +/-5. +*/ #undef ACTUATION_DEPTH_ADJUSTMENT -#define ACTUATION_DEPTH_ADJUSTMENT +2 +#define ACTUATION_DEPTH_ADJUSTMENT -1 diff --git a/keyboards/fc660c/keymaps/spacebarracecar/keymap.c b/keyboards/fc660c/keymaps/spacebarracecar/keymap.c index 2cbef10bb..760b83b9f 100644 --- a/keyboards/fc660c/keymaps/spacebarracecar/keymap.c +++ b/keyboards/fc660c/keymaps/spacebarracecar/keymap.c @@ -28,11 +28,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______,KC_PGDN,KC_UP, KC_PGUP,KC_HOME,XXXXXXX,XXXXXXX,XXXXXXX,GUIU, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, CU_ESCT, _______,KC_LEFT,KC_DOWN,KC_RGHT,KC_END, XXXXXXX,XXXXXXX,GUIL, GUID, GUIR, XXXXXXX,XXXXXXX, KC_ENT, _______,KC_MPRV,KC_MPLY,KC_MNXT,KC_VOLD,KC_VOLU,KC_MUTE,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,_______, KC_PGUP, - RESET, _______,_______, _______, _______,_______,_______, KC_HOME,KC_PGDN,KC_END + RESET, _______,_______, KC_SPC, _______,_______,_______, KC_HOME,KC_PGDN,KC_END ) }; -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - return process_record_userspace(keycode, record); +bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { + return true; } diff --git a/keyboards/fc660c/keymaps/spacebarracecar/readme.md b/keyboards/fc660c/keymaps/spacebarracecar/readme.md new file mode 100644 index 000000000..88c447e75 --- /dev/null +++ b/keyboards/fc660c/keymaps/spacebarracecar/readme.md @@ -0,0 +1,5 @@ +# SpacebarRacecar US-International FC660C Keymap for German PCs + +This keymap emulates most keys of the US-International layout on PCs that have German set as input language. +This allows the use of the keyboard on any PC in Germany without the need to change any settings. +The keymap is mostly based on the US-International layout. diff --git a/keyboards/niu_mini/keymaps/spacebarracecar/config.h b/keyboards/niu_mini/keymaps/spacebarracecar/config.h index e69de29bb..6f70f09be 100644 --- a/keyboards/niu_mini/keymaps/spacebarracecar/config.h +++ b/keyboards/niu_mini/keymaps/spacebarracecar/config.h @@ -0,0 +1 @@ +#pragma once diff --git a/keyboards/niu_mini/keymaps/spacebarracecar/keymap.c b/keyboards/niu_mini/keymaps/spacebarracecar/keymap.c index b850e5fda..c3f6fb09a 100644 --- a/keyboards/niu_mini/keymaps/spacebarracecar/keymap.c +++ b/keyboards/niu_mini/keymaps/spacebarracecar/keymap.c @@ -12,7 +12,7 @@ enum layers { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -/* Base Layer +/* Base ,-----------------------------------------------------------------------------------------------------------------------. |Tab |Q |W |E |R |T |Z |U |I |O |P |Backspace| |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| @@ -68,7 +68,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), -/* Dead-Key +/* Deadkey ,-----------------------------------------------------------------------------------------------------------------------. | | | | | | | |Ü | |Ö | | | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| @@ -87,15 +87,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, CU_DDQ, CU_DDQ, _______, _______, _______, _______, _______ ), -/* Nav +/* Navigation ,-----------------------------------------------------------------------------------------------------------------------. -|Caps Lock|PageDown |Up |PageUp |Home | | | |Win+Up | | |Del | +|ESCT |PageDown |Up |PageUp |Home | | | |Win+Up | | |Del | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| | |Left |Down |Right |End | | |Win+Left |Win+Down |Win+Right| |Enter | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| | |Prev |Pause |Next |LowerVol |RaiseVol |Mute | | | | | | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -| | | | | | | | | | |RESET | | +|RESET | | | | | | | | | | |Game | `-----------------------------------------------------------------------------------------------------------------------' */ @@ -103,12 +103,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { CU_ESCT, KC_PGDN, KC_UP, KC_PGUP, KC_HOME, XXXXXXX, XXXXXXX, XXXXXXX, GUIU, XXXXXXX, XXXXXXX, KC_DEL, _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, XXXXXXX, XXXXXXX, GUIL, GUID, GUIR, RGB_M_P, KC_ENT, _______, KC_MPRV, KC_MPLY, KC_MNXT, KC_VOLD, KC_VOLU, KC_MUTE, RGB_TOG, RGB_MOD, RGB_HUI, CU_RGBV, _______, - RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, CU_GAME + RESET, _______, _______, _______, _______, KC_SPC, KC_ENT, _______, _______, _______, _______, CU_GAME ) }; -bool process_record_user(uint16_t keycode, keyrecord_t *record) { +bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { switch (keycode) { case MO(_LOWER): if (game){ @@ -121,6 +121,7 @@ switch (keycode) { } else { return true; } + default: + return true; } - return process_record_userspace(keycode, record); } diff --git a/keyboards/niu_mini/keymaps/spacebarracecar/readme.md b/keyboards/niu_mini/keymaps/spacebarracecar/readme.md index 88d722186..967274381 100644 --- a/keyboards/niu_mini/keymaps/spacebarracecar/readme.md +++ b/keyboards/niu_mini/keymaps/spacebarracecar/readme.md @@ -1,3 +1,5 @@ -# US-International like Niu Mini layout for PCs with German set as input language +# SpacebarRacecar US-International NIU Mini Keymap for German PCs -This layout aims to provide a US-International like layout for PCs that have German set as Input Language. This is useful for users living in germany, because it enables the use of the Niu Mini on any pc without having to switch the input language. It's mostly based on the Planck default layout, but adds essential features for german input, like a dead key layer to access ä, ö, ü. +This keymap emulates most keys of the US-International layout on PCs that have German set as input language. +This allows the use of the keyboard on any PC in Germany without the need to change any settings. +The keymap is mostly based on the Planck default layout but adds essential features for german input, like access to Ä, Ö, Ü, ß. diff --git a/keyboards/planck/keymaps/spacebarracecar/config.h b/keyboards/planck/keymaps/spacebarracecar/config.h index 9b55fa93a..4f48857fe 100644 --- a/keyboards/planck/keymaps/spacebarracecar/config.h +++ b/keyboards/planck/keymaps/spacebarracecar/config.h @@ -1,3 +1,5 @@ +#pragma once + #ifdef AUDIO_ENABLE #define STARTUP_SONG SONG(NO_SOUND) #endif diff --git a/keyboards/planck/keymaps/spacebarracecar/keymap.c b/keyboards/planck/keymaps/spacebarracecar/keymap.c index 705f78f8e..db91231bf 100644 --- a/keyboards/planck/keymaps/spacebarracecar/keymap.c +++ b/keyboards/planck/keymaps/spacebarracecar/keymap.c @@ -13,7 +13,7 @@ enum layers { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -/* Base Layer +/* Base ,-----------------------------------------------------------------------------------------------------------------------. |Tab |Q |W |E |R |T |Z |U |I |O |P |Backspace| |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| @@ -76,7 +76,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LALT, KC_LGUI, KC_DOWN, KC_UP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, MU_MOD, MU_OFF ), -/* Dead-Key +/* Deadkey ,-----------------------------------------------------------------------------------------------------------------------. | | | | | | | |Ü | |Ö | | | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| @@ -92,18 +92,18 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_UE, CU_ED, CU_OE, CU_ED, KC_BSPC, CU_NAV, CU_AE, CU_SS, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_DDQ, CU_LSFT, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_RSFT, - KC_LCTL, XXXXXXX, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_ENT, RAISE, KC_RALT, KC_RGUI, KC_APP, KC_RCTL + KC_LCTL, XXXXXXX, KC_LGUI, KC_LALT, LOWER, CU_DDQ, CU_DDQ, RAISE, KC_RALT, KC_RGUI, KC_APP, KC_RCTL ), -/* Nav +/* Navigation ,-----------------------------------------------------------------------------------------------------------------------. -|Caps Lock|PageDown |Up |PageUp |Home | | | |Win+Up | | |Del | +|ESCT |PageDown |Up |PageUp |Home | | | |Win+Up | | |Del | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| | |Left |Down |Right |End | | |Win+Left |Win+Down |Win+Right| |Enter | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| | |Prev |Pause |Next |LowerVol |RaiseVol |Mute | | | | | | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -| | | | | | | | | | |RESET | | +|RESET | | | | | | | | | | |Game | `-----------------------------------------------------------------------------------------------------------------------' */ @@ -111,12 +111,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { CU_ESCT, KC_PGDN, KC_UP, KC_PGUP, KC_HOME, XXXXXXX, XXXXXXX, XXXXXXX, GUIU, XXXXXXX, XXXXXXX, KC_DEL, _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, XXXXXXX, XXXXXXX, GUIL, GUID, GUIR, XXXXXXX, KC_ENT, _______, KC_MPRV, KC_MPLY, KC_MNXT, KC_VOLD, KC_VOLU, KC_MUTE, MU_ON, XXXXXXX, XXXXXXX, XXXXXXX, _______, - RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, CU_GAME + RESET, _______, _______, _______, _______, KC_SPC, KC_ENT, _______, _______, _______, _______, CU_GAME ) }; -bool process_record_user(uint16_t keycode, keyrecord_t *record) { +bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { switch (keycode) { case MO(_LOWER): if (game){ @@ -143,6 +143,7 @@ switch (keycode) { layer_off(_MUSICMODE); } return true; + default: + return true; } - return process_record_userspace(keycode, record); } diff --git a/keyboards/planck/keymaps/spacebarracecar/readme.md b/keyboards/planck/keymaps/spacebarracecar/readme.md index daa9c4ad2..c8e8134ca 100644 --- a/keyboards/planck/keymaps/spacebarracecar/readme.md +++ b/keyboards/planck/keymaps/spacebarracecar/readme.md @@ -1,4 +1,5 @@ -# US-International like Planck layout for PCs with German set as input language - -This layout aims to provide a US-International like layout for PCs that have German set as Input Language. This is useful for users living in germany, because it enables the use of the planck on any pc without having to switch the input language. It's mostly based on the Planck default layout, but adds essential features for german input, like a dead key layer to access ä, ö, ü. +# SpacebarRacecar US-International Planck Keymap for German PCs +This keymap emulates most keys of the US-International layout on PCs that have German set as input language. +This allows the use of the keyboard on any PC in Germany without the need to change any settings. +The keymap is mostly based on the Planck default layout but adds essential features for german input, like access to Ä, Ö, Ü, ß. diff --git a/keyboards/primekb/prime_o/keymaps/spacebarracecar/config.h b/keyboards/primekb/prime_o/keymaps/spacebarracecar/config.h new file mode 100644 index 000000000..6f70f09be --- /dev/null +++ b/keyboards/primekb/prime_o/keymaps/spacebarracecar/config.h @@ -0,0 +1 @@ +#pragma once diff --git a/keyboards/primekb/prime_o/keymaps/spacebarracecar/keymap.c b/keyboards/primekb/prime_o/keymaps/spacebarracecar/keymap.c new file mode 100644 index 000000000..d38ff0d1d --- /dev/null +++ b/keyboards/primekb/prime_o/keymaps/spacebarracecar/keymap.c @@ -0,0 +1,286 @@ +#include QMK_KEYBOARD_H +#include "spacebarracecar.h" + +#define LOWER MO(_LOWER) +#define RAISE MO(_RAISE) + +#define LEFTNUM + +enum layers { + _BASE, + _LOWER, + _RAISE, + _GAME = _NAV+1 +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +#ifndef LEFTNUM +/* Base +,---------------------------------------------------------------------------------------------------------------------------------------------------------------. +|` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 |\ |Numlock |/ |* |= | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Tab |Q |W |E |R |T |Z |U |I |O |P |Backspace|7 |8 |9 |- | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Esc/Nav |A |S |D |F |G |H |J |K |L |; |' |4 |5 |6 |+ | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|(/LShift |Y |X |C |V |B |N |M |, |. |/ |)/RShift |1 |2 |3 |Enter | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|RCtrl | |Alt |Win |Lower |Space |Enter |Raise |Win |AltGr | |LCtrl |00 |0 |. |Tab | +`---------------------------------------------------------------------------------------------------------------------------------------------------------------' +*/ + +[_BASE] = LAYOUT( + CU_GRV, DE_1, DE_2, CU_3, DE_4, DE_5, CU_6, CU_7, CU_8, CU_9, CU_0, CU_BSLS, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, + KC_TAB, DE_Q, DE_W, DE_E, DE_R, DE_T, CU_Z, DE_U, DE_I, DE_O, DE_P, KC_BSPC, KC_P7, KC_P8, KC_P9, KC_PPLS, + CU_NAV, DE_A, DE_S, DE_D, DE_F, DE_G, DE_H, DE_J, DE_K, DE_L, CU_SCLN, CU_QUOT, KC_P4, KC_P5, KC_P6, KC_PEQL, + CU_LSFT, CU_Y, DE_X, DE_C, DE_V, DE_B, DE_N, DE_M, CU_COMM, CU_DOT, CU_SLSH, CU_RSFT, KC_P1, KC_P2, KC_P3, KC_PENT, + KC_LCTL, XXXXXXX, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_ENT, RAISE, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_P00, KC_P0, KC_PDOT, KC_TAB +), + +/* Lower +,---------------------------------------------------------------------------------------------------------------------------------------------------------------. +|` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 | |Numlock |/ |* |- | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|~ |! |" |# |$ |% |^ |& |* |( |) | |7 |8 |9 |+ | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |@ |Strg+X |Strg+C |Strg+V | | |_ |+ |{ |} || |4 |5 |6 |= | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |? | | | | | | | | | | |1 |2 |3 |Enter | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | | | | | | | | |00 |0 |. |Tab | +`---------------------------------------------------------------------------------------------------------------------------------------------------------------' +*/ + +[_LOWER] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + DE_TILD, DE_EXLM, DE_DQOT, DE_HASH, DE_DLR, DE_PERC, CU_CIRC, DE_AMPR, DE_ASTR, DE_LPRN, DE_RPRN, _______, _______, _______, _______, _______, + _______, DE_AT, CTRLX, CTRLC, CTRLV, XXXXXXX, XXXXXXX, DE_UNDS, DE_PLUS, DE_LCBR, DE_RCBR, DE_PIPE, _______, _______, _______, _______, + _______, DE_EURO, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +/* Raise +,---------------------------------------------------------------------------------------------------------------------------------------------------------------. +|` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 | |Numlock |/ |* |- | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 | |7 |8 |9 |+ | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |F1 |F2 |F3 |F4 |F5 |F6 |- |= |[ |] |\ |4 |5 |6 |= | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |F7 |F8 |F9 |F10 |F11 |F12 | | | | | |1 |2 |3 |Enter | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | | | | | | | | |00 |0 |. |Tab | +`---------------------------------------------------------------------------------------------------------------------------------------------------------------' +*/ + +[_RAISE] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + CU_GRV, DE_1, DE_2, CU_3, DE_4, DE_5, CU_6, CU_7, CU_8, CU_9, CU_0, _______, _______, _______, _______, _______, + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, DE_MINS, CU_EQL, CU_LBRC, CU_RBRC, CU_BSLS, _______, _______, _______, _______, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +/* Deadkey +,---------------------------------------------------------------------------------------------------------------------------------------------------------------. +| | | | | | | | | | | | |Numlock |/ |* |- | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | | | |Ü | |Ö | | |7 |8 |9 |+ | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |Ä |ß | | | | | | | | | |4 |5 |6 |= | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | | | | | | | | |1 |2 |3 |Enter | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | |" |" | | | | | |00 |0 |. |Tab | +`---------------------------------------------------------------------------------------------------------------------------------------------------------------' +*/ + +[_DEADKEY] = LAYOUT( + CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, _______, _______, _______, _______, + KC_TAB, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_UE, CU_ED, CU_OE, CU_ED, _______, _______, _______, _______, _______, + _______, CU_AE, CU_SS, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_DDQ, _______, _______, _______, _______, + _______, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, CU_DDQ, CU_DDQ, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +/* Navigation +,---------------------------------------------------------------------------------------------------------------------------------------------------------------. +|Escape | | | | | | | | | | | |Numlock |/ |* |- | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|ESCT |PageDown |Up |PageUp |Home | | | |Win+Up | | |Del |7 |8 |9 |+ | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |Left |Down |Right |End | | |Win+Left |Win+Down |Win+Right| |Enter |4 |5 |6 |= | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |Prev |Pause |Next |LowerVol |RaiseVol |Mute | | | | | |1 |2 |3 |Enter | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|RESET | | | | | | | | | | |Game |00 |0 |. |Tab | +`---------------------------------------------------------------------------------------------------------------------------------------------------------------' +*/ + +[_NAV] = LAYOUT( + KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, + CU_ESCT, KC_PGDN, KC_UP, KC_PGUP, KC_HOME, XXXXXXX, XXXXXXX, XXXXXXX, GUIU, XXXXXXX, XXXXXXX, KC_DEL, _______, _______, _______, _______, + _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, XXXXXXX, XXXXXXX, GUIL, GUID, GUIR, XXXXXXX, KC_ENT, _______, _______, _______, _______, + _______, KC_MPRV, KC_MPLY, KC_MNXT, KC_VOLD, KC_VOLU, KC_MUTE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, _______, + RESET, _______, _______, _______, _______, KC_SPC, KC_ENT, _______, _______, _______, _______, CU_GAME, _______, _______, _______, _______ +), + +// Can be used to place macros on the numpad +[_GAME] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +) +#endif + +#ifdef LEFTNUM +/* Base +,---------------------------------------------------------------------------------------------------------------------------------------------------------------. +|- |* |/ |Numlock |` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 |\ | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|+ |7 |8 |9 |Tab |Q |W |E |R |T |Z |U |I |O |P |Backspace| +|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|= |4 |5 |6 |Esc/Nav |A |S |D |F |G |H |J |K |L |; |' | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Enter |1 |2 |3 |(/LShift |Y |X |C |V |B |N |M |, |. |/ |)/RShift | +|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Backspace|. |0 |00 |RCtrl | |Alt |Win |Lower |Space |Enter |Raise |Win |AltGr | |LCtrl | +`---------------------------------------------------------------------------------------------------------------------------------------------------------------' +*/ + +[_BASE] = LAYOUT( + KC_PMNS, KC_PAST, KC_PSLS, KC_NLCK, CU_GRV, DE_1, DE_2, CU_3, DE_4, DE_5, CU_6, CU_7, CU_8, CU_9, CU_0, CU_BSLS, + KC_PPLS, KC_P7, KC_P8, KC_P9, KC_TAB, DE_Q, DE_W, DE_E, DE_R, DE_T, CU_Z, DE_U, DE_I, DE_O, DE_P, KC_BSPC, + KC_PEQL, KC_P4, KC_P5, KC_P6, CU_NAV, DE_A, DE_S, DE_D, DE_F, DE_G, DE_H, DE_J, DE_K, DE_L, CU_SCLN, CU_QUOT, + KC_PENT, KC_P1, KC_P2, KC_P3, CU_LSFT, CU_Y, DE_X, DE_C, DE_V, DE_B, DE_N, DE_M, CU_COMM, CU_DOT, CU_SLSH, CU_RSFT, + KC_BSPC, KC_PDOT, KC_P0, KC_P00, KC_LCTL, XXXXXXX, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_ENT, RAISE, KC_RALT, KC_RGUI, KC_APP, KC_RCTL +), + +/* Lower +,---------------------------------------------------------------------------------------------------------------------------------------------------------------. +|- |* |/ |Numlock |` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|+ |7 |8 |9 |~ |! |" |# |$ |% |^ |& |* |( |) | | +|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|= |4 |5 |6 | |@ |Strg+X |Strg+C |Strg+V | | |_ |+ |{ |} || | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Enter |1 |2 |3 | |? | | | | | | | | | | | +|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Backspace|. |0 |00 | | | | | | | | | | | | | +`---------------------------------------------------------------------------------------------------------------------------------------------------------------' +*/ + +[_LOWER] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, DE_TILD, DE_EXLM, DE_DQOT, DE_HASH, DE_DLR, DE_PERC, CU_CIRC, DE_AMPR, DE_ASTR, DE_LPRN, DE_RPRN, _______, + _______, _______, _______, _______, _______, DE_AT, CTRLX, CTRLC, CTRLV, XXXXXXX, XXXXXXX, DE_UNDS, DE_PLUS, DE_LCBR, DE_RCBR, DE_PIPE, + _______, _______, _______, _______, _______, DE_EURO, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +/* Raise +,---------------------------------------------------------------------------------------------------------------------------------------------------------------. +|- |* |/ |Numlock |` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|+ |7 |8 |9 |` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 | | +|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|= |4 |5 |6 | |F1 |F2 |F3 |F4 |F5 |F6 |- |= |[ |] |\ | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Enter |1 |2 |3 | |F7 |F8 |F9 |F10 |F11 |F12 | | | | | | +|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Backspace|. |0 |00 | | | | | | | | | | | | | +`---------------------------------------------------------------------------------------------------------------------------------------------------------------' +*/ + +[_RAISE] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, CU_GRV, DE_1, DE_2, CU_3, DE_4, DE_5, CU_6, CU_7, CU_8, CU_9, CU_0, _______, + _______, _______, _______, _______, _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, DE_MINS, CU_EQL, CU_LBRC, CU_RBRC, CU_BSLS, + _______, _______, _______, _______, _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +/* Deadkey +,---------------------------------------------------------------------------------------------------------------------------------------------------------------. +|- |* |/ |Numlock | | | | | | | | | | | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|+ |7 |8 |9 | | | | | | | |Ü | |Ö | | | +|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|= |4 |5 |6 | |Ä |ß | | | | | | | | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Enter |1 |2 |3 | | | | | | | | | | | | | +|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Backspace|. |0 |00 | | | | | |" |" | | | | | | +`---------------------------------------------------------------------------------------------------------------------------------------------------------------' +*/ + +[_DEADKEY] = LAYOUT( + _______, _______, _______, _______, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, + _______, _______, _______, _______, KC_TAB, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_UE, CU_ED, CU_OE, CU_ED, _______, + _______, _______, _______, _______, _______, CU_AE, CU_SS, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_DDQ, + _______, _______, _______, _______, _______, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, CU_DDQ, CU_DDQ, _______, _______, _______, _______, _______ +), + +/* Navigation +,---------------------------------------------------------------------------------------------------------------------------------------------------------------. +|- |* |/ |Numlock |Escape | | | | | | | | | | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|+ |7 |8 |9 |ESCT |PageDown |Up |PageUp |Home | | | |Win+Up | | |Del | +|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|= |4 |5 |6 | |Left |Down |Right |End | | |Win+Left |Win+Down |Win+Right| |Enter | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Enter |1 |2 |3 | |Prev |Pause |Next |LowerVol |RaiseVol |Mute | | | | | | +|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Backspace|. |0 |00 |RESET | | | | | | | | | | |Game | +`---------------------------------------------------------------------------------------------------------------------------------------------------------------' +*/ + +[_NAV] = LAYOUT( + _______, _______, _______, _______, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + _______, _______, _______, _______, CU_ESCT, KC_PGDN, KC_UP, KC_PGUP, KC_HOME, XXXXXXX, XXXXXXX, XXXXXXX, GUIU, XXXXXXX, XXXXXXX, KC_DEL, + _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, XXXXXXX, XXXXXXX, GUIL, GUID, GUIR, XXXXXXX, KC_ENT, + _______, _______, _______, _______, _______, KC_MPRV, KC_MPLY, KC_MNXT, KC_VOLD, KC_VOLU, KC_MUTE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, + _______, _______, _______, _______, RESET, _______, _______, _______, _______, KC_SPC, KC_ENT, _______, _______, _______, _______, CU_GAME +), + +// Can be used to place macros on the numpad +[_GAME] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +) +#endif + +}; + +bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { +switch (keycode) { + case MO(_LOWER): + if (game){ + if(record->event.pressed) { + register_code(KC_SPC); + } else { + unregister_code(KC_SPC); + } + return false; + } else { + return true; + } + case CU_GAME: + if(record->event.pressed) { + if (game) + layer_on(_GAME); + else + layer_off(_GAME); + } + return false; + default: + return true; + } +} diff --git a/keyboards/primekb/prime_o/keymaps/spacebarracecar/readme.md b/keyboards/primekb/prime_o/keymaps/spacebarracecar/readme.md new file mode 100644 index 000000000..eb8da3fa7 --- /dev/null +++ b/keyboards/primekb/prime_o/keymaps/spacebarracecar/readme.md @@ -0,0 +1,6 @@ +# SpacebarRacecar US-International Prime_O Keymap for German PCs + +This keymap emulates most keys of the US-International layout on PCs that have German set as input language. +This allows the use of the keyboard on any PC in Germany without the need to change any settings. +The keymap is mostly based on the Planck default layout but adds essential features for german input, like access to Ä, Ö, Ü, ß. +Righthand Numpad is enabled by default, enable lefthand Numpad with #define LEFTNUM. diff --git a/keyboards/primekb/prime_o/keymaps/spacebarracecar/rules.mk b/keyboards/primekb/prime_o/keymaps/spacebarracecar/rules.mk new file mode 100644 index 000000000..f50334d5e --- /dev/null +++ b/keyboards/primekb/prime_o/keymaps/spacebarracecar/rules.mk @@ -0,0 +1,22 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +# Userspace defines +GERMAN_ENABLE = yes # Enable Custom US Ansi Keycodes for PC with German set as input language diff --git a/users/spacebarracecar/spacebarracecar.c b/users/spacebarracecar/spacebarracecar.c index 404331f8d..f7048869e 100644 --- a/users/spacebarracecar/spacebarracecar.c +++ b/users/spacebarracecar/spacebarracecar.c @@ -1,18 +1,29 @@ #include "spacebarracecar.h" #ifdef GERMAN_ENABLE +// These indicate if left and right shift are physically pressed bool lshift = false; bool rshift = false; + +// Interrupt and times for space cadet shift bool lshiftp = false; bool rshiftp = false; uint16_t lshift_timer = 0; uint16_t rshift_timer = 0; +// Number of items that are saved in prev_kcs uint8_t prev_indx = 0; +// Used to save the last 6 actual keycodes activated by frankenkeycodes uint16_t prev_kcs[6] = {0, 0, 0, 0, 0, 0}; +// If true the deadkey characters grave and circonflexe are not automatically escaped bool esct = false; +/* +Used to add a keycode to a prev_kcs to remember it. +When full the last code gets discarded and replaced by +the new one. +*/ void add_to_prev(uint16_t kc){ for (int i=0; ievent.pressed) { + timer_timeout(); game = !game; } - return false; + // allows keymap to execute further commands when CU_GAME is pressed, for example enabling a macro layer + return process_record_keymap(keycode, record) && false; case KC_LGUI: case KC_RGUI: + if (record->event.pressed) + timer_timeout(); if (game) return false; else @@ -77,11 +102,21 @@ bool process_record_userspace(uint16_t keycode, keyrecord_t *record) { } layer_off(_NAV); } - return false; + return false; + case KC_P00: + if(record->event.pressed) { + timer_timeout(); + register_code(KC_P0); + unregister_code(KC_P0); + register_code(KC_P0); + unregister_code(KC_P0); + } + return false; #ifdef RGBLIGHT_ENABLE case CU_RGBV: if(record->event.pressed) { + timer_timeout(); if (rgblight_get_val()+32>255) rgblight_sethsv(rgblight_get_hue(), rgblight_get_sat(), 31); else @@ -133,6 +168,7 @@ bool process_record_userspace(uint16_t keycode, keyrecord_t *record) { return false; case CU_ESCT: if(record->event.pressed) { + timer_timeout(); esct = !esct; } return false; @@ -282,6 +318,7 @@ bool process_record_userspace(uint16_t keycode, keyrecord_t *record) { case KC_LCTL: case KC_RCTL: if(!record->event.pressed) { + timer_timeout(); unregister_code(KC_Z); unregister_code(KC_Y); } @@ -300,6 +337,6 @@ bool process_record_userspace(uint16_t keycode, keyrecord_t *record) { #endif } - return true; + return process_record_keymap(keycode, record); } } diff --git a/users/spacebarracecar/spacebarracecar.h b/users/spacebarracecar/spacebarracecar.h index 42879d2ef..1e1825351 100644 --- a/users/spacebarracecar/spacebarracecar.h +++ b/users/spacebarracecar/spacebarracecar.h @@ -4,13 +4,14 @@ #include "keymap_german.h" enum userspace_layers { - _DEADKEY = 14, //change if more than 16 layers are required + _DEADKEY = 14, // Change if more than 16 layers are required _NAV }; enum userspace_custom_keycodes { CU_GAME = SAFE_RANGE, // Toggle game mode on/off CU_NAV, // NAV | ESC + KC_P00, // Numpad double zero #ifdef GERMAN_ENABLE CU_LSFT, // LSFT | ( @@ -52,10 +53,8 @@ enum userspace_custom_keycodes { }; #ifdef GERMAN_ENABLE -// these save the current shift status extern bool lshift; extern bool rshift; -// stuff for custom space cadet shift extern bool lshiftp; extern bool rshiftp; extern uint16_t lshift_timer; @@ -63,14 +62,12 @@ extern uint16_t rshift_timer; extern uint8_t prev_indx; extern uint16_t prev_kcs[6]; - void add_to_prev(uint16_t kc); void unreg_prev(void); extern bool esct; #endif -// stuff for nav esc extern bool navesc; extern uint16_t navesc_timer; @@ -78,7 +75,7 @@ extern bool game; void timer_timeout(void); -bool process_record_userspace(uint16_t keycode, keyrecord_t *record); +bool process_record_keymap(uint16_t keycode, keyrecord_t *record); #define CTRLX LCTL(KC_X) #define CTRLC LCTL(KC_C) @@ -89,9 +86,9 @@ bool process_record_userspace(uint16_t keycode, keyrecord_t *record); #define GUIL LGUI(KC_LEFT) #define GUIR RGUI(KC_RIGHT) -// -// Templates for Keys, with custom shifted and non shifted Characters -// +/* +Templates for Keys, with custom shifted and non shifted Characters +*/ // Normal shift status #define SHIFT_NORM(kc1, kc2) \ @@ -139,7 +136,7 @@ if (record->event.pressed) { \ } \ return false; -// All shift +// Always shifted #define SHIFT_ALL(kc1, kc2) \ if (record->event.pressed) { \ timer_timeout(); \ @@ -164,7 +161,7 @@ if (record->event.pressed) { \ } \ return false; -// All no shift +// Never shifted #define SHIFT_NO(kc1, kc2) \ if (record->event.pressed) { \ timer_timeout(); \ @@ -188,7 +185,7 @@ if (record->event.pressed) { \ } \ return false; -// All algr +// Always AltGr #define SHIFT_ALGR(kc1, kc2) \ if (record->event.pressed) { \ timer_timeout(); \ @@ -208,7 +205,7 @@ if (record->event.pressed) { \ } \ return false; -// Different keycode for ctrl +// Different keycode when Ctrl is pressed #define CTRL(kc1, kc2) \ if(record->event.pressed) { \ timer_timeout(); \ @@ -227,7 +224,7 @@ if(record->event.pressed) { \ } \ return false; -// Umlaute for deadkey layer +// Template for keys on deadkey layer (mostly Umlaute) #define UML(kc) \ if(record->event.pressed) { \ timer_timeout(); \ From ca56c2145f25ab04daa6bb96f31b948be9e57ef2 Mon Sep 17 00:00:00 2001 From: skullY Date: Tue, 9 Oct 2018 09:40:10 -0700 Subject: [PATCH 345/788] Fold install_dependencies.sh into linux_install.sh and freebsd_install.sh --- util/freebsd_install.sh | 18 ++++++ util/install_dependencies.sh | 118 ----------------------------------- util/linux_install.sh | 116 +++++++++++++++++++++++++--------- util/qmk_install.sh | 13 ++-- 4 files changed, 114 insertions(+), 151 deletions(-) create mode 100644 util/freebsd_install.sh delete mode 100755 util/install_dependencies.sh diff --git a/util/freebsd_install.sh b/util/freebsd_install.sh new file mode 100644 index 000000000..25ea80a7f --- /dev/null +++ b/util/freebsd_install.sh @@ -0,0 +1,18 @@ +#!/bin/sh +pkg update +pkg install -y \ + git \ + wget \ + gmake \ + gcc \ + zip \ + unzip \ + avr-binutils \ + avr-gcc \ + avr-libc \ + dfu-programmer \ + dfu-util \ + arm-none-eabi-gcc \ + arm-none-eabi-binutils \ + arm-none-eabi-newlib \ + diffutils diff --git a/util/install_dependencies.sh b/util/install_dependencies.sh deleted file mode 100755 index 227c86f87..000000000 --- a/util/install_dependencies.sh +++ /dev/null @@ -1,118 +0,0 @@ -#!/usr/bin/env bash -# This script will attempt to setup the Linux dependencies for compiling QMK/TMK - -# This could probably go much lower, but since we are including an Arch vagrant, -# making it the first match makes sense - -if [[ -n "$(type -P pacman )" ]]; then - # Arch linux and derivatives like Apricity - # Future improvements: - # Allow user to speed up package installs using powerpill/wget tweaks - # Always run the pacman mirror update script if possible when vagrant comes up - # This will ensure that users never get stalled on a horribly slow mirror - pacman -Syyu --needed --noconfirm - pacman -S --needed --noconfirm \ - base-devel \ - avr-gcc \ - avr-binutils \ - avr-libc \ - dfu-util \ - arm-none-eabi-gcc \ - arm-none-eabi-binutils \ - arm-none-eabi-newlib \ - git \ - diffutils - -elif [[ -n "$(type -P apt-get)" ]]; then - # Debian and derivatives - # This block performs completely non-interactive updates {{ - export DEBIAN_FRONTEND=noninteractive - export DEBCONF_NONINTERACTIVE_SEEN=true - echo "grub-pc hold" | dpkg --set-selections - apt-get -y update - apt-get -y --allow-unauthenticated upgrade \ - -o Dpkg::Options::="--force-confdef" \ - -o Dpkg::Options::="--force-confold" - # }} - apt-get install -y \ - build-essential \ - gcc \ - unzip \ - wget \ - zip \ - gcc-avr \ - binutils-avr \ - avr-libc \ - dfu-programmer \ - dfu-util \ - gcc-arm-none-eabi \ - binutils-arm-none-eabi \ - libnewlib-arm-none-eabi \ - git \ - diffutils - -elif [[ -n "$(type -P yum)" ]]; then - # Fedora, CentOS or RHEL and derivatives - yum -y makecache && yum -y update - yum -y install \ - gcc \ - glibc-headers \ - kernel-devel \ - kernel-headers \ - make \ - perl \ - git \ - wget \ - avr-binutils \ - avr-gcc \ - avr-libc \ - dfu-programmer \ - dfu-util \ - arm-none-eabi-gcc-cs \ - arm-none-eabi-newlib \ - git \ - diffutils - # The listed eabi pacackes do unfortunately not exist for CentOS, - # But at least in Fedora they do, so try to install them anyway - # TODO: Build them from sources, if the installation fails - -elif [[ -n "$(type -P zypper)" ]]; then - # openSUSE - zypper --non-interactive refresh && zypper --non-interactive update - zypper --non-interactive install \ - git \ - make \ - gcc \ - kernel-devel \ - patch \ - wget \ - dfu-programmer \ - git \ - diffutils - # TODO: The avr and eabi tools are not available as default packages, so we need - # another way to install them - -elif [[ -n "$(type -P pkg)" ]]; then - # FreeBSD - pkg update - pkg install -y \ - git \ - wget \ - gmake \ - gcc \ - zip \ - unzip \ - avr-binutils \ - avr-gcc \ - avr-libc \ - dfu-programmer \ - dfu-util \ - arm-none-eabi-gcc \ - arm-none-eabi-binutils \ - arm-none-eabi-newlib \ - diffutils -elif [[ -n "$(type -P emerge)" ]]; then - echo 'Please check that your gcc is built with the multilib use flag enabled.' - emerge -vq sys-devel/crossdev - USE="-openmp -hardened -sanitize -vtv" crossdev -s4 --stable --g =4.9.4 --portage --verbose --target avr -fi diff --git a/util/linux_install.sh b/util/linux_install.sh index 0e4e26fd9..a6a053276 100755 --- a/util/linux_install.sh +++ b/util/linux_install.sh @@ -1,40 +1,100 @@ #!/bin/sh -if grep ID /etc/os-release | grep -qE "rhel|fedora"; then - # RPM based OS - sudo dnf install gcc unzip wget zip dfu-util dfu-programmer avr-gcc \ - avr-libc binutils-avr32-linux-gnu arm-none-eabi-gcc-cs \ - arm-none-eabi-binutils-cs arm-none-eabi-newlib + +# Note: This file uses tabs to indent. Please don't mix tabs and spaces. + +GENTOO_WARNING="This script will make a USE change in order to ensure that that QMK works on your system. All changes will be sent to the the file /etc/portage/package.use/qmk_firmware -- please review it, and read Portage's output carefully before installing any packages on your system. You will also need to ensure that your kernel is compiled with support for the keyboard chip that you are using (e.g. enable Arduino for the Pro Micro). Further information can be found on the Gentoo wiki." + +if grep ID /etc/os-release | grep -qE "fedora"; then + sudo dnf install \ + arm-none-eabi-binutils-cs \ + arm-none-eabi-gcc-cs \ + arm-none-eabi-newlib + avr-binutils \ + avr-gcc \ + avr-libc \ + binutils-avr32-linux-gnu \ + dfu-util \ + dfu-programmer \ + diffutils \ + git \ + gcc \ + glibc-headers \ + kernel-devel \ + kernel-headers \ + make \ + perl \ + unzip \ + wget \ + zip + elif grep ID /etc/os-release | grep -qE 'debian|ubuntu'; then + DEBIAN_FRONTEND=noninteractive + DEBCONF_NONINTERACTIVE_SEEN=true + export DEBIAN_FRONTEND DEBCONF_NONINTERACTIVE_SEEN sudo apt-get update - sudo apt-get install gcc unzip wget zip gcc-avr binutils-avr avr-libc \ - dfu-programmer dfu-util gcc-arm-none-eabi binutils-arm-none-eabi \ - libnewlib-arm-none-eabi + sudo apt-get install \ + build-essential \ + avr-libc \ + binutils-arm-none-eabi \ + binutils-avr \ + dfu-programmer \ + dfu-util \ + diffutils \ + gcc \ + gcc-arm-none-eabi \ + gcc-avr \ + git \ + libnewlib-arm-none-eabi \ + unzip \ + wget \ + zip + elif grep ID /etc/os-release | grep -q 'arch\|manjaro'; then - # install avr-gcc 8.1 until 8.3 is available. See #3657 for details of the bug. - sudo pacman -U https://archive.archlinux.org/packages/a/avr-gcc/avr-gcc-8.1.0-1-x86_64.pkg.tar.xz - sudo pacman -S gcc unzip wget zip avr-binutils avr-libc \ - dfu-util arm-none-eabi-gcc arm-none-eabi-binutils \ - arm-none-eabi-newlib + # install avr-gcc 8.1 until 8.3 is available. See #3657 for details of the bug. + sudo pacman -U https://archive.archlinux.org/packages/a/avr-gcc/avr-gcc-8.1.0-1-x86_64.pkg.tar.xz + sudo pacman -S \ + arm-none-eabi-binutils \ + arm-none-eabi-gcc \ + arm-none-eabi-newlib \ + avr-binutils \ + avr-libc \ + avr-gcc \ + base-devel \ + dfu-util \ + diff-utils \ + gcc \ + git \ + unzip \ + wget \ + zip git clone https://aur.archlinux.org/dfu-programmer.git /tmp/dfu-programmer cd /tmp/dfu-programmer makepkg -sic rm -rf /tmp/dfu-programmer/ + elif grep ID /etc/os-release | grep -q gentoo; then - echo "This script will make a USE change in order to ensure that that QMK works on your system. All changes will be sent to the the file /etc/portage/package.use/qmk_firmware -- please review it, and read Portage's output carefully before installing any packages on your system. You will also need to ensure that your kernel is compiled with support for the keyboard chip that you are using (e.g. enable Arduino for the Pro Micro). Further information can be found on the Gentoo wiki." - echo -n "Proceed (y/N)? " - old_stty_cfg=$(stty -g) - stty raw -echo - answer=$( while ! head -c 1 | grep -i '[ny]' ;do true ;done ) - stty $old_stty_cfg - if echo "$answer" | grep -iq "^y" ;then - sudo touch /etc/portage/package.use/qmkfirmware - echo "sys-devel/gcc multilib" | sudo tee --append /etc/portage/package.use/qmkfirmware > /dev/null - sudo emerge -auN sys-devel/gcc app-arch/unzip app-arch/zip net-misc/wget app-mobilephone/dfu-util sys-devel/crossdev dev-embedded/avrdude - sudo crossdev -s4 --stable --g =4.9.4 --portage --verbose --target avr - echo Done! - else - echo "Quitting..." -fi + echo GENTOO_WARNING | fmt + echo -n "Proceed (y/N)? " + old_stty_cfg=$(stty -g) + stty raw -echo + answer=$( while ! head -c 1 | grep -i '[ny]' ;do true ;done ) + stty $old_stty_cfg + if echo "$answer" | grep -iq "^y" ;then + sudo touch /etc/portage/package.use/qmkfirmware + echo "sys-devel/gcc multilib" | sudo tee --append /etc/portage/package.use/qmkfirmware > /dev/null + sudo emerge -auN \ + app-arch/unzip \ + app-arch/zip \ + app-mobilephone/dfu-util \ + net-misc/wget \ + sys-devel/gcc \ + sys-devel/crossdev dev-embedded/avrdude + sudo crossdev -s4 --stable --g =4.9.4 --portage --verbose --target avr + echo Done! + else + echo "Quitting..." + fi + else echo "Sorry, we don't recognize your OS. Help us by contributing support!" echo diff --git a/util/qmk_install.sh b/util/qmk_install.sh index 6f35e4c71..76ecf5fc0 100755 --- a/util/qmk_install.sh +++ b/util/qmk_install.sh @@ -7,16 +7,19 @@ case $(uname -a) in *Darwin*) exec "${util_dir}/macos_install.sh" ;; - *Linux*Microsoft*) + *Linux*Microsoft*) exec "${util_dir}/wsl_install.sh" - ;; + ;; + *FreeBSD*) + exec "${util_dir}/freebsd_install.sh" + ;; *Linux*) exec "${util_dir}/linux_install.sh" ;; MSYS_NT*|MINGW64_NT*|MINGW32_NT*) exec "${util_dir}/msys2_install.sh" ;; - *) - echo "Environment not supported. Please see https://docs.qmk.fm for details on how to configure the QMK Firmware build tools manually." - ;; + *) + echo "Environment not supported. Please see https://docs.qmk.fm for details on how to configure the QMK Firmware build tools manually." + ;; esac From 79d495f51dd0d49a4e0ba84f3bcec588dba498b5 Mon Sep 17 00:00:00 2001 From: skullY Date: Tue, 9 Oct 2018 10:21:13 -0700 Subject: [PATCH 346/788] Add opensuse packages provided by @isolatedvirus --- util/linux_install.sh | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/util/linux_install.sh b/util/linux_install.sh index a6a053276..5186e31f2 100755 --- a/util/linux_install.sh +++ b/util/linux_install.sh @@ -95,6 +95,20 @@ elif grep ID /etc/os-release | grep -q gentoo; then echo "Quitting..." fi +elif grep ID /etc/os-release | grep -qE "opensuse|tumbleweed"; then + sudo zypper install \ + avr-libc \ + cross-avr-gcc8 \ + cross-avr-binutils \ + cross-arm-none-newlib-devel \ + cross-arm-binutils cross-arm-none-newlib-devel \ + dfu-tool \ + dfu-programmer \ + gcc \ + unzip \ + wget \ + zip + else echo "Sorry, we don't recognize your OS. Help us by contributing support!" echo From 11c4c711310d297a378f029b7ffa1409d5a04dbc Mon Sep 17 00:00:00 2001 From: skullY Date: Tue, 9 Oct 2018 11:35:31 -0700 Subject: [PATCH 347/788] Fixup the WSL install --- util/win_shared_install.sh | 3 --- util/wsl_install.sh | 7 +------ 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/util/win_shared_install.sh b/util/win_shared_install.sh index f24ec08e8..c7517881e 100644 --- a/util/win_shared_install.sh +++ b/util/win_shared_install.sh @@ -18,11 +18,8 @@ function install_utils { wget 'https://www.pjrc.com/teensy/teensy_loader_cli_windows.zip' unzip teensy_loader_cli_windows.zip - # This URL has changed and I can't find the new location. Commenting out until we figure out the new URL or determine this isn't needed. -skullY echo "Installing Atmel Flip" wget 'http://ww1.microchip.com/downloads/en/DeviceDoc/Flip%20Installer%20-%203.4.7.112.exe' - # This is the JRE-less installer, if we need the larger bundled with JRE installer, use this: - #wget 'http://ww1.microchip.com/downloads/en/DeviceDoc/JRE%20-%20Flip%20Installer%20-%203.4.7.112.exe' mv Flip\ Installer\ \-\ 3.4.7.112.exe FlipInstaller.exe echo "Downloading the QMK driver installer" diff --git a/util/wsl_install.sh b/util/wsl_install.sh index d11c78ac7..c2c206d2b 100644 --- a/util/wsl_install.sh +++ b/util/wsl_install.sh @@ -15,20 +15,15 @@ fi while true; do echo echo "Do you want to install all toolchain dependencies needed for compiling QMK?" - echo "This will run install_dependencies.sh, which calls apt-get upgrade." echo "If you don't want that, you can install the dependencies manually." read -p "(Y/N) " res case $res in - [Yy]* ) sudo ./install_dependencies.sh; break;; + [Yy]* ) ./linux_install.sh; break;; [Nn]* ) break;; * ) echo "Invalid answer";; esac done -echo "Installing dependencies needed for the installation (unzip, wget)" -echo "This will ask for the sudo password" -sudo apt-get install unzip wget - download_dir=wsl_downloaded source "$dir/win_shared_install.sh" From 552b1cccec12f2685f594df5b58afc11ca1fbc74 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Thu, 18 Oct 2018 21:33:50 -0700 Subject: [PATCH 348/788] Update the installation script PR (#4167) * Update docs to use qmk_install * Update Vagrantfile to use qmk_install --- Vagrantfile | 2 +- docs/getting_started_build_tools.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Vagrantfile b/Vagrantfile index 08de5f7f5..9c414b2bc 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -59,7 +59,7 @@ Vagrant.configure(2) do |config| # add a # before ,args: and run 'vagrant up' to get a working # non-updated box and then attempt to troubleshoot or open a Github issue - config.vm.provision "shell", run: "always", path: "./util/install_dependencies.sh", args: "-update" + config.vm.provision "shell", run: "always", path: "./util/qmk_install.sh", args: "-update" config.vm.post_up_message = <<-EOT diff --git a/docs/getting_started_build_tools.md b/docs/getting_started_build_tools.md index 88f3642b2..587dece4a 100644 --- a/docs/getting_started_build_tools.md +++ b/docs/getting_started_build_tools.md @@ -8,7 +8,7 @@ Note: If it is your first time here, Check out the "Complete Newbs guide" instea ## Linux -To ensure you are always up to date, you can just run `sudo util/install_dependencies.sh`. That should always install all the dependencies needed. **This will run `apt-get upgrade`.** +To ensure you are always up to date, you can just run `sudo util/qmk_install.sh`. That should always install all the dependencies needed. **This will run `apt-get upgrade`.** You can also install things manually, but this documentation might not be always up to date with all requirements. From 418a886ae44833eb323e2e902b92759369063339 Mon Sep 17 00:00:00 2001 From: "Colin T.A. Gray" Date: Mon, 22 Oct 2018 14:56:52 -0400 Subject: [PATCH 349/788] adds 'dfu-util' to macos_install.sh --- util/macos_install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/macos_install.sh b/util/macos_install.sh index 7bfb105ec..c31be99d2 100755 --- a/util/macos_install.sh +++ b/util/macos_install.sh @@ -22,4 +22,4 @@ fi brew tap osx-cross/avr brew tap PX4/homebrew-px4 brew update -brew install avr-gcc@7 gcc-arm-none-eabi dfu-programmer avrdude +brew install avr-gcc@7 gcc-arm-none-eabi dfu-programmer avrdude dfu-util From e26a7b0ed8af7b6b4e99fee718ca265fcc8961f1 Mon Sep 17 00:00:00 2001 From: fougner Date: Mon, 22 Oct 2018 23:01:45 +0200 Subject: [PATCH 350/788] Keyboard: initial support for XD87 (#4182) * Keyboard: initial support for XD87 * Add row/col pin configuration for XD87 PCB * Add default ISO layout * Fix incorrect KC in default_tkl_iso The KC_NUBS is duplicated in the TKL ISO layout. Compare with the fullsize ISO which has a KC_NUHS in the corresponding place. * Add support for community layouts * Add TKL ANSI layout * Enable TKL ISO/ANSI community layout * Fix LAYOUT_all * Configure backlighting for XD87 * Various documentation changes --- keyboards/xd87/config.h | 227 ++++++++++++++++++ keyboards/xd87/info.json | 0 keyboards/xd87/keymaps/default/config.h | 19 ++ keyboards/xd87/keymaps/default/keymap.c | 68 ++++++ keyboards/xd87/keymaps/default/readme.md | 1 + keyboards/xd87/readme.md | 26 ++ keyboards/xd87/rules.mk | 84 +++++++ keyboards/xd87/xd87.c | 43 ++++ keyboards/xd87/xd87.h | 70 ++++++ .../default/tkl_iso/default_tkl_iso/keymap.c | 2 +- 10 files changed, 539 insertions(+), 1 deletion(-) create mode 100644 keyboards/xd87/config.h create mode 100644 keyboards/xd87/info.json create mode 100644 keyboards/xd87/keymaps/default/config.h create mode 100644 keyboards/xd87/keymaps/default/keymap.c create mode 100644 keyboards/xd87/keymaps/default/readme.md create mode 100644 keyboards/xd87/readme.md create mode 100644 keyboards/xd87/rules.mk create mode 100644 keyboards/xd87/xd87.c create mode 100644 keyboards/xd87/xd87.h diff --git a/keyboards/xd87/config.h b/keyboards/xd87/config.h new file mode 100644 index 000000000..3682af740 --- /dev/null +++ b/keyboards/xd87/config.h @@ -0,0 +1,227 @@ +/* +Copyright 2018 Alexander Fougner + +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 . +*/ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0000 +#define DEVICE_VER 0x0001 +#define MANUFACTURER KP Republic +#define PRODUCT XD87 TKL +#define DESCRIPTION KP Republic XD87 + +/* key matrix size */ +#define MATRIX_ROWS 6 +#define MATRIX_COLS 17 + +/* + * 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 { D1, B0, B1, C7, D3, D5 } + +#define MATRIX_COL_PINS { E6, F0, F1, F4, F5, F6, F7, B5, B6, C6, D4, D6, D7, B4, B2, B3, D2 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +#define BACKLIGHT_PIN D0 +// #define BACKLIGHT_BREATHING +#define BACKLIGHT_LEVELS 3 + +// #define RGB_DI_PIN E2 +// #ifdef RGB_DI_PIN +// #define RGBLIGHT_ANIMATIONS +// #define RGBLED_NUM 16 +// #define RGBLIGHT_HUE_STEP 8 +// #define RGBLIGHT_SAT_STEP 8 +// #define RGBLIGHT_VAL_STEP 8 +// #endif + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* 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 userful 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 + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * 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 + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +//#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ + diff --git a/keyboards/xd87/info.json b/keyboards/xd87/info.json new file mode 100644 index 000000000..e69de29bb diff --git a/keyboards/xd87/keymaps/default/config.h b/keyboards/xd87/keymaps/default/config.h new file mode 100644 index 000000000..ed56340c3 --- /dev/null +++ b/keyboards/xd87/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 Alexander Fougner + * + * 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 . + */ + +#pragma once + +// place overrides here diff --git a/keyboards/xd87/keymaps/default/keymap.c b/keyboards/xd87/keymaps/default/keymap.c new file mode 100644 index 000000000..b31db9b57 --- /dev/null +++ b/keyboards/xd87/keymaps/default/keymap.c @@ -0,0 +1,68 @@ +/* Copyright 2018 Alexander Fougner + * + * 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 . + */ +#include QMK_KEYBOARD_H + +// Defines the keycodes used by our macros in process_record_user +enum custom_keycodes { + QMKBEST = SAFE_RANGE, + QMKURL +}; + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_tkl_iso(\ + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_DEL, KC_END, KC_PGDN, \ + KC_CAPS,KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_NUHS, KC_ENT, \ + KC_LSFT,KC_NUBS,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT, KC_UP, \ + KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT ) +}; + + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QMKBEST: + if (record->event.pressed) { + // when keycode QMKBEST is pressed + SEND_STRING("QMK is the best thing ever!"); + } else { + // when keycode QMKBEST is released + } + break; + case QMKURL: + if (record->event.pressed) { + // when keycode QMKURL is pressed + SEND_STRING("https://qmk.fm/" SS_TAP(X_ENTER)); + } else { + // when keycode QMKURL is released + } + break; + } + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/xd87/keymaps/default/readme.md b/keyboards/xd87/keymaps/default/readme.md new file mode 100644 index 000000000..41baff943 --- /dev/null +++ b/keyboards/xd87/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for xd87 \ No newline at end of file diff --git a/keyboards/xd87/readme.md b/keyboards/xd87/readme.md new file mode 100644 index 000000000..0b9389740 --- /dev/null +++ b/keyboards/xd87/readme.md @@ -0,0 +1,26 @@ +# XD87 + +![XD87](https://i.imgur.com/qVyOies.jpg) + + +- Keyboard Maintainer: [Alexander Fougner](https://github.com/fougner) +- Hardware Supported: XD87 PCB v1.1 +- Hardware Availability: + - [KPrepublic.com](https://kprepublic.com/products/xd87-xd87-xd80-custom-mechanical-keyboard-kit80-supports-tkg-tools-support-underglow-rgb-pcb-programmed-gh80-kle) + - [AliExpress](https://www.aliexpress.com/item/xd87-XD87-XD80-Custom-Mechanical-Keyboard-Kit80-Supports-TKG-TOOLS-Support-Underglow-RGB-PCB-programmed-gh80/32892540743.html) + +Make example for this keyboard (after setting up your build environment): + + make xd87:default + +It also supports the tkl_ansi and tkl_iso community layouts: + + # Build firmware with ANSI layout + make xd87:default_tkl_ansi + # Build firmware with ISO layout + make xd87:default_tkl_iso + + +The keyboard can be reset to bootloader by using bootmagic (space+b by default) or short out the small connector between the Delete and End keys. + +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). \ No newline at end of file diff --git a/keyboards/xd87/rules.mk b/keyboards/xd87/rules.mk new file mode 100644 index 000000000..39540e701 --- /dev/null +++ b/keyboards/xd87/rules.mk @@ -0,0 +1,84 @@ +# MCU name +#MCU = at90usb1286 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = no # USB Nkey Rollover +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) + +# Supported layouts +LAYOUTS = tkl_ansi tkl_iso diff --git a/keyboards/xd87/xd87.c b/keyboards/xd87/xd87.c new file mode 100644 index 000000000..da07c71d8 --- /dev/null +++ b/keyboards/xd87/xd87.c @@ -0,0 +1,43 @@ +/* Copyright 2018 Alexander Fougner + * + * 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 . + */ +#include "xd87.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + + led_set_user(usb_led); +} diff --git a/keyboards/xd87/xd87.h b/keyboards/xd87/xd87.h new file mode 100644 index 000000000..c4df290a3 --- /dev/null +++ b/keyboards/xd87/xd87.h @@ -0,0 +1,70 @@ +/* Copyright 2018 Alexander Fougner + * + * 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 . + */ +#ifndef XD87_H +#define XD87_H + +#include "quantum.h" + +#define LAYOUT_all( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, K0G, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K3E, K1E, K1F, K1G, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, K2F, K2G, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \ + K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4D, K4E, K4F, K4G, \ + K50, K51, K52, K55, K58, K5A, K5B, K5C, K5D, K5E, K5F, K5G \ +) { \ +/* 0 1 2 3 4 5 6 7 8 9 A B C D E F G */ \ +/* 0 */ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, K0G }, \ +/* 1 */ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F, K1G }, \ +/* 2 */ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, K2F, K2G }, \ +/* 3 */ { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, KC_NO, KC_NO, KC_NO }, \ +/* 4 */ { K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4D, K4E, K4F, K4G }, \ +/* 5 */ { K50, K51, K52, KC_NO, KC_NO, K55, KC_NO, KC_NO, K58, KC_NO, K5A, K5B, K5C, K5D, K5E, K5F, K5G } \ +} + +#define LAYOUT_tkl_ansi( \ + K00, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, K0G, \ + K01, K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1D, K1E, K1F, K1G, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, K2F, K2G, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, \ + K40, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4F, \ + K50, K51, K52, K58, K5A, K5B, K5C, K5D, K5E, K5F, K5G \ +) LAYOUT_all( \ + K00, KC_NO, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, K0G, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, KC_NO, K1D, KC_NO, K1E, K1F, K1G, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, K2F, K2G, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, KC_NO, K3D, \ + K40, KC_NO, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, KC_NO, KC_NO, K4F, KC_NO, \ + K50, K51, K52, KC_NO, K58, K5A, K5B, K5C, K5D, K5E, K5F, K5G \ +) + +#define LAYOUT_tkl_iso( \ + K00, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, K0G, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F, K1G, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2E, K2F, K2G, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \ + K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4F, \ + K50, K51, K52, K58, K5A, K5B, K5C, K5D, K5E, K5F, K5G \ +) LAYOUT_all( \ + K00, KC_NO, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, K0G, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, KC_NO, K1E, K1F, K1G, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, KC_NO, K2E, K2F, K2G, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \ + K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, KC_NO, KC_NO, K4F, KC_NO, \ + K50, K51, K52, KC_NO, K58, K5A, K5B, K5C, K5D, K5E, K5F, K5G \ +) + +#endif \ No newline at end of file diff --git a/layouts/default/tkl_iso/default_tkl_iso/keymap.c b/layouts/default/tkl_iso/default_tkl_iso/keymap.c index f29ef2267..eb4c48d65 100644 --- a/layouts/default/tkl_iso/default_tkl_iso/keymap.c +++ b/layouts/default/tkl_iso/default_tkl_iso/keymap.c @@ -5,7 +5,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_DEL, KC_END, KC_PGDN, - KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUBS, KC_ENT, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT ) \ From 5dc41446aae0b429c72ca020cb20efb3356afee5 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Mon, 22 Oct 2018 14:18:47 -0700 Subject: [PATCH 351/788] Keyboard: Chimera LS refactor and Configurator support (#3715) * Matrix/keymap refactor - Deleted `KC_KEYMAP` macro - Renamed `KEYMAP` macro to `LAYOUT_ortho_4x12` - Default keymap updated to current QMK standards - #include QMK_KEYBOARD_H - Refactored from `KC_KEYMAP` to `LAYOUT_ortho_4x12` macro - `action_get_macro()` deprecated in favor of `process_record_user()` `rules.mk` *not* updated to include `LAYOUTS = ortho_4x12` because I have no idea if and how that works on a split and/or wireless keyboard. * readme cleanup: markdown formatting * Add Configurator support * added support for ortho_4x12 layout * Macro and readme updates Macros updated to use `KC_NO` directly. Readme updates and cleanup. --- keyboards/chimera_ls/chimera_ls.h | 46 ++-- keyboards/chimera_ls/info.json | 13 + keyboards/chimera_ls/keymaps/default/keymap.c | 227 +++++++++--------- keyboards/chimera_ls/readme.md | 10 +- keyboards/chimera_ls/rules.mk | 4 +- 5 files changed, 152 insertions(+), 148 deletions(-) create mode 100644 keyboards/chimera_ls/info.json diff --git a/keyboards/chimera_ls/chimera_ls.h b/keyboards/chimera_ls/chimera_ls.h index b39bcf204..bb99684e5 100644 --- a/keyboards/chimera_ls/chimera_ls.h +++ b/keyboards/chimera_ls/chimera_ls.h @@ -50,32 +50,30 @@ // The first section contains all of the arguements // The second converts the arguments into a two-dimensional array -#define KC_KEYMAP( \ - k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k10, k11, \ - k12, k13, k14, k15, k16, k17, k18, k19, k20, k21, k22, k23, \ - k24, k25, k26, k27, k28, k29, k30, k31, k32, k33, k34, k35, \ - k36, k37, k38, k39, k40, k41, k42, k43, k44, k45, k46, k47 \ -) \ -{ \ - { KC_##k43, KC_##k45, KC_##k34, KC_##k11, KC_##k23, KC_##k40, KC_##k38, KC_##k25, KC_##k00, KC_##k12 }, \ - { KC_##k31, KC_##k44, KC_##k46, KC_##k35, KC_##k22, KC_##k28, KC_##k39, KC_##k37, KC_##k24, KC_##k13 }, \ - { KC_##k30, KC_##k32, KC_##k33, KC_##k47, KC_##k09, KC_##k29, KC_##k27, KC_##k26, KC_##k36, KC_##k02 }, \ - { KC_##k19, KC_##k20, KC_##k21, KC_##k42, KC_##k18, KC_##k16, KC_##k15, KC_##k14, KC_##k41, KC_##k17 }, \ - { KC_##k06, KC_##k07, KC_##k08, KC_##k10, KC_NO, KC_##k05, KC_##k04, KC_##k03, KC_##k01, KC_NO }, \ +#define LAYOUT_ortho_4x12( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k10, k11, \ + k12, k13, k14, k15, k16, k17, k18, k19, k20, k21, k22, k23, \ + k24, k25, k26, k27, k28, k29, k30, k31, k32, k33, k34, k35, \ + k36, k37, k38, k39, k40, k41, k42, k43, k44, k45, k46, k47 \ + ) { \ + { k43, k45, k34, k11, k23, k40, k38, k25, k00, k12 }, \ + { k31, k44, k46, k35, k22, k28, k39, k37, k24, k13 }, \ + { k30, k32, k33, k47, k09, k29, k27, k26, k36, k02 }, \ + { k19, k20, k21, k42, k18, k16, k15, k14, k41, k17 }, \ + { k06, k07, k08, k10, KC_NO, k05, k04, k03, k01, KC_NO } \ } -#define KEYMAP( \ - k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k10, k11, \ - k12, k13, k14, k15, k16, k17, k18, k19, k20, k21, k22, k23, \ - k24, k25, k26, k27, k28, k29, k30, k31, k32, k33, k34, k35, \ - k36, k37, k38, k39, k40, k41, k42, k43, k44, k45, k46, k47 \ -) \ -{ \ - { k43, k45, k34, k11, k23, k40, k38, k25, k00, k12 }, \ - { k31, k44, k46, k35, k22, k28, k39, k37, k24, k13 }, \ - { k30, k32, k33, k47, k09, k29, k27, k26, k36, k02 }, \ - { k19, k20, k21, k42, k18, k16, k15, k14, k41, k17 }, \ - { k06, k07, k08, k10, KC_NO, k05, k04, k03, k01, KC_NO }, \ +#define LAYOUT_kc_ortho_4x12( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k10, k11, \ + k12, k13, k14, k15, k16, k17, k18, k19, k20, k21, k22, k23, \ + k24, k25, k26, k27, k28, k29, k30, k31, k32, k33, k34, k35, \ + k36, k37, k38, k39, k40, k41, k42, k43, k44, k45, k46, k47 \ + ) { \ + { KC_##k43, KC_##k45, KC_##k34, KC_##k11, KC_##k23, KC_##k40, KC_##k38, KC_##k25, KC_##k00, KC_##k12 }, \ + { KC_##k31, KC_##k44, KC_##k46, KC_##k35, KC_##k22, KC_##k28, KC_##k39, KC_##k37, KC_##k24, KC_##k13 }, \ + { KC_##k30, KC_##k32, KC_##k33, KC_##k47, KC_##k09, KC_##k29, KC_##k27, KC_##k26, KC_##k36, KC_##k02 }, \ + { KC_##k19, KC_##k20, KC_##k21, KC_##k42, KC_##k18, KC_##k16, KC_##k15, KC_##k14, KC_##k41, KC_##k17 }, \ + { KC_##k06, KC_##k07, KC_##k08, KC_##k10, KC_NO, KC_##k05, KC_##k04, KC_##k03, KC_##k01, KC_NO } \ } diff --git a/keyboards/chimera_ls/info.json b/keyboards/chimera_ls/info.json new file mode 100644 index 000000000..077a76079 --- /dev/null +++ b/keyboards/chimera_ls/info.json @@ -0,0 +1,13 @@ +{ + "keyboard_name": "Chimera LS", + "url": "", + "maintainer": "qmk", + "width": 13, + "height": 4, + "layouts": { + "LAYOUT_ortho_4x12": { + "key_count": 48, + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":7, "y":1}, {"x":8, "y":1}, {"x":9, "y":1}, {"x":10, "y":1}, {"x":11, "y":1}, {"x":12, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2}, {"x":5, "y":2}, {"x":7, "y":2}, {"x":8, "y":2}, {"x":9, "y":2}, {"x":10, "y":2}, {"x":11, "y":2}, {"x":12, "y":2}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":4, "y":3}, {"x":5, "y":3}, {"x":7, "y":3}, {"x":8, "y":3}, {"x":9, "y":3}, {"x":10, "y":3}, {"x":11, "y":3}, {"x":12, "y":3}] + } + } +} diff --git a/keyboards/chimera_ls/keymaps/default/keymap.c b/keyboards/chimera_ls/keymaps/default/keymap.c index 493b8eee1..0affeef38 100644 --- a/keyboards/chimera_ls/keymaps/default/keymap.c +++ b/keyboards/chimera_ls/keymaps/default/keymap.c @@ -1,7 +1,7 @@ // this is the style you want to emulate. // This is the canonical layout file for the Quantum project. If you want to add another keyboard, -#include "chimera_ls.h" +#include QMK_KEYBOARD_H // Each layer gets a name for readability, which is then used in the keymap matrix below. // The underscores don't mean anything - you can have a layer called STUFF or any other name. @@ -24,168 +24,163 @@ enum chimera_lets_split_layers #define KC_SCTR MT(MOD_LCTL, KC_RBRC) #define KC_SPLT MT(MOD_LALT, KC_MINS) #define KC_MESC LT(_MACROS, KC_ESC) -#define KC_INCL M(0) -#define KC_PULL M(1) -#define KC_PUSH M(2) -#define KC_SCAP M(3) -#define KC_SCOF M(4) #define KC_CAD LALT(LCTL(KC_DEL)) +enum custom_keycodes { + KC_INCL = SAFE_RANGE, + KC_PULL, + KC_PUSH, + KC_SCAP, + KC_SCOF +}; + #define LONGPRESS_DELAY 150 //#define LAYER_TOGGLE_DELAY 300 -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO -#define KC_ KC_TRNS - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_QWERTY] = KC_KEYMAP( - //,----+----+----+----+----+----. ,----+----+----+----+----+----. - MESC, Q , W , E , R , T , Y , U , I , O , P ,BSPC, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - TAB , A , S , D , F , G , H , J , K , L ,SCLN, ENT, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - LSPO, Z , X , C , V , B , N , M ,COMM,DOT ,SLSH,RSPC, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - SCTL,SPFN,SPLT,AMPR,NMPD,SPC , SPC ,SYMB,ASTR,EXLM,LBRC,SCTR - //`----+----+----+----+----+----' `----+----+----+----+----+----' + [_QWERTY] = LAYOUT_ortho_4x12( + //,--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------. + KC_MESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + KC_SCTL, KC_SPFN, KC_SPLT, KC_AMPR, KC_NMPD, KC_SPC, KC_SPC, KC_SYMB, KC_ASTR, KC_EXLM, KC_LBRC, KC_SCTR + //`--------+--------+--------+--------+--------+--------' `--------+--------+--------+--------+--------+--------' ), - [_CAPS] = KC_KEYMAP( - //,----+----+----+----+----+----. ,----+----+----+----+----+----. - , , , , , , , , , , , , - //|----+----+----+----+----+----| |----+----+----+----+----+----| - , , , , , , , , , ,COLN, , - //|----+----+----+----+----+----| |----+----+----+----+----+----| - , , , , , , , , , , , , - //|----+----+----+----+----+----| |----+----+----+----+----+----| - , ,UNDS, , , , , , , , , - //`----+----+----+----+----+----' `----+----+----+----+----+----' + [_CAPS] = LAYOUT_ortho_4x12( + //,--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------. + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_COLN, _______, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, _______, KC_UNDS, _______, _______, _______, _______, _______, _______, _______, _______, _______ + //`--------+--------+--------+--------+--------+--------' `--------+--------+--------+--------+--------+--------' ), - [_NUMPAD] = KC_KEYMAP( - //,----+----+----+----+----+----. ,----+----+----+----+----+----. - , , , , , , , 7 , 8 , 9 ,MINS,QUOT, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - , , , , , , , 4 , 5 , 6 ,PLUS, ENT, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - LSFT, , , , , , , 1 , 2 , 3 ,ASTR, EQL, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - , , , , ,BSPC, SPC , 0 , 0 , DOT,SLSH, - //`----+----+----+----+----+----' `----+----+----+----+----+----' + [_NUMPAD] = LAYOUT_ortho_4x12( + //,--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------. + _______, _______, _______, _______, _______, _______, _______, KC_7, KC_8, KC_9, KC_MINS, KC_QUOT, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, _______, _______, _______, _______, _______, _______, KC_4, KC_5, KC_6, KC_PLUS, KC_ENT, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + KC_LSFT, _______, _______, _______, _______, _______, _______, KC_1, KC_2, KC_3, KC_ASTR, KC_EQL, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, _______, _______, _______, _______, KC_BSPC, KC_SPC, KC_0, KC_0, KC_DOT, KC_SLSH, _______ + //`--------+--------+--------+--------+--------+--------' `--------+--------+--------+--------+--------+--------' ), - [_SYMBOLS] = KC_KEYMAP( - //,----+----+----+----+----+----. ,----+----+----+----+----+----. - ,EXLM, AT ,HASH,DLR ,PERC, CIRC,AMPR,ASTR,LPRN,RPRN,QUOT, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - F1 , F2 , F3 , F4 , F5 , F6 , TILD,EQL ,UNDS,LCBR,RCBR,PIPE, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - F7 , F8 , F9 , F10, F11, F12, GRV ,PLUS,MINS,LBRC,RBRC,BSLS, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - , , , , NO ,BSPC, SPC , , , , , - //`----+----+----+----+----+----' `----+----+----+----+----+----' + [_SYMBOLS] = LAYOUT_ortho_4x12( + //,--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------. + _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_QUOT, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_TILD, KC_EQL, KC_UNDS, KC_LCBR, KC_RCBR, KC_PIPE, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_GRV, KC_PLUS, KC_MINS, KC_LBRC, KC_RBRC, KC_BSLS, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, _______, _______, _______, XXXXXXX, KC_BSPC, KC_SPC, _______, _______, _______, _______, _______ + //`--------+--------+--------+--------+--------+--------' `--------+--------+--------+--------+--------+--------' ), - [_NAV] = KC_KEYMAP( - //,----+----+----+----+----+----. ,----+----+----+----+----+----. - , , , , DEL,BSPC, ,HOME, UP , END, INS,PSCR, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - , , ,LSFT,LCTL, ENT, ,LEFT,DOWN,RGHT, DEL, , - //|----+----+----+----+----+----| |----+----+----+----+----+----| - , , , , , , ,PGUP,PGDN, , , , - //|----+----+----+----+----+----| |----+----+----+----+----+----| - , , , , ,DEL , , , , , , - //`----+----+----+----+----+----' `----+----+----+----+----+----' + [_NAV] = LAYOUT_ortho_4x12( + //,--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------. + _______, _______, _______, _______, KC_DEL, KC_BSPC, _______, KC_HOME, KC_UP, KC_END, KC_INS, KC_PSCR, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, _______, _______, KC_LSFT, KC_LCTL, KC_ENT, _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_DEL, _______, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, _______, _______, _______, _______, _______, _______, KC_PGUP, KC_PGDN, _______, _______, _______, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, _______, _______, _______, _______, KC_DEL, _______, _______, _______, _______, _______, _______ + //`--------+--------+--------+--------+--------+--------' `--------+--------+--------+--------+--------+--------' ), - [_MACROS] = KC_KEYMAP( - //,----+----+----+----+----+----. ,----+----+----+----+----+----. - , , , , , , , ,INCL, , , , - //|----+----+----+----+----+----| |----+----+----+----+----+----| - , , ,CAD , , , , , , , , , - //|----+----+----+----+----+----| |----+----+----+----+----+----| - SCAP, , , , , , , ,PULL,PUSH, ,SCAP, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - , , , , , , , , , , , - //`----+----+----+----+----+----' `----+----+----+----+----+----' + [_MACROS] = LAYOUT_ortho_4x12( + //,--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------. + _______, _______, _______, _______, _______, _______, _______, _______, KC_INCL, _______, _______, _______, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, _______, _______, KC_CAD, _______, _______, _______, _______, _______, _______, _______, _______, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + KC_SCAP, _______, _______, _______, _______, _______, _______, _______, KC_PULL, KC_PUSH, _______, KC_SCAP, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + //`--------+--------+--------+--------+--------+--------' `--------+--------+--------+--------+--------+--------' ), }; -const uint16_t PROGMEM fn_actions[] = { - -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - switch(id) { +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch(keycode) { /* include some kind of library or header */ - case 0: + case KC_INCL: if (record->event.pressed) { - SEND_STRING("#include <>"); - return MACRO( T(LEFT), END); + SEND_STRING("#include <>" SS_TAP(X_LEFT) ); + return false; } break; - case 1: + case KC_PULL: if (record->event.pressed) { - SEND_STRING("git pull"); - return MACRO( T(ENT), END ); + SEND_STRING("git pull" SS_TAP(X_ENTER) ); + return false; } break; - case 2: + case KC_PUSH: if (record->event.pressed){ - SEND_STRING("git push"); - return MACRO( T(ENT), END ); + SEND_STRING("git push" SS_TAP(X_ENTER) ); + return false; } break; - case 3: + case KC_SCAP: if (record->event.pressed){ layer_on(_CAPS); register_code(KC_CAPSLOCK); unregister_code(KC_CAPSLOCK); + return false; } break; - case 4: + case KC_SCOF: if (record->event.pressed){ layer_off(_CAPS); register_code(KC_CAPSLOCK); unregister_code(KC_CAPSLOCK); + return false; } break; } - return MACRO_NONE; + return true; }; - + void matrix_scan_user(void) { - uint8_t layer = biton32(layer_state); - - switch (layer) { - case _QWERTY: - set_led_green; - break; - case _CAPS: - set_led_white; - break; - case _NUMPAD: - set_led_blue; - break; - case _SYMBOLS: - set_led_red; - break; - case _NAV: - set_led_magenta; - break; - case _MACROS: - set_led_cyan; - break; - default: - set_led_green; - break; - } + uint8_t layer = biton32(layer_state); + + switch (layer) { + case _QWERTY: + set_led_green; + break; + case _CAPS: + set_led_white; + break; + case _NUMPAD: + set_led_blue; + break; + case _SYMBOLS: + set_led_red; + break; + case _NAV: + set_led_magenta; + break; + case _MACROS: + set_led_cyan; + break; + default: + set_led_green; + break; + } }; diff --git a/keyboards/chimera_ls/readme.md b/keyboards/chimera_ls/readme.md index 689d9ee61..0170dd8a8 100644 --- a/keyboards/chimera_ls/readme.md +++ b/keyboards/chimera_ls/readme.md @@ -2,18 +2,14 @@ ![Chimera LS](https://imgur.com/FOGlO4M.jpg) -A wireless version of the let's split: a split 40% ortholinear keyboard +A wireless version of the Let's Split: a split 40% ortholinear keyboard. Keyboard Maintainer: [William Wilson](https://github.com/GlenPickle) - - -Hardware Supported: Chimera LS PCB, WaveShare core nRF51822 - +Hardware Supported: Chimera LS PCB, WaveShare core nRF51822 Hardware Availability: [Gerbers](https://github.com/GlenPickle/Chimera/tree/master/ls/gerbers) Make example for this keyboard (after setting up your build environment): make chimera_ls:default -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. - +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). diff --git a/keyboards/chimera_ls/rules.mk b/keyboards/chimera_ls/rules.mk index af08f7a87..497e58677 100644 --- a/keyboards/chimera_ls/rules.mk +++ b/keyboards/chimera_ls/rules.mk @@ -46,7 +46,7 @@ F_USB = $(F_CPU) # Bootloader # This definition is optional, and if your keyboard supports multiple bootloaders of -# different sizes, comment this out, and the correct address will be loaded +# different sizes, comment this out, and the correct address will be loaded # automatically (+60). See bootloader.mk for all options. BOOTLOADER = caterina @@ -80,3 +80,5 @@ UNICODE_ENABLE = YES # Unicode # BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID USB = /dev/ttyACM0 + +LAYOUTS = ortho_4x12 From 8421a898209da6bbebddfbc93e4c10af878130a9 Mon Sep 17 00:00:00 2001 From: SpacebarRacecar <42380065+SpacebarRacecar@users.noreply.github.com> Date: Mon, 22 Oct 2018 23:20:31 +0200 Subject: [PATCH 352/788] added ASCII representation to dz60 iso-split layout and adjusted it so that it's consistent with the other layouts. (#4207) --- keyboards/dz60/dz60.h | 42 ++++++++++++++++++++++++++-------------- keyboards/dz60/info.json | 8 ++++---- 2 files changed, 32 insertions(+), 18 deletions(-) diff --git a/keyboards/dz60/dz60.h b/keyboards/dz60/dz60.h index 36ddb7ade..2cf2eec7a 100644 --- a/keyboards/dz60/dz60.h +++ b/keyboards/dz60/dz60.h @@ -196,20 +196,6 @@ { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, KC_NO, k3d, KC_NO }, \ { k40, k41, KC_NO, k43, KC_NO, KC_NO, k46, KC_NO, KC_NO, KC_NO, k4a, k4b, KC_NO, k4d, k4e } \ } -// iso split -#define LAYOUT_60_iso_split( \ - K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, \ - K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, \ - K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K114, K213, \ - K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, \ - K400, K401, K403, K404, K406, K408, K410, K411, K413, K414 \ -) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, KC_NO, K014 }, \ - { K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \ - { K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO }, \ - { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO, K313, KC_NO }, \ - { K400, K401, KC_NO, K403, K404, KC_NO, K406, KC_NO, K408, KC_NO, K410, K411, KC_NO, K413, K414 } \ -} /* LAYOUT_60_iso_5x1u * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ @@ -238,6 +224,33 @@ { k40, k41, KC_NO, k43, KC_NO, KC_NO, k46, KC_NO, KC_NO, KC_NO, k4a, k4b, k4c, k4d, k4e } \ } +/* LAYOUT_60_iso_split + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ + * │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0a │0b │0c │0e │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ + * │10 │12 │13 │14 │15 │16 │17 │18 │19 │1a │1b │1c │1d │ │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐2d │ + * │20 │22 │23 │24 │25 │26 │27 │28 │29 │2a │2b │2c │1e │ │ + * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤ + * │30 │31 │32 │33 │34 │35 │36 │37 │38 │39 │3a │3b │3d │ + * ├────┼───┴┬──┴─┬─┴───┴──┬┴───┼───┴───┴──┬┴───┼───┴┬────┬────┤ + * │40 │41 │43 │44 │46 │48 │4a │4b │4d │4e │ + * └────┴────┴────┴────────┴────┴──────────┴────┴────┴────┴────┘ +*/ +#define LAYOUT_60_iso_split( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0e, \ + k10, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, \ + k20, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k1e, k2d, \ + k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3d, \ + k40, k41, k43, k44, k46, k48, k4a, k4b, k4d, k4e \ +) { \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, KC_NO, k0e }, \ + { k10, KC_NO, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e }, \ + { k20, KC_NO, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, KC_NO }, \ + { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, KC_NO, k3d, KC_NO }, \ + { k40, k41, KC_NO, k43, k44, KC_NO, k46, KC_NO, k48, KC_NO, k4a, k4b, KC_NO, k4d, k4e } \ +} + /* LAYOUT_60_b_ansi (maximized DZ60 Plate B layout for ANSI) * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ * │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0a │0b │0c │0d │0e │ @@ -292,4 +305,5 @@ { k40, k41, KC_NO, k43, k44, KC_NO, k46, KC_NO, k48, KC_NO, k4a, k4b, k4c, k4d, k4e } \ } + #endif diff --git a/keyboards/dz60/info.json b/keyboards/dz60/info.json index 1f621360b..a163cc6a4 100644 --- a/keyboards/dz60/info.json +++ b/keyboards/dz60/info.json @@ -28,10 +28,6 @@ "LAYOUT_60_iso": { "key_count": 62, "layout": [{"label":"¬", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"\"", "x":2, "y":0}, {"label":"£", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"@", "x":11.75, "y":2}, {"label":"~", "x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"label":"|", "x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"AltGr", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}] - }, - "LAYOUT_60_iso_split": { - "key_count": 64, - "layout": [{"label":"¬", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"\"", "x":2, "y":0}, {"label":"£", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"@", "x":11.75, "y":2}, {"label":"~", "x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"label":"|", "x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":2.25}, {"label":"FN", "x":6.00, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"label":"AltGr", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}] }, "LAYOUT_60_hhkb": { "key_count": 60, @@ -41,6 +37,10 @@ "key_count": 63, "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"|", "x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"label":"~", "x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"/", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Fn", "x":10, "y":4}, {"label":"←", "x":11, "y":4}, {"label":"↓", "x":12, "y":4}, {"label":"↑", "x":13, "y":4}, {"label":"→", "x":14, "y":4}] }, + "LAYOUT_60_iso_split": { + "key_count": 64, + "layout": [{"label":"¬", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"\"", "x":2, "y":0}, {"label":"£", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"@", "x":11.75, "y":2}, {"label":"~", "x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"label":"|", "x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":2.25}, {"label":"FN", "x":6.00, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"label":"AltGr", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}] + }, "LAYOUT_60_b_ansi": { "key_count": 66, "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"1", "x":1, "y":0}, {"label":"2", "x":2, "y":0}, {"label":"3", "x":3, "y":0}, {"label":"4", "x":4, "y":0}, {"label":"5", "x":5, "y":0}, {"label":"6", "x":6, "y":0}, {"label":"7", "x":7, "y":0}, {"label":"8", "x":8, "y":0}, {"label":"9", "x":9, "y":0}, {"label":"0", "x":10, "y":0}, {"label":"-", "x":11, "y":0}, {"label":"=", "x":12, "y":0}, {"x":13, "y":0}, {"label":"Back Space", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"[", "x":11.5, "y":1}, {"label":"]", "x":12.5, "y":1}, {"label":"\\", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":";", "x":10.75, "y":2}, {"label":"'", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":",", "x":9.25, "y":3}, {"label":".", "x":10.25, "y":3}, {"label":"Shift", "x":11.25, "y":3, "w":1.75}, {"label":"Up", "x":13, "y":3}, {"label":"Del", "x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"GUI", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"label":"Space", "x":3.75, "y":4, "w":2.25}, {"label":"Space", "x":6, "y":4, "w":1.25}, {"label":"Space", "x":7.25, "y":4, "w":2.75}, {"label":"Alt", "x":10, "y":4}, {"label":"Fn", "x":11, "y":4}, {"label":"Left", "x":12, "y":4}, {"label":"Down", "x":13, "y":4}, {"label":"Right", "x":14, "y":4}] From 95619bdaca2c48156b4749270199d4a50437f44e Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 22 Oct 2018 14:39:11 -0700 Subject: [PATCH 353/788] Fix file location for mmacdougal's keymap --- keyboards/levinson/keymaps/mmacdougall/{keymap => }/config.h | 0 keyboards/levinson/keymaps/mmacdougall/{keymap => }/keymap.c | 0 keyboards/levinson/keymaps/mmacdougall/{keymap => }/rules.mk | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename keyboards/levinson/keymaps/mmacdougall/{keymap => }/config.h (100%) rename keyboards/levinson/keymaps/mmacdougall/{keymap => }/keymap.c (100%) rename keyboards/levinson/keymaps/mmacdougall/{keymap => }/rules.mk (100%) diff --git a/keyboards/levinson/keymaps/mmacdougall/keymap/config.h b/keyboards/levinson/keymaps/mmacdougall/config.h similarity index 100% rename from keyboards/levinson/keymaps/mmacdougall/keymap/config.h rename to keyboards/levinson/keymaps/mmacdougall/config.h diff --git a/keyboards/levinson/keymaps/mmacdougall/keymap/keymap.c b/keyboards/levinson/keymaps/mmacdougall/keymap.c similarity index 100% rename from keyboards/levinson/keymaps/mmacdougall/keymap/keymap.c rename to keyboards/levinson/keymaps/mmacdougall/keymap.c diff --git a/keyboards/levinson/keymaps/mmacdougall/keymap/rules.mk b/keyboards/levinson/keymaps/mmacdougall/rules.mk similarity index 100% rename from keyboards/levinson/keymaps/mmacdougall/keymap/rules.mk rename to keyboards/levinson/keymaps/mmacdougall/rules.mk From cb1e45b4efdc685134c0dbc35100e2fb99c5b006 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 22 Oct 2018 14:07:18 -0700 Subject: [PATCH 354/788] Include quantum.h to fix travis CI errors --- keyboards/dz60/keymaps/marianas/keymap.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/keyboards/dz60/keymaps/marianas/keymap.h b/keyboards/dz60/keymaps/marianas/keymap.h index 01de5c6e2..00e51cea2 100644 --- a/keyboards/dz60/keymaps/marianas/keymap.h +++ b/keyboards/dz60/keymaps/marianas/keymap.h @@ -1,3 +1,5 @@ +#include "quantum.h" + //Control #define MO_FNLR MO(FN_LAYER) #define BACKSPC KC_BSPC From 572c316e7dfb0bcd495ce09e068078593fd4ec82 Mon Sep 17 00:00:00 2001 From: Scott Gorsuch Date: Tue, 23 Oct 2018 12:29:35 -0400 Subject: [PATCH 355/788] Keymap: Fix missing 4 key (#4219) --- keyboards/iris/keymaps/dbroqua/keymap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/iris/keymaps/dbroqua/keymap.c b/keyboards/iris/keymaps/dbroqua/keymap.c index eed288c50..4cbb8af54 100644 --- a/keyboards/iris/keymaps/dbroqua/keymap.c +++ b/keyboards/iris/keymaps/dbroqua/keymap.c @@ -49,7 +49,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * ,-----+-----+-----+-----+-----+-----+ ,-----+-----+-----+-----+-----+-----+ * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | BSPC| * |-----+-----+-----+-----+-----+-----+ +-----+-----+-----+-----+-----+-----+ - * | RST | 1 | 2 | 3 | 5 | 5 | | 6 | 7 | 8 | 9 | 0 | | + * | RST | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | * +-----+-----+-----+-----+-----+-----+ +-----+-----+-----+-----+-----+-----+ * | DEL | | LEFT| RGHT| UP | [ | | ] | 4 | 5 | 6 | + | | | * +-----+-----+-----+-----+-----+-----+-----. ,-----+-----+-----+-----+-----+-----+-----+ From 03d16db942fe0352cc3b3522a1c778b7e60a4b3a Mon Sep 17 00:00:00 2001 From: Peter Roe Date: Tue, 23 Oct 2018 13:52:57 -0500 Subject: [PATCH 356/788] Keyboard: Ported ADB-to-USB converter from TMK to QMK (#3931) * Ported ADB-to-USB converter from TMK to QMK * Updated pull request with reviewer suggestions. * Removed precompiled header file type (gch) from gitignore per reviewer request * Update keyboards/converter/adb_usb/matrix.c Changed instances of matrix_init_quantum to matrix_scan_quantum. * Update keyboards/converter/adb_usb/matrix.c Co-Authored-By: 13-bit --- keyboards/converter/adb_usb/README.md | 83 ++++++ keyboards/converter/adb_usb/adb_usb.c | 3 + keyboards/converter/adb_usb/adb_usb.h | 109 +++++++ keyboards/converter/adb_usb/config.h | 43 +++ .../converter/adb_usb/keymaps/13bit/keymap.c | 26 ++ .../adb_usb/keymaps/default/keymap.c | 13 + keyboards/converter/adb_usb/led.c | 27 ++ keyboards/converter/adb_usb/led.h | 43 +++ keyboards/converter/adb_usb/matrix.c | 267 ++++++++++++++++++ keyboards/converter/adb_usb/rules.mk | 73 +++++ 10 files changed, 687 insertions(+) create mode 100644 keyboards/converter/adb_usb/README.md create mode 100644 keyboards/converter/adb_usb/adb_usb.c create mode 100644 keyboards/converter/adb_usb/adb_usb.h create mode 100644 keyboards/converter/adb_usb/config.h create mode 100644 keyboards/converter/adb_usb/keymaps/13bit/keymap.c create mode 100644 keyboards/converter/adb_usb/keymaps/default/keymap.c create mode 100644 keyboards/converter/adb_usb/led.c create mode 100644 keyboards/converter/adb_usb/led.h create mode 100644 keyboards/converter/adb_usb/matrix.c create mode 100644 keyboards/converter/adb_usb/rules.mk diff --git a/keyboards/converter/adb_usb/README.md b/keyboards/converter/adb_usb/README.md new file mode 100644 index 000000000..ed7175008 --- /dev/null +++ b/keyboards/converter/adb_usb/README.md @@ -0,0 +1,83 @@ +ADB-to USB Keyboard Converter +============================= +This firmware converts Apple Desktop Bus (ADB) keyboard protocol to USB so that you can use an ADB keyboard on a modern computer. It works on the PJRC Teensy 2.0 and other USB AVR MCUs (ATMega32U4, AT90USB64/128, etc) and needs at least 10KB of flash memory. + + +This is a port of the TMK ADB-to-USB converter to QMK. For information on QMK, please consult the following: +https://github.com/qmk/qmk_firmware +https://docs.qmk.fm + + +Wiring +------ +Connect the VCC, GND, and DATA lines of the ADB keyboard to the controller (Teensy 2.0 or similar). By default the DATA line uses port PD0. The Power SW line is unused by the converter. + +ADB female socket from the front: + + ,--_--. + / o4 3o \ 1: DATA + | o2 1o | 2: Power SW + - === - 3: VCC + `-___-' 4: GND + +This converter uses AVR's internal pull-up, but it seems to be too weak, in particular when you want to use a long or coiled cable. Using an external pull-up resistor (1K-10K Ohm) between the DATA and VCC lines is strongly recommended. + +Pull-up resistor: + + Keyboard Converter + ,------. + 5V------+------|VCC | + | | | + [R] | | + | | | + Signal--+------|PD0 | + | | + GND------------|GND | + `------' + R: 1K Ohm resistor + + +Define following macros for ADB connection in config.h if you use other than port PD0. + + ADB_PORT, ADB_PIN, ADB_DDR, ADB_DATA_BIT + + +Building the Firmware +------------------------------------------ +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). + + +Keymap +------ +To build the default keymap run this command: + + $ make converter/adb_usb:default + +You may add your own keymap to the converter/adb_usb/keymaps directory, as you would with any other QMK-powered keyboard. + +To build your custom keymap, change the build command to: + + $ make converter/adb_usb:my_keymap + +Where 'my_keymap' is the name of your custom keymap directory. + + +Locking Caps Lock +---------------- +Many old ADB keyboards use a locking switch for the caps lock key. This converter supports the locking caps lock key by default. + + +Notes +----- +Non-extended ADB keyboards make no distinction between the left and right modifiers, +i.e. the keycode for the left modifier will be sent even if the right modifier + +The Apple Extended Keyboard and Apple Extended Keyboard II can differentiate between the left and right modifiers except for the GUI key (Windows/Command). + +Most ADB keyboards have no diodes in its matrix so they are not NKRO, +though the ADB protocol itself supports it. See protocol/adb.c for more info. + + +QMK Port Changelog +--------- +- 2018/09/16 - Initial release. diff --git a/keyboards/converter/adb_usb/adb_usb.c b/keyboards/converter/adb_usb/adb_usb.c new file mode 100644 index 000000000..7026d6275 --- /dev/null +++ b/keyboards/converter/adb_usb/adb_usb.c @@ -0,0 +1,3 @@ +#include "adb_usb.h" +#include +#include "quantum.h" diff --git a/keyboards/converter/adb_usb/adb_usb.h b/keyboards/converter/adb_usb/adb_usb.h new file mode 100644 index 000000000..491db95f1 --- /dev/null +++ b/keyboards/converter/adb_usb/adb_usb.h @@ -0,0 +1,109 @@ +/* +Copyright 2011,2012,2013 Jun Wako + +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 . + +Ported to QMK by Peter Roe +*/ + +#ifndef KEYMAP_COMMON_H +#define KEYMAP_COMMON_H + +#include "quantum.h" + +/* M0115/M3501 Apple Extended Keyboard ANSI + * ,---. ,---------------. ,---------------. ,---------------. ,-----------. ,---. + * |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| |Pwr| + * `---' `---------------' `---------------' `---------------' `-----------' `---' + * ,-----------------------------------------------------------. ,-----------. ,---------------. + * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backspa| |Ins|Hom|PgU| |NmL| =| /| *| + * |-----------------------------------------------------------| |-----------| |---------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |Del|End|PgD| | 7| 8| 9| -| + * |-----------------------------------------------------------| `-----------' |---------------| + * |CapsLo| A| S| D| F| G| H| J| K| L| ;| '|Return | | 4| 5| 6| +| + * |-----------------------------------------------------------| ,---. |---------------| + * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shift | |Up | | 1| 2| 3| | + * |-----------------------------------------------------------| ,-----------. |-----------|Ent| + * |Ctrl |Opt |Cmd | Space | |Opt |Ctrl | |Lef|Dow|Rig| | 0| .| | + * `-----------------------------------------------------------' `-----------' `---------------' + */ +#define LAYOUT_ext_ansi( \ + K35, K7A,K78,K63,K76,K60,K61,K62,K64,K65,K6D,K67,K6F, K69,K6B,K71, K7F, \ + K32,K12,K13,K14,K15,K17,K16,K1A,K1C,K19,K1D,K1B,K18,K33, K72,K73,K74, K47,K51,K4B,K43, \ + K30,K0C,K0D,K0E,K0F,K11,K10,K20,K22,K1F,K23,K21,K1E,K2A, K75,K77,K79, K59,K5B,K5C,K4E, \ + K39,K00,K01,K02,K03,K05,K04,K26,K28,K25,K29,K27, K24, K56,K57,K58,K45, \ + K38,K06,K07,K08,K09,K0B,K2D,K2E,K2B,K2F,K2C, K7B, K3E, K53,K54,K55, \ + K36,K3A,K37, K31, K7C,K7D, K3B,K3D,K3C, K52, K41,K4C \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07 }, \ + { K08, K09, KC_NO, K0B, K0C, K0D, K0E, K0F }, \ + { K10, K11, K12, K13, K14, K15, K16, K17 }, \ + { K18, K19, K1A, K1B, K1C, K1D, K1E, K1F }, \ + { K20, K21, K22, K23, K24, K25, K26, K27 }, \ + { K28, K29, K2A, K2B, K2C, K2D, K2E, K2F }, \ + { K30, K31, K32, K33, KC_NO, K35, K36, K37 }, \ + { K38, K39, K3A, K3B, K3C, K3D, K3E, KC_NO, }, \ + { KC_NO, K41, KC_NO, K43, KC_NO, K45, KC_NO, K47 }, \ + { KC_NO, KC_NO, KC_NO, K4B, K4C, KC_NO, K4E, KC_NO, }, \ + { KC_NO, KC_NO, K52, K53, K54, K55, K56, K57 }, \ + { K58, K59, KC_NO, K5B, K5C, KC_NO, KC_NO, KC_NO, }, \ + { K60, K61, K62, K63, K64, K65, KC_NO, K67 }, \ + { KC_NO, K69, KC_NO, K6B, KC_NO, K6D, KC_NO, K6F }, \ + { KC_NO, K71, K72, K73, K74, K75, K76, K77 }, \ + { K78, K79, K7A, K7B, K7C, K7D, KC_NO, K7F } \ +} + +/* M0116 Apple Standard Keyboard ANSI + * +-------+ + * | power | + * +-------+ + * +---+---+---+---+---+---+---+---+---+---+---+---+---+-----+ +---+---+---+---+ + * |esc| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | bks | |clr| = | / | * | + * +---------------------------------------------------------+ +---+---+---+---+ + * | tab | q | w | e | r | t | y | u | i | o | p | [ | ] | | | 7 | 8 | 9 | + | + * +-----------------------------------------------------+ | +---+---+---+---+ + * | ctrl | a | s | d | f | g | h | j | k | l | ; | ' |return| | 4 | 5 | 6 | - | + * +---------------------------------------------------------+ +---+---+---+---+ + * | shift | z | x | c | v | b | n | m | , | . | / | shift | | 1 | 2 | 3 | | + * +---------------------------------------------------------+ +-------+---|ent| + * |cap|opt|comnd| ` | | \ |lef|rig|dwn|up | | 0 | . | | + * +---------------------------------------------------------+ +-------+---+---+ + */ +#define LAYOUT_m0116_ansi( \ + K7F, \ + K35,K12,K13,K14,K15,K17,K16,K1A,K1C,K19,K1D,K1B,K18,K33, K47,K51,K4B,K43, \ + K30,K0C,K0D,K0E,K0F,K11,K10,K20,K22,K1F,K23,K21,K1E, K59,K5B,K5C,K45, \ + K36,K00,K01,K02,K03,K05,K04,K26,K28,K25,K29,K27, K24, K56,K57,K58,K4E, \ + K38,K06,K07,K08,K09,K0B,K2D,K2E,K2B,K2F,K2C, K7B, K53,K54,K55, \ + K39,K3A,K37,K32, K31, K2A,K3B,K3C,K3D,K3E, K52, K41,K4C \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07 }, \ + { K08, K09, KC_NO, K0B, K0C, K0D, K0E, K0F }, \ + { K10, K11, K12, K13, K14, K15, K16, K17 }, \ + { K18, K19, K1A, K1B, K1C, K1D, K1E, K1F }, \ + { K20, K21, K22, K23, K24, K25, K26, K27 }, \ + { K28, K29, K2A, K2B, K2C, K2D, K2E, K2F }, \ + { K30, K31, K32, K33, KC_NO, K35, K36, K37 }, \ + { K38, K39, K3A, K3B, K3C, K3D, K3E, KC_NO }, \ + { KC_NO, K41, KC_NO, K43, KC_NO, K45, KC_NO, K47 }, \ + { KC_NO, KC_NO, KC_NO, K4B, K4C, KC_NO, K4E, KC_NO }, \ + { KC_NO, K51, K52, K53, K54, K55, K56, K57 }, \ + { K58, K59, KC_NO, K5B, K5C, KC_NO, KC_NO, KC_NO }, \ + { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ + { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ + { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ + { KC_NO, KC_NO, KC_NO, K7B, KC_NO, KC_NO, KC_NO, K7F } \ +} + +#endif diff --git a/keyboards/converter/adb_usb/config.h b/keyboards/converter/adb_usb/config.h new file mode 100644 index 000000000..a5845a029 --- /dev/null +++ b/keyboards/converter/adb_usb/config.h @@ -0,0 +1,43 @@ +/* +Copyright 2011 Jun Wako + +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 . + +Ported to QMK by Peter Roe +*/ + +#pragma once + +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0ADB +#define DEVICE_VER 0x0101 +#define MANUFACTURER QMK +#define PRODUCT ADB keyboard converter +#define DESCRIPTION Convert ADB keyboard to USB + +/* matrix size */ +#define MATRIX_ROWS 16 // keycode bit: 3-0 +#define MATRIX_COLS 8 // keycode bit: 6-4 + +/* 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 + +/* ADB port setting */ +#define ADB_PORT PORTD +#define ADB_PIN PIND +#define ADB_DDR DDRD +#define ADB_DATA_BIT 0 +//#define ADB_PSW_BIT 1 // optional diff --git a/keyboards/converter/adb_usb/keymaps/13bit/keymap.c b/keyboards/converter/adb_usb/keymaps/13bit/keymap.c new file mode 100644 index 000000000..3b36a20c2 --- /dev/null +++ b/keyboards/converter/adb_usb/keymaps/13bit/keymap.c @@ -0,0 +1,26 @@ +#include QMK_KEYBOARD_H + +#define MCTL LCTL(KC_UP) +#define SCST LSFT(LGUI(KC_4)) +#define SLP LALT(LGUI(KC_EJCT)) + +#define APP1 LSFT(LALT(LCTL(LGUI(KC_1)))) +#define APP2 LSFT(LALT(LCTL(LGUI(KC_2)))) +#define APP3 LSFT(LALT(LCTL(LGUI(KC_3)))) +#define APP4 LSFT(LALT(LCTL(LGUI(KC_4)))) +#define APP5 LSFT(LALT(LCTL(LGUI(KC_5)))) +#define APP6 LSFT(LALT(LCTL(LGUI(KC_6)))) +#define APP7 LSFT(LALT(LCTL(LGUI(KC_7)))) +#define APP8 LSFT(LALT(LCTL(LGUI(KC_8)))) + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + LAYOUT_ext_ansi( + KC_ESC, APP1, APP2, APP3, APP4, APP5, APP6, APP7, APP8, MCTL, KC_MUTE, KC_VOLD, KC_VOLU, SCST, KC_SLCK, KC_PAUS, SLP, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_EQL, KC_PSLS, KC_PAST, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, KC_PMNS, + KC_LCAP, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT + ), +}; diff --git a/keyboards/converter/adb_usb/keymaps/default/keymap.c b/keyboards/converter/adb_usb/keymaps/default/keymap.c new file mode 100644 index 000000000..6b63c1a3c --- /dev/null +++ b/keyboards/converter/adb_usb/keymaps/default/keymap.c @@ -0,0 +1,13 @@ +#include QMK_KEYBOARD_H + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + LAYOUT_ext_ansi( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR,KC_SLCK,KC_PAUS, KC_EJCT, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_EQL, KC_PSLS, KC_PAST, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, KC_PMNS, + KC_LCAP, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT + ), +}; diff --git a/keyboards/converter/adb_usb/led.c b/keyboards/converter/adb_usb/led.c new file mode 100644 index 000000000..ea9bf77b5 --- /dev/null +++ b/keyboards/converter/adb_usb/led.c @@ -0,0 +1,27 @@ +/* +Copyright 2011 Jun Wako + +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 . +*/ + +#include +#include +#include "adb.h" +#include "led.h" + + +void led_set(uint8_t usb_led) +{ + adb_host_kbd_led(ADB_ADDR_KEYBOARD, ~usb_led); +} diff --git a/keyboards/converter/adb_usb/led.h b/keyboards/converter/adb_usb/led.h new file mode 100644 index 000000000..19952fae2 --- /dev/null +++ b/keyboards/converter/adb_usb/led.h @@ -0,0 +1,43 @@ +/* +Copyright 2011 Jun Wako + +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 . + +Ported to QMK by Peter Roe +*/ + +#ifndef LED_H +#define LED_H +#include "stdint.h" + + +/* keyboard LEDs */ +#define USB_LED_NUM_LOCK 0 +#define USB_LED_CAPS_LOCK 1 +#define USB_LED_SCROLL_LOCK 2 +#define USB_LED_COMPOSE 3 +#define USB_LED_KANA 4 + + +#ifdef __cplusplus +extern "C" { +#endif + +void led_set(uint8_t usb_led); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/keyboards/converter/adb_usb/matrix.c b/keyboards/converter/adb_usb/matrix.c new file mode 100644 index 000000000..8ee48bf23 --- /dev/null +++ b/keyboards/converter/adb_usb/matrix.c @@ -0,0 +1,267 @@ +/* +Copyright 2011 Jun Wako + +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 . + +Ported to QMK by Peter Roe +*/ + +#include +#include +#include +#include +#include "print.h" +#include "util.h" +#include "debug.h" +#include "adb.h" +#include "matrix.h" +#include "report.h" +#include "host.h" +#include "led.h" +#include "timer.h" + +static bool is_iso_layout = false; + +// matrix state buffer(1:on, 0:off) +static matrix_row_t matrix[MATRIX_ROWS]; + +static void register_key(uint8_t key); + +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + +void matrix_init(void) +{ + // LED on + DDRD |= (1<<6); PORTD |= (1<<6); + + adb_host_init(); + // wait for keyboard to boot up and receive command + _delay_ms(2000); + + // initialize matrix state: all keys off + for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00; + + led_set(host_keyboard_leds()); + + // debug_enable = false; + // debug_matrix = true; + // debug_keyboard = true; + // debug_mouse = true; + // print("debug enabled.\n"); + + // LED off + DDRD |= (1<<6); PORTD &= ~(1<<6); + matrix_init_quantum(); +} + +#ifdef ADB_MOUSE_ENABLE + +#ifdef MAX +#undef MAX +#endif +#define MAX(X, Y) ((X) > (Y) ? (X) : (Y)) + +static report_mouse_t mouse_report = {}; + +void adb_mouse_task(void) +{ + uint16_t codes; + int16_t x, y; + static int8_t mouseacc; + + /* tick of last polling */ + static uint16_t tick_ms; + + // polling with 12ms interval + if (timer_elapsed(tick_ms) < 12) return; + tick_ms = timer_read(); + + codes = adb_host_mouse_recv(); + // If nothing received reset mouse acceleration, and quit. + if (!codes) { + mouseacc = 1; + return; + }; + // Bit sixteen is button. + if (~codes & (1 << 15)) + mouse_report.buttons |= MOUSE_BTN1; + if (codes & (1 << 15)) + mouse_report.buttons &= ~MOUSE_BTN1; + // lower seven bits are movement, as signed int_7. + // low byte is X-axis, high byte is Y. + y = (codes>>8 & 0x3F); + x = (codes>>0 & 0x3F); + // bit seven and fifteen is negative + // usb does not use int_8, but int_7 (measuring distance) with sign-bit. + if (codes & (1 << 6)) + x = (x-0x40); + if (codes & (1 << 14)) + y = (y-0x40); + // Accelerate mouse. (They weren't meant to be used on screens larger than 320x200). + x *= mouseacc; + y *= mouseacc; + // Cap our two bytes per axis to one byte. + // Easier with a MIN-function, but since -MAX(-a,-b) = MIN(a,b)... + // I.E. MIN(MAX(x,-127),127) = -MAX(-MAX(x, -127), -127) = MIN(-MIN(-x,127),127) + mouse_report.x = -MAX(-MAX(x, -127), -127); + mouse_report.y = -MAX(-MAX(y, -127), -127); + if (debug_mouse) { + print("adb_host_mouse_recv: "); print_bin16(codes); print("\n"); + print("adb_mouse raw: ["); + phex(mouseacc); print(" "); + phex(mouse_report.buttons); print("|"); + print_decs(mouse_report.x); print(" "); + print_decs(mouse_report.y); print("]\n"); + } + // Send result by usb. + host_mouse_send(&mouse_report); + // increase acceleration of mouse + mouseacc += ( mouseacc < ADB_MOUSE_MAXACC ? 1 : 0 ); + return; +} +#endif + +uint8_t matrix_scan(void) +{ + /* extra_key is volatile and more convoluted than necessary because gcc refused + to generate valid code otherwise. Making extra_key uint8_t and constructing codes + here via codes = extra_key<<8 | 0xFF; would consistently fail to even LOAD + extra_key from memory, and leave garbage in the high byte of codes. I tried + dozens of code variations and it kept generating broken assembly output. So + beware if attempting to make extra_key code more logical and efficient. */ + static volatile uint16_t extra_key = 0xFFFF; + uint16_t codes; + uint8_t key0, key1; + + /* tick of last polling */ + static uint16_t tick_ms; + + codes = extra_key; + extra_key = 0xFFFF; + + if ( codes == 0xFFFF ) + { + // polling with 12ms interval + if (timer_elapsed(tick_ms) < 12) return 0; + tick_ms = timer_read(); + + codes = adb_host_kbd_recv(); + } + + key0 = codes>>8; + key1 = codes&0xFF; + + if (debug_matrix && codes) { + print("adb_host_kbd_recv: "); phex16(codes); print("\n"); + } + + if (codes == 0) { // no keys + return 0; + } else if (codes == 0x7F7F) { // power key press + register_key(0x7F); + } else if (codes == 0xFFFF) { // power key release + register_key(0xFF); + } else if (key0 == 0xFF) { // error + xprintf("adb_host_kbd_recv: ERROR(%d)\n", codes); + // something wrong or plug-in + matrix_init(); + return key1; + } else { + /* Swap codes for ISO keyboard + * https://github.com/tmk/tmk_keyboard/issues/35 + * + * ANSI + * ,----------- ----------. + * | *a| 1| 2 =|Backspa| + * |----------- ----------| + * |Tab | Q| | ]| *c| + * |----------- ----------| + * |CapsLo| A| '|Return | + * |----------- ----------| + * |Shift | Shift | + * `----------- ----------' + * + * ISO + * ,----------- ----------. + * | *a| 1| 2 =|Backspa| + * |----------- ----------| + * |Tab | Q| | ]|Retur| + * |----------- -----` | + * |CapsLo| A| '| *c| | + * |----------- ----------| + * |Shif| *b| Shift | + * `----------- ----------' + * + * ADB scan code USB usage + * ------------- --------- + * Key ANSI ISO ANSI ISO + * --------------------------------------------- + * *a 0x32 0x0A 0x35 0x35 + * *b ---- 0x32 ---- 0x64 + * *c 0x2A 0x2A 0x31 0x31(or 0x32) + */ + if (is_iso_layout) { + if ((key0 & 0x7F) == 0x32) { + key0 = (key0 & 0x80) | 0x0A; + } else if ((key0 & 0x7F) == 0x0A) { + key0 = (key0 & 0x80) | 0x32; + } + } + register_key(key0); + if (key1 != 0xFF) // key1 is 0xFF when no second key. + extra_key = key1<<8 | 0xFF; // process in a separate call + } + + matrix_scan_quantum(); + return 1; +} + +void matrix_print(void){ + +} + +inline +matrix_row_t matrix_get_row(uint8_t row) +{ + return matrix[row]; +} + +inline +static void register_key(uint8_t key) +{ + uint8_t col, row; + col = key&0x07; + row = (key>>3)&0x0F; + if (key&0x80) { + matrix[row] &= ~(1< Date: Tue, 23 Oct 2018 14:00:54 -0500 Subject: [PATCH 357/788] keymap for 1upkeyboards/sweet16 multilayers rgb lighting and tapdance (#4208) * keymap for 1upkeyboards/sweet16 multilayers rgb lighting and tapdance * Update config.h typo * cleanup Co-Authored-By: ridingintraffic * layers are using layout macro replaced the include guard (the ifndef, define, and endif at the end) with just #pragma once changed undergrow to use layer-change-code emoji macros are using send_hex_code_string cleaned up the includes * tap() removed maxtrix_scan_user updated conf.h cleanup --- .../sweet16/keymaps/ridingintraffic/config.h | 15 ++ .../sweet16/keymaps/ridingintraffic/keymap.c | 215 ++++++++++++++++++ .../sweet16/keymaps/ridingintraffic/readme.md | 10 + .../sweet16/keymaps/ridingintraffic/rules.mk | 5 + 4 files changed, 245 insertions(+) create mode 100644 keyboards/1upkeyboards/sweet16/keymaps/ridingintraffic/config.h create mode 100644 keyboards/1upkeyboards/sweet16/keymaps/ridingintraffic/keymap.c create mode 100644 keyboards/1upkeyboards/sweet16/keymaps/ridingintraffic/readme.md create mode 100644 keyboards/1upkeyboards/sweet16/keymaps/ridingintraffic/rules.mk diff --git a/keyboards/1upkeyboards/sweet16/keymaps/ridingintraffic/config.h b/keyboards/1upkeyboards/sweet16/keymaps/ridingintraffic/config.h new file mode 100644 index 000000000..c83544007 --- /dev/null +++ b/keyboards/1upkeyboards/sweet16/keymaps/ridingintraffic/config.h @@ -0,0 +1,15 @@ +#pragma once + +/* tap dance stuff*/ +#undef TAPPING_TERM +#define TAPPING_TERM 500 + +#define TAPPING_TOGGLE 2 + +#define EXAMPLESTRING1 "tapdance_1" +#define EXAMPLESTRING2 "tapdance_2" +#define EXAMPLESTRING3 "tapdance_3" +#define EXAMPLESTRING4 "tapdance_4" + +#undef RGBLED_NUM +#define RGBLED_NUM 16 \ No newline at end of file diff --git a/keyboards/1upkeyboards/sweet16/keymaps/ridingintraffic/keymap.c b/keyboards/1upkeyboards/sweet16/keymaps/ridingintraffic/keymap.c new file mode 100644 index 000000000..ad9786ba7 --- /dev/null +++ b/keyboards/1upkeyboards/sweet16/keymaps/ridingintraffic/keymap.c @@ -0,0 +1,215 @@ +/* +tap danc eis turned on in the rules now... +*/ +#include QMK_KEYBOARD_H + +#define _EMOJI 0 +#define _TAPLAND 1 +#define _LEDCNTL 2 + +enum custom_keycodes { + SHRUG, + DISFACE, + FU, + TFLIP, + TFLIP2, + SAD_EYES, + TPUT, + HAPPYFACE, + HEARTFACE, + CLOUD, + CHANFACE, + CMDCLEAR +}; +//Tap Dance Declarations +enum { + TD_EXAMPLE1 = 0, + TD_EXAMPLE2, + TD_EXAMPLE3, + TD_EXAMPLE4 +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* EMOJI Pad + * ,-------------------------------. + * |TFLIP | TFlIP2|DISFACE| FU | + * |------+-------+-------+--------| + * | CLOUD| | | CLEAR | + * |------+-------+-------+--------| + * |SHRUG |DISFACE| HRTFAC| HAPPYF | + * |------+-------+-------+--------| + * | ENTER| |LEDCNTR| tapland| + * `-------------------------------' + */ + //purple + [_EMOJI] = LAYOUT_ortho_4x4( + TFLIP, TFLIP2, KC_NO, FU , + CLOUD, KC_NO, KC_NO, CMDCLEAR, + SHRUG, DISFACE, HEARTFACE, HAPPYFACE, + KC_ENT, RGB_TOG, MO(_LEDCNTL), MO(_TAPLAND) + ), + + /* TapLand // + * ,-------------------------------. + * | str1 | str2 | str3 | str4 | + * |------+-------+-------+--------| + * | | | | | + * |------+-------+-------+--------| + * | | | | | + * |------+-------+-------+--------| + * | | | | | + * `-------------------------------' + */ + //blue + [_TAPLAND] = LAYOUT_ortho_4x4( + TD(TD_EXAMPLE1), TD(TD_EXAMPLE2), TD(TD_EXAMPLE3), TD(TD_EXAMPLE4), + KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO + ), + /* LEDControl Pad + * ,-------------------------------. + * | snake|breathe|rainbow|gradient| + * |------+-------+-------+--------| + * | xmas | Val+ | Sat+ | HUE+ | + * |------+-------+-------+--------| + * |kngrdr| Val- | Sat- | HUE- | + * |------+-------+-------+--------| + * | swirl| PLAIN | | ON/OFF | + * `-------------------------------' + */ + //blue + [_LEDCNTL] = LAYOUT_ortho_4x4( + RGB_M_SN, RGB_M_B, RGB_M_R, RGB_M_G, + RGB_M_X, RGB_VAI, RGB_SAI, RGB_HUI, + RGB_M_K, RGB_VAD, RGB_SAD, RGB_HUD, + RGB_M_SW, RGB_M_P, KC_NO, RGB_TOG + ), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (record->event.pressed) { + switch(keycode) { + case CLOUD: // (っ◕‿◕)っ + if(record->event.pressed){ + send_unicode_hex_string("0028 3063 25D5 203F 25D5 0029 3063"); + } + return false; + break; + case FU: // t(-_-t) + if(record->event.pressed){ + SEND_STRING("t(-_-t)"); + } + return false; + break; + case HAPPYFACE: // ʘ‿ʘ + if(record->event.pressed){ + send_unicode_hex_string("0298 203F 0298"); + } + return false; + break; + case CMDCLEAR: + if (record->event.pressed) { + register_code(KC_LGUI); + tap_code(KC_A); + unregister_code(KC_LGUI); + tap_code(KC_DEL); + } + return false; + break; + case SHRUG: // ¯\_(ツ)_/¯ + if (record->event.pressed) { + send_unicode_hex_string("00AF 005C 005F 0028 30C4 0029 005F 002F 00AF"); + } + return false; + break; + case HEARTFACE: // ♥‿♥ + if(record->event.pressed){ + send_unicode_hex_string("2665 203F 2665"); + } + return false; + break; + case DISFACE: // ಠ_ಠ + if(record->event.pressed){ + send_unicode_hex_string("0CA0 005F 0CA0"); + } + return false; + break; + case TFLIP: // (╯°□°)╯ ︵ ┻━┻ + if(record->event.pressed){ + send_unicode_hex_string("0028 256F 00B0 25A1 00B0 0029 256F 0020 FE35 0020 253B 2501 253B"); + } + return false; + break; + case TFLIP2: // ┻━┻︵ \(°□°)/ ︵ ┻━┻ + if(record->event.pressed){ + send_unicode_hex_string("253B 2501 253B FE35 0020 005C 0028 00B0 25A1 00B0 0029 002F 0020 FE35 0020 253B 2501 253B"); + } + return false; + break; + } + } + return true; +} + + +/* tap dance time */ +void tdexample1(qk_tap_dance_state_t *state, void *user_data) { + if (state->count >= 2) { + SEND_STRING(EXAMPLESTRING1); + reset_tap_dance (state); + } +} +void tdexample2(qk_tap_dance_state_t *state, void *user_data) { + if (state->count >= 2) { + SEND_STRING(EXAMPLESTRING2); + reset_tap_dance (state); + } +} +void tdexample3(qk_tap_dance_state_t *state, void *user_data) { + if (state->count >= 2) { + SEND_STRING(EXAMPLESTRING3); + reset_tap_dance (state); + } +} +void tdexample4(qk_tap_dance_state_t *state, void *user_data) { + if (state->count >= 2) { + SEND_STRING(EXAMPLESTRING4); + reset_tap_dance (state); + } +} + +qk_tap_dance_action_t tap_dance_actions[] = { + [TD_EXAMPLE1] = ACTION_TAP_DANCE_FN(tdexample1), + [TD_EXAMPLE2] = ACTION_TAP_DANCE_FN(tdexample2), + [TD_EXAMPLE3] = ACTION_TAP_DANCE_FN(tdexample3), + [TD_EXAMPLE4] = ACTION_TAP_DANCE_FN(tdexample4) +}; + +// Runs just one time when the keyboard initializes. +void matrix_scan_user(void) { + static bool has_ran_yet; + if (!has_ran_yet) { + has_ran_yet = true; + rgblight_setrgb (16, 0, 16); + } +} +uint32_t layer_state_set_user(uint32_t state) { + switch (biton32(state)) { + case _TAPLAND: + rgblight_setrgb(0, 16, 0); //green + break; + case _LEDCNTL: + rgblight_setrgb(0, 0, 16); //blue + break; + case _EMOJI: + rgblight_setrgb (16, 0, 16); //purple + break; + + default: // for any other layers, or the default layer + rgblight_setrgb (16, 0, 16); //purple + break; + } + return state; +} \ No newline at end of file diff --git a/keyboards/1upkeyboards/sweet16/keymaps/ridingintraffic/readme.md b/keyboards/1upkeyboards/sweet16/keymaps/ridingintraffic/readme.md new file mode 100644 index 000000000..7a3b8c8e4 --- /dev/null +++ b/keyboards/1upkeyboards/sweet16/keymaps/ridingintraffic/readme.md @@ -0,0 +1,10 @@ +# Ridingtraffic's examples +=== +This keymap has many features: +3 layers +Momentary layer switching +16 pixel neopixel +Unicode Enabled +Tap dance enabled + +The rgb also updates depending on what layer you are on, and then flips back when done. diff --git a/keyboards/1upkeyboards/sweet16/keymaps/ridingintraffic/rules.mk b/keyboards/1upkeyboards/sweet16/keymaps/ridingintraffic/rules.mk new file mode 100644 index 000000000..de4417553 --- /dev/null +++ b/keyboards/1upkeyboards/sweet16/keymaps/ridingintraffic/rules.mk @@ -0,0 +1,5 @@ +# turning on tap dance +TAP_DANCE_ENABLE = yes +RGBLIGHT_ENABLE = yes +MOUSEKEY_ENABLE = no +UNICODE_ENABLE = yes \ No newline at end of file From c8267d9fea5e8b0dbdeb8521238c922ff4a83a99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20=C4=90or=C4=91evi=C4=87?= Date: Tue, 23 Oct 2018 21:34:06 +0200 Subject: [PATCH 358/788] Update whitefox/konstantin keymap (#4220) * Change brace style to QMK OTBS * Change Unicode input mode to UC_WINC * Align constant values in config.h --- keyboards/whitefox/keymaps/konstantin/config.h | 18 +++++++++--------- keyboards/whitefox/keymaps/konstantin/keymap.c | 18 ++++++------------ 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/keyboards/whitefox/keymaps/konstantin/config.h b/keyboards/whitefox/keymaps/konstantin/config.h index 725609b46..39450d680 100644 --- a/keyboards/whitefox/keymaps/konstantin/config.h +++ b/keyboards/whitefox/keymaps/konstantin/config.h @@ -2,16 +2,16 @@ #define FORCE_NKRO -#define PERMISSIVE_HOLD -#define TAPPING_TERM 200 -#define TAPPING_TOGGLE 2 +#define MOUSEKEY_DELAY 50 +#define MOUSEKEY_INTERVAL 15 +#define MOUSEKEY_MAX_SPEED 4 +#define MOUSEKEY_TIME_TO_MAX 50 +#define MOUSEKEY_WHEEL_MAX_SPEED 1 +#define MOUSEKEY_WHEEL_TIME_TO_MAX 50 -#define MOUSEKEY_DELAY 50 -#define MOUSEKEY_INTERVAL 15 -#define MOUSEKEY_MAX_SPEED 4 -#define MOUSEKEY_TIME_TO_MAX 50 -#define MOUSEKEY_WHEEL_MAX_SPEED 1 -#define MOUSEKEY_WHEEL_TIME_TO_MAX 50 +#define PERMISSIVE_HOLD +#define TAPPING_TERM 200 +#define TAPPING_TOGGLE 2 #undef IS_COMMAND #define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RCTL))) diff --git a/keyboards/whitefox/keymaps/konstantin/keymap.c b/keyboards/whitefox/keymaps/konstantin/keymap.c index 247bc6bbf..edb049287 100644 --- a/keyboards/whitefox/keymaps/konstantin/keymap.c +++ b/keyboards/whitefox/keymaps/konstantin/keymap.c @@ -19,9 +19,8 @@ #define UC_DIVS UC(0x00F7) #define UC_MINS UC(0x2212) -void matrix_init_user(void) -{ - set_unicode_input_mode(UC_WIN); +void matrix_init_user(void) { + set_unicode_input_mode(UC_WINC); } enum layers { @@ -35,13 +34,10 @@ enum custom_keycodes { NUMPAD, }; -bool process_record_user(uint16_t keycode, keyrecord_t *record) -{ +bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch (keycode) { case CLEAR: - if (record->event.pressed) { - SEND_STRING(SS_LCTRL("a") SS_TAP(X_DELETE)); - } + if (record->event.pressed) { SEND_STRING(SS_LCTRL("a") SS_TAP(X_DELETE)); } return false; case NUMPAD: @@ -65,15 +61,13 @@ enum tap_dance { TD_DESKTOP, }; -void td_fn_rctl_finished(qk_tap_dance_state_t *state, void *user_data) -{ +void td_fn_rctl_finished(qk_tap_dance_state_t *state, void *user_data) { // Single tap → Fn, double tap → RCtrl, triple tap → Fn+RCtrl etc. if (state->count & 1) { layer_on(L_FN); } if (state->count & 2) { register_code(KC_RCTL); } } -void td_fn_rctl_reset(qk_tap_dance_state_t *state, void *user_data) -{ +void td_fn_rctl_reset(qk_tap_dance_state_t *state, void *user_data) { if (state->count & 1) { layer_off(L_FN); } if (state->count & 2) { unregister_code(KC_RCTL); } } From b0a021c07aa38905090058bd57b9304425594557 Mon Sep 17 00:00:00 2001 From: Ajax Date: Tue, 23 Oct 2018 15:44:48 -0400 Subject: [PATCH 359/788] Made a userspace that allows you to use your keyboard as an order of operations based calculator (#2864) * Made DZ60 layout with calculator * Cleaned up and commented, preparing to fix bug with negative in front of open parenthesis as first character * Fixed bug where negative sign infront of parenthesis as first character was parsed incorrectly * Made a better solution for the bug from the previous commit * Modularized and added a userfile so that this code can be used on various keyboards, found in doogle999 * Removed commented code from keymap * Made the layer that is used for calculations a define so that it can be changed per keyboard * Made the readme * Made the readme in the correct place * Revert "Made the readme in the correct place" This reverts commit 7f8b59ed9e59c77401a48be3a7ac1e8fd8e84e32. * Manually synced with qmk upstream * Stopped repeat, made keys print character that they are defined as rather than what the keyboard wants them to do * Added support for numpad, might make all keycodes custom so that there is no need to change doogle999.c if you want to change the keycode that is associated with a function, also made numpad automatically activating an option * Fixed some bugs with backspacing, updated the readme * Fixed some bugs with numlock turning on at the wrong times when a shift key was down * Made the return to layer work automatically instead of just forcing it to layer 0 * fixes and style changes, 20% decreased binary size * Fixed some bugs with double printing and compilation errors on my side * Fixed bug with exceeding the buffer size * Removed changes that added const-ness * Made changes so that backspace does not repeat to remove backspace bugs, still some bugs with recalculating without having typed anything * Fixed obo error with calc main loop * Made includes more accurate in keymap for dz60 * Moved flags to user makefile --- keyboards/dz60/keymaps/doogle999/keymap.c | 74 ++++ tmk_core/rules.mk | 1 - users/doogle999/doogle999.c | 460 ++++++++++++++++++++++ users/doogle999/doogle999.h | 99 +++++ users/doogle999/readme.md | 41 ++ users/doogle999/rules.mk | 14 + 6 files changed, 688 insertions(+), 1 deletion(-) create mode 100644 keyboards/dz60/keymaps/doogle999/keymap.c create mode 100644 users/doogle999/doogle999.c create mode 100644 users/doogle999/doogle999.h create mode 100644 users/doogle999/readme.md create mode 100644 users/doogle999/rules.mk diff --git a/keyboards/dz60/keymaps/doogle999/keymap.c b/keyboards/dz60/keymaps/doogle999/keymap.c new file mode 100644 index 000000000..deea641f7 --- /dev/null +++ b/keyboards/dz60/keymaps/doogle999/keymap.c @@ -0,0 +1,74 @@ +#include QMK_KEYBOARD_H + +#include "doogle999.h" + +#define ______ KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Base layer + * ,-----------------------------------------------------------------------------------------. + * | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Backspace | + * |-----------------------------------------------------------------------------------------+ + * | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | + * |-----------------------------------------------------------------------------------------+ + * | Fn | A | S | D | F | G | H | J | K | L | ; | ' | Enter | + * |-----------------------------------------------------------------------------------------+ + * | Shift | Z | X | C | V | B | N | M | , | . | Shift | U | Del | + * |-----------------------------------------------------------------------------------------+ + * | Ctrl | Cmd | Alt | Space | / | Fn | L | D | R | + * `-----------------------------------------------------------------------------------------' + */ + + LAYOUT_directional( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, ______, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, + MO(1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, ______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_RSFT, KC_UP, KC_DELETE, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_SLSH, MO(1), KC_LEFT, KC_DOWN, KC_RIGHT + ), + +/* Fn layer + * ,-----------------------------------------------------------------------------------------. + * | ~ | F1 | F2 | F3 | F4 | F5 | F6 | f7 | F8 | F9 | F10 | F11 | F12 | Backspace | + * |-----------------------------------------------------------------------------------------+ + * | Reset | NP1 | NP2 | NP3 | NP4 | NP5 | NP6 | NP7 | NP8 | NP9 | NP0 |VolD |VolU | Mute | + * |-----------------------------------------------------------------------------------------+ + * | | | | | | | | | | BlD | BlI | BlT | Menu | + * |-----------------------------------------------------------------------------------------+ + * | Shift | Cyc+| Cyc-| Val+| Val-| Hue+| Hue-| Sat+| Sat-| Tog | Shift | Pup | Ins | + * |-----------------------------------------------------------------------------------------+ + * | Ctrl | Cmd | Alt | Space |HwCal| |Home | Pdn | End | + * `-----------------------------------------------------------------------------------------' + */ + + LAYOUT_directional( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ______, KC_CALC, + RESET, KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_4, KC_KP_5, KC_KP_6, KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_0, KC_VOLD, KC_VOLU, KC_MUTE, + ______, ______, ______, ______, ______, ______, ______, ______, ______, BL_DEC, BL_INC, BL_TOGG, KC_APP, + KC_LSFT, ______, RGB_MOD, RGB_RMOD, RGB_VAI, RGB_VAD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_TOG, KC_RSFT, KC_PGUP, KC_INSERT, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, TO(2), ______, KC_HOME, KC_PGDOWN, KC_END + ), + + /* Hardware calculator layer + * ,-----------------------------------------------------------------------------------------. + * |EndCa| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Backspace | + * |-----------------------------------------------------------------------------------------+ + * | | Q | | E | | T | | | | | P | | | | + * |-----------------------------------------------------------------------------------------+ + * | | | S | | | | | | | L | | | Calc | + * |-----------------------------------------------------------------------------------------+ + * | Shift | | | | C | | | | | . | Shift | | | + * |-----------------------------------------------------------------------------------------+ + * | | | | | / | | | | | + * `-----------------------------------------------------------------------------------------' + */ + + LAYOUT_directional( + ENDCALC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, ______, KC_BSPC, + ______, KC_Q, ______, KC_E, ______, KC_T, ______, ______, ______, ______, KC_P, ______, ______, ______, + ______, ______, KC_S, ______, ______, ______, ______, ______, ______, KC_L, ______, ______, CALC, + KC_LSFT, ______, ______, ______, KC_C, ______, ______, ______, ______, ______, KC_DOT, KC_RSFT, ______, ______, + ______, ______, ______, ______, ______, ______, KC_SLSH, ______, ______, ______, ______ + ), +}; \ No newline at end of file diff --git a/tmk_core/rules.mk b/tmk_core/rules.mk index f1ef733f6..ce3cd83b3 100644 --- a/tmk_core/rules.mk +++ b/tmk_core/rules.mk @@ -103,7 +103,6 @@ endif CFLAGS += -Wa,-adhlns=$(@:%.o=%.lst) CFLAGS += $(CSTANDARD) - #---------------- Compiler Options C++ ---------------- # -g*: generate debugging information # -O*: optimization level diff --git a/users/doogle999/doogle999.c b/users/doogle999/doogle999.c new file mode 100644 index 000000000..320de7cff --- /dev/null +++ b/users/doogle999/doogle999.c @@ -0,0 +1,460 @@ +#include "doogle999.h" + +static unsigned char inputLocation = 0; // Current index in text input + +static double calc(const char input[CALC_BUFFER_SIZE +1]) // Finds value of input char array, relatively small and fast I think +{ + char inputToken[CALC_BUFFER_SIZE + 1]; // Input buffer, used when a single token (generally a number) takes up more + unsigned char inputTokenLocation = 0, inputLocation = 0; // Keep track of indices + + struct Token tokens[CALC_BUFFER_SIZE + 1]; // Input, converted to tokens, one extra large to accomodate for possible negative sign then open parenthesis as first character + unsigned char tokenCount = 0; // Keep track of index + + bool dashAsMinus = false; // Kind of a hacky solution to determining whether to treat a dash as a minus sign or a negative sign + + while(inputLocation < CALC_BUFFER_SIZE + 1) + { + char digit = input[inputLocation]; + + if(inputLocation == 0 && input[inputLocation] == CALC_CHAR_SUB && input[inputLocation + 1] == CALC_CHAR_BEG) + { + tokens[tokenCount].raw.num = 0; + tokens[tokenCount].isNum = true; + + tokenCount++; + dashAsMinus = true; + } + + if ((digit >= '0' && digit <= '9') || /* valid digit */ + (inputTokenLocation != 0 && input[inputLocation] == CALC_CHAR_DEC) || /* valid floating point */ + (!dashAsMinus && inputTokenLocation == 0 && input[inputLocation] == CALC_CHAR_SUB)) /* - is negative sign */ + { + inputToken[inputTokenLocation] = input[inputLocation]; + inputTokenLocation++; + inputLocation++; + continue; + } + + if(inputTokenLocation != 0) + { + // sscanf(inputToken, "%lf", &tokens[tokenCount].raw.num); // I would like to use sscanf here, but the small version of stdio.h on the chip doesn't allow sscanf or its sister functions to be used to process floats + tokens[tokenCount].raw.num = atof(inputToken); + tokens[tokenCount].isNum = true; + for(unsigned char i = 0; i < inputTokenLocation + 1; i++) + { + inputToken[i] = '\0'; + } + inputTokenLocation = 0; + tokenCount++; + dashAsMinus = true; + continue; + } + + /* inputTokenLocation == 0 */ + tokens[tokenCount].isNum = false; + tokens[tokenCount].raw.op.c = input[inputLocation]; + tokens[tokenCount].raw.op.priority = 0; + tokens[tokenCount].raw.op.ltr = true; + dashAsMinus = false; + + switch(input[inputLocation]) + { + case CALC_CHAR_BEG: + break; + case CALC_CHAR_END: + dashAsMinus = true; + break; + case CALC_CHAR_ADD: + tokens[tokenCount].raw.op.priority = CALC_PRIO_ADD; + break; + case CALC_CHAR_SUB: + tokens[tokenCount].raw.op.priority = CALC_PRIO_SUB; + break; + case CALC_CHAR_MUL: + tokens[tokenCount].raw.op.priority = CALC_PRIO_MUL; + break; + case CALC_CHAR_DIV: + tokens[tokenCount].raw.op.priority = CALC_PRIO_DIV; + break; + case CALC_CHAR_EXP: + tokens[tokenCount].raw.op.priority = CALC_PRIO_EXP; + tokens[tokenCount].raw.op.ltr = false; + break; + case CALC_CHAR_SIN: + case CALC_CHAR_COS: + case CALC_CHAR_TAN: + case CALC_CHAR_ASN: + case CALC_CHAR_ACS: + case CALC_CHAR_ATN: + case CALC_CHAR_LGE: + case CALC_CHAR_LOG: + case CALC_CHAR_SQT: + break; + case CALC_CHAR_EUL: + tokens[tokenCount].isNum = true; + tokens[tokenCount].raw.num = CALC_VALU_EUL; + dashAsMinus = true; + break; + case CALC_CHAR_PI: + tokens[tokenCount].isNum = true; + tokens[tokenCount].raw.num = CALC_VALU_PI; + dashAsMinus = true; + break; + case '\0': + tokenCount--; + inputLocation = CALC_BUFFER_SIZE; + break; + default: + tokenCount--; + break; + } + tokenCount++; + inputLocation++; + } + + struct Token output[CALC_BUFFER_SIZE + 1]; // Final output tokens before evaluation + struct Token opstack[CALC_BUFFER_SIZE + 1]; // Stack of operators + unsigned char outputLocation = 0, opstackLocation = 0; // Keep track of indices + + unsigned char numBrackets = 0; // The number of parenthesis + + for(unsigned char i = 0; i < tokenCount; i++) + { + if(tokens[i].isNum) + { + output[outputLocation] = tokens[i]; + outputLocation++; + } + else if(tokens[i].raw.op.c == CALC_CHAR_BEG) + { + opstack[opstackLocation] = tokens[i]; + opstackLocation++; + } + else if(tokens[i].raw.op.c == CALC_CHAR_END) + { + while(opstack[opstackLocation - 1].raw.op.c != CALC_CHAR_BEG) + { + output[outputLocation] = opstack[opstackLocation - 1]; + outputLocation++; + opstackLocation--; + } + opstackLocation--; + + numBrackets += 2; + } + else if(tokens[i].raw.op.priority == 0) + { + opstack[opstackLocation] = tokens[i]; + opstackLocation++; + } + else + { + while(opstackLocation != 0 + && (opstack[opstackLocation - 1].raw.op.priority == 0 + || tokens[i].raw.op.priority < opstack[opstackLocation - 1].raw.op.priority + || (tokens[i].raw.op.priority == opstack[opstackLocation - 1].raw.op.priority && opstack[opstackLocation - 1].raw.op.ltr)) + && opstack[opstackLocation - 1].raw.op.c != CALC_CHAR_BEG) + { + output[outputLocation] = opstack[opstackLocation - 1]; + outputLocation++; + opstackLocation--; + } + opstack[opstackLocation] = tokens[i]; + opstackLocation++; + } + } + + tokenCount -= numBrackets; + + for(signed char i = opstackLocation - 1; i >= 0; i--) + { + output[outputLocation] = opstack[i]; + outputLocation++; + opstackLocation--; + } + + double answer[CALC_BUFFER_SIZE]; + unsigned char answerLocation = 0; + + for(unsigned char i = 0; i < tokenCount; i++) + { + if(output[i].isNum) + { + answer[answerLocation] = output[i].raw.num; + answerLocation++; + continue; + } + + if(output[i].raw.op.priority == 0) + { + if (answerLocation < 1) { /* not handled here -- ERROR? */ } else + if(answerLocation >= 1) + { + double (*op)(double); + switch(output[i].raw.op.c) + { + case CALC_CHAR_SIN: + op = sin; + break; + case CALC_CHAR_COS: + op = cos; + break; + case CALC_CHAR_TAN: + op = tan; + break; + case CALC_CHAR_ASN: + op = asin; + break; + case CALC_CHAR_ACS: + op = acos; + break; + case CALC_CHAR_ATN: + op = atan; + break; + case CALC_CHAR_LGE: + op = log; + break; + case CALC_CHAR_LOG: + op = log10; + break; + case CALC_CHAR_SQT: + op = sqrt; + break; + default: + continue; /* invalid input */ + } + answer[answerLocation - 1] = op(answer[answerLocation - 1]); + } + } + /* priority != 0 */ + else if(answerLocation >= 2) + { + switch(output[i].raw.op.c) + { + case CALC_CHAR_ADD: + answer[answerLocation - 2] += answer[answerLocation - 1]; + break; + case CALC_CHAR_SUB: + answer[answerLocation - 2] -= answer[answerLocation - 1]; + break; + case CALC_CHAR_MUL: + answer[answerLocation - 2] *= answer[answerLocation - 1]; + break; + case CALC_CHAR_DIV: + answer[answerLocation - 2] /= answer[answerLocation - 1]; + break; + case CALC_CHAR_EXP: + answer[answerLocation - 2] = pow(answer[answerLocation - 2], answer[answerLocation - 1]); + break; + } + + answerLocation--; + } + } + + return answer[0]; +} + +/* + * @returns 0 when nothing should happen and QMK should work as usual + * @returns -1 when invalid input was given, QMK should ignore it + * @returns -2 when BSP should be done + * @returns -3 when CALC should be done + * @returns -4 when ENDCALC should be done + * @returns positive value of CALC_* when normal input was processed + */ +static int process_input(const uint16_t keycode, const uint8_t mods, const keyevent_t event) +{ + /* handle even when no key was pressed */ + if(!event.pressed) + { + switch(keycode) + { + /* QMK should handle those */ + case KC_RSFT: + case KC_LSFT: + return 0; + break; + } + /* ??? ignore */ + return -1; + } + + /* when shift key is pressed handle characters differently */ + char characterPressed; + if((get_mods() & MODS_SHIFT_MASK)) + { + switch(keycode) + { + case KC_9: + characterPressed = CALC_CHAR_BEG; + break; + case KC_0: + characterPressed = CALC_CHAR_END; + break; + case KC_EQUAL: + characterPressed = CALC_CHAR_ADD; + break; + case KC_KP_PLUS: + characterPressed = CALC_CHAR_ADD; + break; + case KC_6: + characterPressed = CALC_CHAR_EXP; + break; + case KC_8: + characterPressed = CALC_CHAR_MUL; + break; + case KC_KP_ASTERISK: + characterPressed = CALC_CHAR_MUL; + break; + case KC_S: + characterPressed = CALC_CHAR_ASN; + break; + case KC_C: + characterPressed = CALC_CHAR_ACS; + break; + case KC_T: + characterPressed = CALC_CHAR_ATN; + break; + case KC_L: + characterPressed = CALC_CHAR_LOG; + break; + default: + return -1; + break; + } + return characterPressed; + } + + /* normal key handling: shift not pressed */ + + /* digits */ + if (keycode == KC_KP_0 || keycode == KC_0) { + return '0'; + } else if (keycode >= KC_KP_1 && keycode <= KC_KP_9) { + return keycode - KC_KP_1 +1 + '0'; + } else if (keycode >= KC_1 && keycode <= KC_9) { + return keycode - KC_1 +1 + '0'; + } + + /* other tokens */ + switch (keycode) { + case KC_MINUS: + case KC_KP_MINUS: + return characterPressed = CALC_CHAR_SUB; + case KC_SLASH: + case KC_KP_SLASH: + return characterPressed = CALC_CHAR_DIV; + case KC_S: + return characterPressed = CALC_CHAR_SIN; + case KC_C: + return characterPressed = CALC_CHAR_COS; + case KC_T: + return characterPressed = CALC_CHAR_TAN; + case KC_Q: + return characterPressed = CALC_CHAR_SQT; + case KC_L: + return characterPressed = CALC_CHAR_LGE; + case KC_DOT: + case KC_KP_DOT: + return characterPressed = CALC_CHAR_DEC; + case KC_P: + return characterPressed = CALC_CHAR_PI; + case KC_E: + return characterPressed = CALC_CHAR_EUL; + case KC_BSPC: + return -2; + case KC_RSFT: + return 0; + case KC_LSFT: + return 0; + case CALC: + return -3; + case ENDCALC: + return -4; + default: + return -1; + } +} + +bool process_record_user(uint16_t keycode, keyrecord_t* record) +{ + static char text[CALC_BUFFER_SIZE + 1]; // Used to store input and then output when ready to print + static char backspaceText[CALC_BUFFER_SIZE + 1]; // Pretty dumb waste of memory because only backspace characters, used with send_string to backspace and remove input + + if((biton32(layer_state) == CALC_LAYER && CALC_FORCE_NUM_LOCK_INSIDE_CALC) || (biton32(layer_state) != CALC_LAYER && CALC_FORCE_NUM_LOCK_OUTSIDE_CALC)) + { + bool numpadKeyPressed = record->event.pressed && + !(get_mods() & MODS_SHIFT_MASK) && + /* KC_KP_1, KC_KP_2, ..., KC_KP_0, KC_KP_DOT */ + (keycode >= KC_KP_1 && keycode <= KC_KP_DOT); + + if(numpadKeyPressed && !(host_keyboard_leds() & (1 << USB_LED_NUM_LOCK))) + { + add_key(KC_NLCK); + send_keyboard_report(); + del_key(KC_NLCK); + } + } + + if(biton32(layer_state) != CALC_LAYER) { return true; } + + int action = process_input(keycode, get_mods(), record->event); + switch(action) + { + case 0: + return true; + case -1: + return false; + case -2: + if(inputLocation > 0) + { + inputLocation--; + text[inputLocation] = '\0'; + backspaceText[0] = (char)8; + backspaceText[1] = '\0'; + send_string(backspaceText); + } + return false; + case -3: + for(int i = 0; i < inputLocation; i++) + { + backspaceText[i] = (char)8; + } + send_string(backspaceText); + dtostrf(calc(text), CALC_PRINT_SIZE, CALC_PRINT_SIZE, text); + send_string(text); + for(unsigned char i = 0; i < CALC_BUFFER_SIZE; i++) + { + text[i] = '\0'; + backspaceText[i] = '\0'; + } + inputLocation = 0; + return false; + case -4: + for(unsigned char i = 0; i < CALC_BUFFER_SIZE; i++) + { + text[i] = '\0'; + backspaceText[i] = '\0'; + } + inputLocation = 0; + layer_off(CALC_LAYER); + return false; + default: + break; + } + char characterPressed = (char)action; + + if(inputLocation < CALC_BUFFER_SIZE) + { + text[inputLocation] = characterPressed; + inputLocation++; + + char characterToSend[2]; + characterToSend[0] = characterPressed; + characterToSend[1] = '\0'; + + send_string(characterToSend); + } + return false; +} \ No newline at end of file diff --git a/users/doogle999/doogle999.h b/users/doogle999/doogle999.h new file mode 100644 index 000000000..7ed38fbcc --- /dev/null +++ b/users/doogle999/doogle999.h @@ -0,0 +1,99 @@ +#ifndef USERSPACE +#define USERSPACE + +#include "quantum.h" + +#define NO_ACTION_ONESHOT +#define NO_ACTION_MACRO + +#define MODS_SHIFT_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) + +// Layer the calculator is on +#define CALC_LAYER 2 + +// Inside is whether when you are in calc mode it should automatically force numlock, outside is whether it should do it outside of calculator mode +#define CALC_FORCE_NUM_LOCK_INSIDE_CALC true +#define CALC_FORCE_NUM_LOCK_OUTSIDE_CALC true + +// Maximum number of characters the calculator can have +#define CALC_BUFFER_SIZE 32 + +// Minimum width of the printed text / the number of decimal places +#define CALC_PRINT_SIZE 6 + +/*----- + Special +-----*/ +#define CALC_CHAR_BEG '(' +#define CALC_CHAR_END ')' +#define CALC_CHAR_DEC '.' + +/*----- + Operators - Can add more here such as modulo %, factorial ! +-----*/ +#define CALC_CHAR_ADD '+' +#define CALC_PRIO_ADD 1 + +#define CALC_CHAR_SUB '-' +#define CALC_PRIO_SUB 1 + +#define CALC_CHAR_MUL '*' +#define CALC_PRIO_MUL 2 + +#define CALC_CHAR_DIV '/' +#define CALC_PRIO_DIV 2 + +#define CALC_CHAR_EXP '^' +#define CALC_PRIO_EXP 3 + +/*----- + Functions +-----*/ +#define CALC_CHAR_SIN 's' +#define CALC_CHAR_COS 'c' +#define CALC_CHAR_TAN 't' + +#define CALC_CHAR_ASN 'S' +#define CALC_CHAR_ACS 'C' +#define CALC_CHAR_ATN 'T' + +#define CALC_CHAR_LGE 'l' +#define CALC_CHAR_LOG 'L' + +#define CALC_CHAR_SQT 'q' + +/*----- + Constants +-----*/ +#define CALC_CHAR_EUL 'e' +#define CALC_VALU_EUL 2.71828182845904523536 + +#define CALC_CHAR_PI 'p' +#define CALC_VALU_PI 3.14159265358979323846 + +struct OP // Operator/function +{ + char c; + unsigned char priority; + bool ltr; +}; + +union TokenRaw // A token after the input has been processed, can either be a number or an operator/function +{ + double num; + struct OP op; +}; + +struct Token // Encapsulator +{ + bool isNum; + union TokenRaw raw; +}; + +enum CalcFunctions // Hardware calculator key functionality +{ + CALC = SAFE_RANGE, + ENDCALC +}; + +#endif diff --git a/users/doogle999/readme.md b/users/doogle999/readme.md new file mode 100644 index 000000000..e108555b9 --- /dev/null +++ b/users/doogle999/readme.md @@ -0,0 +1,41 @@ +Copyright 2018 @doogle999 + +Overview +======== + +This folder is just for some calculator code for my keyboards. + +Making Your Keyboard Into A Calculator +-------------------------------------- + +If you'd like to make your keyboard into a calculator, you can do it with this userspace (hopefully!) + +You can make a keymap for your keyboard of choice named doogle999 and then you can make it regularly. + +You should make one layer that is just the functionality for your calculator, so it just has the keys you need (numbers, symbols, some letters for functions). It should also have END_CALC and CALC somewhere. END_CALC gets you out of calculator mode, and CALC evaluates the calculation. + +On one of your other keymaps you should make a key that is TO(layer of calculator). This is how you will activate the calculator. You should also define the layer your calculator is on with the define CALC_LAYER in doogle999.h (this means that for all your keyboards, your calculator layer has to be the same layer). + +You can change what characters coorespond to what operators and functions and you can add more functions in doogle999.h and doogle999.c, you can also change which characters are sued for which keys. However, as of now standard keys should be used for operations. By that I mean if you want your multiplication sign to be an x, you should change the CALC_CHAR_MUL to an x but you should keep your multiplication keycode on the keymap either as KC_8 (shifted) or KC_KP_ASTERISK. This might be changed in the future so there are custom keycodes so this is less of a pain and more intuitive. + +You can look at my dz60 keymap doogle999 for an example. + +Issues +------ +Unfortunately the chip onboard my dz60 only does single precision floating point numbers, but I have everything set up as double so if your chip supports doubles it should work for you. + +This Was Here When I Made The ReadMe +------------------------------------ + +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 . \ No newline at end of file diff --git a/users/doogle999/rules.mk b/users/doogle999/rules.mk new file mode 100644 index 000000000..12698a27e --- /dev/null +++ b/users/doogle999/rules.mk @@ -0,0 +1,14 @@ +SRC += doogle999.c + +CFLAGS += -fstrict-aliasing -ftree-vrp + +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +AUDIO_ENABLE = no +RGBLIGHT_ENABLE = yes From 9ed0c2d57b4f5014c24ea48a6fe448b69789957b Mon Sep 17 00:00:00 2001 From: Callum Oakley Date: Wed, 24 Oct 2018 00:28:40 +0100 Subject: [PATCH 360/788] Keymap update (#4223) * change window focus shortcuts * hangul * macos goodness * re-arrange tab keys * remove tab switching keys * left hand func * glorious macro pad * workspace rotation keys * tabbing hotkeys * left hand tab change keys * SEND_STRING("!") on KC_EXLM * use SEND_STRING for all shifted symbols * SEND_STRING even for non shifted symbols so they play nicely with the shifted ones --- keyboards/planck/keymaps/callum/keymap.c | 74 +++++++++++++++++++++--- 1 file changed, 66 insertions(+), 8 deletions(-) diff --git a/keyboards/planck/keymaps/callum/keymap.c b/keyboards/planck/keymaps/callum/keymap.c index 2a816bf67..1cffe15d4 100644 --- a/keyboards/planck/keymaps/callum/keymap.c +++ b/keyboards/planck/keymaps/callum/keymap.c @@ -172,7 +172,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----| * |Power| F11 | F12 | F13 | F14 | F15 | F16 | F17 | F18 | F19 | F20 |VolDn| * |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----| - * | | F21 | F22 | F23 | F24 | | | | |Clmak|Qwrty| | + * | | | |TabL |TabR | | | | |Clmak|Qwrty| | * |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----| * | | | | |Prev |Mute |Play |Next | | | | | * `-----------------------------------------------------------------------' @@ -189,8 +189,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_F18, KC_F19, KC_F20, KC_VOLD }, { - _______, KC_F21, KC_F22, KC_F23, - KC_F24, XXXXXXX, XXXXXXX, XXXXXXX, + _______, XXXXXXX, XXXXXXX, SC(KC_TAB), + C(KC_TAB), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, COLEMAK, QWERTY, _______ }, { @@ -229,13 +229,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { set_colemak(); } return false; - break; case QWERTY: if (record->event.pressed) { set_qwerty(); } return false; - break; case SYMB: if (record->event.pressed) { layer_on(_SYMB); @@ -243,7 +241,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { layer_off(_SYMB); } return false; - break; case MOVE: if (record->event.pressed) { layer_on(_MOVE); @@ -251,7 +248,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { layer_off(_MOVE); } return false; - break; case FUNC: if (record->event.pressed) { layer_on(_FUNC); @@ -259,7 +255,69 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { layer_off(_FUNC); } return false; - break; + + // Override the defualt auto shifted symbols to use SEND_STRING + // See https://github.com/qmk/qmk_firmware/issues/4072 + case KC_EXLM: + if (record->event.pressed) { SEND_STRING("!"); } + return false; + case KC_AT: + if (record->event.pressed) { SEND_STRING("@"); } + return false; + case KC_HASH: + if (record->event.pressed) { SEND_STRING("#"); } + return false; + case KC_DLR: + if (record->event.pressed) { SEND_STRING("$"); } + return false; + case KC_PERC: + if (record->event.pressed) { SEND_STRING("%"); } + return false; + case KC_CIRC: + if (record->event.pressed) { SEND_STRING("^"); } + return false; + case KC_AMPR: + if (record->event.pressed) { SEND_STRING("&"); } + return false; + case KC_ASTR: + if (record->event.pressed) { SEND_STRING("*"); } + return false; + case KC_LPRN: + if (record->event.pressed) { SEND_STRING("("); } + return false; + case KC_RPRN: + if (record->event.pressed) { SEND_STRING(")"); } + return false; + case KC_TILD: + if (record->event.pressed) { SEND_STRING("~"); } + return false; + case KC_GRV: + if (record->event.pressed) { SEND_STRING("`"); } + return false; + case KC_PLUS: + if (record->event.pressed) { SEND_STRING("+"); } + return false; + case KC_EQL: + if (record->event.pressed) { SEND_STRING("="); } + return false; + case KC_PIPE: + if (record->event.pressed) { SEND_STRING("|"); } + return false; + case KC_BSLS: + if (record->event.pressed) { SEND_STRING("\\"); } + return false; + case KC_LBRC: + if (record->event.pressed) { SEND_STRING("["); } + return false; + case KC_RBRC: + if (record->event.pressed) { SEND_STRING("]"); } + return false; + case KC_LCBR: + if (record->event.pressed) { SEND_STRING("{"); } + return false; + case KC_RCBR: + if (record->event.pressed) { SEND_STRING("}"); } + return false; } return true; } From bef554d18bcb14492e2513b0759407e4b4581c9c Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Wed, 24 Oct 2018 08:57:08 -0700 Subject: [PATCH 361/788] Bug: Users had to be in the /util directory to run the script (#4228) --- util/new_keymap.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/new_keymap.sh b/util/new_keymap.sh index b09f3dd0c..73cc9e8cc 100755 --- a/util/new_keymap.sh +++ b/util/new_keymap.sh @@ -18,7 +18,7 @@ if [ -z "$USERNAME" ]; then exit 1 fi -cd .. +cd "$(dirname "$0")/.." if [ ! -d "keyboards/$KB_PATH" ]; then printf "Error! keyboards/%s does not exist!\n" "$KB_PATH" From a5b10e5da24cb52c04dddc9168d5e7590fb749d2 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Wed, 24 Oct 2018 12:13:40 -0700 Subject: [PATCH 362/788] Fix syntax for windows --- docs/newbs_building_firmware.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/newbs_building_firmware.md b/docs/newbs_building_firmware.md index ac6bff2bc..fabfefb19 100644 --- a/docs/newbs_building_firmware.md +++ b/docs/newbs_building_firmware.md @@ -16,7 +16,7 @@ Start by navigating to the `keymaps` folder for your keyboard. ?> Windows: - start keyboards//keymaps + start .\\keyboards\\\\keymaps ## Create a Copy Of The `default` Keymap From ffb2557a3aac1e5c943b1e6242c3a693da68d8ee Mon Sep 17 00:00:00 2001 From: 194h <38110558+194h@users.noreply.github.com> Date: Thu, 25 Oct 2018 19:04:48 +0200 Subject: [PATCH 363/788] Keymap: Updated my(194h) keymap to make it more clean and useful (#4236) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Added my(194h) atreus62 keymap * Fixed what noroadsleft remarked in my pull request, hopefully got it all. * Followed drashna's suggestion. * Removed unused functionality from my keymap, added tap dance æøå and changed Layer 1 and Layer 2 * Removed unused functionality from my keymap, added tap dance æøå and changed Layer 1 and Layer 2 --- keyboards/atreus62/keymaps/194h/keymap.c | 109 ++++++++++------------- keyboards/atreus62/keymaps/194h/rules.mk | 5 +- 2 files changed, 51 insertions(+), 63 deletions(-) diff --git a/keyboards/atreus62/keymaps/194h/keymap.c b/keyboards/atreus62/keymaps/194h/keymap.c index 9b397fce4..1d069e9d4 100644 --- a/keyboards/atreus62/keymaps/194h/keymap.c +++ b/keyboards/atreus62/keymaps/194h/keymap.c @@ -39,6 +39,7 @@ //Norwegian layout - dependant on previous definitions #define NO_UNDS LSFT(NO_MINS) // _ #define NO_QUES LSFT(NO_PLUS) // ? +#define NO_ACUT RALT(NO_BSLS) // Acute #define NO_GRAV LSFT(NO_BSLS) // ` #define NO_GT LSFT(NO_LT) // > #define NO_HALF RALT(NO_LT) // ½ @@ -56,6 +57,9 @@ #define OSM_RSFT OSM(MOD_RSFT) #define OSM_RGUI OSM(MOD_RGUI) +//CTRL on hold, ESC on tap +#define CTL_ESC CTL_T(KC_ESC) + //Layers #define L1 0 #define L2 1 @@ -63,23 +67,51 @@ #define L4 3 #define L5 4 +// Momentary switch to layer +#define MO_L2 MO(L2) +#define MO_L4 MO(L4) +#define MO_L5 MO(L5) // Momentary switch to layer - One Shot Layer +#define OSL_L2 OSL(L2) #define OSL_L3 OSL(L3) #define OSL_L4 OSL(L4) +//Tap Dance Declarations +enum { + SCLN_OE = 0, + QUOT_AE, + DQT_AO +}; + +//Tap Dance Definitions +qk_tap_dance_action_t tap_dance_actions[] = { + //Tap once for semicolon, twice for ø + [SCLN_OE] = ACTION_TAP_DANCE_DOUBLE(NO_SCLN, NO_OE), + //Tap once for single quote, twice for æ + [QUOT_AE] = ACTION_TAP_DANCE_DOUBLE(NO_QUOT, NO_AE), + //Tap once for double quote, twice for å + [DQT_AO] = ACTION_TAP_DANCE_DOUBLE(NO_DQT, NO_AO), +// Other declarations would go here, separated by commas, if you have them +}; + +//Tap Dance keys +#define TD_SCLN_OE TD(SCLN_OE) +#define TD_QUOT_AE TD(QUOT_AE) +#define TD_DQT_AO TD(DQT_AO) + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [L1] = LAYOUT( KC_LGUI, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_RGUI, - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, NO_DQT, - KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, NO_SCLN, NO_QUOT, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, TD_DQT_AO, + KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, TD_SCLN_OE, TD_QUOT_AE, OSM_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, NO_MINS, OSM_RSFT, - CTL_T(KC_ESC), MO(L5), KC_LEAD, OSM_LALT, MO(L4), OSL_L3, KC_SPC, KC_ENT, OSL_L3, MO(L4), OSM_RALT, NO_EQL, NO_PLUS, KC_RCTL + CTL_ESC, MO_L5, KC_TAB, OSM_LALT, MO_L4, OSL_L3, KC_SPC, KC_ENT, OSL_L3, MO_L4, OSM_LALT, NO_EQL, NO_PLUS, KC_RCTL ), [L2] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, NO_AO, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, NO_OE, NO_AE, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, NO_DQT, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, NO_SCLN, NO_QUOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), @@ -95,66 +127,23 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { XXXXXXX, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_HOME, KC_PGDN, KC_PGUP, KC_END, XXXXXXX, XXXXXXX, _______, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, XXXXXXX, KC_DEL, XXXXXXX, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, XXXXXXX, KC_APP, XXXXXXX, XXXXXXX, KC_VOLD, XXXXXXX, - OSM_LCTL, _______, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MUTE, KC_VOLU, OSM_RCTL + OSM_LCTL, _______, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, OSM_RALT, KC_MUTE, KC_VOLU, OSM_RCTL ), [L5] = LAYOUT( XXXXXXX, TO(L1), TO(L2), TO(L3), TO(L4), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, NO_AO, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, NO_OE, NO_AE, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_CAPS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX ) }; - -// Unicode Linux -void matrix_init_user(void) { - set_unicode_input_mode(UC_LNX); -}; - - -#define TAP_ONCE(code) \ - register_code (code); \ - unregister_code (code) - - -LEADER_EXTERNS(); - -// Runs constantly in the background, in a loop. Only supports basic keycodes. -void matrix_scan_user(void) { - LEADER_DICTIONARY() { - leading = false; - leader_end(); - - //probably useless in practice, but cool - SEQ_ONE_KEY (KC_P) { - tap_random_base64(); - tap_random_base64(); - tap_random_base64(); - tap_random_base64(); - tap_random_base64(); - tap_random_base64(); - tap_random_base64(); - tap_random_base64(); - } - - SEQ_ONE_KEY (KC_G) { - SEND_STRING("grep something !"); - register_code(KC_RALT); - TAP_ONCE(KC_4); - unregister_code(KC_RALT); - } - SEQ_ONE_KEY (KC_T) { - SEND_STRING("tail "); - TAP_ONCE(KC_SLSH); - SEND_STRING("f !"); - register_code(KC_RALT); - TAP_ONCE(KC_4); - unregister_code(KC_RALT); - } - SEQ_ONE_KEY (KC_S) { - SEND_STRING("sudo !!"); - TAP_ONCE(KC_ENT); - } - } -} +//TODO: Is there productivity gain in the use of unicode? +// - Won't work in xterm. +// Create a layer for macros and/or unicode? +// Are macros useful? +// - Found no gain in having sendstring for commands. +// - Find repeated tasks that cannot be done easily on the OS. +// - Most other keymaps have macros for game/fun stuff, hard to find "serious" onces. +// Screw Norwegian layout, switch to US with unicode æøå or US/English International? +// - Will be different from laptop keyboard, requiring a switch on the OS side when only using the laptop. diff --git a/keyboards/atreus62/keymaps/194h/rules.mk b/keyboards/atreus62/keymaps/194h/rules.mk index 5246909a3..2c97aee09 100644 --- a/keyboards/atreus62/keymaps/194h/rules.mk +++ b/keyboards/atreus62/keymaps/194h/rules.mk @@ -1,8 +1,7 @@ -TAP_DANCE_ENABLE = no +TAP_DANCE_ENABLE = yes NKRO_ENABLE = true MOUSEKEY_ENABLE = no EXTRAKEY_ENABLE = yes CONSOLE_ENABLE = no KEY_LOCK_ENABLE = no -AUTO_SHIFT_ENABLE = no -LEADER_ENABLE = yes +LEADER_ENABLE = no From 3c95de3c695135be358800911f4d36767392f010 Mon Sep 17 00:00:00 2001 From: SpacebarRacecar <42380065+SpacebarRacecar@users.noreply.github.com> Date: Thu, 25 Oct 2018 22:08:25 +0200 Subject: [PATCH 364/788] Adding a readme to my userspace (#4239) * added userspace readme * small fix to userspace readme * another fix to userspace readme * changed and improved userspace readme * Update readme.md * Update readme.md * changes to readme again * readme again --- users/spacebarracecar/readme.md | 111 ++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 users/spacebarracecar/readme.md diff --git a/users/spacebarracecar/readme.md b/users/spacebarracecar/readme.md new file mode 100644 index 000000000..172764c07 --- /dev/null +++ b/users/spacebarracecar/readme.md @@ -0,0 +1,111 @@ +# SpacebarRacecar Userspace + +The main purpose of this userspace is to keep my personal keymaps clean by moving shared code in here and also allowing me to easily change all my keymaps at once. However it also contains code that might be interesting to QMK Users living in Germany. Most of this code will be explained here. + + +## US Layout Keys for German PCs + +I'm using the US Ansi layout however I'm living in Germany which means that every PC here has its input language set to German. My goal was to create custom keycodes that emulate the US Keys so that I can plug my keyboards into any German PC and have them working without changing any settings. + +### How to use + +- To activate the custom keycodes set GERMAN_ENABLE = yes in the keyboards rules.mk file. +- The keycodes are listed and explained in [spacebarracecar.h](spacebarracecar.h) under `enum userspace_custom_keycodes`. +- The keycodes are handled by the `process_record_user` function which is now located in [spacebarracecar.c](spacebarracecar.c). To change keyboard specific configuration `process_record_keymap` is used (see [drashna userspace readme](../drashna/readme.md) for better explanation). +- There is a predefined `_DEADKEY` layer in [spacebarracecar.h](spacebarracecar.h) under `enum userspace_layers`. Shifted CU_QUOT enables the dead key layer, just like KC_QUOT would when using the US International layout. (See `enum userspace_custom_keycodes` for more explanation). +- On Windows grave and circonflexe are defined as dead keys when using the standard german layout. Those are automatically escaped when using the custom keycodes. `CU_ESCT` can be used to enable/disable this behavior. +- For a complete example see my [fc660c](../../keyboards/fc660c/keymaps/spacebarracecar/keymap.c) or [planck](../../keyboards/planck/keymaps/spacebarracecar/keymap.c) keymaps. + +### How it works + +Creating the custom keycodes was not a trivial task because it is necessary that they are able to send different keycodes depending on the physical shift state. Also the shift state of the actual send keycodes has to be completely independent of the physical shift state. At the same time it has to be ensured that shift never gets stuck or disabled accidentaly. + +(Shift state: If shift keycode is registered; Physical shift state: If shift key is actually pressed) + +Here is an example for a custom *US Equal* keycode that illustrates the problem: + +| Physical Shift State | Custom keycode | Actual send keycodes | +|----------------------|----------------|----------------------| +| Unshifted | = | Shifted DE_0 | +| Shifted | + | Unshifted DE_PLUS | + +#### Tracking the physical shift state + +To track the physical shift state there are two custom left and right shift keycodes `CU_LSFT` and `CU_RSFT`. These track the current physical shift state using two booleans `lshift` and `rshift`. To make things easier both custom shifts use KC_LSFT. A space cadet shift functionality is also included. The preexisting space cadet shift implementation could not be used because it doesn't reset when custom keycodes are pressed and therefore produces unwated parenthesis. + +#### Custom keycode templates + +To ease the creation of custom keycodes there are a few templates defined in [spacebarracecar.h](spacebarracecar.h). + +- `SHIFT_NORM(kc1, kc2)` Sends independent keycodes kc1 and kc2 depending on physical shift state without changing shift state. +- `SHIFT_SWITCH(kc1, kc2)` Sends independent keycodes kc1 and kc2 depending on physical shift state while flipping shift state. +- `SHIFT_ALL(kc1, kc2)` Sends independent keycodes kc1 and kc2 depending on physical shift state while always sending shift. +- `SHIFT_NO(kc1, kc2)` Sends independent keycodes kc1 and kc2 depending on physical shift state while never sending shift. +- `SHIFT_ALGR(kc1, kc2)` Sends independent keycodes kc1 and kc2 depending on physical shift state while never sending shift and always sending ralt. +- `UML(kc)` Sends keycode kc without changing shift state and then escapes the `_DEADKEY` layer. + +Here is `SHIFT_NORM` as an example: +```c +#define SHIFT_NORM(kc1, kc2) \ +if (record->event.pressed) { \ + timer_timeout(); \ + if (lshift || rshift) { \ + register_code(KC_LSFT); \ + unregister_code(kc2); \ + register_code(kc2); \ + add_to_prev(kc2); \ + } else { \ + unregister_code(KC_LSFT); \ + unregister_code(kc1); \ + register_code(kc1); \ + } \ +} else { \ + unregister_code(kc1); \ + unregister_code(kc2); \ +} \ +return false; +``` + +It is noticeable that before registering a keycode the same keycode gets unregistered first. The reason for this is that there can now be two physical keys that use the same keycode only with different shift states. When rolling those two keys the keycode has to be unregistered first, otherwise the second key doesn't register. Also noticable is that sometimes the `add_to_prev` function is called. This will be explained later. The `timer_timeout` function is necessary to reset the timers of the custom space cadet shift functionality. + +It's worth mentioning that `SHIFT_ALGR` unlike the other templates doesn't allow repetition of characters when held. This is because it would otherwise require extensive checking of physical ralt status similar to shift to prevent ralt from getting stuck. + +#### Ensuring that shift state is always correct when pressing normal keycodes + +To ensure that non custom keycodes always get send with the correct shift state the default case in `process_record_user` includes a physical shift check that sets shift accordingly before registering the keycode. Also `timer_timeout` is always called to reset the space cadet shift timers to prevent unwanted parenthesis. + +```c +default: + if(record->event.pressed) { + timer_timeout(); + + #ifdef GERMAN_ENABLE + if (lshift || rshift) + register_code(KC_LSFT); + else + unregister_code(KC_LSFT); + #endif + + } + return process_record_keymap(keycode, record); +``` + +#### Ensuring that custom keycodes always produce the correct character + +When very specific key combinations that include custom keycodes and/or shift are pressed it can happen that wrong characters are produced due to changing shift states. The previously mentioned `add_to_prev` function is there to prevent that. It can be used to add a keycode to the `prev_kcs` array that can hold up to 6 keycodes. On various occasions, but mainly when shift is released `unreg_prev` is called, which then unregisters all saved keycodes. + +For real use this is probably not needed, but it doesn't hurt either. + +#### Adapting the templates for other languages + +In theory the templates can be used to create custom keycodes that map any layout to any other layout. + +## Other stuff + +### Custom Nav/Esc Key + +Since I'm always using a navigation layer with all my keyboards there is a `_NAV` layer predefined in [spacebarracecar.h](spacebarracecar.h) under `enum userspace_layers`. In addition to that I wanted to have a keycode that activates the navigation layer when held, but acts as Escape when pressed. In QMK there already exists `LT(layer, kc)`, however I found that there is some amount of lag before the layer is actived. Therefore I created a custom keycode CU_NAV that does the same without lag using a custom timer. Since I already need timers for the custom space cadet shift implementing this was very easy by adding the timer to the `timer_timeout` function. + +### Gamemode + +The userspace includes the custom keycode `CU_GAME` that is used to flip a boolean variable called `game`. That variable is used to enable/disable windows keys and space cadet shift. In my [planck keymap](../../keyboards/planck/keymaps/spacebarracecar/keymap.c) it also makes Lower act like Space which is more comfortable when resting on wasd and it could also be used to change various other things when gaming. From fc1e22ea94146d090af5b47a51fcc07cac7e677c Mon Sep 17 00:00:00 2001 From: lbibass Date: Thu, 25 Oct 2018 16:10:45 -0400 Subject: [PATCH 365/788] Keymap: Mechmini layout (#4232) * Added my Mechmini2 layout to qmk. * Added more info to the readme. * Made changes. * Update keyboards/mechmini/v2/keymaps/lbibass_625_space/keymap.c Co-Authored-By: lbibass * Update keyboards/mechmini/v2/keymaps/lbibass_split_space/keymap.c Co-Authored-By: lbibass --- .../v2/keymaps/lbibass_625_space/config.h | 4 ++ .../v2/keymaps/lbibass_625_space/keymap.c | 48 +++++++++++++++++++ .../v2/keymaps/lbibass_625_space/readme.md | 2 + .../v2/keymaps/lbibass_625_space/rules.mk | 11 +++++ .../v2/keymaps/lbibass_split_space/config.h | 4 ++ .../v2/keymaps/lbibass_split_space/keymap.c | 33 +++++++++++++ .../v2/keymaps/lbibass_split_space/readme.md | 2 + .../v2/keymaps/lbibass_split_space/rules.mk | 11 +++++ 8 files changed, 115 insertions(+) create mode 100755 keyboards/mechmini/v2/keymaps/lbibass_625_space/config.h create mode 100755 keyboards/mechmini/v2/keymaps/lbibass_625_space/keymap.c create mode 100644 keyboards/mechmini/v2/keymaps/lbibass_625_space/readme.md create mode 100755 keyboards/mechmini/v2/keymaps/lbibass_625_space/rules.mk create mode 100755 keyboards/mechmini/v2/keymaps/lbibass_split_space/config.h create mode 100755 keyboards/mechmini/v2/keymaps/lbibass_split_space/keymap.c create mode 100644 keyboards/mechmini/v2/keymaps/lbibass_split_space/readme.md create mode 100755 keyboards/mechmini/v2/keymaps/lbibass_split_space/rules.mk diff --git a/keyboards/mechmini/v2/keymaps/lbibass_625_space/config.h b/keyboards/mechmini/v2/keymaps/lbibass_625_space/config.h new file mode 100755 index 000000000..7adb68d34 --- /dev/null +++ b/keyboards/mechmini/v2/keymaps/lbibass_625_space/config.h @@ -0,0 +1,4 @@ +#pragma once + +#define ONESHOT_TAP_TOGGLE 3 +#define TAPPING_TERM 200 diff --git a/keyboards/mechmini/v2/keymaps/lbibass_625_space/keymap.c b/keyboards/mechmini/v2/keymaps/lbibass_625_space/keymap.c new file mode 100755 index 000000000..40bfc42de --- /dev/null +++ b/keyboards/mechmini/v2/keymaps/lbibass_625_space/keymap.c @@ -0,0 +1,48 @@ +#include QMK_KEYBOARD_H + +#define _BL 0 +#define _FN1 2 +#define _FN2 3 +#define _WIN 1 +//Tap Dance Declarations +enum +{ + TD_DOTCOM = 0 +}; +//Tap Dance Definitions +qk_tap_dance_action_t tap_dance_actions[] = { + //Tap once for Esc, twice for Caps Lock + [TD_DOTCOM] = ACTION_TAP_DANCE_DOUBLE(KC_COMMA, KC_DOT) + // Other declarations would go here, separated by commas, if you have them +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_BL] = LAYOUT_625_space( + LT(OSL(2), KC_TAB), KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + GUI_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, LT(3, KC_ENT), + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, TD(TD_DOTCOM), OSL(2), OSM(MOD_RSFT), + KC_ESC, KC_LALT, KC_LCTL, KC_SPC, KC_RGUI, RGB_TOG), + [_WIN] = LAYOUT_625_space( + LT(OSL(2), KC_TAB), KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, LT(3, KC_ENT), + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, TD(TD_DOTCOM), OSL(2), OSM(MOD_RSFT), + KC_ESC, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, RGB_TOG), + [_FN1] = LAYOUT_625_space( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, + GUI_T(KC_ESC), KC_PGUP, KC_VOLU, KC_DEL, KC_TRNS, KC_BSLS, KC_LBRC, KC_RBRC, KC_MINS, KC_EQL, KC_TRNS, + KC_LSFT, KC_PGDN, KC_VOLD, BL_STEP, BL_TOGG, KC_SCLN, KC_QUOT, KC_SLSH, KC_DOT, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + [_FN2] = LAYOUT_625_space( + KC_PWR, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, RESET, + MT(KC_LGUI, KC_ESC), KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, TG(1), KC_TRNS, KC_TRNS, KC_F11, KC_F12, KC_TRNS, + KC_TRNS, RGB_TOG, RGB_MOD, RGB_VAI, RGB_VAD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, KC_TRNS, KC_TRNS, + KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +}; + + + + + diff --git a/keyboards/mechmini/v2/keymaps/lbibass_625_space/readme.md b/keyboards/mechmini/v2/keymaps/lbibass_625_space/readme.md new file mode 100644 index 000000000..e09e52013 --- /dev/null +++ b/keyboards/mechmini/v2/keymaps/lbibass_625_space/readme.md @@ -0,0 +1,2 @@ +# /u/Lbibass's 6.25u spacebar Mechmini 2.0 Layout. + diff --git a/keyboards/mechmini/v2/keymaps/lbibass_625_space/rules.mk b/keyboards/mechmini/v2/keymaps/lbibass_625_space/rules.mk new file mode 100755 index 000000000..7bc50168d --- /dev/null +++ b/keyboards/mechmini/v2/keymaps/lbibass_625_space/rules.mk @@ -0,0 +1,11 @@ +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +AUDIO_ENABLE = no +RGBLIGHT_ENABLE = yes +TAP_DANCE_ENABLE = yes diff --git a/keyboards/mechmini/v2/keymaps/lbibass_split_space/config.h b/keyboards/mechmini/v2/keymaps/lbibass_split_space/config.h new file mode 100755 index 000000000..2f3553062 --- /dev/null +++ b/keyboards/mechmini/v2/keymaps/lbibass_split_space/config.h @@ -0,0 +1,4 @@ +#pragma once + +#define ONESHOT_TAP_TOGGLE 3 +#define TAPPING_TERM 200 diff --git a/keyboards/mechmini/v2/keymaps/lbibass_split_space/keymap.c b/keyboards/mechmini/v2/keymaps/lbibass_split_space/keymap.c new file mode 100755 index 000000000..7ad2aa81e --- /dev/null +++ b/keyboards/mechmini/v2/keymaps/lbibass_split_space/keymap.c @@ -0,0 +1,33 @@ +#include QMK_KEYBOARD_H + +#define _BL 0 +#define _FN1 2 +#define _FN2 3 +#define _WIN 1 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_BL] = LAYOUT_split_space( + LT(2, KC_TAB), KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + GUI_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, LT(3, KC_ENT), + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, MO(2), KC_RSHIFT, + KC_ESC, KC_LALT, KC_LCTL, KC_SPC, KC_SPC, KC_RGUI, KC_RALT, RGB_TOG), + [_WIN] = LAYOUT_split_space( + LT(2, KC_TAB), KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, LT(3, KC_ENT), + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, MO(2), KC_RSHIFT, + KC_ESC, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_RALT, KC_LCTL, RGB_TOG), + [_FN1] = LAYOUT_split_space( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, + KC_TRNS, KC_PGUP, KC_VOLU, KC_TRNS, KC_TRNS, KC_BSLS, KC_LBRC, KC_RBRC, KC_MINS, KC_EQL, KC_TRNS, + KC_LSFT, KC_PGDN, KC_VOLD, KC_TRNS, KC_TRNS, KC_SCLN, KC_QUOT, KC_SLSH, KC_DOT, KC_RSHIFT, KC_HOME, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + [_FN2] = LAYOUT_split_space( + KC_PWR, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, RESET, + MT(KC_LGUI, KC_ESC), KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, TG(1), KC_TRNS, KC_TRNS, KC_F11, KC_F12, KC_TRNS, + KC_TRNS, RGB_TOG, RGB_MOD, RGB_VAI, RGB_VAD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, KC_TRNS, KC_END, + KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +}; + diff --git a/keyboards/mechmini/v2/keymaps/lbibass_split_space/readme.md b/keyboards/mechmini/v2/keymaps/lbibass_split_space/readme.md new file mode 100644 index 000000000..34888fbb1 --- /dev/null +++ b/keyboards/mechmini/v2/keymaps/lbibass_split_space/readme.md @@ -0,0 +1,2 @@ +# /u/Lbibass's Split Space Mechmini 2.0 Layout + diff --git a/keyboards/mechmini/v2/keymaps/lbibass_split_space/rules.mk b/keyboards/mechmini/v2/keymaps/lbibass_split_space/rules.mk new file mode 100755 index 000000000..fd3621e84 --- /dev/null +++ b/keyboards/mechmini/v2/keymaps/lbibass_split_space/rules.mk @@ -0,0 +1,11 @@ +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +AUDIO_ENABLE = no +RGBLIGHT_ENABLE = yes +TAP_DANCE_ENABLE = no From fa1ac4d7242a0f3944d71b58926ff2a1ce73c96b Mon Sep 17 00:00:00 2001 From: Phillip Tennen Date: Fri, 26 Oct 2018 15:59:41 +0200 Subject: [PATCH 366/788] Fix incorrect doctoring in feature.backlight.md (#4244) I'm guessing someone deleted a row at some point in the past, but I didn't blame it. --- docs/feature_backlight.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/feature_backlight.md b/docs/feature_backlight.md index 8f883e08f..7bb7e03a8 100644 --- a/docs/feature_backlight.md +++ b/docs/feature_backlight.md @@ -61,7 +61,7 @@ In this handler, the value of an incrementing counter is mapped onto a precomput |`backlight_increase()` |Increase the backlight level | |`backlight_decrease()` |Decrease the backlight level | |`backlight_level(x)` |Sets the backlight level to specified level | -|`get_backlight_level()`|Toggle backlight breathing | +|`get_backlight_level()`|Return the current backlight level | ### Backlight Breathing Functions From 39addf8bc99e6282e655298c2c24da07a5ef77f8 Mon Sep 17 00:00:00 2001 From: noroadsleft Date: Thu, 25 Oct 2018 23:34:40 -0700 Subject: [PATCH 367/788] JD45: layout macro refactor The macro that was LAYOUT prepended KC_ to all the keycode arguments, preventing the Configurator from working with the JD45. This macro is now LAYOUT_kc. The macro LAYOUT is a more-standard macro. Switch identifiers have changed throughout. Format is k. --- keyboards/jd45/jd45.h | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/keyboards/jd45/jd45.h b/keyboards/jd45/jd45.h index 48641c199..105a8acb6 100644 --- a/keyboards/jd45/jd45.h +++ b/keyboards/jd45/jd45.h @@ -6,15 +6,27 @@ /* JD45 keymap definition macro */ #define LAYOUT( \ - K01, K02, K03, K04, K05, K06, K07, K08, K09, K10, K11, K12, K13, \ - K14, K15, K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, \ - K26, K27, K28, K29, K30, K31, K32, K33, K34, K35, K36, K37, \ - K38, K39, K40, K41, K42, K43, K44, K45, K46, K47 \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ + k30, k31, k32, k33, k34, k36, k38, k39, k3a, k3b \ ) { \ - { KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, KC_##K09, KC_##K10, KC_##K11, KC_##K12, KC_##K13 }, \ - { KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, KC_##K19, KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_NO }, \ - { KC_##K26, KC_##K27, KC_##K28, KC_##K29, KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, KC_NO }, \ - { KC_##K38, KC_##K39, KC_##K40, KC_##K41, KC_##K42, KC_NO, KC_##K43, KC_NO, KC_##K44, KC_##K45, KC_##K46, KC_##K47, KC_NO } \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c }, \ + { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, KC_NO }, \ + { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, KC_NO }, \ + { k30, k31, k32, k33, k34, KC_NO, k36, KC_NO, k38, k39, k3a, k3b, KC_NO } \ +} + +#define LAYOUT_kc( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ + k30, k31, k32, k33, k34, k36, k38, k39, k3a, k3b \ +) { \ + { KC_##k00, KC_##k01, KC_##k02, KC_##k03, KC_##k04, KC_##k05, KC_##k06, KC_##k07, KC_##k08, KC_##k09, KC_##k0a, KC_##k0b, KC_##k0c }, \ + { KC_##k10, KC_##k11, KC_##k12, KC_##k13, KC_##k14, KC_##k15, KC_##k16, KC_##k17, KC_##k18, KC_##k19, KC_##k1a, KC_##k1b, KC_NO }, \ + { KC_##k20, KC_##k21, KC_##k22, KC_##k23, KC_##k24, KC_##k25, KC_##k26, KC_##k27, KC_##k28, KC_##k29, KC_##k2a, KC_##k2b, KC_NO }, \ + { KC_##k30, KC_##k31, KC_##k32, KC_##k33, KC_##k34, KC_NO, KC_##k36, KC_NO, KC_##k38, KC_##k39, KC_##k3a, KC_##k3b, KC_NO } \ } #endif From 899731679d262023a9e25eba805b3674b1ceb82e Mon Sep 17 00:00:00 2001 From: noroadsleft Date: Thu, 25 Oct 2018 23:38:45 -0700 Subject: [PATCH 368/788] JD45: blakedietz keymap refactor - config.h - updated to more-preferred format - layout macro LAYOUT_JD45 removed (identical to new macro LAYOUT) - keymap.c - updated to use macro LAYOUT - redundant KC_TRNS and KC_NO definitions removed --- keyboards/jd45/keymaps/blakedietz/config.h | 19 ++----------------- keyboards/jd45/keymaps/blakedietz/keymap.c | 18 +++++++----------- 2 files changed, 9 insertions(+), 28 deletions(-) diff --git a/keyboards/jd45/keymaps/blakedietz/config.h b/keyboards/jd45/keymaps/blakedietz/config.h index 38d850ef6..eb4cf3bdf 100644 --- a/keyboards/jd45/keymaps/blakedietz/config.h +++ b/keyboards/jd45/keymaps/blakedietz/config.h @@ -1,19 +1,4 @@ -#include "../../config.h" - -/** - *JD45 keymap definition macro - */ -#define LAYOUT_JD45( \ - K01, K02, K03, K04, K05, K06, K07, K08, K09, K10, K11, K12, K13, \ - K14, K15, K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, \ - K26, K27, K28, K29, K30, K31, K32, K33, K34, K35, K36, K37, \ - K38, K39, K40, K41, K42, K43, K44, K45, K46, K47 \ -) { \ - { K01, K02, K03, K04, K05, K06, K07, K08, K09, K10, K11, K12, K13 }, \ - { K14, K15, K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, KC_NO }, \ - { K26, K27, K28, K29, K30, K31, K32, K33, K34, K35, K36, K37, KC_NO }, \ - { K38, K39, K40, K41, K42, KC_NO, K43, KC_NO, K44, K45, K46, K47, KC_NO } \ -} +#pragma once /** * This makes it possible to do rolling combos (zx) with keys that convert to other keys on hold (z becomes ctrl when @@ -28,4 +13,4 @@ #define MOUSEKEY_DELAY 0 #define MOUSEKEY_TIME_TO_MAX 5 #define MOUSEKEY_MAX_SPEED 2 -#define MOUSEKEY_WHEEL_DELAY 0 \ No newline at end of file +#define MOUSEKEY_WHEEL_DELAY 0 diff --git a/keyboards/jd45/keymaps/blakedietz/keymap.c b/keyboards/jd45/keymaps/blakedietz/keymap.c index bde760a22..a40a2c604 100644 --- a/keyboards/jd45/keymaps/blakedietz/keymap.c +++ b/keyboards/jd45/keymaps/blakedietz/keymap.c @@ -45,10 +45,6 @@ enum macro_keycodes KC_AG_TAB_R, }; -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO - /** * This section of macros is for tap or hold functionality. Keys will fire off the second symbol in the name if tapped * or fire the first symbol in the name if held. For example @@ -101,7 +97,7 @@ enum macro_keycodes * `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' */ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_QWERTY] = LAYOUT_JD45( + [_QWERTY] = LAYOUT( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, ALL_T(KC_NO), /*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ @@ -124,7 +120,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | Prev | Next | Mute | * `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' */ - [_LOWER] = LAYOUT_JD45( + [_LOWER] = LAYOUT( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ KC_GRV, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, KC_BSPC, /*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ @@ -146,7 +142,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | Prev | Next | Mute | * `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' */ - [_RAISE] = LAYOUT_JD45( + [_RAISE] = LAYOUT( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ KC_TILD, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, KC_BSPC, /*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ @@ -169,7 +165,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' */ - [_MOUSECURSOR] = LAYOUT_JD45( + [_MOUSECURSOR] = LAYOUT( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ _______, _______, _______, KC_MS_U, _______, _______, _______, KC_ACL2, KC_ACL1, KC_ACL0, _______, _______, _______, /*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ @@ -191,7 +187,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | Reset | * `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' */ - [_ADJUST] = LAYOUT_JD45( + [_ADJUST] = LAYOUT( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, @@ -214,7 +210,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | | * `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' */ - [_VIM] = LAYOUT_JD45( + [_VIM] = LAYOUT( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, /*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ @@ -236,7 +232,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | | * `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' */ - [_MEDIA] = LAYOUT_JD45( + [_MEDIA] = LAYOUT( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, /*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ From 340dd097580f27d9f8ffaad78371869d883220d1 Mon Sep 17 00:00:00 2001 From: noroadsleft Date: Thu, 25 Oct 2018 23:40:12 -0700 Subject: [PATCH 369/788] JD45: default keymap refactor Default keymap refactored to use new macro LAYOUT (from LAYOUT_kc). --- keyboards/jd45/keymaps/default/keymap.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/keyboards/jd45/keymaps/default/keymap.c b/keyboards/jd45/keymaps/default/keymap.c index 0bb519f5f..61e051a36 100644 --- a/keyboards/jd45/keymaps/default/keymap.c +++ b/keyboards/jd45/keymaps/default/keymap.c @@ -5,13 +5,10 @@ */ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = LAYOUT( - ESC, Q, W, E, R, T, Y, U, I, O, P, QUOT, BSPC, - TAB, A, S, D, F, G, H, J, K, L, SCLN, ENT, - LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, RSFT, - PAUSE, LCTL, LALT, DEL, SPC, DEL, LEFT, UP, DOWN, RIGHT), -}; - -const uint16_t PROGMEM fn_actions[] = { - + [0] = LAYOUT( + KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_QUOT, KC_BSPC, + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_PAUS, KC_LCTL, KC_LALT, KC_DEL, KC_SPC, KC_DEL, KC_LEFT, KC_UP, KC_DOWN, KC_RGHT + ), }; From 8cf15bffa0693caa99d1b9ddc5c6ecc0936f2605 Mon Sep 17 00:00:00 2001 From: noroadsleft Date: Thu, 25 Oct 2018 23:45:14 -0700 Subject: [PATCH 370/788] JD45: jeebak keymap refactor - config.h deleted (file was redundant) - layout macro LAYOUT_JD45 removed (identical to new macro LAYOUT) - ../../config.h include line redundant due to past changes to build script - keymap.c - updated to use macro LAYOUT - redundant KC_TRNS and KC_NO definitions removed --- keyboards/jd45/keymaps/jeebak/config.h | 16 ---------------- keyboards/jd45/keymaps/jeebak/keymap.c | 22 +++++++++------------- 2 files changed, 9 insertions(+), 29 deletions(-) delete mode 100644 keyboards/jd45/keymaps/jeebak/config.h diff --git a/keyboards/jd45/keymaps/jeebak/config.h b/keyboards/jd45/keymaps/jeebak/config.h deleted file mode 100644 index bfaa12893..000000000 --- a/keyboards/jd45/keymaps/jeebak/config.h +++ /dev/null @@ -1,16 +0,0 @@ -#include "../../config.h" - -/** - *JD45 keymap definition macro - */ -#define LAYOUT_JD45( \ - K01, K02, K03, K04, K05, K06, K07, K08, K09, K10, K11, K12, K13, \ - K14, K15, K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, \ - K26, K27, K28, K29, K30, K31, K32, K33, K34, K35, K36, K37, \ - K38, K39, K40, K41, K42, K43, K44, K45, K46, K47 \ -) { \ - { K01, K02, K03, K04, K05, K06, K07, K08, K09, K10, K11, K12, K13 }, \ - { K14, K15, K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, KC_NO }, \ - { K26, K27, K28, K29, K30, K31, K32, K33, K34, K35, K36, K37, KC_NO }, \ - { K38, K39, K40, K41, K42, KC_NO, K43, KC_NO, K44, K45, K46, K47, KC_NO } \ -} diff --git a/keyboards/jd45/keymaps/jeebak/keymap.c b/keyboards/jd45/keymaps/jeebak/keymap.c index c711939fc..bb6c82938 100644 --- a/keyboards/jd45/keymaps/jeebak/keymap.c +++ b/keyboards/jd45/keymaps/jeebak/keymap.c @@ -48,10 +48,6 @@ enum macro_keycodes KC_AG_TAB_R, }; -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO - // Custom macros #define CTL_ESC CTL_T(KC_ESC) // Tap for Esc, hold for Ctrl #define SFT_ENT SFT_T(KC_ENT) // Tap for Enter, hold for Shift @@ -91,7 +87,7 @@ enum macro_keycodes */ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_QWERTY] = LAYOUT_JD45( + [_QWERTY] = LAYOUT( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ HPR_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, KC_BSPC, /*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ @@ -113,7 +109,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | RGUI | Alt | GUI | Lower | TC/Space | TC/Space | Raise | Vol- | Vol+ | Play | * `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' */ - [_COLEMAK] = LAYOUT_JD45( + [_COLEMAK] = LAYOUT( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ HPR_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, KC_BSPC, /*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ @@ -135,7 +131,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | RGUI | Alt | GUI | Lower | TC/Space | TC/Space | Raise | Vol- | Vol+ | Play | * `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' */ - [_DVORAK] = LAYOUT_JD45( + [_DVORAK] = LAYOUT( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ HPR_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, KC_BSPC, /*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ @@ -157,7 +153,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Brite | | | | | | | Prev | Next | Mute | * `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' */ - [_LOWER] = LAYOUT_JD45( + [_LOWER] = LAYOUT( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, KC_BSPC, /*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ @@ -179,7 +175,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Brite | | | | | | | Prev | Next | Mute | * `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' */ - [_RAISE] = LAYOUT_JD45( + [_RAISE] = LAYOUT( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ KC_0, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, KC_BSPC, /*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ @@ -205,7 +201,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * seem to work on Mac. Presumably they'll work under Windows. */ - [_TOUCHCURSOR] = LAYOUT_JD45( + [_TOUCHCURSOR] = LAYOUT( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ ALT_TAB, CMD_TAB, CTL_TAB, KC_LGUI, KC_LSFT, KC_TILD, KC_INS, KC_HOME, KC_UP, KC_END, KC_BSPC, _______, _______, /*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ @@ -228,7 +224,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' */ - [_MOUSECURSOR] = LAYOUT_JD45( + [_MOUSECURSOR] = LAYOUT( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ _______, _______, KC_ACL0, _______, _______, _______, _______, KC_WH_L, KC_MS_U, KC_WH_R, KC_BTN2, _______, _______, /*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ @@ -251,7 +247,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' */ - [_PLOVER] = LAYOUT_JD45( + [_PLOVER] = LAYOUT( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, /*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ @@ -273,7 +269,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | Reset | * `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' */ - [_ADJUST] = LAYOUT_JD45( + [_ADJUST] = LAYOUT( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, /*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ From 357c1bb657cfa2c65c73b8b12929725db2465bf4 Mon Sep 17 00:00:00 2001 From: noroadsleft Date: Thu, 25 Oct 2018 23:58:20 -0700 Subject: [PATCH 371/788] JD45: justin keymap refactor Updated parallel to LAYOUT_kc macro rename. --- keyboards/jd45/keymaps/justin/keymap.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/keyboards/jd45/keymaps/justin/keymap.c b/keyboards/jd45/keymaps/justin/keymap.c index a797582b0..4590374e9 100644 --- a/keyboards/jd45/keymaps/justin/keymap.c +++ b/keyboards/jd45/keymaps/justin/keymap.c @@ -1,27 +1,27 @@ #include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = LAYOUT( + [0] = LAYOUT_kc( ESC, Q, W, F, P, G, J, L, U, Y, SCLN, QUOT, BSPC, FN8, A, R, S, T, D, H, N, E, I, O, ENT, LSFT, Z, X, C, V, B, K, M, COMM, DOT, SLSH, FN6, FN4, LGUI, FN7, FN2, FN1, SPC, FN5, RALT, FN3, FN0), - [1] = LAYOUT( + [1] = LAYOUT_kc( TRNS, FN10, FN11, FN12, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, UP, DEL, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, HOME, PGUP, LEFT, RGHT, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, END, PGDN, DOWN, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS), - [2] = LAYOUT( + [2] = LAYOUT_kc( TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, 7, 8, 9, 0, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, LBRC, 4, 5, 6, DOT, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, RBRC, 1, 2, 3, BSLS, TRNS, TRNS, FN29, TRNS, TRNS, TRNS, PAUSE, EQL, MINS, TRNS, TRNS), - [3] = LAYOUT( + [3] = LAYOUT_kc( TRNS, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS), - [4] = LAYOUT( + [4] = LAYOUT_kc( TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, 7, 8, 9, 0, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, LBRC, 4, 5, 6, DOT, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, RBRC, 1, 2, 3, BSLS, TRNS, From db8454ca99b58c31ea25954b4ca513d38e5b8c72 Mon Sep 17 00:00:00 2001 From: noroadsleft Date: Thu, 25 Oct 2018 23:59:20 -0700 Subject: [PATCH 372/788] JD45: mjt keymap refactor Updated parallel to LAYOUT_kc macro rename. --- keyboards/jd45/keymaps/mjt/keymap.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/keyboards/jd45/keymaps/mjt/keymap.c b/keyboards/jd45/keymaps/mjt/keymap.c index a53b09642..f806de65d 100644 --- a/keyboards/jd45/keymaps/mjt/keymap.c +++ b/keyboards/jd45/keymaps/mjt/keymap.c @@ -4,23 +4,23 @@ */ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = LAYOUT( + [0] = LAYOUT_kc( TAB, Q, W, E, R, T, Y, U, I, O, P, MINS, BSLS, FN1, A, S, D, F, G, H, J, K, L, QUOT, ENT, FN0, Z, X, C, V, B, N, M, COMM, DOT, SLSH, RSFT, NO, LCTL, LALT, LGUI, SPC, BSPC, APP, FN2, ESC, NO), - [1] = LAYOUT( + [1] = LAYOUT_kc( GRV, TRNS, UP, TRNS, 7, 8, 9, 0, MINS, EQL, PSCR, LBRC, RBRC, TRNS, LEFT, DOWN, RGHT, 4, 5, 6, INS, HOME, PGUP, SCLN, TRNS, TRNS, TRNS, TRNS, TRNS, 1, 2, 3, DEL, END, PGDN, TRNS, TRNS, TRNS, TRNS, TRNS, SPC, TRNS, DEL, TRNS, FN3, TRNS, TRNS), - [2] = LAYOUT( + [2] = LAYOUT_kc( TRNS, TRNS, VOLU, TRNS, F7, F8, F9, F10, F11, F12, PSCR, FN3, FN4, TRNS, MPRV, VOLD, MNXT, F4, F5, F6, J, K, L, SCLN, TRNS, TRNS, TRNS, TRNS, TRNS, F1, F2, F3, MUTE, MPRV, MNXT, MSTP, TRNS, TRNS, TRNS, TRNS, LGUI, TRNS, TRNS, TRNS, TRNS, PAUS, TRNS) /* , -[3] = LAYOUT( +[3] = LAYOUT_kc( TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, BTLD, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, From ca02863b569fb9a3bf21967942567149b562e2be Mon Sep 17 00:00:00 2001 From: noroadsleft Date: Fri, 26 Oct 2018 00:03:00 -0700 Subject: [PATCH 373/788] JD45: mjt6u keymap refactor - config.h - updated to remove redundancies - add #pragma once - keymap.c - updated to use macro LAYOUT - redundant KC_TRNS and KC_NO definitions removed --- keyboards/jd45/keymaps/mjt6u/config.h | 83 +-------------------------- keyboards/jd45/keymaps/mjt6u/keymap.c | 62 +++++++++++++++----- 2 files changed, 50 insertions(+), 95 deletions(-) diff --git a/keyboards/jd45/keymaps/mjt6u/config.h b/keyboards/jd45/keymaps/mjt6u/config.h index bf9dc6df3..41d1557c6 100644 --- a/keyboards/jd45/keymaps/mjt6u/config.h +++ b/keyboards/jd45/keymaps/mjt6u/config.h @@ -1,84 +1,3 @@ -/* -Copyright 2012 Jun Wako - -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 . -*/ - -#ifndef CONFIG_H -#define CONFIG_H - -#include "config_common.h" - -/* USB Device descriptor parameter */ -#define VENDOR_ID 0xFEED -#define PRODUCT_ID 0x6060 -#define DEVICE_VER 0x0001 -#define MANUFACTURER geekhack -#define PRODUCT JD45 -#define DESCRIPTION q.m.k. keyboard firmware for JD45 - -/* key matrix size */ -#define MATRIX_ROWS 4 -#define MATRIX_COLS 13 - -/* Planck PCB default pin-out */ -#define MATRIX_ROW_PINS { F0, F1, F5, B4 } -#define MATRIX_COL_PINS { F4, D7, B5, B6, C6, C7, D4, D6, D5, D0, D1, D2, B0 } -#define UNUSED_PINS - -#define BACKLIGHT_PIN B7 +#pragma once #define USB_MAX_POWER_CONSUMPTION 50 - -/* COL2ROW or ROW2COL */ -#define DIODE_DIRECTION COL2ROW - -/* define if matrix has ghost */ -//#define MATRIX_HAS_GHOST - -/* number of backlight levels */ -#define BACKLIGHT_LEVELS 3 - -/* Set 0 if debouncing isn't needed */ -#define DEBOUNCING_DELAY 5 - -/* 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 - -/* key combination for command */ -#define IS_COMMAND() ( \ - keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ -) - -/* - * 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 - -#endif diff --git a/keyboards/jd45/keymaps/mjt6u/keymap.c b/keyboards/jd45/keymaps/mjt6u/keymap.c index c17a07fd0..4c0b8828a 100644 --- a/keyboards/jd45/keymaps/mjt6u/keymap.c +++ b/keyboards/jd45/keymaps/mjt6u/keymap.c @@ -25,25 +25,61 @@ enum jd45_keycodes #define LONGPRESS_DELAY 150 #define LAYER_TOGGLE_DELAY 900 -#define _______ KC_TRNS #define __MOD__ KC_TRNS -#define XXXXXXX KC_NO #define F_FNSPC F(0) #define F_NUMSPC F(1) #define F_FNTAB F(2) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_QWERTY] = { - {F_FNTAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS, KC_BSPC}, - {CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, LT(_ADJUST, KC_QUOT)}, - {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_ENT)}, - {XXXXXXX, KC_LALT, KC_LGUI, XXXXXXX, XXXXXXX, XXXXXXX, F_FNSPC, XXXXXXX, XXXXXXX, MO(_FUNCTION), MO(_ADJUST)}}, - [_QWERTYNUMMODS] = {{F_FNTAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS, KC_BSPC}, {CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, LT(_ADJUST, KC_QUOT)}, {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_ENT)}, {XXXXXXX, KC_LALT, KC_LGUI, XXXXXXX, XXXXXXX, XXXXXXX, F_NUMSPC, XXXXXXX, XXXXXXX, MO(_FKEYNUMPAD), MO(_ADJUST)}}, - [_NUMSYM] = {{KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, KC_DEL}, {__MOD__, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, _______, _______}, {_______, _______, _______, _______, _______, KC_SPC, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, _______}, {XXXXXXX, __MOD__, __MOD__, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, __MOD__, __MOD__}}, - [_FUNCTION] = {{__MOD__, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12}, {__MOD__, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_VOLU, KC_MNXT, _______, _______}, {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, {XXXXXXX, __MOD__, __MOD__, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, __MOD__, __MOD__}}, - [_NUMPAD] = {{KC_GRV, _______, KC_UP, _______, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_PSCR, KC_LBRC, KC_RBRC}, {_______, KC_LEFT, KC_DOWN, KC_RGHT, KC_4, KC_5, KC_6, KC_INS, KC_HOME, KC_PGUP, _______, _______}, {_______, _______, _______, _______, KC_1, KC_2, KC_3, KC_DEL, KC_END, KC_PGDN, _______, _______}, {XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, __MOD__, __MOD__}}, - [_FKEYNUMPAD] = {{_______, _______, KC_VOLU, _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, _______, _______}, {_______, KC_MPRV, KC_VOLD, KC_MNXT, KC_F4, KC_F5, KC_F6, KC_J, KC_K, KC_L, KC_SCLN, _______}, {_______, _______, _______, _______, KC_F1, KC_F2, KC_F3, KC_MUTE, KC_MPRV, KC_MNXT, KC_MSTP, _______}, {XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, __MOD__, __MOD__}}, - [_ADJUST] = {{_______, RESET, _______, _______, _______, _______, _______, DYN_REC_START1, DYN_REC_START2, _______, KC_PSCR, _______, _______}, {_______, _______, _______, _______, USEFNMODS, _______, _______, DYN_MACRO_PLAY1, DYN_MACRO_PLAY2, MACSLEEP, _______, _______}, {_______, _______, _______, _______, _______, _______, USENUMMODS, _______, _______, _______, _______, _______}, {XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, __MOD__, __MOD__}}}; + [_QWERTY] = LAYOUT( \ + F_FNTAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS, KC_BSPC, \ + CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, LT(_ADJUST, KC_QUOT), \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_ENT), \ + XXXXXXX, KC_LALT, KC_LGUI, XXXXXXX, XXXXXXX, F_FNSPC, XXXXXXX, MO(_FUNCTION), MO(_ADJUST), XXXXXXX \ + ), + + [_QWERTYNUMMODS] = LAYOUT( \ + F_FNTAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS, KC_BSPC, \ + CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, LT(_ADJUST, KC_QUOT), \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_ENT), \ + XXXXXXX, KC_LALT, KC_LGUI, XXXXXXX, XXXXXXX, F_NUMSPC, XXXXXXX, MO(_FKEYNUMPAD), MO(_ADJUST), XXXXXXX \ + ), + + [_NUMSYM] = LAYOUT( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, KC_DEL, \ + __MOD__, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, \ + _______, _______, _______, _______, _______, KC_SPC, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, _______, \ + XXXXXXX, __MOD__, __MOD__, XXXXXXX, XXXXXXX, _______, XXXXXXX, __MOD__, __MOD__, XXXXXXX \ + ), + + [_FUNCTION] = LAYOUT( \ + __MOD__, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ + __MOD__, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_VOLU, KC_MNXT, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + XXXXXXX, __MOD__, __MOD__, XXXXXXX, XXXXXXX, _______, XXXXXXX, __MOD__, __MOD__, XXXXXXX \ + ), + + [_NUMPAD] = LAYOUT( \ + KC_GRV, _______, KC_UP, _______, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_PSCR, KC_LBRC, KC_RBRC, \ + _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_4, KC_5, KC_6, KC_INS, KC_HOME, KC_PGUP, _______, _______, \ + _______, _______, _______, _______, KC_1, KC_2, KC_3, KC_DEL, KC_END, KC_PGDN, _______, _______, \ + XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, _______, XXXXXXX, __MOD__, __MOD__, XXXXXXX \ + ), + + [_FKEYNUMPAD] = LAYOUT( \ + _______, _______, KC_VOLU, _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, _______, _______, \ + _______, KC_MPRV, KC_VOLD, KC_MNXT, KC_F4, KC_F5, KC_F6, KC_J, KC_K, KC_L, KC_SCLN, _______, \ + _______, _______, _______, _______, KC_F1, KC_F2, KC_F3, KC_MUTE, KC_MPRV, KC_MNXT, KC_MSTP, _______, \ + XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, _______, XXXXXXX, __MOD__, __MOD__, XXXXXXX \ + ), + + [_ADJUST] = LAYOUT( \ + _______, RESET, _______, _______, _______, _______, _______, DYN_REC_START1, DYN_REC_START2, _______, KC_PSCR, _______, _______, \ + _______, _______, _______, _______, USEFNMODS, _______, _______, DYN_MACRO_PLAY1, DYN_MACRO_PLAY2, MACSLEEP, _______, _______, \ + _______, _______, _______, _______, _______, _______, USENUMMODS, _______, _______, _______, _______, _______, \ + XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, _______, XXXXXXX, __MOD__, __MOD__, XXXXXXX \ + ) +}; const uint16_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_TAP_KEY(_NUMSYM, KC_SPC), From cc8744548108b1c1f820fb411ac3bf313aca1f5f Mon Sep 17 00:00:00 2001 From: noroadsleft Date: Fri, 26 Oct 2018 00:12:07 -0700 Subject: [PATCH 374/788] JD45: readme update Updated the links to the Docs. --- keyboards/jd45/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/jd45/readme.md b/keyboards/jd45/readme.md index d85a52126..7ef02bd4f 100644 --- a/keyboards/jd45/readme.md +++ b/keyboards/jd45/readme.md @@ -11,4 +11,4 @@ Make example for this keyboard (after setting up your build environment): make jd45:default -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. +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). From e22c3992454ade93ccaef70ab077e79a4b2a5ef0 Mon Sep 17 00:00:00 2001 From: gromwalh <15847180+gromwalh@users.noreply.github.com> Date: Fri, 26 Oct 2018 14:12:40 -0700 Subject: [PATCH 375/788] Ergodox Infinity: Swapped Row and Column in comments (#4247) When comparing the pins in this file to the Ergodox Infinity schematic, it seems that the first section is describing the rows and the second section is describing the columns. --- keyboards/ergodox_infinity/matrix.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/ergodox_infinity/matrix.c b/keyboards/ergodox_infinity/matrix.c index 3baa07f58..3a0a17928 100644 --- a/keyboards/ergodox_infinity/matrix.c +++ b/keyboards/ergodox_infinity/matrix.c @@ -44,14 +44,14 @@ static uint16_t debouncing_time = 0; void matrix_init(void) { - /* Column(sense) */ + /* Row(sense) */ palSetPadMode(GPIOD, 1, PAL_MODE_INPUT_PULLDOWN); palSetPadMode(GPIOD, 4, PAL_MODE_INPUT_PULLDOWN); palSetPadMode(GPIOD, 5, PAL_MODE_INPUT_PULLDOWN); palSetPadMode(GPIOD, 6, PAL_MODE_INPUT_PULLDOWN); palSetPadMode(GPIOD, 7, PAL_MODE_INPUT_PULLDOWN); - /* Row(strobe) */ + /* Column(strobe) */ palSetPadMode(GPIOB, 2, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(GPIOB, 3, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(GPIOB, 18, PAL_MODE_OUTPUT_PUSHPULL); From 85688e5b52112c86895171d3dc8b26610480e932 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Fri, 26 Oct 2018 16:19:23 -0400 Subject: [PATCH 376/788] add support for encoders to core --- common_features.mk | 5 +++ docs/_sidebar.md | 1 + docs/_summary.md | 1 + docs/feature_encoders.md | 41 ++++++++++++++++++++ keyboards/planck/planck.h | 2 + keyboards/planck/rev6/config.h | 4 ++ keyboards/planck/rev6/matrix.c | 29 -------------- keyboards/planck/rev6/rules.mk | 1 + quantum/encoder.c | 70 ++++++++++++++++++++++++++++++++++ quantum/encoder.h | 29 ++++++++++++++ quantum/quantum.c | 12 ++++++ 11 files changed, 166 insertions(+), 29 deletions(-) create mode 100644 docs/feature_encoders.md create mode 100644 quantum/encoder.c create mode 100644 quantum/encoder.h diff --git a/common_features.mk b/common_features.mk index 65ff6b5b3..3fd8361a5 100644 --- a/common_features.mk +++ b/common_features.mk @@ -219,6 +219,11 @@ ifeq ($(strip $(USB_HID_ENABLE)), yes) include $(TMK_DIR)/protocol/usb_hid.mk endif +ifeq ($(strip $(ENCODER_ENABLE)), yes) + SRC += $(QUANTUM_DIR)/encoder.c + OPT_DEFS += -DENCODER_ENABLE +endif + ifeq ($(strip $(HD44780_ENABLE)), yes) SRC += drivers/avr/hd44780.c OPT_DEFS += -DHD44780_ENABLE diff --git a/docs/_sidebar.md b/docs/_sidebar.md index 465f4657c..2c5738012 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -52,6 +52,7 @@ * [Combos](feature_combo) * [Command](feature_command.md) * [Dynamic Macros](feature_dynamic_macros.md) + * [Encoders](feature_encoders.md) * [Grave Escape](feature_grave_esc.md) * [Key Lock](feature_key_lock.md) * [Layouts](feature_layouts.md) diff --git a/docs/_summary.md b/docs/_summary.md index 465f4657c..2c5738012 100644 --- a/docs/_summary.md +++ b/docs/_summary.md @@ -52,6 +52,7 @@ * [Combos](feature_combo) * [Command](feature_command.md) * [Dynamic Macros](feature_dynamic_macros.md) + * [Encoders](feature_encoders.md) * [Grave Escape](feature_grave_esc.md) * [Key Lock](feature_key_lock.md) * [Layouts](feature_layouts.md) diff --git a/docs/feature_encoders.md b/docs/feature_encoders.md new file mode 100644 index 000000000..f482eefec --- /dev/null +++ b/docs/feature_encoders.md @@ -0,0 +1,41 @@ +# Encoders + +Basic encoders are supported by adding this to your `rules.mk`: + + ENCODER_ENABLE = yes + +and this to your `config.h`: + + #define NUMBER_OF_ENCODERS 1 + #define ENCODERS_PAD_A { B12 } + #define ENCODERS_PAD_B { B13 } + +Each PAD_A/B variable defines an array so multiple encoders can be defined, e.g.: + + #define ENCODERS_PAD_A { encoder1a, encoder2a } + #define ENCODERS_PAD_B { encoder1a, encoder2b } + +If your encoder's clockwise directions are incorrect, you can swap the A & B pad definitions. + +Additionally, the resolution can be specified in the same file (the default & suggested is 4): + + #define ENCODER_RESOLUTION 4 + +## Callbacks + +The callback functions can be inserted into your `.c`: + + void encoder_update_kb(uint8_t index, bool clockwise) { + encoder_update_user(index, clockwise); + } + +or `keymap.c`: + + void encoder_update_user(uint8_t index, bool clockwise) { + + } + + +## Hardware + +The A an B lines of the encoders should be wired directly to the MCU, and the C/common lines should be wired to ground. diff --git a/keyboards/planck/planck.h b/keyboards/planck/planck.h index f0a12d933..d908d80ec 100644 --- a/keyboards/planck/planck.h +++ b/keyboards/planck/planck.h @@ -3,6 +3,8 @@ #include "quantum.h" +#define encoder_update(clockwise) encoder_update_user(uint8_t index, clockwise) + #ifdef __AVR__ #define LAYOUT_planck_mit( \ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \ diff --git a/keyboards/planck/rev6/config.h b/keyboards/planck/rev6/config.h index afd69f7d8..c0fbb412e 100644 --- a/keyboards/planck/rev6/config.h +++ b/keyboards/planck/rev6/config.h @@ -43,6 +43,10 @@ * #define UNUSED_PINS */ +#define NUMBER_OF_ENCODERS 1 +#define ENCODERS_PAD_A { B12 } +#define ENCODERS_PAD_B { B13 } + #define MUSIC_MAP #undef AUDIO_VOICES #undef C6_AUDIO diff --git a/keyboards/planck/rev6/matrix.c b/keyboards/planck/rev6/matrix.c index e4ebe48ac..2df588cef 100644 --- a/keyboards/planck/rev6/matrix.c +++ b/keyboards/planck/rev6/matrix.c @@ -21,10 +21,6 @@ static matrix_row_t matrix_debouncing[MATRIX_COLS]; static bool debouncing = false; static uint16_t debouncing_time = 0; -static uint8_t encoder_state = 0; -static int8_t encoder_value = 0; -static int8_t encoder_LUT[] = { 0, -1, 1, 0, 1, 0, 0, -1, -1, 0, 0, 1, 0, 1, -1, 0 }; - static bool dip_switch[4] = {0, 0, 0, 0}; __attribute__ ((weak)) @@ -53,12 +49,6 @@ void matrix_init(void) { palSetPadMode(GPIOA, 10, PAL_MODE_INPUT_PULLUP); palSetPadMode(GPIOB, 9, PAL_MODE_INPUT_PULLUP); - // encoder setup - palSetPadMode(GPIOB, 12, PAL_MODE_INPUT_PULLUP); - palSetPadMode(GPIOB, 13, PAL_MODE_INPUT_PULLUP); - - encoder_state = (palReadPad(GPIOB, 12) << 0) | (palReadPad(GPIOB, 13) << 1); - // actual matrix setup palSetPadMode(GPIOB, 11, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(GPIOB, 10, PAL_MODE_OUTPUT_PUSHPULL); @@ -87,15 +77,8 @@ void matrix_init(void) { __attribute__ ((weak)) void dip_update(uint8_t index, bool active) { } -__attribute__ ((weak)) -void encoder_update(bool clockwise) { } - bool last_dip_switch[4] = {0}; -#ifndef ENCODER_RESOLUTION - #define ENCODER_RESOLUTION 4 -#endif - uint8_t matrix_scan(void) { // dip switch dip_switch[0] = !palReadPad(GPIOB, 14); @@ -108,18 +91,6 @@ uint8_t matrix_scan(void) { } memcpy(last_dip_switch, dip_switch, sizeof(&dip_switch)); - // encoder on B12 and B13 - encoder_state <<= 2; - encoder_state |= (palReadPad(GPIOB, 12) << 0) | (palReadPad(GPIOB, 13) << 1); - encoder_value += encoder_LUT[encoder_state & 0xF]; - if (encoder_value >= ENCODER_RESOLUTION) { - encoder_update(0); - } - if (encoder_value <= -ENCODER_RESOLUTION) { // direction is arbitrary here, but this clockwise - encoder_update(1); - } - encoder_value %= ENCODER_RESOLUTION; - // actual matrix for (int col = 0; col < MATRIX_COLS; col++) { matrix_row_t data = 0; diff --git a/keyboards/planck/rev6/rules.mk b/keyboards/planck/rev6/rules.mk index 3603e287b..dce683a7f 100644 --- a/keyboards/planck/rev6/rules.mk +++ b/keyboards/planck/rev6/rules.mk @@ -54,3 +54,4 @@ CUSTOM_MATRIX = yes # Custom matrix file AUDIO_ENABLE = yes RGBLIGHT_ENABLE = no # SERIAL_LINK_ENABLE = yes +ENCODER_ENABLE = yes diff --git a/quantum/encoder.c b/quantum/encoder.c new file mode 100644 index 000000000..6629a098b --- /dev/null +++ b/quantum/encoder.c @@ -0,0 +1,70 @@ +/* + * Copyright 2018 Jack Humbert + * + * 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 . + */ + +#include "encoder.h" + +#ifndef ENCODER_RESOLUTION + #define ENCODER_RESOLUTION 4 +#endif + +#ifndef NUMBER_OF_ENCODERS + #error "Number of encoders not defined by NUMBER_OF_ENCODERS" +#endif + +#if !defined(ENCODERS_PAD_A) || !defined(ENCODERS_PAD_B) + #error "No encoder pads defined by ENCODERS_PAD_A and ENCODERS_PAD_B" +#endif + +static pin_t encoders_pad_a[NUMBER_OF_ENCODERS] = ENCODERS_PAD_A; +static pin_t encoders_pad_b[NUMBER_OF_ENCODERS] = ENCODERS_PAD_B; + +static int8_t encoder_LUT[] = { 0, -1, 1, 0, 1, 0, 0, -1, -1, 0, 0, 1, 0, 1, -1, 0 }; + +static uint8_t encoder_state[NUMBER_OF_ENCODERS] = {0}; +static int8_t encoder_value[NUMBER_OF_ENCODERS] = {0}; + +__attribute__ ((weak)) +void encoder_update_user(int8_t index, bool clockwise) { } + +__attribute__ ((weak)) +void encoder_update_kb(int8_t index, bool clockwise) { + encoder_update_user(index, clockwise); +} + +void encoder_init(void) { + for (int i = 0; i < NUMBER_OF_ENCODERS; i++) { + setPinInputHigh(encoders_pad_a[i]); + setPinInputHigh(encoders_pad_b[i]); + + encoder_state[i] = (readPin(encoders_pad_a[i]) << 0) | (readPin(encoders_pad_b[i]) << 1); + } +} + +void encoder_read(void) { + for (int i = 0; i < NUMBER_OF_ENCODERS; i++) { + encoder_state[i] <<= 2; + encoder_state[i] |= (readPin(encoders_pad_a[i]) << 0) | (readPin(encoders_pad_b[i]) << 1); + encoder_value[i] += encoder_LUT[encoder_state[i] & 0xF]; + if (encoder_value[i] >= ENCODER_RESOLUTION) { + encoder_update_kb(i, COUNTRECLOCKWISE); + } + if (encoder_value[i] <= -ENCODER_RESOLUTION) { // direction is arbitrary here, but this clockwise + encoder_update_kb(i, CLOCKWISE); + } + encoder_value[i] %= ENCODER_RESOLUTION; + } +} diff --git a/quantum/encoder.h b/quantum/encoder.h new file mode 100644 index 000000000..2024fa303 --- /dev/null +++ b/quantum/encoder.h @@ -0,0 +1,29 @@ +/* + * Copyright 2018 Jack Humbert + * + * 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 . + */ + +#pragma once + +#include "quantum.h" + +#define COUNTRECLOCKWISE 0 +#define CLOCKWISE 1 + +void encoder_init(void); +void encoder_read(void); + +void encoder_update_kb(int8_t index, bool clockwise); +void encoder_update_user(int8_t index, bool clockwise); diff --git a/quantum/quantum.c b/quantum/quantum.c index eed59f811..c9bec6740 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -42,6 +42,11 @@ extern backlight_config_t backlight_config; #include "process_midi.h" #endif + +#ifdef ENCODER_ENABLE +#include "encoder.h" +#endif + #ifdef AUDIO_ENABLE #ifndef GOODBYE_SONG #define GOODBYE_SONG SONG(GOODBYE_SOUND) @@ -957,6 +962,9 @@ void matrix_init_quantum() { #ifdef RGB_MATRIX_ENABLE rgb_matrix_init(); #endif + #ifdef ENCODER_ENABLE + encoder_init(); + #endif matrix_init_kb(); } @@ -991,6 +999,10 @@ void matrix_scan_quantum() { rgb_matrix_task_counter = ((rgb_matrix_task_counter + 1) % (RGB_MATRIX_SKIP_FRAMES + 1)); #endif + #ifdef ENCODER_ENABLE + encoder_read(); + #endif + matrix_scan_kb(); } #if defined(BACKLIGHT_ENABLE) && defined(BACKLIGHT_PIN) From 24b3556e844ec76813a42ce4c5b7a77a6f874d5a Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Fri, 26 Oct 2018 16:47:00 -0400 Subject: [PATCH 377/788] add better example --- docs/feature_encoders.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/docs/feature_encoders.md b/docs/feature_encoders.md index f482eefec..036c6a1d8 100644 --- a/docs/feature_encoders.md +++ b/docs/feature_encoders.md @@ -32,10 +32,17 @@ The callback functions can be inserted into your `.c`: or `keymap.c`: void encoder_update_user(uint8_t index, bool clockwise) { - + if (index == 0) { + if (clockwise) { + register_code(KC_PGDN); + unregister_code(KC_PGDN); + } else { + register_code(KC_PGUP); + unregister_code(KC_PGUP); + } + } } - ## Hardware The A an B lines of the encoders should be wired directly to the MCU, and the C/common lines should be wired to ground. From 6fa3cfbf534b54290f693dc1986437aebd092b32 Mon Sep 17 00:00:00 2001 From: yiancar Date: Sat, 27 Oct 2018 00:14:29 +0100 Subject: [PATCH 378/788] Keyboard: Add HS60 V2 (#4250) * HS60 V2 - Created V1 and V2 folders - Added V2 ARM configuration * Problems in paradise * More touble * We got it now! --- keyboards/hs60/{ => v1}/config.h | 5 +- keyboards/hs60/{ => v1}/info.json | 0 keyboards/hs60/{ => v1}/keymaps/ansi/config.h | 7 +- keyboards/hs60/{ => v1}/keymaps/ansi/keymap.c | 0 .../hs60/{ => v1}/keymaps/ansi/readme.md | 0 .../hs60/{ => v1}/keymaps/default/keymap.c | 0 .../hs60/{ => v1}/keymaps/default/readme.md | 0 keyboards/hs60/{ => v1}/readme.md | 2 +- keyboards/hs60/{ => v1}/rules.mk | 0 keyboards/hs60/{hs60.c => v1/v1.c} | 3 +- keyboards/hs60/{hs60.h => v1/v1.h} | 0 .../v2/boards/GENERIC_STM32_F303XC/board.c | 126 ++ .../v2/boards/GENERIC_STM32_F303XC/board.h | 1187 ++++++++++++ .../v2/boards/GENERIC_STM32_F303XC/board.mk | 5 + keyboards/hs60/v2/bootloader_defs.h | 7 + keyboards/hs60/v2/chconf.h | 520 ++++++ keyboards/hs60/v2/config.h | 117 ++ keyboards/hs60/v2/halconf.h | 388 ++++ keyboards/hs60/v2/info.json | 1650 +++++++++++++++++ keyboards/hs60/v2/keymaps/ansi/config.h | 21 + keyboards/hs60/v2/keymaps/ansi/keymap.c | 46 + keyboards/hs60/v2/keymaps/ansi/readme.md | 6 + keyboards/hs60/v2/keymaps/default/keymap.c | 46 + keyboards/hs60/v2/keymaps/default/readme.md | 6 + keyboards/hs60/v2/keymaps/hhkb/config.h | 21 + keyboards/hs60/v2/keymaps/hhkb/keymap.c | 46 + keyboards/hs60/v2/mcuconf.h | 257 +++ keyboards/hs60/v2/readme.md | 18 + keyboards/hs60/v2/rules.mk | 58 + keyboards/hs60/v2/v2.c | 635 +++++++ keyboards/hs60/v2/v2.h | 67 + 31 files changed, 5231 insertions(+), 13 deletions(-) rename keyboards/hs60/{ => v1}/config.h (99%) rename keyboards/hs60/{ => v1}/info.json (100%) rename keyboards/hs60/{ => v1}/keymaps/ansi/config.h (90%) rename keyboards/hs60/{ => v1}/keymaps/ansi/keymap.c (100%) rename keyboards/hs60/{ => v1}/keymaps/ansi/readme.md (100%) rename keyboards/hs60/{ => v1}/keymaps/default/keymap.c (100%) rename keyboards/hs60/{ => v1}/keymaps/default/readme.md (100%) rename keyboards/hs60/{ => v1}/readme.md (96%) rename keyboards/hs60/{ => v1}/rules.mk (100%) rename keyboards/hs60/{hs60.c => v1/v1.c} (99%) rename keyboards/hs60/{hs60.h => v1/v1.h} (100%) create mode 100644 keyboards/hs60/v2/boards/GENERIC_STM32_F303XC/board.c create mode 100644 keyboards/hs60/v2/boards/GENERIC_STM32_F303XC/board.h create mode 100644 keyboards/hs60/v2/boards/GENERIC_STM32_F303XC/board.mk create mode 100644 keyboards/hs60/v2/bootloader_defs.h create mode 100644 keyboards/hs60/v2/chconf.h create mode 100644 keyboards/hs60/v2/config.h create mode 100644 keyboards/hs60/v2/halconf.h create mode 100644 keyboards/hs60/v2/info.json create mode 100644 keyboards/hs60/v2/keymaps/ansi/config.h create mode 100644 keyboards/hs60/v2/keymaps/ansi/keymap.c create mode 100644 keyboards/hs60/v2/keymaps/ansi/readme.md create mode 100644 keyboards/hs60/v2/keymaps/default/keymap.c create mode 100644 keyboards/hs60/v2/keymaps/default/readme.md create mode 100644 keyboards/hs60/v2/keymaps/hhkb/config.h create mode 100644 keyboards/hs60/v2/keymaps/hhkb/keymap.c create mode 100644 keyboards/hs60/v2/mcuconf.h create mode 100644 keyboards/hs60/v2/readme.md create mode 100644 keyboards/hs60/v2/rules.mk create mode 100644 keyboards/hs60/v2/v2.c create mode 100644 keyboards/hs60/v2/v2.h diff --git a/keyboards/hs60/config.h b/keyboards/hs60/v1/config.h similarity index 99% rename from keyboards/hs60/config.h rename to keyboards/hs60/v1/config.h index 31f7c0790..c297a6e19 100644 --- a/keyboards/hs60/config.h +++ b/keyboards/hs60/v1/config.h @@ -15,8 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef CONFIG_H -#define CONFIG_H +#pragma once #include "config_common.h" @@ -142,5 +141,3 @@ along with this program. If not, see . #endif #define DRIVER_LED_TOTAL DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL - -#endif diff --git a/keyboards/hs60/info.json b/keyboards/hs60/v1/info.json similarity index 100% rename from keyboards/hs60/info.json rename to keyboards/hs60/v1/info.json diff --git a/keyboards/hs60/keymaps/ansi/config.h b/keyboards/hs60/v1/keymaps/ansi/config.h similarity index 90% rename from keyboards/hs60/keymaps/ansi/config.h rename to keyboards/hs60/v1/keymaps/ansi/config.h index bab67fd55..f51cc16d8 100644 --- a/keyboards/hs60/keymaps/ansi/config.h +++ b/keyboards/hs60/v1/keymaps/ansi/config.h @@ -14,13 +14,8 @@ 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 . */ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" +#pragma once /* Include overwrites for specific keymap */ #define HS60_ANSI - -#endif \ No newline at end of file diff --git a/keyboards/hs60/keymaps/ansi/keymap.c b/keyboards/hs60/v1/keymaps/ansi/keymap.c similarity index 100% rename from keyboards/hs60/keymaps/ansi/keymap.c rename to keyboards/hs60/v1/keymaps/ansi/keymap.c diff --git a/keyboards/hs60/keymaps/ansi/readme.md b/keyboards/hs60/v1/keymaps/ansi/readme.md similarity index 100% rename from keyboards/hs60/keymaps/ansi/readme.md rename to keyboards/hs60/v1/keymaps/ansi/readme.md diff --git a/keyboards/hs60/keymaps/default/keymap.c b/keyboards/hs60/v1/keymaps/default/keymap.c similarity index 100% rename from keyboards/hs60/keymaps/default/keymap.c rename to keyboards/hs60/v1/keymaps/default/keymap.c diff --git a/keyboards/hs60/keymaps/default/readme.md b/keyboards/hs60/v1/keymaps/default/readme.md similarity index 100% rename from keyboards/hs60/keymaps/default/readme.md rename to keyboards/hs60/v1/keymaps/default/readme.md diff --git a/keyboards/hs60/readme.md b/keyboards/hs60/v1/readme.md similarity index 96% rename from keyboards/hs60/readme.md rename to keyboards/hs60/v1/readme.md index 939b58828..a77bbc25c 100644 --- a/keyboards/hs60/readme.md +++ b/keyboards/hs60/v1/readme.md @@ -13,6 +13,6 @@ Due to the RGB implementation, the HS60 is currently not compatible with communi Make example for this keyboard (after setting up your build environment): - make hs60:default + make hs60/v1:default See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. diff --git a/keyboards/hs60/rules.mk b/keyboards/hs60/v1/rules.mk similarity index 100% rename from keyboards/hs60/rules.mk rename to keyboards/hs60/v1/rules.mk diff --git a/keyboards/hs60/hs60.c b/keyboards/hs60/v1/v1.c similarity index 99% rename from keyboards/hs60/hs60.c rename to keyboards/hs60/v1/v1.c index 169f84b02..882611030 100644 --- a/keyboards/hs60/hs60.c +++ b/keyboards/hs60/v1/v1.c @@ -13,8 +13,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#include "hs60.h" -#include "config.h" +#include "v1.h" // Please ignore this is for upcoming features /*#ifdef RAW_ENABLE diff --git a/keyboards/hs60/hs60.h b/keyboards/hs60/v1/v1.h similarity index 100% rename from keyboards/hs60/hs60.h rename to keyboards/hs60/v1/v1.h diff --git a/keyboards/hs60/v2/boards/GENERIC_STM32_F303XC/board.c b/keyboards/hs60/v2/boards/GENERIC_STM32_F303XC/board.c new file mode 100644 index 000000000..4331155df --- /dev/null +++ b/keyboards/hs60/v2/boards/GENERIC_STM32_F303XC/board.c @@ -0,0 +1,126 @@ +/* + ChibiOS - Copyright (C) 2006..2016 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. +*/ + +#include "hal.h" + +#if HAL_USE_PAL || defined(__DOXYGEN__) +/** + * @brief PAL setup. + * @details Digital I/O ports static configuration as defined in @p board.h. + * This variable is used by the HAL when initializing the PAL driver. + */ +const PALConfig pal_default_config = { +#if STM32_HAS_GPIOA + {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, + VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, +#endif +#if STM32_HAS_GPIOB + {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, + VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, +#endif +#if STM32_HAS_GPIOC + {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, + VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, +#endif +#if STM32_HAS_GPIOD + {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, + VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, +#endif +#if STM32_HAS_GPIOE + {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, + VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, +#endif +#if STM32_HAS_GPIOF + {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, + VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH}, +#endif +#if STM32_HAS_GPIOG + {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, + VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH}, +#endif +#if STM32_HAS_GPIOH + {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, + VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH}, +#endif +#if STM32_HAS_GPIOI + {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, + VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH} +#endif +}; +#endif + +void enter_bootloader_mode_if_requested(void); + +/** + * @brief Early initialization code. + * @details This initialization must be performed just after stack setup + * and before any other initialization. + */ +void __early_init(void) { + enter_bootloader_mode_if_requested(); + stm32_clock_init(); +} + +#if HAL_USE_SDC || defined(__DOXYGEN__) +/** + * @brief SDC card detection. + */ +bool sdc_lld_is_card_inserted(SDCDriver *sdcp) { + + (void)sdcp; + /* TODO: Fill the implementation.*/ + return true; +} + +/** + * @brief SDC card write protection detection. + */ +bool sdc_lld_is_write_protected(SDCDriver *sdcp) { + + (void)sdcp; + /* TODO: Fill the implementation.*/ + return false; +} +#endif /* HAL_USE_SDC */ + +#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) +/** + * @brief MMC_SPI card detection. + */ +bool mmc_lld_is_card_inserted(MMCDriver *mmcp) { + + (void)mmcp; + /* TODO: Fill the implementation.*/ + return true; +} + +/** + * @brief MMC_SPI card write protection detection. + */ +bool mmc_lld_is_write_protected(MMCDriver *mmcp) { + + (void)mmcp; + /* TODO: Fill the implementation.*/ + return false; +} +#endif + +/** + * @brief Board-specific initialization code. + * @todo Add your board-specific code, if any. + */ +void boardInit(void) { +} diff --git a/keyboards/hs60/v2/boards/GENERIC_STM32_F303XC/board.h b/keyboards/hs60/v2/boards/GENERIC_STM32_F303XC/board.h new file mode 100644 index 000000000..fb7283add --- /dev/null +++ b/keyboards/hs60/v2/boards/GENERIC_STM32_F303XC/board.h @@ -0,0 +1,1187 @@ +/* + ChibiOS - Copyright (C) 2006..2016 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 _BOARD_H_ +#define _BOARD_H_ + +/* + * Setup for Clueboard 60% Keyboard + */ + +/* + * Board identifier. + */ +#define BOARD_GENERIC_STM32_F303XC +#define BOARD_NAME "HS60 V2.0 PCB" + +/* + * Board oscillators-related settings. + * NOTE: LSE not fitted. + */ +#if !defined(STM32_LSECLK) +#define STM32_LSECLK 0U +#endif + +#define STM32_LSEDRV (3U << 3U) + +#if !defined(STM32_HSECLK) +#define STM32_HSECLK 8000000U +#endif + +// #define STM32_HSE_BYPASS + +/* + * MCU type as defined in the ST header. + */ +#define STM32F303xC + +/* + * IO pins assignments. + */ +#define GPIOA_PIN0 0U +#define GPIOA_PIN1 1U +#define GPIOA_PIN2 2U +#define GPIOA_PIN3 3U +#define GPIOA_PIN4 4U +#define GPIOA_PIN5 5U +#define GPIOA_PIN6 6U +#define GPIOA_PIN7 7U +#define GPIOA_PIN8 8U +#define GPIOA_PIN9 9U +#define GPIOA_PIN10 10U +#define GPIOA_USB_DM 11U +#define GPIOA_USB_DP 12U +#define GPIOA_SWDIO 13U +#define GPIOA_SWCLK 14U +#define GPIOA_PIN15 15U + +#define GPIOB_PIN0 0U +#define GPIOB_PIN1 1U +#define GPIOB_PIN2 2U +#define GPIOB_PIN3 3U +#define GPIOB_PIN4 4U +#define GPIOB_PIN5 5U +#define GPIOB_PIN6 6U +#define GPIOB_PIN7 7U +#define GPIOB_PIN8 8U +#define GPIOB_PIN9 9U +#define GPIOB_PIN10 10U +#define GPIOB_PIN11 11U +#define GPIOB_PIN12 12U +#define GPIOB_PIN13 13U +#define GPIOB_PIN14 14U +#define GPIOB_PIN15 15U + +#define GPIOC_PIN0 0U +#define GPIOC_PIN1 1U +#define GPIOC_PIN2 2U +#define GPIOC_PIN3 3U +#define GPIOC_PIN4 4U +#define GPIOC_PIN5 5U +#define GPIOC_PIN6 6U +#define GPIOC_PIN7 7U +#define GPIOC_PIN8 8U +#define GPIOC_PIN9 9U +#define GPIOC_PIN10 10U +#define GPIOC_PIN11 11U +#define GPIOC_PIN12 12U +#define GPIOC_PIN13 13U +#define GPIOC_PIN14 14U +#define GPIOC_PIN15 15U + +#define GPIOD_PIN0 0U +#define GPIOD_PIN1 1U +#define GPIOD_PIN2 2U +#define GPIOD_PIN3 3U +#define GPIOD_PIN4 4U +#define GPIOD_PIN5 5U +#define GPIOD_PIN6 6U +#define GPIOD_PIN7 7U +#define GPIOD_PIN8 8U +#define GPIOD_PIN9 9U +#define GPIOD_PIN10 10U +#define GPIOD_PIN11 11U +#define GPIOD_PIN12 12U +#define GPIOD_PIN13 13U +#define GPIOD_PIN14 14U +#define GPIOD_PIN15 15U + +#define GPIOE_PIN0 0U +#define GPIOE_PIN1 1U +#define GPIOE_PIN2 2U +#define GPIOE_PIN3 3U +#define GPIOE_PIN4 4U +#define GPIOE_PIN5 5U +#define GPIOE_PIN6 6U +#define GPIOE_PIN7 7U +#define GPIOE_PIN8 8U +#define GPIOE_PIN9 9U +#define GPIOE_PIN10 10U +#define GPIOE_PIN11 11U +#define GPIOE_PIN12 12U +#define GPIOE_PIN13 13U +#define GPIOE_PIN14 14U +#define GPIOE_PIN15 15U + +#define GPIOF_I2C2_SDA 0U +#define GPIOF_I2C2_SCL 1U +#define GPIOF_PIN2 2U +#define GPIOF_PIN3 3U +#define GPIOF_PIN4 4U +#define GPIOF_PIN5 5U +#define GPIOF_PIN6 6U +#define GPIOF_PIN7 7U +#define GPIOF_PIN8 8U +#define GPIOF_PIN9 9U +#define GPIOF_PIN10 10U +#define GPIOF_PIN11 11U +#define GPIOF_PIN12 12U +#define GPIOF_PIN13 13U +#define GPIOF_PIN14 14U +#define GPIOF_PIN15 15U + +#define GPIOG_PIN0 0U +#define GPIOG_PIN1 1U +#define GPIOG_PIN2 2U +#define GPIOG_PIN3 3U +#define GPIOG_PIN4 4U +#define GPIOG_PIN5 5U +#define GPIOG_PIN6 6U +#define GPIOG_PIN7 7U +#define GPIOG_PIN8 8U +#define GPIOG_PIN9 9U +#define GPIOG_PIN10 10U +#define GPIOG_PIN11 11U +#define GPIOG_PIN12 12U +#define GPIOG_PIN13 13U +#define GPIOG_PIN14 14U +#define GPIOG_PIN15 15U + +#define GPIOH_PIN0 0U +#define GPIOH_PIN1 1U +#define GPIOH_PIN2 2U +#define GPIOH_PIN3 3U +#define GPIOH_PIN4 4U +#define GPIOH_PIN5 5U +#define GPIOH_PIN6 6U +#define GPIOH_PIN7 7U +#define GPIOH_PIN8 8U +#define GPIOH_PIN9 9U +#define GPIOH_PIN10 10U +#define GPIOH_PIN11 11U +#define GPIOH_PIN12 12U +#define GPIOH_PIN13 13U +#define GPIOH_PIN14 14U +#define GPIOH_PIN15 15U + +/* + * IO lines assignments. + */ +#define LINE_L3GD20_SDI PAL_LINE(GPIOA, 7U) +#define LINE_USB_DM PAL_LINE(GPIOA, 11U) +#define LINE_USB_DP PAL_LINE(GPIOA, 12U) +#define LINE_SWDIO PAL_LINE(GPIOA, 13U) +#define LINE_SWCLK PAL_LINE(GPIOA, 14U) + +#define LINE_PIN6 PAL_LINE(GPIOF, 0U) +#define LINE_PIN7 PAL_LINE(GPIOF, 1U) + +#define LINE_CAPS_LOCK PAL_LINE(GPIOB, 7U) + + +/* + * I/O ports initial setup, this configuration is established soon after reset + * in the initialization code. + * Please refer to the STM32 Reference Manual for details. + */ +#define PIN_MODE_INPUT(n) (0U << ((n) * 2U)) +#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U)) +#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U)) +#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U)) +#define PIN_ODR_LOW(n) (0U << (n)) +#define PIN_ODR_HIGH(n) (1U << (n)) +#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) +#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) +#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U)) +#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U)) +#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U)) +#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U)) +#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U)) +#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U)) +#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U)) +#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U)) + +/* + * GPIOA setup: + * + * PA0 - NC + * PA1 - NC + * PA2 - COL1 + * PA3 - COL2 + * PA4 - SPEAKER1 + * PA5 - SPEAKER2 + * PA6 - COL3 + * PA7 - COL8 + * PA8 - COL6 + * PA9 - COL7 + * PA10 - ROW5 + * PA11 - USB_DM (alternate 14). + * PA12 - USB_DP (alternate 14). + * PA13 - SWDIO (alternate 0). + * PA14 - SWCLK (alternate 0). + * PA15 - ROW4 + */ +#define VAL_GPIOA_MODER (PIN_MODE_INPUT(GPIOA_PIN0) | \ + PIN_MODE_ALTERNATE(GPIOA_PIN1) | \ + PIN_MODE_INPUT(GPIOA_PIN2) | \ + PIN_MODE_INPUT(GPIOA_PIN3) | \ + PIN_MODE_INPUT(GPIOA_PIN4) | \ + PIN_MODE_INPUT(GPIOA_PIN5) | \ + PIN_MODE_INPUT(GPIOA_PIN6) | \ + PIN_MODE_INPUT(GPIOA_PIN7) | \ + PIN_MODE_INPUT(GPIOA_PIN8) | \ + PIN_MODE_INPUT(GPIOA_PIN9) | \ + PIN_MODE_INPUT(GPIOA_PIN10) | \ + PIN_MODE_ALTERNATE(GPIOA_USB_DM) | \ + PIN_MODE_ALTERNATE(GPIOA_USB_DP) | \ + PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \ + PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \ + PIN_MODE_INPUT(GPIOA_PIN15)) +#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOA_USB_DM) | \ + PIN_OTYPE_PUSHPULL(GPIOA_USB_DP) | \ + PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | \ + PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN15)) +#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOA_PIN0) | \ + PIN_OSPEED_HIGH(GPIOA_PIN1) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN10) | \ + PIN_OSPEED_HIGH(GPIOA_USB_DM) | \ + PIN_OSPEED_VERYLOW(GPIOA_USB_DP) | \ + PIN_OSPEED_HIGH(GPIOA_SWDIO) | \ + PIN_OSPEED_HIGH(GPIOA_SWCLK) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN15)) +#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_PIN0) | \ + PIN_PUPDR_FLOATING(GPIOA_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN6) | \ + PIN_PUPDR_FLOATING(GPIOA_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN10) | \ + PIN_PUPDR_FLOATING(GPIOA_USB_DM) | \ + PIN_PUPDR_FLOATING(GPIOA_USB_DP) | \ + PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \ + PIN_PUPDR_PULLDOWN(GPIOA_SWCLK) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN15)) +#define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_PIN0) | \ + PIN_ODR_HIGH(GPIOA_PIN1) | \ + PIN_ODR_HIGH(GPIOA_PIN2) | \ + PIN_ODR_HIGH(GPIOA_PIN3) | \ + PIN_ODR_HIGH(GPIOA_PIN4) | \ + PIN_ODR_HIGH(GPIOA_PIN5) | \ + PIN_ODR_HIGH(GPIOA_PIN6) | \ + PIN_ODR_HIGH(GPIOA_PIN7) | \ + PIN_ODR_HIGH(GPIOA_PIN8) | \ + PIN_ODR_HIGH(GPIOA_PIN9) | \ + PIN_ODR_HIGH(GPIOA_PIN10) | \ + PIN_ODR_HIGH(GPIOA_USB_DM) | \ + PIN_ODR_HIGH(GPIOA_USB_DP) | \ + PIN_ODR_HIGH(GPIOA_SWDIO) | \ + PIN_ODR_HIGH(GPIOA_SWCLK) | \ + PIN_ODR_HIGH(GPIOA_PIN15)) +#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_PIN0, 0) | \ + PIN_AFIO_AF(GPIOA_PIN1, 1) | \ + PIN_AFIO_AF(GPIOA_PIN2, 0) | \ + PIN_AFIO_AF(GPIOA_PIN3, 0) | \ + PIN_AFIO_AF(GPIOA_PIN4, 0) | \ + PIN_AFIO_AF(GPIOA_PIN5, 5) | \ + PIN_AFIO_AF(GPIOA_PIN6, 5) | \ + PIN_AFIO_AF(GPIOA_PIN7, 5)) +#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_PIN8, 0) | \ + PIN_AFIO_AF(GPIOA_PIN9, 0) | \ + PIN_AFIO_AF(GPIOA_PIN10, 0) | \ + PIN_AFIO_AF(GPIOA_USB_DM, 14) | \ + PIN_AFIO_AF(GPIOA_USB_DP, 14) | \ + PIN_AFIO_AF(GPIOA_SWDIO, 0) | \ + PIN_AFIO_AF(GPIOA_SWCLK, 0) | \ + PIN_AFIO_AF(GPIOA_PIN15, 0)) + +/* + * GPIOB setup: + * + * PB0 - PIN0 (input pullup). + * PB1 - PIN1 (input pullup). + * PB2 - PIN2 (input pullup). + * PB3 - PIN3 (alternate 0). + * PB4 - PIN4 (input pullup). + * PB5 - PIN5 (input pullup). + * PB6 - PIN6 LSM303DLHC_SCL (alternate 4). + * PB7 - PIN7 LSM303DLHC_SDA (alternate 4). + * PB8 - PIN8 (input pullup). + * PB9 - PIN9 (input pullup). + * PB10 - PIN10 (input pullup). + * PB11 - PIN11 (input pullup). + * PB12 - PIN12 (input pullup). + * PB13 - PIN13 (input pullup). + * PB14 - PIN14 (input pullup). + * PB15 - PIN15 (input pullup). + */ +#define VAL_GPIOB_MODER (PIN_MODE_INPUT(GPIOB_PIN0) | \ + PIN_MODE_INPUT(GPIOB_PIN1) | \ + PIN_MODE_INPUT(GPIOB_PIN2) | \ + PIN_MODE_ALTERNATE(GPIOB_PIN3) | \ + PIN_MODE_INPUT(GPIOB_PIN4) | \ + PIN_MODE_INPUT(GPIOB_PIN5) | \ + PIN_MODE_ALTERNATE(GPIOB_PIN6) | \ + PIN_MODE_OUTPUT(GPIOB_PIN7) | \ + PIN_MODE_INPUT(GPIOB_PIN8) | \ + PIN_MODE_INPUT(GPIOB_PIN9) | \ + PIN_MODE_INPUT(GPIOB_PIN10) | \ + PIN_MODE_INPUT(GPIOB_PIN11) | \ + PIN_MODE_INPUT(GPIOB_PIN12) | \ + PIN_MODE_INPUT(GPIOB_PIN13) | \ + PIN_MODE_INPUT(GPIOB_PIN14) | \ + PIN_MODE_INPUT(GPIOB_PIN15)) +#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN5) | \ + PIN_OTYPE_OPENDRAIN(GPIOB_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN15)) +#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOB_PIN0) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN1) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN2) | \ + PIN_OSPEED_HIGH(GPIOB_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN5) | \ + PIN_OSPEED_HIGH(GPIOB_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN10) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN11) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN12) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN13) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN14) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN15)) +#define VAL_GPIOB_PUPDR (PIN_PUPDR_PULLUP(GPIOB_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN2) | \ + PIN_PUPDR_FLOATING(GPIOB_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN5) | \ + PIN_PUPDR_FLOATING(GPIOB_PIN6) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN15)) +#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_PIN0) | \ + PIN_ODR_HIGH(GPIOB_PIN1) | \ + PIN_ODR_HIGH(GPIOB_PIN2) | \ + PIN_ODR_HIGH(GPIOB_PIN3) | \ + PIN_ODR_HIGH(GPIOB_PIN4) | \ + PIN_ODR_HIGH(GPIOB_PIN5) | \ + PIN_ODR_HIGH(GPIOB_PIN6) | \ + PIN_ODR_LOW(GPIOB_PIN7) | \ + PIN_ODR_HIGH(GPIOB_PIN8) | \ + PIN_ODR_HIGH(GPIOB_PIN9) | \ + PIN_ODR_HIGH(GPIOB_PIN10) | \ + PIN_ODR_HIGH(GPIOB_PIN11) | \ + PIN_ODR_HIGH(GPIOB_PIN12) | \ + PIN_ODR_HIGH(GPIOB_PIN13) | \ + PIN_ODR_HIGH(GPIOB_PIN14) | \ + PIN_ODR_HIGH(GPIOB_PIN15)) +#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0) | \ + PIN_AFIO_AF(GPIOB_PIN1, 0) | \ + PIN_AFIO_AF(GPIOB_PIN2, 0) | \ + PIN_AFIO_AF(GPIOB_PIN3, 0) | \ + PIN_AFIO_AF(GPIOB_PIN4, 0) | \ + PIN_AFIO_AF(GPIOB_PIN5, 0) | \ + PIN_AFIO_AF(GPIOB_PIN6, 4) | \ + PIN_AFIO_AF(GPIOB_PIN7, 0)) +#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0) | \ + PIN_AFIO_AF(GPIOB_PIN9, 0) | \ + PIN_AFIO_AF(GPIOB_PIN10, 0) | \ + PIN_AFIO_AF(GPIOB_PIN11, 0) | \ + PIN_AFIO_AF(GPIOB_PIN12, 0) | \ + PIN_AFIO_AF(GPIOB_PIN13, 0) | \ + PIN_AFIO_AF(GPIOB_PIN14, 0) | \ + PIN_AFIO_AF(GPIOB_PIN15, 0)) + +/* + * GPIOC setup: + * + * PC0 - PIN0 (input pullup). + * PC1 - PIN1 (input pullup). + * PC2 - PIN2 (input pullup). + * PC3 - PIN3 (input pullup). + * PC4 - PIN4 (input pullup). + * PC5 - PIN5 (input pullup). + * PC6 - PIN6 (input pullup). + * PC7 - PIN7 (input pullup). + * PC8 - PIN8 (input pullup). + * PC9 - PIN9 (input pullup). + * PC10 - PIN10 (input pullup). + * PC11 - PIN11 (input pullup). + * PC12 - PIN12 (input pullup). + * PC13 - PIN13 (input pullup). + * PC14 - PIN14 (input floating). + * PC15 - PIN15 (input floating). + */ +#define VAL_GPIOC_MODER (PIN_MODE_INPUT(GPIOC_PIN0) | \ + PIN_MODE_INPUT(GPIOC_PIN1) | \ + PIN_MODE_INPUT(GPIOC_PIN2) | \ + PIN_MODE_INPUT(GPIOC_PIN3) | \ + PIN_MODE_INPUT(GPIOC_PIN4) | \ + PIN_MODE_INPUT(GPIOC_PIN5) | \ + PIN_MODE_INPUT(GPIOC_PIN6) | \ + PIN_MODE_INPUT(GPIOC_PIN7) | \ + PIN_MODE_INPUT(GPIOC_PIN8) | \ + PIN_MODE_INPUT(GPIOC_PIN9) | \ + PIN_MODE_INPUT(GPIOC_PIN10) | \ + PIN_MODE_INPUT(GPIOC_PIN11) | \ + PIN_MODE_INPUT(GPIOC_PIN12) | \ + PIN_MODE_INPUT(GPIOC_PIN13) | \ + PIN_MODE_INPUT(GPIOC_PIN14) | \ + PIN_MODE_INPUT(GPIOC_PIN15)) +#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN15)) +#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOC_PIN0) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN1) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN10) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN11) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN12) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN13) | \ + PIN_OSPEED_HIGH(GPIOC_PIN14) | \ + PIN_OSPEED_HIGH(GPIOC_PIN15)) +#define VAL_GPIOC_PUPDR (PIN_PUPDR_PULLUP(GPIOC_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN13) | \ + PIN_PUPDR_FLOATING(GPIOC_PIN14) | \ + PIN_PUPDR_FLOATING(GPIOC_PIN15)) +#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_PIN0) | \ + PIN_ODR_HIGH(GPIOC_PIN1) | \ + PIN_ODR_HIGH(GPIOC_PIN2) | \ + PIN_ODR_HIGH(GPIOC_PIN3) | \ + PIN_ODR_HIGH(GPIOC_PIN4) | \ + PIN_ODR_HIGH(GPIOC_PIN5) | \ + PIN_ODR_HIGH(GPIOC_PIN6) | \ + PIN_ODR_HIGH(GPIOC_PIN7) | \ + PIN_ODR_HIGH(GPIOC_PIN8) | \ + PIN_ODR_HIGH(GPIOC_PIN9) | \ + PIN_ODR_HIGH(GPIOC_PIN10) | \ + PIN_ODR_HIGH(GPIOC_PIN11) | \ + PIN_ODR_HIGH(GPIOC_PIN12) | \ + PIN_ODR_HIGH(GPIOC_PIN13) | \ + PIN_ODR_HIGH(GPIOC_PIN14) | \ + PIN_ODR_HIGH(GPIOC_PIN15)) +#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_PIN0, 0) | \ + PIN_AFIO_AF(GPIOC_PIN1, 0) | \ + PIN_AFIO_AF(GPIOC_PIN2, 0) | \ + PIN_AFIO_AF(GPIOC_PIN3, 0) | \ + PIN_AFIO_AF(GPIOC_PIN4, 0) | \ + PIN_AFIO_AF(GPIOC_PIN5, 0) | \ + PIN_AFIO_AF(GPIOC_PIN6, 0) | \ + PIN_AFIO_AF(GPIOC_PIN7, 0)) +#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_PIN8, 0) | \ + PIN_AFIO_AF(GPIOC_PIN9, 0) | \ + PIN_AFIO_AF(GPIOC_PIN10, 0) | \ + PIN_AFIO_AF(GPIOC_PIN11, 0) | \ + PIN_AFIO_AF(GPIOC_PIN12, 0) | \ + PIN_AFIO_AF(GPIOC_PIN13, 0) | \ + PIN_AFIO_AF(GPIOC_PIN14, 0) | \ + PIN_AFIO_AF(GPIOC_PIN15, 0)) + +/* + * GPIOD setup: + * + * PD0 - PIN0 (input pullup). + * PD1 - PIN1 (input pullup). + * PD2 - PIN2 (input pullup). + * PD3 - PIN3 (input pullup). + * PD4 - PIN4 (input pullup). + * PD5 - PIN5 (input pullup). + * PD6 - PIN6 (input pullup). + * PD7 - PIN7 (input pullup). + * PD8 - PIN8 (input pullup). + * PD9 - PIN9 (input pullup). + * PD11 - PIN10 (input pullup). + * PD11 - PIN11 (input pullup). + * PD12 - PIN12 (input pullup). + * PD13 - PIN13 (input pullup). + * PD14 - PIN14 (input pullup). + * PD15 - PIN15 (input pullup). + */ +#define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_PIN0) | \ + PIN_MODE_INPUT(GPIOD_PIN1) | \ + PIN_MODE_INPUT(GPIOD_PIN2) | \ + PIN_MODE_INPUT(GPIOD_PIN3) | \ + PIN_MODE_INPUT(GPIOD_PIN4) | \ + PIN_MODE_INPUT(GPIOD_PIN5) | \ + PIN_MODE_INPUT(GPIOD_PIN6) | \ + PIN_MODE_INPUT(GPIOD_PIN7) | \ + PIN_MODE_INPUT(GPIOD_PIN8) | \ + PIN_MODE_INPUT(GPIOD_PIN9) | \ + PIN_MODE_INPUT(GPIOD_PIN10) | \ + PIN_MODE_INPUT(GPIOD_PIN11) | \ + PIN_MODE_INPUT(GPIOD_PIN12) | \ + PIN_MODE_INPUT(GPIOD_PIN13) | \ + PIN_MODE_INPUT(GPIOD_PIN14) | \ + PIN_MODE_INPUT(GPIOD_PIN15)) +#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN15)) +#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOD_PIN0) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN1) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN10) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN11) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN12) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN13) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN14) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN15)) +#define VAL_GPIOD_PUPDR (PIN_PUPDR_PULLUP(GPIOD_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN15)) +#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \ + PIN_ODR_HIGH(GPIOD_PIN1) | \ + PIN_ODR_HIGH(GPIOD_PIN2) | \ + PIN_ODR_HIGH(GPIOD_PIN3) | \ + PIN_ODR_HIGH(GPIOD_PIN4) | \ + PIN_ODR_HIGH(GPIOD_PIN5) | \ + PIN_ODR_HIGH(GPIOD_PIN6) | \ + PIN_ODR_HIGH(GPIOD_PIN7) | \ + PIN_ODR_HIGH(GPIOD_PIN8) | \ + PIN_ODR_HIGH(GPIOD_PIN9) | \ + PIN_ODR_HIGH(GPIOD_PIN10) | \ + PIN_ODR_HIGH(GPIOD_PIN11) | \ + PIN_ODR_HIGH(GPIOD_PIN12) | \ + PIN_ODR_HIGH(GPIOD_PIN13) | \ + PIN_ODR_HIGH(GPIOD_PIN14) | \ + PIN_ODR_HIGH(GPIOD_PIN15)) +#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0) | \ + PIN_AFIO_AF(GPIOD_PIN1, 0) | \ + PIN_AFIO_AF(GPIOD_PIN2, 0) | \ + PIN_AFIO_AF(GPIOD_PIN3, 0) | \ + PIN_AFIO_AF(GPIOD_PIN4, 0) | \ + PIN_AFIO_AF(GPIOD_PIN5, 0) | \ + PIN_AFIO_AF(GPIOD_PIN6, 0) | \ + PIN_AFIO_AF(GPIOD_PIN7, 0)) +#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0) | \ + PIN_AFIO_AF(GPIOD_PIN9, 0) | \ + PIN_AFIO_AF(GPIOD_PIN10, 0) | \ + PIN_AFIO_AF(GPIOD_PIN11, 0) | \ + PIN_AFIO_AF(GPIOD_PIN12, 0) | \ + PIN_AFIO_AF(GPIOD_PIN13, 0) | \ + PIN_AFIO_AF(GPIOD_PIN14, 0) | \ + PIN_AFIO_AF(GPIOD_PIN15, 0)) + +/* + * GPIOE setup: + * + * PE0 - PIN0 (input pullup). + * PE1 - PIN1 (input pullup). + * PE2 - PIN2 (input pullup). + * PE3 - PIN3 L3GD20_CS (output pushpull maximum). + * PE4 - PIN4 (input pullup). + * PE5 - PIN5 (input pullup). + * PE6 - PIN6 (input pullup). + * PE7 - PIN7 (input pullup). + * PE8 - PIN8 (output pushpull maximum). + * PE9 - PIN9 (output pushpull maximum). + * PE10 - PIN10 (output pushpull maximum). + * PE11 - PIN11 (output pushpull maximum). + * PE12 - PIN12 (output pushpull maximum). + * PE13 - PIN13 (output pushpull maximum). + * PE14 - PIN14 (output pushpull maximum). + * PE15 - PIN15 (output pushpull maximum). + */ +#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_PIN0) | \ + PIN_MODE_INPUT(GPIOE_PIN1) | \ + PIN_MODE_INPUT(GPIOE_PIN2) |\ + PIN_MODE_OUTPUT(GPIOE_PIN3) | \ + PIN_MODE_INPUT(GPIOE_PIN4) |\ + PIN_MODE_INPUT(GPIOE_PIN5) |\ + PIN_MODE_INPUT(GPIOE_PIN6) | \ + PIN_MODE_INPUT(GPIOE_PIN7) | \ + PIN_MODE_OUTPUT(GPIOE_PIN8) | \ + PIN_MODE_OUTPUT(GPIOE_PIN9) | \ + PIN_MODE_OUTPUT(GPIOE_PIN10) | \ + PIN_MODE_OUTPUT(GPIOE_PIN11) | \ + PIN_MODE_OUTPUT(GPIOE_PIN12) | \ + PIN_MODE_OUTPUT(GPIOE_PIN13) | \ + PIN_MODE_OUTPUT(GPIOE_PIN14) | \ + PIN_MODE_OUTPUT(GPIOE_PIN15)) +#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) |\ + PIN_OTYPE_PUSHPULL(GPIOE_PIN1) |\ + PIN_OTYPE_PUSHPULL(GPIOE_PIN2) |\ + PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN4) |\ + PIN_OTYPE_PUSHPULL(GPIOE_PIN5) |\ + PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN10) |\ + PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN14) |\ + PIN_OTYPE_PUSHPULL(GPIOE_PIN15)) +#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOE_PIN0) |\ + PIN_OSPEED_VERYLOW(GPIOE_PIN1) |\ + PIN_OSPEED_VERYLOW(GPIOE_PIN2) |\ + PIN_OSPEED_HIGH(GPIOE_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOE_PIN4) |\ + PIN_OSPEED_VERYLOW(GPIOE_PIN5) |\ + PIN_OSPEED_VERYLOW(GPIOE_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOE_PIN7) | \ + PIN_OSPEED_HIGH(GPIOE_PIN8) | \ + PIN_OSPEED_HIGH(GPIOE_PIN9) | \ + PIN_OSPEED_HIGH(GPIOE_PIN10) | \ + PIN_OSPEED_HIGH(GPIOE_PIN11) | \ + PIN_OSPEED_HIGH(GPIOE_PIN12) | \ + PIN_OSPEED_HIGH(GPIOE_PIN13) | \ + PIN_OSPEED_HIGH(GPIOE_PIN14) | \ + PIN_OSPEED_HIGH(GPIOE_PIN15)) +#define VAL_GPIOE_PUPDR (PIN_PUPDR_PULLUP(GPIOE_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN2) |\ + PIN_PUPDR_FLOATING(GPIOE_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN4) |\ + PIN_PUPDR_PULLUP(GPIOE_PIN5) |\ + PIN_PUPDR_PULLUP(GPIOE_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN10) | \ + PIN_PUPDR_FLOATING(GPIOE_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN12) | \ + PIN_PUPDR_FLOATING(GPIOE_PIN13) | \ + PIN_PUPDR_FLOATING(GPIOE_PIN14) |\ + PIN_PUPDR_FLOATING(GPIOE_PIN15)) +#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \ + PIN_ODR_HIGH(GPIOE_PIN1) | \ + PIN_ODR_HIGH(GPIOE_PIN2) | \ + PIN_ODR_HIGH(GPIOE_PIN3) | \ + PIN_ODR_HIGH(GPIOE_PIN4) | \ + PIN_ODR_HIGH(GPIOE_PIN5) | \ + PIN_ODR_HIGH(GPIOE_PIN6) | \ + PIN_ODR_HIGH(GPIOE_PIN7) | \ + PIN_ODR_LOW(GPIOE_PIN8) | \ + PIN_ODR_LOW(GPIOE_PIN9) | \ + PIN_ODR_LOW(GPIOE_PIN10) | \ + PIN_ODR_LOW(GPIOE_PIN11) | \ + PIN_ODR_LOW(GPIOE_PIN12) | \ + PIN_ODR_LOW(GPIOE_PIN13) | \ + PIN_ODR_LOW(GPIOE_PIN14) | \ + PIN_ODR_LOW(GPIOE_PIN15)) +#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0) | \ + PIN_AFIO_AF(GPIOE_PIN1, 0) | \ + PIN_AFIO_AF(GPIOE_PIN2, 0) |\ + PIN_AFIO_AF(GPIOE_PIN3, 0) | \ + PIN_AFIO_AF(GPIOE_PIN4, 0) |\ + PIN_AFIO_AF(GPIOE_PIN5, 0) |\ + PIN_AFIO_AF(GPIOE_PIN6, 0) | \ + PIN_AFIO_AF(GPIOE_PIN7, 0)) +#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0) | \ + PIN_AFIO_AF(GPIOE_PIN9, 0) | \ + PIN_AFIO_AF(GPIOE_PIN10, 0) | \ + PIN_AFIO_AF(GPIOE_PIN11, 0) | \ + PIN_AFIO_AF(GPIOE_PIN12, 0) | \ + PIN_AFIO_AF(GPIOE_PIN13, 0) | \ + PIN_AFIO_AF(GPIOE_PIN14, 0) | \ + PIN_AFIO_AF(GPIOE_PIN15, 0)) + +/* + * GPIOF setup: + * + * PF0 - I2C2_SDA (input floating). + * PF1 - I2C2_SCL (input floating). + * PF2 - PIN2 (input pullup). + * PF3 - PIN3 (input pullup). + * PF4 - PIN4 (input pullup). + * PF5 - PIN5 (input pullup). + * PF6 - PIN6 (input pullup). + * PF7 - PIN7 (input pullup). + * PF8 - PIN8 (input pullup). + * PF9 - PIN9 (input pullup). + * PF10 - PIN10 (input pullup). + * PF11 - PIN11 (input pullup). + * PF12 - PIN12 (input pullup). + * PF13 - PIN13 (input pullup). + * PF14 - PIN14 (input pullup). + * PF15 - PIN15 (input pullup). + */ +#define VAL_GPIOF_MODER (PIN_MODE_INPUT(GPIOF_I2C2_SDA) | \ + PIN_MODE_INPUT(GPIOF_I2C2_SCL) | \ + PIN_MODE_INPUT(GPIOF_PIN2) | \ + PIN_MODE_INPUT(GPIOF_PIN3) | \ + PIN_MODE_INPUT(GPIOF_PIN4) | \ + PIN_MODE_INPUT(GPIOF_PIN5) | \ + PIN_MODE_INPUT(GPIOF_PIN6) | \ + PIN_MODE_INPUT(GPIOF_PIN7) | \ + PIN_MODE_INPUT(GPIOF_PIN8) | \ + PIN_MODE_INPUT(GPIOF_PIN9) | \ + PIN_MODE_INPUT(GPIOF_PIN10) | \ + PIN_MODE_INPUT(GPIOF_PIN11) | \ + PIN_MODE_INPUT(GPIOF_PIN12) | \ + PIN_MODE_INPUT(GPIOF_PIN13) | \ + PIN_MODE_INPUT(GPIOF_PIN14) | \ + PIN_MODE_INPUT(GPIOF_PIN15)) +#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_I2C2_SDA) | \ + PIN_OTYPE_PUSHPULL(GPIOF_I2C2_SCL) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN15)) +#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_HIGH(GPIOF_I2C2_SDA) | \ + PIN_OSPEED_HIGH(GPIOF_I2C2_SCL) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN10) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN11) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN12) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN13) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN14) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN15)) +#define VAL_GPIOF_PUPDR (PIN_PUPDR_FLOATING(GPIOF_I2C2_SDA) | \ + PIN_PUPDR_FLOATING(GPIOF_I2C2_SCL) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN15)) +#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_I2C2_SDA) | \ + PIN_ODR_HIGH(GPIOF_I2C2_SCL) | \ + PIN_ODR_HIGH(GPIOF_PIN2) | \ + PIN_ODR_HIGH(GPIOF_PIN3) | \ + PIN_ODR_HIGH(GPIOF_PIN4) | \ + PIN_ODR_HIGH(GPIOF_PIN5) | \ + PIN_ODR_HIGH(GPIOF_PIN6) | \ + PIN_ODR_HIGH(GPIOF_PIN7) | \ + PIN_ODR_HIGH(GPIOF_PIN8) | \ + PIN_ODR_HIGH(GPIOF_PIN9) | \ + PIN_ODR_HIGH(GPIOF_PIN10) | \ + PIN_ODR_HIGH(GPIOF_PIN11) | \ + PIN_ODR_HIGH(GPIOF_PIN12) | \ + PIN_ODR_HIGH(GPIOF_PIN13) | \ + PIN_ODR_HIGH(GPIOF_PIN14) | \ + PIN_ODR_HIGH(GPIOF_PIN15)) +#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_I2C2_SDA, 0) | \ + PIN_AFIO_AF(GPIOF_I2C2_SCL, 0) | \ + PIN_AFIO_AF(GPIOF_PIN2, 0) | \ + PIN_AFIO_AF(GPIOF_PIN3, 0) | \ + PIN_AFIO_AF(GPIOF_PIN4, 0) | \ + PIN_AFIO_AF(GPIOF_PIN5, 0) | \ + PIN_AFIO_AF(GPIOF_PIN6, 0) | \ + PIN_AFIO_AF(GPIOF_PIN7, 0)) +#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0) | \ + PIN_AFIO_AF(GPIOF_PIN9, 0) | \ + PIN_AFIO_AF(GPIOF_PIN10, 0) | \ + PIN_AFIO_AF(GPIOF_PIN11, 0) | \ + PIN_AFIO_AF(GPIOF_PIN12, 0) | \ + PIN_AFIO_AF(GPIOF_PIN13, 0) | \ + PIN_AFIO_AF(GPIOF_PIN14, 0) | \ + PIN_AFIO_AF(GPIOF_PIN15, 0)) + +/* + * GPIOG setup: + * + * PG0 - PIN0 (input pullup). + * PG1 - PIN1 (input pullup). + * PG2 - PIN2 (input pullup). + * PG3 - PIN3 (input pullup). + * PG4 - PIN4 (input pullup). + * PG5 - PIN5 (input pullup). + * PG6 - PIN6 (input pullup). + * PG7 - PIN7 (input pullup). + * PG8 - PIN8 (input pullup). + * PG9 - PIN9 (input pullup). + * PG10 - PIN10 (input pullup). + * PG11 - PIN11 (input pullup). + * PG12 - PIN12 (input pullup). + * PG13 - PIN13 (input pullup). + * PG14 - PIN14 (input pullup). + * PG15 - PIN15 (input pullup). + */ +#define VAL_GPIOG_MODER (PIN_MODE_INPUT(GPIOG_PIN0) | \ + PIN_MODE_INPUT(GPIOG_PIN1) | \ + PIN_MODE_INPUT(GPIOG_PIN2) | \ + PIN_MODE_INPUT(GPIOG_PIN3) | \ + PIN_MODE_INPUT(GPIOG_PIN4) | \ + PIN_MODE_INPUT(GPIOG_PIN5) | \ + PIN_MODE_INPUT(GPIOG_PIN6) | \ + PIN_MODE_INPUT(GPIOG_PIN7) | \ + PIN_MODE_INPUT(GPIOG_PIN8) | \ + PIN_MODE_INPUT(GPIOG_PIN9) | \ + PIN_MODE_INPUT(GPIOG_PIN10) | \ + PIN_MODE_INPUT(GPIOG_PIN11) | \ + PIN_MODE_INPUT(GPIOG_PIN12) | \ + PIN_MODE_INPUT(GPIOG_PIN13) | \ + PIN_MODE_INPUT(GPIOG_PIN14) | \ + PIN_MODE_INPUT(GPIOG_PIN15)) +#define VAL_GPIOG_OTYPER (PIN_OTYPE_PUSHPULL(GPIOG_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN15)) +#define VAL_GPIOG_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOG_PIN0) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN1) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN10) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN11) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN12) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN13) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN14) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN15)) +#define VAL_GPIOG_PUPDR (PIN_PUPDR_PULLUP(GPIOG_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN15)) +#define VAL_GPIOG_ODR (PIN_ODR_HIGH(GPIOG_PIN0) | \ + PIN_ODR_HIGH(GPIOG_PIN1) | \ + PIN_ODR_HIGH(GPIOG_PIN2) | \ + PIN_ODR_HIGH(GPIOG_PIN3) | \ + PIN_ODR_HIGH(GPIOG_PIN4) | \ + PIN_ODR_HIGH(GPIOG_PIN5) | \ + PIN_ODR_HIGH(GPIOG_PIN6) | \ + PIN_ODR_HIGH(GPIOG_PIN7) | \ + PIN_ODR_HIGH(GPIOG_PIN8) | \ + PIN_ODR_HIGH(GPIOG_PIN9) | \ + PIN_ODR_HIGH(GPIOG_PIN10) | \ + PIN_ODR_HIGH(GPIOG_PIN11) | \ + PIN_ODR_HIGH(GPIOG_PIN12) | \ + PIN_ODR_HIGH(GPIOG_PIN13) | \ + PIN_ODR_HIGH(GPIOG_PIN14) | \ + PIN_ODR_HIGH(GPIOG_PIN15)) +#define VAL_GPIOG_AFRL (PIN_AFIO_AF(GPIOG_PIN0, 0) | \ + PIN_AFIO_AF(GPIOG_PIN1, 0) | \ + PIN_AFIO_AF(GPIOG_PIN2, 0) | \ + PIN_AFIO_AF(GPIOG_PIN3, 0) | \ + PIN_AFIO_AF(GPIOG_PIN4, 0) | \ + PIN_AFIO_AF(GPIOG_PIN5, 0) | \ + PIN_AFIO_AF(GPIOG_PIN6, 0) | \ + PIN_AFIO_AF(GPIOG_PIN7, 0)) +#define VAL_GPIOG_AFRH (PIN_AFIO_AF(GPIOG_PIN8, 0) | \ + PIN_AFIO_AF(GPIOG_PIN9, 0) | \ + PIN_AFIO_AF(GPIOG_PIN10, 0) | \ + PIN_AFIO_AF(GPIOG_PIN11, 0) | \ + PIN_AFIO_AF(GPIOG_PIN12, 0) | \ + PIN_AFIO_AF(GPIOG_PIN13, 0) | \ + PIN_AFIO_AF(GPIOG_PIN14, 0) | \ + PIN_AFIO_AF(GPIOG_PIN15, 0)) + +/* + * GPIOH setup: + * + * PH0 - PIN0 (input pullup). + * PH1 - PIN1 (input pullup). + * PH2 - PIN2 (input pullup). + * PH3 - PIN3 (input pullup). + * PH4 - PIN4 (input pullup). + * PH5 - PIN5 (input pullup). + * PH6 - PIN6 (input pullup). + * PH7 - PIN7 (input pullup). + * PH8 - PIN8 (input pullup). + * PH9 - PIN9 (input pullup). + * PH10 - PIN10 (input pullup). + * PH11 - PIN11 (input pullup). + * PH12 - PIN12 (input pullup). + * PH13 - PIN13 (input pullup). + * PH14 - PIN14 (input pullup). + * PH15 - PIN15 (input pullup). + */ +#define VAL_GPIOH_MODER (PIN_MODE_INPUT(GPIOH_PIN0) | \ + PIN_MODE_INPUT(GPIOH_PIN1) | \ + PIN_MODE_INPUT(GPIOH_PIN2) | \ + PIN_MODE_INPUT(GPIOH_PIN3) | \ + PIN_MODE_INPUT(GPIOH_PIN4) | \ + PIN_MODE_INPUT(GPIOH_PIN5) | \ + PIN_MODE_INPUT(GPIOH_PIN6) | \ + PIN_MODE_INPUT(GPIOH_PIN7) | \ + PIN_MODE_INPUT(GPIOH_PIN8) | \ + PIN_MODE_INPUT(GPIOH_PIN9) | \ + PIN_MODE_INPUT(GPIOH_PIN10) | \ + PIN_MODE_INPUT(GPIOH_PIN11) | \ + PIN_MODE_INPUT(GPIOH_PIN12) | \ + PIN_MODE_INPUT(GPIOH_PIN13) | \ + PIN_MODE_INPUT(GPIOH_PIN14) | \ + PIN_MODE_INPUT(GPIOH_PIN15)) +#define VAL_GPIOH_OTYPER (PIN_OTYPE_PUSHPULL(GPIOH_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN15)) +#define VAL_GPIOH_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOH_PIN0) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN1) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN10) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN11) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN12) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN13) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN14) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN15)) +#define VAL_GPIOH_PUPDR (PIN_PUPDR_PULLUP(GPIOH_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN15)) +#define VAL_GPIOH_ODR (PIN_ODR_HIGH(GPIOH_PIN0) | \ + PIN_ODR_HIGH(GPIOH_PIN1) | \ + PIN_ODR_HIGH(GPIOH_PIN2) | \ + PIN_ODR_HIGH(GPIOH_PIN3) | \ + PIN_ODR_HIGH(GPIOH_PIN4) | \ + PIN_ODR_HIGH(GPIOH_PIN5) | \ + PIN_ODR_HIGH(GPIOH_PIN6) | \ + PIN_ODR_HIGH(GPIOH_PIN7) | \ + PIN_ODR_HIGH(GPIOH_PIN8) | \ + PIN_ODR_HIGH(GPIOH_PIN9) | \ + PIN_ODR_HIGH(GPIOH_PIN10) | \ + PIN_ODR_HIGH(GPIOH_PIN11) | \ + PIN_ODR_HIGH(GPIOH_PIN12) | \ + PIN_ODR_HIGH(GPIOH_PIN13) | \ + PIN_ODR_HIGH(GPIOH_PIN14) | \ + PIN_ODR_HIGH(GPIOH_PIN15)) +#define VAL_GPIOH_AFRL (PIN_AFIO_AF(GPIOH_PIN0, 0) | \ + PIN_AFIO_AF(GPIOH_PIN1, 0) | \ + PIN_AFIO_AF(GPIOH_PIN2, 0) | \ + PIN_AFIO_AF(GPIOH_PIN3, 0) | \ + PIN_AFIO_AF(GPIOH_PIN4, 0) | \ + PIN_AFIO_AF(GPIOH_PIN5, 0) | \ + PIN_AFIO_AF(GPIOH_PIN6, 0) | \ + PIN_AFIO_AF(GPIOH_PIN7, 0)) +#define VAL_GPIOH_AFRH (PIN_AFIO_AF(GPIOH_PIN8, 0) | \ + PIN_AFIO_AF(GPIOH_PIN9, 0) | \ + PIN_AFIO_AF(GPIOH_PIN10, 0) | \ + PIN_AFIO_AF(GPIOH_PIN11, 0) | \ + PIN_AFIO_AF(GPIOH_PIN12, 0) | \ + PIN_AFIO_AF(GPIOH_PIN13, 0) | \ + PIN_AFIO_AF(GPIOH_PIN14, 0) | \ + PIN_AFIO_AF(GPIOH_PIN15, 0)) + + +/* + * USB bus activation macro, required by the USB driver. + */ +// #define usb_lld_connect_bus(usbp) +#define usb_lld_connect_bus(usbp) (palSetPadMode(GPIOA, GPIOA_USB_DP, PAL_MODE_ALTERNATE(14))) +// #define usb_lld_connect_bus(usbp) palSetPadMode(GPIOA, 12, PAL_MODE_INPUT) +/* + * USB bus de-activation macro, required by the USB driver. + */ +// #define usb_lld_disconnect_bus(usbp) +#define usb_lld_disconnect_bus(usbp) (palSetPadMode(GPIOA, GPIOA_USB_DP, PAL_MODE_OUTPUT_PUSHPULL)); palClearPad(GPIOA, GPIOA_USB_DP) +// #define usb_lld_disconnect_bus(usbp) palSetPadMode(GPIOA, 12, PAL_MODE_OUTPUT_PUSHPULL); palClearPad(GPIOA, 12) + +#if !defined(_FROM_ASM_) +#ifdef __cplusplus +extern "C" { +#endif + void boardInit(void); +#ifdef __cplusplus +} +#endif +#endif /* _FROM_ASM_ */ + +#endif /* _BOARD_H_ */ diff --git a/keyboards/hs60/v2/boards/GENERIC_STM32_F303XC/board.mk b/keyboards/hs60/v2/boards/GENERIC_STM32_F303XC/board.mk new file mode 100644 index 000000000..43377629a --- /dev/null +++ b/keyboards/hs60/v2/boards/GENERIC_STM32_F303XC/board.mk @@ -0,0 +1,5 @@ +# List of all the board related files. +BOARDSRC = $(BOARD_PATH)/boards/GENERIC_STM32_F303XC/board.c + +# Required include directories +BOARDINC = $(BOARD_PATH)/boards/GENERIC_STM32_F303XC diff --git a/keyboards/hs60/v2/bootloader_defs.h b/keyboards/hs60/v2/bootloader_defs.h new file mode 100644 index 000000000..3b0e9d20a --- /dev/null +++ b/keyboards/hs60/v2/bootloader_defs.h @@ -0,0 +1,7 @@ +/* Address for jumping to bootloader on STM32 chips. */ +/* It is chip dependent, the correct number can be looked up here: + * http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf + * This also requires a patch to chibios: + * /tmk_core/tool/chibios/ch-bootloader-jump.patch + */ +#define STM32_BOOTLOADER_ADDRESS 0x1FFFD800 diff --git a/keyboards/hs60/v2/chconf.h b/keyboards/hs60/v2/chconf.h new file mode 100644 index 000000000..1d9f12ff1 --- /dev/null +++ b/keyboards/hs60/v2/chconf.h @@ -0,0 +1,520 @@ +/* + ChibiOS - Copyright (C) 2006..2016 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. +*/ + +/** + * @file templates/chconf.h + * @brief Configuration file template. + * @details A copy of this file must be placed in each project directory, it + * contains the application specific kernel settings. + * + * @addtogroup config + * @details Kernel related settings and hooks. + * @{ + */ + +#ifndef CHCONF_H +#define CHCONF_H + +#define _CHIBIOS_RT_CONF_ + +/*===========================================================================*/ +/** + * @name System timers settings + * @{ + */ +/*===========================================================================*/ + +/** + * @brief System time counter resolution. + * @note Allowed values are 16 or 32 bits. + */ +#define CH_CFG_ST_RESOLUTION 32 + +/** + * @brief System tick frequency. + * @details Frequency of the system timer that drives the system ticks. This + * setting also defines the system tick time unit. + */ +#define CH_CFG_ST_FREQUENCY 100000 + +/** + * @brief Time delta constant for the tick-less mode. + * @note If this value is zero then the system uses the classic + * periodic tick. This value represents the minimum number + * of ticks that is safe to specify in a timeout directive. + * The value one is not valid, timeouts are rounded up to + * this value. + */ +#define CH_CFG_ST_TIMEDELTA 2 + +/** @} */ + +/*===========================================================================*/ +/** + * @name Kernel parameters and options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Round robin interval. + * @details This constant is the number of system ticks allowed for the + * threads before preemption occurs. Setting this value to zero + * disables the preemption for threads with equal priority and the + * round robin becomes cooperative. Note that higher priority + * threads can still preempt, the kernel is always preemptive. + * @note Disabling the round robin preemption makes the kernel more compact + * and generally faster. + * @note The round robin preemption is not supported in tickless mode and + * must be set to zero in that case. + */ +#define CH_CFG_TIME_QUANTUM 0 + +/** + * @brief Managed RAM size. + * @details Size of the RAM area to be managed by the OS. If set to zero + * then the whole available RAM is used. The core memory is made + * available to the heap allocator and/or can be used directly through + * the simplified core memory allocator. + * + * @note In order to let the OS manage the whole RAM the linker script must + * provide the @p __heap_base__ and @p __heap_end__ symbols. + * @note Requires @p CH_CFG_USE_MEMCORE. + */ +#define CH_CFG_MEMCORE_SIZE 0 + +/** + * @brief Idle thread automatic spawn suppression. + * @details When this option is activated the function @p chSysInit() + * does not spawn the idle thread. The application @p main() + * function becomes the idle thread and must implement an + * infinite loop. + */ +#define CH_CFG_NO_IDLE_THREAD FALSE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Performance options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief OS optimization. + * @details If enabled then time efficient rather than space efficient code + * is used when two possible implementations exist. + * + * @note This is not related to the compiler optimization options. + * @note The default is @p TRUE. + */ +#define CH_CFG_OPTIMIZE_SPEED TRUE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Subsystem options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Time Measurement APIs. + * @details If enabled then the time measurement APIs are included in + * the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_TM TRUE + +/** + * @brief Threads registry APIs. + * @details If enabled then the registry APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_REGISTRY TRUE + +/** + * @brief Threads synchronization APIs. + * @details If enabled then the @p chThdWait() function is included in + * the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_WAITEXIT TRUE + +/** + * @brief Semaphores APIs. + * @details If enabled then the Semaphores APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_SEMAPHORES TRUE + +/** + * @brief Semaphores queuing mode. + * @details If enabled then the threads are enqueued on semaphores by + * priority rather than in FIFO order. + * + * @note The default is @p FALSE. Enable this if you have special + * requirements. + * @note Requires @p CH_CFG_USE_SEMAPHORES. + */ +#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE + +/** + * @brief Mutexes APIs. + * @details If enabled then the mutexes APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MUTEXES TRUE + +/** + * @brief Enables recursive behavior on mutexes. + * @note Recursive mutexes are heavier and have an increased + * memory footprint. + * + * @note The default is @p FALSE. + * @note Requires @p CH_CFG_USE_MUTEXES. + */ +#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE + +/** + * @brief Conditional Variables APIs. + * @details If enabled then the conditional variables APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_MUTEXES. + */ +#define CH_CFG_USE_CONDVARS TRUE + +/** + * @brief Conditional Variables APIs with timeout. + * @details If enabled then the conditional variables APIs with timeout + * specification are included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_CONDVARS. + */ +#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE + +/** + * @brief Events Flags APIs. + * @details If enabled then the event flags APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_EVENTS TRUE + +/** + * @brief Events Flags APIs with timeout. + * @details If enabled then the events APIs with timeout specification + * are included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_EVENTS. + */ +#define CH_CFG_USE_EVENTS_TIMEOUT TRUE + +/** + * @brief Synchronous Messages APIs. + * @details If enabled then the synchronous messages APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MESSAGES TRUE + +/** + * @brief Synchronous Messages queuing mode. + * @details If enabled then messages are served by priority rather than in + * FIFO order. + * + * @note The default is @p FALSE. Enable this if you have special + * requirements. + * @note Requires @p CH_CFG_USE_MESSAGES. + */ +#define CH_CFG_USE_MESSAGES_PRIORITY TRUE + +/** + * @brief Mailboxes APIs. + * @details If enabled then the asynchronous messages (mailboxes) APIs are + * included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_SEMAPHORES. + */ +#define CH_CFG_USE_MAILBOXES TRUE + +/** + * @brief Core Memory Manager APIs. + * @details If enabled then the core memory manager APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MEMCORE TRUE + +/** + * @brief Heap Allocator APIs. + * @details If enabled then the memory heap allocator APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or + * @p CH_CFG_USE_SEMAPHORES. + * @note Mutexes are recommended. + */ +#define CH_CFG_USE_HEAP TRUE + +/** + * @brief Memory Pools Allocator APIs. + * @details If enabled then the memory pools allocator APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MEMPOOLS TRUE + +/** + * @brief Dynamic Threads APIs. + * @details If enabled then the dynamic threads creation APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_WAITEXIT. + * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. + */ +#define CH_CFG_USE_DYNAMIC TRUE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Debug options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Debug option, kernel statistics. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_STATISTICS FALSE + +/** + * @brief Debug option, system state check. + * @details If enabled the correct call protocol for system APIs is checked + * at runtime. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_SYSTEM_STATE_CHECK FALSE + +/** + * @brief Debug option, parameters checks. + * @details If enabled then the checks on the API functions input + * parameters are activated. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_ENABLE_CHECKS FALSE + +/** + * @brief Debug option, consistency checks. + * @details If enabled then all the assertions in the kernel code are + * activated. This includes consistency checks inside the kernel, + * runtime anomalies and port-defined checks. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_ENABLE_ASSERTS FALSE + +/** + * @brief Debug option, trace buffer. + * @details If enabled then the trace buffer is activated. + * + * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. + */ +#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_DISABLED + +/** + * @brief Trace buffer entries. + * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is + * different from @p CH_DBG_TRACE_MASK_DISABLED. + */ +#define CH_DBG_TRACE_BUFFER_SIZE 128 + +/** + * @brief Debug option, stack checks. + * @details If enabled then a runtime stack check is performed. + * + * @note The default is @p FALSE. + * @note The stack check is performed in a architecture/port dependent way. + * It may not be implemented or some ports. + * @note The default failure mode is to halt the system with the global + * @p panic_msg variable set to @p NULL. + */ +#define CH_DBG_ENABLE_STACK_CHECK TRUE + +/** + * @brief Debug option, stacks initialization. + * @details If enabled then the threads working area is filled with a byte + * value when a thread is created. This can be useful for the + * runtime measurement of the used stack. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_FILL_THREADS FALSE + +/** + * @brief Debug option, threads profiling. + * @details If enabled then a field is added to the @p thread_t structure that + * counts the system ticks occurred while executing the thread. + * + * @note The default is @p FALSE. + * @note This debug option is not currently compatible with the + * tickless mode. + */ +#define CH_DBG_THREADS_PROFILING FALSE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Kernel hooks + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Threads descriptor structure extension. + * @details User fields added to the end of the @p thread_t structure. + */ +#define CH_CFG_THREAD_EXTRA_FIELDS \ + /* Add threads custom fields here.*/ + +/** + * @brief Threads initialization hook. + * @details User initialization code added to the @p chThdInit() API. + * + * @note It is invoked from within @p chThdInit() and implicitly from all + * the threads creation APIs. + */ +#define CH_CFG_THREAD_INIT_HOOK(tp) { \ + /* Add threads initialization code here.*/ \ +} + +/** + * @brief Threads finalization hook. + * @details User finalization code added to the @p chThdExit() API. + */ +#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ + /* Add threads finalization code here.*/ \ +} + +/** + * @brief Context switch hook. + * @details This hook is invoked just before switching between threads. + */ +#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ + /* Context switch code here.*/ \ +} + +/** + * @brief ISR enter hook. + */ +#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ + /* IRQ prologue code here.*/ \ +} + +/** + * @brief ISR exit hook. + */ +#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ + /* IRQ epilogue code here.*/ \ +} + +/** + * @brief Idle thread enter hook. + * @note This hook is invoked within a critical zone, no OS functions + * should be invoked from here. + * @note This macro can be used to activate a power saving mode. + */ +#define CH_CFG_IDLE_ENTER_HOOK() { \ + /* Idle-enter code here.*/ \ +} + +/** + * @brief Idle thread leave hook. + * @note This hook is invoked within a critical zone, no OS functions + * should be invoked from here. + * @note This macro can be used to deactivate a power saving mode. + */ +#define CH_CFG_IDLE_LEAVE_HOOK() { \ + /* Idle-leave code here.*/ \ +} + +/** + * @brief Idle Loop hook. + * @details This hook is continuously invoked by the idle thread loop. + */ +#define CH_CFG_IDLE_LOOP_HOOK() { \ + /* Idle loop code here.*/ \ +} + +/** + * @brief System tick event hook. + * @details This hook is invoked in the system tick handler immediately + * after processing the virtual timers queue. + */ +#define CH_CFG_SYSTEM_TICK_HOOK() { \ + /* System tick event code here.*/ \ +} + +/** + * @brief System halt hook. + * @details This hook is invoked in case to a system halting error before + * the system is halted. + */ +#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ + /* System halt code here.*/ \ +} + +/** + * @brief Trace hook. + * @details This hook is invoked each time a new record is written in the + * trace buffer. + */ +#define CH_CFG_TRACE_HOOK(tep) { \ + /* Trace code here.*/ \ +} + +/** @} */ + +/*===========================================================================*/ +/* Port-specific settings (override port settings defaulted in chcore.h). */ +/*===========================================================================*/ + +#endif /* CHCONF_H */ + +/** @} */ diff --git a/keyboards/hs60/v2/config.h b/keyboards/hs60/v2/config.h new file mode 100644 index 000000000..192f7d6f2 --- /dev/null +++ b/keyboards/hs60/v2/config.h @@ -0,0 +1,117 @@ +/* +Copyright 2018 Yiancar + +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 . +*/ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0258 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Yiancar-Designs +#define PRODUCT HS60 V2 +#define DESCRIPTION GH60 compatible, tool free RGB keyboard + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 14 + +#define MATRIX_ROW_PINS { B3, B4, B5, A8, A4 } +#define MATRIX_COL_PINS { A13, A10, A9, A14, A15, B8, B9, C13, C14, C15, A0, A1, A2, A3 } +// To enable debugger set A13 A14 -> A5 A6 + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCE 0 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. + * This is userful 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 + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* Backlight options */ + +#define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects +#define RGB_DISABLE_WHEN_USB_SUSPENDED false // turn off effects when suspended +#define RGB_MATRIX_SKIP_FRAMES 3 + +#define DRIVER_ADDR_1 0b1010000 +#define DRIVER_ADDR_2 0b1010000 // this is here for compliancy reasons. + +#define DRIVER_COUNT 2 +#ifdef HS60_ANSI +#define DRIVER_1_LED_TOTAL 61 +#else +#define DRIVER_1_LED_TOTAL 62 +#endif + +#define DRIVER_LED_TOTAL DRIVER_1_LED_TOTAL diff --git a/keyboards/hs60/v2/halconf.h b/keyboards/hs60/v2/halconf.h new file mode 100644 index 000000000..eda293c49 --- /dev/null +++ b/keyboards/hs60/v2/halconf.h @@ -0,0 +1,388 @@ +/* + ChibiOS - Copyright (C) 2006..2016 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. +*/ + +/** + * @file templates/halconf.h + * @brief HAL configuration header. + * @details HAL configuration file, this file allows to enable or disable the + * various device drivers from your application. You may also use + * this file in order to override the device drivers default settings. + * + * @addtogroup HAL_CONF + * @{ + */ + +#ifndef HALCONF_H +#define HALCONF_H + +#include "mcuconf.h" + +/** + * @brief Enables the PAL subsystem. + */ +#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) +#define HAL_USE_PAL TRUE +#endif + +/** + * @brief Enables the ADC subsystem. + */ +#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) +#define HAL_USE_ADC FALSE +#endif + +/** + * @brief Enables the CAN subsystem. + */ +#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) +#define HAL_USE_CAN FALSE +#endif + +/** + * @brief Enables the DAC subsystem. + */ +#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) +#define HAL_USE_DAC TRUE +#endif + +/** + * @brief Enables the EXT subsystem. + */ +#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) +#define HAL_USE_EXT FALSE +#endif + +/** + * @brief Enables the GPT subsystem. + */ +#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) +#define HAL_USE_GPT TRUE +#endif + +/** + * @brief Enables the I2C subsystem. + */ +#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) +#define HAL_USE_I2C TRUE +#endif + +/** + * @brief Enables the I2S subsystem. + */ +#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) +#define HAL_USE_I2S FALSE +#endif + +/** + * @brief Enables the ICU subsystem. + */ +#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) +#define HAL_USE_ICU FALSE +#endif + +/** + * @brief Enables the MAC subsystem. + */ +#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) +#define HAL_USE_MAC FALSE +#endif + +/** + * @brief Enables the MMC_SPI subsystem. + */ +#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) +#define HAL_USE_MMC_SPI FALSE +#endif + +/** + * @brief Enables the PWM subsystem. + */ +#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) +#define HAL_USE_PWM FALSE +#endif + +/** + * @brief Enables the QSPI subsystem. + */ +#if !defined(HAL_USE_QSPI) || defined(__DOXYGEN__) +#define HAL_USE_QSPI FALSE +#endif + +/** + * @brief Enables the RTC subsystem. + */ +#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) +#define HAL_USE_RTC FALSE +#endif + +/** + * @brief Enables the SDC subsystem. + */ +#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) +#define HAL_USE_SDC FALSE +#endif + +/** + * @brief Enables the SERIAL subsystem. + */ +#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) +#define HAL_USE_SERIAL FALSE +#endif + +/** + * @brief Enables the SERIAL over USB subsystem. + */ +#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) +#define HAL_USE_SERIAL_USB FALSE +#endif + +/** + * @brief Enables the SPI subsystem. + */ +#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) +#define HAL_USE_SPI FALSE +#endif + +/** + * @brief Enables the UART subsystem. + */ +#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) +#define HAL_USE_UART FALSE +#endif + +/** + * @brief Enables the USB subsystem. + */ +#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) +#define HAL_USE_USB TRUE +#endif + +/** + * @brief Enables the WDG subsystem. + */ +#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) +#define HAL_USE_WDG FALSE +#endif + +/*===========================================================================*/ +/* ADC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) +#define ADC_USE_WAIT TRUE +#endif + +/** + * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define ADC_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* CAN driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Sleep mode related APIs inclusion switch. + */ +#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) +#define CAN_USE_SLEEP_MODE TRUE +#endif + +/*===========================================================================*/ +/* I2C driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables the mutual exclusion APIs on the I2C bus. + */ +#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define I2C_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* MAC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables an event sources for incoming packets. + */ +#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) +#define MAC_USE_ZERO_COPY FALSE +#endif + +/** + * @brief Enables an event sources for incoming packets. + */ +#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) +#define MAC_USE_EVENTS TRUE +#endif + +/*===========================================================================*/ +/* MMC_SPI driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Delays insertions. + * @details If enabled this options inserts delays into the MMC waiting + * routines releasing some extra CPU time for the threads with + * lower priority, this may slow down the driver a bit however. + * This option is recommended also if the SPI driver does not + * use a DMA channel and heavily loads the CPU. + */ +#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) +#define MMC_NICE_WAITING TRUE +#endif + +/*===========================================================================*/ +/* SDC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Number of initialization attempts before rejecting the card. + * @note Attempts are performed at 10mS intervals. + */ +#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) +#define SDC_INIT_RETRY 100 +#endif + +/** + * @brief Include support for MMC cards. + * @note MMC support is not yet implemented so this option must be kept + * at @p FALSE. + */ +#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) +#define SDC_MMC_SUPPORT FALSE +#endif + +/** + * @brief Delays insertions. + * @details If enabled this options inserts delays into the MMC waiting + * routines releasing some extra CPU time for the threads with + * lower priority, this may slow down the driver a bit however. + */ +#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) +#define SDC_NICE_WAITING TRUE +#endif + +/*===========================================================================*/ +/* SERIAL driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Default bit rate. + * @details Configuration parameter, this is the baud rate selected for the + * default configuration. + */ +#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) +#define SERIAL_DEFAULT_BITRATE 38400 +#endif + +/** + * @brief Serial buffers size. + * @details Configuration parameter, you can change the depth of the queue + * buffers depending on the requirements of your application. + * @note The default is 16 bytes for both the transmission and receive + * buffers. + */ +#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) +#define SERIAL_BUFFERS_SIZE 16 +#endif + +/*===========================================================================*/ +/* SERIAL_USB driver related setting. */ +/*===========================================================================*/ + +/** + * @brief Serial over USB buffers size. + * @details Configuration parameter, the buffer size must be a multiple of + * the USB data endpoint maximum packet size. + * @note The default is 256 bytes for both the transmission and receive + * buffers. + */ +#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) +#define SERIAL_USB_BUFFERS_SIZE 1 +#endif + +/** + * @brief Serial over USB number of buffers. + * @note The default is 2 buffers. + */ +#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) +#define SERIAL_USB_BUFFERS_NUMBER 2 +#endif + +/*===========================================================================*/ +/* SPI driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) +#define SPI_USE_WAIT TRUE +#endif + +/** + * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define SPI_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* UART driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__) +#define UART_USE_WAIT FALSE +#endif + +/** + * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define UART_USE_MUTUAL_EXCLUSION FALSE +#endif + +/*===========================================================================*/ +/* USB driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) +#define USB_USE_WAIT TRUE +#endif + +#endif /* HALCONF_H */ + +/** @} */ diff --git a/keyboards/hs60/v2/info.json b/keyboards/hs60/v2/info.json new file mode 100644 index 000000000..abafb69f9 --- /dev/null +++ b/keyboards/hs60/v2/info.json @@ -0,0 +1,1650 @@ +{ + "keyboard_name": "clueboard/60", + "maintainer": "skullydazed", + "url": "", + "width": 15, + "height": 5, + "layouts": { + "LAYOUT_60_ansi": { + "key_count": 61, + "layout": [ + { + "label": "~", + "x": 0, + "y": 0 + }, + { + "label": "!", + "x": 1, + "y": 0 + }, + { + "label": "@", + "x": 2, + "y": 0 + }, + { + "label": "#", + "x": 3, + "y": 0 + }, + { + "label": "$", + "x": 4, + "y": 0 + }, + { + "label": "%", + "x": 5, + "y": 0 + }, + { + "label": "^", + "x": 6, + "y": 0 + }, + { + "label": "&", + "x": 7, + "y": 0 + }, + { + "label": "*", + "x": 8, + "y": 0 + }, + { + "label": "(", + "x": 9, + "y": 0 + }, + { + "label": ")", + "x": 10, + "y": 0 + }, + { + "label": "_", + "x": 11, + "y": 0 + }, + { + "label": "+", + "x": 12, + "y": 0 + }, + { + "label": "Backspace", + "x": 13, + "y": 0, + "w": 2 + }, + { + "label": "Tab", + "x": 0, + "y": 1, + "w": 1.5 + }, + { + "label": "Q", + "x": 1.5, + "y": 1 + }, + { + "label": "W", + "x": 2.5, + "y": 1 + }, + { + "label": "E", + "x": 3.5, + "y": 1 + }, + { + "label": "R", + "x": 4.5, + "y": 1 + }, + { + "label": "T", + "x": 5.5, + "y": 1 + }, + { + "label": "Y", + "x": 6.5, + "y": 1 + }, + { + "label": "U", + "x": 7.5, + "y": 1 + }, + { + "label": "I", + "x": 8.5, + "y": 1 + }, + { + "label": "O", + "x": 9.5, + "y": 1 + }, + { + "label": "P", + "x": 10.5, + "y": 1 + }, + { + "label": "{", + "x": 11.5, + "y": 1 + }, + { + "label": "}", + "x": 12.5, + "y": 1 + }, + { + "label": "|", + "x": 13.5, + "y": 1, + "w": 1.5 + }, + { + "label": "Caps Lock", + "x": 0, + "y": 2, + "w": 1.75 + }, + { + "label": "A", + "x": 1.75, + "y": 2 + }, + { + "label": "S", + "x": 2.75, + "y": 2 + }, + { + "label": "D", + "x": 3.75, + "y": 2 + }, + { + "label": "F", + "x": 4.75, + "y": 2 + }, + { + "label": "G", + "x": 5.75, + "y": 2 + }, + { + "label": "H", + "x": 6.75, + "y": 2 + }, + { + "label": "J", + "x": 7.75, + "y": 2 + }, + { + "label": "K", + "x": 8.75, + "y": 2 + }, + { + "label": "L", + "x": 9.75, + "y": 2 + }, + { + "label": ":", + "x": 10.75, + "y": 2 + }, + { + "label": "\"", + "x": 11.75, + "y": 2 + }, + { + "label": "Enter", + "x": 12.75, + "y": 2, + "w": 2.25 + }, + { + "label": "Shift", + "x": 0, + "y": 3, + "w": 2.25 + }, + { + "label": "Z", + "x": 2.25, + "y": 3 + }, + { + "label": "X", + "x": 3.25, + "y": 3 + }, + { + "label": "C", + "x": 4.25, + "y": 3 + }, + { + "label": "V", + "x": 5.25, + "y": 3 + }, + { + "label": "B", + "x": 6.25, + "y": 3 + }, + { + "label": "N", + "x": 7.25, + "y": 3 + }, + { + "label": "M", + "x": 8.25, + "y": 3 + }, + { + "label": "<", + "x": 9.25, + "y": 3 + }, + { + "label": ">", + "x": 10.25, + "y": 3 + }, + { + "label": "?", + "x": 11.25, + "y": 3 + }, + { + "label": "Shift", + "x": 12.25, + "y": 3, + "w": 2.75 + }, + { + "label": "Ctrl", + "x": 0, + "y": 4, + "w": 1.25 + }, + { + "label": "Win", + "x": 1.25, + "y": 4, + "w": 1.25 + }, + { + "label": "Alt", + "x": 2.5, + "y": 4, + "w": 1.25 + }, + { + "x": 3.75, + "y": 4, + "w": 6.25 + }, + { + "label": "Alt", + "x": 10, + "y": 4, + "w": 1.25 + }, + { + "label": "Win", + "x": 11.25, + "y": 4, + "w": 1.25 + }, + { + "label": "Menu", + "x": 12.5, + "y": 4, + "w": 1.25 + }, + { + "label": "Ctrl", + "x": 13.75, + "y": 4, + "w": 1.25 + } + ] + }, + "LAYOUT_60_iso": { + "key_count": 62, + "layout": [ + { + "label": "\\u00ac", + "x": 0, + "y": 0 + }, + { + "label": "!", + "x": 1, + "y": 0 + }, + { + "label": "\"", + "x": 2, + "y": 0 + }, + { + "label": "\\u00a3", + "x": 3, + "y": 0 + }, + { + "label": "$", + "x": 4, + "y": 0 + }, + { + "label": "%", + "x": 5, + "y": 0 + }, + { + "label": "^", + "x": 6, + "y": 0 + }, + { + "label": "&", + "x": 7, + "y": 0 + }, + { + "label": "*", + "x": 8, + "y": 0 + }, + { + "label": "(", + "x": 9, + "y": 0 + }, + { + "label": ")", + "x": 10, + "y": 0 + }, + { + "label": "_", + "x": 11, + "y": 0 + }, + { + "label": "+", + "x": 12, + "y": 0 + }, + { + "label": "Backspace", + "x": 13, + "y": 0, + "w": 2 + }, + { + "label": "Tab", + "x": 0, + "y": 1, + "w": 1.5 + }, + { + "label": "Q", + "x": 1.5, + "y": 1 + }, + { + "label": "W", + "x": 2.5, + "y": 1 + }, + { + "label": "E", + "x": 3.5, + "y": 1 + }, + { + "label": "R", + "x": 4.5, + "y": 1 + }, + { + "label": "T", + "x": 5.5, + "y": 1 + }, + { + "label": "Y", + "x": 6.5, + "y": 1 + }, + { + "label": "U", + "x": 7.5, + "y": 1 + }, + { + "label": "I", + "x": 8.5, + "y": 1 + }, + { + "label": "O", + "x": 9.5, + "y": 1 + }, + { + "label": "P", + "x": 10.5, + "y": 1 + }, + { + "label": "{", + "x": 11.5, + "y": 1 + }, + { + "label": "}", + "x": 12.5, + "y": 1 + }, + { + "label": "Enter", + "x": 13.75, + "y": 1, + "w": 1.25, + "h": 2 + }, + { + "label": "Caps Lock", + "x": 0, + "y": 2, + "w": 1.75 + }, + { + "label": "A", + "x": 1.75, + "y": 2 + }, + { + "label": "S", + "x": 2.75, + "y": 2 + }, + { + "label": "D", + "x": 3.75, + "y": 2 + }, + { + "label": "F", + "x": 4.75, + "y": 2 + }, + { + "label": "G", + "x": 5.75, + "y": 2 + }, + { + "label": "H", + "x": 6.75, + "y": 2 + }, + { + "label": "J", + "x": 7.75, + "y": 2 + }, + { + "label": "K", + "x": 8.75, + "y": 2 + }, + { + "label": "L", + "x": 9.75, + "y": 2 + }, + { + "label": ":", + "x": 10.75, + "y": 2 + }, + { + "label": "@", + "x": 11.75, + "y": 2 + }, + { + "label": "~", + "x": 12.75, + "y": 2 + }, + { + "label": "Shift", + "x": 0, + "y": 3, + "w": 1.25 + }, + { + "label": "|", + "x": 1.25, + "y": 3 + }, + { + "label": "Z", + "x": 2.25, + "y": 3 + }, + { + "label": "X", + "x": 3.25, + "y": 3 + }, + { + "label": "C", + "x": 4.25, + "y": 3 + }, + { + "label": "V", + "x": 5.25, + "y": 3 + }, + { + "label": "B", + "x": 6.25, + "y": 3 + }, + { + "label": "N", + "x": 7.25, + "y": 3 + }, + { + "label": "M", + "x": 8.25, + "y": 3 + }, + { + "label": "<", + "x": 9.25, + "y": 3 + }, + { + "label": ">", + "x": 10.25, + "y": 3 + }, + { + "label": "?", + "x": 11.25, + "y": 3 + }, + { + "label": "Shift", + "x": 12.25, + "y": 3, + "w": 2.75 + }, + { + "label": "Ctrl", + "x": 0, + "y": 4, + "w": 1.25 + }, + { + "label": "Win", + "x": 1.25, + "y": 4, + "w": 1.25 + }, + { + "label": "Alt", + "x": 2.5, + "y": 4, + "w": 1.25 + }, + { + "x": 3.75, + "y": 4, + "w": 6.25 + }, + { + "label": "AltGr", + "x": 10, + "y": 4, + "w": 1.25 + }, + { + "label": "Win", + "x": 11.25, + "y": 4, + "w": 1.25 + }, + { + "label": "Menu", + "x": 12.5, + "y": 4, + "w": 1.25 + }, + { + "label": "Ctrl", + "x": 13.75, + "y": 4, + "w": 1.25 + } + ] + }, + "KEYMAP_AEK": { + "key_count": 60, + "layout": [ + { + "label": "~", + "x": 0, + "y": 0 + }, + { + "label": "!", + "x": 1, + "y": 0 + }, + { + "label": "@", + "x": 2, + "y": 0 + }, + { + "label": "#", + "x": 3, + "y": 0 + }, + { + "label": "$", + "x": 4, + "y": 0 + }, + { + "label": "%", + "x": 5, + "y": 0 + }, + { + "label": "^", + "x": 6, + "y": 0 + }, + { + "label": "&", + "x": 7, + "y": 0 + }, + { + "label": "*", + "x": 8, + "y": 0 + }, + { + "label": "(", + "x": 9, + "y": 0 + }, + { + "label": ")", + "x": 10, + "y": 0 + }, + { + "label": "_", + "x": 11, + "y": 0 + }, + { + "label": "+", + "x": 12, + "y": 0 + }, + { + "label": "Backspace", + "x": 13, + "y": 0, + "w": 2 + }, + { + "label": "Tab", + "x": 0, + "y": 1, + "w": 1.5 + }, + { + "label": "Q", + "x": 1.5, + "y": 1 + }, + { + "label": "W", + "x": 2.5, + "y": 1 + }, + { + "label": "E", + "x": 3.5, + "y": 1 + }, + { + "label": "R", + "x": 4.5, + "y": 1 + }, + { + "label": "T", + "x": 5.5, + "y": 1 + }, + { + "label": "Y", + "x": 6.5, + "y": 1 + }, + { + "label": "U", + "x": 7.5, + "y": 1 + }, + { + "label": "I", + "x": 8.5, + "y": 1 + }, + { + "label": "O", + "x": 9.5, + "y": 1 + }, + { + "label": "P", + "x": 10.5, + "y": 1 + }, + { + "label": "{", + "x": 11.5, + "y": 1 + }, + { + "label": "}", + "x": 12.5, + "y": 1 + }, + { + "label": "|", + "x": 13.5, + "y": 1, + "w": 1.5 + }, + { + "label": "Caps Lock", + "x": 0, + "y": 2, + "w": 1.75 + }, + { + "label": "A", + "x": 1.75, + "y": 2 + }, + { + "label": "S", + "x": 2.75, + "y": 2 + }, + { + "label": "D", + "x": 3.75, + "y": 2 + }, + { + "label": "F", + "x": 4.75, + "y": 2 + }, + { + "label": "G", + "x": 5.75, + "y": 2 + }, + { + "label": "H", + "x": 6.75, + "y": 2 + }, + { + "label": "J", + "x": 7.75, + "y": 2 + }, + { + "label": "K", + "x": 8.75, + "y": 2 + }, + { + "label": "L", + "x": 9.75, + "y": 2 + }, + { + "label": ":", + "x": 10.75, + "y": 2 + }, + { + "label": "\"", + "x": 11.75, + "y": 2 + }, + { + "label": "Enter", + "x": 12.75, + "y": 2, + "w": 2.25 + }, + { + "label": "Shift", + "x": 0, + "y": 3, + "w": 2.25 + }, + { + "label": "Z", + "x": 2.25, + "y": 3 + }, + { + "label": "X", + "x": 3.25, + "y": 3 + }, + { + "label": "C", + "x": 4.25, + "y": 3 + }, + { + "label": "V", + "x": 5.25, + "y": 3 + }, + { + "label": "B", + "x": 6.25, + "y": 3 + }, + { + "label": "N", + "x": 7.25, + "y": 3 + }, + { + "label": "M", + "x": 8.25, + "y": 3 + }, + { + "label": "<", + "x": 9.25, + "y": 3 + }, + { + "label": ">", + "x": 10.25, + "y": 3 + }, + { + "label": "?", + "x": 11.25, + "y": 3 + }, + { + "label": "Shift", + "x": 12.25, + "y": 3, + "w": 2.75 + }, + { + "label": "Ctrl", + "x": 0, + "y": 4, + "w": 1.5 + }, + { + "label": "Win", + "x": 1.5, + "y": 4, + "w": 1.25 + }, + { + "label": "Alt", + "x": 2.75, + "y": 4, + "w": 1.5 + }, + { + "x": 4.25, + "y": 4, + "w": 6.5 + }, + { + "label": "AltGr", + "x": 10.75, + "y": 4, + "w": 1.5 + }, + { + "label": "Win", + "x": 12.25, + "y": 4, + "w": 1.25 + }, + { + "label": "Ctrl", + "x": 13.5, + "y": 4, + "w": 1.5 + } + ] + }, + "KEYMAP": { + "key_count": 65, + "layout": [ + { + "label": "~", + "x": 0, + "y": 0 + }, + { + "label": "!", + "x": 1, + "y": 0 + }, + { + "label": "@", + "x": 2, + "y": 0 + }, + { + "label": "#", + "x": 3, + "y": 0 + }, + { + "label": "$", + "x": 4, + "y": 0 + }, + { + "label": "%", + "x": 5, + "y": 0 + }, + { + "label": "^", + "x": 6, + "y": 0 + }, + { + "label": "&", + "x": 7, + "y": 0 + }, + { + "label": "*", + "x": 8, + "y": 0 + }, + { + "label": "(", + "x": 9, + "y": 0 + }, + { + "label": ")", + "x": 10, + "y": 0 + }, + { + "label": "_", + "x": 11, + "y": 0 + }, + { + "label": "+", + "x": 12, + "y": 0 + }, + { + "x": 13, + "y": 0 + }, + { + "label": "Back", + "x": 14, + "y": 0 + }, + { + "label": "Tab", + "x": 0, + "y": 1, + "w": 1.5 + }, + { + "label": "Q", + "x": 1.5, + "y": 1 + }, + { + "label": "W", + "x": 2.5, + "y": 1 + }, + { + "label": "E", + "x": 3.5, + "y": 1 + }, + { + "label": "R", + "x": 4.5, + "y": 1 + }, + { + "label": "T", + "x": 5.5, + "y": 1 + }, + { + "label": "Y", + "x": 6.5, + "y": 1 + }, + { + "label": "U", + "x": 7.5, + "y": 1 + }, + { + "label": "I", + "x": 8.5, + "y": 1 + }, + { + "label": "O", + "x": 9.5, + "y": 1 + }, + { + "label": "P", + "x": 10.5, + "y": 1 + }, + { + "label": "{", + "x": 11.5, + "y": 1 + }, + { + "label": "}", + "x": 12.5, + "y": 1 + }, + { + "label": "|", + "x": 13.5, + "y": 1, + "w": 1.5 + }, + { + "label": "Caps Lock", + "x": 0, + "y": 2, + "w": 1.75 + }, + { + "label": "A", + "x": 1.75, + "y": 2 + }, + { + "label": "S", + "x": 2.75, + "y": 2 + }, + { + "label": "D", + "x": 3.75, + "y": 2 + }, + { + "label": "F", + "x": 4.75, + "y": 2 + }, + { + "label": "G", + "x": 5.75, + "y": 2 + }, + { + "label": "H", + "x": 6.75, + "y": 2 + }, + { + "label": "J", + "x": 7.75, + "y": 2 + }, + { + "label": "K", + "x": 8.75, + "y": 2 + }, + { + "label": "L", + "x": 9.75, + "y": 2 + }, + { + "label": ":", + "x": 10.75, + "y": 2 + }, + { + "label": "\"", + "x": 11.75, + "y": 2 + }, + { + "x": 12.75, + "y": 2 + }, + { + "label": "Enter", + "x": 13.75, + "y": 2, + "w": 1.25 + }, + { + "x": 0, + "y": 3 + }, + { + "label": "Shift", + "x": 1, + "y": 3, + "w": 1.25 + }, + { + "label": "Z", + "x": 2.25, + "y": 3 + }, + { + "label": "X", + "x": 3.25, + "y": 3 + }, + { + "label": "C", + "x": 4.25, + "y": 3 + }, + { + "label": "V", + "x": 5.25, + "y": 3 + }, + { + "label": "B", + "x": 6.25, + "y": 3 + }, + { + "label": "N", + "x": 7.25, + "y": 3 + }, + { + "label": "M", + "x": 8.25, + "y": 3 + }, + { + "label": "<", + "x": 9.25, + "y": 3 + }, + { + "label": ">", + "x": 10.25, + "y": 3 + }, + { + "label": "?", + "x": 11.25, + "y": 3 + }, + { + "label": "Shift", + "x": 12.25, + "y": 3, + "w": 1.75 + }, + { + "x": 14, + "y": 3 + }, + { + "label": "Ctrl", + "x": 0, + "y": 4, + "w": 1.25 + }, + { + "label": "Win", + "x": 1.25, + "y": 4, + "w": 1.25 + }, + { + "label": "Alt", + "x": 2.5, + "y": 4, + "w": 1.25 + }, + { + "x": 3.75, + "y": 4, + "w": 6.25 + }, + { + "label": "Alt", + "x": 10, + "y": 4, + "w": 1.25 + }, + { + "label": "Win", + "x": 11.25, + "y": 4, + "w": 1.25 + }, + { + "label": "Menu", + "x": 12.5, + "y": 4, + "w": 1.25 + }, + { + "label": "Ctrl", + "x": 13.75, + "y": 4, + "w": 1.25 + } + ] + }, + "LAYOUT_60_ansi_split_bs_rshift": { + "key_count": 63, + "layout": [ + { + "label": "~", + "x": 0, + "y": 0 + }, + { + "label": "!", + "x": 1, + "y": 0 + }, + { + "label": "@", + "x": 2, + "y": 0 + }, + { + "label": "#", + "x": 3, + "y": 0 + }, + { + "label": "$", + "x": 4, + "y": 0 + }, + { + "label": "%", + "x": 5, + "y": 0 + }, + { + "label": "^", + "x": 6, + "y": 0 + }, + { + "label": "&", + "x": 7, + "y": 0 + }, + { + "label": "*", + "x": 8, + "y": 0 + }, + { + "label": "(", + "x": 9, + "y": 0 + }, + { + "label": ")", + "x": 10, + "y": 0 + }, + { + "label": "_", + "x": 11, + "y": 0 + }, + { + "label": "+", + "x": 12, + "y": 0 + }, + { + "x": 13, + "y": 0 + }, + { + "label": "Back", + "x": 14, + "y": 0 + }, + { + "label": "Tab", + "x": 0, + "y": 1, + "w": 1.5 + }, + { + "label": "Q", + "x": 1.5, + "y": 1 + }, + { + "label": "W", + "x": 2.5, + "y": 1 + }, + { + "label": "E", + "x": 3.5, + "y": 1 + }, + { + "label": "R", + "x": 4.5, + "y": 1 + }, + { + "label": "T", + "x": 5.5, + "y": 1 + }, + { + "label": "Y", + "x": 6.5, + "y": 1 + }, + { + "label": "U", + "x": 7.5, + "y": 1 + }, + { + "label": "I", + "x": 8.5, + "y": 1 + }, + { + "label": "O", + "x": 9.5, + "y": 1 + }, + { + "label": "P", + "x": 10.5, + "y": 1 + }, + { + "label": "{", + "x": 11.5, + "y": 1 + }, + { + "label": "}", + "x": 12.5, + "y": 1 + }, + { + "label": "|", + "x": 13.5, + "y": 1, + "w": 1.5 + }, + { + "label": "Caps Lock", + "x": 0, + "y": 2, + "w": 1.75 + }, + { + "label": "A", + "x": 1.75, + "y": 2 + }, + { + "label": "S", + "x": 2.75, + "y": 2 + }, + { + "label": "D", + "x": 3.75, + "y": 2 + }, + { + "label": "F", + "x": 4.75, + "y": 2 + }, + { + "label": "G", + "x": 5.75, + "y": 2 + }, + { + "label": "H", + "x": 6.75, + "y": 2 + }, + { + "label": "J", + "x": 7.75, + "y": 2 + }, + { + "label": "K", + "x": 8.75, + "y": 2 + }, + { + "label": "L", + "x": 9.75, + "y": 2 + }, + { + "label": ":", + "x": 10.75, + "y": 2 + }, + { + "label": "\"", + "x": 11.75, + "y": 2 + }, + { + "label": "Enter", + "x": 12.75, + "y": 2, + "w": 2.25 + }, + { + "label": "Shift", + "x": 0, + "y": 3, + "w": 2.25 + }, + { + "label": "Z", + "x": 2.25, + "y": 3 + }, + { + "label": "X", + "x": 3.25, + "y": 3 + }, + { + "label": "C", + "x": 4.25, + "y": 3 + }, + { + "label": "V", + "x": 5.25, + "y": 3 + }, + { + "label": "B", + "x": 6.25, + "y": 3 + }, + { + "label": "N", + "x": 7.25, + "y": 3 + }, + { + "label": "M", + "x": 8.25, + "y": 3 + }, + { + "label": "<", + "x": 9.25, + "y": 3 + }, + { + "label": ">", + "x": 10.25, + "y": 3 + }, + { + "label": "?", + "x": 11.25, + "y": 3 + }, + { + "label": "Shift", + "x": 12.25, + "y": 3, + "w": 1.75 + }, + { + "x": 14, + "y": 3 + }, + { + "label": "Ctrl", + "x": 0, + "y": 4, + "w": 1.25 + }, + { + "label": "Win", + "x": 1.25, + "y": 4, + "w": 1.25 + }, + { + "label": "Alt", + "x": 2.5, + "y": 4, + "w": 1.25 + }, + { + "x": 3.75, + "y": 4, + "w": 6.25 + }, + { + "label": "Alt", + "x": 10, + "y": 4, + "w": 1.25 + }, + { + "label": "Win", + "x": 11.25, + "y": 4, + "w": 1.25 + }, + { + "label": "Menu", + "x": 12.5, + "y": 4, + "w": 1.25 + }, + { + "label": "Ctrl", + "x": 13.75, + "y": 4, + "w": 1.25 + } + ] + } + } +} diff --git a/keyboards/hs60/v2/keymaps/ansi/config.h b/keyboards/hs60/v2/keymaps/ansi/config.h new file mode 100644 index 000000000..f51cc16d8 --- /dev/null +++ b/keyboards/hs60/v2/keymaps/ansi/config.h @@ -0,0 +1,21 @@ +/* +Copyright 2018 Yiancar + +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 . +*/ +#pragma once + +/* Include overwrites for specific keymap */ + +#define HS60_ANSI diff --git a/keyboards/hs60/v2/keymaps/ansi/keymap.c b/keyboards/hs60/v2/keymaps/ansi/keymap.c new file mode 100644 index 000000000..923af9e2c --- /dev/null +++ b/keyboards/hs60/v2/keymaps/ansi/keymap.c @@ -0,0 +1,46 @@ +/* Copyright 2018 Yiancar + * + * 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 . + */ +#include QMK_KEYBOARD_H + +//This is the ANSI version of the PCB + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = LAYOUT_60_ansi( /* Base */ + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,\ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,\ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,\ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1) , KC_APP, KC_RCTL), + +[1] = LAYOUT_60_ansi( /* FN */ + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL ,\ + KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET , KC_TRNS,\ + KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,\ + KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, RGB_SPI, RGB_SPD, KC_TRNS,\ + KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), +}; + +void matrix_init_user(void) { + //user initialization +} + +void matrix_scan_user(void) { + //user matrix +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} \ No newline at end of file diff --git a/keyboards/hs60/v2/keymaps/ansi/readme.md b/keyboards/hs60/v2/keymaps/ansi/readme.md new file mode 100644 index 000000000..fa811319d --- /dev/null +++ b/keyboards/hs60/v2/keymaps/ansi/readme.md @@ -0,0 +1,6 @@ +The default keymap for ANSI HS60 +================================ + +![Layout image](https://imgur.com/CSyPw0J.png) + +Default layer is normal ANSI and Fn layer is used for RGB functions, Volume control and arrow cluster \ No newline at end of file diff --git a/keyboards/hs60/v2/keymaps/default/keymap.c b/keyboards/hs60/v2/keymaps/default/keymap.c new file mode 100644 index 000000000..2a5e82361 --- /dev/null +++ b/keyboards/hs60/v2/keymaps/default/keymap.c @@ -0,0 +1,46 @@ +/* Copyright 2018 Yiancar + * + * 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 . + */ +#include QMK_KEYBOARD_H + +//This is the ISO version of the PCB + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = LAYOUT_60_iso( /* Base */ + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,\ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, \ + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,\ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1) , KC_APP, KC_RCTL), + +[1] = LAYOUT_60_iso( /* FN */ + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL ,\ + KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET , \ + KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,\ + KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, RGB_SPI, RGB_SPD, KC_TRNS, KC_TRNS,\ + KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), +}; + +void matrix_init_user(void) { + //user initialization +} + +void matrix_scan_user(void) { + //user matrix +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} \ No newline at end of file diff --git a/keyboards/hs60/v2/keymaps/default/readme.md b/keyboards/hs60/v2/keymaps/default/readme.md new file mode 100644 index 000000000..9125cb349 --- /dev/null +++ b/keyboards/hs60/v2/keymaps/default/readme.md @@ -0,0 +1,6 @@ +The default keymap for ISO HS60 +=============================== + +![Layout image](https://imgur.com/HXj4tYL.png) + +Default layer is normal ISO and Fn layer is used for RGB functions, Volume control and arrow cluster \ No newline at end of file diff --git a/keyboards/hs60/v2/keymaps/hhkb/config.h b/keyboards/hs60/v2/keymaps/hhkb/config.h new file mode 100644 index 000000000..3db403ecc --- /dev/null +++ b/keyboards/hs60/v2/keymaps/hhkb/config.h @@ -0,0 +1,21 @@ +/* +Copyright 2018 Yiancar + +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 . +*/ +#pragma once + +/* Include overwrites for specific keymap */ + +#define HS60_HHKB diff --git a/keyboards/hs60/v2/keymaps/hhkb/keymap.c b/keyboards/hs60/v2/keymaps/hhkb/keymap.c new file mode 100644 index 000000000..d52fc4bac --- /dev/null +++ b/keyboards/hs60/v2/keymaps/hhkb/keymap.c @@ -0,0 +1,46 @@ +/* Copyright 2018 Yiancar + * + * 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 . + */ +#include QMK_KEYBOARD_H + +//This is the HHKB version of the PCB + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = LAYOUT_60_hhkb( /* Base */ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSLS, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, \ + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1), \ + KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL ), + +[1] = LAYOUT_60_hhkb( /* FN */ + RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS,\ + KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, RGB_SPI, RGB_SPD, KC_UP, KC_TRNS, KC_DEL, \ + KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ) +}; + +void matrix_init_user(void) { + //user initialization +} + +void matrix_scan_user(void) { + //user matrix +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} \ No newline at end of file diff --git a/keyboards/hs60/v2/mcuconf.h b/keyboards/hs60/v2/mcuconf.h new file mode 100644 index 000000000..226da48d5 --- /dev/null +++ b/keyboards/hs60/v2/mcuconf.h @@ -0,0 +1,257 @@ +/* + ChibiOS - Copyright (C) 2006..2016 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 + +/* + * STM32F3xx drivers configuration. + * The following settings override the default settings present in + * the various device driver implementation headers. + * Note that the settings for each driver only have effect if the whole + * driver is enabled in halconf.h. + * + * IRQ priorities: + * 15...0 Lowest...Highest. + * + * DMA priorities: + * 0...3 Lowest...Highest. + */ + +#define STM32F3xx_MCUCONF + +/* + * HAL driver system settings. + */ +#define STM32_NO_INIT FALSE +#define STM32_PVD_ENABLE FALSE +#define STM32_PLS STM32_PLS_LEV0 +#define STM32_HSI_ENABLED TRUE +#define STM32_LSI_ENABLED TRUE +#define STM32_HSE_ENABLED TRUE +#define STM32_LSE_ENABLED FALSE +#define STM32_SW STM32_SW_PLL +#define STM32_PLLSRC STM32_PLLSRC_HSE +#define STM32_PREDIV_VALUE 1 +#define STM32_PLLMUL_VALUE 9 +#define STM32_HPRE STM32_HPRE_DIV1 +#define STM32_PPRE1 STM32_PPRE1_DIV2 +#define STM32_PPRE2 STM32_PPRE2_DIV2 +#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK +#define STM32_ADC12PRES STM32_ADC12PRES_DIV1 +#define STM32_ADC34PRES STM32_ADC34PRES_DIV1 +#define STM32_USART1SW STM32_USART1SW_PCLK +#define STM32_USART2SW STM32_USART2SW_PCLK +#define STM32_USART3SW STM32_USART3SW_PCLK +#define STM32_UART4SW STM32_UART4SW_PCLK +#define STM32_UART5SW STM32_UART5SW_PCLK +#define STM32_I2C1SW STM32_I2C1SW_SYSCLK +#define STM32_I2C2SW STM32_I2C2SW_SYSCLK +#define STM32_TIM1SW STM32_TIM1SW_PCLK2 +#define STM32_TIM8SW STM32_TIM8SW_PCLK2 +#define STM32_RTCSEL STM32_RTCSEL_LSI +#define STM32_USB_CLOCK_REQUIRED TRUE +#define STM32_USBPRE STM32_USBPRE_DIV1P5 + +#undef STM32_HSE_BYPASS +// #error "oh no" +// #endif + +/* + * ADC driver system settings. + */ +#define STM32_ADC_DUAL_MODE FALSE +#define STM32_ADC_COMPACT_SAMPLES FALSE +#define STM32_ADC_USE_ADC1 FALSE +#define STM32_ADC_USE_ADC2 FALSE +#define STM32_ADC_USE_ADC3 FALSE +#define STM32_ADC_USE_ADC4 FALSE +#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) +#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) +#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) +#define STM32_ADC_ADC4_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) +#define STM32_ADC_ADC1_DMA_PRIORITY 2 +#define STM32_ADC_ADC2_DMA_PRIORITY 2 +#define STM32_ADC_ADC3_DMA_PRIORITY 2 +#define STM32_ADC_ADC4_DMA_PRIORITY 2 +#define STM32_ADC_ADC12_IRQ_PRIORITY 5 +#define STM32_ADC_ADC3_IRQ_PRIORITY 5 +#define STM32_ADC_ADC4_IRQ_PRIORITY 5 +#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 5 +#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 5 +#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 5 +#define STM32_ADC_ADC4_DMA_IRQ_PRIORITY 5 +#define STM32_ADC_ADC12_CLOCK_MODE ADC_CCR_CKMODE_AHB_DIV1 +#define STM32_ADC_ADC34_CLOCK_MODE ADC_CCR_CKMODE_AHB_DIV1 + +/* + * CAN driver system settings. + */ +#define STM32_CAN_USE_CAN1 FALSE +#define STM32_CAN_CAN1_IRQ_PRIORITY 11 + +/* + * DAC driver system settings. + */ +#define STM32_DAC_DUAL_MODE FALSE +#define STM32_DAC_USE_DAC1_CH1 TRUE +#define STM32_DAC_USE_DAC1_CH2 TRUE +#define STM32_DAC_DAC1_CH1_IRQ_PRIORITY 10 +#define STM32_DAC_DAC1_CH2_IRQ_PRIORITY 10 +#define STM32_DAC_DAC1_CH1_DMA_PRIORITY 2 +#define STM32_DAC_DAC1_CH2_DMA_PRIORITY 2 + +/* + * EXT driver system settings. + */ +#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI21_22_29_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI30_32_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI33_IRQ_PRIORITY 6 + +/* + * GPT driver system settings. + */ +#define STM32_GPT_USE_TIM1 FALSE +#define STM32_GPT_USE_TIM2 FALSE +#define STM32_GPT_USE_TIM3 FALSE +#define STM32_GPT_USE_TIM4 FALSE +#define STM32_GPT_USE_TIM6 TRUE +#define STM32_GPT_USE_TIM7 TRUE +#define STM32_GPT_USE_TIM8 TRUE +#define STM32_GPT_TIM1_IRQ_PRIORITY 7 +#define STM32_GPT_TIM2_IRQ_PRIORITY 7 +#define STM32_GPT_TIM3_IRQ_PRIORITY 7 +#define STM32_GPT_TIM4_IRQ_PRIORITY 7 +#define STM32_GPT_TIM6_IRQ_PRIORITY 7 +#define STM32_GPT_TIM7_IRQ_PRIORITY 7 +#define STM32_GPT_TIM8_IRQ_PRIORITY 7 + +/* + * I2C driver system settings. + */ +#define STM32_I2C_USE_I2C1 TRUE +#define STM32_I2C_USE_I2C2 FALSE +#define STM32_I2C_BUSY_TIMEOUT 50 +#define STM32_I2C_I2C1_IRQ_PRIORITY 10 +#define STM32_I2C_I2C2_IRQ_PRIORITY 10 +#define STM32_I2C_USE_DMA TRUE +#define STM32_I2C_I2C1_DMA_PRIORITY 1 +#define STM32_I2C_I2C2_DMA_PRIORITY 1 +#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") + +/* + * ICU driver system settings. + */ +#define STM32_ICU_USE_TIM1 FALSE +#define STM32_ICU_USE_TIM2 FALSE +#define STM32_ICU_USE_TIM3 FALSE +#define STM32_ICU_USE_TIM4 FALSE +#define STM32_ICU_USE_TIM8 FALSE +#define STM32_ICU_TIM1_IRQ_PRIORITY 7 +#define STM32_ICU_TIM2_IRQ_PRIORITY 7 +#define STM32_ICU_TIM3_IRQ_PRIORITY 7 +#define STM32_ICU_TIM4_IRQ_PRIORITY 7 +#define STM32_ICU_TIM8_IRQ_PRIORITY 7 + +/* + * PWM driver system settings. + */ +#define STM32_PWM_USE_ADVANCED FALSE +#define STM32_PWM_USE_TIM1 FALSE +#define STM32_PWM_USE_TIM2 FALSE +#define STM32_PWM_USE_TIM3 FALSE +#define STM32_PWM_USE_TIM4 FALSE +#define STM32_PWM_USE_TIM8 FALSE +#define STM32_PWM_TIM1_IRQ_PRIORITY 7 +#define STM32_PWM_TIM2_IRQ_PRIORITY 7 +#define STM32_PWM_TIM3_IRQ_PRIORITY 7 +#define STM32_PWM_TIM4_IRQ_PRIORITY 7 +#define STM32_PWM_TIM8_IRQ_PRIORITY 7 + +/* + * SERIAL driver system settings. + */ +#define STM32_SERIAL_USE_USART1 FALSE +#define STM32_SERIAL_USE_USART2 FALSE +#define STM32_SERIAL_USE_USART3 FALSE +#define STM32_SERIAL_USE_UART4 FALSE +#define STM32_SERIAL_USE_UART5 FALSE +#define STM32_SERIAL_USART1_PRIORITY 12 +#define STM32_SERIAL_USART2_PRIORITY 12 +#define STM32_SERIAL_USART3_PRIORITY 12 +#define STM32_SERIAL_UART4_PRIORITY 12 +#define STM32_SERIAL_UART5_PRIORITY 12 + +/* + * SPI driver system settings. + */ +#define STM32_SPI_USE_SPI1 FALSE +#define STM32_SPI_USE_SPI2 FALSE +#define STM32_SPI_USE_SPI3 FALSE +#define STM32_SPI_SPI1_DMA_PRIORITY 1 +#define STM32_SPI_SPI2_DMA_PRIORITY 1 +#define STM32_SPI_SPI3_DMA_PRIORITY 1 +#define STM32_SPI_SPI1_IRQ_PRIORITY 10 +#define STM32_SPI_SPI2_IRQ_PRIORITY 10 +#define STM32_SPI_SPI3_IRQ_PRIORITY 10 +#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure") + +/* + * ST driver system settings. + */ +#define STM32_ST_IRQ_PRIORITY 8 +#define STM32_ST_USE_TIMER 2 + +/* + * UART driver system settings. + */ +#define STM32_UART_USE_USART1 FALSE +#define STM32_UART_USE_USART2 FALSE +#define STM32_UART_USE_USART3 FALSE +#define STM32_UART_USART1_IRQ_PRIORITY 12 +#define STM32_UART_USART2_IRQ_PRIORITY 12 +#define STM32_UART_USART3_IRQ_PRIORITY 12 +#define STM32_UART_USART1_DMA_PRIORITY 0 +#define STM32_UART_USART2_DMA_PRIORITY 0 +#define STM32_UART_USART3_DMA_PRIORITY 0 +#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure") + +/* + * USB driver system settings. + */ +#define STM32_USB_USE_USB1 TRUE +#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE +#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 +#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 + +/* + * WDG driver system settings. + */ +#define STM32_WDG_USE_IWDG FALSE + +#endif /* MCUCONF_H */ diff --git a/keyboards/hs60/v2/readme.md b/keyboards/hs60/v2/readme.md new file mode 100644 index 000000000..50c91698d --- /dev/null +++ b/keyboards/hs60/v2/readme.md @@ -0,0 +1,18 @@ +HS60 V2.0 +========= + +[HS60](https://mechboards.co.uk/wp-content/uploads/2018/04/IMG_20180420_140353.jpg) + +This is a standard fixed layout 60% PCB. It comes in three variants; ISO, ANSI and HHKB and support full per-key RGB. + +Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [github](https://github.com/yiancar) +Hardware Supported: HS60 ISO, ANSI and HHKB PCBs with STM32F303CC +Hardware Availability: http://groupbuys.mechboards.co.uk/shop/hs60-hotswap-60-pcb/ + +Due to the RGB implementation, the HS60 is currently not compatible with community layouts. + +Make example for this keyboard (after setting up your build environment): + + make hs60/v2:default + +See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. \ No newline at end of file diff --git a/keyboards/hs60/v2/rules.mk b/keyboards/hs60/v2/rules.mk new file mode 100644 index 000000000..51e3cf0a3 --- /dev/null +++ b/keyboards/hs60/v2/rules.mk @@ -0,0 +1,58 @@ +# project specific files + +## chip/board settings +# the next two should match the directories in +# /os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES) +MCU_FAMILY = STM32 +MCU_SERIES = STM32F3xx + +# Linker script to use +# it should exist either in /os/common/ports/ARMCMx/compilers/GCC/ld/ +# or /ld/ +MCU_LDSCRIPT = STM32F303xC + +# Startup code to use +# - it should exist in /os/common/startup/ARMCMx/compilers/GCC/mk/ +MCU_STARTUP = stm32f3xx + +# Board: it should exist either in /os/hal/boards/ +# or /boards +BOARD = GENERIC_STM32_F303XC + +# Cortex version +MCU = cortex-m4 + +# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7 +ARMV = 7 + +USE_FPU = yes + +# Vector table for application +# 0x00000000-0x00001000 area is occupied by bootlaoder.*/ +# The CORTEX_VTOR... is needed only for MCHCK/Infinity KB +# OPT_DEFS = -DCORTEX_VTOR_INIT=0x08005000 +OPT_DEFS = + +# Do not put the microcontroller into power saving mode +# when we get USB suspend event. We want it to keep updating +# backlight effects. +OPT_DEFS += -DNO_SUSPEND_POWER_DOWN + +# Options to pass to dfu-util when flashing +DFU_ARGS = -d 0483:df11 -a 0 -s 0x08000000:leave + +# Build Options +# comment out to disable the options. +# +BACKLIGHT_ENABLE = no +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration +MOUSEKEY_ENABLE = yes # Mouse keys +EXTRAKEY_ENABLE = yes # Audio control and System control +CONSOLE_ENABLE = no # Console for debug +COMMAND_ENABLE = no # Commands for debug and configuration +#SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover +AUDIO_ENABLE = no +RGB_MATRIX_ENABLE = IS31FL3733 # Use RGB matrix +NO_USB_STARTUP_CHECK = no # Disable initialization only when usb is plugged in +#SERIAL_LINK_ENABLE = yes diff --git a/keyboards/hs60/v2/v2.c b/keyboards/hs60/v2/v2.c new file mode 100644 index 000000000..4289c1fed --- /dev/null +++ b/keyboards/hs60/v2/v2.c @@ -0,0 +1,635 @@ +/* Copyright 2018 Yiancar + * + * 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 . + */ +#include "v2.h" + +//#include "is31fl3733.h" + +// Please ignore this is for upcoming features +/*#ifdef RAW_ENABLE + +void raw_hid_receive( uint8_t *data, uint8_t length ) +{ + uint8_t command = data[0]; + switch ( command ) + { + case id_protocol_version: + { + msg_protocol_version *msg = (msg_protocol_version*)&data[1]; + msg->version = PROTOCOL_VERSION; + break; + } +#if USE_KEYMAPS_IN_EEPROM + case id_keymap_keycode_load: + { + msg_keymap_keycode_load *msg = (msg_keymap_keycode_load*)&data[1]; + msg->keycode = keymap_keycode_load( msg->layer, msg->row, msg->column ); + break; + } + case id_keymap_keycode_save: + { + msg_keymap_keycode_save *msg = (msg_keymap_keycode_save*)&data[1]; + keymap_keycode_save( msg->layer, msg->row, msg->column, msg->keycode); + break; + } + case id_keymap_default_save: + { + keymap_default_save(); + break; + } +#endif // USE_KEYMAPS_IN_EEPROM + case id_backlight_config_set_values: + { + msg_backlight_config_set_values *msg = (msg_backlight_config_set_values*)&data[1]; + backlight_config_set_values(msg); + backlight_config_save(); + break; + } + case id_backlight_config_set_alphas_mods: + { + msg_backlight_config_set_alphas_mods *msg = (msg_backlight_config_set_alphas_mods*)&data[1]; + backlight_config_set_alphas_mods( msg->alphas_mods ); + backlight_config_save(); + break; + } + case id_backlight_set_key_color: + { + msg_backlight_set_key_color *msg = (msg_backlight_set_key_color*)&data[1]; + backlight_set_key_color(msg->row, msg->column, msg->hsv); + break; + } + case id_system_get_state: + { + msg_system_state *msg = (msg_system_state*)&data[1]; + msg->value = backlight_get_tick(); + break; + } + default: + { + // Unhandled message. + data[0] = id_unhandled; + break; + } + } + + // Return same buffer with values changed + raw_hid_send( data, length ); + +} + +#endif*/ + +#ifdef HS60_ANSI + +const is31_led g_is31_leds[DRIVER_LED_TOTAL] = { +/* Refer to IS31 manual for these locations + * driver + * | R location + * | | G location + * | | | B location + * | | | | */ + {0, B_1, A_1, C_1}, //MX1 + {0, E_1, D_1, F_1}, //MX2 + {0, H_1, G_1, I_1}, //MX3 + {0, K_1, J_1, L_1}, //MX4 + {0, B_2, A_2, C_2}, //MX6 + {0, E_2, D_2, F_2}, //MX7 + {0, H_2, G_2, I_2}, //MX8 + {0, K_2, J_2, L_2}, //MX14 + {0, B_3, A_3, C_3}, //MX11 + {0, E_3, D_3, F_3}, //MX12 + {0, H_3, G_3, I_3}, //MX13 + {0, K_3, J_3, L_3}, //MX19 + {0, B_4, A_4, C_4}, //MX16 + {0, E_4, D_4, F_4}, //MX17 + {0, H_4, G_4, I_4}, //MX18 + {0, K_4, J_4, L_4}, //MX23 + {0, B_5, A_5, C_5}, //MX20 + {0, E_5, D_5, F_5}, //MX21 + {0, H_5, G_5, I_5}, //MX22 + {0, K_5, J_5, L_5}, //MX27 + {0, B_6, A_6, C_6}, //MX24 + {0, E_6, D_6, F_6}, //MX25 + {0, H_6, G_6, I_6}, //MX26 + {0, K_6, J_6, L_6}, //MX31 + {0, B_7, A_7, C_7}, //MX28 + {0, E_7, D_7, F_7}, //MX29 + {0, H_7, G_7, I_7}, //MX30 + {0, K_7, J_7, L_7}, //MX36 + {0, B_8, A_8, C_8}, //MX33 + {0, E_8, D_8, F_8}, //MX34 + {0, H_8, G_8, I_8}, //MX35 + {0, K_8, J_8, L_8}, //MX40 + {0, B_9, A_9, C_9}, //MX37 + {0, E_9, D_9, F_9}, //MX38 + {0, H_9, G_9, I_9}, //MX39 + {0, K_9, J_9, L_9}, //MX44 + {0, B_10, A_10, C_10}, //MX41 + {0, E_10, D_10, F_10}, //MX42 + {0, H_10, G_10, I_10}, //MX43 + {0, K_10, J_10, L_10}, //MX48 + {0, B_11, A_11, C_11}, //MX45 + {0, E_11, D_11, F_11}, //MX46 + {0, H_11, G_11, I_11}, //MX47 + {0, K_11, J_11, L_11}, //MX53 + {0, B_12, A_12, C_12}, //MX50 + {0, E_12, D_12, F_12}, //MX51 + {0, H_12, G_12, I_12}, //MX52 + + {0, B_13, A_13, C_13}, //MX55 + {0, E_13, D_13, F_13}, //MX56 + + {0, K_13, J_13, L_13}, //MX61 + {0, B_14, A_14, C_14}, //MX59 + {0, E_14, D_14, F_14}, //MX57 + {0, H_14, G_14, I_14}, //MX60 + {0, K_14, J_14, L_14}, //MX62 + {0, B_15, A_15, C_15}, //MX5 + {0, E_15, D_15, F_15}, //MX10 + {0, H_15, G_15, I_15}, //MX15 + {0, K_15, J_15, L_15}, //MX32 + + {0, E_16, D_16, F_16}, //MX49 + {0, H_16, G_16, I_16}, //MX54 + {0, K_16, J_16, L_16}, //MX58 +}; + +const rgb_led g_rgb_leds[DRIVER_LED_TOTAL] = { +// +// MX1, MX6, MX11, MX16, MX20, MX24, MX28, MX33, MX37, MX41, MX45, MX50, MX55, MX59, +// MX2, MX7, MX12, MX17, MX21, MX25, MX29, MX34, MX38, MX42, MX46, MX51, MX56, ---, +// MX3, MX8, MX13, MX18, MX22, MX26, MX30, MX35, MX39, MX43, MX47, MX52, MX57, MX60, +// MX4, ---, MX14, MX19, MX23, MX27, MX31, MX36, MX40, MX44, MX48, MX53, ---, MX61, +// MX5, MX10, MX15, ---, ---, ---, MX32, ---, ---, ---, MX49, MX54, MX58, MX62 +/* {row | col << 4} + * | {x=0..224, y=0..64} + * | | modifier + * | | | */ + {{0|(0<<4)}, { 0, 0}, 1}, //MX1 + {{1|(0<<4)}, { 0, 16}, 1}, //MX2 + {{2|(0<<4)}, { 0, 32}, 1}, //MX3 + {{3|(0<<4)}, { 0, 48}, 1}, //MX4 + {{0|(1<<4)}, { 17, 0}, 0}, //MX6 + {{1|(1<<4)}, { 17, 16}, 0}, //MX7 + {{2|(1<<4)}, { 17, 32}, 0}, //MX8 + {{3|(2<<4)}, { 34, 48}, 0}, //MX14 + {{0|(2<<4)}, { 34, 0}, 0}, //MX11 + {{1|(2<<4)}, { 34, 16}, 0}, //MX12 + {{2|(2<<4)}, { 34, 32}, 0}, //MX13 + {{3|(3<<4)}, { 51, 48}, 0}, //MX19 + {{0|(3<<4)}, { 51, 0}, 0}, //MX16 + {{1|(3<<4)}, { 51, 16}, 0}, //MX17 + {{2|(3<<4)}, { 51, 32}, 0}, //MX18 + {{3|(4<<4)}, { 68, 48}, 0}, //MX23 + {{0|(4<<4)}, { 68, 0}, 0}, //MX20 + {{1|(4<<4)}, { 68, 16}, 0}, //MX21 + {{2|(4<<4)}, { 68, 32}, 0}, //MX22 + {{3|(5<<4)}, { 85, 48}, 0}, //MX27 + {{0|(5<<4)}, { 85, 0}, 0}, //MX24 + {{1|(5<<4)}, { 85, 16}, 0}, //MX25 + {{2|(5<<4)}, { 85, 32}, 0}, //MX26 + {{3|(6<<4)}, {102, 48}, 0}, //MX31 + {{0|(6<<4)}, {102, 0}, 0}, //MX28 + {{1|(6<<4)}, {102, 16}, 0}, //MX29 + {{2|(6<<4)}, {102, 32}, 0}, //MX30 + {{3|(7<<4)}, {119, 48}, 0}, //MX36 + {{0|(7<<4)}, {119, 0}, 0}, //MX33 + {{1|(7<<4)}, {119, 16}, 0}, //MX34 + {{2|(7<<4)}, {119, 32}, 0}, //MX35 + {{3|(8<<4)}, {136, 48}, 0}, //MX40 + {{0|(8<<4)}, {136, 0}, 0}, //MX37 + {{1|(8<<4)}, {136, 16}, 0}, //MX38 + {{2|(8<<4)}, {136, 32}, 0}, //MX39 + {{3|(9<<4)}, {153, 48}, 0}, //MX44 + {{0|(9<<4)}, {153, 0}, 0}, //MX41 + {{1|(9<<4)}, {153, 16}, 0}, //MX42 + {{2|(9<<4)}, {153, 32}, 0}, //MX43 + {{3|(10<<4)}, {170, 48}, 0}, //MX48 + {{0|(10<<4)}, {170, 0}, 0}, //MX45 + {{1|(10<<4)}, {170, 16}, 0}, //MX46 + {{2|(10<<4)}, {170, 32}, 0}, //MX47 + {{3|(11<<4)}, {187, 48}, 0}, //MX53 + {{0|(11<<4)}, {187, 0}, 0}, //MX50 + {{1|(11<<4)}, {187, 16}, 0}, //MX51 + {{2|(11<<4)}, {187, 32}, 0}, //MX52 + + {{0|(12<<4)}, {204, 0}, 0}, //MX55 + {{1|(12<<4)}, {204, 16}, 0}, //MX56 + + {{3|(13<<4)}, {221, 48}, 1}, //MX61 + {{0|(13<<4)}, {221, 0}, 1}, //MX59 + {{2|(12<<4)}, {221, 16}, 0}, //MX57 + {{2|(13<<4)}, {221, 32}, 1}, //MX60 + {{4|(13<<4)}, {221, 64}, 1}, //MX62 + {{4|(0<<4)}, { 0, 64}, 1}, //MX5 + {{4|(1<<4)}, { 17, 64}, 1}, //MX10 + {{4|(2<<4)}, { 34, 64}, 1}, //MX15 + {{4|(5<<4)}, {102, 64}, 0}, //MX32 + + {{4|(10<<4)}, {170, 64}, 1}, //MX49 + {{4|(11<<4)}, {187, 64}, 1}, //MX54 + {{4|(12<<4)}, {204, 64}, 1} //MX58 +}; + +#elif defined(HS60_HHKB) + +const is31_led g_is31_leds[DRIVER_LED_TOTAL] = { +/* Refer to IS31 manual for these locations + * driver + * | R location + * | | G location + * | | | B location + * | | | | */ + {0, B_1, A_1, C_1}, //MX1 + {0, E_1, D_1, F_1}, //MX2 + {0, H_1, G_1, I_1}, //MX3 + {0, K_1, J_1, L_1}, //MX4 + {0, B_2, A_2, C_2}, //MX6 + {0, E_2, D_2, F_2}, //MX7 + {0, H_2, G_2, I_2}, //MX8 + {0, K_2, J_2, L_2}, //MX14 + {0, B_3, A_3, C_3}, //MX11 + {0, E_3, D_3, F_3}, //MX12 + {0, H_3, G_3, I_3}, //MX13 + {0, K_3, J_3, L_3}, //MX19 + {0, B_4, A_4, C_4}, //MX16 + {0, E_4, D_4, F_4}, //MX17 + {0, H_4, G_4, I_4}, //MX18 + {0, K_4, J_4, L_4}, //MX23 + {0, B_5, A_5, C_5}, //MX20 + {0, E_5, D_5, F_5}, //MX21 + {0, H_5, G_5, I_5}, //MX22 + {0, K_5, J_5, L_5}, //MX27 + {0, B_6, A_6, C_6}, //MX24 + {0, E_6, D_6, F_6}, //MX25 + {0, H_6, G_6, I_6}, //MX26 + {0, K_6, J_6, L_6}, //MX31 + {0, B_7, A_7, C_7}, //MX28 + {0, E_7, D_7, F_7}, //MX29 + {0, H_7, G_7, I_7}, //MX30 + {0, K_7, J_7, L_7}, //MX36 + {0, B_8, A_8, C_8}, //MX33 + {0, E_8, D_8, F_8}, //MX34 + {0, H_8, G_8, I_8}, //MX35 + {0, K_8, J_8, L_8}, //MX40 + {0, B_9, A_9, C_9}, //MX37 + {0, E_9, D_9, F_9}, //MX38 + {0, H_9, G_9, I_9}, //MX39 + {0, K_9, J_9, L_9}, //MX44 + {0, B_10, A_10, C_10}, //MX41 + {0, E_10, D_10, F_10}, //MX42 + {0, H_10, G_10, I_10}, //MX43 + {0, K_10, J_10, L_10}, //MX48 + {0, B_11, A_11, C_11}, //MX45 + {0, E_11, D_11, F_11}, //MX46 + {0, H_11, G_11, I_11}, //MX47 + {0, K_11, J_11, L_11}, //MX53 + {0, B_12, A_12, C_12}, //MX50 + {0, E_12, D_12, F_12}, //MX51 + {0, H_12, G_12, I_12}, //MX52 + {0, K_12, J_12, L_12}, //MX64 + {0, B_13, A_13, C_13}, //MX55 + {0, E_13, D_13, F_13}, //MX56 + {0, H_13, G_13, I_13}, //MX63 + {0, K_13, J_13, L_13}, //MX61 + {0, B_14, A_14, C_14}, //MX59 + {0, E_14, D_14, F_14}, //MX57 + {0, H_14, G_14, I_14}, //MX60 + {0, K_14, J_14, L_14}, //MX62 + {0, B_15, A_15, C_15}, //MX5 + {0, E_15, D_15, F_15}, //MX10 + {0, H_15, G_15, I_15}, //MX15 + {0, K_15, J_15, L_15}, //MX32 + + + {0, H_16, G_16, I_16}, //MX54 + {0, K_16, J_16, L_16}, //MX58 +}; + +const rgb_led g_rgb_leds[DRIVER_LED_TOTAL] = { +// +// MX1, MX6, MX11, MX16, MX20, MX24, MX28, MX33, MX37, MX41, MX45, MX50, MX55, MX59, +// MX2, MX7, MX12, MX17, MX21, MX25, MX29, MX34, MX38, MX42, MX46, MX51, MX56, MX64, +// MX3, MX8, MX13, MX18, MX22, MX26, MX30, MX35, MX39, MX43, MX47, MX52, MX57, MX60, +// MX4, ----, MX14, MX19, MX23, MX27, MX31, MX36, MX40, MX44, MX48, MX53, MX63, MX61, +// MX5, MX10, MX15, ----, ----, ----, MX32, ----, ---, ----, ----, MX54, MX58, MX62 +/* {row | col << 4} + * | {x=0..224, y=0..64} + * | | modifier + * | | | */ + {{0|(0<<4)}, { 0, 0}, 1}, //MX1 + {{1|(0<<4)}, { 0, 16}, 1}, //MX2 + {{2|(0<<4)}, { 0, 32}, 1}, //MX3 + {{3|(0<<4)}, { 0, 48}, 1}, //MX4 + {{0|(1<<4)}, { 17, 0}, 0}, //MX6 + {{1|(1<<4)}, { 17, 16}, 0}, //MX7 + {{2|(1<<4)}, { 17, 32}, 0}, //MX8 + {{3|(2<<4)}, { 34, 48}, 0}, //MX14 + {{0|(2<<4)}, { 34, 0}, 0}, //MX11 + {{1|(2<<4)}, { 34, 16}, 0}, //MX12 + {{2|(2<<4)}, { 34, 32}, 0}, //MX13 + {{3|(3<<4)}, { 51, 48}, 0}, //MX19 + {{0|(3<<4)}, { 51, 0}, 0}, //MX16 + {{1|(3<<4)}, { 51, 16}, 0}, //MX17 + {{2|(3<<4)}, { 51, 32}, 0}, //MX18 + {{3|(4<<4)}, { 68, 48}, 0}, //MX23 + {{0|(4<<4)}, { 68, 0}, 0}, //MX20 + {{1|(4<<4)}, { 68, 16}, 0}, //MX21 + {{2|(4<<4)}, { 68, 32}, 0}, //MX22 + {{3|(5<<4)}, { 85, 48}, 0}, //MX27 + {{0|(5<<4)}, { 85, 0}, 0}, //MX24 + {{1|(5<<4)}, { 85, 16}, 0}, //MX25 + {{2|(5<<4)}, { 85, 32}, 0}, //MX26 + {{3|(6<<4)}, {102, 48}, 0}, //MX31 + {{0|(6<<4)}, {102, 0}, 0}, //MX28 + {{1|(6<<4)}, {102, 16}, 0}, //MX29 + {{2|(6<<4)}, {102, 32}, 0}, //MX30 + {{3|(7<<4)}, {119, 48}, 0}, //MX36 + {{0|(7<<4)}, {119, 0}, 0}, //MX33 + {{1|(7<<4)}, {119, 16}, 0}, //MX34 + {{2|(7<<4)}, {119, 32}, 0}, //MX35 + {{3|(8<<4)}, {136, 48}, 0}, //MX40 + {{0|(8<<4)}, {136, 0}, 0}, //MX37 + {{1|(8<<4)}, {136, 16}, 0}, //MX38 + {{2|(8<<4)}, {136, 32}, 0}, //MX39 + {{3|(9<<4)}, {153, 48}, 0}, //MX44 + {{0|(9<<4)}, {153, 0}, 0}, //MX41 + {{1|(9<<4)}, {153, 16}, 0}, //MX42 + {{2|(9<<4)}, {153, 32}, 0}, //MX43 + {{3|(10<<4)}, {170, 48}, 0}, //MX48 + {{0|(10<<4)}, {170, 0}, 0}, //MX45 + {{1|(10<<4)}, {170, 16}, 0}, //MX46 + {{2|(10<<4)}, {170, 32}, 0}, //MX47 + {{3|(11<<4)}, {187, 48}, 0}, //MX53 + {{0|(11<<4)}, {187, 0}, 0}, //MX50 + {{1|(11<<4)}, {187, 16}, 0}, //MX51 + {{2|(11<<4)}, {187, 32}, 0}, //MX52 + {{1|(13<<4)}, {221, 0}, 1}, //MX64 + {{0|(12<<4)}, {204, 0}, 0}, //MX55 + {{1|(12<<4)}, {204, 16}, 0}, //MX56 + {{3|(12<<4)}, {204, 48}, 0}, //MX63 + {{3|(13<<4)}, {212, 48}, 1}, //MX61 + {{0|(13<<4)}, {221, 0}, 0}, //MX59 + {{2|(12<<4)}, {221, 16}, 0}, //MX57 + {{2|(13<<4)}, {221, 32}, 1}, //MX60 + {{4|(13<<4)}, {221, 64}, 1}, //MX62 + {{4|(0<<4)}, { 0, 64}, 1}, //MX5 + {{4|(1<<4)}, { 17, 64}, 1}, //MX10 + {{4|(2<<4)}, { 34, 64}, 1}, //MX15 + {{4|(5<<4)}, {102, 64}, 0}, //MX32 + + + {{4|(11<<4)}, {187, 64}, 1}, //MX54 + {{4|(12<<4)}, {204, 64}, 1} //MX58 +}; + +#else //ISO layout + +const is31_led g_is31_leds[DRIVER_LED_TOTAL] = { +/* Refer to IS31 manual for these locations + * driver + * | R location + * | | G location + * | | | B location + * | | | | */ + {0, B_1, A_1, C_1}, //MX1 + {0, E_1, D_1, F_1}, //MX2 + {0, H_1, G_1, I_1}, //MX3 + {0, K_1, J_1, L_1}, //MX4 + {0, B_2, A_2, C_2}, //MX6 + {0, E_2, D_2, F_2}, //MX7 + {0, H_2, G_2, I_2}, //MX8 + {0, K_2, J_2, L_2}, //MX14 + {0, B_3, A_3, C_3}, //MX11 + {0, E_3, D_3, F_3}, //MX12 + {0, H_3, G_3, I_3}, //MX13 + {0, K_3, J_3, L_3}, //MX19 + {0, B_4, A_4, C_4}, //MX16 + {0, E_4, D_4, F_4}, //MX17 + {0, H_4, G_4, I_4}, //MX18 + {0, K_4, J_4, L_4}, //MX23 + {0, B_5, A_5, C_5}, //MX20 + {0, E_5, D_5, F_5}, //MX21 + {0, H_5, G_5, I_5}, //MX22 + {0, K_5, J_5, L_5}, //MX27 + {0, B_6, A_6, C_6}, //MX24 + {0, E_6, D_6, F_6}, //MX25 + {0, H_6, G_6, I_6}, //MX26 + {0, K_6, J_6, L_6}, //MX31 + {0, B_7, A_7, C_7}, //MX28 + {0, E_7, D_7, F_7}, //MX29 + {0, H_7, G_7, I_7}, //MX30 + {0, K_7, J_7, L_7}, //MX36 + {0, B_8, A_8, C_8}, //MX33 + {0, E_8, D_8, F_8}, //MX34 + {0, H_8, G_8, I_8}, //MX35 + {0, K_8, J_8, L_8}, //MX40 + {0, B_9, A_9, C_9}, //MX37 + {0, E_9, D_9, F_9}, //MX38 + {0, H_9, G_9, I_9}, //MX39 + {0, K_9, J_9, L_9}, //MX44 + {0, B_10, A_10, C_10}, //MX41 + {0, E_10, D_10, F_10}, //MX42 + {0, H_10, G_10, I_10}, //MX43 + {0, K_10, J_10, L_10}, //MX48 + {0, B_11, A_11, C_11}, //MX45 + {0, E_11, D_11, F_11}, //MX46 + {0, H_11, G_11, I_11}, //MX47 + {0, K_11, J_11, L_11}, //MX53 + {0, B_12, A_12, C_12}, //MX50 + {0, E_12, D_12, F_12}, //MX51 + {0, H_12, G_12, I_12}, //MX52 + {0, K_12, J_12, L_12}, //MX9 + {0, B_13, A_13, C_13}, //MX55 + {0, E_13, D_13, F_13}, //MX56 + + {0, K_13, J_13, L_13}, //MX61 + {0, B_14, A_14, C_14}, //MX59 + {0, E_14, D_14, F_14}, //MX57 + {0, H_14, G_14, I_14}, //MX60 + {0, K_14, J_14, L_14}, //MX62 + {0, B_15, A_15, C_15}, //MX5 + {0, E_15, D_15, F_15}, //MX10 + {0, H_15, G_15, I_15}, //MX15 + {0, K_15, J_15, L_15}, //MX32 + + {0, E_16, D_16, F_16}, //MX49 + {0, H_16, G_16, I_16}, //MX54 + {0, K_16, J_16, L_16}, //MX58 +}; + +const rgb_led g_rgb_leds[DRIVER_LED_TOTAL] = { +// +// MX1, MX6, MX11, MX16, MX20, MX24, MX28, MX33, MX37, MX41, MX45, MX50, MX55, MX59, +// MX2, MX7, MX12, MX17, MX21, MX25, MX29, MX34, MX38, MX42, MX46, MX51, MX56, ---, +// MX3, MX8, MX13, MX18, MX22, MX26, MX30, MX35, MX39, MX43, MX47, MX52, MX57, MX60, +// MX4, ---, MX14, MX19, MX23, MX27, MX31, MX36, MX40, MX44, MX48, MX53, ---, MX61, +// MX5, MX10, MX15, ---, ---, ---, MX32, ---, ---, ---, MX49, MX54, MX58, MX62 +/* {row | col << 4} + * | {x=0..224, y=0..64} + * | | modifier + * | | | */ + {{0|(0<<4)}, { 0, 0}, 1}, //MX1 + {{1|(0<<4)}, { 0, 16}, 1}, //MX2 + {{2|(0<<4)}, { 0, 32}, 1}, //MX3 + {{3|(0<<4)}, { 0, 48}, 1}, //MX4 + {{0|(1<<4)}, { 17, 0}, 0}, //MX6 + {{1|(1<<4)}, { 17, 16}, 0}, //MX7 + {{2|(1<<4)}, { 17, 32}, 0}, //MX8 + {{3|(2<<4)}, { 34, 48}, 0}, //MX14 + {{0|(2<<4)}, { 34, 0}, 0}, //MX11 + {{1|(2<<4)}, { 34, 16}, 0}, //MX12 + {{2|(2<<4)}, { 34, 32}, 0}, //MX13 + {{3|(3<<4)}, { 51, 48}, 0}, //MX19 + {{0|(3<<4)}, { 51, 0}, 0}, //MX16 + {{1|(3<<4)}, { 51, 16}, 0}, //MX17 + {{2|(3<<4)}, { 51, 32}, 0}, //MX18 + {{3|(4<<4)}, { 68, 48}, 0}, //MX23 + {{0|(4<<4)}, { 68, 0}, 0}, //MX20 + {{1|(4<<4)}, { 68, 16}, 0}, //MX21 + {{2|(4<<4)}, { 68, 32}, 0}, //MX22 + {{3|(5<<4)}, { 85, 48}, 0}, //MX27 + {{0|(5<<4)}, { 85, 0}, 0}, //MX24 + {{1|(5<<4)}, { 85, 16}, 0}, //MX25 + {{2|(5<<4)}, { 85, 32}, 0}, //MX26 + {{3|(6<<4)}, {102, 48}, 0}, //MX31 + {{0|(6<<4)}, {102, 0}, 0}, //MX28 + {{1|(6<<4)}, {102, 16}, 0}, //MX29 + {{2|(6<<4)}, {102, 32}, 0}, //MX30 + {{3|(7<<4)}, {119, 48}, 0}, //MX36 + {{0|(7<<4)}, {119, 0}, 0}, //MX33 + {{1|(7<<4)}, {119, 16}, 0}, //MX34 + {{2|(7<<4)}, {119, 32}, 0}, //MX35 + {{3|(8<<4)}, {136, 48}, 0}, //MX40 + {{0|(8<<4)}, {136, 0}, 0}, //MX37 + {{1|(8<<4)}, {136, 16}, 0}, //MX38 + {{2|(8<<4)}, {136, 32}, 0}, //MX39 + {{3|(9<<4)}, {153, 48}, 0}, //MX44 + {{0|(9<<4)}, {153, 0}, 0}, //MX41 + {{1|(9<<4)}, {153, 16}, 0}, //MX42 + {{2|(9<<4)}, {153, 32}, 0}, //MX43 + {{3|(10<<4)}, {170, 48}, 0}, //MX48 + {{0|(10<<4)}, {170, 0}, 0}, //MX45 + {{1|(10<<4)}, {170, 16}, 0}, //MX46 + {{2|(10<<4)}, {170, 32}, 0}, //MX47 + {{3|(11<<4)}, {187, 48}, 0}, //MX53 + {{0|(11<<4)}, {187, 0}, 0}, //MX50 + {{1|(11<<4)}, {187, 16}, 0}, //MX51 + {{2|(11<<4)}, {187, 32}, 0}, //MX52 + {{3|(2<<4)}, { 17, 32}, 1}, //MX9 + {{0|(12<<4)}, {204, 0}, 0}, //MX55 + {{1|(12<<4)}, {204, 16}, 0}, //MX56 + + {{3|(13<<4)}, {221, 48}, 1}, //MX61 + {{0|(13<<4)}, {221, 0}, 1}, //MX59 + {{2|(12<<4)}, {204, 32}, 0}, //MX57 + {{2|(13<<4)}, {221, 24}, 1}, //MX60 + {{4|(13<<4)}, {221, 64}, 1}, //MX62 + {{4|(0<<4)}, { 0, 64}, 1}, //MX5 + {{4|(1<<4)}, { 17, 64}, 1}, //MX10 + {{4|(2<<4)}, { 34, 64}, 1}, //MX15 + {{4|(5<<4)}, {102, 64}, 0}, //MX32 + + {{4|(10<<4)}, {170, 64}, 1}, //MX49 + {{4|(11<<4)}, {187, 64}, 1}, //MX54 + {{4|(12<<4)}, {204, 64}, 1} //MX58 +}; + +#endif + +void bootmagic_lite(void) +{ + // The lite version of TMK's bootmagic made by Wilba. + // 100% less potential for accidentally making the + // keyboard do stupid things. + + // We need multiple scans because debouncing can't be turned off. + matrix_scan(); + wait_ms(10); + matrix_scan(); + + // If the Esc and space bar are held down on power up, + // reset the EEPROM valid state and jump to bootloader. + // Assumes Esc is at [0,0] and spacebar is at [4,6]. + // This isn't very generalized, but we need something that doesn't + // rely on user's keymaps in firmware or EEPROM. + if ( ( matrix_get_row(0) & (1<<0) ) && + ( matrix_get_row(4) & (1<<6) ) ) + { + // Set the TMK/QMK EEPROM state as invalid. + eeconfig_disable(); + //eeprom_set_valid(false); + // Jump to bootloader. + bootloader_jump(); + } +} + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + bootmagic_lite(); + + // Please ignore this is for upcoming features + // If the EEPROM has the magic, the data is good. + // OK to load from EEPROM. + /*if (eeprom_is_valid()) + { + backlight_config_load(); + + // TODO: do something to "turn on" keymaps in EEPROM? + } + else + { + // If the EEPROM has not been saved before, or is out of date, + // save the default values to the EEPROM. Default values + // come from construction of the zeal_backlight_config instance. + backlight_config_save(); + + // Clear the LED colors stored in EEPROM + for ( int row=0; row < MATRIX_ROWS; row++ ) + { + HSV hsv; + for ( int column=0; column < MATRIX_COLS; column++ ) + { + hsv.h = rand() & 0xFF; + hsv.s = rand() & 0x7F; + hsv.v = 255; + backlight_set_key_color( row, column, hsv ); + } + } + #ifdef USE_KEYMAPS_IN_EEPROM + keymap_default_save(); + #endif + // Save the magic number last, in case saving was interrupted + eeprom_set_valid(true); + }*/ + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + //backlight_set_indicator_state(usb_led); +} \ No newline at end of file diff --git a/keyboards/hs60/v2/v2.h b/keyboards/hs60/v2/v2.h new file mode 100644 index 000000000..86aeb68a7 --- /dev/null +++ b/keyboards/hs60/v2/v2.h @@ -0,0 +1,67 @@ +/* Copyright 2018 Yiancar + * + * 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 . + */ +#ifndef HS60_H +#define HS60_H + +#define XXX KC_NO + +#include "quantum.h" + +// This a shortcut to help you visually see your layout. + +#define LAYOUT_60_iso( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, \ + K40, K41, K42, K46, K4A, K4B, K4C, K4D \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, XXX }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, XXX, K3D }, \ + { K40, K41, K42, XXX, XXX, XXX, K46, XXX, XXX, XXX, K4A, K4B, K4C, K4D } \ +} + +#define LAYOUT_60_ansi( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K2C, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, \ + K40, K41, K42, K46, K4A, K4B, K4C, K4D \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, XXX }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D }, \ + { K30, XXX, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, XXX, K3D }, \ + { K40, K41, K42, XXX, XXX, XXX, K46, XXX, XXX, XXX, K4A, K4B, K4C, K4D } \ +} + +#define LAYOUT_60_hhkb( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K1D, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K2C, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \ + K40, K41, K42, K46, K4B, K4C, K4D \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D }, \ + { K30, XXX, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D }, \ + { K40, K41, K42, XXX, XXX, XXX, K46, XXX, XXX, XXX, XXX, K4B, K4C, K4D } \ +} + +#endif \ No newline at end of file From b11a776cef1d5e26e435ed6b4a12711c965abeb6 Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Fri, 26 Oct 2018 17:14:50 -0700 Subject: [PATCH 379/788] Keymap: Update userspace (I want my Hacktoberfest shirt!) (#4252) * use ctl_t * spruce up readme and add a changelog * add comment about using CTL_T * add more description * use RSFT_T so I can still have a right shift key even on the _AL layer * add config.h for rgblight_sleep * update readme to talk about rgblight_sleep * update changelog with new changes --- .../60_ansi/mechmerlin-ansi/keymap.c | 2 +- .../mechmerlin-split/keymap.c | 2 +- users/mechmerlin/changelog.md | 14 +++++++ users/mechmerlin/config.h | 5 +++ users/mechmerlin/mechmerlin.h | 4 +- users/mechmerlin/readme.md | 41 ++++++++++++++++++- 6 files changed, 62 insertions(+), 6 deletions(-) create mode 100644 users/mechmerlin/changelog.md create mode 100644 users/mechmerlin/config.h diff --git a/layouts/community/60_ansi/mechmerlin-ansi/keymap.c b/layouts/community/60_ansi/mechmerlin-ansi/keymap.c index e48fddea4..4128c4cf2 100644 --- a/layouts/community/60_ansi/mechmerlin-ansi/keymap.c +++ b/layouts/community/60_ansi/mechmerlin-ansi/keymap.c @@ -20,7 +20,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RSFT_T(KC_UP), \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT) }; diff --git a/layouts/community/60_ansi_split_bs_rshift/mechmerlin-split/keymap.c b/layouts/community/60_ansi_split_bs_rshift/mechmerlin-split/keymap.c index 5ec005162..2464dcaa7 100644 --- a/layouts/community/60_ansi_split_bs_rshift/mechmerlin-split/keymap.c +++ b/layouts/community/60_ansi_split_bs_rshift/mechmerlin-split/keymap.c @@ -20,7 +20,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RSFT_T(KC_UP), KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT) }; diff --git a/users/mechmerlin/changelog.md b/users/mechmerlin/changelog.md new file mode 100644 index 000000000..11b3ba708 --- /dev/null +++ b/users/mechmerlin/changelog.md @@ -0,0 +1,14 @@ +# Changelog +All notable changes to my userspace will be documented in this file. + +## [0.1.1] - 2018-10-26 +### Added +- Added a changelog, aka THIS VERY FILE! +- Added `config.h` to userspace for `RGBLIGHT_SLEEP` feature. + +### Changed +- Spruced up the readme file to better explain the things I use in my keymap for would be keymap snoopers. Also useful as an example when people ask. +- Use `CTL_T` instead of `MT` for my custom `KC_CTCP` keycode as it was causing issues on some boards. + +## [0.1.0] - 2018-08-31 +Initial usage of userspaces! diff --git a/users/mechmerlin/config.h b/users/mechmerlin/config.h new file mode 100644 index 000000000..3d58c230a --- /dev/null +++ b/users/mechmerlin/config.h @@ -0,0 +1,5 @@ +#pragma once + +#ifdef RGBLIGHT_ENABLE +#define RGBLIGHT_SLEEP +#endif // RGBLIGHT_ENABLE diff --git a/users/mechmerlin/mechmerlin.h b/users/mechmerlin/mechmerlin.h index c140ac70c..6b4d50edc 100644 --- a/users/mechmerlin/mechmerlin.h +++ b/users/mechmerlin/mechmerlin.h @@ -10,8 +10,8 @@ enum userspace_layers { // Enum of custom keycodes defined in process_record_user enum keycodes { - KC_FNX, // Hold for FN layer, tap to toggle ARROWS layer. + KC_FNX, // Hold for FN layer, tap to toggle ARROWS layer. }; // Custom #defined keycodes -#define KC_CTCP MT(KC_LCTL, KC_CAPS) +#define KC_CTCP CTL_T(KC_CAPS) diff --git a/users/mechmerlin/readme.md b/users/mechmerlin/readme.md index 6a76dd2a9..1e86a6410 100644 --- a/users/mechmerlin/readme.md +++ b/users/mechmerlin/readme.md @@ -1,3 +1,40 @@ -# MechMerlin's Userspace +# MechMerlin's Userspace v0.1.1 -This is a collection of my most commonly used QMK functions +This is a collection of my most commonly used QMK features. + +A majority of my keyboards are smaller than 75%, ANSI, and staggered. + +## Layers +---- + +### _BL (Base Layer) +Typical standard QWERTY keymap. + +### _FL (Function Layer) +This layer is commonly accessed via `MO(_FL)` on the base layer. It consists of your typical function key F1 through F12 and some RGB and Backlight controls. + +### _AL (Arrow Layer) +This layer is only present on my 60% boards. I habitually use the bottom right modifiers as arrows. + +### _CL (Control Layer) +This is not defined in here as it's present only on `LAYOUT_66` boards, or to be specific, my clueboard. It currently uses the default clueboard controls. + +## Custom Keycodes +---- + +### KC_FNX (Fn Extended) + +`KC_FNX` functions as a hold for `MO(X)` and tap for `TG(Y)`. Layer X and Y are different layers. + +It is used primarily on my `LAYOUT_60_ansi` boards as my regular toggle (the 1u key to the right of right shift), is not present there. + +### KC_CTCP (Control Caps) + +This is just a wrapper for `CTL_T(KC_CAPS)`. This is a hold for control and tap for caps lock. + +## QMK Features +---- + +### RGBLIGHT_SLEEP + +Ensures that when my computer is in sleep mode, the keyboard underglow lights will also be off. From b1bf0879ad2acf3aec1db0f67250b8679e565324 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Thu, 25 Oct 2018 11:22:02 -0700 Subject: [PATCH 380/788] Fix mouse_send() on chibiOS so it won't lock up the firmware --- tmk_core/protocol/chibios/usb_main.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index e79ff15e8..71892c4f4 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c @@ -715,15 +715,16 @@ void send_mouse(report_mouse_t *report) { osalSysUnlock(); return; } - osalSysUnlock(); - osalSysLock(); if(usbGetTransmitStatusI(&USB_DRIVER, MOUSE_IN_EPNUM)) { /* Need to either suspend, or loop and call unlock/lock during * every iteration - otherwise the system will remain locked, * no interrupts served, so USB not going through as well. * Note: for suspend, need USB_USE_WAIT == TRUE in halconf.h */ - osalThreadSuspendS(&(&USB_DRIVER)->epc[MOUSE_IN_EPNUM]->in_state->thread); + if (osalThreadSuspendTimeoutS(&(&USB_DRIVER)->epc[MOUSE_IN_EPNUM]->in_state->thread, MS2ST(10)==MSG_TIMEOUT)) { + osalSysUnlock(); + return; + } } usbStartTransmitI(&USB_DRIVER, MOUSE_IN_EPNUM, (uint8_t *)report, sizeof(report_mouse_t)); osalSysUnlock(); From d3a6296199c6f6564e0fffd6d7c1355496d9feac Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 22 Oct 2018 14:46:50 -0700 Subject: [PATCH 381/788] Add key caveat to combos doc --- docs/feature_combo.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/feature_combo.md b/docs/feature_combo.md index f509e9f33..5bb73ef10 100644 --- a/docs/feature_combo.md +++ b/docs/feature_combo.md @@ -19,6 +19,7 @@ combo_t key_combos[COMBO_COUNT] = {COMBO(test_combo, KC_ESC)}; This will send "Escape" if you hit the A and B keys. !> This method only supports [basic keycodes](keycodes_basic.md). See the examples for more control. +!> You cannot reuse (share) keys in combos. Each key should only belong to a single combo. ## Examples From 5632552558fc5e032e89c62d578dff7d3c3cb800 Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Fri, 26 Oct 2018 21:20:00 -0700 Subject: [PATCH 382/788] RGB Support for Panc60 (#4253) * add RGB underglow support * enable RGB underglow and backlighting --- keyboards/panc60/panc60.c | 39 +++++++++++++++++++++++++++++++++++++++ keyboards/panc60/rules.mk | 4 ++-- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/keyboards/panc60/panc60.c b/keyboards/panc60/panc60.c index 4828cb9cf..9ac087dbf 100644 --- a/keyboards/panc60/panc60.c +++ b/keyboards/panc60/panc60.c @@ -14,8 +14,15 @@ * along with this program. If not, see . */ #include "panc60.h" +#ifdef BACKLIGHT_ENABLE +#include "backlight.h" +#endif +#ifdef RGBLIGHT_ENABLE +#include "rgblight.h" +#endif #include + #include "action_layer.h" #include "i2c.h" #include "quantum.h" @@ -23,3 +30,35 @@ __attribute__ ((weak)) void matrix_scan_user(void) { } + +#ifdef RGBLIGHT_ENABLE +extern rgblight_config_t rgblight_config; + +void rgblight_set(void) { + if (!rgblight_config.enable) { + for (uint8_t i = 0; i < RGBLED_NUM; i++) { + led[i].r = 0; + led[i].g = 0; + led[i].b = 0; + } + } + + i2c_init(); + i2c_send(0xb0, (uint8_t*)led, 3 * RGBLED_NUM); +} +#endif + +void backlight_init_ports(void) { + DDRD |= (1<<0 | 1<<1 | 1<<4 | 1<<6); + PORTD &= ~(1<<0 | 1<<1 | 1<<4 | 1<<6); +} + +void backlight_set(uint8_t level) { + if (level == 0) { + // Turn out the lights + PORTD &= ~(1<<0 | 1<<1 | 1<<4 | 1<<6); + } else { + // Turn on the lights + PORTD |= (1<<0 | 1<<1 | 1<<4 | 1<<6); + } +} diff --git a/keyboards/panc60/rules.mk b/keyboards/panc60/rules.mk index fcb14d0ae..588562a95 100644 --- a/keyboards/panc60/rules.mk +++ b/keyboards/panc60/rules.mk @@ -36,8 +36,8 @@ MOUSEKEY_ENABLE = yes EXTRAKEY_ENABLE = yes CONSOLE_ENABLE = yes COMMAND_ENABLE = yes -BACKLIGHT_ENABLE = no -RGBLIGHT_ENABLE = no +BACKLIGHT_ENABLE = yes +RGBLIGHT_ENABLE = yes RGBLIGHT_CUSTOM_DRIVER = yes OPT_DEFS = -DDEBUG_LEVEL=0 From f16b5cc92b1fb3f5c551d009b11f291ee650b432 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 26 Oct 2018 21:21:43 -0700 Subject: [PATCH 383/788] Add delayed flashing option for DFU Util (#4225) * Add delayed flashing option for DFU Util * Use a loop to make code cleaner * Make delay configurable but default to 10 * Better formatting of check --- tmk_core/chibios.mk | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tmk_core/chibios.mk b/tmk_core/chibios.mk index 014c8d502..0f665450a 100644 --- a/tmk_core/chibios.mk +++ b/tmk_core/chibios.mk @@ -233,6 +233,24 @@ qmk: $(BUILD_DIR)/$(TARGET).bin dfu-util: $(BUILD_DIR)/$(TARGET).bin cpfirmware sizeafter $(DFU_UTIL) $(DFU_ARGS) -D $(BUILD_DIR)/$(TARGET).bin + +ifneq ($(strip $(TIME_DELAY)),) + TIME_DELAY = $(strip $(TIME_DELAY)) +else + TIME_DELAY = 10 +endif +dfu-util-wait: $(BUILD_DIR)/$(TARGET).bin cpfirmware sizeafter + echo "Preparing to flash firmware. Please enter bootloader now..." ;\ + COUNTDOWN=$(TIME_DELAY) ;\ + while [[ $$COUNTDOWN -ge 1 ]] ; do \ + echo "Flashing in $$COUNTDOWN ..."; \ + sleep 1 ;\ + ((COUNTDOWN = COUNTDOWN - 1)) ; \ + done; \ + echo "Flashing $(TARGET).bin" ;\ + sleep 1 ;\ + $(DFU_UTIL) $(DFU_ARGS) -D $(BUILD_DIR)/$(TARGET).bin + st-link-cli: $(BUILD_DIR)/$(TARGET).hex sizeafter $(ST_LINK_CLI) $(ST_LINK_ARGS) -q -c SWD -p $(BUILD_DIR)/$(TARGET).hex -Rst From d210ac7a3ea9a6049f2c344d3a44fdc1bccd1f1b Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Thu, 25 Oct 2018 09:01:31 -0700 Subject: [PATCH 384/788] Add caveat for basic keycodes in Tap Dance docs --- docs/feature_tap_dance.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/feature_tap_dance.md b/docs/feature_tap_dance.md index 93d190883..b2b567f1d 100644 --- a/docs/feature_tap_dance.md +++ b/docs/feature_tap_dance.md @@ -26,6 +26,8 @@ This array specifies what actions shall be taken when a tap-dance key is in acti The first option is enough for a lot of cases, that just want dual roles. For example, `ACTION_TAP_DANCE_DOUBLE(KC_SPC, KC_ENT)` will result in `Space` being sent on single-tap, `Enter` otherwise. +!> Keep in mind that only [basic keycodes](keycodes_basic.md) are supported here. Custom keycodes are not supported. + And that's the bulk of it! And now, on to the explanation of how it works! From 73e92ef0c06de389d39d3ca0a8c98da2196ebec7 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 26 Oct 2018 21:22:47 -0700 Subject: [PATCH 385/788] Docs: Add references to One Shot functions, and clean up formatting (#4189) * Docs: Add references to One Shot functions, and clean up formatting * Update PR based on @mechmerlin's recommendations --- docs/feature_advanced_keycodes.md | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/docs/feature_advanced_keycodes.md b/docs/feature_advanced_keycodes.md index 85f4fa1bf..f2e4909d8 100644 --- a/docs/feature_advanced_keycodes.md +++ b/docs/feature_advanced_keycodes.md @@ -142,6 +142,8 @@ For example, if you define a key as `OSM(MOD_LSFT)`, you can type a capital A ch One shot keys also work as normal modifiers. If you hold down a one shot key and type other keys, your one shot will be released immediately after you let go of the key. +Additionally, hitting keys five times in a short period will lock that key. This applies for both One Shot Modifiers and One Shot Layers, and is controlled by the `ONESHOT_TAP_TOGGLE` define. + You can control the behavior of one shot keys by defining these in `config.h`: ```c @@ -152,15 +154,20 @@ You can control the behavior of one shot keys by defining these in `config.h`: * `OSM(mod)` - Momentarily hold down *mod*. You must use the `MOD_*` keycodes as shown in [Mod Tap](#mod-tap), not the `KC_*` codes. * `OSL(layer)` - momentary switch to *layer*. -Sometimes, you want to activate a one-shot layer as part of a macro or tap dance routine. To do this, you need to call `set_oneshot_layer(LAYER, ONESHOT_START)` on key down, and `set_oneshot_layer(ONESHOT_PRESSED)` on key up. If you want to cancel the oneshot, call `reset_oneshot_layer()`. For more complicated actions, take a look at the oneshot implementation in [`process_record`](https://github.com/qmk/qmk_firmware/blob/master/tmk_core/common/action.c#L429). +Sometimes, you want to activate a one-shot key as part of a macro or tap dance routine. + +For one shot layers, you need to call `set_oneshot_layer(LAYER, ONESHOT_START)` on key down, and `set_oneshot_layer(ONESHOT_PRESSED)` on key up. If you want to cancel the oneshot, call `reset_oneshot_layer()`. + +For one shot mods, you need to call `set_oneshot_mods(MOD)` to set it, or `clear_oneshot_mods()` to cancel it. + +!> If you're having issues with OSM translating over Remote Desktop Connection, this can be fixed by opening the settings, going to the "Local Resources" tap, and in the keyboard section, change the drop down to "On this Computer". This will fix the issue and allow OSM to function properly over Remote Desktop. -If you're having issues with OSM translating over Remote Desktop Connection, this can be fixed by clicking on "Show Options", going to the "Local Resources" tab, and in the keyboard section, change the drop down to "On this Computer". This will fix the issue and allow OSM to function properly over Remote Desktop. # Permissive Hold As of [PR#1359](https://github.com/qmk/qmk_firmware/pull/1359/), there is a new `config.h` option: -``` +```c #define PERMISSIVE_HOLD ``` @@ -205,6 +212,6 @@ With `TAPPING_FORCE_HOLD`, the second press will be interpreted as a Shift, allo # Retro Tapping -When you hold a dual function key, and haven't pressed anything when you release the key, normally nothing happens. However, if you enable this, if you release the key without pressing another key, it will send the original key, even if it is outside of the tapping term. +Holding and releasing a dual function key without pressing another key will result in nothing happening. With retro tapping enabled, releasing the key without pressing another will send the original keycode even if it is outside the tapping term. -For instance, if you're using `LT(2, KC_SPACE)`, if you hold the key, don't hit anything else and then release it, normally, nothing happens. But with `RETRO_TAPPING` defined in your `config.h`, it will send `KC_SPACE`. +For instance, holding and releasing `LT(2, KC_SPACE)` without hitting another key will result in nothing happening. With `RETRO_TAPPING` defined in your `config.h`, it will send `KC_SPACE`. From 23cd9f4dee791464196faaf6692599325cfe6f3c Mon Sep 17 00:00:00 2001 From: Monksoffunk Date: Sat, 27 Oct 2018 13:23:49 +0900 Subject: [PATCH 386/788] Keyboard: Add new keyboard Zinc (#4245) * Add Zinc keyboard * Fix photo * Fix readme.md * Fix RGB LED init of monks/keymap.c * Fix default keymap and readme.jp * Fix change DEFS of RGB ANIMATIONS to LED_ANIMATIONS * Add EOL * Use serial_config_simpleapi.h * Fix comment char * Fix error handling in split_scomm.c : mtei works * Fix keymaps * Remove DISABLE_LEADER definition * Remove pro_micro.h * Add 2 spaces after Hardware name * Fix keymaps - remove audio codes - change LAYOUT to LAYOUT_ortho_4X12 - change "persistent_default_layer_set" to core function * Use the Community Layouts feature - with some clean up --- keyboards/zinc/config.h | 50 ++ keyboards/zinc/i2c.c | 162 ++++++ keyboards/zinc/i2c.h | 49 ++ keyboards/zinc/info.json | 13 + keyboards/zinc/keymaps/default/config.h | 38 ++ keyboards/zinc/keymaps/default/keymap.c | 306 ++++++++++ keyboards/zinc/keymaps/default/readme_jp.md | 123 ++++ keyboards/zinc/keymaps/default/rules.mk | 98 ++++ keyboards/zinc/keymaps/monks/config.h | 38 ++ keyboards/zinc/keymaps/monks/keymap.c | 255 ++++++++ keyboards/zinc/keymaps/monks/readme_jp.md | 103 ++++ keyboards/zinc/keymaps/monks/rules.mk | 100 ++++ keyboards/zinc/readme.md | 17 + keyboards/zinc/rev1/config.h | 149 +++++ keyboards/zinc/rev1/info.json | 13 + keyboards/zinc/rev1/matrix.c | 356 ++++++++++++ keyboards/zinc/rev1/rev1.c | 6 + keyboards/zinc/rev1/rev1.h | 44 ++ keyboards/zinc/rev1/rules.mk | 4 + keyboards/zinc/rev1/serial_config.h | 18 + keyboards/zinc/rev1/serial_config_simpleapi.h | 8 + keyboards/zinc/rev1/split_scomm.c | 95 +++ keyboards/zinc/rev1/split_scomm.h | 24 + keyboards/zinc/rev1/split_util.c | 70 +++ keyboards/zinc/rev1/split_util.h | 19 + keyboards/zinc/reva/config.h | 143 +++++ keyboards/zinc/reva/info.json | 13 + keyboards/zinc/reva/matrix.c | 356 ++++++++++++ keyboards/zinc/reva/reva.c | 6 + keyboards/zinc/reva/reva.h | 44 ++ keyboards/zinc/reva/rules.mk | 4 + keyboards/zinc/reva/serial_config.h | 18 + keyboards/zinc/reva/serial_config_simpleapi.h | 8 + keyboards/zinc/reva/split_scomm.c | 95 +++ keyboards/zinc/reva/split_scomm.h | 24 + keyboards/zinc/reva/split_util.c | 70 +++ keyboards/zinc/reva/split_util.h | 19 + keyboards/zinc/rules.mk | 72 +++ keyboards/zinc/serial.c | 542 ++++++++++++++++++ keyboards/zinc/serial.h | 84 +++ keyboards/zinc/zinc.c | 1 + keyboards/zinc/zinc.h | 14 + 42 files changed, 3671 insertions(+) create mode 100644 keyboards/zinc/config.h create mode 100644 keyboards/zinc/i2c.c create mode 100644 keyboards/zinc/i2c.h create mode 100644 keyboards/zinc/info.json create mode 100644 keyboards/zinc/keymaps/default/config.h create mode 100644 keyboards/zinc/keymaps/default/keymap.c create mode 100644 keyboards/zinc/keymaps/default/readme_jp.md create mode 100644 keyboards/zinc/keymaps/default/rules.mk create mode 100644 keyboards/zinc/keymaps/monks/config.h create mode 100644 keyboards/zinc/keymaps/monks/keymap.c create mode 100644 keyboards/zinc/keymaps/monks/readme_jp.md create mode 100644 keyboards/zinc/keymaps/monks/rules.mk create mode 100644 keyboards/zinc/readme.md create mode 100644 keyboards/zinc/rev1/config.h create mode 100644 keyboards/zinc/rev1/info.json create mode 100644 keyboards/zinc/rev1/matrix.c create mode 100644 keyboards/zinc/rev1/rev1.c create mode 100644 keyboards/zinc/rev1/rev1.h create mode 100644 keyboards/zinc/rev1/rules.mk create mode 100644 keyboards/zinc/rev1/serial_config.h create mode 100644 keyboards/zinc/rev1/serial_config_simpleapi.h create mode 100644 keyboards/zinc/rev1/split_scomm.c create mode 100644 keyboards/zinc/rev1/split_scomm.h create mode 100644 keyboards/zinc/rev1/split_util.c create mode 100644 keyboards/zinc/rev1/split_util.h create mode 100644 keyboards/zinc/reva/config.h create mode 100644 keyboards/zinc/reva/info.json create mode 100644 keyboards/zinc/reva/matrix.c create mode 100644 keyboards/zinc/reva/reva.c create mode 100644 keyboards/zinc/reva/reva.h create mode 100644 keyboards/zinc/reva/rules.mk create mode 100644 keyboards/zinc/reva/serial_config.h create mode 100644 keyboards/zinc/reva/serial_config_simpleapi.h create mode 100644 keyboards/zinc/reva/split_scomm.c create mode 100644 keyboards/zinc/reva/split_scomm.h create mode 100644 keyboards/zinc/reva/split_util.c create mode 100644 keyboards/zinc/reva/split_util.h create mode 100644 keyboards/zinc/rules.mk create mode 100644 keyboards/zinc/serial.c create mode 100644 keyboards/zinc/serial.h create mode 100644 keyboards/zinc/zinc.c create mode 100644 keyboards/zinc/zinc.h diff --git a/keyboards/zinc/config.h b/keyboards/zinc/config.h new file mode 100644 index 000000000..9c60d631b --- /dev/null +++ b/keyboards/zinc/config.h @@ -0,0 +1,50 @@ +/* +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#pragma once +//#ifndef CONFIG_H +//#define CONFIG_H + +#include "config_common.h" + +// GCC include 'config.h" sequence in qmk_firmware/keyboards/zinc/ +// -include keyboards/zinc/config.h +// -include keyboards/zinc/rev?/config.h +// -include keyboards/zinc/rev?/keymaps/MAPNAME/config.h +// XXXX.c + +#include + +// GCC include search path in qmk_firmare/keyboards/zinc/ +// #include "..." search starts here: +// #include <...> search starts here: +// keyboards/zinc/rev?/keymaps/MAPNAME +// keyboards/zinc +// keyboards/zinc/rev? +// . +// ./tmk_core +// ...... + +#ifdef USE_Link_Time_Optimization + // LTO has issues with macros (action_get_macro) and "functions" (fn_actions), + // so just disable them + #define NO_ACTION_MACRO + #define NO_ACTION_FUNCTION +#endif // USE_Link_Time_Optimization + +//#endif /* CONFIG_H */ diff --git a/keyboards/zinc/i2c.c b/keyboards/zinc/i2c.c new file mode 100644 index 000000000..4bee5c639 --- /dev/null +++ b/keyboards/zinc/i2c.c @@ -0,0 +1,162 @@ +#include +#include +#include +#include +#include +#include +#include "i2c.h" + +#ifdef USE_I2C + +// Limits the amount of we wait for any one i2c transaction. +// Since were running SCL line 100kHz (=> 10μs/bit), and each transactions is +// 9 bits, a single transaction will take around 90μs to complete. +// +// (F_CPU/SCL_CLOCK) => # of μC cycles to transfer a bit +// poll loop takes at least 8 clock cycles to execute +#define I2C_LOOP_TIMEOUT (9+1)*(F_CPU/SCL_CLOCK)/8 + +#define BUFFER_POS_INC() (slave_buffer_pos = (slave_buffer_pos+1)%SLAVE_BUFFER_SIZE) + +volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE]; + +static volatile uint8_t slave_buffer_pos; +static volatile bool slave_has_register_set = false; + +// Wait for an i2c operation to finish +inline static +void i2c_delay(void) { + uint16_t lim = 0; + while(!(TWCR & (1<10. + // Check datasheets for more info. + TWBR = ((F_CPU/SCL_CLOCK)-16)/2; +} + +// Start a transaction with the given i2c slave address. The direction of the +// transfer is set with I2C_READ and I2C_WRITE. +// returns: 0 => success +// 1 => error +uint8_t i2c_master_start(uint8_t address) { + TWCR = (1< slave ACK +// 1 => slave NACK +uint8_t i2c_master_write(uint8_t data) { + TWDR = data; + TWCR = (1<= SLAVE_BUFFER_SIZE ) { + ack = 0; + slave_buffer_pos = 0; + } + slave_has_register_set = true; + } else { + i2c_slave_buffer[slave_buffer_pos] = TWDR; + BUFFER_POS_INC(); + } + break; + + case TW_ST_SLA_ACK: + case TW_ST_DATA_ACK: + // master has addressed this device as a slave transmitter and is + // requesting data. + TWDR = i2c_slave_buffer[slave_buffer_pos]; + BUFFER_POS_INC(); + break; + + case TW_BUS_ERROR: // something went wrong, reset twi state + TWCR = 0; + default: + break; + } + // Reset everything, so we are ready for the next TWI interrupt + TWCR |= (1< + +#ifndef F_CPU +#define F_CPU 16000000UL +#endif + +#define I2C_READ 1 +#define I2C_WRITE 0 + +#define I2C_ACK 1 +#define I2C_NACK 0 + +#define SLAVE_BUFFER_SIZE 0x10 + +// i2c SCL clock frequency 400kHz +#define SCL_CLOCK 400000L + +extern volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE]; + +void i2c_master_init(void); +uint8_t i2c_master_start(uint8_t address); +void i2c_master_stop(void); +uint8_t i2c_master_write(uint8_t data); +uint8_t i2c_master_read(int); +void i2c_reset_state(void); +void i2c_slave_init(uint8_t address); + + +static inline unsigned char i2c_start_read(unsigned char addr) { + return i2c_master_start((addr << 1) | I2C_READ); +} + +static inline unsigned char i2c_start_write(unsigned char addr) { + return i2c_master_start((addr << 1) | I2C_WRITE); +} + +// from SSD1306 scrips +extern unsigned char i2c_rep_start(unsigned char addr); +extern void i2c_start_wait(unsigned char addr); +extern unsigned char i2c_readAck(void); +extern unsigned char i2c_readNak(void); +extern unsigned char i2c_read(unsigned char ack); + +#define i2c_read(ack) (ack) ? i2c_readAck() : i2c_readNak(); + +#endif diff --git a/keyboards/zinc/info.json b/keyboards/zinc/info.json new file mode 100644 index 000000000..740f31ae6 --- /dev/null +++ b/keyboards/zinc/info.json @@ -0,0 +1,13 @@ +{ + "keyboard_name": "Zinc", + "url": "https://github.com/monksoffunk/", + "maintainer": "monksoffunk", + "width": 15, + "height": 5, + "layouts": { + "LAYOUT": { + "key_count": 48, + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":9, "y":1}, {"x":10, "y":1}, {"x":11, "y":1}, {"x":12, "y":1}, {"x":13, "y":1}, {"x":14, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2}, {"x":5, "y":2}, {"x":9, "y":2}, {"x":10, "y":2}, {"x":11, "y":2}, {"x":12, "y":2}, {"x":13, "y":2}, {"x":14, "y":2}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":4, "y":3}, {"x":5, "y":3}, {"x":9, "y":3}, {"x":10, "y":3}, {"x":11, "y":3}, {"x":12, "y":3}, {"x":13, "y":3}, {"x":14, "y":3}] + } + } +} diff --git a/keyboards/zinc/keymaps/default/config.h b/keyboards/zinc/keymaps/default/config.h new file mode 100644 index 000000000..4dcb0724f --- /dev/null +++ b/keyboards/zinc/keymaps/default/config.h @@ -0,0 +1,38 @@ +/* +This is the c configuration file for the keymap + +Copyright 2018 monksoffunk +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#pragma once +// if you need more program area, try uncomment follow line +#include "serial_config_simpleapi.h" + +// place overrides here +// Selection of RGBLIGHT MODE to use. +#if defined(LED_ANIMATIONS) + #define RGBLIGHT_EFFECT_BREATHING + #define RGBLIGHT_EFFECT_RAINBOW_MOOD + #define RGBLIGHT_EFFECT_RAINBOW_SWIRL + #define RGBLIGHT_EFFECT_SNAKE + #define RGBLIGHT_EFFECT_KNIGHT + #define RGBLIGHT_EFFECT_CHRISTMAS + #define RGBLIGHT_EFFECT_STATIC_GRADIENT + //#define RGBLIGHT_EFFECT_RGB_TEST + //#define RGBLIGHT_EFFECT_ALTERNATING +#endif diff --git a/keyboards/zinc/keymaps/default/keymap.c b/keyboards/zinc/keymaps/default/keymap.c new file mode 100644 index 000000000..7729914ec --- /dev/null +++ b/keyboards/zinc/keymaps/default/keymap.c @@ -0,0 +1,306 @@ +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +#ifdef RGBLIGHT_ENABLE +//Following line allows macro to read current RGB settings +extern rgblight_config_t rgblight_config; +rgblight_config_t RGB_current_config; +#endif + +extern uint8_t is_master; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +enum layer_number { + _QWERTY = 0, + _COLEMAK, + _DVORAK, + _LOWER, + _RAISE, + _ADJUST +}; + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + LOWER, + RAISE, + ADJUST, + BACKLIT, + KANA, + EISU, + RGBRST +}; + +enum macro_keycodes { + KC_SAMPLEMACRO, +}; + +//Macros +#define M_SAMPLE M(KC_SAMPLEMACRO) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { \ + /* Qwerty + * ,-----------------------------------------. ,-----------------------------------------. + * | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | A | S | D | F | G | | H | J | K | L | ; | ' | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | | N | M | , | . | / |Enter | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Esc |ADJUST| Win | Alt |LOWER |Space | | Space| RAISE| Left | Down | Up | Right| + * `-----------------------------------------' `-----------------------------------------' + */ +[_QWERTY] = LAYOUT_ortho_4x12( + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ + KC_ESC, ADJUST, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ + ), + + /* Colemak + * ,-----------------------------------------. ,-----------------------------------------. + * | Tab | Q | W | F | P | G | | J | L | U | Y | ; | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | A | R | S | T | D | | H | N | E | I | O | ' | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | | K | M | , | . | / |Enter | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Esc |ADJUST| Alt | Win |LOWER |Space | | Space| RAISE| Left | Down | Up | Right| + * `-----------------------------------------' `-----------------------------------------' + */ + [_COLEMAK] = LAYOUT_ortho_4x12( \ + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, \ + KC_LCTL, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ + KC_ESC, ADJUST, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ + ), + + /* Dvorak + * ,-----------------------------------------. ,-----------------------------------------. + * | Tab | ' | , | . | P | Y | | F | G | C | R | L | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | A | O | E | U | I | | D | H | T | N | S | / | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | | B | M | W | V | Z |Enter | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Esc |ADJUST| Alt | Win |LOWER |Space | | Space| RAISE| Left | Down | Up | Right| + * `-----------------------------------------' `-----------------------------------------' + */ + [_DVORAK] = LAYOUT_ortho_4x12( \ + KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_DEL, \ + KC_LCTL, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, \ + KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT , \ + KC_ESC, ADJUST, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ + ), + + /* Lower + * ,-----------------------------------------. ,-----------------------------------------. + * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | - | _ | + | { | } | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | | Home | End | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------' `-----------------------------------------' + */ + [_LOWER] = LAYOUT_ortho_4x12( \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, \ + _______, _______, _______, _______, _______, _______, KC_MINS, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_END, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ + ), + + /* Raise + * ,-----------------------------------------. ,-----------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | F1 | F2 | F3 | F4 | F5 | | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | | F12 | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------' `-----------------------------------------' + */ + [_RAISE] = LAYOUT_ortho_4x12( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \ + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ + ), + + /* Adjust (Lower + Raise) + * ,-----------------------------------------. ,-----------------------------------------. + * | | Reset|RGBRST|Aud on|Audoff| | | |Qwerty|Colemk|Dvorak| | Ins | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | |RGB ON| HUE+ | SAT+ | VAL+ | Mac | | Win | - | = |Print |ScLock|Pause | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | MODE | HUE- | SAT- | VAL- | | | | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | EISU | EISU | EISU | | KANA | KANA | Home |PageDn|PageUp| End | + * `-----------------------------------------' `-----------------------------------------' + */ + [_ADJUST] = LAYOUT_ortho_4x12( \ + _______, RESET, RGBRST, _______, _______, _______, _______, QWERTY, COLEMAK, DVORAK, _______, KC_INS, \ + _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, AG_NORM, AG_SWAP, KC_MINS, KC_EQL, KC_PSCR, KC_SLCK, KC_PAUS,\ + _______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, _______, _______, _______, _______, _______, _______, _______,\ + _______, _______, _______, EISU, EISU, EISU, KANA, KANA, KC_HOME, KC_PGDN, KC_PGUP, KC_END\ + ) +}; + +// define variables for reactive RGB +bool TOG_STATUS = false; + +// Setting ADJUST layer RGB back to default +void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) { + if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) { + #ifdef RGBLIGHT_ENABLE + rgblight_mode_noeeprom(RGB_current_config.mode); + #endif + layer_on(layer3); + } else { + layer_off(layer3); + } +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + set_single_persistent_default_layer(_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + set_single_persistent_default_layer(_DVORAK); + } + return false; + break; + + case LOWER: + if (record->event.pressed) { + //not sure how to have keyboard check mode and set it to a variable, so my work around + //uses another variable that would be set to true after the first time a reactive key is pressed. + if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false + } else { + TOG_STATUS = !TOG_STATUS; + #ifdef RGBLIGHT_ENABLE + rgblight_mode_noeeprom(16); + #endif + } + layer_on(_LOWER); + update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); + } else { + #ifdef RGBLIGHT_ENABLE + rgblight_mode_noeeprom(RGB_current_config.mode); // revert RGB to initial mode prior to RGB mode change + #endif + TOG_STATUS = false; + layer_off(_LOWER); + update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + + case RAISE: + if (record->event.pressed) { + //not sure how to have keyboard check mode and set it to a variable, so my work around + //uses another variable that would be set to true after the first time a reactive key is pressed. + if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false + } else { + TOG_STATUS = !TOG_STATUS; + #ifdef RGBLIGHT_ENABLE + rgblight_mode_noeeprom(15); + #endif + } + layer_on(_RAISE); + update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); + } else { + #ifdef RGBLIGHT_ENABLE + rgblight_mode_noeeprom(RGB_current_config.mode); // revert RGB to initial mode prior to RGB mode change + #endif + layer_off(_RAISE); + TOG_STATUS = false; + update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + break; + //led operations - RGB mode change now updates the RGB_current_mode to allow the right RGB mode to be set after reactive keys are released + case RGB_MOD: + #ifdef RGBLIGHT_ENABLE + if (record->event.pressed) { + rgblight_mode_noeeprom(RGB_current_config.mode); + rgblight_step(); + RGB_current_config.mode = rgblight_config.mode; + } + #endif + return false; + break; + + case EISU: + if (record->event.pressed) { + if(keymap_config.swap_lalt_lgui==false){ + register_code(KC_LANG2); + }else{ + SEND_STRING(SS_LALT("`")); + } + } else { + unregister_code(KC_LANG2); + } + return false; + break; + case KANA: + if (record->event.pressed) { + if(keymap_config.swap_lalt_lgui==false){ + register_code(KC_LANG1); + }else{ + SEND_STRING(SS_LALT("`")); + } + } else { + unregister_code(KC_LANG1); + } + return false; + break; + + case RGBRST: + #ifdef RGBLIGHT_ENABLE + if (record->event.pressed) { + eeconfig_update_rgblight_default(); + rgblight_enable(); + RGB_current_config = rgblight_config; + } + #endif + break; + } + return true; +} + + +void matrix_init_user(void) { + #ifdef RGBLIGHT_ENABLE + rgblight_init(); + RGB_current_config = rgblight_config; + #endif +} + + diff --git a/keyboards/zinc/keymaps/default/readme_jp.md b/keyboards/zinc/keymaps/default/readme_jp.md new file mode 100644 index 000000000..f6e91f0c8 --- /dev/null +++ b/keyboards/zinc/keymaps/default/readme_jp.md @@ -0,0 +1,123 @@ +# The Default Zinc Layout +## 配列 + +### Qwerty配列 + +``` + ,-----------------------------------------. ,-----------------------------------------. + | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | + |------+------+------+------+------+------| |------+------+------+------+------+------| + | Ctrl | A | S | D | F | G | | H | J | K | L | ; | ' | + |------+------+------+------+------+------| |------+------+------+------+------+------| + | Shift| Z | X | C | V | B | | N | M | , | . | / |Enter | + |------+------+------+------+------+------| |------+------+------+------+------+------| + | Esc | Fn | Alt | Win |Lower |Space | | Space| Raise| Left | Down | Up | Right| + `------------------------------------------ ------------------------------------------' +``` + +### Colemak + +``` + ,-----------------------------------------. ,-----------------------------------------. + | Tab | Q | W | F | P | G | | J | L | U | Y | ; | Bksp | + |------+------+------+------+------+------| |------+------+------+------+------+------| + | Ctrl | A | R | S | T | D | | H | N | E | I | O | ' | + |------+------+------+------+------+------| |------+------+------+------+------+------| + | Shift| Z | X | C | V | B | | K | M | , | . | / |Enter | + |------+------+------+------+------+------| |------+------+------+------+------+------| + | Esc |ADJUST| Alt | Win |LOWER |Space | | Space| RAISE| Left | Down | Up | Right| + `------------------------------------------ ------------------------------------------' +``` + +### Dvorak + +``` + ,-----------------------------------------. ,-----------------------------------------. + | Tab | ' | , | . | P | Y | | F | G | C | R | L | Del | + |------+------+------+------+------+------| |------+------+------+------+------+------| + | Ctrl | A | O | E | U | I | | D | H | T | N | S | / | + |------+------+------+------+------+------| |------+------+------+------+------+------| + | Shift| ; | Q | J | K | X | | B | M | W | V | Z |Enter | + |------+------+------+------+------+------| |------+------+------+------+------+------| + | Esc |ADJUST| Alt | Win |LOWER |Space | | Space| RAISE| Left | Down | Up | Right| + `-----------------------------------------' `-----------------------------------------' +``` + + +## コンパイルの仕方 + +コンパイルは、qmk_firmware のトップディレクトリで行います。 + +``` +$ cd qmk_firmware +``` +qmk_firmwareでは各キーボードのコンパイルは、`<キーボード名>:<キーマップ名>`という指定で行います。 + +``` +$ make zinc:default +``` + +キーボードへの書き込みまで同時に行うには下記のように`:avrdude`を付けます。 + +``` +$ make zinc:default:avrdude +``` + +コンパイル結果と中間生成物を消去したい場合は以下のようにします。 + +``` +$ make zinc:default:clean +``` + +## カスタマイズ + +コマンドラインからオプションを指定してビルドすることが出来ます。 + +``` +# Zinc keyboard 'default' keymap: convenient command line option +make ZINC= zinc:defualt +# option= back | under | na | ios +# ex. +# make ZINC=under zinc:defualt +# make ZINC=under,ios zinc:defualt +# make ZINC=back zinc:default +# make ZINC=back,na zinc:default +# make ZINC=back,ios zinc:default +``` + +あるいは`qmk_firmware/keyboards/zinc/rev1/keymaps/default/rules.mk` の以下の部分を直接編集して機能を有効化してください。 + +``` +# Zinc keyboard customize +LED_BACK_ENABLE = no # LED backlight (Enable SK6812mini backlight) +LED_UNDERGLOW_ENABLE = no # LED underglow (Enable WS2812 RGB underlight) +LED_ANIMATIONS = yes # LED animations +IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone) + + +``` + +## RGB backlight を有効にする + +rules.mk の下記の部分を編集して no を yes に変更してください。 +``` +LED_BACK_ENABLE = yes # LED backlight (Enable SK6812mini backlight) +``` + + +## RGB Underglow を有効にする + +rules.mk の下記の部分を編集して no を yes に変更してください。 +``` +LED_UNDERGLOW_ENABLE = yes # LED underglow (Enable WS2812 RGB underlight.) +``` + + +## iPad/iPhoneサポートを有効にする。 + +rules.mk の下記の部分を編集して no を yes に変更してください。 +RBG Underglow や RGBバックライトの輝度を抑えて、iPad, iPhone にも接続できるようになります。 + +``` +IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone) +``` \ No newline at end of file diff --git a/keyboards/zinc/keymaps/default/rules.mk b/keyboards/zinc/keymaps/default/rules.mk new file mode 100644 index 000000000..2dcefc001 --- /dev/null +++ b/keyboards/zinc/keymaps/default/rules.mk @@ -0,0 +1,98 @@ + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SWAP_HANDS_ENABLE = no # Enable one-hand typing + +define ZINC_CUSTOMISE_MSG + $(info Zinc customize) + $(info - LED_BACK_ENABLE=$(LED_BACK_ENABLE)) + $(info - LED_UNDERGLOW_ENABLE=$(LED_UNDERGLOW_ENABLE)) + $(info - LED_ANIMATION=$(LED_ANIMATIONS)) + $(info - IOS_DEVICE_ENABLE=$(IOS_DEVICE_ENABLE)) +endef + +# Zinc keyboard customize +LED_BACK_ENABLE = no # LED backlight (Enable SK6812mini backlight) +LED_UNDERGLOW_ENABLE = no # LED underglow (Enable WS2812 RGB underlight) +LED_ANIMATIONS = yes # LED animations +IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone) +Link_Time_Optimization = no # if firmware size over limit, try this option + +#### LED_BACK_ENABLE and LED_UNDERGLOW_ENABLE. +#### Do not enable these with audio at the same time. + +### Zinc keyboard 'default' keymap: convenient command line option +## make ZINC= zinc:defualt +## option= back | under | na | ios +## ex. +## make ZINC=under zinc:defualt +## make ZINC=under,ios zinc:defualt +## make ZINC=back zinc:default +## make ZINC=back,na zinc:default +## make ZINC=back,ios zinc:default + +ifneq ($(strip $(ZINC)),) + ifeq ($(findstring back,$(ZINC)), back) + LED_BACK_ENABLE = yes + else ifeq ($(findstring under,$(ZINC)), under) + LED_UNDERGLOW_ENABLE = yes + endif + ifeq ($(findstring na,$(ZINC)), na) + LED_ANIMATIONS = no + endif + ifeq ($(findstring ios,$(ZINC)), ios) + IOS_DEVICE_ENABLE = yes + endif + $(eval $(call ZINC_CUSTOMISE_MSG)) + $(info ) +endif + +ifeq ($(strip $(LED_BACK_ENABLE)), yes) + RGBLIGHT_ENABLE = yes + OPT_DEFS += -DRGBLED_BACK + ifeq ($(strip $(LED_UNDERGLOW_ENABLE)), yes) + $(eval $(call ZINC_CUSTOMISE_MSG)) + $(error LED_BACK_ENABLE and LED_UNDERGLOW_ENABLE both 'yes') + endif +else ifeq ($(strip $(LED_UNDERGLOW_ENABLE)), yes) + RGBLIGHT_ENABLE = yes +else + RGBLIGHT_ENABLE = no +endif + +ifeq ($(strip $(IOS_DEVICE_ENABLE)), yes) + OPT_DEFS += -DIOS_DEVICE_ENABLE +endif + +ifeq ($(strip $(LED_ANIMATIONS)), yes) +# OPT_DEFS += -DRGBLIGHT_ANIMATIONS + OPT_DEFS += -DLED_ANIMATIONS + +endif + +ifeq ($(strip $(Link_Time_Optimization)),yes) + EXTRAFLAGS += -flto -DUSE_Link_Time_Optimization +endif + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + + +# Uncomment these for debugging +# $(info -- RGBLIGHT_ENABLE=$(RGBLIGHT_ENABLE)) +# $(info -- OPT_DEFS=$(OPT_DEFS)) +# $(info ) diff --git a/keyboards/zinc/keymaps/monks/config.h b/keyboards/zinc/keymaps/monks/config.h new file mode 100644 index 000000000..4dcb0724f --- /dev/null +++ b/keyboards/zinc/keymaps/monks/config.h @@ -0,0 +1,38 @@ +/* +This is the c configuration file for the keymap + +Copyright 2018 monksoffunk +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#pragma once +// if you need more program area, try uncomment follow line +#include "serial_config_simpleapi.h" + +// place overrides here +// Selection of RGBLIGHT MODE to use. +#if defined(LED_ANIMATIONS) + #define RGBLIGHT_EFFECT_BREATHING + #define RGBLIGHT_EFFECT_RAINBOW_MOOD + #define RGBLIGHT_EFFECT_RAINBOW_SWIRL + #define RGBLIGHT_EFFECT_SNAKE + #define RGBLIGHT_EFFECT_KNIGHT + #define RGBLIGHT_EFFECT_CHRISTMAS + #define RGBLIGHT_EFFECT_STATIC_GRADIENT + //#define RGBLIGHT_EFFECT_RGB_TEST + //#define RGBLIGHT_EFFECT_ALTERNATING +#endif diff --git a/keyboards/zinc/keymaps/monks/keymap.c b/keyboards/zinc/keymaps/monks/keymap.c new file mode 100644 index 000000000..5fd7c6aa8 --- /dev/null +++ b/keyboards/zinc/keymaps/monks/keymap.c @@ -0,0 +1,255 @@ +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +#ifdef RGBLIGHT_ENABLE +//Following line allows macro to read current RGB settings +extern rgblight_config_t rgblight_config; +rgblight_config_t RGB_current_config; +#endif + +extern uint8_t is_master; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +enum layer_number { + _QWERTY = 0, + _LOWER, + _RAISE, + _ADJUST +}; + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + LOWER, + RAISE, + ADJUST, + BACKLIT, + KANA, + EISU, + RGBRST +}; + +enum macro_keycodes { + KC_SAMPLEMACRO, +}; + + +//Macros +#define M_SAMPLE M(KC_SAMPLEMACRO) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { \ + /* Qwerty + * ,-----------------------------------------. ,-----------------------------------------. + * | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | A | S | D | F | G | | H | J | K | L | ; | ' | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | | N | M | , | . | / |Enter | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Esc |ADJUST| Alt | GUI |LOWER |Space | | Space| RAISE| KANA | Left | Down | Right| + * `-----------------------------------------' `-----------------------------------------' + */ +[_QWERTY] = LAYOUT_ortho_4x12( + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ + KC_ESC, ADJUST, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KANA, KC_LEFT, KC_DOWN, KC_RGHT \ + ), + + /* Lower + * ,-----------------------------------------. ,-----------------------------------------. + * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | - | _ | + | { | } | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | | | UP | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | | | | | + * `-----------------------------------------' `-----------------------------------------' + */ + [_LOWER] = LAYOUT_ortho_4x12( \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, \ + _______, _______, _______, _______, _______, _______, KC_MINS, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_UP, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), + + /* Raise + * ,-----------------------------------------. ,-----------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | F1 | F2 | F3 | F4 | F5 | | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | | F12 | | | | ? | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------' `-----------------------------------------' + */ + [_RAISE] = LAYOUT_ortho_4x12( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \ + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, S(KC_SLSH), _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ + ), + + /* Adjust (Lower + Raise) + * ,-----------------------------------------. ,-----------------------------------------. + * | | Reset|RGBRST| | | | | | | | | | Ins | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | |RGB ON| HUE+ | SAT+ | VAL+ | Mac | | Win | - | = |Print |ScLock|Pause | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | MODE | HUE- | SAT- | VAL- | | | | | | |PageUp| | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | EISU | EISU | EISU | | KANA | KANA | KANA | Home |PageDn| End | + * `-----------------------------------------' `-----------------------------------------' + */ + [_ADJUST] = LAYOUT_ortho_4x12( \ + _______, RESET, RGBRST, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS, \ + _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, AG_NORM, AG_SWAP, KC_MINS, KC_EQL, KC_PSCR, KC_SLCK, KC_PAUS,\ + _______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, _______, _______, _______, _______, _______, KC_PGUP, _______,\ + _______, _______, _______, EISU, EISU, EISU, KANA, KANA, KANA, KC_HOME, KC_PGDN, KC_END\ + ) +}; + +// define variables for reactive RGB +bool TOG_STATUS = false; + +// Setting ADJUST layer RGB back to default +void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) { + if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) { + #ifdef RGBLIGHT_ENABLE + rgblight_mode_noeeprom(RGB_current_config.mode); + #endif + layer_on(layer3); + } else { + layer_off(layer3); + } +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + + case LOWER: + if (record->event.pressed) { + //not sure how to have keyboard check mode and set it to a variable, so my work around + //uses another variable that would be set to true after the first time a reactive key is pressed. + if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false + } else { + TOG_STATUS = !TOG_STATUS; + #ifdef RGBLIGHT_ENABLE + rgblight_mode_noeeprom(16); + #endif + } + layer_on(_LOWER); + update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); + } else { + #ifdef RGBLIGHT_ENABLE + rgblight_mode_noeeprom(RGB_current_config.mode); // revert RGB to initial mode prior to RGB mode change + #endif + TOG_STATUS = false; + layer_off(_LOWER); + update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + + case RAISE: + if (record->event.pressed) { + //not sure how to have keyboard check mode and set it to a variable, so my work around + //uses another variable that would be set to true after the first time a reactive key is pressed. + if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false + } else { + TOG_STATUS = !TOG_STATUS; + #ifdef RGBLIGHT_ENABLE + rgblight_mode_noeeprom(15); + #endif + } + layer_on(_RAISE); + update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); + } else { + #ifdef RGBLIGHT_ENABLE + rgblight_mode_noeeprom(RGB_current_config.mode); // revert RGB to initial mode prior to RGB mode change + #endif + layer_off(_RAISE); + TOG_STATUS = false; + update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + break; + //led operations - RGB mode change now updates the RGB_current_mode to allow the right RGB mode to be set after reactive keys are released + case RGB_MOD: + #ifdef RGBLIGHT_ENABLE + if (record->event.pressed) { + rgblight_mode_noeeprom(RGB_current_config.mode); + rgblight_step(); + RGB_current_config.mode = rgblight_config.mode; + } + #endif + return false; + break; + + case EISU: + if (record->event.pressed) { + if(keymap_config.swap_lalt_lgui==false){ + register_code(KC_LANG2); + }else{ + SEND_STRING(SS_LALT("`")); + } + } else { + unregister_code(KC_LANG2); + } + return false; + break; + case KANA: + if (record->event.pressed) { + if(keymap_config.swap_lalt_lgui==false){ + register_code(KC_LANG1); + }else{ + SEND_STRING(SS_LALT("`")); + } + } else { + unregister_code(KC_LANG1); + } + return false; + break; + + case RGBRST: + #ifdef RGBLIGHT_ENABLE + if (record->event.pressed) { + eeconfig_update_rgblight_default(); + rgblight_enable(); + RGB_current_config = rgblight_config; + } + #endif + break; + } + return true; +} + + +void matrix_init_user(void) { + #ifdef RGBLIGHT_ENABLE + rgblight_init(); + RGB_current_config = rgblight_config; + #endif +} diff --git a/keyboards/zinc/keymaps/monks/readme_jp.md b/keyboards/zinc/keymaps/monks/readme_jp.md new file mode 100644 index 000000000..680e2866c --- /dev/null +++ b/keyboards/zinc/keymaps/monks/readme_jp.md @@ -0,0 +1,103 @@ +# monksoffunk's personal zinc Layout +## 配列 + +### Qwerty配列 + +``` + ,-----------------------------------------. ,-----------------------------------------. + | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | + |------+------+------+------+------+------| |------+------+------+------+------+------| + | Ctrl | A | S | D | F | G | | H | J | K | L | ; | ' | + |------+------+------+------+------+------| |------+------+------+------+------+------| + | Shift| Z | X | C | V | B | | N | M | , | . | / |Enter | + |------+------+------+------+------+------| |------+------+------+------+------+------| + | Esc |ADJUST| Alt | GUI |LOWER |Space | | Space| RAISE| KANA | Left | Down | Right| + `------------------------------------------ ------------------------------------------' +``` + +KANAキーを独立させ、UPキーをLOWER+スラッシュに当てています。そのほかデフォルトからレイヤーをかなりいじっています。 +また、RGB LEDがアンコメントしてありますので、実装していない場合はソースを見て適宜コメントアウトしてください。 + +## コンパイルの仕方 + +コンパイルは、qmk_firmware のトップディレクトリで行います。 + +``` +$ cd qmk_firmware +``` +qmk_firmwareでは各キーボードのコンパイルは、`<キーボード名>:<キーマップ名>`という指定で行います。 + +``` +$ make zinc:monks +``` + +キーボードへの書き込みまで同時に行うには下記のように`:avrdude`を付けます。 + +``` +$ make zinc:monks:avrdude +``` + +コンパイル結果と中間生成物を消去したい場合は以下のようにします。 + +``` +$ make zinc:monks:clean +``` + +なお、avrdudeではなくQMK Toolbox(GUIツール)を使う方法もあります。 + +https://github.com/qmk/qmk_toolbox/releases + +その場合は、$ make zinc:monksでビルドした成果物をQMK Toolboxから指定してください。 + +## カスタマイズ + +コマンドラインからオプションを指定してビルドすることが出来ます。 + +``` +# Zinc keyboard 'monks' keymap: convenient command line option +make ZINC= zinc:monks +# option= back | under | na | ios +# ex. +# make ZINC=under zinc:monks +# make ZINC=under,ios zinc:monks +# make ZINC=back zinc:monks +# make ZINC=back,na zinc:monks +# make ZINC=back,ios zinc:monks +``` + +あるいは`qmk_firmware/keyboards/zinc/rev1/keymaps/monks/rules.mk` の以下の部分を編集して機能を有効化してください。 + +``` +# Zinc keyboard customize +LED_BACK_ENABLE = no # LED backlight (Enable SK6812mini backlight) +LED_UNDERGLOW_ENABLE = no # LED underglow (Enable WS2812 RGB underlight) +LED_ANIMATIONS = yes # LED animations +IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone) + + +``` + +## RGB backlight を有効にする + +rules.mk の下記の部分を編集して no を yes に変更してください。 +``` +LED_BACK_ENABLE = yes # LED backlight (Enable SK6812mini backlight) +``` + + +## RGB Underglow を有効にする + +rules.mk の下記の部分を編集して no を yes に変更してください。 +``` +LED_UNDERGLOW_ENABLE = yes # LED underglow (Enable WS2812 RGB underlight) +``` + + +## iPad/iPhoneサポートを有効にする。 + +rules.mk の下記の部分を編集して no を yes に変更してください。 +RBG Underglow や RGBバックライトの輝度を抑えて、iPad, iPhone にも接続できるようになります。 + +``` +IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone) +``` \ No newline at end of file diff --git a/keyboards/zinc/keymaps/monks/rules.mk b/keyboards/zinc/keymaps/monks/rules.mk new file mode 100644 index 000000000..a5335def8 --- /dev/null +++ b/keyboards/zinc/keymaps/monks/rules.mk @@ -0,0 +1,100 @@ + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SWAP_HANDS_ENABLE = no # Enable one-hand typing + +define ZINC_CUSTOMISE_MSG + $(info Zinc customize) + $(info - LED_BACK_ENABLE=$(LED_BACK_ENABLE)) + $(info - LED_UNDERGLOW_ENABLE=$(LED_UNDERGLOW_ENABLE)) + $(info - LED_ANIMATION=$(LED_ANIMATIONS)) + $(info - IOS_DEVICE_ENABLE=$(IOS_DEVICE_ENABLE)) +endef + +# Zinc keyboard customize +LED_BACK_ENABLE = no # LED backlight (Enable SK6812mini backlight) +LED_UNDERGLOW_ENABLE = no # LED underglow (Enable WS2812 RGB underlight) +LED_ANIMATIONS = yes # LED animations +IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone) +Link_Time_Optimization = no # if firmware size over limit, try this option + +#### LED_BACK_ENABLE and LED_UNDERGLOW_ENABLE. +#### Do not enable these with audio at the same time. + +### Zinc keyboard 'default' keymap: convenient command line option +## make ZINC= zinc:defualt +## option= back | under | na | ios +## ex. +## make ZINC=under zinc:defualt +## make ZINC=under,ios zinc:defualt +## make ZINC=back zinc:default +## make ZINC=back,na zinc:default +## make ZINC=back,ios zinc:default + +ifneq ($(strip $(ZINC)),) + ifeq ($(findstring back,$(ZINC)), back) + LED_BACK_ENABLE = yes + else ifeq ($(findstring under,$(ZINC)), under) + LED_UNDERGLOW_ENABLE = yes + endif + ifeq ($(findstring na,$(ZINC)), na) + LED_ANIMATIONS = no + endif + ifeq ($(findstring ios,$(ZINC)), ios) + IOS_DEVICE_ENABLE = yes + endif + $(eval $(call ZINC_CUSTOMISE_MSG)) + $(info ) +endif + +ifeq ($(strip $(LED_BACK_ENABLE)), yes) + RGBLIGHT_ENABLE = yes + OPT_DEFS += -DRGBLED_BACK + ifeq ($(strip $(LED_UNDERGLOW_ENABLE)), yes) + $(eval $(call ZINC_CUSTOMISE_MSG)) + $(error LED_BACK_ENABLE and LED_UNDERGLOW_ENABLE both 'yes') + endif +else ifeq ($(strip $(LED_UNDERGLOW_ENABLE)), yes) + RGBLIGHT_ENABLE = yes +else + RGBLIGHT_ENABLE = no +endif + +ifeq ($(strip $(IOS_DEVICE_ENABLE)), yes) + OPT_DEFS += -DIOS_DEVICE_ENABLE +endif + +ifeq ($(strip $(LED_ANIMATIONS)), yes) +# OPT_DEFS += -DRGBLIGHT_ANIMATIONS + OPT_DEFS += -DLED_ANIMATIONS +endif + +ifeq ($(strip $(Link_Time_Optimization)),yes) + EXTRAFLAGS += -flto -DUSE_Link_Time_Optimization +endif + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif + +# Uncomment these for debugging +# $(info -- RGBLIGHT_ENABLE=$(RGBLIGHT_ENABLE)) +# $(info -- OPT_DEFS=$(OPT_DEFS)) +# $(info ) diff --git a/keyboards/zinc/readme.md b/keyboards/zinc/readme.md new file mode 100644 index 000000000..3b4ce105c --- /dev/null +++ b/keyboards/zinc/readme.md @@ -0,0 +1,17 @@ +Zinc +=== + +![Zinc](https://i.imgur.com/vxlpWkD.jpg) + +40% row-staggered split keyboard. + +Keyboard Maintainer: [monksoffunk](https://github.com/monksoffunk/) [@monksoffunkJP](https://twitter.com/monksoffunkJP) +Hardware Supported: Zinc PCB +Hardware Availability: (https://twitter.com/monksoffunkJP) + +Make example for this keyboard (after setting up your build environment): + + make zinc:default + + +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). diff --git a/keyboards/zinc/rev1/config.h b/keyboards/zinc/rev1/config.h new file mode 100644 index 000000000..c628400f2 --- /dev/null +++ b/keyboards/zinc/rev1/config.h @@ -0,0 +1,149 @@ +/* +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#pragma once + +//#ifndef REV1_CONFIG_H +//#define REV1_CONFIG_H + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x9991 +#define DEVICE_VER 0x0001 +#define MANUFACTURER monksoffunk +#define PRODUCT zinc rev.1 +#define DESCRIPTION A split keyboard + + +#define PREVENT_STUCK_MODIFIERS +#define TAPPING_FORCE_HOLD +#define TAPPING_TERM 100 + +/* Use I2C or Serial */ +//#define USE_I2C +#define USE_SERIAL +//#define USE_MATRIX_I2C + +/* Select hand configuration */ +#define MASTER_LEFT +//#define MASTER_RIGHT +//#define EE_HANDS + + +/* key matrix size */ +// Rows are doubled-up + #define MATRIX_ROWS 8 + #define MATRIX_ROW_PINS { F6, F7, B1, B3 } + +// wiring of each half +#define MATRIX_COLS 6 +#define MATRIX_COL_PINS { F4, D4, C6, D7, E6, B4 } + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ +// #define BACKLIGHT_LEVELS 3 + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCING_DELAY 5 + +/* 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 + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* ws2812 RGB LED */ +#define RGB_DI_PIN D3 +#define RGBLIGHT_TIMER +//#define RGBLED_NUM 12 // Number of LEDs. see ./keymaps/default/config.h +#define ws2812_PORTREG PORTD +#define ws2812_DDRREG DDRD + +// RGB LED support +//#define RGBLIGHT_ANIMATIONS : see ./rules.mk: LED_ANIMATIONS = yes or no +// see ./rules.mk: LED_BACK_ENABLE or LED_UNDERGLOW_ENABLE set yes +#ifdef RGBLED_BACK + #define RGBLED_NUM 24 +#else + #define RGBLED_NUM 6 +#endif + +#ifndef IOS_DEVICE_ENABLE + #if RGBLED_NUM <= 6 + #define RGBLIGHT_LIMIT_VAL 255 + #else + #if RGBLED_NUM <= 16 + #define RGBLIGHT_LIMIT_VAL 130 + #else + #define RGBLIGHT_LIMIT_VAL 120 + #endif + #endif + #define RGBLIGHT_VAL_STEP 17 +#else + #if RGBLED_NUM <= 6 + #define RGBLIGHT_LIMIT_VAL 90 + #else + #if RGBLED_NUM <= 16 + #define RGBLIGHT_LIMIT_VAL 45 + #else + #define RGBLIGHT_LIMIT_VAL 35 + #endif + #endif + #define RGBLIGHT_VAL_STEP 4 +#endif +#define RGBLIGHT_HUE_STEP 10 +#define RGBLIGHT_SAT_STEP 17 + +#if defined(RGBLIGHT_ENABLE) && !defined(IOS_DEVICE_ENABLE) +// USB_MAX_POWER_CONSUMPTION value +// 120 RGBoff +// 330 RGB 6 +// 300 RGB 32 + #define USB_MAX_POWER_CONSUMPTION 400 +#else + // fix iPhone and iPad power adapter issue + // iOS device need lessthan 100 + #define USB_MAX_POWER_CONSUMPTION 100 +#endif + +/* + * 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 + + +//#endif diff --git a/keyboards/zinc/rev1/info.json b/keyboards/zinc/rev1/info.json new file mode 100644 index 000000000..0ca8acded --- /dev/null +++ b/keyboards/zinc/rev1/info.json @@ -0,0 +1,13 @@ +{ + "keyboard_name": "Zinc rev.1", + "url": "https://github.com/monksoffunk/zinc", + "maintainer": "monksoffunk", + "width": 15, + "height": 4, + "layouts": { + "LAYOUT": { + "key_count": 48, + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":9, "y":1}, {"x":10, "y":1}, {"x":11, "y":1}, {"x":12, "y":1}, {"x":13, "y":1}, {"x":14, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2}, {"x":5, "y":2}, {"x":9, "y":2}, {"x":10, "y":2}, {"x":11, "y":2}, {"x":12, "y":2}, {"x":13, "y":2}, {"x":14, "y":2}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":4, "y":3}, {"x":5, "y":3}, {"x":9, "y":3}, {"x":10, "y":3}, {"x":11, "y":3}, {"x":12, "y":3}, {"x":13, "y":3}, {"x":14, "y":3}] + } + } +} diff --git a/keyboards/zinc/rev1/matrix.c b/keyboards/zinc/rev1/matrix.c new file mode 100644 index 000000000..220954f05 --- /dev/null +++ b/keyboards/zinc/rev1/matrix.c @@ -0,0 +1,356 @@ +/* +Copyright 2012 Jun Wako + +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 . +*/ + +/* + * scan matrix + */ +#include +#include +#include +#include +#include +#include +#include +#include "print.h" +#include "debug.h" +#include "util.h" +#include "matrix.h" +#include "split_util.h" +#include "pro_micro.h" + +#ifdef USE_MATRIX_I2C +# include "i2c.h" +#else // USE_SERIAL +# include "split_scomm.h" +#endif + +#ifndef DEBOUNCE +# define DEBOUNCE 5 +#endif + +#define ERROR_DISCONNECT_COUNT 5 + +static uint8_t debouncing = DEBOUNCE; +static const int ROWS_PER_HAND = MATRIX_ROWS/2; +static uint8_t error_count = 0; +uint8_t is_master = 0 ; + +static const uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; +static const uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; + +/* matrix state(1:on, 0:off) */ +static matrix_row_t matrix[MATRIX_ROWS]; +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; + +static matrix_row_t read_cols(void); +static void init_cols(void); +static void unselect_rows(void); +static void select_row(uint8_t row); +static uint8_t matrix_master_scan(void); + + +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + +inline +uint8_t matrix_rows(void) +{ + return MATRIX_ROWS; +} + +inline +uint8_t matrix_cols(void) +{ + return MATRIX_COLS; +} + +void matrix_init(void) +{ + debug_enable = true; + debug_matrix = true; + debug_mouse = true; + // initialize row and col + unselect_rows(); + init_cols(); + + TX_RX_LED_INIT; + TXLED0; + RXLED0; + + // initialize matrix state: all keys off + for (uint8_t i=0; i < MATRIX_ROWS; i++) { + matrix[i] = 0; + matrix_debouncing[i] = 0; + } + + is_master = has_usb(); + + matrix_init_quantum(); +} + +uint8_t _matrix_scan(void) +{ + // Right hand is stored after the left in the matirx so, we need to offset it + int offset = isLeftHand ? 0 : (ROWS_PER_HAND); + + for (uint8_t i = 0; i < ROWS_PER_HAND; i++) { + select_row(i); + _delay_us(30); // without this wait read unstable value. + matrix_row_t cols = read_cols(); + if (matrix_debouncing[i+offset] != cols) { + matrix_debouncing[i+offset] = cols; + debouncing = DEBOUNCE; + } + unselect_rows(); + } + + if (debouncing) { + if (--debouncing) { + _delay_ms(1); + } else { + for (uint8_t i = 0; i < ROWS_PER_HAND; i++) { + matrix[i+offset] = matrix_debouncing[i+offset]; + } + } + } + + return 1; +} + +#ifdef USE_MATRIX_I2C + +// Get rows from other half over i2c +int i2c_transaction(void) { + int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; + + int err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_WRITE); + if (err) goto i2c_error; + + // start of matrix stored at 0x00 + err = i2c_master_write(0x00); + if (err) goto i2c_error; + + // Start read + err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_READ); + if (err) goto i2c_error; + + if (!err) { + int i; + for (i = 0; i < ROWS_PER_HAND-1; ++i) { + matrix[slaveOffset+i] = i2c_master_read(I2C_ACK); + } + matrix[slaveOffset+i] = i2c_master_read(I2C_NACK); + i2c_master_stop(); + } else { +i2c_error: // the cable is disconnceted, or something else went wrong + i2c_reset_state(); + return err; + } + + return 0; +} + +#else // USE_SERIAL + +int serial_transaction(int master_changed) { + int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; +#ifdef SERIAL_USE_MULTI_TRANSACTION + int ret=serial_update_buffers(master_changed); +#else + int ret=serial_update_buffers(); +#endif + if (ret ) { + if(ret==2) RXLED1; + return 1; + } + RXLED0; + memcpy(&matrix[slaveOffset], + (void *)serial_slave_buffer, sizeof(serial_slave_buffer)); + return 0; +} +#endif + +uint8_t matrix_scan(void) +{ + if (is_master) { + matrix_master_scan(); + }else{ + matrix_slave_scan(); + int offset = (isLeftHand) ? ROWS_PER_HAND : 0; + memcpy(&matrix[offset], + (void *)serial_master_buffer, sizeof(serial_master_buffer)); + matrix_scan_quantum(); + } + return 1; +} + + +uint8_t matrix_master_scan(void) { + + int ret = _matrix_scan(); + int mchanged = 1; + int offset = (isLeftHand) ? 0 : ROWS_PER_HAND; + +#ifdef USE_MATRIX_I2C +// for (int i = 0; i < ROWS_PER_HAND; ++i) { + /* i2c_slave_buffer[i] = matrix[offset+i]; */ +// i2c_slave_buffer[i] = matrix[offset+i]; +// } +#else // USE_SERIAL + #ifdef SERIAL_USE_MULTI_TRANSACTION + mchanged = memcmp((void *)serial_master_buffer, + &matrix[offset], sizeof(serial_master_buffer)); + #endif + memcpy((void *)serial_master_buffer, + &matrix[offset], sizeof(serial_master_buffer)); +#endif + +#ifdef USE_MATRIX_I2C + if( i2c_transaction() ) { +#else // USE_SERIAL + if( serial_transaction(mchanged) ) { +#endif + // turn on the indicator led when halves are disconnected + TXLED1; + + error_count++; + + if (error_count > ERROR_DISCONNECT_COUNT) { + // reset other half if disconnected + int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; + for (int i = 0; i < ROWS_PER_HAND; ++i) { + matrix[slaveOffset+i] = 0; + } + } + } else { + // turn off the indicator led on no error + TXLED0; + error_count = 0; + } + matrix_scan_quantum(); + return ret; +} + +void matrix_slave_scan(void) { + _matrix_scan(); + + int offset = (isLeftHand) ? 0 : ROWS_PER_HAND; + +#ifdef USE_MATRIX_I2C + for (int i = 0; i < ROWS_PER_HAND; ++i) { + /* i2c_slave_buffer[i] = matrix[offset+i]; */ + i2c_slave_buffer[i] = matrix[offset+i]; + } +#else // USE_SERIAL + #ifdef SERIAL_USE_MULTI_TRANSACTION + int change = 0; + #endif + for (int i = 0; i < ROWS_PER_HAND; ++i) { + #ifdef SERIAL_USE_MULTI_TRANSACTION + if( serial_slave_buffer[i] != matrix[offset+i] ) + change = 1; + #endif + serial_slave_buffer[i] = matrix[offset+i]; + } + #ifdef SERIAL_USE_MULTI_TRANSACTION + slave_buffer_change_count += change; + #endif +#endif +} + +bool matrix_is_modified(void) +{ + if (debouncing) return false; + return true; +} + +inline +bool matrix_is_on(uint8_t row, uint8_t col) +{ + return (matrix[row] & ((matrix_row_t)1<> 4) + 1) &= ~_BV(col_pins[x] & 0xF); + _SFR_IO8((col_pins[x] >> 4) + 2) |= _BV(col_pins[x] & 0xF); + } +} + +static matrix_row_t read_cols(void) +{ + matrix_row_t result = 0; + for(int x = 0; x < MATRIX_COLS; x++) { + result |= (_SFR_IO8(col_pins[x] >> 4) & _BV(col_pins[x] & 0xF)) ? 0 : (1 << x); + } + return result; +} + +static void unselect_rows(void) +{ + for(int x = 0; x < ROWS_PER_HAND; x++) { + _SFR_IO8((row_pins[x] >> 4) + 1) &= ~_BV(row_pins[x] & 0xF); + _SFR_IO8((row_pins[x] >> 4) + 2) |= _BV(row_pins[x] & 0xF); + } +} + +static void select_row(uint8_t row) +{ + _SFR_IO8((row_pins[row] >> 4) + 1) |= _BV(row_pins[row] & 0xF); + _SFR_IO8((row_pins[row] >> 4) + 2) &= ~_BV(row_pins[row] & 0xF); +} diff --git a/keyboards/zinc/rev1/rev1.c b/keyboards/zinc/rev1/rev1.c new file mode 100644 index 000000000..2ce08a07c --- /dev/null +++ b/keyboards/zinc/rev1/rev1.c @@ -0,0 +1,6 @@ +#include "zinc.h" + +void matrix_init_kb(void) { + matrix_init_user(); +}; + diff --git a/keyboards/zinc/rev1/rev1.h b/keyboards/zinc/rev1/rev1.h new file mode 100644 index 000000000..933e635c2 --- /dev/null +++ b/keyboards/zinc/rev1/rev1.h @@ -0,0 +1,44 @@ +#pragma once + +#include "../zinc.h" + +//void promicro_bootloader_jmp(bool program); +#include "quantum.h" + +#ifdef RGBLIGHT_ENABLE +//rgb led driver +#include "ws2812.h" +#endif + +#ifdef USE_I2C +#include +#ifdef __AVR__ + #include + #include +#endif +#endif + +//void promicro_bootloader_jmp(bool program); + + + +// Standard Keymap +// (TRRS jack on both halves are to the left side) +#define LAYOUT( \ + L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \ + L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \ + L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \ + L30, L31, L32, L33, L34, L35, R30, R31, R32, R33, R34, R35 \ + ) \ + { \ + { L00, L01, L02, L03, L04, L05}, \ + { L10, L11, L12, L13, L14, L15}, \ + { L20, L21, L22, L23, L24, L25}, \ + { L30, L31, L32, L33, L34, L35}, \ + { R00, R01, R02, R03, R04, R05 }, \ + { R10, R11, R12, R13, R14, R15 }, \ + { R20, R21, R22, R23, R24, R25 }, \ + { R30, R31, R32, R33, R34, R35 }, \ + } + +#define LAYOUT_ortho_4x12 LAYOUT diff --git a/keyboards/zinc/rev1/rules.mk b/keyboards/zinc/rev1/rules.mk new file mode 100644 index 000000000..e78b9258d --- /dev/null +++ b/keyboards/zinc/rev1/rules.mk @@ -0,0 +1,4 @@ +SRC += rev1/matrix.c +SRC += rev1/split_util.c +SRC += rev1/split_scomm.c +SRC += ws2812.c diff --git a/keyboards/zinc/rev1/serial_config.h b/keyboards/zinc/rev1/serial_config.h new file mode 100644 index 000000000..9fb5dfc67 --- /dev/null +++ b/keyboards/zinc/rev1/serial_config.h @@ -0,0 +1,18 @@ +#ifndef SOFT_SERIAL_CONFIG_H +#define SOFT_SERIAL_CONFIG_H + +#ifndef SOFT_SERIAL_PIN +/* Soft Serial defines */ +#define SOFT_SERIAL_PIN D2 +// OPTIONAL: #define SELECT_SOFT_SERIAL_SPEED ? // ? = 1,2,3,4,5 +// // 1: about 137kbps (default) +// // 2: about 75kbps +// // 3: about 39kbps +// // 4: about 26kbps +// // 5: about 20kbps +#endif + +//// USE flexible API (using multi-type transaction function) +#define SERIAL_USE_MULTI_TRANSACTION + +#endif /* SOFT_SERIAL_CONFIG_H */ diff --git a/keyboards/zinc/rev1/serial_config_simpleapi.h b/keyboards/zinc/rev1/serial_config_simpleapi.h new file mode 100644 index 000000000..e2d22a41e --- /dev/null +++ b/keyboards/zinc/rev1/serial_config_simpleapi.h @@ -0,0 +1,8 @@ +#ifndef SERIAL_CONFIG_SIMPLEAPI_H +#define SERIAL_CONFIG_SIMPLEAPI_H + +#undef SERIAL_USE_MULTI_TRANSACTION +#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 +#define SERIAL_MASTER_BUFFER_LENGTH MATRIX_ROWS/2 + +#endif // SERIAL_CONFIG_SIMPLEAPI_H diff --git a/keyboards/zinc/rev1/split_scomm.c b/keyboards/zinc/rev1/split_scomm.c new file mode 100644 index 000000000..50d233ce9 --- /dev/null +++ b/keyboards/zinc/rev1/split_scomm.c @@ -0,0 +1,95 @@ +#ifdef USE_SERIAL +#ifdef SERIAL_USE_MULTI_TRANSACTION +/* --- USE flexible API (using multi-type transaction function) --- */ + +#include +#include +#include +#include +#include "serial.h" +#ifdef SERIAL_DEBUG_MODE +#include +#endif +#ifdef CONSOLE_ENABLE + #include +#endif + +uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; +uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0}; +uint8_t volatile status_com = 0; +uint8_t volatile status1 = 0; +uint8_t slave_buffer_change_count = 0; +uint8_t s_change_old = 0xff; +uint8_t s_change_new = 0xff; + +SSTD_t transactions[] = { +#define GET_SLAVE_STATUS 0 + /* master buffer not changed, only recive slave_buffer_change_count */ + { (uint8_t *)&status_com, + 0, NULL, + sizeof(slave_buffer_change_count), &slave_buffer_change_count, + }, +#define PUT_MASTER_GET_SLAVE_STATUS 1 + /* master buffer changed need send, and recive slave_buffer_change_count */ + { (uint8_t *)&status_com, + sizeof(serial_master_buffer), (uint8_t *)serial_master_buffer, + sizeof(slave_buffer_change_count), &slave_buffer_change_count, + }, +#define GET_SLAVE_BUFFER 2 + /* recive serial_slave_buffer */ + { (uint8_t *)&status1, + 0, NULL, + sizeof(serial_slave_buffer), (uint8_t *)serial_slave_buffer + } +}; + +void serial_master_init(void) +{ + soft_serial_initiator_init(transactions, TID_LIMIT(transactions)); +} + +void serial_slave_init(void) +{ + soft_serial_target_init(transactions, TID_LIMIT(transactions)); +} + +// 0 => no error +// 1 => slave did not respond +// 2 => checksum error +int serial_update_buffers(int master_update) +{ + int status, smatstatus; + static int need_retry = 0; + + if( s_change_old != s_change_new ) { + smatstatus = soft_serial_transaction(GET_SLAVE_BUFFER); + if( smatstatus == TRANSACTION_END ) { + s_change_old = s_change_new; +#ifdef CONSOLE_ENABLE + uprintf("slave matrix = %b %b %b %b %b\n", + serial_slave_buffer[0], serial_slave_buffer[1], + serial_slave_buffer[2], serial_slave_buffer[3], + serial_slave_buffer[4] ); +#endif + } + } else { + // serial_slave_buffer dosen't change + smatstatus = TRANSACTION_END; // dummy status + } + + if( !master_update && !need_retry) { + status = soft_serial_transaction(GET_SLAVE_STATUS); + } else { + status = soft_serial_transaction(PUT_MASTER_GET_SLAVE_STATUS); + } + if( status == TRANSACTION_END ) { + s_change_new = slave_buffer_change_count; + need_retry = 0; + } else { + need_retry = 1; + } + return smatstatus; +} + +#endif // SERIAL_USE_MULTI_TRANSACTION +#endif /* USE_SERIAL */ diff --git a/keyboards/zinc/rev1/split_scomm.h b/keyboards/zinc/rev1/split_scomm.h new file mode 100644 index 000000000..873d8939d --- /dev/null +++ b/keyboards/zinc/rev1/split_scomm.h @@ -0,0 +1,24 @@ +#ifndef SPLIT_COMM_H +#define SPLIT_COMM_H + +#ifndef SERIAL_USE_MULTI_TRANSACTION +/* --- USE Simple API (OLD API, compatible with let's split serial.c) --- */ +#include "serial.h" + +#else +/* --- USE flexible API (using multi-type transaction function) --- */ +// Buffers for master - slave communication +#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 +#define SERIAL_MASTER_BUFFER_LENGTH MATRIX_ROWS/2 + +extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH]; +extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH]; +extern uint8_t slave_buffer_change_count; + +void serial_master_init(void); +void serial_slave_init(void); +int serial_update_buffers(int master_changed); + +#endif + +#endif /* SPLIT_COMM_H */ diff --git a/keyboards/zinc/rev1/split_util.c b/keyboards/zinc/rev1/split_util.c new file mode 100644 index 000000000..e1ff8b437 --- /dev/null +++ b/keyboards/zinc/rev1/split_util.c @@ -0,0 +1,70 @@ +#include +#include +#include +#include +#include +#include +#include "split_util.h" +#include "matrix.h" +#include "keyboard.h" + +#ifdef USE_MATRIX_I2C +# include "i2c.h" +#else +# include "split_scomm.h" +#endif + +volatile bool isLeftHand = true; + +static void setup_handedness(void) { + #ifdef EE_HANDS + isLeftHand = eeprom_read_byte(EECONFIG_HANDEDNESS); + #else + // I2C_MASTER_RIGHT is deprecated, use MASTER_RIGHT instead, since this works for both serial and i2c + #if defined(I2C_MASTER_RIGHT) || defined(MASTER_RIGHT) + isLeftHand = !has_usb(); + #else + isLeftHand = has_usb(); + #endif + #endif +} + +static void keyboard_master_setup(void) { + +#ifdef USE_MATRIX_I2C + i2c_master_init(); +#else + serial_master_init(); +#endif +} + +static void keyboard_slave_setup(void) { + +#ifdef USE_MATRIX_I2C + i2c_slave_init(SLAVE_I2C_ADDRESS); +#else + serial_slave_init(); +#endif +} + +bool has_usb(void) { + USBCON |= (1 << OTGPADE); //enables VBUS pad + _delay_us(5); + return (USBSTA & (1< +#include "eeconfig.h" + +#define SLAVE_I2C_ADDRESS 0x32 + +extern volatile bool isLeftHand; + +// slave version of matix scan, defined in matrix.c +void matrix_slave_scan(void); + +void split_keyboard_setup(void); +bool has_usb(void); + +void matrix_master_OLED_init (void); + +#endif diff --git a/keyboards/zinc/reva/config.h b/keyboards/zinc/reva/config.h new file mode 100644 index 000000000..158051890 --- /dev/null +++ b/keyboards/zinc/reva/config.h @@ -0,0 +1,143 @@ +/* +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#pragma once + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x9991 +#define DEVICE_VER 0x0001 +#define MANUFACTURER monksoffunk +#define PRODUCT zinc rev.A +#define DESCRIPTION A split keyboard + + +#define PREVENT_STUCK_MODIFIERS +#define TAPPING_FORCE_HOLD +#define TAPPING_TERM 100 + +/* Use I2C or Serial */ +//#define USE_I2C +#define USE_SERIAL +//#define USE_MATRIX_I2C + +/* Select hand configuration */ +#define MASTER_LEFT +//#define MASTER_RIGHT +//#define EE_HANDS + + +/* key matrix size */ +// Rows are doubled-up + #define MATRIX_ROWS 8 + #define MATRIX_ROW_PINS { D4, C6, D7, E6 } + +// wiring of each half +#define MATRIX_COLS 6 +#define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3} + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ +// #define BACKLIGHT_LEVELS 3 + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCING_DELAY 5 + +/* 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 + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* ws2812 RGB LED */ +#define RGB_DI_PIN D3 +#define RGBLIGHT_TIMER +//#define RGBLED_NUM 24 // Number of LEDs. see ./keymaps/default/config.h +#define ws2812_PORTREG PORTD +#define ws2812_DDRREG DDRD + +// RGB LED support +//#define RGBLIGHT_ANIMATIONS : see ./rules.mk: LED_ANIMATIONS = yes or no +// see ./rules.mk: LED_BACK_ENABLE or LED_UNDERGLOW_ENABLE set yes +#ifdef RGBLED_BACK + #define RGBLED_NUM 24 +#else + #define RGBLED_NUM 6 +#endif + +#ifndef IOS_DEVICE_ENABLE + #if RGBLED_NUM <= 6 + #define RGBLIGHT_LIMIT_VAL 255 + #else + #if RGBLED_NUM <= 16 + #define RGBLIGHT_LIMIT_VAL 130 + #else + #define RGBLIGHT_LIMIT_VAL 120 + #endif + #endif + #define RGBLIGHT_VAL_STEP 17 +#else + #if RGBLED_NUM <= 6 + #define RGBLIGHT_LIMIT_VAL 90 + #else + #if RGBLED_NUM <= 16 + #define RGBLIGHT_LIMIT_VAL 45 + #else + #define RGBLIGHT_LIMIT_VAL 35 + #endif + #endif + #define RGBLIGHT_VAL_STEP 4 +#endif +#define RGBLIGHT_HUE_STEP 10 +#define RGBLIGHT_SAT_STEP 17 + +#if defined(RGBLIGHT_ENABLE) && !defined(IOS_DEVICE_ENABLE) +// USB_MAX_POWER_CONSUMPTION value +// 120 RGBoff +// 330 RGB 6 +// 300 RGB 32 + #define USB_MAX_POWER_CONSUMPTION 400 +#else + // fix iPhone and iPad power adapter issue + // iOS device need lessthan 100 + #define USB_MAX_POWER_CONSUMPTION 100 +#endif + +/* + * 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 diff --git a/keyboards/zinc/reva/info.json b/keyboards/zinc/reva/info.json new file mode 100644 index 000000000..138c79068 --- /dev/null +++ b/keyboards/zinc/reva/info.json @@ -0,0 +1,13 @@ +{ + "keyboard_name": "Zinc rev.A", + "url": "https://github.com/monksoffunk/zinc", + "maintainer": "monksoffunk", + "width": 15, + "height": 4, + "layouts": { + "LAYOUT": { + "key_count": 48, + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":9, "y":1}, {"x":10, "y":1}, {"x":11, "y":1}, {"x":12, "y":1}, {"x":13, "y":1}, {"x":14, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2}, {"x":5, "y":2}, {"x":9, "y":2}, {"x":10, "y":2}, {"x":11, "y":2}, {"x":12, "y":2}, {"x":13, "y":2}, {"x":14, "y":2}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":4, "y":3}, {"x":5, "y":3}, {"x":9, "y":3}, {"x":10, "y":3}, {"x":11, "y":3}, {"x":12, "y":3}, {"x":13, "y":3}, {"x":14, "y":3}] + } + } +} diff --git a/keyboards/zinc/reva/matrix.c b/keyboards/zinc/reva/matrix.c new file mode 100644 index 000000000..220954f05 --- /dev/null +++ b/keyboards/zinc/reva/matrix.c @@ -0,0 +1,356 @@ +/* +Copyright 2012 Jun Wako + +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 . +*/ + +/* + * scan matrix + */ +#include +#include +#include +#include +#include +#include +#include +#include "print.h" +#include "debug.h" +#include "util.h" +#include "matrix.h" +#include "split_util.h" +#include "pro_micro.h" + +#ifdef USE_MATRIX_I2C +# include "i2c.h" +#else // USE_SERIAL +# include "split_scomm.h" +#endif + +#ifndef DEBOUNCE +# define DEBOUNCE 5 +#endif + +#define ERROR_DISCONNECT_COUNT 5 + +static uint8_t debouncing = DEBOUNCE; +static const int ROWS_PER_HAND = MATRIX_ROWS/2; +static uint8_t error_count = 0; +uint8_t is_master = 0 ; + +static const uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; +static const uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; + +/* matrix state(1:on, 0:off) */ +static matrix_row_t matrix[MATRIX_ROWS]; +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; + +static matrix_row_t read_cols(void); +static void init_cols(void); +static void unselect_rows(void); +static void select_row(uint8_t row); +static uint8_t matrix_master_scan(void); + + +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + +inline +uint8_t matrix_rows(void) +{ + return MATRIX_ROWS; +} + +inline +uint8_t matrix_cols(void) +{ + return MATRIX_COLS; +} + +void matrix_init(void) +{ + debug_enable = true; + debug_matrix = true; + debug_mouse = true; + // initialize row and col + unselect_rows(); + init_cols(); + + TX_RX_LED_INIT; + TXLED0; + RXLED0; + + // initialize matrix state: all keys off + for (uint8_t i=0; i < MATRIX_ROWS; i++) { + matrix[i] = 0; + matrix_debouncing[i] = 0; + } + + is_master = has_usb(); + + matrix_init_quantum(); +} + +uint8_t _matrix_scan(void) +{ + // Right hand is stored after the left in the matirx so, we need to offset it + int offset = isLeftHand ? 0 : (ROWS_PER_HAND); + + for (uint8_t i = 0; i < ROWS_PER_HAND; i++) { + select_row(i); + _delay_us(30); // without this wait read unstable value. + matrix_row_t cols = read_cols(); + if (matrix_debouncing[i+offset] != cols) { + matrix_debouncing[i+offset] = cols; + debouncing = DEBOUNCE; + } + unselect_rows(); + } + + if (debouncing) { + if (--debouncing) { + _delay_ms(1); + } else { + for (uint8_t i = 0; i < ROWS_PER_HAND; i++) { + matrix[i+offset] = matrix_debouncing[i+offset]; + } + } + } + + return 1; +} + +#ifdef USE_MATRIX_I2C + +// Get rows from other half over i2c +int i2c_transaction(void) { + int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; + + int err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_WRITE); + if (err) goto i2c_error; + + // start of matrix stored at 0x00 + err = i2c_master_write(0x00); + if (err) goto i2c_error; + + // Start read + err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_READ); + if (err) goto i2c_error; + + if (!err) { + int i; + for (i = 0; i < ROWS_PER_HAND-1; ++i) { + matrix[slaveOffset+i] = i2c_master_read(I2C_ACK); + } + matrix[slaveOffset+i] = i2c_master_read(I2C_NACK); + i2c_master_stop(); + } else { +i2c_error: // the cable is disconnceted, or something else went wrong + i2c_reset_state(); + return err; + } + + return 0; +} + +#else // USE_SERIAL + +int serial_transaction(int master_changed) { + int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; +#ifdef SERIAL_USE_MULTI_TRANSACTION + int ret=serial_update_buffers(master_changed); +#else + int ret=serial_update_buffers(); +#endif + if (ret ) { + if(ret==2) RXLED1; + return 1; + } + RXLED0; + memcpy(&matrix[slaveOffset], + (void *)serial_slave_buffer, sizeof(serial_slave_buffer)); + return 0; +} +#endif + +uint8_t matrix_scan(void) +{ + if (is_master) { + matrix_master_scan(); + }else{ + matrix_slave_scan(); + int offset = (isLeftHand) ? ROWS_PER_HAND : 0; + memcpy(&matrix[offset], + (void *)serial_master_buffer, sizeof(serial_master_buffer)); + matrix_scan_quantum(); + } + return 1; +} + + +uint8_t matrix_master_scan(void) { + + int ret = _matrix_scan(); + int mchanged = 1; + int offset = (isLeftHand) ? 0 : ROWS_PER_HAND; + +#ifdef USE_MATRIX_I2C +// for (int i = 0; i < ROWS_PER_HAND; ++i) { + /* i2c_slave_buffer[i] = matrix[offset+i]; */ +// i2c_slave_buffer[i] = matrix[offset+i]; +// } +#else // USE_SERIAL + #ifdef SERIAL_USE_MULTI_TRANSACTION + mchanged = memcmp((void *)serial_master_buffer, + &matrix[offset], sizeof(serial_master_buffer)); + #endif + memcpy((void *)serial_master_buffer, + &matrix[offset], sizeof(serial_master_buffer)); +#endif + +#ifdef USE_MATRIX_I2C + if( i2c_transaction() ) { +#else // USE_SERIAL + if( serial_transaction(mchanged) ) { +#endif + // turn on the indicator led when halves are disconnected + TXLED1; + + error_count++; + + if (error_count > ERROR_DISCONNECT_COUNT) { + // reset other half if disconnected + int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; + for (int i = 0; i < ROWS_PER_HAND; ++i) { + matrix[slaveOffset+i] = 0; + } + } + } else { + // turn off the indicator led on no error + TXLED0; + error_count = 0; + } + matrix_scan_quantum(); + return ret; +} + +void matrix_slave_scan(void) { + _matrix_scan(); + + int offset = (isLeftHand) ? 0 : ROWS_PER_HAND; + +#ifdef USE_MATRIX_I2C + for (int i = 0; i < ROWS_PER_HAND; ++i) { + /* i2c_slave_buffer[i] = matrix[offset+i]; */ + i2c_slave_buffer[i] = matrix[offset+i]; + } +#else // USE_SERIAL + #ifdef SERIAL_USE_MULTI_TRANSACTION + int change = 0; + #endif + for (int i = 0; i < ROWS_PER_HAND; ++i) { + #ifdef SERIAL_USE_MULTI_TRANSACTION + if( serial_slave_buffer[i] != matrix[offset+i] ) + change = 1; + #endif + serial_slave_buffer[i] = matrix[offset+i]; + } + #ifdef SERIAL_USE_MULTI_TRANSACTION + slave_buffer_change_count += change; + #endif +#endif +} + +bool matrix_is_modified(void) +{ + if (debouncing) return false; + return true; +} + +inline +bool matrix_is_on(uint8_t row, uint8_t col) +{ + return (matrix[row] & ((matrix_row_t)1<> 4) + 1) &= ~_BV(col_pins[x] & 0xF); + _SFR_IO8((col_pins[x] >> 4) + 2) |= _BV(col_pins[x] & 0xF); + } +} + +static matrix_row_t read_cols(void) +{ + matrix_row_t result = 0; + for(int x = 0; x < MATRIX_COLS; x++) { + result |= (_SFR_IO8(col_pins[x] >> 4) & _BV(col_pins[x] & 0xF)) ? 0 : (1 << x); + } + return result; +} + +static void unselect_rows(void) +{ + for(int x = 0; x < ROWS_PER_HAND; x++) { + _SFR_IO8((row_pins[x] >> 4) + 1) &= ~_BV(row_pins[x] & 0xF); + _SFR_IO8((row_pins[x] >> 4) + 2) |= _BV(row_pins[x] & 0xF); + } +} + +static void select_row(uint8_t row) +{ + _SFR_IO8((row_pins[row] >> 4) + 1) |= _BV(row_pins[row] & 0xF); + _SFR_IO8((row_pins[row] >> 4) + 2) &= ~_BV(row_pins[row] & 0xF); +} diff --git a/keyboards/zinc/reva/reva.c b/keyboards/zinc/reva/reva.c new file mode 100644 index 000000000..2ce08a07c --- /dev/null +++ b/keyboards/zinc/reva/reva.c @@ -0,0 +1,6 @@ +#include "zinc.h" + +void matrix_init_kb(void) { + matrix_init_user(); +}; + diff --git a/keyboards/zinc/reva/reva.h b/keyboards/zinc/reva/reva.h new file mode 100644 index 000000000..933e635c2 --- /dev/null +++ b/keyboards/zinc/reva/reva.h @@ -0,0 +1,44 @@ +#pragma once + +#include "../zinc.h" + +//void promicro_bootloader_jmp(bool program); +#include "quantum.h" + +#ifdef RGBLIGHT_ENABLE +//rgb led driver +#include "ws2812.h" +#endif + +#ifdef USE_I2C +#include +#ifdef __AVR__ + #include + #include +#endif +#endif + +//void promicro_bootloader_jmp(bool program); + + + +// Standard Keymap +// (TRRS jack on both halves are to the left side) +#define LAYOUT( \ + L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \ + L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \ + L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \ + L30, L31, L32, L33, L34, L35, R30, R31, R32, R33, R34, R35 \ + ) \ + { \ + { L00, L01, L02, L03, L04, L05}, \ + { L10, L11, L12, L13, L14, L15}, \ + { L20, L21, L22, L23, L24, L25}, \ + { L30, L31, L32, L33, L34, L35}, \ + { R00, R01, R02, R03, R04, R05 }, \ + { R10, R11, R12, R13, R14, R15 }, \ + { R20, R21, R22, R23, R24, R25 }, \ + { R30, R31, R32, R33, R34, R35 }, \ + } + +#define LAYOUT_ortho_4x12 LAYOUT diff --git a/keyboards/zinc/reva/rules.mk b/keyboards/zinc/reva/rules.mk new file mode 100644 index 000000000..3ea61267a --- /dev/null +++ b/keyboards/zinc/reva/rules.mk @@ -0,0 +1,4 @@ +SRC += reva/matrix.c +SRC += reva/split_util.c +SRC += reva/split_scomm.c +SRC += ws2812.c diff --git a/keyboards/zinc/reva/serial_config.h b/keyboards/zinc/reva/serial_config.h new file mode 100644 index 000000000..9fb5dfc67 --- /dev/null +++ b/keyboards/zinc/reva/serial_config.h @@ -0,0 +1,18 @@ +#ifndef SOFT_SERIAL_CONFIG_H +#define SOFT_SERIAL_CONFIG_H + +#ifndef SOFT_SERIAL_PIN +/* Soft Serial defines */ +#define SOFT_SERIAL_PIN D2 +// OPTIONAL: #define SELECT_SOFT_SERIAL_SPEED ? // ? = 1,2,3,4,5 +// // 1: about 137kbps (default) +// // 2: about 75kbps +// // 3: about 39kbps +// // 4: about 26kbps +// // 5: about 20kbps +#endif + +//// USE flexible API (using multi-type transaction function) +#define SERIAL_USE_MULTI_TRANSACTION + +#endif /* SOFT_SERIAL_CONFIG_H */ diff --git a/keyboards/zinc/reva/serial_config_simpleapi.h b/keyboards/zinc/reva/serial_config_simpleapi.h new file mode 100644 index 000000000..e2d22a41e --- /dev/null +++ b/keyboards/zinc/reva/serial_config_simpleapi.h @@ -0,0 +1,8 @@ +#ifndef SERIAL_CONFIG_SIMPLEAPI_H +#define SERIAL_CONFIG_SIMPLEAPI_H + +#undef SERIAL_USE_MULTI_TRANSACTION +#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 +#define SERIAL_MASTER_BUFFER_LENGTH MATRIX_ROWS/2 + +#endif // SERIAL_CONFIG_SIMPLEAPI_H diff --git a/keyboards/zinc/reva/split_scomm.c b/keyboards/zinc/reva/split_scomm.c new file mode 100644 index 000000000..50d233ce9 --- /dev/null +++ b/keyboards/zinc/reva/split_scomm.c @@ -0,0 +1,95 @@ +#ifdef USE_SERIAL +#ifdef SERIAL_USE_MULTI_TRANSACTION +/* --- USE flexible API (using multi-type transaction function) --- */ + +#include +#include +#include +#include +#include "serial.h" +#ifdef SERIAL_DEBUG_MODE +#include +#endif +#ifdef CONSOLE_ENABLE + #include +#endif + +uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; +uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0}; +uint8_t volatile status_com = 0; +uint8_t volatile status1 = 0; +uint8_t slave_buffer_change_count = 0; +uint8_t s_change_old = 0xff; +uint8_t s_change_new = 0xff; + +SSTD_t transactions[] = { +#define GET_SLAVE_STATUS 0 + /* master buffer not changed, only recive slave_buffer_change_count */ + { (uint8_t *)&status_com, + 0, NULL, + sizeof(slave_buffer_change_count), &slave_buffer_change_count, + }, +#define PUT_MASTER_GET_SLAVE_STATUS 1 + /* master buffer changed need send, and recive slave_buffer_change_count */ + { (uint8_t *)&status_com, + sizeof(serial_master_buffer), (uint8_t *)serial_master_buffer, + sizeof(slave_buffer_change_count), &slave_buffer_change_count, + }, +#define GET_SLAVE_BUFFER 2 + /* recive serial_slave_buffer */ + { (uint8_t *)&status1, + 0, NULL, + sizeof(serial_slave_buffer), (uint8_t *)serial_slave_buffer + } +}; + +void serial_master_init(void) +{ + soft_serial_initiator_init(transactions, TID_LIMIT(transactions)); +} + +void serial_slave_init(void) +{ + soft_serial_target_init(transactions, TID_LIMIT(transactions)); +} + +// 0 => no error +// 1 => slave did not respond +// 2 => checksum error +int serial_update_buffers(int master_update) +{ + int status, smatstatus; + static int need_retry = 0; + + if( s_change_old != s_change_new ) { + smatstatus = soft_serial_transaction(GET_SLAVE_BUFFER); + if( smatstatus == TRANSACTION_END ) { + s_change_old = s_change_new; +#ifdef CONSOLE_ENABLE + uprintf("slave matrix = %b %b %b %b %b\n", + serial_slave_buffer[0], serial_slave_buffer[1], + serial_slave_buffer[2], serial_slave_buffer[3], + serial_slave_buffer[4] ); +#endif + } + } else { + // serial_slave_buffer dosen't change + smatstatus = TRANSACTION_END; // dummy status + } + + if( !master_update && !need_retry) { + status = soft_serial_transaction(GET_SLAVE_STATUS); + } else { + status = soft_serial_transaction(PUT_MASTER_GET_SLAVE_STATUS); + } + if( status == TRANSACTION_END ) { + s_change_new = slave_buffer_change_count; + need_retry = 0; + } else { + need_retry = 1; + } + return smatstatus; +} + +#endif // SERIAL_USE_MULTI_TRANSACTION +#endif /* USE_SERIAL */ diff --git a/keyboards/zinc/reva/split_scomm.h b/keyboards/zinc/reva/split_scomm.h new file mode 100644 index 000000000..873d8939d --- /dev/null +++ b/keyboards/zinc/reva/split_scomm.h @@ -0,0 +1,24 @@ +#ifndef SPLIT_COMM_H +#define SPLIT_COMM_H + +#ifndef SERIAL_USE_MULTI_TRANSACTION +/* --- USE Simple API (OLD API, compatible with let's split serial.c) --- */ +#include "serial.h" + +#else +/* --- USE flexible API (using multi-type transaction function) --- */ +// Buffers for master - slave communication +#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 +#define SERIAL_MASTER_BUFFER_LENGTH MATRIX_ROWS/2 + +extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH]; +extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH]; +extern uint8_t slave_buffer_change_count; + +void serial_master_init(void); +void serial_slave_init(void); +int serial_update_buffers(int master_changed); + +#endif + +#endif /* SPLIT_COMM_H */ diff --git a/keyboards/zinc/reva/split_util.c b/keyboards/zinc/reva/split_util.c new file mode 100644 index 000000000..e1ff8b437 --- /dev/null +++ b/keyboards/zinc/reva/split_util.c @@ -0,0 +1,70 @@ +#include +#include +#include +#include +#include +#include +#include "split_util.h" +#include "matrix.h" +#include "keyboard.h" + +#ifdef USE_MATRIX_I2C +# include "i2c.h" +#else +# include "split_scomm.h" +#endif + +volatile bool isLeftHand = true; + +static void setup_handedness(void) { + #ifdef EE_HANDS + isLeftHand = eeprom_read_byte(EECONFIG_HANDEDNESS); + #else + // I2C_MASTER_RIGHT is deprecated, use MASTER_RIGHT instead, since this works for both serial and i2c + #if defined(I2C_MASTER_RIGHT) || defined(MASTER_RIGHT) + isLeftHand = !has_usb(); + #else + isLeftHand = has_usb(); + #endif + #endif +} + +static void keyboard_master_setup(void) { + +#ifdef USE_MATRIX_I2C + i2c_master_init(); +#else + serial_master_init(); +#endif +} + +static void keyboard_slave_setup(void) { + +#ifdef USE_MATRIX_I2C + i2c_slave_init(SLAVE_I2C_ADDRESS); +#else + serial_slave_init(); +#endif +} + +bool has_usb(void) { + USBCON |= (1 << OTGPADE); //enables VBUS pad + _delay_us(5); + return (USBSTA & (1< +#include "eeconfig.h" + +#define SLAVE_I2C_ADDRESS 0x32 + +extern volatile bool isLeftHand; + +// slave version of matix scan, defined in matrix.c +void matrix_slave_scan(void); + +void split_keyboard_setup(void); +bool has_usb(void); + +void matrix_master_OLED_init (void); + +#endif diff --git a/keyboards/zinc/rules.mk b/keyboards/zinc/rules.mk new file mode 100644 index 000000000..5236c0bb0 --- /dev/null +++ b/keyboards/zinc/rules.mk @@ -0,0 +1,72 @@ +#SRC += i2c.c +SRC += serial.c + +# MCU name +#MCU = at90usb1287 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Bootloader +# This definition is optional, and if your keyboard supports multiple bootloaders of +# different sizes, comment this out, and the correct address will be loaded +# automatically (+60). See bootloader.mk for all options. +BOOTLOADER = caterina + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = no # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SUBPROJECT_rev1 = no +USE_I2C = yes +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +CUSTOM_MATRIX = yes + +DEFAULT_FOLDER = zinc/rev1 diff --git a/keyboards/zinc/serial.c b/keyboards/zinc/serial.c new file mode 100644 index 000000000..830f86b55 --- /dev/null +++ b/keyboards/zinc/serial.c @@ -0,0 +1,542 @@ +/* + * WARNING: be careful changing this code, it is very timing dependent + */ + +#ifndef F_CPU +#define F_CPU 16000000 +#endif + +#include +#include +#include +#include +#include +#include "serial.h" +//#include + +#ifdef SOFT_SERIAL_PIN + +#ifdef __AVR_ATmega32U4__ + // if using ATmega32U4 I2C, can not use PD0 and PD1 in soft serial. + #ifdef USE_I2C + #if SOFT_SERIAL_PIN == D0 || SOFT_SERIAL_PIN == D1 + #error Using ATmega32U4 I2C, so can not use PD0, PD1 + #endif + #endif + + #if SOFT_SERIAL_PIN >= D0 && SOFT_SERIAL_PIN <= D3 + #define SERIAL_PIN_DDR DDRD + #define SERIAL_PIN_PORT PORTD + #define SERIAL_PIN_INPUT PIND + #if SOFT_SERIAL_PIN == D0 + #define SERIAL_PIN_MASK _BV(PD0) + #define EIMSK_BIT _BV(INT0) + #define EICRx_BIT (~(_BV(ISC00) | _BV(ISC01))) + #define SERIAL_PIN_INTERRUPT INT0_vect + #elif SOFT_SERIAL_PIN == D1 + #define SERIAL_PIN_MASK _BV(PD1) + #define EIMSK_BIT _BV(INT1) + #define EICRx_BIT (~(_BV(ISC10) | _BV(ISC11))) + #define SERIAL_PIN_INTERRUPT INT1_vect + #elif SOFT_SERIAL_PIN == D2 + #define SERIAL_PIN_MASK _BV(PD2) + #define EIMSK_BIT _BV(INT2) + #define EICRx_BIT (~(_BV(ISC20) | _BV(ISC21))) + #define SERIAL_PIN_INTERRUPT INT2_vect + #elif SOFT_SERIAL_PIN == D3 + #define SERIAL_PIN_MASK _BV(PD3) + #define EIMSK_BIT _BV(INT3) + #define EICRx_BIT (~(_BV(ISC30) | _BV(ISC31))) + #define SERIAL_PIN_INTERRUPT INT3_vect + #endif + #elif SOFT_SERIAL_PIN == E6 + #define SERIAL_PIN_DDR DDRE + #define SERIAL_PIN_PORT PORTE + #define SERIAL_PIN_INPUT PINE + #define SERIAL_PIN_MASK _BV(PE6) + #define EIMSK_BIT _BV(INT6) + #define EICRx_BIT (~(_BV(ISC60) | _BV(ISC61))) + #define SERIAL_PIN_INTERRUPT INT6_vect + #else + #error invalid SOFT_SERIAL_PIN value + #endif + +#else + #error serial.c now support ATmega32U4 only +#endif + +#ifndef SERIAL_USE_MULTI_TRANSACTION +/* --- USE Simple API (OLD API, compatible with let's split serial.c) */ + #if SERIAL_SLAVE_BUFFER_LENGTH > 0 + uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; + #endif + #if SERIAL_MASTER_BUFFER_LENGTH > 0 + uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0}; + #endif + uint8_t volatile status0 = 0; + +SSTD_t transactions[] = { + { (uint8_t *)&status0, + #if SERIAL_MASTER_BUFFER_LENGTH > 0 + sizeof(serial_master_buffer), (uint8_t *)serial_master_buffer, + #else + 0, (uint8_t *)NULL, + #endif + #if SERIAL_SLAVE_BUFFER_LENGTH > 0 + sizeof(serial_slave_buffer), (uint8_t *)serial_slave_buffer + #else + 0, (uint8_t *)NULL, + #endif + } +}; + +void serial_master_init(void) +{ soft_serial_initiator_init(transactions, TID_LIMIT(transactions)); } + +void serial_slave_init(void) +{ soft_serial_target_init(transactions, TID_LIMIT(transactions)); } + +// 0 => no error +// 1 => slave did not respond +// 2 => checksum error +int serial_update_buffers() +{ + int result; + result = soft_serial_transaction(); + return result; +} + +#endif // Simple API (OLD API, compatible with let's split serial.c) + +#define ALWAYS_INLINE __attribute__((always_inline)) +#define NO_INLINE __attribute__((noinline)) +#define _delay_sub_us(x) __builtin_avr_delay_cycles(x) + +// parity check +#define ODD_PARITY 1 +#define EVEN_PARITY 0 +#define PARITY EVEN_PARITY + +#ifdef SERIAL_DELAY + // custom setup in config.h + // #define TID_SEND_ADJUST 2 + // #define SERIAL_DELAY 6 // micro sec + // #define READ_WRITE_START_ADJUST 30 // cycles + // #define READ_WRITE_WIDTH_ADJUST 8 // cycles +#else +// ============ Standard setups ============ + +#ifndef SELECT_SOFT_SERIAL_SPEED +#define SELECT_SOFT_SERIAL_SPEED 1 +// 0: about 189kbps +// 1: about 137kbps (default) +// 2: about 75kbps +// 3: about 39kbps +// 4: about 26kbps +// 5: about 20kbps +#endif + +#define TID_SEND_ADJUST 2 + +#if SELECT_SOFT_SERIAL_SPEED == 0 + // Very High speed + #define SERIAL_DELAY 4 // micro sec + #define READ_WRITE_START_ADJUST 33 // cycles + #define READ_WRITE_WIDTH_ADJUST 6 // cycles +#elif SELECT_SOFT_SERIAL_SPEED == 1 + // High speed + #define SERIAL_DELAY 6 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 7 // cycles +#elif SELECT_SOFT_SERIAL_SPEED == 2 + // Middle speed + #define SERIAL_DELAY 12 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 7 // cycles +#elif SELECT_SOFT_SERIAL_SPEED == 3 + // Low speed + #define SERIAL_DELAY 24 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 7 // cycles +#elif SELECT_SOFT_SERIAL_SPEED == 4 + // Very Low speed + #define SERIAL_DELAY 36 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 7 // cycles +#elif SELECT_SOFT_SERIAL_SPEED == 5 + // Ultra Low speed + #define SERIAL_DELAY 48 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 7 // cycles +#else +#error invalid SELECT_SOFT_SERIAL_SPEED value +#endif /* SELECT_SOFT_SERIAL_SPEED */ +#endif /* SERIAL_DELAY */ + +#define SERIAL_DELAY_HALF1 (SERIAL_DELAY/2) +#define SERIAL_DELAY_HALF2 (SERIAL_DELAY - SERIAL_DELAY/2) + +#define SLAVE_INT_WIDTH_US 1 +#ifndef SERIAL_USE_MULTI_TRANSACTION + #define SLAVE_INT_RESPONSE_TIME SERIAL_DELAY +#else + #define SLAVE_INT_ACK_WIDTH_UNIT 2 + #define SLAVE_INT_ACK_WIDTH 4 +#endif + +static SSTD_t *Transaction_table = NULL; +static uint8_t Transaction_table_size = 0; + +inline static +void serial_delay(void) { + _delay_us(SERIAL_DELAY); +} + +inline static +void serial_delay_half1(void) { + _delay_us(SERIAL_DELAY_HALF1); +} + +inline static +void serial_delay_half2(void) { + _delay_us(SERIAL_DELAY_HALF2); +} + +inline static void serial_output(void) ALWAYS_INLINE; +inline static +void serial_output(void) { + SERIAL_PIN_DDR |= SERIAL_PIN_MASK; +} + +// make the serial pin an input with pull-up resistor +inline static void serial_input_with_pullup(void) ALWAYS_INLINE; +inline static +void serial_input_with_pullup(void) { + SERIAL_PIN_DDR &= ~SERIAL_PIN_MASK; + SERIAL_PIN_PORT |= SERIAL_PIN_MASK; +} + +inline static +uint8_t serial_read_pin(void) { + return !!(SERIAL_PIN_INPUT & SERIAL_PIN_MASK); +} + +inline static void serial_low(void) ALWAYS_INLINE; +inline static +void serial_low(void) { + SERIAL_PIN_PORT &= ~SERIAL_PIN_MASK; +} + +inline static void serial_high(void) ALWAYS_INLINE; +inline static +void serial_high(void) { + SERIAL_PIN_PORT |= SERIAL_PIN_MASK; +} + +void soft_serial_initiator_init(SSTD_t *sstd_table, int sstd_table_size) +{ + Transaction_table = sstd_table; + Transaction_table_size = (uint8_t)sstd_table_size; + serial_output(); + serial_high(); +} + +void soft_serial_target_init(SSTD_t *sstd_table, int sstd_table_size) +{ + Transaction_table = sstd_table; + Transaction_table_size = (uint8_t)sstd_table_size; + serial_input_with_pullup(); + + // Enable INT0-INT3,INT6 + EIMSK |= EIMSK_BIT; +#if SERIAL_PIN_MASK == _BV(PE6) + // Trigger on falling edge of INT6 + EICRB &= EICRx_BIT; +#else + // Trigger on falling edge of INT0-INT3 + EICRA &= EICRx_BIT; +#endif +} + +// Used by the sender to synchronize timing with the reciver. +static void sync_recv(void) NO_INLINE; +static +void sync_recv(void) { + for (uint8_t i = 0; i < SERIAL_DELAY*5 && serial_read_pin(); i++ ) { + } + // This shouldn't hang if the target disconnects because the + // serial line will float to high if the target does disconnect. + while (!serial_read_pin()); +} + +// Used by the reciver to send a synchronization signal to the sender. +static void sync_send(void)NO_INLINE; +static +void sync_send(void) { + serial_low(); + serial_delay(); + serial_high(); +} + +// Reads a byte from the serial line +static uint8_t serial_read_chunk(uint8_t *pterrcount, uint8_t bit) NO_INLINE; +static uint8_t serial_read_chunk(uint8_t *pterrcount, uint8_t bit) { + uint8_t byte, i, p, pb; + + _delay_sub_us(READ_WRITE_START_ADJUST); + for( i = 0, byte = 0, p = PARITY; i < bit; i++ ) { + serial_delay_half1(); // read the middle of pulses + if( serial_read_pin() ) { + byte = (byte << 1) | 1; p ^= 1; + } else { + byte = (byte << 1) | 0; p ^= 0; + } + _delay_sub_us(READ_WRITE_WIDTH_ADJUST); + serial_delay_half2(); + } + /* recive parity bit */ + serial_delay_half1(); // read the middle of pulses + pb = serial_read_pin(); + _delay_sub_us(READ_WRITE_WIDTH_ADJUST); + serial_delay_half2(); + + *pterrcount += (p != pb)? 1 : 0; + + return byte; +} + +// Sends a byte with MSB ordering +void serial_write_chunk(uint8_t data, uint8_t bit) NO_INLINE; +void serial_write_chunk(uint8_t data, uint8_t bit) { + uint8_t b, p; + for( p = PARITY, b = 1<<(bit-1); b ; b >>= 1) { + if(data & b) { + serial_high(); p ^= 1; + } else { + serial_low(); p ^= 0; + } + serial_delay(); + } + /* send parity bit */ + if(p & 1) { serial_high(); } + else { serial_low(); } + serial_delay(); + + serial_low(); // sync_send() / senc_recv() need raise edge +} + +static void serial_send_packet(uint8_t *buffer, uint8_t size) NO_INLINE; +static +void serial_send_packet(uint8_t *buffer, uint8_t size) { + for (uint8_t i = 0; i < size; ++i) { + uint8_t data; + data = buffer[i]; + sync_send(); + serial_write_chunk(data,8); + } +} + +static uint8_t serial_recive_packet(uint8_t *buffer, uint8_t size) NO_INLINE; +static +uint8_t serial_recive_packet(uint8_t *buffer, uint8_t size) { + uint8_t pecount = 0; + for (uint8_t i = 0; i < size; ++i) { + uint8_t data; + sync_recv(); + data = serial_read_chunk(&pecount, 8); + buffer[i] = data; + } + return pecount == 0; +} + +inline static +void change_sender2reciver(void) { + sync_send(); //0 + serial_delay_half1(); //1 + serial_low(); //2 + serial_input_with_pullup(); //2 + serial_delay_half1(); //3 +} + +inline static +void change_reciver2sender(void) { + sync_recv(); //0 + serial_delay(); //1 + serial_low(); //3 + serial_output(); //3 + serial_delay_half1(); //4 +} + +static inline uint8_t nibble_bits_count(uint8_t bits) +{ + bits = (bits & 0x5) + (bits >> 1 & 0x5); + bits = (bits & 0x3) + (bits >> 2 & 0x3); + return bits; +} + +// interrupt handle to be used by the target device +ISR(SERIAL_PIN_INTERRUPT) { + +#ifndef SERIAL_USE_MULTI_TRANSACTION + serial_low(); + serial_output(); + SSTD_t *trans = Transaction_table; +#else + // recive transaction table index + uint8_t tid, bits; + uint8_t pecount = 0; + sync_recv(); + bits = serial_read_chunk(&pecount,7); + tid = bits>>3; + bits = (bits&7) != nibble_bits_count(tid); + if( bits || pecount> 0 || tid > Transaction_table_size ) { + return; + } + serial_delay_half1(); + + serial_high(); // response step1 low->high + serial_output(); + _delay_sub_us(SLAVE_INT_ACK_WIDTH_UNIT*SLAVE_INT_ACK_WIDTH); + SSTD_t *trans = &Transaction_table[tid]; + serial_low(); // response step2 ack high->low +#endif + + // target send phase + if( trans->target2initiator_buffer_size > 0 ) + serial_send_packet((uint8_t *)trans->target2initiator_buffer, + trans->target2initiator_buffer_size); + // target switch to input + change_sender2reciver(); + + // target recive phase + if( trans->initiator2target_buffer_size > 0 ) { + if (serial_recive_packet((uint8_t *)trans->initiator2target_buffer, + trans->initiator2target_buffer_size) ) { + *trans->status = TRANSACTION_ACCEPTED; + } else { + *trans->status = TRANSACTION_DATA_ERROR; + } + } else { + *trans->status = TRANSACTION_ACCEPTED; + } + + sync_recv(); //weit initiator output to high +} + +///////// +// start transaction by initiator +// +// int soft_serial_transaction(int sstd_index) +// +// Returns: +// TRANSACTION_END +// TRANSACTION_NO_RESPONSE +// TRANSACTION_DATA_ERROR +// this code is very time dependent, so we need to disable interrupts +#ifndef SERIAL_USE_MULTI_TRANSACTION +int soft_serial_transaction(void) { + SSTD_t *trans = Transaction_table; +#else +int soft_serial_transaction(int sstd_index) { + if( sstd_index > Transaction_table_size ) + return TRANSACTION_TYPE_ERROR; + SSTD_t *trans = &Transaction_table[sstd_index]; +#endif + cli(); + + // signal to the target that we want to start a transaction + serial_output(); + serial_low(); + _delay_us(SLAVE_INT_WIDTH_US); + +#ifndef SERIAL_USE_MULTI_TRANSACTION + // wait for the target response + serial_input_with_pullup(); + _delay_us(SLAVE_INT_RESPONSE_TIME); + + // check if the target is present + if (serial_read_pin()) { + // target failed to pull the line low, assume not present + serial_output(); + serial_high(); + *trans->status = TRANSACTION_NO_RESPONSE; + sei(); + return TRANSACTION_NO_RESPONSE; + } + +#else + // send transaction table index + int tid = (sstd_index<<3) | (7 & nibble_bits_count(sstd_index)); + sync_send(); + _delay_sub_us(TID_SEND_ADJUST); + serial_write_chunk(tid, 7); + serial_delay_half1(); + + // wait for the target response (step1 low->high) + serial_input_with_pullup(); + while( !serial_read_pin() ) { + _delay_sub_us(2); + } + + // check if the target is present (step2 high->low) + for( int i = 0; serial_read_pin(); i++ ) { + if (i > SLAVE_INT_ACK_WIDTH + 1) { + // slave failed to pull the line low, assume not present + serial_output(); + serial_high(); + *trans->status = TRANSACTION_NO_RESPONSE; + sei(); + return TRANSACTION_NO_RESPONSE; + } + _delay_sub_us(SLAVE_INT_ACK_WIDTH_UNIT); + } +#endif + + // initiator recive phase + // if the target is present syncronize with it + if( trans->target2initiator_buffer_size > 0 ) { + if (!serial_recive_packet((uint8_t *)trans->target2initiator_buffer, + trans->target2initiator_buffer_size) ) { + serial_output(); + serial_high(); + *trans->status = TRANSACTION_DATA_ERROR; + sei(); + return TRANSACTION_DATA_ERROR; + } + } + + // initiator switch to output + change_reciver2sender(); + + // initiator send phase + if( trans->initiator2target_buffer_size > 0 ) { + serial_send_packet((uint8_t *)trans->initiator2target_buffer, + trans->initiator2target_buffer_size); + } + + // always, release the line when not in use + sync_send(); + + *trans->status = TRANSACTION_END; + sei(); + return TRANSACTION_END; +} + +#ifdef SERIAL_USE_MULTI_TRANSACTION +int soft_serial_get_and_clean_status(int sstd_index) { + SSTD_t *trans = &Transaction_table[sstd_index]; + cli(); + int retval = *trans->status; + *trans->status = 0;; + sei(); + return retval; +} +#endif + +#endif + +// Helix serial.c history +// 2018-1-29 fork from let's split (#2308) +// 2018-6-28 bug fix master to slave comm (#3255) +// 2018-8-11 improvements (#3608) +// 2018-10-21 fix serial and RGB animation conflict (#4191) diff --git a/keyboards/zinc/serial.h b/keyboards/zinc/serial.h new file mode 100644 index 000000000..7e0c0847a --- /dev/null +++ b/keyboards/zinc/serial.h @@ -0,0 +1,84 @@ +#ifndef SOFT_SERIAL_H +#define SOFT_SERIAL_H + +#include + +// ///////////////////////////////////////////////////////////////// +// Need Soft Serial defines in config.h +// ///////////////////////////////////////////////////////////////// +// ex. +// #define SOFT_SERIAL_PIN ?? // ?? = D0,D1,D2,D3,E6 +// OPTIONAL: #define SELECT_SOFT_SERIAL_SPEED ? // ? = 1,2,3,4,5 +// // 1: about 137kbps (default) +// // 2: about 75kbps +// // 3: about 39kbps +// // 4: about 26kbps +// // 5: about 20kbps +// +// //// USE Simple API (OLD API, compatible with let's split serial.c) +// ex. +// #define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 +// #define SERIAL_MASTER_BUFFER_LENGTH 1 +// +// //// USE flexible API (using multi-type transaction function) +// #define SERIAL_USE_MULTI_TRANSACTION +// +// ///////////////////////////////////////////////////////////////// + + +#ifndef SERIAL_USE_MULTI_TRANSACTION +/* --- USE Simple API (OLD API, compatible with let's split serial.c) */ +#if SERIAL_SLAVE_BUFFER_LENGTH > 0 +extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH]; +#endif +#if SERIAL_MASTER_BUFFER_LENGTH > 0 +extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH]; +#endif + +void serial_master_init(void); +void serial_slave_init(void); +int serial_update_buffers(void); + +#endif // USE Simple API + +// Soft Serial Transaction Descriptor +typedef struct _SSTD_t { + uint8_t *status; + uint8_t initiator2target_buffer_size; + uint8_t *initiator2target_buffer; + uint8_t target2initiator_buffer_size; + uint8_t *target2initiator_buffer; +} SSTD_t; +#define TID_LIMIT( table ) (sizeof(table) / sizeof(SSTD_t)) + +// initiator is transaction start side +void soft_serial_initiator_init(SSTD_t *sstd_table, int sstd_table_size); +// target is interrupt accept side +void soft_serial_target_init(SSTD_t *sstd_table, int sstd_table_size); + +// initiator resullt +#define TRANSACTION_END 0 +#define TRANSACTION_NO_RESPONSE 0x1 +#define TRANSACTION_DATA_ERROR 0x2 +#define TRANSACTION_TYPE_ERROR 0x4 +#ifndef SERIAL_USE_MULTI_TRANSACTION +int soft_serial_transaction(void); +#else +int soft_serial_transaction(int sstd_index); +#endif + +// target status +// *SSTD_t.status has +// initiator: +// TRANSACTION_END +// or TRANSACTION_NO_RESPONSE +// or TRANSACTION_DATA_ERROR +// target: +// TRANSACTION_DATA_ERROR +// or TRANSACTION_ACCEPTED +#define TRANSACTION_ACCEPTED 0x8 +#ifdef SERIAL_USE_MULTI_TRANSACTION +int soft_serial_get_and_clean_status(int sstd_index); +#endif + +#endif /* SOFT_SERIAL_H */ diff --git a/keyboards/zinc/zinc.c b/keyboards/zinc/zinc.c new file mode 100644 index 000000000..139919d5a --- /dev/null +++ b/keyboards/zinc/zinc.c @@ -0,0 +1 @@ +#include "zinc.h" diff --git a/keyboards/zinc/zinc.h b/keyboards/zinc/zinc.h new file mode 100644 index 000000000..87d889da0 --- /dev/null +++ b/keyboards/zinc/zinc.h @@ -0,0 +1,14 @@ +#ifndef ZINC_H +#define ZINC_H + +#ifdef KEYBOARD_zinc_reva + #include "reva.h" +#endif +#ifdef KEYBOARD_zinc_rev1 + #include "rev1.h" +#endif + + +#include "quantum.h" + +#endif From 6916c0d728c604895c96bb7105114b153f1f6731 Mon Sep 17 00:00:00 2001 From: Mattia Dal Ben Date: Sat, 27 Oct 2018 17:23:12 +0200 Subject: [PATCH 387/788] Redox Wireless configurator support (#4256) --- keyboards/redox_w/info.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 keyboards/redox_w/info.json diff --git a/keyboards/redox_w/info.json b/keyboards/redox_w/info.json new file mode 100644 index 000000000..5bc65b5d9 --- /dev/null +++ b/keyboards/redox_w/info.json @@ -0,0 +1,12 @@ +{ + "keyboard_name": "Redox Wireless", + "url": "", + "maintainer": "qmk", + "width": 18.5, + "height": 6.25, + "layouts": { + "LAYOUT": { + "layout": [{"label":"[L2] `", "x":0, "y":0.375, "w":1.25}, {"label":"!", "x":1.25, "y":0.375}, {"label":"@", "x":2.25, "y":0.125}, {"label":"#", "x":3.25, "y":0}, {"label":"$", "x":4.25, "y":0.125}, {"label":"%", "x":5.25, "y":0.25}, {"label":"[L1]", "x":6.25, "y":0.75}, {"label":"[L1]", "x":11.25, "y":0.75}, {"label":"^", "x":12.25, "y":0.25}, {"label":"&", "x":13.25, "y":0.125}, {"label":"*", "x":14.25, "y":0}, {"label":"(", "x":15.25, "y":0.125}, {"label":")", "x":16.25, "y":0.375}, {"label":"[L2] -", "x":17.25, "y":0.375, "w":1.25}, {"label":"Tab", "x":0, "y":1.375, "w":1.25}, {"label":"Q", "x":1.25, "y":1.375}, {"label":"W", "x":2.25, "y":1.125}, {"label":"E", "x":3.25, "y":1}, {"label":"R", "x":4.25, "y":1.125}, {"label":"T", "x":5.25, "y":1.25}, {"label":"[", "x":6.25, "y":1.75, "h":1.5}, {"label":"]", "x":11.25, "y":1.75, "h":1.5}, {"label":"Y", "x":12.25, "y":1.25}, {"label":"U", "x":13.25, "y":1.125}, {"label":"I", "x":14.25, "y":1}, {"label":"O", "x":15.25, "y":1.125}, {"label":"P", "x":16.25, "y":1.375}, {"label":"=", "x":17.25, "y":1.375, "w":1.25}, {"label":"Esc", "x":0, "y":2.375, "w":1.25}, {"label":"A", "x":1.25, "y":2.375}, {"label":"S", "x":2.25, "y":2.125}, {"label":"D", "x":3.25, "y":2}, {"label":"F", "x":4.25, "y":2.125}, {"label":"G", "x":5.25, "y":2.25}, {"label":"PgUp", "x":6.75, "y":3.75}, {"label":"End", "x":10.75, "y":3.75}, {"label":"H", "x":12.25, "y":2.25}, {"label":"J", "x":13.25, "y":2.125}, {"label":"K", "x":14.25, "y":2}, {"label":"L", "x":15.25, "y":2.125}, {"label":":", "x":16.25, "y":2.375}, {"label":"'", "x":17.25, "y":2.375, "w":1.25}, {"label":"Shift", "x":0, "y":3.375, "w":1.25}, {"label":"Z", "x":1.25, "y":3.375}, {"label":"X", "x":2.25, "y":3.125}, {"label":"C", "x":3.25, "y":3}, {"label":"V", "x":4.25, "y":3.125}, {"label":"B", "x":5.25, "y":3.25}, {"label":"PgDn", "x":7.75, "y":3.75}, {"label":"Home", "x":9.75, "y":3.75}, {"label":"N", "x":12.25, "y":3.25}, {"label":"M", "x":13.25, "y":3.125}, {"label":"<", "x":14.25, "y":3}, {"label":">", "x":15.25, "y":3.125}, {"label":"?", "x":16.25, "y":3.375}, {"label":"Shift", "x":17.25, "y":3.375, "w":1.25}, {"label":"GUI", "x":0.25, "y":4.375}, {"label":"+", "x":1.25, "y":4.375}, {"label":"-", "x":2.25, "y":4.125}, {"label":"[Alt] *", "x":3.25, "y":4}, {"label":"[Ctrl] /", "x":5.5, "y":5.25, "w":1.25}, {"label":"Backspace", "x":6.75, "y":4.75, "h":1.5}, {"label":"Del", "x":7.75, "y":4.75, "h":1.5}, {"label":"Enter", "x":9.75, "y":4.75, "h":1.5}, {"label":"Space", "x":10.75, "y":4.75, "h":1.5}, {"label":"Alt", "x":11.75, "y":5.25, "w":1.25}, {"label":"Left", "x":14.25, "y":4}, {"label":"Down", "x":15.25, "y":4.125}, {"label":"Up", "x":16.25, "y":4.375}, {"label":"Right", "x":17.25, "y":4.375}] + } + } +} From 2da852215443dc62617efee911c11a6dd9d03139 Mon Sep 17 00:00:00 2001 From: Jasper Lievisse Adriaanse Date: Sat, 27 Oct 2018 17:29:34 +0200 Subject: [PATCH 388/788] Keymap: add my planck rev 5 layout (#4085) --- keyboards/planck/keymaps/jasperla/config.h | 10 ++ keyboards/planck/keymaps/jasperla/keymap.c | 136 ++++++++++++++++++++ keyboards/planck/keymaps/jasperla/readme.md | 7 + keyboards/planck/keymaps/jasperla/rules.mk | 1 + 4 files changed, 154 insertions(+) create mode 100644 keyboards/planck/keymaps/jasperla/config.h create mode 100644 keyboards/planck/keymaps/jasperla/keymap.c create mode 100644 keyboards/planck/keymaps/jasperla/readme.md create mode 100644 keyboards/planck/keymaps/jasperla/rules.mk diff --git a/keyboards/planck/keymaps/jasperla/config.h b/keyboards/planck/keymaps/jasperla/config.h new file mode 100644 index 000000000..dc2a7369b --- /dev/null +++ b/keyboards/planck/keymaps/jasperla/config.h @@ -0,0 +1,10 @@ +#pragma once + +#ifdef AUDIO_ENABLE + #define STARTUP_SONG SONG(PLANCK_SOUND) +#endif + +/* + * MIDI options + */ +#define MIDI_BASIC diff --git a/keyboards/planck/keymaps/jasperla/keymap.c b/keyboards/planck/keymaps/jasperla/keymap.c new file mode 100644 index 000000000..14f445d0f --- /dev/null +++ b/keyboards/planck/keymaps/jasperla/keymap.c @@ -0,0 +1,136 @@ +/* Copyright 2015-2017 Jack Humbert + * + * 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 . + */ + +#include QMK_KEYBOARD_H +#include "muse.h" + +extern keymap_config_t keymap_config; + +enum planck_layers { + _QWERTY, + _LOWER, + _RAISE, + _POINTER, + _ADJUST +}; + +#define QWERTY 0 + +#define LOWER MO(_LOWER) +#define RAISE MO(_RAISE) +#define PT MO(_POINTER) + +/* ALT+F12 is mapped (in software) to lock the user's display */ +#define LOCK LALT(KC_F12) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Shift | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Ctrl | | LGUI | Alt |Lower | SPC | Enter|Raise |Point.| | LOCK | | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = LAYOUT_planck_grid( + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT , + KC_LCTL, _______, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_ENT, RAISE, PT, _______, LOCK, _______ +), + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | Home | End | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT_planck_grid( + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_NUHS), S(KC_NUBS), KC_HOME, KC_END, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY +), + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | INS |ISO / |Pg Up |Pg Dn | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT_planck_grid( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_NUBS, KC_PGUP, KC_PGDN, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY +), + +/* Pointers + * ,-----------------------------------------------------------------------------------. + * | | | | | | | | | Up | | | | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | | | | | | Left | Down | Right| | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_POINTER] = LAYOUT_planck_grid( + _______, _______, _______, _______, _______, _______, _______, _______, KC_UP, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, PT, _______, _______, _______ +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | Reset| | | | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty| | | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof| | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = LAYOUT_planck_grid( + _______, RESET, DEBUG, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, _______, RGB_VAI, RGB_VAD, KC_DEL , + _______, _______, MU_MOD, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, _______, _______, _______, _______, + _______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, TERM_ON, TERM_OFF, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +) + + +}; + +uint32_t layer_state_set_user(uint32_t state) { + return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST); +} diff --git a/keyboards/planck/keymaps/jasperla/readme.md b/keyboards/planck/keymaps/jasperla/readme.md new file mode 100644 index 000000000..381667c73 --- /dev/null +++ b/keyboards/planck/keymaps/jasperla/readme.md @@ -0,0 +1,7 @@ +# jasperla's keymap for Planck + +Slightly adjusted from the default keymap: +- map the arrow keys to IJKL on a separate "pointers" layer +- return key is next to the space key, and an RSHIFT is mapped + to where return used to be +- removed the dvorak, colemak and plover layers diff --git a/keyboards/planck/keymaps/jasperla/rules.mk b/keyboards/planck/keymaps/jasperla/rules.mk new file mode 100644 index 000000000..dcf16bef3 --- /dev/null +++ b/keyboards/planck/keymaps/jasperla/rules.mk @@ -0,0 +1 @@ +SRC += muse.c From 569545a78f24644b1b130369d53932f7f46a588a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=BDan=20Pevec?= Date: Sat, 27 Oct 2018 17:30:47 +0200 Subject: [PATCH 389/788] Keymap: Personal dz60 keymap (#4251) * Personal dz60 keymap * Replacing unused macros Co-Authored-By: pevecyan * Fixes on keymap --- keyboards/dz60/keymaps/pevecyan/keymap.c | 41 ++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 keyboards/dz60/keymaps/pevecyan/keymap.c diff --git a/keyboards/dz60/keymaps/pevecyan/keymap.c b/keyboards/dz60/keymaps/pevecyan/keymap.c new file mode 100644 index 000000000..897b6260b --- /dev/null +++ b/keyboards/dz60/keymaps/pevecyan/keymap.c @@ -0,0 +1,41 @@ + +#include QMK_KEYBOARD_H +#include "keymap_slovenian.h" + + +#define CARON LT(3, SI_CIRC) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [0] = LAYOUT( \ + KC_GESC,SI_1, SI_2, SI_3, SI_4, SI_5, SI_6, SI_7, SI_8, SI_9, SI_0, SI_QOT, SI_PLUS,XXXXXXX,KC_BSPC, \ + KC_TAB, SI_Q, SI_W, SI_E, SI_R, SI_T, SI_Z, SI_U, SI_I, SI_O, SI_P, SI_GRV, SI_TILD,CARON, \ + MO(2), SI_A, SI_S, SI_D, SI_F, SI_G, SI_H, SI_J, SI_K, SI_L, KC_SCLN,KC_QUOT,KC_ENT, \ + KC_LSFT,XXXXXXX,SI_Y, SI_X, SI_C, SI_V, SI_B, SI_N, SI_M, SI_COMM,SI_DOT, SI_MINS, KC_RSFT,XXXXXXX, \ + KC_LCTL,KC_LGUI, KC_LALT,KC_SPC, KC_SPC, KC_SPC, KC_RALT,MO(3), XXXXXXX,MO(1), KC_F5 \ + ), + + [1] = LAYOUT( \ + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______,KC_DEL, \ + _______, RGB_TOG,RGB_MOD,RGB_HUI,RGB_HUD,RGB_SAI,RGB_SAD,RGB_VAI,RGB_VAD,_______,_______,_______,_______,RESET, \ + _______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, \ + _______,_______,_______,_______,BL_DEC, BL_TOGG,BL_INC, BL_STEP,_______,_______,_______,_______, _______,_______, \ + _______,_______, _______,_______, _______, _______, _______,_______,_______,_______,_______ \ + ), + + [2] = LAYOUT( \ + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, \ + _______, KC_BSPC,KC_UP, KC_DEL, _______,_______,_______,_______,_______,_______,_______,_______,KC_HOME, KC_END, \ + _______, KC_LEFT,KC_DOWN,KC_RGHT,_______,_______,_______,_______,_______,_______,_______,_______,_______, \ + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______, \ + _______,_______, _______,_______, _______, _______, _______,_______,_______,_______,_______ \ + ), + + [3] = LAYOUT( \ + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, \ + _______, _______,_______,_______,_______,_______,SI_ZV, _______,_______,_______,_______,_______,_______,_______, \ + _______, _______,SI_SV, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______, \ + _______,_______,_______,_______,SI_CV, _______,_______,_______,_______,_______,_______,_______, _______,_______, \ + _______,_______, _______,_______, _______, _______, _______,_______,_______,_______,_______ \ + ), +}; From 9ea01035202e0d9b43413537702ac77b4c32108c Mon Sep 17 00:00:00 2001 From: Mattia Dal Ben Date: Sat, 27 Oct 2018 18:40:28 +0200 Subject: [PATCH 390/788] Keyboard: Redox keymaps refactoring (#4258) * Reconfigured keymap macro to resemble physical layout * Updated italian keymap * Added RGB controls * Updated default keymap * Updated german layout * Updated jeherve keymap * Changed include guards to pragmas * Changed include guards to pragmas in keymaps * Update readme * Fixed unused include * Fixed indentation --- keyboards/redox/config.h | 5 +- keyboards/redox/keymaps/default/config.h | 7 +- keyboards/redox/keymaps/default/keymap.c | 136 +++++++---------- keyboards/redox/keymaps/german/keymap.c | 126 ++++++++-------- keyboards/redox/keymaps/italian/config.h | 7 +- keyboards/redox/keymaps/italian/keymap.c | 146 +++++++++--------- keyboards/redox/keymaps/jeherve/keymap.c | 179 ++++++++++------------- keyboards/redox/readme.md | 10 +- keyboards/redox/redox.h | 22 +-- keyboards/redox/rev1/config.h | 5 +- keyboards/redox/rev1/rev1.h | 74 +++------- 11 files changed, 290 insertions(+), 427 deletions(-) diff --git a/keyboards/redox/config.h b/keyboards/redox/config.h index 1083ff5f5..96f57f25e 100644 --- a/keyboards/redox/config.h +++ b/keyboards/redox/config.h @@ -15,9 +15,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef CONFIG_H -#define CONFIG_H +#pragma once #include "config_common.h" - -#endif diff --git a/keyboards/redox/keymaps/default/config.h b/keyboards/redox/keymaps/default/config.h index 22e26c004..0670bf294 100644 --- a/keyboards/redox/keymaps/default/config.h +++ b/keyboards/redox/keymaps/default/config.h @@ -15,10 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" +#pragma once /* Use I2C or Serial, not both */ @@ -37,5 +34,3 @@ along with this program. If not, see . #define RGBLIGHT_HUE_STEP 8 #define RGBLIGHT_SAT_STEP 8 #define RGBLIGHT_VAL_STEP 8 - -#endif diff --git a/keyboards/redox/keymaps/default/keymap.c b/keyboards/redox/keymaps/default/keymap.c index 3031a0c8e..ef8eeb2e1 100644 --- a/keyboards/redox/keymaps/default/keymap.c +++ b/keyboards/redox/keymaps/default/keymap.c @@ -18,99 +18,75 @@ enum custom_keycodes { ADJUST, }; -// Fillers to make layering more clear -#define KC_ KC_TRNS -#define _______ KC_TRNS -#define XXXXXXX KC_NO +// Shortcut to make keymap more readable +#define KC_BKSL KC_BSLASH +#define SYM_L MO(_SYMB) + +#define KC_ALAS LALT_T(KC_PAST) +#define KC_CTPL LCTL_T(KC_PSLS) + +#define KC_NAGR LT(_NAV, KC_GRV) +#define KC_NAMI LT(_NAV, KC_MINS) + +#define KC_ADEN LT(_ADJUST, KC_END) +#define KC_ADPU LT(_ADJUST, KC_PGUP) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -/* QWERTY - * ,------------------------------------------------. ,------------------------------------------------. - * |`-Lyr2| 1 | 2 | 3 | 4 | 5 | Lyr1 | | Lyr1 | 6 | 7 | 8 | 9 | 0 |--Lyr2| - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | Tab | Q | W | E | R | T | [ | | ] | Y | U | I | O | P | = | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | Esc | A | S | D | F | G | PgUp | | End | H | J | K | L | ; | ' | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | PgDn | | Home | N | M | , | . | \ |Shift | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | Gui | + | - |*(Alt)|/(Ctr)|Bcksp | Del | |Enter |Space | Alt | Left | Down | Up | Right| - * `------------------------------------------------' `------------------------------------------------' - */ [_QWERTY] = LAYOUT( - //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. - LT(_NAV, KC_GRV) , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 ,MO(_SYMB), MO(_SYMB), KC_6 , KC_7 , KC_8 , KC_9 , KC_0 ,LT(_NAV, KC_MINS), - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T ,KC_LBRC, KC_RBRC , KC_Y , KC_U , KC_I , KC_O , KC_P ,KC_EQL, - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - KC_ESC , KC_A , KC_S , KC_D , KC_F , KC_G , LT(_ADJUST, KC_PGUP), LT( _ADJUST, KC_END) , KC_H , KC_J , KC_K , KC_L ,KC_SCLN,KC_QUOT, - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - KC_LSFT, KC_Z , KC_X , KC_C , KC_V , KC_B ,KC_PGDN, KC_HOME , KC_N , KC_M ,KC_COMM,KC_DOT ,KC_BSLASH, KC_RSFT, - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - KC_LGUI,KC_PPLS,KC_PMNS,LALT_T(KC_PAST),LCTL_T(KC_PSLS),KC_BSPC,KC_DEL , KC_ENT , KC_SPC, KC_RALT,KC_LEFT,KC_DOWN, KC_UP ,KC_RGHT - //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_NAGR ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 , KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,KC_NAMI , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_TAB ,KC_Q ,KC_W ,KC_E ,KC_R ,KC_T ,SYM_L , SYM_L ,KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,KC_EQL , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_ESC ,KC_A ,KC_S ,KC_D ,KC_F ,KC_G ,KC_LBRC , KC_RBRC ,KC_H ,KC_J ,KC_K ,KC_L ,KC_SCLN ,KC_QUOT , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_LSFT ,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,KC_ADPU ,KC_PGDN , KC_HOME ,KC_ADEN ,KC_N ,KC_M ,KC_COMM ,KC_DOT ,KC_BKSL ,KC_RSFT , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + KC_LGUI ,KC_PPLS ,KC_PMNS ,KC_ALAS , KC_CTPL , KC_BSPC ,KC_DEL , KC_ENT ,KC_SPC , KC_RALT , KC_LEFT ,KC_DOWN ,KC_UP ,KC_RGHT + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ), -/* Symbols - * ,------------------------------------------------. ,------------------------------------------------. - * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | ! | @ | { | } | | | | | | | 7 | 8 | 9 | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | # | $ | [ | ] | ~ | | | | | 4 | 5 | 6 | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | % | ^ | ( | ) | ` | | | | | 1 | 2 | 3 | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | | | | | | | | | 0 | 0 | . | | | - * `------------------------------------------------' `------------------------------------------------' - */ - [_SYMB] = LAYOUT( - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, XXXXXXX, - _______, KC_EXLM, KC_AT , KC_LCBR, KC_RCBR, KC_PIPE, _______, _______, XXXXXXX, KC_KP_7, KC_KP_8, KC_KP_9, XXXXXXX, XXXXXXX, - _______, KC_HASH, KC_DLR , KC_LBRC, KC_RBRC, KC_GRV, _______, _______, XXXXXXX, KC_KP_4, KC_KP_5, KC_KP_6, XXXXXXX, XXXXXXX, - _______, KC_PERC, KC_CIRC, KC_LPRN, KC_RPRN, KC_TILD, _______, _______, XXXXXXX, KC_KP_1, KC_KP_2, KC_KP_3, XXXXXXX, XXXXXXX, - _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_KP_0, KC_KP_0, KC_PDOT, XXXXXXX, XXXXXXX + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + _______ ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 , KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,KC_EXLM ,KC_AT ,KC_LCBR ,KC_RCBR ,KC_PIPE ,_______ , _______ ,XXXXXXX ,KC_KP_7 ,KC_KP_8 ,KC_KP_9 ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,KC_HASH ,KC_DLR ,KC_LBRC ,KC_RBRC ,KC_GRV ,_______ , _______ ,XXXXXXX ,KC_KP_4 ,KC_KP_5 ,KC_KP_6 ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,KC_PERC ,KC_CIRC ,KC_LPRN ,KC_RPRN ,KC_TILD ,_______ ,_______ , _______ ,_______ ,XXXXXXX ,KC_KP_1 ,KC_KP_2 ,KC_KP_3 ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + _______ ,_______ ,_______ ,_______ , _______ , _______ ,_______ , _______ ,_______ , KC_KP_0 , KC_KP_0 ,KC_PDOT ,XXXXXXX ,XXXXXXX + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ), -/* Navigation - * ,------------------------------------------------. ,------------------------------------------------. - * | | | | | | | | | | | | | | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | |MOUS_U| |WHEL_U| | | | | | | | | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | |MOUS_L|MOUS_D|MOUS_R|WHEL_D| | | | | LEFT | DOWN | UP |RIGHT | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | | | | | | | | | | | | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | | |MOUS_1|MOUS_2| | | | | | | | | | - * `------------------------------------------------' `------------------------------------------------' - */ [_NAV] = LAYOUT( - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - XXXXXXX, XXXXXXX, KC_MS_U, XXXXXXX, KC_WH_U, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, XXXXXXX, _______, _______, KC_LEFT, KC_DOWN, KC_UP , KC_RIGHT,XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_BTN1, KC_BTN2, _______, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + _______ ,_______ ,_______ ,_______ ,_______ ,_______ , _______ ,_______ ,_______ ,_______ ,_______ ,_______ , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,KC_MS_U ,XXXXXXX ,KC_WH_U ,XXXXXXX ,_______ , _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_WH_D ,XXXXXXX ,_______ , _______ ,KC_LEFT ,KC_DOWN ,KC_UP ,KC_RIGHT,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ ,_______ , _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , KC_BTN1 , KC_BTN2 ,_______ , _______ ,_______ , XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ), [_ADJUST] = LAYOUT( - XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, - XXXXXXX, RESET , RGB_M_P, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, XXXXXXX, KC_DEL, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + XXXXXXX ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 , KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,RESET ,RGB_M_P ,RGB_TOG ,RGB_MOD ,RGB_HUD ,RGB_HUI , RGB_SAD ,RGB_SAI ,RGB_VAD ,RGB_VAI ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ ,XXXXXXX , XXXXXXX ,_______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ) }; - -#ifdef AUDIO_ENABLE -float tone_qwerty[][2] = SONG(QWERTY_SOUND); -#endif - -void persistent_default_layer_set(uint16_t default_layer) { - eeconfig_update_default_layer(default_layer); - default_layer_set(default_layer); -} - diff --git a/keyboards/redox/keymaps/german/keymap.c b/keyboards/redox/keymaps/german/keymap.c index 315740f68..f94cd164a 100644 --- a/keyboards/redox/keymaps/german/keymap.c +++ b/keyboards/redox/keymaps/german/keymap.c @@ -1,4 +1,5 @@ #include QMK_KEYBOARD_H + #include "keymap_german.h" extern keymap_config_t keymap_config; @@ -20,89 +21,76 @@ enum custom_keycodes { ADJUST, }; -// Fillers to make layering more clear -#define KC_ KC_TRNS -#define _______ KC_TRNS -#define XXXXXXX KC_NO +// Shortcut to make keymap more readable +#define KC_BKSL KC_BSLASH +#define SYM_L MO(_SYMB) + +#define KC_ALAS LALT_T(KC_PAST) +#define KC_CTPL LCTL_T(KC_PSLS) + +#define KC_NAGR LT(_NAV, DE_CIRC) +#define KC_NAMI LT(_NAV, DE_SS) + +#define KC_ADEN LT(_ADJUST, KC_END) +#define KC_ADPU LT(_ADJUST, KC_PGUP) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -/* QWERTY - * ,------------------------------------------------. ,------------------------------------------------. - * |^/Lyr2| 1 | 2 | 3 | 4 | 5 | Lyr1 | | Lyr1 | 6 | 7 | 8 | 9 | 0 |--Lyr2| - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | Tab | Q | W | E | R | T | ` | | + | Y | U | I | O | P | = | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | Esc | A | S | D | F | G | PgUp | | End | H | J | K | L | Ö | Ä | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | PgDn | | Home | N | M | , | . | - |Shift | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | Gui | < | # |*(Alt)|/(Ctr)|Bcksp | Del | |Enter |Space | Alt | Left | Down | Up | Right| - * `------------------------------------------------' `------------------------------------------------' - */ [_QWERTY] = LAYOUT( - //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. - LT(_NAV, DE_CIRC) , DE_1 , DE_2 , DE_3 , DE_4 , DE_5 ,MO(_SYMB), MO(_SYMB), DE_6 , DE_7 , DE_8 , DE_9 , DE_0 ,LT(_NAV, DE_SS), - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - KC_TAB , DE_Q , DE_W , DE_E , DE_R , DE_T , DE_ACUT, DE_PLUS , DE_Z , DE_U , DE_I , DE_O , DE_P , DE_UE, - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - KC_ESC , DE_A , DE_S , DE_D , DE_F , DE_G , LT(_ADJUST, KC_PGUP), LT( _ADJUST, KC_END) , DE_H , DE_J , DE_K , DE_L , DE_OE , DE_AE, - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - KC_LSFT, DE_Y , DE_X , DE_C , DE_V , DE_B ,KC_PGDN, KC_HOME , DE_N , DE_M , DE_COMM, DE_DOT , DE_MINS , KC_RSFT, - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - KC_LGUI , DE_LESS , DE_HASH , LALT_T(KC_KP_PLUS),LCTL_T(KC_KP_ASTERISK),KC_BSPC,KC_DEL , KC_ENT , KC_SPC, DE_ALGR , KC_LEFT, KC_DOWN, KC_UP , KC_RGHT - //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_NAGR ,DE_1 ,DE_2 ,DE_3 ,DE_4 ,DE_5 , DE_6 ,DE_7 ,DE_8 ,DE_9 ,DE_0 ,KC_NAMI , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_TAB ,DE_Q ,DE_W ,DE_E ,DE_R ,DE_T ,SYM_L , SYM_L ,DE_Z ,DE_U ,DE_I ,DE_O ,DE_P ,DE_UE , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_ESC ,DE_A ,DE_S ,DE_D ,DE_F ,DE_G ,DE_ACUT , DE_PLUS ,DE_H ,DE_J ,DE_K ,DE_L ,DE_OE ,DE_AE , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_LSFT ,DE_Y ,DE_X ,DE_C ,DE_V ,DE_B ,KC_ADPU ,KC_PGDN , KC_HOME ,KC_ADEN ,DE_N ,DE_M ,DE_COMM ,DE_DOT ,DE_MINS ,KC_RSFT , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + KC_LGUI ,KC_PPLS ,KC_PMNS ,KC_ALAS , KC_CTPL , KC_BSPC ,KC_DEL , KC_ENT ,KC_SPC , KC_RALT , KC_LEFT ,KC_DOWN ,KC_UP ,KC_RGHT + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ), -/* Symbols - * ,------------------------------------------------. ,------------------------------------------------. - * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | ! | @ | { | } | | | | | | | 7 | 8 | 9 | | F12 | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | # | $ | [ | ] | ~ | | | | | 4 | 5 | 6 | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | Shift| % | ^ | ( | ) | ` | | | | | 1 | 2 | 3 | |Shift | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | | Alt | Ctrl | | | | | | 0 | 0 | . | | | - * `------------------------------------------------' `------------------------------------------------' - */ [_SYMB] = LAYOUT( - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, - _______, DE_EXLM, DE_AT , DE_LCBR, DE_RCBR, DE_PIPE, _______, _______, XXXXXXX, KC_KP_7, KC_KP_8, KC_KP_9, XXXXXXX, KC_F12, - _______, DE_HASH, DE_DLR , DE_LBRC, DE_RBRC, DE_TILD, _______, _______, XXXXXXX, KC_KP_4, KC_KP_5, KC_KP_6, XXXXXXX, XXXXXXX, - KC_LSFT, DE_PERC, DE_CIRC, DE_LPRN, DE_RPRN, DE_GRV, _______, _______, XXXXXXX, KC_KP_1, KC_KP_2, KC_KP_3, XXXXXXX, KC_RSFT, - _______, _______, _______, KC_LALT, KC_LCTL, _______, _______, _______, _______, KC_KP_0, KC_KP_0, KC_PDOT, XXXXXXX, XXXXXXX + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + _______ ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 , KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,KC_F11 , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,DE_EXLM ,DE_AT ,DE_LCBR ,DE_RCBR ,DE_PIPE ,_______ , _______ ,XXXXXXX ,KC_KP_7 ,KC_KP_8 ,KC_KP_9 ,XXXXXXX ,KC_F12 , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,DE_HASH ,DE_DLR ,DE_LBRC ,DE_RBRC ,DE_TILD ,_______ , _______ ,XXXXXXX ,KC_KP_4 ,KC_KP_5 ,KC_KP_6 ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_LSFT ,DE_PERC ,DE_CIRC ,DE_LPRN ,DE_RPRN ,DE_GRV ,_______ ,_______ , _______ ,_______ ,XXXXXXX ,KC_KP_1 ,KC_KP_2 ,KC_KP_3 ,XXXXXXX ,KC_RSFT , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + _______ ,_______ ,_______ ,KC_LALT , KC_LCTL , _______ ,_______ , _______ ,_______ , KC_KP_0 , KC_KP_0 ,KC_PDOT ,XXXXXXX ,XXXXXXX + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ), -/* Navigation - * ,------------------------------------------------. ,------------------------------------------------. - * | | | | | | | | | | | | | | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | |MOUS_U| |WHEL_U| | | | | | | | | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | |MOUS_L|MOUS_D|MOUS_R|WHEL_D| | | | | LEFT | DOWN | UP |RIGHT | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | | | | | | | | | | | | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | | |MOUS_1|MOUS_2| | | | | | | | | | - * `------------------------------------------------' `------------------------------------------------' - */ [_NAV] = LAYOUT( - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - XXXXXXX, XXXXXXX, KC_MS_U, XXXXXXX, KC_WH_U, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, XXXXXXX, _______, _______, KC_LEFT, KC_DOWN, KC_UP , KC_RIGHT,XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_BTN1, KC_BTN2, _______, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + _______ ,_______ ,_______ ,_______ ,_______ ,_______ , _______ ,_______ ,_______ ,_______ ,_______ ,_______ , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,KC_MS_U ,XXXXXXX ,KC_WH_U ,XXXXXXX ,_______ , _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_WH_D ,XXXXXXX ,_______ , _______ ,KC_LEFT ,KC_DOWN ,KC_UP ,KC_RIGHT,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ ,_______ , _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , KC_BTN1 , KC_BTN2 ,_______ , _______ ,_______ , XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ), [_ADJUST] = LAYOUT( - XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, - XXXXXXX, RESET , RGB_M_P, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, XXXXXXX, KC_DEL, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + XXXXXXX ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 , KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,RESET ,RGB_M_P ,RGB_TOG ,RGB_MOD ,RGB_HUD ,RGB_HUI , RGB_SAD ,RGB_SAI ,RGB_VAD ,RGB_VAI ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ ,XXXXXXX , XXXXXXX ,_______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ) }; diff --git a/keyboards/redox/keymaps/italian/config.h b/keyboards/redox/keymaps/italian/config.h index 22e26c004..0670bf294 100644 --- a/keyboards/redox/keymaps/italian/config.h +++ b/keyboards/redox/keymaps/italian/config.h @@ -15,10 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" +#pragma once /* Use I2C or Serial, not both */ @@ -37,5 +34,3 @@ along with this program. If not, see . #define RGBLIGHT_HUE_STEP 8 #define RGBLIGHT_SAT_STEP 8 #define RGBLIGHT_VAL_STEP 8 - -#endif diff --git a/keyboards/redox/keymaps/italian/keymap.c b/keyboards/redox/keymaps/italian/keymap.c index c590d2d2d..1eb34ff10 100644 --- a/keyboards/redox/keymaps/italian/keymap.c +++ b/keyboards/redox/keymaps/italian/keymap.c @@ -1,5 +1,7 @@ #include QMK_KEYBOARD_H +#include "keymap_italian.h" + extern keymap_config_t keymap_config; // Each layer gets a name for readability, which is then used in the keymap matrix below. @@ -18,99 +20,83 @@ enum custom_keycodes { ADJUST, }; -// Fillers to make layering more clear -#define KC_ KC_TRNS -#define _______ KC_TRNS -#define XXXXXXX KC_NO +// Shortcut to make keymap more readable +#define KC_BKSL KC_BSLASH +#define SYM_L MO(_SYMB) + +#define KC_ALAS LALT_T(KC_PAST) +#define KC_CTPL LCTL_T(KC_PSLS) + +#define KC_NAGR LT(_NAV, KC_GRV) +#define KC_NAMI LT(_NAV, KC_MINS) + +#define KC_ADEN LT(_ADJUST, KC_END) +#define KC_ADPU LT(_ADJUST, KC_PGUP) + +// Italian specific shortcuts +#define ALT_IACC RALT_T(IT_IACC) +#define GUI_LESS LGUI_T(IT_LESS) + +#define IT_SHSL RSFT_T(KC_SLSH) +#define IT_GRV RALT(KC_MINS) +#define IT_TILD RALT(KC_EQL) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -/* QWERTY - * ,------------------------------------------------. ,------------------------------------------------. - * |\-Lyr2| 1 | 2 | 3 | 4 | 5 | Lyr1 | | Lyr1 | 6 | 7 | 8 | 9 | 0 |'-Lyr2| - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | Tab | Q | W | E | R | T | [ | | ] | Y | U | I | O | P | è | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | Esc | A | S | D | F | G | PgUp | | End | H | J | K | L | ò | à | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | PgDn | | Home | N | M | , | . | ù |-(Sft)| - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * |<(Gui)| + | - |*(Alt)|/(Ctr)|Bcksp | Del | |Enter |Space |ì(AlG)| Left | Down | Up | Right| - * `------------------------------------------------' `------------------------------------------------' - */ [_QWERTY] = LAYOUT( - //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. - LT(_NAV, KC_GRV) , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 ,MO(_SYMB), MO(_SYMB), KC_6 , KC_7 , KC_8 , KC_9 , KC_0 ,LT(_NAV, KC_MINS), - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T ,RALT(KC_LBRC), RALT(KC_RBRC) , KC_Y , KC_U , KC_I , KC_O , KC_P ,KC_LBRC, - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - KC_ESC , KC_A , KC_S , KC_D , KC_F , KC_G , LT(_ADJUST, KC_PGUP), LT( _ADJUST, KC_END) , KC_H , KC_J , KC_K , KC_L ,KC_SCLN,KC_QUOT, - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - KC_LSFT, KC_Z , KC_X , KC_C , KC_V , KC_B ,KC_PGDN, KC_HOME , KC_N , KC_M ,KC_COMM,KC_DOT ,KC_BSLASH,RSFT_T(KC_SLSH), - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - LGUI_T(KC_NONUS_BSLASH),KC_PPLS,KC_PMNS,LALT_T(KC_PAST),LCTL_T(KC_PSLS),KC_BSPC,KC_DEL , KC_ENT , KC_SPC, RALT_T(KC_EQL),KC_LEFT,KC_DOWN, KC_UP ,KC_RGHT - //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_NAGR ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 , KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,KC_NAMI , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_TAB ,KC_Q ,KC_W ,KC_E ,KC_R ,KC_T ,SYM_L , SYM_L ,KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,IT_EACC , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_ESC ,KC_A ,KC_S ,KC_D ,KC_F ,KC_G ,IT_LBRC , IT_RBRC ,KC_H ,KC_J ,KC_K ,KC_L ,IT_OACC ,IT_AACC , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_LSFT ,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,KC_ADPU ,KC_PGDN , KC_HOME ,KC_ADEN ,KC_N ,KC_M ,KC_COMM ,KC_DOT ,IT_UACC ,IT_SHSL , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + GUI_LESS,KC_PPLS ,KC_PMNS ,KC_ALAS , KC_CTPL , KC_BSPC ,KC_DEL , KC_ENT ,KC_SPC , ALT_IACC, KC_LEFT ,KC_DOWN ,KC_UP ,KC_RGHT + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ), -/* Symbols - * ,------------------------------------------------. ,------------------------------------------------. - * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | ! | @ | { | } | | | | | | | 7 | 8 | 9 | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | # | $ | [ | ] | ~ | | | | | 4 | 5 | 6 | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | % | ^ | ( | ) | ` | | | | | 1 | 2 | 3 | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | | | | | | | | | 0 | 0 | . | | | - * `------------------------------------------------' `------------------------------------------------' - */ - [_SYMB] = LAYOUT( - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, XXXXXXX, - _______, KC_EXLM, RALT(KC_SCLN), RALT(KC_LCBR), RALT(KC_RCBR), KC_TILD, _______, _______, XXXXXXX, KC_KP_7, KC_KP_8, KC_KP_9, XXXXXXX, XXXXXXX, - _______, RALT(KC_QUOT), KC_DLR , RALT(KC_LBRC), RALT(KC_RBRC), RALT(KC_EQL), _______, _______, XXXXXXX, KC_KP_4, KC_KP_5, KC_KP_6, XXXXXXX, XXXXXXX, - _______, KC_PERC, LSFT(KC_EQL) , LSFT(KC_8), LSFT(KC_9), RALT(KC_MINS), _______, _______, XXXXXXX, KC_KP_1, KC_KP_2, KC_KP_3, XXXXXXX, XXXXXXX, - _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_KP_0, KC_KP_0, KC_PDOT, XXXXXXX, XXXXXXX + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + _______ ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 , KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,IT_EXLM ,IT_AT ,IT_LCBR ,IT_RCBR ,IT_PIPE ,_______ , _______ ,XXXXXXX ,KC_KP_7 ,KC_KP_8 ,KC_KP_9 ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,IT_SHRP ,IT_DLR ,IT_LBRC ,IT_RBRC ,IT_GRV ,_______ , _______ ,XXXXXXX ,KC_KP_4 ,KC_KP_5 ,KC_KP_6 ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,IT_PERC ,IT_CRC ,IT_LPRN ,IT_RPRN ,IT_TILD ,_______ ,_______ , _______ ,_______ ,XXXXXXX ,KC_KP_1 ,KC_KP_2 ,KC_KP_3 ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + _______ ,_______ ,_______ ,_______ , _______ , _______ ,_______ , _______ ,_______ , KC_KP_0 , KC_KP_0 ,KC_PDOT ,XXXXXXX ,XXXXXXX + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ), -/* Navigation - * ,------------------------------------------------. ,------------------------------------------------. - * | | | | | | | | | | | | | | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | |MOUS_U| |WHEL_U| | | | | | | | | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | |MOUS_L|MOUS_D|MOUS_R|WHEL_D| | | | | LEFT | DOWN | UP |RIGHT | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | | | | | | | | | | | | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | | |MOUS_1|MOUS_2| | | | | | | | | | - * `------------------------------------------------' `------------------------------------------------' - */ [_NAV] = LAYOUT( - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - XXXXXXX, XXXXXXX, KC_MS_U, XXXXXXX, KC_WH_U, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, XXXXXXX, _______, _______, KC_LEFT, KC_DOWN, KC_UP , KC_RIGHT,XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_BTN1, KC_BTN2, _______, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + _______ ,_______ ,_______ ,_______ ,_______ ,_______ , _______ ,_______ ,_______ ,_______ ,_______ ,_______ , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,KC_MS_U ,XXXXXXX ,KC_WH_U ,XXXXXXX ,_______ , _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_WH_D ,XXXXXXX ,_______ , _______ ,KC_LEFT ,KC_DOWN ,KC_UP ,KC_RIGHT,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ ,_______ , _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , KC_BTN1 , KC_BTN2 ,_______ , _______ ,_______ , XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ), [_ADJUST] = LAYOUT( - XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, - XXXXXXX, RESET , RGB_M_P, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, XXXXXXX, KC_DEL, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + XXXXXXX ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 , KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,RESET ,RGB_M_P ,RGB_TOG ,RGB_MOD ,RGB_HUD ,RGB_HUI , RGB_SAD ,RGB_SAI ,RGB_VAD ,RGB_VAI ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ ,XXXXXXX , XXXXXXX ,_______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ) }; - -#ifdef AUDIO_ENABLE -float tone_qwerty[][2] = SONG(QWERTY_SOUND); -#endif - -void persistent_default_layer_set(uint16_t default_layer) { - eeconfig_update_default_layer(default_layer); - default_layer_set(default_layer); -} - diff --git a/keyboards/redox/keymaps/jeherve/keymap.c b/keyboards/redox/keymaps/jeherve/keymap.c index d298fa9a3..f8dfc4854 100644 --- a/keyboards/redox/keymaps/jeherve/keymap.c +++ b/keyboards/redox/keymaps/jeherve/keymap.c @@ -28,11 +28,6 @@ enum custom_keycodes { NBSP }; -// Fillers to make layering more clear -#define KC_ KC_TRNS -#define _______ KC_TRNS -#define XXXXXXX KC_NO - // Make macros a bit simpler with this shortcut. #define TAP_ONCE(code) \ register_code (code); \ @@ -129,118 +124,98 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { return true; }; +// Shortcut to make keymap more readable +#define KC_CTDN LCTL(KC_DOWN) +#define KC_SYQT LT(_SYMB,KC_QUOT) +#define SYM_L MO(_SYMB) +#define MO_INTR MO(_INTER) +#define TT_ADJ TT(_ADJUST) + +#define UC_00E0 UC(0x00E0) +#define UC_00FC UC(0x00FC) +#define UC_00E8 UC(0x00E8) +#define UC_00F6 UC(0x00F6) +#define UC_00E1 UC(0x00E1) +#define UC_00F9 UC(0x00F9) +#define UC_00E9 UC(0x00E9) +#define UC_00ED UC(0x00ED) +#define UC_00F3 UC(0x00F3) +#define UC_00E2 UC(0x00E2) +#define UC_00E7 UC(0x00E7) +#define UC_0171 UC(0x0171) +#define UC_00EA UC(0x00EA) +#define UC_0151 UC(0x0151) + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -/* COLEMAK - * ,------------------------------------------------. ,------------------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | Esc | | Exp | 6 | 7 | 8 | 9 | 0 | = | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | Tab | Q | W | F | P | G | ( | | ) | J | L | U | Y | ; | \ | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | Lay1 | A | R | S | T | D | Lay2 | | Lay2 | H | N | E | I | O |'/Lay1| - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | Lay1 | | Lay1 | K | M | , | . | / |Shift | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | Lay3 | Ctrl | Hyper| Alt | Cmd |Bcksp | Ctrl | |Enter |Space | Cmd | Lay4 | Hyper| Ctrl | Lay3 | - * `------------------------------------------------' `------------------------------------------------' - */ [_COLEMAK] = LAYOUT( - //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. - KC_GRV , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 ,KC_ESC, LCTL(KC_DOWN), KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_EQL, - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - KC_TAB , KC_Q , KC_W , KC_F , KC_P , KC_G , M_BRACKET_LEFT, M_BRACKET_RIGHT , KC_J , KC_L , KC_U , KC_Y , KC_SCLN , KC_BSLS, - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - MO(_SYMB) , KC_A , KC_R , KC_S , KC_T , KC_D ,TT(_NAV), TT(_NAV) , KC_H , KC_N , KC_E , KC_I , KC_O , LT(_SYMB,KC_QUOT), - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - KC_LSFT , KC_Z , KC_X , KC_C , KC_V , KC_B ,TT(_SYMB), TT(_SYMB) , KC_K , KC_M , KC_COMM , KC_DOT , KC_SLSH , KC_RSFT, - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - MO(_INTER),KC_LCTL,KC_HYPR,KC_LALT, KC_LCMD, KC_BSPC,KC_LCTL, KC_ENT,KC_SPC , KC_RCMD , TT(_ADJUST),KC_HYPR,KC_RCTL,MO(_INTER) - //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_GRV ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 , KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,KC_EQL , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_TAB ,KC_Q ,KC_W ,KC_F ,KC_P ,KC_G ,KC_ESC , KC_CTDN ,KC_J ,KC_L ,KC_U ,KC_Y ,KC_SCLN ,KC_BSLS , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + SYM_L ,KC_A ,KC_R ,KC_S ,KC_T ,KC_D ,M_BRACKET_LEFT, M_BRACKET_RIGHT ,KC_H ,KC_N ,KC_E ,KC_I ,KC_O ,KC_SYQT , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_LSFT ,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,TT(_NAV),TT(_SYMB), TT(_SYMB),TT(_NAV),KC_K ,KC_M ,KC_COMM ,KC_DOT ,KC_SLSH ,KC_RSFT , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + MO_INTR ,KC_LCTL ,KC_HYPR ,KC_LALT , KC_LCMD , KC_BSPC ,KC_LCTL , KC_ENT ,KC_SPC , KC_RCMD , TT_ADJ ,KC_HYPR ,KC_RCTL ,MO_INTR + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ), -/* Symbols - * ,------------------------------------------------. ,------------------------------------------------. - * | | | | | | | | | | | | | | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | 1 | 2 | 3 | 4 | 5 | | | | 6 | 7 | 8 | 9 | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | ! | @ | # | $ | % | | | | ^ | & | * | - | _ | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | | | | | | | | | | | | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | | | | | | | | | | | | | | - * `------------------------------------------------' `------------------------------------------------' - */ - [_SYMB] = LAYOUT( - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_LCBR, KC_RCBR, KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , _______, - _______, KC_EXLM, KC_AT , KC_HASH, KC_DLR , KC_PERC, _______, _______, KC_CIRC, KC_AMPR, KC_ASTR, KC_MINS, KC_UNDS, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + _______ ,_______ ,_______ ,_______ ,_______ ,_______ , _______ ,_______ ,_______ ,_______ ,_______ ,_______ , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 ,KC_LCBR , KC_RCBR ,KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,_______ , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,KC_EXLM ,KC_AT ,KC_HASH ,KC_DLR ,KC_PERC ,_______ , _______ ,KC_CIRC ,KC_AMPR ,KC_ASTR ,KC_MINS ,KC_UNDS ,_______ , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,_______ ,_______ ,_______ ,_______ ,_______ ,_______ ,_______ , _______ ,_______ ,_______ ,_______ ,_______ ,_______ ,_______ ,_______ , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + _______ ,_______ ,_______ ,_______ , _______ , _______ ,_______ , _______ ,_______ , _______ , _______ ,_______ ,_______ ,_______ + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ), -/* Navigation - * ,------------------------------------------------. ,------------------------------------------------. - * | | | | | | | | | | | | | | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | | | | | | | | | | | | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | |VOLDOW|VOL UP| MUTE | | | | LEFT | DOWN | UP |RIGHT | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | | | | | | | | | | | | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | | | | | | | | | | | | | | - * `------------------------------------------------' `------------------------------------------------' - */ [_NAV] = LAYOUT( - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, KC_VOLD, KC_VOLU, KC_MUTE, XXXXXXX, _______, _______, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP , KC_RIGHT, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, _______ + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + _______ ,_______ ,_______ ,_______ ,_______ ,_______ , _______ ,_______ ,_______ ,_______ ,_______ ,_______ , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ , _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,KC_VOLD ,KC_VOLU ,KC_MUTE ,XXXXXXX ,_______ , _______ ,XXXXXXX ,KC_LEFT ,KC_DOWN ,KC_UP ,KC_RIGHT,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ , _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,_______ , _______ ,XXXXXXX , XXXXXXX , _______ ,XXXXXXX ,XXXXXXX ,_______ + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ), -/* i18n + emoji -* ,------------------------------------------------. ,------------------------------------------------. -* | | | | | | | | | | | | | | | | -* |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| -* | | à | 👋 | | | | | | | | ü | è | YOSHI| ö | | -* |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| -* | | á | |SHRUG | 👍 | | | | | | ú | é | í | ó | | -* |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| -* | | â | | ç | | | | | | | ű | ê | | ő | | -* |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| -* | | | | | | | | | | | | | | | | -* `------------------------------------------------' `------------------------------------------------' -*/ [_INTER] = LAYOUT( - XXXXXXX, _______ , _______, _______ , _______ , _______, _______, _______, _______, _______, _______, _______, _______, _______, - XXXXXXX, UC(0x00E0), WAVE , XXXXXXX , XXXXXXX , XXXXXXX, _______, _______, XXXXXXX, UC(0x00FC), UC(0x00E8), YOSHI, UC(0x00F6), XXXXXXX, - _______, UC(0x00E1), XXXXXXX, SHRUG , THUMB_UP, XXXXXXX, _______, _______, XXXXXXX, UC(0x00F9), UC(0x00E9), UC(0x00ED) , UC(0x00F3), _______, - XXXXXXX, UC(0x00E2), XXXXXXX, UC(0x00E7), XXXXXXX , XXXXXXX, _______, _______, XXXXXXX, UC(0x0171), UC(0x00EA), XXXXXXX, UC(0x0151), XXXXXXX, - _______, XXXXXXX , XXXXXXX, XXXXXXX , XXXXXXX , XXXXXXX, _______, _______, NBSP, XXXXXXX, _______, XXXXXXX, XXXXXXX, _______ + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + XXXXXXX ,_______ ,_______ ,_______ ,_______ ,_______ , _______ ,_______ ,_______ ,_______ ,_______ ,_______ , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,UC_00E0 ,WAVE ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ , _______ ,XXXXXXX ,UC_00FC ,UC_00E8 ,YOSHI ,UC_00F6 ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,UC_00E1 ,XXXXXXX ,SHRUG ,THUMB_UP,XXXXXXX ,_______ , _______ ,XXXXXXX ,UC_00F9 ,UC_00E9 ,UC_00ED ,UC_00F3 ,_______ , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,UC_00E2 ,XXXXXXX ,UC_00E7 ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ , _______ ,XXXXXXX ,XXXXXXX ,UC_0171 ,UC_00EA ,XXXXXXX ,UC_0151 ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,_______ , _______ ,NBSP , XXXXXXX , _______ ,XXXXXXX ,XXXXXXX ,_______ + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ), -/* Adjust keyboard settings - * ,------------------------------------------------. ,------------------------------------------------. - * | | | | | | | | | | | | | | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | | | | | | | | | | | | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | RGB- | RGB+ |RGB ON| | | | | | RESET| DEBUG|AUD ON| | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | | | | | | | | | | | | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | | | | | | | | | | | | | | - * `------------------------------------------------' `------------------------------------------------' - */ [_ADJUST] = LAYOUT( - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - _______, XXXXXXX, RGB_VAD, RGB_VAI, RGB_TOG, XXXXXXX, _______, _______, XXXXXXX, RESET , DEBUG , AU_TOG , XXXXXXX, _______, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, _______ + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,XXXXXXX ,RGB_VAD ,RGB_VAI ,RGB_TOG ,XXXXXXX ,_______ , _______ ,XXXXXXX ,RESET ,DEBUG ,AU_TOG ,XXXXXXX ,_______ , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ , _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,_______ , _______ ,XXXXXXX , XXXXXXX , _______ ,XXXXXXX ,XXXXXXX ,_______ + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ) }; diff --git a/keyboards/redox/readme.md b/keyboards/redox/readme.md index 8a2fc4b04..d237caf01 100644 --- a/keyboards/redox/readme.md +++ b/keyboards/redox/readme.md @@ -16,10 +16,14 @@ Make example for this keyboard (after setting up your build environment): - make redox/rev1:default +```sh +make redox/rev1:default +``` Example of flashing this keyboard: - make redox/rev1:default:avrdude +```sh +make redox/rev1:default:avrdude +``` -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. +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). diff --git a/keyboards/redox/redox.h b/keyboards/redox/redox.h index 73f5ab85a..2f08bddcc 100644 --- a/keyboards/redox/redox.h +++ b/keyboards/redox/redox.h @@ -13,29 +13,11 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#ifndef REDOX_H -#define REDOX_H + +#pragma once #ifdef KEYBOARD_redox_rev1 #include "rev1.h" #endif -// Used to create a keymap using only KC_ prefixed keys -#define LAYOUT_kc( \ - L00, L01, L02, L03, L04, L05, L06, R00, R01, R02, R03, R04, R05, R06, \ - L10, L11, L12, L13, L14, L15, L16, R10, R11, R12, R13, R14, R15, R16, \ - L20, L21, L22, L23, L24, L25, L26, R20, R21, R22, R23, R24, R25, R26, \ - L30, L31, L32, L33, L34, L35, L36, R30, R31, R32, R33, R34, R35, R36, \ - L40, L41, L42, L43, L44, L45, L46, R40, R41, R42, R43, R44, R45, R46 \ - ) \ - KEYMAP( \ - KC_##L00, KC_##L01, KC_##L02, KC_##L03, KC_##L04, KC_##L05, KC_##L06, KC_##R00, KC_##R01, KC_##R02, KC_##R03, KC_##R04, KC_##R05, KC_##R06, \ - KC_##L10, KC_##L11, KC_##L12, KC_##L13, KC_##L14, KC_##L15, KC_##L16, KC_##R10, KC_##R11, KC_##R12, KC_##R13, KC_##R14, KC_##R15, KC_##R16, \ - KC_##L20, KC_##L21, KC_##L22, KC_##L23, KC_##L24, KC_##L25, KC_##L26, KC_##R20, KC_##R21, KC_##R22, KC_##R23, KC_##R24, KC_##R25, KC_##R26, \ - KC_##L30, KC_##L31, KC_##L32, KC_##L33, KC_##L34, KC_##L35, KC_##L36, KC_##R30, KC_##R31, KC_##R32, KC_##R33, KC_##R34, KC_##R35, KC_##R36, \ - KC_##L40, KC_##L41, KC_##L42, KC_##L43, KC_##L44, KC_##L45, KC_##L46, KC_##R40, KC_##R41, KC_##R42, KC_##R43, KC_##R44, KC_##R45, KC_##R46 \ - ) - #include "quantum.h" - -#endif diff --git a/keyboards/redox/rev1/config.h b/keyboards/redox/rev1/config.h index fe951f722..f4ccbd2fd 100644 --- a/keyboards/redox/rev1/config.h +++ b/keyboards/redox/rev1/config.h @@ -15,8 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef REV1_CONFIG_H -#define REV1_CONFIG_H +#pragma once #include "config_common.h" @@ -82,5 +81,3 @@ along with this program. If not, see . //#define NO_ACTION_ONESHOT //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION - -#endif diff --git a/keyboards/redox/rev1/rev1.h b/keyboards/redox/rev1/rev1.h index be6224750..1bc1531ee 100644 --- a/keyboards/redox/rev1/rev1.h +++ b/keyboards/redox/rev1/rev1.h @@ -1,66 +1,34 @@ -#ifndef REV1_H -#define REV1_H +#pragma once #include "../redox.h" -//void promicro_bootloader_jmp(bool program); #include "quantum.h" #ifdef USE_I2C #include #ifdef __AVR__ - #include - #include + #include + #include #endif #endif -//void promicro_bootloader_jmp(bool program); - -#ifndef FLIP_HALF -// Standard Keymap -// (TRRS jack on the left half is to the right, TRRS jack on the right half is to the left) #define LAYOUT( \ - L00, L01, L02, L03, L04, L05, L06, R00, R01, R02, R03, R04, R05, R06, \ - L10, L11, L12, L13, L14, L15, L16, R10, R11, R12, R13, R14, R15, R16, \ - L20, L21, L22, L23, L24, L25, L26, R20, R21, R22, R23, R24, R25, R26, \ - L30, L31, L32, L33, L34, L35, L36, R30, R31, R32, R33, R34, R35, R36, \ - L40, L41, L42, L43, L44, L45, L46, R40, R41, R42, R43, R44, R45, R46 \ - ) \ - { \ - { L00, L01, L02, L03, L04, L05, L06 }, \ - { L10, L11, L12, L13, L14, L15, L16 }, \ - { L20, L21, L22, L23, L24, L25, L26 }, \ - { L30, L31, L32, L33, L34, L35, L36 }, \ - { L40, L41, L42, L43, L44, L45, L46 }, \ - { R06, R05, R04, R03, R02, R01, R00 }, \ - { R16, R15, R14, R13, R12, R11, R10 }, \ - { R26, R25, R24, R23, R22, R21, R20 }, \ - { R36, R35, R34, R33, R32, R31, R30 }, \ - { R46, R45, R44, R43, R42, R41, R40 } \ - } -#else -// Keymap with right side flipped -// (TRRS jack on both halves are to the right) -#define LAYOUT( \ - L00, L01, L02, L03, L04, L05, L06, R00, R01, R02, R03, R04, R05, R06, \ - L10, L11, L12, L13, L14, L15, L16, R10, R11, R12, R13, R14, R15, R16, \ - L20, L21, L22, L23, L24, L25, L26, R20, R21, R22, R23, R24, R25, R26, \ - L30, L31, L32, L33, L34, L35, L36, R30, R31, R32, R33, R34, R35, R36, \ - L40, L41, L42, L43, L44, L45, L46, R40, R41, R42, R43, R44, R45, R46 \ - ) \ - { \ - { L00, L01, L02, L03, L04, L05, L06 }, \ - { L10, L11, L12, L13, L14, L15, L16 }, \ - { L20, L21, L22, L23, L24, L25, L26 }, \ - { L30, L31, L32, L33, L34, L35, L36 }, \ - { L40, L41, L42, L43, L44, L45, L46 }, \ - { R00, R01, R02, R03, R04, R05, R06 }, \ - { R10, R11, R12, R13, R14, R15, R16 }, \ - { R20, R21, R22, R23, R24, R25, R26 }, \ - { R30, R31, R32, R33, R34, R35, R36 }, \ - { R40, R41, R42, R43, R44, R45, R46 } \ - } -#endif - -#endif + k00, k01, k02, k03, k04, k05, k08, k09, k10, k11, k12, k13, \ + k14, k15, k16, k17, k18, k19, k06, k07, k22, k23, k24, k25, k26, k27, \ + k28, k29, k30, k31, k32, k33, k20, k21, k36, k37, k38, k39, k40, k41, \ + k42, k43, k44, k45, k46, k47, k34, k48, k49, k35, k50, k51, k52, k53, k54, k55, \ + k56, k57, k58, k59, k60, k61, k62, k63, k64, k65, k66, k67, k68, k69 \ +) \ +{ \ + { k00, k01, k02, k03, k04, k05, k06 }, \ + { k14, k15, k16, k17, k18, k19, k20 }, \ + { k28, k29, k30, k31, k32, k33, k34 }, \ + { k42, k43, k44, k45, k46, k47, k48 }, \ + { k56, k57, k58, k59, k60, k61, k62 }, \ + { k13, k12, k11, k10, k09, k08, k07 }, \ + { k27, k26, k25, k24, k23, k22, k21 }, \ + { k41, k40, k39, k38, k37, k36, k35 }, \ + { k55, k54, k53, k52, k51, k50, k49 }, \ + { k69, k68, k67, k66, k65, k64, k63 } \ +} From 5be438f03d0ae3ebdb9e24d249fdfd7f5c573634 Mon Sep 17 00:00:00 2001 From: akrob Date: Sat, 27 Oct 2018 10:41:17 -0600 Subject: [PATCH 391/788] Keymap: update keymap transmogrified (#4241) * layer locked breathing, layer changed brighter leds * move config for tapping term into config.h * Respect LED off even with layer indicators, add readme and update config to new standard * update Readme with note about both sides of board being required to flash --- .../iris/keymaps/transmogrified/Readme.md | 9 + .../iris/keymaps/transmogrified/config.h | 22 +- .../iris/keymaps/transmogrified/keymap.c | 330 ++++++++++-------- 3 files changed, 214 insertions(+), 147 deletions(-) create mode 100644 keyboards/iris/keymaps/transmogrified/Readme.md diff --git a/keyboards/iris/keymaps/transmogrified/Readme.md b/keyboards/iris/keymaps/transmogrified/Readme.md new file mode 100644 index 000000000..96e27411d --- /dev/null +++ b/keyboards/iris/keymaps/transmogrified/Readme.md @@ -0,0 +1,9 @@ +This layout is an attempt to make switching between the Iris and my laptop keyboard as seemless as possible. I switch caps lock and Ctrl/ESC on my laptop and I am able to adjust well with everything else... I still miss the Iris, but I am able to get work done. + +I use the following lighting queues to indicate layer changes. + +* Momentary toggled layer : LEDs brighten and dim when layer is released. +* Locked layer : LEDs breath. +* Config layer locked : LEDs off. + +NOTE you will need to flash both sides to update the brightness_levels so that breathing works on both sides as expected. diff --git a/keyboards/iris/keymaps/transmogrified/config.h b/keyboards/iris/keymaps/transmogrified/config.h index 8df0824b7..12f2d7d6d 100644 --- a/keyboards/iris/keymaps/transmogrified/config.h +++ b/keyboards/iris/keymaps/transmogrified/config.h @@ -1,5 +1,5 @@ /* -Copyright 2017 Danny Nguyen +Copyright 2017 Adam Roberts 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 @@ -15,11 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ - -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "config_common.h" +#pragma once /* Use I2C or Serial, not both */ @@ -27,8 +23,7 @@ along with this program. If not, see . // #define USE_I2C /* Select hand configuration */ - -// #define MASTER_LEFT +//#define MASTER_LEFT #define MASTER_RIGHT // #define EE_HANDS @@ -39,4 +34,13 @@ along with this program. If not, see . #define RGBLIGHT_SAT_STEP 8 #define RGBLIGHT_VAL_STEP 8 -#endif +#define NO_USB_STARTUP_CHECK //keep both sides on when pc is sleeping. +#define TAPPING_TERM 200 + +// Remove features i don't use +#define NO_ACTION_ONESHOT +#define NO_ACTION_MACRO + +// Override the rev2 config.h BACKLIGHT_LEVELS setting +#undef BACKLIGHT_LEVELS +#define BACKLIGHT_LEVELS 125 diff --git a/keyboards/iris/keymaps/transmogrified/keymap.c b/keyboards/iris/keymaps/transmogrified/keymap.c index 43d6cc600..67545f08e 100644 --- a/keyboards/iris/keymaps/transmogrified/keymap.c +++ b/keyboards/iris/keymaps/transmogrified/keymap.c @@ -2,64 +2,55 @@ #include "action_layer.h" #include "eeconfig.h" -// config settings -#define TAPPING_TERM 250 -#define ONESHOT_TAP_TOGGLE 1 -#define ONESHOT_TIMEOUT 10000 - extern keymap_config_t keymap_config; #define _QWERTY 0 #define _COLEMAK 1 -#define _DVORAK 2 -#define _ONEHANDR 3 -#define _ONEHANDL 4 -#define _RLAYER 5 -#define _LLAYER 6 -#define _DUAL 7 -#define _CONFIG 8 +#define _RLAYER 2 +#define _LLAYER 3 +#define _DUAL 4 +#define _CONFIG 5 enum custom_keycodes { - QWERTY = SAFE_RANGE, - COLEMAK, - DVORAK, - ONEHANDR, - ONEHANDL, - RLAYER, - LLAYER, - RLOCK, - LLOCK, - DUAL, - CONFIG, + QWERTY = SAFE_RANGE, // qwerty base layer + COLEMAK, // colemak base layer + RLAYER, // right layer + LLAYER, // left layer + RLOCK, // right layer LOCK + LLOCK, // left layer LOCK + DUAL, // right and left combo layer + CONFIG, // config layer + LEDUP, // custom LED brightness increase keycode + LEDDOWN, // custom LED brightness decrease keycode }; /* Tap Dance */ enum { - TD_LGUIAPP, - TD_SHIFTCAPS, + TD_LGUIAPP, // LGUI x1, app/menu x2 + TD_SHIFTCAPS, // LSHIFT x1, CAPS x3 + TD_CTRLALTDL, // CTRL+ALT+DEL x3 + TD_SHIFTCLAT, // LSHIFT x1, LCRTL x2, LALT x3, CTRL+ALT x4 }; /* NOOP Key and Transparent */ #define KC_ KC_TRNS #define KC_XXXX KC_NO -/* LAYERS */ +/* LAYERS / CUSTOM KEYS */ #define KC_LLAY LLAYER #define KC_RLAY RLAYER #define KC_RLOK RLOCK #define KC_LLOK LLOCK #define KC_QWER QWERTY -#define KC_DVOR DVORAK #define KC_COLE COLEMAK -#define KC_ONER ONEHANDR -#define KC_ONEL ONEHANDL #define KC_DUAL DUAL #define KC_CONF CONFIG +#define KC_BLUP LEDUP +#define KC_BLDN LEDDOWN -/* Custom Shortened Keys */ +/* Custom Shortened Keys (4 digits so they fit in my grid) */ #define KC_MCTB LCTL(KC_TAB) #define KC_MCST LCTL(LSFT(KC_TAB)) -#define KC_MCAD LALT(LCTL(KC_DEL)) #define KC_CTEC CTL_T(KC_ESC) #define KC_SINS LSFT(KC_INS) #define KC_LGU1 LGUI(KC_1) @@ -72,27 +63,27 @@ enum { #define KC_LGU8 LGUI(KC_8) #define KC_LGU9 LGUI(KC_9) #define KC_LGU0 LGUI(KC_0) -#define KC_BLUP BL_INC -#define KC_BLDN BL_DEC #define KC_SYSR KC_SYSREQ #define KC_REST RESET /* Tap Dance */ #define KC_LGUA TD(TD_LGUIAPP) -#define KC_SHCL TD(TD_SHIFTCAPS) +#define KC_SHCP TD(TD_SHIFTCAPS) +#define KC_CADL TD(TD_CTRLALTDL) +#define KC_SHCA TD(TD_SHIFTCLAT) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_QWERTY] = LAYOUT_kc( //,----+----+----+----+----+----. ,----+----+----+----+----+----. - XXXX, 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,BSPC, + CADL, 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,BSPC, //|----+----+----+----+----+----| |----+----+----+----+----+----| TAB , Q , W , E , R , T , Y , U , I , O , P ,DEL , //|----+----+----+----+----+----| |----+----+----+----+----+----| CTEC, A , S , D , F , G , H , J , K , L ,SCLN,ENT , //|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----| - SHCL, Z , X , C , V , B ,LLOK, RLOK, N , M ,COMM,DOT ,SLSH,RSFT, + SHCP, Z , X , C , V , B ,LLOK, RLOK, N , M ,COMM,DOT ,SLSH,SHCA, //`----+----+----+--+-+----+----+----/ \----+----+----+----+----+----+----' LALT,LLAY,TAB , SPC ,RLAY,LGUA // `----+----+----' `----+----+----' @@ -100,60 +91,18 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_COLEMAK] = LAYOUT_kc( //,----+----+----+----+----+----. ,----+----+----+----+----+----. - XXXX, 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,BSPC, + CADL, 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,BSPC, //|----+----+----+----+----+----| |----+----+----+----+----+----| TAB , Q , W , F , P , G , J , L , U , Y ,SCLN,DEL , //|----+----+----+----+----+----| |----+----+----+----+----+----| CTEC, A , R , S , T , D , H , N , E , I , O ,ENT , //|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----| - SHCL, Z , X , C , V , B ,LLOK, RLOK, K , M ,COMM,DOT ,SLSH,RSFT, + SHCP, Z , X , C , V , B ,LLOK, RLOK, K , M ,COMM,DOT ,SLSH,SHCA, //`----+----+----+--+-+----+----+----/ \----+----+----+----+----+----+----' LALT,LLAY,TAB , SPC ,RLAY,LGUA // `----+----+----' `----+----+----' ), - [_DVORAK] = LAYOUT_kc( - //,----+----+----+----+----+----. ,----+----+----+----+----+----. - XXXX, 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,BSPC, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - TAB ,QUOT,COMM,DOT , P , Y , F , G , C , R , L ,SLSH, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - CTEC, A , O , E , U , I , D , H , T , N , S ,ENT , - //|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----| - SHCL,SCLN, Q , J , K , X ,LLOK, RLOK, B , M , W , V , Z ,EQL , - //`----+----+----+--+-+----+----+----/ \----+----+----+----+----+----+----' - LALT,LLAY,TAB , SPC ,RLAY,LGUA - // `----+----+----' `----+----+----' - ), - - [_ONEHANDR] = LAYOUT_kc( - //,----+----+----+----+----+----. ,----+----+----+----+----+----. - XXXX,XXXX,XXXX,XXXX,XXXX,XXXX, 6 , 7 , 8 , 9 , 0 ,BSPC, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - XXXX,XXXX,XXXX,XXXX,XXXX,XXXX, Y , U , I , O , P ,DEL , - //|----+----+----+----+----+----| |----+----+----+----+----+----| - XXXX,XXXX,XXXX,XXXX,XXXX,XXXX, H , J , K , L ,SCLN,QUOT, - //|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----| - XXXX,XXXX,XXXX,XXXX,XXXX,XXXX,QWER, XXXX, N , M ,COMM,DOT ,SLSH,RSFT, - //`----+----+----+--+-+----+----+----/ \----+----+----+----+----+----+----' - XXXX,XXXX,XXXX, SPC ,ONEL,ENT - // `----+----+----' `----+----+----' - ), - - [_ONEHANDL] = LAYOUT_kc( - //,----+----+----+----+----+----. ,----+----+----+----+----+----. - XXXX,XXXX,XXXX,XXXX,XXXX,XXXX, 5 , 4 , 3 , 2 , 1 ,XXXX, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - XXXX,XXXX,XXXX,XXXX,XXXX,XXXX, T , R , E , W , Q ,TAB , - //|----+----+----+----+----+----| |----+----+----+----+----+----| - XXXX,XXXX,XXXX,XXXX,XXXX,XXXX, G , F , D , S , A ,ENT , - //|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----| - XXXX,XXXX,XXXX,XXXX,XXXX,XXXX,XXXX, XXXX, B , V , C , X , Z ,SHCL, - //`----+----+----+--+-+----+----+----/ \----+----+----+----+----+----+----' - XXXX,XXXX,XXXX, SPC ,ONEL,ENT - // `----+----+----' `----+----+----' - ), - [_RLAYER] = LAYOUT_kc( //,----+----+----+----+----+----. ,----+----+----+----+----+----. ,SLCK,SYSR,PSCR,INS ,PAUS, MUTE,VOLD,VOLU,BLDN,BLUP, , @@ -163,7 +112,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ,EXLM,PIPE,DLR ,LPRN,RPRN, AMPR,LEFT,DOWN,RGHT,MINS,QUOT, //|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----| , AT ,HASH,PERC,LCBR,RCBR, , ,CIRC,END ,UNDS,PGDN,BSLS, , - //`----+----+----+--+-+----+----+----/ \----+----+----+----+----+----+----' + //`----+----+----+--+-+----+----+----/ \----+----+----+----+----+----+----' , , , , , // `----+----+----' `----+----+----' ), @@ -186,7 +135,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //,----+----+----+----+----+----. ,----+----+----+----+----+----. ,XXXX,XXXX,XXXX,XXXX,XXXX, XXXX,XXXX,XXXX,XXXX,XXXX,XXXX, //|----+----+----+----+----+----| |----+----+----+----+----+----| - ,XXXX,XXXX,XXXX,XXXX,XXXX, XXXX,XXXX,MS_U,XXXX,XXXX,MCAD, + ,XXXX,XXXX,XXXX,XXXX,XXXX, XXXX,XXXX,MS_U,XXXX,XXXX,XXXX, //|----+----+----+----+----+----| |----+----+----+----+----+----| ,XXXX,XXXX,XXXX,XXXX,XXXX, BTN2,MS_L,MS_D,MS_R,BTN1,XXXX, //|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----| @@ -200,9 +149,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //,----+----+----+----+----+----. ,----+----+----+----+----+----. REST,XXXX,XXXX,XXXX,XXXX,XXXX, XXXX,XXXX,XXXX,XXXX,XXXX,XXXX, //|----+----+----+----+----+----| |----+----+----+----+----+----| - XXXX,QWER,XXXX,XXXX,XXXX,XXXX, XXXX,XXXX,XXXX,ONER,XXXX,XXXX, + XXXX,QWER,XXXX,XXXX,XXXX,XXXX, XXXX,XXXX,XXXX,XXXX,XXXX,XXXX, //|----+----+----+----+----+----| |----+----+----+----+----+----| - XXXX,XXXX,XXXX,DVOR,XXXX,XXXX, XXXX,XXXX,XXXX,XXXX,XXXX,XXXX, + XXXX,XXXX,XXXX,XXXX,XXXX,XXXX, XXXX,XXXX,XXXX,XXXX,XXXX,XXXX, //|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----| XXXX,XXXX,XXXX,COLE,XXXX,XXXX, , ,XXXX,XXXX,XXXX,XXXX,XXXX,XXXX, //`----+----+----+--+-+----+----+----/ \----+----+----+----+----+----+----' @@ -212,6 +161,26 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; +/* VARIABLES */ +// Configurable Variables for layer toggled light +int layerBLStep = 20; // change how much the brightness changes when holding layer key +int breathPulse = 5; // timing of the breathing +int breathPulseStall = 3; // time to pause at top and bottom of breath cycle +int blSteps = 6; // blSteps + 1 is the amount of brightness settings when manually adjusting + +// Variables needed for layer locked breathing and layer toggling lighting to work +int counter = 0; +bool breathUp = true; +bool resetBL = false; +bool rlocked = false; +bool llocked = false; +bool configOn = false; +int lockedBLLevel; +int momentaryLBLLevel; +int momentaryRBLLevel; +int currentBL; +/* END VARIABLES */ + /* TAP DANCE */ void shift_caps_down (qk_tap_dance_state_t *state, void *user_data) { if (state->count >= 3) { @@ -220,7 +189,6 @@ void shift_caps_down (qk_tap_dance_state_t *state, void *user_data) { register_code (KC_LSFT); } } - void shift_caps_up (qk_tap_dance_state_t *state, void *user_data) { if (state->count >= 3) { unregister_code (KC_CAPS); @@ -228,54 +196,90 @@ void shift_caps_up (qk_tap_dance_state_t *state, void *user_data) { unregister_code (KC_LSFT); } } +void shift_ctrlalt_down (qk_tap_dance_state_t *state, void *user_data) { + if (state->count >= 4) { + register_code (KC_LCTL); + register_code (KC_LALT); + } else if (state->count == 3) { + register_code (KC_LALT); + } else if (state->count == 2) { + register_code (KC_LCTL); + } else { + register_code (KC_RSFT); + } +} +void shift_ctlalt_up (qk_tap_dance_state_t *state, void *user_data) { + if (state->count >= 4) { + unregister_code (KC_LALT); + unregister_code (KC_LCTL); + } else if (state->count == 3) { + unregister_code (KC_LALT); + } else if (state->count == 2) { + unregister_code (KC_LCTL); + } else { + unregister_code (KC_RSFT); + } +} +void ctrlaltdel_up (qk_tap_dance_state_t *state, void *user_data) { + if (state->count >= 3) { + unregister_code (KC_DEL); + unregister_code (KC_LALT); + unregister_code (KC_LCTL); + } else { + } +} +void ctrlaltdel_down (qk_tap_dance_state_t *state, void *user_data) { + if (state->count >= 3) { + register_code (KC_LCTL); + register_code (KC_LALT); + register_code (KC_DEL); + } else { + } +} qk_tap_dance_action_t tap_dance_actions[] = { [TD_LGUIAPP] = ACTION_TAP_DANCE_DOUBLE(KC_LGUI, KC_APP), - [TD_SHIFTCAPS] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, shift_caps_down, shift_caps_up) + [TD_SHIFTCAPS] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, shift_caps_down, shift_caps_up), + [TD_SHIFTCLAT] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, shift_ctrlalt_down, shift_ctlalt_up), + [TD_CTRLALTDL] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, ctrlaltdel_down, ctrlaltdel_up) }; - /* END TAP DANCE */ + void persistent_default_layer_set(uint16_t default_layer) { eeconfig_update_default_layer(default_layer); default_layer_set(default_layer); } -/* Variables for layer light toggling */ -static uint16_t currentBL = 0; -static uint16_t rlocked = 0; -static uint16_t llocked = 0; - bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch (keycode) { case QWERTY: if (record->event.pressed) { set_single_persistent_default_layer(_QWERTY); + configOn = false; + if (momentaryRBLLevel != 0 || momentaryLBLLevel != 0){ + backlight_toggle(); + } } return false; break; case COLEMAK: if (record->event.pressed) { set_single_persistent_default_layer(_COLEMAK); - } - return false; - break; - case ONEHANDR: - if (record->event.pressed) { - set_single_persistent_default_layer(_ONEHANDR); - } - return false; - break; - case DVORAK: - if (record->event.pressed) { - set_single_persistent_default_layer(_DVORAK); + configOn = false; + if (momentaryRBLLevel != 0 || momentaryLBLLevel != 0){ + backlight_toggle(); + } } return false; break; case CONFIG: if (record->event.pressed) { set_single_persistent_default_layer(_CONFIG); - backlight_toggle(); + configOn = true; + if (momentaryRBLLevel != 0 || momentaryLBLLevel != 0){ + backlight_toggle(); + } } return false; break; @@ -283,22 +287,23 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { if (record->event.pressed) { layer_on(_RLAYER); update_tri_layer(_RLAYER, _LLAYER, _DUAL); - /* add logic to toggle backlight change when on a layer */ - currentBL = get_backlight_level(); - if ( currentBL == 0 || currentBL == 1 ) { - backlight_set(5); - } else { - backlight_set(0); + momentaryRBLLevel = get_backlight_level(); + if (momentaryRBLLevel != 0 || momentaryLBLLevel != 0){ + for (int i = 0; i < layerBLStep ; i++){ + backlight_increase(); + } } } else { unregister_code(KC_LGUI); - rlocked = 0; layer_off(_RLAYER); update_tri_layer(_RLAYER, _LLAYER, _DUAL); - if ( llocked == 0 ) { - backlight_set(currentBL); + if ( llocked == false && configOn == false ) { + for (int i = 0; i < layerBLStep ; i++){ + backlight_decrease(); + } } else { } + rlocked = false; } return false; break; @@ -306,21 +311,22 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { if (record->event.pressed) { layer_on(_LLAYER); update_tri_layer(_RLAYER, _LLAYER, _DUAL); - /* add logic to toggle backlight change when on a layer */ - currentBL = get_backlight_level(); - if ( currentBL == 0 || currentBL == 1 ) { - backlight_set(5); - } else { - backlight_set(0); + momentaryLBLLevel = get_backlight_level(); + if (momentaryRBLLevel != 0 || momentaryLBLLevel != 0){ + for (int i = 0; i < layerBLStep ; i++){ + backlight_increase(); + } } } else { - llocked = 0; layer_off(_LLAYER); update_tri_layer(_RLAYER, _LLAYER, _DUAL); - if ( rlocked == 0 ) { - backlight_set(currentBL); + if ( rlocked == false && configOn == false ) { + for (int i = 0; i < layerBLStep ; i++){ + backlight_decrease(); + } } else { } + llocked = false; } return false; break; @@ -328,13 +334,10 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { if (record->event.pressed) { layer_on(_RLAYER); /* add logic to toggle backlight change when on a layer */ - rlocked = 1; - currentBL = get_backlight_level(); - if ( currentBL == 0 || currentBL == 1 ) { - backlight_set(5); - } else { - backlight_set(0); + if (rlocked == false && llocked == false){ + lockedBLLevel = get_backlight_level(); } + rlocked = true; } else { } return false; @@ -343,25 +346,76 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { if (record->event.pressed) { layer_on(_LLAYER); /* add logic to toggle backlight change when on a layer */ - llocked = 1; - currentBL = get_backlight_level(); - if ( currentBL == 0 || currentBL == 1 ) { - backlight_set(5); - } else { - backlight_set(0); + if (rlocked == false && llocked == false){ + lockedBLLevel = get_backlight_level(); + } + llocked = true; + } else { + } + return false; + break; + case LEDUP: + if (record->event.pressed) { + for (int i = 0; i < (BACKLIGHT_LEVELS / blSteps ) ; i++ ){ + backlight_increase(); } } else { } return false; break; - case ONEHANDL: + case LEDDOWN: if (record->event.pressed) { - layer_on(_ONEHANDL); + for (int i = 0; i < (BACKLIGHT_LEVELS / blSteps ) ; i++ ){ + backlight_decrease(); + } } else { - layer_off(_ONEHANDL); } return false; break; } return true; } + + +// LED breathing when a layer is locked +void matrix_scan_user(void) { + // Only breath if layer is locked + if (lockedBLLevel != 0 && (rlocked || llocked)){ + // counter to slow down the breathing + if (counter >= breathPulse) { + counter = 0; + // iterate brightness up or down + if (breathUp){ + backlight_increase(); + } else { + backlight_decrease(); + } + // figure out if we need to change directions + currentBL = get_backlight_level(); + if (currentBL >= BACKLIGHT_LEVELS){ + breathUp = false; + // make counter a big negative number to add some stall time + counter = ((BACKLIGHT_LEVELS * breathPulseStall) * (-1)); + } else if (currentBL == 0){ + breathUp = true; + // make counter a big negative number to add some stall time + counter = ((BACKLIGHT_LEVELS * breathPulseStall) * (-1)); + } + // make not that we need to change the brightness back to when we started the breathing + resetBL = true; + } else { + counter++; + } + } else { + // get the brightness back to the level it started at + if (resetBL){ + int i = 0; + // i is just there to make sure i don't get stuck in a loop if for some reason get_backlight_level isn't working as expected + while (get_backlight_level() != lockedBLLevel && i <= BACKLIGHT_LEVELS ){ + backlight_step(); + i++; + } + resetBL = false; + } + } +} From 4ffcacd92086870eb7a3102d54178a7af64edb0c Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sat, 27 Oct 2018 11:53:50 -0700 Subject: [PATCH 392/788] Add Bootmagic Lite to QMK (#4215) * Preliminary additon of bootmagic lite functionality * Cleanup code * Clean up bootmagic code * Add documentation and clean up code * Make 'lite' an option for BOOTMAGIC_ENABLE * Update Templates with note about Bootmagic Lite option * Detect Debounce variable * Make sure debounce is a non-zero number * Capitalize Bootmagic * Capitalize bootmagic * Update wording * Re-add EEPROM reset, by popular demand And add eeprom-less version to drashna userspace for his sanity * Fix spacing * Set BOOTMAGIC_ENABLE to use full/lite/off And default yes to "full" for compatibility * Add Bootmagic lite info to templates * Remove text from makefiles * Cleanup of makefile * mention yes in bootmagic docs * Wordsmitthing the docs * Fix white spaces * Readd default bootmagic setting, because it's necessary --- docs/feature_bootmagic.md | 52 +++++++++++++++++++++++++++++- quantum/quantum.c | 34 ++++++++++++++++++- quantum/quantum.h | 9 ++++++ quantum/template/avr/config.h | 3 ++ quantum/template/ps2avrgb/config.h | 4 +++ tmk_core/common.mk | 14 +++++++- users/drashna/drashna.c | 16 +++++++++ 7 files changed, 129 insertions(+), 3 deletions(-) diff --git a/docs/feature_bootmagic.md b/docs/feature_bootmagic.md index 586b5d837..20c76d9b7 100644 --- a/docs/feature_bootmagic.md +++ b/docs/feature_bootmagic.md @@ -11,7 +11,15 @@ There are three separate but related features that allow you to change the behav On some keyboards Bootmagic is disabled by default. If this is the case, it must be explicitly enabled in your `rules.mk` with: ```make -BOOTMAGIC_ENABLE = yes +BOOTMAGIC_ENABLE = full +``` + +?> You may see `yes` being used in place of `full`, and this is okay. However, `yes` is deprecated, and ideally `full` (or `lite`) ideally should be used instead. + +Additionally, you can use [Bootmagic Lite](#bootmagic-lite) (a scaled down, very basic version of Bootmagic) by adding the following to your `rules.mk` file: + +```make +BOOTMAGIC_ENABLE = lite ``` ## Hotkeys @@ -99,3 +107,45 @@ If you would like to change the hotkey assignments for Bootmagic, `#define` thes |`BOOTMAGIC_KEY_DEFAULT_LAYER_5` |`KC_5` |Make layer 5 the default layer | |`BOOTMAGIC_KEY_DEFAULT_LAYER_6` |`KC_6` |Make layer 6 the default layer | |`BOOTMAGIC_KEY_DEFAULT_LAYER_7` |`KC_7` |Make layer 7 the default layer | + +# Bootmagic Lite + +In addition to the full blown Bootmagic feature, is the Bootmagic Lite feature that only handles jumping into the bootloader. This is great for boards that don't have a physical reset button but you need a way to jump into the bootloader, and don't want to deal with the headache that Bootmagic can cause. + +To enable this version of Bootmagic, you need to enable it in your `rules.mk` with: + +```make +BOOTMAGIC_ENABLE = lite +``` + +Additionally, you may want to specify which key to use. This is especially useful for keyboards that have unusual matrices. To do so, you need to specify the row and column of the key that you want to use. Add these entries to your `config.h` file: + +```c +#define BOOTMAGIC_LITE_ROW 0 +#define BOOTMAGIC_LITE_COLUMN 1 +``` + +By default, these are set to 0 and 0, which is usually the "ESC" key on a majority of keyboards. + +And to trigger the bootloader, you hold this key down when plugging the keyboard in. Just the single key. + +## Advanced Bootmagic Lite + +The `bootmagic_lite` function is defined weakly, so that you can replace this in your code, if you need. A great example of this is the Zeal60 boards that have some additional handling needed. + +To replace the function, all you need to do is add something like this to your code: + +```c +void bootmagic_lite(void) { + matrix_scan(); + wait_ms(DEBOUNCING_DELAY * 2); + matrix_scan(); + + if (matrix_get_row(BOOTMAGIC_LITE_ROW) & (1 << BOOTMAGIC_LITE_COLUMN)) { + // Jump to bootloader. + bootloader_jump(); + } +} +``` + +You can additional feature here. For instance, resetting the eeprom or requiring additional keys to be pressed to trigger bootmagic. Keep in mind that `bootmagic_lite` is called before a majority of features are initialized in the firmware. diff --git a/quantum/quantum.c b/quantum/quantum.c index c9bec6740..5f1a691c8 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -949,8 +949,40 @@ void tap_random_base64(void) { } } +__attribute__((weak)) +void bootmagic_lite(void) { + // The lite version of TMK's bootmagic based on Wilba. + // 100% less potential for accidentally making the + // keyboard do stupid things. + + // We need multiple scans because debouncing can't be turned off. + matrix_scan(); + #if defined(DEBOUNCING_DELAY) && DEBOUNCING_DELAY > 0 + wait_ms(DEBOUNCING_DELAY * 2); + #elif defined(DEBOUNCE) && DEBOUNCE > 0 + wait_ms(DEBOUNCE * 2); + #else + wait_ms(30); + #endif + matrix_scan(); + + // If the Esc and space bar are held down on power up, + // reset the EEPROM valid state and jump to bootloader. + // Assumes Esc is at [0,0]. + // This isn't very generalized, but we need something that doesn't + // rely on user's keymaps in firmware or EEPROM. + if (matrix_get_row(BOOTMAGIC_LITE_ROW) & (1 << BOOTMAGIC_LITE_COLUMN)) { + eeconfig_disable(); + // Jump to bootloader. + bootloader_jump(); + } +} + void matrix_init_quantum() { - if (!eeconfig_is_enabled() && !eeconfig_is_disabled()) { + #ifdef BOOTMAGIC_LITE + bootmagic_lite(); + #endif + if (!eeconfig_is_enabled()) { eeconfig_init(); } #ifdef BACKLIGHT_ENABLE diff --git a/quantum/quantum.h b/quantum/quantum.h index 87a61356c..1d3ee033f 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h @@ -224,6 +224,15 @@ bool process_action_kb(keyrecord_t *record); bool process_record_kb(uint16_t keycode, keyrecord_t *record); bool process_record_user(uint16_t keycode, keyrecord_t *record); +#ifndef BOOTMAGIC_LITE_COLUMN + #define BOOTMAGIC_LITE_COLUMN 0 +#endif +#ifndef BOOTMAGIC_LITE_ROW + #define BOOTMAGIC_LITE_ROW 0 +#endif + +void bootmagic_lite(void); + void reset_keyboard(void); void startup_user(void); diff --git a/quantum/template/avr/config.h b/quantum/template/avr/config.h index caa72af0c..56395f376 100644 --- a/quantum/template/avr/config.h +++ b/quantum/template/avr/config.h @@ -222,3 +222,6 @@ along with this program. If not, see . #endif */ +/* Bootmagic Lite key configuration */ +// #define BOOTMAGIC_LITE_ROW 0 +// #define BOOTMAGIC_LITE_COLUMN 0 diff --git a/quantum/template/ps2avrgb/config.h b/quantum/template/ps2avrgb/config.h index d2c83781f..4ff3513bc 100644 --- a/quantum/template/ps2avrgb/config.h +++ b/quantum/template/ps2avrgb/config.h @@ -44,3 +44,7 @@ along with this program. If not, see . /* key combination for command */ #define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) + +/* Bootmagic Lite key configuration */ +// #define BOOTMAGIC_LITE_ROW 0 +// #define BOOTMAGIC_LITE_COLUMN 0 diff --git a/tmk_core/common.mk b/tmk_core/common.mk index 33bcc97b2..3844b13d4 100644 --- a/tmk_core/common.mk +++ b/tmk_core/common.mk @@ -61,14 +61,26 @@ endif # Option modules -ifeq ($(strip $(BOOTMAGIC_ENABLE)), yes) +BOOTMAGIC_ENABLE ?= no +VALID_MAGIC_TYPES := yes full lite +ifneq ($(strip $(BOOTMAGIC_ENABLE)), no) + ifeq ($(filter $(BOOTMAGIC_ENABLE),$(VALID_MAGIC_TYPES)),) + $(error BOOTMAGIC_ENABLE="$(BOOTMAGIC_ENABLE)" is not a valid type of magic) + endif + ifeq ($(strip $(BOOTMAGIC_ENABLE)), lite) + TMK_COMMON_DEFS += -DBOOTMAGIC_LITE + TMK_COMMON_DEFS += -DMAGIC_ENABLE + TMK_COMMON_SRC += $(COMMON_DIR)/magic.c + else TMK_COMMON_DEFS += -DBOOTMAGIC_ENABLE TMK_COMMON_SRC += $(COMMON_DIR)/bootmagic.c + endif else TMK_COMMON_DEFS += -DMAGIC_ENABLE TMK_COMMON_SRC += $(COMMON_DIR)/magic.c endif + ifeq ($(strip $(MOUSEKEY_ENABLE)), yes) TMK_COMMON_SRC += $(COMMON_DIR)/mousekey.c TMK_COMMON_DEFS += -DMOUSEKEY_ENABLE diff --git a/users/drashna/drashna.c b/users/drashna/drashna.c index 5b6620cf3..7c280e2dd 100644 --- a/users/drashna/drashna.c +++ b/users/drashna/drashna.c @@ -424,3 +424,19 @@ void eeconfig_init_user(void) { userspace_config.raw = 0; eeconfig_update_user(userspace_config.raw); } + +void bootmagic_lite(void) { + matrix_scan(); + #if defined(DEBOUNCING_DELAY) && DEBOUNCING_DELAY > 0 + wait_ms(DEBOUNCING_DELAY * 2); + #elif defined(DEBOUNCE) && DEBOUNCE > 0 + wait_ms(DEBOUNCE * 2); + #else + wait_ms(30); + #endif + matrix_scan(); + + if (matrix_get_row(BOOTMAGIC_LITE_ROW) & (1 << BOOTMAGIC_LITE_COLUMN)) { + bootloader_jump(); + } +} From 2abb29402a85675617d07111cbdf5502fd384572 Mon Sep 17 00:00:00 2001 From: Guido Bartolucci Date: Sun, 28 Oct 2018 11:29:37 -0400 Subject: [PATCH 393/788] Keymap: Updates to guidoism layout (#4262) * Initial commit of guidoism * created movement layer * movement layer works! * removed unnecessary layers * moved enter key up and recreated caps lock * cleaned up * num pad * checkpoint * checkpoint * checkpoint * Added num pad * changed max power draw so i can use this on ipad * move around quotes * added tri layer for a homed numpad * moved layout to new style * Update readme.md * Update readme.md * Update readme.md * Update readme.md * added keys to unicode conversion * removed adjust layer since its not used anymore * moved esc to seperate key * tweaked python * checkpoint * new code put into function * new code put into function * cleanup * cleanup * new code works perfect * removed old code * removed old code * generate_c.py now replaces code within keymap.c * added function layer * updated readme * updated readme * updated readme * updates readme * updates readme * updates readme * Tweaks based on CR * Remove old guidoism * Use MO(_FUNCTION) directly --- keyboards/planck/keymaps/guidoism/config.h | 42 --- keyboards/planck/keymaps/guidoism/keymap.c | 253 ------------------ keyboards/planck/keymaps/guidoism/readme.md | 2 - keyboards/planck/keymaps/guidoism/rules.mk | 0 .../community/ortho_4x12/guidoism/config.h | 22 +- .../ortho_4x12/guidoism/generate_c.py | 100 ++++--- .../ortho_4x12/guidoism/guidoism.json | 2 +- .../community/ortho_4x12/guidoism/keymap.c | 141 ++++++++-- .../community/ortho_4x12/guidoism/keys.json | 29 +- .../community/ortho_4x12/guidoism/readme.md | 63 +++-- 10 files changed, 236 insertions(+), 418 deletions(-) delete mode 100644 keyboards/planck/keymaps/guidoism/config.h delete mode 100644 keyboards/planck/keymaps/guidoism/keymap.c delete mode 100644 keyboards/planck/keymaps/guidoism/readme.md delete mode 100644 keyboards/planck/keymaps/guidoism/rules.mk diff --git a/keyboards/planck/keymaps/guidoism/config.h b/keyboards/planck/keymaps/guidoism/config.h deleted file mode 100644 index a1635f2ba..000000000 --- a/keyboards/planck/keymaps/guidoism/config.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "config_common.h" - -#ifdef AUDIO_ENABLE - #define STARTUP_SONG SONG(PLANCK_SOUND) - // #define STARTUP_SONG SONG(NO_SOUND) - - #define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \ - SONG(COLEMAK_SOUND), \ - SONG(DVORAK_SOUND) \ - } -#endif - -#define MUSIC_MASK (keycode != KC_NO) - -/* - * MIDI options - */ - -/* Prevent use of disabled MIDI features in the keymap */ -//#define MIDI_ENABLE_STRICT 1 - -/* enable basic MIDI features: - - MIDI notes can be sent when in Music mode is on -*/ - -#define MIDI_BASIC - -/* enable advanced MIDI features: - - MIDI notes can be added to the keymap - - Octave shift and transpose - - Virtual sustain, portamento, and modulation wheel - - etc. -*/ -//#define MIDI_ADVANCED - -/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ -//#define MIDI_TONE_KEYCODE_OCTAVES 2 - -#endif \ No newline at end of file diff --git a/keyboards/planck/keymaps/guidoism/keymap.c b/keyboards/planck/keymaps/guidoism/keymap.c deleted file mode 100644 index d644ac970..000000000 --- a/keyboards/planck/keymaps/guidoism/keymap.c +++ /dev/null @@ -1,253 +0,0 @@ -/* Copyright 2015-2017 Jack Humbert - * - * 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 . - */ - -#pragma message "You may need to add LAYOUT_planck_grid to your keymap layers - see default for an example" -#include "planck.h" -#include "action_layer.h" - -extern keymap_config_t keymap_config; - -enum planck_layers { - _QWERTY, - _LOWER, - _RAISE, - _MOVEMENT, - _NUMPAD, - _CODE, - _ADJUST -}; - -enum planck_keycodes { - QWERTY = SAFE_RANGE, - LOWER, - RAISE, - MOVEMENT, - NUMPAD, - CODE, - BACKLIT -}; - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - -/* Qwerty - * ,-----------------------------------------------------------------------------------. - * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | S | D | F | G | H | J | K | L | ; | " | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Move |Numpad| Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' - */ -[_QWERTY] = { - {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, - // {KC_ESC, LT(MOVEMENT, KC_A), KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT}, - // {KC_ESC, MEH_T(KC_A), KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT}, - {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT}, - {LSFT_T(KC_CAPS), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_QUOT}, - {MOVEMENT, NUMPAD, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LPRN, KC_RPRN, KC_LCBR, KC_RCBR} -}, - -/* Lower - * ,-----------------------------------------------------------------------------------. - * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | Home | End | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | Next | Vol- | Vol+ | Play | - * `-----------------------------------------------------------------------------------' - */ -[_LOWER] = { - {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC}, - {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, - {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_NUHS), S(KC_NUBS), KC_HOME, KC_END, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} -}, - -/* Raise - * ,-----------------------------------------------------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / |Pg Up |Pg Dn | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | Next | Vol- | Vol+ | Play | - * `-----------------------------------------------------------------------------------' - */ -[_RAISE] = { - {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, - {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, - {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} -}, - -/* Movement - * ,-----------------------------------------------------------------------------------. - * | | | | | | | Home | PgUp | Up | PgDn | End | | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | | | | | | Left | Down | Right| | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | | | | | | | | | | | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | | - * `-----------------------------------------------------------------------------------' - */ -[_MOVEMENT] = { - {_______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, KC_UP, KC_PGDN, KC_END, _______}, - {_______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} -}, - -/* Numpad - * ,-----------------------------------------------------------------------------------. - * | | | | | | | | | 7 | 8 | 9 | / | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | | | | | | | 4 | 5 | 6 | * | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | | | | | | | | 1 | 2 | 3 | - | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | 0 | = | + | - * `-----------------------------------------------------------------------------------' -[_NUMPAD] = { - {_______, _______, _______, _______, _______, _______, _______, _______, KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_SLASH}, - {_______, _______, _______, _______, _______, _______, _______, _______, KC_KP_4, KC_KP_5, KC_KP_6, KC_KP_ASTERISK}, - {_______, _______, _______, _______, _______, _______, _______, _______, KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_MINUS}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, KC_KP_0, KC_KP_EQUAL, KC_KP_PLUS} -}, - */ - -/* Numpad - */ -[_NUMPAD] = { - {_______, _______, _______, _______, _______, _______, _______, _______, _______, KC_KP_7, KC_KP_8, KC_KP_9}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, KC_KP_4, KC_KP_5, KC_KP_6}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, KC_KP_1, KC_KP_2, KC_KP_3}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_KP_0, KC_DOT} -}, - -/* Code - * ,-----------------------------------------------------------------------------------. - * | | | | | | | | | | | | | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | | | | | | | | | | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | | | | | | | | | | | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | | - * `-----------------------------------------------------------------------------------' - */ -[_CODE] = { - {_______, _______, _______, _______, _______, _______, _______, KC_LCBR, KC_RCBR, _______, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, KC_LPRN, KC_RPRN, _______, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, KC_LBRC, KC_RBRC, _______, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} -}, - -/* Adjust (Lower + Raise) - * ,-----------------------------------------------------------------------------------. - * | | Reset| | | | | | | | | | Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty| | | | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof| | | | | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | | - * `-----------------------------------------------------------------------------------' - */ -[_ADJUST] = { - {_______, RESET, DEBUG, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_DEL }, - {_______, _______, MU_MOD, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, _______, _______, _______, _______}, - {_______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, TERM_ON, TERM_OFF, _______, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, } - -} - -}; - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case QWERTY: - if (record->event.pressed) { - print("mode just switched to qwerty and this is a huge string\n"); - set_single_persistent_default_layer(_QWERTY); - } - return false; - break; - case LOWER: - if (record->event.pressed) { - layer_on(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case RAISE: - if (record->event.pressed) { - layer_on(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case MOVEMENT: - if (record->event.pressed) { - layer_on(_MOVEMENT); - } else { - layer_off(_MOVEMENT); - } - return false; - break; - case NUMPAD: - if (record->event.pressed) { - layer_on(_NUMPAD); - } else { - layer_off(_NUMPAD); - } - return false; - break; - case CODE: - if (record->event.pressed) { - layer_on(_CODE); - } else { - layer_off(_CODE); - } - return false; - break; - case BACKLIT: - if (record->event.pressed) { - register_code(KC_RSFT); - #ifdef BACKLIGHT_ENABLE - backlight_step(); - #endif - PORTE &= ~(1<<6); - } else { - unregister_code(KC_RSFT); - PORTE |= (1<<6); - } - return false; - break; - } - return true; -} diff --git a/keyboards/planck/keymaps/guidoism/readme.md b/keyboards/planck/keymaps/guidoism/readme.md deleted file mode 100644 index de9680b49..000000000 --- a/keyboards/planck/keymaps/guidoism/readme.md +++ /dev/null @@ -1,2 +0,0 @@ -# The Default Planck Layout - diff --git a/keyboards/planck/keymaps/guidoism/rules.mk b/keyboards/planck/keymaps/guidoism/rules.mk deleted file mode 100644 index e69de29bb..000000000 diff --git a/layouts/community/ortho_4x12/guidoism/config.h b/layouts/community/ortho_4x12/guidoism/config.h index 19b71b07e..e22f29803 100644 --- a/layouts/community/ortho_4x12/guidoism/config.h +++ b/layouts/community/ortho_4x12/guidoism/config.h @@ -18,27 +18,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include QMK_KEYBOARD_CONFIG_H +#pragma once #define IGNORE_MOD_TAP_INTERRUPT #define USB_MAX_POWER_CONSUMPTION 50 - -#ifndef LAYOUT_planck_mit -#define LAYOUT_planck_mit( \ - k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \ - k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \ - k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ - k30, k31, k32, k33, k34, k35, k37, k38, k39, k3a, k3b \ -) \ - LAYOUT_ortho_4x12( \ - k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \ - k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \ - k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ - k30, k31, k32, k33, k34, k35, k35, k37, k38, k39, k3a, k3b \ - ) -#endif - -#endif diff --git a/layouts/community/ortho_4x12/guidoism/generate_c.py b/layouts/community/ortho_4x12/guidoism/generate_c.py index 7876bee68..5bee57608 100644 --- a/layouts/community/ortho_4x12/guidoism/generate_c.py +++ b/layouts/community/ortho_4x12/guidoism/generate_c.py @@ -1,38 +1,29 @@ import itertools import json -from pprint import pprint as pp +import os.path +import re -layers = dict(enumerate(['_QWERTY', '_LOWER', '_RAISE', '_MOVEMENT', '_NUMPAD'])) -key_names = {('MO(%d)' % i): layers.get(i).strip('_') for i in layers.keys()} +KEYMAP_C = """/* {0} +{1} +*/ +[{2}] = {3}( + {4}) +""" -unicodes = { - "": "next", - "": "vol-", - "": "vol+", - "": "play", -} +README_MD = """## {0} +``` +{1} +``` +""" -d = json.load(open('layouts/community/ortho_4x12/guidoism/guidoism.json')) +base = os.path.dirname(__file__) -def grouper(iterable, n): - args = [iter(iterable)] * n - return itertools.zip_longest(*args, fillvalue='') +layer_names = dict(enumerate(['_QWERTY', '_LOWER', '_RAISE', '_MOVEMENT', '_NUMPAD', '_FUNCTION'])) +layer_name = {('MO(%d)' % i): layer_names.get(i).strip('_') for i in layer_names.keys()} -def truthy(s): - return [a for a in s if a] +keys = json.load(open(os.path.join(base, 'keys.json'))) -def just(s, n): - return [a.center(n*2+1 if len(s) == 11 and i == 5 else n) for i, a in enumerate(s)] - -def replace(s): - return [key_names.get(a, a) for a in s] - -def layer(i, l): - n = max(len(s) for s in l) - rows = [', '.join(replace(truthy(row))) for row in grouper(l, 12)] - return '[%s] = %s(\n%s)' % (layers[i], d['layout'], ',\n'.join(rows)) - -print(',\n\n'.join(layer(i, l) for i, l in enumerate(d['layers']))) +d = json.load(open(os.path.join(base, 'guidoism.json'))) def surround(s, a, b, c): return a + b.join(s) + c @@ -40,20 +31,45 @@ def surround(s, a, b, c): def pattern(cell, table): return ['─'*cell for i in range(table)] -keys = json.load(open('layouts/community/ortho_4x12/guidoism/keys.json')) +top = surround(pattern(5, 12), '┌', '┬', '┐') +mid = surround(pattern(5, 12), '├', '┼', '┤') +bottom = surround(pattern(5, 12), '└', '┴', '┘') -def layer2(i, l): - def replace(s): - s = [keys.get(a, a) for a in s] - return [unicodes.get(a, a) for a in s] - n = max(len(s) for s in l) - return [surround(just(replace(truthy(row)), 5), '│', '│', '│') for row in grouper(l, 12)] +from more_itertools import chunked, intersperse, interleave_longest -for i, l in enumerate(d['layers']): - print(surround(pattern(5, 12), '┌', '┬', '┐')) - for n, row in enumerate(layer2(i, l)): - print(row) - if n < 3: - print(surround(pattern(5, 12), '├', '┼', '┤')) - else: - print(surround(pattern(5, 12), '└', '┴', '┘')) +def uni(k): + return keys.get(k, k).lower().center(5) + +def c_layout(i, definition, template): + c_name = layer_names[i] + pretty_name = c_name.strip('_').capitalize() + layout = d['layout'] + + surround = lambda s: ''.join(interleave_longest(['│']*(len(s)+1), s)) + layer = list(map(uni, definition)) + layer[41] = layer[41].center(11) + layer = chunked(layer, 12) + rows = intersperse(mid, map(surround, layer)) + pretty = '\n'.join(itertools.chain([top], rows, [bottom])) + + surround = lambda s: ', '.join(s) + layer = list(map(lambda k: layer_name.get(k, k), definition)) + layer = chunked(layer, 12) + rows = map(surround, layer) + c_layer = ',\n '.join(itertools.chain([], rows, [])) + + return template.format(pretty_name, pretty, c_name, layout, c_layer) + +start = '// START_REPLACEMENT\n' +end = '// END_REPLACEMENT\n' +replacement = start + ',\n\n'.join(c_layout(i, l, KEYMAP_C) for i, l in enumerate(d['layers'])) + end +keymap = os.path.join(base, 'keymap.c') +existing = open(keymap).read() +r = re.compile(r'// START_REPLACEMENT.*// END_REPLACEMENT', re.DOTALL) +open(keymap, 'w').write(r.sub(replacement, existing)) + +replacement = '## Current Configuration\n\n' + '\n\n'.join(c_layout(i, l, README_MD) for i, l in enumerate(d['layers'])) +keymap = os.path.join(base, 'readme.md') +existing = open(keymap).read() +r = re.compile(r'## Current Configuration.*', re.DOTALL) +open(keymap, 'w').write(r.sub(replacement, existing)) diff --git a/layouts/community/ortho_4x12/guidoism/guidoism.json b/layouts/community/ortho_4x12/guidoism/guidoism.json index fd287cf60..6a4364c6b 100644 --- a/layouts/community/ortho_4x12/guidoism/guidoism.json +++ b/layouts/community/ortho_4x12/guidoism/guidoism.json @@ -1 +1 @@ -{"keyboard":"planck/rev4","keymap":"guidoism","layout":"LAYOUT_planck_mit","layers":[["KC_TAB","KC_Q","KC_W","KC_E","KC_R","KC_T","KC_Y","KC_U","KC_I","KC_O","KC_P","KC_BSPC","LCTL_T(KC_ESC)","KC_A","KC_S","KC_D","KC_F","KC_G","KC_H","KC_J","KC_K","KC_L","KC_COLN","KC_ENT","LSFT_T(KC_CAPS)","KC_Z","KC_X","KC_C","KC_V","KC_B","KC_N","KC_M","KC_COMM","KC_DOT","KC_SLSH","KC_NO","MO(3)","KC_NO","KC_LALT","KC_LGUI","MO(1)","LSFT_T(KC_SPC)","MO(2)","KC_RGUI","KC_RALT","KC_SCLN","KC_NO"],["KC_TILD","KC_EXLM","KC_AT","KC_HASH","KC_DLR","KC_PERC","KC_CIRC","KC_AMPR","KC_ASTR","KC_NO","KC_NO","KC_UNDO","KC_TRNS","KC_NO","KC_CUT","KC_COPY","KC_PSTE","KC_NO","KC_NO","KC_UNDS","KC_PLUS","KC_DQUO","KC_QUOT","KC_PIPE","KC_TRNS","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_MNXT","KC_VOLD","KC_VOLU","KC_MPLY"],["KC_GRV","KC_P1","KC_P2","KC_P3","KC_P4","KC_P5","KC_P6","KC_P7","KC_P8","KC_P9","KC_P0","KC_TRNS","KC_TRNS","KC_LBRC","KC_RBRC","KC_LPRN","KC_RPRN","KC_NO","KC_NO","KC_PMNS","KC_PEQL","KC_NO","KC_NO","KC_BSLS","KC_TRNS","KC_LT","KC_GT","KC_LCBR","KC_RCBR","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS"],["RESET","DEBUG","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_PGUP","KC_UP","KC_PGDN","KC_NO","KC_TRNS","KC_TRNS","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_LEFT","KC_DOWN","KC_RGHT","KC_NO","KC_TRNS","KC_TRNS","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_HOME","KC_NO","KC_END","KC_NO","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS"],["KC_TRNS","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_P7","KC_P8","KC_P9","KC_PSLS","KC_TRNS","KC_TRNS","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_P4","KC_P5","KC_P6","KC_PAST","KC_TRNS","KC_TRNS","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_P1","KC_P2","KC_P3","KC_PMNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_PCMM","KC_P0","KC_PDOT","KC_PPLS","KC_TRNS"]]} +{"keyboard":"planck/rev4","keymap":"guidoism","layout":"LAYOUT_planck_mit","layers":[["KC_TAB","KC_Q","KC_W","KC_E","KC_R","KC_T","KC_Y","KC_U","KC_I","KC_O","KC_P","KC_BSPC","KC_LCTL","KC_A","KC_S","KC_D","KC_F","KC_G","KC_H","KC_J","KC_K","KC_L","KC_COLN","KC_ENT","KC_LSFT","KC_Z","KC_X","KC_C","KC_V","KC_B","KC_N","KC_M","KC_COMM","KC_DOT","KC_SLSH","KC_NO","MO(3)","KC_ESC","KC_LALT","KC_LGUI","MO(1)","LSFT_T(KC_SPC)","MO(2)","KC_RGUI","KC_RALT","KC_SCLN","MO(5)"],["KC_TILD","KC_EXLM","KC_AT","KC_HASH","KC_DLR","KC_PERC","KC_CIRC","KC_AMPR","KC_ASTR","KC_NO","KC_NO","KC_UNDO","KC_TRNS","KC_NO","KC_CUT","KC_COPY","KC_PSTE","KC_NO","KC_NO","KC_UNDS","KC_PLUS","KC_DQUO","KC_QUOT","KC_PIPE","KC_CAPS","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_MNXT","KC_VOLD","KC_VOLU","KC_MPLY"],["KC_GRV","KC_P1","KC_P2","KC_P3","KC_P4","KC_P5","KC_P6","KC_P7","KC_P8","KC_P9","KC_P0","KC_TRNS","KC_TRNS","KC_LBRC","KC_RBRC","KC_LPRN","KC_RPRN","KC_NO","KC_NO","KC_PMNS","KC_PEQL","KC_NO","KC_NO","KC_BSLS","KC_TRNS","KC_LT","KC_GT","KC_LCBR","KC_RCBR","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS"],["RESET","DEBUG","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_PGUP","KC_UP","KC_PGDN","KC_NO","KC_TRNS","KC_TRNS","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_LEFT","KC_DOWN","KC_RGHT","KC_NO","KC_TRNS","KC_TRNS","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_HOME","KC_NO","KC_END","KC_NO","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS"],["KC_TRNS","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_PERC","KC_P7","KC_P8","KC_P9","KC_P0","KC_TRNS","KC_TRNS","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_DLR","KC_P4","KC_P5","KC_P6","KC_PDOT","KC_TRNS","KC_TRNS","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_P0","KC_P1","KC_P2","KC_P3","KC_PCMM","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_NO","KC_P0","KC_NO","KC_NO","KC_TRNS"],["KC_NO","KC_F1","KC_F2","KC_F3","KC_F4","KC_F5","KC_F6","KC_F7","KC_F8","KC_F9","KC_F10","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_TRNS"]]} \ No newline at end of file diff --git a/layouts/community/ortho_4x12/guidoism/keymap.c b/layouts/community/ortho_4x12/guidoism/keymap.c index 093fe140b..2027e2bfa 100644 --- a/layouts/community/ortho_4x12/guidoism/keymap.c +++ b/layouts/community/ortho_4x12/guidoism/keymap.c @@ -1,6 +1,4 @@ #include QMK_KEYBOARD_H -#include "action_layer.h" -#include "eeconfig.h" extern keymap_config_t keymap_config; @@ -10,6 +8,7 @@ enum planck_layers { _RAISE, _MOVEMENT, _NUMPAD, + _FUNCTION, }; enum planck_keycodes { @@ -20,37 +19,125 @@ enum planck_keycodes { NUMPAD, }; +#define FUNCTION MO(_FUNCTION) + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_QWERTY] = LAYOUT_planck_mit( -KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, -LCTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_COLN, KC_ENT, -LSFT_T(KC_CAPS), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_NO, -MOVEMENT, KC_NO, KC_LALT, KC_LGUI, LOWER, LSFT_T(KC_SPC), RAISE, KC_RGUI, KC_RALT, KC_SCLN, KC_NO), +// START_REPLACEMENT +/* Qwerty +┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ +│ ⇥ │ q │ w │ e │ r │ t │ y │ u │ i │ o │ p │ ⌫ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ ctrl│ a │ s │ d │ f │ g │ h │ j │ k │ l │ : │ ⏎ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ ⇧ │ z │ x │ c │ v │ b │ n │ m │ , │ . │ / │ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ mov │ ⎋ │ ⌥ │ ⌘ │lower│ sp/sh │raise│ ⌘ │ ⌥ │ ; │ fn │ +└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ +*/ +[_QWERTY] = LAYOUT_planck_mit( + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_COLN, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_NO, + MOVEMENT, KC_ESC, KC_LALT, KC_LGUI, LOWER, LSFT_T(KC_SPC), RAISE, KC_RGUI, KC_RALT, KC_SCLN, FUNCTION) +, + +/* Lower +┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ +│ ~ │ ! │ @ │ # │ $ │ % │ ^ │ & │ * │ │ │ undo│ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ │ │ cut │ copy│paste│ │ │ _ │ + │ " │ ' │ | │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ caps│ │ │ │ │ │ │ │ │ │ │ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ │ │ │ │ │ │ │ next│ vol-│ vol+│ play│ +└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ +*/ +[_LOWER] = LAYOUT_planck_mit( + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_NO, KC_NO, KC_UNDO, + KC_TRNS, KC_NO, KC_CUT, KC_COPY, KC_PSTE, KC_NO, KC_NO, KC_UNDS, KC_PLUS, KC_DQUO, KC_QUOT, KC_PIPE, + KC_CAPS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY) +, + +/* Raise +┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ +│ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ │ [ │ ] │ ( │ ) │ │ │ - │ = │ │ │ \ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ │ < │ > │ { │ } │ │ │ │ │ │ │ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ │ │ │ │ │ │ │ │ │ │ │ +└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ +*/ +[_RAISE] = LAYOUT_planck_mit( + KC_GRV, KC_P1, KC_P2, KC_P3, KC_P4, KC_P5, KC_P6, KC_P7, KC_P8, KC_P9, KC_P0, KC_TRNS, + KC_TRNS, KC_LBRC, KC_RBRC, KC_LPRN, KC_RPRN, KC_NO, KC_NO, KC_PMNS, KC_PEQL, KC_NO, KC_NO, KC_BSLS, + KC_TRNS, KC_LT, KC_GT, KC_LCBR, KC_RCBR, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) +, + +/* Movement +┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ +│reset│debug│ │ │ │ │ │ pgup│ ↑ │ pgdn│ │ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ │ │ │ │ │ │ │ ← │ ↓ │ → │ │ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ │ │ │ │ │ │ │ home│ │ end │ │ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ │ │ │ │ │ │ │ │ │ │ │ +└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ +*/ +[_MOVEMENT] = LAYOUT_planck_mit( + RESET, DEBUG, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_PGUP, KC_UP, KC_PGDN, KC_NO, KC_TRNS, + KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_TRNS, + KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_HOME, KC_NO, KC_END, KC_NO, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) +, + +/* Numpad +┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ +│ │ │ │ │ │ │ % │ 7 │ 8 │ 9 │ 0 │ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ │ │ │ │ │ │ $ │ 4 │ 5 │ 6 │ . │ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ │ │ │ │ │ │ 0 │ 1 │ 2 │ 3 │ , │ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ │ │ │ │ │ │ │ 0 │ │ │ │ +└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ +*/ +[_NUMPAD] = LAYOUT_planck_mit( + KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_PERC, KC_P7, KC_P8, KC_P9, KC_P0, KC_TRNS, + KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_DLR, KC_P4, KC_P5, KC_P6, KC_PDOT, KC_TRNS, + KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_P0, KC_P1, KC_P2, KC_P3, KC_PCMM, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_P0, KC_NO, KC_NO, KC_TRNS) +, + +/* Function +┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ +│ │ f1 │ f2 │ f3 │ f4 │ f5 │ f6 │ f7 │ f8 │ f9 │ f10 │ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ │ │ │ │ │ │ │ │ │ │ │ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ │ │ │ │ │ │ │ │ │ │ │ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ │ │ │ │ │ │ │ │ │ │ │ +└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ +*/ +[_FUNCTION] = LAYOUT_planck_mit( + KC_NO, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS) +// END_REPLACEMENT + + + - [_LOWER] = LAYOUT_planck_mit( -KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_NO, KC_NO, KC_UNDO, -KC_TRNS, KC_NO, KC_CUT, KC_COPY, KC_PSTE, KC_NO, KC_NO, KC_UNDS, KC_PLUS, KC_DQUO, KC_QUOT, KC_PIPE, -KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, -KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY), - [_RAISE] = LAYOUT_planck_mit( -KC_GRV, KC_P1, KC_P2, KC_P3, KC_P4, KC_P5, KC_P6, KC_P7, KC_P8, KC_P9, KC_P0, KC_TRNS, -KC_TRNS, KC_LBRC, KC_RBRC, KC_LPRN, KC_RPRN, KC_NO, KC_NO, KC_PMNS, KC_PEQL, KC_NO, KC_NO, KC_BSLS, -KC_TRNS, KC_LT, KC_GT, KC_LCBR, KC_RCBR, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, -KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), - [_MOVEMENT] = LAYOUT_planck_mit( -RESET, DEBUG, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_PGUP, KC_UP, KC_PGDN, KC_NO, KC_TRNS, -KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_TRNS, -KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_HOME, KC_NO, KC_END, KC_NO, KC_TRNS, -KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), - [_NUMPAD] = LAYOUT_planck_mit( -KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_P7, KC_P8, KC_P9, KC_PSLS, KC_TRNS, -KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_P4, KC_P5, KC_P6, KC_PAST, KC_TRNS, -KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_P1, KC_P2, KC_P3, KC_PMNS, KC_TRNS, -KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PCMM, KC_P0, KC_PDOT, KC_PPLS, KC_TRNS) }; diff --git a/layouts/community/ortho_4x12/guidoism/keys.json b/layouts/community/ortho_4x12/guidoism/keys.json index 762deb706..791119b4f 100644 --- a/layouts/community/ortho_4x12/guidoism/keys.json +++ b/layouts/community/ortho_4x12/guidoism/keys.json @@ -102,8 +102,8 @@ "KC_SLASH": "/", "KC_NUBS": "/", "KC_NUHS": "#", - "KC_CAPSLOCK": "Caps Lock", - "KC_CAPS": "Caps Lock", + "KC_CAPSLOCK": "Caps", + "KC_CAPS": "Caps", "KC_LCTRL": "Ctrl", "KC_LCTL": "Ctrl", "KC_LSHIFT": "\u21e7", @@ -181,26 +181,26 @@ "KC_WAKE": "System Wake", "KC_STOP": "Stop", "KC__MUTE": "Mute (macOS)", - "KC__VOLUP": "", - "KC__VOLDOWN": "", + "KC__VOLUP": "vol+", + "KC__VOLDOWN": "vol-", "KC_AUDIO_MUTE": "Mute", "KC_MUTE": "Mute", - "KC_AUDIO_VOL_UP": "", - "KC_VOLU": "", - "KC_AUDIO_VOL_DOWN": "", - "KC_VOLD": "", - "KC_MEDIA_NEXT_TRACK": "", - "KC_MNXT": "", + "KC_AUDIO_VOL_UP": "vol+", + "KC_VOLU": "vol+", + "KC_AUDIO_VOL_DOWN": "vol-", + "KC_VOLD": "vol-", + "KC_MEDIA_NEXT_TRACK": "next", + "KC_MNXT": "next", "KC_MEDIA_PREV_TRACK": "Previous Track (Windows)", "KC_MPRV": "Previous Track (Windows)", - "KC_MEDIA_FAST_FORWARD": "", - "KC_MFFD": "", + "KC_MEDIA_FAST_FORWARD": "next", + "KC_MFFD": "next", "KC_MEDIA_REWIND": "Previous Track (macOS)", "KC_MRWD": "Previous Track (macOS)", "KC_MEDIA_STOP": "Stop Track", "KC_MSTP": "Stop Track", - "KC_MEDIA_PLAY_PAUSE": "", - "KC_MPLY": "", + "KC_MEDIA_PLAY_PAUSE": "play", + "KC_MPLY": "play", "KC_NUMLOCK": "Keypad Num Lock and Clear", "KC_NLCK": "Keypad Num Lock and Clear", "KC_SLSH": "/", @@ -295,6 +295,7 @@ "MO(3)": "mov", "MO(1)": "lower", "MO(2)": "raise", + "MO(5)": "fn", "LSFT_T(KC_SPC)": "sp/sh", "KC_TRNS": "", "KC_PSTE": "Paste", diff --git a/layouts/community/ortho_4x12/guidoism/readme.md b/layouts/community/ortho_4x12/guidoism/readme.md index 7137ffd14..540db64e8 100644 --- a/layouts/community/ortho_4x12/guidoism/readme.md +++ b/layouts/community/ortho_4x12/guidoism/readme.md @@ -1,37 +1,56 @@ # Guido's Planck Keyboard Layout +I've written a script to convert the json file from the +[QMK Configurator](https://config.qmk.fm) to the C macros +and a pretty form the comments. + +First import the json file in this directory into the configurator, +make any changes, export the file and then run this: + + mv ~/Downloads/guidoism.json layouts/community/ortho_4x12/guidoism/ && python3 layouts/community/ortho_4x12/guidoism/generate_c.py && make planck:guidoism:dfu + +TODO: Move running of generate_c.py to makefile so I just need to run `make planck:guidoism:dfu` + +Note that the pretty forms of the keys are defined in another json +file and are made for my specific board. You made need to update this +file to get the pretty forms to look right. + * Left palm to the `mov` key gets you the `Move` layer * Right thumb on the `raise` key gets you the various programming brackets and parens on your left hand * Left palm on `mov` key and left thumb on `lower` key gets you a numpad on your right hand * Shift with the spacebar * Left pinky is control on hold and escape on tap -* Left shift is caps lock on double-tap +## Current Configuration + +## Qwerty ``` ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ │ ⇥ │ q │ w │ e │ r │ t │ y │ u │ i │ o │ p │ ⌫ │ ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ -│ c/e │ a │ s │ d │ f │ g │ h │ j │ k │ l │ : │ ⏎ │ +│ ctrl│ a │ s │ d │ f │ g │ h │ j │ k │ l │ : │ ⏎ │ ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ │ ⇧ │ z │ x │ c │ v │ b │ n │ m │ , │ . │ / │ │ ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ -│ mov │ │ ⌥ │ ⌘ │lower│ sp/sh │raise│ ⌘ │ ⌥ │ ; │ │ +│ mov │ ⎋ │ ⌥ │ ⌘ │lower│ sp/sh │raise│ ⌘ │ ⌥ │ ; │ fn │ └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ ``` + ## Lower ``` ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ -│ ~ │ ! │ @ │ # │ $ │ % │ ^ │ & │ * │ │ │ Undo│ +│ ~ │ ! │ @ │ # │ $ │ % │ ^ │ & │ * │ │ │ undo│ ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ -│ │ │ Cut │ Copy│Paste│ │ │ _ │ + │ " │ ' │ | │ +│ │ │ cut │ copy│paste│ │ │ _ │ + │ " │ ' │ | │ ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ -│ │ │ │ │ │ │ │ │ │ │ │ │ +│ caps│ │ │ │ │ │ │ │ │ │ │ │ ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ │ │ │ │ │ │ │ │ next│ vol-│ vol+│ play│ └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ ``` + ## Raise ``` ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ @@ -45,32 +64,44 @@ └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ ``` -## Move + +## Movement ``` ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ -│RESET│DEBUG│ │ │ │ │ │ PgUp│ ↑ │ PgDn│ │ │ +│reset│debug│ │ │ │ │ │ pgup│ ↑ │ pgdn│ │ │ ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ │ │ │ │ │ │ │ │ ← │ ↓ │ → │ │ │ ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ -│ │ │ │ │ │ │ │ Home│ │ End │ │ │ +│ │ │ │ │ │ │ │ home│ │ end │ │ │ ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ │ │ │ │ │ │ │ │ │ │ │ │ └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ ``` + ## Numpad ``` ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ -│ │ │ │ │ │ │ │ 7 │ 8 │ 9 │ / │ │ +│ │ │ │ │ │ │ % │ 7 │ 8 │ 9 │ 0 │ │ ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ -│ │ │ │ │ │ │ │ 4 │ 5 │ 6 │ * │ │ +│ │ │ │ │ │ │ $ │ 4 │ 5 │ 6 │ . │ │ ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ -│ │ │ │ │ │ │ │ 1 │ 2 │ 3 │ - │ │ +│ │ │ │ │ │ │ 0 │ 1 │ 2 │ 3 │ , │ │ ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ -│ │ │ │ │ │ │ , │ 0 │ . │ + │ │ +│ │ │ │ │ │ │ │ 0 │ │ │ │ └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ ``` -Use the [QMK Configurator](https://config.qmk.fm/#/planck/rev4/LAYOUT_planck_mit) -to edit the guidoism.json file. Then update it and run `python3 layouts/community/ortho_4x12/guidoism/generate_c.py` -to get the update C structs and Markdown for this file. + +## Function +``` +┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ +│ │ f1 │ f2 │ f3 │ f4 │ f5 │ f6 │ f7 │ f8 │ f9 │ f10 │ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ │ │ │ │ │ │ │ │ │ │ │ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ │ │ │ │ │ │ │ │ │ │ │ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ │ │ │ │ │ │ │ │ │ │ │ +└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ +``` From 3d15038dd40721a992606705cdac5c5e381f5bba Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Tue, 16 Oct 2018 07:30:12 -0700 Subject: [PATCH 394/788] Make RGB init write to eeprom once --- users/drashna/rgb_stuff.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/users/drashna/rgb_stuff.c b/users/drashna/rgb_stuff.c index dc6075320..9ad94c0c3 100644 --- a/users/drashna/rgb_stuff.c +++ b/users/drashna/rgb_stuff.c @@ -273,7 +273,7 @@ void matrix_init_rgb(void) { default: rgblight_sethsv_noeeprom_cyan(); break; } - rgblight_mode_noeeprom(1); + rgblight_mode(RGBLIGHT_MODE_STATIC_LIGHT); } } From 2776b9ee90d84b8a6c97e3e9395a8a87f499c5a9 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Tue, 16 Oct 2018 08:22:37 -0700 Subject: [PATCH 395/788] Update readme for userspace --- users/drashna/readme.md | 97 +++++++++++++---------------------------- 1 file changed, 31 insertions(+), 66 deletions(-) diff --git a/users/drashna/readme.md b/users/drashna/readme.md index 179960322..ffc60060f 100644 --- a/users/drashna/readme.md +++ b/users/drashna/readme.md @@ -1,11 +1,8 @@ -Overview -======== +# Overview -This is my personal userspace file. Most of my code exists here, as it's heavily shared. +This is my personal userspace file. Most of my code exists here, as it's heavily shared. - -Custom userspace handlers -------------------------- +## Custom userspace handlers Specifically QMK works by using customized handlers for everything. This allows for multiple levels of customization. @@ -15,29 +12,26 @@ The same goes for `matrix_init`, `layer_state_set`, `led_set`, and a few other f All (most) `_user` functions are handled here instead. To allow keyboard specific configuration, I've created `_keymap` functions that can be called by the keymap.c files instead. -This allows for keyboard specific configuration while maintaining the ability to customize the board. +This allows for keyboard specific configuration while maintaining the ability to customize the board. -My [Ergodox EZ Keymap](https://github.com/qmk/qmk_firmware/blob/master/keyboards/ergodox_ez/keymaps/drashna/keymap.c#L399) is a good example of this, as it uses the LEDs as modifier indicators. +My [Ergodox EZ Keymap](https://github.com/qmk/qmk_firmware/blob/master/layouts/community/ergodox/drashna/keymap.c#L297) is a good example of this, as it uses the LEDs as modifier indicators. +## Keyboard Layout Templates -Keyboard Layout Templates -------------------------- - -This borrows from @jola5's "Not quite neo" code. This allows me to maintain blocks of keymaps in the userspace, so that I can modify the userspace, and this is reflected in all of the keyboards that use it, at once. +This borrows from @jola5's "Not quite neo" code. This allows me to maintain blocks of keymaps in the userspace, so that I can modify the userspace, and this is reflected in all of the keyboards that use it, at once. This makes adding tap/hold mods, or other special keycodes or functions to all keyboards super easy, as it's done to all of them at once. -The caveat here is that the keymap needs a processor/wrapper, as it doesn't like the substitutions. However, this is as simple as just pushing it through a define. For instance: +The caveat here is that the keymap needs a processor/wrapper, as it doesn't like the substitutions. However, this is as simple as just pushing it through a define. For instance: `#define LAYOUT_ergodox_wrapper(...) LAYOUT_ergodox(__VA_ARGS__)` -Once that's been done and you've switched the keymaps to use the "wrapper", it will read the substitution blocks just fine. +Once that's been done and you've switched the keymaps to use the "wrapper", it will read the substitution blocks just fine. Credit goes to @jola5 for first implementing this awesome idea. -Custom Keycodes ---------------- +## Custom Keycodes Keycodes are defined in the drashna.h file and need to be included in the keymap.c files, so that they can be used there. @@ -45,10 +39,9 @@ A bunch of macros are present and are only included on boards that are not the E Included is a custom macro for compiling my keyboards. This includes the bootloader target (`:teensy`, `:avrdude`, or `:dfu`), and keeps RGBLIGHT, AUDIO and/or FAUXCLICKY enabled, if it previously was (regardless of the rules file). -This also includes a modified RESET keycode as well, that sets the underglow to red. +This also includes a modified RESET keycode as well, that sets the underglow to red. -Layer Indication ----------------- +## Layer Indication This uses the `layer_state_set_*` command to change the layer color, to indicate which layer it is on. This includes the default keymap, as well. @@ -58,9 +51,7 @@ Additionally, there is a custom keycode to toggle layer indication. And all RGB Also. I use `rgblight_sethsv` since it works with animation modes (that support it). - -Diablo Layer ------------- +## Diablo Layer This layer has some special handling. @@ -72,8 +63,7 @@ Tappind once disables this, and switching layers temporarily disables this, unti For critics that think this is cheating, search "diablo 3 num lock auto cast". This is just a simpler method, since I no longer own a normal (non QMK) numpad. -Secret Macros -------------- +## Secret Macros With help from gitter and Colinta, this adds the ability to add hidden macros from other users. @@ -82,7 +72,8 @@ First, I have several files that are hidden/excluded from Git/GitHub. These con And this requires `KC_SECRET_1` through `KC_SECRET_5` to be defined in your `.h` file to define the keycodes for the new macros. -###### .git/info/exclude +### .git/info/exclude + ``` # git ls-files --others --exclude-from=.git/info/exclude # Lines that start with '#' are comments. @@ -96,7 +87,7 @@ And this requires `KC_SECRET_1` through `KC_SECRET_5` to be defined in your `.c` file, you will want to add this to the top: +In the `.c` file, you will want to add this to the top: ```c __attribute__ ((weak)) @@ -152,64 +144,37 @@ bool process_record_secrets(uint16_t keycode, keyrecord_t *record) { return true; } ``` -This is so that the function can be called here, and replaced in the `secrets.c` file, and so it won't error out if it doesn't exist. +This is so that the function can be called here, and replaced in the `secrets.c` file, and so it won't error out if it doesn't exist. And then, in the `process_record_user` function, assuming you have `return process_record_keymap(keycode, record)` here, you'll want to replace the "final" return with the following. Otherwise, you want to replace the `return true;` with `return process_record_secrets(keycode, record);` + ```c return process_record_keymap(keycode, record) && process_record_secrets(keycode, record); } ``` -###### rules.mk +### rules.mk -Here, you want your `/users//rules.mk` file to "detect" the existence of the `secrets.c` file, and only add it if the file exists. To do so, add this block: -```c +Here, you want your `/users//rules.mk` file to "detect" the existence of the `secrets.c` file, and only add it if the file exists. To do so, add this block: + +```make ifneq ("$(wildcard $(USER_PATH)/secrets.c)","") SRC += secrets.c endif ``` Additionally, if you want to make sure that you can disable the function without messing with the file, you need to add this to your `/users//rules.mk`, so that it catches the flag: -```c + +```make ifeq ($(strip $(NO_SECRETS)), yes) OPT_DEFS += -DNO_SECRETS endif ``` -Then, if you run `make keyboard:name NO_SECRETS=yes`, it will default to the test strings in your `.c` file, rather than reading from your file. +Then, if you run `make keyboard:name NO_SECRETS=yes`, it will default to the test strings in your `.c` file, rather than reading from your file. - -Userspace EEPROM config ------------------------ - -This adds EEPROM support fo the userspace, so that certain values are configurable in such a way that persists when power is lost. Namely, just the clicky feature and the Overwatch macro option ("is_overwatch"). This is done by reading and saving the structure from EEPROM. - -To implement this, first you need to specify the location: - -```c -#define EECONFIG_USERSPACE (uint8_t *)20 -``` -This tells us where in the EEPROM that the data structure is located, and this specifies that it's a byte (8 bits). However, to maximize it's usage, we want to specify a data structure here, so that we can use multiple settings. To do that: - -```c -typedef union { - uint8_t raw; - struct { - bool clicky_enable :1; - bool is_overwatch :1; - }; -} userspace_config_t; -``` -Then, in your C file, you want to add: `userspace_config_t userspace_config;`, and in your `matrix_init_*` function, you want to add `userspace_config.raw = eeprom_read_byte(EECONFIG_USERSPACE);` - -From there, you'd want to use the data structure (such as `userspace_config.is_overwatch`) when you want to check this value. - -And if you want to update it, update directly and then use `eeprom_update_byte(EECONFIG_USERSPACE, userspace_config.raw);` to write the value back to the EEPROM. - - -Pro Micro Hacking ------------------ +## Pro Micro Hacking Well, you can get the QMK DFU bootloader working on the ProMicro. But you need to change fuses. From 76b5ac621d3f5f5e809de2bc9479d54b99a2f89f Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Tue, 16 Oct 2018 20:33:55 -0700 Subject: [PATCH 396/788] Update to Corne Keyboard (crkbd) keymap --- keyboards/crkbd/keymaps/drashna/keymap.c | 63 ++++++++++++++---------- keyboards/crkbd/keymaps/drashna/rules.mk | 2 +- 2 files changed, 39 insertions(+), 26 deletions(-) diff --git a/keyboards/crkbd/keymaps/drashna/keymap.c b/keyboards/crkbd/keymaps/drashna/keymap.c index a293d5337..49db492c4 100644 --- a/keyboards/crkbd/keymaps/drashna/keymap.c +++ b/keyboards/crkbd/keymaps/drashna/keymap.c @@ -113,12 +113,47 @@ const char *read_logo(void); void set_keylog(uint16_t keycode, keyrecord_t *record); const char *read_keylog(void); const char *read_keylogs(void); - +char layer_state_str[24]; // const char *read_mode_icon(bool swap); -// const char *read_host_led_state(void); +const char *read_host_led_state(void); // void set_timelog(void); // const char *read_timelog(void); + +const char* read_layer_state(void) { + switch (layer_state) { + case _QWERTY: + switch (default_layer_state) { + case _QWERTY: + snprintf(layer_state_str, sizeof(layer_state_str), "Layer: QWERTY"); + break; + case _COLEMAK: + snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Colemak"); + break; + case _DVORAK: + snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Dvorak"); + break; + case _WORKMAN: + snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Workman"); + break; + } + break; + case _RAISE: + snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Raise"); + break; + case _LOWER: + snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Lower"); + break; + case _ADJUST: + snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Adjust"); + break; + default: + snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Undef-%ld", layer_state); + } + + return layer_state_str; +} + void matrix_scan_keymap(void) { iota_gfx_task(); } @@ -130,7 +165,7 @@ void matrix_render_user(struct CharacterMatrix *matrix) { matrix_write_ln(matrix, read_keylog()); matrix_write_ln(matrix, read_keylogs()); //matrix_write_ln(matrix, read_mode_icon(keymap_config.swap_lalt_lgui)); - //matrix_write_ln(matrix, read_host_led_state()); + matrix_write_ln(matrix, read_host_led_state()); //matrix_write_ln(matrix, read_timelog()); } else { matrix_write(matrix, read_logo()); @@ -156,28 +191,6 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { set_keylog(keycode, record); // set_timelog(); } - - switch (keycode) { - case RGB_MOD: - #ifdef RGBLIGHT_ENABLE - if (record->event.pressed) { - rgblight_mode_noeeprom(RGB_current_mode); - rgblight_step(); - RGB_current_mode = rgblight_config.mode; - } - #endif - return false; - break; - case RGBRST: - #ifdef RGBLIGHT_ENABLE - if (record->event.pressed) { - eeconfig_update_rgblight_default(); - rgblight_enable(); - RGB_current_mode = rgblight_config.mode; - } - #endif - break; - } return true; } diff --git a/keyboards/crkbd/keymaps/drashna/rules.mk b/keyboards/crkbd/keymaps/drashna/rules.mk index 8f69cba72..a4e1deba8 100644 --- a/keyboards/crkbd/keymaps/drashna/rules.mk +++ b/keyboards/crkbd/keymaps/drashna/rules.mk @@ -26,6 +26,6 @@ SRC += ./lib/glcdfont.c \ ./lib/layer_state_reader.c \ ./lib/logo_reader.c \ ./lib/keylogger.c \ + ./lib/host_led_state_reader.c \ # ./lib/mode_icon_reader.c \ - # ./lib/host_led_state_reader.c \ # ./lib/timelogger.c \ From 6ed925103fcc80add200760b5e725f100b3597ab Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Tue, 23 Oct 2018 09:00:41 -0700 Subject: [PATCH 397/788] Change user EEPROM defaults --- users/drashna/drashna.c | 1 + 1 file changed, 1 insertion(+) diff --git a/users/drashna/drashna.c b/users/drashna/drashna.c index 7c280e2dd..cd7afe768 100644 --- a/users/drashna/drashna.c +++ b/users/drashna/drashna.c @@ -422,6 +422,7 @@ void led_set_user(uint8_t usb_led) { void eeconfig_init_user(void) { userspace_config.raw = 0; + userspace_config.rgb_layer_change = true; eeconfig_update_user(userspace_config.raw); } From 796bce5ab23108558e3eb06d485d3468b89e80f6 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Wed, 24 Oct 2018 08:22:36 -0700 Subject: [PATCH 398/788] Cleanup KC_MAKE command --- users/drashna/drashna.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/users/drashna/drashna.c b/users/drashna/drashna.c index cd7afe768..5329d36e2 100644 --- a/users/drashna/drashna.c +++ b/users/drashna/drashna.c @@ -254,17 +254,15 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { clear_mods(); send_string_with_delay_P(PSTR("make " QMK_KEYBOARD ":" QMK_KEYMAP), 10); if (temp_mod & MODS_SHIFT_MASK) { - send_string_with_delay_P(PSTR( -#if defined(__ARM__) - ":dfu-util" -#elif defined(BOOTLOADER_DFU) - ":dfu" -#elif defined(BOOTLOADER_HALFKAY) - ":teensy" -#elif defined(BOOTLOADER_CATERINA) - ":avrdude" -#endif // bootloader options - ), 10); + #if defined(__ARM__) + send_string_with_delay_P(PSTR(":dfu-util"), 10); + #elif defined(BOOTLOADER_DFU) + send_string_with_delay_P(PSTR(":dfu"), 10); + #elif defined(BOOTLOADER_HALFKAY) + send_string_with_delay_P(PSTR(":teensy"), 10); + #elif defined(BOOTLOADER_CATERINA) + send_string_with_delay_P(PSTR(":avrdude"), 10); + #endif // bootloader options } if (temp_mod & MODS_CTRL_MASK) { send_string_with_delay_P(PSTR(" -j8 --output-sync"), 10); } send_string_with_delay_P(PSTR(SS_TAP(X_ENTER)), 10); From 4df74f6058043cf37d997e8e93fc3526b29a13b3 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Wed, 24 Oct 2018 13:45:39 -0700 Subject: [PATCH 399/788] Minor updates to keymaps --- keyboards/crkbd/keymaps/drashna/keymap.c | 4 ++-- keyboards/crkbd/keymaps/drashna/rules.mk | 4 ++-- keyboards/iris/keymaps/drashna/keymap.c | 3 +-- keyboards/orthodox/keymaps/drashna/keymap.c | 2 +- layouts/community/ergodox/drashna/keymap.c | 3 +-- 5 files changed, 7 insertions(+), 9 deletions(-) diff --git a/keyboards/crkbd/keymaps/drashna/keymap.c b/keyboards/crkbd/keymaps/drashna/keymap.c index 49db492c4..99dcdb4e1 100644 --- a/keyboards/crkbd/keymaps/drashna/keymap.c +++ b/keyboards/crkbd/keymaps/drashna/keymap.c @@ -28,8 +28,8 @@ enum crkbd_keycodes { LAYOUT_wrapper( \ KC_ESC, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, KC_BSPC, \ KC_TAB, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, KC_QUOT, \ - KC_MLSF, CTL_T(K21), K22, K23, K24, K25, K26, K27, K28, K29, CTL_T(K2A), KC_MRSF, \ - LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE \ + OS_LSFT, CTL_T(K21), K22, K23, K24, K25, K26, K27, K28, K29, CTL_T(K2A), OS_RSFT, \ + LT(_LOWER,KC_GRV), KC_SPC, LALT_T(KC_BSPC), KC_DEL, KC_ENT, RAISE \ ) #define LAYOUT_crkbd_base_wrapper(...) LAYOUT_crkbd_base(__VA_ARGS__) diff --git a/keyboards/crkbd/keymaps/drashna/rules.mk b/keyboards/crkbd/keymaps/drashna/rules.mk index a4e1deba8..ccf8e2b7c 100644 --- a/keyboards/crkbd/keymaps/drashna/rules.mk +++ b/keyboards/crkbd/keymaps/drashna/rules.mk @@ -14,7 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE @@ -23,9 +23,9 @@ SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend # If you want to change the display of OLED, you need to change here SRC += ./lib/glcdfont.c \ ./lib/rgb_state_reader.c \ - ./lib/layer_state_reader.c \ ./lib/logo_reader.c \ ./lib/keylogger.c \ ./lib/host_led_state_reader.c \ + # ./lib/layer_state_reader.c \ # ./lib/mode_icon_reader.c \ # ./lib/timelogger.c \ diff --git a/keyboards/iris/keymaps/drashna/keymap.c b/keyboards/iris/keymaps/drashna/keymap.c index 60f41f9d9..21e3151c0 100644 --- a/keyboards/iris/keymaps/drashna/keymap.c +++ b/keyboards/iris/keymaps/drashna/keymap.c @@ -12,7 +12,7 @@ KC_ESC, ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________, KC_MINS, \ KC_TAB , K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, KC_BSLS, \ KC_C1R3, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, KC_QUOT, \ - KC_MLSF, CTL_T(K21), K22, K23, K24, K25, ALT_APP, OS_RGUI, K26, K27, K28, K29, CTL_T(K2A), KC_MRSF, \ + OS_LSFT, CTL_T(K21), K22, K23, K24, K25, OS_LALT, OS_RGUI, K26, K27, K28, K29, CTL_T(K2A), OS_RSFT, \ LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE \ ) #define LAYOUT_iris_base_wrapper(...) LAYOUT_iris_base(__VA_ARGS__) @@ -95,4 +95,3 @@ void matrix_init_keymap(void) { DDRB &= ~(1<<0); PORTB &= ~(1<<0); } - diff --git a/keyboards/orthodox/keymaps/drashna/keymap.c b/keyboards/orthodox/keymaps/drashna/keymap.c index 25296ca4f..545ad25dc 100644 --- a/keyboards/orthodox/keymaps/drashna/keymap.c +++ b/keyboards/orthodox/keymaps/drashna/keymap.c @@ -38,7 +38,7 @@ uint8_t last_osm; ) \ LAYOUT_wrapper( \ KC_ESC, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, KC_BSPC, \ - KC_TAB, K11, K12, K13, K14, K15, ALT_APP, OS_LGUI, KC_LALT, OS_RGUI, K16, K17, K18, K19, K1A, KC_QUOT, \ + KC_TAB, K11, K12, K13, K14, K15, OS_LALT, OS_LGUI, OS_RALT, OS_RGUI, K16, K17, K18, K19, K1A, KC_QUOT, \ KC_MLSF, CTL_T(K21), K22, K23, K24, K25, LOWER, KC_SPACE,KC_BSPC, KC_DEL, KC_ENT, RAISE, K26, K27, K28, K29, CTL_T(K2A), KC_MRSF \ ) #define LAYOUT_orthodox_base_wrapper(...) LAYOUT_orthodox_base(__VA_ARGS__) diff --git a/layouts/community/ergodox/drashna/keymap.c b/layouts/community/ergodox/drashna/keymap.c index b9a2eb7a8..518eaf034 100644 --- a/layouts/community/ergodox/drashna/keymap.c +++ b/layouts/community/ergodox/drashna/keymap.c @@ -41,7 +41,7 @@ bool skip_leds = false; KC_C1R3, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, KC_QUOT, \ KC_MLSF, CTL_T(K21), K22, K23, K24, K25, TG(_GAMEPAD), TG(_GAMEPAD), K26, K27, K28, K29, CTL_T(K2A), KC_MRSF, \ KC_GRV, OSM(MOD_MEH),OSM(MOD_LGUI),KC_LBRC, KC_RBRC, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, UC_IRNY, \ - ALT_T(KC_APP), OSM(MOD_LGUI), OSM(MOD_RGUI), CTL_T(KC_ESCAPE), \ + OS_LALT, OS_LGUI, OS_RGUI, CTL_T(KC_ESCAPE), \ KC_HOME, KC_PGUP, \ LT(_LOWER, KC_SPACE),KC_BSPC, KC_END, KC_PGDN, KC_DEL, LT(_RAISE, KC_ENTER) \ ) @@ -335,4 +335,3 @@ bool indicator_is_this_led_used_keyboard(uint8_t index) { return false; } } - From 7b3ead01339bcf75eecfa2c2c704159906995986 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Thu, 25 Oct 2018 08:56:05 -0700 Subject: [PATCH 400/788] Remove 'return false' in macros since it's not needed And it produces better handling overall. --- users/drashna/drashna.c | 29 +++++------------------------ 1 file changed, 5 insertions(+), 24 deletions(-) diff --git a/users/drashna/drashna.c b/users/drashna/drashna.c index 5329d36e2..5b9957c3d 100644 --- a/users/drashna/drashna.c +++ b/users/drashna/drashna.c @@ -226,25 +226,21 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { if (record->event.pressed) { set_single_persistent_default_layer(_QWERTY); } - return false; break; case KC_COLEMAK: if (record->event.pressed) { set_single_persistent_default_layer(_COLEMAK); } - return false; break; case KC_DVORAK: if (record->event.pressed) { set_single_persistent_default_layer(_DVORAK); } - return false; break; case KC_WORKMAN: if (record->event.pressed) { set_single_persistent_default_layer(_WORKMAN); } - return false; break; @@ -264,36 +260,26 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { send_string_with_delay_P(PSTR(":avrdude"), 10); #endif // bootloader options } + #if defined(KEYBOARD_viterbi) + send_string_with_delay_P(PSTR(":dfu"), 10); + #endif if (temp_mod & MODS_CTRL_MASK) { send_string_with_delay_P(PSTR(" -j8 --output-sync"), 10); } send_string_with_delay_P(PSTR(SS_TAP(X_ENTER)), 10); set_mods(temp_mod); } - return false; break; case EPRM: // Resets EEPROM if (record->event.pressed) { eeconfig_init(); } - return false; break; case VRSN: // Prints firmware version if (record->event.pressed) { send_string_with_delay_P(PSTR(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION ", Built on: " QMK_BUILDDATE), MACRO_TIMER); } - return false; break; -/* Code has been depreciated - case KC_SECRET_1 ... KC_SECRET_5: // Secrets! Externally defined strings, not stored in repo - if (!record->event.pressed) { - clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED); - send_string(decoy_secret[keycode - KC_SECRET_1]); - } - return false; - break; -*/ - // These are a serious of gaming macros. // Only enables for the viterbi, basically, // to save on firmware space, since it's limited. @@ -303,7 +289,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { #ifdef RGBLIGHT_ENABLE userspace_config.is_overwatch ? rgblight_mode_noeeprom(17) : rgblight_mode_noeeprom(18); #endif //RGBLIGHT_ENABLE - return false; break; + break; case KC_SALT: return send_game_macro("Salt, salt, salt...", record, false); case KC_MORESALT: @@ -339,7 +325,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } } #endif // TAP_DANCE_ENABLE - return false; break; + break; case KC_CCCV: // One key copy/paste @@ -356,32 +342,27 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { unregister_code(KC_LCTL); } } - return false; break; #ifdef UNICODE_ENABLE case UC_FLIP: // (ノಠ痊ಠ)ノ彡┻━┻ if (record->event.pressed) { send_unicode_hex_string("0028 30CE 0CA0 75CA 0CA0 0029 30CE 5F61 253B 2501 253B"); } - return false; break; case UC_TABL: // ┬─┬ノ( º _ ºノ) if (record->event.pressed) { send_unicode_hex_string("252C 2500 252C 30CE 0028 0020 00BA 0020 005F 0020 00BA 30CE 0029"); } - return false; break; case UC_SHRG: // ¯\_(ツ)_/¯ if (record->event.pressed) { send_unicode_hex_string("00AF 005C 005F 0028 30C4 0029 005F 002F 00AF"); } - return false; break; case UC_DISA: // ಠ_ಠ if (record->event.pressed) { send_unicode_hex_string("0CA0 005F 0CA0"); } - return false; break; #endif } From ba7a1e89769049ba24de92e6538875803079a702 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Thu, 25 Oct 2018 22:08:22 -0700 Subject: [PATCH 401/788] Update old iris config --- keyboards/iris/keymaps/drashna_old/config.h | 9 ++------- keyboards/iris/keymaps/drashna_old/rules.mk | 5 ++--- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/keyboards/iris/keymaps/drashna_old/config.h b/keyboards/iris/keymaps/drashna_old/config.h index 6152ca5b6..e452f695a 100644 --- a/keyboards/iris/keymaps/drashna_old/config.h +++ b/keyboards/iris/keymaps/drashna_old/config.h @@ -15,10 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "config_common.h" +#pragma once /* Use I2C or Serial, not both */ @@ -34,7 +31,7 @@ along with this program. If not, see . #ifdef RGBLIGHT_ENABLE #undef RGBLED_NUM #define RGBLED_NUM 16 // Number of LEDs -#define RGBLIGHT_ANIMATIONS + #define RGBLIGHT_HUE_STEP 12 #define RGBLIGHT_SAT_STEP 12 #define RGBLIGHT_VAL_STEP 12 @@ -70,5 +67,3 @@ along with this program. If not, see . #define ALT_LED1 7 #define GUI_LED1 8 - -#endif diff --git a/keyboards/iris/keymaps/drashna_old/rules.mk b/keyboards/iris/keymaps/drashna_old/rules.mk index f6ec9d1e5..441d15a54 100644 --- a/keyboards/iris/keymaps/drashna_old/rules.mk +++ b/keyboards/iris/keymaps/drashna_old/rules.mk @@ -1,4 +1,5 @@ USER_NAME := drashna +SRC += ../drashna/keymap.c BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) MOUSEKEY_ENABLE = no # Mouse keys(+4700) @@ -10,12 +11,10 @@ RGBLIGHT_ENABLE = yes AUDIO_ENABLE = yes NKRO_ENABLE = yes BACKLIGHT_ENABLE = no -SWAP_HANDS_ENABLE = no +SWAP_HANDS_ENABLE = yes INDICATOR_LIGHTS = yes MACROS_ENABLED = no RGBLIGHT_TWINKLE = yes -SRC += ../drashna/keymap.c - BOOTLOADER = qmk-dfu From d29a61e9ce39947cc2618c5d19d36f063bb0255b Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Thu, 25 Oct 2018 22:08:49 -0700 Subject: [PATCH 402/788] Add Bootmagic Lite for now --- users/drashna/config.h | 9 ++++++++- users/drashna/drashna.c | 19 +++++++++++++++++++ users/drashna/drashna.h | 1 - 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/users/drashna/config.h b/users/drashna/config.h index 4545b34ef..0d41359cc 100644 --- a/users/drashna/config.h +++ b/users/drashna/config.h @@ -73,4 +73,11 @@ #define MACRO_TIMER 5 - +#if !defined(BOOTMAGIC_LITE) && !defined(BOOTMAGIC_ENABLE) +#ifndef BOOTMAGIC_LITE_COLUMN + #define BOOTMAGIC_LITE_COLUMN 0 +#endif +#ifndef BOOTMAGIC_LITE_ROW + #define BOOTMAGIC_LITE_ROW 0 +#endif +#endif diff --git a/users/drashna/drashna.c b/users/drashna/drashna.c index 5b9957c3d..35fa15be4 100644 --- a/users/drashna/drashna.c +++ b/users/drashna/drashna.c @@ -81,6 +81,21 @@ bool mod_key_press (uint16_t code, uint16_t mod_code, bool pressed, uint16_t thi return false; } +void bootmagic_lite(void) { + matrix_scan(); + #if defined(DEBOUNCING_DELAY) && DEBOUNCING_DELAY > 0 + wait_ms(DEBOUNCING_DELAY * 2); + #elif defined(DEBOUNCE) && DEBOUNCE > 0 + wait_ms(DEBOUNCE * 2); + #else + wait_ms(30); + #endif + matrix_scan(); + if (matrix_get_row(BOOTMAGIC_LITE_ROW) & (1 << BOOTMAGIC_LITE_COLUMN)) { + bootloader_jump(); + } +} + // Add reconfigurable functions here, for keymap customization // This allows for a global, userspace functions, and continued // customization of the keymap. Use _keymap instead of _user @@ -133,6 +148,10 @@ void eeconfig_init_keymap(void) {} // Call user matrix init, set default RGB colors and then // call the keymap's init function void matrix_init_user(void) { + #if !defined(BOOTMAGIC_LITE) && !defined(BOOTMAGIC_ENABLE) + bootmagic_lite(); + #endif + userspace_config.raw = eeconfig_read_user(); #ifdef BOOTLOADER_CATERINA diff --git a/users/drashna/drashna.h b/users/drashna/drashna.h index 7e69a9f8d..221a8e413 100644 --- a/users/drashna/drashna.h +++ b/users/drashna/drashna.h @@ -353,4 +353,3 @@ NOTE: These are all the same length. If you do a search/replace #define _________________ADJUST_R1_________________ KC_SEC1, KC_SEC2, KC_SEC3, KC_SEC4, KC_SEC5 #define _________________ADJUST_R2_________________ AG_SWAP, QWERTY, COLEMAK, DVORAK, WORKMAN #define _________________ADJUST_R3_________________ MG_NKRO, KC_MUTE, KC_VOLD, KC_VOLU, KC_MNXT - From 9d27bb512f86757607a1e7a46688568198e7ce7d Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sat, 27 Oct 2018 12:17:15 -0700 Subject: [PATCH 403/788] Fix userspace config.h --- users/drashna/config.h | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/users/drashna/config.h b/users/drashna/config.h index 0d41359cc..9d7d20add 100644 --- a/users/drashna/config.h +++ b/users/drashna/config.h @@ -69,15 +69,4 @@ #define NO_ACTION_MACRO #define NO_ACTION_FUNCTION -#define DISABLE_LEADER - #define MACRO_TIMER 5 - -#if !defined(BOOTMAGIC_LITE) && !defined(BOOTMAGIC_ENABLE) -#ifndef BOOTMAGIC_LITE_COLUMN - #define BOOTMAGIC_LITE_COLUMN 0 -#endif -#ifndef BOOTMAGIC_LITE_ROW - #define BOOTMAGIC_LITE_ROW 0 -#endif -#endif From 214241853a7b52d64e5cc702b107f264160f6880 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sat, 27 Oct 2018 12:20:10 -0700 Subject: [PATCH 404/788] Fix Bootmagic_lite function --- users/drashna/drashna.c | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/users/drashna/drashna.c b/users/drashna/drashna.c index 35fa15be4..b2219e9aa 100644 --- a/users/drashna/drashna.c +++ b/users/drashna/drashna.c @@ -423,19 +423,3 @@ void eeconfig_init_user(void) { userspace_config.rgb_layer_change = true; eeconfig_update_user(userspace_config.raw); } - -void bootmagic_lite(void) { - matrix_scan(); - #if defined(DEBOUNCING_DELAY) && DEBOUNCING_DELAY > 0 - wait_ms(DEBOUNCING_DELAY * 2); - #elif defined(DEBOUNCE) && DEBOUNCE > 0 - wait_ms(DEBOUNCE * 2); - #else - wait_ms(30); - #endif - matrix_scan(); - - if (matrix_get_row(BOOTMAGIC_LITE_ROW) & (1 << BOOTMAGIC_LITE_COLUMN)) { - bootloader_jump(); - } -} From 0f086e488954dcfac49c1c27aa972441b944c68c Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sat, 27 Oct 2018 12:32:53 -0700 Subject: [PATCH 405/788] Add Alternate DVORAK layout --- users/drashna/drashna.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/users/drashna/drashna.h b/users/drashna/drashna.h index 221a8e413..573cb26fd 100644 --- a/users/drashna/drashna.h +++ b/users/drashna/drashna.h @@ -255,6 +255,14 @@ NOTE: These are all the same length. If you do a search/replace #define _________________DVORAK_R3_________________ KC_B, KC_M, KC_W, KC_V, KC_Z +#define ________________DVORAK_AU_L1_______________ KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y +#define ________________DVORAK_AU_L2_______________ KC_O, KC_A, KC_E, KC_I, KC_U +#define ________________DVORAK_AU_L3_______________ KC_SCLN, KC_Q, KC_J, KC_K, KC_X + +#define ________________DVORAK_AU_R1_______________ KC_F, KC_G, KC_C, KC_R, KC_L +#define ________________DVORAK_AU_R2_______________ KC_D, KC_H, KC_T, KC_N, KC_S +#define ________________DVORAK_AU_R3_______________ KC_B, KC_M, KC_W, KC_V, KC_Z + #define _________________WORKMAN_L1________________ KC_Q, KC_D, KC_R, KC_W, KC_B #define _________________WORKMAN_L2________________ KC_A, KC_S, KC_H, KC_T, KC_G #define _________________WORKMAN_L3________________ KC_Z, KC_X, KC_M, KC_C, KC_V From b9811fd7e79b409138d733f5544a29d13906cccf Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sat, 27 Oct 2018 12:40:15 -0700 Subject: [PATCH 406/788] Make old keymap super compatible --- keyboards/iris/keymaps/drashna_old/rules.mk | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/keyboards/iris/keymaps/drashna_old/rules.mk b/keyboards/iris/keymaps/drashna_old/rules.mk index 441d15a54..73f37c6c5 100644 --- a/keyboards/iris/keymaps/drashna_old/rules.mk +++ b/keyboards/iris/keymaps/drashna_old/rules.mk @@ -1,20 +1,4 @@ USER_NAME := drashna SRC += ../drashna/keymap.c -BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = no # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = no # Console for debug(+400) -COMMAND_ENABLE = no # Commands for debug and configuration -TAP_DANCE_ENABLE = no -RGBLIGHT_ENABLE = yes -AUDIO_ENABLE = yes -NKRO_ENABLE = yes -BACKLIGHT_ENABLE = no -SWAP_HANDS_ENABLE = yes - -INDICATOR_LIGHTS = yes -MACROS_ENABLED = no -RGBLIGHT_TWINKLE = yes - -BOOTLOADER = qmk-dfu +include $(KEYBOARD_PATH_2)/keymaps/drashna/rules.mk From c60a312ba99f4ece511f36bc25c5f63410313b5b Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sat, 27 Oct 2018 14:52:57 -0700 Subject: [PATCH 407/788] Further unify old iris keymap --- keyboards/iris/keymaps/drashna/config.h | 2 + keyboards/iris/keymaps/drashna_old/config.h | 41 +++++---------------- 2 files changed, 11 insertions(+), 32 deletions(-) diff --git a/keyboards/iris/keymaps/drashna/config.h b/keyboards/iris/keymaps/drashna/config.h index 027486715..dd247a42a 100644 --- a/keyboards/iris/keymaps/drashna/config.h +++ b/keyboards/iris/keymaps/drashna/config.h @@ -68,3 +68,5 @@ along with this program. If not, see . #define ALT_LED1 8 #define GUI_LED1 9 +#define BOOTMAGIC_LITE_ROW 4 +#define BOOTMAGIC_LITE_COLUMN 3 diff --git a/keyboards/iris/keymaps/drashna_old/config.h b/keyboards/iris/keymaps/drashna_old/config.h index e452f695a..b985c4dfc 100644 --- a/keyboards/iris/keymaps/drashna_old/config.h +++ b/keyboards/iris/keymaps/drashna_old/config.h @@ -18,52 +18,29 @@ along with this program. If not, see . #pragma once /* Use I2C or Serial, not both */ - -#define USE_SERIAL -#undef USE_I2C - -/* Select hand configuration */ - -// #define MASTER_LEFT -// #define MASTER_RIGHT -#define EE_HANDS +#include "../drashna/config.h" #ifdef RGBLIGHT_ENABLE #undef RGBLED_NUM #define RGBLED_NUM 16 // Number of LEDs - -#define RGBLIGHT_HUE_STEP 12 -#define RGBLIGHT_SAT_STEP 12 -#define RGBLIGHT_VAL_STEP 12 -#define RGBLIGHT_EFFECT_KNIGHT_LENGTH 2 -#define RGBLIGHT_EFFECT_SNAKE_LENGTH 2 -#define RGBLIGHT_EFFECT_BREATHE_CENTER 1 - -#define RGBLIGHT_LIMIT_VAL 225 -#endif // RGBLIGHT_ENABLE - -#ifdef AUDIO_ENABLE -#define C6_AUDIO -#ifdef RGBLIGHT_ENABLE -#define NO_MUSIC_MODE -#endif //RGBLIGHT_ENABLE -#endif //AUDIO_ENABLE - -#define QMK_ESC_OUTPUT F6 // usually COL -#define QMK_ESC_INPUT D7 // usually ROW -#define QMK_LED B0 -#define QMK_SPEAKER C6 +#endif #undef PRODUCT #ifdef KEYBOARD_iris_rev2 -#define PRODUCT Drashna Hacked Iris Rev.2 +#define PRODUCT Drashna Hacked Iris Rev.2 (16 LED) #endif +#undef SHFT_LED1 #define SHFT_LED1 5 +#undef SHFT_LED2 #define SHFT_LED2 10 +#undef CTRL_LED1 #define CTRL_LED1 6 +#undef CTRL_LED2 #define CTRL_LED2 9 +#undef ALT_LED1 #define ALT_LED1 7 +#undef GUI_LED1 #define GUI_LED1 8 From 8517f8a6606d092014edf23ac9874d6a47fe1178 Mon Sep 17 00:00:00 2001 From: Takeshi ISHII <2170248+mtei@users.noreply.github.com> Date: Mon, 29 Oct 2018 02:12:44 +0900 Subject: [PATCH 408/788] Helix serial.c re-adjust compiler depend value of delay (#4269) * Helix serial.c add debug code * re-adjust READ_WRITE_WIDTH_ADJUST values * re-adjust READ_WRITE_START_ADJUST values * re-adjust TID_SEND_ADJUST value * Helix serial.c: remove debug code --- keyboards/helix/rev2/split_scomm.c | 3 -- keyboards/helix/serial.c | 54 ++++++++++++++++++++++++------ 2 files changed, 44 insertions(+), 13 deletions(-) diff --git a/keyboards/helix/rev2/split_scomm.c b/keyboards/helix/rev2/split_scomm.c index 50d233ce9..ada786796 100644 --- a/keyboards/helix/rev2/split_scomm.c +++ b/keyboards/helix/rev2/split_scomm.c @@ -7,9 +7,6 @@ #include #include #include "serial.h" -#ifdef SERIAL_DEBUG_MODE -#include -#endif #ifdef CONSOLE_ENABLE #include #endif diff --git a/keyboards/helix/serial.c b/keyboards/helix/serial.c index 830f86b55..c813b6b9a 100644 --- a/keyboards/helix/serial.c +++ b/keyboards/helix/serial.c @@ -136,38 +136,68 @@ int serial_update_buffers() // 5: about 20kbps #endif -#define TID_SEND_ADJUST 2 +#if __GNUC__ < 6 + #define TID_SEND_ADJUST 14 +#else + #define TID_SEND_ADJUST 2 +#endif #if SELECT_SOFT_SERIAL_SPEED == 0 // Very High speed #define SERIAL_DELAY 4 // micro sec - #define READ_WRITE_START_ADJUST 33 // cycles - #define READ_WRITE_WIDTH_ADJUST 6 // cycles + #if __GNUC__ < 6 + #define READ_WRITE_START_ADJUST 33 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_START_ADJUST 34 // cycles + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif #elif SELECT_SOFT_SERIAL_SPEED == 1 // High speed #define SERIAL_DELAY 6 // micro sec - #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #if __GNUC__ < 6 + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_START_ADJUST 33 // cycles + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif #elif SELECT_SOFT_SERIAL_SPEED == 2 // Middle speed #define SERIAL_DELAY 12 // micro sec #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #if __GNUC__ < 6 + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif #elif SELECT_SOFT_SERIAL_SPEED == 3 // Low speed #define SERIAL_DELAY 24 // micro sec #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #if __GNUC__ < 6 + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif #elif SELECT_SOFT_SERIAL_SPEED == 4 // Very Low speed #define SERIAL_DELAY 36 // micro sec #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #if __GNUC__ < 6 + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif #elif SELECT_SOFT_SERIAL_SPEED == 5 // Ultra Low speed #define SERIAL_DELAY 48 // micro sec #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #if __GNUC__ < 6 + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif #else #error invalid SELECT_SOFT_SERIAL_SPEED value #endif /* SELECT_SOFT_SERIAL_SPEED */ @@ -187,16 +217,19 @@ int serial_update_buffers() static SSTD_t *Transaction_table = NULL; static uint8_t Transaction_table_size = 0; +inline static void serial_delay(void) ALWAYS_INLINE; inline static void serial_delay(void) { _delay_us(SERIAL_DELAY); } +inline static void serial_delay_half1(void) ALWAYS_INLINE; inline static void serial_delay_half1(void) { _delay_us(SERIAL_DELAY_HALF1); } +inline static void serial_delay_half2(void) ALWAYS_INLINE; inline static void serial_delay_half2(void) { _delay_us(SERIAL_DELAY_HALF2); @@ -216,6 +249,7 @@ void serial_input_with_pullup(void) { SERIAL_PIN_PORT |= SERIAL_PIN_MASK; } +inline static uint8_t serial_read_pin(void) ALWAYS_INLINE; inline static uint8_t serial_read_pin(void) { return !!(SERIAL_PIN_INPUT & SERIAL_PIN_MASK); @@ -270,7 +304,7 @@ void sync_recv(void) { } // Used by the reciver to send a synchronization signal to the sender. -static void sync_send(void)NO_INLINE; +static void sync_send(void) NO_INLINE; static void sync_send(void) { serial_low(); From d63fb6f716b865fe1cede22787aa15834aecd868 Mon Sep 17 00:00:00 2001 From: mtei <2170248+mtei@users.noreply.github.com> Date: Mon, 29 Oct 2018 02:23:48 +0900 Subject: [PATCH 409/788] helix serial.c: add some comment --- keyboards/helix/serial.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/keyboards/helix/serial.c b/keyboards/helix/serial.c index c813b6b9a..24b889d30 100644 --- a/keyboards/helix/serial.c +++ b/keyboards/helix/serial.c @@ -1,5 +1,10 @@ /* * WARNING: be careful changing this code, it is very timing dependent + * + * 2018-10-28 checked + * avr-gcc 4.9.2 + * avr-gcc 5.4.0 + * avr-gcc 7.3.0 */ #ifndef F_CPU From cd87a8a323f0a522624550117d8a7a0249a72017 Mon Sep 17 00:00:00 2001 From: R4WBIT Date: Mon, 29 Oct 2018 13:32:36 +0100 Subject: [PATCH 410/788] fixed broken linebreak in fedora part, and indentation in arch-part --- util/linux_install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/util/linux_install.sh b/util/linux_install.sh index 5186e31f2..2c6cba53d 100755 --- a/util/linux_install.sh +++ b/util/linux_install.sh @@ -8,7 +8,7 @@ if grep ID /etc/os-release | grep -qE "fedora"; then sudo dnf install \ arm-none-eabi-binutils-cs \ arm-none-eabi-gcc-cs \ - arm-none-eabi-newlib + arm-none-eabi-newlib \ avr-binutils \ avr-gcc \ avr-libc \ @@ -59,7 +59,7 @@ elif grep ID /etc/os-release | grep -q 'arch\|manjaro'; then avr-binutils \ avr-libc \ avr-gcc \ - base-devel \ + base-devel \ dfu-util \ diff-utils \ gcc \ From cd23984afcee9a8dd2b1b44876b77141d692de45 Mon Sep 17 00:00:00 2001 From: patrickmt <40182064+patrickmt@users.noreply.github.com> Date: Mon, 29 Oct 2018 10:04:52 -0400 Subject: [PATCH 411/788] Fix undefined reference to `console_printf` for CTRL and ALT keyboards Fix undefined reference to `console_printf` for CTRL and ALT keyboards when enabling CONSOLE_ENABLE --- tmk_core/common/arm_atsam/printf.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tmk_core/common/arm_atsam/printf.c b/tmk_core/common/arm_atsam/printf.c index d49d234de..7f298d1fd 100644 --- a/tmk_core/common/arm_atsam/printf.c +++ b/tmk_core/common/arm_atsam/printf.c @@ -15,7 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifdef CONSOLE_PRINT +#ifdef CONSOLE_ENABLE #include "samd51j18a.h" #include "arm_atsam_protocol.h" @@ -63,4 +63,4 @@ void console_printf(char *fmt, ...) { } } -#endif //CONSOLE_PRINT +#endif //CONSOLE_ENABLE From 6a629e5d0d4ed5903afa361568da8daeddc1b090 Mon Sep 17 00:00:00 2001 From: jshuf <44121348+jshuf@users.noreply.github.com> Date: Mon, 29 Oct 2018 13:33:07 -0400 Subject: [PATCH 412/788] Keyboard: add support for kbd19x (#4272) * 60_ansi keymap for DZ60 * 60_ansi keymap for DZ60 Amend author * 60_ansi keymap for DZ60 * Merge new phantom layout from dev branch * Initial util/new_project files * Progress checkpoint (compiles, but untested) * Progress snapshot, still working on layout graphics * Add layer images * Tidy up formatting * First cut at info.json for kbd19x default layout * Add default keymap * add all-keys layout * clean up documentation * Update keyboards/kbd19x/info.json Co-Authored-By: jshuf <44121348+jshuf@users.noreply.github.com> * Update keyboards/kbd19x/rules.mk Co-Authored-By: jshuf <44121348+jshuf@users.noreply.github.com> * Change layout name from default to ansi --- keyboards/kbd19x/config.h | 224 +++++++++++++++++++++ keyboards/kbd19x/info.json | 218 ++++++++++++++++++++ keyboards/kbd19x/kbd19x.c | 63 ++++++ keyboards/kbd19x/kbd19x.h | 103 ++++++++++ keyboards/kbd19x/keymaps/default/config.h | 20 ++ keyboards/kbd19x/keymaps/default/keymap.c | 52 +++++ keyboards/kbd19x/keymaps/default/readme.md | 13 ++ keyboards/kbd19x/readme.md | 19 ++ keyboards/kbd19x/rules.mk | 80 ++++++++ 9 files changed, 792 insertions(+) create mode 100644 keyboards/kbd19x/config.h create mode 100644 keyboards/kbd19x/info.json create mode 100644 keyboards/kbd19x/kbd19x.c create mode 100644 keyboards/kbd19x/kbd19x.h create mode 100644 keyboards/kbd19x/keymaps/default/config.h create mode 100644 keyboards/kbd19x/keymaps/default/keymap.c create mode 100644 keyboards/kbd19x/keymaps/default/readme.md create mode 100644 keyboards/kbd19x/readme.md create mode 100644 keyboards/kbd19x/rules.mk diff --git a/keyboards/kbd19x/config.h b/keyboards/kbd19x/config.h new file mode 100644 index 000000000..47cfd7484 --- /dev/null +++ b/keyboards/kbd19x/config.h @@ -0,0 +1,224 @@ +/* +Copyright 2018 Jeff Shufelt @jshuf + +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 . +*/ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0000 +#define DEVICE_VER 0x0001 +#define MANUFACTURER KBDFans +#define PRODUCT kbd19x +#define DESCRIPTION A compact-1800 keyboard kit. + +/* key matrix size */ +#define MATRIX_ROWS 8 +#define MATRIX_COLS 13 + +/* + * 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 { B7, B3, E6, F0, D5, D4, D6, C7 } +#define MATRIX_COL_PINS { C6, F1, F4, F5, F6, F7, D7, B4, B5, D0, D1, D2, D3 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +#define BACKLIGHT_PIN B6 +// #define BACKLIGHT_BREATHING +#define BACKLIGHT_LEVELS 3 + +#define RGB_DI_PIN E2 +#ifdef RGB_DI_PIN +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 18 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 +#endif + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* 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 userful 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 + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * 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 + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +//#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ + diff --git a/keyboards/kbd19x/info.json b/keyboards/kbd19x/info.json new file mode 100644 index 000000000..dd5cc700c --- /dev/null +++ b/keyboards/kbd19x/info.json @@ -0,0 +1,218 @@ +{ + "keyboard_name": "KBD19x", + "url": "https://github.com/qmk/qmk_firmware/tree/master/keyboards/kbd19x", + "maintainer": "qmk", + "width": 19.5, + "height": 6.75, + "layouts": { + "LAYOUT_ansi": { + "key_count": 99, + "layout": [{"label":"Esc", "x":0, "y":0}, + {"label":"F1", "x":1.25, "y":0}, + {"label":"F2", "x":2.25, "y":0}, + {"label":"F3", "x":3.25, "y":0}, + {"label":"F4", "x":4.25, "y":0}, + {"label":"F5", "x":5.5, "y":0}, + {"label":"F6", "x":6.5, "y":0}, + {"label":"F7", "x":7.5, "y":0}, + {"label":"F8", "x":8.5, "y":0}, + {"label":"F9", "x":9.75, "y":0}, + {"label":"F10", "x":10.75, "y":0}, + {"label":"F11", "x":11.75, "y":0}, + {"label":"F12", "x":12.75, "y":0}, + {"label":"BkLgt Step", "x":14, "y":0}, + {"label":"Print Screen", "x":15.5, "y":0}, + {"label":"Scroll Lock", "x":16.5, "y":0}, + {"label":"Pause Break", "x":17.5, "y":0}, + {"label":"PgDn", "x":18.5, "y":0}, + {"label":"~", "x":0, "y":1.5}, + {"label":"!", "x":1, "y":1.5}, + {"label":"@", "x":2, "y":1.5}, + {"label":"#", "x":3, "y":1.5}, + {"label":"$", "x":4, "y":1.5}, + {"label":"%", "x":5, "y":1.5}, + {"label":"^", "x":6, "y":1.5}, + {"label":"&", "x":7, "y":1.5}, + {"label":"*", "x":8, "y":1.5}, + {"label":"(", "x":9, "y":1.5}, + {"label":")", "x":10, "y":1.5}, + {"label":"_", "x":11, "y":1.5}, + {"label":"+", "x":12, "y":1.5}, + {"label":"Backspace", "x":13, "y":1.5, "w":2}, + {"label":"Num Lock", "x":15.5, "y":1.5}, + {"label":"/", "x":16.5, "y":1.5}, + {"label":"*", "x":17.5, "y":1.5}, + {"label":"-", "x":18.5, "y":1.5}, + {"label":"Tab", "x":0, "y":2.5, "w":1.5}, + {"label":"Q", "x":1.5, "y":2.5}, + {"label":"W", "x":2.5, "y":2.5}, + {"label":"E", "x":3.5, "y":2.5}, + {"label":"R", "x":4.5, "y":2.5}, + {"label":"T", "x":5.5, "y":2.5}, + {"label":"Y", "x":6.5, "y":2.5}, + {"label":"U", "x":7.5, "y":2.5}, + {"label":"I", "x":8.5, "y":2.5}, + {"label":"O", "x":9.5, "y":2.5}, + {"label":"P", "x":10.5, "y":2.5}, + {"label":"{", "x":11.5, "y":2.5}, + {"label":"}", "x":12.5, "y":2.5}, + {"label":"|", "x":13.5, "y":2.5, "w":1.5}, + {"label":"7", "x":15.5, "y":2.5}, + {"label":"8", "x":16.5, "y":2.5}, + {"label":"9", "x":17.5, "y":2.5}, + {"label":"+", "x":18.5, "y":2.5, "h":2}, + {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75},\ + {"label":"A", "x":1.75, "y":3.5}, + {"label":"S", "x":2.75, "y":3.5}, + {"label":"D", "x":3.75, "y":3.5}, + {"label":"F", "x":4.75, "y":3.5}, + {"label":"G", "x":5.75, "y":3.5}, + {"label":"H", "x":6.75, "y":3.5}, + {"label":"J", "x":7.75, "y":3.5}, + {"label":"K", "x":8.75, "y":3.5}, + {"label":"L", "x":9.75, "y":3.5}, + {"label":":", "x":10.75, "y":3.5}, + {"label":"\"", "x":11.75, "y":3.5}, + {"label":"Enter", "x":12.75, "y":3.5, "w":2.25}, + {"label":"4", "x":15.5, "y":3.5}, + {"label":"5", "x":16.5, "y":3.5}, + {"label":"6", "x":17.5, "y":3.5}, + {"label":"Shift", "x":0, "y":4.5, "w":2.25}, + {"label":"Z", "x":2.25, "y":4.5}, + {"label":"X", "x":3.25, "y":4.5}, + {"label":"C", "x":4.25, "y":4.5}, + {"label":"V", "x":5.25, "y":4.5}, + {"label":"B", "x":6.25, "y":4.5}, + {"label":"N", "x":7.25, "y":4.5}, + {"label":"M", "x":8.25, "y":4.5}, + {"label":"<", "x":9.25, "y":4.5}, + {"label":">", "x":10.25, "y":4.5}, + {"label":"?", "x":11.25, "y":4.5}, + {"label":"Shift", "x":12.25, "y":4.5, "w":1.75}, + {"label":"1", "x":15.5, "y":4.5}, + {"label":"2", "x":16.5, "y":4.5}, + {"label":"3", "x":17.5, "y":4.5}, + {"label":"Enter", "x":18.5, "y":4.5, "h":2}, + {"label":"\u2191", "x":14.25, "y":4.75}, + {"label":"Ctrl", "x":0, "y":5.5, "w":1.25}, + {"label":"Win", "x":1.25, "y":5.5}, + {"label":"Alt", "x":2.25, "y":5.5, "w":1.25}, + {"x":3.5, "y":5.5, "w":6.25}, + {"label":"Alt", "x":9.75, "y":5.5}, + {"label":"MO(1)", "x":10.75, "y":5.5}, + {"label":"Ctrl", "x":11.75, "y":5.5, "w":1.25}, + {"label":"0", "x":16.5, "y":5.5}, + {"label":".", "x":17.5, "y":5.5}, + {"label":"\u2190", "x":13.25, "y":5.75}, + {"label":"\u2193", "x":14.25, "y":5.75}, + {"label":"\u2192", "x":15.25, "y":5.75}] + }, + "LAYOUT_all": { + "key_count": 103, + "layout": [{"label":"Esc", "x":0, "y":0}, + {"label":"F1", "x":1.25, "y":0}, + {"label":"F2", "x":2.25, "y":0}, + {"label":"F3", "x":3.25, "y":0}, + {"label":"F4", "x":4.25, "y":0}, + {"label":"F5", "x":5.5, "y":0}, + {"label":"F6", "x":6.5, "y":0}, + {"label":"F7", "x":7.5, "y":0}, + {"label":"F8", "x":8.5, "y":0}, + {"label":"F9", "x":9.75, "y":0}, + {"label":"F10", "x":10.75, "y":0}, + {"label":"F11", "x":11.75, "y":0}, + {"label":"F12", "x":12.75, "y":0}, + {"label":"BkLgt Step", "x":14, "y":0}, + {"label":"Print Screen", "x":15.5, "y":0}, + {"label":"Scroll Lock", "x":16.5, "y":0}, + {"label":"Pause Break", "x":17.5, "y":0}, + {"label":"PgDn", "x":18.5, "y":0}, + {"label":"~", "x":0, "y":1.5}, + {"label":"!", "x":1, "y":1.5}, + {"label":"@", "x":2, "y":1.5}, + {"label":"#", "x":3, "y":1.5}, + {"label":"$", "x":4, "y":1.5}, + {"label":"%", "x":5, "y":1.5}, + {"label":"^", "x":6, "y":1.5}, + {"label":"&", "x":7, "y":1.5}, + {"label":"*", "x":8, "y":1.5}, + {"label":"(", "x":9, "y":1.5}, + {"label":")", "x":10, "y":1.5}, + {"label":"_", "x":11, "y":1.5}, + {"label":"+", "x":12, "y":1.5}, + {"x":13, "y":1.5}, + {"label":"BS", "x":14, "y":1.5}, + {"label":"Num Lock", "x":15.5, "y":1.5}, + {"label":"/", "x":16.5, "y":1.5}, + {"label":"*", "x":17.5, "y":1.5}, + {"label":"-", "x":18.5, "y":1.5}, + {"label":"Tab", "x":0, "y":2.5, "w":1.5}, + {"label":"Q", "x":1.5, "y":2.5}, + {"label":"W", "x":2.5, "y":2.5}, + {"label":"E", "x":3.5, "y":2.5}, + {"label":"R", "x":4.5, "y":2.5}, + {"label":"T", "x":5.5, "y":2.5}, + {"label":"Y", "x":6.5, "y":2.5}, + {"label":"U", "x":7.5, "y":2.5}, + {"label":"I", "x":8.5, "y":2.5}, + {"label":"O", "x":9.5, "y":2.5}, + {"label":"P", "x":10.5, "y":2.5}, + {"label":"{", "x":11.5, "y":2.5}, + {"label":"}", "x":12.5, "y":2.5}, + {"label":"|", "x":13.5, "y":2.5, "w":1.5}, + {"label":"7", "x":15.5, "y":2.5}, + {"label":"8", "x":16.5, "y":2.5}, + {"label":"9", "x":17.5, "y":2.5}, + {"label":"+", "x":18.5, "y":2.5}, + {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75}, + {"label":"A", "x":1.75, "y":3.5}, + {"label":"S", "x":2.75, "y":3.5}, + {"label":"D", "x":3.75, "y":3.5}, + {"label":"F", "x":4.75, "y":3.5}, + {"label":"G", "x":5.75, "y":3.5}, + {"label":"H", "x":6.75, "y":3.5}, + {"label":"J", "x":7.75, "y":3.5}, + {"label":"K", "x":8.75, "y":3.5}, + {"label":"L", "x":9.75, "y":3.5}, + {"label":":", "x":10.75, "y":3.5}, + {"label":"\"", "x":11.75, "y":3.5}, + {"label":"Enter", "x":12.75, "y":3.5, "w":2.25}, + {"label":"4", "x":15.5, "y":3.5}, + {"label":"5", "x":16.5, "y":3.5}, + {"label":"6", "x":17.5, "y":3.5}, + {"x":18.5, "y":3.5}, + {"label":"Shift", "x":0, "y":4.5, "w":1.25}, + {"x":1.25, "y":4.5}, + {"label":"Z", "x":2.25, "y":4.5}, + {"label":"X", "x":3.25, "y":4.5}, + {"label":"C", "x":4.25, "y":4.5}, + {"label":"V", "x":5.25, "y":4.5}, + {"label":"B", "x":6.25, "y":4.5}, + {"label":"N", "x":7.25, "y":4.5}, + {"label":"M", "x":8.25, "y":4.5}, + {"label":"<", "x":9.25, "y":4.5}, + {"label":">", "x":10.25, "y":4.5}, + {"label":"?", "x":11.25, "y":4.5}, + {"label":"Shift", "x":12.25, "y":4.5, "w":1.75}, + {"label":"1", "x":15.5, "y":4.5}, + {"label":"2", "x":16.5, "y":4.5}, + {"label":"3", "x":17.5, "y":4.5}, + {"label":"Enter", "x":18.5, "y":4.5}, + {"label":"\u2191", "x":14.25, "y":4.75}, + {"label":"Ctrl", "x":0, "y":5.5, "w":1.25}, + {"label":"Win", "x":1.25, "y":5.5}, + {"label":"Alt", "x":2.25, "y":5.5, "w":1.25}, + {"x":3.5, "y":5.5, "w":6.25}, + {"label":"Alt", "x":9.75, "y":5.5}, + {"label":"Menu", "x":10.75, "y":5.5}, + {"label":"Ctrl", "x":11.75, "y":5.5, "w":1.25}, + {"label":"0", "x":16.5, "y":5.5}, + {"label":".", "x":17.5, "y":5.5}, + {"x":18.5, "y":5.5}, + {"label":"\u2190", "x":13.25, "y":5.75}, + {"label":"\u2193", "x":14.25, "y":5.75}, + {"label":"\u2192", "x":15.25, "y":5.75}] + } + } +} + diff --git a/keyboards/kbd19x/kbd19x.c b/keyboards/kbd19x/kbd19x.c new file mode 100644 index 000000000..360345600 --- /dev/null +++ b/keyboards/kbd19x/kbd19x.c @@ -0,0 +1,63 @@ +/* +Copyright 2018 Jeff Shufelt @jshuf + +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 . +*/ + +#include "kbd19x.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + + if (usb_led & (1< @jshuf + +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 . +*/ + +#ifndef KBD19X_H +#define KBD19X_H + +#include "quantum.h" +#include "led.h" + +inline void kbd19x_caps_led_on(void) { DDRB |= (1<<0); PORTB &= ~(1<<0); } +inline void kbd19x_caps_led_off(void) { DDRB &= ~(1<<0); PORTB &= ~(1<<0); } + +inline void kbd19x_sclk_led_on(void) { DDRB |= (1<<1); PORTB &= ~(1<<1); } +inline void kbd19x_sclk_led_off(void) { DDRB &= ~(1<<1); PORTB &= ~(1<<1); } + +inline void kbd19x_nmlk_led_on(void) { DDRB |= (1<<2); PORTB &= ~(1<<2); } +inline void kbd19x_nmlk_led_off(void) { DDRB &= ~(1<<2); PORTB &= ~(1<<2); } + +// readability +#define XXX KC_NO + +/* This is a shortcut to help you visually see your layout. + * + * The first section contains all of the arguments representing the physical + * layout of the board and position of the keys. + * + * The second converts the arguments into a two-dimensional array which + * represents the switch matrix. + */ + +// 2u backspace: XXX, k1e +// split backspace: k1d, k1e + +// 2u numpad +: k2i, XXX +// split numpad +: k2i, k3i + +// 2u numpad enter: k4i, XXX +// split numpad enter: k4i, k5i + +// 2.25u lshift: k40, XXX +// split (1.25u, 1u) lshift: k40, k41 + +// ANSI enter or ISO enter: k3e +// backslash or NUHS: k2e + +// left winkey: k50, k51, k52 +// left WKL: k50, XXX, k52 + +// right winkey: k59, k5a, k5b +// right WKL: k59, XXX, k5b + +#define LAYOUT_all( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0e, k0f, k0g, k0h, k0i, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, k1f, k1g, k1h, k1i, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2e, k2f, k2g, k2h, k2i, \ + k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3e, k3f, k3g, k3h, k3i, \ + k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, k4c, k4e, k4f, k4g, k4h, k4i, \ + k50, k51, k52, k56, k59, k5a, k5b, k5d, k5e, k5f, k5g, k5h, k5i \ +)\ +{\ + {k00, k01, k02, k03, k04, k09, k0a, k0b, k0c, k0f, k0g, k0h, k0i},\ + {k10, k11, k12, k13, k14, k19, k1a, k1b, k1c, k1f, k1g, k1h, k1i},\ + {k20, k21, k22, k23, k24, k29, k2a, k2b, k2c, k2f, k2g, k2h, k2i},\ + {k30, k32, k33, k34, k35, k3a, k3b, k3c, k3e, k3f, k3g, k3h, k3i},\ + {k40, k41, k42, k43, k44, k49, k4a, k4b, k4c, k4f, k4g, k4h, k4i},\ + {k50, k51, k52, k5e, k5f, k59, k5a, k5b, k5d, k56, k5g, k5h, k5i},\ + {k05, k06, k07, k08, k15, k16, k17, k18, k25, k26, k27, k28, k36},\ + {k1d, k1e, k0e, k2e, k4e, k37, k38, k39, k45, k46, k47, k48, XXX},\ +} + +#define LAYOUT_ansi( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0e, k0f, k0g, k0h, k0i, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1e, k1f, k1g, k1h, k1i, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2e, k2f, k2g, k2h, k2i, \ + k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3e, k3f, k3g, k3h, \ + k40, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, k4c, k4e, k4f, k4g, k4h, k4i, \ + k50, k51, k52, k56, k59, k5a, k5b, k5d, k5e, k5f, k5g, k5h \ +)\ +{\ + {k00, k01, k02, k03, k04, k09, k0a, k0b, k0c, k0f, k0g, k0h, k0i},\ + {k10, k11, k12, k13, k14, k19, k1a, k1b, k1c, k1f, k1g, k1h, k1i},\ + {k20, k21, k22, k23, k24, k29, k2a, k2b, k2c, k2f, k2g, k2h, k2i},\ + {k30, k32, k33, k34, k35, k3a, k3b, k3c, k3e, k3f, k3g, k3h, XXX},\ + {k40, XXX, k42, k43, k44, k49, k4a, k4b, k4c, k4f, k4g, k4h, k4i},\ + {k50, k51, k52, k5e, k5f, k59, k5a, k5b, k5d, k56, k5g, k5h, XXX},\ + {k05, k06, k07, k08, k15, k16, k17, k18, k25, k26, k27, k28, k36},\ + {XXX, k1e, k0e, k2e, k4e, k37, k38, k39, k45, k46, k47, k48, XXX},\ +} +#endif diff --git a/keyboards/kbd19x/keymaps/default/config.h b/keyboards/kbd19x/keymaps/default/config.h new file mode 100644 index 000000000..70028a525 --- /dev/null +++ b/keyboards/kbd19x/keymaps/default/config.h @@ -0,0 +1,20 @@ +/* +Copyright 2018 Jeff Shufelt @jshuf + +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 . +*/ + +#pragma once + +// place overrides here diff --git a/keyboards/kbd19x/keymaps/default/keymap.c b/keyboards/kbd19x/keymaps/default/keymap.c new file mode 100644 index 000000000..c80607211 --- /dev/null +++ b/keyboards/kbd19x/keymaps/default/keymap.c @@ -0,0 +1,52 @@ +/* +Copyright 2018 Jeff Shufelt @jshuf + +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 . +*/ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_ansi( /* Base */ + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, BL_STEP, KC_PSCR, KC_SLCK, KC_PAUS, KC_PGDN, \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PPLS, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT \ + ), + [1] = LAYOUT_ansi( /* Func */ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET, _______, _______, _______, _______, \ + _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/kbd19x/keymaps/default/readme.md b/keyboards/kbd19x/keymaps/default/readme.md new file mode 100644 index 000000000..504a3ed02 --- /dev/null +++ b/keyboards/kbd19x/keymaps/default/readme.md @@ -0,0 +1,13 @@ +# Default KBD19x Layout + +This is the default KBD19x layout, consisting of the base layer and the function layer. Backlighting and RGB controls are accessible on the function layer. + +**Base layer** + +![kbd19x default base layer](https://i.imgur.com/XhT980a.png) + +**Function layer** + +![kbd19x default function layer](https://i.imgur.com/3w3PXN2.png) + + diff --git a/keyboards/kbd19x/readme.md b/keyboards/kbd19x/readme.md new file mode 100644 index 000000000..ee4969b00 --- /dev/null +++ b/keyboards/kbd19x/readme.md @@ -0,0 +1,19 @@ +# kbd19x + +![kbd19x](https://i.imgur.com/0hWTEnh.jpg) + +**Layout possibilities for the KBD19x** + +![kbd19x](https://i.imgur.com/pVaR2zY.png) + +The KBD19x is a compact-1800 keyboard kit produced by KBDfans, offering a number of layout options. + +Keyboard Maintainer: [jshuf](https://github.com/jshuf) +Hardware Supported: KBD19x PCB +Hardware Availability: [KBDfans](https://kbdfans.cn) + +Make example for this keyboard (after setting up your build environment): + + make kbd19x:default + +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). diff --git a/keyboards/kbd19x/rules.mk b/keyboards/kbd19x/rules.mk new file mode 100644 index 000000000..8e50962af --- /dev/null +++ b/keyboards/kbd19x/rules.mk @@ -0,0 +1,80 @@ +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = no # USB Nkey Rollover +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) From 1e96346f289ea235fc418ddc45203a599fd00c08 Mon Sep 17 00:00:00 2001 From: Bramver Date: Mon, 29 Oct 2018 18:45:17 +0100 Subject: [PATCH 413/788] Keymap: Added personal Contra layout. (#4235) * Added personal Contra layout. * Update keyboards/contra/keymaps/bramver/rules.mk Co-Authored-By: BramVer * Update keyboards/contra/keymaps/bramver/keymap.c Co-Authored-By: BramVer * Update keyboards/contra/keymaps/bramver/keymap.c Co-Authored-By: BramVer * Reformatted layers to use the layout format. --- keyboards/contra/keymaps/bramver/README.md | 35 ++++++ keyboards/contra/keymaps/bramver/config.h | 9 ++ keyboards/contra/keymaps/bramver/keymap.c | 126 +++++++++++++++++++++ keyboards/contra/keymaps/bramver/rules.mk | 6 + 4 files changed, 176 insertions(+) create mode 100644 keyboards/contra/keymaps/bramver/README.md create mode 100755 keyboards/contra/keymaps/bramver/config.h create mode 100644 keyboards/contra/keymaps/bramver/keymap.c create mode 100755 keyboards/contra/keymaps/bramver/rules.mk diff --git a/keyboards/contra/keymaps/bramver/README.md b/keyboards/contra/keymaps/bramver/README.md new file mode 100644 index 000000000..5327beba7 --- /dev/null +++ b/keyboards/contra/keymaps/bramver/README.md @@ -0,0 +1,35 @@ +# Contra layout + +My current setup consists of a very simple base layer, numbers layer, mouse layer and emoji layer. +Still many options, but time will tell if changes are needed. + +## Keymap + +``` +#define SP_MSE LT(_MOUSE, KC_SPC) + + +BASE layer + { KC_GESC , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , KC_BSPC }, + { KC_TAB , KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_SCLN , KC_ENT }, + { KC_LSFT , KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM , KC_DOT , KC_SLSH , KC_QUOT }, + { KC_LCTL , KC_GRV , KC_LALT , KC_LGUI , MO(1) , SP_MSE , SP_MSE , KC_LEFT , KC_DOWN , KC_UP , KC_RGHT , MO(2) }, + +LOWER layer + { _______ , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_DEL }, + { _______ , KC_F1 , KC_F2 , KC_F3 , KC_LBRC , KC_MINS , KC_EQL , KC_RBRC , KC_F7 , KC_F8 , KC_F9 , _______ }, + { _______ , KC_F4 , KC_F5 , KC_F6 , KC_HOME , KC_BSLS , KC_MPLY , KC_END , KC_F10 , KC_F11 , KC_F12 , _______ }, + { _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ }, + +EMOJI layer + { _______ , X(CLAP) , X(CUM) , X(BNIS) , X(BUTT) , X(CAR) , X(FIRE) , X(REDB) , X(MONY) , X(HNDR) , X(SOS) , _______ }, + { _______ , X(CELE) , X(PRAY) , X(NAIL) , X(OK) , X(THNK) , X(UNAM) , X(HEYE) , X(COOL) , X(EYES) , X(SMIR) , _______ }, + { _______ , X(TRIU) , X(SCRM) , X(VOMI) , X(DTIV) , X(EXPL) , X(HAIR) , X(DANC) , X(STRN) , X(LEFT) , X(RGHT) , _______ }, + { _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ }, + +MOUSE layer + { _______ , KC_WH_L , KC_BTN1 , KC_MS_U , KC_BTN2 , KC_WH_U , KC_WH_U , KC_BTN1 , KC_MS_U , KC_BTN2 , KC_WH_L , _______ }, + { _______ , KC_WH_R , KC_MS_L , KC_MS_D , KC_MS_R , KC_WH_D , KC_WH_D , KC_MS_L , KC_MS_D , KC_MS_R , KC_WH_R , _______ }, + { _______ , KC_VOLD , KC_VOLU , KC_MPRV , KC_MNXT , KC_MPLY , KC_MPLY , KC_MPRV , KC_MNXT , KC_VOLD , KC_VOLU , _______ }, + { _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ }, +``` \ No newline at end of file diff --git a/keyboards/contra/keymaps/bramver/config.h b/keyboards/contra/keymaps/bramver/config.h new file mode 100755 index 000000000..de2a9b0ee --- /dev/null +++ b/keyboards/contra/keymaps/bramver/config.h @@ -0,0 +1,9 @@ +#pragma once + +#define MOUSEKEY_DELAY 0 +#define MOUSEKEY_INTERVAL 16 +#define MOUSEKEY_MAX_SPEED 7 +#define MOUSEKEY_TIME_TO_MAX 60 +#define MOUSEKEY_WHEEL_MAX_SPEED 8 +#define MOUSEKEY_WHEEL_TIME_TO_MAX 40 +#define MOUSEKEY_WHEEL_DELAY 0 diff --git a/keyboards/contra/keymaps/bramver/keymap.c b/keyboards/contra/keymaps/bramver/keymap.c new file mode 100644 index 000000000..8ccaf686b --- /dev/null +++ b/keyboards/contra/keymaps/bramver/keymap.c @@ -0,0 +1,126 @@ +/* Copyright 2018 darm + * + * 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 . + */ +#include QMK_KEYBOARD_H + +enum emoji_map { + UNAM, // unamused 😒 + HEYE, // smiling face with heart shaped eyes 😍 + OK, // ok hand sign 👌 + SMIR, // smirk 😏 + PRAY, // pray 🙏 + CELE, // celebration 🙌 + COOL, // smile with sunglasses 😎 + EYES, // eyes + THNK, // BIG THONK + NAIL, // Nailcare + SOS, // Vuile sos + REDB, // Red B + HNDR, // 100 + MONY, + FIRE, + CAR, + BUTT, + BNIS, + CUM, + CLAP, + TRIU, // Fart from nose + SCRM, + VOMI, + DTIV, // Detective + EXPL, // Brainsplosion + HAIR, // Haircut + DANC, // Salsa dancer + STRN, // Stronk + LEFT, // Point Left + RGHT, // Point Right +}; + +const uint32_t PROGMEM unicode_map[] = { + [UNAM] = 0x1F612, + [HEYE] = 0x1f60d, + [OK] = 0x1F44C, + [SMIR] = 0x1F60F, + [PRAY] = 0x1F64F, + [CELE] = 0x1F64C, + [COOL] = 0x1F60E, + [EYES] = 0x1F440, + [THNK] = 0x1F914, + [NAIL] = 0x1F485, + [SOS] = 0x1F198, + [REDB] = 0x1F171, + [HNDR] = 0x1F4AF, + [MONY] = 0x1F480, + [FIRE] = 0x1F525, + [CAR] = 0x1F697, + [BUTT] = 0x1F351, + [BNIS] = 0x1F346, + [CUM] = 0x1F4A6, + [CLAP] = 0x1F44F, + [TRIU] = 0x1F624, + [SCRM] = 0x1F631, + [VOMI] = 0x1F92E, + [DTIV] = 0x1F575, + [EXPL] = 0x1F92F, + [HAIR] = 0x2640, + [DANC] = 0x1F483, + [STRN] = 0x1F4AA, + [LEFT] = 0x1F448, + [RGHT] = 0x1F449, +}; + +// Layer shorthand +#define _BASE 0 +#define _LOWER 1 +#define _EMOJI 2 +#define _MOUSE 3 + +#define SP_MSE LT(_MOUSE, KC_SPC) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_BASE] = LAYOUT_ortho_4x12( + KC_GESC , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , KC_BSPC , + KC_TAB , KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_SCLN , KC_ENT , + KC_LSFT , KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM , KC_DOT , KC_SLSH , KC_QUOT , + KC_LCTL , KC_GRV , KC_LALT , KC_LGUI , MO(1) , SP_MSE , SP_MSE , KC_LEFT , KC_DOWN , KC_UP , KC_RGHT , MO(2) + ), + + [_LOWER] = LAYOUT_ortho_4x12( + _______ , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_DEL , + _______ , KC_F1 , KC_F2 , KC_F3 , KC_LBRC , KC_MINS , KC_EQL , KC_RBRC , KC_F7 , KC_F8 , KC_F9 , _______ , + _______ , KC_F4 , KC_F5 , KC_F6 , KC_HOME , KC_BSLS , KC_MPLY , KC_END , KC_F10 , KC_F11 , KC_F12 , _______ , + _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ + ), + + [_EMOJI] = LAYOUT_ortho_4x12( + _______ , X(CLAP) , X(CUM) , X(BNIS) , X(BUTT) , X(CAR) , X(FIRE) , X(REDB) , X(MONY) , X(HNDR) , X(SOS) , _______ , + _______ , X(CELE) , X(PRAY) , X(NAIL) , X(OK) , X(THNK) , X(UNAM) , X(HEYE) , X(COOL) , X(EYES) , X(SMIR) , _______ , + _______ , X(TRIU) , X(SCRM) , X(VOMI) , X(DTIV) , X(EXPL) , X(HAIR) , X(DANC) , X(STRN) , X(LEFT) , X(RGHT) , _______ , + _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ + ), + + [_MOUSE] = LAYOUT_ortho_4x12( + _______ , KC_WH_L , KC_BTN1 , KC_MS_U , KC_BTN2 , KC_WH_U , KC_WH_U , KC_BTN1 , KC_MS_U , KC_BTN2 , KC_WH_L , _______ , + _______ , KC_WH_R , KC_MS_L , KC_MS_D , KC_MS_R , KC_WH_D , KC_WH_D , KC_MS_L , KC_MS_D , KC_MS_R , KC_WH_R , _______ , + _______ , KC_VOLD , KC_VOLU , KC_MPRV , KC_MNXT , KC_MPLY , KC_MPLY , KC_MPRV , KC_MNXT , KC_VOLD , KC_VOLU , _______ , + _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ + ) + +}; + +void matrix_init_user(void) { + set_unicode_input_mode(UC_LNX); +} diff --git a/keyboards/contra/keymaps/bramver/rules.mk b/keyboards/contra/keymaps/bramver/rules.mk new file mode 100755 index 000000000..925b1c2b2 --- /dev/null +++ b/keyboards/contra/keymaps/bramver/rules.mk @@ -0,0 +1,6 @@ +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +NKRO_ENABLE = yes # USB Nkey Rollover +UNICODEMAP_ENABLE = yes # Unicode +BOOTLOADER = atmel-dfu + From 1fa6c1d818add2c72381639a836180af5aa86738 Mon Sep 17 00:00:00 2001 From: Daniel Shields Date: Mon, 29 Oct 2018 20:48:24 +0000 Subject: [PATCH 414/788] Make linux_install.sh work with openSUSE Leap 15.0 (#4218) --- util/linux_install.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/util/linux_install.sh b/util/linux_install.sh index 2c6cba53d..d3b9328d7 100755 --- a/util/linux_install.sh +++ b/util/linux_install.sh @@ -96,9 +96,13 @@ elif grep ID /etc/os-release | grep -q gentoo; then fi elif grep ID /etc/os-release | grep -qE "opensuse|tumbleweed"; then + CROSS_AVR_GCC=cross-avr-gcc8 + if grep ID /etc/os-release | grep -q "15.0"; then + CROSS_AVR_GCC=cross-avr-gcc7 + fi sudo zypper install \ avr-libc \ - cross-avr-gcc8 \ + $CROSS_AVR_GCC \ cross-avr-binutils \ cross-arm-none-newlib-devel \ cross-arm-binutils cross-arm-none-newlib-devel \ From 34f102de7df093525ca310e265a3406e831bf4c6 Mon Sep 17 00:00:00 2001 From: Michael Pio Date: Tue, 30 Oct 2018 13:00:40 +0800 Subject: [PATCH 415/788] Keyboard: Vinta (#4283) * added initial config files for vinta * added readme * changed product id and device ver * fixed keymap illustration * updated rules.mk to enable more commands * removed a bunch of pre-code text; changed some grammar woopsies * removed bootmagic lite * updated developer's note * updated readme.md --- .../vinta/boards/GENERIC_STM32_F042X6/board.c | 101 ++ .../vinta/boards/GENERIC_STM32_F042X6/board.h | 896 ++++++++++++++++++ .../boards/GENERIC_STM32_F042X6/board.mk | 5 + keyboards/vinta/bootloader_defs.h | 7 + keyboards/vinta/chconf.h | 521 ++++++++++ keyboards/vinta/config.h | 70 ++ keyboards/vinta/halconf.h | 350 +++++++ keyboards/vinta/keymaps/default/keymap.c | 51 + keyboards/vinta/mcuconf.h | 168 ++++ keyboards/vinta/readme.md | 22 + keyboards/vinta/rules.mk | 47 + keyboards/vinta/vinta.c | 18 + keyboards/vinta/vinta.h | 25 + 13 files changed, 2281 insertions(+) create mode 100644 keyboards/vinta/boards/GENERIC_STM32_F042X6/board.c create mode 100644 keyboards/vinta/boards/GENERIC_STM32_F042X6/board.h create mode 100644 keyboards/vinta/boards/GENERIC_STM32_F042X6/board.mk create mode 100644 keyboards/vinta/bootloader_defs.h create mode 100644 keyboards/vinta/chconf.h create mode 100644 keyboards/vinta/config.h create mode 100644 keyboards/vinta/halconf.h create mode 100644 keyboards/vinta/keymaps/default/keymap.c create mode 100644 keyboards/vinta/mcuconf.h create mode 100644 keyboards/vinta/readme.md create mode 100644 keyboards/vinta/rules.mk create mode 100644 keyboards/vinta/vinta.c create mode 100644 keyboards/vinta/vinta.h diff --git a/keyboards/vinta/boards/GENERIC_STM32_F042X6/board.c b/keyboards/vinta/boards/GENERIC_STM32_F042X6/board.c new file mode 100644 index 000000000..19adfb933 --- /dev/null +++ b/keyboards/vinta/boards/GENERIC_STM32_F042X6/board.c @@ -0,0 +1,101 @@ +/* + ChibiOS - Copyright (C) 2006..2016 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. +*/ + +#include "hal.h" + +#if HAL_USE_PAL || defined(__DOXYGEN__) +/** + * @brief PAL setup. + * @details Digital I/O ports static configuration as defined in @p board.h. + * This variable is used by the HAL when initializing the PAL driver. + */ +const PALConfig pal_default_config = { +#if STM32_HAS_GPIOA + {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, + VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, +#endif +#if STM32_HAS_GPIOB + {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, + VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, +#endif +#if STM32_HAS_GPIOC + {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, + VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, +#endif +#if STM32_HAS_GPIOD + {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, + VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, +#endif +#if STM32_HAS_GPIOE + {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, + VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, +#endif +#if STM32_HAS_GPIOF + {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, + VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH}, +#endif +#if STM32_HAS_GPIOG + {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, + VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH}, +#endif +#if STM32_HAS_GPIOH + {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, + VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH}, +#endif +#if STM32_HAS_GPIOI + {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, + VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH} +#endif +}; +#endif + +void enter_bootloader_mode_if_requested(void); + +/** + * @brief Early initialization code. + * @details This initialization must be performed just after stack setup + * and before any other initialization. + */ +void __early_init(void) { + enter_bootloader_mode_if_requested(); + stm32_clock_init(); +} + +#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) +/** + * @brief MMC_SPI card detection. + */ +bool mmc_lld_is_card_inserted(MMCDriver *mmcp) { + + (void)mmcp; + /* TODO: Fill the implementation.*/ + return true; +} + +/** + * @brief MMC_SPI card write protection detection. + */ +bool mmc_lld_is_write_protected(MMCDriver *mmcp) { + + (void)mmcp; + /* TODO: Fill the implementation.*/ + return false; +} +#endif + +/** + * @brief Board-specific initialization code. + * @todo Add your board-specific code, if any. + */ +void boardInit(void) { +} diff --git a/keyboards/vinta/boards/GENERIC_STM32_F042X6/board.h b/keyboards/vinta/boards/GENERIC_STM32_F042X6/board.h new file mode 100644 index 000000000..241d566af --- /dev/null +++ b/keyboards/vinta/boards/GENERIC_STM32_F042X6/board.h @@ -0,0 +1,896 @@ +/* + ChibiOS - Copyright (C) 2006..2016 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 _BOARD_H +#define _BOARD_H + +/* + * Setup for STMicroelectronics STM32 Nucleo32-F042K6 board. + */ + +/* + * Board identifier. + */ +#define BOARD_GENERIC_STM32_F042X6 +#define BOARD_NAME "Vinta PCB" + +/* + * Board oscillators-related settings. + * NOTE: LSE not fitted. + * NOTE: HSE not fitted. + */ +#if !defined(STM32_LSECLK) +#define STM32_LSECLK 0U +#endif + +#define STM32_LSEDRV (3U << 3U) + +#if !defined(STM32_HSECLK) +#define STM32_HSECLK 0U +#endif + +/* + * MCU type as defined in the ST header. + */ +#define STM32F042x6 + +/* + * IO pins assignments. + */ +#define GPIOA_PIN0 0U +#define GPIOA_PIN1 1U +#define GPIOA_PIN2 2U +#define GPIOA_PIN3 3U +#define GPIOA_PIN4 4U +#define GPIOA_PIN5 5U +#define GPIOA_PIN6 6U +#define GPIOA_PIN7 7U +#define GPIOA_PIN8 8U +#define GPIOA_PIN9 9U +#define GPIOA_PIN10 10U +#define GPIOA_PIN11 11U +#define GPIOA_PIN12 12U +#define GPIOA_PIN13 13U +#define GPIOA_PIN14 14U +#define GPIOA_PIN15 15U + +#define GPIOB_PIN0 0U +#define GPIOB_PIN1 1U +#define GPIOB_PIN2 2U +#define GPIOB_PIN3 3U +#define GPIOB_PIN4 4U +#define GPIOB_PIN5 5U +#define GPIOB_PIN6 6U +#define GPIOB_PIN7 7U +#define GPIOB_PIN8 8U +#define GPIOB_PIN9 9U +#define GPIOB_PIN10 10U +#define GPIOB_PIN11 11U +#define GPIOB_PIN12 12U +#define GPIOB_PIN13 13U +#define GPIOB_PIN14 14U +#define GPIOB_PIN15 15U + +#define GPIOC_PIN0 0U +#define GPIOC_PIN1 1U +#define GPIOC_PIN2 2U +#define GPIOC_PIN3 3U +#define GPIOC_PIN4 4U +#define GPIOC_PIN5 5U +#define GPIOC_PIN6 6U +#define GPIOC_PIN7 7U +#define GPIOC_PIN8 8U +#define GPIOC_PIN9 9U +#define GPIOC_PIN10 10U +#define GPIOC_PIN11 11U +#define GPIOC_PIN12 12U +#define GPIOC_PIN13 13U +#define GPIOC_PIN14 14U +#define GPIOC_PIN15 15U + +#define GPIOD_PIN0 0U +#define GPIOD_PIN1 1U +#define GPIOD_PIN2 2U +#define GPIOD_PIN3 3U +#define GPIOD_PIN4 4U +#define GPIOD_PIN5 5U +#define GPIOD_PIN6 6U +#define GPIOD_PIN7 7U +#define GPIOD_PIN8 8U +#define GPIOD_PIN9 9U +#define GPIOD_PIN10 10U +#define GPIOD_PIN11 11U +#define GPIOD_PIN12 12U +#define GPIOD_PIN13 13U +#define GPIOD_PIN14 14U +#define GPIOD_PIN15 15U + +#define GPIOE_PIN0 0U +#define GPIOE_PIN1 1U +#define GPIOE_PIN2 2U +#define GPIOE_PIN3 3U +#define GPIOE_PIN4 4U +#define GPIOE_PIN5 5U +#define GPIOE_PIN6 6U +#define GPIOE_PIN7 7U +#define GPIOE_PIN8 8U +#define GPIOE_PIN9 9U +#define GPIOE_PIN10 10U +#define GPIOE_PIN11 11U +#define GPIOE_PIN12 12U +#define GPIOE_PIN13 13U +#define GPIOE_PIN14 14U +#define GPIOE_PIN15 15U + +#define GPIOF_PIN0 0U +#define GPIOF_PIN1 1U +#define GPIOF_PIN2 2U +#define GPIOF_PIN3 3U +#define GPIOF_PIN4 4U +#define GPIOF_PIN5 5U +#define GPIOF_PIN6 6U +#define GPIOF_PIN7 7U +#define GPIOF_PIN8 8U +#define GPIOF_PIN9 9U +#define GPIOF_PIN10 10U +#define GPIOF_PIN11 11U +#define GPIOF_PIN12 12U +#define GPIOF_PIN13 13U +#define GPIOF_PIN14 14U +#define GPIOF_PIN15 15U + +/* + * IO lines assignments. + */ + +#define LINE_BOOT0 PAL_LINE(GPIOB, 8U) +#define LINE_SWCLK PAL_LINE(GPIOA, 14U) +#define LINE_SWDIO PAL_LINE(GPIOA, 13U) + +/* + * I/O ports initial setup, this configuration is established soon after reset + * in the initialization code. + * Please refer to the STM32 Reference Manual for details. + */ +#define PIN_MODE_INPUT(n) (0U << ((n) * 2U)) +#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U)) +#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U)) +#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U)) +#define PIN_ODR_LOW(n) (0U << (n)) +#define PIN_ODR_HIGH(n) (1U << (n)) +#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) +#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) +#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U)) +#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U)) +#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U)) +#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U)) +#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U)) +#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U)) +#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U)) +#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U)) + +/* + * GPIOA setup: + * + * PA0 - COL5 + * PA1 - COL4 + * PA2 - COL3 + * PA3 - COL2 + * PA4 - COL1 + * PA5 - COL0 + * PA6 - ROW4 + * PA7 - ROW3 + * PA8 - NC + * PA9 - ROW1 + * PA10 - ROW0 + * PA11 - USB_DM + * PA12 - USB_DP + * PA13 - COL15/SWDIO (for now, COL15) + * PA14 - COL14/SWCLK (for now, COL14) + * PA15 - COL13 + */ +#define VAL_GPIOA_MODER (PIN_MODE_INPUT(GPIOA_PIN0) | \ + PIN_MODE_INPUT(GPIOA_PIN1) | \ + PIN_MODE_INPUT(GPIOA_PIN2) | \ + PIN_MODE_INPUT(GPIOA_PIN3) | \ + PIN_MODE_INPUT(GPIOA_PIN4) | \ + PIN_MODE_INPUT(GPIOA_PIN5) | \ + PIN_MODE_INPUT(GPIOA_PIN6) | \ + PIN_MODE_INPUT(GPIOA_PIN7) | \ + PIN_MODE_INPUT(GPIOA_PIN8) | \ + PIN_MODE_INPUT(GPIOA_PIN9) | \ + PIN_MODE_INPUT(GPIOA_PIN10) | \ + PIN_MODE_INPUT(GPIOA_PIN11) | \ + PIN_MODE_INPUT(GPIOA_PIN12) | \ + PIN_MODE_INPUT(GPIOA_PIN13) | \ + PIN_MODE_INPUT(GPIOA_PIN14) | \ + PIN_MODE_INPUT(GPIOA_PIN15)) +#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN15)) +#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOA_PIN0) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN1) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN10) | \ + PIN_OSPEED_HIGH(GPIOA_PIN11) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN12) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN13) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN14) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN15)) +#define VAL_GPIOA_PUPDR (PIN_PUPDR_PULLUP(GPIOA_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN10) | \ + PIN_PUPDR_FLOATING(GPIOA_PIN11) | \ + PIN_PUPDR_FLOATING(GPIOA_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN15)) +#define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_PIN0) | \ + PIN_ODR_HIGH(GPIOA_PIN1) | \ + PIN_ODR_HIGH(GPIOA_PIN2) | \ + PIN_ODR_HIGH(GPIOA_PIN3) | \ + PIN_ODR_HIGH(GPIOA_PIN4) | \ + PIN_ODR_HIGH(GPIOA_PIN5) | \ + PIN_ODR_HIGH(GPIOA_PIN6) | \ + PIN_ODR_HIGH(GPIOA_PIN7) | \ + PIN_ODR_HIGH(GPIOA_PIN8) | \ + PIN_ODR_HIGH(GPIOA_PIN9) | \ + PIN_ODR_HIGH(GPIOA_PIN10) | \ + PIN_ODR_HIGH(GPIOA_PIN11) | \ + PIN_ODR_HIGH(GPIOA_PIN12) | \ + PIN_ODR_HIGH(GPIOA_PIN13) | \ + PIN_ODR_HIGH(GPIOA_PIN14) | \ + PIN_ODR_HIGH(GPIOA_PIN15)) +#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_PIN0, 0U) | \ + PIN_AFIO_AF(GPIOA_PIN1, 0U) | \ + PIN_AFIO_AF(GPIOA_PIN2, 0U) | \ + PIN_AFIO_AF(GPIOA_PIN3, 0U) | \ + PIN_AFIO_AF(GPIOA_PIN4, 0U) | \ + PIN_AFIO_AF(GPIOA_PIN5, 0U) | \ + PIN_AFIO_AF(GPIOA_PIN6, 0U) | \ + PIN_AFIO_AF(GPIOA_PIN7, 0U)) +#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_PIN8, 0U) | \ + PIN_AFIO_AF(GPIOA_PIN9, 0U) | \ + PIN_AFIO_AF(GPIOA_PIN10, 0U) | \ + PIN_AFIO_AF(GPIOA_PIN11, 0U) | \ + PIN_AFIO_AF(GPIOA_PIN12, 0U) | \ + PIN_AFIO_AF(GPIOA_PIN13, 0U) | \ + PIN_AFIO_AF(GPIOA_PIN14, 0U) | \ + PIN_AFIO_AF(GPIOA_PIN15, 0U)) + +/* + * GPIOB setup: + * + * PB0 - ROW2 + * PB1 - RGB_D + * PB2 - PIN2 (input pullup). + * PB3 - COL12 + * PB4 - COL11 + * PB5 - COL10 + * PB6 - COL9 + * PB7 - COL8 + * PB8 - BOOT0 (set as output for STM32F042) + * PB9 - PIN9 (input pullup). + * PB10 - PIN10 (input pullup). + * PB11 - PIN11 (input pullup). + * PB12 - PIN12 (input pullup). + * PB13 - PIN13 (input pullup). + * PB14 - PIN14 (input pullup). + * PB15 - PIN15 (input pullup). + */ +#define VAL_GPIOB_MODER (PIN_MODE_INPUT(GPIOB_PIN0) | \ + PIN_MODE_OUTPUT(GPIOB_PIN1) | \ + PIN_MODE_INPUT(GPIOB_PIN2) | \ + PIN_MODE_INPUT(GPIOB_PIN3) | \ + PIN_MODE_INPUT(GPIOB_PIN4) | \ + PIN_MODE_INPUT(GPIOB_PIN5) | \ + PIN_MODE_INPUT(GPIOB_PIN6) | \ + PIN_MODE_INPUT(GPIOB_PIN7) | \ + PIN_MODE_OUTPUT(GPIOB_PIN8) | \ + PIN_MODE_INPUT(GPIOB_PIN9) | \ + PIN_MODE_INPUT(GPIOB_PIN10) | \ + PIN_MODE_INPUT(GPIOB_PIN11) | \ + PIN_MODE_INPUT(GPIOB_PIN12) | \ + PIN_MODE_INPUT(GPIOB_PIN13) | \ + PIN_MODE_INPUT(GPIOB_PIN14) | \ + PIN_MODE_INPUT(GPIOB_PIN15)) +#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN15)) +#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOB_PIN0) | \ + PIN_OSPEED_HIGH(GPIOB_PIN1) | \ + PIN_OSPEED_HIGH(GPIOB_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN8) | \ + PIN_OSPEED_HIGH(GPIOB_PIN9) | \ + PIN_OSPEED_HIGH(GPIOB_PIN10) | \ + PIN_OSPEED_HIGH(GPIOB_PIN11) | \ + PIN_OSPEED_HIGH(GPIOB_PIN12) | \ + PIN_OSPEED_HIGH(GPIOB_PIN13) | \ + PIN_OSPEED_HIGH(GPIOB_PIN14) | \ + PIN_OSPEED_HIGH(GPIOB_PIN15)) +#define VAL_GPIOB_PUPDR (PIN_PUPDR_PULLUP(GPIOB_PIN0) | \ + PIN_PUPDR_FLOATING(GPIOB_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN7) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN15)) +#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_PIN0) | \ + PIN_ODR_HIGH(GPIOB_PIN1) | \ + PIN_ODR_HIGH(GPIOB_PIN2) | \ + PIN_ODR_HIGH(GPIOB_PIN3) | \ + PIN_ODR_HIGH(GPIOB_PIN4) | \ + PIN_ODR_HIGH(GPIOB_PIN5) | \ + PIN_ODR_HIGH(GPIOB_PIN6) | \ + PIN_ODR_HIGH(GPIOB_PIN7) | \ + PIN_ODR_HIGH(GPIOB_PIN8) | \ + PIN_ODR_HIGH(GPIOB_PIN9) | \ + PIN_ODR_HIGH(GPIOB_PIN10) | \ + PIN_ODR_HIGH(GPIOB_PIN11) | \ + PIN_ODR_HIGH(GPIOB_PIN12) | \ + PIN_ODR_HIGH(GPIOB_PIN13) | \ + PIN_ODR_HIGH(GPIOB_PIN14) | \ + PIN_ODR_HIGH(GPIOB_PIN15)) +#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN1, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN2, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN3, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN4, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN5, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN6, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN7, 0U)) +#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN9, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN10, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN11, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN12, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN13, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN14, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN15, 0U)) + +/* + * GPIOC setup: + * + * PC0 - PIN0 (input pullup). + * PC1 - PIN1 (input pullup). + * PC2 - PIN2 (input pullup). + * PC3 - PIN3 (input pullup). + * PC4 - PIN4 (input pullup). + * PC5 - PIN5 (input pullup). + * PC6 - PIN6 (input pullup). + * PC7 - PIN7 (input pullup). + * PC8 - PIN8 (input pullup). + * PC9 - PIN9 (input pullup). + * PC10 - PIN10 (input pullup). + * PC11 - PIN11 (input pullup). + * PC12 - PIN12 (input pullup). + * PC13 - PIN13 (input pullup). + * PC14 - PIN14 (input pullup). + * PC15 - PIN15 (input pullup). + */ +#define VAL_GPIOC_MODER (PIN_MODE_INPUT(GPIOC_PIN0) | \ + PIN_MODE_INPUT(GPIOC_PIN1) | \ + PIN_MODE_INPUT(GPIOC_PIN2) | \ + PIN_MODE_INPUT(GPIOC_PIN3) | \ + PIN_MODE_INPUT(GPIOC_PIN4) | \ + PIN_MODE_INPUT(GPIOC_PIN5) | \ + PIN_MODE_INPUT(GPIOC_PIN6) | \ + PIN_MODE_INPUT(GPIOC_PIN7) | \ + PIN_MODE_INPUT(GPIOC_PIN8) | \ + PIN_MODE_INPUT(GPIOC_PIN9) | \ + PIN_MODE_INPUT(GPIOC_PIN10) | \ + PIN_MODE_INPUT(GPIOC_PIN11) | \ + PIN_MODE_INPUT(GPIOC_PIN12) | \ + PIN_MODE_INPUT(GPIOC_PIN13) | \ + PIN_MODE_INPUT(GPIOC_PIN14) | \ + PIN_MODE_INPUT(GPIOC_PIN15)) +#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN15)) +#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_HIGH(GPIOC_PIN0) | \ + PIN_OSPEED_HIGH(GPIOC_PIN1) | \ + PIN_OSPEED_HIGH(GPIOC_PIN2) | \ + PIN_OSPEED_HIGH(GPIOC_PIN3) | \ + PIN_OSPEED_HIGH(GPIOC_PIN4) | \ + PIN_OSPEED_HIGH(GPIOC_PIN5) | \ + PIN_OSPEED_HIGH(GPIOC_PIN6) | \ + PIN_OSPEED_HIGH(GPIOC_PIN7) | \ + PIN_OSPEED_HIGH(GPIOC_PIN8) | \ + PIN_OSPEED_HIGH(GPIOC_PIN9) | \ + PIN_OSPEED_HIGH(GPIOC_PIN10) | \ + PIN_OSPEED_HIGH(GPIOC_PIN11) | \ + PIN_OSPEED_HIGH(GPIOC_PIN12) | \ + PIN_OSPEED_HIGH(GPIOC_PIN13) | \ + PIN_OSPEED_HIGH(GPIOC_PIN14) | \ + PIN_OSPEED_HIGH(GPIOC_PIN15)) +#define VAL_GPIOC_PUPDR (PIN_PUPDR_PULLUP(GPIOC_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN15)) +#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_PIN0) | \ + PIN_ODR_HIGH(GPIOC_PIN1) | \ + PIN_ODR_HIGH(GPIOC_PIN2) | \ + PIN_ODR_HIGH(GPIOC_PIN3) | \ + PIN_ODR_HIGH(GPIOC_PIN4) | \ + PIN_ODR_HIGH(GPIOC_PIN5) | \ + PIN_ODR_HIGH(GPIOC_PIN6) | \ + PIN_ODR_HIGH(GPIOC_PIN7) | \ + PIN_ODR_HIGH(GPIOC_PIN8) | \ + PIN_ODR_HIGH(GPIOC_PIN9) | \ + PIN_ODR_HIGH(GPIOC_PIN10) | \ + PIN_ODR_HIGH(GPIOC_PIN11) | \ + PIN_ODR_HIGH(GPIOC_PIN12) | \ + PIN_ODR_HIGH(GPIOC_PIN13) | \ + PIN_ODR_HIGH(GPIOC_PIN14) | \ + PIN_ODR_HIGH(GPIOC_PIN15)) +#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_PIN0, 0U) | \ + PIN_AFIO_AF(GPIOC_PIN1, 0U) | \ + PIN_AFIO_AF(GPIOC_PIN2, 0U) | \ + PIN_AFIO_AF(GPIOC_PIN3, 0U) | \ + PIN_AFIO_AF(GPIOC_PIN4, 0U) | \ + PIN_AFIO_AF(GPIOC_PIN5, 0U) | \ + PIN_AFIO_AF(GPIOC_PIN6, 0U) | \ + PIN_AFIO_AF(GPIOC_PIN7, 0U)) +#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_PIN8, 0U) | \ + PIN_AFIO_AF(GPIOC_PIN9, 0U) | \ + PIN_AFIO_AF(GPIOC_PIN10, 0U) | \ + PIN_AFIO_AF(GPIOC_PIN11, 0U) | \ + PIN_AFIO_AF(GPIOC_PIN12, 0U) | \ + PIN_AFIO_AF(GPIOC_PIN13, 0U) | \ + PIN_AFIO_AF(GPIOC_PIN14, 0U) | \ + PIN_AFIO_AF(GPIOC_PIN15, 0U)) + +/* + * GPIOD setup: + * + * PD0 - PIN0 (input pullup). + * PD1 - PIN1 (input pullup). + * PD2 - PIN2 (input pullup). + * PD3 - PIN3 (input pullup). + * PD4 - PIN4 (input pullup). + * PD5 - PIN5 (input pullup). + * PD6 - PIN6 (input pullup). + * PD7 - PIN7 (input pullup). + * PD8 - PIN8 (input pullup). + * PD9 - PIN9 (input pullup). + * PD10 - PIN10 (input pullup). + * PD11 - PIN11 (input pullup). + * PD12 - PIN12 (input pullup). + * PD13 - PIN13 (input pullup). + * PD14 - PIN14 (input pullup). + * PD15 - PIN15 (input pullup). + */ +#define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_PIN0) | \ + PIN_MODE_INPUT(GPIOD_PIN1) | \ + PIN_MODE_INPUT(GPIOD_PIN2) | \ + PIN_MODE_INPUT(GPIOD_PIN3) | \ + PIN_MODE_INPUT(GPIOD_PIN4) | \ + PIN_MODE_INPUT(GPIOD_PIN5) | \ + PIN_MODE_INPUT(GPIOD_PIN6) | \ + PIN_MODE_INPUT(GPIOD_PIN7) | \ + PIN_MODE_INPUT(GPIOD_PIN8) | \ + PIN_MODE_INPUT(GPIOD_PIN9) | \ + PIN_MODE_INPUT(GPIOD_PIN10) | \ + PIN_MODE_INPUT(GPIOD_PIN11) | \ + PIN_MODE_INPUT(GPIOD_PIN12) | \ + PIN_MODE_INPUT(GPIOD_PIN13) | \ + PIN_MODE_INPUT(GPIOD_PIN14) | \ + PIN_MODE_INPUT(GPIOD_PIN15)) +#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN15)) +#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_HIGH(GPIOD_PIN0) | \ + PIN_OSPEED_HIGH(GPIOD_PIN1) | \ + PIN_OSPEED_HIGH(GPIOD_PIN2) | \ + PIN_OSPEED_HIGH(GPIOD_PIN3) | \ + PIN_OSPEED_HIGH(GPIOD_PIN4) | \ + PIN_OSPEED_HIGH(GPIOD_PIN5) | \ + PIN_OSPEED_HIGH(GPIOD_PIN6) | \ + PIN_OSPEED_HIGH(GPIOD_PIN7) | \ + PIN_OSPEED_HIGH(GPIOD_PIN8) | \ + PIN_OSPEED_HIGH(GPIOD_PIN9) | \ + PIN_OSPEED_HIGH(GPIOD_PIN10) | \ + PIN_OSPEED_HIGH(GPIOD_PIN11) | \ + PIN_OSPEED_HIGH(GPIOD_PIN12) | \ + PIN_OSPEED_HIGH(GPIOD_PIN13) | \ + PIN_OSPEED_HIGH(GPIOD_PIN14) | \ + PIN_OSPEED_HIGH(GPIOD_PIN15)) +#define VAL_GPIOD_PUPDR (PIN_PUPDR_PULLUP(GPIOD_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN15)) +#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \ + PIN_ODR_HIGH(GPIOD_PIN1) | \ + PIN_ODR_HIGH(GPIOD_PIN2) | \ + PIN_ODR_HIGH(GPIOD_PIN3) | \ + PIN_ODR_HIGH(GPIOD_PIN4) | \ + PIN_ODR_HIGH(GPIOD_PIN5) | \ + PIN_ODR_HIGH(GPIOD_PIN6) | \ + PIN_ODR_HIGH(GPIOD_PIN7) | \ + PIN_ODR_HIGH(GPIOD_PIN8) | \ + PIN_ODR_HIGH(GPIOD_PIN9) | \ + PIN_ODR_HIGH(GPIOD_PIN10) | \ + PIN_ODR_HIGH(GPIOD_PIN11) | \ + PIN_ODR_HIGH(GPIOD_PIN12) | \ + PIN_ODR_HIGH(GPIOD_PIN13) | \ + PIN_ODR_HIGH(GPIOD_PIN14) | \ + PIN_ODR_HIGH(GPIOD_PIN15)) +#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN1, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN2, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN3, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN4, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN5, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN6, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN7, 0U)) +#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN9, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN10, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN11, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN12, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN13, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN14, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN15, 0U)) + +/* + * GPIOE setup: + * + * PE0 - PIN0 (input pullup). + * PE1 - PIN1 (input pullup). + * PE2 - PIN2 (input pullup). + * PE3 - PIN3 (input pullup). + * PE4 - PIN4 (input pullup). + * PE5 - PIN5 (input pullup). + * PE6 - PIN6 (input pullup). + * PE7 - PIN7 (input pullup). + * PE8 - PIN8 (input pullup). + * PE9 - PIN9 (input pullup). + * PE10 - PIN10 (input pullup). + * PE11 - PIN11 (input pullup). + * PE12 - PIN12 (input pullup). + * PE13 - PIN13 (input pullup). + * PE14 - PIN14 (input pullup). + * PE15 - PIN15 (input pullup). + */ +#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_PIN0) | \ + PIN_MODE_INPUT(GPIOE_PIN1) | \ + PIN_MODE_INPUT(GPIOE_PIN2) | \ + PIN_MODE_INPUT(GPIOE_PIN3) | \ + PIN_MODE_INPUT(GPIOE_PIN4) | \ + PIN_MODE_INPUT(GPIOE_PIN5) | \ + PIN_MODE_INPUT(GPIOE_PIN6) | \ + PIN_MODE_INPUT(GPIOE_PIN7) | \ + PIN_MODE_INPUT(GPIOE_PIN8) | \ + PIN_MODE_INPUT(GPIOE_PIN9) | \ + PIN_MODE_INPUT(GPIOE_PIN10) | \ + PIN_MODE_INPUT(GPIOE_PIN11) | \ + PIN_MODE_INPUT(GPIOE_PIN12) | \ + PIN_MODE_INPUT(GPIOE_PIN13) | \ + PIN_MODE_INPUT(GPIOE_PIN14) | \ + PIN_MODE_INPUT(GPIOE_PIN15)) +#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN15)) +#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_HIGH(GPIOE_PIN0) | \ + PIN_OSPEED_HIGH(GPIOE_PIN1) | \ + PIN_OSPEED_HIGH(GPIOE_PIN2) | \ + PIN_OSPEED_HIGH(GPIOE_PIN3) | \ + PIN_OSPEED_HIGH(GPIOE_PIN4) | \ + PIN_OSPEED_HIGH(GPIOE_PIN5) | \ + PIN_OSPEED_HIGH(GPIOE_PIN6) | \ + PIN_OSPEED_HIGH(GPIOE_PIN7) | \ + PIN_OSPEED_HIGH(GPIOE_PIN8) | \ + PIN_OSPEED_HIGH(GPIOE_PIN9) | \ + PIN_OSPEED_HIGH(GPIOE_PIN10) | \ + PIN_OSPEED_HIGH(GPIOE_PIN11) | \ + PIN_OSPEED_HIGH(GPIOE_PIN12) | \ + PIN_OSPEED_HIGH(GPIOE_PIN13) | \ + PIN_OSPEED_HIGH(GPIOE_PIN14) | \ + PIN_OSPEED_HIGH(GPIOE_PIN15)) +#define VAL_GPIOE_PUPDR (PIN_PUPDR_PULLUP(GPIOE_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN15)) +#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \ + PIN_ODR_HIGH(GPIOE_PIN1) | \ + PIN_ODR_HIGH(GPIOE_PIN2) | \ + PIN_ODR_HIGH(GPIOE_PIN3) | \ + PIN_ODR_HIGH(GPIOE_PIN4) | \ + PIN_ODR_HIGH(GPIOE_PIN5) | \ + PIN_ODR_HIGH(GPIOE_PIN6) | \ + PIN_ODR_HIGH(GPIOE_PIN7) | \ + PIN_ODR_HIGH(GPIOE_PIN8) | \ + PIN_ODR_HIGH(GPIOE_PIN9) | \ + PIN_ODR_HIGH(GPIOE_PIN10) | \ + PIN_ODR_HIGH(GPIOE_PIN11) | \ + PIN_ODR_HIGH(GPIOE_PIN12) | \ + PIN_ODR_HIGH(GPIOE_PIN13) | \ + PIN_ODR_HIGH(GPIOE_PIN14) | \ + PIN_ODR_HIGH(GPIOE_PIN15)) +#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN1, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN2, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN3, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN4, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN5, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN6, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN7, 0U)) +#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN9, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN10, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN11, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN12, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN13, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN14, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN15, 0U)) + +/* + * GPIOF setup: + * + * PF0 - COL7 + * PF1 - COL6 + * PF2 - PIN2 (input pullup). + * PF3 - PIN3 (input pullup). + * PF4 - PIN4 (input pullup). + * PF5 - PIN5 (input pullup). + * PF6 - PIN6 (input pullup). + * PF7 - PIN7 (input pullup). + * PF8 - PIN8 (input pullup). + * PF9 - PIN9 (input pullup). + * PF10 - PIN10 (input pullup). + * PF11 - PIN11 (input pullup). + * PF12 - PIN12 (input pullup). + * PF13 - PIN13 (input pullup). + * PF14 - PIN14 (input pullup). + * PF15 - PIN15 (input pullup). + */ +#define VAL_GPIOF_MODER (PIN_MODE_INPUT(GPIOF_PIN0) | \ + PIN_MODE_INPUT(GPIOF_PIN1) | \ + PIN_MODE_INPUT(GPIOF_PIN2) | \ + PIN_MODE_INPUT(GPIOF_PIN3) | \ + PIN_MODE_INPUT(GPIOF_PIN4) | \ + PIN_MODE_INPUT(GPIOF_PIN5) | \ + PIN_MODE_INPUT(GPIOF_PIN6) | \ + PIN_MODE_INPUT(GPIOF_PIN7) | \ + PIN_MODE_INPUT(GPIOF_PIN8) | \ + PIN_MODE_INPUT(GPIOF_PIN9) | \ + PIN_MODE_INPUT(GPIOF_PIN10) | \ + PIN_MODE_INPUT(GPIOF_PIN11) | \ + PIN_MODE_INPUT(GPIOF_PIN12) | \ + PIN_MODE_INPUT(GPIOF_PIN13) | \ + PIN_MODE_INPUT(GPIOF_PIN14) | \ + PIN_MODE_INPUT(GPIOF_PIN15)) +#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN15)) +#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOF_PIN0) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN1) | \ + PIN_OSPEED_HIGH(GPIOF_PIN2) | \ + PIN_OSPEED_HIGH(GPIOF_PIN3) | \ + PIN_OSPEED_HIGH(GPIOF_PIN4) | \ + PIN_OSPEED_HIGH(GPIOF_PIN5) | \ + PIN_OSPEED_HIGH(GPIOF_PIN6) | \ + PIN_OSPEED_HIGH(GPIOF_PIN7) | \ + PIN_OSPEED_HIGH(GPIOF_PIN8) | \ + PIN_OSPEED_HIGH(GPIOF_PIN9) | \ + PIN_OSPEED_HIGH(GPIOF_PIN10) | \ + PIN_OSPEED_HIGH(GPIOF_PIN11) | \ + PIN_OSPEED_HIGH(GPIOF_PIN12) | \ + PIN_OSPEED_HIGH(GPIOF_PIN13) | \ + PIN_OSPEED_HIGH(GPIOF_PIN14) | \ + PIN_OSPEED_HIGH(GPIOF_PIN15)) +#define VAL_GPIOF_PUPDR (PIN_PUPDR_PULLUP(GPIOF_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN15)) +#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_PIN0) | \ + PIN_ODR_HIGH(GPIOF_PIN1) | \ + PIN_ODR_HIGH(GPIOF_PIN2) | \ + PIN_ODR_HIGH(GPIOF_PIN3) | \ + PIN_ODR_HIGH(GPIOF_PIN4) | \ + PIN_ODR_HIGH(GPIOF_PIN5) | \ + PIN_ODR_HIGH(GPIOF_PIN6) | \ + PIN_ODR_HIGH(GPIOF_PIN7) | \ + PIN_ODR_HIGH(GPIOF_PIN8) | \ + PIN_ODR_HIGH(GPIOF_PIN9) | \ + PIN_ODR_HIGH(GPIOF_PIN10) | \ + PIN_ODR_HIGH(GPIOF_PIN11) | \ + PIN_ODR_HIGH(GPIOF_PIN12) | \ + PIN_ODR_HIGH(GPIOF_PIN13) | \ + PIN_ODR_HIGH(GPIOF_PIN14) | \ + PIN_ODR_HIGH(GPIOF_PIN15)) +#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_PIN0, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN1, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN2, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN3, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN4, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN5, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN6, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN7, 0U)) +#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN9, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN10, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN11, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN12, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN13, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN14, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN15, 0U)) + +#if !defined(_FROM_ASM_) +#ifdef __cplusplus +extern "C" { +#endif + void boardInit(void); +#ifdef __cplusplus +} +#endif +#endif /* _FROM_ASM_ */ + +#endif /* _BOARD_H */ diff --git a/keyboards/vinta/boards/GENERIC_STM32_F042X6/board.mk b/keyboards/vinta/boards/GENERIC_STM32_F042X6/board.mk new file mode 100644 index 000000000..bbeb5bbff --- /dev/null +++ b/keyboards/vinta/boards/GENERIC_STM32_F042X6/board.mk @@ -0,0 +1,5 @@ +# List of all the board related files. +BOARDSRC = $(BOARD_PATH)/boards/GENERIC_STM32_F042X6/board.c + +# Required include directories +BOARDINC = $(BOARD_PATH)/boards/GENERIC_STM32_F042X6 diff --git a/keyboards/vinta/bootloader_defs.h b/keyboards/vinta/bootloader_defs.h new file mode 100644 index 000000000..4994be9c2 --- /dev/null +++ b/keyboards/vinta/bootloader_defs.h @@ -0,0 +1,7 @@ +/* Address for jumping to bootloader on STM32 chips. */ +/* It is chip dependent, the correct number can be looked up here: + * http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf + * This also requires a patch to chibios: + * /tmk_core/tool/chibios/ch-bootloader-jump.patch + */ +#define STM32_BOOTLOADER_ADDRESS 0x1FFFC400 \ No newline at end of file diff --git a/keyboards/vinta/chconf.h b/keyboards/vinta/chconf.h new file mode 100644 index 000000000..b836a3b99 --- /dev/null +++ b/keyboards/vinta/chconf.h @@ -0,0 +1,521 @@ +/* + 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. +*/ + +/** + * @file templates/chconf.h + * @brief Configuration file template. + * @details A copy of this file must be placed in each project directory, it + * contains the application specific kernel settings. + * + * @addtogroup config + * @details Kernel related settings and hooks. + * @{ + */ + +#ifndef CHCONF_H +#define CHCONF_H + +#define _CHIBIOS_RT_CONF_ + +/*===========================================================================*/ +/** + * @name System timers settings + * @{ + */ +/*===========================================================================*/ + +/** + * @brief System time counter resolution. + * @note Allowed values are 16 or 32 bits. + */ +#define CH_CFG_ST_RESOLUTION 32 + +/** + * @brief System tick frequency. + * @details Frequency of the system timer that drives the system ticks. This + * setting also defines the system tick time unit. + */ +#define CH_CFG_ST_FREQUENCY 10000 + +/** + * @brief Time delta constant for the tick-less mode. + * @note If this value is zero then the system uses the classic + * periodic tick. This value represents the minimum number + * of ticks that is safe to specify in a timeout directive. + * The value one is not valid, timeouts are rounded up to + * this value. + */ +#define CH_CFG_ST_TIMEDELTA 2 + +/** @} */ + +/*===========================================================================*/ +/** + * @name Kernel parameters and options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Round robin interval. + * @details This constant is the number of system ticks allowed for the + * threads before preemption occurs. Setting this value to zero + * disables the preemption for threads with equal priority and the + * round robin becomes cooperative. Note that higher priority + * threads can still preempt, the kernel is always preemptive. + * @note Disabling the round robin preemption makes the kernel more compact + * and generally faster. + * @note The round robin preemption is not supported in tickless mode and + * must be set to zero in that case. + */ +#define CH_CFG_TIME_QUANTUM 0 + +/** + * @brief Managed RAM size. + * @details Size of the RAM area to be managed by the OS. If set to zero + * then the whole available RAM is used. The core memory is made + * available to the heap allocator and/or can be used directly through + * the simplified core memory allocator. + * + * @note In order to let the OS manage the whole RAM the linker script must + * provide the @p __heap_base__ and @p __heap_end__ symbols. + * @note Requires @p CH_CFG_USE_MEMCORE. + */ +#define CH_CFG_MEMCORE_SIZE 0 + +/** + * @brief Idle thread automatic spawn suppression. + * @details When this option is activated the function @p chSysInit() + * does not spawn the idle thread. The application @p main() + * function becomes the idle thread and must implement an + * infinite loop. + */ +#define CH_CFG_NO_IDLE_THREAD FALSE + +/* Use __WFI in the idle thread for waiting. Does lower the power + * consumption. */ +#define CORTEX_ENABLE_WFI_IDLE TRUE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Performance options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief OS optimization. + * @details If enabled then time efficient rather than space efficient code + * is used when two possible implementations exist. + * + * @note This is not related to the compiler optimization options. + * @note The default is @p TRUE. + */ +#define CH_CFG_OPTIMIZE_SPEED TRUE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Subsystem options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Time Measurement APIs. + * @details If enabled then the time measurement APIs are included in + * the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_TM FALSE + +/** + * @brief Threads registry APIs. + * @details If enabled then the registry APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_REGISTRY TRUE + +/** + * @brief Threads synchronization APIs. + * @details If enabled then the @p chThdWait() function is included in + * the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_WAITEXIT TRUE + +/** + * @brief Semaphores APIs. + * @details If enabled then the Semaphores APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_SEMAPHORES TRUE + +/** + * @brief Semaphores queuing mode. + * @details If enabled then the threads are enqueued on semaphores by + * priority rather than in FIFO order. + * + * @note The default is @p FALSE. Enable this if you have special + * requirements. + * @note Requires @p CH_CFG_USE_SEMAPHORES. + */ +#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE + +/** + * @brief Mutexes APIs. + * @details If enabled then the mutexes APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MUTEXES TRUE + +/** + * @brief Enables recursive behavior on mutexes. + * @note Recursive mutexes are heavier and have an increased + * memory footprint. + * + * @note The default is @p FALSE. + * @note Requires @p CH_CFG_USE_MUTEXES. + */ +#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE + +/** + * @brief Conditional Variables APIs. + * @details If enabled then the conditional variables APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_MUTEXES. + */ +#define CH_CFG_USE_CONDVARS TRUE + +/** + * @brief Conditional Variables APIs with timeout. + * @details If enabled then the conditional variables APIs with timeout + * specification are included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_CONDVARS. + */ +#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE + +/** + * @brief Events Flags APIs. + * @details If enabled then the event flags APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_EVENTS TRUE + +/** + * @brief Events Flags APIs with timeout. + * @details If enabled then the events APIs with timeout specification + * are included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_EVENTS. + */ +#define CH_CFG_USE_EVENTS_TIMEOUT TRUE + +/** + * @brief Synchronous Messages APIs. + * @details If enabled then the synchronous messages APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MESSAGES TRUE + +/** + * @brief Synchronous Messages queuing mode. + * @details If enabled then messages are served by priority rather than in + * FIFO order. + * + * @note The default is @p FALSE. Enable this if you have special + * requirements. + * @note Requires @p CH_CFG_USE_MESSAGES. + */ +#define CH_CFG_USE_MESSAGES_PRIORITY FALSE + +/** + * @brief Mailboxes APIs. + * @details If enabled then the asynchronous messages (mailboxes) APIs are + * included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_SEMAPHORES. + */ +#define CH_CFG_USE_MAILBOXES TRUE + +/** + * @brief Core Memory Manager APIs. + * @details If enabled then the core memory manager APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MEMCORE TRUE + +/** + * @brief Heap Allocator APIs. + * @details If enabled then the memory heap allocator APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or + * @p CH_CFG_USE_SEMAPHORES. + * @note Mutexes are recommended. + */ +#define CH_CFG_USE_HEAP TRUE + +/** + * @brief Memory Pools Allocator APIs. + * @details If enabled then the memory pools allocator APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MEMPOOLS TRUE + +/** + * @brief Dynamic Threads APIs. + * @details If enabled then the dynamic threads creation APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_WAITEXIT. + * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. + */ +#define CH_CFG_USE_DYNAMIC TRUE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Debug options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Debug option, kernel statistics. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_STATISTICS FALSE + +/** + * @brief Debug option, system state check. + * @details If enabled the correct call protocol for system APIs is checked + * at runtime. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_SYSTEM_STATE_CHECK FALSE + +/** + * @brief Debug option, parameters checks. + * @details If enabled then the checks on the API functions input + * parameters are activated. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_ENABLE_CHECKS FALSE + +/** + * @brief Debug option, consistency checks. + * @details If enabled then all the assertions in the kernel code are + * activated. This includes consistency checks inside the kernel, + * runtime anomalies and port-defined checks. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_ENABLE_ASSERTS FALSE + +/** + * @brief Debug option, trace buffer. + * @details If enabled then the trace buffer is activated. + * + * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. + */ +#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_DISABLED + +/** + * @brief Trace buffer entries. + * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is + * different from @p CH_DBG_TRACE_MASK_DISABLED. + */ +#define CH_DBG_TRACE_BUFFER_SIZE 128 + +/** + * @brief Debug option, stack checks. + * @details If enabled then a runtime stack check is performed. + * + * @note The default is @p FALSE. + * @note The stack check is performed in a architecture/port dependent way. + * It may not be implemented or some ports. + * @note The default failure mode is to halt the system with the global + * @p panic_msg variable set to @p NULL. + */ +#define CH_DBG_ENABLE_STACK_CHECK FALSE + +/** + * @brief Debug option, stacks initialization. + * @details If enabled then the threads working area is filled with a byte + * value when a thread is created. This can be useful for the + * runtime measurement of the used stack. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_FILL_THREADS FALSE + +/** + * @brief Debug option, threads profiling. + * @details If enabled then a field is added to the @p thread_t structure that + * counts the system ticks occurred while executing the thread. + * + * @note The default is @p FALSE. + * @note This debug option is not currently compatible with the + * tickless mode. + */ +#define CH_DBG_THREADS_PROFILING FALSE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Kernel hooks + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Threads descriptor structure extension. + * @details User fields added to the end of the @p thread_t structure. + */ +#define CH_CFG_THREAD_EXTRA_FIELDS \ + /* Add threads custom fields here.*/ + +/** + * @brief Threads initialization hook. + * @details User initialization code added to the @p chThdInit() API. + * + * @note It is invoked from within @p chThdInit() and implicitly from all + * the threads creation APIs. + */ +#define CH_CFG_THREAD_INIT_HOOK(tp) { \ + /* Add threads initialization code here.*/ \ +} + +/** + * @brief Threads finalization hook. + * @details User finalization code added to the @p chThdExit() API. + */ +#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ + /* Add threads finalization code here.*/ \ +} + +/** + * @brief Context switch hook. + * @details This hook is invoked just before switching between threads. + */ +#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ + /* Context switch code here.*/ \ +} + +/** + * @brief ISR enter hook. + */ +#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ + /* IRQ prologue code here.*/ \ +} + +/** + * @brief ISR exit hook. + */ +#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ + /* IRQ epilogue code here.*/ \ +} + +/** + * @brief Idle thread enter hook. + * @note This hook is invoked within a critical zone, no OS functions + * should be invoked from here. + * @note This macro can be used to activate a power saving mode. + */ +#define CH_CFG_IDLE_ENTER_HOOK() { \ + /* Idle-enter code here.*/ \ +} + +/** + * @brief Idle thread leave hook. + * @note This hook is invoked within a critical zone, no OS functions + * should be invoked from here. + * @note This macro can be used to deactivate a power saving mode. + */ +#define CH_CFG_IDLE_LEAVE_HOOK() { \ + /* Idle-leave code here.*/ \ +} + +/** + * @brief Idle Loop hook. + * @details This hook is continuously invoked by the idle thread loop. + */ +#define CH_CFG_IDLE_LOOP_HOOK() { \ + /* Idle loop code here.*/ \ +} + +/** + * @brief System tick event hook. + * @details This hook is invoked in the system tick handler immediately + * after processing the virtual timers queue. + */ +#define CH_CFG_SYSTEM_TICK_HOOK() { \ + /* System tick event code here.*/ \ +} + +/** + * @brief System halt hook. + * @details This hook is invoked in case to a system halting error before + * the system is halted. + */ +#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ + /* System halt code here.*/ \ +} + +/** + * @brief Trace hook. + * @details This hook is invoked each time a new record is written in the + * trace buffer. + */ +#define CH_CFG_TRACE_HOOK(tep) { \ + /* Trace code here.*/ \ +} + +/** @} */ + +/*===========================================================================*/ +/* Port-specific settings (override port settings defaulted in chcore.h). */ +/*===========================================================================*/ + +#endif /* CHCONF_H */ + +/** @} */ \ No newline at end of file diff --git a/keyboards/vinta/config.h b/keyboards/vinta/config.h new file mode 100644 index 000000000..5f6ea7f06 --- /dev/null +++ b/keyboards/vinta/config.h @@ -0,0 +1,70 @@ +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0C61 +#define DEVICE_VER 0x00C6 +#define MANUFACTURER PeiorisBoards +#define PRODUCT Vinta R1 +#define DESCRIPTION Tada68 Replacement PCB + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 16 + +#define MATRIX_ROW_PINS { A10, A9, B0, A7, A6 } +#define MATRIX_COL_PINS { A5, A4, A3, A2, A1, A0, F1, F0, B7, B6, B5, B4, B3, A15, A14, A13 } + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCE 0 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. + * This is userful 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 + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) diff --git a/keyboards/vinta/halconf.h b/keyboards/vinta/halconf.h new file mode 100644 index 000000000..bc2b66f2e --- /dev/null +++ b/keyboards/vinta/halconf.h @@ -0,0 +1,350 @@ +/* + 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. +*/ + +/** + * @file templates/halconf.h + * @brief HAL configuration header. + * @details HAL configuration file, this file allows to enable or disable the + * various device drivers from your application. You may also use + * this file in order to override the device drivers default settings. + * + * @addtogroup HAL_CONF + * @{ + */ + +#ifndef _HALCONF_H_ +#define _HALCONF_H_ + +#include "mcuconf.h" + +/** + * @brief Enables the PAL subsystem. + */ +#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) +#define HAL_USE_PAL TRUE +#endif + +/** + * @brief Enables the ADC subsystem. + */ +#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) +#define HAL_USE_ADC FALSE +#endif + +/** + * @brief Enables the CAN subsystem. + */ +#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) +#define HAL_USE_CAN FALSE +#endif + +/** + * @brief Enables the DAC subsystem. + */ +#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) +#define HAL_USE_DAC FALSE +#endif + +/** + * @brief Enables the EXT subsystem. + */ +#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) +#define HAL_USE_EXT FALSE +#endif + +/** + * @brief Enables the GPT subsystem. + */ +#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) +#define HAL_USE_GPT FALSE +#endif + +/** + * @brief Enables the I2C subsystem. + */ +#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) +#define HAL_USE_I2C FALSE +#endif + +/** + * @brief Enables the I2S subsystem. + */ +#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) +#define HAL_USE_I2S FALSE +#endif + +/** + * @brief Enables the ICU subsystem. + */ +#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) +#define HAL_USE_ICU FALSE +#endif + +/** + * @brief Enables the MAC subsystem. + */ +#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) +#define HAL_USE_MAC FALSE +#endif + +/** + * @brief Enables the MMC_SPI subsystem. + */ +#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) +#define HAL_USE_MMC_SPI FALSE +#endif + +/** + * @brief Enables the PWM subsystem. + */ +#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) +#define HAL_USE_PWM FALSE +#endif + +/** + * @brief Enables the RTC subsystem. + */ +#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) +#define HAL_USE_RTC FALSE +#endif + +/** + * @brief Enables the SDC subsystem. + */ +#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) +#define HAL_USE_SDC FALSE +#endif + +/** + * @brief Enables the SERIAL subsystem. + */ +#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) +#define HAL_USE_SERIAL FALSE +#endif + +/** + * @brief Enables the SERIAL over USB subsystem. + */ +#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) +#define HAL_USE_SERIAL_USB TRUE +#endif + +/** + * @brief Enables the SPI subsystem. + */ +#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) +#define HAL_USE_SPI FALSE +#endif + +/** + * @brief Enables the UART subsystem. + */ +#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) +#define HAL_USE_UART FALSE +#endif + +/** + * @brief Enables the USB subsystem. + */ +#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) +#define HAL_USE_USB TRUE +#endif + +/** + * @brief Enables the WDG subsystem. + */ +#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) +#define HAL_USE_WDG FALSE +#endif + +/*===========================================================================*/ +/* ADC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) +#define ADC_USE_WAIT FALSE +#endif + +/** + * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define ADC_USE_MUTUAL_EXCLUSION FALSE +#endif + +/*===========================================================================*/ +/* CAN driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Sleep mode related APIs inclusion switch. + */ +#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) +#define CAN_USE_SLEEP_MODE TRUE +#endif + +/*===========================================================================*/ +/* I2C driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables the mutual exclusion APIs on the I2C bus. + */ +#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define I2C_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* MAC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables an event sources for incoming packets. + */ +#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) +#define MAC_USE_ZERO_COPY FALSE +#endif + +/** + * @brief Enables an event sources for incoming packets. + */ +#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) +#define MAC_USE_EVENTS TRUE +#endif + +/*===========================================================================*/ +/* MMC_SPI driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Delays insertions. + * @details If enabled this options inserts delays into the MMC waiting + * routines releasing some extra CPU time for the threads with + * lower priority, this may slow down the driver a bit however. + * This option is recommended also if the SPI driver does not + * use a DMA channel and heavily loads the CPU. + */ +#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) +#define MMC_NICE_WAITING TRUE +#endif + +/*===========================================================================*/ +/* SDC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Number of initialization attempts before rejecting the card. + * @note Attempts are performed at 10mS intervals. + */ +#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) +#define SDC_INIT_RETRY 100 +#endif + +/** + * @brief Include support for MMC cards. + * @note MMC support is not yet implemented so this option must be kept + * at @p FALSE. + */ +#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) +#define SDC_MMC_SUPPORT FALSE +#endif + +/** + * @brief Delays insertions. + * @details If enabled this options inserts delays into the MMC waiting + * routines releasing some extra CPU time for the threads with + * lower priority, this may slow down the driver a bit however. + */ +#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) +#define SDC_NICE_WAITING TRUE +#endif + +/*===========================================================================*/ +/* SERIAL driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Default bit rate. + * @details Configuration parameter, this is the baud rate selected for the + * default configuration. + */ +#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) +#define SERIAL_DEFAULT_BITRATE 38400 +#endif + +/** + * @brief Serial buffers size. + * @details Configuration parameter, you can change the depth of the queue + * buffers depending on the requirements of your application. + * @note The default is 64 bytes for both the transmission and receive + * buffers. + */ +#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) +#define SERIAL_BUFFERS_SIZE 16 +#endif + +/*===========================================================================*/ +/* SERIAL_USB driver related setting. */ +/*===========================================================================*/ + +/** + * @brief Serial over USB buffers size. + * @details Configuration parameter, the buffer size must be a multiple of + * the USB data endpoint maximum packet size. + * @note The default is 64 bytes for both the transmission and receive + * buffers. + */ +#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) +#define SERIAL_USB_BUFFERS_SIZE 256 +#endif + +/*===========================================================================*/ +/* SPI driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) +#define SPI_USE_WAIT FALSE +#endif + +/** + * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define SPI_USE_MUTUAL_EXCLUSION FALSE +#endif + +/*===========================================================================*/ +/* USB driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) +#define USB_USE_WAIT TRUE +#endif + +#endif /* _HALCONF_H_ */ + +/** @} */ \ No newline at end of file diff --git a/keyboards/vinta/keymaps/default/keymap.c b/keyboards/vinta/keymaps/default/keymap.c new file mode 100644 index 000000000..4e55ec308 --- /dev/null +++ b/keyboards/vinta/keymaps/default/keymap.c @@ -0,0 +1,51 @@ +/* Copyright 2018 Peioris + * + * 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 . + */ + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Keymap _BL: (Base Layer) Default Layer + * ,----------------------------------------------------------------. + * |Esc | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \ | ` |Del | + * |----------------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| Bspc|PgUp| + * |----------------------------------------------------------------| + * |CAPS | A| S| D| F| G| H| J| K| L| ;| '|Return |PgDn| + * |----------------------------------------------------------------| + * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | Up|End | + * |----------------------------------------------------------------| + * |Ctrl|Win |Alt | Space |Alt|RST|Ctrl|Lef|Dow|Rig | + * `----------------------------------------------------------------' + */ +[0] = LAYOUT_69_ansi( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, KC_DEL,\ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, KC_PGUP,\ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP,\ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN,\ + KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT, RESET, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), +}; + +void matrix_init_user(void) { + //user initialization +} + +void matrix_scan_user(void) { + //user matrix +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} \ No newline at end of file diff --git a/keyboards/vinta/mcuconf.h b/keyboards/vinta/mcuconf.h new file mode 100644 index 000000000..4643e9f92 --- /dev/null +++ b/keyboards/vinta/mcuconf.h @@ -0,0 +1,168 @@ +/* + 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_ + +/* + * STM32F0xx drivers configuration. + * The following settings override the default settings present in + * the various device driver implementation headers. + * Note that the settings for each driver only have effect if the whole + * driver is enabled in halconf.h. + * + * IRQ priorities: + * 3...0 Lowest...Highest. + * + * DMA priorities: + * 0...3 Lowest...Highest. + */ + +#define STM32F0xx_MCUCONF + +/* + * HAL driver system settings. + */ +#define STM32_NO_INIT FALSE +#define STM32_PVD_ENABLE FALSE +#define STM32_PLS STM32_PLS_LEV0 +#define STM32_HSI_ENABLED TRUE +#define STM32_HSI14_ENABLED TRUE +#define STM32_HSI48_ENABLED FALSE +#define STM32_LSI_ENABLED TRUE +#define STM32_HSE_ENABLED FALSE +#define STM32_LSE_ENABLED FALSE +#define STM32_SW STM32_SW_PLL +#define STM32_PLLSRC STM32_PLLSRC_HSI_DIV2 +#define STM32_PREDIV_VALUE 1 +#define STM32_PLLMUL_VALUE 12 +#define STM32_HPRE STM32_HPRE_DIV1 +#define STM32_PPRE STM32_PPRE_DIV1 +#define STM32_ADCSW STM32_ADCSW_HSI14 +#define STM32_ADCPRE STM32_ADCPRE_DIV4 +#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK +#define STM32_ADCPRE STM32_ADCPRE_DIV4 +#define STM32_ADCSW STM32_ADCSW_HSI14 +#define STM32_USBSW STM32_USBSW_HSI48 +#define STM32_CECSW STM32_CECSW_HSI +#define STM32_I2C1SW STM32_I2C1SW_HSI +#define STM32_USART1SW STM32_USART1SW_PCLK +#define STM32_RTCSEL STM32_RTCSEL_LSI + +/* + * ADC driver system settings. + */ +#define STM32_ADC_USE_ADC1 FALSE +#define STM32_ADC_ADC1_DMA_PRIORITY 2 +#define STM32_ADC_IRQ_PRIORITY 2 +#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 2 + +/* + * EXT driver system settings. + */ +#define STM32_EXT_EXTI0_1_IRQ_PRIORITY 3 +#define STM32_EXT_EXTI2_3_IRQ_PRIORITY 3 +#define STM32_EXT_EXTI4_15_IRQ_PRIORITY 3 +#define STM32_EXT_EXTI16_IRQ_PRIORITY 3 +#define STM32_EXT_EXTI17_IRQ_PRIORITY 3 + +/* + * GPT driver system settings. + */ +#define STM32_GPT_USE_TIM1 FALSE +#define STM32_GPT_USE_TIM2 FALSE +#define STM32_GPT_USE_TIM3 FALSE +#define STM32_GPT_USE_TIM14 FALSE +#define STM32_GPT_TIM1_IRQ_PRIORITY 2 +#define STM32_GPT_TIM2_IRQ_PRIORITY 2 +#define STM32_GPT_TIM3_IRQ_PRIORITY 2 +#define STM32_GPT_TIM14_IRQ_PRIORITY 2 + +/* + * I2C driver system settings. + */ +#define STM32_I2C_USE_I2C1 FALSE +#define STM32_I2C_USE_I2C2 FALSE +#define STM32_I2C_BUSY_TIMEOUT 50 +#define STM32_I2C_I2C1_IRQ_PRIORITY 3 +#define STM32_I2C_I2C2_IRQ_PRIORITY 3 +#define STM32_I2C_USE_DMA TRUE +#define STM32_I2C_I2C1_DMA_PRIORITY 1 +#define STM32_I2C_I2C2_DMA_PRIORITY 1 +#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") + +/* + * ICU driver system settings. + */ +#define STM32_ICU_USE_TIM1 FALSE +#define STM32_ICU_USE_TIM2 FALSE +#define STM32_ICU_USE_TIM3 FALSE +#define STM32_ICU_TIM1_IRQ_PRIORITY 3 +#define STM32_ICU_TIM2_IRQ_PRIORITY 3 +#define STM32_ICU_TIM3_IRQ_PRIORITY 3 + +/* + * PWM driver system settings. + */ +#define STM32_PWM_USE_ADVANCED FALSE +#define STM32_PWM_USE_TIM1 FALSE +#define STM32_PWM_USE_TIM2 FALSE +#define STM32_PWM_USE_TIM3 FALSE +#define STM32_PWM_TIM1_IRQ_PRIORITY 3 +#define STM32_PWM_TIM2_IRQ_PRIORITY 3 +#define STM32_PWM_TIM3_IRQ_PRIORITY 3 + +/* + * SERIAL driver system settings. + */ +#define STM32_SERIAL_USE_USART1 FALSE +#define STM32_SERIAL_USE_USART2 FALSE +#define STM32_SERIAL_USART1_PRIORITY 3 +#define STM32_SERIAL_USART2_PRIORITY 3 + +/* + * SPI driver system settings. + */ +#define STM32_SPI_USE_SPI1 FALSE +#define STM32_SPI_USE_SPI2 FALSE +#define STM32_SPI_SPI1_DMA_PRIORITY 1 +#define STM32_SPI_SPI2_DMA_PRIORITY 1 +#define STM32_SPI_SPI1_IRQ_PRIORITY 2 +#define STM32_SPI_SPI2_IRQ_PRIORITY 2 +#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure") + +/* + * ST driver system settings. + */ +#define STM32_ST_IRQ_PRIORITY 2 +#define STM32_ST_USE_TIMER 2 + +/* + * UART driver system settings. + */ +#define STM32_UART_USE_USART1 FALSE +#define STM32_UART_USE_USART2 FALSE +#define STM32_UART_USART1_IRQ_PRIORITY 3 +#define STM32_UART_USART2_IRQ_PRIORITY 3 +#define STM32_UART_USART1_DMA_PRIORITY 0 +#define STM32_UART_USART2_DMA_PRIORITY 0 +#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure") + +/* + * USB driver system settings. + */ +#define STM32_USB_USE_USB1 TRUE +#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE +#define STM32_USB_USB1_LP_IRQ_PRIORITY 3 + +#endif /* _MCUCONF_H_ */ \ No newline at end of file diff --git a/keyboards/vinta/readme.md b/keyboards/vinta/readme.md new file mode 100644 index 000000000..193f36121 --- /dev/null +++ b/keyboards/vinta/readme.md @@ -0,0 +1,22 @@ +Vinta +========= + +[Vinta](https://i.imgur.com/huX3lff.jpg) + + +This is an ARM-powered 65% keyboard PCB with USB Mini B connector and breakout for optional RGB underglow. + +Keyboard Maintainer: [Peioris](http://peioris.space/) and on [github](https://github.com/coarse) +Hardware Supported: Vinta with STM32F042K6T6 +Hardware Availability: Private Groupbuy (will post on Reddit once QMK has RGB underglow working) + +Make example for this keyboard (after setting up your build environment): + + make vinta:default + +See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. + +#### Developer's Note + +STM32F042xx chips does not allow jumping to bootloader without BOOT0 being set to high, therefore it is impossible to enter the bootloader from sending a `RESET` keycode nor using bootmagic or bootmagic lite. +The only way to enter bootloader is to hold the BOOT0 button while the keyboard is powering up or after a power reset (done by pressing the reset switch or sending a `RESET` keycode). \ No newline at end of file diff --git a/keyboards/vinta/rules.mk b/keyboards/vinta/rules.mk new file mode 100644 index 000000000..bf3eecbe2 --- /dev/null +++ b/keyboards/vinta/rules.mk @@ -0,0 +1,47 @@ +# project specific files + +## chip/board settings +# - the next two should match the directories in +# /os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES) +MCU_FAMILY = STM32 +MCU_SERIES = STM32F0xx + +# Linker script to use +# - it should exist either in /os/common/ports/ARMCMx/compilers/GCC/ld/ +# or /ld/ +MCU_LDSCRIPT = STM32F042x6 + +# Startup code to use +# - it should exist in /os/common/ports/ARMCMx/compilers/GCC/mk/ +MCU_STARTUP = stm32f0xx + +# Board: it should exist either in /os/hal/boards/ +# or /boards +BOARD = GENERIC_STM32_F042X6 + +# Cortex version +MCU = cortex-m0 + +# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7 +ARMV = 6 + +# Vector table for application +# 0x00000000-0x00001000 area is occupied by bootlaoder.*/ +# The CORTEX_VTOR... is needed only for MCHCK/Infinity KB +#OPT_DEFS = -DCORTEX_VTOR_INIT=0x00001000 +OPT_DEFS = + +# Options to pass to dfu-util when flashing +DFU_ARGS = -d 0483:df11 -a 0 -s 0x08000000 + +# Build Options +# comment out to disable the options. +# +BACKLIGHT_ENABLE = no +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration +MOUSEKEY_ENABLE = yes # 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 = yes # USB Nkey Rollover +NO_USB_STARTUP_CHECK = no # Disable initialization only when usb is plugged in \ No newline at end of file diff --git a/keyboards/vinta/vinta.c b/keyboards/vinta/vinta.c new file mode 100644 index 000000000..b5d40a160 --- /dev/null +++ b/keyboards/vinta/vinta.c @@ -0,0 +1,18 @@ +#include "vinta.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + + return process_record_user(keycode, record); +} \ No newline at end of file diff --git a/keyboards/vinta/vinta.h b/keyboards/vinta/vinta.h new file mode 100644 index 000000000..7f21157ee --- /dev/null +++ b/keyboards/vinta/vinta.h @@ -0,0 +1,25 @@ +#ifndef VINTA_H +#define VINTA_H + +#define XXX KC_NO + +#include "quantum.h" + +// This a shortcut to help you visually see your layout. + +#define LAYOUT_69_ansi( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1E, K1F, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2E, K2F, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3C, K3E, K3F, \ + K40, K41, K42, K45, K49, K4A, K4C, K4D, K4E, K4F \ +) \ +{ \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, XXX, K1E, K1F }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, XXX, XXX, K2E, K2F }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, XXX, K3C, XXX, K3E, K3F }, \ + { K40, K41, K42, XXX, XXX, K45, XXX, XXX, XXX, K49, K4A, XXX, K4C, K4D, K4E, K4F } \ +} + +#endif \ No newline at end of file From a9c5e75437be7dbfb399d21f738feb9a07c4017d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=BDan=20Pevec?= Date: Tue, 30 Oct 2018 06:21:07 +0100 Subject: [PATCH 416/788] Planck keyboard layout update (#4279) * Personal dz60 keymap * Replacing unused macros Co-Authored-By: pevecyan * Fixes on keymap * Planck keyboard layout update --- keyboards/planck/keymaps/pevecyan/keymap.c | 34 +++++++++++++++++----- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/keyboards/planck/keymaps/pevecyan/keymap.c b/keyboards/planck/keymaps/pevecyan/keymap.c index 7bc43a373..4d76f09b0 100644 --- a/keyboards/planck/keymaps/pevecyan/keymap.c +++ b/keyboards/planck/keymaps/pevecyan/keymap.c @@ -28,7 +28,9 @@ enum planck_layers { _RAISE, _ADJUST, _ALTGR, - _CAPS + _CAPS, + _MEMA, + _CARON }; enum planck_keycodes { @@ -39,6 +41,8 @@ enum planck_keycodes { #define RAISE MO(_RAISE) #define CAPS MO(_CAPS) #define ALTGR MO(_ALTGR) +#define MEMA MO(_MEMA) +#define CARON LT(_CARON, SI_QOT) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { @@ -55,14 +59,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_QWERTY] = LAYOUT_planck_grid( KC_TAB, SI_Q, SI_W, SI_E, SI_R, SI_T, SI_Z, SI_U, SI_I, SI_O, SI_P, KC_BSPC, - CAPS, SI_A, SI_S, SI_D, SI_F, SI_G, SI_H, SI_J, SI_K, SI_L, KC_SCLN, KC_ENT, + CAPS, SI_A, SI_S, SI_D, SI_F, SI_G, SI_H, SI_J, SI_K, SI_L, CARON, KC_ENT, KC_LSFT, SI_Y, SI_X, SI_C, SI_V, SI_B, SI_N, SI_M, SI_COMM, SI_DOT, SI_MINS, KC_RSFT , - KC_LCTL, KC_LGUI, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, ALTGR, KC_DOWN, KC_UP, KC_F5 + KC_LCTL, KC_LALT, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, ALTGR, MEMA, KC_F12, KC_F5 ), /* Lower * ,-----------------------------------------------------------------------------------. - * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | + * | ~ | ! | " | # | $ | % | & | / | ( | ) | = | Bksp | * |------+------+------+------+------+-------------+------+------+------+------+------| * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | * |------+------+------+------+------+------|------+------+------+------+------+------| @@ -72,8 +76,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_LOWER] = LAYOUT_planck_grid( - KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, - KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_MINS, KC_PPLS , KC_ENT, + SI_TILD, SI_EXLM, SI_DQOT, KC_HASH, SI_DLR, SI_PERC, SI_AMPR, SI_SLSH, SI_LPRN, SI_RPRN, SI_EQL, _______, + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_MINS, KC_PPLS, KC_ENT, _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_NUHS), S(KC_NUBS), KC_HOME, KC_END, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY ), @@ -100,7 +104,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * ,-----------------------------------------------------------------------------------. * | | Reset| | | | | | | | | | Del | * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak|Plover| | + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty| | | | | * |------+------+------+------+------+------|------+------+------+------+------+------| * | |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof| | | | | | * |------+------+------+------+------+------+------+------+------+------+------+------| @@ -126,7 +130,21 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ -) +), + +[_MEMA] = LAYOUT_planck_grid( + _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_MNXT, KC_VOLD, KC_MPLY, KC_VOLU, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +[_CARON] = LAYOUT_planck_grid( + _______, _______, _______, _______, _______, _______, SI_ZV , _______, _______, _______, _______, _______, + _______, _______, SI_SV, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, SI_CV, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), }; From 9315172190f86a6bc40bcdf9867a827e9fa72021 Mon Sep 17 00:00:00 2001 From: mtei <2170248+mtei@users.noreply.github.com> Date: Tue, 30 Oct 2018 04:05:28 +0900 Subject: [PATCH 417/788] helix serial.c: Add the version of gcc used for adjustment to the comment. --- keyboards/helix/serial.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/keyboards/helix/serial.c b/keyboards/helix/serial.c index 24b889d30..325c29a3f 100644 --- a/keyboards/helix/serial.c +++ b/keyboards/helix/serial.c @@ -70,6 +70,7 @@ #error serial.c now support ATmega32U4 only #endif +//////////////// for backward compatibility //////////////////////////////// #ifndef SERIAL_USE_MULTI_TRANSACTION /* --- USE Simple API (OLD API, compatible with let's split serial.c) */ #if SERIAL_SLAVE_BUFFER_LENGTH > 0 @@ -111,7 +112,8 @@ int serial_update_buffers() return result; } -#endif // Simple API (OLD API, compatible with let's split serial.c) +#endif // end of Simple API (OLD API, compatible with let's split serial.c) +//////////////////////////////////////////////////////////////////////////// #define ALWAYS_INLINE __attribute__((always_inline)) #define NO_INLINE __attribute__((noinline)) @@ -575,7 +577,14 @@ int soft_serial_get_and_clean_status(int sstd_index) { #endif // Helix serial.c history -// 2018-1-29 fork from let's split (#2308) -// 2018-6-28 bug fix master to slave comm (#3255) -// 2018-8-11 improvements (#3608) -// 2018-10-21 fix serial and RGB animation conflict (#4191) +// 2018-1-29 fork from let's split and add PD2, modify sync_recv() (#2308, bceffdefc) +// 2018-6-28 bug fix master to slave comm and speed up (#3255, 1038bbef4) +// (adjusted with avr-gcc 4.9.2) +// 2018-7-13 remove USE_SERIAL_PD2 macro (#3374, f30d6dd78) +// (adjusted with avr-gcc 4.9.2) +// 2018-8-11 add support multi-type transaction (#3608, feb5e4aae) +// (adjusted with avr-gcc 4.9.2) +// 2018-10-21 fix serial and RGB animation conflict (#4191, 4665e4fff) +// (adjusted with avr-gcc 7.3.0) +// 2018-10-28 re-adjust compiler depend value of delay (#4269, 8517f8a66) +// (adjusted with avr-gcc 5.4.0, 7.3.0) From 31ff5f219ddcbdac183c7f3ad6cea8eca1b9d398 Mon Sep 17 00:00:00 2001 From: Jason Thigpen Date: Tue, 30 Oct 2018 08:22:25 -0700 Subject: [PATCH 418/788] Move grave to top layer (caps is esc) (#4288) --- keyboards/dz60/keymaps/crd/keymap.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/keyboards/dz60/keymaps/crd/keymap.c b/keyboards/dz60/keymaps/crd/keymap.c index 2aedc0b72..148b03b99 100644 --- a/keyboards/dz60/keymaps/crd/keymap.c +++ b/keyboards/dz60/keymaps/crd/keymap.c @@ -4,7 +4,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Qwerty * ,-----------------------------------------------------------------------------------------. - * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Bkspc | + * | ` ~ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Bkspc | * |-----------------------------------------------------------------------------------------+ * | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | * |-----------------------------------------------------------------------------------------+ @@ -17,7 +17,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ LAYOUT_directional( - KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, _______, KC_BSPC, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, _______, KC_BSPC, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_DEL, @@ -26,7 +26,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* FN1 Layer * ,-----------------------------------------------------------------------------------------. - * | ` ~ | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | | + * | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | | * |-----------------------------------------------------------------------------------------+ * | | | | | | | | | | | | | | | * |-----------------------------------------------------------------------------------------+ @@ -39,7 +39,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ LAYOUT_directional( - KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, _______, From 7373d5b394d9c75cd2b91d77984145606bf31a04 Mon Sep 17 00:00:00 2001 From: Leah Date: Tue, 30 Oct 2018 16:37:08 +0100 Subject: [PATCH 419/788] Update feature_bootmagic.md (#4290) Fix typo --- docs/feature_bootmagic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/feature_bootmagic.md b/docs/feature_bootmagic.md index 20c76d9b7..504fb90f4 100644 --- a/docs/feature_bootmagic.md +++ b/docs/feature_bootmagic.md @@ -14,7 +14,7 @@ On some keyboards Bootmagic is disabled by default. If this is the case, it must BOOTMAGIC_ENABLE = full ``` -?> You may see `yes` being used in place of `full`, and this is okay. However, `yes` is deprecated, and ideally `full` (or `lite`) ideally should be used instead. +?> You may see `yes` being used in place of `full`, and this is okay. However, `yes` is deprecated, and ideally `full` (or `lite`) should be used instead. Additionally, you can use [Bootmagic Lite](#bootmagic-lite) (a scaled down, very basic version of Bootmagic) by adding the following to your `rules.mk` file: From 7fc9170ea7271e2931c7e0f854b635f0954fbbe1 Mon Sep 17 00:00:00 2001 From: Jason Thigpen Date: Tue, 30 Oct 2018 09:10:53 -0700 Subject: [PATCH 420/788] Add crd's AEK layout for ALPS64 board (#4292) --- keyboards/alps64/keymaps/crd/keymap.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 keyboards/alps64/keymaps/crd/keymap.c diff --git a/keyboards/alps64/keymaps/crd/keymap.c b/keyboards/alps64/keymaps/crd/keymap.c new file mode 100644 index 000000000..a47ad8650 --- /dev/null +++ b/keyboards/alps64/keymaps/crd/keymap.c @@ -0,0 +1,22 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* 0: qwerty */ + LAYOUT_all( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, _______, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, + CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______, KC_RSFT, + MO(1), KC_LALT, KC_LGUI, KC_SPC, _______, KC_RGUI, KC_RALT, MO(2) + ), + /* 1: fn1 */ + LAYOUT_all( + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, _______, + _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_END, KC_PGDOWN, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______ + ), +}; + +const uint16_t PROGMEM fn_actions[] = {}; From 426c18b8c6fac83620de9ccedb4668dbb3a1ff40 Mon Sep 17 00:00:00 2001 From: Elliot Powell <32494740+e11i0t23@users.noreply.github.com> Date: Tue, 30 Oct 2018 21:55:22 +0000 Subject: [PATCH 421/788] Keyboard: add ep40 qmk support (#4291) * add initial ep40 files * fixed issues * updated keymap * Added media control * Update keyboards/handwired/ep40/rules.mk Co-Authored-By: e11i0t23 <32494740+e11i0t23@users.noreply.github.com> * Fixed requested changes * Fixed more requested changes --- keyboards/handwired/ep40/config.h | 114 ++++++++++++++++++ keyboards/handwired/ep40/ep40.c | 43 +++++++ keyboards/handwired/ep40/ep40.h | 44 +++++++ keyboards/handwired/ep40/info.json | 12 ++ .../handwired/ep40/keymaps/default/keymap.c | 39 ++++++ .../handwired/ep40/keymaps/default/readme.md | 1 + keyboards/handwired/ep40/readme.md | 15 +++ keyboards/handwired/ep40/rules.mk | 80 ++++++++++++ 8 files changed, 348 insertions(+) create mode 100644 keyboards/handwired/ep40/config.h create mode 100644 keyboards/handwired/ep40/ep40.c create mode 100644 keyboards/handwired/ep40/ep40.h create mode 100644 keyboards/handwired/ep40/info.json create mode 100644 keyboards/handwired/ep40/keymaps/default/keymap.c create mode 100644 keyboards/handwired/ep40/keymaps/default/readme.md create mode 100644 keyboards/handwired/ep40/readme.md create mode 100644 keyboards/handwired/ep40/rules.mk diff --git a/keyboards/handwired/ep40/config.h b/keyboards/handwired/ep40/config.h new file mode 100644 index 000000000..90630cd68 --- /dev/null +++ b/keyboards/handwired/ep40/config.h @@ -0,0 +1,114 @@ +/* +Copyright 2018 Elliot Powell + +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 . +*/ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x4040 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Elliot Powell +#define PRODUCT ep40 +#define DESCRIPTION A simple 40% keyboard + +/* key matrix size */ +#define MATRIX_ROWS 4 +#define MATRIX_COLS 12 + +/* + * 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 { C7, C6, B6, B5 } +#define MATRIX_COL_PINS { F6, F5, F4, F1, F0, D2, D3, D5, D4, D6, D7, B4 } + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. + * This is userful 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 + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) +/* + * 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 diff --git a/keyboards/handwired/ep40/ep40.c b/keyboards/handwired/ep40/ep40.c new file mode 100644 index 000000000..257f9fa80 --- /dev/null +++ b/keyboards/handwired/ep40/ep40.c @@ -0,0 +1,43 @@ +/* Copyright 2018 Elliot Powell + * + * 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 . + */ +#include "ep40.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + + led_set_user(usb_led); +} diff --git a/keyboards/handwired/ep40/ep40.h b/keyboards/handwired/ep40/ep40.h new file mode 100644 index 000000000..30f3d15b4 --- /dev/null +++ b/keyboards/handwired/ep40/ep40.h @@ -0,0 +1,44 @@ +/* Copyright 2018 Elliot Powell + * + * 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 . + */ +#ifndef EP40_H +#define EP40_H + +#include "quantum.h" + +/* This a shortcut to help you visually see your layout. + * + * The first section contains all of the arguments representing the physical + * layout of the board and position of the keys. + * + * The second converts the arguments into a two-dimensional array which + * represents the switch matrix. + */ +#define xxx KC_NO + +#define LAYOUT(\ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b,\ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1b,\ + k20, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b,\ + k30, k31, k32, k34, k36, k38, k39, k3a, k3b \ +) \ +{ \ + {k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b},\ + {k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, xxx, k1b},\ + {k20, xxx, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b},\ + {k30, k31, k32, xxx, k34, xxx, k36, xxx, k38, k39, k3a, k3b} \ +} + +#endif diff --git a/keyboards/handwired/ep40/info.json b/keyboards/handwired/ep40/info.json new file mode 100644 index 000000000..1c57ac674 --- /dev/null +++ b/keyboards/handwired/ep40/info.json @@ -0,0 +1,12 @@ +{ + "keyboard_name":"ep40", + "url":null, + "maintainer":"e11i0t23", + "width":12, + "hight":4, + "layouts": { + "LAYOUT": { + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":0, "y":1, "w":1.25}, {"x":1.25, "y":1}, {"x":2.25, "y":1}, {"x":3.25, "y":1}, {"x":4.25, "y":1}, {"x":5.25, "y":1}, {"x":6.25, "y":1}, {"x":7.25, "y":1}, {"x":8.25, "y":1}, {"x":9.25, "y":1}, {"x":10.25, "y":1, "w":1.75}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2, "w":1.25}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3, "w":2.25}, {"x":5.25, "y":3, "w":2.75}, {"x":8, "y":3}, {"x":9, "y":3}, {"x":10, "y":3}, {"x":11, "y":3}] + } + } +} diff --git a/keyboards/handwired/ep40/keymaps/default/keymap.c b/keyboards/handwired/ep40/keymaps/default/keymap.c new file mode 100644 index 000000000..2d8a5d059 --- /dev/null +++ b/keyboards/handwired/ep40/keymaps/default/keymap.c @@ -0,0 +1,39 @@ +/* Copyright 2018 Elliot Powell + * + * 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 . + */ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( /* Base */ + KC_GESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,\ + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_RSFT,\ + LCTL_T(KC_LBRC), KC_LGUI, KC_LALT, KC_SPC, LT(1, KC_SPC), KC_RGUI, MO(2), RCTL_T(KC_RBRC), KC_RALT \ + ), + + [1] = LAYOUT( /* Base */ + KC_TRNS, KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0, KC_DEL ,\ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_UP, KC_DOWN, KC_RIGHT, KC_TRNS,\ + KC_TRNS, KC_VOLD, KC_MUTE, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_TRNS,\ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ + ), + + [2] = LAYOUT( /* Base */ + KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , KC_F12 ,\ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_SCLN, KC_QUOT, KC_NUHS, KC_TRNS,\ + KC_TRNS, KC_NUBS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_SLSH, KC_TRNS, KC_TRNS,\ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET \ + ), +}; diff --git a/keyboards/handwired/ep40/keymaps/default/readme.md b/keyboards/handwired/ep40/keymaps/default/readme.md new file mode 100644 index 000000000..242c0afb9 --- /dev/null +++ b/keyboards/handwired/ep40/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for ep40 \ No newline at end of file diff --git a/keyboards/handwired/ep40/readme.md b/keyboards/handwired/ep40/readme.md new file mode 100644 index 000000000..5acd8892d --- /dev/null +++ b/keyboards/handwired/ep40/readme.md @@ -0,0 +1,15 @@ +# ep40 + +![ep40](https://i.imgur.com/Jl7w6I9.jpg) + +A simple 40% keyboard + +Keyboard Maintainer: [Elliot Powell](https://reddit.com/u/e11i0t23, https://github.com/e11i0t23) +Hardware Supported: EP40 PCB +Hardware Availability: None at the moment + +Make example for this keyboard (after setting up your build environment): + + make ep40:default + +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). diff --git a/keyboards/handwired/ep40/rules.mk b/keyboards/handwired/ep40/rules.mk new file mode 100644 index 000000000..9ddf9717e --- /dev/null +++ b/keyboards/handwired/ep40/rules.mk @@ -0,0 +1,80 @@ +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = no # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) From 685cec47bb4d10de2642690a71cb2566bceffccb Mon Sep 17 00:00:00 2001 From: noroadsleft Date: Tue, 30 Oct 2018 17:30:09 -0700 Subject: [PATCH 422/788] Configurator info.json fix for KBD19x The info.json had a random backslash, which invalidated the JSON structure. This commit fixes that issue. --- keyboards/kbd19x/info.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/keyboards/kbd19x/info.json b/keyboards/kbd19x/info.json index dd5cc700c..31f2f9cf5 100644 --- a/keyboards/kbd19x/info.json +++ b/keyboards/kbd19x/info.json @@ -1,9 +1,9 @@ { - "keyboard_name": "KBD19x", - "url": "https://github.com/qmk/qmk_firmware/tree/master/keyboards/kbd19x", - "maintainer": "qmk", - "width": 19.5, - "height": 6.75, + "keyboard_name": "KBD19x", + "url": "https://github.com/qmk/qmk_firmware/tree/master/keyboards/kbd19x", + "maintainer": "qmk", + "width": 19.5, + "height": 6.75, "layouts": { "LAYOUT_ansi": { "key_count": 99, @@ -61,7 +61,7 @@ {"label":"8", "x":16.5, "y":2.5}, {"label":"9", "x":17.5, "y":2.5}, {"label":"+", "x":18.5, "y":2.5, "h":2}, - {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75},\ + {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75}, {"label":"A", "x":1.75, "y":3.5}, {"label":"S", "x":2.75, "y":3.5}, {"label":"D", "x":3.75, "y":3.5}, From d147cf5ecefe9846d6d6b68ced498a4444754b03 Mon Sep 17 00:00:00 2001 From: Daniel Shields Date: Wed, 31 Oct 2018 14:07:34 +0000 Subject: [PATCH 423/788] Add support for planck/rev6 to dshields keymap. (#4304) --- keyboards/planck/keymaps/dshields/rules.mk | 24 ++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/keyboards/planck/keymaps/dshields/rules.mk b/keyboards/planck/keymaps/dshields/rules.mk index 033e3c9c4..300a82790 100644 --- a/keyboards/planck/keymaps/dshields/rules.mk +++ b/keyboards/planck/keymaps/dshields/rules.mk @@ -9,12 +9,20 @@ EXTRAKEY_ENABLE = no SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend API_SYSEX_ENABLE = no -ifneq (,$(findstring planck/light,$(KEYBOARD))) - AUDIO_ENABLE = yes - BACKLIGHT_ENABLE = no - RGB_MATRIX_ENABLE = yes -else - AUDIO_ENABLE = no - BACKLIGHT_ENABLE = yes - RGB_MATRIX_ENABLE = no +ifeq ($(strip $(KEYBOARD)), planck/rev3) + AUDIO_ENABLE = no + BACKLIGHT_ENABLE = yes + RGB_MATRIX_ENABLE = no endif +ifeq ($(strip $(KEYBOARD)), planck/rev6) + EXTRALDFLAGS = -Wl,--build-id=none + AUDIO_ENABLE = yes + BACKLIGHT_ENABLE = no + RGB_MATRIX_ENABLE = no +endif +ifeq ($(strip $(KEYBOARD)), planck/light) + AUDIO_ENABLE = yes + BACKLIGHT_ENABLE = no + RGB_MATRIX_ENABLE = yes +endif + From 75d657b5251c80b4d5a3de583d4ba97c10ac619f Mon Sep 17 00:00:00 2001 From: noroadsleft Date: Tue, 30 Oct 2018 18:22:30 -0700 Subject: [PATCH 424/788] Configurator info.json fix for XD87 --- keyboards/xd87/info.json | 291 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 291 insertions(+) diff --git a/keyboards/xd87/info.json b/keyboards/xd87/info.json index e69de29bb..3837358cd 100644 --- a/keyboards/xd87/info.json +++ b/keyboards/xd87/info.json @@ -0,0 +1,291 @@ +{ + "keyboard_name": "XD87", + "url": "", + "maintainer": "qmk", + "width": 18.25, + "height": 7.25, + "layouts": { + "LAYOUT_all": { + "layout": [ + { "label": "K00", "x": 0, "y": 0 }, + { "label": "K01", "x": 1, "y": 0 }, + { "label": "K02", "x": 2, "y": 0 }, + { "label": "K03", "x": 3, "y": 0 }, + { "label": "K04", "x": 4, "y": 0 }, + { "label": "K05", "x": 5, "y": 0 }, + { "label": "K06", "x": 6.5, "y": 0 }, + { "label": "K07", "x": 7.5, "y": 0 }, + { "label": "K08", "x": 8.5, "y": 0 }, + { "label": "K09", "x": 9.5, "y": 0 }, + { "label": "K0A", "x": 11, "y": 0 }, + { "label": "K0B", "x": 12, "y": 0 }, + { "label": "K0C", "x": 13, "y": 0 }, + { "label": "K0D", "x": 14, "y": 0 }, + { "label": "K0E", "x": 15.25, "y": 0 }, + { "label": "K0F", "x": 16.25, "y": 0 }, + { "label": "K0G", "x": 17.25, "y": 0 }, + { "label": "K10", "x": 0, "y": 1.25 }, + { "label": "K11", "x": 1, "y": 1.25 }, + { "label": "K12", "x": 2, "y": 1.25 }, + { "label": "K13", "x": 3, "y": 1.25 }, + { "label": "K14", "x": 4, "y": 1.25 }, + { "label": "K15", "x": 5, "y": 1.25 }, + { "label": "K16", "x": 6, "y": 1.25 }, + { "label": "K17", "x": 7, "y": 1.25 }, + { "label": "K18", "x": 8, "y": 1.25 }, + { "label": "K19", "x": 9, "y": 1.25 }, + { "label": "K1A", "x": 10, "y": 1.25 }, + { "label": "K1B", "x": 11, "y": 1.25 }, + { "label": "K1C", "x": 12, "y": 1.25 }, + { "label": "K1D", "x": 13, "y": 1.25 }, + { "label": "K3E", "x": 14, "y": 1.25 }, + { "label": "K1E", "x": 15.25, "y": 1.25 }, + { "label": "K1F", "x": 16.25, "y": 1.25 }, + { "label": "K1G", "x": 17.25, "y": 1.25 }, + { "label": "K20", "x": 0, "y": 2.25, "w": 1.5 }, + { "label": "K21", "x": 1.5, "y": 2.25 }, + { "label": "K22", "x": 2.5, "y": 2.25 }, + { "label": "K23", "x": 3.5, "y": 2.25 }, + { "label": "K24", "x": 4.5, "y": 2.25 }, + { "label": "K25", "x": 5.5, "y": 2.25 }, + { "label": "K26", "x": 6.5, "y": 2.25 }, + { "label": "K27", "x": 7.5, "y": 2.25 }, + { "label": "K28", "x": 8.5, "y": 2.25 }, + { "label": "K29", "x": 9.5, "y": 2.25 }, + { "label": "K2A", "x": 10.5, "y": 2.25 }, + { "label": "K2B", "x": 11.5, "y": 2.25 }, + { "label": "K2C", "x": 12.5, "y": 2.25 }, + { "label": "K2D", "x": 13.5, "y": 2.25, "w": 1.5 }, + { "label": "K2E", "x": 15.25, "y": 2.25 }, + { "label": "K2F", "x": 16.25, "y": 2.25 }, + { "label": "K2G", "x": 17.25, "y": 2.25 }, + { "label": "K30", "x": 0, "y": 3.25, "w": 1.75 }, + { "label": "K31", "x": 1.75, "y": 3.25 }, + { "label": "K32", "x": 2.75, "y": 3.25 }, + { "label": "K33", "x": 3.75, "y": 3.25 }, + { "label": "K34", "x": 4.75, "y": 3.25 }, + { "label": "K35", "x": 5.75, "y": 3.25 }, + { "label": "K36", "x": 6.75, "y": 3.25 }, + { "label": "K37", "x": 7.75, "y": 3.25 }, + { "label": "K38", "x": 8.75, "y": 3.25 }, + { "label": "K39", "x": 9.75, "y": 3.25 }, + { "label": "K3A", "x": 10.75, "y": 3.25 }, + { "label": "K3B", "x": 11.75, "y": 3.25 }, + { "label": "K3C", "x": 12.75, "y": 3.25 }, + { "label": "K3D", "x": 13.75, "y": 3.25, "w": 1.25 }, + { "label": "K40", "x": 0, "y": 4.25, "w": 1.25 }, + { "label": "K41", "x": 1.25, "y": 4.25 }, + { "label": "K42", "x": 2.25, "y": 4.25 }, + { "label": "K43", "x": 3.25, "y": 4.25 }, + { "label": "K44", "x": 4.25, "y": 4.25 }, + { "label": "K45", "x": 5.25, "y": 4.25 }, + { "label": "K46", "x": 6.25, "y": 4.25 }, + { "label": "K47", "x": 7.25, "y": 4.25 }, + { "label": "K48", "x": 8.25, "y": 4.25 }, + { "label": "K49", "x": 9.25, "y": 4.25 }, + { "label": "K4A", "x": 10.25, "y": 4.25 }, + { "label": "K4B", "x": 11.25, "y": 4.25 }, + { "label": "K4C", "x": 12.25, "y": 4.25, "w": 1.75 }, + { "label": "K4D", "x": 14, "y": 4.25 }, + { "label": "K4E", "x": 15.25, "y": 4.25 }, + { "label": "K4F", "x": 16.25, "y": 4.25 }, + { "label": "K4G", "x": 17.25, "y": 4.25 }, + { "label": "K50", "x": 0, "y": 5.25, "w": 1.5 }, + { "label": "K51", "x": 1.5, "y": 5.25 }, + { "label": "K52", "x": 2.5, "y": 5.25, "w": 1.5 }, + { "label": "K55", "x": 4, "y": 5.25, "w": 3 }, + { "label": "K58", "x": 7, "y": 5.25, "w": 3 }, + { "label": "K5A", "x": 10, "y": 5.25, "w": 1.25 }, + { "label": "K5B", "x": 11.25, "y": 5.25, "w": 1.25 }, + { "label": "K5C", "x": 12.5, "y": 5.25, "w": 1.25 }, + { "label": "K5D", "x": 13.75, "y": 5.25, "w": 1.25 }, + { "label": "K5E", "x": 15.25, "y": 5.25 }, + { "label": "K5F", "x": 16.25, "y": 5.25 }, + { "label": "K5G", "x": 17.25, "y": 5.25 } + ] + }, + "LAYOUT_tkl_ansi": { + "layout": [ + { "label": "Esc", "x": 0, "y": 0 }, + { "label": "F1", "x": 2, "y": 0 }, + { "label": "F2", "x": 3, "y": 0 }, + { "label": "F3", "x": 4, "y": 0 }, + { "label": "F4", "x": 5, "y": 0 }, + { "label": "F5", "x": 6.5, "y": 0 }, + { "label": "F6", "x": 7.5, "y": 0 }, + { "label": "F7", "x": 8.5, "y": 0 }, + { "label": "F8", "x": 9.5, "y": 0 }, + { "label": "F9", "x": 11, "y": 0 }, + { "label": "F10", "x": 12, "y": 0 }, + { "label": "F11", "x": 13, "y": 0 }, + { "label": "F12", "x": 14, "y": 0 }, + { "label": "Print Screen", "x": 15.25, "y": 0 }, + { "label": "Scroll Lock", "x": 16.25, "y": 0 }, + { "label": "Pause", "x": 17.25, "y": 0 }, + { "label": "`", "x": 0, "y": 1.25 }, + { "label": "1", "x": 1, "y": 1.25 }, + { "label": "2", "x": 2, "y": 1.25 }, + { "label": "3", "x": 3, "y": 1.25 }, + { "label": "4", "x": 4, "y": 1.25 }, + { "label": "5", "x": 5, "y": 1.25 }, + { "label": "6", "x": 6, "y": 1.25 }, + { "label": "7", "x": 7, "y": 1.25 }, + { "label": "8", "x": 8, "y": 1.25 }, + { "label": "9", "x": 9, "y": 1.25 }, + { "label": "0", "x": 10, "y": 1.25 }, + { "label": "-", "x": 11, "y": 1.25 }, + { "label": "=", "x": 12, "y": 1.25 }, + { "label": "Backspace", "x": 13, "y": 1.25, "w": 2 }, + { "label": "Insert", "x": 15.25, "y": 1.25 }, + { "label": "Home", "x": 16.25, "y": 1.25 }, + { "label": "PgUp", "x": 17.25, "y": 1.25 }, + { "label": "Tab", "x": 0, "y": 2.25, "w": 1.5 }, + { "label": "Q", "x": 1.5, "y": 2.25 }, + { "label": "W", "x": 2.5, "y": 2.25 }, + { "label": "E", "x": 3.5, "y": 2.25 }, + { "label": "R", "x": 4.5, "y": 2.25 }, + { "label": "T", "x": 5.5, "y": 2.25 }, + { "label": "Y", "x": 6.5, "y": 2.25 }, + { "label": "U", "x": 7.5, "y": 2.25 }, + { "label": "I", "x": 8.5, "y": 2.25 }, + { "label": "O", "x": 9.5, "y": 2.25 }, + { "label": "P", "x": 10.5, "y": 2.25 }, + { "label": "[", "x": 11.5, "y": 2.25 }, + { "label": "]", "x": 12.5, "y": 2.25 }, + { "label": "\\", "x": 13.5, "y": 2.25, "w": 1.5 }, + { "label": "Delete", "x": 15.25, "y": 2.25 }, + { "label": "End", "x": 16.25, "y": 2.25 }, + { "label": "PgDn", "x": 17.25, "y": 2.25 }, + { "label": "Caps Lock", "x": 0, "y": 3.25, "w": 1.75 }, + { "label": "A", "x": 1.75, "y": 3.25 }, + { "label": "S", "x": 2.75, "y": 3.25 }, + { "label": "D", "x": 3.75, "y": 3.25 }, + { "label": "F", "x": 4.75, "y": 3.25 }, + { "label": "G", "x": 5.75, "y": 3.25 }, + { "label": "H", "x": 6.75, "y": 3.25 }, + { "label": "J", "x": 7.75, "y": 3.25 }, + { "label": "K", "x": 8.75, "y": 3.25 }, + { "label": "L", "x": 9.75, "y": 3.25 }, + { "label": ";", "x": 10.75, "y": 3.25 }, + { "label": "'", "x": 11.75, "y": 3.25 }, + { "label": "Enter", "x": 12.75, "y": 3.25, "w": 2.25 }, + { "label": "Shift", "x": 0, "y": 4.25, "w": 2.25 }, + { "label": "Z", "x": 2.25, "y": 4.25 }, + { "label": "X", "x": 3.25, "y": 4.25 }, + { "label": "C", "x": 4.25, "y": 4.25 }, + { "label": "V", "x": 5.25, "y": 4.25 }, + { "label": "B", "x": 6.25, "y": 4.25 }, + { "label": "N", "x": 7.25, "y": 4.25 }, + { "label": "M", "x": 8.25, "y": 4.25 }, + { "label": ",", "x": 9.25, "y": 4.25 }, + { "label": ".", "x": 10.25, "y": 4.25 }, + { "label": "/", "x": 11.25, "y": 4.25 }, + { "label": "Shift", "x": 12.25, "y": 4.25, "w": 2.75 }, + { "label": "Up", "x": 16.25, "y": 4.25 }, + { "label": "Ctrl", "x": 0, "y": 5.25, "w": 1.25 }, + { "label": "Win", "x": 1.25, "y": 5.25, "w": 1.25 }, + { "label": "Alt", "x": 2.5, "y": 5.25, "w": 1.25 }, + { "label": "Space", "x": 3.75, "y": 5.25, "w": 6.25 }, + { "label": "Alt", "x": 10, "y": 5.25, "w": 1.25 }, + { "label": "Win", "x": 11.25, "y": 5.25, "w": 1.25 }, + { "label": "Menu", "x": 12.5, "y": 5.25, "w": 1.25 }, + { "label": "Ctrl", "x": 13.75, "y": 5.25, "w": 1.25 }, + { "label": "Left", "x": 15.25, "y": 5.25 }, + { "label": "Down", "x": 16.25, "y": 5.25 }, + { "label": "Right", "x": 17.25, "y": 5.25 } + ] + }, + "LAYOUT_tkl_iso": { + "layout": [ + { "label": "Esc", "x": 0, "y": 0 }, + { "label": "F1", "x": 2, "y": 0 }, + { "label": "F2", "x": 3, "y": 0 }, + { "label": "F3", "x": 4, "y": 0 }, + { "label": "F4", "x": 5, "y": 0 }, + { "label": "F5", "x": 6.5, "y": 0 }, + { "label": "F6", "x": 7.5, "y": 0 }, + { "label": "F7", "x": 8.5, "y": 0 }, + { "label": "F8", "x": 9.5, "y": 0 }, + { "label": "F9", "x": 11, "y": 0 }, + { "label": "F10", "x": 12, "y": 0 }, + { "label": "F11", "x": 13, "y": 0 }, + { "label": "F12", "x": 14, "y": 0 }, + { "label": "Print Screen", "x": 15.25, "y": 0 }, + { "label": "Scroll Lock", "x": 16.25, "y": 0 }, + { "label": "Pause", "x": 17.25, "y": 0 }, + { "label": "`", "x": 0, "y": 1.25 }, + { "label": "1", "x": 1, "y": 1.25 }, + { "label": "2", "x": 2, "y": 1.25 }, + { "label": "3", "x": 3, "y": 1.25 }, + { "label": "4", "x": 4, "y": 1.25 }, + { "label": "5", "x": 5, "y": 1.25 }, + { "label": "6", "x": 6, "y": 1.25 }, + { "label": "7", "x": 7, "y": 1.25 }, + { "label": "8", "x": 8, "y": 1.25 }, + { "label": "9", "x": 9, "y": 1.25 }, + { "label": "0", "x": 10, "y": 1.25 }, + { "label": "-", "x": 11, "y": 1.25 }, + { "label": "=", "x": 12, "y": 1.25 }, + { "label": "Backspace", "x": 13, "y": 1.25, "w": 2 }, + { "label": "Insert", "x": 15.25, "y": 1.25 }, + { "label": "Home", "x": 16.25, "y": 1.25 }, + { "label": "PgUp", "x": 17.25, "y": 1.25 }, + { "label": "Tab", "x": 0, "y": 2.25, "w": 1.5 }, + { "label": "Q", "x": 1.5, "y": 2.25 }, + { "label": "W", "x": 2.5, "y": 2.25 }, + { "label": "E", "x": 3.5, "y": 2.25 }, + { "label": "R", "x": 4.5, "y": 2.25 }, + { "label": "T", "x": 5.5, "y": 2.25 }, + { "label": "Y", "x": 6.5, "y": 2.25 }, + { "label": "U", "x": 7.5, "y": 2.25 }, + { "label": "I", "x": 8.5, "y": 2.25 }, + { "label": "O", "x": 9.5, "y": 2.25 }, + { "label": "P", "x": 10.5, "y": 2.25 }, + { "label": "[", "x": 11.5, "y": 2.25 }, + { "label": "]", "x": 12.5, "y": 2.25 }, + { "label": "Delete", "x": 15.25, "y": 2.25 }, + { "label": "End", "x": 16.25, "y": 2.25 }, + { "label": "PgDn", "x": 17.25, "y": 2.25 }, + { "label": "Caps Lock", "x": 0, "y": 3.25, "w": 1.75 }, + { "label": "A", "x": 1.75, "y": 3.25 }, + { "label": "S", "x": 2.75, "y": 3.25 }, + { "label": "D", "x": 3.75, "y": 3.25 }, + { "label": "F", "x": 4.75, "y": 3.25 }, + { "label": "G", "x": 5.75, "y": 3.25 }, + { "label": "H", "x": 6.75, "y": 3.25 }, + { "label": "J", "x": 7.75, "y": 3.25 }, + { "label": "K", "x": 8.75, "y": 3.25 }, + { "label": "L", "x": 9.75, "y": 3.25 }, + { "label": ";", "x": 10.75, "y": 3.25 }, + { "label": "'", "x": 11.75, "y": 3.25 }, + { "label": "#", "x": 12.75, "y": 3.25 }, + { "label": "Enter", "x": 13.75, "y": 2.25, "w": 1.25, "h": 2 }, + { "label": "Shift", "x": 0, "y": 4.25, "w": 1.25 }, + { "label": "\\", "x": 1.25, "y": 4.25 }, + { "label": "Z", "x": 2.25, "y": 4.25 }, + { "label": "X", "x": 3.25, "y": 4.25 }, + { "label": "C", "x": 4.25, "y": 4.25 }, + { "label": "V", "x": 5.25, "y": 4.25 }, + { "label": "B", "x": 6.25, "y": 4.25 }, + { "label": "N", "x": 7.25, "y": 4.25 }, + { "label": "M", "x": 8.25, "y": 4.25 }, + { "label": ",", "x": 9.25, "y": 4.25 }, + { "label": ".", "x": 10.25, "y": 4.25 }, + { "label": "/", "x": 11.25, "y": 4.25 }, + { "label": "Shift", "x": 12.25, "y": 4.25, "w": 2.75 }, + { "label": "Up", "x": 16.25, "y": 4.25 }, + { "label": "Ctrl", "x": 0, "y": 5.25, "w": 1.25 }, + { "label": "Win", "x": 1.25, "y": 5.25, "w": 1.25 }, + { "label": "Alt", "x": 2.5, "y": 5.25, "w": 1.25 }, + { "label": "Space", "x": 3.75, "y": 5.25, "w": 6.25 }, + { "label": "AltGr", "x": 10, "y": 5.25, "w": 1.25 }, + { "label": "Win", "x": 11.25, "y": 5.25, "w": 1.25 }, + { "label": "Menu", "x": 12.5, "y": 5.25, "w": 1.25 }, + { "label": "Ctrl", "x": 13.75, "y": 5.25, "w": 1.25 }, + { "label": "Left", "x": 15.25, "y": 5.25 }, + { "label": "Down", "x": 16.25, "y": 5.25 }, + { "label": "Right", "x": 17.25, "y": 5.25 } + ] + } + } +} From 5630ad7604f7a8243ef9b643a4409fc8f9f96ed0 Mon Sep 17 00:00:00 2001 From: That-Canadian Date: Wed, 31 Oct 2018 17:42:15 -0400 Subject: [PATCH 425/788] Added JTAG disable code to the split_common (#4309) Added JTAG disable code to the split_common slave code since the slave never calls keyboard_init(). In the future the slave should likely be modified to call keyboard_init() in some way, but without calling any of the unnecessary USB initialization code. --- quantum/split_common/split_util.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/quantum/split_common/split_util.c b/quantum/split_common/split_util.c index 7c87de4d9..7ca68c56c 100644 --- a/quantum/split_common/split_util.c +++ b/quantum/split_common/split_util.c @@ -93,6 +93,10 @@ void split_keyboard_setup(void) { } void keyboard_slave_loop(void) { + // Disable JTAG since we skip calling keyboard_init() on the slave side + // Future fix will possible call keyboard_init() on the slave to remove this need + disable_JTAG(); + matrix_init(); //Init RGB @@ -152,3 +156,13 @@ void matrix_setup(void) { keyboard_slave_loop(); } } + +// Temporary code to disable JTAG on the slave board +void disable_JTAG(void) { + /* Copied from tmk_core/common/keybaord.c */ + // To use PORTF disable JTAG with writing JTD bit twice within four cycles. + #if (defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__) || defined(__AVR_ATmega32U4__)) + MCUCR |= _BV(JTD); + MCUCR |= _BV(JTD); + #endif +} From bd6d6d93f26578baf7ef1d05d51963d8c38ee7c9 Mon Sep 17 00:00:00 2001 From: Danny Date: Wed, 31 Oct 2018 17:43:39 -0400 Subject: [PATCH 426/788] Update iris 3 (#4307) * Fix incorrect LED pin assignment * Strip out extra newline --- keyboards/iris/rev1/config.h | 1 - keyboards/iris/rev1_led/config.h | 1 - keyboards/iris/rev2/config.h | 1 - keyboards/iris/rev3/config.h | 3 +-- 4 files changed, 1 insertion(+), 5 deletions(-) diff --git a/keyboards/iris/rev1/config.h b/keyboards/iris/rev1/config.h index 3c088f671..7f76df54b 100644 --- a/keyboards/iris/rev1/config.h +++ b/keyboards/iris/rev1/config.h @@ -63,7 +63,6 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 - #define RGBLED_NUM 12 // Number of LEDs /* diff --git a/keyboards/iris/rev1_led/config.h b/keyboards/iris/rev1_led/config.h index d8571f8da..b58b11836 100644 --- a/keyboards/iris/rev1_led/config.h +++ b/keyboards/iris/rev1_led/config.h @@ -63,7 +63,6 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 - #define RGBLED_NUM 12 // Number of LEDs /* diff --git a/keyboards/iris/rev2/config.h b/keyboards/iris/rev2/config.h index 087e0f69e..266c29b9c 100644 --- a/keyboards/iris/rev2/config.h +++ b/keyboards/iris/rev2/config.h @@ -63,7 +63,6 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 - #define RGBLED_NUM 12 // Number of LEDs /* diff --git a/keyboards/iris/rev3/config.h b/keyboards/iris/rev3/config.h index 3329a4edb..1032231d8 100644 --- a/keyboards/iris/rev3/config.h +++ b/keyboards/iris/rev3/config.h @@ -58,12 +58,11 @@ along with this program. If not, see . keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -#define BACKLIGHT_PIN B5 +#define BACKLIGHT_PIN B6 #define BACKLIGHT_LEVELS 5 /* ws2812 RGB LED */ #define RGB_DI_PIN F7 - #define RGBLED_NUM 12 // Number of LEDs /* From f63c0b784490a04069b59f1b77355d5982f55ceb Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Wed, 31 Oct 2018 15:14:59 -0700 Subject: [PATCH 427/788] Add pointer(?) to disable_JTAG to prevent compiler errors (#4310) --- quantum/split_common/split_util.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/quantum/split_common/split_util.c b/quantum/split_common/split_util.c index 7ca68c56c..8d39329d4 100644 --- a/quantum/split_common/split_util.c +++ b/quantum/split_common/split_util.c @@ -92,13 +92,14 @@ void split_keyboard_setup(void) { sei(); } +void disable_JTAG(void); void keyboard_slave_loop(void) { // Disable JTAG since we skip calling keyboard_init() on the slave side // Future fix will possible call keyboard_init() on the slave to remove this need disable_JTAG(); - + matrix_init(); - + //Init RGB #ifdef RGBLIGHT_ENABLE rgblight_init(); @@ -107,7 +108,7 @@ void keyboard_slave_loop(void) { while (1) { // Matrix Slave Scan matrix_slave_scan(); - + // Read Backlight Info #ifdef BACKLIGHT_ENABLE #ifdef USE_I2C @@ -126,14 +127,14 @@ void keyboard_slave_loop(void) { // Disable interupts (RGB data is big) cli(); // Create new DWORD for RGB data - uint32_t dword; - + uint32_t dword; + // Fill the new DWORD with the data that was sent over uint8_t *dword_dat = (uint8_t *)(&dword); for (int i = 0; i < 4; i++) { dword_dat[i] = i2c_slave_buffer[I2C_RGB_START+i]; } - + // Update the RGB now with the new data and set RGB_DIRTY to false rgblight_update_dword(dword); RGB_DIRTY = false; From 99740c670a4ece47095ec91d2ca71e56d7dd244c Mon Sep 17 00:00:00 2001 From: Jason Thigpen Date: Wed, 31 Oct 2018 22:27:57 -0700 Subject: [PATCH 428/788] Add some more useful features to my alps64 AEK layout (#4312) * Add mod-tap to right mods and shift * Add del to fn1 layer and add fn2 layer for media and pcb debug --- keyboards/alps64/keymaps/crd/keymap.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/keyboards/alps64/keymaps/crd/keymap.c b/keyboards/alps64/keymaps/crd/keymap.c index a47ad8650..4f3ea446e 100644 --- a/keyboards/alps64/keymaps/crd/keymap.c +++ b/keyboards/alps64/keymaps/crd/keymap.c @@ -6,17 +6,26 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, _______, KC_BSPC, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, - KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______, KC_RSFT, - MO(1), KC_LALT, KC_LGUI, KC_SPC, _______, KC_RGUI, KC_RALT, MO(2) + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, RSFT_T(KC_UP), _______, + MO(1), KC_LALT, KC_LGUI, KC_SPC, _______, RGUI_T(KC_LEFT), RALT_T(KC_DOWN), LT(2, KC_RIGHT) ), /* 1: fn1 */ LAYOUT_all( - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_DEL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_END, KC_PGDOWN, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), -}; + /* 2: fn2 */ + LAYOUT_all( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, RESET, _______, _______, _______, _______, _______, KC_VOLD, KC_MUTE, KC_VOLU, _______, + _______, _______, _______, DEBUG, _______, _______, _______, _______, _______, _______, KC_SCROLLLOCK, KC_PAUSE, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______ + ), +} +; const uint16_t PROGMEM fn_actions[] = {}; From 153d1ecfcc60ad84139cd95a03d08e0e4b7d11ec Mon Sep 17 00:00:00 2001 From: Jason Yamada-Hanff Date: Thu, 1 Nov 2018 16:52:47 -0700 Subject: [PATCH 429/788] Keymap: add jyh levinson keymaps (#4284) * Keymap: add jyh levinson keymaps remove tap dance number keys due to sluggish responses simplify I2C configuration reverse hyper and meh positions reduce tapping term to allow fast typing with mod tap space keys remove Alt hold on right space key. too many false touches. add vim-style arrows (hjkl) on asdf; semicolon/quote on raise correct documentation string for jyh levinson layout add alternative levinson layout for jyh more inspiration from atreus keyboard. keeps shift in the expected places. reduces number of layers. puts numpad layout easily accessible. places important keys on palms and meta keys on top corners for xmonad. correct layer switching in jyh2 levinson layout I was getting stuck on the numpad layer because the numpad hold key was remapped once the layer was activated. Bad idea. Minor other refinements. use curly bracket { instead of brace [ on raise layer add RGB keys on adjust layer bootmagic key is confusing. turn it off. try out permissive hold setting to make mod-tap better remove hold for right control on quote key. too many mistakes turn off permissive hold. it was causing unexpected behavior enable rgb underglow animations add make it pink/blue key to levinson layout prevent stuck modifiers in jyh2 levinson keymap * fix up deprecated code after code review * remove PREVENT_STUCK_MODIFIERS because it is default Co-Authored-By: yamad --- keyboards/levinson/keymaps/jyh/config.h | 29 +++ keyboards/levinson/keymaps/jyh/keymap.c | 215 +++++++++++++++++++++ keyboards/levinson/keymaps/jyh/readme.md | 32 ++++ keyboards/levinson/keymaps/jyh/rules.mk | 1 + keyboards/levinson/keymaps/jyh2/config.h | 33 ++++ keyboards/levinson/keymaps/jyh2/keymap.c | 222 ++++++++++++++++++++++ keyboards/levinson/keymaps/jyh2/readme.md | 32 ++++ keyboards/levinson/keymaps/jyh2/rules.mk | 2 + 8 files changed, 566 insertions(+) create mode 100644 keyboards/levinson/keymaps/jyh/config.h create mode 100644 keyboards/levinson/keymaps/jyh/keymap.c create mode 100644 keyboards/levinson/keymaps/jyh/readme.md create mode 100644 keyboards/levinson/keymaps/jyh/rules.mk create mode 100644 keyboards/levinson/keymaps/jyh2/config.h create mode 100644 keyboards/levinson/keymaps/jyh2/keymap.c create mode 100644 keyboards/levinson/keymaps/jyh2/readme.md create mode 100644 keyboards/levinson/keymaps/jyh2/rules.mk diff --git a/keyboards/levinson/keymaps/jyh/config.h b/keyboards/levinson/keymaps/jyh/config.h new file mode 100644 index 000000000..d3e598bd0 --- /dev/null +++ b/keyboards/levinson/keymaps/jyh/config.h @@ -0,0 +1,29 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ +#pragma once + +/* Select hand configuration */ +#define MASTER_LEFT + +/* Tap Dance timing */ +#define TAPPING_TERM 150 + +/* Toggling layer requires # taps */ +#define TAPPING_TOGGLE 2 diff --git a/keyboards/levinson/keymaps/jyh/keymap.c b/keyboards/levinson/keymaps/jyh/keymap.c new file mode 100644 index 000000000..d8cfa7e06 --- /dev/null +++ b/keyboards/levinson/keymaps/jyh/keymap.c @@ -0,0 +1,215 @@ +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _LOWER 3 /* Symbols, Media */ +#define _RAISE 4 /* Numbers, Arrows */ +#define _FUNC 5 /* Function Keys */ +#define _NUMS 6 /* Numpad */ +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + LOWER, + RAISE, + ADJUST, +}; + +// Fillers to make layering more clear +#define KC_ KC_TRNS + +// tap toggle numpad on +#define NUMPAD TT(_NUMS) + +// Mod Tap Definitions +// ------------------- + // Tap Hold + // ------------------ +#define CTL_ESC MT(MOD_LCTL, KC_ESC) // Esc Left Control +#define SFT_ENT MT(MOD_RSFT, KC_ENT) // Enter Right Shift +#define CTL_SPC MT(MOD_LCTL, KC_SPC) // Space Left Control +#define ALT_SPC MT(MOD_LALT, KC_SPC) // Space Left Alt +#define ALT_BSP MT(MOD_LALT, KC_BSPC) // Bkspace Left Alt +#define HPR_TAB MT(MOD_HYPR, KC_TAB) // Tab Hyper (Super+Ctrl+Alt+Shift) +#define HPR_GRV MT(MOD_HYPR, KC_GRV) // ` Hyper +#define HPR_TIL MT(MOD_HYPR, KC_TILD) // ~ Hyper +#define MEH_TIL MT(MOD_MEH, KC_GRV) // ` Meh (Ctrl+Alt+Shift) +#define SFT_MIN MT(MOD_LSFT, KC_MINS) // - Left Shift +#define NPD_UND LT(_NUMS, KC_UNDS) // _ Layer Numpad +#define FNC_PIP LT(_FUNC, KC_PIPE) // | Layer Function Keys + +#define CTL_DEL MT(MOD_LCTL, KC_DEL) // Del Left Control +#define CTL_QOT MT(MOD_RCTL, KC_QUOT) // ' Right Control +#define CTL_BSL MT(MOD_RCTL, KC_BSLS) // \ Right Control +#define CTL_PIP MT(MOD_RCTL, KC_PIPE) // | Right Control + +// Redefine for LAYOUT_kc +#define KC_CTL_BSL CTL_BSL +#define KC_CTL_PIP CTL_PIP +#define KC_CTL_DEL CTL_DEL +#define KC_HPR_TIL HPR_TIL +#define KC_HPR_GRV HPR_GRV + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * + * ,-----------------------------------------. ,-----------------------------------------. + * | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Esc | A | S | D | F | G | | H | J | K | L | ; | ' | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | - | Z | X | C | V | B | | N | M | , | . | / | Enter| + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Numpd| Meh | Meta | Alt | Lower| Space| | Space| Raise| Alt | Meta | Hyper| Func | + * `-----------------------------------------' `-----------------------------------------' + * + * with Hold (Emacs-oriented) + * ,-----------------------------------------. ,-----------------------------------------. + * | Hyper| | | | | | | | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | | | | | | | | | | | | Ctrl | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shift| | | | | | | | | | | | Shift| + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | | | | | + * `-----------------------------------------' `-----------------------------------------' + */ + [_QWERTY] = LAYOUT_ortho_4x12( + HPR_TAB, KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , KC_BSPC, + CTL_ESC, KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_SCLN, CTL_QOT, + SFT_MIN, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, SFT_ENT, + NUMPAD , KC_MEH , KC_LGUI, KC_LALT, LOWER, CTL_SPC, KC_SPC, RAISE, KC_RALT, KC_RGUI, KC_HYPR, MO(_FUNC) + ), + + +/* Raise + * ,-----------------------------------------. ,-----------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | Left | Up | Down | Right| ( | | ) | - | = | [ | ] | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | ; | ' | * | , | { | | } | _ | + | . | / | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | | | | | + * `-----------------------------------------' `-----------------------------------------' + */ + [_RAISE] = LAYOUT_kc_ortho_4x12( + HPR_GRV, 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 , , + ,LEFT, UP ,DOWN,RGHT,LPRN, RPRN,MINS, EQL,LBRC,RBRC,CTL_PIP, + ,COLN,QUOT,ASTR,COMM,LCBR, RCBR,UNDS,PLUS, , , , + , , , , , , , , , , , + ), + +/* Lower + * ,-----------------------------------------. ,-----------------------------------------. + * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Del | Vol+ | Mute | Play | PgUp | : | | ' | - | = | [ | ] | \ | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | Vol- | < M | M > | PgDn | ; | | " | | | , | . | / | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | | | | | + * `-----------------------------------------' `-----------------------------------------' + */ + [_LOWER] = LAYOUT_kc_ortho_4x12( + HPR_TIL,EXLM, AT ,HASH,DLR , PERC , CIRC,AMPR,ASTR,LPRN,RPRN, , + CTL_DEL,VOLU,MUTE,MPLY,PGUP, COLN , QUOT,MINS, EQL,LBRC,RBRC,CTL_BSL, + ,VOLD,MPRV,MNXT,PGDN, SCLN , DQUO,PIPE,COMM, DOT,SLSH, , + , , , , , , , , , , , + ), + + [_FUNC] = LAYOUT_kc_ortho_4x12( +// ,----+----+----+----+----+----. ,----+----+----+----+----+----. + , F1 , F2 , F3 , F4 , F5 , F6 , F7 , F8 , F9 , F10, , +// |----+----+----+----+----+----| |----+----+----+----+----+----| + , F11, F12, F13, F14, F15, F16, F17, F18, F19, F20, , +// |----+----+----+----+----+----| |----+----+----+----+----+----| + , F21, F22, F23, F24, NO , NO , NO , NO , NO , NO , , +// |----+----+----+----+----+----| |----+----+----+----+----+----| + , , , , , , , , , , , +// `----+----+----+----+----+----' `----+----+----+----+----+----' + ), + + [_NUMS] = LAYOUT_kc_ortho_4x12( +// ,----+----+----+----+----+----. ,----+----+----+----+----+----. + , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ,SLSH, , +// |----+----+----+----+----+----| |----+----+----+----+----+----| + ,CAPS, INS,HOME,PGUP,LPRN, RPRN, 4 , 5 , 6 ,ASTR, , +// |----+----+----+----+----+----| |----+----+----+----+----+----| + ,NLCK, DEL, END,PGDN,SCLN, COMM, 1 , 2 , 3 ,MINS, , +// |----+----+----+----+----+----| |----+----+----+----+----+----| + , , , , , , , 0 ,DOT ,EQL ,PLUS, +// `----+----+----+----+----+----' `----+----+----+----+----+----' + ), + + [_ADJUST] = LAYOUT_ortho_4x12( +// ,-------+--------+--------+--------+--------+--------. ,-------+--------+--------+--------+--------+--------. + RESET , XXXXXXX, KC_UP , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_DEL , \ +// |-------+--------+--------+--------+--------+--------| |-------+--------+--------+--------+--------+--------| + _______, KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX, XXXXXXX, BL_TOGG, BL_STEP, XXXXXXX, XXXXXXX, XXXXXXX, _______, \ +// |-------+--------+--------+--------+--------+--------| |-------+--------+--------+--------+--------+--------| + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, \ +// |-------+--------+--------+--------+--------+--------| |-------+--------+--------+--------+--------+--------| + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ +// `-------+--------+--------+--------+--------+--------' `-------+--------+--------+--------+--------+--------, + ) + +/* + * ,-----------------------------------------. ,-----------------------------------------. + * | | | | | | | | | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | | | | | + * `-----------------------------------------' `-----------------------------------------' + */ +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + break; + } + return true; +} diff --git a/keyboards/levinson/keymaps/jyh/readme.md b/keyboards/levinson/keymaps/jyh/readme.md new file mode 100644 index 000000000..e20424e51 --- /dev/null +++ b/keyboards/levinson/keymaps/jyh/readme.md @@ -0,0 +1,32 @@ +# jyh's levinson layout + +[Levinson](https://keeb.io/products/levinson-lets-split-w-led-backlight) +built on rev2 PCBs. A split 4x12 keyboard with LED backlights. + +The layout is oriented towards needs for programming, Emacs, XMonad, +and experience with 60% keyboards with no base layer arrow keys +(Poker). It makes heavy use of modifiers and layers. + +## Layout features + + * Extensive use of _Mod Tap_, e.g. + * Tap sends Esc, Hold sends Left Control + * Tap sends Enter, Hold sends Right Shift + * ... and many more + * Hyper and Meh keys + * Right modifier keys in place of arrow keys + * Arrows are instead available in two alternate locations: + * WASD arrows on _Adjust_ + * Arrow cluster on _Raise_ (inspired by hexwire) + * Centered symbol/bracket cluster on _Lower/Raise_ + * Inspired by hexwire layout + * Programming-oriented + * Spacebar sends modifier keys on hold (_this is finicky in practice. may shut off completely_) + * Control ~~and Alt/Meta~~ on left ~~and right~~ space, respectively + * Strict space available on _Function_ and _Numpad_ layers + * For Emacs keychords + * Extra dedicated layers + * Numpad (available with tap toggle) + * Function key (F01-24) + * Redunant keys where it is convenient to have characters together + on one layer diff --git a/keyboards/levinson/keymaps/jyh/rules.mk b/keyboards/levinson/keymaps/jyh/rules.mk new file mode 100644 index 000000000..66110cfcc --- /dev/null +++ b/keyboards/levinson/keymaps/jyh/rules.mk @@ -0,0 +1 @@ +BACKLIGHT_ENABLE=yes diff --git a/keyboards/levinson/keymaps/jyh2/config.h b/keyboards/levinson/keymaps/jyh2/config.h new file mode 100644 index 000000000..f50674bb8 --- /dev/null +++ b/keyboards/levinson/keymaps/jyh2/config.h @@ -0,0 +1,33 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ +#pragma once + +/* Select hand configuration */ +#define MASTER_LEFT + +/* Tap Dance timing */ +#define TAPPING_TERM 150 + +/* Toggling layer requires # taps */ +#define TAPPING_TOGGLE 3 + +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 12 + diff --git a/keyboards/levinson/keymaps/jyh2/keymap.c b/keyboards/levinson/keymaps/jyh2/keymap.c new file mode 100644 index 000000000..4b7442928 --- /dev/null +++ b/keyboards/levinson/keymaps/jyh2/keymap.c @@ -0,0 +1,222 @@ +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _LOWER 3 /* Symbols, Media */ +#define _RAISE 4 /* Numbers, Arrows */ +#define _FUNC 5 /* Function Keys */ +#define _NUMS 6 /* Numpad */ +#define _ADJUST 16 + +/* short layer aliases */ +#define _QW _QWERTY +#define _LW _LOWER +#define _RS _RAISE +#define _NM _NUMS +#define _AD _ADJUST + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + LOWER, + RAISE, + ADJUST, + MKITPNK, + DYNAMIC_MACRO_RANGE +}; + +#include "dynamic_macro.h" + +#define DREC_1 DYN_REC_START1 +#define DREC_2 DYN_REC_START2 +#define DPLAY_1 DYN_MACRO_PLAY1 +#define DPLAY_2 DYN_MACRO_PLAY2 +#define DSTOP DYN_REC_STOP + + +// Mod Tap Definitions +// ------------------- + // Tap Hold + // ------------------ +#define GUI_GRV MT(MOD_LGUI, KC_GRV) // ` Meta +#define CTL_ESC MT(MOD_LCTL, KC_ESC) // Esc Left Control +#define SFT_MIN MT(MOD_LSFT, KC_MINS) // - Left Shift +#define MEH_LBC MT(MOD_MEH, KC_LBRC) // [ Meh +#define CTL_BSP MT(MOD_LCTL, KC_BSPC) // Bkspce Left Control +#define HPR_RBC MT(MOD_HYPR, KC_RBRC) // ] Hyper +#define SFT_EQL MT(MOD_RSFT, KC_EQL) // = Right Shift +#define GUI_BSL MT(MOD_RGUI, KC_BSLS) // \ Meta + +#define NUM_TAB LT(_NUMS, KC_TAB) // Tab Layer Numpad + +#define CTL_DEL MT(MOD_LCTL, KC_DEL) // Del Left Control + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------. ,-----------------------------------------. + * | ` | Q | W | E | R | T | | Y | U | I | O | P | \ | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Esc | A | S | D | F | G | | H | J | K | L | ; | ' | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | - | Z | X | C | V | B | | N | M | , | . | / | = | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | [ | Meta | Alt | Lower| Bksp | | Space| Raise| Alt | Meta | ] | Enter| + * `-----------------------------------------' `-----------------------------------------' + * with Hold (Emacs-oriented) + * ,-----------------------------------------. ,-----------------------------------------. + * | Meta | | | | | | | | | | | | Meta | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | | | | | | | | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shift| | | | | | | | | | | | Shift| + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Numpd| Meh | | | | Ctrl | | | | | | Hyper| | + * `-----------------------------------------' `-----------------------------------------' + */ + [_QW] = LAYOUT_ortho_4x12( + GUI_GRV, KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , GUI_BSL, + CTL_ESC, KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_SCLN, KC_QUOT, + SFT_MIN, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, SFT_EQL, + NUM_TAB, MEH_LBC, KC_LGUI, KC_LALT, LOWER , CTL_BSP, KC_SPC , RAISE , KC_RALT, KC_RGUI, HPR_RBC, KC_ENT + ), + +/* Raise + * ,-----------------------------------------. ,-----------------------------------------. + * | | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | Left | Up | Down | Right| ; | | ' | 4 | 5 | 6 | * | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | { | } | ( | ) | , | | - | 1 | 2 | 3 | / | = | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | |Adjust| | | | RAISE| . | 0 | + | Enter| + * `-----------------------------------------' `-----------------------------------------' + */ + [_RS] = LAYOUT_ortho_4x12( + _______, KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , _______, + _______, KC_LEFT, KC_UP , KC_DOWN, KC_RGHT, KC_SCLN, KC_QUOT, KC_4 , KC_5 , KC_6 , KC_ASTR, _______, + _______, KC_LCBR, KC_RCBR, KC_LPRN, KC_RPRN, KC_COMM, KC_MINS, KC_1 , KC_2 , KC_3 , KC_SLSH, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_DOT , KC_0 , KC_PLUS, _______ + ), + +/* Lower + * ,-----------------------------------------. ,-----------------------------------------. + * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Del | Vol+ | Mute | Play | PgUp | Home | | F1 | F2 | F3 | F4 | F5 | F6 | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | Vol- | < M | M > | PgDn | End | | F7 | F8 | F9 | F10 | F11 | F12 | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | |LOWER | | | |Adjust| | | | Enter| + * `-----------------------------------------' `-----------------------------------------' + */ + [_LW] = LAYOUT_ortho_4x12( + _______, KC_EXLM, KC_AT , KC_HASH, KC_DLR , KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, + CTL_DEL, KC_VOLU, KC_MUTE, KC_MPLY, KC_PGUP, KC_HOME, KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , + _______, KC_VOLD, KC_MPRV, KC_MNXT, KC_PGDN, KC_END , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , KC_F12 , + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + +/* Numpad + * ,-----------------------------------------. ,-----------------------------------------. + * | | | PrSc | ScrLk| Pause| | | | 7 | 8 | 9 | 0 | Lock | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | Ins | Home | PgUp | | | | 4 | 5 | 6 | / | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | Del | End | PgDn | | | | 1 | 2 | 3 | * | = | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * |NUMPAD| | | | | | | | 0 | . | + | - | Enter| + * `-----------------------------------------' `-----------------------------------------' + */ + [_NM] = LAYOUT_ortho_4x12( + XXXXXXX, XXXXXXX, KC_PSCR, KC_SLCK, KC_PAUS, XXXXXXX, XXXXXXX, KC_7 , KC_8 , KC_9 , KC_0 , TO(_NM), + XXXXXXX, XXXXXXX, KC_INS , KC_HOME, KC_PGUP, XXXXXXX, XXXXXXX, KC_4 , KC_5 , KC_6 , KC_SLSH, XXXXXXX, + XXXXXXX, XXXXXXX, KC_DEL , KC_END , KC_PGDN, XXXXXXX, XXXXXXX, KC_1 , KC_2 , KC_3 , KC_ASTR, KC_EQL , + _______, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, KC_0 , KC_DOT , KC_PLUS, KC_MINS, _______ + ), + +/* Adjust + * ,-----------------------------------------. ,-----------------------------------------. + * | Reset| | Up | | | Rec1 | | Rec2 | Plain| Snake|Gradnt| | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Caps | Left | Down | Right|MkItPk| Play1| | Play2| RGB | HUE+ | SAT+ | BRI+ | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | Stop1| | Stop2| MODE | HUE- | SAT- | BRI- | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | | | | | + * `-----------------------------------------' `-----------------------------------------' + */ + [_ADJUST] = LAYOUT_ortho_4x12( + RESET , XXXXXXX, KC_UP , XXXXXXX, XXXXXXX, DREC_1 , DREC_2 , RGB_M_P, RGB_M_SN,RGB_M_G, XXXXXXX, KC_DEL , + KC_CAPS, KC_LEFT, KC_DOWN, KC_RGHT, MKITPNK, DPLAY_1, DPLAY_2, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, _______, + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, DSTOP , DSTOP , RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ) +}; + +void make_it_pink_blue(void) { + uint16_t blue_hue = 210; + uint16_t pink_hue = 315; + + /* key is pressed */ + uint16_t hue = rgblight_get_hue(); + uint8_t sat = rgblight_get_sat(); + uint8_t val = rgblight_get_val(); + + if (hue != blue_hue) + rgblight_sethsv(blue_hue, sat, val); + else + rgblight_sethsv(pink_hue, sat, val); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (!process_record_dynamic_macro(keycode, record)) + return false; + + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + break; + case MKITPNK: + if (record->event.pressed) + make_it_pink_blue(); + return false; + break; + } + return true; +} diff --git a/keyboards/levinson/keymaps/jyh2/readme.md b/keyboards/levinson/keymaps/jyh2/readme.md new file mode 100644 index 000000000..45ca95692 --- /dev/null +++ b/keyboards/levinson/keymaps/jyh2/readme.md @@ -0,0 +1,32 @@ +# jyh's levinson layout + +[Levinson](https://keeb.io/products/levinson-lets-split-w-led-backlight) +built on rev2 PCBs. A split 4x12 keyboard with LED backlights. + +The layout is oriented towards needs for programming, Emacs, XMonad, +and experience with 60% keyboards with no base layer arrow keys +(Poker). It makes heavy use of modifiers and layers. It is influenced +by good ideas from the Atreus keyboard layout. + +## Layout features + + * Extensive use of _Mod Tap_, e.g. + * Tap sends Esc, Hold sends Left Control + * Tap sends Tab, Hold activates Numpad layer + * Tap sends - , Hold sends Shift + * ... and many more + * Places Tab and Enter on bottom corners, for hitting with palm + * Meta is available on top corners, for controlling XMonad + * Control on center key, for Emacs (among other things) + * Backspace (Control Hold) and Space on center keys + * All 60% keys available on base layer, except for numbers + * Hyper and Meh keys + * Right modifier keys in place of arrow keys + * Arrows are instead available in two alternate locations: + * WASD arrows on _Adjust_ + * Arrow cluster on _Raise_ (inspired by hexwire) + * Numpad and Numrow on _Raise_ layer. Each is faster in some contexts + * Function keys on _Lower_ + * Dynamic macros from QMK firmware on _Adjust_ + * Redunant keys where it is convenient to have characters together + on one layer diff --git a/keyboards/levinson/keymaps/jyh2/rules.mk b/keyboards/levinson/keymaps/jyh2/rules.mk new file mode 100644 index 000000000..fbb3b49d6 --- /dev/null +++ b/keyboards/levinson/keymaps/jyh2/rules.mk @@ -0,0 +1,2 @@ +RGBLIGHT_ENABLE=yes +BOOTMAGIC_ENABLE=no From e08266129eba8f26b86b571b7f654e0d9311db25 Mon Sep 17 00:00:00 2001 From: Jason Yamada-Hanff Date: Thu, 1 Nov 2018 17:26:43 -0700 Subject: [PATCH 430/788] Keymap: port atreus layout to levinson keyboard (#4285) * Keymap: port atreus layout to levinson keyboard * fix (mostly deprecation) issues after review --- keyboards/levinson/keymaps/atreus/config.h | 22 +++++++++++ keyboards/levinson/keymaps/atreus/keymap.c | 41 +++++++++++++++++++++ keyboards/levinson/keymaps/atreus/readme.md | 8 ++++ 3 files changed, 71 insertions(+) create mode 100644 keyboards/levinson/keymaps/atreus/config.h create mode 100644 keyboards/levinson/keymaps/atreus/keymap.c create mode 100644 keyboards/levinson/keymaps/atreus/readme.md diff --git a/keyboards/levinson/keymaps/atreus/config.h b/keyboards/levinson/keymaps/atreus/config.h new file mode 100644 index 000000000..a82c15238 --- /dev/null +++ b/keyboards/levinson/keymaps/atreus/config.h @@ -0,0 +1,22 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ +#pragma once + +#define MASTER_LEFT diff --git a/keyboards/levinson/keymaps/atreus/keymap.c b/keyboards/levinson/keymaps/atreus/keymap.c new file mode 100644 index 000000000..61ad04ef7 --- /dev/null +++ b/keyboards/levinson/keymaps/atreus/keymap.c @@ -0,0 +1,41 @@ +#include QMK_KEYBOARD_H + +#define _QW 0 +#define _RS 1 +#define _LW 2 + +/* + * q w e r t || y u i o p + * a s d f g || h j k l ; + * z x c v b || n m , . / + * esc tab gui shift bksp ctrl || alt space raise - ' enter + */ +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[_QW] = LAYOUT_ortho_4x12( /* Qwerty */ + KC_Q, KC_W, KC_E, KC_R, KC_T, KC_NO, KC_NO, KC_Y, KC_U, KC_I, KC_O, KC_P, + KC_A, KC_S, KC_D, KC_F, KC_G, KC_NO, KC_NO, KC_H, KC_J, KC_K, KC_L, KC_SCLN , + KC_Z, KC_X, KC_C, KC_V, KC_B, KC_NO, KC_NO, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH , + KC_ESC, KC_TAB, KC_LGUI, KC_LSFT, KC_BSPC, KC_LCTL, KC_LALT, KC_SPC, MO(_RS), KC_MINS, KC_QUOT, KC_ENT ), +/* + * ! @ up { } || pgup 7 8 9 * + * # left down right $ || pgdn 4 5 6 + + * [ ] ( ) & || ` 1 2 3 \ + * lower insert super shift bksp ctrl || alt space fn . 0 = + */ +[_RS] = LAYOUT_ortho_4x12( /* [> RAISE <] */ + KC_EXLM, KC_AT, KC_UP, KC_LCBR, KC_RCBR, KC_NO, KC_NO, KC_PGUP, KC_7, KC_8, KC_9, KC_ASTR , + KC_HASH, KC_LEFT, KC_DOWN, KC_RGHT, KC_DLR, KC_NO, KC_NO, KC_PGDN, KC_4, KC_5, KC_6, KC_PLUS , + KC_LBRC, KC_RBRC, KC_LPRN, KC_RPRN, KC_AMPR, KC_NO, KC_NO, KC_GRV, KC_1, KC_2, KC_3, KC_BSLS , + TG(_LW), KC_INS, KC_LGUI, KC_LSFT, KC_BSPC, KC_LCTL, KC_LALT, KC_SPC, KC_TRNS, KC_DOT, KC_0, KC_EQL ), +/* + * insert home up end pgup || up F7 F8 F9 F10 + * del left down right pgdn || down F4 F5 F6 F11 + * volup reset || F1 F2 F3 F12 + * voldn super shift bksp ctrl || alt space L0 prtsc scroll pause + */ +[_LW] = LAYOUT_ortho_4x12( /* [> LOWER <] */ + KC_INS, KC_HOME, KC_UP, KC_END, KC_PGUP, KC_NO, KC_NO, KC_UP, KC_F7, KC_F8, KC_F9, KC_F10 , + KC_DELT, KC_LEFT, KC_DOWN, KC_RGHT, KC_DOWN, KC_NO, KC_NO, KC_DOWN, KC_F4, KC_F5, KC_F6, KC_F11 , + KC_NO, KC_VOLU, KC_NO, KC_NO, RESET, KC_NO, KC_NO, KC_NO, KC_F1, KC_F2, KC_F3, KC_F12 , + KC_NO, KC_VOLD, KC_LGUI, KC_LSFT, KC_BSPC, KC_LCTL, KC_LALT, KC_SPC, TO(_QW), KC_PSCR, KC_SLCK, KC_PAUS ) +}; diff --git a/keyboards/levinson/keymaps/atreus/readme.md b/keyboards/levinson/keymaps/atreus/readme.md new file mode 100644 index 000000000..0b548ace1 --- /dev/null +++ b/keyboards/levinson/keymaps/atreus/readme.md @@ -0,0 +1,8 @@ +# Atreus layout port + +Port the default Atreus layout to the Levinson/Let's Split. + +The purpose is to try out the layout to get a sense of what works in it. + +The 'extra' keys on the Levinson are dead in this version, to make a +more faithful emulation of the atreus layout. From 7a22da9f0573711be586915c763621027e285e81 Mon Sep 17 00:00:00 2001 From: Michael Pio Date: Fri, 2 Nov 2018 08:28:01 +0800 Subject: [PATCH 431/788] Update rules.mk for Vinta (#4317) changed dfu args to exit to application mode after flashing --- keyboards/vinta/rules.mk | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/keyboards/vinta/rules.mk b/keyboards/vinta/rules.mk index bf3eecbe2..9d89d9663 100644 --- a/keyboards/vinta/rules.mk +++ b/keyboards/vinta/rules.mk @@ -29,10 +29,10 @@ ARMV = 6 # 0x00000000-0x00001000 area is occupied by bootlaoder.*/ # The CORTEX_VTOR... is needed only for MCHCK/Infinity KB #OPT_DEFS = -DCORTEX_VTOR_INIT=0x00001000 -OPT_DEFS = +OPT_DEFS = # Options to pass to dfu-util when flashing -DFU_ARGS = -d 0483:df11 -a 0 -s 0x08000000 +DFU_ARGS = -d 0483:df11 -a 0 -s 0x08000000:leave # Build Options # comment out to disable the options. @@ -44,4 +44,4 @@ EXTRAKEY_ENABLE = yes # Audio control and System control CONSOLE_ENABLE = no # Console for debug COMMAND_ENABLE = no # Commands for debug and configuration NKRO_ENABLE = yes # USB Nkey Rollover -NO_USB_STARTUP_CHECK = no # Disable initialization only when usb is plugged in \ No newline at end of file +NO_USB_STARTUP_CHECK = no # Disable initialization only when usb is plugged in From 6eb7501eb0ab0ee1711f7f1275501ab53bcae8e2 Mon Sep 17 00:00:00 2001 From: Alex Mayer Date: Fri, 2 Nov 2018 01:21:28 -0400 Subject: [PATCH 432/788] Four Banger: Clean Up Indentation (#4322) Make indentation consistent and match project standards --- keyboards/four_banger/config.h | 2 +- keyboards/four_banger/four_banger.h | 10 +++---- .../four_banger/keymaps/default/keymap.c | 26 +++++++++---------- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/keyboards/four_banger/config.h b/keyboards/four_banger/config.h index 8dceff5db..761ddba71 100644 --- a/keyboards/four_banger/config.h +++ b/keyboards/four_banger/config.h @@ -40,7 +40,7 @@ /* key combination for command */ #define IS_COMMAND() ( \ - keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) #define RGB_DI_PIN E6 diff --git a/keyboards/four_banger/four_banger.h b/keyboards/four_banger/four_banger.h index b0de731b9..a6da8dd0b 100644 --- a/keyboards/four_banger/four_banger.h +++ b/keyboards/four_banger/four_banger.h @@ -4,11 +4,11 @@ #include "quantum.h" #define LAYOUT_ortho_2x2( \ - K00, K01, \ - K10, K11 \ + K00, K01, \ + K10, K11 \ ) { \ - { K00, K01 }, \ - { K10, K11 } \ + { K00, K01 }, \ + { K10, K11 } \ } -#endif \ No newline at end of file +#endif diff --git a/keyboards/four_banger/keymaps/default/keymap.c b/keyboards/four_banger/keymaps/default/keymap.c index 6c5f7c8a5..3fea0afd4 100644 --- a/keyboards/four_banger/keymaps/default/keymap.c +++ b/keyboards/four_banger/keymaps/default/keymap.c @@ -5,20 +5,20 @@ enum custom_keycodes { }; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - LAYOUT_ortho_2x2( - KC_1, KC_U, - KC_P, UP_URL - ), + LAYOUT_ortho_2x2( + KC_1, KC_U, + KC_P, UP_URL + ), }; bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case UP_URL: - if (record->event.pressed) { - SEND_STRING("http://1upkeyboards.com"); - } - return false; - break; - } - return true; + switch (keycode) { + case UP_URL: + if (record->event.pressed) { + SEND_STRING("http://1upkeyboards.com"); + } + return false; + break; + } + return true; } From 5909d8aef1126357899b687155bfe377914891df Mon Sep 17 00:00:00 2001 From: ENDO Katsuhiro Date: Fri, 2 Nov 2018 14:55:29 +0900 Subject: [PATCH 433/788] Keyboard: Add MiniAxe (#4314) * Add a new keyboard MiniAxe. * Fix readme foramt. Co-Authored-By: ka2hiro * Fix readme format. Co-Authored-By: ka2hiro * Remove unnecessary keycode aliases. * Remove unnecessary param. Co-Authored-By: ka2hiro --- keyboards/miniaxe/config.h | 245 ++++++++ keyboards/miniaxe/info.json | 12 + keyboards/miniaxe/keymaps/default/keymap.c | 159 +++++ keyboards/miniaxe/keymaps/underglow/keymap.c | 159 +++++ keyboards/miniaxe/keymaps/underglow/rules.mk | 2 + keyboards/miniaxe/matrix.c | 596 +++++++++++++++++++ keyboards/miniaxe/miniaxe.c | 43 ++ keyboards/miniaxe/miniaxe.h | 50 ++ keyboards/miniaxe/readme.md | 16 + keyboards/miniaxe/rules.mk | 88 +++ 10 files changed, 1370 insertions(+) create mode 100644 keyboards/miniaxe/config.h create mode 100644 keyboards/miniaxe/info.json create mode 100644 keyboards/miniaxe/keymaps/default/keymap.c create mode 100644 keyboards/miniaxe/keymaps/underglow/keymap.c create mode 100644 keyboards/miniaxe/keymaps/underglow/rules.mk create mode 100644 keyboards/miniaxe/matrix.c create mode 100644 keyboards/miniaxe/miniaxe.c create mode 100644 keyboards/miniaxe/miniaxe.h create mode 100644 keyboards/miniaxe/readme.md create mode 100644 keyboards/miniaxe/rules.mk diff --git a/keyboards/miniaxe/config.h b/keyboards/miniaxe/config.h new file mode 100644 index 000000000..13608feab --- /dev/null +++ b/keyboards/miniaxe/config.h @@ -0,0 +1,245 @@ +/* +Copyright 2018 ENDO Katsuhiro + +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 . +*/ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x3939 +#define DEVICE_VER 0x0001 +#define MANUFACTURER ENDO Katsuhiro +#define PRODUCT MiniAxe +#define DESCRIPTION Yet another split keyboard + +/* key matrix size */ +#define MATRIX_ROWS 8 +#define MATRIX_COLS 5 + +/* + * 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) + * NO_DIODE = switches are directly connected to AVR pins + * +*/ +// #define MATRIX_ROW_PINS { D0, D5 } +// #define MATRIX_COL_PINS { F1, F0, B0 } +#define NO_PIN 0xFF +#define MATRIX_ROW_COL_PINS { \ + { F1, E6, B0, B2, B3 }, \ + { F5, F0, B1, B7, D2 }, \ + { F6, F7, C7, D5, D3 }, \ + { B5, C6, B6, NO_PIN, NO_PIN } \ +} +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION CUSTOM_MATRIX + +// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_BREATHING +// #define BACKLIGHT_LEVELS 3 + +/* Uncomment below if use underglow */ +#define RGB_DI_PIN F4 +#ifdef RGB_DI_PIN +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 6 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 +#endif + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* 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 userful 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 + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * 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 + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +//#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ + +/* Bootmagic Lite key configuration */ +// #define BOOTMAGIC_LITE_ROW 0 +// #define BOOTMAGIC_LITE_COLUMN 0 + +/* Serial settings */ +#define USE_SERIAL +//#define EE_HANDS +#define I2C_MASTER_LEFT +//#define I2C_MASTER_RIGHT + +#define DISABLE_JTAG + diff --git a/keyboards/miniaxe/info.json b/keyboards/miniaxe/info.json new file mode 100644 index 000000000..5fee787b5 --- /dev/null +++ b/keyboards/miniaxe/info.json @@ -0,0 +1,12 @@ +{ + "keyboard_name": "MiniAxe", + "url": "", + "maintainer": "ka2hiro", + "width": 11, + "height": 4, + "layouts": { + "LAYOUT": { + "layout": [{"label":"Q", "x":0, "y":0}, {"label":"W", "x":1, "y":0}, {"label":"E", "x":2, "y":0}, {"label":"R", "x":3, "y":0}, {"label":"T", "x":4, "y":0}, {"label":"Y", "x":6, "y":0}, {"label":"U", "x":7, "y":0}, {"label":"I", "x":8, "y":0}, {"label":"O", "x":9, "y":0}, {"label":"P", "x":10, "y":0}, {"label":"A", "x":0, "y":1}, {"label":"S", "x":1, "y":1}, {"label":"D", "x":2, "y":1}, {"label":"F", "x":3, "y":1}, {"label":"G", "x":4, "y":1}, {"label":"J", "x":6, "y":1}, {"label":"J", "x":7, "y":1}, {"label":"K", "x":8, "y":1}, {"label":"L", "x":9, "y":1}, {"label":";", "x":10, "y":1}, {"label":"Z", "x":0, "y":2}, {"label":"X", "x":1, "y":2}, {"label":"C", "x":2, "y":2}, {"label":"V", "x":3, "y":2}, {"label":"B", "x":4, "y":2}, {"label":"N", "x":6, "y":2}, {"label":"M", "x":7, "y":2}, {"label":",", "x":8, "y":2}, {"label":".", "x":9, "y":2}, {"label":"/", "x":10, "y":2}, {"label":"Cmd", "x":2, "y":3}, {"label":"⇓", "x":3, "y":3}, {"label":"Ctrl", "x":4, "y":3}, {"x":6, "y":3}, {"label":"⇑", "x":7, "y":3}, {"label":"Opt", "x":8, "y":3}] + } + } +} diff --git a/keyboards/miniaxe/keymaps/default/keymap.c b/keyboards/miniaxe/keymaps/default/keymap.c new file mode 100644 index 000000000..4b405e202 --- /dev/null +++ b/keyboards/miniaxe/keymaps/default/keymap.c @@ -0,0 +1,159 @@ +/* Copyright 2018 ENDO Katsuhiro + * + * 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 . + */ +#include QMK_KEYBOARD_H + +// Defines the keycodes used by our macros in process_record_user +#define _QWERTY 0 +#define _LOWER 1 +#define _RAISE 2 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + LOWER, + RAISE, + ADJUST, +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * + * ,----------------------------------. ,----------------------------------. + * | Q | W | E | R | T | | Y | U | I | O | P | + * |------+------+------+------+------| |------+------+------+------+------| + * | A | S | D | F | G | | H | J | K | L | ; | + * |------+------+------+------+------| |------+------+------+------+------| + * | Z | X | C | V | B | | N | M | , | . | / | + * `-------------+------+------+------| |------+------+------+------+------' + * | GUI | LOWER|Ctrl/Esc| |Spc/Sft| RAISE|Alt/BkSp | + * `--------------------' `--------------------' + */ +[_QWERTY] = LAYOUT( \ + KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, \ + KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, \ + KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, \ + KC_LGUI, LOWER, MT(MOD_LCTL, KC_ESC), MT(MOD_LSFT, KC_SPC), RAISE, MT(MOD_LALT, KC_BSPC) \ +), + +/* Raise + * + * ,----------------------------------. ,----------------------------------. + * | ! | @ | # | $ | % | | ^ | & | * | ( | ) | + * |------+------+------+------+------| |------+------+------+------+------| + * | Tab | _ | + | | | ~ | | : | " | > | { | } | + * |------+------+------+------+------| |------+------+------+------+------| + * | Caps| - | = | \ | ` | | ; | ' | < | [ | ] | + * `-------------+------+------+------| |------+------+------+------+------' + * | | LOWER| | | Esc | RAISE| | + * `--------------------' `--------------------' + */ +[_RAISE] = LAYOUT( \ + KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, \ + KC_TAB, KC_UNDS, KC_PLUS, KC_PIPE, KC_TILD, KC_COLN, KC_DQUO, KC_GT, KC_LCBR, KC_RCBR, \ + KC_CAPS, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, KC_SCLN, KC_QUOT, KC_LT, KC_LBRC, KC_RBRC, \ + _______, _______, _______, _______, _______, _______\ +), + +/* Lower + * + * ,----------------------------------. ,----------------------------------. + * | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | + * |------+------+------+------+------| |------+------+------+------+------| + * | Tab | | | | | | Left | Down | Up | Right| Enter| + * |------+------+------+------+------| |------+------+------+------+------| + * | Ctrl| ` | GUI | Alt | Del | | BkSp | PgUp | PgDn | \ | ' | + * `-------------+------+------+------| |------+------+------+------+------' + * | | LOWER| | | | RAISE| | + * `--------------------' `--------------------' + */ +[_LOWER] = LAYOUT( \ + KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, \ + KC_TAB, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_ENT, \ + KC_LCTL, KC_GRV, KC_LGUI, KC_LALT, KC_DEL, KC_BSPC, KC_PGUP, KC_PGDN, KC_BSLS, KC_QUOT, \ + _______, _______, _______, _______, _______, _______ \ +), + + +/* Adjust (Lower + Raise) + * + * ,----------------------------------. ,----------------------------------. + * | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | + * |------+------+------+------+------| |------+------+------+------+------| + * | F11 | F12 | | | | | | | | | | + * |------+------+------+------+------| |------+------+------+------+------| + * | Reset| | | | | | Prev | Next | Vol- | Vol+ | Play | + * `-------------+------+------+------| |------+------+------+------+------' + * | | LOWER| | | | RAISE| | + * `--------------------' `--------------------' + */ +[_ADJUST] = LAYOUT( \ + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, \ + KC_F11, KC_F12, _______, _______, _______, _______, _______, _______, _______, _______, \ + RESET, _______, _______, _______, _______, KC_MPRV, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, \ + _______, _______, _______, _______, _______, _______ \ +) +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + // persistant_default_layer_set(1UL<<_QWERTY); + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + break; + } + return true; +} + +void matrix_init_user(void) { +} + +void matrix_scan_user(void) { +} + +void led_set_user(uint8_t usb_led) { +} diff --git a/keyboards/miniaxe/keymaps/underglow/keymap.c b/keyboards/miniaxe/keymaps/underglow/keymap.c new file mode 100644 index 000000000..6325b2056 --- /dev/null +++ b/keyboards/miniaxe/keymaps/underglow/keymap.c @@ -0,0 +1,159 @@ +/* Copyright 2018 ENDO Katsuhiro + * + * 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 . + */ +#include QMK_KEYBOARD_H + +// Defines the keycodes used by our macros in process_record_user +#define _QWERTY 0 +#define _LOWER 1 +#define _RAISE 2 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + LOWER, + RAISE, + ADJUST, +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * + * ,----------------------------------. ,----------------------------------. + * | Q | W | E | R | T | | Y | U | I | O | P | + * |------+------+------+------+------| |------+------+------+------+------| + * | A | S | D | F | G | | H | J | K | L | ; | + * |------+------+------+------+------| |------+------+------+------+------| + * | Z | X | C | V | B | | N | M | , | . | / | + * `-------------+------+------+------| |------+------+------+------+------' + * | GUI | LOWER|Ctrl/Esc| |Spc/Sft| RAISE|Alt/BkSp | + * `--------------------' `--------------------' + */ +[_QWERTY] = LAYOUT( \ + KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, \ + KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, \ + KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, \ + KC_LGUI, LOWER, MT(MOD_LCTL, KC_ESC), MT(MOD_LSFT, KC_SPC), RAISE, MT(MOD_LALT, KC_BSPC) \ +), + +/* Raise + * + * ,----------------------------------. ,----------------------------------. + * | ! | @ | # | $ | % | | ^ | & | * | ( | ) | + * |------+------+------+------+------| |------+------+------+------+------| + * | Tab | _ | + | | | ~ | | : | " | > | { | } | + * |------+------+------+------+------| |------+------+------+------+------| + * | Caps| - | = | \ | ` | | ; | ' | < | [ | ] | + * `-------------+------+------+------| |------+------+------+------+------' + * | | LOWER| | | Esc | RAISE| | + * `--------------------' `--------------------' + */ +[_RAISE] = LAYOUT( \ + KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, \ + KC_TAB, KC_UNDS, KC_PLUS, KC_PIPE, KC_TILD, KC_COLN, KC_DQUO, KC_GT, KC_LCBR, KC_RCBR, \ + KC_CAPS, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, KC_SCLN, KC_QUOT, KC_LT, KC_LBRC, KC_RBRC, \ + _______, _______, _______, _______, _______, _______\ +), + +/* Lower + * + * ,----------------------------------. ,----------------------------------. + * | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | + * |------+------+------+------+------| |------+------+------+------+------| + * | Tab | | | | Play | | Left | Down | Up | Right| Enter| + * |------+------+------+------+------| |------+------+------+------+------| + * | Ctrl| ` | GUI | Alt | Del | | BkSp | PgUp | PgDn | \ | ' | + * `-------------+------+------+------| |------+------+------+------+------' + * | | LOWER| | | | RAISE| | + * `--------------------' `--------------------' + */ +[_LOWER] = LAYOUT( \ + KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, \ + KC_TAB, _______, _______, _______, KC_MPLY, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_ENT, \ + KC_LCTL, KC_GRV, KC_LGUI, KC_LALT, KC_DEL, KC_BSPC, KC_PGUP, KC_PGDN, KC_BSLS, KC_QUOT, \ + _______, _______, _______, _______, _______, _______ \ +), + + +/* Adjust (Lower + Raise) + * + * ,----------------------------------. ,----------------------------------. + * | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | + * |------+------+------+------+------| |------+------+------+------+------| + * | F11 | F12 | |RGBSAI|RGBSAD| |RGBVAI|RGBVAD| | | | + * |------+------+------+------+------| |------+------+------+------+------| + * | Reset|RGBTOG|RGBMOD|RGBHUI|RGBHUD| | Prev | Next | Vol- | Vol+ | Play | + * `-------------+------+------+------| |------+------+------+------+------' + * | | LOWER| | | | RAISE| | + * `--------------------' `--------------------' + */ +[_ADJUST] = LAYOUT( \ + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, \ + KC_F11, KC_F12, RGB_RMOD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, \ + RESET, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, KC_MPRV, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, \ + _______, _______, _______, _______, _______, _______ \ +) +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + // persistant_default_layer_set(1UL<<_QWERTY); + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + break; + } + return true; +} + +void matrix_init_user(void) { +} + +void matrix_scan_user(void) { +} + +void led_set_user(uint8_t usb_led) { +} diff --git a/keyboards/miniaxe/keymaps/underglow/rules.mk b/keyboards/miniaxe/keymaps/underglow/rules.mk new file mode 100644 index 000000000..64fa91ded --- /dev/null +++ b/keyboards/miniaxe/keymaps/underglow/rules.mk @@ -0,0 +1,2 @@ +RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow + diff --git a/keyboards/miniaxe/matrix.c b/keyboards/miniaxe/matrix.c new file mode 100644 index 000000000..55c458e1f --- /dev/null +++ b/keyboards/miniaxe/matrix.c @@ -0,0 +1,596 @@ +/* +Copyright 2012 Jun Wako + +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 . +*/ + +/* + * scan matrix + */ +#include +#include +#include +#include "wait.h" +#include "print.h" +#include "debug.h" +#include "util.h" +#include "matrix.h" +#include "split_util.h" +#include "pro_micro.h" +#include "config.h" +#include "timer.h" +#include "split_flags.h" + +#ifdef RGBLIGHT_ENABLE +# include "rgblight.h" +#endif +#ifdef BACKLIGHT_ENABLE +# include "backlight.h" + extern backlight_config_t backlight_config; +#endif + +#if defined(USE_I2C) || defined(EH) +# include "i2c.h" +#else // USE_SERIAL +# include "serial.h" +#endif + +#ifndef DEBOUNCING_DELAY +# define DEBOUNCING_DELAY 5 +#endif + +#if (DEBOUNCING_DELAY > 0) + static uint16_t debouncing_time; + static bool debouncing = false; +#endif + +#if (MATRIX_COLS <= 8) +# define print_matrix_header() print("\nr/c 01234567\n") +# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row)) +# define matrix_bitpop(i) bitpop(matrix[i]) +# define ROW_SHIFTER ((uint8_t)1) +#else +# error "Currently only supports 8 COLS" +#endif +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; + +#define ERROR_DISCONNECT_COUNT 5 + +#define ROWS_PER_HAND (MATRIX_ROWS/2) + +static uint8_t error_count = 0; + +#if ((DIODE_DIRECTION == COL2ROW) || (DIODE_DIRECTION == ROW2COL)) +static uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; +static uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; +#elif (DIODE_DIRECTION == CUSTOM_MATRIX) +static uint8_t row_col_pins[MATRIX_ROWS][MATRIX_COLS] = MATRIX_ROW_COL_PINS; +#endif + +/* matrix state(1:on, 0:off) */ +static matrix_row_t matrix[MATRIX_ROWS]; +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; + +#if (DIODE_DIRECTION == COL2ROW) + static void init_cols(void); + static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row); + static void unselect_rows(void); + static void select_row(uint8_t row); + static void unselect_row(uint8_t row); +#elif (DIODE_DIRECTION == ROW2COL) + static void init_rows(void); + static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col); + static void unselect_cols(void); + static void unselect_col(uint8_t col); + static void select_col(uint8_t col); +#elif (DIODE_DIRECTION == CUSTOM_MATRIX) + static void init_cols_rows(void); + static bool read_cols(matrix_row_t current_matrix[], uint8_t current_row); +#endif + +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + +__attribute__ ((weak)) +void matrix_slave_scan_user(void) { +} + +inline +uint8_t matrix_rows(void) +{ + return MATRIX_ROWS; +} + +inline +uint8_t matrix_cols(void) +{ + return MATRIX_COLS; +} + +void matrix_init(void) +{ +#ifdef DISABLE_JTAG + // JTAG disable for PORT F. write JTD bit twice within four cycles. + MCUCR |= (1< 0) + bool matrix_changed = read_cols_on_row(matrix_debouncing+offset, current_row); + + if (matrix_changed) { + debouncing = true; + debouncing_time = timer_read(); + } + +# else + read_cols_on_row(matrix+offset, current_row); +# endif + + } + +#elif (DIODE_DIRECTION == ROW2COL) + // Set col, read rows + for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) { +# if (DEBOUNCING_DELAY > 0) + bool matrix_changed = read_rows_on_col(matrix_debouncing+offset, current_col); + if (matrix_changed) { + debouncing = true; + debouncing_time = timer_read(); + } +# else + read_rows_on_col(matrix+offset, current_col); +# endif + + } + +#elif (DIODE_DIRECTION == CUSTOM_MATRIX) + // Set row, read cols + for (uint8_t current_row = 0; current_row < ROWS_PER_HAND; current_row++) { +# if (DEBOUNCING_DELAY > 0) + bool matrix_changed = read_cols(matrix_debouncing+offset, current_row); + if (matrix_changed) { + debouncing = true; + debouncing_time = timer_read(); + } +# else + read_cols(matrix+offset, current_row); +# endif + } +#endif + +# if (DEBOUNCING_DELAY > 0) + if (debouncing && (timer_elapsed(debouncing_time) > DEBOUNCING_DELAY)) { + for (uint8_t i = 0; i < ROWS_PER_HAND; i++) { + matrix[i+offset] = matrix_debouncing[i+offset]; + } + debouncing = false; + } +# endif + + return 1; +} + +#if defined(USE_I2C) || defined(EH) + +// Get rows from other half over i2c +int i2c_transaction(void) { + int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; + int err = 0; + + // write backlight info + #ifdef BACKLIGHT_ENABLE + if (BACKLIT_DIRTY) { + err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_WRITE); + if (err) goto i2c_error; + + // Backlight location + err = i2c_master_write(I2C_BACKLIT_START); + if (err) goto i2c_error; + + // Write backlight + i2c_master_write(get_backlight_level()); + + BACKLIT_DIRTY = false; + } + #endif + + err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_WRITE); + if (err) goto i2c_error; + + // start of matrix stored at I2C_KEYMAP_START + err = i2c_master_write(I2C_KEYMAP_START); + if (err) goto i2c_error; + + // Start read + err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_READ); + if (err) goto i2c_error; + + if (!err) { + int i; + for (i = 0; i < ROWS_PER_HAND-1; ++i) { + matrix[slaveOffset+i] = i2c_master_read(I2C_ACK); + } + matrix[slaveOffset+i] = i2c_master_read(I2C_NACK); + i2c_master_stop(); + } else { +i2c_error: // the cable is disconnceted, or something else went wrong + i2c_reset_state(); + return err; + } + + #ifdef RGBLIGHT_ENABLE + if (RGB_DIRTY) { + err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_WRITE); + if (err) goto i2c_error; + + // RGB Location + err = i2c_master_write(I2C_RGB_START); + if (err) goto i2c_error; + + uint32_t dword = eeconfig_read_rgblight(); + + // Write RGB + err = i2c_master_write_data(&dword, 4); + if (err) goto i2c_error; + + RGB_DIRTY = false; + i2c_master_stop(); + } + #endif + + return 0; +} + +#else // USE_SERIAL + +int serial_transaction(void) { + int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; + + if (serial_update_buffers()) { + return 1; + } + + for (int i = 0; i < ROWS_PER_HAND; ++i) { + matrix[slaveOffset+i] = serial_slave_buffer[i]; + } + + #ifdef RGBLIGHT_ENABLE + // Code to send RGB over serial goes here (not implemented yet) + #endif + + #ifdef BACKLIGHT_ENABLE + // Write backlight level for slave to read + serial_master_buffer[SERIAL_BACKLIT_START] = backlight_config.enable ? backlight_config.level : 0; + #endif + + return 0; +} +#endif + +uint8_t matrix_scan(void) +{ + uint8_t ret = _matrix_scan(); + +#if defined(USE_I2C) || defined(EH) + if( i2c_transaction() ) { +#else // USE_SERIAL + if( serial_transaction() ) { +#endif + + error_count++; + + if (error_count > ERROR_DISCONNECT_COUNT) { + // reset other half if disconnected + int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; + for (int i = 0; i < ROWS_PER_HAND; ++i) { + matrix[slaveOffset+i] = 0; + } + } + } else { + error_count = 0; + } + matrix_scan_quantum(); + return ret; +} + +void matrix_slave_scan(void) { + _matrix_scan(); + + int offset = (isLeftHand) ? 0 : ROWS_PER_HAND; + +#if defined(USE_I2C) || defined(EH) + for (int i = 0; i < ROWS_PER_HAND; ++i) { + i2c_slave_buffer[I2C_KEYMAP_START+i] = matrix[offset+i]; + } +#else // USE_SERIAL + for (int i = 0; i < ROWS_PER_HAND; ++i) { + serial_slave_buffer[i] = matrix[offset+i]; + } +#endif + matrix_slave_scan_user(); +} + +bool matrix_is_modified(void) +{ + if (debouncing) return false; + return true; +} + +inline +bool matrix_is_on(uint8_t row, uint8_t col) +{ + return (matrix[row] & ((matrix_row_t)1<> 4) + 1) &= ~_BV(pin & 0xF); // IN + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + } +} + +static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) +{ + // Store last value of row prior to reading + matrix_row_t last_row_value = current_matrix[current_row]; + + // Clear data in matrix row + current_matrix[current_row] = 0; + + // Select row and wait for row selecton to stabilize + select_row(current_row); + wait_us(30); + + // For each col... + for(uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) { + + // Select the col pin to read (active low) + uint8_t pin = col_pins[col_index]; + uint8_t pin_state = (_SFR_IO8(pin >> 4) & _BV(pin & 0xF)); + + // Populate the matrix row with the state of the col pin + current_matrix[current_row] |= pin_state ? 0 : (ROW_SHIFTER << col_index); + } + + // Unselect row + unselect_row(current_row); + + return (last_row_value != current_matrix[current_row]); +} + +static void select_row(uint8_t row) +{ + uint8_t pin = row_pins[row]; + _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT + _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW +} + +static void unselect_row(uint8_t row) +{ + uint8_t pin = row_pins[row]; + _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI +} + +static void unselect_rows(void) +{ + for(uint8_t x = 0; x < ROWS_PER_HAND; x++) { + uint8_t pin = row_pins[x]; + _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + } +} + +#elif (DIODE_DIRECTION == ROW2COL) + +static void init_rows(void) +{ + for(uint8_t x = 0; x < ROWS_PER_HAND; x++) { + uint8_t pin = row_pins[x]; + _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + } +} + +static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) +{ + bool matrix_changed = false; + + // Select col and wait for col selecton to stabilize + select_col(current_col); + wait_us(30); + + // For each row... + for(uint8_t row_index = 0; row_index < ROWS_PER_HAND; row_index++) + { + + // Store last value of row prior to reading + matrix_row_t last_row_value = current_matrix[row_index]; + + // Check row pin state + if ((_SFR_IO8(row_pins[row_index] >> 4) & _BV(row_pins[row_index] & 0xF)) == 0) + { + // Pin LO, set col bit + current_matrix[row_index] |= (ROW_SHIFTER << current_col); + } + else + { + // Pin HI, clear col bit + current_matrix[row_index] &= ~(ROW_SHIFTER << current_col); + } + + // Determine if the matrix changed state + if ((last_row_value != current_matrix[row_index]) && !(matrix_changed)) + { + matrix_changed = true; + } + } + + // Unselect col + unselect_col(current_col); + + return matrix_changed; +} + +static void select_col(uint8_t col) +{ + uint8_t pin = col_pins[col]; + _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT + _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW +} + +static void unselect_col(uint8_t col) +{ + uint8_t pin = col_pins[col]; + _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI +} + +static void unselect_cols(void) +{ + for(uint8_t x = 0; x < MATRIX_COLS; x++) { + uint8_t pin = col_pins[x]; + _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + } +} + +#elif (DIODE_DIRECTION == CUSTOM_MATRIX) + +static void init_cols_rows(void) +{ + for(int row = 0; row < MATRIX_ROWS; row++) { + for(int col = 0; col < MATRIX_COLS; col++) { + uint8_t pin = row_col_pins[row][col]; + if(pin == NO_PIN) { + continue; + } + // DDxn set 0 for input + _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); + // PORTxn set 1 for input/pullup + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); + } + } +} + +static bool read_cols(matrix_row_t current_matrix[], uint8_t current_row) +{ + matrix_row_t last_row_value = current_matrix[current_row]; + current_matrix[current_row] = 0; + + for(uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) { + uint8_t pin = row_col_pins[current_row][col_index]; + if(pin == NO_PIN) { + current_matrix[current_row] |= 0; + } + else { + uint8_t pin_state = (_SFR_IO8(pin >> 4) & _BV(pin & 0xF)); + current_matrix[current_row] |= pin_state ? 0 : (ROW_SHIFTER << col_index); + } + } + + return (last_row_value != current_matrix[current_row]); +} + +#endif diff --git a/keyboards/miniaxe/miniaxe.c b/keyboards/miniaxe/miniaxe.c new file mode 100644 index 000000000..965ada9a1 --- /dev/null +++ b/keyboards/miniaxe/miniaxe.c @@ -0,0 +1,43 @@ +/* Copyright 2018 ENDO Katsuhiro + * + * 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 . + */ +#include "miniaxe.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + + led_set_user(usb_led); +} diff --git a/keyboards/miniaxe/miniaxe.h b/keyboards/miniaxe/miniaxe.h new file mode 100644 index 000000000..a0130ad28 --- /dev/null +++ b/keyboards/miniaxe/miniaxe.h @@ -0,0 +1,50 @@ +/* Copyright 2018 ENDO Katsuhiro + * + * 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 . + */ +#ifndef MINIAXE_H +#define MINIAXE_H + +#include "quantum.h" + +/* This a shortcut to help you visually see your layout. + * + * The first section contains all of the arguments representing the physical + * layout of the board and position of the keys. + * + * The second converts the arguments into a two-dimensional array which + * represents the switch matrix. + */ + +// readability +#define ___ KC_NO + +#define LAYOUT( \ + L01, L02, L03, L04, L05, R01, R02, R03, R04, R05, \ + L06, L07, L08, L09, L10, R06, R07, R08, R09, R10, \ + L11, L12, L13, L14, L15, R11, R12, R13, R14, R15, \ + L16, L17, L18, R16, R17, R18 \ + ) \ + { \ + { L01, L02, L03, L04, L05 }, \ + { L06, L07, L08, L09, L10 }, \ + { L11, L12, L13, L14, L15 }, \ + { L16, L17, L18, ___, ___ }, \ + { R01, R02, R03, R04, R05 }, \ + { R06, R07, R08, R09, R10 }, \ + { R11, R12, R13, R14, R15 }, \ + { R16, R17, R18, ___, ___ } \ + } + +#endif diff --git a/keyboards/miniaxe/readme.md b/keyboards/miniaxe/readme.md new file mode 100644 index 000000000..57ed01a91 --- /dev/null +++ b/keyboards/miniaxe/readme.md @@ -0,0 +1,16 @@ +MiniAxe +=== + +![MiniAxe](https://i.imgur.com/1ApzrCz.jpg) + +Yet another split ortholinear keyboard with 3x5+3 keys. + +Keyboard Maintainer: [ka2hiro](https://github.com/ka2hiro) [@ka2hiro](https://twitter.com/ka2hiro) +Hardware Supported: MiniAxe PCB, ATMEGA32U4 +Hardware Availability: [@ka2hiro](https://twitter.com/ka2hiro) + +Make example for this keyboard (after setting up your build environment): + + make miniaxe:default:dfu + +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). diff --git a/keyboards/miniaxe/rules.mk b/keyboards/miniaxe/rules.mk new file mode 100644 index 000000000..96e27686b --- /dev/null +++ b/keyboards/miniaxe/rules.mk @@ -0,0 +1,88 @@ +SRC += matrix.c + +# MCU name +#MCU = at90usb1286 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = no # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) + +DEBUG_ENABLE = no +CUSTOM_MATRIX = yes # Use custom matrix code +SPLIT_KEYBOARD = yes # Use shared split_common code + From 15f6278aa623ceda4c220daee1cbedb9e38e6a97 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Fri, 2 Nov 2018 12:31:40 -0400 Subject: [PATCH 434/788] Add support for Atmega32A to pin declarations and universal matrix (#4015) * add computed pins from mcu type * update for atmega32a * doc typo * add atmega16 chips, link to references * remove avr include from config * exclude assembler in config.h includes * consolodate options, add 646 * fix typo in pindef --- docs/internals_gpio_control.md | 2 +- quantum/config_common.h | 158 ++++++++++++++-------- quantum/quantum.h | 20 +-- tmk_core/protocol/vusb/usbdrv/usbdrvasm.S | 8 +- 4 files changed, 119 insertions(+), 69 deletions(-) diff --git a/docs/internals_gpio_control.md b/docs/internals_gpio_control.md index 21643d30c..083e69664 100644 --- a/docs/internals_gpio_control.md +++ b/docs/internals_gpio_control.md @@ -12,7 +12,7 @@ The following functions can provide basic control of GPIOs and are found in `qua |`setPinInputHigh(pin)`|Set pin as input with build in pull-up | |`setPinInputLow(pin)` |Set pin as input with build in pull-down (Supported only on STM32)| |`setPinOutput(pin)` |Set pin as output | -|`writePinHige(pin)` |Set pin level as high, assuming it is an output | +|`writePinHigh(pin)` |Set pin level as high, assuming it is an output | |`writePinLow(pin)` |Set pin level as low, assuming it is an output | |`writePin(pin, level)`|Set pin level, assuming it is an output | |`readPin(pin)` |Returns the level of the pin | diff --git a/quantum/config_common.h b/quantum/config_common.h index 288617255..cbff372ea 100644 --- a/quantum/config_common.h +++ b/quantum/config_common.h @@ -1,4 +1,4 @@ -/* Copyright 2015-2017 Jack Humbert +/* Copyright 2015-2018 Jack Humbert * * 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 @@ -14,8 +14,7 @@ * along with this program. If not, see . */ -#ifndef CONFIG_DEFINITIONS_H -#define CONFIG_DEFINITIONS_H +#pragma once /* diode directions */ #define COL2ROW 0 @@ -23,57 +22,108 @@ #define CUSTOM_MATRIX 2 /* Disables built-in matrix scanning code */ #ifdef __AVR__ - /* I/O pins */ - #ifndef F0 - #define B0 0x30 - #define B1 0x31 - #define B2 0x32 - #define B3 0x33 - #define B4 0x34 - #define B5 0x35 - #define B6 0x36 - #define B7 0x37 - #define C0 0x60 - #define C1 0x61 - #define C2 0x62 - #define C3 0x63 - #define C4 0x64 - #define C5 0x65 - #define C6 0x66 - #define C7 0x67 - #define D0 0x90 - #define D1 0x91 - #define D2 0x92 - #define D3 0x93 - #define D4 0x94 - #define D5 0x95 - #define D6 0x96 - #define D7 0x97 - #define E0 0xC0 - #define E1 0xC1 - #define E2 0xC2 - #define E3 0xC3 - #define E4 0xC4 - #define E5 0xC5 - #define E6 0xC6 - #define E7 0xC7 - #define F0 0xF0 - #define F1 0xF1 - #define F2 0xF2 - #define F3 0xF3 - #define F4 0xF4 - #define F5 0xF5 - #define F6 0xF6 - #define F7 0xF7 - #define A0 0x00 - #define A1 0x01 - #define A2 0x02 - #define A3 0x03 - #define A4 0x04 - #define A5 0x05 - #define A6 0x06 - #define A7 0x07 + #ifndef __ASSEMBLER__ + #include #endif + #define PORT_SHIFTER 4 // this may be 4 for all AVR chips + + // If you want to add more to this list, reference the PINx definitions in these header + // files: https://github.com/vancegroup-mirrors/avr-libc/tree/master/avr-libc/include/avr + + #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega16U4__) + #define ADDRESS_BASE 0x00 + #define PINB_ADDRESS 0x3 + #define PINC_ADDRESS 0x6 + #define PIND_ADDRESS 0x9 + #define PINE_ADDRESS 0xC + #define PINF_ADDRESS 0xF + #elif defined(__AVR_ATmega32U2__) || defined(__AVR_ATmega16U2__) + #define ADDRESS_BASE 0x00 + #define PINB_ADDRESS 0x3 + #define PINC_ADDRESS 0x6 + #define PIND_ADDRESS 0x9 + #elif defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) + #define ADDRESS_BASE 0x00 + #define PINA_ADDRESS 0x0 + #define PINB_ADDRESS 0x3 + #define PINC_ADDRESS 0x6 + #define PIND_ADDRESS 0x9 + #define PINE_ADDRESS 0xC + #define PINF_ADDRESS 0xF + #elif defined(__AVR_ATmega32A__) + #define ADDRESS_BASE 0x10 + #define PIND_ADDRESS 0x0 + #define PINC_ADDRESS 0x3 + #define PINB_ADDRESS 0x6 + #define PINA_ADDRESS 0x9 + #else + #error "Pins are not defined" + #endif + + /* I/O pins */ + #define PINDEF(port, pin) ((PIN##port##_ADDRESS << PORT_SHIFTER) | pin) + + #ifdef PORTA + #define A0 PINDEF(A, 0) + #define A1 PINDEF(A, 1) + #define A2 PINDEF(A, 2) + #define A3 PINDEF(A, 3) + #define A4 PINDEF(A, 4) + #define A5 PINDEF(A, 5) + #define A6 PINDEF(A, 6) + #define A7 PINDEF(A, 7) + #endif + #ifdef PORTB + #define B0 PINDEF(B, 0) + #define B1 PINDEF(B, 1) + #define B2 PINDEF(B, 2) + #define B3 PINDEF(B, 3) + #define B4 PINDEF(B, 4) + #define B5 PINDEF(B, 5) + #define B6 PINDEF(B, 6) + #define B7 PINDEF(B, 7) + #endif + #ifdef PORTC + #define C0 PINDEF(C, 0) + #define C1 PINDEF(C, 1) + #define C2 PINDEF(C, 2) + #define C3 PINDEF(C, 3) + #define C4 PINDEF(C, 4) + #define C5 PINDEF(C, 5) + #define C6 PINDEF(C, 6) + #define C7 PINDEF(C, 7) + #endif + #ifdef PORTD + #define D0 PINDEF(D, 0) + #define D1 PINDEF(D, 1) + #define D2 PINDEF(D, 2) + #define D3 PINDEF(D, 3) + #define D4 PINDEF(D, 4) + #define D5 PINDEF(D, 5) + #define D6 PINDEF(D, 6) + #define D7 PINDEF(D, 7) + #endif + #ifdef PORTE + #define E0 PINDEF(E, 0) + #define E1 PINDEF(E, 1) + #define E2 PINDEF(E, 2) + #define E3 PINDEF(E, 3) + #define E4 PINDEF(E, 4) + #define E5 PINDEF(E, 5) + #define E6 PINDEF(E, 6) + #define E7 PINDEF(E, 7) + #endif + #ifdef PORTF + #define F0 PINDEF(F, 0) + #define F1 PINDEF(F, 1) + #define F2 PINDEF(F, 2) + #define F3 PINDEF(F, 3) + #define F4 PINDEF(F, 4) + #define F5 PINDEF(F, 5) + #define F6 PINDEF(F, 6) + #define F7 PINDEF(F, 7) + #endif + #elif defined(PROTOCOL_CHIBIOS) #define A0 PAL_LINE(GPIOA, 0) #define A1 PAL_LINE(GPIOA, 1) @@ -200,5 +250,3 @@ #define API_SYSEX_MAX_SIZE 32 #include "song_list.h" - -#endif diff --git a/quantum/quantum.h b/quantum/quantum.h index 1d3ee033f..fe670c8eb 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h @@ -140,26 +140,28 @@ extern uint32_t default_layer_state; //Function substitutions to ease GPIO manipulation #ifdef __AVR__ + #define PIN_ADDRESS(p, offset) _SFR_IO8(ADDRESS_BASE + (p >> PORT_SHIFTER) + offset) + #define pin_t uint8_t - #define setPinInput(pin) _SFR_IO8((pin >> 4) + 1) &= ~ _BV(pin & 0xF) + #define setPinInput(pin) PIN_ADDRESS(pin, 1) &= ~ _BV(pin & 0xF) #define setPinInputHigh(pin) ({\ - _SFR_IO8((pin >> 4) + 1) &= ~ _BV(pin & 0xF);\ - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF);\ + PIN_ADDRESS(pin, 1) &= ~ _BV(pin & 0xF);\ + PIN_ADDRESS(pin, 2) |= _BV(pin & 0xF);\ }) #define setPinInputLow(pin) _Static_assert(0, "AVR Processors cannot impliment an input as pull low") - #define setPinOutput(pin) _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF) + #define setPinOutput(pin) PIN_ADDRESS(pin, 1) |= _BV(pin & 0xF) - #define writePinHigh(pin) _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF) - #define writePinLow(pin) _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF) + #define writePinHigh(pin) PIN_ADDRESS(pin, 2) |= _BV(pin & 0xF) + #define writePinLow(pin) PIN_ADDRESS(pin, 2) &= ~_BV(pin & 0xF) static inline void writePin(pin_t pin, uint8_t level){ if (level){ - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); + PIN_ADDRESS(pin, 2) |= _BV(pin & 0xF); } else { - _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); + PIN_ADDRESS(pin, 2) &= ~_BV(pin & 0xF); } } - #define readPin(pin) (_SFR_IO8(pin >> 4) & _BV(pin & 0xF)) + #define readPin(pin) (PIN_ADDRESS(pin, 0) & _BV(pin & 0xF)) #elif defined(PROTOCOL_CHIBIOS) #define pin_t ioline_t #define setPinInput(pin) palSetLineMode(pin, PAL_MODE_INPUT) diff --git a/tmk_core/protocol/vusb/usbdrv/usbdrvasm.S b/tmk_core/protocol/vusb/usbdrv/usbdrvasm.S index 45fcf1831..2e8097da9 100644 --- a/tmk_core/protocol/vusb/usbdrv/usbdrvasm.S +++ b/tmk_core/protocol/vusb/usbdrv/usbdrvasm.S @@ -118,7 +118,7 @@ RTMODEL "__rt_version", "3" # define polyH r21 # define scratch r23 -#else /* __IAR_SYSTEMS_ASM__ */ +#else /* __IAR_SYSTEMS_ASM__ */ /* Register assignments for usbCrc16 on gcc */ /* Calling conventions on gcc: * First parameter passed in r24/r25, second in r22/23 and so on. @@ -151,7 +151,7 @@ RTMODEL "__rt_version", "3" ; unsigned table(unsigned char x) ; { ; unsigned value; -; +; ; value = (unsigned)x << 6; ; value ^= (unsigned)x << 7; ; if(parity(x)) @@ -161,7 +161,7 @@ RTMODEL "__rt_version", "3" ; unsigned usbCrc16(unsigned char *argPtr, unsigned char argLen) ; { ; unsigned crc = 0xffff; -; +; ; while(argLen--) ; crc = table(lo8(crc) ^ *argPtr++) ^ hi8(crc); ; return ~crc; @@ -299,7 +299,7 @@ usbCrc16Append: # define cnt16H r31 # define cntH r18 -#else /* __IAR_SYSTEMS_ASM__ */ +#else /* __IAR_SYSTEMS_ASM__ */ /* Register assignments for usbMeasureFrameLength on gcc */ /* Calling conventions on gcc: * First parameter passed in r24/r25, second in r22/23 and so on. From 34112dac36482edbd5331eac3dfe436752ff7653 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Fri, 2 Nov 2018 12:44:57 -0400 Subject: [PATCH 435/788] Adds the Proton C base project (#4224) * adds proton c base * fixes custom matrix include * adds readme.md * usable pins, readme update --- common_features.mk | 2 +- .../boards/GENERIC_STM32_F303XC/board.c | 126 ++ .../boards/GENERIC_STM32_F303XC/board.h | 1187 +++++++++++++++++ .../boards/GENERIC_STM32_F303XC/board.mk | 5 + keyboards/proton_c/bootloader_defs.h | 7 + keyboards/proton_c/chconf.h | 520 ++++++++ keyboards/proton_c/config.h | 121 ++ keyboards/proton_c/halconf.h | 388 ++++++ keyboards/proton_c/keymaps/default/keymap.c | 21 + keyboards/proton_c/mcuconf.h | 257 ++++ keyboards/proton_c/proton_c.c | 25 + keyboards/proton_c/proton_c.h | 18 + keyboards/proton_c/readme.md | 16 + keyboards/proton_c/rules.mk | 51 + 14 files changed, 2743 insertions(+), 1 deletion(-) create mode 100644 keyboards/proton_c/boards/GENERIC_STM32_F303XC/board.c create mode 100644 keyboards/proton_c/boards/GENERIC_STM32_F303XC/board.h create mode 100644 keyboards/proton_c/boards/GENERIC_STM32_F303XC/board.mk create mode 100644 keyboards/proton_c/bootloader_defs.h create mode 100644 keyboards/proton_c/chconf.h create mode 100644 keyboards/proton_c/config.h create mode 100644 keyboards/proton_c/halconf.h create mode 100644 keyboards/proton_c/keymaps/default/keymap.c create mode 100644 keyboards/proton_c/mcuconf.h create mode 100644 keyboards/proton_c/proton_c.c create mode 100644 keyboards/proton_c/proton_c.h create mode 100644 keyboards/proton_c/readme.md create mode 100644 keyboards/proton_c/rules.mk diff --git a/common_features.mk b/common_features.mk index 3fd8361a5..f44dfc47d 100644 --- a/common_features.mk +++ b/common_features.mk @@ -244,7 +244,7 @@ QUANTUM_SRC:= \ $(QUANTUM_DIR)/keymap_common.c \ $(QUANTUM_DIR)/keycode_config.c -ifndef CUSTOM_MATRIX +ifneq ($(strip $(CUSTOM_MATRIX)), yes) ifeq ($(strip $(SPLIT_KEYBOARD)), yes) QUANTUM_SRC += $(QUANTUM_DIR)/split_common/matrix.c else diff --git a/keyboards/proton_c/boards/GENERIC_STM32_F303XC/board.c b/keyboards/proton_c/boards/GENERIC_STM32_F303XC/board.c new file mode 100644 index 000000000..4331155df --- /dev/null +++ b/keyboards/proton_c/boards/GENERIC_STM32_F303XC/board.c @@ -0,0 +1,126 @@ +/* + ChibiOS - Copyright (C) 2006..2016 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. +*/ + +#include "hal.h" + +#if HAL_USE_PAL || defined(__DOXYGEN__) +/** + * @brief PAL setup. + * @details Digital I/O ports static configuration as defined in @p board.h. + * This variable is used by the HAL when initializing the PAL driver. + */ +const PALConfig pal_default_config = { +#if STM32_HAS_GPIOA + {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, + VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, +#endif +#if STM32_HAS_GPIOB + {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, + VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, +#endif +#if STM32_HAS_GPIOC + {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, + VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, +#endif +#if STM32_HAS_GPIOD + {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, + VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, +#endif +#if STM32_HAS_GPIOE + {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, + VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, +#endif +#if STM32_HAS_GPIOF + {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, + VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH}, +#endif +#if STM32_HAS_GPIOG + {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, + VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH}, +#endif +#if STM32_HAS_GPIOH + {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, + VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH}, +#endif +#if STM32_HAS_GPIOI + {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, + VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH} +#endif +}; +#endif + +void enter_bootloader_mode_if_requested(void); + +/** + * @brief Early initialization code. + * @details This initialization must be performed just after stack setup + * and before any other initialization. + */ +void __early_init(void) { + enter_bootloader_mode_if_requested(); + stm32_clock_init(); +} + +#if HAL_USE_SDC || defined(__DOXYGEN__) +/** + * @brief SDC card detection. + */ +bool sdc_lld_is_card_inserted(SDCDriver *sdcp) { + + (void)sdcp; + /* TODO: Fill the implementation.*/ + return true; +} + +/** + * @brief SDC card write protection detection. + */ +bool sdc_lld_is_write_protected(SDCDriver *sdcp) { + + (void)sdcp; + /* TODO: Fill the implementation.*/ + return false; +} +#endif /* HAL_USE_SDC */ + +#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) +/** + * @brief MMC_SPI card detection. + */ +bool mmc_lld_is_card_inserted(MMCDriver *mmcp) { + + (void)mmcp; + /* TODO: Fill the implementation.*/ + return true; +} + +/** + * @brief MMC_SPI card write protection detection. + */ +bool mmc_lld_is_write_protected(MMCDriver *mmcp) { + + (void)mmcp; + /* TODO: Fill the implementation.*/ + return false; +} +#endif + +/** + * @brief Board-specific initialization code. + * @todo Add your board-specific code, if any. + */ +void boardInit(void) { +} diff --git a/keyboards/proton_c/boards/GENERIC_STM32_F303XC/board.h b/keyboards/proton_c/boards/GENERIC_STM32_F303XC/board.h new file mode 100644 index 000000000..ec26557f3 --- /dev/null +++ b/keyboards/proton_c/boards/GENERIC_STM32_F303XC/board.h @@ -0,0 +1,1187 @@ +/* + ChibiOS - Copyright (C) 2006..2016 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 _BOARD_H_ +#define _BOARD_H_ + +/* + * Setup for Clueboard 60% Keyboard + */ + +/* + * Board identifier. + */ +#define BOARD_GENERIC_STM32_F303XC +#define BOARD_NAME "Planck PCB" + +/* + * Board oscillators-related settings. + * NOTE: LSE not fitted. + */ +#if !defined(STM32_LSECLK) +#define STM32_LSECLK 0U +#endif + +#define STM32_LSEDRV (3U << 3U) + +#if !defined(STM32_HSECLK) +#define STM32_HSECLK 8000000U +#endif + +// #define STM32_HSE_BYPASS + +/* + * MCU type as defined in the ST header. + */ +#define STM32F303xC + +/* + * IO pins assignments. + */ +#define GPIOA_PIN0 0U +#define GPIOA_PIN1 1U +#define GPIOA_PIN2 2U +#define GPIOA_PIN3 3U +#define GPIOA_PIN4 4U +#define GPIOA_PIN5 5U +#define GPIOA_PIN6 6U +#define GPIOA_PIN7 7U +#define GPIOA_PIN8 8U +#define GPIOA_PIN9 9U +#define GPIOA_PIN10 10U +#define GPIOA_USB_DM 11U +#define GPIOA_USB_DP 12U +#define GPIOA_SWDIO 13U +#define GPIOA_SWCLK 14U +#define GPIOA_PIN15 15U + +#define GPIOB_PIN0 0U +#define GPIOB_PIN1 1U +#define GPIOB_PIN2 2U +#define GPIOB_PIN3 3U +#define GPIOB_PIN4 4U +#define GPIOB_PIN5 5U +#define GPIOB_PIN6 6U +#define GPIOB_PIN7 7U +#define GPIOB_PIN8 8U +#define GPIOB_PIN9 9U +#define GPIOB_PIN10 10U +#define GPIOB_PIN11 11U +#define GPIOB_PIN12 12U +#define GPIOB_PIN13 13U +#define GPIOB_PIN14 14U +#define GPIOB_PIN15 15U + +#define GPIOC_PIN0 0U +#define GPIOC_PIN1 1U +#define GPIOC_PIN2 2U +#define GPIOC_PIN3 3U +#define GPIOC_PIN4 4U +#define GPIOC_PIN5 5U +#define GPIOC_PIN6 6U +#define GPIOC_PIN7 7U +#define GPIOC_PIN8 8U +#define GPIOC_PIN9 9U +#define GPIOC_PIN10 10U +#define GPIOC_PIN11 11U +#define GPIOC_PIN12 12U +#define GPIOC_PIN13 13U +#define GPIOC_PIN14 14U +#define GPIOC_PIN15 15U + +#define GPIOD_PIN0 0U +#define GPIOD_PIN1 1U +#define GPIOD_PIN2 2U +#define GPIOD_PIN3 3U +#define GPIOD_PIN4 4U +#define GPIOD_PIN5 5U +#define GPIOD_PIN6 6U +#define GPIOD_PIN7 7U +#define GPIOD_PIN8 8U +#define GPIOD_PIN9 9U +#define GPIOD_PIN10 10U +#define GPIOD_PIN11 11U +#define GPIOD_PIN12 12U +#define GPIOD_PIN13 13U +#define GPIOD_PIN14 14U +#define GPIOD_PIN15 15U + +#define GPIOE_PIN0 0U +#define GPIOE_PIN1 1U +#define GPIOE_PIN2 2U +#define GPIOE_PIN3 3U +#define GPIOE_PIN4 4U +#define GPIOE_PIN5 5U +#define GPIOE_PIN6 6U +#define GPIOE_PIN7 7U +#define GPIOE_PIN8 8U +#define GPIOE_PIN9 9U +#define GPIOE_PIN10 10U +#define GPIOE_PIN11 11U +#define GPIOE_PIN12 12U +#define GPIOE_PIN13 13U +#define GPIOE_PIN14 14U +#define GPIOE_PIN15 15U + +#define GPIOF_I2C2_SDA 0U +#define GPIOF_I2C2_SCL 1U +#define GPIOF_PIN2 2U +#define GPIOF_PIN3 3U +#define GPIOF_PIN4 4U +#define GPIOF_PIN5 5U +#define GPIOF_PIN6 6U +#define GPIOF_PIN7 7U +#define GPIOF_PIN8 8U +#define GPIOF_PIN9 9U +#define GPIOF_PIN10 10U +#define GPIOF_PIN11 11U +#define GPIOF_PIN12 12U +#define GPIOF_PIN13 13U +#define GPIOF_PIN14 14U +#define GPIOF_PIN15 15U + +#define GPIOG_PIN0 0U +#define GPIOG_PIN1 1U +#define GPIOG_PIN2 2U +#define GPIOG_PIN3 3U +#define GPIOG_PIN4 4U +#define GPIOG_PIN5 5U +#define GPIOG_PIN6 6U +#define GPIOG_PIN7 7U +#define GPIOG_PIN8 8U +#define GPIOG_PIN9 9U +#define GPIOG_PIN10 10U +#define GPIOG_PIN11 11U +#define GPIOG_PIN12 12U +#define GPIOG_PIN13 13U +#define GPIOG_PIN14 14U +#define GPIOG_PIN15 15U + +#define GPIOH_PIN0 0U +#define GPIOH_PIN1 1U +#define GPIOH_PIN2 2U +#define GPIOH_PIN3 3U +#define GPIOH_PIN4 4U +#define GPIOH_PIN5 5U +#define GPIOH_PIN6 6U +#define GPIOH_PIN7 7U +#define GPIOH_PIN8 8U +#define GPIOH_PIN9 9U +#define GPIOH_PIN10 10U +#define GPIOH_PIN11 11U +#define GPIOH_PIN12 12U +#define GPIOH_PIN13 13U +#define GPIOH_PIN14 14U +#define GPIOH_PIN15 15U + +/* + * IO lines assignments. + */ +#define LINE_L3GD20_SDI PAL_LINE(GPIOA, 7U) +#define LINE_USB_DM PAL_LINE(GPIOA, 11U) +#define LINE_USB_DP PAL_LINE(GPIOA, 12U) +#define LINE_SWDIO PAL_LINE(GPIOA, 13U) +#define LINE_SWCLK PAL_LINE(GPIOA, 14U) + +#define LINE_PIN6 PAL_LINE(GPIOF, 0U) +#define LINE_PIN7 PAL_LINE(GPIOF, 1U) + +#define LINE_CAPS_LOCK PAL_LINE(GPIOB, 7U) + + +/* + * I/O ports initial setup, this configuration is established soon after reset + * in the initialization code. + * Please refer to the STM32 Reference Manual for details. + */ +#define PIN_MODE_INPUT(n) (0U << ((n) * 2U)) +#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U)) +#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U)) +#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U)) +#define PIN_ODR_LOW(n) (0U << (n)) +#define PIN_ODR_HIGH(n) (1U << (n)) +#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) +#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) +#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U)) +#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U)) +#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U)) +#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U)) +#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U)) +#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U)) +#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U)) +#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U)) + +/* + * GPIOA setup: + * + * PA0 - NC + * PA1 - NC + * PA2 - COL1 + * PA3 - COL2 + * PA4 - SPEAKER1 + * PA5 - SPEAKER2 + * PA6 - COL3 + * PA7 - COL8 + * PA8 - COL6 + * PA9 - COL7 + * PA10 - ROW5 + * PA11 - USB_DM (alternate 14). + * PA12 - USB_DP (alternate 14). + * PA13 - SWDIO (alternate 0). + * PA14 - SWCLK (alternate 0). + * PA15 - ROW4 + */ +#define VAL_GPIOA_MODER (PIN_MODE_INPUT(GPIOA_PIN0) | \ + PIN_MODE_ALTERNATE(GPIOA_PIN1) | \ + PIN_MODE_INPUT(GPIOA_PIN2) | \ + PIN_MODE_INPUT(GPIOA_PIN3) | \ + PIN_MODE_INPUT(GPIOA_PIN4) | \ + PIN_MODE_INPUT(GPIOA_PIN5) | \ + PIN_MODE_INPUT(GPIOA_PIN6) | \ + PIN_MODE_INPUT(GPIOA_PIN7) | \ + PIN_MODE_INPUT(GPIOA_PIN8) | \ + PIN_MODE_INPUT(GPIOA_PIN9) | \ + PIN_MODE_INPUT(GPIOA_PIN10) | \ + PIN_MODE_ALTERNATE(GPIOA_USB_DM) | \ + PIN_MODE_ALTERNATE(GPIOA_USB_DP) | \ + PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \ + PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \ + PIN_MODE_INPUT(GPIOA_PIN15)) +#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOA_USB_DM) | \ + PIN_OTYPE_PUSHPULL(GPIOA_USB_DP) | \ + PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | \ + PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN15)) +#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOA_PIN0) | \ + PIN_OSPEED_HIGH(GPIOA_PIN1) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN10) | \ + PIN_OSPEED_HIGH(GPIOA_USB_DM) | \ + PIN_OSPEED_VERYLOW(GPIOA_USB_DP) | \ + PIN_OSPEED_HIGH(GPIOA_SWDIO) | \ + PIN_OSPEED_HIGH(GPIOA_SWCLK) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN15)) +#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_PIN0) | \ + PIN_PUPDR_FLOATING(GPIOA_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN6) | \ + PIN_PUPDR_FLOATING(GPIOA_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN10) | \ + PIN_PUPDR_FLOATING(GPIOA_USB_DM) | \ + PIN_PUPDR_FLOATING(GPIOA_USB_DP) | \ + PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \ + PIN_PUPDR_PULLDOWN(GPIOA_SWCLK) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN15)) +#define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_PIN0) | \ + PIN_ODR_HIGH(GPIOA_PIN1) | \ + PIN_ODR_HIGH(GPIOA_PIN2) | \ + PIN_ODR_HIGH(GPIOA_PIN3) | \ + PIN_ODR_HIGH(GPIOA_PIN4) | \ + PIN_ODR_HIGH(GPIOA_PIN5) | \ + PIN_ODR_HIGH(GPIOA_PIN6) | \ + PIN_ODR_HIGH(GPIOA_PIN7) | \ + PIN_ODR_HIGH(GPIOA_PIN8) | \ + PIN_ODR_HIGH(GPIOA_PIN9) | \ + PIN_ODR_HIGH(GPIOA_PIN10) | \ + PIN_ODR_HIGH(GPIOA_USB_DM) | \ + PIN_ODR_HIGH(GPIOA_USB_DP) | \ + PIN_ODR_HIGH(GPIOA_SWDIO) | \ + PIN_ODR_HIGH(GPIOA_SWCLK) | \ + PIN_ODR_HIGH(GPIOA_PIN15)) +#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_PIN0, 0) | \ + PIN_AFIO_AF(GPIOA_PIN1, 1) | \ + PIN_AFIO_AF(GPIOA_PIN2, 0) | \ + PIN_AFIO_AF(GPIOA_PIN3, 0) | \ + PIN_AFIO_AF(GPIOA_PIN4, 0) | \ + PIN_AFIO_AF(GPIOA_PIN5, 5) | \ + PIN_AFIO_AF(GPIOA_PIN6, 5) | \ + PIN_AFIO_AF(GPIOA_PIN7, 5)) +#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_PIN8, 0) | \ + PIN_AFIO_AF(GPIOA_PIN9, 0) | \ + PIN_AFIO_AF(GPIOA_PIN10, 0) | \ + PIN_AFIO_AF(GPIOA_USB_DM, 14) | \ + PIN_AFIO_AF(GPIOA_USB_DP, 14) | \ + PIN_AFIO_AF(GPIOA_SWDIO, 0) | \ + PIN_AFIO_AF(GPIOA_SWCLK, 0) | \ + PIN_AFIO_AF(GPIOA_PIN15, 0)) + +/* + * GPIOB setup: + * + * PB0 - PIN0 (input pullup). + * PB1 - PIN1 (input pullup). + * PB2 - PIN2 (input pullup). + * PB3 - PIN3 (alternate 0). + * PB4 - PIN4 (input pullup). + * PB5 - PIN5 (input pullup). + * PB6 - PIN6 LSM303DLHC_SCL (alternate 4). + * PB7 - PIN7 LSM303DLHC_SDA (alternate 4). + * PB8 - PIN8 (input pullup). + * PB9 - PIN9 (input pullup). + * PB10 - PIN10 (input pullup). + * PB11 - PIN11 (input pullup). + * PB12 - PIN12 (input pullup). + * PB13 - PIN13 (input pullup). + * PB14 - PIN14 (input pullup). + * PB15 - PIN15 (input pullup). + */ +#define VAL_GPIOB_MODER (PIN_MODE_INPUT(GPIOB_PIN0) | \ + PIN_MODE_INPUT(GPIOB_PIN1) | \ + PIN_MODE_INPUT(GPIOB_PIN2) | \ + PIN_MODE_ALTERNATE(GPIOB_PIN3) | \ + PIN_MODE_INPUT(GPIOB_PIN4) | \ + PIN_MODE_INPUT(GPIOB_PIN5) | \ + PIN_MODE_ALTERNATE(GPIOB_PIN6) | \ + PIN_MODE_OUTPUT(GPIOB_PIN7) | \ + PIN_MODE_INPUT(GPIOB_PIN8) | \ + PIN_MODE_INPUT(GPIOB_PIN9) | \ + PIN_MODE_INPUT(GPIOB_PIN10) | \ + PIN_MODE_INPUT(GPIOB_PIN11) | \ + PIN_MODE_INPUT(GPIOB_PIN12) | \ + PIN_MODE_INPUT(GPIOB_PIN13) | \ + PIN_MODE_INPUT(GPIOB_PIN14) | \ + PIN_MODE_INPUT(GPIOB_PIN15)) +#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN5) | \ + PIN_OTYPE_OPENDRAIN(GPIOB_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN15)) +#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOB_PIN0) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN1) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN2) | \ + PIN_OSPEED_HIGH(GPIOB_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN5) | \ + PIN_OSPEED_HIGH(GPIOB_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN10) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN11) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN12) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN13) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN14) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN15)) +#define VAL_GPIOB_PUPDR (PIN_PUPDR_PULLUP(GPIOB_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN2) | \ + PIN_PUPDR_FLOATING(GPIOB_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN5) | \ + PIN_PUPDR_FLOATING(GPIOB_PIN6) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN15)) +#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_PIN0) | \ + PIN_ODR_HIGH(GPIOB_PIN1) | \ + PIN_ODR_HIGH(GPIOB_PIN2) | \ + PIN_ODR_HIGH(GPIOB_PIN3) | \ + PIN_ODR_HIGH(GPIOB_PIN4) | \ + PIN_ODR_HIGH(GPIOB_PIN5) | \ + PIN_ODR_HIGH(GPIOB_PIN6) | \ + PIN_ODR_LOW(GPIOB_PIN7) | \ + PIN_ODR_HIGH(GPIOB_PIN8) | \ + PIN_ODR_HIGH(GPIOB_PIN9) | \ + PIN_ODR_HIGH(GPIOB_PIN10) | \ + PIN_ODR_HIGH(GPIOB_PIN11) | \ + PIN_ODR_HIGH(GPIOB_PIN12) | \ + PIN_ODR_HIGH(GPIOB_PIN13) | \ + PIN_ODR_HIGH(GPIOB_PIN14) | \ + PIN_ODR_HIGH(GPIOB_PIN15)) +#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0) | \ + PIN_AFIO_AF(GPIOB_PIN1, 0) | \ + PIN_AFIO_AF(GPIOB_PIN2, 0) | \ + PIN_AFIO_AF(GPIOB_PIN3, 0) | \ + PIN_AFIO_AF(GPIOB_PIN4, 0) | \ + PIN_AFIO_AF(GPIOB_PIN5, 0) | \ + PIN_AFIO_AF(GPIOB_PIN6, 4) | \ + PIN_AFIO_AF(GPIOB_PIN7, 0)) +#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0) | \ + PIN_AFIO_AF(GPIOB_PIN9, 0) | \ + PIN_AFIO_AF(GPIOB_PIN10, 0) | \ + PIN_AFIO_AF(GPIOB_PIN11, 0) | \ + PIN_AFIO_AF(GPIOB_PIN12, 0) | \ + PIN_AFIO_AF(GPIOB_PIN13, 0) | \ + PIN_AFIO_AF(GPIOB_PIN14, 0) | \ + PIN_AFIO_AF(GPIOB_PIN15, 0)) + +/* + * GPIOC setup: + * + * PC0 - PIN0 (input pullup). + * PC1 - PIN1 (input pullup). + * PC2 - PIN2 (input pullup). + * PC3 - PIN3 (input pullup). + * PC4 - PIN4 (input pullup). + * PC5 - PIN5 (input pullup). + * PC6 - PIN6 (input pullup). + * PC7 - PIN7 (input pullup). + * PC8 - PIN8 (input pullup). + * PC9 - PIN9 (input pullup). + * PC10 - PIN10 (input pullup). + * PC11 - PIN11 (input pullup). + * PC12 - PIN12 (input pullup). + * PC13 - PIN13 (input pullup). + * PC14 - PIN14 (input floating). + * PC15 - PIN15 (input floating). + */ +#define VAL_GPIOC_MODER (PIN_MODE_INPUT(GPIOC_PIN0) | \ + PIN_MODE_INPUT(GPIOC_PIN1) | \ + PIN_MODE_INPUT(GPIOC_PIN2) | \ + PIN_MODE_INPUT(GPIOC_PIN3) | \ + PIN_MODE_INPUT(GPIOC_PIN4) | \ + PIN_MODE_INPUT(GPIOC_PIN5) | \ + PIN_MODE_INPUT(GPIOC_PIN6) | \ + PIN_MODE_INPUT(GPIOC_PIN7) | \ + PIN_MODE_INPUT(GPIOC_PIN8) | \ + PIN_MODE_INPUT(GPIOC_PIN9) | \ + PIN_MODE_INPUT(GPIOC_PIN10) | \ + PIN_MODE_INPUT(GPIOC_PIN11) | \ + PIN_MODE_INPUT(GPIOC_PIN12) | \ + PIN_MODE_INPUT(GPIOC_PIN13) | \ + PIN_MODE_INPUT(GPIOC_PIN14) | \ + PIN_MODE_INPUT(GPIOC_PIN15)) +#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN15)) +#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOC_PIN0) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN1) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN10) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN11) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN12) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN13) | \ + PIN_OSPEED_HIGH(GPIOC_PIN14) | \ + PIN_OSPEED_HIGH(GPIOC_PIN15)) +#define VAL_GPIOC_PUPDR (PIN_PUPDR_PULLUP(GPIOC_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN13) | \ + PIN_PUPDR_FLOATING(GPIOC_PIN14) | \ + PIN_PUPDR_FLOATING(GPIOC_PIN15)) +#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_PIN0) | \ + PIN_ODR_HIGH(GPIOC_PIN1) | \ + PIN_ODR_HIGH(GPIOC_PIN2) | \ + PIN_ODR_HIGH(GPIOC_PIN3) | \ + PIN_ODR_HIGH(GPIOC_PIN4) | \ + PIN_ODR_HIGH(GPIOC_PIN5) | \ + PIN_ODR_HIGH(GPIOC_PIN6) | \ + PIN_ODR_HIGH(GPIOC_PIN7) | \ + PIN_ODR_HIGH(GPIOC_PIN8) | \ + PIN_ODR_HIGH(GPIOC_PIN9) | \ + PIN_ODR_HIGH(GPIOC_PIN10) | \ + PIN_ODR_HIGH(GPIOC_PIN11) | \ + PIN_ODR_HIGH(GPIOC_PIN12) | \ + PIN_ODR_HIGH(GPIOC_PIN13) | \ + PIN_ODR_HIGH(GPIOC_PIN14) | \ + PIN_ODR_HIGH(GPIOC_PIN15)) +#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_PIN0, 0) | \ + PIN_AFIO_AF(GPIOC_PIN1, 0) | \ + PIN_AFIO_AF(GPIOC_PIN2, 0) | \ + PIN_AFIO_AF(GPIOC_PIN3, 0) | \ + PIN_AFIO_AF(GPIOC_PIN4, 0) | \ + PIN_AFIO_AF(GPIOC_PIN5, 0) | \ + PIN_AFIO_AF(GPIOC_PIN6, 0) | \ + PIN_AFIO_AF(GPIOC_PIN7, 0)) +#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_PIN8, 0) | \ + PIN_AFIO_AF(GPIOC_PIN9, 0) | \ + PIN_AFIO_AF(GPIOC_PIN10, 0) | \ + PIN_AFIO_AF(GPIOC_PIN11, 0) | \ + PIN_AFIO_AF(GPIOC_PIN12, 0) | \ + PIN_AFIO_AF(GPIOC_PIN13, 0) | \ + PIN_AFIO_AF(GPIOC_PIN14, 0) | \ + PIN_AFIO_AF(GPIOC_PIN15, 0)) + +/* + * GPIOD setup: + * + * PD0 - PIN0 (input pullup). + * PD1 - PIN1 (input pullup). + * PD2 - PIN2 (input pullup). + * PD3 - PIN3 (input pullup). + * PD4 - PIN4 (input pullup). + * PD5 - PIN5 (input pullup). + * PD6 - PIN6 (input pullup). + * PD7 - PIN7 (input pullup). + * PD8 - PIN8 (input pullup). + * PD9 - PIN9 (input pullup). + * PD11 - PIN10 (input pullup). + * PD11 - PIN11 (input pullup). + * PD12 - PIN12 (input pullup). + * PD13 - PIN13 (input pullup). + * PD14 - PIN14 (input pullup). + * PD15 - PIN15 (input pullup). + */ +#define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_PIN0) | \ + PIN_MODE_INPUT(GPIOD_PIN1) | \ + PIN_MODE_INPUT(GPIOD_PIN2) | \ + PIN_MODE_INPUT(GPIOD_PIN3) | \ + PIN_MODE_INPUT(GPIOD_PIN4) | \ + PIN_MODE_INPUT(GPIOD_PIN5) | \ + PIN_MODE_INPUT(GPIOD_PIN6) | \ + PIN_MODE_INPUT(GPIOD_PIN7) | \ + PIN_MODE_INPUT(GPIOD_PIN8) | \ + PIN_MODE_INPUT(GPIOD_PIN9) | \ + PIN_MODE_INPUT(GPIOD_PIN10) | \ + PIN_MODE_INPUT(GPIOD_PIN11) | \ + PIN_MODE_INPUT(GPIOD_PIN12) | \ + PIN_MODE_INPUT(GPIOD_PIN13) | \ + PIN_MODE_INPUT(GPIOD_PIN14) | \ + PIN_MODE_INPUT(GPIOD_PIN15)) +#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN15)) +#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOD_PIN0) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN1) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN10) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN11) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN12) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN13) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN14) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN15)) +#define VAL_GPIOD_PUPDR (PIN_PUPDR_PULLUP(GPIOD_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN15)) +#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \ + PIN_ODR_HIGH(GPIOD_PIN1) | \ + PIN_ODR_HIGH(GPIOD_PIN2) | \ + PIN_ODR_HIGH(GPIOD_PIN3) | \ + PIN_ODR_HIGH(GPIOD_PIN4) | \ + PIN_ODR_HIGH(GPIOD_PIN5) | \ + PIN_ODR_HIGH(GPIOD_PIN6) | \ + PIN_ODR_HIGH(GPIOD_PIN7) | \ + PIN_ODR_HIGH(GPIOD_PIN8) | \ + PIN_ODR_HIGH(GPIOD_PIN9) | \ + PIN_ODR_HIGH(GPIOD_PIN10) | \ + PIN_ODR_HIGH(GPIOD_PIN11) | \ + PIN_ODR_HIGH(GPIOD_PIN12) | \ + PIN_ODR_HIGH(GPIOD_PIN13) | \ + PIN_ODR_HIGH(GPIOD_PIN14) | \ + PIN_ODR_HIGH(GPIOD_PIN15)) +#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0) | \ + PIN_AFIO_AF(GPIOD_PIN1, 0) | \ + PIN_AFIO_AF(GPIOD_PIN2, 0) | \ + PIN_AFIO_AF(GPIOD_PIN3, 0) | \ + PIN_AFIO_AF(GPIOD_PIN4, 0) | \ + PIN_AFIO_AF(GPIOD_PIN5, 0) | \ + PIN_AFIO_AF(GPIOD_PIN6, 0) | \ + PIN_AFIO_AF(GPIOD_PIN7, 0)) +#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0) | \ + PIN_AFIO_AF(GPIOD_PIN9, 0) | \ + PIN_AFIO_AF(GPIOD_PIN10, 0) | \ + PIN_AFIO_AF(GPIOD_PIN11, 0) | \ + PIN_AFIO_AF(GPIOD_PIN12, 0) | \ + PIN_AFIO_AF(GPIOD_PIN13, 0) | \ + PIN_AFIO_AF(GPIOD_PIN14, 0) | \ + PIN_AFIO_AF(GPIOD_PIN15, 0)) + +/* + * GPIOE setup: + * + * PE0 - PIN0 (input pullup). + * PE1 - PIN1 (input pullup). + * PE2 - PIN2 (input pullup). + * PE3 - PIN3 L3GD20_CS (output pushpull maximum). + * PE4 - PIN4 (input pullup). + * PE5 - PIN5 (input pullup). + * PE6 - PIN6 (input pullup). + * PE7 - PIN7 (input pullup). + * PE8 - PIN8 (output pushpull maximum). + * PE9 - PIN9 (output pushpull maximum). + * PE10 - PIN10 (output pushpull maximum). + * PE11 - PIN11 (output pushpull maximum). + * PE12 - PIN12 (output pushpull maximum). + * PE13 - PIN13 (output pushpull maximum). + * PE14 - PIN14 (output pushpull maximum). + * PE15 - PIN15 (output pushpull maximum). + */ +#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_PIN0) | \ + PIN_MODE_INPUT(GPIOE_PIN1) | \ + PIN_MODE_INPUT(GPIOE_PIN2) |\ + PIN_MODE_OUTPUT(GPIOE_PIN3) | \ + PIN_MODE_INPUT(GPIOE_PIN4) |\ + PIN_MODE_INPUT(GPIOE_PIN5) |\ + PIN_MODE_INPUT(GPIOE_PIN6) | \ + PIN_MODE_INPUT(GPIOE_PIN7) | \ + PIN_MODE_OUTPUT(GPIOE_PIN8) | \ + PIN_MODE_OUTPUT(GPIOE_PIN9) | \ + PIN_MODE_OUTPUT(GPIOE_PIN10) | \ + PIN_MODE_OUTPUT(GPIOE_PIN11) | \ + PIN_MODE_OUTPUT(GPIOE_PIN12) | \ + PIN_MODE_OUTPUT(GPIOE_PIN13) | \ + PIN_MODE_OUTPUT(GPIOE_PIN14) | \ + PIN_MODE_OUTPUT(GPIOE_PIN15)) +#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) |\ + PIN_OTYPE_PUSHPULL(GPIOE_PIN1) |\ + PIN_OTYPE_PUSHPULL(GPIOE_PIN2) |\ + PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN4) |\ + PIN_OTYPE_PUSHPULL(GPIOE_PIN5) |\ + PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN10) |\ + PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN14) |\ + PIN_OTYPE_PUSHPULL(GPIOE_PIN15)) +#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOE_PIN0) |\ + PIN_OSPEED_VERYLOW(GPIOE_PIN1) |\ + PIN_OSPEED_VERYLOW(GPIOE_PIN2) |\ + PIN_OSPEED_HIGH(GPIOE_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOE_PIN4) |\ + PIN_OSPEED_VERYLOW(GPIOE_PIN5) |\ + PIN_OSPEED_VERYLOW(GPIOE_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOE_PIN7) | \ + PIN_OSPEED_HIGH(GPIOE_PIN8) | \ + PIN_OSPEED_HIGH(GPIOE_PIN9) | \ + PIN_OSPEED_HIGH(GPIOE_PIN10) | \ + PIN_OSPEED_HIGH(GPIOE_PIN11) | \ + PIN_OSPEED_HIGH(GPIOE_PIN12) | \ + PIN_OSPEED_HIGH(GPIOE_PIN13) | \ + PIN_OSPEED_HIGH(GPIOE_PIN14) | \ + PIN_OSPEED_HIGH(GPIOE_PIN15)) +#define VAL_GPIOE_PUPDR (PIN_PUPDR_PULLUP(GPIOE_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN2) |\ + PIN_PUPDR_FLOATING(GPIOE_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN4) |\ + PIN_PUPDR_PULLUP(GPIOE_PIN5) |\ + PIN_PUPDR_PULLUP(GPIOE_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN10) | \ + PIN_PUPDR_FLOATING(GPIOE_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN12) | \ + PIN_PUPDR_FLOATING(GPIOE_PIN13) | \ + PIN_PUPDR_FLOATING(GPIOE_PIN14) |\ + PIN_PUPDR_FLOATING(GPIOE_PIN15)) +#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \ + PIN_ODR_HIGH(GPIOE_PIN1) | \ + PIN_ODR_HIGH(GPIOE_PIN2) | \ + PIN_ODR_HIGH(GPIOE_PIN3) | \ + PIN_ODR_HIGH(GPIOE_PIN4) | \ + PIN_ODR_HIGH(GPIOE_PIN5) | \ + PIN_ODR_HIGH(GPIOE_PIN6) | \ + PIN_ODR_HIGH(GPIOE_PIN7) | \ + PIN_ODR_LOW(GPIOE_PIN8) | \ + PIN_ODR_LOW(GPIOE_PIN9) | \ + PIN_ODR_LOW(GPIOE_PIN10) | \ + PIN_ODR_LOW(GPIOE_PIN11) | \ + PIN_ODR_LOW(GPIOE_PIN12) | \ + PIN_ODR_LOW(GPIOE_PIN13) | \ + PIN_ODR_LOW(GPIOE_PIN14) | \ + PIN_ODR_LOW(GPIOE_PIN15)) +#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0) | \ + PIN_AFIO_AF(GPIOE_PIN1, 0) | \ + PIN_AFIO_AF(GPIOE_PIN2, 0) |\ + PIN_AFIO_AF(GPIOE_PIN3, 0) | \ + PIN_AFIO_AF(GPIOE_PIN4, 0) |\ + PIN_AFIO_AF(GPIOE_PIN5, 0) |\ + PIN_AFIO_AF(GPIOE_PIN6, 0) | \ + PIN_AFIO_AF(GPIOE_PIN7, 0)) +#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0) | \ + PIN_AFIO_AF(GPIOE_PIN9, 0) | \ + PIN_AFIO_AF(GPIOE_PIN10, 0) | \ + PIN_AFIO_AF(GPIOE_PIN11, 0) | \ + PIN_AFIO_AF(GPIOE_PIN12, 0) | \ + PIN_AFIO_AF(GPIOE_PIN13, 0) | \ + PIN_AFIO_AF(GPIOE_PIN14, 0) | \ + PIN_AFIO_AF(GPIOE_PIN15, 0)) + +/* + * GPIOF setup: + * + * PF0 - I2C2_SDA (input floating). + * PF1 - I2C2_SCL (input floating). + * PF2 - PIN2 (input pullup). + * PF3 - PIN3 (input pullup). + * PF4 - PIN4 (input pullup). + * PF5 - PIN5 (input pullup). + * PF6 - PIN6 (input pullup). + * PF7 - PIN7 (input pullup). + * PF8 - PIN8 (input pullup). + * PF9 - PIN9 (input pullup). + * PF10 - PIN10 (input pullup). + * PF11 - PIN11 (input pullup). + * PF12 - PIN12 (input pullup). + * PF13 - PIN13 (input pullup). + * PF14 - PIN14 (input pullup). + * PF15 - PIN15 (input pullup). + */ +#define VAL_GPIOF_MODER (PIN_MODE_INPUT(GPIOF_I2C2_SDA) | \ + PIN_MODE_INPUT(GPIOF_I2C2_SCL) | \ + PIN_MODE_INPUT(GPIOF_PIN2) | \ + PIN_MODE_INPUT(GPIOF_PIN3) | \ + PIN_MODE_INPUT(GPIOF_PIN4) | \ + PIN_MODE_INPUT(GPIOF_PIN5) | \ + PIN_MODE_INPUT(GPIOF_PIN6) | \ + PIN_MODE_INPUT(GPIOF_PIN7) | \ + PIN_MODE_INPUT(GPIOF_PIN8) | \ + PIN_MODE_INPUT(GPIOF_PIN9) | \ + PIN_MODE_INPUT(GPIOF_PIN10) | \ + PIN_MODE_INPUT(GPIOF_PIN11) | \ + PIN_MODE_INPUT(GPIOF_PIN12) | \ + PIN_MODE_INPUT(GPIOF_PIN13) | \ + PIN_MODE_INPUT(GPIOF_PIN14) | \ + PIN_MODE_INPUT(GPIOF_PIN15)) +#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_I2C2_SDA) | \ + PIN_OTYPE_PUSHPULL(GPIOF_I2C2_SCL) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN15)) +#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_HIGH(GPIOF_I2C2_SDA) | \ + PIN_OSPEED_HIGH(GPIOF_I2C2_SCL) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN10) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN11) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN12) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN13) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN14) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN15)) +#define VAL_GPIOF_PUPDR (PIN_PUPDR_FLOATING(GPIOF_I2C2_SDA) | \ + PIN_PUPDR_FLOATING(GPIOF_I2C2_SCL) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN15)) +#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_I2C2_SDA) | \ + PIN_ODR_HIGH(GPIOF_I2C2_SCL) | \ + PIN_ODR_HIGH(GPIOF_PIN2) | \ + PIN_ODR_HIGH(GPIOF_PIN3) | \ + PIN_ODR_HIGH(GPIOF_PIN4) | \ + PIN_ODR_HIGH(GPIOF_PIN5) | \ + PIN_ODR_HIGH(GPIOF_PIN6) | \ + PIN_ODR_HIGH(GPIOF_PIN7) | \ + PIN_ODR_HIGH(GPIOF_PIN8) | \ + PIN_ODR_HIGH(GPIOF_PIN9) | \ + PIN_ODR_HIGH(GPIOF_PIN10) | \ + PIN_ODR_HIGH(GPIOF_PIN11) | \ + PIN_ODR_HIGH(GPIOF_PIN12) | \ + PIN_ODR_HIGH(GPIOF_PIN13) | \ + PIN_ODR_HIGH(GPIOF_PIN14) | \ + PIN_ODR_HIGH(GPIOF_PIN15)) +#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_I2C2_SDA, 0) | \ + PIN_AFIO_AF(GPIOF_I2C2_SCL, 0) | \ + PIN_AFIO_AF(GPIOF_PIN2, 0) | \ + PIN_AFIO_AF(GPIOF_PIN3, 0) | \ + PIN_AFIO_AF(GPIOF_PIN4, 0) | \ + PIN_AFIO_AF(GPIOF_PIN5, 0) | \ + PIN_AFIO_AF(GPIOF_PIN6, 0) | \ + PIN_AFIO_AF(GPIOF_PIN7, 0)) +#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0) | \ + PIN_AFIO_AF(GPIOF_PIN9, 0) | \ + PIN_AFIO_AF(GPIOF_PIN10, 0) | \ + PIN_AFIO_AF(GPIOF_PIN11, 0) | \ + PIN_AFIO_AF(GPIOF_PIN12, 0) | \ + PIN_AFIO_AF(GPIOF_PIN13, 0) | \ + PIN_AFIO_AF(GPIOF_PIN14, 0) | \ + PIN_AFIO_AF(GPIOF_PIN15, 0)) + +/* + * GPIOG setup: + * + * PG0 - PIN0 (input pullup). + * PG1 - PIN1 (input pullup). + * PG2 - PIN2 (input pullup). + * PG3 - PIN3 (input pullup). + * PG4 - PIN4 (input pullup). + * PG5 - PIN5 (input pullup). + * PG6 - PIN6 (input pullup). + * PG7 - PIN7 (input pullup). + * PG8 - PIN8 (input pullup). + * PG9 - PIN9 (input pullup). + * PG10 - PIN10 (input pullup). + * PG11 - PIN11 (input pullup). + * PG12 - PIN12 (input pullup). + * PG13 - PIN13 (input pullup). + * PG14 - PIN14 (input pullup). + * PG15 - PIN15 (input pullup). + */ +#define VAL_GPIOG_MODER (PIN_MODE_INPUT(GPIOG_PIN0) | \ + PIN_MODE_INPUT(GPIOG_PIN1) | \ + PIN_MODE_INPUT(GPIOG_PIN2) | \ + PIN_MODE_INPUT(GPIOG_PIN3) | \ + PIN_MODE_INPUT(GPIOG_PIN4) | \ + PIN_MODE_INPUT(GPIOG_PIN5) | \ + PIN_MODE_INPUT(GPIOG_PIN6) | \ + PIN_MODE_INPUT(GPIOG_PIN7) | \ + PIN_MODE_INPUT(GPIOG_PIN8) | \ + PIN_MODE_INPUT(GPIOG_PIN9) | \ + PIN_MODE_INPUT(GPIOG_PIN10) | \ + PIN_MODE_INPUT(GPIOG_PIN11) | \ + PIN_MODE_INPUT(GPIOG_PIN12) | \ + PIN_MODE_INPUT(GPIOG_PIN13) | \ + PIN_MODE_INPUT(GPIOG_PIN14) | \ + PIN_MODE_INPUT(GPIOG_PIN15)) +#define VAL_GPIOG_OTYPER (PIN_OTYPE_PUSHPULL(GPIOG_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN15)) +#define VAL_GPIOG_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOG_PIN0) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN1) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN10) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN11) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN12) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN13) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN14) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN15)) +#define VAL_GPIOG_PUPDR (PIN_PUPDR_PULLUP(GPIOG_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN15)) +#define VAL_GPIOG_ODR (PIN_ODR_HIGH(GPIOG_PIN0) | \ + PIN_ODR_HIGH(GPIOG_PIN1) | \ + PIN_ODR_HIGH(GPIOG_PIN2) | \ + PIN_ODR_HIGH(GPIOG_PIN3) | \ + PIN_ODR_HIGH(GPIOG_PIN4) | \ + PIN_ODR_HIGH(GPIOG_PIN5) | \ + PIN_ODR_HIGH(GPIOG_PIN6) | \ + PIN_ODR_HIGH(GPIOG_PIN7) | \ + PIN_ODR_HIGH(GPIOG_PIN8) | \ + PIN_ODR_HIGH(GPIOG_PIN9) | \ + PIN_ODR_HIGH(GPIOG_PIN10) | \ + PIN_ODR_HIGH(GPIOG_PIN11) | \ + PIN_ODR_HIGH(GPIOG_PIN12) | \ + PIN_ODR_HIGH(GPIOG_PIN13) | \ + PIN_ODR_HIGH(GPIOG_PIN14) | \ + PIN_ODR_HIGH(GPIOG_PIN15)) +#define VAL_GPIOG_AFRL (PIN_AFIO_AF(GPIOG_PIN0, 0) | \ + PIN_AFIO_AF(GPIOG_PIN1, 0) | \ + PIN_AFIO_AF(GPIOG_PIN2, 0) | \ + PIN_AFIO_AF(GPIOG_PIN3, 0) | \ + PIN_AFIO_AF(GPIOG_PIN4, 0) | \ + PIN_AFIO_AF(GPIOG_PIN5, 0) | \ + PIN_AFIO_AF(GPIOG_PIN6, 0) | \ + PIN_AFIO_AF(GPIOG_PIN7, 0)) +#define VAL_GPIOG_AFRH (PIN_AFIO_AF(GPIOG_PIN8, 0) | \ + PIN_AFIO_AF(GPIOG_PIN9, 0) | \ + PIN_AFIO_AF(GPIOG_PIN10, 0) | \ + PIN_AFIO_AF(GPIOG_PIN11, 0) | \ + PIN_AFIO_AF(GPIOG_PIN12, 0) | \ + PIN_AFIO_AF(GPIOG_PIN13, 0) | \ + PIN_AFIO_AF(GPIOG_PIN14, 0) | \ + PIN_AFIO_AF(GPIOG_PIN15, 0)) + +/* + * GPIOH setup: + * + * PH0 - PIN0 (input pullup). + * PH1 - PIN1 (input pullup). + * PH2 - PIN2 (input pullup). + * PH3 - PIN3 (input pullup). + * PH4 - PIN4 (input pullup). + * PH5 - PIN5 (input pullup). + * PH6 - PIN6 (input pullup). + * PH7 - PIN7 (input pullup). + * PH8 - PIN8 (input pullup). + * PH9 - PIN9 (input pullup). + * PH10 - PIN10 (input pullup). + * PH11 - PIN11 (input pullup). + * PH12 - PIN12 (input pullup). + * PH13 - PIN13 (input pullup). + * PH14 - PIN14 (input pullup). + * PH15 - PIN15 (input pullup). + */ +#define VAL_GPIOH_MODER (PIN_MODE_INPUT(GPIOH_PIN0) | \ + PIN_MODE_INPUT(GPIOH_PIN1) | \ + PIN_MODE_INPUT(GPIOH_PIN2) | \ + PIN_MODE_INPUT(GPIOH_PIN3) | \ + PIN_MODE_INPUT(GPIOH_PIN4) | \ + PIN_MODE_INPUT(GPIOH_PIN5) | \ + PIN_MODE_INPUT(GPIOH_PIN6) | \ + PIN_MODE_INPUT(GPIOH_PIN7) | \ + PIN_MODE_INPUT(GPIOH_PIN8) | \ + PIN_MODE_INPUT(GPIOH_PIN9) | \ + PIN_MODE_INPUT(GPIOH_PIN10) | \ + PIN_MODE_INPUT(GPIOH_PIN11) | \ + PIN_MODE_INPUT(GPIOH_PIN12) | \ + PIN_MODE_INPUT(GPIOH_PIN13) | \ + PIN_MODE_INPUT(GPIOH_PIN14) | \ + PIN_MODE_INPUT(GPIOH_PIN15)) +#define VAL_GPIOH_OTYPER (PIN_OTYPE_PUSHPULL(GPIOH_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN15)) +#define VAL_GPIOH_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOH_PIN0) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN1) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN10) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN11) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN12) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN13) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN14) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN15)) +#define VAL_GPIOH_PUPDR (PIN_PUPDR_PULLUP(GPIOH_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN15)) +#define VAL_GPIOH_ODR (PIN_ODR_HIGH(GPIOH_PIN0) | \ + PIN_ODR_HIGH(GPIOH_PIN1) | \ + PIN_ODR_HIGH(GPIOH_PIN2) | \ + PIN_ODR_HIGH(GPIOH_PIN3) | \ + PIN_ODR_HIGH(GPIOH_PIN4) | \ + PIN_ODR_HIGH(GPIOH_PIN5) | \ + PIN_ODR_HIGH(GPIOH_PIN6) | \ + PIN_ODR_HIGH(GPIOH_PIN7) | \ + PIN_ODR_HIGH(GPIOH_PIN8) | \ + PIN_ODR_HIGH(GPIOH_PIN9) | \ + PIN_ODR_HIGH(GPIOH_PIN10) | \ + PIN_ODR_HIGH(GPIOH_PIN11) | \ + PIN_ODR_HIGH(GPIOH_PIN12) | \ + PIN_ODR_HIGH(GPIOH_PIN13) | \ + PIN_ODR_HIGH(GPIOH_PIN14) | \ + PIN_ODR_HIGH(GPIOH_PIN15)) +#define VAL_GPIOH_AFRL (PIN_AFIO_AF(GPIOH_PIN0, 0) | \ + PIN_AFIO_AF(GPIOH_PIN1, 0) | \ + PIN_AFIO_AF(GPIOH_PIN2, 0) | \ + PIN_AFIO_AF(GPIOH_PIN3, 0) | \ + PIN_AFIO_AF(GPIOH_PIN4, 0) | \ + PIN_AFIO_AF(GPIOH_PIN5, 0) | \ + PIN_AFIO_AF(GPIOH_PIN6, 0) | \ + PIN_AFIO_AF(GPIOH_PIN7, 0)) +#define VAL_GPIOH_AFRH (PIN_AFIO_AF(GPIOH_PIN8, 0) | \ + PIN_AFIO_AF(GPIOH_PIN9, 0) | \ + PIN_AFIO_AF(GPIOH_PIN10, 0) | \ + PIN_AFIO_AF(GPIOH_PIN11, 0) | \ + PIN_AFIO_AF(GPIOH_PIN12, 0) | \ + PIN_AFIO_AF(GPIOH_PIN13, 0) | \ + PIN_AFIO_AF(GPIOH_PIN14, 0) | \ + PIN_AFIO_AF(GPIOH_PIN15, 0)) + + +/* + * USB bus activation macro, required by the USB driver. + */ +// #define usb_lld_connect_bus(usbp) +#define usb_lld_connect_bus(usbp) (palSetPadMode(GPIOA, GPIOA_USB_DP, PAL_MODE_ALTERNATE(14))) +// #define usb_lld_connect_bus(usbp) palSetPadMode(GPIOA, 12, PAL_MODE_INPUT) +/* + * USB bus de-activation macro, required by the USB driver. + */ +// #define usb_lld_disconnect_bus(usbp) +#define usb_lld_disconnect_bus(usbp) (palSetPadMode(GPIOA, GPIOA_USB_DP, PAL_MODE_OUTPUT_PUSHPULL)); palClearPad(GPIOA, GPIOA_USB_DP) +// #define usb_lld_disconnect_bus(usbp) palSetPadMode(GPIOA, 12, PAL_MODE_OUTPUT_PUSHPULL); palClearPad(GPIOA, 12) + +#if !defined(_FROM_ASM_) +#ifdef __cplusplus +extern "C" { +#endif + void boardInit(void); +#ifdef __cplusplus +} +#endif +#endif /* _FROM_ASM_ */ + +#endif /* _BOARD_H_ */ diff --git a/keyboards/proton_c/boards/GENERIC_STM32_F303XC/board.mk b/keyboards/proton_c/boards/GENERIC_STM32_F303XC/board.mk new file mode 100644 index 000000000..43377629a --- /dev/null +++ b/keyboards/proton_c/boards/GENERIC_STM32_F303XC/board.mk @@ -0,0 +1,5 @@ +# List of all the board related files. +BOARDSRC = $(BOARD_PATH)/boards/GENERIC_STM32_F303XC/board.c + +# Required include directories +BOARDINC = $(BOARD_PATH)/boards/GENERIC_STM32_F303XC diff --git a/keyboards/proton_c/bootloader_defs.h b/keyboards/proton_c/bootloader_defs.h new file mode 100644 index 000000000..3b0e9d20a --- /dev/null +++ b/keyboards/proton_c/bootloader_defs.h @@ -0,0 +1,7 @@ +/* Address for jumping to bootloader on STM32 chips. */ +/* It is chip dependent, the correct number can be looked up here: + * http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf + * This also requires a patch to chibios: + * /tmk_core/tool/chibios/ch-bootloader-jump.patch + */ +#define STM32_BOOTLOADER_ADDRESS 0x1FFFD800 diff --git a/keyboards/proton_c/chconf.h b/keyboards/proton_c/chconf.h new file mode 100644 index 000000000..1d9f12ff1 --- /dev/null +++ b/keyboards/proton_c/chconf.h @@ -0,0 +1,520 @@ +/* + ChibiOS - Copyright (C) 2006..2016 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. +*/ + +/** + * @file templates/chconf.h + * @brief Configuration file template. + * @details A copy of this file must be placed in each project directory, it + * contains the application specific kernel settings. + * + * @addtogroup config + * @details Kernel related settings and hooks. + * @{ + */ + +#ifndef CHCONF_H +#define CHCONF_H + +#define _CHIBIOS_RT_CONF_ + +/*===========================================================================*/ +/** + * @name System timers settings + * @{ + */ +/*===========================================================================*/ + +/** + * @brief System time counter resolution. + * @note Allowed values are 16 or 32 bits. + */ +#define CH_CFG_ST_RESOLUTION 32 + +/** + * @brief System tick frequency. + * @details Frequency of the system timer that drives the system ticks. This + * setting also defines the system tick time unit. + */ +#define CH_CFG_ST_FREQUENCY 100000 + +/** + * @brief Time delta constant for the tick-less mode. + * @note If this value is zero then the system uses the classic + * periodic tick. This value represents the minimum number + * of ticks that is safe to specify in a timeout directive. + * The value one is not valid, timeouts are rounded up to + * this value. + */ +#define CH_CFG_ST_TIMEDELTA 2 + +/** @} */ + +/*===========================================================================*/ +/** + * @name Kernel parameters and options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Round robin interval. + * @details This constant is the number of system ticks allowed for the + * threads before preemption occurs. Setting this value to zero + * disables the preemption for threads with equal priority and the + * round robin becomes cooperative. Note that higher priority + * threads can still preempt, the kernel is always preemptive. + * @note Disabling the round robin preemption makes the kernel more compact + * and generally faster. + * @note The round robin preemption is not supported in tickless mode and + * must be set to zero in that case. + */ +#define CH_CFG_TIME_QUANTUM 0 + +/** + * @brief Managed RAM size. + * @details Size of the RAM area to be managed by the OS. If set to zero + * then the whole available RAM is used. The core memory is made + * available to the heap allocator and/or can be used directly through + * the simplified core memory allocator. + * + * @note In order to let the OS manage the whole RAM the linker script must + * provide the @p __heap_base__ and @p __heap_end__ symbols. + * @note Requires @p CH_CFG_USE_MEMCORE. + */ +#define CH_CFG_MEMCORE_SIZE 0 + +/** + * @brief Idle thread automatic spawn suppression. + * @details When this option is activated the function @p chSysInit() + * does not spawn the idle thread. The application @p main() + * function becomes the idle thread and must implement an + * infinite loop. + */ +#define CH_CFG_NO_IDLE_THREAD FALSE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Performance options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief OS optimization. + * @details If enabled then time efficient rather than space efficient code + * is used when two possible implementations exist. + * + * @note This is not related to the compiler optimization options. + * @note The default is @p TRUE. + */ +#define CH_CFG_OPTIMIZE_SPEED TRUE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Subsystem options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Time Measurement APIs. + * @details If enabled then the time measurement APIs are included in + * the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_TM TRUE + +/** + * @brief Threads registry APIs. + * @details If enabled then the registry APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_REGISTRY TRUE + +/** + * @brief Threads synchronization APIs. + * @details If enabled then the @p chThdWait() function is included in + * the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_WAITEXIT TRUE + +/** + * @brief Semaphores APIs. + * @details If enabled then the Semaphores APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_SEMAPHORES TRUE + +/** + * @brief Semaphores queuing mode. + * @details If enabled then the threads are enqueued on semaphores by + * priority rather than in FIFO order. + * + * @note The default is @p FALSE. Enable this if you have special + * requirements. + * @note Requires @p CH_CFG_USE_SEMAPHORES. + */ +#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE + +/** + * @brief Mutexes APIs. + * @details If enabled then the mutexes APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MUTEXES TRUE + +/** + * @brief Enables recursive behavior on mutexes. + * @note Recursive mutexes are heavier and have an increased + * memory footprint. + * + * @note The default is @p FALSE. + * @note Requires @p CH_CFG_USE_MUTEXES. + */ +#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE + +/** + * @brief Conditional Variables APIs. + * @details If enabled then the conditional variables APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_MUTEXES. + */ +#define CH_CFG_USE_CONDVARS TRUE + +/** + * @brief Conditional Variables APIs with timeout. + * @details If enabled then the conditional variables APIs with timeout + * specification are included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_CONDVARS. + */ +#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE + +/** + * @brief Events Flags APIs. + * @details If enabled then the event flags APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_EVENTS TRUE + +/** + * @brief Events Flags APIs with timeout. + * @details If enabled then the events APIs with timeout specification + * are included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_EVENTS. + */ +#define CH_CFG_USE_EVENTS_TIMEOUT TRUE + +/** + * @brief Synchronous Messages APIs. + * @details If enabled then the synchronous messages APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MESSAGES TRUE + +/** + * @brief Synchronous Messages queuing mode. + * @details If enabled then messages are served by priority rather than in + * FIFO order. + * + * @note The default is @p FALSE. Enable this if you have special + * requirements. + * @note Requires @p CH_CFG_USE_MESSAGES. + */ +#define CH_CFG_USE_MESSAGES_PRIORITY TRUE + +/** + * @brief Mailboxes APIs. + * @details If enabled then the asynchronous messages (mailboxes) APIs are + * included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_SEMAPHORES. + */ +#define CH_CFG_USE_MAILBOXES TRUE + +/** + * @brief Core Memory Manager APIs. + * @details If enabled then the core memory manager APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MEMCORE TRUE + +/** + * @brief Heap Allocator APIs. + * @details If enabled then the memory heap allocator APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or + * @p CH_CFG_USE_SEMAPHORES. + * @note Mutexes are recommended. + */ +#define CH_CFG_USE_HEAP TRUE + +/** + * @brief Memory Pools Allocator APIs. + * @details If enabled then the memory pools allocator APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MEMPOOLS TRUE + +/** + * @brief Dynamic Threads APIs. + * @details If enabled then the dynamic threads creation APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_WAITEXIT. + * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. + */ +#define CH_CFG_USE_DYNAMIC TRUE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Debug options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Debug option, kernel statistics. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_STATISTICS FALSE + +/** + * @brief Debug option, system state check. + * @details If enabled the correct call protocol for system APIs is checked + * at runtime. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_SYSTEM_STATE_CHECK FALSE + +/** + * @brief Debug option, parameters checks. + * @details If enabled then the checks on the API functions input + * parameters are activated. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_ENABLE_CHECKS FALSE + +/** + * @brief Debug option, consistency checks. + * @details If enabled then all the assertions in the kernel code are + * activated. This includes consistency checks inside the kernel, + * runtime anomalies and port-defined checks. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_ENABLE_ASSERTS FALSE + +/** + * @brief Debug option, trace buffer. + * @details If enabled then the trace buffer is activated. + * + * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. + */ +#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_DISABLED + +/** + * @brief Trace buffer entries. + * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is + * different from @p CH_DBG_TRACE_MASK_DISABLED. + */ +#define CH_DBG_TRACE_BUFFER_SIZE 128 + +/** + * @brief Debug option, stack checks. + * @details If enabled then a runtime stack check is performed. + * + * @note The default is @p FALSE. + * @note The stack check is performed in a architecture/port dependent way. + * It may not be implemented or some ports. + * @note The default failure mode is to halt the system with the global + * @p panic_msg variable set to @p NULL. + */ +#define CH_DBG_ENABLE_STACK_CHECK TRUE + +/** + * @brief Debug option, stacks initialization. + * @details If enabled then the threads working area is filled with a byte + * value when a thread is created. This can be useful for the + * runtime measurement of the used stack. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_FILL_THREADS FALSE + +/** + * @brief Debug option, threads profiling. + * @details If enabled then a field is added to the @p thread_t structure that + * counts the system ticks occurred while executing the thread. + * + * @note The default is @p FALSE. + * @note This debug option is not currently compatible with the + * tickless mode. + */ +#define CH_DBG_THREADS_PROFILING FALSE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Kernel hooks + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Threads descriptor structure extension. + * @details User fields added to the end of the @p thread_t structure. + */ +#define CH_CFG_THREAD_EXTRA_FIELDS \ + /* Add threads custom fields here.*/ + +/** + * @brief Threads initialization hook. + * @details User initialization code added to the @p chThdInit() API. + * + * @note It is invoked from within @p chThdInit() and implicitly from all + * the threads creation APIs. + */ +#define CH_CFG_THREAD_INIT_HOOK(tp) { \ + /* Add threads initialization code here.*/ \ +} + +/** + * @brief Threads finalization hook. + * @details User finalization code added to the @p chThdExit() API. + */ +#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ + /* Add threads finalization code here.*/ \ +} + +/** + * @brief Context switch hook. + * @details This hook is invoked just before switching between threads. + */ +#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ + /* Context switch code here.*/ \ +} + +/** + * @brief ISR enter hook. + */ +#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ + /* IRQ prologue code here.*/ \ +} + +/** + * @brief ISR exit hook. + */ +#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ + /* IRQ epilogue code here.*/ \ +} + +/** + * @brief Idle thread enter hook. + * @note This hook is invoked within a critical zone, no OS functions + * should be invoked from here. + * @note This macro can be used to activate a power saving mode. + */ +#define CH_CFG_IDLE_ENTER_HOOK() { \ + /* Idle-enter code here.*/ \ +} + +/** + * @brief Idle thread leave hook. + * @note This hook is invoked within a critical zone, no OS functions + * should be invoked from here. + * @note This macro can be used to deactivate a power saving mode. + */ +#define CH_CFG_IDLE_LEAVE_HOOK() { \ + /* Idle-leave code here.*/ \ +} + +/** + * @brief Idle Loop hook. + * @details This hook is continuously invoked by the idle thread loop. + */ +#define CH_CFG_IDLE_LOOP_HOOK() { \ + /* Idle loop code here.*/ \ +} + +/** + * @brief System tick event hook. + * @details This hook is invoked in the system tick handler immediately + * after processing the virtual timers queue. + */ +#define CH_CFG_SYSTEM_TICK_HOOK() { \ + /* System tick event code here.*/ \ +} + +/** + * @brief System halt hook. + * @details This hook is invoked in case to a system halting error before + * the system is halted. + */ +#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ + /* System halt code here.*/ \ +} + +/** + * @brief Trace hook. + * @details This hook is invoked each time a new record is written in the + * trace buffer. + */ +#define CH_CFG_TRACE_HOOK(tep) { \ + /* Trace code here.*/ \ +} + +/** @} */ + +/*===========================================================================*/ +/* Port-specific settings (override port settings defaulted in chcore.h). */ +/*===========================================================================*/ + +#endif /* CHCONF_H */ + +/** @} */ diff --git a/keyboards/proton_c/config.h b/keyboards/proton_c/config.h new file mode 100644 index 000000000..1a2346d41 --- /dev/null +++ b/keyboards/proton_c/config.h @@ -0,0 +1,121 @@ +/* Copyright 2018 Jack Humbert + * + * 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 . + */ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0006 +#define MANUFACTURER QMK +#define PRODUCT Proton C +#define DESCRIPTION A compact ortholinear keyboard + +/* key matrix size */ +#define MATRIX_ROWS 1 +#define MATRIX_COLS 1 + +#define MATRIX_ROW_PINS { B9 } +#define MATRIX_COL_PINS { B0 } + + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCE 6 + +/* 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 + +/* + * 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 + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* + * 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 + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +//#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 1 + +// #define WS2812_LED_N 2 +// #define RGBLED_NUM WS2812_LED_N +// #define WS2812_TIM_N 2 +// #define WS2812_TIM_CH 2 +// #define PORT_WS2812 GPIOA +// #define PIN_WS2812 1 +// #define WS2812_DMA_STREAM STM32_DMA1_STREAM2 // DMA stream for TIMx_UP (look up in reference manual under DMA Channel selection) +//#define WS2812_DMA_CHANNEL 7 // DMA channel for TIMx_UP +//#define WS2812_EXTERNAL_PULLUP + diff --git a/keyboards/proton_c/halconf.h b/keyboards/proton_c/halconf.h new file mode 100644 index 000000000..8fe8e0c6f --- /dev/null +++ b/keyboards/proton_c/halconf.h @@ -0,0 +1,388 @@ +/* + ChibiOS - Copyright (C) 2006..2016 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. +*/ + +/** + * @file templates/halconf.h + * @brief HAL configuration header. + * @details HAL configuration file, this file allows to enable or disable the + * various device drivers from your application. You may also use + * this file in order to override the device drivers default settings. + * + * @addtogroup HAL_CONF + * @{ + */ + +#ifndef HALCONF_H +#define HALCONF_H + +#include "mcuconf.h" + +/** + * @brief Enables the PAL subsystem. + */ +#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) +#define HAL_USE_PAL TRUE +#endif + +/** + * @brief Enables the ADC subsystem. + */ +#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) +#define HAL_USE_ADC FALSE +#endif + +/** + * @brief Enables the CAN subsystem. + */ +#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) +#define HAL_USE_CAN FALSE +#endif + +/** + * @brief Enables the DAC subsystem. + */ +#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) +#define HAL_USE_DAC TRUE +#endif + +/** + * @brief Enables the EXT subsystem. + */ +#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) +#define HAL_USE_EXT FALSE +#endif + +/** + * @brief Enables the GPT subsystem. + */ +#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) +#define HAL_USE_GPT TRUE +#endif + +/** + * @brief Enables the I2C subsystem. + */ +#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) +#define HAL_USE_I2C FALSE +#endif + +/** + * @brief Enables the I2S subsystem. + */ +#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) +#define HAL_USE_I2S FALSE +#endif + +/** + * @brief Enables the ICU subsystem. + */ +#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) +#define HAL_USE_ICU FALSE +#endif + +/** + * @brief Enables the MAC subsystem. + */ +#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) +#define HAL_USE_MAC FALSE +#endif + +/** + * @brief Enables the MMC_SPI subsystem. + */ +#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) +#define HAL_USE_MMC_SPI FALSE +#endif + +/** + * @brief Enables the PWM subsystem. + */ +#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) +#define HAL_USE_PWM FALSE +#endif + +/** + * @brief Enables the QSPI subsystem. + */ +#if !defined(HAL_USE_QSPI) || defined(__DOXYGEN__) +#define HAL_USE_QSPI FALSE +#endif + +/** + * @brief Enables the RTC subsystem. + */ +#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) +#define HAL_USE_RTC FALSE +#endif + +/** + * @brief Enables the SDC subsystem. + */ +#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) +#define HAL_USE_SDC FALSE +#endif + +/** + * @brief Enables the SERIAL subsystem. + */ +#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) +#define HAL_USE_SERIAL FALSE +#endif + +/** + * @brief Enables the SERIAL over USB subsystem. + */ +#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) +#define HAL_USE_SERIAL_USB TRUE +#endif + +/** + * @brief Enables the SPI subsystem. + */ +#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) +#define HAL_USE_SPI FALSE +#endif + +/** + * @brief Enables the UART subsystem. + */ +#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) +#define HAL_USE_UART FALSE +#endif + +/** + * @brief Enables the USB subsystem. + */ +#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) +#define HAL_USE_USB TRUE +#endif + +/** + * @brief Enables the WDG subsystem. + */ +#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) +#define HAL_USE_WDG FALSE +#endif + +/*===========================================================================*/ +/* ADC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) +#define ADC_USE_WAIT TRUE +#endif + +/** + * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define ADC_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* CAN driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Sleep mode related APIs inclusion switch. + */ +#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) +#define CAN_USE_SLEEP_MODE TRUE +#endif + +/*===========================================================================*/ +/* I2C driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables the mutual exclusion APIs on the I2C bus. + */ +#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define I2C_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* MAC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables an event sources for incoming packets. + */ +#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) +#define MAC_USE_ZERO_COPY FALSE +#endif + +/** + * @brief Enables an event sources for incoming packets. + */ +#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) +#define MAC_USE_EVENTS TRUE +#endif + +/*===========================================================================*/ +/* MMC_SPI driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Delays insertions. + * @details If enabled this options inserts delays into the MMC waiting + * routines releasing some extra CPU time for the threads with + * lower priority, this may slow down the driver a bit however. + * This option is recommended also if the SPI driver does not + * use a DMA channel and heavily loads the CPU. + */ +#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) +#define MMC_NICE_WAITING TRUE +#endif + +/*===========================================================================*/ +/* SDC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Number of initialization attempts before rejecting the card. + * @note Attempts are performed at 10mS intervals. + */ +#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) +#define SDC_INIT_RETRY 100 +#endif + +/** + * @brief Include support for MMC cards. + * @note MMC support is not yet implemented so this option must be kept + * at @p FALSE. + */ +#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) +#define SDC_MMC_SUPPORT FALSE +#endif + +/** + * @brief Delays insertions. + * @details If enabled this options inserts delays into the MMC waiting + * routines releasing some extra CPU time for the threads with + * lower priority, this may slow down the driver a bit however. + */ +#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) +#define SDC_NICE_WAITING TRUE +#endif + +/*===========================================================================*/ +/* SERIAL driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Default bit rate. + * @details Configuration parameter, this is the baud rate selected for the + * default configuration. + */ +#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) +#define SERIAL_DEFAULT_BITRATE 38400 +#endif + +/** + * @brief Serial buffers size. + * @details Configuration parameter, you can change the depth of the queue + * buffers depending on the requirements of your application. + * @note The default is 16 bytes for both the transmission and receive + * buffers. + */ +#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) +#define SERIAL_BUFFERS_SIZE 16 +#endif + +/*===========================================================================*/ +/* SERIAL_USB driver related setting. */ +/*===========================================================================*/ + +/** + * @brief Serial over USB buffers size. + * @details Configuration parameter, the buffer size must be a multiple of + * the USB data endpoint maximum packet size. + * @note The default is 256 bytes for both the transmission and receive + * buffers. + */ +#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) +#define SERIAL_USB_BUFFERS_SIZE 1 +#endif + +/** + * @brief Serial over USB number of buffers. + * @note The default is 2 buffers. + */ +#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) +#define SERIAL_USB_BUFFERS_NUMBER 2 +#endif + +/*===========================================================================*/ +/* SPI driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) +#define SPI_USE_WAIT TRUE +#endif + +/** + * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define SPI_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* UART driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__) +#define UART_USE_WAIT FALSE +#endif + +/** + * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define UART_USE_MUTUAL_EXCLUSION FALSE +#endif + +/*===========================================================================*/ +/* USB driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) +#define USB_USE_WAIT TRUE +#endif + +#endif /* HALCONF_H */ + +/** @} */ diff --git a/keyboards/proton_c/keymaps/default/keymap.c b/keyboards/proton_c/keymaps/default/keymap.c new file mode 100644 index 000000000..a3103432f --- /dev/null +++ b/keyboards/proton_c/keymaps/default/keymap.c @@ -0,0 +1,21 @@ +/* Copyright 2018 Jack Humbert + * + * 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 . + */ + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = {{ KC_A }} +}; diff --git a/keyboards/proton_c/mcuconf.h b/keyboards/proton_c/mcuconf.h new file mode 100644 index 000000000..7c3c6e570 --- /dev/null +++ b/keyboards/proton_c/mcuconf.h @@ -0,0 +1,257 @@ +/* + ChibiOS - Copyright (C) 2006..2016 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 + +/* + * STM32F3xx drivers configuration. + * The following settings override the default settings present in + * the various device driver implementation headers. + * Note that the settings for each driver only have effect if the whole + * driver is enabled in halconf.h. + * + * IRQ priorities: + * 15...0 Lowest...Highest. + * + * DMA priorities: + * 0...3 Lowest...Highest. + */ + +#define STM32F3xx_MCUCONF + +/* + * HAL driver system settings. + */ +#define STM32_NO_INIT FALSE +#define STM32_PVD_ENABLE FALSE +#define STM32_PLS STM32_PLS_LEV0 +#define STM32_HSI_ENABLED TRUE +#define STM32_LSI_ENABLED TRUE +#define STM32_HSE_ENABLED TRUE +#define STM32_LSE_ENABLED FALSE +#define STM32_SW STM32_SW_PLL +#define STM32_PLLSRC STM32_PLLSRC_HSE +#define STM32_PREDIV_VALUE 1 +#define STM32_PLLMUL_VALUE 9 +#define STM32_HPRE STM32_HPRE_DIV1 +#define STM32_PPRE1 STM32_PPRE1_DIV2 +#define STM32_PPRE2 STM32_PPRE2_DIV2 +#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK +#define STM32_ADC12PRES STM32_ADC12PRES_DIV1 +#define STM32_ADC34PRES STM32_ADC34PRES_DIV1 +#define STM32_USART1SW STM32_USART1SW_PCLK +#define STM32_USART2SW STM32_USART2SW_PCLK +#define STM32_USART3SW STM32_USART3SW_PCLK +#define STM32_UART4SW STM32_UART4SW_PCLK +#define STM32_UART5SW STM32_UART5SW_PCLK +#define STM32_I2C1SW STM32_I2C1SW_SYSCLK +#define STM32_I2C2SW STM32_I2C2SW_SYSCLK +#define STM32_TIM1SW STM32_TIM1SW_PCLK2 +#define STM32_TIM8SW STM32_TIM8SW_PCLK2 +#define STM32_RTCSEL STM32_RTCSEL_LSI +#define STM32_USB_CLOCK_REQUIRED TRUE +#define STM32_USBPRE STM32_USBPRE_DIV1P5 + +#undef STM32_HSE_BYPASS +// #error "oh no" +// #endif + +/* + * ADC driver system settings. + */ +#define STM32_ADC_DUAL_MODE FALSE +#define STM32_ADC_COMPACT_SAMPLES FALSE +#define STM32_ADC_USE_ADC1 FALSE +#define STM32_ADC_USE_ADC2 FALSE +#define STM32_ADC_USE_ADC3 FALSE +#define STM32_ADC_USE_ADC4 FALSE +#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) +#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) +#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) +#define STM32_ADC_ADC4_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) +#define STM32_ADC_ADC1_DMA_PRIORITY 2 +#define STM32_ADC_ADC2_DMA_PRIORITY 2 +#define STM32_ADC_ADC3_DMA_PRIORITY 2 +#define STM32_ADC_ADC4_DMA_PRIORITY 2 +#define STM32_ADC_ADC12_IRQ_PRIORITY 5 +#define STM32_ADC_ADC3_IRQ_PRIORITY 5 +#define STM32_ADC_ADC4_IRQ_PRIORITY 5 +#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 5 +#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 5 +#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 5 +#define STM32_ADC_ADC4_DMA_IRQ_PRIORITY 5 +#define STM32_ADC_ADC12_CLOCK_MODE ADC_CCR_CKMODE_AHB_DIV1 +#define STM32_ADC_ADC34_CLOCK_MODE ADC_CCR_CKMODE_AHB_DIV1 + +/* + * CAN driver system settings. + */ +#define STM32_CAN_USE_CAN1 FALSE +#define STM32_CAN_CAN1_IRQ_PRIORITY 11 + +/* + * DAC driver system settings. + */ +#define STM32_DAC_DUAL_MODE FALSE +#define STM32_DAC_USE_DAC1_CH1 TRUE +#define STM32_DAC_USE_DAC1_CH2 TRUE +#define STM32_DAC_DAC1_CH1_IRQ_PRIORITY 10 +#define STM32_DAC_DAC1_CH2_IRQ_PRIORITY 10 +#define STM32_DAC_DAC1_CH1_DMA_PRIORITY 2 +#define STM32_DAC_DAC1_CH2_DMA_PRIORITY 2 + +/* + * EXT driver system settings. + */ +#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI21_22_29_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI30_32_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI33_IRQ_PRIORITY 6 + +/* + * GPT driver system settings. + */ +#define STM32_GPT_USE_TIM1 FALSE +#define STM32_GPT_USE_TIM2 FALSE +#define STM32_GPT_USE_TIM3 FALSE +#define STM32_GPT_USE_TIM4 FALSE +#define STM32_GPT_USE_TIM6 TRUE +#define STM32_GPT_USE_TIM7 TRUE +#define STM32_GPT_USE_TIM8 TRUE +#define STM32_GPT_TIM1_IRQ_PRIORITY 7 +#define STM32_GPT_TIM2_IRQ_PRIORITY 7 +#define STM32_GPT_TIM3_IRQ_PRIORITY 7 +#define STM32_GPT_TIM4_IRQ_PRIORITY 7 +#define STM32_GPT_TIM6_IRQ_PRIORITY 7 +#define STM32_GPT_TIM7_IRQ_PRIORITY 7 +#define STM32_GPT_TIM8_IRQ_PRIORITY 7 + +/* + * I2C driver system settings. + */ +#define STM32_I2C_USE_I2C1 FALSE +#define STM32_I2C_USE_I2C2 FALSE +#define STM32_I2C_BUSY_TIMEOUT 50 +#define STM32_I2C_I2C1_IRQ_PRIORITY 10 +#define STM32_I2C_I2C2_IRQ_PRIORITY 10 +#define STM32_I2C_USE_DMA TRUE +#define STM32_I2C_I2C1_DMA_PRIORITY 1 +#define STM32_I2C_I2C2_DMA_PRIORITY 1 +#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") + +/* + * ICU driver system settings. + */ +#define STM32_ICU_USE_TIM1 FALSE +#define STM32_ICU_USE_TIM2 FALSE +#define STM32_ICU_USE_TIM3 FALSE +#define STM32_ICU_USE_TIM4 FALSE +#define STM32_ICU_USE_TIM8 FALSE +#define STM32_ICU_TIM1_IRQ_PRIORITY 7 +#define STM32_ICU_TIM2_IRQ_PRIORITY 7 +#define STM32_ICU_TIM3_IRQ_PRIORITY 7 +#define STM32_ICU_TIM4_IRQ_PRIORITY 7 +#define STM32_ICU_TIM8_IRQ_PRIORITY 7 + +/* + * PWM driver system settings. + */ +#define STM32_PWM_USE_ADVANCED FALSE +#define STM32_PWM_USE_TIM1 FALSE +#define STM32_PWM_USE_TIM2 TRUE +#define STM32_PWM_USE_TIM3 TRUE +#define STM32_PWM_USE_TIM4 FALSE +#define STM32_PWM_USE_TIM8 FALSE +#define STM32_PWM_TIM1_IRQ_PRIORITY 7 +#define STM32_PWM_TIM2_IRQ_PRIORITY 7 +#define STM32_PWM_TIM3_IRQ_PRIORITY 7 +#define STM32_PWM_TIM4_IRQ_PRIORITY 7 +#define STM32_PWM_TIM8_IRQ_PRIORITY 7 + +/* + * SERIAL driver system settings. + */ +#define STM32_SERIAL_USE_USART1 FALSE +#define STM32_SERIAL_USE_USART2 TRUE +#define STM32_SERIAL_USE_USART3 FALSE +#define STM32_SERIAL_USE_UART4 FALSE +#define STM32_SERIAL_USE_UART5 FALSE +#define STM32_SERIAL_USART1_PRIORITY 12 +#define STM32_SERIAL_USART2_PRIORITY 12 +#define STM32_SERIAL_USART3_PRIORITY 12 +#define STM32_SERIAL_UART4_PRIORITY 12 +#define STM32_SERIAL_UART5_PRIORITY 12 + +/* + * SPI driver system settings. + */ +#define STM32_SPI_USE_SPI1 FALSE +#define STM32_SPI_USE_SPI2 FALSE +#define STM32_SPI_USE_SPI3 FALSE +#define STM32_SPI_SPI1_DMA_PRIORITY 1 +#define STM32_SPI_SPI2_DMA_PRIORITY 1 +#define STM32_SPI_SPI3_DMA_PRIORITY 1 +#define STM32_SPI_SPI1_IRQ_PRIORITY 10 +#define STM32_SPI_SPI2_IRQ_PRIORITY 10 +#define STM32_SPI_SPI3_IRQ_PRIORITY 10 +#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure") + +/* + * ST driver system settings. + */ +#define STM32_ST_IRQ_PRIORITY 8 +#define STM32_ST_USE_TIMER 2 + +/* + * UART driver system settings. + */ +#define STM32_UART_USE_USART1 FALSE +#define STM32_UART_USE_USART2 FALSE +#define STM32_UART_USE_USART3 FALSE +#define STM32_UART_USART1_IRQ_PRIORITY 12 +#define STM32_UART_USART2_IRQ_PRIORITY 12 +#define STM32_UART_USART3_IRQ_PRIORITY 12 +#define STM32_UART_USART1_DMA_PRIORITY 0 +#define STM32_UART_USART2_DMA_PRIORITY 0 +#define STM32_UART_USART3_DMA_PRIORITY 0 +#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure") + +/* + * USB driver system settings. + */ +#define STM32_USB_USE_USB1 TRUE +#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE +#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 +#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 + +/* + * WDG driver system settings. + */ +#define STM32_WDG_USE_IWDG FALSE + +#endif /* MCUCONF_H */ diff --git a/keyboards/proton_c/proton_c.c b/keyboards/proton_c/proton_c.c new file mode 100644 index 000000000..525634347 --- /dev/null +++ b/keyboards/proton_c/proton_c.c @@ -0,0 +1,25 @@ +/* Copyright 2018 Jack Humbert + * + * 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 . + */ + +#include "proton_c.h" + +void matrix_init_kb(void) { + // Turn status LED on + setPinOutput(C13); + writePinHigh(C13); + + matrix_init_user(); +} diff --git a/keyboards/proton_c/proton_c.h b/keyboards/proton_c/proton_c.h new file mode 100644 index 000000000..159f9975a --- /dev/null +++ b/keyboards/proton_c/proton_c.h @@ -0,0 +1,18 @@ +/* Copyright 2018 Jack Humbert + * + * 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 . + */ + +#pragma once +#include "quantum.h" diff --git a/keyboards/proton_c/readme.md b/keyboards/proton_c/readme.md new file mode 100644 index 000000000..5f27795ae --- /dev/null +++ b/keyboards/proton_c/readme.md @@ -0,0 +1,16 @@ +Proton C +=== + +![Proton C](https://i.imgur.com/xZrjIqa.jpg) + +A Pro Micro drop-in replacement. + +Keyboard Maintainer: [Jack Humbert](https://github.com/jackhumbert) +Hardware Supported: QMK Proton C +Hardware Availability: [List of vendors](https://qmk.fm/proton-c) + +Make example for this keyboard (after setting up your build environment): + + make proton_c:default + +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). diff --git a/keyboards/proton_c/rules.mk b/keyboards/proton_c/rules.mk new file mode 100644 index 000000000..f682c1fd6 --- /dev/null +++ b/keyboards/proton_c/rules.mk @@ -0,0 +1,51 @@ +## chip/board settings +# - the next two should match the directories in +# /os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES) +MCU_FAMILY = STM32 +MCU_SERIES = STM32F3xx + +# Linker script to use +# - it should exist either in /os/common/ports/ARMCMx/compilers/GCC/ld/ +# or /ld/ +MCU_LDSCRIPT = STM32F303xC + +# Startup code to use +# - it should exist in /os/common/startup/ARMCMx/compilers/GCC/mk/ +MCU_STARTUP = stm32f3xx + +# Board: it should exist either in /os/hal/boards/ +# or /boards +BOARD = GENERIC_STM32_F303XC + +# Cortex version +MCU = cortex-m4 + +# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7 +ARMV = 7 + +USE_FPU = yes + +# Vector table for application +# 0x00000000-0x00001000 area is occupied by bootlaoder.*/ +# The CORTEX_VTOR... is needed only for MCHCK/Infinity KB +# OPT_DEFS = -DCORTEX_VTOR_INIT=0x08005000 +OPT_DEFS = + +# Options to pass to dfu-util when flashing +DFU_ARGS = -d 0483:df11 -a 0 -s 0x08000000:leave + +# Build Options +# comment out to disable the options. +# +BACKLIGHT_ENABLE = no +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration +## (Note that for BOOTMAGIC on Teensy LC you have to use a custom .ld script.) +MOUSEKEY_ENABLE = yes # Mouse keys +EXTRAKEY_ENABLE = yes # Audio control and System control +CONSOLE_ENABLE = yes # Console for debug +COMMAND_ENABLE = yes # Commands for debug and configuration +#SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover +AUDIO_ENABLE = yes +RGBLIGHT_ENABLE = no +# SERIAL_LINK_ENABLE = yes From 5779ffb59a2e36fd45c3d4000d41ad73ad140de3 Mon Sep 17 00:00:00 2001 From: Fredric Silberberg Date: Thu, 1 Nov 2018 21:49:18 -0700 Subject: [PATCH 436/788] Set the executable bit for sh scripts under util. --- util/activate_msys2.sh | 0 util/activate_wsl.sh | 0 util/freebsd_install.sh | 0 util/generate_internal_docs.sh | 0 util/msys2_install.sh | 0 util/travis_build.sh | 0 util/travis_compiled_push.sh | 0 util/travis_docs.sh | 0 util/travis_push.sh | 0 util/win_shared_install.sh | 0 util/wsl_install.sh | 0 11 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 util/activate_msys2.sh mode change 100644 => 100755 util/activate_wsl.sh mode change 100644 => 100755 util/freebsd_install.sh mode change 100644 => 100755 util/generate_internal_docs.sh mode change 100644 => 100755 util/msys2_install.sh mode change 100644 => 100755 util/travis_build.sh mode change 100644 => 100755 util/travis_compiled_push.sh mode change 100644 => 100755 util/travis_docs.sh mode change 100644 => 100755 util/travis_push.sh mode change 100644 => 100755 util/win_shared_install.sh mode change 100644 => 100755 util/wsl_install.sh diff --git a/util/activate_msys2.sh b/util/activate_msys2.sh old mode 100644 new mode 100755 diff --git a/util/activate_wsl.sh b/util/activate_wsl.sh old mode 100644 new mode 100755 diff --git a/util/freebsd_install.sh b/util/freebsd_install.sh old mode 100644 new mode 100755 diff --git a/util/generate_internal_docs.sh b/util/generate_internal_docs.sh old mode 100644 new mode 100755 diff --git a/util/msys2_install.sh b/util/msys2_install.sh old mode 100644 new mode 100755 diff --git a/util/travis_build.sh b/util/travis_build.sh old mode 100644 new mode 100755 diff --git a/util/travis_compiled_push.sh b/util/travis_compiled_push.sh old mode 100644 new mode 100755 diff --git a/util/travis_docs.sh b/util/travis_docs.sh old mode 100644 new mode 100755 diff --git a/util/travis_push.sh b/util/travis_push.sh old mode 100644 new mode 100755 diff --git a/util/win_shared_install.sh b/util/win_shared_install.sh old mode 100644 new mode 100755 diff --git a/util/wsl_install.sh b/util/wsl_install.sh old mode 100644 new mode 100755 From a5fa75fcb3de822f4e43dcf29cee6eb9f945a992 Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Fri, 2 Nov 2018 15:28:16 -0400 Subject: [PATCH 437/788] Move disable JTAG code from `keyboard_init` to `keyboard_setup` This way all split keyboards are using that code instead of just those using split_common with the fix --- quantum/split_common/matrix.c | 6 ------ quantum/split_common/split_util.c | 14 -------------- tmk_core/common/keyboard.c | 14 +++++++++----- tmk_core/common/keyboard.h | 2 ++ 4 files changed, 11 insertions(+), 25 deletions(-) diff --git a/quantum/split_common/matrix.c b/quantum/split_common/matrix.c index ff6738b58..d6359b51f 100644 --- a/quantum/split_common/matrix.c +++ b/quantum/split_common/matrix.c @@ -128,12 +128,6 @@ uint8_t matrix_cols(void) void matrix_init(void) { -#ifdef DISABLE_JTAG - // JTAG disable for PORT F. write JTD bit twice within four cycles. - MCUCR |= (1< Date: Fri, 2 Nov 2018 15:55:54 -0400 Subject: [PATCH 438/788] Remove old declaration Co-Authored-By: nooges --- quantum/split_common/split_util.c | 1 - 1 file changed, 1 deletion(-) diff --git a/quantum/split_common/split_util.c b/quantum/split_common/split_util.c index 7d1d7ee04..56077e4f2 100644 --- a/quantum/split_common/split_util.c +++ b/quantum/split_common/split_util.c @@ -92,7 +92,6 @@ void split_keyboard_setup(void) { sei(); } -void disable_JTAG(void); void keyboard_slave_loop(void) { matrix_init(); From 563fe23e53fb747f509b8558bb29bde0baf2d6a8 Mon Sep 17 00:00:00 2001 From: patrickmt <40182064+patrickmt@users.noreply.github.com> Date: Tue, 30 Oct 2018 12:23:57 -0400 Subject: [PATCH 439/788] Fix CTRL/ALT keyboard does not wake computer from sleep Fix for Massdrop CTRL and ALT keyboards not waking computer from sleep --- tmk_core/protocol/arm_atsam/main_arm_atsam.c | 30 +++++++++++++------- tmk_core/protocol/arm_atsam/usb/udc.h | 2 +- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/tmk_core/protocol/arm_atsam/main_arm_atsam.c b/tmk_core/protocol/arm_atsam/main_arm_atsam.c index 54d056a14..d3dc272ee 100644 --- a/tmk_core/protocol/arm_atsam/main_arm_atsam.c +++ b/tmk_core/protocol/arm_atsam/main_arm_atsam.c @@ -62,6 +62,12 @@ void send_keyboard(report_keyboard_t *report) { uint32_t irqflags; + if (usb_state == USB_STATE_POWERDOWN) + { + udc_remotewakeup(); + return; + } + #ifdef NKRO_ENABLE if (!keymap_config.nkro) { @@ -156,25 +162,27 @@ void send_consumer(uint16_t data) } uint8_t g_drvid; +uint8_t g_usb_sleeping = 0; void main_subtask_usb_state(void) { if (usb_state == USB_STATE_POWERDOWN) { - uint32_t timer_led = timer_read32(); - - led_on; - if (led_enabled) + if (!g_usb_sleeping) { - for (g_drvid = 0; g_drvid < ISSI3733_DRIVER_COUNT; g_drvid++) + g_usb_sleeping = 1; + if (led_enabled) { - I2C3733_Control_Set(0); + for (g_drvid = 0; g_drvid < ISSI3733_DRIVER_COUNT; g_drvid++) + { + I2C3733_Control_Set(0); + } } } - while (usb_state == USB_STATE_POWERDOWN) - { - if (timer_read32() - timer_led > 1000) led_off; //Good to indicate went to sleep, but only for a second - } + } + else if (g_usb_sleeping) + { + g_usb_sleeping = 0; if (led_enabled) { for (g_drvid = 0; g_drvid < ISSI3733_DRIVER_COUNT; g_drvid++) @@ -182,12 +190,12 @@ void main_subtask_usb_state(void) I2C3733_Control_Set(1); } } - led_off; } } void main_subtask_led(void) { + if (g_usb_sleeping) return; led_matrix_task(); } diff --git a/tmk_core/protocol/arm_atsam/usb/udc.h b/tmk_core/protocol/arm_atsam/usb/udc.h index c88a442cb..33335d186 100644 --- a/tmk_core/protocol/arm_atsam/usb/udc.h +++ b/tmk_core/protocol/arm_atsam/usb/udc.h @@ -210,7 +210,7 @@ static inline void udc_detach(void) /*! \brief The USB driver sends a resume signal called \e "Upstream Resume" * This is authorized only when the remote wakeup feature is enabled by host. */ -static inline void udc_remotewakeup(void) +inline void udc_remotewakeup(void) { udd_send_remotewakeup(); } From cec203ea80c8e9365bb5f43418fba5971dd4091f Mon Sep 17 00:00:00 2001 From: patrickmt <40182064+patrickmt@users.noreply.github.com> Date: Fri, 2 Nov 2018 15:30:51 -0400 Subject: [PATCH 440/788] USB Suspend for arm_atsam protocol Rewrote USB state tracking for implementation of suspend state. Updated suspend.c in entirety. Main subtasks (generally hardware related) are now run prior to keyboard task. --- tmk_core/common/arm_atsam/suspend.c | 94 +++++++++++++++++--- tmk_core/protocol/arm_atsam/i2c_master.c | 5 +- tmk_core/protocol/arm_atsam/main_arm_atsam.c | 84 ++++++++++------- tmk_core/protocol/arm_atsam/usb/ui.c | 8 +- tmk_core/protocol/arm_atsam/usb/ui.h | 6 -- 5 files changed, 140 insertions(+), 57 deletions(-) diff --git a/tmk_core/common/arm_atsam/suspend.c b/tmk_core/common/arm_atsam/suspend.c index 01d1930ea..e34965df6 100644 --- a/tmk_core/common/arm_atsam/suspend.c +++ b/tmk_core/common/arm_atsam/suspend.c @@ -1,17 +1,85 @@ -/* Copyright 2017 Fred Sundvik +#include "matrix.h" +#include "i2c_master.h" +#include "led_matrix.h" +#include "suspend.h" + +/** \brief Suspend idle * - * 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 . + * FIXME: needs doc */ +void suspend_idle(uint8_t time) { + /* Note: Not used anywhere currently */ +} +/** \brief Run user level Power down + * + * FIXME: needs doc + */ +__attribute__ ((weak)) +void suspend_power_down_user (void) { + +} + +/** \brief Run keyboard level Power down + * + * FIXME: needs doc + */ +__attribute__ ((weak)) +void suspend_power_down_kb(void) { + suspend_power_down_user(); +} + +/** \brief Suspend power down + * + * FIXME: needs doc + */ +void suspend_power_down(void) +{ + I2C3733_Control_Set(0); //Disable LED driver + + suspend_power_down_kb(); +} + +__attribute__ ((weak)) void matrix_power_up(void) {} +__attribute__ ((weak)) void matrix_power_down(void) {} +bool suspend_wakeup_condition(void) { + matrix_power_up(); + matrix_scan(); + matrix_power_down(); + for (uint8_t r = 0; r < MATRIX_ROWS; r++) { + if (matrix_get_row(r)) return true; + } + return false; +} + +/** \brief run user level code immediately after wakeup + * + * FIXME: needs doc + */ +__attribute__ ((weak)) +void suspend_wakeup_init_user(void) { + +} + +/** \brief run keyboard level code immediately after wakeup + * + * FIXME: needs doc + */ +__attribute__ ((weak)) +void suspend_wakeup_init_kb(void) { + suspend_wakeup_init_user(); +} + +/** \brief run immediately after wakeup + * + * FIXME: needs doc + */ +void suspend_wakeup_init(void) { + /* If LEDs are set to enabled, enable the hardware */ + if (led_enabled) { + I2C3733_Control_Set(1); + } + + suspend_wakeup_init_kb(); +} diff --git a/tmk_core/protocol/arm_atsam/i2c_master.c b/tmk_core/protocol/arm_atsam/i2c_master.c index 4f5a79e89..ece9ee5db 100644 --- a/tmk_core/protocol/arm_atsam/i2c_master.c +++ b/tmk_core/protocol/arm_atsam/i2c_master.c @@ -261,8 +261,9 @@ uint8_t I2C3733_Init_Control(void) { DBGC(DC_I2C3733_INIT_CONTROL_BEGIN); - srdata.bit.SDB_N = 1; - SPI_WriteSRData(); + //Hardware state shutdown on boot + //USB state machine will enable driver when communication is ready + I2C3733_Control_Set(0); CLK_delay_ms(1); diff --git a/tmk_core/protocol/arm_atsam/main_arm_atsam.c b/tmk_core/protocol/arm_atsam/main_arm_atsam.c index d3dc272ee..13034a05d 100644 --- a/tmk_core/protocol/arm_atsam/main_arm_atsam.c +++ b/tmk_core/protocol/arm_atsam/main_arm_atsam.c @@ -31,6 +31,8 @@ along with this program. If not, see . //From keyboard's directory #include "config_led.h" +uint8_t g_usb_state = USB_FSMSTATUS_FSMSTATE_OFF_Val; //Saved USB state from hardware value to detect changes + void main_subtasks(void); uint8_t keyboard_leds(void); void send_keyboard(report_keyboard_t *report); @@ -62,12 +64,6 @@ void send_keyboard(report_keyboard_t *report) { uint32_t irqflags; - if (usb_state == USB_STATE_POWERDOWN) - { - udc_remotewakeup(); - return; - } - #ifdef NKRO_ENABLE if (!keymap_config.nkro) { @@ -161,41 +157,56 @@ void send_consumer(uint16_t data) #endif //EXTRAKEY_ENABLE } -uint8_t g_drvid; -uint8_t g_usb_sleeping = 0; - void main_subtask_usb_state(void) { - if (usb_state == USB_STATE_POWERDOWN) + static uint32_t fsmstate_on_delay = 0; //Delay timer to be sure USB is actually operating before bringing up hardware + uint8_t fsmstate_now = USB->DEVICE.FSMSTATUS.reg; //Current state from hardware register + + if (fsmstate_now == USB_FSMSTATUS_FSMSTATE_SUSPEND_Val) //If USB SUSPENDED { - if (!g_usb_sleeping) + fsmstate_on_delay = 0; //Clear ON delay timer + + if (g_usb_state != USB_FSMSTATUS_FSMSTATE_SUSPEND_Val) //If previously not SUSPENDED { - g_usb_sleeping = 1; - if (led_enabled) + suspend_power_down(); //Run suspend routine + g_usb_state = fsmstate_now; //Save current USB state + } + } + else if (fsmstate_now == USB_FSMSTATUS_FSMSTATE_SLEEP_Val) //Else if USB SLEEPING + { + fsmstate_on_delay = 0; //Clear ON delay timer + + if (g_usb_state != USB_FSMSTATUS_FSMSTATE_SLEEP_Val) //If previously not SLEEPING + { + suspend_power_down(); //Run suspend routine + g_usb_state = fsmstate_now; //Save current USB state + } + } + else if (fsmstate_now == USB_FSMSTATUS_FSMSTATE_ON_Val) //Else if USB ON + { + if (g_usb_state != USB_FSMSTATUS_FSMSTATE_ON_Val) //If previously not ON + { + if (fsmstate_on_delay == 0) //If ON delay timer is cleared { - for (g_drvid = 0; g_drvid < ISSI3733_DRIVER_COUNT; g_drvid++) - { - I2C3733_Control_Set(0); - } + fsmstate_on_delay = CLK_get_ms() + 250; //Set ON delay timer + } + else if (CLK_get_ms() > fsmstate_on_delay) //Else if ON delay timer is active and timed out + { + suspend_wakeup_init(); //Run wakeup routine + g_usb_state = fsmstate_now; //Save current USB state } } } - else if (g_usb_sleeping) + else //Else if USB is in a state not being tracked { - g_usb_sleeping = 0; - if (led_enabled) - { - for (g_drvid = 0; g_drvid < ISSI3733_DRIVER_COUNT; g_drvid++) - { - I2C3733_Control_Set(1); - } - } + fsmstate_on_delay = 0; //Clear ON delay timer } } void main_subtask_led(void) { - if (g_usb_sleeping) return; + if (g_usb_state != USB_FSMSTATUS_FSMSTATE_ON_Val) return; //Only run LED tasks if USB is operating + led_matrix_task(); } @@ -275,8 +286,8 @@ int main(void) i2c_led_q_init(); - for (g_drvid = 0; g_drvid < ISSI3733_DRIVER_COUNT; g_drvid++) - I2C_LED_Q_ONOFF(g_drvid); //Queue data + for (uint8_t drvid = 0; drvid < ISSI3733_DRIVER_COUNT; drvid++) + I2C_LED_Q_ONOFF(drvid); //Queue data keyboard_setup(); @@ -294,10 +305,21 @@ int main(void) while (1) { - keyboard_task(); - main_subtasks(); //Note these tasks will also be run while waiting for USB keyboard polling intervals + if (g_usb_state == USB_FSMSTATUS_FSMSTATE_SUSPEND_Val || g_usb_state == USB_FSMSTATUS_FSMSTATE_SLEEP_Val) + { + if (suspend_wakeup_condition()) + { + udc_remotewakeup(); //Send remote wakeup signal + wait_ms(50); + } + + continue; + } + + keyboard_task(); + #ifdef CONSOLE_ENABLE if (CLK_get_ms() > next_print) { diff --git a/tmk_core/protocol/arm_atsam/usb/ui.c b/tmk_core/protocol/arm_atsam/usb/ui.c index 031678b64..70a619109 100644 --- a/tmk_core/protocol/arm_atsam/usb/ui.c +++ b/tmk_core/protocol/arm_atsam/usb/ui.c @@ -52,8 +52,6 @@ #include "samd51j18a.h" #include "ui.h" -volatile uint8_t usb_state; - //! Sequence process running each \c SEQUENCE_PERIOD ms #define SEQUENCE_PERIOD 150 @@ -72,12 +70,12 @@ static void ui_wakeup_handler(void) void ui_init(void) { - usb_state = USB_STATE_POWERUP; + } void ui_powerdown(void) { - usb_state = USB_STATE_POWERDOWN; + } void ui_wakeup_enable(void) @@ -92,7 +90,7 @@ void ui_wakeup_disable(void) void ui_wakeup(void) { - usb_state = USB_STATE_POWERUP; + } void ui_process(uint16_t framenumber) diff --git a/tmk_core/protocol/arm_atsam/usb/ui.h b/tmk_core/protocol/arm_atsam/usb/ui.h index 3d899e669..d1c767d45 100644 --- a/tmk_core/protocol/arm_atsam/usb/ui.h +++ b/tmk_core/protocol/arm_atsam/usb/ui.h @@ -47,12 +47,6 @@ #ifndef _UI_H_ #define _UI_H_ -extern volatile uint8_t usb_state; - -#define USB_STATE_UNKNOWN 0 -#define USB_STATE_POWERDOWN 1 -#define USB_STATE_POWERUP 2 - //! \brief Initializes the user interface void ui_init(void); From 6dec3550e0540ec979e11f7f310478877b3764b7 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Fri, 2 Nov 2018 14:48:44 -0700 Subject: [PATCH 441/788] Niu keymap (#4273) * Add modified planck layout * Update rules --- keyboards/niu_mini/keymaps/abhixec/keymap.c | 183 +++++++++++++++++++ keyboards/niu_mini/keymaps/abhixec/readme.md | 5 + keyboards/niu_mini/keymaps/abhixec/rules.mk | 1 + 3 files changed, 189 insertions(+) create mode 100644 keyboards/niu_mini/keymaps/abhixec/keymap.c create mode 100644 keyboards/niu_mini/keymaps/abhixec/readme.md create mode 100644 keyboards/niu_mini/keymaps/abhixec/rules.mk diff --git a/keyboards/niu_mini/keymaps/abhixec/keymap.c b/keyboards/niu_mini/keymaps/abhixec/keymap.c new file mode 100644 index 000000000..6d3ff8a37 --- /dev/null +++ b/keyboards/niu_mini/keymaps/abhixec/keymap.c @@ -0,0 +1,183 @@ +/* Copyright 2015-2017 Jack Humbert + * + * 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 . + */ + +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +enum layers { + _QWERTY, + _COLEMAK, + _LOWER, + _RAISE, + _ADJUST +}; + +enum keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + LOWER, + RAISE, + BACKLIT, + EXT_PLV +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = LAYOUT_planck_mit( + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , + _______, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT +), + +/* Colemak + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | R | S | T | D | H | N | E | I | O | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_COLEMAK] = LAYOUT_planck_mit( + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, + KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , + _______, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT +), + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | Home | End | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT_planck_mit( + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_NUHS), S(KC_NUBS), KC_HOME, KC_END, _______, + _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY +), + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / |Pg Up |Pg Dn | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT_planck_mit( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, _______, + _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | Reset| | | | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | | |AG_NRM|AG_SWP|Qwerty|Colemk| | | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = LAYOUT_planck_mit( + _______, RESET, DEBUG, _______, _______, _______, _______, TERM_ON, TERM_OFF,_______, _______, KC_DEL , + _______, _______, _______, _______, _______, AG_NORM, AG_SWAP, QWERTY, COLEMAK, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +) + + +}; + + + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + print("mode just switched to qwerty and this is a huge string\n"); + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + set_single_persistent_default_layer(_COLEMAK); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case BACKLIT: + if (record->event.pressed) { + register_code(KC_RSFT); + #ifdef BACKLIGHT_ENABLE + backlight_step(); + #endif + } else { + unregister_code(KC_RSFT); + } + return false; + break; + } + return true; +} diff --git a/keyboards/niu_mini/keymaps/abhixec/readme.md b/keyboards/niu_mini/keymaps/abhixec/readme.md new file mode 100644 index 000000000..1bc312a03 --- /dev/null +++ b/keyboards/niu_mini/keymaps/abhixec/readme.md @@ -0,0 +1,5 @@ +# Abhixec's Layout + +This is inspired by planck but removed most of the unwanted and extra features of planck that is not there in this keyboard. + + diff --git a/keyboards/niu_mini/keymaps/abhixec/rules.mk b/keyboards/niu_mini/keymaps/abhixec/rules.mk new file mode 100644 index 000000000..3bf3f2731 --- /dev/null +++ b/keyboards/niu_mini/keymaps/abhixec/rules.mk @@ -0,0 +1 @@ +AUDIO_ENABLE = no From cd544e10a98b4bfd7f988d713dea446be9eb1b83 Mon Sep 17 00:00:00 2001 From: Elliot Powell <32494740+e11i0t23@users.noreply.github.com> Date: Fri, 2 Nov 2018 23:41:26 +0000 Subject: [PATCH 442/788] Keymap: Fixed poor layout of EP40 default keymap (#4330) * add initial ep40 files * fixed issues * updated keymap * Added media control * Update keyboards/handwired/ep40/rules.mk Co-Authored-By: e11i0t23 <32494740+e11i0t23@users.noreply.github.com> * Fixed requested changes * Fixed more requested changes * Added delete key to layor 1 * Updated defualt keympap to have a Backspace mod del key * removed place holder Co-Authored-By: e11i0t23 <32494740+e11i0t23@users.noreply.github.com> * removed obsolete code Co-Authored-By: e11i0t23 <32494740+e11i0t23@users.noreply.github.com> --- .../handwired/ep40/keymaps/default/keymap.c | 38 +++++++++++++++++-- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/keyboards/handwired/ep40/keymaps/default/keymap.c b/keyboards/handwired/ep40/keymaps/default/keymap.c index 2d8a5d059..1ac66bc01 100644 --- a/keyboards/handwired/ep40/keymaps/default/keymap.c +++ b/keyboards/handwired/ep40/keymaps/default/keymap.c @@ -15,16 +15,22 @@ */ #include QMK_KEYBOARD_H +static bool bsdel_mods = false; + +enum custom_keycodes { + M_BSDEL = SAFE_RANGE, // ensure these codes start after the highest keycode defined in Quantum +}; + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT( /* Base */ - KC_GESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,\ + KC_GESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, M_BSDEL,\ KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_ENT, \ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_RSFT,\ - LCTL_T(KC_LBRC), KC_LGUI, KC_LALT, KC_SPC, LT(1, KC_SPC), KC_RGUI, MO(2), RCTL_T(KC_RBRC), KC_RALT \ + LCTL_T(KC_LBRC), KC_LGUI, KC_LALT, KC_SPC, LT(1, KC_SPC), KC_RALT, MO(2), RCTL_T(KC_RBRC), KC_F5 \ ), [1] = LAYOUT( /* Base */ - KC_TRNS, KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0, KC_DEL ,\ + KC_TRNS, KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0, KC_TRNS,\ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_UP, KC_DOWN, KC_RIGHT, KC_TRNS,\ KC_TRNS, KC_VOLD, KC_MUTE, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_TRNS,\ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ @@ -37,3 +43,29 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET \ ), }; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case M_BSDEL: { + uint8_t kc = KC_BSPC; + + if (record->event.pressed) { + if (keyboard_report->mods) { + kc = KC_DEL; + } + register_code (kc); + bsdel_mods = keyboard_report->mods; + } + else { + if (bsdel_mods) { + kc = KC_DEL; + } + unregister_code (kc); + } + + return false; + break; + } + } + return true; +} From 0633eb027308f08331cb33f27ddbe7cb3a08cda8 Mon Sep 17 00:00:00 2001 From: Josh Date: Sat, 3 Nov 2018 12:22:57 -0400 Subject: [PATCH 443/788] Increasing square wave buffer to max volume. (#4296) * Increasing square wave buffer to max volume. * Using range designated initializers for square waves; defining DAC_SAMPLE_MAX. --- quantum/audio/audio_arm.c | 133 +++----------------------------------- 1 file changed, 9 insertions(+), 124 deletions(-) diff --git a/quantum/audio/audio_arm.c b/quantum/audio/audio_arm.c index d38184f32..18e8a8c66 100644 --- a/quantum/audio/audio_arm.c +++ b/quantum/audio/audio_arm.c @@ -80,6 +80,7 @@ float startup_song[][2] = STARTUP_SONG; static void gpt_cb8(GPTDriver *gptp); #define DAC_BUFFER_SIZE 720 +#define DAC_SAMPLE_MAX 65535U #define START_CHANNEL_1() gptStart(&GPTD6, &gpt6cfg1); \ gptStartContinuous(&GPTD6, 2U) @@ -202,132 +203,16 @@ GPTConfig gpt8cfg1 = { // squarewave static const dacsample_t dac_buffer[DAC_BUFFER_SIZE] = { - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + // First half is max, second half is 0 + [0 ... DAC_BUFFER_SIZE/2-1] = DAC_SAMPLE_MAX, + [DAC_BUFFER_SIZE/2 ... DAC_BUFFER_SIZE -1] = 0, }; // squarewave static const dacsample_t dac_buffer_2[DAC_BUFFER_SIZE] = { - - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047 + // opposite of dac_buffer above + [0 ... DAC_BUFFER_SIZE/2-1] = 0, + [DAC_BUFFER_SIZE/2 ... DAC_BUFFER_SIZE -1] = DAC_SAMPLE_MAX, }; /* @@ -363,7 +248,7 @@ static void error_cb1(DACDriver *dacp, dacerror_t err) { } static const DACConfig dac1cfg1 = { - .init = 2047U, + .init = DAC_SAMPLE_MAX, .datamode = DAC_DHRM_12BIT_RIGHT }; @@ -375,7 +260,7 @@ static const DACConversionGroup dacgrpcfg1 = { }; static const DACConfig dac1cfg2 = { - .init = 2047U, + .init = DAC_SAMPLE_MAX, .datamode = DAC_DHRM_12BIT_RIGHT }; From 292a87ad0442293aadfe6910c9e5f19a53e54a81 Mon Sep 17 00:00:00 2001 From: Michael Pio Date: Sun, 4 Nov 2018 01:08:05 +0800 Subject: [PATCH 444/788] Instructions on how to flash via STM32 bootloader (#4316) * Add instructions on flashing ARM keyboards with default STM32 bootloader * fixed typo; added note suggestion to step 4 --- docs/flashing.md | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/docs/flashing.md b/docs/flashing.md index 1edbe2225..bc418c415 100644 --- a/docs/flashing.md +++ b/docs/flashing.md @@ -71,8 +71,8 @@ Flashing sequence: 1. Press the `RESET` keycode, or short RST to GND quickly (you only have 7 seconds to flash once it enters) 2. Wait for the OS to detect the device -4. Flash a .hex file -5. Wait for the device to reset automatically +3. Flash a .hex file +4. Wait for the device to reset automatically or @@ -106,5 +106,28 @@ Flashing sequence: 1. Press the `RESET` keycode, or short RST to GND quickly (you only have 7 seconds to flash once it enters) 2. Wait for the OS to detect the device -4. Flash a .hex file -5. Reset the device into application mode (may be done automatically) +3. Flash a .hex file +4. Reset the device into application mode (may be done automatically) + +## STM32 + +All STM32 chips come preloaded with a factory bootloader that cannot be modified nor deleted. Some STM32 chips have bootloaders that do not come with USB programming (e.g. STM32F103) but the process is still the same. + +At the moment, no `BOOTLOADER` variable is needed on `rules.mk` for STM32. + +Compatible flashers: + +* [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) (recommended GUI) +* [dfu-util](https://github.com/Stefan-Schmidt/dfu-util) / `:dfu-util` (recommended command line) + +Flashing sequence: + +1. Enter the bootloader using any of the following methods: + * Tap the `RESET` keycode (may not work on STM32F042 devices) + * If a reset circuit is present, tap the RESET button + * Otherwise, you need to bridge BOOT0 to VCC (via BOOT0 button or bridge), short RESET to GND (via RESET button or bridge), and then let go of the BOOT0 bridge +2. Wait for the OS to detect the device +3. Flash a .bin file + * You will receive a warning about the DFU signature; Just ignore it +4. Reset the device into application mode (may be done automatically) + * If you are building from command line (e.g. `make planck/rev6:default:dfu-util`), make sure that `:leave` is passed to the `DFU_ARGS` variable inside your `rules.mk` (e.g. `DFU_ARGS = -d 0483:df11 -a 0 -s 0x08000000:leave`) so that your device resets after flashing From bdc72740cb5f9d7d6d5df574b39721ec479dc733 Mon Sep 17 00:00:00 2001 From: BK Date: Sat, 3 Nov 2018 13:38:37 -0400 Subject: [PATCH 445/788] Add distro support for sabayon (#4320) * Add distro support for sabayon Sabayon is a gentoo based distro with a different package manager. Does not need any use flags or masking for the required packages. * Add missing backslash * Put echo string in quotes, remove extra newline * Order gentoo/sabayon packages alphabetically. --- util/linux_install.sh | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/util/linux_install.sh b/util/linux_install.sh index d3b9328d7..8dc28be6e 100755 --- a/util/linux_install.sh +++ b/util/linux_install.sh @@ -86,15 +86,28 @@ elif grep ID /etc/os-release | grep -q gentoo; then app-arch/unzip \ app-arch/zip \ app-mobilephone/dfu-util \ + dev-embedded/avrdude \ net-misc/wget \ sys-devel/gcc \ - sys-devel/crossdev dev-embedded/avrdude + sys-devel/crossdev sudo crossdev -s4 --stable --g =4.9.4 --portage --verbose --target avr - echo Done! + echo "Done!" else echo "Quitting..." fi +elif grep ID /etc/os-release | grep -q sabayon; then + sudo equo install \ + app-arch/unzip \ + app-arch/zip \ + app-mobilephone/dfu-util \ + dev-embedded/avrdude \ + net-misc/wget \ + sys-devel/gcc \ + sys-devel/crossdev + sudo crossdev -s4 --stable --g =4.9.4 --portage --verbose --target avr + echo "Done!" + elif grep ID /etc/os-release | grep -qE "opensuse|tumbleweed"; then CROSS_AVR_GCC=cross-avr-gcc8 if grep ID /etc/os-release | grep -q "15.0"; then From 80c04b29194a0023b8e47f3ac49ea248c8ec953d Mon Sep 17 00:00:00 2001 From: wanleg <32079073+wanleg@users.noreply.github.com> Date: Sat, 3 Nov 2018 10:39:40 -0700 Subject: [PATCH 446/788] 5x5bt (#4333) * got bluetooth working * get rid of description on bluetooth * get rid of commented code used for testing * Update config.h --- layouts/community/ortho_4x12/wanleg/config.h | 7 ++---- layouts/community/ortho_5x15/wanleg/config.h | 20 +++++++++++----- layouts/community/ortho_5x15/wanleg/keymap.c | 25 +++++++++++++------- layouts/community/ortho_5x15/wanleg/rules.mk | 9 ++++++- users/wanleg/rules.mk | 6 +++++ 5 files changed, 47 insertions(+), 20 deletions(-) diff --git a/layouts/community/ortho_4x12/wanleg/config.h b/layouts/community/ortho_4x12/wanleg/config.h index 2444b8b97..2b2072db2 100644 --- a/layouts/community/ortho_4x12/wanleg/config.h +++ b/layouts/community/ortho_4x12/wanleg/config.h @@ -1,5 +1,4 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H +#pragma once //QMK DFU settings (ProMicro boards with QMK bootloader) // set top left key as bootloader mode escape key on Lets Split rev2 @@ -30,8 +29,6 @@ #undef MATRIX_ROW_PINS #undef MATRIX_COL_PINS #define MATRIX_ROW_PINS { D1, D0, D4, C6 } -//last 4 elements of the column array are are not broken out on a ProMicro (included only to preserve array structure) +//last 4 elements of the column array are not broken out on a ProMicro (included only to preserve array structure) #define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3, B2, B6, B5, B4, E6, D7, F0, B7, D6, F1 } #endif - -#endif diff --git a/layouts/community/ortho_5x15/wanleg/config.h b/layouts/community/ortho_5x15/wanleg/config.h index 1043986f7..1aeda2db4 100644 --- a/layouts/community/ortho_5x15/wanleg/config.h +++ b/layouts/community/ortho_5x15/wanleg/config.h @@ -1,8 +1,16 @@ #pragma once -// set top left key as bootloader mode escape key on 5x5 75key layout -#if defined(KEYBOARD_5x5) && !defined(PRO_MICRO) -#define QMK_LED B0 -#define QMK_ESC_OUTPUT D7 // usually COL -#define QMK_ESC_INPUT B2 // usually ROW -#endif \ No newline at end of file +//5x5 powered by Adafruit Feather 32u4 Bluefruit LE +#if defined(KEYBOARD_5x5) && defined(BLUEFRUIT) + +//need to undefine standard 5x5 array before defining alternate Bluefruit array +#undef MATRIX_ROW_PINS +#undef MATRIX_COL_PINS +#define MATRIX_ROW_PINS { F7, F6, F5, D1, D0 } +//last 5 elements not tested +#define MATRIX_COL_PINS { C6, D7, B5, B6, B7, D6, C7, F0, F1, F4, B1, B2, B3, D2, D3 } + +//get rid of description - too long to show properly in Windows +#undef DESCRIPTION +#define DESCRIPTION +#endif diff --git a/layouts/community/ortho_5x15/wanleg/keymap.c b/layouts/community/ortho_5x15/wanleg/keymap.c index df7424115..66b3ce018 100644 --- a/layouts/community/ortho_5x15/wanleg/keymap.c +++ b/layouts/community/ortho_5x15/wanleg/keymap.c @@ -15,14 +15,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TD(RST_TAP_DANCE), GHERKIN50, KC_LALT, NUMPAD, NUMBER75, ETCETERA75, KC_SPC,DIRECTION75, KC_RGUI, KC_RALT, KC_DEL, KC_RCTL, KC_KP_0, KC_KP_0, KC_KP_DOT ), -[PAD] = LAYOUT_ortho_5x5_wrapper( - _______, _______, _______, _______, _______, - _______________NUMPAD_Row__0_______________, _______, - _______________NUMPAD_Row__1_______________, _______, - _______________NUMPAD_Row__2_______________, _______, - KC_KP_0, TD(LYR50_TAP_DANCE), KC_KP_DOT, KC_PMNS, _______ -), - [GK50] = LAYOUT_ortho_5x10_wrapper( KC_ESC, _______, _______, _______, _______, _______, _______, _______, _______, KC_BSPC, _______________Gherkin_Row_0_______________, @@ -31,6 +23,23 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TD(RST_TAP_DANCE), GHERKIN75, NUMPAD, gNUMBER, gETCETERA, KC_SPC,gDIRECTION, KC_RGUI, KC_RALT, KC_RGUI ), +#if defined(BLUEFRUIT) +[PAD] = LAYOUT_ortho_5x5_wrapper( + _______, _______, _______, OUT_BT, OUT_USB, + _______________NUMPAD_Row__0_______________, _______, + _______________NUMPAD_Row__1_______________, _______, + _______________NUMPAD_Row__2_______________, _______, + KC_KP_0, TD(LYR50_TAP_DANCE), KC_KP_DOT, KC_PMNS, _______ +), +#else + [PAD] = LAYOUT_ortho_5x5_wrapper( + _______, _______, _______, _______, _______, + _______________NUMPAD_Row__0_______________, _______, + _______________NUMPAD_Row__1_______________, _______, + _______________NUMPAD_Row__2_______________, _______, + KC_KP_0, TD(LYR50_TAP_DANCE), KC_KP_DOT, KC_PMNS, _______ +), +#endif #else /* Gherkin 75 * .--------------------------------------------------------------------------------------------------------------------------------------. diff --git a/layouts/community/ortho_5x15/wanleg/rules.mk b/layouts/community/ortho_5x15/wanleg/rules.mk index e36226fb2..bfc4c69d9 100644 --- a/layouts/community/ortho_5x15/wanleg/rules.mk +++ b/layouts/community/ortho_5x15/wanleg/rules.mk @@ -1 +1,8 @@ -SWAP_HANDS_ENABLE = no \ No newline at end of file +ifeq (,$(findstring yes,$(BLUEFRUIT))) + BLUETOOTH = AdafruitBLE + BLUETOOTH_ENABLE = yes + F_CPU = 8000000 + CONSOLE_ENABLE = no # Console for debug(+400) + COMMAND_ENABLE = no # Commands for debug and configuration + RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +endif \ No newline at end of file diff --git a/users/wanleg/rules.mk b/users/wanleg/rules.mk index 2a2a65cfe..e3e802b4a 100644 --- a/users/wanleg/rules.mk +++ b/users/wanleg/rules.mk @@ -14,3 +14,9 @@ endif ifeq ($(strip $(PM)), yes) OPT_DEFS += -DPRO_MICRO endif + +#use alternate settings for boards using "Adafruit Feather 32u4 Bluefruit LE" instead of Micro +#example usage: make 5x5:wanleg BT=yes +ifeq ($(strip $(BT)), yes) + OPT_DEFS += -DBLUEFRUIT +endif \ No newline at end of file From 60ed0b7c3045d9511c28495f4d8c65240434c952 Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Sat, 3 Nov 2018 15:09:32 -0700 Subject: [PATCH 447/788] Keyboard: Port over the x268 Noxary Firmware (#4339) * port over Rozakiin https://github.com/Rozakiin/Noxary_Firmware/tree/master/noxary_x268 * rename LAYOUT to LAYOUT_65_ansi default layout * add configurator support * add community layout support * put Rozakiin's name everywhere * update readme * problems with the 65_ansi keymap to be diagnosed later --- keyboards/noxary/README.md | 4 +- keyboards/noxary/x268/config.h | 230 ++++++++++++++++++ keyboards/noxary/x268/info.json | 12 + .../noxary/x268/keymaps/default/config.h | 19 ++ .../noxary/x268/keymaps/default/keymap.c | 83 +++++++ .../noxary/x268/keymaps/default/readme.md | 1 + keyboards/noxary/x268/readme.md | 18 ++ keyboards/noxary/x268/rules.mk | 80 ++++++ keyboards/noxary/x268/x268.c | 53 ++++ keyboards/noxary/x268/x268.h | 35 +++ 10 files changed, 534 insertions(+), 1 deletion(-) create mode 100644 keyboards/noxary/x268/config.h create mode 100644 keyboards/noxary/x268/info.json create mode 100644 keyboards/noxary/x268/keymaps/default/config.h create mode 100644 keyboards/noxary/x268/keymaps/default/keymap.c create mode 100644 keyboards/noxary/x268/keymaps/default/readme.md create mode 100644 keyboards/noxary/x268/readme.md create mode 100644 keyboards/noxary/x268/rules.mk create mode 100644 keyboards/noxary/x268/x268.c create mode 100644 keyboards/noxary/x268/x268.h diff --git a/keyboards/noxary/README.md b/keyboards/noxary/README.md index 81e525506..bd4b4b591 100644 --- a/keyboards/noxary/README.md +++ b/keyboards/noxary/README.md @@ -1,7 +1,9 @@ # Noxary Firmware -All files related to firmware of Noxary Keyboards designed by Rozakiin. +All files related to firmware of Noxary Keyboards designed by [Rozakiin](https://github.com/rozakiin). ### Keyboards - [268](./268/): Original repo [here](https://github.com/Rozakiin/Noxary_Firmware). Imported by kind [permission](https://github.com/Rozakiin/Noxary_Firmware/issues/1) of @rozakiin + +- [x268](./x268/): Original repo [here](https://github.com/Rozakiin/Noxary_Firmware). Imported by kind [permission](https://github.com/Rozakiin/Noxary_Firmware/issues/1) of @rozakiin diff --git a/keyboards/noxary/x268/config.h b/keyboards/noxary/x268/config.h new file mode 100644 index 000000000..5c4f6cdad --- /dev/null +++ b/keyboards/noxary/x268/config.h @@ -0,0 +1,230 @@ +/* +Copyright 2018 Rozakiin + +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 . +*/ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0x4E58 +#define PRODUCT_ID 0x0044 +#define DEVICE_VER 0x00F2 +#define MANUFACTURER Noxary +#define PRODUCT x268 +#define DESCRIPTION QMK keyboard firmware for x268 + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 16 + +/* + * 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 { F7, F6, F5, F0, B4 } +#define MATRIX_COL_PINS { C6, B6, C7, F4, E6, B2, D6, D0, D1, D7, D4, D5, D3, F1, D2, B1 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +#define BACKLIGHT_PIN B7 +#ifdef BACKLIGHT_PIN +#define BACKLIGHT_LEVELS 3 +#endif + +/* ws2812b options */ +#define RGB_DI_PIN B5 +#ifdef RGB_DI_PIN +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 16 +#define RGBLIGHT_HUE_STEP 16 +#define RGBLIGHT_SAT_STEP 16 +#define RGBLIGHT_VAL_STEP 16 +/*#define RGBLIGHT_LIMIT_VAL 255 */ +#endif + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* 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 userful 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 + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * 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 + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +//#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ + +/* Bootmagic Lite key configuration */ +// #define BOOTMAGIC_LITE_ROW 0 +// #define BOOTMAGIC_LITE_COLUMN 0 diff --git a/keyboards/noxary/x268/info.json b/keyboards/noxary/x268/info.json new file mode 100644 index 000000000..047c39f04 --- /dev/null +++ b/keyboards/noxary/x268/info.json @@ -0,0 +1,12 @@ +{ + "keyboard_name": "Noxary x268", + "url": "", + "maintainer": "qmk", + "width": 16, + "height": 5, + "layouts": { + "LAYOUT": { + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0, "w":2}, {"x":15, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":15, "y":1}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2, "w":2.25}, {"x":15, "y":2}, {"x":0, "y":3, "w":2.25}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"x":15, "y":3}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"x":10, "y":4}, {"x":11, "y":4}, {"x":12, "y":4}, {"x":13, "y":4}, {"x":14, "y":4}, {"x":15, "y":4}] + } + } +} diff --git a/keyboards/noxary/x268/keymaps/default/config.h b/keyboards/noxary/x268/keymaps/default/config.h new file mode 100644 index 000000000..9c4c2b630 --- /dev/null +++ b/keyboards/noxary/x268/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 Rozakiin + * + * 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 . + */ + +#pragma once + +// place overrides here diff --git a/keyboards/noxary/x268/keymaps/default/keymap.c b/keyboards/noxary/x268/keymaps/default/keymap.c new file mode 100644 index 000000000..cb37407a7 --- /dev/null +++ b/keyboards/noxary/x268/keymaps/default/keymap.c @@ -0,0 +1,83 @@ +#include QMK_KEYBOARD_H + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _BL 0 +#define _FL1 1 +#define _FL2 2 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* _BL: Base Layer(Default) - For ISO enter use ANSI enter + * ,----------------------------------------------------------------. + * |Esc | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \|BSpc| Grv| + * |----------------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | Del| + * |----------------------------------------------------------------| + * |CAPS | A| S| D| F| G| H| J| K| L| ;| '| #| Ent|PgUp| + * |----------------------------------------------------------------| + * |Shift| \| Z| X| C| V| B| N| M| ,| .| /|Shift | Up|PgDn| + * |----------------------------------------------------------------| + * |Ctrl|Win |Alt | Space |Alt|Mo(1)|Ctrl|Lef|Dow|Rght| + * `----------------------------------------------------------------' + */ + [_BL] = LAYOUT_65_ansi( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_BSPC, KC_GRV, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_PGUP, + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_LALT, MO(_FL1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + /* _FL1: Function Layer 1 - For ISO enter use ANSI enter + * ,----------------------------------------------------------------. + * | `|F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12| |PScr| | + * |----------------------------------------------------------------| + * | | | | |RST| | | | | | | | | | Ins| + * |----------------------------------------------------------------| + * | | | | | | | | | | | | | | |Home| + * |----------------------------------------------------------------| + * | | | | | | | | | |Bl-|Bl+| |Mute|Vol+| End| + * |----------------------------------------------------------------| + * | | | | BL_Toggle | | | | |Vol-| | + * `----------------------------------------------------------------' + */ + [_FL1] = LAYOUT_65_ansi( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_PSCR, _______, + RGB_TOG, RGB_VAI, RGB_SAI, RGB_HUI, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS, + _______, RGB_VAD, RGB_SAD, RGB_HUD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, + _______, _______, _______, _______, _______, _______, _______, _______, _______, BL_DEC, BL_INC, _______, KC_MUTE, KC_VOLU, KC_END, + _______, _______, _______, BL_TOGG, _______, _______, _______, _______, KC_VOLD, _______), + /* _FL2: Function Layer 2 - For ISO enter use ANSI enter + * ,----------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | + * |----------------------------------------------------------------| + * | | | | | | | | | | | | | | | | + * |----------------------------------------------------------------| + * | | | | | | | | | | | | | | | | + * |----------------------------------------------------------------| + * | | | | | | | | | | | | | | | | + * |----------------------------------------------------------------| + * | | | | | | | | | | | + * `----------------------------------------------------------------' + */ + [_FL2] = LAYOUT_65_ansi( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + + +}; + + +void matrix_init_user(void) { +} + +void matrix_scan_user(void) { +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + diff --git a/keyboards/noxary/x268/keymaps/default/readme.md b/keyboards/noxary/x268/keymaps/default/readme.md new file mode 100644 index 000000000..5d5bd6959 --- /dev/null +++ b/keyboards/noxary/x268/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for x268 diff --git a/keyboards/noxary/x268/readme.md b/keyboards/noxary/x268/readme.md new file mode 100644 index 000000000..c1c05c34d --- /dev/null +++ b/keyboards/noxary/x268/readme.md @@ -0,0 +1,18 @@ +# Noxary x268 + +![x268](https://geekhack.org/index.php?action=dlattach;topic=96377.0;attach=198826;image) + +A fully customizable 65% keyboard. + +* Keyboard Maintainer: [Rozakiin](https://github.com/rozakiin) +* Hardware Supported: x268 PCB + * rev1 +* Hardware Availability: + * [Noxary - 268](https://geekhack.org/index.php?topic=92066.0) + * [LZ - CLS ms](https://geekhack.org/index.php?topic=96377) + +Make example for this keyboard (after setting up your build environment): + + make noxary/x268:default + +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). diff --git a/keyboards/noxary/x268/rules.mk b/keyboards/noxary/x268/rules.mk new file mode 100644 index 000000000..3c4a26ad1 --- /dev/null +++ b/keyboards/noxary/x268/rules.mk @@ -0,0 +1,80 @@ +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = yes # USB Nkey Rollover +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) diff --git a/keyboards/noxary/x268/x268.c b/keyboards/noxary/x268/x268.c new file mode 100644 index 000000000..3921270ac --- /dev/null +++ b/keyboards/noxary/x268/x268.c @@ -0,0 +1,53 @@ +/* Copyright 2018 Rozakiin + * + * 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 . + */ +#include "x268.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + + led_set_user(usb_led); +} + +void led_set_user(uint8_t usb_led) { + + if (usb_led & (1 << USB_LED_CAPS_LOCK)) { + DDRB |= (1 << 0); PORTB |= (1 << 0); + } + else { + DDRB &= ~(1 << 0); PORTB &= ~(1 << 0); + } +} diff --git a/keyboards/noxary/x268/x268.h b/keyboards/noxary/x268/x268.h new file mode 100644 index 000000000..53855e206 --- /dev/null +++ b/keyboards/noxary/x268/x268.h @@ -0,0 +1,35 @@ +/* Copyright 2018 Rozakiin + * + * 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 . + */ +#ifndef X268_H +#define X268_H + +#include "quantum.h" + +#define LAYOUT_65_ansi( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K114, K115, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K214, K215, \ + K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K314, K315, \ + K400, K401, K402, K406, K409, K410, K411, K412, K414, K415 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, KC_NO, K114, K115 }, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, KC_NO, K214, K215 }, \ + { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, KC_NO, K314, K315 }, \ + { K400, K401, K402, KC_NO, KC_NO, KC_NO, K406, KC_NO, KC_NO, K409, K410, K411, K412, KC_NO, K414, K415 } \ +} + +#endif From b5d7bb6154f848e4f3fd3e5d3cc8bbb16a18e093 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Sat, 3 Nov 2018 23:57:42 -0700 Subject: [PATCH 448/788] converter/usb_usb Refactor and Configurator support (#4345) * converter/usb_usb: layout macro refactor - KEYMAP_ALL renamed to LAYOUT_all - KEYMAP renamed to LAYOUT_ansi - KEYMAP_ISO renamed to LAYOUT_iso - KEYMAP_JIS renamed to LAYOUT_jis * converter/usb_usb: keymap refactor - all keymaps now use #include QMK_KEYBOARD_H - layout macro names updated - removed deprecated TMK macro/function code * Add info.json file for Configurator support --- keyboards/converter/usb_usb/info.json | 485 ++++++++++++++++++ .../converter/usb_usb/keymaps/ble/keymap.c | 18 +- .../usb_usb/keymaps/coloneljesus/keymap.c | 44 +- .../usb_usb/keymaps/default/keymap.c | 22 +- keyboards/converter/usb_usb/usb_usb.h | 56 +- 5 files changed, 537 insertions(+), 88 deletions(-) create mode 100644 keyboards/converter/usb_usb/info.json diff --git a/keyboards/converter/usb_usb/info.json b/keyboards/converter/usb_usb/info.json new file mode 100644 index 000000000..af3dd0b5e --- /dev/null +++ b/keyboards/converter/usb_usb/info.json @@ -0,0 +1,485 @@ +{ + "keyboard_name": "converter/usb_usb", + "url": "", + "maintainer": "qmk", + "width": 22.5, + "height": 6.5, + "layouts": { + "LAYOUT_all": { + "layout": [ + {"label":"F13", "x":2, "y":0}, + {"label":"F14", "x":3, "y":0}, + {"label":"F15", "x":4, "y":0}, + {"label":"F16", "x":5, "y":0}, + {"label":"F17", "x":6.5, "y":0}, + {"label":"F18", "x":7.5, "y":0}, + {"label":"F19", "x":8.5, "y":0}, + {"label":"F20", "x":9.5, "y":0}, + {"label":"F21", "x":11, "y":0}, + {"label":"F22", "x":12, "y":0}, + {"label":"F23", "x":13, "y":0}, + {"label":"F24", "x":14, "y":0}, + {"label":"Esc", "x":0, "y":1}, + {"label":"F1", "x":2, "y":1}, + {"label":"F2", "x":3, "y":1}, + {"label":"F3", "x":4, "y":1}, + {"label":"F4", "x":5, "y":1}, + {"label":"F5", "x":6.5, "y":1}, + {"label":"F6", "x":7.5, "y":1}, + {"label":"F7", "x":8.5, "y":1}, + {"label":"F8", "x":9.5, "y":1}, + {"label":"F9", "x":11, "y":1}, + {"label":"F10", "x":12, "y":1}, + {"label":"F11", "x":13, "y":1}, + {"label":"F12", "x":14, "y":1}, + {"label":"Print Screen", "x":15.25, "y":1}, + {"label":"Scroll Lock", "x":16.25, "y":1}, + {"label":"Pause", "x":17.25, "y":1}, + {"label":"Volume Down", "x":18.5, "y":1}, + {"label":"Vol Up", "x":19.5, "y":1}, + {"label":"Mute", "x":20.5, "y":1}, + {"label":"Power", "x":21.5, "y":1}, + {"label":"Help", "x":22.75, "y":1}, + {"label":"`", "x":0, "y":2.5}, + {"label":"1", "x":1, "y":2.5}, + {"label":"2", "x":2, "y":2.5}, + {"label":"3", "x":3, "y":2.5}, + {"label":"4", "x":4, "y":2.5}, + {"label":"5", "x":5, "y":2.5}, + {"label":"6", "x":6, "y":2.5}, + {"label":"7", "x":7, "y":2.5}, + {"label":"8", "x":8, "y":2.5}, + {"label":"9", "x":9, "y":2.5}, + {"label":"0", "x":10, "y":2.5}, + {"label":"-", "x":11, "y":2.5}, + {"label":"=", "x":12, "y":2.5}, + {"label":"Yen", "x":13, "y":2.5}, + {"label":"Back Space", "x":14, "y":2.5}, + {"label":"Insert", "x":15.25, "y":2.5}, + {"label":"Home", "x":16.25, "y":2.5}, + {"label":"Page Up", "x":17.25, "y":2.5}, + {"label":"Num Lock", "x":18.5, "y":2.5}, + {"label":"Num /", "x":19.5, "y":2.5}, + {"label":"Num *", "x":20.5, "y":2.5}, + {"label":"Num -", "x":21.5, "y":2.5}, + {"label":"Stop", "x":22.75, "y":2.5}, + {"label":"Again", "x":23.75, "y":2.5}, + {"label":"Tab", "x":0, "y":3.5, "w":1.5}, + {"label":"Q", "x":1.5, "y":3.5}, + {"label":"W", "x":2.5, "y":3.5}, + {"label":"E", "x":3.5, "y":3.5}, + {"label":"R", "x":4.5, "y":3.5}, + {"label":"T", "x":5.5, "y":3.5}, + {"label":"Y", "x":6.5, "y":3.5}, + {"label":"U", "x":7.5, "y":3.5}, + {"label":"I", "x":8.5, "y":3.5}, + {"label":"O", "x":9.5, "y":3.5}, + {"label":"P", "x":10.5, "y":3.5}, + {"label":"[", "x":11.5, "y":3.5}, + {"label":"]", "x":12.5, "y":3.5}, + {"label":"\\", "x":13.5, "y":3.5, "w":1.5}, + {"label":"Delete", "x":15.25, "y":3.5}, + {"label":"End", "x":16.25, "y":3.5}, + {"label":"Page Down", "x":17.25, "y":3.5}, + {"label":"Num 7", "x":18.5, "y":3.5}, + {"label":"Num 8", "x":19.5, "y":3.5}, + {"label":"Num 9", "x":20.5, "y":3.5}, + {"label":"Num +", "x":21.5, "y":3.5}, + {"label":"Menu", "x":22.75, "y":3.5}, + {"label":"Undo", "x":23.75, "y":3.5}, + {"label":"Caps Lock", "x":0, "y":4.5, "w":1.75}, + {"label":"A", "x":1.75, "y":4.5}, + {"label":"S", "x":2.75, "y":4.5}, + {"label":"D", "x":3.75, "y":4.5}, + {"label":"F", "x":4.75, "y":4.5}, + {"label":"G", "x":5.75, "y":4.5}, + {"label":"H", "x":6.75, "y":4.5}, + {"label":"J", "x":7.75, "y":4.5}, + {"label":"K", "x":8.75, "y":4.5}, + {"label":"L", "x":9.75, "y":4.5}, + {"label":";", "x":10.75, "y":4.5}, + {"label":"\"", "x":11.75, "y":4.5}, + {"label":"ISO #", "x":12.75, "y":4.5}, + {"label":"Enter", "x":13.75, "y":4.5, "w":1.25}, + {"label":"Num 4", "x":18.5, "y":4.5}, + {"label":"Num 5", "x":19.5, "y":4.5}, + {"label":"Num 6", "x":20.5, "y":4.5}, + {"label":"Num , ", "x":21.5, "y":4.5}, + {"label":"Select", "x":22.75, "y":4.5}, + {"label":"Copy", "x":23.75, "y":4.5}, + {"label":"Shift", "x":0, "y":5.5, "w":1.25}, + {"label":"ISO \\", "x":1.25, "y":5.5}, + {"label":"Z", "x":2.25, "y":5.5}, + {"label":"X", "x":3.25, "y":5.5}, + {"label":"C", "x":4.25, "y":5.5}, + {"label":"V", "x":5.25, "y":5.5}, + {"label":"B", "x":6.25, "y":5.5}, + {"label":"N", "x":7.25, "y":5.5}, + {"label":"M", "x":8.25, "y":5.5}, + {"label":",", "x":9.25, "y":5.5}, + {"label":".", "x":10.25, "y":5.5}, + {"label":"/", "x":11.25, "y":5.5}, + {"label":"JIS \\", "x":12.25, "y":5.5}, + {"label":"Shift", "x":13.25, "y":5.5, "w":1.75}, + {"label":"Up", "x":16.25, "y":5.5}, + {"label":"Num 1", "x":18.5, "y":5.5}, + {"label":"Num 2", "x":19.5, "y":5.5}, + {"label":"Num 3", "x":20.5, "y":5.5}, + {"label":"Num =", "x":21.5, "y":5.5}, + {"label":"Exec", "x":22.75, "y":5.5}, + {"label":"Paste", "x":23.75, "y":5.5}, + {"label":"Ctrl", "x":0, "y":6.5}, + {"label":"GUI", "x":1, "y":6.5}, + {"label":"Alt", "x":2, "y":6.5}, + {"label":"JIS Muhenkan", "x":3, "y":6.5}, + {"label":"Hanja", "x":4, "y":6.5}, + {"label":"Space", "x":5, "y":6.5, "w":3}, + {"label":"Hangul/English", "x":8, "y":6.5}, + {"label":"JIS Henkan", "x":9, "y":6.5}, + {"label":"JIS Katakana/Hiragana", "x":10, "y":6.5}, + {"label":"Alt", "x":11, "y":6.5}, + {"label":"GUI", "x":12, "y":6.5}, + {"label":"App", "x":13, "y":6.5}, + {"label":"Ctrl", "x":14, "y":6.5}, + {"label":"Left", "x":15.25, "y":6.5}, + {"label":"Down", "x":16.25, "y":6.5}, + {"label":"Right", "x":17.25, "y":6.5}, + {"label":"Num 0", "x":18.5, "y":6.5, "w":2}, + {"label":"Num .", "x":20.5, "y":6.5}, + {"label":"Num Enter", "x":21.5, "y":6.5}, + {"label":"Find", "x":22.75, "y":6.5}, + {"label":"Cut", "x":23.75, "y":6.5} + ] + }, + "LAYOUT_ansi": { + "layout": [ + {"label":"Esc", "x":0, "y":0}, + {"label":"F1", "x":2, "y":0}, + {"label":"F2", "x":3, "y":0}, + {"label":"F3", "x":4, "y":0}, + {"label":"F4", "x":5, "y":0}, + {"label":"F5", "x":6.5, "y":0}, + {"label":"F6", "x":7.5, "y":0}, + {"label":"F7", "x":8.5, "y":0}, + {"label":"F8", "x":9.5, "y":0}, + {"label":"F9", "x":11, "y":0}, + {"label":"F10", "x":12, "y":0}, + {"label":"F11", "x":13, "y":0}, + {"label":"F12", "x":14, "y":0}, + {"label":"PrtSc", "x":15.25, "y":0}, + {"label":"Scroll Lock", "x":16.25, "y":0}, + {"label":"Pause", "x":17.25, "y":0}, + {"label":"`", "x":0, "y":1.5}, + {"label":"1", "x":1, "y":1.5}, + {"label":"2", "x":2, "y":1.5}, + {"label":"3", "x":3, "y":1.5}, + {"label":"4", "x":4, "y":1.5}, + {"label":"5", "x":5, "y":1.5}, + {"label":"6", "x":6, "y":1.5}, + {"label":"7", "x":7, "y":1.5}, + {"label":"8", "x":8, "y":1.5}, + {"label":"9", "x":9, "y":1.5}, + {"label":"0", "x":10, "y":1.5}, + {"label":"-", "x":11, "y":1.5}, + {"label":"=", "x":12, "y":1.5}, + {"label":"Backspace", "x":13, "y":1.5, "w":2}, + {"label":"Insert", "x":15.25, "y":1.5}, + {"label":"Home", "x":16.25, "y":1.5}, + {"label":"Page Up", "x":17.25, "y":1.5}, + {"label":"Num Lock", "x":18.5, "y":1.5}, + {"label":"Num /", "x":19.5, "y":1.5}, + {"label":"Num *", "x":20.5, "y":1.5}, + {"label":"Num -", "x":21.5, "y":1.5}, + {"label":"Tab", "x":0, "y":2.5, "w":1.5}, + {"label":"Q", "x":1.5, "y":2.5}, + {"label":"W", "x":2.5, "y":2.5}, + {"label":"E", "x":3.5, "y":2.5}, + {"label":"R", "x":4.5, "y":2.5}, + {"label":"T", "x":5.5, "y":2.5}, + {"label":"Y", "x":6.5, "y":2.5}, + {"label":"U", "x":7.5, "y":2.5}, + {"label":"I", "x":8.5, "y":2.5}, + {"label":"O", "x":9.5, "y":2.5}, + {"label":"P", "x":10.5, "y":2.5}, + {"label":"[", "x":11.5, "y":2.5}, + {"label":"]", "x":12.5, "y":2.5}, + {"label":"\\", "x":13.5, "y":2.5, "w":1.5}, + {"label":"Delete", "x":15.25, "y":2.5}, + {"label":"End", "x":16.25, "y":2.5}, + {"label":"Page Down", "x":17.25, "y":2.5}, + {"label":"Num 7", "x":18.5, "y":2.5}, + {"label":"Num 8", "x":19.5, "y":2.5}, + {"label":"Num 9", "x":20.5, "y":2.5}, + {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75}, + {"label":"A", "x":1.75, "y":3.5}, + {"label":"S", "x":2.75, "y":3.5}, + {"label":"D", "x":3.75, "y":3.5}, + {"label":"F", "x":4.75, "y":3.5}, + {"label":"G", "x":5.75, "y":3.5}, + {"label":"H", "x":6.75, "y":3.5}, + {"label":"J", "x":7.75, "y":3.5}, + {"label":"K", "x":8.75, "y":3.5}, + {"label":"L", "x":9.75, "y":3.5}, + {"label":":", "x":10.75, "y":3.5}, + {"label":"\"", "x":11.75, "y":3.5}, + {"label":"Enter", "x":12.75, "y":3.5, "w":2.25}, + {"label":"Num 4", "x":18.5, "y":3.5}, + {"label":"Num 5", "x":19.5, "y":3.5}, + {"label":"Num 6", "x":20.5, "y":3.5}, + {"label":"Num +", "x":21.5, "y":2.5, "h":2}, + {"label":"Shift", "x":0, "y":4.5, "w":2.25}, + {"label":"Z", "x":2.25, "y":4.5}, + {"label":"X", "x":3.25, "y":4.5}, + {"label":"C", "x":4.25, "y":4.5}, + {"label":"V", "x":5.25, "y":4.5}, + {"label":"B", "x":6.25, "y":4.5}, + {"label":"N", "x":7.25, "y":4.5}, + {"label":"M", "x":8.25, "y":4.5}, + {"label":",", "x":9.25, "y":4.5}, + {"label":".", "x":10.25, "y":4.5}, + {"label":"/", "x":11.25, "y":4.5}, + {"label":"Shift", "x":12.25, "y":4.5, "w":2.75}, + {"label":"Up", "x":16.25, "y":4.5}, + {"label":"Num 1", "x":18.5, "y":4.5}, + {"label":"Num 2", "x":19.5, "y":4.5}, + {"label":"Num 3", "x":20.5, "y":4.5}, + {"label":"Ctrl", "x":0, "y":5.5, "w":1.25}, + {"label":"GUI", "x":1.25, "y":5.5, "w":1.25}, + {"label":"Alt", "x":2.5, "y":5.5, "w":1.25}, + {"label":"Space", "x":3.75, "y":5.5, "w":6.25}, + {"label":"Alt", "x":10, "y":5.5, "w":1.25}, + {"label":"GUI", "x":11.25, "y":5.5, "w":1.25}, + {"label":"Menu", "x":12.5, "y":5.5, "w":1.25}, + {"label":"Ctrl", "x":13.75, "y":5.5, "w":1.25}, + {"label":"Left", "x":15.25, "y":5.5}, + {"label":"Down", "x":16.25, "y":5.5}, + {"label":"Right", "x":17.25, "y":5.5}, + {"label":"Num 0", "x":18.5, "y":5.5, "w":2}, + {"label":"Num .", "x":20.5, "y":5.5}, + {"label":"Num Enter", "x":21.5, "y":4.5, "h":2} + ] + }, + "LAYOUT_iso": { + "layout": [ + {"label":"Esc", "x":0, "y":0}, + {"label":"F1", "x":2, "y":0}, + {"label":"F2", "x":3, "y":0}, + {"label":"F3", "x":4, "y":0}, + {"label":"F4", "x":5, "y":0}, + {"label":"F5", "x":6.5, "y":0}, + {"label":"F6", "x":7.5, "y":0}, + {"label":"F7", "x":8.5, "y":0}, + {"label":"F8", "x":9.5, "y":0}, + {"label":"F9", "x":11, "y":0}, + {"label":"F10", "x":12, "y":0}, + {"label":"F11", "x":13, "y":0}, + {"label":"F12", "x":14, "y":0}, + {"label":"Print Screen", "x":15.25, "y":0}, + {"label":"Scroll Lock", "x":16.25, "y":0}, + {"label":"Pause", "x":17.25, "y":0}, + {"label":"`", "x":0, "y":1.5}, + {"label":"1", "x":1, "y":1.5}, + {"label":"2", "x":2, "y":1.5}, + {"label":"3", "x":3, "y":1.5}, + {"label":"4", "x":4, "y":1.5}, + {"label":"5", "x":5, "y":1.5}, + {"label":"6", "x":6, "y":1.5}, + {"label":"7", "x":7, "y":1.5}, + {"label":"8", "x":8, "y":1.5}, + {"label":"9", "x":9, "y":1.5}, + {"label":"0", "x":10, "y":1.5}, + {"label":"-", "x":11, "y":1.5}, + {"label":"=", "x":12, "y":1.5}, + {"label":"Backspace", "x":13, "y":1.5, "w":2}, + {"label":"Insert", "x":15.25, "y":1.5}, + {"label":"Home", "x":16.25, "y":1.5}, + {"label":"Page Up", "x":17.25, "y":1.5}, + {"label":"Num Lock", "x":18.5, "y":1.5}, + {"label":"Num /", "x":19.5, "y":1.5}, + {"label":"Num *", "x":20.5, "y":1.5}, + {"label":"Num -", "x":21.5, "y":1.5}, + {"label":"Tab", "x":0, "y":2.5, "w":1.5}, + {"label":"Q", "x":1.5, "y":2.5}, + {"label":"W", "x":2.5, "y":2.5}, + {"label":"E", "x":3.5, "y":2.5}, + {"label":"R", "x":4.5, "y":2.5}, + {"label":"T", "x":5.5, "y":2.5}, + {"label":"Y", "x":6.5, "y":2.5}, + {"label":"U", "x":7.5, "y":2.5}, + {"label":"I", "x":8.5, "y":2.5}, + {"label":"O", "x":9.5, "y":2.5}, + {"label":"P", "x":10.5, "y":2.5}, + {"label":"[", "x":11.5, "y":2.5}, + {"label":"]", "x":12.5, "y":2.5}, + {"label":"Enter", "x":13.75, "y":2.5, "w":1.25, "h":2}, + {"label":"Delete", "x":15.25, "y":2.5}, + {"label":"End", "x":16.25, "y":2.5}, + {"label":"Page Down", "x":17.25, "y":2.5}, + {"label":"Num 7", "x":18.5, "y":2.5}, + {"label":"Num 8", "x":19.5, "y":2.5}, + {"label":"Num 9", "x":20.5, "y":2.5}, + {"label":"Num +", "x":21.5, "y":2.5, "h":2}, + {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75}, + {"label":"A", "x":1.75, "y":3.5}, + {"label":"S", "x":2.75, "y":3.5}, + {"label":"D", "x":3.75, "y":3.5}, + {"label":"F", "x":4.75, "y":3.5}, + {"label":"G", "x":5.75, "y":3.5}, + {"label":"H", "x":6.75, "y":3.5}, + {"label":"J", "x":7.75, "y":3.5}, + {"label":"K", "x":8.75, "y":3.5}, + {"label":"L", "x":9.75, "y":3.5}, + {"label":";", "x":10.75, "y":3.5}, + {"label":"'", "x":11.75, "y":3.5}, + {"label":"ISO #", "x":12.75, "y":3.5}, + {"label":"Num 4", "x":18.5, "y":3.5}, + {"label":"Num 5", "x":19.5, "y":3.5}, + {"label":"Num 6", "x":20.5, "y":3.5}, + {"label":"Shift", "x":0, "y":4.5, "w":1.25}, + {"label":"ISO \\", "x":1.25, "y":4.5}, + {"label":"Z", "x":2.25, "y":4.5}, + {"label":"X", "x":3.25, "y":4.5}, + {"label":"C", "x":4.25, "y":4.5}, + {"label":"V", "x":5.25, "y":4.5}, + {"label":"B", "x":6.25, "y":4.5}, + {"label":"N", "x":7.25, "y":4.5}, + {"label":"M", "x":8.25, "y":4.5}, + {"label":",", "x":9.25, "y":4.5}, + {"label":".", "x":10.25, "y":4.5}, + {"label":"/", "x":11.25, "y":4.5}, + {"label":"Shift", "x":12.25, "y":4.5, "w":2.75}, + {"label":"Up", "x":16.25, "y":4.5}, + {"label":"Num 1", "x":18.5, "y":4.5}, + {"label":"Num 2", "x":19.5, "y":4.5}, + {"label":"Num 3", "x":20.5, "y":4.5}, + {"label":"Num Enter", "x":21.5, "y":4.5, "h":2}, + {"label":"Ctrl", "x":0, "y":5.5, "w":1.25}, + {"label":"GUI", "x":1.25, "y":5.5, "w":1.25}, + {"label":"Alt", "x":2.5, "y":5.5, "w":1.25}, + {"label":"Space", "x":3.75, "y":5.5, "w":6.25}, + {"label":"AltGr", "x":10, "y":5.5, "w":1.25}, + {"label":"GUI", "x":11.25, "y":5.5, "w":1.25}, + {"label":"Menu", "x":12.5, "y":5.5, "w":1.25}, + {"label":"Ctrl", "x":13.75, "y":5.5, "w":1.25}, + {"label":"Left", "x":15.25, "y":5.5}, + {"label":"Down", "x":16.25, "y":5.5}, + {"label":"Right", "x":17.25, "y":5.5}, + {"label":"Num 0", "x":18.5, "y":5.5, "w":2}, + {"label":"Num .", "x":20.5, "y":5.5} + ] + }, + "LAYOUT_jis": { + "layout": [ + {"label":"Esc", "x":0, "y":0}, + {"label":"F1", "x":2, "y":0}, + {"label":"F2", "x":3, "y":0}, + {"label":"F3", "x":4, "y":0}, + {"label":"F4", "x":5, "y":0}, + {"label":"F5", "x":6.5, "y":0}, + {"label":"F6", "x":7.5, "y":0}, + {"label":"F7", "x":8.5, "y":0}, + {"label":"F8", "x":9.5, "y":0}, + {"label":"F9", "x":11, "y":0}, + {"label":"F10", "x":12, "y":0}, + {"label":"F11", "x":13, "y":0}, + {"label":"F12", "x":14, "y":0}, + {"label":"Print Screen", "x":15.25, "y":0}, + {"label":"Scroll Lock", "x":16.25, "y":0}, + {"label":"Pause", "x":17.25, "y":0}, + {"label":"JIS Hankaku / Zenkaku", "x":0, "y":1.5}, + {"label":"1", "x":1, "y":1.5}, + {"label":"2", "x":2, "y":1.5}, + {"label":"3", "x":3, "y":1.5}, + {"label":"4", "x":4, "y":1.5}, + {"label":"5", "x":5, "y":1.5}, + {"label":"6", "x":6, "y":1.5}, + {"label":"7", "x":7, "y":1.5}, + {"label":"8", "x":8, "y":1.5}, + {"label":"9", "x":9, "y":1.5}, + {"label":"0", "x":10, "y":1.5}, + {"label":"-", "x":11, "y":1.5}, + {"label":"ˆ", "x":12, "y":1.5}, + {"label":"JIS Yen", "x":13, "y":1.5}, + {"label":"Back Space", "x":14, "y":1.5}, + {"label":"Insert", "x":15.25, "y":1.5}, + {"label":"Home", "x":16.25, "y":1.5}, + {"label":"Page Up", "x":17.25, "y":1.5}, + {"label":"Num Lock", "x":18.5, "y":1.5}, + {"label":"Num /", "x":19.5, "y":1.5}, + {"label":"Num *", "x":20.5, "y":1.5}, + {"label":"Num -", "x":21.5, "y":1.5}, + {"label":"Tab", "x":0, "y":2.5, "w":1.5}, + {"label":"Q", "x":1.5, "y":2.5}, + {"label":"W", "x":2.5, "y":2.5}, + {"label":"E", "x":3.5, "y":2.5}, + {"label":"R", "x":4.5, "y":2.5}, + {"label":"T", "x":5.5, "y":2.5}, + {"label":"Y", "x":6.5, "y":2.5}, + {"label":"U", "x":7.5, "y":2.5}, + {"label":"I", "x":8.5, "y":2.5}, + {"label":"O", "x":9.5, "y":2.5}, + {"label":"P", "x":10.5, "y":2.5}, + {"label":"@", "x":11.5, "y":2.5}, + {"label":"[", "x":12.5, "y":2.5}, + {"label":"Enter", "x":13.75, "y":2.5, "w":1.25, "h":2}, + {"label":"Delete", "x":15.25, "y":2.5}, + {"label":"End", "x":16.25, "y":2.5}, + {"label":"Page Down", "x":17.25, "y":2.5}, + {"label":"Num 7", "x":18.5, "y":2.5}, + {"label":"Num 8", "x":19.5, "y":2.5}, + {"label":"Num 9", "x":20.5, "y":2.5}, + {"label":"Num +", "x":21.5, "y":2.5, "h":2}, + {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75}, + {"label":"A", "x":1.75, "y":3.5}, + {"label":"S", "x":2.75, "y":3.5}, + {"label":"D", "x":3.75, "y":3.5}, + {"label":"F", "x":4.75, "y":3.5}, + {"label":"G", "x":5.75, "y":3.5}, + {"label":"H", "x":6.75, "y":3.5}, + {"label":"J", "x":7.75, "y":3.5}, + {"label":"K", "x":8.75, "y":3.5}, + {"label":"L", "x":9.75, "y":3.5}, + {"label":";", "x":10.75, "y":3.5}, + {"label":":", "x":11.75, "y":3.5}, + {"label":"]", "x":12.75, "y":3.5}, + {"label":"Num 4", "x":18.5, "y":3.5}, + {"label":"Num 5", "x":19.5, "y":3.5}, + {"label":"Num 6", "x":20.5, "y":3.5}, + {"label":"Shift", "x":0, "y":4.5, "w":2.25}, + {"label":"Z", "x":2.25, "y":4.5}, + {"label":"X", "x":3.25, "y":4.5}, + {"label":"C", "x":4.25, "y":4.5}, + {"label":"V", "x":5.25, "y":4.5}, + {"label":"B", "x":6.25, "y":4.5}, + {"label":"N", "x":7.25, "y":4.5}, + {"label":"M", "x":8.25, "y":4.5}, + {"label":",", "x":9.25, "y":4.5}, + {"label":".", "x":10.25, "y":4.5}, + {"label":"/", "x":11.25, "y":4.5}, + {"label":"JIS \\", "x":12.25, "y":4.5}, + {"label":"Shift", "x":13.25, "y":4.5, "w":1.75}, + {"label":"Up", "x":16.25, "y":4.5}, + {"label":"Num 1", "x":18.5, "y":4.5}, + {"label":"Num 2", "x":19.5, "y":4.5}, + {"label":"Num 3", "x":20.5, "y":4.5}, + {"label":"Num Enter", "x":21.5, "y":4.5, "h":2}, + {"label":"Ctrl", "x":0, "y":5.5, "w":1.25}, + {"label":"GUI", "x":1.25, "y":5.5, "w":1.25}, + {"label":"Alt", "x":2.5, "y":5.5, "w":1.25}, + {"label":"JIS Muhenkan", "x":3.75, "y":5.5, "w":1.25}, + {"label":"Space", "x":5, "y":5.5, "w":2.5}, + {"label":"JIS Henkan", "x":7.5, "y":5.5, "w":1.25}, + {"label":"JIS Hiragana / Katakana", "x":8.75, "y":5.5, "w":1.25}, + {"label":"Alt", "x":10, "y":5.5, "w":1.25}, + {"label":"GUI", "x":11.25, "y":5.5, "w":1.25}, + {"label":"Menu", "x":12.5, "y":5.5, "w":1.25}, + {"label":"Ctrl", "x":13.75, "y":5.5, "w":1.25}, + {"label":"Left", "x":15.25, "y":5.5}, + {"label":"Down", "x":16.25, "y":5.5}, + {"label":"Right", "x":17.25, "y":5.5}, + {"label":"Num 0", "x":18.5, "y":5.5, "w":2}, + {"label":"Num .", "x":20.5, "y":5.5} + ] + } + } +} diff --git a/keyboards/converter/usb_usb/keymaps/ble/keymap.c b/keyboards/converter/usb_usb/keymaps/ble/keymap.c index 094bd9569..190b3319f 100644 --- a/keyboards/converter/usb_usb/keymaps/ble/keymap.c +++ b/keyboards/converter/usb_usb/keymaps/ble/keymap.c @@ -15,7 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#include "usb_usb.h" +#include QMK_KEYBOARD_H const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { /* 0: plain Qwerty without layer switching @@ -36,9 +36,9 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { * |Ctl|Gui|Alt|MHEN|HNJ| Space |H/E|HENK|KANA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0 | .|Ent| |Fnd|Cut| * `-----------------------------------------------------------' `-----------' `---------------' `-------' */ - [0] = KEYMAP_ALL( + [0] = LAYOUT_all( KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, - KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, KC_VOLD, KC_VOLU, KC_MUTE, KC_PWR, KC_HELP, + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, KC_VOLD, KC_VOLU, KC_MUTE, KC_PWR, KC_HELP, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_JYEN, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, KC_STOP, KC_AGIN, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, KC_PPLS, KC_MENU, KC_UNDO, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PCMM, KC_SLCT, KC_COPY, @@ -47,18 +47,6 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { ), }; -const uint16_t PROGMEM fn_actions[] = { - -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { - switch(id) { - default: - return MACRO_NONE; - } -}; - - void matrix_init_user(void) { } diff --git a/keyboards/converter/usb_usb/keymaps/coloneljesus/keymap.c b/keyboards/converter/usb_usb/keymaps/coloneljesus/keymap.c index 0cc66fd53..6dfd1ad79 100644 --- a/keyboards/converter/usb_usb/keymaps/coloneljesus/keymap.c +++ b/keyboards/converter/usb_usb/keymaps/coloneljesus/keymap.c @@ -15,7 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#include "usb_usb.h" +#include QMK_KEYBOARD_H const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { /* 0: plain Qwerty without layer switching @@ -36,7 +36,7 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { * |Ctl|Gui|Alt|MHEN|HNJ| Space |H/E|HENK|KANA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0 | .|Ent| |Fnd|Cut| * `-----------------------------------------------------------' `-----------' `---------------' `-------' */ - // KEYMAP_ALL( + // LAYOUT_all( // F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, // ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, VOLD,VOLU,MUTE,PWR, HELP, // GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, JYEN,BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, STOP,AGIN, @@ -45,17 +45,17 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { // LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RO, RSFT, UP, P1, P2, P3, PEQL, EXEC,PSTE, // LCTL,LGUI,LALT,MHEN,HANJ, SPC, HAEN,HENK,KANA,RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT, FIND,CUT // ), - KEYMAP_ALL( + LAYOUT_all( KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, - KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, KC_VOLD, KC_VOLU, KC_MUTE, KC_PWR, KC_HELP, + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, KC_VOLD, KC_VOLU, KC_MUTE, KC_PWR, KC_HELP, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_JYEN, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, KC_STOP, KC_AGIN, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, KC_PPLS, KC_MENU, KC_UNDO, MO(1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PCMM, KC_SLCT, KC_COPY, KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PEQL, KC_EXEC, KC_PSTE, KC_LCTL, KC_LGUI, KC_LALT, KC_MHEN, KC_HANJ, KC_SPC, KC_HAEN, KC_HENK, KC_KANA, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT, KC_FIND, KC_CUT ), - KEYMAP_ALL( - ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, + LAYOUT_all( + ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______,______,______, ______,______,______,______, ______, KC_GRV, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______,______,______, ______,______,______,______, ______,______, KC_CAPS, KC_MPRV, KC_VOLU, KC_MNXT, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______,______,______, ______,______,______,______, ______,______, @@ -65,18 +65,6 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { ), }; -const uint16_t PROGMEM fn_actions[] = { - -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { - switch(id) { - default: - return MACRO_NONE; - } -}; - - void matrix_init_user(void) { } @@ -113,7 +101,7 @@ void led_set_user(uint8_t usb_led) { * |Ctl|Gui|Alt| Space |Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0| .|Ent| * `-----------------------------------------------------------' `-----------' `---------------' */ - KEYMAP( + LAYOUT_ansi( ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, DEL, END, PGDN, P7, P8, P9, @@ -138,13 +126,13 @@ void led_set_user(uint8_t usb_led) { * |Ctl|Gui|Alt| Space |HNK|KNA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0| .| | * `-----------------------------------------------------------' `-----------' `---------------' */ - KEYMAP_ISO( + LAYOUT_iso( ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,ENT, DEL, END, PGDN, P7, P8, P9, PPLS, LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT,NUHS, P4, P5, P6, LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT, UP, P1, P2, P3, PENT, - LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT + LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT ), /* JIS layout @@ -163,13 +151,13 @@ void led_set_user(uint8_t usb_led) { * |Ctl|Gui|Alt|MHEN| Space |HENK|KNA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0| .| | * `-----------------------------------------------------------' `-----------' `---------------' */ - KEYMAP_JIS( + LAYOUT_jis( ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, JPY, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, ENT, DEL, END, PGDN, P7, P8, P9, PPLS, LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT,NUHS, P4, P5, P6, LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RO, RSFT, UP, P1, P2, P3, PENT, - LCTL,LGUI,LALT,MHEN, SPC, HENK,KANA,RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT + LCTL,LGUI,LALT,MHEN, SPC, HENK,KANA,RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT ), /* Colemak http://colemak.com @@ -185,7 +173,7 @@ void led_set_user(uint8_t usb_led) { * |Ctrl |Gui |Alt | Space |Alt |Gui |Menu|Ctrl| * `----------------------------------------------------------' */ - KEYMAP_ALL( + LAYOUT_all( F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, VOLD,VOLU,MUTE,PWR, HELP, GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, JYEN,BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, STOP,AGIN, @@ -208,7 +196,7 @@ void led_set_user(uint8_t usb_led) { * |Ctrl |Gui |Alt | Space |Alt |Gui |Menu|Ctrl| * `-----------------------------------------------------------' */ - KEYMAP_ALL( + LAYOUT_all( F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, VOLD,VOLU,MUTE,PWR, HELP, GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, LBRC,RBRC,JYEN,BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, STOP,AGIN, @@ -231,7 +219,7 @@ void led_set_user(uint8_t usb_led) { * |Ctrl |Gui |Alt | Space |Alt |Gui |Menu|Ctrl| * `-----------------------------------------------------------' */ - KEYMAP_ALL( + LAYOUT_all( F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, VOLD,VOLU,MUTE,PWR, HELP, GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, JYEN,BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, STOP,AGIN, @@ -265,7 +253,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |Ctl|Gui|Alt|MHEN|HNJ| Space |H/E|HENK|KANA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0 | .|Ent| |Fnd|Cut| * `-----------------------------------------------------------' `-----------' `---------------' `-------' */ - [0] = KEYMAP_ALL( + [0] = LAYOUT_all( F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, VOLD,VOLU,MUTE,PWR, HELP, ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, JYEN,BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, STOP,AGIN, @@ -288,7 +276,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | * `-----------------------------------------------------------' */ - [1] = KEYMAP_ALL( + [1] = LAYOUT_all( TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, TRNS, GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS,DEL, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS, diff --git a/keyboards/converter/usb_usb/keymaps/default/keymap.c b/keyboards/converter/usb_usb/keymaps/default/keymap.c index 9817a607d..170ed31ef 100644 --- a/keyboards/converter/usb_usb/keymaps/default/keymap.c +++ b/keyboards/converter/usb_usb/keymaps/default/keymap.c @@ -15,7 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#include "usb_usb.h" +#include QMK_KEYBOARD_H const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { /* 0: plain Qwerty without layer switching @@ -36,17 +36,17 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { * |Ctl|Gui|Alt|MHEN|HNJ| Space |H/E|HENK|KANA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0 | .|Ent| |Fnd|Cut| * `-----------------------------------------------------------' `-----------' `---------------' `-------' */ - [0] = KEYMAP_ALL( + [0] = LAYOUT_all( KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, - KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, KC_VOLD, KC_VOLU, KC_MUTE, KC_PWR, KC_HELP, + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, KC_VOLD, KC_VOLU, KC_MUTE, KC_PWR, KC_HELP, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_JYEN, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, KC_STOP, KC_AGIN, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, KC_PPLS, KC_MENU, KC_UNDO, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PCMM, KC_SLCT, KC_COPY, KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PEQL, KC_EXEC, KC_PSTE, KC_LCTL, KC_LGUI, KC_LALT, KC_MHEN, KC_HANJ, KC_SPC, KC_HAEN, KC_HENK, KC_KANA, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT, KC_FIND, KC_CUT ), - [1] = KEYMAP_ALL( - ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, + [1] = LAYOUT_all( + ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______,______,______, ______,______,______,______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______,______,______, ______,______,______,______, ______,______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______,______,______, ______,______,______,______, ______,______, @@ -56,18 +56,6 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { ), }; -const uint16_t PROGMEM fn_actions[] = { - -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { - switch(id) { - default: - return MACRO_NONE; - } -}; - - void matrix_init_user(void) { } diff --git a/keyboards/converter/usb_usb/usb_usb.h b/keyboards/converter/usb_usb/usb_usb.h index c31fae1d0..e0c7c9c0d 100644 --- a/keyboards/converter/usb_usb/usb_usb.h +++ b/keyboards/converter/usb_usb/usb_usb.h @@ -62,7 +62,7 @@ along with this program. If not, see . * * TODO: use same keycode to pass through instead of KC_NO? */ -#define KEYMAP_ALL( \ +#define LAYOUT_all( \ K68,K69,K6A,K6B,K6C,K6D,K6E,K6F,K70,K71,K72,K73, \ K29, K3A,K3B,K3C,K3D,K3E,K3F,K40,K41,K42,K43,K44,K45, K46,K47,K48, K81,K80,K7F,K66, K75, \ K35,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K2D,K2E,K89,K2A, K49,K4A,K4B, K53,K54,K55,K56, K78,K79, \ @@ -120,21 +120,21 @@ along with this program. If not, see . * |Ctl|Gui|Alt| Space |Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0| .|Ent| * `-----------------------------------------------------------' `-----------' `---------------' */ -#define KEYMAP( \ +#define LAYOUT_ansi( \ K29,K3A,K3B,K3C,K3D,K3E,K3F,K40,K41,K42,K43,K44,K45, K46,K47,K48, \ K35,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K2D,K2E,K2A, K49,K4A,K4B, K53,K54,K55,K56, \ K2B,K14,K1A,K08,K15,K17,K1C,K18,K0C,K12,K13,K2F,K30,K31, K4C,K4D,K4E, K5F,K60,K61, \ K39,K04,K16,K07,K09,K0A,K0B,K0D,K0E,K0F,K33,K34, K28, K5C,K5D,K5E,K57, \ KE1,K1D,K1B,K06,K19,K05,K11,K10,K36,K37,K38, KE5, K52, K59,K5A,K5B, \ KE0,KE3,KE2, K2C, KE6,KE7,K65,KE4, K50,K51,K4F, K62, K63,K58 \ -) KEYMAP_ALL( \ - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ - K29, K3A,K3B,K3C,K3D,K3E,K3F,K40,K41,K42,K43,K44,K45, K46,K47,K48, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ - K35,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K2D,K2E,KC_NO, K2A, K49,K4A,K4B, K53,K54,K55,K56, KC_NO, KC_NO, \ - K2B,K14,K1A,K08,K15,K17,K1C,K18,K0C,K12,K13,K2F,K30, K31, K4C,K4D,K4E, K5F,K60,K61,K57, KC_NO, KC_NO, \ - K39,K04,K16,K07,K09,K0A,K0B,K0D,K0E,K0F,K33,K34, KC_NO, K28, K5C,K5D,K5E,KC_NO, KC_NO, KC_NO, \ - KE1,KC_NO, K1D,K1B,K06,K19,K05,K11,K10,K36,K37,K38, KC_NO, KE5, K52, K59,K5A,K5B,KC_NO, KC_NO, KC_NO, \ - KE0,KE3,KE2,KC_NO, KC_NO, K2C, KC_NO, KC_NO, KC_NO, KE6,KE7,K65,KE4, K50,K51,K4F, K62, K63,K58, KC_NO, KC_NO \ +) LAYOUT_all( \ + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ + K29, K3A, K3B, K3C, K3D, K3E, K3F, K40, K41, K42, K43, K44, K45, K46, K47, K48, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ + K35, K1E, K1F, K20, K21, K22, K23, K24, K25, K26, K27, K2D, K2E, KC_NO, K2A, K49, K4A, K4B, K53, K54, K55, K56, KC_NO, KC_NO, \ + K2B, K14, K1A, K08, K15, K17, K1C, K18, K0C, K12, K13, K2F, K30, K31, K4C, K4D, K4E, K5F, K60, K61, K57, KC_NO, KC_NO, \ + K39, K04, K16, K07, K09, K0A, K0B, K0D, K0E, K0F, K33, K34, KC_NO, K28, K5C, K5D, K5E, KC_NO, KC_NO, KC_NO, \ + KE1, KC_NO, K1D, K1B, K06, K19, K05, K11, K10, K36, K37, K38, KC_NO, KE5, K52, K59, K5A, K5B, KC_NO, KC_NO, KC_NO, \ + KE0, KE3, KE2, KC_NO, KC_NO, K2C, KC_NO, KC_NO, KC_NO, KE6, KE7, K65, KE4, K50, K51, K4F, K62, K63, K58, KC_NO, KC_NO \ ) /* ,---. ,---------------. ,---------------. ,---------------. ,-----------. @@ -152,21 +152,21 @@ along with this program. If not, see . * |Ctl|Gui|Alt| Space |Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0| .| | * `-----------------------------------------------------------' `-----------' `---------------' */ -#define KEYMAP_ISO( \ +#define LAYOUT_iso( \ K29, K3A,K3B,K3C,K3D,K3E,K3F,K40,K41,K42,K43,K44,K45, K46,K47,K48, \ K35,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K2D,K2E,K2A, K49,K4A,K4B, K53,K54,K55,K56, \ K2B,K14,K1A,K08,K15,K17,K1C,K18,K0C,K12,K13,K2F,K30,K28, K4C,K4D,K4E, K5F,K60,K61,K57, \ K39,K04,K16,K07,K09,K0A,K0B,K0D,K0E,K0F,K33,K34,K32, K5C,K5D,K5E, \ KE1,K64,K1D,K1B,K06,K19,K05,K11,K10,K36,K37,K38, KE5, K52, K59,K5A,K5B,K58, \ KE0,KE3,KE2, K2C, KE6,KE7,K65,KE4, K50,K51,K4F, K62, K63 \ -) KEYMAP_ALL( \ - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ - K29, K3A,K3B,K3C,K3D,K3E,K3F,K40,K41,K42,K43,K44,K45, K46,K47,K48, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ - K35,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K2D,K2E,KC_NO, K2A, K49,K4A,K4B, K53,K54,K55,K56, KC_NO, KC_NO, \ - K2B,K14,K1A,K08,K15,K17,K1C,K18,K0C,K12,K13,K2F,K30, K32, K4C,K4D,K4E, K5F,K60,K61,K57, KC_NO, KC_NO, \ - K39,K04,K16,K07,K09,K0A,K0B,K0D,K0E,K0F,K33,K34, K32,K28, K5C,K5D,K5E,KC_NO, KC_NO, KC_NO, \ - KE1,K64,K1D,K1B,K06,K19,K05,K11,K10,K36,K37,K38, KC_NO, KE5, K52, K59,K5A,K5B,KC_NO, KC_NO, KC_NO, \ - KE0,KE3,KE2,KC_NO, KC_NO, K2C, KC_NO, KC_NO, KC_NO, KE6,KE7,K65,KE4, K50,K51,K4F, K62, K63,K58, KC_NO, KC_NO \ +) LAYOUT_all( \ + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ + K29, K3A, K3B, K3C, K3D, K3E, K3F, K40, K41, K42, K43, K44, K45, K46, K47, K48, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ + K35, K1E, K1F, K20, K21, K22, K23, K24, K25, K26, K27, K2D, K2E, KC_NO, K2A, K49, K4A, K4B, K53, K54, K55, K56, KC_NO, KC_NO, \ + K2B, K14, K1A, K08, K15, K17, K1C, K18, K0C, K12, K13, K2F, K30, K32, K4C, K4D, K4E, K5F, K60, K61, K57, KC_NO, KC_NO, \ + K39, K04, K16, K07, K09, K0A, K0B, K0D, K0E, K0F, K33, K34, K32, K28, K5C, K5D, K5E, KC_NO, KC_NO, KC_NO, \ + KE1, K64, K1D, K1B, K06, K19, K05, K11, K10, K36, K37, K38, KC_NO, KE5, K52, K59, K5A, K5B, KC_NO, KC_NO, KC_NO, \ + KE0, KE3, KE2, KC_NO, KC_NO, K2C, KC_NO, KC_NO, KC_NO, KE6, KE7, K65, KE4, K50, K51, K4F, K62, K63, K58, KC_NO, KC_NO \ ) /* ,---. ,---------------. ,---------------. ,---------------. ,-----------. @@ -184,20 +184,20 @@ along with this program. If not, see . * |Ctl|Gui|Alt|MHEN| Space |HENK|KNA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0| .| | * `-----------------------------------------------------------' `-----------' `---------------' */ -#define KEYMAP_JIS( \ +#define LAYOUT_jis( \ K29, K3A,K3B,K3C,K3D,K3E,K3F,K40,K41,K42,K43,K44,K45, K46,K47,K48, \ K35,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K2D,K2E,K89,K2A, K49,K4A,K4B, K53,K54,K55,K56, \ K2B,K14,K1A,K08,K15,K17,K1C,K18,K0C,K12,K13,K2F,K30, K28, K4C,K4D,K4E, K5F,K60,K61,K57, \ K39,K04,K16,K07,K09,K0A,K0B,K0D,K0E,K0F,K33,K34,K32, K5C,K5D,K5E, \ KE1,K1D,K1B,K06,K19,K05,K11,K10,K36,K37,K38, K87,KE5, K52, K59,K5A,K5B,K58, \ KE0,KE3,KE2,K8B, K2C, K8A,K88,KE6,KE7,K65,KE4, K50,K51,K4F, K62, K63 \ -) KEYMAP_ALL( \ - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ - K29, K3A,K3B,K3C,K3D,K3E,K3F,K40,K41,K42,K43,K44,K45, K46,K47,K48, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ - K35,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K2D,K2E,K89,K2A, K49,K4A,K4B, K53,K54,K55,K56, KC_NO, KC_NO, \ - K2B,K14,K1A,K08,K15,K17,K1C,K18,K0C,K12,K13,K2F,K30, K32, K4C,K4D,K4E, K5F,K60,K61,K57, KC_NO, KC_NO, \ - K39,K04,K16,K07,K09,K0A,K0B,K0D,K0E,K0F,K33,K34, K32,K28, K5C,K5D,K5E,KC_NO, KC_NO, KC_NO, \ - KE1,KC_NO, K1D,K1B,K06,K19,K05,K11,K10,K36,K37,K38, K87,KE5, K52, K59,K5A,K5B,KC_NO, KC_NO, KC_NO, \ - KE0,KE3,KE2,K8B,KC_NO, K2C, KC_NO, K8A,K88,KE6,KE7,K65,KE4, K50,K51,K4F, K62, K63,K58, KC_NO, KC_NO \ +) LAYOUT_all( \ + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ + K29, K3A, K3B, K3C, K3D, K3E, K3F, K40, K41, K42, K43, K44, K45, K46, K47, K48, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ + K35, K1E, K1F, K20, K21, K22, K23, K24, K25, K26, K27, K2D, K2E, K89, K2A, K49, K4A, K4B, K53, K54, K55, K56, KC_NO, KC_NO, \ + K2B, K14, K1A, K08, K15, K17, K1C, K18, K0C, K12, K13, K2F, K30, K32, K4C, K4D, K4E, K5F, K60, K61, K57, KC_NO, KC_NO, \ + K39, K04, K16, K07, K09, K0A, K0B, K0D, K0E, K0F, K33, K34, K32, K28, K5C, K5D, K5E, KC_NO, KC_NO, KC_NO, \ + KE1, KC_NO, K1D, K1B, K06, K19, K05, K11, K10, K36, K37, K38, K87, KE5, K52, K59, K5A, K5B, KC_NO, KC_NO, KC_NO, \ + KE0, KE3, KE2, K8B, KC_NO, K2C, KC_NO, K8A, K88, KE6, KE7, K65, KE4, K50, K51, K4F, K62, K63, K58, KC_NO, KC_NO \ ) #endif From 3946ea21413b56ad50e55482ff5c43b576adc1d7 Mon Sep 17 00:00:00 2001 From: TurboMech <32869044+TurboMech@users.noreply.github.com> Date: Sun, 4 Nov 2018 10:39:58 -0500 Subject: [PATCH 449/788] Keyboard: adding Espectro (#4343) * added Espectro Added Espectro keyboard from MechKeys.ca * Update keyboards/espectro/config.h Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/config.h Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/config.h Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/espectro.c Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/espectro.c Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/espectro.c Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/espectro.c Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/espectro.c Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/espectro.h Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/espectro.h Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/espectro.h Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/keymaps/default/keymap.c Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/keymaps/default/keymap.c Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/keymaps/mac/config.h Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/keymaps/mac/config.h Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/keymaps/mac/config.h Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/keymaps/mac/config.h Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/keymaps/mac/keymap.c Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/keymaps/mac/keymap.c Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/keymaps/mac/keymap.c Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/keymaps/mac/keymap.c Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/keymaps/mac/keymap.c Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/keymaps/mac/keymap.c Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/keymaps/mac/keymap.c Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/keymaps/mac/keymap.c Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/keymaps/mac/keymap.c Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/keymaps/mac/keymap.c Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/readme.md Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/readme.md Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/readme.md Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/readme.md Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/rules.mk Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/rules.mk Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/rules.mk Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/rules.mk Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/rules.mk Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/rules.mk Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/rules.mk Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/rules.mk Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/rules.mk Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/rules.mk Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/rules.mk Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * fixing Espectro pull request * fixing macros in mac keymap --- keyboards/espectro/config.h | 70 ++++++++ keyboards/espectro/espectro.c | 76 +++++++++ keyboards/espectro/espectro.h | 91 +++++++++++ keyboards/espectro/keymaps/default/keymap.c | 89 +++++++++++ keyboards/espectro/keymaps/mac/config.h | 22 +++ keyboards/espectro/keymaps/mac/keymap.c | 167 ++++++++++++++++++++ keyboards/espectro/keymaps/mac/readme.md | 56 +++++++ keyboards/espectro/readme.md | 15 ++ keyboards/espectro/rules.mk | 61 +++++++ 9 files changed, 647 insertions(+) create mode 100755 keyboards/espectro/config.h create mode 100755 keyboards/espectro/espectro.c create mode 100755 keyboards/espectro/espectro.h create mode 100755 keyboards/espectro/keymaps/default/keymap.c create mode 100644 keyboards/espectro/keymaps/mac/config.h create mode 100644 keyboards/espectro/keymaps/mac/keymap.c create mode 100644 keyboards/espectro/keymaps/mac/readme.md create mode 100644 keyboards/espectro/readme.md create mode 100755 keyboards/espectro/rules.mk diff --git a/keyboards/espectro/config.h b/keyboards/espectro/config.h new file mode 100755 index 000000000..34852df43 --- /dev/null +++ b/keyboards/espectro/config.h @@ -0,0 +1,70 @@ +/* Copyright 2018 @TurboMech /u/TurboMech @A9entOran9e#6134 + * + * 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 . + */ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0xCA96 +#define DEVICE_VER 0x0001 +#define MANUFACTURER MECHKEYS +#define PRODUCT Espectro +#define DESCRIPTION 96% keyboard + +/* key matrix size */ +#define MATRIX_ROWS 8 +#define MATRIX_COLS 13 + +/* key matrix pins */ +#define MATRIX_ROW_PINS { B7, B3, E6, F0, D5, D4, D6, C7 } +#define MATRIX_COL_PINS { C6, F1, F4, F5, F6, F7, D7, B4, B5, D0, D1, D2, D3} +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* number of backlight levels */ +#define BACKLIGHT_PIN B6 +#define BACKLIGHT_LEVELS 5 + + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCING_DELAY 5 + +/* 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 + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +#define RGB_DI_PIN E2 +#ifdef RGB_DI_PIN +#define RGBLED_NUM 16 +#define RGBLIGHT_HUE_STEP 10 +#define RGBLIGHT_SAT_STEP 10 +#define RGBLIGHT_VAL_STEP 10 + +#define RGBLIGHT_ANIMATIONS + +#endif + diff --git a/keyboards/espectro/espectro.c b/keyboards/espectro/espectro.c new file mode 100755 index 000000000..13030cdd4 --- /dev/null +++ b/keyboards/espectro/espectro.c @@ -0,0 +1,76 @@ +/* Copyright 2018 @TurboMech /u/TurboMech @A9entOran9e#6134 + * + * 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 . + */ + + +#include QMK_KEYBOARD_H +#include "quantum.h" + + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + + led_set_user(usb_led); +} + +__attribute__ ((weak)) +void led_set_user(uint8_t usb_led) { + + if (usb_led & (1 << USB_LED_NUM_LOCK)) { + DDRB |= (1 << 0); PORTB &= ~(1 << 0); + } else { + DDRB &= ~(1 << 0); PORTB &= ~(1 << 0); + } + + if (usb_led & (1 << USB_LED_CAPS_LOCK)) { + DDRB |= (1 << 2); PORTB &= ~(1 << 2); + } else { + DDRB &= ~(1 << 2); PORTB &= ~(1 << 2); + } + + if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { + DDRB |= (1 << 1); PORTB &= ~(1 << 1); + } else { + DDRB &= ~(1 << 1); PORTB &= ~(1 << 1); + } + + if (usb_led & (1 << USB_LED_COMPOSE)) { + + } else { + + } + + if (usb_led & (1 << USB_LED_KANA)) { + + } else { + + } + +} + diff --git a/keyboards/espectro/espectro.h b/keyboards/espectro/espectro.h new file mode 100755 index 000000000..3d6ea466d --- /dev/null +++ b/keyboards/espectro/espectro.h @@ -0,0 +1,91 @@ +/* Copyright 2018 @TurboMech /u/TurboMech @A9entOran9e#6134 + * + * 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 . + */ + + +#ifndef ESPECTRO_H +#define ESPECTRO_H + +#include "quantum.h" + + +//Arrow keys and 1.75u shift +#define LAYOUT_default( \ +K000, K001, K002, K003, K004, K600, K601, K602, K603, K005, K006, K007, K008, K702, K009, K010, K011, K012, K712, \ +K100, K101, K102, K103, K104, K604, K605, K606, K607, K105, K106, K107, K108, K701, K109, K110, K111, K112, \ + K200, K201, K202, K203, K204, K608, K609, K610, K611, K205, K206, K207, K208, K703, K209, K210, K211, K212, \ + K300, K301, K302, K303, K304, K612, K705, K706, K707, K305, K306, K307, K308, K309, K310, K311, \ + K400, K402, K403, K404, K708, K709, K710, K711, K405, K406, K407, K408, K704, K409, K410, K411, K412, \ +K500, K501, K502, K503, K504, K505, K506, K507, K508, K509, K510, K511 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112 }, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212 }, \ + { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO }, \ + { K400, KC_NO, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412 }, \ + { K500, K501, K502, K503, K504, K505, K506, K507, K508, K509, K510, K511, KC_NO }, \ + { K600, K601, K602, K603, K604, K605, K606, K607, K608, K609, K610, K611, K612 }, \ + { KC_NO, K701, K702, K703, K704, K705, K706, K707, K708, K709, K710, K711, K712 }, \ +} + +// Split numpad (enter, 0), split shifts (right, left), split backspace +// This is more of an example of every possible keycode placement +#define LAYOUT_split_shift_and_bs( \ +K000, K001, K002, K003, K004, K600, K601, K602, K603, K005, K006, K007, K008, K702, K009, K010, K011, K012, K712, \ +K100, K101, K102, K103, K104, K604, K605, K606, K607, K105, K106, K107, K108, K700, K701, K109, K110, K111, K112, \ + K200, K201, K202, K203, K204, K608, K609, K610, K611, K205, K206, K207, K208, K703, K209, K210, K211, K212, \ + K300, K301, K302, K303, K304, K612, K705, K706, K707, K305, K306, K307, K308, K309, K310, K311, K312, \ + K400, K401, K402, K403, K404, K708, K709, K710, K711, K405, K406, K407, K408, K704, K409, K410, K411, K412, \ +K500, K501, K502, K503, K504, K505, K506, K507, K508, K509, K510, K511, K512 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112 }, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212 }, \ + { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312 }, \ + { K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412 }, \ + { K500, K501, K502, K503, K504, K505, K506, K507, K508, K509, K510, K511, K512 }, \ + { K600, K601, K602, K603, K604, K605, K606, K607, K608, K609, K610, K611, K612 }, \ + { K701, K701, K702, K703, K704, K705, K706, K707, K708, K709, K710, K711, K712 }, \ +} + + + + +/* +Placement of every possible switch defined below. +x2 means the diode allows two possible positions for the switch + +#define LAYOUT_all( \ +K000, K001, K002, K003, K004, K600, K601, K602, K603, K005, K006, K007, K008, K702, K009, K010, K011, K012, K712, \ +K100, K101, K102, K103, K104, K604, K605, K606, K607, K105, K106, K107, K108, K700, K701x2, K109, K110, K111, K112, \ +K200, K201, K202, K203, K204, K608, K609, K610, K611, K205, K206, K207, K208, K703, K209, K210, K211, K212, \ + K308, K212, \ +K300, K300, K301, K302, K304, K612, K705, K706, K707, K305, K306, K307, K703, K308, K309, K310, K311, K312, \ +K400x2, K401, K402, K403, K404, K708, K709, K710, K711, K405, K406, K407, K408, K408, K704, K409, K410, K411, K412, \ + K412, \ +K500x2, K501x2, K502, K503x3, K504x3, K505x2, K506x2, K507x2, K508x2, K509, K510x2, K511, K512 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112 }, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212 }, \ + { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312 }, \ + { K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412 }, \ + { K500, K501, K502, K503, K504, K505, K506, K507, K508, K509, K510, K511, K512 }, \ + { K600, K601, K602, K603, K604, K605, K606, K607, K608, K609, K610, K611, K612 }, \ + { K700, K701, K702, K703, K704, K705, K706, K707, K708, K709, K710, K711, K712 }, \ +} +*/ + +#endif diff --git a/keyboards/espectro/keymaps/default/keymap.c b/keyboards/espectro/keymaps/default/keymap.c new file mode 100755 index 000000000..aeff733fc --- /dev/null +++ b/keyboards/espectro/keymaps/default/keymap.c @@ -0,0 +1,89 @@ +/* Copyright 2018 @TurboMech /u/TurboMech @A9entOran9e#6134 + * + * 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 . + */ + + +#include QMK_KEYBOARD_H +#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) + +#define _BL 0 //Base layer +#define _FN1 1 //Function layer + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* BL +____________________________________________________________________________________________________________________________________________________________________________ +| | | | | | | | | | | | | | | | | | | | +| ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | P SCN | HOME | END | P UP | P DOWN | DEL | +|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________| +| | | | | | | | | | | | | | BACK | NUM | | | | +| ~` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | _ - | = + | SPACE | LOCK | / | * | - | +|________|________|________|________|________|________|________|________|________|________|________|________|________|_________________|________|________|________|________| +| | | | | | | | | | | | [ | ] | | | | | | +| TAB | Q | W | E | R | T | Y | U | I | O | P | { | } | | \ | 7 | 8 | 9 | | +|____________|________|________|________|________|________|________|________|________|________|________|________|________|_____________|________|________|________| + | +| | | | | | | | | | | ; | ' | | | | | | +| CAPS LOCK | A | S | D | F | G | H | J | K | L | : | " | ENTER | 4 | 5 | 6 | | +|______________|________|________|________|________|________|________|________|________|________|________|________|____________________|________|________|________|________| +| | | | | | | | | , | . | / | | | | | | | +| SHIFT | Z | X | C | V | B | N | M | < | > | ? | SHIFT | UP | 1 | 2 | 3 | | +|__________________|________|________|________|________|________|________|________|________|________|________|________________|________|________|________|________| ENTER | +| | | | | | | MO | | | | | | | +| CTRL | LGUI | L ALT | SPACE | R ALT | R CTRL | _FN | LEFT | DOWN | RIGHT | 0 | . | | +|__________|__________|__________|________________________________________________________|________|________|________|________|________|________|________|________|________| + */ + + [_BL] = LAYOUT_default( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_PSCR, KC_SLCK, KC_PAUS, KC_PGUP, KC_PGDN, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PPLS, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, + KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, MO(1), KC_LEFT, KC_DOWN, KC_RIGHT, KC_P0, KC_PDOT + ), + +/* FN_1 +____________________________________________________________________________________________________________________________________________________________________________ +| | | | | | | | | | | | | | | VOL | VOL | NEXT | | | +| RESET | | | | | | | | | | | | | MUTE | DOWN | UP | TRACK | HOME | END | +|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________| +| | RGB | RGB | RGB | RGB | RGB | RGB | RGB | RGB | | | | | | | | | | +| | TOGGLE | MODE |INCREASE|DECREASE| HUE | HUE | SAT | | | | | | DELETE | | | | | +|________|________|________|________|________|INCREASE|DECREASE|INCREASE|DECREASE|________|________|________|________|_________________|________|________|________|________| +| | BACK | BACK | | | | | | | | | | | | | | | | +| | LIGHT | LIGHT | | | | | | | | | | | | | | | | +|____________| TOGGLE |INCREASE|DECREASE|________|________|________|________|________|________|________|________|________|_____________|________|________|________| | +| | | | | | | | | | | | | | | | | | +| | | | | | | | | | | | | | | | | | +|______________|________|________|________|________|________|________|________|________|________|________|________|____________________|________|________|________|________| +| | | | | | | | | | | | | | | | | | +| | | | | | | | | | | | | | | | | | +|__________________|________|________|________|________|________|________|________|________|________|________|________________|________|________|________|________| | +| | | | | | | | | | | | | | +| | | | | | | | | | | | | | +|__________|__________|__________|________________________________________________________|________|________|________|________|________|________|________|________|________| + */ + + [_FN1] = LAYOUT_default( + RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, KC_MNXT, KC_HOME, KC_END, + _______, RGB_TOG, RGB_MOD, RGB_VAI, RGB_VAD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, _______, _______, _______, _______, KC_DEL, _______, _______, _______, _______, + _______, BL_TOGG, BL_INC, BL_DEC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + +}; + diff --git a/keyboards/espectro/keymaps/mac/config.h b/keyboards/espectro/keymaps/mac/config.h new file mode 100644 index 000000000..a18495221 --- /dev/null +++ b/keyboards/espectro/keymaps/mac/config.h @@ -0,0 +1,22 @@ +/* Copyright 2018 @TurboMech /u/TurboMech @A9entOran9e#6134 + * + * 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 . + */ + +#pragma once + +#define TAPPING_TOGGLE 2 + +// place overrides here + diff --git a/keyboards/espectro/keymaps/mac/keymap.c b/keyboards/espectro/keymaps/mac/keymap.c new file mode 100644 index 000000000..4b72ff0aa --- /dev/null +++ b/keyboards/espectro/keymaps/mac/keymap.c @@ -0,0 +1,167 @@ +/* Copyright 2018 @TurboMech /u/TurboMech @A9entOran9e#6134 + * + * 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 . + */ + + +#include QMK_KEYBOARD_H + +#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) + +#define _QWERTY 0 //BASE layer +#define _FUNCTION 1 //Function layer +#define _WINDOWS 2 //Windows layer + +enum custom_keycodes { + PLACEHOLDER = SAFE_RANGE, // can always be here + EXPOSE, // Expose (LCTRL + UP) + LAUNCH, + DOCK, + SCRCAP, + CS1, + CS2, + QALL +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Base Layer +____________________________________________________________________________________________________________________________________________________________________________ +| | SCREEN | SCREEN | | |SHOW | TOGGLE |SCREEN |CUSTOM |CUSTOM |PREVIOUS| PLAY/ | NEXT | | | | | | | +| ESC |BRIGHTEN| DIM | EXPOSE |LAUNCHPA|DESKTOP | DOCK |CAPTURE |SHORTCUT|SHORTCUT| TRACK | PAUSE | TRACK | MUTE | VOL DN | VOL UP | PG UP |PG DOWN | POWER | +|________|________|________|________|________|________|________|________|___1____|___2____|________|________|________|________|________|________|________|________|________| +| | | | | | | | | | | | | | BACK | | | | | +| ~` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | _ - | = + | SPACE | DELETE | / | * | - | +|________|________|________|________|________|________|________|________|________|________|________|________|________|_________________|________|________|________|________| +| | | | | | | | | | | | [ | ] | | | | | | +| TAB | Q | W | E | R | T | Y | U | I | O | P | { | } | | \ | 7 | 8 | 9 | | +|____________|________|________|________|________|________|________|________|________|________|________|________|________|_____________|________|________|________| + | +| | | | | | | | | | | ; | ' | | | | | | +| CAPS LOCK | A | S | D | F | G | H | J | K | L | : | " | ENTER | 4 | 5 | 6 | | +|______________|________|________|________|________|________|________|________|________|________|________|________|____________________|________|________|________|________| +| | | | | | | | | , | . | / | | | | | | | +| SHIFT | Z | X | C | V | B | N | M | < | > | ? | SHIFT | UP | 1 | 2 | 3 | | +|__________________|________|________|________|________|________|________|________|________|________|________|________________|________|________|________|________| ENTER | +| | | | | | | TT | | | | | | | +| CTRL | L ALT | L GUI | SPACE | R GUI | R CTRL | _FN | LEFT | DOWN | RIGHT | 0 | . | | +|__________|__________| COMMAND |________________________________________________________|COMMAND |________|________|________|________|________|________|________|________| + */ + + [_QWERTY] = LAYOUT_default( + KC_ESC, KC_F14, KC_F15, EXPOSE, LAUNCH, KC_F11, DOCK, SCRCAP, CS1, CS2, KC_MRWD, KC_MPLY, KC_MFFD, KC_MUTE, KC_VOLD, KC_VOLU, KC_PGUP, KC_PGDN, KC_POWER, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, KC_PSLS, KC_PAST, KC_PMNS, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PPLS, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, + KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RCTL, TT(1), KC_LEFT, KC_DOWN, KC_RIGHT, KC_P0, KC_PDOT + ), +/* FN1 - SEE readme.md +____________________________________________________________________________________________________________________________________________________________________________ +| | | | | | | | | | | | | | | | | | | | +| QUIT | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | | | | HOME | END | RESET | +|_ALL____|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________| +| | RGB | RGB | RGB | RGB | RGB | RGB | RGB | RGB | | | | | | | | | | +| | TOGGLE | MODE |INCREASE|DECREASE| HUE | HUE | SAT | | | | | | DELETE | | | | | +|________|________|________|________|________|INCREASE|DECREASE|INCREASE|DECREASE|________|________|________|________|_________________|________|________|________|________| +| | BACK | BACK | | | | | | | | | | | | | | | | +| | LIGHT | LIGHT | | | | | | | | | | | | | | | | +|____________| TOGGLE |INCREASE|DECREASE|________|________|________|________|________|________|________|________|________|_____________|________|________|________| | +| | | | | | | | | | | | | | | | | | +| | | | | | | | | | | | | | | | | | +|______________|________|________|________|________|________|________|________|________|________|________|________|____________________|________|________|________|________| +| | | | | | | | | | | | | | | | | | +| | | | | | | | | | | | | | | | | | +|__________________|________|________|________|________|________|________|________|________|________|________|________________|________|________|________|________| | +| | | | | | | | | | | | | | +| | | | | | | | | | | | | | +|__________|__________|__________|________________________________________________________|________|________|________|________|________|________|________|________|________| + */ + + + [_FUNCTION] = LAYOUT_default( + QALL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, KC_HOME, KC_END, RESET, + _______, RGB_TOG, RGB_MOD, RGB_VAI, RGB_VAD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, _______, _______, _______, _______, KC_DEL, _______, _______, _______, _______, + _______, BL_TOGG, BL_INC, BL_DEC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, TO(2), _______, _______, _______, _______, _______, _______ + + ), + +/* Windows layer +____________________________________________________________________________________________________________________________________________________________________________ +| | | | | | | | | | | | | | | | | | | | +| ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | DELETE | HOME | END | P UP | P DOWN | MENU | +|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________| +| | | | | | | | | | | | | | BACK | NUM | | | | +| ~` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | _ - | = + | SPACE | LOCK | / | * | - | +|________|________|________|________|________|________|________|________|________|________|________|________|________|_________________|________|________|________|________| +| | | | | | | | | | | | [ | ] | | | | | | +| TAB | Q | W | E | R | T | Y | U | I | O | P | { | } | | \ | 7 | 8 | 9 | | +|____________|________|________|________|________|________|________|________|________|________|________|________|________|_____________|________|________|________| + | +| | | | | | | | | | | ; | ' | | | | | | +| CAPS LOCK | A | S | D | F | G | H | J | K | L | : | " | ENTER | 4 | 5 | 6 | | +|______________|________|________|________|________|________|________|________|________|________|________|________|____________________|________|________|________|________| +| | | | | | | | | , | . | / | | | | | | | +| SHIFT | Z | X | C | V | B | N | M | < | > | ? | SHIFT | UP | 1 | 2 | 3 | | +|__________________|________|________|________|________|________|________|________|________|________|________|________________|________|________|________|________| ENTER | +| | | | | | | TO | | | | | | | +| L GUI | L ALT | L CTL | SPACE | R CTL | R ALT |LAYER 0 | LEFT | DOWN | RIGHT | 0 | . | | +|__________|__________|__________|________________________________________________________|________|________|________|________|________|________|________|________|________| + */ + + + [_WINDOWS] = LAYOUT_default( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_HOME, KC_END, KC_PGUP, KC_PGDN, KC_MENU, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PPLS, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, + KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, + KC_LGUI, KC_LALT, KC_LCTL, KC_SPC, KC_RCTL, KC_RALT, TO(0), KC_LEFT, KC_DOWN, KC_RIGHT, KC_P0, KC_PDOT + ), +}; + + + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (record->event.pressed) { + switch (keycode) { + // dynamically generate these. + case EXPOSE: + SEND_STRING(SS_DOWN(X_LCTRL) SS_TAP(X_UP) SS_UP(X_LCTRL)); + return false; + case LAUNCH: + SEND_STRING(SS_DOWN(X_LCTRL) SS_TAP(X_L) SS_UP(X_LCTRL)); + return false; + case DOCK: + SEND_STRING(SS_DOWN(X_LALT) SS_DOWN(X_LGUI) SS_TAP(X_D) SS_UP(X_LGUI) SS_UP(X_LALT)); + return false; + case SCRCAP: //screen capture + SEND_STRING(SS_DOWN(X_LCTRL) SS_TAP(X_S) SS_UP(X_LCTRL)); + return false; + case CS1: //custom shortcut 1 + SEND_STRING(SS_DOWN(X_LALT) SS_DOWN(X_LGUI) SS_TAP(X_1) SS_UP(X_LGUI) SS_UP(X_LALT)); + return false; + case CS2: //custom shortcut 2 + SEND_STRING(SS_DOWN(X_LALT) SS_DOWN(X_LGUI) SS_TAP(X_2) SS_UP(X_LGUI) SS_UP(X_LALT)); + return false; + case QALL: //quit all applications + SEND_STRING(SS_DOWN(X_LALT) SS_DOWN(X_LGUI) SS_TAP(X_Q) SS_UP(X_LGUI) SS_UP(X_LALT)); + return false; + } + return false; + } + return true; +}; + diff --git a/keyboards/espectro/keymaps/mac/readme.md b/keyboards/espectro/keymaps/mac/readme.md new file mode 100644 index 000000000..fb6226018 --- /dev/null +++ b/keyboards/espectro/keymaps/mac/readme.md @@ -0,0 +1,56 @@ +# This is u/TurboMech's keyboard layout for Espectro. + +## It is designed for Mac OS, due to the specific functions created. + +### Here is the layout found in the keymap.c file. +##### I use shortcuts for the Function row (above number row) listed below + - Scrn Bright Up: F14 + - Scrn Bright Down: F15 + - Expose: LCTRL + Up + - Launchpad: LCTRL + L + - Show Desktop: F11 + - Show/Hide Dock: LALT + LGUI + D + - Screen Capture: LCTRL + S + - Custom Shortcut 1: LCTRL + LGUI + 1 + - Custom Shortcut 2: LCTRL + LGUI + 2 + - use the custom shortcuts for whatever you want: launch an application, a macro, etc. + - Play/Pause: exactly that + - Mute / Volume Up / Volume Down: exactly what it says + - QALL: Quit all applications + + ##### Going down the right side from Vol Down: + - POWER: this serves as the power button on Mac's only. Press and hold the button as you would on your Macbook or iMac keyboard. + - Menu: this slides the notification bar on the right side (its the same as on iPhones/ iPads) + +### See below keymaps for how to setup shortcuts on Mac + +#### Base Layer +``` +Needs updating. +``` +#### Function Layer 1 - See above for shortcuts +``` +Needs updating +``` + +#### How to use/ setup shortcuts on Mac +- First navigate to System Preferences > Keyboard > Shortcuts + - You can use any of them in here + - Just set them to the shortcut keys listed above + +#### How to make your own (to launch applications, quit all, etc.) +- Navigate to Automator > New Document > click Service > Choose +- Now we have to setup our shortcut + - Here's how to setup the Quit All Shortcut + - In the right window select the Service recieves dropdown > select No Input + - At the top left click the Name (Search) > type quit > click and hold Quit All Applications > drag to the right hand box (under the Service Recieves) + - **IMPORTANT** You have to click the Run button at the upper right hand corner in order for these to actually work. + - Now click File > Save > save it as Quit All Apps (or whatever you want) / you can also just exit out and it'll ask you if you want to save +- Navigate back to System Preferences > Keyboard > Shortcuts + - The new shortcut can be found under services, set it to one of the shortcuts I listed above and done +- The same applies for applications in the Name (search) just type the application you want to have as shortcut. Don't forget to run it, then do the same steps + to set it up as a shortcut. + + + + diff --git a/keyboards/espectro/readme.md b/keyboards/espectro/readme.md new file mode 100644 index 000000000..c4c0edc7f --- /dev/null +++ b/keyboards/espectro/readme.md @@ -0,0 +1,15 @@ +# Espectro + +![Espectro](https://cdn.shopify.com/s/files/1/1697/5323/products/IMG_0162_53a5ca83-3ce5-4741-92e8-10f769cf5ee1_1024x1024.jpg?v=1540701787) + +A 96% keyboard made and sold by MECHKEYS [More info on MECHKEYS](https://mechkeys.ca). + +Keyboard Maintainer: [TurboMech](https://github.com/TurboMech) +Hardware Supported: Espectro +Hardware Availability: [MECHKEYS](https://mechkeys.ca) + +Make example for this keyboard (after setting up your build environment): + + make espectro:default + +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). diff --git a/keyboards/espectro/rules.mk b/keyboards/espectro/rules.mk new file mode 100755 index 000000000..2c28fe850 --- /dev/null +++ b/keyboards/espectro/rules.mk @@ -0,0 +1,61 @@ +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Bootloader +# This definition is optional, and if your keyboard supports multiple bootloaders of +# different sizes, comment this out, and the correct address will be loaded +# automatically (+60). See bootloader.mk for all options. +BOOTLOADER = atmel-dfu + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* + + +# Build Options +# comment out to disable the options. +# +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +AUDIO_ENABLE = no +RGBLIGHT_ENABLE = yes From e9fd42df71ebc367fccbbf918a1794498aa57914 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Sun, 4 Nov 2018 09:32:42 -0800 Subject: [PATCH 450/788] converter/adb_usb Configurator support and adb_usb.h cleanup (#4348) * converter/adb_usb: Configurator support Note: LAYOUT_ext_ansi has a blank space between the Spacebar and the Right Alt/Option key when loaded in the Configurator. This is deliberate. Stock Apple Extended Keyboards and AEK IIs send the scan code for Left Command when either Command key is used. (This is noted already in the readme.) That being the case, the Command keys cannot be assigned to different functions. Whichever keycode is placed on Left Command will be used for both Command keys. * converter/adb_usb: adb_usb.h cleanup - replaced KEYMAP_COMMON_H with ADB_USB_H - white space changes for visual alignment in LAYOUT_ext_ansi macro --- keyboards/converter/adb_usb/adb_usb.h | 12 +- keyboards/converter/adb_usb/info.json | 204 ++++++++++++++++++++++++++ 2 files changed, 210 insertions(+), 6 deletions(-) create mode 100644 keyboards/converter/adb_usb/info.json diff --git a/keyboards/converter/adb_usb/adb_usb.h b/keyboards/converter/adb_usb/adb_usb.h index 491db95f1..8691adcc6 100644 --- a/keyboards/converter/adb_usb/adb_usb.h +++ b/keyboards/converter/adb_usb/adb_usb.h @@ -17,8 +17,8 @@ along with this program. If not, see . Ported to QMK by Peter Roe */ -#ifndef KEYMAP_COMMON_H -#define KEYMAP_COMMON_H +#ifndef ADB_USB_H +#define ADB_USB_H #include "quantum.h" @@ -58,10 +58,10 @@ Ported to QMK by Peter Roe { KC_NO, KC_NO, KC_NO, K4B, K4C, KC_NO, K4E, KC_NO, }, \ { KC_NO, KC_NO, K52, K53, K54, K55, K56, K57 }, \ { K58, K59, KC_NO, K5B, K5C, KC_NO, KC_NO, KC_NO, }, \ - { K60, K61, K62, K63, K64, K65, KC_NO, K67 }, \ - { KC_NO, K69, KC_NO, K6B, KC_NO, K6D, KC_NO, K6F }, \ - { KC_NO, K71, K72, K73, K74, K75, K76, K77 }, \ - { K78, K79, K7A, K7B, K7C, K7D, KC_NO, K7F } \ + { K60, K61, K62, K63, K64, K65, KC_NO, K67 }, \ + { KC_NO, K69, KC_NO, K6B, KC_NO, K6D, KC_NO, K6F }, \ + { KC_NO, K71, K72, K73, K74, K75, K76, K77 }, \ + { K78, K79, K7A, K7B, K7C, K7D, KC_NO, K7F } \ } /* M0116 Apple Standard Keyboard ANSI diff --git a/keyboards/converter/adb_usb/info.json b/keyboards/converter/adb_usb/info.json new file mode 100644 index 000000000..e06f9c1ad --- /dev/null +++ b/keyboards/converter/adb_usb/info.json @@ -0,0 +1,204 @@ +{ + "keyboard_name": "ADB to USB Keyboard Converter", + "url": "", + "maintainer": "qmk", + "width": 22.5, + "height": 7, + "layouts": { + "LAYOUT_ext_ansi": { + "layout": [ + {"label":"Escape", "x":0, "y":0}, + {"label":"F1", "x":2, "y":0}, + {"label":"F2", "x":3, "y":0}, + {"label":"F3", "x":4, "y":0}, + {"label":"F4", "x":5, "y":0}, + {"label":"F5", "x":6.5, "y":0}, + {"label":"F6", "x":7.5, "y":0}, + {"label":"F7", "x":8.5, "y":0}, + {"label":"F8", "x":9.5, "y":0}, + {"label":"F9", "x":11, "y":0}, + {"label":"F10", "x":12, "y":0}, + {"label":"F11", "x":13, "y":0}, + {"label":"F12", "x":14, "y":0}, + {"label":"Print Screen", "x":15.25, "y":0}, + {"label":"Scroll Lock", "x":16.25, "y":0}, + {"label":"Pause", "x":17.25, "y":0}, + {"label":"Eject", "x":21.5, "y":0}, + {"label":"`", "x":0, "y":2}, + {"label":"1", "x":1, "y":2}, + {"label":"2", "x":2, "y":2}, + {"label":"3", "x":3, "y":2}, + {"label":"4", "x":4, "y":2}, + {"label":"5", "x":5, "y":2}, + {"label":"6", "x":6, "y":2}, + {"label":"7", "x":7, "y":2}, + {"label":"8", "x":8, "y":2}, + {"label":"9", "x":9, "y":2}, + {"label":"0", "x":10, "y":2}, + {"label":"-", "x":11, "y":2}, + {"label":"=", "x":12, "y":2}, + {"label":"Backspace", "x":13, "y":2, "w":2}, + {"label":"Insert", "x":15.25, "y":2}, + {"label":"Home", "x":16.25, "y":2}, + {"label":"Page Up", "x":17.25, "y":2}, + {"label":"Num Lock", "x":18.5, "y":2}, + {"label":"Num =", "x":19.5, "y":2}, + {"label":"Num /", "x":20.5, "y":2}, + {"label":"Num *", "x":21.5, "y":2}, + {"label":"Tab", "x":0, "y":3, "w":1.5}, + {"label":"Q", "x":1.5, "y":3}, + {"label":"W", "x":2.5, "y":3}, + {"label":"E", "x":3.5, "y":3}, + {"label":"R", "x":4.5, "y":3}, + {"label":"T", "x":5.5, "y":3}, + {"label":"Y", "x":6.5, "y":3}, + {"label":"U", "x":7.5, "y":3}, + {"label":"I", "x":8.5, "y":3}, + {"label":"O", "x":9.5, "y":3}, + {"label":"P", "x":10.5, "y":3}, + {"label":"[", "x":11.5, "y":3}, + {"label":"]", "x":12.5, "y":3}, + {"label":"\\", "x":13.5, "y":3, "w":1.5}, + {"label":"Delete", "x":15.25, "y":3}, + {"label":"End", "x":16.25, "y":3}, + {"label":"Page Down", "x":17.25, "y":3}, + {"label":"Num 7", "x":18.5, "y":3}, + {"label":"Num 8", "x":19.5, "y":3}, + {"label":"Num 9", "x":20.5, "y":3}, + {"label":"Num -", "x":21.5, "y":3}, + {"label":"Lcap", "x":0, "y":4, "w":1.75}, + {"label":"A", "x":1.75, "y":4}, + {"label":"S", "x":2.75, "y":4}, + {"label":"D", "x":3.75, "y":4}, + {"label":"F", "x":4.75, "y":4}, + {"label":"G", "x":5.75, "y":4}, + {"label":"H", "x":6.75, "y":4}, + {"label":"J", "x":7.75, "y":4}, + {"label":"K", "x":8.75, "y":4}, + {"label":"L", "x":9.75, "y":4}, + {"label":";", "x":10.75, "y":4}, + {"label":"\"", "x":11.75, "y":4}, + {"label":"Enter", "x":12.75, "y":4, "w":2.25}, + {"label":"Num 4", "x":18.5, "y":4}, + {"label":"Num 5", "x":19.5, "y":4}, + {"label":"Num 6", "x":20.5, "y":4}, + {"label":"Num +", "x":21.5, "y":4}, + {"label":"Shift", "x":0, "y":5, "w":2.25}, + {"label":"Z", "x":2.25, "y":5}, + {"label":"X", "x":3.25, "y":5}, + {"label":"C", "x":4.25, "y":5}, + {"label":"V", "x":5.25, "y":5}, + {"label":"B", "x":6.25, "y":5}, + {"label":"N", "x":7.25, "y":5}, + {"label":"M", "x":8.25, "y":5}, + {"label":",", "x":9.25, "y":5}, + {"label":".", "x":10.25, "y":5}, + {"label":"/", "x":11.25, "y":5}, + {"label":"Shift", "x":12.25, "y":5, "w":2.75}, + {"label":"Up", "x":16.25, "y":5}, + {"label":"Num 1", "x":18.5, "y":5}, + {"label":"Num 2", "x":19.5, "y":5}, + {"label":"Num 3", "x":20.5, "y":5}, + {"label":"Ctrl", "x":0, "y":6, "w":1.5}, + {"label":"Alt", "x":1.5, "y":6, "w":1.25}, + {"label":"Command", "x":2.75, "y":6, "w":1.5}, + {"label":"Space", "x":4.25, "y":6, "w":6.5}, + {"label":"Alt", "x":12.25, "y":6, "w":1.25}, + {"label":"Ctrl", "x":13.5, "y":6, "w":1.5}, + {"label":"Left", "x":15.25, "y":6}, + {"label":"Down", "x":16.25, "y":6}, + {"label":"Right", "x":17.25, "y":6}, + {"label":"Num 0", "x":18.5, "y":6, "w":2}, + {"label":"Num .", "x":20.5, "y":6}, + {"label":"Num Enter", "x":21.5, "y":5, "h":2} + ] + }, + "LAYOUT_m0116_ansi": { + "width": 19.5, + "height": 6.25, + "layout": [ + {"label":"Power", "x":5, "y":0, "w":2}, + {"label":"Esc", "x":0, "y":1.25}, + {"label":"1", "x":1, "y":1.25}, + {"label":"2", "x":2, "y":1.25}, + {"label":"3", "x":3, "y":1.25}, + {"label":"4", "x":4, "y":1.25}, + {"label":"5", "x":5, "y":1.25}, + {"label":"6", "x":6, "y":1.25}, + {"label":"7", "x":7, "y":1.25}, + {"label":"8", "x":8, "y":1.25}, + {"label":"9", "x":9, "y":1.25}, + {"label":"0", "x":10, "y":1.25}, + {"label":"-", "x":11, "y":1.25}, + {"label":"=", "x":12, "y":1.25}, + {"label":"Delete", "x":13, "y":1.25, "w":1.5}, + {"label":"Clear", "x":15.5, "y":1.25}, + {"label":"Num =", "x":16.5, "y":1.25}, + {"label":"Num /", "x":17.5, "y":1.25}, + {"label":"Num *", "x":18.5, "y":1.25}, + {"label":"Tab", "x":0, "y":2.25, "w":1.5}, + {"label":"Q", "x":1.5, "y":2.25}, + {"label":"W", "x":2.5, "y":2.25}, + {"label":"E", "x":3.5, "y":2.25}, + {"label":"R", "x":4.5, "y":2.25}, + {"label":"T", "x":5.5, "y":2.25}, + {"label":"Y", "x":6.5, "y":2.25}, + {"label":"U", "x":7.5, "y":2.25}, + {"label":"I", "x":8.5, "y":2.25}, + {"label":"O", "x":9.5, "y":2.25}, + {"label":"P", "x":10.5, "y":2.25}, + {"label":"[", "x":11.5, "y":2.25}, + {"label":"]", "x":12.5, "y":2.25}, + {"label":"Num 7", "x":15.5, "y":2.25}, + {"label":"Num 8", "x":16.5, "y":2.25}, + {"label":"Num 9", "x":17.5, "y":2.25}, + {"label":"Num +", "x":18.5, "y":2.25}, + {"label":"Ctrl", "x":0, "y":3.25, "w":1.75}, + {"label":"A", "x":1.75, "y":3.25}, + {"label":"S", "x":2.75, "y":3.25}, + {"label":"D", "x":3.75, "y":3.25}, + {"label":"F", "x":4.75, "y":3.25}, + {"label":"G", "x":5.75, "y":3.25}, + {"label":"H", "x":6.75, "y":3.25}, + {"label":"J", "x":7.75, "y":3.25}, + {"label":"K", "x":8.75, "y":3.25}, + {"label":"L", "x":9.75, "y":3.25}, + {"label":";", "x":10.75, "y":3.25}, + {"label":"'", "x":11.75, "y":3.25}, + {"label":"Return", "x":12.75, "y":3.25, "w":1.75}, + {"label":"Num 4", "x":15.5, "y":3.25}, + {"label":"Num 5", "x":16.5, "y":3.25}, + {"label":"Num 6", "x":17.5, "y":3.25}, + {"label":"Num -", "x":18.5, "y":3.25}, + {"label":"Shift", "x":0, "y":4.25, "w":2.25}, + {"label":"Z", "x":2.25, "y":4.25}, + {"label":"X", "x":3.25, "y":4.25}, + {"label":"C", "x":4.25, "y":4.25}, + {"label":"V", "x":5.25, "y":4.25}, + {"label":"B", "x":6.25, "y":4.25}, + {"label":"N", "x":7.25, "y":4.25}, + {"label":"M", "x":8.25, "y":4.25}, + {"label":",", "x":9.25, "y":4.25}, + {"label":".", "x":10.25, "y":4.25}, + {"label":"/", "x":11.25, "y":4.25}, + {"label":"Shift", "x":12.25, "y":4.25, "w":2.25}, + {"label":"Num 1", "x":15.5, "y":4.25}, + {"label":"Num 2", "x":16.5, "y":4.25}, + {"label":"Num 3", "x":17.5, "y":4.25}, + {"label":"Caps Lock", "x":0, "y":5.25}, + {"label":"Option", "x":1, "y":5.25}, + {"label":"Command", "x":2, "y":5.25, "w":1.75}, + {"label":"`", "x":3.75, "y":5.25}, + {"label":"Space", "x":4.75, "y":5.25, "w":4.75}, + {"label":"\\", "x":9.5, "y":5.25}, + {"label":"Left", "x":10.5, "y":5.25}, + {"label":"Right", "x":11.5, "y":5.25}, + {"label":"Down", "x":12.5, "y":5.25}, + {"label":"Up", "x":13.5, "y":5.25}, + {"label":"Num 0", "x":15.5, "y":5.25, "w":2}, + {"label":"Num .", "x":17.5, "y":5.25}, + {"label":"Num Enter", "x":18.5, "y":4.25, "h":2} + ] + } + } +} From 756d92c1a071b6c481b67a44671308fc9d680afe Mon Sep 17 00:00:00 2001 From: Kosuke Adachi Date: Mon, 5 Nov 2018 03:46:26 +0900 Subject: [PATCH 451/788] Keyboard: Update the serial.c of crkbd based on the helix-serial.c (#4349) --- keyboards/crkbd/rev1/serial_config.h | 12 +- keyboards/crkbd/rev1/split_scomm.c | 49 +++-- keyboards/crkbd/rev1/split_scomm.h | 5 +- keyboards/crkbd/rev1/split_util.h | 5 +- keyboards/crkbd/serial.c | 284 ++++++++++++++++++++------- keyboards/crkbd/serial.h | 27 ++- 6 files changed, 277 insertions(+), 105 deletions(-) diff --git a/keyboards/crkbd/rev1/serial_config.h b/keyboards/crkbd/rev1/serial_config.h index 671ed821d..4fab8e8dd 100644 --- a/keyboards/crkbd/rev1/serial_config.h +++ b/keyboards/crkbd/rev1/serial_config.h @@ -1,10 +1,4 @@ -#pragma once - -/* Soft Serial defines */ -#define SERIAL_PIN_DDR DDRD -#define SERIAL_PIN_PORT PORTD -#define SERIAL_PIN_INPUT PIND -#define SERIAL_PIN_MASK _BV(PD2) -#define SERIAL_PIN_INTERRUPT INT2_vect - +#ifndef SOFT_SERIAL_PIN +#define SOFT_SERIAL_PIN D2 #define SERIAL_USE_MULTI_TRANSACTION +#endif diff --git a/keyboards/crkbd/rev1/split_scomm.c b/keyboards/crkbd/rev1/split_scomm.c index 9719eb22e..ada786796 100644 --- a/keyboards/crkbd/rev1/split_scomm.c +++ b/keyboards/crkbd/rev1/split_scomm.c @@ -7,8 +7,8 @@ #include #include #include "serial.h" -#ifdef SERIAL_DEBUG_MODE -#include +#ifdef CONSOLE_ENABLE + #include #endif uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; @@ -17,6 +17,7 @@ uint8_t volatile status_com = 0; uint8_t volatile status1 = 0; uint8_t slave_buffer_change_count = 0; uint8_t s_change_old = 0xff; +uint8_t s_change_new = 0xff; SSTD_t transactions[] = { #define GET_SLAVE_STATUS 0 @@ -41,12 +42,12 @@ SSTD_t transactions[] = { void serial_master_init(void) { - soft_serial_initiator_init(transactions); + soft_serial_initiator_init(transactions, TID_LIMIT(transactions)); } void serial_slave_init(void) { - soft_serial_target_init(transactions); + soft_serial_target_init(transactions, TID_LIMIT(transactions)); } // 0 => no error @@ -54,19 +55,37 @@ void serial_slave_init(void) // 2 => checksum error int serial_update_buffers(int master_update) { - int status; + int status, smatstatus; static int need_retry = 0; - if( s_change_old != slave_buffer_change_count ) { - status = soft_serial_transaction(GET_SLAVE_BUFFER); - if( status == TRANSACTION_END ) - s_change_old = slave_buffer_change_count; + + if( s_change_old != s_change_new ) { + smatstatus = soft_serial_transaction(GET_SLAVE_BUFFER); + if( smatstatus == TRANSACTION_END ) { + s_change_old = s_change_new; +#ifdef CONSOLE_ENABLE + uprintf("slave matrix = %b %b %b %b %b\n", + serial_slave_buffer[0], serial_slave_buffer[1], + serial_slave_buffer[2], serial_slave_buffer[3], + serial_slave_buffer[4] ); +#endif + } + } else { + // serial_slave_buffer dosen't change + smatstatus = TRANSACTION_END; // dummy status } - if( !master_update && !need_retry) - status = soft_serial_transaction(GET_SLAVE_STATUS); - else - status = soft_serial_transaction(PUT_MASTER_GET_SLAVE_STATUS); - need_retry = ( status == TRANSACTION_END ) ? 0 : 1; - return status; + + if( !master_update && !need_retry) { + status = soft_serial_transaction(GET_SLAVE_STATUS); + } else { + status = soft_serial_transaction(PUT_MASTER_GET_SLAVE_STATUS); + } + if( status == TRANSACTION_END ) { + s_change_new = slave_buffer_change_count; + need_retry = 0; + } else { + need_retry = 1; + } + return smatstatus; } #endif // SERIAL_USE_MULTI_TRANSACTION diff --git a/keyboards/crkbd/rev1/split_scomm.h b/keyboards/crkbd/rev1/split_scomm.h index 16887eb74..873d8939d 100644 --- a/keyboards/crkbd/rev1/split_scomm.h +++ b/keyboards/crkbd/rev1/split_scomm.h @@ -1,4 +1,5 @@ -#pragma once +#ifndef SPLIT_COMM_H +#define SPLIT_COMM_H #ifndef SERIAL_USE_MULTI_TRANSACTION /* --- USE Simple API (OLD API, compatible with let's split serial.c) --- */ @@ -19,3 +20,5 @@ void serial_slave_init(void); int serial_update_buffers(int master_changed); #endif + +#endif /* SPLIT_COMM_H */ diff --git a/keyboards/crkbd/rev1/split_util.h b/keyboards/crkbd/rev1/split_util.h index f59304756..687ca19bd 100644 --- a/keyboards/crkbd/rev1/split_util.h +++ b/keyboards/crkbd/rev1/split_util.h @@ -1,4 +1,5 @@ -#pragma once +#ifndef SPLIT_KEYBOARD_UTIL_H +#define SPLIT_KEYBOARD_UTIL_H #include #include "eeconfig.h" @@ -14,3 +15,5 @@ void split_keyboard_setup(void); bool has_usb(void); void matrix_master_OLED_init (void); + +#endif diff --git a/keyboards/crkbd/serial.c b/keyboards/crkbd/serial.c index 11ceff0b3..325c29a3f 100644 --- a/keyboards/crkbd/serial.c +++ b/keyboards/crkbd/serial.c @@ -1,5 +1,10 @@ /* * WARNING: be careful changing this code, it is very timing dependent + * + * 2018-10-28 checked + * avr-gcc 4.9.2 + * avr-gcc 5.4.0 + * avr-gcc 7.3.0 */ #ifndef F_CPU @@ -14,8 +19,58 @@ #include "serial.h" //#include -#ifdef USE_SERIAL +#ifdef SOFT_SERIAL_PIN +#ifdef __AVR_ATmega32U4__ + // if using ATmega32U4 I2C, can not use PD0 and PD1 in soft serial. + #ifdef USE_I2C + #if SOFT_SERIAL_PIN == D0 || SOFT_SERIAL_PIN == D1 + #error Using ATmega32U4 I2C, so can not use PD0, PD1 + #endif + #endif + + #if SOFT_SERIAL_PIN >= D0 && SOFT_SERIAL_PIN <= D3 + #define SERIAL_PIN_DDR DDRD + #define SERIAL_PIN_PORT PORTD + #define SERIAL_PIN_INPUT PIND + #if SOFT_SERIAL_PIN == D0 + #define SERIAL_PIN_MASK _BV(PD0) + #define EIMSK_BIT _BV(INT0) + #define EICRx_BIT (~(_BV(ISC00) | _BV(ISC01))) + #define SERIAL_PIN_INTERRUPT INT0_vect + #elif SOFT_SERIAL_PIN == D1 + #define SERIAL_PIN_MASK _BV(PD1) + #define EIMSK_BIT _BV(INT1) + #define EICRx_BIT (~(_BV(ISC10) | _BV(ISC11))) + #define SERIAL_PIN_INTERRUPT INT1_vect + #elif SOFT_SERIAL_PIN == D2 + #define SERIAL_PIN_MASK _BV(PD2) + #define EIMSK_BIT _BV(INT2) + #define EICRx_BIT (~(_BV(ISC20) | _BV(ISC21))) + #define SERIAL_PIN_INTERRUPT INT2_vect + #elif SOFT_SERIAL_PIN == D3 + #define SERIAL_PIN_MASK _BV(PD3) + #define EIMSK_BIT _BV(INT3) + #define EICRx_BIT (~(_BV(ISC30) | _BV(ISC31))) + #define SERIAL_PIN_INTERRUPT INT3_vect + #endif + #elif SOFT_SERIAL_PIN == E6 + #define SERIAL_PIN_DDR DDRE + #define SERIAL_PIN_PORT PORTE + #define SERIAL_PIN_INPUT PINE + #define SERIAL_PIN_MASK _BV(PE6) + #define EIMSK_BIT _BV(INT6) + #define EICRx_BIT (~(_BV(ISC60) | _BV(ISC61))) + #define SERIAL_PIN_INTERRUPT INT6_vect + #else + #error invalid SOFT_SERIAL_PIN value + #endif + +#else + #error serial.c now support ATmega32U4 only +#endif + +//////////////// for backward compatibility //////////////////////////////// #ifndef SERIAL_USE_MULTI_TRANSACTION /* --- USE Simple API (OLD API, compatible with let's split serial.c) */ #if SERIAL_SLAVE_BUFFER_LENGTH > 0 @@ -42,56 +97,118 @@ SSTD_t transactions[] = { }; void serial_master_init(void) -{ soft_serial_initiator_init(transactions); } +{ soft_serial_initiator_init(transactions, TID_LIMIT(transactions)); } void serial_slave_init(void) -{ soft_serial_target_init(transactions); } +{ soft_serial_target_init(transactions, TID_LIMIT(transactions)); } // 0 => no error // 1 => slave did not respond // 2 => checksum error int serial_update_buffers() -{ return soft_serial_transaction(); } +{ + int result; + result = soft_serial_transaction(); + return result; +} -#endif // Simple API (OLD API, compatible with let's split serial.c) +#endif // end of Simple API (OLD API, compatible with let's split serial.c) +//////////////////////////////////////////////////////////////////////////// #define ALWAYS_INLINE __attribute__((always_inline)) #define NO_INLINE __attribute__((noinline)) #define _delay_sub_us(x) __builtin_avr_delay_cycles(x) -// Serial pulse period in microseconds. -#define TID_SEND_ADJUST 14 +// parity check +#define ODD_PARITY 1 +#define EVEN_PARITY 0 +#define PARITY EVEN_PARITY -#define SELECT_SERIAL_SPEED 1 -#if SELECT_SERIAL_SPEED == 0 +#ifdef SERIAL_DELAY + // custom setup in config.h + // #define TID_SEND_ADJUST 2 + // #define SERIAL_DELAY 6 // micro sec + // #define READ_WRITE_START_ADJUST 30 // cycles + // #define READ_WRITE_WIDTH_ADJUST 8 // cycles +#else +// ============ Standard setups ============ + +#ifndef SELECT_SOFT_SERIAL_SPEED +#define SELECT_SOFT_SERIAL_SPEED 1 +// 0: about 189kbps +// 1: about 137kbps (default) +// 2: about 75kbps +// 3: about 39kbps +// 4: about 26kbps +// 5: about 20kbps +#endif + +#if __GNUC__ < 6 + #define TID_SEND_ADJUST 14 +#else + #define TID_SEND_ADJUST 2 +#endif + +#if SELECT_SOFT_SERIAL_SPEED == 0 // Very High speed #define SERIAL_DELAY 4 // micro sec - #define READ_WRITE_START_ADJUST 33 // cycles - #define READ_WRITE_WIDTH_ADJUST 3 // cycles -#elif SELECT_SERIAL_SPEED == 1 + #if __GNUC__ < 6 + #define READ_WRITE_START_ADJUST 33 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_START_ADJUST 34 // cycles + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif +#elif SELECT_SOFT_SERIAL_SPEED == 1 // High speed #define SERIAL_DELAY 6 // micro sec - #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 3 // cycles -#elif SELECT_SERIAL_SPEED == 2 + #if __GNUC__ < 6 + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_START_ADJUST 33 // cycles + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif +#elif SELECT_SOFT_SERIAL_SPEED == 2 // Middle speed #define SERIAL_DELAY 12 // micro sec #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 3 // cycles -#elif SELECT_SERIAL_SPEED == 3 + #if __GNUC__ < 6 + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif +#elif SELECT_SOFT_SERIAL_SPEED == 3 // Low speed #define SERIAL_DELAY 24 // micro sec #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 3 // cycles -#elif SELECT_SERIAL_SPEED == 4 + #if __GNUC__ < 6 + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif +#elif SELECT_SOFT_SERIAL_SPEED == 4 // Very Low speed - #define SERIAL_DELAY 50 // micro sec + #define SERIAL_DELAY 36 // micro sec #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #if __GNUC__ < 6 + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif +#elif SELECT_SOFT_SERIAL_SPEED == 5 + // Ultra Low speed + #define SERIAL_DELAY 48 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #if __GNUC__ < 6 + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif #else -#error Illegal Serial Speed -#endif - +#error invalid SELECT_SOFT_SERIAL_SPEED value +#endif /* SELECT_SOFT_SERIAL_SPEED */ +#endif /* SERIAL_DELAY */ #define SERIAL_DELAY_HALF1 (SERIAL_DELAY/2) #define SERIAL_DELAY_HALF2 (SERIAL_DELAY - SERIAL_DELAY/2) @@ -105,17 +222,21 @@ int serial_update_buffers() #endif static SSTD_t *Transaction_table = NULL; +static uint8_t Transaction_table_size = 0; +inline static void serial_delay(void) ALWAYS_INLINE; inline static void serial_delay(void) { _delay_us(SERIAL_DELAY); } +inline static void serial_delay_half1(void) ALWAYS_INLINE; inline static void serial_delay_half1(void) { _delay_us(SERIAL_DELAY_HALF1); } +inline static void serial_delay_half2(void) ALWAYS_INLINE; inline static void serial_delay_half2(void) { _delay_us(SERIAL_DELAY_HALF2); @@ -135,6 +256,7 @@ void serial_input_with_pullup(void) { SERIAL_PIN_PORT |= SERIAL_PIN_MASK; } +inline static uint8_t serial_read_pin(void) ALWAYS_INLINE; inline static uint8_t serial_read_pin(void) { return !!(SERIAL_PIN_INPUT & SERIAL_PIN_MASK); @@ -152,30 +274,28 @@ void serial_high(void) { SERIAL_PIN_PORT |= SERIAL_PIN_MASK; } -void soft_serial_initiator_init(SSTD_t *sstd_table) +void soft_serial_initiator_init(SSTD_t *sstd_table, int sstd_table_size) { Transaction_table = sstd_table; + Transaction_table_size = (uint8_t)sstd_table_size; serial_output(); serial_high(); } -void soft_serial_target_init(SSTD_t *sstd_table) +void soft_serial_target_init(SSTD_t *sstd_table, int sstd_table_size) { Transaction_table = sstd_table; + Transaction_table_size = (uint8_t)sstd_table_size; serial_input_with_pullup(); -#if SERIAL_PIN_MASK == _BV(PD0) - // Enable INT0 - EIMSK |= _BV(INT0); - // Trigger on falling edge of INT0 - EICRA &= ~(_BV(ISC00) | _BV(ISC01)); -#elif SERIAL_PIN_MASK == _BV(PD2) - // Enable INT2 - EIMSK |= _BV(INT2); - // Trigger on falling edge of INT2 - EICRA &= ~(_BV(ISC20) | _BV(ISC21)); + // Enable INT0-INT3,INT6 + EIMSK |= EIMSK_BIT; +#if SERIAL_PIN_MASK == _BV(PE6) + // Trigger on falling edge of INT6 + EICRB &= EICRx_BIT; #else - #error unknown SERIAL_PIN_MASK value + // Trigger on falling edge of INT0-INT3 + EICRA &= EICRx_BIT; #endif } @@ -191,7 +311,7 @@ void sync_recv(void) { } // Used by the reciver to send a synchronization signal to the sender. -static void sync_send(void)NO_INLINE; +static void sync_send(void) NO_INLINE; static void sync_send(void) { serial_low(); @@ -205,12 +325,12 @@ static uint8_t serial_read_chunk(uint8_t *pterrcount, uint8_t bit) { uint8_t byte, i, p, pb; _delay_sub_us(READ_WRITE_START_ADJUST); - for( i = 0, byte = 0, p = 0; i < bit; i++ ) { + for( i = 0, byte = 0, p = PARITY; i < bit; i++ ) { serial_delay_half1(); // read the middle of pulses if( serial_read_pin() ) { - byte = (byte << 1) | 1; p ^= 1; + byte = (byte << 1) | 1; p ^= 1; } else { - byte = (byte << 1) | 0; p ^= 0; + byte = (byte << 1) | 0; p ^= 0; } _delay_sub_us(READ_WRITE_WIDTH_ADJUST); serial_delay_half2(); @@ -230,13 +350,13 @@ static uint8_t serial_read_chunk(uint8_t *pterrcount, uint8_t bit) { void serial_write_chunk(uint8_t data, uint8_t bit) NO_INLINE; void serial_write_chunk(uint8_t data, uint8_t bit) { uint8_t b, p; - for( p = 0, b = 1<<(bit-1); b ; b >>= 1) { - if(data & b) { - serial_high(); p ^= 1; - } else { - serial_low(); p ^= 0; - } - serial_delay(); + for( p = PARITY, b = 1<<(bit-1); b ; b >>= 1) { + if(data & b) { + serial_high(); p ^= 1; + } else { + serial_low(); p ^= 0; + } + serial_delay(); } /* send parity bit */ if(p & 1) { serial_high(); } @@ -288,6 +408,13 @@ void change_reciver2sender(void) { serial_delay_half1(); //4 } +static inline uint8_t nibble_bits_count(uint8_t bits) +{ + bits = (bits & 0x5) + (bits >> 1 & 0x5); + bits = (bits & 0x3) + (bits >> 2 & 0x3); + return bits; +} + // interrupt handle to be used by the target device ISR(SERIAL_PIN_INTERRUPT) { @@ -297,12 +424,15 @@ ISR(SERIAL_PIN_INTERRUPT) { SSTD_t *trans = Transaction_table; #else // recive transaction table index - uint8_t tid; + uint8_t tid, bits; uint8_t pecount = 0; sync_recv(); - tid = serial_read_chunk(&pecount,4); - if(pecount> 0) + bits = serial_read_chunk(&pecount,7); + tid = bits>>3; + bits = (bits&7) != nibble_bits_count(tid); + if( bits || pecount> 0 || tid > Transaction_table_size ) { return; + } serial_delay_half1(); serial_high(); // response step1 low->high @@ -315,17 +445,17 @@ ISR(SERIAL_PIN_INTERRUPT) { // target send phase if( trans->target2initiator_buffer_size > 0 ) serial_send_packet((uint8_t *)trans->target2initiator_buffer, - trans->target2initiator_buffer_size); + trans->target2initiator_buffer_size); // target switch to input change_sender2reciver(); // target recive phase if( trans->initiator2target_buffer_size > 0 ) { if (serial_recive_packet((uint8_t *)trans->initiator2target_buffer, - trans->initiator2target_buffer_size) ) { - *trans->status = TRANSACTION_ACCEPTED; + trans->initiator2target_buffer_size) ) { + *trans->status = TRANSACTION_ACCEPTED; } else { - *trans->status = TRANSACTION_DATA_ERROR; + *trans->status = TRANSACTION_DATA_ERROR; } } else { *trans->status = TRANSACTION_ACCEPTED; @@ -349,6 +479,8 @@ int soft_serial_transaction(void) { SSTD_t *trans = Transaction_table; #else int soft_serial_transaction(int sstd_index) { + if( sstd_index > Transaction_table_size ) + return TRANSACTION_TYPE_ERROR; SSTD_t *trans = &Transaction_table[sstd_index]; #endif cli(); @@ -375,9 +507,10 @@ int soft_serial_transaction(int sstd_index) { #else // send transaction table index + int tid = (sstd_index<<3) | (7 & nibble_bits_count(sstd_index)); sync_send(); _delay_sub_us(TID_SEND_ADJUST); - serial_write_chunk(sstd_index, 4); + serial_write_chunk(tid, 7); serial_delay_half1(); // wait for the target response (step1 low->high) @@ -389,12 +522,12 @@ int soft_serial_transaction(int sstd_index) { // check if the target is present (step2 high->low) for( int i = 0; serial_read_pin(); i++ ) { if (i > SLAVE_INT_ACK_WIDTH + 1) { - // slave failed to pull the line low, assume not present - serial_output(); - serial_high(); - *trans->status = TRANSACTION_NO_RESPONSE; - sei(); - return TRANSACTION_NO_RESPONSE; + // slave failed to pull the line low, assume not present + serial_output(); + serial_high(); + *trans->status = TRANSACTION_NO_RESPONSE; + sei(); + return TRANSACTION_NO_RESPONSE; } _delay_sub_us(SLAVE_INT_ACK_WIDTH_UNIT); } @@ -404,12 +537,12 @@ int soft_serial_transaction(int sstd_index) { // if the target is present syncronize with it if( trans->target2initiator_buffer_size > 0 ) { if (!serial_recive_packet((uint8_t *)trans->target2initiator_buffer, - trans->target2initiator_buffer_size) ) { - serial_output(); - serial_high(); - *trans->status = TRANSACTION_DATA_ERROR; - sei(); - return TRANSACTION_DATA_ERROR; + trans->target2initiator_buffer_size) ) { + serial_output(); + serial_high(); + *trans->status = TRANSACTION_DATA_ERROR; + sei(); + return TRANSACTION_DATA_ERROR; } } @@ -419,7 +552,7 @@ int soft_serial_transaction(int sstd_index) { // initiator send phase if( trans->initiator2target_buffer_size > 0 ) { serial_send_packet((uint8_t *)trans->initiator2target_buffer, - trans->initiator2target_buffer_size); + trans->initiator2target_buffer_size); } // always, release the line when not in use @@ -442,3 +575,16 @@ int soft_serial_get_and_clean_status(int sstd_index) { #endif #endif + +// Helix serial.c history +// 2018-1-29 fork from let's split and add PD2, modify sync_recv() (#2308, bceffdefc) +// 2018-6-28 bug fix master to slave comm and speed up (#3255, 1038bbef4) +// (adjusted with avr-gcc 4.9.2) +// 2018-7-13 remove USE_SERIAL_PD2 macro (#3374, f30d6dd78) +// (adjusted with avr-gcc 4.9.2) +// 2018-8-11 add support multi-type transaction (#3608, feb5e4aae) +// (adjusted with avr-gcc 4.9.2) +// 2018-10-21 fix serial and RGB animation conflict (#4191, 4665e4fff) +// (adjusted with avr-gcc 7.3.0) +// 2018-10-28 re-adjust compiler depend value of delay (#4269, 8517f8a66) +// (adjusted with avr-gcc 5.4.0, 7.3.0) diff --git a/keyboards/crkbd/serial.h b/keyboards/crkbd/serial.h index 76c6aaa04..7e0c0847a 100644 --- a/keyboards/crkbd/serial.h +++ b/keyboards/crkbd/serial.h @@ -1,16 +1,19 @@ -#pragma once +#ifndef SOFT_SERIAL_H +#define SOFT_SERIAL_H #include // ///////////////////////////////////////////////////////////////// -// Need Soft Serial defines in serial_config.h +// Need Soft Serial defines in config.h // ///////////////////////////////////////////////////////////////// // ex. -// #define SERIAL_PIN_DDR DDRD -// #define SERIAL_PIN_PORT PORTD -// #define SERIAL_PIN_INPUT PIND -// #define SERIAL_PIN_MASK _BV(PD?) ?=0,2 -// #define SERIAL_PIN_INTERRUPT INT?_vect ?=0,2 +// #define SOFT_SERIAL_PIN ?? // ?? = D0,D1,D2,D3,E6 +// OPTIONAL: #define SELECT_SOFT_SERIAL_SPEED ? // ? = 1,2,3,4,5 +// // 1: about 137kbps (default) +// // 2: about 75kbps +// // 3: about 39kbps +// // 4: about 26kbps +// // 5: about 20kbps // // //// USE Simple API (OLD API, compatible with let's split serial.c) // ex. @@ -46,16 +49,18 @@ typedef struct _SSTD_t { uint8_t target2initiator_buffer_size; uint8_t *target2initiator_buffer; } SSTD_t; +#define TID_LIMIT( table ) (sizeof(table) / sizeof(SSTD_t)) // initiator is transaction start side -void soft_serial_initiator_init(SSTD_t *sstd_table); +void soft_serial_initiator_init(SSTD_t *sstd_table, int sstd_table_size); // target is interrupt accept side -void soft_serial_target_init(SSTD_t *sstd_table); +void soft_serial_target_init(SSTD_t *sstd_table, int sstd_table_size); // initiator resullt #define TRANSACTION_END 0 #define TRANSACTION_NO_RESPONSE 0x1 #define TRANSACTION_DATA_ERROR 0x2 +#define TRANSACTION_TYPE_ERROR 0x4 #ifndef SERIAL_USE_MULTI_TRANSACTION int soft_serial_transaction(void); #else @@ -71,7 +76,9 @@ int soft_serial_transaction(int sstd_index); // target: // TRANSACTION_DATA_ERROR // or TRANSACTION_ACCEPTED -#define TRANSACTION_ACCEPTED 0x4 +#define TRANSACTION_ACCEPTED 0x8 #ifdef SERIAL_USE_MULTI_TRANSACTION int soft_serial_get_and_clean_status(int sstd_index); #endif + +#endif /* SOFT_SERIAL_H */ From f28a4e39fc97e22a2e547c60d9ffce188d3a6495 Mon Sep 17 00:00:00 2001 From: TurboMech <32869044+TurboMech@users.noreply.github.com> Date: Sun, 4 Nov 2018 19:00:33 -0500 Subject: [PATCH 452/788] Fix Espectro build (#4353) After further testing and feedback from others, the bottom row matrix was incorrect. Also RGB number was incorrect (I was tired when building this, really shouldn't do that). --- keyboards/espectro/config.h | 2 +- keyboards/espectro/espectro.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/keyboards/espectro/config.h b/keyboards/espectro/config.h index 34852df43..294091d58 100755 --- a/keyboards/espectro/config.h +++ b/keyboards/espectro/config.h @@ -59,7 +59,7 @@ #define RGB_DI_PIN E2 #ifdef RGB_DI_PIN -#define RGBLED_NUM 16 +#define RGBLED_NUM 18 #define RGBLIGHT_HUE_STEP 10 #define RGBLIGHT_SAT_STEP 10 #define RGBLIGHT_VAL_STEP 10 diff --git a/keyboards/espectro/espectro.h b/keyboards/espectro/espectro.h index 3d6ea466d..6f9e4b7f7 100755 --- a/keyboards/espectro/espectro.h +++ b/keyboards/espectro/espectro.h @@ -28,7 +28,7 @@ K100, K101, K102, K103, K104, K604, K605, K606, K607, K105, K106, K107, K108, K200, K201, K202, K203, K204, K608, K609, K610, K611, K205, K206, K207, K208, K703, K209, K210, K211, K212, \ K300, K301, K302, K303, K304, K612, K705, K706, K707, K305, K306, K307, K308, K309, K310, K311, \ K400, K402, K403, K404, K708, K709, K710, K711, K405, K406, K407, K408, K704, K409, K410, K411, K412, \ -K500, K501, K502, K503, K504, K505, K506, K507, K508, K509, K510, K511 \ +K500, K501, K502, K509, K505, K506, K507, K508, K503, K504, K510, K511 \ ) { \ { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012 }, \ { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112 }, \ @@ -48,7 +48,7 @@ K100, K101, K102, K103, K104, K604, K605, K606, K607, K105, K106, K107, K108, K7 K200, K201, K202, K203, K204, K608, K609, K610, K611, K205, K206, K207, K208, K703, K209, K210, K211, K212, \ K300, K301, K302, K303, K304, K612, K705, K706, K707, K305, K306, K307, K308, K309, K310, K311, K312, \ K400, K401, K402, K403, K404, K708, K709, K710, K711, K405, K406, K407, K408, K704, K409, K410, K411, K412, \ -K500, K501, K502, K503, K504, K505, K506, K507, K508, K509, K510, K511, K512 \ +K500, K501, K502, K509, K505, K506, K507, K508, K503, K504, K510, K511, K512 \ ) { \ { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012 }, \ { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112 }, \ @@ -75,7 +75,7 @@ K200, K201, K202, K203, K204, K608, K609, K610, K611, K205, K206, K207, K208, K300, K300, K301, K302, K304, K612, K705, K706, K707, K305, K306, K307, K703, K308, K309, K310, K311, K312, \ K400x2, K401, K402, K403, K404, K708, K709, K710, K711, K405, K406, K407, K408, K408, K704, K409, K410, K411, K412, \ K412, \ -K500x2, K501x2, K502, K503x3, K504x3, K505x2, K506x2, K507x2, K508x2, K509, K510x2, K511, K512 \ +K500x2, K501x2, K502, K509x3, K505x3, K506x2, K507x2, K508x2, K503x2, K504, K510x2, K511, K512 \ ) { \ { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012 }, \ { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112 }, \ From f2fda1bd56c97019777fb2a028d088ae37693b0f Mon Sep 17 00:00:00 2001 From: Jarred Steenvoorden Date: Mon, 5 Nov 2018 19:05:48 +1100 Subject: [PATCH 453/788] Keymap update Adding RGB underglow controls. (#4358) * Update userspace with common config.h * Add my dz60, satan and xd75 keyboard keymaps * Fixing executable bits changed during last upstream merge * Cleanup unnecessary files and defines * Remove unnecessary defines from userspace config * Add underglow controls to dz60 function layer * Fixing merge conflicts * Fixing exectable bits changed during merge --- keyboards/dz60/keymaps/jarred/keymap.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/keyboards/dz60/keymaps/jarred/keymap.c b/keyboards/dz60/keymaps/jarred/keymap.c index 9e6850683..2ef679493 100644 --- a/keyboards/dz60/keymaps/jarred/keymap.c +++ b/keyboards/dz60/keymaps/jarred/keymap.c @@ -13,9 +13,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT,KC_RGUI, XXXXXXX,KC_APP, KC_RCTL), [_NV] = LAYOUT( - KC_GRV ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 ,KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,KC_F11 ,KC_F12 ,_______,_______, - _______,_______,_______,_______,KC_DEL ,KC_BSPC,_______,KC_HOME,KC_UP ,KC_END ,KC_INS ,_______,_______,_______, - _______,_______,_______,KC_LSFT,KC_LCTL,KC_ENT ,_______,KC_LEFT,KC_DOWN,KC_RGHT,KC_DEL ,KC_DEL , _______, - _______,_______,_______,_______,_______,_______,_______,_______,KC_PGUP,KC_PGDN,_______,_______,_______,_______, - _______,_______,_______, _______,_______,_______, _______,_______,_______, RESET, _______) + KC_GRV ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 ,KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,KC_F11 ,KC_F12 ,XXXXXXX,_______, + _______,RGB_TOG,RGB_MOD,_______,KC_DEL ,KC_BSPC,_______,KC_HOME,KC_UP ,KC_END ,KC_INS ,_______,_______,_______, + _______,RGB_HUI,RGB_HUD,KC_LSFT,KC_LCTL,KC_ENT ,_______,KC_LEFT,KC_DOWN,KC_RGHT,KC_DEL ,KC_DEL , _______, + _______,XXXXXXX,RGB_SAD,RGB_SAI,_______,_______,_______,_______,KC_PGUP,KC_PGDN,_______,_______,_______,XXXXXXX, + _______,RGB_VAD,RGB_VAI, _______,_______,_______, _______,_______,XXXXXXX, RESET,_______) }; From d1d5f200787f70bb853e32d5e5e2ce7b35ef7a54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20=C4=90or=C4=91evi=C4=87?= Date: Mon, 5 Nov 2018 15:04:14 +0100 Subject: [PATCH 454/788] Update whitefox/konstantin keymap (#4363) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Use Magic+Esc for entering bootloader mode * Expand rules.mk * Improve FN_RCTL tap dance * Avoid one-line if statements * Add PROGMEM to keymaps definition * td_fn_rctl_* → td_fn_rctrl_* * Fix FN_RCTL tap dance bug when count is 4, 8, 12 etc. * Add ACTION_TAP_DANCE_DOUBLE_MODS * Rearrange/rename keycode defines * Use RAL_RGU and RCT_RSF in keymaps * Replace keymap ASCII art with box drawing characters * Add FN_FNLK and use it * Set Unicode input mode in eeconfig_init_user instead of matrix_init_user --- .../whitefox/keymaps/konstantin/config.h | 9 +- .../whitefox/keymaps/konstantin/keymap.c | 202 +++++++++++------- .../whitefox/keymaps/konstantin/rules.mk | 6 + 3 files changed, 142 insertions(+), 75 deletions(-) diff --git a/keyboards/whitefox/keymaps/konstantin/config.h b/keyboards/whitefox/keymaps/konstantin/config.h index 39450d680..d1c3002d2 100644 --- a/keyboards/whitefox/keymaps/konstantin/config.h +++ b/keyboards/whitefox/keymaps/konstantin/config.h @@ -2,6 +2,12 @@ #define FORCE_NKRO +#undef IS_COMMAND +#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RCTL))) + +#define MAGIC_KEY_LAYER0_ALT1 BSLS +#define MAGIC_KEY_BOOTLOADER ESC + #define MOUSEKEY_DELAY 50 #define MOUSEKEY_INTERVAL 15 #define MOUSEKEY_MAX_SPEED 4 @@ -12,6 +18,3 @@ #define PERMISSIVE_HOLD #define TAPPING_TERM 200 #define TAPPING_TOGGLE 2 - -#undef IS_COMMAND -#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RCTL))) diff --git a/keyboards/whitefox/keymaps/konstantin/keymap.c b/keyboards/whitefox/keymaps/konstantin/keymap.c index edb049287..6732d9a01 100644 --- a/keyboards/whitefox/keymaps/konstantin/keymap.c +++ b/keyboards/whitefox/keymaps/konstantin/keymap.c @@ -1,25 +1,29 @@ #include QMK_KEYBOARD_H +#define TOP LCTL(KC_HOME) +#define BOTTOM LCTL(KC_END) +#define DSKTP_L LCTL(LGUI(KC_LEFT)) +#define DSKTP_R LCTL(LGUI(KC_RGHT)) + #define FN MO(L_FN) #define FN_CAPS LT(L_FN, KC_CAPS) -#define FN_RCTL TD(TD_FN_RCTL) // Unused -#define RLALT TD(TD_RLALT) // Unused +#define FN_FNLK TT(L_FN) + #define DESKTOP TD(TD_DESKTOP) +#define FN_RCTL TD(TD_FN_RCTL) +#define RAL_LAL TD(TD_RAL_LAL) +#define RAL_RGU TD(TD_RAL_RGU) +#define RCT_RSF TD(TD_RCT_RSF) -#define DESKT_L LCTL(LGUI(KC_LEFT)) -#define DESKT_R LCTL(LGUI(KC_RGHT)) -#define TOP LCTL(KC_HOME) -#define BOTTOM LCTL(KC_END) +#define COMMA UC(0x002C) +#define L_PAREN UC(0x0028) +#define R_PAREN UC(0x0029) +#define EQUALS UC(0x003D) +#define TIMES UC(0x00D7) +#define DIVIDE UC(0x00F7) +#define MINUS UC(0x2212) -#define UC_COMM UC(0x002C) -#define UC_LPRN UC(0x0028) -#define UC_RPRN UC(0x0029) -#define UC_EQLS UC(0x003D) -#define UC_MULS UC(0x00D7) -#define UC_DIVS UC(0x00F7) -#define UC_MINS UC(0x2212) - -void matrix_init_user(void) { +void eeconfig_init_user(void) { set_unicode_input_mode(UC_WINC); } @@ -37,7 +41,9 @@ enum custom_keycodes { bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch (keycode) { case CLEAR: - if (record->event.pressed) { SEND_STRING(SS_LCTRL("a") SS_TAP(X_DELETE)); } + if (record->event.pressed) { + SEND_STRING(SS_LCTRL("a") SS_TAP(X_DELETE)); + } return false; case NUMPAD: @@ -55,90 +61,142 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } } +struct { + bool fn_on; // Layer state when tap dance started + bool started; +} td_fn_rctrl_data; + +void td_fn_rctrl_each(qk_tap_dance_state_t *state, void *user_data) { + if (!td_fn_rctrl_data.started) { + td_fn_rctrl_data.fn_on = IS_LAYER_ON(L_FN); + td_fn_rctrl_data.started = true; + } + // Single tap → Fn, double tap → RCtrl, triple tap etc. → Fn+RCtrl + if (state->count == 1 || state->count == 3) { + layer_on(L_FN); + } else if (state->count == 2) { + if (!td_fn_rctrl_data.fn_on) { + layer_off(L_FN); + } + register_code(KC_RCTL); + } +} + +void td_fn_rctrl_reset(qk_tap_dance_state_t *state, void *user_data) { + if ((state->count == 1 || state->count > 2) && !td_fn_rctrl_data.fn_on) { + layer_off(L_FN); + } + if (state->count >= 2) { + unregister_code(KC_RCTL); + } + td_fn_rctrl_data.started = false; +} + +#define ACTION_TAP_DANCE_DOUBLE_MODS(mod1, mod2) { \ + .fn = { td_double_mods_each, NULL, td_double_mods_reset }, \ + .user_data = &(qk_tap_dance_pair_t){ mod1, mod2 }, \ + } + +void td_double_mods_each(qk_tap_dance_state_t *state, void *user_data) { + qk_tap_dance_pair_t *mods = (qk_tap_dance_pair_t *)user_data; + // Single tap → mod1, double tap → mod2, triple tap etc. → mod1+mod2 + if (state->count == 1 || state->count == 3) { + register_code(mods->kc1); + } else if (state->count == 2) { + unregister_code(mods->kc1); + register_code(mods->kc2); + } + // Prevent tap dance from sending kc1 and kc2 as weak mods + state->weak_mods &= ~(MOD_BIT(mods->kc1) | MOD_BIT(mods->kc2)); +} + +void td_double_mods_reset(qk_tap_dance_state_t *state, void *user_data) { + qk_tap_dance_pair_t *mods = (qk_tap_dance_pair_t *)user_data; + if (state->count == 1 || state->count > 2) { + unregister_code(mods->kc1); + } + if (state->count >= 2) { + unregister_code(mods->kc2); + } +} + enum tap_dance { - TD_FN_RCTL, - TD_RLALT, TD_DESKTOP, + TD_FN_RCTL, + TD_RAL_LAL, + TD_RAL_RGU, + TD_RCT_RSF, }; -void td_fn_rctl_finished(qk_tap_dance_state_t *state, void *user_data) { - // Single tap → Fn, double tap → RCtrl, triple tap → Fn+RCtrl etc. - if (state->count & 1) { layer_on(L_FN); } - if (state->count & 2) { register_code(KC_RCTL); } -} - -void td_fn_rctl_reset(qk_tap_dance_state_t *state, void *user_data) { - if (state->count & 1) { layer_off(L_FN); } - if (state->count & 2) { unregister_code(KC_RCTL); } -} - qk_tap_dance_action_t tap_dance_actions[] = { - [TD_FN_RCTL] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, td_fn_rctl_finished, td_fn_rctl_reset), - [TD_RLALT] = ACTION_TAP_DANCE_DOUBLE(KC_RALT, KC_LALT), [TD_DESKTOP] = ACTION_TAP_DANCE_DOUBLE(LCTL(LGUI(KC_D)), LCTL(LGUI(KC_F4))), // Add/close virtual desktop + [TD_FN_RCTL] = ACTION_TAP_DANCE_FN_ADVANCED(td_fn_rctrl_each, NULL, td_fn_rctrl_reset), + [TD_RAL_LAL] = ACTION_TAP_DANCE_DOUBLE_MODS(KC_RALT, KC_LALT), + [TD_RAL_RGU] = ACTION_TAP_DANCE_DOUBLE_MODS(KC_RALT, KC_RGUI), + [TD_RCT_RSF] = ACTION_TAP_DANCE_DOUBLE_MODS(KC_RCTL, KC_RSFT), }; -const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Base layer - * ,---------------------------------------------------------------. - * |Esc| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` |PSc| - * |---------------------------------------------------------------| - * | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] |Bspc |Del| - * |---------------------------------------------------------------| - * |FnCaps| A | S | D | F | G | H | J | K | L | ; | ' | Enter |PgU| - * |---------------------------------------------------------------| - * | LShift | Z | X | C | V | B | N | M | , | . | / |RCtrl | ↑ |PgD| - * |---------------------------------------------------------------| - * |LCtl|LGui|LAlt| Space |RAlt| Fn | | ← | ↓ | → | - * `---------------------------------------------------------------' + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ + * │Esc│ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ \ │ ` │PSc│ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┼───┤ + * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │Bspc │Del│ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤ + * │FnCaps│ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ Enter │PgU│ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤ + * │ LShift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │CtlSft│ ↑ │PgD│ + * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬─┬───┼───┼───┤ + * │LCtl│LGui│LAlt│ Space │AlGu│FnLk│ │ ← │ ↓ │ → │ + * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘ */ [L_BASE] = LAYOUT_truefox( \ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL, KC_BSLS,KC_GRV, KC_PSCR, \ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC,KC_BSPC, KC_DEL, \ FN_CAPS,KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_ENT, KC_PGUP, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,KC_RCTL, KC_UP, KC_PGDN, \ - KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,FN, KC_LEFT,KC_DOWN,KC_RGHT \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,RCT_RSF, KC_UP, KC_PGDN, \ + KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, RAL_RGU,FN_FNLK, KC_LEFT,KC_DOWN,KC_RGHT \ ), /* Function layer - * ,---------------------------------------------------------------. - * | |F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12|Num|Scr|Pau| - * |---------------------------------------------------------------| - * | M4 |M2 |M↑ |M1 |M3 |M5 | | | |Stp|Ply|Prv|Nxt|Clear|Ins| - * |---------------------------------------------------------------| - * | |M← |M↓ |M→ |MW↑| | | | | | | | |Top| - * |---------------------------------------------------------------| - * | |MA0|MA2|MW←|MW→| | | |VoD|VoU|Mut| App |PgU|Btm| - * |---------------------------------------------------------------| - * | |Dstp|Dst←| MW↓ |Dst→| | |Hom|PgD|End| - * `---------------------------------------------------------------' + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ + * │ │F1 │F2 │F3 │F4 │F5 │F6 │F7 │F8 │F9 │F10│F11│F12│Num│Scr│Pau│ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┼───┤ + * │ M4 │M2 │M↑ │M1 │M3 │M5 │ │ │ │Stp│Ply│Prv│Nxt│Clear│Ins│ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤ + * │ │M← │M↓ │M→ │MW↑│ │ │ │ │ │ │ │ │Top│ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤ + * │ │MA0│MA2│MW←│MW→│ │ │ │VoD│VoU│Mut│ App │PgU│Btm│ + * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬─┬───┼───┼───┤ + * │ │Dstp│Dst←│ MW↓ │Dst→│ │ │Hom│PgD│End│ + * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘ */ [L_FN] = LAYOUT_truefox( \ _______,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, NUMPAD, KC_SLCK,KC_PAUS, \ KC_BTN4,KC_BTN2,KC_MS_U,KC_BTN1,KC_BTN3,KC_BTN5,_______,_______,_______,KC_MSTP,KC_MPLY,KC_MPRV,KC_MNXT,CLEAR, KC_INS, \ _______,KC_MS_L,KC_MS_D,KC_MS_R,KC_WH_U,_______,_______,_______,_______,_______,_______,_______, _______, TOP, \ _______, KC_ACL0,KC_ACL2,KC_WH_L,KC_WH_R,_______,_______,_______,KC_VOLD,KC_VOLU,KC_MUTE,KC_APP, KC_PGUP,BOTTOM, \ - _______,DESKTOP,DESKT_L, KC_WH_D, DESKT_R,_______, KC_HOME,KC_PGDN,KC_END \ + _______,DESKTOP,DSKTP_L, KC_WH_D, DSKTP_R,_______, KC_HOME,KC_PGDN,KC_END \ ), /* Numpad layer - * ,---------------------------------------------------------------. - * |Num| | | | | | |P7 |P8 |P9 |P- | − | = |Num| | | - * |---------------------------------------------------------------| - * | | | | | | | |P4 |P5 |P6 |P+ | ( | ) | | | - * |---------------------------------------------------------------| - * | | | | | | | |P1 |P2 |P3 |P* | × | PEnter | | - * |---------------------------------------------------------------| - * | | | | | | |P0 |P0 | , |P. |P/ | ÷ | | | - * |---------------------------------------------------------------| - * | | | | | | | | | | | - * `---------------------------------------------------------------' + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ + * │Num│ │ │ │ │ │ │P7 │P8 │P9 │P- │ − │ = │Num│ │ │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┼───┤ + * │ │ │ │ │ │ │ │P4 │P5 │P6 │P+ │ ( │ ) │ │ │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤ + * │ │ │ │ │ │ │ │P1 │P2 │P3 │P* │ × │ PEnter │ │ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤ + * │ │ │ │ │ │ │P0 │P0 │ , │P. │P/ │ ÷ │ │ │ + * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬─┬───┼───┼───┤ + * │ │ │ │ │ │ │ │ │ │ │ + * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘ */ [L_NUMPAD] = LAYOUT_truefox( \ - NUMPAD, _______,_______,_______,_______,_______,_______,KC_P7, KC_P8, KC_P9, KC_PMNS,UC_MINS,UC_EQLS,NUMPAD, _______,_______, \ - _______,_______,_______,_______,_______,_______,_______,KC_P4, KC_P5, KC_P6, KC_PPLS,UC_LPRN,UC_RPRN,_______, _______, \ - _______,_______,_______,_______,_______,_______,_______,KC_P1, KC_P2, KC_P3, KC_PAST,UC_MULS, KC_PENT, _______, \ - _______, _______,_______,_______,_______,_______,KC_P0, KC_P0, UC_COMM,KC_PDOT,KC_PSLS,UC_DIVS, _______,_______, \ + NUMPAD, _______,_______,_______,_______,_______,_______,KC_P7, KC_P8, KC_P9, KC_PMNS,MINUS, EQUALS, NUMPAD, _______,_______, \ + _______,_______,_______,_______,_______,_______,_______,KC_P4, KC_P5, KC_P6, KC_PPLS,L_PAREN,R_PAREN,_______, _______, \ + _______,_______,_______,_______,_______,_______,_______,KC_P1, KC_P2, KC_P3, KC_PAST,TIMES, KC_PENT, _______, \ + _______, _______,_______,_______,_______,_______,KC_P0, KC_P0, COMMA, KC_PDOT,KC_PSLS,DIVIDE, _______,_______, \ _______,_______,_______, _______, _______,_______, _______,_______,_______ \ ), }; diff --git a/keyboards/whitefox/keymaps/konstantin/rules.mk b/keyboards/whitefox/keymaps/konstantin/rules.mk index f1f3d2378..abf92c2c4 100644 --- a/keyboards/whitefox/keymaps/konstantin/rules.mk +++ b/keyboards/whitefox/keymaps/konstantin/rules.mk @@ -1,4 +1,10 @@ +BACKLIGHT_ENABLE = no BOOTMAGIC_ENABLE = no +COMMAND_ENABLE = yes CONSOLE_ENABLE = yes +EXTRAKEY_ENABLE = yes +MOUSEKEY_ENABLE = yes +NKRO_ENABLE = yes TAP_DANCE_ENABLE = yes UNICODE_ENABLE = yes +VISUALIZER_ENABLE = no From a95fc388fd85ffddcaf07e56ce5a147458fad47c Mon Sep 17 00:00:00 2001 From: Jeremy Herve Date: Mon, 5 Nov 2018 15:04:52 +0100 Subject: [PATCH 455/788] Redox: move curly brackets one row down. (#4364) In #4258, the 2 curly brackets were inadvertently moved one row up. This fixes that. --- keyboards/redox/keymaps/jeherve/keymap.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/keyboards/redox/keymaps/jeherve/keymap.c b/keyboards/redox/keymaps/jeherve/keymap.c index f8dfc4854..c2852f312 100644 --- a/keyboards/redox/keymaps/jeherve/keymap.c +++ b/keyboards/redox/keymaps/jeherve/keymap.c @@ -158,7 +158,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ KC_LSFT ,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,TT(_NAV),TT(_SYMB), TT(_SYMB),TT(_NAV),KC_K ,KC_M ,KC_COMM ,KC_DOT ,KC_SLSH ,KC_RSFT , //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ - MO_INTR ,KC_LCTL ,KC_HYPR ,KC_LALT , KC_LCMD , KC_BSPC ,KC_LCTL , KC_ENT ,KC_SPC , KC_RCMD , TT_ADJ ,KC_HYPR ,KC_RCTL ,MO_INTR + MO_INTR ,KC_LCTL ,KC_HYPR ,KC_LALT , KC_LCMD , KC_BSPC ,KC_LCTL , KC_ENT ,KC_SPC , KC_RCMD , TT_ADJ ,KC_HYPR ,KC_RCTL ,MO_INTR //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ), @@ -166,13 +166,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ _______ ,_______ ,_______ ,_______ ,_______ ,_______ , _______ ,_______ ,_______ ,_______ ,_______ ,_______ , //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ - _______ ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 ,KC_LCBR , KC_RCBR ,KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,_______ , + _______ ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 ,_______ , _______ ,KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,_______ , //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ - _______ ,KC_EXLM ,KC_AT ,KC_HASH ,KC_DLR ,KC_PERC ,_______ , _______ ,KC_CIRC ,KC_AMPR ,KC_ASTR ,KC_MINS ,KC_UNDS ,_______ , + _______ ,KC_EXLM ,KC_AT ,KC_HASH ,KC_DLR ,KC_PERC ,KC_LCBR , KC_RCBR ,KC_CIRC ,KC_AMPR ,KC_ASTR ,KC_MINS ,KC_UNDS ,_______ , //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ _______ ,_______ ,_______ ,_______ ,_______ ,_______ ,_______ ,_______ , _______ ,_______ ,_______ ,_______ ,_______ ,_______ ,_______ ,_______ , //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ - _______ ,_______ ,_______ ,_______ , _______ , _______ ,_______ , _______ ,_______ , _______ , _______ ,_______ ,_______ ,_______ + _______ ,_______ ,_______ ,_______ , _______ , _______ ,_______ , _______ ,_______ , _______ , _______ ,_______ ,_______ ,_______ //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ), @@ -186,7 +186,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ , _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ - _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,_______ , _______ ,XXXXXXX , XXXXXXX , _______ ,XXXXXXX ,XXXXXXX ,_______ + _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,_______ , _______ ,XXXXXXX , XXXXXXX , _______ ,XXXXXXX ,XXXXXXX ,_______ //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ), @@ -200,7 +200,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ XXXXXXX ,UC_00E2 ,XXXXXXX ,UC_00E7 ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ , _______ ,XXXXXXX ,XXXXXXX ,UC_0171 ,UC_00EA ,XXXXXXX ,UC_0151 ,XXXXXXX , //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ - _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,_______ , _______ ,NBSP , XXXXXXX , _______ ,XXXXXXX ,XXXXXXX ,_______ + _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,_______ , _______ ,NBSP , XXXXXXX , _______ ,XXXXXXX ,XXXXXXX ,_______ //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ), @@ -214,7 +214,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ , _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ - _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,_______ , _______ ,XXXXXXX , XXXXXXX , _______ ,XXXXXXX ,XXXXXXX ,_______ + _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,_______ , _______ ,XXXXXXX , XXXXXXX , _______ ,XXXXXXX ,XXXXXXX ,_______ //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ) From a49d0a1e83d686a6c7a0673ffbd691f80908ea6f Mon Sep 17 00:00:00 2001 From: Danny Date: Mon, 5 Nov 2018 14:00:38 -0500 Subject: [PATCH 456/788] Keyboard: Add Nyquist Rev 3 (#4287) * Add Nyquist Rev 3 * Switch to split_common --- keyboards/nyquist/eeprom-lefthand.eep | 2 - keyboards/nyquist/eeprom-righthand.eep | 2 - keyboards/nyquist/i2c.c | 162 ------- keyboards/nyquist/i2c.h | 49 -- keyboards/nyquist/info.json | 3 + keyboards/nyquist/keymaps/default/config.h | 7 +- keyboards/nyquist/keymaps/default/rules.mk | 4 - keyboards/nyquist/keymaps/hexwire/config.h | 7 +- keyboards/nyquist/keymaps/hexwire/rules.mk | 3 - keyboards/nyquist/matrix.c | 497 --------------------- keyboards/nyquist/nyquist.h | 8 +- keyboards/nyquist/rev1/config.h | 7 +- keyboards/nyquist/rev1/rev1.h | 5 +- keyboards/nyquist/rev2/config.h | 7 +- keyboards/nyquist/rev2/rev2.h | 5 +- keyboards/nyquist/rev3/config.h | 81 ++++ keyboards/nyquist/rev3/rev3.c | 21 + keyboards/nyquist/rev3/rev3.h | 63 +++ keyboards/nyquist/rev3/rules.mk | 1 + keyboards/nyquist/rules.mk | 20 +- keyboards/nyquist/serial.c | 228 ---------- keyboards/nyquist/serial.h | 26 -- keyboards/nyquist/split_util.c | 86 ---- keyboards/nyquist/split_util.h | 20 - 24 files changed, 188 insertions(+), 1126 deletions(-) delete mode 100644 keyboards/nyquist/eeprom-lefthand.eep delete mode 100644 keyboards/nyquist/eeprom-righthand.eep delete mode 100644 keyboards/nyquist/i2c.c delete mode 100644 keyboards/nyquist/i2c.h delete mode 100644 keyboards/nyquist/matrix.c create mode 100644 keyboards/nyquist/rev3/config.h create mode 100644 keyboards/nyquist/rev3/rev3.c create mode 100644 keyboards/nyquist/rev3/rev3.h create mode 100644 keyboards/nyquist/rev3/rules.mk delete mode 100644 keyboards/nyquist/serial.c delete mode 100644 keyboards/nyquist/serial.h delete mode 100644 keyboards/nyquist/split_util.c delete mode 100644 keyboards/nyquist/split_util.h diff --git a/keyboards/nyquist/eeprom-lefthand.eep b/keyboards/nyquist/eeprom-lefthand.eep deleted file mode 100644 index b9666a74c..000000000 --- a/keyboards/nyquist/eeprom-lefthand.eep +++ /dev/null @@ -1,2 +0,0 @@ -:0B0000000000000000000000000001F4 -:00000001FF diff --git a/keyboards/nyquist/eeprom-righthand.eep b/keyboards/nyquist/eeprom-righthand.eep deleted file mode 100644 index 94cc5be7f..000000000 --- a/keyboards/nyquist/eeprom-righthand.eep +++ /dev/null @@ -1,2 +0,0 @@ -:0B0000000000000000000000000000F5 -:00000001FF diff --git a/keyboards/nyquist/i2c.c b/keyboards/nyquist/i2c.c deleted file mode 100644 index 084c890c4..000000000 --- a/keyboards/nyquist/i2c.c +++ /dev/null @@ -1,162 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include "i2c.h" - -#ifdef USE_I2C - -// Limits the amount of we wait for any one i2c transaction. -// Since were running SCL line 100kHz (=> 10μs/bit), and each transactions is -// 9 bits, a single transaction will take around 90μs to complete. -// -// (F_CPU/SCL_CLOCK) => # of μC cycles to transfer a bit -// poll loop takes at least 8 clock cycles to execute -#define I2C_LOOP_TIMEOUT (9+1)*(F_CPU/SCL_CLOCK)/8 - -#define BUFFER_POS_INC() (slave_buffer_pos = (slave_buffer_pos+1)%SLAVE_BUFFER_SIZE) - -volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE]; - -static volatile uint8_t slave_buffer_pos; -static volatile bool slave_has_register_set = false; - -// Wait for an i2c operation to finish -inline static -void i2c_delay(void) { - uint16_t lim = 0; - while(!(TWCR & (1<10. - // Check datasheets for more info. - TWBR = ((F_CPU/SCL_CLOCK)-16)/2; -} - -// Start a transaction with the given i2c slave address. The direction of the -// transfer is set with I2C_READ and I2C_WRITE. -// returns: 0 => success -// 1 => error -uint8_t i2c_master_start(uint8_t address) { - TWCR = (1< slave ACK -// 1 => slave NACK -uint8_t i2c_master_write(uint8_t data) { - TWDR = data; - TWCR = (1<= SLAVE_BUFFER_SIZE ) { - ack = 0; - slave_buffer_pos = 0; - } - slave_has_register_set = true; - } else { - i2c_slave_buffer[slave_buffer_pos] = TWDR; - BUFFER_POS_INC(); - } - break; - - case TW_ST_SLA_ACK: - case TW_ST_DATA_ACK: - // master has addressed this device as a slave transmitter and is - // requesting data. - TWDR = i2c_slave_buffer[slave_buffer_pos]; - BUFFER_POS_INC(); - break; - - case TW_BUS_ERROR: // something went wrong, reset twi state - TWCR = 0; - default: - break; - } - // Reset everything, so we are ready for the next TWI interrupt - TWCR |= (1< - -#ifndef F_CPU -#define F_CPU 16000000UL -#endif - -#define I2C_READ 1 -#define I2C_WRITE 0 - -#define I2C_ACK 1 -#define I2C_NACK 0 - -#define SLAVE_BUFFER_SIZE 0x10 - -// i2c SCL clock frequency -#define SCL_CLOCK 100000L - -extern volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE]; - -void i2c_master_init(void); -uint8_t i2c_master_start(uint8_t address); -void i2c_master_stop(void); -uint8_t i2c_master_write(uint8_t data); -uint8_t i2c_master_read(int); -void i2c_reset_state(void); -void i2c_slave_init(uint8_t address); - - -static inline unsigned char i2c_start_read(unsigned char addr) { - return i2c_master_start((addr << 1) | I2C_READ); -} - -static inline unsigned char i2c_start_write(unsigned char addr) { - return i2c_master_start((addr << 1) | I2C_WRITE); -} - -// from SSD1306 scrips -extern unsigned char i2c_rep_start(unsigned char addr); -extern void i2c_start_wait(unsigned char addr); -extern unsigned char i2c_readAck(void); -extern unsigned char i2c_readNak(void); -extern unsigned char i2c_read(unsigned char ack); - -#define i2c_read(ack) (ack) ? i2c_readAck() : i2c_readNak(); - -#endif diff --git a/keyboards/nyquist/info.json b/keyboards/nyquist/info.json index 0a038f6dd..295864cfc 100644 --- a/keyboards/nyquist/info.json +++ b/keyboards/nyquist/info.json @@ -7,6 +7,9 @@ "layouts": { "LAYOUT": { "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":7, "y":1}, {"x":8, "y":1}, {"x":9, "y":1}, {"x":10, "y":1}, {"x":11, "y":1}, {"x":12, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2}, {"x":5, "y":2}, {"x":7, "y":2}, {"x":8, "y":2}, {"x":9, "y":2}, {"x":10, "y":2}, {"x":11, "y":2}, {"x":12, "y":2}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":4, "y":3}, {"x":5, "y":3}, {"x":7, "y":3}, {"x":8, "y":3}, {"x":9, "y":3}, {"x":10, "y":3}, {"x":11, "y":3}, {"x":12, "y":3}, {"x":0, "y":4}, {"x":1, "y":4}, {"x":2, "y":4}, {"x":3, "y":4}, {"x":4, "y":4}, {"x":5, "y":4}, {"x":7, "y":4}, {"x":8, "y":4}, {"x":9, "y":4}, {"x":10, "y":4}, {"x":11, "y":4}, {"x":12, "y":4}] + }, + "LAYOUT_ortho_5x12": { + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":7, "y":1}, {"x":8, "y":1}, {"x":9, "y":1}, {"x":10, "y":1}, {"x":11, "y":1}, {"x":12, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2}, {"x":5, "y":2}, {"x":7, "y":2}, {"x":8, "y":2}, {"x":9, "y":2}, {"x":10, "y":2}, {"x":11, "y":2}, {"x":12, "y":2}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":4, "y":3}, {"x":5, "y":3}, {"x":7, "y":3}, {"x":8, "y":3}, {"x":9, "y":3}, {"x":10, "y":3}, {"x":11, "y":3}, {"x":12, "y":3}, {"x":0, "y":4}, {"x":1, "y":4}, {"x":2, "y":4}, {"x":3, "y":4}, {"x":4, "y":4}, {"x":5, "y":4}, {"x":7, "y":4}, {"x":8, "y":4}, {"x":9, "y":4}, {"x":10, "y":4}, {"x":11, "y":4}, {"x":12, "y":4}] } } } diff --git a/keyboards/nyquist/keymaps/default/config.h b/keyboards/nyquist/keymaps/default/config.h index c4604af43..0fa606f29 100644 --- a/keyboards/nyquist/keymaps/default/config.h +++ b/keyboards/nyquist/keymaps/default/config.h @@ -15,10 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "config_common.h" +#pragma once /* Use I2C or Serial, not both */ @@ -37,5 +34,3 @@ along with this program. If not, see . #define RGBLIGHT_HUE_STEP 8 #define RGBLIGHT_SAT_STEP 8 #define RGBLIGHT_VAL_STEP 8 - -#endif diff --git a/keyboards/nyquist/keymaps/default/rules.mk b/keyboards/nyquist/keymaps/default/rules.mk index 1e5761278..1e3cebb14 100644 --- a/keyboards/nyquist/keymaps/default/rules.mk +++ b/keyboards/nyquist/keymaps/default/rules.mk @@ -1,5 +1 @@ RGBLIGHT_ENABLE = yes - -ifndef QUANTUM_DIR - include ../../../../Makefile -endif diff --git a/keyboards/nyquist/keymaps/hexwire/config.h b/keyboards/nyquist/keymaps/hexwire/config.h index 8b9c3ea2b..4f1901b5d 100644 --- a/keyboards/nyquist/keymaps/hexwire/config.h +++ b/keyboards/nyquist/keymaps/hexwire/config.h @@ -15,10 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "config_common.h" +#pragma once /* Use I2C or Serial, not both */ @@ -39,5 +36,3 @@ along with this program. If not, see . #define RGBLIGHT_HUE_STEP 8 #define RGBLIGHT_SAT_STEP 8 #define RGBLIGHT_VAL_STEP 8 - -#endif diff --git a/keyboards/nyquist/keymaps/hexwire/rules.mk b/keyboards/nyquist/keymaps/hexwire/rules.mk index 1e5761278..a81250cdf 100644 --- a/keyboards/nyquist/keymaps/hexwire/rules.mk +++ b/keyboards/nyquist/keymaps/hexwire/rules.mk @@ -1,5 +1,2 @@ RGBLIGHT_ENABLE = yes -ifndef QUANTUM_DIR - include ../../../../Makefile -endif diff --git a/keyboards/nyquist/matrix.c b/keyboards/nyquist/matrix.c deleted file mode 100644 index 3cdad4adb..000000000 --- a/keyboards/nyquist/matrix.c +++ /dev/null @@ -1,497 +0,0 @@ -/* -Copyright 2017 Danny Nguyen - -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 . -*/ - -/* - * scan matrix - */ -#include -#include -#include -#include "wait.h" -#include "print.h" -#include "debug.h" -#include "util.h" -#include "matrix.h" -#include "split_util.h" -#include "pro_micro.h" -#include "config.h" -#include "timer.h" - -#ifdef BACKLIGHT_ENABLE - #include "backlight.h" - extern backlight_config_t backlight_config; -#endif - -#ifdef USE_I2C -# include "i2c.h" -#else // USE_SERIAL -# include "serial.h" -#endif - -#ifndef DEBOUNCING_DELAY -# define DEBOUNCING_DELAY 5 -#endif - -#if (DEBOUNCING_DELAY > 0) - static uint16_t debouncing_time; - static bool debouncing = false; -#endif - -#if (MATRIX_COLS <= 8) -# define print_matrix_header() print("\nr/c 01234567\n") -# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row)) -# define matrix_bitpop(i) bitpop(matrix[i]) -# define ROW_SHIFTER ((uint8_t)1) -#else -# error "Currently only supports 8 COLS" -#endif -static matrix_row_t matrix_debouncing[MATRIX_ROWS]; - -#define ERROR_DISCONNECT_COUNT 5 - -#define SERIAL_LED_ADDR 0x00 - -#define ROWS_PER_HAND (MATRIX_ROWS/2) - -static uint8_t error_count = 0; - -static const uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; -static const uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; - -/* matrix state(1:on, 0:off) */ -static matrix_row_t matrix[MATRIX_ROWS]; -static matrix_row_t matrix_debouncing[MATRIX_ROWS]; - -#if (DIODE_DIRECTION == COL2ROW) - static void init_cols(void); - static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row); - static void unselect_rows(void); - static void select_row(uint8_t row); - static void unselect_row(uint8_t row); -#elif (DIODE_DIRECTION == ROW2COL) - static void init_rows(void); - static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col); - static void unselect_cols(void); - static void unselect_col(uint8_t col); - static void select_col(uint8_t col); -#endif - -__attribute__ ((weak)) -void matrix_init_kb(void) { - matrix_init_user(); -} - -__attribute__ ((weak)) -void matrix_scan_kb(void) { - matrix_scan_user(); -} - -__attribute__ ((weak)) -void matrix_init_user(void) { -} - -__attribute__ ((weak)) -void matrix_scan_user(void) { -} - -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - -void matrix_init(void) -{ -#ifdef DISABLE_JTAG - // JTAG disable for PORT F. write JTD bit twice within four cycles. - MCUCR |= (1< 0) - bool matrix_changed = read_cols_on_row(matrix_debouncing+offset, current_row); - - if (matrix_changed) { - debouncing = true; - debouncing_time = timer_read(); - } - -# else - read_cols_on_row(matrix+offset, current_row); -# endif - - } - -#elif (DIODE_DIRECTION == ROW2COL) - // Set col, read rows - for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) { -# if (DEBOUNCING_DELAY > 0) - bool matrix_changed = read_rows_on_col(matrix_debouncing+offset, current_col); - if (matrix_changed) { - debouncing = true; - debouncing_time = timer_read(); - } -# else - read_rows_on_col(matrix+offset, current_col); -# endif - - } -#endif - -# if (DEBOUNCING_DELAY > 0) - if (debouncing && (timer_elapsed(debouncing_time) > DEBOUNCING_DELAY)) { - for (uint8_t i = 0; i < ROWS_PER_HAND; i++) { - matrix[i+offset] = matrix_debouncing[i+offset]; - } - debouncing = false; - } -# endif - - return 1; -} - -#ifdef USE_I2C - -// Get rows from other half over i2c -int i2c_transaction(void) { - int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; - - int err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_WRITE); - if (err) goto i2c_error; - - // start of matrix stored at 0x00 - err = i2c_master_write(0x00); - if (err) goto i2c_error; - -#ifdef BACKLIGHT_ENABLE - // Write backlight level for slave to read - err = i2c_master_write(backlight_config.enable ? backlight_config.level : 0); -#else - // Write zero, so our byte index is the same - err = i2c_master_write(0x00); -#endif - if (err) goto i2c_error; - - // Start read - err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_READ); - if (err) goto i2c_error; - - if (!err) { - int i; - for (i = 0; i < ROWS_PER_HAND-1; ++i) { - matrix[slaveOffset+i] = i2c_master_read(I2C_ACK); - } - matrix[slaveOffset+i] = i2c_master_read(I2C_NACK); - i2c_master_stop(); - } else { -i2c_error: // the cable is disconnceted, or something else went wrong - i2c_reset_state(); - return err; - } - - return 0; -} - -#else // USE_SERIAL - -int serial_transaction(void) { - int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; - - if (serial_update_buffers()) { - return 1; - } - - for (int i = 0; i < ROWS_PER_HAND; ++i) { - matrix[slaveOffset+i] = serial_slave_buffer[i]; - } - -#ifdef BACKLIGHT_ENABLE - // Write backlight level for slave to read - serial_master_buffer[SERIAL_LED_ADDR] = backlight_config.enable ? backlight_config.level : 0; -#endif - return 0; -} -#endif - -uint8_t matrix_scan(void) -{ - uint8_t ret = _matrix_scan(); - -#ifdef USE_I2C - if( i2c_transaction() ) { -#else // USE_SERIAL - if( serial_transaction() ) { -#endif - // turn on the indicator led when halves are disconnected - TXLED1; - - error_count++; - - if (error_count > ERROR_DISCONNECT_COUNT) { - // reset other half if disconnected - int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; - for (int i = 0; i < ROWS_PER_HAND; ++i) { - matrix[slaveOffset+i] = 0; - } - } - } else { - // turn off the indicator led on no error - TXLED0; - error_count = 0; - } - matrix_scan_quantum(); - return ret; -} - -void matrix_slave_scan(void) { - _matrix_scan(); - - int offset = (isLeftHand) ? 0 : ROWS_PER_HAND; - -#ifdef USE_I2C -#ifdef BACKLIGHT_ENABLE - // Read backlight level sent from master and update level on slave - backlight_set(i2c_slave_buffer[0]); -#endif - for (int i = 0; i < ROWS_PER_HAND; ++i) { - i2c_slave_buffer[i+1] = matrix[offset+i]; - } -#else // USE_SERIAL - for (int i = 0; i < ROWS_PER_HAND; ++i) { - serial_slave_buffer[i] = matrix[offset+i]; - } - -#ifdef BACKLIGHT_ENABLE - // Read backlight level sent from master and update level on slave - backlight_set(serial_master_buffer[SERIAL_LED_ADDR]); -#endif -#endif -} - -bool matrix_is_modified(void) -{ -#if (DEBOUNCING_DELAY > 0) - if (debouncing) return false; -#endif - return true; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ - return (matrix[row] & ((matrix_row_t)1<> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI - } -} - -static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) -{ - // Store last value of row prior to reading - matrix_row_t last_row_value = current_matrix[current_row]; - - // Clear data in matrix row - current_matrix[current_row] = 0; - - // Select row and wait for row selecton to stabilize - select_row(current_row); - wait_us(30); - - // For each col... - for(uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) { - - // Select the col pin to read (active low) - uint8_t pin = col_pins[col_index]; - uint8_t pin_state = (_SFR_IO8(pin >> 4) & _BV(pin & 0xF)); - - // Populate the matrix row with the state of the col pin - current_matrix[current_row] |= pin_state ? 0 : (ROW_SHIFTER << col_index); - } - - // Unselect row - unselect_row(current_row); - - return (last_row_value != current_matrix[current_row]); -} - -static void select_row(uint8_t row) -{ - uint8_t pin = row_pins[row]; - _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT - _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW -} - -static void unselect_row(uint8_t row) -{ - uint8_t pin = row_pins[row]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI -} - -static void unselect_rows(void) -{ - for(uint8_t x = 0; x < ROWS_PER_HAND; x++) { - uint8_t pin = row_pins[x]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI - } -} - -#elif (DIODE_DIRECTION == ROW2COL) - -static void init_rows(void) -{ - for(uint8_t x = 0; x < ROWS_PER_HAND; x++) { - uint8_t pin = row_pins[x]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI - } -} - -static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) -{ - bool matrix_changed = false; - - // Select col and wait for col selecton to stabilize - select_col(current_col); - wait_us(30); - - // For each row... - for(uint8_t row_index = 0; row_index < ROWS_PER_HAND; row_index++) - { - - // Store last value of row prior to reading - matrix_row_t last_row_value = current_matrix[row_index]; - - // Check row pin state - if ((_SFR_IO8(row_pins[row_index] >> 4) & _BV(row_pins[row_index] & 0xF)) == 0) - { - // Pin LO, set col bit - current_matrix[row_index] |= (ROW_SHIFTER << current_col); - } - else - { - // Pin HI, clear col bit - current_matrix[row_index] &= ~(ROW_SHIFTER << current_col); - } - - // Determine if the matrix changed state - if ((last_row_value != current_matrix[row_index]) && !(matrix_changed)) - { - matrix_changed = true; - } - } - - // Unselect col - unselect_col(current_col); - - return matrix_changed; -} - -static void select_col(uint8_t col) -{ - uint8_t pin = col_pins[col]; - _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT - _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW -} - -static void unselect_col(uint8_t col) -{ - uint8_t pin = col_pins[col]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI -} - -static void unselect_cols(void) -{ - for(uint8_t x = 0; x < MATRIX_COLS; x++) { - uint8_t pin = col_pins[x]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI - } -} - -#endif diff --git a/keyboards/nyquist/nyquist.h b/keyboards/nyquist/nyquist.h index d401a45f7..9a3e99647 100644 --- a/keyboards/nyquist/nyquist.h +++ b/keyboards/nyquist/nyquist.h @@ -1,5 +1,4 @@ -#ifndef NYQUIST_H -#define NYQUIST_H +#pragma once #ifdef KEYBOARD_nyquist_rev1 #include "rev1.h" @@ -7,6 +6,9 @@ #ifdef KEYBOARD_nyquist_rev2 #include "rev2.h" #endif +#ifdef KEYBOARD_nyquist_rev3 + #include "rev3.h" +#endif #include "quantum.h" @@ -26,4 +28,4 @@ KC_##L40, KC_##L41, KC_##L42, KC_##L43, KC_##L44, KC_##L45, KC_##R40, KC_##R41, KC_##R42, KC_##R43, KC_##R44, KC_##R45 \ ) -#endif +#define LAYOUT_kc_ortho_5x12 LAYOUT_kc diff --git a/keyboards/nyquist/rev1/config.h b/keyboards/nyquist/rev1/config.h index eec084ecc..35fbaffb9 100644 --- a/keyboards/nyquist/rev1/config.h +++ b/keyboards/nyquist/rev1/config.h @@ -15,10 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef REV1_CONFIG_H -#define REV1_CONFIG_H - -#include QMK_KEYBOARD_CONFIG_H +#pragma once /* USB Device descriptor parameter */ #define VENDOR_ID 0xCB10 @@ -81,5 +78,3 @@ along with this program. If not, see . //#define NO_ACTION_ONESHOT //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION - -#endif diff --git a/keyboards/nyquist/rev1/rev1.h b/keyboards/nyquist/rev1/rev1.h index 2d4c9f73e..6d3a23383 100644 --- a/keyboards/nyquist/rev1/rev1.h +++ b/keyboards/nyquist/rev1/rev1.h @@ -1,5 +1,4 @@ -#ifndef REV1_H -#define REV1_H +#pragma once #include "nyquist.h" @@ -64,5 +63,3 @@ #endif #define LAYOUT_ortho_5x12 LAYOUT - -#endif diff --git a/keyboards/nyquist/rev2/config.h b/keyboards/nyquist/rev2/config.h index ab062c920..7dc743b27 100644 --- a/keyboards/nyquist/rev2/config.h +++ b/keyboards/nyquist/rev2/config.h @@ -15,10 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef REV2_CONFIG_H -#define REV2_CONFIG_H - -#include QMK_KEYBOARD_CONFIG_H +#pragma once /* USB Device descriptor parameter */ #define VENDOR_ID 0xCB10 @@ -82,5 +79,3 @@ along with this program. If not, see . //#define NO_ACTION_ONESHOT //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION - -#endif diff --git a/keyboards/nyquist/rev2/rev2.h b/keyboards/nyquist/rev2/rev2.h index 1eec5d2be..6d3a23383 100644 --- a/keyboards/nyquist/rev2/rev2.h +++ b/keyboards/nyquist/rev2/rev2.h @@ -1,5 +1,4 @@ -#ifndef REV2_H -#define REV2_H +#pragma once #include "nyquist.h" @@ -64,5 +63,3 @@ #endif #define LAYOUT_ortho_5x12 LAYOUT - -#endif diff --git a/keyboards/nyquist/rev3/config.h b/keyboards/nyquist/rev3/config.h new file mode 100644 index 000000000..6c51bc9a8 --- /dev/null +++ b/keyboards/nyquist/rev3/config.h @@ -0,0 +1,81 @@ +/* +Copyright 2017 Danny Nguyen + +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 . +*/ + +#pragma once + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xCB10 +#define PRODUCT_ID 0x1156 +#define DEVICE_VER 0x0300 +#define MANUFACTURER Keebio +#define PRODUCT The Nyquist Keyboard +#define DESCRIPTION Split 60 percent ortholinear keyboard + +/* key matrix size */ +// Rows are doubled-up +#define MATRIX_ROWS 10 +#define MATRIX_COLS 6 + +// wiring of each half +#define MATRIX_ROW_PINS { F0, F5, D7, F6, F7 } +#define MATRIX_COL_PINS { F1, F4, B7, D2, D3, D4 } + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCING_DELAY 5 + +/* 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 + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* ws2812 RGB LED */ +#define RGB_DI_PIN B4 +#define RGBLIGHT_TIMER +#define RGBLED_NUM 12 + +/* Backlight LEDs */ +#define BACKLIGHT_PIN D5 +#define BACKLIGHT_LEVELS 7 + +/* + * 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 diff --git a/keyboards/nyquist/rev3/rev3.c b/keyboards/nyquist/rev3/rev3.c new file mode 100644 index 000000000..34500fb10 --- /dev/null +++ b/keyboards/nyquist/rev3/rev3.c @@ -0,0 +1,21 @@ +#include "rev3.h" + +#ifdef SSD1306OLED +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + led_set_user(usb_led); +} +#endif + +void matrix_init_kb(void) { + + // // green led on + // DDRD |= (1<<5); + // PORTD &= ~(1<<5); + + // // orange led on + // DDRB |= (1<<0); + // PORTB &= ~(1<<0); + + matrix_init_user(); +}; diff --git a/keyboards/nyquist/rev3/rev3.h b/keyboards/nyquist/rev3/rev3.h new file mode 100644 index 000000000..3a3141f6e --- /dev/null +++ b/keyboards/nyquist/rev3/rev3.h @@ -0,0 +1,63 @@ +#pragma once + +#include "nyquist.h" +#include "quantum.h" + +#ifdef USE_I2C +#include +#ifdef __AVR__ + #include + #include +#endif +#endif + +//void promicro_bootloader_jmp(bool program); + +#ifndef FLIP_HALF +// Standard Keymap +// (TRRS jack on the left half is to the right, TRRS jack on the right half is to the left) +#define LAYOUT( \ + L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \ + L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \ + L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \ + L30, L31, L32, L33, L34, L35, R30, R31, R32, R33, R34, R35, \ + L40, L41, L42, L43, L44, L45, R40, R41, R42, R43, R44, R45 \ + ) \ + { \ + { L00, L01, L02, L03, L04, L05 }, \ + { L10, L11, L12, L13, L14, L15 }, \ + { L20, L21, L22, L23, L24, L25 }, \ + { L30, L31, L32, L33, L34, L35 }, \ + { L40, L41, L42, L43, L44, L45 }, \ + { R05, R04, R03, R02, R01, R00 }, \ + { R15, R14, R13, R12, R11, R10 }, \ + { R25, R24, R23, R22, R21, R20 }, \ + { R35, R34, R33, R32, R31, R30 }, \ + { R45, R44, R43, R42, R41, R40 } \ + } +#else +// Keymap with right side flipped +// (TRRS jack on both halves are to the right) +#define LAYOUT( \ + L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \ + L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \ + L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \ + L30, L31, L32, L33, L34, L35, R30, R31, R32, R33, R34, R35, \ + L40, L41, L42, L43, L44, L45, R40, R41, R42, R43, R44, R45 \ + ) \ + { \ + { L00, L01, L02, L03, L04, L05 }, \ + { L10, L11, L12, L13, L14, L15 }, \ + { L20, L21, L22, L23, L24, L25 }, \ + { L30, L31, L32, L33, L34, L35 }, \ + { L40, L41, L42, L43, L44, L45 }, \ + { R00, R01, R02, R03, R04, R05 }, \ + { R10, R11, R12, R13, R14, R15 }, \ + { R20, R21, R22, R23, R24, R25 }, \ + { R30, R31, R32, R33, R34, R35 }, \ + { R40, R41, R42, R43, R44, R45 } \ + } +#endif + +#define LAYOUT_ortho_5x12 LAYOUT + diff --git a/keyboards/nyquist/rev3/rules.mk b/keyboards/nyquist/rev3/rules.mk new file mode 100644 index 000000000..bd518d8f2 --- /dev/null +++ b/keyboards/nyquist/rev3/rules.mk @@ -0,0 +1 @@ +BACKLIGHT_ENABLE = yes diff --git a/keyboards/nyquist/rules.mk b/keyboards/nyquist/rules.mk index 74d5625f8..5313b8502 100644 --- a/keyboards/nyquist/rules.mk +++ b/keyboards/nyquist/rules.mk @@ -1,8 +1,3 @@ -SRC += matrix.c \ - i2c.c \ - split_util.c \ - serial.c - # MCU name #MCU = at90usb1287 MCU = atmega32u4 @@ -41,9 +36,13 @@ F_USB = $(F_CPU) # Bootloader # This definition is optional, and if your keyboard supports multiple bootloaders of -# different sizes, comment this out, and the correct address will be loaded +# different sizes, comment this out, and the correct address will be loaded # automatically (+60). See bootloader.mk for all options. -BOOTLOADER = caterina +ifeq ($(strip $(KEYBOARD)), nyquist/rev3) + BOOTLOADER = dfu +else + BOOTLOADER = caterina +endif # Interrupt driven control endpoint task(+60) OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT @@ -63,13 +62,10 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -USE_I2C = yes -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend -CUSTOM_MATRIX = yes - +SPLIT_KEYBOARD = yes LAYOUTS = ortho_5x12 - DEFAULT_FOLDER = nyquist/rev2 diff --git a/keyboards/nyquist/serial.c b/keyboards/nyquist/serial.c deleted file mode 100644 index 74bcbb6bf..000000000 --- a/keyboards/nyquist/serial.c +++ /dev/null @@ -1,228 +0,0 @@ -/* - * WARNING: be careful changing this code, it is very timing dependent - */ - -#ifndef F_CPU -#define F_CPU 16000000 -#endif - -#include -#include -#include -#include -#include "serial.h" - -#ifndef USE_I2C - -// Serial pulse period in microseconds. Its probably a bad idea to lower this -// value. -#define SERIAL_DELAY 24 - -uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; -uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0}; - -#define SLAVE_DATA_CORRUPT (1<<0) -volatile uint8_t status = 0; - -inline static -void serial_delay(void) { - _delay_us(SERIAL_DELAY); -} - -inline static -void serial_output(void) { - SERIAL_PIN_DDR |= SERIAL_PIN_MASK; -} - -// make the serial pin an input with pull-up resistor -inline static -void serial_input(void) { - SERIAL_PIN_DDR &= ~SERIAL_PIN_MASK; - SERIAL_PIN_PORT |= SERIAL_PIN_MASK; -} - -inline static -uint8_t serial_read_pin(void) { - return !!(SERIAL_PIN_INPUT & SERIAL_PIN_MASK); -} - -inline static -void serial_low(void) { - SERIAL_PIN_PORT &= ~SERIAL_PIN_MASK; -} - -inline static -void serial_high(void) { - SERIAL_PIN_PORT |= SERIAL_PIN_MASK; -} - -void serial_master_init(void) { - serial_output(); - serial_high(); -} - -void serial_slave_init(void) { - serial_input(); - - // Enable INT0 - EIMSK |= _BV(INT0); - // Trigger on falling edge of INT0 - EICRA &= ~(_BV(ISC00) | _BV(ISC01)); -} - -// Used by the master to synchronize timing with the slave. -static -void sync_recv(void) { - serial_input(); - // This shouldn't hang if the slave disconnects because the - // serial line will float to high if the slave does disconnect. - while (!serial_read_pin()); - serial_delay(); -} - -// Used by the slave to send a synchronization signal to the master. -static -void sync_send(void) { - serial_output(); - - serial_low(); - serial_delay(); - - serial_high(); -} - -// Reads a byte from the serial line -static -uint8_t serial_read_byte(void) { - uint8_t byte = 0; - serial_input(); - for ( uint8_t i = 0; i < 8; ++i) { - byte = (byte << 1) | serial_read_pin(); - serial_delay(); - _delay_us(1); - } - - return byte; -} - -// Sends a byte with MSB ordering -static -void serial_write_byte(uint8_t data) { - uint8_t b = 8; - serial_output(); - while( b-- ) { - if(data & (1 << b)) { - serial_high(); - } else { - serial_low(); - } - serial_delay(); - } -} - -// interrupt handle to be used by the slave device -ISR(SERIAL_PIN_INTERRUPT) { - sync_send(); - - uint8_t checksum = 0; - for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) { - serial_write_byte(serial_slave_buffer[i]); - sync_send(); - checksum += serial_slave_buffer[i]; - } - serial_write_byte(checksum); - sync_send(); - - // wait for the sync to finish sending - serial_delay(); - - // read the middle of pulses - _delay_us(SERIAL_DELAY/2); - - uint8_t checksum_computed = 0; - for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) { - serial_master_buffer[i] = serial_read_byte(); - sync_send(); - checksum_computed += serial_master_buffer[i]; - } - uint8_t checksum_received = serial_read_byte(); - sync_send(); - - serial_input(); // end transaction - - if ( checksum_computed != checksum_received ) { - status |= SLAVE_DATA_CORRUPT; - } else { - status &= ~SLAVE_DATA_CORRUPT; - } -} - -inline -bool serial_slave_DATA_CORRUPT(void) { - return status & SLAVE_DATA_CORRUPT; -} - -// Copies the serial_slave_buffer to the master and sends the -// serial_master_buffer to the slave. -// -// Returns: -// 0 => no error -// 1 => slave did not respond -int serial_update_buffers(void) { - // this code is very time dependent, so we need to disable interrupts - cli(); - - // signal to the slave that we want to start a transaction - serial_output(); - serial_low(); - _delay_us(1); - - // wait for the slaves response - serial_input(); - serial_high(); - _delay_us(SERIAL_DELAY); - - // check if the slave is present - if (serial_read_pin()) { - // slave failed to pull the line low, assume not present - sei(); - return 1; - } - - // if the slave is present syncronize with it - sync_recv(); - - uint8_t checksum_computed = 0; - // receive data from the slave - for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) { - serial_slave_buffer[i] = serial_read_byte(); - sync_recv(); - checksum_computed += serial_slave_buffer[i]; - } - uint8_t checksum_received = serial_read_byte(); - sync_recv(); - - if (checksum_computed != checksum_received) { - sei(); - return 1; - } - - uint8_t checksum = 0; - // send data to the slave - for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) { - serial_write_byte(serial_master_buffer[i]); - sync_recv(); - checksum += serial_master_buffer[i]; - } - serial_write_byte(checksum); - sync_recv(); - - // always, release the line when not in use - serial_output(); - serial_high(); - - sei(); - return 0; -} - -#endif diff --git a/keyboards/nyquist/serial.h b/keyboards/nyquist/serial.h deleted file mode 100644 index 15fe4db7b..000000000 --- a/keyboards/nyquist/serial.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef MY_SERIAL_H -#define MY_SERIAL_H - -#include "config.h" -#include - -/* TODO: some defines for interrupt setup */ -#define SERIAL_PIN_DDR DDRD -#define SERIAL_PIN_PORT PORTD -#define SERIAL_PIN_INPUT PIND -#define SERIAL_PIN_MASK _BV(PD0) -#define SERIAL_PIN_INTERRUPT INT0_vect - -#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 -#define SERIAL_MASTER_BUFFER_LENGTH 1 - -// Buffers for master - slave communication -extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH]; -extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH]; - -void serial_master_init(void); -void serial_slave_init(void); -int serial_update_buffers(void); -bool serial_slave_data_corrupt(void); - -#endif diff --git a/keyboards/nyquist/split_util.c b/keyboards/nyquist/split_util.c deleted file mode 100644 index 346cbc908..000000000 --- a/keyboards/nyquist/split_util.c +++ /dev/null @@ -1,86 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include "split_util.h" -#include "matrix.h" -#include "keyboard.h" -#include "config.h" -#include "timer.h" - -#ifdef USE_I2C -# include "i2c.h" -#else -# include "serial.h" -#endif - -volatile bool isLeftHand = true; - -static void setup_handedness(void) { - #ifdef EE_HANDS - isLeftHand = eeprom_read_byte(EECONFIG_HANDEDNESS); - #else - // I2C_MASTER_RIGHT is deprecated, use MASTER_RIGHT instead, since this works for both serial and i2c - #if defined(I2C_MASTER_RIGHT) || defined(MASTER_RIGHT) - isLeftHand = !has_usb(); - #else - isLeftHand = has_usb(); - #endif - #endif -} - -static void keyboard_master_setup(void) { -#ifdef USE_I2C - i2c_master_init(); -#ifdef SSD1306OLED - matrix_master_OLED_init (); -#endif -#else - serial_master_init(); -#endif -} - -static void keyboard_slave_setup(void) { - timer_init(); -#ifdef USE_I2C - i2c_slave_init(SLAVE_I2C_ADDRESS); -#else - serial_slave_init(); -#endif -} - -bool has_usb(void) { - USBCON |= (1 << OTGPADE); //enables VBUS pad - _delay_us(5); - return (USBSTA & (1< -#include "eeconfig.h" - -#define SLAVE_I2C_ADDRESS 0x32 - -extern volatile bool isLeftHand; - -// slave version of matix scan, defined in matrix.c -void matrix_slave_scan(void); - -void split_keyboard_setup(void); -bool has_usb(void); -void keyboard_slave_loop(void); - -void matrix_master_OLED_init (void); - -#endif From a3bb8c05c9ac6e6e4e5334caba1a816fa309d414 Mon Sep 17 00:00:00 2001 From: zvecr Date: Tue, 6 Nov 2018 03:00:54 +0000 Subject: [PATCH 457/788] Keyboard: Initial foobar port (#4367) --- keyboards/foobar/config.h | 230 +++++++++++++++++++++ keyboards/foobar/foobar.c | 55 +++++ keyboards/foobar/foobar.h | 66 ++++++ keyboards/foobar/info.json | 25 +++ keyboards/foobar/keymaps/default/config.h | 19 ++ keyboards/foobar/keymaps/default/keymap.c | 49 +++++ keyboards/foobar/keymaps/default/readme.md | 1 + keyboards/foobar/keymaps/macro/config.h | 19 ++ keyboards/foobar/keymaps/macro/keymap.c | 40 ++++ keyboards/foobar/keymaps/macro/readme.md | 1 + keyboards/foobar/readme.md | 17 ++ keyboards/foobar/rules.mk | 83 ++++++++ 12 files changed, 605 insertions(+) create mode 100644 keyboards/foobar/config.h create mode 100644 keyboards/foobar/foobar.c create mode 100644 keyboards/foobar/foobar.h create mode 100644 keyboards/foobar/info.json create mode 100644 keyboards/foobar/keymaps/default/config.h create mode 100644 keyboards/foobar/keymaps/default/keymap.c create mode 100644 keyboards/foobar/keymaps/default/readme.md create mode 100644 keyboards/foobar/keymaps/macro/config.h create mode 100644 keyboards/foobar/keymaps/macro/keymap.c create mode 100644 keyboards/foobar/keymaps/macro/readme.md create mode 100644 keyboards/foobar/readme.md create mode 100644 keyboards/foobar/rules.mk diff --git a/keyboards/foobar/config.h b/keyboards/foobar/config.h new file mode 100644 index 000000000..89219c460 --- /dev/null +++ b/keyboards/foobar/config.h @@ -0,0 +1,230 @@ +/* Copyright 2018 + * + * 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 . + */ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0A0C +#define DEVICE_VER 0x0F00 +#define MANUFACTURER di0ib +#define PRODUCT The foobar Keyboard +#define DESCRIPTION A split 30 key keyboard + +#define USE_SERIAL + +/* Select hand configuration */ +#define MASTER_LEFT +//#define MASTER_RIGHT +//#define EE_HANDS + +/* key matrix size */ +// Rows are doubled-up +#define MATRIX_ROWS 3*2 +#define MATRIX_COLS 5 + +/* + * 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 { D7, E6, B4 } +#define MATRIX_COL_PINS { F6, F7, B1, B3, B2 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_BREATHING +// #define BACKLIGHT_LEVELS 3 + +// #define RGB_DI_PIN E2 +// #ifdef RGB_DI_PIN +// #define RGBLIGHT_ANIMATIONS +// #define RGBLED_NUM 16 +// #define RGBLIGHT_HUE_STEP 8 +// #define RGBLIGHT_SAT_STEP 8 +// #define RGBLIGHT_VAL_STEP 8 +// #endif + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* 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 userful 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 + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * 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 + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +//#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ diff --git a/keyboards/foobar/foobar.c b/keyboards/foobar/foobar.c new file mode 100644 index 000000000..c032056a1 --- /dev/null +++ b/keyboards/foobar/foobar.c @@ -0,0 +1,55 @@ +/* Copyright 2018 + * + * 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 . + */ +#include "foobar.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + + led_set_user(usb_led); +} + +#ifdef SWAP_HANDS_ENABLE +__attribute__ ((weak)) +const keypos_t hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = { + {{4, 3}, {3, 3}, {2, 3}, {1, 3}, {0, 3}}, + {{4, 4}, {3, 4}, {2, 4}, {1, 4}, {0, 4}}, + {{4, 5}, {3, 5}, {2, 5}, {1, 5}, {0, 5}}, + {{0, 0}, {1, 0}, {2, 0}, {3, 0}, {4, 0}}, + {{0, 1}, {1, 1}, {2, 1}, {3, 1}, {4, 1}}, + {{0, 2}, {1, 2}, {2, 2}, {3, 2}, {4, 2}}, +}; +#endif diff --git a/keyboards/foobar/foobar.h b/keyboards/foobar/foobar.h new file mode 100644 index 000000000..fc49c72aa --- /dev/null +++ b/keyboards/foobar/foobar.h @@ -0,0 +1,66 @@ +/* Copyright 2018 + * + * 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 . + */ +#pragma once + +#include "quantum.h" +#define ___ KC_NO + +#ifndef FLIP_HALF +#define LAYOUT_split( \ + L00, L01, L02, L03, L04, R00, R01, R02, R03, R04, \ + L10, L11, L12, L13, L14, R10, R11, R12, R13, R14, \ + L20, L21, L22, L23, L24, R20, R21, R22, R23, R24 \ +) { \ + { L00, L01, L02, L03, L04 }, \ + { L10, L11, L12, L13, L14 }, \ + { L20, L21, L22, L23, L24 }, \ + { R04, R03, R02, R01, R00 }, \ + { R14, R13, R12, R11, R10 }, \ + { R24, R23, R22, R21, R20 } \ +} +#else +#define LAYOUT_split( \ + L00, L01, L02, L03, L04, R00, R01, R02, R03, R04, \ + L10, L11, L12, L13, L14, R10, R11, R12, R13, R14, \ + L20, L21, L22, L23, L24, R20, R21, R22, R23, R24 \ +) { \ + { L00, L01, L02, L03, L04 }, \ + { L10, L11, L12, L13, L14 }, \ + { L20, L21, L22, L23, L24 }, \ + { R00, R01, R02, R03, R04 }, \ + { R10, R11, R12, R13, R14 }, \ + { R20, R21, R22, R23, R24 } \ +} +#endif + +#define LAYOUT_macro( \ + L00, L01, L02, L03, L04, \ + L10, L11, L12, L13, L14, \ + L20, L21, L22, L23, L24 \ +) { \ + { L00, L01, L02, L03, L04 }, \ + { L10, L11, L12, L13, L14 }, \ + { L20, L21, L22, L23, L24 }, \ + { ___, ___, ___, ___, ___ }, \ + { ___, ___, ___, ___, ___ }, \ + { ___, ___, ___, ___, ___ } \ +} + +#define LAYOUT LAYOUT_macro + +#ifdef USE_I2C + #error "I2C not Supported" +#endif diff --git a/keyboards/foobar/info.json b/keyboards/foobar/info.json new file mode 100644 index 000000000..cb7f29b25 --- /dev/null +++ b/keyboards/foobar/info.json @@ -0,0 +1,25 @@ +{ + "keyboard_name": "foobar", + "url": "", + "maintainer": "qmk", + "width": 6, + "height": 2, + "layouts": { + "LAYOUT_macro": { + "key_count": 15, + "layout": [ + {"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, + {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, + {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2} + ] + }, + "LAYOUT_split": { + "key_count": 30, + "layout": [ + {"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, + {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":6, "y":1}, {"x":7, "y":1}, {"x":8, "y":1}, {"x":9, "y":1}, + {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2}, {"x":5, "y":2}, {"x":6, "y":2}, {"x":7, "y":2}, {"x":8, "y":2}, {"x":9, "y":2} + ] + } + } +} diff --git a/keyboards/foobar/keymaps/default/config.h b/keyboards/foobar/keymaps/default/config.h new file mode 100644 index 000000000..6173b6327 --- /dev/null +++ b/keyboards/foobar/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 + * + * 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 . + */ + +#pragma once + +// place overrides here diff --git a/keyboards/foobar/keymaps/default/keymap.c b/keyboards/foobar/keymaps/default/keymap.c new file mode 100644 index 000000000..b750c6185 --- /dev/null +++ b/keyboards/foobar/keymaps/default/keymap.c @@ -0,0 +1,49 @@ +/* Copyright 2018 + * + * 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 . + */ +#include QMK_KEYBOARD_H + +#define _______ KC_TRNS +#define FN1_Q LT(1, KC_Q) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_split( + FN1_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, + KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_ESC, + KC_Z, KC_X, KC_C, KC_V, KC_BSPC, KC_SPC, KC_B, KC_N, KC_M, KC_ENT + ), + + [1] = LAYOUT_split( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, RESET, _______, _______, _______ + ), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/foobar/keymaps/default/readme.md b/keyboards/foobar/keymaps/default/readme.md new file mode 100644 index 000000000..7113469e7 --- /dev/null +++ b/keyboards/foobar/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default split keymap for foobar diff --git a/keyboards/foobar/keymaps/macro/config.h b/keyboards/foobar/keymaps/macro/config.h new file mode 100644 index 000000000..6173b6327 --- /dev/null +++ b/keyboards/foobar/keymaps/macro/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 + * + * 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 . + */ + +#pragma once + +// place overrides here diff --git a/keyboards/foobar/keymaps/macro/keymap.c b/keyboards/foobar/keymaps/macro/keymap.c new file mode 100644 index 000000000..1e7ec905f --- /dev/null +++ b/keyboards/foobar/keymaps/macro/keymap.c @@ -0,0 +1,40 @@ +/* Copyright 2018 + * + * 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 . + */ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_macro( /* Base */ + KC_F13, KC_F14, KC_F15, KC_F16, KC_INT1, \ + KC_F17, KC_F18, KC_F19, KC_F20, KC_INT2, \ + KC_F21, KC_F22, KC_F23, KC_F14, KC_INT5 \ + ), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/foobar/keymaps/macro/readme.md b/keyboards/foobar/keymaps/macro/readme.md new file mode 100644 index 000000000..4cc59e7e5 --- /dev/null +++ b/keyboards/foobar/keymaps/macro/readme.md @@ -0,0 +1 @@ +# The default single board macro keymap for foobar diff --git a/keyboards/foobar/readme.md b/keyboards/foobar/readme.md new file mode 100644 index 000000000..3898d4bb1 --- /dev/null +++ b/keyboards/foobar/readme.md @@ -0,0 +1,17 @@ +# foobar + +![foobar](https://2.bp.blogspot.com/-rr8TK6xg2N0/WbwVL2O7EfI/AAAAAAACDc8/209wN69ju0wAFICYYPNLIEGQhat5-5MbwCLcBGAs/s640/a.JPG) + +Split 30% keyboard that fits within the 100mm x 100mm PCB size. Can be used together as a split keyboard or as a single 15 key macropad. + +* [The original TMK firmware](https://github.com/di0ib/tmk_keyboard/tree/master/keyboard/foobar) + +Keyboard Maintainer: QMK Community +Hardware Supported: foobar PCB +Hardware Availability: [foobar project on 40% Keyboards](http://www.40percent.club/2017/09/foobar-10.html) + +Make example for this keyboard (after setting up your build environment): + + make foobar:default + +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). diff --git a/keyboards/foobar/rules.mk b/keyboards/foobar/rules.mk new file mode 100644 index 000000000..327565165 --- /dev/null +++ b/keyboards/foobar/rules.mk @@ -0,0 +1,83 @@ +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = caterina + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = yes # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) + +# Enable generic behavior for split boards +SPLIT_KEYBOARD = yes From 5729380530ca28049a193f84b0199e77ba3e8edd Mon Sep 17 00:00:00 2001 From: zvecr Date: Tue, 6 Nov 2018 03:01:13 +0000 Subject: [PATCH 458/788] Keyboard: Initial 6lit port (#4355) * Initial 6lit port * Pull request review changes * Switch to bootmagic lite --- keyboards/6lit/6lit.c | 53 ++++++ keyboards/6lit/6lit.h | 55 ++++++ keyboards/6lit/config.h | 230 +++++++++++++++++++++++ keyboards/6lit/info.json | 23 +++ keyboards/6lit/keymaps/default/config.h | 19 ++ keyboards/6lit/keymaps/default/keymap.c | 39 ++++ keyboards/6lit/keymaps/default/readme.md | 1 + keyboards/6lit/keymaps/macro/config.h | 19 ++ keyboards/6lit/keymaps/macro/keymap.c | 39 ++++ keyboards/6lit/keymaps/macro/readme.md | 1 + keyboards/6lit/readme.md | 17 ++ keyboards/6lit/rules.mk | 83 ++++++++ 12 files changed, 579 insertions(+) create mode 100644 keyboards/6lit/6lit.c create mode 100644 keyboards/6lit/6lit.h create mode 100644 keyboards/6lit/config.h create mode 100644 keyboards/6lit/info.json create mode 100644 keyboards/6lit/keymaps/default/config.h create mode 100644 keyboards/6lit/keymaps/default/keymap.c create mode 100644 keyboards/6lit/keymaps/default/readme.md create mode 100644 keyboards/6lit/keymaps/macro/config.h create mode 100644 keyboards/6lit/keymaps/macro/keymap.c create mode 100644 keyboards/6lit/keymaps/macro/readme.md create mode 100644 keyboards/6lit/readme.md create mode 100644 keyboards/6lit/rules.mk diff --git a/keyboards/6lit/6lit.c b/keyboards/6lit/6lit.c new file mode 100644 index 000000000..fd3ae7d00 --- /dev/null +++ b/keyboards/6lit/6lit.c @@ -0,0 +1,53 @@ +/* Copyright 2018 + * + * 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 . + */ +#include "6lit.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + + led_set_user(usb_led); +} + +#ifdef SWAP_HANDS_ENABLE +__attribute__ ((weak)) +const keypos_t hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = { + {{2, 2}, {1, 2}, {0, 2}}, + {{2, 3}, {1, 3}, {0, 3}}, + {{0, 0}, {1, 0}, {2, 0}}, + {{0, 1}, {1, 1}, {2, 1}}, +}; +#endif diff --git a/keyboards/6lit/6lit.h b/keyboards/6lit/6lit.h new file mode 100644 index 000000000..ae0beea35 --- /dev/null +++ b/keyboards/6lit/6lit.h @@ -0,0 +1,55 @@ +/* Copyright 2018 + * + * 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 . + */ +#pragma once + +#include "quantum.h" +#define ________ KC_NO + +#ifndef FLIP_HALF +#define LAYOUT_split( \ + L00, L01, L02, R00, R01, R02, \ + L10, L11, L12, R10, R11, R12 \ +) { \ + { L00, L01, L02 }, \ + { L10, L11, L12 }, \ + { R02, R01, R00 }, \ + { R12, R11, R10 }, \ +} +#else +#define LAYOUT_split( \ + L00, L01, L02, R00, R01, R02, \ + L10, L11, L12, R10, R11, R12 \ +) { \ + { L00, L01, L02 }, \ + { L10, L11, L12 }, \ + { R00, R01, R02 }, \ + { R10, R11, R12 }, \ +} +#endif + +#define LAYOUT_macro( \ + L00, L01, L02, \ + L10, L11, L12 \ +) { \ + { L00, L01, L02 }, \ + { L10, L11, L12 }, \ +} + +#define LAYOUT LAYOUT_macro + +#ifdef USE_I2C + #error "I2C not Supported" +#endif diff --git a/keyboards/6lit/config.h b/keyboards/6lit/config.h new file mode 100644 index 000000000..8397818a6 --- /dev/null +++ b/keyboards/6lit/config.h @@ -0,0 +1,230 @@ +/* Copyright 2018 + * + * 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 . + */ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0A0C +#define DEVICE_VER 0x0F61 +#define MANUFACTURER di0ib +#define PRODUCT The 6lit Macropad +#define DESCRIPTION A split 12 key Macropad + +#define USE_SERIAL + +/* Select hand configuration */ +#define MASTER_LEFT +//#define MASTER_RIGHT +//#define EE_HANDS + +/* key matrix size */ +// Rows are doubled-up +#define MATRIX_ROWS 2*2 +#define MATRIX_COLS 3 + +/* + * 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 { D7, E6 } +#define MATRIX_COL_PINS { F6, F7, B1 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_BREATHING +// #define BACKLIGHT_LEVELS 3 + +// #define RGB_DI_PIN E2 +// #ifdef RGB_DI_PIN +// #define RGBLIGHT_ANIMATIONS +// #define RGBLED_NUM 16 +// #define RGBLIGHT_HUE_STEP 8 +// #define RGBLIGHT_SAT_STEP 8 +// #define RGBLIGHT_VAL_STEP 8 +// #endif + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* 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 userful 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 + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * 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 + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +//#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ diff --git a/keyboards/6lit/info.json b/keyboards/6lit/info.json new file mode 100644 index 000000000..ce1a7d6e1 --- /dev/null +++ b/keyboards/6lit/info.json @@ -0,0 +1,23 @@ +{ + "keyboard_name": "6lit", + "url": "", + "maintainer": "qmk", + "width": 6, + "height": 2, + "layouts": { + "LAYOUT_macro": { + "key_count": 6, + "layout": [ + {"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, + {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1} + ] + }, + "LAYOUT_split": { + "key_count": 12, + "layout": [ + {"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, + {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1} + ] + } + } +} diff --git a/keyboards/6lit/keymaps/default/config.h b/keyboards/6lit/keymaps/default/config.h new file mode 100644 index 000000000..6173b6327 --- /dev/null +++ b/keyboards/6lit/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 + * + * 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 . + */ + +#pragma once + +// place overrides here diff --git a/keyboards/6lit/keymaps/default/keymap.c b/keyboards/6lit/keymaps/default/keymap.c new file mode 100644 index 000000000..6864c72f7 --- /dev/null +++ b/keyboards/6lit/keymaps/default/keymap.c @@ -0,0 +1,39 @@ +/* Copyright 2018 + * + * 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 . + */ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_split( /* Base */ + KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, \ + KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24 \ + ), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/6lit/keymaps/default/readme.md b/keyboards/6lit/keymaps/default/readme.md new file mode 100644 index 000000000..b3acc3f58 --- /dev/null +++ b/keyboards/6lit/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default split keymap for 6lit diff --git a/keyboards/6lit/keymaps/macro/config.h b/keyboards/6lit/keymaps/macro/config.h new file mode 100644 index 000000000..6173b6327 --- /dev/null +++ b/keyboards/6lit/keymaps/macro/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 + * + * 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 . + */ + +#pragma once + +// place overrides here diff --git a/keyboards/6lit/keymaps/macro/keymap.c b/keyboards/6lit/keymaps/macro/keymap.c new file mode 100644 index 000000000..6b10ac133 --- /dev/null +++ b/keyboards/6lit/keymaps/macro/keymap.c @@ -0,0 +1,39 @@ +/* Copyright 2018 + * + * 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 . + */ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_macro( /* Base */ + KC_F19, KC_F20, KC_F21, \ + KC_F22, KC_F23, KC_F24 \ + ), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/6lit/keymaps/macro/readme.md b/keyboards/6lit/keymaps/macro/readme.md new file mode 100644 index 000000000..9f883b821 --- /dev/null +++ b/keyboards/6lit/keymaps/macro/readme.md @@ -0,0 +1 @@ +# The default single board macro keymap for 6lit diff --git a/keyboards/6lit/readme.md b/keyboards/6lit/readme.md new file mode 100644 index 000000000..d5b210028 --- /dev/null +++ b/keyboards/6lit/readme.md @@ -0,0 +1,17 @@ +# 6lit + +![6lit](https://1.bp.blogspot.com/-Pa8RgYZ0hy8/Wbmr4bjuV0I/AAAAAAACDbI/WLKQMDlcDVAVf1lAIRMN51usR1XcCCVNgCLcBGAs/s1600/a.JPG) + +6 key macropad that fits within the 100mm x 100mm PCB size. Can be used singly as a regular 6 key macropad as well. + +* [The original TMK firmware](https://github.com/di0ib/tmk_keyboard/tree/master/keyboard/6lit) + +Keyboard Maintainer: QMK Community +Hardware Supported: 6lit PCB +Hardware Availability: [6lit project on 40% Keyboards](http://www.40percent.club/2017/09/6lit.html) + +Make example for this keyboard (after setting up your build environment): + + make 6lit:default + +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). diff --git a/keyboards/6lit/rules.mk b/keyboards/6lit/rules.mk new file mode 100644 index 000000000..327565165 --- /dev/null +++ b/keyboards/6lit/rules.mk @@ -0,0 +1,83 @@ +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = caterina + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = yes # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) + +# Enable generic behavior for split boards +SPLIT_KEYBOARD = yes From 4636f0f623c71f1eda8628cbae4784fe08a8faf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20=C4=90or=C4=91evi=C4=87?= Date: Tue, 6 Nov 2018 06:34:54 +0100 Subject: [PATCH 459/788] Remove ALTG(kc) as it's misleading and is not actually AltGr (#4338) * Remove ALTG(kc) as it's misleading and is not actually AltGr * Add temporary alias for ALGR in keyboards/planck/keymaps/pevecyan/keymap.c --- docs/feature_advanced_keycodes.md | 1 - docs/keycodes.md | 1 - keyboards/planck/keymaps/pevecyan/keymap.c | 2 ++ quantum/keymap_extras/keymap_slovenian.h | 30 ++++++++++++---------- quantum/quantum_keycodes.h | 1 - 5 files changed, 19 insertions(+), 16 deletions(-) diff --git a/docs/feature_advanced_keycodes.md b/docs/feature_advanced_keycodes.md index f2e4909d8..f9a5c3980 100644 --- a/docs/feature_advanced_keycodes.md +++ b/docs/feature_advanced_keycodes.md @@ -73,7 +73,6 @@ These allow you to combine a modifier with a keycode. When pressed, the keydown |`HYPR(kc)`| |Hold Left Control, Shift, Alt and GUI and press `kc`| |`MEH(kc)` | |Hold Left Control, Shift and Alt and press `kc` | |`LCAG(kc)`| |Hold Left Control, Alt and GUI and press `kc` | -|`ALTG(kc)`| |Hold Right Control and Alt and press `kc` | |`SGUI(kc)`|`SCMD(kc)`, `SWIN(kc)`|Hold Left Shift and GUI and press `kc` | |`LCA(kc)` | |Hold Left Control and Alt and press `kc` | diff --git a/docs/keycodes.md b/docs/keycodes.md index 6676bb53c..e5d35b2b4 100644 --- a/docs/keycodes.md +++ b/docs/keycodes.md @@ -333,7 +333,6 @@ This is a reference only. Each group of keys links to the page documenting their |`HYPR(kc)`| |Hold Left Control, Shift, Alt and GUI and press `kc`| |`MEH(kc)` | |Hold Left Control, Shift and Alt and press `kc` | |`LCAG(kc)`| |Hold Left Control, Alt and GUI and press `kc` | -|`ALTG(kc)`| |Hold Right Control and Alt and press `kc` | |`SGUI(kc)`|`SCMD(kc)`, `SWIN(kc)`|Hold Left Shift and GUI and press `kc` | |`LCA(kc)` | |Hold Left Control and Alt and press `kc` | diff --git a/keyboards/planck/keymaps/pevecyan/keymap.c b/keyboards/planck/keymaps/pevecyan/keymap.c index 4d76f09b0..57f9f0e7f 100644 --- a/keyboards/planck/keymaps/pevecyan/keymap.c +++ b/keyboards/planck/keymaps/pevecyan/keymap.c @@ -20,6 +20,8 @@ #include "muse.h" #include "keymap_slovenian.h" +#define ALTG(kc) ALGR(kc) // FIXME: Remove this + extern keymap_config_t keymap_config; enum planck_layers { diff --git a/quantum/keymap_extras/keymap_slovenian.h b/quantum/keymap_extras/keymap_slovenian.h index a9db17bec..f27123c2a 100644 --- a/quantum/keymap_extras/keymap_slovenian.h +++ b/quantum/keymap_extras/keymap_slovenian.h @@ -17,8 +17,12 @@ #ifndef KEYMAP_SLOVENIAN #define KEYMAP_SLOVENIAN + #include "keymap.h" +// Alt gr +#define ALGR(kc) RALT(kc) +#define SI_ALGR KC_RALT //Swapped Z and Y #define SI_Z KC_Y @@ -90,18 +94,18 @@ #define SI_UNDS LSFT(SI_MINS) // _ // Alt Gr-ed characters -#define SI_CIRC ALTG(KC_3) // ^ -#define SI_DEG ALTG(KC_5) // ° -#define SI_GRV ALTG(KC_7) // ` -#define SI_ACCU ALTG(KC_9) // ´ -#define SI_LCBR ALTG(KC_B) // { -#define SI_RCBR ALTG(KC_N) // } -#define SI_LBRC ALTG(KC_F) // [ -#define SI_RBRC ALTG(KC_G) // ] -#define SI_BSLS ALTG(KC_Q) // backslash -#define SI_AT ALTG(KC_V) // @ -#define SI_EURO ALTG(KC_E) // € -#define SI_TILD ALTG(KC_1) // ~ -#define SI_PIPE ALTG(KC_W) // | +#define SI_CIRC ALGR(KC_3) // ^ +#define SI_DEG ALGR(KC_5) // ° +#define SI_GRV ALGR(KC_7) // ` +#define SI_ACCU ALGR(KC_9) // ´ +#define SI_LCBR ALGR(KC_B) // { +#define SI_RCBR ALGR(KC_N) // } +#define SI_LBRC ALGR(KC_F) // [ +#define SI_RBRC ALGR(KC_G) // ] +#define SI_BSLS ALGR(KC_Q) // backslash +#define SI_AT ALGR(KC_V) // @ +#define SI_EURO ALGR(KC_E) // € +#define SI_TILD ALGR(KC_1) // ~ +#define SI_PIPE ALGR(KC_W) // | #endif diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h index e983798f2..53fece21c 100644 --- a/quantum/quantum_keycodes.h +++ b/quantum/quantum_keycodes.h @@ -475,7 +475,6 @@ enum quantum_keycodes { #define HYPR(kc) (QK_LCTL | QK_LSFT | QK_LALT | QK_LGUI | (kc)) #define MEH(kc) (QK_LCTL | QK_LSFT | QK_LALT | (kc)) #define LCAG(kc) (QK_LCTL | QK_LALT | QK_LGUI | (kc)) -#define ALTG(kc) (QK_RCTL | QK_RALT | (kc)) #define SGUI(kc) (QK_LGUI | QK_LSFT | (kc)) #define SCMD(kc) SGUI(kc) #define SWIN(kc) SGUI(kc) From 672926562519c1ee7370b3ef188c11525de326e5 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 5 Nov 2018 21:35:16 -0800 Subject: [PATCH 460/788] Clarify the Mod Tap defines in documentation (#4352) * Fix up Mod Tap settings keys * Change link names * permissive hold wordsmith Co-Authored-By: drashna * ignore mod tap wordsmithing Co-Authored-By: drashna * grammar fix Co-Authored-By: drashna * wordsmithing Co-Authored-By: drashna * word smithing Co-Authored-By: drashna --- docs/config_options.md | 9 +++-- docs/feature_advanced_keycodes.md | 62 +++++++++++++++++++++++-------- 2 files changed, 52 insertions(+), 19 deletions(-) diff --git a/docs/config_options.md b/docs/config_options.md index 19861c9d2..c4921c21d 100644 --- a/docs/config_options.md +++ b/docs/config_options.md @@ -132,14 +132,15 @@ If you define these options you will enable the associated feature, which may in * `#define TAPPING_TOGGLE 2` * how many taps before triggering the toggle * `#define PERMISSIVE_HOLD` - * makes tap and hold keys work better for fast typers who don't want tapping term set above 500 + * makes tap and hold keys trigger the hold if another key is pressed before releasing, even if it hasn't hit the `TAPPING_TERM` * See [Permissive Hold](feature_advanced_keycodes.md#permissive-hold) for details * `#define IGNORE_MOD_TAP_INTERRUPT` - * makes it possible to do rolling combos (zx) with keys that convert to other keys on hold - * See [Mod tap interrupt](feature_advanced_keycodes.md#mod-tap-interrupt) for details + * makes it possible to do rolling combos (zx) with keys that convert to other keys on hold, by enforcing the `TAPPING_TERM` for both keys. + * See [Mod tap interrupt](feature_advanced_keycodes.md#ignore-mod-tap-interrupt) for details * `#define TAPPING_FORCE_HOLD` * makes it possible to use a dual role key as modifier shortly after having been tapped - * See [Hold after tap](feature_advanced_keycodes.md#hold-after-tap) + * See [Hold after tap](feature_advanced_keycodes.md#tapping-force-hold) + * Breaks any Tap Toggle functionality (`TT` or the One Shot Tap Toggle) * `#define LEADER_TIMEOUT 300` * how long before the leader key times out * `#define ONESHOT_TIMEOUT 300` diff --git a/docs/feature_advanced_keycodes.md b/docs/feature_advanced_keycodes.md index f9a5c3980..bb5cb7419 100644 --- a/docs/feature_advanced_keycodes.md +++ b/docs/feature_advanced_keycodes.md @@ -170,30 +170,56 @@ As of [PR#1359](https://github.com/qmk/qmk_firmware/pull/1359/), there is a new #define PERMISSIVE_HOLD ``` -This makes it easier for fast typists to use dual-function keys. Without this, if you let go of a held key inside the tapping term, it won't register. +This makes tap and hold keys (like Mod Tap) work better for fast typist, or for high `TAPPING_TERM` settings. -Example: (Tapping Term = 200ms) +If you press a Mod Tap key, tap another key (press and release) and then release the Mod Tap key, all within the tapping term, it will output the "tapping" function for both keys. -- SHFT_T(KC_A) Down -- KC_X Down -- KC_X Up -- SHFT_T(KC_A) Up +For Instance: -With defaults, if above is typed within tapping term, this will emit `ax`. With permissive hold, if above is typed within tapping term, this will emit `X` (so, Shift+X). +- `SHFT_T(KC_A)` Down +- `KC_X` Down +- `KC_X` Up +- `SHFT_T(KC_A)` Up -# Mod tap interrupt +Normally, if you do all this within the `TAPPING_TERM` (default: 200ms) this will be registered as `ax` by the firmware and host system. With permissive hold enabled, this modifies how this is handled by considering the Mod Tap keys as a Mod if another key is tapped, and would registered as `X` (`SHIFT`+`x`). -When a dual role key used for a modifier is quickly followed by another keys, it is interpreted as held even before the tapping term elapsed. This is a problem if a key is used for example inside a rolling combo because the second key will be pressed before the first key is released. +?> If you have `Ignore Mod Tap Interrupt` enabled, as well, this will modify how both work. The regular key has the modifier added if the first key is released first or if both keys are held longer than the `TAPPING_TERM`. -For example, when trying to type the rolling combo "zx" and z being configured to send Ctrl when hold, z rapidly followed by x actually sends Ctrl-x. That's bad. +# Ignore Mod Tap Interrupt -You can disable this behavior by defining `IGNORE_MOD_TAP_INTERRUPT` in `config.h`. +To enable this setting, add this to your `config.h`: -Note that this only concerns modifiers and not layer switching keys. +```c +#define IGNORE_MOD_TAP_INTERRUPT +``` -# Hold after tap +Similar to Permissive Hold, this alters how the firmware processes input for fast typist. If you press a Mod Tap key, press another key, release the Mod Tap key, and then release the normal key, it would normally output the "tapping" function for both keys. This may not be desirable for rolling combo keys. -When the user holds a key after tap, this repeats the tapped key rather to hold a modifier key. This allows to use auto repeat for the tapped key. If you prefer to hold a modifier instead, define `TAPPING_FORCE_HOLD` in `config.h`. +Setting `Ignore Mod Tap Interrupt` requires holding both keys for the `TAPPING_TERM` to trigger the hold function (the mod). + +For Instance: + +- `SHFT_T(KC_A)` Down +- `KC_X` Down +- `SHFT_T(KC_A)` Up +- `KC_X` Up + +Normally, this would send `X` (`SHIFT`+`x`). With `Ignore Mod Tap Interrupt` enabled, holding both keys are required for the `TAPPING_TERM` to register the hold action. A quick tap will output `ax` in this case, while a hold on both will still output `X` (`SHIFT`+`x`). + + +?> __Note__: This only concerns modifiers and not layer switching keys. + +?> If you have `Permissive Hold` enabled, as well, this will modify how both work. The regular key has the modifier added if the first key is released first or if both keys are held longer than the `TAPPING_TERM`. + +# Tapping Force Hold + +To enable `tapping force hold`, add the following to your `config.h`: + +```c +#define TAPPING_FORCE_HOLD +``` + +When the user holds a key after tap, this repeats the tapped key rather to hold a modifier key. This allows to use auto repeat for the tapped key. Example: @@ -211,6 +237,12 @@ With `TAPPING_FORCE_HOLD`, the second press will be interpreted as a Shift, allo # Retro Tapping +To enable `retro tapping`, add the following to your `config.h`: + +```c +#define RETRO_TAPPING +``` + Holding and releasing a dual function key without pressing another key will result in nothing happening. With retro tapping enabled, releasing the key without pressing another will send the original keycode even if it is outside the tapping term. -For instance, holding and releasing `LT(2, KC_SPACE)` without hitting another key will result in nothing happening. With `RETRO_TAPPING` defined in your `config.h`, it will send `KC_SPACE`. +For instance, holding and releasing `LT(2, KC_SPACE)` without hitting another key will result in nothing happening. With this enabled, it will send `KC_SPACE` instead. From f2101cfb6a2270345fe6235d4c36e2e0d49db528 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 5 Nov 2018 21:36:26 -0800 Subject: [PATCH 461/788] Update to drashna keymaps (#4365) * Consistency fixes and more eeprom defaults * Handle setting Unicode mode on eeprom reset better * Unicode EEPROM hack * Re-enable permissive hold and ignore mod tap * Set unicode input mode * More unicode stuff * more haaaaaacks * Attempted RGB Cleanup * Fix compiler issue * Add GitLab CI config for personal compiling * Add avr gcc version to GitLab CI script * Add rgblight init to matrix init --- layouts/community/ergodox/drashna/keymap.c | 2 +- layouts/community/ortho_4x12/drashna/config.h | 2 +- layouts/community/ortho_4x12/drashna/keymap.c | 52 ++++++++++++------- users/drashna/.gitlab-ci.yml | 26 ++++++++++ users/drashna/config.h | 4 +- users/drashna/drashna.c | 40 +++++++++----- users/drashna/rgb_stuff.c | 35 ++++--------- 7 files changed, 98 insertions(+), 63 deletions(-) create mode 100644 users/drashna/.gitlab-ci.yml diff --git a/layouts/community/ergodox/drashna/keymap.c b/layouts/community/ergodox/drashna/keymap.c index 518eaf034..360a2d9c6 100644 --- a/layouts/community/ergodox/drashna/keymap.c +++ b/layouts/community/ergodox/drashna/keymap.c @@ -40,7 +40,7 @@ bool skip_leds = false; KC_TAB, K01, K02, K03, K04, K05, TG(_DIABLO), TG(_DIABLO), K06, K07, K08, K09, K0A, KC_BSLS, \ KC_C1R3, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, KC_QUOT, \ KC_MLSF, CTL_T(K21), K22, K23, K24, K25, TG(_GAMEPAD), TG(_GAMEPAD), K26, K27, K28, K29, CTL_T(K2A), KC_MRSF, \ - KC_GRV, OSM(MOD_MEH),OSM(MOD_LGUI),KC_LBRC, KC_RBRC, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, UC_IRNY, \ + KC_GRV, OSM(MOD_MEH),OSM(MOD_LGUI),KC_LBRC, KC_RBRC, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, UC_SHRG, \ OS_LALT, OS_LGUI, OS_RGUI, CTL_T(KC_ESCAPE), \ KC_HOME, KC_PGUP, \ LT(_LOWER, KC_SPACE),KC_BSPC, KC_END, KC_PGDN, KC_DEL, LT(_RAISE, KC_ENTER) \ diff --git a/layouts/community/ortho_4x12/drashna/config.h b/layouts/community/ortho_4x12/drashna/config.h index b4c780cc1..f279651b6 100644 --- a/layouts/community/ortho_4x12/drashna/config.h +++ b/layouts/community/ortho_4x12/drashna/config.h @@ -18,7 +18,7 @@ #define RGB_MATRIX_KEYPRESSES // reacts to keypresses (will slow down matrix scan by a lot) // #define RGB_MATRIX_KEYRELEASES // reacts to keyreleases (not recommened) // #define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects -#define RGB_DISABLE_WHEN_USB_SUSPENDED false // turn off effects when suspended +// #define RGB_DISABLE_WHEN_USB_SUSPENDED false // turn off effects when suspended // #define RGB_MATRIX_SKIP_FRAMES 1 // number of frames to skip when displaying animations (0 is full effect) if not defined defaults to 1 // #define RGB_MATRIX_MAXIMUM_BRIGHTNESS 200 // limits maximum brightness of LEDs to 200 out of 255. If not defined maximum brightness is set to 255 // #define EECONFIG_RGB_MATRIX (uint32_t *)16 diff --git a/layouts/community/ortho_4x12/drashna/keymap.c b/layouts/community/ortho_4x12/drashna/keymap.c index 108df6931..2a9e32cc8 100644 --- a/layouts/community/ortho_4x12/drashna/keymap.c +++ b/layouts/community/ortho_4x12/drashna/keymap.c @@ -17,6 +17,10 @@ #include QMK_KEYBOARD_H #include "drashna.h" +#ifdef RGB_MATRIX_ENABLE +extern bool g_suspend_state; +#endif + #ifdef BACKLIGHT_ENABLE enum planck_keycodes { BACKLIT = NEW_SAFE_RANGE, @@ -135,6 +139,15 @@ bool music_mask_user(uint16_t keycode) { #ifdef RGB_MATRIX_ENABLE +void suspend_power_down_keymap(void) +{ + rgb_matrix_set_suspend_state(true); +} + +void suspend_wakeup_init_keymap(void) +{ + rgb_matrix_set_suspend_state(false); +} void rgb_matrix_layer_helper (uint8_t red, uint8_t green, uint8_t blue, bool default_layer) { rgb_led led; @@ -152,25 +165,26 @@ void rgb_matrix_indicators_user(void) { uint8_t this_mod = get_mods(); uint8_t this_led = host_keyboard_leds(); uint8_t this_osm = get_oneshot_mods(); - - switch (biton32(layer_state)) { - case _RAISE: - rgb_matrix_layer_helper(0xFF, 0xFF, 0x00, false); break; - case _LOWER: - rgb_matrix_layer_helper(0x00, 0xFF, 0x00, false); break; - case _ADJUST: - rgb_matrix_layer_helper(0xFF, 0x00, 0x00, false); break; - default: - switch (biton32(default_layer_state)) { - case _QWERTY: - rgb_matrix_layer_helper(0x00, 0xFF, 0xFF, true); break; - case _COLEMAK: - rgb_matrix_layer_helper(0xFF, 0x00, 0xFF, true); break; - case _DVORAK: - rgb_matrix_layer_helper(0x00, 0xFF, 0x00, true); break; - case _WORKMAN: - rgb_matrix_layer_helper(0xD9, 0xA5, 0x21, true); break; - } + if (!g_suspend_state) { + switch (biton32(layer_state)) { + case _RAISE: + rgb_matrix_layer_helper(0xFF, 0xFF, 0x00, false); break; + case _LOWER: + rgb_matrix_layer_helper(0x00, 0xFF, 0x00, false); break; + case _ADJUST: + rgb_matrix_layer_helper(0xFF, 0x00, 0x00, false); break; + default: + switch (biton32(default_layer_state)) { + case _QWERTY: + rgb_matrix_layer_helper(0x00, 0xFF, 0xFF, true); break; + case _COLEMAK: + rgb_matrix_layer_helper(0xFF, 0x00, 0xFF, true); break; + case _DVORAK: + rgb_matrix_layer_helper(0x00, 0xFF, 0x00, true); break; + case _WORKMAN: + rgb_matrix_layer_helper(0xD9, 0xA5, 0x21, true); break; + } + } } switch (biton32(default_layer_state)) { diff --git a/users/drashna/.gitlab-ci.yml b/users/drashna/.gitlab-ci.yml new file mode 100644 index 000000000..3c95ad850 --- /dev/null +++ b/users/drashna/.gitlab-ci.yml @@ -0,0 +1,26 @@ +stages: + - build + +qmk_firmware: + stage: build + variables: + GIT_SUBMODULE_STRATEGY: recursive + tags: + - linux + image: ubuntu + before_script: + - apt-get update -qy + - apt-get install -y build-essential avr-libc binutils-arm-none-eabi binutils-avr dfu-programmer dfu-util diffutils gcc gcc-arm-none-eabi gcc-avr git libnewlib-arm-none-eabi unzip wget zip + - avr-gcc --version + script: + - make iris/rev2:drashna iris/rev2:drashna_old ergodox_ez:drashna viterbi/rev1:drashna orthodox/rev1:drashna orthodox/rev3:drashna crkbd:drashna planck/light:drashna + artifacts: + name: "$CI_JOB_NAME-$CI_COMMIT_REF_SLUG" + paths: + - ./*.hex + - ./*.bin + only: + - master + - drashna_keymaps + - merge-requests + - branches diff --git a/users/drashna/config.h b/users/drashna/config.h index 9d7d20add..7e6a7d1c8 100644 --- a/users/drashna/config.h +++ b/users/drashna/config.h @@ -44,8 +44,8 @@ // and when this option isn't enabled, z rapidly followed by x // actually sends Ctrl-x. That's bad.) #define IGNORE_MOD_TAP_INTERRUPT -#undef PERMISSIVE_HOLD -// #define TAPPING_FORCE_HOLD +#define PERMISSIVE_HOLD +//#define TAPPING_FORCE_HOLD //#define RETRO_TAPPING #define FORCE_NKRO diff --git a/users/drashna/drashna.c b/users/drashna/drashna.c index b2219e9aa..4111d2931 100644 --- a/users/drashna/drashna.c +++ b/users/drashna/drashna.c @@ -20,6 +20,12 @@ along with this program. If not, see . #include "rgb_stuff.h" userspace_config_t userspace_config; +#if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE)) + #define DRASHNA_UNICODE_MODE UC_WIN +#else + // set to 2 for UC_WIN, set to 4 for UC_WINC + #define DRASHNA_UNICODE_MODE 2 +#endif uint16_t copy_paste_timer; // Helper Functions @@ -154,19 +160,18 @@ void matrix_init_user(void) { userspace_config.raw = eeconfig_read_user(); -#ifdef BOOTLOADER_CATERINA - DDRD &= ~(1<<5); - PORTD &= ~(1<<5); + #ifdef BOOTLOADER_CATERINA + DDRD &= ~(1<<5); + PORTD &= ~(1<<5); - DDRB &= ~(1<<0); - PORTB &= ~(1<<0); -#endif + DDRB &= ~(1<<0); + PORTB &= ~(1<<0); + #endif -#if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE)) - if (eeprom_read_byte(EECONFIG_UNICODEMODE) != UC_WIN) { - set_unicode_input_mode(UC_WIN); - } -#endif //UNICODE_ENABLE + #if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE)) + set_unicode_input_mode(DRASHNA_UNICODE_MODE); + get_unicode_input_mode(); + #endif //UNICODE_ENABLE matrix_init_keymap(); } @@ -266,9 +271,10 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { case KC_MAKE: // Compiles the firmware, and adds the flash command based on keyboard bootloader if (!record->event.pressed) { uint8_t temp_mod = get_mods(); - clear_mods(); + uint8_t temp_osm = get_oneshot_mods(); + clear_mods(); clear_oneshot_mods(); send_string_with_delay_P(PSTR("make " QMK_KEYBOARD ":" QMK_KEYMAP), 10); - if (temp_mod & MODS_SHIFT_MASK) { + if (temp_mod & MODS_SHIFT_MASK || temp_osm & MODS_SHIFT_MASK) { #if defined(__ARM__) send_string_with_delay_P(PSTR(":dfu-util"), 10); #elif defined(BOOTLOADER_DFU) @@ -282,7 +288,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { #if defined(KEYBOARD_viterbi) send_string_with_delay_P(PSTR(":dfu"), 10); #endif - if (temp_mod & MODS_CTRL_MASK) { send_string_with_delay_P(PSTR(" -j8 --output-sync"), 10); } + if (temp_mod & MODS_CTRL_MASK || temp_osm & MODS_CTRL_MASK) { send_string_with_delay_P(PSTR(" -j8 --output-sync"), 10); } send_string_with_delay_P(PSTR(SS_TAP(X_ENTER)), 10); set_mods(temp_mod); } @@ -422,4 +428,10 @@ void eeconfig_init_user(void) { userspace_config.raw = 0; userspace_config.rgb_layer_change = true; eeconfig_update_user(userspace_config.raw); + #if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE)) + set_unicode_input_mode(DRASHNA_UNICODE_MODE); + get_unicode_input_mode(); + #else + eeprom_update_byte(EECONFIG_UNICODEMODE, DRASHNA_UNICODE_MODE); + #endif } diff --git a/users/drashna/rgb_stuff.c b/users/drashna/rgb_stuff.c index 9ad94c0c3..b6de4d39e 100644 --- a/users/drashna/rgb_stuff.c +++ b/users/drashna/rgb_stuff.c @@ -12,14 +12,6 @@ void rgblight_sethsv_default_helper(uint8_t index) { #endif // RGBLIGHT_ENABLE #ifdef INDICATOR_LIGHTS -uint8_t last_mod; -uint8_t last_led; -uint8_t last_osm; -uint8_t current_mod; -uint8_t current_led; -uint8_t current_osm; - - void set_rgb_indicators(uint8_t this_mod, uint8_t this_led, uint8_t this_osm) { if (userspace_config.rgb_layer_change && biton32(layer_state) == 0) { if (this_mod & MODS_SHIFT_MASK || this_led & (1< Date: Mon, 5 Nov 2018 21:38:18 -0800 Subject: [PATCH 462/788] Add EEPROM_RESET keycode to core code (#4234) * Add EEPROM Reset keycode * Add keycode to docs * Move EEPROM Reset code to the end of the enum * Cleanup and naming change --- docs/quantum_keycodes.md | 25 +++++++++++++------------ quantum/quantum.c | 5 +++++ quantum/quantum_keycodes.h | 4 ++++ 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/docs/quantum_keycodes.md b/docs/quantum_keycodes.md index 1d7fc0e12..90192e632 100644 --- a/docs/quantum_keycodes.md +++ b/docs/quantum_keycodes.md @@ -8,15 +8,16 @@ On this page we have documented keycodes between `0x00FF` and `0xFFFF` which are ## QMK Keycodes -|Key |Aliases |Description | -|-------------|-----------|---------------------------------------------------------------------| -|`RESET` | |Put the keyboard into DFU mode for flashing | -|`DEBUG` | |Toggle debug mode | -|`KC_GESC` |`GRAVE_ESC`|Escape when tapped, ` when pressed with Shift or GUI| -|`KC_LSPO` | |Left Shift when held, `(` when tapped | -|`KC_RSPC` | |Right Shift when held, `)` when tapped | -|`KC_LEAD` | |The [Leader key](feature_leader_key.md) | -|`KC_LOCK` | |The [Lock key](feature_key_lock.md) | -|`FUNC(n)` |`F(n)` |Call `fn_action(n)` (deprecated) | -|`M(n)` | |Call macro `n` | -|`MACROTAP(n)`| |Macro-tap `n` idk FIXME | +|Key |Aliases |Description | +|---------------|-----------|---------------------------------------------------------------------| +|`RESET` | |Put the keyboard into DFU mode for flashing | +|`DEBUG` | |Toggle debug mode | +|`EEPROM_RESET` |`EEP_RST` |Resets EEPROM state by reinitializing it | +|`KC_GESC` |`GRAVE_ESC`|Escape when tapped, ` when pressed with Shift or GUI| +|`KC_LSPO` | |Left Shift when held, `(` when tapped | +|`KC_RSPC` | |Right Shift when held, `)` when tapped | +|`KC_LEAD` | |The [Leader key](feature_leader_key.md) | +|`KC_LOCK` | |The [Lock key](feature_key_lock.md) | +|`FUNC(n)` |`F(n)` |Call `fn_action(n)` (deprecated) | +|`M(n)` | |Call macro `n` | +|`MACROTAP(n)` | |Macro-tap `n` idk FIXME | diff --git a/quantum/quantum.c b/quantum/quantum.c index 5f1a691c8..69692233e 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -298,6 +298,11 @@ bool process_record_quantum(keyrecord_t *record) { print("DEBUG: enabled.\n"); } return false; + case EEPROM_RESET: + if (record->event.pressed) { + eeconfig_init(); + } + return false; #ifdef FAUXCLICKY_ENABLE case FC_TOG: if (record->event.pressed) { diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h index 53fece21c..14f8c2b81 100644 --- a/quantum/quantum_keycodes.h +++ b/quantum/quantum_keycodes.h @@ -454,6 +454,8 @@ enum quantum_keycodes { TERM_OFF, #endif + EEPROM_RESET, + // always leave at the end SAFE_RANGE }; @@ -569,6 +571,8 @@ enum quantum_keycodes { #define KC_GESC GRAVE_ESC +#define EEP_RST EEPROM_RESET + #define CK_TOGG CLICKY_TOGGLE #define CK_RST CLICKY_RESET #define CK_UP CLICKY_UP From 26a201e6875e82c623c136eccf937b511199c701 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sun, 28 Oct 2018 09:18:41 -0700 Subject: [PATCH 463/788] fix example to reflect caveat --- docs/feature_combo.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/feature_combo.md b/docs/feature_combo.md index 5bb73ef10..05ffc0d72 100644 --- a/docs/feature_combo.md +++ b/docs/feature_combo.md @@ -44,15 +44,15 @@ For a more complicated implementation, you can use the `process_combo_event` fun ```c enum combo_events { ZC_COPY, - ZV_PASTE + XV_PASTE }; const uint16_t PROGMEM copy_combo[] = {KC_Z, KC_C, COMBO_END}; -const uint16_t PROGMEM paste_combo[] = {KC_Z, KC_V, COMBO_END}; +const uint16_t PROGMEM paste_combo[] = {KC_X, KC_V, COMBO_END}; combo_t key_combos[COMBO_COUNT] = { [ZC_COPY] = COMBO_ACTION(copy_combo), - [ZV_PASTE] = COMBO_ACTION(paste_combo), + [XV_PASTE] = COMBO_ACTION(paste_combo), }; void process_combo_event(uint8_t combo_index, bool pressed) { @@ -66,7 +66,7 @@ void process_combo_event(uint8_t combo_index, bool pressed) { } break; - case ZV_PASTE: + case XV_PASTE: if (pressed) { register_code(KC_LCTL); register_code(KC_V); @@ -78,7 +78,7 @@ void process_combo_event(uint8_t combo_index, bool pressed) { } ``` -This will send Ctrl+C if you hit Z and C, and Ctrl+V if you hit Z and V. But you could change this to do stuff like change layers, play sounds, or change settings. +This will send Ctrl+C if you hit Z and C, and Ctrl+V if you hit X and V. But you could change this to do stuff like change layers, play sounds, or change settings. ## Additional Configuration From 4a033641dff0cbf430a5005d6d6c1e5b8c4b540c Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sun, 28 Oct 2018 09:29:18 -0700 Subject: [PATCH 464/788] Update Features page to reflect all of the features linked in the sidebar/summary --- docs/features.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/features.md b/docs/features.md index 537e1061c..43d972e68 100644 --- a/docs/features.md +++ b/docs/features.md @@ -8,13 +8,17 @@ QMK has a staggering number of features for building your keyboard. It can take * [Auto Shift](feature_auto_shift.md) - Tap for the normal key, hold slightly longer for its shifted state. * [Backlight](feature_backlight.md) - LED lighting support for your keyboard. * [Bootmagic](feature_bootmagic.md) - Adjust the behavior of your keyboard using hotkeys. +* [Combos](feature_combos.md) - Custom actions for multiple key holds. +* [Command](feature_command.md) - Runtime version of bootmagic (Formerly known as "Magic"). * [Dynamic Macros](feature_dynamic_macros.md) - Record and playback macros from the keyboard itself. +* [Grave Escape](feature_grave_esc.md) - Lets you use a single key for Esc and Grave. * [HD44780 LCD Display](feature_hd44780.md) - Support for LCD character displays using the HD44780 standard. * [Key Lock](feature_key_lock.md) - Lock a key in the "down" state. * [Layouts](feature_layouts.md) - Use one keymap with any keyboard that supports your layout. * [Leader Key](feature_leader_key.md) - Tap the leader key followed by a sequence to trigger custom behavior. * [Macros](feature_macros.md) - Send multiple key presses when pressing only one physical key. * [Mouse keys](feature_mouse_keys.md) - Control your mouse pointer from your keyboard. +* [One Shot Keys](feature_advanced_keycodes.md#one-shot-keys) - Sticky Keys, lets hit a key rather than holding it. * [Pointing Device](feature_pointing_device.md) - Framework for connecting your custom pointing device to your keyboard. * [PS2 Mouse](feature_ps2_mouse.md) - Driver for connecting a PS/2 mouse directly to your keyboard. * [RGB Light](feature_rgblight.md) - RGB lighting for your keyboard. From ec34b5386455a4170db97aad21dc50b77d6ddfdd Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 29 Oct 2018 15:07:38 -0700 Subject: [PATCH 465/788] Fixe line endings --- keyboards/qwertyydox/rules.mk | 138 +++++++++++++++++----------------- 1 file changed, 69 insertions(+), 69 deletions(-) diff --git a/keyboards/qwertyydox/rules.mk b/keyboards/qwertyydox/rules.mk index d04a4b9f3..8c6171bc0 100644 --- a/keyboards/qwertyydox/rules.mk +++ b/keyboards/qwertyydox/rules.mk @@ -1,69 +1,69 @@ -# MCU name -#MCU = at90usb1287 -MCU = atmega32u4 - -# Processor frequency. -# This will define a symbol, F_CPU, in all source code files equal to the -# processor frequency in Hz. You can then use this symbol in your source code to -# calculate timings. Do NOT tack on a 'UL' at the end, this will be done -# automatically to create a 32-bit value in your source code. -# -# This will be an integer division of F_USB below, as it is sourced by -# F_USB after it has run through any CPU prescalers. Note that this value -# does not *change* the processor frequency - it should merely be updated to -# reflect the processor speed set externally so that the code can use accurate -# software delays. -F_CPU = 16000000 - -# -# LUFA specific -# -# Target architecture (see library "Board Types" documentation). -ARCH = AVR8 - -# Input clock frequency. -# This will define a symbol, F_USB, in all source code files equal to the -# input clock frequency (before any prescaling is performed) in Hz. This value may -# differ from F_CPU if prescaling is used on the latter, and is required as the -# raw input clock is fed directly to the PLL sections of the AVR for high speed -# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' -# at the end, this will be done automatically to create a 32-bit value in your -# source code. -# -# If no clock division is performed on the input clock inside the AVR (via the -# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. -F_USB = $(F_CPU) - -# Bootloader -# This definition is optional, and if your keyboard supports multiple bootloaders of -# different sizes, comment this out, and the correct address will be loaded -# automatically (+60). See bootloader.mk for all options. -BOOTLOADER = caterina - -# Interrupt driven control endpoint task(+60) -OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT - -# Build Options -# change to "no" to disable the options, or define them in the Makefile in -# the appropriate keymap folder that will get included automatically -# -BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) -EXTRAKEY_ENABLE = no # Audio control and System control(+450) -CONSOLE_ENABLE = no # Console for debug(+400) -COMMAND_ENABLE = no # Commands for debug and configuration -NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality -MIDI_ENABLE = no # MIDI controls -AUDIO_ENABLE = no # Audio output on port C6 -UNICODE_ENABLE = no # Unicode -BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. -SUBPROJECT_rev1 = yes -USE_I2C = yes # I2C is used between the sides -# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE -SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend - -SPLIT_KEYBOARD = yes - -DEFAULT_FOLDER = qwertyydox/rev1 +# MCU name +#MCU = at90usb1287 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Bootloader +# This definition is optional, and if your keyboard supports multiple bootloaders of +# different sizes, comment this out, and the correct address will be loaded +# automatically (+60). See bootloader.mk for all options. +BOOTLOADER = caterina + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = no # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. +SUBPROJECT_rev1 = yes +USE_I2C = yes # I2C is used between the sides +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +SPLIT_KEYBOARD = yes + +DEFAULT_FOLDER = qwertyydox/rev1 From 40313cfa3b4a4f1643382f0446e0a889ef3e76dc Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Tue, 30 Oct 2018 18:00:43 -0700 Subject: [PATCH 466/788] Fix Terminal feature on ChibiOS --- common_features.mk | 1 + tmk_core/common.mk | 4 +++- tmk_core/common/print.h | 2 ++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/common_features.mk b/common_features.mk index f44dfc47d..8f53a82aa 100644 --- a/common_features.mk +++ b/common_features.mk @@ -213,6 +213,7 @@ endif ifeq ($(strip $(TERMINAL_ENABLE)), yes) SRC += $(QUANTUM_DIR)/process_keycode/process_terminal.c OPT_DEFS += -DTERMINAL_ENABLE + OPT_DEFS += -DUSER_PRINT endif ifeq ($(strip $(USB_HID_ENABLE)), yes) diff --git a/tmk_core/common.mk b/tmk_core/common.mk index 3844b13d4..65dcf96f6 100644 --- a/tmk_core/common.mk +++ b/tmk_core/common.mk @@ -43,9 +43,11 @@ ifeq ($(PLATFORM),CHIBIOS) TMK_COMMON_DEFS += -DSTM32_EEPROM_ENABLE else TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom_teensy.c -endif + endif ifeq ($(strip $(AUTO_SHIFT_ENABLE)), yes) TMK_COMMON_SRC += $(CHIBIOS)/os/various/syscalls.c + else ifeq($(strip $(TERMINAL_ENABLE)), yes) + TMK_COMMON_SRC += $(CHIBIOS)/os/various/syscalls.c endif endif diff --git a/tmk_core/common/print.h b/tmk_core/common/print.h index d94527657..06c6cbd7f 100644 --- a/tmk_core/common/print.h +++ b/tmk_core/common/print.h @@ -73,7 +73,9 @@ void print_set_sendchar(int8_t (*print_sendchar_func)(uint8_t)); #elif defined(PROTOCOL_CHIBIOS) /* PROTOCOL_CHIBIOS */ +#ifndef TERMINAL_ENABLE # include "chibios/printf.h" +#endif # ifdef USER_PRINT /* USER_PRINT */ From 73e634482ea8f57d1f1a5f1e16bc3ffd74f84b8e Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Tue, 30 Oct 2018 18:03:46 -0700 Subject: [PATCH 467/788] command.h include was not set correctly --- tmk_core/common/command.h | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tmk_core/common/command.h b/tmk_core/common/command.h index d9d89ba0f..c38f2b9e8 100644 --- a/tmk_core/common/command.h +++ b/tmk_core/common/command.h @@ -15,8 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef COMMAND_H -#define COMMAND +#pragma once /* FIXME: Add doxygen comments for the behavioral defines in here. */ @@ -155,5 +154,3 @@ bool command_proc(uint8_t code); #define XMAGIC_KC(key) KC_##key #define MAGIC_KC(key) XMAGIC_KC(key) - -#endif From 1b3ac77fec9817aad30f8d70f063d3b1eba42403 Mon Sep 17 00:00:00 2001 From: tcatkins99 Date: Tue, 6 Nov 2018 11:06:50 -0500 Subject: [PATCH 468/788] mapdev's Espectro layout (#4366) * Add mapdev layout to espectro * Add mapdev layout to espectro * - Update MO Co-Authored-By: tcatkins99 --- keyboards/espectro/keymaps/mapdev/keymap.c | 88 ++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 keyboards/espectro/keymaps/mapdev/keymap.c diff --git a/keyboards/espectro/keymaps/mapdev/keymap.c b/keyboards/espectro/keymaps/mapdev/keymap.c new file mode 100644 index 000000000..bbd791582 --- /dev/null +++ b/keyboards/espectro/keymaps/mapdev/keymap.c @@ -0,0 +1,88 @@ +/* + * 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 . + */ + + +#include QMK_KEYBOARD_H +#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) + +#define _BL 0 //Base layer +#define _FN1 1 //Function layer + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* BL +____________________________________________________________________________________________________________________________________________________________________________ +| | | | | | | | | | | | | | | | | | | | +| ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | P SCN | HOME | END | P UP | P DOWN | DEL | +|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________| +| | | | | | | | | | | | | | BACK | NUM | | | | +| ~` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | _ - | = + | SPACE | LOCK | / | * | - | +|________|________|________|________|________|________|________|________|________|________|________|________|________|_________________|________|________|________|________| +| | | | | | | | | | | | [ | ] | | | | | | +| TAB | Q | W | E | R | T | Y | U | I | O | P | { | } | | \ | 7 | 8 | 9 | | +|____________|________|________|________|________|________|________|________|________|________|________|________|________|_____________|________|________|________| + | +| | | | | | | | | | | ; | ' | | | | | | +| CAPS LOCK | A | S | D | F | G | H | J | K | L | : | " | ENTER | 4 | 5 | 6 | | +|______________|________|________|________|________|________|________|________|________|________|________|________|____________________|________|________|________|________| +| | | | | | | | | , | . | / | | | | | | | +| SHIFT | Z | X | C | V | B | N | M | < | > | ? | SHIFT | UP | 1 | 2 | 3 | | +|__________________|________|________|________|________|________|________|________|________|________|________|________________|________|________|________|________| ENTER | +| | | | | | | MO | | | | | | | +| CTRL | LGUI | L ALT | SPACE | R ALT | R CTRL | _FN | LEFT | DOWN | RIGHT | 0 | . | | +|__________|__________|__________|________________________________________________________|________|________|________|________|________|________|________|________|________| + */ + + [_BL] = LAYOUT_default( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_VOLD, KC_VOLU, KC_HOME, KC_END, KC_PGUP, KC_PGDN, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, KC_PSLS, KC_PAST, KC_PMNS, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PPLS, + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, + KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, + MO(_FN1), KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, _______, KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT, KC_P0, KC_PDOT + ), + +/* FN_1 +____________________________________________________________________________________________________________________________________________________________________________ +| | | | | | | | | | | | | | | VOL | VOL | NEXT | | | +| RESET | | | | | | | | | | | | | MUTE | DOWN | UP | TRACK | HOME | END | +|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________| +| | RGB | RGB | RGB | RGB | RGB | RGB | RGB | RGB | | | | | | | | | | +| | TOGGLE | MODE |INCREASE|DECREASE| HUE | HUE | SAT | | | | | | DELETE | | | | | +|________|________|________|________|________|INCREASE|DECREASE|INCREASE|DECREASE|________|________|________|________|_________________|________|________|________|________| +| | BACK | BACK | | | | | | | | | | | | | | | | +| | LIGHT | LIGHT | | | | | | | | | | | | | | | | +|____________| TOGGLE |INCREASE|DECREASE|________|________|________|________|________|________|________|________|________|_____________|________|________|________| | +| | | | | | | | | | | | | | | | | | +| | | | | | | | | | | | | | | | | | +|______________|________|________|________|________|________|________|________|________|________|________|________|____________________|________|________|________|________| +| | | | | | | | | | | | | | | | | | +| | | | | | | | | | | | | | | | | | +|__________________|________|________|________|________|________|________|________|________|________|________|________________|________|________|________|________| | +| | | | | | | | | | | | | | +| | | | | | | | | | | | | | +|__________|__________|__________|________________________________________________________|________|________|________|________|________|________|________|________|________| + */ + + [_FN1] = LAYOUT_default( + RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, _______, KC_END, _______, _______, _______, + _______, RGB_TOG, RGB_MOD, RGB_VAI, RGB_VAD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, _______, _______, _______, _______, KC_DEL, _______, _______, _______, _______, + _______, BL_TOGG, BL_INC, BL_DEC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + KC_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + +}; + From 388df5359b913eaf1ce6fb0ef624e430ad010ea5 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Tue, 6 Nov 2018 01:31:56 -0800 Subject: [PATCH 469/788] Fix Spacing issue in makefile that breaks Terminal config --- tmk_core/common.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmk_core/common.mk b/tmk_core/common.mk index 65dcf96f6..8eac1734f 100644 --- a/tmk_core/common.mk +++ b/tmk_core/common.mk @@ -46,7 +46,7 @@ ifeq ($(PLATFORM),CHIBIOS) endif ifeq ($(strip $(AUTO_SHIFT_ENABLE)), yes) TMK_COMMON_SRC += $(CHIBIOS)/os/various/syscalls.c - else ifeq($(strip $(TERMINAL_ENABLE)), yes) + else ifeq ($(strip $(TERMINAL_ENABLE)), yes) TMK_COMMON_SRC += $(CHIBIOS)/os/various/syscalls.c endif endif From 63e212c0b78be664785433c11cd728f15f50cd6a Mon Sep 17 00:00:00 2001 From: Sean Dwyer Date: Tue, 6 Nov 2018 11:54:53 -0800 Subject: [PATCH 470/788] Add localized LED flash effect on keypress to Massdrop ALT (#4340) --- .../massdrop/alt/keymaps/reywood/keymap.c | 195 ++++++++++++++++++ .../alt/keymaps/reywood/rgb_matrix_user.c | 193 +++++++++++++++++ .../alt/keymaps/reywood/rgb_matrix_user.h | 3 + .../massdrop/alt/keymaps/reywood/rules.mk | 34 +++ tmk_core/protocol/arm_atsam/led_matrix.c | 14 +- tmk_core/protocol/arm_atsam/led_matrix.h | 3 +- 6 files changed, 438 insertions(+), 4 deletions(-) create mode 100644 keyboards/massdrop/alt/keymaps/reywood/keymap.c create mode 100644 keyboards/massdrop/alt/keymaps/reywood/rgb_matrix_user.c create mode 100644 keyboards/massdrop/alt/keymaps/reywood/rgb_matrix_user.h create mode 100644 keyboards/massdrop/alt/keymaps/reywood/rules.mk diff --git a/keyboards/massdrop/alt/keymaps/reywood/keymap.c b/keyboards/massdrop/alt/keymaps/reywood/keymap.c new file mode 100644 index 000000000..8b69f0e8e --- /dev/null +++ b/keyboards/massdrop/alt/keymaps/reywood/keymap.c @@ -0,0 +1,195 @@ +#include QMK_KEYBOARD_H +#include "rgb_matrix_user.h" + +enum alt_keycodes { + L_BRI = SAFE_RANGE, //LED Brightness Increase + L_BRD, //LED Brightness Decrease + L_PTN, //LED Pattern Select Next + L_PTP, //LED Pattern Select Previous + L_PSI, //LED Pattern Speed Increase + L_PSD, //LED Pattern Speed Decrease + L_T_MD, //LED Toggle Mode + L_T_ONF, //LED Toggle On / Off + L_ON, //LED On + L_OFF, //LED Off + L_T_BR, //LED Toggle Breath Effect + L_T_PTD, //LED Toggle Scrolling Pattern Direction + U_T_AUTO, //USB Extra Port Toggle Auto Detect / Always Active + U_T_AGCR, //USB Toggle Automatic GCR control + DBG_TOG, //DEBUG Toggle On / Off + DBG_MTRX, //DEBUG Toggle Matrix Prints + DBG_KBD, //DEBUG Toggle Keyboard Prints + DBG_MOU, //DEBUG Toggle Mouse Prints + MD_BOOT, //Restart into bootloader after hold timeout +}; + +#define TG_NKRO MAGIC_TOGGLE_NKRO //Toggle 6KRO / NKRO mode +#define ______ KC_TRNS + +keymap_config_t keymap_config; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_HOME, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN, \ + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, MO(1), KC_LEFT, KC_DOWN, KC_RGHT \ + ), + [1] = LAYOUT( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_MUTE, \ + _______, _______, _______, KC_UP, _______, _______, _______, U_T_AUTO,U_T_AGCR,_______, KC_PSCR, KC_SLCK, KC_PAUS, _______, KC_END, \ + _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, MD_BOOT, TG_NKRO, _______, _______, _______, _______, _______, KC_VOLU, _______, \ + _______, _______, _______, KC_MPLY, MO(2), _______, KC_MRWD, KC_VOLD, KC_MFFD \ + ), + [2] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + L_T_BR, L_PSD, L_BRI, L_PSI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + L_T_PTD, L_PTP, L_BRD, L_PTN, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, L_T_MD, L_T_ONF, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), +}; + +const uint16_t PROGMEM fn_actions[] = { + +}; + +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { +}; + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { +}; + +#define MODS_SHIFT (keyboard_report->mods & MOD_BIT(KC_LSHIFT) || keyboard_report->mods & MOD_BIT(KC_RSHIFT)) +#define MODS_CTRL (keyboard_report->mods & MOD_BIT(KC_LCTL) || keyboard_report->mods & MOD_BIT(KC_RCTRL)) +#define MODS_ALT (keyboard_report->mods & MOD_BIT(KC_LALT) || keyboard_report->mods & MOD_BIT(KC_RALT)) + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + static uint32_t key_timer; + + rgb_matrix_record_key_press(record); + + switch (keycode) { + case L_BRI: + if (record->event.pressed) { + if (LED_GCR_STEP > LED_GCR_MAX - gcr_desired) gcr_desired = LED_GCR_MAX; + else gcr_desired += LED_GCR_STEP; + if (led_animation_breathing) gcr_breathe = gcr_desired; + } + return false; + case L_BRD: + if (record->event.pressed) { + if (LED_GCR_STEP > gcr_desired) gcr_desired = 0; + else gcr_desired -= LED_GCR_STEP; + if (led_animation_breathing) gcr_breathe = gcr_desired; + } + return false; + case L_PTN: + if (record->event.pressed) { + if (led_animation_id == led_setups_count - 1) led_animation_id = 0; + else led_animation_id++; + } + return false; + case L_PTP: + if (record->event.pressed) { + if (led_animation_id == 0) led_animation_id = led_setups_count - 1; + else led_animation_id--; + } + return false; + case L_PSI: + if (record->event.pressed) { + led_animation_speed += ANIMATION_SPEED_STEP; + } + return false; + case L_PSD: + if (record->event.pressed) { + led_animation_speed -= ANIMATION_SPEED_STEP; + if (led_animation_speed < 0) led_animation_speed = 0; + } + return false; + case L_T_MD: + if (record->event.pressed) { + led_lighting_mode++; + if (led_lighting_mode > LED_MODE_MAX_INDEX) led_lighting_mode = LED_MODE_NORMAL; + } + return false; + case L_T_ONF: + if (record->event.pressed) { + led_enabled = !led_enabled; + I2C3733_Control_Set(led_enabled); + } + return false; + case L_ON: + if (record->event.pressed) { + led_enabled = 1; + I2C3733_Control_Set(led_enabled); + } + return false; + case L_OFF: + if (record->event.pressed) { + led_enabled = 0; + I2C3733_Control_Set(led_enabled); + } + return false; + case L_T_BR: + if (record->event.pressed) { + led_animation_breathing = !led_animation_breathing; + if (led_animation_breathing) { + gcr_breathe = gcr_desired; + led_animation_breathe_cur = BREATHE_MIN_STEP; + breathe_dir = 1; + } + } + return false; + case L_T_PTD: + if (record->event.pressed) { + led_animation_direction = !led_animation_direction; + } + return false; + case U_T_AUTO: + if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { + TOGGLE_FLAG_AND_PRINT(usb_extra_manual, "USB extra port manual mode"); + } + return false; + case U_T_AGCR: + if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { + TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode"); + } + return false; + case DBG_TOG: + if (record->event.pressed) { + TOGGLE_FLAG_AND_PRINT(debug_enable, "Debug mode"); + } + return false; + case DBG_MTRX: + if (record->event.pressed) { + TOGGLE_FLAG_AND_PRINT(debug_matrix, "Debug matrix"); + } + return false; + case DBG_KBD: + if (record->event.pressed) { + TOGGLE_FLAG_AND_PRINT(debug_keyboard, "Debug keyboard"); + } + return false; + case DBG_MOU: + if (record->event.pressed) { + TOGGLE_FLAG_AND_PRINT(debug_mouse, "Debug mouse"); + } + return false; + case MD_BOOT: + if (record->event.pressed) { + key_timer = timer_read32(); + } else { + if (timer_elapsed32(key_timer) >= 500) { + reset_keyboard(); + } + } + return false; + default: + return true; //Process all other keycodes normally + } +} diff --git a/keyboards/massdrop/alt/keymaps/reywood/rgb_matrix_user.c b/keyboards/massdrop/alt/keymaps/reywood/rgb_matrix_user.c new file mode 100644 index 000000000..36131e202 --- /dev/null +++ b/keyboards/massdrop/alt/keymaps/reywood/rgb_matrix_user.c @@ -0,0 +1,193 @@ +#include "quantum.h" +#include "led_matrix.h" + +extern issi3733_led_t *led_cur; +extern uint8_t led_per_run; +extern issi3733_led_t *lede; +extern issi3733_led_t led_map[]; + +static uint16_t last_boost_update; +static uint8_t led_boosts[ISSI3733_LED_COUNT]; +static uint8_t led_boost_index; +static uint8_t led_cur_index; + +#define LED_BOOST_REFRESH_INTERVAL_IN_MS 40 +#define LED_BOOST_DECAY 0.7 +#define LED_BOOST_PROPAGATE 0.5 +#define LED_BOOST_PEAK 100 + +#define MIN_RGB 0x050008 +#define MIN_R (MIN_RGB >> 16 & 0xff) +#define MIN_G (MIN_RGB >> 8 & 0xff) +#define MIN_B (MIN_RGB & 0xff) + +#define MAX_RGB 0xc26eff +#define MAX_R (MAX_RGB >> 16 & 0xff) +#define MAX_G (MAX_RGB >> 8 & 0xff) +#define MAX_B (MAX_RGB & 0xff) + +#define UNDERGLOW_RGB 0x4f002e +#define UNDERGLOW_R (UNDERGLOW_RGB >> 16 & 0xff) +#define UNDERGLOW_G (UNDERGLOW_RGB >> 8 & 0xff) +#define UNDERGLOW_B (UNDERGLOW_RGB & 0xff) + +#define UNDERGLOW_SCAN_CODE 255 + +#define max(a, b) (((a) > (b)) ? (a) : (b)) + +#define __ -1 +static const uint8_t KEY_TO_LED_MAP[MATRIX_ROWS][MATRIX_COLS] = { + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}, + {15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29}, + {30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, __, 42, 43}, + {44, __, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57}, + {58, 59, 60, __, __, __, 61, __, __, __, 62, 63, 64, 65, 66}, +}; + +#define KEY_LED_COUNT 67 +#define KP(c, r) { .col = c, .row = r } // shorthand for keypos_t +static const keypos_t LED_TO_KEY_MAP[KEY_LED_COUNT] = { + KP(0, 0), KP(1, 0), KP(2, 0), KP(3, 0), KP(4, 0), KP(5, 0), KP(6, 0), KP(7, 0), KP(8, 0), KP(9, 0), KP(10, 0), KP(11, 0), KP(12, 0), KP(13, 0), KP(14, 0), + KP(0, 1), KP(1, 1), KP(2, 1), KP(3, 1), KP(4, 1), KP(5, 1), KP(6, 1), KP(7, 1), KP(8, 1), KP(9, 1), KP(10, 1), KP(11, 1), KP(12, 1), KP(13, 1), KP(14, 1), + KP(0, 2), KP(1, 2), KP(2, 2), KP(3, 2), KP(4, 2), KP(5, 2), KP(6, 2), KP(7, 2), KP(8, 2), KP(9, 2), KP(10, 2), KP(11, 2), KP(13, 2), KP(14, 2), + KP(0, 3), KP(2, 3), KP(3, 3), KP(4, 3), KP(5, 3), KP(6, 3), KP(7, 3), KP(8, 3), KP(9, 3), KP(10, 3), KP(11, 3), KP(12, 3), KP(13, 3), KP(14, 3), + KP(0, 4), KP(1, 4), KP(2, 4), KP(6, 4), KP(10, 4), KP(11, 4), KP(12, 4), KP(13, 4), KP(14, 4), +}; + + +static void update_led_boosts(void); +static void update_led_cur_rgb_values(void); +static void set_nearest_led_to_max(uint8_t col, uint8_t row); +static uint8_t calculate_new_color_component_value(uint8_t max, uint8_t min); +static void calculate_new_led_boosts(uint8_t new_led_boosts[]); +static uint8_t calculate_new_led_boost_at(int index); +static uint8_t get_propagated_boost_from_neighbors(int led_position); +static uint8_t get_led_boost_at_keypos(uint8_t row, uint8_t col); +static void set_new_led_boosts(uint8_t* new_led_boosts); +static uint8_t map_key_position_to_led_index(uint8_t col, uint8_t row); + + +void rgb_matrix_init_user(void) { + for (int i = 0; i < ISSI3733_LED_COUNT; i++) { + led_boosts[i] = 0; + } + last_boost_update = timer_read(); + led_boost_index = 0; + led_cur_index = 0; +} + +void led_matrix_run(void) { + uint8_t led_this_run = 0; + + if (led_cur == 0) { //Denotes start of new processing cycle in the case of chunked processing + led_cur = led_map; + led_cur_index = 0; + } + update_led_boosts(); + + while (led_cur < lede && led_this_run < led_per_run) { + update_led_cur_rgb_values(); + + led_cur++; + led_cur_index++; + led_this_run++; + } +} + +void rgb_matrix_record_key_press(keyrecord_t *record) { + if (record->event.pressed) { + keypos_t key = record->event.key; + set_nearest_led_to_max(key.col, key.row); + } +} + + +static void update_led_boosts(void) { + if (timer_elapsed(last_boost_update) > LED_BOOST_REFRESH_INTERVAL_IN_MS) { + last_boost_update = timer_read(); + + uint8_t new_led_boosts[ISSI3733_LED_COUNT]; + calculate_new_led_boosts(new_led_boosts); + set_new_led_boosts(new_led_boosts); + } +} + +static void update_led_cur_rgb_values(void) { + if (led_cur->scan == UNDERGLOW_SCAN_CODE) { + *led_cur->rgb.r = UNDERGLOW_R; + *led_cur->rgb.g = UNDERGLOW_G; + *led_cur->rgb.b = UNDERGLOW_B; + } else { + *led_cur->rgb.r = calculate_new_color_component_value(MAX_R, MIN_R); + *led_cur->rgb.g = calculate_new_color_component_value(MAX_G, MIN_G); + *led_cur->rgb.b = calculate_new_color_component_value(MAX_B, MIN_B); + } +} + +static void set_nearest_led_to_max(uint8_t col, uint8_t row) { + uint8_t led_index = map_key_position_to_led_index(col, row); + if (led_index >= 0 && led_index < ISSI3733_LED_COUNT) { + led_boosts[led_index] = LED_BOOST_PEAK; + } +} + +static uint8_t calculate_new_color_component_value(uint8_t max, uint8_t min) { + uint8_t current_boost = led_boosts[led_cur_index]; + return (float)(max - min) * current_boost / LED_BOOST_PEAK + min; +} + +static void calculate_new_led_boosts(uint8_t new_led_boosts[]) { + for (int i = 0; i < ISSI3733_LED_COUNT; i++) { + new_led_boosts[i] = calculate_new_led_boost_at(i); + } +} + +static uint8_t calculate_new_led_boost_at(int index) { + uint8_t decayed_boost = led_boosts[index] * LED_BOOST_DECAY; + uint8_t propagated_boost = get_propagated_boost_from_neighbors(index); + uint8_t new_boost = (propagated_boost > decayed_boost) ? propagated_boost : decayed_boost; + if (new_boost > LED_BOOST_PEAK) { + new_boost = LED_BOOST_PEAK; + } + return new_boost; +} + +static uint8_t get_propagated_boost_from_neighbors(int led_position) { + if (led_position < 0 || led_position >= KEY_LED_COUNT) { + return 0; + } + keypos_t led_keypos = LED_TO_KEY_MAP[led_position]; + uint8_t top_boost = get_led_boost_at_keypos(led_keypos.row - 1, led_keypos.col); + uint8_t bottom_boost = get_led_boost_at_keypos(led_keypos.row + 1, led_keypos.col); + uint8_t left_boost = get_led_boost_at_keypos(led_keypos.row, led_keypos.col - 1); + uint8_t right_boost = get_led_boost_at_keypos(led_keypos.row, led_keypos.col + 1); + uint8_t max_boost = max(max(top_boost, bottom_boost), max(left_boost, right_boost)); + if (max_boost > LED_BOOST_PEAK) { + max_boost = LED_BOOST_PEAK; + } + return max_boost * LED_BOOST_PROPAGATE; +} + +static uint8_t get_led_boost_at_keypos(uint8_t row, uint8_t col) { + if (row < 0 || row >= MATRIX_ROWS || col < 0 || col >= MATRIX_COLS) { + return 0; + } + uint8_t led_index = KEY_TO_LED_MAP[row][col]; + if (led_index < 0) { + return 0; + } + return led_boosts[led_index]; +} + +static void set_new_led_boosts(uint8_t* new_led_boosts) { + for (int i = 0; i < ISSI3733_LED_COUNT; i++) { + led_boosts[i] = new_led_boosts[i]; + } +} + +static uint8_t map_key_position_to_led_index(uint8_t col, uint8_t row) { + if (row >= 0 && row < MATRIX_ROWS && col >= 0 && col < MATRIX_COLS) { + return KEY_TO_LED_MAP[row][col]; + } + return -1; +} diff --git a/keyboards/massdrop/alt/keymaps/reywood/rgb_matrix_user.h b/keyboards/massdrop/alt/keymaps/reywood/rgb_matrix_user.h new file mode 100644 index 000000000..4ffd202e9 --- /dev/null +++ b/keyboards/massdrop/alt/keymaps/reywood/rgb_matrix_user.h @@ -0,0 +1,3 @@ +#pragma once + +void rgb_matrix_record_key_press(keyrecord_t *record); diff --git a/keyboards/massdrop/alt/keymaps/reywood/rules.mk b/keyboards/massdrop/alt/keymaps/reywood/rules.mk new file mode 100644 index 000000000..b5b961a0f --- /dev/null +++ b/keyboards/massdrop/alt/keymaps/reywood/rules.mk @@ -0,0 +1,34 @@ +# project specific files +SRC = led_programs.c +SRC += matrix.c +SRC += rgb_matrix_user.c + +#For platform and packs +ARM_ATSAM = SAMD51J18A +MCU = cortex-m4 + +CUSTOM_MATRIX = yes + +# Build Options +# comment out to disable the options. +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = yes # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) +VIRTSER_ENABLE = no # USB Serial Driver +RAW_ENABLE = no # Raw device +AUTO_SHIFT_ENABLE = no # Auto Shift diff --git a/tmk_core/protocol/arm_atsam/led_matrix.c b/tmk_core/protocol/arm_atsam/led_matrix.c index 7ee1dad22..c328fdc4c 100644 --- a/tmk_core/protocol/arm_atsam/led_matrix.c +++ b/tmk_core/protocol/arm_atsam/led_matrix.c @@ -257,13 +257,15 @@ issi3733_led_t *led_cur; uint8_t led_per_run = 15; float breathe_mult; -void led_matrix_run(led_setup_t *f) +__attribute__ ((weak)) +void led_matrix_run(void) { float ro; float go; float bo; float px; uint8_t led_this_run = 0; + led_setup_t *f = (led_setup_t*)led_setups[led_animation_id]; if (led_cur == 0) //Denotes start of new processing cycle in the case of chunked processing { @@ -459,13 +461,19 @@ uint8_t led_matrix_init(void) //Run led matrix code once for initial LED coloring led_cur = 0; - led_matrix_run((led_setup_t*)led_setups[led_animation_id]); + rgb_matrix_init_user(); + led_matrix_run(); DBGC(DC_LED_MATRIX_INIT_COMPLETE); return 0; } +__attribute__ ((weak)) +void rgb_matrix_init_user(void) { + +} + #define LED_UPDATE_RATE 10 //ms //led data processing can take time, so process data in chunks to free up the processor @@ -502,7 +510,7 @@ void led_matrix_task(void) if (led_cur != lede) { //m15_off; //debug profiling - led_matrix_run((led_setup_t*)led_setups[led_animation_id]); + led_matrix_run(); //m15_on; //debug profiling } } diff --git a/tmk_core/protocol/arm_atsam/led_matrix.h b/tmk_core/protocol/arm_atsam/led_matrix.h index 01b078b71..3f2b9cdb8 100644 --- a/tmk_core/protocol/arm_atsam/led_matrix.h +++ b/tmk_core/protocol/arm_atsam/led_matrix.h @@ -86,6 +86,7 @@ typedef struct led_disp_s { } led_disp_t; uint8_t led_matrix_init(void); +void rgb_matrix_init_user(void); #define LED_MODE_NORMAL 0 //Must be 0 #define LED_MODE_KEYS_ONLY 1 @@ -134,7 +135,7 @@ extern void *led_setups[]; extern issi3733_led_t *led_cur; extern issi3733_led_t *lede; -void led_matrix_run(led_setup_t *f); +void led_matrix_run(void); void led_matrix_task(void); void gcr_compute(void); From f8d800583544bca258b9c10af3ba44de9764639e Mon Sep 17 00:00:00 2001 From: Monksoffunk Date: Wed, 7 Nov 2018 05:00:02 +0900 Subject: [PATCH 471/788] Zinc : Update to latest serial.c #4278 (#4361) * Add Zinc keyboard * Fix photo * Fix readme.md * Fix RGB LED init of monks/keymap.c * Fix default keymap and readme.jp * Fix change DEFS of RGB ANIMATIONS to LED_ANIMATIONS * Add EOL * Use serial_config_simpleapi.h * Fix comment char * Fix error handling in split_scomm.c : mtei works * Fix keymaps * Remove DISABLE_LEADER definition * Remove pro_micro.h * Add 2 spaces after Hardware name * Fix keymaps - remove audio codes - change LAYOUT to LAYOUT_ortho_4X12 - change "persistent_default_layer_set" to core function * Use the Community Layouts feature - with some clean up * Update latest serial.c #4278 --- keyboards/zinc/serial.c | 78 +++++++++++++++++++++++++++++++++-------- 1 file changed, 63 insertions(+), 15 deletions(-) diff --git a/keyboards/zinc/serial.c b/keyboards/zinc/serial.c index 830f86b55..325c29a3f 100644 --- a/keyboards/zinc/serial.c +++ b/keyboards/zinc/serial.c @@ -1,5 +1,10 @@ /* * WARNING: be careful changing this code, it is very timing dependent + * + * 2018-10-28 checked + * avr-gcc 4.9.2 + * avr-gcc 5.4.0 + * avr-gcc 7.3.0 */ #ifndef F_CPU @@ -65,6 +70,7 @@ #error serial.c now support ATmega32U4 only #endif +//////////////// for backward compatibility //////////////////////////////// #ifndef SERIAL_USE_MULTI_TRANSACTION /* --- USE Simple API (OLD API, compatible with let's split serial.c) */ #if SERIAL_SLAVE_BUFFER_LENGTH > 0 @@ -106,7 +112,8 @@ int serial_update_buffers() return result; } -#endif // Simple API (OLD API, compatible with let's split serial.c) +#endif // end of Simple API (OLD API, compatible with let's split serial.c) +//////////////////////////////////////////////////////////////////////////// #define ALWAYS_INLINE __attribute__((always_inline)) #define NO_INLINE __attribute__((noinline)) @@ -136,38 +143,68 @@ int serial_update_buffers() // 5: about 20kbps #endif -#define TID_SEND_ADJUST 2 +#if __GNUC__ < 6 + #define TID_SEND_ADJUST 14 +#else + #define TID_SEND_ADJUST 2 +#endif #if SELECT_SOFT_SERIAL_SPEED == 0 // Very High speed #define SERIAL_DELAY 4 // micro sec - #define READ_WRITE_START_ADJUST 33 // cycles - #define READ_WRITE_WIDTH_ADJUST 6 // cycles + #if __GNUC__ < 6 + #define READ_WRITE_START_ADJUST 33 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_START_ADJUST 34 // cycles + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif #elif SELECT_SOFT_SERIAL_SPEED == 1 // High speed #define SERIAL_DELAY 6 // micro sec - #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #if __GNUC__ < 6 + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_START_ADJUST 33 // cycles + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif #elif SELECT_SOFT_SERIAL_SPEED == 2 // Middle speed #define SERIAL_DELAY 12 // micro sec #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #if __GNUC__ < 6 + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif #elif SELECT_SOFT_SERIAL_SPEED == 3 // Low speed #define SERIAL_DELAY 24 // micro sec #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #if __GNUC__ < 6 + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif #elif SELECT_SOFT_SERIAL_SPEED == 4 // Very Low speed #define SERIAL_DELAY 36 // micro sec #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #if __GNUC__ < 6 + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif #elif SELECT_SOFT_SERIAL_SPEED == 5 // Ultra Low speed #define SERIAL_DELAY 48 // micro sec #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #if __GNUC__ < 6 + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif #else #error invalid SELECT_SOFT_SERIAL_SPEED value #endif /* SELECT_SOFT_SERIAL_SPEED */ @@ -187,16 +224,19 @@ int serial_update_buffers() static SSTD_t *Transaction_table = NULL; static uint8_t Transaction_table_size = 0; +inline static void serial_delay(void) ALWAYS_INLINE; inline static void serial_delay(void) { _delay_us(SERIAL_DELAY); } +inline static void serial_delay_half1(void) ALWAYS_INLINE; inline static void serial_delay_half1(void) { _delay_us(SERIAL_DELAY_HALF1); } +inline static void serial_delay_half2(void) ALWAYS_INLINE; inline static void serial_delay_half2(void) { _delay_us(SERIAL_DELAY_HALF2); @@ -216,6 +256,7 @@ void serial_input_with_pullup(void) { SERIAL_PIN_PORT |= SERIAL_PIN_MASK; } +inline static uint8_t serial_read_pin(void) ALWAYS_INLINE; inline static uint8_t serial_read_pin(void) { return !!(SERIAL_PIN_INPUT & SERIAL_PIN_MASK); @@ -270,7 +311,7 @@ void sync_recv(void) { } // Used by the reciver to send a synchronization signal to the sender. -static void sync_send(void)NO_INLINE; +static void sync_send(void) NO_INLINE; static void sync_send(void) { serial_low(); @@ -536,7 +577,14 @@ int soft_serial_get_and_clean_status(int sstd_index) { #endif // Helix serial.c history -// 2018-1-29 fork from let's split (#2308) -// 2018-6-28 bug fix master to slave comm (#3255) -// 2018-8-11 improvements (#3608) -// 2018-10-21 fix serial and RGB animation conflict (#4191) +// 2018-1-29 fork from let's split and add PD2, modify sync_recv() (#2308, bceffdefc) +// 2018-6-28 bug fix master to slave comm and speed up (#3255, 1038bbef4) +// (adjusted with avr-gcc 4.9.2) +// 2018-7-13 remove USE_SERIAL_PD2 macro (#3374, f30d6dd78) +// (adjusted with avr-gcc 4.9.2) +// 2018-8-11 add support multi-type transaction (#3608, feb5e4aae) +// (adjusted with avr-gcc 4.9.2) +// 2018-10-21 fix serial and RGB animation conflict (#4191, 4665e4fff) +// (adjusted with avr-gcc 7.3.0) +// 2018-10-28 re-adjust compiler depend value of delay (#4269, 8517f8a66) +// (adjusted with avr-gcc 5.4.0, 7.3.0) From 8f5ac39fb90e9036a9df60f286888e02daf3fd1b Mon Sep 17 00:00:00 2001 From: TheOneTrueTrench <38593283+TheOneTrueTrench@users.noreply.github.com> Date: Tue, 6 Nov 2018 20:01:18 +0000 Subject: [PATCH 472/788] separated all my changes into separate files, working on generalizing my relativity macros. (#4368) * Updating to my local changes. * Added auto-complete for joins. * Added lights to imply current state better --- keyboards/dz60/keymaps/marianas/customLogic.c | 138 +++++ keyboards/dz60/keymaps/marianas/customLogic.h | 10 + .../dz60/keymaps/marianas/keyDefinitions.h | 124 +++++ keyboards/dz60/keymaps/marianas/keymap.c | 521 +----------------- keyboards/dz60/keymaps/marianas/keymap.h | 114 +--- keyboards/dz60/keymaps/marianas/relativity.c | 510 +++++++++++++++++ keyboards/dz60/keymaps/marianas/relativity.h | 32 ++ keyboards/dz60/keymaps/marianas/rules.mk | 4 + 8 files changed, 839 insertions(+), 614 deletions(-) create mode 100644 keyboards/dz60/keymaps/marianas/customLogic.c create mode 100644 keyboards/dz60/keymaps/marianas/customLogic.h create mode 100644 keyboards/dz60/keymaps/marianas/keyDefinitions.h create mode 100644 keyboards/dz60/keymaps/marianas/relativity.c create mode 100644 keyboards/dz60/keymaps/marianas/relativity.h diff --git a/keyboards/dz60/keymaps/marianas/customLogic.c b/keyboards/dz60/keymaps/marianas/customLogic.c new file mode 100644 index 000000000..b7dbcac95 --- /dev/null +++ b/keyboards/dz60/keymaps/marianas/customLogic.c @@ -0,0 +1,138 @@ +#include QMK_KEYBOARD_H +#include "customLogic.h" +#include "keymap.h" +#include "keyDefinitions.h" +#include "relativity.h" +#include "timer.h" + +static int16_t fnTimer = 0; + + + +uint32_t layer_state_set_user(uint32_t state) +{ + switch (biton32(state)) + { + case QWERTY: + rgblight_mode(9); + break; + case NAV_CLUSTER: + rgblight_mode(29); + break; + case GAMING: + rgblight_mode(26); + break; + case SQLMACROS: + rgblight_mode(1); + break; + case FN_LAYER: + rgblight_mode(RGBLIGHT_MODE_RAINBOW_SWIRL+5); + break; + } + return state; +} + + + +bool printSqlVerbs(uint16_t keycode, keyrecord_t *record) +{ + if (record->event.pressed) + { + switch (keycode) + { + case S_LFTJN: + SEND_STRING("LEFT JOIN"); + activateRelativity(); + return false; + case S_INRJN: + SEND_STRING("INNER JOIN "); + activateRelativity(); + return false; + case S_SLCT: + SEND_STRING("SELECT "); return + false; + case S_FROM: + SEND_STRING("FROM "); return + false; + case S_DSNCT: + SEND_STRING("DISTINCT "); return + false; + case S_ORDER: + SEND_STRING("ORDER BY "); return + false; + case S_WHERE: + SEND_STRING("WHERE "); return + false; + case S_ALTER: + SEND_STRING("ALTER SESSION SET CURRENT_SCHEMA = SUPPLY;"); return false; + case S_ASTRK: + SEND_STRING("* "); return false; + + } + } + return true; +} + + +bool isFn = false; +bool didFn = false; + + +bool updateLayerState(uint16_t keycode, keyrecord_t *record) +{ + + if (record->event.pressed) + { + switch (keycode) + { + case FN_QT: + fnTimer = timer_read(); + layer_on(FN_LAYER); + isFn = true; + return false; + } + if (isFn) + { + didFn = true; + return true; + } + } + else + { + switch(keycode) + { + case FN_QT: + layer_off(FN_LAYER); + if (!didFn) + { + #if fnTimeout + if (TIMER_DIFF_16(timer_read(), fnTimer) <= fnTimeout) + { + activateRelativity(); + } + else + { + deactivateRelativity(); + } + #else + activateRelativity(); + #endif + } + didFn = false; + isFn = false; + return false; + } + } + return true; +} + + + +bool process_record_user(uint16_t keycode, keyrecord_t *record) +{ + return + storeShiftState(keycode, record) && + printSqlVerbs(keycode, record) && + updateLayerState(keycode, record) && + handleSmartMacros(keycode, record); +} diff --git a/keyboards/dz60/keymaps/marianas/customLogic.h b/keyboards/dz60/keymaps/marianas/customLogic.h new file mode 100644 index 000000000..f0e6ecdca --- /dev/null +++ b/keyboards/dz60/keymaps/marianas/customLogic.h @@ -0,0 +1,10 @@ +#define fnTimeout 500 + + +uint32_t layer_state_set_user(uint32_t state); + +bool printSqlVerbs(uint16_t keycode, keyrecord_t *record); + +bool updateLayerState(uint16_t keycode, keyrecord_t *record); + +bool process_record_user(uint16_t keycode, keyrecord_t *record); diff --git a/keyboards/dz60/keymaps/marianas/keyDefinitions.h b/keyboards/dz60/keymaps/marianas/keyDefinitions.h new file mode 100644 index 000000000..010ace769 --- /dev/null +++ b/keyboards/dz60/keymaps/marianas/keyDefinitions.h @@ -0,0 +1,124 @@ + +//Control +#define MO_FNLR MO(FN_LAYER) +#define BACKSPC KC_BSPC +#define ENTER_OR_SQL LT(SQLMACROS,KC_ENT) +#define ESCAP KC_ESC +#define PSCR KC_PSCREEN +#define SCRL KC_SCROLLLOCK +#define PAUS KC_PAUSE +#define NSRT KC_INSERT +#define HOME KC_HOME +#define PGUP KC_PGUP +#define PGDN KC_PGDN +#define END_ KC_END +#define DELT KC_DELETE +#define UPUP KC_UP +#define D_WN KC_DOWN +#define LEFT KC_LEFT +#define RGHT KC_RIGHT + +//KEYPAD +#define KP_1 KC_KP_1 +#define KP_2 KC_KP_2 +#define KP_3 KC_KP_3 +#define KP_4 KC_KP_4 +#define KP_5 KC_KP_5 +#define KP_6 KC_KP_6 +#define KP_7 KC_KP_7 +#define KP_8 KC_KP_8 +#define KP_9 KC_KP_9 +#define KP_0 KC_KP_0 +#define NMLK KC_NUMLOCK +#define STAR KC_KP_ASTERISK +#define KSSH KC_KP_SLASH +#define KMIN KC_KP_MINUS +#define PLUS KC_KP_PLUS +#define KNTR KC_KP_ENTER +#define KDOT KC_KP_DOT + +//Modifiers +#define CTLL KC_LCTL +#define LEFTSHFT KC_LSPO +#define WINL KC_LGUI +#define ALTL KC_LALT +#define CTLR KC_RCTL +#define RIGHT_SHIFT__PAREN KC_RSPC +#define WINR KC_RGUI +#define ALTR KC_RALT +#define APPR KC_APP + + +//Punctuation +#define CMMA KC_COMM +#define PRRD KC_DOT +#define SLSH KC_SLSH +#define QUOT KC_QUOT +#define COLN KC_SCLN +#define LBRC KC_LBRC +#define RBRC KC_RBRC +#define EQUL KC_EQL +#define MNUS KC_MINS +#define BSLASH KC_BSLS + +//Layers +#define QWRTY TO(QWERTY) +#define NAVS TO(NAV_CLUSTER) +#define GAME TO(GAMING) + +//Space +#define ____ KC_TRNS +#define _____ KC_TRNS +#define ______ KC_TRNS +#define _______ KC_TRNS +#define ________ KC_TRNS +#define ___________ KC_TRNS +#define _________________ KC_TRNS +#define SPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACE KC_SPC +#define KCNO KC_NO + +enum sql_macros { + S_LFTJN = SAFE_RANGE, // L + S_INRJN, // I + S_SLCT, // S + S_FROM, // F + S_DSNCT, // D + S_ORDER, // O + S_WHERE, // W + S_ALTER, // Esc + S_ASTRK, // * + + TD_A, + TD_B, + TD_C, // Corp, Corporation, Company + TD_D, // Distribution, Dist, Distributor + TD_E, + TD_F, + TD_G, // GlobalLookup + TD_H, + TD_I, // Instance, Item + TD_J, + TD_K, + TD_L, + TD_M, + TD_N, // NadRate + TD_O, + TD_P, // Product, Person, + TD_Q, // Darden + TD_R, + TD_S, // Supplier, Step + TD_T, // Task, Type + TD_U, + TD_V, + TD_W, // Workflow, + TD_X, + TD_Y, + TD_Z, + TD_BSPC, + TD_ENT, + TD_ESC, + + FN_QT +}; + +bool isShifted(void); diff --git a/keyboards/dz60/keymaps/marianas/keymap.c b/keyboards/dz60/keymaps/marianas/keymap.c index e40bc6897..f86074b9c 100644 --- a/keyboards/dz60/keymaps/marianas/keymap.c +++ b/keyboards/dz60/keymaps/marianas/keymap.c @@ -1,505 +1,10 @@ #include QMK_KEYBOARD_H #include "keymap.h" +#include "relativity.h" +#include "keyDefinitions.h" +#include "customLogic.h" -enum marianas_layers { - QWERTY, -/* - COLEMAK, - DVORAK, -*/ - NAV_CLUSTER, - GAMING, - SQLMACROS, - SQLNAMES, - FN_LAYER -}; - -enum sql_macros { - S_LFTJN = SAFE_RANGE, // L - S_INRJN, // I - S_SLCT, // S - S_FROM, // F - S_DSNCT, // D - S_ORDER, // O - S_WHERE, // W - S_ALTER, // Esc - S_ASTRK, // * - - TD_A, - TD_B, - TD_C, // Corp, Corporation, Company - TD_D, // Distribution, Dist, Distributor - TD_E, - TD_F, - TD_G, // GlobalLookup - TD_H, - TD_I, // Instance, Item - TD_J, - TD_K, - TD_L, - TD_M, - TD_N, // NadRate - TD_O, - TD_P, // Product, Person, - TD_Q, // Darden - TD_R, - TD_S, // Supplier, Step - TD_T, // Task, Type - TD_U, - TD_V, - TD_W, // Workflow, - TD_X, - TD_Y, - TD_Z, - TD_BSPC, - TD_ENT, - TD_ESC -}; - -uint16_t *macroTaps = 0; - -char *tableNameList = 0; - -uint8_t *charCount = 0; -uint8_t countPointer = 0; - -bool shifted = false; - -bool sendAbbr = false; - - -void initStringData(void) -{ - if (macroTaps == 0) - { - macroTaps = malloc(macroTapsLen*sizeof(uint16_t)); - for(int i = 0; i < macroTapsLen; i++) - { - macroTaps[i] = 0; - } - } - if (tableNameList == 0) - { - tableNameList = malloc(tableNameListLen*sizeof(char)); - for(int i = 0; i < tableNameListLen; i++) - { - tableNameList[i] = 0; - } - } - if (charCount == 0) - { - charCount = malloc(charCountLen*sizeof(uint8_t)); - for (int i = 0; i < charCountLen; i++) - { - charCount[i] = 0; - } - } -} - - -uint32_t layer_state_set_user(uint32_t state) -{ - switch (biton32(state)) - { - case QWERTY: - rgblight_mode(9); - break; - case NAV_CLUSTER: - rgblight_mode(29); - break; - case GAMING: - rgblight_mode(26); - break; - case SQLMACROS: - rgblight_mode(1); - rgblight_setrgb(0x00, 0xFF, 0x80); - break; - case SQLNAMES: - rgblight_mode(1); - rgblight_setrgb(0x80, 0xFF, 0x00); - break; - case FN_LAYER: - rgblight_mode(1); - rgblight_setrgb(0x00, 0x80, 0xFF); - break; - } - return state; -} - -bool containsCode(uint16_t kc) -{ - for (int i = 0; i < macroTapsLen && macroTaps[i] > 0; i++) - { - if (macroTaps[i] == kc) return true; - } - return false; -} - -bool lastCodeIs(uint16_t kc) -{ - for (int i = 0; i < macroTapsLen-1 && macroTaps[i] > 0; i++) - { - if (macroTaps[i] == kc && macroTaps[i+1] == 0) return true; - } - return false; -} - -bool last2CodeAre(uint16_t kc) -{ - for (int i = 0; i < macroTapsLen-2 && macroTaps[i] > 0; i++) - { - if (macroTaps[i] == kc && macroTaps[i+1] == kc && macroTaps[i+2] == 0) return true; - } - return false; -} - -bool last2CodesAre(uint16_t kc, uint16_t kc2) -{ - for (int i = 0; i < macroTapsLen-2 && macroTaps[i] > 0; i++) - { - if (macroTaps[i] == kc && macroTaps[i+1] == kc2 && macroTaps[i+2] == 0) return true; - } - return false; -} - -void addKeyCode(uint16_t kc) -{ - int i = 0; - while (i < macroTapsLen-2 && macroTaps[i] > 0) i++; - if (macroTaps[i] == 0) - { - macroTaps[i] = kc; - macroTaps[i+1] = 0; - } -} - -void eraseKeyCodes(void) -{ - int i = 0; - while (i < macroTapsLen && macroTaps[i] > 0) macroTaps[i++] = 0; -} - -void eraseCharCounts(void) -{ - int i = 0; - while (i < charCountLen) - { - charCount[i] = 0; - } -} - -void printTableAbbreviation(void) -{ - initStringData(); - if (tableNameList[0] == 0) - { - return; - } - send_char(0x20); - int i = 0; - for (i = 0; i < tableNameListLen && tableNameList[i] > 0; i++) - { - if (tableNameList[i] >= 65 && tableNameList[i] <= 90) - { - send_char(tableNameList[i]+32); - } - else - { - send_char(tableNameList[i]); - } - } - send_char(0x20); -} - -void eraseTableAbbreviation(void) -{ - initStringData(); - for (int i = 0; i < tableNameListLen && tableNameList[i] > 0; i++) - { - tableNameList[i] = '\0'; - } -} - -void printString(char* str) -{ - - if (str[0] != '\0') - { - int i = 0; - while (true) - { - if (str[i] == 0) - { - break; - } - send_char(str[i++]); - charCount[countPointer]++; - } - } -} - -void printStringAndQueueChar(char* str) -{ - initStringData(); - if (charCount[countPointer] != 0) - { - countPointer++; - } - sendAbbr = true; - if (str[0] != '\0') - { - printString(str); - - for (int i = 0; i < tableNameListLen-1; i++) - { - if (tableNameList[i] == '\0') - { - tableNameList[i] = str[0]; - tableNameList[i+1] = '\0'; - break; - } - else if (i == tableNameListLen-2) - { - printTableAbbreviation(); - break; - } - } - //for (i = 0; i < tableNameListLen && tableNameList[i] > 0; i++) - //{ - // send_char(tableNameList[i]); - //} - //send_string_P("Darden"); - //send_string_P(&myarray); - //send_string_P(str); - } -} - -void ReplaceString(char *orig, char *repl) -{ - int i = 0; - while((orig[i] != 0x0 && repl[i] != 0x0) && orig[i] == repl[i]) - i++; - - if(orig[i] != 0x0) - { - int o = i; - while (orig[o++] != 0x0) { - charCount[countPointer]--; - register_code(KC_BSPC); - unregister_code(KC_BSPC); - } - } - printString(repl+i); -} - -void deletePrev(void) -{ - for (int i = 0; i < charCount[countPointer]; i++) - { - register_code(KC_BSPC); - unregister_code(KC_BSPC); - } - charCount[countPointer] = 0; - countPointer--; - int i = 1; - for (;i < tableNameListLen-1; i++) - { - if (tableNameList[i] == 0x0) - { - break; - } - } - tableNameList[i-1] = 0x0; -} - -void processSmartMacroTap(uint16_t kc) -{ - initStringData(); - switch(kc) - { - case TD_C: - if (containsCode(TD_D)) - { - printString("ribution"); - printStringAndQueueChar("Center"); - } - else if (last2CodeAre(TD_C)) - { - ReplaceString("Corporation", "Contact"); - } - else if(lastCodeIs(TD_C)) - { - printString("oration"); - } - else - { - printStringAndQueueChar("Corp"); - } - break; - case TD_D: - if (last2CodeAre(TD_D)) - { - ReplaceString("Distribution", "Distributor"); - } - else if(lastCodeIs(TD_D)) - { - printString("ribution"); - } - else - { - printStringAndQueueChar("Dist"); - } - break; - case TD_G: - printStringAndQueueChar("Global"); - printStringAndQueueChar("Lookup"); - break; - case TD_I: - if (containsCode(TD_W)) - printStringAndQueueChar("Instance"); - else - printStringAndQueueChar("Item"); - break; - case TD_N: - printStringAndQueueChar("NadRate"); - break; - case TD_P: - if (last2CodesAre(TD_D, TD_C)) - { - ReplaceString("DistributionCenter", "DistCenter"); - printStringAndQueueChar("Pricing"); - } - else if (last2CodeAre(TD_P)) - { - } - else if(lastCodeIs(TD_P)) - { - ReplaceString("Product", "Person"); - } - else - { - printStringAndQueueChar("Product"); - } - break; - case TD_Q: - printStringAndQueueChar("Darden"); - break; - case TD_S: - if (containsCode(TD_W)) - if (containsCode(TD_S) || containsCode(TD_D)) - printStringAndQueueChar("Step"); - else - printStringAndQueueChar("Session"); - else - printStringAndQueueChar("Supplier"); - break; - case TD_T: - if (containsCode(TD_W)) - printStringAndQueueChar("Task"); - else - printStringAndQueueChar("Type"); - break; - case TD_W: - printStringAndQueueChar("Workflow"); - break; - } - addKeyCode(kc); -} - -bool process_record_user(uint16_t keycode, keyrecord_t *record) -{ - if (record->event.pressed) - { - switch (keycode) - { - case KC_LSPO: - case KC_RSPC: - shifted = true; - return true; - - case S_LFTJN: SEND_STRING("LEFT JOIN"); return false; - case S_INRJN: SEND_STRING("INNER JOIN "); return false; - case S_SLCT: SEND_STRING("SELECT "); return false; - case S_FROM: SEND_STRING("FROM "); return false; - case S_DSNCT: SEND_STRING("DISTINCT "); return false; - case S_ORDER: SEND_STRING("ORDER "); return false; - case S_WHERE: SEND_STRING("WHERE "); return false; - case S_ALTER: SEND_STRING("ALTER SESSION SET CURRENT_SCHEMA = "); return false; - case S_ASTRK: SEND_STRING("* "); return false; - - case KC_BSLS: - initStringData(); - layer_on(SQLNAMES); - return false; - - case TD_BSPC: - if (!shifted){ - deletePrev(); - } - else { - register_code(KC_BSPC); - unregister_code(KC_BSPC); - } - return false; - - case TD_A: - case TD_B: - case TD_C: - case TD_D: - case TD_E: - case TD_F: - case TD_G: - case TD_H: - case TD_I: - case TD_J: - case TD_K: - case TD_L: - case TD_M: - case TD_N: - case TD_O: - case TD_P: - case TD_Q: - case TD_R: - case TD_S: - case TD_T: - case TD_U: - case TD_V: - case TD_W: - case TD_X: - case TD_Y: - case TD_Z: - processSmartMacroTap(keycode); - return false; - - case TD_ENT: - printTableAbbreviation(); - case TD_ESC: - eraseKeyCodes(); - eraseTableAbbreviation(); - layer_off(SQLNAMES); - return true; - } - } - else - { - switch (keycode) - { - - case KC_BSLS: - if (macroTaps[0] == 0) - { - SEND_STRING("\\"); - layer_off(SQLNAMES); - } - return true; - case KC_LSPO: - case KC_RSPC: - shifted = false; - return true; - } - } - return true; -}; +// planned change: store previous table names and abbreviations to allow scrolling for inner joins on table name+id and abbreviation+id. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { @@ -507,7 +12,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LAYOUT_60_ansi( ESCAP, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, MNUS, EQUL, BACKSPC, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, LBRC, RBRC, BSLASH, - MO_FNLR, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, COLN, QUOT, ENTER_OR_SQL, + FN_QT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, COLN, QUOT, ENTER_OR_SQL, LEFTSHFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, CMMA, PRRD, SLSH, RIGHT_SHIFT__PAREN, CTLL, WINL, ALTL, SPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACE, ALTR, WINR, APPR, CTLR), @@ -531,23 +36,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LAYOUT_60_ansi( S_ALTER, ____, ____, ____, ____, ____, ____, ____, S_ASTRK, ____, ____, ____, ____, ___________, ______, ____, S_WHERE, ____, ____, ____, ____, ____, S_INRJN, S_ORDER, ____, ____, ____, ______, - _______, KC_LBRC, S_SLCT, KC_PAST,S_FROM, ____, ____, ____, ____, S_LFTJN, ____, RBRC, ___________, - ________, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, _________________, + _______, KC_LBRC, S_SLCT, S_ASTRK ,S_FROM, ____, ____, ____, ____, S_LFTJN, ____, RBRC, ___________, + ________, RGB_VAI, RGB_VAD, ____, ____, ____, ____, ____, ____, ____, ____, _________________, ____, ____, ____, /*------------------*/_____/*------------------*/, ____, ____, ____, ____), - [SQLNAMES]= - LAYOUT_60_ansi( - TD_ESC, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, TD_BSPC, - ________, TD_Q, TD_W, TD_E, TD_R, TD_T, TD_Y, TD_U, TD_I, TD_O, TD_P, ____, ____, _____, - ___________, TD_A, TD_S, TD_D, TD_F, TD_G, TD_H, TD_J, TD_K, TD_L, ____, ____, TD_ENT, - ___________, TD_Z, TD_X, TD_C, TD_V, TD_B, TD_N, TD_M, ____, ____, ____, _________________, - ____, ____, ____, /*----------------------*/TD_ENT/*-----------------------*/, ____, ____, ____, RESET), - [FN_LAYER]= LAYOUT_60_ansi( KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_CAPSLOCK, KC_MPRV, KC_MPLY, KC_MNXT, LWIN(KC_R), ____, KC_CALC, KC_PGUP, KC_UP, KC_PGDN, KC_PSCR, KC_SLCK, KC_BRK, ____, ____, KC_VOLD, KC_MUTE, KC_VOLU, ____, ____, KC_HOME, KC_LEFT, KC_DOWN, KC_RIGHT, KC_INS, KC_DEL, ____, - ____, ____, ____, ____, ____, ____, KC_END, ____, QWRTY, NAVS, GAME, ____, - ____, ____, ____, _________________, ____, KC_HYPR, KC_MEH, ____) + ____, RGB_HUI, RGB_SAI, RGB_SAD, ____, ____, KC_END, QWRTY, GAME, NAVS, ____, ____, + ____, ____, ____, _________________, ____, KC_HYPR, KC_MEH, RESET) }; diff --git a/keyboards/dz60/keymaps/marianas/keymap.h b/keyboards/dz60/keymaps/marianas/keymap.h index 00e51cea2..bb1ea68c7 100644 --- a/keyboards/dz60/keymaps/marianas/keymap.h +++ b/keyboards/dz60/keymaps/marianas/keymap.h @@ -1,105 +1,15 @@ -#include "quantum.h" - -//Control -#define MO_FNLR MO(FN_LAYER) -#define BACKSPC KC_BSPC -#define ENTER_OR_SQL LT(SQLMACROS,KC_ENT) -#define ESCAP KC_ESC -#define PSCR KC_PSCREEN -#define SCRL KC_SCROLLLOCK -#define PAUS KC_PAUSE -#define NSRT KC_INSERT -#define HOME KC_HOME -#define PGUP KC_PGUP -#define PGDN KC_PGDN -#define END_ KC_END -#define DELT KC_DELETE -#define UPUP KC_UP -#define D_WN KC_DOWN -#define LEFT KC_LEFT -#define RGHT KC_RIGHT - -//KEYPAD -#define KP_1 KC_KP_1 -#define KP_2 KC_KP_2 -#define KP_3 KC_KP_3 -#define KP_4 KC_KP_4 -#define KP_5 KC_KP_5 -#define KP_6 KC_KP_6 -#define KP_7 KC_KP_7 -#define KP_8 KC_KP_8 -#define KP_9 KC_KP_9 -#define KP_0 KC_KP_0 -#define NMLK KC_NUMLOCK -#define STAR KC_KP_ASTERISK -#define KSSH KC_KP_SLASH -#define KMIN KC_KP_MINUS -#define PLUS KC_KP_PLUS -#define KNTR KC_KP_ENTER -#define KDOT KC_KP_DOT - -//Modifiers -#define CTLL KC_LCTL -#define LEFTSHFT KC_LSPO -#define WINL KC_LGUI -#define ALTL KC_LALT -#define CTLR KC_RCTL -#define RIGHT_SHIFT__PAREN KC_RSPC -#define WINR KC_RGUI -#define ALTR KC_RALT -#define APPR KC_APP +#include QMK_KEYBOARD_H -//Punctuation -#define CMMA KC_COMM -#define PRRD KC_DOT -#define SLSH KC_SLSH -#define QUOT KC_QUOT -#define COLN KC_SCLN -#define LBRC KC_LBRC -#define RBRC KC_RBRC -#define EQUL KC_EQL -#define MNUS KC_MINS -#define BSLASH KC_BSLS +enum marianas_layers { + QWERTY, +/* + COLEMAK, + DVORAK, +*/ + NAV_CLUSTER, + GAMING, + SQLMACROS, + FN_LAYER +}; -//Layers -#define QWRTY TO(QWERTY) -#define NAVS TO(NAV_CLUSTER) -#define GAME TO(GAMING) - -//Space -#define ____ KC_TRNS -#define _____ KC_TRNS -#define ______ KC_TRNS -#define _______ KC_TRNS -#define ________ KC_TRNS -#define ___________ KC_TRNS -#define _________________ KC_TRNS -#define SPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACE KC_SPC -#define KCNO KC_NO - - - - - -#define macroTapsLen 32 -#define tableNameListLen 32 -#define charCountLen 32 - -void initStringData(void); -uint32_t layer_state_set_user(uint32_t state); -bool containsCode(uint16_t kc); -bool lastCodeIs(uint16_t kc); -bool last2CodeAre(uint16_t kc); -bool last2CodesAre(uint16_t kc, uint16_t kc2); -void addKeyCode(uint16_t kc); -void eraseKeyCodes(void); -void eraseCharCounts(void); -void printTableAbbreviation(void); -void eraseTableAbbreviation(void); -void printString(char* str); -void printStringAndQueueChar(char* str); -void ReplaceString(char *orig, char *repl); -void deletePrev(void); -void processSmartMacroTap(uint16_t kc); -bool process_record_user(uint16_t keycode, keyrecord_t *record); diff --git a/keyboards/dz60/keymaps/marianas/relativity.c b/keyboards/dz60/keymaps/marianas/relativity.c new file mode 100644 index 000000000..96a5eb4e6 --- /dev/null +++ b/keyboards/dz60/keymaps/marianas/relativity.c @@ -0,0 +1,510 @@ +#include "relativity.h" +#include "keymap.h" +#include "keyDefinitions.h" + + +uint16_t *macroTaps = 0; + +char *tableNameList = 0; + +uint8_t *charCount = 0; +uint8_t countPointer = 0; + +bool relativityActive = false; + + +bool sendAbbr = false; + + +static int16_t relativityTimer = 0; + + +bool tempOff = false; + + + + +void initStringData() +{ + if (macroTaps == 0) + { + macroTaps = malloc(macroTapsLen*sizeof(uint16_t)); + for(int i = 0; i < macroTapsLen; i++) + { + macroTaps[i] = 0; + } + } + if (tableNameList == 0) + { + tableNameList = malloc(tableNameListLen*sizeof(char)); + for(int i = 0; i < tableNameListLen; i++) + { + tableNameList[i] = 0; + } + } + if (charCount == 0) + { + charCount = malloc(charCountLen*sizeof(uint8_t)); + for (int i = 0; i < charCountLen; i++) + { + charCount[i] = 0; + } + } +} + +void activateRelativity(void) +{ + initStringData(); + rgblight_mode(RGBLIGHT_MODE_KNIGHT); + relativityTimer = timer_read(); + relativityActive = true; +} + +bool deactivateRelativity(void) +{ + rgblight_mode(9); + eraseKeyCodes(); + eraseTableAbbreviation(); + eraseCharCounts(); + relativityActive = false; + tempOff = false; + return false; +} + +bool containsCode(uint16_t kc) +{ + for (int i = 0; i < macroTapsLen && macroTaps[i] > 0; i++) + { + if (macroTaps[i] == kc) return true; + } + return false; +} + +bool lastCodeIs(uint16_t kc) +{ + for (int i = 0; i < macroTapsLen-1 && macroTaps[i] > 0; i++) + { + if (macroTaps[i] == kc && macroTaps[i+1] == 0) return true; + } + return false; +} + +bool last2CodeAre(uint16_t kc) +{ + for (int i = 0; i < macroTapsLen-2 && macroTaps[i] > 0; i++) + { + if (macroTaps[i] == kc && macroTaps[i+1] == kc && macroTaps[i+2] == 0) return true; + } + return false; +} + +bool last2CodesAre(uint16_t kc, uint16_t kc2) +{ + for (int i = 0; i < macroTapsLen-2 && macroTaps[i] > 0; i++) + { + if (macroTaps[i] == kc && macroTaps[i+1] == kc2 && macroTaps[i+2] == 0) return true; + } + return false; +} + +void addKeyCode(uint16_t kc) +{ + int i = 0; + while (i < macroTapsLen-2 && macroTaps[i] > 0) i++; + if (macroTaps[i] == 0) + { + macroTaps[i] = kc; + macroTaps[i+1] = 0; + } +} + +void eraseKeyCodes(void) +{ + int i = 0; + while (i < macroTapsLen && macroTaps[i] > 0) macroTaps[i++] = 0; +} + +void eraseCharCounts(void) +{ + while (countPointer > 0) + { + charCount[countPointer] = 0; + countPointer--; + } + charCount[countPointer] = 0; +} + +void printTableAbbreviationLimited(void) +{ + if (tableNameList[0] == 0) + { + return; + } + int i = 0; + for (i = 0; i < tableNameListLen && tableNameList[i] > 0; i++) + { + if (tableNameList[i] >= 65 && tableNameList[i] <= 90) + { + send_char(tableNameList[i]+32); + } + else + { + send_char(tableNameList[i]); + } + } +} + +void printTableAbbreviation(void) +{ + if (tableNameList[0] == 0) + { + return; + } + send_char(0x20); + int i = 0; + for (i = 0; i < tableNameListLen && tableNameList[i] > 0; i++) + { + if (tableNameList[i] >= 65 && tableNameList[i] <= 90) + { + send_char(tableNameList[i]+32); + } + else + { + send_char(tableNameList[i]); + } + } + send_char(0x20); +} + +void eraseTableAbbreviation(void) +{ + for (int i = 0; i < tableNameListLen && tableNameList[i] > 0; i++) + { + tableNameList[i] = '\0'; + } +} + +void printString(char* str) +{ + + if (str[0] != '\0') + { + int i = 0; + while (true) + { + if (str[i] == 0) + { + break; + } + send_char(str[i++]); + charCount[countPointer]++; + } + } +} + +void printStringAndQueueChar(char* str) +{ + if (charCount[countPointer] > 0 && countPointer < charCountLen) + { + countPointer++; + } + sendAbbr = true; + if (str[0] != '\0') + { + printString(str); + + for (int i = 0; i < tableNameListLen-1; i++) + { + if (tableNameList[i] == '\0') + { + tableNameList[i] = str[0]; + tableNameList[i+1] = '\0'; + break; + } + else if (i == tableNameListLen-2) + { + printTableAbbreviation(); + break; + } + } + //for (i = 0; i < tableNameListLen && tableNameList[i] > 0; i++) + //{ + // send_char(tableNameList[i]); + //} + //send_string_P("Darden"); + //send_string_P(&myarray); + //send_string_P(str); + } +} + +void ReplaceString(char *orig, char *repl) +{ + int i = 0; + while((orig[i] != 0x0 && repl[i] != 0x0) && orig[i] == repl[i]) + i++; + + if(orig[i] != 0x0) + { + int o = i; + while (orig[o++] != 0x0) { + charCount[countPointer]--; + register_code(KC_BSPC); + unregister_code(KC_BSPC); + } + } + printString(repl+i); +} + +void deletePrev(void) +{ + if (countPointer == 0 && charCount[countPointer] == 0) + return; + for (int i = 0; i < charCount[countPointer]; i++) + { + register_code(KC_BSPC); + unregister_code(KC_BSPC); + } + charCount[countPointer] = 0; + int i = 1; + for (;i < tableNameListLen-1; i++) + { + if (tableNameList[i] == 0x0) + { + break; + } + } + tableNameList[i-1] = 0x0; + if (countPointer > 0) + { + countPointer--; + } +} + +bool processSmartMacroTap(uint16_t kc) +{ + if (relativityTimer > 0 && TIMER_DIFF_16(timer_read(), relativityTimer) >= relTimeout) + { + deactivateRelativity(); + return true; + } + relativityTimer = 0; + switch(kc) + { + case KC_C: + if (containsCode(KC_D)) + { + printString("ribution"); + printStringAndQueueChar("Center"); + } + else if (last2CodeAre(KC_C)) + { + ReplaceString("Corporation", "Contact"); + } + else if(lastCodeIs(KC_C)) + { + printString("oration"); + } + else + { + printStringAndQueueChar("Corp"); + } + break; + case KC_D: + if (last2CodeAre(KC_D)) + { + ReplaceString("Distribution", "Distributor"); + } + else if(lastCodeIs(KC_D)) + { + printString("ribution"); + } + else + { + printStringAndQueueChar("Dist"); + } + break; + case KC_G: + printStringAndQueueChar("Global"); + printStringAndQueueChar("Lookup"); + break; + case KC_I: + if (containsCode(KC_W)) + printStringAndQueueChar("Instance"); + else + printStringAndQueueChar("Item"); + break; + case KC_N: + printStringAndQueueChar("NadRate"); + break; + case KC_P: + if (last2CodesAre(KC_D, KC_C)) + { + ReplaceString("DistributionCenter", "DistCenter"); + printStringAndQueueChar("Pricing"); + } + else if (last2CodeAre(KC_P)) + { + } + else if(lastCodeIs(KC_P)) + { + ReplaceString("Product", "Person"); + } + else + { + printStringAndQueueChar("Product"); + } + break; + case KC_Q: + printStringAndQueueChar("Darden"); + break; + case KC_S: + if (containsCode(KC_W)) + if (containsCode(KC_S) || containsCode(KC_D)) + printStringAndQueueChar("Step"); + else + printStringAndQueueChar("Session"); + else + printStringAndQueueChar("Supplier"); + break; + case KC_T: + if (containsCode(KC_W)) + printStringAndQueueChar("Task"); + else + printStringAndQueueChar("Type"); + break; + case KC_W: + printStringAndQueueChar("Workflow"); + break; + } + addKeyCode(kc); + return false; +} + + +bool shifted = false; +bool isShifted() +{ + return shifted; +} + +void setShifted(bool val) +{ + shifted = val; +} + + +bool storeShiftState(uint16_t keycode, keyrecord_t *record) +{ + + if (record->event.pressed) + { + switch (keycode) + { + case KC_LSPO: + case KC_RSPC: + shifted = true; + } + } + else + { + switch (keycode) + { + + case KC_LSPO: + case KC_RSPC: + shifted = false; + return true; + } + } + return true; +} + +bool handleSmartMacros(uint16_t keycode, keyrecord_t *record) +{ + if (relativityActive != true) return true; + if (record->event.pressed) + { + switch (keycode) + { + case KC_BSPC: + if (!isShifted()){ + deletePrev(); + } + else { + register_code(KC_BSPC); + unregister_code(KC_BSPC); + } + return false; + case KC_A: + case KC_B: + case KC_C: + case KC_D: + case KC_E: + case KC_F: + case KC_G: + case KC_H: + case KC_I: + case KC_J: + case KC_K: + case KC_L: + case KC_M: + case KC_N: + case KC_O: + case KC_P: + case KC_Q: + case KC_R: + case KC_S: + case KC_T: + case KC_U: + case KC_V: + case KC_W: + case KC_X: + case KC_Y: + case KC_Z: + return processSmartMacroTap(keycode); + + case PRRD: + if (tempOff) + { + SEND_STRING("Id = "); + printTableAbbreviationLimited(); + SEND_STRING(".Id"); + return deactivateRelativity(); + } + else + { + printTableAbbreviation(); + SEND_STRING("ON "); + printTableAbbreviationLimited(); + eraseKeyCodes(); + eraseTableAbbreviation(); + eraseCharCounts(); + tempOff = true; + return true; + } + + + case KC_SPC: + printTableAbbreviation(); + return deactivateRelativity(); + case ENTER_OR_SQL: + if (tempOff) + { + SEND_STRING("Id = "); + printTableAbbreviationLimited(); + SEND_STRING(".Id"); + deactivateRelativity(); + return true; + } + else + { + printTableAbbreviation(); + deactivateRelativity(); + return true; + } + case KC_ESC: + return deactivateRelativity(); + } + } + return true; +} diff --git a/keyboards/dz60/keymaps/marianas/relativity.h b/keyboards/dz60/keymaps/marianas/relativity.h new file mode 100644 index 000000000..c917b1a4d --- /dev/null +++ b/keyboards/dz60/keymaps/marianas/relativity.h @@ -0,0 +1,32 @@ +#include QMK_KEYBOARD_H +#define macroTapsLen 32 +#define tableNameListLen 32 +#define charCountLen 32 + +#define relTimeout 1500 + + +void activateRelativity(void); +bool deactivateRelativity(void); +void initStringData(void); +bool containsCode(uint16_t kc); +bool lastCodeIs(uint16_t kc); +bool last2CodeAre(uint16_t kc); +bool last2CodesAre(uint16_t kc, uint16_t kc2); +void addKeyCode(uint16_t kc); +void eraseKeyCodes(void); +void eraseCharCounts(void); +void printTableAbbreviation(void); +void eraseTableAbbreviation(void); +void printString(char* str); +void printStringAndQueueChar(char* str); +void ReplaceString(char *orig, char *repl); +void deletePrev(void); +bool processSmartMacroTap(uint16_t kc); +bool isShifted(void); +void setShifted(bool); + + + +bool handleSmartMacros(uint16_t keycode, keyrecord_t *record); +bool storeShiftState(uint16_t keycode, keyrecord_t *record); diff --git a/keyboards/dz60/keymaps/marianas/rules.mk b/keyboards/dz60/keymaps/marianas/rules.mk index ab188f3b2..230d194ab 100644 --- a/keyboards/dz60/keymaps/marianas/rules.mk +++ b/keyboards/dz60/keymaps/marianas/rules.mk @@ -15,3 +15,7 @@ AUDIO_ENABLE = no RGBLIGHT_ENABLE = yes TAP_DANCE_ENABLE = no AUTO_SHIFT_ENABLE = no + + +SRC += relativity.c +SRC += customLogic.c From a91f439aec39ec8bbcbb2f579a9434c266f09f5c Mon Sep 17 00:00:00 2001 From: Takeshi ISHII <2170248+mtei@users.noreply.github.com> Date: Wed, 7 Nov 2018 05:02:30 +0900 Subject: [PATCH 473/788] Helix-serial.c configuration improvement (#4370) The new simple API can be selected. Previous version, can select two way. * use old API (compatible with let's split serial.c) * use new API (multi-type transaction) This version, can select three way. * use old API (compatible with let's split serial.c) * use new API (single-type transaction) * use new API (multi-type transaction) There is no change in the code generated by this change. --- keyboards/helix/serial.c | 6 +++--- keyboards/helix/serial.h | 35 ++++++++++++++++++++--------------- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/keyboards/helix/serial.c b/keyboards/helix/serial.c index 325c29a3f..6006ebf1b 100644 --- a/keyboards/helix/serial.c +++ b/keyboards/helix/serial.c @@ -71,8 +71,8 @@ #endif //////////////// for backward compatibility //////////////////////////////// -#ifndef SERIAL_USE_MULTI_TRANSACTION -/* --- USE Simple API (OLD API, compatible with let's split serial.c) */ +#if !defined(SERIAL_USE_SINGLE_TRANSACTION) && !defined(SERIAL_USE_MULTI_TRANSACTION) +/* --- USE OLD API (compatible with let's split serial.c) */ #if SERIAL_SLAVE_BUFFER_LENGTH > 0 uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; #endif @@ -112,7 +112,7 @@ int serial_update_buffers() return result; } -#endif // end of Simple API (OLD API, compatible with let's split serial.c) +#endif // end of OLD API (compatible with let's split serial.c) //////////////////////////////////////////////////////////////////////////// #define ALWAYS_INLINE __attribute__((always_inline)) diff --git a/keyboards/helix/serial.h b/keyboards/helix/serial.h index 7e0c0847a..2e53928df 100644 --- a/keyboards/helix/serial.h +++ b/keyboards/helix/serial.h @@ -15,31 +15,36 @@ // // 4: about 26kbps // // 5: about 20kbps // -// //// USE Simple API (OLD API, compatible with let's split serial.c) +// //// USE OLD API (compatible with let's split serial.c) // ex. // #define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 // #define SERIAL_MASTER_BUFFER_LENGTH 1 // -// //// USE flexible API (using multi-type transaction function) -// #define SERIAL_USE_MULTI_TRANSACTION +// //// USE NEW API +// //// USE simple API (using signle-type transaction function) +// #define SERIAL_USE_SINGLE_TRANSACTION +// //// USE flexible API (using multi-type transaction function) +// #define SERIAL_USE_MULTI_TRANSACTION // // ///////////////////////////////////////////////////////////////// -#ifndef SERIAL_USE_MULTI_TRANSACTION -/* --- USE Simple API (OLD API, compatible with let's split serial.c) */ -#if SERIAL_SLAVE_BUFFER_LENGTH > 0 -extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH]; -#endif -#if SERIAL_MASTER_BUFFER_LENGTH > 0 -extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH]; -#endif +//////////////// for backward compatibility //////////////////////////////// +#if !defined(SERIAL_USE_SINGLE_TRANSACTION) && !defined(SERIAL_USE_MULTI_TRANSACTION) +/* --- USE OLD API (compatible with let's split serial.c) */ + #if SERIAL_SLAVE_BUFFER_LENGTH > 0 + extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH]; + #endif + #if SERIAL_MASTER_BUFFER_LENGTH > 0 + extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH]; + #endif -void serial_master_init(void); -void serial_slave_init(void); -int serial_update_buffers(void); + void serial_master_init(void); + void serial_slave_init(void); + int serial_update_buffers(void); -#endif // USE Simple API +#endif // end of USE OLD API +//////////////////////////////////////////////////////////////////////////// // Soft Serial Transaction Descriptor typedef struct _SSTD_t { From 29dd6645898d1647c5e4326c9851c2f1562bb6a0 Mon Sep 17 00:00:00 2001 From: Danilo Vulicevic Date: Tue, 6 Nov 2018 21:03:33 +0100 Subject: [PATCH 474/788] Add whitefox/billypython keymap (#4374) * Add keyboards/whitefox/keymaps/billypython Cloned from vomindoraan/qmk_firmware * Customize keymap for Linux --- .../whitefox/keymaps/billypython/config.h | 20 ++ .../whitefox/keymaps/billypython/keymap.c | 205 ++++++++++++++++++ .../whitefox/keymaps/billypython/rules.mk | 10 + 3 files changed, 235 insertions(+) create mode 100644 keyboards/whitefox/keymaps/billypython/config.h create mode 100644 keyboards/whitefox/keymaps/billypython/keymap.c create mode 100644 keyboards/whitefox/keymaps/billypython/rules.mk diff --git a/keyboards/whitefox/keymaps/billypython/config.h b/keyboards/whitefox/keymaps/billypython/config.h new file mode 100644 index 000000000..d1c3002d2 --- /dev/null +++ b/keyboards/whitefox/keymaps/billypython/config.h @@ -0,0 +1,20 @@ +#pragma once + +#define FORCE_NKRO + +#undef IS_COMMAND +#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RCTL))) + +#define MAGIC_KEY_LAYER0_ALT1 BSLS +#define MAGIC_KEY_BOOTLOADER ESC + +#define MOUSEKEY_DELAY 50 +#define MOUSEKEY_INTERVAL 15 +#define MOUSEKEY_MAX_SPEED 4 +#define MOUSEKEY_TIME_TO_MAX 50 +#define MOUSEKEY_WHEEL_MAX_SPEED 1 +#define MOUSEKEY_WHEEL_TIME_TO_MAX 50 + +#define PERMISSIVE_HOLD +#define TAPPING_TERM 200 +#define TAPPING_TOGGLE 2 diff --git a/keyboards/whitefox/keymaps/billypython/keymap.c b/keyboards/whitefox/keymaps/billypython/keymap.c new file mode 100644 index 000000000..8096885cf --- /dev/null +++ b/keyboards/whitefox/keymaps/billypython/keymap.c @@ -0,0 +1,205 @@ +#include QMK_KEYBOARD_H + +#define TOP LCTL(KC_HOME) +#define BOTTOM LCTL(KC_END) +#define DSKTP_L LCTL(LGUI(KC_LEFT)) +#define DSKTP_R LCTL(LGUI(KC_RGHT)) + +#define FN MO(L_FN) +#define FN_CAPS LT(L_FN, KC_CAPS) +#define FN_FNLK TT(L_FN) + +#define DESKTOP TD(TD_DESKTOP) +#define FN_RCTL TD(TD_FN_RCTL) +#define RAL_LAL TD(TD_RAL_LAL) +#define RAL_RGU TD(TD_RAL_RGU) +#define RCT_RSF TD(TD_RCT_RSF) +#define RSF_RCT TD(TD_RSF_RCT) + +#define COMMA UC(0x002C) +#define L_PAREN UC(0x0028) +#define R_PAREN UC(0x0029) +#define EQUALS UC(0x003D) +#define TIMES UC(0x00D7) +#define DIVIDE UC(0x00F7) +#define MINUS UC(0x2212) + +void eeconfig_init_user(void) { + set_unicode_input_mode(UC_LNX); +} + +enum layers { + L_BASE, + L_FN, + L_NUMPAD, +}; + +enum custom_keycodes { + CLEAR = SAFE_RANGE, + NUMPAD, +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case CLEAR: + if (record->event.pressed) { + SEND_STRING(SS_LCTRL("a") SS_TAP(X_DELETE)); + } + return false; + + case NUMPAD: + if (record->event.pressed) { + layer_invert(L_NUMPAD); + bool num_lock = host_keyboard_leds() & 1<count == 1 || state->count == 3) { + layer_on(L_FN); + } else if (state->count == 2) { + if (!td_fn_rctrl_data.fn_on) { + layer_off(L_FN); + } + register_code(KC_RCTL); + } +} + +void td_fn_rctrl_reset(qk_tap_dance_state_t *state, void *user_data) { + if ((state->count == 1 || state->count > 2) && !td_fn_rctrl_data.fn_on) { + layer_off(L_FN); + } + if (state->count >= 2) { + unregister_code(KC_RCTL); + } + td_fn_rctrl_data.started = false; +} + +#define ACTION_TAP_DANCE_DOUBLE_MODS(mod1, mod2) { \ + .fn = { td_double_mods_each, NULL, td_double_mods_reset }, \ + .user_data = &(qk_tap_dance_pair_t){ mod1, mod2 }, \ + } + +void td_double_mods_each(qk_tap_dance_state_t *state, void *user_data) { + qk_tap_dance_pair_t *mods = (qk_tap_dance_pair_t *)user_data; + // Single tap → mod1, double tap → mod2, triple tap etc. → mod1+mod2 + if (state->count == 1 || state->count == 3) { + register_code(mods->kc1); + } else if (state->count == 2) { + unregister_code(mods->kc1); + register_code(mods->kc2); + } + // Prevent tap dance from sending kc1 and kc2 as weak mods + state->weak_mods &= ~(MOD_BIT(mods->kc1) | MOD_BIT(mods->kc2)); +} + +void td_double_mods_reset(qk_tap_dance_state_t *state, void *user_data) { + qk_tap_dance_pair_t *mods = (qk_tap_dance_pair_t *)user_data; + if (state->count == 1 || state->count > 2) { + unregister_code(mods->kc1); + } + if (state->count >= 2) { + unregister_code(mods->kc2); + } +} + +enum tap_dance { + TD_DESKTOP, + TD_FN_RCTL, + TD_RAL_LAL, + TD_RAL_RGU, + TD_RCT_RSF, + TD_RSF_RCT, +}; + +qk_tap_dance_action_t tap_dance_actions[] = { + [TD_DESKTOP] = ACTION_TAP_DANCE_DOUBLE(LCTL(LGUI(KC_D)), LCTL(LGUI(KC_F4))), // Add/close virtual desktop + [TD_FN_RCTL] = ACTION_TAP_DANCE_FN_ADVANCED(td_fn_rctrl_each, NULL, td_fn_rctrl_reset), + [TD_RAL_LAL] = ACTION_TAP_DANCE_DOUBLE_MODS(KC_RALT, KC_LALT), + [TD_RAL_RGU] = ACTION_TAP_DANCE_DOUBLE_MODS(KC_RALT, KC_RGUI), + [TD_RCT_RSF] = ACTION_TAP_DANCE_DOUBLE_MODS(KC_RCTL, KC_RSFT), + [TD_RSF_RCT] = ACTION_TAP_DANCE_DOUBLE_MODS(KC_RSFT, KC_RCTL), +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Base layer + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ + * │Esc│ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ \ │ ` │PSc│ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┼───┤ + * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │Bspc │Del│ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤ + * │FnCaps│ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ Enter │PgU│ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤ + * │ LShift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │SftCtl│ ↑ │PgD│ + * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬─┬───┼───┼───┤ + * │LCtl│LGui│LAlt│ Space │AlGu│FnLk│ │ ← │ ↓ │ → │ + * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘ + */ + [L_BASE] = LAYOUT_truefox( \ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL, KC_BSLS,KC_GRV, KC_PSCR, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC,KC_BSPC, KC_DEL, \ + FN_CAPS,KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_ENT, KC_PGUP, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,RSF_RCT, KC_UP, KC_PGDN, \ + KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, RAL_RGU,FN_FNLK, KC_LEFT,KC_DOWN,KC_RGHT \ + ), + + /* Function layer + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ + * │ │F1 │F2 │F3 │F4 │F5 │F6 │F7 │F8 │F9 │F10│F11│F12│Num│Scr│Pau│ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┼───┤ + * │ M4 │M2 │M↑ │M1 │M3 │M5 │ │PgU│ ↑ │PgD│Ply│Prv│Nxt│Clear│Ins│ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤ + * │ │M← │M↓ │M→ │MW↑│ │Hom│ ← │ ↓ │ → │End│ │ │Top│ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤ + * │ │MA0│MA2│MW←│MW→│ │ │ │VoD│VoU│Mut│ App │PgU│Btm│ + * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬─┬───┼───┼───┤ + * │ │ │ │ MW↓ │ │ │ │Hom│PgD│End│ + * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘ + */ + [L_FN] = LAYOUT_truefox( \ + _______,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, NUMPAD, KC_SLCK,KC_PAUS, \ + KC_BTN4,KC_BTN2,KC_MS_U,KC_BTN1,KC_BTN3,KC_BTN5,_______,KC_PGUP,KC_UP, KC_PGDN,KC_MPLY,KC_MPRV,KC_MNXT,CLEAR, KC_INS, \ + _______,KC_MS_L,KC_MS_D,KC_MS_R,KC_WH_U,_______,KC_HOME,KC_LEFT,KC_DOWN,KC_RGHT,KC_END, _______, _______, TOP, \ + _______, KC_ACL0,KC_ACL2,KC_WH_L,KC_WH_R,_______,_______,_______,KC_VOLD,KC_VOLU,KC_MUTE,KC_APP, KC_PGUP,BOTTOM, \ + _______,_______,_______, KC_WH_D, _______,_______, KC_HOME,KC_PGDN,KC_END \ + ), + + /* Numpad layer + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ + * │Num│ │ │ │ │ │ │P7 │P8 │P9 │P- │ − │ = │Num│ │ │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┼───┤ + * │ │ │ │ │ │ │ │P4 │P5 │P6 │P+ │ ( │ ) │ │ │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤ + * │ │ │ │ │ │ │ │P1 │P2 │P3 │P* │ × │ PEnter │ │ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤ + * │ │ │ │ │ │ │P0 │P0 │ , │P. │P/ │ ÷ │ │ │ + * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬─┬───┼───┼───┤ + * │ │ │ │ │ │ │ │ │ │ │ + * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘ + */ + [L_NUMPAD] = LAYOUT_truefox( \ + NUMPAD, _______,_______,_______,_______,_______,_______,KC_P7, KC_P8, KC_P9, KC_PMNS,MINUS, EQUALS, NUMPAD, _______,_______, \ + _______,_______,_______,_______,_______,_______,_______,KC_P4, KC_P5, KC_P6, KC_PPLS,L_PAREN,R_PAREN,_______, _______, \ + _______,_______,_______,_______,_______,_______,_______,KC_P1, KC_P2, KC_P3, KC_PAST,TIMES, KC_PENT, _______, \ + _______, _______,_______,_______,_______,_______,KC_P0, KC_P0, COMMA, KC_PDOT,KC_PSLS,DIVIDE, _______,_______, \ + _______,_______,_______, _______, _______,_______, _______,_______,_______ \ + ), +}; diff --git a/keyboards/whitefox/keymaps/billypython/rules.mk b/keyboards/whitefox/keymaps/billypython/rules.mk new file mode 100644 index 000000000..abf92c2c4 --- /dev/null +++ b/keyboards/whitefox/keymaps/billypython/rules.mk @@ -0,0 +1,10 @@ +BACKLIGHT_ENABLE = no +BOOTMAGIC_ENABLE = no +COMMAND_ENABLE = yes +CONSOLE_ENABLE = yes +EXTRAKEY_ENABLE = yes +MOUSEKEY_ENABLE = yes +NKRO_ENABLE = yes +TAP_DANCE_ENABLE = yes +UNICODE_ENABLE = yes +VISUALIZER_ENABLE = no From a5d22424f40cf386120008b5d44d810c62d0ffcb Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Tue, 6 Nov 2018 12:04:25 -0800 Subject: [PATCH 475/788] Commit my DZ60 keymap (#4375) * default mechmerlin keymap initial commit * fix up the keymap * cleanup keymap * add rgb sleep functionality * add the beginning of a readme * fix that compile error * fixup formatting * spruce up that readme * add RGB lighting controls to _CL layer * update readme * set rgb underglow color * update readme * fix formatting --- keyboards/dz60/keymaps/mechmerlin/config.h | 6 ++ keyboards/dz60/keymaps/mechmerlin/keymap.c | 40 ++++++++++++ keyboards/dz60/keymaps/mechmerlin/readme.md | 68 +++++++++++++++++++++ 3 files changed, 114 insertions(+) create mode 100644 keyboards/dz60/keymaps/mechmerlin/config.h create mode 100644 keyboards/dz60/keymaps/mechmerlin/keymap.c create mode 100644 keyboards/dz60/keymaps/mechmerlin/readme.md diff --git a/keyboards/dz60/keymaps/mechmerlin/config.h b/keyboards/dz60/keymaps/mechmerlin/config.h new file mode 100644 index 000000000..92d4cfb50 --- /dev/null +++ b/keyboards/dz60/keymaps/mechmerlin/config.h @@ -0,0 +1,6 @@ +#pragma once + +// Turn off RGB when computer goes to sleep +#ifdef RGBLIGHT_ENABLE +#define RGBLIGHT_SLEEP +#endif // RGBLIGHT_ENABLE diff --git a/keyboards/dz60/keymaps/mechmerlin/keymap.c b/keyboards/dz60/keymaps/mechmerlin/keymap.c new file mode 100644 index 000000000..1a8593ef1 --- /dev/null +++ b/keyboards/dz60/keymaps/mechmerlin/keymap.c @@ -0,0 +1,40 @@ +#include QMK_KEYBOARD_H + +enum keyboard_layers { + _BL = 0, // Base Layer + _FL, // Function Layer + _CL // Control Layer +}; + +// Custom #defined keycodes (shorter macros for readability) +#define KC_CTCP LCTL_T(KC_CAPS) +#define KC_RSSH RSFT_T(KC_SLSH) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BL] = LAYOUT_60_b_ansi( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, + KC_CTCP, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_RSSH, KC_UP, KC_DEL, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, MO(_FL), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [_FL] = LAYOUT_60_b_ansi( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_DEL, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, KC_PGUP, MO(_CL), + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGDN, KC_END), + + [_CL] = LAYOUT_60_b_ansi( + RESET, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, RGB_M_SN, RGB_M_K, RGB_M_X, RGB_M_G, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RGB_RMOD, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) +}; + +// Set underglow RGB leds to yellow +// Find the list of available colors in quantum/rgblight_list.h +void matrix_init_user(void) { + rgblight_sethsv_noeeprom_yellow(); +} diff --git a/keyboards/dz60/keymaps/mechmerlin/readme.md b/keyboards/dz60/keymaps/mechmerlin/readme.md new file mode 100644 index 000000000..76ff54de5 --- /dev/null +++ b/keyboards/dz60/keymaps/mechmerlin/readme.md @@ -0,0 +1,68 @@ +# MechMerlin's DZ60 Keymap + +The purpose of this keymap is to provide examples on how to do some common QMK features. + +Make example for this keyboard (after setting up your build environment): + + make dz60:mechmerlin + +## Merlin's DZ60 Hardware Info +--- + +The DZ60 is a 60% pcb produced by KBDFans. It comes in two variants, USB Mini B and USB C. It supports many many layouts. It also supports both backlight and RGB underglow. The USB C variant does not have a hardware reset switch. USB C to C is not supported. + +Merlin's DZ60 uses +- Layout B, in QMK this is LAYOUT_60_b_ansi. +- USB C +- 50g Zilents +- Arrows are 78g Zilents +- KPRepublic XD64 Case + +## Layers +--- + +Merlin's keymap has three different layers. To switch layers you can use the `MO(X)` keycode, where `X` is the layer you want to switch to. + +### _BL + +This is the base layer also known as layer 0. It is a standard QWERTY layout. It has the `_FL` layer switch key. + +### _FL + +This is the function layer also known as layer 1. It utiizes the following: +- Function Keys +- Navigation Keys +- Audio keys such as Mute, Volume Down and Volume Up. +- `_CL` layer switch key + +### _CL + +This is the control layer also known as layer 2. It utilizes the following: +- RGB Controls +- `RESET` key + +## Non Standard Keycodes +--- +### RESET + +As long `BOOTMAGIC_ENABLE` is set to `yes` in `rules.mk`, the DZ60 can be put into bootloader mode by holding the `space` key and the `b` key while plugging in. However sometmes this doesn't work or is troublesome to do, might as well use the `RESET` keycode to accomplish this. + +### RSFT_T(KC_SLSH) + +Layout B is missing the `?` key and is instead replaced with a `right shift`. This keycode makes it so that the key can be tapped for `?` and held for `right shift`. + +### LCTL_T(KC_CAPS) + +`Caps Lock` is only ever used by tapping, why not use it as a `control` key when held? This keycode makes it so that the key can be tapped for `caps lock` and held for `control`. + + +## RGB Lighting +--- + +### RGBLIGHT_SLEEP + +This is set in `mechmerlin/config.h` so that when the computer goes to sleep, the RGB lights will also go to sleep on the keyboard. They will turn back on when the computer wakes. + +### RGB Underglow Color: Yellow + +This is set in `mechmerlin/keymap.c` in the `matrix_init_user` function. The list of available colors can be found in [`quantum/rgblight_list.h`](https://github.com/qmk/qmk_firmware/blob/388df5359b913eaf1ce6fb0ef624e430ad010ea5/quantum/rgblight_list.h#L59-L121). From 3dec80b7746ee61e4c9e67da817635828dd86b7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20=C4=90or=C4=91evi=C4=87?= Date: Tue, 6 Nov 2018 21:21:44 +0100 Subject: [PATCH 476/788] Improve wording, punctuation and capitalization in newbs_getting_started guide (#4342) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Improve wording, punctuation and capitalization in newbs_getting_started guide Also add some links * Update example build command output Co-Authored-By: vomindoraan * Replace occurrences of "layout" with "keymap" Co-Authored-By: MechMerlin <30334081+mechmerlin@users.noreply.github.com> * Explicitly instruct users to open an MSYS2 MinGW 64-bit terminal * MSYS2 Console → MSYS2 MinGW * Replace thin spaces with regular spaces --- docs/newbs_getting_started.md | 78 +++++++++++++++++------------------ 1 file changed, 38 insertions(+), 40 deletions(-) diff --git a/docs/newbs_getting_started.md b/docs/newbs_getting_started.md index 218154285..276c7fec3 100644 --- a/docs/newbs_getting_started.md +++ b/docs/newbs_getting_started.md @@ -1,99 +1,97 @@ # Introduction -Your computer keyboard has a processor inside of it, not unlike the one inside your computer. This processor runs software that is responsible for detecting button presses and sending reports about the state of the keyboard when they are pressed or released. QMK fills the role of that software, detecting button presses and passing that information on to the host computer. When you build your custom layout you are creating the equivalent of an .exe for your keyboard. +Your computer keyboard has a processor inside of it, not unlike the one inside your computer. This processor runs software that is responsible for detecting button presses and sending reports about the state of the keyboard when buttons are pressed or released. QMK fills the role of that software, detecting button presses and passing that information on to the host computer. When you build your custom keymap, you are creating the equivalent of an executable program for your keyboard. -QMK tries to put a lot of power into your hands by making easy things easy, and hard things possible. You don't have to know how to program to create powerful layouts, you only have to follow a few simple syntax rules. +QMK tries to put a lot of power into your hands by making easy things easy, and hard things possible. You don't have to know how to program to create powerful keymaps — you only have to follow a few simple syntax rules. # Getting Started -Before you can build keymaps you need to install some software and setup your build environment. This only has to be done one time no matter how many keyboards you want to compile firmware for. +Before you can build keymaps, you need to install some software and set up your build environment. This only has to be done once no matter how many keyboards you plan to compile firmware for. ## Download Software ### Text Editor -You'll need a program that can edit and save **plain text** files. If you are on Windows you can make due with Notepad, and on Linux you can use Gedit, both of which are simple but functional text editors. On macOS be careful with TextEdit.app, it will not save plain text files unless you make sure to select "Make Plain text" from the "Format" menu, or you can use another program such as Sublime Text. +You'll need a program that can edit and save **plain text** files. If you're on Windows you can make do with Notepad, and on Linux you can use gedit. Both of these are simple but functional text editors. On macOS, be careful with the default TextEdit app: it will not save plain text files unless you explicitly select _Make Plain Text_ from the _Format_ menu. + +You can also download and install a dedicated text editor like [Sublime Text](https://www.sublimetext.com/) or [VS Code](https://code.visualstudio.com/). This is probably the best way to go regardless of platform, as these programs are specifically made for editing code. ?> Not sure which text editor to use? Laurence Bradford wrote [a great introduction](https://learntocodewith.me/programming/basics/text-editors/) to the subject. ### QMK Toolbox -QMK Toolbox is an optional graphical Windows and macOS program that allows you to both program and debug your custom keyboard. You will likely prefer it to easily flash your keyboard and receive the debugging messages that your keyboard will print. +QMK Toolbox is an optional graphical program for Windows and macOS that allows you to both program and debug your custom keyboard. You will likely find it invaluable for easily flashing your keyboard and viewing debug messages that it prints. -Download the files from the links below: +[Download the latest release here.](https://github.com/qmk/qmk_toolbox/releases/latest) -For Windows: "qmk_toolbox.exe" or "qmk_toolbox_install.exe" (with installer) +* For Windows: `qmk_toolbox.exe` (portable) or `qmk_toolbox_install.exe` (installer) +* For macOS: `QMK.Toolbox.app.zip` (portable) or `QMK.Toolbox.pkg` (installer) -For Mac: "QMK.Toolbox.app.zip" or "QMK.Toolbox.pkg" (with installer) +## Set Up Your Environment -* [Newest Release](https://github.com/qmk/qmk_toolbox/releases/latest) -* [Source Code](https://github.com/qmk/qmk_toolbox/) +We've tried to make QMK as easy to set up as possible. You only have to prepare your Linux or Unix environment, then let QMK install the rest. -## Environment Setup - -We've tried to make QMK as easy to setup as possible. You only have to prepare your Linux or Unix environment and let QMK install the rest. - -?> If you haven't worked with the Linux/Unix command line before there are a few basic concepts and commands you should learn. These resources will teach you enough to work with QMK:
+?> If you haven't worked with the Linux/Unix command line before, there are a few basic concepts and commands you should learn. These resources will teach you enough to be able to work with QMK:
[Must Know Linux Commands](https://www.guru99.com/must-know-linux-commands.html)
[Some Basic Unix Commands](https://www.tjhsst.edu/~dhyatt/superap/unixcmd.html) ### Windows -You will need to install msys2 and git. +You will need to install MSYS2 and Git. -* Follow the installation instructions on the msys2 homepage: http://www.msys2.org -* Close any open msys2 terminals, and open a new terminal -* Install git by running this command: `pacman -S git` +* Follow the installation instructions on the [MSYS2 homepage](http://www.msys2.org). +* Close any open MSYS2 terminals and open a new MSYS2 MinGW 64-bit terminal. +* Install Git by running this command: `pacman -S git`. ### macOS -You will need to install homebrew. Follow the instructions on the homebrew homepage: https://brew.sh +You will need to install Homebrew. Follow the instructions on the [Homebrew homepage](https://brew.sh). -After homebrew is installed continue with "Download QMK", following step "Setup QMK" runs a script that will install other packages. +After Homebrew is installed, continue with _Set Up QMK_. In that step you will run a script that will install other packages. ### Linux -You will need to install git. It's extremely likely you already have it, but if not one of the following commands should install it: +You will need to install Git. It's very likely that you already have it, but if not, one of the following commands should install it: -* Debian/Ubuntu/Devuan: `apt-get install git` -* Fedora/Redhat/Centos: `yum install git` +* Debian / Ubuntu / Devuan: `apt-get install git` +* Fedora / Red Hat / CentOS: `yum install git` * Arch: `pacman -S git` -## Download QMK +?> Docker is also an option on all platforms. [Click here for details.](getting_started_build_tools.md#docker) -Once you have setup your Linux/Unix environment you are ready to download QMK. We will do this by using git to "clone" the QMK repository. Open a Terminal or MSYS2 Console window and leave it open for the remainder of this guide. Inside that window run these two commands: +## Set Up QMK + +Once you have set up your Linux/Unix environment, you are ready to download QMK. We will do this by using Git to "clone" the QMK repository. Open a Terminal or MSYS2 MinGW window and leave it open for the remainder of this guide. Inside that window run these two commands: git clone https://github.com/qmk/qmk_firmware.git cd qmk_firmware -?> If you already know [how to use GitHub](getting_started_github.md) we recommend you create and clone your own fork instead. If you don't know what that means you can safely ignore this message. +?> If you already know [how to use GitHub](getting_started_github.md), we recommend that you create and clone your own fork instead. If you don't know what that means, you can safely ignore this message. -## Setup QMK +QMK comes with a script to help you set up the rest of what you'll need. You should run it now by typing in this command: -QMK comes with a script to help you setup the rest of what you'll need. You should run it now by typing in this command: - - ./util/qmk_install.sh + util/qmk_install.sh ## Test Your Build Environment -Now that your QMK build environment is setup you can build a firmware for your keyboard. Start by trying to build the default layout for your keyboard. You should be able to do that with a command in this format: +Now that your QMK build environment is set up, you can build a firmware for your keyboard. Start by trying to build the keyboard's default keymap. You should be able to do that with a command in this format: make :default -For example, to build a firmware for a Clueboard 66% use: +For example, to build a firmware for a Clueboard 66% you would use: make clueboard/66/rev3:default When it is done you should have a lot of output that ends similar to this: ``` -Linking: .build/clueboard_66_rev2_default.elf [OK] -Creating load file for flashing: .build/clueboard_66_rev2_default.hex [OK] -Copying clueboard_66_rev2_default.hex to qmk_firmware folder [OK] -Checking file size of clueboard_66_rev2_default.hex [OK] - * File size is fine - 25174/28672 +Linking: .build/clueboard_66_rev3_default.elf [OK] +Creating load file for flashing: .build/clueboard_66_rev3_default.hex [OK] +Copying clueboard_66_rev3_default.hex to qmk_firmware folder [OK] +Checking file size of clueboard_66_rev3_default.hex [OK] + * The firmware size is fine - 26356/28672 (2316 bytes free) ``` -## Creating Your Layout +# Creating Your Keymap -Now you are ready to create your own personal layout. Move on to [Building Your First Firmware](newbs_building_firmware.md) for that. +You are now ready to create your own personal keymap! Move on to [Building Your First Firmware](newbs_building_firmware.md) for that. From f01a80968b327720048c3e95a8e5d57891ccfd5b Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Tue, 6 Nov 2018 12:35:08 -0800 Subject: [PATCH 477/788] Port over Noxary 268.2 from Rosakiin's Noxary Firmware (#4354) * port over 268.2 from Noxary Firmware * rename files * update readme * put rozakiin's ame in more places * add configurator support * Update keyboards/noxary/268_2/n268_2.c Co-Authored-By: mechmerlin <30334081+mechmerlin@users.noreply.github.com> * Update keyboards/noxary/268_2/keymaps/default/keymap.c Co-Authored-By: mechmerlin <30334081+mechmerlin@users.noreply.github.com> * rename 268_2 keyboard files --- keyboards/noxary/268_2/268_2.c | 54 +++++ keyboards/noxary/268_2/268_2.h | 43 ++++ keyboards/noxary/268_2/config.h | 221 ++++++++++++++++++ keyboards/noxary/268_2/info.json | 12 + .../noxary/268_2/keymaps/default/config.h | 19 ++ .../noxary/268_2/keymaps/default/keymap.c | 83 +++++++ .../noxary/268_2/keymaps/default/readme.md | 1 + keyboards/noxary/268_2/readme.md | 16 ++ keyboards/noxary/268_2/rules.mk | 80 +++++++ keyboards/noxary/README.md | 6 +- 10 files changed, 533 insertions(+), 2 deletions(-) create mode 100644 keyboards/noxary/268_2/268_2.c create mode 100644 keyboards/noxary/268_2/268_2.h create mode 100644 keyboards/noxary/268_2/config.h create mode 100644 keyboards/noxary/268_2/info.json create mode 100644 keyboards/noxary/268_2/keymaps/default/config.h create mode 100644 keyboards/noxary/268_2/keymaps/default/keymap.c create mode 100644 keyboards/noxary/268_2/keymaps/default/readme.md create mode 100644 keyboards/noxary/268_2/readme.md create mode 100644 keyboards/noxary/268_2/rules.mk diff --git a/keyboards/noxary/268_2/268_2.c b/keyboards/noxary/268_2/268_2.c new file mode 100644 index 000000000..da4e5efb7 --- /dev/null +++ b/keyboards/noxary/268_2/268_2.c @@ -0,0 +1,54 @@ +/* Copyright 2018 Rozakiin + * + * 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 . + */ +#include "268_2.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + + led_set_user(usb_led); +} + +__attribute__((weak)) +void led_set_user(uint8_t usb_led) { + + if (usb_led & (1 << USB_LED_CAPS_LOCK)) { + DDRB |= (1 << 0); PORTB |= (1 << 0); + } + else { + DDRB &= ~(1 << 0); PORTB &= ~(1 << 0); + } +} diff --git a/keyboards/noxary/268_2/268_2.h b/keyboards/noxary/268_2/268_2.h new file mode 100644 index 000000000..2f5d985a3 --- /dev/null +++ b/keyboards/noxary/268_2/268_2.h @@ -0,0 +1,43 @@ +/* Copyright 2018 Rozakiin + * + * 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 . + */ +#ifndef N268_2_H +#define N268_2_H + +#include "quantum.h" + +/* This a shortcut to help you visually see your layout. + * + * The first section contains all of the arguments representing the physical + * layout of the board and position of the keys. + * + * The second converts the arguments into a two-dimensional array which + * represents the switch matrix. + */ +#define LAYOUT( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K114, K115, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K214, K215, \ + K300, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K314, K315, \ + K400, K401, K402, K406, K409, K410, K412, K414, K415 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015, }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, KC_NO, K114, K115, }, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, KC_NO, KC_NO, K214, K215, }, \ + { K300, KC_NO, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, KC_NO, K314, K315, }, \ + { K400, K401, K402, KC_NO, KC_NO, KC_NO, K406, KC_NO, KC_NO, K409, K410, KC_NO, K412, KC_NO, K414, K415, } \ +} + +#endif diff --git a/keyboards/noxary/268_2/config.h b/keyboards/noxary/268_2/config.h new file mode 100644 index 000000000..f5308d8ec --- /dev/null +++ b/keyboards/noxary/268_2/config.h @@ -0,0 +1,221 @@ +/* +Copyright 2018 Rozakiin + +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 . +*/ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0x4E58 +#define PRODUCT_ID 0x0044 +#define DEVICE_VER 0x0002 +#define MANUFACTURER Noxary +#define PRODUCT 268.2 +#define DESCRIPTION QMK keyboard firmware for 268.2 + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 16 + +/* + * 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) + * +*/ +/* key matrix pins */ +#define MATRIX_ROW_PINS { F7, F6, F5, F0, B5 } +#define MATRIX_COL_PINS { C6, B6, C7, F4, E6, D0, D7, D1, D2, B4, D6, D4, D5, F1, D3, B1 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +/* number of backlight levels */ +#define BACKLIGHT_PIN B7 +#ifdef BACKLIGHT_PIN +#define BACKLIGHT_LEVELS 3 +#endif + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* 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 userful 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 + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * 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 + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +//#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ + +/* Bootmagic Lite key configuration */ +// #define BOOTMAGIC_LITE_ROW 0 +// #define BOOTMAGIC_LITE_COLUMN 0 diff --git a/keyboards/noxary/268_2/info.json b/keyboards/noxary/268_2/info.json new file mode 100644 index 000000000..8d227afd8 --- /dev/null +++ b/keyboards/noxary/268_2/info.json @@ -0,0 +1,12 @@ +{ + "keyboard_name": "Noxary 268.2", + "url": "", + "maintainer": "qmk", + "width": 16, + "height": 5, + "layouts": { + "LAYOUT": { + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0, "w":2}, {"x":15, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":15, "y":1}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2, "w":2.25}, {"x":15, "y":2}, {"x":0, "y":3, "w":2.25}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"x":15, "y":3}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"x":10, "y":4}, {"x":11, "y":4}, {"x":12, "y":4}, {"x":13, "y":4}, {"x":14, "y":4}, {"x":15, "y":4}] + } + } +} diff --git a/keyboards/noxary/268_2/keymaps/default/config.h b/keyboards/noxary/268_2/keymaps/default/config.h new file mode 100644 index 000000000..9c4c2b630 --- /dev/null +++ b/keyboards/noxary/268_2/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 Rozakiin + * + * 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 . + */ + +#pragma once + +// place overrides here diff --git a/keyboards/noxary/268_2/keymaps/default/keymap.c b/keyboards/noxary/268_2/keymaps/default/keymap.c new file mode 100644 index 000000000..994fe36b0 --- /dev/null +++ b/keyboards/noxary/268_2/keymaps/default/keymap.c @@ -0,0 +1,83 @@ +#include QMK_KEYBOARD_H + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _BL 0 +#define _FL1 1 +#define _FL2 2 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* _BL: Base Layer(Default) - For ISO enter use ANSI enter + * ,----------------------------------------------------------------. + * |Esc | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \|BSpc| Grv| + * |----------------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | Del| + * |----------------------------------------------------------------| + * |CAPS | A| S| D| F| G| H| J| K| L| ;| '| #| Ent|PgUp| + * |----------------------------------------------------------------| + * |Shift| \| Z| X| C| V| B| N| M| ,| .| /|Shift | Up|PgDn| + * |----------------------------------------------------------------| + * |Ctrl|Win |Alt | Space |Alt|Mo(1)|Ctrl|Lef|Dow|Rght| + * `----------------------------------------------------------------' + */ + [_BL] = LAYOUT( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_BSPC, KC_GRV, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FL1), KC_LEFT, KC_DOWN, KC_RGHT), + /* _FL1: Function Layer 1 - For ISO enter use ANSI enter + * ,----------------------------------------------------------------. + * | `|F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12| |PScr| | + * |----------------------------------------------------------------| + * | | | | |RST| | | | | | | | | | Ins| + * |----------------------------------------------------------------| + * | | | | | | | | | | | | | | |Home| + * |----------------------------------------------------------------| + * | | | | | | | | | |Bl-|Bl+| |Mute|Vol+| End| + * |----------------------------------------------------------------| + * | | | | BL_Toggle | | | | |Vol-| | + * `----------------------------------------------------------------' + */ + [_FL1] = LAYOUT( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_PSCR, _______, + _______, _______, _______, _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, + _______, _______, _______, _______, _______, _______, _______, _______, BL_DEC, BL_INC, _______, KC_MUTE, KC_VOLU, KC_END, + _______, _______, _______, BL_TOGG, _______, _______, _______, KC_VOLD, _______), + /* _FL2: Function Layer 2 - For ISO enter use ANSI enter + * ,----------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | + * |----------------------------------------------------------------| + * | | | | | | | | | | | | | | | | + * |----------------------------------------------------------------| + * | | | | | | | | | | | | | | | | + * |----------------------------------------------------------------| + * | | | | | | | | | | | | | | | | + * |----------------------------------------------------------------| + * | | | | | | | | | | | + * `----------------------------------------------------------------' + */ + [_FL2] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______), + +}; + + +void matrix_init_user(void) { +} + +void matrix_scan_user(void) { +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + + diff --git a/keyboards/noxary/268_2/keymaps/default/readme.md b/keyboards/noxary/268_2/keymaps/default/readme.md new file mode 100644 index 000000000..c4c832cc6 --- /dev/null +++ b/keyboards/noxary/268_2/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for 268_2 diff --git a/keyboards/noxary/268_2/readme.md b/keyboards/noxary/268_2/readme.md new file mode 100644 index 000000000..85d1a4717 --- /dev/null +++ b/keyboards/noxary/268_2/readme.md @@ -0,0 +1,16 @@ +# Noxary 268.2 + +![268.2](https://www.keebtalk.com/uploads/db8059/original/2X/6/65b93c83cadd98bbf8e3b1d739621d54b682609a.jpg) + +A fully customizable 65% keyboard. + +* Keyboard Maintainer: [Rozakiin](https://github.com/rozakiin) +* Hardware Supported: 268.2 PCB + * rev1 +* Hardware Availability: [Noxary](https://shop.noxary.co/collections/268-2/products/noxary-268-2-polycarbonate) + +Make example for this keyboard (after setting up your build environment): + + make noxary/268_2:default + +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). diff --git a/keyboards/noxary/268_2/rules.mk b/keyboards/noxary/268_2/rules.mk new file mode 100644 index 000000000..9b6d7e672 --- /dev/null +++ b/keyboards/noxary/268_2/rules.mk @@ -0,0 +1,80 @@ +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = yes # USB Nkey Rollover +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) diff --git a/keyboards/noxary/README.md b/keyboards/noxary/README.md index bd4b4b591..8dbd85f7e 100644 --- a/keyboards/noxary/README.md +++ b/keyboards/noxary/README.md @@ -4,6 +4,8 @@ All files related to firmware of Noxary Keyboards designed by [Rozakiin](https:/ ### Keyboards -- [268](./268/): Original repo [here](https://github.com/Rozakiin/Noxary_Firmware). Imported by kind [permission](https://github.com/Rozakiin/Noxary_Firmware/issues/1) of @rozakiin +- [268](./268/): Original repo [here](https://github.com/Rozakiin/Noxary_Firmware). Imported by kind [permission](https://github.com/Rozakiin/Noxary_Firmware/issues/1) of @rozakiin -- [x268](./x268/): Original repo [here](https://github.com/Rozakiin/Noxary_Firmware). Imported by kind [permission](https://github.com/Rozakiin/Noxary_Firmware/issues/1) of @rozakiin +- [268.2](./268_2/): Original repo [here](https://github.com/Rozakiin/Noxary_Firmware). Imported by kind [permission](https://github.com/Rozakiin/Noxary_Firmware/issues/1) of @rozakiin + +- [x268](./x268/): Original repo [here](https://github.com/Rozakiin/Noxary_Firmware). Imported by kind [permission](https://github.com/Rozakiin/Noxary_Firmware/issues/1) of @rozakiin From fc477a1ee7a68cab4ae8fb7d7f0c8d6a4e6c8509 Mon Sep 17 00:00:00 2001 From: Danny Date: Tue, 6 Nov 2018 16:13:58 -0500 Subject: [PATCH 478/788] Add Tragicforce 68 layout for split backspace and add configurator layouts (#4378) --- keyboards/tragicforce68/info.json | 236 +++++++++++++++++++++++- keyboards/tragicforce68/tragicforce68.h | 18 ++ 2 files changed, 251 insertions(+), 3 deletions(-) diff --git a/keyboards/tragicforce68/info.json b/keyboards/tragicforce68/info.json index f3e3d6ada..550040a3a 100644 --- a/keyboards/tragicforce68/info.json +++ b/keyboards/tragicforce68/info.json @@ -5,8 +5,238 @@ "width": 17.25, "height": 5, "layouts": { - "LAYOUT": { - "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"x":15.25, "y":0}, {"x":16.25, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"x":15.25, "y":1}, {"x":16.25, "y":1}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"x":15.25, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"x":14.25, "y":4}, {"x":15.25, "y":4}, {"x":16.25, "y":4}] - } + "LAYOUT": { + "layout": [ + {"label":"~", "x":0, "y":0}, + {"label":"!", "x":1, "y":0}, + {"label":"@", "x":2, "y":0}, + {"label":"#", "x":3, "y":0}, + {"label":"$", "x":4, "y":0}, + {"label":"%", "x":5, "y":0}, + {"label":"^", "x":6, "y":0}, + {"label":"&", "x":7, "y":0}, + {"label":"*", "x":8, "y":0}, + {"label":"(", "x":9, "y":0}, + {"label":")", "x":10, "y":0}, + {"label":"_", "x":11, "y":0}, + {"label":"+", "x":12, "y":0}, + {"label":"Backspace", "x":13, "y":0, "w":2}, + {"x":15.25, "y":0}, + {"x":16.25, "y":0}, + + {"label":"Tab", "x":0, "y":1, "w":1.5}, + {"label":"Q", "x":1.5, "y":1}, + {"label":"W", "x":2.5, "y":1}, + {"label":"E", "x":3.5, "y":1}, + {"label":"R", "x":4.5, "y":1}, + {"label":"T", "x":5.5, "y":1}, + {"label":"Y", "x":6.5, "y":1}, + {"label":"U", "x":7.5, "y":1}, + {"label":"I", "x":8.5, "y":1}, + {"label":"O", "x":9.5, "y":1}, + {"label":"P", "x":10.5, "y":1}, + {"label":" {", "x":11.5, "y":1}, + {"label":"}", "x":12.5, "y":1}, + {"label":"|", "x":13.5, "y":1, "w":1.5}, + {"x":15.25, "y":1}, + {"x":16.25, "y":1}, + + {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, + {"label":"A", "x":1.75, "y":2}, + {"label":"S", "x":2.75, "y":2}, + {"label":"D", "x":3.75, "y":2}, + {"label":"F", "x":4.75, "y":2}, + {"label":"G", "x":5.75, "y":2}, + {"label":"H", "x":6.75, "y":2}, + {"label":"J", "x":7.75, "y":2}, + {"label":"K", "x":8.75, "y":2}, + {"label":"L", "x":9.75, "y":2}, + {"label":":", "x":10.75, "y":2}, + {"label":"\"", "x":11.75, "y":2}, + {"label":"Enter", "x":12.75, "y":2, "w":2.25}, + + {"label":"Shift", "x":0, "y":3, "w":2.25}, + {"label":"Z", "x":2.25, "y":3}, + {"label":"X", "x":3.25, "y":3}, + {"label":"C", "x":4.25, "y":3}, + {"label":"V", "x":5.25, "y":3}, + {"label":"B", "x":6.25, "y":3}, + {"label":"N", "x":7.25, "y":3}, + {"label":"M", "x":8.25, "y":3}, + {"label":"<", "x":9.25, "y":3}, + {"label":">", "x":10.25, "y":3}, + {"label":"?", "x":11.25, "y":3}, + {"label":"Shift", "x":12.25, "y":3, "w":2.75}, + {"x":15.25, "y":3}, + + {"label":"Ctrl", "x":0, "y":4, "w":1.25}, + {"label":"Win", "x":1.25, "y":4, "w":1.25}, + {"label":"Alt", "x":2.5, "y":4, "w":1.25}, + {"x":3.75, "y":4, "w":6.25}, + {"label":"Alt", "x":10, "y":4, "w":1.25}, + {"label":"Win", "x":11.25, "y":4, "w":1.25}, + {"label":"Menu", "x":12.5, "y":4, "w":1.25}, + {"x":14.25, "y":4}, + {"x":15.25, "y":4}, + {"x":16.25, "y":4} + ] + }, + "LAYOUT_split_space": { + "layout": [ + {"label":"~", "x":0, "y":0}, + {"label":"!", "x":1, "y":0}, + {"label":"@", "x":2, "y":0}, + {"label":"#", "x":3, "y":0}, + {"label":"$", "x":4, "y":0}, + {"label":"%", "x":5, "y":0}, + {"label":"^", "x":6, "y":0}, + {"label":"&", "x":7, "y":0}, + {"label":"*", "x":8, "y":0}, + {"label":"(", "x":9, "y":0}, + {"label":")", "x":10, "y":0}, + {"label":"_", "x":11, "y":0}, + {"label":"+", "x":12, "y":0}, + {"label":"Backspace", "x":13, "y":0, "w":2}, + {"x":15.25, "y":0}, + {"x":16.25, "y":0}, + + {"label":"Tab", "x":0, "y":1, "w":1.5}, + {"label":"Q", "x":1.5, "y":1}, + {"label":"W", "x":2.5, "y":1}, + {"label":"E", "x":3.5, "y":1}, + {"label":"R", "x":4.5, "y":1}, + {"label":"T", "x":5.5, "y":1}, + {"label":"Y", "x":6.5, "y":1}, + {"label":"U", "x":7.5, "y":1}, + {"label":"I", "x":8.5, "y":1}, + {"label":"O", "x":9.5, "y":1}, + {"label":"P", "x":10.5, "y":1}, + {"label":" {", "x":11.5, "y":1}, + {"label":"}", "x":12.5, "y":1}, + {"label":"|", "x":13.5, "y":1, "w":1.5}, + {"x":15.25, "y":1}, + {"x":16.25, "y":1}, + + {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, + {"label":"A", "x":1.75, "y":2}, + {"label":"S", "x":2.75, "y":2}, + {"label":"D", "x":3.75, "y":2}, + {"label":"F", "x":4.75, "y":2}, + {"label":"G", "x":5.75, "y":2}, + {"label":"H", "x":6.75, "y":2}, + {"label":"J", "x":7.75, "y":2}, + {"label":"K", "x":8.75, "y":2}, + {"label":"L", "x":9.75, "y":2}, + {"label":":", "x":10.75, "y":2}, + {"label":"\"", "x":11.75, "y":2}, + {"label":"Enter", "x":12.75, "y":2, "w":2.25}, + + {"label":"Shift", "x":0, "y":3, "w":2.25}, + {"label":"Z", "x":2.25, "y":3}, + {"label":"X", "x":3.25, "y":3}, + {"label":"C", "x":4.25, "y":3}, + {"label":"V", "x":5.25, "y":3}, + {"label":"B", "x":6.25, "y":3}, + {"label":"N", "x":7.25, "y":3}, + {"label":"M", "x":8.25, "y":3}, + {"label":"<", "x":9.25, "y":3}, + {"label":">", "x":10.25, "y":3}, + {"label":"?", "x":11.25, "y":3}, + {"label":"Shift", "x":12.25, "y":3, "w":2.75}, + {"x":15.25, "y":3}, + + {"label":"Ctrl", "x":0, "y":4, "w":1.25}, + {"label":"Win", "x":1.25, "y":4, "w":1.25}, + {"label":"Alt", "x":2.5, "y":4, "w":1.25}, + {"x":3.75, "y":4, "w":2.25}, + {"x":6, "y":4, "w":1.75}, + {"x":7.75, "y":4, "w":2.25}, + {"label":"Alt", "x":10, "y":4, "w":1.25}, + {"label":"Win", "x":11.25, "y":4, "w":1.25}, + {"label":"Menu", "x":12.5, "y":4, "w":1.25}, + {"x":14.25, "y":4}, + {"x":15.25, "y":4}, + {"x":16.25, "y":4} + ] + }, + "LAYOUT_split_space_and_backspace": { + "layout": [ + {"label":"~", "x":0, "y":0}, + {"label":"!", "x":1, "y":0}, + {"label":"@", "x":2, "y":0}, + {"label":"#", "x":3, "y":0}, + {"label":"$", "x":4, "y":0}, + {"label":"%", "x":5, "y":0}, + {"label":"^", "x":6, "y":0}, + {"label":"&", "x":7, "y":0}, + {"label":"*", "x":8, "y":0}, + {"label":"(", "x":9, "y":0}, + {"label":")", "x":10, "y":0}, + {"label":"_", "x":11, "y":0}, + {"label":"+", "x":12, "y":0}, + {"label":"Del", "x":13, "y":0}, + {"label":"Backspace", "x":14, "y":0}, + {"x":15.25, "y":0}, + {"x":16.25, "y":0}, + + {"label":"Tab", "x":0, "y":1, "w":1.5}, + {"label":"Q", "x":1.5, "y":1}, + {"label":"W", "x":2.5, "y":1}, + {"label":"E", "x":3.5, "y":1}, + {"label":"R", "x":4.5, "y":1}, + {"label":"T", "x":5.5, "y":1}, + {"label":"Y", "x":6.5, "y":1}, + {"label":"U", "x":7.5, "y":1}, + {"label":"I", "x":8.5, "y":1}, + {"label":"O", "x":9.5, "y":1}, + {"label":"P", "x":10.5, "y":1}, + {"label":" {", "x":11.5, "y":1}, + {"label":"}", "x":12.5, "y":1}, + {"label":"|", "x":13.5, "y":1, "w":1.5}, + {"x":15.25, "y":1}, + {"x":16.25, "y":1}, + + {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, + {"label":"A", "x":1.75, "y":2}, + {"label":"S", "x":2.75, "y":2}, + {"label":"D", "x":3.75, "y":2}, + {"label":"F", "x":4.75, "y":2}, + {"label":"G", "x":5.75, "y":2}, + {"label":"H", "x":6.75, "y":2}, + {"label":"J", "x":7.75, "y":2}, + {"label":"K", "x":8.75, "y":2}, + {"label":"L", "x":9.75, "y":2}, + {"label":":", "x":10.75, "y":2}, + {"label":"\"", "x":11.75, "y":2}, + {"label":"Enter", "x":12.75, "y":2, "w":2.25}, + + {"label":"Shift", "x":0, "y":3, "w":2.25}, + {"label":"Z", "x":2.25, "y":3}, + {"label":"X", "x":3.25, "y":3}, + {"label":"C", "x":4.25, "y":3}, + {"label":"V", "x":5.25, "y":3}, + {"label":"B", "x":6.25, "y":3}, + {"label":"N", "x":7.25, "y":3}, + {"label":"M", "x":8.25, "y":3}, + {"label":"<", "x":9.25, "y":3}, + {"label":">", "x":10.25, "y":3}, + {"label":"?", "x":11.25, "y":3}, + {"label":"Shift", "x":12.25, "y":3, "w":2.75}, + {"x":15.25, "y":3}, + + {"label":"Ctrl", "x":0, "y":4, "w":1.25}, + {"label":"Win", "x":1.25, "y":4, "w":1.25}, + {"label":"Alt", "x":2.5, "y":4, "w":1.25}, + {"x":3.75, "y":4, "w":2.25}, + {"x":6, "y":4, "w":1.75}, + {"x":7.75, "y":4, "w":2.25}, + {"label":"Alt", "x":10, "y":4, "w":1.25}, + {"label":"Win", "x":11.25, "y":4, "w":1.25}, + {"label":"Menu", "x":12.5, "y":4, "w":1.25}, + {"x":14.25, "y":4}, + {"x":15.25, "y":4}, + {"x":16.25, "y":4} + ] + } } } diff --git a/keyboards/tragicforce68/tragicforce68.h b/keyboards/tragicforce68/tragicforce68.h index e1b2a038d..a63ce50a5 100644 --- a/keyboards/tragicforce68/tragicforce68.h +++ b/keyboards/tragicforce68/tragicforce68.h @@ -38,6 +38,24 @@ { J1, J2, J3, J4, J5, J6, J7, J8 } \ } +#define LAYOUT_split_space_and_backspace( \ + A1, A2, A3, A4, A5, A6, A7, A8, E1, E2, E3, E4, E5, E6, H7, E7, E8, \ + B1, B2, B3, B4, B5, B6, B7, B8, F1, F2, F3, F4, F5, F6, F7, F8, \ + C1, C2, C3, C4, C5, C6, C7, C8, G1, G2, G3, G4, G5, \ + D1, D2, D3, D4, D5, D6, D7, D8, H1, H2, H3, H4, H5, \ + J1, J2, J3, J4, J5, J6, J7, J8, H6, G6, G7, G8 \ +) { \ + { A1, A2, A3, A4, A5, A6, A7, A8 }, \ + { B1, B2, B3, B4, B5, B6, B7, B8 }, \ + { C1, C2, C3, C4, C5, C6, C7, C8 }, \ + { D1, D2, D3, D4, D5, D6, D7, D8 }, \ + { E1, E2, E3, E4, E5, E6, E7, E8 }, \ + { F1, F2, F3, F4, F5, F6, F7, F8 }, \ + { G1, G2, G3, G4, G5, G6, G7, G8 }, \ + { H1, H2, H3, H4, H5, H6, H7, KC_NO }, \ + { J1, J2, J3, J4, J5, J6, J7, J8 } \ +} + #define LAYOUT_kc( \ K00, K01, K02, K03, K04, K05, K06, K07, K08, K10, K11, K12, K13, K14, K15, K16, \ K17, K18, K20, K21, K22, K23, K24, K25, K26, K27, K28, K30, K31, K32, K33, K34, \ From a30dd2bb1711f5402007adf89af9b3adb758a7fb Mon Sep 17 00:00:00 2001 From: Danilo Vulicevic Date: Wed, 7 Nov 2018 02:04:02 +0100 Subject: [PATCH 479/788] Add xd75/billypython keymap (#4381) * Add xd75/billypython keymap * Expand rules.mk (cherry picked from commit 806fee94ae3a21b6ca7a34624101349b57d41b75) * Expand billypython's rules.mk * Remove unused stuff in whitefox/billypython --- .../whitefox/keymaps/billypython/config.h | 3 - .../whitefox/keymaps/billypython/keymap.c | 52 +------- .../whitefox/keymaps/billypython/rules.mk | 5 + .../whitefox/keymaps/konstantin/rules.mk | 5 + keyboards/xd75/keymaps/billypython/config.h | 17 +++ keyboards/xd75/keymaps/billypython/keymap.c | 119 ++++++++++++++++++ keyboards/xd75/keymaps/billypython/rules.mk | 15 +++ 7 files changed, 163 insertions(+), 53 deletions(-) create mode 100644 keyboards/xd75/keymaps/billypython/config.h create mode 100644 keyboards/xd75/keymaps/billypython/keymap.c create mode 100644 keyboards/xd75/keymaps/billypython/rules.mk diff --git a/keyboards/whitefox/keymaps/billypython/config.h b/keyboards/whitefox/keymaps/billypython/config.h index d1c3002d2..275f8effb 100644 --- a/keyboards/whitefox/keymaps/billypython/config.h +++ b/keyboards/whitefox/keymaps/billypython/config.h @@ -2,9 +2,6 @@ #define FORCE_NKRO -#undef IS_COMMAND -#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RCTL))) - #define MAGIC_KEY_LAYER0_ALT1 BSLS #define MAGIC_KEY_BOOTLOADER ESC diff --git a/keyboards/whitefox/keymaps/billypython/keymap.c b/keyboards/whitefox/keymaps/billypython/keymap.c index 8096885cf..dfc7d6a96 100644 --- a/keyboards/whitefox/keymaps/billypython/keymap.c +++ b/keyboards/whitefox/keymaps/billypython/keymap.c @@ -2,18 +2,11 @@ #define TOP LCTL(KC_HOME) #define BOTTOM LCTL(KC_END) -#define DSKTP_L LCTL(LGUI(KC_LEFT)) -#define DSKTP_R LCTL(LGUI(KC_RGHT)) #define FN MO(L_FN) #define FN_CAPS LT(L_FN, KC_CAPS) #define FN_FNLK TT(L_FN) -#define DESKTOP TD(TD_DESKTOP) -#define FN_RCTL TD(TD_FN_RCTL) -#define RAL_LAL TD(TD_RAL_LAL) -#define RAL_RGU TD(TD_RAL_RGU) -#define RCT_RSF TD(TD_RCT_RSF) #define RSF_RCT TD(TD_RSF_RCT) #define COMMA UC(0x002C) @@ -62,37 +55,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } } -struct { - bool fn_on; // Layer state when tap dance started - bool started; -} td_fn_rctrl_data; - -void td_fn_rctrl_each(qk_tap_dance_state_t *state, void *user_data) { - if (!td_fn_rctrl_data.started) { - td_fn_rctrl_data.fn_on = IS_LAYER_ON(L_FN); - td_fn_rctrl_data.started = true; - } - // Single tap → Fn, double tap → RCtrl, triple tap etc. → Fn+RCtrl - if (state->count == 1 || state->count == 3) { - layer_on(L_FN); - } else if (state->count == 2) { - if (!td_fn_rctrl_data.fn_on) { - layer_off(L_FN); - } - register_code(KC_RCTL); - } -} - -void td_fn_rctrl_reset(qk_tap_dance_state_t *state, void *user_data) { - if ((state->count == 1 || state->count > 2) && !td_fn_rctrl_data.fn_on) { - layer_off(L_FN); - } - if (state->count >= 2) { - unregister_code(KC_RCTL); - } - td_fn_rctrl_data.started = false; -} - #define ACTION_TAP_DANCE_DOUBLE_MODS(mod1, mod2) { \ .fn = { td_double_mods_each, NULL, td_double_mods_reset }, \ .user_data = &(qk_tap_dance_pair_t){ mod1, mod2 }, \ @@ -122,20 +84,10 @@ void td_double_mods_reset(qk_tap_dance_state_t *state, void *user_data) { } enum tap_dance { - TD_DESKTOP, - TD_FN_RCTL, - TD_RAL_LAL, - TD_RAL_RGU, - TD_RCT_RSF, TD_RSF_RCT, }; qk_tap_dance_action_t tap_dance_actions[] = { - [TD_DESKTOP] = ACTION_TAP_DANCE_DOUBLE(LCTL(LGUI(KC_D)), LCTL(LGUI(KC_F4))), // Add/close virtual desktop - [TD_FN_RCTL] = ACTION_TAP_DANCE_FN_ADVANCED(td_fn_rctrl_each, NULL, td_fn_rctrl_reset), - [TD_RAL_LAL] = ACTION_TAP_DANCE_DOUBLE_MODS(KC_RALT, KC_LALT), - [TD_RAL_RGU] = ACTION_TAP_DANCE_DOUBLE_MODS(KC_RALT, KC_RGUI), - [TD_RCT_RSF] = ACTION_TAP_DANCE_DOUBLE_MODS(KC_RCTL, KC_RSFT), [TD_RSF_RCT] = ACTION_TAP_DANCE_DOUBLE_MODS(KC_RSFT, KC_RCTL), }; @@ -150,7 +102,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤ * │ LShift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │SftCtl│ ↑ │PgD│ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬─┬───┼───┼───┤ - * │LCtl│LGui│LAlt│ Space │AlGu│FnLk│ │ ← │ ↓ │ → │ + * │LCtl│LGui│LAlt│ Space │RAlt│FnLk│ │ ← │ ↓ │ → │ * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘ */ [L_BASE] = LAYOUT_truefox( \ @@ -158,7 +110,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC,KC_BSPC, KC_DEL, \ FN_CAPS,KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_ENT, KC_PGUP, \ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,RSF_RCT, KC_UP, KC_PGDN, \ - KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, RAL_RGU,FN_FNLK, KC_LEFT,KC_DOWN,KC_RGHT \ + KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,FN_FNLK, KC_LEFT,KC_DOWN,KC_RGHT \ ), /* Function layer diff --git a/keyboards/whitefox/keymaps/billypython/rules.mk b/keyboards/whitefox/keymaps/billypython/rules.mk index abf92c2c4..c42f6e705 100644 --- a/keyboards/whitefox/keymaps/billypython/rules.mk +++ b/keyboards/whitefox/keymaps/billypython/rules.mk @@ -1,10 +1,15 @@ +AUDIO_ENABLE = no BACKLIGHT_ENABLE = no +BLUETOOTH_ENABLE = no BOOTMAGIC_ENABLE = no COMMAND_ENABLE = yes CONSOLE_ENABLE = yes EXTRAKEY_ENABLE = yes +MIDI_ENABLE = no MOUSEKEY_ENABLE = yes NKRO_ENABLE = yes +RGBLIGHT_ENABLE = no +SLEEP_LIGHT_ENABLE = no TAP_DANCE_ENABLE = yes UNICODE_ENABLE = yes VISUALIZER_ENABLE = no diff --git a/keyboards/whitefox/keymaps/konstantin/rules.mk b/keyboards/whitefox/keymaps/konstantin/rules.mk index abf92c2c4..c42f6e705 100644 --- a/keyboards/whitefox/keymaps/konstantin/rules.mk +++ b/keyboards/whitefox/keymaps/konstantin/rules.mk @@ -1,10 +1,15 @@ +AUDIO_ENABLE = no BACKLIGHT_ENABLE = no +BLUETOOTH_ENABLE = no BOOTMAGIC_ENABLE = no COMMAND_ENABLE = yes CONSOLE_ENABLE = yes EXTRAKEY_ENABLE = yes +MIDI_ENABLE = no MOUSEKEY_ENABLE = yes NKRO_ENABLE = yes +RGBLIGHT_ENABLE = no +SLEEP_LIGHT_ENABLE = no TAP_DANCE_ENABLE = yes UNICODE_ENABLE = yes VISUALIZER_ENABLE = no diff --git a/keyboards/xd75/keymaps/billypython/config.h b/keyboards/xd75/keymaps/billypython/config.h new file mode 100644 index 000000000..275f8effb --- /dev/null +++ b/keyboards/xd75/keymaps/billypython/config.h @@ -0,0 +1,17 @@ +#pragma once + +#define FORCE_NKRO + +#define MAGIC_KEY_LAYER0_ALT1 BSLS +#define MAGIC_KEY_BOOTLOADER ESC + +#define MOUSEKEY_DELAY 50 +#define MOUSEKEY_INTERVAL 15 +#define MOUSEKEY_MAX_SPEED 4 +#define MOUSEKEY_TIME_TO_MAX 50 +#define MOUSEKEY_WHEEL_MAX_SPEED 1 +#define MOUSEKEY_WHEEL_TIME_TO_MAX 50 + +#define PERMISSIVE_HOLD +#define TAPPING_TERM 200 +#define TAPPING_TOGGLE 2 diff --git a/keyboards/xd75/keymaps/billypython/keymap.c b/keyboards/xd75/keymaps/billypython/keymap.c new file mode 100644 index 000000000..8a06074ca --- /dev/null +++ b/keyboards/xd75/keymaps/billypython/keymap.c @@ -0,0 +1,119 @@ +#include QMK_KEYBOARD_H + +#define TOP LCTL(KC_HOME) +#define BOTTOM LCTL(KC_END) + +#define FN MO(L_FN) +#define FN_CAPS LT(L_FN, KC_CAPS) +#define FN_FNLK TT(L_FN) + +#define COMMA UC(0x002C) +#define L_PAREN UC(0x0028) +#define R_PAREN UC(0x0029) +#define EQUALS UC(0x003D) +#define TIMES UC(0x00D7) +#define DIVIDE UC(0x00F7) +#define MINUS UC(0x2212) + +void eeconfig_init_user(void) { + set_unicode_input_mode(UC_LNX); +} + +enum layers { + L_BASE, + L_FN, + L_NUMPAD, +}; + +enum custom_keycodes { + CLEAR = SAFE_RANGE, + NUMPAD, +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case CLEAR: + if (record->event.pressed) { + SEND_STRING(SS_LCTRL("a") SS_TAP(X_DELETE)); + } + return false; + + case NUMPAD: + if (record->event.pressed) { + layer_invert(L_NUMPAD); + bool num_lock = host_keyboard_leds() & 1< Date: Wed, 7 Nov 2018 09:25:18 -0700 Subject: [PATCH 480/788] Configurable Rainbow Swirl range (#4376) * Configurable Rainbow Swirl range This allows tweaking of the rainbow effect to get different effects on keyboards with varied LED layouts. We found the value 1950 works on the RGBKB.net Sol to get a cool striped effect across the keyboard. * Document RGBLIGHT_RAINBOW_SWIRL_RANGE * Better wording for the documentation --- docs/feature_rgblight.md | 1 + quantum/rgblight.c | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/feature_rgblight.md b/docs/feature_rgblight.md index a2820347d..0205ebe91 100644 --- a/docs/feature_rgblight.md +++ b/docs/feature_rgblight.md @@ -122,6 +122,7 @@ The following options can be used to tweak the various animations: |`RGBLIGHT_EFFECT_KNIGHT_LED_NUM` |`RGBLED_NUM` |The number of LEDs to have the "Knight" animation travel | |`RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL`|`1000` |How long to wait between light changes for the "Christmas" animation, in milliseconds| |`RGBLIGHT_EFFECT_CHRISTMAS_STEP` |`2` |The number of LEDs to group the red/green colors by for the "Christmas" animation | +|`RGBLIGHT_RAINBOW_SWIRL_RANGE` |`360` |Range adjustment for the rainbow swirl effect to get different swirls | You can also modify the speeds that the different modes animate at: diff --git a/quantum/rgblight.c b/quantum/rgblight.c index 94e9c0a3b..9ce3b2309 100644 --- a/quantum/rgblight.c +++ b/quantum/rgblight.c @@ -679,6 +679,10 @@ void rgblight_effect_rainbow_mood(uint8_t interval) { #endif #ifdef RGBLIGHT_EFFECT_RAINBOW_SWIRL +#ifndef RGBLIGHT_RAINBOW_SWIRL_RANGE + #define RGBLIGHT_RAINBOW_SWIRL_RANGE 360 +#endif + __attribute__ ((weak)) const uint8_t RGBLED_RAINBOW_SWIRL_INTERVALS[] PROGMEM = {100, 50, 20}; @@ -692,7 +696,7 @@ void rgblight_effect_rainbow_swirl(uint8_t interval) { } last_timer = timer_read(); for (i = 0; i < RGBLED_NUM; i++) { - hue = (360 / RGBLED_NUM * i + current_hue) % 360; + hue = (RGBLIGHT_RAINBOW_SWIRL_RANGE / RGBLED_NUM * i + current_hue) % 360; sethsv(hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[i]); } rgblight_set(); From 945dd946ab2679882b7cd923013ce5424f8f33b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20=C4=90or=C4=91evi=C4=87?= Date: Wed, 7 Nov 2018 18:29:57 +0100 Subject: [PATCH 481/788] Fix misspelled make option, format rules.mk files (#4382) --- .../whitefox/keymaps/billypython/rules.mk | 28 +++++++++---------- .../whitefox/keymaps/konstantin/rules.mk | 28 +++++++++---------- keyboards/xd75/keymaps/billypython/rules.mk | 28 +++++++++---------- 3 files changed, 42 insertions(+), 42 deletions(-) diff --git a/keyboards/whitefox/keymaps/billypython/rules.mk b/keyboards/whitefox/keymaps/billypython/rules.mk index c42f6e705..8fbc1f3af 100644 --- a/keyboards/whitefox/keymaps/billypython/rules.mk +++ b/keyboards/whitefox/keymaps/billypython/rules.mk @@ -1,15 +1,15 @@ -AUDIO_ENABLE = no -BACKLIGHT_ENABLE = no -BLUETOOTH_ENABLE = no -BOOTMAGIC_ENABLE = no -COMMAND_ENABLE = yes -CONSOLE_ENABLE = yes -EXTRAKEY_ENABLE = yes -MIDI_ENABLE = no -MOUSEKEY_ENABLE = yes -NKRO_ENABLE = yes -RGBLIGHT_ENABLE = no -SLEEP_LIGHT_ENABLE = no -TAP_DANCE_ENABLE = yes -UNICODE_ENABLE = yes +AUDIO_ENABLE = no +BACKLIGHT_ENABLE = no +BLUETOOTH_ENABLE = no +BOOTMAGIC_ENABLE = no +COMMAND_ENABLE = yes +CONSOLE_ENABLE = yes +EXTRAKEY_ENABLE = yes +MIDI_ENABLE = no +MOUSEKEY_ENABLE = yes +NKRO_ENABLE = yes +RGBLIGHT_ENABLE = no +SLEEP_LED_ENABLE = no +TAP_DANCE_ENABLE = yes +UNICODE_ENABLE = yes VISUALIZER_ENABLE = no diff --git a/keyboards/whitefox/keymaps/konstantin/rules.mk b/keyboards/whitefox/keymaps/konstantin/rules.mk index c42f6e705..8fbc1f3af 100644 --- a/keyboards/whitefox/keymaps/konstantin/rules.mk +++ b/keyboards/whitefox/keymaps/konstantin/rules.mk @@ -1,15 +1,15 @@ -AUDIO_ENABLE = no -BACKLIGHT_ENABLE = no -BLUETOOTH_ENABLE = no -BOOTMAGIC_ENABLE = no -COMMAND_ENABLE = yes -CONSOLE_ENABLE = yes -EXTRAKEY_ENABLE = yes -MIDI_ENABLE = no -MOUSEKEY_ENABLE = yes -NKRO_ENABLE = yes -RGBLIGHT_ENABLE = no -SLEEP_LIGHT_ENABLE = no -TAP_DANCE_ENABLE = yes -UNICODE_ENABLE = yes +AUDIO_ENABLE = no +BACKLIGHT_ENABLE = no +BLUETOOTH_ENABLE = no +BOOTMAGIC_ENABLE = no +COMMAND_ENABLE = yes +CONSOLE_ENABLE = yes +EXTRAKEY_ENABLE = yes +MIDI_ENABLE = no +MOUSEKEY_ENABLE = yes +NKRO_ENABLE = yes +RGBLIGHT_ENABLE = no +SLEEP_LED_ENABLE = no +TAP_DANCE_ENABLE = yes +UNICODE_ENABLE = yes VISUALIZER_ENABLE = no diff --git a/keyboards/xd75/keymaps/billypython/rules.mk b/keyboards/xd75/keymaps/billypython/rules.mk index 5a502b152..c935bbac1 100644 --- a/keyboards/xd75/keymaps/billypython/rules.mk +++ b/keyboards/xd75/keymaps/billypython/rules.mk @@ -1,15 +1,15 @@ -AUDIO_ENABLE = no -BACKLIGHT_ENABLE = no -BLUETOOTH_ENABLE = no -BOOTMAGIC_ENABLE = no -COMMAND_ENABLE = yes -CONSOLE_ENABLE = yes -EXTRAKEY_ENABLE = yes -MIDI_ENABLE = no -MOUSEKEY_ENABLE = yes -NKRO_ENABLE = yes -RGBLIGHT_ENABLE = no -SLEEP_LIGHT_ENABLE = no -TAP_DANCE_ENABLE = no -UNICODE_ENABLE = yes +AUDIO_ENABLE = no +BACKLIGHT_ENABLE = no +BLUETOOTH_ENABLE = no +BOOTMAGIC_ENABLE = no +COMMAND_ENABLE = yes +CONSOLE_ENABLE = yes +EXTRAKEY_ENABLE = yes +MIDI_ENABLE = no +MOUSEKEY_ENABLE = yes +NKRO_ENABLE = yes +RGBLIGHT_ENABLE = no +SLEEP_LED_ENABLE = no +TAP_DANCE_ENABLE = no +UNICODE_ENABLE = yes VISUALIZER_ENABLE = no From ba76fcfb8bbc531213619f2893415c8744b65a47 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Wed, 7 Nov 2018 21:39:29 -0800 Subject: [PATCH 482/788] Add Layout-b for GH60 satan (#4123) * Add Layout-b for GH60 satan * Update layout, toggle for colemak layout * Rename layout, replace function with KC_GESC * Update Layer order, Readme * Remove unnecessary code * Add backspace in extend layer --- keyboards/satan/keymaps/abhixec/keymap.c | 76 +++++++++++++++++++++++ keyboards/satan/keymaps/abhixec/readme.md | 19 ++++++ keyboards/satan/keymaps/abhixec/rules.mk | 18 ++++++ keyboards/satan/satan.h | 29 +++++++++ 4 files changed, 142 insertions(+) create mode 100644 keyboards/satan/keymaps/abhixec/keymap.c create mode 100644 keyboards/satan/keymaps/abhixec/readme.md create mode 100644 keyboards/satan/keymaps/abhixec/rules.mk diff --git a/keyboards/satan/keymaps/abhixec/keymap.c b/keyboards/satan/keymaps/abhixec/keymap.c new file mode 100644 index 000000000..59a8c4312 --- /dev/null +++ b/keyboards/satan/keymaps/abhixec/keymap.c @@ -0,0 +1,76 @@ +#include QMK_KEYBOARD_H + + +// Each layer gets a name for readability, which is then used in the keymap matix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _BL 0 +#define _FL 2 +#define _CL 1 +#define _EL 3 + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Keymap _BL: (Base Layer) Default Layer + * ,-----------------------------------------------------------. + * |Esc~| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | + * |-----------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | + * |-----------------------------------------------------------| + * |CAPS | A| S| D| F| G| H| J| K| L| ;| '|Return | + * |-----------------------------------------------------------| + * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift| Del| + * |-----------------------------------------------------------| + * |Ctrl|Gui |Alt | Space |Alt |Gui |FN |Ctrl | + * `-----------------------------------------------------------' + */ +[_BL] = LAYOUT_60_ansi_split_rshift( + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,KC_BSLS, \ + LT(_EL, KC_BSPC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT, KC_DEL, \ + KC_LCTL, KC_LALT,KC_LGUI, KC_SPC, KC_RALT,KC_RGUI, MO(_FL),KC_RCTL), + +/* Keymap _CL: (Colemak Layer) + */ +[_CL] = LAYOUT_60_ansi_split_rshift( + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LBRC, KC_RBRC,KC_BSLS, \ + LT(_EL, KC_BSPC), KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O,KC_QUOT, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT, KC_DEL, \ + KC_LCTL, KC_LALT,KC_LGUI, KC_SPC, KC_RALT,KC_RGUI, MO(_FL),KC_RCTL), + +[_EL] = LAYOUT_60_ansi_split_rshift( + + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, \ + _______,KC_LCTL,KC_WH_U,_______,_______,KC_MS_U,KC_PGUP,KC_HOME,KC_UP,KC_END,KC_DEL, KC_GESC, _______,_______, \ + _______,KC_LALT,KC_WH_D, KC_LSFT,_______,KC_MS_D,KC_PGDOWN,KC_LEFT,KC_DOWN,KC_RIGHT, KC_BSPC,_______,_______, \ +_______,KC_UNDO,KC_CUT,KC_COPY,KC_PASTE, KC_MS_BTN1, KC_MS_BTN3, KC_MS_BTN2,KC_MS_LEFT,KC_MS_RIGHT,_______,_______, _______, \ + _______,_______,_______, _______, _______,_______,_______,_______), + + + /* Keymap _FL: Function Layer + * ,-----------------------------------------------------------. + * | KC_GRV|F1|F2|F3|F4|F5|F6|F7| F8 | F9 |10|F11|F12| | + * |-----------------------------------------------------------| + * | | | | | | | | | | | |BL-|BL+|BL | + * |-----------------------------------------------------------| + * | | | | | | | | | |HOME| | | + * |-----------------------------------------------------------| + * | | | | | | |V_DWN|V_UP|MUTE | END || |_CL | + * |-----------------------------------------------------------| + * | | | | | | | | | + * `-----------------------------------------------------------' + */ + +[_FL] = LAYOUT_60_ansi_split_rshift( + + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, \ + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,KC_PSCREEN, BL_DEC, BL_INC,BL_TOGG, \ + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,KC_HOME,_______,_______, \ + _______,_______,_______,_______,_______,_______,KC_AUDIO_VOL_DOWN,KC_AUDIO_VOL_UP,KC_AUDIO_MUTE,KC_END,_______,_______, TG(_CL), \ + _______,_______,_______, _______, _______,_______,_______,_______) + +}; + diff --git a/keyboards/satan/keymaps/abhixec/readme.md b/keyboards/satan/keymaps/abhixec/readme.md new file mode 100644 index 000000000..59a95b7fc --- /dev/null +++ b/keyboards/satan/keymaps/abhixec/readme.md @@ -0,0 +1,19 @@ +# default Satan GH60 layout + +The layout for this keyboard is: +![Layout-2](https://i.imgur.com/Eqp8hov.jpg) + +Currently there are 3 layers: + +1. Base Layer is qwerty +2. 1st layer is colemak +3. 2nd layer is function layer +4. 3rd layer is extend layer + +How to use the layers: +1. Base is default. If you want Colemak then press function key and del next to the right shift (this combination will be used to toggle the layer on and off) +2. Function layer is accessible by holding down the function key. +3. Extend layer is accsessible by holding down the capslock. + Which when tapped acts like backspace when held triggers the Extend layer capability. + + diff --git a/keyboards/satan/keymaps/abhixec/rules.mk b/keyboards/satan/keymaps/abhixec/rules.mk new file mode 100644 index 000000000..fdbd25ea8 --- /dev/null +++ b/keyboards/satan/keymaps/abhixec/rules.mk @@ -0,0 +1,18 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + diff --git a/keyboards/satan/satan.h b/keyboards/satan/satan.h index 0d9dd96a1..a2a598460 100644 --- a/keyboards/satan/satan.h +++ b/keyboards/satan/satan.h @@ -36,6 +36,35 @@ {k40, k41, k42, XXX, XXX, k45, XXX, XXX, XXX, k49, k4a, k4b, k4c, k4d} \ } + +/* Satan GH60 ANSI layout-B + * ,-----------------------------------------------------------. + * | 00| 01| 02| 03| 04| 05| 06| 07| 08| 09| 0a| 0b| 0c| 0d | + * |-----------------------------------------------------------| + * | 10 | 11| 12| 13| 14| 15| 16| 17| 18| 19| 1a| 1b| 1c| 1d | + * |-----------------------------------------------------------| + * | 20 | 21| 22| 23| 24| 25| 26| 27| 28| 29| 2a| 2b| 2d | + * |-----------------------------------------------------------| + * | 30 | 32| 33| 34| 35| 36| 37| 38| 39| 3a| 3b| 3d | 3c | + * |-----------------------------------------------------------| + * | 40 | 41 | 42 | 45 | 4a | 4b | 4c | 4d | + * `-----------------------------------------------------------' + */ +#define LAYOUT_60_ansi_split_rshift( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2d, \ + k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3d, k3c, \ + k40, k41, k42, k45, k4a, k4b, k4c, k4d \ +) \ +{ \ + {k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d}, \ + {k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d}, \ + {k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, XXX, k2d}, \ + {k30, XXX, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d}, \ + {k40, k41, k42, XXX, XXX, k45, XXX, XXX, XXX, XXX, k4a, k4b, k4c, k4d} \ +} + /* Satan GH60 ANSI layout * ,-----------------------------------------------------------. * | 00| 01| 02| 03| 04| 05| 06| 07| 08| 09| 0a| 0b| 0c| 0d | From 5eb69ca224f3d4233860a658e6a27516d86c4de7 Mon Sep 17 00:00:00 2001 From: Ryoichi KATO Date: Wed, 7 Nov 2018 23:04:02 -0800 Subject: [PATCH 483/788] Keyboard: fix ifdef for crkbd's default/keymap.c undef SSD1306OLED should not kill entire process_record_user() function. --- keyboards/crkbd/keymaps/default/keymap.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/keyboards/crkbd/keymaps/default/keymap.c b/keyboards/crkbd/keymaps/default/keymap.c index e92fbdebf..c7c9582e8 100644 --- a/keyboards/crkbd/keymaps/default/keymap.c +++ b/keyboards/crkbd/keymaps/default/keymap.c @@ -179,10 +179,13 @@ void iota_gfx_task_user(void) { matrix_render_user(&matrix); matrix_update(&display, &matrix); } +#endif//SSD1306OLED bool process_record_user(uint16_t keycode, keyrecord_t *record) { if (record->event.pressed) { +#ifdef SSD1306OLED set_keylog(keycode, record); +#endif // set_timelog(); } @@ -244,4 +247,3 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { return true; } -#endif From ef84bd979979f092980dc68d513a906e084c8c57 Mon Sep 17 00:00:00 2001 From: Filip Sund Date: Fri, 9 Nov 2018 00:12:42 +0100 Subject: [PATCH 484/788] Keyboard: Add 30wer config and keymap (#4386) * Preliminary 30wer firmware. Not tested on real board yet. * Added a layer to default 30wer keymap. * Wrote readme for 30wer. * Added 30wer info.json. --- keyboards/30wer/30wer.c | 1 + keyboards/30wer/30wer.h | 14 ++++++ keyboards/30wer/config.h | 31 ++++++++++++ keyboards/30wer/info.json | 51 ++++++++++++++++++++ keyboards/30wer/keymaps/default/keymap.c | 17 +++++++ keyboards/30wer/readme.md | 16 +++++++ keyboards/30wer/rules.mk | 60 ++++++++++++++++++++++++ 7 files changed, 190 insertions(+) create mode 100644 keyboards/30wer/30wer.c create mode 100644 keyboards/30wer/30wer.h create mode 100644 keyboards/30wer/config.h create mode 100644 keyboards/30wer/info.json create mode 100644 keyboards/30wer/keymaps/default/keymap.c create mode 100644 keyboards/30wer/readme.md create mode 100644 keyboards/30wer/rules.mk diff --git a/keyboards/30wer/30wer.c b/keyboards/30wer/30wer.c new file mode 100644 index 000000000..a46c54319 --- /dev/null +++ b/keyboards/30wer/30wer.c @@ -0,0 +1 @@ +#include "30wer.h" diff --git a/keyboards/30wer/30wer.h b/keyboards/30wer/30wer.h new file mode 100644 index 000000000..e7bce8277 --- /dev/null +++ b/keyboards/30wer/30wer.h @@ -0,0 +1,14 @@ +#pragma once + +#include "quantum.h" + +#define LAYOUT( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b \ +) \ +{ \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c }, \ + { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c }, \ + { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b } \ +} diff --git a/keyboards/30wer/config.h b/keyboards/30wer/config.h new file mode 100644 index 000000000..d49758524 --- /dev/null +++ b/keyboards/30wer/config.h @@ -0,0 +1,31 @@ +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0x1234 +#define PRODUCT_ID 0x5678 +#define DEVICE_VER 0x0000 +#define MANUFACTURER 8o7wer +#define PRODUCT 30wer +#define DESCRIPTION Gherkin style construction 30% staggered pcb kit + +/* key matrix size */ +#define MATRIX_ROWS 3 +#define MATRIX_COLS 13 + +/* pcb default pin-out */ +#define MATRIX_ROW_PINS { E6, B4, B5 } +#define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3, B2, B6, D1, D0, D4, C6, D7 } +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* prevent stuck modifiers */ +#define PREVENT_STUCK_MODIFIERS diff --git a/keyboards/30wer/info.json b/keyboards/30wer/info.json new file mode 100644 index 000000000..0fbbeb47d --- /dev/null +++ b/keyboards/30wer/info.json @@ -0,0 +1,51 @@ +{ + "keyboard_name": "30wer", + "url": "", + "maintainer": "qmk", + "width": 13.25, + "height": 3, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"Tab", "x":0, "y":0}, + {"label":"Q", "x":1, "y":0}, + {"label":"W", "x":2, "y":0}, + {"label":"E", "x":3, "y":0}, + {"label":"R", "x":4, "y":0}, + {"label":"T", "x":5, "y":0}, + {"label":"Y", "x":6, "y":0}, + {"label":"U", "x":7, "y":0}, + {"label":"I", "x":8, "y":0}, + {"label":"O", "x":9, "y":0}, + {"label":"P", "x":10, "y":0}, + {"label":"Bksp", "x":11, "y":0}, + {"label":"Delete", "x":12, "y":0, "w":1.25}, + {"label":"Ctrl", "x":0, "y":1, "w":1.25}, + {"label":"A", "x":1.25, "y":1}, + {"label":"S", "x":2.25, "y":1}, + {"label":"D", "x":3.25, "y":1}, + {"label":"F", "x":4.25, "y":1}, + {"label":"G", "x":5.25, "y":1}, + {"label":"H", "x":6.25, "y":1}, + {"label":"J", "x":7.25, "y":1}, + {"label":"K", "x":8.25, "y":1}, + {"label":"L", "x":9.25, "y":1}, + {"label":":", "x":10.25, "y":1}, + {"label":"\"", "x":11.25, "y":1}, + {"label":"Enter", "x":12.25, "y":1}, + {"label":"Shift", "x":0, "y":2, "w":1.75}, + {"label":"Z", "x":1.75, "y":2}, + {"label":"X", "x":2.75, "y":2}, + {"label":"C", "x":3.75, "y":2}, + {"label":"V", "x":4.75, "y":2}, + {"label":"B", "x":5.75, "y":2}, + {"label":"N", "x":6.75, "y":2}, + {"label":"M", "x":7.75, "y":2}, + {"label":"<", "x":8.75, "y":2}, + {"label":">", "x":9.75, "y":2}, + {"label":"?", "x":10.75, "y":2}, + {"label":"Space", "x":11.75, "y":2, "w":1.5} + ] + } + } +} diff --git a/keyboards/30wer/keymaps/default/keymap.c b/keyboards/30wer/keymaps/default/keymap.c new file mode 100644 index 000000000..9e39a500a --- /dev/null +++ b/keyboards/30wer/keymaps/default/keymap.c @@ -0,0 +1,17 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +[0] = LAYOUT( \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_BSPC, \ + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, LT(1, KC_SPC) \ +), + +[1] = LAYOUT( \ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_UP, KC_DEL, \ + _______, _______, _______, _______, RESET, _______, _______, _______, _______, _______, KC_LEFT, KC_RGHT, _______, \ + KC_LALT, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DOWN, _______ \ +), + +}; diff --git a/keyboards/30wer/readme.md b/keyboards/30wer/readme.md new file mode 100644 index 000000000..c9184f726 --- /dev/null +++ b/keyboards/30wer/readme.md @@ -0,0 +1,16 @@ +30wer by 8o7wer +=== + +![30wer](https://i.imgur.com/ZYbRvY7.png) + +Keyboard Maintainer: [Filip Sund](https://github.com/FSund) +Hardware Supported: Pro Micro +Hardware Availability: Group buy + +More info in the [group by thread at Keebtalk](https://www.keebtalk.com/t/gb-30wer-by-8o7wer/3618/). + +Make example for this keyboard (after setting up your build environment): + + make 30wer:default + +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). \ No newline at end of file diff --git a/keyboards/30wer/rules.mk b/keyboards/30wer/rules.mk new file mode 100644 index 000000000..9d77ec546 --- /dev/null +++ b/keyboards/30wer/rules.mk @@ -0,0 +1,60 @@ +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + +# Bootloader +# This definition is optional, and if your keyboard supports multiple bootloaders of +# different sizes, comment this out, and the correct address will be loaded +# automatically (+60). See bootloader.mk for all options. +BOOTLOADER = caterina + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. From 73883425a55f23a319eb1522c2e3ce52b8e2f042 Mon Sep 17 00:00:00 2001 From: zvecr Date: Thu, 8 Nov 2018 23:17:41 +0000 Subject: [PATCH 485/788] relocate 40percent.club boards to new parent folder (#4380) * Initial move of 40percent.club boards to common parent folder. * Refactor readme files to be consistent * Refactor readme files to be consistent - fix make command examples. * Refactor readme files to be consistent - align readme filenames. * Refactor readme files to be consistent - fix repo url. * Disable Community keymap builds as they are currently failing due to missing functionality * Move more of 40percent.club boards to common parent folder. * Refactor readme files to be consistent - align readme filenames. * Refactor readme files to be consistent - fix make command examples. --- keyboards/{ => 40percentclub}/4x4/4x4.c | 0 keyboards/{ => 40percentclub}/4x4/4x4.h | 0 keyboards/{ => 40percentclub}/4x4/config.h | 0 .../4x4/keymaps/default/config.h | 0 .../4x4/keymaps/default/keymap.c | 0 keyboards/{ => 40percentclub}/4x4/readme.md | 5 +++-- keyboards/{ => 40percentclub}/4x4/rules.mk | 8 ++++---- keyboards/{ => 40percentclub}/5x5/5x5.c | 0 keyboards/{ => 40percentclub}/5x5/5x5.h | 0 keyboards/{ => 40percentclub}/5x5/config.h | 0 .../5x5/keymaps/default/config.h | 0 .../5x5/keymaps/default/keymap.c | 0 keyboards/{ => 40percentclub}/5x5/readme.md | 5 +++-- keyboards/{ => 40percentclub}/5x5/rules.mk | 6 +++--- keyboards/{ => 40percentclub}/6lit/6lit.c | 0 keyboards/{ => 40percentclub}/6lit/6lit.h | 0 keyboards/{ => 40percentclub}/6lit/config.h | 0 keyboards/{ => 40percentclub}/6lit/info.json | 0 .../6lit/keymaps/default/config.h | 0 .../6lit/keymaps/default/keymap.c | 0 .../6lit/keymaps/default/readme.md | 0 .../6lit/keymaps/macro/config.h | 0 .../6lit/keymaps/macro/keymap.c | 0 .../6lit/keymaps/macro/readme.md | 0 keyboards/{ => 40percentclub}/6lit/readme.md | 3 ++- keyboards/{ => 40percentclub}/6lit/rules.mk | 0 keyboards/{ => 40percentclub}/foobar/config.h | 0 keyboards/{ => 40percentclub}/foobar/foobar.c | 0 keyboards/{ => 40percentclub}/foobar/foobar.h | 0 keyboards/{ => 40percentclub}/foobar/info.json | 0 .../foobar/keymaps/default/config.h | 0 .../foobar/keymaps/default/keymap.c | 0 .../foobar/keymaps/default/readme.md | 0 .../foobar/keymaps/macro/config.h | 0 .../foobar/keymaps/macro/keymap.c | 0 .../foobar/keymaps/macro/readme.md | 0 keyboards/{ => 40percentclub}/foobar/readme.md | 3 ++- keyboards/{ => 40percentclub}/foobar/rules.mk | 0 keyboards/{ => 40percentclub}/gherkin/config.h | 0 .../{ => 40percentclub}/gherkin/gherkin.c | 0 .../{ => 40percentclub}/gherkin/gherkin.h | 0 .../{ => 40percentclub}/gherkin/info.json | 0 .../gherkin/keymaps/bbaserdem/README.md | 0 .../gherkin/keymaps/bbaserdem/config.h | 0 .../gherkin/keymaps/bbaserdem/keymap.c | 0 .../gherkin/keymaps/bbaserdem/rules.mk | 0 .../gherkin/keymaps/default/keymap.c | 0 .../gherkin/keymaps/itsaferbie/config.h | 0 .../gherkin/keymaps/itsaferbie/keymap.c | 0 .../gherkin/keymaps/itsaferbie/rules.mk | 0 .../gherkin/keymaps/mjt/config.h | 0 .../gherkin/keymaps/mjt/keymap.c | 0 .../gherkin/keymaps/mjt/rules.mk | 0 .../gherkin/keymaps/steno/config.h | 0 .../gherkin/keymaps/steno/keymap.c | 0 .../gherkin/keymaps/steno/readme.md | 0 .../gherkin/keymaps/steno/rules.mk | 0 .../gherkin/keymaps/talljoe-gherkin/config.h | 0 .../gherkin/keymaps/talljoe-gherkin/keymap.c | 0 .../gherkin/keymaps/talljoe-gherkin/rules.mk | 0 .../gherkin/readme.md} | 9 ++++++--- keyboards/{ => 40percentclub}/gherkin/rules.mk | 0 keyboards/{ => 40percentclub}/luddite/config.h | 0 .../luddite/keymaps/default/keymap.c | 0 .../{ => 40percentclub}/luddite/luddite.c | 0 .../{ => 40percentclub}/luddite/luddite.h | 0 .../luddite/readme.md} | 5 ++++- keyboards/{ => 40percentclub}/luddite/rules.mk | 0 keyboards/{ => 40percentclub}/mf68/config.h | 0 keyboards/{ => 40percentclub}/mf68/info.json | 0 .../mf68/keymaps/default/keymap.c | 0 .../mf68/keymaps/factory/keymap.c | 0 keyboards/{ => 40percentclub}/mf68/mf68.c | 0 keyboards/{ => 40percentclub}/mf68/mf68.h | 0 keyboards/40percentclub/mf68/readme.md | 18 ++++++++++++++++++ keyboards/{ => 40percentclub}/mf68/rules.mk | 0 .../{ => 40percentclub}/mf68_ble/config.h | 0 .../{ => 40percentclub}/mf68_ble/info.json | 0 .../mf68_ble/keymaps/default/keymap.c | 0 .../{ => 40percentclub}/mf68_ble/mf68_ble.c | 0 .../{ => 40percentclub}/mf68_ble/mf68_ble.h | 0 .../mf68_ble/readme.md} | 16 +++++++++------- .../{ => 40percentclub}/mf68_ble/rules.mk | 0 keyboards/{ => 40percentclub}/nano/config.h | 0 keyboards/{ => 40percentclub}/nano/info.json | 0 .../nano/keymaps/default/keymap.c | 0 .../nano/keymaps/default/rules.mk | 0 .../nano/keymaps/spooka/config.h | 0 .../nano/keymaps/spooka/keymap.c | 0 .../nano/keymaps/spooka/rules.mk | 0 keyboards/{ => 40percentclub}/nano/matrix.c | 0 keyboards/{ => 40percentclub}/nano/nano.c | 0 keyboards/{ => 40percentclub}/nano/nano.h | 0 keyboards/40percentclub/nano/readme.md | 16 ++++++++++++++++ keyboards/{ => 40percentclub}/nano/rules.mk | 0 keyboards/40percentclub/readme.md | 4 ++++ keyboards/{ => 40percentclub}/tomato/config.h | 0 keyboards/{ => 40percentclub}/tomato/info.json | 0 .../tomato/keymaps/default/keymap.c | 0 keyboards/{ => 40percentclub}/tomato/readme.md | 8 +++++--- keyboards/{ => 40percentclub}/tomato/rules.mk | 0 keyboards/{ => 40percentclub}/tomato/tomato.c | 0 keyboards/{ => 40percentclub}/tomato/tomato.h | 0 .../{ => 40percentclub}/ut47/LED_controls.ino | 0 keyboards/{ => 40percentclub}/ut47/config.h | 0 keyboards/{ => 40percentclub}/ut47/info.json | 0 .../ut47/keymaps/default/config.h | 0 .../ut47/keymaps/default/keymap.c | 0 .../ut47/keymaps/default/readme.md | 0 .../ut47/keymaps/non-us/config.h | 0 .../ut47/keymaps/non-us/keymap.c | 0 .../ut47/keymaps/non-us/readme.md | 0 .../ut47/keymaps/nordic/config.h | 0 .../ut47/keymaps/nordic/keymap.c | 0 .../ut47/keymaps/nordic/readme.md | 0 .../ut47/keymaps/rgb/config.h | 0 .../ut47/keymaps/rgb/keymap.c | 0 .../ut47/keymaps/rgb/readme.md | 0 .../ut47/keymaps/rgb/rules.mk | 0 keyboards/{ => 40percentclub}/ut47/led.c | 0 keyboards/{ => 40percentclub}/ut47/matrix.c | 0 keyboards/{ => 40percentclub}/ut47/readme.md | 7 ++++--- keyboards/{ => 40percentclub}/ut47/rules.mk | 0 keyboards/{ => 40percentclub}/ut47/ut47.c | 0 keyboards/{ => 40percentclub}/ut47/ut47.h | 0 keyboards/mf68/README.md | 18 ------------------ keyboards/nano/readme.md | 14 -------------- 127 files changed, 83 insertions(+), 62 deletions(-) rename keyboards/{ => 40percentclub}/4x4/4x4.c (100%) rename keyboards/{ => 40percentclub}/4x4/4x4.h (100%) rename keyboards/{ => 40percentclub}/4x4/config.h (100%) rename keyboards/{ => 40percentclub}/4x4/keymaps/default/config.h (100%) rename keyboards/{ => 40percentclub}/4x4/keymaps/default/keymap.c (100%) rename keyboards/{ => 40percentclub}/4x4/readme.md (77%) rename keyboards/{ => 40percentclub}/4x4/rules.mk (94%) rename keyboards/{ => 40percentclub}/5x5/5x5.c (100%) rename keyboards/{ => 40percentclub}/5x5/5x5.h (100%) rename keyboards/{ => 40percentclub}/5x5/config.h (100%) rename keyboards/{ => 40percentclub}/5x5/keymaps/default/config.h (100%) rename keyboards/{ => 40percentclub}/5x5/keymaps/default/keymap.c (100%) rename keyboards/{ => 40percentclub}/5x5/readme.md (77%) rename keyboards/{ => 40percentclub}/5x5/rules.mk (95%) rename keyboards/{ => 40percentclub}/6lit/6lit.c (100%) rename keyboards/{ => 40percentclub}/6lit/6lit.h (100%) rename keyboards/{ => 40percentclub}/6lit/config.h (100%) rename keyboards/{ => 40percentclub}/6lit/info.json (100%) rename keyboards/{ => 40percentclub}/6lit/keymaps/default/config.h (100%) rename keyboards/{ => 40percentclub}/6lit/keymaps/default/keymap.c (100%) rename keyboards/{ => 40percentclub}/6lit/keymaps/default/readme.md (100%) rename keyboards/{ => 40percentclub}/6lit/keymaps/macro/config.h (100%) rename keyboards/{ => 40percentclub}/6lit/keymaps/macro/keymap.c (100%) rename keyboards/{ => 40percentclub}/6lit/keymaps/macro/readme.md (100%) rename keyboards/{ => 40percentclub}/6lit/readme.md (95%) rename keyboards/{ => 40percentclub}/6lit/rules.mk (100%) rename keyboards/{ => 40percentclub}/foobar/config.h (100%) rename keyboards/{ => 40percentclub}/foobar/foobar.c (100%) rename keyboards/{ => 40percentclub}/foobar/foobar.h (100%) rename keyboards/{ => 40percentclub}/foobar/info.json (100%) rename keyboards/{ => 40percentclub}/foobar/keymaps/default/config.h (100%) rename keyboards/{ => 40percentclub}/foobar/keymaps/default/keymap.c (100%) rename keyboards/{ => 40percentclub}/foobar/keymaps/default/readme.md (100%) rename keyboards/{ => 40percentclub}/foobar/keymaps/macro/config.h (100%) rename keyboards/{ => 40percentclub}/foobar/keymaps/macro/keymap.c (100%) rename keyboards/{ => 40percentclub}/foobar/keymaps/macro/readme.md (100%) rename keyboards/{ => 40percentclub}/foobar/readme.md (95%) rename keyboards/{ => 40percentclub}/foobar/rules.mk (100%) rename keyboards/{ => 40percentclub}/gherkin/config.h (100%) rename keyboards/{ => 40percentclub}/gherkin/gherkin.c (100%) rename keyboards/{ => 40percentclub}/gherkin/gherkin.h (100%) rename keyboards/{ => 40percentclub}/gherkin/info.json (100%) rename keyboards/{ => 40percentclub}/gherkin/keymaps/bbaserdem/README.md (100%) rename keyboards/{ => 40percentclub}/gherkin/keymaps/bbaserdem/config.h (100%) rename keyboards/{ => 40percentclub}/gherkin/keymaps/bbaserdem/keymap.c (100%) rename keyboards/{ => 40percentclub}/gherkin/keymaps/bbaserdem/rules.mk (100%) rename keyboards/{ => 40percentclub}/gherkin/keymaps/default/keymap.c (100%) rename keyboards/{ => 40percentclub}/gherkin/keymaps/itsaferbie/config.h (100%) rename keyboards/{ => 40percentclub}/gherkin/keymaps/itsaferbie/keymap.c (100%) rename keyboards/{ => 40percentclub}/gherkin/keymaps/itsaferbie/rules.mk (100%) rename keyboards/{ => 40percentclub}/gherkin/keymaps/mjt/config.h (100%) rename keyboards/{ => 40percentclub}/gherkin/keymaps/mjt/keymap.c (100%) rename keyboards/{ => 40percentclub}/gherkin/keymaps/mjt/rules.mk (100%) rename keyboards/{ => 40percentclub}/gherkin/keymaps/steno/config.h (100%) rename keyboards/{ => 40percentclub}/gherkin/keymaps/steno/keymap.c (100%) rename keyboards/{ => 40percentclub}/gherkin/keymaps/steno/readme.md (100%) rename keyboards/{ => 40percentclub}/gherkin/keymaps/steno/rules.mk (100%) rename keyboards/{ => 40percentclub}/gherkin/keymaps/talljoe-gherkin/config.h (100%) rename keyboards/{ => 40percentclub}/gherkin/keymaps/talljoe-gherkin/keymap.c (100%) rename keyboards/{ => 40percentclub}/gherkin/keymaps/talljoe-gherkin/rules.mk (100%) rename keyboards/{gherkin/README.md => 40percentclub/gherkin/readme.md} (52%) rename keyboards/{ => 40percentclub}/gherkin/rules.mk (100%) rename keyboards/{ => 40percentclub}/luddite/config.h (100%) rename keyboards/{ => 40percentclub}/luddite/keymaps/default/keymap.c (100%) rename keyboards/{ => 40percentclub}/luddite/luddite.c (100%) rename keyboards/{ => 40percentclub}/luddite/luddite.h (100%) rename keyboards/{luddite/README.md => 40percentclub/luddite/readme.md} (82%) rename keyboards/{ => 40percentclub}/luddite/rules.mk (100%) rename keyboards/{ => 40percentclub}/mf68/config.h (100%) rename keyboards/{ => 40percentclub}/mf68/info.json (100%) rename keyboards/{ => 40percentclub}/mf68/keymaps/default/keymap.c (100%) rename keyboards/{ => 40percentclub}/mf68/keymaps/factory/keymap.c (100%) rename keyboards/{ => 40percentclub}/mf68/mf68.c (100%) rename keyboards/{ => 40percentclub}/mf68/mf68.h (100%) create mode 100644 keyboards/40percentclub/mf68/readme.md rename keyboards/{ => 40percentclub}/mf68/rules.mk (100%) rename keyboards/{ => 40percentclub}/mf68_ble/config.h (100%) rename keyboards/{ => 40percentclub}/mf68_ble/info.json (100%) rename keyboards/{ => 40percentclub}/mf68_ble/keymaps/default/keymap.c (100%) rename keyboards/{ => 40percentclub}/mf68_ble/mf68_ble.c (100%) rename keyboards/{ => 40percentclub}/mf68_ble/mf68_ble.h (100%) rename keyboards/{mf68_ble/README.md => 40percentclub/mf68_ble/readme.md} (58%) rename keyboards/{ => 40percentclub}/mf68_ble/rules.mk (100%) rename keyboards/{ => 40percentclub}/nano/config.h (100%) rename keyboards/{ => 40percentclub}/nano/info.json (100%) rename keyboards/{ => 40percentclub}/nano/keymaps/default/keymap.c (100%) rename keyboards/{ => 40percentclub}/nano/keymaps/default/rules.mk (100%) rename keyboards/{ => 40percentclub}/nano/keymaps/spooka/config.h (100%) rename keyboards/{ => 40percentclub}/nano/keymaps/spooka/keymap.c (100%) rename keyboards/{ => 40percentclub}/nano/keymaps/spooka/rules.mk (100%) rename keyboards/{ => 40percentclub}/nano/matrix.c (100%) rename keyboards/{ => 40percentclub}/nano/nano.c (100%) rename keyboards/{ => 40percentclub}/nano/nano.h (100%) create mode 100644 keyboards/40percentclub/nano/readme.md rename keyboards/{ => 40percentclub}/nano/rules.mk (100%) create mode 100644 keyboards/40percentclub/readme.md rename keyboards/{ => 40percentclub}/tomato/config.h (100%) rename keyboards/{ => 40percentclub}/tomato/info.json (100%) rename keyboards/{ => 40percentclub}/tomato/keymaps/default/keymap.c (100%) rename keyboards/{ => 40percentclub}/tomato/readme.md (56%) rename keyboards/{ => 40percentclub}/tomato/rules.mk (100%) rename keyboards/{ => 40percentclub}/tomato/tomato.c (100%) rename keyboards/{ => 40percentclub}/tomato/tomato.h (100%) rename keyboards/{ => 40percentclub}/ut47/LED_controls.ino (100%) rename keyboards/{ => 40percentclub}/ut47/config.h (100%) rename keyboards/{ => 40percentclub}/ut47/info.json (100%) rename keyboards/{ => 40percentclub}/ut47/keymaps/default/config.h (100%) rename keyboards/{ => 40percentclub}/ut47/keymaps/default/keymap.c (100%) rename keyboards/{ => 40percentclub}/ut47/keymaps/default/readme.md (100%) rename keyboards/{ => 40percentclub}/ut47/keymaps/non-us/config.h (100%) rename keyboards/{ => 40percentclub}/ut47/keymaps/non-us/keymap.c (100%) rename keyboards/{ => 40percentclub}/ut47/keymaps/non-us/readme.md (100%) rename keyboards/{ => 40percentclub}/ut47/keymaps/nordic/config.h (100%) rename keyboards/{ => 40percentclub}/ut47/keymaps/nordic/keymap.c (100%) rename keyboards/{ => 40percentclub}/ut47/keymaps/nordic/readme.md (100%) rename keyboards/{ => 40percentclub}/ut47/keymaps/rgb/config.h (100%) rename keyboards/{ => 40percentclub}/ut47/keymaps/rgb/keymap.c (100%) rename keyboards/{ => 40percentclub}/ut47/keymaps/rgb/readme.md (100%) rename keyboards/{ => 40percentclub}/ut47/keymaps/rgb/rules.mk (100%) rename keyboards/{ => 40percentclub}/ut47/led.c (100%) rename keyboards/{ => 40percentclub}/ut47/matrix.c (100%) rename keyboards/{ => 40percentclub}/ut47/readme.md (92%) rename keyboards/{ => 40percentclub}/ut47/rules.mk (100%) rename keyboards/{ => 40percentclub}/ut47/ut47.c (100%) rename keyboards/{ => 40percentclub}/ut47/ut47.h (100%) delete mode 100644 keyboards/mf68/README.md delete mode 100644 keyboards/nano/readme.md diff --git a/keyboards/4x4/4x4.c b/keyboards/40percentclub/4x4/4x4.c similarity index 100% rename from keyboards/4x4/4x4.c rename to keyboards/40percentclub/4x4/4x4.c diff --git a/keyboards/4x4/4x4.h b/keyboards/40percentclub/4x4/4x4.h similarity index 100% rename from keyboards/4x4/4x4.h rename to keyboards/40percentclub/4x4/4x4.h diff --git a/keyboards/4x4/config.h b/keyboards/40percentclub/4x4/config.h similarity index 100% rename from keyboards/4x4/config.h rename to keyboards/40percentclub/4x4/config.h diff --git a/keyboards/4x4/keymaps/default/config.h b/keyboards/40percentclub/4x4/keymaps/default/config.h similarity index 100% rename from keyboards/4x4/keymaps/default/config.h rename to keyboards/40percentclub/4x4/keymaps/default/config.h diff --git a/keyboards/4x4/keymaps/default/keymap.c b/keyboards/40percentclub/4x4/keymaps/default/keymap.c similarity index 100% rename from keyboards/4x4/keymaps/default/keymap.c rename to keyboards/40percentclub/4x4/keymaps/default/keymap.c diff --git a/keyboards/4x4/readme.md b/keyboards/40percentclub/4x4/readme.md similarity index 77% rename from keyboards/4x4/readme.md rename to keyboards/40percentclub/4x4/readme.md index 3ca074fdd..077a2049b 100644 --- a/keyboards/4x4/readme.md +++ b/keyboards/40percentclub/4x4/readme.md @@ -17,7 +17,8 @@ Hardware Availability: [4x4x4x4x4 project on 40% Keyboards](http://www.40percent Make example for this keyboard (after setting up your build environment): - make 4x4:default + make 40percentclub/4x4:default + +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). -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. First pass at adding support for the 4x4 keyboard. Compiles but completely untested. Intended to kick-start development. diff --git a/keyboards/4x4/rules.mk b/keyboards/40percentclub/4x4/rules.mk similarity index 94% rename from keyboards/4x4/rules.mk rename to keyboards/40percentclub/4x4/rules.mk index b8b4bccc4..d572e7244 100644 --- a/keyboards/4x4/rules.mk +++ b/keyboards/40percentclub/4x4/rules.mk @@ -1,5 +1,4 @@ # MCU name -#MCU = at90usb1286 MCU = atmega32u4 # Processor frequency. @@ -43,11 +42,11 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT # Atmel DFU loader 4096 # LUFA bootloader 4096 # USBaspLoader 2048 -OPT_DEFS += -DBOOTLOADER_SIZE=4096 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 # Bootloader # This definition is optional, and if your keyboard supports multiple bootloaders of -# different sizes, comment this out, and the correct address will be loaded +# different sizes, comment this out, and the correct address will be loaded # automatically (+60). See bootloader.mk for all options. BOOTLOADER = caterina @@ -71,4 +70,5 @@ AUDIO_ENABLE = no # Audio output on port C6 FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) -LAYOUTS = ortho_4x4 ortho_4x8 ortho_4x12 ortho_4x16 +#FIXME: Community keymap build are currently failing due to missing functionality +#LAYOUTS = ortho_4x4 ortho_4x8 ortho_4x12 ortho_4x16 diff --git a/keyboards/5x5/5x5.c b/keyboards/40percentclub/5x5/5x5.c similarity index 100% rename from keyboards/5x5/5x5.c rename to keyboards/40percentclub/5x5/5x5.c diff --git a/keyboards/5x5/5x5.h b/keyboards/40percentclub/5x5/5x5.h similarity index 100% rename from keyboards/5x5/5x5.h rename to keyboards/40percentclub/5x5/5x5.h diff --git a/keyboards/5x5/config.h b/keyboards/40percentclub/5x5/config.h similarity index 100% rename from keyboards/5x5/config.h rename to keyboards/40percentclub/5x5/config.h diff --git a/keyboards/5x5/keymaps/default/config.h b/keyboards/40percentclub/5x5/keymaps/default/config.h similarity index 100% rename from keyboards/5x5/keymaps/default/config.h rename to keyboards/40percentclub/5x5/keymaps/default/config.h diff --git a/keyboards/5x5/keymaps/default/keymap.c b/keyboards/40percentclub/5x5/keymaps/default/keymap.c similarity index 100% rename from keyboards/5x5/keymaps/default/keymap.c rename to keyboards/40percentclub/5x5/keymaps/default/keymap.c diff --git a/keyboards/5x5/readme.md b/keyboards/40percentclub/5x5/readme.md similarity index 77% rename from keyboards/5x5/readme.md rename to keyboards/40percentclub/5x5/readme.md index e25535968..8f0d8e166 100644 --- a/keyboards/5x5/readme.md +++ b/keyboards/40percentclub/5x5/readme.md @@ -17,7 +17,8 @@ Hardware Availability: [5x5 project on 40% Keyboards](http://www.40percent.club/ Make example for this keyboard (after setting up your build environment): - make 5x5:default + make 40percentclub/5x5:default + +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). -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. First pass at adding support for the 4x4 keyboard. Compiles but completely untested. Intended to kick-start development. diff --git a/keyboards/5x5/rules.mk b/keyboards/40percentclub/5x5/rules.mk similarity index 95% rename from keyboards/5x5/rules.mk rename to keyboards/40percentclub/5x5/rules.mk index 24e0e020f..abc961a86 100644 --- a/keyboards/5x5/rules.mk +++ b/keyboards/40percentclub/5x5/rules.mk @@ -1,5 +1,4 @@ # MCU name -#MCU = at90usb1286 MCU = atmega32u4 # Processor frequency. @@ -43,7 +42,7 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT # Atmel DFU loader 4096 # LUFA bootloader 4096 # USBaspLoader 2048 -OPT_DEFS += -DBOOTLOADER_SIZE=4096 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 # Bootloader # This definition is optional, and if your keyboard supports multiple bootloaders of @@ -71,4 +70,5 @@ AUDIO_ENABLE = no # Audio output on port C6 FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) -LAYOUTS = ortho_5x5 ortho_5x10 ortho_5x15 +#FIXME: Community keymap build are currently failing due to missing functionality +#LAYOUTS = ortho_5x5 ortho_5x10 ortho_5x15 diff --git a/keyboards/6lit/6lit.c b/keyboards/40percentclub/6lit/6lit.c similarity index 100% rename from keyboards/6lit/6lit.c rename to keyboards/40percentclub/6lit/6lit.c diff --git a/keyboards/6lit/6lit.h b/keyboards/40percentclub/6lit/6lit.h similarity index 100% rename from keyboards/6lit/6lit.h rename to keyboards/40percentclub/6lit/6lit.h diff --git a/keyboards/6lit/config.h b/keyboards/40percentclub/6lit/config.h similarity index 100% rename from keyboards/6lit/config.h rename to keyboards/40percentclub/6lit/config.h diff --git a/keyboards/6lit/info.json b/keyboards/40percentclub/6lit/info.json similarity index 100% rename from keyboards/6lit/info.json rename to keyboards/40percentclub/6lit/info.json diff --git a/keyboards/6lit/keymaps/default/config.h b/keyboards/40percentclub/6lit/keymaps/default/config.h similarity index 100% rename from keyboards/6lit/keymaps/default/config.h rename to keyboards/40percentclub/6lit/keymaps/default/config.h diff --git a/keyboards/6lit/keymaps/default/keymap.c b/keyboards/40percentclub/6lit/keymaps/default/keymap.c similarity index 100% rename from keyboards/6lit/keymaps/default/keymap.c rename to keyboards/40percentclub/6lit/keymaps/default/keymap.c diff --git a/keyboards/6lit/keymaps/default/readme.md b/keyboards/40percentclub/6lit/keymaps/default/readme.md similarity index 100% rename from keyboards/6lit/keymaps/default/readme.md rename to keyboards/40percentclub/6lit/keymaps/default/readme.md diff --git a/keyboards/6lit/keymaps/macro/config.h b/keyboards/40percentclub/6lit/keymaps/macro/config.h similarity index 100% rename from keyboards/6lit/keymaps/macro/config.h rename to keyboards/40percentclub/6lit/keymaps/macro/config.h diff --git a/keyboards/6lit/keymaps/macro/keymap.c b/keyboards/40percentclub/6lit/keymaps/macro/keymap.c similarity index 100% rename from keyboards/6lit/keymaps/macro/keymap.c rename to keyboards/40percentclub/6lit/keymaps/macro/keymap.c diff --git a/keyboards/6lit/keymaps/macro/readme.md b/keyboards/40percentclub/6lit/keymaps/macro/readme.md similarity index 100% rename from keyboards/6lit/keymaps/macro/readme.md rename to keyboards/40percentclub/6lit/keymaps/macro/readme.md diff --git a/keyboards/6lit/readme.md b/keyboards/40percentclub/6lit/readme.md similarity index 95% rename from keyboards/6lit/readme.md rename to keyboards/40percentclub/6lit/readme.md index d5b210028..3d28df2d7 100644 --- a/keyboards/6lit/readme.md +++ b/keyboards/40percentclub/6lit/readme.md @@ -1,6 +1,7 @@ # 6lit ![6lit](https://1.bp.blogspot.com/-Pa8RgYZ0hy8/Wbmr4bjuV0I/AAAAAAACDbI/WLKQMDlcDVAVf1lAIRMN51usR1XcCCVNgCLcBGAs/s1600/a.JPG) +=== 6 key macropad that fits within the 100mm x 100mm PCB size. Can be used singly as a regular 6 key macropad as well. @@ -12,6 +13,6 @@ Hardware Availability: [6lit project on 40% Keyboards](http://www.40percent.club Make example for this keyboard (after setting up your build environment): - make 6lit:default + make 40percentclub/6lit:default 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). diff --git a/keyboards/6lit/rules.mk b/keyboards/40percentclub/6lit/rules.mk similarity index 100% rename from keyboards/6lit/rules.mk rename to keyboards/40percentclub/6lit/rules.mk diff --git a/keyboards/foobar/config.h b/keyboards/40percentclub/foobar/config.h similarity index 100% rename from keyboards/foobar/config.h rename to keyboards/40percentclub/foobar/config.h diff --git a/keyboards/foobar/foobar.c b/keyboards/40percentclub/foobar/foobar.c similarity index 100% rename from keyboards/foobar/foobar.c rename to keyboards/40percentclub/foobar/foobar.c diff --git a/keyboards/foobar/foobar.h b/keyboards/40percentclub/foobar/foobar.h similarity index 100% rename from keyboards/foobar/foobar.h rename to keyboards/40percentclub/foobar/foobar.h diff --git a/keyboards/foobar/info.json b/keyboards/40percentclub/foobar/info.json similarity index 100% rename from keyboards/foobar/info.json rename to keyboards/40percentclub/foobar/info.json diff --git a/keyboards/foobar/keymaps/default/config.h b/keyboards/40percentclub/foobar/keymaps/default/config.h similarity index 100% rename from keyboards/foobar/keymaps/default/config.h rename to keyboards/40percentclub/foobar/keymaps/default/config.h diff --git a/keyboards/foobar/keymaps/default/keymap.c b/keyboards/40percentclub/foobar/keymaps/default/keymap.c similarity index 100% rename from keyboards/foobar/keymaps/default/keymap.c rename to keyboards/40percentclub/foobar/keymaps/default/keymap.c diff --git a/keyboards/foobar/keymaps/default/readme.md b/keyboards/40percentclub/foobar/keymaps/default/readme.md similarity index 100% rename from keyboards/foobar/keymaps/default/readme.md rename to keyboards/40percentclub/foobar/keymaps/default/readme.md diff --git a/keyboards/foobar/keymaps/macro/config.h b/keyboards/40percentclub/foobar/keymaps/macro/config.h similarity index 100% rename from keyboards/foobar/keymaps/macro/config.h rename to keyboards/40percentclub/foobar/keymaps/macro/config.h diff --git a/keyboards/foobar/keymaps/macro/keymap.c b/keyboards/40percentclub/foobar/keymaps/macro/keymap.c similarity index 100% rename from keyboards/foobar/keymaps/macro/keymap.c rename to keyboards/40percentclub/foobar/keymaps/macro/keymap.c diff --git a/keyboards/foobar/keymaps/macro/readme.md b/keyboards/40percentclub/foobar/keymaps/macro/readme.md similarity index 100% rename from keyboards/foobar/keymaps/macro/readme.md rename to keyboards/40percentclub/foobar/keymaps/macro/readme.md diff --git a/keyboards/foobar/readme.md b/keyboards/40percentclub/foobar/readme.md similarity index 95% rename from keyboards/foobar/readme.md rename to keyboards/40percentclub/foobar/readme.md index 3898d4bb1..0acdf7252 100644 --- a/keyboards/foobar/readme.md +++ b/keyboards/40percentclub/foobar/readme.md @@ -1,6 +1,7 @@ # foobar ![foobar](https://2.bp.blogspot.com/-rr8TK6xg2N0/WbwVL2O7EfI/AAAAAAACDc8/209wN69ju0wAFICYYPNLIEGQhat5-5MbwCLcBGAs/s640/a.JPG) +=== Split 30% keyboard that fits within the 100mm x 100mm PCB size. Can be used together as a split keyboard or as a single 15 key macropad. @@ -12,6 +13,6 @@ Hardware Availability: [foobar project on 40% Keyboards](http://www.40percent.cl Make example for this keyboard (after setting up your build environment): - make foobar:default + make 40percentclub/foobar:default 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). diff --git a/keyboards/foobar/rules.mk b/keyboards/40percentclub/foobar/rules.mk similarity index 100% rename from keyboards/foobar/rules.mk rename to keyboards/40percentclub/foobar/rules.mk diff --git a/keyboards/gherkin/config.h b/keyboards/40percentclub/gherkin/config.h similarity index 100% rename from keyboards/gherkin/config.h rename to keyboards/40percentclub/gherkin/config.h diff --git a/keyboards/gherkin/gherkin.c b/keyboards/40percentclub/gherkin/gherkin.c similarity index 100% rename from keyboards/gherkin/gherkin.c rename to keyboards/40percentclub/gherkin/gherkin.c diff --git a/keyboards/gherkin/gherkin.h b/keyboards/40percentclub/gherkin/gherkin.h similarity index 100% rename from keyboards/gherkin/gherkin.h rename to keyboards/40percentclub/gherkin/gherkin.h diff --git a/keyboards/gherkin/info.json b/keyboards/40percentclub/gherkin/info.json similarity index 100% rename from keyboards/gherkin/info.json rename to keyboards/40percentclub/gherkin/info.json diff --git a/keyboards/gherkin/keymaps/bbaserdem/README.md b/keyboards/40percentclub/gherkin/keymaps/bbaserdem/README.md similarity index 100% rename from keyboards/gherkin/keymaps/bbaserdem/README.md rename to keyboards/40percentclub/gherkin/keymaps/bbaserdem/README.md diff --git a/keyboards/gherkin/keymaps/bbaserdem/config.h b/keyboards/40percentclub/gherkin/keymaps/bbaserdem/config.h similarity index 100% rename from keyboards/gherkin/keymaps/bbaserdem/config.h rename to keyboards/40percentclub/gherkin/keymaps/bbaserdem/config.h diff --git a/keyboards/gherkin/keymaps/bbaserdem/keymap.c b/keyboards/40percentclub/gherkin/keymaps/bbaserdem/keymap.c similarity index 100% rename from keyboards/gherkin/keymaps/bbaserdem/keymap.c rename to keyboards/40percentclub/gherkin/keymaps/bbaserdem/keymap.c diff --git a/keyboards/gherkin/keymaps/bbaserdem/rules.mk b/keyboards/40percentclub/gherkin/keymaps/bbaserdem/rules.mk similarity index 100% rename from keyboards/gherkin/keymaps/bbaserdem/rules.mk rename to keyboards/40percentclub/gherkin/keymaps/bbaserdem/rules.mk diff --git a/keyboards/gherkin/keymaps/default/keymap.c b/keyboards/40percentclub/gherkin/keymaps/default/keymap.c similarity index 100% rename from keyboards/gherkin/keymaps/default/keymap.c rename to keyboards/40percentclub/gherkin/keymaps/default/keymap.c diff --git a/keyboards/gherkin/keymaps/itsaferbie/config.h b/keyboards/40percentclub/gherkin/keymaps/itsaferbie/config.h similarity index 100% rename from keyboards/gherkin/keymaps/itsaferbie/config.h rename to keyboards/40percentclub/gherkin/keymaps/itsaferbie/config.h diff --git a/keyboards/gherkin/keymaps/itsaferbie/keymap.c b/keyboards/40percentclub/gherkin/keymaps/itsaferbie/keymap.c similarity index 100% rename from keyboards/gherkin/keymaps/itsaferbie/keymap.c rename to keyboards/40percentclub/gherkin/keymaps/itsaferbie/keymap.c diff --git a/keyboards/gherkin/keymaps/itsaferbie/rules.mk b/keyboards/40percentclub/gherkin/keymaps/itsaferbie/rules.mk similarity index 100% rename from keyboards/gherkin/keymaps/itsaferbie/rules.mk rename to keyboards/40percentclub/gherkin/keymaps/itsaferbie/rules.mk diff --git a/keyboards/gherkin/keymaps/mjt/config.h b/keyboards/40percentclub/gherkin/keymaps/mjt/config.h similarity index 100% rename from keyboards/gherkin/keymaps/mjt/config.h rename to keyboards/40percentclub/gherkin/keymaps/mjt/config.h diff --git a/keyboards/gherkin/keymaps/mjt/keymap.c b/keyboards/40percentclub/gherkin/keymaps/mjt/keymap.c similarity index 100% rename from keyboards/gherkin/keymaps/mjt/keymap.c rename to keyboards/40percentclub/gherkin/keymaps/mjt/keymap.c diff --git a/keyboards/gherkin/keymaps/mjt/rules.mk b/keyboards/40percentclub/gherkin/keymaps/mjt/rules.mk similarity index 100% rename from keyboards/gherkin/keymaps/mjt/rules.mk rename to keyboards/40percentclub/gherkin/keymaps/mjt/rules.mk diff --git a/keyboards/gherkin/keymaps/steno/config.h b/keyboards/40percentclub/gherkin/keymaps/steno/config.h similarity index 100% rename from keyboards/gherkin/keymaps/steno/config.h rename to keyboards/40percentclub/gherkin/keymaps/steno/config.h diff --git a/keyboards/gherkin/keymaps/steno/keymap.c b/keyboards/40percentclub/gherkin/keymaps/steno/keymap.c similarity index 100% rename from keyboards/gherkin/keymaps/steno/keymap.c rename to keyboards/40percentclub/gherkin/keymaps/steno/keymap.c diff --git a/keyboards/gherkin/keymaps/steno/readme.md b/keyboards/40percentclub/gherkin/keymaps/steno/readme.md similarity index 100% rename from keyboards/gherkin/keymaps/steno/readme.md rename to keyboards/40percentclub/gherkin/keymaps/steno/readme.md diff --git a/keyboards/gherkin/keymaps/steno/rules.mk b/keyboards/40percentclub/gherkin/keymaps/steno/rules.mk similarity index 100% rename from keyboards/gherkin/keymaps/steno/rules.mk rename to keyboards/40percentclub/gherkin/keymaps/steno/rules.mk diff --git a/keyboards/gherkin/keymaps/talljoe-gherkin/config.h b/keyboards/40percentclub/gherkin/keymaps/talljoe-gherkin/config.h similarity index 100% rename from keyboards/gherkin/keymaps/talljoe-gherkin/config.h rename to keyboards/40percentclub/gherkin/keymaps/talljoe-gherkin/config.h diff --git a/keyboards/gherkin/keymaps/talljoe-gherkin/keymap.c b/keyboards/40percentclub/gherkin/keymaps/talljoe-gherkin/keymap.c similarity index 100% rename from keyboards/gherkin/keymaps/talljoe-gherkin/keymap.c rename to keyboards/40percentclub/gherkin/keymaps/talljoe-gherkin/keymap.c diff --git a/keyboards/gherkin/keymaps/talljoe-gherkin/rules.mk b/keyboards/40percentclub/gherkin/keymaps/talljoe-gherkin/rules.mk similarity index 100% rename from keyboards/gherkin/keymaps/talljoe-gherkin/rules.mk rename to keyboards/40percentclub/gherkin/keymaps/talljoe-gherkin/rules.mk diff --git a/keyboards/gherkin/README.md b/keyboards/40percentclub/gherkin/readme.md similarity index 52% rename from keyboards/gherkin/README.md rename to keyboards/40percentclub/gherkin/readme.md index 5e0daeabf..a6680d720 100644 --- a/keyboards/gherkin/README.md +++ b/keyboards/40percentclub/gherkin/readme.md @@ -1,4 +1,6 @@ -Gherkin +# Gherkin + +![Gherkin](https://4.bp.blogspot.com/-sQ18-lNZXOc/WCzlTde-4PI/AAAAAAAB_JQ/qQrehAMG6DMKf3i4oj4mkmLGOfTUvb3KgCLcB/s640/IMG_20161116_122926.jpg) === A 30 key keyboard. @@ -11,8 +13,9 @@ Hardware Availability: [Gherkin project on 40% Keyboards](http://www.40percent.c Make example for this keyboard (after setting up your build environment): - make gherkin:default + make 40percentclub/gherkin:default + +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). -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. First pass at adding support for the gherkin keyboard. Compiles but completely untested. Intended to kick-start development. diff --git a/keyboards/gherkin/rules.mk b/keyboards/40percentclub/gherkin/rules.mk similarity index 100% rename from keyboards/gherkin/rules.mk rename to keyboards/40percentclub/gherkin/rules.mk diff --git a/keyboards/luddite/config.h b/keyboards/40percentclub/luddite/config.h similarity index 100% rename from keyboards/luddite/config.h rename to keyboards/40percentclub/luddite/config.h diff --git a/keyboards/luddite/keymaps/default/keymap.c b/keyboards/40percentclub/luddite/keymaps/default/keymap.c similarity index 100% rename from keyboards/luddite/keymaps/default/keymap.c rename to keyboards/40percentclub/luddite/keymaps/default/keymap.c diff --git a/keyboards/luddite/luddite.c b/keyboards/40percentclub/luddite/luddite.c similarity index 100% rename from keyboards/luddite/luddite.c rename to keyboards/40percentclub/luddite/luddite.c diff --git a/keyboards/luddite/luddite.h b/keyboards/40percentclub/luddite/luddite.h similarity index 100% rename from keyboards/luddite/luddite.h rename to keyboards/40percentclub/luddite/luddite.h diff --git a/keyboards/luddite/README.md b/keyboards/40percentclub/luddite/readme.md similarity index 82% rename from keyboards/luddite/README.md rename to keyboards/40percentclub/luddite/readme.md index 72666dda5..928b6de8f 100644 --- a/keyboards/luddite/README.md +++ b/keyboards/40percentclub/luddite/readme.md @@ -1,5 +1,8 @@ # Luddite +![Luddite](https://1.bp.blogspot.com/-GAAa-sMU_WU/W7uYLJJ8x1I/AAAAAAACS44/31n2z69BSboM4KT48YkNMJRYciC8LUMWgCLcBGAs/s640/a.jpg) +=== + Luddite 60% keyboard with backlight and RGB underglow. * [The original TMK firmware](https://github.com/di0ib/tmk_keyboard/tree/master/keyboard/luddite) @@ -10,7 +13,7 @@ Hardware Availability: [Luddite project on 40% Keyboards](http://www.40percent.c Make example for this keyboard (after setting up your build environment): - make luddite:default + make 40percentclub/luddite:default 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). diff --git a/keyboards/luddite/rules.mk b/keyboards/40percentclub/luddite/rules.mk similarity index 100% rename from keyboards/luddite/rules.mk rename to keyboards/40percentclub/luddite/rules.mk diff --git a/keyboards/mf68/config.h b/keyboards/40percentclub/mf68/config.h similarity index 100% rename from keyboards/mf68/config.h rename to keyboards/40percentclub/mf68/config.h diff --git a/keyboards/mf68/info.json b/keyboards/40percentclub/mf68/info.json similarity index 100% rename from keyboards/mf68/info.json rename to keyboards/40percentclub/mf68/info.json diff --git a/keyboards/mf68/keymaps/default/keymap.c b/keyboards/40percentclub/mf68/keymaps/default/keymap.c similarity index 100% rename from keyboards/mf68/keymaps/default/keymap.c rename to keyboards/40percentclub/mf68/keymaps/default/keymap.c diff --git a/keyboards/mf68/keymaps/factory/keymap.c b/keyboards/40percentclub/mf68/keymaps/factory/keymap.c similarity index 100% rename from keyboards/mf68/keymaps/factory/keymap.c rename to keyboards/40percentclub/mf68/keymaps/factory/keymap.c diff --git a/keyboards/mf68/mf68.c b/keyboards/40percentclub/mf68/mf68.c similarity index 100% rename from keyboards/mf68/mf68.c rename to keyboards/40percentclub/mf68/mf68.c diff --git a/keyboards/mf68/mf68.h b/keyboards/40percentclub/mf68/mf68.h similarity index 100% rename from keyboards/mf68/mf68.h rename to keyboards/40percentclub/mf68/mf68.h diff --git a/keyboards/40percentclub/mf68/readme.md b/keyboards/40percentclub/mf68/readme.md new file mode 100644 index 000000000..825c265f1 --- /dev/null +++ b/keyboards/40percentclub/mf68/readme.md @@ -0,0 +1,18 @@ +# mf68 + +![mf68](https://3.bp.blogspot.com/-0YCA3Hx2Rq0/WD3U3GWhyvI/AAAAAAAB_Uo/RWTeyCPblGcxDrDwT9WL9ck2ZRuR26DgACLcB/s640/IMG_20161129_063741.jpg) +=== + +Magicforce 68 with [replacement PCB](https://github.com/di0ib/tmk_keyboard/tree/master/keyboard/mf68) designed by [di0ib](https://github.com/di0ib). + +* [The original TMK firmware](https://github.com/di0ib/tmk_keyboard/tree/master/keyboard/mf68) + +Keyboard Maintainer: QMK Community +Hardware Supported: Pro Micro +Hardware Availability: [PCB files](https://github.com/di0ib/tmk_keyboard/tree/master/keyboard/mf68/pcb) + +Make example for this keyboard (after setting up your build environment): + + make 40percentclub/mf68:default + +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). diff --git a/keyboards/mf68/rules.mk b/keyboards/40percentclub/mf68/rules.mk similarity index 100% rename from keyboards/mf68/rules.mk rename to keyboards/40percentclub/mf68/rules.mk diff --git a/keyboards/mf68_ble/config.h b/keyboards/40percentclub/mf68_ble/config.h similarity index 100% rename from keyboards/mf68_ble/config.h rename to keyboards/40percentclub/mf68_ble/config.h diff --git a/keyboards/mf68_ble/info.json b/keyboards/40percentclub/mf68_ble/info.json similarity index 100% rename from keyboards/mf68_ble/info.json rename to keyboards/40percentclub/mf68_ble/info.json diff --git a/keyboards/mf68_ble/keymaps/default/keymap.c b/keyboards/40percentclub/mf68_ble/keymaps/default/keymap.c similarity index 100% rename from keyboards/mf68_ble/keymaps/default/keymap.c rename to keyboards/40percentclub/mf68_ble/keymaps/default/keymap.c diff --git a/keyboards/mf68_ble/mf68_ble.c b/keyboards/40percentclub/mf68_ble/mf68_ble.c similarity index 100% rename from keyboards/mf68_ble/mf68_ble.c rename to keyboards/40percentclub/mf68_ble/mf68_ble.c diff --git a/keyboards/mf68_ble/mf68_ble.h b/keyboards/40percentclub/mf68_ble/mf68_ble.h similarity index 100% rename from keyboards/mf68_ble/mf68_ble.h rename to keyboards/40percentclub/mf68_ble/mf68_ble.h diff --git a/keyboards/mf68_ble/README.md b/keyboards/40percentclub/mf68_ble/readme.md similarity index 58% rename from keyboards/mf68_ble/README.md rename to keyboards/40percentclub/mf68_ble/readme.md index 3829c8fd7..0e0f4b90d 100644 --- a/keyboards/mf68_ble/README.md +++ b/keyboards/40percentclub/mf68_ble/readme.md @@ -1,10 +1,12 @@ -MF68 -==== +# mf68_ble + +![mf68_ble](https://3.bp.blogspot.com/-0YCA3Hx2Rq0/WD3U3GWhyvI/AAAAAAAB_Uo/RWTeyCPblGcxDrDwT9WL9ck2ZRuR26DgACLcB/s640/IMG_20161129_063741.jpg) +=== Magicforce 68 with [replacement PCB](https://github.com/di0ib/tmk_keyboard/tree/master/keyboard/mf68) designed by [di0ib](https://github.com/di0ib). -Keyboard Maintainer: [di0ib](http://www.40percent.club) -Hardware Supported: [Feather 32u4 Bluefruit](https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le/) +Keyboard Maintainer: QMK Community +Hardware Supported: [Feather 32u4 Bluefruit](https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le/) Please note: This is 32u4 and not M0 Hardware Availability: [PCB files](https://github.com/di0ib/tmk_keyboard/tree/master/keyboard/mf68/pcb) [MF68 thicc case files](https://github.com/harshitgoel96/mf68-case-thicc) @@ -20,8 +22,8 @@ Below is how you wire the Feather to PCB ![wire map](https://i.imgur.com/zYOjlTA.png) -Make example for this keyboard (after setting up your build environment): +Make example for this keyboard (after setting up your build environment): - make mf68_ble:default + make 40percentclub/mf68_ble:default -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. +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). diff --git a/keyboards/mf68_ble/rules.mk b/keyboards/40percentclub/mf68_ble/rules.mk similarity index 100% rename from keyboards/mf68_ble/rules.mk rename to keyboards/40percentclub/mf68_ble/rules.mk diff --git a/keyboards/nano/config.h b/keyboards/40percentclub/nano/config.h similarity index 100% rename from keyboards/nano/config.h rename to keyboards/40percentclub/nano/config.h diff --git a/keyboards/nano/info.json b/keyboards/40percentclub/nano/info.json similarity index 100% rename from keyboards/nano/info.json rename to keyboards/40percentclub/nano/info.json diff --git a/keyboards/nano/keymaps/default/keymap.c b/keyboards/40percentclub/nano/keymaps/default/keymap.c similarity index 100% rename from keyboards/nano/keymaps/default/keymap.c rename to keyboards/40percentclub/nano/keymaps/default/keymap.c diff --git a/keyboards/nano/keymaps/default/rules.mk b/keyboards/40percentclub/nano/keymaps/default/rules.mk similarity index 100% rename from keyboards/nano/keymaps/default/rules.mk rename to keyboards/40percentclub/nano/keymaps/default/rules.mk diff --git a/keyboards/nano/keymaps/spooka/config.h b/keyboards/40percentclub/nano/keymaps/spooka/config.h similarity index 100% rename from keyboards/nano/keymaps/spooka/config.h rename to keyboards/40percentclub/nano/keymaps/spooka/config.h diff --git a/keyboards/nano/keymaps/spooka/keymap.c b/keyboards/40percentclub/nano/keymaps/spooka/keymap.c similarity index 100% rename from keyboards/nano/keymaps/spooka/keymap.c rename to keyboards/40percentclub/nano/keymaps/spooka/keymap.c diff --git a/keyboards/nano/keymaps/spooka/rules.mk b/keyboards/40percentclub/nano/keymaps/spooka/rules.mk similarity index 100% rename from keyboards/nano/keymaps/spooka/rules.mk rename to keyboards/40percentclub/nano/keymaps/spooka/rules.mk diff --git a/keyboards/nano/matrix.c b/keyboards/40percentclub/nano/matrix.c similarity index 100% rename from keyboards/nano/matrix.c rename to keyboards/40percentclub/nano/matrix.c diff --git a/keyboards/nano/nano.c b/keyboards/40percentclub/nano/nano.c similarity index 100% rename from keyboards/nano/nano.c rename to keyboards/40percentclub/nano/nano.c diff --git a/keyboards/nano/nano.h b/keyboards/40percentclub/nano/nano.h similarity index 100% rename from keyboards/nano/nano.h rename to keyboards/40percentclub/nano/nano.h diff --git a/keyboards/40percentclub/nano/readme.md b/keyboards/40percentclub/nano/readme.md new file mode 100644 index 000000000..2677e5b7b --- /dev/null +++ b/keyboards/40percentclub/nano/readme.md @@ -0,0 +1,16 @@ +# nano + +![nano](https://1.bp.blogspot.com/-goa_eXx1McA/WEhvoSdfDSI/AAAAAAAB_bM/XdstcXe_eKkQxuYcNI5cTySTVo3xZxaeQCEw/s640/IMG_20161207_101051.jpg) +=== + +A 2x4 mini switch pad built using 6mm x 6mm tactile switches and a Pro Micro. [More info here.](http://www.40percent.club/2016/12/nano-tmk.html) + +Keyboard Maintainer: QMK Community +Hardware Supported: Pro Micro ATmega32U4 +Hardware Availability: [PCB Files](https://github.com/di0ib/tmk_keyboard/tree/master/keyboard/nano/pcb) + +Make example for this keyboard (after setting up your build environment): + + make 40percentclub/nano:default + +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). diff --git a/keyboards/nano/rules.mk b/keyboards/40percentclub/nano/rules.mk similarity index 100% rename from keyboards/nano/rules.mk rename to keyboards/40percentclub/nano/rules.mk diff --git a/keyboards/40percentclub/readme.md b/keyboards/40percentclub/readme.md new file mode 100644 index 000000000..a8dd0e84f --- /dev/null +++ b/keyboards/40percentclub/readme.md @@ -0,0 +1,4 @@ +# 40% Keyboards + +Website: [40percent.club](http://www.40percent.club/) +The original TMK firmware: [repo](https://github.com/di0ib/tmk_keyboard/tree/master/keyboard/) diff --git a/keyboards/tomato/config.h b/keyboards/40percentclub/tomato/config.h similarity index 100% rename from keyboards/tomato/config.h rename to keyboards/40percentclub/tomato/config.h diff --git a/keyboards/tomato/info.json b/keyboards/40percentclub/tomato/info.json similarity index 100% rename from keyboards/tomato/info.json rename to keyboards/40percentclub/tomato/info.json diff --git a/keyboards/tomato/keymaps/default/keymap.c b/keyboards/40percentclub/tomato/keymaps/default/keymap.c similarity index 100% rename from keyboards/tomato/keymaps/default/keymap.c rename to keyboards/40percentclub/tomato/keymaps/default/keymap.c diff --git a/keyboards/tomato/readme.md b/keyboards/40percentclub/tomato/readme.md similarity index 56% rename from keyboards/tomato/readme.md rename to keyboards/40percentclub/tomato/readme.md index e3851f18c..f93105ffd 100644 --- a/keyboards/tomato/readme.md +++ b/keyboards/40percentclub/tomato/readme.md @@ -1,4 +1,6 @@ -Tomato +# Tomato + +![Tomato](https://2.bp.blogspot.com/-k6lyvfZz2WA/WXYyr508D7I/AAAAAAACB8A/UCNP2WCfvWAT8UWsCDICMRXwip5tAZsOwCLcBGAs/s640/a.JPG) === A 30 key keyboard with programmable rgb backlighting. @@ -12,9 +14,9 @@ Hardware Availability: [Gherkin project on 40% Keyboards](http://www.40percent.c Make example for this keyboard (after setting up your build environment): - make tomato:default + make 40percentclub/tomato:default -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. +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). First pass at adding support for the tomato keyboard. Completely untested. Intended to kick-start development. diff --git a/keyboards/tomato/rules.mk b/keyboards/40percentclub/tomato/rules.mk similarity index 100% rename from keyboards/tomato/rules.mk rename to keyboards/40percentclub/tomato/rules.mk diff --git a/keyboards/tomato/tomato.c b/keyboards/40percentclub/tomato/tomato.c similarity index 100% rename from keyboards/tomato/tomato.c rename to keyboards/40percentclub/tomato/tomato.c diff --git a/keyboards/tomato/tomato.h b/keyboards/40percentclub/tomato/tomato.h similarity index 100% rename from keyboards/tomato/tomato.h rename to keyboards/40percentclub/tomato/tomato.h diff --git a/keyboards/ut47/LED_controls.ino b/keyboards/40percentclub/ut47/LED_controls.ino similarity index 100% rename from keyboards/ut47/LED_controls.ino rename to keyboards/40percentclub/ut47/LED_controls.ino diff --git a/keyboards/ut47/config.h b/keyboards/40percentclub/ut47/config.h similarity index 100% rename from keyboards/ut47/config.h rename to keyboards/40percentclub/ut47/config.h diff --git a/keyboards/ut47/info.json b/keyboards/40percentclub/ut47/info.json similarity index 100% rename from keyboards/ut47/info.json rename to keyboards/40percentclub/ut47/info.json diff --git a/keyboards/ut47/keymaps/default/config.h b/keyboards/40percentclub/ut47/keymaps/default/config.h similarity index 100% rename from keyboards/ut47/keymaps/default/config.h rename to keyboards/40percentclub/ut47/keymaps/default/config.h diff --git a/keyboards/ut47/keymaps/default/keymap.c b/keyboards/40percentclub/ut47/keymaps/default/keymap.c similarity index 100% rename from keyboards/ut47/keymaps/default/keymap.c rename to keyboards/40percentclub/ut47/keymaps/default/keymap.c diff --git a/keyboards/ut47/keymaps/default/readme.md b/keyboards/40percentclub/ut47/keymaps/default/readme.md similarity index 100% rename from keyboards/ut47/keymaps/default/readme.md rename to keyboards/40percentclub/ut47/keymaps/default/readme.md diff --git a/keyboards/ut47/keymaps/non-us/config.h b/keyboards/40percentclub/ut47/keymaps/non-us/config.h similarity index 100% rename from keyboards/ut47/keymaps/non-us/config.h rename to keyboards/40percentclub/ut47/keymaps/non-us/config.h diff --git a/keyboards/ut47/keymaps/non-us/keymap.c b/keyboards/40percentclub/ut47/keymaps/non-us/keymap.c similarity index 100% rename from keyboards/ut47/keymaps/non-us/keymap.c rename to keyboards/40percentclub/ut47/keymaps/non-us/keymap.c diff --git a/keyboards/ut47/keymaps/non-us/readme.md b/keyboards/40percentclub/ut47/keymaps/non-us/readme.md similarity index 100% rename from keyboards/ut47/keymaps/non-us/readme.md rename to keyboards/40percentclub/ut47/keymaps/non-us/readme.md diff --git a/keyboards/ut47/keymaps/nordic/config.h b/keyboards/40percentclub/ut47/keymaps/nordic/config.h similarity index 100% rename from keyboards/ut47/keymaps/nordic/config.h rename to keyboards/40percentclub/ut47/keymaps/nordic/config.h diff --git a/keyboards/ut47/keymaps/nordic/keymap.c b/keyboards/40percentclub/ut47/keymaps/nordic/keymap.c similarity index 100% rename from keyboards/ut47/keymaps/nordic/keymap.c rename to keyboards/40percentclub/ut47/keymaps/nordic/keymap.c diff --git a/keyboards/ut47/keymaps/nordic/readme.md b/keyboards/40percentclub/ut47/keymaps/nordic/readme.md similarity index 100% rename from keyboards/ut47/keymaps/nordic/readme.md rename to keyboards/40percentclub/ut47/keymaps/nordic/readme.md diff --git a/keyboards/ut47/keymaps/rgb/config.h b/keyboards/40percentclub/ut47/keymaps/rgb/config.h similarity index 100% rename from keyboards/ut47/keymaps/rgb/config.h rename to keyboards/40percentclub/ut47/keymaps/rgb/config.h diff --git a/keyboards/ut47/keymaps/rgb/keymap.c b/keyboards/40percentclub/ut47/keymaps/rgb/keymap.c similarity index 100% rename from keyboards/ut47/keymaps/rgb/keymap.c rename to keyboards/40percentclub/ut47/keymaps/rgb/keymap.c diff --git a/keyboards/ut47/keymaps/rgb/readme.md b/keyboards/40percentclub/ut47/keymaps/rgb/readme.md similarity index 100% rename from keyboards/ut47/keymaps/rgb/readme.md rename to keyboards/40percentclub/ut47/keymaps/rgb/readme.md diff --git a/keyboards/ut47/keymaps/rgb/rules.mk b/keyboards/40percentclub/ut47/keymaps/rgb/rules.mk similarity index 100% rename from keyboards/ut47/keymaps/rgb/rules.mk rename to keyboards/40percentclub/ut47/keymaps/rgb/rules.mk diff --git a/keyboards/ut47/led.c b/keyboards/40percentclub/ut47/led.c similarity index 100% rename from keyboards/ut47/led.c rename to keyboards/40percentclub/ut47/led.c diff --git a/keyboards/ut47/matrix.c b/keyboards/40percentclub/ut47/matrix.c similarity index 100% rename from keyboards/ut47/matrix.c rename to keyboards/40percentclub/ut47/matrix.c diff --git a/keyboards/ut47/readme.md b/keyboards/40percentclub/ut47/readme.md similarity index 92% rename from keyboards/ut47/readme.md rename to keyboards/40percentclub/ut47/readme.md index 244bbd1de..bbae1384a 100644 --- a/keyboards/ut47/readme.md +++ b/keyboards/40percentclub/ut47/readme.md @@ -1,6 +1,7 @@ # ut47 ![ut47](https://i.imgur.com/ZDKZQaj.jpg) +=== Somewhere between ortholinear and standard offset. Created to have all the same functions on a Planck in a keyboard but with a more conventional keyboard row stagger. @@ -12,15 +13,15 @@ Hardware Availability: [How to order](http://www.40percent.club/2017/03/ordering To flash the UT47 without LEDs (single controller), run: - make ut47:default + make 40percentclub/ut47:default To enable the UT47 LEDs (dual controller), run this for the main controller: - make ut47:default LED_ENABLE=yes + make 40percentclub/ut47:default LED_ENABLE=yes Or you can add `LED_ENABLE = yes` to *rules.mk* -And then flash [LED_controls.ino](LED_controls.ino) to the second controller using [Arduino IDE](https://www.arduino.cc/en/Main/Software) or similar. NOTE: Arduino IDE will require importing additional libraries to compile. +And then flash [LED_controls.ino](LED_controls.ino) to the second controller using [Arduino IDE](https://www.arduino.cc/en/Main/Software) or similar. NOTE: Arduino IDE will require importing additional libraries to compile. The reason this is an "opt-in" feature is to prevent sending serial communication over the pin, in case it ends up being used for something else (like RGB underglow). diff --git a/keyboards/ut47/rules.mk b/keyboards/40percentclub/ut47/rules.mk similarity index 100% rename from keyboards/ut47/rules.mk rename to keyboards/40percentclub/ut47/rules.mk diff --git a/keyboards/ut47/ut47.c b/keyboards/40percentclub/ut47/ut47.c similarity index 100% rename from keyboards/ut47/ut47.c rename to keyboards/40percentclub/ut47/ut47.c diff --git a/keyboards/ut47/ut47.h b/keyboards/40percentclub/ut47/ut47.h similarity index 100% rename from keyboards/ut47/ut47.h rename to keyboards/40percentclub/ut47/ut47.h diff --git a/keyboards/mf68/README.md b/keyboards/mf68/README.md deleted file mode 100644 index 7dd3a900a..000000000 --- a/keyboards/mf68/README.md +++ /dev/null @@ -1,18 +0,0 @@ -MF68 -==== - -Magicforce 68 with [replacement PCB](https://github.com/di0ib/tmk_keyboard/tree/master/keyboard/mf68) designed by [di0ib](https://github.com/di0ib). - -Keyboard Maintainer: [di0ib](http://www.40percent.club) -Hardware Supported: Pro Micro -Hardware Availability: [PCB files](https://github.com/di0ib/tmk_keyboard/tree/master/keyboard/mf68/pcb) - -Make example for this keyboard (after setting up your build environment): - - make mf68:default - -Example of flashing this keyboard: - - make mf68:default:avrdude - -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. diff --git a/keyboards/nano/readme.md b/keyboards/nano/readme.md deleted file mode 100644 index e8278e340..000000000 --- a/keyboards/nano/readme.md +++ /dev/null @@ -1,14 +0,0 @@ -Nano -==== - -A 2x4 mini switch pad built using 6mm x 6mm tactile switches and a Pro Micro. [More info here.](http://www.40percent.club/2016/12/nano-tmk.html) - -Keyboard Maintainer: [di0ib](https://github.com/di0ib) -Hardware Supported: Pro Micro ATmega32U4 -Hardware Availability: [PCB Files](https://github.com/di0ib/tmk_keyboard/tree/master/keyboard/nano/pcb) - -Make example for this keyboard (after setting up your build environment): - - make nano:default - -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. From fa2183a64a1f8619f0b0ce9b8087732eaaa154bf Mon Sep 17 00:00:00 2001 From: dlgoodr Date: Thu, 8 Nov 2018 19:01:16 -0600 Subject: [PATCH 486/788] Keymap: dlg's tada68 keymap (#4289) * dlg's keymap * fix list order * remove cruft * pragma Co-Authored-By: dlgoodr * turn on bootmagic, enable swapping ` and Esc while I figure out which compromise is least bad --- keyboards/tada68/keymaps/dlg/config.h | 3 + keyboards/tada68/keymaps/dlg/keymap.c | 76 ++++++++++++++++++++++++++ keyboards/tada68/keymaps/dlg/readme.md | 54 ++++++++++++++++++ keyboards/tada68/keymaps/dlg/rules.mk | 17 ++++++ 4 files changed, 150 insertions(+) create mode 100644 keyboards/tada68/keymaps/dlg/config.h create mode 100755 keyboards/tada68/keymaps/dlg/keymap.c create mode 100755 keyboards/tada68/keymaps/dlg/readme.md create mode 100644 keyboards/tada68/keymaps/dlg/rules.mk diff --git a/keyboards/tada68/keymaps/dlg/config.h b/keyboards/tada68/keymaps/dlg/config.h new file mode 100644 index 000000000..e1a6eb1a2 --- /dev/null +++ b/keyboards/tada68/keymaps/dlg/config.h @@ -0,0 +1,3 @@ +#pragma once + +#define GRAVE_ESC_ALT_OVERRIDE diff --git a/keyboards/tada68/keymaps/dlg/keymap.c b/keyboards/tada68/keymaps/dlg/keymap.c new file mode 100755 index 000000000..9cd6cb2f1 --- /dev/null +++ b/keyboards/tada68/keymaps/dlg/keymap.c @@ -0,0 +1,76 @@ +#include QMK_KEYBOARD_H + +#define _BL 0 +#define _FL 1 +#define _MAC 2 + +// investigate later - use lctl / lsft as up/down. +// https://github.com/qmk/qmk_firmware/tree/master/keyboards/tada68/keymaps/fakb +#define LCTL_MA LCTL_T(KC_UP) +#define LSFT_MA LSFT_T(KC_DOWN) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Keymap _BL: (Base Layer) Default Layer + * ,----------------------------------------------------------------. + * |Esc | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp |~ ` | + * |----------------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ |Del | + * |----------------------------------------------------------------| + * |Ctrl | A| S| D| F| G| H| J| K| L| ;| '|Return |PgUp| + * |----------------------------------------------------------------| + * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | Up|PgDn| + * |----------------------------------------------------------------| + * |Ctrl|Win |Alt | Space |Alt|Fn |Ctrl|Lef|Dow|Rig | + * `----------------------------------------------------------------' + * + * Note: Shift + Esc = ~ + * Win + Esc = ` + */ +[_BL] = LAYOUT_ansi( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_GRV, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL , \ + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP, \ + KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, KC_UP, KC_PGDN, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FL), KC_RCTRL, KC_LEFT, KC_DOWN, KC_RGHT), + + /* Keymap _FL: Function Layer + * ,----------------------------------------------------------------. + * |`swp|F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12| Del |`swp| + * |----------------------------------------------------------------| + * | |BL |BL-|BL+|Brt| | | |mac| |PSc| | | |Ins | + * |----------------------------------------------------------------| + * | | | | | | |<- |Dn |Up | ->| | | |Hme | + * |----------------------------------------------------------------| + * | | | | | | | |MUT|V- |V+ | | |PUp|End | + * |----------------------------------------------------------------| + * | | | | | | | |Hme|PDn|End | + * `----------------------------------------------------------------' + */ +[_FL] = LAYOUT_ansi( + MAGIC_UNSWAP_GRAVE_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, MAGIC_SWAP_GRAVE_ESC, \ + _______, BL_TOGG, BL_DEC, BL_INC , BL_BRTG, _______, _______, _______, TG(_MAC),_______, KC_PSCR, _______, _______, _______, KC_INS, \ + _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, _______, _______, _______, KC_HOME, \ + _______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, KC_PGUP, KC_END , \ + _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_END ), + + /* Keymap _MAC: Mac Layer + * ,----------------------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |----------------------------------------------------------------| + * | | | | | | | | | | | | | | | | + * |----------------------------------------------------------------| + * | | | | | | | | | | | | | | | + * |----------------------------------------------------------------| + * | | | | | | | | | | | | | | | + * |----------------------------------------------------------------| + * |Ctrl|Alt |Win | |Win | |Alt| | | | + * `----------------------------------------------------------------' + */ +[_MAC] = LAYOUT_ansi( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + KC_LCTL, KC_LALT, KC_LGUI, _______, KC_RGUI, _______, KC_RALT, _______, _______, _______), + +}; diff --git a/keyboards/tada68/keymaps/dlg/readme.md b/keyboards/tada68/keymaps/dlg/readme.md new file mode 100755 index 000000000..1f1ae1867 --- /dev/null +++ b/keyboards/tada68/keymaps/dlg/readme.md @@ -0,0 +1,54 @@ +# dlg's layout + +[tshack's layout](https://github.com/qmk/qmk_firmware/tree/master/keyboards/tada68/keymaps/tshack), with: + + Mac layer + + Press Fn-I to align the bottom row to mac standards + + volume controls moved to Fn+ M<> + + [Space Cadet Shift](https://docs.qmk.fm/#/feature_space_cadet_shift) enabled + + Fn+R for LED breathing + + Fn+Del for Insert + + `GRAVE_ESC_ALT_OVERRIDE` so cmd-opt-esc still works (thx [mattdicarlo](https://github.com/qmk/qmk_firmware/tree/master/keyboards/tada68/keymaps/mattdicarlo)) + +``` + Base Layer +,----------------------------------------------------------------. +|Esc | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp |~ ` | +|----------------------------------------------------------------| +|Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ |Del | +|----------------------------------------------------------------| +|Ctrl | A| S| D| F| G| H| J| K| L| ;| '|Return |PgUp| +|----------------------------------------------------------------| +|Shift | Z| X| C| V| B| N| M| ,| .| /|Shift |Up |PgDn| +|----------------------------------------------------------------| +|Ctrl|Win |Alt | Space |Alt|Fn |Ctrl|<- |Dn | -> | +`----------------------------------------------------------------' +Note: Shift + Esc = ~ (tilde) + Win + Esc = ` (grave) + + + Fn Layer +,----------------------------------------------------------------. +| |F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12| Del | | +|----------------------------------------------------------------| +| |BL |BL-|BL+|Brt| | | |mac| |PSc| | | |Ins | +|----------------------------------------------------------------| +| | | | | | |<- |Dn |Up | ->| | | |Hme | +|----------------------------------------------------------------| +| | | | | | | |MUT|V- |V+ | | |PUp|End | +|----------------------------------------------------------------| +| | | | | | | |Hme|PDn|End | +`----------------------------------------------------------------' + +Mac Layer +,----------------------------------------------------------------. +| | | | | | | | | | | | | | | | +|----------------------------------------------------------------| +| | | | | | | | | | | | | | | | +|----------------------------------------------------------------| +| | | | | | | | | | | | | | | +|----------------------------------------------------------------| +| | | | | | | | | | | | | | | +|----------------------------------------------------------------| +|Ctrl|Alt |Win | |Win | |Alt| | | | +`----------------------------------------------------------------' +``` diff --git a/keyboards/tada68/keymaps/dlg/rules.mk b/keyboards/tada68/keymaps/dlg/rules.mk new file mode 100644 index 000000000..2e0f1a661 --- /dev/null +++ b/keyboards/tada68/keymaps/dlg/rules.mk @@ -0,0 +1,17 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = full # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend From 6ae409dd55133e25e103aa974080ce127790357f Mon Sep 17 00:00:00 2001 From: Jason Thigpen Date: Fri, 9 Nov 2018 08:49:29 -0800 Subject: [PATCH 487/788] Add my new ANSI layout dz60 setup (#4397) * minor additions to alps64 and dz60 * Rename crd keymap to represent 2u lshift layout * Add crd's new ANSI layout dz60 with preferred layers --- keyboards/alps64/keymaps/crd/keymap.c | 6 ++-- .../keymaps/{crd => crd_2u_lshift}/keymap.c | 30 +++++++++---------- keyboards/dz60/keymaps/crd_ansi/keymap.c | 25 ++++++++++++++++ 3 files changed, 43 insertions(+), 18 deletions(-) rename keyboards/dz60/keymaps/{crd => crd_2u_lshift}/keymap.c (80%) create mode 100644 keyboards/dz60/keymaps/crd_ansi/keymap.c diff --git a/keyboards/alps64/keymaps/crd/keymap.c b/keyboards/alps64/keymaps/crd/keymap.c index 4f3ea446e..815e6ddf4 100644 --- a/keyboards/alps64/keymaps/crd/keymap.c +++ b/keyboards/alps64/keymaps/crd/keymap.c @@ -11,7 +11,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), /* 1: fn1 */ LAYOUT_all( - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_DEL, + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_DEL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_END, KC_PGDOWN, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, @@ -19,8 +19,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), /* 2: fn2 */ LAYOUT_all( - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, RESET, _______, _______, _______, _______, _______, KC_VOLD, KC_MUTE, KC_VOLU, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET, + _______, _______, _______, _______, RESET, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, _______, DEBUG, _______, _______, _______, _______, _______, _______, KC_SCROLLLOCK, KC_PAUSE, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ diff --git a/keyboards/dz60/keymaps/crd/keymap.c b/keyboards/dz60/keymaps/crd_2u_lshift/keymap.c similarity index 80% rename from keyboards/dz60/keymaps/crd/keymap.c rename to keyboards/dz60/keymaps/crd_2u_lshift/keymap.c index 148b03b99..4d2ca279c 100644 --- a/keyboards/dz60/keymaps/crd/keymap.c +++ b/keyboards/dz60/keymaps/crd_2u_lshift/keymap.c @@ -10,7 +10,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |-----------------------------------------------------------------------------------------+ * | Ctrl/Esc| A | S | D | F | G | H | J | K | L | ; | ' | Enter | * |-----------------------------------------------------------------------------------------+ - * | Shift | Z | X | C | V | B | N | M | , | . | / | RSh | U | DEL | + * | Shift | Z | X | C | V | B | N | M | , | . | / |Home | U | End | * |-----------------------------------------------------------------------------------------+ * | FN1 | Alt | Cmd | Space | Cmd | FN2 | L | D | R | * `-----------------------------------------------------------------------------------------' @@ -20,17 +20,17 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, _______, KC_BSPC, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_DEL, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_HOME, KC_UP, KC_END, MO(1), KC_LALT, KC_LGUI, KC_SPC, KC_SPC, KC_SPC, KC_RGUI, MO(2), KC_LEFT, KC_DOWN, KC_RIGHT ), /* FN1 Layer * ,-----------------------------------------------------------------------------------------. - * | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | | + * | Esc | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | Del | * |-----------------------------------------------------------------------------------------+ - * | | | | | | | | | | | | | | | + * | | | | | | | | | | | | Home | PgUp | | * |-----------------------------------------------------------------------------------------+ - * | | | | | | | L | D | U | R | | | | + * | | | | | | | L | D | U | R | End | PgDn| | * |-----------------------------------------------------------------------------------------+ * | | | | | | | | | | | | |PgUp | | * |-----------------------------------------------------------------------------------------+ @@ -39,10 +39,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ LAYOUT_directional( - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, _______, + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_DEL, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, _______, + _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_END, KC_PGDOWN, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDOWN, KC_END ), @@ -50,9 +50,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * ,-----------------------------------------------------------------------------------------. * | | | | | | | | | | | | | | RESET | * |-----------------------------------------------------------------------------------------+ - * | |RBB T|RGB M| Hue+| Hue-| Sat+| Sat-| Val+| Val-| | | | | | + * | |RBB T|RGB M| Hue+| Hue-| Sat+| Sat-| Val+| Val-| |Mute | Vol- | Vol+ | | * |-----------------------------------------------------------------------------------------+ - * | | | | | | | | | | | | | | + * | | | | | | | | | | |Bri- |Bri+ | | * |-----------------------------------------------------------------------------------------+ * | | | | | | | | | | | |Pl/Ps|Vol+ |Mute | * |-----------------------------------------------------------------------------------------+ @@ -61,10 +61,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ LAYOUT_directional( - KC_SLEP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET, - _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_VOLU, KC_MUTE, + KC_SLEP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET, + _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, + _______, _______, _______, DEBUG, _______, _______, _______, _______, _______, _______, KC_SCROLLLOCK, KC_PAUSE, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT ), }; diff --git a/keyboards/dz60/keymaps/crd_ansi/keymap.c b/keyboards/dz60/keymaps/crd_ansi/keymap.c new file mode 100644 index 000000000..eac0f1e84 --- /dev/null +++ b/keyboards/dz60/keymaps/crd_ansi/keymap.c @@ -0,0 +1,25 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + LAYOUT_60_ansi( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, + CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, RSFT_T(KC_UP), + MO(1), KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, RGUI_T(KC_LEFT), RALT_T(KC_DOWN), LT(2, KC_RIGHT) + ), + LAYOUT_60_ansi( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, _______, + _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_END, KC_PGDN, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______ + ), + LAYOUT_60_ansi( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET, + _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_SCROLLLOCK, KC_PAUSE, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______ + ) +}; From 519ce723fb5e8e7272ee08f611d2c15e40bb2969 Mon Sep 17 00:00:00 2001 From: mcmadhatter Date: Fri, 9 Nov 2018 19:16:08 +0000 Subject: [PATCH 488/788] Added support for backlight on diverge3 , and added a UK iso layout (#4392) * Added support for backlight , and a UK iso layout Added support for backlight , and a UK iso layout. Now uses the SPLIT_KEYBOARD #define rather than relying on lets split * Update keyboards/diverge3/keymaps/isoUK/keymap.c Co-Authored-By: mcmadhatter * Update keyboards/diverge3/keymaps/isoUK/keymap.c Co-Authored-By: mcmadhatter * Simplified the lower layer Simplified the lower layer * dir rename to snake case dir rename to snake case * changed dir case changed dir case * Update keyboards/diverge3/rules.mk Co-Authored-By: mcmadhatter * Update keyboards/diverge3/keymaps/iso_uk/config.h Co-Authored-By: mcmadhatter * Update keyboards/diverge3/config.h Co-Authored-By: mcmadhatter * Update keyboards/diverge3/keymaps/iso_uk/keymap.c Co-Authored-By: mcmadhatter * Update keyboards/diverge3/keymaps/iso_uk/keymap.c Co-Authored-By: mcmadhatter * Update keyboards/diverge3/keymaps/iso_uk/keymap.c Co-Authored-By: mcmadhatter * Update keyboards/diverge3/config.h Co-Authored-By: mcmadhatter * Update keyboards/diverge3/keymaps/iso_uk/config.h Co-Authored-By: mcmadhatter * Update keyboards/diverge3/keymaps/iso_uk/config.h Co-Authored-By: mcmadhatter * Update keyboards/diverge3/keymaps/iso_uk/config.h Co-Authored-By: mcmadhatter * aligned and tidyied up aligned and tidyied up --- keyboards/diverge3/config.h | 14 +++---- keyboards/diverge3/keymaps/iso_uk/config.h | 24 +++++++++++ keyboards/diverge3/keymaps/iso_uk/keymap.c | 45 +++++++++++++++++++++ keyboards/diverge3/keymaps/iso_uk/readme.md | 1 + keyboards/diverge3/keymaps/iso_uk/rules.mk | 1 + keyboards/diverge3/rules.mk | 10 ++--- 6 files changed, 79 insertions(+), 16 deletions(-) create mode 100755 keyboards/diverge3/keymaps/iso_uk/config.h create mode 100644 keyboards/diverge3/keymaps/iso_uk/keymap.c create mode 100755 keyboards/diverge3/keymaps/iso_uk/readme.md create mode 100755 keyboards/diverge3/keymaps/iso_uk/rules.mk diff --git a/keyboards/diverge3/config.h b/keyboards/diverge3/config.h index f3ed06739..262be7b75 100644 --- a/keyboards/diverge3/config.h +++ b/keyboards/diverge3/config.h @@ -31,10 +31,6 @@ along with this program. If not, see . /* key matrix size */ #define MATRIX_ROWS 10 #define MATRIX_COLS 8 -// Only SERIAL is currently supported -// By converting this to use I2C, backlight -// would/should be fully functional as well -#define USE_SERIAL /* * Keyboard Matrix Assignments @@ -53,9 +49,9 @@ along with this program. If not, see . /* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ #define DIODE_DIRECTION ROW2COL -// #define BACKLIGHT_PIN C6 -// #define BACKLIGHT_BREATHING -// #define BACKLIGHT_LEVELS 3 +#define BACKLIGHT_PIN C6 +#define BACKLIGHT_BREATHING +#define BACKLIGHT_LEVELS 5 /* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ @@ -63,7 +59,7 @@ along with this program. If not, see . /* 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 @@ -73,7 +69,7 @@ along with this program. If not, see . /* If defined, GRAVE_ESC will always act as ESC when CTRL is held. * This is userful for the Windows task manager shortcut (ctrl+shift+esc). */ -// #define GRAVE_ESC_CTRL_OVERRIDE + #define GRAVE_ESC_CTRL_OVERRIDE /* * Force NKRO diff --git a/keyboards/diverge3/keymaps/iso_uk/config.h b/keyboards/diverge3/keymaps/iso_uk/config.h new file mode 100755 index 000000000..83f65979c --- /dev/null +++ b/keyboards/diverge3/keymaps/iso_uk/config.h @@ -0,0 +1,24 @@ +/* Copyright 2017 IslandMan93 + * + * 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 . + */ + +#pragma once + + +// place overrides here +#define MASTER_LEFT +#define PERMISSIVE_HOLD +#define TAPPING_TERM 150 + diff --git a/keyboards/diverge3/keymaps/iso_uk/keymap.c b/keyboards/diverge3/keymaps/iso_uk/keymap.c new file mode 100644 index 000000000..804334785 --- /dev/null +++ b/keyboards/diverge3/keymaps/iso_uk/keymap.c @@ -0,0 +1,45 @@ +/* Copyright 2017 IslandMan93 + * + * 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 . + */ +#include QMK_KEYBOARD_H + + +enum layers { + _QWERTY, + _LOWER, +}; + +#define LOWER MO(_LOWER) + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_QWERTY] = LAYOUT( \ + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_MINS, KC_EQL, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, + KC_CAPS, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LCBR, KC_RCBR, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_PSCR, KC_PGUP, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_NUHS, + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_INS, KC_PGDN, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_ENT, + KC_LCTL, KC_LGUI, KC_LALT, KC_HOME, KC_END, KC_SPC, KC_SPC, LOWER, KC_QUOT, KC_SPC, KC_SPC, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT,KC_SLASH + ), + + [_LOWER] = LAYOUT( + RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11, KC_F12, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, _______, + BL_TOGG, KC_ASTG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + BL_INC, KC_ASUP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + BL_DEC, KC_ASDN, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, KC_ASRP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ) + +}; diff --git a/keyboards/diverge3/keymaps/iso_uk/readme.md b/keyboards/diverge3/keymaps/iso_uk/readme.md new file mode 100755 index 000000000..ff4971754 --- /dev/null +++ b/keyboards/diverge3/keymaps/iso_uk/readme.md @@ -0,0 +1 @@ +# My UK based diverge 3 layout diff --git a/keyboards/diverge3/keymaps/iso_uk/rules.mk b/keyboards/diverge3/keymaps/iso_uk/rules.mk new file mode 100755 index 000000000..c9383ab8d --- /dev/null +++ b/keyboards/diverge3/keymaps/iso_uk/rules.mk @@ -0,0 +1 @@ +AUTO_SHIFT_ENABLE = yes diff --git a/keyboards/diverge3/rules.mk b/keyboards/diverge3/rules.mk index 38f3ee4e6..36e8ccb47 100644 --- a/keyboards/diverge3/rules.mk +++ b/keyboards/diverge3/rules.mk @@ -1,6 +1,3 @@ -SRC += ../lets_split/matrix.c \ - ../lets_split/serial.c \ - ../lets_split/split_util.c # MCU name #MCU = at90usb1286 @@ -61,13 +58,12 @@ EXTRAKEY_ENABLE = yes # Audio control and System control(+450) CONSOLE_ENABLE = no # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. - +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. +SPLIT_KEYBOARD = yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend -CUSTOM_MATRIX = yes From d6184be67a56429a284c2d0fa5f990368a580735 Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Fri, 9 Nov 2018 12:15:37 -0800 Subject: [PATCH 489/788] IDOBO Keyboard Support (75Keys Aluminum Keyboard) (#4401) * initial commit * put my name everywhere * get the switch matrix correct * add a basic keymap * use a better LAYOUT macro * update readme * Add QMK Configurator support --- keyboards/idobo/config.h | 227 ++++++++++++++++++++++ keyboards/idobo/idobo.c | 43 ++++ keyboards/idobo/idobo.h | 44 +++++ keyboards/idobo/info.json | 12 ++ keyboards/idobo/keymaps/default/config.h | 19 ++ keyboards/idobo/keymaps/default/keymap.c | 66 +++++++ keyboards/idobo/keymaps/default/readme.md | 1 + keyboards/idobo/readme.md | 17 ++ keyboards/idobo/rules.mk | 81 ++++++++ 9 files changed, 510 insertions(+) create mode 100644 keyboards/idobo/config.h create mode 100644 keyboards/idobo/idobo.c create mode 100644 keyboards/idobo/idobo.h create mode 100644 keyboards/idobo/info.json create mode 100644 keyboards/idobo/keymaps/default/config.h create mode 100644 keyboards/idobo/keymaps/default/keymap.c create mode 100644 keyboards/idobo/keymaps/default/readme.md create mode 100644 keyboards/idobo/readme.md create mode 100644 keyboards/idobo/rules.mk diff --git a/keyboards/idobo/config.h b/keyboards/idobo/config.h new file mode 100644 index 000000000..f6b552bad --- /dev/null +++ b/keyboards/idobo/config.h @@ -0,0 +1,227 @@ +/* +Copyright 2018 MechMerlin + +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 . +*/ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0000 +#define DEVICE_VER 0x0001 +#define MANUFACTURER You +#define PRODUCT idobo +#define DESCRIPTION A custom keyboard + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 15 + +/* + * 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 { B0, B3, C7, B6, C6 } +#define MATRIX_COL_PINS { F6, F5, F4, F1, E6, D5, D3, D2, D1, D0, D4, D6, D7, B4, B5 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +#define BACKLIGHT_PIN B7 +#define BACKLIGHT_BREATHING +#define BACKLIGHT_LEVELS 3 + +#define RGB_DI_PIN F0 +#ifdef RGB_DI_PIN +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 16 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 +#endif + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* 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 userful 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 + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * 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 + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +//#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ + +/* Bootmagic Lite key configuration */ +// #define BOOTMAGIC_LITE_ROW 0 +// #define BOOTMAGIC_LITE_COLUMN 0 diff --git a/keyboards/idobo/idobo.c b/keyboards/idobo/idobo.c new file mode 100644 index 000000000..3f870835e --- /dev/null +++ b/keyboards/idobo/idobo.c @@ -0,0 +1,43 @@ +/* Copyright 2018 MechMerlin + * + * 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 . + */ +#include "idobo.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + + led_set_user(usb_led); +} diff --git a/keyboards/idobo/idobo.h b/keyboards/idobo/idobo.h new file mode 100644 index 000000000..386fcee1a --- /dev/null +++ b/keyboards/idobo/idobo.h @@ -0,0 +1,44 @@ +/* Copyright 2018 MechMerlin + * + * 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 . + */ +#ifndef IDOBO_H +#define IDOBO_H + +#include "quantum.h" + +/* This a shortcut to help you visually see your layout. + * + * The first section contains all of the arguments representing the physical + * layout of the board and position of the keys. + * + * The second converts the arguments into a two-dimensional array which + * represents the switch matrix. + */ +#define LAYOUT_ortho_5x15( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, \ + K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4D, K4E \ +) \ +{ \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E }, \ + { K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4D, K4E }, \ +} + +#endif diff --git a/keyboards/idobo/info.json b/keyboards/idobo/info.json new file mode 100644 index 000000000..69c5e4e06 --- /dev/null +++ b/keyboards/idobo/info.json @@ -0,0 +1,12 @@ +{ + "keyboard_name": "IDOBO", + "url": "", + "maintainer": "qmk", + "width": 15, + "height": 5, + "layouts": { + "LAYOUT_ortho_5x15": { + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":6, "y":1}, {"x":7, "y":1}, {"x":8, "y":1}, {"x":9, "y":1}, {"x":10, "y":1}, {"x":11, "y":1}, {"x":12, "y":1}, {"x":13, "y":1}, {"x":14, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2}, {"x":5, "y":2}, {"x":6, "y":2}, {"x":7, "y":2}, {"x":8, "y":2}, {"x":9, "y":2}, {"x":10, "y":2}, {"x":11, "y":2}, {"x":12, "y":2}, {"x":13, "y":2}, {"x":14, "y":2}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":4, "y":3}, {"x":5, "y":3}, {"x":6, "y":3}, {"x":7, "y":3}, {"x":8, "y":3}, {"x":9, "y":3}, {"x":10, "y":3}, {"x":11, "y":3}, {"x":12, "y":3}, {"x":13, "y":3}, {"x":14, "y":3}, {"x":0, "y":4}, {"x":1, "y":4}, {"x":2, "y":4}, {"x":3, "y":4}, {"x":4, "y":4}, {"x":5, "y":4}, {"x":6, "y":4}, {"x":7, "y":4}, {"x":8, "y":4}, {"x":9, "y":4}, {"x":10, "y":4}, {"x":11, "y":4}, {"x":12, "y":4}, {"x":13, "y":4}, {"x":14, "y":4}] + } + } +} diff --git a/keyboards/idobo/keymaps/default/config.h b/keyboards/idobo/keymaps/default/config.h new file mode 100644 index 000000000..a3ed4f762 --- /dev/null +++ b/keyboards/idobo/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 MechMerlin + * + * 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 . + */ + +#pragma once + +// place overrides here diff --git a/keyboards/idobo/keymaps/default/keymap.c b/keyboards/idobo/keymaps/default/keymap.c new file mode 100644 index 000000000..f54e3359b --- /dev/null +++ b/keyboards/idobo/keymaps/default/keymap.c @@ -0,0 +1,66 @@ +/* Copyright 2018 MechMerlin + * + * 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 . + */ +#include QMK_KEYBOARD_H + +// Defines the keycodes used by our macros in process_record_user +enum custom_keycodes { + QMKBEST = SAFE_RANGE, + QMKURL +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_ortho_5x15( \ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, KC_DEL, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_ENT, KC_PGUP, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_RSFT, KC_UP, KC_PGDN, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RCTL, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT \ + ), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QMKBEST: + if (record->event.pressed) { + // when keycode QMKBEST is pressed + SEND_STRING("QMK is the best thing ever!"); + } else { + // when keycode QMKBEST is released + } + break; + case QMKURL: + if (record->event.pressed) { + // when keycode QMKURL is pressed + SEND_STRING("https://qmk.fm/" SS_TAP(X_ENTER)); + } else { + // when keycode QMKURL is released + } + break; + } + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/idobo/keymaps/default/readme.md b/keyboards/idobo/keymaps/default/readme.md new file mode 100644 index 000000000..577c62b51 --- /dev/null +++ b/keyboards/idobo/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for idobo diff --git a/keyboards/idobo/readme.md b/keyboards/idobo/readme.md new file mode 100644 index 000000000..7f2c68446 --- /dev/null +++ b/keyboards/idobo/readme.md @@ -0,0 +1,17 @@ +# IDOBO + +![IDOBO](imgur.com image replace me!) + +75Keys Aluminum Mechanical Keyboard. + +Firmware here originally appeared on qmkeyboard.cn + +Keyboard Maintainer: [MechMerlin](https://github.com/mechmerlin) +Hardware Supported: IDOBO PCB +Hardware Availability: [IDOBO on Massdrop](https://www.massdrop.com/buy/xd75-aluminum-mechanical-keyboard) + +Make example for this keyboard (after setting up your build environment): + + make idobo:default + +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). diff --git a/keyboards/idobo/rules.mk b/keyboards/idobo/rules.mk new file mode 100644 index 000000000..383a3594b --- /dev/null +++ b/keyboards/idobo/rules.mk @@ -0,0 +1,81 @@ +# MCU name +#MCU = at90usb1286 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = no # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) From b3853e7d40528a2d5fbab940678ce75c70b4de6c Mon Sep 17 00:00:00 2001 From: Logan Huskins Date: Sat, 10 Nov 2018 10:21:24 -0600 Subject: [PATCH 490/788] Keymap: Add default keymap from web for 1up60hse (#4351) --- .../1up60hse/keymaps/default/config.h | 1 + .../1up60hse/keymaps/default/keymap.c | 43 +++++++++++-------- .../1up60hse/keymaps/default/readme.md | 6 +-- 3 files changed, 28 insertions(+), 22 deletions(-) diff --git a/keyboards/1upkeyboards/1up60hse/keymaps/default/config.h b/keyboards/1upkeyboards/1up60hse/keymaps/default/config.h index a3ed4f762..99a700560 100644 --- a/keyboards/1upkeyboards/1up60hse/keymaps/default/config.h +++ b/keyboards/1upkeyboards/1up60hse/keymaps/default/config.h @@ -1,4 +1,5 @@ /* Copyright 2018 MechMerlin + * Copyright 2018 Logan Huskins * * 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 diff --git a/keyboards/1upkeyboards/1up60hse/keymaps/default/keymap.c b/keyboards/1upkeyboards/1up60hse/keymaps/default/keymap.c index 556246a3b..1c168abf7 100644 --- a/keyboards/1upkeyboards/1up60hse/keymaps/default/keymap.c +++ b/keyboards/1upkeyboards/1up60hse/keymaps/default/keymap.c @@ -1,4 +1,5 @@ /* Copyright 2018 MechMerlin + * Copyright 2018 Logan Huskins * * 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 @@ -17,28 +18,34 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT_60_ansi( - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, - MO(1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, - KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(2), KC_RGUI, KC_RCTL), + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, + KC_EQL, KC_BSPC, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, + KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, + KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, + KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, + KC_RALT, KC_RGUI, MO(1), KC_LCTL + ), - [1] = LAYOUT_60_ansi( - KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, - KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + [1] = LAYOUT_60_ansi( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, + KC_F11, KC_F12, KC_DEL, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, + KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, KC_HOME, KC_PGUP, KC_TRNS, + KC_TRNS, KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, + KC_PGDN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(2), KC_TRNS, KC_TRNS + ), [2] = LAYOUT_60_ansi( - RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, BL_STEP, BL_DEC, BL_INC, BL_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, RGB_VAD, RGB_VAI, RGB_SAI, RGB_HUD, RGB_HUI, RGB_MOD, RGB_TOG, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, RESET, BL_TOGG, BL_INC, BL_DEC, BL_STEP, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI, + RGB_SAI, RGB_VAI, RGB_SPI, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RGB_RMOD, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD, RGB_M_SN, RGB_M_K, RGB_M_X, RGB_M_G, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), }; -bool process_record_user(uint16_t keycode, keyrecord_t *record) { +bool process_record_user(uint16_t keycode, keyrecord_t *record) +{ return true; } - diff --git a/keyboards/1upkeyboards/1up60hse/keymaps/default/readme.md b/keyboards/1upkeyboards/1up60hse/keymaps/default/readme.md index a9afa5ea6..a7041f37b 100644 --- a/keyboards/1upkeyboards/1up60hse/keymaps/default/readme.md +++ b/keyboards/1upkeyboards/1up60hse/keymaps/default/readme.md @@ -1,6 +1,4 @@ -# 1up60hse default keymap +# 1up60hse default keymap generated by QMK Configurator -This is the default keymap provided by [1upkeyboards](https://www.1upkeyboards.com). +This is the keymap used by [QMK Configurator](https://config.qmk.fm/#/1upkeyboards/1up60hse/LAYOUT_60_ansi) as default. -## Notes -- Software reset key is located on `Esc` on the third layer. From 3ba242cc3f5db93b14f0939f056e9aa759a43efe Mon Sep 17 00:00:00 2001 From: gorbachev Date: Sat, 10 Nov 2018 11:22:36 -0500 Subject: [PATCH 491/788] Keymap for random key presses for the scrabblepad (#4356) * Random key presses for scrabblepad * Fix keymap code comments * Remove unused methods as per code review --- keyboards/scrabblepad/keymaps/random/keymap.c | 75 +++++++++++++++++++ .../scrabblepad/keymaps/random/readme.md | 5 ++ 2 files changed, 80 insertions(+) create mode 100644 keyboards/scrabblepad/keymaps/random/keymap.c create mode 100644 keyboards/scrabblepad/keymaps/random/readme.md diff --git a/keyboards/scrabblepad/keymaps/random/keymap.c b/keyboards/scrabblepad/keymaps/random/keymap.c new file mode 100644 index 000000000..8e7825966 --- /dev/null +++ b/keyboards/scrabblepad/keymaps/random/keymap.c @@ -0,0 +1,75 @@ +#include "scrabblepad.h" +#include + +static uint16_t keystroke; +static bool shift_pressed; + +static int lower = (int) KC_A; +static int upper = (int) KC_Z; + +uint16_t random_keycode(void) { + return lower + (rand() % (upper - lower + 1)); +}; + +enum custom_keycodes { + RND_KEY = SAFE_RANGE +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch(keycode) { + case RND_KEY: + if (record->event.pressed) { + keystroke = random_keycode(); + if (rand() % 2 > 0) { + shift_pressed = 1; + register_code(KC_LSHIFT); + } + register_code(keystroke); + } else { + if (shift_pressed > 0) { + unregister_code(KC_LSHIFT); + } + unregister_code(keystroke); + } + + return false; + + default: + return true; + } + + return true; +} + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = LAYOUT( /* Base */ + RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, \ + RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, \ + RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, \ + RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, \ + RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, \ + RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, \ + RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, \ + RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RESET, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, \ + RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, \ + RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, \ + RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, \ + RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, \ + RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, \ + RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, \ + RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY +), +}; + + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/scrabblepad/keymaps/random/readme.md b/keyboards/scrabblepad/keymaps/random/readme.md new file mode 100644 index 000000000..e719adaeb --- /dev/null +++ b/keyboards/scrabblepad/keymaps/random/readme.md @@ -0,0 +1,5 @@ +# Scrabblepad keymap with every key press random + +Every key produces a random key press, except the middle key, which is reserved for resetting the board. + +The random key press is selected between KC_A and KC_Z keycodes. From 408361402385ea938575956e9368b5f373edc629 Mon Sep 17 00:00:00 2001 From: yiancar Date: Sat, 10 Nov 2018 12:26:39 -0800 Subject: [PATCH 492/788] I2C driver docs (#4298) * I2C driver docs - Added I2C driver docs. - Changed arm master i2c driver to have a weak i2c_init as it is impossible to account for all possible port configuration in the STM32 world. * Update docs/i2c_driver.md Co-Authored-By: yiancar * Update docs/i2c_driver.md Co-Authored-By: yiancar * Update docs/i2c_driver.md Co-Authored-By: yiancar * Update docs/i2c_driver.md Co-Authored-By: yiancar * GPIO release fix --- docs/_sidebar.md | 1 + docs/_summary.md | 1 + docs/i2c_driver.md | 83 ++++++++++++++++++++++++++++++++++++++++ drivers/arm/i2c_master.c | 5 ++- 4 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 docs/i2c_driver.md diff --git a/docs/_sidebar.md b/docs/_sidebar.md index 2c5738012..67e81422a 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -79,6 +79,7 @@ * [Hand Wiring Guide](hand_wire.md) * [ISP Flashing Guide](isp_flashing_guide.md) * [ARM Debugging Guide](arm_debugging.md) + * [I2C Driver](i2c_driver.md) * For a Deeper Understanding * [How Keyboards Work](how_keyboards_work.md) diff --git a/docs/_summary.md b/docs/_summary.md index 2c5738012..67e81422a 100644 --- a/docs/_summary.md +++ b/docs/_summary.md @@ -79,6 +79,7 @@ * [Hand Wiring Guide](hand_wire.md) * [ISP Flashing Guide](isp_flashing_guide.md) * [ARM Debugging Guide](arm_debugging.md) + * [I2C Driver](i2c_driver.md) * For a Deeper Understanding * [How Keyboards Work](how_keyboards_work.md) diff --git a/docs/i2c_driver.md b/docs/i2c_driver.md new file mode 100644 index 000000000..f69eb5a9d --- /dev/null +++ b/docs/i2c_driver.md @@ -0,0 +1,83 @@ +# I2C Master Driver + +The I2C Master drivers used in QMK have a set of common functions to allow portability between MCUs. + +## Available functions + +|Function |Description | +|------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +|`void i2c_init(void);` |Initializes the I2C driver. This function should be called once before any transaction is initiated. | +|`uint8_t i2c_start(uint8_t address);` |Starts an I2C transaction. Address is the 7-bit slave address without the direction bit. | +|`uint8_t i2c_transmit(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);` |Transmit data over I2C. Address is the 7-bit slave address without the direction. | +|`uint8_t i2c_transmit(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);` |Transmit data over I2C. Address is the 7-bit slave address without the direction. Returns status of transaction. | +|`uint8_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);` |Receive data over I2C. Address is the 7-bit slave address without the direction. Saves number of bytes specified by `length` in `data` array. Returns status of transaction. | +|`uint8_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout);` |Same as the `i2c_transmit` function but `regaddr` sets where in the slave the data will be written. | +|`uint8_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout);` |Same as the `i2c_receive` function but `regaddr` sets from where in the slave the data will be read. | +|`uint8_t i2c_stop(uint16_t timeout);` |Stops the I2C driver. | + +### Function Return + +All the above functions, except `void i2c_init(void);` return the following truth table: + +|Return Value |Description | +|---------------|---------------------------------------------------| +|0 |Operation executed successfully. | +|-1 |Operation failed. | +|-2 |Operation timed out. | + + +## AVR + +### Configuration + +The following defines can be used to configure the I2C master driver. + +|Variable |Description |Default| +|------------------|---------------------------------------------------|-------| +|`#F_SCL` |Clock frequency in Hz |400KHz | +|`#Prescaler` |Divides master clock to aid in I2C clock selection |1 | + +AVRs usually have set GPIO which turn into I2C pins, therefore no further configuration is required. + +## ARM + +For ARM the Chibios I2C HAL driver is under the hood. +This section assumes an STM32 MCU. + +### Configuration + +The configuration for ARM MCUs can be quite complex as often there are multiple I2C drivers which can be assigned to a variety of ports. + +Firstly the `mcuconf.h` file must be setup to enable the necessary hardware drivers. + +|Variable |Description |Default| +|------------------------------|------------------------------------------------------------------------------------|-------| +|`#STM32_I2C_USE_XXX` |Enable/Disable the hardware driver XXX (each driver should be explicitly listed) |FALSE | +|`#STM32_I2C_BUSY_TIMEOUT` |Time in ms until the I2C command is aborted if no response is received |50 | +|`#STM32_I2C_XXX_IRQ_PRIORITY` |Interrupt priority for hardware driver XXX (THIS IS AN EXPERT SETTING) |10 | +|`#STM32_I2C_USE_DMA` |Enable/Disable the ability of the MCU to offload the data transfer to the DMA unit |TRUE | +|`#STM32_I2C_XXX_DMA_PRIORITY` |Priority of DMA unit for hardware driver XXX (THIS IS AN EXPERT SETTING) |1 | + +Secondly, in the `halconf.h` file, `#define HAL_USE_I2C` must be set to `TRUE`. This allows ChibiOS to load its I2C driver. + +Lastly, we need to assign the correct GPIO pins depending on the I2C hardware driver we want to use. + +By default the I2C1 hardware driver is assumed to be used. If another hardware driver is used, `#define I2C_DRIVER I2CDX` should be added to the `config.h` file with X being the number of hardware driver used. For example is I2C3 is enabled, the `config.h` file should contain `#define I2C_DRIVER I2CD3`. This aligns the QMK I2C driver with the Chibios I2C driver. + +STM32 MCUs allows a variety of pins to be configured as I2C pins depending on the hardware driver used. By default B6 and B7 are set to I2C. + +This can be changed by declaring the `i2c_init` function which intentionally has a weak attribute. Please consult the datasheet of your MCU for the available GPIO configurations. The following is an example initialization function: + +```C +void i2c_init(void) +{ + setPinInput(B6); // Try releasing special pins for a short time + setPinInput(B7); + chThdSleepMilliseconds(10); // Wait for the release to happen + + palSetPadMode(GPIOB, 6, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUPDR_PULLUP); // Set B6 to I2C function + palSetPadMode(GPIOB, 7, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUPDR_PULLUP); // Set B7 to I2C function +} +``` + + diff --git a/drivers/arm/i2c_master.c b/drivers/arm/i2c_master.c index 2a7badd35..de5843839 100644 --- a/drivers/arm/i2c_master.c +++ b/drivers/arm/i2c_master.c @@ -26,6 +26,7 @@ */ #include "i2c_master.h" +#include "quantum.h" #include #include @@ -41,9 +42,11 @@ static const I2CConfig i2cconfig = { 0 }; +__attribute__ ((weak)) void i2c_init(void) { - palSetGroupMode(GPIOB, GPIOB_PIN6 | GPIOB_PIN7, 0, PAL_MODE_INPUT); // Try releasing special pins for a short time + setPinInput(B6); // Try releasing special pins for a short time + setPinInput(B7); chThdSleepMilliseconds(10); palSetPadMode(GPIOB, 6, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUPDR_PULLUP); From 6274980e6188c6f074e51b6655afd9efa991863e Mon Sep 17 00:00:00 2001 From: Yan-Fa Li Date: Sun, 11 Nov 2018 19:54:10 -0800 Subject: [PATCH 493/788] Improve new_project script (#4373) * Improve new_project script - use git user.name if available to replace the boilerplate name in files we generate - fix shellshock warnings * Test for git repo Suggestion by @skullydazed * Fix shellshock warning * Incorporate feedback from reviewers - thanks @vomindoraan - use a heredoc instead of echo for console - factor out common paths --- util/new_project.sh | 51 ++++++++++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 15 deletions(-) diff --git a/util/new_project.sh b/util/new_project.sh index a85e83322..d1d1ed82c 100755 --- a/util/new_project.sh +++ b/util/new_project.sh @@ -14,7 +14,7 @@ elif [ -z "$KEYBOARD_TYPE" ]; then KEYBOARD_TYPE=avr fi -if [ $KEYBOARD_TYPE != "avr" -a $KEYBOARD_TYPE != "ps2avrgb" ]; then +if [ "$KEYBOARD_TYPE" != "avr" ] && [ "$KEYBOARD_TYPE" != "ps2avrgb" ]; then echo "Invalid keyboard type target" exit 1 fi @@ -24,22 +24,43 @@ if [ -e "keyboards/$1" ]; then exit 1 fi -cd "$(dirname "$0")/.." +cd "$(dirname "$0")/.." || exit -KEYBOARD_UPPERCASE=$(echo $1 | awk '{print toupper($0)}') -KEYBOARD_NAME=$(basename $1) -KEYBOARD_NAME_UPPERCASE=$(echo $KEYBOARD_NAME | awk '{print toupper($0)}') +KEYBOARD_NAME=$(basename "$1") +KEYBOARD_NAME_UPPERCASE=$(echo "$KEYBOARD_NAME" | awk '{print toupper($0)}') +NEW_KBD=keyboards/${KEYBOARD} -cp -r quantum/template/base keyboards/$KEYBOARD -cp -r quantum/template/$KEYBOARD_TYPE/. keyboards/$KEYBOARD +cp -r quantum/template/base "$NEW_KBD" +cp -r "quantum/template/$KEYBOARD_TYPE/." "$NEW_KBD" -mv keyboards/${KEYBOARD}/template.c keyboards/${KEYBOARD}/${KEYBOARD_NAME}.c -mv keyboards/${KEYBOARD}/template.h keyboards/${KEYBOARD}/${KEYBOARD_NAME}.h -find keyboards/${KEYBOARD} -type f -exec sed -i '' -e "s;%KEYBOARD%;${KEYBOARD_NAME};g" {} \; -find keyboards/${KEYBOARD} -type f -exec sed -i '' -e "s;%KEYBOARD_UPPERCASE%;${KEYBOARD_NAME_UPPERCASE};g" {} \; +mv "${NEW_KBD}/template.c" "${NEW_KBD}/${KEYBOARD_NAME}.c" +mv "${NEW_KBD}/template.h" "${NEW_KBD}/${KEYBOARD_NAME}.h" +find "${NEW_KBD}" -type f -exec sed -i '' -e "s;%KEYBOARD%;${KEYBOARD_NAME};g" {} \; +find "${NEW_KBD}" -type f -exec sed -i '' -e "s;%KEYBOARD_UPPERCASE%;${KEYBOARD_NAME_UPPERCASE};g" {} \; -echo "######################################################" -echo "# /keyboards/$KEYBOARD project created. To start" -echo "# working on things, cd into keyboards/$KEYBOARD" -echo "######################################################" +GIT=$(whereis git) +if [ "$GIT" != "" ]; then + IS_GIT_REPO=$($GIT log >>/dev/null 2>&1; echo $?) + if [ "$IS_GIT_REPO" -eq 0 ]; then + ID="'$($GIT config --get user.name)'" + echo "Using $ID as user name" + + for i in "$NEW_KBD/config.h" \ + "$NEW_KBD/$KEYBOARD_NAME.c" \ + "$NEW_KBD/$KEYBOARD_NAME.h" \ + "$NEW_KBD/keymaps/default/config.h" \ + "$NEW_KBD/keymaps/default/keymap.c" + do + awk -v id="$ID" '{sub(/REPLACE_WITH_YOUR_NAME/,id); print}' < "$i" > "$i.$$" + mv "$i.$$" "$i" + done + fi +fi + +cat <<-EOF +###################################################### +# $NEW_KBD project created. To start +# working on things, cd into $NEW_KBD +###################################################### +EOF From b49fd46eaaba5efe3231e6a1019af5c16558a057 Mon Sep 17 00:00:00 2001 From: Paco Date: Mon, 12 Nov 2018 14:58:07 -0500 Subject: [PATCH 494/788] Add support for slackware distribution (linux_install.sh) (#4369) * Add support for slackware distribution (linux_install.sh) The required packages are not provided by the official repository. The packages need to be installed from slackbuilds.org either manually or with the help of third party tools like sbotools. * Modify linux_install.sh according to code review Modifies the Slackware section of the linux_install.sh script based on the suggestions from the code review. * Modify utils/linux_install.sh according to suggestions --- util/linux_install.sh | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/util/linux_install.sh b/util/linux_install.sh index 8dc28be6e..971d4c543 100755 --- a/util/linux_install.sh +++ b/util/linux_install.sh @@ -4,6 +4,8 @@ GENTOO_WARNING="This script will make a USE change in order to ensure that that QMK works on your system. All changes will be sent to the the file /etc/portage/package.use/qmk_firmware -- please review it, and read Portage's output carefully before installing any packages on your system. You will also need to ensure that your kernel is compiled with support for the keyboard chip that you are using (e.g. enable Arduino for the Pro Micro). Further information can be found on the Gentoo wiki." +SLACKWARE_WARNING="You will need the following packages from slackbuilds.org:\n\tarm-binutils\n\tarm-gcc\n\tavr-binutils\n\tavr-gcc\n\tavr-libc\n\tavrdude\n\tdfu-programmer\n\tdfu-util\n\tnewlib\nThese packages will be installed with sudo and sboinstall, so ensure that your user is added to sudoers and that sboinstall is configured." + if grep ID /etc/os-release | grep -qE "fedora"; then sudo dnf install \ arm-none-eabi-binutils-cs \ @@ -126,6 +128,26 @@ elif grep ID /etc/os-release | grep -qE "opensuse|tumbleweed"; then wget \ zip +elif grep ID /etc/os-release | grep -q slackware; then + printf "$SLACKWARE_WARNING\n" + printf "\nProceed (y/N)? " + read -r answer + if echo "$answer" | grep -iq "^y" ;then + sudo sboinstall \ + avr-binutils \ + avr-gcc \ + avr-libc \ + avrdude \ + dfu-programmer \ + dfu-util \ + arm-binutils \ + arm-gcc \ + newlib + echo "Done!" + else + echo "Quitting..." + fi + else echo "Sorry, we don't recognize your OS. Help us by contributing support!" echo From 746005acba3a3522eaa2bf1c8014644e1a60c5df Mon Sep 17 00:00:00 2001 From: zvecr Date: Mon, 12 Nov 2018 20:00:45 +0000 Subject: [PATCH 495/788] Keyboard: Initial 25 port (#4394) * Initial 25 port * Initial 25 port - fix info.json and hand_swap_config * Review comments - fix layout macros, copyright comments, and duplicated use of layering macros --- keyboards/40percentclub/25/25.c | 60 +++++ keyboards/40percentclub/25/25.h | 85 +++++++ keyboards/40percentclub/25/config.h | 230 ++++++++++++++++++ keyboards/40percentclub/25/info.json | 29 +++ .../40percentclub/25/keymaps/default/config.h | 19 ++ .../40percentclub/25/keymaps/default/keymap.c | 87 +++++++ .../25/keymaps/default/readme.md | 1 + .../40percentclub/25/keymaps/macro/config.h | 19 ++ .../40percentclub/25/keymaps/macro/keymap.c | 42 ++++ .../40percentclub/25/keymaps/macro/readme.md | 1 + keyboards/40percentclub/25/readme.md | 18 ++ keyboards/40percentclub/25/rules.mk | 85 +++++++ 12 files changed, 676 insertions(+) create mode 100644 keyboards/40percentclub/25/25.c create mode 100644 keyboards/40percentclub/25/25.h create mode 100644 keyboards/40percentclub/25/config.h create mode 100644 keyboards/40percentclub/25/info.json create mode 100644 keyboards/40percentclub/25/keymaps/default/config.h create mode 100644 keyboards/40percentclub/25/keymaps/default/keymap.c create mode 100644 keyboards/40percentclub/25/keymaps/default/readme.md create mode 100644 keyboards/40percentclub/25/keymaps/macro/config.h create mode 100644 keyboards/40percentclub/25/keymaps/macro/keymap.c create mode 100644 keyboards/40percentclub/25/keymaps/macro/readme.md create mode 100644 keyboards/40percentclub/25/readme.md create mode 100644 keyboards/40percentclub/25/rules.mk diff --git a/keyboards/40percentclub/25/25.c b/keyboards/40percentclub/25/25.c new file mode 100644 index 000000000..54a42d263 --- /dev/null +++ b/keyboards/40percentclub/25/25.c @@ -0,0 +1,60 @@ +/* Copyright 2018 + * + * 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 . + */ +#include "25.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + + led_set_user(usb_led); +} + +#ifdef SWAP_HANDS_ENABLE +__attribute__ ((weak)) +const keypos_t hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = { + {{4, 5}, {3, 5}, {2, 5}, {1, 5}, {0, 5}}, + {{4, 6}, {3, 6}, {2, 6}, {1, 6}, {0, 6}}, + {{4, 7}, {3, 7}, {2, 7}, {1, 7}, {0, 7}}, + {{4, 8}, {3, 8}, {2, 8}, {1, 8}, {0, 8}}, + {{4, 9}, {3, 9}, {2, 9}, {1, 9}, {0, 9}}, + + {{0, 0}, {1, 0}, {2, 0}, {3, 0}, {4, 0}}, + {{0, 1}, {1, 1}, {2, 1}, {3, 1}, {4, 1}}, + {{0, 2}, {1, 2}, {2, 2}, {3, 2}, {4, 2}}, + {{0, 3}, {1, 3}, {2, 3}, {3, 3}, {4, 3}}, + {{0, 4}, {1, 4}, {2, 4}, {3, 4}, {4, 4}}, +}; +#endif diff --git a/keyboards/40percentclub/25/25.h b/keyboards/40percentclub/25/25.h new file mode 100644 index 000000000..db9c48b52 --- /dev/null +++ b/keyboards/40percentclub/25/25.h @@ -0,0 +1,85 @@ +/* Copyright 2018 + * + * 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 . + */ +#pragma once + +#include "quantum.h" +#define ___ KC_NO + +#ifndef FLIP_HALF +#define LAYOUT_ortho_5x10( \ + L00, L01, L02, L03, L04, R00, R01, R02, R03, R04, \ + L10, L11, L12, L13, L14, R10, R11, R12, R13, R14, \ + L20, L21, L22, L23, L24, R20, R21, R22, R23, R24, \ + L30, L31, L32, L33, L34, R30, R31, R32, R33, R34, \ + L40, L41, L42, L43, L44, R40, R41, R42, R43, R44 \ +) { \ + { L00, L01, L02, L03, L04 }, \ + { L10, L11, L12, L13, L14 }, \ + { L20, L21, L22, L23, L24 }, \ + { L30, L31, L32, L33, L34 }, \ + { L40, L41, L42, L43, L44 }, \ + { R04, R03, R02, R01, R00 }, \ + { R14, R13, R12, R11, R10 }, \ + { R24, R23, R22, R21, R20 }, \ + { R34, R33, R32, R31, R30 }, \ + { R44, R43, R42, R41, R40 } \ +} +#else +#define LAYOUT_ortho_5x10( \ + L00, L01, L02, L03, L04, R00, R01, R02, R03, R04, \ + L10, L11, L12, L13, L14, R10, R11, R12, R13, R14, \ + L20, L21, L22, L23, L24, R20, R21, R22, R23, R24, \ + L30, L31, L32, L33, L34, R30, R31, R32, R33, R34, \ + L40, L41, L42, L43, L44, R40, R41, R42, R43, R44 \ +) { \ + { L00, L01, L02, L03, L04 }, \ + { L10, L11, L12, L13, L14 }, \ + { L20, L21, L22, L23, L24 }, \ + { L30, L31, L32, L33, L34 }, \ + { L40, L41, L42, L43, L44 }, \ + { R00, R01, R02, R03, R04 }, \ + { R10, R11, R12, R13, R14 }, \ + { R20, R21, R22, R23, R24 }, \ + { R30, R31, R32, R33, R34 }, \ + { R40, R41, R42, R43, R44 } \ +} +#endif + +#define LAYOUT_ortho_5x5( \ + L00, L01, L02, L03, L04, \ + L10, L11, L12, L13, L14, \ + L20, L21, L22, L23, L24, \ + L30, L31, L32, L33, L34, \ + L40, L41, L42, L43, L44 \ +) { \ + { L00, L01, L02, L03, L04 }, \ + { L10, L11, L12, L13, L14 }, \ + { L20, L21, L22, L23, L24 }, \ + { L30, L31, L32, L33, L34 }, \ + { L40, L41, L42, L43, L44 }, \ + { ___, ___, ___, ___, ___ }, \ + { ___, ___, ___, ___, ___ }, \ + { ___, ___, ___, ___, ___ }, \ + { ___, ___, ___, ___, ___ }, \ + { ___, ___, ___, ___, ___ } \ +} + +#define LAYOUT_macro LAYOUT_ortho_5x5 +#define LAYOUT_split LAYOUT_ortho_5x10 + +#ifdef USE_I2C + #error "I2C not Supported" +#endif diff --git a/keyboards/40percentclub/25/config.h b/keyboards/40percentclub/25/config.h new file mode 100644 index 000000000..23b768e15 --- /dev/null +++ b/keyboards/40percentclub/25/config.h @@ -0,0 +1,230 @@ +/* Copyright 2018 + * + * 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 . + */ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0A0C +#define DEVICE_VER 0x0F25 +#define MANUFACTURER di0ib +#define PRODUCT The 5x5 Keyboard +#define DESCRIPTION A split 50 key keyboard + +#define USE_SERIAL + +/* Select hand configuration */ +#define MASTER_LEFT +//#define MASTER_RIGHT +//#define EE_HANDS + +/* key matrix size */ +// Rows are doubled-up +#define MATRIX_ROWS 5*2 +#define MATRIX_COLS 5 + +/* + * 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 { D4, C6, D7, E6, B4 } +#define MATRIX_COL_PINS { F4, F5, F6, F7, B1 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_BREATHING +// #define BACKLIGHT_LEVELS 3 + +// #define RGB_DI_PIN E2 +// #ifdef RGB_DI_PIN +// #define RGBLIGHT_ANIMATIONS +// #define RGBLED_NUM 16 +// #define RGBLIGHT_HUE_STEP 8 +// #define RGBLIGHT_SAT_STEP 8 +// #define RGBLIGHT_VAL_STEP 8 +// #endif + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* 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 userful 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 + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * 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 + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +//#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ diff --git a/keyboards/40percentclub/25/info.json b/keyboards/40percentclub/25/info.json new file mode 100644 index 000000000..abb77a067 --- /dev/null +++ b/keyboards/40percentclub/25/info.json @@ -0,0 +1,29 @@ +{ + "keyboard_name": "foobar", + "url": "", + "maintainer": "qmk", + "width": 6, + "height": 2, + "layouts": { + "LAYOUT_macro": { + "key_count": 15, + "layout": [ + {"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, + {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, + {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2}, + {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":4, "y":3}, + {"x":0, "y":4}, {"x":1, "y":4}, {"x":2, "y":4}, {"x":3, "y":4}, {"x":4, "y":4} + ] + }, + "LAYOUT_split": { + "key_count": 30, + "layout": [ + {"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, + {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":6, "y":1}, {"x":7, "y":1}, {"x":8, "y":1}, {"x":9, "y":1}, + {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2}, {"x":5, "y":2}, {"x":6, "y":2}, {"x":7, "y":2}, {"x":8, "y":2}, {"x":9, "y":2}, + {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":4, "y":3}, {"x":5, "y":3}, {"x":6, "y":3}, {"x":7, "y":3}, {"x":8, "y":3}, {"x":9, "y":3}, + {"x":0, "y":4}, {"x":1, "y":4}, {"x":2, "y":4}, {"x":3, "y":4}, {"x":4, "y":4}, {"x":5, "y":4}, {"x":6, "y":4}, {"x":7, "y":4}, {"x":8, "y":4}, {"x":9, "y":4} + ] + } + } +} diff --git a/keyboards/40percentclub/25/keymaps/default/config.h b/keyboards/40percentclub/25/keymaps/default/config.h new file mode 100644 index 000000000..6173b6327 --- /dev/null +++ b/keyboards/40percentclub/25/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 + * + * 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 . + */ + +#pragma once + +// place overrides here diff --git a/keyboards/40percentclub/25/keymaps/default/keymap.c b/keyboards/40percentclub/25/keymaps/default/keymap.c new file mode 100644 index 000000000..ccb54c82a --- /dev/null +++ b/keyboards/40percentclub/25/keymaps/default/keymap.c @@ -0,0 +1,87 @@ +/* Copyright 2018 + * + * 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 . + */ +#include QMK_KEYBOARD_H + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _LOWER 1 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + LOWER, +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Qwerty + * ,---------------------------------------------------------------------. + * | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | + * |------+------+------+------+------+------+------+------+------+------| + * | Q | W | E | R | T | Y | U | I | O | P | + * |------+------+------+------+-------------+------+------+------+------| + * | A | S | D | F | G | H | J | K | L | Bksp | + * |------+------+------+------+------|------+------+------+------+------| + * | Z | X | C | V | B | N | M | , | . |Enter | + * |------+------+------+------+------+------+------+------+------+------| + * | Ctrl | GUI | Alt |Lower |Space | Shift| Left | Down | Up |Right | + * `---------------------------------------------------------------------' + */ + [_QWERTY] = LAYOUT_split( + KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, \ + KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, \ + KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_BSPC, \ + KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_ENT, \ + KC_LCTL, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_LSFT, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ + ), + + /* Lower + * ,---------------------------------------------------------------------. + * | F1 | F2 | F3 | F4 | F5 | F6 | ` | / | _ | + | + * |------+------+------+------+------|------+------+------+------+------| + * | F7 | F8 | F9 | F10 | F11 | F12 | ~ | [ | ] | \ | + * |------+------+------+------+-------------+------+------+------+------| + * | Esc | | | | | | | ; | " | Del | + * |------+------+------+------+------|------+------+------+------+------| + * | Tab | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------| + * | | | | | | | Home | PgDn | PgUp | End | + * `---------------------------------------------------------------------' + */ + [_LOWER] = LAYOUT_split( \ + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_GRV, KC_SLSH, KC_UNDS, KC_PLUS, \ + KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TILD, KC_LBRC, KC_RBRC, KC_PIPE, \ + KC_ESC, _______, _______, _______, _______, _______, _______, KC_SCLN, KC_QUOT, KC_DEL, \ + KC_TAB, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END \ + ), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/40percentclub/25/keymaps/default/readme.md b/keyboards/40percentclub/25/keymaps/default/readme.md new file mode 100644 index 000000000..7558c42ec --- /dev/null +++ b/keyboards/40percentclub/25/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default split keymap for 25 diff --git a/keyboards/40percentclub/25/keymaps/macro/config.h b/keyboards/40percentclub/25/keymaps/macro/config.h new file mode 100644 index 000000000..6173b6327 --- /dev/null +++ b/keyboards/40percentclub/25/keymaps/macro/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 + * + * 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 . + */ + +#pragma once + +// place overrides here diff --git a/keyboards/40percentclub/25/keymaps/macro/keymap.c b/keyboards/40percentclub/25/keymaps/macro/keymap.c new file mode 100644 index 000000000..80d227710 --- /dev/null +++ b/keyboards/40percentclub/25/keymaps/macro/keymap.c @@ -0,0 +1,42 @@ +/* Copyright 2018 + * + * 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 . + */ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_macro( + KC_ESC, KC_1, KC_2, KC_3, KC_4, \ + KC_GRV, KC_Q, KC_W, KC_E, KC_R, \ + KC_TAB, KC_A, KC_S, KC_D, KC_F, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC \ + ), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/40percentclub/25/keymaps/macro/readme.md b/keyboards/40percentclub/25/keymaps/macro/readme.md new file mode 100644 index 000000000..6645f93dd --- /dev/null +++ b/keyboards/40percentclub/25/keymaps/macro/readme.md @@ -0,0 +1 @@ +# The default macro keymap for 25 diff --git a/keyboards/40percentclub/25/readme.md b/keyboards/40percentclub/25/readme.md new file mode 100644 index 000000000..b1685b618 --- /dev/null +++ b/keyboards/40percentclub/25/readme.md @@ -0,0 +1,18 @@ +# 25 + +![25](https://2.bp.blogspot.com/-lBK_ZlB3a9Q/WcAM0B_vwdI/AAAAAAACDgs/qnI9YB53pzck4Bw0v5QRvypDMs80CxWVQCLcBGAs/s640/IMG_0695.JPG) +=== + +Split 50 key keyboard - it is the largest keybad that fits within the 100mm x 100mm PCB size. Can be used together as a split keyboard or as a single 25 key macropad. + +* [The original TMK firmware](https://github.com/di0ib/tmk_keyboard/tree/master/keyboard/25) + +Keyboard Maintainer: QMK Community +Hardware Supported: 25 PCB +Hardware Availability: [25 project on 40% Keyboards](http://www.40percent.club/2017/09/25.html) + +Make example for this keyboard (after setting up your build environment): + + make 40percentclub/25:default + +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). diff --git a/keyboards/40percentclub/25/rules.mk b/keyboards/40percentclub/25/rules.mk new file mode 100644 index 000000000..bfcdce7c9 --- /dev/null +++ b/keyboards/40percentclub/25/rules.mk @@ -0,0 +1,85 @@ +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = caterina + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = yes # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) + +# Enable generic behavior for split boards +SPLIT_KEYBOARD = yes + +LAYOUTS = ortho_5x5 ortho_5x10 From b173c05cc25e9394c6e50081c1af707443950104 Mon Sep 17 00:00:00 2001 From: zvecr Date: Mon, 12 Nov 2018 20:02:28 +0000 Subject: [PATCH 496/788] Tidy 40percentclub boards (#4403) * Remove unnecessary re-definitions for XXXXXXX and _______ * Update 6lit to use KC_NO in layout macros * Update rules.mk to follow current template * Remove use of deprecated function action_get_macro - unused and contents were from old template * Remove use of deprecated function action_get_macro - all code was commented out * Remove use of deprecated function action_get_macro - convert macro to use process_record_user * Convert keymap to consistent use of _______ * fix use of old style header guards * Swap KC_NO for XXXXXXX macro since the swap to the macro for KC_TRANS * Resolve use of ?= in rules.mk files * Remove duplication of rules.mk and config.h in gherkin mjt keymap * Remove unnecessary #includes * Align layout macros so foobar can use gherkin keymaps * Align 6lit layout macros with foobar * Remove ifndef QUANTUM_DIR from keymaps --- keyboards/40percentclub/4x4/4x4.h | 6 +- .../4x4/keymaps/default/keymap.c | 22 +-- keyboards/40percentclub/4x4/rules.mk | 32 ++-- keyboards/40percentclub/5x5/5x5.h | 6 +- .../5x5/keymaps/default/keymap.c | 24 +-- keyboards/40percentclub/5x5/rules.mk | 33 ++-- keyboards/40percentclub/6lit/6lit.h | 13 +- keyboards/40percentclub/foobar/foobar.h | 9 +- .../foobar/keymaps/default/keymap.c | 1 - keyboards/40percentclub/foobar/rules.mk | 2 + keyboards/40percentclub/gherkin/config.h | 5 +- keyboards/40percentclub/gherkin/gherkin.h | 5 +- .../gherkin/keymaps/bbaserdem/config.h | 6 +- .../gherkin/keymaps/bbaserdem/rules.mk | 4 - .../gherkin/keymaps/default/keymap.c | 11 -- .../gherkin/keymaps/itsaferbie/config.h | 7 +- .../gherkin/keymaps/itsaferbie/keymap.c | 31 ++-- .../gherkin/keymaps/itsaferbie/rules.mk | 4 - .../gherkin/keymaps/mjt/config.h | 168 +----------------- .../gherkin/keymaps/mjt/keymap.c | 29 --- .../gherkin/keymaps/mjt/rules.mk | 31 +--- .../gherkin/keymaps/steno/config.h | 7 +- .../gherkin/keymaps/steno/rules.mk | 8 +- .../gherkin/keymaps/talljoe-gherkin/config.h | 7 +- .../gherkin/keymaps/talljoe-gherkin/keymap.c | 2 - .../gherkin/keymaps/talljoe-gherkin/rules.mk | 4 - keyboards/40percentclub/gherkin/rules.mk | 39 ++-- keyboards/40percentclub/luddite/rules.mk | 39 ++-- keyboards/40percentclub/mf68/config.h | 5 +- .../mf68/keymaps/default/keymap.c | 15 -- .../mf68/keymaps/factory/keymap.c | 15 -- keyboards/40percentclub/mf68/mf68.h | 5 +- keyboards/40percentclub/mf68/rules.mk | 54 +++--- keyboards/40percentclub/mf68_ble/config.h | 5 +- .../mf68_ble/keymaps/default/keymap.c | 15 -- keyboards/40percentclub/mf68_ble/mf68_ble.h | 5 +- keyboards/40percentclub/mf68_ble/rules.mk | 54 +++--- keyboards/40percentclub/nano/config.h | 5 +- .../nano/keymaps/default/keymap.c | 1 - .../nano/keymaps/spooka/keymap.c | 2 - keyboards/40percentclub/nano/nano.h | 5 +- keyboards/40percentclub/nano/rules.mk | 34 ++-- keyboards/40percentclub/tomato/config.h | 5 +- .../tomato/keymaps/default/keymap.c | 39 ++-- keyboards/40percentclub/tomato/rules.mk | 32 +++- keyboards/40percentclub/tomato/tomato.h | 5 +- keyboards/40percentclub/ut47/config.h | 5 +- .../ut47/keymaps/default/config.h | 5 +- .../ut47/keymaps/default/keymap.c | 1 - .../ut47/keymaps/non-us/config.h | 5 +- .../ut47/keymaps/non-us/keymap.c | 1 - .../ut47/keymaps/nordic/keymap.c | 1 - .../40percentclub/ut47/keymaps/rgb/config.h | 5 +- .../40percentclub/ut47/keymaps/rgb/keymap.c | 1 - keyboards/40percentclub/ut47/rules.mk | 31 +++- keyboards/40percentclub/ut47/ut47.h | 5 +- 56 files changed, 299 insertions(+), 617 deletions(-) diff --git a/keyboards/40percentclub/4x4/4x4.h b/keyboards/40percentclub/4x4/4x4.h index ec75c3e28..8cc5a150a 100644 --- a/keyboards/40percentclub/4x4/4x4.h +++ b/keyboards/40percentclub/4x4/4x4.h @@ -1,6 +1,4 @@ - -#ifndef FOURX4_H -#define FOURX4_H +#pragma once #include "quantum.h" #define ___ KC_NO @@ -58,5 +56,3 @@ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2a, K2b, K2c, K2d, K2e, K2f }, \ { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3a, K3b, K3c, K3d, K3e, K3f } \ } - -#endif diff --git a/keyboards/40percentclub/4x4/keymaps/default/keymap.c b/keyboards/40percentclub/4x4/keymaps/default/keymap.c index 144ec05c1..1f52b2066 100644 --- a/keyboards/40percentclub/4x4/keymaps/default/keymap.c +++ b/keyboards/40percentclub/4x4/keymaps/default/keymap.c @@ -6,9 +6,6 @@ #define NUM 2 #define DIR 3 -// Readability keycodes -#define _______ KC_TRNS - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Single 4x4 board only @@ -65,7 +62,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [NUM] = LAYOUT_ortho_4x16( _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, _______, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, _______, _______, KC_PPLS, _______, - _______, KC_F11, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS, KC_ENT, KC_RSFT, KC_RGUI, ALT_T(KC_DOT), CTL_T(KC_BSPC), _______, _______, _______, KC_PENT, _______, + _______, KC_F11, KC_F12, _______, _______, _______, KC_ENT, KC_RSFT, KC_RGUI, ALT_T(KC_DOT), CTL_T(KC_BSPC), _______, _______, _______, KC_PENT, _______, _______, _______, _______, _______, _______, _______, KC_ENT, KC_RSFT, _______, _______, _______, _______, _______, _______, _______, _______ ), @@ -90,23 +87,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; - -const uint16_t PROGMEM fn_actions[] = { - -}; - - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { - keyevent_t event = record->event; - (void)event; - - switch (id) { - - } - return MACRO_NONE; -} - - void matrix_init_user(void) { } diff --git a/keyboards/40percentclub/4x4/rules.mk b/keyboards/40percentclub/4x4/rules.mk index d572e7244..a51335798 100644 --- a/keyboards/40percentclub/4x4/rules.mk +++ b/keyboards/40percentclub/4x4/rules.mk @@ -36,24 +36,30 @@ F_USB = $(F_CPU) # Interrupt driven control endpoint task(+60) OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT -# Boot Section Size in *bytes* -# Teensy halfKay 512 -# Teensy++ halfKay 1024 -# Atmel DFU loader 4096 -# LUFA bootloader 4096 -# USBaspLoader 2048 -# OPT_DEFS += -DBOOTLOADER_SIZE=4096 -# Bootloader -# This definition is optional, and if your keyboard supports multiple bootloaders of -# different sizes, comment this out, and the correct address will be loaded -# automatically (+60). See bootloader.mk for all options. +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID BOOTLOADER = caterina + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + # Build Options # change yes to no to disable # -BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) MOUSEKEY_ENABLE = yes # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) CONSOLE_ENABLE = yes # Console for debug(+400) @@ -68,7 +74,7 @@ UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID AUDIO_ENABLE = no # Audio output on port C6 FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches -HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) #FIXME: Community keymap build are currently failing due to missing functionality #LAYOUTS = ortho_4x4 ortho_4x8 ortho_4x12 ortho_4x16 diff --git a/keyboards/40percentclub/5x5/5x5.h b/keyboards/40percentclub/5x5/5x5.h index 45fb80a4f..182e9e819 100644 --- a/keyboards/40percentclub/5x5/5x5.h +++ b/keyboards/40percentclub/5x5/5x5.h @@ -1,6 +1,4 @@ - -#ifndef FIVEX5_H -#define FIVEX5_H +#pragma once #include "quantum.h" #define ___ KC_NO @@ -53,5 +51,3 @@ { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3a, K3b, K3c, K3d, K3e}, \ { K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4a, K4b, K4c, K4d, K4e} \ } - -#endif diff --git a/keyboards/40percentclub/5x5/keymaps/default/keymap.c b/keyboards/40percentclub/5x5/keymaps/default/keymap.c index a2c525d08..56ddbb23f 100644 --- a/keyboards/40percentclub/5x5/keymaps/default/keymap.c +++ b/keyboards/40percentclub/5x5/keymaps/default/keymap.c @@ -6,9 +6,6 @@ #define NUM 2 #define DIR 3 -// Readability keycodes -#define _______ KC_TRNS - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Single 5x5 board only @@ -74,7 +71,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, _______, _______, KC_PPLS, - _______, KC_F11, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS, KC_ENT, KC_RSFT, KC_RGUI, ALT_T(KC_DOT), CTL_T(KC_BSPC), _______, _______, _______, KC_PENT, + _______, KC_F11, KC_F12, _______, _______, _______, KC_ENT, KC_RSFT, KC_RGUI, ALT_T(KC_DOT), CTL_T(KC_BSPC), _______, _______, _______, KC_PENT, _______, _______, _______, _______, _______, _______, KC_ENT, KC_RSFT, _______, _______, _______, _______, _______, _______, _______ ), @@ -102,25 +99,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; -const uint16_t PROGMEM fn_actions[] = { - -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - // MACRODOWN only works in this function - switch(id) { - case 0: - if (record->event.pressed) { - register_code(KC_RSFT); - } else { - unregister_code(KC_RSFT); - } - break; - } - return MACRO_NONE; -}; - void matrix_init_user(void) { diff --git a/keyboards/40percentclub/5x5/rules.mk b/keyboards/40percentclub/5x5/rules.mk index abc961a86..ae0414126 100644 --- a/keyboards/40percentclub/5x5/rules.mk +++ b/keyboards/40percentclub/5x5/rules.mk @@ -36,24 +36,31 @@ F_USB = $(F_CPU) # Interrupt driven control endpoint task(+60) OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT -# Boot Section Size in *bytes* -# Teensy halfKay 512 -# Teensy++ halfKay 1024 -# Atmel DFU loader 4096 -# LUFA bootloader 4096 -# USBaspLoader 2048 + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = caterina + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 # OPT_DEFS += -DBOOTLOADER_SIZE=4096 -# Bootloader -# This definition is optional, and if your keyboard supports multiple bootloaders of -# different sizes, comment this out, and the correct address will be loaded -# automatically (+60). See bootloader.mk for all options. -BOOTLOADER = caterina # Build Options # change yes to no to disable # -BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) MOUSEKEY_ENABLE = yes # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) CONSOLE_ENABLE = yes # Console for debug(+400) @@ -68,7 +75,7 @@ UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID AUDIO_ENABLE = no # Audio output on port C6 FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches -HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) #FIXME: Community keymap build are currently failing due to missing functionality #LAYOUTS = ortho_5x5 ortho_5x10 ortho_5x15 diff --git a/keyboards/40percentclub/6lit/6lit.h b/keyboards/40percentclub/6lit/6lit.h index ae0beea35..af01d44c2 100644 --- a/keyboards/40percentclub/6lit/6lit.h +++ b/keyboards/40percentclub/6lit/6lit.h @@ -16,10 +16,10 @@ #pragma once #include "quantum.h" -#define ________ KC_NO +#define ___ KC_NO #ifndef FLIP_HALF -#define LAYOUT_split( \ +#define LAYOUT_ortho_2x6( \ L00, L01, L02, R00, R01, R02, \ L10, L11, L12, R10, R11, R12 \ ) { \ @@ -29,7 +29,7 @@ { R12, R11, R10 }, \ } #else -#define LAYOUT_split( \ +#define LAYOUT_ortho_2x6( \ L00, L01, L02, R00, R01, R02, \ L10, L11, L12, R10, R11, R12 \ ) { \ @@ -40,15 +40,18 @@ } #endif -#define LAYOUT_macro( \ +#define LAYOUT_ortho_2x3( \ L00, L01, L02, \ L10, L11, L12 \ ) { \ { L00, L01, L02 }, \ { L10, L11, L12 }, \ + { ___, ___, ___ }, \ + { ___, ___, ___ }, \ } -#define LAYOUT LAYOUT_macro +#define LAYOUT_macro LAYOUT_ortho_2x3 +#define LAYOUT_split LAYOUT_ortho_2x6 #ifdef USE_I2C #error "I2C not Supported" diff --git a/keyboards/40percentclub/foobar/foobar.h b/keyboards/40percentclub/foobar/foobar.h index fc49c72aa..8cf2e384f 100644 --- a/keyboards/40percentclub/foobar/foobar.h +++ b/keyboards/40percentclub/foobar/foobar.h @@ -19,7 +19,7 @@ #define ___ KC_NO #ifndef FLIP_HALF -#define LAYOUT_split( \ +#define LAYOUT_ortho_3x10( \ L00, L01, L02, L03, L04, R00, R01, R02, R03, R04, \ L10, L11, L12, L13, L14, R10, R11, R12, R13, R14, \ L20, L21, L22, L23, L24, R20, R21, R22, R23, R24 \ @@ -32,7 +32,7 @@ { R24, R23, R22, R21, R20 } \ } #else -#define LAYOUT_split( \ +#define LAYOUT_ortho_3x10( \ L00, L01, L02, L03, L04, R00, R01, R02, R03, R04, \ L10, L11, L12, L13, L14, R10, R11, R12, R13, R14, \ L20, L21, L22, L23, L24, R20, R21, R22, R23, R24 \ @@ -46,7 +46,7 @@ } #endif -#define LAYOUT_macro( \ +#define LAYOUT_ortho_3x5( \ L00, L01, L02, L03, L04, \ L10, L11, L12, L13, L14, \ L20, L21, L22, L23, L24 \ @@ -59,7 +59,8 @@ { ___, ___, ___, ___, ___ } \ } -#define LAYOUT LAYOUT_macro +#define LAYOUT_macro LAYOUT_ortho_3x5 +#define LAYOUT_split LAYOUT_ortho_3x10 #ifdef USE_I2C #error "I2C not Supported" diff --git a/keyboards/40percentclub/foobar/keymaps/default/keymap.c b/keyboards/40percentclub/foobar/keymaps/default/keymap.c index b750c6185..774f1e854 100644 --- a/keyboards/40percentclub/foobar/keymaps/default/keymap.c +++ b/keyboards/40percentclub/foobar/keymaps/default/keymap.c @@ -15,7 +15,6 @@ */ #include QMK_KEYBOARD_H -#define _______ KC_TRNS #define FN1_Q LT(1, KC_Q) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { diff --git a/keyboards/40percentclub/foobar/rules.mk b/keyboards/40percentclub/foobar/rules.mk index 327565165..155a7daac 100644 --- a/keyboards/40percentclub/foobar/rules.mk +++ b/keyboards/40percentclub/foobar/rules.mk @@ -81,3 +81,5 @@ HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) # Enable generic behavior for split boards SPLIT_KEYBOARD = yes + +LAYOUTS = ortho_3x10 diff --git a/keyboards/40percentclub/gherkin/config.h b/keyboards/40percentclub/gherkin/config.h index 34f38e35c..3ed638b66 100644 --- a/keyboards/40percentclub/gherkin/config.h +++ b/keyboards/40percentclub/gherkin/config.h @@ -1,5 +1,4 @@ -#ifndef CONFIG_H -#define CONFIG_H +#pragma once #include "config_common.h" @@ -50,5 +49,3 @@ #define RGBLIGHT_SAT_STEP 8 #define RGBLIGHT_VAL_STEP 8 #endif - -#endif diff --git a/keyboards/40percentclub/gherkin/gherkin.h b/keyboards/40percentclub/gherkin/gherkin.h index f8674be40..70bffee30 100644 --- a/keyboards/40percentclub/gherkin/gherkin.h +++ b/keyboards/40percentclub/gherkin/gherkin.h @@ -1,5 +1,4 @@ -#ifndef GHERKIN_H -#define GHERKIN_H +#pragma once #include "quantum.h" @@ -14,5 +13,3 @@ { K30, K31, K32, K33, K34, K35 }, \ { K40, K41, K42, K43, K44, K45 } \ } - -#endif diff --git a/keyboards/40percentclub/gherkin/keymaps/bbaserdem/config.h b/keyboards/40percentclub/gherkin/keymaps/bbaserdem/config.h index 37d7113e7..5c9ca52d7 100644 --- a/keyboards/40percentclub/gherkin/keymaps/bbaserdem/config.h +++ b/keyboards/40percentclub/gherkin/keymaps/bbaserdem/config.h @@ -1,7 +1,5 @@ -#ifndef CONFIG_KEYMAP_H -#define CONFIG_KEYMAP_H +#pragma once -#include "../../config.h" #define RGB_DI_PIN F6 #define RGBLED_NUM 10 #define RGBLIGHT_ANIMATIONS @@ -9,5 +7,3 @@ #undef BACKLIGHT_LEVELS #endif #define BACKLIGHT_LEVELS 3 - -#endif diff --git a/keyboards/40percentclub/gherkin/keymaps/bbaserdem/rules.mk b/keyboards/40percentclub/gherkin/keymaps/bbaserdem/rules.mk index cd1cddebf..07a20a421 100644 --- a/keyboards/40percentclub/gherkin/keymaps/bbaserdem/rules.mk +++ b/keyboards/40percentclub/gherkin/keymaps/bbaserdem/rules.mk @@ -1,7 +1,3 @@ -ifndef QUANTUM_DIR - include ../../../../Makefile -endif - USER_NAME := bbaserdem-nouserspace STENO_ENABLE = no # Additional protocols for Stenography(+1700), requires VIRTSER diff --git a/keyboards/40percentclub/gherkin/keymaps/default/keymap.c b/keyboards/40percentclub/gherkin/keymaps/default/keymap.c index f01820030..ae6f15862 100644 --- a/keyboards/40percentclub/gherkin/keymaps/default/keymap.c +++ b/keyboards/40percentclub/gherkin/keymaps/default/keymap.c @@ -1,6 +1,5 @@ #include QMK_KEYBOARD_H -#define _______ KC_TRNS #define FN1_Q LT(1, KC_Q) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { @@ -19,16 +18,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { - keyevent_t event = record->event; - (void)event; - - switch (id) { - - } - return MACRO_NONE; -} - void matrix_init_user(void) { } diff --git a/keyboards/40percentclub/gherkin/keymaps/itsaferbie/config.h b/keyboards/40percentclub/gherkin/keymaps/itsaferbie/config.h index 71c0cb8b5..6849bbdd2 100644 --- a/keyboards/40percentclub/gherkin/keymaps/itsaferbie/config.h +++ b/keyboards/40percentclub/gherkin/keymaps/itsaferbie/config.h @@ -1,7 +1,4 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" +#pragma once #undef RGB_DI_PIN #undef RGBLED_NUM @@ -11,5 +8,3 @@ #define RGBLIGHT_HUE_STEP 8 #define RGBLIGHT_SAT_STEP 8 #define RGBLIGHT_VAL_STEP 8 - -#endif \ No newline at end of file diff --git a/keyboards/40percentclub/gherkin/keymaps/itsaferbie/keymap.c b/keyboards/40percentclub/gherkin/keymaps/itsaferbie/keymap.c index 580b041c9..950b6e86b 100644 --- a/keyboards/40percentclub/gherkin/keymaps/itsaferbie/keymap.c +++ b/keyboards/40percentclub/gherkin/keymaps/itsaferbie/keymap.c @@ -12,10 +12,9 @@ enum custom_keycodes { PS = SAFE_RANGE, AI, PR, + MACRO_0, }; -#define _______ KC_TRNS - #define PS TO(0) #define AI TO(1) #define PR TO(2) @@ -72,7 +71,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // Illustrator layer [_AI] = LAYOUT_ortho_3x10( - _______, M(0), RULER, _______, KC_G, _______, _______, KC_Q, KC_MINS, KC_PLUS, + _______, MACRO_0, RULER, _______, KC_G, _______, _______, KC_Q, KC_MINS, KC_PLUS, _______, _______, _______, KC_E, _______, _______, _______, SHAPE, KC_O, OPEN, _______, _______, _______, _______, _______, _______, _______, KC_M, KC_SLSH, PR ), @@ -133,20 +132,14 @@ void matrix_scan_user(void) { #endif } -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { - keyevent_t event = record->event; - (void)event; - - switch (id) { - case 0: - // Save for Web Macro. - return MACRO(D(LSFT), D(LALT), D(LCTL), T(S), U(LCTL), U(LALT), U(LSFT), END); - } - return MACRO_NONE; -} - bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - } - return true; -} + if (record->event.pressed) { + switch(keycode) { + case MACRO_0: + // Save for Web Macro. + SEND_STRING(SS_LSFT(SS_LALT(SS_LCTRL("s")))); + return false; + } + } + return true; +}; diff --git a/keyboards/40percentclub/gherkin/keymaps/itsaferbie/rules.mk b/keyboards/40percentclub/gherkin/keymaps/itsaferbie/rules.mk index ed0af7b8b..b359ca287 100644 --- a/keyboards/40percentclub/gherkin/keymaps/itsaferbie/rules.mk +++ b/keyboards/40percentclub/gherkin/keymaps/itsaferbie/rules.mk @@ -1,7 +1,3 @@ BACKLIGHT_ENABLE = yes AUDIO_ENABLE = no RGBLIGHT_ENABLE = yes - -ifndef QUANTUM_DIR - include ../../../../Makefile -endif \ No newline at end of file diff --git a/keyboards/40percentclub/gherkin/keymaps/mjt/config.h b/keyboards/40percentclub/gherkin/keymaps/mjt/config.h index bb59ec213..9fe94bcd2 100644 --- a/keyboards/40percentclub/gherkin/keymaps/mjt/config.h +++ b/keyboards/40percentclub/gherkin/keymaps/mjt/config.h @@ -1,169 +1,7 @@ -/* -Copyright 2012 Jun Wako - -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 . -*/ - -#ifndef CONFIG_H -#define CONFIG_H - -#include "config_common.h" +#pragma once /* USB Device descriptor parameter */ -#define VENDOR_ID 0xFEED -#define PRODUCT_ID 0x6060 -#define DEVICE_VER 0x0001 +#undef MANUFACTURER +#undef DESCRIPTION #define MANUFACTURER Some Guy -#define PRODUCT Gherkin #define DESCRIPTION 30 percent disaster - -/* key matrix size */ -#define MATRIX_ROWS 5 -#define MATRIX_COLS 6 - -/* - * 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) - * -*/ - -// These are with USB on the left. -// #define MATRIX_ROW_PINS { B6, B2, B3, B1, F7 } -// original from TMK: #define MATRIX_COL_PINS { D0, D4, C6, D7, E6, B4 } -// #define MATRIX_COL_PINS { D0, D4, F6, D7, E6, B4 } - -// these are with USB on the right. -#define MATRIX_ROW_PINS { F7, B1, B3, B2, B6 } -#define MATRIX_COL_PINS { B4, E6, D7, F6, D4, D0 } - -#define UNUSED_PINS - -/* COL2ROW or ROW2COL */ -#define DIODE_DIRECTION COL2ROW - -/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ -#define DEBOUNCING_DELAY 5 - -/* define if matrix has ghost (lacks anti-ghosting diodes) */ -//#define MATRIX_HAS_GHOST - -/* number of backlight levels */ -#define BACKLIGHT_LEVELS 3 -#define BACKLIGHT_PIN B5 - -/* 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 - -#define AUDIO_VOICES - -/* - * 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 - -/* - * Magic Key Options - * - * Magic keys are hotkey commands that allow control over firmware functions of - * the keyboard. They are best used in combination with the HID Listen program, - * found here: https://www.pjrc.com/teensy/hid_listen.html - * - * The options below allow the magic key functionality to be changed. This is - * useful if your keyboard/keypad is missing keys and you want magic key support. - * - */ - -/* key combination for magic key command */ -#define IS_COMMAND() ( \ - keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ -) - -/* control how magic key switches layers */ -//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true -//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true -//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false - -/* override magic key keymap */ -//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS -//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS -//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM -//#define MAGIC_KEY_HELP1 H -//#define MAGIC_KEY_HELP2 SLASH -//#define MAGIC_KEY_DEBUG D -//#define MAGIC_KEY_DEBUG_MATRIX X -//#define MAGIC_KEY_DEBUG_KBD K -//#define MAGIC_KEY_DEBUG_MOUSE M -//#define MAGIC_KEY_VERSION V -//#define MAGIC_KEY_STATUS S -//#define MAGIC_KEY_CONSOLE C -//#define MAGIC_KEY_LAYER0_ALT1 ESC -//#define MAGIC_KEY_LAYER0_ALT2 GRAVE -//#define MAGIC_KEY_LAYER0 0 -//#define MAGIC_KEY_LAYER1 1 -//#define MAGIC_KEY_LAYER2 2 -//#define MAGIC_KEY_LAYER3 3 -//#define MAGIC_KEY_LAYER4 4 -//#define MAGIC_KEY_LAYER5 5 -//#define MAGIC_KEY_LAYER6 6 -//#define MAGIC_KEY_LAYER7 7 -//#define MAGIC_KEY_LAYER8 8 -//#define MAGIC_KEY_LAYER9 9 -//#define MAGIC_KEY_BOOTLOADER PAUSE -//#define MAGIC_KEY_LOCK CAPS -//#define MAGIC_KEY_EEPROM E -//#define MAGIC_KEY_NKRO N -//#define MAGIC_KEY_SLEEP_LED Z - -/* - * 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 - -#endif diff --git a/keyboards/40percentclub/gherkin/keymaps/mjt/keymap.c b/keyboards/40percentclub/gherkin/keymaps/mjt/keymap.c index 2b4369c34..2fd4c2a46 100644 --- a/keyboards/40percentclub/gherkin/keymaps/mjt/keymap.c +++ b/keyboards/40percentclub/gherkin/keymaps/mjt/keymap.c @@ -12,7 +12,6 @@ enum { TD_C_LALT = 2, TD_A_TAB = 3, TD_Q_ESC = 4, -// M(0) }; //Friendly Layer Names @@ -37,10 +36,6 @@ enum gherkin_keycodes { EXT_PLV }; -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_QWERTY] = LAYOUT_ortho_3x10( TD(TD_Q_ESC), KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, @@ -171,30 +166,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { return true; } - -/* -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { - keyevent_t event = record->event; - - switch (id) { - case 0: { - if (record->event.pressed) { - key_timer = timer_read(); // if the key is being pressed, we start the timer. - } - else { // this means the key was just released, so we can figure out how long it was pressed for (tap or "held down"). - if (timer_elapsed(key_timer) > 150) { // 150 being 150ms, the threshhold we pick for counting something as a tap. - return MACRO( D(LSFT), END ); - } - else { - return MACRO( T(N), END ); - } - } - break; - } - } - return MACRO_NONE; -}*/ - void matrix_init_user(void) { #ifdef AUDIO_ENABLE startup_user(); diff --git a/keyboards/40percentclub/gherkin/keymaps/mjt/rules.mk b/keyboards/40percentclub/gherkin/keymaps/mjt/rules.mk index afb93b674..3a35ae3b3 100644 --- a/keyboards/40percentclub/gherkin/keymaps/mjt/rules.mk +++ b/keyboards/40percentclub/gherkin/keymaps/mjt/rules.mk @@ -1,29 +1,2 @@ -## not sure where this stuff goes ## -MCU = atmega32u4 -F_CPU = 16000000 -ARCH = AVR8 -F_USB = $(F_CPU) -OPT_DEFS += -DBOOTLOADER_SIZE=4096 - -# Build Options -# change to "no" to disable the options, or define them in the Makefile in -# the appropriate keymap folder that will get included automatically -# -BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = no # Console for debug(+400) -COMMAND_ENABLE = yes # Commands for debug and configuration -NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality -MIDI_ENABLE = no # MIDI controls -AUDIO_ENABLE = yes # Audio output on port C6 -UNICODE_ENABLE = no # Unicode -BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. -SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend -TAP_DANCE_ENABLE=yes - -ifndef QUANTUM_DIR - include ../../../../Makefile -endif +AUDIO_ENABLE = yes # Audio output on port C6 +TAP_DANCE_ENABLE = yes diff --git a/keyboards/40percentclub/gherkin/keymaps/steno/config.h b/keyboards/40percentclub/gherkin/keymaps/steno/config.h index abacefa01..20a8f7844 100644 --- a/keyboards/40percentclub/gherkin/keymaps/steno/config.h +++ b/keyboards/40percentclub/gherkin/keymaps/steno/config.h @@ -1,12 +1,7 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" +#pragma once #define NO_ACTION_LAYER #define NO_ACTION_TAPPING #define NO_ACTION_ONESHOT #define NO_ACTION_MACRO #define NO_ACTION_FUNCTION - -#endif \ No newline at end of file diff --git a/keyboards/40percentclub/gherkin/keymaps/steno/rules.mk b/keyboards/40percentclub/gherkin/keymaps/steno/rules.mk index fa813f209..a6e76f7cf 100644 --- a/keyboards/40percentclub/gherkin/keymaps/steno/rules.mk +++ b/keyboards/40percentclub/gherkin/keymaps/steno/rules.mk @@ -1,8 +1,4 @@ -ifndef QUANTUM_DIR - include ../../../../Makefile -endif - -STENO_ENABLE = yes # Additional protocols for Stenography(+1700), requires VIRTSER +STENO_ENABLE = yes # Additional protocols for Stenography(+1700), requires VIRTSER BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) MOUSEKEY_ENABLE = no # Mouse keys(+4700) @@ -13,4 +9,4 @@ SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend NKRO_ENABLE = no # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality AUDIO_ENABLE = no -RGBLIGHT_ENABLE = no \ No newline at end of file +RGBLIGHT_ENABLE = no diff --git a/keyboards/40percentclub/gherkin/keymaps/talljoe-gherkin/config.h b/keyboards/40percentclub/gherkin/keymaps/talljoe-gherkin/config.h index 7fa3bf328..271f48d00 100644 --- a/keyboards/40percentclub/gherkin/keymaps/talljoe-gherkin/config.h +++ b/keyboards/40percentclub/gherkin/keymaps/talljoe-gherkin/config.h @@ -1,6 +1,3 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H +#pragma once -#include "../../config.h" - -#endif +// place overrides here diff --git a/keyboards/40percentclub/gherkin/keymaps/talljoe-gherkin/keymap.c b/keyboards/40percentclub/gherkin/keymaps/talljoe-gherkin/keymap.c index ea2921924..ca3da579a 100644 --- a/keyboards/40percentclub/gherkin/keymaps/talljoe-gherkin/keymap.c +++ b/keyboards/40percentclub/gherkin/keymaps/talljoe-gherkin/keymap.c @@ -4,8 +4,6 @@ #define ST_BOLT QK_STENO_BOLT #define ST_GEM QK_STENO_GEMINI -#define XXXXXXX KC_NO - enum keyboard_layers { _QWERTY, _RAISE, diff --git a/keyboards/40percentclub/gherkin/keymaps/talljoe-gherkin/rules.mk b/keyboards/40percentclub/gherkin/keymaps/talljoe-gherkin/rules.mk index 02216ecb3..a64c606ae 100644 --- a/keyboards/40percentclub/gherkin/keymaps/talljoe-gherkin/rules.mk +++ b/keyboards/40percentclub/gherkin/keymaps/talljoe-gherkin/rules.mk @@ -1,6 +1,2 @@ -ifndef QUANTUM_DIR - include ../../../../Makefile -endif - MOUSEKEY_ENABLE = no # Mouse keys(+4700) STENO_ENABLE = yes # Additional protocols for Stenography(+1700), requires VIRTSER diff --git a/keyboards/40percentclub/gherkin/rules.mk b/keyboards/40percentclub/gherkin/rules.mk index 416ca5e5f..1e0b34641 100644 --- a/keyboards/40percentclub/gherkin/rules.mk +++ b/keyboards/40percentclub/gherkin/rules.mk @@ -33,25 +33,40 @@ ARCH = AVR8 # CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. F_USB = $(F_CPU) -# Bootloader -# This definition is optional, and if your keyboard supports multiple bootloaders of -# different sizes, comment this out, and the correct address will be loaded -# automatically (+60). See bootloader.mk for all options. -BOOTLOADER = caterina - # Interrupt driven control endpoint task(+60) OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = caterina + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + # Build Options # comment out to disable the options. # BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = no # Console for debug(+400) -COMMAND_ENABLE = no # Commands for debug and configuration -SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend -NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality AUDIO_ENABLE = no RGBLIGHT_ENABLE = no diff --git a/keyboards/40percentclub/luddite/rules.mk b/keyboards/40percentclub/luddite/rules.mk index 2f7d847bf..8dff21f9a 100644 --- a/keyboards/40percentclub/luddite/rules.mk +++ b/keyboards/40percentclub/luddite/rules.mk @@ -33,25 +33,40 @@ ARCH = AVR8 # CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. F_USB = $(F_CPU) -# Bootloader -# This definition is optional, and if your keyboard supports multiple bootloaders of -# different sizes, comment this out, and the correct address will be loaded -# automatically (+60). See bootloader.mk for all options. -BOOTLOADER = caterina - # Interrupt driven control endpoint task(+60) OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = caterina + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + # Build Options # comment out to disable the options. # BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = no # Console for debug(+400) -COMMAND_ENABLE = no # Commands for debug and configuration -SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend -NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality AUDIO_ENABLE = no RGBLIGHT_ENABLE = yes diff --git a/keyboards/40percentclub/mf68/config.h b/keyboards/40percentclub/mf68/config.h index 07d787eac..22d987e52 100644 --- a/keyboards/40percentclub/mf68/config.h +++ b/keyboards/40percentclub/mf68/config.h @@ -15,8 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef CONFIG_H -#define CONFIG_H +#pragma once #include "config_common.h" @@ -158,5 +157,3 @@ along with this program. If not, see . //#define NO_ACTION_ONESHOT //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION - -#endif diff --git a/keyboards/40percentclub/mf68/keymaps/default/keymap.c b/keyboards/40percentclub/mf68/keymaps/default/keymap.c index 73045f310..ae7e7297c 100644 --- a/keyboards/40percentclub/mf68/keymaps/default/keymap.c +++ b/keyboards/40percentclub/mf68/keymaps/default/keymap.c @@ -51,18 +51,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /*`ctrl-+-gui-+-alt-+----------space---------------+-fn---+-alt-+ctrl-' `left+down+rght' */ ) }; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - // MACRODOWN only works in this function - switch(id) { - case 0: - if (record->event.pressed) { - register_code(KC_RSFT); - } else { - unregister_code(KC_RSFT); - } - break; - } - return MACRO_NONE; -}; diff --git a/keyboards/40percentclub/mf68/keymaps/factory/keymap.c b/keyboards/40percentclub/mf68/keymaps/factory/keymap.c index 0c5305e51..12032350c 100644 --- a/keyboards/40percentclub/mf68/keymaps/factory/keymap.c +++ b/keyboards/40percentclub/mf68/keymaps/factory/keymap.c @@ -57,18 +57,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /*`ctrl-+-gui-+-alt-+----------space---------------+-fn---+-alt-+ctrl-' `left+down+rght' */ ) }; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - // MACRODOWN only works in this function - switch(id) { - case 0: - if (record->event.pressed) { - register_code(KC_RSFT); - } else { - unregister_code(KC_RSFT); - } - break; - } - return MACRO_NONE; -}; diff --git a/keyboards/40percentclub/mf68/mf68.h b/keyboards/40percentclub/mf68/mf68.h index a55c1d60b..a34f9cde8 100644 --- a/keyboards/40percentclub/mf68/mf68.h +++ b/keyboards/40percentclub/mf68/mf68.h @@ -1,5 +1,4 @@ -#ifndef MF68_H -#define MF68_H +#pragma once #include "quantum.h" @@ -36,5 +35,3 @@ KC_##K60, KC_##K61, KC_##K62, KC_##K63, KC_##K64, KC_##K65, KC_##K66, KC_##K67, KC_##K68, \ KC_##K70, KC_##K71, KC_##K72, KC_##K73, KC_##K74 \ ) - -#endif diff --git a/keyboards/40percentclub/mf68/rules.mk b/keyboards/40percentclub/mf68/rules.mk index 9f6445686..38c9f517b 100644 --- a/keyboards/40percentclub/mf68/rules.mk +++ b/keyboards/40percentclub/mf68/rules.mk @@ -1,4 +1,3 @@ - # MCU name MCU = atmega32u4 @@ -15,7 +14,6 @@ MCU = atmega32u4 # software delays. F_CPU = 16000000 - # # LUFA specific # @@ -39,30 +37,42 @@ F_USB = $(F_CPU) OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT -# Boot Section Size in *bytes* -# Teensy halfKay 512 -# Teensy++ halfKay 1024 -# Atmel DFU loader 4096 -# LUFA bootloader 4096 -# USBaspLoader 2048 -OPT_DEFS += -DBOOTLOADER_SIZE=4096 +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = caterina + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + # Build Options # change yes to no to disable # -BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700) -EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) -CONSOLE_ENABLE ?= yes # Console for debug(+400) -COMMAND_ENABLE ?= yes # Commands for debug and configuration +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE -SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend # if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -NKRO_ENABLE ?= no # USB Nkey Rollover -BACKLIGHT_ENABLE ?= yes # Enable keyboard backlight functionality on B7 by default -MIDI_ENABLE ?= no # MIDI controls -UNICODE_ENABLE ?= no # Unicode -BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID -AUDIO_ENABLE ?= no # Audio output on port C6 +NKRO_ENABLE = no # USB Nkey Rollover +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default +MIDI_ENABLE = no # MIDI controls +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 -LAYOUTS = 68_ansi \ No newline at end of file +LAYOUTS = 68_ansi diff --git a/keyboards/40percentclub/mf68_ble/config.h b/keyboards/40percentclub/mf68_ble/config.h index 83c0a7a5a..e7edd77fe 100644 --- a/keyboards/40percentclub/mf68_ble/config.h +++ b/keyboards/40percentclub/mf68_ble/config.h @@ -15,8 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef CONFIG_H -#define CONFIG_H +#pragma once #include "config_common.h" @@ -158,5 +157,3 @@ along with this program. If not, see . //#define NO_ACTION_ONESHOT //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION - -#endif diff --git a/keyboards/40percentclub/mf68_ble/keymaps/default/keymap.c b/keyboards/40percentclub/mf68_ble/keymaps/default/keymap.c index 73045f310..ae7e7297c 100644 --- a/keyboards/40percentclub/mf68_ble/keymaps/default/keymap.c +++ b/keyboards/40percentclub/mf68_ble/keymaps/default/keymap.c @@ -51,18 +51,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /*`ctrl-+-gui-+-alt-+----------space---------------+-fn---+-alt-+ctrl-' `left+down+rght' */ ) }; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - // MACRODOWN only works in this function - switch(id) { - case 0: - if (record->event.pressed) { - register_code(KC_RSFT); - } else { - unregister_code(KC_RSFT); - } - break; - } - return MACRO_NONE; -}; diff --git a/keyboards/40percentclub/mf68_ble/mf68_ble.h b/keyboards/40percentclub/mf68_ble/mf68_ble.h index 8ef14c98d..a34f9cde8 100644 --- a/keyboards/40percentclub/mf68_ble/mf68_ble.h +++ b/keyboards/40percentclub/mf68_ble/mf68_ble.h @@ -1,5 +1,4 @@ -#ifndef MF68_BLE_H -#define MF68_BLE_H +#pragma once #include "quantum.h" @@ -36,5 +35,3 @@ KC_##K60, KC_##K61, KC_##K62, KC_##K63, KC_##K64, KC_##K65, KC_##K66, KC_##K67, KC_##K68, \ KC_##K70, KC_##K71, KC_##K72, KC_##K73, KC_##K74 \ ) - -#endif diff --git a/keyboards/40percentclub/mf68_ble/rules.mk b/keyboards/40percentclub/mf68_ble/rules.mk index 07b59d785..2ca811833 100644 --- a/keyboards/40percentclub/mf68_ble/rules.mk +++ b/keyboards/40percentclub/mf68_ble/rules.mk @@ -1,4 +1,3 @@ - # MCU name MCU = atmega32u4 @@ -39,29 +38,42 @@ F_USB = $(F_CPU) OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT -# Boot Section Size in *bytes* -# Teensy halfKay 512 -# Teensy++ halfKay 1024 -# Atmel DFU loader 4096 -# LUFA bootloader 4096 -# USBaspLoader 2048 -OPT_DEFS += -DBOOTLOADER_SIZE=4096 +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = caterina + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + # Build Options # change yes to no to disable # -BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700) -EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) -CONSOLE_ENABLE ?= yes # Console for debug(+400) -COMMAND_ENABLE ?= yes # Commands for debug and configuration +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE -SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend # if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -NKRO_ENABLE ?= no # USB Nkey Rollover -BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality on B7 by default -MIDI_ENABLE ?= no # MIDI controls -UNICODE_ENABLE ?= no # Unicode -BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID -AUDIO_ENABLE ?= no # Audio output on port C6 -BLUETOOTH = AdafruitBLE \ No newline at end of file +NKRO_ENABLE = no # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +MIDI_ENABLE = no # MIDI controls +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 + +BLUETOOTH = AdafruitBLE diff --git a/keyboards/40percentclub/nano/config.h b/keyboards/40percentclub/nano/config.h index 088fafcaa..36840d2f6 100644 --- a/keyboards/40percentclub/nano/config.h +++ b/keyboards/40percentclub/nano/config.h @@ -15,8 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef CONFIG_H -#define CONFIG_H +#pragma once #include "config_common.h" @@ -41,5 +40,3 @@ along with this program. If not, see . #define DIODE_DIRECTION COL2ROW #define TAPPING_TERM 200 - -#endif diff --git a/keyboards/40percentclub/nano/keymaps/default/keymap.c b/keyboards/40percentclub/nano/keymaps/default/keymap.c index cd9d4549d..9ce282a28 100644 --- a/keyboards/40percentclub/nano/keymaps/default/keymap.c +++ b/keyboards/40percentclub/nano/keymaps/default/keymap.c @@ -3,7 +3,6 @@ #define _MAIN 0 #define _FN 1 -#define _______ KC_TRNS #define KC_X0 LT(_FN, KC_ESC) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { diff --git a/keyboards/40percentclub/nano/keymaps/spooka/keymap.c b/keyboards/40percentclub/nano/keymaps/spooka/keymap.c index 63b90da09..7908794fe 100644 --- a/keyboards/40percentclub/nano/keymaps/spooka/keymap.c +++ b/keyboards/40percentclub/nano/keymaps/spooka/keymap.c @@ -2,8 +2,6 @@ #define _MAIN 0 -#define _______ KC_TRNS - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_MAIN] = LAYOUT( RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, diff --git a/keyboards/40percentclub/nano/nano.h b/keyboards/40percentclub/nano/nano.h index 21d6c4f30..ae297ac12 100644 --- a/keyboards/40percentclub/nano/nano.h +++ b/keyboards/40percentclub/nano/nano.h @@ -1,5 +1,4 @@ -#ifndef NANO_H -#define NANO_H +#pragma once #include "quantum.h" @@ -10,5 +9,3 @@ { k01, k02, k03, k04 }, \ { k05, k06, k07, k08 } \ } - -#endif diff --git a/keyboards/40percentclub/nano/rules.mk b/keyboards/40percentclub/nano/rules.mk index dc510bc0d..66ad3ffc6 100644 --- a/keyboards/40percentclub/nano/rules.mk +++ b/keyboards/40percentclub/nano/rules.mk @@ -1,7 +1,4 @@ -SRC = matrix.c - # MCU name -#MCU = at90usb1287 MCU = atmega32u4 # Processor frequency. @@ -40,16 +37,28 @@ F_USB = $(F_CPU) OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT -# Boot Section Size in *bytes* -# Teensy halfKay 512 -# Teensy++ halfKay 1024 -# Atmel DFU loader 4096 -# LUFA bootloader 4096 -# USBaspLoader 2048 -OPT_DEFS += -DBOOTLOADER_SIZE=4096 +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = caterina + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + # Build Options -# change to "no" to disable the options, or define them in the Makefile in +# change to "no" to disable the options, or define them in the Makefile in # the appropriate keymap folder that will get included automatically # BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) @@ -67,4 +76,7 @@ RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +# custom matrix setup +SRC = matrix.c CUSTOM_MATRIX = yes diff --git a/keyboards/40percentclub/tomato/config.h b/keyboards/40percentclub/tomato/config.h index 185cb326c..05c83c30c 100644 --- a/keyboards/40percentclub/tomato/config.h +++ b/keyboards/40percentclub/tomato/config.h @@ -1,5 +1,4 @@ -#ifndef CONFIG_H -#define CONFIG_H +#pragma once #include "config_common.h" @@ -44,5 +43,3 @@ #define RGBLIGHT_HUE_STEP 8 #define RGBLIGHT_SAT_STEP 8 #define RGBLIGHT_VAL_STEP 8 - -#endif diff --git a/keyboards/40percentclub/tomato/keymaps/default/keymap.c b/keyboards/40percentclub/tomato/keymaps/default/keymap.c index 94bfca202..01a868d7e 100644 --- a/keyboards/40percentclub/tomato/keymaps/default/keymap.c +++ b/keyboards/40percentclub/tomato/keymaps/default/keymap.c @@ -38,7 +38,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LAYOUT_ortho_3x10 ( KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0 , KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10 - , KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_DEL, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS + , _______,_______,_______,_______,KC_DEL, _______,_______,_______,_______,_______ ), /* Level 2: Symbols Layer * ,-------------------------------------------------------------------------------. @@ -51,8 +51,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ LAYOUT_ortho_3x10 ( KC_EXLM,KC_AT, KC_HASH,KC_DLR, KC_PERC,KC_CIRC,KC_AMPR,KC_ASTR,KC_LPRN,KC_RPRN - , KC_F11, KC_F12,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_GRAVE - , KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS + , KC_F11, KC_F12,_______,_______,_______,_______,_______,_______,_______,KC_GRAVE + , _______,_______,_______,_______,_______,_______,_______,_______,_______,_______ ), /* Level 3: RGB Layer * ,-------------------------------------------------------------------------------. @@ -64,9 +64,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * '-------------------------------------------------------------------------------' */ LAYOUT_ortho_3x10 - ( KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_MINS,KC_EQL, KC_LBRC,KC_RBRC,KC_BSLS - , KC_TAB, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_COMM,KC_DOT, KC_SLSH,KC_SCLN,KC_QUOT - , KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_LEFT,KC_DOWN,KC_UP, KC_RGHT + ( _______,_______,_______,_______,_______,KC_MINS,KC_EQL, KC_LBRC,KC_RBRC,KC_BSLS + , KC_TAB, _______,_______,_______,_______,KC_COMM,KC_DOT, KC_SLSH,KC_SCLN,KC_QUOT + , _______,_______,_______,_______,_______,_______,KC_LEFT,KC_DOWN,KC_UP, KC_RGHT ), /* Level 4: RGB Layer * ,-------------------------------------------------------------------------------. @@ -78,9 +78,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * '-------------------------------------------------------------------------------' */ LAYOUT_ortho_3x10 - ( KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_UNDS,KC_PLUS,KC_LCBR,KC_RCBR,KC_PIPE - , KC_TAB, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_LT, KC_GT, KC_QUES,KC_COLN,KC_DQUO - , KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_HOME,KC_PGUP,KC_PGDN,KC_END + ( _______,_______,_______,_______,_______,KC_UNDS,KC_PLUS,KC_LCBR,KC_RCBR,KC_PIPE + , KC_TAB, _______,_______,_______,_______,KC_LT, KC_GT, KC_QUES,KC_COLN,KC_DQUO + , _______,_______,_______,_______,_______,_______,KC_HOME,KC_PGUP,KC_PGDN,KC_END ), /* Level 5: RGB Layer * ,-------------------------------------------------------------------------------. @@ -92,27 +92,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * '-------------------------------------------------------------------------------' */ LAYOUT_ortho_3x10 - ( KC_CALC,KC_WSCH,KC_MAIL,KC_MYCM,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS - , RGB_TOG,RGB_MOD,RGB_HUI,RGB_HUD,KC_NO, KC_NO, RGB_SAI,RGB_SAD,RGB_VAI,RGB_VAD - , KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS + ( KC_CALC,KC_WSCH,KC_MAIL,KC_MYCM,_______,_______,_______,_______,_______,_______ + , RGB_TOG,RGB_MOD,RGB_HUI,RGB_HUD,XXXXXXX,XXXXXXX,RGB_SAI,RGB_SAD,RGB_VAI,RGB_VAD + , _______,_______,_______,_______,RESET, _______,_______,_______,_______,_______ ), }; -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - // MACRODOWN only works in this function - switch(id) { - case 0: - if (record->event.pressed) { - register_code(KC_RSFT); - } else { - unregister_code(KC_RSFT); - } - break; - } - return MACRO_NONE; -}; - void matrix_init_user(void) { } diff --git a/keyboards/40percentclub/tomato/rules.mk b/keyboards/40percentclub/tomato/rules.mk index cbb2b0519..844ff9982 100644 --- a/keyboards/40percentclub/tomato/rules.mk +++ b/keyboards/40percentclub/tomato/rules.mk @@ -37,21 +37,37 @@ F_USB = $(F_CPU) OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT -# Boot Section Size in *bytes* +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID BOOTLOADER = caterina +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + # Build Options # comment out to disable the options. # BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = no # Console for debug(+400) -COMMAND_ENABLE = no # Commands for debug and configuration -SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend -NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality AUDIO_ENABLE = no RGBLIGHT_ENABLE = yes diff --git a/keyboards/40percentclub/tomato/tomato.h b/keyboards/40percentclub/tomato/tomato.h index f8674be40..70bffee30 100644 --- a/keyboards/40percentclub/tomato/tomato.h +++ b/keyboards/40percentclub/tomato/tomato.h @@ -1,5 +1,4 @@ -#ifndef GHERKIN_H -#define GHERKIN_H +#pragma once #include "quantum.h" @@ -14,5 +13,3 @@ { K30, K31, K32, K33, K34, K35 }, \ { K40, K41, K42, K43, K44, K45 } \ } - -#endif diff --git a/keyboards/40percentclub/ut47/config.h b/keyboards/40percentclub/ut47/config.h index 4335e3edd..cd55e4d73 100644 --- a/keyboards/40percentclub/ut47/config.h +++ b/keyboards/40percentclub/ut47/config.h @@ -15,8 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef CONFIG_H -#define CONFIG_H +#pragma once #include "config_common.h" @@ -83,5 +82,3 @@ along with this program. If not, see . # else # error "USART configuration is needed." #endif - -#endif diff --git a/keyboards/40percentclub/ut47/keymaps/default/config.h b/keyboards/40percentclub/ut47/keymaps/default/config.h index 46098a22f..f88ebf7e8 100644 --- a/keyboards/40percentclub/ut47/keymaps/default/config.h +++ b/keyboards/40percentclub/ut47/keymaps/default/config.h @@ -14,11 +14,8 @@ * along with this program. If not, see . */ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H +#pragma once #include "config_common.h" // place overrides here - -#endif diff --git a/keyboards/40percentclub/ut47/keymaps/default/keymap.c b/keyboards/40percentclub/ut47/keymaps/default/keymap.c index 6b6bb025b..0fa7838df 100644 --- a/keyboards/40percentclub/ut47/keymaps/default/keymap.c +++ b/keyboards/40percentclub/ut47/keymaps/default/keymap.c @@ -18,7 +18,6 @@ #include "protocol/serial.h" #endif -#define _______ KC_TRNS #define LT3_TAB LT(3, KC_TAB) #define MT_RSFT_ENT MT(MOD_RSFT, KC_ENT) diff --git a/keyboards/40percentclub/ut47/keymaps/non-us/config.h b/keyboards/40percentclub/ut47/keymaps/non-us/config.h index 46098a22f..f88ebf7e8 100644 --- a/keyboards/40percentclub/ut47/keymaps/non-us/config.h +++ b/keyboards/40percentclub/ut47/keymaps/non-us/config.h @@ -14,11 +14,8 @@ * along with this program. If not, see . */ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H +#pragma once #include "config_common.h" // place overrides here - -#endif diff --git a/keyboards/40percentclub/ut47/keymaps/non-us/keymap.c b/keyboards/40percentclub/ut47/keymaps/non-us/keymap.c index 1cb537b7d..0c1c2e759 100644 --- a/keyboards/40percentclub/ut47/keymaps/non-us/keymap.c +++ b/keyboards/40percentclub/ut47/keymaps/non-us/keymap.c @@ -18,7 +18,6 @@ #include "protocol/serial.h" #endif -#define _______ KC_TRNS #define LT3_TAB LT(3, KC_TAB) #define MT_RSFT_ENT MT(MOD_RSFT, KC_ENT) diff --git a/keyboards/40percentclub/ut47/keymaps/nordic/keymap.c b/keyboards/40percentclub/ut47/keymaps/nordic/keymap.c index cc3f43650..f3e297ec0 100644 --- a/keyboards/40percentclub/ut47/keymaps/nordic/keymap.c +++ b/keyboards/40percentclub/ut47/keymaps/nordic/keymap.c @@ -21,7 +21,6 @@ #include "keymap_norwegian.h" -#define _______ KC_TRNS #define LT3_TAB LT(3, KC_TAB) #define MT_RSFT_ENT MT(MOD_RSFT, KC_ENT) #define CTRADEL LALT(LCTL(KC_DEL)) diff --git a/keyboards/40percentclub/ut47/keymaps/rgb/config.h b/keyboards/40percentclub/ut47/keymaps/rgb/config.h index 0eb010a3a..791147b5b 100644 --- a/keyboards/40percentclub/ut47/keymaps/rgb/config.h +++ b/keyboards/40percentclub/ut47/keymaps/rgb/config.h @@ -14,8 +14,7 @@ * along with this program. If not, see . */ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H +#pragma once #include "config_common.h" @@ -23,5 +22,3 @@ #define RGBLIGHT_ANIMATIONS #define RGB_DI_PIN D3 // The pin the LED strip is connected to #define RGBLED_NUM 7 // Number of LEDs in your strip - -#endif diff --git a/keyboards/40percentclub/ut47/keymaps/rgb/keymap.c b/keyboards/40percentclub/ut47/keymaps/rgb/keymap.c index 58d11031a..77fa5b401 100644 --- a/keyboards/40percentclub/ut47/keymaps/rgb/keymap.c +++ b/keyboards/40percentclub/ut47/keymaps/rgb/keymap.c @@ -18,7 +18,6 @@ #include "protocol/serial.h" #endif -#define _______ KC_TRNS #define LT3_TAB LT(3, KC_TAB) #define MT_RSFT_ENT MT(MOD_RSFT, KC_ENT) diff --git a/keyboards/40percentclub/ut47/rules.mk b/keyboards/40percentclub/ut47/rules.mk index b04659866..7495f5edd 100644 --- a/keyboards/40percentclub/ut47/rules.mk +++ b/keyboards/40percentclub/ut47/rules.mk @@ -1,5 +1,4 @@ # MCU name -#MCU = at90usb1286 MCU = atmega32u4 # Processor frequency. @@ -38,12 +37,26 @@ F_USB = $(F_CPU) # Interrupt driven control endpoint task(+60) OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT -# Bootloader + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID BOOTLOADER = caterina -# custom matrix setup -CUSTOM_MATRIX = yes -SRC += matrix.c protocol/serial_uart.c + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + # Build Options # change yes to no to disable @@ -51,12 +64,12 @@ SRC += matrix.c protocol/serial_uart.c BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) MOUSEKEY_ENABLE = yes # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = no # Console for debug(+400) +CONSOLE_ENABLE = no # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend # if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -NKRO_ENABLE = yes # USB Nkey Rollover +NKRO_ENABLE = yes # USB Nkey Rollover BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) UNICODE_ENABLE = no # Unicode @@ -64,6 +77,10 @@ BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID AUDIO_ENABLE = no # Audio output on port C6 FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +# custom matrix setup +CUSTOM_MATRIX = yes +SRC += matrix.c protocol/serial_uart.c + ifeq ($(strip $(LED_ENABLE)), yes) OPT_DEFS += -DLED_ENABLE SRC += led.c diff --git a/keyboards/40percentclub/ut47/ut47.h b/keyboards/40percentclub/ut47/ut47.h index a4507dd34..f6456fe91 100644 --- a/keyboards/40percentclub/ut47/ut47.h +++ b/keyboards/40percentclub/ut47/ut47.h @@ -13,8 +13,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#ifndef UT47_H -#define UT47_H +#pragma once #include "quantum.h" @@ -45,5 +44,3 @@ ) #define LAYOUT_kc_ut47 LAYOUT_kc - -#endif From b26ccf9a2f7f070ee3a91456757dc463e46dfe10 Mon Sep 17 00:00:00 2001 From: Logan Bussell <36081148+lbussell@users.noreply.github.com> Date: Mon, 12 Nov 2018 15:04:12 -0500 Subject: [PATCH 497/788] Add rules.mk to ortho_4x12/buswerks keymap (#4405) * Added buswerks keymap * cleaned up comments on buswerks keymap * Added buswerks keymap readme.md * Fixed spelling in buswerks readme.md * Removed unnecessary includes, changed process_record_user to now use set_single_persistent_default_layer(), removed deprecated functions, and moved the audio ifdef block to config.h * Changed buswerks ortho_4x12 layout to accommodate 'MIT' layout * Updated README.md to reflect layout changes * update buswerks keymap * add buswerks tragicforce68 keymap --- .../tragicforce68/keymaps/buswerks/keymap.c | 60 +++++++++++++++++++ .../community/ortho_4x12/buswerks/keymap.c | 56 ++++++++++++----- .../community/ortho_4x12/buswerks/rules.mk | 9 +++ 3 files changed, 109 insertions(+), 16 deletions(-) create mode 100644 keyboards/tragicforce68/keymaps/buswerks/keymap.c create mode 100644 layouts/community/ortho_4x12/buswerks/rules.mk diff --git a/keyboards/tragicforce68/keymaps/buswerks/keymap.c b/keyboards/tragicforce68/keymaps/buswerks/keymap.c new file mode 100644 index 000000000..d74c0186d --- /dev/null +++ b/keyboards/tragicforce68/keymaps/buswerks/keymap.c @@ -0,0 +1,60 @@ +#include QMK_KEYBOARD_H + +#define _QWERTY 0 +#define _COLEMAK 1 +#define _FN1 2 + +#define WORD_L LALT(KC_LEFT) +#define WORD_R LALT(KC_RGHT) +#define LINE_L LGUI(KC_LEFT) +#define LINE_R LGUI(KC_RGHT) + +#define DESK_L LCTL(KC_LEFT) +#define DESK_R LCTL(KC_RGHT) +#define MSN_CTL LCTL(KC_UP) + +#define LT_FN LT(_FN1, KC_ESC) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_QWERTY] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────────────┐ ┌────────┬────────┐ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_PGUP, + //├────────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────────────┤ ├────────┼────────┤ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_PGDN, + //├────────────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴────────────┤ └────────┴────────┘ + LT_FN, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENTER, + //├──────────────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───────────────────┤ ┌────────┐ + KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, KC_UP, + //├──────────┬───────┴──┬─────┴────┬───┴────────┴────────┴────────┴────────┴────────┴──────┬─┴────────┼────────┴─┬──────────┬────┬──────┴─┬────────┼────────┐ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPACE, KC_RALT, KC_CAPS, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + //└──────────┴──────────┴──────────┴───────────────────────────────────────────────────────┴──────────┴──────────┴──────────┘ └────────┴────────┴────────┘ + ), + + [_COLEMAK] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────────────┐ ┌────────┬────────┐ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_PGUP, + //├────────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────────────┤ ├────────┼────────┤ + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_PGDN, + //├────────────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴────────────┤ └────────┴────────┘ + LT_FN, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENTER, + //├──────────────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───────────────────┤ ┌────────┐ + KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, KC_UP, + //├──────────┬───────┴──┬─────┴────┬───┴────────┴────────┴────────┴────────┴────────┴──────┬─┴────────┼────────┴─┬──────────┬────┬──────┴─┬────────┼────────┐ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPACE, KC_RALT, KC_CAPS, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + //└──────────┴──────────┴──────────┴───────────────────────────────────────────────────────┴──────────┴──────────┴──────────┘ └────────┴────────┴────────┘ + ), + + [_FN1] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────────────┐ ┌────────┬────────┐ + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, RESET, KC_HOME, + //├────────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────────────┤ ├────────┼────────┤ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_END, + //├────────────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴────────────┤ └────────┴────────┘ + _______, DESK_L, MSN_CTL, DESK_R, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, _______, + //├──────────────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───────────────────┤ ┌────────┐ + _______, _______, _______, _______, _______, _______, LINE_L, WORD_L, WORD_R, LINE_R, _______, _______, BL_INC, + //├──────────┬───────┴──┬─────┴────┬───┴────────┴────────┴────────┴────────┴────────┴──────┬─┴────────┼────────┴─┬──────────┬────┬──────┴─┬────────┼────────┐ + _______, _______, _______, KC_BSPC, _______, _______, KC_MENU, BL_BRTG, BL_DEC, BL_TOGG + //└──────────┴──────────┴──────────┴───────────────────────────────────────────────────────┴──────────┴──────────┴──────────┘ └────────┴────────┴────────┘ + ) +}; \ No newline at end of file diff --git a/layouts/community/ortho_4x12/buswerks/keymap.c b/layouts/community/ortho_4x12/buswerks/keymap.c index c05c26418..72c592a0c 100644 --- a/layouts/community/ortho_4x12/buswerks/keymap.c +++ b/layouts/community/ortho_4x12/buswerks/keymap.c @@ -7,6 +7,7 @@ extern keymap_config_t keymap_config; #define _DVORAK 2 #define _LOWER 3 #define _RAISE 4 +#define _MOUSE 5 #define _ADJUST 16 enum custom_keycodes { @@ -15,7 +16,7 @@ enum custom_keycodes { DVORAK, LOWER, RAISE, - NAV, + MOUSE, ADJUST, }; @@ -29,15 +30,26 @@ enum custom_keycodes { #define KC_LOWR LOWER #define KC_RASE RAISE #define KC_ADJ ADJUST +#define MOUSE TG(_MOUSE) #define DESK_L LCTL(KC_LEFT) #define DESK_R LCTL(KC_RGHT) #define MSN_CTL LCTL(KC_UP) #define APP_WND LCTL(KC_DOWN) +#define SWITCHR LGUI(KC_TAB) + +#define WORD_L LALT(KC_LEFT) +#define WORD_R LALT(KC_RGHT) +#define LINE_L LGUI(KC_LEFT) +#define LINE_R LGUI(KC_RGHT) + +#define COPY LGUI(KC_C) +#define CUT LGUI(KC_X) +#define PASTE LGUI(KC_V) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[_QWERTY] = LAYOUT_ortho_4x12( \ +[_QWERTY] = LAYOUT_ortho_4x12( // .--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------. KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I, KC_O , KC_P , KC_BSPC, \ // |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| @@ -45,7 +57,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| KC_LSPO, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, KC_RSPC, \ // |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER , KC_SPC , KC_SPC , RSE_ENT, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT \ + KC_LCTL, KC_HYPR, MOUSE , KC_LALT, LOWER , KC_SPC , KC_SPC , RSE_ENT, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT \ // '--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------' ), @@ -57,7 +69,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| KC_LSPO, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_K , KC_M , KC_COMM, KC_DOT , KC_SLSH, KC_RSPC, \ // |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER , KC_SPC , KC_SPC , RSE_ENT, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT \ + KC_LCTL, KC_HYPR, MOUSE , KC_LALT, LOWER , KC_SPC , KC_SPC , RSE_ENT, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT \ // '--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------' ), @@ -69,38 +81,50 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT , \ // |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER , KC_SPC , KC_SPC , RSE_ENT, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT \ + KC_LCTL, KC_HYPR, MOUSE , KC_LALT, LOWER , KC_SPC , KC_SPC , RSE_ENT, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT \ // '--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------' ), [_LOWER] = LAYOUT_ortho_4x12( \ // .--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------. - KC_TILD, _______, KC_VOLD, MSN_CTL, KC_VOLU, _______, _______, KC_7, KC_8, KC_9, KC_MINS, KC_BSPC, \ + SWITCHR, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_7, KC_8, KC_9, KC_MINS, _______, \ // |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - _______, _______, DESK_L , APP_WND, DESK_R , _______, _______, KC_4, KC_5, KC_6, KC_PLUS, KC_PIPE, \ + KC_TILD, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_4, KC_5, KC_6, KC_PLUS, KC_PIPE, \ // |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - KC_LBRC, _______, _______, _______, _______, _______, _______, KC_1, KC_2, KC_3, KC_SLSH, KC_RBRC, \ + _______, _______, _______, KC_UNDS, KC_EQL, _______, _______, KC_1, KC_2, KC_3, _______, _______, \ // |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - _______, _______, _______, _______, _______, _______, _______, KC_0, _______, _______, _______, _______ \ + _______, _______, _______, _______, _______, _______, _______, KC_0, KC_DOT, KC_COMM, _______, _______ \ // '--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------' ), [_RAISE] = LAYOUT_ortho_4x12( \ // .--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------. - KC_GRV, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ + KC_GRV, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_UNDS, KC_EQL, KC_DEL, \ // |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT, _______, KC_BSLS, \ + _______, _______, KC_LBRC, KC_LCBR, KC_RCBR, KC_RBRC, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, KC_BSLS, \ // |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - KC_LCBR, KC_CIRC, KC_ASTR, KC_UNDS, KC_EQL, KC_AMPR, KC_HOME, KC_PGDN, KC_PGUP, KC_END, _______, KC_RCBR, \ + _______, _______, _______, _______, _______, _______, LINE_L, WORD_L, WORD_R, LINE_R, _______, _______, \ // |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_VOLU, KC_MNXT \ + // '--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------' +), + +[_MOUSE] = LAYOUT_ortho_4x12( \ + // .--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------. + SWITCHR, _______, _______, KC_MS_U, _______, _______, _______, KC_ACL0, KC_ACL1, KC_ACL2, _______, _______, \ + // |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + _______, _______, KC_MS_L, KC_MS_D, KC_MS_R, _______, _______, KC_BTN1, KC_BTN2, KC_BTN3, _______, _______, \ + // |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + _______, _______, _______, KC_WH_U, KC_WH_D, COPY, PASTE, KC_BTN4, KC_BTN5, _______, _______, _______, \ + // |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + _______, _______, MOUSE , _______, _______, KC_SPC, KC_SPC, KC_ENT, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT \ // '--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------' ), [_ADJUST] = LAYOUT_ortho_4x12( \ - KC_F11, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F12, \ - _______, _______, RESET, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, QWERTY, COLEMAK, DVORAK, RESET, _______, _______, _______, _______, AG_NORM, AG_SWAP, _______, \ + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, _______, _______, AU_OFF , AU_ON , _______, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ ) diff --git a/layouts/community/ortho_4x12/buswerks/rules.mk b/layouts/community/ortho_4x12/buswerks/rules.mk new file mode 100644 index 000000000..72f825732 --- /dev/null +++ b/layouts/community/ortho_4x12/buswerks/rules.mk @@ -0,0 +1,9 @@ +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +TAP_DANCE_ENABLE = no +AUDIO_ENABLE = yes + +MACROS_ENABLED = no \ No newline at end of file From 2509039abfc5f59d791c8e061641b6fc2e63a69b Mon Sep 17 00:00:00 2001 From: Daniel Shields Date: Mon, 12 Nov 2018 12:02:51 +0000 Subject: [PATCH 498/788] Add missing arm gcc compiler for openSUSE 15.0 and Tumbleweed. --- util/linux_install.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/util/linux_install.sh b/util/linux_install.sh index 971d4c543..0e8296c0d 100755 --- a/util/linux_install.sh +++ b/util/linux_install.sh @@ -112,12 +112,15 @@ elif grep ID /etc/os-release | grep -q sabayon; then elif grep ID /etc/os-release | grep -qE "opensuse|tumbleweed"; then CROSS_AVR_GCC=cross-avr-gcc8 + CROSS_ARM_GCC=cross-arm-none-gcc8 if grep ID /etc/os-release | grep -q "15.0"; then CROSS_AVR_GCC=cross-avr-gcc7 + CROSS_ARM_GCC=cross-arm-none-gcc7 fi sudo zypper install \ avr-libc \ $CROSS_AVR_GCC \ + $CROSS_ARM_GCC \ cross-avr-binutils \ cross-arm-none-newlib-devel \ cross-arm-binutils cross-arm-none-newlib-devel \ From b1e74aee43596e2601248b0a78b2c54c897ce78b Mon Sep 17 00:00:00 2001 From: Michael Kaylan <1063516+kaylanm@users.noreply.github.com> Date: Mon, 12 Nov 2018 11:20:56 -0500 Subject: [PATCH 499/788] Make sure that avr-gcc@7 gets linked into the path on MacOS. --- docs/faq_build.md | 2 +- docs/getting_started_build_tools.md | 1 + util/macos_install.sh | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/faq_build.md b/docs/faq_build.md index 465a283ae..14c61a1e9 100644 --- a/docs/faq_build.md +++ b/docs/faq_build.md @@ -126,5 +126,5 @@ For now, you need to rollback avr-gcc to 7 in brew. ``` brew uninstall --force avr-gcc brew install avr-gcc@7 -brew link avr-gcc@7 +brew link --force avr-gcc@7 ``` diff --git a/docs/getting_started_build_tools.md b/docs/getting_started_build_tools.md index 587dece4a..67bbe5434 100644 --- a/docs/getting_started_build_tools.md +++ b/docs/getting_started_build_tools.md @@ -57,6 +57,7 @@ If you're using [homebrew,](http://brew.sh/) you can use the following commands: brew tap PX4/homebrew-px4 brew update brew install avr-gcc@7 + brew link --force avr-gcc@7 brew install dfu-programmer brew install dfu-util brew install gcc-arm-none-eabi diff --git a/util/macos_install.sh b/util/macos_install.sh index c31be99d2..d2629a8cb 100755 --- a/util/macos_install.sh +++ b/util/macos_install.sh @@ -23,3 +23,4 @@ brew tap osx-cross/avr brew tap PX4/homebrew-px4 brew update brew install avr-gcc@7 gcc-arm-none-eabi dfu-programmer avrdude dfu-util +brew link --force avr-gcc@7 From aa03049015855cdd5f61e6e8a7c6955abc5d3141 Mon Sep 17 00:00:00 2001 From: comaid <44457151+comaid@users.noreply.github.com> Date: Tue, 13 Nov 2018 05:19:29 +0900 Subject: [PATCH 500/788] Fix up screen off timer of crkbd (#4346) * fix about screen off timer * Fix Up ScreenOffInterval exceeded uint16_t * Fix Up never waking up once screen off if in case of matrix are not dirty. * Revert "fix about screen off timer" This reverts commit 3d175f2340c14250a71af78afec5a1e890d9f4e7. * Fix up screen off timer of crkbd * Fix Up ScreenOffInterval exceeded uint16_t * Fix Up never waking up once screen off if in case of matrix are not dirty. * Fix up screen off timer of helix * Fix Up ScreenOffInterval exceeded uint16_t * Fix Up never waking up once screen off if in case of matrix are not dirty * Revert "Fix up screen off timer of helix" This reverts commit f0efb82443a7dc34b75579359b0514e8bfa51100. * Improve internal processing of process_record_kb() * Use the return value of process_record_gfx() * Fix a indent Fix a indent --- keyboards/crkbd/crkbd.c | 5 +++++ keyboards/crkbd/ssd1306.c | 16 ++++++++++++++-- keyboards/crkbd/ssd1306.h | 3 +++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/keyboards/crkbd/crkbd.c b/keyboards/crkbd/crkbd.c index 5e8ba8bac..32f7af776 100644 --- a/keyboards/crkbd/crkbd.c +++ b/keyboards/crkbd/crkbd.c @@ -1 +1,6 @@ #include "crkbd.h" +#include "ssd1306.h" + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + return process_record_gfx(keycode,record) && process_record_user(keycode, record); +} \ No newline at end of file diff --git a/keyboards/crkbd/ssd1306.c b/keyboards/crkbd/ssd1306.c index 205ce67a9..4330c8497 100644 --- a/keyboards/crkbd/ssd1306.c +++ b/keyboards/crkbd/ssd1306.c @@ -24,12 +24,17 @@ static const unsigned char font[] PROGMEM; //static uint16_t last_battery_update; //static uint32_t vbat; //#define BatteryUpdateInterval 10000 /* milliseconds */ -#define ScreenOffInterval 300000 /* milliseconds */ + +// 'last_flush' is declared as uint16_t, +// so this must be less than 65535 +#define ScreenOffInterval 60000 /* milliseconds */ #if DEBUG_TO_SCREEN static uint8_t displaying; #endif static uint16_t last_flush; +static bool force_dirty = true; + // Write command sequence. // Returns true on success. static inline bool _send_cmd1(uint8_t cmd) { @@ -321,12 +326,19 @@ void iota_gfx_task_user(void) { void iota_gfx_task(void) { iota_gfx_task_user(); - if (display.dirty) { + if (display.dirty|| force_dirty) { iota_gfx_flush(); + force_dirty = false; } if (timer_elapsed(last_flush) > ScreenOffInterval) { iota_gfx_off(); } } + +bool process_record_gfx(uint16_t keycode, keyrecord_t *record) { + force_dirty = true; + return true; +} + #endif diff --git a/keyboards/crkbd/ssd1306.h b/keyboards/crkbd/ssd1306.h index 76dd6a2a7..ea8c92328 100644 --- a/keyboards/crkbd/ssd1306.h +++ b/keyboards/crkbd/ssd1306.h @@ -3,6 +3,7 @@ #include #include #include "pincontrol.h" +#include "action.h" enum ssd1306_cmds { DisplayOff = 0xAE, @@ -86,3 +87,5 @@ void matrix_write(struct CharacterMatrix *matrix, const char *data); void matrix_write_ln(struct CharacterMatrix *matrix, const char *data); void matrix_write_P(struct CharacterMatrix *matrix, const char *data); void matrix_render(struct CharacterMatrix *matrix); + +bool process_record_gfx(uint16_t keycode, keyrecord_t *record); \ No newline at end of file From 2b7decbaeb020c5320ada182552e633deec77ff7 Mon Sep 17 00:00:00 2001 From: comaid <44457151+comaid@users.noreply.github.com> Date: Tue, 13 Nov 2018 05:20:50 +0900 Subject: [PATCH 501/788] Fix up screen off timer of helix (#4347) * Fix up screen off timer of helix * Fix Up ScreenOffInterval exceeded uint16_t * Fix Up never waking up once screen off if in case of matrix are not dirty * Changing referenIng incorrect constant name * OLED_ENABLED => SSD1306OLED * Improve internal processing of process_record_kb() * Use the return value of process_record_gfx() * Move a include statement into #ifdef block Move #include "ssd1306.h` statement into #ifdef block * Move process_record_kbI() Move process_record_kb() from helix.c to rev1.c/rev2.c/pico.c * Move process_record_kb() --- keyboards/helix/pico/pico.c | 6 ++++++ keyboards/helix/rev1/rev1.c | 6 ++++++ keyboards/helix/rev2/rev2.c | 6 ++++++ keyboards/helix/ssd1306.c | 17 +++++++++++++++-- keyboards/helix/ssd1306.h | 3 ++- 5 files changed, 35 insertions(+), 3 deletions(-) diff --git a/keyboards/helix/pico/pico.c b/keyboards/helix/pico/pico.c index 5e248ccff..bb8ba9ca2 100644 --- a/keyboards/helix/pico/pico.c +++ b/keyboards/helix/pico/pico.c @@ -2,6 +2,12 @@ #ifdef SSD1306OLED +#include "ssd1306.h" + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + return process_record_gfx(keycode,record) && process_record_user(keycode, record); +} + void led_set_kb(uint8_t usb_led) { // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here //led_set_user(usb_led); diff --git a/keyboards/helix/rev1/rev1.c b/keyboards/helix/rev1/rev1.c index d7ea9b723..309cca010 100644 --- a/keyboards/helix/rev1/rev1.c +++ b/keyboards/helix/rev1/rev1.c @@ -2,6 +2,12 @@ #ifdef SSD1306OLED +#include "ssd1306.h" + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + return process_record_gfx(keycode,record) && process_record_user(keycode, record); +} + void led_set_kb(uint8_t usb_led) { // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here led_set_user(usb_led); diff --git a/keyboards/helix/rev2/rev2.c b/keyboards/helix/rev2/rev2.c index 75765f1d3..abaa02cdb 100644 --- a/keyboards/helix/rev2/rev2.c +++ b/keyboards/helix/rev2/rev2.c @@ -2,6 +2,12 @@ #ifdef SSD1306OLED +#include "ssd1306.h" + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + return process_record_gfx(keycode,record) && process_record_user(keycode, record); +} + void led_set_kb(uint8_t usb_led) { // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here //led_set_user(usb_led); diff --git a/keyboards/helix/ssd1306.c b/keyboards/helix/ssd1306.c index b3e55a67c..dd3290ba0 100644 --- a/keyboards/helix/ssd1306.c +++ b/keyboards/helix/ssd1306.c @@ -1,3 +1,4 @@ + #ifdef SSD1306OLED #include "ssd1306.h" @@ -27,12 +28,17 @@ //static uint16_t last_battery_update; //static uint32_t vbat; //#define BatteryUpdateInterval 10000 /* milliseconds */ -#define ScreenOffInterval 300000 /* milliseconds */ + +// 'last_flush' is declared as uint16_t, +// so this must be less than 65535 +#define ScreenOffInterval 60000 /* milliseconds */ #if DEBUG_TO_SCREEN static uint8_t displaying; #endif static uint16_t last_flush; +static bool force_dirty = true; + // Write command sequence. // Returns true on success. static inline bool _send_cmd1(uint8_t cmd) { @@ -318,12 +324,19 @@ void iota_gfx_task_user(void) { void iota_gfx_task(void) { iota_gfx_task_user(); - if (display.dirty) { + if (display.dirty|| force_dirty) { iota_gfx_flush(); + force_dirty = false; } if (timer_elapsed(last_flush) > ScreenOffInterval) { iota_gfx_off(); } } + +bool process_record_gfx(uint16_t keycode, keyrecord_t *record) { + force_dirty = true; + return true; +} + #endif diff --git a/keyboards/helix/ssd1306.h b/keyboards/helix/ssd1306.h index 77ce7c211..9cf6983b7 100644 --- a/keyboards/helix/ssd1306.h +++ b/keyboards/helix/ssd1306.h @@ -4,6 +4,7 @@ #include #include #include "pincontrol.h" +#include "action.h" enum ssd1306_cmds { DisplayOff = 0xAE, @@ -87,6 +88,6 @@ void matrix_write(struct CharacterMatrix *matrix, const char *data); void matrix_write_P(struct CharacterMatrix *matrix, const char *data); void matrix_render(struct CharacterMatrix *matrix); - +bool process_record_gfx(uint16_t keycode, keyrecord_t *record); #endif From d0f8e1babee406af6c17759200173109705a35e3 Mon Sep 17 00:00:00 2001 From: mtei <2170248+mtei@users.noreply.github.com> Date: Thu, 25 Oct 2018 02:03:29 +0900 Subject: [PATCH 502/788] modify quantum/template/avr/config.h: add rgblight effect configurations --- quantum/template/avr/config.h | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/quantum/template/avr/config.h b/quantum/template/avr/config.h index 56395f376..463ddff2d 100644 --- a/quantum/template/avr/config.h +++ b/quantum/template/avr/config.h @@ -54,11 +54,24 @@ along with this program. If not, see . // #define RGB_DI_PIN E2 // #ifdef RGB_DI_PIN -// #define RGBLIGHT_ANIMATIONS -// #define RGBLED_NUM 16 -// #define RGBLIGHT_HUE_STEP 8 -// #define RGBLIGHT_SAT_STEP 8 -// #define RGBLIGHT_VAL_STEP 8 +// #define RGBLED_NUM 16 +// #define RGBLIGHT_HUE_STEP 8 +// #define RGBLIGHT_SAT_STEP 8 +// #define RGBLIGHT_VAL_STEP 8 +// #define RGBLIGHT_LIMIT_VAL 255 /* The maximum brightness level */ +// #define RGBLIGHT_SLEEP /* If defined, the RGB lighting will be switched off when the host goes to sleep */ +// /*== all animations enable ==*/ +// #define RGBLIGHT_ANIMATIONS +// /*== or choose animations ==*/ +// #define RGBLIGHT_EFFECT_BREATHING +// #define RGBLIGHT_EFFECT_RAINBOW_MOOD +// #define RGBLIGHT_EFFECT_RAINBOW_SWIRL +// #define RGBLIGHT_EFFECT_SNAKE +// #define RGBLIGHT_EFFECT_KNIGHT +// #define RGBLIGHT_EFFECT_CHRISTMAS +// #define RGBLIGHT_EFFECT_STATIC_GRADIENT +// #define RGBLIGHT_EFFECT_RGB_TEST +// #define RGBLIGHT_EFFECT_ALTERNATING // #endif /* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ From 2b3473455cb366888cdb62e8e570d24444173a01 Mon Sep 17 00:00:00 2001 From: Junya Ogura Date: Thu, 8 Nov 2018 02:58:51 +0900 Subject: [PATCH 503/788] Change hex file permission to 644 from 755 --- util/bootloader_atmega32u4_1_0_0.hex | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 util/bootloader_atmega32u4_1_0_0.hex diff --git a/util/bootloader_atmega32u4_1_0_0.hex b/util/bootloader_atmega32u4_1_0_0.hex old mode 100755 new mode 100644 From 599b21b9f4b450392380870675b136449839f6e5 Mon Sep 17 00:00:00 2001 From: QMK Bot Date: Mon, 12 Nov 2018 20:51:24 +0000 Subject: [PATCH 504/788] convert to unix line-endings [skip ci] --- util/bootloader_atmega32u4_1_0_0.hex | 506 +++++++++++++-------------- 1 file changed, 253 insertions(+), 253 deletions(-) diff --git a/util/bootloader_atmega32u4_1_0_0.hex b/util/bootloader_atmega32u4_1_0_0.hex index 275aeacba..20174989a 100644 --- a/util/bootloader_atmega32u4_1_0_0.hex +++ b/util/bootloader_atmega32u4_1_0_0.hex @@ -1,253 +1,253 @@ -:020000020000FC -:047000000C948D3E21 -:047028000C94B73DD0 -:10702F0012010002FF010020EB03F42F0000010208 -:10703F00030109021200010100803209040000005F -:10704F00000000000C03410054004D0045004C00AF -:10705F001603410054006D00330032005500340018 -:10706F004400460055000C0331002E0030002E0066 -:10707F0030000403090416010C0100000C0000018C -:02708F006C7F14 -:1070920012BD01BDF89A00B5089501E00895F9996D -:1070A200FECF12BD01BD20BDFA9AF99AF6CFF99929 -:1070B200FECF0C944938F80104910895F8013491F7 -:1070C20031962491890108950091610000930C0189 -:1070D20000E80093610001E00093610005BF02E057 -:1070E20005BF0C9486380091D70001600093D70049 -:1070F200A89507EF04BF0091600000610093600053 -:1071020000E00093600001E008950E94AA3D0E9401 -:10711200B53DFDCF0CD00F7708D0006806D00061D6 -:1071220004D0016028D0789408950093D80000918B -:10713200D8000895FCDF00621ED04CD009B500FFD4 -:10714200FDCFF5DF0F7D17D00091E0000E7F009399 -:10715200E0000091E000077F0093E0000091E20070 -:1071620001600093E2000091E20008600093E200F7 -:1071720078940C94743B0093D800089500910D010B -:10718200002359F40091D90000FF07C0D0DF006846 -:10719200F2DF01E000930D01CDDFE0E2F2E00081D9 -:1071A200018100FF0DC0008111811E7F11830083C8 -:1071B20001E00093EA0000E00093EA0000931E025F -:1071C20000E00093E9000091E80003FF02C00E9482 -:1071D200F23B0895A89539D000E40093600000E0E6 -:1071E200009381000093800010E0009385000093DB -:1071F200840001E006BB00918100036000938100DE -:107202000091600007FFFCCF00E80093600010933C -:107212008100A89507EF04BF18D010936000209159 -:1072220084003091850010938100109380001093A8 -:1072320085001093840001E006BB2D3D354010F01F -:1072420002E101C002E009BD089500916000006101 -:107252000093600008950E94AD3E239741D100E063 -:1072620000930901B5D104811581012B51F437D165 -:1072720000910701002309F4B9C000E0009307015F -:10728200B5C058D102FFFDCF37D1068335D1009367 -:107292000F0132D1009310012FD1009311012CD193 -:1072A2000093120129D10093130102852091130149 -:1072B20030911201409111015091100116811A95DD -:1072C20041F01250A9F01A9599F11A9509F473C078 -:1072D2008BC010910F01113011F411E001C010E0C8 -:1072E200138799D00C3F11F414D17FC077D17DC0A0 -:1072F20092D010910F01112329F01A9549F01A9595 -:10730200A9F073C010E013870C3F09F06EC0ECCFF8 -:1073120056D103C04CD109F468C00D911C9144D1DF -:107322000F3FC1F305E0009309015FC011E0EBCF0D -:10733200D2D029F00250E1F10A9541F056C0FDD0B9 -:107342000E94A33F0FEF00930A014FC0552319F08B -:107352005A9579F04AC04ED00DEF04BF74D0EAD0EE -:1073620003FFFDCF67D051D04AD008E00093600000 -:10737200FFCF40D068D0DED003FFFDCF5BD03FD03F -:1073820044D00FEF1FE004C009811A810150104060 -:1073920009831A8309811A81012BB1F700E800934E -:1073A200610000910C01009361000C940000FFCF7A -:1073B20001E003871AC08FD019F00A9539F015C081 -:1073C200535098F4BAD002E000870FC0505339F0FE -:1073D2005A9541F05F52B1F35A95A1F306C002E00B -:1073E2000883F0CF01E0FCCFA8D079D02396E4E067 -:1073F2000C94BA3E01E005BF00E005BF089500917C -:10740200D8000F770093D800089509B50D7F09BD04 -:1074120000E009BD08955183408333832283109194 -:10742200E8001B7F1093E8001091E8001F7710938B -:10743200E80008955DD053D0F8940091E000016017 -:107442000093E000089579D04AC0219749D0009175 -:107452000601035019F00250B9F00BC03CD021F0E4 -:107462000A9559F00A9529F400910A010C3F19F482 -:1074720050D02196089567D0FCCF0091010100936E -:10748200F100009100010AC01091100124D019F0FE -:107492000A9549F0EECF135018F400E00093F10082 -:1074A2001ED044D0E6CF105339F01A9539F01F524E -:1074B20041F01A9541F0F4CF08E5F0CF00E006D094 -:1074C200EDCF02E0FCCF04E001D0E8CF10E020E0F5 -:1074D20030E00C94113F00910F010023089521C068 -:1074E2000BD008D007D00093040106D00093050109 -:1074F20021D00BC000D008830091F10008950091C3 -:10750200EB0000620093EB0015D0077F0093E800C8 -:107512000895F5DF02E00093080103E000930901FA -:10752200089559D007D000FFFDCF089503D002FF80 -:10753200FDCF03C00091E8000895FCDF0B7FE6DF7A -:10754200F9DF0F77E3CF0E94AC3E42D038D006C0BD -:107552002BD00093F1002BD059F43DD0082F092BEA -:10756200A9F0E8DF02FD12C0E5DF00FFFDCF4424F1 -:10757200042D4394003289F300910B0100230D91F5 -:107582001C9131F311970E945838E3CFD3DF00FFEB -:10759200FDCF21D0CFDF00FFFDCFCCDF02FFFDCF3B -:1075A200CCDFE5E00C94B93E11970C945C380D9158 -:1075B2001C910F5F1F4F1C930E93019708958281B8 -:1075C200938100811181801B910B0196DF01089547 -:1075D200E0E0F1E00895AEDF0E7F98CF0E94A93E71 -:1075E200F7DF80819181A081B181AF710481158122 -:1075F20000521040048315830AC000910B0100233E -:1076020031F4A301920103E911E00E943B3F47D00C -:10761200B8F1662477242C0111C06EDFF301ED5618 -:10762200FE4F008301E0600E00E0701E01960091A3 -:10763200F200002311F033D0B8F47FDF30D0E8F24B -:10764200F301B096E238F040C0F674DF02FFFDCFDE -:107652000091F200BDDF24813581201B304024835C -:107662003583E5CF49DFAA95AA23E1F700910B0103 -:10767200013099F62091F1008C010E945038D6CF4A -:1076820004811581012B21F055DF02FFFDCF55DF6B -:10769200A2DF50DF00FFFDCFE8E00C94B63EE0E051 -:1076A200F1E0028113810817190708952091EB0078 -:1076B20021602093EB000093EC000091ED0002703A -:1076C200012B0093ED000091ED0002600093ED00AC -:1076D2001091EE00012F000F00E0001F0895412FCE -:1076E2000093E900089500E009D000FD05C000E024 -:1076F200F7DF10E202E0DACF00E00895F1DF009157 -:10770200EB0008950F770132A9F5112369F11A955B -:1077120059F01A9561F01A9569F01A95F9F01A95CF -:10772200C1F01A95D9F024C00E942C3920C00E94C1 -:10773200263A1DC029D00091090123D001E01FD0B3 -:1077420020D0009108011BD00E94923A0E94973AE1 -:107752000EC01AD00091080114D007C002E00093B5 -:10776200080100E0009309010FD00E94923A03C081 -:107772000E94803A02C001E0089500E0089501D01D -:1077820000E00093F10008950091E800077F009364 -:10779200E800089508950350F9F4112339F01A9579 -:1077A20051F01A9581F01A9599F016C004E016D09E -:1077B20001E810E703C011D003E510E7E7E1F2E0CA -:1077C20000831183D8CF06E109D00FE510E7F6CF89 -:1077D20004D005E710E7F2CFD0CF0CE000931A02F5 -:1077E200089527D120D100931D02E1D0212F11232A -:1077F20029F12A95E9F02250F1F0225099F02A95C8 -:1078020049F0225061F02A9581F02A95E1F02A95FB -:10781200E9F023C0003809F44FC00C94833B0038D0 -:10782200E1F7C8C00023C9F71EC00023B1F72DC07D -:10783200033098F744C1033080F70BC1003868F376 -:10784200033858F7C9C0013841F77BC1013051F400 -:10785200FCD0BFD000FD06C0FCCF0E94833B0023BA -:1078620009F41ED008951091E3001078DCD00F7750 -:10787200012B0093E300E9D0ACD000FFFDCF0091D3 -:10788200E30000680093E300089591D0123040F4C1 -:107892000FD010931E02DAD000911E020C94CB3B43 -:1078A2000091EB0001D004C000620093EB00089548 -:1078B2000091E800077FC0C0BA93AA93229700E024 -:1078C2000093190274D0AFD0202F2A9519F02A956F -:1078D200E9F022C002E100931A020FE210E7E7E1A9 -:1078E200F2E0008311839DD008839DD00983E0DFFD -:1078F20000911A0210E02881398102171307A8F4B7 -:107902000F7181F401E00093190211C002E10093AA -:107912001A0201E410E7E3CF0E94CC3B002319F7DF -:107922008ED040C01093190202C020931A027ED05A -:10793200A7E1B2E001C08AD000911A02002309F146 -:1079420048D004FD1EC045D000FD03C042D004FF54 -:10795200FACF10E0012F1395003281F0ED91FC91E6 -:107962001197049133D02D913C912F5F3F4F3C935F -:107972002E93FD0103810A95038361F72AD004FF48 -:10798200DACF00911902013039F423D004FD04C08A -:1079920020D000FFFDCF5AD01CD004FFFDCF46D02F -:1079A20018D00B7F49D02296A991B99108951091D0 -:1079B200F10008957DDF00911E0208D047D009D062 -:1079C2000F773AD006D002FFFDCFBFC00093F1007F -:1079D20008950091E800089524D010911D021058D6 -:1079E20029F01A9589F01A9591F019C061DF00917A -:1079F2001C02ECDF00E0EADF29D0EBDF02FFFDCF63 -:107A020018D0E7DF0F770CC053DF00E0F2CF51D080 -:107A12000F7710E0F801E55EFD4F0081EACF0FD04D -:107A22000BC001D000D00091F1000895D2DF0F7E8B -:107A320003C00091E8000B7F0093E80008950091D5 -:107A4200EB0032DFC6DF077F089532DFC2DF0E7F31 -:107A5200F3CF00911D02002329F00A9509F10A953E -:107A620031F01EC0E0DF0A9561D0D9F41AC061D0AE -:107A7200B9F4D9DF0F7711F416D01BD00093E900C7 -:107A82001091EB0010FF0BC00ED010E01093E90034 -:107A920021E0F801E55EFD4F20834FD003C042D0C4 -:107AA20045D0CFDFC9CF1091EB0010621093EB00ED -:107AB20008951091E800177F1093E800089500914F -:107AC2001D02002311F4AFDF02C0013011F4B7DF51 -:107AD200B3CF023031F52DD019F52091F1002F7777 -:107AE2002093E90023D000FF19C081F01FD000616C -:107AF200DCDE01E010E0422F0E949F3E0093EA008C -:107B020000E00093EA0012D00860CFDE0BD030E034 -:107B1200F901E55EFD4F008310D0DACF03D0D7CF55 -:107B2200BFDE089500E00093E90008950091EB00A4 -:107B3200089579DF3CDF00230895BADE4ADF0E7F25 -:107B4200089583DF46DF02FFFDCF73DF42DF0F7749 -:107B520073CF0091D70001600093D7000E948B3849 -:107B620000E000931F0208950C94BF388A93FA93A1 -:107B7200EA933A922A921A920A927A936A935A93BF -:107B82004A933A932A931A930A938FB70091DA0091 -:107B920000FF24C00091D80000FF20C00EEF009328 -:107BA200DA000091D90000FF11C001E000930D013D -:107BB200ABD0026096D09AD00860A2D00E949B38C7 -:107BC2000091E0000E7F0093E00008C000E0009307 -:107BD2000D0100931E0298D0046083D07FD002FF73 -:107BE20005C084D002FF02C00BEF75D077D000FF32 -:107BF2001BC07CD000FF18C001E000930E016AD0C8 -:107C020083D000626ED00EEF6FD0006179D06ED05B -:107C12000F7D76D00091D80000620093D80009B59C -:107C22000D7F09BD00E009BD59D004FF20C05ED020 -:107C320004FF1DC009B500FD05C00E94EB3809B55F -:107C420000FFFDCF0091D8000F7D0093D80042D0F5 -:107C520000910E01002359F04CD00FEE45D00F7E5B -:107C620052D000643ED042D001604AD042D036D0D9 -:107C720005FF0FC03BD005FF0CC000E000930E01D2 -:107C820035D00F7E3DD00FED2FD00F7D3CD0006858 -:107C920028D024D003FF0DC029D003FF0AC000E082 -:107CA20000931F0207EF17D00E94743B2DD0116082 -:107CB20018D08FBF09911991299139914991599100 -:107CC200699179910990199029903990E991F991E6 -:107CD200899118950FEE0093E10008950091E1005B -:107CE20008951183008308950093E1000091E2005A -:107CF20008950091E200006203D00091E200086062 -:107D02000093E2000895FCDFE0E2F2E000811181DD -:107D1200089500008895FECF01E60DBF02E00EBF78 -:107D2200C2EED2E00E947438002311F00E94D33ECA -:107D32000E9465380E948A3E0C948A3E4A951AF047 -:107D4200000F111FFBCF0895BA92AA929A928A92BB -:107D52007A926A925A924A92BA93AA939A938A937D -:107D62000895BB84AA84998488847F806E805D8014 -:107D72004C80BB81AA8199818881F0E00FB6F8948A -:107D8200CE0FDF1F0FBE089520E006D0E9F7089559 -:107D9200259102D0E9F708952D9301501040202F2C -:107DA200212B089585E890E7FC0105911491FC01CF -:107DB2003296A591B491FC01349625913491422FCB -:107DC200432B19F0F901E4DF01C0DEDF069610E76C -:107DD2008139910748F308952F930CD02F9101D048 -:107DE20008953CD0F12FE02F45E047BFE89536D00B -:107DF20012D0089533D0F12FE02F43E047BFE8952A -:107E02002DD008952BD0F12FE02F43E047BFE89506 -:107E120025D001D0089522D041E147BFE8951EC088 -:107E22001DD0F12FE02F41E247BFC895002D16C0AB -:107E320015D0F12FE02F49E047BFC895002D0EC0A5 -:107E4200F32FE22F012E102E41E047BFE89506C026 -:107E520005D0002E29E027BFE89500C0022E27B7E3 -:107E620020FDFCCF202D0895022E27B726FDFCCF42 -:107E7200202D08950E94A53E22974801C901DA01EA -:107E820010C05BD001E0A00E00E0B01E00E4A0161E -:107E920000E0B00608F440C0830120E030E00E9418 -:107EA200F23E0A2F0B2B09F440C0082F0F7710E087 -:107EB2002C01401A510A320100E4A02E03C00A2FFD -:107EC2000B2BE1F04816590680F0F40101914F01A5 -:107ED2000983119729F001914F010883119711C06D -:107EE200F2013196049108830CC0F20104910983D6 -:107EF2003196E817F907A1F7F401EDCF1BD00883FB -:107F020019839201088119810E94213F16D0AA94F7 -:107F1200B1F62301AA24BB240DD0312F0F3F3F4FCE -:107F220009F4AFCF83011DD0B7CF01E02296ECE078 -:107F32000C94B23E82010C945F3802E0400E00E0E5 -:107F4200501E08959A938A9380E090E08C0109D0A4 -:107F520080589F4F8F3F0FE69007C0F38991999108 -:107F6200089520E030E00C94FB3E00000000000089 -:067F720000000000FC000D -:107FE4000C94ED3E0C94113F0C94193F0C94213FDA -:0C7FF4000C94F23E0C94033F0C94293FC7 -:040000030000700089 -:00000001FF +:020000020000FC +:047000000C948D3E21 +:047028000C94B73DD0 +:10702F0012010002FF010020EB03F42F0000010208 +:10703F00030109021200010100803209040000005F +:10704F00000000000C03410054004D0045004C00AF +:10705F001603410054006D00330032005500340018 +:10706F004400460055000C0331002E0030002E0066 +:10707F0030000403090416010C0100000C0000018C +:02708F006C7F14 +:1070920012BD01BDF89A00B5089501E00895F9996D +:1070A200FECF12BD01BD20BDFA9AF99AF6CFF99929 +:1070B200FECF0C944938F80104910895F8013491F7 +:1070C20031962491890108950091610000930C0189 +:1070D20000E80093610001E00093610005BF02E057 +:1070E20005BF0C9486380091D70001600093D70049 +:1070F200A89507EF04BF0091600000610093600053 +:1071020000E00093600001E008950E94AA3D0E9401 +:10711200B53DFDCF0CD00F7708D0006806D00061D6 +:1071220004D0016028D0789408950093D80000918B +:10713200D8000895FCDF00621ED04CD009B500FFD4 +:10714200FDCFF5DF0F7D17D00091E0000E7F009399 +:10715200E0000091E000077F0093E0000091E20070 +:1071620001600093E2000091E20008600093E200F7 +:1071720078940C94743B0093D800089500910D010B +:10718200002359F40091D90000FF07C0D0DF006846 +:10719200F2DF01E000930D01CDDFE0E2F2E00081D9 +:1071A200018100FF0DC0008111811E7F11830083C8 +:1071B20001E00093EA0000E00093EA0000931E025F +:1071C20000E00093E9000091E80003FF02C00E9482 +:1071D200F23B0895A89539D000E40093600000E0E6 +:1071E200009381000093800010E0009385000093DB +:1071F200840001E006BB00918100036000938100DE +:107202000091600007FFFCCF00E80093600010933C +:107212008100A89507EF04BF18D010936000209159 +:1072220084003091850010938100109380001093A8 +:1072320085001093840001E006BB2D3D354010F01F +:1072420002E101C002E009BD089500916000006101 +:107252000093600008950E94AD3E239741D100E063 +:1072620000930901B5D104811581012B51F437D165 +:1072720000910701002309F4B9C000E0009307015F +:10728200B5C058D102FFFDCF37D1068335D1009367 +:107292000F0132D1009310012FD1009311012CD193 +:1072A2000093120129D10093130102852091130149 +:1072B20030911201409111015091100116811A95DD +:1072C20041F01250A9F01A9599F11A9509F473C078 +:1072D2008BC010910F01113011F411E001C010E0C8 +:1072E200138799D00C3F11F414D17FC077D17DC0A0 +:1072F20092D010910F01112329F01A9549F01A9595 +:10730200A9F073C010E013870C3F09F06EC0ECCFF8 +:1073120056D103C04CD109F468C00D911C9144D1DF +:107322000F3FC1F305E0009309015FC011E0EBCF0D +:10733200D2D029F00250E1F10A9541F056C0FDD0B9 +:107342000E94A33F0FEF00930A014FC0552319F08B +:107352005A9579F04AC04ED00DEF04BF74D0EAD0EE +:1073620003FFFDCF67D051D04AD008E00093600000 +:10737200FFCF40D068D0DED003FFFDCF5BD03FD03F +:1073820044D00FEF1FE004C009811A810150104060 +:1073920009831A8309811A81012BB1F700E800934E +:1073A200610000910C01009361000C940000FFCF7A +:1073B20001E003871AC08FD019F00A9539F015C081 +:1073C200535098F4BAD002E000870FC0505339F0FE +:1073D2005A9541F05F52B1F35A95A1F306C002E00B +:1073E2000883F0CF01E0FCCFA8D079D02396E4E067 +:1073F2000C94BA3E01E005BF00E005BF089500917C +:10740200D8000F770093D800089509B50D7F09BD04 +:1074120000E009BD08955183408333832283109194 +:10742200E8001B7F1093E8001091E8001F7710938B +:10743200E80008955DD053D0F8940091E000016017 +:107442000093E000089579D04AC0219749D0009175 +:107452000601035019F00250B9F00BC03CD021F0E4 +:107462000A9559F00A9529F400910A010C3F19F482 +:1074720050D02196089567D0FCCF0091010100936E +:10748200F100009100010AC01091100124D019F0FE +:107492000A9549F0EECF135018F400E00093F10082 +:1074A2001ED044D0E6CF105339F01A9539F01F524E +:1074B20041F01A9541F0F4CF08E5F0CF00E006D094 +:1074C200EDCF02E0FCCF04E001D0E8CF10E020E0F5 +:1074D20030E00C94113F00910F010023089521C068 +:1074E2000BD008D007D00093040106D00093050109 +:1074F20021D00BC000D008830091F10008950091C3 +:10750200EB0000620093EB0015D0077F0093E800C8 +:107512000895F5DF02E00093080103E000930901FA +:10752200089559D007D000FFFDCF089503D002FF80 +:10753200FDCF03C00091E8000895FCDF0B7FE6DF7A +:10754200F9DF0F77E3CF0E94AC3E42D038D006C0BD +:107552002BD00093F1002BD059F43DD0082F092BEA +:10756200A9F0E8DF02FD12C0E5DF00FFFDCF4424F1 +:10757200042D4394003289F300910B0100230D91F5 +:107582001C9131F311970E945838E3CFD3DF00FFEB +:10759200FDCF21D0CFDF00FFFDCFCCDF02FFFDCF3B +:1075A200CCDFE5E00C94B93E11970C945C380D9158 +:1075B2001C910F5F1F4F1C930E93019708958281B8 +:1075C200938100811181801B910B0196DF01089547 +:1075D200E0E0F1E00895AEDF0E7F98CF0E94A93E71 +:1075E200F7DF80819181A081B181AF710481158122 +:1075F20000521040048315830AC000910B0100233E +:1076020031F4A301920103E911E00E943B3F47D00C +:10761200B8F1662477242C0111C06EDFF301ED5618 +:10762200FE4F008301E0600E00E0701E01960091A3 +:10763200F200002311F033D0B8F47FDF30D0E8F24B +:10764200F301B096E238F040C0F674DF02FFFDCFDE +:107652000091F200BDDF24813581201B304024835C +:107662003583E5CF49DFAA95AA23E1F700910B0103 +:10767200013099F62091F1008C010E945038D6CF4A +:1076820004811581012B21F055DF02FFFDCF55DF6B +:10769200A2DF50DF00FFFDCFE8E00C94B63EE0E051 +:1076A200F1E0028113810817190708952091EB0078 +:1076B20021602093EB000093EC000091ED0002703A +:1076C200012B0093ED000091ED0002600093ED00AC +:1076D2001091EE00012F000F00E0001F0895412FCE +:1076E2000093E900089500E009D000FD05C000E024 +:1076F200F7DF10E202E0DACF00E00895F1DF009157 +:10770200EB0008950F770132A9F5112369F11A955B +:1077120059F01A9561F01A9569F01A95F9F01A95CF +:10772200C1F01A95D9F024C00E942C3920C00E94C1 +:10773200263A1DC029D00091090123D001E01FD0B3 +:1077420020D0009108011BD00E94923A0E94973AE1 +:107752000EC01AD00091080114D007C002E00093B5 +:10776200080100E0009309010FD00E94923A03C081 +:107772000E94803A02C001E0089500E0089501D01D +:1077820000E00093F10008950091E800077F009364 +:10779200E800089508950350F9F4112339F01A9579 +:1077A20051F01A9581F01A9599F016C004E016D09E +:1077B20001E810E703C011D003E510E7E7E1F2E0CA +:1077C20000831183D8CF06E109D00FE510E7F6CF89 +:1077D20004D005E710E7F2CFD0CF0CE000931A02F5 +:1077E200089527D120D100931D02E1D0212F11232A +:1077F20029F12A95E9F02250F1F0225099F02A95C8 +:1078020049F0225061F02A9581F02A95E1F02A95FB +:10781200E9F023C0003809F44FC00C94833B0038D0 +:10782200E1F7C8C00023C9F71EC00023B1F72DC07D +:10783200033098F744C1033080F70BC1003868F376 +:10784200033858F7C9C0013841F77BC1013051F400 +:10785200FCD0BFD000FD06C0FCCF0E94833B0023BA +:1078620009F41ED008951091E3001078DCD00F7750 +:10787200012B0093E300E9D0ACD000FFFDCF0091D3 +:10788200E30000680093E300089591D0123040F4C1 +:107892000FD010931E02DAD000911E020C94CB3B43 +:1078A2000091EB0001D004C000620093EB00089548 +:1078B2000091E800077FC0C0BA93AA93229700E024 +:1078C2000093190274D0AFD0202F2A9519F02A956F +:1078D200E9F022C002E100931A020FE210E7E7E1A9 +:1078E200F2E0008311839DD008839DD00983E0DFFD +:1078F20000911A0210E02881398102171307A8F4B7 +:107902000F7181F401E00093190211C002E10093AA +:107912001A0201E410E7E3CF0E94CC3B002319F7DF +:107922008ED040C01093190202C020931A027ED05A +:10793200A7E1B2E001C08AD000911A02002309F146 +:1079420048D004FD1EC045D000FD03C042D004FF54 +:10795200FACF10E0012F1395003281F0ED91FC91E6 +:107962001197049133D02D913C912F5F3F4F3C935F +:107972002E93FD0103810A95038361F72AD004FF48 +:10798200DACF00911902013039F423D004FD04C08A +:1079920020D000FFFDCF5AD01CD004FFFDCF46D02F +:1079A20018D00B7F49D02296A991B99108951091D0 +:1079B200F10008957DDF00911E0208D047D009D062 +:1079C2000F773AD006D002FFFDCFBFC00093F1007F +:1079D20008950091E800089524D010911D021058D6 +:1079E20029F01A9589F01A9591F019C061DF00917A +:1079F2001C02ECDF00E0EADF29D0EBDF02FFFDCF63 +:107A020018D0E7DF0F770CC053DF00E0F2CF51D080 +:107A12000F7710E0F801E55EFD4F0081EACF0FD04D +:107A22000BC001D000D00091F1000895D2DF0F7E8B +:107A320003C00091E8000B7F0093E80008950091D5 +:107A4200EB0032DFC6DF077F089532DFC2DF0E7F31 +:107A5200F3CF00911D02002329F00A9509F10A953E +:107A620031F01EC0E0DF0A9561D0D9F41AC061D0AE +:107A7200B9F4D9DF0F7711F416D01BD00093E900C7 +:107A82001091EB0010FF0BC00ED010E01093E90034 +:107A920021E0F801E55EFD4F20834FD003C042D0C4 +:107AA20045D0CFDFC9CF1091EB0010621093EB00ED +:107AB20008951091E800177F1093E800089500914F +:107AC2001D02002311F4AFDF02C0013011F4B7DF51 +:107AD200B3CF023031F52DD019F52091F1002F7777 +:107AE2002093E90023D000FF19C081F01FD000616C +:107AF200DCDE01E010E0422F0E949F3E0093EA008C +:107B020000E00093EA0012D00860CFDE0BD030E034 +:107B1200F901E55EFD4F008310D0DACF03D0D7CF55 +:107B2200BFDE089500E00093E90008950091EB00A4 +:107B3200089579DF3CDF00230895BADE4ADF0E7F25 +:107B4200089583DF46DF02FFFDCF73DF42DF0F7749 +:107B520073CF0091D70001600093D7000E948B3849 +:107B620000E000931F0208950C94BF388A93FA93A1 +:107B7200EA933A922A921A920A927A936A935A93BF +:107B82004A933A932A931A930A938FB70091DA0091 +:107B920000FF24C00091D80000FF20C00EEF009328 +:107BA200DA000091D90000FF11C001E000930D013D +:107BB200ABD0026096D09AD00860A2D00E949B38C7 +:107BC2000091E0000E7F0093E00008C000E0009307 +:107BD2000D0100931E0298D0046083D07FD002FF73 +:107BE20005C084D002FF02C00BEF75D077D000FF32 +:107BF2001BC07CD000FF18C001E000930E016AD0C8 +:107C020083D000626ED00EEF6FD0006179D06ED05B +:107C12000F7D76D00091D80000620093D80009B59C +:107C22000D7F09BD00E009BD59D004FF20C05ED020 +:107C320004FF1DC009B500FD05C00E94EB3809B55F +:107C420000FFFDCF0091D8000F7D0093D80042D0F5 +:107C520000910E01002359F04CD00FEE45D00F7E5B +:107C620052D000643ED042D001604AD042D036D0D9 +:107C720005FF0FC03BD005FF0CC000E000930E01D2 +:107C820035D00F7E3DD00FED2FD00F7D3CD0006858 +:107C920028D024D003FF0DC029D003FF0AC000E082 +:107CA20000931F0207EF17D00E94743B2DD0116082 +:107CB20018D08FBF09911991299139914991599100 +:107CC200699179910990199029903990E991F991E6 +:107CD200899118950FEE0093E10008950091E1005B +:107CE20008951183008308950093E1000091E2005A +:107CF20008950091E200006203D00091E200086062 +:107D02000093E2000895FCDFE0E2F2E000811181DD +:107D1200089500008895FECF01E60DBF02E00EBF78 +:107D2200C2EED2E00E947438002311F00E94D33ECA +:107D32000E9465380E948A3E0C948A3E4A951AF047 +:107D4200000F111FFBCF0895BA92AA929A928A92BB +:107D52007A926A925A924A92BA93AA939A938A937D +:107D62000895BB84AA84998488847F806E805D8014 +:107D72004C80BB81AA8199818881F0E00FB6F8948A +:107D8200CE0FDF1F0FBE089520E006D0E9F7089559 +:107D9200259102D0E9F708952D9301501040202F2C +:107DA200212B089585E890E7FC0105911491FC01CF +:107DB2003296A591B491FC01349625913491422FCB +:107DC200432B19F0F901E4DF01C0DEDF069610E76C +:107DD2008139910748F308952F930CD02F9101D048 +:107DE20008953CD0F12FE02F45E047BFE89536D00B +:107DF20012D0089533D0F12FE02F43E047BFE8952A +:107E02002DD008952BD0F12FE02F43E047BFE89506 +:107E120025D001D0089522D041E147BFE8951EC088 +:107E22001DD0F12FE02F41E247BFC895002D16C0AB +:107E320015D0F12FE02F49E047BFC895002D0EC0A5 +:107E4200F32FE22F012E102E41E047BFE89506C026 +:107E520005D0002E29E027BFE89500C0022E27B7E3 +:107E620020FDFCCF202D0895022E27B726FDFCCF42 +:107E7200202D08950E94A53E22974801C901DA01EA +:107E820010C05BD001E0A00E00E0B01E00E4A0161E +:107E920000E0B00608F440C0830120E030E00E9418 +:107EA200F23E0A2F0B2B09F440C0082F0F7710E087 +:107EB2002C01401A510A320100E4A02E03C00A2FFD +:107EC2000B2BE1F04816590680F0F40101914F01A5 +:107ED2000983119729F001914F010883119711C06D +:107EE200F2013196049108830CC0F20104910983D6 +:107EF2003196E817F907A1F7F401EDCF1BD00883FB +:107F020019839201088119810E94213F16D0AA94F7 +:107F1200B1F62301AA24BB240DD0312F0F3F3F4FCE +:107F220009F4AFCF83011DD0B7CF01E02296ECE078 +:107F32000C94B23E82010C945F3802E0400E00E0E5 +:107F4200501E08959A938A9380E090E08C0109D0A4 +:107F520080589F4F8F3F0FE69007C0F38991999108 +:107F6200089520E030E00C94FB3E00000000000089 +:067F720000000000FC000D +:107FE4000C94ED3E0C94113F0C94193F0C94213FDA +:0C7FF4000C94F23E0C94033F0C94293FC7 +:040000030000700089 +:00000001FF From e653cc198e3a535f23ae33d677115f192979ee55 Mon Sep 17 00:00:00 2001 From: Andrew Kannan Date: Mon, 12 Nov 2018 19:31:22 -0500 Subject: [PATCH 505/788] The "Practice60" Board, Blue Pill powered (#4407) * Starting point for blue pill based practice60 * Changes * add * try raw bin no botloader * swap back to bootloader version * edit * Remove debug LED flash * Disable JTAG to open up B3 and B4 * Add led backlight support (no breathing yet) * Update matrix for correctness * RGB Underglow working in a very simple state * not as bright * Move to handwired * revert ChibiOS_Test changes * Changes based on PR comments * Address PR comments v2 * Move files --- .../boards/GENERIC_STM32_F103/board.c | 56 ++ .../boards/GENERIC_STM32_F103/board.h | 166 ++++++ .../boards/GENERIC_STM32_F103/board.mk | 5 + .../handwired/practice60/bootloader_defs.h | 10 + keyboards/handwired/practice60/chconf.h | 524 ++++++++++++++++++ keyboards/handwired/practice60/config.h | 74 +++ keyboards/handwired/practice60/halconf.h | 353 ++++++++++++ keyboards/handwired/practice60/hsv2rgb.c | 80 +++ keyboards/handwired/practice60/hsv2rgb.h | 23 + .../practice60/keymaps/default/keymap.c | 48 ++ keyboards/handwired/practice60/ld/MKL26Z64.ld | 105 ++++ .../ld/STM32F103x8_stm32duino_bootloader.ld | 88 +++ keyboards/handwired/practice60/led.c | 51 ++ keyboards/handwired/practice60/mcuconf.h | 209 +++++++ keyboards/handwired/practice60/practice60.c | 32 ++ keyboards/handwired/practice60/practice60.h | 18 + keyboards/handwired/practice60/readme.md | 3 + keyboards/handwired/practice60/rules.mk | 56 ++ keyboards/handwired/practice60/underglow.c | 157 ++++++ keyboards/handwired/practice60/underglow.h | 10 + 20 files changed, 2068 insertions(+) create mode 100644 keyboards/handwired/practice60/boards/GENERIC_STM32_F103/board.c create mode 100644 keyboards/handwired/practice60/boards/GENERIC_STM32_F103/board.h create mode 100644 keyboards/handwired/practice60/boards/GENERIC_STM32_F103/board.mk create mode 100644 keyboards/handwired/practice60/bootloader_defs.h create mode 100644 keyboards/handwired/practice60/chconf.h create mode 100644 keyboards/handwired/practice60/config.h create mode 100644 keyboards/handwired/practice60/halconf.h create mode 100644 keyboards/handwired/practice60/hsv2rgb.c create mode 100644 keyboards/handwired/practice60/hsv2rgb.h create mode 100644 keyboards/handwired/practice60/keymaps/default/keymap.c create mode 100644 keyboards/handwired/practice60/ld/MKL26Z64.ld create mode 100644 keyboards/handwired/practice60/ld/STM32F103x8_stm32duino_bootloader.ld create mode 100644 keyboards/handwired/practice60/led.c create mode 100644 keyboards/handwired/practice60/mcuconf.h create mode 100644 keyboards/handwired/practice60/practice60.c create mode 100644 keyboards/handwired/practice60/practice60.h create mode 100644 keyboards/handwired/practice60/readme.md create mode 100644 keyboards/handwired/practice60/rules.mk create mode 100644 keyboards/handwired/practice60/underglow.c create mode 100644 keyboards/handwired/practice60/underglow.h diff --git a/keyboards/handwired/practice60/boards/GENERIC_STM32_F103/board.c b/keyboards/handwired/practice60/boards/GENERIC_STM32_F103/board.c new file mode 100644 index 000000000..8c5a87f35 --- /dev/null +++ b/keyboards/handwired/practice60/boards/GENERIC_STM32_F103/board.c @@ -0,0 +1,56 @@ +/* + 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. +*/ + +#include "hal.h" + +// Value to place in RTC backup register 10 for persistent bootloader mode +#define RTC_BOOTLOADER_FLAG 0x424C + +/** + * @brief PAL setup. + * @details Digital I/O ports static configuration as defined in @p board.h. + * This variable is used by the HAL when initializing the PAL driver. + */ +#if HAL_USE_PAL || defined(__DOXYGEN__) +const PALConfig pal_default_config = +{ + {VAL_GPIOAODR, VAL_GPIOACRL, VAL_GPIOACRH}, + {VAL_GPIOBODR, VAL_GPIOBCRL, VAL_GPIOBCRH}, + {VAL_GPIOCODR, VAL_GPIOCCRL, VAL_GPIOCCRH}, + {VAL_GPIODODR, VAL_GPIODCRL, VAL_GPIODCRH}, + {VAL_GPIOEODR, VAL_GPIOECRL, VAL_GPIOECRH}, +}; +#endif + +/* + * Early initialization code. + * This initialization must be performed just after stack setup and before + * any other initialization. + */ +void __early_init(void) { + + stm32_clock_init(); +} + +/* + * Board-specific initialization code. + */ +void boardInit(void) { + //JTAG-DP Disabled and SW-DP Enabled + AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE; + //Set backup register DR10 to enter bootloader on reset + BKP->DR10 = RTC_BOOTLOADER_FLAG; +} diff --git a/keyboards/handwired/practice60/boards/GENERIC_STM32_F103/board.h b/keyboards/handwired/practice60/boards/GENERIC_STM32_F103/board.h new file mode 100644 index 000000000..9427adabf --- /dev/null +++ b/keyboards/handwired/practice60/boards/GENERIC_STM32_F103/board.h @@ -0,0 +1,166 @@ +/* + 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 _BOARD_H_ +#define _BOARD_H_ + +/* + * Setup for a Generic STM32F103 board. + */ + +/* + * Board identifier. + */ +#define BOARD_GENERIC_STM32_F103 +#define BOARD_NAME "Generic STM32F103x board" + +/* + * Board frequencies. + */ +#define STM32_LSECLK 32768 +#define STM32_HSECLK 8000000 + +/* + * MCU type, supported types are defined in ./os/hal/platforms/hal_lld.h. + */ +#define STM32F103xB + +/* + * IO pins assignments + */ + +/* on-board */ + +#define GPIOA_LED 8 +#define GPIOD_OSC_IN 0 +#define GPIOD_OSC_OUT 1 + +/* In case your board has a "USB enable" hardware + controlled by a pin, define it here. (It could be just + a 1.5k resistor connected to D+ line.) +*/ +/* +#define GPIOB_USB_DISC 10 +*/ + +/* + * I/O ports initial setup, this configuration is established soon after reset + * in the initialization code. + * + * The digits have the following meaning: + * 0 - Analog input. + * 1 - Push Pull output 10MHz. + * 2 - Push Pull output 2MHz. + * 3 - Push Pull output 50MHz. + * 4 - Digital input. + * 5 - Open Drain output 10MHz. + * 6 - Open Drain output 2MHz. + * 7 - Open Drain output 50MHz. + * 8 - Digital input with PullUp or PullDown resistor depending on ODR. + * 9 - Alternate Push Pull output 10MHz. + * A - Alternate Push Pull output 2MHz. + * B - Alternate Push Pull output 50MHz. + * C - Reserved. + * D - Alternate Open Drain output 10MHz. + * E - Alternate Open Drain output 2MHz. + * F - Alternate Open Drain output 50MHz. + * Please refer to the STM32 Reference Manual for details. + */ + +/* + * Port A setup. + * Everything input with pull-up except: + * PA2 - Alternate output (USART2 TX). + * PA3 - Normal input (USART2 RX). + * PA9 - Alternate output (USART1 TX). + * PA10 - Normal input (USART1 RX). + */ +#define VAL_GPIOACRL 0x88884B88 /* PA7...PA0 */ +#define VAL_GPIOACRH 0x888884B8 /* PA15...PA8 */ +#define VAL_GPIOAODR 0xFFFFFFFF + +/* + * Port B setup. + * Everything input with pull-up except: + * PB10 - Push Pull output (USB switch). + */ +#define VAL_GPIOBCRL 0x88888888 /* PB7...PB0 */ +#define VAL_GPIOBCRH 0x88888388 /* PB15...PB8 */ +#define VAL_GPIOBODR 0xFFFFFFFF + +/* + * Port C setup. + * Everything input with pull-up except: + * PC13 - Push Pull output (LED). + */ +#define VAL_GPIOCCRL 0x88888888 /* PC7...PC0 */ +#define VAL_GPIOCCRH 0x88388888 /* PC15...PC8 */ +#define VAL_GPIOCODR 0xFFFFFFFF + +/* + * Port D setup. + * Everything input with pull-up except: + * PD0 - Normal input (XTAL). + * PD1 - Normal input (XTAL). + */ +#define VAL_GPIODCRL 0x88888844 /* PD7...PD0 */ +#define VAL_GPIODCRH 0x88888888 /* PD15...PD8 */ +#define VAL_GPIODODR 0xFFFFFFFF + +/* + * Port E setup. + * Everything input with pull-up except: + */ +#define VAL_GPIOECRL 0x88888888 /* PE7...PE0 */ +#define VAL_GPIOECRH 0x88888888 /* PE15...PE8 */ +#define VAL_GPIOEODR 0xFFFFFFFF + +/* + * USB bus activation macro, required by the USB driver. + */ +/* The point is that most of the generic STM32F103* boards + have a 1.5k resistor connected on one end to the D+ line + and on the other end to some pin. Or even a slightly more + complicated "USB enable" circuit, controlled by a pin. + That should go here. + + However on some boards (e.g. one that I have), there's no + such hardware. In which case it's better to not do anything. +*/ +/* +#define usb_lld_connect_bus(usbp) palClearPad(GPIOB, GPIOB_USB_DISC) +*/ +#define usb_lld_connect_bus(usbp) palSetPadMode(GPIOA, 12, PAL_MODE_INPUT); + +/* + * USB bus de-activation macro, required by the USB driver. + */ +/* +#define usb_lld_disconnect_bus(usbp) palSetPad(GPIOB, GPIOB_USB_DISC) +*/ +#define usb_lld_disconnect_bus(usbp) palSetPadMode(GPIOA, 12, PAL_MODE_OUTPUT_PUSHPULL); palClearPad(GPIOA, 12); + +#if !defined(_FROM_ASM_) +#ifdef __cplusplus +extern "C" { +#endif + void boardInit(void); +#ifdef __cplusplus +} +#endif +#endif /* _FROM_ASM_ */ + +#endif /* _BOARD_H_ */ diff --git a/keyboards/handwired/practice60/boards/GENERIC_STM32_F103/board.mk b/keyboards/handwired/practice60/boards/GENERIC_STM32_F103/board.mk new file mode 100644 index 000000000..6b8b312fd --- /dev/null +++ b/keyboards/handwired/practice60/boards/GENERIC_STM32_F103/board.mk @@ -0,0 +1,5 @@ +# List of all the board related files. +BOARDSRC = $(BOARD_PATH)/boards/GENERIC_STM32_F103/board.c + +# Required include directories +BOARDINC = $(BOARD_PATH)/boards/GENERIC_STM32_F103 diff --git a/keyboards/handwired/practice60/bootloader_defs.h b/keyboards/handwired/practice60/bootloader_defs.h new file mode 100644 index 000000000..0f45203cb --- /dev/null +++ b/keyboards/handwired/practice60/bootloader_defs.h @@ -0,0 +1,10 @@ +/* Address for jumping to bootloader on STM32 chips. */ +/* It is chip dependent, the correct number can be looked up here (page 175): + * http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf + * This also requires a patch to chibios: + * /tmk_core/tool/chibios/ch-bootloader-jump.patch + */ + +// STM32F103* does NOT have an USB bootloader in ROM (only serial), +// so setting anything here does not make much sense +// #define STM32_BOOTLOADER_ADDRESS 0x1FFFC800 diff --git a/keyboards/handwired/practice60/chconf.h b/keyboards/handwired/practice60/chconf.h new file mode 100644 index 000000000..dfb1f9dfb --- /dev/null +++ b/keyboards/handwired/practice60/chconf.h @@ -0,0 +1,524 @@ +/* + 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. +*/ + +/** + * @file templates/chconf.h + * @brief Configuration file template. + * @details A copy of this file must be placed in each project directory, it + * contains the application specific kernel settings. + * + * @addtogroup config + * @details Kernel related settings and hooks. + * @{ + */ + +#ifndef CHCONF_H +#define CHCONF_H + +#define _CHIBIOS_RT_CONF_ + +/*===========================================================================*/ +/** + * @name System timers settings + * @{ + */ +/*===========================================================================*/ + +/** + * @brief System time counter resolution. + * @note Allowed values are 16 or 32 bits. + */ +#define CH_CFG_ST_RESOLUTION 16 + +/** + * @brief System tick frequency. + * @details Frequency of the system timer that drives the system ticks. This + * setting also defines the system tick time unit. + */ +#define CH_CFG_ST_FREQUENCY 2000 + +/** + * @brief Time delta constant for the tick-less mode. + * @note If this value is zero then the system uses the classic + * periodic tick. This value represents the minimum number + * of ticks that is safe to specify in a timeout directive. + * The value one is not valid, timeouts are rounded up to + * this value. + */ +#define CH_CFG_ST_TIMEDELTA 2 + +/** @} */ + +/*===========================================================================*/ +/** + * @name Kernel parameters and options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Round robin interval. + * @details This constant is the number of system ticks allowed for the + * threads before preemption occurs. Setting this value to zero + * disables the preemption for threads with equal priority and the + * round robin becomes cooperative. Note that higher priority + * threads can still preempt, the kernel is always preemptive. + * @note Disabling the round robin preemption makes the kernel more compact + * and generally faster. + * @note The round robin preemption is not supported in tickless mode and + * must be set to zero in that case. + */ +#define CH_CFG_TIME_QUANTUM 0 + +/** + * @brief Managed RAM size. + * @details Size of the RAM area to be managed by the OS. If set to zero + * then the whole available RAM is used. The core memory is made + * available to the heap allocator and/or can be used directly through + * the simplified core memory allocator. + * + * @note In order to let the OS manage the whole RAM the linker script must + * provide the @p __heap_base__ and @p __heap_end__ symbols. + * @note Requires @p CH_CFG_USE_MEMCORE. + */ +#define CH_CFG_MEMCORE_SIZE 0 + +/** + * @brief Idle thread automatic spawn suppression. + * @details When this option is activated the function @p chSysInit() + * does not spawn the idle thread. The application @p main() + * function becomes the idle thread and must implement an + * infinite loop. + */ +#define CH_CFG_NO_IDLE_THREAD FALSE + +/* Use __WFI in the idle thread for waiting. Does lower the power + * consumption. */ +#define CORTEX_ENABLE_WFI_IDLE TRUE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Performance options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief OS optimization. + * @details If enabled then time efficient rather than space efficient code + * is used when two possible implementations exist. + * + * @note This is not related to the compiler optimization options. + * @note The default is @p TRUE. + */ +#define CH_CFG_OPTIMIZE_SPEED TRUE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Subsystem options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Time Measurement APIs. + * @details If enabled then the time measurement APIs are included in + * the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_TM FALSE + +/** + * @brief Threads registry APIs. + * @details If enabled then the registry APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_REGISTRY TRUE + +/** + * @brief Threads synchronization APIs. + * @details If enabled then the @p chThdWait() function is included in + * the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_WAITEXIT TRUE + +/** + * @brief Semaphores APIs. + * @details If enabled then the Semaphores APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_SEMAPHORES TRUE + +/** + * @brief Semaphores queuing mode. + * @details If enabled then the threads are enqueued on semaphores by + * priority rather than in FIFO order. + * + * @note The default is @p FALSE. Enable this if you have special + * requirements. + * @note Requires @p CH_CFG_USE_SEMAPHORES. + */ +#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE + +/** + * @brief Mutexes APIs. + * @details If enabled then the mutexes APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MUTEXES TRUE + +/** + * @brief Enables recursive behavior on mutexes. + * @note Recursive mutexes are heavier and have an increased + * memory footprint. + * + * @note The default is @p FALSE. + * @note Requires @p CH_CFG_USE_MUTEXES. + */ +#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE + +/** + * @brief Conditional Variables APIs. + * @details If enabled then the conditional variables APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_MUTEXES. + */ +#define CH_CFG_USE_CONDVARS TRUE + +/** + * @brief Conditional Variables APIs with timeout. + * @details If enabled then the conditional variables APIs with timeout + * specification are included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_CONDVARS. + */ +#define CH_CFG_USE_CONDVARS_TIMEOUT FALSE + +/** + * @brief Events Flags APIs. + * @details If enabled then the event flags APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_EVENTS TRUE + +/** + * @brief Events Flags APIs with timeout. + * @details If enabled then the events APIs with timeout specification + * are included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_EVENTS. + */ +#define CH_CFG_USE_EVENTS_TIMEOUT TRUE + +/** + * @brief Synchronous Messages APIs. + * @details If enabled then the synchronous messages APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MESSAGES TRUE + +/** + * @brief Synchronous Messages queuing mode. + * @details If enabled then messages are served by priority rather than in + * FIFO order. + * + * @note The default is @p FALSE. Enable this if you have special + * requirements. + * @note Requires @p CH_CFG_USE_MESSAGES. + */ +#define CH_CFG_USE_MESSAGES_PRIORITY FALSE + +/** + * @brief Mailboxes APIs. + * @details If enabled then the asynchronous messages (mailboxes) APIs are + * included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_SEMAPHORES. + */ +#define CH_CFG_USE_MAILBOXES TRUE + +/** + * @brief Core Memory Manager APIs. + * @details If enabled then the core memory manager APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MEMCORE TRUE + +/** + * @brief Heap Allocator APIs. + * @details If enabled then the memory heap allocator APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or + * @p CH_CFG_USE_SEMAPHORES. + * @note Mutexes are recommended. + */ +#define CH_CFG_USE_HEAP TRUE + +/** + * @brief Memory Pools Allocator APIs. + * @details If enabled then the memory pools allocator APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MEMPOOLS FALSE + +/** + * @brief Dynamic Threads APIs. + * @details If enabled then the dynamic threads creation APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_WAITEXIT. + * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. + */ +#define CH_CFG_USE_DYNAMIC FALSE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Debug options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Debug option, kernel statistics. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_STATISTICS FALSE + +/** + * @brief Debug option, system state check. + * @details If enabled the correct call protocol for system APIs is checked + * at runtime. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_SYSTEM_STATE_CHECK FALSE + +/** + * @brief Debug option, parameters checks. + * @details If enabled then the checks on the API functions input + * parameters are activated. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_ENABLE_CHECKS FALSE + +/** + * @brief Debug option, consistency checks. + * @details If enabled then all the assertions in the kernel code are + * activated. This includes consistency checks inside the kernel, + * runtime anomalies and port-defined checks. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_ENABLE_ASSERTS FALSE + +/** + * @brief Debug option, trace buffer. + * @details If enabled then the trace buffer is activated. + * + * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. + */ +#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_DISABLED + +/** + * @brief Trace buffer entries. + * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is + * different from @p CH_DBG_TRACE_MASK_DISABLED. + */ +#define CH_DBG_TRACE_BUFFER_SIZE 128 + +/** + * @brief Debug option, stack checks. + * @details If enabled then a runtime stack check is performed. + * + * @note The default is @p FALSE. + * @note The stack check is performed in a architecture/port dependent way. + * It may not be implemented or some ports. + * @note The default failure mode is to halt the system with the global + * @p panic_msg variable set to @p NULL. + */ +#define CH_DBG_ENABLE_STACK_CHECK FALSE + +/** + * @brief Debug option, stacks initialization. + * @details If enabled then the threads working area is filled with a byte + * value when a thread is created. This can be useful for the + * runtime measurement of the used stack. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_FILL_THREADS FALSE + +/** + * @brief Debug option, threads profiling. + * @details If enabled then a field is added to the @p thread_t structure that + * counts the system ticks occurred while executing the thread. + * + * @note The default is @p FALSE. + * @note This debug option is not currently compatible with the + * tickless mode. + */ +#define CH_DBG_THREADS_PROFILING FALSE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Kernel hooks + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Threads descriptor structure extension. + * @details User fields added to the end of the @p thread_t structure. + */ +#define CH_CFG_THREAD_EXTRA_FIELDS \ + /* Add threads custom fields here.*/ + +/** + * @brief Threads initialization hook. + * @details User initialization code added to the @p chThdInit() API. + * + * @note It is invoked from within @p chThdInit() and implicitly from all + * the threads creation APIs. + */ +#define CH_CFG_THREAD_INIT_HOOK(tp) { \ + /* Add threads initialization code here.*/ \ +} + +/** + * @brief Threads finalization hook. + * @details User finalization code added to the @p chThdExit() API. + */ +#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ + /* Add threads finalization code here.*/ \ +} + +/** + * @brief Context switch hook. + * @details This hook is invoked just before switching between threads. + */ +#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ + /* Context switch code here.*/ \ +} + +/** + * @brief ISR enter hook. + */ +#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ + /* IRQ prologue code here.*/ \ +} + +/** + * @brief ISR exit hook. + */ +#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ + /* IRQ epilogue code here.*/ \ +} + +/** + * @brief Idle thread enter hook. + * @note This hook is invoked within a critical zone, no OS functions + * should be invoked from here. + * @note This macro can be used to activate a power saving mode. + */ +#define CH_CFG_IDLE_ENTER_HOOK() { \ + /* Idle-enter code here.*/ \ +} + +/** + * @brief Idle thread leave hook. + * @note This hook is invoked within a critical zone, no OS functions + * should be invoked from here. + * @note This macro can be used to deactivate a power saving mode. + */ +#define CH_CFG_IDLE_LEAVE_HOOK() { \ + /* Idle-leave code here.*/ \ +} + +/** + * @brief Idle Loop hook. + * @details This hook is continuously invoked by the idle thread loop. + */ +#define CH_CFG_IDLE_LOOP_HOOK() { \ + /* Idle loop code here.*/ \ +} + +/** + * @brief System tick event hook. + * @details This hook is invoked in the system tick handler immediately + * after processing the virtual timers queue. + */ +#define CH_CFG_SYSTEM_TICK_HOOK() { \ + /* System tick event code here.*/ \ +} + +/** + * @brief System halt hook. + * @details This hook is invoked in case to a system halting error before + * the system is halted. + */ +#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ + /* System halt code here.*/ \ +} + +/** + * @brief Trace hook. + * @details This hook is invoked each time a new record is written in the + * trace buffer. + */ +#define CH_CFG_TRACE_HOOK(tep) { \ + /* Trace code here.*/ \ +} + +/** @} */ + +/*===========================================================================*/ +/* Port-specific settings (override port settings defaulted in chcore.h). */ +/*===========================================================================*/ + +#endif /* CHCONF_H */ + +/** @} */ diff --git a/keyboards/handwired/practice60/config.h b/keyboards/handwired/practice60/config.h new file mode 100644 index 000000000..31ddd77d1 --- /dev/null +++ b/keyboards/handwired/practice60/config.h @@ -0,0 +1,74 @@ +/* +Copyright 2015 Jun Wako + +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 . +*/ + +#pragma once + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6464 +#define DEVICE_VER 0x0001 +/* in python2: list(u"whatever".encode('utf-16-le')) */ +/* at most 32 characters or the ugly hack in usb_main.c borks */ +#define MANUFACTURER QMK +#define PRODUCT Practice 60 +#define DESCRIPTION Practice 60 + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 14 + +#define MATRIX_COL_PINS { B11, B10, B1, B0, A7, A6, A5, A4, A3, A2, A1, A0, C15, C14 } +#define MATRIX_ROW_PINS { B3, B4, B5, B6, B7 } +#define DIODE_DIRECTION COL2ROW + +#define BACKLIGHT_LEVELS 1 + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCE 5 + +/* 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 + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + + + +/* + * 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 diff --git a/keyboards/handwired/practice60/halconf.h b/keyboards/handwired/practice60/halconf.h new file mode 100644 index 000000000..5fba285a3 --- /dev/null +++ b/keyboards/handwired/practice60/halconf.h @@ -0,0 +1,353 @@ +/* + 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. +*/ + +/** + * @file templates/halconf.h + * @brief HAL configuration header. + * @details HAL configuration file, this file allows to enable or disable the + * various device drivers from your application. You may also use + * this file in order to override the device drivers default settings. + * + * @addtogroup HAL_CONF + * @{ + */ + +#ifndef _HALCONF_H_ +#define _HALCONF_H_ + +#include "mcuconf.h" + +/** + * @brief Enables the PAL subsystem. + */ +#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) +#define HAL_USE_PAL TRUE +#endif + +/** + * @brief Enables the ADC subsystem. + */ +#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) +#define HAL_USE_ADC FALSE +#endif + +/** + * @brief Enables the CAN subsystem. + */ +#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) +#define HAL_USE_CAN FALSE +#endif + +/** + * @brief Enables the DAC subsystem. + */ +#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) +#define HAL_USE_DAC FALSE +#endif + +/** + * @brief Enables the EXT subsystem. + */ +#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) +#define HAL_USE_EXT FALSE +#endif + +/** + * @brief Enables the GPT subsystem. + */ +#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) +#define HAL_USE_GPT FALSE +#endif + +/** + * @brief Enables the I2C subsystem. + */ +#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) +#define HAL_USE_I2C FALSE +#endif + +/** + * @brief Enables the I2S subsystem. + */ +#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) +#define HAL_USE_I2S FALSE +#endif + +/** + * @brief Enables the ICU subsystem. + */ +#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) +#define HAL_USE_ICU FALSE +#endif + +/** + * @brief Enables the MAC subsystem. + */ +#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) +#define HAL_USE_MAC FALSE +#endif + +/** + * @brief Enables the MMC_SPI subsystem. + */ +#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) +#define HAL_USE_MMC_SPI FALSE +#endif + +/** + * @brief Enables the PWM subsystem. + */ +#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) +#define HAL_USE_PWM FALSE +#endif + +/** + * @brief Enables the RTC subsystem. + */ +#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) +#define HAL_USE_RTC FALSE +#endif + +/** + * @brief Enables the SDC subsystem. + */ +#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) +#define HAL_USE_SDC FALSE +#endif + +/** + * @brief Enables the SERIAL subsystem. + */ +#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) +#define HAL_USE_SERIAL FALSE +#endif + +/** + * @brief Enables the SERIAL over USB subsystem. + */ +#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) +#define HAL_USE_SERIAL_USB FALSE +#endif + +/** + * @brief Enables the SPI subsystem. + */ +#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) +#define HAL_USE_SPI TRUE +#endif + +/** + * @brief Enables the UART subsystem. + */ +#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) +#define HAL_USE_UART FALSE +#endif + +/** + * @brief Enables the USB subsystem. + */ +#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) +#define HAL_USE_USB TRUE +#endif + +/** + * @brief Enables the WDG subsystem. + */ +#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) +#define HAL_USE_WDG FALSE +#endif + +/*===========================================================================*/ +/* ADC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) +#define ADC_USE_WAIT TRUE +#endif + +/** + * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define ADC_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* CAN driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Sleep mode related APIs inclusion switch. + */ +#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) +#define CAN_USE_SLEEP_MODE TRUE +#endif + +/*===========================================================================*/ +/* I2C driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables the mutual exclusion APIs on the I2C bus. + */ +#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define I2C_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* MAC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables an event sources for incoming packets. + */ +#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) +#define MAC_USE_ZERO_COPY FALSE +#endif + +/** + * @brief Enables an event sources for incoming packets. + */ +#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) +#define MAC_USE_EVENTS TRUE +#endif + +/*===========================================================================*/ +/* MMC_SPI driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Delays insertions. + * @details If enabled this options inserts delays into the MMC waiting + * routines releasing some extra CPU time for the threads with + * lower priority, this may slow down the driver a bit however. + * This option is recommended also if the SPI driver does not + * use a DMA channel and heavily loads the CPU. + */ +#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) +#define MMC_NICE_WAITING TRUE +#endif + +/*===========================================================================*/ +/* SDC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Number of initialization attempts before rejecting the card. + * @note Attempts are performed at 10mS intervals. + */ +#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) +#define SDC_INIT_RETRY 100 +#endif + +/** + * @brief Include support for MMC cards. + * @note MMC support is not yet implemented so this option must be kept + * at @p FALSE. + */ +#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) +#define SDC_MMC_SUPPORT FALSE +#endif + +/** + * @brief Delays insertions. + * @details If enabled this options inserts delays into the MMC waiting + * routines releasing some extra CPU time for the threads with + * lower priority, this may slow down the driver a bit however. + */ +#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) +#define SDC_NICE_WAITING TRUE +#endif + +/*===========================================================================*/ +/* SERIAL driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Default bit rate. + * @details Configuration parameter, this is the baud rate selected for the + * default configuration. + */ +#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) +#define SERIAL_DEFAULT_BITRATE 38400 +#endif + +/** + * @brief Serial buffers size. + * @details Configuration parameter, you can change the depth of the queue + * buffers depending on the requirements of your application. + * @note The default is 64 bytes for both the transmission and receive + * buffers. + */ +#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) +#define SERIAL_BUFFERS_SIZE 16 +#endif + +/*===========================================================================*/ +/* SERIAL_USB driver related setting. */ +/*===========================================================================*/ + +/** + * @brief Serial over USB buffers size. + * @details Configuration parameter, the buffer size must be a multiple of + * the USB data endpoint maximum packet size. + * @note The default is 64 bytes for both the transmission and receive + * buffers. + */ +#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) +#define SERIAL_USB_BUFFERS_SIZE 1 +#endif + +/*===========================================================================*/ +/* SPI driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) +#define SPI_USE_WAIT TRUE +#endif + +/** + * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define SPI_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* USB driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) +#define USB_USE_WAIT TRUE +#endif + +#endif /* _HALCONF_H_ */ + +/** @} */ diff --git a/keyboards/handwired/practice60/hsv2rgb.c b/keyboards/handwired/practice60/hsv2rgb.c new file mode 100644 index 000000000..adb7af8fa --- /dev/null +++ b/keyboards/handwired/practice60/hsv2rgb.c @@ -0,0 +1,80 @@ +/* hsv2rgb.c + * Integer only conversion functions between HSV and RGB + */ + +#include "hsv2rgb.h" + +// TODO fix these buggy macros +#define max(x,y) ((x>y) ? x:y) +#define min(x,y) ((x>y) ? y:x) +#define min3(x,y,z) (min(min(x,y),z)) +#define max3(x,y,z) (max(max(x,y),z)) + + +rgb_color hsv2rgb(hsv_color hsv) +{ + // From : http://qscribble.blogspot.fr/2008/06/integer-conversion-from-hsl-to-rgb.html + int h = hsv.h; + int s = hsv.s; + int v = hsv.v; + rgb_color rgb = {0, 0, 0}; + + if (v == 0) + return rgb; + + // sextant = 0 .. 5 + int sextant = (h*6)/256; + // f = 0 .. 42 + int f = h - (sextant*256)/6; + + int p = (v * (256 - s))/256; + int q = (v * (256*43 - s*f))/(256*43); + int t = (v * (256*43 - s*(43-f)))/(256*43); + + // Corrige les erreurs dues aux arrondis + p = max(min(p, 255), 0); + q = max(min(q, 255), 0); + t = max(min(t, 255), 0); + + switch(sextant){ + case 0: rgb.r = v; rgb.g = t; rgb.b = p; break; + case 1: rgb.r = q; rgb.g = v; rgb.b = p; break; + case 2: rgb.r = p; rgb.g = v; rgb.b = t; break; + case 3: rgb.r = p; rgb.g = q; rgb.b = v; break; + case 4: rgb.r = t; rgb.g = p; rgb.b = v; break; + default:rgb.r = v; rgb.g = p; rgb.b = q; break; + } + return rgb; +} + + +hsv_color rgb2hsv(rgb_color rgb) +{ + // From : http://www.ruinelli.ch/rgb-to-hsv + hsv_color hsv = {0, 0, 0}; + int min, max, delta; + + min = min3(rgb.r, rgb.g, rgb.b); + max = max3(rgb.r, rgb.g, rgb.b); + + if(max==0) { + hsv.h = 0; + hsv.s = 0; + hsv.v = 0; + return hsv; + } + + hsv.v = max; + delta = max - min; + + hsv.s = (delta)*255 / max; + + if(rgb.r == max) + hsv.h = (rgb.g - rgb.b)*42/delta; // between yellow & magenta + else if(rgb.g == max) + hsv.h = 120 + (rgb.b - rgb.r)*42/delta; // between cyan & yellow + else + hsv.h = 240 + (rgb.r - rgb.g)*42/delta; // between magenta & cyan + + return hsv; +} \ No newline at end of file diff --git a/keyboards/handwired/practice60/hsv2rgb.h b/keyboards/handwired/practice60/hsv2rgb.h new file mode 100644 index 000000000..99566c32c --- /dev/null +++ b/keyboards/handwired/practice60/hsv2rgb.h @@ -0,0 +1,23 @@ +/* hsv2rgb.h + * Convert Hue Saturation Value to Red Green Blue + * + * Programme de convertion d'une information HSV en RGB + */ +#ifndef HSV2RGB_H +#define HSV2RGB_H + +typedef struct { + unsigned char h; + unsigned char s; + unsigned char v; +} hsv_color; + +typedef struct { + unsigned char r; + unsigned char g; + unsigned char b; +} rgb_color; + +rgb_color hsv2rgb(hsv_color hsv); + +#endif \ No newline at end of file diff --git a/keyboards/handwired/practice60/keymaps/default/keymap.c b/keyboards/handwired/practice60/keymaps/default/keymap.c new file mode 100644 index 000000000..e15cd2230 --- /dev/null +++ b/keyboards/handwired/practice60/keymaps/default/keymap.c @@ -0,0 +1,48 @@ +/* +Copyright 2012,2013 Jun Wako + +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 . +*/ +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _BASE 0 +#define _FN1 1 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE] = LAYOUT_60_ansi( + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \ + KC_LCTL , KC_LGUI , KC_LALT , KC_SPC , KC_RALT , KC_RGUI , MO(_FN1) , KC_RCTL + ), + + [_FN1] = LAYOUT_60_ansi( + KC_GESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_BSPC, \ + RGB_TOG, RGB_MOD, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______,\ + BL_INC, BL_DEC, BL_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + KC_GRV, _______, _______, _______, _______, _______, _______, _______ + ) +}; diff --git a/keyboards/handwired/practice60/ld/MKL26Z64.ld b/keyboards/handwired/practice60/ld/MKL26Z64.ld new file mode 100644 index 000000000..c4ca8b874 --- /dev/null +++ b/keyboards/handwired/practice60/ld/MKL26Z64.ld @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2013-2016 Fabio Utzig, http://fabioutzig.com + * (C) 2016 flabbergast + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* + * KL26Z64 memory setup. + */ +MEMORY +{ + flash0 : org = 0x00000000, len = 0x100 + flash1 : org = 0x00000400, len = 0x10 + flash2 : org = 0x00000410, len = 62k - 0x410 + flash3 : org = 0x0000F800, len = 2k + flash4 : org = 0x00000000, len = 0 + flash5 : org = 0x00000000, len = 0 + flash6 : org = 0x00000000, len = 0 + flash7 : org = 0x00000000, len = 0 + ram0 : org = 0x1FFFF800, len = 8k + ram1 : org = 0x00000000, len = 0 + ram2 : org = 0x00000000, len = 0 + ram3 : org = 0x00000000, len = 0 + ram4 : org = 0x00000000, len = 0 + ram5 : org = 0x00000000, len = 0 + ram6 : org = 0x00000000, len = 0 + ram7 : org = 0x00000000, len = 0 +} + +/* Flash region for the configuration bytes.*/ +SECTIONS +{ + .cfmprotect : ALIGN(4) SUBALIGN(4) + { + KEEP(*(.cfmconfig)) + } > flash1 +} + +/* For each data/text section two region are defined, a virtual region + and a load region (_LMA suffix).*/ + +/* Flash region to be used for exception vectors.*/ +REGION_ALIAS("VECTORS_FLASH", flash0); +REGION_ALIAS("VECTORS_FLASH_LMA", flash0); + +/* Flash region to be used for constructors and destructors.*/ +REGION_ALIAS("XTORS_FLASH", flash2); +REGION_ALIAS("XTORS_FLASH_LMA", flash2); + +/* Flash region to be used for code text.*/ +REGION_ALIAS("TEXT_FLASH", flash2); +REGION_ALIAS("TEXT_FLASH_LMA", flash2); + +/* Flash region to be used for read only data.*/ +REGION_ALIAS("RODATA_FLASH", flash2); +REGION_ALIAS("RODATA_FLASH_LMA", flash2); + +/* Flash region to be used for various.*/ +REGION_ALIAS("VARIOUS_FLASH", flash2); +REGION_ALIAS("VARIOUS_FLASH_LMA", flash2); + +/* Flash region to be used for RAM(n) initialization data.*/ +REGION_ALIAS("RAM_INIT_FLASH_LMA", flash2); + +/* RAM region to be used for Main stack. This stack accommodates the processing + of all exceptions and interrupts.*/ +REGION_ALIAS("MAIN_STACK_RAM", ram0); + +/* RAM region to be used for the process stack. This is the stack used by + the main() function.*/ +REGION_ALIAS("PROCESS_STACK_RAM", ram0); + +/* RAM region to be used for data segment.*/ +REGION_ALIAS("DATA_RAM", ram0); +REGION_ALIAS("DATA_RAM_LMA", flash2); + +/* RAM region to be used for BSS segment.*/ +REGION_ALIAS("BSS_RAM", ram0); + +/* RAM region to be used for the default heap.*/ +REGION_ALIAS("HEAP_RAM", ram0); + +__eeprom_workarea_start__ = ORIGIN(flash3); +__eeprom_workarea_size__ = LENGTH(flash3); +__eeprom_workarea_end__ = __eeprom_workarea_start__ + __eeprom_workarea_size__; + +/* Generic rules inclusion.*/ +INCLUDE rules.ld diff --git a/keyboards/handwired/practice60/ld/STM32F103x8_stm32duino_bootloader.ld b/keyboards/handwired/practice60/ld/STM32F103x8_stm32duino_bootloader.ld new file mode 100644 index 000000000..d0688ef60 --- /dev/null +++ b/keyboards/handwired/practice60/ld/STM32F103x8_stm32duino_bootloader.ld @@ -0,0 +1,88 @@ +/* + ChibiOS - Copyright (C) 2006..2016 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. +*/ + +/* + * ST32F103xB memory setup for use with the maplemini bootloader. + * You will have to + * #define CORTEX_VTOR_INIT 0x5000 + * in your projects chconf.h + */ +MEMORY +{ + flash0 : org = 0x08002000, len = 64k - 0x2000 + flash1 : org = 0x00000000, len = 0 + flash2 : org = 0x00000000, len = 0 + flash3 : org = 0x00000000, len = 0 + flash4 : org = 0x00000000, len = 0 + flash5 : org = 0x00000000, len = 0 + flash6 : org = 0x00000000, len = 0 + flash7 : org = 0x00000000, len = 0 + ram0 : org = 0x20000000, len = 20k + ram1 : org = 0x00000000, len = 0 + ram2 : org = 0x00000000, len = 0 + ram3 : org = 0x00000000, len = 0 + ram4 : org = 0x00000000, len = 0 + ram5 : org = 0x00000000, len = 0 + ram6 : org = 0x00000000, len = 0 + ram7 : org = 0x00000000, len = 0 +} + +/* For each data/text section two region are defined, a virtual region + and a load region (_LMA suffix).*/ + +/* Flash region to be used for exception vectors.*/ +REGION_ALIAS("VECTORS_FLASH", flash0); +REGION_ALIAS("VECTORS_FLASH_LMA", flash0); + +/* Flash region to be used for constructors and destructors.*/ +REGION_ALIAS("XTORS_FLASH", flash0); +REGION_ALIAS("XTORS_FLASH_LMA", flash0); + +/* Flash region to be used for code text.*/ +REGION_ALIAS("TEXT_FLASH", flash0); +REGION_ALIAS("TEXT_FLASH_LMA", flash0); + +/* Flash region to be used for read only data.*/ +REGION_ALIAS("RODATA_FLASH", flash0); +REGION_ALIAS("RODATA_FLASH_LMA", flash0); + +/* Flash region to be used for various.*/ +REGION_ALIAS("VARIOUS_FLASH", flash0); +REGION_ALIAS("VARIOUS_FLASH_LMA", flash0); + +/* Flash region to be used for RAM(n) initialization data.*/ +REGION_ALIAS("RAM_INIT_FLASH_LMA", flash0); + +/* RAM region to be used for Main stack. This stack accommodates the processing + of all exceptions and interrupts.*/ +REGION_ALIAS("MAIN_STACK_RAM", ram0); + +/* RAM region to be used for the process stack. This is the stack used by + the main() function.*/ +REGION_ALIAS("PROCESS_STACK_RAM", ram0); + +/* RAM region to be used for data segment.*/ +REGION_ALIAS("DATA_RAM", ram0); +REGION_ALIAS("DATA_RAM_LMA", flash0); + +/* RAM region to be used for BSS segment.*/ +REGION_ALIAS("BSS_RAM", ram0); + +/* RAM region to be used for the default heap.*/ +REGION_ALIAS("HEAP_RAM", ram0); + +/* Generic rules inclusion.*/ +INCLUDE rules.ld diff --git a/keyboards/handwired/practice60/led.c b/keyboards/handwired/practice60/led.c new file mode 100644 index 000000000..f15baed16 --- /dev/null +++ b/keyboards/handwired/practice60/led.c @@ -0,0 +1,51 @@ +/* +Copyright 2012 Jun Wako + +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 . +*/ + +#include "hal.h" +#include "backlight.h" +#include "led.h" +#include "printf.h" + +void backlight_init_ports(void) { + printf("backlight_init_ports()\n"); + #ifdef BACKLIGHT_ENABLE + palSetPadMode(GPIOA, 8, PAL_MODE_OUTPUT_PUSHPULL); + palSetPad(GPIOA, 8); + #endif +} + +void backlight_set(uint8_t level) { + printf("backlight_set(%d)\n", level); + #ifdef BACKLIGHT_ENABLE + if (level == 0) { + // Turn backlight off + palSetPad(GPIOA, 8); + } else { + // Turn backlight on + palClearPad(GPIOA, 8); + } + #endif +} + +void led_set(uint8_t usb_led) +{ + if (usb_led & (1</os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES) +MCU_FAMILY = STM32 +MCU_SERIES = STM32F1xx +# linker script to use +# it should exist either in /os/common/ports/ARMCMx/compilers/GCC/ld/ +# or /ld/ +# startup code to use +# is should exist in /os/common/ports/ARMCMx/compilers/GCC/mk/ +MCU_STARTUP = stm32f1xx +# it should exist either in /os/hal/boards/ +# or /boards +# Cortex version +# Teensy LC is cortex-m0; Teensy 3.x are cortex-m4 +MCU = cortex-m3 +# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7 +ARMV = 7 +# If you want to be able to jump to bootloader from firmware on STM32 MCUs, +# set the correct BOOTLOADER_ADDRESS. Either set it here, or define it in +# ./bootloader_defs.h or in ./boards//bootloader_defs.h (if you have +# a custom board definition that you plan to reuse). +# If you're not setting it here, leave it commented out. +# It is chip dependent, the correct number can be looked up here (page 175): +# http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf +# This also requires a patch to chibios: +# /tmk_core/tool/chibios/ch-bootloader-jump.patch +#STM32_BOOTLOADER_ADDRESS = 0x1FFFC800 + + +#BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration +MOUSEKEY_ENABLE = yes # Mouse keys +EXTRAKEY_ENABLE = yes # Audio control and System control +CONSOLE_ENABLE = yes # Console for debug +COMMAND_ENABLE = yes # Commands for debug and configuration +SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover +BACKLIGHT_ENABLE = yes + +LAYOUTS = 60_ansi + +DEFAULT_FOLDER = handwired/practice60 diff --git a/keyboards/handwired/practice60/underglow.c b/keyboards/handwired/practice60/underglow.c new file mode 100644 index 000000000..1383af189 --- /dev/null +++ b/keyboards/handwired/practice60/underglow.c @@ -0,0 +1,157 @@ +#include "ch.h" +#include "hal.h" + +#include "hsv2rgb.h" +#include "underglow.h" + +#define BYTES_FOR_LED_BYTE 4 +#define NB_COLORS 3 +#define BYTES_FOR_LED BYTES_FOR_LED_BYTE*NB_COLORS +#define DATA_SIZE BYTES_FOR_LED*NB_LEDS +#define RESET_SIZE 200 +#define PREAMBLE_SIZE 4 + +// Define the spi your LEDs are plugged to here +#define LEDS_SPI SPID2 +// Define the number of LEDs you wish to control in your LED strip +#define NB_LEDS 8 + +#define LED_SPIRAL 1 + +static uint8_t txbuf[PREAMBLE_SIZE + DATA_SIZE + RESET_SIZE]; +static uint8_t get_protocol_eq(uint8_t data, int pos); + +/* + * This lib is meant to be used asynchronously, thus the colors contained in + * the txbuf will be sent in loop, so that the colors are always the ones you + * put in the table (the user thus have less to worry about) + * + * Since the data are sent via DMA, and the call to spiSend is a blocking one, + * the processor ressources are not used to much, if you see your program being + * too slow, simply add a: + * chThdSleepMilliseconds(x); + * after the spiSend, where you increment x untill you are satisfied with your + * program speed, another trick may be to lower this thread priority : your call + */ +static THD_WORKING_AREA(LEDS_THREAD_WA, 128); +static THD_FUNCTION(ledsThread, arg) { + (void) arg; + while(1){ + spiSend(&LEDS_SPI, PREAMBLE_SIZE + DATA_SIZE + RESET_SIZE, txbuf); + } +} + +#if LED_SPIRAL +/* + * 'Led spiral' is a simple demo in which we put all the leds to the same + * color, where this color does all the hsv circle in loop. + * If you want to launch the thread that will chage the led colors to the + * appropriate value, simply set LED_SPIRAL to 1. + */ +static THD_WORKING_AREA(HSVTRANS_WA, 128); +static THD_FUNCTION(hsv_transThread, arg){ + (void) arg; + hsv_color color = {0, 255, 127}; + while(1){ + color.h += 1; + color.h %= 256; + set_leds_color_hsv(color); + chThdSleepMilliseconds(50); + } +} +#endif + +static const SPIConfig spicfg = { + NULL, + GPIOB, + 15, + SPI_CR1_BR_1|SPI_CR1_BR_0 // baudrate : fpclk / 8 => 1tick is 0.32us +}; + +/* + * Function used to initialize the driver. + * + * Starts by shutting off all the LEDs. + * Then gets access on the LED_SPI driver. + * May eventually launch an animation on the LEDs (e.g. a thread setting the + * txbuff values) + */ +void leds_init(void){ + for(int i = 0; i < RESET_SIZE; i++) + txbuf[DATA_SIZE+i] = 0x00; + for (int i=0; i Date: Tue, 13 Nov 2018 00:46:01 +0000 Subject: [PATCH 506/788] Fixed incorrect link to feature_combo.md in features.md docs file. Was linked to feature_combos.md, but _sidebar.md, _summary.md, and config_options.md all link to feature_combo.md. Assuming that it should not be pluralized. (#4411) --- docs/features.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features.md b/docs/features.md index 43d972e68..85f4cf6e0 100644 --- a/docs/features.md +++ b/docs/features.md @@ -8,7 +8,7 @@ QMK has a staggering number of features for building your keyboard. It can take * [Auto Shift](feature_auto_shift.md) - Tap for the normal key, hold slightly longer for its shifted state. * [Backlight](feature_backlight.md) - LED lighting support for your keyboard. * [Bootmagic](feature_bootmagic.md) - Adjust the behavior of your keyboard using hotkeys. -* [Combos](feature_combos.md) - Custom actions for multiple key holds. +* [Combos](feature_combo.md) - Custom actions for multiple key holds. * [Command](feature_command.md) - Runtime version of bootmagic (Formerly known as "Magic"). * [Dynamic Macros](feature_dynamic_macros.md) - Record and playback macros from the keyboard itself. * [Grave Escape](feature_grave_esc.md) - Lets you use a single key for Esc and Grave. From 9b28dc84889357b9097ece2557c926ffa12a8479 Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Mon, 12 Nov 2018 21:46:34 -0800 Subject: [PATCH 507/788] KBDFans KBD67 Support (#4412) * initial commit for kbd67 keyboard * add in a standard matrix * get the correct matrix for layout_all * add a layout_65_ansi LAYOUT macro * get a default keymap in * add caps lock led support * fix formatting of my name in the comments * add QMK Configurator support * turn on bootmagic --- keyboards/kbd67/config.h | 240 ++++++++++++++++++++++ keyboards/kbd67/info.json | 16 ++ keyboards/kbd67/kbd67.c | 51 +++++ keyboards/kbd67/kbd67.h | 59 ++++++ keyboards/kbd67/keymaps/default/config.h | 19 ++ keyboards/kbd67/keymaps/default/keymap.c | 99 +++++++++ keyboards/kbd67/keymaps/default/readme.md | 1 + keyboards/kbd67/readme.md | 15 ++ keyboards/kbd67/rules.mk | 80 ++++++++ 9 files changed, 580 insertions(+) create mode 100644 keyboards/kbd67/config.h create mode 100644 keyboards/kbd67/info.json create mode 100644 keyboards/kbd67/kbd67.c create mode 100644 keyboards/kbd67/kbd67.h create mode 100644 keyboards/kbd67/keymaps/default/config.h create mode 100644 keyboards/kbd67/keymaps/default/keymap.c create mode 100644 keyboards/kbd67/keymaps/default/readme.md create mode 100644 keyboards/kbd67/readme.md create mode 100644 keyboards/kbd67/rules.mk diff --git a/keyboards/kbd67/config.h b/keyboards/kbd67/config.h new file mode 100644 index 000000000..2e3cf85c3 --- /dev/null +++ b/keyboards/kbd67/config.h @@ -0,0 +1,240 @@ +/* +Copyright 2018 MechMerlin + +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 . +*/ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0000 +#define DEVICE_VER 0x0001 +#define MANUFACTURER kbdfans +#define PRODUCT kbd67 +#define DESCRIPTION 65% Keyboard + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 16 + +/* + * 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 { D0, D1, D2, D3, D5 } +#define MATRIX_COL_PINS { F0, F1, E6, C7, C6, B7, D4, B1, B0, B5, B4, D7, D6, B3, F4, F5 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +#define BACKLIGHT_PIN B6 +#define BACKLIGHT_BREATHING +#define BACKLIGHT_LEVELS 3 + +#define RGB_DI_PIN E2 +#ifdef RGB_DI_PIN + #define RGBLED_NUM 20 + #define RGBLIGHT_HUE_STEP 8 + #define RGBLIGHT_SAT_STEP 8 + #define RGBLIGHT_VAL_STEP 8 + #define RGBLIGHT_LIMIT_VAL 180 /* The maximum brightness level */ + // #define RGBLIGHT_SLEEP /* If defined, the RGB lighting will be switched off when the host goes to sleep */ +/*== all animations enable ==*/ + #define RGBLIGHT_ANIMATIONS +/*== or choose animations ==*/ + // #define RGBLIGHT_EFFECT_BREATHING + // #define RGBLIGHT_EFFECT_RAINBOW_MOOD + // #define RGBLIGHT_EFFECT_RAINBOW_SWIRL + // #define RGBLIGHT_EFFECT_SNAKE + // #define RGBLIGHT_EFFECT_KNIGHT + // #define RGBLIGHT_EFFECT_CHRISTMAS + // #define RGBLIGHT_EFFECT_STATIC_GRADIENT + // #define RGBLIGHT_EFFECT_RGB_TEST + // #define RGBLIGHT_EFFECT_ALTERNATING +#endif + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* 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 userful 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 + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * 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 + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +//#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ + +/* Bootmagic Lite key configuration */ +// #define BOOTMAGIC_LITE_ROW 0 +// #define BOOTMAGIC_LITE_COLUMN 0 diff --git a/keyboards/kbd67/info.json b/keyboards/kbd67/info.json new file mode 100644 index 000000000..70a926a7f --- /dev/null +++ b/keyboards/kbd67/info.json @@ -0,0 +1,16 @@ +{ + "keyboard_name": "kbd67", + "url": "", + "maintainer": "qmk", + "width": 16, + "height": 5, + "layouts": { + "LAYOUT_all": { + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":15, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":15, "y":1}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2, "w":2.25}, {"x":15, "y":2}, {"x":0, "y":3, "w":1.25}, {"x":1.25, "y":3}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"x":15, "y":3}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":2.75}, {"x":6.5, "y":4, "w":1.25}, {"x":7.75, "y":4, "w":2.25}, {"x":10, "y":4}, {"x":11, "y":4}, {"x":12, "y":4}, {"x":13, "y":4}, {"x":14, "y":4}, {"x":15, "y":4}] + }, + + "LAYOUT_65_ansi": { + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0, "w":2}, {"x":15, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":15, "y":1}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2, "w":2.25}, {"x":15, "y":2}, {"x":0, "y":3, "w":2.25}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"x":15, "y":3}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"x":10, "y":4}, {"x":11, "y":4}, {"x":12, "y":4}, {"x":13, "y":4}, {"x":14, "y":4}, {"x":15, "y":4}] + } + } +} diff --git a/keyboards/kbd67/kbd67.c b/keyboards/kbd67/kbd67.c new file mode 100644 index 000000000..5e0369673 --- /dev/null +++ b/keyboards/kbd67/kbd67.c @@ -0,0 +1,51 @@ +/* Copyright 2018 MechMerlin + * + * 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 . + */ +#include "kbd67.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + + if (usb_led & (1 << USB_LED_CAPS_LOCK)) { + DDRB |= (1 << 2); + PORTB &= ~(1 << 2); + } else { + DDRB &= ~(1 << 2); + PORTB &= ~(1 << 2); + } + + led_set_user(usb_led); +} diff --git a/keyboards/kbd67/kbd67.h b/keyboards/kbd67/kbd67.h new file mode 100644 index 000000000..4a98c66f7 --- /dev/null +++ b/keyboards/kbd67/kbd67.h @@ -0,0 +1,59 @@ +/* Copyright 2018 MechMerlin + * + * 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 . + */ +#ifndef KBD67_H +#define KBD67_H + +#include "quantum.h" + +/* This a shortcut to help you visually see your layout. + * + * The first section contains all of the arguments representing the physical + * layout of the board and position of the keys. + * + * The second converts the arguments into a two-dimensional array which + * represents the switch matrix. + */ +#define LAYOUT_all( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, \ + K10, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F, \ + K20, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2F, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, K3E, K3F, \ + K40, K41, K43, K44, K46, K48, K4A, K4B, K4C, K4D, K4E, K4F \ +) \ +{ \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F }, \ + { K10, KC_NO, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F }, \ + { K20, KC_NO, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, KC_NO, K2F }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, KC_NO, K3D, K3E, K3F }, \ + { K40, K41, KC_NO, K43, K44, KC_NO, K46, KC_NO, K48, KC_NO, K4A, K4B, K4C, K4D, K4E, K4F }, \ +} + +#define LAYOUT_65_ansi( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0E, K0F, \ + K10, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F, \ + K20, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2F, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, K3E, K3F, \ + K40, K41, K43, K46, K4A, K4B, K4C, K4D, K4E, K4F \ +) \ +{ \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, KC_NO, K0E, K0F }, \ + { K10, KC_NO, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F }, \ + { K20, KC_NO, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, KC_NO, K2F }, \ + { K30, KC_NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, KC_NO, K3D, K3E, K3F }, \ + { K40, K41, KC_NO, K43, KC_NO, KC_NO, K46, KC_NO, KC_NO, KC_NO, K4A, K4B, K4C, K4D, K4E, K4F }, \ +} + +#endif diff --git a/keyboards/kbd67/keymaps/default/config.h b/keyboards/kbd67/keymaps/default/config.h new file mode 100644 index 000000000..a3ed4f762 --- /dev/null +++ b/keyboards/kbd67/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 MechMerlin + * + * 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 . + */ + +#pragma once + +// place overrides here diff --git a/keyboards/kbd67/keymaps/default/keymap.c b/keyboards/kbd67/keymaps/default/keymap.c new file mode 100644 index 000000000..89fa9a534 --- /dev/null +++ b/keyboards/kbd67/keymaps/default/keymap.c @@ -0,0 +1,99 @@ +/* Copyright 2018 'mechmerlin' + * + * 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 . + */ +#include QMK_KEYBOARD_H + +// Defines the keycodes used by our macros in process_record_user +enum custom_keycodes { + QMKBEST = SAFE_RANGE, + QMKURL +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Keymap (Base Layer) Default Layer + * ,----------------------------------------------------------------. + * |Esc | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp |~ ` | + * |----------------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ |Del | + * |----------------------------------------------------------------| + * |CAPS | A| S| D| F| G| H| J| K| L| ;| '|Return |PgUp| + * |----------------------------------------------------------------| + * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | Up|PgDn| + * |----------------------------------------------------------------| + * |Ctrl|Win |Alt | Space |Alt| FN|Ctrl|Lef|Dow|Rig | + * `----------------------------------------------------------------' + */ +[0] = LAYOUT_65_ansi( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_HOME, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP, \ + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + /* Keymap Fn Layer + * ,----------------------------------------------------------------. + * | | F1|F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12|Del |Ins | + * |----------------------------------------------------------------| + * | | |Up | | | | | | | | | | | |Hme | + * |----------------------------------------------------------------| + * | |<- |Dn | ->| | | | | | | | | |End | + * |----------------------------------------------------------------| + * | | | |Bl-|BL |BL+| |VU-|VU+|MUT| | McL|MsU|McR | + * |----------------------------------------------------------------| + * | | | | | | | |MsL|MsD|MsR | + * `----------------------------------------------------------------' + */ +[1] = LAYOUT_65_ansi( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL,KC_INS, \ + KC_CAPS,_______, KC_UP,_______,_______,_______,_______,_______,KC_PSCR,KC_SLCK,KC_PAUS, KC_UP,_______, _______,_______, \ + _______,KC_LEFT,KC_DOWN,KC_RGHT,_______,_______,_______,_______,KC_HOME,KC_PGUP,KC_LEFT,KC_RGHT, _______,_______, \ + _______,_______,_______,_______,_______,_______,_______,_______, KC_END,KC_PGDN,KC_DOWN, _______,KC_PGUP,_______, \ + _______, _______, _______, _______, _______,_______,_______,KC_HOME,KC_PGDN, KC_END), + +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QMKBEST: + if (record->event.pressed) { + // when keycode QMKBEST is pressed + SEND_STRING("QMK is the best thing ever!"); + } else { + // when keycode QMKBEST is released + } + break; + case QMKURL: + if (record->event.pressed) { + // when keycode QMKURL is pressed + SEND_STRING("https://qmk.fm/" SS_TAP(X_ENTER)); + } else { + // when keycode QMKURL is released + } + break; + } + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/kbd67/keymaps/default/readme.md b/keyboards/kbd67/keymaps/default/readme.md new file mode 100644 index 000000000..2cb43c5e1 --- /dev/null +++ b/keyboards/kbd67/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for kbd67 diff --git a/keyboards/kbd67/readme.md b/keyboards/kbd67/readme.md new file mode 100644 index 000000000..734b1a63a --- /dev/null +++ b/keyboards/kbd67/readme.md @@ -0,0 +1,15 @@ +# kbd67 + +![kbd67](imgur.com image replace me!) + +65% keyboard with blocker. + +Keyboard Maintainer: [MechMerlin](https://github.com/mechmerlin) +Hardware Supported: KBD67 PCB +Hardware Availability: [KBDFans](https://kbdfans.cn/products/coming-soon-kbd67-mechanical-keyboard-diy-kit) + +Make example for this keyboard (after setting up your build environment): + + make kbd67:default + +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). diff --git a/keyboards/kbd67/rules.mk b/keyboards/kbd67/rules.mk new file mode 100644 index 000000000..9d25d7b21 --- /dev/null +++ b/keyboards/kbd67/rules.mk @@ -0,0 +1,80 @@ +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = no # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) From 709bf386f4429687a8ec73ebd29193e5f209461b Mon Sep 17 00:00:00 2001 From: Andrew Kannan Date: Tue, 13 Nov 2018 01:03:48 -0500 Subject: [PATCH 508/788] Update Practice60 to use MT feature and revise system ticks (#4413) * Update Practice60 to use MT feature and revise system tics * Increase system tick frequency 10,000 instead of 10,000 --- keyboards/handwired/practice60/chconf.h | 6 +++--- keyboards/handwired/practice60/keymaps/default/keymap.c | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/keyboards/handwired/practice60/chconf.h b/keyboards/handwired/practice60/chconf.h index dfb1f9dfb..bbd9b2da6 100644 --- a/keyboards/handwired/practice60/chconf.h +++ b/keyboards/handwired/practice60/chconf.h @@ -41,14 +41,14 @@ * @brief System time counter resolution. * @note Allowed values are 16 or 32 bits. */ -#define CH_CFG_ST_RESOLUTION 16 +#define CH_CFG_ST_RESOLUTION 32 /** * @brief System tick frequency. * @details Frequency of the system timer that drives the system ticks. This * setting also defines the system tick time unit. */ -#define CH_CFG_ST_FREQUENCY 2000 +#define CH_CFG_ST_FREQUENCY 100000 /** * @brief Time delta constant for the tick-less mode. @@ -58,7 +58,7 @@ * The value one is not valid, timeouts are rounded up to * this value. */ -#define CH_CFG_ST_TIMEDELTA 2 +#define CH_CFG_ST_TIMEDELTA 0 /** @} */ diff --git a/keyboards/handwired/practice60/keymaps/default/keymap.c b/keyboards/handwired/practice60/keymaps/default/keymap.c index e15cd2230..afea72b11 100644 --- a/keyboards/handwired/practice60/keymaps/default/keymap.c +++ b/keyboards/handwired/practice60/keymaps/default/keymap.c @@ -32,7 +32,7 @@ enum custom_keycodes { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_BASE] = LAYOUT_60_ansi( KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, MT(MOD_LSFT, KC_Y), KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \ KC_LCTL , KC_LGUI , KC_LALT , KC_SPC , KC_RALT , KC_RGUI , MO(_FN1) , KC_RCTL From 7e87532ec261bcc30d7fa5dfc5bf6427e2d3d36e Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Tue, 13 Nov 2018 08:26:55 -0800 Subject: [PATCH 509/788] converter/ibm_terminal Refactor and Configurator support (#4414) * IBM Terminal converter: layout macro refactor - Renamed KEYMAP to LAYOUT - Renamed KEYMAP_101 to LAYOUT_101 - minor matrix array fixes * IBM Terminal converter: default keymap refactor - Updated layout macro names - Updated to #include QMK_KEYBOARD_H - config.h updated to use #pragma once * IBM Terminal converter: priyadi keymap refactor - Updated layout macro names - Updated to #include QMK_KEYBOARD_H - Removed redundant KC_TRNS and KC_NO defines - config.h updated to use #pragma once * IBM Terminal converter: Configurator support * IBM Terminal converter: readme cleanup Updated markdown formatting. * IBM Terminal converter: readme rename Renamed file to fully lowercase. --- keyboards/converter/ibm_terminal/README.md | 40 --- .../converter/ibm_terminal/ibm_terminal.h | 10 +- keyboards/converter/ibm_terminal/info.json | 245 ++++++++++++++++++ .../ibm_terminal/keymaps/default/config.h | 7 +- .../ibm_terminal/keymaps/default/keymap.c | 12 +- .../ibm_terminal/keymaps/priyadi/config.h | 7 +- .../ibm_terminal/keymaps/priyadi/keymap.c | 28 +- keyboards/converter/ibm_terminal/readme.md | 39 +++ 8 files changed, 305 insertions(+), 83 deletions(-) delete mode 100644 keyboards/converter/ibm_terminal/README.md create mode 100644 keyboards/converter/ibm_terminal/info.json create mode 100644 keyboards/converter/ibm_terminal/readme.md diff --git a/keyboards/converter/ibm_terminal/README.md b/keyboards/converter/ibm_terminal/README.md deleted file mode 100644 index dff26e059..000000000 --- a/keyboards/converter/ibm_terminal/README.md +++ /dev/null @@ -1,40 +0,0 @@ -Keyboard converter for IBM terminal keyboard -============================================ - -This is a port of TMK's converter/terminal_usb to QMK. - -It supports PS/2 Scan Code Set 3 and runs on USB AVR chips such like PJRC Teensy. -I tested the converter on ATMega32U4 with 1392595(102keys) and 6110345(122keys). - -Source code: https://github.com/qmk/qmk_firmware.git -Article: http://geekhack.org/index.php?topic=27272.0 - - -CONNECTION ----------- -Keyboard ATMega32U4 ----------------------- -Data: PD2 -Clock: PD5 - -And VCC and GND, of course. See RESOURCE for keyboard connector pin assign. - - -BUILD ------ -$ git clone https://github.com/qmk/qmk_firmware.git -$ cd qmk_firmware -$ make converter/ibm_terminal:default - - -RESOURCE --------- -Soarer's Converter: http://geekhack.org/index.php?topic=17458.0 -102keys(1392595): http://geekhack.org/index.php?topic=10737.0 -122keys(1390876): http://www.seasip.info/VintagePC/ibm_1390876.html -KbdBabel: http://www.kbdbabel.org/ -RJ45 Connector: http://www.kbdbabel.org/conn/kbd_connector_ibmterm.png -DIN Connector: http://www.kbdbabel.org/conn/kbd_connector_ibm3179_318x_319x.png -WinAVR: http://winavr.sourceforge.net/ - -EOF diff --git a/keyboards/converter/ibm_terminal/ibm_terminal.h b/keyboards/converter/ibm_terminal/ibm_terminal.h index c6468349c..adf048206 100644 --- a/keyboards/converter/ibm_terminal/ibm_terminal.h +++ b/keyboards/converter/ibm_terminal/ibm_terminal.h @@ -19,7 +19,7 @@ void matrix_init_user(void); * 17| | * +---------+ */ -#define KEYMAP( \ +#define LAYOUT( \ K08,K10,K18,K20,K28,K30,K38,K40,K48,K50,K57,K5F, \ K07,K0F,K17,K1F,K27,K2F,K37,K3F,K47,K4F,K56,K5E, \ \ @@ -45,13 +45,13 @@ void matrix_init_user(void); { K68, K69, K6A, K6B, K6C, K6D, K6E, K6F }, \ { K70, K71, K72, K73, K74, K75, K76, K77 }, \ { K78, K79, K7A, K7B, K7C, K7D, K7E, KC_NO }, \ - { KC_NO, KC_NO, KC_NO, K83, K84, KC_NO, KC_NO, KC_NO,}, \ + { KC_NO, KC_NO, KC_NO, K83, K84, KC_NO, KC_NO, KC_NO } \ } /* * IBM Terminal keyboard 1399625, 101-key */ -#define KEYMAP_101( \ +#define LAYOUT_101( \ K08, K07,K0F,K17,K1F,K27,K2F,K37,K3F,K47,K4F,K56,K5E, K57,K5F,K62, \ \ K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K66, K67,K6E,K6F, K76,K77,K7E,K84, \ @@ -76,7 +76,7 @@ void matrix_init_user(void); { KC_NO, K69, K6A, K6B, K6C, K6D, K6E, K6F }, \ { K70, K71, K72, K73, K74, K75, K76, K77 }, \ { KC_NO, K79, K7A, KC_NO, K7C, K7D, K7E, KC_NO }, \ - { KC_NO, KC_NO, KC_NO, KC_NO, K84, KC_NO, KC_NO, KC_NO,}, \ + { KC_NO, KC_NO, KC_NO, KC_NO, K84, KC_NO, KC_NO, KC_NO } \ } -#endif \ No newline at end of file +#endif diff --git a/keyboards/converter/ibm_terminal/info.json b/keyboards/converter/ibm_terminal/info.json new file mode 100644 index 000000000..f064f3c5b --- /dev/null +++ b/keyboards/converter/ibm_terminal/info.json @@ -0,0 +1,245 @@ +{ + "keyboard_name": "Keyboard converter for IBM terminal keyboard", + "url": "", + "maintainer": "qmk", + "width": 24.75, + "height": 8, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"F13", "x":3.25, "y":0}, + {"label":"F14", "x":4.25, "y":0}, + {"label":"F15", "x":5.25, "y":0}, + {"label":"F16", "x":6.25, "y":0}, + {"label":"F17", "x":7.25, "y":0}, + {"label":"F18", "x":8.25, "y":0}, + {"label":"F19", "x":9.25, "y":0}, + {"label":"F20", "x":10.25, "y":0}, + {"label":"F21", "x":11.25, "y":0}, + {"label":"F22", "x":12.25, "y":0}, + {"label":"F23", "x":13.25, "y":0}, + {"label":"F24", "x":14.25, "y":0}, + {"label":"F1", "x":3.25, "y":1}, + {"label":"F2", "x":4.25, "y":1}, + {"label":"F3", "x":5.25, "y":1}, + {"label":"F4", "x":6.25, "y":1}, + {"label":"F5", "x":7.25, "y":1}, + {"label":"F6", "x":8.25, "y":1}, + {"label":"F7", "x":9.25, "y":1}, + {"label":"F8", "x":10.25, "y":1}, + {"label":"F9", "x":11.25, "y":1}, + {"label":"F10", "x":12.25, "y":1}, + {"label":"F11", "x":13.25, "y":1}, + {"label":"F12", "x":14.25, "y":1}, + {"label":"Print Screen", "x":0, "y":3}, + {"label":"Esc", "x":1, "y":3}, + {"label":"Esc", "x":2.25, "y":3}, + {"label":"1", "x":3.25, "y":3}, + {"label":"2", "x":4.25, "y":3}, + {"label":"3", "x":5.25, "y":3}, + {"label":"4", "x":6.25, "y":3}, + {"label":"5", "x":7.25, "y":3}, + {"label":"6", "x":8.25, "y":3}, + {"label":"7", "x":9.25, "y":3}, + {"label":"8", "x":10.25, "y":3}, + {"label":"9", "x":11.25, "y":3}, + {"label":"0", "x":12.25, "y":3}, + {"label":"-", "x":13.25, "y":3}, + {"label":"=", "x":14.25, "y":3}, + {"label":"No", "x":15.25, "y":3}, + {"label":"Back Space", "x":16.25, "y":3}, + {"label":"Insert", "x":17.5, "y":3}, + {"label":"Home", "x":18.5, "y":3}, + {"label":"Page Up", "x":19.5, "y":3}, + {"label":"Num Lock", "x":20.75, "y":3}, + {"label":"/", "x":21.75, "y":3}, + {"label":"*", "x":22.75, "y":3}, + {"label":"-", "x":23.75, "y":3}, + {"label":"Scroll Lock", "x":0, "y":4}, + {"label":"Int4", "x":1, "y":4}, + {"label":"Tab", "x":2.25, "y":4, "w":1.5}, + {"label":"Q", "x":3.75, "y":4}, + {"label":"W", "x":4.75, "y":4}, + {"label":"E", "x":5.75, "y":4}, + {"label":"R", "x":6.75, "y":4}, + {"label":"T", "x":7.75, "y":4}, + {"label":"Y", "x":8.75, "y":4}, + {"label":"U", "x":9.75, "y":4}, + {"label":"I", "x":10.75, "y":4}, + {"label":"O", "x":11.75, "y":4}, + {"label":"P", "x":12.75, "y":4}, + {"label":"[", "x":13.75, "y":4}, + {"label":"]", "x":14.75, "y":4}, + {"label":"No", "x":15.75, "y":4, "w":1.5}, + {"label":"Delete", "x":17.5, "y":4}, + {"label":"End", "x":18.5, "y":4}, + {"label":"Page Down", "x":19.5, "y":4}, + {"label":"7", "x":20.75, "y":4}, + {"label":"8", "x":21.75, "y":4}, + {"label":"9", "x":22.75, "y":4}, + {"label":"+", "x":23.75, "y":4}, + {"label":"Pause", "x":0, "y":5}, + {"label":"Int5", "x":1, "y":5}, + {"label":"Caps Lock", "x":2.25, "y":5, "w":1.75}, + {"label":"A", "x":4, "y":5}, + {"label":"S", "x":5, "y":5}, + {"label":"D", "x":6, "y":5}, + {"label":"F", "x":7, "y":5}, + {"label":"G", "x":8, "y":5}, + {"label":"H", "x":9, "y":5}, + {"label":"J", "x":10, "y":5}, + {"label":"K", "x":11, "y":5}, + {"label":"L", "x":12, "y":5}, + {"label":";", "x":13, "y":5}, + {"label":"'", "x":14, "y":5}, + {"label":"\\", "x":15, "y":5}, + {"label":"Enter", "x":16, "y":5, "w":1.25}, + {"label":"Up", "x":18.5, "y":5}, + {"label":"4", "x":20.75, "y":5}, + {"label":"5", "x":21.75, "y":5}, + {"label":"6", "x":22.75, "y":5}, + {"label":",", "x":23.75, "y":5}, + {"label":"App", "x":0, "y":6}, + {"label":"Int6", "x":1, "y":6}, + {"label":"Shift", "x":2.25, "y":6, "w":1.25}, + {"label":"ISO \\", "x":3.5, "y":6}, + {"label":"Z", "x":4.5, "y":6}, + {"label":"X", "x":5.5, "y":6}, + {"label":"C", "x":6.5, "y":6}, + {"label":"V", "x":7.5, "y":6}, + {"label":"B", "x":8.5, "y":6}, + {"label":"N", "x":9.5, "y":6}, + {"label":"M", "x":10.5, "y":6}, + {"label":",", "x":11.5, "y":6}, + {"label":".", "x":12.5, "y":6}, + {"label":"/", "x":13.5, "y":6}, + {"label":"No", "x":14.5, "y":6}, + {"label":"Shift", "x":15.5, "y":6, "w":1.75}, + {"label":"Left", "x":17.5, "y":6}, + {"label":"Int2", "x":18.5, "y":6}, + {"label":"Right", "x":19.5, "y":6}, + {"label":"1", "x":20.75, "y":6}, + {"label":"2", "x":21.75, "y":6}, + {"label":"3", "x":22.75, "y":6}, + {"label":"Enter", "x":23.75, "y":6}, + {"label":"RGUI", "x":0, "y":7}, + {"label":"lgui", "x":1, "y":7}, + {"label":"Ctrl", "x":2.25, "y":7, "w":1.5}, + {"label":"Alt", "x":4.75, "y":7, "w":1.5}, + {"label":"Space", "x":6.25, "y":7, "w":7}, + {"label":"Alt", "x":13.25, "y":7, "w":1.5}, + {"label":"Ctrl", "x":15.75, "y":7, "w":1.5}, + {"label":"Down", "x":18.5, "y":7}, + {"label":"No", "x":20.75, "y":7}, + {"label":"0", "x":21.75, "y":7}, + {"label":".", "x":22.75, "y":7}, + {"label":"No", "x":23.75, "y":7} + ] + }, + "LAYOUT_101": { + "layout": [ + {"label":"Esc", "x":0, "y":0}, + {"label":"F1", "x":2, "y":0}, + {"label":"F2", "x":3, "y":0}, + {"label":"F3", "x":4, "y":0}, + {"label":"F4", "x":5, "y":0}, + {"label":"F5", "x":6.5, "y":0}, + {"label":"F6", "x":7.5, "y":0}, + {"label":"F7", "x":8.5, "y":0}, + {"label":"F8", "x":9.5, "y":0}, + {"label":"F9", "x":11, "y":0}, + {"label":"F10", "x":12, "y":0}, + {"label":"F11", "x":13, "y":0}, + {"label":"F12", "x":14, "y":0}, + {"label":"Print Screen", "x":15.25, "y":0}, + {"label":"Scroll Lock", "x":16.25, "y":0}, + {"label":"Pause", "x":17.25, "y":0}, + {"label":"`", "x":0, "y":2}, + {"label":"1", "x":1, "y":2}, + {"label":"2", "x":2, "y":2}, + {"label":"3", "x":3, "y":2}, + {"label":"4", "x":4, "y":2}, + {"label":"5", "x":5, "y":2}, + {"label":"6", "x":6, "y":2}, + {"label":"7", "x":7, "y":2}, + {"label":"8", "x":8, "y":2}, + {"label":"9", "x":9, "y":2}, + {"label":"0", "x":10, "y":2}, + {"label":"-", "x":11, "y":2}, + {"label":"=", "x":12, "y":2}, + {"label":"Back Space", "x":13, "y":2, "w":2}, + {"label":"Insert", "x":15.25, "y":2}, + {"label":"Home", "x":16.25, "y":2}, + {"label":"Page Up", "x":17.25, "y":2}, + {"label":"Num Lock", "x":18.5, "y":2}, + {"label":"/", "x":19.5, "y":2}, + {"label":"*", "x":20.5, "y":2}, + {"label":"-", "x":21.5, "y":2}, + {"label":"Tab", "x":0, "y":3, "w":1.5}, + {"label":"Q", "x":1.5, "y":3}, + {"label":"W", "x":2.5, "y":3}, + {"label":"E", "x":3.5, "y":3}, + {"label":"R", "x":4.5, "y":3}, + {"label":"T", "x":5.5, "y":3}, + {"label":"Y", "x":6.5, "y":3}, + {"label":"U", "x":7.5, "y":3}, + {"label":"I", "x":8.5, "y":3}, + {"label":"O", "x":9.5, "y":3}, + {"label":"P", "x":10.5, "y":3}, + {"label":"[", "x":11.5, "y":3}, + {"label":"]", "x":12.5, "y":3}, + {"label":"\\", "x":13.5, "y":3, "w":1.5}, + {"label":"Delete", "x":15.25, "y":3}, + {"label":"End", "x":16.25, "y":3}, + {"label":"Page Down", "x":17.25, "y":3}, + {"label":"7", "x":18.5, "y":3}, + {"label":"8", "x":19.5, "y":3}, + {"label":"9", "x":20.5, "y":3}, + {"label":"Caps Lock", "x":0, "y":4, "w":1.75}, + {"label":"A", "x":1.75, "y":4}, + {"label":"S", "x":2.75, "y":4}, + {"label":"D", "x":3.75, "y":4}, + {"label":"F", "x":4.75, "y":4}, + {"label":"G", "x":5.75, "y":4}, + {"label":"H", "x":6.75, "y":4}, + {"label":"J", "x":7.75, "y":4}, + {"label":"K", "x":8.75, "y":4}, + {"label":"L", "x":9.75, "y":4}, + {"label":";", "x":10.75, "y":4}, + {"label":"'", "x":11.75, "y":4}, + {"label":"Enter", "x":12.75, "y":4, "w":2.25}, + {"label":"4", "x":18.5, "y":4}, + {"label":"5", "x":19.5, "y":4}, + {"label":"6", "x":20.5, "y":4}, + {"label":"+", "x":21.5, "y":3, "h":2}, + {"label":"Shift", "x":0, "y":5, "w":2.25}, + {"label":"Z", "x":2.25, "y":5}, + {"label":"X", "x":3.25, "y":5}, + {"label":"C", "x":4.25, "y":5}, + {"label":"V", "x":5.25, "y":5}, + {"label":"B", "x":6.25, "y":5}, + {"label":"N", "x":7.25, "y":5}, + {"label":"M", "x":8.25, "y":5}, + {"label":",", "x":9.25, "y":5}, + {"label":".", "x":10.25, "y":5}, + {"label":"/", "x":11.25, "y":5}, + {"label":"Shift", "x":12.25, "y":5, "w":2.75}, + {"label":"Up", "x":16.25, "y":5}, + {"label":"1", "x":18.5, "y":5}, + {"label":"2", "x":19.5, "y":5}, + {"label":"3", "x":20.5, "y":5}, + {"label":"Ctrl", "x":0, "y":6, "w":1.5}, + {"label":"Alt", "x":2.5, "y":6, "w":1.5}, + {"label":"Space", "x":4, "y":6, "w":7}, + {"label":"Alt", "x":11, "y":6, "w":1.5}, + {"label":"Ctrl", "x":13.5, "y":6, "w":1.5}, + {"label":"Left", "x":15.25, "y":6}, + {"label":"Down", "x":16.25, "y":6}, + {"label":"Right", "x":17.25, "y":6}, + {"label":"0", "x":18.5, "y":6, "w":2}, + {"label":".", "x":20.5, "y":6}, + {"label":"Enter", "x":21.5, "y":5, "h":2} + ] + } + } +} diff --git a/keyboards/converter/ibm_terminal/keymaps/default/config.h b/keyboards/converter/ibm_terminal/keymaps/default/config.h index 7fa3bf328..271f48d00 100644 --- a/keyboards/converter/ibm_terminal/keymaps/default/config.h +++ b/keyboards/converter/ibm_terminal/keymaps/default/config.h @@ -1,6 +1,3 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H +#pragma once -#include "../../config.h" - -#endif +// place overrides here diff --git a/keyboards/converter/ibm_terminal/keymaps/default/keymap.c b/keyboards/converter/ibm_terminal/keymaps/default/keymap.c index 2beb51106..59187ef33 100644 --- a/keyboards/converter/ibm_terminal/keymaps/default/keymap.c +++ b/keyboards/converter/ibm_terminal/keymaps/default/keymap.c @@ -15,18 +15,12 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#include -#include -#include "keycode.h" -#include "print.h" -#include "debug.h" -#include "util.h" -#include "ibm_terminal.h" +#include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // Layer 0 - KEYMAP( + LAYOUT( KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, @@ -56,7 +50,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `----' `---------------------------------------' `----' `-----------' `---------------' */ /* - KEYMAP_101( + LAYOUT_101( KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR,KC_SLCK, KC_BRK, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,KC_MINS, KC_EQL,KC_BSPC, KC_INS,KC_HOME,KC_PGUP, KC_NLCK,KC_PSLS,KC_PAST,KC_PMNS, diff --git a/keyboards/converter/ibm_terminal/keymaps/priyadi/config.h b/keyboards/converter/ibm_terminal/keymaps/priyadi/config.h index 7fa3bf328..271f48d00 100644 --- a/keyboards/converter/ibm_terminal/keymaps/priyadi/config.h +++ b/keyboards/converter/ibm_terminal/keymaps/priyadi/config.h @@ -1,6 +1,3 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H +#pragma once -#include "../../config.h" - -#endif +// place overrides here diff --git a/keyboards/converter/ibm_terminal/keymaps/priyadi/keymap.c b/keyboards/converter/ibm_terminal/keymaps/priyadi/keymap.c index 47a5181dd..3d6da6eab 100644 --- a/keyboards/converter/ibm_terminal/keymaps/priyadi/keymap.c +++ b/keyboards/converter/ibm_terminal/keymaps/priyadi/keymap.c @@ -15,17 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#include "keycode.h" -#include "print.h" -#include "debug.h" -#include "util.h" -#include "ibm_terminal.h" -#include "action_layer.h" - -// Fillers to make layering clearer - -#define _______ KC_TRNS -#define XXXXXXX KC_NO +#include QMK_KEYBOARD_H enum layers { QWE, // qwerty @@ -159,7 +149,7 @@ const uint32_t PROGMEM unicode_map[] = { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* qwerty */ - [QWE] = KEYMAP( + [QWE] = LAYOUT( KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_PSCR, KC_SLCK, KC_PAUS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, @@ -171,7 +161,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), /* colemak */ - [COL] = KEYMAP( + [COL] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, @@ -183,7 +173,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), /* workman */ - [WOR] = KEYMAP( + [WOR] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, @@ -195,7 +185,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), /* dvorak */ - [DVO] = KEYMAP( + [DVO] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, @@ -207,7 +197,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), /* system */ - [SYS] = KEYMAP( + [SYS] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, @@ -219,7 +209,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), /* mouse keys */ - [MOU] = KEYMAP( + [MOU] = LAYOUT( XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, @@ -231,7 +221,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), /* emoji */ - [EMO] = KEYMAP( + [EMO] = LAYOUT( XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, @@ -243,7 +233,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), /* - [XXX] = KEYMAP( + [XXX] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, diff --git a/keyboards/converter/ibm_terminal/readme.md b/keyboards/converter/ibm_terminal/readme.md new file mode 100644 index 000000000..b781b0468 --- /dev/null +++ b/keyboards/converter/ibm_terminal/readme.md @@ -0,0 +1,39 @@ +# Keyboard converter for IBM terminal keyboard + +This is a port of TMK's converter/terminal_usb to QMK. + +It supports PS/2 Scan Code Set 3 and runs on USB AVR chips such like PJRC Teensy. +I tested the converter on ATMega32U4 with 1392595(102keys) and 6110345(122keys). + +Source code: https://github.com/qmk/qmk_firmware.git +Article: http://geekhack.org/index.php?topic=27272.0 + + +## Connection + +Keyboard | ATMega32U4 +:------- | :--------- +Data | PD2 +Clock | PD5 + +And VCC and GND, of course. See Resource section for keyboard connector pin assign. + + +## Build + +``` +git clone https://github.com/qmk/qmk_firmware.git +cd qmk_firmware +make converter/ibm_terminal:default +``` + +## Resource + +- Soarer's Converter: http://geekhack.org/index.php?topic=17458.0 +- 102keys(1392595): http://geekhack.org/index.php?topic=10737.0 +- 122keys(1390876): http://www.seasip.info/VintagePC/ibm_1390876.html +- KbdBabel: http://www.kbdbabel.org/ +- RJ45 Connector: http://www.kbdbabel.org/conn/kbd_connector_ibmterm.png +- DIN Connector: http://www.kbdbabel.org/conn/kbd_connector_ibm3179_318x_319x.png +- WinAVR: http://winavr.sourceforge.net/ + From caa293a8f77447891b02d5f8c91b209f9a082cc9 Mon Sep 17 00:00:00 2001 From: Junya Ogura <5352+juno@users.noreply.github.com> Date: Wed, 14 Nov 2018 01:27:46 +0900 Subject: [PATCH 510/788] Remove duplicate row from Available functions table in i2c_driver doc (#4416) --- docs/i2c_driver.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/i2c_driver.md b/docs/i2c_driver.md index f69eb5a9d..ea24dc64f 100644 --- a/docs/i2c_driver.md +++ b/docs/i2c_driver.md @@ -8,7 +8,6 @@ The I2C Master drivers used in QMK have a set of common functions to allow porta |------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------| |`void i2c_init(void);` |Initializes the I2C driver. This function should be called once before any transaction is initiated. | |`uint8_t i2c_start(uint8_t address);` |Starts an I2C transaction. Address is the 7-bit slave address without the direction bit. | -|`uint8_t i2c_transmit(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);` |Transmit data over I2C. Address is the 7-bit slave address without the direction. | |`uint8_t i2c_transmit(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);` |Transmit data over I2C. Address is the 7-bit slave address without the direction. Returns status of transaction. | |`uint8_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);` |Receive data over I2C. Address is the 7-bit slave address without the direction. Saves number of bytes specified by `length` in `data` array. Returns status of transaction. | |`uint8_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout);` |Same as the `i2c_transmit` function but `regaddr` sets where in the slave the data will be written. | From 2dea540afbfcffaea82f70b6642c39aedb9e3b5b Mon Sep 17 00:00:00 2001 From: Wilba Date: Wed, 14 Nov 2018 03:31:25 +1100 Subject: [PATCH 511/788] Refactoring M6-A, M6-B, Zeal60, Zeal65, WT60-A, WT65-A, WT80-A (#4417) * Refactored M6-B to use Zeal60 RGB backlight code * Fixed M6-B LED co-ordinates * Minor changes to RGB config for Zeal65 * Added dynamic keymaps to WT80-A, WT60-A, WT-80A, U80-A --- keyboards/rama/m6_a/config.h | 113 ++------- keyboards/rama/m6_a/rules.mk | 32 ++- keyboards/rama/m6_b/config.h | 33 ++- keyboards/rama/m6_b/m6_b.c | 216 +----------------- keyboards/rama/m6_b/m6_b_api.h | 39 ---- keyboards/rama/m6_b/rgb_backlight.c | 139 ----------- keyboards/rama/m6_b/rgb_backlight.h | 34 --- keyboards/rama/m6_b/rules.mk | 24 +- keyboards/rama/u80_a/config.h | 17 ++ keyboards/rama/u80_a/keymaps/default/keymap.c | 15 ++ keyboards/rama/u80_a/rules.mk | 12 +- keyboards/wilba_tech/wt60_a/config.h | 17 ++ keyboards/wilba_tech/wt60_a/rules.mk | 11 +- keyboards/wilba_tech/wt65_a/config.h | 17 ++ keyboards/wilba_tech/wt65_a/rules.mk | 11 +- keyboards/wilba_tech/wt80_a/config.h | 17 ++ .../wt80_a/keymaps/default/keymap.c | 16 ++ keyboards/wilba_tech/wt80_a/rules.mk | 11 +- keyboards/wilba_tech/wt80_a/wt80_a.h | 15 ++ keyboards/wilba_tech/wt_main.c | 155 ++++++++++++- keyboards/zeal60/rgb_backlight.c | 122 +++++++--- keyboards/zeal60/zeal60.c | 1 + keyboards/zeal65/config.h | 8 +- 23 files changed, 468 insertions(+), 607 deletions(-) delete mode 100644 keyboards/rama/m6_b/m6_b_api.h delete mode 100644 keyboards/rama/m6_b/rgb_backlight.c delete mode 100644 keyboards/rama/m6_b/rgb_backlight.h diff --git a/keyboards/rama/m6_a/config.h b/keyboards/rama/m6_a/config.h index 8d77f5339..63da79274 100644 --- a/keyboards/rama/m6_a/config.h +++ b/keyboards/rama/m6_a/config.h @@ -1,20 +1,18 @@ -/* -Copyright 2018 Wilba - -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 . -*/ - +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 . + */ #pragma once #include "config_common.h" @@ -47,7 +45,7 @@ along with this program. If not, see . /* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ #define DIODE_DIRECTION COL2ROW - + // #define BACKLIGHT_PIN B7 // #define BACKLIGHT_BREATHING // #define BACKLIGHT_LEVELS 3 @@ -109,88 +107,10 @@ along with this program. If not, see . keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* control how magic key switches layers */ -//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true -//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true -//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false - -/* override magic key keymap */ -//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS -//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS -//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM -//#define MAGIC_KEY_HELP1 H -//#define MAGIC_KEY_HELP2 SLASH -//#define MAGIC_KEY_DEBUG D -//#define MAGIC_KEY_DEBUG_MATRIX X -//#define MAGIC_KEY_DEBUG_KBD K -//#define MAGIC_KEY_DEBUG_MOUSE M -//#define MAGIC_KEY_VERSION V -//#define MAGIC_KEY_STATUS S -//#define MAGIC_KEY_CONSOLE C -//#define MAGIC_KEY_LAYER0_ALT1 ESC -//#define MAGIC_KEY_LAYER0_ALT2 GRAVE -//#define MAGIC_KEY_LAYER0 0 -//#define MAGIC_KEY_LAYER1 1 -//#define MAGIC_KEY_LAYER2 2 -//#define MAGIC_KEY_LAYER3 3 -//#define MAGIC_KEY_LAYER4 4 -//#define MAGIC_KEY_LAYER5 5 -//#define MAGIC_KEY_LAYER6 6 -//#define MAGIC_KEY_LAYER7 7 -//#define MAGIC_KEY_LAYER8 8 -//#define MAGIC_KEY_LAYER9 9 -//#define MAGIC_KEY_BOOTLOADER PAUSE -//#define MAGIC_KEY_LOCK CAPS -//#define MAGIC_KEY_EEPROM E -//#define MAGIC_KEY_NKRO N -//#define MAGIC_KEY_SLEEP_LED Z - -/* - * 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 - -/* - * MIDI options - */ - -/* Prevent use of disabled MIDI features in the keymap */ -//#define MIDI_ENABLE_STRICT 1 - -/* enable basic MIDI features: - - MIDI notes can be sent when in Music mode is on -*/ -//#define MIDI_BASIC - -/* enable advanced MIDI features: - - MIDI notes can be added to the keymap - - Octave shift and transpose - - Virtual sustain, portamento, and modulation wheel - - etc. -*/ -//#define MIDI_ADVANCED - -/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ -//#define MIDI_TONE_KEYCODE_OCTAVES 1 - #define RGB_BACKLIGHT_ENABLED 0 #define DYNAMIC_KEYMAP_LAYER_COUNT 4 - // EEPROM usage // TODO: refactor with new user EEPROM code (coming soon) @@ -206,3 +126,4 @@ along with this program. If not, see . #define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 35 // Dynamic keymap starts after backlight config (35+37) #define DYNAMIC_KEYMAP_EEPROM_ADDR 72 + diff --git a/keyboards/rama/m6_a/rules.mk b/keyboards/rama/m6_a/rules.mk index ed85ac36d..ff1706918 100644 --- a/keyboards/rama/m6_a/rules.mk +++ b/keyboards/rama/m6_a/rules.mk @@ -1,5 +1,5 @@ # project specific files -SRC = keyboards/rama/m6_b/m6_b.c +SRC = ../zeal60/zeal60.c # MCU name MCU = atmega32u4 @@ -43,24 +43,32 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT # Boot Section BOOTLOADER = atmel-dfu +# Do not put the microcontroller into power saving mode +# when we get USB suspend event. We want it to keep updating +# backlight effects. +OPT_DEFS += -DNO_SUSPEND_POWER_DOWN + + # Build Options # change yes to no to disable # -BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) MOUSEKEY_ENABLE = no # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = no # Console for debug(+400) +CONSOLE_ENABLE = no # Console for debug(+400) COMMAND_ENABLE = no # Commands for debug and configuration -# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE -SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend -# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -NKRO_ENABLE = yes # USB Nkey Rollover -BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default -MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -AUDIO_ENABLE = no # Audio output on port C6 -FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend RAW_ENABLE = yes -DYNAMIC_KEYMAP_ENABLE = yes \ No newline at end of file +DYNAMIC_KEYMAP_ENABLE = yes +CIE1931_CURVE = no + diff --git a/keyboards/rama/m6_b/config.h b/keyboards/rama/m6_b/config.h index 1adaad3f9..c016703e0 100644 --- a/keyboards/rama/m6_b/config.h +++ b/keyboards/rama/m6_b/config.h @@ -109,8 +109,38 @@ #define RGB_BACKLIGHT_ENABLED 1 -#define DYNAMIC_KEYMAP_LAYER_COUNT 4 +// This conditionally compiles the backlight code for M6-B specifics +#define RGB_BACKLIGHT_M6_B +// enable/disable LEDs based on layout +#define RGB_BACKLIGHT_USE_SPLIT_BACKSPACE 0 +#define RGB_BACKLIGHT_USE_SPLIT_LEFT_SHIFT 0 +#define RGB_BACKLIGHT_USE_SPLIT_RIGHT_SHIFT 0 +#define RGB_BACKLIGHT_USE_7U_SPACEBAR 0 +#define RGB_BACKLIGHT_USE_ISO_ENTER 0 +#define RGB_BACKLIGHT_DISABLE_HHKB_BLOCKER_LEDS 0 + +// disable backlight when USB suspended (PC sleep/hibernate/shutdown) +#define RGB_BACKLIGHT_DISABLE_WHEN_USB_SUSPENDED 0 + +// disable backlight after timeout in minutes, 0 = no timeout +#define RGB_BACKLIGHT_DISABLE_AFTER_TIMEOUT 0 + +// the default effect (RGB test) +#define RGB_BACKLIGHT_EFFECT 255 + +// These define which keys in the matrix are alphas/mods +// Used for backlight effects so colors are different for +// alphas vs. mods +// Each value is for a row, bit 0 is column 0 +// Alpha=0 Mod=1 +#define RGB_BACKLIGHT_ALPHAS_MODS_ROW_0 0 +#define RGB_BACKLIGHT_ALPHAS_MODS_ROW_1 0 +#define RGB_BACKLIGHT_ALPHAS_MODS_ROW_2 0 +#define RGB_BACKLIGHT_ALPHAS_MODS_ROW_3 0 +#define RGB_BACKLIGHT_ALPHAS_MODS_ROW_4 0 + +#define DYNAMIC_KEYMAP_LAYER_COUNT 4 // EEPROM usage @@ -127,3 +157,4 @@ #define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 35 // Dynamic keymap starts after backlight config (35+37) #define DYNAMIC_KEYMAP_EEPROM_ADDR 72 + diff --git a/keyboards/rama/m6_b/m6_b.c b/keyboards/rama/m6_b/m6_b.c index e7cd2f628..581b31d75 100644 --- a/keyboards/rama/m6_b/m6_b.c +++ b/keyboards/rama/m6_b/m6_b.c @@ -13,218 +13,6 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#include "m6_b.h" -#include "m6_b_api.h" - -// Check that no backlight functions are called -#if RGB_BACKLIGHT_ENABLED -#include "rgb_backlight.h" -#endif // RGB_BACKLIGHT_ENABLED - -#include "raw_hid.h" -#include "dynamic_keymap.h" -#include "timer.h" -#include "tmk_core/common/eeprom.h" - -bool eeprom_is_valid(void) -{ - return (eeprom_read_word(((void*)EEPROM_MAGIC_ADDR)) == EEPROM_MAGIC && - eeprom_read_byte(((void*)EEPROM_VERSION_ADDR)) == EEPROM_VERSION); -} - -void eeprom_set_valid(bool valid) -{ - eeprom_update_word(((void*)EEPROM_MAGIC_ADDR), valid ? EEPROM_MAGIC : 0xFFFF); - eeprom_update_byte(((void*)EEPROM_VERSION_ADDR), valid ? EEPROM_VERSION : 0xFF); -} - -void eeprom_reset(void) -{ - // Set the keyboard-specific EEPROM state as invalid. - eeprom_set_valid(false); - // Set the TMK/QMK EEPROM state as invalid. - eeconfig_disable(); -} - -#ifdef RAW_ENABLE - -void raw_hid_receive( uint8_t *data, uint8_t length ) -{ - uint8_t *command_id = &(data[0]); - uint8_t *command_data = &(data[1]); - switch ( *command_id ) - { - case id_get_protocol_version: - { - command_data[0] = PROTOCOL_VERSION >> 8; - command_data[1] = PROTOCOL_VERSION & 0xFF; - break; - } - case id_get_keyboard_value: - { - if ( command_data[0] == id_uptime ) - { - uint32_t value = timer_read32(); - command_data[1] = (value >> 24 ) & 0xFF; - command_data[2] = (value >> 16 ) & 0xFF; - command_data[3] = (value >> 8 ) & 0xFF; - command_data[4] = value & 0xFF; - } - else - { - *command_id = id_unhandled; - } - break; - } -#ifdef DYNAMIC_KEYMAP_ENABLE - case id_dynamic_keymap_get_keycode: - { - uint16_t keycode = dynamic_keymap_get_keycode( command_data[0], command_data[1], command_data[2] ); - command_data[3] = keycode >> 8; - command_data[4] = keycode & 0xFF; - break; - } - case id_dynamic_keymap_set_keycode: - { - dynamic_keymap_set_keycode( command_data[0], command_data[1], command_data[2], ( command_data[3] << 8 ) | command_data[4] ); - break; - } - case id_dynamic_keymap_reset: - { - dynamic_keymap_reset(); - break; - } -#endif // DYNAMIC_KEYMAP_ENABLE -#if RGB_BACKLIGHT_ENABLED - case id_backlight_config_set_value: - { - //backlight_config_set_value(command_data); - break; - } - case id_backlight_config_get_value: - { - //backlight_config_get_value(command_data); - break; - } - case id_backlight_config_save: - { - //backlight_config_save(); - break; - } -#endif // RGB_BACKLIGHT_ENABLED - case id_eeprom_reset: - { - eeprom_reset(); - break; - } - case id_bootloader_jump: - { - // Need to send data back before the jump - // Informs host that the command is handled - raw_hid_send( data, length ); - // Give host time to read it - wait_ms(100); - bootloader_jump(); - break; - } - default: - { - // Unhandled message. - *command_id = id_unhandled; - break; - } - } - - // Return same buffer with values changed - raw_hid_send( data, length ); - -} - +#ifndef RGB_BACKLIGHT_M6_B +#error RGB_BACKLIGHT_M6_B not defined, you done goofed somehao, brah #endif - -void main_init(void) -{ - // If the EEPROM has the magic, the data is good. - // OK to load from EEPROM. - if (eeprom_is_valid()) { -#if RGB_BACKLIGHT_ENABLED - //backlight_config_load(); -#endif // RGB_BACKLIGHT_ENABLED - } else { -#if RGB_BACKLIGHT_ENABLED - // If the EEPROM has not been saved before, or is out of date, - // save the default values to the EEPROM. Default values - // come from construction of the zeal_backlight_config instance. - //backlight_config_save(); -#endif // RGB_BACKLIGHT_ENABLED -#ifdef DYNAMIC_KEYMAP_ENABLE - // This resets the keymaps in EEPROM to what is in flash. - dynamic_keymap_reset(); -#endif - // Save the magic number last, in case saving was interrupted - eeprom_set_valid(true); - } -#if RGB_BACKLIGHT_ENABLED - // Initialize LED drivers for backlight. - backlight_init_drivers(); - - backlight_timer_init(); - backlight_timer_enable(); -#endif // RGB_BACKLIGHT_ENABLED -} - -void bootmagic_lite(void) -{ - // The lite version of TMK's bootmagic. - // 100% less potential for accidentally making the - // keyboard do stupid things. - - // We need multiple scans because debouncing can't be turned off. - matrix_scan(); - wait_ms(DEBOUNCING_DELAY); - wait_ms(DEBOUNCING_DELAY); - matrix_scan(); - - // If the Esc (matrix 0,0) is held down on power up, - // reset the EEPROM valid state and jump to bootloader. - if ( matrix_get_row(0) & (1<<0) ) { - eeprom_reset(); - bootloader_jump(); - } -} - -void matrix_init_kb(void) { - bootmagic_lite(); - main_init(); - matrix_init_user(); -} - -void matrix_scan_kb(void) { -#if RGB_BACKLIGHT_ENABLED - // This only updates the LED driver buffers if something has changed. - backlight_update_pwm_buffers(); -#endif // BACKLIGHT_ENABLED - matrix_scan_user(); -} - -bool process_record_kb(uint16_t keycode, keyrecord_t *record) { - return process_record_user(keycode, record); -} - -void led_set_kb(uint8_t usb_led) { - led_set_user(usb_led); -} - -void suspend_power_down_kb(void) -{ -#if RGB_BACKLIGHT_ENABLED - //backlight_set_suspend_state(true); -#endif // BACKLIGHT_ENABLED -} - -void suspend_wakeup_init_kb(void) -{ -#if RGB_BACKLIGHT_ENABLED - //backlight_set_suspend_state(false); -#endif // BACKLIGHT_ENABLED -} diff --git a/keyboards/rama/m6_b/m6_b_api.h b/keyboards/rama/m6_b/m6_b_api.h deleted file mode 100644 index 041fd6e6e..000000000 --- a/keyboards/rama/m6_b/m6_b_api.h +++ /dev/null @@ -1,39 +0,0 @@ -/* Copyright 2017 Jason Williams (Wilba) - * - * 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 . - */ -#pragma once - -#define PROTOCOL_VERSION 0x0001 - -enum m6_b_command_id -{ - id_get_protocol_version = 0x01, // always 0x01 - id_get_keyboard_value, - id_set_keyboard_value, - id_dynamic_keymap_get_keycode, - id_dynamic_keymap_set_keycode, - id_dynamic_keymap_reset, - id_backlight_config_set_value, - id_backlight_config_get_value, - id_backlight_config_save, - id_eeprom_reset, - id_bootloader_jump, - id_unhandled = 0xFF, -}; - -enum m6_b_keyboard_value_id -{ - id_uptime = 0x01 -}; diff --git a/keyboards/rama/m6_b/rgb_backlight.c b/keyboards/rama/m6_b/rgb_backlight.c deleted file mode 100644 index 8f7ac0630..000000000 --- a/keyboards/rama/m6_b/rgb_backlight.c +++ /dev/null @@ -1,139 +0,0 @@ -/* Copyright 2018 Jason Williams (Wilba) - * - * 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 . - */ -#if RGB_BACKLIGHT_ENABLED - -#include "rgb_backlight.h" -//#include "rgb_backlight_api.h" - -#include -#include -#include -#include "progmem.h" - -#include "quantum/color.h" -#include "drivers/avr/i2c_master.h" -#include "drivers/issi/is31fl3218.h" - -bool g_suspend_state = false; - -// Global tick at 20 Hz -uint32_t g_tick = 0; -uint8_t g_config_effect_speed = 0; -uint8_t g_config_brightness = 255; - -void backlight_update_pwm_buffers(void) -{ - IS31FL3218_update_pwm_buffers(); -} - -void backlight_set_color( int index, uint8_t red, uint8_t green, uint8_t blue ) -{ - IS31FL3218_set_color( index, red, green, blue ); -} - -void backlight_set_color_all( uint8_t red, uint8_t green, uint8_t blue ) -{ - IS31FL3218_set_color_all( red, green, blue ); -} - - -// This is (F_CPU/1024) / 20 Hz -// = 15625 Hz / 20 Hz -// = 781 -#define TIMER3_TOP 260 - -void backlight_timer_init(void) -{ - static uint8_t backlight_timer_is_init = 0; - if ( backlight_timer_is_init ) - { - return; - } - backlight_timer_is_init = 1; - - // Timer 3 setup - TCCR3B = _BV(WGM32) | // CTC mode OCR3A as TOP - _BV(CS32) | _BV(CS30); // prescale by /1024 - // Set TOP value - uint8_t sreg = SREG; - cli(); - - OCR3AH = (TIMER3_TOP >> 8) & 0xff; - OCR3AL = TIMER3_TOP & 0xff; - SREG = sreg; -} - -void backlight_timer_enable(void) -{ - TIMSK3 |= _BV(OCIE3A); -} - -void backlight_timer_disable(void) -{ - TIMSK3 &= ~_BV(OCIE3A); -} - -void backlight_set_suspend_state(bool state) -{ - g_suspend_state = state; -} - -void backlight_effect_cycle_all(void) -{ - uint8_t hueOffset = ( g_tick << g_config_effect_speed ) & 0xFF; - uint8_t satOffset = 127; - // Relies on hue being 8-bit and wrapping - for ( int i=0; i<6; i++ ) - { - HSV hsv = { .h = hueOffset, .s = satOffset, .v = g_config_brightness }; - RGB rgb = hsv_to_rgb( hsv ); - backlight_set_color( i, rgb.r, rgb.g, rgb.b ); - } -} - -ISR(TIMER3_COMPA_vect) -{ - // delay 1 second before driving LEDs or doing anything else - static uint8_t startup_tick = 0; - if ( startup_tick < 20 ) - { - startup_tick++; - return; - } - - g_tick++; - - if ( g_suspend_state ) - { - backlight_set_color_all( 0, 0, 0 ); - } - else - { - //HSV hsv = { .h = 240, .s = 255, .v = g_config_brightness }; - //RGB rgb = hsv_to_rgb( hsv ); - //backlight_set_color_all( rgb.r, rgb.g, rgb.b ); - backlight_effect_cycle_all(); - } -} - -void backlight_init_drivers(void) -{ - // Initialize I2C - i2c_init(); - IS31FL3218_init(); -} - -#endif // RGB_BACKLIGHT_ENABLED diff --git a/keyboards/rama/m6_b/rgb_backlight.h b/keyboards/rama/m6_b/rgb_backlight.h deleted file mode 100644 index bbf605284..000000000 --- a/keyboards/rama/m6_b/rgb_backlight.h +++ /dev/null @@ -1,34 +0,0 @@ -/* Copyright 2018 Jason Williams (Wilba) - * - * 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 . - */ -#pragma once - -#if RGB_BACKLIGHT_ENABLED -#else -#error rgb_backlight.h included when RGB_BACKLIGHT_ENABLED == 0 -#endif // RGB_BACKLIGHT_ENABLED - -#include -#include - -#include "quantum/color.h" - -void backlight_init_drivers(void); -void backlight_update_pwm_buffers(void); -void backlight_timer_init(void); -void backlight_timer_enable(void); -void backlight_timer_disable(void); -void backlight_set_suspend_state(bool state); - diff --git a/keyboards/rama/m6_b/rules.mk b/keyboards/rama/m6_b/rules.mk index 8226debd4..1a7466af3 100644 --- a/keyboards/rama/m6_b/rules.mk +++ b/keyboards/rama/m6_b/rules.mk @@ -1,5 +1,6 @@ # project specific files -SRC = rgb_backlight.c \ +SRC = ../zeal60/zeal60.c \ + ../zeal60/rgb_backlight.c \ quantum/color.c \ drivers/issi/is31fl3218.c \ drivers/avr/i2c_master.c @@ -56,22 +57,23 @@ OPT_DEFS += -DNO_SUSPEND_POWER_DOWN # Build Options # change yes to no to disable # -BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) MOUSEKEY_ENABLE = no # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = no # Console for debug(+400) +CONSOLE_ENABLE = no # Console for debug(+400) COMMAND_ENABLE = no # Commands for debug and configuration -# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE -SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend -# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -NKRO_ENABLE = yes # USB Nkey Rollover -BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default -MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -AUDIO_ENABLE = no # Audio output on port C6 -FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend RAW_ENABLE = yes DYNAMIC_KEYMAP_ENABLE = yes CIE1931_CURVE = yes + diff --git a/keyboards/rama/u80_a/config.h b/keyboards/rama/u80_a/config.h index bfd972828..9c74735ad 100644 --- a/keyboards/rama/u80_a/config.h +++ b/keyboards/rama/u80_a/config.h @@ -185,3 +185,20 @@ /* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ //#define MIDI_TONE_KEYCODE_OCTAVES 1 +#define DYNAMIC_KEYMAP_LAYER_COUNT 4 + +// EEPROM usage + +// TODO: refactor with new user EEPROM code (coming soon) +#define EEPROM_MAGIC 0x451F +#define EEPROM_MAGIC_ADDR 32 +// Bump this every time we change what we store +// This will automatically reset the EEPROM with defaults +// and avoid loading invalid data from the EEPROM +#define EEPROM_VERSION 0x07 +#define EEPROM_VERSION_ADDR 34 + +// Backlight config starts after EEPROM version +#define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 35 +// Dynamic keymap starts after backlight config (35+37) +#define DYNAMIC_KEYMAP_EEPROM_ADDR 72 diff --git a/keyboards/rama/u80_a/keymaps/default/keymap.c b/keyboards/rama/u80_a/keymaps/default/keymap.c index cf9225e3e..036a57b68 100644 --- a/keyboards/rama/u80_a/keymaps/default/keymap.c +++ b/keyboards/rama/u80_a/keymaps/default/keymap.c @@ -18,5 +18,20 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + [2] = LAYOUT_all( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + [3] = LAYOUT_all( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), }; diff --git a/keyboards/rama/u80_a/rules.mk b/keyboards/rama/u80_a/rules.mk index 99224c247..67b04e350 100644 --- a/keyboards/rama/u80_a/rules.mk +++ b/keyboards/rama/u80_a/rules.mk @@ -52,17 +52,21 @@ BOOTLOADER = atmel-dfu # change yes to no to disable # BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = yes # Console for debug(+400) -COMMAND_ENABLE = yes # Commands for debug and configuration +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend # if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -NKRO_ENABLE = no # USB Nkey Rollover +NKRO_ENABLE = yes # USB Nkey Rollover BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID AUDIO_ENABLE = no # Audio output on port C6 FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches + +RAW_ENABLE = yes +DYNAMIC_KEYMAP_ENABLE = yes +CIE1931_CURVE = yes \ No newline at end of file diff --git a/keyboards/wilba_tech/wt60_a/config.h b/keyboards/wilba_tech/wt60_a/config.h index 95f4c786e..26f9ed2ba 100644 --- a/keyboards/wilba_tech/wt60_a/config.h +++ b/keyboards/wilba_tech/wt60_a/config.h @@ -185,3 +185,20 @@ /* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ //#define MIDI_TONE_KEYCODE_OCTAVES 1 +#define DYNAMIC_KEYMAP_LAYER_COUNT 4 + +// EEPROM usage + +// TODO: refactor with new user EEPROM code (coming soon) +#define EEPROM_MAGIC 0x451F +#define EEPROM_MAGIC_ADDR 32 +// Bump this every time we change what we store +// This will automatically reset the EEPROM with defaults +// and avoid loading invalid data from the EEPROM +#define EEPROM_VERSION 0x07 +#define EEPROM_VERSION_ADDR 34 + +// Backlight config starts after EEPROM version +#define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 35 +// Dynamic keymap starts after backlight config (35+37) +#define DYNAMIC_KEYMAP_EEPROM_ADDR 72 diff --git a/keyboards/wilba_tech/wt60_a/rules.mk b/keyboards/wilba_tech/wt60_a/rules.mk index 99224c247..76a07d7a4 100644 --- a/keyboards/wilba_tech/wt60_a/rules.mk +++ b/keyboards/wilba_tech/wt60_a/rules.mk @@ -52,17 +52,20 @@ BOOTLOADER = atmel-dfu # change yes to no to disable # BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = yes # Console for debug(+400) -COMMAND_ENABLE = yes # Commands for debug and configuration +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend # if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -NKRO_ENABLE = no # USB Nkey Rollover +NKRO_ENABLE = yes # USB Nkey Rollover BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID AUDIO_ENABLE = no # Audio output on port C6 FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches + +RAW_ENABLE = yes +DYNAMIC_KEYMAP_ENABLE = yes \ No newline at end of file diff --git a/keyboards/wilba_tech/wt65_a/config.h b/keyboards/wilba_tech/wt65_a/config.h index fa919f186..5f535c6a7 100644 --- a/keyboards/wilba_tech/wt65_a/config.h +++ b/keyboards/wilba_tech/wt65_a/config.h @@ -185,3 +185,20 @@ /* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ //#define MIDI_TONE_KEYCODE_OCTAVES 1 +#define DYNAMIC_KEYMAP_LAYER_COUNT 4 + +// EEPROM usage + +// TODO: refactor with new user EEPROM code (coming soon) +#define EEPROM_MAGIC 0x451F +#define EEPROM_MAGIC_ADDR 32 +// Bump this every time we change what we store +// This will automatically reset the EEPROM with defaults +// and avoid loading invalid data from the EEPROM +#define EEPROM_VERSION 0x07 +#define EEPROM_VERSION_ADDR 34 + +// Backlight config starts after EEPROM version +#define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 35 +// Dynamic keymap starts after backlight config (35+37) +#define DYNAMIC_KEYMAP_EEPROM_ADDR 72 diff --git a/keyboards/wilba_tech/wt65_a/rules.mk b/keyboards/wilba_tech/wt65_a/rules.mk index 99224c247..76a07d7a4 100644 --- a/keyboards/wilba_tech/wt65_a/rules.mk +++ b/keyboards/wilba_tech/wt65_a/rules.mk @@ -52,17 +52,20 @@ BOOTLOADER = atmel-dfu # change yes to no to disable # BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = yes # Console for debug(+400) -COMMAND_ENABLE = yes # Commands for debug and configuration +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend # if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -NKRO_ENABLE = no # USB Nkey Rollover +NKRO_ENABLE = yes # USB Nkey Rollover BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID AUDIO_ENABLE = no # Audio output on port C6 FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches + +RAW_ENABLE = yes +DYNAMIC_KEYMAP_ENABLE = yes \ No newline at end of file diff --git a/keyboards/wilba_tech/wt80_a/config.h b/keyboards/wilba_tech/wt80_a/config.h index 9687cb6d6..f78ce7fb3 100644 --- a/keyboards/wilba_tech/wt80_a/config.h +++ b/keyboards/wilba_tech/wt80_a/config.h @@ -185,3 +185,20 @@ /* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ //#define MIDI_TONE_KEYCODE_OCTAVES 1 +#define DYNAMIC_KEYMAP_LAYER_COUNT 4 + +// EEPROM usage + +// TODO: refactor with new user EEPROM code (coming soon) +#define EEPROM_MAGIC 0x451F +#define EEPROM_MAGIC_ADDR 32 +// Bump this every time we change what we store +// This will automatically reset the EEPROM with defaults +// and avoid loading invalid data from the EEPROM +#define EEPROM_VERSION 0x07 +#define EEPROM_VERSION_ADDR 34 + +// Backlight config starts after EEPROM version +#define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 35 +// Dynamic keymap starts after backlight config (35+37) +#define DYNAMIC_KEYMAP_EEPROM_ADDR 72 diff --git a/keyboards/wilba_tech/wt80_a/keymaps/default/keymap.c b/keyboards/wilba_tech/wt80_a/keymaps/default/keymap.c index cf9225e3e..9cbe7ff62 100644 --- a/keyboards/wilba_tech/wt80_a/keymaps/default/keymap.c +++ b/keyboards/wilba_tech/wt80_a/keymaps/default/keymap.c @@ -18,5 +18,21 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + [2] = LAYOUT_all( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + [3] = LAYOUT_all( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + }; diff --git a/keyboards/wilba_tech/wt80_a/rules.mk b/keyboards/wilba_tech/wt80_a/rules.mk index 99224c247..76a07d7a4 100644 --- a/keyboards/wilba_tech/wt80_a/rules.mk +++ b/keyboards/wilba_tech/wt80_a/rules.mk @@ -52,17 +52,20 @@ BOOTLOADER = atmel-dfu # change yes to no to disable # BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = yes # Console for debug(+400) -COMMAND_ENABLE = yes # Commands for debug and configuration +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend # if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -NKRO_ENABLE = no # USB Nkey Rollover +NKRO_ENABLE = yes # USB Nkey Rollover BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID AUDIO_ENABLE = no # Audio output on port C6 FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches + +RAW_ENABLE = yes +DYNAMIC_KEYMAP_ENABLE = yes \ No newline at end of file diff --git a/keyboards/wilba_tech/wt80_a/wt80_a.h b/keyboards/wilba_tech/wt80_a/wt80_a.h index 26403ef34..a6fb1cccb 100644 --- a/keyboards/wilba_tech/wt80_a/wt80_a.h +++ b/keyboards/wilba_tech/wt80_a/wt80_a.h @@ -41,3 +41,18 @@ { K500, K501, K502, ____, ____, ____, K506, ____, ____, ____, K510, K511, K512, K513, K514, K515, K516 } \ } +#define LAYOUT_no_split( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K015, K016, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216, \ + K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, \ + K400, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K415, \ + K500, K501, K502, K506, K510, K511, K512, K513, K514, K515, K516 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, ____, K014, K015, K016 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116 }, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216 }, \ + { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, ____, ____, ____ }, \ + { K400, ____, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, ____, K415, ____ }, \ + { K500, K501, K502, ____, ____, ____, K506, ____, ____, ____, K510, K511, K512, K513, K514, K515, K516 } \ +} diff --git a/keyboards/wilba_tech/wt_main.c b/keyboards/wilba_tech/wt_main.c index f514dbefc..23f07d7eb 100644 --- a/keyboards/wilba_tech/wt_main.c +++ b/keyboards/wilba_tech/wt_main.c @@ -16,6 +16,152 @@ #include "quantum.h" #include "keyboards/wilba_tech/wt_mono_backlight.h" +#include "keyboards/zeal60/zeal60_api.h" // Temporary hack + +#include "raw_hid.h" +#include "dynamic_keymap.h" +#include "timer.h" +#include "tmk_core/common/eeprom.h" + +bool eeprom_is_valid(void) +{ + return (eeprom_read_word(((void*)EEPROM_MAGIC_ADDR)) == EEPROM_MAGIC && + eeprom_read_byte(((void*)EEPROM_VERSION_ADDR)) == EEPROM_VERSION); +} + +void eeprom_set_valid(bool valid) +{ + eeprom_update_word(((void*)EEPROM_MAGIC_ADDR), valid ? EEPROM_MAGIC : 0xFFFF); + eeprom_update_byte(((void*)EEPROM_VERSION_ADDR), valid ? EEPROM_VERSION : 0xFF); +} + +void eeprom_reset(void) +{ + // Set the Zeal60 specific EEPROM state as invalid. + eeprom_set_valid(false); + // Set the TMK/QMK EEPROM state as invalid. + eeconfig_disable(); +} + +#ifdef RAW_ENABLE + +void raw_hid_receive( uint8_t *data, uint8_t length ) +{ + uint8_t *command_id = &(data[0]); + uint8_t *command_data = &(data[1]); + switch ( *command_id ) + { + case id_get_protocol_version: + { + command_data[0] = PROTOCOL_VERSION >> 8; + command_data[1] = PROTOCOL_VERSION & 0xFF; + break; + } + case id_get_keyboard_value: + { + if ( command_data[0] == id_uptime ) + { + uint32_t value = timer_read32(); + command_data[1] = (value >> 24 ) & 0xFF; + command_data[2] = (value >> 16 ) & 0xFF; + command_data[3] = (value >> 8 ) & 0xFF; + command_data[4] = value & 0xFF; + } + else + { + *command_id = id_unhandled; + } + break; + } +#ifdef DYNAMIC_KEYMAP_ENABLE + case id_dynamic_keymap_get_keycode: + { + uint16_t keycode = dynamic_keymap_get_keycode( command_data[0], command_data[1], command_data[2] ); + command_data[3] = keycode >> 8; + command_data[4] = keycode & 0xFF; + break; + } + case id_dynamic_keymap_set_keycode: + { + dynamic_keymap_set_keycode( command_data[0], command_data[1], command_data[2], ( command_data[3] << 8 ) | command_data[4] ); + break; + } + case id_dynamic_keymap_reset: + { + dynamic_keymap_reset(); + break; + } +#endif // DYNAMIC_KEYMAP_ENABLE + case id_backlight_config_set_value: + { + //backlight_config_set_value(command_data); + break; + } + case id_backlight_config_get_value: + { + //backlight_config_get_value(command_data); + break; + } + case id_backlight_config_save: + { + //backlight_config_save(); + break; + } + case id_eeprom_reset: + { + eeprom_reset(); + break; + } + case id_bootloader_jump: + { + // Need to send data back before the jump + // Informs host that the command is handled + raw_hid_send( data, length ); + // Give host time to read it + wait_ms(100); + bootloader_jump(); + break; + } + default: + { + // Unhandled message. + *command_id = id_unhandled; + break; + } + } + + // Return same buffer with values changed + raw_hid_send( data, length ); + +} + +#endif + +void main_init(void) +{ + // If the EEPROM has the magic, the data is good. + // OK to load from EEPROM. + if (eeprom_is_valid()) { + //backlight_config_load(); + } else { + // If the EEPROM has not been saved before, or is out of date, + // save the default values to the EEPROM. Default values + // come from construction of the zeal_backlight_config instance. + //backlight_config_save(); +#ifdef DYNAMIC_KEYMAP_ENABLE + // This resets the keymaps in EEPROM to what is in flash. + dynamic_keymap_reset(); +#endif + // Save the magic number last, in case saving was interrupted + eeprom_set_valid(true); + } + + // Initialize LED drivers for backlight. + backlight_init_drivers(); + + backlight_timer_init(); + backlight_timer_enable(); +} void bootmagic_lite(void) { @@ -32,9 +178,7 @@ void bootmagic_lite(void) // If the Esc (matrix 0,0) is held down on power up, // reset the EEPROM valid state and jump to bootloader. if ( matrix_get_row(0) & (1<<0) ) { - // Set the TMK/QMK EEPROM state as invalid. - eeconfig_disable(); - // Jump to bootloader. + eeprom_reset(); bootloader_jump(); } } @@ -42,14 +186,13 @@ void bootmagic_lite(void) void matrix_init_kb(void) { bootmagic_lite(); - backlight_init_drivers(); - backlight_timer_init(); - backlight_timer_enable(); + main_init(); matrix_init_user(); } void matrix_scan_kb(void) { + // This only updates the LED driver buffers if something has changed. backlight_update_pwm_buffers(); matrix_scan_user(); } diff --git a/keyboards/zeal60/rgb_backlight.c b/keyboards/zeal60/rgb_backlight.c index ce8b1cb17..c3dade123 100644 --- a/keyboards/zeal60/rgb_backlight.c +++ b/keyboards/zeal60/rgb_backlight.c @@ -15,12 +15,12 @@ */ #if RGB_BACKLIGHT_ENABLED -#if defined (RGB_BACKLIGHT_ZEAL60) || defined (RGB_BACKLIGHT_ZEAL65) || defined (RGB_BACKLIGHT_M60_A) +#if defined (RGB_BACKLIGHT_ZEAL60) || defined (RGB_BACKLIGHT_ZEAL65) || defined (RGB_BACKLIGHT_M60_A) || defined(RGB_BACKLIGHT_M6_B) #else -#error None of the following was defined: RGB_BACKLIGHT_ZEAL60, RGB_BACKLIGHT_ZEAL65, RGB_BACKLIGHT_M60_A +#error None of the following was defined: RGB_BACKLIGHT_ZEAL60, RGB_BACKLIGHT_ZEAL65, RGB_BACKLIGHT_M60_A, RGB_BACKLIGHT_M6_B #endif -#include "zeal60.h" +#include "quantum.h" #include "rgb_backlight.h" #include "rgb_backlight_api.h" #include "rgb_backlight_keycodes.h" @@ -32,7 +32,14 @@ #include "quantum/color.h" #include "drivers/avr/i2c_master.h" + +#if defined (RGB_BACKLIGHT_M6_B) +#include "drivers/issi/is31fl3218.h" +#define BACKLIGHT_LED_COUNT 6 +#else #include "drivers/issi/is31fl3731.h" +#define BACKLIGHT_LED_COUNT 72 +#endif #define BACKLIGHT_EFFECT_MAX 10 @@ -69,11 +76,12 @@ uint8_t g_indicator_state = 0; uint32_t g_tick = 0; // Ticks since this key was last hit. -uint8_t g_key_hit[72]; +uint8_t g_key_hit[BACKLIGHT_LED_COUNT]; // Ticks since any key was last hit. uint32_t g_any_key_hit = 0; +#if !defined(RGB_BACKLIGHT_M6_B) // This is a 7-bit address, that gets left-shifted and bit 0 // set to 0 for write, 1 for read (as per I2C protocol) #define ISSI_ADDR_1 0x74 @@ -162,7 +170,7 @@ const is31_led g_is31_leds[DRIVER_LED_TOTAL] = { {1, C9_16, C7_15, C6_15}, // LD16 {1, C8_16, C7_16, C6_16}, // LD17 }; - +#endif // !defined(RGB_BACKLIGHT_M6_B) typedef struct Point { @@ -175,7 +183,7 @@ typedef struct Point { // point values in range x=0..224 y=0..64 // origin is center of top-left key (i.e Esc) #if defined (RGB_BACKLIGHT_ZEAL65) -const Point g_map_led_to_point[72] PROGMEM = { +const Point g_map_led_to_point[BACKLIGHT_LED_COUNT] PROGMEM = { // LA0..LA17 {120,16}, {104,16}, {88,16}, {72,16}, {56,16}, {40,16}, {24,16}, {4,16}, {4,32}, {128,0}, {112,0}, {96,0}, {80,0}, {64,0}, {48,0}, {32,0}, {16,0}, {0,0}, @@ -189,7 +197,7 @@ const Point g_map_led_to_point[72] PROGMEM = { {124,32}, {140,32}, {156,32}, {172,32}, {188,32}, {214,32}, {180,48}, {202,48}, {224,48}, {116,48}, {132,48}, {148,48}, {164,48}, {255,255}, {144,60}, {164,64}, {188,64}, {208,64} }; -const Point g_map_led_to_point_polar[72] PROGMEM = { +const Point g_map_led_to_point_polar[BACKLIGHT_LED_COUNT] PROGMEM = { // LA0..LA17 {64,128}, {75,132}, {84,145}, {91,164}, {97,187}, {102,213}, {105,242}, {109,255}, {128,247}, {61,255}, {67,255}, {72,255}, {77,255}, {82,255}, {86,255}, {90,255}, {93,255}, {96,255}, @@ -204,7 +212,7 @@ const Point g_map_led_to_point_polar[72] PROGMEM = { {189,128}, {200,131}, {210,141}, {218,159}, {201,228}, {201,228}, {206,255}, {213,255}, {218,255} }; #elif defined (RGB_BACKLIGHT_ZEAL60) || defined (RGB_BACKLIGHT_M60_A) -const Point g_map_led_to_point[72] PROGMEM = { +const Point g_map_led_to_point[BACKLIGHT_LED_COUNT] PROGMEM = { // LA0..LA17 {120,16}, {104,16}, {88,16}, {72,16}, {56,16}, {40,16}, {24,16}, {4,16}, {4,32}, {128,0}, {112,0}, {96,0}, {80,0}, {64,0}, {48,0}, {32,0}, {16,0}, {0,0}, @@ -218,7 +226,7 @@ const Point g_map_led_to_point[72] PROGMEM = { {124,32}, {140,32}, {156,32}, {172,32}, {188,32}, {214,32}, {180,48}, {210,48}, {224,48}, {116,48}, {132,48}, {148,48}, {164,48}, {144,64}, {161,64}, {181,64}, {201,64}, {221,64} }; -const Point g_map_led_to_point_polar[72] PROGMEM = { +const Point g_map_led_to_point_polar[BACKLIGHT_LED_COUNT] PROGMEM = { // LA0..LA17 {58,129}, {70,129}, {80,139}, {89,157}, {96,181}, {101,208}, {105,238}, {109,255}, {128,247}, {58,255}, {64,255}, {70,255}, {75,255}, {80,255}, {85,255}, {89,255}, {93,255}, {96,255}, @@ -232,6 +240,16 @@ const Point g_map_led_to_point_polar[72] PROGMEM = { {0,27}, {0,64}, {0,101}, {0,137}, {0,174}, {255,233}, {228,201}, {235,255}, {237,255}, {195,128}, {206,136}, {215,152}, {222,175}, {205,234}, {209,255}, {214,255}, {219,255}, {223,255} }; +#elif defined (RGB_BACKLIGHT_M6_B) +// M6-B is really simple: +// 0 3 5 +// 1 2 4 +const Point g_map_led_to_point[BACKLIGHT_LED_COUNT] PROGMEM = { + {0,0}, {0,16}, {16,16}, {16,0}, {32,16}, {32,0} +}; +const Point g_map_led_to_point_polar[BACKLIGHT_LED_COUNT] PROGMEM = { + {0,0}, {0,16}, {16,16}, {16,0}, {32,16}, {32,0} +}; #endif // This may seem counter-intuitive, but it's quite flexible. @@ -245,16 +263,30 @@ void map_led_to_point( uint8_t index, Point *point ) point->x = pgm_read_byte(addr); point->y = pgm_read_byte(addr+1); +#if defined (RGB_BACKLIGHT_M6_B) + return; +#endif + switch (index) { case 18+4: // LB4A if ( g_config.use_split_backspace ) point->x -= 8; break; +#if defined (RGB_BACKLIGHT_ZEAL60) case 18+14: // LB14A if ( g_config.use_iso_enter ) point->y += 8; // extremely pedantic break; + case 54+5: // LD5A + if ( !g_config.use_iso_enter ) + point->x -= 10; + break; + case 36+16: // LC16A + if ( !g_config.use_split_left_shift ) + point->x += 8; + break; +#endif #if defined (RGB_BACKLIGHT_ZEAL60) || defined (RGB_BACKLIGHT_M60_A) case 36+0: // LC0A if ( g_config.use_7u_spacebar ) @@ -264,19 +296,11 @@ void map_led_to_point( uint8_t index, Point *point ) if ( g_config.use_7u_spacebar ) point->x += 4; break; -#endif - case 36+16: // LC16A - if ( !g_config.use_split_left_shift ) - point->x += 8; - break; - case 54+5: // LD5A - if ( !g_config.use_iso_enter ) - point->x -= 10; - break; case 54+7: // LD7A if ( !g_config.use_split_right_shift ) point->x -= 8; break; +#endif } } @@ -325,6 +349,13 @@ const uint8_t g_map_row_column_to_led[MATRIX_ROWS][MATRIX_COLS] PROGMEM = { { 36+16, 36+15, 36+5, 36+4, 36+3, 36+2, 36+1, 54+9, 54+10, 54+11, 54+12, 54+6, 54+7, 54+8 }, { 36+17, 36+8, 36+7, 36+6, 255, 255, 255, 36+0, 255, 54+13, 54+14, 54+15, 54+16, 54+17 } }; +#elif defined (RGB_BACKLIGHT_M6_B) +// M6-B is really simple: +// 0 3 5 +// 1 2 4 +const uint8_t g_map_row_column_to_led[MATRIX_ROWS][MATRIX_COLS] PROGMEM = { + { 0, 3, 5, 1, 2, 4 } +}; #endif void map_row_column_to_led( uint8_t row, uint8_t column, uint8_t *led ) @@ -338,18 +369,30 @@ void map_row_column_to_led( uint8_t row, uint8_t column, uint8_t *led ) void backlight_update_pwm_buffers(void) { +#if defined (RGB_BACKLIGHT_M6_B) + IS31FL3218_update_pwm_buffers(); +#else IS31FL3731_update_pwm_buffers( ISSI_ADDR_1, ISSI_ADDR_2 ); IS31FL3731_update_led_control_registers( ISSI_ADDR_1, ISSI_ADDR_2 ); +#endif } void backlight_set_color( int index, uint8_t red, uint8_t green, uint8_t blue ) { +#if defined (RGB_BACKLIGHT_M6_B) + IS31FL3218_set_color( index, red, green, blue ); +#else IS31FL3731_set_color( index, red, green, blue ); +#endif } void backlight_set_color_all( uint8_t red, uint8_t green, uint8_t blue ) { +#if defined (RGB_BACKLIGHT_M6_B) + IS31FL3218_set_color_all( red, green, blue ); +#else IS31FL3731_set_color_all( red, green, blue ); +#endif } void backlight_set_key_hit(uint8_t row, uint8_t column) @@ -436,6 +479,7 @@ void backlight_effect_rgb_test(void) } } +#if defined(RGB_DEBUGGING_ONLY) // This tests the LEDs // Note that it will change the LED control registers // in the LED drivers, and leave them in an invalid @@ -475,6 +519,7 @@ void backlight_effect_single_LED_test(void) backlight_set_color_all( 255, 255, 255 ); backlight_test_led( led, color==0, color==1, color==2 ); } +#endif // defined(RGB_DEBUGGING_ONLY) // All LEDs off void backlight_effect_all_off(void) @@ -502,7 +547,7 @@ void backlight_effect_alphas_mods(void) { uint8_t index; map_row_column_to_led( row, column, &index ); - if ( index < 72 ) + if ( index < BACKLIGHT_LED_COUNT ) { if ( ( g_config.alphas_mods[row] & (1< Date: Tue, 13 Nov 2018 11:38:48 -0500 Subject: [PATCH 512/788] Keyboard: Add 412 64 Model 00 keyboard. (#4400) * Add 412-64 keyboard firmware It's pretty barebones for now, but the Model 00 is also a pretty barebones machine. Model 01 won't be better, but plenty of pins exist for things like LEDs on Model 02. * MANU/PROD ID changes. Changed around the MANUFACTURER and PRODUCT IDs to be more polite when viewed in qmk toolbox. * Fixing PROD again. For the love of all that is good and holy, that was ugly. This new one looks better. This stuff matters to me for some reason. * Yep, updating MANU again. There we go. That's better - From my name to my "design firm". * Update keyboards/412_64/keymaps/default/keymap.c Co-Authored-By: FateEverywhere <41215461+FateEverywhere@users.noreply.github.com> * Update keyboards/412_64/rules.mk Co-Authored-By: FateEverywhere <41215461+FateEverywhere@users.noreply.github.com> * Update keyboards/412_64/rules.mk Co-Authored-By: FateEverywhere <41215461+FateEverywhere@users.noreply.github.com> * Update keyboards/412_64/rules.mk Co-Authored-By: FateEverywhere <41215461+FateEverywhere@users.noreply.github.com> * Update keyboards/412_64/rules.mk Co-Authored-By: FateEverywhere <41215461+FateEverywhere@users.noreply.github.com> --- keyboards/412_64/412_64.c | 29 ++++ keyboards/412_64/412_64.h | 29 ++++ keyboards/412_64/config.h | 202 ++++++++++++++++++++++ keyboards/412_64/keymaps/default/config.h | 5 + keyboards/412_64/keymaps/default/keymap.c | 105 +++++++++++ keyboards/412_64/keymaps/default/rules.mk | 1 + keyboards/412_64/readme.md | 15 ++ keyboards/412_64/rules.mk | 73 ++++++++ 8 files changed, 459 insertions(+) create mode 100644 keyboards/412_64/412_64.c create mode 100644 keyboards/412_64/412_64.h create mode 100644 keyboards/412_64/config.h create mode 100644 keyboards/412_64/keymaps/default/config.h create mode 100644 keyboards/412_64/keymaps/default/keymap.c create mode 100644 keyboards/412_64/keymaps/default/rules.mk create mode 100644 keyboards/412_64/readme.md create mode 100644 keyboards/412_64/rules.mk diff --git a/keyboards/412_64/412_64.c b/keyboards/412_64/412_64.c new file mode 100644 index 000000000..eaec54ade --- /dev/null +++ b/keyboards/412_64/412_64.c @@ -0,0 +1,29 @@ + +#include "412_64.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + + led_set_user(usb_led); +} diff --git a/keyboards/412_64/412_64.h b/keyboards/412_64/412_64.h new file mode 100644 index 000000000..27a32f15a --- /dev/null +++ b/keyboards/412_64/412_64.h @@ -0,0 +1,29 @@ + +#ifndef FOURx16_H +#define FOURx16_H + +#include "quantum.h" +#define ___ KC_NO + +// This a shortcut to help you visually see your layout. +// The first section contains all of the arguments +// The second converts the arguments into a two-dimensional array + +#define LAYOUT_ortho_4x16( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K10, K11, K12, K13, K14, K15, \ + K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K30, K31, \ + K32, K33, K34, K35, K36, K37, K38, K39, K40, K41, K42, K43, K44, K45, K46, K47, \ + K48, K49, K50, K51, K52, K53, K54, K55, K56, K57, K58, K59, K60, K61, K62, K63 \ +) \ +{ \ + { K00, K02, K04, K06, K08, K10, K12, K14 }, \ + { K01, K03, K05, K07, K09, K11, K13, K15 }, \ + { K16, K18, K20, K22, K24, K26, K28, K30 }, \ + { K17, K19, K21, K23, K25, K27, K29, K31 }, \ + { K32, K34, K36, K38, K40, K42, K44, K46 }, \ + { K33, K35, K37, K39, K41, K43, K45, K47 }, \ + { K48, K50, K52, K54, K56, K58, K60, K62 }, \ + { K49, K51, K53, K55, K57, K59, K61, K63 } \ +} + +#endif diff --git a/keyboards/412_64/config.h b/keyboards/412_64/config.h new file mode 100644 index 000000000..28d9763c3 --- /dev/null +++ b/keyboards/412_64/config.h @@ -0,0 +1,202 @@ + + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xF7E0 +#define PRODUCT_ID 0x0412 +#define DEVICE_VER 0x0000 +#define MANUFACTURER EDI/SCI +#define PRODUCT 412 64 Model 00 +#define DESCRIPTION A compact 60% keyboard inspired by the 4x4x4x4x4 + +/* key matrix size */ +#define MATRIX_ROWS 8 +#define MATRIX_COLS 8 + +/* + * 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 { D3, F4, F5, F6, F7, B1, B3, B2 } +#define MATRIX_COL_PINS { B0, D2, D0, D1, D4, C6, D7, E6 } +#define UNUSED_PINS { B4, B5, B6, B7, C7, F0, F1 } + + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +// #define BACKLIGHT_PIN C7 +// #define BACKLIGHT_BREATHING +// #define BACKLIGHT_LEVELS 3 + + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* 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 userful 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 + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * 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 + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +//#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ + diff --git a/keyboards/412_64/keymaps/default/config.h b/keyboards/412_64/keymaps/default/config.h new file mode 100644 index 000000000..d533d806c --- /dev/null +++ b/keyboards/412_64/keymaps/default/config.h @@ -0,0 +1,5 @@ + + +#pragma once + +// place overrides here diff --git a/keyboards/412_64/keymaps/default/keymap.c b/keyboards/412_64/keymaps/default/keymap.c new file mode 100644 index 000000000..c098a37e5 --- /dev/null +++ b/keyboards/412_64/keymaps/default/keymap.c @@ -0,0 +1,105 @@ + +#include QMK_KEYBOARD_H + +#define _MAIN 0 +#define _RAISE 1 +#define _LOWER 2 + +// Readability keycodes +#define LOWER MO(_LOWER) +#define RAISE MO(_RAISE) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + +/* MAIN + * .-----------------------------------------------------------------------------------------------------------------------------------------------. + * | TAB | Q | W | E | R | T | Y | U | I | O | P | Backsp | Delete | 7 | 8 | 9 | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | ESC | A | S | D | F | G | H | J | K | L | ; | ' | PgUp | 4 | 5 | 6 | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | SHIFT | Z | X | C | V | B | N | M | , | . | / | ENTER | PgDn | 1 | 2 | 3 | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | LCTRL | PAUS | GUI | ALT | Lower | Space | Space | Raise | Left | Down | Up | Right | Shift | 0 | . | ENTER | + * '-----------------------------------------------------------------------------------------------------------------------------------------------' + */ + + [_MAIN] = LAYOUT_ortho_4x16( + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, KC_DEL, KC_KP_7, KC_KP_8, KC_KP_9, + KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_PGUP, KC_KP_4, KC_KP_5, KC_KP_6, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, KC_PGDN, KC_KP_1, KC_KP_2, KC_KP_3, + KC_LCTL, KC_PAUS, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_RSFT, KC_KP_0, KC_KP_DOT, KC_PENT + ), + +/* RAISE + * .-----------------------------------------------------------------------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | | Insert | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | | | | | | - | = | [ | ] | \ | Home | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | | | | | | ISO # | ISO / | | | PScr | End | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | | | | | | Next | Vol- | Vol+ | Play | | | | | + * '-----------------------------------------------------------------------------------------------------------------------------------------------' + */ + + [_RAISE] = LAYOUT_ortho_4x16( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, KC_INS, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, KC_HOME, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, KC_NUHS, KC_NUBS, _______, _______, KC_PSCR, KC_END, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, _______, _______, _______, _______ + ), + +/* LOWER + * .-----------------------------------------------------------------------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | | | | | Reset | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | ISO ~ | ISO | | | | | | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | | | | | | | | | Mute | | | | | + * '-----------------------------------------------------------------------------------------------------------------------------------------------' + */ + + [_LOWER] = LAYOUT_ortho_4x16( + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, _______, _______, _______, RESET, + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, _______, _______, _______, _______, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS), _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, _______, _______, _______, _______ + ), + +}; + + +const uint16_t PROGMEM fn_actions[] = { + +}; + + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { + keyevent_t event = record->event; + (void)event; + + switch (id) { + + } + return MACRO_NONE; +} + + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/412_64/keymaps/default/rules.mk b/keyboards/412_64/keymaps/default/rules.mk new file mode 100644 index 000000000..08fdcc0a5 --- /dev/null +++ b/keyboards/412_64/keymaps/default/rules.mk @@ -0,0 +1 @@ +KEY_LOCK_ENABLE = yes # Enable the universal locking key, which lets you do any locking you require. \ No newline at end of file diff --git a/keyboards/412_64/readme.md b/keyboards/412_64/readme.md new file mode 100644 index 000000000..081103107 --- /dev/null +++ b/keyboards/412_64/readme.md @@ -0,0 +1,15 @@ +# 412-64 + +![412-64](image_here) + +A compact 60% keyboard designed by Fate Everywhere and sold on a limited basis. Born out of the desire for a Planck with a numpad for technical work. + +Keyboard Maintainer: [Fate Everywhere](https://github.com/fateeverywhere) +Hardware Supported: 4x16 T&E Prototype, 412-64 Mk. 0, Mk. 1. +Hardware Availability: Highly limited, contact /u/FateEverywhere on reddit for availability. + +Make example for this keyboard (after setting up your build environment): + + make 412-64:default + +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). \ No newline at end of file diff --git a/keyboards/412_64/rules.mk b/keyboards/412_64/rules.mk new file mode 100644 index 000000000..9e74da5d9 --- /dev/null +++ b/keyboards/412_64/rules.mk @@ -0,0 +1,73 @@ +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + +# Boot Section Size in *bytes* +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + +# Bootloader +# This definition is optional, and if your keyboard supports multiple bootloaders of +# different sizes, comment this out, and the correct address will be loaded +# automatically (+60). See bootloader.mk for all options. +BOOTLOADER = atmel-dfu + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = no # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) + +LAYOUTS = ortho_4x16 From 911b2d07565fa0c6edb49a198f4420391f7f33f3 Mon Sep 17 00:00:00 2001 From: KOBAYASHI Daisuke Date: Wed, 22 Aug 2018 23:56:24 +0900 Subject: [PATCH 513/788] Docs: Fix descriptions of KC_INT1 and KC_INT3 --- docs/keycodes.md | 4 ++-- docs/keycodes_basic.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/keycodes.md b/docs/keycodes.md index e5d35b2b4..592b52ec7 100644 --- a/docs/keycodes.md +++ b/docs/keycodes.md @@ -141,9 +141,9 @@ This is a reference only. Each group of keys links to the page documenting their |`KC_LOCKING_SCROLL` |`KC_LSCR` |Locking Scroll Lock | |`KC_KP_COMMA` |`KC_PCMM` |Keypad `,` | |`KC_KP_EQUAL_AS400` | |Keypad `=` on AS/400 keyboards | -|`KC_INT1` |`KC_RO` |JIS `\` and | | +|`KC_INT1` |`KC_RO` |JIS `\` and `_` | |`KC_INT2` |`KC_KANA` |JIS Katakana/Hiragana | -|`KC_INT3` |`KC_JYEN` |JIS `¥` | +|`KC_INT3` |`KC_JYEN` |JIS `¥` and | | |`KC_INT4` |`KC_HENK` |JIS Henkan | |`KC_INT5` |`KC_MHEN` |JIS Muhenkan | |`KC_INT6` | |JIS Numpad `,` | diff --git a/docs/keycodes_basic.md b/docs/keycodes_basic.md index 82e94aa5e..ada9cc0e5 100644 --- a/docs/keycodes_basic.md +++ b/docs/keycodes_basic.md @@ -123,9 +123,9 @@ The basic set of keycodes are based on the [HID Keyboard/Keypad Usage Page (0x07 |Key |Aliases |Description | |----------|---------|-------------------------------| -|`KC_INT1` |`KC_RO` |JIS `\` and || +|`KC_INT1` |`KC_RO` |JIS `\` and `_` | |`KC_INT2` |`KC_KANA`|JIS Katakana/Hiragana | -|`KC_INT3` |`KC_JYEN`|JIS `¥` | +|`KC_INT3` |`KC_JYEN`|JIS `¥` and || |`KC_INT4` |`KC_HENK`|JIS Henkan | |`KC_INT5` |`KC_MHEN`|JIS Muhenkan | |`KC_INT6` | |JIS Numpad `,` | From 991686203c91eca9149e6fe942be73e5172719ba Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Tue, 13 Nov 2018 14:20:42 -0800 Subject: [PATCH 514/788] converter/m0110_usb Configurator support and readme cleanup (#4421) * Apple M0110 USB converter: readme cleanup * Apple M0110 USB converter: Configurator support --- keyboards/converter/m0110_usb/README.md | 18 +-- keyboards/converter/m0110_usb/info.json | 172 ++++++++++++++++++++++++ 2 files changed, 181 insertions(+), 9 deletions(-) create mode 100644 keyboards/converter/m0110_usb/info.json diff --git a/keyboards/converter/m0110_usb/README.md b/keyboards/converter/m0110_usb/README.md index 3041eb0b4..2e8a2eaef 100644 --- a/keyboards/converter/m0110_usb/README.md +++ b/keyboards/converter/m0110_usb/README.md @@ -1,19 +1,19 @@ -M0110(A) keyboard converter -====================================== +# M0110(A) keyboard converter + This is a port of the original M0110 converter from TMK to QMK. The original converter was designed to work with **ATmega32U2** and **ATmega32U4** based microcontrollers to convert Apple M0110/M0110A keyboards and M0120 numpads to USB. This port has been tested to be compatible with the [**Adafruit Feather 32U4 BLE**](https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le). -### Enabling Bluetooth for the Adafruit Feather 32U4 BLE ----------------------------------------------------- +## Enabling Bluetooth for the Adafruit Feather 32U4 BLE + Simply add `BLUETOOTH = AdafruitBLE` to your `rules.mk` file. This enables code specifically for the Adafruit Feather 32U4 BLE. If enabled, the device will use the `PRODUCT` and `DESCRIPTION` values from `config.h` for the device name displayed by the Feather on host devices. You can simply change these values to change the device name. -### Pins ----- +## Pins + This port utilizes the same pins that the TMK converter used. `PD1` is used for `CLOCK` and `PD0` is used for the `DATA` from the keyboard. These pins can be changed in `config.h`. -### Other important hardware notes from the original TMK converter Readme: +## Other important hardware notes from the original TMK converter Readme: >### Hardware >-------- >You can buy preassembled [TMK converter] or make yourown with AVR dev board like PJRC [Teensy]. @@ -45,7 +45,7 @@ This port utilizes the same pins that the TMK converter used. `PD1` is used for [**View the original TMK converter Repository**](https://github.com/tmk/tmk_keyboard/tree/master/converter/m0110_usb) -### QMK Port Changelog ---------- +## QMK Port Changelog + - 2018/08/01 - Original Release diff --git a/keyboards/converter/m0110_usb/info.json b/keyboards/converter/m0110_usb/info.json new file mode 100644 index 000000000..6ef610334 --- /dev/null +++ b/keyboards/converter/m0110_usb/info.json @@ -0,0 +1,172 @@ +{ + "keyboard_name": "M0110(A) keyboard converter", + "url": "", + "maintainer": "qmk", + "width": 19.25, + "height": 5, + "layouts": { + "LAYOUT_ansi": { + "key_count": 78, + "layout": [ + {"label":"`", "x":0, "y":0}, + {"label":"1", "x":1, "y":0}, + {"label":"2", "x":2, "y":0}, + {"label":"3", "x":3, "y":0}, + {"label":"4", "x":4, "y":0}, + {"label":"5", "x":5, "y":0}, + {"label":"6", "x":6, "y":0}, + {"label":"7", "x":7, "y":0}, + {"label":"8", "x":8, "y":0}, + {"label":"9", "x":9, "y":0}, + {"label":"0", "x":10, "y":0}, + {"label":"-", "x":11, "y":0}, + {"label":"=", "x":12, "y":0}, + {"label":"Backspace", "x":13, "y":0, "w":1.5}, + {"label":"Num Lock", "x":15.25, "y":0}, + {"label":"=", "x":16.25, "y":0}, + {"label":"/", "x":17.25, "y":0}, + {"label":"*", "x":18.25, "y":0}, + {"label":"Tab", "x":0, "y":1, "w":1.5}, + {"label":"Q", "x":1.5, "y":1}, + {"label":"W", "x":2.5, "y":1}, + {"label":"E", "x":3.5, "y":1}, + {"label":"R", "x":4.5, "y":1}, + {"label":"T", "x":5.5, "y":1}, + {"label":"Y", "x":6.5, "y":1}, + {"label":"U", "x":7.5, "y":1}, + {"label":"I", "x":8.5, "y":1}, + {"label":"O", "x":9.5, "y":1}, + {"label":"P", "x":10.5, "y":1}, + {"label":"[", "x":11.5, "y":1}, + {"label":"]", "x":12.5, "y":1}, + {"label":"7", "x":15.25, "y":1}, + {"label":"8", "x":16.25, "y":1}, + {"label":"9", "x":17.25, "y":1}, + {"label":"-", "x":18.25, "y":1}, + {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, + {"label":"A", "x":1.75, "y":2}, + {"label":"S", "x":2.75, "y":2}, + {"label":"D", "x":3.75, "y":2}, + {"label":"F", "x":4.75, "y":2}, + {"label":"G", "x":5.75, "y":2}, + {"label":"H", "x":6.75, "y":2}, + {"label":"J", "x":7.75, "y":2}, + {"label":"K", "x":8.75, "y":2}, + {"label":"L", "x":9.75, "y":2}, + {"label":";", "x":10.75, "y":2}, + {"label":"'", "x":11.75, "y":2}, + {"label":"Enter", "x":12.75, "y":2, "w":1.75}, + {"label":"4", "x":15.25, "y":2}, + {"label":"5", "x":16.25, "y":2}, + {"label":"6", "x":17.25, "y":2}, + {"label":"+", "x":18.25, "y":2}, + {"label":"Shift", "x":0, "y":3, "w":2.25}, + {"label":"Z", "x":2.25, "y":3}, + {"label":"X", "x":3.25, "y":3}, + {"label":"C", "x":4.25, "y":3}, + {"label":"V", "x":5.25, "y":3}, + {"label":"B", "x":6.25, "y":3}, + {"label":"N", "x":7.25, "y":3}, + {"label":"M", "x":8.25, "y":3}, + {"label":",", "x":9.25, "y":3}, + {"label":".", "x":10.25, "y":3}, + {"label":"/", "x":11.25, "y":3}, + {"label":"Up", "x":13.5, "y":3}, + {"label":"1", "x":15.25, "y":3}, + {"label":"2", "x":16.25, "y":3}, + {"label":"3", "x":17.25, "y":3}, + {"label":"Enter", "x":18.25, "y":3, "h":2}, + {"label":"Alt", "x":0, "y":4, "w":1.5}, + {"label":"GUI", "x":1.5, "y":4, "w":2}, + {"label":"Space", "x":3.5, "y":4, "w":6}, + {"label":"MO(1)", "x":9.5, "y":4}, + {"label":"\\", "x":10.5, "y":4}, + {"label":"Left", "x":11.5, "y":4}, + {"label":"Right", "x":12.5, "y":4}, + {"label":"Down", "x":13.5, "y":4}, + {"label":"0", "x":15.25, "y":4, "w":2}, + {"label":".", "x":17.25, "y":4} + ] + }, + "LAYOUT_iso": { + "key_count": 75, + "layout": [ + {"label":"`", "x":0, "y":0}, + {"label":"1", "x":1, "y":0}, + {"label":"2", "x":2, "y":0}, + {"label":"3", "x":3, "y":0}, + {"label":"4", "x":4, "y":0}, + {"label":"5", "x":5, "y":0}, + {"label":"6", "x":6, "y":0}, + {"label":"7", "x":7, "y":0}, + {"label":"8", "x":8, "y":0}, + {"label":"9", "x":9, "y":0}, + {"label":"0", "x":10, "y":0}, + {"label":"-", "x":11, "y":0}, + {"label":"=", "x":12, "y":0}, + {"label":"Backspace", "x":13, "y":0, "w":1.5}, + {"label":"Num Lock", "x":15.25, "y":0}, + {"label":"=", "x":16.25, "y":0}, + {"label":"/", "x":17.25, "y":0}, + {"label":"*", "x":18.25, "y":0}, + {"label":"Tab", "x":0, "y":1, "w":1.5}, + {"label":"Q", "x":1.5, "y":1}, + {"label":"W", "x":2.5, "y":1}, + {"label":"E", "x":3.5, "y":1}, + {"label":"R", "x":4.5, "y":1}, + {"label":"T", "x":5.5, "y":1}, + {"label":"Y", "x":6.5, "y":1}, + {"label":"U", "x":7.5, "y":1}, + {"label":"I", "x":8.5, "y":1}, + {"label":"O", "x":9.5, "y":1}, + {"label":"P", "x":10.5, "y":1}, + {"label":"[", "x":11.5, "y":1}, + {"label":"]", "x":12.5, "y":1}, + {"label":"Return", "x":13.75, "y":1, "w":0.75, "h":2}, + {"label":"7", "x":15.25, "y":1}, + {"label":"8", "x":16.25, "y":1}, + {"label":"9", "x":17.25, "y":1}, + {"label":"-", "x":18.25, "y":1}, + {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, + {"label":"A", "x":1.75, "y":2}, + {"label":"S", "x":2.75, "y":2}, + {"label":"D", "x":3.75, "y":2}, + {"label":"F", "x":4.75, "y":2}, + {"label":"G", "x":5.75, "y":2}, + {"label":"H", "x":6.75, "y":2}, + {"label":"J", "x":7.75, "y":2}, + {"label":"K", "x":8.75, "y":2}, + {"label":"L", "x":9.75, "y":2}, + {"label":";", "x":10.75, "y":2}, + {"label":"'", "x":11.75, "y":2}, + {"label":"#", "x":12.75, "y":2}, + {"label":"4", "x":15.25, "y":2}, + {"label":"5", "x":16.25, "y":2}, + {"label":"6", "x":17.25, "y":2}, + {"label":"+", "x":18.25, "y":2}, + {"label":"Shift", "x":0, "y":3, "w":1.25}, + {"label":"\\", "x":1.25, "y":3}, + {"label":"Z", "x":2.25, "y":3}, + {"label":"X", "x":3.25, "y":3}, + {"label":"C", "x":4.25, "y":3}, + {"label":"V", "x":5.25, "y":3}, + {"label":"B", "x":6.25, "y":3}, + {"label":"N", "x":7.25, "y":3}, + {"label":"M", "x":8.25, "y":3}, + {"label":",", "x":9.25, "y":3}, + {"label":".", "x":10.25, "y":3}, + {"label":"/", "x":11.25, "y":3}, + {"label":"1", "x":15.25, "y":3}, + {"label":"2", "x":16.25, "y":3}, + {"label":"3", "x":17.25, "y":3}, + {"label":"Enter", "x":18.25, "y":3, "h":2}, + {"label":"Option", "x":1, "y":4}, + {"label":"GUI", "x":2, "y":4, "w":1.5}, + {"label":"Space", "x":3.5, "y":4, "w":7.5}, + {"label":"Enter", "x":11, "y":4, "w":1.5}, + {"label":"0", "x":15.25, "y":4, "w":2}, + {"label":".", "x":17.25, "y":4} + ] + } + } +} From e10a602e7b1ac8d7f2ff027ae41570fe1a2ba57d Mon Sep 17 00:00:00 2001 From: FiNeXdesign Date: Tue, 13 Nov 2018 23:44:50 +0100 Subject: [PATCH 515/788] Keymap: Finex Redox keymap (#4418) * Added FiNeX custom Redox Layout, first commit. * updated readme * removed old code --- keyboards/redox/keymaps/finex/config.h | 36 +++++ keyboards/redox/keymaps/finex/keymap.c | 188 ++++++++++++++++++++++++ keyboards/redox/keymaps/finex/readme.md | 35 +++++ keyboards/redox/keymaps/finex/rules.mk | 3 + 4 files changed, 262 insertions(+) create mode 100644 keyboards/redox/keymaps/finex/config.h create mode 100644 keyboards/redox/keymaps/finex/keymap.c create mode 100644 keyboards/redox/keymaps/finex/readme.md create mode 100644 keyboards/redox/keymaps/finex/rules.mk diff --git a/keyboards/redox/keymaps/finex/config.h b/keyboards/redox/keymaps/finex/config.h new file mode 100644 index 000000000..9adbcedf4 --- /dev/null +++ b/keyboards/redox/keymaps/finex/config.h @@ -0,0 +1,36 @@ +/* +Copyright 2018 Leonardo (FiNeX) Finetti + +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 . +*/ + +#pragma once + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + +#undef RGBLED_NUM +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 14 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 diff --git a/keyboards/redox/keymaps/finex/keymap.c b/keyboards/redox/keymaps/finex/keymap.c new file mode 100644 index 000000000..8b8f5f183 --- /dev/null +++ b/keyboards/redox/keymaps/finex/keymap.c @@ -0,0 +1,188 @@ +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +// Layer names +#define _QWERTY 0 +#define _COLEMAKDHMK 1 +#define _QWERTY_MAC 2 +#define _COLEMAKDHMK_MAC 3 +#define _SYMB 4 +#define _ADJUST 5 + +// Custom keycodes +enum custom_keycodes { + QWERTY = SAFE_RANGE, + COLEMAKDHMK, + QWERTY_MAC, + COLEMAKDHMK_MAC, + SYMB, + ADJUST, + ASC_SAR, + ASC_DAR, + ASC_SQT, + ASC_DQT, + ASC_HAP, + ASC_SAD +}; + +// Shortcut to make keymap more readable +#define KC_SYQT LT(_SYMB, KC_QUOT) +#define KC_SYGR LT(_SYMB, KC_GRV) +#define KC_SYSP LT(_SYMB, KC_SPC) +#define KC_ADEN LT(_ADJUST, KC_END) +#define KC_ADPU LT(_ADJUST, KC_PGUP) +#define KC_CESC LCTL_T(KC_ESC) +#define KC_CBSP LCTL_T(KC_BSPC) +#define KC_CMIN RCTL_T(KC_MINUS) +#define KC_GBSP LGUI_T(KC_BSPC) +#define KC_ADEL LALT_T(KC_DEL) +#define KC_APLS RALT_T(KC_PPLS) +#define KC_LSEN LSFT_T(KC_ENT) +#define KC_RSEN RSFT_T(KC_ENT) +#define FN1 QWERTY +#define FN2 COLEMAKDHMK +#define FN3 QWERTY_MAC +#define FN4 COLEMAKDHMK_MAC + +// Send custom strings or change default base layer +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (record->event.pressed) { + switch(keycode) { + case ASC_SAR: + SEND_STRING("->"); + return false; + case ASC_DAR: + SEND_STRING("=>"); + return false; + case ASC_SQT: + // SS_RALT(): Avoid sending dead key on software intl layouts + SEND_STRING(SS_RALT("'")); + return false; + case ASC_DQT: + // SS_RALT(SS_LSFT()): Avoid sending dead key on software intl layouts + SEND_STRING(SS_RALT(SS_LSFT("\""))); + return false; + case ASC_HAP: + SEND_STRING(":-) "); + return false; + case ASC_SAD: + SEND_STRING(":-( "); + return false; + case QWERTY: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + case COLEMAKDHMK: + if (record->event.pressed) { + set_single_persistent_default_layer(_COLEMAKDHMK); + } + return false; + break; + case QWERTY_MAC: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY_MAC); + } + return false; + break; + case COLEMAKDHMK_MAC: + if (record->event.pressed) { + set_single_persistent_default_layer(_COLEMAKDHMK_MAC); + } + return false; + break; + } + } + return true; +}; + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_QWERTY] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_SYGR ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 , KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,KC_SYQT , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_TAB ,KC_Q ,KC_W ,KC_E ,KC_R ,KC_T ,KC_DEL , KC_BSPC ,KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,KC_EQL , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_CESC ,KC_A ,KC_S ,KC_D ,KC_F ,KC_G ,KC_LBRC , KC_RBRC ,KC_H ,KC_J ,KC_K ,KC_L ,KC_SCLN ,KC_CMIN , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_LSPO ,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,KC_ADPU ,KC_PGDN , KC_HOME ,KC_ADEN ,KC_N ,KC_M ,KC_COMM ,KC_DOT ,KC_SLSH ,KC_RSPC , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + KC_SYSP ,KC_BSLS ,KC_QUOT ,KC_LGUI , KC_ADEL , KC_CBSP ,KC_LSEN , KC_RSEN ,KC_SYSP , KC_APLS , KC_LEFT ,KC_DOWN ,KC_UP ,KC_RGHT + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ + ), + + [_COLEMAKDHMK] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_SYGR ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 , KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,KC_SYQT , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_TAB ,KC_Q ,KC_W ,KC_F ,KC_P ,KC_B ,KC_DEL , KC_BSPC ,KC_J ,KC_L ,KC_U ,KC_Y ,KC_SCLN ,KC_EQL , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_CESC ,KC_A ,KC_R ,KC_S ,KC_T ,KC_G ,KC_LBRC , KC_RBRC ,KC_M ,KC_N ,KC_E ,KC_I ,KC_O ,KC_CMIN , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_LSPO ,KC_Z ,KC_X ,KC_C ,KC_D ,KC_V ,KC_ADPU ,KC_PGDN , KC_HOME ,KC_ADEN ,KC_K ,KC_H ,KC_COMM ,KC_DOT ,KC_SLSH ,KC_RSPC , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + KC_SYSP ,KC_BSLS ,KC_QUOT ,KC_LGUI , KC_ADEL , KC_CBSP ,KC_LSEN , KC_RSEN ,KC_SYSP , KC_APLS , KC_LEFT ,KC_DOWN ,KC_UP ,KC_RGHT + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ + ), + + [_QWERTY_MAC] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_SYGR ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 , KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,KC_SYQT , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_TAB ,KC_Q ,KC_W ,KC_E ,KC_R ,KC_T ,KC_DEL , KC_BSPC ,KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,KC_EQL , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_CESC ,KC_A ,KC_S ,KC_D ,KC_F ,KC_G ,KC_LBRC , KC_RBRC ,KC_H ,KC_J ,KC_K ,KC_L ,KC_SCLN ,KC_CMIN , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_LSPO ,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,KC_ADPU ,KC_PGDN , KC_HOME ,KC_ADEN ,KC_N ,KC_M ,KC_COMM ,KC_DOT ,KC_SLSH ,KC_RSPC , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + KC_SYSP ,KC_BSLS ,KC_QUOT ,KC_LCTL , KC_ADEL , KC_GBSP ,KC_LSEN , KC_RSEN ,KC_SYSP , KC_APLS , KC_LEFT ,KC_DOWN ,KC_UP ,KC_RGHT + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ + ), + + [_COLEMAKDHMK_MAC] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_SYGR ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 , KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,KC_SYQT , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_TAB ,KC_Q ,KC_W ,KC_F ,KC_P ,KC_B ,KC_DEL , KC_BSPC ,KC_J ,KC_L ,KC_U ,KC_Y ,KC_SCLN ,KC_EQL , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_CESC ,KC_A ,KC_R ,KC_S ,KC_T ,KC_G ,KC_LBRC , KC_RBRC ,KC_M ,KC_N ,KC_E ,KC_I ,KC_O ,KC_CMIN , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_LSPO ,KC_Z ,KC_X ,KC_C ,KC_D ,KC_V ,KC_ADPU ,KC_PGDN , KC_HOME ,KC_ADEN ,KC_K ,KC_H ,KC_COMM ,KC_DOT ,KC_SLSH ,KC_RSPC , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + KC_SYSP ,KC_BSLS ,KC_QUOT ,KC_LCTL , KC_ADEL , KC_GBSP ,KC_LSEN , KC_RSEN ,KC_SYSP , KC_APLS , KC_LEFT ,KC_DOWN ,KC_UP ,KC_RGHT + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ + ), + + [_SYMB] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + XXXXXXX ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 , KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,KC_CIRC ,KC_BSLS ,KC_PMNS ,KC_UNDS ,XXXXXXX ,_______ , _______ ,XXXXXXX ,KC_KP_7 ,KC_KP_8 ,KC_KP_9 ,KC_F11 ,KC_APP , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,KC_PAST ,KC_PIPE ,ASC_SQT ,KC_TILD ,KC_QUOT ,ASC_SAR , ASC_DAR ,XXXXXXX ,KC_KP_4 ,KC_KP_5 ,KC_KP_6 ,KC_F12 ,KC_PSCR , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,KC_HASH ,KC_AMPR ,KC_AT ,ASC_DQT ,KC_GRV ,ASC_SAD ,ASC_HAP , _______ ,_______ ,XXXXXXX ,KC_KP_1 ,KC_KP_2 ,KC_KP_3 ,KC_UP ,_______ , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + _______ ,_______ ,_______ ,_______ , _______ , _______ ,_______ , _______ ,_______ , KC_KP_0 , KC_PDOT ,KC_LEFT ,KC_DOWN ,KC_RGHT + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ + ), + + [_ADJUST] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + XXXXXXX ,FN1 ,FN2 ,FN3 ,FN4 ,XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,RESET ,RGB_M_P ,RGB_TOG ,RGB_MOD ,RGB_HUD ,RGB_HUI , RGB_SAD ,RGB_SAI ,RGB_VAD ,RGB_VAI ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,RGB_M_B ,RGB_M_R ,RGB_M_SW,RGB_M_SN,XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,RGB_M_K ,RGB_M_X ,RGB_M_G ,XXXXXXX ,_______ ,XXXXXXX , XXXXXXX ,_______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ + ) + +}; diff --git a/keyboards/redox/keymaps/finex/readme.md b/keyboards/redox/keymaps/finex/readme.md new file mode 100644 index 000000000..f1b6fa7c7 --- /dev/null +++ b/keyboards/redox/keymaps/finex/readme.md @@ -0,0 +1,35 @@ +# Customized keymap for Redox by Leonardo (FiNeX) Finetti. + + +## Features + +- Enabled USE_SERIAL for Falba.Tech Redox keyboards. +- PC Layouts: QWERTY, Colemak Mod DH-MK. +- Mac Layouts: same as above with CTRL-GUI keys inverted on the bottom row. +- Added redundant "Space", "Esc" and "Ctrl" keys. +- Added macro to print "->" and "=>" strings. +- Added macro to print ":-( " and ":-) " strings. +- Added more arrows. +- Added "(" and ")" on Shifts keys. +- Added Shift on both ) "Enter" keys. +- Removed Mouse and media support. +- Added missing "Print Screen" and "Menu" keys. +- Added missing "F11" and "F12" keys. + + +## Layers + +This keymap use the default one with some minor improvements to suit my needs. + +## Changelog + +- 2018/11/13 + First public release + + +## TODO + +- Bring back mouse and multimedia keys. +- Add default Colemak Mod DH layout. +- Improve top corner keys. +- Improve bottom row keys (mostly KC_BSLS and KC_QUOT). diff --git a/keyboards/redox/keymaps/finex/rules.mk b/keyboards/redox/keymaps/finex/rules.mk new file mode 100644 index 000000000..21550e9fe --- /dev/null +++ b/keyboards/redox/keymaps/finex/rules.mk @@ -0,0 +1,3 @@ +RGBLIGHT_ENABLE = yes + +COMMAND_ENABLE = no From f7fcba329dbd659a4bb37acdf7e2dc24204a81c8 Mon Sep 17 00:00:00 2001 From: James Osborn Date: Wed, 14 Nov 2018 15:33:46 +0000 Subject: [PATCH 516/788] Fixed Unicode Support heading (#4425) Previously, Unicode Support heading appeared as the last row in the Swap Hands table. --- docs/keycodes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/keycodes.md b/docs/keycodes.md index 592b52ec7..30fe60278 100644 --- a/docs/keycodes.md +++ b/docs/keycodes.md @@ -459,6 +459,7 @@ This is a reference only. Each group of keys links to the page documenting their |`SH_MOFF` |Momentarily turns off swap. | |`SH_TG` |Toggles swap on and off with every key press. | |`SH_TT` |Toggles with a tap; momentary when held. | + ## [Unicode Support](feature_unicode.md) |Key |Aliases| | From 0cda2f43e2c95fe5dd440e6391ae807f508b040b Mon Sep 17 00:00:00 2001 From: Phillip Tennen Date: Wed, 14 Nov 2018 16:45:46 +0100 Subject: [PATCH 517/788] Backlight status functions (#4259) * add functions to set specific backlight state * add function to query backlight state * update documentation with new backlight functions * Update tmk_core/common/backlight.c Co-Authored-By: codyd51 * Update tmk_core/common/backlight.h Co-Authored-By: codyd51 * update docs for is_backlight_enabled() name change --- docs/feature_backlight.md | 19 ++++++++------ tmk_core/common/backlight.c | 51 ++++++++++++++++++++++++++++++++----- tmk_core/common/backlight.h | 4 +++ 3 files changed, 60 insertions(+), 14 deletions(-) diff --git a/docs/feature_backlight.md b/docs/feature_backlight.md index 7bb7e03a8..f7a35406c 100644 --- a/docs/feature_backlight.md +++ b/docs/feature_backlight.md @@ -54,14 +54,17 @@ In this handler, the value of an incrementing counter is mapped onto a precomput ## Backlight Functions -|Function |Description | -|----------|----------------------------------------------------------| -|`backlight_toggle()` |Turn the backlight on or off | -|`backlight_step()` |Cycle through backlight levels | -|`backlight_increase()` |Increase the backlight level | -|`backlight_decrease()` |Decrease the backlight level | -|`backlight_level(x)` |Sets the backlight level to specified level | -|`get_backlight_level()`|Return the current backlight level | +|Function |Description | +|----------|-----------------------------------------------------------| +|`backlight_toggle()` |Turn the backlight on or off | +|`backlight_enable()` |Turn the backlight on | +|`backlight_disable()` |Turn the backlight off | +|`backlight_step()` |Cycle through backlight levels | +|`backlight_increase()` |Increase the backlight level | +|`backlight_decrease()` |Decrease the backlight level | +|`backlight_level(x)` |Sets the backlight level to specified level | +|`get_backlight_level()` |Return the current backlight level | +|`is_backlight_enabled()`|Return whether the backlight is currently on | ### Backlight Breathing Functions diff --git a/tmk_core/common/backlight.c b/tmk_core/common/backlight.c index 3e29aacc4..8ddacd98b 100644 --- a/tmk_core/common/backlight.c +++ b/tmk_core/common/backlight.c @@ -76,12 +76,51 @@ void backlight_decrease(void) */ void backlight_toggle(void) { - backlight_config.enable ^= 1; - if (backlight_config.raw == 1) // enabled but level = 0 - backlight_config.level = 1; - eeconfig_update_backlight(backlight_config.raw); - dprintf("backlight toggle: %u\n", backlight_config.enable); - backlight_set(backlight_config.enable ? backlight_config.level : 0); + bool enabled = backlight_config.enable; + dprintf("backlight toggle: %u\n", enabled); + if (enabled) + backlight_disable(); + else + backlight_enable(); +} + +/** \brief Enable backlight + * + * FIXME: needs doc + */ +void backlight_enable(void) +{ + if (backlight_config.enable) return; // do nothing if backlight is already on + + backlight_config.enable = true; + if (backlight_config.raw == 1) // enabled but level == 0 + backlight_config.level = 1; + eeconfig_update_backlight(backlight_config.raw); + dprintf("backlight enable\n"); + backlight_set(backlight_config.level); +} + +/** /brief Disable backlight + * + * FIXME: needs doc + */ +void backlight_disable(void) +{ + if (!backlight_config.enable) return; // do nothing if backlight is already off + + backlight_config.enable = false; + eeconfig_update_backlight(backlight_config.raw); + dprintf("backlight disable\n"); + backlight_set(0); +} + +/** /brief Get the backlight status + * + * FIXME: needs doc + */ +bool is_backlight_enabled(void) +{ + return backlight_config.enable; } /** \brief Backlight step through levels diff --git a/tmk_core/common/backlight.h b/tmk_core/common/backlight.h index ef8ab9b2b..420c9d19e 100644 --- a/tmk_core/common/backlight.h +++ b/tmk_core/common/backlight.h @@ -32,7 +32,11 @@ void backlight_init(void); void backlight_increase(void); void backlight_decrease(void); void backlight_toggle(void); +void backlight_enable(void); +void backlight_disable(void); +bool is_backlight_enabled(void); void backlight_step(void); void backlight_set(uint8_t level); void backlight_level(uint8_t level); uint8_t get_backlight_level(void); + From a034602651c86424bc2197ee61bea0ff584b3be1 Mon Sep 17 00:00:00 2001 From: ishtob Date: Wed, 14 Nov 2018 12:22:16 -0500 Subject: [PATCH 518/788] adding block def to ishtob's userspace (#4427) --- keyboards/planck/keymaps/ishtob/keymap.c | 34 ++--- users/ishtob/ishtob.h | 165 +++++++++++++++++++++++ 2 files changed, 182 insertions(+), 17 deletions(-) diff --git a/keyboards/planck/keymaps/ishtob/keymap.c b/keyboards/planck/keymaps/ishtob/keymap.c index 86c5555da..082257b89 100644 --- a/keyboards/planck/keymaps/ishtob/keymap.c +++ b/keyboards/planck/keymaps/ishtob/keymap.c @@ -25,9 +25,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_QWERTY] = LAYOUT_planck_grid( - LT_FN(KC_TAB), KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, - KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, LT_MC(KC_SCLN), CTL_ENT, - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, LT_RAI(KC_MINS), + LT_FN(KC_TAB), _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_BSPC, + KC_LCTL, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, CTL_ENT, + KC_LSFT, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, LT_RAI(KC_MINS), KC_ESC, KC_CAPS, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_SPC, RAISE, KC_RALT, TG_NUMLAY, KC_APP, KC_DEL ), @@ -43,10 +43,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_COLEMAK] = LAYOUT_planck_grid( - LT_FN(KC_TAB), KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, - KC_LCTL, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, LT_MC(KC_O), KC_ENT, - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, LT_RAI(KC_MINS), - KC_ESC, KC_CAPS, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_SPC, RAISE, KC_RALT, TG_NUMLAY, KC_APP, KC_DEL + LT_FN(KC_TAB), _________________COLEMAK_L1________________, _________________COLEMAK_R1________________, KC_BSPC, + KC_LCTL, _________________COLEMAK_L2________________, _________________COLEMAK_R2________________, KC_ENT, + KC_LSFT, _________________COLEMAK_L3________________, _________________COLEMAK_R3________________, LT_RAI(KC_MINS), + KC_ESC, KC_CAPS, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_SPC, RAISE, KC_RALT, TG_NUMLAY, KC_APP, KC_DEL ), /* Dvorak @@ -61,10 +61,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_DVORAK] = LAYOUT_planck_grid( - LT_FN(KC_TAB), KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, - KC_LCTL, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, LT_MC(KC_S), KC_ENT, - KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, LT_RAI(KC_MINS), - KC_ESC, KC_CAPS, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_SPC, RAISE, KC_RALT, TG_NUMLAY, KC_APP, KC_DEL + LT_FN(KC_TAB), _________________DVORAK_L1_________________, _________________DVORAK_R1_________________, KC_BSPC, + KC_LCTL, _________________DVORAK_L2_________________, _________________DVORAK_R2_________________, KC_ENT, + KC_LSFT, _________________DVORAK_L3_________________, _________________DVORAK_R3_________________, LT_RAI(KC_MINS), + KC_ESC, KC_CAPS, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_SPC, RAISE, KC_RALT, TG_NUMLAY, KC_APP, KC_DEL ), /* Lower @@ -79,9 +79,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_LOWER] = LAYOUT_planck_grid( - KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_GRV, KC_BSLS, - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_EQL, KC_LBRC, KC_RBRC, KC_PIPE, - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),KC_LCBR, KC_RCBR, _______, + ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________, KC_GRV, KC_BSLS, + _______, __________________LONG_FUNC_LEFT___________________, KC_UNDS, KC_EQL, KC_LBRC, KC_RBRC, KC_PIPE, + _______, __________________LONG_FUNC_RIGHT__________________,S(KC_NUHS),S(KC_NUBS),KC_LCBR, KC_RCBR, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY ), @@ -97,7 +97,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_RAISE] = LAYOUT_planck_grid( - KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_PLUS, KC_BSLS, + ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________, KC_PLUS, KC_BSLS, _______, KC_A, KC_UP, KC_D, KC_PSCR, KC_VOLU, KC_4, KC_5, KC_6, KC_PAST, KC_COLN, KC_QUOT, _______, KC_LEFT, KC_DOWN, KC_RIGHT,KC__MUTE, KC_VOLD, KC_1, KC_2, KC_3, KC_UP, KC_SLSH, _______, _______, _______, _______, _______, _______, KC_SPC, KC_0, _______, KC_LEFT, KC_DOWN, KC_RIGHT, KC_NLCK @@ -135,8 +135,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_FNLAYER] = LAYOUT_planck_grid( _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_PLUS, - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_EQL, KC_LBRC, KC_RBRC, KC_QUOT, - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),KC_LCBR, KC_RCBR, _______, + _______, __________________LONG_FUNC_LEFT___________________, KC_UNDS, KC_EQL, KC_LBRC, KC_RBRC, KC_QUOT, + _______, __________________LONG_FUNC_RIGHT__________________,S(KC_NUHS),S(KC_NUBS),KC_LCBR, KC_RCBR, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY ), diff --git a/users/ishtob/ishtob.h b/users/ishtob/ishtob.h index 2c47fce79..3e4d4ffbc 100644 --- a/users/ishtob/ishtob.h +++ b/users/ishtob/ishtob.h @@ -71,6 +71,171 @@ enum userspace_layers { }; */ +/* +Since our quirky block definitions are basically a list of comma separated +arguments, we need a wrapper in order for these definitions to be +expanded before being used as arguments to the LAYOUT_xxx macro. +*/ +#if (!defined(LAYOUT) && defined(KEYMAP)) +#define LAYOUT KEYMAP +#endif + +#define LAYOUT_ergodox_wrapper(...) LAYOUT_ergodox(__VA_ARGS__) +#define LAYOUT_ergodox_pretty_wrapper(...) LAYOUT_ergodox_pretty(__VA_ARGS__) +#define KEYMAP_wrapper(...) LAYOUT(__VA_ARGS__) +#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__) +#define LAYOUT_ortho_4x12_wrapper(...) LAYOUT_ortho_4x12(__VA_ARGS__) +#define LAYOUT_planck_grid(...) LAYOUT_planck_grid(__VA_ARGS__) + +/* +Blocks for each of the four major keyboard layouts +Organized so we can quickly adapt and modify all of them +at once, rather than for each keyboard, one at a time. +And this allows for much cleaner blocks in the keymaps. +For instance Tap/Hold for Control on all of the layouts + +NOTE: These are all the same length. If you do a search/replace + then you need to add/remove underscores to keep the + lengths consistent. +*/ + +#define _________________QWERTY_L1_________________ KC_Q, KC_W, KC_E, KC_R, KC_T +#define _________________QWERTY_L2_________________ KC_A, KC_S, KC_D, KC_F, KC_G +#define _________________QWERTY_L3_________________ KC_Z, KC_X, KC_C, KC_V, KC_B + +#define _________________QWERTY_R1_________________ KC_Y, KC_U, KC_I, KC_O, KC_P +#define _________________QWERTY_R2_________________ KC_H, KC_J, KC_K, KC_L, LT_MC(KC_SCLN) +#define _________________QWERTY_R3_________________ KC_N, KC_M, KC_COMM, KC_DOT, KC_SLASH + + +#define _________________COLEMAK_L1________________ KC_Q, KC_W, KC_F, KC_P, KC_G +#define _________________COLEMAK_L2________________ KC_A, KC_R, KC_S, KC_T, KC_D +#define _________________COLEMAK_L3________________ KC_Z, KC_X, KC_C, KC_V, KC_B + +#define _________________COLEMAK_R1________________ KC_J, KC_L, KC_U, KC_Y, KC_SCLN +#define _________________COLEMAK_R2________________ KC_H, KC_N, KC_E, KC_I, LT_MC(KC_O) +#define _________________COLEMAK_R3________________ KC_K, KC_M, KC_COMM, KC_DOT, KC_SLASH + +#define ______________COLEMAK_MOD_DH_L1____________ KC_Q, KC_W, KC_F, KC_P, KC_B +#define ______________COLEMAK_MOD_DH_L2____________ KC_A, KC_R, KC_S, KC_T, KC_G +#define ______________COLEMAK_MOD_DH_L3____________ KC_Z, KC_X, KC_C, KC_D, KC_V + +#define ______________COLEMAK_MOD_DH_R1____________ KC_J, KC_L, KC_U, KC_Y, KC_SCLN +#define ______________COLEMAK_MOD_DH_R2____________ KC_M, KC_N, KC_E, KC_I, LT_MC(KC_O) +#define ______________COLEMAK_MOD_DH_R3____________ KC_K, KC_H, KC_COMM, KC_DOT, KC_SLASH + + +#define _________________DVORAK_L1_________________ KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y +#define _________________DVORAK_L2_________________ KC_A, KC_O, KC_E, KC_U, KC_I +#define _________________DVORAK_L3_________________ KC_SCLN, KC_Q, KC_J, KC_K, KC_X + +#define _________________DVORAK_R1_________________ KC_F, KC_G, KC_C, KC_R, KC_L +#define _________________DVORAK_R2_________________ KC_D, KC_H, KC_T, KC_N, LT_MC(KC_S) +#define _________________DVORAK_R3_________________ KC_B, KC_M, KC_W, KC_V, KC_Z + + +#define _________________WORKMAN_L1________________ KC_Q, KC_D, KC_R, KC_W, KC_B +#define _________________WORKMAN_L2________________ KC_A, KC_S, KC_H, KC_T, KC_G +#define _________________WORKMAN_L3________________ KC_Z, KC_X, KC_M, KC_C, KC_V + +#define _________________WORKMAN_R1________________ KC_J, KC_F, KC_U, KC_P, KC_SCLN +#define _________________WORKMAN_R2________________ KC_Y, KC_N, KC_E, KC_O, LT_MC(KC_I) +#define _________________WORKMAN_R3________________ KC_K, KC_L, KC_COMM, KC_DOT, KC_SLASH + + +#define _________________NORMAN_L1_________________ KC_Q, KC_W, KC_D, KC_F, KC_K +#define _________________NORMAN_L2_________________ KC_A, KC_S, KC_E, KC_T, KC_G +#define _________________NORMAN_L3_________________ KC_Z, KC_X, KC_C, KC_V, KC_B + +#define _________________NORMAN_R1_________________ KC_J, KC_U, KC_R, KC_L, KC_SCLN +#define _________________NORMAN_R2_________________ KC_Y, KC_N, KC_I, KC_O, LT_MC(KC_U) +#define _________________NORMAN_R3_________________ KC_P, KC_M, KC_COMM, KC_DOT, KC_SLASH + + +#define _________________MALTRON_L1________________ KC_Q, KC_P, KC_Y, KC_C, KC_B +#define _________________MALTRON_L2________________ KC_A, KC_N, KC_I, KC_S, KC_F +#define _________________MALTRON_L3________________ KC_SCLN, KC_SLSH, KC_J KC_G, KC_COMM + +#define _________________MALTRON_R1________________ KC_V, KC_M, KC_U, KC_Z, KC_L +#define _________________MALTRON_R2________________ KC_D, KC_T, KC_D, KC_O, LT_MC(KC_R) +#define _________________MALTRON_R3________________ KC_DOT, KC_W, KC_K, KC_MINS, KC_X + + +#define _________________EUCALYN_L1________________ KC_SLSH, KC_COMM, KC_DOT, KC_F, KC_Q +#define _________________EUCALYN_L2________________ KC_A, KC_O, KC_E, KC_I, KC_U +#define _________________EUCALYN_L3________________ KC_Z, KC_X, KC_C, KC_V, KC_W + +#define _________________EUCALYN_R1________________ KC_M, KC_R, KC_D, KC_Y, KC_P +#define _________________EUCALYN_R2________________ KC_G, KC_T, KC_K, KC_S, LT_MC(KC_N) +#define _________________EUCALYN_R3________________ KC_B, KC_H, KC_J, KC_L, KC_SCLN + + +#define _____________CARPLAX_QFMLWY_L1_____________ KC_Q, KC_F, KC_M, KC_L, KC_W +#define _____________CARPLAX_QFMLWY_L2_____________ KC_D, KC_S, KC_T, KC_N, KC_R +#define _____________CARPLAX_QFMLWY_L3_____________ KC_Z, KC_V, KC_G, KC_C, KC_X + +#define _____________CARPLAX_QFMLWY_R1_____________ KC_Y, KC_U, KC_O, KC_B, KC_J +#define _____________CARPLAX_QFMLWY_R2_____________ KC_I, KC_A, KC_E, KC_H, LT_MC(KC_SCLN) +#define _____________CARPLAX_QFMLWY_R3_____________ KC_P, KC_K, KC_COMM, KC_DOT, KC_SLSH + + +#define _____________CARPLAX_QGMLWB_L1_____________ KC_Q, KC_G, KC_M, KC_L, KC_W +#define _____________CARPLAX_QGMLWB_L2_____________ KC_D, KC_S, KC_T, KC_N, KC_R +#define _____________CARPLAX_QGMLWB_L3_____________ KC_Z, KC_X, KC_C, KC_F, KC_J + +#define _____________CARPLAX_QGMLWB_R1_____________ KC_B, KC_Y, KC_U, KC_V, KC_SCLN +#define _____________CARPLAX_QGMLWB_R2_____________ KC_I, KC_A, KC_E, KC_O, LT_MC(KC_H) +#define _____________CARPLAX_QGMLWB_R3_____________ KC_K, KC_P, KC_COMM, KC_DOT, KC_SLSH + + +#define _____________CARPLAX_QGMLWY_L1_____________ KC_Q, KC_G, KC_M, KC_L, KC_W +#define _____________CARPLAX_QGMLWY_L2_____________ KC_D, KC_S, KC_T, KC_N, KC_R +#define _____________CARPLAX_QGMLWY_L3_____________ KC_Z, KC_X, KC_C, KC_V, KC_J + +#define _____________CARPLAX_QGMLWY_R1_____________ KC_Y, KC_F, KC_U, KC_B, KC_SCLN +#define _____________CARPLAX_QGMLWY_R2_____________ KC_I, KC_A, KC_E, KC_O, LT_MC(KC_H) +#define _____________CARPLAX_QGMLWY_R3_____________ KC_K, KC_P, KC_COMM, KC_DOT, KC_SLSH + + +#define ________________NUMBER_LEFT________________ KC_1, KC_2, KC_3, KC_4, KC_5 +#define ________________NUMBER_RIGHT_______________ KC_6, KC_7, KC_8, KC_9, KC_0 +#define _________________FUNC_LEFT_________________ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5 +#define _________________FUNC_RIGHT________________ KC_F6, KC_F7, KC_F8, KC_F9, KC_F10 + +#define __________________LONG_FUNC_LEFT___________________ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6 +#define __________________LONG_FUNC_RIGHT__________________ KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12 + +#define ___________________BLANK___________________ _______, _______, _______, _______, _______ + + +#define _________________LOWER_L1__________________ KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC +#define _________________LOWER_L2__________________ _________________FUNC_LEFT_________________ +#define _________________LOWER_L3__________________ _________________FUNC_RIGHT________________ + +#define _________________LOWER_R1__________________ KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN +#define _________________LOWER_R2__________________ _______, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR +#define _________________LOWER_R3__________________ _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT + + + +#define _________________RAISE_L1__________________ ________________NUMBER_LEFT________________ +#define _________________RAISE_L2__________________ ___________________BLANK___________________ +#define _________________RAISE_L3__________________ ___________________BLANK___________________ + +#define _________________RAISE_R1__________________ ________________NUMBER_RIGHT_______________ +#define _________________RAISE_R2__________________ _______, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC +#define _________________RAISE_R3__________________ _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END + + + +#define _________________ADJUST_L1_________________ RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, RGB_TOG +#define _________________ADJUST_L2_________________ MU_TOG , CK_TOGG, AU_ON, AU_OFF, AG_NORM +#define _________________ADJUST_L3_________________ RGB_RMOD,RGB_HUD,RGB_SAD, RGB_VAD, KC_RGB_T + +#define _________________ADJUST_R1_________________ KC_SEC1, KC_SEC2, KC_SEC3, KC_SEC4, KC_SEC5 +#define _________________ADJUST_R2_________________ AG_SWAP, QWERTY, COLEMAK, DVORAK, WORKMAN +#define _________________ADJUST_R3_________________ MG_NKRO, KC_MUTE, KC_VOLD, KC_VOLU, KC_MNXT + #endif // !USERSPACE \ No newline at end of file From d8f090e5592fd5b6fde35ae36e36f2473c716312 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Wed, 14 Nov 2018 18:32:28 -0800 Subject: [PATCH 519/788] Docs: Supporting a keyboard in the QMK Configurator (#4396) * Docs: Configurator Support * Minor updates * Updated keyboard.h example to use #pragma once per @drashna https://github.com/qmk/qmk_firmware/pull/4396#discussion_r232140934 * Add link to doc under Reference section Added to _sidebar.md and _summary.md * Changed doc title; minor tweaks Re-titled the doc as "Supporting Your Keyboard in QMK Configurator". Made some minor changes to the keyboard.h examples. * Added tags object to JSON example --- docs/_sidebar.md | 1 + docs/_summary.md | 1 + docs/reference_configurator_support.md | 195 +++++++++++++++++++++++++ 3 files changed, 197 insertions(+) create mode 100644 docs/reference_configurator_support.md diff --git a/docs/_sidebar.md b/docs/_sidebar.md index 67e81422a..1fb5398d9 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -39,6 +39,7 @@ * [Glossary](reference_glossary.md) * [Unit Testing](unit_testing.md) * [Useful Functions](ref_functions.md) + * [Configurator Support](reference_configurator_support.md) * [Features](features.md) * [Basic Keycodes](keycodes_basic.md) diff --git a/docs/_summary.md b/docs/_summary.md index 67e81422a..1fb5398d9 100644 --- a/docs/_summary.md +++ b/docs/_summary.md @@ -39,6 +39,7 @@ * [Glossary](reference_glossary.md) * [Unit Testing](unit_testing.md) * [Useful Functions](ref_functions.md) + * [Configurator Support](reference_configurator_support.md) * [Features](features.md) * [Basic Keycodes](keycodes_basic.md) diff --git a/docs/reference_configurator_support.md b/docs/reference_configurator_support.md new file mode 100644 index 000000000..a20a6c9ad --- /dev/null +++ b/docs/reference_configurator_support.md @@ -0,0 +1,195 @@ +# Supporting Your Keyboard in QMK Configurator + +This page covers how to properly support keyboards in the [QMK Configurator](https://config.qmk.fm/). + + +## How the Configurator Understands Keyboards + +To understand how the Configurator understands keyboards, first one must understand layout macros. For this exercise, we're going to imagine a 17-key numpad PCB, which we're going to call `numpad`. + +``` +┌───┬───┬───┬───┐ +│NLk│ / │ * │ - │ +├───┼───┼───┼───┤ +│7 │8 │9 │ + │ +├───┼───┼───┤ │ +│4 │5 │6 │ │ +├───┼───┼───┼───┤ +│1 │2 │3 │Ent│ +├───┴───┼───┤ │ +│0 │ . │ │ +└───────┴───┴───┘ +``` + +?> For more on layout macros, see [Understanding QMK: Matrix Scanning](understanding_qmk.md?id=matrix-scanning) and [Understanding QMK: Matrix to Physical Layout Map](understanding_qmk.md?id=matrix-to-physical-layout-map). + +The Configurator's API reads the keyboard's `.h` file from `qmk_firmware/keyboards//.h`. For our numpad, this file would be `qmk_firmware/keyboards/numpad/numpad.h`: + +```c +#pragma once + +#define LAYOUT( \ + k00, k01, k02, k03, \ + k10, k11, k12, k13, \ + k20, k21, k22, \ + k30, k31, k32, k33, \ + k40, k42 \ + ) { \ + { k00, k01, k02, k03 }, \ + { k10, k11, k12, k13 }, \ + { k20, k21, k22, KC_NO }, \ + { k30, k31, k32, k33 }, \ + { k40, KC_NO, k42, KC_NO } \ +} +``` + +QMK uses `KC_NO` to designate places in the switch matrix where there is no switch. Sometimes, `XXX`, `___` or `____` are used as shorthand to make this section easier to read if it needs to be debugged. This is usually defined near the beginning of the `.h` file: + +```c +#pragma once + +#define XXX KC_NO + +#define LAYOUT( \ + k00, k01, k02, k03, \ + k10, k11, k12, k13, \ + k20, k21, k22, \ + k30, k31, k32, k33, \ + k40, k42 \ + ) { \ + { k00, k01, k02, k03 }, \ + { k10, k11, k12, k13 }, \ + { k20, k21, k22, XXX }, \ + { k30, k31, k32, k33 }, \ + { k40, XXX, k42, XXX } \ +} +``` + +!> This usage differs from that of keymap macros, which almost always use `XXXXXXX` (seven capital X's) for `KC_NO` and `_______` (seven underscores) for `KC_TRNS`. + +!> To prevent user confusion, using `KC_NO` is preferred. + +The layout macro tells the Configurator that our keyboard has 17 keys, arranged in five rows of four columns each. Our switch positions are named `k`, counting from 0. The names themselves actually don't matter, as long as they match between the top section, which receives the keycodes from the keymap, and the bottom half which designates where each key is in the matrix. + +To display our keyboard in a way that resembles the physical keyboard, we need to build a JSON file that tells the Configurator how to tie the physical locations and sizes of our keys to our switch matrix. + +## Building the JSON file + +To build the JSON file, the easiest way is to build the layout in [Keyboard Layout Editor](http://www.keyboard-layout-editor.com/) ("KLE"), from which we'll feed the Raw Data into a QMK tool that converts this data into a JSON the Configurator will read and use. Since KLE opens by default with a numpad layout, we're just going to remove the Getting Started instructions, and use what's left. + +Once the layout is as desired, move to the Raw Data tab in KLE, and copy the contents: + +``` +["Num Lock","/","*","-"], +["7\nHome","8\n↑","9\nPgUp",{h:2},"+"], +["4\n←","5","6\n→"], +["1\nEnd","2\n↓","3\nPgDn",{h:2},"Enter"], +[{w:2},"0\nIns",".\nDel"] +``` + +To convert this data into our JSON, go to the [QMK KLE-JSON Converter](https://qmk.fm/converter/), paste the Raw Data into the Input field, and click the Convert button. After a moment, our JSON data will appear in the Output field. Copy the contents to a new text document, and name the document `info.json`, saving it in the same folder that contains `numpad.h`. + +Use the `keyboard_name` object to set the name of the keyboard. The `bootloader` object is deprecated, so it can be deleted. For instruction purposes, we will put each key's object on its own line. This is only to make the file more human-readable, and does not affect the Configurator's functionality. + +```json +{ + "keyboard_name": "Numpad", + "url": "", + "maintainer": "qmk", + "tags": { + "form_factor": "numpad" + }, + "width": 4, + "height": 5, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"Num Lock", "x":0, "y":0}, + {"label":"/", "x":1, "y":0}, + {"label":"*", "x":2, "y":0}, + {"label":"-", "x":3, "y":0}, + {"label":"7", "x":0, "y":1}, + {"label":"8", "x":1, "y":1}, + {"label":"9", "x":2, "y":1}, + {"label":"+", "x":3, "y":1, "h":2}, + {"label":"4", "x":0, "y":2}, + {"label":"5", "x":1, "y":2}, + {"label":"6", "x":2, "y":2}, + {"label":"1", "x":0, "y":3}, + {"label":"2", "x":1, "y":3}, + {"label":"3", "x":2, "y":3}, + {"label":"Enter", "x":3, "y":3, "h":2}, + {"label":"0", "x":0, "y":4, "w":2}, + {"label":".", "x":2, "y":4} + ] + } + } +} +``` + +The `layouts` object contains the data that represents the physical layout of the keyboard. It has an object `LAYOUT`, which needs to match the name of our layout macro from `numpad.h`. The `LAYOUT` object itself has an object named `layout`, which contains one JSON object for each physical key on our keyboard, formatted as follows: + +``` + ┌ The name of the key. Not displayed in the Configurator. + │ ┌ The key's X-axis location, in key units from the + │ │ keyboard's left edge. + │ │ ┌ The key's Y-axis location, in key units from + │ │ │ the keyboard's top (rear-facing) edge. + ↓ ↓ ↓ +{"label":"Num Lock", "x":0, "y":0}, +``` + +Some objects will also have `"w"` and `"h"` keys, which represent a key's width and height, respectively. + +?> For more on the `info.json` files, see [QMK Keyboard Guidelines: Keyboard Metadata](hardware_keyboard_guidelines.md?id=keyboard-metadata) + + +## How the Configurator Programs Keys + +The Configurator's API uses the layout macro and the JSON file we've given it to create a visual representation of the keyboard that has each visual object tied to a specific key, in sequence: + +key in layout macro | JSON object used +:---: | :---- +k00 | {"label":"Num Lock", "x":0, "y":0} +k01 | {"label":"/", "x":1, "y":0} +k02 | {"label":"*", "x":2, "y":0} +k03 | {"label":"-", "x":3, "y":0} +k10 | {"label":"7", "x":0, "y":1} +k11 | {"label":"8", "x":1, "y":1} +k12 | {"label":"9", "x":2, "y":1} +k13 | {"label":"+", "x":3, "y":1, "h":2} +k20 | {"label":"4", "x":0, "y":2} +k21 | {"label":"5", "x":1, "y":2} +k22 | {"label":"6", "x":2, "y":2} +k30 | {"label":"1", "x":0, "y":3} +k31 | {"label":"2", "x":1, "y":3} +k32 | {"label":"3", "x":2, "y":3} +k33 | {"label":"Enter", "x":3, "y":3, "h":2} +k40 | {"label":"0", "x":0, "y":4, "w":2} +k42 | {"label":".", "x":2, "y":4} + +When a user selects the top-left key in the Configurator, and assigns Num Lock to it, the Configurator builds a keymap file with `KC_NLCK` as the first key, and so on as the keymap is built. The `label` keys are not used; they are only for the user's reference in identifying specific keys when debugging the `info.json` file. + + +## Issues and Hazards + +Currently, the Configurator does not support key rotation or non-rectangular key shapes like ISO Enter. Additionally, keys that are vertically-offset from their "row" — the arrow keys on 1800-layouts like the [TKC1800](https://github.com/qmk/qmk_firmware/tree/4ac48a61a66206beaf2fdd5f2939d8bbedd0004c/keyboards/tkc1800/) being a prominent example — confuse the KLE-to-JSON Converter, if not adjusted for by the contributor of the `info.json` file. + +### Workarounds + +#### Non-rectangular keys + +For ISO Enter keys, QMK custom is to display it as a rectangular key, 1.25u wide and 2u high, aligned so its right edge is aligned with the right edge of the alphanumeric key block. + +![](https://i.imgur.com/JKngtTw.png) +*A 60% keyboard in standard ISO layout, as rendered by QMK Configurator.* + +#### Vertically-offset keys + +For vertically-offset keys, place them in KLE as if they were not offset, then edit the Y-values as needed in the converted JSON file + +![](https://i.imgur.com/fmDvDzR.png) +*An 1800-layout keyboard as rendered in Keyboard Layout Editor, without the vertical offset applied to the arrow keys.* + +![](https://i.imgur.com/8beYMBR.png) +*A Unix diff file, showing the changes needed to vertically-offset the arrow keys in our keyboard's JSON file.* From daf08f40f2aeb815322d65d14a90ae56ea22953c Mon Sep 17 00:00:00 2001 From: Pekaso Date: Thu, 15 Nov 2018 11:36:53 +0900 Subject: [PATCH 520/788] serial.c update (#4423) --- keyboards/fortitude60/serial.c | 290 +++++++++++++++++++------- keyboards/fortitude60/serial.h | 59 +++--- keyboards/fortitude60/serial_config.h | 8 +- 3 files changed, 254 insertions(+), 103 deletions(-) diff --git a/keyboards/fortitude60/serial.c b/keyboards/fortitude60/serial.c index cea1a5f6c..6006ebf1b 100644 --- a/keyboards/fortitude60/serial.c +++ b/keyboards/fortitude60/serial.c @@ -1,5 +1,10 @@ /* * WARNING: be careful changing this code, it is very timing dependent + * + * 2018-10-28 checked + * avr-gcc 4.9.2 + * avr-gcc 5.4.0 + * avr-gcc 7.3.0 */ #ifndef F_CPU @@ -14,10 +19,60 @@ #include "serial.h" //#include -#ifdef USE_SERIAL +#ifdef SOFT_SERIAL_PIN -#ifndef SERIAL_USE_MULTI_TRANSACTION -/* --- USE Simple API (OLD API, compatible with let's split serial.c) */ +#ifdef __AVR_ATmega32U4__ + // if using ATmega32U4 I2C, can not use PD0 and PD1 in soft serial. + #ifdef USE_I2C + #if SOFT_SERIAL_PIN == D0 || SOFT_SERIAL_PIN == D1 + #error Using ATmega32U4 I2C, so can not use PD0, PD1 + #endif + #endif + + #if SOFT_SERIAL_PIN >= D0 && SOFT_SERIAL_PIN <= D3 + #define SERIAL_PIN_DDR DDRD + #define SERIAL_PIN_PORT PORTD + #define SERIAL_PIN_INPUT PIND + #if SOFT_SERIAL_PIN == D0 + #define SERIAL_PIN_MASK _BV(PD0) + #define EIMSK_BIT _BV(INT0) + #define EICRx_BIT (~(_BV(ISC00) | _BV(ISC01))) + #define SERIAL_PIN_INTERRUPT INT0_vect + #elif SOFT_SERIAL_PIN == D1 + #define SERIAL_PIN_MASK _BV(PD1) + #define EIMSK_BIT _BV(INT1) + #define EICRx_BIT (~(_BV(ISC10) | _BV(ISC11))) + #define SERIAL_PIN_INTERRUPT INT1_vect + #elif SOFT_SERIAL_PIN == D2 + #define SERIAL_PIN_MASK _BV(PD2) + #define EIMSK_BIT _BV(INT2) + #define EICRx_BIT (~(_BV(ISC20) | _BV(ISC21))) + #define SERIAL_PIN_INTERRUPT INT2_vect + #elif SOFT_SERIAL_PIN == D3 + #define SERIAL_PIN_MASK _BV(PD3) + #define EIMSK_BIT _BV(INT3) + #define EICRx_BIT (~(_BV(ISC30) | _BV(ISC31))) + #define SERIAL_PIN_INTERRUPT INT3_vect + #endif + #elif SOFT_SERIAL_PIN == E6 + #define SERIAL_PIN_DDR DDRE + #define SERIAL_PIN_PORT PORTE + #define SERIAL_PIN_INPUT PINE + #define SERIAL_PIN_MASK _BV(PE6) + #define EIMSK_BIT _BV(INT6) + #define EICRx_BIT (~(_BV(ISC60) | _BV(ISC61))) + #define SERIAL_PIN_INTERRUPT INT6_vect + #else + #error invalid SOFT_SERIAL_PIN value + #endif + +#else + #error serial.c now support ATmega32U4 only +#endif + +//////////////// for backward compatibility //////////////////////////////// +#if !defined(SERIAL_USE_SINGLE_TRANSACTION) && !defined(SERIAL_USE_MULTI_TRANSACTION) +/* --- USE OLD API (compatible with let's split serial.c) */ #if SERIAL_SLAVE_BUFFER_LENGTH > 0 uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; #endif @@ -42,56 +97,118 @@ SSTD_t transactions[] = { }; void serial_master_init(void) -{ soft_serial_initiator_init(transactions); } +{ soft_serial_initiator_init(transactions, TID_LIMIT(transactions)); } void serial_slave_init(void) -{ soft_serial_target_init(transactions); } +{ soft_serial_target_init(transactions, TID_LIMIT(transactions)); } // 0 => no error // 1 => slave did not respond // 2 => checksum error int serial_update_buffers() -{ return soft_serial_transaction(); } +{ + int result; + result = soft_serial_transaction(); + return result; +} -#endif // Simple API (OLD API, compatible with let's split serial.c) +#endif // end of OLD API (compatible with let's split serial.c) +//////////////////////////////////////////////////////////////////////////// #define ALWAYS_INLINE __attribute__((always_inline)) #define NO_INLINE __attribute__((noinline)) #define _delay_sub_us(x) __builtin_avr_delay_cycles(x) -// Serial pulse period in microseconds. -#define TID_SEND_ADJUST 14 +// parity check +#define ODD_PARITY 1 +#define EVEN_PARITY 0 +#define PARITY EVEN_PARITY -#define SELECT_SERIAL_SPEED 1 -#if SELECT_SERIAL_SPEED == 0 +#ifdef SERIAL_DELAY + // custom setup in config.h + // #define TID_SEND_ADJUST 2 + // #define SERIAL_DELAY 6 // micro sec + // #define READ_WRITE_START_ADJUST 30 // cycles + // #define READ_WRITE_WIDTH_ADJUST 8 // cycles +#else +// ============ Standard setups ============ + +#ifndef SELECT_SOFT_SERIAL_SPEED +#define SELECT_SOFT_SERIAL_SPEED 1 +// 0: about 189kbps +// 1: about 137kbps (default) +// 2: about 75kbps +// 3: about 39kbps +// 4: about 26kbps +// 5: about 20kbps +#endif + +#if __GNUC__ < 6 + #define TID_SEND_ADJUST 14 +#else + #define TID_SEND_ADJUST 2 +#endif + +#if SELECT_SOFT_SERIAL_SPEED == 0 // Very High speed #define SERIAL_DELAY 4 // micro sec - #define READ_WRITE_START_ADJUST 33 // cycles - #define READ_WRITE_WIDTH_ADJUST 3 // cycles -#elif SELECT_SERIAL_SPEED == 1 + #if __GNUC__ < 6 + #define READ_WRITE_START_ADJUST 33 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_START_ADJUST 34 // cycles + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif +#elif SELECT_SOFT_SERIAL_SPEED == 1 // High speed #define SERIAL_DELAY 6 // micro sec - #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 3 // cycles -#elif SELECT_SERIAL_SPEED == 2 + #if __GNUC__ < 6 + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_START_ADJUST 33 // cycles + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif +#elif SELECT_SOFT_SERIAL_SPEED == 2 // Middle speed #define SERIAL_DELAY 12 // micro sec #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 3 // cycles -#elif SELECT_SERIAL_SPEED == 3 + #if __GNUC__ < 6 + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif +#elif SELECT_SOFT_SERIAL_SPEED == 3 // Low speed #define SERIAL_DELAY 24 // micro sec #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 3 // cycles -#elif SELECT_SERIAL_SPEED == 4 + #if __GNUC__ < 6 + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif +#elif SELECT_SOFT_SERIAL_SPEED == 4 // Very Low speed - #define SERIAL_DELAY 50 // micro sec + #define SERIAL_DELAY 36 // micro sec #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #if __GNUC__ < 6 + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif +#elif SELECT_SOFT_SERIAL_SPEED == 5 + // Ultra Low speed + #define SERIAL_DELAY 48 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #if __GNUC__ < 6 + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif #else -#error Illegal Serial Speed -#endif - +#error invalid SELECT_SOFT_SERIAL_SPEED value +#endif /* SELECT_SOFT_SERIAL_SPEED */ +#endif /* SERIAL_DELAY */ #define SERIAL_DELAY_HALF1 (SERIAL_DELAY/2) #define SERIAL_DELAY_HALF2 (SERIAL_DELAY - SERIAL_DELAY/2) @@ -105,17 +222,21 @@ int serial_update_buffers() #endif static SSTD_t *Transaction_table = NULL; +static uint8_t Transaction_table_size = 0; +inline static void serial_delay(void) ALWAYS_INLINE; inline static void serial_delay(void) { _delay_us(SERIAL_DELAY); } +inline static void serial_delay_half1(void) ALWAYS_INLINE; inline static void serial_delay_half1(void) { _delay_us(SERIAL_DELAY_HALF1); } +inline static void serial_delay_half2(void) ALWAYS_INLINE; inline static void serial_delay_half2(void) { _delay_us(SERIAL_DELAY_HALF2); @@ -135,6 +256,7 @@ void serial_input_with_pullup(void) { SERIAL_PIN_PORT |= SERIAL_PIN_MASK; } +inline static uint8_t serial_read_pin(void) ALWAYS_INLINE; inline static uint8_t serial_read_pin(void) { return !!(SERIAL_PIN_INPUT & SERIAL_PIN_MASK); @@ -152,30 +274,28 @@ void serial_high(void) { SERIAL_PIN_PORT |= SERIAL_PIN_MASK; } -void soft_serial_initiator_init(SSTD_t *sstd_table) +void soft_serial_initiator_init(SSTD_t *sstd_table, int sstd_table_size) { Transaction_table = sstd_table; + Transaction_table_size = (uint8_t)sstd_table_size; serial_output(); serial_high(); } -void soft_serial_target_init(SSTD_t *sstd_table) +void soft_serial_target_init(SSTD_t *sstd_table, int sstd_table_size) { Transaction_table = sstd_table; + Transaction_table_size = (uint8_t)sstd_table_size; serial_input_with_pullup(); -#if SERIAL_PIN_MASK == _BV(PD0) - // Enable INT0 - EIMSK |= _BV(INT0); - // Trigger on falling edge of INT0 - EICRA &= ~(_BV(ISC00) | _BV(ISC01)); -#elif SERIAL_PIN_MASK == _BV(PD2) - // Enable INT2 - EIMSK |= _BV(INT2); - // Trigger on falling edge of INT2 - EICRA &= ~(_BV(ISC20) | _BV(ISC21)); + // Enable INT0-INT3,INT6 + EIMSK |= EIMSK_BIT; +#if SERIAL_PIN_MASK == _BV(PE6) + // Trigger on falling edge of INT6 + EICRB &= EICRx_BIT; #else - #error unknown SERIAL_PIN_MASK value + // Trigger on falling edge of INT0-INT3 + EICRA &= EICRx_BIT; #endif } @@ -191,7 +311,7 @@ void sync_recv(void) { } // Used by the reciver to send a synchronization signal to the sender. -static void sync_send(void)NO_INLINE; +static void sync_send(void) NO_INLINE; static void sync_send(void) { serial_low(); @@ -205,12 +325,12 @@ static uint8_t serial_read_chunk(uint8_t *pterrcount, uint8_t bit) { uint8_t byte, i, p, pb; _delay_sub_us(READ_WRITE_START_ADJUST); - for( i = 0, byte = 0, p = 0; i < bit; i++ ) { + for( i = 0, byte = 0, p = PARITY; i < bit; i++ ) { serial_delay_half1(); // read the middle of pulses if( serial_read_pin() ) { - byte = (byte << 1) | 1; p ^= 1; + byte = (byte << 1) | 1; p ^= 1; } else { - byte = (byte << 1) | 0; p ^= 0; + byte = (byte << 1) | 0; p ^= 0; } _delay_sub_us(READ_WRITE_WIDTH_ADJUST); serial_delay_half2(); @@ -230,13 +350,13 @@ static uint8_t serial_read_chunk(uint8_t *pterrcount, uint8_t bit) { void serial_write_chunk(uint8_t data, uint8_t bit) NO_INLINE; void serial_write_chunk(uint8_t data, uint8_t bit) { uint8_t b, p; - for( p = 0, b = 1<<(bit-1); b ; b >>= 1) { - if(data & b) { - serial_high(); p ^= 1; - } else { - serial_low(); p ^= 0; - } - serial_delay(); + for( p = PARITY, b = 1<<(bit-1); b ; b >>= 1) { + if(data & b) { + serial_high(); p ^= 1; + } else { + serial_low(); p ^= 0; + } + serial_delay(); } /* send parity bit */ if(p & 1) { serial_high(); } @@ -288,6 +408,13 @@ void change_reciver2sender(void) { serial_delay_half1(); //4 } +static inline uint8_t nibble_bits_count(uint8_t bits) +{ + bits = (bits & 0x5) + (bits >> 1 & 0x5); + bits = (bits & 0x3) + (bits >> 2 & 0x3); + return bits; +} + // interrupt handle to be used by the target device ISR(SERIAL_PIN_INTERRUPT) { @@ -297,12 +424,15 @@ ISR(SERIAL_PIN_INTERRUPT) { SSTD_t *trans = Transaction_table; #else // recive transaction table index - uint8_t tid; + uint8_t tid, bits; uint8_t pecount = 0; sync_recv(); - tid = serial_read_chunk(&pecount,4); - if(pecount> 0) + bits = serial_read_chunk(&pecount,7); + tid = bits>>3; + bits = (bits&7) != nibble_bits_count(tid); + if( bits || pecount> 0 || tid > Transaction_table_size ) { return; + } serial_delay_half1(); serial_high(); // response step1 low->high @@ -315,17 +445,17 @@ ISR(SERIAL_PIN_INTERRUPT) { // target send phase if( trans->target2initiator_buffer_size > 0 ) serial_send_packet((uint8_t *)trans->target2initiator_buffer, - trans->target2initiator_buffer_size); + trans->target2initiator_buffer_size); // target switch to input change_sender2reciver(); // target recive phase if( trans->initiator2target_buffer_size > 0 ) { if (serial_recive_packet((uint8_t *)trans->initiator2target_buffer, - trans->initiator2target_buffer_size) ) { - *trans->status = TRANSACTION_ACCEPTED; + trans->initiator2target_buffer_size) ) { + *trans->status = TRANSACTION_ACCEPTED; } else { - *trans->status = TRANSACTION_DATA_ERROR; + *trans->status = TRANSACTION_DATA_ERROR; } } else { *trans->status = TRANSACTION_ACCEPTED; @@ -349,6 +479,8 @@ int soft_serial_transaction(void) { SSTD_t *trans = Transaction_table; #else int soft_serial_transaction(int sstd_index) { + if( sstd_index > Transaction_table_size ) + return TRANSACTION_TYPE_ERROR; SSTD_t *trans = &Transaction_table[sstd_index]; #endif cli(); @@ -375,9 +507,10 @@ int soft_serial_transaction(int sstd_index) { #else // send transaction table index + int tid = (sstd_index<<3) | (7 & nibble_bits_count(sstd_index)); sync_send(); _delay_sub_us(TID_SEND_ADJUST); - serial_write_chunk(sstd_index, 4); + serial_write_chunk(tid, 7); serial_delay_half1(); // wait for the target response (step1 low->high) @@ -389,12 +522,12 @@ int soft_serial_transaction(int sstd_index) { // check if the target is present (step2 high->low) for( int i = 0; serial_read_pin(); i++ ) { if (i > SLAVE_INT_ACK_WIDTH + 1) { - // slave failed to pull the line low, assume not present - serial_output(); - serial_high(); - *trans->status = TRANSACTION_NO_RESPONSE; - sei(); - return TRANSACTION_NO_RESPONSE; + // slave failed to pull the line low, assume not present + serial_output(); + serial_high(); + *trans->status = TRANSACTION_NO_RESPONSE; + sei(); + return TRANSACTION_NO_RESPONSE; } _delay_sub_us(SLAVE_INT_ACK_WIDTH_UNIT); } @@ -404,12 +537,12 @@ int soft_serial_transaction(int sstd_index) { // if the target is present syncronize with it if( trans->target2initiator_buffer_size > 0 ) { if (!serial_recive_packet((uint8_t *)trans->target2initiator_buffer, - trans->target2initiator_buffer_size) ) { - serial_output(); - serial_high(); - *trans->status = TRANSACTION_DATA_ERROR; - sei(); - return TRANSACTION_DATA_ERROR; + trans->target2initiator_buffer_size) ) { + serial_output(); + serial_high(); + *trans->status = TRANSACTION_DATA_ERROR; + sei(); + return TRANSACTION_DATA_ERROR; } } @@ -419,7 +552,7 @@ int soft_serial_transaction(int sstd_index) { // initiator send phase if( trans->initiator2target_buffer_size > 0 ) { serial_send_packet((uint8_t *)trans->initiator2target_buffer, - trans->initiator2target_buffer_size); + trans->initiator2target_buffer_size); } // always, release the line when not in use @@ -441,4 +574,17 @@ int soft_serial_get_and_clean_status(int sstd_index) { } #endif -#endif \ No newline at end of file +#endif + +// Helix serial.c history +// 2018-1-29 fork from let's split and add PD2, modify sync_recv() (#2308, bceffdefc) +// 2018-6-28 bug fix master to slave comm and speed up (#3255, 1038bbef4) +// (adjusted with avr-gcc 4.9.2) +// 2018-7-13 remove USE_SERIAL_PD2 macro (#3374, f30d6dd78) +// (adjusted with avr-gcc 4.9.2) +// 2018-8-11 add support multi-type transaction (#3608, feb5e4aae) +// (adjusted with avr-gcc 4.9.2) +// 2018-10-21 fix serial and RGB animation conflict (#4191, 4665e4fff) +// (adjusted with avr-gcc 7.3.0) +// 2018-10-28 re-adjust compiler depend value of delay (#4269, 8517f8a66) +// (adjusted with avr-gcc 5.4.0, 7.3.0) diff --git a/keyboards/fortitude60/serial.h b/keyboards/fortitude60/serial.h index d00898055..2e53928df 100644 --- a/keyboards/fortitude60/serial.h +++ b/keyboards/fortitude60/serial.h @@ -4,40 +4,47 @@ #include // ///////////////////////////////////////////////////////////////// -// Need Soft Serial defines in serial_config.h +// Need Soft Serial defines in config.h // ///////////////////////////////////////////////////////////////// // ex. -// #define SERIAL_PIN_DDR DDRD -// #define SERIAL_PIN_PORT PORTD -// #define SERIAL_PIN_INPUT PIND -// #define SERIAL_PIN_MASK _BV(PD?) ?=0,2 -// #define SERIAL_PIN_INTERRUPT INT?_vect ?=0,2 +// #define SOFT_SERIAL_PIN ?? // ?? = D0,D1,D2,D3,E6 +// OPTIONAL: #define SELECT_SOFT_SERIAL_SPEED ? // ? = 1,2,3,4,5 +// // 1: about 137kbps (default) +// // 2: about 75kbps +// // 3: about 39kbps +// // 4: about 26kbps +// // 5: about 20kbps // -// //// USE Simple API (OLD API, compatible with let's split serial.c) +// //// USE OLD API (compatible with let's split serial.c) // ex. // #define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 // #define SERIAL_MASTER_BUFFER_LENGTH 1 // -// //// USE flexible API (using multi-type transaction function) -// #define SERIAL_USE_MULTI_TRANSACTION +// //// USE NEW API +// //// USE simple API (using signle-type transaction function) +// #define SERIAL_USE_SINGLE_TRANSACTION +// //// USE flexible API (using multi-type transaction function) +// #define SERIAL_USE_MULTI_TRANSACTION // // ///////////////////////////////////////////////////////////////// -#ifndef SERIAL_USE_MULTI_TRANSACTION -/* --- USE Simple API (OLD API, compatible with let's split serial.c) */ -#if SERIAL_SLAVE_BUFFER_LENGTH > 0 -extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH]; -#endif -#if SERIAL_MASTER_BUFFER_LENGTH > 0 -extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH]; -#endif +//////////////// for backward compatibility //////////////////////////////// +#if !defined(SERIAL_USE_SINGLE_TRANSACTION) && !defined(SERIAL_USE_MULTI_TRANSACTION) +/* --- USE OLD API (compatible with let's split serial.c) */ + #if SERIAL_SLAVE_BUFFER_LENGTH > 0 + extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH]; + #endif + #if SERIAL_MASTER_BUFFER_LENGTH > 0 + extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH]; + #endif -void serial_master_init(void); -void serial_slave_init(void); -int serial_update_buffers(void); + void serial_master_init(void); + void serial_slave_init(void); + int serial_update_buffers(void); -#endif // USE Simple API +#endif // end of USE OLD API +//////////////////////////////////////////////////////////////////////////// // Soft Serial Transaction Descriptor typedef struct _SSTD_t { @@ -47,16 +54,18 @@ typedef struct _SSTD_t { uint8_t target2initiator_buffer_size; uint8_t *target2initiator_buffer; } SSTD_t; +#define TID_LIMIT( table ) (sizeof(table) / sizeof(SSTD_t)) // initiator is transaction start side -void soft_serial_initiator_init(SSTD_t *sstd_table); +void soft_serial_initiator_init(SSTD_t *sstd_table, int sstd_table_size); // target is interrupt accept side -void soft_serial_target_init(SSTD_t *sstd_table); +void soft_serial_target_init(SSTD_t *sstd_table, int sstd_table_size); // initiator resullt #define TRANSACTION_END 0 #define TRANSACTION_NO_RESPONSE 0x1 #define TRANSACTION_DATA_ERROR 0x2 +#define TRANSACTION_TYPE_ERROR 0x4 #ifndef SERIAL_USE_MULTI_TRANSACTION int soft_serial_transaction(void); #else @@ -72,9 +81,9 @@ int soft_serial_transaction(int sstd_index); // target: // TRANSACTION_DATA_ERROR // or TRANSACTION_ACCEPTED -#define TRANSACTION_ACCEPTED 0x4 +#define TRANSACTION_ACCEPTED 0x8 #ifdef SERIAL_USE_MULTI_TRANSACTION int soft_serial_get_and_clean_status(int sstd_index); #endif -#endif /* SOFT_SERIAL_H */ \ No newline at end of file +#endif /* SOFT_SERIAL_H */ diff --git a/keyboards/fortitude60/serial_config.h b/keyboards/fortitude60/serial_config.h index 96a54afbd..d4a42bce3 100644 --- a/keyboards/fortitude60/serial_config.h +++ b/keyboards/fortitude60/serial_config.h @@ -2,13 +2,9 @@ #define SOFT_SERIAL_CONFIG_H /* Soft Serial defines */ -#define SERIAL_PIN_DDR DDRD -#define SERIAL_PIN_PORT PORTD -#define SERIAL_PIN_INPUT PIND -#define SERIAL_PIN_MASK _BV(PD2) -#define SERIAL_PIN_INTERRUPT INT2_vect +#define SOFT_SERIAL_PIN D2 #define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 #define SERIAL_MASTER_BUFFER_LENGTH 1 -#endif /* SOFT_SERIAL_CONFIG_H */ \ No newline at end of file +#endif /* SOFT_SERIAL_CONFIG_H */ From 46cf8cc9b33a3c8bdbb0ce7df7f48f28e4d979a5 Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Wed, 14 Nov 2018 18:37:53 -0800 Subject: [PATCH 521/788] Configurator support for Octagon V2 75_ansi (#4426) --- keyboards/duck/octagon/v2/info.json | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/keyboards/duck/octagon/v2/info.json b/keyboards/duck/octagon/v2/info.json index 7bc0c6ef9..11bde45a5 100644 --- a/keyboards/duck/octagon/v2/info.json +++ b/keyboards/duck/octagon/v2/info.json @@ -1,12 +1,16 @@ { - "keyboard_name": "Octagon V2", - "url": "", - "maintainer": "qmk", - "width": 16, - "height": 6, + "keyboard_name": "Octagon V2", + "url": "", + "maintainer": "qmk", + "width": 16, + "height": 6, "layouts": { "LAYOUT": { "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"F1", "x":1, "y":0}, {"label":"F2", "x":2, "y":0}, {"label":"F3", "x":3, "y":0}, {"label":"F4", "x":4, "y":0}, {"label":"F5", "x":5, "y":0}, {"label":"F6", "x":6, "y":0}, {"label":"F7", "x":7, "y":0}, {"label":"F8", "x":8, "y":0}, {"label":"F9", "x":9, "y":0}, {"label":"F10", "x":10, "y":0}, {"label":"F11", "x":11, "y":0}, {"label":"F12", "x":12, "y":0}, {"label":"PrtSc", "x":13, "y":0}, {"label":"Pause", "x":14, "y":0}, {"label":"Delete", "x":15, "y":0}, {"label":"~", "x":0, "y":1}, {"label":"!", "x":1, "y":1}, {"label":"@", "x":2, "y":1}, {"label":"#", "x":3, "y":1}, {"label":"$", "x":4, "y":1}, {"label":"%", "x":5, "y":1}, {"label":"^", "x":6, "y":1}, {"label":"&", "x":7, "y":1}, {"label":"*", "x":8, "y":1}, {"label":"(", "x":9, "y":1}, {"label":")", "x":10, "y":1}, {"label":"_", "x":11, "y":1}, {"label":"+", "x":12, "y":1}, {"label":"Backspace", "x":13, "y":1, "w":2}, {"label":"Home", "x":15, "y":1}, {"label":"Tab", "x":0, "y":2, "w":1.5}, {"label":"Q", "x":1.5, "y":2}, {"label":"W", "x":2.5, "y":2}, {"label":"E", "x":3.5, "y":2}, {"label":"R", "x":4.5, "y":2}, {"label":"T", "x":5.5, "y":2}, {"label":"Y", "x":6.5, "y":2}, {"label":"U", "x":7.5, "y":2}, {"label":"I", "x":8.5, "y":2}, {"label":"O", "x":9.5, "y":2}, {"label":"P", "x":10.5, "y":2}, {"label":"{", "x":11.5, "y":2}, {"label":"}", "x":12.5, "y":2}, {"label":"|", "x":13.5, "y":2, "w":1.5}, {"label":"Page Up", "x":15, "y":2}, {"label":"Caps Lock", "x":0, "y":3, "w":1.75}, {"label":"A", "x":1.75, "y":3}, {"label":"S", "x":2.75, "y":3}, {"label":"D", "x":3.75, "y":3}, {"label":"F", "x":4.75, "y":3}, {"label":"G", "x":5.75, "y":3}, {"label":"H", "x":6.75, "y":3}, {"label":"J", "x":7.75, "y":3}, {"label":"K", "x":8.75, "y":3}, {"label":"L", "x":9.75, "y":3}, {"label":":", "x":10.75, "y":3}, {"label":"\"", "x":11.75, "y":3}, {"x":12.75, "y":3}, {"label":"Enter", "x":13.75, "y":3, "w":1.25}, {"label":"Page Down", "x":15, "y":3}, {"label":"Shift", "x":0, "y":4, "w":1.25}, {"x":1.25, "y":4}, {"label":"Z", "x":2.25, "y":4}, {"label":"X", "x":3.25, "y":4}, {"label":"C", "x":4.25, "y":4}, {"label":"V", "x":5.25, "y":4}, {"label":"B", "x":6.25, "y":4}, {"label":"N", "x":7.25, "y":4}, {"label":"M", "x":8.25, "y":4}, {"label":"<", "x":9.25, "y":4}, {"label":">", "x":10.25, "y":4}, {"label":"?", "x":11.25, "y":4}, {"label":"Shift", "x":12.25, "y":4, "w":1.75}, {"label":"\u2191", "x":14, "y":4}, {"label":"End", "x":15, "y":4}, {"label":"Ctrl", "x":0, "y":5, "w":1.25}, {"label":"Win", "x":1.25, "y":5, "w":1.25}, {"label":"Alt", "x":2.5, "y":5, "w":1.25}, {"x":3.75, "y":5, "w":6.25}, {"label":"Alt", "x":10, "y":5}, {"label":"Fn", "x":11, "y":5}, {"label":"Ctrl", "x":12, "y":5}, {"label":"\u2190", "x":13, "y":5}, {"label":"\u2193", "x":14, "y":5}, {"label":"\u2192", "x":15, "y":5}] + }, + + "LAYOUT_75_ansi": { + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":15, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":6, "y":1}, {"x":7, "y":1}, {"x":8, "y":1}, {"x":9, "y":1}, {"x":10, "y":1}, {"x":11, "y":1}, {"x":12, "y":1}, {"x":13, "y":1, "w":2}, {"x":15, "y":1}, {"x":0, "y":2, "w":1.5}, {"x":1.5, "y":2}, {"x":2.5, "y":2}, {"x":3.5, "y":2}, {"x":4.5, "y":2}, {"x":5.5, "y":2}, {"x":6.5, "y":2}, {"x":7.5, "y":2}, {"x":8.5, "y":2}, {"x":9.5, "y":2}, {"x":10.5, "y":2}, {"x":11.5, "y":2}, {"x":12.5, "y":2}, {"x":13.5, "y":2, "w":1.5}, {"x":15, "y":2}, {"x":0, "y":3, "w":1.75}, {"x":1.75, "y":3}, {"x":2.75, "y":3}, {"x":3.75, "y":3}, {"x":4.75, "y":3}, {"x":5.75, "y":3}, {"x":6.75, "y":3}, {"x":7.75, "y":3}, {"x":8.75, "y":3}, {"x":9.75, "y":3}, {"x":10.75, "y":3}, {"x":11.75, "y":3}, {"x":12.75, "y":3, "w":2.25}, {"x":15, "y":3}, {"x":0, "y":4, "w":2.25}, {"x":2.25, "y":4}, {"x":3.25, "y":4}, {"x":4.25, "y":4}, {"x":5.25, "y":4}, {"x":6.25, "y":4}, {"x":7.25, "y":4}, {"x":8.25, "y":4}, {"x":9.25, "y":4}, {"x":10.25, "y":4}, {"x":11.25, "y":4}, {"x":12.25, "y":4, "w":1.75}, {"x":14, "y":4}, {"x":15, "y":4}, {"x":0, "y":5, "w":1.25}, {"x":1.25, "y":5, "w":1.25}, {"x":2.5, "y":5, "w":1.25}, {"x":3.75, "y":5, "w":6.25}, {"x":10, "y":5}, {"x":11, "y":5}, {"x":12, "y":5}, {"x":13, "y":5}, {"x":14, "y":5}, {"x":15, "y":5}] } } } From 39bd760faf2666e91d6dc5b199f02fa3206c6acd Mon Sep 17 00:00:00 2001 From: James Laird-Wah Date: Fri, 16 Nov 2018 17:22:05 +1100 Subject: [PATCH 522/788] Use a single endpoint for HID reports (#3951) * Unify multiple HID interfaces into one This reduces the number of USB endpoints required, which frees them up for other things. NKRO and EXTRAKEY always use the shared endpoint. By default, MOUSEKEY also uses it. This means it won't work as a Boot Procotol mouse in some BIOSes, etc. If you really think your keyboard needs to work as a mouse in your BIOS, set MOUSE_SHARED_EP = no in your rules.mk. By default, the core keyboard does not use the shared endpoint, as not all BIOSes are standards compliant and that's one place you don't want to find out your keyboard doesn't work.. If you are really confident, you can set KEYBOARD_SHARED_EP = yes to use the shared endpoint here too. * unify endpoints: ChibiOS protocol implementation * fixup: missing #ifdef EXTRAKEY_ENABLEs broke build on AVR with EXTRAKEY disabled * endpoints: restore error when too many endpoints required * lufa: wait up to 10ms to send keyboard input This avoids packets being dropped when two reports are sent in quick succession (eg. releasing a dual role key). * endpoints: fix compile on ARM_ATSAM * endpoint: ARM_ATSAM fixes No longer use wrong or unexpected endpoint IDs * endpoints: accommodate VUSB protocol V-USB has its own, understandably simple ideas about the report formats. It already blasts the mouse and extrakeys through one endpoint with report IDs. We just stay out of its way. * endpoints: document new endpoint configuration options * endpoints: respect keyboard_report->mods in NKRO The caller(s) of host_keyboard_send expect to be able to just drop modifiers in the mods field and not worry about whether NKRO is in use. This is a good thing. So we just shift it over if needs be. * endpoints: report.c: update for new keyboard_report format --- docs/config_options.md | 29 +++ tmk_core/common.mk | 21 ++ tmk_core/common/host.c | 22 ++ tmk_core/common/report.c | 21 +- tmk_core/common/report.h | 46 ++-- tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c | 5 +- tmk_core/protocol/chibios/usb_main.c | 180 +++++++-------- tmk_core/protocol/chibios/usb_main.h | 11 +- tmk_core/protocol/lufa/lufa.c | 92 ++++---- tmk_core/protocol/usb_descriptor.c | 215 ++++++++---------- tmk_core/protocol/usb_descriptor.h | 170 ++++++-------- 11 files changed, 429 insertions(+), 383 deletions(-) diff --git a/docs/config_options.md b/docs/config_options.md index c4921c21d..b811fa877 100644 --- a/docs/config_options.md +++ b/docs/config_options.md @@ -261,3 +261,32 @@ Use these to enable or disable building certain features. The more you have enab * Forces the keyboard to wait for a USB connection to be established before it starts up * `NO_USB_STARTUP_CHECK` * Disables usb suspend check after keyboard startup. Usually the keyboard waits for the host to wake it up before any tasks are performed. This is useful for split keyboards as one half will not get a wakeup call but must send commands to the master. + +## USB Endpoint Limitations + +In order to provide services over USB, QMK has to use USB endpoints. +These are a finite resource: each microcontroller has only a certain number. +This limits what features can be enabled together. +If the available endpoints are exceeded, a build error is thrown. + +The following features can require separate endpoints: + +* `MOUSEKEY_ENABLE` +* `EXTRAKEY_ENABLE` +* `CONSOLE_ENABLE` +* `NKRO_ENABLE` +* `MIDI_ENABLE` +* `RAW_ENABLE` +* `VIRTSER_ENABLE` + +In order to improve utilisation of the endpoints, the HID features can be combined to use a single endpoint. +By default, `MOUSEKEY`, `EXTRAKEY`, and `NKRO` are combined into a single endpoint. + +The base keyboard functionality can also be combined into the endpoint, +by setting `KEYBOARD_SHARED_EP = yes`. +This frees up one more endpoint, +but it can prevent the keyboard working in some BIOSes, +as they do not implement Boot Keyboard protocol switching. + +Combining the mouse also breaks Boot Mouse compatibility. +The mouse can be uncombined by setting `MOUSE_SHARED_EP = no` if this functionality is required. diff --git a/tmk_core/common.mk b/tmk_core/common.mk index 8eac1734f..063115acb 100644 --- a/tmk_core/common.mk +++ b/tmk_core/common.mk @@ -82,15 +82,31 @@ else TMK_COMMON_SRC += $(COMMON_DIR)/magic.c endif +SHARED_EP_ENABLE = no +MOUSE_SHARED_EP ?= yes +ifeq ($(strip $(KEYBOARD_SHARED_EP)), yes) + TMK_COMMON_DEFS += -DKEYBOARD_SHARED_EP + SHARED_EP_ENABLE = yes + # With the current usb_descriptor.c code, + # you can't share kbd without sharing mouse; + # that would be a very unexpected use case anyway + MOUSE_SHARED_EP = yes +endif ifeq ($(strip $(MOUSEKEY_ENABLE)), yes) TMK_COMMON_SRC += $(COMMON_DIR)/mousekey.c TMK_COMMON_DEFS += -DMOUSEKEY_ENABLE TMK_COMMON_DEFS += -DMOUSE_ENABLE + + ifeq ($(strip $(MOUSE_SHARED_EP)), yes) + TMK_COMMON_DEFS += -DMOUSE_SHARED_EP + SHARED_EP_ENABLE = yes + endif endif ifeq ($(strip $(EXTRAKEY_ENABLE)), yes) TMK_COMMON_DEFS += -DEXTRAKEY_ENABLE + SHARED_EP_ENABLE = yes endif ifeq ($(strip $(RAW_ENABLE)), yes) @@ -111,6 +127,7 @@ endif ifeq ($(strip $(NKRO_ENABLE)), yes) TMK_COMMON_DEFS += -DNKRO_ENABLE + SHARED_EP_ENABLE = yes endif ifeq ($(strip $(USB_6KRO_ENABLE)), yes) @@ -182,6 +199,10 @@ ifeq ($(strip $(KEYMAP_SECTION_ENABLE)), yes) endif endif +ifeq ($(strip $(SHARED_EP_ENABLE)), yes) + TMK_COMMON_DEFS += -DSHARED_EP_ENABLE +endif + # Bootloader address ifdef STM32_BOOTLOADER_ADDRESS TMK_COMMON_DEFS += -DSTM32_BOOTLOADER_ADDRESS=$(STM32_BOOTLOADER_ADDRESS) diff --git a/tmk_core/common/host.c b/tmk_core/common/host.c index e12b62216..f5d041699 100644 --- a/tmk_core/common/host.c +++ b/tmk_core/common/host.c @@ -22,6 +22,11 @@ along with this program. If not, see . #include "util.h" #include "debug.h" +#ifdef NKRO_ENABLE + #include "keycode_config.h" + extern keymap_config_t keymap_config; +#endif + static host_driver_t *driver; static uint16_t last_system_report = 0; static uint16_t last_consumer_report = 0; @@ -46,6 +51,20 @@ uint8_t host_keyboard_leds(void) void host_keyboard_send(report_keyboard_t *report) { if (!driver) return; +#if defined(NKRO_ENABLE) && defined(NKRO_SHARED_EP) + if (keyboard_protocol && keymap_config.nkro) { + /* The callers of this function assume that report->mods is where mods go in. + * But report->nkro.mods can be at a different offset if core keyboard does not have a report ID. + */ + report->nkro.mods = report->mods; + report->nkro.report_id = REPORT_ID_NKRO; + } else +#endif + { +#ifdef KEYBOARD_SHARED_EP + report->report_id = REPORT_ID_KEYBOARD; +#endif + } (*driver->send_keyboard)(report); if (debug_keyboard) { @@ -60,6 +79,9 @@ void host_keyboard_send(report_keyboard_t *report) void host_mouse_send(report_mouse_t *report) { if (!driver) return; +#ifdef MOUSE_SHARED_EP + report->report_id = REPORT_ID_MOUSE; +#endif (*driver->send_mouse)(report); } diff --git a/tmk_core/common/report.c b/tmk_core/common/report.c index eb3b44312..6a06b70c6 100644 --- a/tmk_core/common/report.c +++ b/tmk_core/common/report.c @@ -19,6 +19,7 @@ #include "keycode_config.h" #include "debug.h" #include "util.h" +#include /** \brief has_anykey * @@ -27,8 +28,16 @@ uint8_t has_anykey(report_keyboard_t* keyboard_report) { uint8_t cnt = 0; - for (uint8_t i = 1; i < KEYBOARD_REPORT_SIZE; i++) { - if (keyboard_report->raw[i]) + uint8_t *p = keyboard_report->keys; + uint8_t lp = sizeof(keyboard_report->keys); +#ifdef NKRO_ENABLE + if (keyboard_protocol && keymap_config.nkro) { + p = keyboard_report->nkro.bits; + lp = sizeof(keyboard_report->nkro.bits); + } +#endif + while (lp--) { + if (*p++) cnt++; } return cnt; @@ -237,7 +246,11 @@ void del_key_from_report(report_keyboard_t* keyboard_report, uint8_t key) void clear_keys_from_report(report_keyboard_t* keyboard_report) { // not clear mods - for (int8_t i = 1; i < KEYBOARD_REPORT_SIZE; i++) { - keyboard_report->raw[i] = 0; +#ifdef NKRO_ENABLE + if (keyboard_protocol && keymap_config.nkro) { + memset(keyboard_report->nkro.bits, 0, sizeof(keyboard_report->nkro.bits)); + return; } +#endif + memset(keyboard_report->keys, 0, sizeof(keyboard_report->keys)); } diff --git a/tmk_core/common/report.h b/tmk_core/common/report.h index 167f38275..5a1a6b19c 100644 --- a/tmk_core/common/report.h +++ b/tmk_core/common/report.h @@ -23,9 +23,11 @@ along with this program. If not, see . /* report id */ -#define REPORT_ID_MOUSE 1 -#define REPORT_ID_SYSTEM 2 -#define REPORT_ID_CONSUMER 3 +#define REPORT_ID_KEYBOARD 1 +#define REPORT_ID_MOUSE 2 +#define REPORT_ID_SYSTEM 3 +#define REPORT_ID_CONSUMER 4 +#define REPORT_ID_NKRO 5 /* mouse buttons */ #define MOUSE_BTN1 (1<<0) @@ -72,32 +74,35 @@ along with this program. If not, see . #define SYSTEM_WAKE_UP 0x0083 +#define NKRO_SHARED_EP /* key report size(NKRO or boot mode) */ #if defined(NKRO_ENABLE) - #if defined(PROTOCOL_PJRC) - #include "usb.h" - #define KEYBOARD_REPORT_SIZE KBD2_SIZE - #define KEYBOARD_REPORT_KEYS (KBD2_SIZE - 2) - #define KEYBOARD_REPORT_BITS (KBD2_SIZE - 1) - #elif defined(PROTOCOL_LUFA) || defined(PROTOCOL_CHIBIOS) + #if defined(PROTOCOL_LUFA) || defined(PROTOCOL_CHIBIOS) #include "protocol/usb_descriptor.h" - #define KEYBOARD_REPORT_SIZE NKRO_EPSIZE - #define KEYBOARD_REPORT_KEYS (NKRO_EPSIZE - 2) - #define KEYBOARD_REPORT_BITS (NKRO_EPSIZE - 1) + #define KEYBOARD_REPORT_BITS (SHARED_EPSIZE - 2) #elif defined(PROTOCOL_ARM_ATSAM) #include "protocol/arm_atsam/usb/udi_device_epsize.h" - #define KEYBOARD_REPORT_SIZE NKRO_EPSIZE - #define KEYBOARD_REPORT_KEYS (NKRO_EPSIZE - 2) #define KEYBOARD_REPORT_BITS (NKRO_EPSIZE - 1) + #undef NKRO_SHARED_EP + #undef MOUSE_SHARED_EP #else #error "NKRO not supported with this protocol" + #endif #endif +#ifdef KEYBOARD_SHARED_EP +# define KEYBOARD_REPORT_SIZE 9 #else # define KEYBOARD_REPORT_SIZE 8 -# define KEYBOARD_REPORT_KEYS 6 #endif +#define KEYBOARD_REPORT_KEYS 6 + +/* VUSB hardcodes keyboard and mouse+extrakey only */ +#if defined(PROTOCOL_VUSB) + #undef KEYBOARD_SHARED_EP + #undef MOUSE_SHARED_EP +#endif #ifdef __cplusplus extern "C" { @@ -126,12 +131,18 @@ extern "C" { typedef union { uint8_t raw[KEYBOARD_REPORT_SIZE]; struct { +#ifdef KEYBOARD_SHARED_EP + uint8_t report_id; +#endif uint8_t mods; uint8_t reserved; uint8_t keys[KEYBOARD_REPORT_KEYS]; }; #ifdef NKRO_ENABLE - struct { + struct nkro_report { +#ifdef NKRO_SHARED_EP + uint8_t report_id; +#endif uint8_t mods; uint8_t bits[KEYBOARD_REPORT_BITS]; } nkro; @@ -139,6 +150,9 @@ typedef union { } __attribute__ ((packed)) report_keyboard_t; typedef struct { +#ifdef MOUSE_SHARED_EP + uint8_t report_id; +#endif uint8_t buttons; int8_t x; int8_t y; diff --git a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c index 18f9784ae..c263ac4aa 100644 --- a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c +++ b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c @@ -54,6 +54,7 @@ #include "udi_hid.h" #include "udi_hid_kbd.h" #include +#include "report.h" //*************************************************************************** // KBD @@ -430,7 +431,7 @@ UDC_DESC_STORAGE udi_hid_exk_report_desc_t udi_hid_exk_report_desc = { 0x05, 0x01, // Usage Page (Generic Desktop), 0x09, 0x80, // Usage (System Control), 0xA1, 0x01, // Collection (Application), - 0x85, 0x02, // Report ID (2) (System), + 0x85, REPORT_ID_SYSTEM, // Report ID (2) (System), 0x16, 0x01, 0x00, // Logical Minimum (1), 0x26, 0x03, 0x00, // Logical Maximum (3), 0x1A, 0x81, 0x00, // Usage Minimum (81) (System Power Down), @@ -445,7 +446,7 @@ UDC_DESC_STORAGE udi_hid_exk_report_desc_t udi_hid_exk_report_desc = { 0x05, 0x0C, // Usage Page (Consumer), 0x09, 0x01, // Usage (Consumer Control), 0xA1, 0x01, // Collection (Application), - 0x85, 0x03, // Report ID (3) (Consumer), + 0x85, REPORT_ID_CONSUMER, // Report ID (3) (Consumer), 0x16, 0x01, 0x00, // Logical Minimum (1), 0x26, 0x9C, 0x02, // Logical Maximum (668), 0x1A, 0x01, 0x00, // Usage Minimum (1), diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index 71892c4f4..3028e7ea2 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c @@ -95,6 +95,7 @@ static const USBDescriptor *usb_get_descriptor_cb(USBDriver *usbp, uint8_t dtype return &desc; } +#ifndef KEYBOARD_SHARED_EP /* keyboard endpoint state structure */ static USBInEndpointState kbd_ep_state; /* keyboard endpoint initialization structure (IN) */ @@ -110,8 +111,9 @@ static const USBEndpointConfig kbd_ep_config = { 2, /* IN multiplier */ NULL /* SETUP buffer (not a SETUP endpoint) */ }; +#endif -#ifdef MOUSE_ENABLE +#if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP) /* mouse endpoint state structure */ static USBInEndpointState mouse_ep_state; @@ -128,45 +130,26 @@ static const USBEndpointConfig mouse_ep_config = { 2, /* IN multiplier */ NULL /* SETUP buffer (not a SETUP endpoint) */ }; -#endif /* MOUSE_ENABLE */ +#endif -#ifdef EXTRAKEY_ENABLE -/* extrakey endpoint state structure */ -static USBInEndpointState extra_ep_state; +#ifdef SHARED_EP_ENABLE +/* shared endpoint state structure */ +static USBInEndpointState shared_ep_state; -/* extrakey endpoint initialization structure (IN) */ -static const USBEndpointConfig extra_ep_config = { +/* shared endpoint initialization structure (IN) */ +static const USBEndpointConfig shared_ep_config = { USB_EP_MODE_TYPE_INTR, /* Interrupt EP */ NULL, /* SETUP packet notification callback */ - extra_in_cb, /* IN notification callback */ + shared_in_cb, /* IN notification callback */ NULL, /* OUT notification callback */ - EXTRAKEY_EPSIZE, /* IN maximum packet size */ + SHARED_EPSIZE, /* IN maximum packet size */ 0, /* OUT maximum packet size */ - &extra_ep_state, /* IN Endpoint state */ + &shared_ep_state, /* IN Endpoint state */ NULL, /* OUT endpoint state */ 2, /* IN multiplier */ NULL /* SETUP buffer (not a SETUP endpoint) */ }; -#endif /* EXTRAKEY_ENABLE */ - -#ifdef NKRO_ENABLE -/* nkro endpoint state structure */ -static USBInEndpointState nkro_ep_state; - -/* nkro endpoint initialization structure (IN) */ -static const USBEndpointConfig nkro_ep_config = { - USB_EP_MODE_TYPE_INTR, /* Interrupt EP */ - NULL, /* SETUP packet notification callback */ - nkro_in_cb, /* IN notification callback */ - NULL, /* OUT notification callback */ - NKRO_EPSIZE, /* IN maximum packet size */ - 0, /* OUT maximum packet size */ - &nkro_ep_state, /* IN Endpoint state */ - NULL, /* OUT endpoint state */ - 2, /* IN multiplier */ - NULL /* SETUP buffer (not a SETUP endpoint) */ -}; -#endif /* NKRO_ENABLE */ +#endif typedef struct { size_t queue_capacity_in; @@ -309,16 +292,15 @@ static void usb_event_cb(USBDriver *usbp, usbevent_t event) { case USB_EVENT_CONFIGURED: osalSysLockFromISR(); /* Enable the endpoints specified into the configuration. */ +#ifndef KEYBOARD_SHARED_EP usbInitEndpointI(usbp, KEYBOARD_IN_EPNUM, &kbd_ep_config); -#ifdef MOUSE_ENABLE +#endif +#if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP) usbInitEndpointI(usbp, MOUSE_IN_EPNUM, &mouse_ep_config); -#endif /* MOUSE_ENABLE */ -#ifdef EXTRAKEY_ENABLE - usbInitEndpointI(usbp, EXTRAKEY_IN_EPNUM, &extra_ep_config); -#endif /* EXTRAKEY_ENABLE */ -#ifdef NKRO_ENABLE - usbInitEndpointI(usbp, NKRO_IN_EPNUM, &nkro_ep_config); -#endif /* NKRO_ENABLE */ +#endif +#ifdef SHARED_EP_ENABLE + usbInitEndpointI(usbp, SHARED_IN_EPNUM, &shared_ep_config); +#endif for (int i=0;isetup fields: * 0: bmRequestType (bitmask) @@ -409,42 +402,16 @@ static bool usb_request_hook_cb(USBDriver *usbp) { case HID_GET_REPORT: switch(usbp->setup[4]) { /* LSB(wIndex) (check MSB==0?) */ case KEYBOARD_INTERFACE: -#ifdef NKRO_ENABLE - case NKRO_INTERFACE: -#endif /* NKRO_ENABLE */ usbSetupTransfer(usbp, (uint8_t *)&keyboard_report_sent, sizeof(keyboard_report_sent), NULL); return TRUE; break; -#ifdef MOUSE_ENABLE +#if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP) case MOUSE_INTERFACE: usbSetupTransfer(usbp, (uint8_t *)&mouse_report_blank, sizeof(mouse_report_blank), NULL); return TRUE; break; -#endif /* MOUSE_ENABLE */ - -#ifdef EXTRAKEY_ENABLE - case EXTRAKEY_INTERFACE: - if(usbp->setup[3] == 1) { /* MSB(wValue) [Report Type] == 1 [Input Report] */ - switch(usbp->setup[2]) { /* LSB(wValue) [Report ID] */ - case REPORT_ID_SYSTEM: - extra_report_blank[0] = REPORT_ID_SYSTEM; - usbSetupTransfer(usbp, (uint8_t *)extra_report_blank, sizeof(extra_report_blank), NULL); - return TRUE; - break; - case REPORT_ID_CONSUMER: - extra_report_blank[0] = REPORT_ID_CONSUMER; - usbSetupTransfer(usbp, (uint8_t *)extra_report_blank, sizeof(extra_report_blank), NULL); - return TRUE; - break; - default: - return FALSE; - } - } else { - return FALSE; - } - break; -#endif /* EXTRAKEY_ENABLE */ +#endif default: usbSetupTransfer(usbp, NULL, 0, NULL); @@ -472,12 +439,25 @@ static bool usb_request_hook_cb(USBDriver *usbp) { case HID_SET_REPORT: switch(usbp->setup[4]) { /* LSB(wIndex) (check MSB==0 and wLength==1?) */ case KEYBOARD_INTERFACE: -#ifdef NKRO_ENABLE - case NKRO_INTERFACE: -#endif /* NKRO_ENABLE */ +#if defined(SHARED_EP_ENABLE) && !defined(KEYBOARD_SHARED_EP) + case SHARED_INTERFACE: +#endif /* keyboard_led_stats = * keyboard_led_stats needs be word (or dword), otherwise we get an exception on F0 */ - usbSetupTransfer(usbp, (uint8_t *)&keyboard_led_stats, 1, NULL); + has_report_id = 0; +#if defined(SHARED_EP_ENABLE) + if (usbp->setup[4] == SHARED_INTERFACE) { + has_report_id = 1; + } +#endif + if (usbp->setup[4] == KEYBOARD_INTERFACE && !keyboard_protocol) { + has_report_id = 0; + } + if (has_report_id) { + usbSetupTransfer(usbp, set_report_buf, sizeof(set_report_buf), set_led_transfer_cb); + } else { + usbSetupTransfer(usbp, (uint8_t *)&keyboard_led_stats, 1, NULL); + } return TRUE; break; } @@ -591,20 +571,13 @@ void init_usb_driver(USBDriver *usbp) { * --------------------------------------------------------- */ /* keyboard IN callback hander (a kbd report has made it IN) */ +#ifndef KEYBOARD_SHARED_EP void kbd_in_cb(USBDriver *usbp, usbep_t ep) { /* STUB */ (void)usbp; (void)ep; } - -#ifdef NKRO_ENABLE -/* nkro IN callback hander (a nkro report has made it IN) */ -void nkro_in_cb(USBDriver *usbp, usbep_t ep) { - /* STUB */ - (void)usbp; - (void)ep; -} -#endif /* NKRO_ENABLE */ +#endif /* start-of-frame handler * TODO: i guess it would be better to re-implement using timers, @@ -628,9 +601,9 @@ static void keyboard_idle_timer_cb(void *arg) { } #ifdef NKRO_ENABLE - if(!keymap_config.nkro && keyboard_idle) { + if(!keymap_config.nkro && keyboard_idle && keyboard_protocol) { #else /* NKRO_ENABLE */ - if(keyboard_idle) { + if(keyboard_idle && keyboard_protocol) { #endif /* NKRO_ENABLE */ /* TODO: are we sure we want the KBD_ENDPOINT? */ if(!usbGetTransmitStatusI(usbp, KEYBOARD_IN_EPNUM)) { @@ -661,25 +634,25 @@ void send_keyboard(report_keyboard_t *report) { osalSysUnlock(); #ifdef NKRO_ENABLE - if(keymap_config.nkro) { /* NKRO protocol */ + if(keymap_config.nkro && keyboard_protocol) { /* NKRO protocol */ /* need to wait until the previous packet has made it through */ /* can rewrite this using the synchronous API, then would wait * until *after* the packet has been transmitted. I think * this is more efficient */ /* busy wait, should be short and not very common */ osalSysLock(); - if(usbGetTransmitStatusI(&USB_DRIVER, NKRO_IN_EPNUM)) { + if(usbGetTransmitStatusI(&USB_DRIVER, SHARED_IN_EPNUM)) { /* Need to either suspend, or loop and call unlock/lock during * every iteration - otherwise the system will remain locked, * no interrupts served, so USB not going through as well. * Note: for suspend, need USB_USE_WAIT == TRUE in halconf.h */ - osalThreadSuspendS(&(&USB_DRIVER)->epc[NKRO_IN_EPNUM]->in_state->thread); + osalThreadSuspendS(&(&USB_DRIVER)->epc[SHARED_IN_EPNUM]->in_state->thread); } - usbStartTransmitI(&USB_DRIVER, NKRO_IN_EPNUM, (uint8_t *)report, sizeof(report_keyboard_t)); + usbStartTransmitI(&USB_DRIVER, SHARED_IN_EPNUM, (uint8_t *)report, sizeof(struct nkro_report)); osalSysUnlock(); } else #endif /* NKRO_ENABLE */ - { /* boot protocol */ + { /* regular protocol */ /* need to wait until the previous packet has made it through */ /* busy wait, should be short and not very common */ osalSysLock(); @@ -690,7 +663,15 @@ void send_keyboard(report_keyboard_t *report) { * Note: for suspend, need USB_USE_WAIT == TRUE in halconf.h */ osalThreadSuspendS(&(&USB_DRIVER)->epc[KEYBOARD_IN_EPNUM]->in_state->thread); } - usbStartTransmitI(&USB_DRIVER, KEYBOARD_IN_EPNUM, (uint8_t *)report, KEYBOARD_EPSIZE); + uint8_t *data, size; + if (keyboard_protocol) { + data = (uint8_t*)report; + size = KEYBOARD_REPORT_SIZE; + } else { /* boot protocol */ + data = &report->mods; + size = 8; + } + usbStartTransmitI(&USB_DRIVER, KEYBOARD_IN_EPNUM, data, size); osalSysUnlock(); } keyboard_report_sent = *report; @@ -703,11 +684,13 @@ void send_keyboard(report_keyboard_t *report) { #ifdef MOUSE_ENABLE +#ifndef MOUSE_SHARED_EP /* mouse IN callback hander (a mouse report has made it IN) */ void mouse_in_cb(USBDriver *usbp, usbep_t ep) { (void)usbp; (void)ep; } +#endif void send_mouse(report_mouse_t *report) { osalSysLock(); @@ -736,20 +719,25 @@ void send_mouse(report_mouse_t *report) { } #endif /* MOUSE_ENABLE */ +/* --------------------------------------------------------- + * Shared EP functions + * --------------------------------------------------------- + */ +#ifdef SHARED_EP_ENABLE +/* shared IN callback hander */ +void shared_in_cb(USBDriver *usbp, usbep_t ep) { + /* STUB */ + (void)usbp; + (void)ep; +} +#endif + /* --------------------------------------------------------- * Extrakey functions * --------------------------------------------------------- */ #ifdef EXTRAKEY_ENABLE - -/* extrakey IN callback hander */ -void extra_in_cb(USBDriver *usbp, usbep_t ep) { - /* STUB */ - (void)usbp; - (void)ep; -} - static void send_extra_report(uint8_t report_id, uint16_t data) { osalSysLock(); if(usbGetDriverStateI(&USB_DRIVER) != USB_ACTIVE) { @@ -762,7 +750,7 @@ static void send_extra_report(uint8_t report_id, uint16_t data) { .usage = data }; - usbStartTransmitI(&USB_DRIVER, EXTRAKEY_IN_EPNUM, (uint8_t *)&report, sizeof(report_extra_t)); + usbStartTransmitI(&USB_DRIVER, SHARED_IN_EPNUM, (uint8_t *)&report, sizeof(report_extra_t)); osalSysUnlock(); } diff --git a/tmk_core/protocol/chibios/usb_main.h b/tmk_core/protocol/chibios/usb_main.h index 1f7eb12f8..55e8882cc 100644 --- a/tmk_core/protocol/chibios/usb_main.h +++ b/tmk_core/protocol/chibios/usb_main.h @@ -65,6 +65,14 @@ void nkro_in_cb(USBDriver *usbp, usbep_t ep); void mouse_in_cb(USBDriver *usbp, usbep_t ep); #endif /* MOUSE_ENABLE */ +/* --------------- + * Shared EP header + * --------------- + */ + +/* shared IN request callback handler */ +void shared_in_cb(USBDriver *usbp, usbep_t ep); + /* --------------- * Extrakey header * --------------- @@ -72,9 +80,6 @@ void mouse_in_cb(USBDriver *usbp, usbep_t ep); #ifdef EXTRAKEY_ENABLE -/* extrakey IN request callback handler */ -void extra_in_cb(USBDriver *usbp, usbep_t ep); - /* extra report structure */ typedef struct { uint8_t report_id; diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index 95e0b95b2..e88e6f34a 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -409,19 +409,21 @@ void EVENT_USB_Device_ConfigurationChanged(void) bool ConfigSuccess = true; /* Setup Keyboard HID Report Endpoints */ +#ifndef KEYBOARD_SHARED_EP ConfigSuccess &= ENDPOINT_CONFIG(KEYBOARD_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, KEYBOARD_EPSIZE, ENDPOINT_BANK_SINGLE); +#endif -#ifdef MOUSE_ENABLE +#if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP) /* Setup Mouse HID Report Endpoint */ ConfigSuccess &= ENDPOINT_CONFIG(MOUSE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, MOUSE_EPSIZE, ENDPOINT_BANK_SINGLE); #endif -#ifdef EXTRAKEY_ENABLE - /* Setup Extra HID Report Endpoint */ - ConfigSuccess &= ENDPOINT_CONFIG(EXTRAKEY_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, - EXTRAKEY_EPSIZE, ENDPOINT_BANK_SINGLE); +#ifdef SHARED_EP_ENABLE + /* Setup Shared HID Report Endpoint */ + ConfigSuccess &= ENDPOINT_CONFIG(SHARED_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, + SHARED_EPSIZE, ENDPOINT_BANK_SINGLE); #endif #ifdef RAW_ENABLE @@ -442,12 +444,6 @@ void EVENT_USB_Device_ConfigurationChanged(void) #endif #endif -#ifdef NKRO_ENABLE - /* Setup NKRO HID Report Endpoints */ - ConfigSuccess &= ENDPOINT_CONFIG(NKRO_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, - NKRO_EPSIZE, ENDPOINT_BANK_SINGLE); -#endif - #ifdef MIDI_ENABLE ConfigSuccess &= Endpoint_ConfigureEndpoint(MIDI_STREAM_IN_EPADDR, EP_TYPE_BULK, MIDI_STREAM_EPSIZE, ENDPOINT_BANK_SINGLE); ConfigSuccess &= Endpoint_ConfigureEndpoint(MIDI_STREAM_OUT_EPADDR, EP_TYPE_BULK, MIDI_STREAM_EPSIZE, ENDPOINT_BANK_SINGLE); @@ -512,8 +508,8 @@ void EVENT_USB_Device_ControlRequest(void) // Interface switch (USB_ControlRequest.wIndex) { case KEYBOARD_INTERFACE: -#ifdef NKRO_ENABLE - case NKRO_INTERFACE: +#if defined(SHARED_EP_ENABLE) && !defined(KEYBOARD_SHARED_EP) + case SHARED_INTERFACE: #endif Endpoint_ClearSETUP(); @@ -521,7 +517,17 @@ void EVENT_USB_Device_ControlRequest(void) if (USB_DeviceState == DEVICE_STATE_Unattached) return; } +#if defined(SHARED_EP_ENABLE) + uint8_t report_id = REPORT_ID_KEYBOARD; + if (keyboard_protocol) { + report_id = Endpoint_Read_8(); + } + if (report_id == REPORT_ID_KEYBOARD || report_id == REPORT_ID_NKRO) { + keyboard_led_stats = Endpoint_Read_8(); + } +#else keyboard_led_stats = Endpoint_Read_8(); +#endif Endpoint_ClearOUT(); Endpoint_ClearStatusStage(); @@ -612,16 +618,20 @@ static void send_keyboard(report_keyboard_t *report) #ifdef MODULE_ADAFRUIT_BLE adafruit_ble_send_keys(report->mods, report->keys, sizeof(report->keys)); #elif MODULE_RN42 - bluefruit_serial_send(0xFD); - bluefruit_serial_send(0x09); - bluefruit_serial_send(0x01); - for (uint8_t i = 0; i < KEYBOARD_EPSIZE; i++) { - bluefruit_serial_send(report->raw[i]); - } + bluefruit_serial_send(0xFD); + bluefruit_serial_send(0x09); + bluefruit_serial_send(0x01); + bluefruit_serial_send(report->mods); + bluefruit_serial_send(report->reserved); + for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) { + bluefruit_serial_send(report->keys[i]); + } #else bluefruit_serial_send(0xFD); - for (uint8_t i = 0; i < KEYBOARD_EPSIZE; i++) { - bluefruit_serial_send(report->raw[i]); + bluefruit_serial_send(report->mods); + bluefruit_serial_send(report->reserved); + for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) { + bluefruit_serial_send(report->keys[i]); } #endif } @@ -632,30 +642,24 @@ static void send_keyboard(report_keyboard_t *report) } /* Select the Keyboard Report Endpoint */ + uint8_t ep = KEYBOARD_IN_EPNUM; + uint8_t size = KEYBOARD_REPORT_SIZE; #ifdef NKRO_ENABLE if (keyboard_protocol && keymap_config.nkro) { - /* Report protocol - NKRO */ - Endpoint_SelectEndpoint(NKRO_IN_EPNUM); - - /* Check if write ready for a polling interval around 1ms */ - while (timeout-- && !Endpoint_IsReadWriteAllowed()) _delay_us(4); - if (!Endpoint_IsReadWriteAllowed()) return; - - /* Write Keyboard Report Data */ - Endpoint_Write_Stream_LE(report, NKRO_EPSIZE, NULL); + ep = SHARED_IN_EPNUM; + size = sizeof(struct nkro_report); } - else #endif - { - /* Boot protocol */ - Endpoint_SelectEndpoint(KEYBOARD_IN_EPNUM); + Endpoint_SelectEndpoint(ep); + /* Check if write ready for a polling interval around 10ms */ + while (timeout-- && !Endpoint_IsReadWriteAllowed()) _delay_us(40); + if (!Endpoint_IsReadWriteAllowed()) return; - /* Check if write ready for a polling interval around 10ms */ - while (timeout-- && !Endpoint_IsReadWriteAllowed()) _delay_us(40); - if (!Endpoint_IsReadWriteAllowed()) return; - - /* Write Keyboard Report Data */ - Endpoint_Write_Stream_LE(report, KEYBOARD_EPSIZE, NULL); + /* If we're in Boot Protocol, don't send any report ID or other funky fields */ + if (!keyboard_protocol) { + Endpoint_Write_Stream_LE(&report->mods, 8, NULL); + } else { + Endpoint_Write_Stream_LE(report, size, NULL); } /* Finalize the stream transfer to send the last packet */ @@ -718,6 +722,7 @@ static void send_mouse(report_mouse_t *report) */ static void send_system(uint16_t data) { +#ifdef EXTRAKEY_ENABLE uint8_t timeout = 255; if (USB_DeviceState != DEVICE_STATE_Configured) @@ -727,7 +732,7 @@ static void send_system(uint16_t data) .report_id = REPORT_ID_SYSTEM, .usage = data - SYSTEM_POWER_DOWN + 1 }; - Endpoint_SelectEndpoint(EXTRAKEY_IN_EPNUM); + Endpoint_SelectEndpoint(SHARED_IN_EPNUM); /* Check if write ready for a polling interval around 10ms */ while (timeout-- && !Endpoint_IsReadWriteAllowed()) _delay_us(40); @@ -735,6 +740,7 @@ static void send_system(uint16_t data) Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL); Endpoint_ClearIN(); +#endif } /** \brief Send Consumer @@ -743,6 +749,7 @@ static void send_system(uint16_t data) */ static void send_consumer(uint16_t data) { +#ifdef EXTRAKEY_ENABLE uint8_t timeout = 255; uint8_t where = where_to_send(); @@ -786,7 +793,7 @@ static void send_consumer(uint16_t data) .report_id = REPORT_ID_CONSUMER, .usage = data }; - Endpoint_SelectEndpoint(EXTRAKEY_IN_EPNUM); + Endpoint_SelectEndpoint(SHARED_IN_EPNUM); /* Check if write ready for a polling interval around 10ms */ while (timeout-- && !Endpoint_IsReadWriteAllowed()) _delay_us(40); @@ -794,6 +801,7 @@ static void send_consumer(uint16_t data) Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL); Endpoint_ClearIN(); +#endif } diff --git a/tmk_core/protocol/usb_descriptor.c b/tmk_core/protocol/usb_descriptor.c index cab344675..589ad23cd 100644 --- a/tmk_core/protocol/usb_descriptor.c +++ b/tmk_core/protocol/usb_descriptor.c @@ -47,11 +47,18 @@ /******************************************************************************* * HID Report Descriptors ******************************************************************************/ -const USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport[] = -{ +#ifdef KEYBOARD_SHARED_EP +const USB_Descriptor_HIDReport_Datatype_t PROGMEM SharedReport[] = { +#define SHARED_REPORT_STARTED +#else +const USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport[] = { +#endif HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */ HID_RI_USAGE(8, 0x06), /* Keyboard */ HID_RI_COLLECTION(8, 0x01), /* Application */ +# ifdef KEYBOARD_SHARED_EP + HID_RI_REPORT_ID(8, REPORT_ID_KEYBOARD), +# endif HID_RI_USAGE_PAGE(8, 0x07), /* Key Codes */ HID_RI_USAGE_MINIMUM(8, 0xE0), /* Keyboard Left Control */ HID_RI_USAGE_MAXIMUM(8, 0xE7), /* Keyboard Right GUI */ @@ -84,14 +91,25 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport[] = HID_RI_REPORT_SIZE(8, 0x08), HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), HID_RI_END_COLLECTION(0), -}; -#ifdef MOUSE_ENABLE -const USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] = -{ +#ifndef KEYBOARD_SHARED_EP +}; +#endif + +#if defined(MOUSE_ENABLE) + +# if !defined(MOUSE_SHARED_EP) +const USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] = { +# elif !defined(SHARED_REPORT_STARTED) +const USB_Descriptor_HIDReport_Datatype_t PROGMEM SharedReport[] = { +#define SHARED_REPORT_STARTED +# endif HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */ HID_RI_USAGE(8, 0x02), /* Mouse */ HID_RI_COLLECTION(8, 0x01), /* Application */ +# ifdef MOUSE_SHARED_EP + HID_RI_REPORT_ID(8, REPORT_ID_MOUSE), +# endif HID_RI_USAGE(8, 0x01), /* Pointer */ HID_RI_COLLECTION(8, 0x00), /* Physical */ @@ -133,12 +151,15 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] = HID_RI_END_COLLECTION(0), HID_RI_END_COLLECTION(0), +# ifndef MOUSE_SHARED_EP }; +# endif #endif -#ifdef EXTRAKEY_ENABLE -const USB_Descriptor_HIDReport_Datatype_t PROGMEM ExtrakeyReport[] = -{ +#if defined(SHARED_EP_ENABLE) && !defined(SHARED_REPORT_STARTED) +const USB_Descriptor_HIDReport_Datatype_t PROGMEM SharedReport[] = { +#endif +# ifdef EXTRAKEY_ENABLE HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */ HID_RI_USAGE(8, 0x80), /* System Control */ HID_RI_COLLECTION(8, 0x01), /* Application */ @@ -164,6 +185,43 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM ExtrakeyReport[] = HID_RI_REPORT_COUNT(8, 1), HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), HID_RI_END_COLLECTION(0), +# endif + +# ifdef NKRO_ENABLE + HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */ + HID_RI_USAGE(8, 0x06), /* Keyboard */ + HID_RI_COLLECTION(8, 0x01), /* Application */ + HID_RI_REPORT_ID(8, REPORT_ID_NKRO), + HID_RI_USAGE_PAGE(8, 0x07), /* Key Codes */ + HID_RI_USAGE_MINIMUM(8, 0xE0), /* Keyboard Left Control */ + HID_RI_USAGE_MAXIMUM(8, 0xE7), /* Keyboard Right GUI */ + HID_RI_LOGICAL_MINIMUM(8, 0x00), + HID_RI_LOGICAL_MAXIMUM(8, 0x01), + HID_RI_REPORT_COUNT(8, 0x08), + HID_RI_REPORT_SIZE(8, 0x01), + HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), + + HID_RI_USAGE_PAGE(8, 0x08), /* LEDs */ + HID_RI_USAGE_MINIMUM(8, 0x01), /* Num Lock */ + HID_RI_USAGE_MAXIMUM(8, 0x05), /* Kana */ + HID_RI_REPORT_COUNT(8, 0x05), + HID_RI_REPORT_SIZE(8, 0x01), + HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), + HID_RI_REPORT_COUNT(8, 0x01), + HID_RI_REPORT_SIZE(8, 0x03), + HID_RI_OUTPUT(8, HID_IOF_CONSTANT), + + HID_RI_USAGE_PAGE(8, 0x07), /* Key Codes */ + HID_RI_USAGE_MINIMUM(8, 0x00), /* Keyboard 0 */ + HID_RI_USAGE_MAXIMUM(8, KEYBOARD_REPORT_BITS*8-1), + HID_RI_LOGICAL_MINIMUM(8, 0x00), + HID_RI_LOGICAL_MAXIMUM(8, 0x01), + HID_RI_REPORT_COUNT(8, KEYBOARD_REPORT_BITS*8), + HID_RI_REPORT_SIZE(8, 0x01), + HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), + HID_RI_END_COLLECTION(0), +# endif +#ifdef SHARED_EP_ENABLE }; #endif @@ -211,42 +269,6 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM ConsoleReport[] = }; #endif -#ifdef NKRO_ENABLE -const USB_Descriptor_HIDReport_Datatype_t PROGMEM NKROReport[] = -{ - HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */ - HID_RI_USAGE(8, 0x06), /* Keyboard */ - HID_RI_COLLECTION(8, 0x01), /* Application */ - HID_RI_USAGE_PAGE(8, 0x07), /* Key Codes */ - HID_RI_USAGE_MINIMUM(8, 0xE0), /* Keyboard Left Control */ - HID_RI_USAGE_MAXIMUM(8, 0xE7), /* Keyboard Right GUI */ - HID_RI_LOGICAL_MINIMUM(8, 0x00), - HID_RI_LOGICAL_MAXIMUM(8, 0x01), - HID_RI_REPORT_COUNT(8, 0x08), - HID_RI_REPORT_SIZE(8, 0x01), - HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), - - HID_RI_USAGE_PAGE(8, 0x08), /* LEDs */ - HID_RI_USAGE_MINIMUM(8, 0x01), /* Num Lock */ - HID_RI_USAGE_MAXIMUM(8, 0x05), /* Kana */ - HID_RI_REPORT_COUNT(8, 0x05), - HID_RI_REPORT_SIZE(8, 0x01), - HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), - HID_RI_REPORT_COUNT(8, 0x01), - HID_RI_REPORT_SIZE(8, 0x03), - HID_RI_OUTPUT(8, HID_IOF_CONSTANT), - - HID_RI_USAGE_PAGE(8, 0x07), /* Key Codes */ - HID_RI_USAGE_MINIMUM(8, 0x00), /* Keyboard 0 */ - HID_RI_USAGE_MAXIMUM(8, (NKRO_EPSIZE-1)*8-1), /* Keyboard Right GUI */ - HID_RI_LOGICAL_MINIMUM(8, 0x00), - HID_RI_LOGICAL_MAXIMUM(8, 0x01), - HID_RI_REPORT_COUNT(8, (NKRO_EPSIZE-1)*8), - HID_RI_REPORT_SIZE(8, 0x01), - HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), - HID_RI_END_COLLECTION(0), -}; -#endif /******************************************************************************* * Device Descriptors @@ -303,6 +325,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = /* * Keyboard */ +#ifndef KEYBOARD_SHARED_EP .Keyboard_Interface = { .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, @@ -339,11 +362,12 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = .EndpointSize = KEYBOARD_EPSIZE, .PollingIntervalMS = 0x0A }, +#endif /* * Mouse */ -#ifdef MOUSE_ENABLE +#if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP) .Mouse_Interface = { .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, @@ -383,26 +407,31 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = #endif /* - * Extra + * Shared */ -#ifdef EXTRAKEY_ENABLE - .Extrakey_Interface = +#ifdef SHARED_EP_ENABLE + .Shared_Interface = { .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, - .InterfaceNumber = EXTRAKEY_INTERFACE, + .InterfaceNumber = SHARED_INTERFACE, .AlternateSetting = 0x00, .TotalEndpoints = 1, .Class = HID_CSCP_HIDClass, +# ifdef KEYBOARD_SHARED_EP + .SubClass = HID_CSCP_BootSubclass, + .Protocol = HID_CSCP_KeyboardBootProtocol, +# else .SubClass = HID_CSCP_NonBootSubclass, .Protocol = HID_CSCP_NonBootProtocol, +#endif .InterfaceStrIndex = NO_DESCRIPTOR }, - .Extrakey_HID = + .Shared_HID = { .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, @@ -410,16 +439,16 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = .CountryCode = 0x00, .TotalReportDescriptors = 1, .HIDReportType = HID_DTYPE_Report, - .HIDReportLength = sizeof(ExtrakeyReport) + .HIDReportLength = sizeof(SharedReport) }, - .Extrakey_INEndpoint = + .Shared_INEndpoint = { .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, - .EndpointAddress = (ENDPOINT_DIR_IN | EXTRAKEY_IN_EPNUM), + .EndpointAddress = (ENDPOINT_DIR_IN | SHARED_IN_EPNUM), .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), - .EndpointSize = EXTRAKEY_EPSIZE, + .EndpointSize = SHARED_EPSIZE, .PollingIntervalMS = 0x0A }, #endif @@ -528,48 +557,6 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = }, #endif - /* - * NKRO - */ -#ifdef NKRO_ENABLE - .NKRO_Interface = - { - .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, - - .InterfaceNumber = NKRO_INTERFACE, - .AlternateSetting = 0x00, - - .TotalEndpoints = 1, - - .Class = HID_CSCP_HIDClass, - .SubClass = HID_CSCP_NonBootSubclass, - .Protocol = HID_CSCP_NonBootProtocol, - - .InterfaceStrIndex = NO_DESCRIPTOR - }, - - .NKRO_HID = - { - .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, - - .HIDSpec = VERSION_BCD(1,1,1), - .CountryCode = 0x00, - .TotalReportDescriptors = 1, - .HIDReportType = HID_DTYPE_Report, - .HIDReportLength = sizeof(NKROReport) - }, - - .NKRO_INEndpoint = - { - .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, - - .EndpointAddress = (ENDPOINT_DIR_IN | NKRO_IN_EPNUM), - .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), - .EndpointSize = NKRO_EPSIZE, - .PollingIntervalMS = 0x01 - }, -#endif - #ifdef MIDI_ENABLE .Audio_Interface_Association = { @@ -936,19 +923,21 @@ uint16_t get_usb_descriptor(const uint16_t wValue, break; case HID_DTYPE_HID: switch (wIndex) { +#ifndef KEYBOARD_SHARED_EP case KEYBOARD_INTERFACE: Address = &ConfigurationDescriptor.Keyboard_HID; Size = sizeof(USB_HID_Descriptor_HID_t); break; -#ifdef MOUSE_ENABLE +#endif +#if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP) case MOUSE_INTERFACE: Address = &ConfigurationDescriptor.Mouse_HID; Size = sizeof(USB_HID_Descriptor_HID_t); break; #endif -#ifdef EXTRAKEY_ENABLE - case EXTRAKEY_INTERFACE: - Address = &ConfigurationDescriptor.Extrakey_HID; +#ifdef SHARED_EP_ENABLE + case SHARED_INTERFACE: + Address = &ConfigurationDescriptor.Shared_HID; Size = sizeof(USB_HID_Descriptor_HID_t); break; #endif @@ -963,31 +952,27 @@ uint16_t get_usb_descriptor(const uint16_t wValue, Address = &ConfigurationDescriptor.Console_HID; Size = sizeof(USB_HID_Descriptor_HID_t); break; -#endif -#ifdef NKRO_ENABLE - case NKRO_INTERFACE: - Address = &ConfigurationDescriptor.NKRO_HID; - Size = sizeof(USB_HID_Descriptor_HID_t); - break; #endif } break; case HID_DTYPE_Report: switch (wIndex) { +#ifndef KEYBOARD_SHARED_EP case KEYBOARD_INTERFACE: Address = &KeyboardReport; Size = sizeof(KeyboardReport); break; -#ifdef MOUSE_ENABLE +#endif +#if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP) case MOUSE_INTERFACE: Address = &MouseReport; Size = sizeof(MouseReport); break; #endif -#ifdef EXTRAKEY_ENABLE - case EXTRAKEY_INTERFACE: - Address = &ExtrakeyReport; - Size = sizeof(ExtrakeyReport); +#ifdef SHARED_EP_ENABLE + case SHARED_INTERFACE: + Address = &SharedReport; + Size = sizeof(SharedReport); break; #endif #ifdef RAW_ENABLE @@ -1001,12 +986,6 @@ uint16_t get_usb_descriptor(const uint16_t wValue, Address = &ConsoleReport; Size = sizeof(ConsoleReport); break; -#endif -#ifdef NKRO_ENABLE - case NKRO_INTERFACE: - Address = &NKROReport; - Size = sizeof(NKROReport); - break; #endif } break; diff --git a/tmk_core/protocol/usb_descriptor.h b/tmk_core/protocol/usb_descriptor.h index 586d07df6..3ca0c00b3 100644 --- a/tmk_core/protocol/usb_descriptor.h +++ b/tmk_core/protocol/usb_descriptor.h @@ -53,26 +53,27 @@ typedef struct { USB_Descriptor_Configuration_Header_t Config; +#ifndef KEYBOARD_SHARED_EP // Keyboard HID Interface USB_Descriptor_Interface_t Keyboard_Interface; USB_HID_Descriptor_HID_t Keyboard_HID; USB_Descriptor_Endpoint_t Keyboard_INEndpoint; +#endif -#ifdef MOUSE_ENABLE +#if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP) // Mouse HID Interface USB_Descriptor_Interface_t Mouse_Interface; USB_HID_Descriptor_HID_t Mouse_HID; USB_Descriptor_Endpoint_t Mouse_INEndpoint; #endif -#ifdef EXTRAKEY_ENABLE - // Extrakey HID Interface - USB_Descriptor_Interface_t Extrakey_Interface; - USB_HID_Descriptor_HID_t Extrakey_HID; - USB_Descriptor_Endpoint_t Extrakey_INEndpoint; +#if defined(SHARED_EP_ENABLE) + USB_Descriptor_Interface_t Shared_Interface; + USB_HID_Descriptor_HID_t Shared_HID; + USB_Descriptor_Endpoint_t Shared_INEndpoint; #endif -#ifdef RAW_ENABLE +#if defined(RAW_ENABLE) // Raw HID Interface USB_Descriptor_Interface_t Raw_Interface; USB_HID_Descriptor_HID_t Raw_HID; @@ -88,13 +89,6 @@ typedef struct USB_Descriptor_Endpoint_t Console_OUTEndpoint; #endif -#ifdef NKRO_ENABLE - // NKRO HID Interface - USB_Descriptor_Interface_t NKRO_Interface; - USB_HID_Descriptor_HID_t NKRO_HID; - USB_Descriptor_Endpoint_t NKRO_INEndpoint; -#endif - #ifdef MIDI_ENABLE USB_Descriptor_Interface_Association_t Audio_Interface_Association; // MIDI Audio Control Interface @@ -133,133 +127,105 @@ typedef struct /* index of interface */ -#define KEYBOARD_INTERFACE 0 - +enum usb_interfaces { +#if !defined(KEYBOARD_SHARED_EP) + KEYBOARD_INTERFACE, +#else +# define KEYBOARD_INTERFACE SHARED_INTERFACE +#endif // It is important that the Raw HID interface is at a constant // interface number, to support Linux/OSX platforms and chrome.hid // If Raw HID is enabled, let it be always 1. -#ifdef RAW_ENABLE -# define RAW_INTERFACE (KEYBOARD_INTERFACE + 1) -#else -# define RAW_INTERFACE KEYBOARD_INTERFACE +#if defined(RAW_ENABLE) + RAW_INTERFACE, #endif - -#ifdef MOUSE_ENABLE -# define MOUSE_INTERFACE (RAW_INTERFACE + 1) -#else -# define MOUSE_INTERFACE RAW_INTERFACE +#if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP) + MOUSE_INTERFACE, #endif - -#ifdef EXTRAKEY_ENABLE -# define EXTRAKEY_INTERFACE (MOUSE_INTERFACE + 1) -#else -# define EXTRAKEY_INTERFACE MOUSE_INTERFACE +#if defined(SHARED_EP_ENABLE) + SHARED_INTERFACE, #endif - -#ifdef CONSOLE_ENABLE -# define CONSOLE_INTERFACE (EXTRAKEY_INTERFACE + 1) -#else -# define CONSOLE_INTERFACE EXTRAKEY_INTERFACE +#if defined(CONSOLE_ENABLE) + CONSOLE_INTERFACE, #endif - -#ifdef NKRO_ENABLE -# define NKRO_INTERFACE (CONSOLE_INTERFACE + 1) -#else -# define NKRO_INTERFACE CONSOLE_INTERFACE +#if defined(MIDI_ENABLE) + AC_INTERFACE, + AS_INTERFACE, #endif - -#ifdef MIDI_ENABLE -# define AC_INTERFACE (NKRO_INTERFACE + 1) -# define AS_INTERFACE (NKRO_INTERFACE + 2) -#else -# define AS_INTERFACE NKRO_INTERFACE +#if defined(VIRTSER_ENABLE) + CCI_INTERFACE, + CDI_INTERFACE, #endif + TOTAL_INTERFACES +}; -#ifdef VIRTSER_ENABLE -# define CCI_INTERFACE (AS_INTERFACE + 1) -# define CDI_INTERFACE (AS_INTERFACE + 2) +#define NEXT_EPNUM __COUNTER__ + +enum usb_endpoints { + __unused_epnum__ = NEXT_EPNUM, /* EP numbering starts at 1 */ +#if !defined(KEYBOARD_SHARED_EP) + KEYBOARD_IN_EPNUM = NEXT_EPNUM, #else -# define CDI_INTERFACE AS_INTERFACE +# define KEYBOARD_IN_EPNUM SHARED_IN_EPNUM #endif - -/* nubmer of interfaces */ -#define TOTAL_INTERFACES (CDI_INTERFACE + 1) - - -// Endopoint number and size -#define KEYBOARD_IN_EPNUM 1 - -#ifdef MOUSE_ENABLE -# define MOUSE_IN_EPNUM (KEYBOARD_IN_EPNUM + 1) +#if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP) + MOUSE_IN_EPNUM = NEXT_EPNUM, #else -# define MOUSE_IN_EPNUM KEYBOARD_IN_EPNUM +# define MOUSE_IN_EPNUM SHARED_IN_EPNUM #endif - -#ifdef EXTRAKEY_ENABLE -# define EXTRAKEY_IN_EPNUM (MOUSE_IN_EPNUM + 1) -#else -# define EXTRAKEY_IN_EPNUM MOUSE_IN_EPNUM +#if defined(RAW_ENABLE) + RAW_IN_EPNUM = NEXT_EPNUM, + RAW_OUT_EPNUM = NEXT_EPNUM, #endif - -#ifdef RAW_ENABLE -# define RAW_IN_EPNUM (EXTRAKEY_IN_EPNUM + 1) -# define RAW_OUT_EPNUM (EXTRAKEY_IN_EPNUM + 2) -#else -# define RAW_OUT_EPNUM EXTRAKEY_IN_EPNUM +#if defined(SHARED_EP_ENABLE) + SHARED_IN_EPNUM = NEXT_EPNUM, #endif - -#ifdef CONSOLE_ENABLE -# define CONSOLE_IN_EPNUM (RAW_OUT_EPNUM + 1) +#if defined(CONSOLE_ENABLE) + CONSOLE_IN_EPNUM = NEXT_EPNUM, #ifdef PROTOCOL_CHIBIOS // ChibiOS has enough memory and descriptor to actually enable the endpoint // It could use the same endpoint numbers, as that's supported by ChibiOS // But the QMK code currently assumes that the endpoint numbers are different -# define CONSOLE_OUT_EPNUM (RAW_OUT_EPNUM + 2) + CONSOLE_OUT_EPNUM = NEXT_EPNUM, #else -# define CONSOLE_OUT_EPNUM (RAW_OUT_EPNUM + 1) +#define CONSOLE_OUT_EPNUM CONSOLE_IN_EPNUM #endif -#else -# define CONSOLE_OUT_EPNUM RAW_OUT_EPNUM #endif - -#ifdef NKRO_ENABLE -# define NKRO_IN_EPNUM (CONSOLE_OUT_EPNUM + 1) -#else -# define NKRO_IN_EPNUM CONSOLE_OUT_EPNUM -#endif - #ifdef MIDI_ENABLE -# define MIDI_STREAM_IN_EPNUM (NKRO_IN_EPNUM + 1) -// # define MIDI_STREAM_OUT_EPNUM (NKRO_IN_EPNUM + 1) -# define MIDI_STREAM_OUT_EPNUM (NKRO_IN_EPNUM + 2) + MIDI_STREAM_IN_EPNUM = NEXT_EPNUM, + MIDI_STREAM_OUT_EPNUM = NEXT_EPNUM, # define MIDI_STREAM_IN_EPADDR (ENDPOINT_DIR_IN | MIDI_STREAM_IN_EPNUM) # define MIDI_STREAM_OUT_EPADDR (ENDPOINT_DIR_OUT | MIDI_STREAM_OUT_EPNUM) -#else -# define MIDI_STREAM_OUT_EPNUM NKRO_IN_EPNUM #endif - #ifdef VIRTSER_ENABLE -# define CDC_NOTIFICATION_EPNUM (MIDI_STREAM_OUT_EPNUM + 1) -# define CDC_IN_EPNUM (MIDI_STREAM_OUT_EPNUM + 2) -# define CDC_OUT_EPNUM (MIDI_STREAM_OUT_EPNUM + 3) + CDC_NOTIFICATION_EPNUM = NEXT_EPNUM, + CDC_IN_EPNUM = NEXT_EPNUM, + CDC_OUT_EPNUM = NEXT_EPNUM, # define CDC_NOTIFICATION_EPADDR (ENDPOINT_DIR_IN | CDC_NOTIFICATION_EPNUM) # define CDC_IN_EPADDR (ENDPOINT_DIR_IN | CDC_IN_EPNUM) # define CDC_OUT_EPADDR (ENDPOINT_DIR_OUT | CDC_OUT_EPNUM) -#else -# define CDC_OUT_EPNUM MIDI_STREAM_OUT_EPNUM #endif +}; -#if (defined(PROTOCOL_LUFA) && CDC_OUT_EPNUM > (ENDPOINT_TOTAL_ENDPOINTS - 1)) || \ - (defined(PROTOCOL_CHIBIOS) && CDC_OUT_EPNUM > USB_MAX_ENDPOINTS) -# error "There are not enough available endpoints to support all functions. Remove some in the rules.mk file.(MOUSEKEY, EXTRAKEY, CONSOLE, NKRO, MIDI, SERIAL, STENO)" +#if defined(PROTOCOL_LUFA) +/* LUFA tells us total endpoints including control */ +#define MAX_ENDPOINTS (ENDPOINT_TOTAL_ENDPOINTS - 1) +#elif defined(PROTOCOL_CHIBIOS) +/* ChibiOS gives us number of available user endpoints, not control */ +#define MAX_ENDPOINTS USB_MAX_ENDPOINTS +#endif +/* TODO - ARM_ATSAM */ + + +#if (NEXT_EPNUM - 1) > MAX_ENDPOINTS +# error There are not enough available endpoints to support all functions. Remove some in the rules.mk file. (MOUSEKEY, EXTRAKEY, CONSOLE, NKRO, MIDI, SERIAL, STENO) #endif #define KEYBOARD_EPSIZE 8 +#define SHARED_EPSIZE 32 #define MOUSE_EPSIZE 8 -#define EXTRAKEY_EPSIZE 8 #define RAW_EPSIZE 32 #define CONSOLE_EPSIZE 32 -#define NKRO_EPSIZE 32 #define MIDI_STREAM_EPSIZE 64 #define CDC_NOTIFICATION_EPSIZE 8 #define CDC_EPSIZE 16 From 09813793bedd74c0bb109c6e87e3682bb864479a Mon Sep 17 00:00:00 2001 From: zvecr Date: Fri, 16 Nov 2018 15:37:15 +0000 Subject: [PATCH 523/788] Add configurator support for luddite (#4434) --- keyboards/40percentclub/luddite/info.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 keyboards/40percentclub/luddite/info.json diff --git a/keyboards/40percentclub/luddite/info.json b/keyboards/40percentclub/luddite/info.json new file mode 100644 index 000000000..51d71ec77 --- /dev/null +++ b/keyboards/40percentclub/luddite/info.json @@ -0,0 +1,12 @@ +{ + "keyboard_name": "foobar", + "url": "", + "maintainer": "qmk", + "width": 15, + "height": 5, + "layouts": { + "LAYOUT_60_ansi": { + "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}] + } + } +} From b49f37dce97b1f84659146e7bbe4a55804407072 Mon Sep 17 00:00:00 2001 From: zvecr Date: Fri, 16 Nov 2018 16:35:04 +0000 Subject: [PATCH 524/788] Unify 68keys with mf68 (#4435) * Move 68keys keymap to mf68 folder * Remove 68keys keyboard now its been migrated to mf68 keymap * Migrate 68keys build config to mf68 keymap overrides --- .../mf68/keymaps/68keys/config.h | 15 ++++ .../mf68/keymaps/68keys/keymap.c | 11 +++ .../mf68/keymaps/68keys/readme.md} | 8 +- .../mf68/keymaps/68keys/rules.mk | 5 ++ keyboards/68keys/68keys.c | 6 -- keyboards/68keys/68keys.h | 20 ----- keyboards/68keys/config.h | 42 ---------- keyboards/68keys/info.json | 81 ------------------- keyboards/68keys/keymaps/default/keymap.c | 10 --- keyboards/68keys/rules.mk | 22 ----- 10 files changed, 35 insertions(+), 185 deletions(-) create mode 100644 keyboards/40percentclub/mf68/keymaps/68keys/config.h create mode 100644 keyboards/40percentclub/mf68/keymaps/68keys/keymap.c rename keyboards/{68keys/README.md => 40percentclub/mf68/keymaps/68keys/readme.md} (79%) create mode 100644 keyboards/40percentclub/mf68/keymaps/68keys/rules.mk delete mode 100644 keyboards/68keys/68keys.c delete mode 100644 keyboards/68keys/68keys.h delete mode 100644 keyboards/68keys/config.h delete mode 100644 keyboards/68keys/info.json delete mode 100644 keyboards/68keys/keymaps/default/keymap.c delete mode 100644 keyboards/68keys/rules.mk diff --git a/keyboards/40percentclub/mf68/keymaps/68keys/config.h b/keyboards/40percentclub/mf68/keymaps/68keys/config.h new file mode 100644 index 000000000..a0a576b7b --- /dev/null +++ b/keyboards/40percentclub/mf68/keymaps/68keys/config.h @@ -0,0 +1,15 @@ +#pragma once + +/* USB Device descriptor parameter */ +#undef VENDOR_ID +#undef PRODUCT_ID +#undef DEVICE_VER +#undef MANUFACTURER +#undef PRODUCT +#undef DESCRIPTION +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0A0C +#define DEVICE_VER 0x0068 +#define MANUFACTURER 68Keys.io +#define PRODUCT The 68Keys.io Keyboard +#define DESCRIPTION A 68 keys mechanical keyboard diff --git a/keyboards/40percentclub/mf68/keymaps/68keys/keymap.c b/keyboards/40percentclub/mf68/keymaps/68keys/keymap.c new file mode 100644 index 000000000..3778ea21e --- /dev/null +++ b/keyboards/40percentclub/mf68/keymaps/68keys/keymap.c @@ -0,0 +1,11 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_68_ansi( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_ESC, KC_PGUP, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_PGDN, + KC_CAPSLOCK, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + ) +}; diff --git a/keyboards/68keys/README.md b/keyboards/40percentclub/mf68/keymaps/68keys/readme.md similarity index 79% rename from keyboards/68keys/README.md rename to keyboards/40percentclub/mf68/keymaps/68keys/readme.md index 082a47a75..4b7cdf125 100644 --- a/keyboards/68keys/README.md +++ b/keyboards/40percentclub/mf68/keymaps/68keys/readme.md @@ -2,22 +2,22 @@ Custom [68Keys.io](https://68keys.io) DIY keyboard. -Keyboard Maintainer: [sbstjn](https://sbstjn.com) -Hardware Supported: Pro Micro +Keymap Maintainer: [sbstjn](https://sbstjn.com) +Hardware Supported: mf68 Hardware Availability: [DIY Guide](https://68keys.io) Make example for this keyboard (after setting up your build environment): ```bash $ > cd qmk_firmware/ -$ > make 68keys:default +$ > make 40percentclub/mf68:68keys ``` Example of flashing this keyboard: ```bash $ > cd qmk_firmware/ -$ > make 68keys:default:avrdude +$ > make 40percentclub/mf68:68keys:avrdude ``` 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). diff --git a/keyboards/40percentclub/mf68/keymaps/68keys/rules.mk b/keyboards/40percentclub/mf68/keymaps/68keys/rules.mk new file mode 100644 index 000000000..96ce13fe7 --- /dev/null +++ b/keyboards/40percentclub/mf68/keymaps/68keys/rules.mk @@ -0,0 +1,5 @@ +BOOTLOADER = atmel-dfu + +EXTRAKEY_ENABLE = yes +CONSOLE_ENABLE = no +BACKLIGHT_ENABLE = no diff --git a/keyboards/68keys/68keys.c b/keyboards/68keys/68keys.c deleted file mode 100644 index dcf04e6a3..000000000 --- a/keyboards/68keys/68keys.c +++ /dev/null @@ -1,6 +0,0 @@ -#include "68keys.h" - -void matrix_init_kb(void) -{ - matrix_init_user(); -} diff --git a/keyboards/68keys/68keys.h b/keyboards/68keys/68keys.h deleted file mode 100644 index e8a2c4aee..000000000 --- a/keyboards/68keys/68keys.h +++ /dev/null @@ -1,20 +0,0 @@ -#include "quantum.h" - -#define LAYOUT_68_ansi( \ - K00, K01, K02, K03, K04, K05, K06, K07, K08, K10, K11, K12, K13, K14, K15, K16, \ - K17, K18, K20, K21, K22, K23, K24, K25, K26, K27, K28, K30, K31, K32, K33, K34, \ - K35, K36, K37, K38, K40, K41, K42, K43, K44, K45, K46, K47, K48, \ - K50, K51, K52, K53, K54, K55, K56, K57, K58, K60, K61, K62, K63, \ - K64, K65, K66, K67, K68, K70, K71, K72, K73, K74) \ - { \ - {K00, K01, K02, K03, K04, K05, K06, K07, K08}, \ - {K10, K11, K12, K13, K14, K15, K16, K17, K18}, \ - {K20, K21, K22, K23, K24, K25, K26, K27, K28}, \ - {K30, K31, K32, K33, K34, K35, K36, K37, K38}, \ - {K40, K41, K42, K43, K44, K45, K46, K47, K48}, \ - {K50, K51, K52, K53, K54, K55, K56, K57, K58}, \ - {K60, K61, K62, K63, K64, K65, K66, K67, K68}, \ - { \ - K70, K71, K72, K73, K74 \ - } \ - } diff --git a/keyboards/68keys/config.h b/keyboards/68keys/config.h deleted file mode 100644 index 07c87563d..000000000 --- a/keyboards/68keys/config.h +++ /dev/null @@ -1,42 +0,0 @@ -#pragma once - -#include "config_common.h" - -/* USB Device descriptor parameter */ -#define VENDOR_ID 0xFEED -#define PRODUCT_ID 0x0A0C -#define DEVICE_VER 0x0068 -#define MANUFACTURER 68Keys.io -#define PRODUCT The 68Keys.io Keyboard -#define DESCRIPTION A 68 keys mechanical keyboard - -/* key matrix size */ -#define MATRIX_ROWS 8 -#define MATRIX_COLS 9 - -#define MATRIX_ROW_PINS \ - { \ - B6, B2, B3, B1, F7, F6, F5, F4 \ - } -#define MATRIX_COL_PINS \ - { \ - D3, D2, D1, D0, D4, C6, D7, E6, B4 \ - } -#define UNUSED_PINS - -#define DIODE_DIRECTION COL2ROW - -#define BACKLIGHT_PIN B5 -#define BACKLIGHT_BREATHING -#define BACKLIGHT_LEVELS 3 - -#define DEBOUNCING_DELAY 5 - -/* 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 - -/* key combination for magic key command */ -#define IS_COMMAND() ( \ - keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) diff --git a/keyboards/68keys/info.json b/keyboards/68keys/info.json deleted file mode 100644 index b24e22b0a..000000000 --- a/keyboards/68keys/info.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "keyboard_name": "68Keys.io", - "url": "https://68keys.io", - "maintainer": "qmk", - "width": 17.25, - "height": 5, - "layouts": { - "LAYOUT_68_ansi": { - "layout": [ - { "label": "~", "x": 0, "y": 0 }, - { "label": "!", "x": 1, "y": 0 }, - { "label": "@", "x": 2, "y": 0 }, - { "label": "#", "x": 3, "y": 0 }, - { "label": "$", "x": 4, "y": 0 }, - { "label": "%", "x": 5, "y": 0 }, - { "label": "^", "x": 6, "y": 0 }, - { "label": "&", "x": 7, "y": 0 }, - { "label": "*", "x": 8, "y": 0 }, - { "label": "(", "x": 9, "y": 0 }, - { "label": ")", "x": 10, "y": 0 }, - { "label": "_", "x": 11, "y": 0 }, - { "label": "+", "x": 12, "y": 0 }, - { "label": "Backspace", "x": 13, "y": 0, "w": 2 }, - { "label": "ESC", "x": 15.25, "y": 0 }, - { "label": "PGUP", "x": 16.25, "y": 0 }, - { "label": "Tab", "x": 0, "y": 1, "w": 1.5 }, - { "label": "Q", "x": 1.5, "y": 1 }, - { "label": "W", "x": 2.5, "y": 1 }, - { "label": "E", "x": 3.5, "y": 1 }, - { "label": "R", "x": 4.5, "y": 1 }, - { "label": "T", "x": 5.5, "y": 1 }, - { "label": "Y", "x": 6.5, "y": 1 }, - { "label": "U", "x": 7.5, "y": 1 }, - { "label": "I", "x": 8.5, "y": 1 }, - { "label": "O", "x": 9.5, "y": 1 }, - { "label": "P", "x": 10.5, "y": 1 }, - { "label": "{", "x": 11.5, "y": 1 }, - { "label": "}", "x": 12.5, "y": 1 }, - { "label": "|", "x": 13.5, "y": 1, "w": 1.5 }, - { "label": "DEL", "x": 15.25, "y": 1 }, - { "label": "PGDN", "x": 16.25, "y": 1 }, - { "label": "Caps Lock", "x": 0, "y": 2, "w": 1.75 }, - { "label": "A", "x": 1.75, "y": 2 }, - { "label": "S", "x": 2.75, "y": 2 }, - { "label": "D", "x": 3.75, "y": 2 }, - { "label": "F", "x": 4.75, "y": 2 }, - { "label": "G", "x": 5.75, "y": 2 }, - { "label": "H", "x": 6.75, "y": 2 }, - { "label": "J", "x": 7.75, "y": 2 }, - { "label": "K", "x": 8.75, "y": 2 }, - { "label": "L", "x": 9.75, "y": 2 }, - { "label": ":", "x": 10.75, "y": 2 }, - { "label": "\"", "x": 11.75, "y": 2 }, - { "label": "Enter", "x": 12.75, "y": 2, "w": 2.25 }, - { "label": "Shift", "x": 0, "y": 3, "w": 2.25 }, - { "label": "Z", "x": 2.25, "y": 3 }, - { "label": "X", "x": 3.25, "y": 3 }, - { "label": "C", "x": 4.25, "y": 3 }, - { "label": "V", "x": 5.25, "y": 3 }, - { "label": "B", "x": 6.25, "y": 3 }, - { "label": "N", "x": 7.25, "y": 3 }, - { "label": "M", "x": 8.25, "y": 3 }, - { "label": "<", "x": 9.25, "y": 3 }, - { "label": ">", "x": 10.25, "y": 3 }, - { "label": "?", "x": 11.25, "y": 3 }, - { "label": "Shift", "x": 12.25, "y": 3, "w": 2.75 }, - { "x": 15.25, "y": 3 }, - { "label": "CTRL", "x": 0, "y": 4, "w": 1.25 }, - { "label": "ALT", "x": 1.25, "y": 4, "w": 1.25 }, - { "label": "GUI", "x": 2.5, "y": 4, "w": 1.25 }, - { "x": 3.75, "y": 4, "w": 6.25 }, - { "label": "GUI", "x": 10, "y": 4, "w": 1.25 }, - { "label": "ALT", "x": 11.25, "y": 4, "w": 1.25 }, - { "label": "CTRL", "x": 12.5, "y": 4, "w": 1.25 }, - { "x": 14.25, "y": 4 }, - { "x": 15.25, "y": 4 }, - { "x": 16.25, "y": 4 } - ] - } - } -} diff --git a/keyboards/68keys/keymaps/default/keymap.c b/keyboards/68keys/keymaps/default/keymap.c deleted file mode 100644 index 8f23d2246..000000000 --- a/keyboards/68keys/keymaps/default/keymap.c +++ /dev/null @@ -1,10 +0,0 @@ -#include QMK_KEYBOARD_H -#include "68keys.h" - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = LAYOUT_68_ansi( - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_ESC, KC_PGUP, - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_PGDN, - KC_CAPSLOCK, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, - KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT)}; diff --git a/keyboards/68keys/rules.mk b/keyboards/68keys/rules.mk deleted file mode 100644 index f1a56d496..000000000 --- a/keyboards/68keys/rules.mk +++ /dev/null @@ -1,22 +0,0 @@ -LAYOUTS = 68_ansi - -MCU = atmega32u4 -F_CPU = 16000000 -ARCH = AVR8 -F_USB = $(F_CPU) -OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT -BOOTLOADER = atmel-dfu - -BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration (+1000) -MOUSEKEY_ENABLE = no # Mouse keys (+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control (+450) -CONSOLE_ENABLE = no # Console for debug (+400) -COMMAND_ENABLE = no # Commands for debug and configuration -SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend -NKRO_ENABLE = no # USB Nkey Rollover -BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default -MIDI_ENABLE = no # MIDI controls -UNICODE_ENABLE = no # Unicode -BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -AUDIO_ENABLE = no # Audio output on port C6 - From defcfb4953d49a0fc72ecf49faeac0534aafc190 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20=C4=90or=C4=91evi=C4=87?= Date: Fri, 16 Nov 2018 17:55:37 +0100 Subject: [PATCH 525/788] Update whitefox/konstantin keymap (#4436) * Add more spacing in keymaps * Enable link-time optimization * Disable deprecated TMK actions, change spacing in config.h * Remove unrelated rules.mk options --- .../whitefox/keymaps/konstantin/config.h | 19 +++++++----- .../whitefox/keymaps/konstantin/keymap.c | 30 +++++++++---------- .../whitefox/keymaps/konstantin/rules.mk | 6 ++-- 3 files changed, 28 insertions(+), 27 deletions(-) diff --git a/keyboards/whitefox/keymaps/konstantin/config.h b/keyboards/whitefox/keymaps/konstantin/config.h index d1c3002d2..ee30dbece 100644 --- a/keyboards/whitefox/keymaps/konstantin/config.h +++ b/keyboards/whitefox/keymaps/konstantin/config.h @@ -5,15 +5,18 @@ #undef IS_COMMAND #define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RCTL))) -#define MAGIC_KEY_LAYER0_ALT1 BSLS -#define MAGIC_KEY_BOOTLOADER ESC +#define MAGIC_KEY_LAYER0_ALT1 BSLS +#define MAGIC_KEY_BOOTLOADER ESC -#define MOUSEKEY_DELAY 50 -#define MOUSEKEY_INTERVAL 15 -#define MOUSEKEY_MAX_SPEED 4 -#define MOUSEKEY_TIME_TO_MAX 50 -#define MOUSEKEY_WHEEL_MAX_SPEED 1 -#define MOUSEKEY_WHEEL_TIME_TO_MAX 50 +#define MOUSEKEY_DELAY 50 +#define MOUSEKEY_INTERVAL 15 +#define MOUSEKEY_MAX_SPEED 4 +#define MOUSEKEY_TIME_TO_MAX 50 +#define MOUSEKEY_WHEEL_MAX_SPEED 1 +#define MOUSEKEY_WHEEL_TIME_TO_MAX 50 + +#define NO_ACTION_FUNCTION +#define NO_ACTION_MACRO #define PERMISSIVE_HOLD #define TAPPING_TERM 200 diff --git a/keyboards/whitefox/keymaps/konstantin/keymap.c b/keyboards/whitefox/keymaps/konstantin/keymap.c index 6732d9a01..55db5ca6b 100644 --- a/keyboards/whitefox/keymaps/konstantin/keymap.c +++ b/keyboards/whitefox/keymaps/konstantin/keymap.c @@ -151,11 +151,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘ */ [L_BASE] = LAYOUT_truefox( \ - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL, KC_BSLS,KC_GRV, KC_PSCR, \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC,KC_BSPC, KC_DEL, \ - FN_CAPS,KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_ENT, KC_PGUP, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,RCT_RSF, KC_UP, KC_PGDN, \ - KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, RAL_RGU,FN_FNLK, KC_LEFT,KC_DOWN,KC_RGHT \ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, KC_PSCR, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, KC_DEL, \ + FN_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, RCT_RSF, KC_UP, KC_PGDN, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, RAL_RGU, FN_FNLK, KC_LEFT, KC_DOWN, KC_RGHT \ ), /* Function layer @@ -172,11 +172,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘ */ [L_FN] = LAYOUT_truefox( \ - _______,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, NUMPAD, KC_SLCK,KC_PAUS, \ - KC_BTN4,KC_BTN2,KC_MS_U,KC_BTN1,KC_BTN3,KC_BTN5,_______,_______,_______,KC_MSTP,KC_MPLY,KC_MPRV,KC_MNXT,CLEAR, KC_INS, \ - _______,KC_MS_L,KC_MS_D,KC_MS_R,KC_WH_U,_______,_______,_______,_______,_______,_______,_______, _______, TOP, \ - _______, KC_ACL0,KC_ACL2,KC_WH_L,KC_WH_R,_______,_______,_______,KC_VOLD,KC_VOLU,KC_MUTE,KC_APP, KC_PGUP,BOTTOM, \ - _______,DESKTOP,DSKTP_L, KC_WH_D, DSKTP_R,_______, KC_HOME,KC_PGDN,KC_END \ + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, NUMPAD, KC_SLCK, KC_PAUS, \ + KC_BTN4, KC_BTN2, KC_MS_U, KC_BTN1, KC_BTN3, KC_BTN5, _______, _______, _______, KC_MSTP, KC_MPLY, KC_MPRV, KC_MNXT, CLEAR, KC_INS, \ + _______, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_U, _______, _______, _______, _______, _______, _______, _______, _______, TOP, \ + _______, KC_ACL0, KC_ACL2, KC_WH_L, KC_WH_R, _______, _______, _______, KC_VOLD, KC_VOLU, KC_MUTE, KC_APP, KC_PGUP, BOTTOM, \ + _______, DESKTOP, DSKTP_L, KC_WH_D, DSKTP_R, _______, KC_HOME, KC_PGDN, KC_END \ ), /* Numpad layer @@ -193,10 +193,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘ */ [L_NUMPAD] = LAYOUT_truefox( \ - NUMPAD, _______,_______,_______,_______,_______,_______,KC_P7, KC_P8, KC_P9, KC_PMNS,MINUS, EQUALS, NUMPAD, _______,_______, \ - _______,_______,_______,_______,_______,_______,_______,KC_P4, KC_P5, KC_P6, KC_PPLS,L_PAREN,R_PAREN,_______, _______, \ - _______,_______,_______,_______,_______,_______,_______,KC_P1, KC_P2, KC_P3, KC_PAST,TIMES, KC_PENT, _______, \ - _______, _______,_______,_______,_______,_______,KC_P0, KC_P0, COMMA, KC_PDOT,KC_PSLS,DIVIDE, _______,_______, \ - _______,_______,_______, _______, _______,_______, _______,_______,_______ \ + NUMPAD, _______, _______, _______, _______, _______, _______, KC_P7, KC_P8, KC_P9, KC_PMNS, MINUS, EQUALS, NUMPAD, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, KC_P4, KC_P5, KC_P6, KC_PPLS, L_PAREN, R_PAREN, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, KC_P1, KC_P2, KC_P3, KC_PAST, TIMES, KC_PENT, _______, \ + _______, _______, _______, _______, _______, _______, KC_P0, KC_P0, COMMA, KC_PDOT, KC_PSLS, DIVIDE, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______ \ ), }; diff --git a/keyboards/whitefox/keymaps/konstantin/rules.mk b/keyboards/whitefox/keymaps/konstantin/rules.mk index 8fbc1f3af..96722d1d5 100644 --- a/keyboards/whitefox/keymaps/konstantin/rules.mk +++ b/keyboards/whitefox/keymaps/konstantin/rules.mk @@ -1,15 +1,13 @@ -AUDIO_ENABLE = no BACKLIGHT_ENABLE = no -BLUETOOTH_ENABLE = no BOOTMAGIC_ENABLE = no COMMAND_ENABLE = yes CONSOLE_ENABLE = yes EXTRAKEY_ENABLE = yes -MIDI_ENABLE = no MOUSEKEY_ENABLE = yes NKRO_ENABLE = yes -RGBLIGHT_ENABLE = no SLEEP_LED_ENABLE = no TAP_DANCE_ENABLE = yes UNICODE_ENABLE = yes VISUALIZER_ENABLE = no + +EXTRAFLAGS += -flto From 774bee642685b6349e00603a9fd8a94432a7e893 Mon Sep 17 00:00:00 2001 From: Elliot Powell <32494740+e11i0t23@users.noreply.github.com> Date: Fri, 16 Nov 2018 19:31:44 +0000 Subject: [PATCH 526/788] Moved ep40 to ep/40 for easier adding of next ep keyboard (#4439) * add initial ep40 files * fixed issues * updated keymap * Added media control * Update keyboards/handwired/ep40/rules.mk Co-Authored-By: e11i0t23 <32494740+e11i0t23@users.noreply.github.com> * Fixed requested changes * Fixed more requested changes * Added delete key to layor 1 * Updated defualt keympap to have a Backspace mod del key * removed place holder Co-Authored-By: e11i0t23 <32494740+e11i0t23@users.noreply.github.com> * removed obsolete code Co-Authored-By: e11i0t23 <32494740+e11i0t23@users.noreply.github.com> * Moved ep40 to ep/40 * Fixed file names for moved code * Fixed readme --- keyboards/{handwired/ep40/ep40.c => ep/40/40.c} | 2 +- keyboards/{handwired/ep40/ep40.h => ep/40/40.h} | 0 keyboards/{handwired/ep40 => ep/40}/config.h | 0 keyboards/{handwired/ep40 => ep/40}/info.json | 0 keyboards/{handwired/ep40 => ep/40}/keymaps/default/keymap.c | 0 keyboards/{handwired/ep40 => ep/40}/keymaps/default/readme.md | 0 keyboards/{handwired/ep40 => ep/40}/readme.md | 4 ++-- keyboards/{handwired/ep40 => ep/40}/rules.mk | 0 8 files changed, 3 insertions(+), 3 deletions(-) rename keyboards/{handwired/ep40/ep40.c => ep/40/40.c} (98%) rename keyboards/{handwired/ep40/ep40.h => ep/40/40.h} (100%) rename keyboards/{handwired/ep40 => ep/40}/config.h (100%) rename keyboards/{handwired/ep40 => ep/40}/info.json (100%) rename keyboards/{handwired/ep40 => ep/40}/keymaps/default/keymap.c (100%) rename keyboards/{handwired/ep40 => ep/40}/keymaps/default/readme.md (100%) rename keyboards/{handwired/ep40 => ep/40}/readme.md (77%) rename keyboards/{handwired/ep40 => ep/40}/rules.mk (100%) diff --git a/keyboards/handwired/ep40/ep40.c b/keyboards/ep/40/40.c similarity index 98% rename from keyboards/handwired/ep40/ep40.c rename to keyboards/ep/40/40.c index 257f9fa80..7c235f3ce 100644 --- a/keyboards/handwired/ep40/ep40.c +++ b/keyboards/ep/40/40.c @@ -13,7 +13,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#include "ep40.h" +#include "40.h" void matrix_init_kb(void) { // put your keyboard start-up code here diff --git a/keyboards/handwired/ep40/ep40.h b/keyboards/ep/40/40.h similarity index 100% rename from keyboards/handwired/ep40/ep40.h rename to keyboards/ep/40/40.h diff --git a/keyboards/handwired/ep40/config.h b/keyboards/ep/40/config.h similarity index 100% rename from keyboards/handwired/ep40/config.h rename to keyboards/ep/40/config.h diff --git a/keyboards/handwired/ep40/info.json b/keyboards/ep/40/info.json similarity index 100% rename from keyboards/handwired/ep40/info.json rename to keyboards/ep/40/info.json diff --git a/keyboards/handwired/ep40/keymaps/default/keymap.c b/keyboards/ep/40/keymaps/default/keymap.c similarity index 100% rename from keyboards/handwired/ep40/keymaps/default/keymap.c rename to keyboards/ep/40/keymaps/default/keymap.c diff --git a/keyboards/handwired/ep40/keymaps/default/readme.md b/keyboards/ep/40/keymaps/default/readme.md similarity index 100% rename from keyboards/handwired/ep40/keymaps/default/readme.md rename to keyboards/ep/40/keymaps/default/readme.md diff --git a/keyboards/handwired/ep40/readme.md b/keyboards/ep/40/readme.md similarity index 77% rename from keyboards/handwired/ep40/readme.md rename to keyboards/ep/40/readme.md index 5acd8892d..647842bad 100644 --- a/keyboards/handwired/ep40/readme.md +++ b/keyboards/ep/40/readme.md @@ -4,12 +4,12 @@ A simple 40% keyboard -Keyboard Maintainer: [Elliot Powell](https://reddit.com/u/e11i0t23, https://github.com/e11i0t23) +Keyboard Maintainer: [Elliot Powell](https://github.com/e11i0t23), [/u/e11i0t23 on reddit](https://reddit.com/u/e11i0t23) Hardware Supported: EP40 PCB Hardware Availability: None at the moment Make example for this keyboard (after setting up your build environment): - make ep40:default + make ep/40:default 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). diff --git a/keyboards/handwired/ep40/rules.mk b/keyboards/ep/40/rules.mk similarity index 100% rename from keyboards/handwired/ep40/rules.mk rename to keyboards/ep/40/rules.mk From d9453a93f34a71f5dd5bf8cd2ef75fe21a2dcc7b Mon Sep 17 00:00:00 2001 From: Boy_314 <32818287+Boy-314@users.noreply.github.com> Date: Fri, 16 Nov 2018 17:47:06 -0500 Subject: [PATCH 527/788] Updating Boy_314's XD75 Layout (#4440) * fixed arrow keys and left control * added right shift * latest version * reverted arrow keys * edited readme * added osu layer * updated osu layout * updated osu layout * added full arrow keys to osu layout * in case i mess up creating macros * added the best meme key in the world * added plover steno layer * updated boy314 layout * removed unused layers * added boy314 xd75 layout, inspired by preonic layout * added boy314 xd75 layout, inspired by preonic layout * version 2 of boy314's xd75 layout * added readme notes * updated readme for boy314 xd75 layout * qwerty support, brackets on bottom row, caps lock underglow * fixed readme/ * small changes to allow merging * minor changes to format * fixed up default readme * added numpad and tweaked bottom row --- keyboards/xd75/keymaps/boy_314/keymap.c | 73 ++++++++++++++----------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/keyboards/xd75/keymaps/boy_314/keymap.c b/keyboards/xd75/keymaps/boy_314/keymap.c index 8658fde6e..d807d1d86 100644 --- a/keyboards/xd75/keymaps/boy_314/keymap.c +++ b/keyboards/xd75/keymaps/boy_314/keymap.c @@ -3,9 +3,9 @@ // Layer shorthand #define _DV 0 #define _QW 1 -#define _FN1 2 -#define _FN2 3 -#define _NP 4 +#define _NP 2 +#define _FN1 3 +#define _FN2 4 #define RGBLIGHT_LIGHT_VAL 255 const uint8_t RGBLED_RAINBOW_SWIRL_INTERVALS[] PROGMEM = {10, 10, 10}; @@ -23,7 +23,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------------------------+--------| * | LSHIFT | ; | Q | J | K | X | END | UP | PG DN | M | W | W | V | Z | RSHIFT | * |--------+--------+--------+--------+--------+-----------------+--------+--------+--------+--------+-----------------+--------+--------| - * | LCTRL | DEL | LALT | WIN | FN1 | SPACE | LEFT | DOWN | RIGHT | SPACE | FN2 | [ | ] | { | } | + * | LCTRL | DEL | LALT | WIN | FN1 | SPACE | LEFT | DOWN | RIGHT | SPACE | FN2 | LEFT | DOWN | UP | RIGHT | * '--------------------------------------------------------------------------------------------------------------------------------------' */ @@ -32,7 +32,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { { KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_LBRC, KC_BSLS, KC_RBRC, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH }, { KC_CAPS, KC_A, KC_O, KC_E, KC_U, KC_I, KC_HOME, KC_DEL, KC_PGUP, KC_D, KC_H, KC_T, KC_N, KC_S, KC_ENT }, { KC_LSPO, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_END, KC_UP, KC_PGDN, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSPC }, - { KC_LCTL, KC_DEL, KC_LALT, KC_LGUI, MO(_FN1),KC_SPC, KC_LEFT, KC_DOWN, KC_RGHT, KC_SPC, MO(_FN2),KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR }, + { KC_LCTL, KC_DEL, KC_LALT, KC_LGUI, MO(_FN1),KC_SPC, KC_LEFT, KC_DOWN, KC_RGHT, KC_SPC, MO(_FN2),KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT }, }, /* QWERTY @@ -45,7 +45,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------------------------+--------| * | LSHIFT | Z | X | C | V | B | END | UP | PG DN | N | M | , | . | / | RSHIFT | * |--------+--------+--------+--------+--------+-----------------+--------+--------+--------+--------+-----------------+--------+--------| - * | LCTRL | DEL | LALT | WIN | FN1 | SPACE | LEFT | DOWN | RIGHT | SPACE | FN2 | [ | ] | { | } | + * | LCTRL | DEL | LALT | WIN | FN1 | SPACE | LEFT | DOWN | RIGHT | SPACE | FN2 | LEFT | DOWN | UP | RIGHT | * '--------------------------------------------------------------------------------------------------------------------------------------' */ @@ -54,9 +54,31 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LBRC, KC_BSLS, KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_ENT }, { KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_HOME, KC_DEL, KC_PGUP, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT }, { KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_END, KC_UP, KC_PGDN, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC }, - { KC_LCTL, KC_DEL, KC_LALT, KC_LGUI, MO(_FN1),KC_SPC, KC_LEFT, KC_DOWN, KC_RGHT, KC_SPC, MO(_FN2),KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR }, + { KC_LCTL, KC_DEL, KC_LALT, KC_LGUI, MO(_FN1),KC_SPC, KC_LEFT, KC_DOWN, KC_RGHT, KC_SPC, MO(_FN2),KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT }, }, +/* NUMPAD + * .--------------------------------------------------------------------------------------------------------------------------------------. + * | | | | | | | / | * | - | | | | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | | | | | 7 | 8 | 9 | | | | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | | | | | 4 | 5 | 6 | | | | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | | | | | 1 | 2 | 3 | | | | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | | | | | + | 0 | . | | | | | | | + * '--------------------------------------------------------------------------------------------------------------------------------------' + */ + + [_NP] = { /* NUMPAD */ + { _______, _______, _______, _______, _______, _______, KC_SLSH, KC_ASTR, KC_MINS, _______, _______, _______, _______, _______, _______ }, + { _______, _______, _______, _______, _______, _______, KC_7, KC_8, KC_9, _______, _______, _______, _______, _______, _______ }, + { _______, _______, _______, _______, _______, _______, KC_4, KC_5, KC_6, _______, _______, _______, _______, _______, _______ }, + { _______, _______, _______, _______, _______, _______, KC_1, KC_2, KC_3, _______, _______, _______, _______, _______, _______ }, + { _______, _______, _______, _______, _______, _______, KC_PLUS, KC_0, KC_DOT, _______, _______, _______, _______, _______, _______ }, + }, + /* FUNCTION1 * .--------------------------------------------------------------------------------------------------------------------------------------. * | ` | ! | @ | # | $ | % | | | | ^ | & | * | ( | ) | BACKSP | @@ -84,7 +106,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * .--------------------------------------------------------------------------------------------------------------------------------------. * | ` | 1 | 2 | 3 | 4 | 5 | | | | 6 | 7 | 8 | 9 | 0 | BACKSP | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - * | ` | | | UP | | | RESET |RGB HUE-|RGB HUE+| | | | | | | + * | ` | | | UP | | | RESET |RGB HUE-|RGB HUE+| NUMPAD | | | | | | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| * | DEL | | LEFT | DOWN | RIGHT | | |RGB SAT-|RGB SAT+| DVORAK | - | = | [ | ] | \ | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| @@ -96,32 +118,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_FN2] = { /* FUNCTION2 */ { KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, _______, _______, _______, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC }, - { KC_GRV, _______, _______, KC_UP, _______, _______, RESET, RGB_HUD, RGB_HUI, _______, _______, _______, _______, _______, KC_DEL }, - { KC_DEL, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, RGB_SAD, RGB_SAI, TO(_DV), KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS }, - { _______, _______, _______, _______, _______, _______, _______, RGB_VAD, RGB_VAI, TO(_QW), _______, _______, KC_PGDN, KC_PGUP, _______ }, + { KC_GRV, _______, _______, KC_UP, _______, _______, RESET, RGB_HUD, RGB_HUI, TG(_NP), _______, _______, _______, _______, KC_DEL }, + { KC_DEL, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, RGB_SAD, RGB_SAI, TG(_DV), KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS }, + { _______, _______, _______, _______, _______, _______, _______, RGB_VAD, RGB_VAI, TG(_QW), _______, _______, KC_PGDN, KC_PGUP, _______ }, { _______, _______, _______, _______, _______, _______, _______,RGB_RMOD, RGB_MOD, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY }, - }, - -/* NUMPAD - * .--------------------------------------------------------------------------------------------------------------------------------------. - * | | | | | | / | * | - | | | | | | | | - * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - * | | | | | | 7 | 8 | 9 | | | | | | | | - * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - * | | | | | | 4 | 5 | 6 | | | | | | | | - * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - * | | | | | | 1 | 2 | 3 | | | | | | | | - * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - * | | | | | | 0 | 0 | . | | | | | | | | - * '--------------------------------------------------------------------------------------------------------------------------------------' - */ - - [_NP] = { /* NUMPAD */ - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, } }; @@ -149,6 +149,13 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) return MACRO_NONE; }; +void matrix_init_user(void) { + if (!(host_keyboard_leds() & (1< Date: Sun, 18 Nov 2018 16:52:14 +0100 Subject: [PATCH 528/788] Update to my keymaps and userspace (#4447) * fix to prime o keymap * changed ortho keymaps * added some symbols to lower layer * set lower to be a higher layer than raise * added split layout option with center numpad to prime_o keymap * added some gaming functionality * added alt f4 ortho keymaps and userspace * fixed small error --- .../niu_mini/keymaps/spacebarracecar/keymap.c | 27 +- .../planck/keymaps/spacebarracecar/keymap.c | 25 +- .../prime_o/keymaps/spacebarracecar/keymap.c | 392 ++++++++++++------ .../prime_o/keymaps/spacebarracecar/readme.md | 2 +- users/spacebarracecar/spacebarracecar.h | 2 + 5 files changed, 303 insertions(+), 145 deletions(-) diff --git a/keyboards/niu_mini/keymaps/spacebarracecar/keymap.c b/keyboards/niu_mini/keymaps/spacebarracecar/keymap.c index c3f6fb09a..9bee87f38 100644 --- a/keyboards/niu_mini/keymaps/spacebarracecar/keymap.c +++ b/keyboards/niu_mini/keymaps/spacebarracecar/keymap.c @@ -6,8 +6,8 @@ enum layers { _BASE, - _LOWER, - _RAISE + _RAISE, + _LOWER }; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { @@ -45,7 +45,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_LOWER] = LAYOUT_ortho_4x12( DE_TILD, DE_EXLM, DE_DQOT, DE_HASH, DE_DLR, DE_PERC, CU_CIRC, DE_AMPR, DE_ASTR, DE_LPRN, DE_RPRN, _______, _______, DE_AT, CTRLX, CTRLC, CTRLV, XXXXXXX, XXXXXXX, DE_UNDS, DE_PLUS, DE_LCBR, DE_RCBR, DE_PIPE, - _______, DE_EURO, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, + _______, DE_EURO, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, DE_MINS, CU_EQL, CU_LBRC, CU_RBRC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), @@ -64,7 +64,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_RAISE] = LAYOUT_ortho_4x12( CU_GRV, DE_1, DE_2, CU_3, DE_4, DE_5, CU_6, CU_7, CU_8, CU_9, CU_0, _______, _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, DE_MINS, CU_EQL, CU_LBRC, CU_RBRC, CU_BSLS, - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), @@ -89,21 +89,21 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Navigation ,-----------------------------------------------------------------------------------------------------------------------. -|ESCT |PageDown |Up |PageUp |Home | | | |Win+Up | | |Del | +|ALT F4 |PageDown |Up |PageUp |Home | | | |Win+Up | | |Del | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| | |Left |Down |Right |End | | |Win+Left |Win+Down |Win+Right| |Enter | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| | |Prev |Pause |Next |LowerVol |RaiseVol |Mute | | | | | | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|RESET | | | | | | | | | | |Game | +|RESET |ESCT | | | | | | | | | |Game | `-----------------------------------------------------------------------------------------------------------------------' */ [_NAV] = LAYOUT_ortho_4x12( - CU_ESCT, KC_PGDN, KC_UP, KC_PGUP, KC_HOME, XXXXXXX, XXXXXXX, XXXXXXX, GUIU, XXXXXXX, XXXXXXX, KC_DEL, + ALTF4, KC_PGDN, KC_UP, KC_PGUP, KC_HOME, XXXXXXX, XXXXXXX, XXXXXXX, GUIU, XXXXXXX, XXXXXXX, KC_DEL, _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, XXXXXXX, XXXXXXX, GUIL, GUID, GUIR, RGB_M_P, KC_ENT, _______, KC_MPRV, KC_MPLY, KC_MNXT, KC_VOLD, KC_VOLU, KC_MUTE, RGB_TOG, RGB_MOD, RGB_HUI, CU_RGBV, _______, - RESET, _______, _______, _______, _______, KC_SPC, KC_ENT, _______, _______, _______, _______, CU_GAME + RESET, CU_ESCT, _______, _______, _______, KC_SPC, KC_ENT, _______, _______, _______, _______, CU_GAME ) }; @@ -121,6 +121,17 @@ switch (keycode) { } else { return true; } + case KC_LALT: + if (game) { + if (record->event.pressed){ + layer_on(_RAISE); + } else { + layer_off(_RAISE); + } + return false; + } else { + return true; + } default: return true; } diff --git a/keyboards/planck/keymaps/spacebarracecar/keymap.c b/keyboards/planck/keymaps/spacebarracecar/keymap.c index db91231bf..b1c0e3148 100644 --- a/keyboards/planck/keymaps/spacebarracecar/keymap.c +++ b/keyboards/planck/keymaps/spacebarracecar/keymap.c @@ -6,8 +6,8 @@ enum layers { _BASE, - _LOWER, _RAISE, + _LOWER, _MUSICMODE }; @@ -46,7 +46,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_LOWER] = LAYOUT_ortho_4x12( DE_TILD, DE_EXLM, DE_DQOT, DE_HASH, DE_DLR, DE_PERC, CU_CIRC, DE_AMPR, DE_ASTR, DE_LPRN, DE_RPRN, _______, _______, DE_AT, CTRLX, CTRLC, CTRLV, XXXXXXX, XXXXXXX, DE_UNDS, DE_PLUS, DE_LCBR, DE_RCBR, DE_PIPE, - _______, DE_EURO, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, + _______, DE_EURO, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, DE_MINS, CU_EQL, CU_LBRC, CU_RBRC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), @@ -65,7 +65,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_RAISE] = LAYOUT_ortho_4x12( CU_GRV, DE_1, DE_2, CU_3, DE_4, DE_5, CU_6, CU_7, CU_8, CU_9, CU_0, _______, _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, DE_MINS, CU_EQL, CU_LBRC, CU_RBRC, CU_BSLS, - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), @@ -97,21 +97,21 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Navigation ,-----------------------------------------------------------------------------------------------------------------------. -|ESCT |PageDown |Up |PageUp |Home | | | |Win+Up | | |Del | +|ALT F4 |PageDown |Up |PageUp |Home | | | |Win+Up | | |Del | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| | |Left |Down |Right |End | | |Win+Left |Win+Down |Win+Right| |Enter | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| | |Prev |Pause |Next |LowerVol |RaiseVol |Mute | | | | | | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|RESET | | | | | | | | | | |Game | +|RESET |ESCT | | | | | | | | | |Game | `-----------------------------------------------------------------------------------------------------------------------' */ [_NAV] = LAYOUT_ortho_4x12( - CU_ESCT, KC_PGDN, KC_UP, KC_PGUP, KC_HOME, XXXXXXX, XXXXXXX, XXXXXXX, GUIU, XXXXXXX, XXXXXXX, KC_DEL, + ALTF4, KC_PGDN, KC_UP, KC_PGUP, KC_HOME, XXXXXXX, XXXXXXX, XXXXXXX, GUIU, XXXXXXX, XXXXXXX, KC_DEL, _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, XXXXXXX, XXXXXXX, GUIL, GUID, GUIR, XXXXXXX, KC_ENT, _______, KC_MPRV, KC_MPLY, KC_MNXT, KC_VOLD, KC_VOLU, KC_MUTE, MU_ON, XXXXXXX, XXXXXXX, XXXXXXX, _______, - RESET, _______, _______, _______, _______, KC_SPC, KC_ENT, _______, _______, _______, _______, CU_GAME + RESET, CU_ESCT, _______, _______, _______, KC_SPC, KC_ENT, _______, _______, _______, _______, CU_GAME ) }; @@ -129,6 +129,17 @@ switch (keycode) { } else { return true; } + case KC_LALT: + if (game) { + if (record->event.pressed){ + layer_on(_RAISE); + } else { + layer_off(_RAISE); + } + return false; + } else { + return true; + } case MU_ON: if(record->event.pressed) { layer_off(_LOWER); diff --git a/keyboards/primekb/prime_o/keymaps/spacebarracecar/keymap.c b/keyboards/primekb/prime_o/keymaps/spacebarracecar/keymap.c index d38ff0d1d..6e2011770 100644 --- a/keyboards/primekb/prime_o/keymaps/spacebarracecar/keymap.c +++ b/keyboards/primekb/prime_o/keymaps/spacebarracecar/keymap.c @@ -8,135 +8,15 @@ enum layers { _BASE, - _LOWER, _RAISE, + _LOWER, _GAME = _NAV+1 }; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -#ifndef LEFTNUM -/* Base -,---------------------------------------------------------------------------------------------------------------------------------------------------------------. -|` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 |\ |Numlock |/ |* |= | -|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|Tab |Q |W |E |R |T |Z |U |I |O |P |Backspace|7 |8 |9 |- | -|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|Esc/Nav |A |S |D |F |G |H |J |K |L |; |' |4 |5 |6 |+ | -|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|(/LShift |Y |X |C |V |B |N |M |, |. |/ |)/RShift |1 |2 |3 |Enter | -|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|RCtrl | |Alt |Win |Lower |Space |Enter |Raise |Win |AltGr | |LCtrl |00 |0 |. |Tab | -`---------------------------------------------------------------------------------------------------------------------------------------------------------------' -*/ - -[_BASE] = LAYOUT( - CU_GRV, DE_1, DE_2, CU_3, DE_4, DE_5, CU_6, CU_7, CU_8, CU_9, CU_0, CU_BSLS, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, - KC_TAB, DE_Q, DE_W, DE_E, DE_R, DE_T, CU_Z, DE_U, DE_I, DE_O, DE_P, KC_BSPC, KC_P7, KC_P8, KC_P9, KC_PPLS, - CU_NAV, DE_A, DE_S, DE_D, DE_F, DE_G, DE_H, DE_J, DE_K, DE_L, CU_SCLN, CU_QUOT, KC_P4, KC_P5, KC_P6, KC_PEQL, - CU_LSFT, CU_Y, DE_X, DE_C, DE_V, DE_B, DE_N, DE_M, CU_COMM, CU_DOT, CU_SLSH, CU_RSFT, KC_P1, KC_P2, KC_P3, KC_PENT, - KC_LCTL, XXXXXXX, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_ENT, RAISE, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_P00, KC_P0, KC_PDOT, KC_TAB -), - -/* Lower -,---------------------------------------------------------------------------------------------------------------------------------------------------------------. -|` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 | |Numlock |/ |* |- | -|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|~ |! |" |# |$ |% |^ |& |* |( |) | |7 |8 |9 |+ | -|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -| |@ |Strg+X |Strg+C |Strg+V | | |_ |+ |{ |} || |4 |5 |6 |= | -|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -| |? | | | | | | | | | | |1 |2 |3 |Enter | -|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -| | | | | | | | | | | | |00 |0 |. |Tab | -`---------------------------------------------------------------------------------------------------------------------------------------------------------------' -*/ - -[_LOWER] = LAYOUT( - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - DE_TILD, DE_EXLM, DE_DQOT, DE_HASH, DE_DLR, DE_PERC, CU_CIRC, DE_AMPR, DE_ASTR, DE_LPRN, DE_RPRN, _______, _______, _______, _______, _______, - _______, DE_AT, CTRLX, CTRLC, CTRLV, XXXXXXX, XXXXXXX, DE_UNDS, DE_PLUS, DE_LCBR, DE_RCBR, DE_PIPE, _______, _______, _______, _______, - _______, DE_EURO, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ -), - -/* Raise -,---------------------------------------------------------------------------------------------------------------------------------------------------------------. -|` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 | |Numlock |/ |* |- | -|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 | |7 |8 |9 |+ | -|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -| |F1 |F2 |F3 |F4 |F5 |F6 |- |= |[ |] |\ |4 |5 |6 |= | -|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -| |F7 |F8 |F9 |F10 |F11 |F12 | | | | | |1 |2 |3 |Enter | -|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -| | | | | | | | | | | | |00 |0 |. |Tab | -`---------------------------------------------------------------------------------------------------------------------------------------------------------------' -*/ - -[_RAISE] = LAYOUT( - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - CU_GRV, DE_1, DE_2, CU_3, DE_4, DE_5, CU_6, CU_7, CU_8, CU_9, CU_0, _______, _______, _______, _______, _______, - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, DE_MINS, CU_EQL, CU_LBRC, CU_RBRC, CU_BSLS, _______, _______, _______, _______, - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ -), - -/* Deadkey -,---------------------------------------------------------------------------------------------------------------------------------------------------------------. -| | | | | | | | | | | | |Numlock |/ |* |- | -|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -| | | | | | | |Ü | |Ö | | |7 |8 |9 |+ | -|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -| |Ä |ß | | | | | | | | | |4 |5 |6 |= | -|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -| | | | | | | | | | | | |1 |2 |3 |Enter | -|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -| | | | | |" |" | | | | | |00 |0 |. |Tab | -`---------------------------------------------------------------------------------------------------------------------------------------------------------------' -*/ - -[_DEADKEY] = LAYOUT( - CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, _______, _______, _______, _______, - KC_TAB, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_UE, CU_ED, CU_OE, CU_ED, _______, _______, _______, _______, _______, - _______, CU_AE, CU_SS, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_DDQ, _______, _______, _______, _______, - _______, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, CU_DDQ, CU_DDQ, _______, _______, _______, _______, _______, _______, _______, _______, _______ -), - -/* Navigation -,---------------------------------------------------------------------------------------------------------------------------------------------------------------. -|Escape | | | | | | | | | | | |Numlock |/ |* |- | -|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|ESCT |PageDown |Up |PageUp |Home | | | |Win+Up | | |Del |7 |8 |9 |+ | -|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -| |Left |Down |Right |End | | |Win+Left |Win+Down |Win+Right| |Enter |4 |5 |6 |= | -|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -| |Prev |Pause |Next |LowerVol |RaiseVol |Mute | | | | | |1 |2 |3 |Enter | -|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|RESET | | | | | | | | | | |Game |00 |0 |. |Tab | -`---------------------------------------------------------------------------------------------------------------------------------------------------------------' -*/ - -[_NAV] = LAYOUT( - KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, - CU_ESCT, KC_PGDN, KC_UP, KC_PGUP, KC_HOME, XXXXXXX, XXXXXXX, XXXXXXX, GUIU, XXXXXXX, XXXXXXX, KC_DEL, _______, _______, _______, _______, - _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, XXXXXXX, XXXXXXX, GUIL, GUID, GUIR, XXXXXXX, KC_ENT, _______, _______, _______, _______, - _______, KC_MPRV, KC_MPLY, KC_MNXT, KC_VOLD, KC_VOLU, KC_MUTE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, _______, - RESET, _______, _______, _______, _______, KC_SPC, KC_ENT, _______, _______, _______, _______, CU_GAME, _______, _______, _______, _______ -), - -// Can be used to place macros on the numpad -[_GAME] = LAYOUT( - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ -) -#endif - #ifdef LEFTNUM + /* Base ,---------------------------------------------------------------------------------------------------------------------------------------------------------------. |- |* |/ |Numlock |` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 |\ | @@ -154,7 +34,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_BASE] = LAYOUT( KC_PMNS, KC_PAST, KC_PSLS, KC_NLCK, CU_GRV, DE_1, DE_2, CU_3, DE_4, DE_5, CU_6, CU_7, CU_8, CU_9, CU_0, CU_BSLS, KC_PPLS, KC_P7, KC_P8, KC_P9, KC_TAB, DE_Q, DE_W, DE_E, DE_R, DE_T, CU_Z, DE_U, DE_I, DE_O, DE_P, KC_BSPC, - KC_PEQL, KC_P4, KC_P5, KC_P6, CU_NAV, DE_A, DE_S, DE_D, DE_F, DE_G, DE_H, DE_J, DE_K, DE_L, CU_SCLN, CU_QUOT, + CU_EQL, KC_P4, KC_P5, KC_P6, CU_NAV, DE_A, DE_S, DE_D, DE_F, DE_G, DE_H, DE_J, DE_K, DE_L, CU_SCLN, CU_QUOT, KC_PENT, KC_P1, KC_P2, KC_P3, CU_LSFT, CU_Y, DE_X, DE_C, DE_V, DE_B, DE_N, DE_M, CU_COMM, CU_DOT, CU_SLSH, CU_RSFT, KC_BSPC, KC_PDOT, KC_P0, KC_P00, KC_LCTL, XXXXXXX, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_ENT, RAISE, KC_RALT, KC_RGUI, KC_APP, KC_RCTL ), @@ -177,7 +57,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, DE_TILD, DE_EXLM, DE_DQOT, DE_HASH, DE_DLR, DE_PERC, CU_CIRC, DE_AMPR, DE_ASTR, DE_LPRN, DE_RPRN, _______, _______, _______, _______, _______, _______, DE_AT, CTRLX, CTRLC, CTRLV, XXXXXXX, XXXXXXX, DE_UNDS, DE_PLUS, DE_LCBR, DE_RCBR, DE_PIPE, - _______, _______, _______, _______, _______, DE_EURO, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, + _______, _______, _______, _______, _______, DE_EURO, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, DE_MINS, CU_EQL, CU_LBRC, CU_RBRC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), @@ -199,7 +79,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, CU_GRV, DE_1, DE_2, CU_3, DE_4, DE_5, CU_6, CU_7, CU_8, CU_9, CU_0, _______, _______, _______, _______, _______, _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, DE_MINS, CU_EQL, CU_LBRC, CU_RBRC, CU_BSLS, - _______, _______, _______, _______, _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), @@ -229,22 +109,22 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ,---------------------------------------------------------------------------------------------------------------------------------------------------------------. |- |* |/ |Numlock |Escape | | | | | | | | | | | | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|+ |7 |8 |9 |ESCT |PageDown |Up |PageUp |Home | | | |Win+Up | | |Del | +|+ |7 |8 |9 |ALT F4 |PageDown |Up |PageUp |Home | | | |Win+Up | | |Del | |---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| |= |4 |5 |6 | |Left |Down |Right |End | | |Win+Left |Win+Down |Win+Right| |Enter | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| |Enter |1 |2 |3 | |Prev |Pause |Next |LowerVol |RaiseVol |Mute | | | | | | |---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|Backspace|. |0 |00 |RESET | | | | | | | | | | |Game | +|Backspace|. |0 |00 |RESET |ESCT | | | | | | | | | |Game | `---------------------------------------------------------------------------------------------------------------------------------------------------------------' */ [_NAV] = LAYOUT( _______, _______, _______, _______, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - _______, _______, _______, _______, CU_ESCT, KC_PGDN, KC_UP, KC_PGUP, KC_HOME, XXXXXXX, XXXXXXX, XXXXXXX, GUIU, XXXXXXX, XXXXXXX, KC_DEL, + _______, _______, _______, _______, ALTF4, KC_PGDN, KC_UP, KC_PGUP, KC_HOME, XXXXXXX, XXXXXXX, XXXXXXX, GUIU, XXXXXXX, XXXXXXX, KC_DEL, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, XXXXXXX, XXXXXXX, GUIL, GUID, GUIR, XXXXXXX, KC_ENT, _______, _______, _______, _______, _______, KC_MPRV, KC_MPLY, KC_MNXT, KC_VOLD, KC_VOLU, KC_MUTE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, - _______, _______, _______, _______, RESET, _______, _______, _______, _______, KC_SPC, KC_ENT, _______, _______, _______, _______, CU_GAME + _______, _______, _______, _______, RESET, CU_ESCT, _______, _______, _______, KC_SPC, KC_ENT, _______, _______, _______, _______, CU_GAME ), // Can be used to place macros on the numpad @@ -255,6 +135,249 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ) + +#elif defined CENTERNUM + +/* Base +,---------------------------------------------------------------------------------------------------------------------------------------------------------------. +|` |1 |2 |3 |4 |5 |Numlock |/ |* |= |6 |7 |8 |9 |0 |\ | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Tab |Q |W |E |R |T |7 |8 |9 |- |Z |U |I |O |P |Backspace| +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Esc/Nav |A |S |D |F |G |4 |5 |6 |+ |H |J |K |L |; |' | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|(/LShift |Y |X |C |V |B |1 |2 |3 |Enter |N |M |, |. |/ |)/RShift | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|RCtrl | |Alt |Win |Lower |Space |00 |0 |. |Tab |Enter |Raise |Win |AltGr | |LCtrl | +`---------------------------------------------------------------------------------------------------------------------------------------------------------------' +*/ + +[_BASE] = LAYOUT( + CU_GRV, DE_1, DE_2, CU_3, DE_4, DE_5, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, CU_6, CU_7, CU_8, CU_9, CU_0, CU_BSLS, + KC_TAB, DE_Q, DE_W, DE_E, DE_R, DE_T, KC_P7, KC_P8, KC_P9, KC_PPLS, CU_Z, DE_U, DE_I, DE_O, DE_P, KC_BSPC, + CU_NAV, DE_A, DE_S, DE_D, DE_F, DE_G, KC_P4, KC_P5, KC_P6, CU_EQL, DE_H, DE_J, DE_K, DE_L, CU_SCLN, CU_QUOT, + CU_LSFT, CU_Y, DE_X, DE_C, DE_V, DE_B, KC_P1, KC_P2, KC_P3, KC_PENT, DE_N, DE_M, CU_COMM, CU_DOT, CU_SLSH, CU_RSFT, + KC_LCTL, XXXXXXX, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_P00, KC_P0, KC_PDOT, KC_TAB, KC_ENT, RAISE, KC_RALT, KC_RGUI, KC_APP, KC_RCTL +), + +/* Lower +,---------------------------------------------------------------------------------------------------------------------------------------------------------------. +|` |1 |2 |3 |4 |5 |Numlock |/ |* |- |6 |7 |8 |9 |0 | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|~ |! |" |# |$ |% |7 |8 |9 |+ |^ |& |* |( |) | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |@ |Strg+X |Strg+C |Strg+V | |4 |5 |6 |= | |_ |+ |{ |} || | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |? | | | | |1 |2 |3 |Enter | | | | | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | | |00 |0 |. |Tab | | | | | | | +`---------------------------------------------------------------------------------------------------------------------------------------------------------------' +*/ + +[_LOWER] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + DE_TILD, DE_EXLM, DE_DQOT, DE_HASH, DE_DLR, DE_PERC, _______, _______, _______, _______, CU_CIRC, DE_AMPR, DE_ASTR, DE_LPRN, DE_RPRN, _______, + _______, DE_AT, CTRLX, CTRLC, CTRLV, XXXXXXX, _______, _______, _______, _______, XXXXXXX, DE_UNDS, DE_PLUS, DE_LCBR, DE_RCBR, DE_PIPE, + _______, DE_EURO, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, XXXXXXX, DE_MINS, CU_EQL, CU_LBRC, CU_RBRC, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +/* Raise +,---------------------------------------------------------------------------------------------------------------------------------------------------------------. +|` |1 |2 |3 |4 |5 |Numlock |/ |* |- |6 |7 |8 |9 |0 | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|` |1 |2 |3 |4 |5 |7 |8 |9 |+ |6 |7 |8 |9 |0 | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |F1 |F2 |F3 |F4 |F5 |4 |5 |6 |= |F6 |- |= |[ |] |\ | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |F7 |F8 |F9 |F10 |F11 |1 |2 |3 |Enter |F12 | | | | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | | |00 |0 |. |Tab | | | | | | | +`---------------------------------------------------------------------------------------------------------------------------------------------------------------' +*/ + +[_RAISE] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + CU_GRV, DE_1, DE_2, CU_3, DE_4, DE_5, _______, _______, _______, _______, CU_6, CU_7, CU_8, CU_9, CU_0, _______, + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, _______, _______, _______, KC_F6, DE_MINS, CU_EQL, CU_LBRC, CU_RBRC, CU_BSLS, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, _______, _______, _______, _______, KC_F12, XXXXXXX, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +/* Deadkey +,---------------------------------------------------------------------------------------------------------------------------------------------------------------. +| | | | | | |Numlock |/ |* |- | | | | | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | | |7 |8 |9 |+ | |Ü | |Ö | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |Ä |ß | | | |4 |5 |6 |= | | | | | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | | |1 |2 |3 |Enter | | | | | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | |" |00 |0 |. |Tab |" | | | | | | +`---------------------------------------------------------------------------------------------------------------------------------------------------------------' +*/ + +[_DEADKEY] = LAYOUT( + CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, _______, _______, _______, _______, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, + KC_TAB, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, _______, _______, _______, _______, CU_ED, CU_UE, CU_ED, CU_OE, CU_ED, _______, + _______, CU_AE, CU_SS, CU_ED, CU_ED, CU_ED, _______, _______, _______, _______, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_DDQ, + _______, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, _______, _______, _______, _______, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, _______, + _______, _______, _______, _______, _______, CU_DDQ, _______, _______, _______, _______, CU_DDQ, _______, _______, _______, _______, _______ +), + +/* Navigation +,---------------------------------------------------------------------------------------------------------------------------------------------------------------. +|Escape | | | | | |Numlock |/ |* |- | | | | | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|ALT F4 |PageDown |Up |PageUp |Home | |7 |8 |9 |+ | | |Win+Up | | |Del | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |Left |Down |Right |End | |4 |5 |6 |= | |Win+Left |Win+Down |Win+Right| |Enter | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |Prev |Pause |Next |LowerVol |RaiseVol |1 |2 |3 |Enter |Mute | | | | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|RESET |ESCT | | | | |00 |0 |. |Tab | | | | | |Game | +`---------------------------------------------------------------------------------------------------------------------------------------------------------------' +*/ + +[_NAV] = LAYOUT( + KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + ALTF4, KC_PGDN, KC_UP, KC_PGUP, KC_HOME, XXXXXXX, _______, _______, _______, _______, XXXXXXX, XXXXXXX, GUIU, XXXXXXX, XXXXXXX, KC_DEL, + _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, XXXXXXX, _______, _______, _______, _______, XXXXXXX, GUIL, GUID, GUIR, XXXXXXX, KC_ENT, + _______, KC_MPRV, KC_MPLY, KC_MNXT, KC_VOLD, KC_VOLU, _______, _______, _______, _______, KC_MUTE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, + RESET, CU_ESCT, _______, _______, _______, KC_SPC, _______, _______, _______, _______, KC_ENT, _______, _______, _______, _______, CU_GAME +), + +// Can be used to place macros on the numpad +[_GAME] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +) + +#else + +/* Base +,---------------------------------------------------------------------------------------------------------------------------------------------------------------. +|` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 |\ |Numlock |/ |* |= | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Tab |Q |W |E |R |T |Z |U |I |O |P |Backspace|7 |8 |9 |- | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Esc/Nav |A |S |D |F |G |H |J |K |L |; |' |4 |5 |6 |+ | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|(/LShift |Y |X |C |V |B |N |M |, |. |/ |)/RShift |1 |2 |3 |Enter | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|RCtrl | |Alt |Win |Lower |Space |Enter |Raise |Win |AltGr | |LCtrl |00 |0 |. |Tab | +`---------------------------------------------------------------------------------------------------------------------------------------------------------------' +*/ + +[_BASE] = LAYOUT( + CU_GRV, DE_1, DE_2, CU_3, DE_4, DE_5, CU_6, CU_7, CU_8, CU_9, CU_0, CU_BSLS, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, + KC_TAB, DE_Q, DE_W, DE_E, DE_R, DE_T, CU_Z, DE_U, DE_I, DE_O, DE_P, KC_BSPC, KC_P7, KC_P8, KC_P9, KC_PPLS, + CU_NAV, DE_A, DE_S, DE_D, DE_F, DE_G, DE_H, DE_J, DE_K, DE_L, CU_SCLN, CU_QUOT, KC_P4, KC_P5, KC_P6, CU_EQL, + CU_LSFT, CU_Y, DE_X, DE_C, DE_V, DE_B, DE_N, DE_M, CU_COMM, CU_DOT, CU_SLSH, CU_RSFT, KC_P1, KC_P2, KC_P3, KC_PENT, + KC_LCTL, XXXXXXX, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_ENT, RAISE, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_P00, KC_P0, KC_PDOT, KC_TAB +), + +/* Lower +,---------------------------------------------------------------------------------------------------------------------------------------------------------------. +|` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 | |Numlock |/ |* |- | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|~ |! |" |# |$ |% |^ |& |* |( |) | |7 |8 |9 |+ | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |@ |Strg+X |Strg+C |Strg+V | | |_ |+ |{ |} || |4 |5 |6 |= | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |? | | | | | | | | | | |1 |2 |3 |Enter | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | | | | | | | | |00 |0 |. |Tab | +`---------------------------------------------------------------------------------------------------------------------------------------------------------------' +*/ + +[_LOWER] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + DE_TILD, DE_EXLM, DE_DQOT, DE_HASH, DE_DLR, DE_PERC, CU_CIRC, DE_AMPR, DE_ASTR, DE_LPRN, DE_RPRN, _______, _______, _______, _______, _______, + _______, DE_AT, CTRLX, CTRLC, CTRLV, XXXXXXX, XXXXXXX, DE_UNDS, DE_PLUS, DE_LCBR, DE_RCBR, DE_PIPE, _______, _______, _______, _______, + _______, DE_EURO, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, DE_MINS, CU_EQL, CU_LBRC, CU_RBRC, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +/* Raise +,---------------------------------------------------------------------------------------------------------------------------------------------------------------. +|` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 | |Numlock |/ |* |- | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 | |7 |8 |9 |+ | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |F1 |F2 |F3 |F4 |F5 |F6 |- |= |[ |] |\ |4 |5 |6 |= | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |F7 |F8 |F9 |F10 |F11 |F12 | | | | | |1 |2 |3 |Enter | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | | | | | | | | |00 |0 |. |Tab | +`---------------------------------------------------------------------------------------------------------------------------------------------------------------' +*/ + +[_RAISE] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + CU_GRV, DE_1, DE_2, CU_3, DE_4, DE_5, CU_6, CU_7, CU_8, CU_9, CU_0, _______, _______, _______, _______, _______, + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, DE_MINS, CU_EQL, CU_LBRC, CU_RBRC, CU_BSLS, _______, _______, _______, _______, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +/* Deadkey +,---------------------------------------------------------------------------------------------------------------------------------------------------------------. +| | | | | | | | | | | | |Numlock |/ |* |- | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | | | |Ü | |Ö | | |7 |8 |9 |+ | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |Ä |ß | | | | | | | | | |4 |5 |6 |= | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | | | | | | | | |1 |2 |3 |Enter | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | |" |" | | | | | |00 |0 |. |Tab | +`---------------------------------------------------------------------------------------------------------------------------------------------------------------' +*/ + +[_DEADKEY] = LAYOUT( + CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, _______, _______, _______, _______, + KC_TAB, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_UE, CU_ED, CU_OE, CU_ED, _______, _______, _______, _______, _______, + _______, CU_AE, CU_SS, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_DDQ, _______, _______, _______, _______, + _______, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, CU_DDQ, CU_DDQ, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +/* Navigation +,---------------------------------------------------------------------------------------------------------------------------------------------------------------. +|Escape | | | | | | | | | | | |Numlock |/ |* |- | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|ALT F4 |PageDown |Up |PageUp |Home | | | |Win+Up | | |Del |7 |8 |9 |+ | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |Left |Down |Right |End | | |Win+Left |Win+Down |Win+Right| |Enter |4 |5 |6 |= | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |Prev |Pause |Next |LowerVol |RaiseVol |Mute | | | | | |1 |2 |3 |Enter | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|RESET |ESCT | | | | | | | | | |Game |00 |0 |. |Tab | +`---------------------------------------------------------------------------------------------------------------------------------------------------------------' +*/ + +[_NAV] = LAYOUT( + KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, + ALTF4, KC_PGDN, KC_UP, KC_PGUP, KC_HOME, XXXXXXX, XXXXXXX, XXXXXXX, GUIU, XXXXXXX, XXXXXXX, KC_DEL, _______, _______, _______, _______, + _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, XXXXXXX, XXXXXXX, GUIL, GUID, GUIR, XXXXXXX, KC_ENT, _______, _______, _______, _______, + _______, KC_MPRV, KC_MPLY, KC_MNXT, KC_VOLD, KC_VOLU, KC_MUTE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, _______, + RESET, CU_ESCT, _______, _______, _______, KC_SPC, KC_ENT, _______, _______, _______, _______, CU_GAME, _______, _______, _______, _______ +), + +// Can be used to place macros on the numpad +[_GAME] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +) + #endif }; @@ -272,6 +395,17 @@ switch (keycode) { } else { return true; } + case KC_LALT: + if (game) { + if (record->event.pressed){ + layer_on(_RAISE); + } else { + layer_off(_RAISE); + } + return false; + } else { + return true; + } case CU_GAME: if(record->event.pressed) { if (game) diff --git a/keyboards/primekb/prime_o/keymaps/spacebarracecar/readme.md b/keyboards/primekb/prime_o/keymaps/spacebarracecar/readme.md index eb8da3fa7..7e78330f0 100644 --- a/keyboards/primekb/prime_o/keymaps/spacebarracecar/readme.md +++ b/keyboards/primekb/prime_o/keymaps/spacebarracecar/readme.md @@ -3,4 +3,4 @@ This keymap emulates most keys of the US-International layout on PCs that have German set as input language. This allows the use of the keyboard on any PC in Germany without the need to change any settings. The keymap is mostly based on the Planck default layout but adds essential features for german input, like access to Ä, Ö, Ü, ß. -Righthand Numpad is enabled by default, enable lefthand Numpad with #define LEFTNUM. +Righthand numpad is enabled by default, enable lefthand numpad with #define LEFTNUM and center numpad with #define CENTERNUM. diff --git a/users/spacebarracecar/spacebarracecar.h b/users/spacebarracecar/spacebarracecar.h index 1e1825351..035c1ac79 100644 --- a/users/spacebarracecar/spacebarracecar.h +++ b/users/spacebarracecar/spacebarracecar.h @@ -81,6 +81,8 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record); #define CTRLC LCTL(KC_C) #define CTRLV LCTL(KC_V) +#define ALTF4 LALT(KC_F4) + #define GUIU LGUI(KC_UP) #define GUID LGUI(KC_DOWN) #define GUIL LGUI(KC_LEFT) From 9ee2991c3db72fbd4074f2b83185ef830d53cba4 Mon Sep 17 00:00:00 2001 From: Charlie McMackin Date: Sun, 18 Nov 2018 09:52:53 -0600 Subject: [PATCH 529/788] Default JIS TKL keymap for Pegasus Hoof (#4446) * Add TKL JIS layout for Pegasus Hoof Tested with a JIS Majestouch 2 TKL * Add default_jis keymap for Pegasus Hoof * Remove unnecessary keycode definition * Remove legacy fn_actions in favor of MO(1) * Remove unnecessary build directive --- .../pegasushoof/keymaps/default_jis/keymap.c | 54 +++++++++++++++++++ .../pegasushoof/keymaps/default_jis/rules.mk | 17 ++++++ keyboards/bpiphany/pegasushoof/pegasushoof.h | 18 +++++++ 3 files changed, 89 insertions(+) create mode 100644 keyboards/bpiphany/pegasushoof/keymaps/default_jis/keymap.c create mode 100644 keyboards/bpiphany/pegasushoof/keymaps/default_jis/rules.mk diff --git a/keyboards/bpiphany/pegasushoof/keymaps/default_jis/keymap.c b/keyboards/bpiphany/pegasushoof/keymaps/default_jis/keymap.c new file mode 100644 index 000000000..a77474182 --- /dev/null +++ b/keyboards/bpiphany/pegasushoof/keymaps/default_jis/keymap.c @@ -0,0 +1,54 @@ +/* +Copyright 2016 Daniel Svensson + 2018 Charlie McMackin + +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 . +*/ + +#include QMK_KEYBOARD_H + +#define KM_JIS 0 +#define KM_MEDIA 1 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = + { + /* Layer 0: Standard JIS layer */ + [KM_JIS] = LAYOUT_tkl_jis(KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR,KC_SLCK,KC_PAUS, \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL, KC_JYEN, KC_BSPC, KC_INS, KC_HOME,KC_PGUP, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC, KC_DEL, KC_END, KC_PGDN, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT,KC_BSLS,KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,KC_RO, KC_RSFT, KC_UP, \ + KC_LCTL, KC_LGUI,KC_LALT,KC_MHEN, KC_SPC, KC_HENK,KC_KANA,KC_RALT,MO(1), KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT), + /* Layer 1: Function layer */ + [KM_MEDIA] = LAYOUT_tkl_jis(_______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, KC_WAKE,KC_PWR, KC_SLEP, \ + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______,KC_VOLU, \ + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______,KC_VOLD, \ + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, \ + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, KC_MPLY, \ + _______,_______,_______,_______, _______, _______,_______,_______,_______,RESET , KC_MPRV,KC_MSTP,KC_MNXT) + }; + +void led_set_user(uint8_t usb_led) { + if (usb_led & (1 << USB_LED_CAPS_LOCK)) { + ph_caps_led_on(); + } else { + ph_caps_led_off(); + } + + if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { + ph_sclk_led_on(); + } else { + ph_sclk_led_off(); + } +} diff --git a/keyboards/bpiphany/pegasushoof/keymaps/default_jis/rules.mk b/keyboards/bpiphany/pegasushoof/keymaps/default_jis/rules.mk new file mode 100644 index 000000000..8254a8389 --- /dev/null +++ b/keyboards/bpiphany/pegasushoof/keymaps/default_jis/rules.mk @@ -0,0 +1,17 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +CUSTOM_MATRIX = yes # Custom matrix file for the Pegasus Hoof due to the 2x74HC42 +NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. diff --git a/keyboards/bpiphany/pegasushoof/pegasushoof.h b/keyboards/bpiphany/pegasushoof/pegasushoof.h index d031e3ed2..939a854cd 100644 --- a/keyboards/bpiphany/pegasushoof/pegasushoof.h +++ b/keyboards/bpiphany/pegasushoof/pegasushoof.h @@ -41,6 +41,24 @@ along with this program. If not, see . /* 7 */ { ___ , ___ , ___ , ___ , ___ , KF7 , KG7 , KH7 , KI7 , KJ7 , KK7 , KL7 , KM7 , KN7 , ___ , KP7 , ___ , ___ }, \ } +#define LAYOUT_tkl_jis( \ + KG6, KH4, KI4, KI2, KI6, KP5, KL6, KM2, KM4, KO4, KO5, KO6, KO0, KN5, KN7, KP7, \ + KG4, KG5, KH5, KI5, KJ5, KJ4, KK4, KK5, KL5, KM5, KF5, KF4, KL4, KO7, KO2, KR4, KC4, KE4, \ + KG2, KG7, KH7, KI7, KJ7, KJ2, KK2, KK7, KL7, KM7, KF7, KF2, KL2, KQ4, KC5, KE5, \ + KH2, KG3, KH3, KI3, KJ3, KJ6, KK6, KK3, KL3, KM3, KF3, KF6, KO3, KO1, \ + KB2, KG1, KH1, KI1, KJ1, KJ0, KK0, KK1, KL1, KM1, KF0, KL0, KB3, KC6, \ + KP4, KD2, KN6, KG0, KQ6, KH0, KI0, KN0, KM0, KP1, KC0, KQ0, KR0 \ + ) { /* 00-A 01-B 02-C 03-D 04-E 05-F 06-G 07-H 08-I 09-J 10-K 11-L 12-M 13-N 14-O 15-P 16-Q 17-R */ \ + /* 0 */ { ___ , ___ , KC0 , ___ , ___ , KF0 , KG0 , KH0 , KI0 , KJ0 , KK0 , KL0 , KM0 , KN0 , KO0 , ___ , KQ0 , KR0 }, \ + /* 1 */ { ___ , ___ , ___ , ___ , ___ , ___ , KG1 , KH1 , KI1 , KJ1 , KK1 , KL1 , KM1 , ___ , KO1 , KP1 , ___ , ___ }, \ + /* 2 */ { ___ , KB2 , ___ , KD2 , ___ , KF2 , KG2 , KH2 , KI2 , KJ2 , KK2 , KL2 , KM2 , ___ , KO2 , ___ , ___ , ___ }, \ + /* 3 */ { ___ , KB3 , ___ , ___ , ___ , KF3 , KG3 , KH3 , KI3 , KJ3 , KK3 , KL3 , KM3 , ___ , KO3 , ___ , ___ , ___ }, \ + /* 4 */ { ___ , ___ , KC4 , ___ , KE4 , KF4 , KG4 , KH4 , KI4 , KJ4 , KK4 , KL4 , KM4 , ___ , KO4 , KP4 , KQ4 , KR4 }, \ + /* 5 */ { ___ , ___ , KC5 , ___ , KE5 , KF5 , KG5 , KH5 , KI5 , KJ5 , KK5 , KL5 , KM5 , KN5 , KO5 , KP5 , ___ , ___ }, \ + /* 6 */ { ___ , ___ , KC6 , ___ , ___ , KF6 , KG6 , ___ , KI6 , KJ6 , KK6 , KL6 , ___ , KN6 , KO6 , ___ , KQ6 , ___ }, \ + /* 7 */ { ___ , ___ , ___ , ___ , ___ , KF7 , KG7 , KH7 , KI7 , KJ7 , KK7 , KL7 , KM7 , KN7 , KO7 , KP7 , ___ , ___ }, \ +} + inline void ph_caps_led_on(void) { DDRC |= (1<<6); PORTC &= ~(1<<6); } inline void ph_caps_led_off(void) { DDRC &= ~(1<<6); PORTC &= ~(1<<6); } From 31298be2b17a1b9f203c8fd1d7bae8f923557cc0 Mon Sep 17 00:00:00 2001 From: zvecr Date: Sun, 18 Nov 2018 15:53:33 +0000 Subject: [PATCH 530/788] Add personal zvecr dz60 keymap (#4443) * Add Configurator support for dz60 ansi split space * Add keymap and fix layout macro --- keyboards/dz60/dz60.h | 27 ++++++++++++++++++ keyboards/dz60/info.json | 4 +++ keyboards/dz60/keymaps/zvecr/keymap.c | 40 +++++++++++++++++++++++++++ 3 files changed, 71 insertions(+) create mode 100644 keyboards/dz60/keymaps/zvecr/keymap.c diff --git a/keyboards/dz60/dz60.h b/keyboards/dz60/dz60.h index 2cf2eec7a..62f6338cd 100644 --- a/keyboards/dz60/dz60.h +++ b/keyboards/dz60/dz60.h @@ -170,6 +170,33 @@ { k40, k41, KC_NO, k43, KC_NO, KC_NO, k46, KC_NO, KC_NO, KC_NO, k4a, k4b, KC_NO, k4d, k4e } \ } +/* LAYOUT_60_ansi_split + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ + * │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0a │0b │0c │0e │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ + * │10 │12 │13 │14 │15 │16 │17 │18 │19 │1a │1b │1c │1d │1e │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ + * │20 │22 │23 │24 │25 │26 │27 │28 │29 │2a │2b │2c │2d │ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ + * │30 │32 │33 │34 │35 │36 │37 │38 │39 │3a │3b │3d │ + * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ + * │40 │41 │43 │44 │46 │48 │4a │4b │4d │4e │ + * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ +*/ +#define LAYOUT_60_ansi_split( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0e, \ + k10, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, \ + k20, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, \ + k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3d, \ + k40, k41, k43, k44, k46, k48, k4a, k4b, k4d, k4e \ +) { \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, KC_NO, k0e }, \ + { k10, KC_NO, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e }, \ + { k20, KC_NO, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, KC_NO }, \ + { k30, KC_NO, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, KC_NO, k3d, KC_NO }, \ + { k40, k41, KC_NO, k43, k44, KC_NO, k46, KC_NO, k48, KC_NO, k4a, k4b, KC_NO, k4d, k4e } \ +} + /* LAYOUT_60_iso * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ * │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0a │0b │0c │0e │ diff --git a/keyboards/dz60/info.json b/keyboards/dz60/info.json index a163cc6a4..9ec727453 100644 --- a/keyboards/dz60/info.json +++ b/keyboards/dz60/info.json @@ -25,6 +25,10 @@ "key_count": 61, "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}] }, + "LAYOUT_60_ansi_split": { + "key_count": 61, + "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":2.25}, {"label":"FN", "x":6.00, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"label":"AltGr", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}] + }, "LAYOUT_60_iso": { "key_count": 62, "layout": [{"label":"¬", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"\"", "x":2, "y":0}, {"label":"£", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"@", "x":11.75, "y":2}, {"label":"~", "x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"label":"|", "x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"AltGr", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}] diff --git a/keyboards/dz60/keymaps/zvecr/keymap.c b/keyboards/dz60/keymaps/zvecr/keymap.c new file mode 100644 index 000000000..9127fa0a7 --- /dev/null +++ b/keyboards/dz60/keymaps/zvecr/keymap.c @@ -0,0 +1,40 @@ +#include QMK_KEYBOARD_H + +/* +* Each layer gets a name for readability. +* The underscores don't mean anything - you can +* have a layer called STUFF or any other name. +* Layer names don't all need to be of the same +* length, and you can also skip them entirely +* and just use numbers. +* +*/ +#define BL 0 // Base Layer +#define FL 1 // Function Layer +#define ML 2 // Macro Layer + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [BL] = LAYOUT_60_ansi_split( + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(FL), KC_SPC, KC_RALT, KC_RGUI, MO(ML), KC_RCTL), + + [FL] = LAYOUT_60_ansi_split( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, + _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, KC_PSCR, KC_SLCK, KC_PAUS, RESET, + _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS, KC_HOME, KC_PGUP, _______, + _______, _______, _______, BL_DEC, BL_TOGG, BL_INC, BL_STEP, _______, KC_DEL, KC_END, KC_PGDN, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + + + [ML] = LAYOUT_60_ansi_split( + _______, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + +}; From de173e344e89ee356cfd0be75742122afac766d0 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Sun, 18 Nov 2018 08:23:51 -0800 Subject: [PATCH 531/788] Satan: add LAYOUT_60_ansi_split_rshift to info.json (#4441) --- keyboards/satan/info.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/keyboards/satan/info.json b/keyboards/satan/info.json index d0beb723b..2b2e96ed1 100644 --- a/keyboards/satan/info.json +++ b/keyboards/satan/info.json @@ -20,8 +20,11 @@ "LAYOUT_60_iso_split_bs_rshift": { "layout": [{"label":"k00", "x":0, "y":0}, {"label":"k01", "x":1, "y":0}, {"label":"k02", "x":2, "y":0}, {"label":"k03", "x":3, "y":0}, {"label":"k04", "x":4, "y":0}, {"label":"k05", "x":5, "y":0}, {"label":"k06", "x":6, "y":0}, {"label":"k07", "x":7, "y":0}, {"label":"k08", "x":8, "y":0}, {"label":"k09", "x":9, "y":0}, {"label":"k0a", "x":10, "y":0}, {"label":"k0b", "x":11, "y":0}, {"label":"k0c", "x":12, "y":0}, {"label":"k0d", "x":13, "y":0}, {"label":"k49", "x":14, "y":0}, {"label":"k10", "x":0, "y":1, "w":1.5}, {"label":"k11", "x":1.5, "y":1}, {"label":"k12", "x":2.5, "y":1}, {"label":"k13", "x":3.5, "y":1}, {"label":"k14", "x":4.5, "y":1}, {"label":"k15", "x":5.5, "y":1}, {"label":"k16", "x":6.5, "y":1}, {"label":"k17", "x":7.5, "y":1}, {"label":"k18", "x":8.5, "y":1}, {"label":"k19", "x":9.5, "y":1}, {"label":"k1a", "x":10.5, "y":1}, {"label":"k1b", "x":11.5, "y":1}, {"label":"k1c", "x":12.5, "y":1}, {"label":"k20", "x":0, "y":2, "w":1.75}, {"label":"k21", "x":1.75, "y":2}, {"label":"k22", "x":2.75, "y":2}, {"label":"k23", "x":3.75, "y":2}, {"label":"k24", "x":4.75, "y":2}, {"label":"k25", "x":5.75, "y":2}, {"label":"k26", "x":6.75, "y":2}, {"label":"k27", "x":7.75, "y":2}, {"label":"k28", "x":8.75, "y":2}, {"label":"k29", "x":9.75, "y":2}, {"label":"k2a", "x":10.75, "y":2}, {"label":"k2b", "x":11.75, "y":2}, {"label":"k2c", "x":12.75, "y":2}, {"label":"k2d", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"k30", "x":0, "y":3, "w":1.25}, {"label":"k31", "x":1.25, "y":3}, {"label":"k32", "x":2.25, "y":3}, {"label":"k33", "x":3.25, "y":3}, {"label":"k34", "x":4.25, "y":3}, {"label":"k35", "x":5.25, "y":3}, {"label":"k36", "x":6.25, "y":3}, {"label":"k37", "x":7.25, "y":3}, {"label":"k38", "x":8.25, "y":3}, {"label":"k39", "x":9.25, "y":3}, {"label":"k3a", "x":10.25, "y":3}, {"label":"k3b", "x":11.25, "y":3}, {"label":"k3d", "x":12.25, "y":3, "w":1.75}, {"label":"k3c", "x":14, "y":3}, {"label":"k40", "x":0, "y":4, "w":1.5}, {"label":"k41", "x":1.5, "y":4}, {"label":"k42", "x":2.5, "y":4, "w":1.5}, {"label":"k45", "x":4, "y":4, "w":6}, {"label":"k4a", "x":10, "y":4, "w":1.5}, {"label":"k4b", "x":11.5, "y":4}, {"label":"k4c", "x":12.5, "y":4}, {"label":"k4d", "x":13.5, "y":4, "w":1.5}] }, + "LAYOUT_60_ansi_split_rshift": { + "layout": [{"label":"k00", "x":0, "y":0}, {"label":"k01", "x":1, "y":0}, {"label":"k02", "x":2, "y":0}, {"label":"k03", "x":3, "y":0}, {"label":"k04", "x":4, "y":0}, {"label":"k05", "x":5, "y":0}, {"label":"k06", "x":6, "y":0}, {"label":"k07", "x":7, "y":0}, {"label":"k08", "x":8, "y":0}, {"label":"k09", "x":9, "y":0}, {"label":"k0a", "x":10, "y":0}, {"label":"k0b", "x":11, "y":0}, {"label":"k0c", "x":12, "y":0}, {"label":"k0d", "x":13, "y":0, "w":2}, {"label":"k10", "x":0, "y":1, "w":1.5}, {"label":"k11", "x":1.5, "y":1}, {"label":"k12", "x":2.5, "y":1}, {"label":"k13", "x":3.5, "y":1}, {"label":"k14", "x":4.5, "y":1}, {"label":"k15", "x":5.5, "y":1}, {"label":"k16", "x":6.5, "y":1}, {"label":"k17", "x":7.5, "y":1}, {"label":"k18", "x":8.5, "y":1}, {"label":"k19", "x":9.5, "y":1}, {"label":"k1a", "x":10.5, "y":1}, {"label":"k1b", "x":11.5, "y":1}, {"label":"k1c", "x":12.5, "y":1}, {"label":"k1d", "x":13.5, "y":1, "w":1.5}, {"label":"k20", "x":0, "y":2, "w":1.75}, {"label":"k21", "x":1.75, "y":2}, {"label":"k22", "x":2.75, "y":2}, {"label":"k23", "x":3.75, "y":2}, {"label":"k24", "x":4.75, "y":2}, {"label":"k25", "x":5.75, "y":2}, {"label":"k26", "x":6.75, "y":2}, {"label":"k27", "x":7.75, "y":2}, {"label":"k28", "x":8.75, "y":2}, {"label":"k29", "x":9.75, "y":2}, {"label":"k2a", "x":10.75, "y":2}, {"label":"k2b", "x":11.75, "y":2}, {"label":"k2d", "x":12.75, "y":2, "w":2.25}, {"label":"k30", "x":0, "y":3, "w":2.25}, {"label":"k32", "x":2.25, "y":3}, {"label":"k33", "x":3.25, "y":3}, {"label":"k34", "x":4.25, "y":3}, {"label":"k35", "x":5.25, "y":3}, {"label":"k36", "x":6.25, "y":3}, {"label":"k37", "x":7.25, "y":3}, {"label":"k38", "x":8.25, "y":3}, {"label":"k39", "x":9.25, "y":3}, {"label":"k3a", "x":10.25, "y":3}, {"label":"k3b", "x":11.25, "y":3}, {"label":"k3d", "x":12.25, "y":3, "w":1.75}, {"label":"k3c", "x":14, "y":3}, {"label":"k40", "x":0, "y":4, "w":1.25}, {"label":"k41", "x":1.25, "y":4, "w":1.25}, {"label":"k42", "x":2.5, "y":4, "w":1.25}, {"label":"k45", "x":3.75, "y":4, "w":6.25}, {"label":"k4a", "x":10, "y":4, "w":1.25}, {"label":"k4b", "x":11.25, "y":4, "w":1.25}, {"label":"k4c", "x":12.5, "y":4, "w":1.25}, {"label":"k4d", "x":13.75, "y":4, "w":1.25}] + }, "LAYOUT_60_iso_split_rshift": { "layout": [{"label":"k00", "x":0, "y":0}, {"label":"k01", "x":1, "y":0}, {"label":"k02", "x":2, "y":0}, {"label":"k03", "x":3, "y":0}, {"label":"k04", "x":4, "y":0}, {"label":"k05", "x":5, "y":0}, {"label":"k06", "x":6, "y":0}, {"label":"k07", "x":7, "y":0}, {"label":"k08", "x":8, "y":0}, {"label":"k09", "x":9, "y":0}, {"label":"k0a", "x":10, "y":0}, {"label":"k0b", "x":11, "y":0}, {"label":"k0c", "x":12, "y":0}, {"label":"k0d", "x":13, "y":0, "w":2}, {"label":"k10", "x":0, "y":1, "w":1.5}, {"label":"k11", "x":1.5, "y":1}, {"label":"k12", "x":2.5, "y":1}, {"label":"k13", "x":3.5, "y":1}, {"label":"k14", "x":4.5, "y":1}, {"label":"k15", "x":5.5, "y":1}, {"label":"k16", "x":6.5, "y":1}, {"label":"k17", "x":7.5, "y":1}, {"label":"k18", "x":8.5, "y":1}, {"label":"k19", "x":9.5, "y":1}, {"label":"k1a", "x":10.5, "y":1}, {"label":"k1b", "x":11.5, "y":1}, {"label":"k1c", "x":12.5, "y":1}, {"label":"k20", "x":0, "y":2, "w":1.75}, {"label":"k21", "x":1.75, "y":2}, {"label":"k22", "x":2.75, "y":2}, {"label":"k23", "x":3.75, "y":2}, {"label":"k24", "x":4.75, "y":2}, {"label":"k25", "x":5.75, "y":2}, {"label":"k26", "x":6.75, "y":2}, {"label":"k27", "x":7.75, "y":2}, {"label":"k28", "x":8.75, "y":2}, {"label":"k29", "x":9.75, "y":2}, {"label":"k2a", "x":10.75, "y":2}, {"label":"k2b", "x":11.75, "y":2}, {"label":"k2c", "x":12.75, "y":2}, {"label":"k2d", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"k30", "x":0, "y":3, "w":1.25}, {"label":"k31", "x":1.25, "y":3}, {"label":"k32", "x":2.25, "y":3}, {"label":"k33", "x":3.25, "y":3}, {"label":"k34", "x":4.25, "y":3}, {"label":"k35", "x":5.25, "y":3}, {"label":"k36", "x":6.25, "y":3}, {"label":"k37", "x":7.25, "y":3}, {"label":"k38", "x":8.25, "y":3}, {"label":"k39", "x":9.25, "y":3}, {"label":"k3a", "x":10.25, "y":3}, {"label":"k3b", "x":11.25, "y":3}, {"label":"k3d", "x":12.25, "y":3, "w":1.75}, {"label":"k3c", "x":14, "y":3}, {"label":"k40", "x":0, "y":4, "w":1.25}, {"label":"k41", "x":1.25, "y":4, "w":1.25}, {"label":"k42", "x":2.5, "y":4, "w":1.25}, {"label":"k45", "x":3.75, "y":4, "w":6.25}, {"label":"k4a", "x":10, "y":4, "w":1.25}, {"label":"k4b", "x":11.25, "y":4, "w":1.25}, {"label":"k4c", "x":12.5, "y":4, "w":1.25}, {"label":"k4d", "x":13.75, "y":4, "w":1.25}] } } -} \ No newline at end of file +} From 504bf11769f1340711d749e8dc818f39a56a4dfb Mon Sep 17 00:00:00 2001 From: Florian Didron Date: Mon, 19 Nov 2018 01:24:41 +0900 Subject: [PATCH 532/788] Allows disabling rgb effects in userspace (#4422) * Allows disabling animations in user space * Describe disabling effects in the docs * Allows disabling individual reactive modes * Adds the list ode defines --- docs/feature_rgb_matrix.md | 24 +++++ quantum/rgb_matrix.c | 178 ++++++++++++++++++++++++------------- quantum/rgb_matrix.h | 44 +++++++-- 3 files changed, 177 insertions(+), 69 deletions(-) diff --git a/docs/feature_rgb_matrix.md b/docs/feature_rgb_matrix.md index 809d034bd..0af1e4947 100644 --- a/docs/feature_rgb_matrix.md +++ b/docs/feature_rgb_matrix.md @@ -150,6 +150,30 @@ These are the effects that are currently available: #endif RGB_MATRIX_EFFECT_MAX }; + +You can disable a single effect by defining `DISABLE_[EFFECT_NAME]` in your `config.h`: + + +|Define |Description | +|---------------------------------------------------|--------------------------------------------| +|`#define DISABLE_RGB_MATRIX_ALPHAS_MODS` |Disables `RGB_MATRIX_ALPHAS_MODS` | +|`#define DISABLE_RGB_MATRIX_DUAL_BEACON` |Disables `RGB_MATRIX_DUAL_BEACON` | +|`#define DISABLE_RGB_MATRIX_GRADIENT_UP_DOWN` |Disables `RGB_MATRIX_GRADIENT_UP_DOWN` | +|`#define DISABLE_RGB_MATRIX_RAINDROPS` |Disables `RGB_MATRIX_RAINDROPS` | +|`#define DISABLE_RGB_MATRIX_CYCLE_ALL` |Disables `RGB_MATRIX_CYCLE_ALL` | +|`#define DISABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT` |Disables `RGB_MATRIX_CYCLE_LEFT_RIGHT` | +|`#define DISABLE_RGB_MATRIX_CYCLE_UP_DOWN` |Disables `RGB_MATRIX_CYCLE_UP_DOWN` | +|`#define DISABLE_RGB_MATRIX_RAINBOW_BEACON` |Disables `RGB_MATRIX_RAINBOW_BEACON` | +|`#define DISABLE_RGB_MATRIX_RAINBOW_PINWHEELS` |Disables `RGB_MATRIX_RAINBOW_PINWHEELS` | +|`#define DISABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON`|Disables `RGB_MATRIX_RAINBOW_MOVING_CHEVRON`| +|`#define DISABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS` |Disables `RGB_MATRIX_JELLYBEAN_RAINDROPS` | +|`#define DISABLE_RGB_MATRIX_DIGITAL_RAIN` |Disables `RGB_MATRIX_DIGITAL_RAIN` | +|`#define DISABLE_RGB_MATRIX_SOLID_REACTIVE` |Disables `RGB_MATRIX_SOLID_REACTIVE` | +|`#define DISABLE_RGB_MATRIX_SPLASH` |Disables `RGB_MATRIX_SPLASH` | +|`#define DISABLE_RGB_MATRIX_MULTISPLASH` |Disables `RGB_MATRIX_MULTISPLASH` | +|`#define DISABLE_RGB_MATRIX_SOLID_SPLASH` |Disables `RGB_MATRIX_SOLID_SPLASH` | +|`#define DISABLE_RGB_MATRIX_SOLID_MULTISPLASH` |Disables `RGB_MATRIX_SOLID_MULTISPLASH` | + ## Custom layer effects diff --git a/quantum/rgb_matrix.c b/quantum/rgb_matrix.c index 26ee57f5c..15bd13671 100644 --- a/quantum/rgb_matrix.c +++ b/quantum/rgb_matrix.c @@ -55,6 +55,10 @@ rgb_config_t rgb_matrix_config; #define RGB_DIGITAL_RAIN_DROPS 24 #endif +#if !defined(DISABLE_RGB_MATRIX_RAINDROPS) || !defined(DISABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS) || !defined(DISABLE_RGB_MATRIX_DIGITAL_RAIN) + #define TRACK_PREVIOUS_EFFECT +#endif + bool g_suspend_state = false; // Global tick at 20 Hz @@ -79,7 +83,12 @@ void eeconfig_update_rgb_matrix(uint32_t val) { void eeconfig_update_rgb_matrix_default(void) { dprintf("eeconfig_update_rgb_matrix_default\n"); rgb_matrix_config.enable = 1; +#ifndef DISABLE_RGB_MATRIX_CYCLE_ALL rgb_matrix_config.mode = RGB_MATRIX_CYCLE_LEFT_RIGHT; +#else + // fallback to solid colors if RGB_MATRIX_CYCLE_LEFT_RIGHT is disabled in userspace + rgb_matrix_config.mode = RGB_MATRIX_SOLID_COLOR; +#endif rgb_matrix_config.hue = 0; rgb_matrix_config.sat = 255; rgb_matrix_config.val = RGB_MATRIX_MAXIMUM_BRIGHTNESS; @@ -499,7 +508,7 @@ void rgb_matrix_digital_rain( const bool initialize ) { map_row_column_to_led(row, col, &led, &led_count); if (map[col][row] > pure_green_intensity) { - const uint8_t boost = (uint8_t) ((uint16_t) max_brightness_boost + const uint8_t boost = (uint8_t) ((uint16_t) max_brightness_boost * (map[col][row] - pure_green_intensity) / (max_intensity - pure_green_intensity)); rgb_matrix_set_color(led, boost, max_intensity, boost); } @@ -618,12 +627,16 @@ void rgb_matrix_custom(void) { } void rgb_matrix_task(void) { - static uint8_t toggle_enable_last = 255; + #ifdef TRACK_PREVIOUS_EFFECT + static uint8_t toggle_enable_last = 255; + #endif if (!rgb_matrix_config.enable) { - rgb_matrix_all_off(); - rgb_matrix_indicators(); - toggle_enable_last = rgb_matrix_config.enable; - return; + rgb_matrix_all_off(); + rgb_matrix_indicators(); + #ifdef TRACK_PREVIOUS_EFFECT + toggle_enable_last = rgb_matrix_config.enable; + #endif + return; } // delay 1 second before driving LEDs or doing anything else static uint8_t startup_tick = 0; @@ -658,13 +671,16 @@ void rgb_matrix_task(void) { (RGB_DISABLE_AFTER_TIMEOUT > 0 && g_any_key_hit > RGB_DISABLE_AFTER_TIMEOUT * 60 * 20)); uint8_t effect = suspend_backlight ? 0 : rgb_matrix_config.mode; - // Keep track of the effect used last time, - // detect change in effect, so each effect can - // have an optional initialization. - static uint8_t effect_last = 255; - bool initialize = (effect != effect_last) || (rgb_matrix_config.enable != toggle_enable_last); - effect_last = effect; - toggle_enable_last = rgb_matrix_config.enable; + #ifdef TRACK_PREVIOUS_EFFECT + // Keep track of the effect used last time, + // detect change in effect, so each effect can + // have an optional initialization. + + static uint8_t effect_last = 255; + bool initialize = (effect != effect_last) || (rgb_matrix_config.enable != toggle_enable_last); + effect_last = effect; + toggle_enable_last = rgb_matrix_config.enable; + #endif // this gets ticked at 20 Hz. // each effect can opt to do calculations @@ -673,58 +689,92 @@ void rgb_matrix_task(void) { case RGB_MATRIX_SOLID_COLOR: rgb_matrix_solid_color(); break; - case RGB_MATRIX_ALPHAS_MODS: - rgb_matrix_alphas_mods(); - break; - case RGB_MATRIX_DUAL_BEACON: - rgb_matrix_dual_beacon(); - break; - case RGB_MATRIX_GRADIENT_UP_DOWN: - rgb_matrix_gradient_up_down(); - break; - case RGB_MATRIX_RAINDROPS: - rgb_matrix_raindrops( initialize ); - break; - case RGB_MATRIX_CYCLE_ALL: - rgb_matrix_cycle_all(); - break; - case RGB_MATRIX_CYCLE_LEFT_RIGHT: - rgb_matrix_cycle_left_right(); - break; - case RGB_MATRIX_CYCLE_UP_DOWN: - rgb_matrix_cycle_up_down(); - break; - case RGB_MATRIX_RAINBOW_BEACON: - rgb_matrix_rainbow_beacon(); - break; - case RGB_MATRIX_RAINBOW_PINWHEELS: - rgb_matrix_rainbow_pinwheels(); - break; - case RGB_MATRIX_RAINBOW_MOVING_CHEVRON: - rgb_matrix_rainbow_moving_chevron(); - break; - case RGB_MATRIX_JELLYBEAN_RAINDROPS: - rgb_matrix_jellybean_raindrops( initialize ); - break; - case RGB_MATRIX_DIGITAL_RAIN: - rgb_matrix_digital_rain( initialize ); - break; + #ifndef DISABLE_RGB_MATRIX_ALPHAS_MODS + case RGB_MATRIX_ALPHAS_MODS: + rgb_matrix_alphas_mods(); + break; + #endif + #ifndef DISABLE_RGB_MATRIX_DUAL_BEACON + case RGB_MATRIX_DUAL_BEACON: + rgb_matrix_dual_beacon(); + break; + #endif + #ifndef DISABLE_RGB_MATRIX_GRADIENT_UP_DOWN + case RGB_MATRIX_GRADIENT_UP_DOWN: + rgb_matrix_gradient_up_down(); + break; + #endif + #ifndef DISABLE_RGB_MATRIX_RAINDROPS + case RGB_MATRIX_RAINDROPS: + rgb_matrix_raindrops( initialize ); + break; + #endif + #ifndef DISABLE_RGB_MATRIX_CYCLE_ALL + case RGB_MATRIX_CYCLE_ALL: + rgb_matrix_cycle_all(); + break; + #endif + #ifndef DISABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT + case RGB_MATRIX_CYCLE_LEFT_RIGHT: + rgb_matrix_cycle_left_right(); + break; + #endif + #ifndef DISABLE_RGB_MATRIX_CYCLE_UP_DOWN + case RGB_MATRIX_CYCLE_UP_DOWN: + rgb_matrix_cycle_up_down(); + break; + #endif + #ifndef DISABLE_RGB_MATRIX_RAINBOW_BEACON + case RGB_MATRIX_RAINBOW_BEACON: + rgb_matrix_rainbow_beacon(); + break; + #endif + #ifndef DISABLE_RGB_MATRIX_RAINBOW_PINWHEELS + case RGB_MATRIX_RAINBOW_PINWHEELS: + rgb_matrix_rainbow_pinwheels(); + break; + #endif + #ifndef DISABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON + case RGB_MATRIX_RAINBOW_MOVING_CHEVRON: + rgb_matrix_rainbow_moving_chevron(); + break; + #endif + #ifndef DISABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS + case RGB_MATRIX_JELLYBEAN_RAINDROPS: + rgb_matrix_jellybean_raindrops( initialize ); + break; + #endif + #ifndef DISABLE_RGB_MATRIX_DIGITAL_RAIN + case RGB_MATRIX_DIGITAL_RAIN: + rgb_matrix_digital_rain( initialize ); + break; + #endif #ifdef RGB_MATRIX_KEYPRESSES - case RGB_MATRIX_SOLID_REACTIVE: - rgb_matrix_solid_reactive(); - break; - case RGB_MATRIX_SPLASH: - rgb_matrix_splash(); - break; - case RGB_MATRIX_MULTISPLASH: - rgb_matrix_multisplash(); - break; - case RGB_MATRIX_SOLID_SPLASH: - rgb_matrix_solid_splash(); - break; - case RGB_MATRIX_SOLID_MULTISPLASH: - rgb_matrix_solid_multisplash(); - break; + #ifndef DISABLE_RGB_MATRIX_SOLID_REACTIVE + case RGB_MATRIX_SOLID_REACTIVE: + rgb_matrix_solid_reactive(); + break; + #endif + #ifndef DISABLE_RGB_MATRIX_SPLASH + case RGB_MATRIX_SPLASH: + rgb_matrix_splash(); + break; + #endif + #ifndef DISABLE_RGB_MATRIX_MULTISPLASH + case RGB_MATRIX_MULTISPLASH: + rgb_matrix_multisplash(); + break; + #endif + #ifndef DISABLE_RGB_MATRIX_SOLID_SPLASH + case RGB_MATRIX_SOLID_SPLASH: + rgb_matrix_solid_splash(); + break; + #endif + #ifndef DISABLE_RGB_MATRIX_SOLID_MULTISPLASH + case RGB_MATRIX_SOLID_MULTISPLASH: + rgb_matrix_solid_multisplash(); + break; + #endif #endif default: rgb_matrix_custom(); diff --git a/quantum/rgb_matrix.h b/quantum/rgb_matrix.h index d2450a7d9..3cd248ffc 100644 --- a/quantum/rgb_matrix.h +++ b/quantum/rgb_matrix.h @@ -70,24 +70,58 @@ typedef union { enum rgb_matrix_effects { RGB_MATRIX_SOLID_COLOR = 1, +#ifndef DISABLE_RGB_MATRIX_ALPHAS_MODS RGB_MATRIX_ALPHAS_MODS, +#endif +#ifndef DISABLE_RGB_MATRIX_DUAL_BEACON RGB_MATRIX_DUAL_BEACON, +#endif +#ifndef DISABLE_RGB_MATRIX_GRADIENT_UP_DOWN RGB_MATRIX_GRADIENT_UP_DOWN, +#endif +#ifndef DISABLE_RGB_MATRIX_RAINDROPS RGB_MATRIX_RAINDROPS, +#endif +#ifndef DISABLE_RGB_MATRIX_CYCLE_ALL RGB_MATRIX_CYCLE_ALL, +#endif +#ifndef DISABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT RGB_MATRIX_CYCLE_LEFT_RIGHT, +#endif +#ifndef DISABLE_RGB_MATRIX_CYCLE_UP_DOWN RGB_MATRIX_CYCLE_UP_DOWN, +#endif +#ifndef DISABLE_RGB_MATRIX_RAINBOW_BEACON RGB_MATRIX_RAINBOW_BEACON, +#endif +#ifndef DISABLE_RGB_MATRIX_RAINBOW_PINWHEELS RGB_MATRIX_RAINBOW_PINWHEELS, +#endif +#ifndef DISABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON RGB_MATRIX_RAINBOW_MOVING_CHEVRON, +#endif +#ifndef DISABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS RGB_MATRIX_JELLYBEAN_RAINDROPS, +#endif +#ifndef DISABLE_RGB_MATRIX_DIGITAL_RAIN RGB_MATRIX_DIGITAL_RAIN, +#endif #ifdef RGB_MATRIX_KEYPRESSES - RGB_MATRIX_SOLID_REACTIVE, - RGB_MATRIX_SPLASH, - RGB_MATRIX_MULTISPLASH, - RGB_MATRIX_SOLID_SPLASH, - RGB_MATRIX_SOLID_MULTISPLASH, + #ifndef DISABLE_RGB_MATRIX_SOLID_REACTIVE + RGB_MATRIX_SOLID_REACTIVE, + #endif + #ifndef DISABLE_RGB_MATRIX_SPLASH + RGB_MATRIX_SPLASH, + #endif + #ifndef DISABLE_RGB_MATRIX_MULTISPLASH + RGB_MATRIX_MULTISPLASH, + #endif + #ifndef DISABLE_RGB_MATRIX_SOLID_SPLASH + RGB_MATRIX_SOLID_SPLASH, + #endif + #ifndef DISABLE_RGB_MATRIX_SOLID_MULTISPLASH + RGB_MATRIX_SOLID_MULTISPLASH, + #endif #endif RGB_MATRIX_EFFECT_MAX }; From bdd41715af2acdfbdbe78283d7519664dd01088e Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 16 Nov 2018 17:03:41 -0800 Subject: [PATCH 533/788] Make Ergodox EZ Glow's rgb matrix user configurable --- keyboards/ergodox_ez/ergodox_ez.c | 1 + 1 file changed, 1 insertion(+) diff --git a/keyboards/ergodox_ez/ergodox_ez.c b/keyboards/ergodox_ez/ergodox_ez.c index 61f910711..3b2c94350 100644 --- a/keyboards/ergodox_ez/ergodox_ez.c +++ b/keyboards/ergodox_ez/ergodox_ez.c @@ -269,6 +269,7 @@ const is31_led g_is31_leds[DRIVER_LED_TOTAL] = { }; +__attribute__ ((weak)) const rgb_led g_rgb_leds[DRIVER_LED_TOTAL] = { /*{row | col << 4} From 223b3d2be79594eddd3837067348ab97da2df8ae Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sun, 18 Nov 2018 08:55:45 -0800 Subject: [PATCH 534/788] Fix i2c_master.d listed more than once warning --- keyboards/ergodox_ez/keymaps/default/keymap.c | 2 -- keyboards/ergodox_ez/rules.mk | 8 ++++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/keyboards/ergodox_ez/keymaps/default/keymap.c b/keyboards/ergodox_ez/keymaps/default/keymap.c index ef70decd5..49de60773 100644 --- a/keyboards/ergodox_ez/keymaps/default/keymap.c +++ b/keyboards/ergodox_ez/keymaps/default/keymap.c @@ -1,6 +1,4 @@ #include QMK_KEYBOARD_H -#include "debug.h" -#include "action_layer.h" #include "version.h" #define BASE 0 // default layer diff --git a/keyboards/ergodox_ez/rules.mk b/keyboards/ergodox_ez/rules.mk index ef2aefbb9..446ba3e21 100644 --- a/keyboards/ergodox_ez/rules.mk +++ b/keyboards/ergodox_ez/rules.mk @@ -15,8 +15,7 @@ #---------------------------------------------------------------------------- # # project specific files -SRC = matrix.c \ - i2c_master.c +SRC += matrix.c # MCU name MCU = atmega32u4 @@ -85,4 +84,9 @@ API_SYSEX_ENABLE = no RGBLIGHT_ENABLE = yes RGB_MATRIX_ENABLE = no # enable later +ifeq ($(strip $(RGB_MATRIX_ENABLE)), no) + SRC += i2c_master.c +endif + + LAYOUTS = ergodox From 4d66df5091412bb907bd95eef09a0b7e6567ab55 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sun, 18 Nov 2018 08:59:52 -0800 Subject: [PATCH 535/788] Add default glow board --- .../ergodox_ez/keymaps/default_glow/keymap.c | 1 + .../ergodox_ez/keymaps/default_glow/readme.md | 15 +++++++++++++++ .../ergodox_ez/keymaps/default_glow/rules.mk | 4 ++++ 3 files changed, 20 insertions(+) create mode 100644 keyboards/ergodox_ez/keymaps/default_glow/keymap.c create mode 100644 keyboards/ergodox_ez/keymaps/default_glow/readme.md create mode 100644 keyboards/ergodox_ez/keymaps/default_glow/rules.mk diff --git a/keyboards/ergodox_ez/keymaps/default_glow/keymap.c b/keyboards/ergodox_ez/keymaps/default_glow/keymap.c new file mode 100644 index 000000000..526c36402 --- /dev/null +++ b/keyboards/ergodox_ez/keymaps/default_glow/keymap.c @@ -0,0 +1 @@ +// Placeholder. See ../default/keymap.c for details diff --git a/keyboards/ergodox_ez/keymaps/default_glow/readme.md b/keyboards/ergodox_ez/keymaps/default_glow/readme.md new file mode 100644 index 000000000..1150a4f70 --- /dev/null +++ b/keyboards/ergodox_ez/keymaps/default_glow/readme.md @@ -0,0 +1,15 @@ +# ErgoDox EZ Default Configuration + +## Changelog + +* Dec 2016: + * Added LED keys + * Refreshed layout graphic, comes from http://configure.ergodox-ez.com now. +* Sep 22, 2016: + * Created a new key in layer 1 (bottom-corner key) that resets the EEPROM. +* Feb 2, 2016 (V1.1): + * Made the right-hand quote key double as Cmd/Win on hold. So you get ' when you tap it, " when you tap it with Shift, and Cmd or Win when you hold it. You can then use it as a modifier, or just press and hold it for a moment (and then let go) to send a single Cmd or Win keystroke (handy for opening the Start menu on Windows). + +This is what we ship with out of the factory. :) The image says it all: + +![Default](https://i.imgur.com/Be53jH7.png) \ No newline at end of file diff --git a/keyboards/ergodox_ez/keymaps/default_glow/rules.mk b/keyboards/ergodox_ez/keymaps/default_glow/rules.mk new file mode 100644 index 000000000..360c3c51b --- /dev/null +++ b/keyboards/ergodox_ez/keymaps/default_glow/rules.mk @@ -0,0 +1,4 @@ +RGBLIGHT_ENABLE = no +RGB_MATRIX_ENABLE = yes # enable later + +SRC += ../default/keymap.c From e0690096f8b5199cd6f602bc3a11c234b4309fb2 Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Sun, 18 Nov 2018 15:20:21 -0800 Subject: [PATCH 536/788] Fix my community layouts (#4449) * fix formatting of keymap * update readme with boards I currently own * made the wrong assumption that every board would use the same space for backspace * update readme with boards I currently own --- .../60_ansi/mechmerlin-ansi/keymap.c | 26 +++++++++---------- .../60_ansi/mechmerlin-ansi/readme.md | 7 ++--- .../mechmerlin-split/keymap.c | 24 ++++++++--------- .../mechmerlin-split/readme.md | 3 ++- 4 files changed, 31 insertions(+), 29 deletions(-) diff --git a/layouts/community/60_ansi/mechmerlin-ansi/keymap.c b/layouts/community/60_ansi/mechmerlin-ansi/keymap.c index 4128c4cf2..12ed68680 100644 --- a/layouts/community/60_ansi/mechmerlin-ansi/keymap.c +++ b/layouts/community/60_ansi/mechmerlin-ansi/keymap.c @@ -3,24 +3,24 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_BL] = LAYOUT_60_ansi( - KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLASH, \ - KC_CTCP, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \ - KC_LCTL, KC_LGUI, KC_LALT, KC_SPACE, KC_FNX, KC_RALT, KC_RGUI, KC_RCTL), + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLASH, \ + KC_CTCP, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPACE, KC_FNX, KC_RALT, KC_RGUI, KC_RCTL), [_FL] = LAYOUT_60_ansi( - KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, \ - RGB_TOG, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, \ + RGB_TOG, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), [_AL] = LAYOUT_60_ansi( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RSFT_T(KC_UP), \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RSFT_T(KC_UP), \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT) }; diff --git a/layouts/community/60_ansi/mechmerlin-ansi/readme.md b/layouts/community/60_ansi/mechmerlin-ansi/readme.md index 1c40def2a..aefd6a992 100644 --- a/layouts/community/60_ansi/mechmerlin-ansi/readme.md +++ b/layouts/community/60_ansi/mechmerlin-ansi/readme.md @@ -5,9 +5,10 @@ This is the 60% layout used by u/merlin36, host of the [MechMerlin](www.youtube. YouTube channel. It is used on his -[Duck Eagle V2](https://github.com/qmk/qmk_firmware/tree/master/keyboards/eagle_viper/v2) -[KBP V60 Type R Polestar](https://github.com/qmk/qmk_firmware/tree/master/keyboards/v60_type_r) -[NPKC KC60](https://github.com/qmk/qmk_firmware/tree/master/keyboards/kc60) +[Duck Eagle V2](https://github.com/qmk/qmk_firmware/tree/master/keyboards/eagle_viper/v2) +[NPKC KC60](https://github.com/qmk/qmk_firmware/tree/master/keyboards/kc60) +[1up60HSE](https://github.com/qmk/qmk_firmware/tree/master/keyboards/1upkeyboards/1up60hse) +[HS60 V1](https://github.com/qmk/qmk_firmware/tree/master/keyboards/hs60/v1) ## Keymap Notes - Arrow toggle switch is tapping the `FN` key once. diff --git a/layouts/community/60_ansi_split_bs_rshift/mechmerlin-split/keymap.c b/layouts/community/60_ansi_split_bs_rshift/mechmerlin-split/keymap.c index 2464dcaa7..96c3a32f2 100644 --- a/layouts/community/60_ansi_split_bs_rshift/mechmerlin-split/keymap.c +++ b/layouts/community/60_ansi_split_bs_rshift/mechmerlin-split/keymap.c @@ -3,24 +3,24 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_BL] = LAYOUT_60_ansi_split_bs_rshift( - KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_NO, KC_BSPC, \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLASH, \ - KC_CTCP, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, TG(2), \ + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLASH, \ + KC_CTCP, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, TG(2), \ KC_LCTL, KC_LGUI, KC_LALT, KC_SPACE, MO(1), KC_RALT, KC_RGUI, KC_RCTL), [_FL] = LAYOUT_60_ansi_split_bs_rshift( - KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NO, KC_DEL, \ - RGB_TOG, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_DEL, \ + RGB_TOG, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), [_AL] = LAYOUT_60_ansi_split_bs_rshift( - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RSFT_T(KC_UP), KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RSFT_T(KC_UP), KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT) }; diff --git a/layouts/community/60_ansi_split_bs_rshift/mechmerlin-split/readme.md b/layouts/community/60_ansi_split_bs_rshift/mechmerlin-split/readme.md index 9f7cef347..855fd5ac9 100644 --- a/layouts/community/60_ansi_split_bs_rshift/mechmerlin-split/readme.md +++ b/layouts/community/60_ansi_split_bs_rshift/mechmerlin-split/readme.md @@ -6,7 +6,8 @@ host of the [MechMerlin](www.youtube.com/mechmerlin) YouTube channel. It is used on his [Sentraq S60-X RGB](https://github.com/qmk/qmk_firmware/tree/master/keyboards/s60_x) -[MechanicalKeyboards.com FaceW](https://github.com/qmk/qmk_firmware/tree/master/keyboards/bfake) +[Zeal60 Rev4](https://github.com/qmk/qmk_firmware/tree/master/keyboards/zeal60) +[DO60](https://github.com/qmk/qmk_firmware/tree/master/keyboards/do60) ## Keymap Notes - Highly influenced by the KBP V60 and WKL B.Face standard layouts From 9e0f68a6522a86625f2586003959fd12b18dd86b Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sun, 18 Nov 2018 17:51:00 -0800 Subject: [PATCH 537/788] Delete readme.md --- .../ergodox_ez/keymaps/default_glow/readme.md | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 keyboards/ergodox_ez/keymaps/default_glow/readme.md diff --git a/keyboards/ergodox_ez/keymaps/default_glow/readme.md b/keyboards/ergodox_ez/keymaps/default_glow/readme.md deleted file mode 100644 index 1150a4f70..000000000 --- a/keyboards/ergodox_ez/keymaps/default_glow/readme.md +++ /dev/null @@ -1,15 +0,0 @@ -# ErgoDox EZ Default Configuration - -## Changelog - -* Dec 2016: - * Added LED keys - * Refreshed layout graphic, comes from http://configure.ergodox-ez.com now. -* Sep 22, 2016: - * Created a new key in layer 1 (bottom-corner key) that resets the EEPROM. -* Feb 2, 2016 (V1.1): - * Made the right-hand quote key double as Cmd/Win on hold. So you get ' when you tap it, " when you tap it with Shift, and Cmd or Win when you hold it. You can then use it as a modifier, or just press and hold it for a moment (and then let go) to send a single Cmd or Win keystroke (handy for opening the Start menu on Windows). - -This is what we ship with out of the factory. :) The image says it all: - -![Default](https://i.imgur.com/Be53jH7.png) \ No newline at end of file From f03fd950009fdfd9fa0dcb6d343fe22c6ab386cb Mon Sep 17 00:00:00 2001 From: Maarten Dekkers Date: Mon, 19 Nov 2018 21:15:16 +0100 Subject: [PATCH 538/788] Fix permanently on capslock led on Atom47 (#4452) --- keyboards/atom47/rev2/rev2.c | 3 +++ keyboards/atom47/rev3/rev3.c | 3 +++ 2 files changed, 6 insertions(+) diff --git a/keyboards/atom47/rev2/rev2.c b/keyboards/atom47/rev2/rev2.c index 31a8561f0..06fce06da 100644 --- a/keyboards/atom47/rev2/rev2.c +++ b/keyboards/atom47/rev2/rev2.c @@ -17,6 +17,9 @@ void matrix_scan_kb(void) { void led_init_ports(void) { // * Set our LED pins as output DDRB &= ~(1<<5); + + //Set output high, so the capslock led is off + PORTB |= (1 << 5); } void led_set_kb(uint8_t usb_led) { diff --git a/keyboards/atom47/rev3/rev3.c b/keyboards/atom47/rev3/rev3.c index 2cd04fa76..c541ed559 100644 --- a/keyboards/atom47/rev3/rev3.c +++ b/keyboards/atom47/rev3/rev3.c @@ -17,6 +17,9 @@ void matrix_scan_kb(void) { void led_init_ports(void) { // * Set our LED pins as output DDRE |= (1 << 6); + + //Set output high, so the capslock led is off + PORTE |= (1 << 6); } void led_set_kb(uint8_t usb_led) { From 26156e84e8913754586b16fecd41f268ede722df Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 19 Nov 2018 16:37:49 -0800 Subject: [PATCH 539/788] Fix UCIS code Revert code change that broke UCIS due to bad suggestions --- quantum/process_keycode/process_ucis.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/quantum/process_keycode/process_ucis.c b/quantum/process_keycode/process_ucis.c index 380199771..8deb24a86 100644 --- a/quantum/process_keycode/process_ucis.c +++ b/quantum/process_keycode/process_ucis.c @@ -93,6 +93,8 @@ void register_ucis(const char *hex) { } bool process_ucis (uint16_t keycode, keyrecord_t *record) { + uint8_t i; + unicode_input_mode_init(); if (!qk_ucis_state.in_progress) @@ -122,7 +124,7 @@ bool process_ucis (uint16_t keycode, keyrecord_t *record) { if (keycode == KC_ENT || keycode == KC_SPC || keycode == KC_ESC) { bool symbol_found = false; - for (uint8_t i = qk_ucis_state.count; i > 0; i--) { + for (i = qk_ucis_state.count; i > 0; i--) { register_code (KC_BSPC); unregister_code (KC_BSPC); wait_ms(UNICODE_TYPE_DELAY); @@ -134,7 +136,7 @@ bool process_ucis (uint16_t keycode, keyrecord_t *record) { } unicode_input_start(); - for (uint8_t i = 0; ucis_symbol_table[i].symbol; i++) { + for (i = 0; ucis_symbol_table[i].symbol; i++) { if (is_uni_seq (ucis_symbol_table[i].symbol)) { symbol_found = true; register_ucis(ucis_symbol_table[i].code + 2); From ad91454574ad1f0fad73923d04d6d1e037e45fed Mon Sep 17 00:00:00 2001 From: Michael Graf Date: Tue, 20 Nov 2018 15:55:35 +0100 Subject: [PATCH 540/788] Adaptive debounce logic The debounce filtering reports a key/switch change directly, without any extra delay. After that the debounce logic will filter all further changes, until the key/switch reports the same state for the given count of scans. So a perfect switch will get a short debounce period and a bad key will get a much longer debounce period. The result is an adaptive debouncing period for each switch. This value defines how often the same key/switch state has to be detected in successive reads until the next key state can be reported. In other words this value defines the minimum debouncing period for a switch. --- keyboards/ergodox_ez/config.h | 17 +++++++----- keyboards/ergodox_ez/matrix.c | 49 ++++++++++++++++++++--------------- 2 files changed, 38 insertions(+), 28 deletions(-) diff --git a/keyboards/ergodox_ez/config.h b/keyboards/ergodox_ez/config.h index 7a350183b..ee768853a 100644 --- a/keyboards/ergodox_ez/config.h +++ b/keyboards/ergodox_ez/config.h @@ -85,17 +85,20 @@ along with this program. If not, see . #define RGBW 1 -/* "debounce" is measured in keyboard scans. Some users reported - * needing values as high as 15, which was at the time around 50ms. +/* + * The debounce filtering reports a key/switch change directly, + * without any extra delay. After that the debounce logic will filter + * all further changes, until the key/switch reports the same state for + * the given count of scans. + * So a perfect switch will get a short debounce period and + * a bad key will get a much longer debounce period. + * The result is an adaptive debouncing period for each switch. + * * If you don't define it here, the matrix code will default to * 5, which is now closer to 10ms, but still plenty according to * manufacturer specs. - * - * Default is quite high, because of reports with some production - * runs seeming to need it. This may change when configuration for - * this is more directly exposed. */ -#define DEBOUNCE 15 +#define DEBOUNCE 10 #define USB_MAX_POWER_CONSUMPTION 500 diff --git a/keyboards/ergodox_ez/matrix.c b/keyboards/ergodox_ez/matrix.c index 2e95c83b6..6d5bfca31 100644 --- a/keyboards/ergodox_ez/matrix.c +++ b/keyboards/ergodox_ez/matrix.c @@ -57,6 +57,11 @@ along with this program. If not, see . /* matrix state(1:on, 0:off) */ static matrix_row_t matrix[MATRIX_ROWS]; +/* + * matrix state(1:on, 0:off) + * contains the raw values without debounce filtering of the last read cycle. + */ +static matrix_row_t raw_matrix[MATRIX_ROWS]; // Debouncing: store for each key the number of scans until it's eligible to // change. When scanning the matrix, ignore any changes in keys that have @@ -118,6 +123,7 @@ void matrix_init(void) // initialize matrix state: all keys off for (uint8_t i=0; i < MATRIX_ROWS; i++) { matrix[i] = 0; + raw_matrix[i] = 0; for (uint8_t j=0; j < MATRIX_COLS; ++j) { debounce_matrix[i * MATRIX_COLS + j] = 0; } @@ -151,26 +157,30 @@ void matrix_power_up(void) { // Returns a matrix_row_t whose bits are set if the corresponding key should be // eligible to change in this scan. -matrix_row_t debounce_mask(uint8_t row) { +matrix_row_t debounce_mask(matrix_row_t rawcols, uint8_t row) { matrix_row_t result = 0; - for (uint8_t j=0; j < MATRIX_COLS; ++j) { - if (debounce_matrix[row * MATRIX_COLS + j]) { - --debounce_matrix[row * MATRIX_COLS + j]; + matrix_row_t change = rawcols ^ raw_matrix[row]; + raw_matrix[row] = rawcols; + for (uint8_t i = 0; i < MATRIX_COLS; ++i) { + if (debounce_matrix[row * MATRIX_COLS + i]) { + --debounce_matrix[row * MATRIX_COLS + i]; } else { - result |= (1 << j); + result |= (1 << i); + } + if (change & (1 << i)) { + debounce_matrix[row * MATRIX_COLS + i] = DEBOUNCE; } } return result; } -// Report changed keys in the given row. Resets the debounce countdowns -// corresponding to each set bit in 'change' to DEBOUNCE. -void debounce_report(matrix_row_t change, uint8_t row) { - for (uint8_t i = 0; i < MATRIX_COLS; ++i) { - if (change & (1 << i)) { - debounce_matrix[row * MATRIX_COLS + i] = DEBOUNCE; - } - } +matrix_row_t debounce_read_cols(uint8_t row) { + // Read the row without debouncing filtering and store it for later usage. + matrix_row_t cols = read_cols(row); + // Get the Debounce mask. + matrix_row_t mask = debounce_mask(cols, row); + // debounce the row and return the result. + return (cols & mask) | (matrix[row] & ~mask);; } uint8_t matrix_scan(void) @@ -214,15 +224,12 @@ uint8_t matrix_scan(void) select_row(i + MATRIX_ROWS_PER_SIDE); // we don't need a 30us delay anymore, because selecting a // left-hand row requires more than 30us for i2c. - matrix_row_t mask = debounce_mask(i); - matrix_row_t cols = (read_cols(i) & mask) | (matrix[i] & ~mask); - debounce_report(cols ^ matrix[i], i); - matrix[i] = cols; + + // grab cols from left hand + matrix[i] = debounce_read_cols(i); // grab cols from right hand - mask = debounce_mask(i + MATRIX_ROWS_PER_SIDE); - cols = (read_cols(i + MATRIX_ROWS_PER_SIDE) & mask) | (matrix[i + MATRIX_ROWS_PER_SIDE] & ~mask); - debounce_report(cols ^ matrix[i + MATRIX_ROWS_PER_SIDE], i + MATRIX_ROWS_PER_SIDE); - matrix[i + MATRIX_ROWS_PER_SIDE] = cols; + matrix[i + MATRIX_ROWS_PER_SIDE] = debounce_read_cols(i + MATRIX_ROWS_PER_SIDE); + unselect_rows(); } From 93c0362552603f2d2517ff3b5afe2667968e3bda Mon Sep 17 00:00:00 2001 From: Nick Piazza Date: Tue, 20 Nov 2018 12:07:20 -0600 Subject: [PATCH 541/788] Update Levinson readme to support elite-c (#4445) * init - updated levinson readme to support elite-c * updated readme per PR comment * added trailing spaces to lines 6 7 8 * updated readme bootloader instructions * updated readme * updated readme --- keyboards/levinson/readme.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/keyboards/levinson/readme.md b/keyboards/levinson/readme.md index 79e64d332..8cb4ff1cf 100644 --- a/keyboards/levinson/readme.md +++ b/keyboards/levinson/readme.md @@ -4,17 +4,25 @@ Levinson A split 40% split 4x12 ortholinear keyboard made and sold by Keebio. It's essentially a Let's Split with LED backlight support and 2u thumb key support. [More info at Keebio](https://keeb.io). Keyboard Maintainer: [Bakingpy/nooges](https://github.com/nooges) -Hardware Supported: Pro Micro +Hardware Supported: Pro Micro, Elite-C Hardware Availability: [Keebio](https://keeb.io) Make example for this keyboard (after setting up your build environment): make levinson/rev2:default -Example of flashing this keyboard: +Example of flashing this keyboard with Pro micro: make levinson/rev2:default:avrdude -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. +Example of flashing this keyboard with Elite-C: + +You'll need to add `BOOTLOADER = atmel-dfu` to your `rules.mk` to ensure that resetting the board works properly. + +Hold the reset button on the Elite-C board, or the reset button on the keyboard if already assembled, then release the button and run: + + make levinson/rev2:default:dfu + +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). A build guide for this keyboard can be found here: [Levinson Build Guide](https://docs.keeb.io) From 303fa4ec3337760922a17fb19150c1aa3f58a3b3 Mon Sep 17 00:00:00 2001 From: Michael Kemp <20897849+mkem114@users.noreply.github.com> Date: Wed, 21 Nov 2018 07:11:23 +1300 Subject: [PATCH 542/788] Keyboard: Add Handwired 108 Key with Trackpoint (#4448) * Include both base keyboards * Merge the keymap * Merge the configs * Add wiring diagram for clarity of documentation * Merge rules * Merge keyboard sources * Change names to compile * Update documentation to suit * Add qwerty layout to 108keyTrackpoint * Separate the dvorak standard layout from a media focused one * Update documentation to reflect new keymaps * [style] Add empty lines at ends of files * [style] Meet current QMK style guide * Bring READEME closer to the QMK template * [style] Change all "108keyTrackpoint" to "108key_trackpoint" * [style] Use "LAYOUT" instead of "KEYMAP" QMK terminology has changed Co-Authored-By: mkem114 <20897849+mkem114@users.noreply.github.com> * Add two spaces after maintainer in README This is required to render properly Co-Authored-By: mkem114 <20897849+mkem114@users.noreply.github.com> * Remove redundant line "PREVENT_STUCK_MODIFIERS" is default on for QMK Co-Authored-By: mkem114 <20897849+mkem114@users.noreply.github.com> * Change include of keymaps to use QMK_KEYBOARD_H This includes automatically * Update make rules to match template * Change from KC_MENU to KC_APP The button functionality actually wanted is the context menu key * [style] Change "dvorakMedia" to "dvorak_media" * Update README to reflect minor changes --- .../108key_trackpoint/108key_trackpoint.c | 1 + .../108key_trackpoint/108key_trackpoint.h | 23 ++++++ .../handwired/108key_trackpoint/README.md | 23 ++++++ .../handwired/108key_trackpoint/config.h | 73 +++++++++++++++++ .../keymaps/default/keymap.c | 14 ++++ .../108key_trackpoint/keymaps/dvorak/keymap.c | 14 ++++ .../keymaps/dvorak_media/keymap.c | 14 ++++ .../handwired/108key_trackpoint/rules.mk | 82 +++++++++++++++++++ 8 files changed, 244 insertions(+) create mode 100644 keyboards/handwired/108key_trackpoint/108key_trackpoint.c create mode 100644 keyboards/handwired/108key_trackpoint/108key_trackpoint.h create mode 100644 keyboards/handwired/108key_trackpoint/README.md create mode 100644 keyboards/handwired/108key_trackpoint/config.h create mode 100644 keyboards/handwired/108key_trackpoint/keymaps/default/keymap.c create mode 100644 keyboards/handwired/108key_trackpoint/keymaps/dvorak/keymap.c create mode 100644 keyboards/handwired/108key_trackpoint/keymaps/dvorak_media/keymap.c create mode 100644 keyboards/handwired/108key_trackpoint/rules.mk diff --git a/keyboards/handwired/108key_trackpoint/108key_trackpoint.c b/keyboards/handwired/108key_trackpoint/108key_trackpoint.c new file mode 100644 index 000000000..3834f8961 --- /dev/null +++ b/keyboards/handwired/108key_trackpoint/108key_trackpoint.c @@ -0,0 +1 @@ +#include "108key_trackpoint.h" diff --git a/keyboards/handwired/108key_trackpoint/108key_trackpoint.h b/keyboards/handwired/108key_trackpoint/108key_trackpoint.h new file mode 100644 index 000000000..100f4cb93 --- /dev/null +++ b/keyboards/handwired/108key_trackpoint/108key_trackpoint.h @@ -0,0 +1,23 @@ +#pragma once + +#include "quantum.h" + +#define LAYOUT( \ + K000, K002, K003, K004, K005, K007, K008, K009, K010, K011, K012, K013, K014, K015, K016, K017, K019, K020, K021, K022, \ + \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K214, K215, K216, K217, K219, K220, K221, K222, \ + K300, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, K316, K317, K319, K320, K321, \ + K400, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K419, K420, K421, K422, \ + K501, K502, K503, K504, K505, K506, K507, K508, K509, K510, K511, K513, K516, K519, K520, K521, \ + K600, K601, K603, K606, K610, K611, K613, K614, K615, K616, K617, K619, K621, K622, \ + K705, K706, K707 \ +) { \ + { K000, KC_NO, K002, K003, K004, K005, KC_NO, K007, K008, K009, K010, K011, K012, K013, K014, K015, K016, K017, KC_NO, K019, K020, K021, K022 }, \ + { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, KC_NO, K214, K215, K216, K217, KC_NO, K219, K220, K221, K222 }, \ + { K300, KC_NO, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, K316, K317, KC_NO, K319, K320, K321, KC_NO }, \ + { K400, KC_NO, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, K419, K420, K421, K422 }, \ + { KC_NO, K501, K502, K503, K504, K505, K506, K507, K508, K509, K510, K511, KC_NO, K513, KC_NO, KC_NO, K516, KC_NO, KC_NO, K519, K520, K521, KC_NO }, \ + { K600, K601, KC_NO, K603, KC_NO, KC_NO, K606, KC_NO, KC_NO, KC_NO, K610, K611, KC_NO, K613, K614, K615, K616, K617, KC_NO, K619, KC_NO, K621, K622 }, \ + { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, K705, K706, K707, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \ +} diff --git a/keyboards/handwired/108key_trackpoint/README.md b/keyboards/handwired/108key_trackpoint/README.md new file mode 100644 index 000000000..247043e17 --- /dev/null +++ b/keyboards/handwired/108key_trackpoint/README.md @@ -0,0 +1,23 @@ +# 108 Key with TrackPoint + +![wiring](https://raw.githubusercontent.com/qmk/qmk.fm/gh-pages/keyboards/handwired/108key_trackpoint/wiring.JPG) + +This is based off the handwired/trackpoint keyboard and generated code from [Keyboard Firmware Builder](https://kbfirmware.com/). + +Keyboard Maintainer: [mkem114](https://github.com/mkem114) +Hardware Supported (tested): Teensy++ 2.0 + +Make example for this keyboard (after setting up your build environment): + + make handwired/108keyTrackpoint:default + +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). + +You may have to modify the source code to suit 104 keys, RGB back-lights, different micro-controllers, or big ass enter. + +There are three keymaps: +* qwerty with the four extra keys being: mute, media prev, media next, and media play +* dvorak with the four extra keys being: mute, media prev, media next, and media play +* dvorak_media with the caps lock being media play and the four extra keys being: mute, volume down, volume up, and media next + +To figure out how to wire your specific TrackPoint have a look out: [How to integrate a trackpoint in a mechanical keyboard](https://github.com/alonswartz/trackpoint). diff --git a/keyboards/handwired/108key_trackpoint/config.h b/keyboards/handwired/108key_trackpoint/config.h new file mode 100644 index 000000000..7a63fe262 --- /dev/null +++ b/keyboards/handwired/108key_trackpoint/config.h @@ -0,0 +1,73 @@ +#pragma once + +#include "config_common.h" + +#define VENDOR_ID 0x1234 +#define PRODUCT_ID 0x5678 +#define DEVICE_VER 0x0001 +#define MANUFACTURER QMK +#define PRODUCT 108Key-Trackpoint +#define DESCRIPTION A 108 key ANSI keyboard with a trackpoint and three mouse buttons + +#define MATRIX_ROWS 8 +#define MATRIX_COLS 23 + +#ifdef PS2_USE_USART + #define PS2_CLOCK_PORT PORTD + #define PS2_CLOCK_PIN PIND + #define PS2_CLOCK_DDR DDRD + #define PS2_CLOCK_BIT 5 + #define PS2_DATA_PORT PORTD + #define PS2_DATA_PIN PIND + #define PS2_DATA_DDR DDRD + #define PS2_DATA_BIT 2 + + /* synchronous, odd parity, 1-bit stop, 8-bit data, sample at falling edge */ + /* set DDR of CLOCK as input to be slave */ + #define PS2_USART_INIT() do { \ + PS2_CLOCK_DDR &= ~(1<mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + diff --git a/keyboards/handwired/108key_trackpoint/keymaps/default/keymap.c b/keyboards/handwired/108key_trackpoint/keymaps/default/keymap.c new file mode 100644 index 000000000..3345aca16 --- /dev/null +++ b/keyboards/handwired/108key_trackpoint/keymaps/default/keymap.c @@ -0,0 +1,14 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT ( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, KC_MUTE, KC_MPRV, KC_MNXT, KC_MPLY, + + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, KC_UP, KC_P1, KC_P2, KC_P3, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_LALT, KC_LGUI, KC_APP, KC_LCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT, + KC_BTN1, KC_BTN3, KC_BTN2 + ) +}; diff --git a/keyboards/handwired/108key_trackpoint/keymaps/dvorak/keymap.c b/keyboards/handwired/108key_trackpoint/keymaps/dvorak/keymap.c new file mode 100644 index 000000000..0181ad9f7 --- /dev/null +++ b/keyboards/handwired/108key_trackpoint/keymaps/dvorak/keymap.c @@ -0,0 +1,14 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT ( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, KC_MUTE, KC_MPRV, KC_MNXT, KC_MPLY, + + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, KC_RBRC, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, + KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, KC_EQL, KC_BSLS, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, + KC_CAPS, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS, + KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_LSFT, KC_UP, KC_P1, KC_P2, KC_P3, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_LALT, KC_LGUI, KC_APP, KC_LCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT, + KC_BTN1, KC_BTN3, KC_BTN2 + ) +}; diff --git a/keyboards/handwired/108key_trackpoint/keymaps/dvorak_media/keymap.c b/keyboards/handwired/108key_trackpoint/keymaps/dvorak_media/keymap.c new file mode 100644 index 000000000..d6223c496 --- /dev/null +++ b/keyboards/handwired/108key_trackpoint/keymaps/dvorak_media/keymap.c @@ -0,0 +1,14 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT ( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, KC_MUTE, KC_VOLD, KC_VOLU, KC_MNXT, + + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, KC_RBRC, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, + KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, KC_EQL, KC_BSLS, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, + KC_MPLY, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS, + KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_LSFT, KC_UP, KC_P1, KC_P2, KC_P3, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_LALT, KC_LGUI, KC_APP, KC_LCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT, + KC_BTN1, KC_BTN3, KC_BTN2 + ) +}; diff --git a/keyboards/handwired/108key_trackpoint/rules.mk b/keyboards/handwired/108key_trackpoint/rules.mk new file mode 100644 index 000000000..84ec52eee --- /dev/null +++ b/keyboards/handwired/108key_trackpoint/rules.mk @@ -0,0 +1,82 @@ +# MCU name +MCU = at90usb1286 +#MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = halfkay + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = yes # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) +PS2_MOUSE_ENABLE = yes +PS2_USE_USART = yes From 8837b9d99e59f9d815992352a28a1a515893e805 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Wed, 21 Nov 2018 07:49:28 -0800 Subject: [PATCH 543/788] Fix row 11 --- keyboards/ergodox_ez/matrix.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/keyboards/ergodox_ez/matrix.c b/keyboards/ergodox_ez/matrix.c index 2e95c83b6..3ff1c7ab4 100644 --- a/keyboards/ergodox_ez/matrix.c +++ b/keyboards/ergodox_ez/matrix.c @@ -379,7 +379,7 @@ static void select_row(uint8_t row) break; case 11: DDRD |= (1<<2); - PORTD &= ~(1<<3); + PORTD &= ~(1<<2); break; case 12: DDRD |= (1<<3); @@ -392,4 +392,3 @@ static void select_row(uint8_t row) } } } - From 2f34252278280c34b6958066240e38a2ee6a7237 Mon Sep 17 00:00:00 2001 From: Joe Wasson Date: Wed, 21 Nov 2018 13:18:18 -0800 Subject: [PATCH 544/788] Keymap: Update keymap to match latest changes to Wilba's firmware. (#4432) * Fix firmware to work with latest Wilba changes (i.e. dynamic keymap) and M60a. * Get back RGB Backlight codes. * More tweaks. * Update users/talljoe/rules.mk Co-Authored-By: Talljoe --- keyboards/rama/m60_a/rules.mk | 6 +- .../minivan}/keymaps/talljoe-minivan/config.h | 10 +- .../minivan}/keymaps/talljoe-minivan/keymap.c | 0 .../minivan}/keymaps/talljoe-minivan/rules.mk | 0 .../60_ansi_split_bs_rshift/talljoe/config.h | 2 +- .../60_ansi_split_bs_rshift/talljoe/keymap.c | 95 +------------------ .../community/60_hhkb/talljoe-hhkb/config.h | 3 + .../community/tkl_ansi/talljoe-tkl/keymap.c | 90 +----------------- users/talljoe/config.h | 4 + users/talljoe/rules.mk | 2 + users/talljoe/talljoe.c | 34 ++++++- 11 files changed, 52 insertions(+), 194 deletions(-) rename keyboards/{tv44 => thevankeyboards/minivan}/keymaps/talljoe-minivan/config.h (94%) rename keyboards/{tv44 => thevankeyboards/minivan}/keymaps/talljoe-minivan/keymap.c (100%) rename keyboards/{tv44 => thevankeyboards/minivan}/keymaps/talljoe-minivan/rules.mk (100%) diff --git a/keyboards/rama/m60_a/rules.mk b/keyboards/rama/m60_a/rules.mk index 7ab1b7d3b..9c1a2d9df 100644 --- a/keyboards/rama/m60_a/rules.mk +++ b/keyboards/rama/m60_a/rules.mk @@ -54,7 +54,7 @@ BOOTLOADER = atmel-dfu OPT_DEFS += -DNO_SUSPEND_POWER_DOWN # Build Options -# change to "no" to disable the options, or define them in the Makefile in +# change to "no" to disable the options, or define them in the Makefile in # the appropriate keymap folder that will get included automatically # BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) @@ -68,7 +68,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend @@ -76,3 +76,5 @@ SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend RAW_ENABLE = yes DYNAMIC_KEYMAP_ENABLE = yes CIE1931_CURVE = yes + +LAYOUTS = 60_hhkb diff --git a/keyboards/tv44/keymaps/talljoe-minivan/config.h b/keyboards/thevankeyboards/minivan/keymaps/talljoe-minivan/config.h similarity index 94% rename from keyboards/tv44/keymaps/talljoe-minivan/config.h rename to keyboards/thevankeyboards/minivan/keymaps/talljoe-minivan/config.h index fa1f43adc..26d5e207e 100644 --- a/keyboards/tv44/keymaps/talljoe-minivan/config.h +++ b/keyboards/thevankeyboards/minivan/keymaps/talljoe-minivan/config.h @@ -11,7 +11,7 @@ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, \ K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \ K40, K41, K42, K44, K45, K46, K48, K49, K4B, K4C \ -) KEYMAP_ARROW( \ +) LAYOUT_arrow( \ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1D, \ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, \ K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K0D, \ @@ -24,7 +24,7 @@ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, \ K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \ K40, K41, K42, K44, K45, K46, K48, K49, K4B, K4C \ -) KEYMAP_ARROW( \ +) LAYOUT_arrow( \ K00, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1D, \ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2C, \ K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, \ @@ -37,14 +37,14 @@ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, \ K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \ K40, K41, K42, K44, K45, K46, K48, K49, K4B, K4C \ -) KEYMAP_ARROW( \ +) LAYOUT_arrow( \ K00, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K2D, \ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2C, \ K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, \ - K40, K49, K42, K44, K45, K48, K0B, K0C, K4C \ + K40, K41, K42, K44, K45, K48, K0B, K0C, K4C \ ) -#define TEMPLATE_RESET KEYMAP_ARROW( \ +#define TEMPLATE_RESET LAYOUT_arrow( \ RESET, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, RESET, \ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ diff --git a/keyboards/tv44/keymaps/talljoe-minivan/keymap.c b/keyboards/thevankeyboards/minivan/keymaps/talljoe-minivan/keymap.c similarity index 100% rename from keyboards/tv44/keymaps/talljoe-minivan/keymap.c rename to keyboards/thevankeyboards/minivan/keymaps/talljoe-minivan/keymap.c diff --git a/keyboards/tv44/keymaps/talljoe-minivan/rules.mk b/keyboards/thevankeyboards/minivan/keymaps/talljoe-minivan/rules.mk similarity index 100% rename from keyboards/tv44/keymaps/talljoe-minivan/rules.mk rename to keyboards/thevankeyboards/minivan/keymaps/talljoe-minivan/rules.mk diff --git a/layouts/community/60_ansi_split_bs_rshift/talljoe/config.h b/layouts/community/60_ansi_split_bs_rshift/talljoe/config.h index bf18fd9f7..65568d3ab 100644 --- a/layouts/community/60_ansi_split_bs_rshift/talljoe/config.h +++ b/layouts/community/60_ansi_split_bs_rshift/talljoe/config.h @@ -34,7 +34,7 @@ { K40, K41, K42, {}, {}, {}, {}, K47, {}, {}, K4A, K4B, K4C, K4D } \ } -#ifdef KEYBOARD_zeal60 +#if defined (RGB_BACKLIGHT_ZEAL60) || defined (RGB_BACKLIGHT_M60_A) #define ZEAL_RGB diff --git a/layouts/community/60_ansi_split_bs_rshift/talljoe/keymap.c b/layouts/community/60_ansi_split_bs_rshift/talljoe/keymap.c index cfad9da8a..7812add81 100644 --- a/layouts/community/60_ansi_split_bs_rshift/talljoe/keymap.c +++ b/layouts/community/60_ansi_split_bs_rshift/talljoe/keymap.c @@ -1,94 +1 @@ -#ifdef KEYBOARD_zeal60 -#include "config.h" -#include "zeal60.h" -#include "rgb_backlight.h" -#include "action_layer.h" -#include "solarized.h" -#include "talljoe.h" - -// from zeal_backlight.c -// we want to be able to set indicators for the spacebar stabs -// but they are not represented by a row/index. -extern backlight_config g_config; -void map_row_column_to_led( uint8_t row, uint8_t column, uint8_t *led ); - -void set_backlight_defaults(void) { - uint8_t space; - uint8_t caps_lock; - map_row_column_to_led(3, 12, &caps_lock); - map_row_column_to_led(4, 7, &space); - backlight_config default_values = { - .use_split_backspace = USE_SPLIT_BACKSPACE, - .use_split_left_shift = USE_SPLIT_LEFT_SHIFT, - .use_split_right_shift = USE_SPLIT_RIGHT_SHIFT, - .use_7u_spacebar = USE_7U_SPACEBAR, - .use_iso_enter = USE_ISO_ENTER, - .disable_when_usb_suspended = 1, - .disable_after_timeout = 0, - .brightness = 255, - .effect = 10, - .color_1 = solarized.base2, - .color_2 = solarized.base02, - .caps_lock_indicator = { .index = caps_lock, .color = solarized.red }, - .layer_1_indicator = { .index = space, .color = solarized.blue }, - .layer_2_indicator = { .index = space, .color = solarized.yellow }, - .layer_3_indicator = { .index = 254, .color = solarized.red }, - .alphas_mods = { - RGB_BACKLIGHT_ALPHAS_MODS_ROW_0, - RGB_BACKLIGHT_ALPHAS_MODS_ROW_1, - RGB_BACKLIGHT_ALPHAS_MODS_ROW_2, - RGB_BACKLIGHT_ALPHAS_MODS_ROW_3, - RGB_BACKLIGHT_ALPHAS_MODS_ROW_4 } - }; - memcpy(&g_config, &default_values, sizeof(backlight_config)); - backlight_config_save(); - -#undef CUSTOM_RGB_LAYOUTS -#ifdef CUSTOM_RGB_LAYOUTS - solarized_t* S = &solarized; - HSV alphas = S->base2; - HSV custom_color_map[MATRIX_ROWS][MATRIX_COLS] = CM( - S->red, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, S->red, - S->orange, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, S->orange, - S->green, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, S->green, - S->blue, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, S->blue, S->blue, - S->violet, S->magenta, S->yellow, alphas, S->yellow, S->magenta, S->violet, S->green - ); - for (uint8_t row = 0; row < MATRIX_ROWS; ++row) { - for (uint8_t col = 0; col < MATRIX_COLS; ++col) { - uint8_t index; - map_row_column_to_led( row, col, &index ); - set_key_color(index, custom_color_map[row][col]); - } - } -#endif // CUSTOM_RGB_LAYOUTS -} - -bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { - static uint8_t last_effect; - switch (keycode) { - case DFAULTS: - if (IS_PRESSED(record->event)) set_backlight_defaults(); - return false; - case BL_TOGG: - if (IS_PRESSED(record->event)) { - if (g_config.effect) { - last_effect = g_config.effect; - g_config.effect = 0; - } else { - g_config.effect = last_effect; - } - } - return false; - case EFFECT...EFFECT_END: - if (IS_PRESSED(record->event)) { - uint8_t effect = keycode - EFFECT; - g_config.effect = effect; - backlight_config_save(); - } - return false; - } - - return true; -} -#endif +// This space intentionally left blank diff --git a/layouts/community/60_hhkb/talljoe-hhkb/config.h b/layouts/community/60_hhkb/talljoe-hhkb/config.h index 9e907feeb..54756a940 100644 --- a/layouts/community/60_hhkb/talljoe-hhkb/config.h +++ b/layouts/community/60_hhkb/talljoe-hhkb/config.h @@ -19,4 +19,7 @@ K41, K42, K45, K48, K4C \ ) +#ifdef RGB_BACKLIGHT_M60_A + #define ZEAL_RGB +#endif #endif //CONFIG_USER_H diff --git a/layouts/community/tkl_ansi/talljoe-tkl/keymap.c b/layouts/community/tkl_ansi/talljoe-tkl/keymap.c index b5dc54492..7812add81 100644 --- a/layouts/community/tkl_ansi/talljoe-tkl/keymap.c +++ b/layouts/community/tkl_ansi/talljoe-tkl/keymap.c @@ -1,89 +1 @@ -#ifdef KEYBOARD_zeal60 -#include "config.h" -#include "zeal60.h" -#include "zeal_backlight.h" -#include "action_layer.h" -#include "solarized.h" -#include "talljoe.h" - -// from zeal_backlight.c -// we want to be able to set indicators for the spacebar stabs -// but they are not represented by a row/index. -extern zeal_backlight_config g_config; -void map_row_column_to_led( uint8_t row, uint8_t column, uint8_t *led ); - -void set_backlight_defaults(void) { - uint8_t space; - uint8_t caps_lock; - map_row_column_to_led(3, 12, &caps_lock); - map_row_column_to_led(4, 7, &space); - zeal_backlight_config default_values = { - .use_split_backspace = USE_SPLIT_BACKSPACE, - .use_split_left_shift = USE_SPLIT_LEFT_SHIFT, - .use_split_right_shift = USE_SPLIT_RIGHT_SHIFT, - .use_7u_spacebar = USE_7U_SPACEBAR, - .use_iso_enter = USE_ISO_ENTER, - .disable_when_usb_suspended = 1, - .disable_after_timeout = 0, - .brightness = 255, - .effect = 10, - .color_1 = solarized.base2, - .color_2 = solarized.base02, - .caps_lock_indicator = { .index = caps_lock, .color = solarized.red }, - .layer_1_indicator = { .index = space, .color = solarized.blue }, - .layer_2_indicator = { .index = space, .color = solarized.yellow }, - .layer_3_indicator = { .index = 254, .color = solarized.red }, - .alphas_mods = { - BACKLIGHT_ALPHAS_MODS_ROW_0, - BACKLIGHT_ALPHAS_MODS_ROW_1, - BACKLIGHT_ALPHAS_MODS_ROW_2, - BACKLIGHT_ALPHAS_MODS_ROW_3, - BACKLIGHT_ALPHAS_MODS_ROW_4 } - }; - memcpy(&g_config, &default_values, sizeof(zeal_backlight_config)); - backlight_config_save(); - - solarized_t* S = &solarized; - HSV alphas = S->base2; - HSV custom_color_map[MATRIX_ROWS][MATRIX_COLS] = CM( - S->red, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, S->red, - S->orange, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, S->orange, - S->green, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, S->green, - S->blue, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, S->blue, S->blue, - S->violet, S->magenta, S->yellow, alphas, S->yellow, S->magenta, S->violet, S->green - ); - for (uint8_t row = 0; row < MATRIX_ROWS; ++row) { - for (uint8_t col = 0; col < MATRIX_COLS; ++col) { - backlight_set_key_color(row, col, custom_color_map[row][col]); - } - } -} - -bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { - static uint8_t last_effect; - switch (keycode) { - case DFAULTS: - if (IS_PRESSED(record->event)) set_backlight_defaults(); - return false; - case BL_TOGG: - if (IS_PRESSED(record->event)) { - if (g_config.effect) { - last_effect = g_config.effect; - g_config.effect = 0; - } else { - g_config.effect = last_effect; - } - } - return false; - case EFFECT...EFFECT_END: - if (IS_PRESSED(record->event)) { - uint8_t effect = keycode - EFFECT; - g_config.effect = effect; - backlight_config_save(); - } - return false; - } - - return true; -} -#endif +// This space intentionally left blank diff --git a/users/talljoe/config.h b/users/talljoe/config.h index 0d06a0b12..33374014d 100644 --- a/users/talljoe/config.h +++ b/users/talljoe/config.h @@ -5,4 +5,8 @@ #define RESET_LAYER 15 +#define BOOTMAGIC_KEY_SALT KC_ESC +#define BOOTMAGIC_KEY_SKIP KC_I +#define BOOTMAGIC_KEY_EEPROM_CLEAR KC_E + #endif // !USERSPACE_CONFIG_H diff --git a/users/talljoe/rules.mk b/users/talljoe/rules.mk index 0f1f6f26a..e0a71561f 100644 --- a/users/talljoe/rules.mk +++ b/users/talljoe/rules.mk @@ -5,3 +5,5 @@ EXTRAFLAGS+=-flto TAP_DANCE_ENABLE=yes CONSOLE_ENABLE=no COMMAND_ENABLE=no +DYNAMIC_KEYMAP_ENABLE=no +BOOTMAGIC_ENABLE=full diff --git a/users/talljoe/talljoe.c b/users/talljoe/talljoe.c index 7a343e776..e72dc6c3e 100644 --- a/users/talljoe/talljoe.c +++ b/users/talljoe/talljoe.c @@ -1,13 +1,16 @@ #include QMK_KEYBOARD_H #include "talljoe.h" +#ifdef ZEAL_RGB +#include "../../../keyboards/zeal60/rgb_backlight.h" +#endif const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_BASE] = TEMPLATE_TKL( KC_ESC, KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , KC_F12 , KC_PSCR, KC_SLCK, MO_ADJ , US_GRV , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_MINS, KC_EQL , US_BSLS, KC_INS , KC_HOME, KC_PGUP, US_TAB , KC_Q, KC_W, KC_E, KC_R, KC_T , KC_Y, KC_U, KC_I, KC_O, KC_P , KC_LBRC, KC_RBRC, KC_BSPC, KC_DEL , KC_END , KC_PGDN, - CTL_ESC, KC_A, KC_S, KC_D, KC_F, KC_G , KC_H, KC_J, KC_K, KC_L, US_SCLN, US_QUOT, US_ENT , + CTL_ESC, KC_A, KC_S, KC_D, KC_F, KC_G , KC_H, KC_J, KC_K, KC_L, US_SCLN, KC_QUOT, US_ENT , SH_LBRC, KC_Z, KC_X, KC_C, KC_V, KC_B , KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SH_RBRC, KC_UP , KC_LCTL, KC_LGUI, KC_LALT, KC_SPC2, KC_SPC1, KC_SPC3, KC_RALT, KC_RGUI, KC_RCTL, KC_PTT , KC_LEFT, KC_DOWN, KC_RGHT), [_WORKMAN] = TEMPLATE( @@ -52,7 +55,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_PTT , KC_PGDN, KC_SPC , KC_SPC , KC_SPC , KC_RALT, KC_APP , KC_RCTL, KC_PTT ), #endif [_NAV] = TEMPLATE_NAV( - KC_GRV , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_GRV , KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , KC_F12 , XXXXXXX, XXXXXXX, US_TAB , KC_EXLM, KC_AT , KC_HASH, KC_DLR , KC_PERC, KC_INS , KC_PGUP, KC_UP , KC_PGDN, KC_BTN1, KC_BTN3, KC_BTN2, KC_DEL , CTL_ESC, KC_LCBR, KC_RCBR, KC_LPRN, KC_RPRN, KC_AMPR, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END , US_QUOT, TG_ADJ , KC_LSFT, KC_EQL, KC_PLUS, KC_MINS, KC_UNDS, KC_ASTR, KC_CALC, US_GRV , KC_WBAK, KC_WFWD, KC_WREF, KC_RSFT, KC_APP , @@ -65,7 +68,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LGUI, KC_LALT, NM_SPC2, NM_SPC1, NM_SPC3, KC_PDOT, KC_PCMM, KC_RCTL, KC_PTT ), // Adjust layer is on the split-shift key; or NAV+Enter (for non-split keyboards) [_ADJUST] = TEMPLATE_ADJUST( - MO_RST , FX(1) , FX(2) , FX(3) , FX(4) , FX(5) , FX(8) , FX(9) , FX(10) , FX(20) , FX(0) , BR_DEC , BR_INC , XXXXXXX, MO_RST , + MO_RST , FX(1) , FX(2) , FX(3) , FX(4) , FX(5) , FX(6) , FX(7) , FX(8) , FX(9) , FX(10) , BR_DEC , BR_INC , XXXXXXX, MO_RST , MO_RST , H1_INC , S1_INC , H2_INC , S2_INC , EF_INC , RGB_HUI, RGB_SAI, RGB_MOD, RGB_M_P, DFAULTS, RGB_VAD, RGB_VAI, MO_RST , XXXXXXX, H1_DEC , S1_DEC , H2_DEC , S2_DEC , EF_DEC , RGB_HUD, RGB_SAD, RGB_RMOD,RGB_M_K, RGB_M_B, RGB_M_G, TG_ADJ , TG_NKRO, LY_QWER, LY_WORK, LY_NRMN, LY_DVRK, LY_CLMK, XXXXXXX, LY_MALT, XXXXXXX, XXXXXXX, KC_MAKE, KC_CAPS, XXXXXXX, @@ -101,7 +104,11 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { return true; } +#ifdef ZEAL_RGB +extern backlight_config g_config; +#endif bool process_record_user(uint16_t keycode, keyrecord_t *record) { + static uint8_t last_effect; #ifdef RGBLIGHT_ENABLE static uint32_t savedRgbMode; @@ -144,6 +151,27 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } return false; break; +#ifdef ZEAL_RGB + case BL_TOGG: + if (IS_PRESSED(record->event)) { + if (g_config.effect) { + last_effect = g_config.effect; + g_config.effect = 0; + } else { + g_config.effect = last_effect; + } + } + return false; + case EFFECT...EFFECT_END: + if (IS_PRESSED(record->event)) { + uint8_t effect = keycode - EFFECT; + if(effect == g_config.effect) + effect = 0; // Toggle effect on second press + g_config.effect = effect; + backlight_config_save(); + } + return false; +#endif } return process_record_keymap(keycode, record); } From 87f06e7297c10020912beaba10013f11d2e8e570 Mon Sep 17 00:00:00 2001 From: yiancar Date: Wed, 21 Nov 2018 15:12:40 -0800 Subject: [PATCH 545/788] Fix raw hid define for chibios (#4460) --- tmk_core/protocol/chibios/main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tmk_core/protocol/chibios/main.c b/tmk_core/protocol/chibios/main.c index 6cceccd23..ee9571c95 100644 --- a/tmk_core/protocol/chibios/main.c +++ b/tmk_core/protocol/chibios/main.c @@ -75,7 +75,7 @@ host_driver_t chibios_driver = { void virtser_task(void); #endif -#ifdef RAW_HID_ENABLE +#ifdef RAW_ENABLE void raw_hid_task(void); #endif @@ -220,7 +220,7 @@ int main(void) { #ifdef VIRTSER_ENABLE virtser_task(); #endif -#ifdef RAW_HID_ENABLE +#ifdef RAW_ENABLE raw_hid_task(); #endif } From 2943d19ecd9f91db2390da6f6d09cf58ea2f8dde Mon Sep 17 00:00:00 2001 From: Milton Griffin Date: Thu, 22 Nov 2018 13:15:46 -0500 Subject: [PATCH 546/788] Keymap: Clone layout for Massdrop's xd75 (#4461) * Added default75. No lighting. * Added default75. No lighting. * Update keyboards/idobo/keymaps/default75/config.h Co-Authored-By: griffinmilton3 * Update keyboards/idobo/keymaps/default75/config.h Co-Authored-By: griffinmilton3 * Update keyboards/idobo/keymaps/default75/config.h Co-Authored-By: griffinmilton3 * Update keyboards/idobo/keymaps/default75/config.h Co-Authored-By: griffinmilton3 * Fixes for pull request * Updated keyboard declartion structure --- keyboards/idobo/keymaps/default75/config.h | 21 +++++++ keyboards/idobo/keymaps/default75/keymap.c | 67 +++++++++++++++++++++ keyboards/idobo/keymaps/default75/readme.md | 1 + keyboards/idobo/keymaps/default75/rules.mk | 14 +++++ 4 files changed, 103 insertions(+) create mode 100644 keyboards/idobo/keymaps/default75/config.h create mode 100644 keyboards/idobo/keymaps/default75/keymap.c create mode 100644 keyboards/idobo/keymaps/default75/readme.md create mode 100644 keyboards/idobo/keymaps/default75/rules.mk diff --git a/keyboards/idobo/keymaps/default75/config.h b/keyboards/idobo/keymaps/default75/config.h new file mode 100644 index 000000000..17c7addb3 --- /dev/null +++ b/keyboards/idobo/keymaps/default75/config.h @@ -0,0 +1,21 @@ +/* Copyright 2017 Benjamin Kesselring + * + * 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 . + */ + +#pragma once + + +// place overrides here + diff --git a/keyboards/idobo/keymaps/default75/keymap.c b/keyboards/idobo/keymaps/default75/keymap.c new file mode 100644 index 000000000..d607e11f6 --- /dev/null +++ b/keyboards/idobo/keymaps/default75/keymap.c @@ -0,0 +1,67 @@ +/* Copyright 2018 Milton Griffin + * + * 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 . + */ +#include QMK_KEYBOARD_H + +// Keyboard Layers +#define _QW 0 +#define _FN 1 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* QWERTY + * .--------------------------------------------------------------------------------------------------------------------------------------. + * | ESC | 1 | 2 | 3 | 4 | 5 | - | ` | = | 6 | 7 | 8 | 9 | 0 | BACKSP | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------| + * | TAB | Q | W | E | R | T | [ | \ | ] | Y | U | I | O | P | ' | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------+--------| + * | CAP LK | A | S | D | F | G | HOME | DEL | PG UP | H | J | K | L | ; | ENTER | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------------------------+--------| + * | LSHIFT | Z | X | C | V | B | END | UP | PG DN | N | M | , | . | / | RSHIFT | + * |--------+--------+--------+--------+--------+-----------------+--------+--------+--------+--------+-----------------+--------+--------| + * | LCTRL | LGUI | LALT | FN | SPACE | SPACE | LEFT | DOWN | RIGHT | SPACE | SPACE | FN | RALT | RGUI | RCTRL | + * '--------------------------------------------------------------------------------------------------------------------------------------' + */ + + [_QW] = LAYOUT_ortho_5x15( /* QWERTY */ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_MINS, KC_GRV, KC_EQL, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LBRC, KC_BSLS, KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_QUOT, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_HOME, KC_DEL, KC_PGUP, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_END, KC_UP, KC_PGDN, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \ + KC_LCTL, KC_LGUI, KC_LALT, MO(_FN), KC_SPC, KC_SPC, KC_LEFT, KC_DOWN, KC_RGHT, KC_SPC, KC_SPC, MO(_FN), KC_RALT, KC_RGUI, KC_RCTL \ + ), + +/* FUNCTION + * .--------------------------------------------------------------------------------------------------------------------------------------. + * | F1 | F2 | F3 | F4 | F5 | F6 | NUM LK | P/ | P* | F7 | F8 | F9 | F10 | F11 | F12 | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | SELECT | CALC | MYCOMP | MAIL | RGB HD | RGB HI | P7 | P8 | P9 | - | | | PR SCR | SCR LK | PAUSE | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | PREV | PLAY | NEXT | STOP | RGB SD | RGB SI | P4 | P5 | P6 | + | | RESET | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | VOL- | MUTE | VOL+ | APP | RGB VD | RGB VI | P1 | P2 | P3 | PENT | | | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | RGB TG | FN | RGB RMD| RGB MD | P0 | | P. | PENT | PENT | FN | | | | + * '--------------------------------------------------------------------------------------------------------------------------------------' + */ + + [_FN] = LAYOUT_ortho_5x15( /* FUNCTION */ + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_NLCK, KC_SLSH, KC_ASTR, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ + KC_MSEL, KC_CALC, KC_MYCM, KC_MAIL, RGB_HUD, RGB_HUI, KC_P7, KC_P8, KC_P9, KC_MINS, _______, _______, KC_PSCR, KC_SLCK, KC_PAUS, \ + KC_MPRV, KC_MPLY, KC_MNXT, KC_MSTP, RGB_SAD, RGB_SAI, KC_P4, KC_P5, KC_P6, KC_PLUS, _______, RESET, _______, _______, _______, \ + KC_VOLD, KC_MUTE, KC_VOLU, KC_APP, RGB_VAD, RGB_VAI, KC_P1, KC_P2, KC_P3, KC_PENT, _______, _______, _______, _______, _______, \ + _______, _______, RGB_TOG, MO(_FN), RGB_RMOD,RGB_MOD, KC_P0, _______, KC_PDOT, KC_PENT, KC_PENT, MO(_FN), _______, _______, _______ \ + ), +}; diff --git a/keyboards/idobo/keymaps/default75/readme.md b/keyboards/idobo/keymaps/default75/readme.md new file mode 100644 index 000000000..a1c0236ed --- /dev/null +++ b/keyboards/idobo/keymaps/default75/readme.md @@ -0,0 +1 @@ +# The default keymap for xd75, with led controls \ No newline at end of file diff --git a/keyboards/idobo/keymaps/default75/rules.mk b/keyboards/idobo/keymaps/default75/rules.mk new file mode 100644 index 000000000..7efceba50 --- /dev/null +++ b/keyboards/idobo/keymaps/default75/rules.mk @@ -0,0 +1,14 @@ +# Copyright 2013 Jun Wako +# +# 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 . From 3dd6d53942bd3fafb57d170ecdaccf57e459a62c Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Thu, 22 Nov 2018 21:53:01 +0100 Subject: [PATCH 547/788] ergodox: update algernon's layout to v1.12 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is the final version of my layout. Overall changes =============== * Updated to work with QMK master. Miscellaneous ============= * The `😂` symbol can be entered with UCIS. * `LEAD r` now inputs `Right Alt`. Signed-off-by: Gergely Nagy --- layouts/community/ergodox/algernon/NEWS.md | 13 +++++++++++++ .../ergodox/algernon/images/adore-layer.png | Bin 0 -> 105611 bytes .../ergodox/algernon/images/base-layer.png | Bin 0 -> 106956 bytes .../ergodox/algernon/images/heatmap.png | Bin 0 -> 139351 bytes .../ergodox/algernon/images/steno-layer.png | Bin 0 -> 64086 bytes layouts/community/ergodox/algernon/keymap.c | 8 +++++++- layouts/community/ergodox/algernon/readme.md | 12 +++++++++--- layouts/community/ergodox/algernon/rules.mk | 3 ++- 8 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 layouts/community/ergodox/algernon/images/adore-layer.png create mode 100644 layouts/community/ergodox/algernon/images/base-layer.png create mode 100644 layouts/community/ergodox/algernon/images/heatmap.png create mode 100644 layouts/community/ergodox/algernon/images/steno-layer.png diff --git a/layouts/community/ergodox/algernon/NEWS.md b/layouts/community/ergodox/algernon/NEWS.md index 1bc2b5dc6..a6ce9813b 100644 --- a/layouts/community/ergodox/algernon/NEWS.md +++ b/layouts/community/ergodox/algernon/NEWS.md @@ -1,5 +1,18 @@ +## v1.12 + +*2018-11-22* + +### Overall changes + +* Updated to work with QMK master. + +### Miscellaneous + +* The `😂` symbol can be entered with UCIS. +* `LEAD r` now inputs `Right Alt`. + ## v1.11 *2017-10-01* diff --git a/layouts/community/ergodox/algernon/images/adore-layer.png b/layouts/community/ergodox/algernon/images/adore-layer.png new file mode 100644 index 0000000000000000000000000000000000000000..75d2ca4f08b23b8233b298b0a30cb62b4072f0a3 GIT binary patch literal 105611 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

xqo?w3DlN6!_qw#HiY181nm>q#U@mnY&IM#Z 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μ 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 b_teo#A$ozE$1_6VotDnm{r-UW|3c5md literal 0 HcmV?d00001 diff --git a/layouts/community/ergodox/algernon/images/heatmap.png b/layouts/community/ergodox/algernon/images/heatmap.png new file mode 100644 index 0000000000000000000000000000000000000000..4f55c5adff5703a3b61ac5198694375ad49a405b GIT binary patch literal 139351 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%0D`~mx$kQG~ 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 EiAZ?2R`sI*BO+iJbgi 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�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 Z|BMfpRh#Y%&J|?<0#8>zmvv4FO#mw&Ym)!~ literal 0 HcmV?d00001 diff --git a/layouts/community/ergodox/algernon/images/steno-layer.png b/layouts/community/ergodox/algernon/images/steno-layer.png new file mode 100644 index 0000000000000000000000000000000000000000..9a2ba55effaa0b96f9bf9d31b81f3c2101c93ab9 GIT binary patch literal 64086 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

    I(Bex;?A5`xsbLM>%eo#im~+Z z;!rcdVK)^9{_rP4l-A!8uV(I2BoSs}2WbF@PP7**bk)D;5e*YQ>p*I~I?yZ|pO3Mul-teB1vDy>QJ4gTF1t42-;g*fP zxCrFDHctD5+YXnvSkvv^_393mpDYn)Ekx z|1?naod;VwhX~P!*z_FhmgtxmA_Pg;o1GDPTuxS+Mb%iRhd`0-%Pt(E0ebsrjFBET z9p+ZOERptl5Rt4-0~!y*%!|fAH&^EYCxA7hS3?xTUNW&NIc? z`!+r}lcKmU-|^qIYboDRSq0Ys(njM8OF~J&Qt{V=@VScRQmFl)#o)SurcW}D4vmh2c0z`QD;_J$aIq++){e4@WAu+dFG_S| zH?h@FxmNR_*R>8_e*(v2`(vR+T9Xbg13Bc;6&xOtTB-r_h6HAz<_84Tzn3(O-f!RG zGPitVBv#>5l3qLYM=tkM?ZE2jBC;geHZo(Y><(8_y@mg-lHkOINL4K7eV`fSw-3Gp z-bTC__vSHj(+Yy}Qrx_(mq=NXKS35eh+09*v$hxQ*NlMo5?WP&^A2OnYWvhIS!BGQ zuOMnrKVA5j>8m0@eKXQRmSh{~*^bUXUh@zl%89~NAzkzeon{_h65tNXkjqK3ZLNa=;-t9I7UccQx>44Ou`>^M?+QYOM|>K#2Abs#9}XaS4M>(~J87`oXXM ze|S|l)W_$N`7wHX+-wlJR~5fb7bSujgLAa3!iBAvauPzr(DLZ+-tdYj9)t@S)_@*1 z!9QLRv@N^xfEm`3sKD4A_1{lHV#qEJHpS}bbI!AS!rP(oAeOoC&jL7^o zwBZkC%<$Fk;?MwMz<FT1O-;7{ z*u*no`${MiqnN% ztv_#bp!dv`*C5b47zcpOx(kn^oq7!=(BSU;y`4xAThXb87(-y{ulYtb)Z!ml)~^Ie zSH{P`1rOk2D!V_Pn)VnN9chQM=;}To!RhL&@)Ug1 z3ioO3bX$OkRn10W9DXPyUz~-2oJqPTyi1ZMcY4PWqyJ=+w(Kz&#zz$EDbf+;o=ro>KkGSNFNU-+PM6Pz%%tD6x9l9huJ# z-}+w*f+wu8&`f{*OAi61v{TdW=`A-d1V3PX{!PBYD6eYag$3Y{>Fks>58Ur|^!Utj z$b8?>=<4@$cgAW*)Uxya?vX+@+?O|kf$E%K^%S(n9637RZWVBGZDs?UioK{xax4yR zTKaAObEbO>#tkSiYI-G^?P&KAhduaIj+-}chMv^xZAofrY4yh08wmR${E8ei_D*?@IPDLY)R?24X5VA0E=SRE`0hU^ECE zZL;Nk7)P7gXBM)3YFEgYTJYI1JXu#h-C01*<|Zyai3M%EMObN8Wv>#4RwNl@cjd(t7a`&QJ4=;F}-@VD)&lLVZ< zpx9Joi69nZApd=L#H{oS1Q{m#msocHe4u+WyQM3$315v038Nl-feeGW6<1okr9kPJ zdQ!Ldsgj6yh)_~e*711k5o6yO4@rv;iy%#$Eg*v9V@)0NPaOLsapy26L!nQh^p
    CcLe37MIpPU7c2mSwI|7<>w0ruuV?0Ylbvs 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�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 Cm1|c3 literal 0 HcmV?d00001 diff --git a/layouts/community/ergodox/algernon/keymap.c b/layouts/community/ergodox/algernon/keymap.c index ebdc4ab4e..fb6de1b72 100644 --- a/layouts/community/ergodox/algernon/keymap.c +++ b/layouts/community/ergodox/algernon/keymap.c @@ -13,6 +13,7 @@ #include "eeconfig.h" #include "wait.h" #include "version.h" +#include "print.h" /* Layers */ @@ -1033,6 +1034,10 @@ void matrix_scan_user(void) { } #endif + SEQ_ONE_KEY (KC_R) { + ang_tap(KC_RALT, 0); + } + SEQ_ONE_KEY (KC_T) { time_travel = !time_travel; } @@ -1126,7 +1131,8 @@ const qk_ucis_symbol_t ucis_symbol_table[] = UCIS_TABLE UCIS_SYM("micro", 0x00b5), UCIS_SYM("tm", 0x2122), UCIS_SYM("child", 0x1f476), - UCIS_SYM("family", 0x1F46A) + UCIS_SYM("family", 0x1F46A), + UCIS_SYM("joy", 0x1F602) ); bool process_record_user (uint16_t keycode, keyrecord_t *record) { diff --git a/layouts/community/ergodox/algernon/readme.md b/layouts/community/ergodox/algernon/readme.md index 03b094edb..a25018a7b 100644 --- a/layouts/community/ergodox/algernon/readme.md +++ b/layouts/community/ergodox/algernon/readme.md @@ -3,7 +3,12 @@ algernon's layout ======================= -This is an unconventional layout for the [ErgoDox EZ][ez]. For more details about the history of the layout, see my [blog posts about my ErgoDox journey][blog-ergodox]. +This is the layout I used to use on my [ErgoDox EZ][ez], while I was using [QMK][qmk]. I no longer do so, and this repository is obsolete, and not updated anymore. My current firmware is based on [Kaleidoscope][kaleidoscope], and is located [elsewhere][ergodox-sketch]. I'm keeping the repo around for historical and educational purposes. + + [kaleidoscope]: https://github.com/keyboardio/Kaleidoscope + [ergodox-sketch]: https://git.madhouse-project.org/algernon/ErgoDox-sketch + +Nevertheless, this is an unconventional layout for the [ErgoDox EZ][ez]. For more details about the history of the layout, see my [blog posts about my ErgoDox journey][blog-ergodox]. [ez]: https://ergodox-ez.com/ [blog-ergodox]: https://asylum.madhouse-project.org/blog/tags/ergodox/ @@ -57,6 +62,7 @@ At its core, this is a Dvorak layout, with some minor changes. The more interest - `LEAD d` toggles logging keypress positions to the HID console. - `LEAD t` toggles time travel. Figuring out the current `date` is left as an exercise to the reader. - `LEAD u` enters the [Unicode symbol input](#unicode-symbol-input) mode. + - `LEAD r` inputs `Right Alt`, which is the `Compose` key of my choice. The symbols on the front in the image above have the same color as the key that activates them, with the exception of the **Arrow** layer, which is just black on the front. @@ -128,13 +134,13 @@ $ git clone https://github.com/qmk/qmk_firmware.git $ cd qmk_firmware $ git clone https://github.com/algernon/ergodox-layout.git \ layouts/community/ergodox/algernon_master -$ make ergodox_ez-algernon_master +$ make ergodox_ez:algernon_master ``` From time to time, updates may be submitted back to the QMK repository. If you are reading it there, you can build the firmware like any other firmware included with it (assuming you are in the root directory of the firmware): ``` -$ make ergodox_ez-algernon +$ make ergodox_ez:algernon ``` ## Using on Windows diff --git a/layouts/community/ergodox/algernon/rules.mk b/layouts/community/ergodox/algernon/rules.mk index 53dec5153..1b4c0995f 100644 --- a/layouts/community/ergodox/algernon/rules.mk +++ b/layouts/community/ergodox/algernon/rules.mk @@ -9,8 +9,9 @@ KEYLOGGER_ENABLE ?= yes UCIS_ENABLE = yes MOUSEKEY_ENABLE = no LEADER_ENABLE = yes +RGBLIGHT_ENABLE = no -AUTOLOG_ENABLE ?= no +AUTOLOG_ENABLE ?= yes ifeq (${FORCE_NKRO},yes) OPT_DEFS += -DFORCE_NKRO From ee8627e078dccab722f05fbf9bb152eca1b2ee7b Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Fri, 23 Nov 2018 20:07:53 -0800 Subject: [PATCH 548/788] Add EEPROM_RESET keycode to keycodes.md doc (#4473) --- docs/keycodes.md | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/docs/keycodes.md b/docs/keycodes.md index 30fe60278..1c5f46d6e 100644 --- a/docs/keycodes.md +++ b/docs/keycodes.md @@ -206,18 +206,19 @@ This is a reference only. Each group of keys links to the page documenting their ## [Quantum Keycodes](quantum_keycodes.md#qmk-keycodes) -|Key |Aliases |Description | -|-------------|-----------|---------------------------------------------------------------------| -|`RESET` | |Put the keyboard into DFU mode for flashing | -|`DEBUG` | |Toggle debug mode | -|`KC_GESC` |`GRAVE_ESC`|Escape when tapped, ` when pressed with Shift or GUI| -|`KC_LSPO` | |Left Shift when held, `(` when tapped | -|`KC_RSPC` | |Right Shift when held, `)` when tapped | -|`KC_LEAD` | |The [Leader key](feature_leader_key.md) | -|`KC_LOCK` | |The [Lock key](feature_key_lock.md) | -|`FUNC(n)` |`F(n)` |Call `fn_action(n)` (deprecated) | -|`M(n)` | |Call macro `n` | -|`MACROTAP(n)`| |Macro-tap `n` idk FIXME | +|Key |Aliases |Description | +|---------------|-----------|---------------------------------------------------------------------| +|`RESET` | |Put the keyboard into DFU mode for flashing | +|`DEBUG` | |Toggle debug mode | +|`EEPROM_RESET` |`EEP_RST` |Resets EEPROM state by reinitializing it | +|`KC_GESC` |`GRAVE_ESC`|Escape when tapped, ` when pressed with Shift or GUI| +|`KC_LSPO` | |Left Shift when held, `(` when tapped | +|`KC_RSPC` | |Right Shift when held, `)` when tapped | +|`KC_LEAD` | |The [Leader key](feature_leader_key.md) | +|`KC_LOCK` | |The [Lock key](feature_key_lock.md) | +|`FUNC(n)` |`F(n)` |Call `fn_action(n)` (deprecated) | +|`M(n)` | |Call macro `n` | +|`MACROTAP(n)` | |Macro-tap `n` idk FIXME | ## [Audio Keys](feature_audio.md) From 7bc7c34d4f7e8bda5859696fba9bacc5e47de512 Mon Sep 17 00:00:00 2001 From: Jasper Lievisse Adriaanse Date: Sat, 24 Nov 2018 17:40:48 +0100 Subject: [PATCH 549/788] Add RCTL to my Planck layout (#4475) --- keyboards/planck/keymaps/jasperla/keymap.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/keyboards/planck/keymaps/jasperla/keymap.c b/keyboards/planck/keymaps/jasperla/keymap.c index 14f445d0f..b9eb72b07 100644 --- a/keyboards/planck/keymaps/jasperla/keymap.c +++ b/keyboards/planck/keymaps/jasperla/keymap.c @@ -46,14 +46,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------|------+------+------+------+------+------| * | Shift| Z | X | C | V | B | N | M | , | . | / |Shift | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Ctrl | | LGUI | Alt |Lower | SPC | Enter|Raise |Point.| | LOCK | | + * | Ctrl | | LGUI | Alt |Lower | SPC | Enter|Raise |Point.| | LOCK | Ctrl | * `-----------------------------------------------------------------------------------' */ [_QWERTY] = LAYOUT_planck_grid( KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT , - KC_LCTL, _______, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_ENT, RAISE, PT, _______, LOCK, _______ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LCTL, _______, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_ENT, RAISE, PT, _______, LOCK, KC_RCTL ), /* Lower From 3363743bf78fa5efc9a6a70f13925f4c95745641 Mon Sep 17 00:00:00 2001 From: xjacobx Date: Sat, 24 Nov 2018 11:41:39 -0500 Subject: [PATCH 550/788] Adding my new keymap for the Idobo (#4468) * Adding my new keymap, based of xd75, with leds enabled via the rules.mk file * cleaned up the rules file * Per Change Requests: removed deprecated functions along with updated the map to use the layout macro instead of raw matrix --- .../idobo/keymaps/xaceofspaidsx/config.h | 19 ++++++ .../idobo/keymaps/xaceofspaidsx/keymap.c | 67 +++++++++++++++++++ .../idobo/keymaps/xaceofspaidsx/readme.md | 1 + .../idobo/keymaps/xaceofspaidsx/rules.mk | 19 ++++++ 4 files changed, 106 insertions(+) create mode 100644 keyboards/idobo/keymaps/xaceofspaidsx/config.h create mode 100644 keyboards/idobo/keymaps/xaceofspaidsx/keymap.c create mode 100644 keyboards/idobo/keymaps/xaceofspaidsx/readme.md create mode 100644 keyboards/idobo/keymaps/xaceofspaidsx/rules.mk diff --git a/keyboards/idobo/keymaps/xaceofspaidsx/config.h b/keyboards/idobo/keymaps/xaceofspaidsx/config.h new file mode 100644 index 000000000..a3ed4f762 --- /dev/null +++ b/keyboards/idobo/keymaps/xaceofspaidsx/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 MechMerlin + * + * 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 . + */ + +#pragma once + +// place overrides here diff --git a/keyboards/idobo/keymaps/xaceofspaidsx/keymap.c b/keyboards/idobo/keymaps/xaceofspaidsx/keymap.c new file mode 100644 index 000000000..c157317e2 --- /dev/null +++ b/keyboards/idobo/keymaps/xaceofspaidsx/keymap.c @@ -0,0 +1,67 @@ +/* Copyright 2018 xAceOfSpaidsx + * + * 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 . + */ +#include QMK_KEYBOARD_H + +// Layer shorthand +#define _QW 0 +#define _FN 1 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* QWERTY - based off xd75 default map with a couple modifications for my preference + * .--------------------------------------------------------------------------------------------------------------------------------------. + * | ESC | 1 | 2 | 3 | 4 | 5 | F2 | ` | F5 | 6 | 7 | 8 | 9 | 0 | BACKSP | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------| + * | TAB | Q | W | E | R | T | - | \ | = | Y | U | I | O | P | ' | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------+--------| + * | CAP LK | A | S | D | F | G | HOME | DEL | PG UP | H | J | K | L | ; | ENTER | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------------------------+--------| + * | LSHIFT | Z | X | C | V | B | END | UP | PG DN | N | M | , | . | / | RSHIFT | + * |--------+--------+--------+--------+--------+-----------------+--------+--------+--------+--------+-----------------+--------+--------| + * | LCTRL | LGUI | LALT | FN | SPACE | SPACE | LEFT | DOWN | RIGHT | [ | ] | FN | RALT | RGUI | RCTRL | + * '--------------------------------------------------------------------------------------------------------------------------------------' + */ + + [_QW] = LAYOUT_ortho_5x15( /* QWERTY */ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_F2, KC_GRV, KC_F5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_MINS, KC_BSLS, KC_EQL, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_QUOT, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_HOME, KC_DEL, KC_PGUP, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_END, KC_UP, KC_PGDN, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \ + KC_LCTL, KC_LGUI, KC_LALT, MO(_FN), KC_SPC, KC_SPC, KC_LEFT, KC_DOWN, KC_RGHT, KC_LBRC, KC_RBRC, MO(_FN), KC_RALT, KC_RGUI, KC_RCTL \ + ), + +/* FUNCTION Layer - removed the rgb hue saturation and vibrance for audio controls and added some functionality I use from other boards. + * .--------------------------------------------------------------------------------------------------------------------------------------. + * | F1 | F2 | F3 | F4 | F5 | F6 | NUM LK | P/ | P* | F7 | F8 | F9 | F10 | F11 | F12 | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | SELECT | CALC | UP | | | NEXT | P7 | P8 | P9 | - | | | PR SCR | SCR LK | PAUSE | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | PREV | LEFT | DOWN | RIGHT | DEL | PLAY | P4 | P5 | P6 | + | | RESET | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | VOL- | MUTE | VOL+ | APP | | STOP | P1 | P2 | P3 | PENT | | | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | RGB TG | FN | RGB RMD| RGB MD | P0 | | P. | PENT | PENT | FN | | | | + * '--------------------------------------------------------------------------------------------------------------------------------------' + */ + + [_FN] = LAYOUT_ortho_5x15( /* FUNCTION */ + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_NLCK, KC_SLSH, KC_ASTR, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ + KC_MSEL, KC_CALC, KC_UP , _______, _______, KC_MNXT, KC_P7, KC_P8, KC_P9, KC_MINS, _______, _______, KC_PSCR, KC_SLCK, KC_PAUS, \ + KC_MPRV, KC_LEFT, KC_DOWN, KC_RGHT, KC_DEL , KC_MPLY, KC_P4, KC_P5, KC_P6, KC_PLUS, _______, RESET, _______, _______, _______, \ + KC_VOLD, KC_MUTE, KC_VOLU, KC_APP, _______, KC_MSTP, KC_P1, KC_P2, KC_P3, KC_PENT, _______, _______, _______, _______, _______, \ + _______, _______, RGB_TOG, MO(_FN), RGB_RMOD,RGB_MOD, KC_P0, _______, KC_PDOT, KC_PENT, KC_PENT, MO(_FN), _______, _______, _______ \ + ), +}; diff --git a/keyboards/idobo/keymaps/xaceofspaidsx/readme.md b/keyboards/idobo/keymaps/xaceofspaidsx/readme.md new file mode 100644 index 000000000..ac6e74702 --- /dev/null +++ b/keyboards/idobo/keymaps/xaceofspaidsx/readme.md @@ -0,0 +1 @@ +# Updated the keymap, based off XD75 default, to meet my needs. Refer to rules.mk to enable or disable rgb and other features. diff --git a/keyboards/idobo/keymaps/xaceofspaidsx/rules.mk b/keyboards/idobo/keymaps/xaceofspaidsx/rules.mk new file mode 100644 index 000000000..b973e9d8b --- /dev/null +++ b/keyboards/idobo/keymaps/xaceofspaidsx/rules.mk @@ -0,0 +1,19 @@ +# Copyright 2013 Jun Wako +# +# 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 . + +#Had to disable the first 2 to get the firmware size down enough after enabling the rgb controls. +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +COMMAND_ENABLE = no # Commands for debug and configuration +RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow From f0db40ff113a768f53de1197817b3a31bc32e9ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Sat, 24 Nov 2018 16:48:42 +0000 Subject: [PATCH 551/788] fix diffutils arch package name (#4470) --- util/linux_install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/util/linux_install.sh b/util/linux_install.sh index 0e8296c0d..70b389c0d 100755 --- a/util/linux_install.sh +++ b/util/linux_install.sh @@ -61,9 +61,9 @@ elif grep ID /etc/os-release | grep -q 'arch\|manjaro'; then avr-binutils \ avr-libc \ avr-gcc \ - base-devel \ + base-devel \ dfu-util \ - diff-utils \ + diffutils \ gcc \ git \ unzip \ From d7ab738ca687a6ea923ce286f7cb81a5125b86ba Mon Sep 17 00:00:00 2001 From: Colin Kahn Date: Sun, 25 Nov 2018 18:38:46 -0800 Subject: [PATCH 552/788] Adding keymap layers for 40precentclub/foobar (#4481) --- .../foobar/keymaps/default/config.h | 2 + .../foobar/keymaps/default/keymap.c | 57 ++++++++++++++++--- 2 files changed, 52 insertions(+), 7 deletions(-) diff --git a/keyboards/40percentclub/foobar/keymaps/default/config.h b/keyboards/40percentclub/foobar/keymaps/default/config.h index 6173b6327..bedc27ba8 100644 --- a/keyboards/40percentclub/foobar/keymaps/default/config.h +++ b/keyboards/40percentclub/foobar/keymaps/default/config.h @@ -17,3 +17,5 @@ #pragma once // place overrides here + +#define PERMISSIVE_HOLD diff --git a/keyboards/40percentclub/foobar/keymaps/default/keymap.c b/keyboards/40percentclub/foobar/keymaps/default/keymap.c index 774f1e854..1be4b38dd 100644 --- a/keyboards/40percentclub/foobar/keymaps/default/keymap.c +++ b/keyboards/40percentclub/foobar/keymaps/default/keymap.c @@ -15,19 +15,62 @@ */ #include QMK_KEYBOARD_H -#define FN1_Q LT(1, KC_Q) +enum foobar_layers { + QWERTY, + FN1, + FN2, + FN3, + FN4, + FN5 +}; + +#define FN1_SPC LT(FN1, KC_SPC) +#define FN2_BSC LT(FN2, KC_BSPC) +#define FN3_C LT(FN3, KC_C) +#define FN4_V LT(FN4, KC_V) +#define FN5_B LT(FN5, KC_B) +#define RALT_N RALT_T(KC_N) +#define LALT_X LALT_T(KC_X) +#define LCTL_Z LCTL_T(KC_Z) +#define RCTL_M RCTL_T(KC_M) +#define LSFT_ENT LSFT_T(KC_ENT) +#define RGUI_ESC RGUI_T(KC_ESC) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = LAYOUT_split( - FN1_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, - KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_ESC, - KC_Z, KC_X, KC_C, KC_V, KC_BSPC, KC_SPC, KC_B, KC_N, KC_M, KC_ENT + [QWERTY] = LAYOUT_split( + KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, + KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, RGUI_ESC, + LCTL_Z, LALT_X, FN3_C, FN4_V, FN2_BSC, FN1_SPC, FN5_B, RALT_N, RCTL_M, LSFT_ENT ), - [1] = LAYOUT_split( + [FN1] = LAYOUT_split( + KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, + _______, _______, _______, _______, KC_DEL, _______, _______, _______, _______, _______ + ), + + [FN2] = LAYOUT_split( + KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, + KC_F11, KC_F12, _______, _______, _______, _______, _______, _______, _______, KC_GRV, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + + [FN3] = LAYOUT_split( + _______, _______, _______, _______, _______, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, + KC_TAB, _______, _______, _______, _______, KC_COMM, KC_DOT, KC_SLSH, KC_SCLN, KC_QUOT, + _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT + ), + + [FN4] = LAYOUT_split( + _______, _______, _______, _______, _______, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, + KC_TAB, _______, _______, _______, _______, KC_LABK, KC_RABK, KC_QUES, KC_COLN, KC_DQUO, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + + [FN5] = LAYOUT_split( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, RESET, _______, _______, _______ + _______, _______, _______, _______, _______, RESET, _______, _______, _______, _______ ), }; From 834b555eca47392ec0bf367b7f20694919d79a00 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Sun, 25 Nov 2018 18:40:48 -0800 Subject: [PATCH 553/788] Keymap FAQ: fix positions of KC_HENK and KC_MHEN for JIS layout (#4482) These keys were previously in each other's positions. --- docs/faq_keymap.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/faq_keymap.md b/docs/faq_keymap.md index 07d74d6cf..4e842d363 100644 --- a/docs/faq_keymap.md +++ b/docs/faq_keymap.md @@ -11,8 +11,8 @@ Keycodes are actually defined in [common/keycode.h](https://github.com/qmk/qmk_f There are 3 standard keyboard layouts in use around the world- ANSI, ISO, and JIS. North America primarily uses ANSI, Europe and Africa primarily use ISO, and Japan uses JIS. Regions not mentioned typically use either ANSI or ISO. The keycodes corresponding to these layouts are shown here: - -![Keyboard Layout Image](https://i.imgur.com/gvlNUpQ.png) + +![Keyboard Layout Image](https://i.imgur.com/5wsh5wM.png) ## Some Of My Keys Are Swapped Or Not Working From ccd4da941cb38839b60994302d453821fb88a1b1 Mon Sep 17 00:00:00 2001 From: Will Homer <392260+WillFour20@users.noreply.github.com> Date: Mon, 26 Nov 2018 15:57:30 +0000 Subject: [PATCH 554/788] Add Espectro ISO layout (#4479) * Add Espectro ISO layout * Remove unused define from Espectro ISO layout --- keyboards/espectro/keymaps/iso/keymap.c | 88 +++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100755 keyboards/espectro/keymaps/iso/keymap.c diff --git a/keyboards/espectro/keymaps/iso/keymap.c b/keyboards/espectro/keymaps/iso/keymap.c new file mode 100755 index 000000000..d22e7aac4 --- /dev/null +++ b/keyboards/espectro/keymaps/iso/keymap.c @@ -0,0 +1,88 @@ +/* Copyright 2018 @TurboMech /u/TurboMech @A9entOran9e#6134 + * + * 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 . + */ + + +#include QMK_KEYBOARD_H + +#define _BL 0 //Base layer +#define _FN1 1 //Function layer + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* BL +____________________________________________________________________________________________________________________________________________________________________________ +| | | | | | | | | | | | | | | | | | | | +| ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | DELETE | P SCN | HOME | END | P UP | P DOWN | +|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________| +| ` | | | | | | | | | | | | | BACK | NUM | | | | +| ¬ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | _ - | = + | SPACE | LOCK | / | * | - | +|________|________|________|________|________|________|________|________|________|________|________|________|________|_________________|________|________|________|________| +| | | | | | | | | | | | [ | ] | | | | | | +| TAB | Q | W | E | R | T | Y | U | I | O | P | { | } | | 7 | 8 | 9 | | +|____________|________|________|________|________|________|________|________|________|________|________|________|________|__ ENTER |________|________|________| + | +| | | | | | | | | | | ; | ' | # | | | | | | +| CAPS LOCK | A | S | D | F | G | H | J | K | L | : | @ | ~ | | 4 | 5 | 6 | | +|______________|________|________|________|________|________|________|________|________|________|________|________|________|___________|________|________|________|________| +| | \ | | | | | | | | , | . | / | | | | | | | +| SHIFT | | | Z | X | C | V | B | N | M | < | > | ? | SHIFT | UP | 1 | 2 | 3 | | +|__________|_______|________|________|________|________|________|________|________|________|________|________|________________|________|________|________|________| ENTER | +| | | | | | | MO | | | | | | | +| CTRL | LGUI | L ALT | SPACE | R ALT | R CTRL | _FN | LEFT | DOWN | RIGHT | 0 | . | | +|__________|__________|__________|________________________________________________________|________|________|________|________|________|________|________|________|________| + */ + + [_BL] = LAYOUT_split_shift_and_bs( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_PSCR, KC_HOME, KC_END, KC_PGUP, KC_PGDN, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_NO, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_NUHS, KC_P7, KC_P8, KC_P9, KC_PPLS, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_NO, KC_P4, KC_P5, KC_P6, + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, MO(1), KC_LEFT, KC_DOWN, KC_RIGHT, KC_P0, KC_PDOT, KC_NO + ), + +/* FN_1 +____________________________________________________________________________________________________________________________________________________________________________ +| | | | | | | | | | | | | | | VOL | VOL | NEXT | | | +| RESET | | | | | | | | | | | | | MUTE | DOWN | UP | TRACK | HOME | END | +|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________| +| | RGB | RGB | RGB | RGB | RGB | RGB | RGB | RGB | | | | | | | | | | +| | TOGGLE | MODE |INCREASE|DECREASE| HUE | HUE | SAT | | | | | | DELETE | | | | | +|________|________|________|________|________|INCREASE|DECREASE|INCREASE|DECREASE|________|________|________|________|_________________|________|________|________|________| +| | BACK | BACK | | | | | | | | | | | | | | | | +| | LIGHT | LIGHT | | | | | | | | | | | | | | | | +|____________| TOGGLE |INCREASE|DECREASE|________|________|________|________|________|________|________|________|________|__ |________|________|________| | +| | | | | | | | | | | | | | | | | | | +| | | | | | | | | | | | | | | | | | | +|______________|________|________|________|________|________|________|________|________|________|________|________|________|___________|________|________|________|________| +| | | | | | | | | | | | | | | | | | | +| | | | | | | | | | | | | | | | | | | +|__________|_______|________|________|________|________|________|________|________|________|________|________|________________|________|________|________|________| | +| | | | | | | | | | | | | | +| | | | | | | | | | | | | | +|__________|__________|__________|________________________________________________________|________|________|________|________|________|________|________|________|________| + */ + + [_FN1] = LAYOUT_split_shift_and_bs( + RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, KC_MNXT, KC_HOME, KC_END, + _______, RGB_TOG, RGB_MOD, RGB_VAI, RGB_VAD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, _______, _______, _______, _______, _______, KC_DEL, _______, _______, _______, _______, + _______, BL_TOGG, BL_INC, BL_DEC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + +}; + From 6266c172b9363aa950cf13c52bed7674aae0375d Mon Sep 17 00:00:00 2001 From: Elliot Powell <32494740+e11i0t23@users.noreply.github.com> Date: Mon, 26 Nov 2018 15:58:53 +0000 Subject: [PATCH 555/788] added ep/96 as a supported keyboard (#4476) * added ep/96 * Update keyboards/ep/96/readme.md Co-Authored-By: e11i0t23 <32494740+e11i0t23@users.noreply.github.com> * removed led code * Update keyboards/ep/96/config.h Co-Authored-By: e11i0t23 <32494740+e11i0t23@users.noreply.github.com> * Update keyboards/ep/96/info.json Co-Authored-By: e11i0t23 <32494740+e11i0t23@users.noreply.github.com> * Update keyboards/ep/96/readme.md Co-Authored-By: e11i0t23 <32494740+e11i0t23@users.noreply.github.com> --- keyboards/ep/96/96.c | 43 +++ keyboards/ep/96/96.h | 47 +++ keyboards/ep/96/config.h | 212 +++++++++++ keyboards/ep/96/info.json | 426 ++++++++++++++++++++++ keyboards/ep/96/keymaps/default/keymap.c | 67 ++++ keyboards/ep/96/keymaps/default/readme.md | 1 + keyboards/ep/96/readme.md | 15 + keyboards/ep/96/rules.mk | 81 ++++ 8 files changed, 892 insertions(+) create mode 100644 keyboards/ep/96/96.c create mode 100644 keyboards/ep/96/96.h create mode 100644 keyboards/ep/96/config.h create mode 100644 keyboards/ep/96/info.json create mode 100644 keyboards/ep/96/keymaps/default/keymap.c create mode 100644 keyboards/ep/96/keymaps/default/readme.md create mode 100644 keyboards/ep/96/readme.md create mode 100644 keyboards/ep/96/rules.mk diff --git a/keyboards/ep/96/96.c b/keyboards/ep/96/96.c new file mode 100644 index 000000000..9fdd51977 --- /dev/null +++ b/keyboards/ep/96/96.c @@ -0,0 +1,43 @@ +/* Copyright 2018 Elliot Powell + * + * 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 . + */ +#include "96.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + + led_set_user(usb_led); +} diff --git a/keyboards/ep/96/96.h b/keyboards/ep/96/96.h new file mode 100644 index 000000000..1887eb472 --- /dev/null +++ b/keyboards/ep/96/96.h @@ -0,0 +1,47 @@ +/* Copyright 2018 Elliot Powell + * + * 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 . + */ +#ifndef EP96_H +#define EP96_H + +#include "quantum.h" + +/* This a shortcut to help you visually see your layout. + * + * The first section contains all of the arguments representing the physical + * layout of the board and position of the keys. + * + * The second converts the arguments into a two-dimensional array which + * represents the switch matrix. + */ +#define xxxx KC_NO + +#define LAYOUT( \ + K000, K001, K002, k003, k004, k005, k006, k007, k008, k009, k010, k011, k012, k013, k014, k015, k016, k017, k018, \ + K100, K101, K102, k103, k104, k105, k106, k107, k108, k109, k110, k111, k112, k114, k115, k116, k117, k118, \ + K200, K202, k203, k204, k205, k206, k207, k208, k209, k210, k211, k212, k213, k215, k216, k217, \ + K300, K302, k303, k304, k305, k306, k307, k308, k309, k310, k311, k312, k313, k314, k315, k316, k317, k318, \ + K400, K401, K402, k403, k404, k405, k406, k407, k408, k409, k410, k411, k413, k414, k415, k416, k417, \ + K500, K501, K502, k506, k511, k512, k513, k514, k515, k516, k517, k518) \ +{ \ + {K000, K001, K002, k003, k004, k005, k006, k007, k008, k009, k010, k011, k012, k013, k014, k015, k016, k017, k018}, \ + {K100, K101, K102, k103, k104, k105, k106, k107, k108, k109, k110, k111, k112, xxxx, k114, k115, k116, k117, k118}, \ + {K200, xxxx, K202, k203, k204, k205, k206, k207, k208, k209, k210, k211, k212, k213, xxxx, k215, k216, k217, xxxx}, \ + {K300, xxxx, K302, k303, k304, k305, k306, k307, k308, k309, k310, k311, k312, k313, k314, k315, k316, k317, k318}, \ + {K400, K401, K402, k403, k404, k405, k406, k407, k408, k409, k410, k411, xxxx, k413, k414, k415, k416, k417, xxxx}, \ + {K500, K501, K502, xxxx, xxxx, xxxx, k506, xxxx, xxxx, xxxx, xxxx, k511, k512, k513, k514, k515, k516, k517, k518} \ +} + +#endif diff --git a/keyboards/ep/96/config.h b/keyboards/ep/96/config.h new file mode 100644 index 000000000..0c37e4c59 --- /dev/null +++ b/keyboards/ep/96/config.h @@ -0,0 +1,212 @@ +/* +Copyright 2018 Elliot Powell + +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 . +*/ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x9696 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Elliot Powell +#define PRODUCT ep96 +#define DESCRIPTION A simple 96 key keyboard + +/* key matrix size */ +#define MATRIX_ROWS 6 +#define MATRIX_COLS 19 + +/* + * 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 { B0, B1, B3, B2, B7, C6 } +#define MATRIX_COL_PINS { D0, D1, D2, D3, D5, D4, D6, D7, B4, B5, B6, C7, F7, F6, F5, F4, F1, F0, E6 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +// #endif + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 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 userful 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 + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * 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 + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +//#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ + diff --git a/keyboards/ep/96/info.json b/keyboards/ep/96/info.json new file mode 100644 index 000000000..4be41b24c --- /dev/null +++ b/keyboards/ep/96/info.json @@ -0,0 +1,426 @@ +{ + "keyboard_name": "ep96", + "maintainer": "e11i0t23", + "width": 19, + "height": 6, + "layouts": { + "LAYOUT": { + "key_count": 100, + "layout": [{ + "label": "Esc", + "x": 0, + "y": 0 + }, { + "label": "F1", + "x": 1, + "y": 0 + }, { + "label": "F2", + "x": 2, + "y": 0 + }, { + "label": "F3", + "x": 3, + "y": 0 + }, { + "label": "F4", + "x": 4, + "y": 0 + }, { + "label": "F5", + "x": 5, + "y": 0 + }, { + "label": "F6", + "x": 6, + "y": 0 + }, { + "label": "F7", + "x": 7, + "y": 0 + }, { + "label": "F8", + "x": 8, + "y": 0 + }, { + "label": "F9", + "x": 9, + "y": 0 + }, { + "label": "F10", + "x": 10, + "y": 0 + }, { + "label": "F11", + "x": 11, + "y": 0 + }, { + "label": "F12", + "x": 12, + "y": 0 + }, { + "label": "Prt Sc", + "x": 13, + "y": 0 + }, { + "label": "Delete", + "x": 14, + "y": 0 + }, { + "label": "home", + "x": 15, + "y": 0 + }, { + "label": "Menu", + "x": 16, + "y": 0 + }, { + "label": "Pg Up", + "x": 17, + "y": 0 + }, { + "label": "Pg Dn", + "x": 18, + "y": 0 + }, { + "label": "~", + "x": 0, + "y": 1 + }, { + "label": "!", + "x": 1, + "y": 1 + }, { + "label": "@", + "x": 2, + "y": 1 + }, { + "label": "#", + "x": 3, + "y": 1 + }, { + "label": "$", + "x": 4, + "y": 1 + }, { + "label": "%", + "x": 5, + "y": 1 + }, { + "label": "^", + "x": 6, + "y": 1 + }, { + "label": "&", + "x": 7, + "y": 1 + }, { + "label": "*", + "x": 8, + "y": 1 + }, { + "label": "(", + "x": 9, + "y": 1 + }, { + "label": ")", + "x": 10, + "y": 1 + }, { + "label": "_", + "x": 11, + "y": 1 + }, { + "label": "+", + "x": 12, + "y": 1 + }, { + "label": "Backspace", + "x": 13, + "y": 1, + "w": 2 + }, { + "label": "Num Lock", + "x": 15, + "y": 1 + }, { + "label": "/", + "x": 16, + "y": 1 + }, { + "label": "*", + "x": 17, + "y": 1 + }, { + "label": "-", + "x": 18, + "y": 1 + }, { + "label": "Tab", + "x": 0, + "y": 2, + "w": 1.5 + }, { + "label": "Q", + "x": 1.5, + "y": 2 + }, { + "label": "W", + "x": 2.5, + "y": 2 + }, { + "label": "E", + "x": 3.5, + "y": 2 + }, { + "label": "R", + "x": 4.5, + "y": 2 + }, { + "label": "T", + "x": 5.5, + "y": 2 + }, { + "label": "Y", + "x": 6.5, + "y": 2 + }, { + "label": "U", + "x": 7.5, + "y": 2 + }, { + "label": "I", + "x": 8.5, + "y": 2 + }, { + "label": "O", + "x": 9.5, + "y": 2 + }, { + "label": "P", + "x": 10.5, + "y": 2 + }, { + "label": "{", + "x": 11.5, + "y": 2 + }, { + "label": "}", + "x": 12.5, + "y": 2 + }, { + "label": "Enter", + "x": 13.75, + "y": 2, + "w": 1.25, + "h": 2 + }, { + "label": "7", + "x": 15, + "y": 2 + }, { + "label": "8", + "x": 16, + "y": 2 + }, { + "label": "9", + "x": 17, + "y": 2 + }, { + "label": "+", + "x": 18, + "y": 2, + "h": 2 + }, { + "label": "Caps Lock", + "x": 0, + "y": 3, + "w": 1.75 + }, { + "label": "A", + "x": 1.75, + "y": 3 + }, { + "label": "S", + "x": 2.75, + "y": 3 + }, { + "label": "D", + "x": 3.75, + "y": 3 + }, { + "label": "F", + "x": 4.75, + "y": 3 + }, { + "label": "G", + "x": 5.75, + "y": 3 + }, { + "label": "H", + "x": 6.75, + "y": 3 + }, { + "label": "J", + "x": 7.75, + "y": 3 + }, { + "label": "K", + "x": 8.75, + "y": 3 + }, { + "label": "L", + "x": 9.75, + "y": 3 + }, { + "label": ":", + "x": 10.75, + "y": 3 + }, { + "label": "\"", + "x": 11.75, + "y": 3 + }, { + "label": "~", + "x": 12.75, + "y": 3 + }, { + "label": "4", + "x": 15, + "y": 3 + }, { + "label": "5", + "x": 16, + "y": 3 + }, { + "label": "6", + "x": 17, + "y": 3 + }, { + "label": "Shift", + "x": 0, + "y": 4, + "w": 1.25 + }, { + "label": "|", + "x": 1.25, + "y": 4 + }, { + "label": "Z", + "x": 2.25, + "y": 4 + }, { + "label": "X", + "x": 3.25, + "y": 4 + }, { + "label": "C", + "x": 4.25, + "y": 4 + }, { + "label": "V", + "x": 5.25, + "y": 4 + }, { + "label": "B", + "x": 6.25, + "y": 4 + }, { + "label": "N", + "x": 7.25, + "y": 4 + }, { + "label": "M", + "x": 8.25, + "y": 4 + }, { + "label": "<", + "x": 9.25, + "y": 4 + }, { + "label": ">", + "x": 10.25, + "y": 4 + }, { + "label": "?", + "x": 11.25, + "y": 4 + }, { + "label": "Shift", + "x": 12.25, + "y": 4, + "w": 1.75 + }, { + "label": "\u2191", + "x": 14, + "y": 4 + }, { + "label": "1", + "x": 15, + "y": 4 + }, { + "label": "2", + "x": 16, + "y": 4 + }, { + "label": "3", + "x": 17, + "y": 4 + }, { + "label": "Enter", + "x": 18, + "y": 4, + "h": 2 + }, { + "label": "Ctrl", + "x": 0, + "y": 5, + "w": 1.25 + }, { + "label": "Win", + "x": 1.25, + "y": 5, + "w": 1.25 + }, { + "label": "Alt", + "x": 2.5, + "y": 5, + "w": 1.25 + }, { + "x": 3.75, + "y": 5, + "w": 6.25 + }, { + "label": "Alt", + "x": 10, + "y": 5, + "w": 1.5 + }, { + "label": "Crtl", + "x": 11.5, + "y": 5, + "w": 1.5 + }, { + "label": "\u2190", + "x": 13, + "y": 5 + }, { + "label": "\u2193", + "x": 14, + "y": 5 + }, { + "label": "\u2192", + "x": 15, + "y": 5 + }, { + "label": "0", + "x": 16, + "y": 5 + }, { + "label": ".", + "x": 17, + "y": 5 + }] + } + } +} diff --git a/keyboards/ep/96/keymaps/default/keymap.c b/keyboards/ep/96/keymaps/default/keymap.c new file mode 100644 index 000000000..d51204153 --- /dev/null +++ b/keyboards/ep/96/keymaps/default/keymap.c @@ -0,0 +1,67 @@ +/* Copyright 2018 Elliot Powell + * + * 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 . + */ +#include QMK_KEYBOARD_H + +// Defines the keycodes used by our macros in process_record_user +enum custom_keycodes { + QMKBEST = SAFE_RANGE, + QMKURL +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( /* Base */ + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_DEL, KC_HOME, KC_END, KC_PGUP, KC_PGDN, \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_P7, KC_P8, KC_P9, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS, \ + KC_LSFT, KC_BSLS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT \ + ), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QMKBEST: + if (record->event.pressed) { + // when keycode QMKBEST is pressed + SEND_STRING("QMK is the best thing ever!"); + } else { + // when keycode QMKBEST is released + } + break; + case QMKURL: + if (record->event.pressed) { + // when keycode QMKURL is pressed + SEND_STRING("https://qmk.fm/" SS_TAP(X_ENTER)); + } else { + // when keycode QMKURL is released + } + break; + } + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/ep/96/keymaps/default/readme.md b/keyboards/ep/96/keymaps/default/readme.md new file mode 100644 index 000000000..81e87464f --- /dev/null +++ b/keyboards/ep/96/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for ep96 \ No newline at end of file diff --git a/keyboards/ep/96/readme.md b/keyboards/ep/96/readme.md new file mode 100644 index 000000000..404419b63 --- /dev/null +++ b/keyboards/ep/96/readme.md @@ -0,0 +1,15 @@ +# ep96 + +![ep96](https://i.imgur.com/PZ2C7a8.jpg) + +A simple 96 key keyboard + +Keyboard Maintainer: Keyboard Maintainer: [Elliot Powell](https://github.com/e11i0t23), [/u/e11i0t23](https://reddit.com/u/e11i0t23) +Hardware Supported: EP96 PCB +Hardware Availability: Possible availability upon request + +Make example for this keyboard (after setting up your build environment): + + make ep/96:default + +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). diff --git a/keyboards/ep/96/rules.mk b/keyboards/ep/96/rules.mk new file mode 100644 index 000000000..407135de2 --- /dev/null +++ b/keyboards/ep/96/rules.mk @@ -0,0 +1,81 @@ +# MCU name +#MCU = at90usb1286 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = no # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) From 8bc19c8dcf8b32c57baff7e548793be756a5e4f4 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 26 Nov 2018 08:09:37 -0800 Subject: [PATCH 556/788] Fix Blockey compiler (and size) issues (#4390) --- keyboards/blockey/rules.mk | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/keyboards/blockey/rules.mk b/keyboards/blockey/rules.mk index e217305bf..fb628cfaa 100644 --- a/keyboards/blockey/rules.mk +++ b/keyboards/blockey/rules.mk @@ -1,5 +1,3 @@ -SRC += ws2812.c - # MCU name #MCU = at90usb1286 MCU = atmega32u4 @@ -54,7 +52,7 @@ OPT_DEFS += -DBOOTLOADER_SIZE=4096 # change yes to no to disable # BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) CONSOLE_ENABLE = yes # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration From 97ab3211e2ace7a5cbf7bd2a21723ed751286c99 Mon Sep 17 00:00:00 2001 From: mwpeterson Date: Mon, 26 Nov 2018 12:26:26 -0500 Subject: [PATCH 557/788] Keymap: add Interrobang (#4420) * remove clmk and dvrk and backlight; switch esc and enter to be modtap; add meh key * change songs * space cadet; move enter; move '"; move pgup pgdn * remove extra songs * update from noahfredrick keymap * make it easier to type ../../thing/*/* * move pipe * requested changes * add interrobang support * add shift-insert to raise-v and lower-v, move pipe to raise-/lower-n --- keyboards/planck/keymaps/mwpeterson/keymap.c | 27 ++++++++++++++++---- keyboards/planck/keymaps/mwpeterson/rules.mk | 13 +++++----- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/keyboards/planck/keymaps/mwpeterson/keymap.c b/keyboards/planck/keymaps/mwpeterson/keymap.c index bfb015c7a..961b8394b 100644 --- a/keyboards/planck/keymaps/mwpeterson/keymap.c +++ b/keyboards/planck/keymaps/mwpeterson/keymap.c @@ -35,6 +35,19 @@ enum planck_layers { #define WM_W LALT(LGUI(KC_LEFT)) #define WM_CNTR LALT(LGUI(KC_C)) +#define SFT_INS LSFT(KC_INS) + +// Unicode +#ifdef UNICODEMAP_ENABLE +enum unicode_name { + IBANG // ‽ +}; + +const uint32_t PROGMEM unicode_map[] = { + [IBANG] = 0x0203D // ‽ +}; +#endif // UNICODEMAP_ENABLE + // Custom key codes enum planck_keycodes { QWERTY = SAFE_RANGE, @@ -81,7 +94,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * window ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ * switcher │ │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ │ * ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ - * │ │ - │ + │ ` │ | │ : │ │ │ , │ . │ \ │ │ + * │ │ - │ + │ ` │SFTIN│ : │ | │ ‽ │ , │ . │ \ │ │ * ├─────┼─────┼─────┼─────┼─────┼─────┴─────┼─────┼─────┼─────┼─────┼─────┤ * │ │ │ │ │ │ Backspace │ │ │ │ │ │ * └─────┴─────┴─────┴─────┴─────┴───────────┴─────┴─────┴─────┴─────┴─────┘ @@ -89,8 +102,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [LOWER_LAYER] = LAYOUT_planck_grid( KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, S(KC_3), _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, - _______, KC_MINS, KC_PLUS, KC_GRV, KC_PIPE, KC_COLN, XXXXXXX, XXXXXXX, KC_COMM, KC_DOT, KC_BSLS, _______, - _______, _______, _______, _______, _______, KC_BSPC, KC_BSPC, _______, _______, _______, _______, _______ + _______, KC_MINS, KC_PLUS, KC_GRV, SFT_INS, KC_COLN, KC_PIPE, X(IBANG), KC_COMM, KC_DOT, KC_BSLS, _______, + _______, _______, _______, _______, _______, KC_BSPC, KC_BSPC, _______, _______, _______, _______, _______ ), /* Symbol layer @@ -99,7 +112,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ * │ │ ! │ @ │ # │ $ │ % │ ^ │ & │ * │ ' │ " │ │ \ * ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ |-- Mostly shifted version - * │ │ _ │ = │ ~ │ | │ : │ │ │ , │ . │ / │ │ / of lower layer + * │ │ _ │ = │ ~ │SFTIN│ : │ | │ │ , │ . │ / │ │ / of lower layer * ├─────┼─────┼─────┼─────┼─────┼─────┴─────┼─────┼─────┼─────┼─────┼─────┤ * │ │ │ │ │ │ Delete │ │ │ │ │ │ * └─────┴─────┴─────┴─────┴─────┴───────────┴─────┴─────┴─────┴─────┴─────┘ @@ -107,7 +120,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [RAISE_LAYER] = LAYOUT_planck_grid( S(KC_GRV), KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, S(KC_3), _______, S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), S(KC_7), S(KC_8), KC_QUOT, S(KC_QUOT), _______, - _______, KC_UNDS, KC_EQL, KC_TILD, KC_PIPE, KC_COLN, XXXXXXX, XXXXXXX, KC_COMM, KC_DOT, KC_SLSH, _______, + _______, KC_UNDS, KC_EQL, KC_TILD, SFT_INS, KC_COLN, KC_PIPE, XXXXXXX, KC_COMM, KC_DOT, KC_SLSH, _______, _______, _______, _______, _______, _______, KC_DEL, KC_DEL, _______, _______, _______, _______, _______ ), @@ -241,6 +254,10 @@ void plover_lookup(void) { unregister_code(PV_RG); } +void matrix_init_user(void) { + set_unicode_input_mode(UC_LNX); +}; + uint32_t layer_state_set_user(uint32_t state) { return update_tri_layer_state(state, LOWER_LAYER, RAISE_LAYER, ADJUST_LAYER); } diff --git a/keyboards/planck/keymaps/mwpeterson/rules.mk b/keyboards/planck/keymaps/mwpeterson/rules.mk index de8aa389c..e82617028 100644 --- a/keyboards/planck/keymaps/mwpeterson/rules.mk +++ b/keyboards/planck/keymaps/mwpeterson/rules.mk @@ -1,6 +1,7 @@ -BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality -CONSOLE_ENABLE = no # Console for debug -COMMAND_ENABLE = no # Disable shift combination, which conflicts with shift-parens -MOUSEKEY_ENABLE = yes # Mouse keys (disabled to save space) -NKRO_ENABLE = no # N-key rollover required for use as a steno board -AUDIO_ENABLE = yes # Audio output on port C6 +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +CONSOLE_ENABLE = no # Console for debug +COMMAND_ENABLE = no # Disable shift combination, which conflicts with shift-parens +MOUSEKEY_ENABLE = yes # Mouse keys (disabled to save space) +NKRO_ENABLE = no # N-key rollover required for use as a steno board +AUDIO_ENABLE = yes # Audio output on port C6 +UNICODEMAP_ENABLE = yes # Enable extended unicode From 0031e461913d23e37a9aebd1da5daf1c93a149ee Mon Sep 17 00:00:00 2001 From: zvecr Date: Mon, 26 Nov 2018 17:27:07 +0000 Subject: [PATCH 558/788] Keyboard: 40percentclub - enable 4x4 and 5x5 community keymaps (#4437) * Enable 4x4 and 5x5 community keymap support * Pull 4x4 community keymap fixes from @noroadsleft * Build fixes for guidoism keymap - move keymap to layouts/community/planck_mit as it uses the LAYOUT_planck_mit macro --- keyboards/40percentclub/4x4/4x4.h | 13 +++++++++++++ keyboards/40percentclub/4x4/rules.mk | 3 +-- keyboards/40percentclub/5x5/rules.mk | 3 +-- layouts/community/ortho_4x12/bakingpy/rules.mk | 2 ++ layouts/community/ortho_4x12/wanleg/rules.mk | 4 ++-- layouts/community/ortho_4x12/xyverz/rules.mk | 2 ++ .../{ortho_4x12 => planck_mit}/guidoism/config.h | 0 .../guidoism/generate_c.py | 0 .../guidoism/guidoism.json | 0 .../{ortho_4x12 => planck_mit}/guidoism/keymap.c | 0 .../{ortho_4x12 => planck_mit}/guidoism/keys.json | 0 .../{ortho_4x12 => planck_mit}/guidoism/readme.md | 0 12 files changed, 21 insertions(+), 6 deletions(-) rename layouts/community/{ortho_4x12 => planck_mit}/guidoism/config.h (100%) rename layouts/community/{ortho_4x12 => planck_mit}/guidoism/generate_c.py (100%) rename layouts/community/{ortho_4x12 => planck_mit}/guidoism/guidoism.json (100%) rename layouts/community/{ortho_4x12 => planck_mit}/guidoism/keymap.c (100%) rename layouts/community/{ortho_4x12 => planck_mit}/guidoism/keys.json (100%) rename layouts/community/{ortho_4x12 => planck_mit}/guidoism/readme.md (100%) diff --git a/keyboards/40percentclub/4x4/4x4.h b/keyboards/40percentclub/4x4/4x4.h index 8cc5a150a..359cdc80a 100644 --- a/keyboards/40percentclub/4x4/4x4.h +++ b/keyboards/40percentclub/4x4/4x4.h @@ -56,3 +56,16 @@ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2a, K2b, K2c, K2d, K2e, K2f }, \ { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3a, K3b, K3c, K3d, K3e, K3f } \ } + +#define LAYOUT_kc_ortho_4x12( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0a, K0b, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1a, K1b, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2a, K2b, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3a, K3b \ +) \ +{ \ + { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, KC_##K09, KC_##K0a, KC_##K0b, ___, ___, ___, ___}, \ + { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, KC_##K19, KC_##K1a, KC_##K1b, ___, ___, ___, ___}, \ + { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27, KC_##K28, KC_##K29, KC_##K2a, KC_##K2b, ___, ___, ___, ___}, \ + { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, KC_##K38, KC_##K39, KC_##K3a, KC_##K3b, ___, ___, ___, ___} \ +} diff --git a/keyboards/40percentclub/4x4/rules.mk b/keyboards/40percentclub/4x4/rules.mk index a51335798..4ab5e7431 100644 --- a/keyboards/40percentclub/4x4/rules.mk +++ b/keyboards/40percentclub/4x4/rules.mk @@ -76,5 +76,4 @@ AUDIO_ENABLE = no # Audio output on port C6 FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) -#FIXME: Community keymap build are currently failing due to missing functionality -#LAYOUTS = ortho_4x4 ortho_4x8 ortho_4x12 ortho_4x16 +LAYOUTS = ortho_4x4 ortho_4x8 ortho_4x12 ortho_4x16 diff --git a/keyboards/40percentclub/5x5/rules.mk b/keyboards/40percentclub/5x5/rules.mk index ae0414126..237de6497 100644 --- a/keyboards/40percentclub/5x5/rules.mk +++ b/keyboards/40percentclub/5x5/rules.mk @@ -77,5 +77,4 @@ AUDIO_ENABLE = no # Audio output on port C6 FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) -#FIXME: Community keymap build are currently failing due to missing functionality -#LAYOUTS = ortho_5x5 ortho_5x10 ortho_5x15 +LAYOUTS = ortho_5x5 ortho_5x10 ortho_5x15 diff --git a/layouts/community/ortho_4x12/bakingpy/rules.mk b/layouts/community/ortho_4x12/bakingpy/rules.mk index 490ebbf77..9be2f01d4 100644 --- a/layouts/community/ortho_4x12/bakingpy/rules.mk +++ b/layouts/community/ortho_4x12/bakingpy/rules.mk @@ -5,6 +5,8 @@ endif AUDIO_ENABLE = no ifeq ($(strip $(KEYBOARD)), zlant) BACKLIGHT_ENABLE = no +else ifeq ($(strip $(KEYBOARD)), 40percentclub/4x4) + BACKLIGHT_ENABLE = no else BACKLIGHT_ENABLE = yes endif diff --git a/layouts/community/ortho_4x12/wanleg/rules.mk b/layouts/community/ortho_4x12/wanleg/rules.mk index fa433a6b0..835022f4b 100644 --- a/layouts/community/ortho_4x12/wanleg/rules.mk +++ b/layouts/community/ortho_4x12/wanleg/rules.mk @@ -5,10 +5,10 @@ ifeq ($(strip $(KEYBOARD)), jj40) SWAP_HANDS_ENABLE = no endif -ifeq ($(strip $(KEYBOARD)), 4x4) +ifeq ($(strip $(KEYBOARD)), 40percentclub/4x4) SWAP_HANDS_ENABLE = no endif ifeq ($(strip $(KEYBOARD)), zlant) SWAP_HANDS_ENABLE = no -endif \ No newline at end of file +endif diff --git a/layouts/community/ortho_4x12/xyverz/rules.mk b/layouts/community/ortho_4x12/xyverz/rules.mk index 852e38f24..c181e1107 100644 --- a/layouts/community/ortho_4x12/xyverz/rules.mk +++ b/layouts/community/ortho_4x12/xyverz/rules.mk @@ -3,6 +3,8 @@ AUDIO_ENABLE = no # Audio output on port C6 ifeq ("$(KEYBOARD)","vitamins_included") RGBLIGHT_ENABLE = no +else ifeq ($(strip $(KEYBOARD)), 40percentclub/4x4) + RGBLIGHT_ENABLE = no else RGBLIGHT_ENABLE = yes endif diff --git a/layouts/community/ortho_4x12/guidoism/config.h b/layouts/community/planck_mit/guidoism/config.h similarity index 100% rename from layouts/community/ortho_4x12/guidoism/config.h rename to layouts/community/planck_mit/guidoism/config.h diff --git a/layouts/community/ortho_4x12/guidoism/generate_c.py b/layouts/community/planck_mit/guidoism/generate_c.py similarity index 100% rename from layouts/community/ortho_4x12/guidoism/generate_c.py rename to layouts/community/planck_mit/guidoism/generate_c.py diff --git a/layouts/community/ortho_4x12/guidoism/guidoism.json b/layouts/community/planck_mit/guidoism/guidoism.json similarity index 100% rename from layouts/community/ortho_4x12/guidoism/guidoism.json rename to layouts/community/planck_mit/guidoism/guidoism.json diff --git a/layouts/community/ortho_4x12/guidoism/keymap.c b/layouts/community/planck_mit/guidoism/keymap.c similarity index 100% rename from layouts/community/ortho_4x12/guidoism/keymap.c rename to layouts/community/planck_mit/guidoism/keymap.c diff --git a/layouts/community/ortho_4x12/guidoism/keys.json b/layouts/community/planck_mit/guidoism/keys.json similarity index 100% rename from layouts/community/ortho_4x12/guidoism/keys.json rename to layouts/community/planck_mit/guidoism/keys.json diff --git a/layouts/community/ortho_4x12/guidoism/readme.md b/layouts/community/planck_mit/guidoism/readme.md similarity index 100% rename from layouts/community/ortho_4x12/guidoism/readme.md rename to layouts/community/planck_mit/guidoism/readme.md From f3ffd6ad50f0a4bf24f0a0453cc5502b4b88f390 Mon Sep 17 00:00:00 2001 From: epaew Date: Tue, 27 Nov 2018 02:50:45 +0900 Subject: [PATCH 559/788] Keymap: Refactor edvorakjp user library (#4480) * Refactor edvorakjp user library * add tap dance support * update keymaps * edvorakjp: add SWAP_SCLN option * fix behavior of SWAP_SCLN --- .../helix/rev2/keymaps/edvorakjp/config.h | 1 + .../helix/rev2/keymaps/edvorakjp/keymap.c | 2 +- .../rev2/keymaps/edvorakjp/keymap_4rows.c | 2 +- .../rev2/keymaps/edvorakjp/keymap_5rows.c | 2 +- keyboards/helix/rev2/keymaps/edvorakjp/oled.c | 15 +- keyboards/iris/keymaps/edvorakjp/config.h | 1 + keyboards/iris/keymaps/edvorakjp/keymap.c | 7 +- users/edvorakjp/edvorakjp.c | 222 +----------------- users/edvorakjp/edvorakjp.h | 37 +-- users/edvorakjp/edvorakjp_process_record.c | 206 ++++++++++++++++ users/edvorakjp/edvorakjp_status.c | 75 ++++++ users/edvorakjp/edvorakjp_tap_dance.c | 71 ++++++ users/edvorakjp/readme.md | 12 +- users/edvorakjp/rules.mk | 8 +- 14 files changed, 406 insertions(+), 255 deletions(-) create mode 100644 users/edvorakjp/edvorakjp_process_record.c create mode 100644 users/edvorakjp/edvorakjp_status.c create mode 100644 users/edvorakjp/edvorakjp_tap_dance.c diff --git a/keyboards/helix/rev2/keymaps/edvorakjp/config.h b/keyboards/helix/rev2/keymaps/edvorakjp/config.h index 643220383..769988cdb 100644 --- a/keyboards/helix/rev2/keymaps/edvorakjp/config.h +++ b/keyboards/helix/rev2/keymaps/edvorakjp/config.h @@ -4,6 +4,7 @@ #undef TAPPING_FORCE_HOLD #undef TAPPING_TERM #define TAPPING_TERM 120 +#define SWAP_SCLN // If you need more program area, try select and reduce rgblight modes to use. diff --git a/keyboards/helix/rev2/keymaps/edvorakjp/keymap.c b/keyboards/helix/rev2/keymaps/edvorakjp/keymap.c index 22940f7cb..fd324a859 100644 --- a/keyboards/helix/rev2/keymaps/edvorakjp/keymap.c +++ b/keyboards/helix/rev2/keymaps/edvorakjp/keymap.c @@ -11,7 +11,7 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { switch(keycode) { case KC_LOCK: if (record->event.pressed) { - if (edvorakjp_config.enable_kc_lang) { + if (get_enable_kc_lang()) { SEND_STRING( SS_LCTRL(SS_LSFT(SS_TAP(X_POWER))) ); } else { SEND_STRING( SS_LGUI("l") ); diff --git a/keyboards/helix/rev2/keymaps/edvorakjp/keymap_4rows.c b/keyboards/helix/rev2/keymaps/edvorakjp/keymap_4rows.c index d8257d81f..805e6b17b 100644 --- a/keyboards/helix/rev2/keymaps/edvorakjp/keymap_4rows.c +++ b/keyboards/helix/rev2/keymaps/edvorakjp/keymap_4rows.c @@ -5,7 +5,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_EDVORAK] = LAYOUT_kc( //,----+----+----+----+----+----. ,----+----+----+----+----+----. - LBRC,RBRC,COMM,DOT , P , Y , F , G , R , W , Q ,BSLS, + LBRC,RBRC,COMM,DOT , Y , P , F , G , R , W , Q ,BSLS, //|----+----+----+----+----+----| |----+----+----+----+----+----| EQL , A , O , E , I , U , D , T , N , S , M ,MINS, //|----+----+----+----+----+----| |----+----+----+----+----+----| diff --git a/keyboards/helix/rev2/keymaps/edvorakjp/keymap_5rows.c b/keyboards/helix/rev2/keymaps/edvorakjp/keymap_5rows.c index 9116b3966..ef1b9d358 100644 --- a/keyboards/helix/rev2/keymaps/edvorakjp/keymap_5rows.c +++ b/keyboards/helix/rev2/keymaps/edvorakjp/keymap_5rows.c @@ -7,7 +7,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //,----+----+----+----+----+----. ,----+----+----+----+----+----. GRV ,EXLM, AT ,HASH,DLR ,PERC, CIRC,AMPR,ASTR,LPRN,RPRN,BSPC, //|----+----+----+----+----+----| |----+----+----+----+----+----| - LBRC,RBRC,COMM,DOT , P , Y , F , G , R , W , Q ,BSLS, + LBRC,RBRC,COMM,DOT , Y , P , F , G , R , W , Q ,BSLS, //|----+----+----+----+----+----| |----+----+----+----+----+----| EQL , A , O , E , I , U , D , T , N , S , M ,MINS, //|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----| diff --git a/keyboards/helix/rev2/keymaps/edvorakjp/oled.c b/keyboards/helix/rev2/keymaps/edvorakjp/oled.c index 5ced1d4fa..227e2c56f 100644 --- a/keyboards/helix/rev2/keymaps/edvorakjp/oled.c +++ b/keyboards/helix/rev2/keymaps/edvorakjp/oled.c @@ -23,15 +23,10 @@ void render_status(struct CharacterMatrix *matrix) { // Render to mode icon static char logo[][2][3] = {{{0x95,0x96,0},{0xb5,0xb6,0}},{{0x97,0x98,0},{0xb7,0xb8,0}}}; - if (edvorakjp_config.enable_kc_lang) { - matrix_write(matrix, logo[0][0]); - matrix_write_P(matrix, PSTR("\n")); - matrix_write(matrix, logo[0][1]); - } else { - matrix_write(matrix, logo[1][0]); - matrix_write_P(matrix, PSTR("\n")); - matrix_write(matrix, logo[1][1]); - } + int mode_number = get_enable_kc_lang() ? 0 : 1; + matrix_write(matrix, logo[mode_number][0]); + matrix_write(matrix, "\n"); + matrix_write(matrix, logo[mode_number][1]); // Define layers here, Have not worked out how to have text displayed for each layer. Copy down the number you see and add a case for it below char buf[40]; @@ -63,7 +58,7 @@ void render_status(struct CharacterMatrix *matrix) { // Host Keyboard LED Status char led[40]; snprintf(led, sizeof(led), "\n%s %s %s %s", - edvorakjp_config.enable_jp_extra_layer && japanese_mode ? "EXT" : " ", + get_enable_jp_extra_layer() && get_japanese_mode() ? "EXT" : " ", (host_keyboard_leds() & (1<event.pressed) { - if (edvorakjp_config.enable_kc_lang) { + if (get_enable_kc_lang()) { SEND_STRING( SS_LCTRL(SS_LSFT(SS_TAP(X_POWER))) ); } else { SEND_STRING( SS_LGUI("l") ); diff --git a/users/edvorakjp/edvorakjp.c b/users/edvorakjp/edvorakjp.c index cff1a123e..1ac610794 100644 --- a/users/edvorakjp/edvorakjp.c +++ b/users/edvorakjp/edvorakjp.c @@ -1,47 +1,12 @@ -#include "eeprom.h" #include "edvorakjp.h" -bool japanese_mode; -uint16_t time_on_pressed; - -edvorakjp_config_t edvorakjp_config; - -uint8_t eeconfig_read_edvorakjp(void) { - return eeprom_read_byte(EECONFIG_EDVORAK); -} - -void eeconfig_update_edvorakjp(uint8_t val) { - eeprom_update_byte(EECONFIG_EDVORAK, val); -} - void dvorakj_layer_off(void) { layer_off(_EDVORAKJ1); layer_off(_EDVORAKJ2); } -void update_japanese_mode(bool new_state) { - japanese_mode = new_state; - if (japanese_mode) { - if (edvorakjp_config.enable_kc_lang) { - SEND_STRING(SS_TAP(X_LANG1)); - } else { - SEND_STRING(SS_LALT("`")); - } - } else { - dvorakj_layer_off(); - if (edvorakjp_config.enable_kc_lang) { - SEND_STRING(SS_TAP(X_LANG2)); - } else { - SEND_STRING(SS_LALT("`")); - } - } -} - void matrix_init_user(void) { - japanese_mode = false; - time_on_pressed = 0; - edvorakjp_config.raw = eeconfig_read_edvorakjp(); - + edvorakjp_status_init(); matrix_init_keymap(); } @@ -58,189 +23,16 @@ uint32_t layer_state_set_keymap(uint32_t state) { return state; } -/* - * Each process_record_* methods defined here are - * return false if handle edvorak_keycodes, or return true others. - */ -__attribute__ ((weak)) -bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { - return true; -} - -bool process_record_edvorakjp_ext(uint16_t keycode, keyrecord_t *record) { - if (!(edvorakjp_config.enable_jp_extra_layer &&\ - (default_layer_state == 1UL<<_EDVORAK) &&\ - japanese_mode &&\ - record->event.pressed)) { - return true; - } - - // consonant keys - // layer_on(J1) or layer_on(J2) are defined based on key positions. - switch (keycode) { - // right hand's left side w/o N - case KC_F: - case KC_G: - case KC_R: - case KC_D: - case KC_T: - case KC_B: - case KC_H: - case KC_J: - layer_on(_EDVORAKJ1); - register_code(keycode); - unregister_code(keycode); - return false; - - // N: toggle layer - case KC_N: - biton32(layer_state) == _EDVORAK ? layer_on(_EDVORAKJ1) : dvorakj_layer_off(); - register_code(keycode); - unregister_code(keycode); - return false; - - // left hand and right hand's right side - case KC_X: - case KC_C: - case KC_V: - case KC_Z: - case KC_P: - case KC_Y: - case KC_W: - case KC_Q: - case KC_S: - case KC_M: - case KC_K: - case KC_L: - layer_on(_EDVORAKJ2); - register_code(keycode); - unregister_code(keycode); - return false; - } - - // vowel keys, symbol keys and modifier keys - dvorakj_layer_off(); - switch (keycode) { - // combination vowel keys - case KC_AI: - SEND_STRING("ai"); - return false; - case KC_OU: - SEND_STRING("ou"); - return false; - case KC_EI: - SEND_STRING("ei"); - return false; - case KC_ANN: - SEND_STRING("ann"); - return false; - case KC_ONN: - SEND_STRING("onn"); - return false; - case KC_ENN: - SEND_STRING("enn"); - return false; - case KC_INN: - SEND_STRING("inn"); - return false; - case KC_UNN: - SEND_STRING("unn"); - return false; - - // AOEIU and other (symbol, modifier) keys - default: - return true; - } -} - -bool process_record_edvorakjp_config(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case KC_MAC: - edvorakjp_config.enable_kc_lang = true; - eeconfig_update_edvorakjp(edvorakjp_config.raw); - return false; - case KC_WIN: - edvorakjp_config.enable_kc_lang = false; - eeconfig_update_edvorakjp(edvorakjp_config.raw); - return false; - case KC_EXTON: - edvorakjp_config.enable_jp_extra_layer = true; - eeconfig_update_edvorakjp(edvorakjp_config.raw); - return false; - case KC_EXTOFF: - edvorakjp_config.enable_jp_extra_layer = false; - eeconfig_update_edvorakjp(edvorakjp_config.raw); - return false; - } - return true; -} - -bool process_record_layer(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case EDVORAK: - if (record->event.pressed) { - set_single_persistent_default_layer(_EDVORAK); - } - return false; - case QWERTY: - if (record->event.pressed) { - dvorakj_layer_off(); - set_single_persistent_default_layer(_QWERTY); - } - return false; - case LOWER: - if (record->event.pressed) { - layer_on(_LOWER); - time_on_pressed = record->event.time; - } else { - layer_off(_LOWER); - - if (TIMER_DIFF_16(record->event.time, time_on_pressed) < TAPPING_TERM) { - update_japanese_mode(false); - } - time_on_pressed = 0; - } - return false; - case RAISE: - if (record->event.pressed) { - layer_on(_RAISE); - time_on_pressed = record->event.time; - } else { - layer_off(_RAISE); - - if (TIMER_DIFF_16(record->event.time, time_on_pressed) < TAPPING_TERM) { - update_japanese_mode(true); - } - time_on_pressed = 0; - } - return false; - default: - return true; - } -} - -bool process_record_ime(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case KC_JPN: - if (record->event.pressed) { - update_japanese_mode(true); - } - return false; - case KC_ENG: - if (record->event.pressed) { - update_japanese_mode(false); - } - return false; - default: - return true; - } -} - bool process_record_user(uint16_t keycode, keyrecord_t *record) { - return process_record_keymap(keycode, record) &&\ process_record_edvorakjp_ext(keycode, record) &&\ + process_record_edvorakjp_swap_scln(keycode, record) &&\ process_record_edvorakjp_config(keycode, record) &&\ process_record_layer(keycode, record) &&\ process_record_ime(keycode, record); } + +__attribute__ ((weak)) +bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { + return true; +} diff --git a/users/edvorakjp/edvorakjp.h b/users/edvorakjp/edvorakjp.h index f67400686..e781bf237 100644 --- a/users/edvorakjp/edvorakjp.h +++ b/users/edvorakjp/edvorakjp.h @@ -1,5 +1,5 @@ -#ifndef USERSPACE -#define USERSPACE +#ifndef EDVORAKJP +#define EDVORAKJP #include "quantum.h" #include "action_layer.h" @@ -8,15 +8,6 @@ extern keymap_config_t keymap_config; -typedef union { - uint8_t raw; - struct { - bool enable_jp_extra_layer : 1; - bool enable_kc_lang : 1; // for macOS - }; -} edvorakjp_config_t; -extern edvorakjp_config_t edvorakjp_config; - enum edvorakjp_layers { _EDVORAK = 0, _EDVORAKJ1, @@ -50,26 +41,38 @@ enum edvorakjp_keycodes { NEW_SAFE_RANGE }; -uint8_t eeconfig_read_edvorakjp(void); -void eeconfig_update_edvorakjp(uint8_t val); +enum tap_dance_code { + TD_LOWER = 0, + TD_RAISE +}; +// base void dvorakj_layer_off(void); -void update_japanese_mode(bool new_state); void matrix_init_user(void); void matrix_init_keymap(void); uint32_t layer_state_set_user(uint32_t state); uint32_t layer_state_set_keymap(uint32_t state); +bool process_record_user(uint16_t keycode, keyrecord_t *record); +bool process_record_keymap(uint16_t keycode, keyrecord_t *record); + +// status +void edvorakjp_status_init(void); +bool get_enable_jp_extra_layer(void); +void set_enable_jp_extra_layer(bool new_state); +bool get_enable_kc_lang(void); +void set_enable_kc_lang(bool new_state); +bool get_japanese_mode(void); +void set_japanese_mode(bool new_state); /* * Each process_record_* methods defined here are * return false if processed, or return true if not processed. * You can add your original macros in process_record_keymap() in keymap.c. */ -bool process_record_keymap(uint16_t keycode, keyrecord_t *record); bool process_record_edvorakjp_ext(uint16_t keycode, keyrecord_t *record); +bool process_record_edvorakjp_swap_scln(uint16_t keycode, keyrecord_t *record); bool process_record_edvorakjp_config(uint16_t keycode, keyrecord_t *record); bool process_record_layer(uint16_t keycode, keyrecord_t *record); bool process_record_ime(uint16_t keycode, keyrecord_t *record); -bool process_record_user(uint16_t keycode, keyrecord_t *record); -#endif +#endif // EDVORAKJP diff --git a/users/edvorakjp/edvorakjp_process_record.c b/users/edvorakjp/edvorakjp_process_record.c new file mode 100644 index 000000000..dc70522b4 --- /dev/null +++ b/users/edvorakjp/edvorakjp_process_record.c @@ -0,0 +1,206 @@ +#include "edvorakjp.h" + +#if TAP_DANCE_ENABLE != yes +static uint16_t time_on_pressed; +#endif +/* + * Each process_record_* methods defined here are + * return false if handle edvorak_keycodes, or return true others. + */ +bool process_record_edvorakjp_ext(uint16_t keycode, keyrecord_t *record) { + if (!(default_layer_state == 1UL<<_EDVORAK && + get_enable_jp_extra_layer() && get_japanese_mode())) { + return true; + } + + // consonant keys + // layer_on(J1) or layer_on(J2) are defined based on key positions. + switch (keycode) { + // right hand's left side w/o N + case KC_F: + case KC_G: + case KC_R: + case KC_D: + case KC_T: + case KC_B: + case KC_H: + case KC_J: + if (record->event.pressed) { + layer_on(_EDVORAKJ1); + } + return true; + + // N: toggle layer + case KC_N: + if (record->event.pressed) { + biton32(layer_state) == _EDVORAK ? layer_on(_EDVORAKJ1) : dvorakj_layer_off(); + } + return true; + + // left hand and right hand's right side + case KC_X: + case KC_C: + case KC_V: + case KC_Z: + case KC_Y: + case KC_P: + case KC_W: + case KC_Q: + case KC_S: + case KC_M: + case KC_K: + case KC_L: + if (record->event.pressed) { + layer_on(_EDVORAKJ2); + } + return true; + } + + // vowel keys, symbol keys and modifier keys + if (record->event.pressed) { + dvorakj_layer_off(); + } + switch (keycode) { + // combination vowel keys + case KC_AI: + if (record->event.pressed) { + SEND_STRING("ai"); + } + return false; + case KC_OU: + if (record->event.pressed) { + SEND_STRING("ou"); + } + return false; + case KC_EI: + if (record->event.pressed) { + SEND_STRING("ei"); + } + return false; + case KC_ANN: + if (record->event.pressed) { + SEND_STRING("ann"); + } + return false; + case KC_ONN: + if (record->event.pressed) { + SEND_STRING("onn"); + } + return false; + case KC_ENN: + if (record->event.pressed) { + SEND_STRING("enn"); + } + return false; + case KC_INN: + if (record->event.pressed) { + SEND_STRING("inn"); + } + return false; + case KC_UNN: + if (record->event.pressed) { + SEND_STRING("unn"); + } + return false; + } + // AOEIU and other (symbol, modifier) keys + return true; +} + +bool process_record_edvorakjp_swap_scln(uint16_t keycode, keyrecord_t *record) { +#ifdef SWAP_SCLN + static const uint8_t shift_bits = MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT); + static uint8_t last_mods_status; + if (keycode == KC_SCLN) { + if (record->event.pressed) { + last_mods_status = get_mods(); + + // invert shift_bits + if (last_mods_status & shift_bits) { + set_mods(last_mods_status & ~shift_bits); + } else { + set_mods(last_mods_status | MOD_BIT(KC_LSFT)); + } + } else { + set_mods(last_mods_status); + last_mods_status = 0; + } + } +#endif + return true; +} + +bool process_record_edvorakjp_config(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case KC_MAC: + case KC_WIN: + if (record->event.pressed) { + set_enable_kc_lang(keycode == KC_MAC); + } + return false; + case KC_EXTON: + case KC_EXTOFF: + if (record->event.pressed) { + set_enable_jp_extra_layer(keycode == KC_EXTON); + } + return false; + } + return true; +} + +bool process_record_layer(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case EDVORAK: + if (record->event.pressed) { + set_single_persistent_default_layer(_EDVORAK); + } + return false; + case QWERTY: + if (record->event.pressed) { + dvorakj_layer_off(); + set_single_persistent_default_layer(_QWERTY); + } + return false; +#if TAP_DANCE_ENABLE != yes + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + time_on_pressed = record->event.time; + } else { + layer_off(_LOWER); + + if (TIMER_DIFF_16(record->event.time, time_on_pressed) < TAPPING_TERM) { + set_japanese_mode(false); + } + time_on_pressed = 0; + } + return false; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + time_on_pressed = record->event.time; + } else { + layer_off(_RAISE); + + if (TIMER_DIFF_16(record->event.time, time_on_pressed) < TAPPING_TERM) { + set_japanese_mode(true); + } + time_on_pressed = 0; + } + return false; +#endif + } + return true; +} + +bool process_record_ime(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case KC_JPN: + case KC_ENG: + if (record->event.pressed) { + set_japanese_mode(keycode == KC_JPN); + } + return false; + } + return true; +} diff --git a/users/edvorakjp/edvorakjp_status.c b/users/edvorakjp/edvorakjp_status.c new file mode 100644 index 000000000..a60c8d853 --- /dev/null +++ b/users/edvorakjp/edvorakjp_status.c @@ -0,0 +1,75 @@ +#include "eeprom.h" +#include "edvorakjp.h" + +typedef union { + uint8_t raw; + struct { + bool enable_jp_extra_layer : 1; + bool enable_kc_lang : 1; // for macOS + }; +} edvorakjp_config_t; +static edvorakjp_config_t edvorakjp_config; + +typedef struct { + bool japanese_mode; +} edvorakjp_state_t; +static edvorakjp_state_t edvorakjp_state; + +/* + * private methods + */ +uint8_t eeconfig_read_edvorakjp(void) { + return eeprom_read_byte(EECONFIG_EDVORAK); +} + +void eeconfig_update_edvorakjp(uint8_t val) { + eeprom_update_byte(EECONFIG_EDVORAK, val); +} + +/* + * public methods + */ +void edvorakjp_status_init(void) { + edvorakjp_state.japanese_mode = false; + edvorakjp_config.raw = eeconfig_read_edvorakjp(); +} + +bool get_enable_jp_extra_layer(void) { + return edvorakjp_config.enable_jp_extra_layer; +} + +void set_enable_jp_extra_layer(bool new_state) { + edvorakjp_config.enable_jp_extra_layer = new_state; + eeconfig_update_edvorakjp(edvorakjp_config.raw); +} + +bool get_enable_kc_lang(void) { + return edvorakjp_config.enable_kc_lang; +} + +void set_enable_kc_lang(bool new_state) { + edvorakjp_config.enable_kc_lang = new_state; + eeconfig_update_edvorakjp(edvorakjp_config.raw); +} + +bool get_japanese_mode(void) { + return edvorakjp_state.japanese_mode; +} + +void set_japanese_mode(bool new_state) { + edvorakjp_state.japanese_mode = new_state; + if (edvorakjp_state.japanese_mode) { + if (edvorakjp_config.enable_kc_lang) { + SEND_STRING(SS_TAP(X_LANG1)); + } else { + SEND_STRING(SS_LALT("`")); + } + } else { + dvorakj_layer_off(); + if (edvorakjp_config.enable_kc_lang) { + SEND_STRING(SS_TAP(X_LANG2)); + } else { + SEND_STRING(SS_LALT("`")); + } + } +} diff --git a/users/edvorakjp/edvorakjp_tap_dance.c b/users/edvorakjp/edvorakjp_tap_dance.c new file mode 100644 index 000000000..62c0c100a --- /dev/null +++ b/users/edvorakjp/edvorakjp_tap_dance.c @@ -0,0 +1,71 @@ +#include "edvorakjp.h" +#include "process_keycode/process_tap_dance.h" + +enum tap_state { + NONE = 0, + SINGLE_TAP = 1, + DOUBLE_TAP = 2, + HOLD +}; + +static int td_status_lower = NONE; +static int td_status_raise = NONE; + +int cur_dance(qk_tap_dance_state_t *state) { + if (state->interrupted || !state->pressed) { + return state->count == 1 ? SINGLE_TAP : DOUBLE_TAP; + } else { + return HOLD; + } +} + +void td_lower_finished(qk_tap_dance_state_t *state, void *user_data) { + td_status_lower = cur_dance(state); + switch(td_status_lower) { + case SINGLE_TAP: + set_japanese_mode(false); + register_code(KC_ESC); + break; + case DOUBLE_TAP: + set_japanese_mode(false); + break; + case HOLD: + break; + } + layer_on(_LOWER); +} + +void td_lower_reset(qk_tap_dance_state_t *state, void *user_data) { + if (td_status_lower == SINGLE_TAP) { + unregister_code(KC_ESC); + } + layer_off(_LOWER); + td_status_lower = NONE; +} + +void td_raise_finished(qk_tap_dance_state_t *state, void *user_data) { + td_status_raise = cur_dance(state); + switch(td_status_raise) { + case SINGLE_TAP: + case DOUBLE_TAP: + set_japanese_mode(true); + break; + case HOLD: + break; + } + layer_on(_RAISE); +} + +void td_raise_reset(qk_tap_dance_state_t *state, void *user_data) { + layer_off(_RAISE); + td_status_raise = NONE; +} + +qk_tap_dance_action_t tap_dance_actions[] = { + [TD_LOWER] = ACTION_TAP_DANCE_FN_ADVANCED_TIME( + NULL, td_lower_finished, td_lower_reset, TAPPING_TERM * 1.5 + ), + [TD_RAISE] = ACTION_TAP_DANCE_FN_ADVANCED_TIME( + NULL, td_raise_finished, td_raise_reset, TAPPING_TERM * 1.5 + ) +}; diff --git a/users/edvorakjp/readme.md b/users/edvorakjp/readme.md index d7ec74285..077ba4abd 100644 --- a/users/edvorakjp/readme.md +++ b/users/edvorakjp/readme.md @@ -10,7 +10,7 @@ This is a sample. You can swap any symbol keys and modifier keys. //+----+----+----+----+----+----+----+----+----+----+----+----+----+---------+ ` , ! , @ , # , $ , % , ^ , & , * , ( , ) , [ , ] , BSPC , //+----+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+-------+ - TAB , ' , , , . , P , Y , F , G , R , W , Q , / , = , \ , + TAB , ' , , , . , Y , P , F , G , R , W , Q , / , = , \ , //+------++---++---++---++---++---++---++---++---++---++---++---++---+-------+ CAPS , A , O , E , I , U , D , T , N , S , M , - , ENT , //+-------+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-----------+ @@ -25,7 +25,7 @@ This is a sample. You can swap any symbol keys and modifier keys. //+----+----+----+----+----+----+----+----+----+----+----+----+----+---------+ ` , ! , @ , # , $ , % , ^ , & , * , ( , ) , [ , ] , BSPC , //+----+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+-------+ - TAB , ' , , , . , P , Y , F , G , R , W , C , / , = , + TAB , ' , , , . , Y , P , F , G , R , W , C , / , = , //+------++---++---++---++---++---++---++---++---++---++---++---++---++ CAPS , A , O , E , I , U , D , T , N , S , M , ; , - , ENT , //+-------+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+------+ @@ -78,11 +78,15 @@ This is a sample. You can swap any symbol keys and modifier keys. ## for Programmer - Dvorak 配列をベースに、ショートカットでよく利用される XCV は QWERTY 配列の位置を維持 -- Vimユーザのために、HJKL キーを横並びで配置 +- 一部にVimユーザ用のキー配置を実施 + - HJKL キーを横並びで配置 + - Shift押下時と非押下時で、";"キーの挙動を入れ替え(`config.h` 内で `#define SWAP_SCLN` の宣言が必要です) - デフォルトレイヤーには、数字キーの代わりに記号 `!@#$%^&*()` を配置 - mainly based on Dvorak layout, but XCV is available in the same position of QWERTY layout -- HJKL is lining side by side, for Vim users +- for Vim users + - HJKL is lining side by side + - swap the ";" key behavior. i.e. send ":" normally and send ";" when you hold shift. (need `#define SWAP_SCLN` in your `config.h`) - we can type `!@#$%^&*()` keys without shift keys in base layer ## License diff --git a/users/edvorakjp/rules.mk b/users/edvorakjp/rules.mk index 4fb739186..587c3b8d2 100644 --- a/users/edvorakjp/rules.mk +++ b/users/edvorakjp/rules.mk @@ -1 +1,7 @@ -SRC += edvorakjp.c +SRC += edvorakjp.c \ + edvorakjp_process_record.c \ + edvorakjp_status.c + +ifeq ($(TAP_DANCE_ENABLE), yes) +SRC += edvorakjp_tap_dance.c +endif From 4ebd27002a344b017276dc70796435a8e718f46a Mon Sep 17 00:00:00 2001 From: listofoptions <39714365+listofoptions@users.noreply.github.com> Date: Mon, 26 Nov 2018 12:53:49 -0500 Subject: [PATCH 560/788] Keyboard: 5291 firmware to replace the existing soarers controller firmware (#4483) * compiles but is not working * still testing 5291 * compiles but is not working * still testing 5291 * fixed a but in the layout (reversed key order in row) * compiles but is not working * still testing 5291 * fixed a but in the layout (reversed key order in row) * fixed some issues * doumentation needed * doumentation needed * documentation needed * documentation needed * Update readme.md documentation * Update readme.md i dislike markdown <_> * merge preperation --- keyboards/converter/ibm_5291/config.h | 42 +++ keyboards/converter/ibm_5291/ibm_5291.c | 3 + keyboards/converter/ibm_5291/ibm_5291.h | 69 +++++ keyboards/converter/ibm_5291/info.json | 6 + .../ibm_5291/keymaps/default/keymap.c | 233 ++++++++++++++ .../keymaps/kbdbabel_doc_ibm5291_kbd.pdf | Bin 0 -> 13054 bytes keyboards/converter/ibm_5291/matrix.c | 284 ++++++++++++++++++ keyboards/converter/ibm_5291/matrix.csv | 96 ++++++ keyboards/converter/ibm_5291/readme.md | 70 +++++ keyboards/converter/ibm_5291/rules.mk | 72 +++++ 10 files changed, 875 insertions(+) create mode 100644 keyboards/converter/ibm_5291/config.h create mode 100644 keyboards/converter/ibm_5291/ibm_5291.c create mode 100644 keyboards/converter/ibm_5291/ibm_5291.h create mode 100644 keyboards/converter/ibm_5291/info.json create mode 100644 keyboards/converter/ibm_5291/keymaps/default/keymap.c create mode 100644 keyboards/converter/ibm_5291/keymaps/kbdbabel_doc_ibm5291_kbd.pdf create mode 100644 keyboards/converter/ibm_5291/matrix.c create mode 100644 keyboards/converter/ibm_5291/matrix.csv create mode 100644 keyboards/converter/ibm_5291/readme.md create mode 100644 keyboards/converter/ibm_5291/rules.mk diff --git a/keyboards/converter/ibm_5291/config.h b/keyboards/converter/ibm_5291/config.h new file mode 100644 index 000000000..5c9ca1e4a --- /dev/null +++ b/keyboards/converter/ibm_5291/config.h @@ -0,0 +1,42 @@ +/* +Copyright 2018 listofoptions + +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 . +*/ + +#pragma once + +#include "config_common.h" + +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 1 +#define MANUFACTURER QMK +#define PRODUCT 5291 keyboard converter +#define DESCRIPTION 5291 keyboard converter + +#define MATRIX_ROWS 24 +#define MATRIX_COLS 4 + +#define MATRIX_ROW_PINS {B2, B3, B4, B5, B6} +#define MATRIX_COL_PINS {B0, B1} +#define MATRIX_DATA_PIN D0 +#define MATRIX_STROBE_PIN D1 +#define LED_PIN D6 + + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 0 + + diff --git a/keyboards/converter/ibm_5291/ibm_5291.c b/keyboards/converter/ibm_5291/ibm_5291.c new file mode 100644 index 000000000..9b937a545 --- /dev/null +++ b/keyboards/converter/ibm_5291/ibm_5291.c @@ -0,0 +1,3 @@ +#include "ibm_5291.h" +#include +#include "quantum.h" \ No newline at end of file diff --git a/keyboards/converter/ibm_5291/ibm_5291.h b/keyboards/converter/ibm_5291/ibm_5291.h new file mode 100644 index 000000000..aa1b40324 --- /dev/null +++ b/keyboards/converter/ibm_5291/ibm_5291.h @@ -0,0 +1,69 @@ +/* +Copyright 2018 listofoptions + +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 . +*/ + +#pragma once + +#include "quantum.h" + +/* + * ,-------. ,--------------------------------------------------------------------------. + * | F1| F2| |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| BS |NumLck |ScrLck | + * |-------| |--------------------------------------------------------------------------| + * | F3| F4| | Tab | Q| W| E| R| T| Y| U| I| O| P| [| ] | | 7| 8| 9| -| + * |-------| |------------------------------------------------------|Ent|---------------| + * | F5| F6| | Ctrl | A| S| D| F| G| H| J| K| L| ;| '| `| | 4| 5| 6| | + * |-------| |----------------------------------------------------------------------| | + * | F7| F8| |Shif| \| Z| X| C| V| B| N| M| ,| .| /|Shift|PrS| 1| 2| 3| +| + * |-------| |----------------------------------------------------------------------| | + * | F9|F10| | Alt | Space |CapsLck| 0 | . | | + * `-------' `--------------------------------------------------------------------------' +*/ + +#define LAYOUT_5291( \ + KEY_F1,KEY_F2, KEY_ESC, KEY_1, KEY_2,KEY_3,KEY_4,KEY_5,KEY_6,KEY_7,KEY_8,KEY_9, KEY_0, KEY_MIN, KEY_EQU, KEY_BACK, KEY_NLOCK, KEY_SLOCK, \ + KEY_F3,KEY_F4, KEY_TAB, KEY_Q, KEY_W,KEY_E,KEY_R,KEY_T,KEY_Y,KEY_U,KEY_I,KEY_O, KEY_P, KEY_LBRC,KEY_RBRC, KEY_PAD7,KEY_PAD8, KEY_PAD9,KEY_PMIN, \ + KEY_F5,KEY_F6, KEY_LCTR,KEY_A, KEY_S,KEY_D,KEY_F,KEY_G,KEY_H,KEY_J,KEY_K,KEY_L, KEY_SEMI,KEY_QUOT,KEY_TICK, KEY_ENTR,KEY_PAD4,KEY_PAD5, KEY_PAD6, \ + KEY_F7,KEY_F8, KEY_LSFS,KEY_BSLS,KEY_Z,KEY_X,KEY_C,KEY_V,KEY_B,KEY_N,KEY_M,KEY_COMM,KEY_DOT, KEY_SLS,KEY_RSFS, KEY_PAST,KEY_PAD1,KEY_PAD2, KEY_PAD3,KEY_PPLS, \ + KEY_F9,KEY_F10, KEY_LALT, KEY_SPACE, KEY_CLOCK, KEY_PAD0, KEY_PDOT \ +) \ +{ {KEY_Z, KEY_S, KEY_W, KEY_3 }\ +, {KEY_X, KEY_D, KEY_E, KEY_4 }\ +, {KEY_C, KEY_F, KEY_R, KEY_5 }\ +, {KEY_V, KEY_G, KEY_T, KEY_6 }\ +, {KEY_B, KEY_H, KEY_Y, KEY_7 }\ +, {KEY_N, KEY_J, KEY_U, KEY_8 }\ +, {KEY_PAD2, KEY_PAD5,KEY_PAD8,KEY_NLOCK }\ +, {KEY_M, KEY_K, KEY_I, KEY_9 }\ +, {KEY_COMM, KEY_L, KEY_O, KEY_0 }\ +, {KEY_DOT, KEY_SEMI,KEY_P, KEY_MIN }\ +, {KEY_SLS, KEY_QUOT,KEY_LBRC,KEY_EQU }\ +, {KEY_SPACE, KEY_RSFS,KEY_TICK,KEY_RBRC }\ +, {KEY_CLOCK, KEY_PAST,KEY_ENTR,KEY_BACK }\ +, {KEY_PAD0, KEY_PAD1,KEY_PAD4,KEY_PAD7 }\ +, {KEY_PPLS, KC_NO, KEY_PMIN,KEY_SLOCK }\ +, {KEY_PDOT, KEY_PAD3,KEY_PAD6,KEY_PAD9 }\ +, {KEY_BSLS, KEY_A, KEY_Q, KEY_2 }\ +, {KEY_LALT, KC_NO, KC_NO, KEY_1 }\ +, {KEY_F7, KEY_F5, KEY_F3, KEY_F1 }\ +, {KEY_F8, KEY_F6, KEY_F4, KEY_F2 }\ +, {KC_F10, KC_NO, KC_NO, KC_NO }\ +, {KC_F9, KC_NO, KC_NO, KC_NO }\ +, {KEY_LSFS, KEY_LCTR,KEY_TAB, KEY_ESC }\ +, {KC_NO, KC_NO, KC_NO, KC_NO }\ +} + +#define LAYOUT LAYOUT_5291 \ No newline at end of file diff --git a/keyboards/converter/ibm_5291/info.json b/keyboards/converter/ibm_5291/info.json new file mode 100644 index 000000000..080a16336 --- /dev/null +++ b/keyboards/converter/ibm_5291/info.json @@ -0,0 +1,6 @@ +{ + "keyboard_name": "IBM 5291", + "keyboard_folder": "converter/5291", + "url": "https://deskthority.net/wiki/IBM_Model_F#IBM_5291_Keyboard", + "maintainer": "listofoptions", +} diff --git a/keyboards/converter/ibm_5291/keymaps/default/keymap.c b/keyboards/converter/ibm_5291/keymaps/default/keymap.c new file mode 100644 index 000000000..9b286c887 --- /dev/null +++ b/keyboards/converter/ibm_5291/keymaps/default/keymap.c @@ -0,0 +1,233 @@ +/* +Copyright 2018 listofoptions + +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 . +*/ + +#include QMK_KEYBOARD_H +/* +enum xt_keycodes + { XT_PAST = SAFE_RANGE // XT pad asterisk / print screen + , XT_SLCK // XT scroll lock / break + , XT_F6 // F6 / app key + , XT_F5 // F5 / gui + , XT_F9 // F9 / F11 + , XT_F10 // F10 / F12 + } ; + +static bool shift_pressed = false , + alt_pressed = false , + ctrl_pressed = false , + xt_pscr_pressed = false , + xt_brk_pressed = false , + xt_app_pressed = false , + xt_gui_pressed = false , + xt_lout_pressed = false , + xt_f11_pressed = false , + xt_f12_pressed = false ; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case KC_LSFT: + case KC_RSFT: + if (record->event.pressed) { + shift_pressed = true ; + } else { + shift_pressed = false ; + } + return true; + break; + + case KC_LALT: + if (record->event.pressed) { + alt_pressed = true ; + } else { + alt_pressed = false ; + } + return true; + break; + + case KC_LCTL: + if (record->event.pressed) { + ctrl_pressed = true ; + } else { + ctrl_pressed = false ; + } + return true; + break; + + case XT_PAST: + if (record->event.pressed) { + if (shift_pressed) { + xt_pscr_pressed = true ; + register_code(KC_PSCR); + } else { + register_code(KC_PAST); + } + } else { + if (xt_pscr_pressed) { + xt_pscr_pressed = false ; + unregister_code(KC_PSCR); + } else { + unregister_code(KC_PAST); + } + } + return false; + break; + + case XT_SLCK: + if (record->event.pressed) { + if (ctrl_pressed) { + xt_brk_pressed = true ; + register_code(KC_BRK); + } else { + register_code(KC_SLCK); + } + } else { + if (xt_brk_pressed) { + xt_brk_pressed = false ; + unregister_code(KC_BRK); + } else { + unregister_code(KC_SLCK); + } + } + return false; + break; + + case XT_F6: + if (record->event.pressed) { + if (shift_pressed) { + xt_app_pressed = true ; + register_code(KC_APP); + } else { + register_code(KC_F6); + } + } else { + if (xt_app_pressed) { + xt_app_pressed = false ; + unregister_code(KC_APP); + } else { + unregister_code(KC_F6); + } + } + return false; + break; + + case XT_F5: + if (record->event.pressed) { + if (shift_pressed) { + xt_gui_pressed = true ; + register_code(KC_LGUI); + } else if (ctrl_pressed) { + xt_lout_pressed = true ; + register_code (KC_LGUI) ; + register_code (KC_L) ; + } else { + register_code(KC_F5); + } + } else { + if (xt_gui_pressed) { + xt_gui_pressed = false ; + unregister_code(KC_LGUI); + } else if (xt_lout_pressed) { + xt_lout_pressed = false ; + unregister_code (KC_LGUI) ; + unregister_code (KC_L) ; + } else { + unregister_code(KC_F5); + } + } + return false; + break; + + case XT_F9: + if (record->event.pressed) { + if (shift_pressed) { + xt_f11_pressed = true ; + register_code(KC_F11); + } else { + register_code(KC_F9); + } + } else { + if (xt_f11_pressed) { + xt_f11_pressed = false ; + unregister_code(KC_F11); + } else { + unregister_code(KC_F9); + } + } + return false; + break; + + case XT_F10: + if (record->event.pressed) { + if (shift_pressed) { + xt_f12_pressed = true ; + register_code(KC_F12); + } else { + register_code(KC_F10); + } + } else { + if (xt_f12_pressed) { + xt_f12_pressed = false ; + unregister_code(KC_F12); + } else { + unregister_code(KC_F10); + } + } + return false; + break; + + default: + return true; + break; + } + + return true; +} +*/ + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +// default layout is the standard XT layout +/* + * ,-------. ,--------------------------------------------------------------------------. + * | F1| F2| |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| BS |NumLck |ScrLck | + * |-------| |--------------------------------------------------------------------------| + * | F3| F4| | Tab | Q| W| E| R| T| Y| U| I| O| P| [| ] | | 7| 8| 9| -| + * |-------| |------------------------------------------------------|Ent|---------------| + * | F5| F6| | Ctrl | A| S| D| F| G| H| J| K| L| ;| '| `| | 4| 5| 6| | + * |-------| |----------------------------------------------------------------------| | + * | F7| F8| |Shif| \| Z| X| C| V| B| N| M| ,| .| /|Shift| *| 1| 2| 3| +| + * |-------| |----------------------------------------------------------------------| | + * | F9|F10| | Alt | Space |CapsLck| 0 | . | | + * `-------' `--------------------------------------------------------------------------' +*/ +/* + [0] = LAYOUT ( + KC_F1,KC_F2, KC_ESC, KC_1, KC_2,KC_3,KC_4,KC_5,KC_6,KC_7,KC_8,KC_9, KC_0, KC_MINS,KC_EQL, KC_BSPC, KC_NLCK, XT_SLCK, + KC_F3,KC_F4, KC_TAB, KC_Q, KC_W,KC_E,KC_R,KC_T,KC_Y,KC_U,KC_I,KC_O, KC_P, KC_LBRC,KC_RBRC, KC_P7,KC_P8, KC_P9, KC_PMNS, + XT_F5,XT_F6, KC_LCTL,KC_A, KC_S,KC_D,KC_F,KC_G,KC_H,KC_J,KC_K,KC_L, KC_SCLN,KC_QUOT,KC_GRV, KC_ENT, KC_P4,KC_P5, KC_P6, + KC_F7,KC_F8, KC_LSFT,KC_BSLS,KC_Z,KC_X,KC_C,KC_V,KC_B,KC_N,KC_M,KC_COMM,KC_DOT, KC_SLSH,KC_RSFT,XT_PAST,KC_P1,KC_P2, KC_P3, KC_PPLS, + XT_F9,XT_F10,KC_LALT, KC_SPACE, KC_CAPS, KC_P0, KC_PDOT + ) +*/ + [0] = LAYOUT ( + KC_F1,KC_F2, KC_ESC, KC_1, KC_2,KC_3,KC_4,KC_5,KC_6,KC_7,KC_8,KC_9, KC_0, KC_MINS,KC_EQL, KC_BSPC, KC_NLCK, KC_SLCK, + KC_F3,KC_F4, KC_TAB, KC_Q, KC_W,KC_E,KC_R,KC_T,KC_Y,KC_U,KC_I,KC_O, KC_P, KC_LBRC,KC_RBRC, KC_P7,KC_P8, KC_P9, KC_PMNS, + KC_F5,KC_F6, KC_LCTL,KC_A, KC_S,KC_D,KC_F,KC_G,KC_H,KC_J,KC_K,KC_L, KC_SCLN,KC_QUOT,KC_GRV, KC_ENT, KC_P4,KC_P5, KC_P6, + KC_F7,KC_F8, KC_LSFT,KC_BSLS,KC_Z,KC_X,KC_C,KC_V,KC_B,KC_N,KC_M,KC_COMM,KC_DOT, KC_SLSH,KC_RSFT,KC_PAST,KC_P1,KC_P2, KC_P3, KC_PPLS, + KC_F9,KC_F10,KC_LALT, KC_SPACE, KC_CAPS, KC_P0, KC_PDOT + ) +} ; + diff --git a/keyboards/converter/ibm_5291/keymaps/kbdbabel_doc_ibm5291_kbd.pdf b/keyboards/converter/ibm_5291/keymaps/kbdbabel_doc_ibm5291_kbd.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3560598f02b8bacc12ef9426875a5b7076e32eab GIT binary patch literal 13054 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 literal 0 HcmV?d00001 diff --git a/keyboards/converter/ibm_5291/matrix.c b/keyboards/converter/ibm_5291/matrix.c new file mode 100644 index 000000000..58f6e37b6 --- /dev/null +++ b/keyboards/converter/ibm_5291/matrix.c @@ -0,0 +1,284 @@ +/* +Copyright 2018 listofoptions + +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 . +*/ + +#include +#include +#include +#if defined(__AVR__) +#include +#endif +#include + +#include "wait.h" +#include "print.h" +#include "debug.h" +#include "util.h" +#include "matrix.h" +#include "timer.h" + +#include "config.h" + + +#ifndef DEBOUNCING_DELAY +# define DEBOUNCING_DELAY 5 +#endif + +#define print_matrix_header() print("\nr/c 01234567\n") +#define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row)) +#define matrix_bitpop(i) bitpop(matrix[i]) +#define ROW_SHIFTER ((uint8_t)1) +#define check_bit(var,pos) ((var) & (1<<(pos))) + +#define NUM_ROW_PINS 5 +#define NUM_COL_PINS 2 + +static const uint8_t row_pins [NUM_ROW_PINS] = MATRIX_ROW_PINS ; +static const uint8_t col_pins [NUM_ROW_PINS] = MATRIX_COL_PINS ; + +#if ( DEBOUNCING_DELAY > 0 ) +static uint16_t debouncing_time ; +static bool debouncing = false ; +#endif + +static uint8_t matrix [MATRIX_ROWS] = {0}; + +#if ( DEBOUNCING_DELAY > 0 ) +static uint8_t matrix_debounce [MATRIX_ROWS] = {0}; +#endif + +static +inline +void toggle_led(void) { + uint8_t pin = LED_PIN ; + _SFR_IO8((pin >> 4) + 2) ^= _BV(pin & 0xF); +} + +static +inline +void init_led(void) { + uint8_t pin = LED_PIN ; + _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT + _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW +} + +static +inline +void init_data(void) { + uint8_t pin = MATRIX_DATA_PIN ; + _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // LO +} + +static +inline +void init_strobe(void) { + uint8_t pin = MATRIX_STROBE_PIN ; + _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI +} + +static +inline +void init_rows(void) { + for ( uint8_t i = 0 ; i < NUM_ROW_PINS; ++i ) { + uint8_t pin = row_pins[i]; + _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT + _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW + } +} + +static +inline +void init_cols(void) { + for ( uint8_t i = 0 ; i < NUM_COL_PINS; ++i ) { + uint8_t pin = col_pins[i]; + _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT + _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW + } +} + +static +inline +void select_row(uint8_t current_row) { + for ( uint8_t i = 0 ; i < NUM_ROW_PINS; ++i ) { + uint8_t pin = row_pins[i] ; + if ( check_bit( current_row, i ) ) { + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + } else { + _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW + } + } + wait_us(30) ; +} + +static +inline +void select_col(uint8_t current_col) { + for ( uint8_t i = 0 ; i < NUM_COL_PINS; ++i ) { + uint8_t pin = col_pins[i] ; + if ( check_bit( current_col, i ) ) { + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + } else { + _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW + } + } + wait_us(30) ; +} + +static +inline +uint8_t matrix_strobe(uint8_t col_index) { + uint8_t strobe_pin = MATRIX_STROBE_PIN ; + uint8_t data_pin = MATRIX_DATA_PIN ; + + // set strobe pin low + _SFR_IO8((strobe_pin >> 4) + 2) &= ~_BV(strobe_pin & 0xF); + + wait_us(30) ; + + // read data + uint8_t data = (_SFR_IO8(data_pin >> 4) & _BV(data_pin & 0xF)) ; + + // set strobe pin hi + _SFR_IO8((strobe_pin >> 4) + 2) |= _BV(strobe_pin & 0xF); + + uint8_t out = data ? (1 << col_index) : 0 ; + return out ; +} + +static +bool matrix_read(uint8_t current_matrix[], uint8_t current_row) { + // Store last value of row prior to reading + uint8_t last_row_value = current_matrix[current_row]; + + // Clear data in matrix row + current_matrix[current_row] = 0; + + select_row(current_row); + + // For each col... + for(uint8_t col_index = 0; col_index < MATRIX_COLS; ++col_index) { + + select_col(col_index) ; + + // strobe the matrix + // Populate the matrix row with the state of the data pin + current_matrix[current_row] |= matrix_strobe(col_index) ; + } + + bool test = last_row_value != current_matrix[current_row] ; + return test ; +} + +__attribute__ ((weak)) +void matrix_init_quantum(void) { + matrix_init_kb(); +} + +__attribute__ ((weak)) +void matrix_scan_quantum(void) { + matrix_scan_kb(); +} + +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + +inline +uint8_t matrix_rows(void) { + return MATRIX_ROWS; +} + +inline +uint8_t matrix_cols(void) { + return MATRIX_COLS; +} + +inline +uint8_t matrix_get_row(uint8_t row) { + return matrix[row]; +} + +void matrix_init(void) { + init_led() ; + init_rows() ; + init_cols() ; + init_data() ; + init_strobe() ; + + // initialize matrix state: all keys off + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + matrix[i] = 0; +# if (DEBOUNCING_DELAY > 0) + matrix_debounce [i] = 0; +# endif + } + + matrix_init_quantum() ; +} + +uint8_t matrix_scan(void) { + for ( uint8_t current_row = 0; current_row < MATRIX_ROWS; ++current_row ) { +# if (DEBOUNCING_DELAY > 0) + bool matrix_changed = matrix_read(matrix_debounce, current_row); + + if (matrix_changed) { + debouncing = true ; + debouncing_time = timer_read(); + } + +# else + matrix_read(matrix, current_row); +# endif + } + +# if (DEBOUNCING_DELAY > 0) + if (debouncing && (timer_elapsed(debouncing_time) > DEBOUNCING_DELAY)) { + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + matrix[i] = matrix_debounce[i]; + } + debouncing = false; + } +# endif + + matrix_scan_quantum(); + return 1; +} + +void matrix_print(void) { + print_matrix_header(); + + for (uint8_t row = 0; row < MATRIX_ROWS; row++) { + phex(row); print(": "); + print_matrix_row(row); + print("\n"); + } +} diff --git a/keyboards/converter/ibm_5291/matrix.csv b/keyboards/converter/ibm_5291/matrix.csv new file mode 100644 index 000000000..40462c214 --- /dev/null +++ b/keyboards/converter/ibm_5291/matrix.csv @@ -0,0 +1,96 @@ +0,Z +1,S +2,W +3,3 +4,X +5,D +6,E +7,4 +8,C +9,F +10,R +11,5 +12,V +13,G +14,T +15,6 +16,B +17,H +18,Y +19,7 +20,N +21,J +22,U +23,8 +24,PAD_2 +25,PAD_5 +26,PAD_8 +27,NUM_LOCK +28,M +29,K +30,I +31,9 +32,COMMA +33,L +34,O +35,0 +36,PERIOD +37,SEMICOLON +38,P +39,MINUS +40,SLASH +41,QUOTE +42,LEFT_BRACE +43,EQUAL +44,SPACE +45,RSHIFT +46,BACK_QUOTE +47,RIGHT_BRACE +48,CAPS_LOCK +49,PAD_ASTERIX +50,ENTER +51,BACKSPACE +52,PAD_0 +53,PAD_1 +54,PAD_4 +55,PAD_7 +56,PAD_PLUS +57,UNASSIGNED +58,PAD_MINUS +59,SCROLL_LOCK +60,PAD_PERIOD +61,PAD_3 +62,PAD_6 +63,PAD_9 +64,BACKSLASH +65,A +66,Q +67,2 +68,LALT +69,UNASSIGNED +70,UNASSIGNED +71,1 +72,F7 +73,F5 +74,F3 +75,F1 +76,F8 +77,F6 +78,F4 +79,F2 +80,F10 +81,UNASSIGNED +82,UNASSIGNED +83,UNASSIGNED +84,F9 +85,UNASSIGNED +86,UNASSIGNED +87,UNASSIGNED +88,LSHIFT +89,LCTRL +90,TAB +91,ESC +92,UNASSIGNED +93,UNASSIGNED +94,UNASSIGNED +95,UNASSIGNED diff --git a/keyboards/converter/ibm_5291/readme.md b/keyboards/converter/ibm_5291/readme.md new file mode 100644 index 000000000..06ae2e994 --- /dev/null +++ b/keyboards/converter/ibm_5291/readme.md @@ -0,0 +1,70 @@ +# IBM 5291 keyboard converter + +![5291](https://deskthority.net/wiki/IBM_Model_F#IBM_5291_Keyboard) + +A converter for the eponymous keyboard. + +Keyboard Maintainer: [Listofoptions](https://github.com/listofoptions) +Hardware Supported: IBM 5291, Teensy 2.0 + +Make example for this keyboard (after setting up your build environment): + + make converter/ibm_5291:default + +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). + + +the pinout is as follows: + +IBM−5291−Cable to Pinhead−14 + +| pin | description +----|------------------------ +1 | GND +2 | NC +3 | GND +4 | GN) +5 | +5V +6 | D0 +7 | D1 +8 | D2 +9 | D3 +10| D4 +11| D5 +12| D6 +13| Strobe +14| Out + +the pins on this connector are organized ![here](https://geekhack.org/index.php?action=dlattach;topic=48950.0;attach=36759;image) + +IBM−5291−2 Cable with DB15M connector + +| pin | description +----|------------- +|1,2,3 | GND +|4 | +5V +|5 | D0 +|6 | D1 +|7 | D2 +|8 | D3 +|9 | D4 +|10 | D5 +|11 | D6 +|12 | Strobe +|13 | Out +|14 | PE +|15 | NC + +the above connector is actually numbered so it should be easier to determine +where the needed connections are. + +to connect to the teensy, the following are pins are needed (if you should choose not set your own): +* PB0 -> PB6 are connected to D0 -> D6 +* +5V is connected to the corresponding teensy pin +* gnd is as well, only one of the gnd pins needs to be connected though. +* strobe is connected to pin PD1 +* data is connected to PD0 +* PE does not need to be connected to anything, but it could also be connected to gnd + +sources: + http://www.retrocomputing.eu/documents/5291_MaintenanceLibrary.pdf diff --git a/keyboards/converter/ibm_5291/rules.mk b/keyboards/converter/ibm_5291/rules.mk new file mode 100644 index 000000000..ca0c850c0 --- /dev/null +++ b/keyboards/converter/ibm_5291/rules.mk @@ -0,0 +1,72 @@ +# MCU name +#MCU = at90usb1287 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + +# Bootloader +# This definition is optional, and if your keyboard supports multiple bootloaders of +# different sizes, comment this out, and the correct address will be loaded +# automatically (+60). See bootloader.mk for all options. +BOOTLOADER = halfkay + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = no # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. +API_SYSEX_ENABLE = no +SPLIT_KEYBOARD = no +WAIT_FOR_USB = yes + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +LAYOUTS_HAS_RGB = NO + +CUSTOM_MATRIX = yes +SRC = matrix.c \ No newline at end of file From fe68599a34af5e4f4f905a4127077fa321dbc0de Mon Sep 17 00:00:00 2001 From: zgtm Date: Mon, 26 Nov 2018 19:01:34 +0100 Subject: [PATCH 561/788] Keyboard: add generic ortho 5x15 layout support to Idobo (#4486) --- keyboards/idobo/rules.mk | 2 ++ 1 file changed, 2 insertions(+) diff --git a/keyboards/idobo/rules.mk b/keyboards/idobo/rules.mk index 383a3594b..246d152c9 100644 --- a/keyboards/idobo/rules.mk +++ b/keyboards/idobo/rules.mk @@ -79,3 +79,5 @@ BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID AUDIO_ENABLE = no # Audio output on port C6 FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) + +LAYOUTS = ortho_5x15 From b91dfa04e3bad560fb6fe2360dd51fb95d95fcbf Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 26 Nov 2018 14:35:01 -0800 Subject: [PATCH 562/788] Add support for PR and Issue templates to QMK_firmware GitHub (#4491) * Add support document * Add Bug Report * Add GitHub Pull Request Template * Feature request issue template * Touch up feature request template * Add 'other issues' template * move support doc --- .github/ISSUE_TEMPLATE/bug_report.md | 27 ++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 15 ++++++++ .github/ISSUE_TEMPLATE/other_issues.md | 7 ++++ .github/PULL_REQUEST_TEMPLATE.md | 22 ++++++++++++ docs/support.md | 43 +++++++++++++++++++++++ 5 files changed, 114 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/ISSUE_TEMPLATE/other_issues.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 docs/support.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 000000000..ed5d56ce3 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,27 @@ +--- +name: Bug report +about: Create a report to help us improve the QMK Firmware +--- + +**Describe the bug** + +A clear and concise description of what the bug is. + +**System Information** + - Keyboard: + - Revision (if applicable): + - Operating System: + - avr-gcc version: + (Run `avr-gcc --version` to find out) + - arm gcc version: + (Run `arm-none-eabi-gcc --version` to find out) + - QMK Firmware version: + (you can run `git describe --abbrev=0 --tags` to find this out) + - Any keyboard related software installed? + - [ ] Auto Hot Key + - [ ] Karabiner + - [ ] Other + +**Additional context** + +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 000000000..ac924b3ac --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,15 @@ +--- +name: Feature request +about: Suggest a new feature or changes to existing features + +--- + +## Feature Request Type + +- [ ] Core Functionality +- [ ] Add-on hardware support (eg audio, rgb, oled screen, etc) +- [ ] Alteration (enhancement/optimization) of existing Feature(s) +- [ ] New behavior + +## Description +A few sentances describing what it is that you'd like to see. Additional information (such as links to spec sheets, licensing info, other related issues or PR's, etc) would be helpful. diff --git a/.github/ISSUE_TEMPLATE/other_issues.md b/.github/ISSUE_TEMPLATE/other_issues.md new file mode 100644 index 000000000..53481f9ab --- /dev/null +++ b/.github/ISSUE_TEMPLATE/other_issues.md @@ -0,0 +1,7 @@ +--- +name: Other issues +about: Anything else that doesn't fall into the above categories. + +--- + +Please check https://docs.qmk.fm/SUPPORT.md for additional resources first. If that doesn't answer your question, check the bug report option, as that may be more appropriate. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000..36410da26 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,22 @@ +## Code Change Type +- [ ] Core +- [ ] Feature +- [ ] Bugfix +- [ ] Keyboard +- [ ] Keymap/Layout/Userspace +- [ ] Enhancement/Optimization +- [ ] Documentation + +## Description +A few sentences describing the overall goals of the pull request's commits. + +## Todo +- [ ] Tests +- [ ] Documentation + +## Issues Fixed or Closed by this PR + +* + +## Long Description +If needed, a longer description and a list of changes should be added here to make it clear what exactly this PR's goals are. diff --git a/docs/support.md b/docs/support.md new file mode 100644 index 000000000..28894c2c3 --- /dev/null +++ b/docs/support.md @@ -0,0 +1,43 @@ +# Support + +If you need help with something, the best place to get quick support is going to be on our [Discord Server](https://discord.gg/Uq7gcHh). There is usually somebody online, and there are a bunch of very helpful people there. + +Don't forget to read our [Code of Conduct](https://qmk.fm/coc/). + +## Help! I don't know where to start! + +If this is the case, then you should start with our [Newbs Guide](https://docs.qmk.fm/#/newbs). There is a lot of great info there, and that should cover everything you need to get started. + +If that's an issue, hop onto the [QMK Configurator](https://config.qmk.fm), as that will handle a majority of what you need there. + +## Help! I'm having issues flashing! + +First, head to the [Compiling/Flashing FAQ Page](https://docs.qmk.fm/#/faq_build). There is a good deal of info there, and you'll find a bunch of solutions to common issues there. + +## Help, I have an issue that isn't covered by the links above + +Okay, that's fine. Then please check the [open issues in our GitHub](https://github.com/qmk/qmk_firmware/issues) to see if somebody is experiencing the same thing (make sure it's not just similar, but actually the same). + +If you can't find anything, then please open a [new issue](https://github.com/qmk/qmk_firmware/issues)! + +## What if I found a bug? + +Then please open an issue, and if you know how to fix it, open up a Pull Request on GitHub with the fix. + +## But `git` and `GitHub` are intimidating! + +Don't worry, we have some pretty nice [Guidelines](https://docs.qmk.fm/#/newbs_best_practices) on how to start using `git` and GitHub to make things easier to develop. + +Additionally, you can find additional `git` and GitHub related links [here](https://docs.qmk.fm/#/newbs_learn_more_resources). + +## I have a Keyboard that I want to add support for + +Awesome! Open up a Pull Request for it. We'll review the code, and merge it! + +### What if I want to do brand it with `QMK`? + +That's amazing! We would love to assist you with that! + +In fact, we have a [whol page](https://qmk.fm/powered/) dedicated to adding QMK Branding to your page and keyboard. This covers pretty much everything you need (knowledge and images) to officially support QMK. + +If you have any questions about this, open an issue or head to [Discord](https://discord.gg/Uq7gcHh). From b7b20cd9dfc8928b3c31560a410c75e9a9ec232a Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 26 Nov 2018 14:35:48 -0800 Subject: [PATCH 563/788] Revert "Add support for PR and Issue templates to QMK_firmware GitHub (#4491)" (#4492) This reverts commit b91dfa04e3bad560fb6fe2360dd51fb95d95fcbf. --- .github/ISSUE_TEMPLATE/bug_report.md | 27 -------------- .github/ISSUE_TEMPLATE/feature_request.md | 15 -------- .github/ISSUE_TEMPLATE/other_issues.md | 7 ---- .github/PULL_REQUEST_TEMPLATE.md | 22 ------------ docs/support.md | 43 ----------------------- 5 files changed, 114 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md delete mode 100644 .github/ISSUE_TEMPLATE/other_issues.md delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 docs/support.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index ed5d56ce3..000000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve the QMK Firmware ---- - -**Describe the bug** - -A clear and concise description of what the bug is. - -**System Information** - - Keyboard: - - Revision (if applicable): - - Operating System: - - avr-gcc version: - (Run `avr-gcc --version` to find out) - - arm gcc version: - (Run `arm-none-eabi-gcc --version` to find out) - - QMK Firmware version: - (you can run `git describe --abbrev=0 --tags` to find this out) - - Any keyboard related software installed? - - [ ] Auto Hot Key - - [ ] Karabiner - - [ ] Other - -**Additional context** - -Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index ac924b3ac..000000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -name: Feature request -about: Suggest a new feature or changes to existing features - ---- - -## Feature Request Type - -- [ ] Core Functionality -- [ ] Add-on hardware support (eg audio, rgb, oled screen, etc) -- [ ] Alteration (enhancement/optimization) of existing Feature(s) -- [ ] New behavior - -## Description -A few sentances describing what it is that you'd like to see. Additional information (such as links to spec sheets, licensing info, other related issues or PR's, etc) would be helpful. diff --git a/.github/ISSUE_TEMPLATE/other_issues.md b/.github/ISSUE_TEMPLATE/other_issues.md deleted file mode 100644 index 53481f9ab..000000000 --- a/.github/ISSUE_TEMPLATE/other_issues.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -name: Other issues -about: Anything else that doesn't fall into the above categories. - ---- - -Please check https://docs.qmk.fm/SUPPORT.md for additional resources first. If that doesn't answer your question, check the bug report option, as that may be more appropriate. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 36410da26..000000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,22 +0,0 @@ -## Code Change Type -- [ ] Core -- [ ] Feature -- [ ] Bugfix -- [ ] Keyboard -- [ ] Keymap/Layout/Userspace -- [ ] Enhancement/Optimization -- [ ] Documentation - -## Description -A few sentences describing the overall goals of the pull request's commits. - -## Todo -- [ ] Tests -- [ ] Documentation - -## Issues Fixed or Closed by this PR - -* - -## Long Description -If needed, a longer description and a list of changes should be added here to make it clear what exactly this PR's goals are. diff --git a/docs/support.md b/docs/support.md deleted file mode 100644 index 28894c2c3..000000000 --- a/docs/support.md +++ /dev/null @@ -1,43 +0,0 @@ -# Support - -If you need help with something, the best place to get quick support is going to be on our [Discord Server](https://discord.gg/Uq7gcHh). There is usually somebody online, and there are a bunch of very helpful people there. - -Don't forget to read our [Code of Conduct](https://qmk.fm/coc/). - -## Help! I don't know where to start! - -If this is the case, then you should start with our [Newbs Guide](https://docs.qmk.fm/#/newbs). There is a lot of great info there, and that should cover everything you need to get started. - -If that's an issue, hop onto the [QMK Configurator](https://config.qmk.fm), as that will handle a majority of what you need there. - -## Help! I'm having issues flashing! - -First, head to the [Compiling/Flashing FAQ Page](https://docs.qmk.fm/#/faq_build). There is a good deal of info there, and you'll find a bunch of solutions to common issues there. - -## Help, I have an issue that isn't covered by the links above - -Okay, that's fine. Then please check the [open issues in our GitHub](https://github.com/qmk/qmk_firmware/issues) to see if somebody is experiencing the same thing (make sure it's not just similar, but actually the same). - -If you can't find anything, then please open a [new issue](https://github.com/qmk/qmk_firmware/issues)! - -## What if I found a bug? - -Then please open an issue, and if you know how to fix it, open up a Pull Request on GitHub with the fix. - -## But `git` and `GitHub` are intimidating! - -Don't worry, we have some pretty nice [Guidelines](https://docs.qmk.fm/#/newbs_best_practices) on how to start using `git` and GitHub to make things easier to develop. - -Additionally, you can find additional `git` and GitHub related links [here](https://docs.qmk.fm/#/newbs_learn_more_resources). - -## I have a Keyboard that I want to add support for - -Awesome! Open up a Pull Request for it. We'll review the code, and merge it! - -### What if I want to do brand it with `QMK`? - -That's amazing! We would love to assist you with that! - -In fact, we have a [whol page](https://qmk.fm/powered/) dedicated to adding QMK Branding to your page and keyboard. This covers pretty much everything you need (knowledge and images) to officially support QMK. - -If you have any questions about this, open an issue or head to [Discord](https://discord.gg/Uq7gcHh). From edb6c98fd23ab102069037f3dbfbd46c6067e86a Mon Sep 17 00:00:00 2001 From: zvecr Date: Mon, 26 Nov 2018 22:58:22 +0000 Subject: [PATCH 564/788] Keyboard: Enable community ortho 4x12 layouts for lets split eh (#4487) * Enable ortho_4x12 community layouts for lets_split_eh * Keymap build fixes now that ortho_4x12 is enabled * Keymap build fixes now that ortho_4x12 is enabled --- .../lets_split_eh/keymaps/doxish_dvorak/keymap.c | 4 +--- keyboards/lets_split_eh/lets_split_eh.c | 15 +++++++++++++++ keyboards/lets_split_eh/rules.mk | 2 ++ 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/keyboards/lets_split_eh/keymaps/doxish_dvorak/keymap.c b/keyboards/lets_split_eh/keymaps/doxish_dvorak/keymap.c index 897608154..721312623 100644 --- a/keyboards/lets_split_eh/keymaps/doxish_dvorak/keymap.c +++ b/keyboards/lets_split_eh/keymaps/doxish_dvorak/keymap.c @@ -1,6 +1,4 @@ -#include "eeconfig.h" - -extern keymap_config_t keymap_config; +#include QMK_KEYBOARD_H // Each layer gets a name for readability, which is then used in the keymap matrix below. // The underscores don't mean anything - you can have a layer called STUFF or any other name. diff --git a/keyboards/lets_split_eh/lets_split_eh.c b/keyboards/lets_split_eh/lets_split_eh.c index d5a312085..7249f54cf 100644 --- a/keyboards/lets_split_eh/lets_split_eh.c +++ b/keyboards/lets_split_eh/lets_split_eh.c @@ -1 +1,16 @@ #include "lets_split_eh.h" + +#ifdef SWAP_HANDS_ENABLE +__attribute__ ((weak)) +const keypos_t hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = { + + {{0, 4}, {1, 4}, {2, 4}, {3, 4}, {4, 4}, {5, 4}}, + {{0, 5}, {1, 5}, {2, 5}, {3, 5}, {4, 5}, {5, 5}}, + {{0, 6}, {1, 6}, {2, 6}, {3, 6}, {4, 6}, {5, 6}}, + {{0, 7}, {1, 7}, {2, 7}, {3, 7}, {4, 7}, {5, 7}}, + {{0, 0}, {1, 0}, {2, 0}, {3, 0}, {4, 0}, {5, 0}}, + {{0, 1}, {1, 1}, {2, 1}, {3, 1}, {4, 1}, {5, 1}}, + {{0, 2}, {1, 2}, {2, 2}, {3, 2}, {4, 2}, {5, 2}}, + {{0, 3}, {1, 3}, {2, 3}, {3, 3}, {4, 3}, {5, 3}}, +}; +#endif diff --git a/keyboards/lets_split_eh/rules.mk b/keyboards/lets_split_eh/rules.mk index dffeb9fa3..99b1ba234 100644 --- a/keyboards/lets_split_eh/rules.mk +++ b/keyboards/lets_split_eh/rules.mk @@ -67,4 +67,6 @@ SPLIT_KEYBOARD = yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +LAYOUTS = ortho_4x12 + DEFAULT_FOLDER = lets_split_eh/eh From ecd21b44a8efd5c7241ebf48c65fc7b30134865f Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 26 Nov 2018 16:45:24 -0800 Subject: [PATCH 565/788] Update to drashna userspace and keymaps (#4459) * Fix reversed bool check in layer_state_set * Add Quefrency 65 for a friend * Add Ergodox EZ Glow keymap * Add RGB Matrix Code * Further changes to rgb matrix ErgoDox EZ * Update bjohnson keymaps * Fix CRKBD display * Overhaul to corne keyboard * Narrow scope for keylogger * Minor layout tweaks to Corne Keyboard * additional CRKBD tweaks * Minor tweaks to CRKBD * Add all characters for keylogger * Ergodox EZ Glow overhaul * Fix Ergodox EZ Glow layer colors * Increase Tapping Term for Corne Keyboard * Fix unicode-ish * Revert some changes * Add layer specific lighting effects * Some minor tweaks to ergodox glow config * revert changes to ergodox files * Update Glow readme * Add more tapping term defines * Fix changes * Fix ergodox keymap * Hopefully fix sleeping * Disable layer indications if rgb matrix is disabled * Add support for sleeping and rgb layer change toggle to ergodox ez glow * Make RGB Layer Indication Great Again * Make Unicode Great Again * Remove placeholder define Co-Authored-By: drashna * Remove placeholder define Co-Authored-By: drashna * Remove old EEPROM Reset keycode --- keyboards/crkbd/keymaps/drashna/config.h | 7 +- keyboards/crkbd/keymaps/drashna/keymap.c | 153 +++++++++++++----- keyboards/crkbd/keymaps/drashna/rules.mk | 8 +- keyboards/iris/keymaps/drashna/keymap.c | 2 +- keyboards/iris/keymaps/drashna/rules.mk | 2 +- keyboards/orthodox/keymaps/drashna/keymap.c | 2 +- keyboards/quefrency/keymaps/bjohnson/config.h | 41 +++++ keyboards/quefrency/keymaps/bjohnson/keymap.c | 33 ++++ keyboards/quefrency/keymaps/bjohnson/rules.mk | 22 +++ keyboards/viterbi/keymaps/drashna/keymap.c | 4 +- layouts/community/ergodox/drashna/keymap.c | 120 +++++++++++++- .../community/ergodox/drashna_glow/README.md | 1 + .../community/ergodox/drashna_glow/config.h | 11 ++ .../community/ergodox/drashna_glow/keymap.c | 67 ++++++++ .../community/ergodox/drashna_glow/rules.mk | 9 ++ layouts/community/ortho_4x12/drashna/keymap.c | 2 +- users/drashna/config.h | 4 +- users/drashna/drashna.c | 22 +-- users/drashna/drashna.h | 8 +- users/drashna/rgb_stuff.c | 86 +++++++--- users/drashna/rgb_stuff.h | 2 +- users/drashna/rules.mk | 17 ++ users/drashna/send_unicode.c | 54 +++++++ users/drashna/template.c | 7 - users/drashna/template.h | 4 +- 25 files changed, 576 insertions(+), 112 deletions(-) create mode 100644 keyboards/quefrency/keymaps/bjohnson/config.h create mode 100644 keyboards/quefrency/keymaps/bjohnson/keymap.c create mode 100644 keyboards/quefrency/keymaps/bjohnson/rules.mk create mode 100644 layouts/community/ergodox/drashna_glow/README.md create mode 100644 layouts/community/ergodox/drashna_glow/config.h create mode 100644 layouts/community/ergodox/drashna_glow/keymap.c create mode 100644 layouts/community/ergodox/drashna_glow/rules.mk diff --git a/keyboards/crkbd/keymaps/drashna/config.h b/keyboards/crkbd/keymaps/drashna/config.h index adfd79044..cbc3feeb6 100644 --- a/keyboards/crkbd/keymaps/drashna/config.h +++ b/keyboards/crkbd/keymaps/drashna/config.h @@ -41,5 +41,10 @@ along with this program. If not, see . #define RGBLIGHT_HUE_STEP 8 #define RGBLIGHT_SAT_STEP 8 #define RGBLIGHT_VAL_STEP 8 -#define RGBLIGHT_LIMIT_VAL 120 +#define RGBLIGHT_LIMIT_VAL 100 +#endif + +#ifdef AUDIO_ENABLE +#define B6_AUDIO +// #define NO_MUSIC_MODE #endif diff --git a/keyboards/crkbd/keymaps/drashna/keymap.c b/keyboards/crkbd/keymaps/drashna/keymap.c index 99dcdb4e1..282ee2572 100644 --- a/keyboards/crkbd/keymaps/drashna/keymap.c +++ b/keyboards/crkbd/keymaps/drashna/keymap.c @@ -26,10 +26,10 @@ enum crkbd_keycodes { K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A \ ) \ LAYOUT_wrapper( \ - KC_ESC, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, KC_BSPC, \ - KC_TAB, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, KC_QUOT, \ + KC_ESC, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, KC_MINS, \ + KC_TAB, ALT_T(K11), K12, K13, K14, K15, K16, K17, K18, K19, K1A, RGUI_T(KC_QUOT), \ OS_LSFT, CTL_T(K21), K22, K23, K24, K25, K26, K27, K28, K29, CTL_T(K2A), OS_RSFT, \ - LT(_LOWER,KC_GRV), KC_SPC, LALT_T(KC_BSPC), KC_DEL, KC_ENT, RAISE \ + LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE \ ) #define LAYOUT_crkbd_base_wrapper(...) LAYOUT_crkbd_base(__VA_ARGS__) @@ -66,14 +66,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [_LOWER] = LAYOUT_wrapper( - KC_TILD, _________________LOWER_L1__________________, _________________LOWER_R1__________________, KC_BSPC, - KC_F11, _________________LOWER_L2__________________, _________________LOWER_R2__________________, KC_PIPE, - KC_F12, _________________LOWER_L3__________________, _________________LOWER_R3__________________, _______, + KC_F11, _________________LOWER_L1__________________, _________________LOWER_R1__________________, KC_F11, + KC_F12, _________________LOWER_L2__________________, _________________LOWER_R2__________________, KC_PIPE, + _______, _________________LOWER_L3__________________, _________________LOWER_R3__________________, _______, _______, _______, _______, _______, _______, _______ ), [_RAISE] = LAYOUT_wrapper( \ - KC_GRV, _________________RAISE_L1__________________, _________________RAISE_R1__________________, KC_BSPC, + _______, _________________RAISE_L1__________________, _________________RAISE_R1__________________, _______, _______, _________________RAISE_L2__________________, _________________RAISE_R2__________________, KC_BSLS, _______, _________________RAISE_L3__________________, _________________RAISE_R3__________________, _______, _______, _______, _______, _______, _______, _______ @@ -81,18 +81,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_ADJUST] = LAYOUT_wrapper( \ KC_MAKE, _________________ADJUST_L1_________________, _________________ADJUST_R1_________________, KC_RESET, - VRSN, _________________ADJUST_L2_________________, _________________ADJUST_R2_________________, EPRM, - TG_MODS, _________________ADJUST_L3_________________, _________________ADJUST_R3_________________, KC_MPLY, - _______, _______, _______, _______, _______, _______ + VRSN, _________________ADJUST_L2_________________, _________________ADJUST_R2_________________, EEP_RST, + _______, _________________ADJUST_L3_________________, _________________ADJUST_R3_________________, KC_MPLY, + _______, _______, _______, KC_NUKE, TG_MODS, _______ ) }; -int RGB_current_mode; - void matrix_init_keymap(void) { - #ifdef RGBLIGHT_ENABLE - RGB_current_mode = rgblight_config.mode; - #endif //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h #ifdef SSD1306OLED iota_gfx_init(!has_usb()); // turns on the display @@ -102,53 +97,118 @@ void matrix_init_keymap(void) { PORTD &= ~(1<<5); DDRB &= ~(1<<0); - PORTB &= ~(1<<0);} + PORTB &= ~(1<<0); +} //SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h #ifdef SSD1306OLED // When add source files to SRC in rules.mk, you can use functions. -const char *read_layer_state(void); const char *read_logo(void); -void set_keylog(uint16_t keycode, keyrecord_t *record); -const char *read_keylog(void); -const char *read_keylogs(void); char layer_state_str[24]; +char modifier_state_str[24]; +char host_led_state_str[24]; +char keylog_str[24] = {}; +char keylogs_str[21] = {}; +int keylogs_str_idx = 0; + // const char *read_mode_icon(bool swap); -const char *read_host_led_state(void); // void set_timelog(void); // const char *read_timelog(void); +const char code_to_name[60] = { + ' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f', + 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', + 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', + '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', + 'R', 'E', 'B', 'T', '_', '-', '=', '[', ']', '\\', + '#', ';', '\'', '`', ',', '.', '/', ' ', ' ', ' '}; + +void set_keylog(uint16_t keycode, keyrecord_t *record) { + char name = ' '; + if (keycode < 60) { + name = code_to_name[keycode]; + } + + // update keylog + snprintf(keylog_str, sizeof(keylog_str), "%dx%d, k%2d : %c", + record->event.key.row, record->event.key.col, + keycode, name); + + // update keylogs + if (keylogs_str_idx == sizeof(keylogs_str) - 1) { + keylogs_str_idx = 0; + for (int i = 0; i < sizeof(keylogs_str) - 1; i++) { + keylogs_str[i] = ' '; + } + } + + keylogs_str[keylogs_str_idx] = name; + keylogs_str_idx++; +} + +const char *read_keylog(void) { + return keylog_str; +} + +const char *read_keylogs(void) { + return keylogs_str; +} + + +const char* read_modifier_state(void) { + uint8_t modifiers = get_mods(); + uint8_t one_shot = get_oneshot_mods(); + + snprintf(modifier_state_str, sizeof(modifier_state_str), "Mods:%s %s %s %s", + (modifiers & MODS_CTRL_MASK || one_shot & MODS_CTRL_MASK) ? "CTL" : " ", + (modifiers & MODS_GUI_MASK || one_shot & MODS_GUI_MASK) ? "GUI" : " ", + (modifiers & MODS_ALT_MASK || one_shot & MODS_ALT_MASK) ? "ALT" : " ", + (modifiers & MODS_SHIFT_MASK || one_shot & MODS_SHIFT_MASK) ? "SFT" : " " + ); + + return modifier_state_str; +} + +const char *read_host_led_state(void) { + uint8_t leds = host_keyboard_leds(); + + snprintf(host_led_state_str, sizeof(host_led_state_str), "NL:%s CL:%s SL:%s", + (leds & (1 << USB_LED_NUM_LOCK)) ? "on" : "- ", + (leds & (1 << USB_LED_CAPS_LOCK)) ? "on" : "- ", + (leds & (1 << USB_LED_SCROLL_LOCK)) ? "on" : "- " + ); + + return host_led_state_str; +} const char* read_layer_state(void) { - switch (layer_state) { - case _QWERTY: - switch (default_layer_state) { + switch (biton32(layer_state)) { + case _RAISE: + snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Raise "); + break; + case _LOWER: + snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Lower "); + break; + case _ADJUST: + snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Adjust "); + break; + default: + switch (biton32(default_layer_state)) { case _QWERTY: - snprintf(layer_state_str, sizeof(layer_state_str), "Layer: QWERTY"); + snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Qwerty "); break; case _COLEMAK: snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Colemak"); break; case _DVORAK: - snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Dvorak"); + snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Dvorak "); break; case _WORKMAN: snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Workman"); break; } break; - case _RAISE: - snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Raise"); - break; - case _LOWER: - snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Lower"); - break; - case _ADJUST: - snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Adjust"); - break; - default: - snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Undef-%ld", layer_state); } return layer_state_str; @@ -160,12 +220,13 @@ void matrix_scan_keymap(void) { void matrix_render_user(struct CharacterMatrix *matrix) { if (is_master) { - // If you want to change the display of OLED, you need to change here + //If you want to change the display of OLED, you need to change here matrix_write_ln(matrix, read_layer_state()); - matrix_write_ln(matrix, read_keylog()); + matrix_write_ln(matrix, read_modifier_state()); + // matrix_write_ln(matrix, read_keylog()); matrix_write_ln(matrix, read_keylogs()); - //matrix_write_ln(matrix, read_mode_icon(keymap_config.swap_lalt_lgui)); - matrix_write_ln(matrix, read_host_led_state()); + // matrix_write_ln(matrix, read_mode_icon(keymap_config.swap_lalt_lgui)); + matrix_write(matrix, read_host_led_state()); //matrix_write_ln(matrix, read_timelog()); } else { matrix_write(matrix, read_logo()); @@ -187,8 +248,14 @@ void iota_gfx_task_user(void) { } bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { - if (record->event.pressed) { - set_keylog(keycode, record); + switch (keycode) { + case KC_A ... KC_SLASH: + case KC_F1 ... KC_F12: + case KC_INSERT ... KC_UP: + case KC_KP_SLASH ... KC_KP_DOT: + case KC_F13 ... KC_F24: + if (record->event.pressed) { set_keylog(keycode, record); } + break; // set_timelog(); } return true; diff --git a/keyboards/crkbd/keymaps/drashna/rules.mk b/keyboards/crkbd/keymaps/drashna/rules.mk index ccf8e2b7c..4b70f66f7 100644 --- a/keyboards/crkbd/keymaps/drashna/rules.mk +++ b/keyboards/crkbd/keymaps/drashna/rules.mk @@ -20,12 +20,14 @@ SWAP_HANDS_ENABLE = no # Enable one-hand typing # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +BOOTLOADER = qmk-dfu + # If you want to change the display of OLED, you need to change here SRC += ./lib/glcdfont.c \ ./lib/rgb_state_reader.c \ ./lib/logo_reader.c \ - ./lib/keylogger.c \ - ./lib/host_led_state_reader.c \ - # ./lib/layer_state_reader.c \ + # ./lib/keylogger.c \ + # ./lib/host_led_state_reader.c \ # ./lib/mode_icon_reader.c \ + # ./lib/layer_state_reader.c \ # ./lib/timelogger.c \ diff --git a/keyboards/iris/keymaps/drashna/keymap.c b/keyboards/iris/keymaps/drashna/keymap.c index 21e3151c0..ba6f18edd 100644 --- a/keyboards/iris/keymaps/drashna/keymap.c +++ b/keyboards/iris/keymaps/drashna/keymap.c @@ -79,7 +79,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_ADJUST] = LAYOUT_wrapper( KC_MAKE, _______, _______, _______, _______, _______, _________________ADJUST_R1_________________, KC_RST, - VRSN, _________________ADJUST_L1_________________, KC_NUKE, _______, _______, _______, _______, EPRM, + VRSN, _________________ADJUST_L1_________________, KC_NUKE, _______, _______, _______, _______, EEP_RST, _______, _________________ADJUST_L2_________________, _________________ADJUST_R2_________________, TG_MODS, _______, _________________ADJUST_L3_________________, TG_GAME, _______, _________________ADJUST_R3_________________, KC_MPLY, _______, _______, _______, _______, _______, _______ diff --git a/keyboards/iris/keymaps/drashna/rules.mk b/keyboards/iris/keymaps/drashna/rules.mk index 89e568f39..ccc33c06f 100644 --- a/keyboards/iris/keymaps/drashna/rules.mk +++ b/keyboards/iris/keymaps/drashna/rules.mk @@ -8,7 +8,7 @@ RGBLIGHT_ENABLE = yes AUDIO_ENABLE = yes NKRO_ENABLE = yes BACKLIGHT_ENABLE = no -SWAP_HANDS_ENABLE = yes +SWAP_HANDS_ENABLE = no INDICATOR_LIGHTS = yes MACROS_ENABLED = no diff --git a/keyboards/orthodox/keymaps/drashna/keymap.c b/keyboards/orthodox/keymaps/drashna/keymap.c index 545ad25dc..346ca4f12 100644 --- a/keyboards/orthodox/keymaps/drashna/keymap.c +++ b/keyboards/orthodox/keymaps/drashna/keymap.c @@ -91,7 +91,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_ADJUST] = LAYOUT_wrapper(\ KC_MAKE, _________________ADJUST_L1_________________, _________________ADJUST_R1_________________, KC_RESET, - VRSN, _________________ADJUST_L2_________________, _______, _______, _______, KC_NUKE, _________________ADJUST_R2_________________, EPRM, + VRSN, _________________ADJUST_L2_________________, _______, _______, _______, KC_NUKE, _________________ADJUST_R2_________________, EEP_RST, TG_MODS, _________________ADJUST_L3_________________, _______, _______, _______, _______, _______, _______, _________________ADJUST_R3_________________, KC_MPLY ) }; diff --git a/keyboards/quefrency/keymaps/bjohnson/config.h b/keyboards/quefrency/keymaps/bjohnson/config.h new file mode 100644 index 000000000..37c6d6672 --- /dev/null +++ b/keyboards/quefrency/keymaps/bjohnson/config.h @@ -0,0 +1,41 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert +Copyright 2018 Danny Nguyen + +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 . +*/ + +#pragma once + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +#define TAPPING_TERM 500 + +#define IGNORE_MOD_TAP_INTERRUPT +#define PERMISSIVE_HOLD +#define FORCE_NKRO +#define RETRO_TAPPING + +#define TAPPING_TOGGLE 1 + +#define NO_ACTION_MACRO +#define NO_ACTION_FUNCTION + +#define RGBLIGHT_SLEEP diff --git a/keyboards/quefrency/keymaps/bjohnson/keymap.c b/keyboards/quefrency/keymaps/bjohnson/keymap.c new file mode 100644 index 000000000..434a0a305 --- /dev/null +++ b/keyboards/quefrency/keymaps/bjohnson/keymap.c @@ -0,0 +1,33 @@ +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _BASE 0 +#define _FN1 1 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, +}; + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE] = LAYOUT_65( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, XXXXXXX, KC_BSPC, KC_HOME, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_END, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_DEL, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_INS, \ + KC_LCTL, KC_LGUI, KC_LALT, LT(_FN1,KC_SPC),KC_SPC, KC_SPC, XXXXXXX, KC_RALT, KC_RGUI, XXXXXXX, KC_APP, KC_RCTL, TT(_FN1) + ), + + [_FN1] = LAYOUT_65( + KC_TILD, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, KC_BSPC, KC_PGUP, \ + _______, _______, KC_UP, _______, _______, _______, _______, KC_P7, KC_P8, KC_P9, _______, _______, _______, _______, KC_PGDN, \ + _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, KC_P4, KC_P5, KC_P6, _______, _______, _______, _______, \ + _______, RGB_MOD, RGB_HUI, RGB_HUD, _______, _______, _______, KC_P1, KC_P2, KC_P3, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, KC_P0, XXXXXXX, _______, _______, XXXXXXX, _______, _______, _______ + ) +}; diff --git a/keyboards/quefrency/keymaps/bjohnson/rules.mk b/keyboards/quefrency/keymaps/bjohnson/rules.mk new file mode 100644 index 000000000..70fa71100 --- /dev/null +++ b/keyboards/quefrency/keymaps/bjohnson/rules.mk @@ -0,0 +1,22 @@ +BOOTLOADER = atmel-dfu + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = yes # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +SPLIT_KEYBOARD = yes diff --git a/keyboards/viterbi/keymaps/drashna/keymap.c b/keyboards/viterbi/keymaps/drashna/keymap.c index acda8a0d2..a34320519 100644 --- a/keyboards/viterbi/keymaps/drashna/keymap.c +++ b/keyboards/viterbi/keymaps/drashna/keymap.c @@ -60,7 +60,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_MEDIA] = LAYOUT_ortho_5x7( KC_MAKE, KC_RESET,MU_TOG, AU_ON, AU_OFF, CK_TOGG, RGB_SAD, - MEDIA, EPRM, KC_RGB_T,RGB_M_P, RGB_M_B, RGB_M_R, RGB_SAI, + MEDIA, EEP_RST, KC_RGB_T,RGB_M_P, RGB_M_B, RGB_M_R, RGB_SAI, RGB_TOG, RGB_MOD, RGB_RMOD,RGB_M_SW,RGB_M_SN,RGB_M_K, RGB_HUD, KC_MPLY, KC_MPRV, KC_MNXT, RGB_M_X, RGB_M_G, RGB_M_P, RGB_HUI, KC_MUTE, KC_VOLD, KC_VOLU, XXXXXXX, XXXXXXX, RGB_VAD, RGB_VAI @@ -94,5 +94,3 @@ void matrix_init_keymap(void) { DDRB &= ~(1<<0); PORTB &= ~(1<<0); } - - diff --git a/layouts/community/ergodox/drashna/keymap.c b/layouts/community/ergodox/drashna/keymap.c index 360a2d9c6..df9be62b7 100644 --- a/layouts/community/ergodox/drashna/keymap.c +++ b/layouts/community/ergodox/drashna/keymap.c @@ -20,8 +20,13 @@ along with this program. If not, see . #ifdef UNICODEMAP_ENABLE #include "drashna_unicode.h" #endif // UNICODEMAP_ENABLE +extern uint8_t input_mode; - +#ifdef RGB_MATRIX_ENABLE +extern bool g_suspend_state; +extern rgb_config_t rgb_matrix_config; +#endif +extern userspace_config_t userspace_config; //enum more_custom_keycodes { // KC_P00 = NEW_SAFE_RANGE @@ -40,7 +45,7 @@ bool skip_leds = false; KC_TAB, K01, K02, K03, K04, K05, TG(_DIABLO), TG(_DIABLO), K06, K07, K08, K09, K0A, KC_BSLS, \ KC_C1R3, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, KC_QUOT, \ KC_MLSF, CTL_T(K21), K22, K23, K24, K25, TG(_GAMEPAD), TG(_GAMEPAD), K26, K27, K28, K29, CTL_T(K2A), KC_MRSF, \ - KC_GRV, OSM(MOD_MEH),OSM(MOD_LGUI),KC_LBRC, KC_RBRC, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, UC_SHRG, \ + KC_GRV, OS_MEH, OS_HYPR, KC_LBRC, KC_RBRC, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, UC(0x2E2E), \ OS_LALT, OS_LGUI, OS_RGUI, CTL_T(KC_ESCAPE), \ KC_HOME, KC_PGUP, \ LT(_LOWER, KC_SPACE),KC_BSPC, KC_END, KC_PGDN, KC_DEL, LT(_RAISE, KC_ENTER) \ @@ -198,7 +203,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_GAMEPAD] = LAYOUT_ergodox_pretty_wrapper( KC_ESC, KC_NO, KC_1, KC_2, KC_3, HYPR(KC_Q), HYPR(KC_GRV), KC_TRNS, KC_F9, KC_F10, KC_F11, KC_F12, KC_NO, KC_NO, - KC_F1, KC_K, KC_Q, KC_W, KC_E, KC_R, KC_T, UC_SHRG, UC_DISA, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_F1, KC_K, KC_Q, KC_W, KC_E, KC_R, KC_T, UC_SHRG, UC_DISA, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TAB, KC_G, KC_A, KC_S, KC_D, KC_F, KC_I, KC_O, KC_NO, KC_NO, KC_NO, KC_NO, KC_LCTL, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_TRNS, TG(_GAMEPAD), KC_N, KC_M, KC_NO, KC_NO, KC_NO, KC_NO, KC_GRV, KC_U, KC_I, KC_Y, KC_T, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_NO, @@ -263,7 +268,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_ADJUST] = LAYOUT_ergodox_pretty_wrapper( KC_MAKE, _______, _______, _______, _______, _______, _______, KC_NUKE, _________________ADJUST_R1_________________, KC_RST, - VRSN, _________________ADJUST_L1_________________, _______, _______, _______, _______, _______, _______, _______, EPRM, + VRSN, _________________ADJUST_L1_________________, _______, _______, _______, _______, _______, _______, _______, EEP_RST, _______, _________________ADJUST_L2_________________, _________________ADJUST_R2_________________, TG(_MODS), _______, _________________ADJUST_L3_________________, _______, _______, _________________ADJUST_R3_________________, KC_MPLY, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, @@ -290,10 +295,6 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { return true; } -void matrix_init_keymap(void) { // Runs boot tasks for keyboard -}; - - void matrix_scan_keymap(void) { // runs frequently to update info uint8_t modifiers = get_mods(); uint8_t led_usb_state = host_keyboard_leds(); @@ -335,3 +336,106 @@ bool indicator_is_this_led_used_keyboard(uint8_t index) { return false; } } + + +#ifdef RGB_MATRIX_ENABLE + +void suspend_power_down_keymap(void) { + rgb_matrix_set_suspend_state(true); + rgb_matrix_config.enable = false; +} + +void suspend_wakeup_init_keymap(void) { + rgb_matrix_config.enable = true; + rgb_matrix_set_suspend_state(false); +} + +void rgb_matrix_layer_helper (uint8_t red, uint8_t green, uint8_t blue) { + rgb_led led; + for (int i = 0; i < DRIVER_LED_TOTAL; i++) { + led = g_rgb_leds[i]; + if (led.matrix_co.raw < 0xFF) { + if (led.modifier) { + rgb_matrix_set_color( i, red, green, blue ); + } + } + } +} + +void rgb_matrix_indicators_user(void) { + if (g_suspend_state || !rgb_matrix_config.enable || !userspace_config.rgb_layer_change) return; + + switch (biton32(layer_state)) { + case _MODS: + rgb_matrix_layer_helper(0xFF, 0xFF, 0x00); break; + case _GAMEPAD: + rgb_matrix_layer_helper(0xFF, 0x80, 0x00); + rgb_matrix_set_color(32, 0x00, 0xFF, 0x00); // Q + rgb_matrix_set_color(31, 0x00, 0xFF, 0xFF); // W + rgb_matrix_set_color(30, 0xFF, 0x00, 0x00); // E + rgb_matrix_set_color(29, 0xFF, 0x80, 0x00); // R + rgb_matrix_set_color(37, 0x00, 0xFF, 0xFF); // A + rgb_matrix_set_color(36, 0x00, 0xFF, 0xFF); // S + rgb_matrix_set_color(35, 0x00, 0xFF, 0xFF); // D + rgb_matrix_set_color(34, 0x7A, 0x00, 0xFF); // F + + rgb_matrix_set_color(27, 0xFF, 0xFF, 0xFF); // 1 + rgb_matrix_set_color(26, 0x00, 0xFF, 0x00); // 2 + rgb_matrix_set_color(25, 0x7A, 0x00, 0xFF); // 3 + + break; + case _DIABLO: + rgb_matrix_layer_helper(0xFF, 0x00, 0x00); break; + case _RAISE: + rgb_matrix_layer_helper(0xFF, 0xFF, 0x00); break; + case _LOWER: + rgb_matrix_layer_helper(0x00, 0xFF, 0x00); break; + case _ADJUST: + rgb_matrix_layer_helper(0xFF, 0x00, 0x00); break; + default: + switch (biton32(default_layer_state)) { + case _QWERTY: + rgb_matrix_layer_helper(0x00, 0xFF, 0xFF); break; + case _COLEMAK: + rgb_matrix_layer_helper(0xFF, 0x00, 0xFF); break; + case _DVORAK: + rgb_matrix_layer_helper(0x00, 0xFF, 0x00); break; + case _WORKMAN: + rgb_matrix_layer_helper(0xD9, 0xA5, 0x21); break; + } + } +#if 0 + if (this_mod & MODS_SHIFT_MASK || this_led & (1<event.pressed) { - eeconfig_init(); - } - break; case VRSN: // Prints firmware version if (record->event.pressed) { send_string_with_delay_P(PSTR(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION ", Built on: " QMK_BUILDDATE), MACRO_TIMER); @@ -392,7 +390,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { #endif } return process_record_keymap(keycode, record) && -#ifdef RGBLIGHT_ENABLE +#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE) process_record_user_rgb(keycode, record) && #endif // RGBLIGHT_ENABLE process_record_secrets(keycode, record); @@ -413,7 +411,11 @@ uint32_t layer_state_set_user(uint32_t state) { uint32_t default_layer_state_set_user(uint32_t state) { - return default_layer_state_set_keymap(state); + state = default_layer_state_set_keymap(state); +#ifdef RGBLIGHT_ENABLE + state = default_layer_state_set_rgb(state); +#endif // RGBLIGHT_ENABLE + return state; } diff --git a/users/drashna/drashna.h b/users/drashna/drashna.h index 573cb26fd..06e726714 100644 --- a/users/drashna/drashna.h +++ b/users/drashna/drashna.h @@ -73,6 +73,8 @@ typedef union { }; } userspace_config_t; +extern userspace_config_t userspace_config; + #if defined(KEYMAP_SAFE_RANGE) #define PLACEHOLDER_SAFE_RANGE KEYMAP_SAFE_RANGE #else @@ -80,8 +82,7 @@ typedef union { #endif enum userspace_custom_keycodes { - EPRM = PLACEHOLDER_SAFE_RANGE, // Resets EEPROM do defaults (as in eeconfig_init) - VRSN, // Prints QMK Firmware and board info + VRSN = PLACEHOLDER_SAFE_RANGE, // Prints QMK Firmware and board info KC_QWERTY, // Sets default layer to QWERTY KC_COLEMAK, // Sets default layer to COLEMAK KC_DVORAK, // Sets default layer to DVORAK @@ -159,6 +160,9 @@ enum userspace_custom_keycodes { #define OS_RCTL OSM(MOD_RCTL) #define OS_LALT OSM(MOD_LALT) #define OS_RALT OSM(MOD_RALT) +#define OS_MEH OSM(MOD_MEH) +#define OS_HYPR OSM(MOD_HYPR) + #define ALT_APP ALT_T(KC_APP) #define MG_NKRO MAGIC_TOGGLE_NKRO diff --git a/users/drashna/rgb_stuff.c b/users/drashna/rgb_stuff.c index b6de4d39e..d238c2065 100644 --- a/users/drashna/rgb_stuff.c +++ b/users/drashna/rgb_stuff.c @@ -2,8 +2,11 @@ #include "rgb_stuff.h" #include "eeprom.h" +#if defined(RGBLIGHT_ENABLE) extern rgblight_config_t rgblight_config; -extern userspace_config_t userspace_config; +#elif defined(RGB_MATRIX_ENABLE) +extern rgb_config_t rgb_matrix_config; +#endif #ifdef RGBLIGHT_ENABLE void rgblight_sethsv_default_helper(uint8_t index) { @@ -209,7 +212,7 @@ bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) { return true; break; #endif // RGBLIGHT_TWINKLE case KC_RGB_T: // This allows me to use underglow as layer indication, or as normal -#ifdef RGBLIGHT_ENABLE +#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE) if (record->event.pressed) { userspace_config.rgb_layer_change ^= 1; xprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change); @@ -237,24 +240,25 @@ bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) { -void matrix_init_rgb(void) { + void matrix_init_rgb(void) { - if (userspace_config.rgb_layer_change) { - rgblight_init(); - rgblight_enable_noeeprom(); - switch (biton32(eeconfig_read_default_layer())) { - case _COLEMAK: - rgblight_sethsv_noeeprom_magenta(); break; - case _DVORAK: - rgblight_sethsv_noeeprom_springgreen(); break; - case _WORKMAN: - rgblight_sethsv_noeeprom_goldenrod(); break; - default: - rgblight_sethsv_noeeprom_cyan(); break; - } - rgblight_mode(RGBLIGHT_MODE_STATIC_LIGHT); - } -} +// #ifdef RGBLIGHT_ENABLE +// if (userspace_config.rgb_layer_change) { +// rgblight_enable_noeeprom(); +// switch (biton32(eeconfig_read_default_layer())) { +// case _COLEMAK: +// rgblight_sethsv_noeeprom_magenta(); break; +// case _DVORAK: +// rgblight_sethsv_noeeprom_springgreen(); break; +// case _WORKMAN: +// rgblight_sethsv_noeeprom_goldenrod(); break; +// default: +// rgblight_sethsv_noeeprom_cyan(); break; +// } +// rgblight_mode(RGBLIGHT_MODE_STATIC_LIGHT); +// } +// #endif + } void matrix_scan_rgb(void) { #ifdef RGBLIGHT_TWINKLE @@ -270,7 +274,6 @@ void matrix_scan_rgb(void) { uint32_t layer_state_set_rgb(uint32_t state) { #ifdef RGBLIGHT_ENABLE - static bool has_ran; if (userspace_config.rgb_layer_change) { switch (biton32(state)) { case _MACROS: @@ -312,12 +315,7 @@ uint32_t layer_state_set_rgb(uint32_t state) { default: rgblight_sethsv_noeeprom_cyan(); break; } - if (has_ran) { - biton32(state) == _MODS ? rgblight_mode(RGBLIGHT_MODE_BREATHING) : rgblight_mode(RGBLIGHT_MODE_STATIC_LIGHT); // if _MODS layer is on, then breath to denote it - } else { - biton32(state) == _MODS ? rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING) : rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT); // if _MODS layer is on, then breath to denote it - has_ran = true; - } + biton32(state) == _MODS ? rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING) : rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT); // if _MODS layer is on, then breath to denote it break; } // layer_state_set_indicator(); // Runs every scan, so need to call this here .... since I can't get it working "right" anyhow @@ -326,3 +324,39 @@ uint32_t layer_state_set_rgb(uint32_t state) { return state; } + +uint32_t default_layer_state_set_rgb(uint32_t state) { +#ifdef RGBLIGHT_ENABLE + if (userspace_config.rgb_layer_change) { + rgblight_config_t temp_rgblight_config = rgblight_config; + switch (biton32(state)) { + case _COLEMAK: + temp_rgblight_config.hue = 300; + temp_rgblight_config.val = 255; + temp_rgblight_config.sat = 255; + temp_rgblight_config.mode = 1; + break; + case _DVORAK: + temp_rgblight_config.hue = 150; + temp_rgblight_config.val = 255; + temp_rgblight_config.sat = 255; + temp_rgblight_config.mode = 1; + case _WORKMAN: + temp_rgblight_config.hue = 43; + temp_rgblight_config.val = 218; + temp_rgblight_config.sat = 218; + temp_rgblight_config.mode = 1; + default: + temp_rgblight_config.hue = 180; + temp_rgblight_config.val = 255; + temp_rgblight_config.sat = 255; + temp_rgblight_config.mode = 1; + } + if (temp_rgblight_config.raw != eeconfig_read_rgblight()) { + xprintf("rgblight set default layer hsv [EEPROM]: %u,%u,%u,%u\n", temp_rgblight_config.hue, temp_rgblight_config.sat, temp_rgblight_config.val, temp_rgblight_config.mode); + eeconfig_update_rgblight(temp_rgblight_config.raw); + } + } +#endif // RGBLIGHT_ENABLE + return state; +} diff --git a/users/drashna/rgb_stuff.h b/users/drashna/rgb_stuff.h index 50c75c8c3..3db068a31 100644 --- a/users/drashna/rgb_stuff.h +++ b/users/drashna/rgb_stuff.h @@ -12,4 +12,4 @@ void scan_rgblight_fadeout(void); void matrix_init_rgb(void); void matrix_scan_rgb(void); uint32_t layer_state_set_rgb(uint32_t state); - +uint32_t default_layer_state_set_rgb(uint32_t state); diff --git a/users/drashna/rules.mk b/users/drashna/rules.mk index 964c96c52..49b1ddae9 100644 --- a/users/drashna/rules.mk +++ b/users/drashna/rules.mk @@ -27,6 +27,11 @@ ifeq ($(strip $(RGBLIGHT_ENABLE)), yes) endif endif +ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes) + SRC += rgb_stuff.c +endif + + ifeq ($(strip $(MACROS_ENABLED)), yes) OPT_DEFS += -DMACROS_ENABLED endif @@ -37,3 +42,15 @@ ifdef CONSOLE_ENABLE endif endif + +ifeq ($(strip $(UCIS_ENABLE)), yes) + SRC += send_unicode.c +endif + +ifeq ($(strip $(UNICODEMAP_ENABLE)), yes) + SRC += send_unicode.c +endif + +ifeq ($(strip $(UNICODE_ENABLE)), yes) + SRC += send_unicode.c +endif diff --git a/users/drashna/send_unicode.c b/users/drashna/send_unicode.c index cacfe1dc8..ff35368da 100644 --- a/users/drashna/send_unicode.c +++ b/users/drashna/send_unicode.c @@ -56,3 +56,57 @@ void send_unicode_hex_string(const char* str) { // If you need a good converter: https://r12a.github.io/app-conversion/ +uint8_t saved_mods; + +void unicode_input_start (void) { + // save current mods + saved_mods = get_mods(); // Save current mods + clear_mods(); // Unregister mods to start from a clean state + + switch(get_unicode_input_mode()) { + case UC_OSX: + register_code(KC_LALT); + break; + case UC_OSX_RALT: + register_code(KC_RALT); + break; + case UC_LNX: + register_code(KC_LCTL); + register_code(KC_LSFT); + register_code(KC_U); + unregister_code(KC_U); + unregister_code(KC_LSFT); + unregister_code(KC_LCTL); + break; + case UC_WIN: + register_code(KC_LALT); + register_code(KC_PPLS); + unregister_code(KC_PPLS); + break; + case UC_WINC: + register_code(KC_RALT); + unregister_code(KC_RALT); + register_code(KC_U); + unregister_code(KC_U); + break; + } + wait_ms(UNICODE_TYPE_DELAY); +} + +void unicode_input_finish (void) { + switch(get_unicode_input_mode()) { + case UC_OSX: + case UC_WIN: + unregister_code(KC_LALT); + break; + case UC_OSX_RALT: + unregister_code(KC_RALT); + break; + case UC_LNX: + register_code(KC_SPC); + unregister_code(KC_SPC); + break; + } + + set_mods(saved_mods); // Reregister previously set mods +} diff --git a/users/drashna/template.c b/users/drashna/template.c index e6b50c961..0e188f3a5 100644 --- a/users/drashna/template.c +++ b/users/drashna/template.c @@ -50,12 +50,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { return false; break; - case EPRM: - if (record->event.pressed) { - eeconfig_init(); - } - return false; - break; case VRSN: if (record->event.pressed) { SEND_STRING(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); @@ -128,4 +122,3 @@ void shutdown_keymap(void) {} void shutdown_user (void) { shutdown_keymap(); } - diff --git a/users/drashna/template.h b/users/drashna/template.h index 5b3a93de5..dd1c48760 100644 --- a/users/drashna/template.h +++ b/users/drashna/template.h @@ -9,9 +9,7 @@ #define BASE 0 enum custom_keycodes { - PLACEHOLDER = SAFE_RANGE, // can always be here - EPRM, - VRSN, + VRSN = SAFE_RANGE, // can always be here KC_MAKE, KC_RESET, NEWPLACEHOLDER //use "NEWPLACEHOLDER for keymap specific codes From bada74e2a10224849719d1caa1dff8493cf39c58 Mon Sep 17 00:00:00 2001 From: Joe Wasson Date: Mon, 26 Nov 2018 17:39:29 -0800 Subject: [PATCH 566/788] Keymap: Fix build errors for non-Zeal boards. (#4496) --- users/talljoe/talljoe.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/users/talljoe/talljoe.c b/users/talljoe/talljoe.c index e72dc6c3e..345b5604b 100644 --- a/users/talljoe/talljoe.c +++ b/users/talljoe/talljoe.c @@ -108,7 +108,9 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { extern backlight_config g_config; #endif bool process_record_user(uint16_t keycode, keyrecord_t *record) { +#ifdef ZEAL_RGB static uint8_t last_effect; +#endif #ifdef RGBLIGHT_ENABLE static uint32_t savedRgbMode; From 952a30ef345e05051f62fa39960f88475817821d Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Mon, 26 Nov 2018 20:57:15 -0800 Subject: [PATCH 567/788] handwired/arrow_pad Refactor and Configurator support (#4498) * handwired/arrow_pad: layout macro and keymap refactor - Layout macros moved from the keymaps to arrow_pad.h. - LAYOUT_pad21 refactored to only accept keys that are physical present (no KC_NO entries required in keymap) - Keymaps now use #include QMK_KEYBOARD_H - Keymaps refactored to use process_record_user function (from action_get_macro) * handwired/arrow_pad: Readme cleanup Fixed the make commands and updated the layout macro. * handwired/arrow_pad: Configurator support --- keyboards/handwired/arrow_pad/arrow_pad.h | 30 ++++ keyboards/handwired/arrow_pad/info.json | 62 +++++++ .../arrow_pad/keymaps/default/keymap.c | 146 ++++++---------- .../arrow_pad/keymaps/pad_21/keymap.c | 165 +++++++----------- .../arrow_pad/keymaps/pad_24/keymap.c | 146 ++++++---------- keyboards/handwired/arrow_pad/readme.md | 12 +- 6 files changed, 265 insertions(+), 296 deletions(-) create mode 100644 keyboards/handwired/arrow_pad/info.json diff --git a/keyboards/handwired/arrow_pad/arrow_pad.h b/keyboards/handwired/arrow_pad/arrow_pad.h index 62882b9b5..b93fd113f 100644 --- a/keyboards/handwired/arrow_pad/arrow_pad.h +++ b/keyboards/handwired/arrow_pad/arrow_pad.h @@ -10,4 +10,34 @@ #include #include +// This is the 21-key keypad to 4x6 element matrix mapping +#define LAYOUT( \ + KM_ESC, KM_TAB, KM_BSL, KM_ARR, \ + KM_NUM, KM_FSL, KM_AST, KM_MIN, \ + KM___7, KM___8, KM___9, KM_EQU, \ + KM___4, KM___5, KM___6, KM_PLS, \ + KM___1, KM___2, KM___3, ___ENT, \ + KM___0, _____0, KM_DOT, KM_ENT \ +) { \ + { KM_ESC, KM_TAB, KM_BSL, KM_ARR }, \ + { KM_NUM, KM_FSL, KM_AST, KM_MIN }, \ + { KM___7, KM___8, KM___9, KM_EQU }, \ + { KM___4, KM___5, KM___6, KM_PLS }, \ + { KM___1, KM___2, KM___3, KC_NO }, \ + { KM___0, KC_NO, KM_DOT, KM_ENT } \ +} + +// This is the 21-key keypad to 2x11 element matrix mapping +#define LAYOUT_pad21( \ + KM_ESC, KM_TAB, KM_BSL, KM_ARR, \ + KM_NUM, KM_FSL, KM_AST, KM_MIN, \ + KM___7, KM___8, KM___9, \ + KM___4, KM___5, KM___6, KM_PLS, \ + KM___1, KM___2, KM___3, \ + KM___0, KM_DOT, KM_ENT \ +) { \ + { KM_ESC, KM_TAB, KM_BSL, KM_ARR, KM___7, KM___8, KM___9, KM_PLS, KM___1, KM___2, KM___3, }, \ + { KM_NUM, KM_FSL, KM_AST, KM_MIN, KM___4, KM___5, KM___6, KM_ENT, KC_NO, KM___0, KM_DOT, }, \ +} + #endif diff --git a/keyboards/handwired/arrow_pad/info.json b/keyboards/handwired/arrow_pad/info.json new file mode 100644 index 000000000..ad15e8e74 --- /dev/null +++ b/keyboards/handwired/arrow_pad/info.json @@ -0,0 +1,62 @@ +{ + "keyboard_name": "arrow_pad", + "url": "", + "maintainer": "qmk", + "width": 4, + "height": 6, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"KM_ESC", "x":0, "y":0}, + {"label":"KM_TAB", "x":1, "y":0}, + {"label":"KM_BSL", "x":2, "y":0}, + {"label":"KM_ARR", "x":3, "y":0}, + {"label":"KM_NUM", "x":0, "y":1}, + {"label":"KM_FSL", "x":1, "y":1}, + {"label":"KM_AST", "x":2, "y":1}, + {"label":"KM_MIN", "x":3, "y":1}, + {"label":"KM___7", "x":0, "y":2}, + {"label":"KM___8", "x":1, "y":2}, + {"label":"KM___9", "x":2, "y":2}, + {"label":"KM_EQU", "x":3, "y":2}, + {"label":"KM___4", "x":0, "y":3}, + {"label":"KM___5", "x":1, "y":3}, + {"label":"KM___6", "x":2, "y":3}, + {"label":"KM_PLS", "x":3, "y":3}, + {"label":"KM___1", "x":0, "y":4}, + {"label":"KM___2", "x":1, "y":4}, + {"label":"KM___3", "x":2, "y":4}, + {"label":"___ENT", "x":3, "y":4}, + {"label":"KM___0", "x":0, "y":5}, + {"label":"_____0", "x":1, "y":5}, + {"label":"KM_DOT", "x":2, "y":5}, + {"label":"KM_ENT", "x":3, "y":5} + ] + }, + "LAYOUT_pad21": { + "layout": [ + {"label":"KM_ESC", "x":0, "y":0}, + {"label":"KM_TAB", "x":1, "y":0}, + {"label":"KM_BSL", "x":2, "y":0}, + {"label":"KM_ARR", "x":3, "y":0}, + {"label":"KM_NUM", "x":0, "y":1}, + {"label":"KM_FSL", "x":1, "y":1}, + {"label":"KM_AST", "x":2, "y":1}, + {"label":"KM_MIN", "x":3, "y":1}, + {"label":"KM___7", "x":0, "y":2}, + {"label":"KM___8", "x":1, "y":2}, + {"label":"KM___9", "x":2, "y":2}, + {"label":"KM___4", "x":0, "y":3}, + {"label":"KM___5", "x":1, "y":3}, + {"label":"KM___6", "x":2, "y":3}, + {"label":"KM_PLS", "x":3, "y":2, "h":2}, + {"label":"KM___1", "x":0, "y":4}, + {"label":"KM___2", "x":1, "y":4}, + {"label":"KM___3", "x":2, "y":4}, + {"label":"KM___0", "x":0, "y":5, "w":2}, + {"label":"KM_DOT", "x":2, "y":5}, + {"label":"KM_ENT", "x":3, "y":4, "h":2} + ] + } + } +} diff --git a/keyboards/handwired/arrow_pad/keymaps/default/keymap.c b/keyboards/handwired/arrow_pad/keymaps/default/keymap.c index b5d304708..dd729c59a 100644 --- a/keyboards/handwired/arrow_pad/keymaps/default/keymap.c +++ b/keyboards/handwired/arrow_pad/keymaps/default/keymap.c @@ -1,35 +1,18 @@ -#include "arrow_pad.h" +#include QMK_KEYBOARD_H #include "led.h" -// This is the 21-key keypad to 2x11 element matrix mapping -#define LAYOUT( \ - KM_ESC, KM_TAB, KM_BSL, KM_ARR, \ - KM_NUM, KM_FSL, KM_AST, KM_MIN, \ - KM___7, KM___8, KM___9, KM_EQU, \ - KM___4, KM___5, KM___6, KM_PLS, \ - KM___1, KM___2, KM___3, ___ENT, \ - KM___0, _____0, KM_DOT, KM_ENT \ -) { \ - { KM_ESC, KM_TAB, KM_BSL, KM_ARR }, \ - { KM_NUM, KM_FSL, KM_AST, KM_MIN }, \ - { KM___7, KM___8, KM___9, KM_EQU }, \ - { KM___4, KM___5, KM___6, KM_PLS }, \ - { KM___1, KM___2, KM___3, KC_NO }, \ - { KM___0, KC_NO, KM_DOT, KM_ENT } \ -} +enum layers { + LAYER_BASE, + LAYER_EDIT, + LAYER_FUNCTION +}; -#define LAYER_BASE 0 -#define LAYER_EDIT 1 -#define LAYER_FUNCTION 2 - -#define MACRO_COPY_CUT 0 -#define MACRO_SHIFT_CONTROL 1 -#define MACRO_CONTROL_ALT 2 - -#define M_COPY KC_FN5 -#define M_SHFCT KC_FN6 -#define M_CTALT KC_FN7 +enum custom_keycodes { + M_COPY = SAFE_RANGE, // KC_FN5: MACRO_COPY_CUT + M_SHFCT, // KC_FN6: MACRO_SHIFT_CONTROL + M_CTALT // KC_FN7: MACRO_CONTROL_ALT +}; #define SC_UNDO LCTL(KC_Z) #define SC_REDO LCTL(KC_Y) @@ -42,13 +25,10 @@ #define SC_ACLS LALT(KC_F4) #define SC_CCLS LCTL(KC_F4) -#define _______ KC_TRNS -#define XXXXXXX KC_NO - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [LAYER_BASE] = LAYOUT( \ - KC_ESC, KC_TAB, KC_BSLS, KC_FN0, \ + KC_ESC, KC_TAB, KC_BSLS, MO(2), \ KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \ KC_P7, KC_P8, KC_P9, KC_PEQL, \ KC_P4, KC_P5, KC_P6, KC_PPLS, \ @@ -57,15 +37,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [LAYER_EDIT] = LAYOUT( \ KC_ESC, KC_TAB, KC_SPC, _______, \ - KC_FN1, SC_PSTE, SC_REDO, SC_UNDO, \ + TG(1), SC_PSTE, SC_REDO, SC_UNDO, \ KC_HOME, KC_UP, KC_PGUP, KC_LALT, \ KC_LEFT, M_COPY, KC_RGHT, KC_LCTL, \ KC_END, KC_DOWN, KC_PGDN, XXXXXXX, \ - KC_BSPC, KC_PENT, KC_DEL, M_SHFCT), + KC_BSPC, KC_PENT, KC_DEL, M_SHFCT ), [LAYER_FUNCTION] = LAYOUT( \ - KC_FN2, KC_FN3, KC_FN4, _______, \ - KC_FN1, _______, _______, _______, \ + BL_TOGG, BL_INC, BL_DEC, _______, \ + TG(1), _______, _______, _______, \ _______, _______, _______, _______, \ _______, _______, _______, _______, \ _______, _______, _______, XXXXXXX, \ @@ -74,68 +54,46 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_LAYER_MOMENTARY(LAYER_FUNCTION), - [1] = ACTION_LAYER_TOGGLE(LAYER_EDIT), - [2] = ACTION_BACKLIGHT_TOGGLE(), - [3] = ACTION_BACKLIGHT_INCREASE(), - [4] = ACTION_BACKLIGHT_DECREASE(), - [5] = ACTION_MACRO_TAP(MACRO_COPY_CUT), - [6] = ACTION_MACRO_TAP(MACRO_SHIFT_CONTROL), - [7] = ACTION_MACRO_TAP(MACRO_CONTROL_ALT), - -}; - - -void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) -{ -} - - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ +bool process_record_user(uint16_t keycode, keyrecord_t * record) { // MACRODOWN only works in this function - switch (id) { + switch (keycode) { - case MACRO_COPY_CUT: - if (record->event.pressed) { - register_code(KC_LCTL); - if (record->tap.count == 1) { - register_code(KC_C); - unregister_code(KC_C); - } - else if (record->tap.count == 2) { - register_code(KC_X); - unregister_code(KC_X); - } - unregister_code(KC_LCTL); - } - break; - - case MACRO_SHIFT_CONTROL: - if (record->event.pressed) { - if (record->tap.count <= 2) register_mods(MOD_BIT(KC_LSFT)); - if (record->tap.count == 2) register_mods(MOD_BIT(KC_LCTL)); - if (record->tap.count == 3) register_code(KC_PENT);; - } - else { - unregister_mods(MOD_BIT(KC_LSFT) | MOD_BIT(KC_LCTL)); - unregister_code(KC_PENT); - } - break; - - case MACRO_CONTROL_ALT: - if (record->event.pressed) { - if (record->tap.count < 2) register_mods(MOD_BIT(KC_LCTL)); - if (record->tap.count >= 2) register_mods(MOD_BIT(KC_LALT)); - } - else { - unregister_mods(MOD_BIT(KC_LCTL) | MOD_BIT(KC_LALT)); - } - break; + case M_COPY: + if (record->event.pressed) { + register_code(KC_LCTL); + if (record->tap.count == 1) { + register_code(KC_C); + unregister_code(KC_C); + } else if (record->tap.count == 2) { + register_code(KC_X); + unregister_code(KC_X); + } + unregister_code(KC_LCTL); } + break; - return MACRO_NONE; + case M_SHFCT: + if (record->event.pressed) { + if (record->tap.count <= 2) register_mods(MOD_BIT(KC_LSFT)); + if (record->tap.count == 2) register_mods(MOD_BIT(KC_LCTL)); + if (record->tap.count == 3) register_code(KC_PENT);; + } else { + unregister_mods(MOD_BIT(KC_LSFT) | MOD_BIT(KC_LCTL)); + unregister_code(KC_PENT); + } + break; + + case M_CTALT: + if (record->event.pressed) { + if (record->tap.count < 2) register_mods(MOD_BIT(KC_LCTL)); + if (record->tap.count >= 2) register_mods(MOD_BIT(KC_LALT)); + } else { + unregister_mods(MOD_BIT(KC_LCTL) | MOD_BIT(KC_LALT)); + } + break; + } + + return true; } void led_set_user(uint8_t usb_led) diff --git a/keyboards/handwired/arrow_pad/keymaps/pad_21/keymap.c b/keyboards/handwired/arrow_pad/keymaps/pad_21/keymap.c index a29f9e101..169297635 100644 --- a/keyboards/handwired/arrow_pad/keymaps/pad_21/keymap.c +++ b/keyboards/handwired/arrow_pad/keymaps/pad_21/keymap.c @@ -1,32 +1,18 @@ -#include "arrow_pad.h" +#include QMK_KEYBOARD_H #include "led.h" -// This is the 21-key keypad to 2x11 element matrix mapping -#define LAYOUT( \ - KM_ESC, KM_TAB, KM_BSL, KM_ARR, \ - KM_NUM, KM_FSL, KM_AST, KM_MIN, \ - KM___7, KM___8, KM___9, ___PLS, \ - KM___4, KM___5, KM___6, KM_PLS, \ - KM___1, KM___2, KM___3, ___ENT, \ - KM___0, _____0, KM_DOT, KM_ENT \ -) { \ - { KM_ESC, KM_TAB, KM_BSL, KM_ARR, KM___7, KM___8, KM___9, KM_PLS, KM___1, KM___2, KM___3, }, \ - { KM_NUM, KM_FSL, KM_AST, KM_MIN, KM___4, KM___5, KM___6, KM_ENT, KC_NO, KM___0, KM_DOT, }, \ -} +enum layers { + LAYER_BASE, + LAYER_EDIT, + LAYER_FUNCTION +}; - -#define LAYER_BASE 0 -#define LAYER_EDIT 1 -#define LAYER_FUNCTION 2 - -#define MACRO_COPY_CUT 0 -#define MACRO_SHIFT_CONTROL 1 -#define MACRO_CONTROL_ALT 2 - -#define M_COPY KC_FN5 -#define M_SHFCT KC_FN6 -#define M_CTALT KC_FN7 +enum custom_keycodes { + M_COPY = SAFE_RANGE, // KC_FN5: MACRO_COPY_CUT + M_SHFCT, // KC_FN6: MACRO_SHIFT_CONTROL + M_CTALT // KC_FN7: MACRO_CONTROL_ALT +}; #define SC_UNDO LCTL(KC_Z) #define SC_REDO LCTL(KC_Y) @@ -39,100 +25,75 @@ #define SC_ACLS LALT(KC_F4) #define SC_CCLS LCTL(KC_F4) -#define _______ KC_TRNS -#define XXXXXXX KC_NO - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[LAYER_BASE] = LAYOUT( \ - KC_ESC, KC_TAB, KC_BSLS, KC_FN0, \ +[LAYER_BASE] = LAYOUT_pad21( \ + KC_ESC, KC_TAB, KC_BSLS, MO(2), \ KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \ - KC_P7, KC_P8, KC_P9, XXXXXXX, \ + KC_P7, KC_P8, KC_P9, \ KC_P4, KC_P5, KC_P6, KC_PPLS, \ - KC_P1, KC_P2, KC_P3, XXXXXXX, \ - KC_P0, XXXXXXX, KC_PDOT, KC_PENT ), + KC_P1, KC_P2, KC_P3, \ + KC_P0, KC_PDOT, KC_PENT ), -[LAYER_EDIT] = LAYOUT( \ +[LAYER_EDIT] = LAYOUT_pad21( \ KC_ESC, KC_TAB, KC_SPC, _______, \ - KC_FN1, SC_PSTE, SC_REDO, SC_UNDO, \ - KC_HOME, KC_UP, KC_PGUP, XXXXXXX, \ + TG(1), SC_PSTE, SC_REDO, SC_UNDO, \ + KC_HOME, KC_UP, KC_PGUP, \ KC_LEFT, M_COPY, KC_RGHT, M_CTALT, \ - KC_END, KC_DOWN, KC_PGDN, XXXXXXX, \ - KC_BSPC, XXXXXXX, KC_DEL, M_SHFCT), + KC_END, KC_DOWN, KC_PGDN, \ + KC_BSPC, KC_DEL, M_SHFCT), -[LAYER_FUNCTION] = LAYOUT( \ - KC_FN2, KC_FN3, KC_FN4, _______, \ - KC_FN1, _______, _______, _______, \ - _______, _______, _______, XXXXXXX, \ +[LAYER_FUNCTION] = LAYOUT_pad21( \ + BL_TOGG, BL_INC, BL_DEC, _______, \ + TG(1), _______, _______, _______, \ + _______, _______, _______, \ _______, _______, _______, _______, \ - _______, _______, _______, XXXXXXX, \ - RESET, XXXXXXX, _______, _______ ), + _______, _______, _______, \ + RESET, _______, _______ ), }; -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_LAYER_MOMENTARY(LAYER_FUNCTION), - [1] = ACTION_LAYER_TOGGLE(LAYER_EDIT), - [2] = ACTION_BACKLIGHT_TOGGLE(), - [3] = ACTION_BACKLIGHT_INCREASE(), - [4] = ACTION_BACKLIGHT_DECREASE(), - [5] = ACTION_MACRO_TAP(MACRO_COPY_CUT), - [6] = ACTION_MACRO_TAP(MACRO_SHIFT_CONTROL), - [7] = ACTION_MACRO_TAP(MACRO_CONTROL_ALT), - -}; - - -void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) -{ -} - - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ +bool process_record_user(uint16_t keycode, keyrecord_t * record) { // MACRODOWN only works in this function - switch (id) { + switch (keycode) { - case MACRO_COPY_CUT: - if (record->event.pressed) { - register_code(KC_LCTL); - if (record->tap.count == 1) { - register_code(KC_C); - unregister_code(KC_C); - } - else if (record->tap.count == 2) { - register_code(KC_X); - unregister_code(KC_X); - } - unregister_code(KC_LCTL); - } - break; - - case MACRO_SHIFT_CONTROL: - if (record->event.pressed) { - if (record->tap.count <= 2) register_mods(MOD_BIT(KC_LSFT)); - if (record->tap.count == 2) register_mods(MOD_BIT(KC_LCTL)); - if (record->tap.count == 3) register_code(KC_PENT);; - } - else { - unregister_mods(MOD_BIT(KC_LSFT) | MOD_BIT(KC_LCTL)); - unregister_code(KC_PENT); - } - break; - - case MACRO_CONTROL_ALT: - if (record->event.pressed) { - if (record->tap.count < 2) register_mods(MOD_BIT(KC_LCTL)); - if (record->tap.count >= 2) register_mods(MOD_BIT(KC_LALT)); - } - else { - unregister_mods(MOD_BIT(KC_LCTL) | MOD_BIT(KC_LALT)); - } - break; + case M_COPY: + if (record->event.pressed) { + register_code(KC_LCTL); + if (record->tap.count == 1) { + register_code(KC_C); + unregister_code(KC_C); + } else if (record->tap.count == 2) { + register_code(KC_X); + unregister_code(KC_X); + } + unregister_code(KC_LCTL); } + break; - return MACRO_NONE; + case M_SHFCT: + if (record->event.pressed) { + if (record->tap.count <= 2) register_mods(MOD_BIT(KC_LSFT)); + if (record->tap.count == 2) register_mods(MOD_BIT(KC_LCTL)); + if (record->tap.count == 3) register_code(KC_PENT);; + } else { + unregister_mods(MOD_BIT(KC_LSFT) | MOD_BIT(KC_LCTL)); + unregister_code(KC_PENT); + } + break; + + case M_CTALT: + if (record->event.pressed) { + if (record->tap.count < 2) register_mods(MOD_BIT(KC_LCTL)); + if (record->tap.count >= 2) register_mods(MOD_BIT(KC_LALT)); + } else { + unregister_mods(MOD_BIT(KC_LCTL) | MOD_BIT(KC_LALT)); + } + break; + } + + return true; } void led_set_user(uint8_t usb_led) diff --git a/keyboards/handwired/arrow_pad/keymaps/pad_24/keymap.c b/keyboards/handwired/arrow_pad/keymaps/pad_24/keymap.c index b5d304708..dd729c59a 100644 --- a/keyboards/handwired/arrow_pad/keymaps/pad_24/keymap.c +++ b/keyboards/handwired/arrow_pad/keymaps/pad_24/keymap.c @@ -1,35 +1,18 @@ -#include "arrow_pad.h" +#include QMK_KEYBOARD_H #include "led.h" -// This is the 21-key keypad to 2x11 element matrix mapping -#define LAYOUT( \ - KM_ESC, KM_TAB, KM_BSL, KM_ARR, \ - KM_NUM, KM_FSL, KM_AST, KM_MIN, \ - KM___7, KM___8, KM___9, KM_EQU, \ - KM___4, KM___5, KM___6, KM_PLS, \ - KM___1, KM___2, KM___3, ___ENT, \ - KM___0, _____0, KM_DOT, KM_ENT \ -) { \ - { KM_ESC, KM_TAB, KM_BSL, KM_ARR }, \ - { KM_NUM, KM_FSL, KM_AST, KM_MIN }, \ - { KM___7, KM___8, KM___9, KM_EQU }, \ - { KM___4, KM___5, KM___6, KM_PLS }, \ - { KM___1, KM___2, KM___3, KC_NO }, \ - { KM___0, KC_NO, KM_DOT, KM_ENT } \ -} +enum layers { + LAYER_BASE, + LAYER_EDIT, + LAYER_FUNCTION +}; -#define LAYER_BASE 0 -#define LAYER_EDIT 1 -#define LAYER_FUNCTION 2 - -#define MACRO_COPY_CUT 0 -#define MACRO_SHIFT_CONTROL 1 -#define MACRO_CONTROL_ALT 2 - -#define M_COPY KC_FN5 -#define M_SHFCT KC_FN6 -#define M_CTALT KC_FN7 +enum custom_keycodes { + M_COPY = SAFE_RANGE, // KC_FN5: MACRO_COPY_CUT + M_SHFCT, // KC_FN6: MACRO_SHIFT_CONTROL + M_CTALT // KC_FN7: MACRO_CONTROL_ALT +}; #define SC_UNDO LCTL(KC_Z) #define SC_REDO LCTL(KC_Y) @@ -42,13 +25,10 @@ #define SC_ACLS LALT(KC_F4) #define SC_CCLS LCTL(KC_F4) -#define _______ KC_TRNS -#define XXXXXXX KC_NO - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [LAYER_BASE] = LAYOUT( \ - KC_ESC, KC_TAB, KC_BSLS, KC_FN0, \ + KC_ESC, KC_TAB, KC_BSLS, MO(2), \ KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \ KC_P7, KC_P8, KC_P9, KC_PEQL, \ KC_P4, KC_P5, KC_P6, KC_PPLS, \ @@ -57,15 +37,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [LAYER_EDIT] = LAYOUT( \ KC_ESC, KC_TAB, KC_SPC, _______, \ - KC_FN1, SC_PSTE, SC_REDO, SC_UNDO, \ + TG(1), SC_PSTE, SC_REDO, SC_UNDO, \ KC_HOME, KC_UP, KC_PGUP, KC_LALT, \ KC_LEFT, M_COPY, KC_RGHT, KC_LCTL, \ KC_END, KC_DOWN, KC_PGDN, XXXXXXX, \ - KC_BSPC, KC_PENT, KC_DEL, M_SHFCT), + KC_BSPC, KC_PENT, KC_DEL, M_SHFCT ), [LAYER_FUNCTION] = LAYOUT( \ - KC_FN2, KC_FN3, KC_FN4, _______, \ - KC_FN1, _______, _______, _______, \ + BL_TOGG, BL_INC, BL_DEC, _______, \ + TG(1), _______, _______, _______, \ _______, _______, _______, _______, \ _______, _______, _______, _______, \ _______, _______, _______, XXXXXXX, \ @@ -74,68 +54,46 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_LAYER_MOMENTARY(LAYER_FUNCTION), - [1] = ACTION_LAYER_TOGGLE(LAYER_EDIT), - [2] = ACTION_BACKLIGHT_TOGGLE(), - [3] = ACTION_BACKLIGHT_INCREASE(), - [4] = ACTION_BACKLIGHT_DECREASE(), - [5] = ACTION_MACRO_TAP(MACRO_COPY_CUT), - [6] = ACTION_MACRO_TAP(MACRO_SHIFT_CONTROL), - [7] = ACTION_MACRO_TAP(MACRO_CONTROL_ALT), - -}; - - -void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) -{ -} - - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ +bool process_record_user(uint16_t keycode, keyrecord_t * record) { // MACRODOWN only works in this function - switch (id) { + switch (keycode) { - case MACRO_COPY_CUT: - if (record->event.pressed) { - register_code(KC_LCTL); - if (record->tap.count == 1) { - register_code(KC_C); - unregister_code(KC_C); - } - else if (record->tap.count == 2) { - register_code(KC_X); - unregister_code(KC_X); - } - unregister_code(KC_LCTL); - } - break; - - case MACRO_SHIFT_CONTROL: - if (record->event.pressed) { - if (record->tap.count <= 2) register_mods(MOD_BIT(KC_LSFT)); - if (record->tap.count == 2) register_mods(MOD_BIT(KC_LCTL)); - if (record->tap.count == 3) register_code(KC_PENT);; - } - else { - unregister_mods(MOD_BIT(KC_LSFT) | MOD_BIT(KC_LCTL)); - unregister_code(KC_PENT); - } - break; - - case MACRO_CONTROL_ALT: - if (record->event.pressed) { - if (record->tap.count < 2) register_mods(MOD_BIT(KC_LCTL)); - if (record->tap.count >= 2) register_mods(MOD_BIT(KC_LALT)); - } - else { - unregister_mods(MOD_BIT(KC_LCTL) | MOD_BIT(KC_LALT)); - } - break; + case M_COPY: + if (record->event.pressed) { + register_code(KC_LCTL); + if (record->tap.count == 1) { + register_code(KC_C); + unregister_code(KC_C); + } else if (record->tap.count == 2) { + register_code(KC_X); + unregister_code(KC_X); + } + unregister_code(KC_LCTL); } + break; - return MACRO_NONE; + case M_SHFCT: + if (record->event.pressed) { + if (record->tap.count <= 2) register_mods(MOD_BIT(KC_LSFT)); + if (record->tap.count == 2) register_mods(MOD_BIT(KC_LCTL)); + if (record->tap.count == 3) register_code(KC_PENT);; + } else { + unregister_mods(MOD_BIT(KC_LSFT) | MOD_BIT(KC_LCTL)); + unregister_code(KC_PENT); + } + break; + + case M_CTALT: + if (record->event.pressed) { + if (record->tap.count < 2) register_mods(MOD_BIT(KC_LCTL)); + if (record->tap.count >= 2) register_mods(MOD_BIT(KC_LALT)); + } else { + unregister_mods(MOD_BIT(KC_LCTL) | MOD_BIT(KC_LALT)); + } + break; + } + + return true; } void led_set_user(uint8_t usb_led) diff --git a/keyboards/handwired/arrow_pad/readme.md b/keyboards/handwired/arrow_pad/readme.md index d0d172272..43a0e33c4 100644 --- a/keyboards/handwired/arrow_pad/readme.md +++ b/keyboards/handwired/arrow_pad/readme.md @@ -94,13 +94,13 @@ More info can be found on [GeekHack](https://geekhack.org/index.php?topic=73632. The second ArrowPad was a conversion from a 21-key Genovation keypad. It used a 2 row x 11 column matrix. ``` -#define KEYMAP( \ +#define LAYOUT_pad21( \ KM_ESC, KM_TAB, KM_BSL, KM_ARR, \ KM_NUM, KM_FSL, KM_AST, KM_MIN, \ - KM___7, KM___8, KM___9, ___PLS, \ + KM___7, KM___8, KM___9, \ KM___4, KM___5, KM___6, KM_PLS, \ - KM___1, KM___2, KM___3, ___ENT, \ - KM___0, _____0, KM_DOT, KM_ENT \ + KM___1, KM___2, KM___3, \ + KM___0, KM_DOT, KM_ENT \ ) { \ { KM_ESC, KM_TAB, KM_BSL, KM_ARR, KM___7, KM___8, KM___9, KM_PLS, KM___1, KM___2, KM___3, }, \ { KM_NUM, KM_FSL, KM_AST, KM_MIN, KM___4, KM___5, KM___6, KM_ENT, KC_NO, KM___0, KM_DOT, }, \ @@ -119,7 +119,7 @@ Download or clone the whole firmware and navigate to the keyboards/arrow_pad fol Depending on which keymap you would like to use, you will have to compile slightly differently. ### Default -To build with the default keymap, simply run `make default`. +To build with the default keymap, simply run `make handwired/arrow_pad:default`. ### Other Keymaps Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `.c` in the keymaps folder, and see keymap document (you can find in top readme.md) and existent keymap files. @@ -127,7 +127,7 @@ Several version of keymap are available in advance but you are recommended to de To build the firmware binary hex file with a keymap just do `make` with a keymap like this: ``` -$ make [default|pad_21|pad_24|] +$ make handwired/arrow_pad:[default|pad_21|pad_24|] ``` Keymaps follow the format **__\.c__** and are stored in the `keymaps` folder. From a054b5a06c00cf148fa416fae8f5a56586a10876 Mon Sep 17 00:00:00 2001 From: Takeshi ISHII <2170248+mtei@users.noreply.github.com> Date: Wed, 28 Nov 2018 00:22:47 +0900 Subject: [PATCH 568/788] Fix Helix ws2812.c listed more than once warning. (#4499) Remove `SRC += ws2812.c` from helix/rev2/rules.mk and helix/pico/rules.mk. Because it will be added in common_features.mk. --- keyboards/helix/pico/rules.mk | 5 ++--- keyboards/helix/rev2/rules.mk | 1 - 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/keyboards/helix/pico/rules.mk b/keyboards/helix/pico/rules.mk index c994ac8de..75bf0a5ef 100644 --- a/keyboards/helix/pico/rules.mk +++ b/keyboards/helix/pico/rules.mk @@ -1,3 +1,2 @@ -SRC += pico/matrix.c \ - pico/split_util.c \ - ws2812.c +SRC += pico/matrix.c +SRC += pico/split_util.c diff --git a/keyboards/helix/rev2/rules.mk b/keyboards/helix/rev2/rules.mk index 4ea623c43..5582a0f9c 100644 --- a/keyboards/helix/rev2/rules.mk +++ b/keyboards/helix/rev2/rules.mk @@ -1,4 +1,3 @@ SRC += rev2/matrix.c SRC += rev2/split_util.c SRC += rev2/split_scomm.c -SRC += ws2812.c From faef966a4d66b802babf9332cbf3045edf47c729 Mon Sep 17 00:00:00 2001 From: Mattia Dal Ben Date: Tue, 27 Nov 2018 17:59:53 +0100 Subject: [PATCH 569/788] Keymap: Set serial connection as default for the Redox rev1.0 keyboard (#4488) * Set serial as default for Redox * Updated rules.mk file * Removed unused rule Co-Authored-By: mattdibi * Removed unused rule Co-Authored-By: mattdibi --- keyboards/redox/keymaps/default/config.h | 6 ++---- keyboards/redox/keymaps/finex/config.h | 2 -- keyboards/redox/keymaps/german/config.h | 8 +++----- keyboards/redox/keymaps/italian/config.h | 6 ++---- keyboards/redox/keymaps/jeherve/config.h | 4 +--- keyboards/redox/rules.mk | 4 +--- 6 files changed, 9 insertions(+), 21 deletions(-) diff --git a/keyboards/redox/keymaps/default/config.h b/keyboards/redox/keymaps/default/config.h index 0670bf294..a3ef209a0 100644 --- a/keyboards/redox/keymaps/default/config.h +++ b/keyboards/redox/keymaps/default/config.h @@ -18,12 +18,10 @@ along with this program. If not, see . #pragma once /* Use I2C or Serial, not both */ - -// #define USE_SERIAL -#define USE_I2C +#define USE_SERIAL +// #define USE_I2C /* Select hand configuration */ - #define MASTER_LEFT // #define MASTER_RIGHT // #define EE_HANDS diff --git a/keyboards/redox/keymaps/finex/config.h b/keyboards/redox/keymaps/finex/config.h index 9adbcedf4..b23342ce0 100644 --- a/keyboards/redox/keymaps/finex/config.h +++ b/keyboards/redox/keymaps/finex/config.h @@ -18,12 +18,10 @@ along with this program. If not, see . #pragma once /* Use I2C or Serial, not both */ - #define USE_SERIAL // #define USE_I2C /* Select hand configuration */ - #define MASTER_LEFT // #define MASTER_RIGHT // #define EE_HANDS diff --git a/keyboards/redox/keymaps/german/config.h b/keyboards/redox/keymaps/german/config.h index 0eb19ab1e..a3ef209a0 100644 --- a/keyboards/redox/keymaps/german/config.h +++ b/keyboards/redox/keymaps/german/config.h @@ -18,14 +18,12 @@ along with this program. If not, see . #pragma once /* Use I2C or Serial, not both */ - -// #define USE_SERIAL -#define USE_I2C +#define USE_SERIAL +// #define USE_I2C /* Select hand configuration */ - -// #define MASTER_LEFT #define MASTER_LEFT +// #define MASTER_RIGHT // #define EE_HANDS #undef RGBLED_NUM diff --git a/keyboards/redox/keymaps/italian/config.h b/keyboards/redox/keymaps/italian/config.h index 0670bf294..a3ef209a0 100644 --- a/keyboards/redox/keymaps/italian/config.h +++ b/keyboards/redox/keymaps/italian/config.h @@ -18,12 +18,10 @@ along with this program. If not, see . #pragma once /* Use I2C or Serial, not both */ - -// #define USE_SERIAL -#define USE_I2C +#define USE_SERIAL +// #define USE_I2C /* Select hand configuration */ - #define MASTER_LEFT // #define MASTER_RIGHT // #define EE_HANDS diff --git a/keyboards/redox/keymaps/jeherve/config.h b/keyboards/redox/keymaps/jeherve/config.h index 939d0c8d8..b9b67c999 100644 --- a/keyboards/redox/keymaps/jeherve/config.h +++ b/keyboards/redox/keymaps/jeherve/config.h @@ -17,16 +17,14 @@ along with this program. If not, see . #pragma once -/* Use I2C or Serial, not both */ - /* Change the default tapping toggle value (normally 5) */ #define TAPPING_TOGGLE 2 +/* Use I2C or Serial, not both */ #define USE_SERIAL //#define USE_I2C /* Select hand configuration */ - #define MASTER_LEFT // #define MASTER_RIGHT // #define EE_HANDS diff --git a/keyboards/redox/rules.mk b/keyboards/redox/rules.mk index 748d89dcf..c0edb5428 100644 --- a/keyboards/redox/rules.mk +++ b/keyboards/redox/rules.mk @@ -66,9 +66,7 @@ UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID AUDIO_ENABLE = no # Audio output on port C6 FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. -SUBPROJECT_rev1 = yes -USE_I2C = yes +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SPLIT_KEYBOARD = yes From 77ed9e3a7305b1921d079e2facfb8e6d3d137e19 Mon Sep 17 00:00:00 2001 From: abishalom Date: Tue, 27 Nov 2018 12:22:49 -0500 Subject: [PATCH 570/788] Keymap: Added abishalom keymaps (#4495) * Added abishalom keymaps Added personal keymaps for Massdrop Alt and Tada68 * Update keyboards/tada68/keymaps/abishalom/rules.mk Co-Authored-By: abishalom * Update keyboards/tada68/keymaps/abishalom/rules.mk Co-Authored-By: abishalom * Update keyboards/tada68/keymaps/abishalom/config.h Co-Authored-By: abishalom * Update keyboards/tada68/keymaps/abishalom/keymap.c Co-Authored-By: abishalom * Update keyboards/tada68/keymaps/abishalom/keymap.c Co-Authored-By: abishalom * Update keyboards/tada68/keymaps/abishalom/rules.mk Co-Authored-By: abishalom * Update keyboards/tada68/keymaps/abishalom/keymap.c Co-Authored-By: abishalom * Update keyboards/tada68/keymaps/abishalom/keymap.c Co-Authored-By: abishalom * Updated keymaps * Bugfix Tada68 * Update keyboards/tada68/keymaps/abishalom/keymap.c Co-Authored-By: abishalom --- .../massdrop/alt/keymaps/abishalom/keymap.c | 189 ++++++++++++++++++ keyboards/tada68/keymaps/abishalom/config.h | 3 + keyboards/tada68/keymaps/abishalom/keymap.c | 96 +++++++++ keyboards/tada68/keymaps/abishalom/readme.md | 6 + keyboards/tada68/keymaps/abishalom/rules.mk | 18 ++ 5 files changed, 312 insertions(+) create mode 100644 keyboards/massdrop/alt/keymaps/abishalom/keymap.c create mode 100644 keyboards/tada68/keymaps/abishalom/config.h create mode 100644 keyboards/tada68/keymaps/abishalom/keymap.c create mode 100644 keyboards/tada68/keymaps/abishalom/readme.md create mode 100644 keyboards/tada68/keymaps/abishalom/rules.mk diff --git a/keyboards/massdrop/alt/keymaps/abishalom/keymap.c b/keyboards/massdrop/alt/keymaps/abishalom/keymap.c new file mode 100644 index 000000000..7ffa53dca --- /dev/null +++ b/keyboards/massdrop/alt/keymaps/abishalom/keymap.c @@ -0,0 +1,189 @@ +#include QMK_KEYBOARD_H + +enum alt_keycodes { + L_BRI = SAFE_RANGE, //LED Brightness Increase + L_BRD, //LED Brightness Decrease + L_PTN, //LED Pattern Select Next + L_PTP, //LED Pattern Select Previous + L_PSI, //LED Pattern Speed Increase + L_PSD, //LED Pattern Speed Decrease + L_T_MD, //LED Toggle Mode + L_T_ONF, //LED Toggle On / Off + L_ON, //LED On + L_OFF, //LED Off + L_T_BR, //LED Toggle Breath Effect + L_T_PTD, //LED Toggle Scrolling Pattern Direction + U_T_AUTO, //USB Extra Port Toggle Auto Detect / Always Active + U_T_AGCR, //USB Toggle Automatic GCR control + DBG_TOG, //DEBUG Toggle On / Off + DBG_MTRX, //DEBUG Toggle Matrix Prints + DBG_KBD, //DEBUG Toggle Keyboard Prints + DBG_MOU, //DEBUG Toggle Mouse Prints + MD_BOOT, //Restart into bootloader after hold timeout +}; + +#define TG_NKRO MAGIC_TOGGLE_NKRO //Toggle 6KRO / NKRO mode + +keymap_config_t keymap_config; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_HOME, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT \ + ), + [1] = LAYOUT( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_MUTE, \ + L_T_BR, L_PSD, L_BRI, L_PSI, KC_TRNS, KC_TRNS, KC_TRNS, U_T_AUTO,U_T_AGCR,KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, KC_END, \ + L_T_PTD, L_PTP, L_BRD, L_PTN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, \ + KC_TRNS, L_T_MD, L_T_ONF, KC_TRNS, KC_TRNS, MD_BOOT, TG_NKRO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_VOLD, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGDN, KC_END \ + ), + /* + [X] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ + ), + */ +}; + +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { +}; + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { +}; + +#define MODS_SHIFT (keyboard_report->mods & MOD_BIT(KC_LSHIFT) || keyboard_report->mods & MOD_BIT(KC_RSHIFT)) +#define MODS_CTRL (keyboard_report->mods & MOD_BIT(KC_LCTL) || keyboard_report->mods & MOD_BIT(KC_RCTRL)) +#define MODS_ALT (keyboard_report->mods & MOD_BIT(KC_LALT) || keyboard_report->mods & MOD_BIT(KC_RALT)) + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + static uint32_t key_timer; + + switch (keycode) { + case L_BRI: + if (record->event.pressed) { + if (LED_GCR_STEP > LED_GCR_MAX - gcr_desired) gcr_desired = LED_GCR_MAX; + else gcr_desired += LED_GCR_STEP; + if (led_animation_breathing) gcr_breathe = gcr_desired; + } + return false; + case L_BRD: + if (record->event.pressed) { + if (LED_GCR_STEP > gcr_desired) gcr_desired = 0; + else gcr_desired -= LED_GCR_STEP; + if (led_animation_breathing) gcr_breathe = gcr_desired; + } + return false; + case L_PTN: + if (record->event.pressed) { + if (led_animation_id == led_setups_count - 1) led_animation_id = 0; + else led_animation_id++; + } + return false; + case L_PTP: + if (record->event.pressed) { + if (led_animation_id == 0) led_animation_id = led_setups_count - 1; + else led_animation_id--; + } + return false; + case L_PSI: + if (record->event.pressed) { + led_animation_speed += ANIMATION_SPEED_STEP; + } + return false; + case L_PSD: + if (record->event.pressed) { + led_animation_speed -= ANIMATION_SPEED_STEP; + if (led_animation_speed < 0) led_animation_speed = 0; + } + return false; + case L_T_MD: + if (record->event.pressed) { + led_lighting_mode++; + if (led_lighting_mode > LED_MODE_MAX_INDEX) led_lighting_mode = LED_MODE_NORMAL; + } + return false; + case L_T_ONF: + if (record->event.pressed) { + led_enabled = !led_enabled; + I2C3733_Control_Set(led_enabled); + } + return false; + case L_ON: + if (record->event.pressed) { + led_enabled = 1; + I2C3733_Control_Set(led_enabled); + } + return false; + case L_OFF: + if (record->event.pressed) { + led_enabled = 0; + I2C3733_Control_Set(led_enabled); + } + return false; + case L_T_BR: + if (record->event.pressed) { + led_animation_breathing = !led_animation_breathing; + if (led_animation_breathing) { + gcr_breathe = gcr_desired; + led_animation_breathe_cur = BREATHE_MIN_STEP; + breathe_dir = 1; + } + } + return false; + case L_T_PTD: + if (record->event.pressed) { + led_animation_direction = !led_animation_direction; + } + return false; + case U_T_AUTO: + if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { + TOGGLE_FLAG_AND_PRINT(usb_extra_manual, "USB extra port manual mode"); + } + return false; + case U_T_AGCR: + if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { + TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode"); + } + return false; + case DBG_TOG: + if (record->event.pressed) { + TOGGLE_FLAG_AND_PRINT(debug_enable, "Debug mode"); + } + return false; + case DBG_MTRX: + if (record->event.pressed) { + TOGGLE_FLAG_AND_PRINT(debug_matrix, "Debug matrix"); + } + return false; + case DBG_KBD: + if (record->event.pressed) { + TOGGLE_FLAG_AND_PRINT(debug_keyboard, "Debug keyboard"); + } + return false; + case DBG_MOU: + if (record->event.pressed) { + TOGGLE_FLAG_AND_PRINT(debug_mouse, "Debug mouse"); + } + return false; + case MD_BOOT: + if (record->event.pressed) { + key_timer = timer_read32(); + } else { + if (timer_elapsed32(key_timer) >= 500) { + reset_keyboard(); + } + } + return false; + default: + return true; //Process all other keycodes normally + } +} diff --git a/keyboards/tada68/keymaps/abishalom/config.h b/keyboards/tada68/keymaps/abishalom/config.h new file mode 100644 index 000000000..af01528b4 --- /dev/null +++ b/keyboards/tada68/keymaps/abishalom/config.h @@ -0,0 +1,3 @@ +#pragma once + +#define BACKLIGHT_BREATHING diff --git a/keyboards/tada68/keymaps/abishalom/keymap.c b/keyboards/tada68/keymaps/abishalom/keymap.c new file mode 100644 index 000000000..94217948e --- /dev/null +++ b/keyboards/tada68/keymaps/abishalom/keymap.c @@ -0,0 +1,96 @@ +#include QMK_KEYBOARD_H + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _BL 0 +#define _FL 1 +#define _NL 2 + +#define SEMI_FN LT(_FL, KC_SCLN) + +//Tap Dance Declarations +enum { + TD_WIN_LOCK = 0 +}; + +//BL_BRTG - breathing mode. Would like to put in. + +//Tap Dance Definitions +qk_tap_dance_action_t tap_dance_actions[] = { + [TD_WIN_LOCK] = ACTION_TAP_DANCE_DOUBLE(MAGIC_NO_GUI, MAGIC_UNNO_GUI) +}; + +// +////In Layer declaration, add tap dance item in place of a key code +//TD(TD_WIN_LOCK) + +// Double Tap Fn button to get caps. FN + Tab to get to number layer -> Maybe switch to FN + space?. +// Press fn+GUI once to lock, double tap to unlock. + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Keymap _BL: (Base Layer) Default Layer + * ,----------------------------------------------------------------. + * |Esc | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp |~ ` | + * |----------------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ |Del | + * |----------------------------------------------------------------| + * |FNCAP| A| S| D| F| G| H| J| K| L| ;| '|Enter |PgUp | + * |----------------------------------------------------------------| + * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | Up|PgDn| + * |----------------------------------------------------------------| + * |Ctrl|Win |Alt | Space |Alt| FN|Ctrl|Lef|Dow|Rig | + * `----------------------------------------------------------------' + */ +[_BL] = LAYOUT_ansi( + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,KC_GRV, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,KC_BSLS,KC_DEL, \ + LT(_FL, KC_CAPS), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, SEMI_FN,KC_QUOT, KC_ENT,KC_PGUP, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT,KC_UP,KC_PGDN, \ + KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,MO(_FL),KC_RCTRL, KC_LEFT,KC_DOWN,KC_RGHT), + + /* Keymap _FL: Function Layer + * ,----------------------------------------------------------------. + * | | F1|F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12|Del | | + * |----------------------------------------------------------------| + * |#PAD |Pre| U |NXT| | | |PGD| U |PGU|PSC| | | |Ins | + * |----------------------------------------------------------------| + * | |L | D | R |PPl| | | L | D | R | | | |Home| + * |----------------------------------------------------------------| + * | CAPS |MUT|VU-|VU+| | | |BRG|BL-|BL+|BLT| |Stp|End | + * |----------------------------------------------------------------| + * | |WTOG| | | | | |Pre|PPl|Nxt | + * `----------------------------------------------------------------' + */ +[_FL] = LAYOUT_ansi( + _______, KC_F1 ,KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, _______ , \ + TO(_NL),KC_MPRV, KC_UP ,KC_MNXT,_______, _______,_______,KC_PGDN,KC_UP,KC_PGUP,KC_PSCR,_______,_______, _______,KC_INSERT, \ + _______,KC_LEFT,KC_DOWN,KC_RGHT,KC_MPLY,_______,_______,KC_LEFT,KC_DOWN,KC_RGHT,_______,_______, _______,KC_HOME, \ + _______,KC_MUTE,KC_VOLD,KC_VOLU, _______,_______, _______,BL_BRTG,BL_DEC,BL_INC,BL_TOGG,_______, KC_STOP, KC_END, \ + _______,TD(TD_WIN_LOCK),_______, _______, _______,KC_TRNS,_______,KC_MPRV,KC_MPLY, KC_MNXT), + + +//Press either of function keys to get back to base layer. + + /* Keymap _NL: Number Layer + * ,----------------------------------------------------------------. + * |ESC| F1 | F2| F3| F4| |#L | 7 | 8 | 9 | - | | = | | | + * |----------------------------------------------------------------| + * | TAB | | UP| | | | / | 4 | 5 | 6 | + | | | | DEL| + * |----------------------------------------------------------------| + * | _BL |LFT|DWN|RGT| | | * | 1 | 2 | 3 |ENT| | ENT |PgUp| + * |----------------------------------------------------------------| + * | SHIFT | | | | | | 0 | 0 | , | . |BKS| SHIFT| U |PgDn| + * |----------------------------------------------------------------| + * |CTRL|WIN |ALT | |ALT| _BL |CTRL| L | D | R| + * `----------------------------------------------------------------' + */ +[_NL] = LAYOUT_ansi( + _______, KC_F1 ,KC_F2, KC_F3, KC_F4, _______, KC_NLCK, KC_P7, KC_P8, KC_P9, KC_PMNS, KC_PEQL, KC_PEQL, _______, _______ , \ + KC_TAB,_______, KC_UP,_______,_______, _______,KC_PSLS,KC_P4,KC_P5,KC_P6,KC_PPLS,_______,_______, _______,KC_DEL, \ + TO(_BL),KC_LEFT,KC_DOWN,KC_RGHT,_______,_______,KC_PAST,KC_P1,KC_P2,KC_P3,KC_PENT,_______, KC_ENT,KC_PGUP, \ + KC_LSFT,_______,_______,_______, _______,_______, KC_P0,KC_P0,KC_PCMM,KC_PDOT,KC_BSPC,KC_RSFT, KC_UP, KC_PGDN, \ + KC_LCTRL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,TO(_BL),KC_RCTRL,KC_LEFT,KC_DOWN, KC_RGHT), + +}; diff --git a/keyboards/tada68/keymaps/abishalom/readme.md b/keyboards/tada68/keymaps/abishalom/readme.md new file mode 100644 index 000000000..511704223 --- /dev/null +++ b/keyboards/tada68/keymaps/abishalom/readme.md @@ -0,0 +1,6 @@ +# Godolphins13 Tada68 + +My Tada68 layout. +Caps lock acts as a function key when held, otherwise just caps lock. +In the function layer, arrow keys mapped to both wasd and ijkl, as I haven't really decided which I like best. + diff --git a/keyboards/tada68/keymaps/abishalom/rules.mk b/keyboards/tada68/keymaps/abishalom/rules.mk new file mode 100644 index 000000000..b3eaa6215 --- /dev/null +++ b/keyboards/tada68/keymaps/abishalom/rules.mk @@ -0,0 +1,18 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend +TAP_DANCE_ENABLE = yes # Tappa Dance Bitch From 90f9fb4eee0da25e5408e54ed872c6da2a40c5f3 Mon Sep 17 00:00:00 2001 From: mtei <2170248+mtei@users.noreply.github.com> Date: Fri, 5 Oct 2018 14:54:22 +0900 Subject: [PATCH 571/788] Fixed docs/newbs_testing_debugging.md and tmk_core/common/print.h --- docs/newbs_testing_debugging.md | 2 +- tmk_core/common/print.h | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/newbs_testing_debugging.md b/docs/newbs_testing_debugging.md index 1d8021dec..45509110a 100644 --- a/docs/newbs_testing_debugging.md +++ b/docs/newbs_testing_debugging.md @@ -28,6 +28,6 @@ Sometimes it's useful to print debug messages from within your [custom code](cus After that you can use a few different print functions: * `print("string")`: Print a simple string. -* `sprintf("%s string", var)`: Print a formatted string +* `uprintf("%s string", var)`: Print a formatted string * `dprint("string")` Print a simple string, but only when debug mode is enabled * `dprintf("%s string", var)`: Print a formatted string, but only when debug mode is enabled diff --git a/tmk_core/common/print.h b/tmk_core/common/print.h index 06c6cbd7f..2d7184bd0 100644 --- a/tmk_core/common/print.h +++ b/tmk_core/common/print.h @@ -60,7 +60,7 @@ # define println(s) xputs(PSTR(s "\r\n")) # define uprint(s) print(s) # define uprintln(s) println(s) -# define uprintf(fmt, ...) xprintf(fmt, ...) +# define uprintf(fmt, ...) xprintf(fmt, ##__VA_ARGS__) # endif /* USER_PRINT / NORMAL PRINT */ @@ -125,7 +125,7 @@ void print_set_sendchar(int8_t (*print_sendchar_func)(uint8_t)); # define println(s) xprintf(s "\r\n") # define uprint(s) print(s) # define uprintln(s) println(s) -# define uprintf(fmt, ...) xprintf(fmt, ...) +# define uprintf(fmt, ...) xprintf(fmt, ##__VA_ARGS__) # endif /* USER_PRINT / NORMAL PRINT */ @@ -141,19 +141,19 @@ void print_set_sendchar(int8_t (*print_sendchar_func)(uint8_t)); # define xprintf(fmt, ...) // Create user print defines -# define uprintf(fmt, ...) __xprintf(fmt, ...) +# define uprintf(fmt, ...) __xprintf(fmt, ##__VA_ARGS__) # define uprint(s) xprintf(s) # define uprintln(s) xprintf(s "\r\n") # else /* NORMAL PRINT */ // Create user & normal print defines -# define xprintf(fmt, ...) __xprintf(fmt, ...) +# define xprintf(fmt, ...) __xprintf(fmt, ##__VA_ARGS__) # define print(s) xprintf(s) # define println(s) xprintf(s "\r\n") # define uprint(s) print(s) # define uprintln(s) println(s) -# define uprintf(fmt, ...) xprintf(fmt, ...) +# define uprintf(fmt, ...) xprintf(fmt, ##__VA_ARGS__) # endif /* USER_PRINT / NORMAL PRINT */ From d79b5e67b691e367897a24008ec3f2188b1642f3 Mon Sep 17 00:00:00 2001 From: John Pettigrew Date: Tue, 27 Nov 2018 15:43:48 -0600 Subject: [PATCH 572/788] Puck Macropad (#4274) * Add Puck * Update Manufacturer name in metadata * Add num lock to high layer * update pins * update pin settings * fix numlock key * Cleanup config.h * Update device info * updates after review --- keyboards/puck/config.h | 31 +++++++++++ keyboards/puck/keymaps/default/keymap.c | 64 +++++++++++++++++++++++ keyboards/puck/puck.c | 1 + keyboards/puck/puck.h | 15 ++++++ keyboards/puck/readme.md | 11 ++++ keyboards/puck/rules.mk | 68 +++++++++++++++++++++++++ 6 files changed, 190 insertions(+) create mode 100644 keyboards/puck/config.h create mode 100644 keyboards/puck/keymaps/default/keymap.c create mode 100644 keyboards/puck/puck.c create mode 100644 keyboards/puck/puck.h create mode 100644 keyboards/puck/readme.md create mode 100644 keyboards/puck/rules.mk diff --git a/keyboards/puck/config.h b/keyboards/puck/config.h new file mode 100644 index 000000000..b2cb1b23e --- /dev/null +++ b/keyboards/puck/config.h @@ -0,0 +1,31 @@ +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER OkKeebs LLC +#define PRODUCT Puck +#define DESCRIPTION 4x3 macropad + +/* key matrix size */ +#define MATRIX_ROWS 4 +#define MATRIX_COLS 3 + +#define MATRIX_ROW_PINS { D2, D3, C6, C7 } +#define MATRIX_COL_PINS { B4, D7, D6 } +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION ROW2COL + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* number of backlight levels */ +#define BACKLIGHT_LEVELS 3 + +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE diff --git a/keyboards/puck/keymaps/default/keymap.c b/keyboards/puck/keymaps/default/keymap.c new file mode 100644 index 000000000..6ba70a88b --- /dev/null +++ b/keyboards/puck/keymaps/default/keymap.c @@ -0,0 +1,64 @@ +#include QMK_KEYBOARD_H + +#define _BL 0 +#define _HL 1 +#define _LL 2 + +enum keycodes { + LOW, + HIGH +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* + * Base Layer (Numbers) + */ + [_BL] = LAYOUT( + KC_KP_7, KC_KP_8, KC_KP_9, + KC_KP_4, KC_KP_5, KC_KP_6, + KC_KP_1, KC_KP_2, KC_KP_3, + LOW, KC_KP_0, HIGH + ), + /* + * High Layer (Work) + */ + [_HL] = LAYOUT( + KC_NUMLOCK, KC_PAST, KC_NO, + KC_PMNS, KC_PENT, KC_PPLS, + KC_NO, KC_PSLS, KC_NO, + KC_NO, KC_PDOT, KC_NO + ), + /* + * Low Layer (Media) + */ + [_LL] = LAYOUT( + KC_NO, KC_VOLU, KC_NO, + KC_MPRV, KC_MPLY, KC_MNXT, + KC_NO, KC_VOLD, KC_NO, + KC_NO, KC_NO, KC_NO + ), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch(keycode) { + case HIGH: + if (record->event.pressed) { + layer_on(_HL); + }else{ + layer_off(_HL); + layer_off(_LL); + } + return false; + break; + case LOW: + if (record->event.pressed) { + layer_on(_LL); + }else{ + layer_off(_LL); + layer_off(_HL); + } + return false; + break; + } + return true; +} diff --git a/keyboards/puck/puck.c b/keyboards/puck/puck.c new file mode 100644 index 000000000..0e26b9c3c --- /dev/null +++ b/keyboards/puck/puck.c @@ -0,0 +1 @@ +#include "puck.h" diff --git a/keyboards/puck/puck.h b/keyboards/puck/puck.h new file mode 100644 index 000000000..4467614fd --- /dev/null +++ b/keyboards/puck/puck.h @@ -0,0 +1,15 @@ +#ifndef PUCK_H +#define PUCK_H + +#include "quantum.h" + +#define LAYOUT( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B \ +) { \ + { K00, K01, K02 }, \ + { K03, K04, K05 }, \ + { K06, K07, K08 }, \ + { K09, K0A, K0B }, \ +} + +#endif diff --git a/keyboards/puck/readme.md b/keyboards/puck/readme.md new file mode 100644 index 000000000..45e438c47 --- /dev/null +++ b/keyboards/puck/readme.md @@ -0,0 +1,11 @@ +A 4 x 3 macropad. + +Keyboard Maintainer: [john-pettigrew](https://github.com/john-pettigrew) +Hardware Supported: Puck PCB. +Hardware Availability: [OkKeebs.com](https://okkeebs.com/products/puck-pcb) + +Make example for this keyboard (after setting up your build environment): + + make puck:default + +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). diff --git a/keyboards/puck/rules.mk b/keyboards/puck/rules.mk new file mode 100644 index 000000000..48144534d --- /dev/null +++ b/keyboards/puck/rules.mk @@ -0,0 +1,68 @@ + + +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +BOOTLOADER = halfkay + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend From 82c02d9b8d30cac7ab0b0d21e9d81c1a70df73c1 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Tue, 27 Nov 2018 13:45:01 -0800 Subject: [PATCH 573/788] Update MSYS to use the 5.4.0 toolchain (#4106) --- util/msys2_install.sh | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/util/msys2_install.sh b/util/msys2_install.sh index d9459580c..a0548ad9b 100755 --- a/util/msys2_install.sh +++ b/util/msys2_install.sh @@ -13,9 +13,11 @@ source "$dir/win_shared_install.sh" function install_avr { rm -f -r "$avrtools" - wget "http://ww1.microchip.com/downloads/en/DeviceDoc/avr8-gnu-toolchain-installer-3.5.4.91-win32.any.x86.exe" - 7z x avr8-gnu-toolchain-installer-3.5.4.91-win32.any.x86.exe - rm avr8-gnu-toolchain-installer-3.5.4.91-win32.any.x86.exe + wget "http://ww1.microchip.com/downloads/en/DeviceDoc/avr8-gnu-toolchain-3.6.1.1752-win32.any.x86.zip" + 7z x avr8-gnu-toolchain-3.6.1.1752-win32.any.x86.zip + mv avr8-gnu-toolchain-win32_x86/ avr8-gnu-toolchain + rm __MACOSX -R + rm avr8-gnu-toolchain-3.6.1.1752-win32.any.x86.zip pacman --needed -S mingw-w64-x86_64-avrdude } From 929e6a3231d7b873bad475a7040f140712fb9c9d Mon Sep 17 00:00:00 2001 From: Alex Mayer Date: Tue, 27 Nov 2018 17:00:01 -0500 Subject: [PATCH 574/788] Ergodox EZ: Remove Unused Code From Keymap --- keyboards/ergodox_ez/keymaps/default/keymap.c | 23 ------------------- 1 file changed, 23 deletions(-) diff --git a/keyboards/ergodox_ez/keymaps/default/keymap.c b/keyboards/ergodox_ez/keymaps/default/keymap.c index 49de60773..0cd6d6c2c 100644 --- a/keyboards/ergodox_ez/keymaps/default/keymap.c +++ b/keyboards/ergodox_ez/keymaps/default/keymap.c @@ -145,24 +145,6 @@ const uint16_t PROGMEM fn_actions[] = { [1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols) }; -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - // MACRODOWN only works in this function - switch(id) { - case 0: - if (record->event.pressed) { - SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); - } - break; - case 1: - if (record->event.pressed) { // For resetting EEPROM - eeconfig_init(); - } - break; - } - return MACRO_NONE; -}; - bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch (keycode) { // dynamically generate these. @@ -197,11 +179,6 @@ void matrix_init_user(void) { #endif }; -// Runs constantly in the background, in a loop. -void matrix_scan_user(void) { - -}; - // Runs whenever there is a layer state change. uint32_t layer_state_set_user(uint32_t state) { ergodox_board_led_off(); From 6983c71efd9991e7f6b8290dff24a023bbe4eeb1 Mon Sep 17 00:00:00 2001 From: Alex Mayer Date: Tue, 27 Nov 2018 17:04:29 -0500 Subject: [PATCH 575/788] Ergodox EZ: Clean Up process_record_user Function Set ERPM = SAFE_RANGE --- keyboards/ergodox_ez/keymaps/default/keymap.c | 35 +++++++------------ 1 file changed, 13 insertions(+), 22 deletions(-) diff --git a/keyboards/ergodox_ez/keymaps/default/keymap.c b/keyboards/ergodox_ez/keymaps/default/keymap.c index 0cd6d6c2c..12d6cf6fa 100644 --- a/keyboards/ergodox_ez/keymaps/default/keymap.c +++ b/keyboards/ergodox_ez/keymaps/default/keymap.c @@ -6,8 +6,7 @@ #define MDIA 2 // media keys enum custom_keycodes { - PLACEHOLDER = SAFE_RANGE, // can always be here - EPRM, + EPRM = SAFE_RANGE, VRSN, RGB_SLD }; @@ -146,28 +145,20 @@ const uint16_t PROGMEM fn_actions[] = { }; bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - // dynamically generate these. - case EPRM: - if (record->event.pressed) { + if (record->event.pressed) { + switch (keycode) { + case EPRM: eeconfig_init(); - } - return false; - break; - case VRSN: - if (record->event.pressed) { + return false; + case VRSN: SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); - } - return false; - break; - case RGB_SLD: - if (record->event.pressed) { - #ifdef RGBLIGHT_ENABLE - rgblight_mode(1); - #endif - } - return false; - break; + return false; + #ifdef RGBLIGHT_ENABLE + case RGB_SLD: + rgblight_mode(1); + return false; + #endif + } } return true; } From e4dfcf896ef641701564bec5ea1ea7aa81b072bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20=C4=90or=C4=91evi=C4=87?= Date: Tue, 27 Nov 2018 23:29:59 +0100 Subject: [PATCH 576/788] Add tap_code16 function (#4362) --- quantum/quantum.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/quantum/quantum.h b/quantum/quantum.h index fe670c8eb..41c7d8351 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h @@ -240,8 +240,9 @@ void reset_keyboard(void); void startup_user(void); void shutdown_user(void); -void register_code16 (uint16_t code); -void unregister_code16 (uint16_t code); +void register_code16(uint16_t code); +void unregister_code16(uint16_t code); +inline void tap_code16(uint16_t code) { register_code16(code); unregister_code16(code); } #ifdef BACKLIGHT_ENABLE void backlight_init_ports(void); From dd7534cccabd9e1cea86e69741ed8c68cb3d0299 Mon Sep 17 00:00:00 2001 From: epaew Date: Wed, 28 Nov 2018 08:18:11 +0900 Subject: [PATCH 577/788] Keyboard: fix for debug crkbd (#4469) --- keyboards/crkbd/crkbd.c | 10 +++++++--- keyboards/crkbd/rev1/split_scomm.c | 5 ++--- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/keyboards/crkbd/crkbd.c b/keyboards/crkbd/crkbd.c index 32f7af776..d420ccda2 100644 --- a/keyboards/crkbd/crkbd.c +++ b/keyboards/crkbd/crkbd.c @@ -1,6 +1,10 @@ #include "crkbd.h" -#include "ssd1306.h" +#include "ssd1306.h" bool process_record_kb(uint16_t keycode, keyrecord_t *record) { - return process_record_gfx(keycode,record) && process_record_user(keycode, record); -} \ No newline at end of file +#ifdef SSD1306OLED + return process_record_gfx(keycode,record) && process_record_user(keycode, record); +#else + return process_record_user(keycode, record); +#endif +} diff --git a/keyboards/crkbd/rev1/split_scomm.c b/keyboards/crkbd/rev1/split_scomm.c index ada786796..a1fe6ba5b 100644 --- a/keyboards/crkbd/rev1/split_scomm.c +++ b/keyboards/crkbd/rev1/split_scomm.c @@ -63,10 +63,9 @@ int serial_update_buffers(int master_update) if( smatstatus == TRANSACTION_END ) { s_change_old = s_change_new; #ifdef CONSOLE_ENABLE - uprintf("slave matrix = %b %b %b %b %b\n", + uprintf("slave matrix = %b %b %b %b\n", serial_slave_buffer[0], serial_slave_buffer[1], - serial_slave_buffer[2], serial_slave_buffer[3], - serial_slave_buffer[4] ); + serial_slave_buffer[2], serial_slave_buffer[3]); #endif } } else { From 55c32148779baf1dcacb3bedc74f8179a1e0b2d7 Mon Sep 17 00:00:00 2001 From: Christon DeWan Date: Tue, 27 Nov 2018 15:20:17 -0800 Subject: [PATCH 578/788] fixed misplaced paranthesis in arm usb mouse send function (#4478) bug was causing lots of dropped events for me. --- tmk_core/protocol/chibios/usb_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index 3028e7ea2..8223d9722 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c @@ -704,7 +704,7 @@ void send_mouse(report_mouse_t *report) { * every iteration - otherwise the system will remain locked, * no interrupts served, so USB not going through as well. * Note: for suspend, need USB_USE_WAIT == TRUE in halconf.h */ - if (osalThreadSuspendTimeoutS(&(&USB_DRIVER)->epc[MOUSE_IN_EPNUM]->in_state->thread, MS2ST(10)==MSG_TIMEOUT)) { + if (osalThreadSuspendTimeoutS(&(&USB_DRIVER)->epc[MOUSE_IN_EPNUM]->in_state->thread, MS2ST(10))==MSG_TIMEOUT) { osalSysUnlock(); return; } From 19043197459c5c8ed4a7039f1a4c1da180da45e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20=C4=90or=C4=91evi=C4=87?= Date: Wed, 28 Nov 2018 00:34:06 +0100 Subject: [PATCH 579/788] Remove RGB_SMOD alias and replace uses with RGB_MOD (#4319) --- docs/feature_rgblight.md | 2 -- keyboards/bface/keymaps/default/keymap.c | 2 +- keyboards/crkbd/keymaps/default/keymap.c | 4 ++-- keyboards/crkbd/keymaps/like_jis/keymap.c | 4 ++-- keyboards/daisy/keymaps/default/keymap.c | 2 +- keyboards/do60/keymaps/default/keymap.c | 2 +- keyboards/do60/keymaps/test/keymap.c | 2 +- keyboards/handwired/woodpad/keymaps/drashna/keymap.c | 2 +- keyboards/helix/pico/keymaps/default/keymap.c | 2 +- keyboards/helix/rev2/keymaps/default/keymap.c | 4 ++-- keyboards/helix/rev2/keymaps/five_rows/README.md | 2 +- keyboards/helix/rev2/keymaps/five_rows/README_jp.md | 2 +- keyboards/helix/rev2/keymaps/five_rows/keymap.c | 2 +- keyboards/helix/rev2/keymaps/five_rows_jis/keymap.c | 2 +- keyboards/helix/rev2/keymaps/yshrsmz/keymap.c | 4 ++-- keyboards/jj40/keymaps/like_jis/keymap.c | 4 ++-- keyboards/nyquist/keymaps/kim-kim/keymap.c | 2 +- keyboards/pearl/keymaps/jetpacktuxedo/keymap.c | 2 +- keyboards/playkbtw/ca66/keymaps/olivia/keymap.c | 2 +- keyboards/xd75/keymaps/kim-kim/keymap.c | 2 +- quantum/quantum_keycodes.h | 1 - users/turbomech/backupturbomech.c | 1 - 22 files changed, 24 insertions(+), 28 deletions(-) diff --git a/docs/feature_rgblight.md b/docs/feature_rgblight.md index 0205ebe91..4610467b0 100644 --- a/docs/feature_rgblight.md +++ b/docs/feature_rgblight.md @@ -63,8 +63,6 @@ Changing the **Value** sets the overall brightness. |`RGB_MODE_GRADIENT`|`RGB_M_G` |Static gradient animation mode | |`RGB_MODE_RGBTEST` |`RGB_M_T` |Red, Green, Blue test animation mode | -?> For backwards compatibility, `RGB_SMOD` is another alias of `RGB_MOD`. - ## Configuration Your RGB lighting can be configured by placing these `#define`s in your `config.h`: diff --git a/keyboards/bface/keymaps/default/keymap.c b/keyboards/bface/keymaps/default/keymap.c index c29ce9abf..9c41014bc 100644 --- a/keyboards/bface/keymaps/default/keymap.c +++ b/keyboards/bface/keymaps/default/keymap.c @@ -29,7 +29,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,BL_INC, BL_DEC, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, - KC_TRNS,KC_TRNS,RGB_SMOD,KC_TRNS,BL_ON, BL_OFF, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, + KC_TRNS,KC_TRNS,RGB_MOD,KC_TRNS,BL_ON, BL_OFF, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS ), /* You can copy this layer as base for a new fn layer * / diff --git a/keyboards/crkbd/keymaps/default/keymap.c b/keyboards/crkbd/keymaps/default/keymap.c index c7c9582e8..1e2e57a2b 100644 --- a/keyboards/crkbd/keymaps/default/keymap.c +++ b/keyboards/crkbd/keymaps/default/keymap.c @@ -52,7 +52,7 @@ enum macro_keycodes { #define KC_LSAD RGB_SAD #define KC_LVAI RGB_VAI #define KC_LVAD RGB_VAD -#define KC_LSMOD RGB_SMOD +#define KC_LMOD RGB_MOD #define KC_CTLTB CTL_T(KC_TAB) #define KC_GUIEI GUI_T(KC_LANG2) #define KC_ALTKN ALT_T(KC_LANG1) @@ -100,7 +100,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //|------+------+------+------+------+------| |------+------+------+------+------+------| LTOG, LHUI, LSAI, LVAI, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,\ //|------+------+------+------+------+------| |------+------+------+------+------+------| - LSMOD, LHUD, LSAD, LVAD, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,\ + LMOD, LHUD, LSAD, LVAD, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,\ //|------+------+------+------+------+------+------| |------+------+------+------+------+------+------| GUIEI, LOWER, SPC, ENT, RAISE, ALTKN \ //`--------------------' `--------------------' diff --git a/keyboards/crkbd/keymaps/like_jis/keymap.c b/keyboards/crkbd/keymaps/like_jis/keymap.c index 05d31845c..42d36de44 100644 --- a/keyboards/crkbd/keymaps/like_jis/keymap.c +++ b/keyboards/crkbd/keymaps/like_jis/keymap.c @@ -50,7 +50,7 @@ enum custom_keycodes { #define KC_LSAD RGB_SAD #define KC_LVAI RGB_VAI #define KC_LVAD RGB_VAD -#define KC_LSMOD RGB_SMOD +#define KC_LMOD RGB_MOD #define KC_KNRM AG_NORM #define KC_KSWP AG_SWAP @@ -99,7 +99,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //|------+-------+------+------+------+-----| |------+------+------+------+------+------| _____, LTOG, LHUI, LSAI, LVAI,XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, PGUP, XXXXX,\ //|------+-------+------+------+------+-----| |------+------+------+------+------+------| - _____, LSMOD, LHUD, LSAD, LVAD,XXXXX, XXXXX, XXXXX, XXXXX, HOME, PGDN, END,\ + _____, LMOD, LHUD, LSAD, LVAD,XXXXX, XXXXX, XXXXX, XXXXX, HOME, PGDN, END,\ //|------+------+------+------+------+------+------| |------+------+------+------+------+------+------| _____, _____, XXXXX, _____, _____, XXXXX \ //`--------------------' `--------------------' diff --git a/keyboards/daisy/keymaps/default/keymap.c b/keyboards/daisy/keymaps/default/keymap.c index 833620b01..f1a5e353f 100644 --- a/keyboards/daisy/keymaps/default/keymap.c +++ b/keyboards/daisy/keymaps/default/keymap.c @@ -64,7 +64,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_RS] = LAYOUT( RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_TRNS, KC_HOME, KC_PGUP, KC_TRNS, KC_TRNS, KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_END, KC_PGDN, KC_TRNS, - KC_TRNS, RGB_TOG, RGB_SMOD, RGB_HUD, RGB_HUI, RGB_VAD, RGB_VAI, RGB_SAD, RGB_SAI, BL_STEP, KC_TRNS, + KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_VAD, RGB_VAI, RGB_SAD, RGB_SAI, BL_STEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), diff --git a/keyboards/do60/keymaps/default/keymap.c b/keyboards/do60/keymaps/default/keymap.c index 1a8b98a46..7c66f0ac0 100644 --- a/keyboards/do60/keymaps/default/keymap.c +++ b/keyboards/do60/keymaps/default/keymap.c @@ -15,7 +15,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_all( RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NO, KC_NO, \ KC_NO, RGB_HUI, RGB_SAI, RGB_VAI, RGB_MOD, BL_TOGG,BL_ON, BL_INC, KC_INS, KC_NO, KC_PSCR, KC_SLCK, KC_PAUS, KC_DEL, \ - KC_NO, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SMOD, BL_STEP,BL_OFF, BL_DEC, KC_NO, KC_NO, KC_HOME, KC_PGUP, KC_NO, KC_ENT, \ + KC_NO, RGB_HUD, RGB_SAD, RGB_VAD, RGB_RMOD, BL_STEP,BL_OFF, BL_DEC, KC_NO, KC_NO, KC_HOME, KC_PGUP, KC_NO, KC_ENT, \ KC_LSFT, KC_NO, KC_NO, KC_APP, BL_STEP, KC_NO, KC_NO, KC_VOLD,KC_VOLU,KC_MUTE, KC_END, KC_RSFT, KC_NO , KC_PGUP, KC_INS, \ KC_LCTL, KC_LGUI, KC_LALT, KC_BSPC,KC_SPC, KC_DEL, KC_RGUI, F(0), KC_HOME, KC_PGDOWN,KC_END), diff --git a/keyboards/do60/keymaps/test/keymap.c b/keyboards/do60/keymaps/test/keymap.c index 04b5f44bb..6bac713fd 100644 --- a/keyboards/do60/keymaps/test/keymap.c +++ b/keyboards/do60/keymaps/test/keymap.c @@ -15,7 +15,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_all( RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NO, KC_NO, \ KC_NO, RGB_HUI, RGB_SAI, RGB_VAI, RGB_MOD, KC_HOME,KC_CALC,KC_NO, KC_INS, KC_NO, KC_PSCR, KC_SLCK, KC_PAUS, KC_DEL, \ - KC_NO, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SMOD, KC_END, KC_PGDN,KC_NO, KC_NO, KC_NO, KC_HOME, KC_PGUP, KC_NO, KC_ENT, \ + KC_NO, RGB_HUD, RGB_SAD, RGB_VAD, RGB_RMOD, KC_END, KC_PGDN,KC_NO, KC_NO, KC_NO, KC_HOME, KC_PGUP, KC_NO, KC_ENT, \ KC_LSFT, KC_NO, KC_NO, KC_APP, BL_STEP, KC_NO, KC_NO, KC_VOLD,KC_VOLU,KC_MUTE, KC_END, KC_RSFT, KC_NO , KC_PGUP, KC_INS, \ KC_LCTL, KC_LGUI, KC_LALT, KC_BSPC,KC_SPC, KC_DEL, KC_RGUI, F(0), KC_HOME, KC_PGDOWN,KC_END), diff --git a/keyboards/handwired/woodpad/keymaps/drashna/keymap.c b/keyboards/handwired/woodpad/keymaps/drashna/keymap.c index fd1ff0053..f7df5eac7 100644 --- a/keyboards/handwired/woodpad/keymaps/drashna/keymap.c +++ b/keyboards/handwired/woodpad/keymaps/drashna/keymap.c @@ -64,7 +64,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_RESET, KC_MUTE, KC_VOLD, KC_VOLU,\ KC_MAKE, _______, RGB_HUI, RGB_HUD, \ KC_MPLY, KC_MSTP, KC_MPRV, KC_MNXT, \ - RGB_TOG, RGB_SMOD, RGB_SAI, RGB_VAI, \ + RGB_TOG, RGB_MOD, RGB_SAI, RGB_VAI, \ _______, KC_RGB_T, RGB_SAD, RGB_VAD \ ), diff --git a/keyboards/helix/pico/keymaps/default/keymap.c b/keyboards/helix/pico/keymaps/default/keymap.c index 4c5878517..5273bb4a0 100644 --- a/keyboards/helix/pico/keymaps/default/keymap.c +++ b/keyboards/helix/pico/keymaps/default/keymap.c @@ -164,7 +164,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ _______, AU_ON, AU_OFF, MU_TOG, MU_MOD, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ _______, CK_TOGG, CK_RST, CK_UP, CK_DOWN, _______, _______, _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SMOD,RGB_HUD, RGB_SAD, RGB_VAD \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD \ ) }; diff --git a/keyboards/helix/rev2/keymaps/default/keymap.c b/keyboards/helix/rev2/keymaps/default/keymap.c index 92393208c..0fb821aff 100644 --- a/keyboards/helix/rev2/keymaps/default/keymap.c +++ b/keyboards/helix/rev2/keymaps/default/keymap.c @@ -183,7 +183,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, RESET, RGBRST, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SMOD,RGB_HUD, RGB_SAD, RGB_VAD \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD \ ) }; @@ -296,7 +296,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SMOD,RGB_HUD, RGB_SAD, RGB_VAD \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD \ ) }; diff --git a/keyboards/helix/rev2/keymaps/five_rows/README.md b/keyboards/helix/rev2/keymaps/five_rows/README.md index 4feaac2ef..10a4fa942 100644 --- a/keyboards/helix/rev2/keymaps/five_rows/README.md +++ b/keyboards/helix/rev2/keymaps/five_rows/README.md @@ -46,7 +46,7 @@ Mac mode swap Alt/Win(GUI) key. | ---- | ---- | --- | |on/off|Adjust + e(Qwerty)|RGB_TOG| | |Adjust + i(Qwerty)| | -|change mode|Adjust + d(Qwerty) |RGB_SMOD| +|change mode|Adjust + d(Qwerty) |RGB_MOD| | |Adjust + k(Qwerty)| | |HUE +|Adjust + Left Control|RGB_HUI| | |Adjust + Right Control| | diff --git a/keyboards/helix/rev2/keymaps/five_rows/README_jp.md b/keyboards/helix/rev2/keymaps/five_rows/README_jp.md index 932e200a5..317ffdd71 100644 --- a/keyboards/helix/rev2/keymaps/five_rows/README_jp.md +++ b/keyboards/helix/rev2/keymaps/five_rows/README_jp.md @@ -68,7 +68,7 @@ Winモードでは、該当のキーはどちらも共に Alt + `(日本語IME | ---- | ---- | --- | |オン/オフ|Adjust + e(Qwerty)|RGB_TOG| | |Adjust + i(Qwerty)| | -|モード切り替え|Adjust + d(Qwerty) |RGB_SMOD| +|モード切り替え|Adjust + d(Qwerty) |RGB_MOD| | |Adjust + k(Qwerty)| | |色相 +|Adjust + Left Control|RGB_HUI| | |Adjust + Right Control| | diff --git a/keyboards/helix/rev2/keymaps/five_rows/keymap.c b/keyboards/helix/rev2/keymaps/five_rows/keymap.c index 983bbe937..e293f5900 100644 --- a/keyboards/helix/rev2/keymaps/five_rows/keymap.c +++ b/keyboards/helix/rev2/keymaps/five_rows/keymap.c @@ -280,7 +280,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_ADJUST] = LAYOUT( \ XXXXXXX, KEYPAD, DVORAK, COLEMAK, EUCALYN, QWERTY, QWERTY, EUCALYN, COLEMAK, DVORAK, KEYPAD, XXXXXXX, \ XXXXXXX, RESET, RGBRST, RGB_TOG, AU_ON, AG_SWAP, AG_SWAP, AU_ON, RGB_TOG, RGBRST, XXXXXXX, XXXXXXX, \ - RGB_HUI, RGB_SAI, RGB_VAI,RGB_SMOD, AU_OFF, AG_NORM, AG_NORM, AU_OFF,RGB_SMOD, RGB_VAI, RGB_SAI, RGB_HUI, \ + RGB_HUI, RGB_SAI, RGB_VAI, RGB_MOD, AU_OFF, AG_NORM, AG_NORM, AU_OFF, RGB_MOD, RGB_VAI, RGB_SAI, RGB_HUI, \ RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, RGB_VAD, RGB_SAD, RGB_HUD, \ _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______ \ ), diff --git a/keyboards/helix/rev2/keymaps/five_rows_jis/keymap.c b/keyboards/helix/rev2/keymaps/five_rows_jis/keymap.c index df00366e3..8c2040d5b 100644 --- a/keyboards/helix/rev2/keymaps/five_rows_jis/keymap.c +++ b/keyboards/helix/rev2/keymaps/five_rows_jis/keymap.c @@ -204,7 +204,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { XXXXXXX, RESET, RGBRST, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET, RGBRST, XXXXXXX, XXXXXXX, XXXXXXX, \ XXXXXXX, DL_BAS, DL_BASE, AG_NORM, AG_SWAP, XXXXXXX, XXXXXXX, DL_BAS, DL_BASE, AG_NORM, AG_SWAP, XXXXXXX, \ XXXXXXX, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, XXXXXXX, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, \ - XXXXXXX, RGB_SMOD,RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_SMOD,RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, \ + XXXXXXX, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ ), }; diff --git a/keyboards/helix/rev2/keymaps/yshrsmz/keymap.c b/keyboards/helix/rev2/keymaps/yshrsmz/keymap.c index 049a864c1..1bde66e88 100644 --- a/keyboards/helix/rev2/keymaps/yshrsmz/keymap.c +++ b/keyboards/helix/rev2/keymaps/yshrsmz/keymap.c @@ -158,7 +158,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, _______, _______, _______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SMOD,RGB_HUD, RGB_SAD, RGB_VAD \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD \ ) }; @@ -253,7 +253,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, _______, _______, _______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SMOD,RGB_HUD, RGB_SAD, RGB_VAD \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD \ ) }; diff --git a/keyboards/jj40/keymaps/like_jis/keymap.c b/keyboards/jj40/keymaps/like_jis/keymap.c index 4724933ea..24db91947 100644 --- a/keyboards/jj40/keymaps/like_jis/keymap.c +++ b/keyboards/jj40/keymaps/like_jis/keymap.c @@ -30,7 +30,7 @@ enum custom_keycodes { #define KC_LSAD RGB_SAD #define KC_LVAI RGB_VAI #define KC_LVAD RGB_VAD -#define KC_LSMOD RGB_SMOD +#define KC_LMOD RGB_MOD #define KC_BTOG BL_TOGG #define KC_BINC BL_INC #define KC_BDEC BL_DEC @@ -90,7 +90,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //|------+------+------+------+------+------|------+------+------+------+------+------| XXXXX, LTOG, LHUI, LSAI, LVAI, BTOG, BINC, WH_R, WH_D, END, PGDN, XXXXX,\ //|------+------+------+------+------+------|------+------+------+------+------+------| - XXXXX, LSMOD, LHUD, LSAD, LVAD, XXXXX, BDEC, XXXXX, BTN1, BTN2, MS_U, XXXXX,\ + XXXXX, LMOD, LHUD, LSAD, LVAD, XXXXX, BDEC, XXXXX, BTN1, BTN2, MS_U, XXXXX,\ //|------+------+------+------+------+-------------+------+------+------+------+------| _____, _____, _____, _____, _____, XXXXX, XXXXX, _____, _____, MS_L, MS_D, MS_R \ //|------+------+------+------+------+-------------+------+------+------+------+------| diff --git a/keyboards/nyquist/keymaps/kim-kim/keymap.c b/keyboards/nyquist/keymaps/kim-kim/keymap.c index c8b081b25..4051f296e 100644 --- a/keyboards/nyquist/keymaps/kim-kim/keymap.c +++ b/keyboards/nyquist/keymaps/kim-kim/keymap.c @@ -53,7 +53,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_LW] = LAYOUT( \ _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, _______, _______, _______, _______, _______, \ _______, KC_MPRV, KC_MNXT, KC_VOLU, RGB_TOG, KC_F11, _______, _______, _______, _______, _______, _______, \ - _______, KC_MPLY, KC_MSTP, KC_VOLD, RGB_SMOD, _______, _______, _______, _______, _______, _______, _______, \ + _______, KC_MPLY, KC_MSTP, KC_VOLD, RGB_MOD, _______, _______, _______, _______, _______, _______, _______, \ _______, _______, _______, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ ), diff --git a/keyboards/pearl/keymaps/jetpacktuxedo/keymap.c b/keyboards/pearl/keymaps/jetpacktuxedo/keymap.c index b94fb673f..759c6fdc7 100644 --- a/keyboards/pearl/keymaps/jetpacktuxedo/keymap.c +++ b/keyboards/pearl/keymaps/jetpacktuxedo/keymap.c @@ -10,7 +10,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_all( KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_QUOT, KC_TRNS, - KC_TRNS, RGB_TOG, RGB_SMOD, RGB_VAI, RGB_VAD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_BSLS, KC_TRNS, + KC_TRNS, RGB_TOG, RGB_MOD, RGB_VAI, RGB_VAD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_BSLS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DEL, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), [2] = LAYOUT_all( diff --git a/keyboards/playkbtw/ca66/keymaps/olivia/keymap.c b/keyboards/playkbtw/ca66/keymaps/olivia/keymap.c index f27824e57..ed3d625e4 100644 --- a/keyboards/playkbtw/ca66/keymaps/olivia/keymap.c +++ b/keyboards/playkbtw/ca66/keymaps/olivia/keymap.c @@ -11,7 +11,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LAYOUT( KC_PWR, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, RESET, - KC_CAPS, RGB_RMOD,RGB_SMOD,RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_TOG, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, + KC_CAPS, RGB_RMOD,RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_TOG, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_EJCT, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), diff --git a/keyboards/xd75/keymaps/kim-kim/keymap.c b/keyboards/xd75/keymaps/kim-kim/keymap.c index 85c000230..0ec506e17 100644 --- a/keyboards/xd75/keymaps/kim-kim/keymap.c +++ b/keyboards/xd75/keymaps/kim-kim/keymap.c @@ -67,7 +67,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_LW] = { /* LOWERED */ { _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11, _______, _______, _______, _______, _______, _______, _______, _______ }, { _______, KC_MPRV, KC_MNXT, KC_VOLU, _______, _______, RGB_TOG, _______, _______, _______, _______, _______, _______, _______, _______ }, - { _______, KC_MPLY, KC_MSTP, KC_VOLD, _______, _______, RGB_SMOD, _______, _______, _______, _______, _______, _______, _______, _______ }, + { _______, KC_MPLY, KC_MSTP, KC_VOLD, _______, _______, RGB_MOD, _______, _______, _______, _______, _______, _______, _______, _______ }, { _______, _______, _______, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, { _______, MO(_RT), MO(_RT), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, }, diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h index 14f8c2b81..7670d53e9 100644 --- a/quantum/quantum_keycodes.h +++ b/quantum/quantum_keycodes.h @@ -581,7 +581,6 @@ enum quantum_keycodes { #define CK_OFF CLICKY_DISABLE #define RGB_MOD RGB_MODE_FORWARD -#define RGB_SMOD RGB_MODE_FORWARD #define RGB_RMOD RGB_MODE_REVERSE #define RGB_M_P RGB_MODE_PLAIN diff --git a/users/turbomech/backupturbomech.c b/users/turbomech/backupturbomech.c index 49bcded55..2815aa452 100644 --- a/users/turbomech/backupturbomech.c +++ b/users/turbomech/backupturbomech.c @@ -269,7 +269,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { /*case RGB_MOD: -case RGB_SMOD: case RGB_HUI: case RGB_HUD: case RGB_SAI: From a495326aed8292138577387d9124a4b980904d37 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Tue, 27 Nov 2018 16:54:43 -0800 Subject: [PATCH 580/788] Turn off Mousekeys for several ps2avrGB keyboards (#4502) * Turn off Mousekeys for jc65 * Turn off Mousekeys for ps2avrGB templates * Disable mousekeys for bmini and canoe as well --- keyboards/bmini/rules.mk | 6 +++--- keyboards/canoe/rules.mk | 6 +++--- keyboards/jc65/v32a/rules.mk | 4 ++-- keyboards/pearl/rules.mk | 8 ++++---- keyboards/ps2avrGB/rules.mk | 6 +++--- quantum/template/ps2avrgb/rules.mk | 4 ++-- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/keyboards/bmini/rules.mk b/keyboards/bmini/rules.mk index 73c361e2a..3d7bc0215 100644 --- a/keyboards/bmini/rules.mk +++ b/keyboards/bmini/rules.mk @@ -26,13 +26,13 @@ F_CPU = 12000000 # Bootloader # This definition is optional, and if your keyboard supports multiple bootloaders of -# different sizes, comment this out, and the correct address will be loaded +# different sizes, comment this out, and the correct address will be loaded # automatically (+60). See bootloader.mk for all options. BOOTLOADER = bootloadHID # build options -BOOTMAGIC_ENABLE = yes -MOUSEKEY_ENABLE = yes +BOOTMAGIC_ENABLE = full +MOUSEKEY_ENABLE = no EXTRAKEY_ENABLE = yes CONSOLE_ENABLE = yes COMMAND_ENABLE = yes diff --git a/keyboards/canoe/rules.mk b/keyboards/canoe/rules.mk index 73c361e2a..3d7bc0215 100644 --- a/keyboards/canoe/rules.mk +++ b/keyboards/canoe/rules.mk @@ -26,13 +26,13 @@ F_CPU = 12000000 # Bootloader # This definition is optional, and if your keyboard supports multiple bootloaders of -# different sizes, comment this out, and the correct address will be loaded +# different sizes, comment this out, and the correct address will be loaded # automatically (+60). See bootloader.mk for all options. BOOTLOADER = bootloadHID # build options -BOOTMAGIC_ENABLE = yes -MOUSEKEY_ENABLE = yes +BOOTMAGIC_ENABLE = full +MOUSEKEY_ENABLE = no EXTRAKEY_ENABLE = yes CONSOLE_ENABLE = yes COMMAND_ENABLE = yes diff --git a/keyboards/jc65/v32a/rules.mk b/keyboards/jc65/v32a/rules.mk index 5c8e63283..fac85172e 100644 --- a/keyboards/jc65/v32a/rules.mk +++ b/keyboards/jc65/v32a/rules.mk @@ -31,8 +31,8 @@ F_CPU = 12000000 BOOTLOADER = bootloadHID # build options -BOOTMAGIC_ENABLE = yes -MOUSEKEY_ENABLE = yes +BOOTMAGIC_ENABLE = full +MOUSEKEY_ENABLE = no EXTRAKEY_ENABLE = yes CONSOLE_ENABLE = yes COMMAND_ENABLE = yes diff --git a/keyboards/pearl/rules.mk b/keyboards/pearl/rules.mk index c5b61c6d3..fac85172e 100644 --- a/keyboards/pearl/rules.mk +++ b/keyboards/pearl/rules.mk @@ -26,13 +26,13 @@ F_CPU = 12000000 # Bootloader # This definition is optional, and if your keyboard supports multiple bootloaders of -# different sizes, comment this out, and the correct address will be loaded +# different sizes, comment this out, and the correct address will be loaded # automatically (+60). See bootloader.mk for all options. BOOTLOADER = bootloadHID # build options -BOOTMAGIC_ENABLE = yes -MOUSEKEY_ENABLE = yes +BOOTMAGIC_ENABLE = full +MOUSEKEY_ENABLE = no EXTRAKEY_ENABLE = yes CONSOLE_ENABLE = yes COMMAND_ENABLE = yes @@ -47,4 +47,4 @@ CUSTOM_MATRIX = yes SRC = matrix.c i2c.c # programming options -PROGRAM_CMD = ./util/atmega32a_program.py $(TARGET).hex \ No newline at end of file +PROGRAM_CMD = ./util/atmega32a_program.py $(TARGET).hex diff --git a/keyboards/ps2avrGB/rules.mk b/keyboards/ps2avrGB/rules.mk index c7c12dcf1..1be9edc24 100644 --- a/keyboards/ps2avrGB/rules.mk +++ b/keyboards/ps2avrGB/rules.mk @@ -26,13 +26,13 @@ F_CPU = 12000000 # Bootloader # This definition is optional, and if your keyboard supports multiple bootloaders of -# different sizes, comment this out, and the correct address will be loaded +# different sizes, comment this out, and the correct address will be loaded # automatically (+60). See bootloader.mk for all options. BOOTLOADER = atmel-dfu # build options -BOOTMAGIC_ENABLE = yes -MOUSEKEY_ENABLE = yes +BOOTMAGIC_ENABLE = full +MOUSEKEY_ENABLE = no EXTRAKEY_ENABLE = yes CONSOLE_ENABLE = yes COMMAND_ENABLE = yes diff --git a/quantum/template/ps2avrgb/rules.mk b/quantum/template/ps2avrgb/rules.mk index 68d50aec6..85603f955 100644 --- a/quantum/template/ps2avrgb/rules.mk +++ b/quantum/template/ps2avrgb/rules.mk @@ -31,8 +31,8 @@ F_CPU = 12000000 BOOTLOADER = bootloadHID # build options -BOOTMAGIC_ENABLE = yes -MOUSEKEY_ENABLE = yes +BOOTMAGIC_ENABLE = full +MOUSEKEY_ENABLE = no EXTRAKEY_ENABLE = yes CONSOLE_ENABLE = yes COMMAND_ENABLE = yes From 6d2730eeff424ee096a334bab9d130e9f26230d0 Mon Sep 17 00:00:00 2001 From: zfhrp6 Date: Thu, 29 Nov 2018 00:33:08 +0900 Subject: [PATCH 581/788] [fortitude60] match default keymap comment to the implementation. (#4508) --- keyboards/fortitude60/keymaps/default/keymap.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/keyboards/fortitude60/keymaps/default/keymap.c b/keyboards/fortitude60/keymaps/default/keymap.c index 9d724a8ec..f0b9964ab 100644 --- a/keyboards/fortitude60/keymaps/default/keymap.c +++ b/keyboards/fortitude60/keymaps/default/keymap.c @@ -41,7 +41,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| * | Shift| Z | X | C | V | B | [ | ] | N | M | , | . | / |Enter | * `-------------+------+------+------+------+------+------+------+------+------+------+-------------' - * | GUI | Ctrl |Lower |Space | Ctrl |Enter |Space |Raise | Alt | GUI | + * | GUI | Alt |Lower |Space | Ctrl |Enter |Space |Raise | Alt | GUI | * `---------------------------------------------------------------------' */ [_QWERTY] = LAYOUT( \ @@ -62,7 +62,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| * | Shift| Z | X | C | V | B | [ | ] | K | M | , | . | / |Enter | * `-------------+------+------+------+------+------+------+------+------+------+------+-------------' - * | GUI | Ctrl |Lower |Space | Ctrl |Enter |Space |Raise | Alt | GUI | + * | GUI | Alt |Lower |Space | Ctrl |Enter |Space |Raise | Alt | GUI | * `---------------------------------------------------------------------' */ [_COLEMAK] = LAYOUT( \ @@ -83,7 +83,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| * | Shift| ; | Q | J | K | X | [ | ] | B | M | W | V | Z |Enter | * `-------------+------+------+------+------+------+------+------+------+------+------+-------------' - * | GUI | Ctrl |Lower |Space | Ctrl |Enter |Space |Raise | Alt | GUI | + * | GUI | Alt |Lower |Space | Ctrl |Enter |Space |Raise | Alt | GUI | * `---------------------------------------------------------------------' */ [_DVORAK] = LAYOUT( \ From 3b42cff51607171285754ced097392332b40b5fd Mon Sep 17 00:00:00 2001 From: Paul Massendari Date: Wed, 28 Nov 2018 16:56:34 +0100 Subject: [PATCH 582/788] Added Rick Roll to song lists (#4510) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🙂 --- quantum/audio/song_list.h | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/quantum/audio/song_list.h b/quantum/audio/song_list.h index e63616a99..994608497 100644 --- a/quantum/audio/song_list.h +++ b/quantum/audio/song_list.h @@ -472,4 +472,34 @@ H__NOTE(_AS4), W__NOTE(_GS4), W__NOTE(_GS4), W__NOTE(_FS4), W__NOTE(_GS4), \ H__NOTE(_AS4), WD_NOTE(_DS4) +#define RICK_ROLL \ + Q__NOTE(_F4), \ + Q__NOTE(_G4), \ + Q__NOTE(_BF4), \ + Q__NOTE(_G4), \ + HD_NOTE(_D5), \ + HD_NOTE(_D5), \ + W__NOTE(_C5), \ + S__NOTE(_REST), \ + Q__NOTE(_F4), \ + Q__NOTE(_G4), \ + Q__NOTE(_BF4), \ + Q__NOTE(_G4), \ + HD_NOTE(_C5), \ + HD_NOTE(_C5), \ + W__NOTE(_BF4), \ + S__NOTE(_REST), \ + Q__NOTE(_F4), \ + Q__NOTE(_G4), \ + Q__NOTE(_BF4), \ + Q__NOTE(_G4), \ + W__NOTE(_BF4), \ + H__NOTE(_C5), \ + H__NOTE(_A4), \ + H__NOTE(_A4), \ + H__NOTE(_G4), \ + H__NOTE(_F4), \ + H__NOTE(_F4), \ + W__NOTE(_C5), \ + W__NOTE(_BF4), #endif From 8b85ec2a987d378fb95eea1468eadea70aec2cbf Mon Sep 17 00:00:00 2001 From: Giuseppe Rota Date: Wed, 28 Nov 2018 17:19:07 +0100 Subject: [PATCH 583/788] Add Extrakey support for Brightness up/down (#4477) --- docs/keycode.txt | 2 ++ docs/keycodes.md | 2 ++ docs/keycodes_basic.md | 2 ++ quantum/keymap_common.c | 2 +- tmk_core/common/keycode.h | 6 +++++- tmk_core/common/report.h | 7 ++++++- 6 files changed, 18 insertions(+), 3 deletions(-) diff --git a/docs/keycode.txt b/docs/keycode.txt index b2070f711..bd93b0a94 100644 --- a/docs/keycode.txt +++ b/docs/keycode.txt @@ -209,6 +209,8 @@ KC_WWW_FORWARD KC_WFWD KC_WWW_STOP KC_WSTP KC_WWW_REFRESH KC_WREF KC_WWW_FAVORITES KC_WFAV +KC_BRIGHTNESS_UP KC_BRIU +KC_BRIGHTNESS_DOWN KC_BRID /* Mousekey */ KC_MS_UP KC_MS_U Mouse Cursor Up KC_MS_DOWN KC_MS_D Mouse Cursor Down diff --git a/docs/keycodes.md b/docs/keycodes.md index 1c5f46d6e..75b01389c 100644 --- a/docs/keycodes.md +++ b/docs/keycodes.md @@ -203,6 +203,8 @@ This is a reference only. Each group of keys links to the page documenting their |`KC_WWW_FAVORITES` |`KC_WFAV` |Browser Favorites (Windows) | |`KC_MEDIA_FAST_FORWARD`|`KC_MFFD` |Next Track (macOS) | |`KC_MEDIA_REWIND` |`KC_MRWD` |Previous Track (macOS) | +|`KC_BRIGHTNESS_UP` |`KC_BRIU` |Brightness Up | +|`KC_BRIGHTNESS_DOWN` |`KC_BRID` |Brightness Down | ## [Quantum Keycodes](quantum_keycodes.md#qmk-keycodes) diff --git a/docs/keycodes_basic.md b/docs/keycodes_basic.md index ada9cc0e5..9cc00f032 100644 --- a/docs/keycodes_basic.md +++ b/docs/keycodes_basic.md @@ -219,6 +219,8 @@ Windows and macOS use different keycodes for "next track" and "previous track". |`KC_WWW_FAVORITES` |`KC_WFAV`|Browser Favorites (Windows) | |`KC_MEDIA_FAST_FORWARD`|`KC_MFFD`|Next Track (macOS) | |`KC_MEDIA_REWIND` |`KC_MRWD`|Previous Track (macOS) | +|`KC_BRIGHTNESS_UP` |`KC_BRIU`|Brightness Up | +|`KC_BRIGHTNESS_DOWN` |`KC_BRID`|Brightness Down | ## Number Pad diff --git a/quantum/keymap_common.c b/quantum/keymap_common.c index 50af15d62..f6c8b70d2 100644 --- a/quantum/keymap_common.c +++ b/quantum/keymap_common.c @@ -64,7 +64,7 @@ action_t action_for_key(uint8_t layer, keypos_t key) case KC_SYSTEM_POWER ... KC_SYSTEM_WAKE: action.code = ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(keycode)); break; - case KC_AUDIO_MUTE ... KC_MEDIA_REWIND: + case KC_AUDIO_MUTE ... KC_BRIGHTNESS_DOWN: action.code = ACTION_USAGE_CONSUMER(KEYCODE2CONSUMER(keycode)); break; case KC_MS_UP ... KC_MS_ACCEL2: diff --git a/tmk_core/common/keycode.h b/tmk_core/common/keycode.h index 61642ae84..d6fef2beb 100644 --- a/tmk_core/common/keycode.h +++ b/tmk_core/common/keycode.h @@ -33,7 +33,7 @@ along with this program. If not, see . #define IS_SPECIAL(code) ((0xA5 <= (code) && (code) <= 0xDF) || (0xE8 <= (code) && (code) <= 0xFF)) #define IS_SYSTEM(code) (KC_PWR <= (code) && (code) <= KC_WAKE) -#define IS_CONSUMER(code) (KC_MUTE <= (code) && (code) <= KC_MRWD) +#define IS_CONSUMER(code) (KC_MUTE <= (code) && (code) <= KC_BRID) #define IS_FN(code) (KC_FN0 <= (code) && (code) <= KC_FN31) @@ -170,6 +170,8 @@ along with this program. If not, see . #define KC_WFAV KC_WWW_FAVORITES #define KC_MFFD KC_MEDIA_FAST_FORWARD #define KC_MRWD KC_MEDIA_REWIND +#define KC_BRIU KC_BRIGHTNESS_UP +#define KC_BRID KC_BRIGHTNESS_DOWN /* Mouse Keys */ #define KC_MS_U KC_MS_UP @@ -457,6 +459,8 @@ enum internal_special_keycodes { KC_WWW_FAVORITES, KC_MEDIA_FAST_FORWARD, KC_MEDIA_REWIND, + KC_BRIGHTNESS_UP, + KC_BRIGHTNESS_DOWN, /* Fn keys */ KC_FN0 = 0xC0, diff --git a/tmk_core/common/report.h b/tmk_core/common/report.h index 5a1a6b19c..eb9afb727 100644 --- a/tmk_core/common/report.h +++ b/tmk_core/common/report.h @@ -38,6 +38,7 @@ along with this program. If not, see . /* Consumer Page(0x0C) * following are supported by Windows: http://msdn.microsoft.com/en-us/windows/hardware/gg463372.aspx + * see also https://docs.microsoft.com/en-us/windows-hardware/drivers/hid/display-brightness-control */ #define AUDIO_MUTE 0x00E2 #define AUDIO_VOL_UP 0x00E9 @@ -47,6 +48,8 @@ along with this program. If not, see . #define TRANSPORT_STOP 0x00B7 #define TRANSPORT_STOP_EJECT 0x00CC #define TRANSPORT_PLAY_PAUSE 0x00CD +#define BRIGHTNESSUP 0x006F +#define BRIGHTNESSDOWN 0x0070 /* application launch */ #define AL_CC_CONFIG 0x0183 #define AL_EMAIL 0x018A @@ -189,7 +192,9 @@ typedef struct { (key == KC_WWW_FORWARD ? AC_FORWARD : \ (key == KC_WWW_STOP ? AC_STOP : \ (key == KC_WWW_REFRESH ? AC_REFRESH : \ - (key == KC_WWW_FAVORITES ? AC_BOOKMARKS : 0))))))))))))))))))))) + (key == KC_BRIGHTNESS_UP ? BRIGHTNESSUP : \ + (key == KC_BRIGHTNESS_DOWN ? BRIGHTNESSDOWN : \ + (key == KC_WWW_FAVORITES ? AC_BOOKMARKS : 0))))))))))))))))))))))) uint8_t has_anykey(report_keyboard_t* keyboard_report); uint8_t get_first_key(report_keyboard_t* keyboard_report); From fff6f22cf652aeb601ea4901399b70fb9a3f757c Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Wed, 28 Nov 2018 08:51:16 -0800 Subject: [PATCH 584/788] Keyboard: handwired/bluepill Configurator support and readme cleanup (#4509) * handwired/bluepill/bluepill70: Configurator support * handwired/bluepill: readme cleanup Formatting fixes to make the file easier to read. --- .../handwired/bluepill/bluepill70/info.json | 187 ++++++++++++++++++ keyboards/handwired/bluepill/readme.md | 20 +- 2 files changed, 197 insertions(+), 10 deletions(-) create mode 100644 keyboards/handwired/bluepill/bluepill70/info.json diff --git a/keyboards/handwired/bluepill/bluepill70/info.json b/keyboards/handwired/bluepill/bluepill70/info.json new file mode 100644 index 000000000..3f08b50e5 --- /dev/null +++ b/keyboards/handwired/bluepill/bluepill70/info.json @@ -0,0 +1,187 @@ +{ + "keyboard_name": "BluePill 70", + "url": "", + "maintainer": "qmk", + "width": 16, + "height": 6, + "layouts": { + "LAYOUT_seventy_ansi": { + "layout": [ + {"label":"Esc", "x":0, "y":0}, + {"label":"F1", "x":1, "y":0}, + {"label":"F2", "x":2, "y":0}, + {"label":"F3", "x":3, "y":0}, + {"label":"F4", "x":4, "y":0}, + {"label":"F5", "x":5, "y":0}, + {"label":"F6", "x":6, "y":0}, + {"label":"F7", "x":7, "y":0}, + {"label":"F8", "x":8, "y":0}, + {"label":"F9", "x":9, "y":0}, + {"label":"F10", "x":10, "y":0}, + {"label":"F11", "x":11, "y":0}, + {"label":"F12", "x":12, "y":0}, + {"label":"Print Screen", "x":13, "y":0}, + {"label":"Home", "x":14, "y":0}, + {"label":"End", "x":15, "y":0}, + {"label":"`", "x":0, "y":1}, + {"label":"1", "x":1, "y":1}, + {"label":"2", "x":2, "y":1}, + {"label":"3", "x":3, "y":1}, + {"label":"4", "x":4, "y":1}, + {"label":"5", "x":5, "y":1}, + {"label":"6", "x":6, "y":1}, + {"label":"7", "x":7, "y":1}, + {"label":"8", "x":8, "y":1}, + {"label":"9", "x":9, "y":1}, + {"label":"0", "x":10, "y":1}, + {"label":"-", "x":11, "y":1}, + {"label":"=", "x":12, "y":1}, + {"label":"Backspace", "x":13, "y":1, "w":2}, + {"label":"Delete", "x":15, "y":1}, + {"label":"Tab", "x":0, "y":2, "w":1.5}, + {"label":"Q", "x":1.5, "y":2}, + {"label":"W", "x":2.5, "y":2}, + {"label":"E", "x":3.5, "y":2}, + {"label":"R", "x":4.5, "y":2}, + {"label":"T", "x":5.5, "y":2}, + {"label":"Y", "x":6.5, "y":2}, + {"label":"U", "x":7.5, "y":2}, + {"label":"I", "x":8.5, "y":2}, + {"label":"O", "x":9.5, "y":2}, + {"label":"P", "x":10.5, "y":2}, + {"label":"[", "x":11.5, "y":2}, + {"label":"]", "x":12.5, "y":2}, + {"label":"Page Up", "x":15, "y":2}, + {"label":"Caps Lock", "x":0, "y":3, "w":1.75}, + {"label":"A", "x":1.75, "y":3}, + {"label":"S", "x":2.75, "y":3}, + {"label":"D", "x":3.75, "y":3}, + {"label":"F", "x":4.75, "y":3}, + {"label":"G", "x":5.75, "y":3}, + {"label":"H", "x":6.75, "y":3}, + {"label":"J", "x":7.75, "y":3}, + {"label":"K", "x":8.75, "y":3}, + {"label":"L", "x":9.75, "y":3}, + {"label":";", "x":10.75, "y":3}, + {"label":"'", "x":11.75, "y":3}, + {"label":"Enter", "x":12.75, "y":3, "w":2.25}, + {"label":"\\", "x":13.5, "y":2, "w":1.5}, + {"label":"Page Down", "x":15, "y":3}, + {"label":"Shift", "x":0, "y":4, "w":1.25}, + {"label":"ISO \\", "x":1.25, "y":4}, + {"label":"Z", "x":2.25, "y":4}, + {"label":"X", "x":3.25, "y":4}, + {"label":"C", "x":4.25, "y":4}, + {"label":"V", "x":5.25, "y":4}, + {"label":"B", "x":6.25, "y":4}, + {"label":"N", "x":7.25, "y":4}, + {"label":"M", "x":8.25, "y":4}, + {"label":",", "x":9.25, "y":4}, + {"label":".", "x":10.25, "y":4}, + {"label":"/", "x":11.25, "y":4}, + {"label":"Shift", "x":12.25, "y":4, "w":1.75}, + {"label":"Up", "x":14, "y":4}, + {"label":"TT(2)", "x":15, "y":4}, + {"label":"Ctrl", "x":0, "y":5, "w":1.25}, + {"label":"GUI", "x":1.25, "y":5, "w":1.25}, + {"label":"Alt", "x":2.5, "y":5, "w":1.25}, + {"label":"Space", "x":3.75, "y":5, "w":6.25}, + {"label":"Alt", "x":10, "y":5}, + {"label":"Fn", "x":11, "y":5}, + {"label":"Ctrl", "x":12, "y":5}, + {"label":"Left", "x":13, "y":5}, + {"label":"Down", "x":14, "y":5}, + {"label":"Right", "x":15, "y":5} + ] + }, + "LAYOUT_seventy_iso": { + "layout": [ + {"label":"Esc", "x":0, "y":0}, + {"label":"F1", "x":1, "y":0}, + {"label":"F2", "x":2, "y":0}, + {"label":"F3", "x":3, "y":0}, + {"label":"F4", "x":4, "y":0}, + {"label":"F5", "x":5, "y":0}, + {"label":"F6", "x":6, "y":0}, + {"label":"F7", "x":7, "y":0}, + {"label":"F8", "x":8, "y":0}, + {"label":"F9", "x":9, "y":0}, + {"label":"F10", "x":10, "y":0}, + {"label":"F11", "x":11, "y":0}, + {"label":"F12", "x":12, "y":0}, + {"label":"Print Screen", "x":13, "y":0}, + {"label":"Home", "x":14, "y":0}, + {"label":"End", "x":15, "y":0}, + {"label":"`", "x":0, "y":1}, + {"label":"1", "x":1, "y":1}, + {"label":"2", "x":2, "y":1}, + {"label":"3", "x":3, "y":1}, + {"label":"4", "x":4, "y":1}, + {"label":"5", "x":5, "y":1}, + {"label":"6", "x":6, "y":1}, + {"label":"7", "x":7, "y":1}, + {"label":"8", "x":8, "y":1}, + {"label":"9", "x":9, "y":1}, + {"label":"0", "x":10, "y":1}, + {"label":"-", "x":11, "y":1}, + {"label":"=", "x":12, "y":1}, + {"label":"Backspace", "x":13, "y":1, "w":2}, + {"label":"Delete", "x":15, "y":1}, + {"label":"Tab", "x":0, "y":2, "w":1.5}, + {"label":"Q", "x":1.5, "y":2}, + {"label":"W", "x":2.5, "y":2}, + {"label":"E", "x":3.5, "y":2}, + {"label":"R", "x":4.5, "y":2}, + {"label":"T", "x":5.5, "y":2}, + {"label":"Y", "x":6.5, "y":2}, + {"label":"U", "x":7.5, "y":2}, + {"label":"I", "x":8.5, "y":2}, + {"label":"O", "x":9.5, "y":2}, + {"label":"P", "x":10.5, "y":2}, + {"label":"[", "x":11.5, "y":2}, + {"label":"]", "x":12.5, "y":2}, + {"label":"Page Up", "x":15, "y":2}, + {"label":"Caps Lock", "x":0, "y":3, "w":1.75}, + {"label":"A", "x":1.75, "y":3}, + {"label":"S", "x":2.75, "y":3}, + {"label":"D", "x":3.75, "y":3}, + {"label":"F", "x":4.75, "y":3}, + {"label":"G", "x":5.75, "y":3}, + {"label":"H", "x":6.75, "y":3}, + {"label":"J", "x":7.75, "y":3}, + {"label":"K", "x":8.75, "y":3}, + {"label":"L", "x":9.75, "y":3}, + {"label":";", "x":10.75, "y":3}, + {"label":",", "x":11.75, "y":3}, + {"label":"ISO #", "x":12.75, "y":3}, + {"label":"Enter", "x":13.75, "y":2, "w":1.25, "h":2}, + {"label":"Page Down", "x":15, "y":3}, + {"label":"Shift", "x":0, "y":4, "w":1.25}, + {"label":"ISO \\", "x":1.25, "y":4}, + {"label":"Z", "x":2.25, "y":4}, + {"label":"X", "x":3.25, "y":4}, + {"label":"C", "x":4.25, "y":4}, + {"label":"V", "x":5.25, "y":4}, + {"label":"B", "x":6.25, "y":4}, + {"label":"N", "x":7.25, "y":4}, + {"label":"M", "x":8.25, "y":4}, + {"label":",", "x":9.25, "y":4}, + {"label":".", "x":10.25, "y":4}, + {"label":"/", "x":11.25, "y":4}, + {"label":"Shift", "x":12.25, "y":4, "w":1.75}, + {"label":"Up", "x":14, "y":4}, + {"label":"TT(2)", "x":15, "y":4}, + {"label":"Ctrl", "x":0, "y":5, "w":1.25}, + {"label":"GUI", "x":1.25, "y":5, "w":1.25}, + {"label":"Alt", "x":2.5, "y":5, "w":1.25}, + {"label":"Space", "x":3.75, "y":5, "w":6.25}, + {"label":"Alt", "x":10, "y":5}, + {"label":"Fn", "x":11, "y":5}, + {"label":"Ctrl", "x":12, "y":5}, + {"label":"Left", "x":13, "y":5}, + {"label":"Down", "x":14, "y":5}, + {"label":"Right", "x":15, "y":5} + ] + } + } +} diff --git a/keyboards/handwired/bluepill/readme.md b/keyboards/handwired/bluepill/readme.md index 8b53f12f4..b8ca96992 100644 --- a/keyboards/handwired/bluepill/readme.md +++ b/keyboards/handwired/bluepill/readme.md @@ -3,15 +3,15 @@ Keyboards using a BluePill controller (generic Chinese STM32F103C8T6) and based on the [KC64 of Xydane](https://github.com/Xydane/qmk_firmware). -Keyboard Maintainer: [FPazos](https://github.com/fpazos), but I hope to leave the project in better hands. -Hardware Supported: Bluepill STM32F103C8T6 +Keyboard Maintainer: [FPazos](https://github.com/fpazos), but I hope to leave the project in better hands. +Hardware Supported: Bluepill STM32F103C8T6 Hardware Availability: Everywhere Make example for BluePill70 (after setting up your build environment): -make handwired/bluepill/bluepill70:default + make handwired/bluepill/bluepill70:default -See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. +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). Read everything before using it. @@ -47,14 +47,14 @@ That's the pinout; A4 LCT| WIN| ALT| ESPACE | ALG| FN | RCT| LEF| DOW| RIG And the wiring: -ISO +ISO ![Wiring](https://i.imgur.com/ZCaxVzs.jpg) -ANSI +ANSI ![Wiring](https://i.imgur.com/dBUJCdD.jpg) -It also uses: +It also uses: PC13: Caps Lock led. -Backlight dual color leds, my version is for common anode that's more common, for leds with common anode just replace the palSetPad with palClearPad and viceversa. -PA1: Backlight color A. -PA0: Backlight color B. \ No newline at end of file +Backlight dual color leds, my version is for common anode that's more common, for leds with common anode just replace the palSetPad with palClearPad and viceversa. +PA1: Backlight color A. +PA0: Backlight color B. From 87e6d0137484fdc8e076eb79dbbed47836eba2c5 Mon Sep 17 00:00:00 2001 From: GO <44800276+GoTakigawa@users.noreply.github.com> Date: Thu, 29 Nov 2018 02:20:46 +0900 Subject: [PATCH 585/788] Keyboard: add newgame (#4466) * Add files via upload * Add files via upload * Update keyboards/newgame40/keymaps/default/keymap.c Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keyboards/newgame40/keymaps/default/keymap.c Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keyboards/newgame40/newgame40.h Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keyboards/newgame40/keymaps/default/keymap.c Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keyboards/newgame40/keymaps/default/keymap.c Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keyboards/newgame40/keymaps/default/keymap.c Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keyboards/newgame40/keymaps/default/keymap.c Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keyboards/newgame40/keymaps/default/keymap.c Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keyboards/newgame40/keymaps/default/keymap.c Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keyboards/newgame40/keymaps/default/keymap.c Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keyboards/newgame40/config.h Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keyboards/newgame40/config.h Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keyboards/newgame40/config.h Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keyboards/newgame40/config.h Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keyboards/newgame40/config.h Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keyboards/newgame40/keymaps/default/keymap.c Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keyboards/newgame40/config.h Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keyboards/newgame40/rules.mk Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keyboards/newgame40/rules.mk Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Add readme (newgame40) * Update keyboards/newgame40/readme.md Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keyboards/newgame40/readme.md Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keymap.c * Update keyboards/newgame40/rules.mk Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Add files via upload * remove community/ortho_4x10 --- keyboards/newgame40/config.h | 75 +++++++ keyboards/newgame40/info.json | 13 ++ keyboards/newgame40/keymaps/default/config.h | 5 + keyboards/newgame40/keymaps/default/keymap.c | 208 ++++++++++++++++++ keyboards/newgame40/newgame40.c | 5 + keyboards/newgame40/newgame40.h | 19 ++ keyboards/newgame40/readme.md | 17 ++ keyboards/newgame40/rules.mk | 74 +++++++ .../ortho_4x10/default_ortho_4x10/keymap.c | 10 + layouts/default/ortho_4x10/layout.json | 4 + layouts/default/ortho_4x10/readme.md | 3 + 11 files changed, 433 insertions(+) create mode 100644 keyboards/newgame40/config.h create mode 100644 keyboards/newgame40/info.json create mode 100644 keyboards/newgame40/keymaps/default/config.h create mode 100644 keyboards/newgame40/keymaps/default/keymap.c create mode 100644 keyboards/newgame40/newgame40.c create mode 100644 keyboards/newgame40/newgame40.h create mode 100644 keyboards/newgame40/readme.md create mode 100644 keyboards/newgame40/rules.mk create mode 100644 layouts/default/ortho_4x10/default_ortho_4x10/keymap.c create mode 100644 layouts/default/ortho_4x10/layout.json create mode 100644 layouts/default/ortho_4x10/readme.md diff --git a/keyboards/newgame40/config.h b/keyboards/newgame40/config.h new file mode 100644 index 000000000..01c9142f7 --- /dev/null +++ b/keyboards/newgame40/config.h @@ -0,0 +1,75 @@ +/* +Copyright 2018 Go Takigawa + +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 . +*/ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0000 +#define DEVICE_VER 0x0001 +#define MANUFACTURER GoTakigawa +#define PRODUCT NEWGAME40 +#define DESCRIPTION 4x10key keyboard + +/* key matrix size */ +#define MATRIX_ROWS 4 +#define MATRIX_COLS 10 + +/* pin-out */ +#define MATRIX_ROW_PINS { F7, B1, B3, B2 } +#define MATRIX_COL_PINS { D3, D2, D1, D0, D4, C6, D7, E6, B4, B5 } +#define UNUSED_PINS + +/* ws2812 RGB LED */ +#define RGB_DI_PIN F6 +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 25 // Number of LEDs +#define RGBLIGHT_HUE_STEP 10 +#define RGBLIGHT_SAT_STEP 17 + +#ifndef IOS_DEVICE_ENABLE + #if RGBLED_NUM <= 6 + #define RGBLIGHT_LIMIT_VAL 255 + #else + #define RGBLIGHT_LIMIT_VAL 130 + #endif + #define RGBLIGHT_VAL_STEP 17 +#else + #if RGBLED_NUM <= 6 + #define RGBLIGHT_LIMIT_VAL 90 + #else + #define RGBLIGHT_LIMIT_VAL 45 + #endif + #define RGBLIGHT_VAL_STEP 4 +#endif +#define RGBLIGHT_HUE_STEP 10 +#define RGBLIGHT_SAT_STEP 17 + +#if defined(RGBLIGHT_ENABLE) && !defined(IOS_DEVICE_ENABLE) + #define USB_MAX_POWER_CONSUMPTION 400 +#else + // fix iPhone and iPad power adapter issue + // iOS device need lessthan 100 + #define USB_MAX_POWER_CONSUMPTION 100 +#endif +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +#define TAPPING_TERM 200 + diff --git a/keyboards/newgame40/info.json b/keyboards/newgame40/info.json new file mode 100644 index 000000000..023961408 --- /dev/null +++ b/keyboards/newgame40/info.json @@ -0,0 +1,13 @@ +{ + "keyboard_name": "NEWGAME40", + "url": "", + "maintainer": "qmk", + "width": 10, + "height": 4, + "layouts": { + "LAYOUT_ortho_4x10": { + "key_count": 40, + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":6, "y":1}, {"x":7, "y":1}, {"x":8, "y":1}, {"x":9, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2}, {"x":5, "y":2}, {"x":6, "y":2}, {"x":7, "y":2}, {"x":8, "y":2}, {"x":9, "y":2}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":4, "y":3}, {"x":5, "y":3}, {"x":6, "y":3}, {"x":7, "y":3}, {"x":8, "y":3}, {"x":9, "y":3}] + } + } +} diff --git a/keyboards/newgame40/keymaps/default/config.h b/keyboards/newgame40/keymaps/default/config.h new file mode 100644 index 000000000..d533d806c --- /dev/null +++ b/keyboards/newgame40/keymaps/default/config.h @@ -0,0 +1,5 @@ + + +#pragma once + +// place overrides here diff --git a/keyboards/newgame40/keymaps/default/keymap.c b/keyboards/newgame40/keymaps/default/keymap.c new file mode 100644 index 000000000..b42fef00f --- /dev/null +++ b/keyboards/newgame40/keymaps/default/keymap.c @@ -0,0 +1,208 @@ +/* Copyright 2018 GoTakigawa + * + * 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 . + */ + + #include QMK_KEYBOARD_H + + extern keymap_config_t keymap_config; + +enum layers { + _QWERTY, + _COLEMAK, + _DVORAK, + _EUCALYN, + _LOWER, + _RAISE, + _ADJUST, +}; + + enum custom_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + LOWER, + RAISE, + EUCALYN, + ADJUST, + }; + + // Fillers to make layering more clear + #define LOWER MO(_LOWER) + #define RAISE MO(_RAISE) + + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* Qwerty + * ,---------------------------------------------------------------------. + * | Q | W | E | R | T | Y | U | I | O | P | + * |------+------+------+------+------+------|------+------+------+------| + * | A | S | D | F | G | H | J | K | L | - | + * |------+------+------+------+------+------+-------------+------+------| + * | Z | X | C | V | B | N | M | , | . | / | + * |-------------+------+------+------+------+------+------+------+------' + * |Shift | GUI |Lower | Ctrl |Space | Bksp |Enter |Raise | Left |Right | + * `---------------------------------------------------------------------' + */ + [_QWERTY] = LAYOUT_ortho_4x10( \ + KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, \ + KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_MINS, \ + KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, \ + KC_LSFT, KC_LGUI, LT(_LOWER,KC_LANG2), KC_LCTL, KC_SPC, KC_BSPC, KC_ENT, LT(_RAISE,KC_LANG1), KC_LEFT, KC_RGHT\ + ), + + /* Colemak + * ,---------------------------------------------------------------------. + * | Q | W | F | P | G | J | L | U | Y | - | + * |------+------+------+------+------+------|------+------+------+------| + * | A | R | S | T | D | H | N | E | I | O | + * |------+------+------+------+------+------+-------------+------+------| + * | Z | X | C | V | B | K | M | , | . | / | + * |-------------+------+------+------+------+------+------+------+------' + * |Shift | GUI |Lower | Ctrl |Space | Bksp |Enter |Raise | Left |Right | + * `---------------------------------------------------------------------' + */ + [_COLEMAK] = LAYOUT_ortho_4x10( \ + KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_MINS, \ + KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, \ + KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, \ + KC_LSFT, KC_LGUI, LT(_LOWER,KC_LANG2), KC_LCTL, KC_SPC, KC_BSPC, KC_ENT, LT(_RAISE,KC_LANG1), KC_LEFT, KC_RGHT\ + ), + + /* Dvorak + * ,---------------------------------------------------------------------. + * | " | , | . | P | Y | F | G | C | R | L | + * |------+------+------+------+------+------|------+------+------+------| + * | A | O | E | U | I | D | H | T | N | S | + * |------+------+------+------+------+------+-------------+------+------| + * | ; | Q | J | K | X | B | M | W | V | Z | + * |-------------+------+------+------+------+------+------+------+------' + * |Shift | GUI |Lower | Ctrl |Space | Bksp |Enter |Raise | Left |Right | + * `---------------------------------------------------------------------' + */ + [_DVORAK] = LAYOUT_ortho_4x10( \ + KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, \ + KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, \ + KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, \ + KC_LSFT, KC_LGUI, LT(_LOWER,KC_LANG2), KC_LCTL, KC_SPC, KC_BSPC, KC_ENT, LT(_RAISE,KC_LANG1), KC_LEFT, KC_RGHT\ + ), + + /* Lower + * ,---------------------------------------------------------------------. + * | Esc | | | | | | | | | | + * |------+------+------+------+------+------|------+------+------+------| + * | | | | | | | | | | | + * |------+------+------+------+------+------+-------------+------+------| + * | F13 | F14 | F15 | F16 | F17 | F18 | F19 | F20 | F21 | F22 | + * |-------------+------+------+------+------+------+------+------+------' + * | F1 | F2 | | F3 | F4 | F5 | F6 | | F7 | F8 | + * `---------------------------------------------------------------------' + */ + [_LOWER] = LAYOUT_ortho_4x10( \ + KC_ESC, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, \ + KC_F1, KC_F2, _______, KC_F3, KC_F4, KC_F5, KC_F6, _______, KC_F7, KC_F8 \ + ), + + /* Raise + * ,---------------------------------------------------------------------. + * | 1 | 2 |  3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | + * |------+------+------+------+------+------|------+------+------+------| + * | ! | " | # | $ | % | & | ' | (  | ) | _ | + * |------+------+------+------+------+------+-------------+------+------| + * | = | ¥ | { | } | * | ~ | | | < | > | ? | + * |-------------+------+------+------+------+------+------+------+------' + * | F1 | Alt | | [ | ] | ; | : | | \ | / | + * `---------------------------------------------------------------------' + */ + [_RAISE] = LAYOUT_ortho_4x10( \ + KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, \ + KC_EXLM, KC_DQT, KC_HASH, KC_DLR, KC_PERC, KC_AMPR, KC_QUOT, KC_LPRN, KC_RPRN, KC_UNDS, \ + KC_EQL, KC_JYEN, KC_LCBR, KC_RCBR, KC_ASTR, KC_TILD, KC_PIPE, KC_LABK, KC_RABK, KC_QUES, \ + KC_F1, KC_LALT, _______, KC_LBRC, KC_RBRC, KC_SCLN, KC_COLN, _______, KC_BSLS, KC_SLSH \ + ), + + /* EUCALYN + * ,---------------------------------------------------------------------. + * | Q | W | , | . | ; | M | R | D | Y | P | + * |------+------+------+------+------+------|------+------+------+------| + * | A | O | E | I | U | G | T | K | S | N | + * |------+------+------+------+------+------+-------------+------+------| + * | Z | X | C | V | F | B | H | J | L | / | + * `-------------+------+------+------+------+------+------+-------------' + * |Shift | GUI |Lower | Ctrl |Space | Bksp |Enter |Raise | Left |Right | + * `---------------------------------------------------------------------' + */ + [_EUCALYN] = LAYOUT_ortho_4x10( \ + KC_Q, KC_W, KC_COMM, KC_DOT, KC_SCLN, KC_M, KC_R, KC_D, KC_Y, KC_P, \ + KC_A, KC_O, KC_E, KC_I, KC_U, KC_G, KC_T, KC_K, KC_S, KC_N, \ + KC_Z, KC_X, KC_C, KC_V, KC_F, KC_B, KC_H, KC_J, KC_L, KC_SLSH, \ + KC_LSFT, KC_LGUI, LT(_LOWER,KC_LANG2), KC_LCTL, KC_SPC, KC_BSPC, KC_ENT, LT(_RAISE,KC_LANG1), KC_LEFT, KC_RGHT\ + ), + + /* Adjust (Lower + Raise) + * ,---------------------------------------------------------------------. + * | |RGB Tg|RGB Md|Hue Up|Hue Dn|Sat Up|Sat Dn|Val Up|Val Dn| | + * |------+------+------+------+------+------.------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap| |BL TOG|BL STP| + * |------+------+------+------+------+------+------+------+------+------| + * |Qwerty|Colemk|Dvorak|Eucalyn| | | | | | | + * |------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | + * `---------------------------------------------------------------------' + */ + [_ADJUST] = LAYOUT_ortho_4x10( \ + _______, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, _______, \ + _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, _______, BL_TOGG, BL_STEP, \ + QWERTY, COLEMAK, DVORAK, EUCALYN, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ) + + + }; + + uint32_t layer_state_set_user(uint32_t state) { + return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST); + } + + bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + set_single_persistent_default_layer(_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + set_single_persistent_default_layer(_DVORAK); + } + return false; + break; + case EUCALYN: + if (record->event.pressed) { + set_single_persistent_default_layer(_EUCALYN); + } + return false; + break; + } + return true; + } diff --git a/keyboards/newgame40/newgame40.c b/keyboards/newgame40/newgame40.c new file mode 100644 index 000000000..e55b25b3d --- /dev/null +++ b/keyboards/newgame40/newgame40.c @@ -0,0 +1,5 @@ +#include "newgame40.h" + +void matrix_init_kb(void) { + matrix_init_user(); +} diff --git a/keyboards/newgame40/newgame40.h b/keyboards/newgame40/newgame40.h new file mode 100644 index 000000000..6044f3765 --- /dev/null +++ b/keyboards/newgame40/newgame40.h @@ -0,0 +1,19 @@ +#ifndef NEWGAME40_H +#define NEWGAME40_H + +#include "quantum.h" + +#define LAYOUT_ortho_4x10( \ + k101, k102, k103, k104, k105, k106, k107, k108, k109, k110, \ + k201, k202, k203, k204, k205, k206, k207, k208, k209, k210, \ + k301, k302, k303, k304, k305, k306, k307, k308, k309, k310, \ + k401, k402, k403, k404, k405, k406, k407, k408, k409, k410 \ +) \ +{ \ + {k101, k102, k103, k104, k105, k106, k107, k108, k109, k110}, \ + {k201, k202, k203, k204, k205, k206, k207, k208, k209, k210}, \ + {k301, k302, k303, k304, k305, k306, k307, k308, k309, k310}, \ + {k401, k402, k403, k404, k405, k406, k407, k408, k409, k410} \ +} + +#endif diff --git a/keyboards/newgame40/readme.md b/keyboards/newgame40/readme.md new file mode 100644 index 000000000..2aa568cfb --- /dev/null +++ b/keyboards/newgame40/readme.md @@ -0,0 +1,17 @@ +# NEWGAME40 + +![NEWGAME40](https://i.imgur.com/HtujXda.jpg) + +40% (4x10) ortholinear keyboard. + +Keyboard Maintainer: +[GoTakigawa](https://github.com/GoTakigawa) +[@Go_Drums](https://twitter.com/Go_Drums) +Hardware Supported: The NEWGAME40 PCBs, ProMicro supported +Hardware Availability: Group buy soon + +Make example for this keyboard (after setting up your build environment): + + make newgame40:default + +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). diff --git a/keyboards/newgame40/rules.mk b/keyboards/newgame40/rules.mk new file mode 100644 index 000000000..cca40ce8e --- /dev/null +++ b/keyboards/newgame40/rules.mk @@ -0,0 +1,74 @@ +# MCU name +#MCU = at90usb1287 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +BOOTLOADER = caterina + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = yes # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. +IOS_DEVICE_ENABLE = no # connect to IOS Device + + ifeq ($(strip $(IOS_DEVICE_ENABLE )), yes) + OPT_DEFS += -DIOS_DEVICE_ENABLE + endif + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +LAYOUTS = ortho_4x10 diff --git a/layouts/default/ortho_4x10/default_ortho_4x10/keymap.c b/layouts/default/ortho_4x10/default_ortho_4x10/keymap.c new file mode 100644 index 000000000..3f6285e2d --- /dev/null +++ b/layouts/default/ortho_4x10/default_ortho_4x10/keymap.c @@ -0,0 +1,10 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_ortho_4x10( + KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, + KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, + KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, + KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J + ) +}; diff --git a/layouts/default/ortho_4x10/layout.json b/layouts/default/ortho_4x10/layout.json new file mode 100644 index 000000000..86f098e27 --- /dev/null +++ b/layouts/default/ortho_4x10/layout.json @@ -0,0 +1,4 @@ +["","","","","","","","","",""], +["","","","","","","","","",""], +["","","","","","","","","",""], +["","","","","","","","","",""] diff --git a/layouts/default/ortho_4x10/readme.md b/layouts/default/ortho_4x10/readme.md new file mode 100644 index 000000000..c5c29251c --- /dev/null +++ b/layouts/default/ortho_4x10/readme.md @@ -0,0 +1,3 @@ +# ortho_4x10 + + LAYOUT_ortho_4x10 From fbf59ba2e5a4ccd8842d044f7ffa75e91e1894cb Mon Sep 17 00:00:00 2001 From: Paul Massendari Date: Thu, 29 Nov 2018 16:33:45 +0100 Subject: [PATCH 586/788] Typo fix (#4515) --- docs/feature_unicode.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/feature_unicode.md b/docs/feature_unicode.md index b1527b848..c98a40228 100644 --- a/docs/feature_unicode.md +++ b/docs/feature_unicode.md @@ -30,7 +30,7 @@ Make sure that the order for both matches. ## UCIS_ENABLE -Supports Unicode up to 0xFFFFFFFF. As with `UNICODE_MAP`, you may want to main a mapping table in your keymap file. However, there is no keycodes for this feature, you will have to add a keycode or function to call `qk_ucis_start()`. Once you've run that, you can just type the text for your unicode, and then hit space or enter to complete it, or ESC to cancel it. And if it matches an entry in your table, it will automatically "backspace" the trigger word (from your table) and then will input the unicode sequence. +Supports Unicode up to 0xFFFFFFFF. As with `UNICODE_MAP`, you may want to maintain a mapping table in your keymap file. However, there is no keycodes for this feature, you will have to add a keycode or function to call `qk_ucis_start()`. Once you've run that, you can just type the text for your unicode, and then hit space or enter to complete it, or ESC to cancel it. And if it matches an entry in your table, it will automatically "backspace" the trigger word (from your table) and then will input the unicode sequence. For instance, you would need to have a table like this in your keymap: From 81ce35c10a89214a586773e013e647eeb701fee5 Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Thu, 29 Nov 2018 07:57:06 -0800 Subject: [PATCH 587/788] New Keyboard: Cyclops (#4512) * initial commit * add correct atmega32u4 pins used * add a basic layout * add simple keymap * update readme * Add QMK Configurator support * add whitespace for formatting --- keyboards/cyclops/config.h | 214 ++++++++++++++++++++ keyboards/cyclops/cyclops.c | 43 ++++ keyboards/cyclops/cyclops.h | 43 ++++ keyboards/cyclops/info.json | 12 ++ keyboards/cyclops/keymaps/default/config.h | 19 ++ keyboards/cyclops/keymaps/default/keymap.c | 65 ++++++ keyboards/cyclops/keymaps/default/readme.md | 1 + keyboards/cyclops/readme.md | 13 ++ keyboards/cyclops/rules.mk | 80 ++++++++ 9 files changed, 490 insertions(+) create mode 100644 keyboards/cyclops/config.h create mode 100644 keyboards/cyclops/cyclops.c create mode 100644 keyboards/cyclops/cyclops.h create mode 100644 keyboards/cyclops/info.json create mode 100644 keyboards/cyclops/keymaps/default/config.h create mode 100644 keyboards/cyclops/keymaps/default/keymap.c create mode 100644 keyboards/cyclops/keymaps/default/readme.md create mode 100644 keyboards/cyclops/readme.md create mode 100644 keyboards/cyclops/rules.mk diff --git a/keyboards/cyclops/config.h b/keyboards/cyclops/config.h new file mode 100644 index 000000000..d6b637345 --- /dev/null +++ b/keyboards/cyclops/config.h @@ -0,0 +1,214 @@ +/* +Copyright 2018 'mechmerlin' + +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 . +*/ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0000 +#define DEVICE_VER 0x0001 +#define MANUFACTURER You +#define PRODUCT cyclops +#define DESCRIPTION A custom 66% keyboard + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 15 + +/* + * 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 { D1, D0, D7, B4, F0 } +#define MATRIX_COL_PINS { D3, D2, D5, D6, B6, B1, B2, B3, C6, C7, F7, F6, F4, F5, F1 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* 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 userful 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 + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * 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 + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +//#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ + +/* Bootmagic Lite key configuration */ +// #define BOOTMAGIC_LITE_ROW 0 +// #define BOOTMAGIC_LITE_COLUMN 0 diff --git a/keyboards/cyclops/cyclops.c b/keyboards/cyclops/cyclops.c new file mode 100644 index 000000000..8a15e8950 --- /dev/null +++ b/keyboards/cyclops/cyclops.c @@ -0,0 +1,43 @@ +/* Copyright 2018 'mechmerlin' + * + * 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 . + */ +#include "cyclops.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + + led_set_user(usb_led); +} diff --git a/keyboards/cyclops/cyclops.h b/keyboards/cyclops/cyclops.h new file mode 100644 index 000000000..d85b4e903 --- /dev/null +++ b/keyboards/cyclops/cyclops.h @@ -0,0 +1,43 @@ +/* Copyright 2018 'mechmerlin' + * + * 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 . + */ +#ifndef CYCLOPS_H +#define CYCLOPS_H + +#include "quantum.h" + +/* This a shortcut to help you visually see your layout. + * + * The first section contains all of the arguments representing the physical + * layout of the board and position of the keys. + * + * The second converts the arguments into a two-dimensional array which + * represents the switch matrix. + */ +#define LAYOUT( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, \ + K10, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, \ + K20, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, \ + K40, K41, K42, K46, K4A, K4B, K4C, K4D, K4E \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E }, \ + { K10, KC_NO, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E }, \ + { K20, KC_NO, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E }, \ + { K40, K41, K42, KC_NO, KC_NO, KC_NO, K46, KC_NO, KC_NO, KC_NO, K4A, K4B, K4C, K4D, K4E } \ +} + +#endif diff --git a/keyboards/cyclops/info.json b/keyboards/cyclops/info.json new file mode 100644 index 000000000..e0e91222b --- /dev/null +++ b/keyboards/cyclops/info.json @@ -0,0 +1,12 @@ +{ + "keyboard_name": "cyclops", + "url": "", + "maintainer": "qmk", + "width": 16.5, + "height": 5, + "layouts": { + "LAYOUT": { + "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Page Up", "x":15.5, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"Page Down", "x":15.5, "y":1}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"~", "x":12.75, "y":2}, {"label":"Shift", "x":0, "y":3, "w":1.5}, {"label":"|", "x":1.5, "y":3}, {"label":"Z", "x":2.5, "y":3}, {"label":"X", "x":3.5, "y":3}, {"label":"C", "x":4.5, "y":3}, {"label":"V", "x":5.5, "y":3}, {"label":"B", "x":6.5, "y":3}, {"label":"N", "x":7.5, "y":3}, {"label":"M", "x":8.5, "y":3}, {"label":"<", "x":9.5, "y":3}, {"label":">", "x":10.5, "y":3}, {"label":"?", "x":11.5, "y":3}, {"x":12.5, "y":3}, {"label":"Shift", "x":13.5, "y":3}, {"label":"\u2191", "x":14.5, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.5}, {"label":"Win", "x":1.5, "y":4, "w":1.25}, {"label":"Alt", "x":2.75, "y":4, "w":1.5}, {"x":4.25, "y":4, "w":6.5}, {"label":"Alt", "x":10.75, "y":4, "w":1.5}, {"label":"Ctrl", "x":12.25, "y":4, "w":1.25}, {"label":"\u2190", "x":13.5, "y":4}, {"label":"\u2193", "x":14.5, "y":4}, {"label":"\u2192", "x":15.5, "y":4}] + } + } +} diff --git a/keyboards/cyclops/keymaps/default/config.h b/keyboards/cyclops/keymaps/default/config.h new file mode 100644 index 000000000..6278fae65 --- /dev/null +++ b/keyboards/cyclops/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 'mechmerlin' + * + * 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 . + */ + +#pragma once + +// place overrides here diff --git a/keyboards/cyclops/keymaps/default/keymap.c b/keyboards/cyclops/keymaps/default/keymap.c new file mode 100644 index 000000000..875fbe244 --- /dev/null +++ b/keyboards/cyclops/keymaps/default/keymap.c @@ -0,0 +1,65 @@ +/* Copyright 2018 'mechmerlin' + * + * 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 . + */ +#include QMK_KEYBOARD_H + +// Defines the keycodes used by our macros in process_record_user +enum custom_keycodes { + QMKBEST = SAFE_RANGE, + QMKURL +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_PGUP, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_PGDN, + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_RGHT, + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, MO(1), KC_0, KC_UP, + KC_CAPS, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_ENT, KC_DOWN), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QMKBEST: + if (record->event.pressed) { + // when keycode QMKBEST is pressed + SEND_STRING("QMK is the best thing ever!"); + } else { + // when keycode QMKBEST is released + } + break; + case QMKURL: + if (record->event.pressed) { + // when keycode QMKURL is pressed + SEND_STRING("https://qmk.fm/" SS_TAP(X_ENTER)); + } else { + // when keycode QMKURL is released + } + break; + } + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/cyclops/keymaps/default/readme.md b/keyboards/cyclops/keymaps/default/readme.md new file mode 100644 index 000000000..b1e2b84a3 --- /dev/null +++ b/keyboards/cyclops/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for cyclops diff --git a/keyboards/cyclops/readme.md b/keyboards/cyclops/readme.md new file mode 100644 index 000000000..fcf6c1546 --- /dev/null +++ b/keyboards/cyclops/readme.md @@ -0,0 +1,13 @@ +# Cyclops + +66% Alps Keyboard in ISO layout. + +Keyboard Maintainer: [MechMerlin](https://github.com/mechmerlin) +Hardware Supported: 66% Alps Keyboard +Hardware Availability: A very limited number were made. + +Make example for this keyboard (after setting up your build environment): + + make cyclops:default + +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). diff --git a/keyboards/cyclops/rules.mk b/keyboards/cyclops/rules.mk new file mode 100644 index 000000000..bc370be03 --- /dev/null +++ b/keyboards/cyclops/rules.mk @@ -0,0 +1,80 @@ +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = no # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) From b10aad45b60326c7e9f2d1fc67e45bd201341552 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Fri, 30 Nov 2018 00:14:55 -0500 Subject: [PATCH 588/788] Test out i18n of the docs (#4519) * add zh-cn readme * edit readme * Round 1 of edits - Mandarin translation of QMK products is off, best to use the English name. - Fix some terminology and grammar. * trying re-translating the first paragraph --- docs/zh-cn/README.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 docs/zh-cn/README.md diff --git a/docs/zh-cn/README.md b/docs/zh-cn/README.md new file mode 100644 index 000000000..bb9d1371f --- /dev/null +++ b/docs/zh-cn/README.md @@ -0,0 +1,32 @@ +# QMK鍵盤固件 + +[![當前版本](https://img.shields.io/github/tag/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/tags) +[![築邦](https://travis-ci.org/qmk/qmk_firmware.svg?branch=master)](https://travis-ci.org/qmk/qmk_firmware) +[![不和諧](https://img.shields.io/discord/440868230475677696.svg)](https://discord.gg/Uq7gcHh) +[![文檔狀態](https://img.shields.io/badge/docs-ready-orange.svg)](https://docs.qmk.fm) +[![GitHub的貢獻者](https://img.shields.io/github/contributors/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/pulse/monthly) +[![GitHub的叉](https://img.shields.io/github/forks/qmk/qmk_firmware.svg?style=social&label=Fork)](https://github.com/qmk/qmk_firmware/) + +## 什麼是QMK固件? + +QMK是一個由社群維護的開源鍵盤韌體,其中包含了QMK Toolbox、qmk.fm和其它文件。QMK韌體是以[tmk\_keyboard](http://github.com/tmk/tmk_keyboard)為基礎,讓一些有用的功能在Atmel AVR控制器實現,使用於[OLKB](https://olkb.com)、[ergodox EZ](http://www.ergodox-ez.com),和[Clueboard](http://clueboard.co/)的產品中。它也被移植到使用ChibiOS的ARM晶片上。你也可以用它來讓你徒手佈線,或是客製的鍵盤PCB發揮功能。 + +## 如何得到QMK + +如果你打算貢獻鍵盤佈局,鍵盤或功能QMK,最容易做的事情是[叉通過Github上爬行](https://github.com/qmk/qmk_firmware#fork-destination-box),和克隆你爬在本地進行更改,推動他們,然後打開從你的叉子[拉請求](https://github.com/qmk/qmk_firmware/pulls)。 + +否則,您可以直接下載([拉鍊](https://github.com/qmk/qmk_firmware/zipball/master) [焦油](https://github.com/qmk/qmk_firmware/tarball/master)),或者通過GIT中克隆它(`git@github.com:qmk/qmk_firmware.git`)或HTTP(`https://github.com/qmk/qmk_firmware.git`)。 + +## 如何編譯 + +你可以編譯之前,你需要[安裝環境](getting_started_build_tools.md)用於AVR或/和ARM開發。一旦完成,你會使用`make`命令建立一個鍵盤並用以下符號鍵盤佈局 + + make planck/rev4:default + +這將建立`rev4` `planck`的修訂與`default`鍵盤映射。並非所有鍵盤有一個修訂版(也稱為子項目或文件夾),在這種情況下,它可以被省略: + + make preonic:default + +## 如何赶近 + +QMK有很多[特點](features.md)探索和很好的協議[參考文獻](http://docs.qmk.fm)挖通的。大部分功能通過修改[鍵盤映射(keymap.md),並改變[鍵碼](keycodes.md)冤大頭。 From d7f1e072a859d7fcbaccd675b4bad7d02d214e52 Mon Sep 17 00:00:00 2001 From: Wilba Date: Sat, 1 Dec 2018 03:43:34 +1100 Subject: [PATCH 589/788] Added macros to Dynamic Keymaps, Zeal60 RGB backlight improvements (#4520) * Refactored M6-B to use Zeal60 RGB backlight code * Fixed M6-B LED co-ordinates * Minor changes to RGB config for Zeal65 * Added dynamic keymaps to WT80-A, WT60-A, WT-80A, U80-A * Macro implementation * Implemented macros, API protocol version 8, RGB backlight fixes * Improved radial effects for M6-B * Fixed undefined references when building an RGB keyboard after M6-A --- keyboards/rama/m60_a/config.h | 13 ++- keyboards/rama/m60_a/rules.mk | 4 +- keyboards/rama/m6_a/config.h | 14 ++- keyboards/rama/m6_a/rules.mk | 2 +- keyboards/rama/m6_b/config.h | 11 +- keyboards/rama/m6_b/rules.mk | 4 +- keyboards/rama/u80_a/config.h | 10 +- keyboards/wilba_tech/wt60_a/config.h | 12 ++- keyboards/wilba_tech/wt65_a/config.h | 12 ++- keyboards/wilba_tech/wt80_a/config.h | 12 ++- keyboards/wilba_tech/wt_main.c | 108 +++++++++++++++++--- keyboards/zeal60/config.h | 10 +- keyboards/zeal60/rgb_backlight.c | 131 ++++++++++++++++++++---- keyboards/zeal60/rgb_backlight.h | 25 +++-- keyboards/zeal60/rgb_backlight_api.h | 3 +- keyboards/zeal60/zeal60.c | 88 +++++++++++----- keyboards/zeal60/zeal60_api.h | 10 +- keyboards/zeal60/zeal60_keycodes.h | 18 +++- keyboards/zeal65/config.h | 10 +- keyboards/zeal65/rules.mk | 4 +- quantum/dynamic_keymap.c | 147 ++++++++++++++++++++++++++- quantum/dynamic_keymap.h | 35 +++++++ 22 files changed, 569 insertions(+), 114 deletions(-) diff --git a/keyboards/rama/m60_a/config.h b/keyboards/rama/m60_a/config.h index 03794965f..01cfe05a5 100644 --- a/keyboards/rama/m60_a/config.h +++ b/keyboards/rama/m60_a/config.h @@ -31,7 +31,7 @@ #define MATRIX_ROWS 5 #define MATRIX_COLS 14 -// Zeal60 PCB default pin-out +// M60-A PCB default pin-out #define MATRIX_ROW_PINS { F0, F1, F4, F6, F7 } #define MATRIX_COL_PINS { F5, D5, B1, B2, B3, D3, D2, C7, C6, B6, B5, B4, D7, D6 } #define UNUSED_PINS @@ -118,11 +118,14 @@ // Bump this every time we change what we store // This will automatically reset the EEPROM with defaults // and avoid loading invalid data from the EEPROM -#define EEPROM_VERSION 0x07 +#define EEPROM_VERSION 0x08 #define EEPROM_VERSION_ADDR 34 // Backlight config starts after EEPROM version #define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 35 -// Dynamic keymap starts after backlight config (35+37) -#define DYNAMIC_KEYMAP_EEPROM_ADDR 72 - +// Dynamic keymap starts after backlight config (35+31) +#define DYNAMIC_KEYMAP_EEPROM_ADDR 66 +// Dynamic macro starts after dynamic keymaps (66+(4*5*14*2)) = (66+560) +#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 626 +#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 398 +#define DYNAMIC_KEYMAP_MACRO_COUNT 16 diff --git a/keyboards/rama/m60_a/rules.mk b/keyboards/rama/m60_a/rules.mk index 9c1a2d9df..09ed03e95 100644 --- a/keyboards/rama/m60_a/rules.mk +++ b/keyboards/rama/m60_a/rules.mk @@ -1,8 +1,8 @@ # project specific files -SRC = ../zeal60/zeal60.c \ - ../zeal60/rgb_backlight.c \ +SRC = keyboards/zeal60/zeal60.c \ + keyboards/zeal60/rgb_backlight.c \ quantum/color.c \ drivers/issi/is31fl3731.c \ drivers/avr/i2c_master.c diff --git a/keyboards/rama/m6_a/config.h b/keyboards/rama/m6_a/config.h index 63da79274..049749bd7 100644 --- a/keyboards/rama/m6_a/config.h +++ b/keyboards/rama/m6_a/config.h @@ -119,11 +119,17 @@ // Bump this every time we change what we store // This will automatically reset the EEPROM with defaults // and avoid loading invalid data from the EEPROM -#define EEPROM_VERSION 0x07 +#define EEPROM_VERSION 0x08 #define EEPROM_VERSION_ADDR 34 +// NOTE: M6-A doesn't use RGB backlight, but we keep this +// consistent with M6-B which does. + // Backlight config starts after EEPROM version #define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 35 -// Dynamic keymap starts after backlight config (35+37) -#define DYNAMIC_KEYMAP_EEPROM_ADDR 72 - +// Dynamic keymap starts after backlight config (35+43) +#define DYNAMIC_KEYMAP_EEPROM_ADDR 78 +// Dynamic macro starts after dynamic keymaps (78+(4*6*2)) = (78+48) +#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 126 +#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 898 +#define DYNAMIC_KEYMAP_MACRO_COUNT 16 diff --git a/keyboards/rama/m6_a/rules.mk b/keyboards/rama/m6_a/rules.mk index ff1706918..399e9e80d 100644 --- a/keyboards/rama/m6_a/rules.mk +++ b/keyboards/rama/m6_a/rules.mk @@ -1,5 +1,5 @@ # project specific files -SRC = ../zeal60/zeal60.c +SRC = keyboards/zeal60/zeal60.c # MCU name MCU = atmega32u4 diff --git a/keyboards/rama/m6_b/config.h b/keyboards/rama/m6_b/config.h index c016703e0..67034ef8c 100644 --- a/keyboards/rama/m6_b/config.h +++ b/keyboards/rama/m6_b/config.h @@ -150,11 +150,14 @@ // Bump this every time we change what we store // This will automatically reset the EEPROM with defaults // and avoid loading invalid data from the EEPROM -#define EEPROM_VERSION 0x07 +#define EEPROM_VERSION 0x08 #define EEPROM_VERSION_ADDR 34 // Backlight config starts after EEPROM version #define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 35 -// Dynamic keymap starts after backlight config (35+37) -#define DYNAMIC_KEYMAP_EEPROM_ADDR 72 - +// Dynamic keymap starts after backlight config (35+43) +#define DYNAMIC_KEYMAP_EEPROM_ADDR 78 +// Dynamic macro starts after dynamic keymaps (78+(4*6*2)) = (78+48) +#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 126 +#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 898 +#define DYNAMIC_KEYMAP_MACRO_COUNT 16 diff --git a/keyboards/rama/m6_b/rules.mk b/keyboards/rama/m6_b/rules.mk index 1a7466af3..b7a76b8dd 100644 --- a/keyboards/rama/m6_b/rules.mk +++ b/keyboards/rama/m6_b/rules.mk @@ -1,6 +1,6 @@ # project specific files -SRC = ../zeal60/zeal60.c \ - ../zeal60/rgb_backlight.c \ +SRC = keyboards/zeal60/zeal60.c \ + keyboards/zeal60/rgb_backlight.c \ quantum/color.c \ drivers/issi/is31fl3218.c \ drivers/avr/i2c_master.c diff --git a/keyboards/rama/u80_a/config.h b/keyboards/rama/u80_a/config.h index 9c74735ad..b5dc27598 100644 --- a/keyboards/rama/u80_a/config.h +++ b/keyboards/rama/u80_a/config.h @@ -198,7 +198,9 @@ #define EEPROM_VERSION 0x07 #define EEPROM_VERSION_ADDR 34 -// Backlight config starts after EEPROM version -#define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 35 -// Dynamic keymap starts after backlight config (35+37) -#define DYNAMIC_KEYMAP_EEPROM_ADDR 72 +// Dynamic keymap starts after EEPROM version +#define DYNAMIC_KEYMAP_EEPROM_ADDR 35 +// Dynamic macro starts after dynamic keymaps (35+(4*6*17*2)) = (35+816) +#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 851 +#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 173 +#define DYNAMIC_KEYMAP_MACRO_COUNT 16 diff --git a/keyboards/wilba_tech/wt60_a/config.h b/keyboards/wilba_tech/wt60_a/config.h index 26f9ed2ba..8c18582a8 100644 --- a/keyboards/wilba_tech/wt60_a/config.h +++ b/keyboards/wilba_tech/wt60_a/config.h @@ -195,10 +195,12 @@ // Bump this every time we change what we store // This will automatically reset the EEPROM with defaults // and avoid loading invalid data from the EEPROM -#define EEPROM_VERSION 0x07 +#define EEPROM_VERSION 0x08 #define EEPROM_VERSION_ADDR 34 -// Backlight config starts after EEPROM version -#define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 35 -// Dynamic keymap starts after backlight config (35+37) -#define DYNAMIC_KEYMAP_EEPROM_ADDR 72 +// Dynamic keymap starts after EEPROM version +#define DYNAMIC_KEYMAP_EEPROM_ADDR 35 +// Dynamic macro starts after dynamic keymaps (35+(4*5*14*2)) = (35+560) +#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 595 +#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 429 +#define DYNAMIC_KEYMAP_MACRO_COUNT 16 diff --git a/keyboards/wilba_tech/wt65_a/config.h b/keyboards/wilba_tech/wt65_a/config.h index 5f535c6a7..88e902353 100644 --- a/keyboards/wilba_tech/wt65_a/config.h +++ b/keyboards/wilba_tech/wt65_a/config.h @@ -195,10 +195,12 @@ // Bump this every time we change what we store // This will automatically reset the EEPROM with defaults // and avoid loading invalid data from the EEPROM -#define EEPROM_VERSION 0x07 +#define EEPROM_VERSION 0x08 #define EEPROM_VERSION_ADDR 34 -// Backlight config starts after EEPROM version -#define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 35 -// Dynamic keymap starts after backlight config (35+37) -#define DYNAMIC_KEYMAP_EEPROM_ADDR 72 +// Dynamic keymap starts after EEPROM version +#define DYNAMIC_KEYMAP_EEPROM_ADDR 35 +// Dynamic macro starts after dynamic keymaps (35+(4*5*15*2)) = (35+600) +#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 635 +#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 389 +#define DYNAMIC_KEYMAP_MACRO_COUNT 16 diff --git a/keyboards/wilba_tech/wt80_a/config.h b/keyboards/wilba_tech/wt80_a/config.h index f78ce7fb3..ca03c366e 100644 --- a/keyboards/wilba_tech/wt80_a/config.h +++ b/keyboards/wilba_tech/wt80_a/config.h @@ -195,10 +195,12 @@ // Bump this every time we change what we store // This will automatically reset the EEPROM with defaults // and avoid loading invalid data from the EEPROM -#define EEPROM_VERSION 0x07 +#define EEPROM_VERSION 0x08 #define EEPROM_VERSION_ADDR 34 -// Backlight config starts after EEPROM version -#define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 35 -// Dynamic keymap starts after backlight config (35+37) -#define DYNAMIC_KEYMAP_EEPROM_ADDR 72 +// Dynamic keymap starts after EEPROM version +#define DYNAMIC_KEYMAP_EEPROM_ADDR 35 +// Dynamic macro starts after dynamic keymaps (35+(4*6*17*2)) = (35+816) +#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 851 +#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 173 +#define DYNAMIC_KEYMAP_MACRO_COUNT 16 diff --git a/keyboards/wilba_tech/wt_main.c b/keyboards/wilba_tech/wt_main.c index 23f07d7eb..de6d7b92c 100644 --- a/keyboards/wilba_tech/wt_main.c +++ b/keyboards/wilba_tech/wt_main.c @@ -17,6 +17,7 @@ #include "quantum.h" #include "keyboards/wilba_tech/wt_mono_backlight.h" #include "keyboards/zeal60/zeal60_api.h" // Temporary hack +#include "keyboards/zeal60/zeal60_keycodes.h" // Temporary hack #include "raw_hid.h" #include "dynamic_keymap.h" @@ -91,22 +92,57 @@ void raw_hid_receive( uint8_t *data, uint8_t length ) dynamic_keymap_reset(); break; } + case id_dynamic_keymap_macro_get_count: + { + command_data[0] = dynamic_keymap_macro_get_count(); + break; + } + case id_dynamic_keymap_macro_get_buffer_size: + { + uint16_t size = dynamic_keymap_macro_get_buffer_size(); + command_data[0] = size >> 8; + command_data[1] = size & 0xFF; + break; + } + case id_dynamic_keymap_macro_get_buffer: + { + uint16_t offset = ( command_data[0] << 8 ) | command_data[1]; + uint16_t size = command_data[2]; // size <= 28 + dynamic_keymap_macro_get_buffer( offset, size, &command_data[3] ); + break; + } + case id_dynamic_keymap_macro_set_buffer: + { + uint16_t offset = ( command_data[0] << 8 ) | command_data[1]; + uint16_t size = command_data[2]; // size <= 28 + dynamic_keymap_macro_set_buffer( offset, size, &command_data[3] ); + break; + } + case id_dynamic_keymap_macro_reset: + { + dynamic_keymap_macro_reset(); + break; + } + case id_dynamic_keymap_get_layer_count: + { + command_data[0] = dynamic_keymap_get_layer_count(); + break; + } + case id_dynamic_keymap_get_buffer: + { + uint16_t offset = ( command_data[0] << 8 ) | command_data[1]; + uint16_t size = command_data[2]; // size <= 28 + dynamic_keymap_get_buffer( offset, size, &command_data[3] ); + break; + } + case id_dynamic_keymap_set_buffer: + { + uint16_t offset = ( command_data[0] << 8 ) | command_data[1]; + uint16_t size = command_data[2]; // size <= 28 + dynamic_keymap_set_buffer( offset, size, &command_data[3] ); + break; + } #endif // DYNAMIC_KEYMAP_ENABLE - case id_backlight_config_set_value: - { - //backlight_config_set_value(command_data); - break; - } - case id_backlight_config_get_value: - { - //backlight_config_get_value(command_data); - break; - } - case id_backlight_config_save: - { - //backlight_config_save(); - break; - } case id_eeprom_reset: { eeprom_reset(); @@ -151,6 +187,8 @@ void main_init(void) #ifdef DYNAMIC_KEYMAP_ENABLE // This resets the keymaps in EEPROM to what is in flash. dynamic_keymap_reset(); + // This resets the macros in EEPROM to nothing. + dynamic_keymap_macro_reset(); #endif // Save the magic number last, in case saving was interrupted eeprom_set_valid(true); @@ -196,3 +234,43 @@ void matrix_scan_kb(void) backlight_update_pwm_buffers(); matrix_scan_user(); } + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) +{ + switch(keycode) { + case FN_MO13: + if (record->event.pressed) { + layer_on(1); + update_tri_layer(1, 2, 3); + } else { + layer_off(1); + update_tri_layer(1, 2, 3); + } + return false; + break; + case FN_MO23: + if (record->event.pressed) { + layer_on(2); + update_tri_layer(1, 2, 3); + } else { + layer_off(2); + update_tri_layer(1, 2, 3); + } + return false; + break; + } + +#ifdef DYNAMIC_KEYMAP_ENABLE + // Handle macros + if (record->event.pressed) { + if ( keycode >= MACRO00 && keycode <= MACRO15 ) + { + uint8_t id = keycode - MACRO00; + dynamic_keymap_macro_send(id); + return false; + } + } +#endif //DYNAMIC_KEYMAP_ENABLE + + return process_record_user(keycode, record); +} diff --git a/keyboards/zeal60/config.h b/keyboards/zeal60/config.h index baa4978a8..d1bd3f6a1 100644 --- a/keyboards/zeal60/config.h +++ b/keyboards/zeal60/config.h @@ -115,11 +115,15 @@ // Bump this every time we change what we store // This will automatically reset the EEPROM with defaults // and avoid loading invalid data from the EEPROM -#define EEPROM_VERSION 0x07 +#define EEPROM_VERSION 0x08 #define EEPROM_VERSION_ADDR 34 // Backlight config starts after EEPROM version #define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 35 -// Dynamic keymap starts after backlight config (35+37) -#define DYNAMIC_KEYMAP_EEPROM_ADDR 72 +// Dynamic keymap starts after backlight config (35+31) +#define DYNAMIC_KEYMAP_EEPROM_ADDR 66 +// Dynamic macro starts after dynamic keymaps (66+(4*5*14*2)) = (66+560) +#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 626 +#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 398 +#define DYNAMIC_KEYMAP_MACRO_COUNT 16 diff --git a/keyboards/zeal60/rgb_backlight.c b/keyboards/zeal60/rgb_backlight.c index c3dade123..64b95059e 100644 --- a/keyboards/zeal60/rgb_backlight.c +++ b/keyboards/zeal60/rgb_backlight.c @@ -15,9 +15,9 @@ */ #if RGB_BACKLIGHT_ENABLED -#if defined (RGB_BACKLIGHT_ZEAL60) || defined (RGB_BACKLIGHT_ZEAL65) || defined (RGB_BACKLIGHT_M60_A) || defined(RGB_BACKLIGHT_M6_B) +#if defined (RGB_BACKLIGHT_ZEAL60) || defined (RGB_BACKLIGHT_ZEAL65) || defined (RGB_BACKLIGHT_M60_A) || defined(RGB_BACKLIGHT_M6_B) || defined(RGB_BACKLIGHT_KOYU) #else -#error None of the following was defined: RGB_BACKLIGHT_ZEAL60, RGB_BACKLIGHT_ZEAL65, RGB_BACKLIGHT_M60_A, RGB_BACKLIGHT_M6_B +#error None of the following was defined: RGB_BACKLIGHT_ZEAL60, RGB_BACKLIGHT_ZEAL65, RGB_BACKLIGHT_M60_A, RGB_BACKLIGHT_M6_B, RGB_BACKLIGHT_KOYU #endif #include "quantum.h" @@ -55,18 +55,21 @@ backlight_config g_config = { .brightness = 255, .effect = RGB_BACKLIGHT_EFFECT, .effect_speed = 0, - .color_1 = { .h = 0, .s = 255, .v = 255 }, - .color_2 = { .h = 127, .s = 255, .v = 255 }, - .caps_lock_indicator = { .color = { .h = 0, .s = 0, .v = 255 }, .index = 255 }, - .layer_1_indicator = { .color = { .h = 0, .s = 0, .v = 255 }, .index = 255 }, - .layer_2_indicator = { .color = { .h = 0, .s = 0, .v = 255 }, .index = 255 }, - .layer_3_indicator = { .color = { .h = 0, .s = 0, .v = 255 }, .index = 255 }, + .color_1 = { .h = 0, .s = 255 }, + .color_2 = { .h = 127, .s = 255 }, + .caps_lock_indicator = { .color = { .h = 0, .s = 0 }, .index = 255 }, + .layer_1_indicator = { .color = { .h = 0, .s = 0 }, .index = 255 }, + .layer_2_indicator = { .color = { .h = 0, .s = 0 }, .index = 255 }, + .layer_3_indicator = { .color = { .h = 0, .s = 0 }, .index = 255 }, .alphas_mods = { RGB_BACKLIGHT_ALPHAS_MODS_ROW_0, RGB_BACKLIGHT_ALPHAS_MODS_ROW_1, RGB_BACKLIGHT_ALPHAS_MODS_ROW_2, RGB_BACKLIGHT_ALPHAS_MODS_ROW_3, - RGB_BACKLIGHT_ALPHAS_MODS_ROW_4 } + RGB_BACKLIGHT_ALPHAS_MODS_ROW_4 }, +#if defined(RGB_BACKLIGHT_M6_B) + .custom_color = { { 0, 255 }, { 43, 255 }, { 85, 255 }, { 128, 255 }, { 171, 255 }, { 213, 255 } } +#endif }; bool g_suspend_state = false; @@ -199,7 +202,7 @@ const Point g_map_led_to_point[BACKLIGHT_LED_COUNT] PROGMEM = { }; const Point g_map_led_to_point_polar[BACKLIGHT_LED_COUNT] PROGMEM = { // LA0..LA17 - {64,128}, {75,132}, {84,145}, {91,164}, {97,187}, {102,213}, {105,242}, {109,255}, {128,247}, + {64,128}, {75,132}, {84,145}, {91,164}, {97,187}, {102,213}, {105,242}, {109,255}, {128,243}, {61,255}, {67,255}, {72,255}, {77,255}, {82,255}, {86,255}, {90,255}, {93,255}, {96,255}, // LB0..LB17 {56,255}, {51,255}, {46,255}, {42,255}, {37,255}, {35,255}, {32,255}, {19,255}, {0,255}, @@ -208,8 +211,37 @@ const Point g_map_led_to_point_polar[BACKLIGHT_LED_COUNT] PROGMEM = { {184,255}, {179,135}, {170,149}, {163,169}, {157,193}, {153,220}, {255,255}, {167,255}, {165,255}, {128,26}, {128,60}, {128,94}, {128,128}, {128,162}, {128,196}, {145,233}, {148,255}, {161,255}, // LD0..LD17 - {0,9}, {0,43}, {0,77}, {0,111}, {0,145}, {255,201}, {224,181}, {230,217}, {235,255}, - {189,128}, {200,131}, {210,141}, {218,159}, {201,228}, {201,228}, {206,255}, {213,255}, {218,255} + {0,9}, {0,43}, {0,77}, {0,111}, {0,145}, {0,201}, {224,181}, {230,217}, {235,255}, + {189,128}, {200,131}, {210,141}, {218,159}, {255,255}, {201,228}, {206,255}, {213,255}, {218,255} +}; +#elif defined (RGB_BACKLIGHT_KOYU) +const Point g_map_led_to_point[BACKLIGHT_LED_COUNT] PROGMEM = { + // LA0..LA17 + {120,16}, {104,16}, {88,16}, {72,16}, {56,16}, {40,16}, {24,16}, {4,16}, {4,32}, + {128,0}, {112,0}, {96,0}, {80,0}, {64,0}, {48,0}, {32,0}, {16,0}, {0,0}, + // LB0..LB17 + {144,0}, {160,0}, {176,0}, {192,0}, {208,0}, {224,0}, {240,0}, {240,16}, {240,32}, + {136,16}, {152,16}, {168,16}, {184,16}, {200,16}, {220,16}, {240,48}, {240,64}, {224,64}, + // LC0..LC17 + {112,64}, {100,48}, {84,48}, {68,48}, {52,48}, {36,48}, {64,60}, {44,60}, {24,64}, + {108,32}, {92,32}, {76,32}, {60,32}, {44,32}, {28,32}, {255,255}, {10,48}, {4,64}, + // LD0..LD17 + {124,32}, {140,32}, {156,32}, {172,32}, {188,32}, {214,32}, {180,48}, {202,48}, {224,48}, + {116,48}, {132,48}, {148,48}, {164,48}, {255,255}, {160,60}, {180,64}, {208,64}, {255,255} +}; +const Point g_map_led_to_point_polar[BACKLIGHT_LED_COUNT] PROGMEM = { + // LA0..LA17 + {64,128}, {75,132}, {84,145}, {91,164}, {97,187}, {102,213}, {105,242}, {109,255}, {128,243}, + {61,255}, {67,255}, {72,255}, {77,255}, {82,255}, {86,255}, {90,255}, {93,255}, {96,255}, + // LB0..LB17 + {56,255}, {51,255}, {46,255}, {42,255}, {38,255}, {35,255}, {32,255}, {19,255}, {0,255}, + {53,132}, {44,145}, {37,164}, {31,187}, {26,213}, {22,249}, {237,255}, {224,255}, {221,255}, + // LC0..LC17 + {189,255}, {179,135}, {170,149}, {163,169}, {157,193}, {153,220}, {172,252}, {169,255}, {165,255}, + {128,26}, {128,60}, {128,94}, {128,128}, {128,162}, {128,196}, {255,255}, {148,255}, {161,255}, + // LD0..LD17 + {0,9}, {0,43}, {0,77}, {0,111}, {0,145}, {0,201}, {224,181}, {230,217}, {235,255}, + {189,128}, {200,131}, {210,141}, {218,159}, {255,255}, {207,238}, {211,255}, {218,255}, {255,255} }; #elif defined (RGB_BACKLIGHT_ZEAL60) || defined (RGB_BACKLIGHT_M60_A) const Point g_map_led_to_point[BACKLIGHT_LED_COUNT] PROGMEM = { @@ -248,7 +280,7 @@ const Point g_map_led_to_point[BACKLIGHT_LED_COUNT] PROGMEM = { {0,0}, {0,16}, {16,16}, {16,0}, {32,16}, {32,0} }; const Point g_map_led_to_point_polar[BACKLIGHT_LED_COUNT] PROGMEM = { - {0,0}, {0,16}, {16,16}, {16,0}, {32,16}, {32,0} + {160,255}, {96,255}, {77,255}, {179,255}, {51,255}, {205,255} }; #endif @@ -318,7 +350,7 @@ void map_led_to_point_polar( uint8_t index, Point *point ) #if defined (RGB_BACKLIGHT_ZEAL65) -// Note: Left spacebar stab is at 4,3 (LC7) +// Note: Left spacebar stab is at 4,2 (LC7) // Right spacebar stab is at 4,9 (D14) // // A17, A16, A15, A14, A13, A12, A11, A10, A9, B0, B1, B2, B3, B4, B6 @@ -333,6 +365,22 @@ const uint8_t g_map_row_column_to_led[MATRIX_ROWS][MATRIX_COLS] PROGMEM = { { 36+16, 36+15, 36+5, 36+4, 36+3, 36+2, 36+1, 54+9, 54+10, 54+11, 54+12, 54+6, 54+7, 54+8, 18+15 }, { 36+17, 36+8, 36+7, 255, 255, 255, 255, 36+0, 255, 54+14, 54+15, 54+16, 54+17, 18+17, 18+16 } }; +#elif defined(RGB_BACKLIGHT_KOYU) +// Note: Left spacebar stab is at 4,4 (LC6) +// Right spacebar stab is at 4,10 (D14) +// +// A17, A16, A15, A14, A13, A12, A11, A10, A9, B0, B1, B2, B3, B4, B6 +// A7, A6, A5, A4, A3, A2, A1, A0, B9, B10, B11, B12, B13, B14, B7 +// A8, C14, C13, C12, C11, C10, C9, D0, D1, D2, D3, D4, D5, B5, B8 +// C16, C15, C5, C4, C3, C2, C1, D9, D10, D11, D12, D6, D7, D8, B15 +// C17, C8, C7, C6, ---, ---, ---, C0, ---, ---, D14, D15, D16, B17, B16 +const uint8_t g_map_row_column_to_led[MATRIX_ROWS][MATRIX_COLS] PROGMEM = { + { 0+17, 0+16, 0+15, 0+14, 0+13, 0+12, 0+11, 0+10, 0+9, 18+0, 18+1, 18+2, 18+3, 18+4, 18+6 }, + { 0+7, 0+6, 0+5, 0+4, 0+3, 0+2, 0+1, 0+0, 18+9, 18+10, 18+11, 18+12, 18+13, 18+14, 18+7 }, + { 0+8, 36+14, 36+13, 36+12, 36+11, 36+10, 36+9, 54+0, 54+1, 54+2, 54+3, 54+4, 54+5, 18+5, 18+8 }, + { 36+16, 36+15, 36+5, 36+4, 36+3, 36+2, 36+1, 54+9, 54+10, 54+11, 54+12, 54+6, 54+7, 54+8, 18+15 }, + { 36+17, 36+8, 36+7, 36+6, 255, 255, 255, 36+0, 255, 255, 54+14, 54+15, 54+16, 18+17, 18+16 } +}; #elif defined (RGB_BACKLIGHT_ZEAL60) || defined (RGB_BACKLIGHT_M60_A) // Note: Left spacebar stab is at 4,3 (LC6) // Right spacebar stab is at 4,9 (LD13) or 4,10 (LD14) @@ -781,8 +829,24 @@ void backlight_effect_cycle_radial2(void) } } -void backlight_effect_indicators_set_colors( uint8_t index, HSV hsv ) +#if defined(RGB_BACKLIGHT_M6_B) +void backlight_effect_custom_colors(void) { + RGB rgb; + for ( uint8_t i = 0; i < 6; i++ ) + { + HSV hsv = { .h = g_config.custom_color[i].h, .s = g_config.custom_color[i].s, .v = g_config.brightness }; + rgb = hsv_to_rgb( hsv ); + uint8_t led; + map_row_column_to_led( 0, i, &led ); + backlight_set_color( led, rgb.r, rgb.g, rgb.b ); + } +} +#endif + +void backlight_effect_indicators_set_colors( uint8_t index, HS color ) +{ + HSV hsv = { .h = color.h, .s = color.s, .v = g_config.brightness }; RGB rgb = hsv_to_rgb( hsv ); if ( index == 254 ) { @@ -799,6 +863,9 @@ void backlight_effect_indicators_set_colors( uint8_t index, HSV hsv ) #if defined (RGB_BACKLIGHT_ZEAL65) backlight_set_color( 36+7, rgb.r, rgb.g, rgb.b ); // LC7 backlight_set_color( 54+14, rgb.r, rgb.g, rgb.b ); // LD14 +#elif defined (RGB_BACKLIGHT_KOYU) + backlight_set_color( 36+6, rgb.r, rgb.g, rgb.b ); // LC6 + backlight_set_color( 54+14, rgb.r, rgb.g, rgb.b ); // LD14 #elif defined (RGB_BACKLIGHT_ZEAL60) || defined (RGB_BACKLIGHT_M60_A) backlight_set_color( 36+6, rgb.r, rgb.g, rgb.b ); // LC6 backlight_set_color( 54+13, rgb.r, rgb.g, rgb.b ); // LD13 @@ -911,7 +978,11 @@ ISR(TIMER3_COMPA_vect) backlight_effect_solid_color(); break; case 2: +#if defined(RGB_BACKLIGHT_M6_B) + backlight_effect_custom_colors(); +#else backlight_effect_alphas_mods(); +#endif break; case 3: backlight_effect_gradient_up_down(); @@ -989,18 +1060,16 @@ void backlight_get_indicator_row_col( uint8_t index, uint8_t *row, uint8_t *colu } // Some helpers for setting/getting HSV -void _set_color( HSV *color, uint8_t *data ) +void _set_color( HS *color, uint8_t *data ) { color->h = data[0]; color->s = data[1]; - color->v = data[2]; } -void _get_color( HSV *color, uint8_t *data ) +void _get_color( HS *color, uint8_t *data ) { data[0] = color->h; data[1] = color->s; - data[2] = color->v; } void backlight_config_set_value( uint8_t *data ) @@ -1132,6 +1201,16 @@ void backlight_config_set_value( uint8_t *data ) g_config.alphas_mods[i] = ( *(value_data+i*2) << 8 ) | ( *(value_data+i*2+1) ); } } +#if defined(RGB_BACKLIGHT_M6_B) + case id_custom_color: + { + uint8_t index = value_data[0]; + if ( index >= 0 && index <= 6 ) + { + _set_color( &(g_config.custom_color[index]), &(value_data[1]) ); + } + } +#endif } if ( reinitialize ) @@ -1259,6 +1338,16 @@ void backlight_config_get_value( uint8_t *data ) *(value_data+i*2+1) = g_config.alphas_mods[i] & 0xFF; } } +#if defined(RGB_BACKLIGHT_M6_B) + case id_custom_color: + { + uint8_t index = value_data[0]; + if ( index >= 0 && index <= 6 ) + { + _get_color( &(g_config.custom_color[index]), &(value_data[1]) ); + } + } +#endif } } @@ -1301,6 +1390,10 @@ void backlight_init_drivers(void) bool enabled = !( ( index == 18+5 && !g_config.use_split_backspace ) || // LB5 ( index == 36+6 ) || // LC6 ( index == 54+13 ) ); // LD13 +#elif defined (RGB_BACKLIGHT_KOYU) + bool enabled = !( ( index == 36+15 ) || // LC15 + ( index == 54+13 ) || // LD13 + ( index == 54+17 ) ); // LD17 #elif defined (RGB_BACKLIGHT_M60_A) bool enabled = !( // LB6 LB7 LB8 LB15 LB16 LB17 not present on M60-A diff --git a/keyboards/zeal60/rgb_backlight.h b/keyboards/zeal60/rgb_backlight.h index 60f2ace51..aa24e3491 100644 --- a/keyboards/zeal60/rgb_backlight.h +++ b/keyboards/zeal60/rgb_backlight.h @@ -25,9 +25,15 @@ #include "quantum/color.h" +typedef struct PACKED +{ + uint8_t h; + uint8_t s; +} HS; + typedef struct { - HSV color; + HS color; uint8_t index; } backlight_config_indicator; @@ -45,14 +51,17 @@ typedef struct uint8_t brightness; // 1 byte uint8_t effect; // 1 byte uint8_t effect_speed; // 1 byte - HSV color_1; // 3 bytes - HSV color_2; // 3 bytes - backlight_config_indicator caps_lock_indicator; // 4 bytes - backlight_config_indicator layer_1_indicator; // 4 bytes - backlight_config_indicator layer_2_indicator; // 4 bytes - backlight_config_indicator layer_3_indicator; // 4 bytes + HS color_1; // 2 bytes + HS color_2; // 2 bytes + backlight_config_indicator caps_lock_indicator; // 3 bytes + backlight_config_indicator layer_1_indicator; // 3 bytes + backlight_config_indicator layer_2_indicator; // 3 bytes + backlight_config_indicator layer_3_indicator; // 3 bytes uint16_t alphas_mods[5]; // 10 bytes -} backlight_config; // = 37 bytes +#if defined(RGB_BACKLIGHT_M6_B) + HS custom_color[6]; // 12 bytes +#endif +} backlight_config; // = 31 bytes (M6-B = 43 bytes) void backlight_config_load(void); void backlight_config_save(void); diff --git a/keyboards/zeal60/rgb_backlight_api.h b/keyboards/zeal60/rgb_backlight_api.h index 01827e849..680ba4d99 100644 --- a/keyboards/zeal60/rgb_backlight_api.h +++ b/keyboards/zeal60/rgb_backlight_api.h @@ -38,5 +38,6 @@ enum backlight_config_value id_layer_2_indicator_row_col = 0x13, id_layer_3_indicator_color = 0x14, id_layer_3_indicator_row_col = 0x15, - id_alphas_mods = 0x16 + id_alphas_mods = 0x16, + id_custom_color = 0x17 }; diff --git a/keyboards/zeal60/zeal60.c b/keyboards/zeal60/zeal60.c index b3b5d03fd..5f93c571a 100644 --- a/keyboards/zeal60/zeal60.c +++ b/keyboards/zeal60/zeal60.c @@ -94,6 +94,56 @@ void raw_hid_receive( uint8_t *data, uint8_t length ) dynamic_keymap_reset(); break; } + case id_dynamic_keymap_macro_get_count: + { + command_data[0] = dynamic_keymap_macro_get_count(); + break; + } + case id_dynamic_keymap_macro_get_buffer_size: + { + uint16_t size = dynamic_keymap_macro_get_buffer_size(); + command_data[0] = size >> 8; + command_data[1] = size & 0xFF; + break; + } + case id_dynamic_keymap_macro_get_buffer: + { + uint16_t offset = ( command_data[0] << 8 ) | command_data[1]; + uint16_t size = command_data[2]; // size <= 28 + dynamic_keymap_macro_get_buffer( offset, size, &command_data[3] ); + break; + } + case id_dynamic_keymap_macro_set_buffer: + { + uint16_t offset = ( command_data[0] << 8 ) | command_data[1]; + uint16_t size = command_data[2]; // size <= 28 + dynamic_keymap_macro_set_buffer( offset, size, &command_data[3] ); + break; + } + case id_dynamic_keymap_macro_reset: + { + dynamic_keymap_macro_reset(); + break; + } + case id_dynamic_keymap_get_layer_count: + { + command_data[0] = dynamic_keymap_get_layer_count(); + break; + } + case id_dynamic_keymap_get_buffer: + { + uint16_t offset = ( command_data[0] << 8 ) | command_data[1]; + uint16_t size = command_data[2]; // size <= 28 + dynamic_keymap_get_buffer( offset, size, &command_data[3] ); + break; + } + case id_dynamic_keymap_set_buffer: + { + uint16_t offset = ( command_data[0] << 8 ) | command_data[1]; + uint16_t size = command_data[2]; // size <= 28 + dynamic_keymap_set_buffer( offset, size, &command_data[3] ); + break; + } #endif // DYNAMIC_KEYMAP_ENABLE #if RGB_BACKLIGHT_ENABLED case id_backlight_config_set_value: @@ -160,6 +210,8 @@ void main_init(void) #ifdef DYNAMIC_KEYMAP_ENABLE // This resets the keymaps in EEPROM to what is in flash. dynamic_keymap_reset(); + // This resets the macros in EEPROM to nothing. + dynamic_keymap_macro_reset(); #endif // Save the magic number last, in case saving was interrupted eeprom_set_valid(true); @@ -238,7 +290,19 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) return false; break; } - + +#ifdef DYNAMIC_KEYMAP_ENABLE + // Handle macros + if (record->event.pressed) { + if ( keycode >= MACRO00 && keycode <= MACRO15 ) + { + uint8_t id = keycode - MACRO00; + dynamic_keymap_macro_send(id); + return false; + } + } +#endif //DYNAMIC_KEYMAP_ENABLE + return process_record_user(keycode, record); } @@ -263,28 +327,6 @@ uint16_t keymap_function_id_to_action( uint16_t function_id ) } } -#if USE_KEYMAPS_IN_EEPROM - -#if 0 - // This is how to implement actions stored in EEPROM. - // Not yet implemented. Not sure if it's worth the trouble - // before we have a nice GUI for keymap editing. - if ( eeprom_is_valid() && - function_id < 32 ) // TODO: replace magic number - { - uint16_t action = keymap_action_load(function_id); - - // If action is not "empty", return it, otherwise - // drop down to return the one in flash - if ( action != 0x0000 ) // TODO: replace magic number - { - return action; - } - } -#endif - -#endif // USE_KEYMAPS_IN_EEPROM - return pgm_read_word(&fn_actions[function_id]); } diff --git a/keyboards/zeal60/zeal60_api.h b/keyboards/zeal60/zeal60_api.h index a65bf2f50..8061146fd 100644 --- a/keyboards/zeal60/zeal60_api.h +++ b/keyboards/zeal60/zeal60_api.h @@ -15,7 +15,7 @@ */ #pragma once -#define PROTOCOL_VERSION 0x0007 +#define PROTOCOL_VERSION 0x0008 enum zeal60_command_id { @@ -30,6 +30,14 @@ enum zeal60_command_id id_backlight_config_save, id_eeprom_reset, id_bootloader_jump, + id_dynamic_keymap_macro_get_count, + id_dynamic_keymap_macro_get_buffer_size, + id_dynamic_keymap_macro_get_buffer, + id_dynamic_keymap_macro_set_buffer, + id_dynamic_keymap_macro_reset, + id_dynamic_keymap_get_layer_count, + id_dynamic_keymap_get_buffer, + id_dynamic_keymap_set_buffer, id_unhandled = 0xFF, }; diff --git a/keyboards/zeal60/zeal60_keycodes.h b/keyboards/zeal60/zeal60_keycodes.h index 9511801eb..d9abf602b 100644 --- a/keyboards/zeal60/zeal60_keycodes.h +++ b/keyboards/zeal60/zeal60_keycodes.h @@ -22,7 +22,23 @@ // Backlight keycodes are in range 0x5F00-0x5F0F enum zeal60_keycodes { FN_MO13 = 0x5F10, - FN_MO23 + FN_MO23, + MACRO00, + MACRO01, + MACRO02, + MACRO03, + MACRO04, + MACRO05, + MACRO06, + MACRO07, + MACRO08, + MACRO09, + MACRO10, + MACRO11, + MACRO12, + MACRO13, + MACRO14, + MACRO15, }; // Zeal60 specific "action functions" diff --git a/keyboards/zeal65/config.h b/keyboards/zeal65/config.h index 683df2038..63ce1c12a 100644 --- a/keyboards/zeal65/config.h +++ b/keyboards/zeal65/config.h @@ -115,11 +115,15 @@ // Bump this every time we change what we store // This will automatically reset the EEPROM with defaults // and avoid loading invalid data from the EEPROM -#define EEPROM_VERSION 0x07 +#define EEPROM_VERSION 0x08 #define EEPROM_VERSION_ADDR 34 // Backlight config starts after EEPROM version #define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 35 -// Dynamic keymap starts after backlight config (35+37) -#define DYNAMIC_KEYMAP_EEPROM_ADDR 72 +// Dynamic keymap starts after backlight config (35+31) +#define DYNAMIC_KEYMAP_EEPROM_ADDR 66 +// Dynamic macro starts after dynamic keymaps (66+(4*5*15*2)) = (66+600) +#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 666 +#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 358 +#define DYNAMIC_KEYMAP_MACRO_COUNT 16 diff --git a/keyboards/zeal65/rules.mk b/keyboards/zeal65/rules.mk index 7ab1b7d3b..596c1e649 100644 --- a/keyboards/zeal65/rules.mk +++ b/keyboards/zeal65/rules.mk @@ -1,8 +1,8 @@ # project specific files -SRC = ../zeal60/zeal60.c \ - ../zeal60/rgb_backlight.c \ +SRC = keyboards/zeal60/zeal60.c \ + keyboards/zeal60/rgb_backlight.c \ quantum/color.c \ drivers/issi/is31fl3731.c \ drivers/avr/i2c_master.c diff --git a/quantum/dynamic_keymap.c b/quantum/dynamic_keymap.c index ee39a2025..14627a93d 100644 --- a/quantum/dynamic_keymap.c +++ b/quantum/dynamic_keymap.c @@ -18,7 +18,7 @@ #include "keymap.h" // to get keymaps[][][] #include "tmk_core/common/eeprom.h" #include "progmem.h" // to read default from flash - +#include "quantum.h" // for send_string() #include "dynamic_keymap.h" #ifdef DYNAMIC_KEYMAP_ENABLE @@ -31,6 +31,23 @@ #error DYNAMIC_KEYMAP_LAYER_COUNT not defined #endif +#ifndef DYNAMIC_KEYMAP_MACRO_COUNT +#error DYNAMIC_KEYMAP_MACRO_COUNT not defined +#endif + +#ifndef DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR +#error DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR not defined +#endif + +#ifndef DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE +#error DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE not defined +#endif + +uint8_t dynamic_keymap_get_layer_count(void) +{ + return DYNAMIC_KEYMAP_LAYER_COUNT; +} + void *dynamic_keymap_key_to_eeprom_address(uint8_t layer, uint8_t row, uint8_t column) { // TODO: optimize this with some left shifts @@ -69,6 +86,36 @@ void dynamic_keymap_reset(void) } } +void dynamic_keymap_get_buffer( uint16_t offset, uint16_t size, uint8_t *data ) +{ + uint16_t dynamic_keymap_eeprom_size = DYNAMIC_KEYMAP_LAYER_COUNT * MATRIX_ROWS * MATRIX_COLS * 2; + void *source = (void*)(DYNAMIC_KEYMAP_EEPROM_ADDR+offset); + uint8_t *target = data; + for ( uint16_t i = 0; i < size; i++ ) { + if ( offset + i < dynamic_keymap_eeprom_size ) { + *target = eeprom_read_byte(source); + } else { + *target = 0x00; + } + source++; + target++; + } +} + +void dynamic_keymap_set_buffer( uint16_t offset, uint16_t size, uint8_t *data ) +{ + uint16_t dynamic_keymap_eeprom_size = DYNAMIC_KEYMAP_LAYER_COUNT * MATRIX_ROWS * MATRIX_COLS * 2; + void *target = (void*)(DYNAMIC_KEYMAP_EEPROM_ADDR+offset); + uint8_t *source = data; + for ( uint16_t i = 0; i < size; i++ ) { + if ( offset + i < dynamic_keymap_eeprom_size ) { + eeprom_update_byte(target, *source); + } + source++; + target++; + } +} + // This overrides the one in quantum/keymap_common.c uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key) { @@ -81,5 +128,103 @@ uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key) } } + + +uint8_t dynamic_keymap_macro_get_count(void) +{ + return DYNAMIC_KEYMAP_MACRO_COUNT; +} + +uint16_t dynamic_keymap_macro_get_buffer_size(void) +{ + return DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE; +} + +void dynamic_keymap_macro_get_buffer( uint16_t offset, uint16_t size, uint8_t *data ) +{ + void *source = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR+offset); + uint8_t *target = data; + for ( uint16_t i = 0; i < size; i++ ) { + if ( offset + i < DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE ) { + *target = eeprom_read_byte(source); + } else { + *target = 0x00; + } + source++; + target++; + } +} + +void dynamic_keymap_macro_set_buffer( uint16_t offset, uint16_t size, uint8_t *data ) +{ + void *target = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR+offset); + uint8_t *source = data; + for ( uint16_t i = 0; i < size; i++ ) { + if ( offset + i < DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE ) { + eeprom_update_byte(target, *source); + } + source++; + target++; + } +} + +void dynamic_keymap_macro_reset(void) +{ + void *p = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR); + void *end = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR+DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE); + while ( p != end ) { + eeprom_update_byte(p, 0); + ++p; + } +} + +void dynamic_keymap_macro_send( uint8_t id ) +{ + if ( id >= DYNAMIC_KEYMAP_MACRO_COUNT ) { + return; + } + + // Check the last byte of the buffer. + // If it's not zero, then we are in the middle + // of buffer writing, possibly an aborted buffer + // write. So do nothing. + void *p = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR+DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE-1); + if ( eeprom_read_byte(p) != 0 ) { + return; + } + + // Skip N null characters + // p will then point to the Nth macro + p = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR); + void *end = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR+DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE); + while ( id > 0 ) { + // If we are past the end of the buffer, then the buffer + // contents are garbage, i.e. there were not DYNAMIC_KEYMAP_MACRO_COUNT + // nulls in the buffer. + if ( p == end ) { + return; + } + if ( eeprom_read_byte(p) == 0 ) { + --id; + } + ++p; + } + + // Send the macro string one char at a time + // by making temporary 1 char strings + char data[2] = { 0, 0 }; + // We already checked there was a null at the end of + // the buffer, so this cannot go past the end + while ( 1 ) { + data[0] = eeprom_read_byte(p); + // Stop at the null terminator of this macro string + if ( data[0] == 0 ) { + break; + } + send_string(data); + ++p; + } +} + #endif // DYNAMIC_KEYMAP_ENABLE diff --git a/quantum/dynamic_keymap.h b/quantum/dynamic_keymap.h index bd76adae2..63653f6cb 100644 --- a/quantum/dynamic_keymap.h +++ b/quantum/dynamic_keymap.h @@ -18,11 +18,46 @@ #include #include +uint8_t dynamic_keymap_get_layer_count(void); void *dynamic_keymap_key_to_eeprom_address(uint8_t layer, uint8_t row, uint8_t column); uint16_t dynamic_keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t column); void dynamic_keymap_set_keycode(uint8_t layer, uint8_t row, uint8_t column, uint16_t keycode); void dynamic_keymap_reset(void); +// These get/set the keycodes as stored in the EEPROM buffer +// Data is big-endian 16-bit values (the keycodes) +// Order is by layer/row/column +// Thus offset 0 = 0,0,0, offset MATRIX_COLS*2 = 0,1,0, offset MATRIX_ROWS*MATRIX_COLS*2 = 1,0,0 +// Note the *2, because offset is in bytes and keycodes are two bytes +// This is only really useful for host applications that want to get a whole keymap fast, +// by reading 14 keycodes (28 bytes) at a time, reducing the number of raw HID transfers by +// a factor of 14. +void dynamic_keymap_get_buffer( uint16_t offset, uint16_t size, uint8_t *data ); +void dynamic_keymap_set_buffer( uint16_t offset, uint16_t size, uint8_t *data ); // This overrides the one in quantum/keymap_common.c // uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key); + + +// Note regarding dynamic_keymap_macro_set_buffer(): +// The last byte of the buffer is used as a valid flag, +// so macro sending is disabled during writing a new buffer, +// should it happen during, or after an interrupted transfer. +// +// Users writing to the buffer must first set the last byte of the buffer +// to non-zero (i.e. 0xFF). After (or during) the final write, set the +// last byte of the buffer to zero. +// +// Since the contents of the buffer must be a list of null terminated +// strings, the last byte must be a null when at maximum capacity, +// and it not being null means the buffer can be considered in an +// invalid state. + +uint8_t dynamic_keymap_macro_get_count(void); +uint16_t dynamic_keymap_macro_get_buffer_size(void); +void dynamic_keymap_macro_get_buffer( uint16_t offset, uint16_t size, uint8_t *data ); +void dynamic_keymap_macro_set_buffer( uint16_t offset, uint16_t size, uint8_t *data ); +void dynamic_keymap_macro_reset(void); + +void dynamic_keymap_macro_send( uint8_t id ); + From 8c033497c62970087ae16c3e7c42fd72f3e1ecbe Mon Sep 17 00:00:00 2001 From: Alex Mayer Date: Fri, 30 Nov 2018 17:51:45 -0500 Subject: [PATCH 590/788] Planck: Align Keycode Columns (#4523) Remove Extra Newlines --- keyboards/planck/keymaps/default/keymap.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/keyboards/planck/keymaps/default/keymap.c b/keyboards/planck/keymaps/default/keymap.c index 0b787cd12..03cc0049e 100644 --- a/keyboards/planck/keymaps/default/keymap.c +++ b/keyboards/planck/keymaps/default/keymap.c @@ -144,7 +144,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Exit | | | A | O | | E | U | | | | * `-----------------------------------------------------------------------------------' */ - [_PLOVER] = LAYOUT_planck_grid( KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1 , XXXXXXX, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, @@ -164,13 +163,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_ADJUST] = LAYOUT_planck_grid( - _______, RESET, DEBUG, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_DEL , - _______, _______, MU_MOD, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, PLOVER, _______, + _______, RESET, DEBUG, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_DEL , + _______, _______, MU_MOD, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, PLOVER, _______, _______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, TERM_ON, TERM_OFF, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ) - }; #ifdef AUDIO_ENABLE From 5803012eda70d2ad85434e53820f2c93c310f92e Mon Sep 17 00:00:00 2001 From: Jason Thigpen Date: Sat, 1 Dec 2018 08:17:50 -0800 Subject: [PATCH 591/788] Add a layout to support tsangan bottom row with split bs and rshift (#4521) * Add a layout to support tsangan bottom row with split bs and rshift * Move the new layout to defaults * Rename layout to be more accurately representative * Rename files to match renamed layout def --- .../keymap.c | 21 +++++++++++++++++++ .../layout.json | 5 +++++ .../60_ansi_tsangan_split_bs_rshift/readme.md | 3 +++ 3 files changed, 29 insertions(+) create mode 100644 layouts/default/60_ansi_tsangan_split_bs_rshift/default_60_ansi_tsangan_split_bs_rshift/keymap.c create mode 100644 layouts/default/60_ansi_tsangan_split_bs_rshift/layout.json create mode 100644 layouts/default/60_ansi_tsangan_split_bs_rshift/readme.md diff --git a/layouts/default/60_ansi_tsangan_split_bs_rshift/default_60_ansi_tsangan_split_bs_rshift/keymap.c b/layouts/default/60_ansi_tsangan_split_bs_rshift/default_60_ansi_tsangan_split_bs_rshift/keymap.c new file mode 100644 index 000000000..17b47eecf --- /dev/null +++ b/layouts/default/60_ansi_tsangan_split_bs_rshift/default_60_ansi_tsangan_split_bs_rshift/keymap.c @@ -0,0 +1,21 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_60_ansi_tsangan_split_bs_rshift( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL,KC_BSPC,KC_BSPC, + KC_TAB , KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC, KC_BSLS , + KC_CAPS , KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_ENT , + KC_LSFT , KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT ,KC_RSFT, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL + ) +}; + +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { + +}; + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { + +}; diff --git a/layouts/default/60_ansi_tsangan_split_bs_rshift/layout.json b/layouts/default/60_ansi_tsangan_split_bs_rshift/layout.json new file mode 100644 index 000000000..117d26d41 --- /dev/null +++ b/layouts/default/60_ansi_tsangan_split_bs_rshift/layout.json @@ -0,0 +1,5 @@ +[{a:7},"","","","","","","","","","","","","","",""], +[{w:1.5},"","","","","","","","","","","","","",{w:1.5},""], +[{w:1.75},"","","","","","","","","","","","",{w:2.25},""], +[{w:2.25},"","","","","","","","","","","",{w:1.75},"",{w:1},""], +[{w:1.5},"",{w:1},"",{w:1.5},"",{w:7},"",{w:1.5},"",{w:1},"",{w:1.5},""] diff --git a/layouts/default/60_ansi_tsangan_split_bs_rshift/readme.md b/layouts/default/60_ansi_tsangan_split_bs_rshift/readme.md new file mode 100644 index 000000000..ad1c598b3 --- /dev/null +++ b/layouts/default/60_ansi_tsangan_split_bs_rshift/readme.md @@ -0,0 +1,3 @@ +# 60_ansi_tsangan_split_bs_rshift + + LAYOUT_60_ansi_tsangan_split_bs_rshift \ No newline at end of file From 75a51659abfbc68874f2e9326f0adf1258fc5458 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sat, 1 Dec 2018 08:21:06 -0800 Subject: [PATCH 592/788] Add tap_random_base64 and software timer info to Useful Functions doc (#4360) * Update docs * Add security caveat Co-Authored-By: drashna * Wordsmithing Co-Authored-By: drashna * Update docs/ref_functions.md Co-Authored-By: drashna --- docs/faq_keymap.md | 17 ----------------- docs/ref_functions.md | 21 +++++++++++++++++++++ 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/docs/faq_keymap.md b/docs/faq_keymap.md index 4e842d363..ae01e9387 100644 --- a/docs/faq_keymap.md +++ b/docs/faq_keymap.md @@ -211,20 +211,3 @@ here real_mods lost state for 'physical left shift'. weak_mods is ORed with real_mods when keyboard report is sent. https://github.com/tmk/tmk_core/blob/master/common/action_util.c#L57 - -## Timer Functionality - -It's possible to start timers and read values for time-specific events - here's an example: - -```c -static uint16_t key_timer; -key_timer = timer_read(); - -if (timer_elapsed(key_timer) < 100) { - // do something if less than 100ms have passed -} else { - // do something if 100ms or more have passed -} -``` - -It's best to declare the `static uint16_t key_timer;` at the top of the file, outside of any code blocks you're using it in. diff --git a/docs/ref_functions.md b/docs/ref_functions.md index 9b5be7a88..174d9a95a 100644 --- a/docs/ref_functions.md +++ b/docs/ref_functions.md @@ -96,3 +96,24 @@ And to do so, add `reset_keyboard()` to your function or macro, and this will re If you're having issues with Audio, RGB Underglow, backlighting or keys acting weird, then you can reset the EEPROM (persistent setting storage). Bootmagic is one way to do this, but if that isn't enabled, then you can use a custom macro to do so. To wipe the EEPROM, run `eeconfig_init()` from your function or macro to reset most of the settings to default. + +## Tap random key + +If you want to send a random character to the host computer, you can use the `tap_random_base64()` function. This [pseudorandomly](https://en.wikipedia.org/wiki/Pseudorandom_number_generator) selects a number between 0 and 63, and then sends a key press based on that selection. (0–25 is `A`–`Z`, 26–51 is `a`–`z`, 52–61 is `0`–`9`, 62 is `+` and 63 is `/`). + +?> Needless to say, but this is _not_ a cryptographically secure method of generating random Base64 keys or passwords. + +## Software Timers + +It's possible to start timers and read values for time-specific events. Here's an example: + +```c +static uint16_t key_timer; +key_timer = timer_read(); + +if (timer_elapsed(key_timer) < 100) { + // do something if less than 100ms have passed +} else { + // do something if 100ms or more have passed +} +``` From 0b0c98929b7d9375661a101740f2b1be8ca3e0fc Mon Sep 17 00:00:00 2001 From: Erovia Date: Sat, 1 Dec 2018 17:57:30 +0100 Subject: [PATCH 593/788] Add support for S7 Elephant (#4511) * Add support for S7 Elephant A high-end 70% custom keyboard designed and produced by jacky from Geekhack. * Polish S7 Elephant code Implement drashna's suggestions: - specify bootloader - remove unnecessary defines - use led_set_user() for LED logic * Correct info.json and s7_elephant.h Correct info.json and s7_elepant.h to follow QMK convention and fix a missing curly bracket. --- keyboards/s7_elephant/config.h | 47 + keyboards/s7_elephant/info.json | 129 +++ .../s7_elephant/keymaps/default/config.h | 1 + .../s7_elephant/keymaps/default/keymap.c | 64 ++ .../s7_elephant/keymaps/default/readme.md | 35 + keyboards/s7_elephant/readme.md | 17 + keyboards/s7_elephant/rules.mk | 52 ++ keyboards/s7_elephant/s7_elephant.c | 1 + keyboards/s7_elephant/s7_elephant.h | 855 ++++++++++++++++++ 9 files changed, 1201 insertions(+) create mode 100644 keyboards/s7_elephant/config.h create mode 100644 keyboards/s7_elephant/info.json create mode 100644 keyboards/s7_elephant/keymaps/default/config.h create mode 100644 keyboards/s7_elephant/keymaps/default/keymap.c create mode 100644 keyboards/s7_elephant/keymaps/default/readme.md create mode 100644 keyboards/s7_elephant/readme.md create mode 100644 keyboards/s7_elephant/rules.mk create mode 100644 keyboards/s7_elephant/s7_elephant.c create mode 100644 keyboards/s7_elephant/s7_elephant.h diff --git a/keyboards/s7_elephant/config.h b/keyboards/s7_elephant/config.h new file mode 100644 index 000000000..55baa4c37 --- /dev/null +++ b/keyboards/s7_elephant/config.h @@ -0,0 +1,47 @@ +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0007 +#define DEVICE_VER 0x0001 +#define MANUFACTURER jacky +#define PRODUCT S7 Elephant +#define DESCRIPTION A high-end 70% custom keyboard + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 16 + +/* key matrix pins */ +#define MATRIX_ROW_PINS { B0, B1, B2, B3, B4 } +#define MATRIX_COL_PINS { B6, D0, D1, D2, D3, D4, D5, D6, D7, C6, C7, F4, F5, F6, F7, F1 } +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCING_DELAY 5 + +/* 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 + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +#define RGB_DI_PIN E6 +#ifdef RGB_DI_PIN +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 2 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 +#define RGBLIGHT_SLEEP +#endif diff --git a/keyboards/s7_elephant/info.json b/keyboards/s7_elephant/info.json new file mode 100644 index 000000000..37f98d79d --- /dev/null +++ b/keyboards/s7_elephant/info.json @@ -0,0 +1,129 @@ +{ + "keyboard_name": "S7 Elephant", + "url": "https://geekhack.org/index.php?topic=96434.0", + "maintainer": "qmk", + "width": 18, + "height": 5, + "layouts": { + "LAYOUT_ansi": { + "key_count": 72, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":2.25}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4, "w":1.5}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_ansi_small_lshift": { + "key_count": 73, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4, "w":1.5}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_ansi_small_bspc": { + "key_count": 73, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":2.25}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4, "w":1.5}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_ansi_small_lshift_small_bspc": { + "key_count": 74, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4, "w":1.5}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_ansi_1u": { + "key_count": 73, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":2.25}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4}, {"label":"Alt", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_ansi_1u_small_lshift": { + "key_count": 74, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4}, {"label":"Alt", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_ansi_1u_small_bspc": { + "key_count": 74, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":2.25}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4}, {"label":"Alt", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_ansi_1u_small_lshift_small_bspc": { + "key_count": 75, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4}, {"label":"Alt", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_ansi_7u": { + "key_count": 71, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":2.25}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.5}, {"label":"Win", "x":3.5, "y":4, "w":1.5}, {"x":5, "y":4, "w":7}, {"label":"Fn", "x":12, "y":4, "w":1.5}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_ansi_7u_small_lshift": { + "key_count": 72, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.5}, {"label":"Win", "x":3.5, "y":4, "w":1.5}, {"x":5, "y":4, "w":7}, {"label":"Fn", "x":12, "y":4, "w":1.5}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_ansi_7u_small_bspc": { + "key_count": 72, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":2.25}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.5}, {"label":"Win", "x":3.5, "y":4, "w":1.5}, {"x":5, "y":4, "w":7}, {"label":"Fn", "x":12, "y":4, "w":1.5}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_ansi_7u_small_lshift_small_bspc": { + "key_count": 73, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.5}, {"label":"Win", "x":3.5, "y":4, "w":1.5}, {"x":5, "y":4, "w":7}, {"label":"Fn", "x":12, "y":4, "w":1.5}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_ansi_blocker": { + "key_count": 72, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":2.25}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.25, "y":4, "w":1.25}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_ansi_blocker_small_lshift": { + "key_count": 73, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.25, "y":4, "w":1.25}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_ansi_blocker_small_bspc": { + "key_count": 73, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":2.25}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.25, "y":4, "w":1.25}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_ansi_blocker_small_lshift_small_bspc": { + "key_count": 74, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.25, "y":4, "w":1.25}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_ansi_blocker_7u": { + "key_count": 71, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":2.25}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.5}, {"label":"Win", "x":3.5, "y":4}, {"label":"Alt", "x":4.5, "y":4, "w":1.5}, {"x":6, "y":4, "w":6.75}, {"label":"Fn", "x":12.75, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_ansi_blocker_7u_small_lshift": { + "key_count": 72, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.5}, {"label":"Win", "x":3.5, "y":4}, {"label":"Alt", "x":4.5, "y":4, "w":1.5}, {"x":6, "y":4, "w":6.75}, {"label":"Fn", "x":12.75, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_ansi_blocker_7u_small_bspc": { + "key_count": 72, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":2.25}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.5}, {"label":"Win", "x":3.5, "y":4}, {"label":"Alt", "x":4.5, "y":4, "w":1.5}, {"x":6, "y":4, "w":6.75}, {"label":"Fn", "x":12.75, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_ansi_blocker_7u_small_lshift_small_bspc": { + "key_count": 73, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.5}, {"label":"Win", "x":3.5, "y":4}, {"label":"Alt", "x":4.5, "y":4, "w":1.5}, {"x":6, "y":4, "w":6.75}, {"label":"Fn", "x":12.75, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_iso": { + "key_count": 73, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"|", "x":14.75, "y":2}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4, "w":1.5}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_iso_small_bspc": { + "key_count": 74, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"|", "x":14.75, "y":2}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4, "w":1.5}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_iso_1u": { + "key_count": 74, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"|", "x":14.75, "y":2}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4}, {"label":"Alt", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_iso_1u_small_bspc": { + "key_count": 75, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"|", "x":14.75, "y":2}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4}, {"label":"Alt", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_iso_7u": { + "key_count": 72, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"|", "x":14.75, "y":2}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.5}, {"label":"Win", "x":3.5, "y":4, "w":1.5}, {"x":5, "y":4, "w":7}, {"label":"Fn", "x":12, "y":4, "w":1.5}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_iso_7u_small_bspc": { + "key_count": 73, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"|", "x":14.75, "y":2}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.5}, {"label":"Win", "x":3.5, "y":4, "w":1.5}, {"x":5, "y":4, "w":7}, {"label":"Fn", "x":12, "y":4, "w":1.5}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_iso_blocker": { + "key_count": 73, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"|", "x":14.75, "y":2}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.25, "y":4, "w":1.25}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_iso_blocker_small_bspc": { + "key_count": 74, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"|", "x":14.75, "y":2}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.25, "y":4, "w":1.25}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_iso_blocker_7u": { + "key_count": 72, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"|", "x":14.75, "y":2}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.5}, {"label":"Win", "x":3.5, "y":4}, {"label":"Alt", "x":4.5, "y":4, "w":1.5}, {"x":6, "y":4, "w":6.75}, {"label":"Fn", "x":12.75, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_iso_blocker_7u_small_bspc": { + "key_count": 73, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"|", "x":14.75, "y":2}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.5}, {"label":"Win", "x":3.5, "y":4}, {"label":"Alt", "x":4.5, "y":4, "w":1.5}, {"x":6, "y":4, "w":6.75}, {"label":"Fn", "x":12.75, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + } + } +} diff --git a/keyboards/s7_elephant/keymaps/default/config.h b/keyboards/s7_elephant/keymaps/default/config.h new file mode 100644 index 000000000..85f62371e --- /dev/null +++ b/keyboards/s7_elephant/keymaps/default/config.h @@ -0,0 +1 @@ +#define RGBLIGHT_LIMIT_VAL 80 diff --git a/keyboards/s7_elephant/keymaps/default/keymap.c b/keyboards/s7_elephant/keymaps/default/keymap.c new file mode 100644 index 000000000..339f2d379 --- /dev/null +++ b/keyboards/s7_elephant/keymaps/default/keymap.c @@ -0,0 +1,64 @@ +#include QMK_KEYBOARD_H + +enum custom_layers { + _QWERTY, + _FN +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,------. ,-------------------------------------------------------------------------------------------------. + * | F1 | | Esc`~ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Bkspc |Home | + * |------| |-------------------------------------------------------------------------------------------------| + * | F2 | | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | End | + * |------| |-------------------------------------------------------------------------------------------------| + * | F3 | | Caps | A | S | D | F | G | H | J | K | L | ; | ' | Enter | Ins | + * |------| |-------------------------------------------------------------------------------------------------| + * | F4 | | Shift | Z | X | C | V | B | N | M | , | . | / | RShift | U | Del | + * |------| |-------------------------------------------------------------------------------------------------| + * | F5 | | Ctrl | Gui | Alt | Space | FN | RCtrl | L | D | R | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +[_QWERTY] = LAYOUT_ansi( +KC_F1, KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, +KC_F2, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, +KC_F3, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_HOME, +KC_F4, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END, +KC_F5, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT +), + +/* FN + * ,------. ,-------------------------------------------------------------------------------------------------. + * |Reset | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | PScr | ScrLck |Pause| + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | |Prev |Play |Next | | | | |VolD |Mute |VolU | | |PgUp | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | |PgDn | + * |------| |-------------------------------------------------------------------------------------------------| + * |EEPRST| | | | | | | | | | | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +[_FN] = LAYOUT_ansi( +RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, +_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, +_______, _______, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______, _______, _______, KC_VOLD, KC_MUTE, KC_VOLU, _______, _______, KC_PGUP, +_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGDN, +EEP_RST, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), +}; + +void led_set_user(uint8_t usb_led) { + // Turn LEDs On/Off for Caps Lock + if (host_keyboard_leds() & (1 << USB_LED_CAPS_LOCK)) { + rgblight_enable_noeeprom(); + rgblight_sethsv_noeeprom(0, 0, 80); + } else { + rgblight_sethsv_noeeprom(0, 0, 80); + rgblight_disable_noeeprom(); + } +} diff --git a/keyboards/s7_elephant/keymaps/default/readme.md b/keyboards/s7_elephant/keymaps/default/readme.md new file mode 100644 index 000000000..c4fe30acd --- /dev/null +++ b/keyboards/s7_elephant/keymaps/default/readme.md @@ -0,0 +1,35 @@ +# Default keymap for S7 Elephant + +**Features** + +* LEDs are functioning as Caps-Lock indicators + +## QWERTY (Normal) Layer +``` +,------. ,-------------------------------------------------------------------------------------------------. +| F1 | | Esc`~ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Bkspc |Home | +|------| |-------------------------------------------------------------------------------------------------| +| F2 | | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | End | +|------| |-------------------------------------------------------------------------------------------------| +| F3 | | Caps | A | S | D | F | G | H | J | K | L | ; | ' | Enter | Ins | +|------| |-------------------------------------------------------------------------------------------------| +| F4 | | Shift | Z | X | C | V | B | N | M | , | . | / | RShift | U | Del | +|------| |-------------------------------------------------------------------------------------------------| +| F5 | | Ctrl | Gui | Alt | Space | FN | RAlt | RCtrl | L | D | R | +`------' `-------------------------------------------------------------------------------------------------' +``` + +## FN Layer +``` +,------. ,-------------------------------------------------------------------------------------------------. +|Reset | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | PScr | ScrLck |Pause| +|------| |-------------------------------------------------------------------------------------------------| +| | | | | | | | | | | | | | | | | | +|------| |-------------------------------------------------------------------------------------------------| +| | | |Prev |Play |Next | | | | |VolD |Mute |VolU | | |PgUp | +|------| |-------------------------------------------------------------------------------------------------| +| | | | | | | | | | | | | | | |PgDn | +|------| |-------------------------------------------------------------------------------------------------| +|EPRM | | | | | | | | | | | | +`------' `-------------------------------------------------------------------------------------------------' +``` diff --git a/keyboards/s7_elephant/readme.md b/keyboards/s7_elephant/readme.md new file mode 100644 index 000000000..466e3f731 --- /dev/null +++ b/keyboards/s7_elephant/readme.md @@ -0,0 +1,17 @@ +# S7 Elephant + +![S7 Elephant](https://i.imgur.com/CaHxKBJ.jpg) + +A high-end 70% custom keyboard designed and produced by [jacky](https://geekhack.org/index.php?action=profile;u=63864) from Geekhack. + +Keyboard Maintainer: QMK Community +Hardware Supported: S7 Elephant +Hardware Availability: [The GB has ended with little chance to run again.](https://geekhack.org/index.php?topic=96434.0) + +Make example for this keyboard (after setting up your build environment): + + make s7_elephant:default:dfu + +To enter the bootloader, either short the pins on the PCB or the RESET button on the FN layer. + +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). diff --git a/keyboards/s7_elephant/rules.mk b/keyboards/s7_elephant/rules.mk new file mode 100644 index 000000000..7f0ad6d3c --- /dev/null +++ b/keyboards/s7_elephant/rules.mk @@ -0,0 +1,52 @@ +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + +BOOTLOADER = atmel-dfu + +# Build Options +# comment out to disable the options. +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +RGBLIGHT_ENABLE = yes # Enable keyboard underlight functionality diff --git a/keyboards/s7_elephant/s7_elephant.c b/keyboards/s7_elephant/s7_elephant.c new file mode 100644 index 000000000..a869f46db --- /dev/null +++ b/keyboards/s7_elephant/s7_elephant.c @@ -0,0 +1 @@ +#include "s7_elephant.h" diff --git a/keyboards/s7_elephant/s7_elephant.h b/keyboards/s7_elephant/s7_elephant.h new file mode 100644 index 000000000..c351ffdb9 --- /dev/null +++ b/keyboards/s7_elephant/s7_elephant.h @@ -0,0 +1,855 @@ +#ifndef S7_ELEPHANT_H +#define S7_ELEPHANT_H + +#include "quantum.h" + +#define ____ KC_NO + +/* ANSI + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +#define LAYOUT_ansi( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K411, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, ____, K215 }, \ +{ K300, K301, ____, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, K411, ____, K413, K414, K415 } \ +} + +/* ANSI with small shift + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +#define LAYOUT_ansi_small_lshift( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K411, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, ____, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, K411, ____, K413, K414, K415 } \ +} + +/* ANSI with small backspace + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +#define LAYOUT_ansi_small_bspc( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K214, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K411, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215 }, \ +{ K300, K301, ____, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, K411, ____, K413, K414, K415 } \ +} + +/* ANSI with small shift and small backspace + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +#define LAYOUT_ansi_small_lshift_small_bspc( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K214, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K411, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, K411, ____, K413, K414, K415 } \ +} + +/* **************************************************************************************************************************************** */ +/* ANSI with 1u keys in the bottom row + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +#define LAYOUT_ansi_1u( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K411, K412, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, ____, K215 }, \ +{ K300, K301, ____, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, K411, K412, K413, K414, K415 } \ +} + +/* ANSI with small shift and 1u keys in the bottom row + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +#define LAYOUT_ansi_1u_small_lshift( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K411, K412, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, ____, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, K411, K412, K413, K414, K415 } \ +} + +/* ANSI with small backspace and 1u keys in the bottom row + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +#define LAYOUT_ansi_1u_small_bspc( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K214, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K411, K412, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215 }, \ +{ K300, K301, ____, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, K411, K412, K413, K414, K415 } \ +} + +/* ANSI with small shift and small backspace and 1u keys in the bottom row + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +#define LAYOUT_ansi_1u_small_lshift_small_bspc( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K214, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K411, K412, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, K411, K412, K413, K414, K415 } \ +} + +/* **************************************************************************************************************************************** */ +/* ANSI with 7u spacebar + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +#define LAYOUT_ansi_7u( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K407, K410, K411, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, ____, K215 }, \ +{ K300, K301, ____, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, ____, ____, ____, ____, K407, ____, ____, K410, K411, ____, K413, K414, K415 } \ +} + +/* ANSI with small shift and 7u spacebar + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +#define LAYOUT_ansi_7u_small_lshift( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K407, K410, K411, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, ____, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, ____, ____, ____, ____, K407, ____, ____, K410, K411, ____, K413, K414, K415 } \ +} + +/* ANSI with small backspace and 7u spacebar + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +#define LAYOUT_ansi_7u_small_bspc( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K214, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K407, K410, K411, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215 }, \ +{ K300, K301, ____, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, ____, ____, ____, ____, K407, ____, ____, K410, K411, ____, K413, K414, K415 } \ +} + +/* ANSI with small shift and small backspace and 7u spacebar + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +#define LAYOUT_ansi_7u_small_lshift_small_bspc( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K214, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K407, K410, K411, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, ____, ____, ____, ____, K407, ____, ____, K410, K411, ____, K413, K414, K415 } \ +} + +/* **************************************************************************************************************************************** */ +/* ANSI with blocker + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------- -------------------' + */ + +#define LAYOUT_ansi_blocker( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K411, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, ____, K215 }, \ +{ K300, K301, ____, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, K411, ____, K413, K414, K415 } \ +} + +/* ANSI with blocker and small shift + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------- -------------------' + */ + +#define LAYOUT_ansi_blocker_small_lshift( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K411, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, ____, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, K411, ____, K413, K414, K415 } \ +} + +/* ANSI with blocker and small backspace + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------- -------------------' + */ + +#define LAYOUT_ansi_blocker_small_bspc( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K214, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K411, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215 }, \ +{ K300, K301, ____, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, K411, ____, K413, K414, K415 } \ +} + +/* ANSI with blocker and small shift and small backspace + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------- -------------------' + */ + +#define LAYOUT_ansi_blocker_small_lshift_small_bspc( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K214, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K411, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, K411, ____, K413, K414, K415 } \ +} + +/* **************************************************************************************************************************************** */ +/* ANSI with blocker and 7u spacebar + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | + * `------' `--------------------------------------------------------------------------- ------------------' + */ + +#define LAYOUT_ansi_blocker_7u( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, ____, K215 }, \ +{ K300, K301, ____, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, ____, ____, K413, K414, K415 } \ +} + +/* ANSI with blocker and small shift and 7u spacebar + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | + * `------' `--------------------------------------------------------------------------- ------------------' + */ + +#define LAYOUT_ansi_blocker_7u_small_lshift( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, ____, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, ____, ____, K413, K414, K415 } \ +} + +/* ANSI with blocker and small backspace and 7u spacebar + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | + * `------' `--------------------------------------------------------------------------- ------------------' + */ + +#define LAYOUT_ansi_blocker_7u_small_bspc( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K214, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215 }, \ +{ K300, K301, ____, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, ____, ____, K413, K414, K415 } \ +} + +/* ANSI with blocker and small shift and small backspace and 7u spacebar + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | + * `------' `--------------------------------------------------------------------------- ------------------' + */ + +#define LAYOUT_ansi_blocker_7u_small_lshift_small_bspc( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K214, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, ____, ____, K413, K414, K415 } \ +} + +/* **************************************************************************************************************************************** */ +/* ISO + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |------------------------------------------------------------------------------------ |-----| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +#define LAYOUT_iso( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K114, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K411, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, ____, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, K411, ____, K413, K414, K415 } \ +} + +/* ISO with small backspace + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |------------------------------------------------------------------------------------ |-----| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +#define LAYOUT_iso_small_bspc( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K214, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K114, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K411, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, K411, ____, K413, K414, K415 } \ +} + +/* **************************************************************************************************************************************** */ +/* ISO with 1u keys in the bottom row + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |------------------------------------------------------------------------------------ |-----| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +#define LAYOUT_iso_1u( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K114, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K411, K412, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, ____, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, K411, K412, K413, K414, K415 } \ +} + +/* ISO with small backspace and 1u keys in the bottom row + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |------------------------------------------------------------------------------------ |-----| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +#define LAYOUT_iso_1u_small_bspc( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K214, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K114, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K411, K412, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, K411, K412, K413, K414, K415 } \ +} + +/* **************************************************************************************************************************************** */ +/* ISO with 7u spacebar + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |------------------------------------------------------------------------------------ |-----| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +#define LAYOUT_iso_7u( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K114, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K407, K410, K411, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, ____, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, ____, ____, ____, ____, K407, ____, ____, K410, K411, ____, K413, K414, K415 } \ +} + +/* ISO with small backspace and 7u spacebar + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |------------------------------------------------------------------------------------ |-----| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +#define LAYOUT_iso_7u_small_bspc( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K214, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K114, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K407, K410, K411, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, ____, ____, ____, ____, K407, ____, ____, K410, K411, ____, K413, K414, K415 } \ +} +/* **************************************************************************************************************************************** */ +/* ISO with blocker + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |------------------------------------------------------------------------------------ |-----| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------- -------------------' + */ + +#define LAYOUT_iso_blocker( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K114, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K411, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, ____, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, K411, ____, K413, K414, K415 } \ +} + +/* ISO with blocker and small backspace + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |------------------------------------------------------------------------------------ |-----| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------- -------------------' + */ + +#define LAYOUT_iso_blocker_small_bspc( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K214, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K114, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K411, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, K411, ____, K413, K414, K415 } \ +} + +/* **************************************************************************************************************************************** */ +/* ISO with blocker and 7u spacebar + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |------------------------------------------------------------------------------------ |-----| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | + * `------' `--------------------------------------------------------------------------- ------------------' + */ + +#define LAYOUT_iso_blocker_7u( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K114, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, ____, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, ____, ____, K413, K414, K415 } \ +} + +/* ISO with blocker and small backspace and 7u spacebar + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |------------------------------------------------------------------------------------ |-----| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | + * `------' `--------------------------------------------------------------------------- ------------------' + */ + +#define LAYOUT_iso_blocker_7u_small_bspc( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K214, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K114, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, ____, ____, K413, K414, K415 } \ +} +#endif From a90331aec21a47ef3a9fe47425c9c7204bc768b5 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Sat, 1 Dec 2018 16:28:32 -0800 Subject: [PATCH 594/788] handwired/ortho5x13 default keymap refactor, Configurator support, and readme update (#4525) * handwired/ortho5x13: default keymap refactor - keymap now uses LAYOUT macro - keymap now uses #include QMK_KEYBOARD_H - removed redundant KC_TRNS and KC_NO definitions * handwired/ortho5x13: Configurator support * handwired/ortho5x13: fix Docs links in readme --- keyboards/handwired/ortho5x13/info.json | 77 ++++++ .../ortho5x13/keymaps/default/keymap.c | 245 +++++++++--------- keyboards/handwired/ortho5x13/readme.md | 2 +- 3 files changed, 196 insertions(+), 128 deletions(-) create mode 100644 keyboards/handwired/ortho5x13/info.json diff --git a/keyboards/handwired/ortho5x13/info.json b/keyboards/handwired/ortho5x13/info.json new file mode 100644 index 000000000..15a65081a --- /dev/null +++ b/keyboards/handwired/ortho5x13/info.json @@ -0,0 +1,77 @@ +{ + "keyboard_name": "ortho5x13", + "url": "", + "maintainer": "qmk", + "width": 13, + "height": 6, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"Esc", "x":0, "y":0}, + {"label":"1", "x":1, "y":0}, + {"label":"2", "x":2, "y":0}, + {"label":"3", "x":3, "y":0}, + {"label":"4", "x":4, "y":0}, + {"label":"5", "x":5, "y":0}, + {"label":"6", "x":6, "y":0}, + {"label":"7", "x":7, "y":0}, + {"label":"8", "x":8, "y":0}, + {"label":"9", "x":9, "y":0}, + {"label":"0", "x":10, "y":0}, + {"label":"-", "x":11, "y":0}, + {"label":"=", "x":12, "y":0}, + {"label":"Tab", "x":0, "y":1}, + {"label":"Q", "x":1, "y":1}, + {"label":"W", "x":2, "y":1}, + {"label":"E", "x":3, "y":1}, + {"label":"R", "x":4, "y":1}, + {"label":"T", "x":5, "y":1}, + {"label":"Y", "x":6, "y":1}, + {"label":"U", "x":7, "y":1}, + {"label":"I", "x":8, "y":1}, + {"label":"O", "x":9, "y":1}, + {"label":"P", "x":10, "y":1}, + {"label":"[", "x":11, "y":1}, + {"label":"]", "x":12, "y":1}, + {"label":"`", "x":0, "y":2}, + {"label":"A", "x":1, "y":2}, + {"label":"S", "x":2, "y":2}, + {"label":"D", "x":3, "y":2}, + {"label":"F", "x":4, "y":2}, + {"label":"G", "x":5, "y":2}, + {"label":"H", "x":6, "y":2}, + {"label":"J", "x":7, "y":2}, + {"label":"K", "x":8, "y":2}, + {"label":"L", "x":9, "y":2}, + {"label":";", "x":10, "y":2}, + {"label":",", "x":11, "y":2}, + {"label":"\\", "x":12, "y":2}, + {"label":"Shift", "x":0, "y":3}, + {"label":"Z", "x":1, "y":3}, + {"label":"X", "x":2, "y":3}, + {"label":"C", "x":3, "y":3}, + {"label":"V", "x":4, "y":3}, + {"label":"B", "x":5, "y":3}, + {"label":"N", "x":6, "y":3}, + {"label":"M", "x":7, "y":3}, + {"label":",", "x":8, "y":3}, + {"label":".", "x":9, "y":3}, + {"label":"/", "x":10, "y":3}, + {"label":"Enter", "x":11, "y":3}, + {"label":"Up", "x":12, "y":3}, + {"label":"Hyper", "x":0, "y":4}, + {"label":"Ctrl", "x":1, "y":4}, + {"label":"Alt", "x":2, "y":4}, + {"label":"GUI", "x":3, "y":4}, + {"label":"Lower", "x":4, "y":4}, + {"label":"Space", "x":5, "y":4, "w":2}, + {"label":"Raise", "x":7, "y":4}, + {"label":"Backspace", "x":8, "y":4}, + {"label":"Shift", "x":9, "y":4}, + {"label":"Left", "x":10, "y":4}, + {"label":"Right", "x":11, "y":4}, + {"label":"Down", "x":12, "y":4} + ] + } + } +} diff --git a/keyboards/handwired/ortho5x13/keymaps/default/keymap.c b/keyboards/handwired/ortho5x13/keymaps/default/keymap.c index 0d5d0c430..0c8bbb055 100644 --- a/keyboards/handwired/ortho5x13/keymaps/default/keymap.c +++ b/keyboards/handwired/ortho5x13/keymaps/default/keymap.c @@ -1,9 +1,4 @@ -#include "ortho5x13.h" -#include "action_layer.h" -#include "eeconfig.h" -#ifdef AUDIO_ENABLE - #include "audio.h" -#endif +#include QMK_KEYBOARD_H // Each layer gets a name for readability, which is then used in the keymap matrix below. // The underscores don't mean anything - you can have a layer called STUFF or any other name. @@ -25,146 +20,142 @@ enum custom_keycodes { BACKLIT }; -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO - #define KC_L1 LOWER #define KC_L2 RAISE const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -/* Qwerty - * ,------------------------------------------------------------------------------------------. - * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | - * |------+------+------+------+------+------+------+------+------+------+------+------+------| - * | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | - * |------+------+------+------+------+-------------+------+------+------+------+------+------| - * | ` | A | S | D | F | G | H | J | K | L | ; | ' | \ | - * |------+------+------+------+------+------|------+------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | Up | - * |------+------+------+------+------+------+------+------+------+------+------+------+------| - * | Hyper| Ctrl | Alt | GUI |Lower | Space |Raise | Bksp |Shift | Left | Down |Right | - * `------------------------------------------------------------------------------------------' - */ -[_QWERTY] = LAYOUT_compact( - //,----+----+----+----+----+----+----+----+----+----+----+----+----. - ESC , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,MINS,EQL , - //|----+----+----+----+----+----+----+----+----+----+----+----+----| - TAB , Q , W , E , R , T , Y , U , I , O , P ,LBRC,RBRC, - //|----+----+----+----+----+----+----+----+----+----+----+----+----| - GRV , A , S , D , F , G , H , J , K , L ,SCLN,QUOT,BSLS, - //|----+----+----+----+----+----+----+----+----+----+----+----+----| - LSFT, Z , X , C , V , B , N , M ,COMM,DOT ,SLSH,ENT , UP , - //|----+----+----+----+----+---------+----+----+----+----+----+----| - HYPR,LCTL,LALT,LGUI, L1 , SPACE , L2 ,BSPC,RSFT,LEFT,RGHT,DOWN - //`----+----+----+----+----+---------+----+----+----+----+----+----' - ), + /* Qwerty + * ,------------------------------------------------------------------------------------------. + * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | + * |------+------+------+------+------+------+------+------+------+------+------+------+------| + * | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | + * |------+------+------+------+------+-------------+------+------+------+------+------+------| + * | ` | A | S | D | F | G | H | J | K | L | ; | ' | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | Up | + * |------+------+------+------+------+------+------+------+------+------+------+------+------| + * | Hyper| Ctrl | Alt | GUI |Lower | Space |Raise | Bksp |Shift | Left | Down |Right | + * `------------------------------------------------------------------------------------------' + */ + [_QWERTY] = LAYOUT( + //,--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------. + KC_ESC ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 ,KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,KC_MINS ,KC_EQL , + //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + KC_TAB ,KC_Q ,KC_W ,KC_E ,KC_R ,KC_T ,KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,KC_LBRC ,KC_RBRC , + //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + KC_GRV ,KC_A ,KC_S ,KC_D ,KC_F ,KC_G ,KC_H ,KC_J ,KC_K ,KC_L ,KC_SCLN ,KC_QUOT ,KC_BSLS , + //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + KC_LSFT ,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,KC_N ,KC_M ,KC_COMM ,KC_DOT ,KC_SLSH ,KC_ENT ,KC_UP , + //|--------+--------+--------+--------+--------+-----------------+--------+--------+--------+--------+--------+--------| + KC_HYPR ,KC_LCTL ,KC_LALT ,KC_LGUI ,KC_L1 , KC_SPC ,KC_L2 ,KC_BSPC ,KC_RSFT ,KC_LEFT ,KC_RGHT ,KC_DOWN + //`--------+--------+--------+--------+--------+-----------------+--------+--------+--------+--------+--------+--------' + ), /* Colemak - * ,-----------------------------------------------------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | R | S | T | D | H | N | E | I | O | " | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' + * ,------------------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | | + * |------+------+------+------+------+------+------+------+------+------+------+------+------| + * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Del | | + * |------+------+------+------+------+-------------+------+------+------+------+------+------| + * | Esc | A | R | S | T | D | H | N | E | I | O | " | | + * |------+------+------+------+------+------|------+------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | | + * |------+------+------+------+------+------+------+------+------+------+------+------+------| + * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | | + * `------------------------------------------------------------------------------------------' */ -[_COLEMAK] = { - {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, - {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_DEL}, - {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, - {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT }, - {BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} -}, +[_COLEMAK] = LAYOUT( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, _______, + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_DEL , _______, + KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, _______, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , _______, + BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______ +), /* Dvorak - * ,-----------------------------------------------------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Tab | " | , | . | P | Y | F | G | C | R | L | Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | O | E | U | I | D | H | T | N | S | / | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' + * ,------------------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | | + * |------+------+------+------+------+------+------+------+------+------+------+------+------| + * | Tab | " | , | . | P | Y | F | G | C | R | L | Del | | + * |------+------+------+------+------+-------------+------+------+------+------+------+------| + * | Esc | A | O | E | U | I | D | H | T | N | S | / | | + * |------+------+------+------+------+------|------+------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | | + * |------+------+------+------+------+------+------+------+------+------+------+------+------| + * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | | + * `------------------------------------------------------------------------------------------' */ -[_DVORAK] = { - {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, - {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_DEL}, - {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH}, - {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT }, - {BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} -}, +[_DVORAK] = LAYOUT( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, _______, + KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_DEL , _______, + KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, _______, + KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT , _______, + BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______ +), /* Lower - * ,-----------------------------------------------------------------------------------. - * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | Next | Vol- | Vol+ | Play | - * `-----------------------------------------------------------------------------------' + * ,------------------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | | + * |------+------+------+------+------+-------------+------+------+------+------+------+------| + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | | + * |------+------+------+------+------+-------------+------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | | + * |------+------+------+------+------+------|------+------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | |Enter | | + * |------+------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | | + * `------------------------------------------------------------------------------------------' */ -[_LOWER] = { - {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC}, - {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL}, - {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, - {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} -}, +[_LOWER] = LAYOUT( + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, _______, + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL , _______, + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, _______, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_NUHS), S(KC_NUBS), _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, _______ +), /* Raise - * ,-----------------------------------------------------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | Next | Vol- | Vol+ | Play | - * `-----------------------------------------------------------------------------------' + * ,------------------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | | + * |------+------+------+------+------+------+------+------+------+------+------+------+------| + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | | + * |------+------+------+------+------+-------------+------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | | + * |------+------+------+------+------+------|------+------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | |Enter | | + * |------+------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | | + * `------------------------------------------------------------------------------------------' */ -[_RAISE] = { - {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, - {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL}, - {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, - {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, _______, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} -}, +[_RAISE] = LAYOUT( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, _______, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL , _______, + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, _______, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, _______ +), /* Adjust (Lower + Raise) - * ,-----------------------------------------------------------------------------------. - * | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | Reset| | | | | | | | | | Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | |Audoff|Aud on|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | |Voice-|Voice+|Musoff|Mus on| | | | | | | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | | - * `-----------------------------------------------------------------------------------' + * ,------------------------------------------------------------------------------------------. + * | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | | + * |------+------+------+------+------+------+------+------+------+------+------+------+------| + * | | Reset| | | | | | | | | | Del | | + * |------+------+------+------+------+-------------+------+------+------+------+------+------| + * | | | |Audoff|Aud on|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | | + * |------+------+------+------+------+------|------+------+------+------+------+------+------| + * | |Voice-|Voice+|Musoff|Mus on| | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | | + * `------------------------------------------------------------------------------------------' */ -[_ADJUST] = { - {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12}, - {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL}, - {_______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______}, - {_______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} -} +[_ADJUST] = LAYOUT( + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12 , _______, + _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL , _______, + _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, _______, + _______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +) }; @@ -286,4 +277,4 @@ void music_scale_user(void) PLAY_SONG(music_scale); } -#endif \ No newline at end of file +#endif diff --git a/keyboards/handwired/ortho5x13/readme.md b/keyboards/handwired/ortho5x13/readme.md index 7241ddae8..444cfec96 100644 --- a/keyboards/handwired/ortho5x13/readme.md +++ b/keyboards/handwired/ortho5x13/readme.md @@ -10,4 +10,4 @@ Make example for this keyboard (after setting up your build environment): make handwired/ortho5x13:default -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. \ No newline at end of file +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). From 064d9e21750e8c717aca5f79263ad93b6606e125 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Sat, 1 Dec 2018 16:29:16 -0800 Subject: [PATCH 595/788] handwired/promethium Refactor and Configurator support (#4524) * handwired/promethium: refactor - config.h files - updated to use #pragma once - removed redundant config.h includes - layout macro moved from config.h to promethium.h - layout macro renamed from KEYMAP_CUSTOM to LAYOUT * handwired/promethium: Configurator support --- keyboards/handwired/promethium/config.h | 27 +------- keyboards/handwired/promethium/info.json | 68 +++++++++++++++++++ .../promethium/keymaps/default/config.h | 7 +- .../promethium/keymaps/default/keymap.c | 30 ++++---- .../promethium/keymaps/priyadi/config.h | 7 +- .../promethium/keymaps/priyadi/keymap.c | 30 ++++---- keyboards/handwired/promethium/promethium.h | 19 ++++++ 7 files changed, 120 insertions(+), 68 deletions(-) create mode 100644 keyboards/handwired/promethium/info.json diff --git a/keyboards/handwired/promethium/config.h b/keyboards/handwired/promethium/config.h index ea5f2b76e..dca0aec2e 100644 --- a/keyboards/handwired/promethium/config.h +++ b/keyboards/handwired/promethium/config.h @@ -15,8 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef CONFIG_H -#define CONFIG_H +#pragma once #include "config_common.h" @@ -159,27 +158,6 @@ along with this program. If not, see . #define MAX_VOLTAGE 4.2 #define MIN_VOLTAGE 3.2 -#define ___ KC_NO - -#define KEYMAP_CUSTOM( \ - k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, \ - k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, \ - k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, \ - k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, k4c, \ - tp1, tp2, tp3 \ -) \ -{ \ - {k11, k12, k13, k14, k15, k16}, \ - {k21, k22, k23, k24, k25, k26}, \ - {k31, k32, k33, k34, k35, k36}, \ - {k41, k42, k43, k44, k45, k46}, \ - {k17, k18, k19, k1a, k1b, k1c}, \ - {k27, k28, k29, k2a, k2b, k2c}, \ - {k37, k38, k39, k3a, k3b, k3c}, \ - {k47, k48, k49, k4a, k4b, k4c}, \ - {tp1, tp2, tp3, ___, ___, ___} \ -} - #ifndef __ASSEMBLER__ // assembler doesn't like enum in .h file enum led_sequence { LED_IND_LINUX, @@ -351,6 +329,3 @@ enum led_sequence { #define PS2_USART_ERROR (UCSR1A & ((1< Date: Sat, 1 Dec 2018 17:19:33 -0800 Subject: [PATCH 596/788] Keyboard: Add HHKB layout support to the DO60 (#4526) * add 60_hhkb support * add qmk configurator support for the new 60_hhkb layout * allow community layout support for the 60_hhkb * fixup readme to adhere to new QMK standards --- keyboards/do60/do60.h | 14 ++++++++++++++ keyboards/do60/info.json | 4 ++++ keyboards/do60/readme.md | 19 +++++++++++-------- keyboards/do60/rules.mk | 2 +- 4 files changed, 30 insertions(+), 9 deletions(-) diff --git a/keyboards/do60/do60.h b/keyboards/do60/do60.h index 30615d1d3..8ee902204 100644 --- a/keyboards/do60/do60.h +++ b/keyboards/do60/do60.h @@ -39,6 +39,20 @@ inline void setdefaultrgb(void){ rgblight_sethsv(100,100,100); } { K40, K41, K42, KC_NO,KC_NO,K45, K46, K47, KC_NO,KC_NO,K4A, K4B, K4C, K4D, K4E } \ } +#define LAYOUT_60_hhkb( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1E, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2E, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, K3E, \ + K41, K42, K46, K4A, K4B \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, KC_NO, K1E }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, KC_NO, KC_NO, K2E }, \ + { K30, KC_NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, KC_NO, K3D, K3E }, \ + { KC_NO, K41, K42, KC_NO, KC_NO, KC_NO, K46, KC_NO, KC_NO, KC_NO, K4A, K4B, KC_NO, KC_NO, KC_NO } \ +} + #define LAYOUT_60_ansi( \ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0E, \ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1E, \ diff --git a/keyboards/do60/info.json b/keyboards/do60/info.json index 6acfa08ef..4c98bd851 100644 --- a/keyboards/do60/info.json +++ b/keyboards/do60/info.json @@ -9,6 +9,10 @@ "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"~", "x":13, "y":0}, {"label":"\u2190", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":2, "w":1.25}, {"label":"Shift", "x":0, "y":3}, {"x":1, "y":3}, {"label":"Z", "x":2, "y":3}, {"label":"X", "x":3, "y":3}, {"label":"C", "x":4, "y":3}, {"label":"V", "x":5, "y":3}, {"label":"B", "x":6, "y":3}, {"label":"N", "x":7, "y":3}, {"label":"M", "x":8, "y":3}, {"label":"<", "x":9, "y":3}, {"label":">", "x":10, "y":3}, {"label":"?", "x":11, "y":3}, {"x":12, "y":3}, {"label":"\u2191", "x":13, "y":3}, {"label":"Del", "x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"label":"3u(Space)", "x":3.75, "y":4, "w":2.75}, {"x":6.5, "y":4}, {"label":"3u(Space)", "x":7.5, "y":4, "w":2.25}, {"label":"Alt", "x":9.75, "y":4, "w":1.25}, {"label":"win", "x":11, "y":4}, {"label":"\u2190", "x":12, "y":4}, {"label":"\u2193", "x":13, "y":4}, {"label":"\u2192", "x":14, "y":4}] }, + "LAYOUT_60_hhkb": { + "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"|", "x":13, "y":0}, {"label":"~", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"Delete", "x":13.5, "y":1, "w":1.5}, {"label":"Control", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"label":"Fn", "x":14, "y":3}, {"label":"Os", "x":1.5, "y":4}, {"label":"Alt", "x":2.5, "y":4, "w":1.5}, {"x":4, "y":4, "w":7}, {"label":"Alt", "x":11, "y":4, "w":1.5}, {"label":"Os", "x":12.5, "y":4}] + }, + "LAYOUT_chiwi60_default": { "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"~", "x":13, "y":0}, {"label":"\u2190", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3, "w":1.75}, {"label":"\u2191", "x":13, "y":3}, {"label":"Del", "x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"label":"3u(Space)", "x":3.75, "y":4, "w":3}, {"label":"3u(Space)", "x":6.75, "y":4, "w":3}, {"label":"Alt", "x":9.75, "y":4, "w":1.25}, {"label":"win", "x":11, "y":4}, {"label":"\u2190", "x":12, "y":4}, {"label":"\u2193", "x":13, "y":4}, {"label":"\u2192", "x":14, "y":4}] }, diff --git a/keyboards/do60/readme.md b/keyboards/do60/readme.md index fce7c922c..c4122361f 100644 --- a/keyboards/do60/readme.md +++ b/keyboards/do60/readme.md @@ -1,11 +1,14 @@ -# QMK Firmware for DoyuStudio DO60 PCB +# DoyuStudio DO60 PCB - -## Quantum MK Firmware -For the full Quantum feature list, see [the parent readme.md](/readme.md). - -Board supports in-switch LEDs (two-pin, single colour) +60% board supporting in-switch LEDs (two-pin, single colour) Build-in WS2182 RGB LED for underglow lighting. -## Build -To build the default keymap, simply run `make do60:default`. \ No newline at end of file +Keyboard Maintainer: QMK Community +Hardware Supported: Doyu Studios 60% PCB +Hardware Availability: [Doyustudio](https://shopkey.doyustudio.com/001pcb60) + +Make example for this keyboard (after setting up your build environment): + + make do60:default + +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). \ No newline at end of file diff --git a/keyboards/do60/rules.mk b/keyboards/do60/rules.mk index 8003914fa..7370a6262 100644 --- a/keyboards/do60/rules.mk +++ b/keyboards/do60/rules.mk @@ -63,4 +63,4 @@ RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend UNICODE_ENABLE = no # Unicode -LAYOUTS = 60_ansi 60_ansi_split_bs_rshift \ No newline at end of file +LAYOUTS = 60_ansi 60_hhkb 60_ansi_split_bs_rshift \ No newline at end of file From 0db6bb10e0b2810d306d37ef7342b22a43f4bdf9 Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Sat, 1 Dec 2018 17:28:35 -0800 Subject: [PATCH 597/788] Keyboard: Enable Lights by Default for Kira 75 (#4527) * enable rgb underglow and backlights by default for use with QMK Configurator * disable mousekeys --- keyboards/kira75/rules.mk | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/keyboards/kira75/rules.mk b/keyboards/kira75/rules.mk index 45eb6ee37..610410ae4 100644 --- a/keyboards/kira75/rules.mk +++ b/keyboards/kira75/rules.mk @@ -52,7 +52,7 @@ OPT_DEFS += -DBOOTLOADER_SIZE=4096 # change yes to no to disable # BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) CONSOLE_ENABLE = yes # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration @@ -60,7 +60,8 @@ COMMAND_ENABLE = yes # Commands for debug and configuration SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend # if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work NKRO_ENABLE = no # USB Nkey Rollover -BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID From dbc776168842439718334aa120f1afcbee9a96d9 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Sat, 1 Dec 2018 23:22:40 -0800 Subject: [PATCH 598/788] Keyboard: handwired/atreus50 Refactor, Configurator support, and readme cleanup (#4530) * handwired/atreus50: refactor - layout macro renames: - KEYMAP is now LAYOUT - COMPACT_KEYMAP is now LAYOUT_kc - keymap updates: - both keymaps now use #include QMK_KEYBOARD_H - removed redundant KC_TRNS and KC_NO definitions - default keymap now uses LAYOUT macro instead of LAYOUT_kc * handwired/atreus50: readme cleanup Reformatted the readme to be more closely aligned to current QMK template, and fixed some typos/grammar. * handwired/atreus50: Configurator support --- keyboards/handwired/atreus50/atreus50.h | 4 +- keyboards/handwired/atreus50/info.json | 70 +++++++++++ .../atreus50/keymaps/ajp10304/keymap.c | 34 +++--- .../atreus50/keymaps/default/keymap.c | 109 ++++++------------ keyboards/handwired/atreus50/readme.md | 18 ++- 5 files changed, 134 insertions(+), 101 deletions(-) create mode 100644 keyboards/handwired/atreus50/info.json diff --git a/keyboards/handwired/atreus50/atreus50.h b/keyboards/handwired/atreus50/atreus50.h index de06f255e..eb31ca1b8 100644 --- a/keyboards/handwired/atreus50/atreus50.h +++ b/keyboards/handwired/atreus50/atreus50.h @@ -5,7 +5,7 @@ // The first section contains all of the arguements // The second converts the arguments into a two-dimensional array -#define KEYMAP( \ +#define LAYOUT( \ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ @@ -18,7 +18,7 @@ { k30, k31, k32, k33, k34, k35, km1, k36, k37, k38, k39, k3a, k3b } \ } -#define COMPACT_KEYMAP( \ +#define LAYOUT_kc( \ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ diff --git a/keyboards/handwired/atreus50/info.json b/keyboards/handwired/atreus50/info.json new file mode 100644 index 000000000..4e3b4ac49 --- /dev/null +++ b/keyboards/handwired/atreus50/info.json @@ -0,0 +1,70 @@ +{ + "keyboard_name": "Atreus50", + "url": "", + "maintainer": "qmk", + "width": 15, + "height": 4.5, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"Tab", "x":0, "y":0.5}, + {"label":"Q", "x":1, "y":0.5}, + {"label":"W", "x":2, "y":0.25}, + {"label":"E", "x":3, "y":0}, + {"label":"R", "x":4, "y":0.25}, + {"label":"T", "x":5, "y":0.5}, + + {"label":"Y", "x":9, "y":0.5}, + {"label":"U", "x":10, "y":0.25}, + {"label":"I", "x":11, "y":0}, + {"label":"O", "x":12, "y":0.25}, + {"label":"P", "x":13, "y":0.5}, + {"label":"-", "x":14, "y":0.5}, + + {"label":"Ctrl/Esc", "x":0, "y":1.5}, + {"label":"A", "x":1, "y":1.5}, + {"label":"S", "x":2, "y":1.25}, + {"label":"D", "x":3, "y":1}, + {"label":"F", "x":4, "y":1.25}, + {"label":"G", "x":5, "y":1.5}, + + {"label":"H", "x":9, "y":1.5}, + {"label":"J", "x":10, "y":1.25}, + {"label":"K", "x":11, "y":1}, + {"label":"L", "x":12, "y":1.25}, + {"label":";", "x":13, "y":1.5}, + {"label":"'", "x":14, "y":1.5}, + + {"label":"LShift", "x":0, "y":2.5}, + {"label":"Z", "x":1, "y":2.5}, + {"label":"X", "x":2, "y":2.25}, + {"label":"C", "x":3, "y":2}, + {"label":"V", "x":4, "y":2.25}, + {"label":"B", "x":5, "y":2.5}, + + {"label":"N", "x":9, "y":2.5}, + {"label":"M", "x":10, "y":2.25}, + {"label":",", "x":11, "y":2}, + {"label":".", "x":12, "y":2.25}, + {"label":"/", "x":13, "y":2.5}, + {"label":"Shift/Enter", "x":14, "y":2.5}, + + {"label":"`", "x":0, "y":3.5}, + {"label":"LCtrl", "x":1, "y":3.5}, + {"label":"LAlt", "x":2, "y":3.25}, + {"label":"LGUI", "x":3, "y":3}, + {"label":"Lower", "x":4, "y":3.25}, + {"label":"Space", "x":5, "y":3.5}, + {"label":"Fn", "x":6, "y":2.75, "h":1.5}, + + {"label":"RShift", "x":8, "y":2.75, "h":1.5}, + {"label":"Back Space", "x":9, "y":3.5}, + {"label":"Raise", "x":10, "y":3.25}, + {"label":"Left", "x":11, "y":3}, + {"label":"Down", "x":12, "y":3.25}, + {"label":"Up", "x":13, "y":3.5}, + {"label":"Right", "x":14, "y":3.5} + ] + } + } +} diff --git a/keyboards/handwired/atreus50/keymaps/ajp10304/keymap.c b/keyboards/handwired/atreus50/keymaps/ajp10304/keymap.c index 5b13224b0..1e53d050b 100644 --- a/keyboards/handwired/atreus50/keymaps/ajp10304/keymap.c +++ b/keyboards/handwired/atreus50/keymaps/ajp10304/keymap.c @@ -1,6 +1,4 @@ -#include "atreus50.h" -#include "action_layer.h" -#include "eeconfig.h" +#include QMK_KEYBOARD_H #include "keymap_uk.h" extern keymap_config_t keymap_config; @@ -37,10 +35,6 @@ enum planck_keycodes { #include "dynamic_macro.h" -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Qwerty @@ -54,7 +48,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Fn | Ctrl | Alt | GUI |Lower | Bksp | Ctrl | Alt |Space |Raise | Shift| MENU | Ctrl | Fn2 | * `-------------------------------------------------------------------------------------------------' */ -[_QWERTY] = KEYMAP( +[_QWERTY] = LAYOUT( KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC , MT(MOD_LSFT, KC_TAB), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, MT(MOD_RSFT, KC_ENT) , KC_LSHIFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSHIFT , @@ -72,7 +66,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Fn | Ctrl | Alt | GUI |Lower | Bksp | Ctrl | Alt |Space |Mouse | MENU | Alt | Ctrl | Fn | * `-------------------------------------------------------------------------------------------------' */ -[_FUNC] = KEYMAP( +[_FUNC] = LAYOUT( KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12 , KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, UK_TILD, KC_INSERT , KC_LSHIFT, KC_NONUS_BSLASH, KC_GRAVE, KC_NONUS_HASH, KC_PAST, KC_MINS, KC_EQL, KC_BSLASH, KC_LBRC, KC_RBRC, KC_QUOT, MT(MOD_RSFT, KC_ENT) , @@ -90,7 +84,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | |Lower | Del | Ctrl | Alt |Space | | Next | Vol- | Vol+ | Play | * `-------------------------------------------------------------------------------------------------' */ -[_LOWER] = KEYMAP( +[_LOWER] = LAYOUT( KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, KC_BSPC , LSFT(KC_1), LSFT(KC_2), LSFT(KC_3), LSFT(KC_4), LSFT(KC_5), LSFT(KC_6), LSFT(KC_7), LSFT(KC_8), LSFT(KC_9), LSFT(KC_0), LCTL(KC_DEL), LCTL(KC_BSPC) , KC_LSPO, KC_NONUS_BSLASH, KC_GRAVE, KC_NONUS_HASH, KC_QUOT, KC_MINS, KC_EQL, KC_NONUS_HASH, KC_LBRC, KC_RBRC, KC_QUOT, MT(MOD_RSFT, KC_ENT) , @@ -108,7 +102,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Mouse| | | | | Alt | Ctrl | Alt |Enter |Raise | | | | | * `-------------------------------------------------------------------------------------------------' */ -[_RAISE] = KEYMAP( +[_RAISE] = LAYOUT( KC_GRV, XXXXXXX, M(1), KC_LBRC, KC_RBRC, XXXXXXX, XXXXXXX, KC_PGUP, KC_HOME, KC_PGDOWN, XXXXXXX, KC_PSCREEN , KC_GRV, XXXXXXX, XXXXXXX, LSFT(KC_9), LSFT(KC_0), XXXXXXX, XXXXXXX, KC_HOME, KC_UP, KC_END, XXXXXXX, LCTL(LSFT(KC_EQL)) , _______, XXXXXXX, XXXXXXX, LSFT(KC_LBRC), LSFT(KC_RBRC), XXXXXXX, LCTL(KC_LEFT), KC_LEFT, KC_DOWN, KC_RIGHT, LCTL(KC_RIGHT), LCTL(KC_MINS) , @@ -126,11 +120,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | | | | | | * `-------------------------------------------------------------------------------------------------' */ -[_ADJUST] = KEYMAP( +[_ADJUST] = LAYOUT( M(0), RESET, QWERTY, _______, _______, DYN_REC_START1, DYN_REC_START2, _______, _______, _______, _______, KC_DEL , KC_CAPS, _______, _______, _______, _______, DYN_MACRO_PLAY1, DYN_MACRO_PLAY2, KC_AUDIO_MUTE, KC_AUDIO_VOL_UP, KC_MEDIA_PLAY_PAUSE, _______, _______ , TG(_MAC), _______, _______, _______, _______, DYN_REC_STOP, DYN_REC_STOP, KC_MEDIA_PREV_TRACK, KC_AUDIO_VOL_DOWN, KC_MEDIA_NEXT_TRACK, _______, _______ , - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), /* Mouse @@ -144,7 +138,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | | | | | | * `-------------------------------------------------------------------------------------------------' */ -[_MOUSE] = KEYMAP( +[_MOUSE] = LAYOUT( KC_ESC , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ , KC_MS_ACCEL0, KC_MS_ACCEL1, KC_MS_ACCEL2, _______, _______, _______, _______, KC_MS_BTN1, KC_MS_UP, KC_MS_BTN2, _______, _______ , KC_MS_ACCEL0, KC_MS_ACCEL1, KC_MS_ACCEL2, _______, _______, _______, _______, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, _______, _______ , @@ -162,42 +156,42 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | | | | | | * `-------------------------------------------------------------------------------------------------' */ -[_FUNC2] = KEYMAP( +[_FUNC2] = LAYOUT( _______, _______, M(1), _______, _______, _______, M(5), _______, _______, _______, _______, _______, _______, _______, M(3), M(7), _______, _______, _______, M(10), _______, _______, _______, _______, _______, LCTL(KC_Z), LCTL(KC_X), LCTL(KC_C), LCTL(KC_V), _______, _______, _______, _______, _______, _______, M(98) , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), -[_MAC] = KEYMAP( +[_MAC] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, MFNC, _______, _______, _______, MLWR, _______, _______, _______, _______, MRSE, _______, _______, _______, MFNC2 ), -[_MLWR] = KEYMAP( +[_MLWR] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), -[_MRSE] = KEYMAP( +[_MRSE] = LAYOUT( _______, _______, M(2), _______, _______, _______, _______, _______, _______, _______, _______, _______ , _______, _______, _______, _______, _______, _______, _______, LCTL(KC_A), _______, LCTL(KC_E), _______, LGUI(KC_EQL) , _______, _______, _______, _______, _______, _______, LALT(KC_LEFT), _______, _______, _______, LALT(KC_RIGHT), LGUI(KC_MINS) , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), -[_MFNC] = KEYMAP( +[_MFNC] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, LGUI(KC_PENT) , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), -[_MFNC2] = KEYMAP( +[_MFNC2] = LAYOUT( _______, _______, M(2), _______, _______, _______, M(6), _______, _______, _______, _______, _______, _______, _______, M(4), M(8), _______, _______, _______, M(10), _______, _______, _______, _______, _______, LGUI(KC_Z), LGUI(KC_X), LGUI(KC_C), LGUI(KC_V), _______, _______, _______, _______, _______, _______, M(99) , diff --git a/keyboards/handwired/atreus50/keymaps/default/keymap.c b/keyboards/handwired/atreus50/keymaps/default/keymap.c index 21d91a879..97b90a6db 100644 --- a/keyboards/handwired/atreus50/keymaps/default/keymap.c +++ b/keyboards/handwired/atreus50/keymaps/default/keymap.c @@ -1,9 +1,4 @@ -#include "atreus50.h" -#include "action_layer.h" -#include "eeconfig.h" -#ifdef AUDIO_ENABLE - #include "audio.h" -#endif +#include QMK_KEYBOARD_H // Each layer gets a name for readability, which is then used in the keymap matrix below. // The underscores don't mean anything - you can have a layer called STUFF or any other name. @@ -28,86 +23,52 @@ enum custom_keycodes { }; // Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO -#define KC_X0 MT(MOD_LCTL, KC_ESC) // Hold for Left Ctrl, Tap for ESC -#define KC_X1 LOWER -#define KC_X2 RAISE -#define KC_X3 MO(_MOVEMENT) -#define KC_X4 MT(MOD_LSFT, KC_ENT) // Hold for Left Shift, Tap for Enter +#define X0 MT(MOD_LCTL, KC_ESC) // Hold for Left Ctrl, Tap for ESC +#define X3 MO(_MOVEMENT) +#define X4 MT(MOD_LSFT, KC_ENT) // Hold for Left Shift, Tap for Enter const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_QWERTY] = COMPACT_KEYMAP( - //,----+----+----+----+----+----. ,----+----+----+----+----+----. - TAB , Q , W , E , R , T , Y , U , I , O , P ,MINS, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - X0 , A , S , D , F , G , H , J , K , L ,SCLN,QUOT, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - LSFT, Z , X , C , V , B , N , M ,COMM,DOT ,SLSH, X4 , - //|----+----+----+----+----+----|----+----|----+----+----+----+----+----| - GRV ,LCTL,LALT,LGUI, X1 ,SPC , X3 ,RSFT,BSPC, X2 ,LEFT,DOWN, UP ,RGHT - //`----+----+----+----+----+----+----+----+----+----+----+----+----+----' + [_QWERTY] = LAYOUT( + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS, + X0, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, X4, + KC_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, X3, KC_RSFT, KC_BSPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT ), - [_COLEMAK] = COMPACT_KEYMAP( - //,----+----+----+----+----+----. ,----+----+----+----+----+----. - TAB , Q , W , F , P , G , J , L , U , Y ,SCLN,MINS, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - X0 , A , R , S , T , D , H , N , E , I , O ,QUOT, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - LSFT, Z , X , C , V , B , K , M ,COMM,DOT ,SLSH, X4 , - //|----+----+----+----+----+----|----+----|----+----+----+----+----+----| - GRV ,LCTL,LALT,LGUI, X1 ,SPC , X3 ,RSFT,BSPC, X2 ,LEFT,DOWN, UP ,RGHT - //`----+----+----+----+----+----+----+----+----+----+----+----+----+----' + [_COLEMAK] = LAYOUT( + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_MINS, + X0, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, X4, + KC_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, X3, KC_RSFT, KC_BSPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT ), - [_DVORAK] = COMPACT_KEYMAP( - //,----+----+----+----+----+----. ,----+----+----+----+----+----. - TAB ,QUOT,COMM,DOT , P , Y , F , G , C , R , L ,MINS, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - X0 , A , O , E , U , I , D , H , T , N , S ,SLSH, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - LSFT,SCLN, Q , J , K , X , B , M , W , V , Z , X4 , - //|----+----+----+----+----+----|----+----|----+----+----+----+----+----| - GRV ,LCTL,LALT,LGUI, X1 ,SPC , X3 ,RSFT,BSPC, X2 ,LEFT,DOWN, UP ,RGHT - //`----+----+----+----+----+----+----+----+----+----+----+----+----+----' + [_DVORAK] = LAYOUT( + KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_MINS, + X0, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, + KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, X4, + KC_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, X3, KC_RSFT, KC_BSPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT ), - [_LOWER] = COMPACT_KEYMAP( - //,----+----+----+----+----+----. ,----+----+----+----+----+----. - TILD,EXLM, AT ,HASH,DLR ,PERC, CIRC,AMPR,ASTR,LPRN,RPRN,DEL , - //|----+----+----+----+----+----| |----+----+----+----+----+----| - DEL , F1 , F2 , F3 , F4 , F5 , F6 ,UNDS,PLUS,LCBR,RCBR,PIPE, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - , F7 , F8 , F9 ,F10 ,F11 , F12 ,END , , , , , - //|----+----+----+----+----+----|----+----|----+----+----+----+----+----| - , , , , , , , , , ,MNXT,VOLD,VOLU,MPLY - //`----+----+----+----+----+----+----+----+----+----+----+----+----+----' + [_LOWER] = LAYOUT( + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_END, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY ), - [_RAISE] = COMPACT_KEYMAP( - //,----+----+----+----+----+----. ,----+----+----+----+----+----. - GRV , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,DEL , - //|----+----+----+----+----+----| |----+----+----+----+----+----| - DEL , F1 , F2 , F3 , F4 , F5 , F6 ,MINS,EQL ,LBRC,RBRC,BSLS, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - , F7 , F8 , F9 ,F10 ,F11 , F12 ,NUHS,NUBS, , , , - //|----+----+----+----+----+----|----+----|----+----+----+----+----+----| - , , , , , , , , , ,MNXT,VOLD,VOLU,MPLY - //`----+----+----+----+----+----+----+----+----+----+----+----+----+----' + [_RAISE] = LAYOUT( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY ), - [_MOVEMENT] = COMPACT_KEYMAP( - //,----+----+----+----+----+----. ,----+----+----+----+----+----. - TILD,EXLM, AT ,HASH,DLR ,PERC, CIRC,AMPR, UP ,LPRN,RPRN,DEL , - //|----+----+----+----+----+----| |----+----+----+----+----+----| - DEL , F1 , F2 , F3 , F4 , F5 , F6 ,LEFT,DOWN,RGHT,RCBR,PIPE, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - , F7 , F8 , F9 ,F10 ,F11 , F12 ,END , , , , , - //|----+----+----+----+----+----|----+----|----+----+----+----+----+----| - , , , , , , , ,PGDN,PGUP,MNXT,VOLD,VOLU,MPLY - //`----+----+----+----+----+----+----+----+----+----+----+----+----+----' + [_MOVEMENT] = LAYOUT( + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_UP, KC_LPRN, KC_RPRN, KC_DEL, + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_LEFT, KC_DOWN, KC_RGHT, KC_RCBR, KC_PIPE, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_END, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_PGDN, KC_PGUP, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY ), /* Adjust (Lower + Raise) @@ -121,7 +82,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | | | | | | * `-------------------------------------------------------------------------------------------------' */ - [_ADJUST] = KEYMAP( \ + [_ADJUST] = LAYOUT( \ _______, RESET, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, _______, KC_DEL, \ _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ _______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______, \ diff --git a/keyboards/handwired/atreus50/readme.md b/keyboards/handwired/atreus50/readme.md index 0c24f67db..9449d66e5 100644 --- a/keyboards/handwired/atreus50/readme.md +++ b/keyboards/handwired/atreus50/readme.md @@ -1,7 +1,9 @@ -Handwired Atreus50 -================== +# Handwired Atreus50 -This firmware is for a Handwired Atreus50 using an Arduino Pro Micro. +This firmware is for a handwired Atreus50 using an Arduino Pro Micro. + +Keyboard Maintainer: [The QMK Community](https://github.com/qmk) +Hardware Supported: Arduino Pro Micro ## Pinout @@ -11,6 +13,12 @@ The following pins are used: ## Compiling and loading the firmware -To build the firmware, run `make`. +Make example for this keyboard (after setting up your build environment): -To flash the firemware onto the microcontroller, run `make avrdude`, and press the reset button. + make handwired/atreus50:default + +To flash the firmware onto the microcontroller, run `make avrdude`, and press the reset button. + + make handwired/atreus50:default:avrdude + +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). From d5a06aec8386ef16e0751572c5182410b8d348f7 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sun, 2 Dec 2018 15:12:54 -0500 Subject: [PATCH 599/788] Second try at configuring i18n for docsify and gitbook (#4531) * add zh-cn readme * edit readme * Round 1 of edits - Mandarin translation of QMK products is off, best to use the English name. - Fix some terminology and grammar. * trying re-translating the first paragraph * add fallback langurages * Create LANGS.md * Rename docs/zh-cn/README.md to docs/zh/README.md * Update LANGS.md * Update index.html --- docs/LANGS.md | 4 ++++ docs/index.html | 3 ++- docs/zh/README.md | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 docs/LANGS.md create mode 100644 docs/zh/README.md diff --git a/docs/LANGS.md b/docs/LANGS.md new file mode 100644 index 000000000..4b48f2d3d --- /dev/null +++ b/docs/LANGS.md @@ -0,0 +1,4 @@ +# Languages + +* [English](/) +* [Chinese](zh/) diff --git a/docs/index.html b/docs/index.html index f0b1fae07..f5aa92b53 100644 --- a/docs/index.html +++ b/docs/index.html @@ -25,7 +25,8 @@ placeholder: 'Search Documentation...', noData: 'We could not find any documents matching your search.', depth: 6 - } + }, + fallbackLanguages: ['zh'] } diff --git a/docs/zh/README.md b/docs/zh/README.md new file mode 100644 index 000000000..bb9d1371f --- /dev/null +++ b/docs/zh/README.md @@ -0,0 +1,32 @@ +# QMK鍵盤固件 + +[![當前版本](https://img.shields.io/github/tag/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/tags) +[![築邦](https://travis-ci.org/qmk/qmk_firmware.svg?branch=master)](https://travis-ci.org/qmk/qmk_firmware) +[![不和諧](https://img.shields.io/discord/440868230475677696.svg)](https://discord.gg/Uq7gcHh) +[![文檔狀態](https://img.shields.io/badge/docs-ready-orange.svg)](https://docs.qmk.fm) +[![GitHub的貢獻者](https://img.shields.io/github/contributors/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/pulse/monthly) +[![GitHub的叉](https://img.shields.io/github/forks/qmk/qmk_firmware.svg?style=social&label=Fork)](https://github.com/qmk/qmk_firmware/) + +## 什麼是QMK固件? + +QMK是一個由社群維護的開源鍵盤韌體,其中包含了QMK Toolbox、qmk.fm和其它文件。QMK韌體是以[tmk\_keyboard](http://github.com/tmk/tmk_keyboard)為基礎,讓一些有用的功能在Atmel AVR控制器實現,使用於[OLKB](https://olkb.com)、[ergodox EZ](http://www.ergodox-ez.com),和[Clueboard](http://clueboard.co/)的產品中。它也被移植到使用ChibiOS的ARM晶片上。你也可以用它來讓你徒手佈線,或是客製的鍵盤PCB發揮功能。 + +## 如何得到QMK + +如果你打算貢獻鍵盤佈局,鍵盤或功能QMK,最容易做的事情是[叉通過Github上爬行](https://github.com/qmk/qmk_firmware#fork-destination-box),和克隆你爬在本地進行更改,推動他們,然後打開從你的叉子[拉請求](https://github.com/qmk/qmk_firmware/pulls)。 + +否則,您可以直接下載([拉鍊](https://github.com/qmk/qmk_firmware/zipball/master) [焦油](https://github.com/qmk/qmk_firmware/tarball/master)),或者通過GIT中克隆它(`git@github.com:qmk/qmk_firmware.git`)或HTTP(`https://github.com/qmk/qmk_firmware.git`)。 + +## 如何編譯 + +你可以編譯之前,你需要[安裝環境](getting_started_build_tools.md)用於AVR或/和ARM開發。一旦完成,你會使用`make`命令建立一個鍵盤並用以下符號鍵盤佈局 + + make planck/rev4:default + +這將建立`rev4` `planck`的修訂與`default`鍵盤映射。並非所有鍵盤有一個修訂版(也稱為子項目或文件夾),在這種情況下,它可以被省略: + + make preonic:default + +## 如何赶近 + +QMK有很多[特點](features.md)探索和很好的協議[參考文獻](http://docs.qmk.fm)挖通的。大部分功能通過修改[鍵盤映射(keymap.md),並改變[鍵碼](keycodes.md)冤大頭。 From 5d47231f2a9353645aab07e14c1de21f00b7fc2f Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sun, 2 Dec 2018 15:35:53 -0500 Subject: [PATCH 600/788] Add sidebar for ZH (#4533) * add zh-cn readme * edit readme * Round 1 of edits - Mandarin translation of QMK products is off, best to use the English name. - Fix some terminology and grammar. * trying re-translating the first paragraph * add fallback langurages * Create LANGS.md * Rename docs/zh-cn/README.md to docs/zh/README.md * Update LANGS.md * Update index.html * Delete README.md * add sidebar for zh --- docs/zh-cn/README.md | 32 -------------- docs/zh/_sidebar.md | 99 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+), 32 deletions(-) delete mode 100644 docs/zh-cn/README.md create mode 100644 docs/zh/_sidebar.md diff --git a/docs/zh-cn/README.md b/docs/zh-cn/README.md deleted file mode 100644 index bb9d1371f..000000000 --- a/docs/zh-cn/README.md +++ /dev/null @@ -1,32 +0,0 @@ -# QMK鍵盤固件 - -[![當前版本](https://img.shields.io/github/tag/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/tags) -[![築邦](https://travis-ci.org/qmk/qmk_firmware.svg?branch=master)](https://travis-ci.org/qmk/qmk_firmware) -[![不和諧](https://img.shields.io/discord/440868230475677696.svg)](https://discord.gg/Uq7gcHh) -[![文檔狀態](https://img.shields.io/badge/docs-ready-orange.svg)](https://docs.qmk.fm) -[![GitHub的貢獻者](https://img.shields.io/github/contributors/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/pulse/monthly) -[![GitHub的叉](https://img.shields.io/github/forks/qmk/qmk_firmware.svg?style=social&label=Fork)](https://github.com/qmk/qmk_firmware/) - -## 什麼是QMK固件? - -QMK是一個由社群維護的開源鍵盤韌體,其中包含了QMK Toolbox、qmk.fm和其它文件。QMK韌體是以[tmk\_keyboard](http://github.com/tmk/tmk_keyboard)為基礎,讓一些有用的功能在Atmel AVR控制器實現,使用於[OLKB](https://olkb.com)、[ergodox EZ](http://www.ergodox-ez.com),和[Clueboard](http://clueboard.co/)的產品中。它也被移植到使用ChibiOS的ARM晶片上。你也可以用它來讓你徒手佈線,或是客製的鍵盤PCB發揮功能。 - -## 如何得到QMK - -如果你打算貢獻鍵盤佈局,鍵盤或功能QMK,最容易做的事情是[叉通過Github上爬行](https://github.com/qmk/qmk_firmware#fork-destination-box),和克隆你爬在本地進行更改,推動他們,然後打開從你的叉子[拉請求](https://github.com/qmk/qmk_firmware/pulls)。 - -否則,您可以直接下載([拉鍊](https://github.com/qmk/qmk_firmware/zipball/master) [焦油](https://github.com/qmk/qmk_firmware/tarball/master)),或者通過GIT中克隆它(`git@github.com:qmk/qmk_firmware.git`)或HTTP(`https://github.com/qmk/qmk_firmware.git`)。 - -## 如何編譯 - -你可以編譯之前,你需要[安裝環境](getting_started_build_tools.md)用於AVR或/和ARM開發。一旦完成,你會使用`make`命令建立一個鍵盤並用以下符號鍵盤佈局 - - make planck/rev4:default - -這將建立`rev4` `planck`的修訂與`default`鍵盤映射。並非所有鍵盤有一個修訂版(也稱為子項目或文件夾),在這種情況下,它可以被省略: - - make preonic:default - -## 如何赶近 - -QMK有很多[特點](features.md)探索和很好的協議[參考文獻](http://docs.qmk.fm)挖通的。大部分功能通過修改[鍵盤映射(keymap.md),並改變[鍵碼](keycodes.md)冤大頭。 diff --git a/docs/zh/_sidebar.md b/docs/zh/_sidebar.md new file mode 100644 index 000000000..c16761292 --- /dev/null +++ b/docs/zh/_sidebar.md @@ -0,0 +1,99 @@ +* [完全指南菜鳥](zh/newbs.md) + * [入門](zh/newbs_getting_started.md) + * [構建第一個固件](zh/newbs_building_firmware.md) + * [刷新固件](zh/newbs_flashing.md) + * [測試和調試](zh/newbs_testing_debugging.md) + * [最佳實踐](zh/newbs_best_practices.md) + * [學習資源](zh/newbs_learn_more_resources.md) + +* [QMK基礎](zh/README.md) + * [QMK簡介](zh/getting_started_introduction.md) + * [特約QMK](zh/contributing.md) + * [如何使用Github上](zh/getting_started_github.md) + * [獲得幫助](zh/getting_started_getting_help.md) + +* [常問問題](zh/faq.md) + * [常問問題](zh/faq_general.md) + * [構建/編譯QMK](zh/faq_build.md) + * [調試/故障排除QMK](zh/faq_debug.md) + * [鍵盤佈局](zh/faq_keymap.md) + +* 詳細指南 + * [安裝編譯工具](zh/getting_started_build_tools.md) + * [流浪漢指南](zh/getting_started_vagrant.md) + * [構建/編譯器指令](zh/getting_started_make_guide.md) + * [刷新固件](zh/flashing.md) + * [定制功能](zh/custom_quantum_functions.md) + * [鍵盤映射概述](zh/keymap.md) + +* [硬件](zh/hardware.md) + * [AVR處理器](zh/hardware_avr.md) + * [司機](zh/hardware_drivers.md) + +* 參考 + * [Keyboard Guidelines](zh/hardware_keyboard_guidelines.md) + * [Config Options](zh/config_options.md) + * [Keycodes](zh/keycodes.md) + * [Documentation Best Practices](zh/documentation_best_practices.md) + * [Documentation Templates](zh/documentation_templates.md) + * [Glossary](zh/reference_glossary.md) + * [Unit Testing](zh/unit_testing.md) + * [Useful Functions](zh/ref_functions.md) + * [Configurator Support](zh/reference_configurator_support.md) + +* [特點](zh/features.md) + * [Basic Keycodes](zh/keycodes_basic.md) + * [Quantum Keycodes](zh/quantum_keycodes.md) + * [Advanced Keycodes](zh/feature_advanced_keycodes.md) + * [Audio](zh/feature_audio.md) + * [Auto Shift](zh/feature_auto_shift.md) + * [Backlight](zh/feature_backlight.md) + * [Bluetooth](zh/feature_bluetooth.md) + * [Bootmagic](zh/feature_bootmagic.md) + * [Combos](zh/feature_combo) + * [Command](zh/feature_command.md) + * [Dynamic Macros](zh/feature_dynamic_macros.md) + * [Encoders](zh/feature_encoders.md) + * [Grave Escape](zh/feature_grave_esc.md) + * [Key Lock](zh/feature_key_lock.md) + * [Layouts](zh/feature_layouts.md) + * [Leader Key](zh/feature_leader_key.md) + * [Macros](zh/feature_macros.md) + * [Mouse Keys](zh/feature_mouse_keys.md) + * [One Shot Keys](zh/feature_advanced_keycodes.md#one-shot-keys) + * [Pointing Device](zh/feature_pointing_device.md) + * [PS/2 Mouse](zh/feature_ps2_mouse.md) + * [RGB Lighting](zh/feature_rgblight.md) + * [RGB Matrix](zh/feature_rgb_matrix.md) + * [Space Cadet Shift](zh/feature_space_cadet_shift.md) + * [Space Cadet Shift Enter](zh/feature_space_cadet_shift_enter.md) + * [Stenography](zh/feature_stenography.md) + * [Swap Hands](zh/feature_swap_hands.md) + * [Tap Dance](zh/feature_tap_dance.md) + * [Terminal](zh/feature_terminal.md) + * [Thermal Printer](zh/feature_thermal_printer.md) + * [Unicode](zh/feature_unicode.md) + * [Userspace](zh/feature_userspace.md) + * [US ANSI Shifted Keys](zh/keycodes_us_ansi_shifted.md) + +* 對於製造商和遊戲模組 + * [Hand Wiring Guide](zh/hand_wire.md) + * [ISP Flashing Guide](zh/isp_flashing_guide.md) + * [ARM Debugging Guide](zh/arm_debugging.md) + * [I2C Driver](zh/i2c_driver.md) + +* 為了更深入的了解 + * [How Keyboards Work](zh/how_keyboards_work.md) + * [Understanding QMK](zh/understanding_qmk.md) + +* 其它主題 + * [Using Eclipse with QMK](zh/eclipse.md) + +* QMK內部(進行中) + * [Defines](zh/internals_defines.md) + * [Input Callback Reg](zh/internals_input_callback_reg.md) + * [Midi Device](zh/internals_midi_device.md) + * [Midi Device Setup Process](zh/internals_midi_device_setup_process.md) + * [Midi Util](zh/internals_midi_util.md) + * [Send Functions](zh/internals_send_functions.md) + * [Sysex Tools](zh/internals_sysex_tools.md) From fe982caf5d69fdb2d6f1dec123a630df11a98282 Mon Sep 17 00:00:00 2001 From: epaew Date: Tue, 4 Dec 2018 01:00:00 +0900 Subject: [PATCH 601/788] Add edvorakjp kepmap for crkbd (#4537) * edvorakjp layout for crkbd * bugfix of edvorakjp QMK cannot send keycode that doesn't exists on new layer. --- keyboards/crkbd/keymaps/edvorakjp/config.h | 24 +++ keyboards/crkbd/keymaps/edvorakjp/keymap.c | 158 ++++++++++++++++++++ keyboards/crkbd/keymaps/edvorakjp/oled.c | 82 ++++++++++ keyboards/crkbd/keymaps/edvorakjp/oled.h | 24 +++ keyboards/crkbd/keymaps/edvorakjp/readme.md | 21 +++ keyboards/crkbd/keymaps/edvorakjp/rules.mk | 32 ++++ users/edvorakjp/edvorakjp_process_record.c | 18 ++- 7 files changed, 354 insertions(+), 5 deletions(-) create mode 100644 keyboards/crkbd/keymaps/edvorakjp/config.h create mode 100644 keyboards/crkbd/keymaps/edvorakjp/keymap.c create mode 100644 keyboards/crkbd/keymaps/edvorakjp/oled.c create mode 100644 keyboards/crkbd/keymaps/edvorakjp/oled.h create mode 100644 keyboards/crkbd/keymaps/edvorakjp/readme.md create mode 100644 keyboards/crkbd/keymaps/edvorakjp/rules.mk diff --git a/keyboards/crkbd/keymaps/edvorakjp/config.h b/keyboards/crkbd/keymaps/edvorakjp/config.h new file mode 100644 index 000000000..515591a42 --- /dev/null +++ b/keyboards/crkbd/keymaps/edvorakjp/config.h @@ -0,0 +1,24 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + +#define SSD1306OLED +#define SWAP_SCLN + +// #define TAPPING_FORCE_HOLD +#define TAPPING_TERM 120 + +#undef RGBLED_NUM +#define RGBLIGHT_EFFECT_STATIC_GRADIENT +#define RGBLED_NUM 27 +#define RGBLIGHT_LIMIT_VAL 100 +#define RGBLIGHT_HUE_STEP 10 +#define RGBLIGHT_SAT_STEP 17 +#define RGBLIGHT_VAL_STEP 17 + +#endif // CONFIG_USER_H diff --git a/keyboards/crkbd/keymaps/edvorakjp/keymap.c b/keyboards/crkbd/keymaps/edvorakjp/keymap.c new file mode 100644 index 000000000..ae2f710a0 --- /dev/null +++ b/keyboards/crkbd/keymaps/edvorakjp/keymap.c @@ -0,0 +1,158 @@ +#include QMK_KEYBOARD_H +#ifdef PROTOCOL_LUFA + #include "split_util.h" +#endif +#ifdef SSD1306OLED + #include "oled.h" +#endif + +#include "edvorakjp.h" + +/* + * enum custom_keycodes { + * KC_LOCK = NEW_SAFE_RANGE, + * }; + */ + +#define KC_ KC_TRNS + +#define KC_TMB1 LGUI_T(KC_TAB) +#define KC_TMB2 LSFT_T(KC_SPC) +#define KC_TMB3 TD(TD_LOWER) // act as LOWER when hold, as KC_LANG2(=English) when tapped +#define KC_TMB4 TD(TD_RAISE) // act as RAISE when hold, as KC_LANG1(=Japanese) when tapped +#define KC_TMB5 RCTL_T(KC_BSPC) +#define KC_TMB6 RALT_T(KC_ENT) +#define KC_TMB7 KC_DEL +#define KC_TMB8 RALT(KC_ENT) +#define KC_TMB9 LGUI(KC_TAB) + +#define KC_RST RESET +#define KC_DBUG DEBUG +#define KC_RTOG RGB_TOG +#define KC_EDJP EDVORAK +#define KC_QWER QWERTY + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_EDVORAK] = LAYOUT_kc( + //|----+----+----+----+----+----| |----+----+----+----+----+----| + ESC ,QUOT,COMM,DOT , Y , P , F , G , R , W , Q ,BSLS, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + EQL , A , O , E , I , U , D , T , N , S , M ,MINS, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + GRV ,SCLN, X , C , V , Z , B , H , J , K , L ,SLSH, + //`----+----+----+----+----+----+----| |----+----+----+----+----+----+----' + TMB1,TMB2,TMB3, TMB4,TMB5,TMB6 + // `----+----+----' `----+----+----' + ), + + [_EDVORAKJ1] = LAYOUT_kc( + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , AI , OU , EI , , , , , , , , , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , , , , , , , , , Y , , , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + ,ANN ,ONN ,ENN ,INN ,UNN , , , , , , , + //`----+----+----+----+----+----+----| |----+----+----+----+----+----+----' + , , , , , + // `----+----+----' `----+----+----' + ), + + [_EDVORAKJ2] = LAYOUT_kc( + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , AI , OU , EI , , , , , , , , , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , , , , , , , Y , , , , , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + ,ANN ,ONN ,ENN ,INN ,UNN , , , , , , , + //`----+----+----+----+----+----+----| |----+----+----+----+----+----+----' + , , , , , + // `----+----+----' `----+----+----' + ), + + [_QWERTY] = LAYOUT_kc( + //|----+----+----+----+----+----| |----+----+----+----+----+----| + TAB , Q , W , E , R , T , Y , U , I , O , P ,MINS, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + EQL , A , S , D , F , G , H , J , K , L ,SCLN,QUOT, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + GRV , Z , X , C , V , B , N , M ,COMM,DOT ,SLSH,BSLS, + //`----+----+----+----+----+----+----| |----+----+----+----+----+----+----' + , , , , , + // `----+----+----' `----+----+----' + ), + + [_LOWER] = LAYOUT_kc( + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , , , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , 1 ,EXLM, AT ,HASH,DLR , PERC,CIRC,AMPR,ASTR, 0 , , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , , LT ,LCBR,LPRN,LBRC, RBRC,RPRN,RCBR, GT , , , + //`----+----+----+----+----+----+----| |----+----+----+----+----+----+----' + , , , ,TMB7,TMB8 + // `----+----+----' `----+----+----' + ), + + [_RAISE] = LAYOUT_kc( + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , F1 , F2 , F3 , F4 , F5 , F6 , F7 , F8 , F9 ,F10 , , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + ,F11 ,F12 ,PSCR,SLCK,PAUS, ,HOME,PGDN,PGUP,END , , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , , , , , , ,LEFT,DOWN, UP ,RGHT, , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----' + TMB9, , , , , + // `----+----+----' `----+----+----' + ), + + [_ADJUST] = LAYOUT_kc( + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , , , ,EXTOFF, , ,EXTON, , , , , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , , ,QWER,WIN ,RST , RTOG,MAC ,EDJP, , , , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , , , , , , , , , , , , + //`----+----+----+----+----+----+----| |----+----+----+----+----+----+----' + , , , , , + // `----+----+----' `----+----+----' + ) +}; + +#ifdef SSD1306OLED +void matrix_init_keymap(void) { + //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h + iota_gfx_init(!has_usb()); // turns on the display +} + +void matrix_scan_user(void) { + iota_gfx_task(); // this is what updates the display continuously +} +#endif + +#ifdef RGBLIGHT_EFFECT_STATIC_GRADIENT +uint32_t layer_state_set_keymap(uint32_t state) { + rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT); + switch (biton32(state)) { + case _EDVORAKJ1: + case _EDVORAKJ2: + // _EDVORAKJ1 & J2 are same colored + rgblight_sethsv_noeeprom_white(); + break; + case _LOWER: + rgblight_sethsv_noeeprom_red(); + break; + case _RAISE: + rgblight_sethsv_noeeprom_blue(); + break; + case _ADJUST: + rgblight_sethsv_noeeprom_green(); + break; + default: // for any other layers, or the default layer + rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_GRADIENT + 3); + rgblight_sethsv_noeeprom_red(); + break; + } + return state; +} +#endif diff --git a/keyboards/crkbd/keymaps/edvorakjp/oled.c b/keyboards/crkbd/keymaps/edvorakjp/oled.c new file mode 100644 index 000000000..e4cccf3e7 --- /dev/null +++ b/keyboards/crkbd/keymaps/edvorakjp/oled.c @@ -0,0 +1,82 @@ +#include +#include "oled.h" + +// NOTE: Redefined to avoid to use snprintf(); It makes size of firmware big. +const char *read_mode_icon(bool windows_mode) { + static const char logo[][2][3] = {{{0x95, 0x96, 0}, {0xb5, 0xb6, 0}}, {{0x97, 0x98, 0}, {0xb7, 0xb8, 0}}}; + static char mode_icon[10]; + + int mode_number = windows_mode ? 1 : 0; + strcpy(mode_icon, logo[mode_number][0]); + + strcat(mode_icon, "\n"); + strcat(mode_icon, logo[mode_number][1]); + + return mode_icon; +} + +const char *read_layer_state(void) { + static char layer_state_str[24]; + char layer_name[17]; + + switch (biton32(layer_state)) { + case L_BASE: + strcpy(layer_name, default_layer_state == 1UL<<_EDVORAK ? "EDVORAK" : "QWERTY"); + break; + case _EDVORAKJ1: + case _EDVORAKJ2: + strcpy(layer_name, "JP_EXT"); + break; + case _RAISE: + strcpy(layer_name, "Raise"); + break; + case _LOWER: + strcpy(layer_name, "Lower"); + break; + case _ADJUST: + strcpy(layer_name, "Adjust"); + break; + default: + snprintf(layer_name, sizeof(layer_name), "Undef-%ld", layer_state); + } + + strcpy(layer_state_str, "Layer: "); + + strcat(layer_state_str, layer_name); + strcat(layer_state_str, "\n"); + return layer_state_str; +} + +const char *read_host_led_state(void) { + static char led_str[24]; + bool ext_status = get_enable_jp_extra_layer() && get_japanese_mode(); + strcpy(led_str, ext_status ? "EXT" : " "); + + strcat(led_str, (host_keyboard_leds() & (1<display, source->display, sizeof(dest->display))) { + memcpy(dest->display, source->display, sizeof(dest->display)); + dest->dirty = true; + } +} + +void iota_gfx_task_user(void) { + struct CharacterMatrix matrix; + + matrix_clear(&matrix); + if (is_master) { + matrix_write(&matrix, read_mode_icon(!get_enable_kc_lang())); + matrix_write(&matrix, " "); + matrix_write(&matrix, read_layer_state()); + matrix_write(&matrix, read_host_led_state()); + } else { + matrix_write(&matrix, read_logo()); + } + matrix_update(&display, &matrix); +} diff --git a/keyboards/crkbd/keymaps/edvorakjp/oled.h b/keyboards/crkbd/keymaps/edvorakjp/oled.h new file mode 100644 index 000000000..896347aea --- /dev/null +++ b/keyboards/crkbd/keymaps/edvorakjp/oled.h @@ -0,0 +1,24 @@ +#ifndef OLED_USER_H +#define OLED_USER_H + +//SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h +#include "ssd1306.h" +#include "edvorakjp.h" + +//assign the right code to your layers for OLED display +#define L_BASE 0 + +extern uint8_t is_master; +extern bool japanese_mode; + +// method prototypes defined in crkbd/lib +extern const char *read_logo(void); + +const char *read_mode_icon(bool swap); +const char *read_layer_state(void); +const char *read_host_led_state(void); +void matrix_update(struct CharacterMatrix *dest, + const struct CharacterMatrix *source); +void iota_gfx_task_user(void); + +#endif // OLED_CONFIG_USER_H diff --git a/keyboards/crkbd/keymaps/edvorakjp/readme.md b/keyboards/crkbd/keymaps/edvorakjp/readme.md new file mode 100644 index 000000000..dd406523d --- /dev/null +++ b/keyboards/crkbd/keymaps/edvorakjp/readme.md @@ -0,0 +1,21 @@ +# edvorakjp + +Epaew's Enhanced Dvorak layout for Japanese Programmer +see [here](/users/edvorakjp) for more informations. + +## License + +Copyright 2018 Ryo Maeda epaew.333@gmail.com @epaew + +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 . diff --git a/keyboards/crkbd/keymaps/edvorakjp/rules.mk b/keyboards/crkbd/keymaps/edvorakjp/rules.mk new file mode 100644 index 000000000..b4f6d2f1f --- /dev/null +++ b/keyboards/crkbd/keymaps/edvorakjp/rules.mk @@ -0,0 +1,32 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = no # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. +SWAP_HANDS_ENABLE = no # Enable one-hand typing +TAP_DANCE_ENABLE = yes + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +# If you want to change the display of OLED, you need to change here +SRC += ./lib/glcdfont.c \ + ./lib/logo_reader.c \ + oled.c \ + # ./lib/rgb_state_reader.c \ + # ./lib/layer_state_reader.c \ + # ./lib/keylogger.c \ + # ./lib/mode_icon_reader.c \ + # ./lib/host_led_state_reader.c \ + # ./lib/timelogger.c \ diff --git a/users/edvorakjp/edvorakjp_process_record.c b/users/edvorakjp/edvorakjp_process_record.c index dc70522b4..2dcdab2a2 100644 --- a/users/edvorakjp/edvorakjp_process_record.c +++ b/users/edvorakjp/edvorakjp_process_record.c @@ -37,11 +37,7 @@ bool process_record_edvorakjp_ext(uint16_t keycode, keyrecord_t *record) { } return true; - // left hand and right hand's right side - case KC_X: - case KC_C: - case KC_V: - case KC_Z: + // left hand up and right hand's right side case KC_Y: case KC_P: case KC_W: @@ -54,6 +50,18 @@ bool process_record_edvorakjp_ext(uint16_t keycode, keyrecord_t *record) { layer_on(_EDVORAKJ2); } return true; + // left hand down + // If return true, QMK sends keycode in new layer, + // but these keys are only available in old layer. + case KC_X: + case KC_C: + case KC_V: + case KC_Z: + if (record->event.pressed) { + layer_on(_EDVORAKJ2); + tap_code(keycode); + } + return false; } // vowel keys, symbol keys and modifier keys From da1afe152af5a6dfb5c0bb28d86d34940162f960 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 3 Dec 2018 10:27:15 -0800 Subject: [PATCH 602/788] Fix up RGB Matrix code (#4503) * Fix up RGB Matrix code * Convert RGBLIGHT functions to rgbmatrix ones, and add defines --- quantum/rgb_matrix.c | 60 ++++++++++++++++++++++++++++++++------------ quantum/rgb_matrix.h | 59 ++++++++++++++++++++++++++++++++----------- quantum/rgblight.c | 4 +-- 3 files changed, 91 insertions(+), 32 deletions(-) diff --git a/quantum/rgb_matrix.c b/quantum/rgb_matrix.c index 15bd13671..82d36177b 100644 --- a/quantum/rgb_matrix.c +++ b/quantum/rgb_matrix.c @@ -842,13 +842,13 @@ void rgb_matrix_init(void) { } // Deals with the messy details of incrementing an integer -uint8_t increment( uint8_t value, uint8_t step, uint8_t min, uint8_t max ) { +static uint8_t increment( uint8_t value, uint8_t step, uint8_t min, uint8_t max ) { int16_t new_value = value; new_value += step; return MIN( MAX( new_value, min ), max ); } -uint8_t decrement( uint8_t value, uint8_t step, uint8_t min, uint8_t max ) { +static uint8_t decrement( uint8_t value, uint8_t step, uint8_t min, uint8_t max ) { int16_t new_value = value; new_value -= step; return MIN( MAX( new_value, min ), max ); @@ -887,77 +887,105 @@ uint32_t rgb_matrix_get_tick(void) { return g_tick; } -void rgblight_toggle(void) { +void rgb_matrix_toggle(void) { rgb_matrix_config.enable ^= 1; eeconfig_update_rgb_matrix(rgb_matrix_config.raw); } -void rgblight_step(void) { +void rgb_matrix_enable(void) { + rgb_matrix_config.enable = 1; + eeconfig_update_rgb_matrix(rgb_matrix_config.raw); +} + +void rgb_matrix_enable_noeeprom(void) { + rgb_matrix_config.enable = 1; +} + +void rgb_matrix_disable(void) { + rgb_matrix_config.enable = 0; + eeconfig_update_rgb_matrix(rgb_matrix_config.raw); +} + +void rgb_matrix_disable_noeeprom(void) { + rgb_matrix_config.enable = 0; +} + +void rgb_matrix_step(void) { rgb_matrix_config.mode++; if (rgb_matrix_config.mode >= RGB_MATRIX_EFFECT_MAX) rgb_matrix_config.mode = 1; eeconfig_update_rgb_matrix(rgb_matrix_config.raw); } -void rgblight_step_reverse(void) { +void rgb_matrix_step_reverse(void) { rgb_matrix_config.mode--; if (rgb_matrix_config.mode < 1) rgb_matrix_config.mode = RGB_MATRIX_EFFECT_MAX - 1; eeconfig_update_rgb_matrix(rgb_matrix_config.raw); } -void rgblight_increase_hue(void) { +void rgb_matrix_increase_hue(void) { rgb_matrix_config.hue = increment( rgb_matrix_config.hue, 8, 0, 255 ); eeconfig_update_rgb_matrix(rgb_matrix_config.raw); } -void rgblight_decrease_hue(void) { +void rgb_matrix_decrease_hue(void) { rgb_matrix_config.hue = decrement( rgb_matrix_config.hue, 8, 0, 255 ); eeconfig_update_rgb_matrix(rgb_matrix_config.raw); } -void rgblight_increase_sat(void) { +void rgb_matrix_increase_sat(void) { rgb_matrix_config.sat = increment( rgb_matrix_config.sat, 8, 0, 255 ); eeconfig_update_rgb_matrix(rgb_matrix_config.raw); } -void rgblight_decrease_sat(void) { +void rgb_matrix_decrease_sat(void) { rgb_matrix_config.sat = decrement( rgb_matrix_config.sat, 8, 0, 255 ); eeconfig_update_rgb_matrix(rgb_matrix_config.raw); } -void rgblight_increase_val(void) { +void rgb_matrix_increase_val(void) { rgb_matrix_config.val = increment( rgb_matrix_config.val, 8, 0, RGB_MATRIX_MAXIMUM_BRIGHTNESS ); eeconfig_update_rgb_matrix(rgb_matrix_config.raw); } -void rgblight_decrease_val(void) { +void rgb_matrix_decrease_val(void) { rgb_matrix_config.val = decrement( rgb_matrix_config.val, 8, 0, RGB_MATRIX_MAXIMUM_BRIGHTNESS ); eeconfig_update_rgb_matrix(rgb_matrix_config.raw); } -void rgblight_increase_speed(void) { +void rgb_matrix_increase_speed(void) { rgb_matrix_config.speed = increment( rgb_matrix_config.speed, 1, 0, 3 ); eeconfig_update_rgb_matrix(rgb_matrix_config.raw);//EECONFIG needs to be increased to support this } -void rgblight_decrease_speed(void) { +void rgb_matrix_decrease_speed(void) { rgb_matrix_config.speed = decrement( rgb_matrix_config.speed, 1, 0, 3 ); eeconfig_update_rgb_matrix(rgb_matrix_config.raw);//EECONFIG needs to be increased to support this } -void rgblight_mode(uint8_t mode) { +void rgb_matrix_mode(uint8_t mode) { rgb_matrix_config.mode = mode; eeconfig_update_rgb_matrix(rgb_matrix_config.raw); } -uint32_t rgblight_get_mode(void) { +void rgb_matrix_mode_noeeprom(uint8_t mode) { + rgb_matrix_config.mode = mode; +} + +uint32_t rgb_matrix_get_mode(void) { return rgb_matrix_config.mode; } -void rgblight_sethsv(uint16_t hue, uint8_t sat, uint8_t val) { +void rgb_matrix_sethsv(uint16_t hue, uint8_t sat, uint8_t val) { rgb_matrix_config.hue = hue; rgb_matrix_config.sat = sat; rgb_matrix_config.val = val; eeconfig_update_rgb_matrix(rgb_matrix_config.raw); } + +void rgb_matrix_sethsv_noeeprom(uint16_t hue, uint8_t sat, uint8_t val) { + rgb_matrix_config.hue = hue; + rgb_matrix_config.sat = sat; + rgb_matrix_config.val = val; +} diff --git a/quantum/rgb_matrix.h b/quantum/rgb_matrix.h index 3cd248ffc..0cfeb4e06 100644 --- a/quantum/rgb_matrix.h +++ b/quantum/rgb_matrix.h @@ -127,6 +127,7 @@ enum rgb_matrix_effects { }; void rgb_matrix_set_color( int index, uint8_t red, uint8_t green, uint8_t blue ); +void rgb_matrix_set_color_all( uint8_t red, uint8_t green, uint8_t blue ); // This runs after another backlight effect and replaces // colors already set @@ -160,20 +161,50 @@ void rgb_matrix_decrease(void); uint32_t rgb_matrix_get_tick(void); -void rgblight_toggle(void); -void rgblight_step(void); -void rgblight_sethsv(uint16_t hue, uint8_t sat, uint8_t val); -void rgblight_step_reverse(void); -void rgblight_increase_hue(void); -void rgblight_decrease_hue(void); -void rgblight_increase_sat(void); -void rgblight_decrease_sat(void); -void rgblight_increase_val(void); -void rgblight_decrease_val(void); -void rgblight_increase_speed(void); -void rgblight_decrease_speed(void); -void rgblight_mode(uint8_t mode); -uint32_t rgblight_get_mode(void); +void rgb_matrix_toggle(void); +void rgb_matrix_enable(void); +void rgb_matrix_enable_noeeprom(void); +void rgb_matrix_disable(void); +void rgb_matrix_disable_noeeprom(void); +void rgb_matrix_step(void); +void rgb_matrix_sethsv(uint16_t hue, uint8_t sat, uint8_t val); +void rgb_matrix_sethsv_noeeprom(uint16_t hue, uint8_t sat, uint8_t val); +void rgb_matrix_step_reverse(void); +void rgb_matrix_increase_hue(void); +void rgb_matrix_decrease_hue(void); +void rgb_matrix_increase_sat(void); +void rgb_matrix_decrease_sat(void); +void rgb_matrix_increase_val(void); +void rgb_matrix_decrease_val(void); +void rgb_matrix_increase_speed(void); +void rgb_matrix_decrease_speed(void); +void rgb_matrix_mode(uint8_t mode); +void rgb_matrix_mode_noeeprom(uint8_t mode); +uint32_t rgb_matrix_get_mode(void); + +#ifndef RGBLIGHT_ENABLE +#define rgblight_toggle() rgb_matrix_toggle() +#define rgblight_enable() rgb_matrix_enable() +#define rgblight_enable_noeeprom() rgb_matrix_enable_noeeprom() +#define rgblight_disable() rgb_matrix_disable() +#define rgblight_disable_noeeprom() rgb_matrix_disable_noeeprom() +#define rgblight_step() rgb_matrix_step() +#define rgblight_sethsv(hue, sat, val) rgb_matrix_sethsv(hue, sat, val) +#define rgblight_sethsv_noeeprom(hue, sat, val) rgb_matrix_sethsv_noeeprom(hue, sat, val) +#define rgblight_step_reverse() rgb_matrix_step_reverse() +#define rgblight_increase_hue() rgb_matrix_increase_hue() +#define rgblight_decrease_hue() rgb_matrix_decrease_hue() +#define rgblight_increase_sat() rgb_matrix_increase_sat() +#define rgblight_decrease_sat() rgb_matrix_decrease_sat() +#define rgblight_increase_val() rgb_matrix_increase_val() +#define rgblight_decrease_val() rgb_matrix_decrease_val() +#define rgblight_increase_speed() rgb_matrix_increase_speed() +#define rgblight_decrease_speed() rgb_matrix_decrease_speed() +#define rgblight_mode(mode) rgb_matrix_mode(mode) +#define rgblight_mode_noeeprom(mode) rgb_matrix_mode_noeeprom(mode) +#define rgblight_get_mode() rgb_matrix_get_mode() + +#endif typedef struct { /* Perform any initialisation required for the other driver functions to work. */ diff --git a/quantum/rgblight.c b/quantum/rgblight.c index 9ce3b2309..a2d6fe7a0 100644 --- a/quantum/rgblight.c +++ b/quantum/rgblight.c @@ -325,13 +325,13 @@ void rgblight_disable_noeeprom(void) { // Deals with the messy details of incrementing an integer -uint8_t increment( uint8_t value, uint8_t step, uint8_t min, uint8_t max ) { +static uint8_t increment( uint8_t value, uint8_t step, uint8_t min, uint8_t max ) { int16_t new_value = value; new_value += step; return MIN( MAX( new_value, min ), max ); } -uint8_t decrement( uint8_t value, uint8_t step, uint8_t min, uint8_t max ) { +static uint8_t decrement( uint8_t value, uint8_t step, uint8_t min, uint8_t max ) { int16_t new_value = value; new_value -= step; return MIN( MAX( new_value, min ), max ); From 3a0f3a5bd0aff18934431ad471b1db390c3b33d1 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 3 Dec 2018 16:42:57 -0800 Subject: [PATCH 603/788] Make ARM Audio max volume configurable (#4540) * Make ARM Audio max volume configurable * Update docs/feature_audio.md Co-Authored-By: drashna * Update docs/feature_audio.md Co-Authored-By: drashna --- docs/feature_audio.md | 7 +++++++ quantum/audio/audio_arm.c | 2 ++ 2 files changed, 9 insertions(+) diff --git a/docs/feature_audio.md b/docs/feature_audio.md index 82e0ed950..a39c45687 100644 --- a/docs/feature_audio.md +++ b/docs/feature_audio.md @@ -65,6 +65,13 @@ The available keycodes for audio are: * `AU_OFF` - Turn audio mode off * `AU_TOG` - Toggle audio mode +## ARM Audio Volume + +For ARM devices, you can adjust the DAC sample values. If your board is too loud for you or your coworkers, you can set the max using `DAC_SAMPLE_MAX` in your `config.h`: + +```c +#define DAC_SAMPLE_MAX 65535U +``` ## Music Mode diff --git a/quantum/audio/audio_arm.c b/quantum/audio/audio_arm.c index 18e8a8c66..989f7a64b 100644 --- a/quantum/audio/audio_arm.c +++ b/quantum/audio/audio_arm.c @@ -80,7 +80,9 @@ float startup_song[][2] = STARTUP_SONG; static void gpt_cb8(GPTDriver *gptp); #define DAC_BUFFER_SIZE 720 +#ifndef DAC_SAMPLE_MAX #define DAC_SAMPLE_MAX 65535U +#endif #define START_CHANNEL_1() gptStart(&GPTD6, &gpt6cfg1); \ gptStartContinuous(&GPTD6, 2U) From ac4fd5e99e81a09a481066f61211f598c7b218a0 Mon Sep 17 00:00:00 2001 From: Luciano Malavasi Date: Mon, 3 Dec 2018 20:45:41 -0800 Subject: [PATCH 604/788] Keymap: Fixed include statement in my Let's Split keymap. (#4543) * keymap + alpha * some fixes * keymap + alpha * some fixes * drashna changes * linked main Alpha repo in keyboards/alpha readme * missed a spot * there's another function called FUNC lol * keymap + alpha * some fixes * keymap + alpha * drashna changes * Fixed include * Revert "Fixed include" This reverts commit ea92f261f86d8433eab313cde498adca1682a006. * messed up my git, fixed include --- keyboards/lets_split/keymaps/pyrol/keymap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/lets_split/keymaps/pyrol/keymap.c b/keyboards/lets_split/keymaps/pyrol/keymap.c index 23d779232..c5227f5af 100644 --- a/keyboards/lets_split/keymaps/pyrol/keymap.c +++ b/keyboards/lets_split/keymaps/pyrol/keymap.c @@ -1,4 +1,4 @@ -#include QMK_KEYBOARD_h +#include QMK_KEYBOARD_H extern keymap_config_t keymap_config; From 4bb28d2df092408a7a0e32a8d8ab47b7f4008fcd Mon Sep 17 00:00:00 2001 From: VM Date: Tue, 4 Dec 2018 00:10:28 -0500 Subject: [PATCH 605/788] Keymap: adding my keymap primarily to iris (#4541) --- keyboards/iris/keymaps/omgvee/config.h | 49 +++++++ keyboards/iris/keymaps/omgvee/keymap.c | 173 ++++++++++++++++++++++++ keyboards/iris/keymaps/omgvee/readme.md | 17 +++ keyboards/iris/keymaps/omgvee/rules.mk | 7 + 4 files changed, 246 insertions(+) create mode 100644 keyboards/iris/keymaps/omgvee/config.h create mode 100644 keyboards/iris/keymaps/omgvee/keymap.c create mode 100644 keyboards/iris/keymaps/omgvee/readme.md create mode 100644 keyboards/iris/keymaps/omgvee/rules.mk diff --git a/keyboards/iris/keymaps/omgvee/config.h b/keyboards/iris/keymaps/omgvee/config.h new file mode 100644 index 000000000..c29201fe1 --- /dev/null +++ b/keyboards/iris/keymaps/omgvee/config.h @@ -0,0 +1,49 @@ +/* +Copyright 2017 Danny Nguyen + +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 . +*/ + +#pragma once + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + +#undef RGBLED_NUM +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 15 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 + +//tap dance shenanigans +#define TAPPING_TERM 200 + +//force n-key rollover to be enabled every boot +#define FORCE_NKRO + +//some mouse keys tweaking, as it is generally too slow by default +#define MOUSEKEY_INTERVAL 20 +#define MOUSEKEY_DELAY 0 +#define MOUSEKEY_TIME_TO_MAX 60 +#define MOUSEKEY_MAX_SPEED 7 +#define MOUSEKEY_WHEEL_DELAY 0 \ No newline at end of file diff --git a/keyboards/iris/keymaps/omgvee/keymap.c b/keyboards/iris/keymaps/omgvee/keymap.c new file mode 100644 index 000000000..da76b593b --- /dev/null +++ b/keyboards/iris/keymaps/omgvee/keymap.c @@ -0,0 +1,173 @@ +#include QMK_KEYBOARD_H +#include + +extern keymap_config_t keymap_config; + +#define _QWERTY 0 +#define _LOWER 1 +#define _RAISE 2 +#define _MOUSE 3 +#define _ADJUST 4 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + LOWER, + RAISE, + MOUSE, + ADJUST, +}; + +#define KC_MOUS TT(_MOUSE) // double tab toggle mouse layer +#define MS_L KC_MS_LEFT +#define MS_R KC_MS_RIGHT +#define MS_U KC_MS_UP +#define MS_D KC_MS_DOWN +#define MS_B1 KC_MS_BTN1 +#define MS_B2 KC_MS_BTN2 +#define MW_U KC_MS_WH_UP +#define MW_D KC_MS_WH_DOWN +#define MW_L KC_MS_WH_LEFT +#define MW_R KC_MS_WH_RIGHT + +//Tap Dance Declarations +enum { + TD_SCL = 0 +}; +//Tap Dance Definitions +qk_tap_dance_action_t tap_dance_actions[] = { + //Tap once for Shift, twice for Caps Lock + [TD_SCL] = ACTION_TAP_DANCE_DOUBLE(KC_LSFT, KC_CAPS) +}; +enum { + TD_EBT = 0 +}; + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_QWERTY] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + TD(TD_SCL), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_LCTL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_MOUS, KC_MOUS, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + KC_LALT, LOWER, KC_ENT, KC_SPC, RAISE, KC_LGUI + // └────────┴────────┴────────┘ └────────┴────────┴────────┘ + ), + + [_LOWER] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_GRV, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_MINS, KC_EQL, KC_BSPC, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + _______, _______, KC_UP, _______, _______, _______, _______, _______, _______, KC_LBRC, KC_RBRC, KC_PIPE, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT,_______, KC_ENT, + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_LCTL, _______, _______, _______, KC_LCBR, KC_LBRC, KC_LPRN, KC_RPRN, KC_RBRC, KC_RCBR, _______, _______, _______, _______, + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + _______, _______, KC_DEL, KC_DEL, _______, _______ + // └────────┴────────┴────────┘ └────────┴────────┴────────┘ + ), + + [_RAISE] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_TILD, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + RGB_TOG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + RGB_MOD, KC_MPRV, KC_MNXT, _______, KC_PGUP, KC_UNDS, KC_EQL, KC_HOME, RGB_HUI, RGB_SAI, RGB_VAI, KC_ENT, + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______, KC_MSTP, KC_MPLY, _______, KC_PGDN, KC_MINS, KC_LPRN, KC_RPRN, KC_PLUS, KC_END, RGB_HUD, RGB_SAD, RGB_VAD, _______, + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + _______, _______, _______, _______, _______, _______ + // └────────┴────────┴────────┘ └────────┴────────┴────────┘ + ), + + [_MOUSE] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + BL_BRTG, _______, _______, _______, _______, RESET, _______, _______, _______, _______, _______, RESET, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + BL_TOGG, MS_B1, MS_U, MS_B2, MW_U, _______, _______, MS_B1, MS_B2, _______, _______, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + _______, MS_L, MS_D, MS_R, MW_D, _______, MS_L, MS_D , MS_U, MS_R ,_______, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + BL_STEP, _______, _______, MW_L, MW_R, _______, _______, _______, KC_BRID, KC_BRIU, KC_VOLD, KC_VOLU, KC_MUTE, _______, + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + _______, _______, _______, _______, _______, _______ + // └────────┴────────┴────────┘ └────────┴────────┴────────┘ + ), + + [_ADJUST] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + _______, _______, _______, _______, _______, RESET, _______, _______, _______, _______, _______, RESET, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______, _______, _______, _______, _______, _______, _______, _______, KC_BRID, KC_BRIU, KC_VOLD, KC_VOLU, KC_MUTE, _______, + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + _______, _______, _______, _______, _______, _______ + // └────────┴────────┴────────┘ └────────┴────────┴────────┘ + ) +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + dprintf("Got on layer %s ", LOWER); + update_tri_layer(_LOWER, _RAISE, _MOUSE); + } else { + layer_off(_LOWER); + dprintf("Got off layer %s ", LOWER); + update_tri_layer(_LOWER, _RAISE, _MOUSE); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + dprintf("Got on layer %s ", RAISE); + update_tri_layer(_LOWER, _RAISE, _MOUSE); + } else { + layer_off(_RAISE); + dprintf("Got off layer %s ", RAISE); + update_tri_layer(_LOWER, _RAISE, _MOUSE); + } + return false; + break; + case MOUSE: + if (record->event.pressed) { + layer_on(_MOUSE); + dprintf("Got on layer %s ", MOUSE); + update_tri_layer(_LOWER, _RAISE, _MOUSE); + } else { + layer_off(_MOUSE); + dprintf("Got off layer %s ", MOUSE); + update_tri_layer(_LOWER, _RAISE, _MOUSE); + } + return false; + break; + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + break; + } + return true; +} diff --git a/keyboards/iris/keymaps/omgvee/readme.md b/keyboards/iris/keymaps/omgvee/readme.md new file mode 100644 index 000000000..bf9a5acb1 --- /dev/null +++ b/keyboards/iris/keymaps/omgvee/readme.md @@ -0,0 +1,17 @@ +# Reade.md for what I want from an Iris perfect layout +====================================================== + + +![My beloved IRIS keeb](https://i.imgur.com/wgsb37e.jpg) + +- mouse keys +- media keys and media controls +- in-switch LED intensity controls (+/-) +- underglow RGB hue/color controls +- underglow RGB intensity controls +- familiar key arrangement with Enter and symbols on the usual keys (to the right hand side) +- navigation keys should be the vim ones really, and same ones used for mouse; +- also have alternates on the same layer, in the form of AWSD, as well as HJKL (keep in mind the order is Left, Up, Down, Right) +- arrow keys on one layer, however with another modifier key, they become left=home, right=end, up=page up, down=page Down + +See keymap.c for layouts \ No newline at end of file diff --git a/keyboards/iris/keymaps/omgvee/rules.mk b/keyboards/iris/keymaps/omgvee/rules.mk new file mode 100644 index 000000000..281f64c7e --- /dev/null +++ b/keyboards/iris/keymaps/omgvee/rules.mk @@ -0,0 +1,7 @@ +RGBLIGHT_ENABLE = yes +BACKLIGHT_ENABLE = yes +MOUSEKEY_ENABLE = yes +CONSOLE_ENABLE = no +COMMAND_ENABLE = yes +TAP_DANCE_ENABLE = yes +NKRO_ENABLE = yes From 4099536c0e7a099b181a80e483b4b95f389b5a7e Mon Sep 17 00:00:00 2001 From: ishtob Date: Tue, 4 Dec 2018 11:04:57 -0500 Subject: [PATCH 606/788] adding Hadron v3 keyboard, QWIIC devices support, haptic feedback support (#4462) * add initial support for hadron ver3 * add initial support for hadron ver3 * pull qwiic support for micro_led to be modified for use in hadron's 64x24 ssd1306 oled display * initial work on OLED using qwiic driver * early work to get 128x32 oled working by redefining qwiic micro oled parameters. Currently working, but would affect qwiic's micro oled functionality * moved oled defines to config.h and added ifndef to micro_oled driver * WORKING :D - note, still work in progress to get the start location correct on the 128x32 display. * added equation to automatically calculate display offset based on screen width * adding time-out timer to oled display * changed read lock staus via read_led_state * lock indications fixes * Added scroll lock indication to oled * add support for DRV2605 haptic driver * Improve readabiity of DRV2605 driver. -added typedef for waveform library -added unions for registers * Update keyboards/hadron/ver2/keymaps/default/config.h Co-Authored-By: ishtob * Update keyboards/hadron/ver2/keymaps/default/config.h Co-Authored-By: ishtob * Update keyboards/hadron/ver2/keymaps/default/config.h Co-Authored-By: ishtob * Update keyboards/hadron/ver2/keymaps/default/config.h Co-Authored-By: ishtob * Fixes for PR * PR fixes * fix old persistent layer function to use new set_single_persistent_default_layer * fix issues with changing makefile defines that broken per-key haptic pulse * Comment fixes * Add definable parameter and auto-calibration based on motor choice --- common_features.mk | 9 + drivers/arm/i2c_master.c | 12 +- drivers/arm/i2c_master.h | 1 + drivers/haptic/DRV2605L.c | 129 ++ drivers/haptic/DRV2605L.h | 394 ++++++ drivers/qwiic/micro_oled.c | 691 ++++++++++ drivers/qwiic/micro_oled.h | 134 ++ drivers/qwiic/qwiic.c | 31 + drivers/qwiic/qwiic.h | 28 + drivers/qwiic/qwiic.mk | 18 + drivers/qwiic/util/font5x7.h | 288 ++++ drivers/qwiic/util/font8x16.h | 127 ++ keyboards/hadron/config.h | 10 +- keyboards/hadron/hadron.c | 24 - keyboards/hadron/hadron.h | 4 +- keyboards/hadron/keymaps/default/config.h | 20 - keyboards/hadron/keymaps/default/rules.mk | 24 - keyboards/hadron/keymaps/side_numpad/config.h | 20 - keyboards/hadron/readme.md | 4 +- keyboards/hadron/rules.mk | 73 - keyboards/hadron/ver2/config.h | 11 + .../hadron/ver2/keymaps/default/config.h | 9 + .../{ => ver2}/keymaps/default/keymap.c | 103 +- .../{ => ver2}/keymaps/default/readme.md | 0 keyboards/hadron/{ => ver2}/keymaps/readme.md | 0 .../hadron/ver2/keymaps/side_numpad/config.h | 8 + .../{ => ver2}/keymaps/side_numpad/keymap.c | 20 +- .../{ => ver2}/keymaps/side_numpad/readme.md | 0 .../{ => ver2}/keymaps/side_numpad/rules.mk | 0 keyboards/hadron/ver2/rules.mk | 77 +- keyboards/hadron/ver2/ver2.c | 27 +- .../ver3/boards/GENERIC_STM32_F303XC/board.c | 126 ++ .../ver3/boards/GENERIC_STM32_F303XC/board.h | 1187 +++++++++++++++++ .../ver3/boards/GENERIC_STM32_F303XC/board.mk | 5 + keyboards/hadron/ver3/bootloader_defs.h | 7 + keyboards/hadron/ver3/chconf.h | 520 ++++++++ keyboards/hadron/ver3/config.h | 192 +++ keyboards/hadron/ver3/halconf.h | 388 ++++++ .../hadron/ver3/keymaps/default/config.h | 1 + .../hadron/ver3/keymaps/default/keymap.c | 295 ++++ .../hadron/ver3/keymaps/default/readme.md | 2 + keyboards/hadron/ver3/keymaps/readme.md | 23 + keyboards/hadron/ver3/matrix.c | 195 +++ keyboards/hadron/ver3/mcuconf.h | 257 ++++ keyboards/hadron/ver3/rev3.h | 21 + keyboards/hadron/ver3/rules.mk | 57 + keyboards/hadron/ver3/ver3.c | 196 +++ keyboards/hadron/ver3/ver3.h | 21 + .../helix/rev1/keymaps/OLED_sample/rules.mk | 25 - tmk_core/common/action_layer.h | 8 +- tmk_core/common/keyboard.c | 10 + 51 files changed, 5534 insertions(+), 298 deletions(-) create mode 100644 drivers/haptic/DRV2605L.c create mode 100644 drivers/haptic/DRV2605L.h create mode 100644 drivers/qwiic/micro_oled.c create mode 100644 drivers/qwiic/micro_oled.h create mode 100644 drivers/qwiic/qwiic.c create mode 100644 drivers/qwiic/qwiic.h create mode 100644 drivers/qwiic/qwiic.mk create mode 100644 drivers/qwiic/util/font5x7.h create mode 100644 drivers/qwiic/util/font8x16.h delete mode 100644 keyboards/hadron/keymaps/default/config.h delete mode 100644 keyboards/hadron/keymaps/default/rules.mk delete mode 100644 keyboards/hadron/keymaps/side_numpad/config.h create mode 100644 keyboards/hadron/ver2/keymaps/default/config.h rename keyboards/hadron/{ => ver2}/keymaps/default/keymap.c (95%) rename keyboards/hadron/{ => ver2}/keymaps/default/readme.md (100%) rename keyboards/hadron/{ => ver2}/keymaps/readme.md (100%) create mode 100644 keyboards/hadron/ver2/keymaps/side_numpad/config.h rename keyboards/hadron/{ => ver2}/keymaps/side_numpad/keymap.c (97%) rename keyboards/hadron/{ => ver2}/keymaps/side_numpad/readme.md (100%) rename keyboards/hadron/{ => ver2}/keymaps/side_numpad/rules.mk (100%) create mode 100644 keyboards/hadron/ver3/boards/GENERIC_STM32_F303XC/board.c create mode 100644 keyboards/hadron/ver3/boards/GENERIC_STM32_F303XC/board.h create mode 100644 keyboards/hadron/ver3/boards/GENERIC_STM32_F303XC/board.mk create mode 100644 keyboards/hadron/ver3/bootloader_defs.h create mode 100644 keyboards/hadron/ver3/chconf.h create mode 100644 keyboards/hadron/ver3/config.h create mode 100644 keyboards/hadron/ver3/halconf.h create mode 100644 keyboards/hadron/ver3/keymaps/default/config.h create mode 100644 keyboards/hadron/ver3/keymaps/default/keymap.c create mode 100644 keyboards/hadron/ver3/keymaps/default/readme.md create mode 100644 keyboards/hadron/ver3/keymaps/readme.md create mode 100644 keyboards/hadron/ver3/matrix.c create mode 100644 keyboards/hadron/ver3/mcuconf.h create mode 100644 keyboards/hadron/ver3/rev3.h create mode 100644 keyboards/hadron/ver3/rules.mk create mode 100644 keyboards/hadron/ver3/ver3.c create mode 100644 keyboards/hadron/ver3/ver3.h delete mode 100644 keyboards/helix/rev1/keymaps/OLED_sample/rules.mk diff --git a/common_features.mk b/common_features.mk index 8f53a82aa..bd88e04d6 100644 --- a/common_features.mk +++ b/common_features.mk @@ -225,6 +225,13 @@ ifeq ($(strip $(ENCODER_ENABLE)), yes) OPT_DEFS += -DENCODER_ENABLE endif +ifeq ($(strip $(HAPTIC_ENABLE)), DRV2605L) + COMMON_VPATH += $(DRIVER_PATH)/haptic + SRC += DRV2605L.c + SRC += i2c_master.c + OPT_DEFS += -DDRV2605L +endif + ifeq ($(strip $(HD44780_ENABLE)), yes) SRC += drivers/avr/hd44780.c OPT_DEFS += -DHD44780_ENABLE @@ -240,6 +247,8 @@ ifeq ($(strip $(LEADER_ENABLE)), yes) OPT_DEFS += -DLEADER_ENABLE endif +include $(DRIVER_PATH)/qwiic/qwiic.mk + QUANTUM_SRC:= \ $(QUANTUM_DIR)/quantum.c \ $(QUANTUM_DIR)/keymap_common.c \ diff --git a/drivers/arm/i2c_master.c b/drivers/arm/i2c_master.c index de5843839..ab962ea95 100644 --- a/drivers/arm/i2c_master.c +++ b/drivers/arm/i2c_master.c @@ -32,7 +32,7 @@ static uint8_t i2c_address; -// This configures the I2C clock to 400Mhz assuming a 72Mhz clock +// This configures the I2C clock to 400khz assuming a 72Mhz clock // For more info : https://www.st.com/en/embedded-software/stsw-stm32126.html static const I2CConfig i2cconfig = { STM32_TIMINGR_PRESC(15U) | @@ -45,10 +45,14 @@ static const I2CConfig i2cconfig = { __attribute__ ((weak)) void i2c_init(void) { - setPinInput(B6); // Try releasing special pins for a short time - setPinInput(B7); - chThdSleepMilliseconds(10); + //palSetGroupMode(GPIOB, GPIOB_PIN6 | GPIOB_PIN7, 0, PAL_MODE_INPUT); + // Try releasing special pins for a short time + palSetPadMode(GPIOB, 6, PAL_MODE_INPUT); + palSetPadMode(GPIOB, 7, PAL_MODE_INPUT); + + chThdSleepMilliseconds(10); + palSetPadMode(GPIOB, 6, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUPDR_PULLUP); palSetPadMode(GPIOB, 7, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUPDR_PULLUP); diff --git a/drivers/arm/i2c_master.h b/drivers/arm/i2c_master.h index 591fa7f77..392760328 100644 --- a/drivers/arm/i2c_master.h +++ b/drivers/arm/i2c_master.h @@ -34,6 +34,7 @@ void i2c_init(void); uint8_t i2c_start(uint8_t address); uint8_t i2c_transmit(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout); uint8_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout); +uint8_t i2c_transmit_receive(uint8_t address, uint8_t * tx_body, uint16_t tx_length, uint8_t * rx_body, uint16_t rx_length); uint8_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout); uint8_t i2c_readReg(uint8_t devaddr, uint8_t* regaddr, uint8_t* data, uint16_t length, uint16_t timeout); uint8_t i2c_stop(uint16_t timeout); diff --git a/drivers/haptic/DRV2605L.c b/drivers/haptic/DRV2605L.c new file mode 100644 index 000000000..97ca292b9 --- /dev/null +++ b/drivers/haptic/DRV2605L.c @@ -0,0 +1,129 @@ +/* Copyright 2018 ishtob + * Driver for DRV2605L written for 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 . + */ +#include "DRV2605L.h" +#include "print.h" +#include +#include +#include + + +uint8_t DRV2605L_transfer_buffer[20]; +uint8_t DRV2605L_tx_register[0]; +uint8_t DRV2605L_read_buffer[0]; +uint8_t DRV2605L_read_register; + + +void DRV_write(uint8_t drv_register, uint8_t settings) { + DRV2605L_transfer_buffer[0] = drv_register; + DRV2605L_transfer_buffer[1] = settings; + i2c_transmit(DRV2605L_BASE_ADDRESS << 1, DRV2605L_transfer_buffer, 2, 100); +} + +uint8_t DRV_read(uint8_t regaddress) { + DRV2605L_tx_register[0] = regaddress; + if (MSG_OK != i2c_transmit_receive(DRV2605L_BASE_ADDRESS << 1, + DRV2605L_tx_register, 1, + DRV2605L_read_buffer, 1 +)){ + printf("err reading reg \n"); + } + DRV2605L_read_register = (uint8_t)DRV2605L_read_buffer[0]; +return DRV2605L_read_register; +} + +void DRV_init(void) +{ + i2c_init(); + i2c_start(DRV2605L_BASE_ADDRESS); + + /* 0x07 sets DRV2605 into calibration mode */ + DRV_write(DRV_MODE,0x07); + +// DRV_write(DRV_FEEDBACK_CTRL,0xB6); + + #if FB_ERM_LRA == 0 + /* ERM settings */ + DRV_write(DRV_RATED_VOLT, (RATED_VOLTAGE/21.33)*1000); + #if ERM_OPEN_LOOP == 0 + DRV_write(DRV_OVERDRIVE_CLAMP_VOLT, (((V_PEAK*(DRIVE_TIME+BLANKING_TIME+IDISS_TIME))/0.02133)/(DRIVE_TIME-0.0003))); + #elif ERM_OPEN_LOOP == 1 + DRV_write(DRV_OVERDRIVE_CLAMP_VOLT, (V_PEAK/0.02196)); + #endif + #elif FB_ERM_LRA == 1 + DRV_write(DRV_RATED_VOLT, ((V_RMS * sqrt(1 - ((4 * ((150+(SAMPLE_TIME*50))*0.000001)) + 0.0003)* F_LRA)/0.02071))); + #if LRA_OPEN_LOOP == 0 + DRV_write(DRV_OVERDRIVE_CLAMP_VOLT, ((V_PEAK/sqrt(1-(F_LRA*0.0008))/0.02133))); + #elif LRA_OPEN_LOOP == 1 + DRV_write(DRV_OVERDRIVE_CLAMP_VOLT, (V_PEAK/0.02196)); + #endif + #endif + + DRVREG_FBR FB_SET; + FB_SET.Bits.ERM_LRA = FB_ERM_LRA; + FB_SET.Bits.BRAKE_FACTOR = FB_BRAKEFACTOR; + FB_SET.Bits.LOOP_GAIN =FB_LOOPGAIN; + FB_SET.Bits.BEMF_GAIN = 0; /* auto-calibration populates this field*/ + DRV_write(DRV_FEEDBACK_CTRL, (uint8_t) FB_SET.Byte); + DRVREG_CTRL1 C1_SET; + C1_SET.Bits.C1_DRIVE_TIME = DRIVE_TIME; + C1_SET.Bits.C1_AC_COUPLE = AC_COUPLE; + C1_SET.Bits.C1_STARTUP_BOOST = STARTUP_BOOST; + DRV_write(DRV_CTRL_1, (uint8_t) C1_SET.Byte); + DRVREG_CTRL2 C2_SET; + C2_SET.Bits.C2_BIDIR_INPUT = BIDIR_INPUT; + C2_SET.Bits.C2_BRAKE_STAB = BRAKE_STAB; + C2_SET.Bits.C2_SAMPLE_TIME = SAMPLE_TIME; + C2_SET.Bits.C2_BLANKING_TIME = BLANKING_TIME; + C2_SET.Bits.C2_IDISS_TIME = IDISS_TIME; + DRV_write(DRV_CTRL_2, (uint8_t) C2_SET.Byte); + DRVREG_CTRL3 C3_SET; + C3_SET.Bits.C3_LRA_OPEN_LOOP = LRA_OPEN_LOOP; + C3_SET.Bits.C3_N_PWM_ANALOG = N_PWM_ANALOG; + C3_SET.Bits.C3_LRA_DRIVE_MODE = LRA_DRIVE_MODE; + C3_SET.Bits.C3_DATA_FORMAT_RTO = DATA_FORMAT_RTO; + C3_SET.Bits.C3_SUPPLY_COMP_DIS = SUPPLY_COMP_DIS; + C3_SET.Bits.C3_ERM_OPEN_LOOP = ERM_OPEN_LOOP; + C3_SET.Bits.C3_NG_THRESH = NG_THRESH; + DRV_write(DRV_CTRL_3, (uint8_t) C3_SET.Byte); + DRVREG_CTRL4 C4_SET; + C4_SET.Bits.C4_ZC_DET_TIME = ZC_DET_TIME; + C4_SET.Bits.C4_AUTO_CAL_TIME = AUTO_CAL_TIME; + DRV_write(DRV_CTRL_4, (uint8_t) C4_SET.Byte); + DRV_write(DRV_LIB_SELECTION,LIB_SELECTION); + //start autocalibration + DRV_write(DRV_GO, 0x01); + + /* 0x00 sets DRV2605 out of standby and to use internal trigger + * 0x01 sets DRV2605 out of standby and to use external trigger */ + DRV_write(DRV_MODE,0x00); + + /* 0x06: LRA library */ + DRV_write(DRV_WAVEFORM_SEQ_1, 0x01); + + /* 0xB9: LRA, 4x brake factor, medium gain, 7.5x back EMF + * 0x39: ERM, 4x brake factor, medium gain, 1.365x back EMF */ + + /* TODO: setup auto-calibration as part of initiation */ + +} + +void DRV_pulse(uint8_t sequence) +{ + DRV_write(DRV_GO, 0x00); + DRV_write(DRV_WAVEFORM_SEQ_1, sequence); + DRV_write(DRV_GO, 0x01); +} \ No newline at end of file diff --git a/drivers/haptic/DRV2605L.h b/drivers/haptic/DRV2605L.h new file mode 100644 index 000000000..de9d294e9 --- /dev/null +++ b/drivers/haptic/DRV2605L.h @@ -0,0 +1,394 @@ +/* Copyright 2018 ishtob + * Driver for DRV2605L written for 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 . + */ + +#pragma once +#include "i2c_master.h" + +/* Initialization settings + + * Feedback Control Settings */ +#ifndef FB_ERM_LRA +#define FB_ERM_LRA 1 /* For ERM:0 or LRA:1*/ +#endif +#ifndef FB_BRAKEFACTOR +#define FB_BRAKEFACTOR 3 /* For 1x:0, 2x:1, 3x:2, 4x:3, 6x:4, 8x:5, 16x:6, Disable Braking:7 */ +#endif +#ifndef FB_LOOPGAIN +#define FB_LOOPGAIN 1 /* For Low:0, Medium:1, High:2, Very High:3 */ +#endif + +#ifndef RATED_VOLTAGE +#define RATED_VOLTAGE 2 /* 2v as safe range in case device voltage is not set */ +#ifndef V_PEAK +#define V_PEAK 2.8 +#endif +#endif + +/* LRA specific settings */ +#if FB_ERM_LRA == 1 +#ifndef V_RMS +#define V_RMS 2.0 +#endif +#ifndef V_PEAK +#define V_PEAK 2.1 +#endif +#ifndef F_LRA +#define F_LRA 205 +#endif +#endif + +/* Library Selection */ +#ifndef LIB_SELECTION +#if FB_ERM_LRA == 1 +#define LIB_SELECTION 6 /* For Empty:0' TS2200 library A to D:1-5, LRA Library: 6 */ +#else +#define LIB_SELECTION 1 +#endif +#endif + +/* Control 1 register settings */ +#ifndef DRIVE_TIME +#define DRIVE_TIME 25 +#endif +#ifndef AC_COUPLE +#define AC_COUPLE 0 +#endif +#ifndef STARTUP_BOOST +#define STARTUP_BOOST 1 +#endif + +/* Control 2 Settings */ +#ifndef BIDIR_INPUT +#define BIDIR_INPUT 1 +#endif +#ifndef BRAKE_STAB +#define BRAKE_STAB 1 /* Loopgain is reduced when braking is almost complete to improve stability */ +#endif +#ifndef SAMPLE_TIME +#define SAMPLE_TIME 3 +#endif +#ifndef BLANKING_TIME +#define BLANKING_TIME 1 +#endif +#ifndef IDISS_TIME +#define IDISS_TIME 1 +#endif + +/* Control 3 settings */ +#ifndef NG_THRESH +#define NG_THRESH 2 +#endif +#ifndef ERM_OPEN_LOOP +#define ERM_OPEN_LOOP 1 +#endif +#ifndef SUPPLY_COMP_DIS +#define SUPPLY_COMP_DIS 0 +#endif +#ifndef DATA_FORMAT_RTO +#define DATA_FORMAT_RTO 0 +#endif +#ifndef LRA_DRIVE_MODE +#define LRA_DRIVE_MODE 0 +#endif +#ifndef N_PWM_ANALOG +#define N_PWM_ANALOG 0 +#endif +#ifndef LRA_OPEN_LOOP +#define LRA_OPEN_LOOP 0 +#endif + +/* Control 4 settings */ +#ifndef ZC_DET_TIME +#define ZC_DET_TIME 0 +#endif +#ifndef AUTO_CAL_TIME +#define AUTO_CAL_TIME 3 +#endif + +/* register defines -------------------------------------------------------- */ +#define DRV2605L_BASE_ADDRESS 0x5A /* DRV2605L Base address */ +#define DRV_STATUS 0x00 +#define DRV_MODE 0x01 +#define DRV_RTP_INPUT 0x02 +#define DRV_LIB_SELECTION 0x03 +#define DRV_WAVEFORM_SEQ_1 0x04 +#define DRV_WAVEFORM_SEQ_2 0x05 +#define DRV_WAVEFORM_SEQ_3 0x06 +#define DRV_WAVEFORM_SEQ_4 0x07 +#define DRV_WAVEFORM_SEQ_5 0x08 +#define DRV_WAVEFORM_SEQ_6 0x09 +#define DRV_WAVEFORM_SEQ_7 0x0A +#define DRV_WAVEFORM_SEQ_8 0x0B +#define DRV_GO 0x0C +#define DRV_OVERDRIVE_TIME_OFFSET 0x0D +#define DRV_SUSTAIN_TIME_OFFSET_P 0x0E +#define DRV_SUSTAIN_TIME_OFFSET_N 0x0F +#define DRV_BRAKE_TIME_OFFSET 0x10 +#define DRV_AUDIO_2_VIBE_CTRL 0x11 +#define DRV_AUDIO_2_VIBE_MIN_IN 0x12 +#define DRV_AUDIO_2_VIBE_MAX_IN 0x13 +#define DRV_AUDIO_2_VIBE_MIN_OUTDRV 0x14 +#define DRV_AUDIO_2_VIBE_MAX_OUTDRV 0x15 +#define DRV_RATED_VOLT 0x16 +#define DRV_OVERDRIVE_CLAMP_VOLT 0x17 +#define DRV_AUTO_CALIB_COMP_RESULT 0x18 +#define DRV_AUTO_CALIB_BEMF_RESULT 0x19 +#define DRV_FEEDBACK_CTRL 0x1A +#define DRV_CTRL_1 0x1B +#define DRV_CTRL_2 0x1C +#define DRV_CTRL_3 0x1D +#define DRV_CTRL_4 0x1E +#define DRV_CTRL_5 0x1F +#define DRV_OPEN_LOOP_PERIOD 0x20 +#define DRV_VBAT_VOLT_MONITOR 0x21 +#define DRV_LRA_RESONANCE_PERIOD 0x22 + +void DRV_init(void); +void DRV_write(const uint8_t drv_register, const uint8_t settings); +uint8_t DRV_read(const uint8_t regaddress); +void DRV_pulse(const uint8_t sequence); + + +typedef enum DRV_EFFECT{ + clear_sequence = 0, + strong_click = 1, + strong_click_60 = 2, + strong_click_30 = 3, + sharp_click = 4, + sharp_click_60 = 5, + sharp_click_30 = 6, + soft_bump = 7, + soft_bump_60 = 8, + soft_bump_30 = 9, + dbl_click = 10, + dbl_click_60 = 11, + trp_click = 12, + soft_fuzz = 13, + strong_buzz = 14, + alert_750ms = 15, + alert_1000ms = 16, + strong_click1 = 17, + strong_click2_80 = 18, + strong_click3_60 = 19, + strong_click4_30 = 20, + medium_click1 = 21, + medium_click2_80 = 22, + medium_click3_60 = 23, + sharp_tick1 = 24, + sharp_tick2_80 = 25, + sharp_tick3_60 = 26, + sh_dblclick_str = 27, + sh_dblclick_str_80 = 28, + sh_dblclick_str_60 = 29, + sh_dblclick_str_30 = 30, + sh_dblclick_med = 31, + sh_dblclick_med_80 = 32, + sh_dblclick_med_60 = 33, + sh_dblsharp_tick = 34, + sh_dblsharp_tick_80 = 35, + sh_dblsharp_tick_60 = 36, + lg_dblclick_str = 37, + lg_dblclick_str_80 = 38, + lg_dblclick_str_60 = 39, + lg_dblclick_str_30 = 40, + lg_dblclick_med = 41, + lg_dblclick_med_80 = 42, + lg_dblclick_med_60 = 43, + lg_dblsharp_tick = 44, + lg_dblsharp_tick_80 = 45, + lg_dblsharp_tick_60 = 46, + buzz = 47, + buzz_80 = 48, + buzz_60 = 49, + buzz_40 = 50, + buzz_20 = 51, + pulsing_strong = 52, + pulsing_strong_80 = 53, + pulsing_medium = 54, + pulsing_medium_80 = 55, + pulsing_sharp = 56, + pulsing_sharp_80 = 57, + transition_click = 58, + transition_click_80 = 59, + transition_click_60 = 60, + transition_click_40 = 61, + transition_click_20 = 62, + transition_click_10 = 63, + transition_hum = 64, + transition_hum_80 = 65, + transition_hum_60 = 66, + transition_hum_40 = 67, + transition_hum_20 = 68, + transition_hum_10 = 69, + transition_rampdown_long_smooth1 = 70, + transition_rampdown_long_smooth2 = 71, + transition_rampdown_med_smooth1 = 72, + transition_rampdown_med_smooth2 = 73, + transition_rampdown_short_smooth1 = 74, + transition_rampdown_short_smooth2 = 75, + transition_rampdown_long_sharp1 = 76, + transition_rampdown_long_sharp2 = 77, + transition_rampdown_med_sharp1 = 78, + transition_rampdown_med_sharp2 = 79, + transition_rampdown_short_sharp1 = 80, + transition_rampdown_short_sharp2 = 81, + transition_rampup_long_smooth1 = 82, + transition_rampup_long_smooth2 = 83, + transition_rampup_med_smooth1 = 84, + transition_rampup_med_smooth2 = 85, + transition_rampup_short_smooth1 = 86, + transition_rampup_short_smooth2 = 87, + transition_rampup_long_sharp1 = 88, + transition_rampup_long_sharp2 = 89, + transition_rampup_med_sharp1 = 90, + transition_rampup_med_sharp2 = 91, + transition_rampup_short_sharp1 = 92, + transition_rampup_short_sharp2 = 93, + transition_rampdown_long_smooth1_50 = 94, + transition_rampdown_long_smooth2_50 = 95, + transition_rampdown_med_smooth1_50 = 96, + transition_rampdown_med_smooth2_50 = 97, + transition_rampdown_short_smooth1_50 = 98, + transition_rampdown_short_smooth2_50 = 99, + transition_rampdown_long_sharp1_50 = 100, + transition_rampdown_long_sharp2_50 = 101, + transition_rampdown_med_sharp1_50 = 102, + transition_rampdown_med_sharp2_50 = 103, + transition_rampdown_short_sharp1_50 = 104, + transition_rampdown_short_sharp2_50 = 105, + transition_rampup_long_smooth1_50 = 106, + transition_rampup_long_smooth2_50 = 107, + transition_rampup_med_smooth1_50 = 108, + transition_rampup_med_smooth2_50 = 109, + transition_rampup_short_smooth1_50 = 110, + transition_rampup_short_smooth2_50 = 111, + transition_rampup_long_sharp1_50 = 112, + transition_rampup_long_sharp2_50 = 113, + transition_rampup_med_sharp1_50 = 114, + transition_rampup_med_sharp2_50 = 115, + transition_rampup_short_sharp1_50 = 116, + transition_rampup_short_sharp2_50 = 117, + long_buzz_for_programmatic_stopping = 118, + smooth_hum1_50 = 119, + smooth_hum2_40 = 120, + smooth_hum3_30 = 121, + smooth_hum4_20 = 122, + smooth_hum5_10 = 123, +} DRV_EFFECT; + +/* Register bit array unions */ + +typedef union DRVREG_STATUS { /* register 0x00 */ + uint8_t Byte; + struct { + uint8_t OC_DETECT :1; /* set to 1 when overcurrent event is detected */ + uint8_t OVER_TEMP :1; /* set to 1 when device exceeds temp threshold */ + uint8_t FB_STS :1; /* set to 1 when feedback controller has timed out */ + /* auto-calibration routine and diagnostic result + * result | auto-calibation | diagnostic | + * 0 | passed | actuator func normal | + * 1 | failed | actuator func fault* | + * * actuator is not present or is shorted, timing out, or giving out–of-range back-EMF */ + uint8_t DIAG_RESULT :1; + uint8_t :1; + uint8_t DEVICE_ID :3; /* Device IDs 3: DRV2605 4: DRV2604 5: DRV2604L 6: DRV2605L */ + } Bits; +} DRVREG_STATUS; + +typedef union DRVREG_MODE { /* register 0x01 */ + uint8_t Byte; + struct { + uint8_t MODE :3; /* Mode setting */ + uint8_t :3; + uint8_t STANDBY :1; /* 0:standby 1:ready */ + } Bits; +} DRVREG_MODE; + +typedef union DRVREG_WAIT { + uint8_t Byte; + struct { + uint8_t WAIT_MODE :1; /* Set to 1 to interpret as wait for next 7 bits x10ms */ + uint8_t WAIT_TIME :7; + } Bits; +} DRVREG_WAIT; + +typedef union DRVREG_FBR{ /* register 0x1A */ + uint8_t Byte; + struct { + uint8_t BEMF_GAIN :2; + uint8_t LOOP_GAIN :2; + uint8_t BRAKE_FACTOR :3; + uint8_t ERM_LRA :1; + } Bits; +} DRVREG_FBR; + +typedef union DRVREG_CTRL1{ /* register 0x1B */ + uint8_t Byte; + struct { + uint8_t C1_DRIVE_TIME :5; + uint8_t C1_AC_COUPLE :1; + uint8_t :1; + uint8_t C1_STARTUP_BOOST :1; + } Bits; +} DRVREG_CTRL1; + +typedef union DRVREG_CTRL2{ /* register 0x1C */ + uint8_t Byte; + struct { + uint8_t C2_IDISS_TIME :2; + uint8_t C2_BLANKING_TIME :2; + uint8_t C2_SAMPLE_TIME :2; + uint8_t C2_BRAKE_STAB :1; + uint8_t C2_BIDIR_INPUT :1; + } Bits; +} DRVREG_CTRL2; + +typedef union DRVREG_CTRL3{ /* register 0x1D */ + uint8_t Byte; + struct { + uint8_t C3_LRA_OPEN_LOOP :1; + uint8_t C3_N_PWM_ANALOG :1; + uint8_t C3_LRA_DRIVE_MODE :1; + uint8_t C3_DATA_FORMAT_RTO :1; + uint8_t C3_SUPPLY_COMP_DIS :1; + uint8_t C3_ERM_OPEN_LOOP :1; + uint8_t C3_NG_THRESH :2; + } Bits; +} DRVREG_CTRL3; + +typedef union DRVREG_CTRL4{ /* register 0x1E */ + uint8_t Byte; + struct { + uint8_t C4_OTP_PROGRAM :1; + uint8_t :1; + uint8_t C4_OTP_STATUS :1; + uint8_t :1; + uint8_t C4_AUTO_CAL_TIME :2; + uint8_t C4_ZC_DET_TIME :2; + } Bits; +} DRVREG_CTRL4; + +typedef union DRVREG_CTRL5{ /* register 0x1F */ + uint8_t Byte; + struct { + uint8_t C5_IDISS_TIME :2; + uint8_t C5_BLANKING_TIME :2; + uint8_t C5_PLAYBACK_INTERVAL :1; + uint8_t C5_LRA_AUTO_OPEN_LOOP :1; + uint8_t C5_AUTO_OL_CNT :2; + } Bits; +} DRVREG_CTRL5; \ No newline at end of file diff --git a/drivers/qwiic/micro_oled.c b/drivers/qwiic/micro_oled.c new file mode 100644 index 000000000..35c5d6ee1 --- /dev/null +++ b/drivers/qwiic/micro_oled.c @@ -0,0 +1,691 @@ +/* Jim Lindblom @ SparkFun Electronics + * October 26, 2014 + * https://github.com/sparkfun/Micro_OLED_Breakout/tree/master/Firmware/Arduino/libraries/SFE_MicroOLED + * + * Modified by: + * Emil Varughese @ Edwin Robotics Pvt. Ltd. + * July 27, 2015 + * https://github.com/emil01/SparkFun_Micro_OLED_Arduino_Library/ + * + * This code was heavily based around the MicroView library, written by GeekAmmo + * (https://github.com/geekammo/MicroView-Arduino-Library). + * + * Adapted for QMK by: + * Jack Humbert + * October 11, 2018 + * + * 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 3 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 . + */ +#include "micro_oled.h" +#include +#include "util/font5x7.h" +#include "util/font8x16.h" +#include "string.h" + +#define TOTALFONTS 2 +const unsigned char * fonts_pointer[]= { font5x7, font8x16 }; + +uint8_t foreColor,drawMode,fontWidth, fontHeight, fontType, fontStartChar, fontTotalChar, cursorX, cursorY; +uint16_t fontMapWidth; + +#define _BV(x) (1 << (x)) +#define swap(a, b) { uint8_t t = a; a = b; b = t; } + +uint8_t micro_oled_transfer_buffer[20]; +static uint8_t micro_oled_screen_current[LCDWIDTH*LCDWIDTH/8] = { 0 }; + +/* LCD Memory organised in 64 horizontal pixel and 6 rows of byte + B B .............B ----- + y y .............y \ + t t .............t \ + e e .............e \ + 0 1 .............63 \ + \ + D0 D0.............D0 \ + D1 D1.............D1 / ROW 0 + D2 D2.............D2 / + D3 D3.............D3 / + D4 D4.............D4 / + D5 D5.............D5 / + D6 D6.............D6 / + D7 D7.............D7 ---- + */ + +#if LCDWIDTH == 64 + #if LCDWIDTH == 48 +static uint8_t micro_oled_screen_buffer[] = { +// QMK Logo - generated at http://www.majer.ch/lcd/adf_bitmap.php +//64x48 image +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x00, +0x00, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x00, +0x00, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, +0xF8, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0x1F, 0x1F, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x1F, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x1F, 0xFF, 0xFF, 0xFF, 0xFE, +0xFE, 0xF8, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x8C, 0x8C, 0x8C, 0x8C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x8C, 0x8C, 0x8C, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x31, 0x31, 0x31, 0x31, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF8, 0xF1, 0xE3, 0xE7, 0xCF, +0xCF, 0xCF, 0xCF, 0x00, 0x00, 0xCF, 0xCF, 0xCF, 0xC7, 0xE7, +0xE3, 0xF1, 0xF8, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0x31, 0x31, 0x31, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, +0x06, 0x06, 0x1F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xF8, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0x7F, 0x7F, 0x1F, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, +0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, +0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00 +}; + #endif +#elif LCDWIDTH == 128 + #if LCDHEIGHT == 32 + static uint8_t micro_oled_screen_buffer[LCDWIDTH*LCDWIDTH/8] = { +//128x32 qmk image +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0xC0, 0xE0, 0xE0, 0xFC, 0xFC, 0xE0, 0xFC, 0xFC, +0xE0, 0xF0, 0xFC, 0xE0, 0xE0, 0xFC, 0xE0, 0xE0, 0xFC, 0xFC, +0xE0, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xF0, 0x10, 0x10, 0x30, 0xE0, 0x00, 0x00, +0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x80, +0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, +0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, +0x80, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0xB2, 0xB2, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0xFF, 0xFF, 0xFF, 0x03, +0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0xFF, 0xFF, 0xFF, +0xFF, 0xB7, 0xB2, 0xB2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x1F, 0x02, 0x02, 0x03, 0x01, 0x00, 0x06, 0x1F, 0x10, +0x10, 0x10, 0x1F, 0x06, 0x00, 0x03, 0x1E, 0x18, 0x0F, 0x01, +0x0F, 0x18, 0x1E, 0x01, 0x00, 0x0F, 0x1F, 0x12, 0x02, 0x12, +0x13, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x0E, 0x1F, 0x12, +0x02, 0x12, 0x13, 0x00, 0x00, 0x1F, 0x10, 0x10, 0x10, 0x1F, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x48, 0x4D, 0x4D, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFE, 0xF8, 0xF9, 0xF3, 0xF3, 0xC0, 0x80, 0xF3, +0xF3, 0xF3, 0xF9, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, +0x4D, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFE, 0x20, 0x10, 0x10, 0xE0, 0xC0, 0x00, 0x70, 0xC0, +0x00, 0x80, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x0C, +0x04, 0x04, 0x04, 0x04, 0x1C, 0xF0, 0x00, 0x00, 0xFC, 0x0C, +0x38, 0xE0, 0x00, 0x00, 0xC0, 0x38, 0x0C, 0xFC, 0x00, 0x00, +0xFC, 0xFC, 0x60, 0x90, 0x0C, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x07, 0x3F, +0x3F, 0x07, 0x3F, 0x3F, 0x07, 0x0F, 0x3F, 0x07, 0x07, 0x3F, +0x07, 0x07, 0x3F, 0x3F, 0x07, 0x07, 0x03, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, +0x06, 0x04, 0x04, 0x07, 0x01, 0x00, 0x00, 0x13, 0x1E, 0x03, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x04, 0x04, +0x04, 0x04, 0x07, 0x0D, 0x08, 0x00, 0x07, 0x00, 0x00, 0x01, +0x07, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x07, +0x00, 0x01, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00 + }; + #elif LCDHEIGHT == 64 + static uint8_t micro_oled_screen_buffer[LCDWIDTH*LCDWIDTH/8] = { +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, +0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, +0xC0, 0xC0, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xC0, 0xC0, 0xC0, 0xC0, 0xF8, 0xFC, 0xFC, 0xFE, 0xFE, 0xFF, +0x7F, 0x7E, 0xFE, 0xFF, 0xFF, 0xFE, 0xFE, 0x7F, 0x7F, 0xFE, +0xFE, 0xFF, 0xFF, 0xFE, 0x7E, 0x7F, 0xFF, 0xFE, 0xFE, 0xFC, +0xFC, 0xF8, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x88, 0x88, 0x88, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xDD, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x99, 0x99, 0x99, 0x99, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFE, 0xF8, 0xF0, 0xF3, 0xF3, 0xE7, 0xE7, 0x00, +0x00, 0xE7, 0xE7, 0xF3, 0xF3, 0xF0, 0xF8, 0xFE, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0x99, 0x99, 0x99, 0x99, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x0F, 0x1F, 0x3F, +0x3F, 0x3F, 0xFF, 0xFF, 0x3F, 0x3F, 0xFF, 0xFF, 0x3F, 0x3F, +0xFF, 0xFF, 0x3F, 0x3F, 0xFF, 0xFF, 0x3F, 0x3F, 0xFF, 0xFF, +0x3F, 0x3F, 0x3F, 0x1F, 0x0F, 0x01, 0x01, 0x01, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x03, 0x01, 0x00, +0x80, 0x03, 0x03, 0x00, 0x00, 0x01, 0x03, 0x00, 0x80, 0x01, +0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0x11, 0x11, 0x11, 0x0E, 0x00, 0x70, +0x88, 0x04, 0x04, 0x04, 0xF8, 0x00, 0x00, 0x3C, 0xE0, 0xC0, +0x38, 0x1C, 0xE0, 0x80, 0x70, 0x0C, 0x00, 0xF8, 0xAC, 0x24, +0x24, 0x3C, 0x30, 0x00, 0x00, 0xFC, 0x0C, 0x04, 0x00, 0xF8, +0xAC, 0x24, 0x24, 0x2C, 0x30, 0x00, 0x70, 0xDC, 0x04, 0x04, +0x88, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0x8C, 0x04, 0x04, 0xF8, 0x00, 0x04, 0x3C, 0xE0, 0x80, 0xF0, +0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x83, 0x01, 0x01, +0x01, 0x81, 0xFE, 0x3C, 0x00, 0x00, 0xFF, 0x03, 0x0E, 0x70, +0xC0, 0xE0, 0x38, 0x06, 0x03, 0xFF, 0x00, 0x00, 0xFF, 0x18, +0x38, 0x66, 0xC3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, +0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, +0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, +0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x01, 0x01, 0x01, 0x01, 0x03, 0x02, 0x00, 0x01, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }; +//TODO: generate bitmap of QMK logo here + #endif +#else +//catchall for custom screen szies + static uint8_t micro_oled_screen_buffer[LCDWIDTH*LCDWIDTH/8] = {0}; +#endif + + + +void micro_oled_init(void) { + + i2c_init(); + i2c_start(I2C_ADDRESS_SA0_1); + + // Display Init sequence for 64x48 OLED module + send_command(DISPLAYOFF); // 0xAE + + send_command(SETDISPLAYCLOCKDIV); // 0xD5 + send_command(0x80); // the suggested ratio 0x80 + + send_command(SETMULTIPLEX); // 0xA8 + send_command(LCDHEIGHT - 1); + + send_command(SETDISPLAYOFFSET); // 0xD3 + send_command(0x00); // no offset + + send_command(SETSTARTLINE | 0x00); // line #0 + + send_command(CHARGEPUMP); // enable charge pump + send_command(0x14); + + send_command(NORMALDISPLAY); // 0xA6 + send_command(DISPLAYALLONRESUME); // 0xA4 + +//display at regular orientation + send_command(SEGREMAP | 0x1); + send_command(COMSCANDEC); + +//rotate display 180 +#ifdef micro_oled_rotate_180 + send_command(SEGREMAP); + send_command(COMSCANINC); +#endif + + send_command(MEMORYMODE); + send_command(0x10); + + send_command(SETCOMPINS); // 0xDA +if (LCDHEIGHT > 32) { + send_command(0x12); +} else { + send_command(0x02); +} + send_command(SETCONTRAST); // 0x81 + send_command(0x8F); + + send_command(SETPRECHARGE); // 0xd9 + send_command(0xF1); + + send_command(SETVCOMDESELECT); // 0xDB + send_command(0x40); + + send_command(DISPLAYON); //--turn on oled panel + clear_screen(); // Erase hardware memory inside the OLED controller to avoid random data in memory. + send_buffer(); +} + +void send_command(uint8_t command) { + micro_oled_transfer_buffer[0] = I2C_COMMAND; + micro_oled_transfer_buffer[1] = command; + i2c_transmit(I2C_ADDRESS_SA0_1 << 1, micro_oled_transfer_buffer, 2, 100); +} + +void send_data(uint8_t data) { + micro_oled_transfer_buffer[0] = I2C_DATA; + micro_oled_transfer_buffer[1] = data; + i2c_transmit(I2C_ADDRESS_SA0_1 << 1, micro_oled_transfer_buffer, 2, 100); +} + +/** \brief Set SSD1306 page address. + Send page address command and address to the SSD1306 OLED controller. +*/ +void set_page_address(uint8_t address) { + address = (0xB0 | address); + send_command(address); +} + +/** \brief Set SSD1306 column address. + Send column address command and address to the SSD1306 OLED controller. +*/ +void set_column_address(uint8_t address) { + send_command( ( 0x10 | (address >> 4) ) + ((128 - LCDWIDTH) >> 8) ); + send_command( 0x0F & address ); +} + +/** \brief Clear SSD1306's memory. + To clear GDRAM inside the LCD controller. +*/ +void clear_screen(void) { + for (int i=0;i<8; i++) { + set_page_address(i); + set_column_address(0); + for (int j=0; j<0x80; j++) { + send_data(0); + } + } +} + +/** \brief Clear SSD1306's memory. + To clear GDRAM inside the LCD controller. +*/ +void clear_buffer(void) { +//384 + memset(micro_oled_screen_buffer, 0, LCDWIDTH*LCDWIDTH/8); +} + +/** \brief Invert display. + The PIXEL_ON color of the display will turn to PIXEL_OFF and the PIXEL_OFF will turn to PIXEL_ON. +*/ +void invert_screen(bool invert) { + if (invert) { + send_command(INVERTDISPLAY); + } else { + send_command(NORMALDISPLAY); + } +} + +/** \brief Set contrast. + OLED contract value from 0 to 255. Note: Contrast level is not very obvious. +*/ +void set_contrast(uint8_t contrast) { + send_command(SETCONTRAST); // 0x81 + send_command(contrast); +} + +/** \brief Transfer display buffer. + Sends the updated buffer to the controller - the current status is checked before to save i2c exectution time +*/ +void send_buffer(void) { + uint8_t i, j; + + uint8_t page_addr = 0xFF; + for (i = 0; i < LCDHEIGHT/8; i++) { + uint8_t col_addr = 0xFF; + for (j = 0; j < LCDWIDTH; j++) { + if (micro_oled_screen_buffer[i*LCDWIDTH+j] != micro_oled_screen_current[i*LCDWIDTH+j]) { + if (page_addr != i) { + set_page_address(i); + } + if (col_addr != j) { + set_column_address(j); + } + send_data(micro_oled_screen_buffer[i*LCDWIDTH+j]); + micro_oled_screen_current[i*LCDWIDTH+j] = micro_oled_screen_buffer[i*LCDWIDTH+j]; + col_addr = j + 1; + } + } + } +} + +/** \brief Draw pixel with color and mode. + Draw color pixel in the screen buffer's x,y position with NORM or XOR draw mode. +*/ +void draw_pixel(uint8_t x, uint8_t y, uint8_t color, uint8_t mode) { + if ((x<0) || (x>=LCDWIDTH) || (y<0) || (y>=LCDHEIGHT)) + return; + + if (mode == XOR) { + if (color == PIXEL_ON) + micro_oled_screen_buffer[x + (y/8)*LCDWIDTH] ^= _BV((y%8)); + } else { + if (color == PIXEL_ON) + micro_oled_screen_buffer[x + (y/8)*LCDWIDTH] |= _BV((y%8)); + else + micro_oled_screen_buffer[x + (y/8)*LCDWIDTH] &= ~_BV((y%8)); + } +} + +/** \brief Draw line with color and mode. +Draw line using color and mode from x0,y0 to x1,y1 of the screen buffer. +*/ +void draw_line(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t color, uint8_t mode) { + uint8_t steep = abs(y1 - y0) > abs(x1 - x0); + if (steep) { + swap(x0, y0); + swap(x1, y1); + } + + if (x0 > x1) { + swap(x0, x1); + swap(y0, y1); + } + + uint8_t dx, dy; + dx = x1 - x0; + dy = abs(y1 - y0); + + int8_t err = dx / 2; + int8_t ystep; + + if (y0 < y1) { + ystep = 1; + } else { + ystep = -1;} + + for (; x0=TOTALFONTS) || (font<0)) + return; + + uint8_t fontType = font; + uint8_t fontWidth = pgm_read_byte(fonts_pointer[fontType]+0); + uint8_t fontHeight = pgm_read_byte(fonts_pointer[fontType]+1); + uint8_t fontStartChar = pgm_read_byte(fonts_pointer[fontType]+2); + uint8_t fontTotalChar = pgm_read_byte(fonts_pointer[fontType]+3); + uint16_t fontMapWidth = (pgm_read_byte(fonts_pointer[fontType]+4)*100)+pgm_read_byte(fonts_pointer[fontType]+5); // two bytes values into integer 16 + + if ((c(fontStartChar+fontTotalChar-1))) // no bitmap for the required c + return; + + tempC=c-fontStartChar; + + // each row (in datasheet is call page) is 8 bits high, 16 bit high character will have 2 rows to be drawn + rowsToDraw=fontHeight/8; // 8 is LCD's page size, see SSD1306 datasheet + if (rowsToDraw<=1) rowsToDraw=1; + + // the following draw function can draw anywhere on the screen, but SLOW pixel by pixel draw + if (rowsToDraw==1) { + for (i=0;i>=1; + } + } + return; + } + + // font height over 8 bit + // take character "0" ASCII 48 as example + charPerBitmapRow = fontMapWidth/fontWidth; // 256/8 =32 char per row + charColPositionOnBitmap = tempC % charPerBitmapRow; // =16 + charRowPositionOnBitmap = (int)(tempC/charPerBitmapRow); // =1 + charBitmapStartPosition = (charRowPositionOnBitmap * fontMapWidth * (fontHeight/8)) + (charColPositionOnBitmap * fontWidth) ; + + // each row on LCD is 8 bit height (see datasheet for explanation) + for(row=0;row>=1; + } + } + } + +} + +void draw_string(uint8_t x, uint8_t y, char * string, uint8_t color, uint8_t mode, uint8_t font) { + + if ((font>=TOTALFONTS) || (font<0)) + return; + + uint8_t fontType = font; + uint8_t fontWidth = pgm_read_byte(fonts_pointer[fontType]+0); + + uint8_t cur_x = x; + for (int i = 0; i < strlen(string); i++) { + draw_char(cur_x, y, string[i], color, mode, font); + cur_x += fontWidth + 1; + } + +} diff --git a/drivers/qwiic/micro_oled.h b/drivers/qwiic/micro_oled.h new file mode 100644 index 000000000..5d6a1029e --- /dev/null +++ b/drivers/qwiic/micro_oled.h @@ -0,0 +1,134 @@ +/* Jim Lindblom @ SparkFun Electronics + * October 26, 2014 + * https://github.com/sparkfun/Micro_OLED_Breakout/tree/master/Firmware/Arduino/libraries/SFE_MicroOLED + * + * Modified by: + * Emil Varughese @ Edwin Robotics Pvt. Ltd. + * July 27, 2015 + * https://github.com/emil01/SparkFun_Micro_OLED_Arduino_Library/ + * + * This code was heavily based around the MicroView library, written by GeekAmmo + * (https://github.com/geekammo/MicroView-Arduino-Library). + * + * Adapted for QMK by: + * Jack Humbert + * October 11, 2018 + * + * 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 3 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 . + */ +#pragma once + +#include "qwiic.h" + +void micro_oled_init(void); + +void send_command(uint8_t command); +void send_data(uint8_t data); +void set_page_address(uint8_t address); +void set_column_address(uint8_t address); +void clear_screen(void); +void clear_buffer(void); +void send_buffer(void); +void draw_pixel(uint8_t x, uint8_t y, uint8_t color, uint8_t mode); +void draw_line(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t color, uint8_t mode); +void draw_line_hori(uint8_t x, uint8_t y, uint8_t width, uint8_t color, uint8_t mode); +void draw_line_vert(uint8_t x, uint8_t y, uint8_t height, bool color, uint8_t mode); +void draw_rect(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t color, uint8_t mode); +void draw_rect_soft(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t color, uint8_t mode); +void draw_rect_filled(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t color, uint8_t mode); +void draw_rect_filled_soft(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t color, uint8_t mode); +void draw_char(uint8_t x, uint8_t y, uint8_t c, uint8_t color, uint8_t mode, uint8_t font); +void draw_string(uint8_t x, uint8_t y, char * string, uint8_t color, uint8_t mode, uint8_t font); + +#define I2C_ADDRESS_SA0_0 0b0111100 +#ifndef I2C_ADDRESS_SA0_1 +#define I2C_ADDRESS_SA0_1 0b0111101 +#endif +#define I2C_COMMAND 0x00 +#define I2C_DATA 0x40 +#define PIXEL_OFF 0 +#define PIXEL_ON 1 + +#ifndef LCDWIDTH +#define LCDWIDTH 64 +#endif +#ifndef LCDWIDTH +#define LCDHEIGHT 48 +#endif +#define FONTHEADERSIZE 6 + +#define NORM 0 +#define XOR 1 + +#define PAGE 0 +#define ALL 1 + +#define WIDGETSTYLE0 0 +#define WIDGETSTYLE1 1 +#define WIDGETSTYLE2 2 + +#define SETCONTRAST 0x81 +#define DISPLAYALLONRESUME 0xA4 +#define DISPLAYALLON 0xA5 +#define NORMALDISPLAY 0xA6 +#define INVERTDISPLAY 0xA7 +#define DISPLAYOFF 0xAE +#define DISPLAYON 0xAF +#define SETDISPLAYOFFSET 0xD3 +#define SETCOMPINS 0xDA +#define SETVCOMDESELECT 0xDB +#define SETDISPLAYCLOCKDIV 0xD5 +#define SETPRECHARGE 0xD9 +#define SETMULTIPLEX 0xA8 +#define SETLOWCOLUMN 0x00 +#define SETHIGHCOLUMN 0x10 +#define SETSTARTLINE 0x40 +#define MEMORYMODE 0x20 +#define COMSCANINC 0xC0 +#define COMSCANDEC 0xC8 +#define SEGREMAP 0xA0 +#define CHARGEPUMP 0x8D +#define EXTERNALVCC 0x01 +#define SWITCHCAPVCC 0x02 + +// Scroll +#define ACTIVATESCROLL 0x2F +#define DEACTIVATESCROLL 0x2E +#define SETVERTICALSCROLLAREA 0xA3 +#define RIGHTHORIZONTALSCROLL 0x26 +#define LEFT_HORIZONTALSCROLL 0x27 +#define VERTICALRIGHTHORIZONTALSCROLL 0x29 +#define VERTICALLEFTHORIZONTALSCROLL 0x2A + +typedef enum CMD { + CMD_CLEAR, //0 + CMD_INVERT, //1 + CMD_CONTRAST, //2 + CMD_DISPLAY, //3 + CMD_SETCURSOR, //4 + CMD_PIXEL, //5 + CMD_LINE, //6 + CMD_LINEH, //7 + CMD_LINEV, //8 + CMD_RECT, //9 + CMD_RECTFILL, //10 + CMD_CIRCLE, //11 + CMD_CIRCLEFILL, //12 + CMD_DRAWCHAR, //13 + CMD_DRAWBITMAP, //14 + CMD_GETLCDWIDTH, //15 + CMD_GETLCDHEIGHT, //16 + CMD_SETCOLOR, //17 + CMD_SETDRAWMODE //18 +} commCommand_t; \ No newline at end of file diff --git a/drivers/qwiic/qwiic.c b/drivers/qwiic/qwiic.c new file mode 100644 index 000000000..904791992 --- /dev/null +++ b/drivers/qwiic/qwiic.c @@ -0,0 +1,31 @@ +/* Copyright 2018 Jack Humbert + * + * 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 . + */ +#include "qwiic.h" + +void qwiic_init(void) { + #ifdef QWIIC_JOYSTIIC_ENABLE + joystiic_init(); + #endif + #ifdef QWIIC_MICRO_OLED_ENABLE + micro_oled_init(); + #endif +} + +void qwiic_task(void) { + #ifdef QWIIC_JOYSTIIC_ENABLE + joystiic_task(); + #endif +} diff --git a/drivers/qwiic/qwiic.h b/drivers/qwiic/qwiic.h new file mode 100644 index 000000000..160fb28df --- /dev/null +++ b/drivers/qwiic/qwiic.h @@ -0,0 +1,28 @@ +/* Copyright 2018 Jack Humbert + * + * 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 . + */ +#pragma once + +#include "i2c_master.h" + +#ifdef QWIIC_JOYSTIIC_ENABLE + #include "joystiic.h" +#endif +#ifdef QWIIC_MICRO_OLED_ENABLE + #include "micro_oled.h" +#endif + +void qwiic_init(void); +void qwiic_task(void); diff --git a/drivers/qwiic/qwiic.mk b/drivers/qwiic/qwiic.mk new file mode 100644 index 000000000..4ae2d78e3 --- /dev/null +++ b/drivers/qwiic/qwiic.mk @@ -0,0 +1,18 @@ +ifneq ($(strip $(QWIIC_ENABLE)),) + COMMON_VPATH += $(DRIVER_PATH)/qwiic + OPT_DEFS += -DQWIIC_ENABLE + SRC += qwiic.c + ifeq ($(filter "i2c_master.c", $(SRC)),) + SRC += i2c_master.c + endif +endif + +ifneq ($(filter JOYSTIIC, $(QWIIC_ENABLE)),) + OPT_DEFS += -DQWIIC_JOYSTIIC_ENABLE + SRC += joystiic.c +endif + +ifneq ($(filter MICRO_OLED, $(QWIIC_ENABLE)),) + OPT_DEFS += -DQWIIC_MICRO_OLED_ENABLE + SRC += micro_oled.c +endif diff --git a/drivers/qwiic/util/font5x7.h b/drivers/qwiic/util/font5x7.h new file mode 100644 index 000000000..0bad206b7 --- /dev/null +++ b/drivers/qwiic/util/font5x7.h @@ -0,0 +1,288 @@ +/****************************************************************************** +font5x7.h +Definition for small font + +This file was imported from the MicroView library, written by GeekAmmo +(https://github.com/geekammo/MicroView-Arduino-Library), and released under +the terms of the GNU General Public License as published by the Free Software +Foundation, either version 3 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 . + +Modified by: +Emil Varughese @ Edwin Robotics Pvt. Ltd. +July 27, 2015 +https://github.com/emil01/SparkFun_Micro_OLED_Arduino_Library/ + +******************************************************************************/ +#pragma once + +#include "progmem.h" + +// Standard ASCII 5x7 font +static const unsigned char font5x7[] PROGMEM = { + // first row defines - FONTWIDTH, FONTHEIGHT, ASCII START CHAR, TOTAL CHARACTERS, FONT MAP WIDTH HIGH, FONT MAP WIDTH LOW (2,56 meaning 256) + 5,8,0,255,12,75, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3E, 0x5B, 0x4F, 0x5B, 0x3E, + 0x3E, 0x6B, 0x4F, 0x6B, 0x3E, + 0x1C, 0x3E, 0x7C, 0x3E, 0x1C, + 0x18, 0x3C, 0x7E, 0x3C, 0x18, + 0x1C, 0x57, 0x7D, 0x57, 0x1C, + 0x1C, 0x5E, 0x7F, 0x5E, 0x1C, + 0x00, 0x18, 0x3C, 0x18, 0x00, + 0xFF, 0xE7, 0xC3, 0xE7, 0xFF, + 0x00, 0x18, 0x24, 0x18, 0x00, + 0xFF, 0xE7, 0xDB, 0xE7, 0xFF, + 0x30, 0x48, 0x3A, 0x06, 0x0E, + 0x26, 0x29, 0x79, 0x29, 0x26, + 0x40, 0x7F, 0x05, 0x05, 0x07, + 0x40, 0x7F, 0x05, 0x25, 0x3F, + 0x5A, 0x3C, 0xE7, 0x3C, 0x5A, + 0x7F, 0x3E, 0x1C, 0x1C, 0x08, + 0x08, 0x1C, 0x1C, 0x3E, 0x7F, + 0x14, 0x22, 0x7F, 0x22, 0x14, + 0x5F, 0x5F, 0x00, 0x5F, 0x5F, + 0x06, 0x09, 0x7F, 0x01, 0x7F, + 0x00, 0x66, 0x89, 0x95, 0x6A, + 0x60, 0x60, 0x60, 0x60, 0x60, + 0x94, 0xA2, 0xFF, 0xA2, 0x94, + 0x08, 0x04, 0x7E, 0x04, 0x08, + 0x10, 0x20, 0x7E, 0x20, 0x10, + 0x08, 0x08, 0x2A, 0x1C, 0x08, + 0x08, 0x1C, 0x2A, 0x08, 0x08, + 0x1E, 0x10, 0x10, 0x10, 0x10, + 0x0C, 0x1E, 0x0C, 0x1E, 0x0C, + 0x30, 0x38, 0x3E, 0x38, 0x30, + 0x06, 0x0E, 0x3E, 0x0E, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x5F, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x07, 0x00, + 0x14, 0x7F, 0x14, 0x7F, 0x14, + 0x24, 0x2A, 0x7F, 0x2A, 0x12, + 0x23, 0x13, 0x08, 0x64, 0x62, + 0x36, 0x49, 0x56, 0x20, 0x50, + 0x00, 0x08, 0x07, 0x03, 0x00, + 0x00, 0x1C, 0x22, 0x41, 0x00, + 0x00, 0x41, 0x22, 0x1C, 0x00, + 0x2A, 0x1C, 0x7F, 0x1C, 0x2A, + 0x08, 0x08, 0x3E, 0x08, 0x08, + 0x00, 0x80, 0x70, 0x30, 0x00, + 0x08, 0x08, 0x08, 0x08, 0x08, + 0x00, 0x00, 0x60, 0x60, 0x00, + 0x20, 0x10, 0x08, 0x04, 0x02, + 0x3E, 0x51, 0x49, 0x45, 0x3E, + 0x00, 0x42, 0x7F, 0x40, 0x00, + 0x72, 0x49, 0x49, 0x49, 0x46, + 0x21, 0x41, 0x49, 0x4D, 0x33, + 0x18, 0x14, 0x12, 0x7F, 0x10, + 0x27, 0x45, 0x45, 0x45, 0x39, + 0x3C, 0x4A, 0x49, 0x49, 0x31, + 0x41, 0x21, 0x11, 0x09, 0x07, + 0x36, 0x49, 0x49, 0x49, 0x36, + 0x46, 0x49, 0x49, 0x29, 0x1E, + 0x00, 0x00, 0x14, 0x00, 0x00, + 0x00, 0x40, 0x34, 0x00, 0x00, + 0x00, 0x08, 0x14, 0x22, 0x41, + 0x14, 0x14, 0x14, 0x14, 0x14, + 0x00, 0x41, 0x22, 0x14, 0x08, + 0x02, 0x01, 0x59, 0x09, 0x06, + 0x3E, 0x41, 0x5D, 0x59, 0x4E, + 0x7C, 0x12, 0x11, 0x12, 0x7C, + 0x7F, 0x49, 0x49, 0x49, 0x36, + 0x3E, 0x41, 0x41, 0x41, 0x22, + 0x7F, 0x41, 0x41, 0x41, 0x3E, + 0x7F, 0x49, 0x49, 0x49, 0x41, + 0x7F, 0x09, 0x09, 0x09, 0x01, + 0x3E, 0x41, 0x41, 0x51, 0x73, + 0x7F, 0x08, 0x08, 0x08, 0x7F, + 0x00, 0x41, 0x7F, 0x41, 0x00, + 0x20, 0x40, 0x41, 0x3F, 0x01, + 0x7F, 0x08, 0x14, 0x22, 0x41, + 0x7F, 0x40, 0x40, 0x40, 0x40, + 0x7F, 0x02, 0x1C, 0x02, 0x7F, + 0x7F, 0x04, 0x08, 0x10, 0x7F, + 0x3E, 0x41, 0x41, 0x41, 0x3E, + 0x7F, 0x09, 0x09, 0x09, 0x06, + 0x3E, 0x41, 0x51, 0x21, 0x5E, + 0x7F, 0x09, 0x19, 0x29, 0x46, + 0x26, 0x49, 0x49, 0x49, 0x32, + 0x03, 0x01, 0x7F, 0x01, 0x03, + 0x3F, 0x40, 0x40, 0x40, 0x3F, + 0x1F, 0x20, 0x40, 0x20, 0x1F, + 0x3F, 0x40, 0x38, 0x40, 0x3F, + 0x63, 0x14, 0x08, 0x14, 0x63, + 0x03, 0x04, 0x78, 0x04, 0x03, + 0x61, 0x59, 0x49, 0x4D, 0x43, + 0x00, 0x7F, 0x41, 0x41, 0x41, + 0x02, 0x04, 0x08, 0x10, 0x20, + 0x00, 0x41, 0x41, 0x41, 0x7F, + 0x04, 0x02, 0x01, 0x02, 0x04, + 0x40, 0x40, 0x40, 0x40, 0x40, + 0x00, 0x03, 0x07, 0x08, 0x00, + 0x20, 0x54, 0x54, 0x78, 0x40, + 0x7F, 0x28, 0x44, 0x44, 0x38, + 0x38, 0x44, 0x44, 0x44, 0x28, + 0x38, 0x44, 0x44, 0x28, 0x7F, + 0x38, 0x54, 0x54, 0x54, 0x18, + 0x00, 0x08, 0x7E, 0x09, 0x02, + 0x18, 0xA4, 0xA4, 0x9C, 0x78, + 0x7F, 0x08, 0x04, 0x04, 0x78, + 0x00, 0x44, 0x7D, 0x40, 0x00, + 0x20, 0x40, 0x40, 0x3D, 0x00, + 0x7F, 0x10, 0x28, 0x44, 0x00, + 0x00, 0x41, 0x7F, 0x40, 0x00, + 0x7C, 0x04, 0x78, 0x04, 0x78, + 0x7C, 0x08, 0x04, 0x04, 0x78, + 0x38, 0x44, 0x44, 0x44, 0x38, + 0xFC, 0x18, 0x24, 0x24, 0x18, + 0x18, 0x24, 0x24, 0x18, 0xFC, + 0x7C, 0x08, 0x04, 0x04, 0x08, + 0x48, 0x54, 0x54, 0x54, 0x24, + 0x04, 0x04, 0x3F, 0x44, 0x24, + 0x3C, 0x40, 0x40, 0x20, 0x7C, + 0x1C, 0x20, 0x40, 0x20, 0x1C, + 0x3C, 0x40, 0x30, 0x40, 0x3C, + 0x44, 0x28, 0x10, 0x28, 0x44, + 0x4C, 0x90, 0x90, 0x90, 0x7C, + 0x44, 0x64, 0x54, 0x4C, 0x44, + 0x00, 0x08, 0x36, 0x41, 0x00, + 0x00, 0x00, 0x77, 0x00, 0x00, + 0x00, 0x41, 0x36, 0x08, 0x00, + 0x02, 0x01, 0x02, 0x04, 0x02, + 0x3C, 0x26, 0x23, 0x26, 0x3C, + 0x1E, 0xA1, 0xA1, 0x61, 0x12, + 0x3A, 0x40, 0x40, 0x20, 0x7A, + 0x38, 0x54, 0x54, 0x55, 0x59, + 0x21, 0x55, 0x55, 0x79, 0x41, + 0x21, 0x54, 0x54, 0x78, 0x41, + 0x21, 0x55, 0x54, 0x78, 0x40, + 0x20, 0x54, 0x55, 0x79, 0x40, + 0x0C, 0x1E, 0x52, 0x72, 0x12, + 0x39, 0x55, 0x55, 0x55, 0x59, + 0x39, 0x54, 0x54, 0x54, 0x59, + 0x39, 0x55, 0x54, 0x54, 0x58, + 0x00, 0x00, 0x45, 0x7C, 0x41, + 0x00, 0x02, 0x45, 0x7D, 0x42, + 0x00, 0x01, 0x45, 0x7C, 0x40, + 0xF0, 0x29, 0x24, 0x29, 0xF0, + 0xF0, 0x28, 0x25, 0x28, 0xF0, + 0x7C, 0x54, 0x55, 0x45, 0x00, + 0x20, 0x54, 0x54, 0x7C, 0x54, + 0x7C, 0x0A, 0x09, 0x7F, 0x49, + 0x32, 0x49, 0x49, 0x49, 0x32, + 0x32, 0x48, 0x48, 0x48, 0x32, + 0x32, 0x4A, 0x48, 0x48, 0x30, + 0x3A, 0x41, 0x41, 0x21, 0x7A, + 0x3A, 0x42, 0x40, 0x20, 0x78, + 0x00, 0x9D, 0xA0, 0xA0, 0x7D, + 0x39, 0x44, 0x44, 0x44, 0x39, + 0x3D, 0x40, 0x40, 0x40, 0x3D, + 0x3C, 0x24, 0xFF, 0x24, 0x24, + 0x48, 0x7E, 0x49, 0x43, 0x66, + 0x2B, 0x2F, 0xFC, 0x2F, 0x2B, + 0xFF, 0x09, 0x29, 0xF6, 0x20, + 0xC0, 0x88, 0x7E, 0x09, 0x03, + 0x20, 0x54, 0x54, 0x79, 0x41, + 0x00, 0x00, 0x44, 0x7D, 0x41, + 0x30, 0x48, 0x48, 0x4A, 0x32, + 0x38, 0x40, 0x40, 0x22, 0x7A, + 0x00, 0x7A, 0x0A, 0x0A, 0x72, + 0x7D, 0x0D, 0x19, 0x31, 0x7D, + 0x26, 0x29, 0x29, 0x2F, 0x28, + 0x26, 0x29, 0x29, 0x29, 0x26, + 0x30, 0x48, 0x4D, 0x40, 0x20, + 0x38, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x38, + 0x2F, 0x10, 0xC8, 0xAC, 0xBA, + 0x2F, 0x10, 0x28, 0x34, 0xFA, + 0x00, 0x00, 0x7B, 0x00, 0x00, + 0x08, 0x14, 0x2A, 0x14, 0x22, + 0x22, 0x14, 0x2A, 0x14, 0x08, + 0xAA, 0x00, 0x55, 0x00, 0xAA, + 0xAA, 0x55, 0xAA, 0x55, 0xAA, + 0x00, 0x00, 0x00, 0xFF, 0x00, + 0x10, 0x10, 0x10, 0xFF, 0x00, + 0x14, 0x14, 0x14, 0xFF, 0x00, + 0x10, 0x10, 0xFF, 0x00, 0xFF, + 0x10, 0x10, 0xF0, 0x10, 0xF0, + 0x14, 0x14, 0x14, 0xFC, 0x00, + 0x14, 0x14, 0xF7, 0x00, 0xFF, + 0x00, 0x00, 0xFF, 0x00, 0xFF, + 0x14, 0x14, 0xF4, 0x04, 0xFC, + 0x14, 0x14, 0x17, 0x10, 0x1F, + 0x10, 0x10, 0x1F, 0x10, 0x1F, + 0x14, 0x14, 0x14, 0x1F, 0x00, + 0x10, 0x10, 0x10, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x1F, 0x10, + 0x10, 0x10, 0x10, 0x1F, 0x10, + 0x10, 0x10, 0x10, 0xF0, 0x10, + 0x00, 0x00, 0x00, 0xFF, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0xFF, 0x10, + 0x00, 0x00, 0x00, 0xFF, 0x14, + 0x00, 0x00, 0xFF, 0x00, 0xFF, + 0x00, 0x00, 0x1F, 0x10, 0x17, + 0x00, 0x00, 0xFC, 0x04, 0xF4, + 0x14, 0x14, 0x17, 0x10, 0x17, + 0x14, 0x14, 0xF4, 0x04, 0xF4, + 0x00, 0x00, 0xFF, 0x00, 0xF7, + 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0xF7, 0x00, 0xF7, + 0x14, 0x14, 0x14, 0x17, 0x14, + 0x10, 0x10, 0x1F, 0x10, 0x1F, + 0x14, 0x14, 0x14, 0xF4, 0x14, + 0x10, 0x10, 0xF0, 0x10, 0xF0, + 0x00, 0x00, 0x1F, 0x10, 0x1F, + 0x00, 0x00, 0x00, 0x1F, 0x14, + 0x00, 0x00, 0x00, 0xFC, 0x14, + 0x00, 0x00, 0xF0, 0x10, 0xF0, + 0x10, 0x10, 0xFF, 0x10, 0xFF, + 0x14, 0x14, 0x14, 0xFF, 0x14, + 0x10, 0x10, 0x10, 0x1F, 0x00, + 0x00, 0x00, 0x00, 0xF0, 0x10, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, + 0xFF, 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, + 0x38, 0x44, 0x44, 0x38, 0x44, + 0x7C, 0x2A, 0x2A, 0x3E, 0x14, + 0x7E, 0x02, 0x02, 0x06, 0x06, + 0x02, 0x7E, 0x02, 0x7E, 0x02, + 0x63, 0x55, 0x49, 0x41, 0x63, + 0x38, 0x44, 0x44, 0x3C, 0x04, + 0x40, 0x7E, 0x20, 0x1E, 0x20, + 0x06, 0x02, 0x7E, 0x02, 0x02, + 0x99, 0xA5, 0xE7, 0xA5, 0x99, + 0x1C, 0x2A, 0x49, 0x2A, 0x1C, + 0x4C, 0x72, 0x01, 0x72, 0x4C, + 0x30, 0x4A, 0x4D, 0x4D, 0x30, + 0x30, 0x48, 0x78, 0x48, 0x30, + 0xBC, 0x62, 0x5A, 0x46, 0x3D, + 0x3E, 0x49, 0x49, 0x49, 0x00, + 0x7E, 0x01, 0x01, 0x01, 0x7E, + 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, + 0x44, 0x44, 0x5F, 0x44, 0x44, + 0x40, 0x51, 0x4A, 0x44, 0x40, + 0x40, 0x44, 0x4A, 0x51, 0x40, + 0x00, 0x00, 0xFF, 0x01, 0x03, + 0xE0, 0x80, 0xFF, 0x00, 0x00, + 0x08, 0x08, 0x6B, 0x6B, 0x08, + 0x36, 0x12, 0x36, 0x24, 0x36, + 0x06, 0x0F, 0x09, 0x0F, 0x06, + 0x00, 0x00, 0x18, 0x18, 0x00, + 0x00, 0x00, 0x10, 0x10, 0x00, + 0x30, 0x40, 0xFF, 0x01, 0x01, + 0x00, 0x1F, 0x01, 0x01, 0x1E, + 0x00, 0x19, 0x1D, 0x17, 0x12, + 0x00, 0x3C, 0x3C, 0x3C, 0x3C, + 0x00, 0x00, 0x00, 0x00, 0x00 +}; diff --git a/drivers/qwiic/util/font8x16.h b/drivers/qwiic/util/font8x16.h new file mode 100644 index 000000000..c070e4ec8 --- /dev/null +++ b/drivers/qwiic/util/font8x16.h @@ -0,0 +1,127 @@ +/****************************************************************************** +font8x16.h +Definition for medium font + +This file was imported from the MicroView library, written by GeekAmmo +(https://github.com/geekammo/MicroView-Arduino-Library), and released under +the terms of the GNU General Public License as published by the Free Software +Foundation, either version 3 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 . + +Modified by: +Emil Varughese @ Edwin Robotics Pvt. Ltd. +July 27, 2015 +https://github.com/emil01/SparkFun_Micro_OLED_Arduino_Library/ +******************************************************************************/ +#pragma once + +#include "progmem.h" + +static const unsigned char font8x16[] PROGMEM = { + // first row defines - FONTWIDTH, FONTHEIGHT, ASCII START CHAR, TOTAL CHARACTERS, FONT MAP WIDTH HIGH, FONT MAP WIDTH LOW (2,56 meaning 256) + 8,16,32,96,2,56, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0xD0, 0xBE, 0x90, 0xD0, 0xBE, 0x90, 0x00, + 0x00, 0x1C, 0x62, 0xFF, 0xC2, 0x80, 0x00, 0x00, 0x0C, 0x12, 0x92, 0x4C, 0xB0, 0x88, 0x06, 0x00, + 0x80, 0x7C, 0x62, 0xB2, 0x1C, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x0E, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xE0, 0x18, 0x04, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, 0x04, 0x18, 0xE0, 0x00, 0x00, + 0x00, 0x24, 0x18, 0x7E, 0x18, 0x24, 0x00, 0x00, 0x80, 0x80, 0x80, 0xF0, 0x80, 0x80, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x60, 0x18, 0x06, 0x00, 0x00, + 0xF8, 0x04, 0xC2, 0x32, 0x0C, 0xF8, 0x00, 0x00, 0x00, 0x04, 0x04, 0xFE, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x82, 0x42, 0x22, 0x1C, 0x00, 0x00, 0x00, 0x02, 0x22, 0x22, 0x22, 0xDC, 0x00, 0x00, + 0xC0, 0xA0, 0x98, 0x84, 0xFE, 0x80, 0x80, 0x00, 0x00, 0x1E, 0x12, 0x12, 0x22, 0xC2, 0x00, 0x00, + 0xF8, 0x44, 0x22, 0x22, 0x22, 0xC0, 0x00, 0x00, 0x00, 0x02, 0x02, 0xC2, 0x32, 0x0A, 0x06, 0x00, + 0x00, 0x8C, 0x52, 0x22, 0x52, 0x8C, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x26, 0xF8, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x10, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, + 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x00, 0x00, 0x02, 0x82, 0x42, 0x22, 0x1C, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x04, 0x0F, 0x04, 0x03, 0x00, 0x00, 0x04, 0x02, 0x01, 0x03, 0x04, 0x04, 0x03, 0x00, + 0x03, 0x04, 0x04, 0x04, 0x05, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x06, 0x08, 0x10, 0x10, 0x00, 0x00, 0x00, 0x10, 0x10, 0x08, 0x06, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x16, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x03, 0x04, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x04, 0x04, 0x07, 0x04, 0x04, 0x00, 0x00, + 0x00, 0x07, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, + 0x01, 0x02, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x02, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x0E, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x04, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, + 0x04, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xF8, 0x04, 0x72, 0x8A, 0xFA, 0x84, 0x78, 0x00, 0x00, 0xC0, 0x38, 0x06, 0x38, 0xC0, 0x00, 0x00, + 0x00, 0xFE, 0x22, 0x22, 0x22, 0xDC, 0x00, 0x00, 0xF8, 0x04, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, + 0xFE, 0x02, 0x02, 0x02, 0x04, 0xF8, 0x00, 0x00, 0x00, 0xFE, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, + 0x00, 0xFE, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0xF8, 0x04, 0x02, 0x02, 0x22, 0xE2, 0x00, 0x00, + 0xFE, 0x20, 0x20, 0x20, 0x20, 0xFE, 0x00, 0x00, 0x00, 0x02, 0x02, 0xFE, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x02, 0xFE, 0x00, 0x00, 0xFE, 0x40, 0xB0, 0x08, 0x04, 0x02, 0x00, 0x00, + 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x0C, 0x70, 0x80, 0x70, 0x0C, 0xFE, 0x00, + 0xFE, 0x0C, 0x30, 0xC0, 0x00, 0xFE, 0x00, 0x00, 0xF8, 0x04, 0x02, 0x02, 0x04, 0xF8, 0x00, 0x00, + 0xFE, 0x42, 0x42, 0x42, 0x22, 0x1C, 0x00, 0x00, 0xF8, 0x04, 0x02, 0x02, 0x04, 0xF8, 0x00, 0x00, + 0x00, 0xFE, 0x42, 0x42, 0xA2, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x22, 0x42, 0x42, 0x80, 0x00, 0x00, + 0x02, 0x02, 0x02, 0xFE, 0x02, 0x02, 0x02, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, + 0x06, 0x38, 0xC0, 0x00, 0xC0, 0x38, 0x06, 0x00, 0x3E, 0xC0, 0xF0, 0x0E, 0xF0, 0xC0, 0x3E, 0x00, + 0x00, 0x06, 0x98, 0x60, 0x98, 0x06, 0x00, 0x00, 0x00, 0x06, 0x18, 0xE0, 0x18, 0x06, 0x00, 0x00, + 0x02, 0x02, 0xC2, 0x32, 0x0A, 0x06, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x02, 0x02, 0x02, 0x02, 0x00, + 0x00, 0x06, 0x18, 0x60, 0x80, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0xFE, 0x00, 0x00, 0x00, + 0x40, 0x30, 0x0C, 0x0C, 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x02, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x06, 0x01, 0x01, 0x01, 0x01, 0x01, 0x06, 0x00, + 0x00, 0x07, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, + 0x07, 0x04, 0x04, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x07, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x04, 0x07, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x04, 0x04, 0x07, 0x04, 0x04, 0x00, 0x00, + 0x00, 0x04, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x07, 0x00, 0x00, 0x01, 0x02, 0x04, 0x00, 0x00, + 0x00, 0x07, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x07, 0x00, 0x00, 0x01, 0x00, 0x00, 0x07, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x03, 0x07, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x02, 0x01, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x0C, 0x12, 0x11, 0x10, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, + 0x00, 0x06, 0x01, 0x00, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x05, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x10, 0x10, 0x10, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x00, 0x10, 0x10, 0x10, 0x10, 0x1F, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x10, 0x10, 0x10, 0xF0, 0x00, 0x00, + 0x00, 0xFE, 0x20, 0x10, 0x10, 0xE0, 0x00, 0x00, 0x00, 0xE0, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, + 0x00, 0xE0, 0x10, 0x10, 0x10, 0xFE, 0x00, 0x00, 0x00, 0xE0, 0x90, 0x90, 0x90, 0xE0, 0x00, 0x00, + 0x00, 0x20, 0xFC, 0x22, 0x22, 0x22, 0x02, 0x00, 0x00, 0xE0, 0x10, 0x10, 0x10, 0xF0, 0x00, 0x00, + 0x00, 0xFE, 0x20, 0x10, 0x10, 0xE0, 0x00, 0x00, 0x10, 0x10, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x10, 0x10, 0xF2, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x80, 0x40, 0x20, 0x10, 0x00, 0x00, + 0x00, 0x02, 0x02, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x20, 0x10, 0xF0, 0x20, 0x10, 0xF0, 0x00, + 0x00, 0xF0, 0x20, 0x10, 0x10, 0xE0, 0x00, 0x00, 0x00, 0xE0, 0x10, 0x10, 0x10, 0xE0, 0x00, 0x00, + 0x00, 0xF0, 0x20, 0x10, 0x10, 0xE0, 0x00, 0x00, 0x00, 0xE0, 0x10, 0x10, 0x10, 0xF0, 0x00, 0x00, + 0x00, 0xF0, 0x20, 0x10, 0x10, 0x70, 0x00, 0x00, 0x00, 0x60, 0x90, 0x90, 0x90, 0x20, 0x00, 0x00, + 0x00, 0x20, 0x20, 0xFC, 0x20, 0x20, 0x20, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, + 0x00, 0x70, 0x80, 0x00, 0x80, 0x70, 0x00, 0x00, 0xF0, 0x00, 0xC0, 0x30, 0xC0, 0x00, 0xF0, 0x00, + 0x00, 0x30, 0xC0, 0xC0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x30, 0xC0, 0x00, 0x80, 0x70, 0x00, 0x00, + 0x00, 0x10, 0x10, 0x90, 0x50, 0x30, 0x00, 0x00, 0x00, 0x80, 0x80, 0x7E, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x7E, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x02, 0x07, 0x00, 0x00, + 0x00, 0x07, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, + 0x00, 0x03, 0x04, 0x04, 0x02, 0x07, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x24, 0x24, 0x22, 0x1F, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x04, 0x04, 0x00, 0x00, 0x00, + 0x20, 0x20, 0x20, 0x20, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x01, 0x02, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x04, 0x04, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, + 0x00, 0x3F, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x02, 0x3F, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x04, 0x00, 0x00, 0x03, 0x04, 0x04, 0x02, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x03, 0x04, 0x03, 0x00, 0x00, 0x00, 0x01, 0x06, 0x01, 0x00, 0x01, 0x06, 0x01, 0x00, + 0x00, 0x06, 0x01, 0x01, 0x06, 0x00, 0x00, 0x00, 0x20, 0x20, 0x31, 0x0E, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x06, 0x05, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x10, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; diff --git a/keyboards/hadron/config.h b/keyboards/hadron/config.h index 9111ad727..d54d2c543 100644 --- a/keyboards/hadron/config.h +++ b/keyboards/hadron/config.h @@ -24,7 +24,7 @@ along with this program. If not, see . #define PRODUCT_ID 0x6060 #define MANUFACTURER ishtob #define PRODUCT Hadron Keyboard -#define DESCRIPTION A cherry ML ortholinear keyboard +#define DESCRIPTION A low profile ortholinear keyboard @@ -46,9 +46,9 @@ along with this program. If not, see . #define DEBOUNCING_DELAY 5 /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ -#define LOCKING_SUPPORT_ENABLE +//#define LOCKING_SUPPORT_ENABLE /* Locking resynchronize hack */ -#define LOCKING_RESYNC_ENABLE +//#define LOCKING_RESYNC_ENABLE /* key combination for command */ #define IS_COMMAND() ( \ @@ -70,7 +70,7 @@ along with this program. If not, see . //#define NO_ACTION_LAYER //#define NO_ACTION_TAPPING //#define NO_ACTION_ONESHOT -#define NO_ACTION_MACRO -#define NO_ACTION_FUNCTION +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION diff --git a/keyboards/hadron/hadron.c b/keyboards/hadron/hadron.c index ca5b20e89..fa5065b32 100644 --- a/keyboards/hadron/hadron.c +++ b/keyboards/hadron/hadron.c @@ -1,26 +1,2 @@ #include "hadron.h" - -void matrix_init_kb(void) { - - matrix_init_user(); -} - -void matrix_scan_kb(void) { - // put your looping keyboard code here - // runs every cycle (a lot) - matrix_scan_user(); -} - -bool process_record_kb(uint16_t keycode, keyrecord_t *record) { - // put your per-action keyboard code here - // runs for every action, just before processing by the firmware - - return process_record_user(keycode, record); -} - -void led_set_kb(uint8_t usb_led) { - // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here - - led_set_user(usb_led); -} \ No newline at end of file diff --git a/keyboards/hadron/hadron.h b/keyboards/hadron/hadron.h index a165f4c5c..426face6f 100644 --- a/keyboards/hadron/hadron.h +++ b/keyboards/hadron/hadron.h @@ -7,7 +7,9 @@ #ifdef SUBPROJECT_ver2 #include "ver2.h" #endif - +#ifdef SUBPROJECT_ver3 + #include "ver3.h" +#endif #include "quantum.h" diff --git a/keyboards/hadron/keymaps/default/config.h b/keyboards/hadron/keymaps/default/config.h deleted file mode 100644 index 09922b61b..000000000 --- a/keyboards/hadron/keymaps/default/config.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -#define LEADER_TIMEOUT 300 -//#define BACKLIGHT_BREATHING - -#define USE_I2C -#define SSD1306OLED -#define OLED_ROTATE180 - -/* ws2812 RGB LED*/ -#define RGB_DI_PIN D4 -#define RGBLIGHT_ANIMATIONS -#define RGBLED_NUM 14 // Number of LEDs -#define RGBLIGHT_HUE_STEP 10 -#define RGBLIGHT_SAT_STEP 17 - -#endif diff --git a/keyboards/hadron/keymaps/default/rules.mk b/keyboards/hadron/keymaps/default/rules.mk deleted file mode 100644 index 4c6d04f1e..000000000 --- a/keyboards/hadron/keymaps/default/rules.mk +++ /dev/null @@ -1,24 +0,0 @@ - - -# Build Options -# change to "no" to disable the options, or define them in the Makefile in -# the appropriate keymap folder that will get included automatically -# -BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = no # Mouse keys(+4700) -EXTRAKEY_ENABLE = no # Audio control and System control(+450) -CONSOLE_ENABLE = no # Console for debug(+400) -COMMAND_ENABLE = no # Commands for debug and configuration -NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality -MIDI_ENABLE = no # MIDI controls -AUDIO_ENABLE = no # Audio output on port C6 -UNICODE_ENABLE = no # Unicode -BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. -SWAP_HANDS_ENABLE = no # Enable one-hand typing - -# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE -SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend - -EXTRAFLAGS += -flto diff --git a/keyboards/hadron/keymaps/side_numpad/config.h b/keyboards/hadron/keymaps/side_numpad/config.h deleted file mode 100644 index 09922b61b..000000000 --- a/keyboards/hadron/keymaps/side_numpad/config.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -#define LEADER_TIMEOUT 300 -//#define BACKLIGHT_BREATHING - -#define USE_I2C -#define SSD1306OLED -#define OLED_ROTATE180 - -/* ws2812 RGB LED*/ -#define RGB_DI_PIN D4 -#define RGBLIGHT_ANIMATIONS -#define RGBLED_NUM 14 // Number of LEDs -#define RGBLIGHT_HUE_STEP 10 -#define RGBLIGHT_SAT_STEP 17 - -#endif diff --git a/keyboards/hadron/readme.md b/keyboards/hadron/readme.md index ebebab9e6..13ef6c66a 100644 --- a/keyboards/hadron/readme.md +++ b/keyboards/hadron/readme.md @@ -2,10 +2,10 @@ ![Hadron](https://i.imgur.com/aFbvV08.jpg) -A low-profile Cherry ML ortholinear build. +A low-profile ortholinear build. Keyboard Maintainer: [ishtob](https://github.com/ishtob), [QMK](https://github.com/qmk) -Hardware Supported: Hadron PCB rev0, rev2 +Hardware Supported: Hadron PCB rev0, rev2, rev3 Make example for this keyboard (after setting up your build environment): diff --git a/keyboards/hadron/rules.mk b/keyboards/hadron/rules.mk index 2a8b78045..bd1633f61 100644 --- a/keyboards/hadron/rules.mk +++ b/keyboards/hadron/rules.mk @@ -1,75 +1,2 @@ -# MCU name -#MCU = at90usb1287 -MCU = atmega32u4 - -# Processor frequency. -# This will define a symbol, F_CPU, in all source code files equal to the -# processor frequency in Hz. You can then use this symbol in your source code to -# calculate timings. Do NOT tack on a 'UL' at the end, this will be done -# automatically to create a 32-bit value in your source code. -# -# This will be an integer division of F_USB below, as it is sourced by -# F_USB after it has run through any CPU prescalers. Note that this value -# does not *change* the processor frequency - it should merely be updated to -# reflect the processor speed set externally so that the code can use accurate -# software delays. -F_CPU = 16000000 - -# -# LUFA specific -# -# Target architecture (see library "Board Types" documentation). -ARCH = AVR8 - -# Input clock frequency. -# This will define a symbol, F_USB, in all source code files equal to the -# input clock frequency (before any prescaling is performed) in Hz. This value may -# differ from F_CPU if prescaling is used on the latter, and is required as the -# raw input clock is fed directly to the PLL sections of the AVR for high speed -# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' -# at the end, this will be done automatically to create a 32-bit value in your -# source code. -# -# If no clock division is performed on the input clock inside the AVR (via the -# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. -F_USB = $(F_CPU) - -# Interrupt driven control endpoint task(+60) -OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT - - -# Boot Section Size in *bytes* -# Teensy halfKay 512 -# Teensy++ halfKay 1024 -# Atmel DFU loader 4096 -# LUFA bootloader 4096 -# USBaspLoader 2048 -BOOTLOADER = halfkay - -# Build Options -# change to "no" to disable the options, or define them in the Makefile in -# the appropriate keymap folder that will get included automatically -# -BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = no # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = no # Console for debug(+400) -COMMAND_ENABLE = no # Commands for debug and configuration -NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality -MIDI_ENABLE = no # MIDI controls -AUDIO_ENABLE = no # Audio output on port C6 -UNICODE_ENABLE = no # Unicode -BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. -API_SYSEX_ENABLE = yes - -# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE -SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend - -SRC = i2c.c \ - ssd1306.c DEFAULT_FOLDER = hadron/ver2 - -EXTRAFLAGS += -flto diff --git a/keyboards/hadron/ver2/config.h b/keyboards/hadron/ver2/config.h index 5ee3f931f..e051db209 100644 --- a/keyboards/hadron/ver2/config.h +++ b/keyboards/hadron/ver2/config.h @@ -29,4 +29,15 @@ along with this program. If not, see . #define UNUSED_PINS +#define USE_I2C +#define SSD1306OLED +#define OLED_ROTATE180 + +/* ws2812 RGB LED*/ +#define RGB_DI_PIN D4 +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 14 // Number of LEDs +#define RGBLIGHT_HUE_STEP 10 +#define RGBLIGHT_SAT_STEP 17 + diff --git a/keyboards/hadron/ver2/keymaps/default/config.h b/keyboards/hadron/ver2/keymaps/default/config.h new file mode 100644 index 000000000..e1fdd6dd3 --- /dev/null +++ b/keyboards/hadron/ver2/keymaps/default/config.h @@ -0,0 +1,9 @@ +#pragma once + +#define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \ + SONG(COLEMAK_SOUND) \ + } + +#define LEADER_TIMEOUT 300 +//#define BACKLIGHT_BREATHING + diff --git a/keyboards/hadron/keymaps/default/keymap.c b/keyboards/hadron/ver2/keymaps/default/keymap.c similarity index 95% rename from keyboards/hadron/keymaps/default/keymap.c rename to keyboards/hadron/ver2/keymaps/default/keymap.c index de5979c1d..cc79f5267 100644 --- a/keyboards/hadron/keymaps/default/keymap.c +++ b/keyboards/hadron/ver2/keymaps/default/keymap.c @@ -1,5 +1,4 @@ #include QMK_KEYBOARD_H -#include "LUFA/Drivers/Peripheral/TWI.h" #ifdef AUDIO_ENABLE #include "audio.h" #endif @@ -215,29 +214,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; - -#ifdef AUDIO_ENABLE - -float tone_startup[][2] = SONG(STARTUP_SOUND); -float tone_qwerty[][2] = SONG(QWERTY_SOUND); -float tone_dvorak[][2] = SONG(DVORAK_SOUND); -float tone_colemak[][2] = SONG(COLEMAK_SOUND); -float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); -float tone_goodbye[][2] = SONG(GOODBYE_SOUND); -#endif - // define variables for reactive RGB bool RGB_INIT = false; bool TOG_STATUS = false; int RGB_current_mode; - - -void persistant_default_layer_set(uint16_t default_layer) { - eeconfig_update_default_layer(default_layer); - default_layer_set(default_layer); -} - void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) { if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) { rgblight_mode(RGB_current_mode); @@ -251,19 +232,13 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch (keycode) { case QWERTY: if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_qwerty); - #endif - persistant_default_layer_set(1UL<<_QWERTY); + set_single_persistent_default_layer(_QWERTY); } return false; break; case COLEMAK: if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_colemak); - #endif - persistant_default_layer_set(1UL<<_COLEMAK); + set_single_persistent_default_layer(_COLEMAK); } return false; break; @@ -337,53 +312,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { return true; } -void matrix_init_user(void) { - #ifdef USE_I2C - i2c_master_init(); - #ifdef SSD1306OLED - // calls code for the SSD1306 OLED - _delay_ms(400); - TWI_Init(TWI_BIT_PRESCALE_1, TWI_BITLENGTH_FROM_FREQ(1, 800000)); - iota_gfx_init(); // turns on the display - #endif - #endif - #ifdef AUDIO_ENABLE - startup_user(); - #endif -} -void matrix_scan_user(void) { - #ifdef SSD1306OLED - iota_gfx_task(); // this is what updates the display continuously - #endif -} - -#ifdef AUDIO_ENABLE - -void startup_user() -{ - _delay_ms(20); // gets rid of tick - PLAY_SONG(tone_startup); -} - -void shutdown_user() -{cc - PLAY_SONG(tone_goodbye); - _delay_ms(150); - stop_all_notes(); -} - -void music_on_user(void) -{ - music_scale_user(); -} - -void music_scale_user(void) -{ - PLAY_SONG(music_scale); -} - -#endif /* * Macro definition @@ -404,6 +333,32 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) return MACRO_NONE; } + +//Functions for ver2 +#ifdef KEYBOARD_hadron_ver2 +#include "LUFA/Drivers/Peripheral/TWI.h" +void matrix_init_user(void) { + #ifdef USE_I2C + i2c_master_init(); + #ifdef SSD1306OLED + // calls code for the SSD1306 OLED + _delay_ms(400); + TWI_Init(TWI_BIT_PRESCALE_1, TWI_BITLENGTH_FROM_FREQ(1, 800000)); + iota_gfx_init(); // turns on the display + #endif + #endif + #ifdef AUDIO_ENABLE + startup_user(); + #endif +} + + +void matrix_scan_user(void) { + #ifdef SSD1306OLED + iota_gfx_task(); // this is what updates the display continuously + #endif +} + void matrix_update(struct CharacterMatrix *dest, const struct CharacterMatrix *source) { if (memcmp(dest->display, source->display, sizeof(dest->display))) { @@ -411,7 +366,6 @@ void matrix_update(struct CharacterMatrix *dest, dest->dirty = true; } } - //assign the right code to your layers for OLED display #define L_BASE 0 #define L_LOWER 8 @@ -491,3 +445,4 @@ void iota_gfx_task_user(void) { matrix_update(&display, &matrix); } +#endif \ No newline at end of file diff --git a/keyboards/hadron/keymaps/default/readme.md b/keyboards/hadron/ver2/keymaps/default/readme.md similarity index 100% rename from keyboards/hadron/keymaps/default/readme.md rename to keyboards/hadron/ver2/keymaps/default/readme.md diff --git a/keyboards/hadron/keymaps/readme.md b/keyboards/hadron/ver2/keymaps/readme.md similarity index 100% rename from keyboards/hadron/keymaps/readme.md rename to keyboards/hadron/ver2/keymaps/readme.md diff --git a/keyboards/hadron/ver2/keymaps/side_numpad/config.h b/keyboards/hadron/ver2/keymaps/side_numpad/config.h new file mode 100644 index 000000000..409279a95 --- /dev/null +++ b/keyboards/hadron/ver2/keymaps/side_numpad/config.h @@ -0,0 +1,8 @@ +#pragma once + +#define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND)\ + } + +#define LEADER_TIMEOUT 300 +//#define BACKLIGHT_BREATHING + diff --git a/keyboards/hadron/keymaps/side_numpad/keymap.c b/keyboards/hadron/ver2/keymaps/side_numpad/keymap.c similarity index 97% rename from keyboards/hadron/keymaps/side_numpad/keymap.c rename to keyboards/hadron/ver2/keymaps/side_numpad/keymap.c index fa42c79ea..248bb7ca6 100644 --- a/keyboards/hadron/keymaps/side_numpad/keymap.c +++ b/keyboards/hadron/ver2/keymaps/side_numpad/keymap.c @@ -218,15 +218,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; - -#ifdef AUDIO_ENABLE - -float tone_startup[][2] = SONG(STARTUP_SOUND); -float tone_qwerty[][2] = SONG(QWERTY_SOUND); -float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); -float tone_goodbye[][2] = SONG(GOODBYE_SOUND); -#endif - // define variables for reactive RGB bool RGB_INIT = false; bool TOG_STATUS = false; @@ -234,12 +225,6 @@ bool NUMLAY_STATUS = false; int RGB_current_mode; - -void persistant_default_layer_set(uint16_t default_layer) { - eeconfig_update_default_layer(default_layer); - default_layer_set(default_layer); -} - void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) { if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) { rgblight_mode(RGB_current_mode); @@ -253,10 +238,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch (keycode) { case QWERTY: if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_qwerty); - #endif - persistant_default_layer_set(1UL<<_QWERTY); + set_single_persistent_default_layer(_QWERTY); } return false; break; diff --git a/keyboards/hadron/keymaps/side_numpad/readme.md b/keyboards/hadron/ver2/keymaps/side_numpad/readme.md similarity index 100% rename from keyboards/hadron/keymaps/side_numpad/readme.md rename to keyboards/hadron/ver2/keymaps/side_numpad/readme.md diff --git a/keyboards/hadron/keymaps/side_numpad/rules.mk b/keyboards/hadron/ver2/keymaps/side_numpad/rules.mk similarity index 100% rename from keyboards/hadron/keymaps/side_numpad/rules.mk rename to keyboards/hadron/ver2/keymaps/side_numpad/rules.mk diff --git a/keyboards/hadron/ver2/rules.mk b/keyboards/hadron/ver2/rules.mk index 521493b3d..c47bdb1af 100644 --- a/keyboards/hadron/ver2/rules.mk +++ b/keyboards/hadron/ver2/rules.mk @@ -1 +1,76 @@ -#AUDIO_ENABLE = yes # Audio output on port C6 +# MCU name +#MCU = at90usb1287 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +BOOTLOADER = halfkay + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. +API_SYSEX_ENABLE = yes +SWAP_HANDS_ENABLE = no # Enable one-hand typing + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + + +EXTRAFLAGS += -flto + + +SRC = i2c.c \ + ssd1306.c \ No newline at end of file diff --git a/keyboards/hadron/ver2/ver2.c b/keyboards/hadron/ver2/ver2.c index bc0917746..739f06567 100644 --- a/keyboards/hadron/ver2/ver2.c +++ b/keyboards/hadron/ver2/ver2.c @@ -1 +1,26 @@ -#include "ver2.h" \ No newline at end of file +#include "ver2.h" + + +void matrix_init_kb(void) { + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + + led_set_user(usb_led); +} \ No newline at end of file diff --git a/keyboards/hadron/ver3/boards/GENERIC_STM32_F303XC/board.c b/keyboards/hadron/ver3/boards/GENERIC_STM32_F303XC/board.c new file mode 100644 index 000000000..4331155df --- /dev/null +++ b/keyboards/hadron/ver3/boards/GENERIC_STM32_F303XC/board.c @@ -0,0 +1,126 @@ +/* + ChibiOS - Copyright (C) 2006..2016 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. +*/ + +#include "hal.h" + +#if HAL_USE_PAL || defined(__DOXYGEN__) +/** + * @brief PAL setup. + * @details Digital I/O ports static configuration as defined in @p board.h. + * This variable is used by the HAL when initializing the PAL driver. + */ +const PALConfig pal_default_config = { +#if STM32_HAS_GPIOA + {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, + VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, +#endif +#if STM32_HAS_GPIOB + {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, + VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, +#endif +#if STM32_HAS_GPIOC + {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, + VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, +#endif +#if STM32_HAS_GPIOD + {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, + VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, +#endif +#if STM32_HAS_GPIOE + {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, + VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, +#endif +#if STM32_HAS_GPIOF + {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, + VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH}, +#endif +#if STM32_HAS_GPIOG + {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, + VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH}, +#endif +#if STM32_HAS_GPIOH + {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, + VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH}, +#endif +#if STM32_HAS_GPIOI + {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, + VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH} +#endif +}; +#endif + +void enter_bootloader_mode_if_requested(void); + +/** + * @brief Early initialization code. + * @details This initialization must be performed just after stack setup + * and before any other initialization. + */ +void __early_init(void) { + enter_bootloader_mode_if_requested(); + stm32_clock_init(); +} + +#if HAL_USE_SDC || defined(__DOXYGEN__) +/** + * @brief SDC card detection. + */ +bool sdc_lld_is_card_inserted(SDCDriver *sdcp) { + + (void)sdcp; + /* TODO: Fill the implementation.*/ + return true; +} + +/** + * @brief SDC card write protection detection. + */ +bool sdc_lld_is_write_protected(SDCDriver *sdcp) { + + (void)sdcp; + /* TODO: Fill the implementation.*/ + return false; +} +#endif /* HAL_USE_SDC */ + +#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) +/** + * @brief MMC_SPI card detection. + */ +bool mmc_lld_is_card_inserted(MMCDriver *mmcp) { + + (void)mmcp; + /* TODO: Fill the implementation.*/ + return true; +} + +/** + * @brief MMC_SPI card write protection detection. + */ +bool mmc_lld_is_write_protected(MMCDriver *mmcp) { + + (void)mmcp; + /* TODO: Fill the implementation.*/ + return false; +} +#endif + +/** + * @brief Board-specific initialization code. + * @todo Add your board-specific code, if any. + */ +void boardInit(void) { +} diff --git a/keyboards/hadron/ver3/boards/GENERIC_STM32_F303XC/board.h b/keyboards/hadron/ver3/boards/GENERIC_STM32_F303XC/board.h new file mode 100644 index 000000000..ec26557f3 --- /dev/null +++ b/keyboards/hadron/ver3/boards/GENERIC_STM32_F303XC/board.h @@ -0,0 +1,1187 @@ +/* + ChibiOS - Copyright (C) 2006..2016 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 _BOARD_H_ +#define _BOARD_H_ + +/* + * Setup for Clueboard 60% Keyboard + */ + +/* + * Board identifier. + */ +#define BOARD_GENERIC_STM32_F303XC +#define BOARD_NAME "Planck PCB" + +/* + * Board oscillators-related settings. + * NOTE: LSE not fitted. + */ +#if !defined(STM32_LSECLK) +#define STM32_LSECLK 0U +#endif + +#define STM32_LSEDRV (3U << 3U) + +#if !defined(STM32_HSECLK) +#define STM32_HSECLK 8000000U +#endif + +// #define STM32_HSE_BYPASS + +/* + * MCU type as defined in the ST header. + */ +#define STM32F303xC + +/* + * IO pins assignments. + */ +#define GPIOA_PIN0 0U +#define GPIOA_PIN1 1U +#define GPIOA_PIN2 2U +#define GPIOA_PIN3 3U +#define GPIOA_PIN4 4U +#define GPIOA_PIN5 5U +#define GPIOA_PIN6 6U +#define GPIOA_PIN7 7U +#define GPIOA_PIN8 8U +#define GPIOA_PIN9 9U +#define GPIOA_PIN10 10U +#define GPIOA_USB_DM 11U +#define GPIOA_USB_DP 12U +#define GPIOA_SWDIO 13U +#define GPIOA_SWCLK 14U +#define GPIOA_PIN15 15U + +#define GPIOB_PIN0 0U +#define GPIOB_PIN1 1U +#define GPIOB_PIN2 2U +#define GPIOB_PIN3 3U +#define GPIOB_PIN4 4U +#define GPIOB_PIN5 5U +#define GPIOB_PIN6 6U +#define GPIOB_PIN7 7U +#define GPIOB_PIN8 8U +#define GPIOB_PIN9 9U +#define GPIOB_PIN10 10U +#define GPIOB_PIN11 11U +#define GPIOB_PIN12 12U +#define GPIOB_PIN13 13U +#define GPIOB_PIN14 14U +#define GPIOB_PIN15 15U + +#define GPIOC_PIN0 0U +#define GPIOC_PIN1 1U +#define GPIOC_PIN2 2U +#define GPIOC_PIN3 3U +#define GPIOC_PIN4 4U +#define GPIOC_PIN5 5U +#define GPIOC_PIN6 6U +#define GPIOC_PIN7 7U +#define GPIOC_PIN8 8U +#define GPIOC_PIN9 9U +#define GPIOC_PIN10 10U +#define GPIOC_PIN11 11U +#define GPIOC_PIN12 12U +#define GPIOC_PIN13 13U +#define GPIOC_PIN14 14U +#define GPIOC_PIN15 15U + +#define GPIOD_PIN0 0U +#define GPIOD_PIN1 1U +#define GPIOD_PIN2 2U +#define GPIOD_PIN3 3U +#define GPIOD_PIN4 4U +#define GPIOD_PIN5 5U +#define GPIOD_PIN6 6U +#define GPIOD_PIN7 7U +#define GPIOD_PIN8 8U +#define GPIOD_PIN9 9U +#define GPIOD_PIN10 10U +#define GPIOD_PIN11 11U +#define GPIOD_PIN12 12U +#define GPIOD_PIN13 13U +#define GPIOD_PIN14 14U +#define GPIOD_PIN15 15U + +#define GPIOE_PIN0 0U +#define GPIOE_PIN1 1U +#define GPIOE_PIN2 2U +#define GPIOE_PIN3 3U +#define GPIOE_PIN4 4U +#define GPIOE_PIN5 5U +#define GPIOE_PIN6 6U +#define GPIOE_PIN7 7U +#define GPIOE_PIN8 8U +#define GPIOE_PIN9 9U +#define GPIOE_PIN10 10U +#define GPIOE_PIN11 11U +#define GPIOE_PIN12 12U +#define GPIOE_PIN13 13U +#define GPIOE_PIN14 14U +#define GPIOE_PIN15 15U + +#define GPIOF_I2C2_SDA 0U +#define GPIOF_I2C2_SCL 1U +#define GPIOF_PIN2 2U +#define GPIOF_PIN3 3U +#define GPIOF_PIN4 4U +#define GPIOF_PIN5 5U +#define GPIOF_PIN6 6U +#define GPIOF_PIN7 7U +#define GPIOF_PIN8 8U +#define GPIOF_PIN9 9U +#define GPIOF_PIN10 10U +#define GPIOF_PIN11 11U +#define GPIOF_PIN12 12U +#define GPIOF_PIN13 13U +#define GPIOF_PIN14 14U +#define GPIOF_PIN15 15U + +#define GPIOG_PIN0 0U +#define GPIOG_PIN1 1U +#define GPIOG_PIN2 2U +#define GPIOG_PIN3 3U +#define GPIOG_PIN4 4U +#define GPIOG_PIN5 5U +#define GPIOG_PIN6 6U +#define GPIOG_PIN7 7U +#define GPIOG_PIN8 8U +#define GPIOG_PIN9 9U +#define GPIOG_PIN10 10U +#define GPIOG_PIN11 11U +#define GPIOG_PIN12 12U +#define GPIOG_PIN13 13U +#define GPIOG_PIN14 14U +#define GPIOG_PIN15 15U + +#define GPIOH_PIN0 0U +#define GPIOH_PIN1 1U +#define GPIOH_PIN2 2U +#define GPIOH_PIN3 3U +#define GPIOH_PIN4 4U +#define GPIOH_PIN5 5U +#define GPIOH_PIN6 6U +#define GPIOH_PIN7 7U +#define GPIOH_PIN8 8U +#define GPIOH_PIN9 9U +#define GPIOH_PIN10 10U +#define GPIOH_PIN11 11U +#define GPIOH_PIN12 12U +#define GPIOH_PIN13 13U +#define GPIOH_PIN14 14U +#define GPIOH_PIN15 15U + +/* + * IO lines assignments. + */ +#define LINE_L3GD20_SDI PAL_LINE(GPIOA, 7U) +#define LINE_USB_DM PAL_LINE(GPIOA, 11U) +#define LINE_USB_DP PAL_LINE(GPIOA, 12U) +#define LINE_SWDIO PAL_LINE(GPIOA, 13U) +#define LINE_SWCLK PAL_LINE(GPIOA, 14U) + +#define LINE_PIN6 PAL_LINE(GPIOF, 0U) +#define LINE_PIN7 PAL_LINE(GPIOF, 1U) + +#define LINE_CAPS_LOCK PAL_LINE(GPIOB, 7U) + + +/* + * I/O ports initial setup, this configuration is established soon after reset + * in the initialization code. + * Please refer to the STM32 Reference Manual for details. + */ +#define PIN_MODE_INPUT(n) (0U << ((n) * 2U)) +#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U)) +#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U)) +#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U)) +#define PIN_ODR_LOW(n) (0U << (n)) +#define PIN_ODR_HIGH(n) (1U << (n)) +#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) +#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) +#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U)) +#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U)) +#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U)) +#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U)) +#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U)) +#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U)) +#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U)) +#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U)) + +/* + * GPIOA setup: + * + * PA0 - NC + * PA1 - NC + * PA2 - COL1 + * PA3 - COL2 + * PA4 - SPEAKER1 + * PA5 - SPEAKER2 + * PA6 - COL3 + * PA7 - COL8 + * PA8 - COL6 + * PA9 - COL7 + * PA10 - ROW5 + * PA11 - USB_DM (alternate 14). + * PA12 - USB_DP (alternate 14). + * PA13 - SWDIO (alternate 0). + * PA14 - SWCLK (alternate 0). + * PA15 - ROW4 + */ +#define VAL_GPIOA_MODER (PIN_MODE_INPUT(GPIOA_PIN0) | \ + PIN_MODE_ALTERNATE(GPIOA_PIN1) | \ + PIN_MODE_INPUT(GPIOA_PIN2) | \ + PIN_MODE_INPUT(GPIOA_PIN3) | \ + PIN_MODE_INPUT(GPIOA_PIN4) | \ + PIN_MODE_INPUT(GPIOA_PIN5) | \ + PIN_MODE_INPUT(GPIOA_PIN6) | \ + PIN_MODE_INPUT(GPIOA_PIN7) | \ + PIN_MODE_INPUT(GPIOA_PIN8) | \ + PIN_MODE_INPUT(GPIOA_PIN9) | \ + PIN_MODE_INPUT(GPIOA_PIN10) | \ + PIN_MODE_ALTERNATE(GPIOA_USB_DM) | \ + PIN_MODE_ALTERNATE(GPIOA_USB_DP) | \ + PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \ + PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \ + PIN_MODE_INPUT(GPIOA_PIN15)) +#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOA_USB_DM) | \ + PIN_OTYPE_PUSHPULL(GPIOA_USB_DP) | \ + PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | \ + PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN15)) +#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOA_PIN0) | \ + PIN_OSPEED_HIGH(GPIOA_PIN1) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN10) | \ + PIN_OSPEED_HIGH(GPIOA_USB_DM) | \ + PIN_OSPEED_VERYLOW(GPIOA_USB_DP) | \ + PIN_OSPEED_HIGH(GPIOA_SWDIO) | \ + PIN_OSPEED_HIGH(GPIOA_SWCLK) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN15)) +#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_PIN0) | \ + PIN_PUPDR_FLOATING(GPIOA_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN6) | \ + PIN_PUPDR_FLOATING(GPIOA_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN10) | \ + PIN_PUPDR_FLOATING(GPIOA_USB_DM) | \ + PIN_PUPDR_FLOATING(GPIOA_USB_DP) | \ + PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \ + PIN_PUPDR_PULLDOWN(GPIOA_SWCLK) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN15)) +#define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_PIN0) | \ + PIN_ODR_HIGH(GPIOA_PIN1) | \ + PIN_ODR_HIGH(GPIOA_PIN2) | \ + PIN_ODR_HIGH(GPIOA_PIN3) | \ + PIN_ODR_HIGH(GPIOA_PIN4) | \ + PIN_ODR_HIGH(GPIOA_PIN5) | \ + PIN_ODR_HIGH(GPIOA_PIN6) | \ + PIN_ODR_HIGH(GPIOA_PIN7) | \ + PIN_ODR_HIGH(GPIOA_PIN8) | \ + PIN_ODR_HIGH(GPIOA_PIN9) | \ + PIN_ODR_HIGH(GPIOA_PIN10) | \ + PIN_ODR_HIGH(GPIOA_USB_DM) | \ + PIN_ODR_HIGH(GPIOA_USB_DP) | \ + PIN_ODR_HIGH(GPIOA_SWDIO) | \ + PIN_ODR_HIGH(GPIOA_SWCLK) | \ + PIN_ODR_HIGH(GPIOA_PIN15)) +#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_PIN0, 0) | \ + PIN_AFIO_AF(GPIOA_PIN1, 1) | \ + PIN_AFIO_AF(GPIOA_PIN2, 0) | \ + PIN_AFIO_AF(GPIOA_PIN3, 0) | \ + PIN_AFIO_AF(GPIOA_PIN4, 0) | \ + PIN_AFIO_AF(GPIOA_PIN5, 5) | \ + PIN_AFIO_AF(GPIOA_PIN6, 5) | \ + PIN_AFIO_AF(GPIOA_PIN7, 5)) +#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_PIN8, 0) | \ + PIN_AFIO_AF(GPIOA_PIN9, 0) | \ + PIN_AFIO_AF(GPIOA_PIN10, 0) | \ + PIN_AFIO_AF(GPIOA_USB_DM, 14) | \ + PIN_AFIO_AF(GPIOA_USB_DP, 14) | \ + PIN_AFIO_AF(GPIOA_SWDIO, 0) | \ + PIN_AFIO_AF(GPIOA_SWCLK, 0) | \ + PIN_AFIO_AF(GPIOA_PIN15, 0)) + +/* + * GPIOB setup: + * + * PB0 - PIN0 (input pullup). + * PB1 - PIN1 (input pullup). + * PB2 - PIN2 (input pullup). + * PB3 - PIN3 (alternate 0). + * PB4 - PIN4 (input pullup). + * PB5 - PIN5 (input pullup). + * PB6 - PIN6 LSM303DLHC_SCL (alternate 4). + * PB7 - PIN7 LSM303DLHC_SDA (alternate 4). + * PB8 - PIN8 (input pullup). + * PB9 - PIN9 (input pullup). + * PB10 - PIN10 (input pullup). + * PB11 - PIN11 (input pullup). + * PB12 - PIN12 (input pullup). + * PB13 - PIN13 (input pullup). + * PB14 - PIN14 (input pullup). + * PB15 - PIN15 (input pullup). + */ +#define VAL_GPIOB_MODER (PIN_MODE_INPUT(GPIOB_PIN0) | \ + PIN_MODE_INPUT(GPIOB_PIN1) | \ + PIN_MODE_INPUT(GPIOB_PIN2) | \ + PIN_MODE_ALTERNATE(GPIOB_PIN3) | \ + PIN_MODE_INPUT(GPIOB_PIN4) | \ + PIN_MODE_INPUT(GPIOB_PIN5) | \ + PIN_MODE_ALTERNATE(GPIOB_PIN6) | \ + PIN_MODE_OUTPUT(GPIOB_PIN7) | \ + PIN_MODE_INPUT(GPIOB_PIN8) | \ + PIN_MODE_INPUT(GPIOB_PIN9) | \ + PIN_MODE_INPUT(GPIOB_PIN10) | \ + PIN_MODE_INPUT(GPIOB_PIN11) | \ + PIN_MODE_INPUT(GPIOB_PIN12) | \ + PIN_MODE_INPUT(GPIOB_PIN13) | \ + PIN_MODE_INPUT(GPIOB_PIN14) | \ + PIN_MODE_INPUT(GPIOB_PIN15)) +#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN5) | \ + PIN_OTYPE_OPENDRAIN(GPIOB_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN15)) +#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOB_PIN0) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN1) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN2) | \ + PIN_OSPEED_HIGH(GPIOB_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN5) | \ + PIN_OSPEED_HIGH(GPIOB_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN10) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN11) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN12) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN13) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN14) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN15)) +#define VAL_GPIOB_PUPDR (PIN_PUPDR_PULLUP(GPIOB_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN2) | \ + PIN_PUPDR_FLOATING(GPIOB_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN5) | \ + PIN_PUPDR_FLOATING(GPIOB_PIN6) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN15)) +#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_PIN0) | \ + PIN_ODR_HIGH(GPIOB_PIN1) | \ + PIN_ODR_HIGH(GPIOB_PIN2) | \ + PIN_ODR_HIGH(GPIOB_PIN3) | \ + PIN_ODR_HIGH(GPIOB_PIN4) | \ + PIN_ODR_HIGH(GPIOB_PIN5) | \ + PIN_ODR_HIGH(GPIOB_PIN6) | \ + PIN_ODR_LOW(GPIOB_PIN7) | \ + PIN_ODR_HIGH(GPIOB_PIN8) | \ + PIN_ODR_HIGH(GPIOB_PIN9) | \ + PIN_ODR_HIGH(GPIOB_PIN10) | \ + PIN_ODR_HIGH(GPIOB_PIN11) | \ + PIN_ODR_HIGH(GPIOB_PIN12) | \ + PIN_ODR_HIGH(GPIOB_PIN13) | \ + PIN_ODR_HIGH(GPIOB_PIN14) | \ + PIN_ODR_HIGH(GPIOB_PIN15)) +#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0) | \ + PIN_AFIO_AF(GPIOB_PIN1, 0) | \ + PIN_AFIO_AF(GPIOB_PIN2, 0) | \ + PIN_AFIO_AF(GPIOB_PIN3, 0) | \ + PIN_AFIO_AF(GPIOB_PIN4, 0) | \ + PIN_AFIO_AF(GPIOB_PIN5, 0) | \ + PIN_AFIO_AF(GPIOB_PIN6, 4) | \ + PIN_AFIO_AF(GPIOB_PIN7, 0)) +#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0) | \ + PIN_AFIO_AF(GPIOB_PIN9, 0) | \ + PIN_AFIO_AF(GPIOB_PIN10, 0) | \ + PIN_AFIO_AF(GPIOB_PIN11, 0) | \ + PIN_AFIO_AF(GPIOB_PIN12, 0) | \ + PIN_AFIO_AF(GPIOB_PIN13, 0) | \ + PIN_AFIO_AF(GPIOB_PIN14, 0) | \ + PIN_AFIO_AF(GPIOB_PIN15, 0)) + +/* + * GPIOC setup: + * + * PC0 - PIN0 (input pullup). + * PC1 - PIN1 (input pullup). + * PC2 - PIN2 (input pullup). + * PC3 - PIN3 (input pullup). + * PC4 - PIN4 (input pullup). + * PC5 - PIN5 (input pullup). + * PC6 - PIN6 (input pullup). + * PC7 - PIN7 (input pullup). + * PC8 - PIN8 (input pullup). + * PC9 - PIN9 (input pullup). + * PC10 - PIN10 (input pullup). + * PC11 - PIN11 (input pullup). + * PC12 - PIN12 (input pullup). + * PC13 - PIN13 (input pullup). + * PC14 - PIN14 (input floating). + * PC15 - PIN15 (input floating). + */ +#define VAL_GPIOC_MODER (PIN_MODE_INPUT(GPIOC_PIN0) | \ + PIN_MODE_INPUT(GPIOC_PIN1) | \ + PIN_MODE_INPUT(GPIOC_PIN2) | \ + PIN_MODE_INPUT(GPIOC_PIN3) | \ + PIN_MODE_INPUT(GPIOC_PIN4) | \ + PIN_MODE_INPUT(GPIOC_PIN5) | \ + PIN_MODE_INPUT(GPIOC_PIN6) | \ + PIN_MODE_INPUT(GPIOC_PIN7) | \ + PIN_MODE_INPUT(GPIOC_PIN8) | \ + PIN_MODE_INPUT(GPIOC_PIN9) | \ + PIN_MODE_INPUT(GPIOC_PIN10) | \ + PIN_MODE_INPUT(GPIOC_PIN11) | \ + PIN_MODE_INPUT(GPIOC_PIN12) | \ + PIN_MODE_INPUT(GPIOC_PIN13) | \ + PIN_MODE_INPUT(GPIOC_PIN14) | \ + PIN_MODE_INPUT(GPIOC_PIN15)) +#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN15)) +#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOC_PIN0) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN1) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN10) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN11) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN12) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN13) | \ + PIN_OSPEED_HIGH(GPIOC_PIN14) | \ + PIN_OSPEED_HIGH(GPIOC_PIN15)) +#define VAL_GPIOC_PUPDR (PIN_PUPDR_PULLUP(GPIOC_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN13) | \ + PIN_PUPDR_FLOATING(GPIOC_PIN14) | \ + PIN_PUPDR_FLOATING(GPIOC_PIN15)) +#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_PIN0) | \ + PIN_ODR_HIGH(GPIOC_PIN1) | \ + PIN_ODR_HIGH(GPIOC_PIN2) | \ + PIN_ODR_HIGH(GPIOC_PIN3) | \ + PIN_ODR_HIGH(GPIOC_PIN4) | \ + PIN_ODR_HIGH(GPIOC_PIN5) | \ + PIN_ODR_HIGH(GPIOC_PIN6) | \ + PIN_ODR_HIGH(GPIOC_PIN7) | \ + PIN_ODR_HIGH(GPIOC_PIN8) | \ + PIN_ODR_HIGH(GPIOC_PIN9) | \ + PIN_ODR_HIGH(GPIOC_PIN10) | \ + PIN_ODR_HIGH(GPIOC_PIN11) | \ + PIN_ODR_HIGH(GPIOC_PIN12) | \ + PIN_ODR_HIGH(GPIOC_PIN13) | \ + PIN_ODR_HIGH(GPIOC_PIN14) | \ + PIN_ODR_HIGH(GPIOC_PIN15)) +#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_PIN0, 0) | \ + PIN_AFIO_AF(GPIOC_PIN1, 0) | \ + PIN_AFIO_AF(GPIOC_PIN2, 0) | \ + PIN_AFIO_AF(GPIOC_PIN3, 0) | \ + PIN_AFIO_AF(GPIOC_PIN4, 0) | \ + PIN_AFIO_AF(GPIOC_PIN5, 0) | \ + PIN_AFIO_AF(GPIOC_PIN6, 0) | \ + PIN_AFIO_AF(GPIOC_PIN7, 0)) +#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_PIN8, 0) | \ + PIN_AFIO_AF(GPIOC_PIN9, 0) | \ + PIN_AFIO_AF(GPIOC_PIN10, 0) | \ + PIN_AFIO_AF(GPIOC_PIN11, 0) | \ + PIN_AFIO_AF(GPIOC_PIN12, 0) | \ + PIN_AFIO_AF(GPIOC_PIN13, 0) | \ + PIN_AFIO_AF(GPIOC_PIN14, 0) | \ + PIN_AFIO_AF(GPIOC_PIN15, 0)) + +/* + * GPIOD setup: + * + * PD0 - PIN0 (input pullup). + * PD1 - PIN1 (input pullup). + * PD2 - PIN2 (input pullup). + * PD3 - PIN3 (input pullup). + * PD4 - PIN4 (input pullup). + * PD5 - PIN5 (input pullup). + * PD6 - PIN6 (input pullup). + * PD7 - PIN7 (input pullup). + * PD8 - PIN8 (input pullup). + * PD9 - PIN9 (input pullup). + * PD11 - PIN10 (input pullup). + * PD11 - PIN11 (input pullup). + * PD12 - PIN12 (input pullup). + * PD13 - PIN13 (input pullup). + * PD14 - PIN14 (input pullup). + * PD15 - PIN15 (input pullup). + */ +#define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_PIN0) | \ + PIN_MODE_INPUT(GPIOD_PIN1) | \ + PIN_MODE_INPUT(GPIOD_PIN2) | \ + PIN_MODE_INPUT(GPIOD_PIN3) | \ + PIN_MODE_INPUT(GPIOD_PIN4) | \ + PIN_MODE_INPUT(GPIOD_PIN5) | \ + PIN_MODE_INPUT(GPIOD_PIN6) | \ + PIN_MODE_INPUT(GPIOD_PIN7) | \ + PIN_MODE_INPUT(GPIOD_PIN8) | \ + PIN_MODE_INPUT(GPIOD_PIN9) | \ + PIN_MODE_INPUT(GPIOD_PIN10) | \ + PIN_MODE_INPUT(GPIOD_PIN11) | \ + PIN_MODE_INPUT(GPIOD_PIN12) | \ + PIN_MODE_INPUT(GPIOD_PIN13) | \ + PIN_MODE_INPUT(GPIOD_PIN14) | \ + PIN_MODE_INPUT(GPIOD_PIN15)) +#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN15)) +#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOD_PIN0) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN1) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN10) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN11) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN12) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN13) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN14) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN15)) +#define VAL_GPIOD_PUPDR (PIN_PUPDR_PULLUP(GPIOD_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN15)) +#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \ + PIN_ODR_HIGH(GPIOD_PIN1) | \ + PIN_ODR_HIGH(GPIOD_PIN2) | \ + PIN_ODR_HIGH(GPIOD_PIN3) | \ + PIN_ODR_HIGH(GPIOD_PIN4) | \ + PIN_ODR_HIGH(GPIOD_PIN5) | \ + PIN_ODR_HIGH(GPIOD_PIN6) | \ + PIN_ODR_HIGH(GPIOD_PIN7) | \ + PIN_ODR_HIGH(GPIOD_PIN8) | \ + PIN_ODR_HIGH(GPIOD_PIN9) | \ + PIN_ODR_HIGH(GPIOD_PIN10) | \ + PIN_ODR_HIGH(GPIOD_PIN11) | \ + PIN_ODR_HIGH(GPIOD_PIN12) | \ + PIN_ODR_HIGH(GPIOD_PIN13) | \ + PIN_ODR_HIGH(GPIOD_PIN14) | \ + PIN_ODR_HIGH(GPIOD_PIN15)) +#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0) | \ + PIN_AFIO_AF(GPIOD_PIN1, 0) | \ + PIN_AFIO_AF(GPIOD_PIN2, 0) | \ + PIN_AFIO_AF(GPIOD_PIN3, 0) | \ + PIN_AFIO_AF(GPIOD_PIN4, 0) | \ + PIN_AFIO_AF(GPIOD_PIN5, 0) | \ + PIN_AFIO_AF(GPIOD_PIN6, 0) | \ + PIN_AFIO_AF(GPIOD_PIN7, 0)) +#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0) | \ + PIN_AFIO_AF(GPIOD_PIN9, 0) | \ + PIN_AFIO_AF(GPIOD_PIN10, 0) | \ + PIN_AFIO_AF(GPIOD_PIN11, 0) | \ + PIN_AFIO_AF(GPIOD_PIN12, 0) | \ + PIN_AFIO_AF(GPIOD_PIN13, 0) | \ + PIN_AFIO_AF(GPIOD_PIN14, 0) | \ + PIN_AFIO_AF(GPIOD_PIN15, 0)) + +/* + * GPIOE setup: + * + * PE0 - PIN0 (input pullup). + * PE1 - PIN1 (input pullup). + * PE2 - PIN2 (input pullup). + * PE3 - PIN3 L3GD20_CS (output pushpull maximum). + * PE4 - PIN4 (input pullup). + * PE5 - PIN5 (input pullup). + * PE6 - PIN6 (input pullup). + * PE7 - PIN7 (input pullup). + * PE8 - PIN8 (output pushpull maximum). + * PE9 - PIN9 (output pushpull maximum). + * PE10 - PIN10 (output pushpull maximum). + * PE11 - PIN11 (output pushpull maximum). + * PE12 - PIN12 (output pushpull maximum). + * PE13 - PIN13 (output pushpull maximum). + * PE14 - PIN14 (output pushpull maximum). + * PE15 - PIN15 (output pushpull maximum). + */ +#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_PIN0) | \ + PIN_MODE_INPUT(GPIOE_PIN1) | \ + PIN_MODE_INPUT(GPIOE_PIN2) |\ + PIN_MODE_OUTPUT(GPIOE_PIN3) | \ + PIN_MODE_INPUT(GPIOE_PIN4) |\ + PIN_MODE_INPUT(GPIOE_PIN5) |\ + PIN_MODE_INPUT(GPIOE_PIN6) | \ + PIN_MODE_INPUT(GPIOE_PIN7) | \ + PIN_MODE_OUTPUT(GPIOE_PIN8) | \ + PIN_MODE_OUTPUT(GPIOE_PIN9) | \ + PIN_MODE_OUTPUT(GPIOE_PIN10) | \ + PIN_MODE_OUTPUT(GPIOE_PIN11) | \ + PIN_MODE_OUTPUT(GPIOE_PIN12) | \ + PIN_MODE_OUTPUT(GPIOE_PIN13) | \ + PIN_MODE_OUTPUT(GPIOE_PIN14) | \ + PIN_MODE_OUTPUT(GPIOE_PIN15)) +#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) |\ + PIN_OTYPE_PUSHPULL(GPIOE_PIN1) |\ + PIN_OTYPE_PUSHPULL(GPIOE_PIN2) |\ + PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN4) |\ + PIN_OTYPE_PUSHPULL(GPIOE_PIN5) |\ + PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN10) |\ + PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN14) |\ + PIN_OTYPE_PUSHPULL(GPIOE_PIN15)) +#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOE_PIN0) |\ + PIN_OSPEED_VERYLOW(GPIOE_PIN1) |\ + PIN_OSPEED_VERYLOW(GPIOE_PIN2) |\ + PIN_OSPEED_HIGH(GPIOE_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOE_PIN4) |\ + PIN_OSPEED_VERYLOW(GPIOE_PIN5) |\ + PIN_OSPEED_VERYLOW(GPIOE_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOE_PIN7) | \ + PIN_OSPEED_HIGH(GPIOE_PIN8) | \ + PIN_OSPEED_HIGH(GPIOE_PIN9) | \ + PIN_OSPEED_HIGH(GPIOE_PIN10) | \ + PIN_OSPEED_HIGH(GPIOE_PIN11) | \ + PIN_OSPEED_HIGH(GPIOE_PIN12) | \ + PIN_OSPEED_HIGH(GPIOE_PIN13) | \ + PIN_OSPEED_HIGH(GPIOE_PIN14) | \ + PIN_OSPEED_HIGH(GPIOE_PIN15)) +#define VAL_GPIOE_PUPDR (PIN_PUPDR_PULLUP(GPIOE_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN2) |\ + PIN_PUPDR_FLOATING(GPIOE_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN4) |\ + PIN_PUPDR_PULLUP(GPIOE_PIN5) |\ + PIN_PUPDR_PULLUP(GPIOE_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN10) | \ + PIN_PUPDR_FLOATING(GPIOE_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN12) | \ + PIN_PUPDR_FLOATING(GPIOE_PIN13) | \ + PIN_PUPDR_FLOATING(GPIOE_PIN14) |\ + PIN_PUPDR_FLOATING(GPIOE_PIN15)) +#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \ + PIN_ODR_HIGH(GPIOE_PIN1) | \ + PIN_ODR_HIGH(GPIOE_PIN2) | \ + PIN_ODR_HIGH(GPIOE_PIN3) | \ + PIN_ODR_HIGH(GPIOE_PIN4) | \ + PIN_ODR_HIGH(GPIOE_PIN5) | \ + PIN_ODR_HIGH(GPIOE_PIN6) | \ + PIN_ODR_HIGH(GPIOE_PIN7) | \ + PIN_ODR_LOW(GPIOE_PIN8) | \ + PIN_ODR_LOW(GPIOE_PIN9) | \ + PIN_ODR_LOW(GPIOE_PIN10) | \ + PIN_ODR_LOW(GPIOE_PIN11) | \ + PIN_ODR_LOW(GPIOE_PIN12) | \ + PIN_ODR_LOW(GPIOE_PIN13) | \ + PIN_ODR_LOW(GPIOE_PIN14) | \ + PIN_ODR_LOW(GPIOE_PIN15)) +#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0) | \ + PIN_AFIO_AF(GPIOE_PIN1, 0) | \ + PIN_AFIO_AF(GPIOE_PIN2, 0) |\ + PIN_AFIO_AF(GPIOE_PIN3, 0) | \ + PIN_AFIO_AF(GPIOE_PIN4, 0) |\ + PIN_AFIO_AF(GPIOE_PIN5, 0) |\ + PIN_AFIO_AF(GPIOE_PIN6, 0) | \ + PIN_AFIO_AF(GPIOE_PIN7, 0)) +#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0) | \ + PIN_AFIO_AF(GPIOE_PIN9, 0) | \ + PIN_AFIO_AF(GPIOE_PIN10, 0) | \ + PIN_AFIO_AF(GPIOE_PIN11, 0) | \ + PIN_AFIO_AF(GPIOE_PIN12, 0) | \ + PIN_AFIO_AF(GPIOE_PIN13, 0) | \ + PIN_AFIO_AF(GPIOE_PIN14, 0) | \ + PIN_AFIO_AF(GPIOE_PIN15, 0)) + +/* + * GPIOF setup: + * + * PF0 - I2C2_SDA (input floating). + * PF1 - I2C2_SCL (input floating). + * PF2 - PIN2 (input pullup). + * PF3 - PIN3 (input pullup). + * PF4 - PIN4 (input pullup). + * PF5 - PIN5 (input pullup). + * PF6 - PIN6 (input pullup). + * PF7 - PIN7 (input pullup). + * PF8 - PIN8 (input pullup). + * PF9 - PIN9 (input pullup). + * PF10 - PIN10 (input pullup). + * PF11 - PIN11 (input pullup). + * PF12 - PIN12 (input pullup). + * PF13 - PIN13 (input pullup). + * PF14 - PIN14 (input pullup). + * PF15 - PIN15 (input pullup). + */ +#define VAL_GPIOF_MODER (PIN_MODE_INPUT(GPIOF_I2C2_SDA) | \ + PIN_MODE_INPUT(GPIOF_I2C2_SCL) | \ + PIN_MODE_INPUT(GPIOF_PIN2) | \ + PIN_MODE_INPUT(GPIOF_PIN3) | \ + PIN_MODE_INPUT(GPIOF_PIN4) | \ + PIN_MODE_INPUT(GPIOF_PIN5) | \ + PIN_MODE_INPUT(GPIOF_PIN6) | \ + PIN_MODE_INPUT(GPIOF_PIN7) | \ + PIN_MODE_INPUT(GPIOF_PIN8) | \ + PIN_MODE_INPUT(GPIOF_PIN9) | \ + PIN_MODE_INPUT(GPIOF_PIN10) | \ + PIN_MODE_INPUT(GPIOF_PIN11) | \ + PIN_MODE_INPUT(GPIOF_PIN12) | \ + PIN_MODE_INPUT(GPIOF_PIN13) | \ + PIN_MODE_INPUT(GPIOF_PIN14) | \ + PIN_MODE_INPUT(GPIOF_PIN15)) +#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_I2C2_SDA) | \ + PIN_OTYPE_PUSHPULL(GPIOF_I2C2_SCL) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN15)) +#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_HIGH(GPIOF_I2C2_SDA) | \ + PIN_OSPEED_HIGH(GPIOF_I2C2_SCL) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN10) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN11) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN12) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN13) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN14) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN15)) +#define VAL_GPIOF_PUPDR (PIN_PUPDR_FLOATING(GPIOF_I2C2_SDA) | \ + PIN_PUPDR_FLOATING(GPIOF_I2C2_SCL) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN15)) +#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_I2C2_SDA) | \ + PIN_ODR_HIGH(GPIOF_I2C2_SCL) | \ + PIN_ODR_HIGH(GPIOF_PIN2) | \ + PIN_ODR_HIGH(GPIOF_PIN3) | \ + PIN_ODR_HIGH(GPIOF_PIN4) | \ + PIN_ODR_HIGH(GPIOF_PIN5) | \ + PIN_ODR_HIGH(GPIOF_PIN6) | \ + PIN_ODR_HIGH(GPIOF_PIN7) | \ + PIN_ODR_HIGH(GPIOF_PIN8) | \ + PIN_ODR_HIGH(GPIOF_PIN9) | \ + PIN_ODR_HIGH(GPIOF_PIN10) | \ + PIN_ODR_HIGH(GPIOF_PIN11) | \ + PIN_ODR_HIGH(GPIOF_PIN12) | \ + PIN_ODR_HIGH(GPIOF_PIN13) | \ + PIN_ODR_HIGH(GPIOF_PIN14) | \ + PIN_ODR_HIGH(GPIOF_PIN15)) +#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_I2C2_SDA, 0) | \ + PIN_AFIO_AF(GPIOF_I2C2_SCL, 0) | \ + PIN_AFIO_AF(GPIOF_PIN2, 0) | \ + PIN_AFIO_AF(GPIOF_PIN3, 0) | \ + PIN_AFIO_AF(GPIOF_PIN4, 0) | \ + PIN_AFIO_AF(GPIOF_PIN5, 0) | \ + PIN_AFIO_AF(GPIOF_PIN6, 0) | \ + PIN_AFIO_AF(GPIOF_PIN7, 0)) +#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0) | \ + PIN_AFIO_AF(GPIOF_PIN9, 0) | \ + PIN_AFIO_AF(GPIOF_PIN10, 0) | \ + PIN_AFIO_AF(GPIOF_PIN11, 0) | \ + PIN_AFIO_AF(GPIOF_PIN12, 0) | \ + PIN_AFIO_AF(GPIOF_PIN13, 0) | \ + PIN_AFIO_AF(GPIOF_PIN14, 0) | \ + PIN_AFIO_AF(GPIOF_PIN15, 0)) + +/* + * GPIOG setup: + * + * PG0 - PIN0 (input pullup). + * PG1 - PIN1 (input pullup). + * PG2 - PIN2 (input pullup). + * PG3 - PIN3 (input pullup). + * PG4 - PIN4 (input pullup). + * PG5 - PIN5 (input pullup). + * PG6 - PIN6 (input pullup). + * PG7 - PIN7 (input pullup). + * PG8 - PIN8 (input pullup). + * PG9 - PIN9 (input pullup). + * PG10 - PIN10 (input pullup). + * PG11 - PIN11 (input pullup). + * PG12 - PIN12 (input pullup). + * PG13 - PIN13 (input pullup). + * PG14 - PIN14 (input pullup). + * PG15 - PIN15 (input pullup). + */ +#define VAL_GPIOG_MODER (PIN_MODE_INPUT(GPIOG_PIN0) | \ + PIN_MODE_INPUT(GPIOG_PIN1) | \ + PIN_MODE_INPUT(GPIOG_PIN2) | \ + PIN_MODE_INPUT(GPIOG_PIN3) | \ + PIN_MODE_INPUT(GPIOG_PIN4) | \ + PIN_MODE_INPUT(GPIOG_PIN5) | \ + PIN_MODE_INPUT(GPIOG_PIN6) | \ + PIN_MODE_INPUT(GPIOG_PIN7) | \ + PIN_MODE_INPUT(GPIOG_PIN8) | \ + PIN_MODE_INPUT(GPIOG_PIN9) | \ + PIN_MODE_INPUT(GPIOG_PIN10) | \ + PIN_MODE_INPUT(GPIOG_PIN11) | \ + PIN_MODE_INPUT(GPIOG_PIN12) | \ + PIN_MODE_INPUT(GPIOG_PIN13) | \ + PIN_MODE_INPUT(GPIOG_PIN14) | \ + PIN_MODE_INPUT(GPIOG_PIN15)) +#define VAL_GPIOG_OTYPER (PIN_OTYPE_PUSHPULL(GPIOG_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN15)) +#define VAL_GPIOG_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOG_PIN0) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN1) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN10) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN11) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN12) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN13) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN14) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN15)) +#define VAL_GPIOG_PUPDR (PIN_PUPDR_PULLUP(GPIOG_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN15)) +#define VAL_GPIOG_ODR (PIN_ODR_HIGH(GPIOG_PIN0) | \ + PIN_ODR_HIGH(GPIOG_PIN1) | \ + PIN_ODR_HIGH(GPIOG_PIN2) | \ + PIN_ODR_HIGH(GPIOG_PIN3) | \ + PIN_ODR_HIGH(GPIOG_PIN4) | \ + PIN_ODR_HIGH(GPIOG_PIN5) | \ + PIN_ODR_HIGH(GPIOG_PIN6) | \ + PIN_ODR_HIGH(GPIOG_PIN7) | \ + PIN_ODR_HIGH(GPIOG_PIN8) | \ + PIN_ODR_HIGH(GPIOG_PIN9) | \ + PIN_ODR_HIGH(GPIOG_PIN10) | \ + PIN_ODR_HIGH(GPIOG_PIN11) | \ + PIN_ODR_HIGH(GPIOG_PIN12) | \ + PIN_ODR_HIGH(GPIOG_PIN13) | \ + PIN_ODR_HIGH(GPIOG_PIN14) | \ + PIN_ODR_HIGH(GPIOG_PIN15)) +#define VAL_GPIOG_AFRL (PIN_AFIO_AF(GPIOG_PIN0, 0) | \ + PIN_AFIO_AF(GPIOG_PIN1, 0) | \ + PIN_AFIO_AF(GPIOG_PIN2, 0) | \ + PIN_AFIO_AF(GPIOG_PIN3, 0) | \ + PIN_AFIO_AF(GPIOG_PIN4, 0) | \ + PIN_AFIO_AF(GPIOG_PIN5, 0) | \ + PIN_AFIO_AF(GPIOG_PIN6, 0) | \ + PIN_AFIO_AF(GPIOG_PIN7, 0)) +#define VAL_GPIOG_AFRH (PIN_AFIO_AF(GPIOG_PIN8, 0) | \ + PIN_AFIO_AF(GPIOG_PIN9, 0) | \ + PIN_AFIO_AF(GPIOG_PIN10, 0) | \ + PIN_AFIO_AF(GPIOG_PIN11, 0) | \ + PIN_AFIO_AF(GPIOG_PIN12, 0) | \ + PIN_AFIO_AF(GPIOG_PIN13, 0) | \ + PIN_AFIO_AF(GPIOG_PIN14, 0) | \ + PIN_AFIO_AF(GPIOG_PIN15, 0)) + +/* + * GPIOH setup: + * + * PH0 - PIN0 (input pullup). + * PH1 - PIN1 (input pullup). + * PH2 - PIN2 (input pullup). + * PH3 - PIN3 (input pullup). + * PH4 - PIN4 (input pullup). + * PH5 - PIN5 (input pullup). + * PH6 - PIN6 (input pullup). + * PH7 - PIN7 (input pullup). + * PH8 - PIN8 (input pullup). + * PH9 - PIN9 (input pullup). + * PH10 - PIN10 (input pullup). + * PH11 - PIN11 (input pullup). + * PH12 - PIN12 (input pullup). + * PH13 - PIN13 (input pullup). + * PH14 - PIN14 (input pullup). + * PH15 - PIN15 (input pullup). + */ +#define VAL_GPIOH_MODER (PIN_MODE_INPUT(GPIOH_PIN0) | \ + PIN_MODE_INPUT(GPIOH_PIN1) | \ + PIN_MODE_INPUT(GPIOH_PIN2) | \ + PIN_MODE_INPUT(GPIOH_PIN3) | \ + PIN_MODE_INPUT(GPIOH_PIN4) | \ + PIN_MODE_INPUT(GPIOH_PIN5) | \ + PIN_MODE_INPUT(GPIOH_PIN6) | \ + PIN_MODE_INPUT(GPIOH_PIN7) | \ + PIN_MODE_INPUT(GPIOH_PIN8) | \ + PIN_MODE_INPUT(GPIOH_PIN9) | \ + PIN_MODE_INPUT(GPIOH_PIN10) | \ + PIN_MODE_INPUT(GPIOH_PIN11) | \ + PIN_MODE_INPUT(GPIOH_PIN12) | \ + PIN_MODE_INPUT(GPIOH_PIN13) | \ + PIN_MODE_INPUT(GPIOH_PIN14) | \ + PIN_MODE_INPUT(GPIOH_PIN15)) +#define VAL_GPIOH_OTYPER (PIN_OTYPE_PUSHPULL(GPIOH_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN15)) +#define VAL_GPIOH_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOH_PIN0) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN1) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN10) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN11) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN12) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN13) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN14) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN15)) +#define VAL_GPIOH_PUPDR (PIN_PUPDR_PULLUP(GPIOH_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN15)) +#define VAL_GPIOH_ODR (PIN_ODR_HIGH(GPIOH_PIN0) | \ + PIN_ODR_HIGH(GPIOH_PIN1) | \ + PIN_ODR_HIGH(GPIOH_PIN2) | \ + PIN_ODR_HIGH(GPIOH_PIN3) | \ + PIN_ODR_HIGH(GPIOH_PIN4) | \ + PIN_ODR_HIGH(GPIOH_PIN5) | \ + PIN_ODR_HIGH(GPIOH_PIN6) | \ + PIN_ODR_HIGH(GPIOH_PIN7) | \ + PIN_ODR_HIGH(GPIOH_PIN8) | \ + PIN_ODR_HIGH(GPIOH_PIN9) | \ + PIN_ODR_HIGH(GPIOH_PIN10) | \ + PIN_ODR_HIGH(GPIOH_PIN11) | \ + PIN_ODR_HIGH(GPIOH_PIN12) | \ + PIN_ODR_HIGH(GPIOH_PIN13) | \ + PIN_ODR_HIGH(GPIOH_PIN14) | \ + PIN_ODR_HIGH(GPIOH_PIN15)) +#define VAL_GPIOH_AFRL (PIN_AFIO_AF(GPIOH_PIN0, 0) | \ + PIN_AFIO_AF(GPIOH_PIN1, 0) | \ + PIN_AFIO_AF(GPIOH_PIN2, 0) | \ + PIN_AFIO_AF(GPIOH_PIN3, 0) | \ + PIN_AFIO_AF(GPIOH_PIN4, 0) | \ + PIN_AFIO_AF(GPIOH_PIN5, 0) | \ + PIN_AFIO_AF(GPIOH_PIN6, 0) | \ + PIN_AFIO_AF(GPIOH_PIN7, 0)) +#define VAL_GPIOH_AFRH (PIN_AFIO_AF(GPIOH_PIN8, 0) | \ + PIN_AFIO_AF(GPIOH_PIN9, 0) | \ + PIN_AFIO_AF(GPIOH_PIN10, 0) | \ + PIN_AFIO_AF(GPIOH_PIN11, 0) | \ + PIN_AFIO_AF(GPIOH_PIN12, 0) | \ + PIN_AFIO_AF(GPIOH_PIN13, 0) | \ + PIN_AFIO_AF(GPIOH_PIN14, 0) | \ + PIN_AFIO_AF(GPIOH_PIN15, 0)) + + +/* + * USB bus activation macro, required by the USB driver. + */ +// #define usb_lld_connect_bus(usbp) +#define usb_lld_connect_bus(usbp) (palSetPadMode(GPIOA, GPIOA_USB_DP, PAL_MODE_ALTERNATE(14))) +// #define usb_lld_connect_bus(usbp) palSetPadMode(GPIOA, 12, PAL_MODE_INPUT) +/* + * USB bus de-activation macro, required by the USB driver. + */ +// #define usb_lld_disconnect_bus(usbp) +#define usb_lld_disconnect_bus(usbp) (palSetPadMode(GPIOA, GPIOA_USB_DP, PAL_MODE_OUTPUT_PUSHPULL)); palClearPad(GPIOA, GPIOA_USB_DP) +// #define usb_lld_disconnect_bus(usbp) palSetPadMode(GPIOA, 12, PAL_MODE_OUTPUT_PUSHPULL); palClearPad(GPIOA, 12) + +#if !defined(_FROM_ASM_) +#ifdef __cplusplus +extern "C" { +#endif + void boardInit(void); +#ifdef __cplusplus +} +#endif +#endif /* _FROM_ASM_ */ + +#endif /* _BOARD_H_ */ diff --git a/keyboards/hadron/ver3/boards/GENERIC_STM32_F303XC/board.mk b/keyboards/hadron/ver3/boards/GENERIC_STM32_F303XC/board.mk new file mode 100644 index 000000000..43377629a --- /dev/null +++ b/keyboards/hadron/ver3/boards/GENERIC_STM32_F303XC/board.mk @@ -0,0 +1,5 @@ +# List of all the board related files. +BOARDSRC = $(BOARD_PATH)/boards/GENERIC_STM32_F303XC/board.c + +# Required include directories +BOARDINC = $(BOARD_PATH)/boards/GENERIC_STM32_F303XC diff --git a/keyboards/hadron/ver3/bootloader_defs.h b/keyboards/hadron/ver3/bootloader_defs.h new file mode 100644 index 000000000..3b0e9d20a --- /dev/null +++ b/keyboards/hadron/ver3/bootloader_defs.h @@ -0,0 +1,7 @@ +/* Address for jumping to bootloader on STM32 chips. */ +/* It is chip dependent, the correct number can be looked up here: + * http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf + * This also requires a patch to chibios: + * /tmk_core/tool/chibios/ch-bootloader-jump.patch + */ +#define STM32_BOOTLOADER_ADDRESS 0x1FFFD800 diff --git a/keyboards/hadron/ver3/chconf.h b/keyboards/hadron/ver3/chconf.h new file mode 100644 index 000000000..1d9f12ff1 --- /dev/null +++ b/keyboards/hadron/ver3/chconf.h @@ -0,0 +1,520 @@ +/* + ChibiOS - Copyright (C) 2006..2016 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. +*/ + +/** + * @file templates/chconf.h + * @brief Configuration file template. + * @details A copy of this file must be placed in each project directory, it + * contains the application specific kernel settings. + * + * @addtogroup config + * @details Kernel related settings and hooks. + * @{ + */ + +#ifndef CHCONF_H +#define CHCONF_H + +#define _CHIBIOS_RT_CONF_ + +/*===========================================================================*/ +/** + * @name System timers settings + * @{ + */ +/*===========================================================================*/ + +/** + * @brief System time counter resolution. + * @note Allowed values are 16 or 32 bits. + */ +#define CH_CFG_ST_RESOLUTION 32 + +/** + * @brief System tick frequency. + * @details Frequency of the system timer that drives the system ticks. This + * setting also defines the system tick time unit. + */ +#define CH_CFG_ST_FREQUENCY 100000 + +/** + * @brief Time delta constant for the tick-less mode. + * @note If this value is zero then the system uses the classic + * periodic tick. This value represents the minimum number + * of ticks that is safe to specify in a timeout directive. + * The value one is not valid, timeouts are rounded up to + * this value. + */ +#define CH_CFG_ST_TIMEDELTA 2 + +/** @} */ + +/*===========================================================================*/ +/** + * @name Kernel parameters and options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Round robin interval. + * @details This constant is the number of system ticks allowed for the + * threads before preemption occurs. Setting this value to zero + * disables the preemption for threads with equal priority and the + * round robin becomes cooperative. Note that higher priority + * threads can still preempt, the kernel is always preemptive. + * @note Disabling the round robin preemption makes the kernel more compact + * and generally faster. + * @note The round robin preemption is not supported in tickless mode and + * must be set to zero in that case. + */ +#define CH_CFG_TIME_QUANTUM 0 + +/** + * @brief Managed RAM size. + * @details Size of the RAM area to be managed by the OS. If set to zero + * then the whole available RAM is used. The core memory is made + * available to the heap allocator and/or can be used directly through + * the simplified core memory allocator. + * + * @note In order to let the OS manage the whole RAM the linker script must + * provide the @p __heap_base__ and @p __heap_end__ symbols. + * @note Requires @p CH_CFG_USE_MEMCORE. + */ +#define CH_CFG_MEMCORE_SIZE 0 + +/** + * @brief Idle thread automatic spawn suppression. + * @details When this option is activated the function @p chSysInit() + * does not spawn the idle thread. The application @p main() + * function becomes the idle thread and must implement an + * infinite loop. + */ +#define CH_CFG_NO_IDLE_THREAD FALSE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Performance options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief OS optimization. + * @details If enabled then time efficient rather than space efficient code + * is used when two possible implementations exist. + * + * @note This is not related to the compiler optimization options. + * @note The default is @p TRUE. + */ +#define CH_CFG_OPTIMIZE_SPEED TRUE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Subsystem options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Time Measurement APIs. + * @details If enabled then the time measurement APIs are included in + * the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_TM TRUE + +/** + * @brief Threads registry APIs. + * @details If enabled then the registry APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_REGISTRY TRUE + +/** + * @brief Threads synchronization APIs. + * @details If enabled then the @p chThdWait() function is included in + * the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_WAITEXIT TRUE + +/** + * @brief Semaphores APIs. + * @details If enabled then the Semaphores APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_SEMAPHORES TRUE + +/** + * @brief Semaphores queuing mode. + * @details If enabled then the threads are enqueued on semaphores by + * priority rather than in FIFO order. + * + * @note The default is @p FALSE. Enable this if you have special + * requirements. + * @note Requires @p CH_CFG_USE_SEMAPHORES. + */ +#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE + +/** + * @brief Mutexes APIs. + * @details If enabled then the mutexes APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MUTEXES TRUE + +/** + * @brief Enables recursive behavior on mutexes. + * @note Recursive mutexes are heavier and have an increased + * memory footprint. + * + * @note The default is @p FALSE. + * @note Requires @p CH_CFG_USE_MUTEXES. + */ +#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE + +/** + * @brief Conditional Variables APIs. + * @details If enabled then the conditional variables APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_MUTEXES. + */ +#define CH_CFG_USE_CONDVARS TRUE + +/** + * @brief Conditional Variables APIs with timeout. + * @details If enabled then the conditional variables APIs with timeout + * specification are included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_CONDVARS. + */ +#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE + +/** + * @brief Events Flags APIs. + * @details If enabled then the event flags APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_EVENTS TRUE + +/** + * @brief Events Flags APIs with timeout. + * @details If enabled then the events APIs with timeout specification + * are included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_EVENTS. + */ +#define CH_CFG_USE_EVENTS_TIMEOUT TRUE + +/** + * @brief Synchronous Messages APIs. + * @details If enabled then the synchronous messages APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MESSAGES TRUE + +/** + * @brief Synchronous Messages queuing mode. + * @details If enabled then messages are served by priority rather than in + * FIFO order. + * + * @note The default is @p FALSE. Enable this if you have special + * requirements. + * @note Requires @p CH_CFG_USE_MESSAGES. + */ +#define CH_CFG_USE_MESSAGES_PRIORITY TRUE + +/** + * @brief Mailboxes APIs. + * @details If enabled then the asynchronous messages (mailboxes) APIs are + * included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_SEMAPHORES. + */ +#define CH_CFG_USE_MAILBOXES TRUE + +/** + * @brief Core Memory Manager APIs. + * @details If enabled then the core memory manager APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MEMCORE TRUE + +/** + * @brief Heap Allocator APIs. + * @details If enabled then the memory heap allocator APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or + * @p CH_CFG_USE_SEMAPHORES. + * @note Mutexes are recommended. + */ +#define CH_CFG_USE_HEAP TRUE + +/** + * @brief Memory Pools Allocator APIs. + * @details If enabled then the memory pools allocator APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MEMPOOLS TRUE + +/** + * @brief Dynamic Threads APIs. + * @details If enabled then the dynamic threads creation APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_WAITEXIT. + * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. + */ +#define CH_CFG_USE_DYNAMIC TRUE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Debug options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Debug option, kernel statistics. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_STATISTICS FALSE + +/** + * @brief Debug option, system state check. + * @details If enabled the correct call protocol for system APIs is checked + * at runtime. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_SYSTEM_STATE_CHECK FALSE + +/** + * @brief Debug option, parameters checks. + * @details If enabled then the checks on the API functions input + * parameters are activated. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_ENABLE_CHECKS FALSE + +/** + * @brief Debug option, consistency checks. + * @details If enabled then all the assertions in the kernel code are + * activated. This includes consistency checks inside the kernel, + * runtime anomalies and port-defined checks. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_ENABLE_ASSERTS FALSE + +/** + * @brief Debug option, trace buffer. + * @details If enabled then the trace buffer is activated. + * + * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. + */ +#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_DISABLED + +/** + * @brief Trace buffer entries. + * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is + * different from @p CH_DBG_TRACE_MASK_DISABLED. + */ +#define CH_DBG_TRACE_BUFFER_SIZE 128 + +/** + * @brief Debug option, stack checks. + * @details If enabled then a runtime stack check is performed. + * + * @note The default is @p FALSE. + * @note The stack check is performed in a architecture/port dependent way. + * It may not be implemented or some ports. + * @note The default failure mode is to halt the system with the global + * @p panic_msg variable set to @p NULL. + */ +#define CH_DBG_ENABLE_STACK_CHECK TRUE + +/** + * @brief Debug option, stacks initialization. + * @details If enabled then the threads working area is filled with a byte + * value when a thread is created. This can be useful for the + * runtime measurement of the used stack. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_FILL_THREADS FALSE + +/** + * @brief Debug option, threads profiling. + * @details If enabled then a field is added to the @p thread_t structure that + * counts the system ticks occurred while executing the thread. + * + * @note The default is @p FALSE. + * @note This debug option is not currently compatible with the + * tickless mode. + */ +#define CH_DBG_THREADS_PROFILING FALSE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Kernel hooks + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Threads descriptor structure extension. + * @details User fields added to the end of the @p thread_t structure. + */ +#define CH_CFG_THREAD_EXTRA_FIELDS \ + /* Add threads custom fields here.*/ + +/** + * @brief Threads initialization hook. + * @details User initialization code added to the @p chThdInit() API. + * + * @note It is invoked from within @p chThdInit() and implicitly from all + * the threads creation APIs. + */ +#define CH_CFG_THREAD_INIT_HOOK(tp) { \ + /* Add threads initialization code here.*/ \ +} + +/** + * @brief Threads finalization hook. + * @details User finalization code added to the @p chThdExit() API. + */ +#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ + /* Add threads finalization code here.*/ \ +} + +/** + * @brief Context switch hook. + * @details This hook is invoked just before switching between threads. + */ +#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ + /* Context switch code here.*/ \ +} + +/** + * @brief ISR enter hook. + */ +#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ + /* IRQ prologue code here.*/ \ +} + +/** + * @brief ISR exit hook. + */ +#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ + /* IRQ epilogue code here.*/ \ +} + +/** + * @brief Idle thread enter hook. + * @note This hook is invoked within a critical zone, no OS functions + * should be invoked from here. + * @note This macro can be used to activate a power saving mode. + */ +#define CH_CFG_IDLE_ENTER_HOOK() { \ + /* Idle-enter code here.*/ \ +} + +/** + * @brief Idle thread leave hook. + * @note This hook is invoked within a critical zone, no OS functions + * should be invoked from here. + * @note This macro can be used to deactivate a power saving mode. + */ +#define CH_CFG_IDLE_LEAVE_HOOK() { \ + /* Idle-leave code here.*/ \ +} + +/** + * @brief Idle Loop hook. + * @details This hook is continuously invoked by the idle thread loop. + */ +#define CH_CFG_IDLE_LOOP_HOOK() { \ + /* Idle loop code here.*/ \ +} + +/** + * @brief System tick event hook. + * @details This hook is invoked in the system tick handler immediately + * after processing the virtual timers queue. + */ +#define CH_CFG_SYSTEM_TICK_HOOK() { \ + /* System tick event code here.*/ \ +} + +/** + * @brief System halt hook. + * @details This hook is invoked in case to a system halting error before + * the system is halted. + */ +#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ + /* System halt code here.*/ \ +} + +/** + * @brief Trace hook. + * @details This hook is invoked each time a new record is written in the + * trace buffer. + */ +#define CH_CFG_TRACE_HOOK(tep) { \ + /* Trace code here.*/ \ +} + +/** @} */ + +/*===========================================================================*/ +/* Port-specific settings (override port settings defaulted in chcore.h). */ +/*===========================================================================*/ + +#endif /* CHCONF_H */ + +/** @} */ diff --git a/keyboards/hadron/ver3/config.h b/keyboards/hadron/ver3/config.h new file mode 100644 index 000000000..11288f7a5 --- /dev/null +++ b/keyboards/hadron/ver3/config.h @@ -0,0 +1,192 @@ +/* + * Copyright 2018 Jack Humbert + * + * 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 . + */ + +#ifndef REV3_CONFIG_H +#define REV3_CONFIG_H + +/* USB Device descriptor parameter */ +#define DEVICE_VER 0x0003 + +#undef MATRIX_ROWS +#undef MATRIX_COLS +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 15 + + +//Audio +#undef AUDIO_VOICES +#undef C6_AUDIO + +#ifdef AUDIO_ENABLE + #define STARTUP_SONG SONG(PLANCK_SOUND) + // #define STARTUP_SONG SONG(NO_SOUND) + + #define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \ + SONG(COLEMAK_SOUND), \ + SONG(DVORAK_SOUND) \ + } +#define AUDIO_CLICKY + /* to enable clicky on startup */ + //#define AUDIO_CLICKY_ON +#define AUDIO_CLICKY_FREQ_RANDOMNESS 1.5f +#endif + +//configure qwiic micro_oled driver for the 128x32 oled +#ifdef QWIIC_MICRO_OLED_ENABLE + +#undef I2C_ADDRESS_SA0_1 +#define I2C_ADDRESS_SA0_1 0b0111100 +#define LCDWIDTH 128 +#define LCDHEIGHT 32 +#define micro_oled_rotate_180 + +#endif +/* + * 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) + * +*/ + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCE 6 + +/* 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 + +/* + * 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 + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* + * 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 +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ + +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + +/* Haptic Driver initialization settings + * Feedback Control Settings */ +#define FB_ERM_LRA 1 /* For ERM:0 or LRA:1*/ +#define FB_BRAKEFACTOR 6 /* For 1x:0, 2x:1, 3x:2, 4x:3, 6x:4, 8x:5, 16x:6, Disable Braking:7 */ +#define FB_LOOPGAIN 1 /* For Low:0, Medium:1, High:2, Very High:3 */ + +#define RATED_VOLTAGE 2 +#define V_RMS 2.0 +#define V_PEAK 2.85 +#define F_LRA 205 +/* Library Selection */ +#define LIB_SELECTION 6 /* For Empty:0' TS2200 library A to D:1-5, LRA Library: 6 */ + +/* Control 1 register settings */ +#define DRIVE_TIME 25 +#define AC_COUPLE 0 +#define STARTUP_BOOST 1 + +/* Control 2 Settings */ +#define BIDIR_INPUT 1 +#define BRAKE_STAB 1 /* Loopgain is reduced when braking is almost complete to improve stability */ +#define SAMPLE_TIME 3 +#define BLANKING_TIME 1 +#define IDISS_TIME 1 + +/* Control 3 settings */ +#define NG_THRESH 2 +#define ERM_OPEN_LOOP 1 +#define SUPPLY_COMP_DIS 0 +#define DATA_FORMAT_RTO 0 +#define LRA_DRIVE_MODE 0 +#define N_PWM_ANALOG 0 +#define LRA_OPEN_LOOP 0 +/* Control 4 settings */ +#define ZC_DET_TIME 0 +#define AUTO_CAL_TIME 3 + +//#define WS2812_LED_N 2 +//#define RGBLED_NUM WS2812_LED_N +//#define WS2812_TIM_N 2 +//#define WS2812_TIM_CH 2 +//#define PORT_WS2812 GPIOA +//#define PIN_WS2812 15 +//#define WS2812_DMA_STREAM STM32_DMA1_STREAM2 // DMA stream for TIMx_UP (look up in reference manual under DMA Channel selection) +//#define WS2812_DMA_CHANNEL 7 // DMA channel for TIMx_UP +//#define WS2812_EXTERNAL_PULLUP + +#endif diff --git a/keyboards/hadron/ver3/halconf.h b/keyboards/hadron/ver3/halconf.h new file mode 100644 index 000000000..c3e0cbb72 --- /dev/null +++ b/keyboards/hadron/ver3/halconf.h @@ -0,0 +1,388 @@ +/* + ChibiOS - Copyright (C) 2006..2016 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. +*/ + +/** + * @file templates/halconf.h + * @brief HAL configuration header. + * @details HAL configuration file, this file allows to enable or disable the + * various device drivers from your application. You may also use + * this file in order to override the device drivers default settings. + * + * @addtogroup HAL_CONF + * @{ + */ + +#ifndef HALCONF_H +#define HALCONF_H + +#include "mcuconf.h" + +/** + * @brief Enables the PAL subsystem. + */ +#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) +#define HAL_USE_PAL TRUE +#endif + +/** + * @brief Enables the ADC subsystem. + */ +#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) +#define HAL_USE_ADC FALSE +#endif + +/** + * @brief Enables the CAN subsystem. + */ +#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) +#define HAL_USE_CAN FALSE +#endif + +/** + * @brief Enables the DAC subsystem. + */ +#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) +#define HAL_USE_DAC TRUE +#endif + +/** + * @brief Enables the EXT subsystem. + */ +#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) +#define HAL_USE_EXT FALSE +#endif + +/** + * @brief Enables the GPT subsystem. + */ +#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) +#define HAL_USE_GPT TRUE +#endif + +/** + * @brief Enables the I2C subsystem. + */ +#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) +#define HAL_USE_I2C TRUE +#endif + +/** + * @brief Enables the I2S subsystem. + */ +#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) +#define HAL_USE_I2S FALSE +#endif + +/** + * @brief Enables the ICU subsystem. + */ +#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) +#define HAL_USE_ICU FALSE +#endif + +/** + * @brief Enables the MAC subsystem. + */ +#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) +#define HAL_USE_MAC FALSE +#endif + +/** + * @brief Enables the MMC_SPI subsystem. + */ +#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) +#define HAL_USE_MMC_SPI FALSE +#endif + +/** + * @brief Enables the PWM subsystem. + */ +#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) +#define HAL_USE_PWM FALSE +#endif + +/** + * @brief Enables the QSPI subsystem. + */ +#if !defined(HAL_USE_QSPI) || defined(__DOXYGEN__) +#define HAL_USE_QSPI FALSE +#endif + +/** + * @brief Enables the RTC subsystem. + */ +#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) +#define HAL_USE_RTC FALSE +#endif + +/** + * @brief Enables the SDC subsystem. + */ +#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) +#define HAL_USE_SDC FALSE +#endif + +/** + * @brief Enables the SERIAL subsystem. + */ +#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) +#define HAL_USE_SERIAL FALSE +#endif + +/** + * @brief Enables the SERIAL over USB subsystem. + */ +#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) +#define HAL_USE_SERIAL_USB TRUE +#endif + +/** + * @brief Enables the SPI subsystem. + */ +#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) +#define HAL_USE_SPI FALSE +#endif + +/** + * @brief Enables the UART subsystem. + */ +#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) +#define HAL_USE_UART FALSE +#endif + +/** + * @brief Enables the USB subsystem. + */ +#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) +#define HAL_USE_USB TRUE +#endif + +/** + * @brief Enables the WDG subsystem. + */ +#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) +#define HAL_USE_WDG FALSE +#endif + +/*===========================================================================*/ +/* ADC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) +#define ADC_USE_WAIT TRUE +#endif + +/** + * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define ADC_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* CAN driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Sleep mode related APIs inclusion switch. + */ +#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) +#define CAN_USE_SLEEP_MODE TRUE +#endif + +/*===========================================================================*/ +/* I2C driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables the mutual exclusion APIs on the I2C bus. + */ +#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define I2C_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* MAC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables an event sources for incoming packets. + */ +#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) +#define MAC_USE_ZERO_COPY FALSE +#endif + +/** + * @brief Enables an event sources for incoming packets. + */ +#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) +#define MAC_USE_EVENTS TRUE +#endif + +/*===========================================================================*/ +/* MMC_SPI driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Delays insertions. + * @details If enabled this options inserts delays into the MMC waiting + * routines releasing some extra CPU time for the threads with + * lower priority, this may slow down the driver a bit however. + * This option is recommended also if the SPI driver does not + * use a DMA channel and heavily loads the CPU. + */ +#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) +#define MMC_NICE_WAITING TRUE +#endif + +/*===========================================================================*/ +/* SDC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Number of initialization attempts before rejecting the card. + * @note Attempts are performed at 10mS intervals. + */ +#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) +#define SDC_INIT_RETRY 100 +#endif + +/** + * @brief Include support for MMC cards. + * @note MMC support is not yet implemented so this option must be kept + * at @p FALSE. + */ +#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) +#define SDC_MMC_SUPPORT FALSE +#endif + +/** + * @brief Delays insertions. + * @details If enabled this options inserts delays into the MMC waiting + * routines releasing some extra CPU time for the threads with + * lower priority, this may slow down the driver a bit however. + */ +#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) +#define SDC_NICE_WAITING TRUE +#endif + +/*===========================================================================*/ +/* SERIAL driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Default bit rate. + * @details Configuration parameter, this is the baud rate selected for the + * default configuration. + */ +#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) +#define SERIAL_DEFAULT_BITRATE 38400 +#endif + +/** + * @brief Serial buffers size. + * @details Configuration parameter, you can change the depth of the queue + * buffers depending on the requirements of your application. + * @note The default is 16 bytes for both the transmission and receive + * buffers. + */ +#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) +#define SERIAL_BUFFERS_SIZE 16 +#endif + +/*===========================================================================*/ +/* SERIAL_USB driver related setting. */ +/*===========================================================================*/ + +/** + * @brief Serial over USB buffers size. + * @details Configuration parameter, the buffer size must be a multiple of + * the USB data endpoint maximum packet size. + * @note The default is 256 bytes for both the transmission and receive + * buffers. + */ +#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) +#define SERIAL_USB_BUFFERS_SIZE 1 +#endif + +/** + * @brief Serial over USB number of buffers. + * @note The default is 2 buffers. + */ +#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) +#define SERIAL_USB_BUFFERS_NUMBER 2 +#endif + +/*===========================================================================*/ +/* SPI driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) +#define SPI_USE_WAIT TRUE +#endif + +/** + * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define SPI_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* UART driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__) +#define UART_USE_WAIT FALSE +#endif + +/** + * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define UART_USE_MUTUAL_EXCLUSION FALSE +#endif + +/*===========================================================================*/ +/* USB driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) +#define USB_USE_WAIT TRUE +#endif + +#endif /* HALCONF_H */ + +/** @} */ diff --git a/keyboards/hadron/ver3/keymaps/default/config.h b/keyboards/hadron/ver3/keymaps/default/config.h new file mode 100644 index 000000000..6f70f09be --- /dev/null +++ b/keyboards/hadron/ver3/keymaps/default/config.h @@ -0,0 +1 @@ +#pragma once diff --git a/keyboards/hadron/ver3/keymaps/default/keymap.c b/keyboards/hadron/ver3/keymaps/default/keymap.c new file mode 100644 index 000000000..11761b321 --- /dev/null +++ b/keyboards/hadron/ver3/keymaps/default/keymap.c @@ -0,0 +1,295 @@ +#include QMK_KEYBOARD_H + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _LOWER 3 +#define _RAISE 4 +#define _MOUSECURSOR 8 +#define _ADJUST 16 + +enum preonic_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + LOWER, + RAISE, + BACKLIT, + RGBLED_TOGGLE, + RGBLED_STEP_MODE, + RGBLED_INCREASE_HUE, + RGBLED_DECREASE_HUE, + RGBLED_INCREASE_SAT, + RGBLED_DECREASE_SAT, + RGBLED_INCREASE_VAL, + RGBLED_DECREASE_VAL, +}; + +enum macro_keycodes { + KC_DEMOMACRO, +}; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO +// Custom macros +#define CTL_ESC CTL_T(KC_ESC) // Tap for Esc, hold for Ctrl +#define CTL_TTAB CTL_T(KC_TAB) // Tap for Esc, hold for Ctrl +#define CTL_ENT CTL_T(KC_ENT) // Tap for Enter, hold for Ctrl +#define SFT_ENT SFT_T(KC_ENT) // Tap for Enter, hold for Shift +// Requires KC_TRNS/_______ for the trigger key in the destination layer +#define LT_MC(kc) LT(_MOUSECURSOR, kc) // L-ayer T-ap M-ouse C-ursor +#define LT_RAI(kc) LT(_RAISE, kc) // L-ayer T-ap to Raise +#define DEMOMACRO M(KC_DEMOMACRO) // Sample for macros + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,------+------+------+------+------+------------------------------------------------. + * | Esc | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | DEL | + * |------+------+------+------+------+------+------+------+------+------+------+------+--------------------. + * | Tab | Q | W | E | R | T | 7 | 8 | 9 | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | CAPS | A | S | D | F | G | 4 | 5 | 6 | H | J | K | L | ;/Nav| ' | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | 1 | 2 | 3 | N | M | , | . | / |Ctl/Et| + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | ` | Ctrl | Alt | GUI |Lower |Space | 0 | . | = |Space |Raise | Left | Down | Up |Right | + * `--------------------------------------------------------------------------------------------------------' + */ +[_QWERTY] = LAYOUT( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_DEL,\ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_P7, KC_P8, KC_P9, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_P4, KC_P5, KC_P6, KC_H, KC_J, KC_K, KC_L,LT_MC(KC_SCLN), KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_P1, KC_P2, KC_P3, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, CTL_ENT, \ + KC_GRV, KC_LCTRL, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_P0, KC_DOT, KC_EQL, KC_SPC, RAISE, KC_LEFT,KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Colemak + * ,------+------+------+------+------+------------------------------------------------. + * | Esc | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | 0 | - | + * |------+------+------+------+------+------+------+------+------+------+------+------+--------------------. + * | Tab | Q | W | F | P | G | 7 | 8 | 9 | J | L | U | Y | ; | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------+------+------+------| + * | CAPS | A | R | S | T | D | 4 | 5 | 6 | H | N | E | I | O | ' | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | 1 | 2 | 3 | K | M | , | . | / |Ctl/Et| + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | ` | Ctrl | Alt | GUI |Lower |Space | 0 | . | = |Space |Raise | Left | Down | Up |Right | + * `--------------------------------------------------------------------------------------------------------' + */ +[_COLEMAK] = LAYOUT( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_DEL,\ + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_P7, KC_P8, KC_P9, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, \ + KC_LCTRL, KC_A, KC_R, KC_S, KC_T, KC_D, KC_P4, KC_P5, KC_P6, KC_H, KC_N, KC_E, KC_I, LT_MC(KC_O), KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_P1, KC_P2, KC_P3, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, CTL_ENT, \ + KC_GRV, KC_CAPS, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_P0, KC_DOT, KC_EQL, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ + ), + +/* Dvorak + * ,------+------+------+------+------+------------------------------------------------. + * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | + * |------+------+------+------+------+------+------+------+------+------+------+------+--------------------. + * | Tab | " | , | . | P | Y | 7 | 8 | 9 | F | G | C | R | L | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------+------+------+------| + * | Esc | A | O | E | U | I | 4 | 5 | 6 | D | H | T | N | S | / | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | 1 | 2 | 3 | B | M | W | V | Z |Ctl/Et| + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | ` | Ctrl | Alt | GUI |Lower |Space | 0 | . | = |Space |Raise | Left | Down | Up |Right | + * `--------------------------------------------------------------------------------------------------------' + */ +[_DVORAK] = LAYOUT( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_DEL,\ + KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_P7, KC_P8, KC_P9, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, \ + KC_LCTL, KC_A, KC_O, KC_E, KC_U, KC_I, KC_P4, KC_P5, KC_P6, KC_D, KC_H, KC_T, KC_N, LT_MC(KC_S), KC_SLSH, \ + KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_P1, KC_P2, KC_P3, KC_B, KC_M, KC_W, KC_V, KC_Z, CTL_ENT, \ + KC_GRV, KC_LCTRL, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_P0, KC_DOT, KC_EQL, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Lower + * ,------+------+------+------+------+------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | + * |------+------+------+------+------+------+------+------+------+------+------+------+--------------------. + * | ~ | ! | @ | # | $ | % | | | | ^ | & | * | ( | ) | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------+------+------+------| + * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | _ | + | { | } | | | + * |------+------+------+------+------+------|------+------+------+------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | | | | F12 |ISO ~ |ISO | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | Next | Vol- | Vol+ | Play | + * `--------------------------------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT( + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, _______, _______, _______, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \ + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, _______, _______, KC_F6, KC_UNDS, KC_PLUS, KC_LBRC, KC_RBRC, KC_PIPE, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, _______, _______, _______, KC_F12,S(KC_NUHS),S(KC_NUBS),_______,_______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Raise + * ,------+------+------+------+------+------------------------------------------------. + * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | + * |------+------+------+------+------+------+------+------+------+------+------+------+--------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | | | | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | | | | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | | | | F12 |ISO # |ISO / | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | Next | Vol- | Vol+ | Play | + * `--------------------------------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, _______, _______, _______, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, _______, _______, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, _______, _______, _______, KC_F12, KC_NUHS, KC_NUBS, _______, _______, _______, \ + _______, _______, _______, _______, _______, KC_SPC, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Mouse Layer (semi-col) + * ,------+------+------+------+------+------------------------------------------------. + * | ACCL0| ACCL1| ACCL2| | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------+--------------------. + * | | | | | | | | | Home | Wh_Up| WHL_L| M_Up | WHL_R| Macro| | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | End | Wh_Dn| M_Lft| M_Dn | M_Rt | | | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | BTN2 | BTN3 | BTN4 | BTN5 | | | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | BTN1 | | | | BTN1 | | | | | | + * `--------------------------------------------------------------------------------------------------------' + */ + +[_MOUSECURSOR] = LAYOUT( + KC_ACL0, KC_ACL1, KC_ACL2, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, KC_WH_L, KC_MS_U, KC_WH_R,DEMOMACRO,_______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_END , KC_PGDN, KC_MS_L, KC_MS_D, KC_MS_R, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_BTN2, KC_BTN3, KC_BTN4, KC_BTN5, _______, _______, \ + _______, _______, _______, _______, _______, KC_BTN1, _______, _______, _______, KC_BTN1, _______, _______, _______, _______, _______ \ +), + +/* Adjust (Lower + Raise) + * ,------+------+------+------+------+------------------------------------------------. + * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | + * |------+------+------+------+------+------+------+------+------+------+------+------+--------------------. + * | Reset|RGB TG|RGB ST|RGBH -|RGBH +|RGBS -|RGBS +|RGBV -|RGBV +| | | | | | Del | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm| | | |AGswap|Qwerty|Colemk| | | | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | |Voice-|Voice+|Mus on|Musoff| | | | | | | | BL + |BL ST |BL TG | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | | | | | + * `--------------------------------------------------------------------------------------------------------' + */ +[_ADJUST] = LAYOUT( + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ + RESET, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, KC_DEL, \ + _______, _______, _______, AU_ON, AU_OFF, AG_NORM, _______, _______, _______, AG_SWAP, QWERTY, COLEMAK, _______, _______, _______, \ + _______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, BL_DEC, BL_INC, BL_STEP, BL_TOGG, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, CK_RST, CK_DOWN, CK_UP, CK_TOGG\ +) + + + +}; + +uint32_t layer_state_set_user(uint32_t state) { + return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST); +} + + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + set_single_persistent_default_layer(_COLEMAK); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + //not sure how to have keyboard check mode and set it to a variable, so my work around + //uses another variable that would be set to true after the first time a reactive key is pressed. + layer_on(_LOWER); + } else { + layer_off(_LOWER); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + //not sure how to have keyboard check mode and set it to a variable, so my work around + //uses another variable that would be set to true after the first time a reactive key is pressed. + layer_on(_RAISE); + } else { + layer_off(_RAISE); + } + return false; + break; + case BACKLIT: + if (record->event.pressed) { + register_code(KC_RSFT); + #ifdef BACKLIGHT_ENABLE + backlight_step(); + #endif + } else { + unregister_code(KC_RSFT); + } + return false; + break; + } + return true; +} + +bool music_mask_user(uint16_t keycode) { + switch (keycode) { + case RAISE: + case LOWER: + return false; + default: + return true; + } +} + + +/* + * Macro definition + */ +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + if (!eeconfig_is_enabled()) { + eeconfig_init(); + } + + switch (id) { + case KC_DEMOMACRO: + if (record->event.pressed){ + return MACRO (I(1), T(H),T(E),T(L), T(L), T(O), T(SPACE), T(W), T(O), T(R), T(L), T(D), END); + } + } + + return MACRO_NONE; +} + + +void matrix_init_user(void) { +} + + +void matrix_scan_user(void) { +} + diff --git a/keyboards/hadron/ver3/keymaps/default/readme.md b/keyboards/hadron/ver3/keymaps/default/readme.md new file mode 100644 index 000000000..88b958ec4 --- /dev/null +++ b/keyboards/hadron/ver3/keymaps/default/readme.md @@ -0,0 +1,2 @@ +# The Default Hadron Layout + diff --git a/keyboards/hadron/ver3/keymaps/readme.md b/keyboards/hadron/ver3/keymaps/readme.md new file mode 100644 index 000000000..54fb5f6d9 --- /dev/null +++ b/keyboards/hadron/ver3/keymaps/readme.md @@ -0,0 +1,23 @@ +# How to add your own keymap + +Folders can be named however you'd like (will be approved upon merging), or should follow the format with a preceding `_`: + + _[ISO 3166-1 alpha-2 code*]_[layout variant]_[layout name/author] + +\* See full list: https://en.wikipedia.org/wiki/ISO_3166-1#Officially_assigned_code_elements + +and contain the following files: + +* `keymap.c` +* `readme.md` *recommended* +* `config.h` *optional*, found automatically when compiling +* `Makefile` *optional*, found automatically when compling + +When adding your keymap to this list, keep it organised alphabetically (select list, edit->sort lines), and use this format: + + * **folder_name** description + +# List of Planck keymaps + +* **default** default Planck layout +* **cbbrowne** cbbrowne's Planck layout \ No newline at end of file diff --git a/keyboards/hadron/ver3/matrix.c b/keyboards/hadron/ver3/matrix.c new file mode 100644 index 000000000..329d1328a --- /dev/null +++ b/keyboards/hadron/ver3/matrix.c @@ -0,0 +1,195 @@ +#include +#include "hal.h" +#include "timer.h" +#include "wait.h" +#include "printf.h" +#include "backlight.h" +#include "matrix.h" +#include "action.h" +#include "keycode.h" + +/* matrix state(1:on, 0:off) */ +static matrix_row_t matrix[MATRIX_ROWS]; +static matrix_row_t matrix_debouncing[MATRIX_COLS]; +static bool debouncing = false; +static uint16_t debouncing_time = 0; + +static uint8_t encoder_state = 0; +static int8_t encoder_value = 0; +static int8_t encoder_LUT[] = { 0, -1, 1, 0, 1, 0, 0, -1, -1, 0, 0, 1, 0, 1, -1, 0 }; + +__attribute__ ((weak)) +void matrix_init_user(void) {} + +__attribute__ ((weak)) +void matrix_scan_user(void) {} + +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +void matrix_init(void) { + printf("matrix init\n"); + //debug_matrix = true; + + // encoder setup + palSetPadMode(GPIOB, 13, PAL_MODE_INPUT_PULLUP); + palSetPadMode(GPIOB, 14, PAL_MODE_INPUT_PULLUP); + + encoder_state = (palReadPad(GPIOB, 13) << 0) | (palReadPad(GPIOB, 14) << 1); + + // actual matrix setup + palSetPadMode(GPIOB, 8, PAL_MODE_OUTPUT_PUSHPULL); + palSetPadMode(GPIOB, 2, PAL_MODE_OUTPUT_PUSHPULL); + palSetPadMode(GPIOB, 10, PAL_MODE_OUTPUT_PUSHPULL); + palSetPadMode(GPIOA, 0, PAL_MODE_OUTPUT_PUSHPULL); + palSetPadMode(GPIOA, 1, PAL_MODE_OUTPUT_PUSHPULL); + palSetPadMode(GPIOA, 2, PAL_MODE_OUTPUT_PUSHPULL); + palSetPadMode(GPIOB, 0, PAL_MODE_OUTPUT_PUSHPULL); + palSetPadMode(GPIOA, 3, PAL_MODE_OUTPUT_PUSHPULL); + palSetPadMode(GPIOB, 1, PAL_MODE_OUTPUT_PUSHPULL); + palSetPadMode(GPIOA, 6, PAL_MODE_OUTPUT_PUSHPULL); + palSetPadMode(GPIOA, 7, PAL_MODE_OUTPUT_PUSHPULL); + palSetPadMode(GPIOB, 12, PAL_MODE_OUTPUT_PUSHPULL); + palSetPadMode(GPIOC, 13, PAL_MODE_OUTPUT_PUSHPULL); + palSetPadMode(GPIOB, 11, PAL_MODE_OUTPUT_PUSHPULL); + palSetPadMode(GPIOB, 9, PAL_MODE_OUTPUT_PUSHPULL); + + palSetPadMode(GPIOC, 15, PAL_MODE_INPUT_PULLDOWN); + palSetPadMode(GPIOC, 14, PAL_MODE_INPUT_PULLDOWN); + palSetPadMode(GPIOA, 10, PAL_MODE_INPUT_PULLDOWN); + palSetPadMode(GPIOA, 9, PAL_MODE_INPUT_PULLDOWN); + palSetPadMode(GPIOA, 8, PAL_MODE_INPUT_PULLDOWN); + + + memset(matrix, 0, MATRIX_ROWS * sizeof(matrix_row_t)); + memset(matrix_debouncing, 0, MATRIX_COLS * sizeof(matrix_row_t)); + + + matrix_init_quantum(); +} + +__attribute__ ((weak)) +void encoder_update(bool clockwise) { } + +#ifndef ENCODER_RESOLUTION + #define ENCODER_RESOLUTION 4 +#endif + +uint8_t matrix_scan(void) { + // encoder on B13 and B14 + encoder_state <<= 2; + encoder_state |= (palReadPad(GPIOB, 13) << 0) | (palReadPad(GPIOB, 14) << 1); + encoder_value += encoder_LUT[encoder_state & 0xF]; + if (encoder_value >= ENCODER_RESOLUTION) { + encoder_update(0); + } + if (encoder_value <= -ENCODER_RESOLUTION) { // direction is arbitrary here, but this clockwise + encoder_update(1); + } + encoder_value %= ENCODER_RESOLUTION; + + // actual matrix + for (int col = 0; col < MATRIX_COLS; col++) { + matrix_row_t data = 0; + + // strobe col { PB8, PB2, PB10, PA0, PA1, PA2, PB0, PA3, PB1, PA6, PA7, PB1, PA6, PA7, PB12, PC3, PB11, } + switch (col) { + case 0: palSetPad(GPIOB, 8); break; + case 1: palSetPad(GPIOB, 2); break; + case 2: palSetPad(GPIOB, 10); break; + case 3: palSetPad(GPIOA, 0); break; + case 4: palSetPad(GPIOA, 1); break; + case 5: palSetPad(GPIOA, 2); break; + case 6: palSetPad(GPIOB, 0); break; + case 7: palSetPad(GPIOA, 3); break; + case 8: palSetPad(GPIOB, 1); break; + case 9: palSetPad(GPIOA, 6); break; + case 10: palSetPad(GPIOA, 7); break; + case 11: palSetPad(GPIOB, 12); break; + case 12: palSetPad(GPIOC, 13); break; + case 13: palSetPad(GPIOB, 11); break; + case 14: palSetPad(GPIOB, 9); break; + } + + // need wait to settle pin state + wait_us(20); + + // read row data { PC15, PC14, PA10, PA9, PA8 } + data = ( + (palReadPad(GPIOC, 15) << 0 ) | + (palReadPad(GPIOC, 14) << 1 ) | + (palReadPad(GPIOA, 10) << 2 ) | + (palReadPad(GPIOA, 9) << 3 ) | + (palReadPad(GPIOA, 8) << 4 ) + ); + + // unstrobe col { PB8, PB2, PB10, PA0, PA1, PA2, PB0, PA3, PB1, PA6, PA7, PB1, PA6, PA7, PB12, PC3, PB11, } + switch (col) { + case 0: palClearPad(GPIOB, 8); break; + case 1: palClearPad(GPIOB, 2); break; + case 2: palClearPad(GPIOB, 10); break; + case 3: palClearPad(GPIOA, 0); break; + case 4: palClearPad(GPIOA, 1); break; + case 5: palClearPad(GPIOA, 2); break; + case 6: palClearPad(GPIOB, 0); break; + case 7: palClearPad(GPIOA, 3); break; + case 8: palClearPad(GPIOB, 1); break; + case 9: palClearPad(GPIOA, 6); break; + case 10: palClearPad(GPIOA, 7); break; + case 11: palClearPad(GPIOB, 12); break; + case 12: palClearPad(GPIOC, 13); break; + case 13: palClearPad(GPIOB, 11); break; + case 14: palClearPad(GPIOB, 9); break; + } + + if (matrix_debouncing[col] != data) { + matrix_debouncing[col] = data; + debouncing = true; + debouncing_time = timer_read(); + } + } + + if (debouncing && timer_elapsed(debouncing_time) > DEBOUNCE) { + for (int row = 0; row < MATRIX_ROWS; row++) { + matrix[row] = 0; + for (int col = 0; col < MATRIX_COLS; col++) { + matrix[row] |= ((matrix_debouncing[col] & (1 << row) ? 1 : 0) << col); + } + } + debouncing = false; + } + + matrix_scan_quantum(); + + return 1; +} + +bool matrix_is_on(uint8_t row, uint8_t col) { + return (matrix[row] & (1< + * + * 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 . + */ +#ifndef REV3_H +#define REV3_H + +#include "hadron.h" + +#endif \ No newline at end of file diff --git a/keyboards/hadron/ver3/rules.mk b/keyboards/hadron/ver3/rules.mk new file mode 100644 index 000000000..8375efdd3 --- /dev/null +++ b/keyboards/hadron/ver3/rules.mk @@ -0,0 +1,57 @@ +# project specific files +SRC = matrix.c + +## chip/board settings +# - the next two should match the directories in +# /os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES) +MCU_FAMILY = STM32 +MCU_SERIES = STM32F3xx + +# Linker script to use +# - it should exist either in /os/common/ports/ARMCMx/compilers/GCC/ld/ +# or /ld/ +MCU_LDSCRIPT = STM32F303xC + +# Startup code to use +# - it should exist in /os/common/startup/ARMCMx/compilers/GCC/mk/ +MCU_STARTUP = stm32f3xx + +# Board: it should exist either in /os/hal/boards/ +# or /boards +BOARD = GENERIC_STM32_F303XC + +# Cortex version +MCU = cortex-m4 + +# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7 +ARMV = 7 + +USE_FPU = yes + +# Vector table for application +# 0x00000000-0x00001000 area is occupied by bootlaoder.*/ +# The CORTEX_VTOR... is needed only for MCHCK/Infinity KB +# OPT_DEFS = -DCORTEX_VTOR_INIT=0x08005000 +OPT_DEFS = + +# Options to pass to dfu-util when flashing +DFU_ARGS = -d 0483:df11 -a 0 -s 0x08000000:leave + +# Build Options +# comment out to disable the options. +# +BACKLIGHT_ENABLE = no +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration +## (Note that for BOOTMAGIC on Teensy LC you have to use a custom .ld script.) +MOUSEKEY_ENABLE = yes # Mouse keys +EXTRAKEY_ENABLE = yes # Audio control and System control +CONSOLE_ENABLE = no # Console for debug +COMMAND_ENABLE = no # Commands for debug and configuration +#SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover +CUSTOM_MATRIX = yes # Custom matrix file +AUDIO_ENABLE = yes +RGBLIGHT_ENABLE = no +HAPTIC_ENABLE = DRV2605L +QWIIC_ENABLE += MICRO_OLED +# SERIAL_LINK_ENABLE = yes diff --git a/keyboards/hadron/ver3/ver3.c b/keyboards/hadron/ver3/ver3.c new file mode 100644 index 000000000..5e5e3e009 --- /dev/null +++ b/keyboards/hadron/ver3/ver3.c @@ -0,0 +1,196 @@ +/* Copyright 2018 Jack Humbert + * + * 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 . + */ +#include "ver3.h" +#include "qwiic.h" +#include "action_layer.h" +#include "matrix.h" +#include "DRV2605L.h" + +#ifdef QWIIC_MICRO_OLED_ENABLE + +/* screen off after this many milliseconds */ +#include "timer.h" +#define ScreenOffInterval 60000 /* milliseconds */ +static uint16_t last_flush; + +volatile uint8_t led_numlock = false; +volatile uint8_t led_capslock = false; +volatile uint8_t led_scrolllock = false; + +static uint8_t layer; +static bool queue_for_send = false; +static uint8_t encoder_value = 32; + +__attribute__ ((weak)) +void draw_ui(void) { + clear_buffer(); + last_flush = timer_read(); + send_command(DISPLAYON); + +/* Layer indicator is 41 x 10 pixels */ +#define LAYER_INDICATOR_X 0 +#define LAYER_INDICATOR_Y 0 + + draw_string(LAYER_INDICATOR_X + 1, LAYER_INDICATOR_Y + 2, "LAYER", PIXEL_ON, NORM, 0); + draw_rect_filled_soft(LAYER_INDICATOR_X + 32, LAYER_INDICATOR_Y + 1, 9, 9, PIXEL_ON, NORM); + draw_char(LAYER_INDICATOR_X + 34, LAYER_INDICATOR_Y + 2, layer + 0x30, PIXEL_ON, XOR, 0); + +/* Matrix display is 19 x 9 pixels */ +#define MATRIX_DISPLAY_X 0 +#define MATRIX_DISPLAY_Y 18 + + for (uint8_t x = 0; x < MATRIX_ROWS; x++) { + for (uint8_t y = 0; y < MATRIX_COLS; y++) { + draw_pixel(MATRIX_DISPLAY_X + y + 2, MATRIX_DISPLAY_Y + x + 2,(matrix_get_row(x) & (1 << y)) > 0, NORM); + } + } + draw_rect_soft(MATRIX_DISPLAY_X, MATRIX_DISPLAY_Y, 19, 9, PIXEL_ON, NORM); + /* hadron oled location on thumbnail */ + draw_rect_filled_soft(MATRIX_DISPLAY_X + 14, MATRIX_DISPLAY_Y + 2, 3, 1, PIXEL_ON, NORM); +/* + draw_rect_soft(0, 13, 64, 6, PIXEL_ON, NORM); + draw_line_vert(encoder_value, 13, 6, PIXEL_ON, NORM); + +*/ + +/* Mod display is 41 x 16 pixels */ +#define MOD_DISPLAY_X 30 +#define MOD_DISPLAY_Y 18 + + uint8_t mods = get_mods(); + if (mods & MOD_LSFT) { + draw_rect_filled_soft(MOD_DISPLAY_X + 0, MOD_DISPLAY_Y, 5 + (1 * 6), 11, PIXEL_ON, NORM); + draw_string(MOD_DISPLAY_X + 3, MOD_DISPLAY_Y + 2, "S", PIXEL_OFF, NORM, 0); + } else { + draw_string(MOD_DISPLAY_X + 3, MOD_DISPLAY_Y + 2, "S", PIXEL_ON, NORM, 0); + } + if (mods & MOD_LCTL) { + draw_rect_filled_soft(MOD_DISPLAY_X + 10, MOD_DISPLAY_Y, 5 + (1 * 6), 11, PIXEL_ON, NORM); + draw_string(MOD_DISPLAY_X + 13, MOD_DISPLAY_Y + 2, "C", PIXEL_OFF, NORM, 0); + } else { + draw_string(MOD_DISPLAY_X + 13, MOD_DISPLAY_Y + 2, "C", PIXEL_ON, NORM, 0); + } + if (mods & MOD_LALT) { + draw_rect_filled_soft(MOD_DISPLAY_X + 20, MOD_DISPLAY_Y, 5 + (1 * 6), 11, PIXEL_ON, NORM); + draw_string(MOD_DISPLAY_X + 23, MOD_DISPLAY_Y + 2, "A", PIXEL_OFF, NORM, 0); + } else { + draw_string(MOD_DISPLAY_X + 23, MOD_DISPLAY_Y + 2, "A", PIXEL_ON, NORM, 0); + } + if (mods & MOD_LGUI) { + draw_rect_filled_soft(MOD_DISPLAY_X + 30, MOD_DISPLAY_Y, 5 + (1 * 6), 11, PIXEL_ON, NORM); + draw_string(MOD_DISPLAY_X + 33, MOD_DISPLAY_Y + 2, "G", PIXEL_OFF, NORM, 0); + } else { + draw_string(MOD_DISPLAY_X + 33, MOD_DISPLAY_Y + 2, "G", PIXEL_ON, NORM, 0); + } + +/* Lock display is 23 x 32 */ +#define LOCK_DISPLAY_X 100 +#define LOCK_DISPLAY_Y 0 + + if (led_numlock == true) { + draw_rect_filled_soft(LOCK_DISPLAY_X, LOCK_DISPLAY_Y, 5 + (3 * 6), 9, PIXEL_ON, NORM); + draw_string(LOCK_DISPLAY_X + 3, LOCK_DISPLAY_Y + 1, "NUM", PIXEL_OFF, NORM, 0); + } else if (led_numlock == false) { + draw_string(LOCK_DISPLAY_X + 3, LOCK_DISPLAY_Y + 1, "NUM", PIXEL_ON, NORM, 0); + } + if (led_capslock == true) { + draw_rect_filled_soft(LOCK_DISPLAY_X + 0, LOCK_DISPLAY_Y + 11, 5 + (3 * 6), 9, PIXEL_ON, NORM); + draw_string(LOCK_DISPLAY_X + 3, LOCK_DISPLAY_Y + 11 +1, "CAP", PIXEL_OFF, NORM, 0); + } else if (led_capslock == false) { + draw_string(LOCK_DISPLAY_X + 3, LOCK_DISPLAY_Y + 11 +1, "CAP", PIXEL_ON, NORM, 0); + } + + if (led_scrolllock == true) { + draw_rect_filled_soft(LOCK_DISPLAY_X + 0, LOCK_DISPLAY_Y + 22, 5 + (3 * 6), 9, PIXEL_ON, NORM); + draw_string(LOCK_DISPLAY_X + 3, LOCK_DISPLAY_Y + 22 +1, "SCR", PIXEL_OFF, NORM, 0); + } else if (led_scrolllock == false) { + draw_string(LOCK_DISPLAY_X + 3, LOCK_DISPLAY_Y + 22 +1, "SCR", PIXEL_ON, NORM, 0); + } + send_buffer(); +} + +void read_host_led_state(void) { + uint8_t leds = host_keyboard_leds(); + if (leds & (1 << USB_LED_NUM_LOCK)) { + if (led_numlock == false){ + led_numlock = true;} + } else { + if (led_numlock == true){ + led_numlock = false;} + } + if (leds & (1 << USB_LED_CAPS_LOCK)) { + if (led_capslock == false){ + led_capslock = true;} + } else { + if (led_capslock == true){ + led_capslock = false;} + } + if (leds & (1 << USB_LED_SCROLL_LOCK)) { + if (led_scrolllock == false){ + led_scrolllock = true;} + } else { + if (led_scrolllock == true){ + led_scrolllock = false;} + } +} + +uint32_t layer_state_set_kb(uint32_t state) { + state = layer_state_set_user(state); + layer = biton32(state); + queue_for_send = true; + return state; +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + queue_for_send = true; + return process_record_user(keycode, record); +} + +void encoder_update_kb(uint8_t index, bool clockwise) { + encoder_value = (encoder_value + (clockwise ? 1 : -1)) % 64; + queue_for_send = true; +} + +#endif + +void matrix_init_kb(void) { +#ifdef DRV2605L + DRV_init(); +#endif + queue_for_send = true; + matrix_init_user(); +} + +void matrix_scan_kb(void) { + +if (queue_for_send) { + #ifdef DRV2605L + DRV_EFFECT play_eff = strong_click; + DRV_pulse(play_eff); + #endif +#ifdef QWIIC_MICRO_OLED_ENABLE + read_host_led_state(); + draw_ui(); +#endif + queue_for_send = false; + } +#ifdef QWIIC_MICRO_OLED_ENABLE + if (timer_elapsed(last_flush) > ScreenOffInterval) { + send_command(DISPLAYOFF); /* 0xAE */ + } +#endif + matrix_scan_user(); +} diff --git a/keyboards/hadron/ver3/ver3.h b/keyboards/hadron/ver3/ver3.h new file mode 100644 index 000000000..516f7b9a1 --- /dev/null +++ b/keyboards/hadron/ver3/ver3.h @@ -0,0 +1,21 @@ +/* Copyright 2018 Jack Humbert + * + * 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 . + */ +#ifndef VER3_H +#define VER3_H + +#include "hadron.h" + +#endif \ No newline at end of file diff --git a/keyboards/helix/rev1/keymaps/OLED_sample/rules.mk b/keyboards/helix/rev1/keymaps/OLED_sample/rules.mk deleted file mode 100644 index c56d6f37e..000000000 --- a/keyboards/helix/rev1/keymaps/OLED_sample/rules.mk +++ /dev/null @@ -1,25 +0,0 @@ - -# Build Options -# change to "no" to disable the options, or define them in the Makefile in -# the appropriate keymap folder that will get included automatically -# -BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = no # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = no # Console for debug(+400) -COMMAND_ENABLE = no # Commands for debug and configuration -NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality -MIDI_ENABLE = no # MIDI controls -AUDIO_ENABLE = no # Audio output on port C6 -UNICODE_ENABLE = no # Unicode -BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. -SWAP_HANDS_ENABLE = no # Enable one-hand typing - -# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE -SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend - -ifndef QUANTUM_DIR - include ../../../../Makefile -endif diff --git a/tmk_core/common/action_layer.h b/tmk_core/common/action_layer.h index 6d48321f9..f1551d251 100644 --- a/tmk_core/common/action_layer.h +++ b/tmk_core/common/action_layer.h @@ -82,13 +82,11 @@ void layer_xor(uint32_t state); #define layer_or(state) #define layer_and(state) #define layer_xor(state) - -__attribute__((weak)) -uint32_t layer_state_set_user(uint32_t state); -__attribute__((weak)) -uint32_t layer_state_set_kb(uint32_t state); #endif +uint32_t layer_state_set_user(uint32_t state); +uint32_t layer_state_set_kb(uint32_t state); + /* pressed actions cache */ #if !defined(NO_ACTION_LAYER) && !defined(STRICT_LAYER_RELEASE) /* The number of bits needed to represent the layer number: log2(32). */ diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index a6a5fb56b..6f659b244 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -72,6 +72,9 @@ along with this program. If not, see . #ifdef HD44780_ENABLE # include "hd44780.h" #endif +#ifdef QWIIC_ENABLE +# include "qwiic.h" +#endif #ifdef MATRIX_HAS_GHOST extern const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; @@ -161,6 +164,9 @@ bool is_keyboard_master(void) { void keyboard_init(void) { timer_init(); matrix_init(); +#ifdef QWIIC_ENABLE + qwiic_init(); +#endif #ifdef PS2_MOUSE_ENABLE ps2_mouse_init(); #endif @@ -270,6 +276,10 @@ void keyboard_task(void) MATRIX_LOOP_END: +#ifdef QWIIC_ENABLE + qwiic_task(); +#endif + #ifdef MOUSEKEY_ENABLE // mousekey repeat & acceleration mousekey_task(); From 59dc31a7371956b5ba9e54b7e19ddc7a3092c5df Mon Sep 17 00:00:00 2001 From: Alex Mayer Date: Tue, 4 Dec 2018 12:25:27 -0500 Subject: [PATCH 607/788] Keymap: Ergodox EZ: Clean Up Keymap Array Alignment (#4545) Remove layer name comments, they are above the visual layout Remove comments explaining things that are documented in qmk docs --- keyboards/ergodox_ez/keymaps/default/keymap.c | 115 +++++++++--------- 1 file changed, 56 insertions(+), 59 deletions(-) diff --git a/keyboards/ergodox_ez/keymaps/default/keymap.c b/keyboards/ergodox_ez/keymaps/default/keymap.c index 12d6cf6fa..5834fa43a 100644 --- a/keyboards/ergodox_ez/keymaps/default/keymap.c +++ b/keyboards/ergodox_ez/keymaps/default/keymap.c @@ -33,28 +33,26 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | |ace | End | | PgDn | | | * `--------------------' `----------------------' */ -// If it accepts an argument (i.e, is a function), it doesn't need KC_. -// Otherwise, it needs KC_* -[BASE] = LAYOUT_ergodox( // layer 0 : default - // left hand - KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT, - KC_DELT, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB), - KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G, - KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO), - LT(SYMB,KC_GRV),KC_QUOT, LALT(KC_LSFT), KC_LEFT,KC_RGHT, - ALT_T(KC_APP), KC_LGUI, - KC_HOME, - KC_SPC,KC_BSPC,KC_END, - // right hand - KC_RGHT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, - TG(SYMB), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, - KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN),GUI_T(KC_QUOT), - MEH_T(KC_NO),KC_N, KC_M, KC_COMM,KC_DOT, CTL_T(KC_SLSH), KC_RSFT, - KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, KC_FN1, - KC_LALT, CTL_T(KC_ESC), - KC_PGUP, - KC_PGDN,KC_TAB, KC_ENT - ), +[BASE] = LAYOUT_ergodox( + // left hand + KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT, + KC_DELT, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB), + KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G, + KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO), + LT(SYMB,KC_GRV), KC_QUOT, LALT(KC_LSFT), KC_LEFT, KC_RGHT, + ALT_T(KC_APP), KC_LGUI, + KC_HOME, + KC_SPC, KC_BSPC, KC_END, + // right hand + KC_RGHT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, + TG(SYMB), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, + KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN), GUI_T(KC_QUOT), + MEH_T(KC_NO), KC_N, KC_M, KC_COMM, KC_DOT, CTL_T(KC_SLSH), KC_RSFT, + KC_UP, KC_DOWN, KC_LBRC, KC_RBRC, KC_FN1, + KC_LALT, CTL_T(KC_ESC), + KC_PGUP, + KC_PGDN, KC_TAB, KC_ENT +), /* Keymap 1: Symbol Layer * * ,---------------------------------------------------. ,--------------------------------------------------. @@ -76,26 +74,25 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | * `--------------------' `--------------------' */ -// SYMBOLS [SYMB] = LAYOUT_ergodox( - // left hand - VRSN, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, - KC_TRNS,KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS, - KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV, - KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS, - EPRM,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, - RGB_MOD,KC_TRNS, - KC_TRNS, - RGB_VAD,RGB_VAI,KC_TRNS, - // right hand - KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, - KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12, - KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS, - KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS, - KC_TRNS,KC_DOT, KC_0, KC_EQL, KC_TRNS, - RGB_TOG, RGB_SLD, - KC_TRNS, - KC_TRNS, RGB_HUD, RGB_HUI + // left hand + VRSN, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, + KC_TRNS, KC_EXLM, KC_AT, KC_LCBR, KC_RCBR, KC_PIPE, KC_TRNS, + KC_TRNS, KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, KC_GRV, + KC_TRNS, KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_TILD, KC_TRNS, + EPRM, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + RGB_MOD, KC_TRNS, + KC_TRNS, + RGB_VAD, RGB_VAI, KC_TRNS, + // right hand + KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12, + KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS, + KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS, + KC_TRNS, KC_DOT, KC_0, KC_EQL, KC_TRNS, + RGB_TOG, RGB_SLD, + KC_TRNS, + KC_TRNS, RGB_HUD, RGB_HUI ), /* Keymap 2: Media and mouse keys * @@ -118,25 +115,25 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | * `--------------------' `--------------------' */ -// MEDIA AND MOUSE [MDIA] = LAYOUT_ergodox( - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2, - KC_TRNS, KC_TRNS, - KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, - // right hand - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, - KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS, - KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, - KC_TRNS, - KC_TRNS, KC_TRNS, KC_WBAK + // left hand + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + // right hand + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, + KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS, + KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_WBAK ), }; From 106de349fb6410d0deb706ecb68ae1e78a4ef2db Mon Sep 17 00:00:00 2001 From: Yan-Fa Li Date: Tue, 4 Dec 2018 10:09:39 -0800 Subject: [PATCH 608/788] Invalid JSON (#4547) --- keyboards/converter/ibm_5291/info.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/converter/ibm_5291/info.json b/keyboards/converter/ibm_5291/info.json index 080a16336..48d835f33 100644 --- a/keyboards/converter/ibm_5291/info.json +++ b/keyboards/converter/ibm_5291/info.json @@ -2,5 +2,5 @@ "keyboard_name": "IBM 5291", "keyboard_folder": "converter/5291", "url": "https://deskthority.net/wiki/IBM_Model_F#IBM_5291_Keyboard", - "maintainer": "listofoptions", + "maintainer": "listofoptions" } From 6d0dc910d92bc381d3cce9ea712aa47ae40ddf15 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Tue, 4 Dec 2018 13:27:41 -0800 Subject: [PATCH 609/788] Rework drashna userspace to be more modular (#4544) * Break up files to make more readable * Add comments to ortho 4x12 layout rules.mk * Small tweaks * Update GitLab CI scripts * Make ortho boards smaller --- layouts/community/ortho_4x12/drashna/config.h | 4 +- layouts/community/ortho_4x12/drashna/rules.mk | 5 +- users/drashna/.gitlab-ci.yml | 2 +- users/drashna/config.h | 4 +- users/drashna/drashna.c | 271 +++------------- users/drashna/drashna.h | 301 +----------------- users/drashna/process_records.c | 175 ++++++++++ users/drashna/process_records.h | 101 ++++++ users/drashna/rgb_stuff.h | 6 + users/drashna/rules.mk | 3 +- users/drashna/tap_dances.c | 1 - users/drashna/tap_dances.h | 12 + users/drashna/wrappers.h | 170 ++++++++++ 13 files changed, 526 insertions(+), 529 deletions(-) create mode 100644 users/drashna/process_records.c create mode 100644 users/drashna/process_records.h create mode 100644 users/drashna/wrappers.h diff --git a/layouts/community/ortho_4x12/drashna/config.h b/layouts/community/ortho_4x12/drashna/config.h index f279651b6..8658802d8 100644 --- a/layouts/community/ortho_4x12/drashna/config.h +++ b/layouts/community/ortho_4x12/drashna/config.h @@ -31,11 +31,11 @@ #define EE_HANDS #endif -#if defined(KEYBOARD_planck_rev5) +#if !defined(KEYBOARD_planck_light) #ifdef RGBLIGHT_ENABLE #define NO_MUSIC_MODE #endif // RGBLIGHT_ENABLE -#endif // KEYBOARD_planck_rev5 +#endif // KEYBOARD_planck_light /* diff --git a/layouts/community/ortho_4x12/drashna/rules.mk b/layouts/community/ortho_4x12/drashna/rules.mk index 5e46cf112..a5429b8ff 100644 --- a/layouts/community/ortho_4x12/drashna/rules.mk +++ b/layouts/community/ortho_4x12/drashna/rules.mk @@ -5,12 +5,12 @@ CONSOLE_ENABLE = no # Console for debug(+400) COMMAND_ENABLE = no # Commands for debug and configuration TAP_DANCE_ENABLE = no AUDIO_ENABLE = yes -ifeq (,$(findstring planck/rev6,$(KEYBOARD))) +ifeq (,$(findstring planck/rev6,$(KEYBOARD))) # Make sure it's NOT the Planck Rev6 RGBLIGHT_ENABLE = yes INDICATOR_LIGHTS = yes RGBLIGHT_TWINKLE = yes endif -ifneq (,$(findstring planck/light,$(KEYBOARD))) +ifneq (,$(findstring planck/light,$(KEYBOARD))) # Make sure it IS the Planck Light RGB_MATRIX_ENABLE = yes RGBLIGHT_ENABLE = no endif @@ -23,4 +23,3 @@ endif MACROS_ENABLED = no - diff --git a/users/drashna/.gitlab-ci.yml b/users/drashna/.gitlab-ci.yml index 3c95ad850..bd693babc 100644 --- a/users/drashna/.gitlab-ci.yml +++ b/users/drashna/.gitlab-ci.yml @@ -13,7 +13,7 @@ qmk_firmware: - apt-get install -y build-essential avr-libc binutils-arm-none-eabi binutils-avr dfu-programmer dfu-util diffutils gcc gcc-arm-none-eabi gcc-avr git libnewlib-arm-none-eabi unzip wget zip - avr-gcc --version script: - - make iris/rev2:drashna iris/rev2:drashna_old ergodox_ez:drashna viterbi/rev1:drashna orthodox/rev1:drashna orthodox/rev3:drashna crkbd:drashna planck/light:drashna + - make iris/rev2:drashna:production iris/rev2:drashna_old:production ergodox_ez:drashna ergodox_ez:drashna_glow viterbi/rev1:drashna:production orthodox/rev1:drashna:production orthodox/rev3:drashna:production crkbd:drashna:production planck/light:drashna:production artifacts: name: "$CI_JOB_NAME-$CI_COMMIT_REF_SLUG" paths: diff --git a/users/drashna/config.h b/users/drashna/config.h index 06cae86ab..a33851230 100644 --- a/users/drashna/config.h +++ b/users/drashna/config.h @@ -3,7 +3,7 @@ #ifdef AUDIO_ENABLE #define AUDIO_CLICKY -#define STARTUP_SONG SONG(E1M1_DOOM) +#define STARTUP_SONG SONG(RICK_ROLL) #define GOODBYE_SONG SONG(SONIC_RING) #define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \ SONG(COLEMAK_SOUND), \ @@ -44,7 +44,7 @@ // and when this option isn't enabled, z rapidly followed by x // actually sends Ctrl-x. That's bad.) #define IGNORE_MOD_TAP_INTERRUPT -#define PERMISSIVE_HOLD +#undef PERMISSIVE_HOLD //#define TAPPING_FORCE_HOLD //#define RETRO_TAPPING diff --git a/users/drashna/drashna.c b/users/drashna/drashna.c index 8f10a530e..222824837 100644 --- a/users/drashna/drashna.c +++ b/users/drashna/drashna.c @@ -16,8 +16,6 @@ along with this program. If not, see . */ #include "drashna.h" -#include "tap_dances.h" -#include "rgb_stuff.h" userspace_config_t userspace_config; #if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE)) @@ -27,9 +25,6 @@ userspace_config_t userspace_config; #define DRASHNA_UNICODE_MODE 2 #endif -uint16_t copy_paste_timer; -// Helper Functions - // This block is for all of the gaming macros, as they were all doing // the same thing, but with differring text sent. @@ -109,55 +104,9 @@ void bootmagic_lite(void) { __attribute__ ((weak)) void matrix_init_keymap(void) {} -__attribute__ ((weak)) -void startup_keymap(void) {} - -__attribute__ ((weak)) -void shutdown_keymap(void) {} - -__attribute__ ((weak)) -void suspend_power_down_keymap(void) {} - -__attribute__ ((weak)) -void suspend_wakeup_init_keymap(void) {} - -__attribute__ ((weak)) -void matrix_scan_keymap(void) {} - -__attribute__ ((weak)) -bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { - return true; -} - -__attribute__ ((weak)) -bool process_record_secrets(uint16_t keycode, keyrecord_t *record) { - return true; -} - - -__attribute__ ((weak)) -uint32_t layer_state_set_keymap (uint32_t state) { - return state; -} - -__attribute__ ((weak)) -uint32_t default_layer_state_set_keymap (uint32_t state) { - return state; -} - -__attribute__ ((weak)) -void led_set_keymap(uint8_t usb_led) {} - -__attribute__ ((weak)) -void eeconfig_init_keymap(void) {} - // Call user matrix init, set default RGB colors and then // call the keymap's init function void matrix_init_user(void) { - #if !defined(BOOTMAGIC_LITE) && !defined(BOOTMAGIC_ENABLE) - bootmagic_lite(); - #endif - userspace_config.raw = eeconfig_read_user(); #ifdef BOOTLOADER_CATERINA @@ -178,40 +127,42 @@ void matrix_init_user(void) { #endif //RGBLIGHT_ENABLE } -void startup_user (void) { - // #ifdef RGBLIGHT_ENABLE - // matrix_init_rgb(); - // #endif //RGBLIGHT_ENABLE - startup_keymap(); -} + +__attribute__ ((weak)) +void shutdown_keymap(void) {} void shutdown_user (void) { -#ifdef RGBLIGHT_ENABLE - rgblight_enable_noeeprom(); - rgblight_mode_noeeprom(1); - rgblight_setrgb_red(); -#endif // RGBLIGHT_ENABLE -#ifdef RGB_MATRIX_ENABLE - rgb_led led; - for (int i = 0; i < DRIVER_LED_TOTAL; i++) { - led = g_rgb_leds[i]; - if (led.matrix_co.raw < 0xFF) { - rgb_matrix_set_color( i, 0xFF, 0x00, 0x00 ); - } - } -#endif //RGB_MATRIX_ENABLE + #ifdef RGBLIGHT_ENABLE + rgblight_enable_noeeprom(); + rgblight_mode_noeeprom(1); + rgblight_setrgb_red(); + #endif // RGBLIGHT_ENABLE + #ifdef RGB_MATRIX_ENABLE + uint16_t timer_start = timer_read(); + rgb_matrix_set_color_all( 0xFF, 0x00, 0x00 ); + while(timer_elapsed(timer_start) < 250) { wait_ms(1); } + #endif //RGB_MATRIX_ENABLE shutdown_keymap(); } +__attribute__ ((weak)) +void suspend_power_down_keymap(void) {} + void suspend_power_down_user(void) { suspend_power_down_keymap(); } +__attribute__ ((weak)) +void suspend_wakeup_init_keymap(void) {} + void suspend_wakeup_init_user(void) { suspend_wakeup_init_keymap(); } +__attribute__ ((weak)) +void matrix_scan_keymap(void) {} + // No global matrix scan code, so just run keymap's matrix // scan function void matrix_scan_user(void) { @@ -233,172 +184,11 @@ void matrix_scan_user(void) { } - - -// Defines actions tor my global custom keycodes. Defined in drashna.h file -// Then runs the _keymap's record handier if not processed here -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - - // If console is enabled, it will print the matrix position and status of each key pressed -#ifdef KEYLOGGER_ENABLE - #if defined(KEYBOARD_ergodox_ez) || defined(KEYBOARD_iris_rev2) - xprintf("KL: col: %u, row: %u, pressed: %u\n", record->event.key.row, record->event.key.col, record->event.pressed); - #else - xprintf("KL: col: %u, row: %u, pressed: %u\n", record->event.key.col, record->event.key.row, record->event.pressed); - #endif -#endif //KEYLOGGER_ENABLE - - switch (keycode) { - case KC_QWERTY: - if (record->event.pressed) { - set_single_persistent_default_layer(_QWERTY); - } - break; - case KC_COLEMAK: - if (record->event.pressed) { - set_single_persistent_default_layer(_COLEMAK); - } - break; - case KC_DVORAK: - if (record->event.pressed) { - set_single_persistent_default_layer(_DVORAK); - } - break; - case KC_WORKMAN: - if (record->event.pressed) { - set_single_persistent_default_layer(_WORKMAN); - } - break; - - - case KC_MAKE: // Compiles the firmware, and adds the flash command based on keyboard bootloader - if (!record->event.pressed) { - uint8_t temp_mod = get_mods(); - uint8_t temp_osm = get_oneshot_mods(); - clear_mods(); clear_oneshot_mods(); - send_string_with_delay_P(PSTR("make " QMK_KEYBOARD ":" QMK_KEYMAP), 10); - if (temp_mod & MODS_SHIFT_MASK || temp_osm & MODS_SHIFT_MASK) { - #if defined(__ARM__) - send_string_with_delay_P(PSTR(":dfu-util"), 10); - #elif defined(BOOTLOADER_DFU) - send_string_with_delay_P(PSTR(":dfu"), 10); - #elif defined(BOOTLOADER_HALFKAY) - send_string_with_delay_P(PSTR(":teensy"), 10); - #elif defined(BOOTLOADER_CATERINA) - send_string_with_delay_P(PSTR(":avrdude"), 10); - #endif // bootloader options - } - #if defined(KEYBOARD_viterbi) - send_string_with_delay_P(PSTR(":dfu"), 10); - #endif - if (temp_mod & MODS_CTRL_MASK || temp_osm & MODS_CTRL_MASK) { send_string_with_delay_P(PSTR(" -j8 --output-sync"), 10); } - send_string_with_delay_P(PSTR(SS_TAP(X_ENTER)), 10); - set_mods(temp_mod); - } - break; - - case VRSN: // Prints firmware version - if (record->event.pressed) { - send_string_with_delay_P(PSTR(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION ", Built on: " QMK_BUILDDATE), MACRO_TIMER); - } - break; - -// These are a serious of gaming macros. -// Only enables for the viterbi, basically, -// to save on firmware space, since it's limited. -#ifdef MACROS_ENABLED - case KC_OVERWATCH: // Toggle's if we hit "ENTER" or "BACKSPACE" to input macros - if (record->event.pressed) { userspace_config.is_overwatch ^= 1; eeconfig_update_user(userspace_config.raw); } -#ifdef RGBLIGHT_ENABLE - userspace_config.is_overwatch ? rgblight_mode_noeeprom(17) : rgblight_mode_noeeprom(18); -#endif //RGBLIGHT_ENABLE - break; - case KC_SALT: - return send_game_macro("Salt, salt, salt...", record, false); - case KC_MORESALT: - return send_game_macro("Please sir, can I have some more salt?!", record, false); - case KC_SALTHARD: - return send_game_macro("Your salt only makes me harder, and even more aggressive!", record, false); - case KC_GOODGAME: - return send_game_macro("Good game, everyone!", record, false); - case KC_GLHF: - return send_game_macro("Good luck, have fun!!!", record, false); - case KC_SYMM: - return send_game_macro("Left click to win!", record, false); - case KC_JUSTGAME: - return send_game_macro("It may be a game, but if you don't want to actually try, please go play AI, so that people that actually want to take the game seriously and \"get good\" have a place to do so without trolls like you throwing games.", record, false); - case KC_TORB: - return send_game_macro("That was positively riveting!", record, false); - case KC_AIM: - send_game_macro("That aim is absolutely amazing. It's almost like you're a machine!", record, true); - return send_game_macro("Wait! That aim is TOO good! You're clearly using an aim hack! CHEATER!", record, false); - case KC_C9: - return send_game_macro("OMG!!! C9!!!", record, false); - case KC_GGEZ: - return send_game_macro("That was a fantastic game, though it was a bit easy. Try harder next time!", record, false); -#endif // MACROS_ENABLED - - - case KC_DIABLO_CLEAR: // reset all Diablo timers, disabling them -#ifdef TAP_DANCE_ENABLE - if (record->event.pressed) { - uint8_t dtime; - for (dtime = 0; dtime < 4; dtime++) { - diablo_key_time[dtime] = diablo_times[0]; - } - } -#endif // TAP_DANCE_ENABLE - break; - - - case KC_CCCV: // One key copy/paste - if(record->event.pressed){ - copy_paste_timer = timer_read(); - } else { - if (timer_elapsed(copy_paste_timer) > TAPPING_TERM) { // Hold, copy - register_code(KC_LCTL); - tap_code(KC_C); - unregister_code(KC_LCTL); - } else { // Tap, paste - register_code(KC_LCTL); - tap_code(KC_V); - unregister_code(KC_LCTL); - } - } - break; -#ifdef UNICODE_ENABLE - case UC_FLIP: // (ノಠ痊ಠ)ノ彡┻━┻ - if (record->event.pressed) { - send_unicode_hex_string("0028 30CE 0CA0 75CA 0CA0 0029 30CE 5F61 253B 2501 253B"); - } - break; - case UC_TABL: // ┬─┬ノ( º _ ºノ) - if (record->event.pressed) { - send_unicode_hex_string("252C 2500 252C 30CE 0028 0020 00BA 0020 005F 0020 00BA 30CE 0029"); - } - break; - case UC_SHRG: // ¯\_(ツ)_/¯ - if (record->event.pressed) { - send_unicode_hex_string("00AF 005C 005F 0028 30C4 0029 005F 002F 00AF"); - } - break; - case UC_DISA: // ಠ_ಠ - if (record->event.pressed) { - send_unicode_hex_string("0CA0 005F 0CA0"); - } - break; -#endif - } - return process_record_keymap(keycode, record) && -#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE) - process_record_user_rgb(keycode, record) && -#endif // RGBLIGHT_ENABLE - process_record_secrets(keycode, record); +__attribute__ ((weak)) +uint32_t layer_state_set_keymap (uint32_t state) { + return state; } - - -// Runs state check and changes underglow color and animation // on layer change, no matter where the change was initiated // Then runs keymap's layer change check uint32_t layer_state_set_user(uint32_t state) { @@ -410,6 +200,12 @@ uint32_t layer_state_set_user(uint32_t state) { } +__attribute__ ((weak)) +uint32_t default_layer_state_set_keymap (uint32_t state) { + return state; +} + +// Runs state check and changes underglow color and animation uint32_t default_layer_state_set_user(uint32_t state) { state = default_layer_state_set_keymap(state); #ifdef RGBLIGHT_ENABLE @@ -418,6 +214,8 @@ uint32_t default_layer_state_set_user(uint32_t state) { return state; } +__attribute__ ((weak)) +void led_set_keymap(uint8_t usb_led) {} // Any custom LED code goes here. // So far, I only have keyboard specific code, @@ -426,6 +224,9 @@ void led_set_user(uint8_t usb_led) { led_set_keymap(usb_led); } +__attribute__ ((weak)) +void eeconfig_init_keymap(void) {} + void eeconfig_init_user(void) { userspace_config.raw = 0; userspace_config.rgb_layer_change = true; diff --git a/users/drashna/drashna.h b/users/drashna/drashna.h index 06e726714..0a3d0f632 100644 --- a/users/drashna/drashna.h +++ b/users/drashna/drashna.h @@ -19,9 +19,13 @@ along with this program. If not, see . #include "quantum.h" #include "version.h" #include "eeprom.h" - -#ifdef RGB_MATRIX_ENABLE -#include "rgb_matrix.h" +#include "wrappers.h" +#include "process_records.h" +#ifdef TAP_DANCE_ENABLE + #include "tap_dances.h" +#endif // TAP_DANCE_ENABLE +#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE) + #include "rgb_stuff.h" #endif @@ -51,17 +55,19 @@ define modifiers here, since MOD_* doesn't seem to work for these #define MODS_GUI_MASK (MOD_BIT(KC_LGUI)|MOD_BIT(KC_RGUI)) -/* -RGB color codes are no longer located here anymore. Instead, you will want to -head to https://github.com/qmk/qmk_firmware/blob/master/quantum/rgblight_list.h -*/ - -#ifdef RGBLIGHT_ENABLE -void rgblight_sethsv_default_helper(uint8_t index); -#endif // RGBLIGHT_ENABLE bool mod_key_press_timer (uint16_t code, uint16_t mod_code, bool pressed); bool mod_key_press (uint16_t code, uint16_t mod_code, bool pressed, uint16_t this_timer); +bool send_game_macro(const char *str, keyrecord_t *record, bool override); +void matrix_init_keymap(void); +void shutdown_keymap(void); +void suspend_power_down_keymap(void); +void suspend_wakeup_init_keymap(void); +void matrix_scan_keymap(void); +uint32_t layer_state_set_keymap (uint32_t state); +uint32_t default_layer_state_set_keymap (uint32_t state); +void led_set_keymap(uint8_t usb_led); +void eeconfig_init_keymap(void); typedef union { uint32_t raw; @@ -75,110 +81,6 @@ typedef union { extern userspace_config_t userspace_config; -#if defined(KEYMAP_SAFE_RANGE) - #define PLACEHOLDER_SAFE_RANGE KEYMAP_SAFE_RANGE -#else - #define PLACEHOLDER_SAFE_RANGE SAFE_RANGE -#endif - -enum userspace_custom_keycodes { - VRSN = PLACEHOLDER_SAFE_RANGE, // Prints QMK Firmware and board info - KC_QWERTY, // Sets default layer to QWERTY - KC_COLEMAK, // Sets default layer to COLEMAK - KC_DVORAK, // Sets default layer to DVORAK - KC_WORKMAN, // Sets default layer to WORKMAN - KC_DIABLO_CLEAR, // Clears all Diablo Timers - KC_OVERWATCH, // Toggles game macro input mode (so in OW, it defaults to game chat) - KC_SALT, // See drashna.c for details - KC_MORESALT, - KC_SALTHARD, - KC_GOODGAME, - KC_SYMM, - KC_JUSTGAME, - KC_GLHF, - KC_TORB, - KC_AIM, - KC_C9, - KC_GGEZ, - KC_MAKE, // Run keyboard's customized make command - KC_RGB_T, // Toggles RGB Layer Indication mode - KC_SECRET_1, // test1 - KC_SECRET_2, // test2 - KC_SECRET_3, // test3 - KC_SECRET_4, // test4 - KC_SECRET_5, // test5 - KC_CCCV, // Hold to copy, tap to paste - KC_NUKE, // NUCLEAR LAUNCH DETECTED!!! - UC_FLIP, // (ಠ痊ಠ)┻━┻ - UC_TABL, // ┬─┬ノ( º _ ºノ) - UC_SHRG, // ¯\_(ツ)_/¯ - UC_DISA, // ಠ_ಠ - NEW_SAFE_RANGE //use "NEWPLACEHOLDER for keymap specific codes -}; - - -#define LOWER MO(_LOWER) -#define RAISE MO(_RAISE) -#define ADJUST MO(_ADJUST) -#define TG_MODS TG(_MODS) -#define TG_GAME TG(_GAMEPAD) - -#define KC_SEC1 KC_SECRET_1 -#define KC_SEC2 KC_SECRET_2 -#define KC_SEC3 KC_SECRET_3 -#define KC_SEC4 KC_SECRET_4 -#define KC_SEC5 KC_SECRET_5 - -#define QWERTY KC_QWERTY -#define DVORAK KC_DVORAK -#define COLEMAK KC_COLEMAK -#define WORKMAN KC_WORKMAN - -#define KC_RESET RESET -#define KC_RST KC_RESET - -#ifdef SWAP_HANDS_ENABLE -#define KC_C1R3 SH_TT -#else // SWAP_HANDS_ENABLE -#define KC_C1R3 KC_BSPC -#endif // SWAP_HANDS_ENABLE - -#define BK_LWER LT(_LOWER, KC_BSPC) -#define SP_LWER LT(_LOWER, KC_SPC) -#define DL_RAIS LT(_RAISE, KC_DEL) -#define ET_RAIS LT(_RAISE, KC_ENTER) - -/* OSM keycodes, to keep things clean and easy to change */ -#define KC_MLSF OSM(MOD_LSFT) -#define KC_MRSF OSM(MOD_RSFT) - -#define OS_LGUI OSM(MOD_LGUI) -#define OS_RGUI OSM(MOD_RGUI) -#define OS_LSFT OSM(MOD_LSFT) -#define OS_RSFT OSM(MOD_RSFT) -#define OS_LCTL OSM(MOD_LCTL) -#define OS_RCTL OSM(MOD_RCTL) -#define OS_LALT OSM(MOD_LALT) -#define OS_RALT OSM(MOD_RALT) -#define OS_MEH OSM(MOD_MEH) -#define OS_HYPR OSM(MOD_HYPR) - -#define ALT_APP ALT_T(KC_APP) - -#define MG_NKRO MAGIC_TOGGLE_NKRO - -#define UC_IRNY UC(0x2E2E) -#define UC_CLUE UC(0x203D) - -#ifdef TAP_DANCE_ENABLE -enum { - TD_D3_1 = 0, - TD_D3_2, - TD_D3_3, - TD_D3_4 -}; -#endif // TAP_DANCE_ENABLE - /* Custom Keycodes for Diablo 3 layer @@ -196,172 +98,3 @@ We use custom codes here, so we can substitute the right stuff #define KC_D3_3 KC_3 #define KC_D3_4 KC_4 #endif // TAP_DANCE_ENABLE - -/* -Since our quirky block definitions are basically a list of comma separated -arguments, we need a wrapper in order for these definitions to be -expanded before being used as arguments to the LAYOUT_xxx macro. -*/ -#if (!defined(LAYOUT) && defined(KEYMAP)) -#define LAYOUT KEYMAP -#endif - -#define LAYOUT_ergodox_wrapper(...) LAYOUT_ergodox(__VA_ARGS__) -#define LAYOUT_ergodox_pretty_wrapper(...) LAYOUT_ergodox_pretty(__VA_ARGS__) -#define KEYMAP_wrapper(...) LAYOUT(__VA_ARGS__) -#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__) -#define LAYOUT_ortho_4x12_wrapper(...) LAYOUT_ortho_4x12(__VA_ARGS__) - -/* -Blocks for each of the four major keyboard layouts -Organized so we can quickly adapt and modify all of them -at once, rather than for each keyboard, one at a time. -And this allows for much cleaner blocks in the keymaps. -For instance Tap/Hold for Control on all of the layouts - -NOTE: These are all the same length. If you do a search/replace - then you need to add/remove underscores to keep the - lengths consistent. -*/ - -#define _________________QWERTY_L1_________________ KC_Q, KC_W, KC_E, KC_R, KC_T -#define _________________QWERTY_L2_________________ KC_A, KC_S, KC_D, KC_F, KC_G -#define _________________QWERTY_L3_________________ KC_Z, KC_X, KC_C, KC_V, KC_B - -#define _________________QWERTY_R1_________________ KC_Y, KC_U, KC_I, KC_O, KC_P -#define _________________QWERTY_R2_________________ KC_H, KC_J, KC_K, KC_L, KC_SCLN -#define _________________QWERTY_R3_________________ KC_N, KC_M, KC_COMM, KC_DOT, KC_SLASH - - -#define _________________COLEMAK_L1________________ KC_Q, KC_W, KC_F, KC_P, KC_G -#define _________________COLEMAK_L2________________ KC_A, KC_R, KC_S, KC_T, KC_D -#define _________________COLEMAK_L3________________ KC_Z, KC_X, KC_C, KC_V, KC_B - -#define _________________COLEMAK_R1________________ KC_J, KC_L, KC_U, KC_Y, KC_SCLN -#define _________________COLEMAK_R2________________ KC_H, KC_N, KC_E, KC_I, KC_O -#define _________________COLEMAK_R3________________ KC_K, KC_M, KC_COMM, KC_DOT, KC_SLASH - -#define ______________COLEMAK_MOD_DH_L1____________ KC_Q, KC_W, KC_F, KC_P, KC_B -#define ______________COLEMAK_MOD_DH_L2____________ KC_A, KC_R, KC_S, KC_T, KC_G -#define ______________COLEMAK_MOD_DH_L3____________ KC_Z, KC_X, KC_C, KC_D, KC_V - -#define ______________COLEMAK_MOD_DH_R1____________ KC_J, KC_L, KC_U, KC_Y, KC_SCLN -#define ______________COLEMAK_MOD_DH_R2____________ KC_M, KC_N, KC_E, KC_I, KC_O -#define ______________COLEMAK_MOD_DH_R3____________ KC_K, KC_H, KC_COMM, KC_DOT, KC_SLASH - - -#define _________________DVORAK_L1_________________ KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y -#define _________________DVORAK_L2_________________ KC_A, KC_O, KC_E, KC_U, KC_I -#define _________________DVORAK_L3_________________ KC_SCLN, KC_Q, KC_J, KC_K, KC_X - -#define _________________DVORAK_R1_________________ KC_F, KC_G, KC_C, KC_R, KC_L -#define _________________DVORAK_R2_________________ KC_D, KC_H, KC_T, KC_N, KC_S -#define _________________DVORAK_R3_________________ KC_B, KC_M, KC_W, KC_V, KC_Z - - -#define ________________DVORAK_AU_L1_______________ KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y -#define ________________DVORAK_AU_L2_______________ KC_O, KC_A, KC_E, KC_I, KC_U -#define ________________DVORAK_AU_L3_______________ KC_SCLN, KC_Q, KC_J, KC_K, KC_X - -#define ________________DVORAK_AU_R1_______________ KC_F, KC_G, KC_C, KC_R, KC_L -#define ________________DVORAK_AU_R2_______________ KC_D, KC_H, KC_T, KC_N, KC_S -#define ________________DVORAK_AU_R3_______________ KC_B, KC_M, KC_W, KC_V, KC_Z - -#define _________________WORKMAN_L1________________ KC_Q, KC_D, KC_R, KC_W, KC_B -#define _________________WORKMAN_L2________________ KC_A, KC_S, KC_H, KC_T, KC_G -#define _________________WORKMAN_L3________________ KC_Z, KC_X, KC_M, KC_C, KC_V - -#define _________________WORKMAN_R1________________ KC_J, KC_F, KC_U, KC_P, KC_SCLN -#define _________________WORKMAN_R2________________ KC_Y, KC_N, KC_E, KC_O, KC_I -#define _________________WORKMAN_R3________________ KC_K, KC_L, KC_COMM, KC_DOT, KC_SLASH - - -#define _________________NORMAN_L1_________________ KC_Q, KC_W, KC_D, KC_F, KC_K -#define _________________NORMAN_L2_________________ KC_A, KC_S, KC_E, KC_T, KC_G -#define _________________NORMAN_L3_________________ KC_Z, KC_X, KC_C, KC_V, KC_B - -#define _________________NORMAN_R1_________________ KC_J, KC_U, KC_R, KC_L, KC_SCLN -#define _________________NORMAN_R2_________________ KC_Y, KC_N, KC_I, KC_O, KC_U -#define _________________NORMAN_R3_________________ KC_P, KC_M, KC_COMM, KC_DOT, KC_SLASH - - -#define _________________MALTRON_L1________________ KC_Q, KC_P, KC_Y, KC_C, KC_B -#define _________________MALTRON_L2________________ KC_A, KC_N, KC_I, KC_S, KC_F -#define _________________MALTRON_L3________________ KC_SCLN, KC_SLSH, KC_J KC_G, KC_COMM - -#define _________________MALTRON_R1________________ KC_V, KC_M, KC_U, KC_Z, KC_L -#define _________________MALTRON_R2________________ KC_D, KC_T, KC_D, KC_O, KC_R -#define _________________MALTRON_R3________________ KC_DOT, KC_W, KC_K, KC_MINS, KC_X - - -#define _________________EUCALYN_L1________________ KC_SLSH, KC_COMM, KC_DOT, KC_F, KC_Q -#define _________________EUCALYN_L2________________ KC_A, KC_O, KC_E, KC_I, KC_U -#define _________________EUCALYN_L3________________ KC_Z, KC_X, KC_C, KC_V, KC_W - -#define _________________EUCALYN_R1________________ KC_M, KC_R, KC_D, KC_Y, KC_P -#define _________________EUCALYN_R2________________ KC_G, KC_T, KC_K, KC_S, KC_N -#define _________________EUCALYN_R3________________ KC_B, KC_H, KC_J, KC_L, KC_SCLN - - -#define _____________CARPLAX_QFMLWY_L1_____________ KC_Q, KC_F, KC_M, KC_L, KC_W -#define _____________CARPLAX_QFMLWY_L2_____________ KC_D, KC_S, KC_T, KC_N, KC_R -#define _____________CARPLAX_QFMLWY_L3_____________ KC_Z, KC_V, KC_G, KC_C, KC_X - -#define _____________CARPLAX_QFMLWY_R1_____________ KC_Y, KC_U, KC_O, KC_B, KC_J -#define _____________CARPLAX_QFMLWY_R2_____________ KC_I, KC_A, KC_E, KC_H, KC_SCLN -#define _____________CARPLAX_QFMLWY_R3_____________ KC_P, KC_K, KC_COMM, KC_DOT, KC_SLSH - - -#define _____________CARPLAX_QGMLWB_L1_____________ KC_Q, KC_G, KC_M, KC_L, KC_W -#define _____________CARPLAX_QGMLWB_L2_____________ KC_D, KC_S, KC_T, KC_N, KC_R -#define _____________CARPLAX_QGMLWB_L3_____________ KC_Z, KC_X, KC_C, KC_F, KC_J - -#define _____________CARPLAX_QGMLWB_R1_____________ KC_B, KC_Y, KC_U, KC_V, KC_SCLN -#define _____________CARPLAX_QGMLWB_R2_____________ KC_I, KC_A, KC_E, KC_O, KC_H -#define _____________CARPLAX_QGMLWB_R3_____________ KC_K, KC_P, KC_COMM, KC_DOT, KC_SLSH - - -#define _____________CARPLAX_QGMLWY_L1_____________ KC_Q, KC_G, KC_M, KC_L, KC_W -#define _____________CARPLAX_QGMLWY_L2_____________ KC_D, KC_S, KC_T, KC_N, KC_R -#define _____________CARPLAX_QGMLWY_L3_____________ KC_Z, KC_X, KC_C, KC_V, KC_J - -#define _____________CARPLAX_QGMLWY_R1_____________ KC_Y, KC_F, KC_U, KC_B, KC_SCLN -#define _____________CARPLAX_QGMLWY_R2_____________ KC_I, KC_A, KC_E, KC_O, KC_H -#define _____________CARPLAX_QGMLWY_R3_____________ KC_K, KC_P, KC_COMM, KC_DOT, KC_SLSH - - -#define ________________NUMBER_LEFT________________ KC_1, KC_2, KC_3, KC_4, KC_5 -#define ________________NUMBER_RIGHT_______________ KC_6, KC_7, KC_8, KC_9, KC_0 -#define _________________FUNC_LEFT_________________ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5 -#define _________________FUNC_RIGHT________________ KC_F6, KC_F7, KC_F8, KC_F9, KC_F10 - -#define ___________________BLANK___________________ _______, _______, _______, _______, _______ - - -#define _________________LOWER_L1__________________ KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC -#define _________________LOWER_L2__________________ _________________FUNC_LEFT_________________ -#define _________________LOWER_L3__________________ _________________FUNC_RIGHT________________ - -#define _________________LOWER_R1__________________ KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN -#define _________________LOWER_R2__________________ _______, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR -#define _________________LOWER_R3__________________ _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT - - - -#define _________________RAISE_L1__________________ ________________NUMBER_LEFT________________ -#define _________________RAISE_L2__________________ ___________________BLANK___________________ -#define _________________RAISE_L3__________________ ___________________BLANK___________________ - -#define _________________RAISE_R1__________________ ________________NUMBER_RIGHT_______________ -#define _________________RAISE_R2__________________ _______, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC -#define _________________RAISE_R3__________________ _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END - - - -#define _________________ADJUST_L1_________________ RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, RGB_TOG -#define _________________ADJUST_L2_________________ MU_TOG , CK_TOGG, AU_ON, AU_OFF, AG_NORM -#define _________________ADJUST_L3_________________ RGB_RMOD,RGB_HUD,RGB_SAD, RGB_VAD, KC_RGB_T - -#define _________________ADJUST_R1_________________ KC_SEC1, KC_SEC2, KC_SEC3, KC_SEC4, KC_SEC5 -#define _________________ADJUST_R2_________________ AG_SWAP, QWERTY, COLEMAK, DVORAK, WORKMAN -#define _________________ADJUST_R3_________________ MG_NKRO, KC_MUTE, KC_VOLD, KC_VOLU, KC_MNXT diff --git a/users/drashna/process_records.c b/users/drashna/process_records.c new file mode 100644 index 000000000..5e311e60e --- /dev/null +++ b/users/drashna/process_records.c @@ -0,0 +1,175 @@ +#include "drashna.h" + +uint16_t copy_paste_timer; + +__attribute__ ((weak)) +bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { + return true; +} + +__attribute__ ((weak)) +bool process_record_secrets(uint16_t keycode, keyrecord_t *record) { + return true; +} + + +// Defines actions tor my global custom keycodes. Defined in drashna.h file +// Then runs the _keymap's record handier if not processed here +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + + // If console is enabled, it will print the matrix position and status of each key pressed +#ifdef KEYLOGGER_ENABLE + #if defined(KEYBOARD_ergodox_ez) || defined(KEYBOARD_iris_rev2) + xprintf("KL: col: %u, row: %u, pressed: %u\n", record->event.key.row, record->event.key.col, record->event.pressed); + #else + xprintf("KL: col: %u, row: %u, pressed: %u\n", record->event.key.col, record->event.key.row, record->event.pressed); + #endif +#endif //KEYLOGGER_ENABLE + + switch (keycode) { + case KC_QWERTY: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + } + break; + case KC_COLEMAK: + if (record->event.pressed) { + set_single_persistent_default_layer(_COLEMAK); + } + break; + case KC_DVORAK: + if (record->event.pressed) { + set_single_persistent_default_layer(_DVORAK); + } + break; + case KC_WORKMAN: + if (record->event.pressed) { + set_single_persistent_default_layer(_WORKMAN); + } + break; + + + case KC_MAKE: // Compiles the firmware, and adds the flash command based on keyboard bootloader + if (!record->event.pressed) { + uint8_t temp_mod = get_mods(); + uint8_t temp_osm = get_oneshot_mods(); + clear_mods(); clear_oneshot_mods(); + send_string_with_delay_P(PSTR("make " QMK_KEYBOARD ":" QMK_KEYMAP), 10); + if (temp_mod & MODS_SHIFT_MASK || temp_osm & MODS_SHIFT_MASK) { + #if defined(__ARM__) + send_string_with_delay_P(PSTR(":dfu-util"), 10); + #elif defined(BOOTLOADER_DFU) + send_string_with_delay_P(PSTR(":dfu"), 10); + #elif defined(BOOTLOADER_HALFKAY) + send_string_with_delay_P(PSTR(":teensy"), 10); + #elif defined(BOOTLOADER_CATERINA) + send_string_with_delay_P(PSTR(":avrdude"), 10); + #endif // bootloader options + } + #if defined(KEYBOARD_viterbi) + send_string_with_delay_P(PSTR(":dfu"), 10); + #endif + if (temp_mod & MODS_CTRL_MASK || temp_osm & MODS_CTRL_MASK) { send_string_with_delay_P(PSTR(" -j8 --output-sync"), 10); } + send_string_with_delay_P(PSTR(SS_TAP(X_ENTER)), 10); + set_mods(temp_mod); + } + break; + + case VRSN: // Prints firmware version + if (record->event.pressed) { + send_string_with_delay_P(PSTR(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION ", Built on: " QMK_BUILDDATE), MACRO_TIMER); + } + break; + +// These are a serious of gaming macros. +// Only enables for the viterbi, basically, +// to save on firmware space, since it's limited. +#ifdef MACROS_ENABLED + case KC_OVERWATCH: // Toggle's if we hit "ENTER" or "BACKSPACE" to input macros + if (record->event.pressed) { userspace_config.is_overwatch ^= 1; eeconfig_update_user(userspace_config.raw); } +#ifdef RGBLIGHT_ENABLE + userspace_config.is_overwatch ? rgblight_mode_noeeprom(17) : rgblight_mode_noeeprom(18); +#endif //RGBLIGHT_ENABLE + break; + case KC_SALT: + return send_game_macro("Salt, salt, salt...", record, false); + case KC_MORESALT: + return send_game_macro("Please sir, can I have some more salt?!", record, false); + case KC_SALTHARD: + return send_game_macro("Your salt only makes me harder, and even more aggressive!", record, false); + case KC_GOODGAME: + return send_game_macro("Good game, everyone!", record, false); + case KC_GLHF: + return send_game_macro("Good luck, have fun!!!", record, false); + case KC_SYMM: + return send_game_macro("Left click to win!", record, false); + case KC_JUSTGAME: + return send_game_macro("It may be a game, but if you don't want to actually try, please go play AI, so that people that actually want to take the game seriously and \"get good\" have a place to do so without trolls like you throwing games.", record, false); + case KC_TORB: + return send_game_macro("That was positively riveting!", record, false); + case KC_AIM: + send_game_macro("That aim is absolutely amazing. It's almost like you're a machine!", record, true); + return send_game_macro("Wait! That aim is TOO good! You're clearly using an aim hack! CHEATER!", record, false); + case KC_C9: + return send_game_macro("OMG!!! C9!!!", record, false); + case KC_GGEZ: + return send_game_macro("That was a fantastic game, though it was a bit easy. Try harder next time!", record, false); +#endif // MACROS_ENABLED + + + case KC_DIABLO_CLEAR: // reset all Diablo timers, disabling them +#ifdef TAP_DANCE_ENABLE + if (record->event.pressed) { + uint8_t dtime; + for (dtime = 0; dtime < 4; dtime++) { + diablo_key_time[dtime] = diablo_times[0]; + } + } +#endif // TAP_DANCE_ENABLE + break; + + + case KC_CCCV: // One key copy/paste + if(record->event.pressed){ + copy_paste_timer = timer_read(); + } else { + if (timer_elapsed(copy_paste_timer) > TAPPING_TERM) { // Hold, copy + register_code(KC_LCTL); + tap_code(KC_C); + unregister_code(KC_LCTL); + } else { // Tap, paste + register_code(KC_LCTL); + tap_code(KC_V); + unregister_code(KC_LCTL); + } + } + break; +#ifdef UNICODE_ENABLE + case UC_FLIP: // (ノಠ痊ಠ)ノ彡┻━┻ + if (record->event.pressed) { + send_unicode_hex_string("0028 30CE 0CA0 75CA 0CA0 0029 30CE 5F61 253B 2501 253B"); + } + break; + case UC_TABL: // ┬─┬ノ( º _ ºノ) + if (record->event.pressed) { + send_unicode_hex_string("252C 2500 252C 30CE 0028 0020 00BA 0020 005F 0020 00BA 30CE 0029"); + } + break; + case UC_SHRG: // ¯\_(ツ)_/¯ + if (record->event.pressed) { + send_unicode_hex_string("00AF 005C 005F 0028 30C4 0029 005F 002F 00AF"); + } + break; + case UC_DISA: // ಠ_ಠ + if (record->event.pressed) { + send_unicode_hex_string("0CA0 005F 0CA0"); + } + break; +#endif + } + return process_record_keymap(keycode, record) && +#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE) + process_record_user_rgb(keycode, record) && +#endif // RGBLIGHT_ENABLE + process_record_secrets(keycode, record); +} diff --git a/users/drashna/process_records.h b/users/drashna/process_records.h new file mode 100644 index 000000000..620997add --- /dev/null +++ b/users/drashna/process_records.h @@ -0,0 +1,101 @@ +#pragma once +#include "drashna.h" + +#if defined(KEYMAP_SAFE_RANGE) + #define PLACEHOLDER_SAFE_RANGE KEYMAP_SAFE_RANGE +#else + #define PLACEHOLDER_SAFE_RANGE SAFE_RANGE +#endif + +enum userspace_custom_keycodes { + VRSN = PLACEHOLDER_SAFE_RANGE, // Prints QMK Firmware and board info + KC_QWERTY, // Sets default layer to QWERTY + KC_COLEMAK, // Sets default layer to COLEMAK + KC_DVORAK, // Sets default layer to DVORAK + KC_WORKMAN, // Sets default layer to WORKMAN + KC_DIABLO_CLEAR, // Clears all Diablo Timers + KC_OVERWATCH, // Toggles game macro input mode (so in OW, it defaults to game chat) + KC_SALT, // See drashna.c for details + KC_MORESALT, + KC_SALTHARD, + KC_GOODGAME, + KC_SYMM, + KC_JUSTGAME, + KC_GLHF, + KC_TORB, + KC_AIM, + KC_C9, + KC_GGEZ, + KC_MAKE, // Run keyboard's customized make command + KC_RGB_T, // Toggles RGB Layer Indication mode + KC_SECRET_1, // test1 + KC_SECRET_2, // test2 + KC_SECRET_3, // test3 + KC_SECRET_4, // test4 + KC_SECRET_5, // test5 + KC_CCCV, // Hold to copy, tap to paste + KC_NUKE, // NUCLEAR LAUNCH DETECTED!!! + UC_FLIP, // (ಠ痊ಠ)┻━┻ + UC_TABL, // ┬─┬ノ( º _ ºノ) + UC_SHRG, // ¯\_(ツ)_/¯ + UC_DISA, // ಠ_ಠ + NEW_SAFE_RANGE //use "NEWPLACEHOLDER for keymap specific codes +}; + +bool process_record_secrets(uint16_t keycode, keyrecord_t *record); +bool process_record_keymap(uint16_t keycode, keyrecord_t *record); + + + +#define LOWER MO(_LOWER) +#define RAISE MO(_RAISE) +#define ADJUST MO(_ADJUST) +#define TG_MODS TG(_MODS) +#define TG_GAME TG(_GAMEPAD) + +#define KC_SEC1 KC_SECRET_1 +#define KC_SEC2 KC_SECRET_2 +#define KC_SEC3 KC_SECRET_3 +#define KC_SEC4 KC_SECRET_4 +#define KC_SEC5 KC_SECRET_5 + +#define QWERTY KC_QWERTY +#define DVORAK KC_DVORAK +#define COLEMAK KC_COLEMAK +#define WORKMAN KC_WORKMAN + +#define KC_RESET RESET +#define KC_RST KC_RESET + +#ifdef SWAP_HANDS_ENABLE +#define KC_C1R3 SH_TT +#else // SWAP_HANDS_ENABLE +#define KC_C1R3 KC_BSPC +#endif // SWAP_HANDS_ENABLE + +#define BK_LWER LT(_LOWER, KC_BSPC) +#define SP_LWER LT(_LOWER, KC_SPC) +#define DL_RAIS LT(_RAISE, KC_DEL) +#define ET_RAIS LT(_RAISE, KC_ENTER) + +/* OSM keycodes, to keep things clean and easy to change */ +#define KC_MLSF OSM(MOD_LSFT) +#define KC_MRSF OSM(MOD_RSFT) + +#define OS_LGUI OSM(MOD_LGUI) +#define OS_RGUI OSM(MOD_RGUI) +#define OS_LSFT OSM(MOD_LSFT) +#define OS_RSFT OSM(MOD_RSFT) +#define OS_LCTL OSM(MOD_LCTL) +#define OS_RCTL OSM(MOD_RCTL) +#define OS_LALT OSM(MOD_LALT) +#define OS_RALT OSM(MOD_RALT) +#define OS_MEH OSM(MOD_MEH) +#define OS_HYPR OSM(MOD_HYPR) + +#define ALT_APP ALT_T(KC_APP) + +#define MG_NKRO MAGIC_TOGGLE_NKRO + +#define UC_IRNY UC(0x2E2E) +#define UC_CLUE UC(0x203D) diff --git a/users/drashna/rgb_stuff.h b/users/drashna/rgb_stuff.h index 3db068a31..065bda9f9 100644 --- a/users/drashna/rgb_stuff.h +++ b/users/drashna/rgb_stuff.h @@ -1,4 +1,8 @@ +#pragma once #include "quantum.h" +#ifdef RGB_MATRIX_ENABLE + #include "rgb_matrix.h" +#endif typedef struct { bool enabled; @@ -13,3 +17,5 @@ void matrix_init_rgb(void); void matrix_scan_rgb(void); uint32_t layer_state_set_rgb(uint32_t state); uint32_t default_layer_state_set_rgb(uint32_t state); +void rgblight_sethsv_default_helper(uint8_t index); +void rgb_matrix_set_color_all( uint8_t red, uint8_t green, uint8_t blue ); diff --git a/users/drashna/rules.mk b/users/drashna/rules.mk index 49b1ddae9..5f243b007 100644 --- a/users/drashna/rules.mk +++ b/users/drashna/rules.mk @@ -1,4 +1,5 @@ -SRC += drashna.c +SRC += drashna.c \ + process_records.c ifneq ("$(wildcard $(USER_PATH)/secrets.c)","") SRC += secrets.c diff --git a/users/drashna/tap_dances.c b/users/drashna/tap_dances.c index 346675853..cbb3cf54e 100644 --- a/users/drashna/tap_dances.c +++ b/users/drashna/tap_dances.c @@ -1,4 +1,3 @@ -#include "drashna.h" #include "tap_dances.h" diff --git a/users/drashna/tap_dances.h b/users/drashna/tap_dances.h index 8935753f6..41d2bacb7 100644 --- a/users/drashna/tap_dances.h +++ b/users/drashna/tap_dances.h @@ -1,3 +1,6 @@ +#pragma once +#include "drashna.h" + //define diablo macro timer variables extern uint16_t diablo_timer[4]; extern uint8_t diablo_times[]; @@ -5,3 +8,12 @@ extern uint8_t diablo_key_time[4]; void run_diablo_macro_check(void); + +#ifdef TAP_DANCE_ENABLE +enum { + TD_D3_1 = 0, + TD_D3_2, + TD_D3_3, + TD_D3_4 +}; +#endif // TAP_DANCE_ENABLE diff --git a/users/drashna/wrappers.h b/users/drashna/wrappers.h new file mode 100644 index 000000000..b45359f67 --- /dev/null +++ b/users/drashna/wrappers.h @@ -0,0 +1,170 @@ +#pragma once +#include "drashna.h" +/* +Since our quirky block definitions are basically a list of comma separated +arguments, we need a wrapper in order for these definitions to be +expanded before being used as arguments to the LAYOUT_xxx macro. +*/ +#if (!defined(LAYOUT) && defined(KEYMAP)) +#define LAYOUT KEYMAP +#endif + +#define LAYOUT_ergodox_wrapper(...) LAYOUT_ergodox(__VA_ARGS__) +#define LAYOUT_ergodox_pretty_wrapper(...) LAYOUT_ergodox_pretty(__VA_ARGS__) +#define KEYMAP_wrapper(...) LAYOUT(__VA_ARGS__) +#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__) +#define LAYOUT_ortho_4x12_wrapper(...) LAYOUT_ortho_4x12(__VA_ARGS__) + +/* +Blocks for each of the four major keyboard layouts +Organized so we can quickly adapt and modify all of them +at once, rather than for each keyboard, one at a time. +And this allows for much cleaner blocks in the keymaps. +For instance Tap/Hold for Control on all of the layouts + +NOTE: These are all the same length. If you do a search/replace + then you need to add/remove underscores to keep the + lengths consistent. +*/ + +#define _________________QWERTY_L1_________________ KC_Q, KC_W, KC_E, KC_R, KC_T +#define _________________QWERTY_L2_________________ KC_A, KC_S, KC_D, KC_F, KC_G +#define _________________QWERTY_L3_________________ KC_Z, KC_X, KC_C, KC_V, KC_B + +#define _________________QWERTY_R1_________________ KC_Y, KC_U, KC_I, KC_O, KC_P +#define _________________QWERTY_R2_________________ KC_H, KC_J, KC_K, KC_L, KC_SCLN +#define _________________QWERTY_R3_________________ KC_N, KC_M, KC_COMM, KC_DOT, KC_SLASH + + +#define _________________COLEMAK_L1________________ KC_Q, KC_W, KC_F, KC_P, KC_G +#define _________________COLEMAK_L2________________ KC_A, KC_R, KC_S, KC_T, KC_D +#define _________________COLEMAK_L3________________ KC_Z, KC_X, KC_C, KC_V, KC_B + +#define _________________COLEMAK_R1________________ KC_J, KC_L, KC_U, KC_Y, KC_SCLN +#define _________________COLEMAK_R2________________ KC_H, KC_N, KC_E, KC_I, KC_O +#define _________________COLEMAK_R3________________ KC_K, KC_M, KC_COMM, KC_DOT, KC_SLASH + +#define ______________COLEMAK_MOD_DH_L1____________ KC_Q, KC_W, KC_F, KC_P, KC_B +#define ______________COLEMAK_MOD_DH_L2____________ KC_A, KC_R, KC_S, KC_T, KC_G +#define ______________COLEMAK_MOD_DH_L3____________ KC_Z, KC_X, KC_C, KC_D, KC_V + +#define ______________COLEMAK_MOD_DH_R1____________ KC_J, KC_L, KC_U, KC_Y, KC_SCLN +#define ______________COLEMAK_MOD_DH_R2____________ KC_M, KC_N, KC_E, KC_I, KC_O +#define ______________COLEMAK_MOD_DH_R3____________ KC_K, KC_H, KC_COMM, KC_DOT, KC_SLASH + + +#define _________________DVORAK_L1_________________ KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y +#define _________________DVORAK_L2_________________ KC_A, KC_O, KC_E, KC_U, KC_I +#define _________________DVORAK_L3_________________ KC_SCLN, KC_Q, KC_J, KC_K, KC_X + +#define _________________DVORAK_R1_________________ KC_F, KC_G, KC_C, KC_R, KC_L +#define _________________DVORAK_R2_________________ KC_D, KC_H, KC_T, KC_N, KC_S +#define _________________DVORAK_R3_________________ KC_B, KC_M, KC_W, KC_V, KC_Z + + +#define ________________DVORAK_AU_L1_______________ KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y +#define ________________DVORAK_AU_L2_______________ KC_O, KC_A, KC_E, KC_I, KC_U +#define ________________DVORAK_AU_L3_______________ KC_SCLN, KC_Q, KC_J, KC_K, KC_X + +#define ________________DVORAK_AU_R1_______________ KC_F, KC_G, KC_C, KC_R, KC_L +#define ________________DVORAK_AU_R2_______________ KC_D, KC_H, KC_T, KC_N, KC_S +#define ________________DVORAK_AU_R3_______________ KC_B, KC_M, KC_W, KC_V, KC_Z + +#define _________________WORKMAN_L1________________ KC_Q, KC_D, KC_R, KC_W, KC_B +#define _________________WORKMAN_L2________________ KC_A, KC_S, KC_H, KC_T, KC_G +#define _________________WORKMAN_L3________________ KC_Z, KC_X, KC_M, KC_C, KC_V + +#define _________________WORKMAN_R1________________ KC_J, KC_F, KC_U, KC_P, KC_SCLN +#define _________________WORKMAN_R2________________ KC_Y, KC_N, KC_E, KC_O, KC_I +#define _________________WORKMAN_R3________________ KC_K, KC_L, KC_COMM, KC_DOT, KC_SLASH + + +#define _________________NORMAN_L1_________________ KC_Q, KC_W, KC_D, KC_F, KC_K +#define _________________NORMAN_L2_________________ KC_A, KC_S, KC_E, KC_T, KC_G +#define _________________NORMAN_L3_________________ KC_Z, KC_X, KC_C, KC_V, KC_B + +#define _________________NORMAN_R1_________________ KC_J, KC_U, KC_R, KC_L, KC_SCLN +#define _________________NORMAN_R2_________________ KC_Y, KC_N, KC_I, KC_O, KC_U +#define _________________NORMAN_R3_________________ KC_P, KC_M, KC_COMM, KC_DOT, KC_SLASH + + +#define _________________MALTRON_L1________________ KC_Q, KC_P, KC_Y, KC_C, KC_B +#define _________________MALTRON_L2________________ KC_A, KC_N, KC_I, KC_S, KC_F +#define _________________MALTRON_L3________________ KC_SCLN, KC_SLSH, KC_J KC_G, KC_COMM + +#define _________________MALTRON_R1________________ KC_V, KC_M, KC_U, KC_Z, KC_L +#define _________________MALTRON_R2________________ KC_D, KC_T, KC_D, KC_O, KC_R +#define _________________MALTRON_R3________________ KC_DOT, KC_W, KC_K, KC_MINS, KC_X + + +#define _________________EUCALYN_L1________________ KC_SLSH, KC_COMM, KC_DOT, KC_F, KC_Q +#define _________________EUCALYN_L2________________ KC_A, KC_O, KC_E, KC_I, KC_U +#define _________________EUCALYN_L3________________ KC_Z, KC_X, KC_C, KC_V, KC_W + +#define _________________EUCALYN_R1________________ KC_M, KC_R, KC_D, KC_Y, KC_P +#define _________________EUCALYN_R2________________ KC_G, KC_T, KC_K, KC_S, KC_N +#define _________________EUCALYN_R3________________ KC_B, KC_H, KC_J, KC_L, KC_SCLN + + +#define _____________CARPLAX_QFMLWY_L1_____________ KC_Q, KC_F, KC_M, KC_L, KC_W +#define _____________CARPLAX_QFMLWY_L2_____________ KC_D, KC_S, KC_T, KC_N, KC_R +#define _____________CARPLAX_QFMLWY_L3_____________ KC_Z, KC_V, KC_G, KC_C, KC_X + +#define _____________CARPLAX_QFMLWY_R1_____________ KC_Y, KC_U, KC_O, KC_B, KC_J +#define _____________CARPLAX_QFMLWY_R2_____________ KC_I, KC_A, KC_E, KC_H, KC_SCLN +#define _____________CARPLAX_QFMLWY_R3_____________ KC_P, KC_K, KC_COMM, KC_DOT, KC_SLSH + + +#define _____________CARPLAX_QGMLWB_L1_____________ KC_Q, KC_G, KC_M, KC_L, KC_W +#define _____________CARPLAX_QGMLWB_L2_____________ KC_D, KC_S, KC_T, KC_N, KC_R +#define _____________CARPLAX_QGMLWB_L3_____________ KC_Z, KC_X, KC_C, KC_F, KC_J + +#define _____________CARPLAX_QGMLWB_R1_____________ KC_B, KC_Y, KC_U, KC_V, KC_SCLN +#define _____________CARPLAX_QGMLWB_R2_____________ KC_I, KC_A, KC_E, KC_O, KC_H +#define _____________CARPLAX_QGMLWB_R3_____________ KC_K, KC_P, KC_COMM, KC_DOT, KC_SLSH + + +#define _____________CARPLAX_QGMLWY_L1_____________ KC_Q, KC_G, KC_M, KC_L, KC_W +#define _____________CARPLAX_QGMLWY_L2_____________ KC_D, KC_S, KC_T, KC_N, KC_R +#define _____________CARPLAX_QGMLWY_L3_____________ KC_Z, KC_X, KC_C, KC_V, KC_J + +#define _____________CARPLAX_QGMLWY_R1_____________ KC_Y, KC_F, KC_U, KC_B, KC_SCLN +#define _____________CARPLAX_QGMLWY_R2_____________ KC_I, KC_A, KC_E, KC_O, KC_H +#define _____________CARPLAX_QGMLWY_R3_____________ KC_K, KC_P, KC_COMM, KC_DOT, KC_SLSH + + +#define ________________NUMBER_LEFT________________ KC_1, KC_2, KC_3, KC_4, KC_5 +#define ________________NUMBER_RIGHT_______________ KC_6, KC_7, KC_8, KC_9, KC_0 +#define _________________FUNC_LEFT_________________ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5 +#define _________________FUNC_RIGHT________________ KC_F6, KC_F7, KC_F8, KC_F9, KC_F10 + +#define ___________________BLANK___________________ _______, _______, _______, _______, _______ + + +#define _________________LOWER_L1__________________ KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC +#define _________________LOWER_L2__________________ _________________FUNC_LEFT_________________ +#define _________________LOWER_L3__________________ _________________FUNC_RIGHT________________ + +#define _________________LOWER_R1__________________ KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN +#define _________________LOWER_R2__________________ _______, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR +#define _________________LOWER_R3__________________ _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT + + + +#define _________________RAISE_L1__________________ ________________NUMBER_LEFT________________ +#define _________________RAISE_L2__________________ ___________________BLANK___________________ +#define _________________RAISE_L3__________________ ___________________BLANK___________________ + +#define _________________RAISE_R1__________________ ________________NUMBER_RIGHT_______________ +#define _________________RAISE_R2__________________ _______, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC +#define _________________RAISE_R3__________________ _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END + + + +#define _________________ADJUST_L1_________________ RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, RGB_TOG +#define _________________ADJUST_L2_________________ MU_TOG , CK_TOGG, AU_ON, AU_OFF, AG_NORM +#define _________________ADJUST_L3_________________ RGB_RMOD,RGB_HUD,RGB_SAD, RGB_VAD, KC_RGB_T + +#define _________________ADJUST_R1_________________ KC_SEC1, KC_SEC2, KC_SEC3, KC_SEC4, KC_SEC5 +#define _________________ADJUST_R2_________________ AG_SWAP, QWERTY, COLEMAK, DVORAK, WORKMAN +#define _________________ADJUST_R3_________________ MG_NKRO, KC_MUTE, KC_VOLD, KC_VOLU, KC_MNXT From 8a330b33ff41ffc1ec3f8fa39722e93115ea3f0f Mon Sep 17 00:00:00 2001 From: Legonut Date: Tue, 4 Dec 2018 21:15:52 -0500 Subject: [PATCH 610/788] Keyboard: Add new keyboard "Sol" from RGBKB (#4497) * Add final RGBKB Sol firmware * Apply suggestions from code review Apply most of the changes noroadsleft has suggested Co-Authored-By: Legonut * Cleanup readme * Cleanup keymaps per @noroadslefts suggestions * Remove eeproms, use set_single_persistent_default_layer * Suggestions from @noroadsleft and @drashna some small cleanup * Change RGB_SMOD to RGB_RMOD * fix RGB_SMOD * Apply suggestions from code review Remove redundant lines Co-Authored-By: Legonut --- keyboards/sol/common/glcdfont.c | 244 +++++++++++++ keyboards/sol/common/knob_v2.c | 71 ++++ keyboards/sol/common/knob_v2.h | 28 ++ keyboards/sol/common/ssd1306.c | 329 ++++++++++++++++++ keyboards/sol/common/ssd1306.h | 92 +++++ keyboards/sol/config.h | 22 ++ keyboards/sol/i2c.c | 162 +++++++++ keyboards/sol/i2c.h | 49 +++ keyboards/sol/keymaps/brianweyer/config.h | 27 ++ keyboards/sol/keymaps/brianweyer/keymap.c | 291 ++++++++++++++++ keyboards/sol/keymaps/brianweyer/rules.mk | 46 +++ keyboards/sol/keymaps/danielhklein/config.h | 25 ++ keyboards/sol/keymaps/danielhklein/keymap.c | 354 +++++++++++++++++++ keyboards/sol/keymaps/danielhklein/rules.mk | 50 +++ keyboards/sol/keymaps/default/config.h | 25 ++ keyboards/sol/keymaps/default/keymap.c | 362 ++++++++++++++++++++ keyboards/sol/keymaps/default/readme.md | 133 +++++++ keyboards/sol/keymaps/default/rules.mk | 50 +++ keyboards/sol/keymaps/kageurufu/config.h | 25 ++ keyboards/sol/keymaps/kageurufu/keymap.c | 335 ++++++++++++++++++ keyboards/sol/keymaps/kageurufu/readme.md | 47 +++ keyboards/sol/keymaps/kageurufu/rules.mk | 46 +++ keyboards/sol/readme.md | 15 + keyboards/sol/rev1/config.h | 155 +++++++++ keyboards/sol/rev1/matrix.c | 304 ++++++++++++++++ keyboards/sol/rev1/rev1.c | 15 + keyboards/sol/rev1/rev1.h | 70 ++++ keyboards/sol/rev1/rules.mk | 2 + keyboards/sol/rev1/split_util.c | 54 +++ keyboards/sol/rev1/split_util.h | 17 + keyboards/sol/rules.mk | 71 ++++ keyboards/sol/serial.c | 288 ++++++++++++++++ keyboards/sol/serial.h | 26 ++ keyboards/sol/sol.c | 1 + keyboards/sol/sol.h | 7 + 35 files changed, 3838 insertions(+) create mode 100644 keyboards/sol/common/glcdfont.c create mode 100644 keyboards/sol/common/knob_v2.c create mode 100644 keyboards/sol/common/knob_v2.h create mode 100644 keyboards/sol/common/ssd1306.c create mode 100644 keyboards/sol/common/ssd1306.h create mode 100644 keyboards/sol/config.h create mode 100644 keyboards/sol/i2c.c create mode 100644 keyboards/sol/i2c.h create mode 100755 keyboards/sol/keymaps/brianweyer/config.h create mode 100755 keyboards/sol/keymaps/brianweyer/keymap.c create mode 100755 keyboards/sol/keymaps/brianweyer/rules.mk create mode 100644 keyboards/sol/keymaps/danielhklein/config.h create mode 100644 keyboards/sol/keymaps/danielhklein/keymap.c create mode 100644 keyboards/sol/keymaps/danielhklein/rules.mk create mode 100644 keyboards/sol/keymaps/default/config.h create mode 100644 keyboards/sol/keymaps/default/keymap.c create mode 100644 keyboards/sol/keymaps/default/readme.md create mode 100644 keyboards/sol/keymaps/default/rules.mk create mode 100644 keyboards/sol/keymaps/kageurufu/config.h create mode 100644 keyboards/sol/keymaps/kageurufu/keymap.c create mode 100644 keyboards/sol/keymaps/kageurufu/readme.md create mode 100644 keyboards/sol/keymaps/kageurufu/rules.mk create mode 100644 keyboards/sol/readme.md create mode 100644 keyboards/sol/rev1/config.h create mode 100644 keyboards/sol/rev1/matrix.c create mode 100644 keyboards/sol/rev1/rev1.c create mode 100644 keyboards/sol/rev1/rev1.h create mode 100644 keyboards/sol/rev1/rules.mk create mode 100644 keyboards/sol/rev1/split_util.c create mode 100644 keyboards/sol/rev1/split_util.h create mode 100644 keyboards/sol/rules.mk create mode 100644 keyboards/sol/serial.c create mode 100644 keyboards/sol/serial.h create mode 100644 keyboards/sol/sol.c create mode 100644 keyboards/sol/sol.h diff --git a/keyboards/sol/common/glcdfont.c b/keyboards/sol/common/glcdfont.c new file mode 100644 index 000000000..89665ba07 --- /dev/null +++ b/keyboards/sol/common/glcdfont.c @@ -0,0 +1,244 @@ +// This is the 'classic' fixed-space bitmap font for Adafruit_GFX since 1.0. +// See gfxfont.h for newer custom bitmap font info. + +#ifndef FONT5X7_H +#define FONT5X7_H + +#ifdef __AVR__ + #include + #include +#elif defined(ESP8266) + #include +#else + #define PROGMEM +#endif + +// Standard ASCII 5x7 font + +static const unsigned char font[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x00, + 0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x00, + 0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x00, + 0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x00, + 0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x00, + 0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00, + 0x00, 0x18, 0x3C, 0x18, 0x00, 0x00, + 0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00, + 0x00, 0x18, 0x24, 0x18, 0x00, 0x00, + 0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x00, + 0x30, 0x48, 0x3A, 0x06, 0x0E, 0x00, + 0x26, 0x29, 0x79, 0x29, 0x26, 0x00, + 0x40, 0x7F, 0x05, 0x05, 0x07, 0x00, + 0x40, 0x7F, 0x05, 0x25, 0x3F, 0x00, + 0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x00, + 0x7F, 0x3E, 0x1C, 0x1C, 0x08, 0x00, + 0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x00, + 0x14, 0x22, 0x7F, 0x22, 0x14, 0x00, + 0x5F, 0x5F, 0x00, 0x5F, 0x5F, 0x00, + 0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00, + 0x00, 0x66, 0x89, 0x95, 0x6A, 0x00, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, + 0x94, 0xA2, 0xFF, 0xA2, 0x94, 0x00, + 0x08, 0x04, 0x7E, 0x04, 0x08, 0x00, + 0x10, 0x20, 0x7E, 0x20, 0x10, 0x00, + 0x08, 0x08, 0x2A, 0x1C, 0x08, 0x00, + 0x08, 0x1C, 0x2A, 0x08, 0x08, 0x00, + 0x1E, 0x10, 0x10, 0x10, 0x10, 0x00, + 0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x00, + 0x30, 0x38, 0x3E, 0x38, 0x30, 0x00, + 0x06, 0x0E, 0x3E, 0x0E, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, + 0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00, + 0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00, + 0x23, 0x13, 0x08, 0x64, 0x62, 0x00, + 0x36, 0x49, 0x56, 0x20, 0x50, 0x00, + 0x00, 0x08, 0x07, 0x03, 0x00, 0x00, + 0x00, 0x1C, 0x22, 0x41, 0x00, 0x00, + 0x00, 0x41, 0x22, 0x1C, 0x00, 0x00, + 0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x00, + 0x08, 0x08, 0x3E, 0x08, 0x08, 0x00, + 0x00, 0x80, 0x70, 0x30, 0x00, 0x00, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, + 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, + 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, + 0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00, + 0x00, 0x42, 0x7F, 0x40, 0x00, 0x00, + 0x72, 0x49, 0x49, 0x49, 0x46, 0x00, + 0x21, 0x41, 0x49, 0x4D, 0x33, 0x00, + 0x18, 0x14, 0x12, 0x7F, 0x10, 0x00, + 0x27, 0x45, 0x45, 0x45, 0x39, 0x00, + 0x3C, 0x4A, 0x49, 0x49, 0x31, 0x00, + 0x41, 0x21, 0x11, 0x09, 0x07, 0x00, + 0x36, 0x49, 0x49, 0x49, 0x36, 0x00, + 0x46, 0x49, 0x49, 0x29, 0x1E, 0x00, + 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x00, 0x40, 0x34, 0x00, 0x00, 0x00, + 0x00, 0x08, 0x14, 0x22, 0x41, 0x00, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x00, + 0x00, 0x41, 0x22, 0x14, 0x08, 0x00, + 0x02, 0x01, 0x59, 0x09, 0x06, 0x00, + 0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x00, + 0x7C, 0x12, 0x11, 0x12, 0x7C, 0x00, + 0x7F, 0x49, 0x49, 0x49, 0x36, 0x00, + 0x3E, 0x41, 0x41, 0x41, 0x22, 0x00, + 0x7F, 0x41, 0x41, 0x41, 0x3E, 0x00, + 0x7F, 0x49, 0x49, 0x49, 0x41, 0x00, + 0x7F, 0x09, 0x09, 0x09, 0x01, 0x00, + 0x3E, 0x41, 0x41, 0x51, 0x73, 0x00, + 0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00, + 0x00, 0x41, 0x7F, 0x41, 0x00, 0x00, + 0x20, 0x40, 0x41, 0x3F, 0x01, 0x00, + 0x7F, 0x08, 0x14, 0x22, 0x41, 0x00, + 0x7F, 0x40, 0x40, 0x40, 0x40, 0x00, + 0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x00, + 0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00, + 0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00, + 0x7F, 0x09, 0x09, 0x09, 0x06, 0x00, + 0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00, + 0x7F, 0x09, 0x19, 0x29, 0x46, 0x00, + 0x26, 0x49, 0x49, 0x49, 0x32, 0x00, + 0x03, 0x01, 0x7F, 0x01, 0x03, 0x00, + 0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00, + 0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00, + 0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00, + 0x63, 0x14, 0x08, 0x14, 0x63, 0x00, + 0x03, 0x04, 0x78, 0x04, 0x03, 0x00, + 0x61, 0x59, 0x49, 0x4D, 0x43, 0x00, + 0x00, 0x7F, 0x41, 0x41, 0x41, 0x00, + 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, + 0x00, 0x41, 0x41, 0x41, 0x7F, 0x00, + 0x04, 0x02, 0x01, 0x02, 0x04, 0x00, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, + 0x00, 0x03, 0x07, 0x08, 0x00, 0x00, + 0x20, 0x54, 0x54, 0x78, 0x40, 0x00, + 0x7F, 0x28, 0x44, 0x44, 0x38, 0x00, + 0x38, 0x44, 0x44, 0x44, 0x28, 0x00, + 0x38, 0x44, 0x44, 0x28, 0x7F, 0x00, + 0x38, 0x54, 0x54, 0x54, 0x18, 0x00, + 0x00, 0x08, 0x7E, 0x09, 0x02, 0x00, + 0x18, 0xA4, 0xA4, 0x9C, 0x78, 0x00, + 0x7F, 0x08, 0x04, 0x04, 0x78, 0x00, + 0x00, 0x44, 0x7D, 0x40, 0x00, 0x00, + 0x20, 0x40, 0x40, 0x3D, 0x00, 0x00, + 0x7F, 0x10, 0x28, 0x44, 0x00, 0x00, + 0x00, 0x41, 0x7F, 0x40, 0x00, 0x00, + 0x7C, 0x04, 0x78, 0x04, 0x78, 0x00, + 0x7C, 0x08, 0x04, 0x04, 0x78, 0x00, + 0x38, 0x44, 0x44, 0x44, 0x38, 0x00, + 0xFC, 0x18, 0x24, 0x24, 0x18, 0x00, + 0x18, 0x24, 0x24, 0x18, 0xFC, 0x00, + 0x7C, 0x08, 0x04, 0x04, 0x08, 0x00, + 0x48, 0x54, 0x54, 0x54, 0x24, 0x00, + 0x04, 0x04, 0x3F, 0x44, 0x24, 0x00, + 0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00, + 0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00, + 0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00, + 0x44, 0x28, 0x10, 0x28, 0x44, 0x00, + 0x4C, 0x90, 0x90, 0x90, 0x7C, 0x00, + 0x44, 0x64, 0x54, 0x4C, 0x44, 0x00, + 0x00, 0x08, 0x36, 0x41, 0x00, 0x00, + 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, + 0x00, 0x41, 0x36, 0x08, 0x00, 0x00, + 0x02, 0x01, 0x02, 0x04, 0x02, 0x00, + 0x3C, 0x26, 0x23, 0x26, 0x3C, 0x00, + 0x03, 0x07, 0x1F, 0x7F, 0xFF, 0xFF, + 0xFE, 0xF8, 0xF0, 0xC0, 0x20, 0xF8, + 0xFE, 0xFF, 0xFE, 0x79, 0x27, 0x1F, + 0x7F, 0xFF, 0xFF, 0xFE, 0xF8, 0xF0, + 0xC0, 0x20, 0xF8, 0xFE, 0xFF, 0xFF, + 0x7F, 0x3F, 0x3F, 0x7F, 0xFF, 0xFE, + 0xF8, 0xF0, 0xC0, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0x7F, 0x7F, 0x7F, + 0xBF, 0xBF, 0xC0, 0xC0, 0xC0, 0xE0, + 0xE0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, + 0xF8, 0x78, 0x78, 0x7C, 0x3C, 0x3C, + 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, + 0xBF, 0xBF, 0xDF, 0xDF, 0xEF, 0xEF, + 0x00, 0x03, 0x07, 0x1F, 0x7F, 0xFF, + 0xFF, 0xFF, 0xFE, 0xF8, 0xE0, 0xC0, + 0xE0, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, + 0x7F, 0x1F, 0x07, 0x03, 0x00, 0x00, + 0xE0, 0xF0, 0xF0, 0xF0, 0xE0, 0xEC, + 0xEE, 0xF7, 0xF3, 0x70, 0x20, 0x00, + 0x7C, 0x7C, 0x7C, 0x7E, 0x00, 0x7E, + 0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x00, + 0x00, 0x80, 0xC0, 0xE0, 0x7E, 0x5B, + 0x4F, 0x5B, 0xFE, 0xC0, 0x00, 0x00, + 0xC0, 0x00, 0xDC, 0xD7, 0xDE, 0xDE, + 0xDE, 0xD7, 0xDC, 0x00, 0xC0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xC1, 0xF3, + 0xCF, 0xBF, 0x7F, 0xFF, 0xFF, 0xFC, + 0xFB, 0xE7, 0x81, 0x00, 0x00, 0x00, + 0x00, 0x80, 0xE3, 0xCF, 0x3F, 0xFF, + 0xFF, 0xFF, 0xFC, 0xFB, 0xE7, 0x81, + 0x00, 0x00, 0x00, 0x00, 0x81, 0xE7, + 0xFF, 0xFF, 0xFF, 0xFF, 0x3C, 0x00, + 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF8, 0xF8, 0xFC, 0x7C, 0x7E, + 0x7E, 0x3E, 0xFE, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF7, 0xF7, 0xF7, 0xFB, + 0xFB, 0x7D, 0x7D, 0x7D, 0xBE, 0xBE, + 0xBE, 0xDF, 0xDF, 0xE0, 0xE0, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0xFC, 0xFC, 0x7C, 0x7E, 0x7E, + 0x3E, 0x3E, 0x1F, 0x1F, 0x1F, 0x0F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, + 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x81, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0F, 0x1F, 0x3F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x7F, 0x3F, 0x1E, 0x0C, 0x00, + 0x1F, 0x1F, 0x1F, 0x3F, 0x00, 0x3F, + 0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x00, + 0x30, 0x7B, 0x7F, 0x78, 0x30, 0x20, + 0x20, 0x30, 0x78, 0x7F, 0x3B, 0x00, + 0x03, 0x00, 0x0F, 0x7F, 0x0F, 0x0F, + 0x0F, 0x7F, 0x0F, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x70, 0x7C, 0x7F, 0x7F, 0x7F, + 0x7F, 0x1F, 0x06, 0x01, 0x03, 0x0F, + 0x3F, 0x7F, 0x7F, 0x7E, 0x7C, 0x7C, + 0x7E, 0x7F, 0x7F, 0x7F, 0x1F, 0x06, + 0x01, 0x07, 0x0F, 0x3F, 0x7F, 0x7F, + 0x7E, 0x7C, 0x7C, 0x7E, 0x7F, 0x7F, + 0x3F, 0x0F, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x7F, 0x7D, 0x7D, 0x3D, 0x3E, + 0x1E, 0x1F, 0x1F, 0x1F, 0x0F, 0x0F, + 0x07, 0x07, 0x07, 0x03, 0x03, 0x00, + 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, + 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x00, + 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, + 0x00, 0x40, 0x70, 0x78, 0x7E, 0x7F, + 0x7F, 0x7F, 0x3F, 0x0F, 0x03, 0x01, + 0x03, 0x0F, 0x3F, 0x7F, 0x7F, 0x7F, + 0x7E, 0x78, 0x70, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; +#endif // FONT5X7_H diff --git a/keyboards/sol/common/knob_v2.c b/keyboards/sol/common/knob_v2.c new file mode 100644 index 000000000..f22f7c5d8 --- /dev/null +++ b/keyboards/sol/common/knob_v2.c @@ -0,0 +1,71 @@ +#include "knob_v2.h" + +bool knob_prev_a = false; +static knob_report_t knob_report = {.dir = 0, .phase = 0}; + +void knob_init(void) { + // I use pins D1 (ISR1) & D4 for a knob. + + // Set pin mode for D4 as input. + DDRD &= ~(0UL << ENCODER_PIN_2); + + // Enable internal pull-up for D4. + // This is done by "writing" 1 to a pin that has its mode set to input. + PORTD |= (1 << ENCODER_PIN_2); + + // Enable interrupt for D1 + // For more info on the below flags see this awesome section 11.1 (pages 89-90) here: + // https://cdn-shop.adafruit.com/datasheets/atmel-7766-8-bit-avr-atmega16u4-32u4_datasheet.pdf + // Set pin mode & pull-up. + DDRD &= ~(0UL << ENCODER_PIN_1); + PORTD |= (1UL << ENCODER_PIN_1); + + // INT: 33221100 + EICRA |= 0b00010000; // 0b01 - any edge + // INT: 6 3210 + EIMSK |= 0b00000100; +} + +ISR(ENCODER_INT) { + bool a = PIND & (1 << ENCODER_PIN_1); + + if (knob_prev_a != a) { + // "A" channel has REALLY changed. + knob_report.phase = a; + knob_prev_a = a; + bool b = PIND & (1 << ENCODER_PIN_2); + if (a == b) { + // Halfway through CCW rotation (A == B) + // + // +---YOU ARE HERE (A=1, B=1) + // | +---OR HERE (A=0, B=0) + // | | + // v v + // A: _____/^^^^^\__ + // B: __/^^^^^\_____ + knob_report.dir++; + } else { + // Halfway through CW rotation (A != B) + // + // +---YOU ARE HERE (A=1, B=0) + // | +---OR HERE (A=0, B=1) + // | | + // v v + // A: _____/^^^^^\_____ + // B: ________/^^^^^\__ + knob_report.dir--; + } + } +} + +knob_report_t knob_report_read(void) { + // Return knob report. + return knob_report; +} + +void knob_report_reset(void) { + // Call this ASAP once you've processed the previous knob report. + // TODO: This should probably be called within `knob_report_read`. + knob_report.dir = 0; + knob_report.phase = 0; +} diff --git a/keyboards/sol/common/knob_v2.h b/keyboards/sol/common/knob_v2.h new file mode 100644 index 000000000..45196eb1a --- /dev/null +++ b/keyboards/sol/common/knob_v2.h @@ -0,0 +1,28 @@ +// Rotary knob implementation - Version 2. +// Uses 2 digital pins - D2 (via interrupt) & D6. +// #include "rev1.h" +#include +#include +#include + +#ifndef ENCODER_PIN_1 + #define ENCODER_PIN_1 PD2 +#endif +#ifndef ENCODER_PIN_2 + #define ENCODER_PIN_2 PD6 +#endif +#ifndef ENCODER_INT + #define ENCODER_INT INT2_vect +#endif + +typedef struct knob_report_t { + int8_t dir; // Contains number of rotations that happened + int8_t phase; // Contains 0 if last rotation happened on 90 degrees, 1 if on 270 +} knob_report_t; + +void knob_init(void); +knob_report_t knob_report_read(void); +void knob_report_reset(void); + +bool knob_prev_a; +int8_t knob_dir; diff --git a/keyboards/sol/common/ssd1306.c b/keyboards/sol/common/ssd1306.c new file mode 100644 index 000000000..b3e55a67c --- /dev/null +++ b/keyboards/sol/common/ssd1306.c @@ -0,0 +1,329 @@ +#ifdef SSD1306OLED + +#include "ssd1306.h" +#include "i2c.h" +#include +#include "print.h" +#ifndef LOCAL_GLCDFONT +#include "common/glcdfont.c" +#else +#include +#endif +#ifdef ADAFRUIT_BLE_ENABLE +#include "adafruit_ble.h" +#endif +#ifdef PROTOCOL_LUFA +#include "lufa.h" +#endif +#include "sendchar.h" +#include "timer.h" + +// Set this to 1 to help diagnose early startup problems +// when testing power-on with ble. Turn it off otherwise, +// as the latency of printing most of the debug info messes +// with the matrix scan, causing keys to drop. +#define DEBUG_TO_SCREEN 0 + +//static uint16_t last_battery_update; +//static uint32_t vbat; +//#define BatteryUpdateInterval 10000 /* milliseconds */ +#define ScreenOffInterval 300000 /* milliseconds */ +#if DEBUG_TO_SCREEN +static uint8_t displaying; +#endif +static uint16_t last_flush; + +// Write command sequence. +// Returns true on success. +static inline bool _send_cmd1(uint8_t cmd) { + bool res = false; + + if (i2c_start_write(SSD1306_ADDRESS)) { + xprintf("failed to start write to %d\n", SSD1306_ADDRESS); + goto done; + } + + if (i2c_master_write(0x0 /* command byte follows */)) { + print("failed to write control byte\n"); + + goto done; + } + + if (i2c_master_write(cmd)) { + xprintf("failed to write command %d\n", cmd); + goto done; + } + res = true; +done: + i2c_master_stop(); + return res; +} + +// Write 2-byte command sequence. +// Returns true on success +static inline bool _send_cmd2(uint8_t cmd, uint8_t opr) { + if (!_send_cmd1(cmd)) { + return false; + } + return _send_cmd1(opr); +} + +// Write 3-byte command sequence. +// Returns true on success +static inline bool _send_cmd3(uint8_t cmd, uint8_t opr1, uint8_t opr2) { + if (!_send_cmd1(cmd)) { + return false; + } + if (!_send_cmd1(opr1)) { + return false; + } + return _send_cmd1(opr2); +} + +#define send_cmd1(c) if (!_send_cmd1(c)) {goto done;} +#define send_cmd2(c,o) if (!_send_cmd2(c,o)) {goto done;} +#define send_cmd3(c,o1,o2) if (!_send_cmd3(c,o1,o2)) {goto done;} + +static void clear_display(void) { + matrix_clear(&display); + + // Clear all of the display bits (there can be random noise + // in the RAM on startup) + send_cmd3(PageAddr, 0, (DisplayHeight / 8) - 1); + send_cmd3(ColumnAddr, 0, DisplayWidth - 1); + + if (i2c_start_write(SSD1306_ADDRESS)) { + goto done; + } + if (i2c_master_write(0x40)) { + // Data mode + goto done; + } + for (uint8_t row = 0; row < MatrixRows; ++row) { + for (uint8_t col = 0; col < DisplayWidth; ++col) { + i2c_master_write(0); + } + } + + display.dirty = false; + +done: + i2c_master_stop(); +} + +#if DEBUG_TO_SCREEN +#undef sendchar +static int8_t capture_sendchar(uint8_t c) { + sendchar(c); + iota_gfx_write_char(c); + + if (!displaying) { + iota_gfx_flush(); + } + return 0; +} +#endif + +bool iota_gfx_init(bool rotate) { + bool success = false; + + i2c_master_init(); + send_cmd1(DisplayOff); + send_cmd2(SetDisplayClockDiv, 0x80); + send_cmd2(SetMultiPlex, DisplayHeight - 1); + + send_cmd2(SetDisplayOffset, 0); + + + send_cmd1(SetStartLine | 0x0); + send_cmd2(SetChargePump, 0x14 /* Enable */); + send_cmd2(SetMemoryMode, 0 /* horizontal addressing */); + + if(rotate){ + // the following Flip the display orientation 180 degrees + send_cmd1(SegRemap); + send_cmd1(ComScanInc); + }else{ + // Flips the display orientation 0 degrees + send_cmd1(SegRemap | 0x1); + send_cmd1(ComScanDec); + } + + send_cmd2(SetComPins, 0x2); + send_cmd2(SetContrast, 0x8f); + send_cmd2(SetPreCharge, 0xf1); + send_cmd2(SetVComDetect, 0x40); + send_cmd1(DisplayAllOnResume); + send_cmd1(NormalDisplay); + send_cmd1(DeActivateScroll); + send_cmd1(DisplayOn); + + send_cmd2(SetContrast, 0); // Dim + + clear_display(); + + success = true; + + iota_gfx_flush(); + +#if DEBUG_TO_SCREEN + print_set_sendchar(capture_sendchar); +#endif + +done: + return success; +} + +bool iota_gfx_off(void) { + bool success = false; + + send_cmd1(DisplayOff); + success = true; + +done: + return success; +} + +bool iota_gfx_on(void) { + bool success = false; + + send_cmd1(DisplayOn); + success = true; + +done: + return success; +} + +void matrix_write_char_inner(struct CharacterMatrix *matrix, uint8_t c) { + *matrix->cursor = c; + ++matrix->cursor; + + if (matrix->cursor - &matrix->display[0][0] == sizeof(matrix->display)) { + // We went off the end; scroll the display upwards by one line + memmove(&matrix->display[0], &matrix->display[1], + MatrixCols * (MatrixRows - 1)); + matrix->cursor = &matrix->display[MatrixRows - 1][0]; + memset(matrix->cursor, ' ', MatrixCols); + } +} + +void matrix_write_char(struct CharacterMatrix *matrix, uint8_t c) { + matrix->dirty = true; + + if (c == '\n') { + // Clear to end of line from the cursor and then move to the + // start of the next line + uint8_t cursor_col = (matrix->cursor - &matrix->display[0][0]) % MatrixCols; + + while (cursor_col++ < MatrixCols) { + matrix_write_char_inner(matrix, ' '); + } + return; + } + + matrix_write_char_inner(matrix, c); +} + +void iota_gfx_write_char(uint8_t c) { + matrix_write_char(&display, c); +} + +void matrix_write(struct CharacterMatrix *matrix, const char *data) { + const char *end = data + strlen(data); + while (data < end) { + matrix_write_char(matrix, *data); + ++data; + } +} + +void iota_gfx_write(const char *data) { + matrix_write(&display, data); +} + +void matrix_write_P(struct CharacterMatrix *matrix, const char *data) { + while (true) { + uint8_t c = pgm_read_byte(data); + if (c == 0) { + return; + } + matrix_write_char(matrix, c); + ++data; + } +} + +void iota_gfx_write_P(const char *data) { + matrix_write_P(&display, data); +} + +void matrix_clear(struct CharacterMatrix *matrix) { + memset(matrix->display, ' ', sizeof(matrix->display)); + matrix->cursor = &matrix->display[0][0]; + matrix->dirty = true; +} + +void iota_gfx_clear_screen(void) { + matrix_clear(&display); +} + +void matrix_render(struct CharacterMatrix *matrix) { + last_flush = timer_read(); + iota_gfx_on(); +#if DEBUG_TO_SCREEN + ++displaying; +#endif + + // Move to the home position + send_cmd3(PageAddr, 0, MatrixRows - 1); + send_cmd3(ColumnAddr, 0, (MatrixCols * FontWidth) - 1); + + if (i2c_start_write(SSD1306_ADDRESS)) { + goto done; + } + if (i2c_master_write(0x40)) { + // Data mode + goto done; + } + + for (uint8_t row = 0; row < MatrixRows; ++row) { + for (uint8_t col = 0; col < MatrixCols; ++col) { + const uint8_t *glyph = font + (matrix->display[row][col] * FontWidth); + + for (uint8_t glyphCol = 0; glyphCol < FontWidth; ++glyphCol) { + uint8_t colBits = pgm_read_byte(glyph + glyphCol); + i2c_master_write(colBits); + } + + // 1 column of space between chars (it's not included in the glyph) + //i2c_master_write(0); + } + } + + matrix->dirty = false; + +done: + i2c_master_stop(); +#if DEBUG_TO_SCREEN + --displaying; +#endif +} + +void iota_gfx_flush(void) { + matrix_render(&display); +} + +__attribute__ ((weak)) +void iota_gfx_task_user(void) { +} + +void iota_gfx_task(void) { + iota_gfx_task_user(); + + if (display.dirty) { + iota_gfx_flush(); + } + + if (timer_elapsed(last_flush) > ScreenOffInterval) { + iota_gfx_off(); + } +} +#endif diff --git a/keyboards/sol/common/ssd1306.h b/keyboards/sol/common/ssd1306.h new file mode 100644 index 000000000..77ce7c211 --- /dev/null +++ b/keyboards/sol/common/ssd1306.h @@ -0,0 +1,92 @@ +#ifndef SSD1306_H +#define SSD1306_H + +#include +#include +#include "pincontrol.h" + +enum ssd1306_cmds { + DisplayOff = 0xAE, + DisplayOn = 0xAF, + + SetContrast = 0x81, + DisplayAllOnResume = 0xA4, + + DisplayAllOn = 0xA5, + NormalDisplay = 0xA6, + InvertDisplay = 0xA7, + SetDisplayOffset = 0xD3, + SetComPins = 0xda, + SetVComDetect = 0xdb, + SetDisplayClockDiv = 0xD5, + SetPreCharge = 0xd9, + SetMultiPlex = 0xa8, + SetLowColumn = 0x00, + SetHighColumn = 0x10, + SetStartLine = 0x40, + + SetMemoryMode = 0x20, + ColumnAddr = 0x21, + PageAddr = 0x22, + + ComScanInc = 0xc0, + ComScanDec = 0xc8, + SegRemap = 0xa0, + SetChargePump = 0x8d, + ExternalVcc = 0x01, + SwitchCapVcc = 0x02, + + ActivateScroll = 0x2f, + DeActivateScroll = 0x2e, + SetVerticalScrollArea = 0xa3, + RightHorizontalScroll = 0x26, + LeftHorizontalScroll = 0x27, + VerticalAndRightHorizontalScroll = 0x29, + VerticalAndLeftHorizontalScroll = 0x2a, +}; + +// Controls the SSD1306 128x32 OLED display via i2c + +#ifndef SSD1306_ADDRESS +#define SSD1306_ADDRESS 0x3C +#endif + +#define DisplayHeight 32 +#define DisplayWidth 128 + +#define FontHeight 8 +#define FontWidth 6 + +#define MatrixRows (DisplayHeight / FontHeight) +#define MatrixCols (DisplayWidth / FontWidth) + +struct CharacterMatrix { + uint8_t display[MatrixRows][MatrixCols]; + uint8_t *cursor; + bool dirty; +}; + +struct CharacterMatrix display; + +bool iota_gfx_init(bool rotate); +void iota_gfx_task(void); +bool iota_gfx_off(void); +bool iota_gfx_on(void); +void iota_gfx_flush(void); +void iota_gfx_write_char(uint8_t c); +void iota_gfx_write(const char *data); +void iota_gfx_write_P(const char *data); +void iota_gfx_clear_screen(void); + +void iota_gfx_task_user(void); + +void matrix_clear(struct CharacterMatrix *matrix); +void matrix_write_char_inner(struct CharacterMatrix *matrix, uint8_t c); +void matrix_write_char(struct CharacterMatrix *matrix, uint8_t c); +void matrix_write(struct CharacterMatrix *matrix, const char *data); +void matrix_write_P(struct CharacterMatrix *matrix, const char *data); +void matrix_render(struct CharacterMatrix *matrix); + + + +#endif diff --git a/keyboards/sol/config.h b/keyboards/sol/config.h new file mode 100644 index 000000000..93fd2261b --- /dev/null +++ b/keyboards/sol/config.h @@ -0,0 +1,22 @@ +/* +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#pragma once + +#include "config_common.h" + diff --git a/keyboards/sol/i2c.c b/keyboards/sol/i2c.c new file mode 100644 index 000000000..4bee5c639 --- /dev/null +++ b/keyboards/sol/i2c.c @@ -0,0 +1,162 @@ +#include +#include +#include +#include +#include +#include +#include "i2c.h" + +#ifdef USE_I2C + +// Limits the amount of we wait for any one i2c transaction. +// Since were running SCL line 100kHz (=> 10μs/bit), and each transactions is +// 9 bits, a single transaction will take around 90μs to complete. +// +// (F_CPU/SCL_CLOCK) => # of μC cycles to transfer a bit +// poll loop takes at least 8 clock cycles to execute +#define I2C_LOOP_TIMEOUT (9+1)*(F_CPU/SCL_CLOCK)/8 + +#define BUFFER_POS_INC() (slave_buffer_pos = (slave_buffer_pos+1)%SLAVE_BUFFER_SIZE) + +volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE]; + +static volatile uint8_t slave_buffer_pos; +static volatile bool slave_has_register_set = false; + +// Wait for an i2c operation to finish +inline static +void i2c_delay(void) { + uint16_t lim = 0; + while(!(TWCR & (1<10. + // Check datasheets for more info. + TWBR = ((F_CPU/SCL_CLOCK)-16)/2; +} + +// Start a transaction with the given i2c slave address. The direction of the +// transfer is set with I2C_READ and I2C_WRITE. +// returns: 0 => success +// 1 => error +uint8_t i2c_master_start(uint8_t address) { + TWCR = (1< slave ACK +// 1 => slave NACK +uint8_t i2c_master_write(uint8_t data) { + TWDR = data; + TWCR = (1<= SLAVE_BUFFER_SIZE ) { + ack = 0; + slave_buffer_pos = 0; + } + slave_has_register_set = true; + } else { + i2c_slave_buffer[slave_buffer_pos] = TWDR; + BUFFER_POS_INC(); + } + break; + + case TW_ST_SLA_ACK: + case TW_ST_DATA_ACK: + // master has addressed this device as a slave transmitter and is + // requesting data. + TWDR = i2c_slave_buffer[slave_buffer_pos]; + BUFFER_POS_INC(); + break; + + case TW_BUS_ERROR: // something went wrong, reset twi state + TWCR = 0; + default: + break; + } + // Reset everything, so we are ready for the next TWI interrupt + TWCR |= (1< + +#ifndef F_CPU +#define F_CPU 16000000UL +#endif + +#define I2C_READ 1 +#define I2C_WRITE 0 + +#define I2C_ACK 1 +#define I2C_NACK 0 + +#define SLAVE_BUFFER_SIZE 0x10 + +// i2c SCL clock frequency 400kHz +#define SCL_CLOCK 400000L + +extern volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE]; + +void i2c_master_init(void); +uint8_t i2c_master_start(uint8_t address); +void i2c_master_stop(void); +uint8_t i2c_master_write(uint8_t data); +uint8_t i2c_master_read(int); +void i2c_reset_state(void); +void i2c_slave_init(uint8_t address); + + +static inline unsigned char i2c_start_read(unsigned char addr) { + return i2c_master_start((addr << 1) | I2C_READ); +} + +static inline unsigned char i2c_start_write(unsigned char addr) { + return i2c_master_start((addr << 1) | I2C_WRITE); +} + +// from SSD1306 scrips +extern unsigned char i2c_rep_start(unsigned char addr); +extern void i2c_start_wait(unsigned char addr); +extern unsigned char i2c_readAck(void); +extern unsigned char i2c_readNak(void); +extern unsigned char i2c_read(unsigned char ack); + +#define i2c_read(ack) (ack) ? i2c_readAck() : i2c_readNak(); + +#endif diff --git a/keyboards/sol/keymaps/brianweyer/config.h b/keyboards/sol/keymaps/brianweyer/config.h new file mode 100755 index 000000000..87b7dd2ac --- /dev/null +++ b/keyboards/sol/keymaps/brianweyer/config.h @@ -0,0 +1,27 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#pragma once + +#define SSD1306OLED + + +// place overrides here + diff --git a/keyboards/sol/keymaps/brianweyer/keymap.c b/keyboards/sol/keymaps/brianweyer/keymap.c new file mode 100755 index 000000000..2259e246d --- /dev/null +++ b/keyboards/sol/keymaps/brianweyer/keymap.c @@ -0,0 +1,291 @@ +#include QMK_KEYBOARD_H +#ifdef PROTOCOL_LUFA +#include "lufa.h" +#include "split_util.h" +#endif +#ifdef SSD1306OLED + #include "common/ssd1306.h" +#endif + +extern keymap_config_t keymap_config; + +#ifdef RGBLIGHT_ENABLE +//Following line allows macro to read current RGB settings +extern rgblight_config_t rgblight_config; +#endif + +extern uint8_t is_master; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +enum layer_number { + _QWERTY = 0, + _FN, + _ADJ +}; + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + FN, + ADJ, + RGBRST +}; + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* QWERTY + * ,------------------------------------------------. ,------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | - | | = | 6 | 7 | 8 | 9 | 0 | Bspc | + * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| + * | Tab | Q | W | E | R | T | [ | | ] | Y | U | I | O | P | \ | + * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| + * | Esc | A | S | D | F | G | | | | H | J | K | L | ; | ' | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | | | | N | M | , | . | / | Shift| + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | Ctrl | Alt | FN | LGui | RGB | Spc | Del | | Bspc | Spc | Adj | LGui | FN | Alt | Ctrl | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | Spc | Ent | | Ent | Spc | + * `-------------' `-------------' + */ + [_QWERTY] = LAYOUT_kc( \ + //,--------+--------+--------+--------+--------+--------+--+--------+. ,--------+--+--------+--------+--------+--------+--------+--------+ + GRV, 1, 2, 3, 4, 5, MINS, EQL, 6, 7, 8, 9, 0, BSPC, + //|--------+--------+--------+--------+--------+--------+--+--------| |--------+--+--------+--------+--------+--------+--------+--------| + TAB, Q, W, E, R, T, LBRC, RBRC, Y, U, I, O, P, BSLS, + //|--------+--------+--------+--------+--------+--------+--+--------| |--------+--+--------+--------+--------+--------+--------+--------| + ESC, A, S, D, F, G, _______, _______, H, J, K, L, SCLN, QUOT, + //|--------+--------+--------+--------+--------+--------+--+--------| |--------+--+--------+--------+--------+--------+--------+--------| + LSPO, Z, X, C, V, B, _______, _______, N, M, COMM, DOT, SLSH, RSPC, + //|--------+--------+--------+--------+--------+--------+--+--------| |--------+--+--------+--------+--------+--------+--------+--------| + LCTL, LALT, FN, LGUI, RGB_MOD, SPC, DEL, BSPC, SPC, ADJ, LGUI, FN, LALT, LCTL, + //|--------+--------+--------+--------+--------+--+--------+--------| |--------+--+--------+--------+--------+--------+--------+--------| + VOLD, VOLU, SPC, ENT, ENT, SPC, DOWN, UP + // Rotary Left |--------+--------| |--------+-----------+ Rotary Right + ), + + /* FN + * ,------------------------------------------------. ,------------------------------------------------. + * | F1 | F2 | F3 | F4 | F5 | F6 | | | | F7 | F8 | F9 | F10 | F11 | F12 | + * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| + * | | | | Up | | | | | | | | | | | | + * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| + * | | | Left | Down | Right| | | | | Play | Next | Mute | V-Up |V-Down| | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | | | | | | | | | | | | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | | | | | | | | | | | | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | | | + * `-------------' `-------------' + */ + [_FN] = LAYOUT_kc( \ + //,--------+--------+--------+--------+--------+--------+--+--------+. ,--------+--+--------+--------+--------+--------+--------+--------+ + F1, F2, F3, F4, F5, F6, _______, _______, F7, F8, F9, F10, F11, F12, + //|--------+--------+--------+--------+--------+--------+--+--------| |--------+--+--------+--------+--------+--------+--------+--------| + _______, _______, _______, UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + //|--------+--------+--------+--------+--------+--------+--+--------| |--------+--+--------+--------+--------+--------+--------+--------| + _______, _______, LEFT, DOWN, RGHT, _______, _______, _______, MPLY, MNXT, MUTE, VOLD, VOLU, _______, + //|--------+--------+--------+--------+--------+--------+--+--------| |--------+--+--------+--------+--------+--------+--------+--------| + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + //|--------+--------+--------+--------+--------+--------+--+--------| |--------+--+--------+--------+--------+--------+--------+--------| + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + //|--------+--------+--------+--------+--------+--+--------+--------| |--------+--+--------+--------+--------+--------+--------+--------| + VOLD, VOLU, _______, _______, _______, _______, UP, DOWN + // Rotary Left |--------+--------| |--------+-----------+ Rotary Right + ), + + /* ADJ + * ,------------------------------------------------. ,------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| + * | | Sat+ | Val+ | Hue+ |Speed+|Toggle| | | | | | | | | | + * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| + * | | Sat- | Val- | Hue- |Speed-|Reset | | | | |QWERTY| COLE | | | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | | | | | | | | | | | | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | | | | | | | | | | | | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | | | + * `-------------' `-------------' + */ + + [_ADJ] = LAYOUT( \ + //,--------+--------+--------+--------+--------+--------+--+--------+. ,--------+--+--------+--------+--------+--------+--------+--------+ + RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET, \ + //|--------+--------+--------+--------+--------+--------+--+--------| |--------+--+--------+--------+--------+--------+--------+--------| + _______, RGB_SAI, RGB_VAI, RGB_HUI, RGB_SPI, RGB_TOG, _______, _______, _______, _______, _______, _______, _______, _______, \ + //|--------+--------+--------+--------+--------+--------+--+--------| |--------+--+--------+--------+--------+--------+--------+--------| + _______, RGB_SAD, RGB_VAD, RGB_HUD, RGB_SPD, RGBRST, _______, _______, _______, _______, _______, _______, _______, _______, \ + //|--------+--------+--------+--------+--------+--------+--+--------| |--------+--+--------+--------+--------+--------+--------+--------| + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + //|--------+--------+--------+--------+--------+--------+--+--------| |--------+--+--------+--------+--------+--------+--------+--------| + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + //|--------+--------+--------+--------+--------+--+--------+--------| |--------+--------+--+--------+--------+--------+--------+--------| + _______, _______, _______, _______, _______, _______, _______, _______ \ + // Rotary Left |--------+--------| |--------+--------+ Rotary Right + ) +}; + + +// define variables for reactive RGB +bool TOG_STATUS = false; +int RGB_current_mode; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + case FN: + if (record->event.pressed) { + layer_on(_FN); + } else { + layer_off(_FN); + } + return false; + break; + case ADJ: + if (record->event.pressed) { + layer_on(_ADJ); + } else { + layer_off(_ADJ); + } + return false; + break; + //led operations - RGB mode change now updates the RGB_current_mode to allow the right RGB mode to be set after reactive keys are released + case RGBRST: + #ifdef RGBLIGHT_ENABLE + if (record->event.pressed) { + eeconfig_update_rgblight_default(); + rgblight_enable(); + RGB_current_mode = rgblight_config.mode; + } + #endif + break; + } + return true; +} + +void matrix_init_user(void) { + #ifdef RGBLIGHT_ENABLE + RGB_current_mode = rgblight_config.mode; + #endif + //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h + #ifdef SSD1306OLED + iota_gfx_init(!has_usb()); // turns on the display + #endif +} + +void matrix_scan_user(void) { + #ifdef SSD1306OLED + // led_test_init(); + iota_gfx_task(); // this is what updates the display continuously + #endif +} + + +//SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h +#ifdef SSD1306OLED + +// hook point for 'led_test' keymap +// 'default' keymap's led_test_init() is empty function, do nothing +// 'led_test' keymap's led_test_init() force rgblight_mode_noeeprom(35); +__attribute__ ((weak)) +void led_test_init(void) {} + +void matrix_update(struct CharacterMatrix *dest, + const struct CharacterMatrix *source) { + if (memcmp(dest->display, source->display, sizeof(dest->display))) { + memcpy(dest->display, source->display, sizeof(dest->display)); + dest->dirty = true; + } +} + +//assign the right code to your layers for OLED display +#define L_BASE 0 +#define L_FN (1<<_FN) +#define L_ADJ (1<<_ADJ) +#define L_ADJ_TRI (L_ADJ|L_FN) + +static void render_logo(struct CharacterMatrix *matrix) { + + static char logo[]={ + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94, + 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4, + 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4, + 0}; + matrix_write(matrix, logo); +} + + + +void render_status(struct CharacterMatrix *matrix) { + + // Render to mode icon + static char logo[][2][3]={{{0x95,0x96,0},{0xb5,0xb6,0}},{{0x97,0x98,0},{0xb7,0xb8,0}}}; + if(keymap_config.swap_lalt_lgui==false){ + matrix_write(matrix, logo[0][0]); + matrix_write_P(matrix, PSTR("\n")); + matrix_write(matrix, logo[0][1]); + }else{ + matrix_write(matrix, logo[1][0]); + matrix_write_P(matrix, PSTR("\n")); + matrix_write(matrix, logo[1][1]); + } + + // Define layers here, Have not worked out how to have text displayed for each layer. Copy down the number you see and add a case for it below + char buf[40]; + snprintf(buf,sizeof(buf), "Undef-%ld", layer_state); + matrix_write_P(matrix, PSTR("\nLayer: ")); + switch (layer_state) { + case L_BASE: + matrix_write_P(matrix, PSTR("Laser")); + break; + case L_FN: + matrix_write_P(matrix, PSTR("Function")); + break; + case L_ADJ: + case L_ADJ_TRI: + matrix_write_P(matrix, PSTR("Adjustment")); + break; + default: + matrix_write(matrix, buf); + } + + // Host Keyboard LED Status + char led[40]; + snprintf(led, sizeof(led), "\n%s %s %s", + (host_keyboard_leds() & (1< +Copyright 2015 Jack Humbert + +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 . +*/ + +#pragma once + + +// place overrides here + diff --git a/keyboards/sol/keymaps/danielhklein/keymap.c b/keyboards/sol/keymaps/danielhklein/keymap.c new file mode 100644 index 000000000..883b41826 --- /dev/null +++ b/keyboards/sol/keymaps/danielhklein/keymap.c @@ -0,0 +1,354 @@ +#include QMK_KEYBOARD_H +#ifdef PROTOCOL_LUFA +#include "lufa.h" +#include "split_util.h" +#endif +#ifdef SSD1306OLED + #include "common/ssd1306.h" +#endif + +extern keymap_config_t keymap_config; + +#ifdef RGBLIGHT_ENABLE +//Following line allows macro to read current RGB settings +extern rgblight_config_t rgblight_config; +#endif + +extern uint8_t is_master; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +enum layer_number { + _QWERTY = 0, + _COLEMAK, + _FN, + _ADJ +}; + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + FN, + ADJ, + BACKLIT, + RGBRST +}; + +enum macro_keycodes { + KC_SAMPLEMACRO, +}; + +// Define your non-alpha grouping in this define's LAYOUT, and all your BASE_LAYERS will share the same mod/macro columns + /* Base Layout + * ,------------------------------------------------. ,------------------------------------------------. + * | Esc | 1 | 2 | 3 | 4 | 5 | - | | = | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| + * | Tab | | | | | | [ | | ] | | | | | | Enter| + * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| + * | Caps | | | | | | { | | } | | | | | | ' | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * |Shift | | | | | | ` | | \ | | | | | |Shift | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | Left | Down | Ctrl | Alt | Gui | Bspc | FN | | ADJ | Space| Gui | Alt | Ctrl | Up |Right | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------' + * | Bspc | FN | | ADJ | Space| + * `-------------' `-------------' + */ +#define BASE_LAYOUT( \ + _00, _01, _02, _03, _04, _05, _06, _07, _08, _09, \ + _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, \ + _20, _21, _22, _23, _24, _25, _26, _27, _28, _29 \ +) \ +LAYOUT( \ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_MINS, KC_EQL, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \ + KC_TAB, _00, _01, _02, _03, _04, KC_LBRC, KC_RBRC, _05, _06, _07, _08, _09, KC_ENT, \ + KC_CAPS, _10, _11, _12, _13, _14, KC_LCBR, KC_RCBR, _15, _16, _17, _18, _19, KC_QUOT, \ + KC_LSFT, _20, _21, _22, _23, _24, KC_GRV, KC_BSLS, _25, _26, _27, _28, _29, KC_RSFT, \ + KC_LEFT, KC_DOWN, KC_LCTRL, KC_LALT, KC_LGUI, KC_BSPC, FN, ADJ, KC_SPC, KC_RGUI, KC_RALT, KC_RCTRL, KC_UP, KC_RIGHT, \ + KC_VOLU, KC_VOLD, KC_BSPC, FN, ADJ, KC_SPC, KC_VOLU, KC_VOLD \ +) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Qwerty + * ,------------------------------------------------. ,------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| + * | | Q | W | E | R | T | | | | Y | U | I | O | P | | + * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| + * | | A | S | D | F | G | | | | H | J | K | L | ; | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | Z | X | C | V | B | | | | N | M | , | . | / | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | | | | | | | | | | | | | + * `------+------+------+------+------+------+------| |------+------+------+------+------+------+------' + * | | | | | | + * `-------------' `-------------' + */ + [_QWERTY] = BASE_LAYOUT( \ + KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, \ + KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, \ + KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH \ + ), + + /* Colemak + * ,------------------------------------------------. ,------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| + * | | Q | W | F | P | G | | | | J | L | U | Y | ; | | + * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| + * | | A | R | S | T | D | | | | H | N | E | I | O | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | Z | X | C | V | B | | | | K | M | , | . | / | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | | | | | | | | | | | | | + * `------+------+------+------+------+------+------| |------+------+------+------+------+------+------' + * | | | | | | + * `-------------' `--------=----' + */ + [_COLEMAK] = BASE_LAYOUT( \ + KC_Q, KC_W, KC_F, KC_P, KC_B, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, \ + KC_A, KC_R, KC_S, KC_T, KC_G, KC_K, KC_N, KC_E, KC_I, KC_O, \ + KC_Z, KC_X, KC_C, KC_D, KC_V, KC_M, KC_H, KC_COMM, KC_DOT, KC_SLSH \ + ), + + + /* FN + * ,------------------------------------------------. ,------------------------------------------------. + * | | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | | + * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| + * | | | | | | | | | | | PGDN | UP | PGUP | PRINT| HOME | + * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| + * | | | | | | | | | | | LEFT | DOWN | RIGHT|INSERT| END | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * |Shift | | | | | | | | | PLAY | MUTE | VOL- | VOL+ | LAST | NEXT | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | | Gui | | | | | | | | | | | + * `------+------+------+------+------+------+------| |------+------+------+------+------+------+------' + * | | | | | | + * `-------------' `-------------' + */ + [_FN] = LAYOUT( \ + XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_PGDN, KC_UP, KC_PGUP, KC_PSCR, KC_HOME, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, KC_INS, KC_END, \ + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MPLY, KC_MUTE, KC_VOLD, KC_VOLU, KC_MRWD, KC_MFFD, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX \ + ), + + /* ADJ + * ,------------------------------------------------. ,------------------------------------------------. + * |RESET | F1 | F2 | F3 | F4 | F5 | F6 | | | = | / | * | - | | | + * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | | | 7 | 8 | 9 | + | | | + * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| + * | | HUI | VAI | SAI | | |COLEMK| | | 4 | 5 | 6 | Enter| | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | HUD | VAD | SAD | | |QWERTY| | | 1 | 2 | 3 | Space| | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | |RGBRST|RGBTOG|RGBMOD|RGBSMD| | | | | | 0 | . | Bspc | | | + * `------+------+------+------+------+------+------| |------+------+------+------+------+------+------' + * | | | | | | + * `-------------' `-------------' + */ + + [_ADJ] = LAYOUT( \ + RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, XXXXXXX, KC_PEQL, KC_PSLS, KC_PAST, KC_PMNS, XXXXXXX, XXXXXXX, \ + XXXXXXX, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, KC_P7, KC_P8, KC_P9, KC_PPLS, XXXXXXX, XXXXXXX, \ + XXXXXXX, RGB_SAD, RGB_VAI, RGB_SAI, XXXXXXX, XXXXXXX, COLEMAK, XXXXXXX, KC_P4, KC_P5, KC_P6, KC_PENT, XXXXXXX, XXXXXXX, \ + XXXXXXX, RGB_HUD, RGB_VAD, RGB_HUI, XXXXXXX, XXXXXXX, QWERTY, XXXXXXX, KC_P1, KC_P2, KC_P3, KC_SPC, XXXXXXX, XXXXXXX, \ + XXXXXXX, RGBRST, RGB_TOG, RGB_MOD, RGB_RMOD, XXXXXXX, XXXXXXX, _______, XXXXXXX, KC_P0, KC_PDOT, KC_BSPC, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX \ + ) +}; + +// define variables for reactive RGB +bool TOG_STATUS = false; +int RGB_current_mode; + +// Setting ADJ layer RGB back to default +void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) { + if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) { + #ifdef RGBLIGHT_ENABLE + //rgblight_mode(RGB_current_mode); + #endif + layer_on(layer3); + } else { + layer_off(layer3); + } +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + //uint8_t shifted = get_mods() & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)); + + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + case COLEMAK: + if(record->event.pressed) { + set_single_persistent_default_layer(_COLEMAK); + } + return false; + break; + case FN: + if (record->event.pressed) { + //not sure how to have keyboard check mode and set it to a variable, so my work around + //uses another variable that would be set to true after the first time a reactive key is pressed. + if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false + } else { + TOG_STATUS = !TOG_STATUS; + #ifdef RGBLIGHT_ENABLE + //rgblight_mode(15); + #endif + } + layer_on(_FN); + } else { + #ifdef RGBLIGHT_ENABLE + //rgblight_mode(RGB_current_mode); // revert RGB to initial mode prior to RGB mode change + #endif + layer_off(_FN); + TOG_STATUS = false; + } + return false; + break; + case ADJ: + if (record->event.pressed) { + layer_on(_ADJ); + } else { + layer_off(_ADJ); + } + return false; + break; + //led operations - RGB mode change now updates the RGB_current_mode to allow the right RGB mode to be set after reactive keys are released + case RGBRST: + #ifdef RGBLIGHT_ENABLE + if (record->event.pressed) { + eeconfig_update_rgblight_default(); + rgblight_enable(); + RGB_current_mode = rgblight_config.mode; + } + #endif + break; + } + return true; +} + +void matrix_init_user(void) { + #ifdef RGBLIGHT_ENABLE + RGB_current_mode = rgblight_config.mode; + #endif + //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h + #ifdef SSD1306OLED + iota_gfx_init(!has_usb()); // turns on the display + #endif +} + + +//SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h +#ifdef SSD1306OLED + +// hook point for 'led_test' keymap +// 'default' keymap's led_test_init() is empty function, do nothing +// 'led_test' keymap's led_test_init() force rgblight_mode_noeeprom(35); +__attribute__ ((weak)) +void led_test_init(void) {} + +void matrix_scan_user(void) { + led_test_init(); + iota_gfx_task(); // this is what updates the display continuously +} + +void matrix_update(struct CharacterMatrix *dest, + const struct CharacterMatrix *source) { + if (memcmp(dest->display, source->display, sizeof(dest->display))) { + memcpy(dest->display, source->display, sizeof(dest->display)); + dest->dirty = true; + } +} + +//assign the right code to your layers for OLED display +#define L_BASE 0 +#define L_FN (1<<_FN) +#define L_ADJ (1<<_ADJ) + +static void render_logo(struct CharacterMatrix *matrix) { + + static char logo[]={ + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94, + 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4, + 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4, + 0}; + matrix_write(matrix, logo); + //matrix_write_P(&matrix, PSTR(" Split keyboard kit")); +} + + + +void render_status(struct CharacterMatrix *matrix) { + + // Render to mode icon + static char logo[][2][3]={{{0x95,0x96,0},{0xb5,0xb6,0}},{{0x97,0x98,0},{0xb7,0xb8,0}}}; + if(keymap_config.swap_lalt_lgui==false){ + matrix_write(matrix, logo[0][0]); + matrix_write_P(matrix, PSTR("\n")); + matrix_write(matrix, logo[0][1]); + }else{ + matrix_write(matrix, logo[1][0]); + matrix_write_P(matrix, PSTR("\n")); + matrix_write(matrix, logo[1][1]); + } + + // Define layers here, Have not worked out how to have text displayed for each layer. Copy down the number you see and add a case for it below + char buf[40]; + snprintf(buf,sizeof(buf), "Undef-%ld", layer_state); + matrix_write_P(matrix, PSTR("\nLayer: ")); + switch (layer_state) { + case L_BASE: + matrix_write_P(matrix, PSTR("Default")); + break; + case L_FN: + matrix_write_P(matrix, PSTR("FN")); + break; + case L_ADJ: + case L_ADJ_TRI: + matrix_write_P(matrix, PSTR("ADJ")); + break; + default: + matrix_write(matrix, buf); + } + + // Host Keyboard LED Status + char led[40]; + snprintf(led, sizeof(led), "\n%s %s %s", + (host_keyboard_leds() & (1< +Copyright 2015 Jack Humbert + +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 . +*/ + +#pragma once + + +// place overrides here + diff --git a/keyboards/sol/keymaps/default/keymap.c b/keyboards/sol/keymaps/default/keymap.c new file mode 100644 index 000000000..799507f66 --- /dev/null +++ b/keyboards/sol/keymaps/default/keymap.c @@ -0,0 +1,362 @@ +#include QMK_KEYBOARD_H +#include "bootloader.h" +#ifdef PROTOCOL_LUFA +#include "lufa.h" +#include "split_util.h" +#endif +#ifdef SSD1306OLED + #include "common/ssd1306.h" +#endif + +extern keymap_config_t keymap_config; + +#ifdef RGBLIGHT_ENABLE +//Following line allows macro to read current RGB settings +extern rgblight_config_t rgblight_config; +#endif + +extern uint8_t is_master; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +enum layer_number { + _QWERTY = 0, + _COLEMAK, + _FN, + _ADJ +}; + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + FN, + ADJ, + BACKLIT, + RGBRST +}; + +enum macro_keycodes { + KC_SAMPLEMACRO, +}; + + + +#define FN_ESC LT(_FN, KC_ESC) +#define FN_CAPS LT(_FN, KC_CAPS) + +// Define your non-alpha grouping in this define's LAYOUT, and all your BASE_LAYERS will share the same mod/macro columns + /* Base Layout + * ,------------------------------------------------. ,------------------------------------------------. + * | GESC | | | | | | - | | = | | | | | | BkSp | + * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| + * | Tab | | | | | | [ | | ] | | | | | | \ | + * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| + * |FN(CAPS)| | | | | | ( | | ) | | | | | | ' | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * |Shift | | | | | | { | | } | | | | | |Shift | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | Ctrl | Win | Alt | RGB | ADJ | Space| DEL | | Enter| Space| FN | Left | Down | Up |Right | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------' + * | Space| DEL | | Enter| Space| + * `-------------' `-------------' + */ +#define BASE_LAYOUT( \ + _00, _01, _02, _03, _04, _05, _06, _07, _08, _09, \ + _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, \ + _20, _21, _22, _23, _24, _25, _26, _27, _28, _29 \ +) \ +LAYOUT( \ + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_MINS, KC_EQL, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ + KC_TAB, _00, _01, _02, _03, _04, KC_LBRC, KC_RBRC, _05, _06, _07, _08, _09, KC_BSLS, \ + FN_CAPS, _10, _11, _12, _13, _14, KC_LPRN, KC_RPRN, _15, _16, _17, _18, _19, KC_QUOT, \ + KC_LSFT, _20, _21, _22, _23, _24, KC_LCBR, KC_RCBR, _25, _26, _27, _28, _29, KC_ENT, \ + KC_LCTL, KC_LGUI, KC_LALT, RGB_TOG, ADJ, KC_SPC, KC_DEL, KC_ENT, KC_SPC, FN, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, \ + KC_VOLU, KC_VOLD, KC_SPC, KC_DEL, KC_ENT, KC_SPC, KC_VOLU, KC_VOLD \ +) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Qwerty + * ,------------------------------------------------. ,------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| + * | | Q | W | E | R | T | | | | Y | U | I | O | P | | + * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| + * | | A | S | D | F | G | | | | H | J | K | L | ; | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | Z | X | C | V | B | | | | N | M | , | . | / | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | | | | | | | | | | | | | + * `------+------+------+------+------+------+------| |------+------+------+------+------+------+------' + * | | | | | | + * `-------------' `--------=----' + */ + [_QWERTY] = BASE_LAYOUT( \ + KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, \ + KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, \ + KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH \ + ), + + /* Colemak + * ,------------------------------------------------. ,------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| + * | | Q | W | F | P | G | | | | J | L | U | Y | ; | | + * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| + * | | A | R | S | T | D | | | | H | N | E | I | O | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | Z | X | C | V | B | | | | K | M | , | . | / | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | | | | | | | | | | | | | + * `------+------+------+------+------+------+------| |------+------+------+------+------+------+------' + * | | | | | | + * `-------------' `--------=----' + */ + [_COLEMAK] = BASE_LAYOUT( \ + KC_Q, KC_W, KC_F, KC_P, KC_B, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, \ + KC_A, KC_R, KC_S, KC_T, KC_G, KC_K, KC_N, KC_E, KC_I, KC_O, \ + KC_Z, KC_X, KC_C, KC_D, KC_V, KC_M, KC_H, KC_COMM, KC_DOT, KC_SLSH \ + ), + + + /* FN + * ,------------------------------------------------. ,------------------------------------------------. + * | F1 | F2 | F3 | F4 | F5 | F6 | | | | F7 | F8 | F9 | F10 | F11 | F12 | + * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| + * | | PGDN | UP | PGUP | | | | | | | PGDN | UP | PGUP | PRINT| HOME | + * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| + * | | LEFT | DOWN | RIGHT| | | | | | | LEFT | DOWN | RIGHT|INSERT| END | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | | | | | | | | | | | | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | |RGBMOD| | | | | | | PLAY | NEXT | MUTE | VOL- | VOL+ | + * `------+------+------+------+------+------+------| |------+------+------+------+------+------+------' + * | | | | | | + * `-------------' `-------------' + */ + [_FN] = LAYOUT( \ + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, _______, KC_PSCR, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ + _______, KC_PGDN, KC_UP, KC_PGUP, _______, _______, _______, _______, _______, KC_PGDN, KC_UP, KC_PGUP, KC_PSCR, KC_HOME, \ + _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_INS, KC_END, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, RGB_MOD, _______, _______, _______, _______, _______, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, \ + KC_VOLU, KC_VOLD, _______, _______, _______, _______, KC_VOLU, KC_VOLD \ + ), + + /* ADJ + * ,------------------------------------------------. ,------------------------------------------------. + * | F1 | F2 | F3 | F4 | F5 | F6 | | | | F7 | F8 | F9 | F10 | F11 | F12 | + * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| + * | | SAD | VAI | SAI | RESET| | | | | | | | | | | + * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| + * | | HUD | VAD | HUI |RGBRST| | | | | |QWERTY|COLEMK| | | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | | | | | | | | |RGBTOG| HUI | SAI | VAI | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | |RGBMOD(| | | | | | | |RGBRMOD| HUD | SAD | VAD | + * `------+------+------+------+------+------+------| |------+------+------+------+------+------+------' + * | | | | | | + * `-------------' `-------------' + */ + + [_ADJ] = LAYOUT( \ + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, _______, _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ + _______, RGB_SAD, RGB_VAI, RGB_SAI, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, RGB_HUD, RGB_VAD, RGB_HUI, RGBRST, _______, _______, _______, _______, QWERTY, COLEMAK, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, \ + _______, _______, _______, RGB_MOD, _______, _______, _______, _______, _______, _______, RGB_RMOD,RGB_HUD, RGB_SAD, RGB_VAD, \ + KC_VOLU, KC_VOLD, _______, _______, _______, _______, KC_VOLU, KC_VOLD \ + ) +}; + + + +// define variables for reactive RGB +bool TOG_STATUS = false; +int RGB_current_mode; + +// Setting ADJ layer RGB back to default +void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) { + if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) { + #ifdef RGBLIGHT_ENABLE + //rgblight_mode(RGB_current_mode); + #endif + layer_on(layer3); + } else { + layer_off(layer3); + } +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + //uint8_t shifted = get_mods() & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)); + + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + case COLEMAK: + if(record->event.pressed) { + set_single_persistent_default_layer(_COLEMAK); + } + return false; + break; + case FN: + if (record->event.pressed) { + //not sure how to have keyboard check mode and set it to a variable, so my work around + //uses another variable that would be set to true after the first time a reactive key is pressed. + if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false + } else { + TOG_STATUS = !TOG_STATUS; + #ifdef RGBLIGHT_ENABLE + //rgblight_mode(15); + #endif + } + layer_on(_FN); + } else { + #ifdef RGBLIGHT_ENABLE + //rgblight_mode(RGB_current_mode); // revert RGB to initial mode prior to RGB mode change + #endif + layer_off(_FN); + TOG_STATUS = false; + } + return false; + break; + case ADJ: + if (record->event.pressed) { + layer_on(_ADJ); + } else { + layer_off(_ADJ); + } + return false; + break; + //led operations - RGB mode change now updates the RGB_current_mode to allow the right RGB mode to be set after reactive keys are released + case RGBRST: + #ifdef RGBLIGHT_ENABLE + if (record->event.pressed) { + eeconfig_update_rgblight_default(); + rgblight_enable(); + RGB_current_mode = rgblight_config.mode; + } + #endif + break; + } + return true; +} + +void matrix_init_user(void) { + #ifdef RGBLIGHT_ENABLE + RGB_current_mode = rgblight_config.mode; + #endif + //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h + #ifdef SSD1306OLED + iota_gfx_init(!has_usb()); // turns on the display + #endif +} + + +//SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h +#ifdef SSD1306OLED + +// hook point for 'led_test' keymap +// 'default' keymap's led_test_init() is empty function, do nothing +// 'led_test' keymap's led_test_init() force rgblight_mode_noeeprom(35); +__attribute__ ((weak)) +void led_test_init(void) {} + +void matrix_scan_user(void) { + led_test_init(); + iota_gfx_task(); // this is what updates the display continuously +} + +void matrix_update(struct CharacterMatrix *dest, + const struct CharacterMatrix *source) { + if (memcmp(dest->display, source->display, sizeof(dest->display))) { + memcpy(dest->display, source->display, sizeof(dest->display)); + dest->dirty = true; + } +} + +//assign the right code to your layers for OLED display +#define L_BASE 0 +#define L_FN (1<<_FN) +#define L_ADJ (1<<_ADJ) + +static void render_logo(struct CharacterMatrix *matrix) { + + static char logo[]={ + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94, + 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4, + 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4, + 0}; + matrix_write(matrix, logo); + //matrix_write_P(&matrix, PSTR(" Split keyboard kit")); +} + + + +void render_status(struct CharacterMatrix *matrix) { + + // Render to mode icon + static char logo[][2][3]={{{0x95,0x96,0},{0xb5,0xb6,0}},{{0x97,0x98,0},{0xb7,0xb8,0}}}; + if(keymap_config.swap_lalt_lgui==false){ + matrix_write(matrix, logo[0][0]); + matrix_write_P(matrix, PSTR("\n")); + matrix_write(matrix, logo[0][1]); + }else{ + matrix_write(matrix, logo[1][0]); + matrix_write_P(matrix, PSTR("\n")); + matrix_write(matrix, logo[1][1]); + } + + // Define layers here, Have not worked out how to have text displayed for each layer. Copy down the number you see and add a case for it below + char buf[40]; + snprintf(buf,sizeof(buf), "Undef-%ld", layer_state); + matrix_write_P(matrix, PSTR("\nLayer: ")); + switch (layer_state) { + case L_BASE: + matrix_write_P(matrix, PSTR("Default")); + break; + case L_FN: + matrix_write_P(matrix, PSTR("FN")); + break; + case L_ADJ: + case L_ADJ_TRI: + matrix_write_P(matrix, PSTR("ADJ")); + break; + default: + matrix_write(matrix, buf); + } + + // Host Keyboard LED Status + char led[40]; + snprintf(led, sizeof(led), "\n%s %s %s", + (host_keyboard_leds() & (1< +Copyright 2015 Jack Humbert + +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 . +*/ + +#pragma once + + +// place overrides here + diff --git a/keyboards/sol/keymaps/kageurufu/keymap.c b/keyboards/sol/keymaps/kageurufu/keymap.c new file mode 100644 index 000000000..822256d85 --- /dev/null +++ b/keyboards/sol/keymaps/kageurufu/keymap.c @@ -0,0 +1,335 @@ +#include QMK_KEYBOARD_H +#ifdef PROTOCOL_LUFA +#include "lufa.h" +#include "split_util.h" +#endif +#ifdef SSD1306OLED + #include "common/ssd1306.h" +#endif + +extern keymap_config_t keymap_config; + +#ifdef RGBLIGHT_ENABLE +//Following line allows macro to read current RGB settings +extern rgblight_config_t rgblight_config; +#endif + +extern uint8_t is_master; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +enum layer_number { + _QWERTY = 0, + _COLEMAK, + _FN, + _ADJ +}; + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + FN, + ADJ, + BACKLIT, + RGBRST +}; + +enum macro_keycodes { + KC_SAMPLEMACRO, +}; + +#define FN_ESC LT(_FN, KC_ESC) + +// Define your non-alpha grouping in this define's LAYOUT, and all your BASE_LAYERS will share the same mod/macro columns + /* Base Layout + * ,------------------------------------------------. ,------------------------------------------------. + * | ` | | | | | | | | | | | | | | BkSp | + * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| + * | Tab | | | | | | | | | | | | | | \ | + * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| + * | Esc | | | | | | | | | | | | | | ' | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | Sft( | | | | | | | | | | | | | | Sft) | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | Ctrl | Win | Win | Alt | FN | Space| RGB | | FN | FN | - | = | Down | PgUp | PgDn | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | Space| Bksp | | Enter| Space| + * `-------------' `--------=----' + */ +#define BASE_LAYOUT( \ + _00, _01, _02, _03, _04, _05, _06, _07, _08, _09, \ + _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, \ + _20, _21, _22, _23, _24, _25, _26, _27, _28, _29 \ +) \ +LAYOUT( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, RGB_MOD, KC_EQL, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ + KC_TAB, _00, _01, _02, _03, _04, KC_LBRC, KC_RBRC, _05, _06, _07, _08, _09, KC_BSLS, \ + FN_ESC, _10, _11, _12, _13, _14, RGB_SAI, RGB_VAI, _15, _16, _17, _18, _19, KC_QUOT, \ + KC_LSPO, _20, _21, _22, _23, _24, RGB_SAD, RGB_VAD, _25, _26, _27, _28, _29, KC_RSPC, \ + KC_LCTL, KC_LGUI, KC_LGUI, KC_LALT, FN, KC_SPC, FN, FN, KC_SPC, KC_MINS, KC_EQL, KC_DOWN, KC_PGUP, KC_PGDN, \ + KC_VOLD, KC_VOLU, KC_SPC, KC_BSPC, KC_ENT, KC_SPC, KC_VOLD, KC_VOLU \ +) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Qwerty + * ,------------------------------------------------. ,------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| + * | | Q | W | E | R | T | | | | Y | U | I | O | P | | + * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| + * | | A | S | D | F | G | | | | H | J | K | L | ; | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | Z | X | C | V | B | | | | N | M | , | . | / | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | | | | | | | | | | | | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | | | + * `-------------' `--------=----' + */ + [_QWERTY] = BASE_LAYOUT( \ + KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, \ + KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, \ + KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH \ + ), + + /* Colemak + * ,------------------------------------------------. ,------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| + * | | Q | W | F | P | B | | | | J | L | U | Y | ; | | + * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| + * | | A | R | S | T | G | | | | K | N | E | I | O | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | Z | X | C | D | V | [ | | ] | M | H | , | . | / | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | | | | | | | | | | | | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | | | + * `-------------' `--------=----' + */ + [_COLEMAK] = BASE_LAYOUT( \ + KC_Q, KC_W, KC_F, KC_P, KC_B, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, \ + KC_A, KC_R, KC_S, KC_T, KC_G, KC_K, KC_N, KC_E, KC_I, KC_O, \ + KC_Z, KC_X, KC_C, KC_D, KC_V, KC_M, KC_H, KC_COMM, KC_DOT, KC_SLSH + ), + + + /* FN + * ,------------------------------------------------. ,------------------------------------------------. + * | ~ | ! | @ | # | $ | % | | | | ^ | & | * | ( | ) | | + * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| + * | ~ | ! | @ | # | $ | % | | | | ^ | & | * | ( | ) | | + * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| + * | Ctrl | A | O | E | U | I | | | | D | H | T | N | S | / | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | [ | | ] | B | M | W | V | Z |Enter | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | ADJ | Esc | Alt | GUI | EISU |Lower |Space | |Space |FN | KANA | Left | Down | Up |Right | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * |Lower |Space | |Space |FN | + * `-------------' `------------' + */ + [_FN] = LAYOUT( \ + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, _______, KC_PSCR, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ + _______, KC_PGDN, KC_UP, KC_PGUP, _______, KC_LBRC, _______, _______, KC_RBRC, KC_7, KC_UP, KC_9, KC_0, KC_HOME, \ + ADJ, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_RBRC, KC_END, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGDN, KC_PGUP, _______, \ + _______, _______, _______, _______, ADJ, _______, ADJ, ADJ, ADJ, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, \ + KC_VOLD, KC_VOLU, _______, KC_DEL, _______, _______, KC_VOLD, KC_VOLU \ + ), + + /* ADJ + * ,------------------------------------------------. ,------------------------------------------------. + * | ~ | ! | @ | # | $ | % | | | | ^ | & | * | ( | ) | | + * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| + * | ~ | ! | @ | # | $ | % | | | | ^ | & | * | ( | ) | | + * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| + * | Ctrl | A | O | E | U | I | | | | D | H | T | N | S | / | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | [ | | ] | B | M | W | V | Z |Enter | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * |ADJ| Esc | Alt | GUI | EISU |Lower |Space | |Space |FN | KANA | Left | Down | Up |Right | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * |Lower |Space | |Space |FN | + * `-------------' `------------' + */ + + [_ADJ] = LAYOUT( \ + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, _______, _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ + _______, RGB_SAD, RGB_VAI, RGB_SAI, RESET, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ + _______, RGB_HUD, RGB_VAD, RGB_HUI, RGBRST, _______, _______, _______, _______, QWERTY, COLEMAK, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_RMOD,RGB_HUD, RGB_SAD, RGB_VAD, \ + KC_VOLD, KC_VOLU, _______, _______, _______, _______, KC_VOLD, KC_VOLU \ + ) +}; + + +// define variables for reactive RGB +bool TOG_STATUS = false; +int RGB_current_mode; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + //uint8_t shifted = get_mods() & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)); + + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + case COLEMAK: + if(record->event.pressed) { + set_single_persistent_default_layer(_COLEMAK); + } + return false; + break; + case FN: + if (record->event.pressed) { + layer_on(_FN); + } else { + layer_off(_FN); + } + return false; + break; + case ADJ: + if (record->event.pressed) { + layer_on(_ADJ); + } else { + layer_off(_ADJ); + } + return false; + break; + //led operations - RGB mode change now updates the RGB_current_mode to allow the right RGB mode to be set after reactive keys are released + case RGBRST: + #ifdef RGBLIGHT_ENABLE + if (record->event.pressed) { + eeconfig_update_rgblight_default(); + rgblight_enable(); + RGB_current_mode = rgblight_config.mode; + } + #endif + break; + } + return true; +} + +void matrix_init_user(void) { + #ifdef RGBLIGHT_ENABLE + RGB_current_mode = rgblight_config.mode; + #endif + //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h + #ifdef SSD1306OLED + iota_gfx_init(!has_usb()); // turns on the display + #endif +} + +void matrix_scan_user(void) { + #ifdef SSD1306OLED + led_test_init(); + iota_gfx_task(); // this is what updates the display continuously + #endif +} + + +//SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h +#ifdef SSD1306OLED + +// hook point for 'led_test' keymap +// 'default' keymap's led_test_init() is empty function, do nothing +// 'led_test' keymap's led_test_init() force rgblight_mode_noeeprom(35); +__attribute__ ((weak)) +void led_test_init(void) {} + +void matrix_update(struct CharacterMatrix *dest, + const struct CharacterMatrix *source) { + if (memcmp(dest->display, source->display, sizeof(dest->display))) { + memcpy(dest->display, source->display, sizeof(dest->display)); + dest->dirty = true; + } +} + +//assign the right code to your layers for OLED display +#define L_BASE 0 +#define L_FN (1<<_FN) +#define L_ADJ (1<<_ADJ) +#define L_ADJ_TRI (L_ADJ|L_FN) + +static void render_logo(struct CharacterMatrix *matrix) { + + static char logo[]={ + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94, + 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4, + 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4, + 0}; + matrix_write(matrix, logo); + //matrix_write_P(&matrix, PSTR(" Split keyboard kit")); +} + + + +void render_status(struct CharacterMatrix *matrix) { + + // Render to mode icon + static char logo[][2][3]={{{0x95,0x96,0},{0xb5,0xb6,0}},{{0x97,0x98,0},{0xb7,0xb8,0}}}; + if(keymap_config.swap_lalt_lgui==false){ + matrix_write(matrix, logo[0][0]); + matrix_write_P(matrix, PSTR("\n")); + matrix_write(matrix, logo[0][1]); + }else{ + matrix_write(matrix, logo[1][0]); + matrix_write_P(matrix, PSTR("\n")); + matrix_write(matrix, logo[1][1]); + } + + // Define layers here, Have not worked out how to have text displayed for each layer. Copy down the number you see and add a case for it below + char buf[40]; + snprintf(buf,sizeof(buf), "Undef-%ld", layer_state); + matrix_write_P(matrix, PSTR("\nLayer: ")); + switch (layer_state) { + case L_BASE: + matrix_write_P(matrix, PSTR("Default")); + break; + case L_FN: + matrix_write_P(matrix, PSTR("FN")); + break; + case L_ADJ: + case L_ADJ_TRI: + matrix_write_P(matrix, PSTR("ADJ")); + break; + default: + matrix_write(matrix, buf); + } + + // Host Keyboard LED Status + char led[40]; + snprintf(led, sizeof(led), "\n%s %s %s", + (host_keyboard_leds() & (1< +Copyright 2015 Jack Humbert + +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 . +*/ + +#ifndef REV1_CONFIG_H +#define REV1_CONFIG_H + + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x3060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER RGBKB +#define PRODUCT Sol +#define DESCRIPTION "An RGB, split, ortho-esque keyboard" + + +#define PREVENT_STUCK_MODIFIERS +#define TAPPING_FORCE_HOLD +#define TAPPING_TERM 150 + +#define USE_I2C +#define USE_SERIAL +#define USE_SERIAL_PD3 + +/* Select hand configuration */ +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + +// Helix keyboard OLED support +// see ./rules.mk: OLED_ENABLE=yes or no +#ifdef OLED_ENABLE + #define SSD1306OLED +#endif + +/* Select rows configuration */ +// Rows are 4 or 5 +// #define HELIX_ROWS 5 see ./rules.mk + +/* key matrix size */ +// Rows are doubled-up +#define MATRIX_ROWS 12 +#define MATRIX_ROW_PINS { C6, B6, B5, B4, D7, E6} + +// wiring of each half +#define MATRIX_COLS 7 +#define MATRIX_COL_PINS { F0, F1, F4, F5, F6, F7, C7 } +// #define MATRIX_COL_PINS { B2, B3, B1, F7, F6, F5, F4 } //uncomment this line and comment line above if you need to reverse left-to-right key order + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ +// #define BACKLIGHT_LEVELS 3 + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCING_DELAY 5 + +/* 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 + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* ws2812 RGB LED */ +#define RGB_DI_PIN B3 +#define RGBLIGHT_TIMER +//#define RGBLED_NUM 12 // Number of LEDs. see ./keymaps/default/config.h +#define ws2812_PORTREG PORTD +#define ws2812_DDRREG DDRD + +#define DRIVER_COUNT 2 +#define DRIVER_LED_TOTAL 70 +// #define RGB_MATRIX_KEYPRESSES +#define BACKLIGHT_PIN B7 +#define BACKLIGHT_LEVELS 5 + +#ifdef LED_MIRRORED + #define RGBLED_NUM 35 +#else + #define RGBLED_NUM 70 +#endif + +#define RGBLIGHT_RAINBOW_SWIRL_RANGE 1950 + +#ifdef IOS_DEVICE_ENABLE + #define RGBLIGHT_LIMIT_VAL 40 + #define RGB_MATRIX_MAXIMUM_BRIGHTNESS 40 +#elif RGBLIGHT_FULL_POWER + #define RGBLIGHT_LIMIT_VAL 255 + #define RGB_MATRIX_MAXIMUM_BRIGHTNESS 255 +#else + #define RGBLIGHT_LIMIT_VAL 120 + #define RGB_MATRIX_MAXIMUM_BRIGHTNESS 120 +#endif + +#define RGBLIGHT_VAL_STEP (RGBLIGHT_LIMIT_VAL / 10) +#define RGBLIGHT_HUE_STEP 10 +#define RGBLIGHT_SAT_STEP 17 + +#define RGBLIGHT_ANIMATIONS + +#if defined(RGBLIGHT_ENABLE) && !defined(IOS_DEVICE_ENABLE) +// USB_MAX_POWER_CONSUMPTION value for Helix keyboard +// 120 RGBoff, OLEDoff +// 120 OLED +// 330 RGB 6 +// 300 RGB 32 +// 310 OLED & RGB 32 + #define USB_MAX_POWER_CONSUMPTION 500 +#else + // fix iPhone and iPad power adapter issue + // iOS device need lessthan 100 + #define USB_MAX_POWER_CONSUMPTION 100 +#endif + +/* + * 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 + + +#endif diff --git a/keyboards/sol/rev1/matrix.c b/keyboards/sol/rev1/matrix.c new file mode 100644 index 000000000..804d8b980 --- /dev/null +++ b/keyboards/sol/rev1/matrix.c @@ -0,0 +1,304 @@ +/* +Copyright 2012 Jun Wako + +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 . +*/ + +/* + * scan matrix + */ +#include +#include +#include +#include +#include +#include +#include "print.h" +#include "debug.h" +#include "util.h" +#include "matrix.h" +#include "split_util.h" +#include + +#include "serial.h" + +#ifndef DEBOUNCE +# define DEBOUNCE 5 +#endif + +#ifdef ENCODER_ENABLE_CUSTOM + #include "common/knob_v2.h" +#endif + +#define ERROR_DISCONNECT_COUNT 5 + +static uint8_t debouncing = DEBOUNCE; +static const int ROWS_PER_HAND = MATRIX_ROWS/2; +static uint8_t error_count = 0; +uint8_t is_master = 0 ; + +static const uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; +static const uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; + +/* matrix state(1:on, 0:off) */ +static matrix_row_t matrix[MATRIX_ROWS]; +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; + +static matrix_row_t read_cols(void); +static void init_cols(void); +static void unselect_rows(void); +static void select_row(uint8_t row); +static uint8_t matrix_master_scan(void); + + +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + +inline +uint8_t matrix_rows(void) +{ + return MATRIX_ROWS; +} + +inline +uint8_t matrix_cols(void) +{ + return MATRIX_COLS; +} + +void matrix_init(void) +{ + debug_enable = true; + debug_matrix = true; + debug_mouse = true; + // initialize row and col + unselect_rows(); + init_cols(); + + TX_RX_LED_INIT; + + // initialize matrix state: all keys off + for (uint8_t i=0; i < MATRIX_ROWS; i++) { + matrix[i] = 0; + matrix_debouncing[i] = 0; + } + + is_master = has_usb(); + + #ifdef ENCODER_ENABLE_CUSTOM + knob_init(); //FOR ENCODER + #endif + matrix_init_quantum(); +} + +uint8_t _matrix_scan(void) +{ + // Right hand is stored after the left in the matirx so, we need to offset it + int offset = isLeftHand ? 0 : (ROWS_PER_HAND); + + for (uint8_t i = 0; i < ROWS_PER_HAND; i++) { + select_row(i); + _delay_us(30); // without this wait read unstable value. + matrix_row_t cols = read_cols(); + if (matrix_debouncing[i+offset] != cols) { + matrix_debouncing[i+offset] = cols; + debouncing = DEBOUNCE; + } + unselect_rows(); + } + + if (debouncing) { + if (--debouncing) { + _delay_ms(1); + } else { + for (uint8_t i = 0; i < ROWS_PER_HAND; i++) { + matrix[i+offset] = matrix_debouncing[i+offset]; + } + } + } + + #ifdef ENCODER_ENABLE_CUSTOM + knob_report_t knob_report = knob_report_read(); + + knob_report_reset(); + + matrix[5 + offset] &= 0b11111100; + if (knob_report.phase) { // I check for phase to avoid handling the rotation twice (on 90 and 270 degrees). + if (knob_report.dir > 0) { + matrix[5 + offset] |= 0b00000001; + } else if (knob_report.dir < 0) { + matrix[5 + offset] |= 0b00000010; + } + } + #endif + + return 1; +} + +int serial_transaction(void) { + int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; + int ret=serial_update_buffers(); + if (ret ) { + return 1; + } + + for (int i = 0; i < ROWS_PER_HAND; ++i) { + matrix[slaveOffset+i] = serial_slave_buffer[i]; + } + return 0; +} + +uint8_t matrix_scan(void) +{ + if (is_master) { + matrix_master_scan(); + }else{ + matrix_slave_scan(); + + int offset = (isLeftHand) ? ROWS_PER_HAND : 0; + + for (int i = 0; i < ROWS_PER_HAND; ++i) { + matrix[offset+i] = serial_master_buffer[i]; + } + + matrix_scan_quantum(); + } + return 1; +} + + +uint8_t matrix_master_scan(void) { + + int ret = _matrix_scan(); + + int offset = (isLeftHand) ? 0 : ROWS_PER_HAND; + + for (int i = 0; i < ROWS_PER_HAND; ++i) { + serial_master_buffer[i] = matrix[offset+i]; + } + + if( serial_transaction() ) { + // turn on the indicator led when halves are disconnected + TXLED1; + + error_count++; + + if (error_count > ERROR_DISCONNECT_COUNT) { + // reset other half if disconnected + int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; + for (int i = 0; i < ROWS_PER_HAND; ++i) { + matrix[slaveOffset+i] = 0; + } + } + } else { + // turn off the indicator led on no error + TXLED0; + error_count = 0; + } + matrix_scan_quantum(); + return ret; +} + +void matrix_slave_scan(void) { + _matrix_scan(); + + int offset = (isLeftHand) ? 0 : ROWS_PER_HAND; + + for (int i = 0; i < ROWS_PER_HAND; ++i) { + serial_slave_buffer[i] = matrix[offset+i]; + } +} + +bool matrix_is_modified(void) +{ + if (debouncing) return false; + return true; +} + +inline +bool matrix_is_on(uint8_t row, uint8_t col) +{ + return (matrix[row] & ((matrix_row_t)1<> 4) + 1) &= ~_BV(col_pins[x] & 0xF); + _SFR_IO8((col_pins[x] >> 4) + 2) |= _BV(col_pins[x] & 0xF); + } +} + +static matrix_row_t read_cols(void) +{ + matrix_row_t result = 0; + for(int x = 0; x < MATRIX_COLS; x++) { + result |= (_SFR_IO8(col_pins[x] >> 4) & _BV(col_pins[x] & 0xF)) ? 0 : (1 << x); + } + return result; +} + +static void unselect_rows(void) +{ + for(int x = 0; x < ROWS_PER_HAND; x++) { + _SFR_IO8((row_pins[x] >> 4) + 1) &= ~_BV(row_pins[x] & 0xF); + _SFR_IO8((row_pins[x] >> 4) + 2) |= _BV(row_pins[x] & 0xF); + } +} + +static void select_row(uint8_t row) +{ + _SFR_IO8((row_pins[row] >> 4) + 1) |= _BV(row_pins[row] & 0xF); + _SFR_IO8((row_pins[row] >> 4) + 2) &= ~_BV(row_pins[row] & 0xF); +} diff --git a/keyboards/sol/rev1/rev1.c b/keyboards/sol/rev1/rev1.c new file mode 100644 index 000000000..01ab577d4 --- /dev/null +++ b/keyboards/sol/rev1/rev1.c @@ -0,0 +1,15 @@ +#include "sol.h" + + +#ifdef SSD1306OLED +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + //led_set_user(usb_led); +} +#endif + +void matrix_init_kb(void) { + + matrix_init_user(); +}; + diff --git a/keyboards/sol/rev1/rev1.h b/keyboards/sol/rev1/rev1.h new file mode 100644 index 000000000..27b5ac896 --- /dev/null +++ b/keyboards/sol/rev1/rev1.h @@ -0,0 +1,70 @@ +#ifndef REV1_H +#define REV1_H + +#include "sol.h" + +//void promicro_bootloader_jmp(bool program); +#include "quantum.h" + +#ifdef RGBLIGHT_ENABLE +//rgb led driver +#include "ws2812.h" +#endif + +#ifdef USE_I2C +#include +#ifdef __AVR__ + #include + #include +#endif +#endif + +//void promicro_bootloader_jmp(bool program); +// LEL/LER/REL/RER are +// LeftEncoderLeft, LeftEncoderRight, RightEncoderLeft, and RightEncoderRight + +#define LAYOUT( \ + L00, L01, L02, L03, L04, L05, L06, R06, R00, R01, R02, R03, R04, R05, \ + L10, L11, L12, L13, L14, L15, L16, R16, R10, R11, R12, R13, R14, R15, \ + L20, L21, L22, L23, L24, L25, L26, R26, R20, R21, R22, R23, R24, R25, \ + L30, L31, L32, L33, L34, L35, L36, R36, R30, R31, R32, R33, R34, R35, \ + L40, L41, L42, L43, L44, L45, L46, R46, R40, R41, R42, R43, R44, R45, \ + LEL, LER, L55, L56, R56, R50, REL, RER \ + ) \ + { \ + { L00, L01, L02, L03, L04, L05, L06 }, \ + { L10, L11, L12, L13, L14, L15, L16 }, \ + { L20, L21, L22, L23, L24, L25, L26 }, \ + { L30, L31, L32, L33, L34, L35, L36 }, \ + { L40, L41, L42, L43, L44, L45, L46 }, \ + { LEL, LER, KC_NO, KC_NO, KC_NO, L55, L56 }, \ + { R05, R04, R03, R02, R01, R00, R06 }, \ + { R15, R14, R13, R12, R11, R10, R16 }, \ + { R25, R24, R23, R22, R21, R20, R26 }, \ + { R35, R34, R33, R32, R31, R30, R36 }, \ + { R45, R44, R43, R42, R41, R40, R46 }, \ + { REL, RER, KC_NO, KC_NO, KC_NO, R50, R56 } \ + } + +#define KC________ KC_TRNS +#define KC_RGB_MOD RGB_MOD +#define KC_FN FN +#define KC_ADJ ADJ +#define LAYOUT_kc( \ + L00, L01, L02, L03, L04, L05, L06, R06, R00, R01, R02, R03, R04, R05, \ + L10, L11, L12, L13, L14, L15, L16, R16, R10, R11, R12, R13, R14, R15, \ + L20, L21, L22, L23, L24, L25, L26, R26, R20, R21, R22, R23, R24, R25, \ + L30, L31, L32, L33, L34, L35, L36, R36, R30, R31, R32, R33, R34, R35, \ + L40, L41, L42, L43, L44, L45, L46, R46, R40, R41, R42, R43, R44, R45, \ + LEL, LER, L55, L56, R56, R50, REL, RER \ + ) \ + LAYOUT( \ + KC_##L00, KC_##L01, KC_##L02, KC_##L03, KC_##L04, KC_##L05, KC_##L06, KC_##R06, KC_##R00, KC_##R01, KC_##R02, KC_##R03, KC_##R04, KC_##R05, \ + KC_##L10, KC_##L11, KC_##L12, KC_##L13, KC_##L14, KC_##L15, KC_##L16, KC_##R16, KC_##R10, KC_##R11, KC_##R12, KC_##R13, KC_##R14, KC_##R15, \ + KC_##L20, KC_##L21, KC_##L22, KC_##L23, KC_##L24, KC_##L25, KC_##L26, KC_##R26, KC_##R20, KC_##R21, KC_##R22, KC_##R23, KC_##R24, KC_##R25, \ + KC_##L30, KC_##L31, KC_##L32, KC_##L33, KC_##L34, KC_##L35, KC_##L36, KC_##R36, KC_##R30, KC_##R31, KC_##R32, KC_##R33, KC_##R34, KC_##R35, \ + KC_##L40, KC_##L41, KC_##L42, KC_##L43, KC_##L44, KC_##L45, KC_##L46, KC_##R46, KC_##R40, KC_##R41, KC_##R42, KC_##R43, KC_##R44, KC_##R45, \ + KC_##LEL, KC_##LER, KC_##L55, KC_##L56, KC_##R56, KC_##R50, KC_##REL, KC_##RER \ + ) + +#endif diff --git a/keyboards/sol/rev1/rules.mk b/keyboards/sol/rev1/rules.mk new file mode 100644 index 000000000..99f4dd896 --- /dev/null +++ b/keyboards/sol/rev1/rules.mk @@ -0,0 +1,2 @@ +SRC += rev1/matrix.c \ + rev1/split_util.c diff --git a/keyboards/sol/rev1/split_util.c b/keyboards/sol/rev1/split_util.c new file mode 100644 index 000000000..c645bbdfe --- /dev/null +++ b/keyboards/sol/rev1/split_util.c @@ -0,0 +1,54 @@ +#include +#include +#include +#include +#include +#include +#include "split_util.h" +#include "matrix.h" +#include "keyboard.h" +#include "serial.h" + +volatile bool isLeftHand = true; + +static void setup_handedness(void) { + #ifdef EE_HANDS + isLeftHand = eeprom_read_byte(EECONFIG_HANDEDNESS); + #else + #if defined(MASTER_RIGHT) + isLeftHand = !has_usb(); + #else + isLeftHand = has_usb(); + #endif + #endif +} + +static void keyboard_master_setup(void) { + serial_master_init(); +} + +static void keyboard_slave_setup(void) { + serial_slave_init(); +} + +bool has_usb(void) { + USBCON |= (1 << OTGPADE); //enables VBUS pad + _delay_us(5); + return (USBSTA & (1< +#include "eeconfig.h" + +extern volatile bool isLeftHand; + +// slave version of matix scan, defined in matrix.c +void matrix_slave_scan(void); + +void split_keyboard_setup(void); +bool has_usb(void); + +void matrix_master_OLED_init (void); + +#endif diff --git a/keyboards/sol/rules.mk b/keyboards/sol/rules.mk new file mode 100644 index 000000000..f53e5b21f --- /dev/null +++ b/keyboards/sol/rules.mk @@ -0,0 +1,71 @@ +SRC += i2c.c \ + serial.c \ + common/ssd1306.c + +# MCU name +#MCU = at90usb1287 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Bootloader +# This definition is optional, and if your keyboard supports multiple bootloaders of +# different sizes, comment this out, and the correct address will be loaded +# automatically (+60). See bootloader.mk for all options. +BOOTLOADER = qmk-dfu + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = no # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +CUSTOM_MATRIX = yes + +DEFAULT_FOLDER = sol/rev1 diff --git a/keyboards/sol/serial.c b/keyboards/sol/serial.c new file mode 100644 index 000000000..169b4b176 --- /dev/null +++ b/keyboards/sol/serial.c @@ -0,0 +1,288 @@ +/* + * WARNING: be careful changing this code, it is very timing dependent + */ + +#ifndef F_CPU +#define F_CPU 16000000 +#endif + +#include +#include +#include +#include +#include "serial.h" + +#ifdef USE_SERIAL + +#define _delay_sub_us(x) __builtin_avr_delay_cycles(x) + +// Serial pulse period in microseconds. +#define SELECT_SERIAL_SPEED 1 +#if SELECT_SERIAL_SPEED == 0 + // Very High speed + #define SERIAL_DELAY 4 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 10 // cycles +#elif SELECT_SERIAL_SPEED == 1 + // High speed + #define SERIAL_DELAY 6 // micro sec + #define READ_WRITE_START_ADJUST 23 // cycles + #define READ_WRITE_WIDTH_ADJUST 10 // cycles +#elif SELECT_SERIAL_SPEED == 2 + // Middle speed + #define SERIAL_DELAY 12 // micro sec + #define READ_WRITE_START_ADJUST 25 // cycles + #define READ_WRITE_WIDTH_ADJUST 10 // cycles +#elif SELECT_SERIAL_SPEED == 3 + // Low speed + #define SERIAL_DELAY 24 // micro sec + #define READ_WRITE_START_ADJUST 25 // cycles + #define READ_WRITE_WIDTH_ADJUST 10 // cycles +#elif SELECT_SERIAL_SPEED == 4 + // Very Low speed + #define SERIAL_DELAY 50 // micro sec + #define READ_WRITE_START_ADJUST 25 // cycles + #define READ_WRITE_WIDTH_ADJUST 10 // cycles +#else +#error Illegal Serial Speed +#endif + + +#define SERIAL_DELAY_HALF1 (SERIAL_DELAY/2) +#define SERIAL_DELAY_HALF2 (SERIAL_DELAY - SERIAL_DELAY/2) + +#define SLAVE_INT_WIDTH 1 +#define SLAVE_INT_RESPONSE_TIME SERIAL_DELAY + +uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; +uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0}; + +#define SLAVE_DATA_CORRUPT (1<<0) +volatile uint8_t status = 0; + +inline static +void serial_delay(void) { + _delay_us(SERIAL_DELAY); +} + +inline static +void serial_delay_half1(void) { + _delay_us(SERIAL_DELAY_HALF1); +} + +inline static +void serial_delay_half2(void) { + _delay_us(SERIAL_DELAY_HALF2); +} + +inline static +void serial_output(void) { + SERIAL_PIN_DDR |= SERIAL_PIN_MASK; +} + +// make the serial pin an input with pull-up resistor +inline static +void serial_input_with_pullup(void) { + SERIAL_PIN_DDR &= ~SERIAL_PIN_MASK; + SERIAL_PIN_PORT |= SERIAL_PIN_MASK; +} + +inline static +uint8_t serial_read_pin(void) { + return !!(SERIAL_PIN_INPUT & SERIAL_PIN_MASK); +} + +inline static +void serial_low(void) { + SERIAL_PIN_PORT &= ~SERIAL_PIN_MASK; +} + +inline static +void serial_high(void) { + SERIAL_PIN_PORT |= SERIAL_PIN_MASK; +} + +void serial_master_init(void) { + serial_output(); + serial_high(); +} + +void serial_slave_init(void) { + serial_input_with_pullup(); + + +// Enable INT3 +EIMSK |= _BV(INT3); +// Trigger on falling edge of INT3 +EICRA &= ~(_BV(ISC30) | _BV(ISC31)); + +} + +// Used by the sender to synchronize timing with the reciver. +static +void sync_recv(void) { + for (int i = 0; i < SERIAL_DELAY*5 && serial_read_pin(); i++ ) { + } + // This shouldn't hang if the slave disconnects because the + // serial line will float to high if the slave does disconnect. + while (!serial_read_pin()); +} + +// Used by the reciver to send a synchronization signal to the sender. +static +void sync_send(void) { + serial_low(); + serial_delay(); + serial_high(); +} + +// Reads a byte from the serial line +static +uint8_t serial_read_byte(void) { + uint8_t byte = 0; + _delay_sub_us(READ_WRITE_START_ADJUST); + for ( uint8_t i = 0; i < 8; ++i) { + serial_delay_half1(); // read the middle of pulses + byte = (byte << 1) | serial_read_pin(); + _delay_sub_us(READ_WRITE_WIDTH_ADJUST); + serial_delay_half2(); + } + return byte; +} + +// Sends a byte with MSB ordering +static +void serial_write_byte(uint8_t data) { + uint8_t b = 1<<7; + while( b ) { + if(data & b) { + serial_high(); + } else { + serial_low(); + } + b >>= 1; + serial_delay(); + } + serial_low(); // sync_send() / senc_recv() need raise edge +} + +// interrupt handle to be used by the slave device +ISR(SERIAL_PIN_INTERRUPT) { + serial_output(); + + // slave send phase + uint8_t checksum = 0; + for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) { + sync_send(); + serial_write_byte(serial_slave_buffer[i]); + checksum += serial_slave_buffer[i]; + } + sync_send(); + serial_write_byte(checksum); + + // slave switch to input + sync_send(); //0 + serial_delay_half1(); //1 + serial_low(); //2 + serial_input_with_pullup(); //2 + serial_delay_half1(); //3 + + // slave recive phase + uint8_t checksum_computed = 0; + for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) { + sync_recv(); + serial_master_buffer[i] = serial_read_byte(); + checksum_computed += serial_master_buffer[i]; + } + sync_recv(); + uint8_t checksum_received = serial_read_byte(); + + if ( checksum_computed != checksum_received ) { + status |= SLAVE_DATA_CORRUPT; + } else { + status &= ~SLAVE_DATA_CORRUPT; + } + + sync_recv(); //weit master output to high +} + +inline +bool serial_slave_DATA_CORRUPT(void) { + return status & SLAVE_DATA_CORRUPT; +} + +// Copies the serial_slave_buffer to the master and sends the +// serial_master_buffer to the slave. +// +// Returns: +// 0 => no error +// 1 => slave did not respond +// 2 => checksum error +int serial_update_buffers(void) { + // this code is very time dependent, so we need to disable interrupts + cli(); + + // signal to the slave that we want to start a transaction + serial_output(); + serial_low(); + _delay_us(SLAVE_INT_WIDTH); + + // wait for the slaves response + serial_input_with_pullup(); + _delay_us(SLAVE_INT_RESPONSE_TIME); + + // check if the slave is present + if (serial_read_pin()) { + // slave failed to pull the line low, assume not present + serial_output(); + serial_high(); + sei(); + return 1; + } + + // master recive phase + // if the slave is present syncronize with it + + uint8_t checksum_computed = 0; + // receive data from the slave + for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) { + sync_recv(); + serial_slave_buffer[i] = serial_read_byte(); + checksum_computed += serial_slave_buffer[i]; + } + sync_recv(); + uint8_t checksum_received = serial_read_byte(); + + if (checksum_computed != checksum_received) { + serial_output(); + serial_high(); + sei(); + return 2; + } + + // master switch to output + sync_recv(); //0 + serial_delay(); //1 + serial_low(); //3 + serial_output(); // 3 + serial_delay_half1(); //4 + + // master send phase + uint8_t checksum = 0; + + for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) { + sync_send(); + serial_write_byte(serial_master_buffer[i]); + checksum += serial_master_buffer[i]; + } + sync_send(); + serial_write_byte(checksum); + + // always, release the line when not in use + sync_send(); + + sei(); + return 0; +} + +#endif diff --git a/keyboards/sol/serial.h b/keyboards/sol/serial.h new file mode 100644 index 000000000..cd6bcc76b --- /dev/null +++ b/keyboards/sol/serial.h @@ -0,0 +1,26 @@ +#ifndef MY_SERIAL_H +#define MY_SERIAL_H + +#include + +/* TODO: some defines for interrupt setup */ +#define SERIAL_PIN_DDR DDRD +#define SERIAL_PIN_PORT PORTD +#define SERIAL_PIN_INPUT PIND +#define SERIAL_PIN_MASK _BV(PD3) //SErial pin goes here, D0-D3 +#define SERIAL_PIN_INTERRUPT INT3_vect //"INT#" of your serial pin + + +#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 +#define SERIAL_MASTER_BUFFER_LENGTH MATRIX_ROWS/2 + +// Buffers for master - slave communication +extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH]; +extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH]; + +void serial_master_init(void); +void serial_slave_init(void); +int serial_update_buffers(void); +bool serial_slave_data_corrupt(void); + +#endif diff --git a/keyboards/sol/sol.c b/keyboards/sol/sol.c new file mode 100644 index 000000000..5945cc60a --- /dev/null +++ b/keyboards/sol/sol.c @@ -0,0 +1 @@ +#include "sol.h" diff --git a/keyboards/sol/sol.h b/keyboards/sol/sol.h new file mode 100644 index 000000000..8f451ce56 --- /dev/null +++ b/keyboards/sol/sol.h @@ -0,0 +1,7 @@ +#ifndef SOL_H +#define SOL_H + +#include "rev1.h" +#include "quantum.h" + +#endif From 538874f90f5ae69b241f80baa639fb6dbc4cfa80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ismael=20Venegas=20Castell=C3=B3?= Date: Wed, 5 Dec 2018 10:12:35 -0600 Subject: [PATCH 611/788] Keymap: Hacker Dvorak (#4514) * Hacker Dvorak Programmer Dvorak based layout for the Ergodox EZ. * Address drashna comments. * Fix RGB and drop OSL for MO. * Add gulp file to automate development. * Fix gulpfile. * Caps, num and scroll lock indicators. * Fix scroll lock. --- .../keymaps/hacker_dvorak/.gitignore | 2 + .../ergodox_ez/keymaps/hacker_dvorak/config.h | 82 ++ .../keymaps/hacker_dvorak/default.png.md | 1 + .../hacker_dvorak/default_highres.png.md | 1 + .../keymaps/hacker_dvorak/gulpfile.js | 13 + .../ergodox_ez/keymaps/hacker_dvorak/keymap.c | 781 ++++++++++++++++++ .../keymaps/hacker_dvorak/package.json | 15 + .../keymaps/hacker_dvorak/readme.md | 62 ++ .../ergodox_ez/keymaps/hacker_dvorak/rules.mk | 35 + quantum/keymap_extras/keymap_plover_dvorak.h | 47 ++ 10 files changed, 1039 insertions(+) create mode 100644 keyboards/ergodox_ez/keymaps/hacker_dvorak/.gitignore create mode 100644 keyboards/ergodox_ez/keymaps/hacker_dvorak/config.h create mode 100644 keyboards/ergodox_ez/keymaps/hacker_dvorak/default.png.md create mode 100644 keyboards/ergodox_ez/keymaps/hacker_dvorak/default_highres.png.md create mode 100644 keyboards/ergodox_ez/keymaps/hacker_dvorak/gulpfile.js create mode 100644 keyboards/ergodox_ez/keymaps/hacker_dvorak/keymap.c create mode 100644 keyboards/ergodox_ez/keymaps/hacker_dvorak/package.json create mode 100644 keyboards/ergodox_ez/keymaps/hacker_dvorak/readme.md create mode 100644 keyboards/ergodox_ez/keymaps/hacker_dvorak/rules.mk create mode 100644 quantum/keymap_extras/keymap_plover_dvorak.h diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/.gitignore b/keyboards/ergodox_ez/keymaps/hacker_dvorak/.gitignore new file mode 100644 index 000000000..504afef81 --- /dev/null +++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +package-lock.json diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/config.h b/keyboards/ergodox_ez/keymaps/hacker_dvorak/config.h new file mode 100644 index 000000000..c6b86004c --- /dev/null +++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/config.h @@ -0,0 +1,82 @@ +/* + Set any config.h overrides for your specific keymap here. + See config.h options at https://docs.qmk.fm/#/config_options?id=the-configh-file +*/ +#pragma once + + +/* Keyboard Settings */ +#undef TAPPING_TERM +#define TAPPING_TERM 150 + +#undef DEBOUNCE +#define DEBOUNCE 10 + +#undef IGNORE_MOD_TAP_INTERRUPT +#define IGNORE_MOD_TAP_INTERRUPT + +#undef FORCE_NKRO +#define FORCE_NKRO + +/* This isn't defined by default, so there is no need to undefine it first. */ +#define LEADER_TIMEOUT 500 +#define PERMISSIVE_HOLD +#define QMK_KEYS_PER_SCAN 4 + + +// RGB Lights +#undef RGBLIGHT_HUE_STEP +#define RGBLIGHT_HUE_STEP 24 + +#undef RGBLIGHT_SAT_STEP +#define RGBLIGHT_SAT_STEP 24 + +#undef RGBLIGHT_VAL_STEP +#define RGBLIGHT_VAL_STEP 24 + +#undef RGBLIGHT_BRI_STEP +#define RGBLIGHT_BRI_STEP 24 + +#undef RGBLIGHT_LIMIT_VAL +#define RGBLIGHT_LIMIT_VAL 255 + +/* This isn't defined by default, so there is no need to undefine it first. */ +#define RGBLIGHT_SLEEP + + +// Mouse +#undef MOUSEKEY_INTERVAL +#define MOUSEKEY_INTERVAL 10 + +#undef MOUSEKEY_DELAY +#define MOUSEKEY_DELAY 15 + +#undef MOUSEKEY_MAX_SPEED +#define MOUSEKEY_MAX_SPEED 15 + +#undef MOUSEKEY_TIME_TO_MAX +#define MOUSEKEY_TIME_TO_MAX 150 + +#undef MOUSEKEY_WHEEL_MAX_SPEED +#define MOUSEKEY_WHEEL_MAX_SPEED 15 + +#undef MOUSEKEY_WHEEL_TIME_TO_MAX +#define MOUSEKEY_WHEEL_TIME_TO_MAX 150 + + +/* This is defined only if CONSOLE_ENABLE is set to "yes" */ +// #undef NO_DEBUG +// #define NO_DEBUG + +// #undef NO_PRINT +// #define NO_PRINT + +/* For COMBO only*/ +// #define COMBO_COUNT 1 +// #define COMBO_TERM 200 + +/* For tap toggle */ +// #define TAPPING_TOGGLE 2 +// #define ONESHOT_TAP_TOGGLE 2 +// #define ONESHOT_TIMEOUT 300 + diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/default.png.md b/keyboards/ergodox_ez/keymaps/hacker_dvorak/default.png.md new file mode 100644 index 000000000..744e7d172 --- /dev/null +++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/default.png.md @@ -0,0 +1 @@ +https://i.imgur.com/fKX0Zbs.png diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/default_highres.png.md b/keyboards/ergodox_ez/keymaps/hacker_dvorak/default_highres.png.md new file mode 100644 index 000000000..074e0634d --- /dev/null +++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/default_highres.png.md @@ -0,0 +1 @@ +https://i.imgur.com/giAc3M9.jpg diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/gulpfile.js b/keyboards/ergodox_ez/keymaps/hacker_dvorak/gulpfile.js new file mode 100644 index 000000000..338b0c6ba --- /dev/null +++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/gulpfile.js @@ -0,0 +1,13 @@ +let gulp = require('gulp'); +let run = require('gulp-run-command').default; + + +gulp.task('clean', run('rm -rf ../../../../.build')); + +gulp.task('build', ['clean'], run('make -C ../../../../ ergodox_ez:hacker_dvorak', { + ignoreErrors: true +})); + +gulp.task('watch', ['build'], () => { + gulp.watch(['keymap.c', 'config.h', 'rules.mk'], ['build']); +}); diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/keymap.c b/keyboards/ergodox_ez/keymaps/hacker_dvorak/keymap.c new file mode 100644 index 000000000..c42b55108 --- /dev/null +++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/keymap.c @@ -0,0 +1,781 @@ +#include QMK_KEYBOARD_H +#include "keymap_dvorak.h" +#include "sendstring_dvorak.h" +#include "keymap_plover.h" +#include "keymap_plover_dvorak.h" + + +#define SCTL(kc) LSFT(LCTL(kc)) + +// Layers +enum layers { + DVORAK_US = 0, + PLOVER_US, + GAMING_US, + ARROWS_US, + MOUSE_US, + NUMPAD_US, + LAYERS_US, + DVORAK_DV, + PLOVER_DV, + GAMING_DV, + ARROWS_DV, + MOUSE_DV, + NUMPAD_DV, + LAYERS_DV, + MEDIA_FN, + HYPER_FN, + MEH_FN, + MEH_FN_PLUS, + FIRMWARE +}; + +int CAPS_LOCK = 0; +int NUM_LOCK = 0; +int SCROLL_LOCK = 0; + +enum tap_dances { + TD_ESC_CAPS = 0 +}; + +qk_tap_dance_action_t tap_dance_actions[] = { + [TD_ESC_CAPS] = ACTION_TAP_DANCE_DOUBLE(KC_ESC, KC_CLCK) +}; + + +enum custom_keycodes { + PLACEHOLDER = SAFE_RANGE, // can always be here + RGB_GREEN // to set default RGB layer as green once +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* + * ,--------------------------------------------------. ,--------------------------------------------------. + * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | | 38 | 39 | 40 | 41 | 42 | 43 | 44 | + * |--------+------+------+------+------+------+------| |------+------+------+------+------+------+--------| + * | 7 | 8 | 9 | 10 | 11 | 12 | 13 | | 45 | 46 | 47 | 48 | 49 | 50 | 51 | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | 14 | 15 | 16 | 17 | 18 | 19 |------| |------| 52 | 53 | 54 | 55 | 56 | 57 | + * |--------+------+------+------+------+------| 26 | | 58 |------+------+------+------+------+--------| + * | 20 | 21 | 22 | 23 | 24 | 25 | | | | 59 | 60 | 61 | 62 | 63 | 64 | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | 27 | 28 | 29 | 30 | 31 | | 65 | 66 | 67 | 68 | 69 | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | 32 | 33 | | 70 | 71 | + * ,------+------+------| |------+------+------. + * | | | 34 | | 72 | | | + * | 35 | 36 |------| |------| 74 | 75 | + * | | | 37 | | 73 | | | + * `--------------------' `--------------------' + */ + [DVORAK_US] = LAYOUT_ergodox( + // left hand + KC_ESC, KC_LABK, KC_LCBR, KC_LBRC, KC_LPRN, KC_EXLM, KC_AMPR, + KC_TAB, KC_QUOT, SCMD_T(KC_COMM), MEH_T(KC_DOT), ALL_T(KC_P), KC_Y, KC_AT, + KC_EQL, CTL_T(KC_A), SFT_T(KC_O), LT(NUMPAD_US, KC_E), LT(ARROWS_US, KC_U), KC_I, + KC_BSLS, ALGR_T(KC_SCLN), ALT_T(KC_Q), LT(MEDIA_FN, KC_J), GUI_T(KC_K), KC_X, KC_PERC, + MO(MEH_FN), TG(LAYERS_US), KC_CIRC, KC_PLUS, KC_COLN, + + // left thumb + KC_LEFT, KC_RGHT, + KC_HOME, + KC_SPC, KC_BSPC, KC_END, + + // right hand + KC_PIPE, KC_QUES, KC_RPRN, KC_RBRC, KC_RCBR, KC_RABK, KC_ASTR, + KC_HASH, KC_F, ALL_T(KC_G), MEH_T(KC_C), SCMD_T(KC_R), KC_L, KC_SLSH, + KC_D, LT(MOUSE_US, KC_H), LT(HYPER_FN, KC_T), SFT_T(KC_N), CTL_T(KC_S), KC_MINS, + KC_DLR, KC_B, GUI_T(KC_M), LT(MEDIA_FN, KC_W), ALT_T(KC_V), ALGR_T(KC_Z), KC_GRV, + KC_DQUO, KC_UNDS, KC_TILD, TG(DVORAK_DV), MO(MEH_FN_PLUS), + + // right thumb + KC_UP, KC_DOWN, + KC_PGUP, + KC_PGDN, KC_DEL, KC_ENT + ), + + [PLOVER_US] = LAYOUT_ergodox( + // left hand + XXXXXXX, XXXXXXX, KC_MS_BTN2, KC_MS_UP, KC_MS_BTN1, KC_MS_BTN3, GUI_T(KC_NO), + KC_ESC, KC_MS_BTN4, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_MS_BTN5, PV_NUM, + KC_TAB, PV_LS, PV_LT, PV_LP, PV_LH, PV_STAR, + KC_CLCK, PV_LS, PV_LK, PV_LW, PV_LR, PV_STAR, PV_STAR, + MO(MEH_FN), TG(LAYERS_US), PV_NUM, PV_NUM, PV_NUM, + + // left thumb + KC_SPACE, KC_BSPACE, + KC_HOME, + PV_A, PV_O, KC_END, + + // right hand + KC_MS_ACCEL2, KC_MS_ACCEL1, KC_MS_ACCEL0, KC_UP, KC_APPLICATION, XXXXXXX, KC_MS_WH_UP, + PV_NUM, KC_MS_WH_LEFT, KC_LEFT, KC_DOWN, KC_RIGHT, KC_MS_WH_RIGHT, KC_MS_WH_DOWN, + PV_STAR, PV_RF, PV_RP, PV_RL, PV_RT, PV_RD, + PV_STAR, PV_STAR, PV_RR, PV_RB, PV_RG, PV_RS, PV_RZ, + PV_NUM, PV_NUM, PV_NUM, PV_NUM, MO(MEH_FN_PLUS), + + // right thumb + KC_DELETE, KC_ENTER, + KC_PGUP, + KC_PGDOWN, PV_E, PV_U + ), + + [GAMING_US] = LAYOUT_ergodox( + // left hand + KC_ESCAPE, GUI_T(KC_MINS), KC_I, KC_O, KC_P, ALGR_T(KC_EQL), KC_T, + KC_TAB, KC_LALT, KC_Q, KC_W, KC_E, ALL_T(KC_R), KC_G, + LT(MOUSE_US, KC_GRV), KC_LCTRL, KC_A, KC_S, KC_D, MEH_T(KC_F), + KC_BSLS, KC_LSHIFT, KC_Z, KC_X, KC_C, SCMD_T(KC_V), KC_M, + MO(MEH_FN), TG(LAYERS_US), KC_COMM, KC_DOT, KC_LBRC, + + // left thumb + MO(MEDIA_FN), KC_NLCK, + KC_SCLN, + KC_SPACE, KC_ENTER, KC_BSPACE, + + // right hand + KC_QUOT, KC_Y, KC_K, KC_U, KC_KP_7, KC_KP_8, KC_KP_9, + KC_MS_WH_UP, KC_H, KC_J, KC_L, KC_KP_4, KC_KP_2, KC_KP_6, + KC_B, KC_MS_UP, KC_N, KC_KP_1, KC_KP_5, KC_KP_3, + KC_MS_WH_DOWN, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_UP, KC_KP_0, KC_SLASH, + KC_RBRC, KC_LEFT, KC_DOWN, KC_RIGHT, MO(MEH_FN_PLUS), + + // right thumb + KC_MS_BTN5, MO(HYPER_FN), + KC_MS_BTN4, + KC_MS_BTN3, KC_MS_BTN2, KC_MS_BTN1 + ), + + [ARROWS_US] = LAYOUT_ergodox( + // left hand + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, SCMD_T(KC_NO), MEH_T(KC_NO), ALL_T(KC_NO), XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, KC_LCTRL, KC_LSHIFT, XXXXXXX, _______, XXXXXXX, + XXXXXXX, KC_RALT, KC_LALT, GUI_T(KC_NO), XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + + // left thumb + XXXXXXX, XXXXXXX, + KC_HOME, + KC_SPACE, KC_BSPACE, KC_END, + + // right hand + LGUI(KC_X), XXXXXXX, LCTL(KC_X), KC_MS_WH_UP, XXXXXXX, XXXXXXX, XXXXXXX, + LGUI(KC_C), XXXXXXX, LCTL(KC_C), KC_UP, SCTL(KC_C), LCTL(KC_Z), LGUI(KC_Z), + KC_MS_WH_LEFT, KC_LEFT, KC_DOWN, KC_RIGHT, KC_MS_WH_RIGHT, KC_APPLICATION, + LGUI(KC_V), XXXXXXX, LCTL(KC_V), KC_MS_WH_DOWN, SCTL(KC_V), LCTL(KC_Y), SGUI(KC_Z), + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_SLCK, + + // right thumb + XXXXXXX, XXXXXXX, + KC_PGUP, + KC_PGDOWN, KC_DELETE, KC_ENTER + ), + + [MOUSE_US] = LAYOUT_ergodox( + // left hand + XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_WH_UP, LCTL(KC_X), XXXXXXX, LGUI(KC_X), + LGUI(KC_Z), LCTL(KC_Z), SCTL(KC_C), KC_MS_UP, LCTL(KC_C), KC_MS_BTN4, LGUI(KC_C), + KC_MS_BTN3, KC_MS_WH_LEFT, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_MS_WH_RIGHT, + LGUI(KC_Z), LCTL(KC_Y), SCTL(KC_V), KC_MS_WH_DOWN, LCTL(KC_V), KC_MS_BTN5, LGUI(KC_V), + KC_SLCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + + // left thumb + XXXXXXX, XXXXXXX, + XXXXXXX, + KC_MS_BTN1, KC_MS_BTN2, XXXXXXX, + + // right hand + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, ALL_T(KC_NO), MEH_T(KC_NO), SCMD_T(KC_NO), XXXXXXX, + XXXXXXX, _______, KC_MS_ACCEL1, KC_LSHIFT, KC_LCTRL, KC_MS_ACCEL2, + XXXXXXX, XXXXXXX, XXXXXXX, GUI_T(KC_NO), KC_LALT, KC_RALT, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + + // right thumb + XXXXXXX, XXXXXXX, + XXXXXXX, + XXXXXXX, XXXXXXX, KC_MS_ACCEL0 + ), + + [NUMPAD_US] = LAYOUT_ergodox( + // left hand + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, GUI_T(KC_NO), XXXXXXX, ALL_T(KC_NO), XXXXXXX, XXXXXXX, + _______, KC_LCTRL, KC_LSHIFT, _______, MEH_T(KC_NO), XXXXXXX, + XXXXXXX, KC_RALT, KC_LALT, XXXXXXX, SCMD_T(KC_NO), XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + + // left thumb + XXXXXXX, XXXXXXX, + KC_HOME, + KC_SPACE, KC_BSPACE, KC_END, + + // right hand + KC_X, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, + KC_O, KC_I, KC_1, KC_2, KC_3, KC_SLSH, KC_PERC, + KC_M, KC_4, KC_5, KC_6, KC_PLUS, KC_MINS, + KC_L, KC_J, KC_7, KC_8, KC_9, KC_ASTR, KC_CIRC, + KC_DOT, KC_0, KC_COMM, KC_UNDS, KC_BSLS, + + // right thumb + XXXXXXX, XXXXXXX, + KC_PGUP, + KC_PGDOWN, KC_DELETE, KC_ENTER + ), + + [LAYERS_US] = LAYOUT_ergodox( + // left hand + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, + + // left thumb + XXXXXXX, XXXXXXX, + XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, + + // right hand + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, TO(DVORAK_US), TO(PLOVER_US), TO(GAMING_US), XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + + // right thumb + XXXXXXX, XXXXXXX, + XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX + ), + + [DVORAK_DV] = LAYOUT_ergodox( + // left hand + KC_ESC, DV_LABK, DV_LCBR, DV_LBRC, DV_LPRN, DV_EXLM, DV_AMPR, + KC_TAB, DV_QUOT, SCMD_T(DV_COMM), MEH_T(DV_DOT), ALL_T(DV_P), DV_Y, DV_AT, + DV_EQL, CTL_T(DV_A), SFT_T(DV_O), LT(NUMPAD_DV, DV_E), LT(ARROWS_DV, DV_U), DV_I, + DV_BSLS, ALGR_T(DV_SCLN), ALT_T(DV_Q), LT(MEDIA_FN, DV_J), GUI_T(DV_K), DV_X, DV_PERC, + MO(MEH_FN), TG(LAYERS_DV), DV_CIRC, DV_PLUS, DV_COLN, + + // left thumb + KC_LEFT, KC_RGHT, + KC_HOME, + KC_SPC, KC_BSPC, KC_END, + + // right hand + DV_PIPE, DV_QUES, DV_RPRN, DV_RBRC, DV_RCBR, DV_RABK, DV_ASTR, + DV_HASH, DV_F, ALL_T(DV_G), MEH_T(DV_C), SCMD_T(DV_R), DV_L, DV_SLSH, + DV_D, LT(MOUSE_DV, DV_H), LT(HYPER_FN, DV_T), SFT_T(DV_N), CTL_T(DV_S), DV_MINS, + DV_DLR, DV_B, GUI_T(DV_M), LT(MEDIA_FN, DV_W), ALT_T(DV_V), ALGR_T(DV_Z), DV_GRV, + DV_DQUO, DV_UNDS, DV_TILD, _______, MO(MEH_FN_PLUS), + + // right thumb + KC_UP, KC_DOWN, + KC_PGUP, + KC_PGDN, KC_DEL, KC_ENT + ), + + [PLOVER_DV] = LAYOUT_ergodox( + // left hand + XXXXXXX, XXXXXXX, KC_MS_BTN2, KC_MS_UP, KC_MS_BTN1, KC_MS_BTN3, GUI_T(KC_NO), + KC_ESC, KC_MS_BTN4, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_MS_BTN5, PD_NUM, + KC_TAB, PD_LS, PD_LT, PD_LP, PD_LH, PD_STAR, + KC_CLCK, PD_LS, PD_LK, PD_LW, PD_LR, PD_STAR, PD_STAR, + MO(MEH_FN), TG(LAYERS_DV), PD_NUM, PD_NUM, PD_NUM, + + // left thumb + KC_SPACE, KC_BSPACE, + KC_HOME, + PD_A, PD_O, KC_END, + + // right hand + KC_MS_ACCEL2, KC_MS_ACCEL1, KC_MS_ACCEL0, KC_UP, KC_APPLICATION, XXXXXXX, KC_MS_WH_UP, + PD_NUM, KC_MS_WH_LEFT, KC_LEFT, KC_DOWN, KC_RIGHT, KC_MS_WH_RIGHT, KC_MS_WH_DOWN, + PD_STAR, PD_RF, PD_RP, PD_RL, PD_RT, PD_RD, + PD_STAR, PD_STAR, PD_RR, PD_RB, PD_RG, PD_RS, PD_RZ, + PD_NUM, PD_NUM, PD_NUM, PD_NUM, MO(MEH_FN_PLUS), + + // right thumb + KC_DELETE, KC_ENTER, + KC_PGUP, + KC_PGDOWN, PD_E, PD_U + ), + + [GAMING_DV] = LAYOUT_ergodox( + // left hand + KC_ESCAPE, GUI_T(DV_MINS), DV_I, DV_O, DV_P, ALGR_T(DV_EQL), DV_T, + KC_TAB, KC_LALT, DV_Q, DV_W, DV_E, ALL_T(DV_R), DV_G, + LT(MOUSE_DV, DV_GRV), KC_LCTRL, DV_A, DV_S, DV_D, MEH_T(DV_F), + DV_BSLS, KC_LSHIFT, DV_Z, DV_X, DV_C, SCMD_T(DV_V), DV_M, + MO(MEH_FN), TG(LAYERS_DV), DV_COMM, DV_DOT, DV_LBRC, + + // left thumb + MO(MEDIA_FN), KC_NLCK, + DV_SCLN, + KC_SPACE, KC_ENTER, KC_BSPACE, + + // right hand + DV_QUOT, DV_Y, DV_K, DV_U, KC_KP_7, KC_KP_8, KC_KP_9, + KC_MS_WH_UP, DV_H, DV_J, DV_L, KC_KP_4, KC_KP_2, KC_KP_6, + DV_B, KC_MS_UP, DV_N, KC_KP_1, KC_KP_5, KC_KP_3, + KC_MS_WH_DOWN, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_UP, KC_KP_0, DV_SLSH, + DV_RBRC, KC_LEFT, KC_DOWN, KC_RIGHT, MO(MEH_FN_PLUS), + + // right thumb + KC_MS_BTN5, MO(HYPER_FN), + KC_MS_BTN4, + KC_MS_BTN3, KC_MS_BTN2, KC_MS_BTN1 + ), + + [ARROWS_DV] = LAYOUT_ergodox( + // left hand + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, SCMD_T(KC_NO), MEH_T(KC_NO), ALL_T(KC_NO), XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, KC_LCTRL, KC_LSHIFT, XXXXXXX, _______, XXXXXXX, + XXXXXXX, KC_RALT, KC_LALT, GUI_T(KC_NO), XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + + // left thumb + XXXXXXX, XXXXXXX, + KC_HOME, + KC_SPACE, KC_BSPACE, KC_END, + + // right hand + LGUI(DV_X), XXXXXXX, LCTL(DV_X), KC_MS_WH_UP, XXXXXXX, XXXXXXX, XXXXXXX, + LGUI(DV_C), XXXXXXX, LCTL(DV_C), KC_UP, SCTL(DV_C), LCTL(DV_Z), LGUI(DV_Z), + KC_MS_WH_LEFT, KC_LEFT, KC_DOWN, KC_RIGHT, KC_MS_WH_RIGHT, KC_APPLICATION, + LGUI(DV_V), XXXXXXX, LCTL(DV_V), KC_MS_WH_DOWN, SCTL(DV_V), LCTL(DV_Y), SGUI(DV_Z), + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_SLCK, + + // right thumb + XXXXXXX, XXXXXXX, + KC_PGUP, + KC_PGDOWN, KC_DELETE, KC_ENTER + ), + + [MOUSE_DV] = LAYOUT_ergodox( + // left hand + XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_WH_UP, LCTL(DV_X), XXXXXXX, LGUI(DV_X), + LGUI(DV_Z), LCTL(DV_Z), SCTL(DV_C), KC_MS_UP, LCTL(DV_C), KC_MS_BTN4, LGUI(DV_C), + KC_MS_BTN3, KC_MS_WH_LEFT, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_MS_WH_RIGHT, + LGUI(DV_Z), LCTL(DV_Y), SCTL(DV_V), KC_MS_WH_DOWN, LCTL(DV_V), KC_MS_BTN5, LGUI(DV_V), + KC_SLCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + + // left thumb + XXXXXXX, XXXXXXX, + XXXXXXX, + KC_MS_BTN1, KC_MS_BTN2, XXXXXXX, + + // right hand + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, ALL_T(KC_NO), MEH_T(KC_NO), SCMD_T(KC_NO), XXXXXXX, + XXXXXXX, _______, KC_MS_ACCEL1, KC_LSHIFT, KC_LCTRL, KC_MS_ACCEL2, + XXXXXXX, XXXXXXX, XXXXXXX, GUI_T(KC_NO), KC_LALT, KC_RALT, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + + // right thumb + XXXXXXX, XXXXXXX, + XXXXXXX, + XXXXXXX, XXXXXXX, KC_MS_ACCEL0 + ), + + [NUMPAD_DV] = LAYOUT_ergodox( + // left hand + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, GUI_T(KC_NO), XXXXXXX, ALL_T(KC_NO), XXXXXXX, XXXXXXX, + _______, KC_LCTRL, KC_LSHIFT, _______, MEH_T(KC_NO), XXXXXXX, + XXXXXXX, KC_RALT, KC_LALT, XXXXXXX, SCMD_T(KC_NO), XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + + // left thumb + XXXXXXX, XXXXXXX, + KC_HOME, + KC_SPACE, KC_BSPACE, KC_END, + + // right hand + DV_X, DV_A, DV_B, DV_C, DV_D, DV_E, DV_F, + DV_O, DV_I, DV_1, DV_2, DV_3, DV_SLSH, DV_PERC, + DV_M, DV_4, DV_5, DV_6, DV_PLUS, DV_MINS, + DV_L, DV_J, DV_7, DV_8, DV_9, DV_ASTR, DV_CIRC, + DV_DOT, DV_0, DV_COMM, DV_UNDS, DV_BSLS, + + // right thumb + XXXXXXX, XXXXXXX, + KC_PGUP, + KC_PGDOWN, KC_DELETE, KC_ENTER + ), + + [LAYERS_DV] = LAYOUT_ergodox( + // left hand + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, + + // left thumb + XXXXXXX, XXXXXXX, + XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, + + // right hand + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, TO(DVORAK_DV), TO(PLOVER_DV), TO(GAMING_DV), XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + + // right thumb + XXXXXXX, XXXXXXX, + XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX + ), + + [MEDIA_FN] = LAYOUT_ergodox( + // left hand + KC_AUDIO_VOL_DOWN, KC_AUDIO_MUTE, RGB_TOG, XXXXXXX, KC_MAIL, KC_FIND, KC_WWW_REFRESH, + KC_MEDIA_PREV_TRACK, KC_F9, KC_F7, KC_F5, KC_F3, KC_F1, KC_WWW_HOME, + KC_PAUSE, KC_F19, KC_F17, KC_F15, KC_F13, KC_F11, + RGB_HUD, XXXXXXX, XXXXXXX, _______, KC_F23, KC_F21, KC_WWW_BACK, + RGB_VAD, KC_CLCK, KC_PSCREEN, XXXXXXX, MO(FIRMWARE), + + // left thumb + _______, XXXXXXX, + XXXXXXX, + XXXXXXX, XXXXXXX, KC_MEDIA_EJECT, + + // right hand + KC_WWW_FAVORITES, KC_MY_COMPUTER, KC_CALCULATOR, XXXXXXX, RGB_MOD, RGB_M_P, KC_AUDIO_VOL_UP, + KC_WWW_SEARCH, KC_F2, KC_F4, KC_F6, KC_F8, KC_F10, KC_MEDIA_NEXT_TRACK, + KC_F12, KC_F14, KC_F16, KC_F18, KC_F20, KC_MEDIA_PLAY_PAUSE, + KC_WWW_FORWARD, KC_F22, KC_F24, _______, XXXXXXX, XXXXXXX, RGB_HUI, + KC_SYSTEM_POWER, XXXXXXX, KC_SYSTEM_SLEEP, KC_SYSTEM_WAKE, RGB_VAI, + + // right thumb + XXXXXXX, XXXXXXX, + XXXXXXX, + RGB_GREEN, XXXXXXX, XXXXXXX + ), + + [HYPER_FN] = LAYOUT_ergodox( + // left hand + XXXXXXX, HYPR(KC_F1), HYPR(KC_F2), HYPR(KC_F3), HYPR(KC_F4), HYPR(KC_F5), XXXXXXX, + XXXXXXX, HYPR(KC_F6), HYPR(KC_F7), HYPR(KC_F8), HYPR(KC_F9), HYPR(KC_F10), XXXXXXX, + XXXXXXX, HYPR(KC_F11), HYPR(KC_F12), HYPR(KC_F13), HYPR(KC_F14), HYPR(KC_F15), + XXXXXXX, HYPR(KC_F16), HYPR(KC_F17), HYPR(KC_F18), HYPR(KC_F19), HYPR(KC_F20), XXXXXXX, + XXXXXXX, HYPR(KC_F21), HYPR(KC_F22), HYPR(KC_F23), HYPR(KC_F24), + + // left thumb + XXXXXXX, XXXXXXX, + XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, + + // right hand + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + + // right thumb + XXXXXXX, _______, + XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX + ), + + [MEH_FN] = LAYOUT_ergodox( + // left hand + LCA(KC_F11), LCA(KC_F9), LCA(KC_F7), LCA(KC_F5), LCA(KC_F3), LCA(KC_F1), XXXXXXX, + LCAG(KC_F11), LCAG(KC_F9), LCAG(KC_F7), LCAG(KC_F5), LCAG(KC_F3), LCAG(KC_F1), XXXXXXX, + MEH(KC_F11), MEH(KC_F9), MEH(KC_F7), MEH(KC_F5), MEH(KC_F3), MEH(KC_F1), + SGUI(KC_F11), SGUI(KC_F9), SGUI(KC_F7), SGUI(KC_F5), SGUI(KC_F3), SGUI(KC_F1), XXXXXXX, + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + + // left thumb + XXXXXXX, XXXXXXX, + XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, + + // right hand + XXXXXXX, LCA(KC_F2), LCA(KC_F4), LCA(KC_F6), LCA(KC_F8), LCA(KC_F10), LCA(KC_F12), + XXXXXXX, LCAG(KC_F2), LCAG(KC_F4), LCAG(KC_F6), LCAG(KC_F8), LCAG(KC_F10), LCAG(KC_F12), + MEH(KC_F2), MEH(KC_F4), MEH(KC_F6), MEH(KC_F8), MEH(KC_F10), MEH(KC_F12), + XXXXXXX, SGUI(KC_F2), SGUI(KC_F4), SGUI(KC_F6), SGUI(KC_F8), SGUI(KC_F10), SGUI(KC_F12), + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + + // right thumb + XXXXXXX, XXXXXXX, + XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX + ), + + [MEH_FN_PLUS] = LAYOUT_ergodox( + // left hand + LCA(KC_F23), LCA(KC_F21), LCA(KC_F19), LCA(KC_F17), LCA(KC_F15), LCA(KC_F13), XXXXXXX, + LCAG(KC_F23), LCAG(KC_F21), LCAG(KC_F19), LCAG(KC_F17), LCAG(KC_F15), LCAG(KC_F13), XXXXXXX, + MEH(KC_F23), MEH(KC_F21), MEH(KC_F19), MEH(KC_F17), MEH(KC_F15), MEH(KC_F13), + SGUI(KC_F23), SGUI(KC_F21), SGUI(KC_F19), SGUI(KC_F17), SGUI(KC_F15), SGUI(KC_F13), XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + + // left thumb + XXXXXXX, XXXXXXX, + XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, + + // right hand + XXXXXXX, LCA(KC_F14), LCA(KC_F16), LCA(KC_F18), LCA(KC_F20), LCA(KC_F22), LCA(KC_F24), + XXXXXXX, LCAG(KC_F14), LCAG(KC_F16), LCAG(KC_F18), LCAG(KC_F20), LCAG(KC_F22), LCAG(KC_F24), + MEH(KC_F14), MEH(KC_F16), MEH(KC_F18), MEH(KC_F20), MEH(KC_F22), MEH(KC_F24), + XXXXXXX, SGUI(KC_F14), SGUI(KC_F16), SGUI(KC_F18), SGUI(KC_F20), SGUI(KC_F22), SGUI(KC_F24), + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, + + // right thumb + XXXXXXX, XXXXXXX, + XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX + ), + + [FIRMWARE] = LAYOUT_ergodox( + // left hand + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, + + // left thumb + XXXXXXX, XXXXXXX, + XXXXXXX, + RESET, XXXXXXX, XXXXXXX, + + // right hand + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + + // right thumb + XXXXXXX, XXXXXXX, + XXXXXXX, + XXXXXXX, XXXXXXX, EEP_RST + ) +}; + + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case RGB_GREEN: + if (record->event.pressed) { + #ifdef RGBLIGHT_ENABLE + rgblight_enable(); + rgblight_mode(1); + rgblight_sethsv_red(); + #endif + } + + return false; + + case KC_CLCK: + if (record->event.pressed) { + if (!(CAPS_LOCK)) { + ergodox_right_led_1_on(); + CAPS_LOCK = 1; + } else { + ergodox_right_led_1_off(); + CAPS_LOCK = 0; + } + } + + return true; + + case KC_NLCK: + if (record->event.pressed) { + if (!(NUM_LOCK)) { + ergodox_right_led_2_on(); + NUM_LOCK = 1; + } else { + ergodox_right_led_2_off(); + NUM_LOCK = 0; + } + } + + return true; + + case KC_SLCK: + if (record->event.pressed) { + if (!(SCROLL_LOCK)) { + ergodox_right_led_3_on(); + SCROLL_LOCK = 1; + } else { + ergodox_right_led_3_off(); + SCROLL_LOCK = 0; + } + } + + case KC_MS_WH_LEFT: + if (record->event.pressed) { + if (SCROLL_LOCK) { + return false; + } else { + return true; + } + } + + case KC_MS_WH_UP: + if (record->event.pressed) { + if (SCROLL_LOCK) { + return false; + } else { + return true; + } + } + + case KC_MS_WH_DOWN: + if (record->event.pressed) { + if (SCROLL_LOCK) { + return false; + } else { + return true; + } + } + + case KC_MS_WH_RIGHT: + if (record->event.pressed) { + if (SCROLL_LOCK) { + return false; + } else { + return true; + } + } + + default: + return true; + } +} + +uint32_t layer_state_set_user(uint32_t state) { + uint8_t layer = biton32(state); + + switch (layer) { + case DVORAK_US: + rgblight_sethsv_noeeprom_red(); + rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT); + + break; + + case PLOVER_US: + rgblight_sethsv_noeeprom_red(); + rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3); + + break; + + case GAMING_US: + rgblight_sethsv_noeeprom_red(); + rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3); + + break; + + case ARROWS_US: + rgblight_sethsv_noeeprom_blue(); + rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2); + + break; + + case MOUSE_US: + rgblight_sethsv_noeeprom_blue(); + rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2); + + break; + + case NUMPAD_US: + rgblight_sethsv_noeeprom_blue(); + rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2); + + break; + + case LAYERS_US: + rgblight_sethsv_noeeprom_cyan(); + rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2); + + break; + + case DVORAK_DV: + rgblight_sethsv_noeeprom_green(); + rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT); + break; + + case PLOVER_DV: + rgblight_sethsv_noeeprom_green(); + rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3); + + break; + + case GAMING_DV: + rgblight_sethsv_noeeprom_green(); + rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3); + + break; + + case ARROWS_DV: + rgblight_sethsv_noeeprom_blue(); + rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2); + + break; + + case MOUSE_DV: + rgblight_sethsv_noeeprom_blue(); + rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2); + + break; + + case NUMPAD_DV: + rgblight_sethsv_noeeprom_blue(); + rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2); + + break; + + case LAYERS_DV: + rgblight_sethsv_noeeprom_cyan(); + rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2); + + break; + + case MEDIA_FN: + rgblight_sethsv_noeeprom_yellow(); + rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2); + + break; + + case HYPER_FN: + rgblight_sethsv_noeeprom_magenta(); + rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2); + + break; + + case MEH_FN: + rgblight_sethsv_noeeprom_magenta(); + rgblight_mode_noeeprom(RGBLIGHT_MODE_SNAKE + 4); + + break; + + case MEH_FN_PLUS: + rgblight_sethsv_noeeprom_magenta(); + rgblight_mode_noeeprom(RGBLIGHT_MODE_SNAKE + 5); + + break; + + case FIRMWARE: + rgblight_sethsv_noeeprom_pink(); + rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2); + + break; + + default: + break; + } + + return state; +}; diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/package.json b/keyboards/ergodox_ez/keymaps/hacker_dvorak/package.json new file mode 100644 index 000000000..116911e46 --- /dev/null +++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/package.json @@ -0,0 +1,15 @@ +{ + "name": "hacker_dvorak", + "version": "1.0.0", + "description": "Inspired by the [*Programmer Dvorak*](https://www.kaufmann.no/roland/dvorak) keyboard layout, cherry picked ideas from other layouts in the [EZ Repository](https://configure.ergodox-ez.com/search?q=dvorak&legacy=true), a character distribution [heatmap vizualizer](https://run.plnkr.co/plunks/5EEO8nJ2wRzYAfT3), my own subjective use cases and lots of trial and error.", + "main": "gulpfile.js", + "scripts": { + "test": "test" + }, + "author": "SalchiPapa", + "license": "GPL-2.0", + "dependencies": { + "gulp": "^3.9.1", + "gulp-run-command": "0.0.9" + } +} diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/readme.md b/keyboards/ergodox_ez/keymaps/hacker_dvorak/readme.md new file mode 100644 index 000000000..c7df0d748 --- /dev/null +++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/readme.md @@ -0,0 +1,62 @@ +# [Ergodox EZ Hacker Dvorak Layout](https://configure.ergodox-ez.com/layouts/Wadz/latest/0) + +Inspired by the [*Programmer Dvorak*](https://www.kaufmann.no/roland/dvorak) keyboard layout, cherry picked ideas from other layouts in the [EZ Repository](https://configure.ergodox-ez.com/search?q=dvorak&legacy=true), a character distribution [heatmap vizualizer](https://run.plnkr.co/plunks/5EEO8nJ2wRzYAfT3), my own subjective use cases and lots of trial and error. + +## Setup + +Configure your OS keyboard layout to US, or the keymap will be incorrect. + +## Limitations + +I plan to use [QMK](https://docs.qmk.fm) in the future, in order to overcome some limitations of the Ergodox EZ [graphical configurator](https://configure.ergodox-ez.com/layouts/default/latest/0)), however I will defer that, until more progress is made to the new [configurator](https://medium.com/the-ergo/the-configurator-is-out-of-beta-e107aec80cae). + +## Layers + +1. Dvorak + * US Dvorak layout. + * All symbols (including shifted symbols). + * All modifier are dual keys positioned near the home row. +2. Querty + * Used to overcome the limitation pointed above, when your OS layout is set to Dvorak instead of US, this way you can use + Standard Dvorak (available by default on all the main operating systems) on other normal keybdoards and Hacker Dvorak on + the Ergodox EZ Shine at the same time, without changing back and forth tho OS layout. +3. Gaming + * Still in development. + * Left side is mainly "normal" Qwerty. + * Right side is mainly for movement, either using the mouse, the arrow keys, the number pad or the `H`, `J`, `K`, `L` as direction keys. +4. Arrows + * Arrow keys navigation. + * All modifier keys. + * Common text edititng shortcuts (doesn't work for MacOS). +5. Mouse + * Mouse navigation. + * All modifier keys. + * Common text edititng shortcuts (doesn't work for MacOS). +6. Numpad + * ATM style numpad. + * All modifier keys. + * Letters from `A` to `F` for hexadecimal numbers (`B` is also used for binary numeric literals in most programming + languages, ie. `0b11001`). + * `X` for hexadecimal numeric literals in most programming languages, ie. `0xbeef`. + * `O` for octal numeric literals in most programming languages, ie `0o123`. + * `J` for complex numeric literals in Python, ie. `3j`. + * `I` and `M` for complex Julia numeric literals, ie. `3im`. + * Common symbols for mathematical operations. +7. Hyper Fn + * Useful for custom global shortcuts. +8. Media Fn + * Media keys. + * Function keys. + * EZ Shine keys. +9. Meh Fn + * Useful for custom application shortcuts. +10. Meh Fn + + * Useful for custom standard shortcuts. + +## To Do + +Add images. + +*** + +Please comment below if you have any ideas or suggestions. If you have used this layout or used it as a base, I'd love to hear about your experience! \ No newline at end of file diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/rules.mk b/keyboards/ergodox_ez/keymaps/hacker_dvorak/rules.mk new file mode 100644 index 000000000..4aa2f262b --- /dev/null +++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/rules.mk @@ -0,0 +1,35 @@ +# Set any rules.mk overrides for your specific keymap here. +# See rules at https://docs.qmk.fm/#/config_options?id=the-rulesmk-file +NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +TAP_DANCE_ENABLE = yes +MOUSEKEY_ENABLE = yes # Mouse keys(+4700b). +EXTRAKEY_ENABLE = yes # Audio control and System control(+450b). +SLEEP_LED_ENABLE = yes # Turn off leds when computer is sleeping. +KEY_LOCK_ENABLE = yes # (+1730b) +RGBLIGHT_ENABLE = yes +LEADER_ENABLE = yes + + +UNICODE_ENABLE = no # For Unicode. +COMMAND_ENABLE = no # Commands for debug and configuration +SWAP_HANDS_ENABLE = no # Allow swapping hands of keyboard. + + +# This are by default off: +# CONSOLE_ENABLE = no # Console for debug(+400) +# BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +# API_SYSEX_ENABLE = no +# MIDI_ENABLE = no +# UNICODEMAP_ENABLE = no +# BLUETOOTH_ENABLE = no +# AUDIO_ENABLE = no +# FAUXCLICKY_ENABLE = no +# VARIABLE_TRACE = no +# BACKLIGHT_ENABLE = no +# RGB_MATRIX_ENABLE = no +# COMBO_ENABLE = no + + +# This don't need argument: +# CUSTOM_MATRIX # Custom matrix file for the ErgoDox EZ +# SPLIT_KEYBOARD diff --git a/quantum/keymap_extras/keymap_plover_dvorak.h b/quantum/keymap_extras/keymap_plover_dvorak.h new file mode 100644 index 000000000..83bb1e8b8 --- /dev/null +++ b/quantum/keymap_extras/keymap_plover_dvorak.h @@ -0,0 +1,47 @@ +/* Copyright 2016 James Kay + * + * 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 . + */ +#ifndef KEYMAP_PLOVER_DVORAK_H +#define KEYMAP_PLOVER_DVORAK_H + +#include "keymap_dvorak.h" + +#define PD_NUM DV_1 +#define PD_LS DV_Q +#define PD_LT DV_W +#define PD_LP DV_E +#define PD_LH DV_R +#define PD_LK DV_S +#define PD_LW DV_D +#define PD_LR DV_F + +#define PD_STAR DV_Y +#define PD_RF DV_U +#define PD_RP DV_I +#define PD_RL DV_O +#define PD_RT DV_P +#define PD_RD DV_LBRC +#define PD_RR DV_J +#define PD_RB DV_K +#define PD_RG DV_L +#define PD_RS DV_SCLN +#define PD_RZ DV_QUOT + +#define PD_A DV_C +#define PD_O DV_V +#define PD_E DV_N +#define PD_U DV_M + +#endif From 86a7687a87a3b296ff2b823f12b971bd581b0708 Mon Sep 17 00:00:00 2001 From: Vyolle <44031868+Vyolle@users.noreply.github.com> Date: Wed, 5 Dec 2018 10:19:14 -0600 Subject: [PATCH 612/788] Major revisions, focused on streamlining and useability (#4554) --- .../keymaps/{vyolle_steno => vyolle}/config.h | 12 +++- .../keymaps/{vyolle_steno => vyolle}/keymap.c | 70 +++++-------------- .../keymaps/{vyolle_steno => vyolle}/rules.mk | 4 +- 3 files changed, 31 insertions(+), 55 deletions(-) rename keyboards/iris/keymaps/{vyolle_steno => vyolle}/config.h (80%) rename keyboards/iris/keymaps/{vyolle_steno => vyolle}/keymap.c (67%) rename keyboards/iris/keymaps/{vyolle_steno => vyolle}/rules.mk (58%) diff --git a/keyboards/iris/keymaps/vyolle_steno/config.h b/keyboards/iris/keymaps/vyolle/config.h similarity index 80% rename from keyboards/iris/keymaps/vyolle_steno/config.h rename to keyboards/iris/keymaps/vyolle/config.h index 9cbc148e4..1adbd65b5 100644 --- a/keyboards/iris/keymaps/vyolle_steno/config.h +++ b/keyboards/iris/keymaps/vyolle/config.h @@ -23,7 +23,7 @@ along with this program. If not, see . // #define USE_SERIAL -#define FORCE_NKRO //For Steno. +#define FORCE_NKRO //Cause it's suprisingly handy. /* Select hand configuration */ @@ -32,3 +32,13 @@ along with this program. If not, see . // #define EE_HANDS +#define MOUSEKEY_INTERVAL 16 + +#define MOUSEKEY_DELAY 0 + +#define MOUSEKEY_TIME_TO_MAX 60 + +#define MOUSEKEY_MAX_SPEED 7 + +#define MOUSEKEY_WHEEL_DELAY 0 + diff --git a/keyboards/iris/keymaps/vyolle_steno/keymap.c b/keyboards/iris/keymaps/vyolle/keymap.c similarity index 67% rename from keyboards/iris/keymaps/vyolle_steno/keymap.c rename to keyboards/iris/keymaps/vyolle/keymap.c index 3ad117655..66bcaa385 100644 --- a/keyboards/iris/keymaps/vyolle_steno/keymap.c +++ b/keyboards/iris/keymaps/vyolle/keymap.c @@ -1,12 +1,10 @@ #include QMK_KEYBOARD_H -#include "keymap_steno.h" extern keymap_config_t keymap_config; #define _QWERTY 0 #define _LOWER 1 #define _RAISE 2 -#define _PLOVER 3 #define _ADJUST 4 enum custom_keycodes { @@ -14,88 +12,68 @@ enum custom_keycodes { LOWER, RAISE, ADJUST, - PLOVER, - EXT_PLV, }; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_QWERTY] = LAYOUT( //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, PLOVER, + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_QUOT, //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ - RAISE, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT, KC_RBRC, + KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_RSFT, //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_BSPC, KC_RSFT, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LGUI, + KC_LGUI, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LALT, KC_RALT, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RGUI, //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ - KC_LCTL, LOWER, KC_SPC, KC_BSPC, KC_ENT, KC_LALT + KC_LCTL, LOWER, KC_SPC, KC_ENT, RAISE, KC_RCTL // └────────┴────────┴────────┘ └────────┴────────┴────────┘ ), [_LOWER] = LAYOUT( //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ - KC_DEL, KC_0, KC_9, KC_8, KC_7, KC_6, _______, _______, _______, _______, _______, _______, + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, XXXXXXX, KC_ACL0, KC_ACL1, KC_ACL2, XXXXXXX, XXXXXXX, //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ - KC_SCLN, KC_P, KC_O, KC_I, KC_U, KC_Y, _______, _______, _______, _______, _______, _______, + KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ - _______, KC_QUOT, KC_L, KC_K, KC_J, KC_H, _______, KC_LEFT, KC_UP, KC_RGHT, KC_SCLN, _______, + KC_VOLU, KC_HOME, KC_LEFT, KC_UP, KC_RGHT, KC_PGUP, KC_WH_U, KC_MS_L, KC_MS_U, KC_MS_R, XXXXXXX, KC_BTN4, //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ - KC_ENT, KC_SLSH, KC_DOT, KC_COMM, KC_M, KC_N, KC_LALT, _______, _______, _______, KC_DOWN, _______, _______, _______, + KC_VOLD, KC_END, KC_INS, KC_DOWN, KC_DEL, KC_PGDN, KC_MUTE, XXXXXXX, KC_WH_D, KC_WH_L, KC_MS_D, KC_WH_R, XXXXXXX, KC_BTN5, //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ - _______, _______, KC_LGUI, _______, _______, _______ + _______, _______, _______, KC_BTN1, KC_BTN2, KC_BTN3 // └────────┴────────┴────────┘ └────────┴────────┴────────┘ ), [_RAISE] = LAYOUT( //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ - KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, _______, _______, _______, _______, _______, _______, + KC_GRAVE,_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ - KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, _______, + KC_TILD, KC_PIPE, KC_LT, KC_GT, _______, _______, _______, _______, _______, _______, _______, _______, //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ - _______, KC_VOLU, KC_LEFT, KC_UP, KC_RGHT, KC_INS, _______, _______, _______, _______, _______, _______, + KC_BSLASH,KC_LCBR, KC_RCBR, KC_MINUS, KC_LBRC, KC_RBRC, _______, _______, _______, _______, _______, _______, //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ - KC_MUTE, KC_VOLD, KC_PGUP, KC_DOWN, KC_PGDN, KC_DEL, _______, _______, _______, _______, _______, _______, _______, _______, + KC_COLN, KC_UNDS, KC_LPRN, KC_PLUS, KC_RPRN, KC_EQL, KC_UNDO, _______, _______, _______, _______, _______, _______, _______, //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ - _______, _______, KC_LALT, _______, _______, _______ + KC_CUT, KC_COPY, KC_PSTE, _______, _______, _______ // └────────┴────────┴────────┘ └────────┴────────┴────────┘ ), [_ADJUST] = LAYOUT( //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ - KC_GRV, KC_HOME, KC_LBRC, KC_RBRC, KC_PIPE, KC_APP, KC_SLCK, _______, _______, _______, _______, _______, + _______, _______, KC_CAPS, KC_MENU, KC_APP, KC_PSCR, _______, _______, _______, _______, _______, _______, //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ - KC_PSCR, KC_END, KC_LCBR, KC_RCBR, KC_PLUS, KC_EQL, KC_PAUS, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, KC_PAUS, _______, _______, _______, _______, _______, _______, //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ - _______, _______, _______, KC_BSLS, KC_MINS, KC_UNDS, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, KC_SLCK, _______, _______, _______, _______, _______, _______, //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ _______, _______, _______, _______, _______, _______ // └────────┴────────┴────────┘ └────────┴────────┴────────┘ ), - - [_PLOVER] = LAYOUT( - //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ - STN_PWR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, EXT_PLV, - //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ - STN_N1, STN_N2, STN_N3, STN_N4, STN_N5, STN_N6, STN_N7, STN_N8, STN_N9, STN_NA, STN_NB, STN_NC, - //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ - STN_FN, STN_S1, STN_TL, STN_PL, STN_HL, STN_ST1, STN_ST3, STN_FR, STN_PR, STN_LR, STN_TR, STN_DR, - //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ - XXXXXXX, STN_S2, STN_KL, STN_WL, STN_RL, STN_ST2, STN_RE1, STN_RE2, STN_ST4, STN_RR, STN_BR, STN_GR, STN_SR, STN_ZR, - //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ - XXXXXXX, STN_A, STN_O, STN_E, STN_U, XXXXXXX - // └────────┴────────┴────────┘ └────────┴────────┴────────┘ - ) }; -void matrix_init_user() { - steno_set_mode(STENO_MODE_GEMINI); // or STENO_MODE_BOLT -} - bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch (keycode) { case QWERTY: @@ -132,18 +110,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } return false; break; - case PLOVER: - if (!record->event.pressed) { - layer_on(_PLOVER); - } - return false; - break; - case EXT_PLV: - if (record->event.pressed) { - layer_off(_PLOVER); - } - return false; - break; } return true; } diff --git a/keyboards/iris/keymaps/vyolle_steno/rules.mk b/keyboards/iris/keymaps/vyolle/rules.mk similarity index 58% rename from keyboards/iris/keymaps/vyolle_steno/rules.mk rename to keyboards/iris/keymaps/vyolle/rules.mk index ebe1c86a0..e7cbfb83d 100644 --- a/keyboards/iris/keymaps/vyolle_steno/rules.mk +++ b/keyboards/iris/keymaps/vyolle/rules.mk @@ -1,6 +1,6 @@ EXTRAKEY_ENABLE = yes # Disable if you run out of usb endpoints. Media keys need this to work. -MOUSEKEY_ENABLE = no # Mouse keys(+4700) Uses extra usb endpoints. -STENO_ENABLE = yes # Additional protocols for Stenography(+1700), requires VIRTSER. +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) Uses extra usb endpoints. +STENO_ENABLE = no # Additional protocols for Stenography(+1700), requires VIRTSER. AUDIO_ENABLE = no # Audio output on port C6 MIDI_ENABLE = no # MIDI controls NKRO_ENABLE = yes From 20130e010badad1968762439e66c71dc4b0760a1 Mon Sep 17 00:00:00 2001 From: zvecr Date: Wed, 5 Dec 2018 16:36:31 +0000 Subject: [PATCH 613/788] Keyboard: Initial nori port (#4542) * Initial nori port * ortho_4x4 layout and RGB fixes * Review fixes for superseded audio and default layer functionality --- keyboards/40percentclub/nori/config.h | 221 ++++++++++++++++++ keyboards/40percentclub/nori/info.json | 117 ++++++++++ .../nori/keymaps/default/config.h | 23 ++ .../nori/keymaps/default/keymap.c | 159 +++++++++++++ .../nori/keymaps/default/readme.md | 1 + .../40percentclub/nori/keymaps/macro/config.h | 21 ++ .../40percentclub/nori/keymaps/macro/keymap.c | 41 ++++ .../nori/keymaps/macro/readme.md | 1 + keyboards/40percentclub/nori/nori.c | 43 ++++ keyboards/40percentclub/nori/nori.h | 69 ++++++ keyboards/40percentclub/nori/readme.md | 18 ++ keyboards/40percentclub/nori/rules.mk | 82 +++++++ 12 files changed, 796 insertions(+) create mode 100644 keyboards/40percentclub/nori/config.h create mode 100644 keyboards/40percentclub/nori/info.json create mode 100644 keyboards/40percentclub/nori/keymaps/default/config.h create mode 100644 keyboards/40percentclub/nori/keymaps/default/keymap.c create mode 100644 keyboards/40percentclub/nori/keymaps/default/readme.md create mode 100644 keyboards/40percentclub/nori/keymaps/macro/config.h create mode 100644 keyboards/40percentclub/nori/keymaps/macro/keymap.c create mode 100644 keyboards/40percentclub/nori/keymaps/macro/readme.md create mode 100644 keyboards/40percentclub/nori/nori.c create mode 100644 keyboards/40percentclub/nori/nori.h create mode 100644 keyboards/40percentclub/nori/readme.md create mode 100644 keyboards/40percentclub/nori/rules.mk diff --git a/keyboards/40percentclub/nori/config.h b/keyboards/40percentclub/nori/config.h new file mode 100644 index 000000000..9232344bf --- /dev/null +++ b/keyboards/40percentclub/nori/config.h @@ -0,0 +1,221 @@ +/* Copyright 2018 + * + * 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 . + */ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0A0C +#define DEVICE_VER 0x0444 +#define MANUFACTURER di0ib +#define PRODUCT The nori Keyboard +#define DESCRIPTION A modular compact keyboard + +/* key matrix size */ +#define MATRIX_ROWS 4 +#define MATRIX_COLS 12 + +/* + * 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 { D3, D2, D1, D0 } +#define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3, B2, B6, D4, C6, D7, E6 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +#define BACKLIGHT_PIN B5 +//#define BACKLIGHT_BREATHING +#define BACKLIGHT_LEVELS 3 + +// enable RGB underglow +#define RGB_DI_PIN B4 +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 10 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* 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 userful 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 + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * 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 + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +//#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ diff --git a/keyboards/40percentclub/nori/info.json b/keyboards/40percentclub/nori/info.json new file mode 100644 index 000000000..db0d6aaad --- /dev/null +++ b/keyboards/40percentclub/nori/info.json @@ -0,0 +1,117 @@ +{ + "keyboard_name": "nori", + "url": "", + "maintainer": "qmk", + "width": 12, + "height": 4, + "layouts": { + "LAYOUT_ortho_4x4": { + "key_count": 16, + "layout": [ + { "w": 1, "x": 0, "y": 0 }, + { "w": 1, "x": 1, "y": 0 }, + { "w": 1, "x": 2, "y": 0 }, + { "w": 1, "x": 3, "y": 0 }, + { "w": 1, "x": 0, "y": 1 }, + { "w": 1, "x": 1, "y": 1 }, + { "w": 1, "x": 2, "y": 1 }, + { "w": 1, "x": 3, "y": 1 }, + { "w": 1, "x": 0, "y": 2 }, + { "w": 1, "x": 1, "y": 2 }, + { "w": 1, "x": 2, "y": 2 }, + { "w": 1, "x": 3, "y": 2 }, + { "w": 1, "x": 0, "y": 3 }, + { "w": 1, "x": 1, "y": 3 }, + { "w": 1, "x": 2, "y": 3 }, + { "w": 1, "x": 3, "y": 3 } ] + }, + "LAYOUT_ortho_4x8": { + "key_count": 32, + "layout": [ + { "w": 1, "x": 0, "y": 0 }, + { "w": 1, "x": 1, "y": 0 }, + { "w": 1, "x": 2, "y": 0 }, + { "w": 1, "x": 3, "y": 0 }, + { "w": 1, "x": 4, "y": 0 }, + { "w": 1, "x": 5, "y": 0 }, + { "w": 1, "x": 6, "y": 0 }, + { "w": 1, "x": 7, "y": 0 }, + { "w": 1, "x": 0, "y": 1 }, + { "w": 1, "x": 1, "y": 1 }, + { "w": 1, "x": 2, "y": 1 }, + { "w": 1, "x": 3, "y": 1 }, + { "w": 1, "x": 4, "y": 1 }, + { "w": 1, "x": 5, "y": 1 }, + { "w": 1, "x": 6, "y": 1 }, + { "w": 1, "x": 7, "y": 1 }, + { "w": 1, "x": 0, "y": 2 }, + { "w": 1, "x": 1, "y": 2 }, + { "w": 1, "x": 2, "y": 2 }, + { "w": 1, "x": 3, "y": 2 }, + { "w": 1, "x": 4, "y": 2 }, + { "w": 1, "x": 5, "y": 2 }, + { "w": 1, "x": 6, "y": 2 }, + { "w": 1, "x": 7, "y": 2 }, + { "w": 1, "x": 0, "y": 3 }, + { "w": 1, "x": 1, "y": 3 }, + { "w": 1, "x": 2, "y": 3 }, + { "w": 1, "x": 3, "y": 3 }, + { "w": 1, "x": 4, "y": 3 }, + { "w": 1, "x": 5, "y": 3 }, + { "w": 1, "x": 6, "y": 3 }, + { "w": 1, "x": 7, "y": 3 } ] + }, + "LAYOUT_ortho_4x12": { + "key_count": 48, + "layout": [ + { "w": 1, "x": 0, "y": 0 }, + { "w": 1, "x": 1, "y": 0 }, + { "w": 1, "x": 2, "y": 0 }, + { "w": 1, "x": 3, "y": 0 }, + { "w": 1, "x": 4, "y": 0 }, + { "w": 1, "x": 5, "y": 0 }, + { "w": 1, "x": 6, "y": 0 }, + { "w": 1, "x": 7, "y": 0 }, + { "w": 1, "x": 8, "y": 0 }, + { "w": 1, "x": 9, "y": 0 }, + { "w": 1, "x": 10, "y": 0 }, + { "w": 1, "x": 11, "y": 0 }, + { "w": 1, "x": 0, "y": 1 }, + { "w": 1, "x": 1, "y": 1 }, + { "w": 1, "x": 2, "y": 1 }, + { "w": 1, "x": 3, "y": 1 }, + { "w": 1, "x": 4, "y": 1 }, + { "w": 1, "x": 5, "y": 1 }, + { "w": 1, "x": 6, "y": 1 }, + { "w": 1, "x": 7, "y": 1 }, + { "w": 1, "x": 8, "y": 1 }, + { "w": 1, "x": 9, "y": 1 }, + { "w": 1, "x": 10, "y": 1 }, + { "w": 1, "x": 11, "y": 1 }, + { "w": 1, "x": 0, "y": 2 }, + { "w": 1, "x": 1, "y": 2 }, + { "w": 1, "x": 2, "y": 2 }, + { "w": 1, "x": 3, "y": 2 }, + { "w": 1, "x": 4, "y": 2 }, + { "w": 1, "x": 5, "y": 2 }, + { "w": 1, "x": 6, "y": 2 }, + { "w": 1, "x": 7, "y": 2 }, + { "w": 1, "x": 8, "y": 2 }, + { "w": 1, "x": 9, "y": 2 }, + { "w": 1, "x": 10, "y": 2 }, + { "w": 1, "x": 11, "y": 2 }, + { "w": 1, "x": 0, "y": 3 }, + { "w": 1, "x": 1, "y": 3 }, + { "w": 1, "x": 2, "y": 3 }, + { "w": 1, "x": 3, "y": 3 }, + { "w": 1, "x": 4, "y": 3 }, + { "w": 1, "x": 5, "y": 3 }, + { "w": 1, "x": 6, "y": 3 }, + { "w": 1, "x": 7, "y": 3 }, + { "w": 1, "x": 8, "y": 3 }, + { "w": 1, "x": 9, "y": 3 }, + { "w": 1, "x": 10, "y": 3 }, + { "w": 1, "x": 11, "y": 3 } ] + } + } +} diff --git a/keyboards/40percentclub/nori/keymaps/default/config.h b/keyboards/40percentclub/nori/keymaps/default/config.h new file mode 100644 index 000000000..90831ff34 --- /dev/null +++ b/keyboards/40percentclub/nori/keymaps/default/config.h @@ -0,0 +1,23 @@ +/* Copyright 2018 + * + * 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 . + */ + +#pragma once + +// place overrides here +#define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \ + SONG(COLEMAK_SOUND), \ + SONG(DVORAK_SOUND) \ + } diff --git a/keyboards/40percentclub/nori/keymaps/default/keymap.c b/keyboards/40percentclub/nori/keymaps/default/keymap.c new file mode 100644 index 000000000..3c225a0d9 --- /dev/null +++ b/keyboards/40percentclub/nori/keymaps/default/keymap.c @@ -0,0 +1,159 @@ +#include QMK_KEYBOARD_H + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _LOWER 3 +#define _RAISE 4 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, +}; + +#define LOWER MO(_LOWER) +#define RAISE MO(_RAISE) +#define ADJUST MO(_ADJUST) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Adjust| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = LAYOUT_ortho_4x12( + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ + ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Colemak + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | R | S | T | D | H | N | E | I | O | ' | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_COLEMAK] = LAYOUT_ortho_4x12( \ + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, \ + KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ + ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Dvorak + * ,-----------------------------------------------------------------------------------. + * | Tab | ' | , | . | P | Y | F | G | C | R | L | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | O | E | U | I | D | H | T | N | S | / | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_DVORAK] = LAYOUT_ortho_4x12( \ + KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, \ + KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, \ + KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT , \ + ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT_ortho_4x12( \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT_ortho_4x12( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | Reset| | | | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = LAYOUT_ortho_4x12( \ + _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ + _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ +) + + +}; + +uint32_t layer_state_set_user(uint32_t state) { + return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + } + return false; + case COLEMAK: + if (record->event.pressed) { + set_single_persistent_default_layer(_COLEMAK); + } + return false; + case DVORAK: + if (record->event.pressed) { + set_single_persistent_default_layer(_DVORAK); + } + return false; + } + return true; +} diff --git a/keyboards/40percentclub/nori/keymaps/default/readme.md b/keyboards/40percentclub/nori/keymaps/default/readme.md new file mode 100644 index 000000000..4a55a35e4 --- /dev/null +++ b/keyboards/40percentclub/nori/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap diff --git a/keyboards/40percentclub/nori/keymaps/macro/config.h b/keyboards/40percentclub/nori/keymaps/macro/config.h new file mode 100644 index 000000000..03f34d3f5 --- /dev/null +++ b/keyboards/40percentclub/nori/keymaps/macro/config.h @@ -0,0 +1,21 @@ +/* Copyright 2018 + * + * 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 . + */ + +#pragma once + +// place overrides here +#undef RGBLED_NUM +#define RGBLED_NUM 4 diff --git a/keyboards/40percentclub/nori/keymaps/macro/keymap.c b/keyboards/40percentclub/nori/keymaps/macro/keymap.c new file mode 100644 index 000000000..14dc0b678 --- /dev/null +++ b/keyboards/40percentclub/nori/keymaps/macro/keymap.c @@ -0,0 +1,41 @@ +/* Copyright 2018 + * + * 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 . + */ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_ortho_4x4( /* Base */ + KC_INT1, KC_INT2, KC_INT3, KC_INT5, \ + KC_F13, KC_F14, KC_F15, KC_F16, \ + KC_F17, KC_F18, KC_F19, KC_F20, \ + KC_F21, KC_F22, KC_F23, KC_F24 \ + ), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/40percentclub/nori/keymaps/macro/readme.md b/keyboards/40percentclub/nori/keymaps/macro/readme.md new file mode 100644 index 000000000..de2324248 --- /dev/null +++ b/keyboards/40percentclub/nori/keymaps/macro/readme.md @@ -0,0 +1 @@ +# The default single board macro keymap for nori diff --git a/keyboards/40percentclub/nori/nori.c b/keyboards/40percentclub/nori/nori.c new file mode 100644 index 000000000..9d27df7a5 --- /dev/null +++ b/keyboards/40percentclub/nori/nori.c @@ -0,0 +1,43 @@ +/* Copyright 2018 + * + * 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 . + */ +#include "nori.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + + led_set_user(usb_led); +} diff --git a/keyboards/40percentclub/nori/nori.h b/keyboards/40percentclub/nori/nori.h new file mode 100644 index 000000000..802f0bfce --- /dev/null +++ b/keyboards/40percentclub/nori/nori.h @@ -0,0 +1,69 @@ +/* Copyright 2018 + * + * 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 . + */ +#pragma once + +#include "quantum.h" +#define ___ KC_NO + +#define LAYOUT_ortho_4x4( \ + K00, K01, K02, K03, \ + K10, K11, K12, K13, \ + K20, K21, K22, K23, \ + K30, K31, K32, K33 \ +) \ +{ \ + { K00, K01, K02, K03, ___, ___, ___, ___, ___, ___, ___, ___ }, \ + { K10, K11, K12, K13, ___, ___, ___, ___, ___, ___, ___, ___ }, \ + { K20, K21, K22, K23, ___, ___, ___, ___, ___, ___, ___, ___ }, \ + { K30, K31, K32, K33, ___, ___, ___, ___, ___, ___, ___, ___ } \ +} +#define LAYOUT_ortho_4x8( \ + K00, K01, K02, K03, K04, K05, K06, K07, \ + K10, K11, K12, K13, K14, K15, K16, K17, \ + K20, K21, K22, K23, K24, K25, K26, K27, \ + K30, K31, K32, K33, K34, K35, K36, K37\ +) \ +{ \ + { K00, K01, K02, K03, K04, K05, K06, K07, ___, ___, ___, ___ }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, ___, ___, ___, ___ }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, ___, ___, ___, ___ }, \ + { K30, K31, K32, K33, K34, K35, K35, K37, ___, ___, ___, ___ } \ +} +#define LAYOUT_ortho_4x12( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0a, K0b, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1a, K1b, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2a, K2b, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3a, K3b \ +) \ +{ \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0a, K0b }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1a, K1b }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2a, K2b }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3a, K3b } \ +} + +#define LAYOUT_kc_ortho_4x12( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0a, K0b, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1a, K1b, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2a, K2b, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3a, K3b \ +) \ +{ \ + { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, KC_##K09, KC_##K0a, KC_##K0b }, \ + { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, KC_##K19, KC_##K1a, KC_##K1b }, \ + { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27, KC_##K28, KC_##K29, KC_##K2a, KC_##K2b }, \ + { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, KC_##K38, KC_##K39, KC_##K3a, KC_##K3b } \ +} diff --git a/keyboards/40percentclub/nori/readme.md b/keyboards/40percentclub/nori/readme.md new file mode 100644 index 000000000..3dd8afff4 --- /dev/null +++ b/keyboards/40percentclub/nori/readme.md @@ -0,0 +1,18 @@ +# nori + +![nori](https://2.bp.blogspot.com/-UBFz3c1-8hM/W48N0ynt6TI/AAAAAAACSQg/MHLY-DchBBMiiHUeIPVt_4T6x-ntmdjgwCEwYBhgL/s640/a.jpg) +=== + +A 4x12 matrix using 3 modular 4x4 matrix boards and powered by a Pro Micro. + +this one is using a Pro Micro. The Pro Micro has less data pins available so only 3 boards can be connected instead of 4. There are 2 pins left over, I used one (B5) for a backlight circuit like on a Gherkin. The other data pin (B4) is left for possible use with a WS2812B strip. + +Keyboard Maintainer: QMK Community +Hardware Supported: nori PCB +Hardware Availability: [nori project on 40% Keyboards](https://www.40percent.club/2018/10/nori.html) + +Make example for this keyboard (after setting up your build environment): + + make 40percentclub/nori:default + +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). diff --git a/keyboards/40percentclub/nori/rules.mk b/keyboards/40percentclub/nori/rules.mk new file mode 100644 index 000000000..f52135379 --- /dev/null +++ b/keyboards/40percentclub/nori/rules.mk @@ -0,0 +1,82 @@ +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = caterina + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = yes # USB Nkey Rollover +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) + +LAYOUTS = ortho_4x4 ortho_4x8 ortho_4x12 From 0677e64655f230722eaa35160acaefacf3684a43 Mon Sep 17 00:00:00 2001 From: wanleg <32079073+wanleg@users.noreply.github.com> Date: Wed, 5 Dec 2018 08:42:50 -0800 Subject: [PATCH 614/788] Keymap: Wanleg layout updates (#4550) * config fixes (including for issue #3678) * put back audio * jj40 backlighting setup * jj40 backlighting setup * rules.mk fix * jj40 backlighting settings * iris setup * iris setup * iris setup * iris setup * iris setup - onehand * remove commented-out section * edits due to #4403 * xd75 testing * fix 5x15 layout issues with 5x5 bluetooth & xd75 * commenting out unused placeholders * change iris to more wanleg-like 4x12 layout * formatting changes * onehand layout cleanup/fix * revert temp change --- keyboards/iris/keymaps/wanleg/config.h | 33 +++++++++ keyboards/iris/keymaps/wanleg/keymap.c | 76 ++++++++++++++++++++ keyboards/iris/keymaps/wanleg/rules.mk | 5 ++ layouts/community/ortho_4x12/wanleg/config.h | 13 +++- layouts/community/ortho_4x12/wanleg/keymap.c | 17 ++++- layouts/community/ortho_4x12/wanleg/rules.mk | 16 ++--- layouts/community/ortho_5x15/wanleg/config.h | 2 +- layouts/community/ortho_5x15/wanleg/keymap.c | 49 ++++++------- layouts/community/ortho_5x15/wanleg/rules.mk | 19 ++--- users/wanleg/config.h | 12 ++-- users/wanleg/rules.mk | 10 ++- users/wanleg/tapdances.c | 4 +- users/wanleg/wanleg.h | 18 +++-- 13 files changed, 208 insertions(+), 66 deletions(-) create mode 100644 keyboards/iris/keymaps/wanleg/config.h create mode 100644 keyboards/iris/keymaps/wanleg/keymap.c create mode 100644 keyboards/iris/keymaps/wanleg/rules.mk diff --git a/keyboards/iris/keymaps/wanleg/config.h b/keyboards/iris/keymaps/wanleg/config.h new file mode 100644 index 000000000..9b9000768 --- /dev/null +++ b/keyboards/iris/keymaps/wanleg/config.h @@ -0,0 +1,33 @@ +/* +Copyright 2017 Danny Nguyen + +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 . +*/ + +#pragma once + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +#undef USE_I2C + +/* Select hand configuration */ + +// #define MASTER_LEFT +// #define MASTER_RIGHT +#define EE_HANDS + +#define QMK_ESC_OUTPUT F6 // usually COL +#define QMK_ESC_INPUT D7 // usually ROW +#define QMK_LED B0 diff --git a/keyboards/iris/keymaps/wanleg/keymap.c b/keyboards/iris/keymaps/wanleg/keymap.c new file mode 100644 index 000000000..6f8ff9066 --- /dev/null +++ b/keyboards/iris/keymaps/wanleg/keymap.c @@ -0,0 +1,76 @@ + +#include QMK_KEYBOARD_H +#include "wanleg.h" + + +#define LAYOUT_iris_base( \ + K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, \ + K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, \ + K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, \ + K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C \ + ) \ + LAYOUT_wrapper( \ + K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, \ + K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, \ + K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, \ + K31, K32, K33, K34, K35, K36, _______, _______, K37, K38, K39, K3A, K3B, K3C, \ + _______, _______, _______, _______, _______, _______ \ + ) +#define LAYOUT_iris_base_wrapper(...) LAYOUT_iris_base(__VA_ARGS__) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_GK] = LAYOUT_iris_base_wrapper( + _______________GherkinLike_0_______________, + _______________GherkinLike_1_______________, + _______________GherkinLike_2_______________, + _______________GherkinLike_3_OneHand_______ + ), + [ONE] = LAYOUT_wrapper( + _______________Qwerty_Row__0_______________, + _______________Qwerty_Row__1_______________, + _______________Qwerty_Row__2_______________, + KC_LCTL, KC_LGUI, KC_LALT, GHERKIN, SUBTER, SH_T(KC_SPC), _______, _______, SH_T(KC_SPC), SUPRA, KC_RGUI, KC_RALT, GHERKIN, KC_RCTL, + _______, _______, _______, _______, _______, _______ + ), + [SUP] = LAYOUT_iris_base_wrapper( + ________________SUPRA_Row_0________________, + ________________SUPRA_Row_1________________, + ________________SUPRA_Row_2________________, + ________________SUPRA_Row_3________________ + ), + [SUB] = LAYOUT_iris_base_wrapper( + _______________SUBTER_Row__0_______________, + _______________SUBTER_Row__1_______________, + _______________SUBTER_Row__2_______________, + _______________SUBTER_Row__3_______________ + ), + [NUM] = LAYOUT_iris_base_wrapper( + _______________NUMBERS_Row_0_______________, + _______________NUMBERS_Row_1_______________, + _______________NUMBERS_Row_2_______________, + _______________NUMBERS_Row_3_______________ + ), + [DIR] = LAYOUT_iris_base_wrapper( + _____________DIRECTIONS_Row__0_____________, + _____________DIRECTIONS_Row__1_____________, + _____________DIRECTIONS_Row__2_____________, + _______, _______, ONEHAND, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + [ETC] = LAYOUT_iris_base_wrapper( + ______________ETCETERA_Row__0______________, + ______________ETCETERA_Row__1______________, + ______________ETCETERA_Row__2______________, + ______________ETCETERA_Row__3______________ + ) + +}; + + +void matrix_init_keymap(void) { + DDRD &= ~(1<<5); + PORTD &= ~(1<<5); + + DDRB &= ~(1<<0); + PORTB &= ~(1<<0); +} diff --git a/keyboards/iris/keymaps/wanleg/rules.mk b/keyboards/iris/keymaps/wanleg/rules.mk new file mode 100644 index 000000000..bbb05a5b4 --- /dev/null +++ b/keyboards/iris/keymaps/wanleg/rules.mk @@ -0,0 +1,5 @@ +RGBLIGHT_ENABLE = no +BACKLIGHT_ENABLE = no + +SWAP_HANDS_ENABLE = yes +BOOTLOADER = qmk-dfu diff --git a/layouts/community/ortho_4x12/wanleg/config.h b/layouts/community/ortho_4x12/wanleg/config.h index 2b2072db2..f7650ddd3 100644 --- a/layouts/community/ortho_4x12/wanleg/config.h +++ b/layouts/community/ortho_4x12/wanleg/config.h @@ -1,5 +1,14 @@ #pragma once +#if defined(KEYBOARD_jj40) +#undef BACKLIGHT_BREATHING +#undef BACKLIGHT_LEVELS +#undef BREATHING_PERIOD +#define BACKLIGHT_BREATHING +#define BACKLIGHT_LEVELS 3 +#define BREATHING_PERIOD 15 +#endif + //QMK DFU settings (ProMicro boards with QMK bootloader) // set top left key as bootloader mode escape key on Lets Split rev2 #if defined(KEYBOARD_lets_split_rev2) @@ -12,7 +21,7 @@ #endif // set top left key as bootloader mode escape key on 4x4 48key layout -#if defined(KEYBOARD_4x4) && !defined(PRO_MICRO) +#if defined(KEYBOARD_40percentclub_4x4) && !defined(PRO_MICRO) #define QMK_LED B0 #define QMK_ESC_OUTPUT C6 // usually COL #define QMK_ESC_INPUT B2 // usually ROW @@ -20,7 +29,7 @@ // use alternate settings for 4x4 board using ProMicro instead of Micro // usage: make 4x4:wanleg PM=yes -#if defined(KEYBOARD_4x4) && defined(PRO_MICRO) +#if defined(KEYBOARD_40percentclub_4x4) && defined(PRO_MICRO) #define QMK_ESC_OUTPUT F4 // usually COL #define QMK_ESC_INPUT D1 // usually ROW #define QMK_LED B0 diff --git a/layouts/community/ortho_4x12/wanleg/keymap.c b/layouts/community/ortho_4x12/wanleg/keymap.c index 6fe8446f6..23e794dc4 100644 --- a/layouts/community/ortho_4x12/wanleg/keymap.c +++ b/layouts/community/ortho_4x12/wanleg/keymap.c @@ -15,8 +15,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______________Qwerty_Row__2_______________, KC_LCTL, KC_LGUI, KC_LALT, GHERKIN, SUBTER, SH_T(KC_SPC), SH_T(KC_SPC), SUPRA, KC_RGUI, KC_RALT, GHERKIN, KC_RCTL ), - -#elif defined(KEYBOARD_4x4) +[DIR] = LAYOUT_ortho_4x12_wrapper( + _____________DIRECTIONS_Row__0_____________, + _____________DIRECTIONS_Row__1_____________, + _____________DIRECTIONS_Row__2_____________, + _______, _______, ONEHAND, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), +#elif defined(KEYBOARD_40percentclub_4x4) [_GK] = LAYOUT_ortho_4x12_wrapper( _______________GherkinLike_0_______________, _______________GherkinLike_1_______________, @@ -31,6 +36,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______________NUMPAD_Row__3_______________ ), +#elif defined(KEYBOARD_jj40) +[_GK] = LAYOUT_ortho_4x12_wrapper( + _______________GherkinLike_0_______________, + _______________GherkinLike_1_______________, + _______________GherkinLike_2_______________, + TD(RST_TAP_DANCE), BL_TOGG, BL_STEP, BL_BRTG, NUMBER, ETCETERA, KC_SPC,DIRECTION, KC_RGUI, KC_RALT, KC_DEL, KC_RCTL +), + #else [_GK] = LAYOUT_ortho_4x12_wrapper( _______________GherkinLike_0_______________, diff --git a/layouts/community/ortho_4x12/wanleg/rules.mk b/layouts/community/ortho_4x12/wanleg/rules.mk index 835022f4b..e8277610b 100644 --- a/layouts/community/ortho_4x12/wanleg/rules.mk +++ b/layouts/community/ortho_4x12/wanleg/rules.mk @@ -1,14 +1,10 @@ AUDIO_ENABLE = no -SWAP_HANDS_ENABLE = yes +SWAP_HANDS_ENABLE = no -ifeq ($(strip $(KEYBOARD)), jj40) - SWAP_HANDS_ENABLE = no +ifeq ($(strip $(KEYBOARD)), lets_split/rev2) + SWAP_HANDS_ENABLE = yes endif -ifeq ($(strip $(KEYBOARD)), 40percentclub/4x4) - SWAP_HANDS_ENABLE = no -endif - -ifeq ($(strip $(KEYBOARD)), zlant) - SWAP_HANDS_ENABLE = no -endif +ifeq ($(strip $(KEYBOARD)), planck/rev6) + AUDIO_ENABLE = yes +endif \ No newline at end of file diff --git a/layouts/community/ortho_5x15/wanleg/config.h b/layouts/community/ortho_5x15/wanleg/config.h index 1aeda2db4..d2b3d6719 100644 --- a/layouts/community/ortho_5x15/wanleg/config.h +++ b/layouts/community/ortho_5x15/wanleg/config.h @@ -1,7 +1,7 @@ #pragma once //5x5 powered by Adafruit Feather 32u4 Bluefruit LE -#if defined(KEYBOARD_5x5) && defined(BLUEFRUIT) +#if defined(KEYBOARD_40percentclub_5x5) && defined(BLUEFRUIT) //need to undefine standard 5x5 array before defining alternate Bluefruit array #undef MATRIX_ROW_PINS diff --git a/layouts/community/ortho_5x15/wanleg/keymap.c b/layouts/community/ortho_5x15/wanleg/keymap.c index 66b3ce018..51b020fcd 100644 --- a/layouts/community/ortho_5x15/wanleg/keymap.c +++ b/layouts/community/ortho_5x15/wanleg/keymap.c @@ -6,7 +6,7 @@ #define _________________Num_Row_75________________ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_NLCK const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -#if defined(KEYBOARD_5x5) +#if defined(KEYBOARD_40percentclub_5x5) [GK75] = LAYOUT_ortho_5x15_wrapper( _________________Num_Row_75________________, QWERTY75, XXXXXXX, FUNCTION75, _______________GherkinLike_0_______________, KC_KP_7, KC_KP_8, KC_KP_9, @@ -23,6 +23,30 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TD(RST_TAP_DANCE), GHERKIN75, NUMPAD, gNUMBER, gETCETERA, KC_SPC,gDIRECTION, KC_RGUI, KC_RALT, KC_RGUI ), +[gNUM] = LAYOUT_ortho_5x10_wrapper( + _________________BLANK_50__________________, + _______________Gherkin_NUM_0_______________, + _______________Gherkin_NUM_1_______________, + _______________Gherkin_NUM_2_______________, + _______, _______, _______, _______, _______, KC_ENT, KC_RSFT, KC_RGUI, _______, _______ +), + +[gDIR] = LAYOUT_ortho_5x10_wrapper( + _________________BLANK_50__________________, + _______________Gherkin_DIR_0_______________, + _______________Gherkin_DIR_1_______________, + _______________Gherkin_DIR_2_______________, + _________________BLANK_50__________________ +), + +[gETC] = LAYOUT_ortho_5x10_wrapper( + _________________BLANK_50__________________, + _______________Gherkin_ETC_0_______________, + _______________Gherkin_ETC_1_______________, + _______________Gherkin_ETC_2_______________, + _______, KC_CAPS, _______, _______, _______, LALT(LCTL(KC_DEL)), _______, _______, _______, _______ +), + #if defined(BLUEFRUIT) [PAD] = LAYOUT_ortho_5x5_wrapper( _______, _______, _______, OUT_BT, OUT_USB, @@ -210,27 +234,4 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, KC_BTN1, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R ), -[gNUM] = LAYOUT_ortho_5x10_wrapper( - _________________BLANK_50__________________, - _______________Gherkin_NUM_0_______________, - _______________Gherkin_NUM_1_______________, - _______________Gherkin_NUM_2_______________, - _______, _______, _______, _______, _______, KC_ENT, KC_RSFT, KC_RGUI, _______, _______ -), - -[gDIR] = LAYOUT_ortho_5x10_wrapper( - _________________BLANK_50__________________, - _______________Gherkin_DIR_0_______________, - _______________Gherkin_DIR_1_______________, - _______________Gherkin_DIR_2_______________, - _________________BLANK_50__________________ -), - -[gETC] = LAYOUT_ortho_5x10_wrapper( - _________________BLANK_50__________________, - _______________Gherkin_ETC_0_______________, - _______________Gherkin_ETC_1_______________, - _______________Gherkin_ETC_2_______________, - _______, KC_CAPS, _______, _______, _______, LALT(LCTL(KC_DEL)), _______, _______, _______, _______ -), }; diff --git a/layouts/community/ortho_5x15/wanleg/rules.mk b/layouts/community/ortho_5x15/wanleg/rules.mk index bfc4c69d9..96bbaa458 100644 --- a/layouts/community/ortho_5x15/wanleg/rules.mk +++ b/layouts/community/ortho_5x15/wanleg/rules.mk @@ -1,8 +1,11 @@ -ifeq (,$(findstring yes,$(BLUEFRUIT))) - BLUETOOTH = AdafruitBLE - BLUETOOTH_ENABLE = yes - F_CPU = 8000000 - CONSOLE_ENABLE = no # Console for debug(+400) - COMMAND_ENABLE = no # Commands for debug and configuration - RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow -endif \ No newline at end of file +#ifeq ($(strip $(KEYBOARD)), xd75) +#or +#ifeq (,$(findstring xd75,$(KEYBOARD))) +#something +#endif + +#ifeq ($(strip $(KEYBOARD)), 40percentclub/5x5) +#or +#ifeq (,$(findstring 40percentclub/5x5,$(KEYBOARD))) +#something +#endif \ No newline at end of file diff --git a/users/wanleg/config.h b/users/wanleg/config.h index f2e785659..0c8b048af 100644 --- a/users/wanleg/config.h +++ b/users/wanleg/config.h @@ -1,10 +1,12 @@ -#ifndef USERSPACE_CONFIG_H -#define USERSPACE_CONFIG_H +#pragma once //TAPPING_TERM //tapping term short (<100): on multi-purpose keys, slow taps may not register, but "holds" register easier. multi-tap keys may be difficult to activate. //tapping term long (>200): holds don't register as easily - noticeable when typing quickly (e.g. shift doesn't want to engage.) -#if defined(TAP_DANCE_ENABLE) && defined(KEYBOARD_lets_split_rev2) + + +//MIGHT HAVE TO SPLIT THIS INTO TWO CONDITIONS +#if defined(TAP_DANCE_ENABLE) && defined(KEYBOARD_lets_split_rev2) || defined(KEYBOARD_iris_rev2) //Kailh Coppers activate quickly and don't need a long tapping term #define TAPPING_TERM 100 @@ -39,6 +41,4 @@ // Disable mod tap interrrupt #ifndef IGNORE_MOD_TAP_INTERRUPT #define IGNORE_MOD_TAP_INTERRUPT -#endif // !mod tap interrrupt - -#endif // !USERSPACE_CONFIG_H +#endif // !mod tap interrrupt \ No newline at end of file diff --git a/users/wanleg/rules.mk b/users/wanleg/rules.mk index e3e802b4a..c6569594b 100644 --- a/users/wanleg/rules.mk +++ b/users/wanleg/rules.mk @@ -18,5 +18,13 @@ endif #use alternate settings for boards using "Adafruit Feather 32u4 Bluefruit LE" instead of Micro #example usage: make 5x5:wanleg BT=yes ifeq ($(strip $(BT)), yes) - OPT_DEFS += -DBLUEFRUIT + #opt_defs for alternate pin usage + OPT_DEFS += -DBLUEFRUIT + #Adafruit Bluefruit controller settings + BLUETOOTH = AdafruitBLE + BLUETOOTH_ENABLE = yes + F_CPU = 8000000 + CONSOLE_ENABLE = no # Console for debug(+400) + COMMAND_ENABLE = no # Commands for debug and configuration + RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow endif \ No newline at end of file diff --git a/users/wanleg/tapdances.c b/users/wanleg/tapdances.c index 3878e6d31..e5051f9ee 100644 --- a/users/wanleg/tapdances.c +++ b/users/wanleg/tapdances.c @@ -73,9 +73,9 @@ void CAD_finished (qk_tap_dance_state_t *state, void *user_data) { //register_code(KC_NO); //take a screenshot of a single window, open Paint and paste SEND_STRING(SS_LALT(SS_TAP(X_PSCREEN)) SS_LGUI("r")); - _delay_ms(500); + wait_ms(500); SEND_STRING("mspaint" SS_TAP(X_ENTER)); - _delay_ms(700); + wait_ms(700); SEND_STRING(SS_LCTRL("v")); break; //register this keycode when button is held case DOUBLE_TAP: diff --git a/users/wanleg/wanleg.h b/users/wanleg/wanleg.h index 9e0cf3ee5..c2644cd6c 100644 --- a/users/wanleg/wanleg.h +++ b/users/wanleg/wanleg.h @@ -1,5 +1,4 @@ -#ifndef USERSPACE -#define USERSPACE +#pragma once #include "quantum.h" @@ -32,7 +31,6 @@ enum userspace_layers { #elif KEYBOARD_xd75 enum userspace_layers { GK75 = 0, - PAD, QW75, SUB75, SUP75, @@ -43,6 +41,7 @@ enum userspace_layers { gGK, _GK, _QW, + PAD, ONE, SUB, SUP, @@ -54,7 +53,7 @@ enum userspace_layers { gETC, GK50, }; -#elif KEYBOARD_5x5 +#elif KEYBOARD_40percentclub_5x5 enum userspace_layers { GK50 = 0, gNUM, @@ -82,8 +81,8 @@ enum userspace_layers { #else enum userspace_layers { _GK = 0, - PAD, _QW, + PAD, ONE, SUB, SUP, @@ -156,11 +155,11 @@ enum { #define KEYMAP_wrapper(...) LAYOUT(__VA_ARGS__) #define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__) #define LAYOUT_ortho_3x10_wrapper(...) LAYOUT_ortho_3x10(__VA_ARGS__) -#define LAYOUT_ortho_5x10_wrapper(...) LAYOUT_ortho_5x10(__VA_ARGS__) -#define LAYOUT_ortho_4x12_wrapper(...) LAYOUT_ortho_4x12(__VA_ARGS__) -#define LAYOUT_ortho_5x15_wrapper(...) LAYOUT_ortho_5x15(__VA_ARGS__) #define LAYOUT_ortho_4x4_wrapper(...) LAYOUT_ortho_4x4(__VA_ARGS__) +#define LAYOUT_ortho_4x12_wrapper(...) LAYOUT_ortho_4x12(__VA_ARGS__) #define LAYOUT_ortho_5x5_wrapper(...) LAYOUT_ortho_5x5(__VA_ARGS__) +#define LAYOUT_ortho_5x10_wrapper(...) LAYOUT_ortho_5x10(__VA_ARGS__) +#define LAYOUT_ortho_5x15_wrapper(...) LAYOUT_ortho_5x15(__VA_ARGS__) // Blocks for each of the major keyboard layouts // Organized so we can quickly adapt and modify all of them @@ -229,7 +228,7 @@ enum { /* Gherkin-Like * .-----------------------------------------------------------------------------------------------------------. - * | ESC | Q//ESC | W | E | R | T | Y | U | I | O | P | BSPC | + * | ESC | Q//ESC | W | E | R | T | Y | U | I | O | P | BSPC | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| * | TAB | A | S | D | F | G | H | J | K | L | SPACE | ' | * | | | | | | | | | | |SFThold | | @@ -361,4 +360,3 @@ enum { #define _______________NUMPAD_Row__1_______________ KC_KP_4, KC_KP_5, KC_KP_6, KC_SPC #define _______________NUMPAD_Row__2_______________ KC_KP_1, KC_KP_2, KC_KP_3, KC_PENT #define _______________NUMPAD_Row__3_______________ KC_KP_0, TD(LYR_TAP_DANCE), KC_KP_DOT, KC_PMNS -#endif // !USERSPACE From d6b7ca04f22e3f1e0f9ce4074f3902fddba338ad Mon Sep 17 00:00:00 2001 From: fauxpark Date: Wed, 5 Dec 2018 11:14:55 +1100 Subject: [PATCH 615/788] Only try to read the report ID from SetReport when the keyboard is part of the shared EP Fixes #4471 Fixes #4517 --- tmk_core/protocol/lufa/lufa.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index e88e6f34a..27cf51b16 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -517,7 +517,7 @@ void EVENT_USB_Device_ControlRequest(void) if (USB_DeviceState == DEVICE_STATE_Unattached) return; } -#if defined(SHARED_EP_ENABLE) +#ifdef KEYBOARD_SHARED_EP uint8_t report_id = REPORT_ID_KEYBOARD; if (keyboard_protocol) { report_id = Endpoint_Read_8(); From d115abfd8d1e2a7e34cc7809165e413efc1eb9ce Mon Sep 17 00:00:00 2001 From: Jason Thigpen Date: Wed, 5 Dec 2018 09:02:26 -0800 Subject: [PATCH 616/788] Keyboard: Add dz60 tsangan hhkb (#4529) * Add tsangan bottom row hhkb layout for dz60 * Add crd's tsangan hhkb layout for dz60 * Resort to native key aliases when they exist * Update crd's dz60 ansi keymap to match updates for hhkb fn layer * Add tsangan hhkb layout to dz60 info.json for KLE * Fix JSON nesting in dz60 layouts block * Minor adjustments to crd layouts to make them more consistent * Update layout naming to 60_tsangan_hhkb --- keyboards/dz60/dz60.h | 26 +++++++++++ keyboards/dz60/info.json | 4 ++ keyboards/dz60/keymaps/crd_ansi/keymap.c | 43 +++++++++++-------- keyboards/dz60/keymaps/crd_tsangan/keymap.c | 30 +++++++++++++ .../60_ansi_tsangan_split_bs_rshift/readme.md | 3 -- .../default_60_tsangan_hhkb}/keymap.c | 2 +- .../layout.json | 0 layouts/default/60_tsangan_hhkb/readme.md | 3 ++ 8 files changed, 88 insertions(+), 23 deletions(-) create mode 100644 keyboards/dz60/keymaps/crd_tsangan/keymap.c delete mode 100644 layouts/default/60_ansi_tsangan_split_bs_rshift/readme.md rename layouts/default/{60_ansi_tsangan_split_bs_rshift/default_60_ansi_tsangan_split_bs_rshift => 60_tsangan_hhkb/default_60_tsangan_hhkb}/keymap.c (94%) rename layouts/default/{60_ansi_tsangan_split_bs_rshift => 60_tsangan_hhkb}/layout.json (100%) create mode 100644 layouts/default/60_tsangan_hhkb/readme.md diff --git a/keyboards/dz60/dz60.h b/keyboards/dz60/dz60.h index 62f6338cd..50e80bed8 100644 --- a/keyboards/dz60/dz60.h +++ b/keyboards/dz60/dz60.h @@ -332,5 +332,31 @@ { k40, k41, KC_NO, k43, k44, KC_NO, k46, KC_NO, k48, KC_NO, k4a, k4b, k4c, k4d, k4e } \ } +/* LAYOUT_60_tsangan_hhkb + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ + * │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0a │0b │0c │0d │0e │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ + * │10 │12 │13 │14 │15 │16 │17 │18 │19 │1a │1b │1c │1d │1e │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ + * │20 │22 │23 │24 │25 │26 │27 │28 │29 │2a │2b │2c │2d │ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ + * │30 │32 │33 │34 │35 │36 │37 │38 │39 │3a │3b │3d │3e │ + * ├─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬───┬─┴───┤ + * │40 │41 │43 │46 (7u) │4b │4d │4e │ + * └─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘ +*/ +#define LAYOUT_60_tsangan_hhkb( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, \ + k10, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, \ + k20, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, \ + k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3d, k3e, \ + k40, k41, k43, k46, k4b, k4d, k4e \ +) { \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e }, \ + { k10, KC_NO, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e }, \ + { k20, KC_NO, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, KC_NO }, \ + { k30, KC_NO, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, KC_NO, k3d, k3e }, \ + { k40, k41, KC_NO, k43, KC_NO, KC_NO, k46, KC_NO, KC_NO, KC_NO, KC_NO, k4b, KC_NO, k4d, k4e } \ +} #endif diff --git a/keyboards/dz60/info.json b/keyboards/dz60/info.json index 9ec727453..d1139fd1f 100644 --- a/keyboards/dz60/info.json +++ b/keyboards/dz60/info.json @@ -52,6 +52,10 @@ "LAYOUT_60_b_iso": { "key_count": 67, "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"1", "x":1, "y":0}, {"label":"2", "x":2, "y":0}, {"label":"3", "x":3, "y":0}, {"label":"4", "x":4, "y":0}, {"label":"5", "x":5, "y":0}, {"label":"6", "x":6, "y":0}, {"label":"7", "x":7, "y":0}, {"label":"8", "x":8, "y":0}, {"label":"9", "x":9, "y":0}, {"label":"0", "x":10, "y":0}, {"label":"-", "x":11, "y":0}, {"label":"=", "x":12, "y":0}, {"x":13, "y":0}, {"label":"Back Space", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"[", "x":11.5, "y":1}, {"label":"]", "x":12.5, "y":1}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":";", "x":10.75, "y":2}, {"label":"'", "x":11.75, "y":2}, {"label":"#", "x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"label":"\\", "x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":",", "x":9.25, "y":3}, {"label":".", "x":10.25, "y":3}, {"label":"Shift", "x":11.25, "y":3, "w":1.75}, {"label":"Up", "x":13, "y":3}, {"label":"Del", "x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"GUI", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"label":"Space", "x":3.75, "y":4, "w":2.25}, {"label":"Space", "x":6, "y":4, "w":1.25}, {"label":"Space", "x":7.25, "y":4, "w":2.75}, {"label":"AltGr", "x":10, "y":4}, {"label":"Fn", "x":11, "y":4}, {"label":"Left", "x":12, "y":4}, {"label":"Down", "x":13, "y":4}, {"label":"Right", "x":14, "y":4}] + }, + "LAYOUT_60_tsangan_hhkb": { + "key_count": 62, + "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"|", "x":13, "y":0}, {"label":"~", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"Backspace", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"label":"Fn", "x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.5}, {"label":"Win", "x":1.5, "y":4}, {"label":"Alt", "x":2.5, "y":4, "w":1.5}, {"x":4, "y":4, "w":7}, {"label":"Win", "x":11, "y":4, "w":1.5}, {"label":"Menu", "x":12.5, "y":4}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}] } } } diff --git a/keyboards/dz60/keymaps/crd_ansi/keymap.c b/keyboards/dz60/keymaps/crd_ansi/keymap.c index eac0f1e84..52d1756be 100644 --- a/keyboards/dz60/keymaps/crd_ansi/keymap.c +++ b/keyboards/dz60/keymaps/crd_ansi/keymap.c @@ -1,25 +1,30 @@ #include QMK_KEYBOARD_H +enum keyboard_layers { + _BL = 0, // Base Layer + _FL // Function Layer +}; + +// Custom #defined keycodes (shorter macros for readability) +#define KC_CTES CTL_T(KC_ESC) +#define KC_RSUP RSFT_T(KC_UP) +#define KC_FNLT LT(_FL, KC_LEFT) +#define KC_RADN RALT_T(KC_DOWN) +#define KC_RCRT RCTL_T(KC_RIGHT) + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - LAYOUT_60_ansi( - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, - CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, RSFT_T(KC_UP), - MO(1), KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, RGUI_T(KC_LEFT), RALT_T(KC_DOWN), LT(2, KC_RIGHT) + [_BL] = LAYOUT_60_ansi( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, + KC_CTES, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSUP, + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_FNLT, KC_RADN, KC_RCRT ), - LAYOUT_60_ansi( - KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, _______, - _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_END, KC_PGDN, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______ - ), - LAYOUT_60_ansi( - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET, - _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_SCROLLLOCK, KC_PAUSE, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______ + [_FL] =LAYOUT_60_ansi( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, + _______, KC_HOME, KC_UP, KC_END, _______, _______, _______, _______, KC_MUTE, _______, _______, KC_PGDN, KC_PGUP, RESET, + _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, KC_SLCK, KC_VOLD, KC_VOLU, KC_PAUS, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______ ) }; diff --git a/keyboards/dz60/keymaps/crd_tsangan/keymap.c b/keyboards/dz60/keymaps/crd_tsangan/keymap.c new file mode 100644 index 000000000..320de07a1 --- /dev/null +++ b/keyboards/dz60/keymaps/crd_tsangan/keymap.c @@ -0,0 +1,30 @@ +#include QMK_KEYBOARD_H + +enum keyboard_layers { + _BL = 0, // Base Layer + _FL // Function Layer +}; + +// Custom #defined keycodes (shorter macros for readability) +#define KC_CTES CTL_T(KC_ESC) +#define KC_RSUP RSFT_T(KC_UP) +#define KC_RGLT RGUI_T(KC_LEFT) +#define KC_RADN RALT_T(KC_DOWN) +#define KC_RCRT RCTL_T(KC_RIGHT) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BL] = LAYOUT_60_tsangan_hhkb( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_ESC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, + KC_CTES, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSUP, MO(_FL), + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGLT, KC_RADN, KC_RCRT + ), + [_FL] = LAYOUT_60_tsangan_hhkb( + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, RESET, + _______, KC_HOME, KC_UP, KC_END, _______, _______, _______, _______, KC_MUTE, _______, _______, KC_PGDN, KC_PGUP, KC_DEL, + _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, KC_SLCK, KC_VOLD, KC_VOLU, KC_PAUS, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______ + ) +}; diff --git a/layouts/default/60_ansi_tsangan_split_bs_rshift/readme.md b/layouts/default/60_ansi_tsangan_split_bs_rshift/readme.md deleted file mode 100644 index ad1c598b3..000000000 --- a/layouts/default/60_ansi_tsangan_split_bs_rshift/readme.md +++ /dev/null @@ -1,3 +0,0 @@ -# 60_ansi_tsangan_split_bs_rshift - - LAYOUT_60_ansi_tsangan_split_bs_rshift \ No newline at end of file diff --git a/layouts/default/60_ansi_tsangan_split_bs_rshift/default_60_ansi_tsangan_split_bs_rshift/keymap.c b/layouts/default/60_tsangan_hhkb/default_60_tsangan_hhkb/keymap.c similarity index 94% rename from layouts/default/60_ansi_tsangan_split_bs_rshift/default_60_ansi_tsangan_split_bs_rshift/keymap.c rename to layouts/default/60_tsangan_hhkb/default_60_tsangan_hhkb/keymap.c index 17b47eecf..c9c831329 100644 --- a/layouts/default/60_ansi_tsangan_split_bs_rshift/default_60_ansi_tsangan_split_bs_rshift/keymap.c +++ b/layouts/default/60_tsangan_hhkb/default_60_tsangan_hhkb/keymap.c @@ -1,7 +1,7 @@ #include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = LAYOUT_60_ansi_tsangan_split_bs_rshift( + [0] = LAYOUT_60_tsangan_hhkb( KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL,KC_BSPC,KC_BSPC, KC_TAB , KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC, KC_BSLS , KC_CAPS , KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_ENT , diff --git a/layouts/default/60_ansi_tsangan_split_bs_rshift/layout.json b/layouts/default/60_tsangan_hhkb/layout.json similarity index 100% rename from layouts/default/60_ansi_tsangan_split_bs_rshift/layout.json rename to layouts/default/60_tsangan_hhkb/layout.json diff --git a/layouts/default/60_tsangan_hhkb/readme.md b/layouts/default/60_tsangan_hhkb/readme.md new file mode 100644 index 000000000..f1e955f1e --- /dev/null +++ b/layouts/default/60_tsangan_hhkb/readme.md @@ -0,0 +1,3 @@ +# 60_tsangan_hhkb + + LAYOUT_60_tsangan_hhkb \ No newline at end of file From 7d4955b2c453828ab8ba315720ce73e4dae0a0c3 Mon Sep 17 00:00:00 2001 From: Jarrett Drouillard Date: Wed, 5 Dec 2018 12:08:05 -0500 Subject: [PATCH 617/788] Keymap: Preonic kuatsure updates 2018-Nov (#4500) * preonic-kuatsure: ctrl / esc in one key + hello ` again * preonic-kuatsure: remove esc on lower * preonic-kuatsure: programmy macros * user-kuatsure: turn off console all the time * preonic-kuatsure: auto shift, but only for numbers * preonic-kuatsure: remove programmery macros * preonic-kuatsure: move braces, parens, etc over to raise backwards compat move &*() on lower * preonic-kuatsure: stop with the full rep of game layer --- keyboards/preonic/keymaps/kuatsure/config.h | 3 ++ keyboards/preonic/keymaps/kuatsure/keymap.c | 54 ++++++++++++--------- keyboards/preonic/keymaps/kuatsure/rules.mk | 1 + users/kuatsure/kuatsure.h | 2 + users/kuatsure/rules.mk | 2 + 5 files changed, 38 insertions(+), 24 deletions(-) diff --git a/keyboards/preonic/keymaps/kuatsure/config.h b/keyboards/preonic/keymaps/kuatsure/config.h index ba0ed525e..bae774211 100644 --- a/keyboards/preonic/keymaps/kuatsure/config.h +++ b/keyboards/preonic/keymaps/kuatsure/config.h @@ -3,6 +3,9 @@ #include "config_common.h" +#define NO_AUTO_SHIFT_SPECIAL +#define NO_AUTO_SHIFT_ALPHA + #ifdef AUDIO_ENABLE #define STARTUP_SONG SONG(PREONIC_SOUND) // #define STARTUP_SONG SONG(NO_SOUND) diff --git a/keyboards/preonic/keymaps/kuatsure/keymap.c b/keyboards/preonic/keymaps/kuatsure/keymap.c index 63c3937fc..5a7fa40e5 100644 --- a/keyboards/preonic/keymaps/kuatsure/keymap.c +++ b/keyboards/preonic/keymaps/kuatsure/keymap.c @@ -32,17 +32,19 @@ enum preonic_keycodes { GAME_MOD, LOWER, RAISE, + + END_OF_LINE, }; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Qwerty * ,-----------------------------------------------------------------------------------. - * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | * |------+------+------+------+------+------+------+------+------+------+------+------| * | Tab | Q | W | E | R | T | Y | U | I | O | P | \ | * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Ctrl | A | S | D | F | G | H | J | K | L | ; | ' | + * | Esc/C| A | S | D | F | G | H | J | K | L | ; | ' | * |------+------+------+------+------+------|------+------+------+------+------+------| * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | * |------+------+------+------+------+------+------+------+------+------+------+------| @@ -50,32 +52,36 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_QWERTY] = LAYOUT_preonic_grid_wrapper( \ - KC_ESC, _________________NUMBER_L1_________________, _________________NUMBER_R1_________________, KC_BSPC, \ + KC_GRV, _________________NUMBER_L1_________________, _________________NUMBER_R1_________________, KC_BSPC, \ KC_TAB, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_BSLS, \ - KC_LCTL, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_QUOT, \ + KT_CESC, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_QUOT, \ KC_LSFT, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_ENT, \ KC_LEAD, GAME, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ ), /* Game + * + * Mostly transparent, but wanted to disable gui key, and give different raise / lower layers ( game_mod ). + * Also give a key to get back to qwerty layout. + * * ,-----------------------------------------------------------------------------------. - * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * | | | | | | | | | | | | | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Tab | Q | W | E | R | T | Y | U | I | O | P | \ | + * | | | | | | | | | | | | | * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Ctrl | A | S | D | F | G | H | J | K | L | ; | ' | + * | | | | | | | | | | | | | * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | + * | | | | | | | | | | | | | * |------+------+------+------+------+------+------+------+------+------+------+------| - * |Leader|Qwerty| Alt | Spc |Game+ | Space |Game+ | Left | Down | Up |Right | + * | |Qwerty| | Spc |Game+ | |Game+ | | | | | * `-----------------------------------------------------------------------------------' */ [_GAME] = LAYOUT_preonic_grid_wrapper( \ - KC_ESC, _________________NUMBER_L1_________________, _________________NUMBER_R1_________________, KC_BSPC, \ - KC_TAB, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_BSLS, \ - KC_LCTL, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_QUOT, \ - KC_LSFT, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_ENT, \ - KC_LEAD, QWERTY, KC_LALT, KC_SPC, GAME_MOD, KC_SPC, KC_SPC, GAME_MOD, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, QWERTY, _______, KC_SPC, GAME_MOD, _______, _______, GAME_MOD, _______, _______, _______, _______ \ ), /* Game Modifiers @@ -101,7 +107,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Lower * ,-----------------------------------------------------------------------------------. - * | ~ | ! | @ | # | $ | % | ^ | < | > | | | | + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | | * |------+------+------+------+------+-------------+------+------+------+------+------| * | | | | Up | | ` | | { | } | _ | | | | * |------+------+------+------+------+-------------+------+------+------+------+------| @@ -109,35 +115,35 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------|------+------+------+------+------+------| * | | Vol- | Prev | Play | Next | Vol+ | - | [ | ] | | ? | | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | Mute | | | | Esc | | Home | PgUp | PgDwn| End | + * | | Mute | | | | | | Home | PgUp | PgDwn| End | * `-----------------------------------------------------------------------------------' */ [_LOWER] = LAYOUT_preonic_grid_wrapper( \ - KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_LT, KC_GT, _______, _______, _______, \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, \ _______, _______, _______, KC_UP, _______, KC_GRV, _______, KC_LCBR, KC_RCBR, KC_UNDS, _______, KC_PIPE, \ _______, KC_DEL, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TILD, KC_EQL, KC_LPRN, KC_RPRN, KC_PLUS, KC_COLN, KC_DQT , \ _______, KC_VOLD, KC_MRWD, KC_MPLY, KC_MFFD, KC_VOLU, KC_MINS, KC_LBRC, KC_RBRC, _______, KC_QUES, _______, \ - _______, KC_MUTE, _______, _______, _______, KC_ESC, KC_ESC, _______, KC_HOME, KC_PGUP, KC_PGDN, KC_END \ + _______, KC_MUTE, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, KC_PGDN, KC_END \ ), /* Raise * ,-----------------------------------------------------------------------------------. * | E`~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | | * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | F9 | F10 | F11 | F12 | | | | | | | Bksp | + * | | F9 | F10 | F11 | F12 | | | { | } | | | Bksp | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | F5 | F6 | F7 | F8 | | | | | | | | + * | | F5 | F6 | F7 | F8 | | | ( | ) | < | > | | * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F1 | F2 | F3 | F4 | | | | | | | | + * | | F1 | F2 | F3 | F4 | | | [ | ] | | | | * |------+------+------+------+------+------+------+------+------+------+------+------| * | | | | | | Enter | | Home | PgUp | PgDwn| End | * `-----------------------------------------------------------------------------------' */ [_RAISE] = LAYOUT_preonic_grid_wrapper( \ KC_GESC, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, \ - _______, ____________FUNCTION_3____________, _______, _______, _______, _______, _______, _______, KC_BSPC, \ - _______, ____________FUNCTION_2____________, _______, _______, _______, _______, _______, _______, _______, \ - _______, ____________FUNCTION_1____________, _______, _______, _______, _______, _______, _______, _______, \ + _______, ____________FUNCTION_3____________, _______, _______, KC_LCBR, KC_RCBR, _______, _______, KC_BSPC, \ + _______, ____________FUNCTION_2____________, _______, _______, KC_LPRN, KC_RPRN, KC_LT, KC_GT, _______, \ + _______, ____________FUNCTION_1____________, _______, _______, KC_LBRC, KC_RBRC, _______, _______, _______, \ _______, _______, _______, _______, _______, KC_ENT, KC_ENT, _______, KC_HOME, KC_PGUP, KC_PGDN, KC_END \ ), diff --git a/keyboards/preonic/keymaps/kuatsure/rules.mk b/keyboards/preonic/keymaps/kuatsure/rules.mk index 9369f99a9..4aacc7051 100644 --- a/keyboards/preonic/keymaps/kuatsure/rules.mk +++ b/keyboards/preonic/keymaps/kuatsure/rules.mk @@ -1,2 +1,3 @@ BACKLIGHT_ENABLE = no LEADER_ENABLE = yes +AUTO_SHIFT_ENABLE = yes diff --git a/users/kuatsure/kuatsure.h b/users/kuatsure/kuatsure.h index 56fb684ec..23d3c617c 100644 --- a/users/kuatsure/kuatsure.h +++ b/users/kuatsure/kuatsure.h @@ -8,6 +8,8 @@ void tmux_pane_zoom(void); void tmux_pane_switch(uint16_t keycode); void tmux_window_switch(uint16_t keycode); +#define KT_CESC CTL_T(KC_ESC) + #undef LEADER_TIMEOUT #define LEADER_TIMEOUT 300 diff --git a/users/kuatsure/rules.mk b/users/kuatsure/rules.mk index 11262d0ec..f0d295aad 100644 --- a/users/kuatsure/rules.mk +++ b/users/kuatsure/rules.mk @@ -1 +1,3 @@ +CONSOLE_ENABLE = no + SRC += kuatsure.c From d0da43fbdcb78603b34bcf6c0718e104b593c5ce Mon Sep 17 00:00:00 2001 From: Nicholas Shaff Date: Wed, 5 Dec 2018 11:35:26 -0600 Subject: [PATCH 618/788] Keyboard: Updated sixshooter keyboard to move LED macros into the default keymap. (#4428) --- keyboards/sixshooter/keymaps/default/keymap.c | 39 +++++++++++++++++-- keyboards/sixshooter/sixshooter.c | 19 --------- keyboards/sixshooter/sixshooter.h | 11 ------ 3 files changed, 35 insertions(+), 34 deletions(-) diff --git a/keyboards/sixshooter/keymaps/default/keymap.c b/keyboards/sixshooter/keymaps/default/keymap.c index ca0973c60..51f115d93 100644 --- a/keyboards/sixshooter/keymaps/default/keymap.c +++ b/keyboards/sixshooter/keymaps/default/keymap.c @@ -18,10 +18,16 @@ #define _BL 0 #define _FN 1 +// Define keyboard specific keycodes for controlling on/off for all LEDs as they +// are all on different pins with this PCB, rather than a single backlight pin +enum custom_keycodes { + SS_LON = SAFE_RANGE, + SS_LOFF +}; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* Keymap 0: Media Keys + /* Base Layer: Media Keys * ,-----------. - * |Mut| V-| V+| + * |FN | V-| V+| * |---+---+---| * |Prv|Ply|Nxt| * `-----------' @@ -30,13 +36,38 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { MO(_FN), KC_VOLD, KC_VOLU, \ KC_MPRV, KC_MPLY, KC_MNXT \ ), + /* FN Layer: LED control + * ,-----------. + * |FN | V-| V+| + * |---+---+---| + * |Prv|Ply|Nxt| + * `-----------' + */ [_FN] = LAYOUT( KC_TRNS, SS_LON, SS_LOFF, \ - KC_TRNS, KC_TRNS, KC_TRNS + KC_NO, KC_NO, KC_NO ), }; +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + // Put your per-action keyboard code here. + // Runs for every action, just before processing by the firmware. + if (record->event.pressed) { + + // Check for custom keycodes for turning on and off LEDs + switch(keycode) { + case SS_LON: + sixshooter_led_all_on(); + return false; + case SS_LOFF: + sixshooter_led_all_off(); + return false; + } + } + return true; +}; + void matrix_init_user(void) { - /* Default all LEDs to on */ + // Default all LEDs to on sixshooter_led_all_on(); } diff --git a/keyboards/sixshooter/sixshooter.c b/keyboards/sixshooter/sixshooter.c index 814d219a2..87a739454 100644 --- a/keyboards/sixshooter/sixshooter.c +++ b/keyboards/sixshooter/sixshooter.c @@ -31,25 +31,6 @@ void matrix_scan_kb(void) { matrix_scan_user(); } -bool process_record_kb(uint16_t keycode, keyrecord_t *record) { - // put your per-action keyboard code here - // runs for every action, just before processing by the firmware - if (record->event.pressed) { - - /* Check for custom keycodes for turning on and off LEDs */ - switch(keycode) { - case SS_LON: - sixshooter_led_all_on(); - return false; - case SS_LOFF: - sixshooter_led_all_off(); - return false; - } - } - - return process_record_user(keycode, record); -} - void led_set_kb(uint8_t usb_led) { // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here diff --git a/keyboards/sixshooter/sixshooter.h b/keyboards/sixshooter/sixshooter.h index d27b1e419..490d562d0 100644 --- a/keyboards/sixshooter/sixshooter.h +++ b/keyboards/sixshooter/sixshooter.h @@ -10,17 +10,6 @@ { K00, K01, K02, K03, K04, K05 }, \ } - -/* - * Define keyboard specific keycodes for controlling on/off for all LEDs as they - * are all on different pins with this PCB, rather than a single backlight pin - */ -enum keyboard_keycode { - SS_LON = SAFE_RANGE, - SS_LOFF, - SAFE_RANGE_KB -}; - inline void sixshooter_led_0_on(void) { DDRB |= (1<<6); PORTB |= (1<<6); } inline void sixshooter_led_1_on(void) { DDRC |= (1<<7); PORTC |= (1<<7); } inline void sixshooter_led_2_on(void) { DDRD |= (1<<0); PORTD |= (1<<0); } From b3d6426aa95a895585b41b9cd6c0c5bec39f0e92 Mon Sep 17 00:00:00 2001 From: zvecr Date: Wed, 5 Dec 2018 17:51:35 +0000 Subject: [PATCH 619/788] Keyboard: Refactor lets split to use split common code (#4536) * Refactor lets split to use split common code * Refactor lets split to use split common code * Build fixes for OLED_sample keymap * Build fixes for OLED_sample keymap - attempt to reduce firmware size --- keyboards/lets_split/config.h | 5 +- keyboards/lets_split/eeprom-lefthand.eep | 2 - keyboards/lets_split/eeprom-righthand.eep | 2 - keyboards/lets_split/i2c.c | 162 ------ keyboards/lets_split/i2c.h | 49 -- .../lets_split/keymaps/OLED_sample/rules.mk | 17 +- keyboards/lets_split/lets_split.h | 5 +- keyboards/lets_split/matrix.c | 470 ------------------ keyboards/lets_split/rev1/config.h | 7 +- keyboards/lets_split/rev1/rev1.h | 5 +- keyboards/lets_split/rev2/config.h | 8 +- keyboards/lets_split/rev2/rev2.h | 5 +- keyboards/lets_split/rules.mk | 16 +- keyboards/lets_split/serial.c | 228 --------- keyboards/lets_split/serial.h | 26 - keyboards/lets_split/sockets/config.h | 8 +- keyboards/lets_split/sockets/sockets.h | 5 +- keyboards/lets_split/split_util.c | 86 ---- keyboards/lets_split/split_util.h | 20 - 19 files changed, 19 insertions(+), 1107 deletions(-) delete mode 100644 keyboards/lets_split/eeprom-lefthand.eep delete mode 100644 keyboards/lets_split/eeprom-righthand.eep delete mode 100644 keyboards/lets_split/i2c.c delete mode 100644 keyboards/lets_split/i2c.h delete mode 100644 keyboards/lets_split/matrix.c delete mode 100644 keyboards/lets_split/serial.c delete mode 100644 keyboards/lets_split/serial.h delete mode 100644 keyboards/lets_split/split_util.c delete mode 100644 keyboards/lets_split/split_util.h diff --git a/keyboards/lets_split/config.h b/keyboards/lets_split/config.h index c910d8f24..cfb6bf4ff 100644 --- a/keyboards/lets_split/config.h +++ b/keyboards/lets_split/config.h @@ -16,9 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef CONFIG_H -#define CONFIG_H +#pragma once #include "config_common.h" - -#endif diff --git a/keyboards/lets_split/eeprom-lefthand.eep b/keyboards/lets_split/eeprom-lefthand.eep deleted file mode 100644 index bda23cdb6..000000000 --- a/keyboards/lets_split/eeprom-lefthand.eep +++ /dev/null @@ -1,2 +0,0 @@ -:0F000000000000000000000000000000000001F0 -:00000001FF diff --git a/keyboards/lets_split/eeprom-righthand.eep b/keyboards/lets_split/eeprom-righthand.eep deleted file mode 100644 index 549cd1ef0..000000000 --- a/keyboards/lets_split/eeprom-righthand.eep +++ /dev/null @@ -1,2 +0,0 @@ -:0F000000000000000000000000000000000000F1 -:00000001FF diff --git a/keyboards/lets_split/i2c.c b/keyboards/lets_split/i2c.c deleted file mode 100644 index 084c890c4..000000000 --- a/keyboards/lets_split/i2c.c +++ /dev/null @@ -1,162 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include "i2c.h" - -#ifdef USE_I2C - -// Limits the amount of we wait for any one i2c transaction. -// Since were running SCL line 100kHz (=> 10μs/bit), and each transactions is -// 9 bits, a single transaction will take around 90μs to complete. -// -// (F_CPU/SCL_CLOCK) => # of μC cycles to transfer a bit -// poll loop takes at least 8 clock cycles to execute -#define I2C_LOOP_TIMEOUT (9+1)*(F_CPU/SCL_CLOCK)/8 - -#define BUFFER_POS_INC() (slave_buffer_pos = (slave_buffer_pos+1)%SLAVE_BUFFER_SIZE) - -volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE]; - -static volatile uint8_t slave_buffer_pos; -static volatile bool slave_has_register_set = false; - -// Wait for an i2c operation to finish -inline static -void i2c_delay(void) { - uint16_t lim = 0; - while(!(TWCR & (1<10. - // Check datasheets for more info. - TWBR = ((F_CPU/SCL_CLOCK)-16)/2; -} - -// Start a transaction with the given i2c slave address. The direction of the -// transfer is set with I2C_READ and I2C_WRITE. -// returns: 0 => success -// 1 => error -uint8_t i2c_master_start(uint8_t address) { - TWCR = (1< slave ACK -// 1 => slave NACK -uint8_t i2c_master_write(uint8_t data) { - TWDR = data; - TWCR = (1<= SLAVE_BUFFER_SIZE ) { - ack = 0; - slave_buffer_pos = 0; - } - slave_has_register_set = true; - } else { - i2c_slave_buffer[slave_buffer_pos] = TWDR; - BUFFER_POS_INC(); - } - break; - - case TW_ST_SLA_ACK: - case TW_ST_DATA_ACK: - // master has addressed this device as a slave transmitter and is - // requesting data. - TWDR = i2c_slave_buffer[slave_buffer_pos]; - BUFFER_POS_INC(); - break; - - case TW_BUS_ERROR: // something went wrong, reset twi state - TWCR = 0; - default: - break; - } - // Reset everything, so we are ready for the next TWI interrupt - TWCR |= (1< - -#ifndef F_CPU -#define F_CPU 16000000UL -#endif - -#define I2C_READ 1 -#define I2C_WRITE 0 - -#define I2C_ACK 1 -#define I2C_NACK 0 - -#define SLAVE_BUFFER_SIZE 0x10 - -// i2c SCL clock frequency -#define SCL_CLOCK 400000L - -extern volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE]; - -void i2c_master_init(void); -uint8_t i2c_master_start(uint8_t address); -void i2c_master_stop(void); -uint8_t i2c_master_write(uint8_t data); -uint8_t i2c_master_read(int); -void i2c_reset_state(void); -void i2c_slave_init(uint8_t address); - - -static inline unsigned char i2c_start_read(unsigned char addr) { - return i2c_master_start((addr << 1) | I2C_READ); -} - -static inline unsigned char i2c_start_write(unsigned char addr) { - return i2c_master_start((addr << 1) | I2C_WRITE); -} - -// from SSD1306 scrips -extern unsigned char i2c_rep_start(unsigned char addr); -extern void i2c_start_wait(unsigned char addr); -extern unsigned char i2c_readAck(void); -extern unsigned char i2c_readNak(void); -extern unsigned char i2c_read(unsigned char ack); - -#define i2c_read(ack) (ack) ? i2c_readAck() : i2c_readNak(); - -#endif diff --git a/keyboards/lets_split/keymaps/OLED_sample/rules.mk b/keyboards/lets_split/keymaps/OLED_sample/rules.mk index a14e84d4e..89ad61fbe 100644 --- a/keyboards/lets_split/keymaps/OLED_sample/rules.mk +++ b/keyboards/lets_split/keymaps/OLED_sample/rules.mk @@ -1,25 +1,22 @@ +SRC += ssd1306.c # Build Options # change to "no" to disable the options, or define them in the Makefile in # the appropriate keymap folder that will get included automatically # BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) CONSOLE_ENABLE = no # Console for debug(+400) -COMMAND_ENABLE = no # Commands for debug and configuration -NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. -SWAP_HANDS_ENABLE = no # Enable one-hand typing +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. +SWAP_HANDS_ENABLE = no # Enable one-hand typing # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend - -ifndef QUANTUM_DIR - include ../../../../Makefile -endif \ No newline at end of file diff --git a/keyboards/lets_split/lets_split.h b/keyboards/lets_split/lets_split.h index bce0ecb19..9c46f382d 100644 --- a/keyboards/lets_split/lets_split.h +++ b/keyboards/lets_split/lets_split.h @@ -1,5 +1,4 @@ -#ifndef LETS_SPLIT_H -#define LETS_SPLIT_H +#pragma once #include "quantum.h" @@ -27,5 +26,3 @@ ) #define LAYOUT_kc_ortho_4x12 LAYOUT_kc - -#endif diff --git a/keyboards/lets_split/matrix.c b/keyboards/lets_split/matrix.c deleted file mode 100644 index f753d234a..000000000 --- a/keyboards/lets_split/matrix.c +++ /dev/null @@ -1,470 +0,0 @@ -/* -Copyright 2012 Jun Wako - -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 . -*/ - -/* - * scan matrix - */ -#include -#include -#include -#include "wait.h" -#include "print.h" -#include "debug.h" -#include "util.h" -#include "matrix.h" -#include "split_util.h" -#include "pro_micro.h" -#include "config.h" -#include "timer.h" - -#ifdef USE_I2C -# include "i2c.h" -#else // USE_SERIAL -# include "serial.h" -#endif - -#ifndef DEBOUNCING_DELAY -# define DEBOUNCING_DELAY 5 -#endif - -#if (DEBOUNCING_DELAY > 0) - static uint16_t debouncing_time; - static bool debouncing = false; -#endif - -#if (MATRIX_COLS <= 8) -# define print_matrix_header() print("\nr/c 01234567\n") -# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row)) -# define matrix_bitpop(i) bitpop(matrix[i]) -# define ROW_SHIFTER ((uint8_t)1) -#else -# error "Currently only supports 8 COLS" -#endif -static matrix_row_t matrix_debouncing[MATRIX_ROWS]; - -#define ERROR_DISCONNECT_COUNT 5 - -#define ROWS_PER_HAND (MATRIX_ROWS/2) - -static uint8_t error_count = 0; - -static const uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; -static const uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; - -/* matrix state(1:on, 0:off) */ -static matrix_row_t matrix[MATRIX_ROWS]; -static matrix_row_t matrix_debouncing[MATRIX_ROWS]; - -#if (DIODE_DIRECTION == COL2ROW) - static void init_cols(void); - static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row); - static void unselect_rows(void); - static void select_row(uint8_t row); - static void unselect_row(uint8_t row); -#elif (DIODE_DIRECTION == ROW2COL) - static void init_rows(void); - static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col); - static void unselect_cols(void); - static void unselect_col(uint8_t col); - static void select_col(uint8_t col); -#endif - -__attribute__ ((weak)) -void matrix_init_kb(void) { - matrix_init_user(); -} - -__attribute__ ((weak)) -void matrix_scan_kb(void) { - matrix_scan_user(); -} - -__attribute__ ((weak)) -void matrix_init_user(void) { -} - -__attribute__ ((weak)) -void matrix_scan_user(void) { -} - -__attribute__ ((weak)) -void matrix_slave_scan_user(void) { -} - -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - -void matrix_init(void) -{ -#ifdef DISABLE_JTAG - // JTAG disable for PORT F. write JTD bit twice within four cycles. - MCUCR |= (1< 0) - bool matrix_changed = read_cols_on_row(matrix_debouncing+offset, current_row); - - if (matrix_changed) { - debouncing = true; - debouncing_time = timer_read(); - } - -# else - read_cols_on_row(matrix+offset, current_row); -# endif - - } - -#elif (DIODE_DIRECTION == ROW2COL) - // Set col, read rows - for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) { -# if (DEBOUNCING_DELAY > 0) - bool matrix_changed = read_rows_on_col(matrix_debouncing+offset, current_col); - if (matrix_changed) { - debouncing = true; - debouncing_time = timer_read(); - } -# else - read_rows_on_col(matrix+offset, current_col); -# endif - - } -#endif - -# if (DEBOUNCING_DELAY > 0) - if (debouncing && (timer_elapsed(debouncing_time) > DEBOUNCING_DELAY)) { - for (uint8_t i = 0; i < ROWS_PER_HAND; i++) { - matrix[i+offset] = matrix_debouncing[i+offset]; - } - debouncing = false; - } -# endif - - return 1; -} - -#ifdef USE_I2C - -// Get rows from other half over i2c -int i2c_transaction(void) { - int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; - - int err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_WRITE); - if (err) goto i2c_error; - - // start of matrix stored at 0x00 - err = i2c_master_write(0x00); - if (err) goto i2c_error; - - // Start read - err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_READ); - if (err) goto i2c_error; - - if (!err) { - int i; - for (i = 0; i < ROWS_PER_HAND-1; ++i) { - matrix[slaveOffset+i] = i2c_master_read(I2C_ACK); - } - matrix[slaveOffset+i] = i2c_master_read(I2C_NACK); - i2c_master_stop(); - } else { -i2c_error: // the cable is disconnceted, or something else went wrong - i2c_reset_state(); - return err; - } - - return 0; -} - -#else // USE_SERIAL - -int serial_transaction(void) { - int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; - - if (serial_update_buffers()) { - return 1; - } - - for (int i = 0; i < ROWS_PER_HAND; ++i) { - matrix[slaveOffset+i] = serial_slave_buffer[i]; - } - return 0; -} -#endif - -uint8_t matrix_scan(void) -{ - uint8_t ret = _matrix_scan(); - -#ifdef USE_I2C - if( i2c_transaction() ) { -#else // USE_SERIAL - if( serial_transaction() ) { -#endif - // turn on the indicator led when halves are disconnected - TXLED1; - - error_count++; - - if (error_count > ERROR_DISCONNECT_COUNT) { - // reset other half if disconnected - int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; - for (int i = 0; i < ROWS_PER_HAND; ++i) { - matrix[slaveOffset+i] = 0; - } - } - } else { - // turn off the indicator led on no error - TXLED0; - error_count = 0; - } - matrix_scan_quantum(); - return ret; -} - -void matrix_slave_scan(void) { - _matrix_scan(); - - int offset = (isLeftHand) ? 0 : ROWS_PER_HAND; - -#ifdef USE_I2C - for (int i = 0; i < ROWS_PER_HAND; ++i) { - i2c_slave_buffer[i] = matrix[offset+i]; - } -#else // USE_SERIAL - for (int i = 0; i < ROWS_PER_HAND; ++i) { - serial_slave_buffer[i] = matrix[offset+i]; - } -#endif - matrix_slave_scan_user(); -} - -bool matrix_is_modified(void) -{ - if (debouncing) return false; - return true; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ - return (matrix[row] & ((matrix_row_t)1<> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI - } -} - -static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) -{ - // Store last value of row prior to reading - matrix_row_t last_row_value = current_matrix[current_row]; - - // Clear data in matrix row - current_matrix[current_row] = 0; - - // Select row and wait for row selecton to stabilize - select_row(current_row); - wait_us(30); - - // For each col... - for(uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) { - - // Select the col pin to read (active low) - uint8_t pin = col_pins[col_index]; - uint8_t pin_state = (_SFR_IO8(pin >> 4) & _BV(pin & 0xF)); - - // Populate the matrix row with the state of the col pin - current_matrix[current_row] |= pin_state ? 0 : (ROW_SHIFTER << col_index); - } - - // Unselect row - unselect_row(current_row); - - return (last_row_value != current_matrix[current_row]); -} - -static void select_row(uint8_t row) -{ - uint8_t pin = row_pins[row]; - _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT - _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW -} - -static void unselect_row(uint8_t row) -{ - uint8_t pin = row_pins[row]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI -} - -static void unselect_rows(void) -{ - for(uint8_t x = 0; x < ROWS_PER_HAND; x++) { - uint8_t pin = row_pins[x]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI - } -} - -#elif (DIODE_DIRECTION == ROW2COL) - -static void init_rows(void) -{ - for(uint8_t x = 0; x < ROWS_PER_HAND; x++) { - uint8_t pin = row_pins[x]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI - } -} - -static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) -{ - bool matrix_changed = false; - - // Select col and wait for col selecton to stabilize - select_col(current_col); - wait_us(30); - - // For each row... - for(uint8_t row_index = 0; row_index < ROWS_PER_HAND; row_index++) - { - - // Store last value of row prior to reading - matrix_row_t last_row_value = current_matrix[row_index]; - - // Check row pin state - if ((_SFR_IO8(row_pins[row_index] >> 4) & _BV(row_pins[row_index] & 0xF)) == 0) - { - // Pin LO, set col bit - current_matrix[row_index] |= (ROW_SHIFTER << current_col); - } - else - { - // Pin HI, clear col bit - current_matrix[row_index] &= ~(ROW_SHIFTER << current_col); - } - - // Determine if the matrix changed state - if ((last_row_value != current_matrix[row_index]) && !(matrix_changed)) - { - matrix_changed = true; - } - } - - // Unselect col - unselect_col(current_col); - - return matrix_changed; -} - -static void select_col(uint8_t col) -{ - uint8_t pin = col_pins[col]; - _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT - _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW -} - -static void unselect_col(uint8_t col) -{ - uint8_t pin = col_pins[col]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI -} - -static void unselect_cols(void) -{ - for(uint8_t x = 0; x < MATRIX_COLS; x++) { - uint8_t pin = col_pins[x]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI - } -} - -#endif diff --git a/keyboards/lets_split/rev1/config.h b/keyboards/lets_split/rev1/config.h index c0e4d1fbc..a8d614915 100644 --- a/keyboards/lets_split/rev1/config.h +++ b/keyboards/lets_split/rev1/config.h @@ -16,10 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef REV1_CONFIG_H -#define REV1_CONFIG_H - -#include "config_common.h" +#pragma once /* USB Device descriptor parameter */ #define VENDOR_ID 0xFEED @@ -80,5 +77,3 @@ along with this program. If not, see . //#define NO_ACTION_ONESHOT //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION - -#endif diff --git a/keyboards/lets_split/rev1/rev1.h b/keyboards/lets_split/rev1/rev1.h index 073d83ef3..a43d4a25b 100644 --- a/keyboards/lets_split/rev1/rev1.h +++ b/keyboards/lets_split/rev1/rev1.h @@ -1,5 +1,4 @@ -#ifndef REV1_H -#define REV1_H +#pragma once #include "lets_split.h" @@ -26,5 +25,3 @@ } #define LAYOUT_ortho_4x12 LAYOUT - -#endif diff --git a/keyboards/lets_split/rev2/config.h b/keyboards/lets_split/rev2/config.h index 1ff25cd48..8844e5bb8 100644 --- a/keyboards/lets_split/rev2/config.h +++ b/keyboards/lets_split/rev2/config.h @@ -16,10 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef REV2_CONFIG_H -#define REV2_CONFIG_H - -#include "config_common.h" +#pragma once /* USB Device descriptor parameter */ #define VENDOR_ID 0xFEED @@ -80,6 +77,3 @@ along with this program. If not, see . //#define NO_ACTION_ONESHOT //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION - - -#endif diff --git a/keyboards/lets_split/rev2/rev2.h b/keyboards/lets_split/rev2/rev2.h index bf25ee856..34e64e89f 100644 --- a/keyboards/lets_split/rev2/rev2.h +++ b/keyboards/lets_split/rev2/rev2.h @@ -1,5 +1,4 @@ -#ifndef REV2_H -#define REV2_H +#pragma once #include "lets_split.h" @@ -58,5 +57,3 @@ #endif #define LAYOUT_ortho_4x12 LAYOUT - -#endif diff --git a/keyboards/lets_split/rules.mk b/keyboards/lets_split/rules.mk index 4cd972786..f9d1a0dad 100644 --- a/keyboards/lets_split/rules.mk +++ b/keyboards/lets_split/rules.mk @@ -1,11 +1,4 @@ -SRC += matrix.c \ - i2c.c \ - split_util.c \ - serial.c \ - ssd1306.c - # MCU name -#MCU = at90usb1287 MCU = atmega32u4 # Processor frequency. @@ -42,7 +35,7 @@ F_USB = $(F_CPU) # Bootloader # This definition is optional, and if your keyboard supports multiple bootloaders of -# different sizes, comment this out, and the correct address will be loaded +# different sizes, comment this out, and the correct address will be loaded # automatically (+60). See bootloader.mk for all options. BOOTLOADER = caterina @@ -64,13 +57,12 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. -SUBPROJECT_rev1 = yes -USE_I2C = yes +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. + # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend -CUSTOM_MATRIX = yes +SPLIT_KEYBOARD = yes LAYOUTS = ortho_4x12 diff --git a/keyboards/lets_split/serial.c b/keyboards/lets_split/serial.c deleted file mode 100644 index 74bcbb6bf..000000000 --- a/keyboards/lets_split/serial.c +++ /dev/null @@ -1,228 +0,0 @@ -/* - * WARNING: be careful changing this code, it is very timing dependent - */ - -#ifndef F_CPU -#define F_CPU 16000000 -#endif - -#include -#include -#include -#include -#include "serial.h" - -#ifndef USE_I2C - -// Serial pulse period in microseconds. Its probably a bad idea to lower this -// value. -#define SERIAL_DELAY 24 - -uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; -uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0}; - -#define SLAVE_DATA_CORRUPT (1<<0) -volatile uint8_t status = 0; - -inline static -void serial_delay(void) { - _delay_us(SERIAL_DELAY); -} - -inline static -void serial_output(void) { - SERIAL_PIN_DDR |= SERIAL_PIN_MASK; -} - -// make the serial pin an input with pull-up resistor -inline static -void serial_input(void) { - SERIAL_PIN_DDR &= ~SERIAL_PIN_MASK; - SERIAL_PIN_PORT |= SERIAL_PIN_MASK; -} - -inline static -uint8_t serial_read_pin(void) { - return !!(SERIAL_PIN_INPUT & SERIAL_PIN_MASK); -} - -inline static -void serial_low(void) { - SERIAL_PIN_PORT &= ~SERIAL_PIN_MASK; -} - -inline static -void serial_high(void) { - SERIAL_PIN_PORT |= SERIAL_PIN_MASK; -} - -void serial_master_init(void) { - serial_output(); - serial_high(); -} - -void serial_slave_init(void) { - serial_input(); - - // Enable INT0 - EIMSK |= _BV(INT0); - // Trigger on falling edge of INT0 - EICRA &= ~(_BV(ISC00) | _BV(ISC01)); -} - -// Used by the master to synchronize timing with the slave. -static -void sync_recv(void) { - serial_input(); - // This shouldn't hang if the slave disconnects because the - // serial line will float to high if the slave does disconnect. - while (!serial_read_pin()); - serial_delay(); -} - -// Used by the slave to send a synchronization signal to the master. -static -void sync_send(void) { - serial_output(); - - serial_low(); - serial_delay(); - - serial_high(); -} - -// Reads a byte from the serial line -static -uint8_t serial_read_byte(void) { - uint8_t byte = 0; - serial_input(); - for ( uint8_t i = 0; i < 8; ++i) { - byte = (byte << 1) | serial_read_pin(); - serial_delay(); - _delay_us(1); - } - - return byte; -} - -// Sends a byte with MSB ordering -static -void serial_write_byte(uint8_t data) { - uint8_t b = 8; - serial_output(); - while( b-- ) { - if(data & (1 << b)) { - serial_high(); - } else { - serial_low(); - } - serial_delay(); - } -} - -// interrupt handle to be used by the slave device -ISR(SERIAL_PIN_INTERRUPT) { - sync_send(); - - uint8_t checksum = 0; - for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) { - serial_write_byte(serial_slave_buffer[i]); - sync_send(); - checksum += serial_slave_buffer[i]; - } - serial_write_byte(checksum); - sync_send(); - - // wait for the sync to finish sending - serial_delay(); - - // read the middle of pulses - _delay_us(SERIAL_DELAY/2); - - uint8_t checksum_computed = 0; - for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) { - serial_master_buffer[i] = serial_read_byte(); - sync_send(); - checksum_computed += serial_master_buffer[i]; - } - uint8_t checksum_received = serial_read_byte(); - sync_send(); - - serial_input(); // end transaction - - if ( checksum_computed != checksum_received ) { - status |= SLAVE_DATA_CORRUPT; - } else { - status &= ~SLAVE_DATA_CORRUPT; - } -} - -inline -bool serial_slave_DATA_CORRUPT(void) { - return status & SLAVE_DATA_CORRUPT; -} - -// Copies the serial_slave_buffer to the master and sends the -// serial_master_buffer to the slave. -// -// Returns: -// 0 => no error -// 1 => slave did not respond -int serial_update_buffers(void) { - // this code is very time dependent, so we need to disable interrupts - cli(); - - // signal to the slave that we want to start a transaction - serial_output(); - serial_low(); - _delay_us(1); - - // wait for the slaves response - serial_input(); - serial_high(); - _delay_us(SERIAL_DELAY); - - // check if the slave is present - if (serial_read_pin()) { - // slave failed to pull the line low, assume not present - sei(); - return 1; - } - - // if the slave is present syncronize with it - sync_recv(); - - uint8_t checksum_computed = 0; - // receive data from the slave - for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) { - serial_slave_buffer[i] = serial_read_byte(); - sync_recv(); - checksum_computed += serial_slave_buffer[i]; - } - uint8_t checksum_received = serial_read_byte(); - sync_recv(); - - if (checksum_computed != checksum_received) { - sei(); - return 1; - } - - uint8_t checksum = 0; - // send data to the slave - for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) { - serial_write_byte(serial_master_buffer[i]); - sync_recv(); - checksum += serial_master_buffer[i]; - } - serial_write_byte(checksum); - sync_recv(); - - // always, release the line when not in use - serial_output(); - serial_high(); - - sei(); - return 0; -} - -#endif diff --git a/keyboards/lets_split/serial.h b/keyboards/lets_split/serial.h deleted file mode 100644 index 15fe4db7b..000000000 --- a/keyboards/lets_split/serial.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef MY_SERIAL_H -#define MY_SERIAL_H - -#include "config.h" -#include - -/* TODO: some defines for interrupt setup */ -#define SERIAL_PIN_DDR DDRD -#define SERIAL_PIN_PORT PORTD -#define SERIAL_PIN_INPUT PIND -#define SERIAL_PIN_MASK _BV(PD0) -#define SERIAL_PIN_INTERRUPT INT0_vect - -#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 -#define SERIAL_MASTER_BUFFER_LENGTH 1 - -// Buffers for master - slave communication -extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH]; -extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH]; - -void serial_master_init(void); -void serial_slave_init(void); -int serial_update_buffers(void); -bool serial_slave_data_corrupt(void); - -#endif diff --git a/keyboards/lets_split/sockets/config.h b/keyboards/lets_split/sockets/config.h index a45cdd13b..10d0c997e 100644 --- a/keyboards/lets_split/sockets/config.h +++ b/keyboards/lets_split/sockets/config.h @@ -16,10 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef SOCKETS_CONFIG_H -#define SOCKETS_CONFIG_H - -#include "config_common.h" +#pragma once /* USB Device descriptor parameter */ #define VENDOR_ID 0xBEE5 @@ -85,6 +82,3 @@ along with this program. If not, see . //#define NO_ACTION_ONESHOT //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION - - -#endif diff --git a/keyboards/lets_split/sockets/sockets.h b/keyboards/lets_split/sockets/sockets.h index bd1019263..a79770bac 100644 --- a/keyboards/lets_split/sockets/sockets.h +++ b/keyboards/lets_split/sockets/sockets.h @@ -1,5 +1,4 @@ -#ifndef SOCKETS_H -#define SOCKETS_H +#pragma once #define DISABLE_JTAG // The keyboard uses PF4 and PF7, which are used by JTAG. #include "lets_split.h" @@ -59,5 +58,3 @@ #endif #define LAYOUT_ortho_4x12 LAYOUT - -#endif diff --git a/keyboards/lets_split/split_util.c b/keyboards/lets_split/split_util.c deleted file mode 100644 index 346cbc908..000000000 --- a/keyboards/lets_split/split_util.c +++ /dev/null @@ -1,86 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include "split_util.h" -#include "matrix.h" -#include "keyboard.h" -#include "config.h" -#include "timer.h" - -#ifdef USE_I2C -# include "i2c.h" -#else -# include "serial.h" -#endif - -volatile bool isLeftHand = true; - -static void setup_handedness(void) { - #ifdef EE_HANDS - isLeftHand = eeprom_read_byte(EECONFIG_HANDEDNESS); - #else - // I2C_MASTER_RIGHT is deprecated, use MASTER_RIGHT instead, since this works for both serial and i2c - #if defined(I2C_MASTER_RIGHT) || defined(MASTER_RIGHT) - isLeftHand = !has_usb(); - #else - isLeftHand = has_usb(); - #endif - #endif -} - -static void keyboard_master_setup(void) { -#ifdef USE_I2C - i2c_master_init(); -#ifdef SSD1306OLED - matrix_master_OLED_init (); -#endif -#else - serial_master_init(); -#endif -} - -static void keyboard_slave_setup(void) { - timer_init(); -#ifdef USE_I2C - i2c_slave_init(SLAVE_I2C_ADDRESS); -#else - serial_slave_init(); -#endif -} - -bool has_usb(void) { - USBCON |= (1 << OTGPADE); //enables VBUS pad - _delay_us(5); - return (USBSTA & (1< -#include "eeconfig.h" - -#define SLAVE_I2C_ADDRESS 0x32 - -extern volatile bool isLeftHand; - -// slave version of matix scan, defined in matrix.c -void matrix_slave_scan(void); - -void split_keyboard_setup(void); -bool has_usb(void); -void keyboard_slave_loop(void); - -void matrix_master_OLED_init (void); - -#endif From 59b2be6200e13166cf69ae04aa7a05ec5e837d79 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Wed, 5 Dec 2018 10:28:06 -0800 Subject: [PATCH 620/788] Re-order feature list in sidebar (#4555) Specifically, moved the shifted keycodes to the top of the 'Feature' list, so it's more visible. This way, all of the keycodes are at the top of the list, rather than having the shifted keys at the bottom, so they should be easier to find since they're all in one place. --- docs/_sidebar.md | 2 +- docs/_summary.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_sidebar.md b/docs/_sidebar.md index 1fb5398d9..6338d6912 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -43,6 +43,7 @@ * [Features](features.md) * [Basic Keycodes](keycodes_basic.md) + * [US ANSI Shifted Keys](keycodes_us_ansi_shifted.md) * [Quantum Keycodes](quantum_keycodes.md) * [Advanced Keycodes](feature_advanced_keycodes.md) * [Audio](feature_audio.md) @@ -74,7 +75,6 @@ * [Thermal Printer](feature_thermal_printer.md) * [Unicode](feature_unicode.md) * [Userspace](feature_userspace.md) - * [US ANSI Shifted Keys](keycodes_us_ansi_shifted.md) * For Makers and Modders * [Hand Wiring Guide](hand_wire.md) diff --git a/docs/_summary.md b/docs/_summary.md index 1fb5398d9..6338d6912 100644 --- a/docs/_summary.md +++ b/docs/_summary.md @@ -43,6 +43,7 @@ * [Features](features.md) * [Basic Keycodes](keycodes_basic.md) + * [US ANSI Shifted Keys](keycodes_us_ansi_shifted.md) * [Quantum Keycodes](quantum_keycodes.md) * [Advanced Keycodes](feature_advanced_keycodes.md) * [Audio](feature_audio.md) @@ -74,7 +75,6 @@ * [Thermal Printer](feature_thermal_printer.md) * [Unicode](feature_unicode.md) * [Userspace](feature_userspace.md) - * [US ANSI Shifted Keys](keycodes_us_ansi_shifted.md) * For Makers and Modders * [Hand Wiring Guide](hand_wire.md) From ff3369ac5d52af5ad046cd526d13963fda5cab89 Mon Sep 17 00:00:00 2001 From: Vyolle <44031868+Vyolle@users.noreply.github.com> Date: Wed, 5 Dec 2018 14:13:52 -0600 Subject: [PATCH 621/788] Changed location of mouse 3, and arrow keys (#4556) --- keyboards/iris/keymaps/vyolle/keymap.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/keyboards/iris/keymaps/vyolle/keymap.c b/keyboards/iris/keymaps/vyolle/keymap.c index 66bcaa385..2479f0892 100644 --- a/keyboards/iris/keymaps/vyolle/keymap.c +++ b/keyboards/iris/keymaps/vyolle/keymap.c @@ -38,9 +38,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ KC_VOLU, KC_HOME, KC_LEFT, KC_UP, KC_RGHT, KC_PGUP, KC_WH_U, KC_MS_L, KC_MS_U, KC_MS_R, XXXXXXX, KC_BTN4, //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ - KC_VOLD, KC_END, KC_INS, KC_DOWN, KC_DEL, KC_PGDN, KC_MUTE, XXXXXXX, KC_WH_D, KC_WH_L, KC_MS_D, KC_WH_R, XXXXXXX, KC_BTN5, + KC_VOLD, KC_END, KC_INS, KC_DOWN, KC_DEL, KC_PGDN, KC_MUTE, XXXXXXX, KC_WH_D, KC_WH_L, KC_MS_D, KC_WH_R, KC_BTN3, KC_BTN5, //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ - _______, _______, _______, KC_BTN1, KC_BTN2, KC_BTN3 + _______, _______, _______, KC_BTN1, KC_BTN2, _______ // └────────┴────────┴────────┘ └────────┴────────┴────────┘ ), @@ -50,9 +50,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ KC_TILD, KC_PIPE, KC_LT, KC_GT, _______, _______, _______, _______, _______, _______, _______, _______, //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ - KC_BSLASH,KC_LCBR, KC_RCBR, KC_MINUS, KC_LBRC, KC_RBRC, _______, _______, _______, _______, _______, _______, + KC_BSLASH,KC_LCBR, KC_RCBR, KC_MINUS, KC_LBRC, KC_RBRC, _______, KC_LEFT, KC_UP, KC_RGHT, _______, _______, //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ - KC_COLN, KC_UNDS, KC_LPRN, KC_PLUS, KC_RPRN, KC_EQL, KC_UNDO, _______, _______, _______, _______, _______, _______, _______, + KC_COLN, KC_UNDS, KC_LPRN, KC_PLUS, KC_RPRN, KC_EQL, KC_UNDO, _______, _______, _______, KC_DOWN, _______, _______, _______, //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ KC_CUT, KC_COPY, KC_PSTE, _______, _______, _______ // └────────┴────────┴────────┘ └────────┴────────┴────────┘ From 161afe2e54e14b210b30539bd8a100471bcdf2c3 Mon Sep 17 00:00:00 2001 From: zvecr Date: Wed, 5 Dec 2018 21:12:07 +0000 Subject: [PATCH 622/788] Keyboard: Fixes for superseded audio and default layer functionality (#4557) --- keyboards/lets_split/keymaps/default/config.h | 13 ++-- keyboards/lets_split/keymaps/default/keymap.c | 70 +++---------------- keyboards/lets_split/keymaps/default/rules.mk | 3 - 3 files changed, 15 insertions(+), 71 deletions(-) diff --git a/keyboards/lets_split/keymaps/default/config.h b/keyboards/lets_split/keymaps/default/config.h index 5a6261c4f..60e23f816 100644 --- a/keyboards/lets_split/keymaps/default/config.h +++ b/keyboards/lets_split/keymaps/default/config.h @@ -18,20 +18,19 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H +#pragma once -#include "../../config.h" + // place overrides here +#define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \ + SONG(COLEMAK_SOUND), \ + SONG(DVORAK_SOUND) \ + } /* Use I2C or Serial, not both */ - #define USE_SERIAL // #define USE_I2C /* Select hand configuration */ - #define MASTER_LEFT // #define MASTER_RIGHT // #define EE_HANDS - -#endif diff --git a/keyboards/lets_split/keymaps/default/keymap.c b/keyboards/lets_split/keymaps/default/keymap.c index f78278184..05f9bda8d 100644 --- a/keyboards/lets_split/keymaps/default/keymap.c +++ b/keyboards/lets_split/keymaps/default/keymap.c @@ -1,7 +1,5 @@ #include QMK_KEYBOARD_H -extern keymap_config_t keymap_config; - // Each layer gets a name for readability, which is then used in the keymap matrix below. // The underscores don't mean anything - you can have a layer called STUFF or any other name. // Layer names don't all need to be of the same length, obviously, and you can also skip them @@ -16,15 +14,12 @@ extern keymap_config_t keymap_config; enum custom_keycodes { QWERTY = SAFE_RANGE, COLEMAK, - DVORAK, - LOWER, - RAISE, - ADJUST, + DVORAK }; -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO +#define LOWER MO(_LOWER) +#define RAISE MO(_RAISE) +#define ADJUST MO(_ADJUST) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Qwerty @@ -138,74 +133,27 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; -#ifdef AUDIO_ENABLE -float tone_qwerty[][2] = SONG(QWERTY_SOUND); -float tone_dvorak[][2] = SONG(DVORAK_SOUND); -float tone_colemak[][2] = SONG(COLEMAK_SOUND); -#endif - -void persistent_default_layer_set(uint16_t default_layer) { - eeconfig_update_default_layer(default_layer); - default_layer_set(default_layer); +uint32_t layer_state_set_user(uint32_t state) { + return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST); } bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch (keycode) { case QWERTY: if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_qwerty); - #endif - persistent_default_layer_set(1UL<<_QWERTY); + set_single_persistent_default_layer(_QWERTY); } return false; - break; case COLEMAK: if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_colemak); - #endif - persistent_default_layer_set(1UL<<_COLEMAK); + set_single_persistent_default_layer(_COLEMAK); } return false; - break; case DVORAK: if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_dvorak); - #endif - persistent_default_layer_set(1UL<<_DVORAK); + set_single_persistent_default_layer(_DVORAK); } return false; - break; - case LOWER: - if (record->event.pressed) { - layer_on(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case RAISE: - if (record->event.pressed) { - layer_on(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case ADJUST: - if (record->event.pressed) { - layer_on(_ADJUST); - } else { - layer_off(_ADJUST); - } - return false; - break; } return true; } diff --git a/keyboards/lets_split/keymaps/default/rules.mk b/keyboards/lets_split/keymaps/default/rules.mk index 457a3d01d..e69de29bb 100644 --- a/keyboards/lets_split/keymaps/default/rules.mk +++ b/keyboards/lets_split/keymaps/default/rules.mk @@ -1,3 +0,0 @@ -ifndef QUANTUM_DIR - include ../../../../Makefile -endif From 368de26996fbd54eefbf54c567a90bf0d81e20c7 Mon Sep 17 00:00:00 2001 From: zvecr Date: Wed, 5 Dec 2018 21:56:43 +0000 Subject: [PATCH 623/788] Keyboard: Initial i75 port (#4553) * Initial i75 port - currently supporting promicro and teensy2 * Initial i75 port - review fixes --- keyboards/40percentclub/i75/config.h | 192 ++++++++++++++++++ keyboards/40percentclub/i75/i75.c | 43 ++++ keyboards/40percentclub/i75/i75.h | 24 +++ keyboards/40percentclub/i75/info.json | 12 ++ .../i75/keymaps/default/config.h | 19 ++ .../i75/keymaps/default/keymap.c | 66 ++++++ .../i75/keymaps/default/readme.md | 1 + keyboards/40percentclub/i75/promicro/config.h | 40 ++++ .../40percentclub/i75/promicro/promicro.c | 16 ++ .../40percentclub/i75/promicro/promicro.h | 47 +++++ keyboards/40percentclub/i75/promicro/rules.mk | 58 ++++++ keyboards/40percentclub/i75/readme.md | 28 +++ keyboards/40percentclub/i75/rules.mk | 23 +++ keyboards/40percentclub/i75/teensy2/config.h | 40 ++++ keyboards/40percentclub/i75/teensy2/rules.mk | 58 ++++++ keyboards/40percentclub/i75/teensy2/teensy2.c | 16 ++ keyboards/40percentclub/i75/teensy2/teensy2.h | 47 +++++ 17 files changed, 730 insertions(+) create mode 100644 keyboards/40percentclub/i75/config.h create mode 100644 keyboards/40percentclub/i75/i75.c create mode 100644 keyboards/40percentclub/i75/i75.h create mode 100644 keyboards/40percentclub/i75/info.json create mode 100644 keyboards/40percentclub/i75/keymaps/default/config.h create mode 100644 keyboards/40percentclub/i75/keymaps/default/keymap.c create mode 100644 keyboards/40percentclub/i75/keymaps/default/readme.md create mode 100644 keyboards/40percentclub/i75/promicro/config.h create mode 100644 keyboards/40percentclub/i75/promicro/promicro.c create mode 100644 keyboards/40percentclub/i75/promicro/promicro.h create mode 100644 keyboards/40percentclub/i75/promicro/rules.mk create mode 100644 keyboards/40percentclub/i75/readme.md create mode 100644 keyboards/40percentclub/i75/rules.mk create mode 100644 keyboards/40percentclub/i75/teensy2/config.h create mode 100644 keyboards/40percentclub/i75/teensy2/rules.mk create mode 100644 keyboards/40percentclub/i75/teensy2/teensy2.c create mode 100644 keyboards/40percentclub/i75/teensy2/teensy2.h diff --git a/keyboards/40percentclub/i75/config.h b/keyboards/40percentclub/i75/config.h new file mode 100644 index 000000000..bc032ba45 --- /dev/null +++ b/keyboards/40percentclub/i75/config.h @@ -0,0 +1,192 @@ +/* Copyright 2018 + * + * 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 . + */ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0A0C +#define DEVICE_VER 0x0175 +#define MANUFACTURER di0ib +#define PRODUCT i75 +#define DESCRIPTION i75 15x5 ortholinear keyboard + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* 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 userful 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 + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * 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 + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +//#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ + +/* Bootmagic Lite key configuration */ +// #define BOOTMAGIC_LITE_ROW 0 +// #define BOOTMAGIC_LITE_COLUMN 0 diff --git a/keyboards/40percentclub/i75/i75.c b/keyboards/40percentclub/i75/i75.c new file mode 100644 index 000000000..7efe3b454 --- /dev/null +++ b/keyboards/40percentclub/i75/i75.c @@ -0,0 +1,43 @@ +/* Copyright 2018 + * + * 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 . + */ +#include "i75.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + + led_set_user(usb_led); +} diff --git a/keyboards/40percentclub/i75/i75.h b/keyboards/40percentclub/i75/i75.h new file mode 100644 index 000000000..a31c9f6e6 --- /dev/null +++ b/keyboards/40percentclub/i75/i75.h @@ -0,0 +1,24 @@ +/* Copyright 2018 + * + * 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 . + */ +#pragma once + +#include "quantum.h" + +#ifdef KEYBOARD_40percentclub_i75_promicro + #include "promicro.h" +#elif KEYBOARD_40percentclub_i75_teensy2 + #include "teensy2.h" +#endif diff --git a/keyboards/40percentclub/i75/info.json b/keyboards/40percentclub/i75/info.json new file mode 100644 index 000000000..033bf02bc --- /dev/null +++ b/keyboards/40percentclub/i75/info.json @@ -0,0 +1,12 @@ +{ + "keyboard_name": "i75", + "url": "", + "maintainer": "qmk", + "width": 15, + "height": 5, + "layouts": { + "LAYOUT_ortho_5x15": { + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":6, "y":1}, {"x":7, "y":1}, {"x":8, "y":1}, {"x":9, "y":1}, {"x":10, "y":1}, {"x":11, "y":1}, {"x":12, "y":1}, {"x":13, "y":1}, {"x":14, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2}, {"x":5, "y":2}, {"x":6, "y":2}, {"x":7, "y":2}, {"x":8, "y":2}, {"x":9, "y":2}, {"x":10, "y":2}, {"x":11, "y":2}, {"x":12, "y":2}, {"x":13, "y":2}, {"x":14, "y":2}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":4, "y":3}, {"x":5, "y":3}, {"x":6, "y":3}, {"x":7, "y":3}, {"x":8, "y":3}, {"x":9, "y":3}, {"x":10, "y":3}, {"x":11, "y":3}, {"x":12, "y":3}, {"x":13, "y":3}, {"x":14, "y":3}, {"x":0, "y":4}, {"x":1, "y":4}, {"x":2, "y":4}, {"x":3, "y":4}, {"x":4, "y":4}, {"x":5, "y":4}, {"x":6, "y":4}, {"x":7, "y":4}, {"x":8, "y":4}, {"x":9, "y":4}, {"x":10, "y":4}, {"x":11, "y":4}, {"x":12, "y":4}, {"x":13, "y":4}, {"x":14, "y":4}] + } + } +} diff --git a/keyboards/40percentclub/i75/keymaps/default/config.h b/keyboards/40percentclub/i75/keymaps/default/config.h new file mode 100644 index 000000000..6173b6327 --- /dev/null +++ b/keyboards/40percentclub/i75/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 + * + * 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 . + */ + +#pragma once + +// place overrides here diff --git a/keyboards/40percentclub/i75/keymaps/default/keymap.c b/keyboards/40percentclub/i75/keymaps/default/keymap.c new file mode 100644 index 000000000..3054f8ebe --- /dev/null +++ b/keyboards/40percentclub/i75/keymaps/default/keymap.c @@ -0,0 +1,66 @@ +/* Copyright 2018 + * + * 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 . + */ +#include QMK_KEYBOARD_H + +// Defines the keycodes used by our macros in process_record_user +enum custom_keycodes { + QMKBEST = SAFE_RANGE, + QMKURL +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_ortho_5x15( \ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, KC_DEL, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_ENT, KC_PGUP, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_RSFT, KC_UP, KC_PGDN, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RCTL, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT \ + ), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QMKBEST: + if (record->event.pressed) { + // when keycode QMKBEST is pressed + SEND_STRING("QMK is the best thing ever!"); + } else { + // when keycode QMKBEST is released + } + break; + case QMKURL: + if (record->event.pressed) { + // when keycode QMKURL is pressed + SEND_STRING("https://qmk.fm/" SS_TAP(X_ENTER)); + } else { + // when keycode QMKURL is released + } + break; + } + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/40percentclub/i75/keymaps/default/readme.md b/keyboards/40percentclub/i75/keymaps/default/readme.md new file mode 100644 index 000000000..4d054181f --- /dev/null +++ b/keyboards/40percentclub/i75/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for i75 diff --git a/keyboards/40percentclub/i75/promicro/config.h b/keyboards/40percentclub/i75/promicro/config.h new file mode 100644 index 000000000..bc9146328 --- /dev/null +++ b/keyboards/40percentclub/i75/promicro/config.h @@ -0,0 +1,40 @@ +/* Copyright 2018 + * + * 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 . + */ + +#pragma once + +#include "config_common.h" + +/* key matrix size */ +#define MATRIX_ROWS 9 +#define MATRIX_COLS 9 + +/* + * 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 { B4, E6, D7, C6, D4, D0, D1, D2, D3 } +#define MATRIX_COL_PINS { B5, B6, B2, B3, B1, F7, F6, F5, F4 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW diff --git a/keyboards/40percentclub/i75/promicro/promicro.c b/keyboards/40percentclub/i75/promicro/promicro.c new file mode 100644 index 000000000..28684e714 --- /dev/null +++ b/keyboards/40percentclub/i75/promicro/promicro.c @@ -0,0 +1,16 @@ +/* Copyright 2018 + * + * 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 . + */ +#include "i75.h" diff --git a/keyboards/40percentclub/i75/promicro/promicro.h b/keyboards/40percentclub/i75/promicro/promicro.h new file mode 100644 index 000000000..29394855a --- /dev/null +++ b/keyboards/40percentclub/i75/promicro/promicro.h @@ -0,0 +1,47 @@ +/* Copyright 2018 + * + * 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 . + */ + +#pragma once + +#include "i75.h" +#include "quantum.h" + +/* This a shortcut to help you visually see your layout. + * + * The first section contains all of the arguments representing the physical + * layout of the board and position of the keys. + * + * The second converts the arguments into a two-dimensional array which + * represents the switch matrix. + */ +#define LAYOUT_ortho_5x15( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K10, K11, K12, K13, K14, K15, \ + K16, K17, K18, K20, K21, K22, K23, K24, K25, K26, K27, K28, K30, K31, K32, \ + K33, K34, K35, K36, K37, K38, K40, K41, K42, K43, K44, K45, K46, K47, K48, \ + K50, K51, K52, K53, K54, K55, K56, K57, K58, K60, K61, K62, K63, K64, K65, \ + K66, K67, K68, K70, K71, K72, K73, K74, K75, K76, K77, K78, K80, K81, K82 \ +) \ +{ \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08 }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18 }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28 }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38 }, \ + { K40, K41, K42, K43, K44, K45, K46, K47, K48 }, \ + { K50, K51, K52, K53, K54, K55, K56, K57, K58 }, \ + { K60, K61, K62, K63, K64, K65, K66, K67, K68 }, \ + { K70, K71, K72, K73, K74, K75, K76, K77, K78 }, \ + { K80, K81, K82 } \ +} diff --git a/keyboards/40percentclub/i75/promicro/rules.mk b/keyboards/40percentclub/i75/promicro/rules.mk new file mode 100644 index 000000000..dc6f19623 --- /dev/null +++ b/keyboards/40percentclub/i75/promicro/rules.mk @@ -0,0 +1,58 @@ +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = caterina + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 diff --git a/keyboards/40percentclub/i75/readme.md b/keyboards/40percentclub/i75/readme.md new file mode 100644 index 000000000..9bdad68ad --- /dev/null +++ b/keyboards/40percentclub/i75/readme.md @@ -0,0 +1,28 @@ +# i75 + +![i75](https://1.bp.blogspot.com/-eRSwPnvgliI/WCYQ-aYihoI/AAAAAAAB_Bc/a7i1Envc1FYiEHeqvyHw80VxTAnafDsPgCLcB/s320/IMG_20161003_084555.jpg) +=== + +5x15 grid layout, multiple controllers supported +- Pro Micro +- PJRC Teensy 2.0 +- PJRC Teensy LC/3.2 (**NB: Not currently ported**) + +The matrix is a 9x9 grid. This uses all of the available pins on the Pro Micro. The other controllers have pins left over. The serial pins and pins connected to LEDs were avoided if possible. + +* [The original TMK firmware](https://github.com/di0ib/tmk_keyboard/tree/master/keyboard/i75_ProMicro) + +Keyboard Maintainer: QMK Community +Hardware Supported: i75 PCB +Hardware Availability: [i75 project on 40% Keyboards](http://www.40percent.club/2016/11/i75.html) + +Make example for this keyboard (after setting up your build environment): + + make 40percentclub/i75:default + +If you would like to use one of the alternative controllers: + + make 40percentclub/i75/promicro:default + make 40percentclub/i75/teensy2:default + +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). diff --git a/keyboards/40percentclub/i75/rules.mk b/keyboards/40percentclub/i75/rules.mk new file mode 100644 index 000000000..6f79143a1 --- /dev/null +++ b/keyboards/40percentclub/i75/rules.mk @@ -0,0 +1,23 @@ +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = no # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) + +LAYOUTS = ortho_5x15 +DEFAULT_FOLDER = 40percentclub/i75/promicro diff --git a/keyboards/40percentclub/i75/teensy2/config.h b/keyboards/40percentclub/i75/teensy2/config.h new file mode 100644 index 000000000..fdbde8d64 --- /dev/null +++ b/keyboards/40percentclub/i75/teensy2/config.h @@ -0,0 +1,40 @@ +/* Copyright 2018 + * + * 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 . + */ + +#pragma once + +#include "config_common.h" + +/* key matrix size */ +#define MATRIX_ROWS 9 +#define MATRIX_COLS 9 + +/* + * 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 { D3, D2, D1, D0, B7, B3, B2, B1, B0 } +#define MATRIX_COL_PINS { C6, C7, D6, D7, B5, B6, F7, F6, F5 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW diff --git a/keyboards/40percentclub/i75/teensy2/rules.mk b/keyboards/40percentclub/i75/teensy2/rules.mk new file mode 100644 index 000000000..3fb7c7e5a --- /dev/null +++ b/keyboards/40percentclub/i75/teensy2/rules.mk @@ -0,0 +1,58 @@ +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = halfkay + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 diff --git a/keyboards/40percentclub/i75/teensy2/teensy2.c b/keyboards/40percentclub/i75/teensy2/teensy2.c new file mode 100644 index 000000000..28684e714 --- /dev/null +++ b/keyboards/40percentclub/i75/teensy2/teensy2.c @@ -0,0 +1,16 @@ +/* Copyright 2018 + * + * 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 . + */ +#include "i75.h" diff --git a/keyboards/40percentclub/i75/teensy2/teensy2.h b/keyboards/40percentclub/i75/teensy2/teensy2.h new file mode 100644 index 000000000..29394855a --- /dev/null +++ b/keyboards/40percentclub/i75/teensy2/teensy2.h @@ -0,0 +1,47 @@ +/* Copyright 2018 + * + * 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 . + */ + +#pragma once + +#include "i75.h" +#include "quantum.h" + +/* This a shortcut to help you visually see your layout. + * + * The first section contains all of the arguments representing the physical + * layout of the board and position of the keys. + * + * The second converts the arguments into a two-dimensional array which + * represents the switch matrix. + */ +#define LAYOUT_ortho_5x15( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K10, K11, K12, K13, K14, K15, \ + K16, K17, K18, K20, K21, K22, K23, K24, K25, K26, K27, K28, K30, K31, K32, \ + K33, K34, K35, K36, K37, K38, K40, K41, K42, K43, K44, K45, K46, K47, K48, \ + K50, K51, K52, K53, K54, K55, K56, K57, K58, K60, K61, K62, K63, K64, K65, \ + K66, K67, K68, K70, K71, K72, K73, K74, K75, K76, K77, K78, K80, K81, K82 \ +) \ +{ \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08 }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18 }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28 }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38 }, \ + { K40, K41, K42, K43, K44, K45, K46, K47, K48 }, \ + { K50, K51, K52, K53, K54, K55, K56, K57, K58 }, \ + { K60, K61, K62, K63, K64, K65, K66, K67, K68 }, \ + { K70, K71, K72, K73, K74, K75, K76, K77, K78 }, \ + { K80, K81, K82 } \ +} From 04de0533b8559c5e8d30508a4a4a786b327d970c Mon Sep 17 00:00:00 2001 From: jtcarrasco <5018598+jtcarrasco@users.noreply.github.com> Date: Wed, 5 Dec 2018 15:13:31 -0800 Subject: [PATCH 624/788] Keymap: Jtcarrasco (#4513) * my XD75 builds for idobo and XD75 these are my xd75 layouts for the 2 versions of the board * clearing of free space spring cleaning * additional cleaning more spring cleaning * removed lighting commands don't need lighting on the idobo board so removal of such commands to keep the sizing down * update for readme.md * Update config.h * commiting with keymap erros on idobo for review * syntax fix for idobo and xd75 revok75, addition of del key switch on fn layer * config edit to config user and keymap QMK_KEYBOARD_H * update to vol controls for both idobo and xd75 for revok75 keymap * filename changes --- keyboards/idobo/keymaps/revok75/config.h | 15 ++++ keyboards/idobo/keymaps/revok75/keymap.c | 90 +++++++++++++++++++++++ keyboards/idobo/keymaps/revok75/readme.md | 1 + keyboards/idobo/keymaps/revok75/rules.mk | 14 ++++ keyboards/xd75/keymaps/revok75/config.h | 20 +++++ keyboards/xd75/keymaps/revok75/keymap.c | 90 +++++++++++++++++++++++ keyboards/xd75/keymaps/revok75/readme.md | 1 + keyboards/xd75/keymaps/revok75/rules.mk | 18 +++++ 8 files changed, 249 insertions(+) create mode 100644 keyboards/idobo/keymaps/revok75/config.h create mode 100644 keyboards/idobo/keymaps/revok75/keymap.c create mode 100644 keyboards/idobo/keymaps/revok75/readme.md create mode 100644 keyboards/idobo/keymaps/revok75/rules.mk create mode 100644 keyboards/xd75/keymaps/revok75/config.h create mode 100644 keyboards/xd75/keymaps/revok75/keymap.c create mode 100644 keyboards/xd75/keymaps/revok75/readme.md create mode 100644 keyboards/xd75/keymaps/revok75/rules.mk diff --git a/keyboards/idobo/keymaps/revok75/config.h b/keyboards/idobo/keymaps/revok75/config.h new file mode 100644 index 000000000..f5c465988 --- /dev/null +++ b/keyboards/idobo/keymaps/revok75/config.h @@ -0,0 +1,15 @@ +/* Copyright 2017 Benjamin Kesselring + * + * 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 . + */ diff --git a/keyboards/idobo/keymaps/revok75/keymap.c b/keyboards/idobo/keymaps/revok75/keymap.c new file mode 100644 index 000000000..a38024032 --- /dev/null +++ b/keyboards/idobo/keymaps/revok75/keymap.c @@ -0,0 +1,90 @@ +/* Copyright 2017 Wunder + * + * 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 . + */ +#include QMK_KEYBOARD_H + +// Layer shorthand +#define _QW_M 0 +#define _QW_W 1 +#define _FN 2 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* QWERTY-Mac + * .--------------------------------------------------------------------------------------------------------------------------------------. + * | ESC | 1 | 2 | 3 | 4 | % | 6 | 7 | 8 | 9 | 0 | - | = | Cut | BACKSP | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------| + * | TAB | Q | W | E | R | T | Y | U | I | O | P | { | } | Copy | Paste | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------+--------| + * | CAP LK | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | ENTER | REF | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------------------------+--------| + * | LSHIFT | Z | X | C | V | B | N | M | , | . | / | \ | RSHIFT| UP | SAVE | + * |--------+--------+--------+--------+--------+-----------------+--------+--------+--------+--------+-----------------+--------+--------| + * | LALT | LGUI | LALT | FIND | CMD T | SPACE | SPACE | ALFRED | FN-MO | RALT | RGUI | RCTRL | LEFT | DOWN | RIGHT | + * '--------------------------------------------------------------------------------------------------------------------------------------' + */ + + [_QW_M] = LAYOUT_ortho_5x15( /* QWERTY MAC*/ + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, LGUI(KC_X), KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LCBR, KC_RCBR, LGUI(KC_C), LGUI(KC_V), \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, LGUI(KC_R), KC_NO, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_BSLS, KC_RSFT, KC_UP, LGUI(KC_S), \ + KC_LCTL, KC_LALT, KC_LGUI, LGUI(KC_F), LGUI(KC_T), KC_SPC, KC_NO, LALT(KC_SPACE), MO(_FN), KC_RGUI, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT \ + ), + + /* QWERTY-Win + * .--------------------------------------------------------------------------------------------------------------------------------------. + * | ESC | 1 | 2 | 3 | 4 | % | 6 | 7 | 8 | 9 | 0 | - | = | Cut | BACKSP | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------| + * | TAB | Q | W | E | R | T | Y | U | I | O | P | { | } | Copy | Paste | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------+--------| + * | CAP LK | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | ENTER | REF | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------------------------+--------| + * | LSHIFT | Z | X | C | V | B | N | M | , | . | / | \ | RSHIFT | UP | SAVE | + * |--------+--------+--------+--------+--------+-----------------+--------+--------+--------+--------+-----------------+--------+--------| + * | LALT | LGUI | LALT | FIND | CMD T | SPACE | SPACE | START | FN-MO | RALT | RGUI | RCTRL | LEFT | DOWN | RIGHT | + * '--------------------------------------------------------------------------------------------------------------------------------------' + */ + + [_QW_W] = LAYOUT_ortho_5x15( /* QWERTY WIN*/ + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, LCTL(KC_X), KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LCBR, KC_RCBR, LCTL(KC_C), LCTL(KC_V), \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, LCTL(KC_R), KC_NO, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_BSLS, KC_RSFT, KC_UP, LCTL(KC_S), \ + KC_LCTL, KC_LALT, KC_LGUI, LCTL(KC_F), LCTL(KC_T), KC_SPC, KC_NO, LCTL(KC_GESC), MO(_FN), KC_RGUI, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT \ + ), + + /* FUNCTION + * .--------------------------------------------------------------------------------------------------------------------------------------. + * | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | VOLDN | VOLUP | MUTE | DEL | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------| + * | TAB | - | WIN | - | - | RGB_TOG| - | - | OPTION | RESET | - | [ | ] | - | - | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------+--------| + * | CAP LK | MAC | RAINBOW| PLAIN | - | - | - | - | - | - | ; | ' | ENTER | ENTER | REF | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------------------------+--------| + * | LSHIFT | INC | DEC | HUE I | HUE D | SAT I | SAT D | - | - | . | / | \ | RSHIFT| HOME | SAVE | + * |--------+--------+--------+--------+--------+-----------------+--------+--------+--------+--------+-----------------+--------+--------| + * | LALT | LGUI | LALT | FIND | CMD T | SPACE | SPACE | ALFRED | FN-MO | RALT | RGUI | RCTRL | PGUP | END | PGDN | + * '--------------------------------------------------------------------------------------------------------------------------------------' + */ + + [_FN] = LAYOUT_ortho_5x15( /* OSLAYOUT + NUMPAD + MEDIA + LIGHTING */ + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_VOLD, KC_VOLU, KC_MUTE, KC_DEL, \ + KC_TRNS, KC_NO, DF(_QW_W), KC_NO, KC_NO, RGB_TOG, KC_NO, KC_NO, KC_RALT, RESET, KC_NO, KC_LBRC, KC_RBRC, KC_TRNS, KC_TRNS, \ + KC_TRNS, DF(_QW_M), RGB_MODE_RAINBOW, RGB_MODE_PLAIN, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, RGB_VAI, RGB_VAD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, KC_NO, KC_NO, KC_DOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_END, KC_PGDN \ + ), +}; diff --git a/keyboards/idobo/keymaps/revok75/readme.md b/keyboards/idobo/keymaps/revok75/readme.md new file mode 100644 index 000000000..780c5401c --- /dev/null +++ b/keyboards/idobo/keymaps/revok75/readme.md @@ -0,0 +1 @@ +# The default keymap for Revok 75 --idobo version diff --git a/keyboards/idobo/keymaps/revok75/rules.mk b/keyboards/idobo/keymaps/revok75/rules.mk new file mode 100644 index 000000000..7efceba50 --- /dev/null +++ b/keyboards/idobo/keymaps/revok75/rules.mk @@ -0,0 +1,14 @@ +# Copyright 2013 Jun Wako +# +# 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 . diff --git a/keyboards/xd75/keymaps/revok75/config.h b/keyboards/xd75/keymaps/revok75/config.h new file mode 100644 index 000000000..a5484876e --- /dev/null +++ b/keyboards/xd75/keymaps/revok75/config.h @@ -0,0 +1,20 @@ +/* Copyright 2017 Benjamin Kesselring + * + * 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 . + */ + +#pragma once + +// place overrides here +#undef BACKLIGHT_BREATHING diff --git a/keyboards/xd75/keymaps/revok75/keymap.c b/keyboards/xd75/keymaps/revok75/keymap.c new file mode 100644 index 000000000..44e2c5203 --- /dev/null +++ b/keyboards/xd75/keymaps/revok75/keymap.c @@ -0,0 +1,90 @@ +/* Copyright 2017 Wunder + * + * 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 . + */ +#include QMK_KEYBOARD_H + +// Layer shorthand +#define _QW_M 0 +#define _QW_W 1 +#define _FN 2 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* QWERTY-Mac + * .--------------------------------------------------------------------------------------------------------------------------------------. + * | ESC | 1 | 2 | 3 | 4 | % | 6 | 7 | 8 | 9 | 0 | - | = | Cut | BACKSP | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------| + * | TAB | Q | W | E | R | T | Y | U | I | O | P | { | } | Copy | Paste | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------+--------| + * | CAP LK | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | ENTER | REF | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------------------------+--------| + * | LSHIFT | Z | X | C | V | B | N | M | , | . | / | \ | RSHIFT| UP | SAVE | + * |--------+--------+--------+--------+--------+-----------------+--------+--------+--------+--------+-----------------+--------+--------| + * | LALT | LGUI | LALT | FIND | CMD T | SPACE | SPACE | ALFRED | FN-MO | RALT | RGUI | RCTRL | LEFT | DOWN | RIGHT | + * '--------------------------------------------------------------------------------------------------------------------------------------' + */ + + [_QW_M] = LAYOUT_ortho_5x15( /* QWERTY MAC*/ + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, LGUI(KC_X), KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LCBR, KC_RCBR, LGUI(KC_C), LGUI(KC_V), \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, LGUI(KC_R), KC_NO, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_BSLS, KC_RSFT, KC_UP, LGUI(KC_S), \ + KC_LCTL, KC_LALT, KC_LGUI, LGUI(KC_F), LGUI(KC_T), KC_SPC, KC_NO, LALT(KC_SPACE), MO(_FN), KC_RGUI, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT \ + ), + + /* QWERTY-Win + * .--------------------------------------------------------------------------------------------------------------------------------------. + * | ESC | 1 | 2 | 3 | 4 | % | 6 | 7 | 8 | 9 | 0 | - | = | Cut | BACKSP | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------| + * | TAB | Q | W | E | R | T | Y | U | I | O | P | { | } | Copy | Paste | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------+--------| + * | CAP LK | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | ENTER | REF | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------------------------+--------| + * | LSHIFT | Z | X | C | V | B | N | M | , | . | / | \ | RSHIFT | UP | SAVE | + * |--------+--------+--------+--------+--------+-----------------+--------+--------+--------+--------+-----------------+--------+--------| + * | LALT | LGUI | LALT | FIND | CMD T | SPACE | SPACE | START | FN-MO | RALT | RGUI | RCTRL | LEFT | DOWN | RIGHT | + * '--------------------------------------------------------------------------------------------------------------------------------------' + */ + + [_QW_W] = LAYOUT_ortho_5x15( /* QWERTY WIN*/ + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, LCTL(KC_X), KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LCBR, KC_RCBR, LCTL(KC_C), LCTL(KC_V), \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, LCTL(KC_R), KC_NO, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_BSLS, KC_RSFT, KC_UP, LCTL(KC_S), \ + KC_LCTL, KC_LALT, KC_LGUI, LCTL(KC_F), LCTL(KC_T), KC_SPC, KC_NO, LCTL(KC_GESC), MO(_FN), KC_RGUI, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT \ + ), + +/* FUNCTION +* .--------------------------------------------------------------------------------------------------------------------------------------. +* | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | VOLDN | VOLUP | MUTE | DEL | +* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------| +* | TAB | - | WIN | - | - | RGB_TOG| - | - | OPTION | RESET | - | [ | ] | - | - | +* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------+--------| +* | CAP LK | MAC | RAINBOW| PLAIN | - | - | - | - | - | - | ; | ' | ENTER | ENTER | REF | +* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------------------------+--------| +* | LSHIFT | INC | DEC | HUE I | HUE D | SAT I | SAT D | - | - | . | / | \ | RSHIFT| HOME | SAVE | +* |--------+--------+--------+--------+--------+-----------------+--------+--------+--------+--------+-----------------+--------+--------| +* | LALT | LGUI | LALT | FIND | CMD T | SPACE | SPACE | ALFRED | FN-MO | RALT | RGUI | RCTRL | PGUP | END | PGDN | +* '--------------------------------------------------------------------------------------------------------------------------------------' +*/ + + [_FN] = LAYOUT_ortho_5x15( /* OSLAYOUT + NUMPAD + MEDIA + LIGHTING */ + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_VOLD, KC_VOLU, KC_MUTE, KC_DEL, \ + KC_TRNS, KC_NO, DF(_QW_W), KC_NO, KC_NO, RGB_TOG, KC_NO, KC_NO, KC_RALT, RESET, KC_NO, KC_LBRC, KC_RBRC, KC_TRNS, KC_TRNS, \ + KC_TRNS, DF(_QW_M), RGB_MODE_RAINBOW, RGB_MODE_PLAIN, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, RGB_VAI, RGB_VAD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, KC_NO, KC_NO, KC_DOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_END, KC_PGDN \ + ) +}; diff --git a/keyboards/xd75/keymaps/revok75/readme.md b/keyboards/xd75/keymaps/revok75/readme.md new file mode 100644 index 000000000..ecec8c962 --- /dev/null +++ b/keyboards/xd75/keymaps/revok75/readme.md @@ -0,0 +1 @@ +# The default keymap for Revok 75 diff --git a/keyboards/xd75/keymaps/revok75/rules.mk b/keyboards/xd75/keymaps/revok75/rules.mk new file mode 100644 index 000000000..7472e8c64 --- /dev/null +++ b/keyboards/xd75/keymaps/revok75/rules.mk @@ -0,0 +1,18 @@ +# Copyright 2013 Jun Wako +# +# 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 . + +BOOTMAGIC_ENABLE = yes +BACKLIGHT_ENABLE = yes +RGBLIGHT_ENABLE = yes From fd0f78254db8e7b505c9ac46b8210721d6fc20b5 Mon Sep 17 00:00:00 2001 From: Ivan Choi <34844887+navigatorade@users.noreply.github.com> Date: Wed, 5 Dec 2018 18:20:39 -0500 Subject: [PATCH 625/788] Keymap: Updated files to work with Planck Rev. 6 (#4552) * Update to work with Planck Rev. 6 Still something that needs to be worked with under keymap.c Qwerty layer tap-toggle function seems to be a little laggy? Not instantaneous * Changes Deleted some unneeded lines * deleting unneeded lines --- keyboards/planck/keymaps/navi/config.h | 31 ++- keyboards/planck/keymaps/navi/keymap.c | 270 +++++++++---------------- keyboards/planck/keymaps/navi/rules.mk | 5 +- 3 files changed, 124 insertions(+), 182 deletions(-) diff --git a/keyboards/planck/keymaps/navi/config.h b/keyboards/planck/keymaps/navi/config.h index 694053c6a..087ebb54e 100644 --- a/keyboards/planck/keymaps/navi/config.h +++ b/keyboards/planck/keymaps/navi/config.h @@ -1,7 +1,14 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H +#pragma once -#include "config_common.h" +#ifdef AUDIO_ENABLE + #define STARTUP_SONG SONG(PLANCK_SOUND) + // #define STARTUP_SONG SONG(NO_SOUND) + + #define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \ + SONG(COLEMAK_SOUND), \ + SONG(DVORAK_SOUND) \ + } +#endif /* * MIDI options @@ -13,7 +20,7 @@ /* enable basic MIDI features: - MIDI notes can be sent when in Music mode is on */ - + #define MIDI_BASIC /* enable advanced MIDI features: @@ -27,4 +34,18 @@ /* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ //#define MIDI_TONE_KEYCODE_OCTAVES 2 -#endif \ No newline at end of file +// Most tactile encoders have detents every 4 stages +#define ENCODER_RESOLUTION 4 + +#define MOUSEKEY_INTERVAL 16 + +#define MOUSEKEY_DELAY 0 + +#define MOUSEKEY_TIME_TO_MAX 60 + +#define MOUSEKEY_MAX_SPEED 7 + +#define MOUSEKEY_WHEEL_DELAY 0 + +#define TAPPING_TERM 80 +#define TAPPING_TOGGLE 2 diff --git a/keyboards/planck/keymaps/navi/keymap.c b/keyboards/planck/keymaps/navi/keymap.c index 0f0e48ad8..bbf7d510f 100644 --- a/keyboards/planck/keymaps/navi/keymap.c +++ b/keyboards/planck/keymaps/navi/keymap.c @@ -9,42 +9,35 @@ * 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. - * cd /c/qmk_firmware - * make planck/rev4:navi + * cd /c/qmk_firmware-master... make planck/rev6:navi * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#pragma message "You may need to add LAYOUT_planck_grid to your keymap layers - see default for an example" -#include "planck.h" -#include "action_layer.h" -#ifdef AUDIO_ENABLE - #include "audio.h" - #include "song_list.h" -#endif +#include QMK_KEYBOARD_H + extern keymap_config_t keymap_config; enum planck_layers { _QWERTY, - _COLEMAK, - _PLOVER, _LOWER, _RAISE, - _ADJUST, - _FUNCTION + _FUNCTION, + _ADJUST + }; enum planck_keycodes { QWERTY = SAFE_RANGE, - COLEMAK, - PLOVER, LOWER, RAISE, - EXT_PLV, FUNCTION }; +#define LOWER MO(_LOWER) +#define RAISE MO(_RAISE) + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Qwerty @@ -59,51 +52,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' * CtlSE = Control+shift+esc/ * CtlE = Control when held, esc when tapped - */ -[_QWERTY] = { - {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, - {LCTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, - {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT }, - {FUNCTION, C_S_T(KC_ESC), KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} -}, - -/* Colemak - * ,-----------------------------------------------------------------------------------. - * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | CtlE | A | R | S | T | D | H | N | E | I | O | " | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | FN |CtlSE | GUI | Alt |Lower | Space | Raise| Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' + * FN takes two taps to have it stay as FN */ -[_COLEMAK] = { - {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, - {LCTL_T(KC_ESC), KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, - {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT }, - {FUNCTION, C_S_T(KC_ESC), KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} -}, - -/* Plover layer (http://opensteno.org) - * ,-----------------------------------------------------------------------------------. - * | # | # | # | # | # | # | # | # | # | # | # | # | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | S | T | P | H | * | * | F | P | L | T | D | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | S | K | W | R | * | * | R | B | G | S | Z | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Exit | | | A | O | | E | U | | | | - * `-----------------------------------------------------------------------------------' - */ - -[_PLOVER] = { - {KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1 }, - {XXXXXXX, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC}, - {XXXXXXX, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, - {EXT_PLV, XXXXXXX, XXXXXXX, KC_C, KC_V, XXXXXXX, XXXXXXX, KC_N, KC_M, XXXXXXX, XXXXXXX, XXXXXXX} -}, - +[_QWERTY] = LAYOUT_planck_grid( + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL, + LCTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, + TT(_FUNCTION), LCTL(LALT(KC_DEL)), KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_BSPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT +), /* Lower * ,-----------------------------------------------------------------------------------. @@ -116,12 +72,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | |Pg DN | Pg UP| | * `-----------------------------------------------------------------------------------' */ -[_LOWER] = { - {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL}, - {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, - {KC_LSHIFT, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_NUHS), S(KC_NUBS), KC_END, KC_HOME, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGDN , KC_PGUP, _______} -}, +[_LOWER] = LAYOUT_planck_grid( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, + KC_LSHIFT, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_NUHS), S(KC_NUBS), KC_END, KC_HOME, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGDN , KC_PGUP, _______ +), /* Raise * ,-----------------------------------------------------------------------------------. @@ -129,89 +85,54 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+-------------+------+------+------+------+------| * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | * |------+------+------+------+------+------|------+------+------+------+------+------| - * |Shift | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | End | Home | | + * |Shift | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | End | Home | | * |------+------+------+------+------+------+------+------+------+------+------+------| * | | | | | | | | |Pg DN |Pg UP | | * `-----------------------------------------------------------------------------------' */ -[_RAISE] = { - {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL}, - {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, - {KC_LSHIFT, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_END, KC_HOME, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGDN , KC_PGUP, _______} -}, +[_RAISE] = LAYOUT_planck_grid( + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, + KC_LSHIFT, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_END, KC_HOME, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGDN , KC_PGUP, _______ +), -/* Adjust (Lower + Raise) - * ,-----------------------------------------------------------------------------------. - * | | Reset| | | | | | | | | | Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | |MU_MOD|Aud on|Audoff| | |Qwerty|Colemk|Plover| | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * |Caps |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof| | | | | Caps | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | | - * `-----------------------------------------------------------------------------------' - */ -[_ADJUST] = { - {_______, RESET, DEBUG, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_DEL }, - {_______, _______, MU_MOD, AU_ON, AU_OFF, _______, _______, QWERTY, COLEMAK, PLOVER,_______, _______}, - {KC_CAPS, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, TERM_ON, TERM_OFF, _______, _______, KC_CAPS}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} -}, /* Function * ,-----------------------------------------------------------------------------------. - * | Esc | | Prev | Play | Next | | | | 7 | 8 | 9 | Bksp | + * | Vol- | Mute | Vol+ | | | | | # | 7 | 8 | 9 | Bksp | * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | Vol- | Mute | Vol+ | | | + | 4 | 5 | 6 | - | + * | Prev | Play | Next | | | | | + | 4 | 5 | 6 | - | * |------+------+------+------+------+------|------+------+------+------+------+------| - * | CALC | | | | | | | $ | 1 | 2 | 3 | Enter| + * | CALC | MWU | M1 |MouseU| M2 | | | $ | 1 | 2 | 3 | Enter| * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | |Prntsc| | | | * | 0 | . |Numlck| / | + * | | MWD |MouseL|MouseD|MouseR| | * | 0 | . |Numlck| / | * `-----------------------------------------------------------------------------------' */ -[_FUNCTION] = { - {KC_ESC , _______, KC_MPRV, KC_MPLY, KC_MNXT, _______,_______,_______, KC_KP_7, KC_KP_8, KC_KP_9,KC_BSPC}, - {_______, _______, KC_VOLD, KC_MUTE, KC_VOLU, _______, _______, KC_PPLS, KC_KP_4, KC_KP_5, KC_KP_6, KC_PMNS}, - {KC_CALC, _______, _______, _______, _______, _______, _______, KC_DLR, KC_KP_1, KC_KP_2, KC_KP_3, KC_ENT}, - {_______, _______, KC_PSCR, _______, _______ , _______, _______, KC_PAST, KC_KP_0, KC_KP_DOT,KC_NUMLOCK, KC_PSLS} -} +[_FUNCTION] = LAYOUT_planck_grid( + KC_VOLD, KC_MUTE, KC_VOLU, KC_MPRV, KC_MPLY, KC_MNXT, KC_TRNS, KC_HASH, KC_KP_7, KC_KP_8, KC_KP_9, KC_BSPC, + KC_MPRV, KC_MPLY, KC_MNXT, AU_ON, AU_OFF, MU_ON, MU_OFF, KC_PPLS, KC_KP_4, KC_KP_5, KC_KP_6, KC_PMNS, + KC_CALC, KC_WH_U, KC_BTN1, KC_MS_U, KC_BTN2, KC_TRNS, KC_TRNS, KC_DLR, KC_KP_1, KC_KP_2, KC_KP_3, KC_ENTER, + KC_TRNS, KC_WH_D, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, KC_TRNS, KC_PAST, KC_KP_0, KC_KP_DOT,KC_NUMLOCK, KC_PSLS +) }; -#ifdef AUDIO_ENABLE -float tone_startup[][2] = SONG(ZELDA_PUZZLE); -float tone_qwerty[][2] = SONG(ZELDA_TREASURE); -float plover_song[][2] = SONG(PLOVER_SOUND); -float plover_gb_song[][2] = SONG(PLOVER_GOODBYE_SOUND); -float tone_colemak[][2] = SONG(VIOLIN_SOUND); -float tone_music_on[][2] = SONG(ONE_UP_SOUND); -float tone_music_off[][2] = SONG(ROCK_A_BYE_BABY); -#endif /* AUDIO_ENABLE */ +uint32_t layer_state_set_user(uint32_t state) { + return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST); +} bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch (keycode) { case QWERTY: if (record->event.pressed) { - print("mode just switched to qwerty and this is a huge string\n"); - set_single_persistent_default_layer(_QWERTY); - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_qwerty); - #endif + print("mode just switched to qwerty and this is a huge string\n"); + set_single_persistent_default_layer(_QWERTY); } return false; break; - case COLEMAK: - if (record->event.pressed) { - set_single_persistent_default_layer(_COLEMAK); - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_colemak); - #endif - } - return false; - break; - case LOWER: + case LOWER: if (record->event.pressed) { layer_on(_LOWER); update_tri_layer(_LOWER, _RAISE, _ADJUST); @@ -238,62 +159,59 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { layer_off(_FUNCTION); } return false; - break; - case PLOVER: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - stop_all_notes(); - PLAY_SONG(plover_song); - #endif - layer_off(_RAISE); - layer_off(_LOWER); - layer_off(_ADJUST); - layer_on(_PLOVER); - if (!eeconfig_is_enabled()) { - eeconfig_init(); - } - keymap_config.raw = eeconfig_read_keymap(); - keymap_config.nkro = 1; - eeconfig_update_keymap(keymap_config.raw); - } - return false; - break; - case EXT_PLV: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(plover_gb_song); - #endif - layer_off(_PLOVER); - } - return false; - break; + break; } return true; } -void matrix_init_user(void) { - #ifdef AUDIO_ENABLE - startup_user(); - #endif +bool muse_mode = false; +uint8_t last_muse_note = 0; +uint16_t muse_counter = 0; +uint8_t muse_offset = 70; +uint16_t muse_tempo = 50; + +void encoder_update(bool clockwise) { + if (muse_mode) { + if (IS_LAYER_ON(_RAISE)) { + if (clockwise) { + muse_offset++; + } else { + muse_offset--; + } + } else { + if (clockwise) { + muse_tempo+=1; + } else { + muse_tempo-=1; + } + } + } else { + if (clockwise) { + #ifdef MOUSEKEY_ENABLE + register_code(KC_MS_WH_DOWN); + unregister_code(KC_MS_WH_DOWN); + #else + register_code(KC_PGDN); + unregister_code(KC_PGDN); + #endif + } else { + #ifdef MOUSEKEY_ENABLE + register_code(KC_MS_WH_UP); + unregister_code(KC_MS_WH_UP); + #else + register_code(KC_PGUP); + unregister_code(KC_PGUP); + #endif + } + } } -#ifdef AUDIO_ENABLE - -void startup_user() -{ - _delay_ms(20); // gets rid of tick - PLAY_SONG(tone_startup); +bool music_mask_user(uint16_t keycode) { + switch (keycode) { + case RAISE: + case LOWER: + return false; + default: + return true; + } } - -void music_on_user(void) -{ - PLAY_SONG(tone_music_on); -} - -void music_off_user(void) -{ - PLAY_SONG(tone_music_off); -} -#endif - - diff --git a/keyboards/planck/keymaps/navi/rules.mk b/keyboards/planck/keymaps/navi/rules.mk index 628167ff6..4852442b3 100644 --- a/keyboards/planck/keymaps/navi/rules.mk +++ b/keyboards/planck/keymaps/navi/rules.mk @@ -1 +1,4 @@ -AUDIO_ENABLE = yes \ No newline at end of file +AUDIO_ENABLE = yes +MOUSEKEY_ENABLE = yes + +DFU_ARGS = -d 0483:df11 -a 0 -s 0x08000000:leave \ No newline at end of file From 58670ef4b75dad47770401167427bbeed1d5e170 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Wed, 5 Dec 2018 15:27:55 -0800 Subject: [PATCH 626/788] Keyboard: Configurator support for handwired/dactyl_manuform (#4558) * handwired/dactyl_manuform/4x5: Configurator support * handwired/dactyl_manuform/4x6: Configurator support * handwired/dactyl_manuform/5x6: Configurator support * handwired/dactyl_manuform/5x7: Configurator support * handwired/dactyl_manuform/6x6: Configurator support --- .../handwired/dactyl_manuform/4x5/info.json | 59 ++++++++++++ .../handwired/dactyl_manuform/4x6/info.json | 65 ++++++++++++++ .../handwired/dactyl_manuform/5x6/info.json | 77 ++++++++++++++++ .../handwired/dactyl_manuform/5x7/info.json | 87 ++++++++++++++++++ .../handwired/dactyl_manuform/6x6/info.json | 89 +++++++++++++++++++ 5 files changed, 377 insertions(+) create mode 100644 keyboards/handwired/dactyl_manuform/4x5/info.json create mode 100644 keyboards/handwired/dactyl_manuform/4x6/info.json create mode 100644 keyboards/handwired/dactyl_manuform/5x6/info.json create mode 100644 keyboards/handwired/dactyl_manuform/5x7/info.json create mode 100644 keyboards/handwired/dactyl_manuform/6x6/info.json diff --git a/keyboards/handwired/dactyl_manuform/4x5/info.json b/keyboards/handwired/dactyl_manuform/4x5/info.json new file mode 100644 index 000000000..4ee52e164 --- /dev/null +++ b/keyboards/handwired/dactyl_manuform/4x5/info.json @@ -0,0 +1,59 @@ +{ + "keyboard_name": "Dactyl Manuform 4x5", + "url": "", + "maintainer": "qmk", + "width": 15, + "height": 7, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"L00", "x":0, "y":0}, + {"label":"L01", "x":1, "y":0}, + {"label":"L02", "x":2, "y":0}, + {"label":"L03", "x":3, "y":0}, + {"label":"L04", "x":4, "y":0}, + {"label":"R00", "x":10, "y":0}, + {"label":"R01", "x":11, "y":0}, + {"label":"R02", "x":12, "y":0}, + {"label":"R03", "x":13, "y":0}, + {"label":"R04", "x":14, "y":0}, + {"label":"L10", "x":0, "y":1}, + {"label":"L11", "x":1, "y":1}, + {"label":"L12", "x":2, "y":1}, + {"label":"L13", "x":3, "y":1}, + {"label":"L14", "x":4, "y":1}, + {"label":"R10", "x":10, "y":1}, + {"label":"R11", "x":11, "y":1}, + {"label":"R12", "x":12, "y":1}, + {"label":"R13", "x":13, "y":1}, + {"label":"R14", "x":14, "y":1}, + {"label":"L20", "x":0, "y":2}, + {"label":"L21", "x":1, "y":2}, + {"label":"L22", "x":2, "y":2}, + {"label":"L23", "x":3, "y":2}, + {"label":"L24", "x":4, "y":2}, + {"label":"R20", "x":10, "y":2}, + {"label":"R21", "x":11, "y":2}, + {"label":"R22", "x":12, "y":2}, + {"label":"R23", "x":13, "y":2}, + {"label":"R24", "x":14, "y":2}, + {"label":"L31", "x":1, "y":3}, + {"label":"L32", "x":2, "y":3}, + {"label":"R32", "x":12, "y":3}, + {"label":"R33", "x":13, "y":3}, + {"label":"L33", "x":3, "y":4}, + {"label":"L34", "x":4, "y":4}, + {"label":"R30", "x":10, "y":4}, + {"label":"R31", "x":11, "y":4}, + {"label":"L44", "x":5, "y":5}, + {"label":"L43", "x":6, "y":5}, + {"label":"R41", "x":8, "y":5}, + {"label":"R40", "x":9, "y":5}, + {"label":"L42", "x":5, "y":6}, + {"label":"L41", "x":6, "y":6}, + {"label":"R43", "x":8, "y":6}, + {"label":"R42", "x":9, "y":6} + ] + } + } +} diff --git a/keyboards/handwired/dactyl_manuform/4x6/info.json b/keyboards/handwired/dactyl_manuform/4x6/info.json new file mode 100644 index 000000000..ba358a703 --- /dev/null +++ b/keyboards/handwired/dactyl_manuform/4x6/info.json @@ -0,0 +1,65 @@ +{ + "keyboard_name": "Dactyl Manuform 4x6", + "url": "", + "maintainer": "qmk", + "width": 17, + "height": 7, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"L00", "x":0, "y":0}, + {"label":"L01", "x":1, "y":0}, + {"label":"L02", "x":2, "y":0}, + {"label":"L03", "x":3, "y":0}, + {"label":"L04", "x":4, "y":0}, + {"label":"L05", "x":5, "y":0}, + {"label":"R00", "x":11, "y":0}, + {"label":"R01", "x":12, "y":0}, + {"label":"R02", "x":13, "y":0}, + {"label":"R03", "x":14, "y":0}, + {"label":"R04", "x":15, "y":0}, + {"label":"R05", "x":16, "y":0}, + {"label":"L10", "x":0, "y":1}, + {"label":"L11", "x":1, "y":1}, + {"label":"L12", "x":2, "y":1}, + {"label":"L13", "x":3, "y":1}, + {"label":"L14", "x":4, "y":1}, + {"label":"L15", "x":5, "y":1}, + {"label":"R10", "x":11, "y":1}, + {"label":"R11", "x":12, "y":1}, + {"label":"R12", "x":13, "y":1}, + {"label":"R13", "x":14, "y":1}, + {"label":"R14", "x":15, "y":1}, + {"label":"R15", "x":16, "y":1}, + {"label":"L20", "x":0, "y":2}, + {"label":"L21", "x":1, "y":2}, + {"label":"L22", "x":2, "y":2}, + {"label":"L23", "x":3, "y":2}, + {"label":"L24", "x":4, "y":2}, + {"label":"L25", "x":5, "y":2}, + {"label":"R20", "x":11, "y":2}, + {"label":"R21", "x":12, "y":2}, + {"label":"R22", "x":13, "y":2}, + {"label":"R23", "x":14, "y":2}, + {"label":"R24", "x":15, "y":2}, + {"label":"R25", "x":16, "y":2}, + {"label":"L32", "x":2, "y":3}, + {"label":"L33", "x":3, "y":3}, + {"label":"R32", "x":13, "y":3}, + {"label":"R33", "x":14, "y":3}, + {"label":"L34", "x":4, "y":4}, + {"label":"L35", "x":5, "y":4}, + {"label":"R30", "x":11, "y":4}, + {"label":"R31", "x":12, "y":4}, + {"label":"L44", "x":6, "y":5}, + {"label":"L45", "x":7, "y":5}, + {"label":"R40", "x":9, "y":5}, + {"label":"R41", "x":10, "y":5}, + {"label":"L42", "x":6, "y":6}, + {"label":"L43", "x":7, "y":6}, + {"label":"R42", "x":9, "y":6}, + {"label":"R43", "x":10, "y":6} + ] + } + } +} diff --git a/keyboards/handwired/dactyl_manuform/5x6/info.json b/keyboards/handwired/dactyl_manuform/5x6/info.json new file mode 100644 index 000000000..d7aa3acee --- /dev/null +++ b/keyboards/handwired/dactyl_manuform/5x6/info.json @@ -0,0 +1,77 @@ +{ + "keyboard_name": "Dactyl Manuform 5x6", + "url": "", + "maintainer": "qmk", + "width": 17, + "height": 8, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"L00", "x":0, "y":0}, + {"label":"L01", "x":1, "y":0}, + {"label":"L02", "x":2, "y":0}, + {"label":"L03", "x":3, "y":0}, + {"label":"L04", "x":4, "y":0}, + {"label":"L05", "x":5, "y":0}, + {"label":"R00", "x":11, "y":0}, + {"label":"R01", "x":12, "y":0}, + {"label":"R02", "x":13, "y":0}, + {"label":"R03", "x":14, "y":0}, + {"label":"R04", "x":15, "y":0}, + {"label":"R05", "x":16, "y":0}, + {"label":"L10", "x":0, "y":1}, + {"label":"L11", "x":1, "y":1}, + {"label":"L12", "x":2, "y":1}, + {"label":"L13", "x":3, "y":1}, + {"label":"L14", "x":4, "y":1}, + {"label":"L15", "x":5, "y":1}, + {"label":"R10", "x":11, "y":1}, + {"label":"R11", "x":12, "y":1}, + {"label":"R12", "x":13, "y":1}, + {"label":"R13", "x":14, "y":1}, + {"label":"R14", "x":15, "y":1}, + {"label":"R15", "x":16, "y":1}, + {"label":"L20", "x":0, "y":2}, + {"label":"L21", "x":1, "y":2}, + {"label":"L22", "x":2, "y":2}, + {"label":"L23", "x":3, "y":2}, + {"label":"L24", "x":4, "y":2}, + {"label":"L25", "x":5, "y":2}, + {"label":"R20", "x":11, "y":2}, + {"label":"R21", "x":12, "y":2}, + {"label":"R22", "x":13, "y":2}, + {"label":"R23", "x":14, "y":2}, + {"label":"R24", "x":15, "y":2}, + {"label":"R25", "x":16, "y":2}, + {"label":"L30", "x":0, "y":3}, + {"label":"L31", "x":1, "y":3}, + {"label":"L32", "x":2, "y":3}, + {"label":"L33", "x":3, "y":3}, + {"label":"L34", "x":4, "y":3}, + {"label":"L35", "x":5, "y":3}, + {"label":"R30", "x":11, "y":3}, + {"label":"R31", "x":12, "y":3}, + {"label":"R32", "x":13, "y":3}, + {"label":"R33", "x":14, "y":3}, + {"label":"R34", "x":15, "y":3}, + {"label":"R35", "x":16, "y":3}, + {"label":"L42", "x":2, "y":4}, + {"label":"L43", "x":3, "y":4}, + {"label":"R42", "x":13, "y":4}, + {"label":"R43", "x":14, "y":4}, + {"label":"L44", "x":4, "y":5}, + {"label":"L45", "x":5, "y":5}, + {"label":"R40", "x":11, "y":5}, + {"label":"R41", "x":12, "y":5}, + {"label":"L54", "x":6, "y":6}, + {"label":"L55", "x":7, "y":6}, + {"label":"R50", "x":9, "y":6}, + {"label":"R51", "x":10, "y":6}, + {"label":"L52", "x":6, "y":7}, + {"label":"L53", "x":7, "y":7}, + {"label":"R52", "x":9, "y":7}, + {"label":"R53", "x":10, "y":7} + ] + } + } +} diff --git a/keyboards/handwired/dactyl_manuform/5x7/info.json b/keyboards/handwired/dactyl_manuform/5x7/info.json new file mode 100644 index 000000000..b4b2c7b79 --- /dev/null +++ b/keyboards/handwired/dactyl_manuform/5x7/info.json @@ -0,0 +1,87 @@ +{ + "keyboard_name": "Dactyl Manuform 5x7", + "url": "", + "maintainer": "qmk", + "width": 17, + "height": 16, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"L11", "x":0, "y":0}, + {"label":"L12", "x":1, "y":0}, + {"label":"L13", "x":2, "y":0}, + {"label":"L14", "x":3, "y":0}, + {"label":"L15", "x":4, "y":0}, + {"label":"L16", "x":5, "y":0}, + {"label":"L17", "x":6, "y":0}, + {"label":"L21", "x":0, "y":1}, + {"label":"L22", "x":1, "y":1}, + {"label":"L23", "x":2, "y":1}, + {"label":"L24", "x":3, "y":1}, + {"label":"L25", "x":4, "y":1}, + {"label":"L26", "x":5, "y":1}, + {"label":"L27", "x":6, "y":1}, + {"label":"L31", "x":0, "y":2}, + {"label":"L32", "x":1, "y":2}, + {"label":"L33", "x":2, "y":2}, + {"label":"L34", "x":3, "y":2}, + {"label":"L35", "x":4, "y":2}, + {"label":"L36", "x":5, "y":2}, + {"label":"L37", "x":6, "y":2}, + {"label":"L41", "x":0, "y":3}, + {"label":"L42", "x":1, "y":3}, + {"label":"L43", "x":2, "y":3}, + {"label":"L44", "x":3, "y":3}, + {"label":"L45", "x":4, "y":3}, + {"label":"L46", "x":5, "y":3}, + {"label":"L51", "x":0, "y":4}, + {"label":"L52", "x":1, "y":4}, + {"label":"L53", "x":2, "y":4}, + {"label":"L54", "x":3, "y":4}, + {"label":"L55", "x":4, "y":5}, + {"label":"L56", "x":5, "y":5}, + {"label":"L65", "x":6, "y":6}, + {"label":"L66", "x":7, "y":6}, + {"label":"L63", "x":6, "y":7}, + {"label":"L64", "x":7, "y":7}, + {"label":"R11", "x":10, "y":0}, + {"label":"R12", "x":11, "y":0}, + {"label":"R13", "x":12, "y":0}, + {"label":"R14", "x":13, "y":0}, + {"label":"R15", "x":14, "y":0}, + {"label":"R16", "x":15, "y":0}, + {"label":"R17", "x":16, "y":0}, + {"label":"R21", "x":10, "y":1}, + {"label":"R22", "x":11, "y":1}, + {"label":"R23", "x":12, "y":1}, + {"label":"R24", "x":13, "y":1}, + {"label":"R25", "x":14, "y":1}, + {"label":"R26", "x":15, "y":1}, + {"label":"R27", "x":16, "y":1}, + {"label":"R31", "x":10, "y":2}, + {"label":"R32", "x":11, "y":2}, + {"label":"R33", "x":12, "y":2}, + {"label":"R34", "x":13, "y":2}, + {"label":"R35", "x":14, "y":2}, + {"label":"R36", "x":15, "y":2}, + {"label":"R37", "x":16, "y":2}, + {"label":"R42", "x":11, "y":3}, + {"label":"R43", "x":12, "y":3}, + {"label":"R44", "x":13, "y":3}, + {"label":"R45", "x":14, "y":3}, + {"label":"R46", "x":15, "y":3}, + {"label":"R47", "x":16, "y":3}, + {"label":"R54", "x":13, "y":4}, + {"label":"R55", "x":14, "y":4}, + {"label":"R56", "x":15, "y":4}, + {"label":"R57", "x":16, "y":4}, + {"label":"R52", "x":11, "y":5}, + {"label":"R53", "x":12, "y":5}, + {"label":"R62", "x":9, "y":6}, + {"label":"R63", "x":10, "y":6}, + {"label":"R64", "x":9, "y":7}, + {"label":"R65", "x":10, "y":7} + ] + } + } +} diff --git a/keyboards/handwired/dactyl_manuform/6x6/info.json b/keyboards/handwired/dactyl_manuform/6x6/info.json new file mode 100644 index 000000000..2ae91d469 --- /dev/null +++ b/keyboards/handwired/dactyl_manuform/6x6/info.json @@ -0,0 +1,89 @@ +{ + "keyboard_name": "Dactyl Manuform 6x6", + "url": "", + "maintainer": "qmk", + "width": 17, + "height": 9, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"L00", "x":0, "y":0}, + {"label":"L01", "x":1, "y":0}, + {"label":"L02", "x":2, "y":0}, + {"label":"L03", "x":3, "y":0}, + {"label":"L04", "x":4, "y":0}, + {"label":"L05", "x":5, "y":0}, + {"label":"R00", "x":11, "y":0}, + {"label":"R01", "x":12, "y":0}, + {"label":"R02", "x":13, "y":0}, + {"label":"R03", "x":14, "y":0}, + {"label":"R04", "x":15, "y":0}, + {"label":"R05", "x":16, "y":0}, + {"label":"L10", "x":0, "y":1}, + {"label":"L11", "x":1, "y":1}, + {"label":"L12", "x":2, "y":1}, + {"label":"L13", "x":3, "y":1}, + {"label":"L14", "x":4, "y":1}, + {"label":"L15", "x":5, "y":1}, + {"label":"R10", "x":11, "y":1}, + {"label":"R11", "x":12, "y":1}, + {"label":"R12", "x":13, "y":1}, + {"label":"R13", "x":14, "y":1}, + {"label":"R14", "x":15, "y":1}, + {"label":"R15", "x":16, "y":1}, + {"label":"L20", "x":0, "y":2}, + {"label":"L21", "x":1, "y":2}, + {"label":"L22", "x":2, "y":2}, + {"label":"L23", "x":3, "y":2}, + {"label":"L24", "x":4, "y":2}, + {"label":"L25", "x":5, "y":2}, + {"label":"R20", "x":11, "y":2}, + {"label":"R21", "x":12, "y":2}, + {"label":"R22", "x":13, "y":2}, + {"label":"R23", "x":14, "y":2}, + {"label":"R24", "x":15, "y":2}, + {"label":"R25", "x":16, "y":2}, + {"label":"L30", "x":0, "y":3}, + {"label":"L31", "x":1, "y":3}, + {"label":"L32", "x":2, "y":3}, + {"label":"L33", "x":3, "y":3}, + {"label":"L34", "x":4, "y":3}, + {"label":"L35", "x":5, "y":3}, + {"label":"R30", "x":11, "y":3}, + {"label":"R31", "x":12, "y":3}, + {"label":"R32", "x":13, "y":3}, + {"label":"R33", "x":14, "y":3}, + {"label":"R34", "x":15, "y":3}, + {"label":"R35", "x":16, "y":3}, + {"label":"L40", "x":0, "y":4}, + {"label":"L41", "x":1, "y":4}, + {"label":"L42", "x":2, "y":4}, + {"label":"L43", "x":3, "y":4}, + {"label":"L44", "x":4, "y":4}, + {"label":"L45", "x":5, "y":4}, + {"label":"R40", "x":11, "y":4}, + {"label":"R41", "x":12, "y":4}, + {"label":"R42", "x":13, "y":4}, + {"label":"R43", "x":14, "y":4}, + {"label":"R44", "x":15, "y":4}, + {"label":"R45", "x":16, "y":4}, + {"label":"L52", "x":2, "y":5}, + {"label":"L53", "x":3, "y":5}, + {"label":"R52", "x":13, "y":5}, + {"label":"R53", "x":14, "y":5}, + {"label":"L54", "x":4, "y":6}, + {"label":"L55", "x":5, "y":6}, + {"label":"R50", "x":11, "y":6}, + {"label":"R51", "x":12, "y":6}, + {"label":"L64", "x":6, "y":7}, + {"label":"L65", "x":7, "y":7}, + {"label":"R60", "x":9, "y":7}, + {"label":"R61", "x":10, "y":7}, + {"label":"L62", "x":6, "y":8}, + {"label":"L63", "x":7, "y":8}, + {"label":"R62", "x":9, "y":8}, + {"label":"R63", "x":10, "y":8} + ] + } + } +} From 8ad561c8f091a4baf167ad4d7c90c02383905e38 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Wed, 5 Dec 2018 16:55:35 -0800 Subject: [PATCH 627/788] Keyboard: handwired/fivethirteen Refactor, Configurator support, and readme cleanup (#4559) * handwired/fivethirteen: refactor - Layout macro KEYMAP renamed to LAYOUT - Default keymap - now uses #include QMK_KEYBOARD_H - Removed redundant KC_TRNS definition - Removed deprecated fn_actions and action_get_macro functions. * handwired/fivethirteen: Configurator support * handwired/fivethirteen: readme cleanup Restructured readme file to be closer to current QMK template. Couldn't find a photo of an assembled fivethirteen, so deleted the reference to the photograph. Renamed to readme.md --- keyboards/handwired/fivethirteen/README.md | 28 ------- .../handwired/fivethirteen/fivethirteen.h | 22 +++--- keyboards/handwired/fivethirteen/info.json | 77 +++++++++++++++++++ .../fivethirteen/keymaps/default/keymap.c | 21 ++--- keyboards/handwired/fivethirteen/readme.md | 12 +++ 5 files changed, 105 insertions(+), 55 deletions(-) delete mode 100644 keyboards/handwired/fivethirteen/README.md create mode 100644 keyboards/handwired/fivethirteen/info.json create mode 100644 keyboards/handwired/fivethirteen/readme.md diff --git a/keyboards/handwired/fivethirteen/README.md b/keyboards/handwired/fivethirteen/README.md deleted file mode 100644 index a965650fc..000000000 --- a/keyboards/handwired/fivethirteen/README.md +++ /dev/null @@ -1,28 +0,0 @@ -fivethirteen keyboard firmware -====================== - -## Quantum MK Firmware - -For the full Quantum feature list, see [the parent readme.md](/doc/README.md). - -## Building - -Download or clone the whole firmware and navigate to the keyboards/handwired/fivethirteen folder. -Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use -the Teensy Loader to program your .hex file. - -Depending on which keymap you would like to use, you will have to compile slightly differently. - -### Default - -To build with the default keymap, simply run `make`. - -### Other Keymaps - -To build the firmware binary hex file with a keymap just do `make` with `keymap` option like: - -``` -$ make keymap=[default|jack|] -``` - -Keymaps follow the format **__keymap.c__** and are stored in folders in the `keymaps` folder, eg `keymaps/my_keymap/` diff --git a/keyboards/handwired/fivethirteen/fivethirteen.h b/keyboards/handwired/fivethirteen/fivethirteen.h index faa6de737..6d14b7f1c 100644 --- a/keyboards/handwired/fivethirteen/fivethirteen.h +++ b/keyboards/handwired/fivethirteen/fivethirteen.h @@ -3,19 +3,19 @@ #include "quantum.h" -#define KEYMAP( \ - k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k010, k011, k012, \ - k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k110, k111, k112, \ - k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k210, k211, k212, \ - k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k310, k311, k312, \ - k40, k41, k42, k43, k44, k46, k47, k48, k49, k410, k411, k412 \ +#define LAYOUT( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k010, k011, k012, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k110, k111, k112, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k210, k211, k212, \ + k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k310, k311, k312, \ + k40, k41, k42, k43, k44, k46, k47, k48, k49, k410, k411, k412 \ ) \ { \ - { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k010, k011, k012 }, \ - { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k110, k111, k112 }, \ - { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k210, k211, k212 }, \ - { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k310, k311, k312 }, \ - { k40, k41, k42, k43, k44, KC_NO, k46, k47, k48, k49, k410, k411, k412 } \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k010, k011, k012 }, \ + { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k110, k111, k112 }, \ + { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k210, k211, k212 }, \ + { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k310, k311, k312 }, \ + { k40, k41, k42, k43, k44, KC_NO, k46, k47, k48, k49, k410, k411, k412 } \ } #endif diff --git a/keyboards/handwired/fivethirteen/info.json b/keyboards/handwired/fivethirteen/info.json new file mode 100644 index 000000000..f95cbbe01 --- /dev/null +++ b/keyboards/handwired/fivethirteen/info.json @@ -0,0 +1,77 @@ +{ + "keyboard_name": "fivethirteen", + "url": "", + "maintainer": "qmk", + "width": 13, + "height": 5, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"Esc", "x":0, "y":0}, + {"label":"1", "x":1, "y":0}, + {"label":"2", "x":2, "y":0}, + {"label":"3", "x":3, "y":0}, + {"label":"4", "x":4, "y":0}, + {"label":"5", "x":5, "y":0}, + {"label":"6", "x":6, "y":0}, + {"label":"7", "x":7, "y":0}, + {"label":"8", "x":8, "y":0}, + {"label":"9", "x":9, "y":0}, + {"label":"0", "x":10, "y":0}, + {"label":"-", "x":11, "y":0}, + {"label":"=", "x":12, "y":0}, + {"label":"Tab", "x":0, "y":1}, + {"label":"Q", "x":1, "y":1}, + {"label":"W", "x":2, "y":1}, + {"label":"E", "x":3, "y":1}, + {"label":"R", "x":4, "y":1}, + {"label":"T", "x":5, "y":1}, + {"label":"Y", "x":6, "y":1}, + {"label":"U", "x":7, "y":1}, + {"label":"I", "x":8, "y":1}, + {"label":"O", "x":9, "y":1}, + {"label":"P", "x":10, "y":1}, + {"label":"[", "x":11, "y":1}, + {"label":"]", "x":12, "y":1}, + {"label":"Ctrl/Esc", "x":0, "y":2}, + {"label":"A", "x":1, "y":2}, + {"label":"S", "x":2, "y":2}, + {"label":"D", "x":3, "y":2}, + {"label":"F", "x":4, "y":2}, + {"label":"G", "x":5, "y":2}, + {"label":"H", "x":6, "y":2}, + {"label":"J", "x":7, "y":2}, + {"label":"K", "x":8, "y":2}, + {"label":"L", "x":9, "y":2}, + {"label":";", "x":10, "y":2}, + {"label":"'", "x":11, "y":2}, + {"label":"Enter", "x":12, "y":2}, + {"label":"Shift", "x":0, "y":3}, + {"label":"Z", "x":1, "y":3}, + {"label":"X", "x":2, "y":3}, + {"label":"C", "x":3, "y":3}, + {"label":"V", "x":4, "y":3}, + {"label":"B", "x":5, "y":3}, + {"label":"N", "x":6, "y":3}, + {"label":"M", "x":7, "y":3}, + {"label":",", "x":8, "y":3}, + {"label":".", "x":9, "y":3}, + {"label":"/", "x":10, "y":3}, + {"label":"Up", "x":11, "y":3}, + {"label":"\\", "x":12, "y":3}, + {"label":"MO(MOS)", "x":0, "y":4}, + {"label":"Ctrl", "x":1, "y":4}, + {"label":"Alt", "x":2, "y":4}, + {"label":"GUI", "x":3, "y":4}, + {"label":"MO(HDN)", "x":4, "y":4}, + {"label":"Space", "x":5, "y":4, "w":2}, + {"label":"Shift/Backspace", "x":7, "y":4}, + {"label":"MO(OSY)", "x":8, "y":4}, + {"label":"MO(HDN)", "x":9, "y":4}, + {"label":"Left", "x":10, "y":4}, + {"label":"Down", "x":11, "y":4}, + {"label":"Right", "x":12, "y":4} + ] + } + } +} diff --git a/keyboards/handwired/fivethirteen/keymaps/default/keymap.c b/keyboards/handwired/fivethirteen/keymaps/default/keymap.c index d718510d5..d92f32e35 100644 --- a/keyboards/handwired/fivethirteen/keymaps/default/keymap.c +++ b/keyboards/handwired/fivethirteen/keymaps/default/keymap.c @@ -1,6 +1,4 @@ -#include "fivethirteen.h" - -#define _______ KC_TRNS +#include QMK_KEYBOARD_H #define HDN 1 #define OSY 2 @@ -9,28 +7,28 @@ #define SFT_BSP SFT_T(KC_BSPC) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[0] = KEYMAP( +[0] = LAYOUT( KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, \ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, \ CTL_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_UP, KC_BSLS, \ MO(MOS), KC_LCTL, KC_LALT, KC_LGUI, MO(HDN), KC_SPC , SFT_BSP, MO(OSY), MO(HDN), KC_LEFT, KC_DOWN, KC_RGHT \ ), -[HDN] = KEYMAP( +[HDN] = LAYOUT( _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, _______, \ _______, KC_TILD, KC_GRV, KC_BSLS, KC_PIPE, KC_MINS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_TILD, KC_GRV, _______, \ _______, _______, _______, _______, _______, _______, _______, KC_ENT, _______, _______, _______, KC_PGUP, _______, \ _______, _______, _______, _______, _______, KC_UNDS , KC_DEL, _______, _______, KC_HOME, KC_PGDN, KC_END \ ), -[OSY] = KEYMAP( +[OSY] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ _______, KC_VOLD, KC_VOLU, KC_MUTE, KC_PWR, _______, _______, _______, _______, _______, _______, _______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ ), -[MOS] = KEYMAP( +[MOS] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ _______, _______, _______, _______, _______, _______, _______, KC_BTN1, KC_BTN2, _______, _______, _______, _______, \ _______, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, _______, _______, _______, \ @@ -38,12 +36,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ ) }; - - -const uint16_t PROGMEM fn_actions[] = { - -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { - return MACRO_NONE; -}; diff --git a/keyboards/handwired/fivethirteen/readme.md b/keyboards/handwired/fivethirteen/readme.md new file mode 100644 index 000000000..1a22fc9b9 --- /dev/null +++ b/keyboards/handwired/fivethirteen/readme.md @@ -0,0 +1,12 @@ +# fivethirteen + +A handwired 5x13 ortholinear keyboard with a 2U space bar. + +Keyboard Maintainer: [The QMK Community](https://github.com/qmk) +Hardware Supported: fivethirteen handwired + +Make example for this keyboard (after setting up your build environment): + + make handwired/fivethirteen:default + +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). From 57678238a9f7023b3e0ba03bd9a61f6a7c309f9d Mon Sep 17 00:00:00 2001 From: Snipeye Date: Wed, 5 Dec 2018 19:31:21 -0700 Subject: [PATCH 628/788] Keyboard: Fixing spelling, updating code, finalizing keymap for Dichotomy (#4539) * Fixing spelling, updating code, finalizing keymap for Dichotomy * Fixing requested changes in PR * Further PR-requested changes for convention * Making macros functionable, removing unecessary defs * Fixing keymap to properly use previously-changed macros --- keyboards/dichotemy/dichotemy.h | 67 --- keyboards/dichotemy/keymaps/default/keymap.c | 394 -------------- keyboards/{dichotemy => dichotomy}/config.h | 8 +- .../dichotemy.c => dichotomy/dichotomy.c} | 27 +- keyboards/dichotomy/dichotomy.h | 46 ++ keyboards/{dichotemy => dichotomy}/info.json | 2 +- keyboards/dichotomy/keymaps/default/keymap.c | 506 ++++++++++++++++++ keyboards/{dichotemy => dichotomy}/matrix.c | 78 ++- keyboards/{dichotemy => dichotomy}/readme.md | 2 +- keyboards/{dichotemy => dichotomy}/rules.mk | 16 +- 10 files changed, 651 insertions(+), 495 deletions(-) delete mode 100644 keyboards/dichotemy/dichotemy.h delete mode 100644 keyboards/dichotemy/keymaps/default/keymap.c rename keyboards/{dichotemy => dichotomy}/config.h (92%) mode change 100644 => 100755 rename keyboards/{dichotemy/dichotemy.c => dichotomy/dichotomy.c} (77%) mode change 100644 => 100755 create mode 100755 keyboards/dichotomy/dichotomy.h rename keyboards/{dichotemy => dichotomy}/info.json (98%) create mode 100755 keyboards/dichotomy/keymaps/default/keymap.c rename keyboards/{dichotemy => dichotomy}/matrix.c (58%) mode change 100644 => 100755 rename keyboards/{dichotemy => dichotomy}/readme.md (98%) mode change 100644 => 100755 rename keyboards/{dichotemy => dichotomy}/rules.mk (87%) mode change 100644 => 100755 diff --git a/keyboards/dichotemy/dichotemy.h b/keyboards/dichotemy/dichotemy.h deleted file mode 100644 index 1d617d91c..000000000 --- a/keyboards/dichotemy/dichotemy.h +++ /dev/null @@ -1,67 +0,0 @@ -#ifndef DICHOTEMY_H -#define DICHOTEMY_H - -#include "quantum.h" -#include "matrix.h" -#include "backlight.h" -#include - -#define red_led_off PORTF |= (1<<5) -#define red_led_on PORTF &= ~(1<<5) -#define blu_led_off PORTF |= (1<<4) -#define blu_led_on PORTF &= ~(1<<4) -#define grn_led_off PORTD |= (1<<1) -#define grn_led_on PORTD &= ~(1<<1) - -#define set_led_off red_led_off; grn_led_off; blu_led_off -#define set_led_red red_led_on; grn_led_off; blu_led_off -#define set_led_blue red_led_off; grn_led_off; blu_led_on -#define set_led_green red_led_off; grn_led_on; blu_led_off -#define set_led_yellow red_led_on; grn_led_on; blu_led_off -#define set_led_magenta red_led_on; grn_led_off; blu_led_on -#define set_led_cyan red_led_off; grn_led_on; blu_led_on -#define set_led_white red_led_on; grn_led_on; blu_led_on - -/* -#define LED_B 5 -#define LED_R 6 -#define LED_G 7 - -#define all_leds_off PORTF &= ~(1<event.pressed) { - num_timer = timer_read(); - number_singular_key = true; - layer_invert(_NM); - } else { - if (timer_elapsed(num_timer) < MAX_TOGGLE_LENGTH && number_singular_key) { - //do nothing, the layer has already been inverted - } else { - layer_invert(_NM); - } - } - update_tri_layer(_NM, _SF, _NS); - return false; - break; - //SHIFT is handled as LSHIFT in the general case - 'toggle' shoudl activate caps, while the layer is only active when shift is held. - case SFTKEY: - if (record->event.pressed) { - shift_held = true; - shift_suspended = false; - shift_timer = timer_read(); - shift_singular_key = true; - layer_on(_SF); - register_code(KC_LSFT); - } else { - shift_held = false; - if (timer_elapsed(shift_timer) < MAX_TOGGLE_LENGTH && shift_singular_key) { - //this was basically a toggle, so activate/deactivate caps lock. - SEND_STRING(SS_TAP(X_CAPSLOCK)); - } - layer_off(_SF); - unregister_code(KC_LSFT); - } - update_tri_layer(_NM, _SF, _NS); - return false; - break; - //MOUSE layer needs to be handled the same way as NUMKEY, but differently from shift - case MOUSE: - if (record->event.pressed) { - mouse_timer = timer_read(); - mouse_singular_key = true; - layer_invert(_MS); - } else { - if (timer_elapsed(mouse_timer) < MAX_TOGGLE_LENGTH && number_singular_key){ - //do nothing, it was a toggle (and it's already been toggled) - } else { - layer_invert(_MS); - } - } - return false; - break; - //Custom macros for strange keys with different long-tap behavior - case CK_1G: - if (shift_held && shift_suspended){ - register_code(KC_LSFT); - shift_suspended = false; - } - shift_singular_key = false; - number_singular_key = false; - mouse_singular_key = false; - if (record->event.pressed) { - special_timers[CK_1G-SAFE_RANGE] = timer_read(); - } else { - if (special_key_states[CK_1G-SAFE_RANGE]){ - //key was activated after longpress_delay, need to close those keycodes - special_key_states[CK_1G-SAFE_RANGE] = 0; - unregister_code(KC_GRAVE); - } else { - //key was not activated, return macro activating proper, pre-long-tap key - SEND_STRING(SS_TAP(X_1)); - } - special_timers[CK_1G-SAFE_RANGE] = 0xFFFF; - } - break; - case CK_BSPE: - if (shift_held && shift_suspended){ - register_code(KC_LSFT); - shift_suspended = false; - } - shift_singular_key = false; - number_singular_key = false; - mouse_singular_key = false; - if (record->event.pressed) { - special_timers[CK_BSPE-SAFE_RANGE] = timer_read(); - } else { - if (special_key_states[CK_BSPE-SAFE_RANGE]){ - //key was activated after longpress_delay, need to close those keycodes - special_key_states[CK_BSPE-SAFE_RANGE] = 0; - unregister_code(KC_ENTER); - } else { - //key was not activated, return macro activating proper, pre-long-tap key - SEND_STRING(SS_TAP(X_BSLASH)); - } - special_timers[CK_BSPE-SAFE_RANGE] = 0xFFFF; - } - break; - case CK_QE: - if (shift_held && shift_suspended){ - register_code(KC_LSFT); - shift_suspended = false; - } - shift_singular_key = false; - number_singular_key = false; - mouse_singular_key = false; - if (record->event.pressed) { - special_timers[CK_QE-SAFE_RANGE] = timer_read(); - } else { - if (special_key_states[CK_QE-SAFE_RANGE]){ - //key was activated after longpress_delay, need to close those keycodes - special_key_states[CK_QE-SAFE_RANGE] = 0; - unregister_code(KC_ENTER); - } else { - //key was not activated, return macro activating proper, pre-long-tap key - SEND_STRING(SS_TAP(X_QUOTE)); - } - special_timers[CK_QE-SAFE_RANGE] = 0xFFFF; - } - break; - case CK_TE: - if (shift_held && shift_suspended){ - register_code(KC_LSFT); - shift_suspended = false; - } - if (record->event.pressed) { - special_timers[CK_TE-SAFE_RANGE] = timer_read(); - } else { - if (special_key_states[CK_TE-SAFE_RANGE]){ - //key was activated after longpress_delay, need to close those keycodes - special_key_states[CK_TE-SAFE_RANGE] = 0; - unregister_code(KC_ENTER); - } else { - //key was not activated, return macro activating proper, pre-long-tap key - SEND_STRING(SS_TAP(X_TAB)); - } - special_timers[CK_TE-SAFE_RANGE] = 0xFFFF; - } - break; - //No-shift keys, they unregister the KC_LSFT code so they can send - //unshifted values - but they don't change the bool. if any other - //key is pressed and the bool is set, KC_LSFT is registered again. - case NS_HYPH: - if (record->event.pressed) { - shift_suspended = true; - unregister_code(KC_LSFT); - register_code(KC_MINS); - } else { - unregister_code(KC_MINS); - if (shift_held && shift_suspended){ - register_code(KC_LSFT); - shift_suspended = false; - } - } - break; - case NS_EQU: - if (record->event.pressed) { - shift_suspended = true; - unregister_code(KC_LSFT); - register_code(KC_EQUAL); - } else { - unregister_code(KC_EQUAL); - if (shift_held && shift_suspended){ - register_code(KC_LSFT); - shift_suspended = false; - } - } - break; - - //mouse buttons, for 1-3, to update the mouse report: - case MS_BTN1: - currentReport = pointing_device_get_report(); - if (record->event.pressed) { - if (shift_held && shift_suspended){ - register_code(KC_LSFT); - shift_suspended = false; - } - //update mouse report here - currentReport.buttons |= MOUSE_BTN1; //MOUSE_BTN1 is a const defined in report.h - } else { - //update mouse report here - currentReport.buttons &= ~MOUSE_BTN1; - } - pointing_device_set_report(currentReport); - break; - case MS_BTN2: - currentReport = pointing_device_get_report(); - if (record->event.pressed) { - if (shift_held && shift_suspended){ - register_code(KC_LSFT); - shift_suspended = false; - } - //update mouse report here - currentReport.buttons |= MOUSE_BTN2; //MOUSE_BTN2 is a const defined in report.h - } else { - //update mouse report here - } - pointing_device_set_report(currentReport); - break; - //there is a case for button 3, but that's handled in dichotemy.c, and this is being - //disabled to avoid any conflict. - /*case MS_BTN3: - currentReport = pointing_device_get_report(); - if (record->event.pressed) { - if (shift_held && shift_suspended){ - register_code(KC_LSFT); - shift_suspended = false; - } - //update mouse report here - currentReport.buttons |= MOUSE_BTN3; //MOUSE_BTN2 is a const defined in report.h - } else { - //update mouse report here - } - pointing_device_set_report(currentReport); - break;*/ - - //If any other key was pressed during the layer mod hold period, - //then the layer mod was used momentarily, and should block latching - //Additionally, if NS_ keys are in use, then shift may be held (but is - //disabled for the unshifted keycodes to be send. Check the bool and - //register shift as necessary. - default: - if (shift_held){ - register_code(KC_LSFT); - } - shift_singular_key = false; - number_singular_key = false; - mouse_singular_key = false; - break; - } - return true; -}; - -void matrix_scan_user(void) { - uint8_t layer = biton32(layer_state); - for (uint8_t i = 0; i= LONGPRESS_DELAY && !special_key_states[i]){ - switch (i + SAFE_RANGE){ - case CK_1G: - register_code(KC_GRAVE); - break; - case CK_BSPE: - register_code(KC_ENTER); - break; - case CK_QE: - register_code(KC_ENTER); - break; - case CK_TE: - register_code(KC_ESCAPE); - break; - } - special_key_states[i] = 1; - } - } - switch (layer) { - case _BS: - set_led_off; - break; - case _NM: - set_led_blue; - break; - case _SF: - set_led_red; - break; - case _NS: - set_led_green; - break; - default: - break; - } -}; - diff --git a/keyboards/dichotemy/config.h b/keyboards/dichotomy/config.h old mode 100644 new mode 100755 similarity index 92% rename from keyboards/dichotemy/config.h rename to keyboards/dichotomy/config.h index 1d92cf74e..f0847ec52 --- a/keyboards/dichotemy/config.h +++ b/keyboards/dichotomy/config.h @@ -24,10 +24,10 @@ along with this program. If not, see . #define VENDOR_ID 0xFEED #define PRODUCT_ID 0xACC7 -#define DEVICE_VER 0x0001 -#define MANUFACTURER unknown -#define PRODUCT Dichotemy -#define DESCRIPTION q.m.k. keyboard firmware for Dichotemy +#define DEVICE_VER 0x0002 +#define MANUFACTURER Broekhuijsen +#define PRODUCT Dichotomy +#define DESCRIPTION q.m.k. keyboard firmware for Dichotomy /* key matrix size */ #define MATRIX_ROWS 5 diff --git a/keyboards/dichotemy/dichotemy.c b/keyboards/dichotomy/dichotomy.c old mode 100644 new mode 100755 similarity index 77% rename from keyboards/dichotemy/dichotemy.c rename to keyboards/dichotomy/dichotomy.c index 080c2654c..41e12090c --- a/keyboards/dichotemy/dichotemy.c +++ b/keyboards/dichotomy/dichotomy.c @@ -1,13 +1,11 @@ -#include "dichotemy.h" -#include "pointing_device.h" -#include "report.h" +#include "dichotomy.h" void uart_init(void) { SERIAL_UART_INIT(); } void pointing_device_task(void){ - report_mouse_t currentReport = {}; + /*report_mouse_t currentReport = {}; SERIAL_UART_INIT(); uint32_t timeout = 0; @@ -25,28 +23,31 @@ void pointing_device_task(void){ while(!SERIAL_UART_RXD_PRESENT){ timeout++; if (timeout > 10000){ + xprintf("\r\nTIMED OUT"); break; } - } + } + xprintf("\r\nGOT DATA for %d",i); uart_data[i] = SERIAL_UART_DATA; } - //check for the end packet, bits 1-4 are movement and scroll - //but bit 5 has bits 0-3 for the scroll button state + //check for the end packet, bytes 1-4 are movement and scroll + //but byte 5 has bits 0-3 for the scroll button state //(1000 if pressed, 0000 if not) and bits 4-7 are always 1 //We can use this to verify the report sent properly. if (uart_data[4] == 0x0F || uart_data[4] == 0x8F) { + xprintf("\r\nREQUESTED MOUSE, RECEIVED %i, %i, %i, %i, %i",uart_data[0],uart_data[1],uart_data[2],uart_data[3],uart_data[4]); currentReport = pointing_device_get_report(); //shifting and transferring the info to the mouse report varaible //mouseReport.x = 127 max -127 min - currentReport.x = uart_data[0]; + currentReport.x = (int8_t) uart_data[0]; //mouseReport.y = 127 max -127 min - currentReport.y = uart_data[1]; + currentReport.y = (int8_t) uart_data[1]; //mouseReport.v = 127 max -127 min (scroll vertical) - currentReport.v = uart_data[2]; + currentReport.v = (int8_t) uart_data[2]; //mouseReport.h = 127 max -127 min (scroll horizontal) - currentReport.h = uart_data[3]; + currentReport.h = (int8_t) uart_data[3]; //mouseReport.buttons = 0x31 max (bitmask for mouse buttons 1-5) 0x00 min //mouse buttons 1 and 2 are handled by the keymap, but not 3 if (uart_data[4] == 0x0F) { //then 3 is not pressed @@ -55,7 +56,9 @@ void pointing_device_task(void){ currentReport.buttons |= MOUSE_BTN3; } pointing_device_set_report(currentReport); - } + } else { + xprintf("\r\nRequested packet, data 4 was %d",uart_data[4]); + }*/ pointing_device_send(); } diff --git a/keyboards/dichotomy/dichotomy.h b/keyboards/dichotomy/dichotomy.h new file mode 100755 index 000000000..030209ff0 --- /dev/null +++ b/keyboards/dichotomy/dichotomy.h @@ -0,0 +1,46 @@ +#ifndef DICHOTOMY_H +#define DICHOTOMY_H + +#include QMK_KEYBOARD_H +#include "report.h" +#include "pointing_device.h" +#include "quantum.h" +#include "matrix.h" +#include "backlight.h" +#include + +#define red_led_off() PORTF |= (1<<6) +#define red_led_on() PORTF &= ~(1<<6) +#define blu_led_off() PORTF |= (1<<5) +#define blu_led_on() PORTF &= ~(1<<5) +#define grn_led_off() PORTD |= (1<<1) +#define grn_led_on() PORTD &= ~(1<<1) + +#define set_led_off() red_led_off(); grn_led_off(); blu_led_off() +#define set_led_red() red_led_on(); grn_led_off(); blu_led_off() +#define set_led_blue() red_led_off(); grn_led_off(); blu_led_on() +#define set_led_green() red_led_off(); grn_led_on(); blu_led_off() +#define set_led_yellow() red_led_on(); grn_led_on(); blu_led_off() +#define set_led_magenta() red_led_on(); grn_led_off(); blu_led_on() +#define set_led_cyan() red_led_off(); grn_led_on(); blu_led_on() +#define set_led_white() red_led_on(); grn_led_on(); blu_led_on() + +// This a shortcut to help you visually see your layout. +// The first section contains all of the arguements +// The second converts the arguments into a two-dimensional array +#define LAYOUT( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, \ + k33, k34, k35, k36, k37, k38, \ + k42, k43, k44, k45, k46, k47, k48, k49 \ +) \ +{ \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B }, \ + { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B }, \ + { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B }, \ + { KC_NO, KC_NO, KC_NO, k33, k34, k35, k36, k37, k38, KC_NO, KC_NO, KC_NO }, \ + { KC_NO, KC_NO, k42, k43, k44, k45, k46, k47, k48, k49, KC_NO, KC_NO } \ +} + +#endif diff --git a/keyboards/dichotemy/info.json b/keyboards/dichotomy/info.json similarity index 98% rename from keyboards/dichotemy/info.json rename to keyboards/dichotomy/info.json index fc4390cdd..aeb00edce 100644 --- a/keyboards/dichotemy/info.json +++ b/keyboards/dichotomy/info.json @@ -1,5 +1,5 @@ { - "keyboard_name": "Dichotemy", + "keyboard_name": "Dichotomy", "url": "", "maintainer": "qmk", "width": 13, diff --git a/keyboards/dichotomy/keymaps/default/keymap.c b/keyboards/dichotomy/keymaps/default/keymap.c new file mode 100755 index 000000000..e44bd21d9 --- /dev/null +++ b/keyboards/dichotomy/keymaps/default/keymap.c @@ -0,0 +1,506 @@ +// this is the style you want to emulate. +// This is the canonical layout file for the Quantum project. If you want to add another keyboard, + +#include "dichotomy.h" + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +enum dichotomy_layers { + _BS, + _SF, + _NM, + _NS, + _MS +}; + +#define LONGPRESS_COUNT 4 + +enum dichotomy_keycodes +{ + CK_1G = SAFE_RANGE, + CK_BSPE, + CK_QE, + CK_TE, //these 4 CK_XXXX keys are special "alternate long-press" keys controlled with unique timers. Make sure you understand them before you mess with them. + NS_HYPH, + NS_EQU, + NUMKEY, + SFTKEY, + MOUKEY, + MS_BTN1, + MS_BTN2, + MS_BTN3 +}; + +#define CUSTOM_LONGPRESS 150 +#define CUSTOM_TOGGLE_TIME 300 + +#define RED_BRIGHTNESS 3 +#define GREEN_BRIGHTNESS 2 +#define BLUE_BRIGHTNESS 2 + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[_BS] = LAYOUT( /* Base layout, nearly qwerty but with modifications because it's not a full keyboard. Obviously. */ + CK_TE, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + NUMKEY, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, CK_QE, + SFTKEY, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, MOUKEY, + KC_LCTL, KC_LALT, KC_LGUI, KC_RGUI, KC_RALT, KC_RCTL, + MS_BTN3, KC_LBRC, KC_LPRN, KC_SPC, KC_SPC, KC_RPRN, KC_RBRC, MS_BTN3 +), + +[_SF] = LAYOUT( /* Shifted layout, small changes (because angle brackets have been moved to thumb cluster buttons) */ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, NS_HYPH, KC_UNDS, _______, _______, + _______, _______, _______, _______, _______, _______, + _______, _______, KC_LABK, _______, _______, KC_RABK, _______, _______ +), + +[_NM] = LAYOUT( /* Number layout, basically the main function layer */ + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, _______, + _______, CK_1G, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, CK_BSPE, + _______, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, _______, + _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______ +), + +[_NS] = LAYOUT( /* Shifted number/function layout, for per-key control. Only active when shift is held, and number is toggled or held */ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PLUS, NS_EQU, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______ +), + +[_MS] = LAYOUT( /* Mouse layer, including buttons for clicking. */ + _______, _______, _______, _______, _______, _______, KC_VOLU, KC_HOME, KC_PGUP, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, MS_BTN1, MS_BTN2, _______, _______, _______, + _______, _______, _______, _______, _______, _______, KC_VOLD, KC_END, KC_PGDN, _______, _______, _______, + _______, _______, _______, _______, KC_UP, _______, + _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______ +) + +}; + + +const uint16_t PROGMEM fn_actions[] = { + +}; + +static uint16_t special_timers[LONGPRESS_COUNT] = {0xFFFF,0xFFFF,0xFFFF,0xFFFF}; +static bool special_key_states[LONGPRESS_COUNT] = {0,0,0,0}; +static bool special_key_pressed[LONGPRESS_COUNT] = {0,0,0,0}; + +static uint16_t shift_timer; +static uint16_t num_timer; +static uint16_t mouse_timer; + +static uint8_t red_timer; +static uint8_t green_timer; +static uint8_t blue_timer; + +static bool shift_singular_key = false; +static bool number_singular_key = false; +static bool mouse_singular_key = false; +static bool capsLED = false; +static bool shiftLED = false; +static bool numLED = false; +static bool mouseLED = false; + +static bool shift_held = false; +static bool shift_suspended = false; +report_mouse_t currentReport = {}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + //uint8_t layer; + //layer = biton32(layer_state); // get the current layer //Or don't, I didn't use it. + bool returnVal = true; //this is to determine if more key processing is needed. + + //custom layer handling for tri_layer, + switch (keycode) { + case NUMKEY: + if (record->event.pressed) { + num_timer = timer_read(); + number_singular_key = true; + layer_invert(_NM); + numLED = !numLED; + } else { + if (timer_elapsed(num_timer) < CUSTOM_TOGGLE_TIME && number_singular_key) { + //do nothing, the layer has already been inverted + } else { + layer_invert(_NM); + numLED = !numLED; + } + } + update_tri_layer(_NM, _SF, _NS); + returnVal = false; + break; + //SHIFT is handled as LSHIFT in the general case - 'toggle' shoudl activate caps, while the layer is only active when shift is held. + case SFTKEY: + if (record->event.pressed) { + shift_held = true; + shiftLED = true; + shift_suspended = false; + shift_timer = timer_read(); + shift_singular_key = true; + layer_on(_SF); + register_code(KC_LSFT); + } else { + shift_held = false; + shiftLED = false; + if (timer_elapsed(shift_timer) < CUSTOM_TOGGLE_TIME && shift_singular_key) { + //this was basically a toggle, so activate/deactivate caps lock. + SEND_STRING(SS_TAP(X_CAPSLOCK)); + capsLED = !capsLED; + } + layer_off(_SF); + unregister_code(KC_LSFT); + } + update_tri_layer(_NM, _SF, _NS); + returnVal = false; + break; + //MOUSE layer needs to be handled the same way as NUMKEY, but differently from shift + case MOUKEY: + if (record->event.pressed) { + mouse_timer = timer_read(); + mouse_singular_key = true; + layer_invert(_MS); + mouseLED = !mouseLED; + } else { + if (timer_elapsed(mouse_timer) < CUSTOM_TOGGLE_TIME && mouse_singular_key){ + //do nothing, it was a toggle (and it's already been toggled) + } else { + layer_invert(_MS); + mouseLED = !mouseLED; + } + } + returnVal = false; + break; + //Custom macros for strange keys with different long-tap behavior + case CK_1G: + if (shift_held && shift_suspended){ + register_code(KC_LSFT); + shift_suspended = false; + } + if (record->event.pressed) { + special_timers[CK_1G-SAFE_RANGE] = timer_read(); + special_key_pressed[CK_1G-SAFE_RANGE] = 1; + } else { + if (special_key_states[CK_1G-SAFE_RANGE]){ + //key was activated after custom_longpress, need to close those keycodes + special_key_states[CK_1G-SAFE_RANGE] = 0; + unregister_code(KC_GRAVE); + } else { + if (special_key_pressed[CK_1G-SAFE_RANGE]){ + //key was not activated, return macro activating proper, pre-long-tap key + SEND_STRING(SS_TAP(X_1)); + special_key_pressed[CK_1G-SAFE_RANGE] = 0; + } else { + //the short key was already sent, because another key was pressed. + //Do nothing. + } + + } + } + returnVal = false; + break; + case CK_BSPE: + if (shift_held && shift_suspended){ + register_code(KC_LSFT); + shift_suspended = false; + } + if (record->event.pressed) { + special_timers[CK_BSPE-SAFE_RANGE] = timer_read(); + special_key_pressed[CK_BSPE-SAFE_RANGE] = 1; + } else { + if (special_key_states[CK_BSPE-SAFE_RANGE]){ + //key was activated after custom_longpress, need to close those keycodes + special_key_states[CK_BSPE-SAFE_RANGE] = 0; + unregister_code(KC_ENTER); + } else { + if (special_key_pressed[CK_BSPE-SAFE_RANGE]){ + //key was not activated, return macro activating proper, pre-long-tap key + SEND_STRING(SS_TAP(X_BSLASH)); + special_key_pressed[CK_BSPE-SAFE_RANGE] = 0; + } else { + //the short key was already sent, because another key was pressed. + //Do nothing. + } + } + } + returnVal = false; + break; + case CK_QE: + if (shift_held && shift_suspended){ + register_code(KC_LSFT); + shift_suspended = false; + } + if (record->event.pressed) { + special_timers[CK_QE-SAFE_RANGE] = timer_read(); + special_key_pressed[CK_QE-SAFE_RANGE] = 1; + } else { + if (special_key_states[CK_QE-SAFE_RANGE]){ + //key was activated after custom_longpress, need to close those keycodes + special_key_states[CK_QE-SAFE_RANGE] = 0; + unregister_code(KC_ENTER); + } else { + if (special_key_pressed[CK_QE-SAFE_RANGE]){ + //the long-press key was not activated, return macro activating proper, pre-long-tap key + SEND_STRING(SS_TAP(X_QUOTE)); + special_key_pressed[CK_QE-SAFE_RANGE] = 0; + } else { + //the short key was already sent, because another key was pressed. + //Do nothing. + } + } + } + returnVal = false; + break; + case CK_TE: + if (shift_held && shift_suspended){ + register_code(KC_LSFT); + shift_suspended = false; + } + if (record->event.pressed) { + special_timers[CK_TE-SAFE_RANGE] = timer_read(); + special_key_pressed[CK_TE-SAFE_RANGE] = 1; + } else { + if (special_key_states[CK_TE-SAFE_RANGE]){ + //key was activated after custom_longpress, need to close those keycodes + special_key_states[CK_TE-SAFE_RANGE] = 0; + unregister_code(KC_ESCAPE); + } else { + if (special_key_pressed[CK_TE-SAFE_RANGE]){ + //the long-press key was not activated, return macro activating proper, pre-long-tap key + SEND_STRING(SS_TAP(X_TAB)); + special_key_pressed[CK_TE-SAFE_RANGE] = 0; + } else { + //the short key was already sent, because another key was pressed. + //Do nothing. + } + } + } + returnVal = false; + break; + //No-shift keys, they unregister the KC_LSFT code so they can send + //unshifted values - but they don't change the bool. if any other + //key is pressed and the bool is set, KC_LSFT is registered again. + case NS_HYPH: + if (record->event.pressed) { + shift_suspended = true; + unregister_code(KC_LSFT); + register_code(KC_MINS); + } else { + unregister_code(KC_MINS); + if (shift_held && shift_suspended){ + register_code(KC_LSFT); + shift_suspended = false; + } + } + returnVal = false; + break; + case NS_EQU: + if (record->event.pressed) { + shift_suspended = true; + unregister_code(KC_LSFT); + register_code(KC_EQUAL); + } else { + unregister_code(KC_EQUAL); + if (shift_held && shift_suspended){ + register_code(KC_LSFT); + shift_suspended = false; + } + } + returnVal = false; + break; + + //mouse buttons, for 1-3, to update the mouse report: + case MS_BTN1: + currentReport = pointing_device_get_report(); + if (record->event.pressed) { + if (shift_held && shift_suspended){ + register_code(KC_LSFT); + shift_suspended = false; + } + //update mouse report here + currentReport.buttons |= MOUSE_BTN1; //MOUSE_BTN1 is a const defined in report.h + } else { + //update mouse report here + currentReport.buttons &= ~MOUSE_BTN1; + } + pointing_device_set_report(currentReport); + returnVal = false; + break; + case MS_BTN2: + currentReport = pointing_device_get_report(); + if (record->event.pressed) { + if (shift_held && shift_suspended){ + register_code(KC_LSFT); + shift_suspended = false; + } + //update mouse report here + currentReport.buttons |= MOUSE_BTN2; //MOUSE_BTN2 is a const defined in report.h + } else { + //update mouse report here + currentReport.buttons &= ~MOUSE_BTN2; + } + pointing_device_set_report(currentReport); + returnVal = false; + break; + case MS_BTN3: + currentReport = pointing_device_get_report(); + if (record->event.pressed) { + if (shift_held && shift_suspended){ + register_code(KC_LSFT); + shift_suspended = false; + } + //update mouse report here + currentReport.buttons |= MOUSE_BTN3; //MOUSE_BTN3 is a const defined in report.h + } else { + //update mouse report here + currentReport.buttons &= ~MOUSE_BTN3; + } + pointing_device_set_report(currentReport); + returnVal = false; + break; + //Additionally, if NS_ keys are in use, then shift may be held (but is + //disabled for the unshifted keycodes to be send. Check the bool and + //register shift as necessary. + default: + if (shift_held){ + register_code(KC_LSFT); + } + break; + } + switch (keycode){ + case KC_BSPC: + case KC_NO: + case NUMKEY: + case SFTKEY: + case MOUKEY: + //don't want to reset single key variables + break; + default: + //If any other key was pressed during the layer mod hold period, + //then the layer mod was used momentarily, and should block latching + shift_singular_key = false; + number_singular_key = false; + mouse_singular_key = false; + break; + } + switch (keycode){ + case KC_BSPC: + case KC_NO: + case NUMKEY: + case SFTKEY: + case MOUKEY: + case MOUSE_BTN1: + case MOUSE_BTN2: + case MOUSE_BTN3: + case KC_LCTL: + case KC_LALT: + case KC_LGUI: + case KC_RCTL: + case KC_RALT: + case KC_RGUI: + case CK_1G: + case CK_BSPE: + case CK_QE: + case CK_TE: + //Do nothing, don't want to trigger the timer key rollover + break; + default: + //Now we're checking to see if any of the special timer keys are pressed + //if so, we need to activate their short-press features + if (record->event.pressed) { + for (uint8_t i = 0; i= CUSTOM_LONGPRESS) && (!special_key_states[i]) && special_key_pressed[i]){ + switch (i + SAFE_RANGE){ + case CK_1G: + register_code(KC_GRAVE); + break; + case CK_BSPE: + register_code(KC_ENTER); + break; + case CK_QE: + register_code(KC_ENTER); + break; + case CK_TE: + register_code(KC_ESCAPE); + break; + } + special_key_pressed[i] = 0; + special_key_states[i] = 1; + } + } + if (shiftLED || capsLED){ + red_timer++; + if (red_timer < RED_BRIGHTNESS){ + red_led_on(); + } else { + red_timer = 0; + red_led_off(); + } + } else { + red_timer = 0; + red_led_off(); + } + if (numLED){ + green_timer++; + if (green_timer < GREEN_BRIGHTNESS){ + grn_led_on(); + } else { + green_timer = 0; + grn_led_off(); + } + } else { + green_timer = 0; + grn_led_off(); + } + if (mouseLED){ + blue_timer++; + if (blue_timer < BLUE_BRIGHTNESS){ + blu_led_on(); + } else { + blue_timer = 0; + blu_led_off(); + } + } else { + blue_timer = 0; + blu_led_off(); + } +}; diff --git a/keyboards/dichotemy/matrix.c b/keyboards/dichotomy/matrix.c old mode 100644 new mode 100755 similarity index 58% rename from keyboards/dichotemy/matrix.c rename to keyboards/dichotomy/matrix.c index f2841df1d..14c3f0d8e --- a/keyboards/dichotemy/matrix.c +++ b/keyboards/dichotomy/matrix.c @@ -26,6 +26,9 @@ along with this program. If not, see . #include "util.h" #include "matrix.h" #include "timer.h" +#include "dichotomy.h" +#include "pointing_device.h" +#include "report.h" #if (MATRIX_COLS <= 8) # define print_matrix_header() print("\nr/c 01234567\n") @@ -45,11 +48,21 @@ along with this program. If not, see . #endif #define MAIN_ROWMASK 0xFFF0; -#define LOWER_ROWMASK 0x1F80; +#define LOWER_ROWMASK 0x3FC0; /* matrix state(1:on, 0:off) */ static matrix_row_t matrix[MATRIX_ROWS]; +__attribute__ ((weak)) +void matrix_init_quantum(void) { + matrix_init_kb(); +} + +__attribute__ ((weak)) +void matrix_scan_quantum(void) { + matrix_scan_kb(); +} + __attribute__ ((weak)) void matrix_init_kb(void) { matrix_init_user(); @@ -79,13 +92,16 @@ uint8_t matrix_cols(void) { } void matrix_init(void) { - + DDRF |= (1<<6); + DDRF |= (1<<5); + DDRD |= (1<<1); matrix_init_quantum(); } uint8_t matrix_scan(void) { SERIAL_UART_INIT(); + //xprintf("\r\nTRYING TO SCAN"); uint32_t timeout = 0; @@ -93,25 +109,35 @@ uint8_t matrix_scan(void) SERIAL_UART_DATA = 's'; //trust the external keystates entirely, erase the last data - uint8_t uart_data[7] = {0}; + uint8_t uart_data[11] = {0}; //there are 10 bytes corresponding to 10 columns, and an end byte - for (uint8_t i = 0; i < 7; i++) { + for (uint8_t i = 0; i < 11; i++) { //wait for the serial data, timeout if it's been too long //this only happened in testing with a loose wire, but does no //harm to leave it in here while(!SERIAL_UART_RXD_PRESENT){ timeout++; if (timeout > 10000){ + xprintf("\r\nTime out in keyboard."); break; } - } + } uart_data[i] = SERIAL_UART_DATA; } //check for the end packet, the key state bytes use the LSBs, so 0xE0 //will only show up here if the correct bytes were recieved - if (uart_data[6] == 0x96) { //this is an arbitrary binary checksum (10010110) + uint8_t checksum = 0x00; + for (uint8_t z=0; z<10; z++){ + checksum = checksum^uart_data[z]; + } + checksum = checksum ^ (uart_data[10] & 0xF0); + // Smash the checksum from 1 byte into 4 bits + checksum = (checksum ^ ((checksum & 0xF0)>>4)) & 0x0F; +//xprintf("\r\nGOT RAW PACKET: \r\n%d\r\n%d\r\n%d\r\n%d\r\n%d\r\n%d\r\n%d\r\n%d\r\n%d\r\n%d\r\n%d\r\n%d",uart_data[0],uart_data[1],uart_data[2],uart_data[3],uart_data[4],uart_data[5],uart_data[6],uart_data[7],uart_data[8],uart_data[9],uart_data[10],checksum); + if ((uart_data[10] & 0x0F) == checksum) { //this is an arbitrary binary checksum (1001) (that would be 0x9.) + //xprintf("\r\nGOT PACKET: \r\n%d\r\n%d\r\n%d\r\n%d\r\n%d\r\n%d",uart_data[0],uart_data[1],uart_data[2],uart_data[3],uart_data[4],uart_data[5]); //shifting and transferring the keystates to the QMK matrix variable //bits 1-12 are row 1, 13-24 are row 2, 25-36 are row 3, //bits 37-42 are row 4 (only 6 wide, 1-3 are 0, and 10-12 are 0) @@ -121,15 +147,49 @@ uint8_t matrix_scan(void) matrix[1] = ((uint16_t) uart_data[1] << 12) | ((uint16_t) uart_data[2] << 4); matrix[2] = (((uint16_t) uart_data[3] << 8) | ((uint16_t) uart_data[4])) & MAIN_ROWMASK; matrix[3] = (((uint16_t) uart_data[4] << 9) | ((uint16_t) uart_data[5] << 1)) & LOWER_ROWMASK; - matrix[4] = ((uint16_t) uart_data[5] << 7) & LOWER_ROWMASK; + matrix[4] = (((uint16_t) uart_data[5] << 7) | ((uart_data[10] & 1<<7) ? 1:0) << 13 | ((uart_data[10] & 1<<6) ? 1:0) << 6) & LOWER_ROWMASK; /* OK, TURNS OUT THAT WAS A BAD ASSUMPTION */ for (uint8_t i = 0; i < MATRIX_ROWS; i++) { //I've unpacked these into the mirror image of what QMK expects them to be, so... - matrix[i] = ((matrix[i] * 0x0802LU & 0x22110LU) | (matrix[i] * 0x8020LU & 0x88440LU)) * 0x10101LU >> 16; + /*uint8_t halfOne = (matrix[i]>>8); + uint8_t halfTwo = (matrix[i] & 0xFF); + halfOne = ((halfOne * 0x0802LU & 0x22110LU) | (halfOne * 0x8020LU & 0x88440LU)) * 0x10101LU >> 16; + halfTwo = ((halfTwo * 0x0802LU & 0x22110LU) | (halfTwo * 0x8020LU & 0x88440LU)) * 0x10101LU >> 16; + matrix[i] = ((halfTwo<<8) & halfOne);*/ + //matrix[i] = ((matrix[i] * 0x0802LU & 0x22110LU) | (matrix[i] * 0x8020LU & 0x88440LU)) * 0x10101LU >> 16; + matrix[i] = bitrev16(matrix[i]); //bithack mirror! Doesn't make any sense, but works - and efficiently. } - } + //if (uart_data[6]!=0 || uart_data[7]!=0){ + //if (maxCount<101){ + // xprintf("\r\nMouse data: x=%d, y=%d",(int8_t)uart_data[6],(int8_t)uart_data[7]); + //} + report_mouse_t currentReport = {}; + //check for the end packet, bytes 1-4 are movement and scroll + //but byte 5 has bits 0-3 for the scroll button state + //(1000 if pressed, 0000 if not) and bits 4-7 are always 1 + //We can use this to verify the report sent properly. + currentReport = pointing_device_get_report(); + //shifting and transferring the info to the mouse report varaible + //mouseReport.x = 127 max -127 min + currentReport.x = (int8_t) uart_data[6]; + //mouseReport.y = 127 max -127 min + currentReport.y = (int8_t) uart_data[7]; + //mouseReport.v = 127 max -127 min (scroll vertical) + currentReport.v = (int8_t) uart_data[8]; + //mouseReport.h = 127 max -127 min (scroll horizontal) + currentReport.h = (int8_t) uart_data[9]; + /* + currentReport.x = 0; + currentReport.y = 0; + currentReport.v = 0; + currentReport.h = 0;*/ + pointing_device_set_report(currentReport); + } else { + //xprintf("\r\nRequested packet, data 10 was %d but checksum was %d",(uart_data[10] & 0x0F), (checksum & 0x0F)); + } + //matrix_print(); matrix_scan_quantum(); return 1; diff --git a/keyboards/dichotemy/readme.md b/keyboards/dichotomy/readme.md old mode 100644 new mode 100755 similarity index 98% rename from keyboards/dichotemy/readme.md rename to keyboards/dichotomy/readme.md index b30cf00cb..9027825c3 --- a/keyboards/dichotemy/readme.md +++ b/keyboards/dichotomy/readme.md @@ -1,4 +1,4 @@ -Dichotemy Keyboard Firmware +Dichotomy Keyboard Firmware ====================== These configuration files were based off the Mitosis keyboard. This keyboard uses a completely different 'matrix scan' system to other keyboards, it relies on an external nRF51822 microcontroller maintaining a matrix of keystates received from the keyboard halves - it also receives mouse pointer information from the keyboard halves, which is implemented through a new feature, "Pointing Device". The matrix.c file contains the code to poll the external microcontroller for the key matrix, and the keymap.c file contains similar code to obtain the mouse report. As long as the relavant functions in these files are not changed, all other QMK features are supported. diff --git a/keyboards/dichotemy/rules.mk b/keyboards/dichotomy/rules.mk old mode 100644 new mode 100755 similarity index 87% rename from keyboards/dichotemy/rules.mk rename to keyboards/dichotomy/rules.mk index 4e9db8687..4dbc999b7 --- a/keyboards/dichotemy/rules.mk +++ b/keyboards/dichotomy/rules.mk @@ -1,6 +1,6 @@ -OPT_DEFS += -DDICHOTEMY_PROMICRO -DICHOTEMY_UPLOAD_COMMAND = while [ ! -r $(USB) ]; do sleep 1; done; \ +OPT_DEFS += -DDICHOTOMY_PROMICRO +DICHOTOMY_UPLOAD_COMMAND = while [ ! -r $(USB) ]; do sleep 1; done; \ avrdude -p $(MCU) -c avr109 -U flash:w:$(TARGET).hex -P $(USB) # # project specific files @@ -24,6 +24,8 @@ MCU = atmega32u4 # software delays. F_CPU = 16000000 + +# # LUFA specific # # Target architecture (see library "Board Types" documentation). @@ -43,10 +45,10 @@ ARCH = AVR8 F_USB = $(F_CPU) # Bootloader -# This definition is optional, and if your keyboard supports multiple bootloaders of -# different sizes, comment this out, and the correct address will be loaded -# automatically (+60). See bootloader.mk for all options. -BOOTLOADER = caterina + # This definition is optional, and if your keyboard supports multiple bootloaders of + # different sizes, comment this out, and the correct address will be loaded + # automatically (+60). See bootloader.mk for all options. + BOOTLOADER = caterina # Interrupt driven control endpoint task(+60) OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT @@ -72,4 +74,4 @@ UNICODE_ENABLE = YES # Unicode USB = /dev/ttyACM0 #upload: build -# $(DICHOTEMY_UPLOAD_COMMAND) +# $(DICHOTOMY_UPLOAD_COMMAND) From a5b43b35fe7543c7d146029b05b8c6a13f17cd3e Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Thu, 6 Dec 2018 07:27:04 -0800 Subject: [PATCH 629/788] Sol rev1 Configurator support (#4562) Adds Configurator support for the Sol rev. 1 by RGBKB. Notes: The Sol keyboard supports split thumb keys like the Ergodox - any of the 2u thumb keys can be split into two 1u keys. The matrix here is configured for fully 1u keys on the thumbs. The Sol also supports installing a rotary encoder on each half. The key matrix given includes the encoders' functions, which are shown in the Configurator as two 1u keys side by side below each half's main key block. The left key of the two (for each side) represents that half's rotary encoder's counter-clockwise function, and the right key is that encoder's clockwise function. --- keyboards/sol/rev1/info.json | 91 ++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 keyboards/sol/rev1/info.json diff --git a/keyboards/sol/rev1/info.json b/keyboards/sol/rev1/info.json new file mode 100644 index 000000000..40bc01f7f --- /dev/null +++ b/keyboards/sol/rev1/info.json @@ -0,0 +1,91 @@ +{ + "keyboard_name": "Sol", + "url": "", + "maintainer": "Legonut", + "width": 17, + "height": 6.5, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"L00", "x":0, "y":0, "w":1.5}, + {"label":"L01", "x":1.5, "y":0}, + {"label":"L02", "x":2.5, "y":0}, + {"label":"L03", "x":3.5, "y":0}, + {"label":"L04", "x":4.5, "y":0}, + {"label":"L05", "x":5.5, "y":0}, + {"label":"L06", "x":6.75, "y":0}, + {"label":"R06", "x":9.25, "y":0}, + {"label":"R00", "x":10.5, "y":0}, + {"label":"R01", "x":11.5, "y":0}, + {"label":"R02", "x":12.5, "y":0}, + {"label":"R03", "x":13.5, "y":0}, + {"label":"R04", "x":14.5, "y":0}, + {"label":"R05", "x":15.5, "y":0, "w":1.5}, + {"label":"L10", "x":0, "y":1, "w":1.5}, + {"label":"L11", "x":1.5, "y":1}, + {"label":"L12", "x":2.5, "y":1}, + {"label":"L13", "x":3.5, "y":1}, + {"label":"L14", "x":4.5, "y":1}, + {"label":"L15", "x":5.5, "y":1}, + {"label":"L16", "x":6.75, "y":1}, + {"label":"R16", "x":9.25, "y":1}, + {"label":"R10", "x":10.5, "y":1}, + {"label":"R11", "x":11.5, "y":1}, + {"label":"R12", "x":12.5, "y":1}, + {"label":"R13", "x":13.5, "y":1}, + {"label":"R14", "x":14.5, "y":1}, + {"label":"R15", "x":15.5, "y":1, "w":1.5}, + {"label":"L20", "x":0, "y":2, "w":1.5}, + {"label":"L21", "x":1.5, "y":2}, + {"label":"L22", "x":2.5, "y":2}, + {"label":"L23", "x":3.5, "y":2}, + {"label":"L24", "x":4.5, "y":2}, + {"label":"L25", "x":5.5, "y":2}, + {"label":"L26", "x":6.75, "y":2}, + {"label":"R26", "x":9.25, "y":2}, + {"label":"R20", "x":10.5, "y":2}, + {"label":"R21", "x":11.5, "y":2}, + {"label":"R22", "x":12.5, "y":2}, + {"label":"R23", "x":13.5, "y":2}, + {"label":"R24", "x":14.5, "y":2}, + {"label":"R25", "x":15.5, "y":2, "w":1.5}, + {"label":"L30", "x":0, "y":3, "w":1.5}, + {"label":"L31", "x":1.5, "y":3}, + {"label":"L32", "x":2.5, "y":3}, + {"label":"L33", "x":3.5, "y":3}, + {"label":"L34", "x":4.5, "y":3}, + {"label":"L35", "x":5.5, "y":3}, + {"label":"L36", "x":6.75, "y":3}, + {"label":"R36", "x":9.25, "y":3}, + {"label":"R30", "x":10.5, "y":3}, + {"label":"R31", "x":11.5, "y":3}, + {"label":"R32", "x":12.5, "y":3}, + {"label":"R33", "x":13.5, "y":3}, + {"label":"R34", "x":14.5, "y":3}, + {"label":"R35", "x":15.5, "y":3, "w":1.5}, + {"label":"L40", "x":0, "y":4, "w":1.5}, + {"label":"L41", "x":1.5, "y":4}, + {"label":"L42", "x":2.5, "y":4}, + {"label":"L43", "x":3.5, "y":4}, + {"label":"L44", "x":4.5, "y":4}, + {"label":"L45", "x":6, "y":4.5}, + {"label":"L46", "x":7, "y":4.5}, + {"label":"R46", "x":9, "y":4.5}, + {"label":"R40", "x":10, "y":4.5}, + {"label":"R41", "x":11.5, "y":4}, + {"label":"R42", "x":12.5, "y":4}, + {"label":"R43", "x":13.5, "y":4}, + {"label":"R44", "x":14.5, "y":4}, + {"label":"R45", "x":15.5, "y":4, "w":1.5}, + {"label":"Left Encoder, Counter-Clockwise", "x":2.5, "y":5.5}, + {"label":"Left Encoder, Clockwise", "x":3.5, "y":5.5}, + {"label":"L55", "x":6, "y":5.5}, + {"label":"L56", "x":7, "y":5.5}, + {"label":"R56", "x":9, "y":5.5}, + {"label":"R50", "x":10, "y":5.5}, + {"label":"Right Encoder, Counter-Clockwise", "x":12.5, "y":5.5}, + {"label":"Right Encoder, Clockwise", "x":13.5, "y":5.5} + ] + } + } +} From dee2faf387e4c2a6cefa09e8531b9113dd610a1a Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Thu, 6 Dec 2018 07:29:42 -0800 Subject: [PATCH 630/788] handwired/frenchdev Refactor, Configurator support and readme cleanup (#4561) * handwired/frenchdev: refactor - layout macro KEYMAP renamed to LAYOUT - default keymap - now uses #include QMK_KEYBOARD_H - updated layout macro names * handwired/frenchdev: Configurator support * handwired/frenchdev: readme cleanup Capitalization and markdown formatting fixes. --- keyboards/handwired/frenchdev/frenchdev.h | 2 +- keyboards/handwired/frenchdev/info.json | 114 ++++++++++++++++++ .../frenchdev/keymaps/default/keymap.c | 14 +-- keyboards/handwired/frenchdev/readme.md | 16 +-- 4 files changed, 129 insertions(+), 17 deletions(-) create mode 100644 keyboards/handwired/frenchdev/info.json diff --git a/keyboards/handwired/frenchdev/frenchdev.h b/keyboards/handwired/frenchdev/frenchdev.h index 82121e044..82dbe18b8 100644 --- a/keyboards/handwired/frenchdev/frenchdev.h +++ b/keyboards/handwired/frenchdev/frenchdev.h @@ -77,7 +77,7 @@ inline void frenchdev_led_all_set(uint8_t n) frenchdev_led_3_set(n); } -#define KEYMAP( \ +#define LAYOUT( \ \ k01, k02, k03, k04, k05, k06, k09, k0a, k0b, k0c, k0d, k0e, \ k10, k11, k12, k13, k14, k15, k16, k19, k1a, k1b, k1c, k1d, k1e, k1f, \ diff --git a/keyboards/handwired/frenchdev/info.json b/keyboards/handwired/frenchdev/info.json new file mode 100644 index 000000000..0f3c0a94f --- /dev/null +++ b/keyboards/handwired/frenchdev/info.json @@ -0,0 +1,114 @@ +{ + "keyboard_name": "", + "url": "", + "maintainer": "qmk", + "bootloader": "", + "width": 20, + "height": 8, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"F1", "x":1, "y":0.9}, + {"label":"F2", "x":2, "y":0.3}, + {"label":"F3", "x":3, "y":0}, + {"label":"F4", "x":4, "y":0.4}, + {"label":"F5", "x":5, "y":0.5}, + {"label":"F6", "x":6, "y":0.5}, + {"label":"F7", "x":13, "y":0.5}, + {"label":"F8", "x":14, "y":0.5}, + {"label":"F9", "x":15, "y":0.4}, + {"label":"F10", "x":16, "y":0}, + {"label":"F11", "x":17, "y":0.3}, + {"label":"F12", "x":18, "y":0.9}, + + {"label":"Esc", "x":0, "y":1.9}, + {"label":"\"", "x":1, "y":1.9}, + {"label":"\u00ab", "x":2, "y":1.3}, + {"label":"\u00bb", "x":3, "y":1}, + {"label":"(", "x":4, "y":1.4}, + {"label":")", "x":5, "y":1.5}, + {"label":"\u00a8", "x":6, "y":1.5}, + {"label":"^", "x":13, "y":1.5}, + {"label":"@", "x":14, "y":1.5}, + {"label":"+", "x":15, "y":1.4}, + {"label":"-", "x":16, "y":1}, + {"label":"/", "x":17, "y":1.3}, + {"label":"*", "x":18, "y":1.9}, + {"label":"Backspace", "x":19, "y":1.9}, + + {"label":"Tab", "x":0, "y":2.9}, + {"label":"B", "x":1, "y":2.9}, + {"label":"É", "x":2, "y":2.3}, + {"label":"P", "x":3, "y":2}, + {"label":"O", "x":4, "y":2.4}, + {"label":"È", "x":5, "y":2.5}, + {"label":"_", "x":6, "y":2.5}, + {"label":"=", "x":13, "y":2.5}, + {"label":"K", "x":14, "y":2.5}, + {"label":"V", "x":15, "y":2.4}, + {"label":"D", "x":16, "y":2}, + {"label":"L", "x":17, "y":2.3}, + {"label":"J", "x":18, "y":2.9}, + {"label":"Enter", "x":19, "y":2.9}, + + {"label":"`", "x":0, "y":3.9}, + {"label":"A", "x":1, "y":3.9}, + {"label":"U", "x":2, "y":3.3}, + {"label":"E", "x":3, "y":3}, + {"label":"I", "x":4, "y":3.4}, + {"label":"F", "x":5, "y":3.5}, + {"label":";", "x":6, "y":3.5}, + {"label":"!", "x":13, "y":3.5}, + {"label":"C", "x":14, "y":3.5}, + {"label":"T", "x":15, "y":3.4}, + {"label":"S", "x":16, "y":3}, + {"label":"R", "x":17, "y":3.3}, + {"label":"N", "x":18, "y":3.9}, + {"label":"'", "x":19, "y":3.9}, + + {"label":"Shift", "x":0, "y":4.9}, + {"label":"Z", "x":1, "y":4.9}, + {"label":"À", "x":2, "y":4.3}, + {"label":"Y", "x":3, "y":4}, + {"label":"X", "x":4, "y":4.4}, + {"label":"]", "x":5, "y":4.5}, + {"label":"Shift/Space", "x":6.5, "y":5}, + {"label":"Ctrl/Backspace", "x":7.5, "y":5}, + {"label":"Layer 2/Insert", "x":8.5, "y":5}, + {"label":"Layer 2 Lock", "x":10.5, "y":5}, + {"label":"Ctrl/Delete", "x":11.5, "y":5}, + {"label":"Shift/Space", "x":12.5, "y":5}, + {"label":"M", "x":14, "y":4.5}, + {"label":"G", "x":15, "y":4.4}, + {"label":"Up", "x":16, "y":4}, + {"label":"H", "x":17, "y":4.3}, + {"label":"Q", "x":18, "y":4.9}, + {"label":"Shift", "x":19, "y":4.9}, + + {"label":"Ctrl", "x":0, "y":5.9}, + {"label":"GUI", "x":1, "y":5.9}, + {"label":"Keypad /", "x":2, "y":5.3}, + {"label":".", "x":3, "y":5}, + {"label":",", "x":4, "y":5.4}, + {"label":"Space", "x":5, "y":5.5}, + {"label":"Layer 1/Space", "x":6.5, "y":6}, + {"label":"Alt", "x":7.5, "y":6}, + {"label":"Caps Lock", "x":11.5, "y":6}, + {"label":"Layer 1/Space", "x":12.5, "y":6}, + {"label":"Space", "x":14, "y":5.5}, + {"label":"Left", "x":15, "y":5.4}, + {"label":"Down", "x":16, "y":5}, + {"label":"Right", "x":17, "y":5.3}, + {"label":":", "x":18, "y":5.9}, + {"label":"Ctrl", "x":19, "y":5.9}, + + {"label":"Left Pedal 1", "x":2.25, "y":7.5, "w":1.5, "h":2}, + {"label":"Left Pedal 2", "x":3.75, "y":7.5, "w":1.5, "h":2}, + {"label":"Left Pedal 3", "x":5.25, "y":7.5, "w":1.5, "h":2}, + {"label":"Right Pedal 1", "x":13.25, "y":7.5, "w":1.5, "h":2}, + {"label":"Right Pedal 2", "x":14.75, "y":7.5, "w":1.5, "h":2}, + {"label":"Right Pedal 3", "x":16.25, "y":7.5, "w":1.5, "h":2} + ] + } + } +} diff --git a/keyboards/handwired/frenchdev/keymaps/default/keymap.c b/keyboards/handwired/frenchdev/keymaps/default/keymap.c index e6d72d013..635383b55 100644 --- a/keyboards/handwired/frenchdev/keymaps/default/keymap.c +++ b/keyboards/handwired/frenchdev/keymaps/default/keymap.c @@ -1,8 +1,6 @@ -#include "frenchdev.h" +#include QMK_KEYBOARD_H #include "mousekey.h" -#include "action.h" -#include "action_layer.h" -#include "keymap_extras/keymap_bepo.h" +#include "keymap_bepo.h" // Each layer gets a name for readability, which is then used in the keymap matrix below. @@ -67,7 +65,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-------------/ \-------------/ .. \-------------/ \-------------/ * *M(M_LP) */ -[_BASE] = KEYMAP( +[_BASE] = LAYOUT( KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ KC_ESC, BP_DQOT, BP_LGIL, BP_RGIL, BP_LPRN, BP_RPRN, BP_DTRM, BP_DCRC, BP_AT, BP_PLUS, BP_MINS, BP_SLSH, BP_ASTR, KC_BSPC, \ KC_TAB, BP_B, BP_ECUT, BP_O, BP_P, BP_EGRV, BP_UNDS, BP_EQL, BP_K, BP_V, BP_D, BP_L, BP_J, KC_ENT, \ @@ -99,7 +97,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-------------/ \-------------/ .. \-------------/ \-------------/ * * */ -[_SYMBOLS] = KEYMAP( +[_SYMBOLS] = LAYOUT( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ KC_TRNS, BP_DCUR, BP_PARG, BP_SECT, BP_DGRK, KC_TRNS, BP_TILD, BP_DCAR, BP_LEQL, BP_GEQL, BP_PSMS, BP_OBEL, BP_TIMS, KC_TRNS, \ KC_TRNS, BP_BSLS, BP_ASTR, BP_LCBR, BP_RCBR, BP_GRV, KC_TRNS, BP_DIFF, BP_HASH, BP_LBRC, BP_RBRC, BP_PERC, BP_PMIL, KC_TRNS, \ @@ -131,7 +129,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-------------/ \-------------/ .. \-------------/ \-------------/ * * */ -[_MEDIA] = KEYMAP( +[_MEDIA] = LAYOUT( RESET, KC_SLCK, KC_PAUS, KC_MUTE, KC_VOLD, KC_VOLU, KC_MUTE, KC_VOLD, KC_VOLU, KC_PSCR, KC_CALC, KC_NLCK, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_MSTP, KC_MPRV, KC_MNXT, KC_MPLY, KC_MPLY, KC_MPRV, KC_MNXT, KC_MSTP, KC_TRNS, KC_PMNS, KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_WH_U, KC_TRNS, KC_BTN4, KC_BTN5, KC_BTN4, KC_BTN5, KC_KP_7, KC_KP_8, KC_KP_9, KC_PPLS, KC_TRNS, \ @@ -163,7 +161,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * */ -[_TRNS] = KEYMAP( +[_TRNS] = LAYOUT( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ diff --git a/keyboards/handwired/frenchdev/readme.md b/keyboards/handwired/frenchdev/readme.md index 698b4befb..9d7c59e71 100644 --- a/keyboards/handwired/frenchdev/readme.md +++ b/keyboards/handwired/frenchdev/readme.md @@ -6,29 +6,29 @@ Concept based on with the added possibility to connect up to 6 external switches like pedals, and somewhat like the katy, not all keys are on the same level for easier reach. -###Photos +### Photos - [default layout](http://i.imgur.com/r2Nvr4p.png) - [editable layout on keyboard layout editor](http://www.keyboard-layout-editor.com/#/gists/4480e3ab8026eb7c710a7e22203ef4aa) (keys placement is NOT precise on this) - [the thing when finished](http://imgur.com/a/6FY8v) - [concept and cardboard mockup](http://imgur.com/a/R0vvs) -##Build instructions +## Build instructions docker run --rm -e keymap=default -e keyboard=frenchdev --rm -v D:/Repositories/qmk:/qmk:rw edasque/qmk_firmware -##Laser-cuttable file +## Laser-cuttable file There is intentionnaly no hole for the TRRS connector, you are supposed to use a drill for it. This way if you don't want to use the pedals you don't have a useless hole. Plus it's cleaner. http://qmk.fm/frenchdev/frenchdev_v1_lasercut_template.svg -##Side stickers +## Side stickers You can find my original file here : http://qmk.fm/frenchdev/example_printable_stickers.svg I used it when training but now I use blanks and the layout is different. I still uploaded it because I think it can be a good jumpstart for any temporary stickers on the side of keycaps. -##List of parts +## List of parts - I2C mcp23018 - [teensy 2](https://www.pjrc.com/store/teensy.html) - 3 LED, 5mm tall with flat head @@ -43,13 +43,13 @@ side of keycaps. - 20 R2 keys - 22 R1 keys -if you fancy adding pedals : +If you fancy adding pedals : [these are good enough and cheap](https://www.amazon.fr/gp/product/B00V7WITKI/ref=oh_aui_detailpage_o04_s00?ie=UTF8&psc=1). You also need a RCA connector for each of those to replace the included cable If you (or your coworkers) find them too loud you can replace the switch inside them. For once we don't really care about what's inside :) -##Various indications +## Various indications The PHYSICAL rows and columns are connected as such : @@ -96,7 +96,7 @@ and on left hand (main) : We use pull up resistor for SCL and VDA, see https://github.com/ErgoDox-EZ/docs/blob/master/ErgoDox%20EZ%20Schematic.pdf for example -the connector is a standard TRRS (jack with audio + mic) +The connector is a standard TRRS (jack with audio + mic) Diode direction is row to column From 4e5f921496faf29e5c7f61e388346f2181fab267 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Thu, 6 Dec 2018 07:40:19 -0800 Subject: [PATCH 631/788] Allow HS60 to use Community Layouts (#3862) * Add layout support to HS60 * Update Readme for HS60 * Remove defective code * Clean up readme * Fix typo --- keyboards/hs60/v1/keymaps/ansi/config.h | 4 +++- keyboards/hs60/v1/readme.md | 6 +++++- keyboards/hs60/v1/rules.mk | 2 ++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/keyboards/hs60/v1/keymaps/ansi/config.h b/keyboards/hs60/v1/keymaps/ansi/config.h index f51cc16d8..82cdc2689 100644 --- a/keyboards/hs60/v1/keymaps/ansi/config.h +++ b/keyboards/hs60/v1/keymaps/ansi/config.h @@ -18,4 +18,6 @@ along with this program. If not, see . /* Include overwrites for specific keymap */ -#define HS60_ANSI +#ifdef KEYBOARD_hs60 + #define HS60_ANSI +#endif diff --git a/keyboards/hs60/v1/readme.md b/keyboards/hs60/v1/readme.md index a77bbc25c..9034e9b88 100644 --- a/keyboards/hs60/v1/readme.md +++ b/keyboards/hs60/v1/readme.md @@ -9,7 +9,11 @@ Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [github](http Hardware Supported: HS60 ISO and ANSI PCBs with Atmega 32u4 Hardware Availability: https://mechboards.co.uk/shop/all/hs60-pcb/ -Due to the RGB implementation, the HS60 is currently not compatible with community layouts. +If you're using the [community layouts feature](https://docs.qmk.fm/#/feature_layouts) and using the 60_ansi layout, you need to make sure that you include this on your config.h to ensure that the RGB Matrix is properly configured: + + #ifdef KEYBOARD_hs60 + #define HS60_ANSI + #endif Make example for this keyboard (after setting up your build environment): diff --git a/keyboards/hs60/v1/rules.mk b/keyboards/hs60/v1/rules.mk index bff965948..29e91aa24 100644 --- a/keyboards/hs60/v1/rules.mk +++ b/keyboards/hs60/v1/rules.mk @@ -69,6 +69,8 @@ AUDIO_ENABLE = no # Audio output on port C6 FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches RGB_MATRIX_ENABLE = yes # Use RGB matrix +LAYOUTS = 60_ansi 60_iso + # Experimental features for zealcmd please do no enable #RAW_ENABLE = yes #USE_KEYMAPS_IN_EEPROM = yes From 42c9fd262585c9ba46a726604d60eb6c42b3cda7 Mon Sep 17 00:00:00 2001 From: fauxpark Date: Fri, 7 Dec 2018 03:31:17 +1100 Subject: [PATCH 632/788] Delete docs/keycode.txt (#4505) --- docs/keycode.txt | 263 ----------------------------------------------- 1 file changed, 263 deletions(-) delete mode 100644 docs/keycode.txt diff --git a/docs/keycode.txt b/docs/keycode.txt deleted file mode 100644 index bd93b0a94..000000000 --- a/docs/keycode.txt +++ /dev/null @@ -1,263 +0,0 @@ -Keycode Symbol Table -==================== -Keycodes are defined in `common/keycode.h`. -Range of 00-A4 and E0-E7 are identical with HID Usage: - -Virtual keycodes are defined out of above range to support special actions. - - -Keycode Symbol Short name Description --------------------------------------------------------------------------------- -KC_NO 00 Reserved (no event indicated) -KC_ROLL_OVER 01 Keyboard ErrorRollOver -KC_POST_FAIL 02 Keyboard POSTFail -KC_UNDEFINED 03 Keyboard ErrorUndefined -KC_A 04 Keyboard a and A -KC_B 05 Keyboard b and B -KC_C 06 Keyboard c and C -KC_D 07 Keyboard d and D -KC_E 08 Keyboard e and E -KC_F 09 Keyboard f and F -KC_G 0A Keyboard g and G -KC_H 0B Keyboard h and H -KC_I 0C Keyboard i and I -KC_J 0D Keyboard j and J -KC_K 0E Keyboard k and K -KC_L 0F Keyboard l and L -KC_M 10 Keyboard m and M -KC_N 11 Keyboard n and N -KC_O 12 Keyboard o and O -KC_P 13 Keyboard p and P -KC_Q 14 Keyboard q and Q -KC_R 15 Keyboard r and R -KC_S 16 Keyboard s and S -KC_T 17 Keyboard t and T -KC_U 18 Keyboard u and U -KC_V 19 Keyboard v and V -KC_W 1A Keyboard w and W -KC_X 1B Keyboard x and X -KC_Y 1C Keyboard y and Y -KC_Z 1D Keyboard z and Z -KC_1 1E Keyboard 1 and ! -KC_2 1F Keyboard 2 and @ -KC_3 20 Keyboard 3 and # -KC_4 21 Keyboard 4 and $ -KC_5 22 Keyboard 5 and % -KC_6 23 Keyboard 6 and ^ -KC_7 24 Keyboard 7 and & -KC_8 25 Keyboard 8 and * -KC_9 26 Keyboard 9 and ( -KC_0 27 Keyboard 0 and ) -KC_ENTER KC_ENT 28 Keyboard Return (ENTER) -KC_ESCAPE KC_ESC 29 Keyboard ESCAPE -KC_BSPACE KC_BSPC 2A Keyboard DELETE (Backspace) -KC_TAB 2B Keyboard Tab -KC_SPACE KC_SPC 2C Keyboard Spacebar -KC_MINUS KC_MINS 2D Keyboard - and (underscore) -KC_EQUAL KC_EQL 2E Keyboard = and + -KC_LBRACKET KC_LBRC 2F Keyboard [ and { -KC_RBRACKET KC_RBRC 30 Keyboard ] and } -KC_BSLASH KC_BSLS 31 Keyboard \ and | -KC_NONUS_HASH KC_NUHS 32 Keyboard Non-US # and ~ -KC_SCOLON KC_SCLN 33 Keyboard ; and : -KC_QUOTE KC_QUOT 34 Keyboard ‘ and “ -KC_GRAVE KC_GRV 35 Keyboard Grave Accent and Tilde -KC_COMMA KC_COMM 36 Keyboard , and < -KC_DOT 37 Keyboard . and > -KC_SLASH KC_SLSH 38 Keyboard / and ? -KC_CAPSLOCK KC_CAPS 39 Keyboard Caps Lock -KC_F1 3A Keyboard F1 -KC_F2 3B Keyboard F2 -KC_F3 3C Keyboard F3 -KC_F4 3D Keyboard F4 -KC_F5 3E Keyboard F5 -KC_F6 3F Keyboard F6 -KC_F7 40 Keyboard F7 -KC_F8 41 Keyboard F8 -KC_F9 42 Keyboard F9 -KC_F10 43 Keyboard F10 -KC_F11 44 Keyboard F11 -KC_F12 45 Keyboard F12 -KC_PSCREEN KC_PSCR 46 Keyboard PrintScreen -KC_SCROLLLOCK KC_SLCK 47 Keyboard Scroll Lock -KC_PAUSE KC_PAUS 48 Keyboard Pause -KC_INSERT KC_INS 49 Keyboard Insert -KC_HOME 4A Keyboard Home -KC_PGUP 4B Keyboard PageUp -KC_DELETE KC_DEL 4C Keyboard Delete Forward -KC_END 4D Keyboard End -KC_PGDOWN KC_PGDN 4E Keyboard PageDown -KC_RIGHT KC_RGHT 4F Keyboard RightArrow -KC_LEFT 50 Keyboard LeftArrow -KC_DOWN 51 Keyboard DownArrow -KC_UP 52 Keyboard UpArrow -KC_NUMLOCK KC_NLCK 53 Keypad Num Lock and Clear -KC_KP_SLASH KC_PSLS 54 Keypad / -KC_KP_ASTERISK KC_PAST 55 Keypad * -KC_KP_MINUS KC_PMNS 56 Keypad - -KC_KP_PLUS KC_PPLS 57 Keypad + -KC_KP_ENTER KC_PENT 58 Keypad ENTER -KC_KP_1 KC_P1 59 Keypad 1 and End -KC_KP_2 KC_P2 5A Keypad 2 and Down Arrow -KC_KP_3 KC_P3 5B Keypad 3 and PageDn -KC_KP_4 KC_P4 5C Keypad 4 and Left Arrow -KC_KP_5 KC_P5 5D Keypad 5 -KC_KP_6 KC_P6 5E Keypad 6 and Right Arrow -KC_KP_7 KC_P7 5F Keypad 7 and Home -KC_KP_8 KC_P8 60 Keypad 8 and Up Arrow -KC_KP_9 KC_P9 61 Keypad 9 and PageUp -KC_KP_0 KC_P0 62 Keypad 0 and Insert -KC_KP_DOT KC_PDOT 63 Keypad . and Delete -KC_NONUS_BSLASH KC_NUBS 64 Keyboard Non-US \ and | -KC_APPLICATION KC_APP 65 Keyboard Application -KC_POWER 66 Keyboard Power -KC_KP_EQUAL KC_PEQL 67 Keypad = -KC_F13 68 Keyboard F13 -KC_F14 69 Keyboard F14 -KC_F15 6A Keyboard F15 -KC_F16 6B Keyboard F16 -KC_F17 6C Keyboard F17 -KC_F18 6D Keyboard F18 -KC_F19 6E Keyboard F19 -KC_F20 6F Keyboard F20 -KC_F21 70 Keyboard F21 -KC_F22 71 Keyboard F22 -KC_F23 72 Keyboard F23 -KC_F24 73 Keyboard F24 -KC_EXECUTE 74 Keyboard Execute -KC_HELP 75 Keyboard Help -KC_MENU 76 Keyboard Menu -KC_SELECT 77 Keyboard Select -KC_STOP 78 Keyboard Stop -KC_AGAIN 79 Keyboard Again -KC_UNDO 7A Keyboard Undo -KC_CUT 7B Keyboard Cut -KC_COPY 7C Keyboard Copy -KC_PASTE 7D Keyboard Paste -KC_FIND 7E Keyboard Find -KC__MUTE 7F Keyboard Mute -KC__VOLUP 80 Keyboard Volume Up -KC__VOLDOWN 81 Keyboard Volume Down -KC_LOCKING_CAPS 82 Keyboard Locking Caps Lock -KC_LOCKING_NUM 83 Keyboard Locking Num Lock -KC_LOCKING_SCROLL 84 Keyboard Locking Scroll Lock -KC_KP_COMMA KC_PCMM 85 Keypad Comma -KC_KP_EQUAL_AS400 86 Keypad Equal Sign -KC_INT1 KC_RO 87 Keyboard International115 -KC_INT2 KC_KANA 88 Keyboard International216 -KC_INT3 KC_JYEN 89 Keyboard International317 -KC_INT4 KC_HENK 8A Keyboard International418 -KC_INT5 KC_MHEN 8B Keyboard International519 -KC_INT6 8C Keyboard International620 -KC_INT7 8D Keyboard International721 -KC_INT8 8E Keyboard International822 -KC_INT9 8F Keyboard International922 -KC_LANG1 90 Keyboard LANG125 -KC_LANG2 91 Keyboard LANG226 -KC_LANG3 92 Keyboard LANG330 -KC_LANG4 93 Keyboard LANG431 -KC_LANG5 94 Keyboard LANG532 -KC_LANG6 95 Keyboard LANG68 -KC_LANG7 96 Keyboard LANG78 -KC_LANG8 97 Keyboard LANG88 -KC_LANG9 98 Keyboard LANG98 -KC_ALT_ERASE 99 Keyboard Alternate Erase -KC_SYSREQ 9A Keyboard SysReq/Attention -KC_CANCEL 9B Keyboard Cancel -KC_CLEAR 9C Keyboard Clear -KC_PRIOR 9D Keyboard Prior -KC_RETURN 9E Keyboard Return -KC_SEPARATOR 9F Keyboard Separator -KC_OUT A0 Keyboard Out -KC_OPER A1 Keyboard Oper -KC_CLEAR_AGAIN A2 Keyboard Clear/Again -KC_CRSEL A3 Keyboard CrSel/Props -KC_EXSEL A4 Keyboard ExSel -/* Modifiers */ -KC_LCTRL KC_LCTL E0 Keyboard LeftControl -KC_LSHIFT KC_LSFT E1 Keyboard LeftShift -KC_LALT E2 Keyboard LeftAlt -KC_LGUI E3 Keyboard Left GUI(Windows/Apple/Meta key) -KC_RCTRL KC_RCTL E4 Keyboard RightControl -KC_RSHIFT KC_RSFT E5 Keyboard RightShift -KC_RALT E6 Keyboard RightAlt -KC_RGUI E7 Keyboard Right GUI(Windows/Apple/Meta key) - -/* - * Virtual keycodes - */ -/* System Control */ -KC_SYSTEM_POWER KC_PWR System Power Down -KC_SYSTEM_SLEEP KC_SLEP System Sleep -KC_SYSTEM_WAKE KC_WAKE System Wake -/* Consumer Page */ -KC_AUDIO_MUTE KC_MUTE -KC_AUDIO_VOL_UP KC_VOLU -KC_AUDIO_VOL_DOWN KC_VOLD -KC_MEDIA_NEXT_TRACK KC_MNXT -KC_MEDIA_PREV_TRACK KC_MPRV -KC_MEDIA_STOP KC_MSTP -KC_MEDIA_PLAY_PAUSE KC_MPLY -KC_MEDIA_SELECT KC_MSEL -KC_MAIL KC_MAIL -KC_CALCULATOR KC_CALC -KC_MY_COMPUTER KC_MYCM -KC_WWW_SEARCH KC_WSCH -KC_WWW_HOME KC_WHOM -KC_WWW_BACK KC_WBAK -KC_WWW_FORWARD KC_WFWD -KC_WWW_STOP KC_WSTP -KC_WWW_REFRESH KC_WREF -KC_WWW_FAVORITES KC_WFAV -KC_BRIGHTNESS_UP KC_BRIU -KC_BRIGHTNESS_DOWN KC_BRID -/* Mousekey */ -KC_MS_UP KC_MS_U Mouse Cursor Up -KC_MS_DOWN KC_MS_D Mouse Cursor Down -KC_MS_LEFT KC_MS_L Mouse Cursor Left -KC_MS_RIGHT KC_MS_R Mouse Cursor Right -KC_MS_BTN1 KC_BTN1 Mouse Button 1 -KC_MS_BTN2 KC_BTN2 Mouse Button 2 -KC_MS_BTN3 KC_BTN3 Mouse Button 3 -KC_MS_BTN4 KC_BTN4 Mouse Button 4 -KC_MS_BTN5 KC_BTN5 Mouse Button 5 -KC_MS_WH_UP KC_WH_U Mouse Wheel Up -KC_MS_WH_DOWN KC_WH_D Mouse Wheel Down -KC_MS_WH_LEFT KC_WH_L Mouse Wheel Left -KC_MS_WH_RIGHT KC_WH_R Mouse Wheel Right -KC_MS_ACCEL0 KC_ACL0 Mouse Acceleration 0 -KC_MS_ACCEL1 KC_ACL1 Mouse Acceleration 1 -KC_MS_ACCEL2 KC_ACL2 Mouse Acceleration 2 -/* Fn key */ -KC_FN0 -KC_FN1 -KC_FN2 -KC_FN3 -KC_FN4 -KC_FN5 -KC_FN6 -KC_FN7 -KC_FN8 -KC_FN9 -KC_FN10 -KC_FN11 -KC_FN12 -KC_FN13 -KC_FN14 -KC_FN15 -KC_FN16 -KC_FN17 -KC_FN18 -KC_FN19 -KC_FN20 -KC_FN21 -KC_FN22 -KC_FN23 -KC_FN24 -KC_FN25 -KC_FN26 -KC_FN27 -KC_FN28 -KC_FN29 -KC_FN30 -KC_FN31 From 21bc230dfdc29a03d6cf08b9c0ac438eadd3bf42 Mon Sep 17 00:00:00 2001 From: Ian O'Dea Date: Thu, 6 Dec 2018 10:58:58 -0600 Subject: [PATCH 633/788] Vertical animation support for arm_atsam led_matrix (#4538) * Add initial support for vertically-oriented animations * DRY up vertical animation support * Fix animation code for arm_atsam led_matrix to work in all directions * Adjust py calculation to base off bottom rather than top --- tmk_core/protocol/arm_atsam/led_matrix.c | 73 ++++++++++++++---------- tmk_core/protocol/arm_atsam/led_matrix.h | 1 + 2 files changed, 43 insertions(+), 31 deletions(-) diff --git a/tmk_core/protocol/arm_atsam/led_matrix.c b/tmk_core/protocol/arm_atsam/led_matrix.c index c328fdc4c..729e042a6 100644 --- a/tmk_core/protocol/arm_atsam/led_matrix.c +++ b/tmk_core/protocol/arm_atsam/led_matrix.c @@ -226,7 +226,7 @@ void disp_pixel_setup(void) while (cur < lede) { cur->px = (cur->x - disp.left) / disp.width * 100; - cur->py = (cur->y - disp.top) / disp.height * 100; + cur->py = (cur->y - disp.bottom) / disp.height * 100; *cur->rgb.r = 0; *cur->rgb.g = 0; *cur->rgb.b = 0; @@ -244,6 +244,7 @@ void led_matrix_prepare(void) uint8_t led_enabled; float led_animation_speed; uint8_t led_animation_direction; +uint8_t led_animation_orientation; uint8_t led_animation_breathing; uint8_t led_animation_breathe_cur; uint8_t breathe_step; @@ -263,7 +264,7 @@ void led_matrix_run(void) float ro; float go; float bo; - float px; + float po; uint8_t led_this_run = 0; led_setup_t *f = (led_setup_t*)led_setups[led_animation_id]; @@ -325,59 +326,68 @@ void led_matrix_run(void) //Act on LED for (fcur = 0; fcur < fmax; fcur++) { - px = led_cur->px; - float pxmod; - pxmod = (float)(disp.frame % (uint32_t)(1000.0f / led_animation_speed)) / 10.0f * led_animation_speed; + + if (led_animation_orientation) + { + po = led_cur->py; + } + else + { + po = led_cur->px; + } + + float pomod; + pomod = (float)(disp.frame % (uint32_t)(1000.0f / led_animation_speed)) / 10.0f * led_animation_speed; //Add in any moving effects if ((!led_animation_direction && f[fcur].ef & EF_SCR_R) || (led_animation_direction && (f[fcur].ef & EF_SCR_L))) { - pxmod *= 100.0f; - pxmod = (uint32_t)pxmod % 10000; - pxmod /= 100.0f; + pomod *= 100.0f; + pomod = (uint32_t)pomod % 10000; + pomod /= 100.0f; - px -= pxmod; + po -= pomod; - if (px > 100) px -= 100; - else if (px < 0) px += 100; + if (po > 100) po -= 100; + else if (po < 0) po += 100; } else if ((!led_animation_direction && f[fcur].ef & EF_SCR_L) || (led_animation_direction && (f[fcur].ef & EF_SCR_R))) { - pxmod *= 100.0f; - pxmod = (uint32_t)pxmod % 10000; - pxmod /= 100.0f; - px += pxmod; + pomod *= 100.0f; + pomod = (uint32_t)pomod % 10000; + pomod /= 100.0f; + po += pomod; - if (px > 100) px -= 100; - else if (px < 0) px += 100; + if (po > 100) po -= 100; + else if (po < 0) po += 100; } - //Check if LED's px is in current frame - if (px < f[fcur].hs) continue; - if (px > f[fcur].he) continue; + //Check if LED's po is in current frame + if (po < f[fcur].hs) continue; + if (po > f[fcur].he) continue; //note: < 0 or > 100 continue - //Calculate the px within the start-stop percentage for color blending - px = (px - f[fcur].hs) / (f[fcur].he - f[fcur].hs); + //Calculate the po within the start-stop percentage for color blending + po = (po - f[fcur].hs) / (f[fcur].he - f[fcur].hs); //Add in any color effects if (f[fcur].ef & EF_OVER) { - ro = (px * (f[fcur].re - f[fcur].rs)) + f[fcur].rs;// + 0.5; - go = (px * (f[fcur].ge - f[fcur].gs)) + f[fcur].gs;// + 0.5; - bo = (px * (f[fcur].be - f[fcur].bs)) + f[fcur].bs;// + 0.5; + ro = (po * (f[fcur].re - f[fcur].rs)) + f[fcur].rs;// + 0.5; + go = (po * (f[fcur].ge - f[fcur].gs)) + f[fcur].gs;// + 0.5; + bo = (po * (f[fcur].be - f[fcur].bs)) + f[fcur].bs;// + 0.5; } else if (f[fcur].ef & EF_SUBTRACT) { - ro -= (px * (f[fcur].re - f[fcur].rs)) + f[fcur].rs;// + 0.5; - go -= (px * (f[fcur].ge - f[fcur].gs)) + f[fcur].gs;// + 0.5; - bo -= (px * (f[fcur].be - f[fcur].bs)) + f[fcur].bs;// + 0.5; + ro -= (po * (f[fcur].re - f[fcur].rs)) + f[fcur].rs;// + 0.5; + go -= (po * (f[fcur].ge - f[fcur].gs)) + f[fcur].gs;// + 0.5; + bo -= (po * (f[fcur].be - f[fcur].bs)) + f[fcur].bs;// + 0.5; } else { - ro += (px * (f[fcur].re - f[fcur].rs)) + f[fcur].rs;// + 0.5; - go += (px * (f[fcur].ge - f[fcur].gs)) + f[fcur].gs;// + 0.5; - bo += (px * (f[fcur].be - f[fcur].bs)) + f[fcur].bs;// + 0.5; + ro += (po * (f[fcur].re - f[fcur].rs)) + f[fcur].rs;// + 0.5; + go += (po * (f[fcur].ge - f[fcur].gs)) + f[fcur].gs;// + 0.5; + bo += (po * (f[fcur].be - f[fcur].bs)) + f[fcur].bs;// + 0.5; } } } @@ -451,6 +461,7 @@ uint8_t led_matrix_init(void) led_lighting_mode = LED_MODE_NORMAL; led_animation_speed = 4.0f; led_animation_direction = 0; + led_animation_orientation = 0; led_animation_breathing = 0; led_animation_breathe_cur = BREATHE_MIN_STEP; breathe_step = 1; diff --git a/tmk_core/protocol/arm_atsam/led_matrix.h b/tmk_core/protocol/arm_atsam/led_matrix.h index 3f2b9cdb8..cedea8a85 100644 --- a/tmk_core/protocol/arm_atsam/led_matrix.h +++ b/tmk_core/protocol/arm_atsam/led_matrix.h @@ -125,6 +125,7 @@ extern uint8_t led_enabled; extern float led_animation_speed; extern uint8_t led_lighting_mode; extern uint8_t led_animation_direction; +extern uint8_t led_animation_orientation; extern uint8_t led_animation_breathing; extern uint8_t led_animation_breathe_cur; extern uint8_t breathe_dir; From 2fb14845d503f01bc5a15c95c8d1d51be73f98b5 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Thu, 6 Dec 2018 15:19:40 -0800 Subject: [PATCH 634/788] handwired/gamenum Refactor, Configurator support and readme cleanup (#4563) * handwired/gamenum: refactor - layout macro KEYMAP renamed to LAYOUT - white space changes for alignment - default keymap - now uses #include QMK_KEYBOARD_H - updated layout macro names - white space changes (for readability) * handwired/gamenum: Configurator support * handwired/gamenum: readme cleanup - renamed file to lowercase - updated to match current QMK template more closely - edits to reflect the other changes in this PR --- keyboards/handwired/gamenum/gamenum.h | 18 ++--- keyboards/handwired/gamenum/info.json | 30 ++++++++ .../gamenum/keymaps/default/keymap.c | 76 +++++++++---------- .../gamenum/{README.md => readme.md} | 73 +++++++----------- 4 files changed, 103 insertions(+), 94 deletions(-) create mode 100644 keyboards/handwired/gamenum/info.json rename keyboards/handwired/gamenum/{README.md => readme.md} (74%) diff --git a/keyboards/handwired/gamenum/gamenum.h b/keyboards/handwired/gamenum/gamenum.h index ea633b9bf..3a1429ff8 100644 --- a/keyboards/handwired/gamenum/gamenum.h +++ b/keyboards/handwired/gamenum/gamenum.h @@ -3,19 +3,19 @@ #include "quantum.h" -#define KEYMAP( \ +#define LAYOUT( \ k00, k01, k02, k03, \ k10, k11, k12, k13, \ - k20, k21, k22, \ - k30, k31, k32, \ - k41, k42, k43 \ + k20, k21, k22, \ + k30, k31, k32, \ + k41, k42, k43 \ ) \ { \ - { k00, k01, k02, k03}, \ - { k10, k11, k12, k13}, \ - { k20, k21, k22, KC_NO}, \ - { k30, k31, k32, KC_NO}, \ - { KC_NO, k41, k42, k43} \ + { k00, k01, k02, k03 }, \ + { k10, k11, k12, k13 }, \ + { k20, k21, k22, KC_NO }, \ + { k30, k31, k32, KC_NO }, \ + { KC_NO, k41, k42, k43 } \ } #endif diff --git a/keyboards/handwired/gamenum/info.json b/keyboards/handwired/gamenum/info.json new file mode 100644 index 000000000..dc80f027e --- /dev/null +++ b/keyboards/handwired/gamenum/info.json @@ -0,0 +1,30 @@ +{ + "keyboard_name": "gamenum", + "url": "", + "maintainer": "qmk", + "width": 4, + "height": 5, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"Fn", "x":0, "y":0}, + {"label":"/", "x":1, "y":0}, + {"label":"*", "x":2, "y":0}, + {"label":"-", "x":3, "y":0}, + {"label":"7", "x":0, "y":1}, + {"label":"8", "x":1, "y":1}, + {"label":"9", "x":2, "y":1}, + {"label":"+", "x":3, "y":1, "h":2}, + {"label":"4", "x":0, "y":2}, + {"label":"5", "x":1, "y":2}, + {"label":"6", "x":2, "y":2}, + {"label":"1", "x":0, "y":3}, + {"label":"2", "x":1, "y":3}, + {"label":"3", "x":2, "y":3}, + {"label":"0", "x":0, "y":4, "w":2}, + {"label":".", "x":2, "y":4}, + {"label":"Ent", "x":3, "y":3, "h":2} + ] + } + } +} diff --git a/keyboards/handwired/gamenum/keymaps/default/keymap.c b/keyboards/handwired/gamenum/keymaps/default/keymap.c index 6950b741a..a18ffc89b 100644 --- a/keyboards/handwired/gamenum/keymaps/default/keymap.c +++ b/keyboards/handwired/gamenum/keymaps/default/keymap.c @@ -1,36 +1,32 @@ -#include "gamenum.h" -#include "action_layer.h" -#include "eeconfig.h" +#include QMK_KEYBOARD_H -#define _______ KC_TRNS - #define DEF 0 #define HDN 1 #define OSY 2 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[DEF] = KEYMAP( - KC_FN0, KC_SLSH, KC_ASTR, KC_MINS, \ - KC_7, KC_8, KC_9, KC_PLUS, \ - KC_4, KC_5, KC_6, \ - KC_1, KC_2, KC_3, \ - KC_0, KC_DOT, KC_ENT \ -), -[HDN] = KEYMAP( - KC_FN1, KC_1, KC_2, KC_3, \ - KC_Q, KC_W, KC_E, KC_R, \ - KC_A, KC_S, KC_D, \ - KC_Z, KC_X, KC_C, \ - KC_LSFT, KC_LALT, KC_SPC \ -), -[OSY] = KEYMAP( - KC_A, KC_Q, KC_1, KC_FN2, \ - KC_S, KC_W, KC_2, KC_LALT, \ - KC_D, KC_E, KC_3, \ - KC_F, KC_R, KC_4, \ - KC_SPC, KC_T, KC_TAB \ -) + [DEF] = LAYOUT( + KC_FN0, KC_SLSH, KC_ASTR, KC_MINS, \ + KC_7, KC_8, KC_9, KC_PLUS, \ + KC_4, KC_5, KC_6, \ + KC_1, KC_2, KC_3, \ + KC_0, KC_DOT, KC_ENT \ + ), + [HDN] = LAYOUT( + KC_FN1, KC_1, KC_2, KC_3, \ + KC_Q, KC_W, KC_E, KC_R, \ + KC_A, KC_S, KC_D, \ + KC_Z, KC_X, KC_C, \ + KC_LSFT, KC_LALT, KC_SPC \ + ), + [OSY] = LAYOUT( + KC_A, KC_Q, KC_1, KC_FN2, \ + KC_S, KC_W, KC_2, KC_LALT, \ + KC_D, KC_E, KC_3, \ + KC_F, KC_R, KC_4, \ + KC_SPC, KC_T, KC_TAB \ + ) }; @@ -48,21 +44,21 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { bool process_record_user (uint16_t keycode, keyrecord_t *record) { switch(keycode) { case KC_FN0: - if (record->event.pressed) { - PORTC |= (1 << 6); // PC6 goes high - } - break; + if (record->event.pressed) { + PORTC |= (1 << 6); // PC6 goes high + } + break; case KC_FN1: - if (record->event.pressed) { - PORTC &= ~(1 << 6); // PC6 goes high - PORTD |= (1<<4); - } - break; + if (record->event.pressed) { + PORTC &= ~(1 << 6); // PC6 goes high + PORTD |= (1<<4); + } + break; case KC_FN2: - if (record->event.pressed) { - PORTD &= ~(1 << 4); // PC6 goes high - } - break; + if (record->event.pressed) { + PORTD &= ~(1 << 4); // PC6 goes high + } + break; } return true; -} \ No newline at end of file +} diff --git a/keyboards/handwired/gamenum/README.md b/keyboards/handwired/gamenum/readme.md similarity index 74% rename from keyboards/handwired/gamenum/README.md rename to keyboards/handwired/gamenum/readme.md index bf8045be1..ee28cc182 100644 --- a/keyboards/handwired/gamenum/README.md +++ b/keyboards/handwired/gamenum/readme.md @@ -1,5 +1,16 @@ -GameNum firmware -====================== +# GameNum + +A handwired standard numpad oriented toward gaming on the go. + +Keyboard Maintainer: [The QMK Community](https://github.com/qmk) +Hardware Supported: GameNum, Pro Micro + +Make example for this keyboard (after setting up your build environment): + + make handwired/gamenum:default + +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). + ## Board overview The GameNum was designed to facilitate the use of mechanical keys for gaming even when your packing space is limited. @@ -22,7 +33,7 @@ The indicator LED's are normally assigned to `pin C6` and `pin D4`, C6 goes high Keep in mind that the minus of the diodes should point towards the pro micros inputs. -##LED hookup +## LED hookup ![led overview](http://i.imgur.com/U6m865n.jpg) @@ -34,13 +45,13 @@ Keep in mind here that the number after the name should correspond with the numb Next thing to do is to add the actual layer for the keymap. ``` -[DEF] = KEYMAP( - KC_FN0, KC_SLSH, KC_ASTR, KC_MINS, \ - KC_7, KC_8, KC_9, KC_PLUS, \ - KC_4, KC_5, KC_6, \ - KC_1, KC_2, KC_3, \ - KC_0, KC_DOT, KC_ENT \ -) + [DEF] = LAYOUT( + KC_FN0, KC_SLSH, KC_ASTR, KC_MINS, \ + KC_7, KC_8, KC_9, KC_PLUS, \ + KC_4, KC_5, KC_6, \ + KC_1, KC_2, KC_3, \ + KC_0, KC_DOT, KC_ENT \ + ) ``` This is the default layer for the gamenum. It's generally easiest to just copy this and change things as you see fit. Keep in mind that at least 1 button on the pad has to be used to switch to the next layer in the stack or you will be stuck in that layer FOREVER! D: @@ -54,8 +65,8 @@ Now for the LEDs, if you plan on adding extra LED's to the keyboard to indicate Look for this piece of code: ``` - DDRD |= (1<<4); - PORTD &= ~(1<<4); + DDRD |= (1<<4); + PORTD &= ~(1<<4); ``` Copy it and change the letter after DDR and PORT to the letter of your pin. Change the 4 to the number of your pin. `DDRx |= (1<event.pressed) { - PORTC &= ~(1 << 6); // PC6 goes low - PORTD |= (1<<4); //PD4 goes high - } - break; + if (record->event.pressed) { + PORTC &= ~(1 << 6); // PC6 goes low + PORTD |= (1<<4); //PD4 goes high + } + break; ``` This is the code for the KC_FN1 button. Notice how we check against what key is pressed in the case and then set pin C6 low and pin D4 high. Adjust this as you see fit. - - -## Quantum MK Firmware - -For the full Quantum feature list, see [the parent readme.md](/docs/README.md). - -## Building - -Download or clone the whole firmware and navigate to the keyboards/handwired/gamenum folder. -Read the README.md for the qmk repository on how to set up your developer enviroment to build your firmware with. -Building firmware on Windows can be a bit of a hassle. Linux is a lot easier to use if you have some experience with it. A raspberry pi will already be able to build the firmware for you. -Once your dev env is set up, you'll be able to type `make` to generate your .hex - you can then use AVRDudess to program your .hex file. - -### Default - -To build with the default keymap, simply run `make`. - -### Other Keymaps - -To build the firmware binary hex file with a keymap just do `make` with `keymap` option like: - -``` -$ make keymap=[default|jack|] -``` - -Keymaps follow the format **__keymap.c__** and are stored in folders in the `keymaps` folder, eg `keymaps/my_keymap/` - - From 3f96ba011359e7e842a5f917c11886c1867ba207 Mon Sep 17 00:00:00 2001 From: milestogo Date: Thu, 6 Dec 2018 17:13:15 -0800 Subject: [PATCH 635/788] Keyboard: Palm serial keyboard USB converter (#4485) * Initial palm_usb support * removing left over sun .c file * fixing licenses * actually adding updated files * fixing build error * more include cleanup --- keyboards/converter/palm_usb/config.h | 120 ++++++ keyboards/converter/palm_usb/matrix.c | 398 ++++++++++++++++++ keyboards/converter/palm_usb/readme.md | 96 +++++ keyboards/converter/palm_usb/rules.mk | 46 ++ .../stowaway/keymaps/default/keymap.c | 59 +++ .../converter/palm_usb/stowaway/rules.mk | 0 .../converter/palm_usb/stowaway/stowaway.h | 53 +++ 7 files changed, 772 insertions(+) create mode 100644 keyboards/converter/palm_usb/config.h create mode 100644 keyboards/converter/palm_usb/matrix.c create mode 100644 keyboards/converter/palm_usb/readme.md create mode 100644 keyboards/converter/palm_usb/rules.mk create mode 100644 keyboards/converter/palm_usb/stowaway/keymaps/default/keymap.c create mode 100644 keyboards/converter/palm_usb/stowaway/rules.mk create mode 100644 keyboards/converter/palm_usb/stowaway/stowaway.h diff --git a/keyboards/converter/palm_usb/config.h b/keyboards/converter/palm_usb/config.h new file mode 100644 index 000000000..4520725a1 --- /dev/null +++ b/keyboards/converter/palm_usb/config.h @@ -0,0 +1,120 @@ +/* +Copyright 2012 Jun Wako + +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 . +*/ + +/* This code makes use of cy384's Arduino USB HID adapter for the Palm Portable + Keyboard, released under the BSD licence */ + + + + +#pragma once + +#define CUSTOM_MATRIX 2 + +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0001 +#define DEVICE_VER 0x0100 +#define MANUFACTURER QMK +#define PRODUCT Stowaway converter +#define DESCRIPTION USB converter for Stowaway keyboard + +// IO pins to serial +// https://deskthority.net/wiki/Arduino_Pro_Micro for pin lookup +#define VCC_PIN D1 // pro micro 2 +#define RX_PIN D0 //pro micro 3 , was 8 on cy384 +#define RTS_PIN C6 // 5 //[ was D4 // 4 on the cy384 +#define DCD_PIN E6 //7 + +// if using the particular arduino pinout of CY384 +#ifdef CY384 + #define GND_PIN D7 //6 + #define PULLDOWN_PIN B1 // 15 +#endif + +#ifndef HANDSPRING +// Set to 1 for Handspring or to disable RTS/DCD based handshake. + #define HANDSPRING 0 +#endif + +#define MAXDROP 10 // check if keyboard is connected every X polling cycles +#define SLEEP_TIMEOUT 500000 // check keyboard/reset this many millis + + +#define MATRIX_ROWS 12 +#define MATRIX_COLS 8 + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LALT) | MOD_BIT(KC_RALT)) || \ + keyboard_report->mods == (MOD_BIT(KC_LGUI) | MOD_BIT(KC_RGUI)) || \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + + +/* Serial(USART) configuration + * asynchronous, negative logic, 9600baud, no flow control + * 1-start bit, 8-data bit, non parity, 1-stop bit + */ +#define SERIAL_SOFT_BAUD 9600 +#define SERIAL_SOFT_PARITY_NONE +#define SERIAL_SOFT_BIT_ORDER_LSB +#if (HANDSPRING == 0) + #define SERIAL_SOFT_LOGIC_NEGATIVE //RS232 logic +#endif +/* RXD Port */ +#define SERIAL_SOFT_RXD_ENABLE + +// we are using Pro micro pin 3 / D0 as serial +#define SERIAL_SOFT_RXD_DDR DDRD +#define SERIAL_SOFT_RXD_PORT PORTD +#define SERIAL_SOFT_RXD_PIN PIND +#define SERIAL_SOFT_RXD_BIT 0 +#define SERIAL_SOFT_RXD_VECT INT0_vect + +/* RXD Interupt */ +#define SERIAL_SOFT_RXD_INIT() do { \ + /* pin configuration: input with pull-up */ \ + SERIAL_SOFT_RXD_DDR &= ~(1< + +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 . +*/ + +#include QMK_KEYBOARD_H +#include "protocol/serial.h" +#include "timer.h" +#include "pincontrol.h" + + +/* + * Matrix Array usage: + * + * ROW: 12(4bits) + * COL: 8(3bits) + * + * +---------+ + * 0|00 ... 07| + * 1|00 ... 07| + * :| ... | + * :| ... | + * A| | + * B| | + * +---------+ + */ +static uint8_t matrix[MATRIX_ROWS]; + + +// we're going to need a sleep timer +static uint16_t last_activity ; +// and a byte to track duplicate up events signalling all keys up. +static uint16_t last_upKey ; +// serial device can disconnect. Check every MAXDROP characters. +static uint16_t disconnect_counter = 0; + + +// bitmath masks. +#define KEY_MASK 0b10000000 +#define COL_MASK 0b00000111 +#define ROW_MASK 0b01111000 + + +#define ROW(code) (( code & ROW_MASK ) >>3) +#define COL(code) ((code & COL_MASK) ) +#define KEYUP(code) ((code & KEY_MASK) >>7 ) + +static bool is_modified = false; + +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + +inline +uint8_t matrix_rows(void) +{ + return MATRIX_ROWS; +} + +inline +uint8_t matrix_cols(void) +{ + return MATRIX_COLS; +} + + +void pins_init(void) { + // set pins for pullups, Rts , power &etc. + + //print ("pins setup\n"); + pinMode(VCC_PIN, PinDirectionOutput); + digitalWrite(VCC_PIN, PinLevelLow); + +#if ( HANDSPRING == 0) + +#ifdef CY835 + pinMode(GND_PIN, PinDirectionOutput); + digitalWrite(GND_PIN, PinLevelLow); + + pinMode(PULLDOWN_PIN, PinDirectionOutput); + digitalWrite(PULLDOWN_PIN, PinLevelLow); +#endif + + pinMode(DCD_PIN, PinDirectionInput); + pinMode(RTS_PIN, PinDirectionInput); +#endif + +/* check that the other side isn't powered up. + test=digitalRead(DCD_PIN); + xprintf("b%02X:", test); + test=digitalRead(RTS_PIN); + xprintf("%02X\n", test); +*/ + +} + +uint8_t rts_reset(void) { + static uint8_t firstread ; +/* bounce RTS so device knows it is rebooted */ + +// On boot, we keep rts as input, then switch roles here +// on leaving sleep, we toggle the same way + + firstread=digitalRead(RTS_PIN); + // printf("r%02X:", firstread); + + pinMode(RTS_PIN, PinDirectionOutput); + + if (firstread == PinLevelHigh) { + digitalWrite(RTS_PIN, PinLevelLow); + } + _delay_ms(10); + digitalWrite(RTS_PIN, PinLevelHigh); + + +/* the future is Arm + if (palReadPad(RTS_PIN_IOPRT) == PinLevelLow) + { + _delay_ms(10); + palSetPadMode(RTS_PINn_IOPORT, PinDirectionOutput_PUSHPULL); + palSetPad(RTS_PORT, RTS_PIN); + } + else + { + palSetPadMode(RTS_PIN_RTS_PORT, PinDirectionOutput_PUSHPULL); + palSetPad(RTS_PORT, RTS_PIN); + palClearPad(RTS_PORT, RTS_PIN); + _delay_ms(10); + palSetPad(RTS_PORT, RTS_PIN); + } +*/ + + + _delay_ms(5); + //print("rts\n"); + return 1; +} + +uint8_t get_serial_byte(void) { + static uint8_t code; + while(1) { + code = serial_recv(); + if (code) { + debug_hex(code); debug(" "); + return code; + } + } +} + +uint8_t palm_handshake(void) { + // assumes something has seen DCD go high, we've toggled RTS + // and we now need to verify handshake. + // listen for up to 4 packets before giving up. + // usually I get the sequence FF FA FD + static uint8_t codeA=0; + + for (uint8_t i=0; i < 5; i++) { + codeA=get_serial_byte(); + if ( 0xFA == codeA) { + if( 0xFD == get_serial_byte()) { + return 1; + } + } + } + return 0; +} + +uint8_t palm_reset(void) { + print("@"); + rts_reset(); // shouldn't need to power cycle. + + if ( palm_handshake() ) { + last_activity = timer_read(); + return 1; + } else { + print("failed reset"); + return 0; + } + +} + +uint8_t handspring_handshake(void) { + // should be sent 15 ms after power up. + // listen for up to 4 packets before giving up. + static uint8_t codeA=0; + + for (uint8_t i=0; i < 5; i++) { + codeA=get_serial_byte(); + if ( 0xF9 == codeA) { + if( 0xFB == get_serial_byte()) { + return 1; + } + } + } + return 0; +} + +uint8_t handspring_reset(void) { + digitalWrite(VCC_PIN, PinLevelLow); + _delay_ms(5); + digitalWrite(VCC_PIN, PinLevelHigh); + + if ( handspring_handshake() ) { + last_activity = timer_read(); + disconnect_counter=0; + return 1; + } else { + print("-HSreset"); + return 0; + } +} + +void matrix_init(void) +{ + debug_enable = true; + //debug_matrix =true; + + serial_init(); // arguments all #defined + +#if (HANDSPRING == 0) + pins_init(); // set all inputs and outputs. +#endif + + print("power up\n"); + digitalWrite(VCC_PIN, PinLevelHigh); + + // wait for DCD strobe from keyboard - it will do this + // up to 3 times, then the board needs the RTS toggled to try again + +#if ( HANDSPRING == 1) + if ( handspring_handshake() ) { + last_activity = timer_read(); + } else { + print("failed handshake"); + _delay_ms(1000); + //BUG /should/ power cycle or toggle RTS & reset, but this usually works. + } + +#else /// Palm / HP device with DCD + while( digitalRead(DCD_PIN) != PinLevelHigh ) {;} + print("dcd\n"); + + rts_reset(); // at this point the keyboard should think all is well. + + if ( palm_handshake() ) { + last_activity = timer_read(); + } else { + print("failed handshake"); + _delay_ms(1000); + //BUG /should/ power cycle or toggle RTS & reset, but this usually works. + } + +#endif + + // initialize matrix state: all keys off + for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00; + + matrix_init_quantum(); + return; + + +} + + +uint8_t matrix_scan(void) +{ + uint8_t code; + code = serial_recv(); + if (!code) { +/* + disconnect_counter ++; + if (disconnect_counter > MAXDROP) { + // set all keys off + for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00; + } +*/ + // check if the keyboard is asleep. + if (timer_elapsed(last_activity) > SLEEP_TIMEOUT) { +#if(HANDSPRING ==0 ) + palm_reset(); +#else + handspring_reset(); +#endif + return 0; + } + + } + + last_activity = timer_read(); + disconnect_counter=0; // if we are getting serial data, we're connected. + + debug_hex(code); debug(" "); + + + switch (code) { + case 0xFD: // unexpected reset byte 2 + print("rstD "); + return 0; + case 0xFA: // unexpected reset + print("rstA "); + return 0; + } + + if (KEYUP(code)) { + if (code == last_upKey) { + // all keys are not pressed. + // Manual says to disable all modifiers left open now. + // but that could defeat sticky keys. + // BUG? dropping this byte. + last_upKey=0; + return 0; + } + // release + if (matrix_is_on(ROW(code), COL(code))) { + matrix[ROW(code)] &= ~(1<. +*/ + +#include QMK_KEYBOARD_H + +enum layers { +_QWERTY=0, +_CDH, +_FN +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* + 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS, EQL, BACK, APP0, + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC, RBRC, BSLS, APP1, + CAPS, A, S, D, F, G, H, J, K, L, SCLN, QUOT, ENT, APP2, + LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, RSFT, UP, APP3, + LCTL, FN, LALT, CMD, SPACE,SPACE,GRAVE,DONE, DEL, LEFT, DOWN, RIGHT + +*/ + [_QWERTY] = LAYOUT( /* Base */ + KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_ESC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, TG(_CDH), + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN, + KC_LCTL, MO(_FN), KC_LALT, KC_LGUI, KC_SPACE,KC_SPACE,KC_GRAVE,KC_RGUI, KC_DEL, KC_LEFT,KC_DOWN, KC_RIGHT + ), + + [_CDH] = LAYOUT( /* Base */ + KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_ESC, + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_B, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LBRC, KC_RBRC, KC_BSLS, _______, + KC_CAPS, KC_A, KC_R, KC_S, KC_T, KC_G, KC_M, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENT, KC_PGUP, + KC_LSFT, KC_Z, KC_X, KC_C, KC_D, KC_V, KC_K, KC_H, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN, + KC_LCTL, MO(_FN), KC_LALT, KC_LGUI, KC_SPACE,KC_SPACE,KC_GRAVE,KC_RGUI, KC_DEL, KC_LEFT,KC_DOWN, KC_RIGHT + ), + + [_FN] = LAYOUT( // FN Key + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, KC_ENT, _______, _______, _______, _______, _______, _______, _______ + ), + +}; diff --git a/keyboards/converter/palm_usb/stowaway/rules.mk b/keyboards/converter/palm_usb/stowaway/rules.mk new file mode 100644 index 000000000..e69de29bb diff --git a/keyboards/converter/palm_usb/stowaway/stowaway.h b/keyboards/converter/palm_usb/stowaway/stowaway.h new file mode 100644 index 000000000..71af9bf4a --- /dev/null +++ b/keyboards/converter/palm_usb/stowaway/stowaway.h @@ -0,0 +1,53 @@ +/* +Copyright 2018 milestogo + +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 . +*/ + +#pragma once + +#include "quantum.h" + + +/* Stowaway Keyboard + based on matrix from http://www.splorp.com/pdf/stowawayhwref.pdf + + 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS, EQL, BACK APP0, + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC, RBRC, BSLS, APP1, + CAPS, A, S, D, F, G, H, J, K, L, SCLN, QUOT, ENT, APP2, + LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, RSFT, UP, APP3, + LCTL, FN, LALT, CMD, SPACE,SPACE,GRAVE,DONE, DEL, LEFT, DOWN, RIGHT + +*/ +#define LAYOUT( \ + K000, K001, K002, K004, K005, K006, K007, K064, K065, K066, K060, K061, K062, K063,\ + K031, K011, K012, K013, K014, K015, K016, K074, K075, K076, K077, K070, K071, K072, K073,\ + K030, K021, K022, K023, K024, K025, K026, K084, K085, K086, K087, K080, K081, K082,\ + K110, K003, K020, K054, K055, K056, K057, K094, K095, K096, K090, K111, K091, K092,\ + K032, K042, K043, K010, K027, K067, K017, K097, K100, K101, K102, K103 \ +) { \ + { K000, K001, K002 , K003, K004, K005, K006, K007 }, \ + { K010, K011, K012 , K013, K014, K015, K016, K017 }, \ + { K020, K021, K022 , K023, K024, K025, K026, K027 }, \ + { K030, K031, K032 , KC_NO,KC_NO, KC_NO,KC_NO, KC_NO }, \ + { KC_NO, KC_NO, K042 , K043, KC_NO, KC_NO,KC_NO, KC_NO }, \ + { KC_NO, KC_NO, KC_NO, KC_NO,K054, K055, K056, K057 }, \ + { K060, K061, K062 , K063, K064, K065, K066, K067 }, \ + { K070, K071, K072 , K073, K074, K075, K076, K077 }, \ + { K080, K081, K082 , KC_NO,K084, K085, K086, K087 }, \ + { K090, K091, K092 , KC_NO,K094, K095, K096, K097 }, \ + { K100, K101, K102 , K103, KC_NO, KC_NO,KC_NO, KC_NO }, \ + { K110, K111, KC_NO, KC_NO,KC_NO, KC_NO,KC_NO, KC_NO } \ +} + From 45dca4bc40bf403bc55f47c8c2091457582c9f53 Mon Sep 17 00:00:00 2001 From: Jason Thigpen Date: Fri, 7 Dec 2018 07:52:31 -0800 Subject: [PATCH 636/788] crd alps64 updates (#4565) * Update alps64 aek layout to work I tried using the layout provided with my alp64 board in AEK configuration, but keys weren't mapping correctly until I made this fix. * Update crd's alps64 aek keymp to match other boards (inspired by mechmerlin) * Fix minor whitespace issue --- keyboards/alps64/alps64.h | 6 +-- keyboards/alps64/keymaps/crd/keymap.c | 51 ++++++++++++------------ keyboards/dz60/keymaps/crd_ansi/keymap.c | 2 +- 3 files changed, 30 insertions(+), 29 deletions(-) diff --git a/keyboards/alps64/alps64.h b/keyboards/alps64/alps64.h index 4e8587435..14ff55218 100644 --- a/keyboards/alps64/alps64.h +++ b/keyboards/alps64/alps64.h @@ -94,16 +94,16 @@ along with this program. If not, see . K34, K35, K44, K45, K54, K55, K64, K65, K75, K05, K15, K16, K25, K24, \ K32, K33, K43, K52, K53, K63, K73, K74, K03, K04, K13, K14, K23, \ K31, K42, K51, K61, K62, K71, K72, K01, K02, K11, K12, K21, \ - K30, K40, K50, K60, K70, K00, K20 \ + K30, K40, K50, K60, K00, K10, K20 \ ) { \ { K00, K01, K02, K03, K04, K05, K06, K07 }, \ - { KC_NO, K11, K12, K13, K14, K15, K16, K17 }, \ + { K10, K11, K12, K13, K14, K15, K16, K17 }, \ { K20, K21, KC_NO, K23, K24, K25, KC_NO, K27 }, \ { K30, K31, K32, K33, K34, K35, K36, K37 }, \ { K40, KC_NO, K42, K43, K44, K45, K46, K47 }, \ { K50, K51, K52, K53, K54, K55, K56, K57 }, \ { K60, K61, K62, K63, K64, K65, K66, K67 }, \ - { K70, K71, K72, K73, K74, K75, K76, K77 } \ + { KC_NO, K71, K72, K73, K74, K75, K76, K77 } \ } #define LAYOUT_kc( \ diff --git a/keyboards/alps64/keymaps/crd/keymap.c b/keyboards/alps64/keymaps/crd/keymap.c index 815e6ddf4..0b12f02ad 100644 --- a/keyboards/alps64/keymaps/crd/keymap.c +++ b/keyboards/alps64/keymaps/crd/keymap.c @@ -1,31 +1,32 @@ #include QMK_KEYBOARD_H +enum keyboard_layers { + _BL = 0, // Base Layer + _FL // Function Layer +}; + +// Custom #defined keycodes (shorter macros for readability) +#define KC_CTES CTL_T(KC_ESC) +#define KC_RSUP RSFT_T(KC_UP) +#define KC_FNDN LT(_FL, KC_DOWN) +#define KC_RGLT RCMD_T(KC_LEFT) +#define KC_RCRT RCTL_T(KC_RIGHT) + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* 0: qwerty */ - LAYOUT_all( - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, _______, KC_BSPC, - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, - CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, - KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, RSFT_T(KC_UP), _______, - MO(1), KC_LALT, KC_LGUI, KC_SPC, _______, RGUI_T(KC_LEFT), RALT_T(KC_DOWN), LT(2, KC_RIGHT) + [_BL] = LAYOUT_aek_103( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, + KC_CTES, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSUP, + MO(_FL), KC_LALT, KC_LGUI, KC_SPC, KC_RGLT, KC_FNDN, KC_RCRT ), - /* 1: fn1 */ - LAYOUT_all( - KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_DEL, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, _______, - _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_END, KC_PGDOWN, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______ - ), - /* 2: fn2 */ - LAYOUT_all( - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET, - _______, _______, _______, _______, RESET, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, - _______, _______, _______, DEBUG, _______, _______, _______, _______, _______, _______, KC_SCROLLLOCK, KC_PAUSE, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______ - ), -} -; + [_FL] = LAYOUT_aek_103( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, + _______, KC_HOME, KC_UP, KC_END, _______, _______, _______, _______, KC_MUTE, _______, _______, KC_PGDN, KC_PGUP, RESET, + _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, KC_SLCK, KC_VOLD, KC_VOLU, KC_PAUS, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______ + ) +}; const uint16_t PROGMEM fn_actions[] = {}; diff --git a/keyboards/dz60/keymaps/crd_ansi/keymap.c b/keyboards/dz60/keymaps/crd_ansi/keymap.c index 52d1756be..5d7b24d18 100644 --- a/keyboards/dz60/keymaps/crd_ansi/keymap.c +++ b/keyboards/dz60/keymaps/crd_ansi/keymap.c @@ -20,7 +20,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSUP, KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_FNLT, KC_RADN, KC_RCRT ), - [_FL] =LAYOUT_60_ansi( + [_FL] = LAYOUT_60_ansi( KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, _______, KC_HOME, KC_UP, KC_END, _______, _______, _______, _______, KC_MUTE, _______, _______, KC_PGDN, KC_PGUP, RESET, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, KC_SLCK, KC_VOLD, KC_VOLU, KC_PAUS, _______, _______, _______, From 0f2108c90544ec0e143a427c78534d463b0c4437 Mon Sep 17 00:00:00 2001 From: Alex Mayer Date: Fri, 7 Dec 2018 10:56:38 -0500 Subject: [PATCH 637/788] 1up60hse: Make Keymap Rows Match Keyboard Row Layout (#4564) Remove unused process_record_user function --- .../1up60hse/keymaps/default/keymap.c | 38 ++++++++----------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/keyboards/1upkeyboards/1up60hse/keymaps/default/keymap.c b/keyboards/1upkeyboards/1up60hse/keymaps/default/keymap.c index 1c168abf7..48350a53e 100644 --- a/keyboards/1upkeyboards/1up60hse/keymaps/default/keymap.c +++ b/keyboards/1upkeyboards/1up60hse/keymaps/default/keymap.c @@ -18,34 +18,26 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT_60_ansi( - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, - KC_EQL, KC_BSPC, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, - KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, - KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, - KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, - KC_RALT, KC_RGUI, MO(1), KC_LCTL + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(1), KC_LCTL ), [1] = LAYOUT_60_ansi( - KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, - KC_F11, KC_F12, KC_DEL, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, - KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, KC_HOME, KC_PGUP, KC_TRNS, - KC_TRNS, KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, - KC_PGDN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(2), KC_TRNS, KC_TRNS + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, + KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, + KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, KC_HOME, KC_PGUP, KC_TRNS, + KC_TRNS, KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, KC_PGDN, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(2), KC_TRNS, KC_TRNS ), [2] = LAYOUT_60_ansi( - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, RESET, BL_TOGG, BL_INC, BL_DEC, BL_STEP, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI, - RGB_SAI, RGB_VAI, RGB_SPI, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_RMOD, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD, RGB_M_SN, RGB_M_K, RGB_M_X, RGB_M_G, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, + BL_TOGG, BL_INC, BL_DEC, BL_STEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RGB_RMOD, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD, RGB_M_SN, RGB_M_K, RGB_M_X, RGB_M_G, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), }; - -bool process_record_user(uint16_t keycode, keyrecord_t *record) -{ - return true; -} From ca9262ca3dba6a511a0d14c48a5291dfd9465615 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Spie=C3=9F?= Date: Fri, 7 Dec 2018 17:36:51 +0100 Subject: [PATCH 638/788] Add levinson keymap for user 'drogglbecher' (#4566) * Add levinson layout for drogglbecher * Add tab to layer 0 * Change OS key to ALT * Remove unnecessary KC_TRNS define Co-Authored-By: Drogglbecher --- .../levinson/keymaps/drogglbecher/config.h | 17 +++++ .../levinson/keymaps/drogglbecher/keymap.c | 76 +++++++++++++++++++ .../levinson/keymaps/drogglbecher/rules.mk | 10 +++ 3 files changed, 103 insertions(+) create mode 100644 keyboards/levinson/keymaps/drogglbecher/config.h create mode 100644 keyboards/levinson/keymaps/drogglbecher/keymap.c create mode 100644 keyboards/levinson/keymaps/drogglbecher/rules.mk diff --git a/keyboards/levinson/keymaps/drogglbecher/config.h b/keyboards/levinson/keymaps/drogglbecher/config.h new file mode 100644 index 000000000..ef96ff00b --- /dev/null +++ b/keyboards/levinson/keymaps/drogglbecher/config.h @@ -0,0 +1,17 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "config_common.h" + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +/* #define USE_I2C */ + +/* Select hand configuration */ + +#define MASTER_LEFT +/* #define _MASTER_RIGHT */ +/* #define EE_HANDS */ + +#endif diff --git a/keyboards/levinson/keymaps/drogglbecher/keymap.c b/keyboards/levinson/keymaps/drogglbecher/keymap.c new file mode 100644 index 000000000..b8d2dc594 --- /dev/null +++ b/keyboards/levinson/keymaps/drogglbecher/keymap.c @@ -0,0 +1,76 @@ +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +#define _FN0 0 +#define _FN1 1 +#define _FN2 2 + +#define KC_X1 MO(_FN1) +#define KC_X2 MO(_FN2) + +#define KC_LPRN LSFT(KC_9) // ( +#define KC_RPRN LSFT(KC_0) // ) + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* ┌──────┬──────┬──────┬──────┬──────┬──────┐ ┌──────┬──────┬──────┬──────┬──────┬──────┐ + * │ ESC │ q │ w │ e │ r │ t │ │ y │ u │ i │ o │ p │ BS │ + * ├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤ + * │ CTRL │ a │ s │ d │ f │ g │ │ h │ j │ k │ l │ " ' │ RET │ + * ├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤ + * │ SHFT │ z │ x │ c │ v │ b │ │ n │ m │ [ { │ ] } │ ; : │ SHFT │ + * ├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤ + * │ L1 │ ALT │ L2 │ TAB | SPC │ SPC │ │ SPC │ SPC │ , < │ . > │ - _ │ / ? │ + * └──────┴──────┴──────┴──────┴──────┴──────┘ └──────┴──────┴──────┴──────┴──────┴──────┘ + */ + + [_FN0] = LAYOUT_ortho_4x12( \ + KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_LBRC, KC_RBRC, KC_SCLN, KC_RSFT, \ + KC_X1, KC_LALT, KC_X2, KC_TAB, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_COMM, KC_DOT, KC_MINS, KC_SLSH \ + ), + + /* ┌──────┬──────┬──────┬──────┬──────┬──────┐ ┌──────┬──────┬──────┬──────┬──────┬──────┐ + * │ │ 1 │ 2 │ 3 │ 4 │ 5 │ │ 6 │ 7 │ 8 │ 9 │ 0 │ DEL │ + * ├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤ + * │ │ ä │ ö │ ü │ ß │ │ │ LEFT │ DOWN │ UP │ RGT │ │ │ + * ├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤ + * │ │ Ä │ Ö │ Ü │ € │ │ │ │ │ ( │ ) │ │ │ + * ├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤ + * │ | │ │ | SPC │ SPC │ │ SPC │ SPC │ │ │ │ \ | │ + * └──────┴──────┴──────┴──────┴──────┴──────┘ └──────┴──────┴──────┴──────┴──────┴──────┘ + */ + + [_FN1] = LAYOUT_ortho_4x12( \ + _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \ + _______, UC(L'ä'), UC(L'ö'), UC(L'ü'), UC(L'ß'), _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, KC_PIPE, \ + _______, UC(L'Ä'), UC(L'Ö'), UC(L'Ü'), UC(L'€'), _______, _______, _______, KC_LPRN, KC_RPRN, _______, _______, \ + _______, _______, _______, KC_TAB, KC_SPC, KC_SPC, KC_SPC, KC_SPC, _______, _______, _______, KC_BSLS \ + ), + + /* ┌──────┬──────┬──────┬──────┬──────┬──────┐ ┌──────┬──────┬──────┬──────┬──────┬──────┐ + * │ ` │ ! │ @ │ # │ $ │ % │ │ ^ │ & │ * │ ~ │ + │ = │ + * ├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤ + * │ │ │ │ │ │ │ │ HOME │ PGDN │ PGUP │ END │ │ │ + * ├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤ + * │ F1 │ F2 │ F3 │ F4 │ F5 │ F6 │ │ F7 │ F8 │ F9 │ F10 │ F11 │ F12 │ + * ├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤ + * │ │ │ │ │ SPC │ SPC │ │ SPC │ SPC │ │ VOL+ │ VOL- │ MUTE │ + * └──────┴──────┴──────┴──────┴──────┴──────┘ └──────┴──────┴──────┴──────┴──────┴──────┘ + */ + + [_FN2] = LAYOUT_ortho_4x12( \ + KC_GRV, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_TILD, KC_PLUS, KC_PEQL, \ + _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END, _______, _______, \ + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ + _______, _______, _______, _______, KC_SPC, KC_SPC, KC_SPC, KC_SPC, _______, KC_VOLD, KC_VOLU, KC_MUTE \ + ) + +}; + +void matrix_init_user(void) { + set_unicode_input_mode(UC_LNX); +}; diff --git a/keyboards/levinson/keymaps/drogglbecher/rules.mk b/keyboards/levinson/keymaps/drogglbecher/rules.mk new file mode 100644 index 000000000..b223b71ab --- /dev/null +++ b/keyboards/levinson/keymaps/drogglbecher/rules.mk @@ -0,0 +1,10 @@ +AUTO_SHIFT_ENABLE = no +AUTO_SHIFT_MODIFIERS = no +RGBLIGHT_ENABLE = no +BACKLIGHT_ENABLE = no +UNICODE_ENABLE = yes +DEFAULT_FOLDER = levinson/rev2 + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif From afb4a43677f7289bb607cdb19870bf84eff14c3a Mon Sep 17 00:00:00 2001 From: ishtob Date: Fri, 7 Dec 2018 16:37:28 -0500 Subject: [PATCH 639/788] Keymap: adding ishtob's keymap to hadron ver3 (#4570) --- keyboards/hadron/ver3/keymaps/ishtob/config.h | 1 + keyboards/hadron/ver3/keymaps/ishtob/keymap.c | 229 ++++++++++++++++++ .../hadron/ver3/keymaps/ishtob/readme.md | 2 + 3 files changed, 232 insertions(+) create mode 100644 keyboards/hadron/ver3/keymaps/ishtob/config.h create mode 100644 keyboards/hadron/ver3/keymaps/ishtob/keymap.c create mode 100644 keyboards/hadron/ver3/keymaps/ishtob/readme.md diff --git a/keyboards/hadron/ver3/keymaps/ishtob/config.h b/keyboards/hadron/ver3/keymaps/ishtob/config.h new file mode 100644 index 000000000..6f70f09be --- /dev/null +++ b/keyboards/hadron/ver3/keymaps/ishtob/config.h @@ -0,0 +1 @@ +#pragma once diff --git a/keyboards/hadron/ver3/keymaps/ishtob/keymap.c b/keyboards/hadron/ver3/keymaps/ishtob/keymap.c new file mode 100644 index 000000000..870781930 --- /dev/null +++ b/keyboards/hadron/ver3/keymaps/ishtob/keymap.c @@ -0,0 +1,229 @@ +#include QMK_KEYBOARD_H +#include "ishtob.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,------+------+------+------+------+------------------------------------------------. + * | ` | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | DEL | + * |------+------+------+------+------+------+------+------+------+------+------+------+--------------------. + * | Tab | Q | W | E | R | T | 7 | 8 | 9 | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | LCTL | A | S | D | F | G | 4 | 5 | 6 | H | J | K | L | ;/Nav|Ctl/Et| + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | 1 | 2 | 3 | N | M | , | . | / | - | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | Esc | Ctrl | GUI | Alt |Lower |Space | 0 | . | = |Space |Raise | Alt | NumL | App | Del | + * `--------------------------------------------------------------------------------------------------------' + */ +[_QWERTY] = LAYOUT_wrapper( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_DEL,\ + KC_TAB, _________________QWERTY_L1_________________, KC_P7, KC_P8, KC_P9, _________________QWERTY_R1_________________, KC_BSPC, \ + KC_CAPS, _________________QWERTY_L2_________________, KC_P4, KC_P5, KC_P6, _________________QWERTY_R2_________________, CTL_ENT, \ + KC_LSFT, _________________QWERTY_L3_________________, KC_P1, KC_P2, KC_P3, _________________QWERTY_R3_________________, LT_RAI(KC_MINS), \ + KC_ESC, KC_LCTRL, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_P0, KC_DOT, KC_EQL, KC_SPC, RAISE, KC_RALT, TG_NUMLAY, KC_APP, KC_DEL \ +), + +/* Colemak + * ,------+------+------+------+------+------------------------------------------------. + * | ` | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | 0 | - | + * |------+------+------+------+------+------+------+------+------+------+------+------+--------------------. + * | Tab | Q | W | F | P | G | 7 | 8 | 9 | J | L | U | Y | ; | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------+------+------+------| + * | CAPS | A | R | S | T | D | 4 | 5 | 6 | H | N | E | I | O |Ctl/Et| + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | 1 | 2 | 3 | K | M | , | . | / | - | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | Esc | Ctrl | GUI | Alt |Lower |Space | 0 | . | = |Space |Raise | Alt | NumL | App | Del | + * `--------------------------------------------------------------------------------------------------------' + */ +[_COLEMAK] = LAYOUT_wrapper( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_DEL,\ + KC_TAB, _________________COLEMAK_L1________________, KC_P7, KC_P8, KC_P9, _________________COLEMAK_R1________________, KC_BSPC, \ + KC_LCTRL, _________________COLEMAK_L2________________, KC_P4, KC_P5, KC_P6, _________________COLEMAK_R2________________, CTL_ENT, \ + KC_LSFT, _________________COLEMAK_L3________________, KC_P1, KC_P2, KC_P3, _________________COLEMAK_R3________________, LT_RAI(KC_MINS), \ + KC_ESC, KC_CAPS, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_P0, KC_DOT, KC_EQL, KC_SPC, RAISE, KC_RALT, TG_NUMLAY, KC_APP, KC_DEL \ + ), + +/* Dvorak + * ,------+------+------+------+------+------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | + * |------+------+------+------+------+------+------+------+------+------+------+------+--------------------. + * | Tab | " | , | . | P | Y | 7 | 8 | 9 | F | G | C | R | L | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------+------+------+------| + * | Esc | A | O | E | U | I | 4 | 5 | 6 | D | H | T | N | S | / | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | 1 | 2 | 3 | B | M | W | V | Z |Ctl/Et| + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | Esc | Ctrl | GUI | Alt |Lower |Space | 0 | . | = |Space |Raise | Alt | NumL | App | Del | + * `--------------------------------------------------------------------------------------------------------' + */ +[_DVORAK] = LAYOUT_wrapper( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_DEL,\ + KC_TAB, _________________DVORAK_L1_________________, KC_P7, KC_P8, KC_P9, _________________DVORAK_R1_________________, KC_BSPC, \ + KC_LCTL, _________________DVORAK_L2_________________, KC_P4, KC_P5, KC_P6, _________________DVORAK_R2_________________, CTL_ENT, \ + KC_LSFT, _________________DVORAK_L3_________________, KC_P1, KC_P2, KC_P3, _________________DVORAK_R3_________________, LT_RAI(KC_MINS), \ + KC_ESC, KC_CAPS, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_P0, KC_DOT, KC_EQL, KC_SPC, RAISE, KC_RALT, TG_NUMLAY, KC_APP, KC_DEL \ +), + +/* Lower + * ,------+------+------+------+------+------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | + * |------+------+------+------+------+------+------+------+------+------+------+------+--------------------. + * | ~ | ! | @ | # | $ | % | | | | ^ | & | * | ( | ) | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------+------+------+------| + * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | _ | + | { | } | | | + * |------+------+------+------+------+------|------+------+------+------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | | | | F12 |ISO ~ |ISO | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | Next | Vol- | Vol+ | Play | + * `--------------------------------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT_wrapper( + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, _______, _______, _______, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \ + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, _______, _______, KC_F6, KC_UNDS, KC_PLUS, KC_LBRC, KC_RBRC, KC_PIPE, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, _______, _______, _______, KC_F12,S(KC_NUHS),S(KC_NUBS),_______,_______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Raise + * ,------+------+------+------+------+------------------------------------------------. + * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | + * |------+------+------+------+------+------+------+------+------+------+------+------+--------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | | | | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | | | | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | | | | F12 |ISO # |ISO / | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | Next | Vol- | Vol+ | Play | + * `--------------------------------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT_wrapper( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, _______, _______, _______, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, _______, _______, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, _______, _______, _______, KC_F12, KC_NUHS, KC_NUBS, _______, _______, _______, \ + _______, _______, _______, _______, _______, KC_SPC, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Mouse Layer (semi-col) + * ,------+------+------+------+------+------------------------------------------------. + * | ACCL0| ACCL1| ACCL2| | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------+--------------------. + * | | | | | | | | | Home | Wh_Up| WHL_L| M_Up | WHL_R| Macro| | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | End | Wh_Dn| M_Lft| M_Dn | M_Rt | | | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | BTN2 | BTN3 | BTN4 | BTN5 | | | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | BTN1 | | | | BTN1 | | | | | | + * `--------------------------------------------------------------------------------------------------------' + */ + +[_MOUSECURSOR] = LAYOUT_wrapper( + KC_ACL0, KC_ACL1, KC_ACL2, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, M_EMAIL,M_EMAIL2, _______, _______, _______, KC_HOME, KC_PGUP, KC_WH_L, KC_MS_U, KC_WH_R, P_MPASS, P_META, \ + _______, _______, _______, _______, O_RTQ6H, _______, _______, _______, KC_END , KC_PGDN, KC_MS_L, KC_MS_D, KC_MS_R, _______, O_DAYRN, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_BTN2, KC_BTN3, KC_BTN4, KC_BTN5, _______, _______, \ + _______, _______, _______, _______, _______, KC_BTN1, _______, _______, _______, KC_BTN1, _______, _______, _______, P_CITRIX, O_AUTODC \ +), + +/* Adjust (Lower + Raise) + * ,------+------+------+------+------+------------------------------------------------. + * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | + * |------+------+------+------+------+------+------+------+------+------+------+------+--------------------. + * | Reset|RGB TG|RGB ST|RGBH -|RGBH +|RGBS -|RGBS +|RGBV -|RGBV +| | | | | | Del | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm| | | |AGswap|Qwerty|Colemk| | | | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | |Voice-|Voice+|Mus on|Musoff| | | | | | | | BL + |BL ST |BL TG | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | | | | | + * `--------------------------------------------------------------------------------------------------------' + */ +[_ADJUST] = LAYOUT_wrapper( + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ + RESET, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, KC_DEL, \ + _______, MAGIC_TOGGLE_NKRO, _______, AU_ON, AU_OFF, AG_NORM, _______, _______, _______, AG_SWAP, QWERTY, COLEMAK, _______, _______, _______, \ + _______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, BL_DEC, BL_INC, BL_STEP, BL_TOGG, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, CK_RST, CK_DOWN, CK_UP, CK_TOGG\ +) + + + +}; + +uint32_t layer_state_set_user(uint32_t state) { + return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST); +} + + +bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + set_single_persistent_default_layer(_COLEMAK); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + //not sure how to have keyboard check mode and set it to a variable, so my work around + //uses another variable that would be set to true after the first time a reactive key is pressed. + layer_on(_LOWER); + } else { + layer_off(_LOWER); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + //not sure how to have keyboard check mode and set it to a variable, so my work around + //uses another variable that would be set to true after the first time a reactive key is pressed. + layer_on(_RAISE); + } else { + layer_off(_RAISE); + } + return false; + break; + case BACKLIT: + if (record->event.pressed) { + register_code(KC_RSFT); + #ifdef BACKLIGHT_ENABLE + backlight_step(); + #endif + } else { + unregister_code(KC_RSFT); + } + return false; + break; + } + return true; +} + +bool music_mask_user(uint16_t keycode) { + switch (keycode) { + case RAISE: + case LOWER: + return false; + default: + return true; + } +} + + +void matrix_init_keymap(void) { +} + + +void matrix_scan_keymap(void) { +} + diff --git a/keyboards/hadron/ver3/keymaps/ishtob/readme.md b/keyboards/hadron/ver3/keymaps/ishtob/readme.md new file mode 100644 index 000000000..88b958ec4 --- /dev/null +++ b/keyboards/hadron/ver3/keymaps/ishtob/readme.md @@ -0,0 +1,2 @@ +# The Default Hadron Layout + From 5b7260fc5327f195f63d872f856391e0bd168d27 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Fri, 7 Dec 2018 13:46:23 -0800 Subject: [PATCH 640/788] Keyboard: handwired/minorca Refactor, Configurator support and readme cleanup (#4571) * handwired/minorca: refactor - Refactored keymaps to use a layout macro, which was added to minorca.h. - keymaps now use QMK_KEYBOARD_H include - removed redundant KC_TRNS and KC_NO definitions - rgb keymap refactor to use QMK core layer switching and Mod-Tap keycodes * handwired/minorca: Configurator support * handwired/minorca: readme cleanup Restructure readme file to current QMK template. --- keyboards/handwired/minorca/info.json | 55 ++++++++++++++ .../minorca/keymaps/default/keymap.c | 53 ++++++-------- .../handwired/minorca/keymaps/rgb/keymap.c | 71 +++++++------------ keyboards/handwired/minorca/minorca.h | 12 ++++ keyboards/handwired/minorca/readme.md | 36 +++------- 5 files changed, 121 insertions(+), 106 deletions(-) create mode 100644 keyboards/handwired/minorca/info.json diff --git a/keyboards/handwired/minorca/info.json b/keyboards/handwired/minorca/info.json new file mode 100644 index 000000000..dafee6345 --- /dev/null +++ b/keyboards/handwired/minorca/info.json @@ -0,0 +1,55 @@ +{ + "keyboard_name": "Minorca Handwired", + "url": "", + "maintainer": "qmk", + "width": 12, + "height": 4, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"KA00", "x":0, "y":0}, + {"label":"KA01", "x":1, "y":0}, + {"label":"KA02", "x":2, "y":0}, + {"label":"KA03", "x":3, "y":0}, + {"label":"KA04", "x":4, "y":0}, + {"label":"KA05", "x":5, "y":0}, + {"label":"KA06", "x":6, "y":0}, + {"label":"KA07", "x":7, "y":0}, + {"label":"KA08", "x":8, "y":0}, + {"label":"KA09", "x":9, "y":0}, + {"label":"KA10", "x":10, "y":0}, + {"label":"KA11", "x":11, "y":0}, + {"label":"KB00", "x":0, "y":1, "w":1.25}, + {"label":"KB01", "x":1.25, "y":1}, + {"label":"KB02", "x":2.25, "y":1}, + {"label":"KB03", "x":3.25, "y":1}, + {"label":"KB04", "x":4.25, "y":1}, + {"label":"KB05", "x":5.25, "y":1}, + {"label":"KB06", "x":6.25, "y":1}, + {"label":"KB07", "x":7.25, "y":1}, + {"label":"KB08", "x":8.25, "y":1}, + {"label":"KB09", "x":9.25, "y":1}, + {"label":"KB11", "x":10.25, "y":1, "w":1.75}, + {"label":"KC00", "x":0, "y":2, "w":1.75}, + {"label":"KC02", "x":1.75, "y":2}, + {"label":"KC03", "x":2.75, "y":2}, + {"label":"KC04", "x":3.75, "y":2}, + {"label":"KC05", "x":4.75, "y":2}, + {"label":"KC06", "x":5.75, "y":2}, + {"label":"KC07", "x":6.75, "y":2}, + {"label":"KC08", "x":7.75, "y":2}, + {"label":"KC09", "x":8.75, "y":2}, + {"label":"KC10", "x":9.75, "y":2}, + {"label":"KC11", "x":10.75, "y":2, "w":1.25}, + {"label":"KD00", "x":0, "y":3, "w":1.25}, + {"label":"KD02", "x":1.25, "y":3, "w":1.25}, + {"label":"KD03", "x":2.5, "y":3, "w":1.25}, + {"label":"KD04", "x":3.75, "y":3, "w":2.25}, + {"label":"KD07", "x":6, "y":3, "w":2.25}, + {"label":"KD09", "x":8.25, "y":3, "w":1.25}, + {"label":"KD10", "x":9.5, "y":3}, + {"label":"KD11", "x":10.5, "y":3, "w":1.5} + ] + } + } +} diff --git a/keyboards/handwired/minorca/keymaps/default/keymap.c b/keyboards/handwired/minorca/keymaps/default/keymap.c index 3392f25ef..29ed7aa03 100644 --- a/keyboards/handwired/minorca/keymaps/default/keymap.c +++ b/keyboards/handwired/minorca/keymaps/default/keymap.c @@ -1,7 +1,4 @@ - -#include "minorca.h" -#include "action_layer.h" -#include "eeconfig.h" +#include QMK_KEYBOARD_H extern keymap_config_t keymap_config; @@ -10,33 +7,23 @@ extern keymap_config_t keymap_config; // Layer names don't all need to be of the same length, obviously, and you can also skip them // entirely and just use numbers. -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = { /* Base */ - {KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC }, - {KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, XXXXXXX, KC_ENT }, - {KC_LCTRL,XXXXXXX, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_QUOT, KC_FN1, KC_FN0 }, - {KC_NO, XXXXXXX, KC_NO, KC_LALT, KC_SPC, XXXXXXX, XXXXXXX, KC_SPC, XXXXXXX, KC_DOT, KC_SLSH, KC_NO } - }, - [1] = { /* First */ - {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DELT }, - {KC_TAB, KC_MPRV, KC_MPLY, KC_MNXT, KC_PGUP, KC_HOME, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, XXXXXXX, KC_LGUI }, - {KC_LCTRL,XXXXXXX, KC_Z, KC_X, KC_C, KC_PGDN, KC_END, KC_L, KC_SCLN, KC_UP, KC_FN1, KC_FN0 }, - {KC_NO, XXXXXXX, KC_NO, KC_LALT, _______, XXXXXXX, XXXXXXX, _______, XXXXXXX, KC_DOWN, KC_RIGHT,KC_NO } - }, - [2] = { /* Second */ - {KC_ESC, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DELT }, - {KC_TAB, KC_MUTE, KC_VOLD, KC_VOLU, KC_TILD, KC_PIPE, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, XXXXXXX, KC_ENT }, - {KC_CAPS, XXXXXXX, KC_LSFT, KC_RSFT, KC_PAUSE,KC_F10, KC_F11, KC_F12, KC_NO, KC_UP, KC_FN1, KC_FN0 }, - {KC_NO, XXXXXXX, KC_NO, KC_LALT, _______, XXXXXXX, XXXXXXX, _______, XXXXXXX, KC_DOWN, KC_RIGHT,KC_NO } - }, -}; - -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_LAYER_MOMENTARY(1), // to First overlay - [1] = ACTION_LAYER_MOMENTARY(2), // to Second overlay - -}; \ No newline at end of file + [0] = LAYOUT( /* Base */ + KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_ENT, \ + KC_LCTL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_QUOT, MO(2), MO(1), \ + XXXXXXX, XXXXXXX, KC_LALT, KC_SPC, KC_SPC, KC_DOT, KC_SLSH, XXXXXXX \ + ), + [1] = LAYOUT( /* First */ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \ + KC_TAB, KC_MPRV, KC_MPLY, KC_MNXT, KC_PGUP, KC_HOME, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_LGUI, \ + KC_LCTL, KC_Z, KC_X, KC_C, KC_PGDN, KC_END, KC_L, KC_SCLN, KC_UP, _______, _______, \ + XXXXXXX, XXXXXXX, KC_LALT, _______, _______, KC_DOWN, KC_RGHT, XXXXXXX \ + ), + [2] = LAYOUT( /* Second */ + KC_ESC, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \ + KC_TAB, KC_MUTE, KC_VOLD, KC_VOLU, KC_TILD, KC_PIPE, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_ENT, \ + KC_CAPS, KC_LSFT, KC_RSFT, KC_PAUS, KC_F10, KC_F11, KC_F12, XXXXXXX, KC_UP, _______, _______, \ + XXXXXXX, XXXXXXX, KC_LALT, _______, _______, KC_DOWN, KC_RGHT, XXXXXXX \ + ), +}; diff --git a/keyboards/handwired/minorca/keymaps/rgb/keymap.c b/keyboards/handwired/minorca/keymaps/rgb/keymap.c index e1ee49dce..c99a255e4 100644 --- a/keyboards/handwired/minorca/keymaps/rgb/keymap.c +++ b/keyboards/handwired/minorca/keymaps/rgb/keymap.c @@ -1,7 +1,4 @@ - -#include "minorca.h" -#include "action_layer.h" -#include "eeconfig.h" +#include QMK_KEYBOARD_H extern keymap_config_t keymap_config; @@ -14,50 +11,34 @@ extern keymap_config_t keymap_config; #define _RAISE 2 #define _TB 3 -// Macro name shortcuts -#define QWERTY M(_QWERTY) -#define LOWER M(_LOWER) -#define RAISE M(_RAISE) - -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[_QWERTY] = { /* Qwerty */ - {KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, - {FUNC(0), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, XXXXXXX, KC_QUOT}, - {KC_LSFT, XXXXXXX, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, FUNC(1)}, - {KC_LCTL, XXXXXXX, KC_LGUI, KC_LALT, FUNC(2), XXXXXXX, XXXXXXX, FUNC(3), XXXXXXX, KC_RALT, KC_APP, KC_RCTL} -}, + [_QWERTY] = LAYOUT( /* Qwerty */ \ + KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + LT(_TB, KC_TAB), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, MT(MOD_RSFT, KC_ENT), \ + KC_LCTL, KC_LGUI, KC_LALT, LT(_RAISE, KC_SPC), LT(_LOWER, KC_SPC), KC_RALT, KC_APP, KC_RCTL \ + ), -[_RAISE] = { - {S(KC_GRV), S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), S(KC_7), S(KC_8), S(KC_9), S(KC_0), KC_BSPC}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_PAUSE, KC_TRNS, KC_TRNS, KC_TRNS, S(KC_MINS), S(KC_EQL), S(KC_LBRC), XXXXXXX, S(KC_BSLS)}, - {KC_TRNS, XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_ENT}, - {KC_TRNS, XXXXXXX, KC_TRNS, KC_TRNS, KC_TRNS, XXXXXXX, XXXXXXX, KC_TRNS, XXXXXXX, KC_MNXT, KC_MUTE, KC_MPLY} -}, + [_RAISE] = LAYOUT( \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \ + _______, _______, _______, KC_PAUS, _______, _______, _______, KC_UNDS, KC_PLUS, KC_LCBR, KC_PIPE, \ + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_ENT, \ + _______, _______, _______, _______, _______, KC_MNXT, KC_MUTE, KC_MPLY \ + ), -[_LOWER] = { - {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DELETE}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_LBRC, XXXXXXX, KC_BSLS}, - {KC_TRNS, XXXXXXX, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_PGUP, KC_ENT}, - {KC_TRNS, XXXXXXX, KC_TRNS, KC_TRNS, KC_TRNS, XXXXXXX, XXXXXXX, KC_TRNS, XXXXXXX, KC_HOME, KC_PGDN, KC_END} -}, + [_LOWER] = LAYOUT( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \ + _______, _______, _______, _______, _______, _______, _______, KC_MINS, KC_EQL, KC_LBRC, KC_BSLS, \ + _______, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_PGUP, KC_ENT, \ + _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_END \ + ), + + [_TB] = LAYOUT( /* Tab */ \ + KC_ESC, KC_CALC, KC_WHOM, KC_MAIL, KC_MYCM, _______, _______, _______, _______, _______, KC_PSCR, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_UP, KC_ENT, \ + BL_STEP, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT \ + ) -[_TB] = { /* Tab */ - {KC_ESC, KC_CALC, KC_WHOM, KC_MAIL, KC_MYCM, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_TRNS}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, XXXXXXX, KC_TRNS}, - {KC_TRNS, XXXXXXX, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_UP, KC_ENT}, - {BL_STEP, XXXXXXX, KC_TRNS, KC_TRNS, KC_TRNS, XXXXXXX, XXXXXXX, KC_TRNS, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT} -} -}; - - -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_LAYER_TAP_KEY(_TB, KC_TAB), - [1] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_ENT), - [2] = ACTION_LAYER_TAP_KEY(_RAISE, KC_SPC), - [3] = ACTION_LAYER_TAP_KEY(_LOWER, KC_SPC), }; diff --git a/keyboards/handwired/minorca/minorca.h b/keyboards/handwired/minorca/minorca.h index 158e5b4c5..2df4ebdc4 100644 --- a/keyboards/handwired/minorca/minorca.h +++ b/keyboards/handwired/minorca/minorca.h @@ -3,4 +3,16 @@ #include "quantum.h" +#define LAYOUT( \ + KA00, KA01, KA02, KA03, KA04, KA05, KA06, KA07, KA08, KA09, KA10, KA11, \ + KB00, KB01, KB02, KB03, KB04, KB05, KB06, KB07, KB08, KB09, KB11, \ + KC00, KC02, KC03, KC04, KC05, KC06, KC07, KC08, KC09, KC10, KC11, \ + KD00, KD02, KD03, KD04, KD07, KD09, KD10, KD11 \ +) { \ + { KA00, KA01, KA02, KA03, KA04, KA05, KA06, KA07, KA08, KA09, KA10, KA11 }, \ + { KB00, KB01, KB02, KB03, KB04, KB05, KB06, KB07, KB08, KB09, KC_NO, KB11 }, \ + { KC00, KC_NO, KC02, KC03, KC04, KC05, KC06, KC07, KC08, KC09, KC10, KC11 }, \ + { KD00, KC_NO, KD02, KD03, KD04, KC_NO, KC_NO, KD07, KC_NO, KD09, KD10, KD11 } \ +} + #endif diff --git a/keyboards/handwired/minorca/readme.md b/keyboards/handwired/minorca/readme.md index 0253506e0..c91045960 100644 --- a/keyboards/handwired/minorca/readme.md +++ b/keyboards/handwired/minorca/readme.md @@ -1,33 +1,13 @@ -minorca keyboard firmware -====================== -Handwired 40% keyboard +# minorca -http://www.panc.co/blog/minorcasebright-information-page +A handwired 40% keyboard by panc.co. -## Quantum MK Firmware +Keyboard Maintainer: [The QMK Community](https://github.com/qmk) +Hardware Supported: panc.co minorca +Hardware Availability: [panc.co](https://www.panc.co/blog/minorcasebright-information-page) -For the full Quantum feature list, see [the parent readme.md](/readme.md). +Make example for this keyboard (after setting up your build environment): -## Building + make handwired/minorca:default -Download or clone the whole firmware and navigate to the keyboards/planck folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use `make dfu` to program your PCB once you hit the reset button. - -Depending on which keymap you would like to use, you will have to compile slightly differently. - -### Default -To build with the default keymap, simply run `make`. - -### Other Keymaps -Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `.c` in the keymaps folder, and see keymap document (you can find in top readme.md) and existent keymap files. - -To build the firmware binary hex file with a keymap just do `make` with `KEYMAP` option like: -``` -$ make KEYMAP=[default|jack|] -``` -Keymaps follow the format **__\.c__** and are stored in the `keymaps` folder. - -### Notable forks (which some of the keymap files are from) -- [Shane's Fork](https://github.com/shanecelis/tmk_keyboard/tree/master/keyboard/planck) -- [Pierre's Fork](https://github.com/pcarrier/tmk_keyboard/blob/pcarrier/planck/keyboard/gh60/keymap_planck.c) -- [Nathan's Fork](https://github.com/nathanrosspowell/tmk_keyboard/tree/planck-jack/keyboard/planck) -- [Matthew's Fork](https://github.com/pepers/tmk_keyboard/tree/master/keyboard/planck) +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). From 7749f4590f5f69cb7cae758cae5e45111b68d042 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nico=20Hormaz=C3=A1bal?= Date: Fri, 7 Dec 2018 23:00:26 +0100 Subject: [PATCH 641/788] Keymap: Updated keymap with better F positioning (#4463) * added own keymap for planck * Update Readme.md * Update Readme.md * Update Readme.md * Update Readme.md * Update Readme.md * dynamic macros * Update Readme.md * moved the reset button * Update readme for volume explanation * Format * Update Readme.md * Update Readme.md * added safe double shift * changed the modified shift to regular shift, for allowing shift + F keys * moved power stuff to the function layer * del button on raise * Update Readme.md * updated F keys * Update Readme.md * Update Readme.md * moved F keys * fixed conflicts * missed something * moved F11 and F12 * Update layout in the image * Update keyboards/planck/keymaps/dr_notsokind/keymap.c Co-Authored-By: pnikosis * Apply suggestions from code review Co-Authored-By: pnikosis --- .../planck/keymaps/dr_notsokind/Readme.md | 2 +- .../planck/keymaps/dr_notsokind/keymap.c | 108 +++++++++--------- 2 files changed, 54 insertions(+), 56 deletions(-) diff --git a/keyboards/planck/keymaps/dr_notsokind/Readme.md b/keyboards/planck/keymaps/dr_notsokind/Readme.md index e7e29cb7d..a336de2f3 100644 --- a/keyboards/planck/keymaps/dr_notsokind/Readme.md +++ b/keyboards/planck/keymaps/dr_notsokind/Readme.md @@ -70,7 +70,7 @@ When you are done, press `Media` and `Enter`. You will finally hear a tune confi Press `Media` and the key where you stored your Macro, either `;` or `'`. The Macro will play. -![Imgur](https://i.imgur.com/ri4lEcl.png) +![Imgur](https://i.imgur.com/TcVyNag.png) http://www.keyboard-layout-editor.com/#/gists/4cfb26f84bbb4fabe5e6c7cc22c85e24 diff --git a/keyboards/planck/keymaps/dr_notsokind/keymap.c b/keyboards/planck/keymaps/dr_notsokind/keymap.c index f43fc37bc..64650aaa8 100644 --- a/keyboards/planck/keymaps/dr_notsokind/keymap.c +++ b/keyboards/planck/keymaps/dr_notsokind/keymap.c @@ -1,8 +1,6 @@ // Layout picture at http://www.keyboard-layout-editor.com/#/gists/125febfad6960add078e6f14256539b6 -#pragma message "You may need to add LAYOUT_planck_grid to your keymap layers - see default for an example" -#include "planck.h" -#include "action_layer.h" +#include QMK_KEYBOARD_H #ifdef AUDIO_ENABLE #include "audio.h" #endif @@ -79,12 +77,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Ctrl | GUI | Alt | Mute | Lower| Space | Raise| / | Left | Down | Right| * `-----------------------------------------------------------------------------------' */ -[_QWERTY] = { - {KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, - {KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, - {SFT_CAP, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_UP, SFT_ENT}, - {KC_LCTL, KC_LGUI, KC_LALT, MEDIA, LOWER, KC_SPC, KC_SPC, RAISE, KC_SLSH, KC_LEFT, KC_DOWN, KC_RGHT} -}, +[_QWERTY] = LAYOUT_planck_grid( + KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + SFT_CAP, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_UP, SFT_ENT, + KC_LCTL, KC_LGUI, KC_LALT, MEDIA, LOWER, KC_SPC, KC_SPC, RAISE, KC_SLSH, KC_LEFT, KC_DOWN, KC_RGHT +), /* NUMPAD * ,-----------------------------------------------------------------------------------. @@ -97,12 +95,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | 0 | . | , | = | * `-----------------------------------------------------------------------------------' */ -[_NUMPAD] = { - {QWERTY, XXXXXXX, KC_UP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_PSLS, KC_P7, KC_P8, KC_P9, KC_PMNS}, - {_______, KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX, XXXXXXX, XXXXXXX, KC_PAST, KC_P4, KC_P5, KC_P6, KC_PPLS}, - {_______, KC_NLCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_BSPC, KC_P1, KC_P2, KC_P3, KC_PENT}, - {_______, _______, _______, _______, _______, _______, _______, _______, KC_P0, KC_PDOT, KC_PCMM, KC_PEQL} -}, +[_NUMPAD] = LAYOUT_planck_grid( + QWERTY, XXXXXXX, KC_UP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_PSLS, KC_P7, KC_P8, KC_P9, KC_PMNS, + _______, KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX, XXXXXXX, XXXXXXX, KC_PAST, KC_P4, KC_P5, KC_P6, KC_PPLS, + _______, KC_NLCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_BSPC, KC_P1, KC_P2, KC_P3, KC_PENT, + _______, _______, _______, _______, _______, _______, _______, _______, KC_P0, KC_PDOT, KC_PCMM, KC_PEQL +), /* LOCK * ,-----------------------------------------------------------------------------------. @@ -115,30 +113,30 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | NULL | | | | | | | | | | * `-----------------------------------------------------------------------------------' */ -[_LOCKED] = { - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, - {KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_ENT}, - {_______, XXXXXXX, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} -}, +[_LOCKED] = LAYOUT_planck_grid( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_ENT, + _______, XXXXXXX, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), /* RAISE * ,-----------------------------------------------------------------------------------. * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | | - | = | [ | ] | \ | + * | Del | F11 | F12 | F13 | F14 | F15 | | - | = | [ | ] | \ | * |------+------+------+------+------+------+------+------+------+------+------+------| - * |LShift| F6 | F7 | F8 | F9 | F10 | |ISO # |ISO / | NULL | PgUp | Enter| + * |LShift| F16 | F17 | F18 | F19 | F20 | |ISO # |ISO / | NULL | PgUp | Enter| * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | | F11 | | F12 | | | Home | PgDn | End | + * | | | | | | | | | Home | PgDn | End | * `-----------------------------------------------------------------------------------' */ -[_RAISE] = { - {KC_GRV , KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL}, - {KC_DEL , KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, - {KC_LSFT, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, _______, KC_NUHS, KC_NUBS, XXXXXXX, KC_PGUP, KC_ENT }, - {_______, _______, _______, KC_F11, _______, KC_F12, KC_F12, _______, _______, KC_HOME, KC_PGDN, KC_END } -}, +[_RAISE] = LAYOUT_planck_grid( + KC_GRV , KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, + KC_DEL , KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, _______, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, + KC_LSFT, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, _______, KC_NUHS, KC_NUBS, XXXXXXX, KC_PGUP, KC_ENT, + _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_END +), /* LOWER * ,-----------------------------------------------------------------------------------. @@ -148,15 +146,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------+------+------+------+------+------+------| * |LShift| F6 | F7 | F8 | F9 | F10 | |ISO ~ |ISO | | NULL | PgUp | Enter| * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | | F11 | | F12 | | | Home | PgDn | End | + * | | | | | | | | | Home | PgDn | End | * `-----------------------------------------------------------------------------------' */ -[_LOWER] = { - {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL }, - {KC_DEL , KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, - {KC_LSFT, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, _______, S(KC_NUHS), S(KC_NUBS), XXXXXXX, KC_PGUP, KC_ENT }, - {_______, _______, _______, KC_F11, _______, KC_F12, KC_F12, _______, _______, KC_HOME, KC_PGDN, KC_END } -}, +[_LOWER] = LAYOUT_planck_grid( + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL , + KC_DEL , KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, + KC_LSFT, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, _______, S(KC_NUHS), S(KC_NUBS), XXXXXXX, KC_PGUP, KC_ENT , + _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_END +), /* MEDIA AND COMMANDS * ,-----------------------------------------------------------------------------------. @@ -169,12 +167,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |ONESHT| NULL | NULL | | Vol- | Mute | Vol+ |Zoom 0| Stop | Next | Play | * `-----------------------------------------------------------------------------------' */ -[_MEDIA] = { - {XXXXXXX, XXXXXXX, KC_WHOM, XXXXXXX, XXXXXXX, XXXXXXX, KC_AGAIN, XXXXXXX, KC_INS, XXXXXXX, KC_PSCR, XXXXXXX}, - {XXXXXXX, XXXXXXX, KC_WSCH, XXXXXXX, KC_FIND, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, DYN_MACRO_PLAY1, DYN_MACRO_PLAY2 }, - {KC_LSFT, XXXXXXX, XXXXXXX, KC_CALC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, ZOOM_OUT, ZOOM_IN, KC_MPRV, DYN_REC_STOP }, - {ONESHOT, XXXXXXX, XXXXXXX, _______, KC_VOLD, KC_MUTE, KC_MUTE, KC_VOLU, ZOOM_NML, KC_MSTP, KC_MNXT, KC_MPLY } -}, +[_MEDIA] = LAYOUT_planck_grid( + XXXXXXX, XXXXXXX, KC_WHOM, XXXXXXX, XXXXXXX, XXXXXXX, KC_AGAIN, XXXXXXX, KC_INS, XXXXXXX, KC_PSCR, XXXXXXX, + XXXXXXX, XXXXXXX, KC_WSCH, XXXXXXX, KC_FIND, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, DYN_MACRO_PLAY1, DYN_MACRO_PLAY2, + KC_LSFT, XXXXXXX, XXXXXXX, KC_CALC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, ZOOM_OUT, ZOOM_IN, KC_MPRV, DYN_REC_STOP, + ONESHOT, XXXXXXX, XXXXXXX, _______, KC_VOLD, KC_MUTE, KC_MUTE, KC_VOLU, ZOOM_NML, KC_MSTP, KC_MNXT, KC_MPLY +), /* ONESHOT * ,-----------------------------------------------------------------------------------. @@ -187,12 +185,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | | | * `-----------------------------------------------------------------------------------' */ -[_ONESHOT] = { - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, DYN_REC_START1, DYN_REC_START2}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} -}, +[_ONESHOT] = LAYOUT_planck_grid( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, DYN_REC_START1, DYN_REC_START2, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), /* FUNCTIONS * ,-----------------------------------------------------------------------------------. @@ -205,12 +203,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Reset| NULL | LOCK | NULL | | NULL | | NULL |AGNorm|Voice-|AGSwap| * `-----------------------------------------------------------------------------------' */ -[_FUNCTN] = { - {KC_SLEP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_PWR }, - {KC_WAKE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX }, - {XXXXXXX, XXXXXXX, XXXXXXX, AU_OFF, MU_OFF, QWERTY, NUMPAD, MU_ON, AU_ON, XXXXXXX, MUV_IN, KC_SYSREQ}, - {RESET, XXXXXXX, LOCK, XXXXXXX, _______, XXXXXXX, XXXXXXX, _______, XXXXXXX, AG_NORM, MUV_DE, AG_SWAP} -} +[_FUNCTN] = LAYOUT_planck_grid( + KC_SLEP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_PWR, + KC_WAKE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, AU_OFF, MU_OFF, QWERTY, NUMPAD, MU_ON, AU_ON, XXXXXXX, MUV_IN, KC_SYSREQ, + RESET, XXXXXXX, LOCK, XXXXXXX, _______, XXXXXXX, XXXXXXX, _______, XXXXXXX, AG_NORM, MUV_DE, AG_SWAP +) }; From c9159effc0b07b44d90ea92de625b9d338938eb2 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Fri, 7 Dec 2018 16:48:03 -0800 Subject: [PATCH 642/788] handwired/MS_sculpt_mobile Refactor, Configurator and cleanup (#4576) * handwired/MS_sculpt_mobile: refactor - layout macro KEYMAP renamed to LAYOUT - layout macro MATRIX_TESTING_KEYMAP renamed to MATRIX_TESTING_LAYOUT * handwired/MS_sculpt_mobile: Configurator support * handwired/MS_sculpt_mobile: readme cleanup * handwired/MS_sculpt_mobile: rename folder Renamed the directory to fully lowercase. * handwired/MS_sculpt_mobile: rename keyboard files Renamed the keyboard core files to fully lowercase. * handwired/ms_sculpt_mobile: keymap readme cleanup Capitalization fixes because I'm that guy. * handwired/ms_sculpt_mobile: keymap config.h fixes Keymap config.h files updated to use #pragma once * handwired/ms_sculpt_mobile: updated paths Fixing path references due to rename. --- .../MS_sculpt_mobile/MS_sculpt_mobile.c | 1 - .../MS_sculpt_mobile/keymaps/default/config.h | 8 - .../keymaps/default/readme.md | 1 - .../keymaps/milestogo/readme.md | 1 - .../handwired/MS_sculpt_mobile/readme.md | 58 ------- .../babblePaste.c | 148 +++++++++--------- .../babblePaste.h | 34 ++-- .../babblePaste.txt | 0 .../config.h | 0 .../handwired/ms_sculpt_mobile/info.json | 96 ++++++++++++ .../ms_sculpt_mobile/keymaps/default/config.h | 3 + .../keymaps/default/keymap.c | 46 ++---- .../keymaps/default/readme.md | 1 + .../keymaps/default/rules.mk | 0 .../keymaps/milestogo/config.h | 14 +- .../keymaps/milestogo/keymap.c | 20 +-- .../keymaps/milestogo/readme.md | 1 + .../keymaps/milestogo/rules.mk | 0 .../ms_sculpt_mobile/ms_sculpt_mobile.c | 1 + .../ms_sculpt_mobile.h} | 4 +- .../handwired/ms_sculpt_mobile/readme.md | 55 +++++++ .../rules.mk | 0 22 files changed, 275 insertions(+), 217 deletions(-) delete mode 100644 keyboards/handwired/MS_sculpt_mobile/MS_sculpt_mobile.c delete mode 100644 keyboards/handwired/MS_sculpt_mobile/keymaps/default/config.h delete mode 100644 keyboards/handwired/MS_sculpt_mobile/keymaps/default/readme.md delete mode 100644 keyboards/handwired/MS_sculpt_mobile/keymaps/milestogo/readme.md delete mode 100644 keyboards/handwired/MS_sculpt_mobile/readme.md rename keyboards/handwired/{MS_sculpt_mobile => ms_sculpt_mobile}/babblePaste.c (92%) rename keyboards/handwired/{MS_sculpt_mobile => ms_sculpt_mobile}/babblePaste.h (92%) rename keyboards/handwired/{MS_sculpt_mobile => ms_sculpt_mobile}/babblePaste.txt (100%) rename keyboards/handwired/{MS_sculpt_mobile => ms_sculpt_mobile}/config.h (100%) create mode 100644 keyboards/handwired/ms_sculpt_mobile/info.json create mode 100644 keyboards/handwired/ms_sculpt_mobile/keymaps/default/config.h rename keyboards/handwired/{MS_sculpt_mobile => ms_sculpt_mobile}/keymaps/default/keymap.c (51%) create mode 100644 keyboards/handwired/ms_sculpt_mobile/keymaps/default/readme.md rename keyboards/handwired/{MS_sculpt_mobile => ms_sculpt_mobile}/keymaps/default/rules.mk (100%) rename keyboards/handwired/{MS_sculpt_mobile => ms_sculpt_mobile}/keymaps/milestogo/config.h (73%) rename keyboards/handwired/{MS_sculpt_mobile => ms_sculpt_mobile}/keymaps/milestogo/keymap.c (97%) create mode 100644 keyboards/handwired/ms_sculpt_mobile/keymaps/milestogo/readme.md rename keyboards/handwired/{MS_sculpt_mobile => ms_sculpt_mobile}/keymaps/milestogo/rules.mk (100%) create mode 100644 keyboards/handwired/ms_sculpt_mobile/ms_sculpt_mobile.c rename keyboards/handwired/{MS_sculpt_mobile/MS_sculpt_mobile.h => ms_sculpt_mobile/ms_sculpt_mobile.h} (98%) create mode 100644 keyboards/handwired/ms_sculpt_mobile/readme.md rename keyboards/handwired/{MS_sculpt_mobile => ms_sculpt_mobile}/rules.mk (100%) diff --git a/keyboards/handwired/MS_sculpt_mobile/MS_sculpt_mobile.c b/keyboards/handwired/MS_sculpt_mobile/MS_sculpt_mobile.c deleted file mode 100644 index 64982fb62..000000000 --- a/keyboards/handwired/MS_sculpt_mobile/MS_sculpt_mobile.c +++ /dev/null @@ -1 +0,0 @@ -#include "MS_sculpt_mobile.h" diff --git a/keyboards/handwired/MS_sculpt_mobile/keymaps/default/config.h b/keyboards/handwired/MS_sculpt_mobile/keymaps/default/config.h deleted file mode 100644 index 4f3a425b7..000000000 --- a/keyboards/handwired/MS_sculpt_mobile/keymaps/default/config.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../../MS_sculpt_mobile/config.h" - -// place overrides here - -#endif diff --git a/keyboards/handwired/MS_sculpt_mobile/keymaps/default/readme.md b/keyboards/handwired/MS_sculpt_mobile/keymaps/default/readme.md deleted file mode 100644 index e67ddc6fe..000000000 --- a/keyboards/handwired/MS_sculpt_mobile/keymaps/default/readme.md +++ /dev/null @@ -1 +0,0 @@ -# The default keymap for microsoft-sculpt-mobile diff --git a/keyboards/handwired/MS_sculpt_mobile/keymaps/milestogo/readme.md b/keyboards/handwired/MS_sculpt_mobile/keymaps/milestogo/readme.md deleted file mode 100644 index 96ee0e77a..000000000 --- a/keyboards/handwired/MS_sculpt_mobile/keymaps/milestogo/readme.md +++ /dev/null @@ -1 +0,0 @@ -# A more programmer oriented keymap for microsoft-sculpt-mobile diff --git a/keyboards/handwired/MS_sculpt_mobile/readme.md b/keyboards/handwired/MS_sculpt_mobile/readme.md deleted file mode 100644 index d435b449f..000000000 --- a/keyboards/handwired/MS_sculpt_mobile/readme.md +++ /dev/null @@ -1,58 +0,0 @@ - -This is a way to take a Microsoft ergonomic bluetooth keyboard, and make it -into a hard-wired keyboard running QMK. - -The keyboard is known under several different names: -Mobile Bluetooth 5000, Mobile 6000, Sculpt mobile, and Asus rebranded - -I had a stack of them,since they're cheap on ebay, travel well, and are just ergo enough. - -The ribbon cable is 1mm pitch, which is hard to hand solder. I bought a cheap set of -"pitch adapter" boards https://www.amazon.com/Double-Sided-0-4mm-1-0-Adapter-60mmx38mm/dp/B00OK42118 - -Cut the original ribbon cable sockets off the bluetooth board using a razor, they're hard to desolder. -They're also allow the cable to be inserted on top or bottom. - -If I was going to do it again, I'd make the MCU connection come out the top of the keyboard -and avoid the wires dangling out the bottom. - -As I was debugging the matrix, I started to get random failures. In desparation I tried a second MCU, -but had the same problems. It turns out that the ribbon cable connections can get worn. Shave a -half millimeter off the end of the ribbon cable & the errors go away. - -My method for discovering the matrix was to set up a KEYMAP macro that included all pins. -See MATRIX_TESTING_KEYMAP if you need it. Then set up a keymap that has all printable symbols -in the first 4 rows. test each key & record output. Then switch the printable symbols to the -bottom 4 rows & repeat. This was enough to show the matrix. - - -The full original keymap for the sculpt is - A B C D E F G H ---> -0 b n m , . / -1 g h " -2 7 8 9 0 Del PgUp -3 p [ ] \ -4 y u i o -5 ~ - += j k l ; 5 -6 a s d q w e, Up left -7 F7 F8 F9 F10 F11 F12 f - ------> I J K L M N O P Q R -0 Caps FN -1 Vol+ mute Rctl vol- pgdn LCTL -2 Rshift LShift -3 Ralt LAlt -4 LGUI -5 6 bakspc 1 2 3 4 F4 F5 F6 -6 Down right spc F1 F2 F3 tab -7 r t z x c v enter Esc - -This works with 18 cols + 8 rows on a Teensy++, or Arm based Teensy. - -The Astar mini has all pins exposed , so you can do 18x8 -If you want a speaker, LEDs &etc, you'll need to free up a pin. I recommend joining columns -R and L to the same pin. - -Building - add ASTAR=1 to the compile line or leave out for teensy2++ - - diff --git a/keyboards/handwired/MS_sculpt_mobile/babblePaste.c b/keyboards/handwired/ms_sculpt_mobile/babblePaste.c similarity index 92% rename from keyboards/handwired/MS_sculpt_mobile/babblePaste.c rename to keyboards/handwired/ms_sculpt_mobile/babblePaste.c index 22394cc7d..e03564870 100644 --- a/keyboards/handwired/MS_sculpt_mobile/babblePaste.c +++ b/keyboards/handwired/ms_sculpt_mobile/babblePaste.c @@ -1,13 +1,13 @@ -/* A library to output the right key shortcut in any common app. -Given a global variable babble_mode to show the environment and a -key that calls the paste macro, do the right type of paste. -Setting the context is done by another macro, or TBD interaction with the host. +/* A library to output the right key shortcut in any common app. +Given a global variable babble_mode to show the environment and a +key that calls the paste macro, do the right type of paste. +Setting the context is done by another macro, or TBD interaction with the host. Huge thanks to https://en.wikipedia.org/wiki/Table_of_keyboard_shortcuts -and https://github.com/qmk/qmk_firmware/blob/master/keyboards/planck/keymaps/jeebak/keymap.c +and https://github.com/qmk/qmk_firmware/blob/master/keyboards/planck/keymaps/jeebak/keymap.c */ -#include "../MS_sculpt_mobile/babblePaste.h" +#include "babblePaste.h" #include "action_macro.h" @@ -16,14 +16,14 @@ and https://github.com/qmk/qmk_firmware/blob/master/keyboards/planck/keymaps/jee // GLOBAL variable to determine mode. Sets startup default if no eeppom uint8_t babble_mode =0 ; -// small function that we might also want to call from a keymap. +// small function that we might also want to call from a keymap. macro_t* switch_babble_mode( uint8_t id) { babble_mode= id; return MACRO_NONE; //less typing where called } - + // Today I learned that the preprocessor can not create a switch statement label from an argument // And else statements have problems, see https://gcc.gnu.org/onlinedocs/gcc-3.0.1/cpp_3.html#SEC15 #define BABLM(ent, macro...) \ @@ -32,8 +32,8 @@ macro_t* switch_babble_mode( uint8_t id) { /* this function runs the appropriate babblepaste macro, given -the global babble_mode, and a shortcut from the ENUM in babblePaste.h -TODO, the pointers in this function should be stored in a PROGMEM array, not ram. +the global babble_mode, and a shortcut from the ENUM in babblePaste.h +TODO, the pointers in this function should be stored in a PROGMEM array, not ram. But that requires even more clever preprocessor foo. */ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) { @@ -43,20 +43,20 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) { return MACRO_NONE; } */ - + #ifdef MS_MODE - if ( BABL_WINDOWS == shortcut ) { return switch_babble_mode(MS_MODE); } -#endif + if ( BABL_WINDOWS == shortcut ) { return switch_babble_mode(MS_MODE); } +#endif #ifdef MAC_MODE - if ( BABL_MAC == shortcut) { return switch_babble_mode(MAC_MODE); } + if ( BABL_MAC == shortcut) { return switch_babble_mode(MAC_MODE); } #endif #ifdef LINUX_MODE if ( BABL_LINUX == shortcut ) { return switch_babble_mode(LINUX_MODE); } -#endif +#endif #ifdef READMUX_MODE if ( BABL_READLINE == shortcut ) { switch_babble_mode(READMUX_MODE); return MACRO_NONE; } -#endif +#endif #ifdef VI_MODE if ( BABL_VI == shortcut ) { return switch_babble_mode(VI_MODE); } #endif @@ -66,11 +66,11 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) { - switch(babble_mode) { + switch(babble_mode) { #ifdef MS_MODE - - case MS_MODE: + + case MS_MODE: BABLM( BABL_GO_LEFT_1C, T(LEFT), END ); BABLM( BABL_GO_RIGHT_1C , T(RIGHT), END ); BABLM( BABL_GO_LEFT_WORD, D(LCTL), T(LEFT), U(LCTL), END ); @@ -93,7 +93,7 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) { BABLM( BABL_REDO, D(LCTL), T(Y), U(LCTL), END ); BABLM( BABL_CUT, D(LCTL), T(X), U(LCTL), END ); BABLM( BABL_COPY, D(LCTL), T(C), U(LCTL), END ); - BABLM( BABL_PASTE, D(LCTL), T(V), U(LCTL), END ); + BABLM( BABL_PASTE, D(LCTL), T(V), U(LCTL), END ); BABLM( BABL_SELECT_ALL, D(LCTL), T(A), U(LCTL), END ); BABLM( BABL_FIND, D(LCTL),T(F), U(LCTL),END ); BABLM( BABL_FIND_NEXT, T(F3),END ); @@ -114,7 +114,7 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) { BABLM( BABL_BROWSER_BACK, D(LALT), T(LEFT), U(LALT),END ); BABLM( BABL_BROWSER_FIND, D(LCTL), T(F), U(LCTL),END ); BABLM( BABL_BROWSER_BOOKMARK, D(LCTL), T(D), U(LCTL),END ); - //BABLM( BABL_BROWSER_DEV_TOOLS, T(F12), U(LCTL),END ); // EDGE + //BABLM( BABL_BROWSER_DEV_TOOLS, T(F12), U(LCTL),END ); // EDGE BABLM( BABL_BROWSER_DEV_TOOLS, D(LCTL), T(T), U(LCTL),END ); // Chrome // Chrome BABLM( BABL_BROWSER_RELOAD, D(LCTL), T(F5), U(LCTL),END ); // hard reload w/o cache @@ -126,8 +126,8 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) { // Todo, ring bell, flash light, show user this isn't supported return MACRO_NONE; - - + + #endif /* MS_MODE*/ @@ -146,7 +146,7 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) { BABLM( BABL_GO_PREV_LINE , T(UP), END ); BABLM( BABL_PGDN , T(PGDN), END ); BABLM( BABL_PGUP , T(PGUP), END ); - BABLM( BABL_DEL_RIGHT_1C , D(DEL), END ); + BABLM( BABL_DEL_RIGHT_1C , D(DEL), END ); BABLM( BABL_DEL_LEFT_WORD , D(LCTL), T(BSPACE), U(LCTL), END ); BABLM( BABL_DEL_RIGHT_WORD , D(LCTL), T(DEL), U(LCTL), END ); BABLM( BABL_DEL_TO_LINE_END, D(RSFT), T(HOME), U(RSFT), T(DEL), END); @@ -156,8 +156,8 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) { BABLM( BABL_REDO , D(LCTL), T(Y), U(LCTL), END ); BABLM( BABL_CUT , D(LCTL), T(X), U(LCTL), END ); BABLM( BABL_COPY , D(LCTL), T(C), U(LCTL), END ); - BABLM( BABL_PASTE , D(LCTL), T(V), U(LCTL), END ); - BABLM( BABL_SELECT_ALL, D(LCTL), T(A), U(LCTL), END ); + BABLM( BABL_PASTE , D(LCTL), T(V), U(LCTL), END ); + BABLM( BABL_SELECT_ALL, D(LCTL), T(A), U(LCTL), END ); BABLM( BABL_FIND, D(LCTL),T(F), U(LCTL),END ); /* BABLM(BABL_FIND_NEXT , T(F3),END ); KDE */ BABLM( BABL_FIND_NEXT, D(LCTL),T(G), U(LCTL),END ); // Gnome*/ @@ -167,7 +167,7 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) { BABLM( BABL_SWITCH_APP_NEXT, D(LCTL),T(TAB), U(LCTL),END ); BABLM( BABL_SWITCH_APP_LAST, D(LSFT),D(LCTL),T(TAB), U(LCTL), U(LSFT),END ); BABLM( BABL_CLOSE_APP, D(LALT),T(F4), U(LALT),END ); - //BABLM( BABL_HELP, END ); + //BABLM( BABL_HELP, END ); #ifndef BABL_NOBROWSER BABLM( BABL_BROWSER_NEW_TAB, D(LCTL), T(T), U(LCTL),END ); @@ -188,9 +188,9 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) { #endif #endif return MACRO_NONE; - -#endif - + +#endif + #ifdef MAC_MODE case MAC_MODE: @@ -206,7 +206,7 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) { BABLM( BABL_GO_PREV_LINE , T(UP), END ); BABLM( BABL_PGDN , D(LALT),T(DOWN), U(LALT), END ); BABLM( BABL_PGUP , D(LALT),T(UP), U(LALT), END ); - BABLM( BABL_DEL_RIGHT_1C , D(DEL), END ); + BABLM( BABL_DEL_RIGHT_1C , D(DEL), END ); BABLM( BABL_DEL_LEFT_WORD , D(LALT), T(BSPACE), U(LALT), END ); BABLM( BABL_DEL_RIGHT_WORD, D(LALT), T(DEL), U(LALT), END ); BABLM( BABL_DEL_TO_LINE_END, D(LCTL), T(K), U(LCTL), END );// there must be another way @@ -216,7 +216,7 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) { BABLM( BABL_REDO , D(LSFT),D(LGUI), T(Z), U(LSFT),U(LGUI), END ); BABLM( BABL_CUT , D(LGUI), T(X), U(LGUI), END ); BABLM( BABL_COPY , D(LGUI), T(C), U(LGUI), END ); - BABLM( BABL_PASTE , D(LGUI), T(V), U(LGUI), END ); + BABLM( BABL_PASTE , D(LGUI), T(V), U(LGUI), END ); BABLM( BABL_SELECT_ALL , D(LGUI), T(A), U(LGUI), END ); BABLM( BABL_FIND , D(LGUI),T(F), U(LGUI),END ); BABLM( BABL_FIND_NEXT, D(LGUI),T(G), U(LGUI),END ); @@ -238,7 +238,7 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) { BABLM( BABL_BROWSER_BACK, D(LGUI), T(LEFT), U(LGUI),END ); BABLM( BABL_BROWSER_FIND, D(LGUI), T(F), U(LGUI),END ); BABLM( BABL_BROWSER_BOOKMARK, D(LGUI), T(D), U(LGUI),END ); - //BABLM( BABL_BROWSER_DEV_TOOLS, T(F12), U(LGUI),END ); // EDGE + //BABLM( BABL_BROWSER_DEV_TOOLS, T(F12), U(LGUI),END ); // EDGE BABLM( BABL_BROWSER_DEV_TOOLS, D(LGUI), D(LALT), T(I), U(LALT),U(LGUI),END ); // Chrome // Chrome BABLM( BABL_BROWSER_RELOAD, D(LGUI), T(R), U(LGUI),END ); // add shift for reload w/o cache @@ -247,10 +247,10 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) { BABLM( BABL_BROWSER_ZOOM_OUT, D(LGUI), T(MINS), U(LGUI),END ); #endif #endif - + return MACRO_NONE; -#endif - +#endif + #ifdef EMACS_MODE case EMACS_MODE: @@ -269,18 +269,18 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) { BABLM( BABL_GO_PREV_LINE , D(LCTL), T(P), U(LCTL), END ); BABLM( BABL_PGDN , D(LCTL), T(V), U(LCTL), END ); BABLM( BABL_PGUP , D(LALT), T(V), U(LALT), END ); - BABLM( BABL_DEL_RIGHT_1C, D(LCTL), T(D), U(LCTL),END ); + BABLM( BABL_DEL_RIGHT_1C, D(LCTL), T(D), U(LCTL),END ); BABLM( BABL_DEL_LEFT_WORD , D(LCTL), T(BSPACE), U(LCTL), END ); BABLM( BABL_DEL_RIGHT_WORD , D(LALT), T(D), U(LALT), END ); - BABLM( BABL_DEL_TO_LINE_END, D(LCTL), T(K), U(LCTL), END ); + BABLM( BABL_DEL_TO_LINE_END, D(LCTL), T(K), U(LCTL), END ); BABLM( BABL_DEL_TO_LINE_START, T(ESC), T(0), D(LCTL), T(K), U(LCTL), END ); #ifndef BABL_MOVEMENTONLY BABLM( BABL_UNDO , D(LCTL), T(X), U(LCTL),T(C), END ); BABLM( BABL_REDO , D(LCTL), T(X), U(LCTL),T(C), END ); // arguably BABLM( BABL_CUT , D(LCTL), T(W), U(LCTL), END ); BABLM( BABL_COPY , D(LALT), T(W), U(LALT), END ); //really? - BABLM( BABL_PASTE , D(LCTL), T(Y), U(LCTL), END ); - BABLM( BABL_SELECT_ALL ,D(LCTL), T(X), U(LCTL),T(H), END ); + BABLM( BABL_PASTE , D(LCTL), T(Y), U(LCTL), END ); + BABLM( BABL_SELECT_ALL ,D(LCTL), T(X), U(LCTL),T(H), END ); BABLM( BABL_FIND , D(LCTL), T(S), U(LCTL),END ); BABLM( BABL_FIND_NEXT , D(LCTL), T(S), U(LCTL),END ); BABLM( BABL_FIND_REPLACE , D(LALT),D(LSFT), T(5),U(LSFT), U(LALT), END ); @@ -290,7 +290,7 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) { BABLM( BABL_CLOSE_APP , D(LCTL), T(X), U(LCTL),T(C),END ); BABLM( BABL_HELP , D(LCTL),T(H), U(LCTL),T(A),END); // start search in help #ifndef BABL_NOBROWSER -/* you get to figure w3 out +/* you get to figure w3 out BABLM( BABL_BROWSER_NEW_TAB, D(LGUI), T(T), U(LGUI),END ); BABLM( BABL_BROWSER_CLOSE_TAB, D(LGUI), T(W), U(LGUI),END ); BABLM( BABL_BROWSER_REOPEN_LAST_TAB, D(LGUI), D(RSFT),T(T), U(RSFT),U(LGUI),END ); @@ -301,7 +301,7 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) { BABLM( BABL_BROWSER_BACK, D(LGUI), T(LEFT), U(LGUI),END ); BABLM( BABL_BROWSER_FIND, D(LGUI), T(F), U(LGUI),END ); BABLM( BABL_BROWSER_BOOKMARK, D(LGUI), T(D), U(LGUI),END ); - //BABLM( BABL_BROWSER_DEV_TOOLS, T(F12), U(LGUI),END ); // EDGE + //BABLM( BABL_BROWSER_DEV_TOOLS, T(F12), U(LGUI),END ); // EDGE BABLM( BABL_BROWSER_DEV_TOOLS, D(LGUI), D(LALT), T(I), U(LALT),U(LGUI),END ); // Chrome // Chrome BABLM( BABL_BROWSER_RELOAD, D(LGUI), T(R), U(LGUI),END ); // add shift for reload w/o cache @@ -312,18 +312,18 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) { #endif #endif break; - + return MACRO_NONE; } - -#endif + +#endif #ifdef VI_MODE case VI_MODE: // you have to track the modes yourself. Otherwise motion is awful (bell, bell, bell) - - + + BABLM( BABL_GO_LEFT_1C , T(H), END ); BABLM( BABL_GO_RIGHT_1C , T(L), END ); BABLM( BABL_GO_LEFT_WORD , T(B),END ); @@ -336,18 +336,18 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) { BABLM( BABL_GO_PREV_LINE, T(K), END ); BABLM( BABL_PGDN ,D(LCTL), T(F), U(LCTL), END ); BABLM( BABL_PGUP , D(LCTL), T(B), U(LCTL), END ); - BABLM( BABL_DEL_RIGHT_1C , T(X),END ); + BABLM( BABL_DEL_RIGHT_1C , T(X),END ); BABLM( BABL_DEL_LEFT_WORD , T(D),T(G),T(E),END ); BABLM( BABL_DEL_RIGHT_WORD , T(D),T(W),END ); BABLM( BABL_DEL_TO_LINE_END, T(D),D(LSFT), T(4),U(LSFT) ,END ); // d$ - BABLM( BABL_DEL_TO_LINE_START, T(D),D(LSFT), T(6),U(LSFT) ,END ); + BABLM( BABL_DEL_TO_LINE_START, T(D),D(LSFT), T(6),U(LSFT) ,END ); #ifndef BABL_MOVEMENTONLY BABLM( BABL_UNDO , T(U), END ); - BABLM( BABL_REDO , D(LCTL), T(R), U(LCTL), END ); + BABLM( BABL_REDO , D(LCTL), T(R), U(LCTL), END ); BABLM( BABL_CUT , T(X), END ); BABLM( BABL_COPY , T(Y),END ); - BABLM( BABL_PASTE , T(P), END ); - BABLM( BABL_SELECT_ALL , D(LSFT), T(SCLN),U(LSFT),D(LSFT), T(5),U(LSFT),T(Y), END ); // wrong but helpful? + BABLM( BABL_PASTE , T(P), END ); + BABLM( BABL_SELECT_ALL , D(LSFT), T(SCLN),U(LSFT),D(LSFT), T(5),U(LSFT),T(Y), END ); // wrong but helpful? BABLM( BABL_FIND , T(SLASH),END ); BABLM( BABL_FIND_NEXT , T(N),END ); BABLM( BABL_FIND_REPLACE , D(LALT),D(LSFT), T(5),U(LSFT), U(LALT), END ); @@ -357,7 +357,7 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) { BABLM(BABL_CLOSE_APP, D(LSFT), T(SCLN),U(LSFT), T(Q), D(RSFT), T(1),U(RSFT), END ); BABLM(BABL_HELP, D(LSFT), T(SCLN),U(LSFT),T(H),END); // start search in help #ifndef BABL_NOBROWSER -/* you get to figure this out +/* you get to figure this out BABLM( BABL_BROWSER_NEW_TAB, D(LGUI), T(T), U(LGUI),END ); BABLM( BABL_BROWSER_CLOSE_TAB, D(LGUI), T(W), U(LGUI),END ); BABLM( BABL_BROWSER_REOPEN_LAST_TAB, D(LGUI), D(RSFT),T(T), U(RSFT),U(LGUI),END ); @@ -368,7 +368,7 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) { BABLM( BABL_BROWSER_BACK, D(LGUI), T(LEFT), U(LGUI),END ); BABLM( BABL_BROWSER_FIND, D(LGUI), T(F), U(LGUI),END ); BABLM( BABL_BROWSER_BOOKMARK, D(LGUI), T(D), U(LGUI),END ); - //BABLM( BABL_BROWSER_DEV_TOOLS, T(F12), U(LGUI),END ); // EDGE + //BABLM( BABL_BROWSER_DEV_TOOLS, T(F12), U(LGUI),END ); // EDGE BABLM( BABL_BROWSER_DEV_TOOLS, D(LGUI), D(LALT), T(I), U(LALT),U(LGUI),END ); // Chrome // Chrome BABLM( BABL_BROWSER_RELOAD, D(LGUI), T(R), U(LGUI),END ); // add shift for reload w/o cache @@ -377,8 +377,8 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) { BABLM( BABL_BROWSER_ZOOM_OUT, D(LGUI), T(MINS), U(LGUI),END ); */ #endif -#endif - return MACRO_NONE; +#endif + return MACRO_NONE; #endif @@ -387,10 +387,10 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) { #ifdef READMUX_MODE // Readline command line editing + tmux windowing // I havent decided how much to do readline and how much tmux - - - case READMUX_MODE: - + + + case READMUX_MODE: + BABLM( BABL_GO_LEFT_1C , T(LEFT), END ); BABLM( BABL_GO_RIGHT_1C , T(RIGHT), END ); BABLM( BABL_GO_LEFT_WORD , D(LALT), T(B), U(LALT), END ); @@ -403,28 +403,28 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) { BABLM( BABL_GO_PREV_LINE , D(LCTL), T(P), U(LCTL), END ); BABLM( BABL_PGDN , T(PGDN), END ); BABLM( BABL_PGUP , T(PGUP), END ); - BABLM( BABL_DEL_RIGHT_1C , D(LCTL), T(D), U(LCTL),END ); + BABLM( BABL_DEL_RIGHT_1C , D(LCTL), T(D), U(LCTL),END ); BABLM( BABL_DEL_LEFT_WORD , D(LCTL), T(W), U(LCTL), END ); BABLM( BABL_DEL_RIGHT_WORD , D(LALT), T(D), U(LALT), END ); - BABLM( BABL_DEL_TO_LINE_END, D(LCTL), T(K), U(LCTL), END ); + BABLM( BABL_DEL_TO_LINE_END, D(LCTL), T(K), U(LCTL), END ); BABLM( BABL_DEL_TO_LINE_START, D(LCTL), T(U), U(LCTL), END ); #ifndef BABL_MOVEMENTONLY BABLM( BABL_UNDO , D(LALT), T(R), U(LALT) , END ); BABLM( BABL_REDO , D(LCTL), T(X), U(LCTL),T(C), END ); // arguably BABLM( BABL_CUT , D(LCTL), T(K), U(LCTL), END ); // wrong half the time - //BABLM( BABL_COPY ,END ); - BABLM( BABL_PASTE , D(LCTL), T(Y), U(LCTL), END ); - BABLM( BABL_SELECT_ALL , D(LCTL), T(A), T(K), T(Y), U(LCTL) , END ); + //BABLM( BABL_COPY ,END ); + BABLM( BABL_PASTE , D(LCTL), T(Y), U(LCTL), END ); + BABLM( BABL_SELECT_ALL , D(LCTL), T(A), T(K), T(Y), U(LCTL) , END ); BABLM( BABL_FIND , D(LCTL), T(R), U(LCTL), END ); // search history BABLM(BABL_FIND_NEXT, D(LCTL), T(S), U(LCTL), END ); - //BABLM( BABL_FIND_REPLACE ,END ); + //BABLM( BABL_FIND_REPLACE ,END ); BABLM( BABL_RUNAPP , D(LCTL), T(B), U(LCTL), T(C),END ); //tmux BABLM( BABL_SWITCH_APP_NEXT , D(LCTL), T(B), U(LCTL), T(N),END ); //tmux BABLM( BABL_SWITCH_APP_LAST , D(LCTL), T(B), U(LCTL), T(P),END ); //tmux BABLM( BABL_CLOSE_APP , D(LCTL), T(B), U(LCTL), T(D),END); // usually what I want - // BABLM( BABL_HELP ,END ); + // BABLM( BABL_HELP ,END ); #ifndef BABL_NOBROWSER -/* Add lynx shortcuts? +/* Add lynx shortcuts? BABLM( BABL_BROWSER_NEW_TAB, D(LGUI), T(T), U(LGUI),END ); BABLM( BABL_BROWSER_CLOSE_TAB, D(LGUI), T(W), U(LGUI),END ); BABLM( BABL_BROWSER_REOPEN_LAST_TAB, D(LGUI), D(RSFT),T(T), U(RSFT),U(LGUI),END ); @@ -435,7 +435,7 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) { BABLM( BABL_BROWSER_BACK, D(LGUI), T(LEFT), U(LGUI),END ); BABLM( BABL_BROWSER_FIND, D(LGUI), T(F), U(LGUI),END ); BABLM( BABL_BROWSER_BOOKMARK, D(LGUI), T(D), U(LGUI),END ); - //BABLM( BABL_BROWSER_DEV_TOOLS, T(F12), U(LGUI),END ); // EDGE + //BABLM( BABL_BROWSER_DEV_TOOLS, T(F12), U(LGUI),END ); // EDGE BABLM( BABL_BROWSER_DEV_TOOLS, D(LGUI), D(LALT), T(I), U(LALT),U(LGUI),END ); // Chrome // Chrome BABLM( BABL_BROWSER_RELOAD, D(LGUI), T(R), U(LGUI),END ); // add shift for reload w/o cache @@ -445,12 +445,12 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) { */ #endif #endif - - return MACRO_NONE; - -#endif - default: + return MACRO_NONE; + +#endif + + default: return MACRO_NONE; } diff --git a/keyboards/handwired/MS_sculpt_mobile/babblePaste.h b/keyboards/handwired/ms_sculpt_mobile/babblePaste.h similarity index 92% rename from keyboards/handwired/MS_sculpt_mobile/babblePaste.h rename to keyboards/handwired/ms_sculpt_mobile/babblePaste.h index cedd7d92b..1e8206212 100644 --- a/keyboards/handwired/MS_sculpt_mobile/babblePaste.h +++ b/keyboards/handwired/ms_sculpt_mobile/babblePaste.h @@ -1,15 +1,15 @@ -/* A library to output the right key shortcut in any common app. -Given a global variable babble_mode to show the environment and a -key that calls the paste macro, do the right type of paste. +/* A library to output the right key shortcut in any common app. +Given a global variable babble_mode to show the environment and a +key that calls the paste macro, do the right type of paste. -Setting the bable_mode is done by another macro, or TBD interaction with the host. +Setting the bable_mode is done by another macro, or TBD interaction with the host. Huge thanks to https://en.wikipedia.org/wiki/Table_of_keyboard_shortcuts and jeebak & algernon's keymap */ #ifndef _babblePaste_h_included__ #define _babblePaste_h_included__ -#include "../MS_sculpt_mobile/config.h" +#include "config.h" #include "action_layer.h" #include "quantum_keycodes.h" @@ -18,11 +18,11 @@ and jeebak & algernon's keymap /* *************************** // Uncomment any modes you want. Whatever mode = 0 will be the default on boot -// Expect to get errors if you comment a feature out and leave it in your keymap. +// Expect to get errors if you comment a feature out and leave it in your keymap. #define USE_BABLPASTE -//#define MS_MODE 0 // Windows. +//#define MS_MODE 0 // Windows. //#define MAC_MODE 1 //#define LINUX_MODE 2 //aka gnome+KDE //#define EMACS_MODE 3 @@ -42,7 +42,7 @@ and jeebak & algernon's keymap //#define BABL_MOVEMENTONLY -// Define starting number for BABL macros in the macro range. +// Define starting number for BABL macros in the macro range. // Probably can start the default even lower #define BABL_START_NUM 50 @@ -53,7 +53,7 @@ enum { // left & right BABL_GO_LEFT_1C= BABL_START_NUM, BABL_GO_RIGHT_1C, - BABL_GO_LEFT_WORD, + BABL_GO_LEFT_WORD, BABL_GO_RIGHT_WORD, BABL_GO_START_LINE, BABL_GO_END_LINE, @@ -65,7 +65,7 @@ enum { BABL_PGDN, BABL_PGUP, // And the delete options - //BABL_DEL_LEFT_1C == backspace, so why bother. + //BABL_DEL_LEFT_1C == backspace, so why bother. BABL_DEL_RIGHT_1C, // usually = Del BABL_DEL_LEFT_WORD, BABL_DEL_RIGHT_WORD, @@ -110,7 +110,7 @@ enum { BABL_BROWSER_FULLSCREEN, BABL_BROWSER_ZOOM_IN, BABL_BROWSER_ZOOM_OUT, - + #endif #endif @@ -137,8 +137,8 @@ enum { }; -// BUG, used to jump to babble functiion. Surely there is a way to calculate size of enum? -#define BABL_NUM_MACROS 48+4 // 48 + # of defined modes. +// BUG, used to jump to babble functiion. Surely there is a way to calculate size of enum? +#define BABL_NUM_MACROS 48+4 // 48 + # of defined modes. /* And all the shorthand keymap ready versions */ // First the mode switching macros @@ -161,7 +161,7 @@ enum { #define B_READ M(BABL_READLINE) #endif -// and all the movement & action. +// and all the movement & action. #define B_L1C M(BABL_GO_LEFT_1C) #define B_R1C M(BABL_GO_RIGHT_1C) @@ -175,7 +175,7 @@ enum { #define B_UP M(BABL_GO_PREV_LINE) #define B_PGDN M(BABL_PGDN) #define B_PGUP M(BABL_PGUP) -//#define B_BKSP M(BABL_DEL_LEFT_1C) == backspace so why bother. +//#define B_BKSP M(BABL_DEL_LEFT_1C) == backspace so why bother. #define B_DEL M(BABL_DEL_RIGHT_1C) // usually = Del #define B_DLW M(BABL_DEL_LEFT_WORD) #define B_DRW M(BABL_DEL_RIGHT_WORD) @@ -210,8 +210,8 @@ enum { #define B_BFUlL M(BABL_BROWSER_FULLSCREEN) #define B_ZMIN M(BABL_BROWSER_ZOOM_IN) #define B_ZMOT M(BABL_BROWSER_ZOOM_OUT) - - + + diff --git a/keyboards/handwired/MS_sculpt_mobile/babblePaste.txt b/keyboards/handwired/ms_sculpt_mobile/babblePaste.txt similarity index 100% rename from keyboards/handwired/MS_sculpt_mobile/babblePaste.txt rename to keyboards/handwired/ms_sculpt_mobile/babblePaste.txt diff --git a/keyboards/handwired/MS_sculpt_mobile/config.h b/keyboards/handwired/ms_sculpt_mobile/config.h similarity index 100% rename from keyboards/handwired/MS_sculpt_mobile/config.h rename to keyboards/handwired/ms_sculpt_mobile/config.h diff --git a/keyboards/handwired/ms_sculpt_mobile/info.json b/keyboards/handwired/ms_sculpt_mobile/info.json new file mode 100644 index 000000000..86d5fde2e --- /dev/null +++ b/keyboards/handwired/ms_sculpt_mobile/info.json @@ -0,0 +1,96 @@ +{ + "keyboard_name": "MS Sculpt Mobile", + "url": "", + "maintainer": "qmk", + "width": 16, + "height": 6, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"Esc", "x":0, "y":0}, + {"label":"F1", "x":1, "y":0}, + {"label":"F2", "x":2, "y":0}, + {"label":"F3", "x":3, "y":0}, + {"label":"F4", "x":4, "y":0}, + {"label":"F5", "x":5, "y":0}, + {"label":"F6", "x":6, "y":0}, + {"label":"F7", "x":7, "y":0}, + {"label":"F8", "x":8, "y":0}, + {"label":"F9", "x":9, "y":0}, + {"label":"F10", "x":10, "y":0}, + {"label":"F11", "x":11, "y":0}, + {"label":"F12", "x":12, "y":0}, + {"label":"PrtSc", "x":13, "y":0}, + {"label":"Home", "x":14, "y":0}, + {"label":"End", "x":15, "y":0}, + {"label":"`", "x":0, "y":1}, + {"label":"1", "x":1, "y":1}, + {"label":"2", "x":2, "y":1}, + {"label":"3", "x":3, "y":1}, + {"label":"4", "x":4, "y":1}, + {"label":"5", "x":5, "y":1}, + {"label":"6", "x":6, "y":1}, + {"label":"7", "x":7, "y":1}, + {"label":"8", "x":8, "y":1}, + {"label":"9", "x":9, "y":1}, + {"label":"0", "x":10, "y":1}, + {"label":"-", "x":11, "y":1}, + {"label":"=", "x":12, "y":1}, + {"label":"Backspace", "x":13, "y":1, "w":2}, + {"label":"Del", "x":15, "y":1, "h":1.6}, + {"label":"Tab", "x":0, "y":2, "w":1.5}, + {"label":"Q", "x":1.5, "y":2}, + {"label":"W", "x":2.5, "y":2}, + {"label":"E", "x":3.5, "y":2}, + {"label":"R", "x":4.5, "y":2}, + {"label":"T", "x":5.5, "y":2}, + {"label":"Y", "x":6.5, "y":2}, + {"label":"U", "x":7.5, "y":2}, + {"label":"I", "x":8.5, "y":2}, + {"label":"O", "x":9.5, "y":2}, + {"label":"P", "x":10.5, "y":2}, + {"label":"[", "x":11.5, "y":2}, + {"label":"]", "x":12.5, "y":2}, + {"label":"\\", "x":13.5, "y":2, "w":1.5}, + {"label":"Caps Lock", "x":0, "y":3, "w":1.75}, + {"label":"A", "x":1.75, "y":3}, + {"label":"S", "x":2.75, "y":3}, + {"label":"D", "x":3.75, "y":3}, + {"label":"F", "x":4.75, "y":3}, + {"label":"G", "x":5.75, "y":3}, + {"label":"H", "x":6.75, "y":3}, + {"label":"J", "x":7.75, "y":3}, + {"label":"K", "x":8.75, "y":3}, + {"label":"L", "x":9.75, "y":3}, + {"label":";", "x":10.75, "y":3}, + {"label":"'", "x":11.75, "y":3}, + {"label":"Enter", "x":12.75, "y":3, "w":2.25}, + {"label":"PgUp", "x":15, "y":2.6, "h":1.2}, + {"label":"LShift", "x":0, "y":4, "w":2.25}, + {"label":"Z", "x":2.25, "y":4}, + {"label":"X", "x":3.25, "y":4}, + {"label":"C", "x":4.25, "y":4}, + {"label":"V", "x":5.25, "y":4}, + {"label":"B", "x":6.25, "y":4}, + {"label":"N", "x":7.25, "y":4}, + {"label":"M", "x":8.25, "y":4}, + {"label":",", "x":9.25, "y":4}, + {"label":".", "x":10.25, "y":4}, + {"label":"/", "x":11.25, "y":4}, + {"label":"RShift", "x":12.25, "y":4, "w":1.75}, + {"label":"Up", "x":14, "y":4}, + {"label":"PgDn", "x":15, "y":3.8, "h":1.2}, + {"label":"LCtrl", "x":0, "y":5, "w":1.25}, + {"label":"LWin", "x":1.25, "y":5, "w":1.25}, + {"label":"LAlt", "x":2.5, "y":5, "w":1.25}, + {"label":"Space", "x":3.75, "y":5, "w":5.5}, + {"label":"RAlt", "x":9.25, "y":5, "w":1.25}, + {"label":"Fn", "x":10.5, "y":5, "w":1.25}, + {"label":"RCtrl", "x":11.75, "y":5, "w":1.25}, + {"label":"Left", "x":13, "y":5}, + {"label":"Down", "x":14, "y":5}, + {"label":"Right", "x":15, "y":5} + ] + } + } +} diff --git a/keyboards/handwired/ms_sculpt_mobile/keymaps/default/config.h b/keyboards/handwired/ms_sculpt_mobile/keymaps/default/config.h new file mode 100644 index 000000000..271f48d00 --- /dev/null +++ b/keyboards/handwired/ms_sculpt_mobile/keymaps/default/config.h @@ -0,0 +1,3 @@ +#pragma once + +// place overrides here diff --git a/keyboards/handwired/MS_sculpt_mobile/keymaps/default/keymap.c b/keyboards/handwired/ms_sculpt_mobile/keymaps/default/keymap.c similarity index 51% rename from keyboards/handwired/MS_sculpt_mobile/keymaps/default/keymap.c rename to keyboards/handwired/ms_sculpt_mobile/keymaps/default/keymap.c index a8802c99a..d4d0f33e9 100644 --- a/keyboards/handwired/MS_sculpt_mobile/keymaps/default/keymap.c +++ b/keyboards/handwired/ms_sculpt_mobile/keymaps/default/keymap.c @@ -1,7 +1,7 @@ -#include "../../MS_sculpt_mobile.h" +#include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -/* +/* * * |ESC | F1 | F2 | F3 | F4 | F5 | F6 | f7 | F8 | F9 | F10| F11| F12|Vol-|Vol+|Mute| * -------------------------------------------------------------------------------' @@ -10,42 +10,22 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | tab | q | w | e | r | t | y | u | i | o | p | [ | ] | \ | | * -------------------------------------------------------------------------------' * | caps | a | s | d | f | g | h | j | k | l | ; | ' | enter |PgUp| -* -------------------------------------------------------------------------------- +* -------------------------------------------------------------------------------- * |Lsft | z | x | c | v | b | n | m | , | . | / | Rsft| Up| PgDn| -* --------------------------------------------------------------------------------- +* --------------------------------------------------------------------------------- * |Lctl |Lgui |Lalt | Space |Ralt | FN | Rctl |Left|Down|Rght| -* --------------------------------------------------------------------------------- +* --------------------------------------------------------------------------------- */ -[0] = KEYMAP( \ - KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_VOLD, KC_VOLU, KC_MUTE,\ - KC_GRAVE, KC_1, KC_2, KC_3 ,KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQL, KC_BSPC, KC_DEL,\ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,\ - KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP,\ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN,\ - KC_LCTL, KC_LGUI, KC_LALT, KC_SPACE, KC_RALT, RSFT(KC_1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT -) - + [0] = LAYOUT( \ + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_VOLD, KC_VOLU, KC_MUTE, \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, RSFT(KC_1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT \ + ) }; -const uint16_t PROGMEM fn_actions[] = { - -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - // MACRODOWN only works in this function - switch(id) { - case 0: - if (record->event.pressed) { - register_code(KC_RSFT); - } else { - unregister_code(KC_RSFT); - } - break; - } - return MACRO_NONE; -}; - void matrix_init_user(void) { diff --git a/keyboards/handwired/ms_sculpt_mobile/keymaps/default/readme.md b/keyboards/handwired/ms_sculpt_mobile/keymaps/default/readme.md new file mode 100644 index 000000000..91575f7cd --- /dev/null +++ b/keyboards/handwired/ms_sculpt_mobile/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for Microsoft Sculpt Mobile diff --git a/keyboards/handwired/MS_sculpt_mobile/keymaps/default/rules.mk b/keyboards/handwired/ms_sculpt_mobile/keymaps/default/rules.mk similarity index 100% rename from keyboards/handwired/MS_sculpt_mobile/keymaps/default/rules.mk rename to keyboards/handwired/ms_sculpt_mobile/keymaps/default/rules.mk diff --git a/keyboards/handwired/MS_sculpt_mobile/keymaps/milestogo/config.h b/keyboards/handwired/ms_sculpt_mobile/keymaps/milestogo/config.h similarity index 73% rename from keyboards/handwired/MS_sculpt_mobile/keymaps/milestogo/config.h rename to keyboards/handwired/ms_sculpt_mobile/keymaps/milestogo/config.h index 5c04f647c..9d6be063e 100644 --- a/keyboards/handwired/MS_sculpt_mobile/keymaps/milestogo/config.h +++ b/keyboards/handwired/ms_sculpt_mobile/keymaps/milestogo/config.h @@ -1,23 +1,20 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../../MS_sculpt_mobile/config.h" +#pragma once #define USE_BABLPASTE -// Expect to get errors if you comment a feature out and leave it in your keymap. +// Expect to get errors if you comment a feature out and leave it in your keymap. #ifdef USE_BABLPASTE //define BabblePaste maps -// Windows. +// Windows. #define MAC_MODE 0 #define MS_MODE 1 //aka gnome+KDE -//#define LINUX_MODE 2 +//#define LINUX_MODE 2 //#define EMACS_MODE 3 #define VI_MODE 3 // Readline and tmux -#define READMUX_MODE 2 +#define READMUX_MODE 2 //#define WORDSTAR_MODE 5 #endif @@ -29,4 +26,3 @@ //#define BABL_NOBROWSER // place overrides here -#endif diff --git a/keyboards/handwired/MS_sculpt_mobile/keymaps/milestogo/keymap.c b/keyboards/handwired/ms_sculpt_mobile/keymaps/milestogo/keymap.c similarity index 97% rename from keyboards/handwired/MS_sculpt_mobile/keymaps/milestogo/keymap.c rename to keyboards/handwired/ms_sculpt_mobile/keymaps/milestogo/keymap.c index c9b16e75e..c5ed18797 100644 --- a/keyboards/handwired/MS_sculpt_mobile/keymaps/milestogo/keymap.c +++ b/keyboards/handwired/ms_sculpt_mobile/keymaps/milestogo/keymap.c @@ -1,11 +1,5 @@ -#include "../../../MS_sculpt_mobile/babblePaste.h" -#include "../../MS_sculpt_mobile.h" -#include "action_layer.h" -#include "action_util.h" - -#ifdef AUDIO_ENABLE - #include "audio.h" -#endif +#include "babblePaste.h" +#include QMK_KEYBOARD_H #define _QWR 0 #define _CDH 2 @@ -59,7 +53,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * --------------------------------------------------------------------------------- */ -[_QWR] = KEYMAP( \ +[_QWR] = LAYOUT( \ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_VOLD, KC_VOLU, CDH,\ KC_ESC, KC_1, KC_2, KC_3 ,KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQL, KC_BSPC, KC_DEL,\ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,\ @@ -68,7 +62,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LGUI, KC_LALT, KC_FN1, KC_RGUI,TT_SYM,KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT ), -[_CDH] = KEYMAP (\ +[_CDH] = LAYOUT(\ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, QWR, \ KC_ESC, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_B, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, ____, ____, ____,\ @@ -95,7 +89,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * --------------------------------------------------------------------------------- */ -[_SYM] = KEYMAP (\ +[_SYM] = LAYOUT(\ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ M(VIBRK), KC_CIRC, KC_LCBR, KC_RCBR,KC_AT, KC_PERC, ____, KC_LBRC,KC_LPRN,KC_RPRN,KC_UNDS, ____, ____, ____,\ @@ -118,7 +112,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * --------------------------------------------------------------------------------- */ -[_MOV] = KEYMAP (\ +[_MOV] = LAYOUT(\ ____, B_MAC,B_WIN,B_READ, B_VI, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ ____, ____, B_PAPP, B_NAPP, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ ____, B_UNDO, ____, B_BFND, ____, B_PTAB, B_DSOL, B_DLW, B_UP, B_DRW, B_DEOL, ____, ____, ____, \ @@ -127,7 +121,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ____, ____, ____, ____, ____, ____, ____, ____, ____, ____ ), -[_TRAN] = KEYMAP (\ +[_TRAN] = LAYOUT(\ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ diff --git a/keyboards/handwired/ms_sculpt_mobile/keymaps/milestogo/readme.md b/keyboards/handwired/ms_sculpt_mobile/keymaps/milestogo/readme.md new file mode 100644 index 000000000..3cb1380d1 --- /dev/null +++ b/keyboards/handwired/ms_sculpt_mobile/keymaps/milestogo/readme.md @@ -0,0 +1 @@ +# A more programmer oriented keymap for Microsoft Sculpt Mobile diff --git a/keyboards/handwired/MS_sculpt_mobile/keymaps/milestogo/rules.mk b/keyboards/handwired/ms_sculpt_mobile/keymaps/milestogo/rules.mk similarity index 100% rename from keyboards/handwired/MS_sculpt_mobile/keymaps/milestogo/rules.mk rename to keyboards/handwired/ms_sculpt_mobile/keymaps/milestogo/rules.mk diff --git a/keyboards/handwired/ms_sculpt_mobile/ms_sculpt_mobile.c b/keyboards/handwired/ms_sculpt_mobile/ms_sculpt_mobile.c new file mode 100644 index 000000000..53773e5d8 --- /dev/null +++ b/keyboards/handwired/ms_sculpt_mobile/ms_sculpt_mobile.c @@ -0,0 +1 @@ +#include "ms_sculpt_mobile.h" diff --git a/keyboards/handwired/MS_sculpt_mobile/MS_sculpt_mobile.h b/keyboards/handwired/ms_sculpt_mobile/ms_sculpt_mobile.h similarity index 98% rename from keyboards/handwired/MS_sculpt_mobile/MS_sculpt_mobile.h rename to keyboards/handwired/ms_sculpt_mobile/ms_sculpt_mobile.h index 1583dea6e..cfa07c92e 100644 --- a/keyboards/handwired/MS_sculpt_mobile/MS_sculpt_mobile.h +++ b/keyboards/handwired/ms_sculpt_mobile/ms_sculpt_mobile.h @@ -4,7 +4,7 @@ #include "quantum.h" -#define KEYMAP( \ +#define LAYOUT( \ k7Q, k6O, k6P, k6Q, k5O, k5P, k5Q, k7A, k7B, k7C, k7D, k7E, k7F, k1O, k1K, k1L, \ k5A, k5K, k5L, k5M, k5N, k5H, k5I, k2A, k2B, k2C, k2D, k5B, k5C, k5J, k2E, \ k6R, k6D, k6E, k6F, k7I, k7J, k4A, k4B, k4C, k4D, k3A, k3B, k3C, k3D, \ @@ -24,7 +24,7 @@ } -#define MATRIX_TESTING_KEYMAP( \ +#define MATRIX_TESTING_LAYOUT( \ k0A, k0B, k0C, k0D, k0E, k0F, k0G, k0H, k0I, k0, k0J, k0K, k0L, k0M, k0N, k0O, k0P, k0Q,\ k1A, k1B, k1C, k1D, k1E, k1F, k1G, k1H, k1I, k1, k1J, k1K, k1L, k1M, k1N, k1O, k1P, k1Q,\ k2A, k2B, k2C, k2D, k2E, k2F, k2G, k2H, k2I, k2, k2J, k2K, k2L, k2M, k2N, k2O, k2P, k2Q,\ diff --git a/keyboards/handwired/ms_sculpt_mobile/readme.md b/keyboards/handwired/ms_sculpt_mobile/readme.md new file mode 100644 index 000000000..98fd1f8d1 --- /dev/null +++ b/keyboards/handwired/ms_sculpt_mobile/readme.md @@ -0,0 +1,55 @@ +# Microsoft Sculpt Mobile + +This is a way to take a Microsoft ergonomic bluetooth keyboard, and make it +into a hard-wired keyboard running QMK. + +The keyboard is known under several different names: +Mobile Bluetooth 5000, Mobile 6000, Sculpt mobile, and Asus rebranded. + +I had a stack of them, since they're cheap on ebay, travel well, and are just ergo enough. + +The ribbon cable is 1mm pitch, which is hard to hand solder. I bought a cheap set of +"pitch adapter" boards https://www.amazon.com/Double-Sided-0-4mm-1-0-Adapter-60mmx38mm/dp/B00OK42118 + +Cut the original ribbon cable sockets off the bluetooth board using a razor, they're hard to desolder. +They're also allow the cable to be inserted on top or bottom. + +If I was going to do it again, I'd make the MCU connection come out the top of the keyboard +and avoid the wires dangling out the bottom. + +As I was debugging the matrix, I started to get random failures. In desparation I tried a second MCU, +but had the same problems. It turns out that the ribbon cable connections can get worn. Shave a +half millimeter off the end of the ribbon cable & the errors go away. + +My method for discovering the matrix was to set up a LAYOUT macro that included all pins. +See MATRIX_TESTING_LAYOUT if you need it. Then set up a keymap that has all printable symbols +in the first 4 rows. test each key & record output. Then switch the printable symbols to the +bottom 4 rows & repeat. This was enough to show the matrix. + + +The full original keymap for the Sculpt is + +| | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | +|:-:|:--:|:--:|:--:|:---:|:---:|:---:|:----:|:----:|:----:|:-----:|:----:|:------:|:----:|:-----:|:----:|:------:|:----:|:---:| +| 0 | b | n | m | , | . | / | | | | Caps | | | | | | | | Fn | +| 1 | g | h | " | | | | | | | | Vol+ | Mute | RCtl | | Vol- | PgDn | LCtl | | +| 2 | 7 | 8 | 9 | 0 | Del | | PgUp | | | | | RShift | | | | LShift | | | +| 3 | p | [ | ] | \ | | | | | | | RAlt | | | | LAlt | | | | +| 4 | y | u | i | o | | | | | | | | | | LGUI | | | | | +| 5 | ~ | - | += | j | k | l | ; | 5 | 6 | Bksp | 1 | 2 | 3 | 4 | F4 | F5 | F6 | | +| 6 | a | s | d | q | w | e | Up | Left | Down | Right | | | | Space | F1 | F2 | F3 | Tab | +| 7 | F7 | F8 | F9 | F10 | F11 | F12 | | f | r | t | z | x | c | | v | Enter | Esc | | + +This works with 18 cols + 8 rows on a Teensy++, or ARM-based Teensy. + +The Astar mini has all pins exposed , so you can do 18x8 +If you want a speaker, LEDs, etc., you'll need to free up a pin. I recommend joining columns +R and L to the same pin. + +Building - add ASTAR=1 to the compile line or leave out for teensy2++ + +Make example for this keyboard (after setting up your build environment): + + make handwired/ms_sculpt_mobile:default + +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). diff --git a/keyboards/handwired/MS_sculpt_mobile/rules.mk b/keyboards/handwired/ms_sculpt_mobile/rules.mk similarity index 100% rename from keyboards/handwired/MS_sculpt_mobile/rules.mk rename to keyboards/handwired/ms_sculpt_mobile/rules.mk From 6d78d45ca1ebf6ab78dc66274ce1f04e45a7c01a Mon Sep 17 00:00:00 2001 From: ajp10304 Date: Sat, 8 Dec 2018 00:49:33 +0000 Subject: [PATCH 643/788] AJP10304 Planck layout, add LAYOUT_planck_grid (#4575) --- keyboards/planck/keymaps/ajp10304/keymap.c | 149 ++++++++++---------- keyboards/planck/keymaps/ajp10304/readme.md | 4 + 2 files changed, 76 insertions(+), 77 deletions(-) diff --git a/keyboards/planck/keymaps/ajp10304/keymap.c b/keyboards/planck/keymaps/ajp10304/keymap.c index ebc4e0b97..49346f7b9 100644 --- a/keyboards/planck/keymaps/ajp10304/keymap.c +++ b/keyboards/planck/keymaps/ajp10304/keymap.c @@ -1,4 +1,3 @@ -#pragma message "You may need to add LAYOUT_planck_grid to your keymap layers - see default for an example" #include "planck.h" #include "action_layer.h" #include "eeconfig.h" @@ -38,10 +37,6 @@ enum planck_keycodes { #include "dynamic_macro.h" -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Qwerty @@ -55,12 +50,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Fn | Ctrl | Alt | GUI |Lower | Bksp |Space |Raise | Shift| MENU | Ctrl | Fn2 | * `-----------------------------------------------------------------------------------' */ -[_QWERTY] = { - {KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC }, - {MT(MOD_LSFT, KC_TAB), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, MT(MOD_RSFT, KC_ENT) }, - {KC_LSHIFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSHIFT }, - {MO(_FUNC), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_BSPC, KC_SPC, RAISE, KC_LSHIFT, KC_BTN2, KC_RCTL, MO(_FUNC2) } -}, +[_QWERTY] = LAYOUT_planck_grid( + KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + MT(MOD_LSFT, KC_TAB), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, MT(MOD_RSFT, KC_ENT), + KC_LSHIFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSHIFT, + MO(_FUNC), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_BSPC, KC_SPC, RAISE, KC_LSHIFT, KC_BTN2, KC_RCTL, MO(_FUNC2) +), /* Function * ,-----------------------------------------------------------------------------------. @@ -73,12 +68,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Fn | Ctrl | Alt | GUI |Lower | Bksp |Space |Mouse | MENU | Alt | Ctrl | Fn | * `-----------------------------------------------------------------------------------' */ -[_FUNC] = { - {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12 }, - {KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, UK_TILD, KC_INSERT }, - {KC_LSHIFT, KC_NONUS_BSLASH, KC_GRAVE, KC_NONUS_HASH, KC_PAST, KC_MINS, KC_EQL, KC_BSLASH, KC_LBRC, KC_RBRC, KC_QUOT, MT(MOD_RSFT, KC_ENT) }, - {_______, _______, _______, _______, _______, _______, _______, MO(_MOUSE), _______, _______, _______, _______ } -}, +[_FUNC] = LAYOUT_planck_grid( + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, + KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, UK_TILD, KC_INSERT, + KC_LSHIFT, KC_NONUS_BSLASH, KC_GRAVE, KC_NONUS_HASH, KC_PAST, KC_MINS, KC_EQL, KC_BSLASH, KC_LBRC, KC_RBRC, KC_QUOT, MT(MOD_RSFT, KC_ENT), + _______, _______, _______, _______, _______, _______, _______, MO(_MOUSE), _______, _______, _______, _______ +), /* Lower * ,-----------------------------------------------------------------------------------. @@ -91,12 +86,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | |Lower | Del |Space | | Next | Vol- | Vol+ | Play | * `-----------------------------------------------------------------------------------' */ -[_LOWER] = { - {KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, KC_BSPC }, - {LSFT(KC_1), LSFT(KC_2), LSFT(KC_3), LSFT(KC_4), LSFT(KC_5), LSFT(KC_6), LSFT(KC_7), LSFT(KC_8), LSFT(KC_9), LSFT(KC_0), LCTL(KC_DEL), LCTL(KC_BSPC) }, - {KC_LSPO, KC_NONUS_BSLASH, KC_GRAVE, KC_NONUS_HASH, KC_QUOT, KC_MINS, KC_EQL, KC_NONUS_HASH, KC_LBRC, KC_RBRC, KC_QUOT, MT(MOD_RSFT, KC_ENT) }, - {_______, _______, _______, _______, _______, KC_DEL, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY } -}, +[_LOWER] = LAYOUT_planck_grid( + KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, KC_BSPC, + LSFT(KC_1), LSFT(KC_2), LSFT(KC_3), LSFT(KC_4), LSFT(KC_5), LSFT(KC_6), LSFT(KC_7), LSFT(KC_8), LSFT(KC_9), LSFT(KC_0), LCTL(KC_DEL), LCTL(KC_BSPC), + KC_LSPO, KC_NONUS_BSLASH, KC_GRAVE, KC_NONUS_HASH, KC_QUOT, KC_MINS, KC_EQL, KC_NONUS_HASH, KC_LBRC, KC_RBRC, KC_QUOT, MT(MOD_RSFT, KC_ENT), + _______, _______, _______, _______, _______, KC_DEL, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY +), /* Raise * ,-----------------------------------------------------------------------------------. @@ -109,12 +104,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Mouse| | | | | Alt | Enter|Raise | | | | | * `-----------------------------------------------------------------------------------' */ -[_RAISE] = { - {KC_GRV, XXXXXXX, M(1), KC_LBRC, KC_RBRC, XXXXXXX, XXXXXXX, KC_PGUP, KC_HOME, KC_PGDOWN, XXXXXXX, KC_PSCREEN }, - {KC_GRV, XXXXXXX, XXXXXXX, LSFT(KC_9), LSFT(KC_0), XXXXXXX, XXXXXXX, KC_HOME, KC_UP, KC_END, XXXXXXX, LCTL(LSFT(KC_EQL)) }, - {_______, XXXXXXX, XXXXXXX, LSFT(KC_LBRC), LSFT(KC_RBRC), XXXXXXX, LCTL(KC_LEFT), KC_LEFT, KC_DOWN, KC_RIGHT, LCTL(KC_RIGHT), LCTL(KC_MINS) }, - {MO(_MOUSE), _______, _______, _______, _______, KC_LALT, KC_ENT, _______, XXXXXXX, _______, _______, _______ } -}, +[_RAISE] = LAYOUT_planck_grid( + KC_GRV, XXXXXXX, M(1), KC_LBRC, KC_RBRC, XXXXXXX, XXXXXXX, KC_PGUP, KC_HOME, KC_PGDOWN, XXXXXXX, KC_PSCREEN, + KC_GRV, XXXXXXX, XXXXXXX, LSFT(KC_9), LSFT(KC_0), XXXXXXX, XXXXXXX, KC_HOME, KC_UP, KC_END, XXXXXXX, LCTL(LSFT(KC_EQL)), + _______, XXXXXXX, XXXXXXX, LSFT(KC_LBRC), LSFT(KC_RBRC), XXXXXXX, LCTL(KC_LEFT), KC_LEFT, KC_DOWN, KC_RIGHT, LCTL(KC_RIGHT), LCTL(KC_MINS), + MO(_MOUSE), _______, _______, _______, _______, KC_LALT, KC_ENT, _______, XXXXXXX, _______, _______, _______ +), /* Adjust (Lower + Raise) * ,-----------------------------------------------------------------------------------. @@ -127,12 +122,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | | | * `-----------------------------------------------------------------------------------' */ -[_ADJUST] = { - {M(0), RESET, QWERTY, _______, _______, DYN_REC_START1, DYN_REC_START2, _______, _______, _______, _______, KC_DEL }, - {KC_CAPS, _______, _______, _______, _______, DYN_MACRO_PLAY1, DYN_MACRO_PLAY2, KC_AUDIO_MUTE, KC_AUDIO_VOL_UP, KC_MEDIA_PLAY_PAUSE, _______, _______ }, - {TG(_MAC), _______, _______, _______, _______, DYN_REC_STOP, DYN_REC_STOP, KC_MEDIA_PREV_TRACK, KC_AUDIO_VOL_DOWN, KC_MEDIA_NEXT_TRACK, _______, _______ }, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ } -}, +[_ADJUST] = LAYOUT_planck_grid( + M(0), RESET, QWERTY, _______, _______, DYN_REC_START1, DYN_REC_START2, _______, _______, _______, _______, KC_DEL, + KC_CAPS, _______, _______, _______, _______, DYN_MACRO_PLAY1, DYN_MACRO_PLAY2, KC_AUDIO_MUTE, KC_AUDIO_VOL_UP, KC_MEDIA_PLAY_PAUSE, _______, _______, + TG(_MAC), _______, _______, _______, _______, DYN_REC_STOP, DYN_REC_STOP, KC_MEDIA_PREV_TRACK, KC_AUDIO_VOL_DOWN, KC_MEDIA_NEXT_TRACK, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), /* Mouse * ,-----------------------------------------------------------------------------------. @@ -145,12 +140,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | | | | * `-----------------------------------------------------------------------------------' */ -[_MOUSE] = { - {KC_ESC , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, - {KC_MS_ACCEL0, KC_MS_ACCEL1, KC_MS_ACCEL2, _______, _______, _______, _______, KC_MS_BTN1, KC_MS_UP, KC_MS_BTN2, _______, _______ }, - {KC_MS_ACCEL0, KC_MS_ACCEL1, KC_MS_ACCEL2, _______, _______, _______, _______, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, _______, _______ }, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ } -}, +[_MOUSE] = LAYOUT_planck_grid( + KC_ESC , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + KC_MS_ACCEL0, KC_MS_ACCEL1, KC_MS_ACCEL2, _______, _______, _______, _______, KC_MS_BTN1, KC_MS_UP, KC_MS_BTN2, _______, _______, + KC_MS_ACCEL0, KC_MS_ACCEL1, KC_MS_ACCEL2, _______, _______, _______, _______, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), /* Function 2 (Right hand side) * ,-----------------------------------------------------------------------------------. @@ -163,47 +158,47 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | | | | * `-----------------------------------------------------------------------------------' */ -[_FUNC2] = { - {_______, _______, M(1), _______, _______, _______, M(5), _______, _______, _______, _______, _______}, - {_______, _______, M(3), M(7), _______, _______, _______, M(10), _______, _______, _______, _______}, - {_______, LCTL(KC_Z), LCTL(KC_X), LCTL(KC_C), LCTL(KC_V), _______, _______, _______, _______, _______, _______, M(98) }, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} -}, +[_FUNC2] = LAYOUT_planck_grid( + _______, _______, M(1), _______, _______, _______, M(5), _______, _______, _______, _______, _______, + _______, _______, M(3), M(7), _______, _______, _______, M(10), _______, _______, _______, _______, + _______, LCTL(KC_Z), LCTL(KC_X), LCTL(KC_C), LCTL(KC_V), _______, _______, _______, _______, _______, _______, M(98) , + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), -[_MAC] = { - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, - {MFNC, _______, _______, _______, MLWR, _______, _______, MRSE, _______, _______, _______, MFNC2 } -}, +[_MAC] = LAYOUT_planck_grid( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + MFNC, _______, _______, _______, MLWR, _______, _______, MRSE, _______, _______, _______, MFNC2 +), -[_MLWR] = { - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} -}, +[_MLWR] = LAYOUT_planck_grid( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), -[_MRSE] = { - {_______, _______, M(2), _______, _______, _______, _______, _______, _______, _______, _______, _______ }, - {_______, _______, _______, _______, _______, _______, _______, LCTL(KC_A), _______, LCTL(KC_E), _______, LGUI(KC_EQL) }, - {_______, _______, _______, _______, _______, _______, LALT(KC_LEFT), _______, _______, _______, LALT(KC_RIGHT), LGUI(KC_MINS) }, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ } -}, +[_MRSE] = LAYOUT_planck_grid( + _______, _______, M(2), _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, LCTL(KC_A), _______, LCTL(KC_E), _______, LGUI(KC_EQL), + _______, _______, _______, _______, _______, _______, LALT(KC_LEFT), _______, _______, _______, LALT(KC_RIGHT), LGUI(KC_MINS), + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), -[_MFNC]= { - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, LGUI(KC_PENT) }, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ } -}, +[_MFNC]= LAYOUT_planck_grid( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, LGUI(KC_PENT), + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), -[_MFNC2] = { - {_______, _______, M(2), _______, _______, _______, M(6), _______, _______, _______, _______, _______}, - {_______, _______, M(4), M(8), _______, _______, _______, M(10), _______, _______, _______, _______}, - {_______, LGUI(KC_Z), LGUI(KC_X), LGUI(KC_C), LGUI(KC_V), _______, _______, _______, _______, _______, _______, M(99) }, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, -}, +[_MFNC2] = LAYOUT_planck_grid( + _______, _______, M(2), _______, _______, _______, M(6), _______, _______, _______, _______, _______, + _______, _______, M(4), M(8), _______, _______, _______, M(10), _______, _______, _______, _______, + _______, LGUI(KC_Z), LGUI(KC_X), LGUI(KC_C), LGUI(KC_V), _______, _______, _______, _______, _______, _______, M(99) , + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +) }; diff --git a/keyboards/planck/keymaps/ajp10304/readme.md b/keyboards/planck/keymaps/ajp10304/readme.md index 978f5a19e..6573266db 100644 --- a/keyboards/planck/keymaps/ajp10304/readme.md +++ b/keyboards/planck/keymaps/ajp10304/readme.md @@ -6,6 +6,10 @@ the second is the output when shift is applied. **Note:** The below tables assume a UK layout. +####Flashing +Rev <=5: sudo make planck:ajp10304:dfu +Rev 6: sudo make planck/rev6:ajp10304:dfu-util + ##### Main Qwerty Layer * Tab: when held, operates as shift. From 3e698a54ea22b12512c9e4f676f7d7363c35832f Mon Sep 17 00:00:00 2001 From: Vyolle <44031868+Vyolle@users.noreply.github.com> Date: Fri, 7 Dec 2018 18:50:43 -0600 Subject: [PATCH 644/788] Removed mousekeys. Added Levinson Steno keymap. (#4574) * Changed location of mouse 3, and arrow keys * Removed MouseKeys. Added Levinson Layout --- keyboards/iris/keymaps/vyolle/keymap.c | 18 +-- keyboards/levinson/keymaps/steno/config.h | 34 +++++ keyboards/levinson/keymaps/steno/keymap.c | 148 ++++++++++++++++++++++ keyboards/levinson/keymaps/steno/rules.mk | 7 + 4 files changed, 198 insertions(+), 9 deletions(-) create mode 100644 keyboards/levinson/keymaps/steno/config.h create mode 100644 keyboards/levinson/keymaps/steno/keymap.c create mode 100644 keyboards/levinson/keymaps/steno/rules.mk diff --git a/keyboards/iris/keymaps/vyolle/keymap.c b/keyboards/iris/keymaps/vyolle/keymap.c index 2479f0892..33e171821 100644 --- a/keyboards/iris/keymaps/vyolle/keymap.c +++ b/keyboards/iris/keymaps/vyolle/keymap.c @@ -32,29 +32,29 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_LOWER] = LAYOUT( //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ - KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, XXXXXXX, KC_ACL0, KC_ACL1, KC_ACL2, XXXXXXX, XXXXXXX, + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, _______, KC_7, KC_8, KC_9, KC_PLUS, _______, //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ - KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSLS, KC_4, KC_5, KC_6, KC_MINUS, _______, //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ - KC_VOLU, KC_HOME, KC_LEFT, KC_UP, KC_RGHT, KC_PGUP, KC_WH_U, KC_MS_L, KC_MS_U, KC_MS_R, XXXXXXX, KC_BTN4, + KC_VOLU, KC_HOME, KC_LEFT, KC_UP, KC_RGHT, KC_PGUP, KC_PAST, KC_1, KC_2, KC_3, KC_EQL, _______, //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ - KC_VOLD, KC_END, KC_INS, KC_DOWN, KC_DEL, KC_PGDN, KC_MUTE, XXXXXXX, KC_WH_D, KC_WH_L, KC_MS_D, KC_WH_R, KC_BTN3, KC_BTN5, + KC_VOLD, KC_END, KC_INS, KC_DOWN, KC_DEL, KC_PGDN, KC_MUTE, _______, _______, KC_0, KC_COMM, KC_DOT, KC_ENT, _______, //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ - _______, _______, _______, KC_BTN1, KC_BTN2, _______ + _______, _______, _______, _______, _______, _______ // └────────┴────────┴────────┘ └────────┴────────┴────────┘ ), [_RAISE] = LAYOUT( //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ - KC_GRAVE,_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______,_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ - KC_TILD, KC_PIPE, KC_LT, KC_GT, _______, _______, _______, _______, _______, _______, _______, _______, + KC_GRAVE, KC_TILD, KC_UNDS, KC_EQL, KC_PIPE, _______, _______, _______, _______, _______, _______, _______, //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ KC_BSLASH,KC_LCBR, KC_RCBR, KC_MINUS, KC_LBRC, KC_RBRC, _______, KC_LEFT, KC_UP, KC_RGHT, _______, _______, //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ - KC_COLN, KC_UNDS, KC_LPRN, KC_PLUS, KC_RPRN, KC_EQL, KC_UNDO, _______, _______, _______, KC_DOWN, _______, _______, _______, + KC_COLN, KC_LT, KC_GT, KC_PLUS, KC_LPRN, KC_RPRN, _______, _______, _______, _______, KC_DOWN, _______, _______, _______, //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ - KC_CUT, KC_COPY, KC_PSTE, _______, _______, _______ + _______, _______, _______, _______, _______, _______ // └────────┴────────┴────────┘ └────────┴────────┴────────┘ ), diff --git a/keyboards/levinson/keymaps/steno/config.h b/keyboards/levinson/keymaps/steno/config.h new file mode 100644 index 000000000..9cbc148e4 --- /dev/null +++ b/keyboards/levinson/keymaps/steno/config.h @@ -0,0 +1,34 @@ +/* +Copyright 2017 Danny Nguyen + +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 . +*/ + +#pragma once + +/* Use I2C or Serial, not both */ + +#define USE_I2C +// #define USE_SERIAL + + +#define FORCE_NKRO //For Steno. + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + + diff --git a/keyboards/levinson/keymaps/steno/keymap.c b/keyboards/levinson/keymaps/steno/keymap.c new file mode 100644 index 000000000..f997b4de1 --- /dev/null +++ b/keyboards/levinson/keymaps/steno/keymap.c @@ -0,0 +1,148 @@ +#include QMK_KEYBOARD_H +#include "keymap_steno.h" + +extern keymap_config_t keymap_config; + +#define _PLOVER 0 +#define _QWERTY 1 +#define _LOWER 2 +#define _RAISE 3 +#define _ADJUST 4 + +enum custom_keycodes +{ + PLOVER = SAFE_RANGE, + QWERTY, + LOWER, + RAISE, + ADJUST, + EXT_QWE, +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = +{ + + [_PLOVER] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + STN_PWR, STN_S1, STN_TL, STN_PL, STN_HL, STN_ST1, STN_ST3, STN_FR, STN_PR, STN_LR, STN_TR, STN_DR, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + STN_FN, STN_S2, STN_KL, STN_WL, STN_RL, STN_ST2, STN_ST4, STN_RR, STN_BR, STN_GR, STN_SR, STN_ZR, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + STN_N1, STN_N2, STN_N3, STN_N4, STN_N5, STN_N6, STN_N7, STN_N8, STN_N9, STN_NA, STN_NB, STN_NC, + //├────────┼────────┼────────┼────────┼────────┼────────┼ ┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX, STN_RE1, STN_RE2, XXXXXXX, STN_A, STN_O, STN_E, STN_U, XXXXXXX, XXXXXXX, QWERTY, XXXXXXX + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴ ┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + + ), + + [_QWERTY] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_P, KC_QUOT, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + //├────────┼────────┼────────┼────────┼────────┼────────┼ ┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_LGUI, KC_Z, KC_LALT, KC_LCTL, LOWER, KC_SPC, KC_ENT, RAISE, KC_RCTL, KC_RALT, EXT_QWE, KC_RGUI + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴ ┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + + ), + + [_LOWER] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, _______, KC_7, KC_8, KC_9, KC_PLUS, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + KC_F7, KC_F8, KC_LEFT, KC_UP, KC_RGHT, KC_F9, KC_PSLS, KC_4, KC_5, KC_6, KC_MINUS, KC_MUTE, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + _______, KC_F10, KC_F11, KC_DOWN, KC_F11, KC_F12, KC_PAST, KC_1, KC_2, KC_3, KC_EQL, KC_VOLU, + //├────────┼────────┼────────┼────────┼────────┼────────┼ ┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______, _______, _______, _______, _______, _______, KC_0, _______, KC_COMM, KC_DOT, KC_ENT, KC_VOLD + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴ ┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + + ), + + [_RAISE] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_GRAVE, KC_TILD, KC_UNDS, KC_EQL, KC_PIPE, _______, KC_HOME, KC_DEL, _______, KC_INS, KC_PGUP, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + KC_BSLASH,KC_LCBR, KC_RCBR, KC_MINUS, KC_LBRC, KC_RBRC, KC_END, KC_LEFT, KC_UP, KC_RGHT, KC_PGDN, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + KC_COLN, KC_LT, KC_GT, KC_PLUS, KC_LPRN, KC_RPRN, _______, _______, KC_DOWN, _______, _______, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┼ ┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴ ┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + + ), + + [_ADJUST] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_GRV, KC_HOME, KC_LBRC, KC_RBRC, KC_PIPE, KC_APP, KC_SLCK, _______, _______, _______, _______, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + KC_PSCR, KC_END, KC_LCBR, KC_RCBR, KC_PLUS, KC_EQL, KC_PAUS, _______, _______, _______, _______, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + _______, _______, _______, KC_BSLS, KC_MINS, KC_UNDS, _______, _______, _______, _______, _______, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┼ ┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴ ┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + + ), + + +}; + + +void matrix_init_user() { + steno_set_mode(STENO_MODE_GEMINI); // or STENO_MODE_BOLT +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case PLOVER: + if (record->event.pressed) { + set_single_persistent_default_layer(_PLOVER); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + break; + case QWERTY: + if (!record->event.pressed) { + layer_on(_QWERTY); + } + return false; + break; + case EXT_QWE: + if (record->event.pressed) { + layer_off(_QWERTY); + } + return false; + break; + } + return true; +} diff --git a/keyboards/levinson/keymaps/steno/rules.mk b/keyboards/levinson/keymaps/steno/rules.mk new file mode 100644 index 000000000..9c31e590e --- /dev/null +++ b/keyboards/levinson/keymaps/steno/rules.mk @@ -0,0 +1,7 @@ +EXTRAKEY_ENABLE = no # Disable if you run out of usb endpoints. Media keys need this to work. +MOUSEKEY_ENABLE = no # Mouse keys(+4700) Uses extra usb enpoints. +STENO_ENABLE = yes # Additional protocols for Stenography(+1700), requires VIRTSER. +AUDIO_ENABLE = no # Audio output on port C6 +MIDI_ENABLE = no # MIDI controls +NKRO_ENABLE = yes +BOOTMAGIC_ENABLE = yes From 2ad2b73d685cf25268fa7d3726f45594edee70c4 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 7 Dec 2018 16:51:27 -0800 Subject: [PATCH 645/788] Add support for PR and Issue templates to QMK_firmware GitHub (#4494) * Add support document * Add Bug Report * Add GitHub Pull Request Template * Feature request issue template * Touch up feature request template * Add 'other issues' template * move support doc * Minor tweaks * More minor tweaks * Spleeling fix Co-Authored-By: drashna * CapiTALization fIXes Co-Authored-By: drashna * Use new issue URL Co-Authored-By: drashna * Add blanck issue template * Update the PR template * Formatting and additional changes * Update docs/support.md Co-Authored-By: drashna --- .github/ISSUE_TEMPLATE/blank.md | 5 +++ .github/ISSUE_TEMPLATE/bug_report.md | 31 ++++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 19 ++++++++++ .github/ISSUE_TEMPLATE/other_issues.md | 9 +++++ .github/PULL_REQUEST_TEMPLATE.md | 32 +++++++++++++++++ docs/_sidebar.md | 1 + docs/_summary.md | 1 + docs/support.md | 43 +++++++++++++++++++++++ 8 files changed, 141 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/blank.md create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/ISSUE_TEMPLATE/other_issues.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 docs/support.md diff --git a/.github/ISSUE_TEMPLATE/blank.md b/.github/ISSUE_TEMPLATE/blank.md new file mode 100644 index 000000000..50a32034d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/blank.md @@ -0,0 +1,5 @@ +--- +name: Blank issue +about: If you're 100% sure that you don't need one of the other issue templates, use this one instead. + +--- diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 000000000..a4f90389b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,31 @@ +--- +name: Bug report +about: Create a report to help us improve the QMK Firmware +--- + + + + + +**Describe the bug** + + + +**System Information** + - Keyboard: + - Revision (if applicable): + - Operating System: + - avr-gcc version: + + - arm gcc version: + + - QMK Firmware version: + + - Any keyboard related software installed? + - [ ] Auto Hot Key + - [ ] Karabiner + - [ ] Other + +**Additional context** + + diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 000000000..c9198adff --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,19 @@ +--- +name: Feature request +about: Suggest a new feature or changes to existing features +--- + + + + + +## Feature Request Type + +- [ ] Core Functionality +- [ ] Add-on hardware support (e.g. audio, RGB, OLED screen, etc.) +- [ ] Alteration (enhancement/optimization) of existing Feature(s) +- [ ] New behavior + +## Description + + diff --git a/.github/ISSUE_TEMPLATE/other_issues.md b/.github/ISSUE_TEMPLATE/other_issues.md new file mode 100644 index 000000000..5f3e986cc --- /dev/null +++ b/.github/ISSUE_TEMPLATE/other_issues.md @@ -0,0 +1,9 @@ +--- +name: Other issues +about: Anything else that doesn't fall into the above categories. +--- + + + + + diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000..05223aa4f --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,32 @@ + + + + + +## Description + + +## Types of changes + +- [ ] Core +- [ ] Bugfix +- [ ] New Feature +- [ ] Enhancement/Optimization +- [ ] Keyboard (addition or update) +- [ ] Keymap/Layout/Userspace (addition or update) +- [ ] Documentation + + +## Issues Fixed or Closed by this PR + +* + +## Checklist: + + +- [ ] My code follows the code style of this project. +- [ ] My change requires a change to the documentation. +- [ ] I have updated the documentation accordingly. +- [ ] I have read the **CONTRIBUTING** document. (https://docs.qmk.fm/#/contributing) +- [ ] I have added tests to cover my changes. +- [ ] I have tested the changes and verified that they work and don't break anything (as well as I can manage). diff --git a/docs/_sidebar.md b/docs/_sidebar.md index 6338d6912..b209c5e0b 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -88,6 +88,7 @@ * Other Topics * [Using Eclipse with QMK](eclipse.md) + * [Support](support.md) * QMK Internals (In Progress) * [Defines](internals_defines.md) diff --git a/docs/_summary.md b/docs/_summary.md index 6338d6912..b209c5e0b 100644 --- a/docs/_summary.md +++ b/docs/_summary.md @@ -88,6 +88,7 @@ * Other Topics * [Using Eclipse with QMK](eclipse.md) + * [Support](support.md) * QMK Internals (In Progress) * [Defines](internals_defines.md) diff --git a/docs/support.md b/docs/support.md new file mode 100644 index 000000000..5c275b07e --- /dev/null +++ b/docs/support.md @@ -0,0 +1,43 @@ +# Support + +If you need help with something, the best place to get quick support is going to be on our [Discord Server](https://discord.gg/Uq7gcHh). There is usually somebody online, and there are a bunch of very helpful people there. + +Don't forget to read our [Code of Conduct](https://qmk.fm/coc/). + +## Help! I don't know where to start! + +If this is the case, then you should start with our [Newbs Guide](https://docs.qmk.fm/#/newbs). There is a lot of great info there, and that should cover everything you need to get started. + +If that's an issue, hop onto the [QMK Configurator](https://config.qmk.fm), as that will handle a majority of what you need there. + +## Help! I'm having issues flashing! + +First, head to the [Compiling/Flashing FAQ Page](https://docs.qmk.fm/#/faq_build). There is a good deal of info there, and you'll find a bunch of solutions to common issues there. + +## Help, I have an issue that isn't covered by the links above + +Okay, that's fine. Then please check the [open issues in our GitHub](https://github.com/qmk/qmk_firmware/issues) to see if somebody is experiencing the same thing (make sure it's not just similar, but actually the same). + +If you can't find anything, then please open a [new issue](https://github.com/qmk/qmk_firmware/issues/new)! + +## What if I found a bug? + +Then please open an [issue](https://github.com/qmk/qmk_firmware/issues/new), and if you know how to fix it, open up a Pull Request on GitHub with the fix. + +## But `git` and `GitHub` are intimidating! + +Don't worry, we have some pretty nice [Guidelines](https://docs.qmk.fm/#/newbs_best_practices) on how to start using `git` and GitHub to make things easier to develop. + +Additionally, you can find additional `git` and GitHub related links [here](https://docs.qmk.fm/#/newbs_learn_more_resources). + +## I have a Keyboard that I want to add support for + +Awesome! Open up a Pull Request for it. We'll review the code, and merge it! + +### What if I want to do brand it with `QMK`? + +That's amazing! We would love to assist you with that! + +In fact, we have a [whole page](https://qmk.fm/powered/) dedicated to adding QMK Branding to your page and keyboard. This covers pretty much everything you need (knowledge and images) to officially support QMK. + +If you have any questions about this, open an issue or head to [Discord](https://discord.gg/Uq7gcHh). From 13ad6501361faa9433562dba4ea8c55f85bf1dc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20=C4=90or=C4=91evi=C4=87?= Date: Sat, 8 Dec 2018 18:42:46 +0100 Subject: [PATCH 646/788] Add a better Docker build script + update Dockerfile (#4222) * Add a Docker build script * Add usage and error messages * Add -r to reads Thanks mechmerlin * Add keyboard:keymap form, improve script * Add target argument, change usage forms in script * Add check for more than 3 args in keyboard:keymap:target form * Change Docker base image to debian, use community repo This matches what qmk_compiler uses (https://github.com/qmk/qmk_compiler/blob/master/Dockerfile#L1). I've removed the maintainer as we now have a community build on Docker Hub (https://hub.docker.com/r/qmkfm/qmk_firmware). This Dockerfile will also be maintained by the community. * Change build command format to keyboard:keymap * Call make directly in container run command * Simplify script, remove 3-arg form * Add COPY to Dockerfile so images are usable in and of themselves Also change WORKDIR from /qmk to /qmk_firmware * Add USB pass-through for Linux and docker-machine hosts * Read directly into variables instead of array * Alphabetically sort dependencies in Dockerfile * Set executable bit on util/docker_build.sh * Update Docker docs * Add warning about Docker on Windows * Expand comment in docs * Check docker-machine exit code instead of string * Only match --help with whole arguments * Make script POSIX-compliant * Convert script indentation to tabs --- Dockerfile | 41 ++++++++++++------------ docs/getting_started_build_tools.md | 25 ++++++++------- util/docker_build.sh | 49 +++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+), 31 deletions(-) create mode 100755 util/docker_build.sh diff --git a/Dockerfile b/Dockerfile index dfde33b5c..8f78dc2bf 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,28 +1,29 @@ -FROM debian:jessie -MAINTAINER Erik Dasque +FROM debian -RUN apt-get update && apt-get install --no-install-recommends -y build-essential \ +RUN apt-get update && apt-get install --no-install-recommends -y \ + avr-libc \ + avrdude \ + binutils-arm-none-eabi \ + binutils-avr \ + build-essential \ + dfu-programmer \ + dfu-util \ gcc \ + gcc-arm-none-eabi \ + gcc-avr \ + git \ + libnewlib-arm-none-eabi \ + software-properties-common \ unzip \ wget \ zip \ - gcc-avr \ - binutils-avr \ - avr-libc \ - dfu-programmer \ - dfu-util \ - gcc-arm-none-eabi \ - binutils-arm-none-eabi \ - libnewlib-arm-none-eabi \ - git \ - software-properties-common \ - avrdude \ && rm -rf /var/lib/apt/lists/* -ENV keyboard=ergodox -ENV subproject=ez -ENV keymap=default +ENV KEYBOARD=ergodox_ez +ENV KEYMAP=default -VOLUME /qmk -WORKDIR /qmk -CMD make clean ; make keyboard=${keyboard} subproject=${subproject} keymap=${keymap} +VOLUME /qmk_firmware +WORKDIR /qmk_firmware +COPY . . + +CMD make $KEYBOARD:$KEYMAP diff --git a/docs/getting_started_build_tools.md b/docs/getting_started_build_tools.md index 67bbe5434..375e9d108 100644 --- a/docs/getting_started_build_tools.md +++ b/docs/getting_started_build_tools.md @@ -123,24 +123,27 @@ If you have trouble and want to ask for help, it is useful to generate a *Win_Ch ## Docker -If this is a bit complex for you, Docker might be the turn-key solution you need. After installing [Docker](https://www.docker.com/products/docker), run the following command at the root of the QMK folder to build a keyboard/keymap: - +If this is a bit complex for you, Docker might be the turn-key solution you need. After installing [Docker CE](https://docs.docker.com/install/#supported-platforms), run the following command from the `qmk_firmware` directory to build a keyboard/keymap: ```bash -# You'll run this every time you want to build a keymap -# modify the keymap and keyboard assignment to compile what you want -# defaults are ergodox/default +util/docker_build.sh keyboard:keymap +# For example: util/docker_build.sh ergodox_ez:steno +``` +This will compile the targeted keyboard/keymap and leave the resulting `.hex` or `.bin` file in the QMK directory for you to flash. If `:keymap` is omitted, the `default` keymap is used. Note that the parameter format is the same as when building with `make`. -docker run -e keymap=gwen -e keyboard=ergodox_ez --rm -v $('pwd'):/qmk:rw edasque/qmk_firmware +You can also start the script without any parameters, in which case it will ask you to input the build parameters one by one, which you may find easier to use: +```bash +util/docker_build.sh +# Reads parameters as input (leave blank for defaults) ``` -On Windows Docker seems to have issues with the VOLUME tag in Dockerfile, and `$('pwd')` won't print a Windows compliant path; use full path instead, like this: - +There is also support for building _and_ flashing the keyboard straight from Docker by specifying the `target` as well: ```bash -docker run -e keymap=default -e keyboard=ergodox_ez --rm -v D:/Users/Sacapuces/Documents/Repositories/qmk:/qmk:rw edasque/qmk_firmware - +util/docker_build.sh keyboard:keymap:target +# For example: util/docker_build.sh planck/rev6:default:dfu-util ``` +If you're on Linux, this should work out of the box. On Windows and macOS, it requires [Docker Machine](http://gw.tnode.com/docker/docker-machine-with-usb-support-on-windows-macos/) to be running. This is tedious to set up, so it's not recommended; use QMK Toolbox instead. -This will compile the targeted keyboard/keymap and leave it in your QMK directory for you to flash. +!> Docker for Windows requires [Hyper-V](https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v) to be enabled. This means that it cannot work on versions of Windows which don't have Hyper-V, such as Windows 7, Windows 8 and **Windows 10 Home**. ## Vagrant If you have any problems building the firmware, you can try using a tool called Vagrant. It will set up a virtual computer with a known configuration that's ready-to-go for firmware building. OLKB does NOT host the files for this virtual computer. Details on how to set up Vagrant are in the [vagrant guide](getting_started_vagrant.md). diff --git a/util/docker_build.sh b/util/docker_build.sh new file mode 100755 index 000000000..26075cc90 --- /dev/null +++ b/util/docker_build.sh @@ -0,0 +1,49 @@ +#!/bin/sh +# NOTE: This script uses tabs for indentation + +USAGE="Usage: $0 [keyboard[:keymap[:target]]]" + +# Check preconditions +for arg; do + if [ "$arg" = "--help" ]; then + echo "$USAGE" + exit 0 + fi +done +if [ $# -gt 1 ]; then + echo "$USAGE" >&2 + exit 1 +elif ! command -v docker >/dev/null 2>&1; then + echo "Error: docker not found" >&2 + echo "See https://docs.docker.com/install/#supported-platforms for installation instructions" >&2 + exit 2 +fi + +# Determine arguments +if [ $# -eq 0 ]; then + printf "keyboard=" && read -r keyboard + [ -n "$keyboard" ] && printf "keymap=" && read -r keymap + [ -n "$keymap" ] && printf "target=" && read -r target +else + IFS=':' read -r keyboard keymap target x <<-EOF + $1 + EOF + if [ -n "$x" ]; then + echo "$USAGE" >&2 + exit 1 + fi +fi +if [ -n "$target" ]; then + if [ "$(uname)" = "Linux" ] || docker-machine active >/dev/null 2>&1; then + usb_args="--privileged -v /dev/bus/usb:/dev/bus/usb" + else + echo "Error: target requires docker-machine to work on your platform" >&2 + echo "See http://gw.tnode.com/docker/docker-machine-with-usb-support-on-windows-macos" >&2 + exit 3 + fi +fi +dir=$(pwd -W 2>/dev/null) || dir=$PWD # Use Windows path if on Windows + +# Run container and build firmware +docker run --rm $usb_args -v "$dir":/qmk_firmware qmkfm/qmk_firmware \ + make "$keyboard${keymap:+:$keymap}${target:+:$target}" From 11eaccdbce5246e7235ff91d0d04de83f7685919 Mon Sep 17 00:00:00 2001 From: marksard <38324387+marksard@users.noreply.github.com> Date: Sun, 9 Dec 2018 02:43:57 +0900 Subject: [PATCH 647/788] Keymap: Modified like-jis keymap for crkbd (#4577) --- keyboards/crkbd/keymaps/like_jis/config.h | 2 +- keyboards/crkbd/keymaps/like_jis/keymap.c | 317 ++++++++++-------- .../crkbd/keymaps/like_jis/oled_helper.c | 83 +++++ .../crkbd/keymaps/like_jis/oled_helper.h | 35 ++ keyboards/crkbd/keymaps/like_jis/rules.mk | 17 +- 5 files changed, 311 insertions(+), 143 deletions(-) create mode 100644 keyboards/crkbd/keymaps/like_jis/oled_helper.c create mode 100644 keyboards/crkbd/keymaps/like_jis/oled_helper.h diff --git a/keyboards/crkbd/keymaps/like_jis/config.h b/keyboards/crkbd/keymaps/like_jis/config.h index 0e2960a93..a061b4fb0 100644 --- a/keyboards/crkbd/keymaps/like_jis/config.h +++ b/keyboards/crkbd/keymaps/like_jis/config.h @@ -34,7 +34,7 @@ along with this program. If not, see . #define PREVENT_STUCK_MODIFIERS #define TAPPING_FORCE_HOLD -#define TAPPING_TERM 150 +#define TAPPING_TERM 250 #undef RGBLED_NUM #define RGBLIGHT_ANIMATIONS diff --git a/keyboards/crkbd/keymaps/like_jis/keymap.c b/keyboards/crkbd/keymaps/like_jis/keymap.c index 42d36de44..b1b6c64b1 100644 --- a/keyboards/crkbd/keymaps/like_jis/keymap.c +++ b/keyboards/crkbd/keymaps/like_jis/keymap.c @@ -7,6 +7,7 @@ #ifdef SSD1306OLED #include "ssd1306.h" #endif +#include "oled_helper.h" extern keymap_config_t keymap_config; @@ -21,27 +22,35 @@ extern uint8_t is_master; // The underscores don't mean anything - you can have a layer called STUFF or any other name. // Layer names don't all need to be of the same length, obviously, and you can also skip them // entirely and just use numbers. -#define _QWERTY 0 -#define _LOWER 3 -#define _RAISE 4 -#define _ADJUST 16 +enum layer_number { + _BASE = 0, + _LOWER, + _RAISE, + _ADJUST, +}; enum custom_keycodes { LOWER = SAFE_RANGE, RAISE, ADJUST, + KANJI, RGBRST }; -#define KC______ KC_TRNS -#define KC_XXXXX KC_NO -#define KC_KANJI KC_GRV +enum tapdances{ + TD_CODO = 0, + // TD_MNUB, +}; +// Layer Mode aliases #define KC_LOWER LOWER #define KC_RAISE RAISE -#define KC_RST RESET +#define KC______ KC_TRNS +#define KC_XXXXX KC_NO +#define KC_KANJI KANJI +#define KC_RST RESET #define KC_LRST RGBRST #define KC_LTOG RGB_TOG #define KC_LHUI RGB_HUI @@ -51,31 +60,41 @@ enum custom_keycodes { #define KC_LVAI RGB_VAI #define KC_LVAD RGB_VAD #define KC_LMOD RGB_MOD - #define KC_KNRM AG_NORM #define KC_KSWP AG_SWAP -#define KC_GUAP LALT_T(KC_APP) + +#define KC_TBSF LSFT_T(KC_TAB) +// #define KC_SPSF LSFT_T(KC_SPC) +#define KC_ALAP LALT_T(KC_APP) + +#define KC_CODO TD(TD_CODO) +// #define KC_MNUB TD(TD_MNUB) + +qk_tap_dance_action_t tap_dance_actions[] = { + [TD_CODO] = ACTION_TAP_DANCE_DOUBLE(KC_COMM, KC_DOT), + // [TD_MNUB] = ACTION_TAP_DANCE_DOUBLE(KC_MINS, LSFT(KC_RO)), +}; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_QWERTY] = LAYOUT_kc( \ + [_BASE] = LAYOUT_kc( \ //,-----------------------------------------. ,-----------------------------------------. ESC, Q, W, E, R, T, Y, U, I, O, P, MINS,\ //|------+------+------+------+------+------| |------+------+------+------+------+------| - LSFT, A, S, D, F, G, H, J, K, L, UP, ENT,\ + TBSF, A, S, D, F, G, H, J, K, L, UP, ENT,\ //|------+------+------+------+------+------| |------+------+------+------+------+------| - LCTRL, Z, X, C, V, B, N, M, COMM, LEFT, DOWN, RGHT,\ + LCTRL, Z, X, C, V, B, N, M, CODO, LEFT, DOWN, RGHT,\ //|------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - LGUI, LOWER, BSPC, SPC, RAISE, GUAP \ + LGUI, LOWER, BSPC, SPC, RAISE, ALAP \ //`--------------------' `--------------------' ), [_LOWER] = LAYOUT_kc( \ //,-----------------------------------------. ,-----------------------------------------. - TAB, F1, F2, F3, F4, F5, XXXXX, MINS, EQL, JYEN, LBRC, RBRC,\ + _____, F1, F2, F3, F4, F5, XXXXX, MINS, EQL, JYEN, LBRC, RBRC,\ //|------+------+------+------+------+------| |------+------+------+------+------+------| _____, F6, F7, F8, F9, F10, XXXXX, XXXXX, XXXXX, SCLN, QUOT, BSLS,\ //|------+------+------+------+------+------| |------+------+------+------+------+------| - _____, F11, F12, XXXXX, KANJI, ENT, XXXXX, XXXXX, COMM, DOT, SLSH, RO,\ + _____, F11, F12, TAB, KANJI, ENT, XXXXX, XXXXX, COMM, DOT, SLSH, RO,\ //|------+------+------+------+------+------+------| |------+------+------+------+------+------+------| _____, _____, DEL, _____, _____, APP \ //`--------------------' `--------------------' @@ -83,11 +102,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_RAISE] = LAYOUT_kc( \ //,-----------------------------------------. ,-----------------------------------------. - _____, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, XXXXX,\ + _____, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, PSLS,\ //|------+------+------+------+------+------| |------+------+------+------+------+------| - _____, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, 4, 5, 6, QUOT, XXXXX,\ + _____, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, QUOT, 4, 5, 6, PPLS, PAST,\ //|------+------+------+------+------+------| |------+------+------+------+------+------| - _____, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, 0, 1, 2, 3, DOT, XXXXX,\ + _____, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, 0, 1, 2, 3, DOT, PMNS,\ //|------+------+------+------+------+------+------| |------+------+------+------+------+------+------| _____, _____, BSPC, _____, _____, LALT \ //`--------------------' `--------------------' @@ -95,152 +114,182 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_ADJUST] = LAYOUT_kc( \ //,-----------------------------------------. ,-----------------------------------------. - _____, RST, LRST, KNRM, KSWP,XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,\ + _____, RST, LRST, KNRM, KSWP, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,\ //|------+-------+------+------+------+-----| |------+------+------+------+------+------| - _____, LTOG, LHUI, LSAI, LVAI,XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, PGUP, XXXXX,\ + _____, LTOG, LHUI, LSAI, LVAI, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, PGUP, XXXXX,\ //|------+-------+------+------+------+-----| |------+------+------+------+------+------| - _____, LMOD, LHUD, LSAD, LVAD,XXXXX, XXXXX, XXXXX, XXXXX, HOME, PGDN, END,\ + _____, LMOD, LHUD, LSAD, LVAD, XXXXX, XXXXX, XXXXX, XXXXX, HOME, PGDN, END,\ //|------+------+------+------+------+------+------| |------+------+------+------+------+------+------| _____, _____, XXXXX, _____, _____, XXXXX \ //`--------------------' `--------------------' ) }; -int RGB_current_mode; +#define L_BASE _BASE +#define L_LOWER (1<<_LOWER) +#define L_RAISE (1<<_RAISE) +#define L_ADJUST (1<<_ADJUST) +#define L_ADJUST_TRI (L_ADJUST|L_RAISE|L_LOWER) -// Setting ADJUST layer RGB back to default -static inline void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) { - if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) { - layer_on(layer3); - } else { - layer_off(layer3); +#ifdef SSD1306OLED +typedef struct { + uint8_t state; + char name[8]; +}LAYER_DISPLAY_NAME; + +#define LAYER_DISPLAY_MAX 5 +const LAYER_DISPLAY_NAME layer_display_name[LAYER_DISPLAY_MAX] = { + {L_BASE, "Base"}, + {L_BASE + 1, "Base"}, + {L_LOWER, "Lower"}, + {L_RAISE, "Raise"}, + {L_ADJUST_TRI, "Adjust"} +}; + +static inline const char* get_leyer_status(void) { + + for (uint8_t i = 0; i < LAYER_DISPLAY_MAX; ++i) { + if (layer_state == 0 && layer_display_name[i].state == default_layer_state) { + + return layer_display_name[i].name; + } else if (layer_state != 0 && layer_display_name[i].state == layer_state) { + + return layer_display_name[i].name; + } } + + return "?"; +} + +static char layer_status_buf[24] = "Layer state ready.\n"; +static inline void update_keymap_status(void) { + + snprintf(layer_status_buf, sizeof(layer_status_buf) - 1, "OS:%s Layer:%s\n", + keymap_config.swap_lalt_lgui? "win" : "mac", get_leyer_status()); +} + +static inline void render_keymap_status(struct CharacterMatrix *matrix) { + + matrix_write(matrix, layer_status_buf); +} + +#define UPDATE_KEYMAP_STATUS() update_keymap_status() +#define RENDER_KEYMAP_STATUS(a) render_keymap_status(a) + +#else + +#define UPDATE_KEYMAP_STATUS() +#define RENDER_KEYMAP_STATUS(a) + +#endif + +static inline void update_change_layer(bool pressed, uint8_t layer1, uint8_t layer2, uint8_t layer3) { + + pressed ? layer_on(layer1) : layer_off(layer1); + IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2) ? layer_on(layer3) : layer_off(layer3); +} + +int RGB_current_mode; +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + + UPDATE_KEY_STATUS(keycode, record); + + bool result = false; + switch (keycode) { + case LOWER: + update_change_layer(record->event.pressed, _LOWER, _RAISE, _ADJUST); + break; + case RAISE: + update_change_layer(record->event.pressed, _RAISE, _LOWER, _ADJUST); + break; + case KANJI: + if (record->event.pressed) { + if (keymap_config.swap_lalt_lgui == false) { + register_code(KC_LANG2); + } else { + SEND_STRING(SS_LALT("`")); + } + } else { + unregister_code(KC_LANG2); + } + break; + #ifdef RGBLIGHT_ENABLE + case RGB_MOD: + if (record->event.pressed) { + rgblight_mode(RGB_current_mode); + rgblight_step(); + RGB_current_mode = rgblight_config.mode; + } + break; + case RGBRST: + if (record->event.pressed) { + eeconfig_update_rgblight_default(); + rgblight_enable(); + RGB_current_mode = rgblight_config.mode; + } + break; + #endif + default: + result = true; + break; + } + + UPDATE_KEYMAP_STATUS(); + return result; } void matrix_init_user(void) { - #ifdef RGBLIGHT_ENABLE - RGB_current_mode = rgblight_config.mode; - #endif - //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h - #ifdef SSD1306OLED - iota_gfx_init(!has_usb()); // turns on the display - #endif + #ifdef RGBLIGHT_ENABLE + RGB_current_mode = rgblight_config.mode; + #endif + //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h + #ifdef SSD1306OLED + iota_gfx_init(!has_usb()); // turns on the display + #endif } //SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h #ifdef SSD1306OLED - -// When add source files to SRC in rules.mk, you can use functions. -const char *read_layer_state(void); -const char *read_logo(void); -void set_keylog(uint16_t keycode, keyrecord_t *record); -const char *read_keylog(void); -const char *read_keylogs(void); - -// const char *read_mode_icon(bool swap); -// const char *read_host_led_state(void); -// void set_timelog(void); -// const char *read_timelog(void); - -#ifdef RGBLIGHT_ENABLE - const char *read_rgb_info(void); - #define RENDER_RGB_INFO(m) matrix_write_ln(m, (const char*)read_rgb_info()) -#else - #define RENDER_RGB_INFO(m) -#endif - - void matrix_scan_user(void) { - iota_gfx_task(); + iota_gfx_task(); // this is what updates the display continuously } -static inline void matrix_render_user(struct CharacterMatrix *matrix) { - if (is_master) { - // If you want to change the display of OLED, you need to change here - matrix_write_ln(matrix, read_layer_state()); - matrix_write_ln(matrix, read_keylog()); - RENDER_RGB_INFO(matrix); - // matrix_write_ln(matrix, read_keylogs()); - // matrix_write_ln(matrix, read_host_led_state()); - - // matrix_write_ln(matrix, read_mode_icon(keymap_config.swap_lalt_lgui)); - // matrix_write_ln(matrix, read_timelog()); - } else { - matrix_write(matrix, read_logo()); - } -} - -static inline void matrix_update(struct CharacterMatrix *dest, const struct CharacterMatrix *source) { +static inline void matrix_update(struct CharacterMatrix *dest, + const struct CharacterMatrix *source) { if (memcmp(dest->display, source->display, sizeof(dest->display))) { memcpy(dest->display, source->display, sizeof(dest->display)); dest->dirty = true; } } +static inline void render_status(struct CharacterMatrix *matrix) { + + UPDATE_LED_STATUS(); + RENDER_LED_STATUS(matrix); + RENDER_KEYMAP_STATUS(matrix); + UPDATE_LOCK_STATUS(); + RENDER_LOCK_STATUS(matrix); + RENDER_KEY_STATUS(matrix); +} + void iota_gfx_task_user(void) { struct CharacterMatrix matrix; + + #if DEBUG_TO_SCREEN + if (debug_enable) { + return; + } + #endif + matrix_clear(&matrix); - matrix_render_user(&matrix); + if (is_master) { + render_status(&matrix); + } else { + RENDER_LOGO(&matrix); + } + matrix_update(&display, &matrix); } #endif - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - #ifdef SSD1306OLED - if (record->event.pressed) { - set_keylog(keycode, record); - // set_timelog(); - } - #endif - - switch (keycode) { - case LOWER: - if (record->event.pressed) { - layer_on(_LOWER); - update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_LOWER); - update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); - } - break; - case RAISE: - if (record->event.pressed) { - layer_on(_RAISE); - update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_RAISE); - update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); - } - break; - case ADJUST: - if (record->event.pressed) { - layer_on(_ADJUST); - } else { - layer_off(_ADJUST); - } - break; - - #ifdef RGBLIGHT_ENABLE - case RGB_MOD: - if (record->event.pressed) { - rgblight_mode(RGB_current_mode); - rgblight_step(); - RGB_current_mode = rgblight_config.mode; - } - break; - case RGBRST: - if (record->event.pressed) { - eeconfig_update_rgblight_default(); - rgblight_enable(); - RGB_current_mode = rgblight_config.mode; - } - break; - #endif - default: - return true; - } - - return false; -} diff --git a/keyboards/crkbd/keymaps/like_jis/oled_helper.c b/keyboards/crkbd/keymaps/like_jis/oled_helper.c new file mode 100644 index 000000000..500d3c0dc --- /dev/null +++ b/keyboards/crkbd/keymaps/like_jis/oled_helper.c @@ -0,0 +1,83 @@ +#ifdef SSD1306OLED +#include QMK_KEYBOARD_H +#include "ssd1306.h" + +void render_logo(struct CharacterMatrix *matrix) { + + const char logo_buf[]={ + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94, + 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4, + 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4, + 0}; + + matrix_write(matrix, logo_buf); +} + +static char keylog_buf[24] = "Key state ready."; +const char code_to_name[60] = { + ' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f', + 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', + 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', + '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', + 'R', 'E', 'B', 'T', ' ', '-', ' ', '@', ' ', ' ', + ' ', ';', ':', ' ', ',', '.', '/', ' ', ' ', ' '}; + +void update_key_status(uint16_t keycode, keyrecord_t *record) { + + if (!record->event.pressed) return; + + char name = (keycode < 60) ? code_to_name[keycode] : ' '; + snprintf(keylog_buf, sizeof(keylog_buf) - 1, "Key:%dx%d %2x %c", + record->event.key.row, record->event.key.col, + (uint16_t)keycode, name); +} + +void render_key_status(struct CharacterMatrix *matrix) { + + matrix_write(matrix, keylog_buf); +} + +static char lock_buf[24] = "Lock state ready.\n"; +void update_lock_status(void) { + + uint8_t leds = host_keyboard_leds(); + char *num_lock = (leds & (1< Date: Mon, 10 Dec 2018 00:28:46 +0800 Subject: [PATCH 648/788] Keymap: Keymap update (#4579) * Add YREG keycode * Add GM layer * Set tapping term to 105 * update tapping term --- keyboards/lets_split/keymaps/zer09/keymap.c | 24 ++++++++++++++++-- users/zer09/config.h | 4 +-- users/zer09/tap_dance.c | 27 ++++++++++++++++++--- users/zer09/zer09.h | 10 +++++++- 4 files changed, 57 insertions(+), 8 deletions(-) diff --git a/keyboards/lets_split/keymaps/zer09/keymap.c b/keyboards/lets_split/keymaps/zer09/keymap.c index 8d0eaf141..cb6744433 100644 --- a/keyboards/lets_split/keymaps/zer09/keymap.c +++ b/keyboards/lets_split/keymaps/zer09/keymap.c @@ -9,8 +9,15 @@ extern keymap_config_t keymap_config; TD(DA_UPLY), MO(_VL), KC_TAB, KC_BSPACE, KC_ESC, /**/KC_INS, KC_HOME, KC_PGUP, MO(_VL), TD(DA_UPLY), \ TD(DA_DWLY), TD(DA_LCTL), KC_SPC, TD(DA_LSPR), LSFT_T(KC_CAPS),/**/SFT_T(KC_CAPS), TD(DA_RALT), KC_ENT, TD(DA_RCTL), TD(DA_DWLY)) +#define _GMLayer LAYOUT( \ + KC_QUOTE, KC_COMMA, KC_DOT, KC_P, KC_Y, /**/KC_F, KC_G, KC_C, KC_R, KC_L, \ + KC_A, KC_O, KC_E, KC_U, KC_I, /**/KC_D, KC_H, ALT_T(KC_T), SFT_T(KC_N), CTL_T(KC_S), \ + KC_SCOLON, KC_Q, KC_J, KC_K, KC_X, /**/KC_B, KC_M, KC_W, KC_V, KC_Z, \ + TD(DA_UPLY), MO(_VL), KC_TAB, KC_BSPACE, KC_ESC, /**/KC_INS, KC_HOME, KC_PGUP, MO(_VL), TD(DA_UPLY), \ + TD(DA_DWLY), TD(DA_LCTL), KC_SPC, TD(DA_LSPR), LSFT_T(KC_CAPS),/**/SFT_T(KC_CAPS), TD(DA_RALT), KC_ENT, TD(DA_RCTL), TD(DA_DWLY)) + #define _upLayer LAYOUT( \ - KC_4, KC_5, KC_6, _______, _______,/**/ _______, KC_RBRC, _______, _______, _______, \ + KC_4, KC_5, KC_6, KC_YREG, _______,/**/ _______, KC_RBRC, _______, _______, _______, \ LCTL_T(KC_1), LSFT_T(KC_2), LALT_T(KC_3), _______, _______,/**/ KC_LBRC, KC_BSLS, _______, _______, _______, \ KC_7, KC_8, KC_9, KC_0, KC_GRV, /**/ KC_SLSH, _______, _______, _______, _______, \ _______, _______, _______, _______, _______,/**/ KC_DEL, KC_END, KC_PGDN, _______, _______, \ @@ -35,4 +42,17 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_UL] = _upLayer, [_DL] = _downLayer, [_VL] = _upLayer, - [_AL] = _astdLayer}; + [_AL] = _astdLayer, + [_GM] = _GMLayer}; + +bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { + if (record->event.pressed) { + switch (keycode) { + case YREG: + SEND_STRING("\"0p"); + return false; + } + } + + return true; +} diff --git a/users/zer09/config.h b/users/zer09/config.h index 4cb65c258..c5ab32f8d 100644 --- a/users/zer09/config.h +++ b/users/zer09/config.h @@ -16,13 +16,13 @@ #define FORCE_NKRO #ifndef TAPPING_TOGGLE -#define TAPPING_TOGGLE 1 +#define TAPPING_TOGGLE 1 #endif #ifdef TAPPING_TERM #undef TAPPING_TERM #endif -#define TAPPING_TERM 120 +#define TAPPING_TERM 95 // Disable action_get_macro and fn_actions, since we don't use these // and it saves on space in the firmware. diff --git a/users/zer09/tap_dance.c b/users/zer09/tap_dance.c index a23705ad8..e99b26cca 100644 --- a/users/zer09/tap_dance.c +++ b/users/zer09/tap_dance.c @@ -17,15 +17,27 @@ qk_tap_dance_action_t tap_dance_actions[] = { }; volatile uint8_t active_layer = _BL; +volatile uint8_t gm_layer_act = false; static tap upltap_state = {.state = 0}; static tap dwltap_state = {.state = 0}; static tap lsprtap_state = {.state = 0}; static tap ralttap_state = {.state = 0}; void layer_switcher_tap(uint8_t new_layer) { - layer_off(active_layer); - layer_on(new_layer); - active_layer = new_layer; + if (gm_layer_act == true) { + layer_off(active_layer); + if (new_layer == _BL) { + layer_on(_GM); + active_layer = _GM; + } else { + layer_on(new_layer); + active_layer = new_layer; + } + } else { + layer_off(active_layer); + layer_on(new_layer); + active_layer = new_layer; + } } int cur_dance(qk_tap_dance_state_t *state) { @@ -162,6 +174,14 @@ void dance_dwly_finished(qk_tap_dance_state_t *state, void *user_data) { case DOUBLE_HOLD: layer_switcher_tap(_AL); break; + case TRIPLE_TAP: + if (gm_layer_act == true) { + gm_layer_act = false; + layer_switcher_tap(_BL); + } else { + gm_layer_act = true; + layer_switcher_tap(_GM); + } default: layer_switcher_tap(_BL); break; @@ -174,6 +194,7 @@ void dance_dwly_reset(qk_tap_dance_state_t *state, void *user_data) { break; case SINGLE_HOLD: case DOUBLE_HOLD: + case TRIPLE_TAP: default: layer_switcher_tap(_BL); break; diff --git a/users/zer09/zer09.h b/users/zer09/zer09.h index 75c1d3cad..acac8ab09 100644 --- a/users/zer09/zer09.h +++ b/users/zer09/zer09.h @@ -3,16 +3,24 @@ #include "quantum.h" -enum custom_keycodes { CK_SAFE = SAFE_RANGE, RGUP, RGDWN, NEWPLACEHOLDER }; +enum custom_keycodes { + CK_SAFE = SAFE_RANGE, + RGUP, + RGDWN, + YREG, + NEW_SAFE_RANGE +}; #define _______ KC_TRNS #define KC_RGUP RGUP #define KC_RGDWN RGDWN +#define KC_YREG YREG #define _BL 0 // The base layer #define _UL 1 // The up layer #define _DL 2 // The down layer #define _VL 3 // The shifted up layer #define _AL 4 // The assorted layer +#define _GM 5 #endif From b8db0b26b1b978bbc510af1fe95ba2a0b7f1f928 Mon Sep 17 00:00:00 2001 From: MakotoKurauchi Date: Mon, 10 Dec 2018 01:42:28 +0900 Subject: [PATCH 649/788] Keymap: Fixed a problem with underglow with froggy keymap (#4580) --- keyboards/helix/rev2/keymaps/froggy/keymap.c | 30 ++++++++++++++++---- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/keyboards/helix/rev2/keymaps/froggy/keymap.c b/keyboards/helix/rev2/keymaps/froggy/keymap.c index 75c6f0811..efd8a2916 100644 --- a/keyboards/helix/rev2/keymaps/froggy/keymap.c +++ b/keyboards/helix/rev2/keymaps/froggy/keymap.c @@ -593,19 +593,39 @@ void matrix_scan_user(void) { if(!RGBAnimation){ switch (layer_state) { case L_BASE: - led_ripple_effect(0,112,127); + #ifdef RGBLED_BACK + led_ripple_effect(0,112,127); + #else + rgblight_setrgb(0,112,127); + #endif break; case L_OPT: - led_ripple_effect(127,0,100); + #ifdef RGBLED_BACK + led_ripple_effect(127,0,100); + #else + rgblight_setrgb(127,0,100); + #endif break; case L_NUM: - led_ripple_effect(127,23,0); + #ifdef RGBLED_BACK + led_ripple_effect(127,23,0); + #else + rgblight_setrgb(127,23,0); + #endif break; case L_SYM: - led_ripple_effect(0,127,0); + #ifdef RGBLED_BACK + led_ripple_effect(0,127,0); + #else + rgblight_setrgb(0,127,0); + #endif break; case L_FUNC: - led_ripple_effect(127,0,61); + #ifdef RGBLED_BACK + led_ripple_effect(127,0,61); + #else + rgblight_setrgb(127,0,61); + #endif break; } } From 16302be5adfa0f094e95f734b432c96460b79a6e Mon Sep 17 00:00:00 2001 From: Ben Date: Sun, 9 Dec 2018 23:26:09 +0100 Subject: [PATCH 650/788] docs typo (#4584) --- docs/feature_encoders.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/feature_encoders.md b/docs/feature_encoders.md index 036c6a1d8..208d6db13 100644 --- a/docs/feature_encoders.md +++ b/docs/feature_encoders.md @@ -13,7 +13,7 @@ and this to your `config.h`: Each PAD_A/B variable defines an array so multiple encoders can be defined, e.g.: #define ENCODERS_PAD_A { encoder1a, encoder2a } - #define ENCODERS_PAD_B { encoder1a, encoder2b } + #define ENCODERS_PAD_B { encoder1b, encoder2b } If your encoder's clockwise directions are incorrect, you can swap the A & B pad definitions. From fd3b0787ed4fc8d58158fa8c7136bc1d3b48ab16 Mon Sep 17 00:00:00 2001 From: Vyolle <44031868+Vyolle@users.noreply.github.com> Date: Sun, 9 Dec 2018 19:52:00 -0600 Subject: [PATCH 651/788] Fixed lack of semi colon. (#4587) --- keyboards/levinson/keymaps/steno/keymap.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/keyboards/levinson/keymaps/steno/keymap.c b/keyboards/levinson/keymaps/steno/keymap.c index f997b4de1..cd7493467 100644 --- a/keyboards/levinson/keymaps/steno/keymap.c +++ b/keyboards/levinson/keymaps/steno/keymap.c @@ -39,11 +39,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ - KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_P, KC_QUOT, + KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_RSFT, //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LGUI, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_QUOT, //├────────┼────────┼────────┼────────┼────────┼────────┼ ┼────────┼────────┼────────┼────────┼────────┼────────┤ - KC_LGUI, KC_Z, KC_LALT, KC_LCTL, LOWER, KC_SPC, KC_ENT, RAISE, KC_RCTL, KC_RALT, EXT_QWE, KC_RGUI + KC_LALT, KC_MINUS, KC_TAB, KC_LCTL, LOWER, KC_SPC, KC_ENT, RAISE, KC_RCTL, KC_RGUI, EXT_QWE, KC_RALT //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴ ┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ ), @@ -76,15 +76,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = [_ADJUST] = LAYOUT( //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ - KC_GRV, KC_HOME, KC_LBRC, KC_RBRC, KC_PIPE, KC_APP, KC_SLCK, _______, _______, _______, _______, _______, + _______, _______, KC_CAPS, KC_MENU, KC_APP, KC_PSCR, _______, _______, _______, _______, _______, _______, //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ - KC_PSCR, KC_END, KC_LCBR, KC_RCBR, KC_PLUS, KC_EQL, KC_PAUS, _______, _______, _______, _______, _______, + _______, _______,_______, _______, _______, KC_PAUS, _______, _______, _______, _______, _______, _______, //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ - _______, _______, _______, KC_BSLS, KC_MINS, KC_UNDS, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, KC_SLCK, _______, _______, _______, _______, _______, _______, //├────────┼────────┼────────┼────────┼────────┼────────┼ ┼────────┼────────┼────────┼────────┼────────┼────────┤ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴ ┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ - + ), From 753f57ee0003c9adde5446e813e3a347d4b15a2a Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Sun, 9 Dec 2018 21:43:24 -0800 Subject: [PATCH 652/788] handwired/nicekey Refactor and readme cleanup (#4588) * handwired/nicekey: refactor Now uses a layout macro. * handwired/nicekey: readme cleanup - linked maintainer's GitHub account - updated Docs links --- .../handwired/nicekey/keymaps/default/keymap.c | 2 +- keyboards/handwired/nicekey/nicekey.h | 13 ++++++++++++- keyboards/handwired/nicekey/readme.md | 4 ++-- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/keyboards/handwired/nicekey/keymaps/default/keymap.c b/keyboards/handwired/nicekey/keymaps/default/keymap.c index 573237715..139ea6a3b 100644 --- a/keyboards/handwired/nicekey/keymaps/default/keymap.c +++ b/keyboards/handwired/nicekey/keymaps/default/keymap.c @@ -71,5 +71,5 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { }; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - {{ RANDOM_STRING_MACRO }} + LAYOUT( RANDOM_STRING_MACRO ) }; diff --git a/keyboards/handwired/nicekey/nicekey.h b/keyboards/handwired/nicekey/nicekey.h index 7a4a4835e..ee5bcfd6b 100644 --- a/keyboards/handwired/nicekey/nicekey.h +++ b/keyboards/handwired/nicekey/nicekey.h @@ -1 +1,12 @@ -#include "quantum.h" \ No newline at end of file +#ifndef NICEKEY_H +#define NICEKEY_H + +#include "quantum.h" + +#define LAYOUT( \ + k00 \ + ) { \ + { k00 } \ +} + +#endif diff --git a/keyboards/handwired/nicekey/readme.md b/keyboards/handwired/nicekey/readme.md index a867e907e..e108b38dd 100644 --- a/keyboards/handwired/nicekey/readme.md +++ b/keyboards/handwired/nicekey/readme.md @@ -5,7 +5,7 @@ Custom handwired nicekey, a one key keyboard that writes random compliments. -Keyboard Maintainer: spydon +Keyboard Maintainer: [spydon](https://github.com/spydon) Hardware Supported: Custom handwired one key Hardware Availability: @@ -15,4 +15,4 @@ Make example for this keyboard (after setting up your build environment): make handwired/nicekey:default -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. +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). From 090c30212e13b5c21d78f600425a28b4b7ff0e37 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Mon, 10 Dec 2018 09:22:50 -0800 Subject: [PATCH 653/788] handwired/onekey Refactor and readme update (#4590) * handwired/onekey: refactor - keyboard now uses a layout macro - keymap now uses #include QMK_KEYBOARD_H * handwired/onekey: readme update Updated Docs links. --- keyboards/handwired/onekey/keymaps/default/keymap.c | 4 ++-- keyboards/handwired/onekey/onekey.h | 13 ++++++++++++- keyboards/handwired/onekey/readme.md | 2 +- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/keyboards/handwired/onekey/keymaps/default/keymap.c b/keyboards/handwired/onekey/keymaps/default/keymap.c index 10c486718..dd64f9fa5 100644 --- a/keyboards/handwired/onekey/keymaps/default/keymap.c +++ b/keyboards/handwired/onekey/keymaps/default/keymap.c @@ -1,5 +1,5 @@ -#include "onekey.h" +#include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - {{ KC_A }} + LAYOUT( KC_A ) }; diff --git a/keyboards/handwired/onekey/onekey.h b/keyboards/handwired/onekey/onekey.h index 7a4a4835e..8ce6fec2d 100644 --- a/keyboards/handwired/onekey/onekey.h +++ b/keyboards/handwired/onekey/onekey.h @@ -1 +1,12 @@ -#include "quantum.h" \ No newline at end of file +#ifndef ONEKEY_H +#define ONEKEY_H + +#include "quantum.h" + +#define LAYOUT( \ + k00 \ + ) { \ + { k00 } \ +} + +#endif diff --git a/keyboards/handwired/onekey/readme.md b/keyboards/handwired/onekey/readme.md index c28e284f3..eab3b75a9 100644 --- a/keyboards/handwired/onekey/readme.md +++ b/keyboards/handwired/onekey/readme.md @@ -12,4 +12,4 @@ Make example for this keyboard (after setting up your build environment): make handwired/onekey:default -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. \ No newline at end of file +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). From e99615b2acb473fc4a23886b87abe61c80faa1bc Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 10 Dec 2018 10:49:19 -0800 Subject: [PATCH 654/788] Keyboard: Added RGB toggle and cycle to default KDB6x mapping. (#4592) * Added RGB toggle and cycle to default mapping. This is present on layouts on 'http://qmkeyboard.cn/' but not here. * Added addition keycodes for hue/sat/val. --- keyboards/kbd6x/keymaps/default/keymap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/kbd6x/keymaps/default/keymap.c b/keyboards/kbd6x/keymaps/default/keymap.c index 00adbf887..e2e96fc63 100644 --- a/keyboards/kbd6x/keymaps/default/keymap.c +++ b/keyboards/kbd6x/keymaps/default/keymap.c @@ -26,7 +26,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT( KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, BL_DEC, BL_TOGG, BL_INC, BL_STEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS From 4a5e68f4f29b0c4c75a68b5958dff197f4ac0f53 Mon Sep 17 00:00:00 2001 From: patrickmt <40182064+patrickmt@users.noreply.github.com> Date: Mon, 10 Dec 2018 14:28:06 -0500 Subject: [PATCH 655/788] Bringing Massdrop keyboard hardware configuration to keyboard level (#4593) MCU Pins for debugging, LED, boot tracing, and shift registers are now configurable at keyboard level. Macros led_* replaced by DBG_LED_* Macros m15_* replaced by DBG_1_* Macros m27_* replaced by DBG_2_* Macros m28_* replaced by DBG_3_* For CTRL and ALT keyboards, debug boot tracing pin default now set to pad M27 instead of M28 since although M28 is not being used, it is technically a signal for USB port detection. m15_print(...) renamed to dbg_print(...) to get away from hard coded port names. dbg_print function now follows similar pattern to debug led output. --- keyboards/massdrop/alt/config.h | 51 +++++++- keyboards/massdrop/alt/matrix.c | 6 +- keyboards/massdrop/ctrl/config.h | 51 +++++++- keyboards/massdrop/ctrl/matrix.c | 6 +- tmk_core/protocol/arm_atsam/d51_util.c | 124 ++++++++++++++----- tmk_core/protocol/arm_atsam/d51_util.h | 74 +++++++---- tmk_core/protocol/arm_atsam/i2c_master.c | 10 +- tmk_core/protocol/arm_atsam/led_matrix.c | 4 +- tmk_core/protocol/arm_atsam/main_arm_atsam.c | 14 ++- tmk_core/protocol/arm_atsam/spi.c | 95 +++++++------- tmk_core/protocol/arm_atsam/spi.h | 39 +++--- tmk_core/protocol/arm_atsam/usb/usb2422.c | 85 ++++++------- 12 files changed, 374 insertions(+), 185 deletions(-) diff --git a/keyboards/massdrop/alt/config.h b/keyboards/massdrop/alt/config.h index a486f34a0..660d44421 100644 --- a/keyboards/massdrop/alt/config.h +++ b/keyboards/massdrop/alt/config.h @@ -32,17 +32,64 @@ along with this program. If not, see . #define MATRIX_ROWS 5 #define MATRIX_COLS 15 +/* MCU Port name definitions */ #define PA 0 #define PB 1 +/* Port and Pin definition of key row hardware configuration */ #define MATRIX_ROW_PORTS PA, PA, PA, PA, PA #define MATRIX_ROW_PINS 0, 1, 2, 3, 4 +/* Port and Pin definition of key column hardware configuration */ #define MATRIX_COL_PORTS PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PA, PA, PA, PA, PA #define MATRIX_COL_PINS 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 5, 6, 7, 10, 11 -/* Print boot debug codes using debug LED when M28 and M30 shorted */ -#define DEBUG_BOOT_TRACING +/* This Shift Register expands available hardware output lines to control additional peripherals */ +/* It uses four lines from the MCU to provide 16 output lines */ +/* Shift Register Clock configuration (MCU to ShiftRegister.RCLK) */ +#define SR_EXP_RCLK_PORT PB +#define SR_EXP_RCLK_PIN 14 +/* Shift Register Output Enable configuration (MCU to ShiftRegister.OE_N) */ +#define SR_EXP_OE_N_PORT PB +#define SR_EXP_OE_N_PIN 15 +/* SERCOM port to use for Shift Register SPI */ +/* DATAOUT and SCLK must be configured to use hardware pins of this port */ +#define SR_EXP_SERCOM SERCOM2 +/* Shift Register SPI Data Out configuration (MCU.SERCOMx.PAD[0] to ShiftRegister.SER) */ +#define SR_EXP_DATAOUT_PORT PA +#define SR_EXP_DATAOUT_PIN 12 +#define SR_EXP_DATAOUT_MUX 2 +/* Shift Register SPI Serial Clock configuration (MCU.SERCOMx.PAD[1] to ShiftRegister.SRCLK) */ +#define SR_EXP_SCLK_PORT PA +#define SR_EXP_SCLK_PIN 13 +#define SR_EXP_SCLK_MUX 2 + +/* Debug LED (Small LED Located near MCU) */ +#define DEBUG_LED_ENABLE 1 +#define DEBUG_LED_PORT PA +#define DEBUG_LED_PIN 27 + +/* Additional debugging ports */ +/* PCB M21 */ +#define DEBUG_PORT1_ENABLE 1 +#define DEBUG_PORT1_PORT PB +#define DEBUG_PORT1_PIN 3 +/* PCB M23 */ +#define DEBUG_PORT2_ENABLE 1 +#define DEBUG_PORT2_PORT PB +#define DEBUG_PORT2_PIN 17 +/* PCB M25 */ +#define DEBUG_PORT3_ENABLE 1 +#define DEBUG_PORT3_PORT PA +#define DEBUG_PORT3_PIN 20 + +/* Debug Boot Tracing - During boot sequence, ground this pin to halt and display debug code using Debug LED */ +/* This is useful in determining which hardware device may have malfunctioned or is improperly configured */ +/* Feature is automatically disabled after successful boot */ +/* PCB M27 */ +#define DEBUG_BOOT_TRACING_ENABLE 1 +#define DEBUG_BOOT_TRACING_PORT PB +#define DEBUG_BOOT_TRACING_PIN 23 /* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ #define DEBOUNCING_DELAY 5 diff --git a/keyboards/massdrop/alt/matrix.c b/keyboards/massdrop/alt/matrix.c index 75a4d62b9..892d38791 100644 --- a/keyboards/massdrop/alt/matrix.c +++ b/keyboards/massdrop/alt/matrix.c @@ -75,7 +75,7 @@ void matrix_init(void) PORT->Group[col_ports[col]].DIRSET.reg = 1 << col_pins[col]; //Output PORT->Group[col_ports[col]].OUTCLR.reg = 1 << col_pins[col]; //Low } - + matrix_init_quantum(); } @@ -91,7 +91,7 @@ uint8_t matrix_scan(void) if (CLK_get_ms() < mdebouncing) return 1; //mdebouncing == 0 when no debouncing active - //m15_off; //Profiling scans + //DBG_1_OFF; //Profiling scans memset(mlatest, 0, MATRIX_ROWS * sizeof(matrix_row_t)); //Zero the result buffer @@ -135,7 +135,7 @@ uint8_t matrix_scan(void) mdebouncing = CLK_get_ms() + DEBOUNCING_DELAY; } - //m15_on; //Profiling scans + //DBG_1_ON; //Profiling scans matrix_scan_quantum(); diff --git a/keyboards/massdrop/ctrl/config.h b/keyboards/massdrop/ctrl/config.h index 1ab7f93cd..31eccda87 100644 --- a/keyboards/massdrop/ctrl/config.h +++ b/keyboards/massdrop/ctrl/config.h @@ -32,17 +32,64 @@ along with this program. If not, see . #define MATRIX_ROWS 11 #define MATRIX_COLS 8 +/* MCU Port name definitions */ #define PA 0 #define PB 1 +/* Port and Pin definition of key row hardware configuration */ #define MATRIX_ROW_PORTS PB, PB, PB, PB, PB, PB, PA, PA, PB, PB, PB #define MATRIX_ROW_PINS 4, 5, 6, 7, 8, 9, 10, 11, 10, 11, 12 +/* Port and Pin definition of key column hardware configuration */ #define MATRIX_COL_PORTS PA, PA, PA, PA, PA, PA, PA, PA #define MATRIX_COL_PINS 0, 1, 2, 3, 4, 5, 6, 7 -/* Print boot debug codes using debug LED when M28 and M30 shorted */ -#define DEBUG_BOOT_TRACING +/* This Shift Register expands available hardware output lines to control additional peripherals */ +/* It uses four lines from the MCU to provide 16 output lines */ +/* Shift Register Clock configuration (MCU to ShiftRegister.RCLK) */ +#define SR_EXP_RCLK_PORT PB +#define SR_EXP_RCLK_PIN 14 +/* Shift Register Output Enable configuration (MCU to ShiftRegister.OE_N) */ +#define SR_EXP_OE_N_PORT PB +#define SR_EXP_OE_N_PIN 15 +/* SERCOM port to use for Shift Register SPI */ +/* DATAOUT and SCLK must be configured to use hardware pins of this port */ +#define SR_EXP_SERCOM SERCOM2 +/* Shift Register SPI Data Out configuration (MCU.SERCOMx.PAD[0] to ShiftRegister.SER) */ +#define SR_EXP_DATAOUT_PORT PA +#define SR_EXP_DATAOUT_PIN 12 +#define SR_EXP_DATAOUT_MUX 2 +/* Shift Register SPI Serial Clock configuration (MCU.SERCOMx.PAD[1] to ShiftRegister.SRCLK) */ +#define SR_EXP_SCLK_PORT PA +#define SR_EXP_SCLK_PIN 13 +#define SR_EXP_SCLK_MUX 2 + +/* Debug LED (Small LED Located near MCU) */ +#define DEBUG_LED_ENABLE 1 +#define DEBUG_LED_PORT PA +#define DEBUG_LED_PIN 27 + +/* Additional debugging ports */ +/* PCB M21 */ +#define DEBUG_PORT1_ENABLE 1 +#define DEBUG_PORT1_PORT PB +#define DEBUG_PORT1_PIN 3 +/* PCB M23 */ +#define DEBUG_PORT2_ENABLE 1 +#define DEBUG_PORT2_PORT PB +#define DEBUG_PORT2_PIN 17 +/* PCB M25 */ +#define DEBUG_PORT3_ENABLE 1 +#define DEBUG_PORT3_PORT PA +#define DEBUG_PORT3_PIN 20 + +/* Debug Boot Tracing - During boot sequence, ground this pin to halt and display debug code using Debug LED */ +/* This is useful in determining which hardware device may have malfunctioned or is improperly configured */ +/* Feature is automatically disabled after successful boot */ +/* PCB M27 */ +#define DEBUG_BOOT_TRACING_ENABLE 1 +#define DEBUG_BOOT_TRACING_PORT PB +#define DEBUG_BOOT_TRACING_PIN 23 /* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ #define DEBOUNCING_DELAY 5 diff --git a/keyboards/massdrop/ctrl/matrix.c b/keyboards/massdrop/ctrl/matrix.c index 6f306962e..3580577dc 100644 --- a/keyboards/massdrop/ctrl/matrix.c +++ b/keyboards/massdrop/ctrl/matrix.c @@ -75,7 +75,7 @@ void matrix_init(void) PORT->Group[col_ports[col]].DIRSET.reg = 1 << col_pins[col]; //Output PORT->Group[col_ports[col]].OUTCLR.reg = 1 << col_pins[col]; //Low } - + matrix_init_quantum(); } @@ -91,7 +91,7 @@ uint8_t matrix_scan(void) if (CLK_get_ms() < mdebouncing) return 1; //mdebouncing == 0 when no debouncing active - //m15_off; //Profiling scans + //DBG_1_OFF; //Profiling scans memset(mlatest, 0, MATRIX_ROWS * sizeof(matrix_row_t)); //Zero the result buffer @@ -135,7 +135,7 @@ uint8_t matrix_scan(void) mdebouncing = CLK_get_ms() + DEBOUNCING_DELAY; } - //m15_on; //Profiling scans + //DBG_1_ON; //Profiling scans matrix_scan_quantum(); diff --git a/tmk_core/protocol/arm_atsam/d51_util.c b/tmk_core/protocol/arm_atsam/d51_util.c index bb63a9481..ea4225857 100644 --- a/tmk_core/protocol/arm_atsam/d51_util.c +++ b/tmk_core/protocol/arm_atsam/d51_util.c @@ -1,8 +1,11 @@ #include "d51_util.h" -//Display unsigned 32-bit number through m15 -//Read as follows: 1230 = || ||| |||| | (note always ending toggle) -void m15_print(uint32_t x) +static volatile uint32_t w; + +//Display unsigned 32-bit number by port toggling DBG_1 (to view on a scope) +//Read as follows: 1230 = | | | | | | || (note zero is fast double toggle) +#define DBG_PAUSE 5 +void dbg_print(uint32_t x) { int8_t t; uint32_t n; @@ -26,24 +29,34 @@ void m15_print(uint32_t x) while (p2--) p *= 10; n = x / p; x -= n * p; - while (n > 0) + if (!n) { - m15_on; + DBG_1_ON; + DBG_1_OFF; + DBG_1_ON; + DBG_1_OFF; n--; - m15_off; } - //Will always end with an extra toggle - m15_on; + else + { + while (n > 0) + { + DBG_1_ON; + DBG_1_OFF; + n--; + } + } + t--; - m15_off; } + + for (w = DBG_PAUSE; w; w--); //Long pause after number is complete } //Display unsigned 32-bit number through debug led //Read as follows: 1230 = [*] [* *] [* * *] [**] (note zero is fast double flash) #define DLED_ONTIME 1000000 #define DLED_PAUSE 1500000 -volatile uint32_t w; void dled_print(uint32_t x, uint8_t long_pause) { int8_t t; @@ -70,13 +83,13 @@ void dled_print(uint32_t x, uint8_t long_pause) x -= n * p; if (!n) { - led_on; + DBG_LED_ON; for (w = DLED_ONTIME / 4; w; w--); - led_off; + DBG_LED_OFF; for (w = DLED_ONTIME / 4; w; w--); - led_on; + DBG_LED_ON; for (w = DLED_ONTIME / 4; w; w--); - led_off; + DBG_LED_OFF; for (w = DLED_ONTIME / 4; w; w--); n--; } @@ -84,9 +97,9 @@ void dled_print(uint32_t x, uint8_t long_pause) { while (n > 0) { - led_on; + DBG_LED_ON; for (w = DLED_ONTIME; w; w--); - led_off; + DBG_LED_OFF; for (w = DLED_ONTIME / 2; w; w--); n--; } @@ -102,11 +115,52 @@ void dled_print(uint32_t x, uint8_t long_pause) } } -#ifdef DEBUG_BOOT_TRACING +#ifdef DEBUG_BOOT_TRACING_ENABLE volatile uint32_t debug_code; -void EIC_15_Handler() +//These macros are for compile time substitution +#define DEBUG_BOOT_TRACING_EXTINTn (DEBUG_BOOT_TRACING_PIN % _U_(0x10)) +#define DEBUG_BOOT_TRACING_EXTINTb (_U_(0x1) << DEBUG_BOOT_TRACING_EXTINTn) +#define DEBUG_BOOT_TRACING_CONFIG_INDn (DEBUG_BOOT_TRACING_EXTINTn / _U_(0x8)) +#define DEBUG_BOOT_TRACING_CONFIG_SENSEn (DEBUG_BOOT_TRACING_EXTINTn % _U_(0x8)) +#define DEBUG_BOOT_TRACING_CONFIG_SENSEb (DEBUG_BOOT_TRACING_CONFIG_SENSEn * _U_(0x4)) +#define DEBUG_BOOT_TRACING_IRQn (EIC_0_IRQn + DEBUG_BOOT_TRACING_EXTINTn) + +//These macros perform PORT+PIN definition translation to IRQn in the preprocessor +#define PORTPIN_TO_IRQn_EXPAND(def) def +#define PORTPIN_TO_IRQn_DEF(def) PORTPIN_TO_IRQn_EXPAND(def) +#if DEBUG_BOOT_TRACING_PIN < 10 +#define PORTPIN_TO_IRQn_TODEF(port, pin) PORTPIN_TO_IRQn_DEF(PIN_ ## port ## 0 ## pin ## A_EIC_EXTINT_NUM) +#else +#define PORTPIN_TO_IRQn_TODEF(port, pin) PORTPIN_TO_IRQn_DEF(PIN_ ## port ## pin ## A_EIC_EXTINT_NUM) +#endif +#define PORTPIN_TO_IRQn(port, pin) PORTPIN_TO_IRQn_TODEF(port, pin) + +//These macros perform function name output in the preprocessor +#define DEBUG_BOOT_TRACING_HANDLER_CONCAT(irq) void EIC_ ## irq ## _Handler(void) +#define DEBUG_BOOT_TRACING_HANDLER(irq) DEBUG_BOOT_TRACING_HANDLER_CONCAT(irq) + +//To generate the function name of the IRQ handler catching boot tracing, +// certain macros must be undefined, so save their current values to macro stack +#pragma push_macro("PA") +#pragma push_macro("PB") +#pragma push_macro("_L_") + +//Undefine / redefine pushed macros +#undef PA +#undef PB +#undef _L_ +#define _L_(x) x + +//Perform the work and output +//Ex: PORT PB, PIN 31 = void EIC_15_Handler(void) +DEBUG_BOOT_TRACING_HANDLER(PORTPIN_TO_IRQn(DEBUG_BOOT_TRACING_PORT, DEBUG_BOOT_TRACING_PIN)) + +//Restore macros +#pragma pop_macro("PA") +#pragma pop_macro("PB") +#pragma pop_macro("_L_") { //This is only for non-functional keyboard troubleshooting and should be disabled after boot //Intention is to lock up the keyboard here with repeating debug led code @@ -120,13 +174,13 @@ void debug_code_init(void) { DBGC(DC_UNSET); - //Configure Ports for EIC on PB31 - PORT->Group[1].DIRCLR.reg = 1 << 31; //Input - PORT->Group[1].OUTSET.reg = 1 << 31; //High - PORT->Group[1].PINCFG[31].bit.INEN = 1; //Input Enable - PORT->Group[1].PINCFG[31].bit.PULLEN = 1; //Pull Enable - PORT->Group[1].PINCFG[31].bit.PMUXEN = 1; //Mux Enable - PORT->Group[1].PMUX[15].bit.PMUXO = 0; //Mux A + //Configure Ports for EIC + PORT->Group[DEBUG_BOOT_TRACING_PORT].DIRCLR.reg = 1 << DEBUG_BOOT_TRACING_PIN; //Input + PORT->Group[DEBUG_BOOT_TRACING_PORT].OUTSET.reg = 1 << DEBUG_BOOT_TRACING_PIN; //High + PORT->Group[DEBUG_BOOT_TRACING_PORT].PINCFG[DEBUG_BOOT_TRACING_PIN].bit.INEN = 1; //Input Enable + PORT->Group[DEBUG_BOOT_TRACING_PORT].PINCFG[DEBUG_BOOT_TRACING_PIN].bit.PULLEN = 1; //Pull Enable + PORT->Group[DEBUG_BOOT_TRACING_PORT].PINCFG[DEBUG_BOOT_TRACING_PIN].bit.PMUXEN = 1; //Mux Enable + PORT->Group[DEBUG_BOOT_TRACING_PORT].PMUX[DEBUG_BOOT_TRACING_PIN / 2].bit.PMUXO = 0; //Mux A //Enable CLK_EIC_APB MCLK->APBAMASK.bit.EIC_ = 1; @@ -134,25 +188,33 @@ void debug_code_init(void) //Configure EIC EIC->CTRLA.bit.SWRST = 1; while (EIC->SYNCBUSY.bit.SWRST) {} - EIC->ASYNCH.reg = 1 << 15; - EIC->INTENSET.reg = 1 << 15; - EIC->CONFIG[1].bit.SENSE7 = 2; + EIC->ASYNCH.reg = DEBUG_BOOT_TRACING_EXTINTb; + EIC->INTENSET.reg = DEBUG_BOOT_TRACING_EXTINTb; + EIC->CONFIG[DEBUG_BOOT_TRACING_CONFIG_INDn].reg |= (EIC_CONFIG_SENSE0_FALL_Val << DEBUG_BOOT_TRACING_CONFIG_SENSEb); EIC->CTRLA.bit.ENABLE = 1; while (EIC->SYNCBUSY.bit.ENABLE) {} //Enable EIC IRQ - NVIC_EnableIRQ(EIC_15_IRQn); + NVIC_EnableIRQ(DEBUG_BOOT_TRACING_IRQn); } void debug_code_disable(void) { //Disable EIC IRQ - NVIC_DisableIRQ(EIC_15_IRQn); + NVIC_DisableIRQ(DEBUG_BOOT_TRACING_IRQn); //Disable EIC EIC->CTRLA.bit.ENABLE = 0; while (EIC->SYNCBUSY.bit.ENABLE) {} + //Default port configuration + PORT->Group[DEBUG_BOOT_TRACING_PORT].DIRCLR.reg = 1 << DEBUG_BOOT_TRACING_PIN; //Input + PORT->Group[DEBUG_BOOT_TRACING_PORT].OUTCLR.reg = 1 << DEBUG_BOOT_TRACING_PIN; //Low + PORT->Group[DEBUG_BOOT_TRACING_PORT].PINCFG[DEBUG_BOOT_TRACING_PIN].bit.INEN = 0; //Input Disable + PORT->Group[DEBUG_BOOT_TRACING_PORT].PINCFG[DEBUG_BOOT_TRACING_PIN].bit.PULLEN = 0; //Pull Disable + PORT->Group[DEBUG_BOOT_TRACING_PORT].PINCFG[DEBUG_BOOT_TRACING_PIN].bit.PMUXEN = 0; //Mux Disable + PORT->Group[DEBUG_BOOT_TRACING_PORT].PMUX[DEBUG_BOOT_TRACING_PIN / 2].bit.PMUXO = 0; //Mux A + //Disable CLK_EIC_APB MCLK->APBAMASK.bit.EIC_ = 0; } @@ -162,4 +224,4 @@ void debug_code_disable(void) void debug_code_init(void) {} void debug_code_disable(void) {} -#endif //DEBUG_BOOT_TRACING +#endif //DEBUG_BOOT_TRACING_ENABLE diff --git a/tmk_core/protocol/arm_atsam/d51_util.h b/tmk_core/protocol/arm_atsam/d51_util.h index 7a35f7989..71431942c 100644 --- a/tmk_core/protocol/arm_atsam/d51_util.h +++ b/tmk_core/protocol/arm_atsam/d51_util.h @@ -20,37 +20,65 @@ along with this program. If not, see . #include "samd51j18a.h" -//TODO: PS: Should bring these ports out to keyboard level configuration +/* Debug LED */ +#if DEBUG_LED_ENABLE == 1 +#define DBG_LED_ENA PORT->Group[DEBUG_LED_PORT].DIRSET.reg = (1 << DEBUG_LED_PIN) +#define DBG_LED_DIS PORT->Group[DEBUG_LED_PORT].DIRCLR.reg = (1 << DEBUG_LED_PIN) +#define DBG_LED_ON PORT->Group[DEBUG_LED_PORT].OUTSET.reg = (1 << DEBUG_LED_PIN) +#define DBG_LED_OFF PORT->Group[DEBUG_LED_PORT].OUTCLR.reg = (1 << DEBUG_LED_PIN) +#else +#define DBG_LED_ENA +#define DBG_LED_DIS +#define DBG_LED_ON +#define DBG_LED_OFF +#endif -//Debug LED PA27 -#define led_ena REG_PORT_DIRSET0 = 0x08000000 //PA27 Output -#define led_on REG_PORT_OUTSET0 = 0x08000000 //PA27 High -#define led_off REG_PORT_OUTCLR0 = 0x08000000 //PA27 Low +/* Debug Port 1 */ +#if DEBUG_PORT1_ENABLE == 1 +#define DBG_1_ENA PORT->Group[DEBUG_PORT1_PORT].DIRSET.reg = (1 << DEBUG_PORT1_PIN) +#define DBG_1_DIS PORT->Group[DEBUG_PORT1_PORT].DIRCLR.reg = (1 << DEBUG_PORT1_PIN) +#define DBG_1_ON PORT->Group[DEBUG_PORT1_PORT].OUTSET.reg = (1 << DEBUG_PORT1_PIN) +#define DBG_1_OFF PORT->Group[DEBUG_PORT1_PORT].OUTCLR.reg = (1 << DEBUG_PORT1_PIN) +#else +#define DBG_1_ENA +#define DBG_1_DIS +#define DBG_1_ON +#define DBG_1_OFF +#endif -//Debug Port PB30 -#define m15_ena REG_PORT_DIRSET1 = 0x40000000 //PB30 Output -#define m15_on REG_PORT_OUTSET1 = 0x40000000 //PB30 High -#define m15_off REG_PORT_OUTCLR1 = 0x40000000 //PB30 Low +/* Debug Port 2 */ +#if DEBUG_PORT2_ENABLE == 1 +#define DBG_2_ENA PORT->Group[DEBUG_PORT2_PORT].DIRSET.reg = (1 << DEBUG_PORT2_PIN) +#define DBG_2_DIS PORT->Group[DEBUG_PORT2_PORT].DIRCLR.reg = (1 << DEBUG_PORT2_PIN) +#define DBG_2_ON PORT->Group[DEBUG_PORT2_PORT].OUTSET.reg = (1 << DEBUG_PORT2_PIN) +#define DBG_2_OFF PORT->Group[DEBUG_PORT2_PORT].OUTCLR.reg = (1 << DEBUG_PORT2_PIN) +#else +#define DBG_2_ENA +#define DBG_2_DIS +#define DBG_2_ON +#define DBG_2_OFF +#endif -//Debug Port PB23 -#define m27_ena REG_PORT_DIRSET1 = 0x800000 //PB23 Output -#define m27_on REG_PORT_OUTSET1 = 0x800000 //PB23 High -#define m27_off REG_PORT_OUTCLR1 = 0x800000 //PB23 Low +/* Debug Port 3 */ +#if DEBUG_PORT3_ENABLE == 1 +#define DBG_3_ENA PORT->Group[DEBUG_PORT3_PORT].DIRSET.reg = (1 << DEBUG_PORT3_PIN) +#define DBG_3_DIS PORT->Group[DEBUG_PORT3_PORT].DIRCLR.reg = (1 << DEBUG_PORT3_PIN) +#define DBG_3_ON PORT->Group[DEBUG_PORT3_PORT].OUTSET.reg = (1 << DEBUG_PORT3_PIN) +#define DBG_3_OFF PORT->Group[DEBUG_PORT3_PORT].OUTCLR.reg = (1 << DEBUG_PORT3_PIN) +#else +#define DBG_3_ENA +#define DBG_3_DIS +#define DBG_3_ON +#define DBG_3_OFF +#endif -//Debug Port PB31 -#define m28_ena REG_PORT_DIRSET1 = 0x80000000 //PB31 Output -#define m28_on REG_PORT_OUTSET1 = 0x80000000 //PB31 High -#define m28_off REG_PORT_OUTCLR1 = 0x80000000 //PB31 Low - -#define m15_loop(M15X) {uint8_t M15L=M15X; while(M15L--){m15_on;CLK_delay_us(1);m15_off;}} - -void m15_print(uint32_t x); +void dbg_print(uint32_t x); void dled_print(uint32_t x, uint8_t long_pause); void debug_code_init(void); void debug_code_disable(void); -#ifdef DEBUG_BOOT_TRACING +#ifdef DEBUG_BOOT_TRACING_ENABLE #define DBGC(n) debug_code = n @@ -190,6 +218,6 @@ enum debug_code_list { #define DBGC(n) {} -#endif //DEBUG_BOOT_TRACING +#endif //DEBUG_BOOT_TRACING_ENABLE #endif //_D51_UTIL_H_ diff --git a/tmk_core/protocol/arm_atsam/i2c_master.c b/tmk_core/protocol/arm_atsam/i2c_master.c index ece9ee5db..f608a79cc 100644 --- a/tmk_core/protocol/arm_atsam/i2c_master.c +++ b/tmk_core/protocol/arm_atsam/i2c_master.c @@ -267,8 +267,8 @@ uint8_t I2C3733_Init_Control(void) CLK_delay_ms(1); - srdata.bit.IRST = 0; - SPI_WriteSRData(); + sr_exp_data.bit.IRST = 0; + SR_EXP_WriteData(); CLK_delay_ms(1); @@ -357,8 +357,8 @@ void I2C3733_Control_Set(uint8_t state) { DBGC(DC_I2C3733_CONTROL_SET_BEGIN); - srdata.bit.SDB_N = (state == 1 ? 1 : 0); - SPI_WriteSRData(); + sr_exp_data.bit.SDB_N = (state == 1 ? 1 : 0); + SR_EXP_WriteData(); DBGC(DC_I2C3733_CONTROL_SET_COMPLETE); } @@ -489,7 +489,7 @@ uint8_t i2c_led_q_request_room(uint8_t request_size) if (i2c_led_q_full >= 100) //Give the queue a chance to clear up { - led_on; + DBG_LED_ON; I2C_DMAC_LED_Init(); i2c_led_q_init(); return 1; diff --git a/tmk_core/protocol/arm_atsam/led_matrix.c b/tmk_core/protocol/arm_atsam/led_matrix.c index 729e042a6..e914fc80e 100644 --- a/tmk_core/protocol/arm_atsam/led_matrix.c +++ b/tmk_core/protocol/arm_atsam/led_matrix.c @@ -520,9 +520,9 @@ void led_matrix_task(void) //Process more data if not finished if (led_cur != lede) { - //m15_off; //debug profiling + //DBG_1_OFF; //debug profiling led_matrix_run(); - //m15_on; //debug profiling + //DBG_1_ON; //debug profiling } } diff --git a/tmk_core/protocol/arm_atsam/main_arm_atsam.c b/tmk_core/protocol/arm_atsam/main_arm_atsam.c index 13034a05d..2bda7d7c7 100644 --- a/tmk_core/protocol/arm_atsam/main_arm_atsam.c +++ b/tmk_core/protocol/arm_atsam/main_arm_atsam.c @@ -247,8 +247,13 @@ void main_subtasks(void) int main(void) { - led_ena; - m15_ena; + DBG_LED_ENA; + DBG_1_ENA; + DBG_1_OFF; + DBG_2_ENA; + DBG_2_OFF; + DBG_3_ENA; + DBG_3_OFF; debug_code_init(); @@ -256,7 +261,7 @@ int main(void) ADC0_init(); - SPI_Init(); + SR_EXP_Init(); i2c1_init(); @@ -274,8 +279,7 @@ int main(void) while (USB2422_Port_Detect_Init() == 0) {} - led_off; - m15_off; + DBG_LED_OFF; led_matrix_init(); diff --git a/tmk_core/protocol/arm_atsam/spi.c b/tmk_core/protocol/arm_atsam/spi.c index 6036a9220..e275ba13f 100644 --- a/tmk_core/protocol/arm_atsam/spi.c +++ b/tmk_core/protocol/arm_atsam/spi.c @@ -17,73 +17,70 @@ along with this program. If not, see . #include "arm_atsam_protocol.h" -Srdata_t srdata; +sr_exp_t sr_exp_data; -void SPI_WriteSRData(void) +void SR_EXP_WriteData(void) { - uint16_t timeout; + SR_EXP_RCLK_LO; - SC2_RCLCK_LO; + while (!(SR_EXP_SERCOM->SPI.INTFLAG.bit.DRE)) { DBGC(DC_SPI_WRITE_DRE); } - timeout = 50000; - while (!(SCSPI->SPI.INTFLAG.bit.DRE) && --timeout) { DBGC(DC_SPI_WRITE_DRE); } + SR_EXP_SERCOM->SPI.DATA.bit.DATA = sr_exp_data.reg & 0xFF; //Shift in bits 7-0 + while (!(SR_EXP_SERCOM->SPI.INTFLAG.bit.TXC)) { DBGC(DC_SPI_WRITE_TXC_1); } - SCSPI->SPI.DATA.bit.DATA = srdata.reg & 0xFF; //Shift in bits 7-0 - timeout = 50000; - while (!(SCSPI->SPI.INTFLAG.bit.TXC) && --timeout) { DBGC(DC_SPI_WRITE_TXC_1); } + SR_EXP_SERCOM->SPI.DATA.bit.DATA = (sr_exp_data.reg >> 8) & 0xFF; //Shift in bits 15-8 + while (!(SR_EXP_SERCOM->SPI.INTFLAG.bit.TXC)) { DBGC(DC_SPI_WRITE_TXC_2); } - SCSPI->SPI.DATA.bit.DATA = (srdata.reg >> 8) & 0xFF; //Shift in bits 15-8 - timeout = 50000; - while (!(SCSPI->SPI.INTFLAG.bit.TXC) && --timeout) { DBGC(DC_SPI_WRITE_TXC_2); } - - SC2_RCLCK_HI; + SR_EXP_RCLK_HI; } -void SPI_Init(void) +void SR_EXP_Init(void) { - uint32_t timeout; - DBGC(DC_SPI_INIT_BEGIN); CLK_set_spi_freq(CHAN_SERCOM_SPI, FREQ_SPI_DEFAULT); - PORT->Group[0].PMUX[6].bit.PMUXE = 2; - PORT->Group[0].PMUX[6].bit.PMUXO = 2; - PORT->Group[0].PINCFG[12].bit.PMUXEN = 1; - PORT->Group[0].PINCFG[13].bit.PMUXEN = 1; + //Set up MCU Shift Register pins + PORT->Group[SR_EXP_RCLK_PORT].DIRSET.reg = (1 << SR_EXP_RCLK_PIN); + PORT->Group[SR_EXP_OE_N_PORT].DIRSET.reg = (1 << SR_EXP_OE_N_PIN); + + //Set up MCU SPI pins + PORT->Group[SR_EXP_DATAOUT_PORT].PMUX[SR_EXP_DATAOUT_PIN / 2].bit.SR_EXP_DATAOUT_MUX_SEL = SR_EXP_DATAOUT_MUX; //MUX select for sercom + PORT->Group[SR_EXP_SCLK_PORT].PMUX[SR_EXP_SCLK_PIN / 2].bit.SR_EXP_SCLK_MUX_SEL = SR_EXP_SCLK_MUX; //MUX select for sercom + PORT->Group[SR_EXP_DATAOUT_PORT].PINCFG[SR_EXP_DATAOUT_PIN].bit.PMUXEN = 1; //MUX Enable + PORT->Group[SR_EXP_SCLK_PORT].PINCFG[SR_EXP_SCLK_PIN].bit.PMUXEN = 1; //MUX Enable - //Configure Shift Registers - SC2_DIRSET; - SC2_RCLCK_HI; - SC2_OE_DIS; + //Initialize Shift Register + SR_EXP_OE_N_DIS; + SR_EXP_RCLK_HI; - SCSPI->SPI.CTRLA.bit.DORD = 1; - SCSPI->SPI.CTRLA.bit.CPOL = 1; - SCSPI->SPI.CTRLA.bit.CPHA = 1; - SCSPI->SPI.CTRLA.bit.DIPO = 3; - SCSPI->SPI.CTRLA.bit.MODE = 3; //master + SR_EXP_SERCOM->SPI.CTRLA.bit.DORD = 1; //Data Order - LSB is transferred first + SR_EXP_SERCOM->SPI.CTRLA.bit.CPOL = 1; //Clock Polarity - SCK high when idle. Leading edge of cycle is falling. Trailing rising. + SR_EXP_SERCOM->SPI.CTRLA.bit.CPHA = 1; //Clock Phase - Leading Edge Falling, change, Trailing Edge - Rising, sample + SR_EXP_SERCOM->SPI.CTRLA.bit.DIPO = 3; //Data In Pinout - SERCOM PAD[3] is used as data input (Configure away from DOPO. Not using input.) + SR_EXP_SERCOM->SPI.CTRLA.bit.DOPO = 0; //Data Output PAD[0], Serial Clock PAD[1] + SR_EXP_SERCOM->SPI.CTRLA.bit.MODE = 3; //Operating Mode - Master operation - SCSPI->SPI.CTRLA.bit.ENABLE = 1; - timeout = 50000; - while (SCSPI->SPI.SYNCBUSY.bit.ENABLE && timeout--) { DBGC(DC_SPI_SYNC_ENABLING); } + SR_EXP_SERCOM->SPI.CTRLA.bit.ENABLE = 1; //Enable - Peripheral is enabled or being enabled + while (SR_EXP_SERCOM->SPI.SYNCBUSY.bit.ENABLE) { DBGC(DC_SPI_SYNC_ENABLING); } - srdata.reg = 0; - srdata.bit.HUB_CONNECT = 0; - srdata.bit.HUB_RESET_N = 0; - srdata.bit.S_UP = 0; - srdata.bit.E_UP_N = 1; - srdata.bit.S_DN1 = 1; - srdata.bit.E_DN1_N = 1; - srdata.bit.E_VBUS_1 = 0; - srdata.bit.E_VBUS_2 = 0; - srdata.bit.SRC_1 = 1; - srdata.bit.SRC_2 = 1; - srdata.bit.IRST = 1; - srdata.bit.SDB_N = 0; - SPI_WriteSRData(); + sr_exp_data.reg = 0; + sr_exp_data.bit.HUB_CONNECT = 0; + sr_exp_data.bit.HUB_RESET_N = 0; + sr_exp_data.bit.S_UP = 0; + sr_exp_data.bit.E_UP_N = 1; + sr_exp_data.bit.S_DN1 = 1; + sr_exp_data.bit.E_DN1_N = 1; + sr_exp_data.bit.E_VBUS_1 = 0; + sr_exp_data.bit.E_VBUS_2 = 0; + sr_exp_data.bit.SRC_1 = 1; + sr_exp_data.bit.SRC_2 = 1; + sr_exp_data.bit.IRST = 1; + sr_exp_data.bit.SDB_N = 0; + SR_EXP_WriteData(); - //Enable register output - SC2_OE_ENA; + //Enable Shift Register output + SR_EXP_OE_N_ENA; DBGC(DC_SPI_INIT_COMPLETE); } diff --git a/tmk_core/protocol/arm_atsam/spi.h b/tmk_core/protocol/arm_atsam/spi.h index 3412dfc36..4739b775d 100644 --- a/tmk_core/protocol/arm_atsam/spi.h +++ b/tmk_core/protocol/arm_atsam/spi.h @@ -18,21 +18,28 @@ along with this program. If not, see . #ifndef _SPI_H_ #define _SPI_H_ -//TODO: PS: Should bring ports to keyboard configuration +/* Macros for Shift Register control */ +#define SR_EXP_RCLK_LO PORT->Group[SR_EXP_RCLK_PORT].OUTCLR.reg = (1 << SR_EXP_RCLK_PIN) +#define SR_EXP_RCLK_HI PORT->Group[SR_EXP_RCLK_PORT].OUTSET.reg = (1 << SR_EXP_RCLK_PIN) +#define SR_EXP_OE_N_ENA PORT->Group[SR_EXP_OE_N_PORT].OUTCLR.reg = (1 << SR_EXP_OE_N_PIN) +#define SR_EXP_OE_N_DIS PORT->Group[SR_EXP_OE_N_PORT].OUTSET.reg = (1 << SR_EXP_OE_N_PIN) -#define SCSPI SERCOM2 +/* Determine bits to set for mux selection */ +#if SR_EXP_DATAOUT_PIN % 2 == 0 +#define SR_EXP_DATAOUT_MUX_SEL PMUXE +#else +#define SR_EXP_DATAOUT_MUX_SEL PMUXO +#endif -#define P14_DIR 0x00004000 /* PIN14 DIR Bit */ -#define P14_OUT 0x00004000 /* PIN14 OUT Bit */ -#define P15_DIR 0x00008000 /* PIN15 DIR Bit */ -#define P15_OUT 0x00008000 /* PIN15 OUT Bit */ - -#define SC2_RCLCK_LO REG_PORT_OUTCLR1 = P14_OUT /* PB14 Low, SC2_RCLCK Low */ -#define SC2_RCLCK_HI REG_PORT_OUTSET1 = P14_OUT /* PB14 High, SC2_RCLCK High */ -#define SC2_OE_ENA REG_PORT_OUTCLR1 = P15_OUT /* PB15 Low, SC2_OE_N Low (Shift register enabled) */ -#define SC2_OE_DIS REG_PORT_OUTSET1 = P15_OUT /* PB15 High, SC2_OE_N High (Shift register disabled) */ -#define SC2_DIRSET REG_PORT_DIRSET1 = P14_DIR | P15_DIR; /* PB14 PB15 OUT */ +/* Determine bits to set for mux selection */ +#if SR_EXP_SCLK_PIN % 2 == 0 +#define SR_EXP_SCLK_MUX_SEL PMUXE +#else +#define SR_EXP_SCLK_MUX_SEL PMUXO +#endif +/* Data structure to define Shift Register output expander hardware */ +/* This structure gets shifted into registers LSB first */ typedef union { struct { uint16_t RSVD4:1; /*!< bit: 0 */ @@ -53,11 +60,11 @@ typedef union { uint16_t HUB_CONNECT:1; /*!< bit: 15 SIGNAL VBUS CONNECT TO USB HUB WHEN 1 */ } bit; /*!< Structure used for bit access */ uint16_t reg; /*!< Type used for register access */ -} Srdata_t; +} sr_exp_t; -extern Srdata_t srdata; +extern sr_exp_t sr_exp_data; -void SPI_WriteSRData(void); -void SPI_Init(void); +void SR_EXP_WriteData(void); +void SR_EXP_Init(void); #endif //_SPI_H_ diff --git a/tmk_core/protocol/arm_atsam/usb/usb2422.c b/tmk_core/protocol/arm_atsam/usb/usb2422.c index 7c78e41d4..ac19bf4ea 100644 --- a/tmk_core/protocol/arm_atsam/usb/usb2422.c +++ b/tmk_core/protocol/arm_atsam/usb/usb2422.c @@ -77,7 +77,6 @@ void USB2422_init(void) Port *pport = PORT; Oscctrl *posc = OSCCTRL; Usb *pusb = USB; - Srdata_t *pspi = &srdata; DBGC(DC_USB2422_INIT_BEGIN); @@ -132,9 +131,9 @@ void USB2422_init(void) i2c0_init(); //IC2 clk must be high at USB2422 reset release time to signal SMB configuration - pspi->bit.HUB_CONNECT = 1; //connect signal - pspi->bit.HUB_RESET_N = 1; //reset high - SPI_WriteSRData(); + sr_exp_data.bit.HUB_CONNECT = 1; //connect signal + sr_exp_data.bit.HUB_RESET_N = 1; //reset high + SR_EXP_WriteData(); CLK_delay_us(100); @@ -150,16 +149,14 @@ void USB2422_init(void) void USB_reset(void) { - Srdata_t *pspi = &srdata; - DBGC(DC_USB_RESET_BEGIN); //pulse reset for at least 1 usec - pspi->bit.HUB_RESET_N = 0; //reset low - SPI_WriteSRData(); + sr_exp_data.bit.HUB_RESET_N = 0; //reset low + SR_EXP_WriteData(); CLK_delay_us(1); - pspi->bit.HUB_RESET_N = 1; //reset high to run - SPI_WriteSRData(); + sr_exp_data.bit.HUB_RESET_N = 1; //reset high to run + SR_EXP_WriteData(); CLK_delay_us(1); DBGC(DC_USB_RESET_COMPLETE); @@ -241,14 +238,14 @@ void USB_set_host_by_voltage(void) #ifndef MD_BOOTLOADER usb_extra_state = USB_EXTRA_STATE_UNKNOWN; #endif //MD_BOOTLOADER - srdata.bit.SRC_1 = 1; //USBC-1 available for test - srdata.bit.SRC_2 = 1; //USBC-2 available for test - srdata.bit.E_UP_N = 1; //HOST disable - srdata.bit.E_DN1_N = 1; //EXTRA disable - srdata.bit.E_VBUS_1 = 0; //USBC-1 disable full power I/O - srdata.bit.E_VBUS_2 = 0; //USBC-2 disable full power I/O + sr_exp_data.bit.SRC_1 = 1; //USBC-1 available for test + sr_exp_data.bit.SRC_2 = 1; //USBC-2 available for test + sr_exp_data.bit.E_UP_N = 1; //HOST disable + sr_exp_data.bit.E_DN1_N = 1; //EXTRA disable + sr_exp_data.bit.E_VBUS_1 = 0; //USBC-1 disable full power I/O + sr_exp_data.bit.E_VBUS_2 = 0; //USBC-2 disable full power I/O - SPI_WriteSRData(); + SR_EXP_WriteData(); CLK_delay_ms(250); @@ -262,37 +259,37 @@ void USB_set_host_by_voltage(void) if (v_con_1 > v_con_2) { - srdata.bit.S_UP = 0; //HOST to USBC-1 - srdata.bit.S_DN1 = 1; //EXTRA to USBC-2 - srdata.bit.SRC_1 = 1; //HOST on USBC-1 - srdata.bit.SRC_2 = 0; //EXTRA available on USBC-2 + sr_exp_data.bit.S_UP = 0; //HOST to USBC-1 + sr_exp_data.bit.S_DN1 = 1; //EXTRA to USBC-2 + sr_exp_data.bit.SRC_1 = 1; //HOST on USBC-1 + sr_exp_data.bit.SRC_2 = 0; //EXTRA available on USBC-2 - srdata.bit.E_VBUS_1 = 1; //USBC-1 enable full power I/O - srdata.bit.E_VBUS_2 = 0; //USBC-2 disable full power I/O + sr_exp_data.bit.E_VBUS_1 = 1; //USBC-1 enable full power I/O + sr_exp_data.bit.E_VBUS_2 = 0; //USBC-2 disable full power I/O - SPI_WriteSRData(); + SR_EXP_WriteData(); - srdata.bit.E_UP_N = 0; //HOST enable + sr_exp_data.bit.E_UP_N = 0; //HOST enable - SPI_WriteSRData(); + SR_EXP_WriteData(); usb_host_port = USB_HOST_PORT_1; } else { - srdata.bit.S_UP = 1; //EXTRA to USBC-1 - srdata.bit.S_DN1 = 0; //HOST to USBC-2 - srdata.bit.SRC_1 = 0; //EXTRA available on USBC-1 - srdata.bit.SRC_2 = 1; //HOST on USBC-2 + sr_exp_data.bit.S_UP = 1; //EXTRA to USBC-1 + sr_exp_data.bit.S_DN1 = 0; //HOST to USBC-2 + sr_exp_data.bit.SRC_1 = 0; //EXTRA available on USBC-1 + sr_exp_data.bit.SRC_2 = 1; //HOST on USBC-2 - srdata.bit.E_VBUS_1 = 0; //USBC-1 disable full power I/O - srdata.bit.E_VBUS_2 = 1; //USBC-2 enable full power I/O + sr_exp_data.bit.E_VBUS_1 = 0; //USBC-1 disable full power I/O + sr_exp_data.bit.E_VBUS_2 = 1; //USBC-2 enable full power I/O - SPI_WriteSRData(); + SR_EXP_WriteData(); - srdata.bit.E_UP_N = 0; //HOST enable + sr_exp_data.bit.E_UP_N = 0; //HOST enable - SPI_WriteSRData(); + SR_EXP_WriteData(); usb_host_port = USB_HOST_PORT_2; } @@ -325,15 +322,15 @@ uint8_t USB2422_Port_Detect_Init(void) if (v_con_1 > v_con_2) //Values updated from USB_set_host_by_voltage(); { //1 flash for port 1 detected - if (tmod > 500 && tmod < 600) { led_on; } - else { led_off; } + if (tmod > 500 && tmod < 600) { DBG_LED_ON; } + else { DBG_LED_OFF; } } else if (v_con_2 > v_con_1) //Values updated from USB_set_host_by_voltage(); { //2 flash for port 2 detected - if (tmod > 500 && tmod < 600) { led_on; } - else if (tmod > 700 && tmod < 800) { led_on; } - else { led_off; } + if (tmod > 500 && tmod < 600) { DBG_LED_ON; } + else if (tmod > 700 && tmod < 800) { DBG_LED_ON; } + else { DBG_LED_OFF; } } if (CLK_get_ms() > port_detect_retry_ms) @@ -357,12 +354,12 @@ void USB_ExtraSetState(uint8_t state) if (state == USB_EXTRA_STATE_DISABLED_UNTIL_REPLUG) state = USB_EXTRA_STATE_DISABLED; - if (usb_host_port == USB_HOST_PORT_1) srdata.bit.E_VBUS_2 = state; - else if (usb_host_port == USB_HOST_PORT_2) srdata.bit.E_VBUS_1 = state; + if (usb_host_port == USB_HOST_PORT_1) sr_exp_data.bit.E_VBUS_2 = state; + else if (usb_host_port == USB_HOST_PORT_2) sr_exp_data.bit.E_VBUS_1 = state; else return; - srdata.bit.E_DN1_N = !state; - SPI_WriteSRData(); + sr_exp_data.bit.E_DN1_N = !state; + SR_EXP_WriteData(); usb_extra_state = state_save; From e5380795b9a0b554673449675630062be3b09573 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 10 Dec 2018 11:38:57 -0800 Subject: [PATCH 656/788] Fix the LFKeyboards so they work with the QMK Configurator (#4591) * Make layer_info weak so it works with QMK Configurator * Fix lfk87 compile issue * Add fixes for lfkpad --- .../lfk78/keymaps/ca178858/rules.mk | 13 ----- .../lfk78/keymaps/default/rules.mk | 17 +------ .../lfkeyboards/lfk78/keymaps/iso/rules.mk | 14 +----- .../lfk78/keymaps/split_bs_osx/rules.mk | 18 +------ keyboards/lfkeyboards/lfk78/lfk78.c | 9 ++++ keyboards/lfkeyboards/lfk78/rules.mk | 49 +++++++++++++++++++ .../lfk87/keymaps/ca178858/rules.mk | 11 ----- .../lfk87/keymaps/default/rules.mk | 11 ----- .../lfkeyboards/lfk87/keymaps/gbchk/rules.mk | 13 ----- .../lfkeyboards/lfk87/keymaps/iso/rules.mk | 11 ----- keyboards/lfkeyboards/lfk87/lfk87.c | 9 ++++ keyboards/lfkeyboards/lfk87/rules.mk | 34 +++++++++++++ .../lfkpad/keymaps/default/rules.mk | 13 +---- keyboards/lfkeyboards/lfkpad/rules.mk | 28 +++++++++++ .../mini1800/keymaps/ca178858/rules.mk | 3 -- .../mini1800/keymaps/default/rules.mk | 4 -- keyboards/lfkeyboards/mini1800/mini1800.c | 10 ++++ 17 files changed, 143 insertions(+), 124 deletions(-) diff --git a/keyboards/lfkeyboards/lfk78/keymaps/ca178858/rules.mk b/keyboards/lfkeyboards/lfk78/keymaps/ca178858/rules.mk index 394c58b37..98e3d5a78 100644 --- a/keyboards/lfkeyboards/lfk78/keymaps/ca178858/rules.mk +++ b/keyboards/lfkeyboards/lfk78/keymaps/ca178858/rules.mk @@ -23,19 +23,6 @@ ISSI_ENABLE = yes # If the I2C pullup resistors aren't install this must be di WATCHDOG_ENABLE = yes # Resets keyboard if matrix_scan isn't run every 250ms -ifndef QUANTUM_DIR - include ../../../../Makefile -endif - -ifeq ($(strip $(ISSI_ENABLE)), yes) - TMK_COMMON_DEFS += -DISSI_ENABLE -endif - -ifeq ($(strip $(WATCHDOG_ENABLE)), yes) - TMK_COMMON_DEFS += -DWATCHDOG_ENABLE -endif - - # # Set the LFK78 hardware version. This is defined in rules.mk, but can be overidden here if desired # # # # RevB - first public release, uses atmega32u4, has audio, ISSI matrix split between RGB and backlight diff --git a/keyboards/lfkeyboards/lfk78/keymaps/default/rules.mk b/keyboards/lfkeyboards/lfk78/keymaps/default/rules.mk index 555ad9723..1477c3ac7 100644 --- a/keyboards/lfkeyboards/lfk78/keymaps/default/rules.mk +++ b/keyboards/lfkeyboards/lfk78/keymaps/default/rules.mk @@ -14,7 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. RGBLIGHT_CUSTOM_DRIVER = yes # RGB code is implemented in lefkeyboards, not qmk base SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = no @@ -23,21 +23,6 @@ ISSI_ENABLE = yes # If the I2C pullup resistors aren't install thi WATCHDOG_ENABLE = no # Resets keyboard if matrix_scan isn't run every 250ms CAPSLOCK_LED = no # Toggle back light LED of Caps Lock -ifndef QUANTUM_DIR - include ../../../../Makefile -endif - -ifeq ($(strip $(ISSI_ENABLE)), yes) - TMK_COMMON_DEFS += -DISSI_ENABLE -endif - -ifeq ($(strip $(WATCHDOG_ENABLE)), yes) - TMK_COMMON_DEFS += -DWATCHDOG_ENABLE -endif - -ifeq ($(strip $(CAPSLOCK_LED)), yes) - TMK_COMMON_DEFS += -DCAPSLOCK_LED -endif # Override the LFK78 hardware version: # diff --git a/keyboards/lfkeyboards/lfk78/keymaps/iso/rules.mk b/keyboards/lfkeyboards/lfk78/keymaps/iso/rules.mk index 147e95bc8..3cfc994cb 100644 --- a/keyboards/lfkeyboards/lfk78/keymaps/iso/rules.mk +++ b/keyboards/lfkeyboards/lfk78/keymaps/iso/rules.mk @@ -14,7 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. RGBLIGHT_CUSTOM_DRIVER = yes # RGB code is implemented in lefkeyboards, not qmk base SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = no @@ -23,18 +23,6 @@ ISSI_ENABLE = yes # If the I2C pullup resistors aren't install this mu WATCHDOG_ENABLE = no # Resets keyboard if matrix_scan isn't run every 250ms -ifndef QUANTUM_DIR - include ../../../../Makefile -endif - -ifeq ($(strip $(ISSI_ENABLE)), yes) - TMK_COMMON_DEFS += -DISSI_ENABLE -endif - -ifeq ($(strip $(WATCHDOG_ENABLE)), yes) - TMK_COMMON_DEFS += -DWATCHDOG_ENABLE -endif - # # Set the LFK78 hardware version. This is defined in rules.mk, but can be overidden here if desired # # diff --git a/keyboards/lfkeyboards/lfk78/keymaps/split_bs_osx/rules.mk b/keyboards/lfkeyboards/lfk78/keymaps/split_bs_osx/rules.mk index 555ad9723..f789b6866 100644 --- a/keyboards/lfkeyboards/lfk78/keymaps/split_bs_osx/rules.mk +++ b/keyboards/lfkeyboards/lfk78/keymaps/split_bs_osx/rules.mk @@ -14,7 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. RGBLIGHT_CUSTOM_DRIVER = yes # RGB code is implemented in lefkeyboards, not qmk base SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = no @@ -23,22 +23,6 @@ ISSI_ENABLE = yes # If the I2C pullup resistors aren't install thi WATCHDOG_ENABLE = no # Resets keyboard if matrix_scan isn't run every 250ms CAPSLOCK_LED = no # Toggle back light LED of Caps Lock -ifndef QUANTUM_DIR - include ../../../../Makefile -endif - -ifeq ($(strip $(ISSI_ENABLE)), yes) - TMK_COMMON_DEFS += -DISSI_ENABLE -endif - -ifeq ($(strip $(WATCHDOG_ENABLE)), yes) - TMK_COMMON_DEFS += -DWATCHDOG_ENABLE -endif - -ifeq ($(strip $(CAPSLOCK_LED)), yes) - TMK_COMMON_DEFS += -DCAPSLOCK_LED -endif - # Override the LFK78 hardware version: # # B - first public release, uses atmega32u4, has audio, ISSI matrix split between RGB and backlight diff --git a/keyboards/lfkeyboards/lfk78/lfk78.c b/keyboards/lfkeyboards/lfk78/lfk78.c index e02739e4f..60b7ab4ce 100644 --- a/keyboards/lfkeyboards/lfk78/lfk78.c +++ b/keyboards/lfkeyboards/lfk78/lfk78.c @@ -13,6 +13,15 @@ uint16_t click_hz = CLICK_HZ; uint16_t click_time = CLICK_MS; uint8_t click_toggle = CLICK_ENABLED; +__attribute__((weak)) +const Layer_Info layer_info[] = { + // Layer Mask Red Green Blue + {0x00000000, 0xFFFFFFFF, {0x0000, 0x0FFF, 0x0000}}, // base layer - green + {0x00000002, 0xFFFFFFFE, {0x0000, 0x0000, 0x0FFF}}, // function layer - blue + {0x00000004, 0xFFFFFFFC, {0x0FFF, 0x0000, 0x0FFF}}, // settings layer - magenta + {0xFFFFFFFF, 0xFFFFFFFF, {0x0FFF, 0x0FFF, 0x0FFF}}, // unknown layer - REQUIRED - white +}; + void matrix_init_kb(void) { matrix_init_user(); diff --git a/keyboards/lfkeyboards/lfk78/rules.mk b/keyboards/lfkeyboards/lfk78/rules.mk index 091cd7755..cc314c97a 100644 --- a/keyboards/lfkeyboards/lfk78/rules.mk +++ b/keyboards/lfkeyboards/lfk78/rules.mk @@ -32,3 +32,52 @@ F_USB = $(F_CPU) # Interrupt driven control endpoint task(+60) OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = yes # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. +RGBLIGHT_CUSTOM_DRIVER = yes # RGB code is implemented in lefkeyboards, not qmk base +SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend +TAP_DANCE_ENABLE = no + +ISSI_ENABLE = yes # If the I2C pullup resistors aren't install this must be disabled +WATCHDOG_ENABLE = no # Resets keyboard if matrix_scan isn't run every 250ms +CAPSLOCK_LED = no # Toggle back light LED of Caps Lock + + +ifeq ($(strip $(ISSI_ENABLE)), yes) + TMK_COMMON_DEFS += -DISSI_ENABLE +endif + +ifeq ($(strip $(WATCHDOG_ENABLE)), yes) + TMK_COMMON_DEFS += -DWATCHDOG_ENABLE +endif + +ifeq ($(strip $(CAPSLOCK_LED)), yes) + TMK_COMMON_DEFS += -DCAPSLOCK_LED +endif + +# # Set the LFK78 hardware version. This is defined in rules.mk, but can be overidden here if desired +# # +# # RevB - first public release, uses atmega32u4, has audio, ISSI matrix split between RGB and backlight +# # RevC/D - at90usb1286, no audio, ISSI device 0 is backlight, 4 is RGB +# # +# # Set to B, C or D +# LFK_REV = D + +# ifeq ($(LFK_REV), B) +# MCU = atmega32u4 +# else +# MCU = at90usb1286 +# endif +# OPT_DEFS += -DLFK_REV_$(LFK_REV) +# OPT_DEFS += -DUSB_PRODUCT=\"LFK_Rev$(LFK_REV)\" diff --git a/keyboards/lfkeyboards/lfk87/keymaps/ca178858/rules.mk b/keyboards/lfkeyboards/lfk87/keymaps/ca178858/rules.mk index 9819cdbee..f28ec80ea 100644 --- a/keyboards/lfkeyboards/lfk87/keymaps/ca178858/rules.mk +++ b/keyboards/lfkeyboards/lfk87/keymaps/ca178858/rules.mk @@ -23,17 +23,6 @@ ISSI_ENABLE = yes # If the I2C pullup resistors aren't install this must be di WATCHDOG_ENABLE = yes # Resets keyboard if matrix_scan isn't run every 250ms -ifndef QUANTUM_DIR - include ../../../../Makefile -endif - -ifeq ($(strip $(ISSI_ENABLE)), yes) - TMK_COMMON_DEFS += -DISSI_ENABLE -endif - -ifeq ($(strip $(WATCHDOG_ENABLE)), yes) - TMK_COMMON_DEFS += -DWATCHDOG_ENABLE -endif # # Set the LFK78 hardware version. This is defined in rules.mk, but can be overidden here if desired diff --git a/keyboards/lfkeyboards/lfk87/keymaps/default/rules.mk b/keyboards/lfkeyboards/lfk87/keymaps/default/rules.mk index c1f1070fd..c079c264e 100644 --- a/keyboards/lfkeyboards/lfk87/keymaps/default/rules.mk +++ b/keyboards/lfkeyboards/lfk87/keymaps/default/rules.mk @@ -23,17 +23,6 @@ ISSI_ENABLE = yes # If the I2C pullup resistors aren't install this must be di WATCHDOG_ENABLE = no # Resets keyboard if matrix_scan isn't run every 250ms -ifndef QUANTUM_DIR - include ../../../../Makefile -endif - -ifeq ($(strip $(ISSI_ENABLE)), yes) - TMK_COMMON_DEFS += -DISSI_ENABLE -endif - -ifeq ($(strip $(WATCHDOG_ENABLE)), yes) - TMK_COMMON_DEFS += -DWATCHDOG_ENABLE -endif # Override the LFK87 hardware version. diff --git a/keyboards/lfkeyboards/lfk87/keymaps/gbchk/rules.mk b/keyboards/lfkeyboards/lfk87/keymaps/gbchk/rules.mk index c1f1070fd..f7b39455b 100644 --- a/keyboards/lfkeyboards/lfk87/keymaps/gbchk/rules.mk +++ b/keyboards/lfkeyboards/lfk87/keymaps/gbchk/rules.mk @@ -23,19 +23,6 @@ ISSI_ENABLE = yes # If the I2C pullup resistors aren't install this must be di WATCHDOG_ENABLE = no # Resets keyboard if matrix_scan isn't run every 250ms -ifndef QUANTUM_DIR - include ../../../../Makefile -endif - -ifeq ($(strip $(ISSI_ENABLE)), yes) - TMK_COMMON_DEFS += -DISSI_ENABLE -endif - -ifeq ($(strip $(WATCHDOG_ENABLE)), yes) - TMK_COMMON_DEFS += -DWATCHDOG_ENABLE -endif - - # Override the LFK87 hardware version. # # A - Green PCB. at90usb1286 Only 3 exist diff --git a/keyboards/lfkeyboards/lfk87/keymaps/iso/rules.mk b/keyboards/lfkeyboards/lfk87/keymaps/iso/rules.mk index 68e200a5d..7823dea78 100644 --- a/keyboards/lfkeyboards/lfk87/keymaps/iso/rules.mk +++ b/keyboards/lfkeyboards/lfk87/keymaps/iso/rules.mk @@ -23,17 +23,6 @@ ISSI_ENABLE = yes # If the I2C pullup resistors aren't install thi WATCHDOG_ENABLE = no # Resets keyboard if matrix_scan isn't run every 250ms -ifndef QUANTUM_DIR - include ../../../../Makefile -endif - -ifeq ($(strip $(ISSI_ENABLE)), yes) - TMK_COMMON_DEFS += -DISSI_ENABLE -endif - -ifeq ($(strip $(WATCHDOG_ENABLE)), yes) - TMK_COMMON_DEFS += -DWATCHDOG_ENABLE -endif # # Set the LFK78 hardware version. This is defined in rules.mk, but can be overidden here if desired diff --git a/keyboards/lfkeyboards/lfk87/lfk87.c b/keyboards/lfkeyboards/lfk87/lfk87.c index e9f184e36..4b34fcef7 100644 --- a/keyboards/lfkeyboards/lfk87/lfk87.c +++ b/keyboards/lfkeyboards/lfk87/lfk87.c @@ -14,6 +14,15 @@ uint16_t click_hz = CLICK_HZ; uint16_t click_time = CLICK_MS; uint8_t click_toggle = CLICK_ENABLED; +__attribute__((weak)) +const Layer_Info layer_info[] = { + // Layer Mask Red Green Blue + {0x00000000, 0xFFFFFFFF, {0x00, 0xFF, 0x00}}, // base layers - green + {0x00000002, 0xFFFFFFFE, {0x00, 0x00, 0xFF}}, // function layer - blue + {0x00000004, 0xFFFFFFFC, {0xFF, 0x00, 0xFF}}, // settings layer - magenta + {0xFFFFFFFF, 0xFFFFFFFF, {0xFF, 0xFF, 0xFF}}, // unknown layer - REQUIRED - white +}; + void matrix_init_kb(void) { // put your keyboard start-up code here diff --git a/keyboards/lfkeyboards/lfk87/rules.mk b/keyboards/lfkeyboards/lfk87/rules.mk index 19b41de09..c10f47306 100644 --- a/keyboards/lfkeyboards/lfk87/rules.mk +++ b/keyboards/lfkeyboards/lfk87/rules.mk @@ -31,3 +31,37 @@ F_USB = $(F_CPU) OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT LAYOUTS = tkl_ansi tkl_iso + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# + +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = yes # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = yes # Enable RGB underlight +RGBLIGHT_CUSTOM_DRIVER = yes # RGB code is implemented in lefkeyboards, not WS2812 +SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend +TAP_DANCE_ENABLE = no + +ISSI_ENABLE = yes # If the I2C pullup resistors aren't install this must be disabled +WATCHDOG_ENABLE = no # Resets keyboard if matrix_scan isn't run every 250ms + + + +ifeq ($(strip $(ISSI_ENABLE)), yes) + OPT_DEFS += -DISSI_ENABLE +endif + +ifeq ($(strip $(WATCHDOG_ENABLE)), yes) + OPT_DEFS += -DWATCHDOG_ENABLE +endif diff --git a/keyboards/lfkeyboards/lfkpad/keymaps/default/rules.mk b/keyboards/lfkeyboards/lfkpad/keymaps/default/rules.mk index 1653f4e30..cc21b32dc 100644 --- a/keyboards/lfkeyboards/lfkpad/keymaps/default/rules.mk +++ b/keyboards/lfkeyboards/lfkpad/keymaps/default/rules.mk @@ -14,7 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. RGBLIGHT_CUSTOM_DRIVER = yes # RGB code is implemented in lefkeyboards, not qmk base SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = no @@ -23,17 +23,6 @@ ISSI_ENABLE = yes # If the I2C pullup resistors aren't install this mu WATCHDOG_ENABLE = no # Resets keyboard if matrix_scan isn't run every 250ms -ifndef QUANTUM_DIR - include ../../../../Makefile -endif - -ifeq ($(strip $(ISSI_ENABLE)), yes) - TMK_COMMON_DEFS += -DISSI_ENABLE -endif - -ifeq ($(strip $(WATCHDOG_ENABLE)), yes) - TMK_COMMON_DEFS += -DWATCHDOG_ENABLE -endif # # Set the LFK78 hardware version. This is defined in rules.mk, but can be overidden here if desired diff --git a/keyboards/lfkeyboards/lfkpad/rules.mk b/keyboards/lfkeyboards/lfkpad/rules.mk index e28e398cc..83553f64c 100644 --- a/keyboards/lfkeyboards/lfkpad/rules.mk +++ b/keyboards/lfkeyboards/lfkpad/rules.mk @@ -11,3 +11,31 @@ ARCH = AVR8 OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT LAYOUTS = numpad_6x4 + +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. +RGBLIGHT_CUSTOM_DRIVER = yes # RGB code is implemented in lefkeyboards, not qmk base +SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend +TAP_DANCE_ENABLE = no + +ISSI_ENABLE = yes # If the I2C pullup resistors aren't install this must be disabled +WATCHDOG_ENABLE = no # Resets keyboard if matrix_scan isn't run every 250ms + + +ifeq ($(strip $(ISSI_ENABLE)), yes) + TMK_COMMON_DEFS += -DISSI_ENABLE +endif + +ifeq ($(strip $(WATCHDOG_ENABLE)), yes) + TMK_COMMON_DEFS += -DWATCHDOG_ENABLE +endif diff --git a/keyboards/lfkeyboards/mini1800/keymaps/ca178858/rules.mk b/keyboards/lfkeyboards/mini1800/keymaps/ca178858/rules.mk index 16452df67..2c6035d58 100644 --- a/keyboards/lfkeyboards/mini1800/keymaps/ca178858/rules.mk +++ b/keyboards/lfkeyboards/mini1800/keymaps/ca178858/rules.mk @@ -23,9 +23,6 @@ ISSI_ENABLE = yes # If the I2C pullup resistors aren't install this must be di WATCHDOG_ENABLE = yes # Resets keyboard if matrix_scan isn't run every 250ms -ifndef QUANTUM_DIR - include ../../../../Makefile -endif ifeq ($(strip $(ISSI_ENABLE)), yes) TMK_COMMON_DEFS += -DISSI_ENABLE diff --git a/keyboards/lfkeyboards/mini1800/keymaps/default/rules.mk b/keyboards/lfkeyboards/mini1800/keymaps/default/rules.mk index d6e35e353..1598173f3 100644 --- a/keyboards/lfkeyboards/mini1800/keymaps/default/rules.mk +++ b/keyboards/lfkeyboards/mini1800/keymaps/default/rules.mk @@ -23,10 +23,6 @@ ISSI_ENABLE = yes # If the I2C pullup resistors aren't install this must be di WATCHDOG_ENABLE = yes # Resets keyboard if matrix_scan isn't run every 250ms -ifndef QUANTUM_DIR - include ../../../../Makefile -endif - ifeq ($(strip $(ISSI_ENABLE)), yes) TMK_COMMON_DEFS += -DISSI_ENABLE endif diff --git a/keyboards/lfkeyboards/mini1800/mini1800.c b/keyboards/lfkeyboards/mini1800/mini1800.c index f0692d46c..d5f4193c1 100644 --- a/keyboards/lfkeyboards/mini1800/mini1800.c +++ b/keyboards/lfkeyboards/mini1800/mini1800.c @@ -17,6 +17,16 @@ uint16_t click_time = CLICK_MS; uint8_t click_toggle = CLICK_ENABLED; float my_song[][2] = SONG(ZELDA_PUZZLE); +// Colors of the layer indicator LED +// This list needs to define layer 0xFFFFFFFF, it is the end of the list, and the unknown layer +__attribute__((weak)) +const Layer_Info layer_info[] = { + // Layer Mask Red Green Blue + {0x00000000, 0xFFFFFFFF, {0x00, 0xFF, 0x00}}, // base layers - green + {0x00000002, 0xFFFFFFFE, {0x00, 0x00, 0xFF}}, // function layer - blue + {0x00000004, 0xFFFFFFFC, {0xFF, 0x00, 0xFF}}, // settings layer - magenta + {0xFFFFFFFF, 0xFFFFFFFF, {0xFF, 0xFF, 0xFF}}, // unknown layer - REQUIRED - white +}; void matrix_init_kb(void) { From 3bef186ea6ba9da445a16d2ff72d2737e1d7c974 Mon Sep 17 00:00:00 2001 From: "Peter K. Cawley" Date: Mon, 10 Dec 2018 16:15:15 -0800 Subject: [PATCH 657/788] adjust install_avr function to use unzip for broader compatibility (#4596) On a laptop with god knows what mandatory security software (Cylance?), running up-to-date Windows 10 with msys2 mingw-64, attempting to install the AVR toolkit results in the following error: ``` 1 [main] 7z (13316) C:\msys32\usr\lib\p7zip\7z.exe: *** fatal error - cygheap base mismatch detected - 0x612A5410/0x2375410. This problem is probably due to using incompatible versions of the cygwin DLL. Search for cygwin1.dll using the Windows Start->Find/Search facility and delete all but the most recent version. The most recent version *should* reside in x:\cygwin\bin, where 'x' is the drive on which you have installed the cygwin distribution. Rebooting is also suggested if you are unable to find another cygwin DLL. ``` This appears to be related in some way, based on my research, to ASLR functionality in security software. Since I'm unable to override whatever is enforcing ASLR on my system, after trying several other approaches (removing other copies of msys-2.0.dll, which is what this is apparently actually referencing, rebasing that file in Windows to address 0x61000000, a few other things) I simply edited the installation shell script to use `unzip` instead of 7zip; `unzip`'s binary does not provoke a mismatch error and the installation proceeds as it should. I'm not aware of the reason why some parts of the install script use `unzip` (e.g. `install_arm`) and others use 7zip, but it seems that for broader compatibility and sparing users on locked down machines the 120 minutes or so of futzing this took me to fix, it might be better to just use `unzip` in all cases. Note: There is another function that uses 7zip, `extract_flip`. The line is `7z -oflip x FlipInstaller.exe`. I'm not sure what this is doing, or whether it's possible to do it with `unzip`, but it produces the same error. I haven't attempted to fix that in this PR, but it might be good to fix it for the same reason. --- util/msys2_install.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/util/msys2_install.sh b/util/msys2_install.sh index a0548ad9b..fcb488249 100755 --- a/util/msys2_install.sh +++ b/util/msys2_install.sh @@ -14,8 +14,9 @@ source "$dir/win_shared_install.sh" function install_avr { rm -f -r "$avrtools" wget "http://ww1.microchip.com/downloads/en/DeviceDoc/avr8-gnu-toolchain-3.6.1.1752-win32.any.x86.zip" - 7z x avr8-gnu-toolchain-3.6.1.1752-win32.any.x86.zip - mv avr8-gnu-toolchain-win32_x86/ avr8-gnu-toolchain + echo "Extracting AVR toolchain..." + unzip -q avr8-gnu-toolchain-3.6.1.1752-win32.any.x86.zip + mv avr8-gnu-toolchain-win32_x86/ avr8-gnu-toolchain rm __MACOSX -R rm avr8-gnu-toolchain-3.6.1.1752-win32.any.x86.zip pacman --needed -S mingw-w64-x86_64-avrdude From a003be1e9c195a4e1d74e563eaf261eec0e9a50b Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Tue, 11 Dec 2018 00:19:55 -0800 Subject: [PATCH 658/788] handwired/pilcrow Refactor, Configurator support and readme update (#4602) * handwired/pilcrow: refactor - layout macro renamed from KEYMAP to LAYOUT - keymap now uses #include QMK_KEYBOARD_H - layers reformatted for readability - removed unused and deprecated fn_actions and action_get_macro blocks - keymap config.h - updated to use #pragma once - removed redundant config.h include * handwired/pilcrow: Configurator support * handwired/pilcrow: readme update Updated readme.md file to use modern template formatting. --- keyboards/handwired/pilcrow/info.json | 53 ++++++++ .../pilcrow/keymaps/default/config.h | 7 +- .../pilcrow/keymaps/default/keymap.c | 118 ++++++++---------- keyboards/handwired/pilcrow/pilcrow.h | 2 +- keyboards/handwired/pilcrow/readme.md | 30 ++--- 5 files changed, 113 insertions(+), 97 deletions(-) create mode 100644 keyboards/handwired/pilcrow/info.json diff --git a/keyboards/handwired/pilcrow/info.json b/keyboards/handwired/pilcrow/info.json new file mode 100644 index 000000000..824e2abbc --- /dev/null +++ b/keyboards/handwired/pilcrow/info.json @@ -0,0 +1,53 @@ +{ + "keyboard_name": "pilcrow", + "url": "", + "maintainer": "qmk", + "width": 10, + "height": 4, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"Q", "x":0, "y":0}, + {"label":"W", "x":1, "y":0}, + {"label":"E", "x":2, "y":0}, + {"label":"R", "x":3, "y":0}, + {"label":"T", "x":4, "y":0}, + {"label":"Y", "x":5, "y":0}, + {"label":"U", "x":6, "y":0}, + {"label":"I", "x":7, "y":0}, + {"label":"O", "x":8, "y":0}, + {"label":"P", "x":9, "y":0}, + {"label":"A", "x":0, "y":1}, + {"label":"S", "x":1, "y":1}, + {"label":"D", "x":2, "y":1}, + {"label":"F", "x":3, "y":1}, + {"label":"G", "x":4, "y":1}, + {"label":"H", "x":5, "y":1}, + {"label":"J", "x":6, "y":1}, + {"label":"K", "x":7, "y":1}, + {"label":"L", "x":8, "y":1}, + {"label":";", "x":9, "y":1}, + {"label":"Z", "x":0, "y":2}, + {"label":"X", "x":1, "y":2}, + {"label":"C", "x":2, "y":2}, + {"label":"V", "x":3, "y":2}, + {"label":"B", "x":4, "y":2}, + {"label":"N", "x":5, "y":2}, + {"label":"M", "x":6, "y":2}, + {"label":",", "x":7, "y":2}, + {"label":".", "x":8, "y":2}, + {"label":"/", "x":9, "y":2}, + {"label":"Ctrl", "x":0, "y":3}, + {"label":"Alt", "x":1, "y":3}, + {"label":"GUI", "x":2, "y":3}, + {"label":"MO(1)", "x":3, "y":3}, + {"label":"Space", "x":4, "y":3}, + {"label":"Shift / Space", "x":5, "y":3}, + {"label":"MO(2)", "x":6, "y":3}, + {"label":"MO(3)", "x":7, "y":3}, + {"label":"Delete", "x":8, "y":3}, + {"label":"Esc", "x":9, "y":3} + ] + } + } +} diff --git a/keyboards/handwired/pilcrow/keymaps/default/config.h b/keyboards/handwired/pilcrow/keymaps/default/config.h index df06a2620..271f48d00 100644 --- a/keyboards/handwired/pilcrow/keymaps/default/config.h +++ b/keyboards/handwired/pilcrow/keymaps/default/config.h @@ -1,8 +1,3 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" +#pragma once // place overrides here - -#endif \ No newline at end of file diff --git a/keyboards/handwired/pilcrow/keymaps/default/keymap.c b/keyboards/handwired/pilcrow/keymaps/default/keymap.c index e382e4c6a..617ff4f6c 100644 --- a/keyboards/handwired/pilcrow/keymaps/default/keymap.c +++ b/keyboards/handwired/pilcrow/keymaps/default/keymap.c @@ -1,76 +1,58 @@ -#include "pilcrow.h" -#define _______ KC_TRNS +#include QMK_KEYBOARD_H + +#define SFT_SPC MT(MOD_LSFT, KC_SPC) + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[0] = KEYMAP( \ - KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, \ - KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, \ - KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, \ - KC_LCTL, KC_LALT, KC_LGUI, MO(1), KC_SPC, MT(MOD_LSFT, KC_SPC), MO(2), MO(3), KC_DEL, KC_ESC \ -), + [0] = LAYOUT( \ + KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, \ + KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, \ + KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, \ + KC_LCTL, KC_LALT, KC_LGUI, MO(1), KC_SPC, SFT_SPC, MO(2), MO(3), KC_DEL, KC_ESC \ + ), -/* Colemak - * ,-----------------------------------------------------------------------------------. - * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | R | S | T | D | H | N | E | I | O | " | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' - */ -[1] = KEYMAP( \ - KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, \ - KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, \ - KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),KC_PIPE, S(KC_QUOT), \ - _______, _______, _______, _______, KC_BSPC, KC_BSPC, _______, KC_MNXT, KC_VOLD, KC_GRV \ -), -[2] = KEYMAP( \ - KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, \ - KC_TAB, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT,KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, \ - OSM(MOD_LSFT), KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_BSLS, KC_QUOT, \ - _______, _______, _______, _______, KC_ENT, KC_ENT, _______, KC_MNXT, KC_VOLD, KC_VOLU \ -), + /* Colemak + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | R | S | T | D | H | N | E | I | O | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ + [1] = LAYOUT( \ + KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, \ + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, \ + KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_NUHS), S(KC_NUBS), KC_PIPE, S(KC_QUOT), \ + _______, _______, _______, _______, KC_BSPC, KC_BSPC, _______, KC_MNXT, KC_VOLD, KC_GRV \ + ), + [2] = LAYOUT( \ + KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, \ + KC_TAB, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, \ + OSM(MOD_LSFT), KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_BSLS, KC_QUOT, \ + _______, _______, _______, _______, KC_ENT, KC_ENT, _______, KC_MNXT, KC_VOLD, KC_VOLU \ + ), -/* Adjust (Lower + Raise) - * ,-----------------------------------------------------------------------------------. - * | | Reset| | | | | | | | | | Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | | | | | | | | | | | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | | - * `-----------------------------------------------------------------------------------' - */ -[3] = KEYMAP( \ - RESET, KC_UP, _______, _______, _______, _______, _______, KC_MS_WH_DOWN, KC_MS_U, KC_MS_WH_UP, \ - KC_LEFT, KC_DOWN, KC_RIGHT, AU_ON, AU_OFF, AG_NORM, AG_SWAP, KC_MS_L,KC_MS_D, KC_MS_R, \ - RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, \ - _______, _______, _______, _______, KC_MS_BTN1, KC_MS_BTN2, _______, _______, _______, _______ \ -) + /* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | Reset| | | | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ + [3] = LAYOUT( \ + RESET, KC_UP, _______, _______, _______, _______, _______, KC_WH_D, KC_MS_U, KC_WH_U, \ + KC_LEFT, KC_DOWN, KC_RGHT, AU_ON, AU_OFF, AG_NORM, AG_SWAP, KC_MS_L, KC_MS_D, KC_MS_R, \ + RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, \ + _______, _______, _______, _______, KC_BTN1, KC_BTN2, _______, _______, _______, _______ \ + ) }; -const uint16_t PROGMEM fn_actions[] = { - -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - // MACRODOWN only works in this function - switch(id) { - case 0: - if (record->event.pressed) { - register_code(KC_RSFT); - } else { - unregister_code(KC_RSFT); - } - break; - } - return MACRO_NONE; -}; - - void matrix_init_user(void) { } diff --git a/keyboards/handwired/pilcrow/pilcrow.h b/keyboards/handwired/pilcrow/pilcrow.h index 7138ccb3f..37d2914f2 100644 --- a/keyboards/handwired/pilcrow/pilcrow.h +++ b/keyboards/handwired/pilcrow/pilcrow.h @@ -7,7 +7,7 @@ // The following is an example using the Planck MIT layout // The first section contains all of the arguements // The second converts the arguments into a two-dimensional array -#define KEYMAP( \ +#define LAYOUT( \ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, \ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, \ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, \ diff --git a/keyboards/handwired/pilcrow/readme.md b/keyboards/handwired/pilcrow/readme.md index 7a7f6d2af..79f22518e 100644 --- a/keyboards/handwired/pilcrow/readme.md +++ b/keyboards/handwired/pilcrow/readme.md @@ -1,28 +1,14 @@ -pilcrow keyboard firmware -====================== +# pilcrow -## Quantum MK Firmware +![pilcrow](https://i.imgur.com/KQdn2kg.jpg) -For the full Quantum feature list, see [the parent readme](/). +A 4x10 ortholinear keyboard powered by a Teensy. -## Building +Keyboard Maintainer: [The QMK Community](https://github.com/qmk) +Hardware Supported: Teensy-powered pilcrow -Download or clone the whole firmware and navigate to the keyboards/pilcrow folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file. +Make example for this keyboard (after setting up your build environment): -Depending on which keymap you would like to use, you will have to compile slightly differently. + make handwired/pilcrow:default -### Default - -To build with the default keymap, simply run `make default`. - -### Other Keymaps - -Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create a folder with the name of your keymap in the keymaps folder, and see keymap documentation (you can find in top readme.md) and existant keymap files. - -To build the firmware binary hex file with a keymap just do `make` with a keymap like this: - -``` -$ make [default|jack|] -``` - -Keymaps follow the format **__\.c__** and are stored in the `keymaps` folder. +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). From cce19d265d22f13effd675e38122f7776682021f Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Tue, 11 Dec 2018 07:29:17 -0800 Subject: [PATCH 659/788] Reduce compile size of KBD6x (#4599) Disable some functionality so that it will compile under size in the QMK Configurator --- keyboards/kbd6x/config.h | 5 ++--- keyboards/kbd6x/rules.mk | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/keyboards/kbd6x/config.h b/keyboards/kbd6x/config.h index 6a5ebf062..9f23fb867 100644 --- a/keyboards/kbd6x/config.h +++ b/keyboards/kbd6x/config.h @@ -169,8 +169,8 @@ along with this program. If not, see . //#define NO_ACTION_LAYER //#define NO_ACTION_TAPPING //#define NO_ACTION_ONESHOT -//#define NO_ACTION_MACRO -//#define NO_ACTION_FUNCTION +#define NO_ACTION_MACRO +#define NO_ACTION_FUNCTION /* * MIDI options @@ -222,4 +222,3 @@ along with this program. If not, see . #define LCD_E_PIN 1 //< pin for Enable line #endif */ - diff --git a/keyboards/kbd6x/rules.mk b/keyboards/kbd6x/rules.mk index 5c7a3877e..e9b61a76d 100644 --- a/keyboards/kbd6x/rules.mk +++ b/keyboards/kbd6x/rules.mk @@ -55,7 +55,7 @@ BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) MOUSEKEY_ENABLE = no # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) CONSOLE_ENABLE = yes # Console for debug(+400) -COMMAND_ENABLE = yes # Commands for debug and configuration +COMMAND_ENABLE = no # Commands for debug and configuration # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend # if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work From 930e1dfc4c4d366fd85c6ce0652a071beaab91c0 Mon Sep 17 00:00:00 2001 From: Wilba Date: Wed, 12 Dec 2018 02:31:13 +1100 Subject: [PATCH 660/788] Changing Zeal60/Zeal65 VID/PID to be unique (#4605) --- keyboards/zeal60/config.h | 6 +++--- keyboards/zeal65/config.h | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/keyboards/zeal60/config.h b/keyboards/zeal60/config.h index d1bd3f6a1..6f3d43473 100644 --- a/keyboards/zeal60/config.h +++ b/keyboards/zeal60/config.h @@ -18,12 +18,12 @@ #include "config_common.h" // USB Device descriptor parameter -#define VENDOR_ID 0xFEED -#define PRODUCT_ID 0x6060 +#define VENDOR_ID 0x5A45 // ZealPC ("ZE") +#define PRODUCT_ID 0x0060 // Zeal60 #define DEVICE_VER 0x0001 #define MANUFACTURER ZealPC #define PRODUCT Zeal60 -#define DESCRIPTION Zeal60 (QMK Firmware) +#define DESCRIPTION Zeal60 // key matrix size #define MATRIX_ROWS 5 diff --git a/keyboards/zeal65/config.h b/keyboards/zeal65/config.h index 63ce1c12a..24aae5e36 100644 --- a/keyboards/zeal65/config.h +++ b/keyboards/zeal65/config.h @@ -18,12 +18,12 @@ #include "config_common.h" // USB Device descriptor parameter -#define VENDOR_ID 0xFEED -#define PRODUCT_ID 0x6065 +#define VENDOR_ID 0x5A45 // ZealPC ("ZE") +#define PRODUCT_ID 0x0065 // Zeal65 #define DEVICE_VER 0x0001 #define MANUFACTURER ZealPC #define PRODUCT Zeal65 -#define DESCRIPTION Zeal65 (QMK Firmware) +#define DESCRIPTION Zeal65 // key matrix size #define MATRIX_ROWS 5 From fb900e2ad173c569ca97a57c076e32ca4a06fa76 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Tue, 11 Dec 2018 09:11:35 -0800 Subject: [PATCH 661/788] Fix macro docs to be consistent with keyboard template (#4600) --- docs/feature_macros.md | 158 +++++++++++++++++++++++------------------ 1 file changed, 88 insertions(+), 70 deletions(-) diff --git a/docs/feature_macros.md b/docs/feature_macros.md index ba5d91882..29ba29fef 100644 --- a/docs/feature_macros.md +++ b/docs/feature_macros.md @@ -12,24 +12,28 @@ Here is an example `keymap.c` for a two-key keyboard: ```c enum custom_keycodes { - MY_CUSTOM_MACRO = SAFE_RANGE + QMKBEST = SAFE_RANGE, }; bool process_record_user(uint16_t keycode, keyrecord_t *record) { - if (record->event.pressed) { - switch(keycode) { - case MY_CUSTOM_MACRO: - SEND_STRING("QMK is the best thing ever!"); // this is our macro! - return false; - } - } - return true; + switch (keycode) { + case QMKBEST: + if (record->event.pressed) { + // when keycode QMKBEST is pressed + SEND_STRING("QMK is the best thing ever!"); + } else { + // when keycode QMKBEST is released + } + break; + + } + return true; }; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = { - {MY_CUSTOM_MACRO, KC_ESC} - } + [0] = { + {QMKBEST, KC_ESC} + } }; ``` @@ -37,7 +41,7 @@ What happens here is this: We first define a new custom keycode in the range not occupied by any other keycodes. Then we use the `process_record_user` function, which is called whenever a key is pressed or released, to check if our custom keycode has been activated. If yes, we send the string `"QMK is the best thing ever!"` to the computer via the `SEND_STRING` macro (this is a C preprocessor macro, not to be confused with QMK macros). -We return `false` to indicate to the caller that the key press we just processed need not be processed any further. +We return `true` to indicate to the caller that the key press we just processed should continue to be processed as normal (as we didn't replace or alter the functionality). Finally, we define the keymap so that the first button activates our macro and the second button is just an escape button. You might want to add more than one macro. @@ -45,28 +49,42 @@ You can do that by adding another keycode and adding another case to the switch ```c enum custom_keycodes { - MY_CUSTOM_MACRO = SAFE_RANGE, - MY_OTHER_MACRO + QMKBEST = SAFE_RANGE, + QMKURL, + MY_OTHER_MACRO }; bool process_record_user(uint16_t keycode, keyrecord_t *record) { - if (record->event.pressed) { - switch(keycode) { - case MY_CUSTOM_MACRO: - SEND_STRING("QMK is the best thing ever!"); - return false; - case MY_OTHER_MACRO: - SEND_STRING(SS_LCTRL("ac")); // selects all and copies - return false; - } - } - return true; + switch (keycode) { + case QMKBEST: + if (record->event.pressed) { + // when keycode QMKBEST is pressed + SEND_STRING("QMK is the best thing ever!"); + } else { + // when keycode QMKBEST is released + } + break; + case QMKURL: + if (record->event.pressed) { + // when keycode QMKURL is pressed + SEND_STRING("https://qmk.fm/" SS_TAP(X_ENTER)); + } else { + // when keycode QMKURL is released + } + break; + case MY_OTHER_MACRO: + if (record->event.pressed) { + SEND_STRING(SS_LCTRL("ac")); // selects all and copies + } + break; + } + return true; }; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = { - {MY_CUSTOM_MACRO, MY_OTHER_MACRO} - } + [0] = { + {MY_CUSTOM_MACRO, MY_OTHER_MACRO} + } }; ``` @@ -136,21 +154,21 @@ By default QMK assumes you don't have any macros. To define your macros you crea ```c const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { - if (record->event.pressed) { - switch(id) { - case 0: - return MACRO(D(LSFT), T(H), U(LSFT), T(I), D(LSFT), T(1), U(LSFT), END); - case 1: - return MACRO(D(LSFT), T(B), U(LSFT), T(Y), T(E), D(LSFT), T(1), U(LSFT), END); - } - } - return MACRO_NONE; + if (record->event.pressed) { + switch(id) { + case 0: + return MACRO(D(LSFT), T(H), U(LSFT), T(I), D(LSFT), T(1), U(LSFT), END); + case 1: + return MACRO(D(LSFT), T(B), U(LSFT), T(Y), T(E), D(LSFT), T(1), U(LSFT), END); + } + } + return MACRO_NONE; }; ``` This defines two macros which will be run when the key they are assigned to is pressed. If instead you'd like them to run when the key is released you can change the if statement: - if (!record->event.pressed) { + if (!record->event.pressed) { ### Macro Commands @@ -169,21 +187,21 @@ Use the `M()` function within your `KEYMAP()` to call a macro. For example, here ```c const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = KEYMAP( - M(0), M(1) - ), + [0] = KEYMAP( + M(0), M(1) + ), }; const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { - if (record->event.pressed) { - switch(id) { - case 0: - return MACRO(D(LSFT), T(H), U(LSFT), T(I), D(LSFT), T(1), U(LSFT), END); - case 1: - return MACRO(D(LSFT), T(B), U(LSFT), T(Y), T(E), D(LSFT), T(1), U(LSFT), END); - } - } - return MACRO_NONE; + if (record->event.pressed) { + switch(id) { + case 0: + return MACRO(D(LSFT), T(H), U(LSFT), T(I), D(LSFT), T(1), U(LSFT), END); + case 1: + return MACRO(D(LSFT), T(B), U(LSFT), T(Y), T(E), D(LSFT), T(1), U(LSFT), END); + } + } + return MACRO_NONE; }; ``` @@ -198,9 +216,9 @@ If you have a bunch of macros you want to refer to from your keymap while keepin #define M_BYE M(1) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = KEYMAP( - M_HI, M_BYE - ), + [0] = KEYMAP( + M_HI, M_BYE + ), }; ``` @@ -213,11 +231,11 @@ There are some functions you may find useful in macro-writing. Keep in mind that This is a boolean value that can be tested to see if the switch is being pressed or released. An example of this is ```c - if (record->event.pressed) { - // on keydown - } else { - // on keyup - } + if (record->event.pressed) { + // on keydown + } else { + // on keyup + } ``` ### `register_code();` @@ -250,16 +268,16 @@ This example defines a macro which sends `Ctrl-C` when pressed down, and `Ctrl-V ```c const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { - switch(id) { - case 0: { - if (record->event.pressed) { - return MACRO( D(LCTL), T(C), U(LCTL), END ); - } else { - return MACRO( D(LCTL), T(V), U(LCTL), END ); - } - break; - } - } - return MACRO_NONE; + switch(id) { + case 0: { + if (record->event.pressed) { + return MACRO( D(LCTL), T(C), U(LCTL), END ); + } else { + return MACRO( D(LCTL), T(V), U(LCTL), END ); + } + break; + } + } + return MACRO_NONE; }; ``` From a5a46f3d36801ed7ae537f92a248c2ca5b8b8e05 Mon Sep 17 00:00:00 2001 From: noroadsleft Date: Sat, 1 Dec 2018 20:01:13 -0800 Subject: [PATCH 662/788] handwired/pteron: Configurator support --- keyboards/handwired/pteron/info.json | 78 ++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 keyboards/handwired/pteron/info.json diff --git a/keyboards/handwired/pteron/info.json b/keyboards/handwired/pteron/info.json new file mode 100644 index 000000000..7b3b1b696 --- /dev/null +++ b/keyboards/handwired/pteron/info.json @@ -0,0 +1,78 @@ +{ + "keyboard_name": "pteron", + "url": "", + "maintainer": "FSund", + "width": 17, + "height": 5.95, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"K000", "x":0, "y":0.75}, + {"label":"K001", "x":1, "y":0.75}, + {"label":"K002", "x":2, "y":0.25}, + {"label":"K003", "x":3, "y":0}, + {"label":"K004", "x":4, "y":0.35}, + {"label":"K005", "x":5, "y":0.45}, + + {"label":"K006", "x":11, "y":0.45}, + {"label":"K007", "x":12, "y":0.35}, + {"label":"K008", "x":13, "y":0}, + {"label":"K009", "x":14, "y":0.25}, + {"label":"K010", "x":15, "y":0.75}, + {"label":"K011", "x":16, "y":0.75}, + + {"label":"K100", "x":0, "y":1.75}, + {"label":"K101", "x":1, "y":1.75}, + {"label":"K102", "x":2, "y":1.25}, + {"label":"K103", "x":3, "y":1}, + {"label":"K104", "x":4, "y":1.35}, + {"label":"K105", "x":5, "y":1.45}, + + {"label":"K106", "x":11, "y":1.45}, + {"label":"K107", "x":12, "y":1.35}, + {"label":"K108", "x":13, "y":1}, + {"label":"K109", "x":14, "y":1.25}, + {"label":"K110", "x":15, "y":1.75}, + {"label":"K111", "x":16, "y":1.75}, + + {"label":"K200", "x":0, "y":2.75}, + {"label":"K201", "x":1, "y":2.75}, + {"label":"K202", "x":2, "y":2.25}, + {"label":"K203", "x":3, "y":2}, + {"label":"K204", "x":4, "y":2.35}, + {"label":"K205", "x":5, "y":2.45}, + + {"label":"K206", "x":11, "y":2.45}, + {"label":"K207", "x":12, "y":2.35}, + {"label":"K208", "x":13, "y":2}, + {"label":"K209", "x":14, "y":2.25}, + {"label":"K210", "x":15, "y":2.75}, + {"label":"K211", "x":16, "y":2.75}, + + {"label":"K300", "x":0, "y":3.75}, + {"label":"K301", "x":1, "y":3.75}, + {"label":"K302", "x":2, "y":3.25}, + {"label":"K303", "x":3, "y":3}, + {"label":"K304", "x":4, "y":3.35}, + {"label":"K305", "x":5, "y":3.45}, + + {"label":"K306", "x":11, "y":3.45}, + {"label":"K307", "x":12, "y":3.35}, + {"label":"K308", "x":13, "y":3}, + {"label":"K309", "x":14, "y":3.25}, + {"label":"K310", "x":15, "y":3.75}, + {"label":"K311", "x":16, "y":3.75}, + + {"label":"K402", "x":4, "y":4.35}, + {"label":"K403", "x":5, "y":4.45}, + {"label":"K404", "x":6, "y":4.65}, + {"label":"K405", "x":7, "y":4.95}, + + {"label":"K406", "x":9, "y":4.95}, + {"label":"K407", "x":10, "y":4.65}, + {"label":"K408", "x":11, "y":4.45}, + {"label":"K409", "x":12, "y":4.35} + ] + } + } +} From 7c63c0a95075f6fb4dd94d020ceb5816e6bcca2c Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Tue, 11 Dec 2018 09:47:06 -0800 Subject: [PATCH 663/788] handwired/practice60: Configurator Support and refactor (#4603) * handwired/practice60: Configurator Support * handwired/practice60: refactor - layout macro rows did not have an equal number of arguments in all rows of the matrix - white space changes for readability/alignment --- keyboards/handwired/practice60/info.json | 74 +++++++++++++++++++ .../practice60/keymaps/default/keymap.c | 18 ++--- keyboards/handwired/practice60/practice60.h | 21 +++--- 3 files changed, 93 insertions(+), 20 deletions(-) create mode 100644 keyboards/handwired/practice60/info.json diff --git a/keyboards/handwired/practice60/info.json b/keyboards/handwired/practice60/info.json new file mode 100644 index 000000000..cffbcf492 --- /dev/null +++ b/keyboards/handwired/practice60/info.json @@ -0,0 +1,74 @@ +{ + "keyboard_name": "Practice 60", + "url": "", + "maintainer": "qmk", + "width": 15, + "height": 5, + "layouts": { + "LAYOUT_60_ansi": { + "layout": [ + {"label":"`", "x":0, "y":0}, + {"label":"1", "x":1, "y":0}, + {"label":"2", "x":2, "y":0}, + {"label":"3", "x":3, "y":0}, + {"label":"4", "x":4, "y":0}, + {"label":"5", "x":5, "y":0}, + {"label":"6", "x":6, "y":0}, + {"label":"7", "x":7, "y":0}, + {"label":"8", "x":8, "y":0}, + {"label":"9", "x":9, "y":0}, + {"label":"0", "x":10, "y":0}, + {"label":"-", "x":11, "y":0}, + {"label":"=", "x":12, "y":0}, + {"label":"Backspace", "x":13, "y":0, "w":2}, + {"label":"Tab", "x":0, "y":1, "w":1.5}, + {"label":"Q", "x":1.5, "y":1}, + {"label":"W", "x":2.5, "y":1}, + {"label":"E", "x":3.5, "y":1}, + {"label":"R", "x":4.5, "y":1}, + {"label":"T", "x":5.5, "y":1}, + {"label":"Y", "x":6.5, "y":1}, + {"label":"U", "x":7.5, "y":1}, + {"label":"I", "x":8.5, "y":1}, + {"label":"O", "x":9.5, "y":1}, + {"label":"P", "x":10.5, "y":1}, + {"label":"[", "x":11.5, "y":1}, + {"label":"]", "x":12.5, "y":1}, + {"label":"\\", "x":13.5, "y":1, "w":1.5}, + {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, + {"label":"A", "x":1.75, "y":2}, + {"label":"S", "x":2.75, "y":2}, + {"label":"D", "x":3.75, "y":2}, + {"label":"F", "x":4.75, "y":2}, + {"label":"G", "x":5.75, "y":2}, + {"label":"H", "x":6.75, "y":2}, + {"label":"J", "x":7.75, "y":2}, + {"label":"K", "x":8.75, "y":2}, + {"label":"L", "x":9.75, "y":2}, + {"label":";", "x":10.75, "y":2}, + {"label":"'", "x":11.75, "y":2}, + {"label":"Enter", "x":12.75, "y":2, "w":2.25}, + {"label":"Shift", "x":0, "y":3, "w":2.25}, + {"label":"Z", "x":2.25, "y":3}, + {"label":"X", "x":3.25, "y":3}, + {"label":"C", "x":4.25, "y":3}, + {"label":"V", "x":5.25, "y":3}, + {"label":"B", "x":6.25, "y":3}, + {"label":"N", "x":7.25, "y":3}, + {"label":"M", "x":8.25, "y":3}, + {"label":",", "x":9.25, "y":3}, + {"label":".", "x":10.25, "y":3}, + {"label":"/", "x":11.25, "y":3}, + {"label":"Shift", "x":12.25, "y":3, "w":2.75}, + {"label":"Ctrl", "x":0, "y":4, "w":1.25}, + {"label":"GUI", "x":1.25, "y":4, "w":1.25}, + {"label":"Alt", "x":2.5, "y":4, "w":1.25}, + {"label":"Space", "x":3.75, "y":4, "w":6.25}, + {"label":"Alt", "x":10, "y":4, "w":1.25}, + {"label":"GUI", "x":11.25, "y":4, "w":1.25}, + {"label":"Menu", "x":12.5, "y":4, "w":1.25}, + {"label":"Ctrl", "x":13.75, "y":4, "w":1.25} + ] + } + } +} diff --git a/keyboards/handwired/practice60/keymaps/default/keymap.c b/keyboards/handwired/practice60/keymaps/default/keymap.c index afea72b11..ac6e75509 100644 --- a/keyboards/handwired/practice60/keymaps/default/keymap.c +++ b/keyboards/handwired/practice60/keymaps/default/keymap.c @@ -31,18 +31,18 @@ enum custom_keycodes { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_BASE] = LAYOUT_60_ansi( - KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, MT(MOD_LSFT, KC_Y), KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \ - KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \ - KC_LCTL , KC_LGUI , KC_LALT , KC_SPC , KC_RALT , KC_RGUI , MO(_FN1) , KC_RCTL + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, MT(MOD_LSFT, KC_Y), KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(_FN1), KC_RCTL ), [_FN1] = LAYOUT_60_ansi( KC_GESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_BSPC, \ - RGB_TOG, RGB_MOD, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ - _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______,\ - BL_INC, BL_DEC, BL_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ - KC_GRV, _______, _______, _______, _______, _______, _______, _______ + RGB_TOG, RGB_MOD, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + BL_INC, BL_DEC, BL_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + KC_GRV, _______, _______, _______, _______, _______, _______, _______ ) }; diff --git a/keyboards/handwired/practice60/practice60.h b/keyboards/handwired/practice60/practice60.h index ffcf50614..5ebba8fb8 100644 --- a/keyboards/handwired/practice60/practice60.h +++ b/keyboards/handwired/practice60/practice60.h @@ -3,16 +3,15 @@ #include "quantum.h" #define LAYOUT_60_ansi( \ - K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \ - K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \ - K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, \ - K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, \ - K40, K41, K42, K43, K49, K4A, K4B, K4C \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, \ + K40, K41, K42, K43, K49, K4A, K4B, K4C \ ) { \ - { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \ - { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \ - { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C }, \ - { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B }, \ - { K40, K41, K42, K43, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, K49, K4A, K4B, K4C }, \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, KC_NO }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, KC_NO, KC_NO }, \ + { K40, K41, K42, K43, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, K49, K4A, K4B, K4C, KC_NO } \ } - From 200ee8e7973f47dd3a497b65c6ecf7ee3f5051ab Mon Sep 17 00:00:00 2001 From: Skyler Lewis Date: Tue, 11 Dec 2018 13:43:56 -0700 Subject: [PATCH 664/788] Keymap: Dichotomy keymap by alairock (#4608) * dichotemy layout for alairock * dichotemy layout for alairock * complete overhaul * fix suggestions --- keyboards/dichotomy/keymaps/alairock/keymap.c | 196 ++++++++++++++++++ 1 file changed, 196 insertions(+) create mode 100644 keyboards/dichotomy/keymaps/alairock/keymap.c diff --git a/keyboards/dichotomy/keymaps/alairock/keymap.c b/keyboards/dichotomy/keymaps/alairock/keymap.c new file mode 100644 index 000000000..f39a226b7 --- /dev/null +++ b/keyboards/dichotomy/keymaps/alairock/keymap.c @@ -0,0 +1,196 @@ +// this is the style you want to emulate. +// This is the canonical layout file for the Quantum project. If you want to add another keyboard, + +#include QMK_KEYBOARD_H + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _LOWER 1 +#define _RAISE 2 +#define _MOUSE 8 +#define _ADJUST 16 + + +enum dichotomy_keycodes +{ + QWERTY = SAFE_RANGE, + LOWER, + RAISE, + ADJUST, + MOUKEY, + MS_BTN1, + MS_BTN2, + MS_BTN3 +}; + +#define RED_BRIGHTNESS 3 +#define GREEN_BRIGHTNESS 2 +#define BLUE_BRIGHTNESS 2 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + +[_QWERTY] = LAYOUT( /* Base layout, nearly qwerty but with modifications because it's not a full keyboard. Obviously. */ + KC_ESCAPE, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, MOUKEY, + KC_LCTL, KC_LALT, MOUKEY, KC_RGUI, KC_RALT, KC_RCTL, + MS_BTN3, SFT_T(KC_ESCAPE), KC_LGUI, KC_BSPC, KC_SPC, RAISE, LOWER, MS_BTN3 +), + +[_RAISE] = LAYOUT( /* Shifted layout, small changes (because angle brackets have been moved to thumb cluster buttons) */ + _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, + _______, _______, KC_VOLD, KC_VOLU, KC_MPLY, KC_MFFD, KC_MUTE, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, _______, + _______, _______, _______, _______, _______, KC_MRWD, _______, _______, _______, KC_BSLS, KC_QUOT, _______, + _______, _______, _______, _______, _______, _______, + _______, _______, KC_LABK, _______, _______, KC_RABK, _______, _______ +), + +[_LOWER] = LAYOUT( /* Number layout, basically the main function layer */ + _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, _______, + _______, KC_TILD, KC_GRV, KC_F13, KC_F14, KC_F15, KC_F16, KC_F7, KC_F8, KC_F9, KC_F10, _______, + _______, _______, _______, _______, _______, _______, + _______, RAISE, _______, _______, _______, _______, _______, _______ +), + +[_ADJUST] = LAYOUT( /* Shifted number/function layout, for per-key control. Only active when shift is held, and number is toggled or held */ + _______, _______, _______, _______, _______, _______, _______, _______, KC_UP, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______ +), + +[_MOUSE] = LAYOUT( /* Mouse layer, including buttons for clicking. */ + _______, _______, _______, _______, _______, _______, KC_VOLU, KC_HOME, KC_PGUP, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, MS_BTN1, MS_BTN2, _______, _______, _______, + _______, _______, _______, _______, _______, _______, KC_VOLD, KC_END, KC_PGDN, _______, _______, _______, + _______, _______, _______, _______, KC_UP, _______, + _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______ +) + +}; // end keymaps block + +static bool shift_held = false; +static bool shift_suspended = false; +report_mouse_t currentReport = {}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + grn_led_on(); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + grn_led_off(); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + //SHIFT is handled as LSHIFT in the general case - 'toggle' shoudl activate caps, while the layer is only active when shift is held. + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + red_led_on(); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + red_led_off(); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + break; + //MOUSE layer needs to be handled the same way as NUMKEY, but differently from shift + case MOUKEY: + if (record->event.pressed) { + layer_on(_MOUSE); + blu_led_on(); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_MOUSE); + blu_led_off(); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + + //mouse buttons, for 1-3, to update the mouse report: + case MS_BTN1: + currentReport = pointing_device_get_report(); + if (record->event.pressed) { + if (shift_held && shift_suspended){ + register_code(KC_LSFT); + shift_suspended = false; + } + //update mouse report here + currentReport.buttons |= MOUSE_BTN1; //MOUSE_BTN1 is a const defined in report.h + } else { + //update mouse report here + currentReport.buttons &= ~MOUSE_BTN1; + } + pointing_device_set_report(currentReport); + return false; + break; + case MS_BTN2: + currentReport = pointing_device_get_report(); + if (record->event.pressed) { + if (shift_held && shift_suspended){ + register_code(KC_LSFT); + shift_suspended = false; + } + //update mouse report here + currentReport.buttons |= MOUSE_BTN2; //MOUSE_BTN2 is a const defined in report.h + } else { + //update mouse report here + currentReport.buttons &= ~MOUSE_BTN2; + } + pointing_device_set_report(currentReport); + return false; + break; + case MS_BTN3: + currentReport = pointing_device_get_report(); + if (record->event.pressed) { + if (shift_held && shift_suspended){ + register_code(KC_LSFT); + shift_suspended = false; + } + //update mouse report here + currentReport.buttons |= MOUSE_BTN3; //MOUSE_BTN3 is a const defined in report.h + } else { + //update mouse report here + currentReport.buttons &= ~MOUSE_BTN3; + } + pointing_device_set_report(currentReport); + return false; + break; + //Additionally, if NS_ keys are in use, then shift may be held (but is + //disabled for the unshifted keycodes to be send. Check the bool and + //register shift as necessary. + // default: + // if (shift_held){ + // register_code(KC_LSFT); + // } + // break; + } + return true; +}; From b11c3324774e50b8f17f5b4a3af63f1b6ae441e0 Mon Sep 17 00:00:00 2001 From: Twopidee <42394451+Twopidee@users.noreply.github.com> Date: Tue, 11 Dec 2018 16:24:17 -0600 Subject: [PATCH 665/788] Keymap: Added Drewsky DZ60 keymap (#4607) * Added Drewsky's DZ60 Keymap * Update keyboards/dz60/keymaps/drewsky/keymap.c Co-Authored-By: Twopidee <42394451+Twopidee@users.noreply.github.com> --- keyboards/dz60/keymaps/drewsky/Readme.md | 11 ++++++++ keyboards/dz60/keymaps/drewsky/keymap.c | 34 ++++++++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100755 keyboards/dz60/keymaps/drewsky/Readme.md create mode 100755 keyboards/dz60/keymaps/drewsky/keymap.c diff --git a/keyboards/dz60/keymaps/drewsky/Readme.md b/keyboards/dz60/keymaps/drewsky/Readme.md new file mode 100755 index 000000000..115d9cf83 --- /dev/null +++ b/keyboards/dz60/keymaps/drewsky/Readme.md @@ -0,0 +1,11 @@ +# **DREWSKY'S DZ60 ANSI Layout** +![Imgur](https://i.imgur.com/v4zVbl7.jpg) + + +Layer 1 is default configuration, for the exception of the Space cadet shifts. Layer 2 is for WASD arrows and Media, which I have included both PREV and NEXT for Windows and macOS. Layer 3 is for RGB underglow. Legends in picture follow Layers. Modifier one is momentary, and the RGB layer is TT (TAP_TOGGLE) + +Make example for this keyboard (after setting up your build environment): + + make dz60:drewsky + +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). diff --git a/keyboards/dz60/keymaps/drewsky/keymap.c b/keyboards/dz60/keymaps/drewsky/keymap.c new file mode 100755 index 000000000..aba0d238f --- /dev/null +++ b/keyboards/dz60/keymaps/drewsky/keymap.c @@ -0,0 +1,34 @@ +#include QMK_KEYBOARD_H + +// Helpful defines +#define _L0 0 +#define _L1 1 +#define _L2 2 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_L0] = LAYOUT_60_ansi( + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, TT(2), KC_RALT, MO(1), KC_RCTL), + + [_L1] = LAYOUT_60_ansi( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, + KC_NO, KC_NO, KC_UP, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_PGUP, + KC_NO, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_PGDN, + KC_NO, KC_MRWD, KC_MFFD, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_MSTP, KC_VOLD, KC_VOLU, KC_MPLY, KC__VOLDOWN, KC__VOLUP, KC_TRNS, KC_NO), + + [_L2] = LAYOUT_60_ansi( + KC_ESC, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, RGB_M_SN, RGB_M_K, RGB_M_X, RGB_M_G, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, RGB_HUD, RGB_HUI, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, RGB_SAD, RGB_SAI, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, RGB_VAD, RGB_VAI, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, RGB_SPD, RGB_SPI, KC_NO, + KC_NO, KC_NO, KC_NO, RGB_TOG, KC_TRNS, KC_NO, KC_NO, DEBUG) +}; + + + + From d46d3043957b75369923cb0202c632fa1d8f0311 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Tue, 11 Dec 2018 15:58:10 -0800 Subject: [PATCH 666/788] Preonic Configurator update (#4598) * Preonic: refactor layout macros Unify layout macro names across AVR and ARM. - all layouts and matrices have moved/duplicated to their appropriate revisions - preonic.h now includes the appropriate header file from the selected revision - revision header files only contain layouts appropriate for that revision - Previously, all layouts were available in source for all revisions. - removed KEYMAP layout macro alias (was unused) - macros LAYOUT_preonic_1x2uC and LAYOUT_preonic_grid for AVR and ARM revisions - LAYOUT_preonic_grid has alias LAYOUT_ortho_5x12 for all revisions - deleted LAYOUT_ortho_4x12 alias (not appropriate for this keyboard) - ARM-based revisions have 1x2uR, 1x2uL and 2x2u matrices * Preonic: updated revision headers to #pragma once * Preonic: update Configurator files Updated the Configurator files to reflect the previous changes in this branch. - Preonic revs. 1 and 2 will use keyboards/preonic/info.json - Preonic rev. 3 will use keyboards/preonic/rev3/info.json - This file will override keyboards/preonic/info.json when preonic/rev3 is selected in the Configurator. --- keyboards/preonic/info.json | 4 +- keyboards/preonic/preonic.h | 163 ++------------- keyboards/preonic/rev1/rev1.h | 39 +++- keyboards/preonic/rev2/rev2.h | 36 ++++ keyboards/preonic/rev3/info.json | 330 +++++++++++++++++++++++++++++++ keyboards/preonic/rev3/rev3.h | 106 +++++++++- 6 files changed, 530 insertions(+), 148 deletions(-) create mode 100644 keyboards/preonic/rev3/info.json diff --git a/keyboards/preonic/info.json b/keyboards/preonic/info.json index 3e5670cfa..cb0798b54 100644 --- a/keyboards/preonic/info.json +++ b/keyboards/preonic/info.json @@ -6,7 +6,7 @@ "width": 12, "height": 5, "layouts": { - "KEYMAP": { + "LAYOUT_preonic_1x2uC": { "key_count": 59, "layout": [ { "w": 1, "x": 0, "y": 0 }, @@ -69,7 +69,7 @@ { "w": 1, "x": 10, "y": 4 }, { "w": 1, "x": 11, "y": 4 } ] }, - "LAYOUT_preonic_grid": { + "LAYOUT_ortho_5x12": { "key_count": 60, "layout": [ { "w": 1, "x": 0, "y": 0 }, diff --git a/keyboards/preonic/preonic.h b/keyboards/preonic/preonic.h index 8d7b577a9..e2aa1545c 100644 --- a/keyboards/preonic/preonic.h +++ b/keyboards/preonic/preonic.h @@ -1,149 +1,26 @@ -#ifndef PREONIC_H -#define PREONIC_H +#pragma once #include "quantum.h" -#ifdef __AVR__ - -#define LAYOUT_preonic_1x2uC( \ - k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \ - k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \ - k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ - k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, \ - k40, k41, k42, k43, k44, k45, k47, k48, k49, k4a, k4b \ -) \ -{ \ - { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b }, \ - { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b }, \ - { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b }, \ - { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b }, \ - { k40, k41, k42, k43, k44, k45, k45, k47, k48, k49, k4a, k4b } \ -} - -#define LAYOUT_preonic_grid( \ - k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \ - k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \ - k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ - k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, \ - k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b \ -) \ -{ \ - { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b }, \ - { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b }, \ - { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b }, \ - { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b }, \ - { k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b } \ -} - -#define KEYMAP LAYOUT_preonic_1x2uC -#define LAYOUT_ortho_5x12 LAYOUT_preonic_grid - -#else - -#define LAYOUT_preonic_1x2uC( \ - k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \ - k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \ - k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ - k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, \ - k40, k41, k42, k43, k44, k45, k47, k48, k49, k4a, k4b \ -) \ -{ \ - { k00, k01, k02, k03, k04, k05 }, \ - { k10, k11, k12, k13, k14, k15 }, \ - { k20, k21, k22, k23, k24, k25 }, \ - { k30, k31, k32, k33, k34, k35 }, \ - { k06, k07, k08, k09, k0a, k0b }, \ - { k16, k17, k18, k19, k1a, k1b }, \ - { k26, k27, k28, k29, k2a, k2b }, \ - { k36, k37, k38, k39, k3a, k3b }, \ - { k40, k41, k42, k49, k4a, k4b }, \ - { k46, k47, k48, k43, k44, k45 } \ -} - -#define LAYOUT_preonic_1x2uR( \ - k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \ - k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \ - k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ - k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, \ - k40, k41, k42, k43, k44, k45, k47, k48, k49, k4a, k4b \ -) \ -{ \ - { k00, k01, k02, k03, k04, k05 }, \ - { k10, k11, k12, k13, k14, k15 }, \ - { k20, k21, k22, k23, k24, k25 }, \ - { k30, k31, k32, k33, k34, k35 }, \ - { k06, k07, k08, k09, k0a, k0b }, \ - { k16, k17, k18, k19, k1a, k1b }, \ - { k26, k27, k28, k29, k2a, k2b }, \ - { k36, k37, k38, k39, k3a, k3b }, \ - { k40, k41, k42, k49, k4a, k4b }, \ - { k46, k47, k48, k43, k44, k45 } \ -} -#define LAYOUT_preonic_1x2uL( \ - k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \ - k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \ - k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ - k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, \ - k40, k41, k42, k43, k44, k46, k47, k48, k49, k4a, k4b \ -) \ -{ \ - { k00, k01, k02, k03, k04, k05 }, \ - { k10, k11, k12, k13, k14, k15 }, \ - { k20, k21, k22, k23, k24, k25 }, \ - { k30, k31, k32, k33, k34, k35 }, \ - { k06, k07, k08, k09, k0a, k0b }, \ - { k16, k17, k18, k19, k1a, k1b }, \ - { k26, k27, k28, k29, k2a, k2b }, \ - { k36, k37, k38, k39, k3a, k3b }, \ - { k40, k41, k42, k49, k4a, k4b }, \ - { k46, k47, k48, k43, k44, k45 } \ -} - -#define LAYOUT_preonic_2x2u( \ - k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \ - k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \ - k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ - k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, \ - k40, k41, k42, k43, k44, k46, k48, k49, k4a, k4b \ -) \ -{ \ - { k00, k01, k02, k03, k04, k05 }, \ - { k10, k11, k12, k13, k14, k15 }, \ - { k20, k21, k22, k23, k24, k25 }, \ - { k30, k31, k32, k33, k34, k35 }, \ - { k06, k07, k08, k09, k0a, k0b }, \ - { k16, k17, k18, k19, k1a, k1b }, \ - { k26, k27, k28, k29, k2a, k2b }, \ - { k36, k37, k38, k39, k3a, k3b }, \ - { k40, k41, k42, k49, k4a, k4b }, \ - { k46, k47, k48, k43, k44, k45 } \ -} - -#define LAYOUT_preonic_grid( \ - k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \ - k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \ - k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ - k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, \ - k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b \ -) \ -{ \ - { k00, k01, k02, k03, k04, k05 }, \ - { k10, k11, k12, k13, k14, k15 }, \ - { k20, k21, k22, k23, k24, k25 }, \ - { k30, k31, k32, k33, k34, k35 }, \ - { k06, k07, k08, k09, k0a, k0b }, \ - { k16, k17, k18, k19, k1a, k1b }, \ - { k26, k27, k28, k29, k2a, k2b }, \ - { k36, k37, k38, k39, k3a, k3b }, \ - { k40, k41, k42, k49, k4a, k4b }, \ - { k46, k47, k48, k43, k44, k45 } \ -} - -#define KEYMAP LAYOUT_preonic_grid -#define LAYOUT_ortho_4x12 LAYOUT_preonic_grid -#define KC_LAYOUT_ortho_4x12 KC_KEYMAP - - +/************************************************** +** Include headers specific to keyboard revision ** +***************************************************/ +#ifdef KEYBOARD_preonic_rev1 + #include "rev1.h" #endif +#ifdef KEYBOARD_preonic_rev2 + #include "rev2.h" #endif + +#ifdef KEYBOARD_preonic_rev3 + #include "rev3.h" +#endif + + +/************************************************** +** Layout macros aliases common to all revisions ** + + Name of Alias Matrix Name: + ----------------- ------------------- ****/ +#define LAYOUT_ortho_5x12 LAYOUT_preonic_grid diff --git a/keyboards/preonic/rev1/rev1.h b/keyboards/preonic/rev1/rev1.h index 6705b7259..6ca4afd3e 100644 --- a/keyboards/preonic/rev1/rev1.h +++ b/keyboards/preonic/rev1/rev1.h @@ -13,4 +13,41 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#include "preonic.h" \ No newline at end of file + +#pragma once + +#include "preonic.h" + +#ifdef __AVR__ // Preonic revs. 1 & 2 + + #define LAYOUT_preonic_1x2uC( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ + k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, \ + k40, k41, k42, k43, k44, k45, k47, k48, k49, k4a, k4b \ + ) \ + { \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b }, \ + { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b }, \ + { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b }, \ + { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b }, \ + { k40, k41, k42, k43, k44, k45, k45, k47, k48, k49, k4a, k4b } \ + } + + #define LAYOUT_preonic_grid( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ + k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, \ + k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b \ + ) \ + { \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b }, \ + { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b }, \ + { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b }, \ + { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b }, \ + { k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b } \ + } + +#endif diff --git a/keyboards/preonic/rev2/rev2.h b/keyboards/preonic/rev2/rev2.h index 511721459..6ca4afd3e 100644 --- a/keyboards/preonic/rev2/rev2.h +++ b/keyboards/preonic/rev2/rev2.h @@ -14,4 +14,40 @@ * along with this program. If not, see . */ +#pragma once + #include "preonic.h" + +#ifdef __AVR__ // Preonic revs. 1 & 2 + + #define LAYOUT_preonic_1x2uC( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ + k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, \ + k40, k41, k42, k43, k44, k45, k47, k48, k49, k4a, k4b \ + ) \ + { \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b }, \ + { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b }, \ + { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b }, \ + { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b }, \ + { k40, k41, k42, k43, k44, k45, k45, k47, k48, k49, k4a, k4b } \ + } + + #define LAYOUT_preonic_grid( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ + k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, \ + k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b \ + ) \ + { \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b }, \ + { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b }, \ + { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b }, \ + { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b }, \ + { k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b } \ + } + +#endif diff --git a/keyboards/preonic/rev3/info.json b/keyboards/preonic/rev3/info.json new file mode 100644 index 000000000..50ae8e5fb --- /dev/null +++ b/keyboards/preonic/rev3/info.json @@ -0,0 +1,330 @@ +{ + "keyboard_name": "Preonic rev. 3", + "keyboard_folder": "preonic/rev3", + "url": "https://olkb.com/preonic", + "maintainer": "jackhumbert", + "width": 12, + "height": 5, + "layouts": { + "LAYOUT_preonic_1x2uC": { + "key_count": 59, + "layout": [ + {"label":"k00", "x":0, "y":0}, + {"label":"k01", "x":1, "y":0}, + {"label":"k02", "x":2, "y":0}, + {"label":"k03", "x":3, "y":0}, + {"label":"k04", "x":4, "y":0}, + {"label":"k05", "x":5, "y":0}, + {"label":"k06", "x":6, "y":0}, + {"label":"k07", "x":7, "y":0}, + {"label":"k08", "x":8, "y":0}, + {"label":"k09", "x":9, "y":0}, + {"label":"k0a", "x":10, "y":0}, + {"label":"k0b", "x":11, "y":0}, + {"label":"k10", "x":0, "y":1}, + {"label":"k11", "x":1, "y":1}, + {"label":"k12", "x":2, "y":1}, + {"label":"k13", "x":3, "y":1}, + {"label":"k14", "x":4, "y":1}, + {"label":"k15", "x":5, "y":1}, + {"label":"k16", "x":6, "y":1}, + {"label":"k17", "x":7, "y":1}, + {"label":"k18", "x":8, "y":1}, + {"label":"k19", "x":9, "y":1}, + {"label":"k1a", "x":10, "y":1}, + {"label":"k1b", "x":11, "y":1}, + {"label":"k20", "x":0, "y":2}, + {"label":"k21", "x":1, "y":2}, + {"label":"k22", "x":2, "y":2}, + {"label":"k23", "x":3, "y":2}, + {"label":"k24", "x":4, "y":2}, + {"label":"k25", "x":5, "y":2}, + {"label":"k26", "x":6, "y":2}, + {"label":"k27", "x":7, "y":2}, + {"label":"k28", "x":8, "y":2}, + {"label":"k29", "x":9, "y":2}, + {"label":"k2a", "x":10, "y":2}, + {"label":"k2b", "x":11, "y":2}, + {"label":"k30", "x":0, "y":3}, + {"label":"k31", "x":1, "y":3}, + {"label":"k32", "x":2, "y":3}, + {"label":"k33", "x":3, "y":3}, + {"label":"k34", "x":4, "y":3}, + {"label":"k35", "x":5, "y":3}, + {"label":"k36", "x":6, "y":3}, + {"label":"k37", "x":7, "y":3}, + {"label":"k38", "x":8, "y":3}, + {"label":"k39", "x":9, "y":3}, + {"label":"k3a", "x":10, "y":3}, + {"label":"k3b", "x":11, "y":3}, + {"label":"k40", "x":0, "y":4}, + {"label":"k41", "x":1, "y":4}, + {"label":"k42", "x":2, "y":4}, + {"label":"k43", "x":3, "y":4}, + {"label":"k44", "x":4, "y":4}, + {"label":"k45", "x":5, "y":4, "w":2}, + {"label":"k47", "x":7, "y":4}, + {"label":"k48", "x":8, "y":4}, + {"label":"k49", "x":9, "y":4}, + {"label":"k4a", "x":10, "y":4}, + {"label":"k4b", "x":11, "y":4} + ] + }, + "LAYOUT_preonic_1x2uR": { + "key_count": 59, + "layout": [ + {"label":"k00", "x":0, "y":0}, + {"label":"k01", "x":1, "y":0}, + {"label":"k02", "x":2, "y":0}, + {"label":"k03", "x":3, "y":0}, + {"label":"k04", "x":4, "y":0}, + {"label":"k05", "x":5, "y":0}, + {"label":"k06", "x":6, "y":0}, + {"label":"k07", "x":7, "y":0}, + {"label":"k08", "x":8, "y":0}, + {"label":"k09", "x":9, "y":0}, + {"label":"k0a", "x":10, "y":0}, + {"label":"k0b", "x":11, "y":0}, + {"label":"k10", "x":0, "y":1}, + {"label":"k11", "x":1, "y":1}, + {"label":"k12", "x":2, "y":1}, + {"label":"k13", "x":3, "y":1}, + {"label":"k14", "x":4, "y":1}, + {"label":"k15", "x":5, "y":1}, + {"label":"k16", "x":6, "y":1}, + {"label":"k17", "x":7, "y":1}, + {"label":"k18", "x":8, "y":1}, + {"label":"k19", "x":9, "y":1}, + {"label":"k1a", "x":10, "y":1}, + {"label":"k1b", "x":11, "y":1}, + {"label":"k20", "x":0, "y":2}, + {"label":"k21", "x":1, "y":2}, + {"label":"k22", "x":2, "y":2}, + {"label":"k23", "x":3, "y":2}, + {"label":"k24", "x":4, "y":2}, + {"label":"k25", "x":5, "y":2}, + {"label":"k26", "x":6, "y":2}, + {"label":"k27", "x":7, "y":2}, + {"label":"k28", "x":8, "y":2}, + {"label":"k29", "x":9, "y":2}, + {"label":"k2a", "x":10, "y":2}, + {"label":"k2b", "x":11, "y":2}, + {"label":"k30", "x":0, "y":3}, + {"label":"k31", "x":1, "y":3}, + {"label":"k32", "x":2, "y":3}, + {"label":"k33", "x":3, "y":3}, + {"label":"k34", "x":4, "y":3}, + {"label":"k35", "x":5, "y":3}, + {"label":"k36", "x":6, "y":3}, + {"label":"k37", "x":7, "y":3}, + {"label":"k38", "x":8, "y":3}, + {"label":"k39", "x":9, "y":3}, + {"label":"k3a", "x":10, "y":3}, + {"label":"k3b", "x":11, "y":3}, + {"label":"k40", "x":0, "y":4}, + {"label":"k41", "x":1, "y":4}, + {"label":"k42", "x":2, "y":4}, + {"label":"k43", "x":3, "y":4}, + {"label":"k44", "x":4, "y":4}, + {"label":"k45", "x":5, "y":4}, + {"label":"k47", "x":6, "y":4, "w":2}, + {"label":"k48", "x":8, "y":4}, + {"label":"k49", "x":9, "y":4}, + {"label":"k4a", "x":10, "y":4}, + {"label":"k4b", "x":11, "y":4} + ] + }, + "LAYOUT_preonic_1x2uL": { + "key_count": 59, + "layout": [ + {"label":"k00", "x":0, "y":0}, + {"label":"k01", "x":1, "y":0}, + {"label":"k02", "x":2, "y":0}, + {"label":"k03", "x":3, "y":0}, + {"label":"k04", "x":4, "y":0}, + {"label":"k05", "x":5, "y":0}, + {"label":"k06", "x":6, "y":0}, + {"label":"k07", "x":7, "y":0}, + {"label":"k08", "x":8, "y":0}, + {"label":"k09", "x":9, "y":0}, + {"label":"k0a", "x":10, "y":0}, + {"label":"k0b", "x":11, "y":0}, + {"label":"k10", "x":0, "y":1}, + {"label":"k11", "x":1, "y":1}, + {"label":"k12", "x":2, "y":1}, + {"label":"k13", "x":3, "y":1}, + {"label":"k14", "x":4, "y":1}, + {"label":"k15", "x":5, "y":1}, + {"label":"k16", "x":6, "y":1}, + {"label":"k17", "x":7, "y":1}, + {"label":"k18", "x":8, "y":1}, + {"label":"k19", "x":9, "y":1}, + {"label":"k1a", "x":10, "y":1}, + {"label":"k1b", "x":11, "y":1}, + {"label":"k20", "x":0, "y":2}, + {"label":"k21", "x":1, "y":2}, + {"label":"k22", "x":2, "y":2}, + {"label":"k23", "x":3, "y":2}, + {"label":"k24", "x":4, "y":2}, + {"label":"k25", "x":5, "y":2}, + {"label":"k26", "x":6, "y":2}, + {"label":"k27", "x":7, "y":2}, + {"label":"k28", "x":8, "y":2}, + {"label":"k29", "x":9, "y":2}, + {"label":"k2a", "x":10, "y":2}, + {"label":"k2b", "x":11, "y":2}, + {"label":"k30", "x":0, "y":3}, + {"label":"k31", "x":1, "y":3}, + {"label":"k32", "x":2, "y":3}, + {"label":"k33", "x":3, "y":3}, + {"label":"k34", "x":4, "y":3}, + {"label":"k35", "x":5, "y":3}, + {"label":"k36", "x":6, "y":3}, + {"label":"k37", "x":7, "y":3}, + {"label":"k38", "x":8, "y":3}, + {"label":"k39", "x":9, "y":3}, + {"label":"k3a", "x":10, "y":3}, + {"label":"k3b", "x":11, "y":3}, + {"label":"k40", "x":0, "y":4}, + {"label":"k41", "x":1, "y":4}, + {"label":"k42", "x":2, "y":4}, + {"label":"k43", "x":3, "y":4}, + {"label":"k44", "x":4, "y":4, "w":2}, + {"label":"k46", "x":6, "y":4}, + {"label":"k47", "x":7, "y":4}, + {"label":"k48", "x":8, "y":4}, + {"label":"k49", "x":9, "y":4}, + {"label":"k4a", "x":10, "y":4}, + {"label":"k4b", "x":11, "y":4} + ] + }, + "LAYOUT_preonic_2x2u": { + "key_count": 58, + "layout": [ + {"label":"k00", "x":0, "y":0}, + {"label":"k01", "x":1, "y":0}, + {"label":"k02", "x":2, "y":0}, + {"label":"k03", "x":3, "y":0}, + {"label":"k04", "x":4, "y":0}, + {"label":"k05", "x":5, "y":0}, + {"label":"k06", "x":6, "y":0}, + {"label":"k07", "x":7, "y":0}, + {"label":"k08", "x":8, "y":0}, + {"label":"k09", "x":9, "y":0}, + {"label":"k0a", "x":10, "y":0}, + {"label":"k0b", "x":11, "y":0}, + {"label":"k10", "x":0, "y":1}, + {"label":"k11", "x":1, "y":1}, + {"label":"k12", "x":2, "y":1}, + {"label":"k13", "x":3, "y":1}, + {"label":"k14", "x":4, "y":1}, + {"label":"k15", "x":5, "y":1}, + {"label":"k16", "x":6, "y":1}, + {"label":"k17", "x":7, "y":1}, + {"label":"k18", "x":8, "y":1}, + {"label":"k19", "x":9, "y":1}, + {"label":"k1a", "x":10, "y":1}, + {"label":"k1b", "x":11, "y":1}, + {"label":"k20", "x":0, "y":2}, + {"label":"k21", "x":1, "y":2}, + {"label":"k22", "x":2, "y":2}, + {"label":"k23", "x":3, "y":2}, + {"label":"k24", "x":4, "y":2}, + {"label":"k25", "x":5, "y":2}, + {"label":"k26", "x":6, "y":2}, + {"label":"k27", "x":7, "y":2}, + {"label":"k28", "x":8, "y":2}, + {"label":"k29", "x":9, "y":2}, + {"label":"k2a", "x":10, "y":2}, + {"label":"k2b", "x":11, "y":2}, + {"label":"k30", "x":0, "y":3}, + {"label":"k31", "x":1, "y":3}, + {"label":"k32", "x":2, "y":3}, + {"label":"k33", "x":3, "y":3}, + {"label":"k34", "x":4, "y":3}, + {"label":"k35", "x":5, "y":3}, + {"label":"k36", "x":6, "y":3}, + {"label":"k37", "x":7, "y":3}, + {"label":"k38", "x":8, "y":3}, + {"label":"k39", "x":9, "y":3}, + {"label":"k3a", "x":10, "y":3}, + {"label":"k3b", "x":11, "y":3}, + {"label":"k40", "x":0, "y":4}, + {"label":"k41", "x":1, "y":4}, + {"label":"k42", "x":2, "y":4}, + {"label":"k43", "x":3, "y":4}, + {"label":"k44", "x":4, "y":4, "w":2}, + {"label":"k46", "x":6, "y":4, "w":2}, + {"label":"k48", "x":8, "y":4}, + {"label":"k49", "x":9, "y":4}, + {"label":"k4a", "x":10, "y":4}, + {"label":"k4b", "x":11, "y":4} + ] + }, + "LAYOUT_ortho_5x12": { + "layout": [ + "key_count": 60, + {"label":"k00", "x":0, "y":0}, + {"label":"k01", "x":1, "y":0}, + {"label":"k02", "x":2, "y":0}, + {"label":"k03", "x":3, "y":0}, + {"label":"k04", "x":4, "y":0}, + {"label":"k05", "x":5, "y":0}, + {"label":"k06", "x":6, "y":0}, + {"label":"k07", "x":7, "y":0}, + {"label":"k08", "x":8, "y":0}, + {"label":"k09", "x":9, "y":0}, + {"label":"k0a", "x":10, "y":0}, + {"label":"k0b", "x":11, "y":0}, + {"label":"k10", "x":0, "y":1}, + {"label":"k11", "x":1, "y":1}, + {"label":"k12", "x":2, "y":1}, + {"label":"k13", "x":3, "y":1}, + {"label":"k14", "x":4, "y":1}, + {"label":"k15", "x":5, "y":1}, + {"label":"k16", "x":6, "y":1}, + {"label":"k17", "x":7, "y":1}, + {"label":"k18", "x":8, "y":1}, + {"label":"k19", "x":9, "y":1}, + {"label":"k1a", "x":10, "y":1}, + {"label":"k1b", "x":11, "y":1}, + {"label":"k20", "x":0, "y":2}, + {"label":"k21", "x":1, "y":2}, + {"label":"k22", "x":2, "y":2}, + {"label":"k23", "x":3, "y":2}, + {"label":"k24", "x":4, "y":2}, + {"label":"k25", "x":5, "y":2}, + {"label":"k26", "x":6, "y":2}, + {"label":"k27", "x":7, "y":2}, + {"label":"k28", "x":8, "y":2}, + {"label":"k29", "x":9, "y":2}, + {"label":"k2a", "x":10, "y":2}, + {"label":"k2b", "x":11, "y":2}, + {"label":"k30", "x":0, "y":3}, + {"label":"k31", "x":1, "y":3}, + {"label":"k32", "x":2, "y":3}, + {"label":"k33", "x":3, "y":3}, + {"label":"k34", "x":4, "y":3}, + {"label":"k35", "x":5, "y":3}, + {"label":"k36", "x":6, "y":3}, + {"label":"k37", "x":7, "y":3}, + {"label":"k38", "x":8, "y":3}, + {"label":"k39", "x":9, "y":3}, + {"label":"k3a", "x":10, "y":3}, + {"label":"k3b", "x":11, "y":3}, + {"label":"k40", "x":0, "y":4}, + {"label":"k41", "x":1, "y":4}, + {"label":"k42", "x":2, "y":4}, + {"label":"k43", "x":3, "y":4}, + {"label":"k44", "x":4, "y":4}, + {"label":"k45", "x":5, "y":4}, + {"label":"k46", "x":6, "y":4}, + {"label":"k47", "x":7, "y":4}, + {"label":"k48", "x":8, "y":4}, + {"label":"k49", "x":9, "y":4}, + {"label":"k4a", "x":10, "y":4}, + {"label":"k4b", "x":11, "y":4} + ] + } + } +} diff --git a/keyboards/preonic/rev3/rev3.h b/keyboards/preonic/rev3/rev3.h index 7c274ae27..af97239fd 100644 --- a/keyboards/preonic/rev3/rev3.h +++ b/keyboards/preonic/rev3/rev3.h @@ -13,9 +13,111 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#ifndef REV3_H -#define REV3_H + +#pragma once #include "preonic.h" +#ifndef __AVR__ // Preonic rev. 3 and later + + #define LAYOUT_preonic_1x2uC( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ + k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, \ + k40, k41, k42, k43, k44, k45, k47, k48, k49, k4a, k4b \ + ) \ + { \ + { k00, k01, k02, k03, k04, k05 }, \ + { k10, k11, k12, k13, k14, k15 }, \ + { k20, k21, k22, k23, k24, k25 }, \ + { k30, k31, k32, k33, k34, k35 }, \ + { k06, k07, k08, k09, k0a, k0b }, \ + { k16, k17, k18, k19, k1a, k1b }, \ + { k26, k27, k28, k29, k2a, k2b }, \ + { k36, k37, k38, k39, k3a, k3b }, \ + { k40, k41, k42, k49, k4a, k4b }, \ + { k45, k47, k48, k43, k44, k45 } \ + } + + #define LAYOUT_preonic_1x2uR( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ + k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, \ + k40, k41, k42, k43, k44, k45, k47, k48, k49, k4a, k4b \ + ) \ + { \ + { k00, k01, k02, k03, k04, k05 }, \ + { k10, k11, k12, k13, k14, k15 }, \ + { k20, k21, k22, k23, k24, k25 }, \ + { k30, k31, k32, k33, k34, k35 }, \ + { k06, k07, k08, k09, k0a, k0b }, \ + { k16, k17, k18, k19, k1a, k1b }, \ + { k26, k27, k28, k29, k2a, k2b }, \ + { k36, k37, k38, k39, k3a, k3b }, \ + { k40, k41, k42, k49, k4a, k4b }, \ + { k47, k47, k48, k43, k44, k45 } \ + } + + #define LAYOUT_preonic_1x2uL( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ + k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, \ + k40, k41, k42, k43, k44, k46, k47, k48, k49, k4a, k4b \ + ) \ + { \ + { k00, k01, k02, k03, k04, k05 }, \ + { k10, k11, k12, k13, k14, k15 }, \ + { k20, k21, k22, k23, k24, k25 }, \ + { k30, k31, k32, k33, k34, k35 }, \ + { k06, k07, k08, k09, k0a, k0b }, \ + { k16, k17, k18, k19, k1a, k1b }, \ + { k26, k27, k28, k29, k2a, k2b }, \ + { k36, k37, k38, k39, k3a, k3b }, \ + { k40, k41, k42, k49, k4a, k4b }, \ + { k46, k47, k48, k43, k44, k44 } \ + } + + #define LAYOUT_preonic_2x2u( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ + k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, \ + k40, k41, k42, k43, k44, k46, k48, k49, k4a, k4b \ + ) \ + { \ + { k00, k01, k02, k03, k04, k05 }, \ + { k10, k11, k12, k13, k14, k15 }, \ + { k20, k21, k22, k23, k24, k25 }, \ + { k30, k31, k32, k33, k34, k35 }, \ + { k06, k07, k08, k09, k0a, k0b }, \ + { k16, k17, k18, k19, k1a, k1b }, \ + { k26, k27, k28, k29, k2a, k2b }, \ + { k36, k37, k38, k39, k3a, k3b }, \ + { k40, k41, k42, k49, k4a, k4b }, \ + { k46, k46, k48, k43, k44, k44 } \ + } + + #define LAYOUT_preonic_grid( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ + k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, \ + k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b \ + ) \ + { \ + { k00, k01, k02, k03, k04, k05 }, \ + { k10, k11, k12, k13, k14, k15 }, \ + { k20, k21, k22, k23, k24, k25 }, \ + { k30, k31, k32, k33, k34, k35 }, \ + { k06, k07, k08, k09, k0a, k0b }, \ + { k16, k17, k18, k19, k1a, k1b }, \ + { k26, k27, k28, k29, k2a, k2b }, \ + { k36, k37, k38, k39, k3a, k3b }, \ + { k40, k41, k42, k49, k4a, k4b }, \ + { k46, k47, k48, k43, k44, k45 } \ + } + #endif From 8b6cdd17886db9847ff91be9c10a1788a7c74a6a Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Tue, 11 Dec 2018 20:49:44 -0800 Subject: [PATCH 667/788] handwired/numpad20 Refactor and Configurator support (#4589) * handwired/numpad20: refactor - layout macro no longer auto-prepends keycodes with KC_ - keymaps for this keyboard will now compile in QMK Configurator - keymap now uses #include QMK_KEYBOARD_H - deleted unused fn_actions code block * handwired/numpad20: Configurator support --- keyboards/handwired/numpad20/info.json | 33 +++++++++++++++++++ .../numpad20/keymaps/default/keymap.c | 19 ++++------- keyboards/handwired/numpad20/numpad20.h | 12 +++---- 3 files changed, 46 insertions(+), 18 deletions(-) create mode 100644 keyboards/handwired/numpad20/info.json diff --git a/keyboards/handwired/numpad20/info.json b/keyboards/handwired/numpad20/info.json new file mode 100644 index 000000000..691acb315 --- /dev/null +++ b/keyboards/handwired/numpad20/info.json @@ -0,0 +1,33 @@ +{ + "keyboard_name": "numpad20 handwired", + "url": "", + "maintainer": "qmk", + "width": 4, + "height": 5, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"K00", "x":0, "y":0}, + {"label":"K01", "x":1, "y":0}, + {"label":"K02", "x":2, "y":0}, + {"label":"K03", "x":3, "y":0}, + {"label":"K10", "x":0, "y":1}, + {"label":"K11", "x":1, "y":1}, + {"label":"K12", "x":2, "y":1}, + {"label":"K13", "x":3, "y":1}, + {"label":"K20", "x":0, "y":2}, + {"label":"K21", "x":1, "y":2}, + {"label":"K22", "x":2, "y":2}, + {"label":"K23", "x":3, "y":2}, + {"label":"K30", "x":0, "y":3}, + {"label":"K31", "x":1, "y":3}, + {"label":"K32", "x":2, "y":3}, + {"label":"K33", "x":3, "y":3}, + {"label":"K40", "x":0, "y":4}, + {"label":"K41", "x":1, "y":4}, + {"label":"K42", "x":2, "y":4}, + {"label":"K43", "x":3, "y":4} + ] + } + } +} diff --git a/keyboards/handwired/numpad20/keymaps/default/keymap.c b/keyboards/handwired/numpad20/keymaps/default/keymap.c index 65799bfee..414b104af 100644 --- a/keyboards/handwired/numpad20/keymaps/default/keymap.c +++ b/keyboards/handwired/numpad20/keymaps/default/keymap.c @@ -1,16 +1,11 @@ -#include "numpad20.h" - -#define KC_ KC_TRNS +#include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT( - LEFT,RGHT, UP ,DOWN, \ - P7 , P8 , P9 ,PLUS, \ - P4 , P5 , P6 ,MINS, \ - P1 , P2 , P3 , ENT, \ - P0 ,DOT ,RGHT, TAB \ - ) -}; - -const uint16_t PROGMEM fn_actions[] = { + KC_LEFT, KC_RGHT, KC_UP, KC_DOWN, \ + KC_P7, KC_P8, KC_P9, KC_PLUS, \ + KC_P4, KC_P5, KC_P6, KC_MINS, \ + KC_P1, KC_P2, KC_P3, KC_ENT, \ + KC_P0, KC_DOT, KC_RGHT, KC_TAB \ + ) }; diff --git a/keyboards/handwired/numpad20/numpad20.h b/keyboards/handwired/numpad20/numpad20.h index a2aa8d16b..c15aa9ac7 100644 --- a/keyboards/handwired/numpad20/numpad20.h +++ b/keyboards/handwired/numpad20/numpad20.h @@ -10,11 +10,11 @@ K30, K31, K32, K33, \ K40, K41, K42, K43 \ ) { \ - { KC_##K00, KC_##K01, KC_##K02, KC_##K03 }, \ - { KC_##K10, KC_##K11, KC_##K12, KC_##K13 }, \ - { KC_##K20, KC_##K21, KC_##K22, KC_##K23 }, \ - { KC_##K30, KC_##K31, KC_##K32, KC_##K33 }, \ - { KC_##K40, KC_##K41, KC_##K42, KC_##K43 } \ + { K00, K01, K02, K03 }, \ + { K10, K11, K12, K13 }, \ + { K20, K21, K22, K23 }, \ + { K30, K31, K32, K33 }, \ + { K40, K41, K42, K43 } \ } -#endif \ No newline at end of file +#endif From 28fbf84cc5ff52f545011ea4198a6cc6d054f896 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20=C4=90or=C4=91evi=C4=87?= Date: Wed, 12 Dec 2018 19:17:19 +0100 Subject: [PATCH 668/788] Add standard definitions for ALGR and KC_ALGR (#4389) * Add standard ALGR defition, remove (re)definitions from language files * Use ALGR(kc) consistently in ALTGR(kc) aliases * Non-Nordic keymaps should not use NO_ALGR * Add standard KC_ALGR definition * Update docs with ALGR and KC_ALGR * Update SS_ALGR and ALGR_T aliases --- docs/feature_advanced_keycodes.md | 4 ++-- docs/keycodes.md | 4 ++-- docs/keycodes_basic.md | 2 +- keyboards/handwired/reddot/keymaps/default/keymap.c | 4 ++-- keyboards/xd75/keymaps/germanized/config.h | 1 - quantum/keymap_extras/keymap_belgian.h | 5 +---- quantum/keymap_extras/keymap_bepo.h | 5 +---- quantum/keymap_extras/keymap_canadian_multilingual.h | 5 +---- quantum/keymap_extras/keymap_fr_ch.h | 1 - quantum/keymap_extras/keymap_french.h | 5 +---- quantum/keymap_extras/keymap_german.h | 1 - quantum/keymap_extras/keymap_german_ch.h | 1 - quantum/keymap_extras/keymap_hungarian.h | 1 - quantum/keymap_extras/keymap_italian.h | 1 - quantum/keymap_extras/keymap_nordic.h | 1 - quantum/keymap_extras/keymap_slovenian.h | 1 - quantum/keymap_extras/keymap_spanish.h | 3 +-- quantum/keymap_extras/keymap_uk.h | 3 +-- quantum/quantum.h | 1 + quantum/quantum_keycodes.h | 5 +++-- tmk_core/common/keycode.h | 1 + 21 files changed, 18 insertions(+), 37 deletions(-) diff --git a/docs/feature_advanced_keycodes.md b/docs/feature_advanced_keycodes.md index bb5cb7419..e5f241f7f 100644 --- a/docs/feature_advanced_keycodes.md +++ b/docs/feature_advanced_keycodes.md @@ -68,7 +68,7 @@ These allow you to combine a modifier with a keycode. When pressed, the keydown |`LGUI(kc)`|`LCMD(kc)`, `LWIN(kc)`|Hold Left GUI and press `kc` | |`RCTL(kc)`| |Hold Right Control and press `kc` | |`RSFT(kc)`| |Hold Right Shift and press `kc` | -|`RALT(kc)`| |Hold Right Alt and press `kc` | +|`RALT(kc)`|`ALGR(kc)` |Hold Right Alt and press `kc` | |`RGUI(kc)`|`RCMD(kc)`, `LWIN(kc)`|Hold Right GUI and press `kc` | |`HYPR(kc)`| |Hold Left Control, Shift, Alt and GUI and press `kc`| |`MEH(kc)` | |Hold Left Control, Shift and Alt and press `kc` | @@ -92,7 +92,7 @@ The modifiers this keycode and `OSM()` accept are prefixed with `MOD_`, not `KC_ |`MOD_LGUI`|Left GUI (Windows/Command/Meta key) | |`MOD_RCTL`|Right Control | |`MOD_RSFT`|Right Shift | -|`MOD_RALT`|Right Alt | +|`MOD_RALT`|Right Alt (AltGr) | |`MOD_RGUI`|Right GUI (Windows/Command/Meta key) | |`MOD_HYPR`|Hyper (Left Control, Shift, Alt and GUI)| |`MOD_MEH` |Meh (Left Control, Shift, and Alt) | diff --git a/docs/keycodes.md b/docs/keycodes.md index 75b01389c..d12a85aa1 100644 --- a/docs/keycodes.md +++ b/docs/keycodes.md @@ -177,7 +177,7 @@ This is a reference only. Each group of keys links to the page documenting their |`KC_LGUI` |`KC_LCMD`, `KC_LWIN`|Left GUI (Windows/Command/Meta key) | |`KC_RCTRL` |`KC_RCTL` |Right Control | |`KC_RSHIFT` |`KC_RSFT` |Right Shift | -|`KC_RALT` | |Right Alt | +|`KC_RALT` |`KC_ALGR` |Right Alt (AltGr) | |`KC_RGUI` |`KC_RCMD`, `KC_RWIN`|Right GUI (Windows/Command/Meta key) | |`KC_SYSTEM_POWER` |`KC_PWR` |System Power Down | |`KC_SYSTEM_SLEEP` |`KC_SLEP` |System Sleep | @@ -331,7 +331,7 @@ This is a reference only. Each group of keys links to the page documenting their |`LGUI(kc)`|`LCMD(kc)`, `LWIN(kc)`|Hold Left GUI and press `kc` | |`RCTL(kc)`| |Hold Right Control and press `kc` | |`RSFT(kc)`| |Hold Right Shift and press `kc` | -|`RALT(kc)`| |Hold Right Alt and press `kc` | +|`RALT(kc)`|`ALGR(kc)` |Hold Right Alt and press `kc` | |`RGUI(kc)`|`RCMD(kc)`, `LWIN(kc)`|Hold Right GUI and press `kc` | |`HYPR(kc)`| |Hold Left Control, Shift, Alt and GUI and press `kc`| |`MEH(kc)` | |Hold Left Control, Shift and Alt and press `kc` | diff --git a/docs/keycodes_basic.md b/docs/keycodes_basic.md index 9cc00f032..cba876d34 100644 --- a/docs/keycodes_basic.md +++ b/docs/keycodes_basic.md @@ -116,7 +116,7 @@ The basic set of keycodes are based on the [HID Keyboard/Keypad Usage Page (0x07 |`KC_LGUI` |`KC_LCMD`, `KC_LWIN`|Left GUI (Windows/Command/Meta key) | |`KC_RCTRL` |`KC_RCTL` |Right Control | |`KC_RSHIFT`|`KC_RSFT` |Right Shift | -|`KC_RALT` | |Right Alt | +|`KC_RALT` |`KC_ALGR` |Right Alt (AltGr) | |`KC_RGUI` |`KC_RCMD`, `KC_RWIN`|Right GUI (Windows/Command/Meta key)| ## International diff --git a/keyboards/handwired/reddot/keymaps/default/keymap.c b/keyboards/handwired/reddot/keymaps/default/keymap.c index 44ee2ce51..c67cc0e4c 100755 --- a/keyboards/handwired/reddot/keymaps/default/keymap.c +++ b/keyboards/handwired/reddot/keymaps/default/keymap.c @@ -8,14 +8,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LALT, FR_AMP, FR_EACU, FR_QUOT, FR_APOS, FR_LPRN, KC_BSPACE, KC_DELETE, FR_MINS, FR_EGRV, FR_UNDS, FR_CCED, FR_AGRV, FR_RPRN, FR_EQL, KC_INSERT, KC_HOME, KC_PGUP,\ KC_LGUI, FR_A, FR_Z, KC_E, KC_R, KC_T, KC_LSFT, KC_ENT, KC_Y, KC_U, KC_I, KC_O, KC_P, FR_CIRC, FR_DLR, KC_DELETE, KC_END, KC_PGDOWN, KC_KP_PLUS,\ KC_LCTL, FR_Q, KC_S, KC_D, KC_F, KC_G, KC_ENT, KC_H, KC_J, KC_K, KC_L, FR_M, FR_UGRV, FR_ASTR, KC_KP_1, KC_UP, KC_KP_3,\ - FR_LESS, FR_W, KC_X, KC_C, KC_V, KC_B, KC_SPACE, KC_SPACE, KC_N, FR_COMM, FR_SCLN, FR_COLN, FR_EXLM, NO_ALGR, KC_LEFT, KC_DOWN, KC_RIGHT, KC_KP_ENTER), + FR_LESS, FR_W, KC_X, KC_C, KC_V, KC_B, KC_SPACE, KC_SPACE, KC_N, FR_COMM, FR_SCLN, FR_COLN, FR_EXLM, FR_ALGR, KC_LEFT, KC_DOWN, KC_RIGHT, KC_KP_ENTER), [1] = KEYMAP( KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TAB, KC_CAPS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_FN0, KC_KP_SLASH, KC_KP_ASTERISK, KC_KP_MINUS,\ KC_LALT, FR_AMP, FR_EACU, FR_QUOT, FR_APOS, FR_LPRN, KC_BSPACE, KC_DELETE, FR_MINS, FR_EGRV, FR_UNDS, FR_CCED, FR_AGRV, FR_RPRN, FR_EQL, KC_7, KC_8, KC_9,\ KC_LGUI, FR_A, FR_Z, KC_E, KC_R, KC_T, KC_LSFT, KC_ENT, KC_Y, KC_U, KC_I, KC_O, KC_P, FR_CIRC, FR_DLR, KC_4, KC_5, KC_6, KC_KP_PLUS,\ KC_LCTL, FR_Q, KC_S, KC_D, KC_F, KC_G, KC_ENT, KC_H, KC_J, KC_K, KC_L, FR_M, FR_UGRV, FR_ASTR, KC_1, KC_2, KC_3,\ - FR_LESS, FR_W, KC_X, KC_C, KC_V, KC_B, KC_SPACE, KC_SPACE, KC_N, FR_COMM, FR_SCLN, FR_COLN, FR_EXLM, NO_ALGR, KC_LEFT, KC_DOWN, KC_RIGHT, KC_KP_ENTER), + FR_LESS, FR_W, KC_X, KC_C, KC_V, KC_B, KC_SPACE, KC_SPACE, KC_N, FR_COMM, FR_SCLN, FR_COLN, FR_EXLM, FR_ALGR, KC_LEFT, KC_DOWN, KC_RIGHT, KC_KP_ENTER), }; diff --git a/keyboards/xd75/keymaps/germanized/config.h b/keyboards/xd75/keymaps/germanized/config.h index 5b19bddb0..379b95471 100644 --- a/keyboards/xd75/keymaps/germanized/config.h +++ b/keyboards/xd75/keymaps/germanized/config.h @@ -28,7 +28,6 @@ #define TAPPING_TERM 200 // Alt gr -#define ALGR(kc) RALT(kc) #define DE_ALGR KC_RALT // normal characters diff --git a/quantum/keymap_extras/keymap_belgian.h b/quantum/keymap_extras/keymap_belgian.h index 764c56141..573fa2e8a 100644 --- a/quantum/keymap_extras/keymap_belgian.h +++ b/quantum/keymap_extras/keymap_belgian.h @@ -22,10 +22,7 @@ #define BE_LALT KC_LGUI // Alt gr -#ifndef ALGR -#define ALGR(kc) RALT(kc) -#endif -#define NO_ALGR KC_RALT +#define BE_ALGR KC_RALT // Normal characters // Line 1 diff --git a/quantum/keymap_extras/keymap_bepo.h b/quantum/keymap_extras/keymap_bepo.h index 05fd2b002..e6545a7a8 100644 --- a/quantum/keymap_extras/keymap_bepo.h +++ b/quantum/keymap_extras/keymap_bepo.h @@ -21,10 +21,7 @@ // Alt gr #ifndef ALTGR -#define ALTGR(kc) RALT(kc) -#endif -#ifndef ALGR -#define ALGR(kc) ALTGR(kc) +#define ALTGR(kc) ALGR(kc) #endif #define BP_ALGR KC_RALT diff --git a/quantum/keymap_extras/keymap_canadian_multilingual.h b/quantum/keymap_extras/keymap_canadian_multilingual.h index 1d45bee32..fbeef2187 100644 --- a/quantum/keymap_extras/keymap_canadian_multilingual.h +++ b/quantum/keymap_extras/keymap_canadian_multilingual.h @@ -20,10 +20,7 @@ // Alt gr #ifndef ALTGR -#define ALTGR(kc) RALT(kc) -#endif -#ifndef ALGR -#define ALGR(kc) ALTGR(kc) +#define ALTGR(kc) ALGR(kc) #endif #define CSA_ALTGR KC_RALT diff --git a/quantum/keymap_extras/keymap_fr_ch.h b/quantum/keymap_extras/keymap_fr_ch.h index c0ca832a6..4eeca7209 100644 --- a/quantum/keymap_extras/keymap_fr_ch.h +++ b/quantum/keymap_extras/keymap_fr_ch.h @@ -19,7 +19,6 @@ #include "keymap.h" // Alt gr -#define ALGR(kc) RALT(kc) #define FR_CH_ALGR KC_RALT // normal characters diff --git a/quantum/keymap_extras/keymap_french.h b/quantum/keymap_extras/keymap_french.h index 3308dc5f7..d2de859ee 100644 --- a/quantum/keymap_extras/keymap_french.h +++ b/quantum/keymap_extras/keymap_french.h @@ -19,10 +19,7 @@ #include "keymap.h" // Alt gr -#ifndef ALGR -#define ALGR(kc) RALT(kc) -#endif -#define NO_ALGR KC_RALT +#define FR_ALGR KC_RALT // Normal characters #define FR_SUP2 KC_GRV diff --git a/quantum/keymap_extras/keymap_german.h b/quantum/keymap_extras/keymap_german.h index e007c26ef..a215570fd 100644 --- a/quantum/keymap_extras/keymap_german.h +++ b/quantum/keymap_extras/keymap_german.h @@ -20,7 +20,6 @@ #include "keymap.h" // Alt gr -#define ALGR(kc) RALT(kc) #define DE_ALGR KC_RALT // normal characters diff --git a/quantum/keymap_extras/keymap_german_ch.h b/quantum/keymap_extras/keymap_german_ch.h index 67350d660..f0376a17c 100644 --- a/quantum/keymap_extras/keymap_german_ch.h +++ b/quantum/keymap_extras/keymap_german_ch.h @@ -19,7 +19,6 @@ #include "keymap.h" // Alt gr -#define ALGR(kc) RALT(kc) #define CH_ALGR KC_RALT // normal characters diff --git a/quantum/keymap_extras/keymap_hungarian.h b/quantum/keymap_extras/keymap_hungarian.h index b37244092..cd2dc94cf 100644 --- a/quantum/keymap_extras/keymap_hungarian.h +++ b/quantum/keymap_extras/keymap_hungarian.h @@ -20,7 +20,6 @@ #include "keymap.h" // Alt gr -#define ALGR(kc) RALT(kc) #define HU_ALGR KC_RALT // basic letters diff --git a/quantum/keymap_extras/keymap_italian.h b/quantum/keymap_extras/keymap_italian.h index 0ff6ce876..f62908150 100644 --- a/quantum/keymap_extras/keymap_italian.h +++ b/quantum/keymap_extras/keymap_italian.h @@ -20,7 +20,6 @@ #include "keymap.h" // Alt gr -#define ALGR(kc) RALT(kc) #define IT_ALGR KC_RALT // normal characters diff --git a/quantum/keymap_extras/keymap_nordic.h b/quantum/keymap_extras/keymap_nordic.h index 6b34db558..4210d3714 100644 --- a/quantum/keymap_extras/keymap_nordic.h +++ b/quantum/keymap_extras/keymap_nordic.h @@ -19,7 +19,6 @@ #include "keymap.h" // Alt gr -#define ALGR(kc) RALT(kc) #define NO_ALGR KC_RALT // Normal characters diff --git a/quantum/keymap_extras/keymap_slovenian.h b/quantum/keymap_extras/keymap_slovenian.h index f27123c2a..47f5bceed 100644 --- a/quantum/keymap_extras/keymap_slovenian.h +++ b/quantum/keymap_extras/keymap_slovenian.h @@ -21,7 +21,6 @@ #include "keymap.h" // Alt gr -#define ALGR(kc) RALT(kc) #define SI_ALGR KC_RALT //Swapped Z and Y diff --git a/quantum/keymap_extras/keymap_spanish.h b/quantum/keymap_extras/keymap_spanish.h index 224db7be1..19d12551a 100644 --- a/quantum/keymap_extras/keymap_spanish.h +++ b/quantum/keymap_extras/keymap_spanish.h @@ -19,8 +19,7 @@ #include "keymap.h" // Alt gr -#define ALGR(kc) RALT(kc) -#define NO_ALGR KC_RALT +#define ES_ALGR KC_RALT // Normal characters #define ES_OVRR KC_GRV diff --git a/quantum/keymap_extras/keymap_uk.h b/quantum/keymap_extras/keymap_uk.h index de47103cb..a7bcd697e 100644 --- a/quantum/keymap_extras/keymap_uk.h +++ b/quantum/keymap_extras/keymap_uk.h @@ -19,8 +19,7 @@ #include "keymap.h" // Alt gr -#define ALGR(kc) RALT(kc) -#define NO_ALGR KC_RALT +#define UK_ALGR KC_RALT // Normal characters #define UK_HASH KC_NUHS diff --git a/quantum/quantum.h b/quantum/quantum.h index 41c7d8351..5920e4b13 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h @@ -197,6 +197,7 @@ extern uint32_t default_layer_state; #define SS_LALT(string) SS_DOWN(X_LALT) string SS_UP(X_LALT) #define SS_LSFT(string) SS_DOWN(X_LSHIFT) string SS_UP(X_LSHIFT) #define SS_RALT(string) SS_DOWN(X_RALT) string SS_UP(X_RALT) +#define SS_ALGR(string) SS_RALT(string) #define SEND_STRING(str) send_string_P(PSTR(str)) extern const bool ascii_to_shift_lut[0x80]; diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h index 7670d53e9..283b4a65c 100644 --- a/quantum/quantum_keycodes.h +++ b/quantum/quantum_keycodes.h @@ -470,6 +470,7 @@ enum quantum_keycodes { #define RCTL(kc) (QK_RCTL | (kc)) #define RSFT(kc) (QK_RSFT | (kc)) #define RALT(kc) (QK_RALT | (kc)) +#define ALGR(kc) RALT(kc) #define RGUI(kc) (QK_RGUI | (kc)) #define RCMD(kc) RGUI(kc) #define RWIN(kc) RGUI(kc) @@ -480,7 +481,7 @@ enum quantum_keycodes { #define SGUI(kc) (QK_LGUI | QK_LSFT | (kc)) #define SCMD(kc) SGUI(kc) #define SWIN(kc) SGUI(kc) -#define LCA(kc) (QK_LCTL | QK_LALT | (kc)) +#define LCA(kc) (QK_LCTL | QK_LALT | (kc)) #define MOD_HYPR 0xf #define MOD_MEH 0x7 @@ -645,7 +646,7 @@ enum quantum_keycodes { #define ALT_T(kc) MT(MOD_LALT, kc) #define LALT_T(kc) MT(MOD_LALT, kc) #define RALT_T(kc) MT(MOD_RALT, kc) -#define ALGR_T(kc) MT(MOD_RALT, kc) // dual-function AltGR +#define ALGR_T(kc) RALT_T(kc) #define GUI_T(kc) MT(MOD_LGUI, kc) #define CMD_T(kc) GUI_T(kc) diff --git a/tmk_core/common/keycode.h b/tmk_core/common/keycode.h index d6fef2beb..ac3edbd21 100644 --- a/tmk_core/common/keycode.h +++ b/tmk_core/common/keycode.h @@ -140,6 +140,7 @@ along with this program. If not, see . #define KC_LWIN KC_LGUI #define KC_RCTL KC_RCTRL #define KC_RSFT KC_RSHIFT +#define KC_ALGR KC_RALT #define KC_RCMD KC_RGUI #define KC_RWIN KC_RGUI From baf69ee89ded94b31a81c0b97ea942f489933a5b Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Wed, 12 Dec 2018 12:46:12 -0800 Subject: [PATCH 669/788] S7 Elephant Configurator fixes (#4614) * S7 Elephant: Configurator bugfix, part 1 Reformatted the JSON so each key is on its own line: This makes the keys easier to rearrange. * S7 Elephant: Configurator bugfix, part 2 Deleted the extra key from LAYOUT_iso_1u: JSON contents stated this layout used a split Backspace, but the matrix is configured and intended to have a 2u Backspace. Extended the Backspace to 2u width and deleted the extra key. (This fixes the error that broke LAYOUT_iso_1u's rendering in the Configurator.) * S7 Elephant: Configurator bugfix, part 3 Fix ISO layouts: Noticed JSON object for Enter on ISO layouts was immediately after Right Bracket. Inspection of s7_elephant.h revealed the expected and appropriate location to be after ISO Hash. Moved Enter key to the proper location on all ISO layouts. --- keyboards/s7_elephant/info.json | 2279 ++++++++++++++++++++++++++++++- 1 file changed, 2249 insertions(+), 30 deletions(-) diff --git a/keyboards/s7_elephant/info.json b/keyboards/s7_elephant/info.json index 37f98d79d..972f20ce0 100644 --- a/keyboards/s7_elephant/info.json +++ b/keyboards/s7_elephant/info.json @@ -7,123 +7,2342 @@ "layouts": { "LAYOUT_ansi": { "key_count": 72, - "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":2.25}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4, "w":1.5}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + "layout": [ + {"label":"F1", "x":0, "y":0}, + {"label":"Esc", "x":2, "y":0}, + {"label":"!", "x":3, "y":0}, + {"label":"@", "x":4, "y":0}, + {"label":"#", "x":5, "y":0}, + {"label":"$", "x":6, "y":0}, + {"label":"%", "x":7, "y":0}, + {"label":"^", "x":8, "y":0}, + {"label":"&", "x":9, "y":0}, + {"label":"*", "x":10, "y":0}, + {"label":"(", "x":11, "y":0}, + {"label":")", "x":12, "y":0}, + {"label":"_", "x":13, "y":0}, + {"label":"+", "x":14, "y":0}, + {"label":"Backspace", "x":15, "y":0, "w":2}, + {"label":"Home", "x":17, "y":0}, + {"label":"F2", "x":0, "y":1}, + {"label":"Tab", "x":2, "y":1, "w":1.5}, + {"label":"Q", "x":3.5, "y":1}, + {"label":"W", "x":4.5, "y":1}, + {"label":"E", "x":5.5, "y":1}, + {"label":"R", "x":6.5, "y":1}, + {"label":"T", "x":7.5, "y":1}, + {"label":"Y", "x":8.5, "y":1}, + {"label":"U", "x":9.5, "y":1}, + {"label":"I", "x":10.5, "y":1}, + {"label":"O", "x":11.5, "y":1}, + {"label":"P", "x":12.5, "y":1}, + {"label":"{", "x":13.5, "y":1}, + {"label":"}", "x":14.5, "y":1}, + {"label":"|", "x":15.5, "y":1, "w":1.5}, + {"label":"End", "x":17, "y":1}, + {"label":"F3", "x":0, "y":2}, + {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, + {"label":"A", "x":3.75, "y":2}, + {"label":"S", "x":4.75, "y":2}, + {"label":"D", "x":5.75, "y":2}, + {"label":"F", "x":6.75, "y":2}, + {"label":"G", "x":7.75, "y":2}, + {"label":"H", "x":8.75, "y":2}, + {"label":"J", "x":9.75, "y":2}, + {"label":"K", "x":10.75, "y":2}, + {"label":"L", "x":11.75, "y":2}, + {"label":":", "x":12.75, "y":2}, + {"label":"\"", "x":13.75, "y":2}, + {"label":"Enter", "x":14.75, "y":2, "w":2.25}, + {"label":"Ins", "x":17, "y":2}, + {"label":"F4", "x":0, "y":3}, + {"label":"Shift", "x":2, "y":3, "w":2.25}, + {"label":"Z", "x":4.25, "y":3}, + {"label":"X", "x":5.25, "y":3}, + {"label":"C", "x":6.25, "y":3}, + {"label":"V", "x":7.25, "y":3}, + {"label":"B", "x":8.25, "y":3}, + {"label":"N", "x":9.25, "y":3}, + {"label":"M", "x":10.25, "y":3}, + {"label":"<", "x":11.25, "y":3}, + {"label":">", "x":12.25, "y":3}, + {"label":"?", "x":13.25, "y":3}, + {"label":"Shift", "x":14.25, "y":3, "w":1.75}, + {"label":"Up", "x":16, "y":3}, + {"label":"Del", "x":17, "y":3}, + {"label":"F5", "x":0, "y":4}, + {"label":"Ctrl", "x":2, "y":4, "w":1.25}, + {"label":"Win", "x":3.25, "y":4, "w":1.25}, + {"label":"Alt", "x":4.5, "y":4, "w":1.25}, + {"x":5.75, "y":4, "w":6.25}, + {"label":"Fn", "x":12, "y":4, "w":1.5}, + {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, + {"label":"Left", "x":15, "y":4}, + {"label":"Down", "x":16, "y":4}, + {"label":"Right", "x":17, "y":4} + ] }, "LAYOUT_ansi_small_lshift": { "key_count": 73, - "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4, "w":1.5}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + "layout": [ + {"label":"F1", "x":0, "y":0}, + {"label":"Esc", "x":2, "y":0}, + {"label":"!", "x":3, "y":0}, + {"label":"@", "x":4, "y":0}, + {"label":"#", "x":5, "y":0}, + {"label":"$", "x":6, "y":0}, + {"label":"%", "x":7, "y":0}, + {"label":"^", "x":8, "y":0}, + {"label":"&", "x":9, "y":0}, + {"label":"*", "x":10, "y":0}, + {"label":"(", "x":11, "y":0}, + {"label":")", "x":12, "y":0}, + {"label":"_", "x":13, "y":0}, + {"label":"+", "x":14, "y":0}, + {"label":"Backspace", "x":15, "y":0, "w":2}, + {"label":"Home", "x":17, "y":0}, + {"label":"F2", "x":0, "y":1}, + {"label":"Tab", "x":2, "y":1, "w":1.5}, + {"label":"Q", "x":3.5, "y":1}, + {"label":"W", "x":4.5, "y":1}, + {"label":"E", "x":5.5, "y":1}, + {"label":"R", "x":6.5, "y":1}, + {"label":"T", "x":7.5, "y":1}, + {"label":"Y", "x":8.5, "y":1}, + {"label":"U", "x":9.5, "y":1}, + {"label":"I", "x":10.5, "y":1}, + {"label":"O", "x":11.5, "y":1}, + {"label":"P", "x":12.5, "y":1}, + {"label":"{", "x":13.5, "y":1}, + {"label":"}", "x":14.5, "y":1}, + {"label":"|", "x":15.5, "y":1, "w":1.5}, + {"label":"End", "x":17, "y":1}, + {"label":"F3", "x":0, "y":2}, + {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, + {"label":"A", "x":3.75, "y":2}, + {"label":"S", "x":4.75, "y":2}, + {"label":"D", "x":5.75, "y":2}, + {"label":"F", "x":6.75, "y":2}, + {"label":"G", "x":7.75, "y":2}, + {"label":"H", "x":8.75, "y":2}, + {"label":"J", "x":9.75, "y":2}, + {"label":"K", "x":10.75, "y":2}, + {"label":"L", "x":11.75, "y":2}, + {"label":":", "x":12.75, "y":2}, + {"label":"\"", "x":13.75, "y":2}, + {"label":"Enter", "x":14.75, "y":2, "w":2.25}, + {"label":"Ins", "x":17, "y":2}, + {"label":"F4", "x":0, "y":3}, + {"label":"Shift", "x":2, "y":3, "w":1.25}, + {"x":3.25, "y":3}, + {"label":"Z", "x":4.25, "y":3}, + {"label":"X", "x":5.25, "y":3}, + {"label":"C", "x":6.25, "y":3}, + {"label":"V", "x":7.25, "y":3}, + {"label":"B", "x":8.25, "y":3}, + {"label":"N", "x":9.25, "y":3}, + {"label":"M", "x":10.25, "y":3}, + {"label":"<", "x":11.25, "y":3}, + {"label":">", "x":12.25, "y":3}, + {"label":"?", "x":13.25, "y":3}, + {"label":"Shift", "x":14.25, "y":3, "w":1.75}, + {"label":"Up", "x":16, "y":3}, + {"label":"Del", "x":17, "y":3}, + {"label":"F5", "x":0, "y":4}, + {"label":"Ctrl", "x":2, "y":4, "w":1.25}, + {"label":"Win", "x":3.25, "y":4, "w":1.25}, + {"label":"Alt", "x":4.5, "y":4, "w":1.25}, + {"x":5.75, "y":4, "w":6.25}, + {"label":"Fn", "x":12, "y":4, "w":1.5}, + {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, + {"label":"Left", "x":15, "y":4}, + {"label":"Down", "x":16, "y":4}, + {"label":"Right", "x":17, "y":4} + ] }, "LAYOUT_ansi_small_bspc": { "key_count": 73, - "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":2.25}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4, "w":1.5}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + "layout": [ + {"label":"F1", "x":0, "y":0}, + {"label":"Esc", "x":2, "y":0}, + {"label":"!", "x":3, "y":0}, + {"label":"@", "x":4, "y":0}, + {"label":"#", "x":5, "y":0}, + {"label":"$", "x":6, "y":0}, + {"label":"%", "x":7, "y":0}, + {"label":"^", "x":8, "y":0}, + {"label":"&", "x":9, "y":0}, + {"label":"*", "x":10, "y":0}, + {"label":"(", "x":11, "y":0}, + {"label":")", "x":12, "y":0}, + {"label":"_", "x":13, "y":0}, + {"label":"+", "x":14, "y":0}, + {"label":"Backspace", "x":15, "y":0}, + {"x":16, "y":0}, + {"label":"Home", "x":17, "y":0}, + {"label":"F2", "x":0, "y":1}, + {"label":"Tab", "x":2, "y":1, "w":1.5}, + {"label":"Q", "x":3.5, "y":1}, + {"label":"W", "x":4.5, "y":1}, + {"label":"E", "x":5.5, "y":1}, + {"label":"R", "x":6.5, "y":1}, + {"label":"T", "x":7.5, "y":1}, + {"label":"Y", "x":8.5, "y":1}, + {"label":"U", "x":9.5, "y":1}, + {"label":"I", "x":10.5, "y":1}, + {"label":"O", "x":11.5, "y":1}, + {"label":"P", "x":12.5, "y":1}, + {"label":"{", "x":13.5, "y":1}, + {"label":"}", "x":14.5, "y":1}, + {"label":"|", "x":15.5, "y":1, "w":1.5}, + {"label":"End", "x":17, "y":1}, + {"label":"F3", "x":0, "y":2}, + {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, + {"label":"A", "x":3.75, "y":2}, + {"label":"S", "x":4.75, "y":2}, + {"label":"D", "x":5.75, "y":2}, + {"label":"F", "x":6.75, "y":2}, + {"label":"G", "x":7.75, "y":2}, + {"label":"H", "x":8.75, "y":2}, + {"label":"J", "x":9.75, "y":2}, + {"label":"K", "x":10.75, "y":2}, + {"label":"L", "x":11.75, "y":2}, + {"label":":", "x":12.75, "y":2}, + {"label":"\"", "x":13.75, "y":2}, + {"label":"Enter", "x":14.75, "y":2, "w":2.25}, + {"label":"Ins", "x":17, "y":2}, + {"label":"F4", "x":0, "y":3}, + {"label":"Shift", "x":2, "y":3, "w":2.25}, + {"label":"Z", "x":4.25, "y":3}, + {"label":"X", "x":5.25, "y":3}, + {"label":"C", "x":6.25, "y":3}, + {"label":"V", "x":7.25, "y":3}, + {"label":"B", "x":8.25, "y":3}, + {"label":"N", "x":9.25, "y":3}, + {"label":"M", "x":10.25, "y":3}, + {"label":"<", "x":11.25, "y":3}, + {"label":">", "x":12.25, "y":3}, + {"label":"?", "x":13.25, "y":3}, + {"label":"Shift", "x":14.25, "y":3, "w":1.75}, + {"label":"Up", "x":16, "y":3}, + {"label":"Del", "x":17, "y":3}, + {"label":"F5", "x":0, "y":4}, + {"label":"Ctrl", "x":2, "y":4, "w":1.25}, + {"label":"Win", "x":3.25, "y":4, "w":1.25}, + {"label":"Alt", "x":4.5, "y":4, "w":1.25}, + {"x":5.75, "y":4, "w":6.25}, + {"label":"Fn", "x":12, "y":4, "w":1.5}, + {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, + {"label":"Left", "x":15, "y":4}, + {"label":"Down", "x":16, "y":4}, + {"label":"Right", "x":17, "y":4} + ] }, "LAYOUT_ansi_small_lshift_small_bspc": { "key_count": 74, - "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4, "w":1.5}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + "layout": [ + {"label":"F1", "x":0, "y":0}, + {"label":"Esc", "x":2, "y":0}, + {"label":"!", "x":3, "y":0}, + {"label":"@", "x":4, "y":0}, + {"label":"#", "x":5, "y":0}, + {"label":"$", "x":6, "y":0}, + {"label":"%", "x":7, "y":0}, + {"label":"^", "x":8, "y":0}, + {"label":"&", "x":9, "y":0}, + {"label":"*", "x":10, "y":0}, + {"label":"(", "x":11, "y":0}, + {"label":")", "x":12, "y":0}, + {"label":"_", "x":13, "y":0}, + {"label":"+", "x":14, "y":0}, + {"label":"Backspace", "x":15, "y":0}, + {"x":16, "y":0}, + {"label":"Home", "x":17, "y":0}, + {"label":"F2", "x":0, "y":1}, + {"label":"Tab", "x":2, "y":1, "w":1.5}, + {"label":"Q", "x":3.5, "y":1}, + {"label":"W", "x":4.5, "y":1}, + {"label":"E", "x":5.5, "y":1}, + {"label":"R", "x":6.5, "y":1}, + {"label":"T", "x":7.5, "y":1}, + {"label":"Y", "x":8.5, "y":1}, + {"label":"U", "x":9.5, "y":1}, + {"label":"I", "x":10.5, "y":1}, + {"label":"O", "x":11.5, "y":1}, + {"label":"P", "x":12.5, "y":1}, + {"label":"{", "x":13.5, "y":1}, + {"label":"}", "x":14.5, "y":1}, + {"label":"|", "x":15.5, "y":1, "w":1.5}, + {"label":"End", "x":17, "y":1}, + {"label":"F3", "x":0, "y":2}, + {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, + {"label":"A", "x":3.75, "y":2}, + {"label":"S", "x":4.75, "y":2}, + {"label":"D", "x":5.75, "y":2}, + {"label":"F", "x":6.75, "y":2}, + {"label":"G", "x":7.75, "y":2}, + {"label":"H", "x":8.75, "y":2}, + {"label":"J", "x":9.75, "y":2}, + {"label":"K", "x":10.75, "y":2}, + {"label":"L", "x":11.75, "y":2}, + {"label":":", "x":12.75, "y":2}, + {"label":"\"", "x":13.75, "y":2}, + {"label":"Enter", "x":14.75, "y":2, "w":2.25}, + {"label":"Ins", "x":17, "y":2}, + {"label":"F4", "x":0, "y":3}, + {"label":"Shift", "x":2, "y":3, "w":1.25}, + {"x":3.25, "y":3}, + {"label":"Z", "x":4.25, "y":3}, + {"label":"X", "x":5.25, "y":3}, + {"label":"C", "x":6.25, "y":3}, + {"label":"V", "x":7.25, "y":3}, + {"label":"B", "x":8.25, "y":3}, + {"label":"N", "x":9.25, "y":3}, + {"label":"M", "x":10.25, "y":3}, + {"label":"<", "x":11.25, "y":3}, + {"label":">", "x":12.25, "y":3}, + {"label":"?", "x":13.25, "y":3}, + {"label":"Shift", "x":14.25, "y":3, "w":1.75}, + {"label":"Up", "x":16, "y":3}, + {"label":"Del", "x":17, "y":3}, + {"label":"F5", "x":0, "y":4}, + {"label":"Ctrl", "x":2, "y":4, "w":1.25}, + {"label":"Win", "x":3.25, "y":4, "w":1.25}, + {"label":"Alt", "x":4.5, "y":4, "w":1.25}, + {"x":5.75, "y":4, "w":6.25}, + {"label":"Fn", "x":12, "y":4, "w":1.5}, + {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, + {"label":"Left", "x":15, "y":4}, + {"label":"Down", "x":16, "y":4}, + {"label":"Right", "x":17, "y":4} + ] }, "LAYOUT_ansi_1u": { "key_count": 73, - "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":2.25}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4}, {"label":"Alt", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + "layout": [ + {"label":"F1", "x":0, "y":0}, + {"label":"Esc", "x":2, "y":0}, + {"label":"!", "x":3, "y":0}, + {"label":"@", "x":4, "y":0}, + {"label":"#", "x":5, "y":0}, + {"label":"$", "x":6, "y":0}, + {"label":"%", "x":7, "y":0}, + {"label":"^", "x":8, "y":0}, + {"label":"&", "x":9, "y":0}, + {"label":"*", "x":10, "y":0}, + {"label":"(", "x":11, "y":0}, + {"label":")", "x":12, "y":0}, + {"label":"_", "x":13, "y":0}, + {"label":"+", "x":14, "y":0}, + {"label":"Backspace", "x":15, "y":0, "w":2}, + {"label":"Home", "x":17, "y":0}, + {"label":"F2", "x":0, "y":1}, + {"label":"Tab", "x":2, "y":1, "w":1.5}, + {"label":"Q", "x":3.5, "y":1}, + {"label":"W", "x":4.5, "y":1}, + {"label":"E", "x":5.5, "y":1}, + {"label":"R", "x":6.5, "y":1}, + {"label":"T", "x":7.5, "y":1}, + {"label":"Y", "x":8.5, "y":1}, + {"label":"U", "x":9.5, "y":1}, + {"label":"I", "x":10.5, "y":1}, + {"label":"O", "x":11.5, "y":1}, + {"label":"P", "x":12.5, "y":1}, + {"label":"{", "x":13.5, "y":1}, + {"label":"}", "x":14.5, "y":1}, + {"label":"|", "x":15.5, "y":1, "w":1.5}, + {"label":"End", "x":17, "y":1}, + {"label":"F3", "x":0, "y":2}, + {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, + {"label":"A", "x":3.75, "y":2}, + {"label":"S", "x":4.75, "y":2}, + {"label":"D", "x":5.75, "y":2}, + {"label":"F", "x":6.75, "y":2}, + {"label":"G", "x":7.75, "y":2}, + {"label":"H", "x":8.75, "y":2}, + {"label":"J", "x":9.75, "y":2}, + {"label":"K", "x":10.75, "y":2}, + {"label":"L", "x":11.75, "y":2}, + {"label":":", "x":12.75, "y":2}, + {"label":"\"", "x":13.75, "y":2}, + {"label":"Enter", "x":14.75, "y":2, "w":2.25}, + {"label":"Ins", "x":17, "y":2}, + {"label":"F4", "x":0, "y":3}, + {"label":"Shift", "x":2, "y":3, "w":2.25}, + {"label":"Z", "x":4.25, "y":3}, + {"label":"X", "x":5.25, "y":3}, + {"label":"C", "x":6.25, "y":3}, + {"label":"V", "x":7.25, "y":3}, + {"label":"B", "x":8.25, "y":3}, + {"label":"N", "x":9.25, "y":3}, + {"label":"M", "x":10.25, "y":3}, + {"label":"<", "x":11.25, "y":3}, + {"label":">", "x":12.25, "y":3}, + {"label":"?", "x":13.25, "y":3}, + {"label":"Shift", "x":14.25, "y":3, "w":1.75}, + {"label":"Up", "x":16, "y":3}, + {"label":"Del", "x":17, "y":3}, + {"label":"F5", "x":0, "y":4}, + {"label":"Ctrl", "x":2, "y":4, "w":1.25}, + {"label":"Win", "x":3.25, "y":4, "w":1.25}, + {"label":"Alt", "x":4.5, "y":4, "w":1.25}, + {"x":5.75, "y":4, "w":6.25}, + {"label":"Fn", "x":12, "y":4}, + {"label":"Alt", "x":13, "y":4}, + {"label":"Ctrl", "x":14, "y":4}, + {"label":"Left", "x":15, "y":4}, + {"label":"Down", "x":16, "y":4}, + {"label":"Right", "x":17, "y":4} + ] }, "LAYOUT_ansi_1u_small_lshift": { "key_count": 74, - "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4}, {"label":"Alt", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + "layout": [ + {"label":"F1", "x":0, "y":0}, + {"label":"Esc", "x":2, "y":0}, + {"label":"!", "x":3, "y":0}, + {"label":"@", "x":4, "y":0}, + {"label":"#", "x":5, "y":0}, + {"label":"$", "x":6, "y":0}, + {"label":"%", "x":7, "y":0}, + {"label":"^", "x":8, "y":0}, + {"label":"&", "x":9, "y":0}, + {"label":"*", "x":10, "y":0}, + {"label":"(", "x":11, "y":0}, + {"label":")", "x":12, "y":0}, + {"label":"_", "x":13, "y":0}, + {"label":"+", "x":14, "y":0}, + {"label":"Backspace", "x":15, "y":0, "w":2}, + {"label":"Home", "x":17, "y":0}, + {"label":"F2", "x":0, "y":1}, + {"label":"Tab", "x":2, "y":1, "w":1.5}, + {"label":"Q", "x":3.5, "y":1}, + {"label":"W", "x":4.5, "y":1}, + {"label":"E", "x":5.5, "y":1}, + {"label":"R", "x":6.5, "y":1}, + {"label":"T", "x":7.5, "y":1}, + {"label":"Y", "x":8.5, "y":1}, + {"label":"U", "x":9.5, "y":1}, + {"label":"I", "x":10.5, "y":1}, + {"label":"O", "x":11.5, "y":1}, + {"label":"P", "x":12.5, "y":1}, + {"label":"{", "x":13.5, "y":1}, + {"label":"}", "x":14.5, "y":1}, + {"label":"|", "x":15.5, "y":1, "w":1.5}, + {"label":"End", "x":17, "y":1}, + {"label":"F3", "x":0, "y":2}, + {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, + {"label":"A", "x":3.75, "y":2}, + {"label":"S", "x":4.75, "y":2}, + {"label":"D", "x":5.75, "y":2}, + {"label":"F", "x":6.75, "y":2}, + {"label":"G", "x":7.75, "y":2}, + {"label":"H", "x":8.75, "y":2}, + {"label":"J", "x":9.75, "y":2}, + {"label":"K", "x":10.75, "y":2}, + {"label":"L", "x":11.75, "y":2}, + {"label":":", "x":12.75, "y":2}, + {"label":"\"", "x":13.75, "y":2}, + {"label":"Enter", "x":14.75, "y":2, "w":2.25}, + {"label":"Ins", "x":17, "y":2}, + {"label":"F4", "x":0, "y":3}, + {"label":"Shift", "x":2, "y":3, "w":1.25}, + {"x":3.25, "y":3}, + {"label":"Z", "x":4.25, "y":3}, + {"label":"X", "x":5.25, "y":3}, + {"label":"C", "x":6.25, "y":3}, + {"label":"V", "x":7.25, "y":3}, + {"label":"B", "x":8.25, "y":3}, + {"label":"N", "x":9.25, "y":3}, + {"label":"M", "x":10.25, "y":3}, + {"label":"<", "x":11.25, "y":3}, + {"label":">", "x":12.25, "y":3}, + {"label":"?", "x":13.25, "y":3}, + {"label":"Shift", "x":14.25, "y":3, "w":1.75}, + {"label":"Up", "x":16, "y":3}, + {"label":"Del", "x":17, "y":3}, + {"label":"F5", "x":0, "y":4}, + {"label":"Ctrl", "x":2, "y":4, "w":1.25}, + {"label":"Win", "x":3.25, "y":4, "w":1.25}, + {"label":"Alt", "x":4.5, "y":4, "w":1.25}, + {"x":5.75, "y":4, "w":6.25}, + {"label":"Fn", "x":12, "y":4}, + {"label":"Alt", "x":13, "y":4}, + {"label":"Ctrl", "x":14, "y":4}, + {"label":"Left", "x":15, "y":4}, + {"label":"Down", "x":16, "y":4}, + {"label":"Right", "x":17, "y":4} + ] }, "LAYOUT_ansi_1u_small_bspc": { "key_count": 74, - "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":2.25}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4}, {"label":"Alt", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + "layout": [ + {"label":"F1", "x":0, "y":0}, + {"label":"Esc", "x":2, "y":0}, + {"label":"!", "x":3, "y":0}, + {"label":"@", "x":4, "y":0}, + {"label":"#", "x":5, "y":0}, + {"label":"$", "x":6, "y":0}, + {"label":"%", "x":7, "y":0}, + {"label":"^", "x":8, "y":0}, + {"label":"&", "x":9, "y":0}, + {"label":"*", "x":10, "y":0}, + {"label":"(", "x":11, "y":0}, + {"label":")", "x":12, "y":0}, + {"label":"_", "x":13, "y":0}, + {"label":"+", "x":14, "y":0}, + {"label":"Backspace", "x":15, "y":0}, + {"x":16, "y":0}, + {"label":"Home", "x":17, "y":0}, + {"label":"F2", "x":0, "y":1}, + {"label":"Tab", "x":2, "y":1, "w":1.5}, + {"label":"Q", "x":3.5, "y":1}, + {"label":"W", "x":4.5, "y":1}, + {"label":"E", "x":5.5, "y":1}, + {"label":"R", "x":6.5, "y":1}, + {"label":"T", "x":7.5, "y":1}, + {"label":"Y", "x":8.5, "y":1}, + {"label":"U", "x":9.5, "y":1}, + {"label":"I", "x":10.5, "y":1}, + {"label":"O", "x":11.5, "y":1}, + {"label":"P", "x":12.5, "y":1}, + {"label":"{", "x":13.5, "y":1}, + {"label":"}", "x":14.5, "y":1}, + {"label":"|", "x":15.5, "y":1, "w":1.5}, + {"label":"End", "x":17, "y":1}, + {"label":"F3", "x":0, "y":2}, + {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, + {"label":"A", "x":3.75, "y":2}, + {"label":"S", "x":4.75, "y":2}, + {"label":"D", "x":5.75, "y":2}, + {"label":"F", "x":6.75, "y":2}, + {"label":"G", "x":7.75, "y":2}, + {"label":"H", "x":8.75, "y":2}, + {"label":"J", "x":9.75, "y":2}, + {"label":"K", "x":10.75, "y":2}, + {"label":"L", "x":11.75, "y":2}, + {"label":":", "x":12.75, "y":2}, + {"label":"\"", "x":13.75, "y":2}, + {"label":"Enter", "x":14.75, "y":2, "w":2.25}, + {"label":"Ins", "x":17, "y":2}, + {"label":"F4", "x":0, "y":3}, + {"label":"Shift", "x":2, "y":3, "w":2.25}, + {"label":"Z", "x":4.25, "y":3}, + {"label":"X", "x":5.25, "y":3}, + {"label":"C", "x":6.25, "y":3}, + {"label":"V", "x":7.25, "y":3}, + {"label":"B", "x":8.25, "y":3}, + {"label":"N", "x":9.25, "y":3}, + {"label":"M", "x":10.25, "y":3}, + {"label":"<", "x":11.25, "y":3}, + {"label":">", "x":12.25, "y":3}, + {"label":"?", "x":13.25, "y":3}, + {"label":"Shift", "x":14.25, "y":3, "w":1.75}, + {"label":"Up", "x":16, "y":3}, + {"label":"Del", "x":17, "y":3}, + {"label":"F5", "x":0, "y":4}, + {"label":"Ctrl", "x":2, "y":4, "w":1.25}, + {"label":"Win", "x":3.25, "y":4, "w":1.25}, + {"label":"Alt", "x":4.5, "y":4, "w":1.25}, + {"x":5.75, "y":4, "w":6.25}, + {"label":"Fn", "x":12, "y":4}, + {"label":"Alt", "x":13, "y":4}, + {"label":"Ctrl", "x":14, "y":4}, + {"label":"Left", "x":15, "y":4}, + {"label":"Down", "x":16, "y":4}, + {"label":"Right", "x":17, "y":4} + ] }, "LAYOUT_ansi_1u_small_lshift_small_bspc": { "key_count": 75, - "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4}, {"label":"Alt", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + "layout": [ + {"label":"F1", "x":0, "y":0}, + {"label":"Esc", "x":2, "y":0}, + {"label":"!", "x":3, "y":0}, + {"label":"@", "x":4, "y":0}, + {"label":"#", "x":5, "y":0}, + {"label":"$", "x":6, "y":0}, + {"label":"%", "x":7, "y":0}, + {"label":"^", "x":8, "y":0}, + {"label":"&", "x":9, "y":0}, + {"label":"*", "x":10, "y":0}, + {"label":"(", "x":11, "y":0}, + {"label":")", "x":12, "y":0}, + {"label":"_", "x":13, "y":0}, + {"label":"+", "x":14, "y":0}, + {"label":"Backspace", "x":15, "y":0}, + {"x":16, "y":0}, + {"label":"Home", "x":17, "y":0}, + {"label":"F2", "x":0, "y":1}, + {"label":"Tab", "x":2, "y":1, "w":1.5}, + {"label":"Q", "x":3.5, "y":1}, + {"label":"W", "x":4.5, "y":1}, + {"label":"E", "x":5.5, "y":1}, + {"label":"R", "x":6.5, "y":1}, + {"label":"T", "x":7.5, "y":1}, + {"label":"Y", "x":8.5, "y":1}, + {"label":"U", "x":9.5, "y":1}, + {"label":"I", "x":10.5, "y":1}, + {"label":"O", "x":11.5, "y":1}, + {"label":"P", "x":12.5, "y":1}, + {"label":"{", "x":13.5, "y":1}, + {"label":"}", "x":14.5, "y":1}, + {"label":"|", "x":15.5, "y":1, "w":1.5}, + {"label":"End", "x":17, "y":1}, + {"label":"F3", "x":0, "y":2}, + {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, + {"label":"A", "x":3.75, "y":2}, + {"label":"S", "x":4.75, "y":2}, + {"label":"D", "x":5.75, "y":2}, + {"label":"F", "x":6.75, "y":2}, + {"label":"G", "x":7.75, "y":2}, + {"label":"H", "x":8.75, "y":2}, + {"label":"J", "x":9.75, "y":2}, + {"label":"K", "x":10.75, "y":2}, + {"label":"L", "x":11.75, "y":2}, + {"label":":", "x":12.75, "y":2}, + {"label":"\"", "x":13.75, "y":2}, + {"label":"Enter", "x":14.75, "y":2, "w":2.25}, + {"label":"Ins", "x":17, "y":2}, + {"label":"F4", "x":0, "y":3}, + {"label":"Shift", "x":2, "y":3, "w":1.25}, + {"x":3.25, "y":3}, + {"label":"Z", "x":4.25, "y":3}, + {"label":"X", "x":5.25, "y":3}, + {"label":"C", "x":6.25, "y":3}, + {"label":"V", "x":7.25, "y":3}, + {"label":"B", "x":8.25, "y":3}, + {"label":"N", "x":9.25, "y":3}, + {"label":"M", "x":10.25, "y":3}, + {"label":"<", "x":11.25, "y":3}, + {"label":">", "x":12.25, "y":3}, + {"label":"?", "x":13.25, "y":3}, + {"label":"Shift", "x":14.25, "y":3, "w":1.75}, + {"label":"Up", "x":16, "y":3}, + {"label":"Del", "x":17, "y":3}, + {"label":"F5", "x":0, "y":4}, + {"label":"Ctrl", "x":2, "y":4, "w":1.25}, + {"label":"Win", "x":3.25, "y":4, "w":1.25}, + {"label":"Alt", "x":4.5, "y":4, "w":1.25}, + {"x":5.75, "y":4, "w":6.25}, + {"label":"Fn", "x":12, "y":4}, + {"label":"Alt", "x":13, "y":4}, + {"label":"Ctrl", "x":14, "y":4}, + {"label":"Left", "x":15, "y":4}, + {"label":"Down", "x":16, "y":4}, + {"label":"Right", "x":17, "y":4} + ] }, "LAYOUT_ansi_7u": { "key_count": 71, - "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":2.25}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.5}, {"label":"Win", "x":3.5, "y":4, "w":1.5}, {"x":5, "y":4, "w":7}, {"label":"Fn", "x":12, "y":4, "w":1.5}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + "layout": [ + {"label":"F1", "x":0, "y":0}, + {"label":"Esc", "x":2, "y":0}, + {"label":"!", "x":3, "y":0}, + {"label":"@", "x":4, "y":0}, + {"label":"#", "x":5, "y":0}, + {"label":"$", "x":6, "y":0}, + {"label":"%", "x":7, "y":0}, + {"label":"^", "x":8, "y":0}, + {"label":"&", "x":9, "y":0}, + {"label":"*", "x":10, "y":0}, + {"label":"(", "x":11, "y":0}, + {"label":")", "x":12, "y":0}, + {"label":"_", "x":13, "y":0}, + {"label":"+", "x":14, "y":0}, + {"label":"Backspace", "x":15, "y":0, "w":2}, + {"label":"Home", "x":17, "y":0}, + {"label":"F2", "x":0, "y":1}, + {"label":"Tab", "x":2, "y":1, "w":1.5}, + {"label":"Q", "x":3.5, "y":1}, + {"label":"W", "x":4.5, "y":1}, + {"label":"E", "x":5.5, "y":1}, + {"label":"R", "x":6.5, "y":1}, + {"label":"T", "x":7.5, "y":1}, + {"label":"Y", "x":8.5, "y":1}, + {"label":"U", "x":9.5, "y":1}, + {"label":"I", "x":10.5, "y":1}, + {"label":"O", "x":11.5, "y":1}, + {"label":"P", "x":12.5, "y":1}, + {"label":"{", "x":13.5, "y":1}, + {"label":"}", "x":14.5, "y":1}, + {"label":"|", "x":15.5, "y":1, "w":1.5}, + {"label":"End", "x":17, "y":1}, + {"label":"F3", "x":0, "y":2}, + {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, + {"label":"A", "x":3.75, "y":2}, + {"label":"S", "x":4.75, "y":2}, + {"label":"D", "x":5.75, "y":2}, + {"label":"F", "x":6.75, "y":2}, + {"label":"G", "x":7.75, "y":2}, + {"label":"H", "x":8.75, "y":2}, + {"label":"J", "x":9.75, "y":2}, + {"label":"K", "x":10.75, "y":2}, + {"label":"L", "x":11.75, "y":2}, + {"label":":", "x":12.75, "y":2}, + {"label":"\"", "x":13.75, "y":2}, + {"label":"Enter", "x":14.75, "y":2, "w":2.25}, + {"label":"Ins", "x":17, "y":2}, + {"label":"F4", "x":0, "y":3}, + {"label":"Shift", "x":2, "y":3, "w":2.25}, + {"label":"Z", "x":4.25, "y":3}, + {"label":"X", "x":5.25, "y":3}, + {"label":"C", "x":6.25, "y":3}, + {"label":"V", "x":7.25, "y":3}, + {"label":"B", "x":8.25, "y":3}, + {"label":"N", "x":9.25, "y":3}, + {"label":"M", "x":10.25, "y":3}, + {"label":"<", "x":11.25, "y":3}, + {"label":">", "x":12.25, "y":3}, + {"label":"?", "x":13.25, "y":3}, + {"label":"Shift", "x":14.25, "y":3, "w":1.75}, + {"label":"Up", "x":16, "y":3}, + {"label":"Del", "x":17, "y":3}, + {"label":"F5", "x":0, "y":4}, + {"label":"Ctrl", "x":2, "y":4, "w":1.5}, + {"label":"Win", "x":3.5, "y":4, "w":1.5}, + {"x":5, "y":4, "w":7}, + {"label":"Fn", "x":12, "y":4, "w":1.5}, + {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, + {"label":"Left", "x":15, "y":4}, + {"label":"Down", "x":16, "y":4}, + {"label":"Right", "x":17, "y":4} + ] }, "LAYOUT_ansi_7u_small_lshift": { "key_count": 72, - "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.5}, {"label":"Win", "x":3.5, "y":4, "w":1.5}, {"x":5, "y":4, "w":7}, {"label":"Fn", "x":12, "y":4, "w":1.5}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + "layout": [ + {"label":"F1", "x":0, "y":0}, + {"label":"Esc", "x":2, "y":0}, + {"label":"!", "x":3, "y":0}, + {"label":"@", "x":4, "y":0}, + {"label":"#", "x":5, "y":0}, + {"label":"$", "x":6, "y":0}, + {"label":"%", "x":7, "y":0}, + {"label":"^", "x":8, "y":0}, + {"label":"&", "x":9, "y":0}, + {"label":"*", "x":10, "y":0}, + {"label":"(", "x":11, "y":0}, + {"label":")", "x":12, "y":0}, + {"label":"_", "x":13, "y":0}, + {"label":"+", "x":14, "y":0}, + {"label":"Backspace", "x":15, "y":0, "w":2}, + {"label":"Home", "x":17, "y":0}, + {"label":"F2", "x":0, "y":1}, + {"label":"Tab", "x":2, "y":1, "w":1.5}, + {"label":"Q", "x":3.5, "y":1}, + {"label":"W", "x":4.5, "y":1}, + {"label":"E", "x":5.5, "y":1}, + {"label":"R", "x":6.5, "y":1}, + {"label":"T", "x":7.5, "y":1}, + {"label":"Y", "x":8.5, "y":1}, + {"label":"U", "x":9.5, "y":1}, + {"label":"I", "x":10.5, "y":1}, + {"label":"O", "x":11.5, "y":1}, + {"label":"P", "x":12.5, "y":1}, + {"label":"{", "x":13.5, "y":1}, + {"label":"}", "x":14.5, "y":1}, + {"label":"|", "x":15.5, "y":1, "w":1.5}, + {"label":"End", "x":17, "y":1}, + {"label":"F3", "x":0, "y":2}, + {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, + {"label":"A", "x":3.75, "y":2}, + {"label":"S", "x":4.75, "y":2}, + {"label":"D", "x":5.75, "y":2}, + {"label":"F", "x":6.75, "y":2}, + {"label":"G", "x":7.75, "y":2}, + {"label":"H", "x":8.75, "y":2}, + {"label":"J", "x":9.75, "y":2}, + {"label":"K", "x":10.75, "y":2}, + {"label":"L", "x":11.75, "y":2}, + {"label":":", "x":12.75, "y":2}, + {"label":"\"", "x":13.75, "y":2}, + {"label":"Enter", "x":14.75, "y":2, "w":2.25}, + {"label":"Ins", "x":17, "y":2}, + {"label":"F4", "x":0, "y":3}, + {"label":"Shift", "x":2, "y":3, "w":1.25}, + {"x":3.25, "y":3}, + {"label":"Z", "x":4.25, "y":3}, + {"label":"X", "x":5.25, "y":3}, + {"label":"C", "x":6.25, "y":3}, + {"label":"V", "x":7.25, "y":3}, + {"label":"B", "x":8.25, "y":3}, + {"label":"N", "x":9.25, "y":3}, + {"label":"M", "x":10.25, "y":3}, + {"label":"<", "x":11.25, "y":3}, + {"label":">", "x":12.25, "y":3}, + {"label":"?", "x":13.25, "y":3}, + {"label":"Shift", "x":14.25, "y":3, "w":1.75}, + {"label":"Up", "x":16, "y":3}, + {"label":"Del", "x":17, "y":3}, + {"label":"F5", "x":0, "y":4}, + {"label":"Ctrl", "x":2, "y":4, "w":1.5}, + {"label":"Win", "x":3.5, "y":4, "w":1.5}, + {"x":5, "y":4, "w":7}, + {"label":"Fn", "x":12, "y":4, "w":1.5}, + {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, + {"label":"Left", "x":15, "y":4}, + {"label":"Down", "x":16, "y":4}, + {"label":"Right", "x":17, "y":4} + ] }, "LAYOUT_ansi_7u_small_bspc": { "key_count": 72, - "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":2.25}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.5}, {"label":"Win", "x":3.5, "y":4, "w":1.5}, {"x":5, "y":4, "w":7}, {"label":"Fn", "x":12, "y":4, "w":1.5}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + "layout": [ + {"label":"F1", "x":0, "y":0}, + {"label":"Esc", "x":2, "y":0}, + {"label":"!", "x":3, "y":0}, + {"label":"@", "x":4, "y":0}, + {"label":"#", "x":5, "y":0}, + {"label":"$", "x":6, "y":0}, + {"label":"%", "x":7, "y":0}, + {"label":"^", "x":8, "y":0}, + {"label":"&", "x":9, "y":0}, + {"label":"*", "x":10, "y":0}, + {"label":"(", "x":11, "y":0}, + {"label":")", "x":12, "y":0}, + {"label":"_", "x":13, "y":0}, + {"label":"+", "x":14, "y":0}, + {"label":"Backspace", "x":15, "y":0}, + {"x":16, "y":0}, + {"label":"Home", "x":17, "y":0}, + {"label":"F2", "x":0, "y":1}, + {"label":"Tab", "x":2, "y":1, "w":1.5}, + {"label":"Q", "x":3.5, "y":1}, + {"label":"W", "x":4.5, "y":1}, + {"label":"E", "x":5.5, "y":1}, + {"label":"R", "x":6.5, "y":1}, + {"label":"T", "x":7.5, "y":1}, + {"label":"Y", "x":8.5, "y":1}, + {"label":"U", "x":9.5, "y":1}, + {"label":"I", "x":10.5, "y":1}, + {"label":"O", "x":11.5, "y":1}, + {"label":"P", "x":12.5, "y":1}, + {"label":"{", "x":13.5, "y":1}, + {"label":"}", "x":14.5, "y":1}, + {"label":"|", "x":15.5, "y":1, "w":1.5}, + {"label":"End", "x":17, "y":1}, + {"label":"F3", "x":0, "y":2}, + {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, + {"label":"A", "x":3.75, "y":2}, + {"label":"S", "x":4.75, "y":2}, + {"label":"D", "x":5.75, "y":2}, + {"label":"F", "x":6.75, "y":2}, + {"label":"G", "x":7.75, "y":2}, + {"label":"H", "x":8.75, "y":2}, + {"label":"J", "x":9.75, "y":2}, + {"label":"K", "x":10.75, "y":2}, + {"label":"L", "x":11.75, "y":2}, + {"label":":", "x":12.75, "y":2}, + {"label":"\"", "x":13.75, "y":2}, + {"label":"Enter", "x":14.75, "y":2, "w":2.25}, + {"label":"Ins", "x":17, "y":2}, + {"label":"F4", "x":0, "y":3}, + {"label":"Shift", "x":2, "y":3, "w":2.25}, + {"label":"Z", "x":4.25, "y":3}, + {"label":"X", "x":5.25, "y":3}, + {"label":"C", "x":6.25, "y":3}, + {"label":"V", "x":7.25, "y":3}, + {"label":"B", "x":8.25, "y":3}, + {"label":"N", "x":9.25, "y":3}, + {"label":"M", "x":10.25, "y":3}, + {"label":"<", "x":11.25, "y":3}, + {"label":">", "x":12.25, "y":3}, + {"label":"?", "x":13.25, "y":3}, + {"label":"Shift", "x":14.25, "y":3, "w":1.75}, + {"label":"Up", "x":16, "y":3}, + {"label":"Del", "x":17, "y":3}, + {"label":"F5", "x":0, "y":4}, + {"label":"Ctrl", "x":2, "y":4, "w":1.5}, + {"label":"Win", "x":3.5, "y":4, "w":1.5}, + {"x":5, "y":4, "w":7}, + {"label":"Fn", "x":12, "y":4, "w":1.5}, + {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, + {"label":"Left", "x":15, "y":4}, + {"label":"Down", "x":16, "y":4}, + {"label":"Right", "x":17, "y":4} + ] }, "LAYOUT_ansi_7u_small_lshift_small_bspc": { "key_count": 73, - "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.5}, {"label":"Win", "x":3.5, "y":4, "w":1.5}, {"x":5, "y":4, "w":7}, {"label":"Fn", "x":12, "y":4, "w":1.5}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + "layout": [ + {"label":"F1", "x":0, "y":0}, + {"label":"Esc", "x":2, "y":0}, + {"label":"!", "x":3, "y":0}, + {"label":"@", "x":4, "y":0}, + {"label":"#", "x":5, "y":0}, + {"label":"$", "x":6, "y":0}, + {"label":"%", "x":7, "y":0}, + {"label":"^", "x":8, "y":0}, + {"label":"&", "x":9, "y":0}, + {"label":"*", "x":10, "y":0}, + {"label":"(", "x":11, "y":0}, + {"label":")", "x":12, "y":0}, + {"label":"_", "x":13, "y":0}, + {"label":"+", "x":14, "y":0}, + {"label":"Backspace", "x":15, "y":0}, + {"x":16, "y":0}, + {"label":"Home", "x":17, "y":0}, + {"label":"F2", "x":0, "y":1}, + {"label":"Tab", "x":2, "y":1, "w":1.5}, + {"label":"Q", "x":3.5, "y":1}, + {"label":"W", "x":4.5, "y":1}, + {"label":"E", "x":5.5, "y":1}, + {"label":"R", "x":6.5, "y":1}, + {"label":"T", "x":7.5, "y":1}, + {"label":"Y", "x":8.5, "y":1}, + {"label":"U", "x":9.5, "y":1}, + {"label":"I", "x":10.5, "y":1}, + {"label":"O", "x":11.5, "y":1}, + {"label":"P", "x":12.5, "y":1}, + {"label":"{", "x":13.5, "y":1}, + {"label":"}", "x":14.5, "y":1}, + {"label":"|", "x":15.5, "y":1, "w":1.5}, + {"label":"End", "x":17, "y":1}, + {"label":"F3", "x":0, "y":2}, + {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, + {"label":"A", "x":3.75, "y":2}, + {"label":"S", "x":4.75, "y":2}, + {"label":"D", "x":5.75, "y":2}, + {"label":"F", "x":6.75, "y":2}, + {"label":"G", "x":7.75, "y":2}, + {"label":"H", "x":8.75, "y":2}, + {"label":"J", "x":9.75, "y":2}, + {"label":"K", "x":10.75, "y":2}, + {"label":"L", "x":11.75, "y":2}, + {"label":":", "x":12.75, "y":2}, + {"label":"\"", "x":13.75, "y":2}, + {"label":"Enter", "x":14.75, "y":2, "w":2.25}, + {"label":"Ins", "x":17, "y":2}, + {"label":"F4", "x":0, "y":3}, + {"label":"Shift", "x":2, "y":3, "w":1.25}, + {"x":3.25, "y":3}, + {"label":"Z", "x":4.25, "y":3}, + {"label":"X", "x":5.25, "y":3}, + {"label":"C", "x":6.25, "y":3}, + {"label":"V", "x":7.25, "y":3}, + {"label":"B", "x":8.25, "y":3}, + {"label":"N", "x":9.25, "y":3}, + {"label":"M", "x":10.25, "y":3}, + {"label":"<", "x":11.25, "y":3}, + {"label":">", "x":12.25, "y":3}, + {"label":"?", "x":13.25, "y":3}, + {"label":"Shift", "x":14.25, "y":3, "w":1.75}, + {"label":"Up", "x":16, "y":3}, + {"label":"Del", "x":17, "y":3}, + {"label":"F5", "x":0, "y":4}, + {"label":"Ctrl", "x":2, "y":4, "w":1.5}, + {"label":"Win", "x":3.5, "y":4, "w":1.5}, + {"x":5, "y":4, "w":7}, + {"label":"Fn", "x":12, "y":4, "w":1.5}, + {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, + {"label":"Left", "x":15, "y":4}, + {"label":"Down", "x":16, "y":4}, + {"label":"Right", "x":17, "y":4} + ] }, "LAYOUT_ansi_blocker": { "key_count": 72, - "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":2.25}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.25, "y":4, "w":1.25}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + "layout": [ + {"label":"F1", "x":0, "y":0}, + {"label":"Esc", "x":2, "y":0}, + {"label":"!", "x":3, "y":0}, + {"label":"@", "x":4, "y":0}, + {"label":"#", "x":5, "y":0}, + {"label":"$", "x":6, "y":0}, + {"label":"%", "x":7, "y":0}, + {"label":"^", "x":8, "y":0}, + {"label":"&", "x":9, "y":0}, + {"label":"*", "x":10, "y":0}, + {"label":"(", "x":11, "y":0}, + {"label":")", "x":12, "y":0}, + {"label":"_", "x":13, "y":0}, + {"label":"+", "x":14, "y":0}, + {"label":"Backspace", "x":15, "y":0, "w":2}, + {"label":"Home", "x":17, "y":0}, + {"label":"F2", "x":0, "y":1}, + {"label":"Tab", "x":2, "y":1, "w":1.5}, + {"label":"Q", "x":3.5, "y":1}, + {"label":"W", "x":4.5, "y":1}, + {"label":"E", "x":5.5, "y":1}, + {"label":"R", "x":6.5, "y":1}, + {"label":"T", "x":7.5, "y":1}, + {"label":"Y", "x":8.5, "y":1}, + {"label":"U", "x":9.5, "y":1}, + {"label":"I", "x":10.5, "y":1}, + {"label":"O", "x":11.5, "y":1}, + {"label":"P", "x":12.5, "y":1}, + {"label":"{", "x":13.5, "y":1}, + {"label":"}", "x":14.5, "y":1}, + {"label":"|", "x":15.5, "y":1, "w":1.5}, + {"label":"End", "x":17, "y":1}, + {"label":"F3", "x":0, "y":2}, + {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, + {"label":"A", "x":3.75, "y":2}, + {"label":"S", "x":4.75, "y":2}, + {"label":"D", "x":5.75, "y":2}, + {"label":"F", "x":6.75, "y":2}, + {"label":"G", "x":7.75, "y":2}, + {"label":"H", "x":8.75, "y":2}, + {"label":"J", "x":9.75, "y":2}, + {"label":"K", "x":10.75, "y":2}, + {"label":"L", "x":11.75, "y":2}, + {"label":":", "x":12.75, "y":2}, + {"label":"\"", "x":13.75, "y":2}, + {"label":"Enter", "x":14.75, "y":2, "w":2.25}, + {"label":"Ins", "x":17, "y":2}, + {"label":"F4", "x":0, "y":3}, + {"label":"Shift", "x":2, "y":3, "w":2.25}, + {"label":"Z", "x":4.25, "y":3}, + {"label":"X", "x":5.25, "y":3}, + {"label":"C", "x":6.25, "y":3}, + {"label":"V", "x":7.25, "y":3}, + {"label":"B", "x":8.25, "y":3}, + {"label":"N", "x":9.25, "y":3}, + {"label":"M", "x":10.25, "y":3}, + {"label":"<", "x":11.25, "y":3}, + {"label":">", "x":12.25, "y":3}, + {"label":"?", "x":13.25, "y":3}, + {"label":"Shift", "x":14.25, "y":3, "w":1.75}, + {"label":"Up", "x":16, "y":3}, + {"label":"Del", "x":17, "y":3}, + {"label":"F5", "x":0, "y":4}, + {"label":"Ctrl", "x":2, "y":4, "w":1.25}, + {"label":"Win", "x":3.25, "y":4, "w":1.25}, + {"label":"Alt", "x":4.5, "y":4, "w":1.25}, + {"x":5.75, "y":4, "w":6.25}, + {"label":"Fn", "x":12, "y":4, "w":1.25}, + {"label":"Ctrl", "x":13.25, "y":4, "w":1.25}, + {"label":"Left", "x":15, "y":4}, + {"label":"Down", "x":16, "y":4}, + {"label":"Right", "x":17, "y":4} + ] }, "LAYOUT_ansi_blocker_small_lshift": { "key_count": 73, - "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.25, "y":4, "w":1.25}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + "layout": [ + {"label":"F1", "x":0, "y":0}, + {"label":"Esc", "x":2, "y":0}, + {"label":"!", "x":3, "y":0}, + {"label":"@", "x":4, "y":0}, + {"label":"#", "x":5, "y":0}, + {"label":"$", "x":6, "y":0}, + {"label":"%", "x":7, "y":0}, + {"label":"^", "x":8, "y":0}, + {"label":"&", "x":9, "y":0}, + {"label":"*", "x":10, "y":0}, + {"label":"(", "x":11, "y":0}, + {"label":")", "x":12, "y":0}, + {"label":"_", "x":13, "y":0}, + {"label":"+", "x":14, "y":0}, + {"label":"Backspace", "x":15, "y":0, "w":2}, + {"label":"Home", "x":17, "y":0}, + {"label":"F2", "x":0, "y":1}, + {"label":"Tab", "x":2, "y":1, "w":1.5}, + {"label":"Q", "x":3.5, "y":1}, + {"label":"W", "x":4.5, "y":1}, + {"label":"E", "x":5.5, "y":1}, + {"label":"R", "x":6.5, "y":1}, + {"label":"T", "x":7.5, "y":1}, + {"label":"Y", "x":8.5, "y":1}, + {"label":"U", "x":9.5, "y":1}, + {"label":"I", "x":10.5, "y":1}, + {"label":"O", "x":11.5, "y":1}, + {"label":"P", "x":12.5, "y":1}, + {"label":"{", "x":13.5, "y":1}, + {"label":"}", "x":14.5, "y":1}, + {"label":"|", "x":15.5, "y":1, "w":1.5}, + {"label":"End", "x":17, "y":1}, + {"label":"F3", "x":0, "y":2}, + {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, + {"label":"A", "x":3.75, "y":2}, + {"label":"S", "x":4.75, "y":2}, + {"label":"D", "x":5.75, "y":2}, + {"label":"F", "x":6.75, "y":2}, + {"label":"G", "x":7.75, "y":2}, + {"label":"H", "x":8.75, "y":2}, + {"label":"J", "x":9.75, "y":2}, + {"label":"K", "x":10.75, "y":2}, + {"label":"L", "x":11.75, "y":2}, + {"label":":", "x":12.75, "y":2}, + {"label":"\"", "x":13.75, "y":2}, + {"label":"Enter", "x":14.75, "y":2, "w":2.25}, + {"label":"Ins", "x":17, "y":2}, + {"label":"F4", "x":0, "y":3}, + {"label":"Shift", "x":2, "y":3, "w":1.25}, + {"x":3.25, "y":3}, + {"label":"Z", "x":4.25, "y":3}, + {"label":"X", "x":5.25, "y":3}, + {"label":"C", "x":6.25, "y":3}, + {"label":"V", "x":7.25, "y":3}, + {"label":"B", "x":8.25, "y":3}, + {"label":"N", "x":9.25, "y":3}, + {"label":"M", "x":10.25, "y":3}, + {"label":"<", "x":11.25, "y":3}, + {"label":">", "x":12.25, "y":3}, + {"label":"?", "x":13.25, "y":3}, + {"label":"Shift", "x":14.25, "y":3, "w":1.75}, + {"label":"Up", "x":16, "y":3}, + {"label":"Del", "x":17, "y":3}, + {"label":"F5", "x":0, "y":4}, + {"label":"Ctrl", "x":2, "y":4, "w":1.25}, + {"label":"Win", "x":3.25, "y":4, "w":1.25}, + {"label":"Alt", "x":4.5, "y":4, "w":1.25}, + {"x":5.75, "y":4, "w":6.25}, + {"label":"Fn", "x":12, "y":4, "w":1.25}, + {"label":"Ctrl", "x":13.25, "y":4, "w":1.25}, + {"label":"Left", "x":15, "y":4}, + {"label":"Down", "x":16, "y":4}, + {"label":"Right", "x":17, "y":4} + ] }, "LAYOUT_ansi_blocker_small_bspc": { "key_count": 73, - "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":2.25}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.25, "y":4, "w":1.25}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + "layout": [ + {"label":"F1", "x":0, "y":0}, + {"label":"Esc", "x":2, "y":0}, + {"label":"!", "x":3, "y":0}, + {"label":"@", "x":4, "y":0}, + {"label":"#", "x":5, "y":0}, + {"label":"$", "x":6, "y":0}, + {"label":"%", "x":7, "y":0}, + {"label":"^", "x":8, "y":0}, + {"label":"&", "x":9, "y":0}, + {"label":"*", "x":10, "y":0}, + {"label":"(", "x":11, "y":0}, + {"label":")", "x":12, "y":0}, + {"label":"_", "x":13, "y":0}, + {"label":"+", "x":14, "y":0}, + {"label":"Backspace", "x":15, "y":0}, + {"x":16, "y":0}, + {"label":"Home", "x":17, "y":0}, + {"label":"F2", "x":0, "y":1}, + {"label":"Tab", "x":2, "y":1, "w":1.5}, + {"label":"Q", "x":3.5, "y":1}, + {"label":"W", "x":4.5, "y":1}, + {"label":"E", "x":5.5, "y":1}, + {"label":"R", "x":6.5, "y":1}, + {"label":"T", "x":7.5, "y":1}, + {"label":"Y", "x":8.5, "y":1}, + {"label":"U", "x":9.5, "y":1}, + {"label":"I", "x":10.5, "y":1}, + {"label":"O", "x":11.5, "y":1}, + {"label":"P", "x":12.5, "y":1}, + {"label":"{", "x":13.5, "y":1}, + {"label":"}", "x":14.5, "y":1}, + {"label":"|", "x":15.5, "y":1, "w":1.5}, + {"label":"End", "x":17, "y":1}, + {"label":"F3", "x":0, "y":2}, + {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, + {"label":"A", "x":3.75, "y":2}, + {"label":"S", "x":4.75, "y":2}, + {"label":"D", "x":5.75, "y":2}, + {"label":"F", "x":6.75, "y":2}, + {"label":"G", "x":7.75, "y":2}, + {"label":"H", "x":8.75, "y":2}, + {"label":"J", "x":9.75, "y":2}, + {"label":"K", "x":10.75, "y":2}, + {"label":"L", "x":11.75, "y":2}, + {"label":":", "x":12.75, "y":2}, + {"label":"\"", "x":13.75, "y":2}, + {"label":"Enter", "x":14.75, "y":2, "w":2.25}, + {"label":"Ins", "x":17, "y":2}, + {"label":"F4", "x":0, "y":3}, + {"label":"Shift", "x":2, "y":3, "w":2.25}, + {"label":"Z", "x":4.25, "y":3}, + {"label":"X", "x":5.25, "y":3}, + {"label":"C", "x":6.25, "y":3}, + {"label":"V", "x":7.25, "y":3}, + {"label":"B", "x":8.25, "y":3}, + {"label":"N", "x":9.25, "y":3}, + {"label":"M", "x":10.25, "y":3}, + {"label":"<", "x":11.25, "y":3}, + {"label":">", "x":12.25, "y":3}, + {"label":"?", "x":13.25, "y":3}, + {"label":"Shift", "x":14.25, "y":3, "w":1.75}, + {"label":"Up", "x":16, "y":3}, + {"label":"Del", "x":17, "y":3}, + {"label":"F5", "x":0, "y":4}, + {"label":"Ctrl", "x":2, "y":4, "w":1.25}, + {"label":"Win", "x":3.25, "y":4, "w":1.25}, + {"label":"Alt", "x":4.5, "y":4, "w":1.25}, + {"x":5.75, "y":4, "w":6.25}, + {"label":"Fn", "x":12, "y":4, "w":1.25}, + {"label":"Ctrl", "x":13.25, "y":4, "w":1.25}, + {"label":"Left", "x":15, "y":4}, + {"label":"Down", "x":16, "y":4}, + {"label":"Right", "x":17, "y":4} + ] }, "LAYOUT_ansi_blocker_small_lshift_small_bspc": { "key_count": 74, - "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.25, "y":4, "w":1.25}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + "layout": [ + {"label":"F1", "x":0, "y":0}, + {"label":"Esc", "x":2, "y":0}, + {"label":"!", "x":3, "y":0}, + {"label":"@", "x":4, "y":0}, + {"label":"#", "x":5, "y":0}, + {"label":"$", "x":6, "y":0}, + {"label":"%", "x":7, "y":0}, + {"label":"^", "x":8, "y":0}, + {"label":"&", "x":9, "y":0}, + {"label":"*", "x":10, "y":0}, + {"label":"(", "x":11, "y":0}, + {"label":")", "x":12, "y":0}, + {"label":"_", "x":13, "y":0}, + {"label":"+", "x":14, "y":0}, + {"label":"Backspace", "x":15, "y":0}, + {"x":16, "y":0}, + {"label":"Home", "x":17, "y":0}, + {"label":"F2", "x":0, "y":1}, + {"label":"Tab", "x":2, "y":1, "w":1.5}, + {"label":"Q", "x":3.5, "y":1}, + {"label":"W", "x":4.5, "y":1}, + {"label":"E", "x":5.5, "y":1}, + {"label":"R", "x":6.5, "y":1}, + {"label":"T", "x":7.5, "y":1}, + {"label":"Y", "x":8.5, "y":1}, + {"label":"U", "x":9.5, "y":1}, + {"label":"I", "x":10.5, "y":1}, + {"label":"O", "x":11.5, "y":1}, + {"label":"P", "x":12.5, "y":1}, + {"label":"{", "x":13.5, "y":1}, + {"label":"}", "x":14.5, "y":1}, + {"label":"|", "x":15.5, "y":1, "w":1.5}, + {"label":"End", "x":17, "y":1}, + {"label":"F3", "x":0, "y":2}, + {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, + {"label":"A", "x":3.75, "y":2}, + {"label":"S", "x":4.75, "y":2}, + {"label":"D", "x":5.75, "y":2}, + {"label":"F", "x":6.75, "y":2}, + {"label":"G", "x":7.75, "y":2}, + {"label":"H", "x":8.75, "y":2}, + {"label":"J", "x":9.75, "y":2}, + {"label":"K", "x":10.75, "y":2}, + {"label":"L", "x":11.75, "y":2}, + {"label":":", "x":12.75, "y":2}, + {"label":"\"", "x":13.75, "y":2}, + {"label":"Enter", "x":14.75, "y":2, "w":2.25}, + {"label":"Ins", "x":17, "y":2}, + {"label":"F4", "x":0, "y":3}, + {"label":"Shift", "x":2, "y":3, "w":1.25}, + {"x":3.25, "y":3}, + {"label":"Z", "x":4.25, "y":3}, + {"label":"X", "x":5.25, "y":3}, + {"label":"C", "x":6.25, "y":3}, + {"label":"V", "x":7.25, "y":3}, + {"label":"B", "x":8.25, "y":3}, + {"label":"N", "x":9.25, "y":3}, + {"label":"M", "x":10.25, "y":3}, + {"label":"<", "x":11.25, "y":3}, + {"label":">", "x":12.25, "y":3}, + {"label":"?", "x":13.25, "y":3}, + {"label":"Shift", "x":14.25, "y":3, "w":1.75}, + {"label":"Up", "x":16, "y":3}, + {"label":"Del", "x":17, "y":3}, + {"label":"F5", "x":0, "y":4}, + {"label":"Ctrl", "x":2, "y":4, "w":1.25}, + {"label":"Win", "x":3.25, "y":4, "w":1.25}, + {"label":"Alt", "x":4.5, "y":4, "w":1.25}, + {"x":5.75, "y":4, "w":6.25}, + {"label":"Fn", "x":12, "y":4, "w":1.25}, + {"label":"Ctrl", "x":13.25, "y":4, "w":1.25}, + {"label":"Left", "x":15, "y":4}, + {"label":"Down", "x":16, "y":4}, + {"label":"Right", "x":17, "y":4} + ] }, "LAYOUT_ansi_blocker_7u": { "key_count": 71, - "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":2.25}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.5}, {"label":"Win", "x":3.5, "y":4}, {"label":"Alt", "x":4.5, "y":4, "w":1.5}, {"x":6, "y":4, "w":6.75}, {"label":"Fn", "x":12.75, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + "layout": [ + {"label":"F1", "x":0, "y":0}, + {"label":"Esc", "x":2, "y":0}, + {"label":"!", "x":3, "y":0}, + {"label":"@", "x":4, "y":0}, + {"label":"#", "x":5, "y":0}, + {"label":"$", "x":6, "y":0}, + {"label":"%", "x":7, "y":0}, + {"label":"^", "x":8, "y":0}, + {"label":"&", "x":9, "y":0}, + {"label":"*", "x":10, "y":0}, + {"label":"(", "x":11, "y":0}, + {"label":")", "x":12, "y":0}, + {"label":"_", "x":13, "y":0}, + {"label":"+", "x":14, "y":0}, + {"label":"Backspace", "x":15, "y":0, "w":2}, + {"label":"Home", "x":17, "y":0}, + {"label":"F2", "x":0, "y":1}, + {"label":"Tab", "x":2, "y":1, "w":1.5}, + {"label":"Q", "x":3.5, "y":1}, + {"label":"W", "x":4.5, "y":1}, + {"label":"E", "x":5.5, "y":1}, + {"label":"R", "x":6.5, "y":1}, + {"label":"T", "x":7.5, "y":1}, + {"label":"Y", "x":8.5, "y":1}, + {"label":"U", "x":9.5, "y":1}, + {"label":"I", "x":10.5, "y":1}, + {"label":"O", "x":11.5, "y":1}, + {"label":"P", "x":12.5, "y":1}, + {"label":"{", "x":13.5, "y":1}, + {"label":"}", "x":14.5, "y":1}, + {"label":"|", "x":15.5, "y":1, "w":1.5}, + {"label":"End", "x":17, "y":1}, + {"label":"F3", "x":0, "y":2}, + {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, + {"label":"A", "x":3.75, "y":2}, + {"label":"S", "x":4.75, "y":2}, + {"label":"D", "x":5.75, "y":2}, + {"label":"F", "x":6.75, "y":2}, + {"label":"G", "x":7.75, "y":2}, + {"label":"H", "x":8.75, "y":2}, + {"label":"J", "x":9.75, "y":2}, + {"label":"K", "x":10.75, "y":2}, + {"label":"L", "x":11.75, "y":2}, + {"label":":", "x":12.75, "y":2}, + {"label":"\"", "x":13.75, "y":2}, + {"label":"Enter", "x":14.75, "y":2, "w":2.25}, + {"label":"Ins", "x":17, "y":2}, + {"label":"F4", "x":0, "y":3}, + {"label":"Shift", "x":2, "y":3, "w":2.25}, + {"label":"Z", "x":4.25, "y":3}, + {"label":"X", "x":5.25, "y":3}, + {"label":"C", "x":6.25, "y":3}, + {"label":"V", "x":7.25, "y":3}, + {"label":"B", "x":8.25, "y":3}, + {"label":"N", "x":9.25, "y":3}, + {"label":"M", "x":10.25, "y":3}, + {"label":"<", "x":11.25, "y":3}, + {"label":">", "x":12.25, "y":3}, + {"label":"?", "x":13.25, "y":3}, + {"label":"Shift", "x":14.25, "y":3, "w":1.75}, + {"label":"Up", "x":16, "y":3}, + {"label":"Del", "x":17, "y":3}, + {"label":"F5", "x":0, "y":4}, + {"label":"Ctrl", "x":2, "y":4, "w":1.5}, + {"label":"Win", "x":3.5, "y":4}, + {"label":"Alt", "x":4.5, "y":4, "w":1.5}, + {"x":6, "y":4, "w":6.75}, + {"label":"Fn", "x":12.75, "y":4, "w":1.5}, + {"label":"Left", "x":15, "y":4}, + {"label":"Down", "x":16, "y":4}, + {"label":"Right", "x":17, "y":4} + ] }, "LAYOUT_ansi_blocker_7u_small_lshift": { "key_count": 72, - "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.5}, {"label":"Win", "x":3.5, "y":4}, {"label":"Alt", "x":4.5, "y":4, "w":1.5}, {"x":6, "y":4, "w":6.75}, {"label":"Fn", "x":12.75, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + "layout": [ + {"label":"F1", "x":0, "y":0}, + {"label":"Esc", "x":2, "y":0}, + {"label":"!", "x":3, "y":0}, + {"label":"@", "x":4, "y":0}, + {"label":"#", "x":5, "y":0}, + {"label":"$", "x":6, "y":0}, + {"label":"%", "x":7, "y":0}, + {"label":"^", "x":8, "y":0}, + {"label":"&", "x":9, "y":0}, + {"label":"*", "x":10, "y":0}, + {"label":"(", "x":11, "y":0}, + {"label":")", "x":12, "y":0}, + {"label":"_", "x":13, "y":0}, + {"label":"+", "x":14, "y":0}, + {"label":"Backspace", "x":15, "y":0, "w":2}, + {"label":"Home", "x":17, "y":0}, + {"label":"F2", "x":0, "y":1}, + {"label":"Tab", "x":2, "y":1, "w":1.5}, + {"label":"Q", "x":3.5, "y":1}, + {"label":"W", "x":4.5, "y":1}, + {"label":"E", "x":5.5, "y":1}, + {"label":"R", "x":6.5, "y":1}, + {"label":"T", "x":7.5, "y":1}, + {"label":"Y", "x":8.5, "y":1}, + {"label":"U", "x":9.5, "y":1}, + {"label":"I", "x":10.5, "y":1}, + {"label":"O", "x":11.5, "y":1}, + {"label":"P", "x":12.5, "y":1}, + {"label":"{", "x":13.5, "y":1}, + {"label":"}", "x":14.5, "y":1}, + {"label":"|", "x":15.5, "y":1, "w":1.5}, + {"label":"End", "x":17, "y":1}, + {"label":"F3", "x":0, "y":2}, + {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, + {"label":"A", "x":3.75, "y":2}, + {"label":"S", "x":4.75, "y":2}, + {"label":"D", "x":5.75, "y":2}, + {"label":"F", "x":6.75, "y":2}, + {"label":"G", "x":7.75, "y":2}, + {"label":"H", "x":8.75, "y":2}, + {"label":"J", "x":9.75, "y":2}, + {"label":"K", "x":10.75, "y":2}, + {"label":"L", "x":11.75, "y":2}, + {"label":":", "x":12.75, "y":2}, + {"label":"\"", "x":13.75, "y":2}, + {"label":"Enter", "x":14.75, "y":2, "w":2.25}, + {"label":"Ins", "x":17, "y":2}, + {"label":"F4", "x":0, "y":3}, + {"label":"Shift", "x":2, "y":3, "w":1.25}, + {"x":3.25, "y":3}, + {"label":"Z", "x":4.25, "y":3}, + {"label":"X", "x":5.25, "y":3}, + {"label":"C", "x":6.25, "y":3}, + {"label":"V", "x":7.25, "y":3}, + {"label":"B", "x":8.25, "y":3}, + {"label":"N", "x":9.25, "y":3}, + {"label":"M", "x":10.25, "y":3}, + {"label":"<", "x":11.25, "y":3}, + {"label":">", "x":12.25, "y":3}, + {"label":"?", "x":13.25, "y":3}, + {"label":"Shift", "x":14.25, "y":3, "w":1.75}, + {"label":"Up", "x":16, "y":3}, + {"label":"Del", "x":17, "y":3}, + {"label":"F5", "x":0, "y":4}, + {"label":"Ctrl", "x":2, "y":4, "w":1.5}, + {"label":"Win", "x":3.5, "y":4}, + {"label":"Alt", "x":4.5, "y":4, "w":1.5}, + {"x":6, "y":4, "w":6.75}, + {"label":"Fn", "x":12.75, "y":4, "w":1.5}, + {"label":"Left", "x":15, "y":4}, + {"label":"Down", "x":16, "y":4}, + {"label":"Right", "x":17, "y":4} + ] }, "LAYOUT_ansi_blocker_7u_small_bspc": { "key_count": 72, - "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":2.25}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.5}, {"label":"Win", "x":3.5, "y":4}, {"label":"Alt", "x":4.5, "y":4, "w":1.5}, {"x":6, "y":4, "w":6.75}, {"label":"Fn", "x":12.75, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + "layout": [ + {"label":"F1", "x":0, "y":0}, + {"label":"Esc", "x":2, "y":0}, + {"label":"!", "x":3, "y":0}, + {"label":"@", "x":4, "y":0}, + {"label":"#", "x":5, "y":0}, + {"label":"$", "x":6, "y":0}, + {"label":"%", "x":7, "y":0}, + {"label":"^", "x":8, "y":0}, + {"label":"&", "x":9, "y":0}, + {"label":"*", "x":10, "y":0}, + {"label":"(", "x":11, "y":0}, + {"label":")", "x":12, "y":0}, + {"label":"_", "x":13, "y":0}, + {"label":"+", "x":14, "y":0}, + {"label":"Backspace", "x":15, "y":0}, + {"x":16, "y":0}, + {"label":"Home", "x":17, "y":0}, + {"label":"F2", "x":0, "y":1}, + {"label":"Tab", "x":2, "y":1, "w":1.5}, + {"label":"Q", "x":3.5, "y":1}, + {"label":"W", "x":4.5, "y":1}, + {"label":"E", "x":5.5, "y":1}, + {"label":"R", "x":6.5, "y":1}, + {"label":"T", "x":7.5, "y":1}, + {"label":"Y", "x":8.5, "y":1}, + {"label":"U", "x":9.5, "y":1}, + {"label":"I", "x":10.5, "y":1}, + {"label":"O", "x":11.5, "y":1}, + {"label":"P", "x":12.5, "y":1}, + {"label":"{", "x":13.5, "y":1}, + {"label":"}", "x":14.5, "y":1}, + {"label":"|", "x":15.5, "y":1, "w":1.5}, + {"label":"End", "x":17, "y":1}, + {"label":"F3", "x":0, "y":2}, + {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, + {"label":"A", "x":3.75, "y":2}, + {"label":"S", "x":4.75, "y":2}, + {"label":"D", "x":5.75, "y":2}, + {"label":"F", "x":6.75, "y":2}, + {"label":"G", "x":7.75, "y":2}, + {"label":"H", "x":8.75, "y":2}, + {"label":"J", "x":9.75, "y":2}, + {"label":"K", "x":10.75, "y":2}, + {"label":"L", "x":11.75, "y":2}, + {"label":":", "x":12.75, "y":2}, + {"label":"\"", "x":13.75, "y":2}, + {"label":"Enter", "x":14.75, "y":2, "w":2.25}, + {"label":"Ins", "x":17, "y":2}, + {"label":"F4", "x":0, "y":3}, + {"label":"Shift", "x":2, "y":3, "w":2.25}, + {"label":"Z", "x":4.25, "y":3}, + {"label":"X", "x":5.25, "y":3}, + {"label":"C", "x":6.25, "y":3}, + {"label":"V", "x":7.25, "y":3}, + {"label":"B", "x":8.25, "y":3}, + {"label":"N", "x":9.25, "y":3}, + {"label":"M", "x":10.25, "y":3}, + {"label":"<", "x":11.25, "y":3}, + {"label":">", "x":12.25, "y":3}, + {"label":"?", "x":13.25, "y":3}, + {"label":"Shift", "x":14.25, "y":3, "w":1.75}, + {"label":"Up", "x":16, "y":3}, + {"label":"Del", "x":17, "y":3}, + {"label":"F5", "x":0, "y":4}, + {"label":"Ctrl", "x":2, "y":4, "w":1.5}, + {"label":"Win", "x":3.5, "y":4}, + {"label":"Alt", "x":4.5, "y":4, "w":1.5}, + {"x":6, "y":4, "w":6.75}, + {"label":"Fn", "x":12.75, "y":4, "w":1.5}, + {"label":"Left", "x":15, "y":4}, + {"label":"Down", "x":16, "y":4}, + {"label":"Right", "x":17, "y":4} + ] }, "LAYOUT_ansi_blocker_7u_small_lshift_small_bspc": { "key_count": 73, - "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.5}, {"label":"Win", "x":3.5, "y":4}, {"label":"Alt", "x":4.5, "y":4, "w":1.5}, {"x":6, "y":4, "w":6.75}, {"label":"Fn", "x":12.75, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + "layout": [ + {"label":"F1", "x":0, "y":0}, + {"label":"Esc", "x":2, "y":0}, + {"label":"!", "x":3, "y":0}, + {"label":"@", "x":4, "y":0}, + {"label":"#", "x":5, "y":0}, + {"label":"$", "x":6, "y":0}, + {"label":"%", "x":7, "y":0}, + {"label":"^", "x":8, "y":0}, + {"label":"&", "x":9, "y":0}, + {"label":"*", "x":10, "y":0}, + {"label":"(", "x":11, "y":0}, + {"label":")", "x":12, "y":0}, + {"label":"_", "x":13, "y":0}, + {"label":"+", "x":14, "y":0}, + {"label":"Backspace", "x":15, "y":0}, + {"x":16, "y":0}, + {"label":"Home", "x":17, "y":0}, + {"label":"F2", "x":0, "y":1}, + {"label":"Tab", "x":2, "y":1, "w":1.5}, + {"label":"Q", "x":3.5, "y":1}, + {"label":"W", "x":4.5, "y":1}, + {"label":"E", "x":5.5, "y":1}, + {"label":"R", "x":6.5, "y":1}, + {"label":"T", "x":7.5, "y":1}, + {"label":"Y", "x":8.5, "y":1}, + {"label":"U", "x":9.5, "y":1}, + {"label":"I", "x":10.5, "y":1}, + {"label":"O", "x":11.5, "y":1}, + {"label":"P", "x":12.5, "y":1}, + {"label":"{", "x":13.5, "y":1}, + {"label":"}", "x":14.5, "y":1}, + {"label":"|", "x":15.5, "y":1, "w":1.5}, + {"label":"End", "x":17, "y":1}, + {"label":"F3", "x":0, "y":2}, + {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, + {"label":"A", "x":3.75, "y":2}, + {"label":"S", "x":4.75, "y":2}, + {"label":"D", "x":5.75, "y":2}, + {"label":"F", "x":6.75, "y":2}, + {"label":"G", "x":7.75, "y":2}, + {"label":"H", "x":8.75, "y":2}, + {"label":"J", "x":9.75, "y":2}, + {"label":"K", "x":10.75, "y":2}, + {"label":"L", "x":11.75, "y":2}, + {"label":":", "x":12.75, "y":2}, + {"label":"\"", "x":13.75, "y":2}, + {"label":"Enter", "x":14.75, "y":2, "w":2.25}, + {"label":"Ins", "x":17, "y":2}, + {"label":"F4", "x":0, "y":3}, + {"label":"Shift", "x":2, "y":3, "w":1.25}, + {"x":3.25, "y":3}, + {"label":"Z", "x":4.25, "y":3}, + {"label":"X", "x":5.25, "y":3}, + {"label":"C", "x":6.25, "y":3}, + {"label":"V", "x":7.25, "y":3}, + {"label":"B", "x":8.25, "y":3}, + {"label":"N", "x":9.25, "y":3}, + {"label":"M", "x":10.25, "y":3}, + {"label":"<", "x":11.25, "y":3}, + {"label":">", "x":12.25, "y":3}, + {"label":"?", "x":13.25, "y":3}, + {"label":"Shift", "x":14.25, "y":3, "w":1.75}, + {"label":"Up", "x":16, "y":3}, + {"label":"Del", "x":17, "y":3}, + {"label":"F5", "x":0, "y":4}, + {"label":"Ctrl", "x":2, "y":4, "w":1.5}, + {"label":"Win", "x":3.5, "y":4}, + {"label":"Alt", "x":4.5, "y":4, "w":1.5}, + {"x":6, "y":4, "w":6.75}, + {"label":"Fn", "x":12.75, "y":4, "w":1.5}, + {"label":"Left", "x":15, "y":4}, + {"label":"Down", "x":16, "y":4}, + {"label":"Right", "x":17, "y":4} + ] }, "LAYOUT_iso": { "key_count": 73, - "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"|", "x":14.75, "y":2}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4, "w":1.5}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + "layout": [ + {"label":"F1", "x":0, "y":0}, + {"label":"Esc", "x":2, "y":0}, + {"label":"!", "x":3, "y":0}, + {"label":"@", "x":4, "y":0}, + {"label":"#", "x":5, "y":0}, + {"label":"$", "x":6, "y":0}, + {"label":"%", "x":7, "y":0}, + {"label":"^", "x":8, "y":0}, + {"label":"&", "x":9, "y":0}, + {"label":"*", "x":10, "y":0}, + {"label":"(", "x":11, "y":0}, + {"label":")", "x":12, "y":0}, + {"label":"_", "x":13, "y":0}, + {"label":"+", "x":14, "y":0}, + {"label":"Backspace", "x":15, "y":0, "w":2}, + {"label":"Home", "x":17, "y":0}, + {"label":"F2", "x":0, "y":1}, + {"label":"Tab", "x":2, "y":1, "w":1.5}, + {"label":"Q", "x":3.5, "y":1}, + {"label":"W", "x":4.5, "y":1}, + {"label":"E", "x":5.5, "y":1}, + {"label":"R", "x":6.5, "y":1}, + {"label":"T", "x":7.5, "y":1}, + {"label":"Y", "x":8.5, "y":1}, + {"label":"U", "x":9.5, "y":1}, + {"label":"I", "x":10.5, "y":1}, + {"label":"O", "x":11.5, "y":1}, + {"label":"P", "x":12.5, "y":1}, + {"label":"{", "x":13.5, "y":1}, + {"label":"}", "x":14.5, "y":1}, + {"label":"End", "x":17, "y":1}, + {"label":"F3", "x":0, "y":2}, + {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, + {"label":"A", "x":3.75, "y":2}, + {"label":"S", "x":4.75, "y":2}, + {"label":"D", "x":5.75, "y":2}, + {"label":"F", "x":6.75, "y":2}, + {"label":"G", "x":7.75, "y":2}, + {"label":"H", "x":8.75, "y":2}, + {"label":"J", "x":9.75, "y":2}, + {"label":"K", "x":10.75, "y":2}, + {"label":"L", "x":11.75, "y":2}, + {"label":":", "x":12.75, "y":2}, + {"label":"\"", "x":13.75, "y":2}, + {"label":"|", "x":14.75, "y":2}, + {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, + {"label":"Ins", "x":17, "y":2}, + {"label":"F4", "x":0, "y":3}, + {"label":"Shift", "x":2, "y":3, "w":1.25}, + {"x":3.25, "y":3}, + {"label":"Z", "x":4.25, "y":3}, + {"label":"X", "x":5.25, "y":3}, + {"label":"C", "x":6.25, "y":3}, + {"label":"V", "x":7.25, "y":3}, + {"label":"B", "x":8.25, "y":3}, + {"label":"N", "x":9.25, "y":3}, + {"label":"M", "x":10.25, "y":3}, + {"label":"<", "x":11.25, "y":3}, + {"label":">", "x":12.25, "y":3}, + {"label":"?", "x":13.25, "y":3}, + {"label":"Shift", "x":14.25, "y":3, "w":1.75}, + {"label":"Up", "x":16, "y":3}, + {"label":"Del", "x":17, "y":3}, + {"label":"F5", "x":0, "y":4}, + {"label":"Ctrl", "x":2, "y":4, "w":1.25}, + {"label":"Win", "x":3.25, "y":4, "w":1.25}, + {"label":"Alt", "x":4.5, "y":4, "w":1.25}, + {"x":5.75, "y":4, "w":6.25}, + {"label":"Fn", "x":12, "y":4, "w":1.5}, + {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, + {"label":"Left", "x":15, "y":4}, + {"label":"Down", "x":16, "y":4}, + {"label":"Right", "x":17, "y":4} + ] }, "LAYOUT_iso_small_bspc": { "key_count": 74, - "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"|", "x":14.75, "y":2}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4, "w":1.5}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + "layout": [ + {"label":"F1", "x":0, "y":0}, + {"label":"Esc", "x":2, "y":0}, + {"label":"!", "x":3, "y":0}, + {"label":"@", "x":4, "y":0}, + {"label":"#", "x":5, "y":0}, + {"label":"$", "x":6, "y":0}, + {"label":"%", "x":7, "y":0}, + {"label":"^", "x":8, "y":0}, + {"label":"&", "x":9, "y":0}, + {"label":"*", "x":10, "y":0}, + {"label":"(", "x":11, "y":0}, + {"label":")", "x":12, "y":0}, + {"label":"_", "x":13, "y":0}, + {"label":"+", "x":14, "y":0}, + {"label":"Backspace", "x":15, "y":0}, + {"x":16, "y":0}, + {"label":"Home", "x":17, "y":0}, + {"label":"F2", "x":0, "y":1}, + {"label":"Tab", "x":2, "y":1, "w":1.5}, + {"label":"Q", "x":3.5, "y":1}, + {"label":"W", "x":4.5, "y":1}, + {"label":"E", "x":5.5, "y":1}, + {"label":"R", "x":6.5, "y":1}, + {"label":"T", "x":7.5, "y":1}, + {"label":"Y", "x":8.5, "y":1}, + {"label":"U", "x":9.5, "y":1}, + {"label":"I", "x":10.5, "y":1}, + {"label":"O", "x":11.5, "y":1}, + {"label":"P", "x":12.5, "y":1}, + {"label":"{", "x":13.5, "y":1}, + {"label":"}", "x":14.5, "y":1}, + {"label":"End", "x":17, "y":1}, + {"label":"F3", "x":0, "y":2}, + {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, + {"label":"A", "x":3.75, "y":2}, + {"label":"S", "x":4.75, "y":2}, + {"label":"D", "x":5.75, "y":2}, + {"label":"F", "x":6.75, "y":2}, + {"label":"G", "x":7.75, "y":2}, + {"label":"H", "x":8.75, "y":2}, + {"label":"J", "x":9.75, "y":2}, + {"label":"K", "x":10.75, "y":2}, + {"label":"L", "x":11.75, "y":2}, + {"label":":", "x":12.75, "y":2}, + {"label":"\"", "x":13.75, "y":2}, + {"label":"|", "x":14.75, "y":2}, + {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, + {"label":"Ins", "x":17, "y":2}, + {"label":"F4", "x":0, "y":3}, + {"label":"Shift", "x":2, "y":3, "w":1.25}, + {"x":3.25, "y":3}, + {"label":"Z", "x":4.25, "y":3}, + {"label":"X", "x":5.25, "y":3}, + {"label":"C", "x":6.25, "y":3}, + {"label":"V", "x":7.25, "y":3}, + {"label":"B", "x":8.25, "y":3}, + {"label":"N", "x":9.25, "y":3}, + {"label":"M", "x":10.25, "y":3}, + {"label":"<", "x":11.25, "y":3}, + {"label":">", "x":12.25, "y":3}, + {"label":"?", "x":13.25, "y":3}, + {"label":"Shift", "x":14.25, "y":3, "w":1.75}, + {"label":"Up", "x":16, "y":3}, + {"label":"Del", "x":17, "y":3}, + {"label":"F5", "x":0, "y":4}, + {"label":"Ctrl", "x":2, "y":4, "w":1.25}, + {"label":"Win", "x":3.25, "y":4, "w":1.25}, + {"label":"Alt", "x":4.5, "y":4, "w":1.25}, + {"x":5.75, "y":4, "w":6.25}, + {"label":"Fn", "x":12, "y":4, "w":1.5}, + {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, + {"label":"Left", "x":15, "y":4}, + {"label":"Down", "x":16, "y":4}, + {"label":"Right", "x":17, "y":4} + ] }, "LAYOUT_iso_1u": { "key_count": 74, - "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"|", "x":14.75, "y":2}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4}, {"label":"Alt", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + "layout": [ + {"label":"F1", "x":0, "y":0}, + {"label":"Esc", "x":2, "y":0}, + {"label":"!", "x":3, "y":0}, + {"label":"@", "x":4, "y":0}, + {"label":"#", "x":5, "y":0}, + {"label":"$", "x":6, "y":0}, + {"label":"%", "x":7, "y":0}, + {"label":"^", "x":8, "y":0}, + {"label":"&", "x":9, "y":0}, + {"label":"*", "x":10, "y":0}, + {"label":"(", "x":11, "y":0}, + {"label":")", "x":12, "y":0}, + {"label":"_", "x":13, "y":0}, + {"label":"+", "x":14, "y":0}, + {"label":"Backspace", "x":15, "y":0, "w":2}, + {"label":"Home", "x":17, "y":0}, + {"label":"F2", "x":0, "y":1}, + {"label":"Tab", "x":2, "y":1, "w":1.5}, + {"label":"Q", "x":3.5, "y":1}, + {"label":"W", "x":4.5, "y":1}, + {"label":"E", "x":5.5, "y":1}, + {"label":"R", "x":6.5, "y":1}, + {"label":"T", "x":7.5, "y":1}, + {"label":"Y", "x":8.5, "y":1}, + {"label":"U", "x":9.5, "y":1}, + {"label":"I", "x":10.5, "y":1}, + {"label":"O", "x":11.5, "y":1}, + {"label":"P", "x":12.5, "y":1}, + {"label":"{", "x":13.5, "y":1}, + {"label":"}", "x":14.5, "y":1}, + {"label":"End", "x":17, "y":1}, + {"label":"F3", "x":0, "y":2}, + {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, + {"label":"A", "x":3.75, "y":2}, + {"label":"S", "x":4.75, "y":2}, + {"label":"D", "x":5.75, "y":2}, + {"label":"F", "x":6.75, "y":2}, + {"label":"G", "x":7.75, "y":2}, + {"label":"H", "x":8.75, "y":2}, + {"label":"J", "x":9.75, "y":2}, + {"label":"K", "x":10.75, "y":2}, + {"label":"L", "x":11.75, "y":2}, + {"label":":", "x":12.75, "y":2}, + {"label":"\"", "x":13.75, "y":2}, + {"label":"|", "x":14.75, "y":2}, + {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, + {"label":"Ins", "x":17, "y":2}, + {"label":"F4", "x":0, "y":3}, + {"label":"Shift", "x":2, "y":3, "w":1.25}, + {"x":3.25, "y":3}, + {"label":"Z", "x":4.25, "y":3}, + {"label":"X", "x":5.25, "y":3}, + {"label":"C", "x":6.25, "y":3}, + {"label":"V", "x":7.25, "y":3}, + {"label":"B", "x":8.25, "y":3}, + {"label":"N", "x":9.25, "y":3}, + {"label":"M", "x":10.25, "y":3}, + {"label":"<", "x":11.25, "y":3}, + {"label":">", "x":12.25, "y":3}, + {"label":"?", "x":13.25, "y":3}, + {"label":"Shift", "x":14.25, "y":3, "w":1.75}, + {"label":"Up", "x":16, "y":3}, + {"label":"Del", "x":17, "y":3}, + {"label":"F5", "x":0, "y":4}, + {"label":"Ctrl", "x":2, "y":4, "w":1.25}, + {"label":"Win", "x":3.25, "y":4, "w":1.25}, + {"label":"Alt", "x":4.5, "y":4, "w":1.25}, + {"x":5.75, "y":4, "w":6.25}, + {"label":"Fn", "x":12, "y":4}, + {"label":"Alt", "x":13, "y":4}, + {"label":"Ctrl", "x":14, "y":4}, + {"label":"Left", "x":15, "y":4}, + {"label":"Down", "x":16, "y":4}, + {"label":"Right", "x":17, "y":4} + ] }, "LAYOUT_iso_1u_small_bspc": { "key_count": 75, - "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"|", "x":14.75, "y":2}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4}, {"label":"Alt", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + "layout": [ + {"label":"F1", "x":0, "y":0}, + {"label":"Esc", "x":2, "y":0}, + {"label":"!", "x":3, "y":0}, + {"label":"@", "x":4, "y":0}, + {"label":"#", "x":5, "y":0}, + {"label":"$", "x":6, "y":0}, + {"label":"%", "x":7, "y":0}, + {"label":"^", "x":8, "y":0}, + {"label":"&", "x":9, "y":0}, + {"label":"*", "x":10, "y":0}, + {"label":"(", "x":11, "y":0}, + {"label":")", "x":12, "y":0}, + {"label":"_", "x":13, "y":0}, + {"label":"+", "x":14, "y":0}, + {"label":"Backspace", "x":15, "y":0}, + {"x":16, "y":0}, + {"label":"Home", "x":17, "y":0}, + {"label":"F2", "x":0, "y":1}, + {"label":"Tab", "x":2, "y":1, "w":1.5}, + {"label":"Q", "x":3.5, "y":1}, + {"label":"W", "x":4.5, "y":1}, + {"label":"E", "x":5.5, "y":1}, + {"label":"R", "x":6.5, "y":1}, + {"label":"T", "x":7.5, "y":1}, + {"label":"Y", "x":8.5, "y":1}, + {"label":"U", "x":9.5, "y":1}, + {"label":"I", "x":10.5, "y":1}, + {"label":"O", "x":11.5, "y":1}, + {"label":"P", "x":12.5, "y":1}, + {"label":"{", "x":13.5, "y":1}, + {"label":"}", "x":14.5, "y":1}, + {"label":"End", "x":17, "y":1}, + {"label":"F3", "x":0, "y":2}, + {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, + {"label":"A", "x":3.75, "y":2}, + {"label":"S", "x":4.75, "y":2}, + {"label":"D", "x":5.75, "y":2}, + {"label":"F", "x":6.75, "y":2}, + {"label":"G", "x":7.75, "y":2}, + {"label":"H", "x":8.75, "y":2}, + {"label":"J", "x":9.75, "y":2}, + {"label":"K", "x":10.75, "y":2}, + {"label":"L", "x":11.75, "y":2}, + {"label":":", "x":12.75, "y":2}, + {"label":"\"", "x":13.75, "y":2}, + {"label":"|", "x":14.75, "y":2}, + {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, + {"label":"Ins", "x":17, "y":2}, + {"label":"F4", "x":0, "y":3}, + {"label":"Shift", "x":2, "y":3, "w":1.25}, + {"x":3.25, "y":3}, + {"label":"Z", "x":4.25, "y":3}, + {"label":"X", "x":5.25, "y":3}, + {"label":"C", "x":6.25, "y":3}, + {"label":"V", "x":7.25, "y":3}, + {"label":"B", "x":8.25, "y":3}, + {"label":"N", "x":9.25, "y":3}, + {"label":"M", "x":10.25, "y":3}, + {"label":"<", "x":11.25, "y":3}, + {"label":">", "x":12.25, "y":3}, + {"label":"?", "x":13.25, "y":3}, + {"label":"Shift", "x":14.25, "y":3, "w":1.75}, + {"label":"Up", "x":16, "y":3}, + {"label":"Del", "x":17, "y":3}, + {"label":"F5", "x":0, "y":4}, + {"label":"Ctrl", "x":2, "y":4, "w":1.25}, + {"label":"Win", "x":3.25, "y":4, "w":1.25}, + {"label":"Alt", "x":4.5, "y":4, "w":1.25}, + {"x":5.75, "y":4, "w":6.25}, + {"label":"Fn", "x":12, "y":4}, + {"label":"Alt", "x":13, "y":4}, + {"label":"Ctrl", "x":14, "y":4}, + {"label":"Left", "x":15, "y":4}, + {"label":"Down", "x":16, "y":4}, + {"label":"Right", "x":17, "y":4} + ] }, "LAYOUT_iso_7u": { "key_count": 72, - "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"|", "x":14.75, "y":2}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.5}, {"label":"Win", "x":3.5, "y":4, "w":1.5}, {"x":5, "y":4, "w":7}, {"label":"Fn", "x":12, "y":4, "w":1.5}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + "layout": [ + {"label":"F1", "x":0, "y":0}, + {"label":"Esc", "x":2, "y":0}, + {"label":"!", "x":3, "y":0}, + {"label":"@", "x":4, "y":0}, + {"label":"#", "x":5, "y":0}, + {"label":"$", "x":6, "y":0}, + {"label":"%", "x":7, "y":0}, + {"label":"^", "x":8, "y":0}, + {"label":"&", "x":9, "y":0}, + {"label":"*", "x":10, "y":0}, + {"label":"(", "x":11, "y":0}, + {"label":")", "x":12, "y":0}, + {"label":"_", "x":13, "y":0}, + {"label":"+", "x":14, "y":0}, + {"label":"Backspace", "x":15, "y":0, "w":2}, + {"label":"Home", "x":17, "y":0}, + {"label":"F2", "x":0, "y":1}, + {"label":"Tab", "x":2, "y":1, "w":1.5}, + {"label":"Q", "x":3.5, "y":1}, + {"label":"W", "x":4.5, "y":1}, + {"label":"E", "x":5.5, "y":1}, + {"label":"R", "x":6.5, "y":1}, + {"label":"T", "x":7.5, "y":1}, + {"label":"Y", "x":8.5, "y":1}, + {"label":"U", "x":9.5, "y":1}, + {"label":"I", "x":10.5, "y":1}, + {"label":"O", "x":11.5, "y":1}, + {"label":"P", "x":12.5, "y":1}, + {"label":"{", "x":13.5, "y":1}, + {"label":"}", "x":14.5, "y":1}, + {"label":"End", "x":17, "y":1}, + {"label":"F3", "x":0, "y":2}, + {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, + {"label":"A", "x":3.75, "y":2}, + {"label":"S", "x":4.75, "y":2}, + {"label":"D", "x":5.75, "y":2}, + {"label":"F", "x":6.75, "y":2}, + {"label":"G", "x":7.75, "y":2}, + {"label":"H", "x":8.75, "y":2}, + {"label":"J", "x":9.75, "y":2}, + {"label":"K", "x":10.75, "y":2}, + {"label":"L", "x":11.75, "y":2}, + {"label":":", "x":12.75, "y":2}, + {"label":"\"", "x":13.75, "y":2}, + {"label":"|", "x":14.75, "y":2}, + {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, + {"label":"Ins", "x":17, "y":2}, + {"label":"F4", "x":0, "y":3}, + {"label":"Shift", "x":2, "y":3, "w":1.25}, + {"x":3.25, "y":3}, + {"label":"Z", "x":4.25, "y":3}, + {"label":"X", "x":5.25, "y":3}, + {"label":"C", "x":6.25, "y":3}, + {"label":"V", "x":7.25, "y":3}, + {"label":"B", "x":8.25, "y":3}, + {"label":"N", "x":9.25, "y":3}, + {"label":"M", "x":10.25, "y":3}, + {"label":"<", "x":11.25, "y":3}, + {"label":">", "x":12.25, "y":3}, + {"label":"?", "x":13.25, "y":3}, + {"label":"Shift", "x":14.25, "y":3, "w":1.75}, + {"label":"Up", "x":16, "y":3}, + {"label":"Del", "x":17, "y":3}, + {"label":"F5", "x":0, "y":4}, + {"label":"Ctrl", "x":2, "y":4, "w":1.5}, + {"label":"Win", "x":3.5, "y":4, "w":1.5}, + {"x":5, "y":4, "w":7}, + {"label":"Fn", "x":12, "y":4, "w":1.5}, + {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, + {"label":"Left", "x":15, "y":4}, + {"label":"Down", "x":16, "y":4}, + {"label":"Right", "x":17, "y":4} + ] }, "LAYOUT_iso_7u_small_bspc": { "key_count": 73, - "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"|", "x":14.75, "y":2}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.5}, {"label":"Win", "x":3.5, "y":4, "w":1.5}, {"x":5, "y":4, "w":7}, {"label":"Fn", "x":12, "y":4, "w":1.5}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + "layout": [ + {"label":"F1", "x":0, "y":0}, + {"label":"Esc", "x":2, "y":0}, + {"label":"!", "x":3, "y":0}, + {"label":"@", "x":4, "y":0}, + {"label":"#", "x":5, "y":0}, + {"label":"$", "x":6, "y":0}, + {"label":"%", "x":7, "y":0}, + {"label":"^", "x":8, "y":0}, + {"label":"&", "x":9, "y":0}, + {"label":"*", "x":10, "y":0}, + {"label":"(", "x":11, "y":0}, + {"label":")", "x":12, "y":0}, + {"label":"_", "x":13, "y":0}, + {"label":"+", "x":14, "y":0}, + {"label":"Backspace", "x":15, "y":0}, + {"x":16, "y":0}, + {"label":"Home", "x":17, "y":0}, + {"label":"F2", "x":0, "y":1}, + {"label":"Tab", "x":2, "y":1, "w":1.5}, + {"label":"Q", "x":3.5, "y":1}, + {"label":"W", "x":4.5, "y":1}, + {"label":"E", "x":5.5, "y":1}, + {"label":"R", "x":6.5, "y":1}, + {"label":"T", "x":7.5, "y":1}, + {"label":"Y", "x":8.5, "y":1}, + {"label":"U", "x":9.5, "y":1}, + {"label":"I", "x":10.5, "y":1}, + {"label":"O", "x":11.5, "y":1}, + {"label":"P", "x":12.5, "y":1}, + {"label":"{", "x":13.5, "y":1}, + {"label":"}", "x":14.5, "y":1}, + {"label":"End", "x":17, "y":1}, + {"label":"F3", "x":0, "y":2}, + {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, + {"label":"A", "x":3.75, "y":2}, + {"label":"S", "x":4.75, "y":2}, + {"label":"D", "x":5.75, "y":2}, + {"label":"F", "x":6.75, "y":2}, + {"label":"G", "x":7.75, "y":2}, + {"label":"H", "x":8.75, "y":2}, + {"label":"J", "x":9.75, "y":2}, + {"label":"K", "x":10.75, "y":2}, + {"label":"L", "x":11.75, "y":2}, + {"label":":", "x":12.75, "y":2}, + {"label":"\"", "x":13.75, "y":2}, + {"label":"|", "x":14.75, "y":2}, + {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, + {"label":"Ins", "x":17, "y":2}, + {"label":"F4", "x":0, "y":3}, + {"label":"Shift", "x":2, "y":3, "w":1.25}, + {"x":3.25, "y":3}, + {"label":"Z", "x":4.25, "y":3}, + {"label":"X", "x":5.25, "y":3}, + {"label":"C", "x":6.25, "y":3}, + {"label":"V", "x":7.25, "y":3}, + {"label":"B", "x":8.25, "y":3}, + {"label":"N", "x":9.25, "y":3}, + {"label":"M", "x":10.25, "y":3}, + {"label":"<", "x":11.25, "y":3}, + {"label":">", "x":12.25, "y":3}, + {"label":"?", "x":13.25, "y":3}, + {"label":"Shift", "x":14.25, "y":3, "w":1.75}, + {"label":"Up", "x":16, "y":3}, + {"label":"Del", "x":17, "y":3}, + {"label":"F5", "x":0, "y":4}, + {"label":"Ctrl", "x":2, "y":4, "w":1.5}, + {"label":"Win", "x":3.5, "y":4, "w":1.5}, + {"x":5, "y":4, "w":7}, + {"label":"Fn", "x":12, "y":4, "w":1.5}, + {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, + {"label":"Left", "x":15, "y":4}, + {"label":"Down", "x":16, "y":4}, + {"label":"Right", "x":17, "y":4} + ] }, "LAYOUT_iso_blocker": { "key_count": 73, - "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"|", "x":14.75, "y":2}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.25, "y":4, "w":1.25}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + "layout": [ + {"label":"F1", "x":0, "y":0}, + {"label":"Esc", "x":2, "y":0}, + {"label":"!", "x":3, "y":0}, + {"label":"@", "x":4, "y":0}, + {"label":"#", "x":5, "y":0}, + {"label":"$", "x":6, "y":0}, + {"label":"%", "x":7, "y":0}, + {"label":"^", "x":8, "y":0}, + {"label":"&", "x":9, "y":0}, + {"label":"*", "x":10, "y":0}, + {"label":"(", "x":11, "y":0}, + {"label":")", "x":12, "y":0}, + {"label":"_", "x":13, "y":0}, + {"label":"+", "x":14, "y":0}, + {"label":"Backspace", "x":15, "y":0, "w":2}, + {"label":"Home", "x":17, "y":0}, + {"label":"F2", "x":0, "y":1}, + {"label":"Tab", "x":2, "y":1, "w":1.5}, + {"label":"Q", "x":3.5, "y":1}, + {"label":"W", "x":4.5, "y":1}, + {"label":"E", "x":5.5, "y":1}, + {"label":"R", "x":6.5, "y":1}, + {"label":"T", "x":7.5, "y":1}, + {"label":"Y", "x":8.5, "y":1}, + {"label":"U", "x":9.5, "y":1}, + {"label":"I", "x":10.5, "y":1}, + {"label":"O", "x":11.5, "y":1}, + {"label":"P", "x":12.5, "y":1}, + {"label":"{", "x":13.5, "y":1}, + {"label":"}", "x":14.5, "y":1}, + {"label":"End", "x":17, "y":1}, + {"label":"F3", "x":0, "y":2}, + {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, + {"label":"A", "x":3.75, "y":2}, + {"label":"S", "x":4.75, "y":2}, + {"label":"D", "x":5.75, "y":2}, + {"label":"F", "x":6.75, "y":2}, + {"label":"G", "x":7.75, "y":2}, + {"label":"H", "x":8.75, "y":2}, + {"label":"J", "x":9.75, "y":2}, + {"label":"K", "x":10.75, "y":2}, + {"label":"L", "x":11.75, "y":2}, + {"label":":", "x":12.75, "y":2}, + {"label":"\"", "x":13.75, "y":2}, + {"label":"|", "x":14.75, "y":2}, + {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, + {"label":"Ins", "x":17, "y":2}, + {"label":"F4", "x":0, "y":3}, + {"label":"Shift", "x":2, "y":3, "w":1.25}, + {"x":3.25, "y":3}, + {"label":"Z", "x":4.25, "y":3}, + {"label":"X", "x":5.25, "y":3}, + {"label":"C", "x":6.25, "y":3}, + {"label":"V", "x":7.25, "y":3}, + {"label":"B", "x":8.25, "y":3}, + {"label":"N", "x":9.25, "y":3}, + {"label":"M", "x":10.25, "y":3}, + {"label":"<", "x":11.25, "y":3}, + {"label":">", "x":12.25, "y":3}, + {"label":"?", "x":13.25, "y":3}, + {"label":"Shift", "x":14.25, "y":3, "w":1.75}, + {"label":"Up", "x":16, "y":3}, + {"label":"Del", "x":17, "y":3}, + {"label":"F5", "x":0, "y":4}, + {"label":"Ctrl", "x":2, "y":4, "w":1.25}, + {"label":"Win", "x":3.25, "y":4, "w":1.25}, + {"label":"Alt", "x":4.5, "y":4, "w":1.25}, + {"x":5.75, "y":4, "w":6.25}, + {"label":"Fn", "x":12, "y":4, "w":1.25}, + {"label":"Ctrl", "x":13.25, "y":4, "w":1.25}, + {"label":"Left", "x":15, "y":4}, + {"label":"Down", "x":16, "y":4}, + {"label":"Right", "x":17, "y":4} + ] }, "LAYOUT_iso_blocker_small_bspc": { "key_count": 74, - "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"|", "x":14.75, "y":2}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.25, "y":4, "w":1.25}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + "layout": [ + {"label":"F1", "x":0, "y":0}, + {"label":"Esc", "x":2, "y":0}, + {"label":"!", "x":3, "y":0}, + {"label":"@", "x":4, "y":0}, + {"label":"#", "x":5, "y":0}, + {"label":"$", "x":6, "y":0}, + {"label":"%", "x":7, "y":0}, + {"label":"^", "x":8, "y":0}, + {"label":"&", "x":9, "y":0}, + {"label":"*", "x":10, "y":0}, + {"label":"(", "x":11, "y":0}, + {"label":")", "x":12, "y":0}, + {"label":"_", "x":13, "y":0}, + {"label":"+", "x":14, "y":0}, + {"label":"Backspace", "x":15, "y":0}, + {"x":16, "y":0}, + {"label":"Home", "x":17, "y":0}, + {"label":"F2", "x":0, "y":1}, + {"label":"Tab", "x":2, "y":1, "w":1.5}, + {"label":"Q", "x":3.5, "y":1}, + {"label":"W", "x":4.5, "y":1}, + {"label":"E", "x":5.5, "y":1}, + {"label":"R", "x":6.5, "y":1}, + {"label":"T", "x":7.5, "y":1}, + {"label":"Y", "x":8.5, "y":1}, + {"label":"U", "x":9.5, "y":1}, + {"label":"I", "x":10.5, "y":1}, + {"label":"O", "x":11.5, "y":1}, + {"label":"P", "x":12.5, "y":1}, + {"label":"{", "x":13.5, "y":1}, + {"label":"}", "x":14.5, "y":1}, + {"label":"End", "x":17, "y":1}, + {"label":"F3", "x":0, "y":2}, + {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, + {"label":"A", "x":3.75, "y":2}, + {"label":"S", "x":4.75, "y":2}, + {"label":"D", "x":5.75, "y":2}, + {"label":"F", "x":6.75, "y":2}, + {"label":"G", "x":7.75, "y":2}, + {"label":"H", "x":8.75, "y":2}, + {"label":"J", "x":9.75, "y":2}, + {"label":"K", "x":10.75, "y":2}, + {"label":"L", "x":11.75, "y":2}, + {"label":":", "x":12.75, "y":2}, + {"label":"\"", "x":13.75, "y":2}, + {"label":"|", "x":14.75, "y":2}, + {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, + {"label":"Ins", "x":17, "y":2}, + {"label":"F4", "x":0, "y":3}, + {"label":"Shift", "x":2, "y":3, "w":1.25}, + {"x":3.25, "y":3}, + {"label":"Z", "x":4.25, "y":3}, + {"label":"X", "x":5.25, "y":3}, + {"label":"C", "x":6.25, "y":3}, + {"label":"V", "x":7.25, "y":3}, + {"label":"B", "x":8.25, "y":3}, + {"label":"N", "x":9.25, "y":3}, + {"label":"M", "x":10.25, "y":3}, + {"label":"<", "x":11.25, "y":3}, + {"label":">", "x":12.25, "y":3}, + {"label":"?", "x":13.25, "y":3}, + {"label":"Shift", "x":14.25, "y":3, "w":1.75}, + {"label":"Up", "x":16, "y":3}, + {"label":"Del", "x":17, "y":3}, + {"label":"F5", "x":0, "y":4}, + {"label":"Ctrl", "x":2, "y":4, "w":1.25}, + {"label":"Win", "x":3.25, "y":4, "w":1.25}, + {"label":"Alt", "x":4.5, "y":4, "w":1.25}, + {"x":5.75, "y":4, "w":6.25}, + {"label":"Fn", "x":12, "y":4, "w":1.25}, + {"label":"Ctrl", "x":13.25, "y":4, "w":1.25}, + {"label":"Left", "x":15, "y":4}, + {"label":"Down", "x":16, "y":4}, + {"label":"Right", "x":17, "y":4} + ] }, "LAYOUT_iso_blocker_7u": { "key_count": 72, - "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"|", "x":14.75, "y":2}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.5}, {"label":"Win", "x":3.5, "y":4}, {"label":"Alt", "x":4.5, "y":4, "w":1.5}, {"x":6, "y":4, "w":6.75}, {"label":"Fn", "x":12.75, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + "layout": [ + {"label":"F1", "x":0, "y":0}, + {"label":"Esc", "x":2, "y":0}, + {"label":"!", "x":3, "y":0}, + {"label":"@", "x":4, "y":0}, + {"label":"#", "x":5, "y":0}, + {"label":"$", "x":6, "y":0}, + {"label":"%", "x":7, "y":0}, + {"label":"^", "x":8, "y":0}, + {"label":"&", "x":9, "y":0}, + {"label":"*", "x":10, "y":0}, + {"label":"(", "x":11, "y":0}, + {"label":")", "x":12, "y":0}, + {"label":"_", "x":13, "y":0}, + {"label":"+", "x":14, "y":0}, + {"label":"Backspace", "x":15, "y":0, "w":2}, + {"label":"Home", "x":17, "y":0}, + {"label":"F2", "x":0, "y":1}, + {"label":"Tab", "x":2, "y":1, "w":1.5}, + {"label":"Q", "x":3.5, "y":1}, + {"label":"W", "x":4.5, "y":1}, + {"label":"E", "x":5.5, "y":1}, + {"label":"R", "x":6.5, "y":1}, + {"label":"T", "x":7.5, "y":1}, + {"label":"Y", "x":8.5, "y":1}, + {"label":"U", "x":9.5, "y":1}, + {"label":"I", "x":10.5, "y":1}, + {"label":"O", "x":11.5, "y":1}, + {"label":"P", "x":12.5, "y":1}, + {"label":"{", "x":13.5, "y":1}, + {"label":"}", "x":14.5, "y":1}, + {"label":"End", "x":17, "y":1}, + {"label":"F3", "x":0, "y":2}, + {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, + {"label":"A", "x":3.75, "y":2}, + {"label":"S", "x":4.75, "y":2}, + {"label":"D", "x":5.75, "y":2}, + {"label":"F", "x":6.75, "y":2}, + {"label":"G", "x":7.75, "y":2}, + {"label":"H", "x":8.75, "y":2}, + {"label":"J", "x":9.75, "y":2}, + {"label":"K", "x":10.75, "y":2}, + {"label":"L", "x":11.75, "y":2}, + {"label":":", "x":12.75, "y":2}, + {"label":"\"", "x":13.75, "y":2}, + {"label":"|", "x":14.75, "y":2}, + {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, + {"label":"Ins", "x":17, "y":2}, + {"label":"F4", "x":0, "y":3}, + {"label":"Shift", "x":2, "y":3, "w":1.25}, + {"x":3.25, "y":3}, + {"label":"Z", "x":4.25, "y":3}, + {"label":"X", "x":5.25, "y":3}, + {"label":"C", "x":6.25, "y":3}, + {"label":"V", "x":7.25, "y":3}, + {"label":"B", "x":8.25, "y":3}, + {"label":"N", "x":9.25, "y":3}, + {"label":"M", "x":10.25, "y":3}, + {"label":"<", "x":11.25, "y":3}, + {"label":">", "x":12.25, "y":3}, + {"label":"?", "x":13.25, "y":3}, + {"label":"Shift", "x":14.25, "y":3, "w":1.75}, + {"label":"Up", "x":16, "y":3}, + {"label":"Del", "x":17, "y":3}, + {"label":"F5", "x":0, "y":4}, + {"label":"Ctrl", "x":2, "y":4, "w":1.5}, + {"label":"Win", "x":3.5, "y":4}, + {"label":"Alt", "x":4.5, "y":4, "w":1.5}, + {"x":6, "y":4, "w":6.75}, + {"label":"Fn", "x":12.75, "y":4, "w":1.5}, + {"label":"Left", "x":15, "y":4}, + {"label":"Down", "x":16, "y":4}, + {"label":"Right", "x":17, "y":4} + ] }, "LAYOUT_iso_blocker_7u_small_bspc": { "key_count": 73, - "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"|", "x":14.75, "y":2}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.5}, {"label":"Win", "x":3.5, "y":4}, {"label":"Alt", "x":4.5, "y":4, "w":1.5}, {"x":6, "y":4, "w":6.75}, {"label":"Fn", "x":12.75, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + "layout": [ + {"label":"F1", "x":0, "y":0}, + {"label":"Esc", "x":2, "y":0}, + {"label":"!", "x":3, "y":0}, + {"label":"@", "x":4, "y":0}, + {"label":"#", "x":5, "y":0}, + {"label":"$", "x":6, "y":0}, + {"label":"%", "x":7, "y":0}, + {"label":"^", "x":8, "y":0}, + {"label":"&", "x":9, "y":0}, + {"label":"*", "x":10, "y":0}, + {"label":"(", "x":11, "y":0}, + {"label":")", "x":12, "y":0}, + {"label":"_", "x":13, "y":0}, + {"label":"+", "x":14, "y":0}, + {"label":"Backspace", "x":15, "y":0}, + {"x":16, "y":0}, + {"label":"Home", "x":17, "y":0}, + {"label":"F2", "x":0, "y":1}, + {"label":"Tab", "x":2, "y":1, "w":1.5}, + {"label":"Q", "x":3.5, "y":1}, + {"label":"W", "x":4.5, "y":1}, + {"label":"E", "x":5.5, "y":1}, + {"label":"R", "x":6.5, "y":1}, + {"label":"T", "x":7.5, "y":1}, + {"label":"Y", "x":8.5, "y":1}, + {"label":"U", "x":9.5, "y":1}, + {"label":"I", "x":10.5, "y":1}, + {"label":"O", "x":11.5, "y":1}, + {"label":"P", "x":12.5, "y":1}, + {"label":"{", "x":13.5, "y":1}, + {"label":"}", "x":14.5, "y":1}, + {"label":"End", "x":17, "y":1}, + {"label":"F3", "x":0, "y":2}, + {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, + {"label":"A", "x":3.75, "y":2}, + {"label":"S", "x":4.75, "y":2}, + {"label":"D", "x":5.75, "y":2}, + {"label":"F", "x":6.75, "y":2}, + {"label":"G", "x":7.75, "y":2}, + {"label":"H", "x":8.75, "y":2}, + {"label":"J", "x":9.75, "y":2}, + {"label":"K", "x":10.75, "y":2}, + {"label":"L", "x":11.75, "y":2}, + {"label":":", "x":12.75, "y":2}, + {"label":"\"", "x":13.75, "y":2}, + {"label":"|", "x":14.75, "y":2}, + {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, + {"label":"Ins", "x":17, "y":2}, + {"label":"F4", "x":0, "y":3}, + {"label":"Shift", "x":2, "y":3, "w":1.25}, + {"x":3.25, "y":3}, + {"label":"Z", "x":4.25, "y":3}, + {"label":"X", "x":5.25, "y":3}, + {"label":"C", "x":6.25, "y":3}, + {"label":"V", "x":7.25, "y":3}, + {"label":"B", "x":8.25, "y":3}, + {"label":"N", "x":9.25, "y":3}, + {"label":"M", "x":10.25, "y":3}, + {"label":"<", "x":11.25, "y":3}, + {"label":">", "x":12.25, "y":3}, + {"label":"?", "x":13.25, "y":3}, + {"label":"Shift", "x":14.25, "y":3, "w":1.75}, + {"label":"Up", "x":16, "y":3}, + {"label":"Del", "x":17, "y":3}, + {"label":"F5", "x":0, "y":4}, + {"label":"Ctrl", "x":2, "y":4, "w":1.5}, + {"label":"Win", "x":3.5, "y":4}, + {"label":"Alt", "x":4.5, "y":4, "w":1.5}, + {"x":6, "y":4, "w":6.75}, + {"label":"Fn", "x":12.75, "y":4, "w":1.5}, + {"label":"Left", "x":15, "y":4}, + {"label":"Down", "x":16, "y":4}, + {"label":"Right", "x":17, "y":4} + ] } } } From f6c0d999b99c6d18f838cd5d36f0351ca3345630 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Wed, 12 Dec 2018 12:46:56 -0800 Subject: [PATCH 670/788] Puck Refactor, Configurator support and readme cleanup (#4615) * Puck: layout macro refactor Reformat layout macro to resemble physical keyboard layout. * Puck: Configurator support * Puck: readme cleanup Markdown formatting corrections. --- keyboards/puck/info.json | 25 +++++++++++++++++++++++++ keyboards/puck/puck.h | 5 ++++- keyboards/puck/readme.md | 10 ++++++---- 3 files changed, 35 insertions(+), 5 deletions(-) create mode 100644 keyboards/puck/info.json diff --git a/keyboards/puck/info.json b/keyboards/puck/info.json new file mode 100644 index 000000000..e8d03a43f --- /dev/null +++ b/keyboards/puck/info.json @@ -0,0 +1,25 @@ +{ + "keyboard_name": "Puck", + "url": "", + "maintainer": "john-pettigrew", + "width": 3, + "height": 4, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"SW1", "x":0, "y":0}, + {"label":"SW2", "x":1, "y":0}, + {"label":"SW3", "x":2, "y":0}, + {"label":"SW4", "x":0, "y":1}, + {"label":"SW5", "x":1, "y":1}, + {"label":"SW6", "x":2, "y":1}, + {"label":"SW7", "x":0, "y":2}, + {"label":"SW8", "x":1, "y":2}, + {"label":"SW9", "x":2, "y":2}, + {"label":"SW10", "x":0, "y":3}, + {"label":"SW11", "x":1, "y":3}, + {"label":"SW12", "x":2, "y":3} + ] + } + } +} diff --git a/keyboards/puck/puck.h b/keyboards/puck/puck.h index 4467614fd..0f2a284a6 100644 --- a/keyboards/puck/puck.h +++ b/keyboards/puck/puck.h @@ -4,7 +4,10 @@ #include "quantum.h" #define LAYOUT( \ - K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B \ + K00, K01, K02, \ + K03, K04, K05, \ + K06, K07, K08, \ + K09, K0A, K0B \ ) { \ { K00, K01, K02 }, \ { K03, K04, K05 }, \ diff --git a/keyboards/puck/readme.md b/keyboards/puck/readme.md index 45e438c47..fe1bd1668 100644 --- a/keyboards/puck/readme.md +++ b/keyboards/puck/readme.md @@ -1,8 +1,10 @@ -A 4 x 3 macropad. +# Puck -Keyboard Maintainer: [john-pettigrew](https://github.com/john-pettigrew) -Hardware Supported: Puck PCB. -Hardware Availability: [OkKeebs.com](https://okkeebs.com/products/puck-pcb) +A 4x3 macropad. + +Keyboard Maintainer: [John Pettigrew](https://github.com/john-pettigrew) +Hardware Supported: Puck PCB +Hardware Availability: [OKKeebs.com](https://okkeebs.com/products/puck-pcb) Make example for this keyboard (after setting up your build environment): From 4e78d28b4be046b2f21dfd6de2179fd7f821537f Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Wed, 12 Dec 2018 15:08:34 -0800 Subject: [PATCH 671/788] Zlant: Configurator rendering bugfix (#4622) Configurator's API uses the available alias name, instead of the direct matrix name. --- keyboards/zlant/info.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/zlant/info.json b/keyboards/zlant/info.json index b1f20555c..773fa5a31 100644 --- a/keyboards/zlant/info.json +++ b/keyboards/zlant/info.json @@ -5,7 +5,7 @@ "width": 12.75, "height": 4, "layouts": { - "LAYOUT_ortho_4x12": { + "LAYOUT": { "key_count": 48, "layout": [{"label":"K000", "x":0, "y":0}, {"label":"K001", "x":1, "y":0}, {"label":"K002", "x":2, "y":0}, {"label":"K003", "x":3, "y":0}, {"label":"K004", "x":4, "y":0}, {"label":"K005", "x":5, "y":0}, {"label":"K006", "x":6, "y":0}, {"label":"K007", "x":7, "y":0}, {"label":"K008", "x":8, "y":0}, {"label":"K009", "x":9, "y":0}, {"label":"K010", "x":10, "y":0}, {"label":"K011", "x":11, "y":0}, {"label":"K100", "x":0.25, "y":1}, {"label":"K101", "x":1.25, "y":1}, {"label":"K102", "x":2.25, "y":1}, {"label":"K103", "x":3.25, "y":1}, {"label":"K104", "x":4.25, "y":1}, {"label":"K105", "x":5.25, "y":1}, {"label":"K106", "x":6.25, "y":1}, {"label":"K107", "x":7.25, "y":1}, {"label":"K108", "x":8.25, "y":1}, {"label":"K109", "x":9.25, "y":1}, {"label":"K110", "x":10.25, "y":1}, {"label":"K111", "x":11.25, "y":1}, {"label":"K200", "x":0.5, "y":2}, {"label":"K201", "x":1.5, "y":2}, {"label":"K202", "x":2.5, "y":2}, {"label":"K203", "x":3.5, "y":2}, {"label":"K204", "x":4.5, "y":2}, {"label":"K205", "x":5.5, "y":2}, {"label":"K206", "x":6.5, "y":2}, {"label":"K207", "x":7.5, "y":2}, {"label":"K208", "x":8.5, "y":2}, {"label":"K209", "x":9.5, "y":2}, {"label":"K210", "x":10.5, "y":2}, {"label":"K211", "x":11.5, "y":2}, {"label":"K300", "x":0.75, "y":3}, {"label":"K301", "x":1.75, "y":3}, {"label":"K302", "x":2.75, "y":3}, {"label":"K303", "x":3.75, "y":3}, {"label":"K304", "x":4.75, "y":3}, {"label":"K305", "x":5.75, "y":3}, {"label":"K306", "x":6.75, "y":3}, {"label":"K307", "x":7.75, "y":3}, {"label":"K308", "x":8.75, "y":3}, {"label":"K309", "x":9.75, "y":3}, {"label":"K310", "x":10.75, "y":3}, {"label":"K311", "x":11.75, "y":3}] }, From 2cef75cbb3ba9a3c05cf6914c6bafb720f2f2b83 Mon Sep 17 00:00:00 2001 From: ishtob Date: Wed, 12 Dec 2018 18:20:30 -0500 Subject: [PATCH 672/788] Keymap: update ishtobs hadron keymap (#4613) * adding ishtob's keymap to hadron ver3 * update ishtob keymap * ishtob hadron keymap update 2 * Delete readme (Case Conflict).md * Delete readme (Case Conflict).md * add missing FN layer to ishtob hadron keymap * removed unused toggle keycode --- keyboards/hadron/ver3/keymaps/ishtob/keymap.c | 41 ++++++++++++++----- keyboards/hadron/ver3/rev3.h | 21 ---------- 2 files changed, 31 insertions(+), 31 deletions(-) delete mode 100644 keyboards/hadron/ver3/rev3.h diff --git a/keyboards/hadron/ver3/keymaps/ishtob/keymap.c b/keyboards/hadron/ver3/keymaps/ishtob/keymap.c index 870781930..530508b01 100644 --- a/keyboards/hadron/ver3/keymaps/ishtob/keymap.c +++ b/keyboards/hadron/ver3/keymaps/ishtob/keymap.c @@ -18,10 +18,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_QWERTY] = LAYOUT_wrapper( KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_DEL,\ - KC_TAB, _________________QWERTY_L1_________________, KC_P7, KC_P8, KC_P9, _________________QWERTY_R1_________________, KC_BSPC, \ + LT_FN(KC_TAB), _________________QWERTY_L1_________________, KC_P7, KC_P8, KC_P9, _________________QWERTY_R1_________________, KC_BSPC, \ KC_CAPS, _________________QWERTY_L2_________________, KC_P4, KC_P5, KC_P6, _________________QWERTY_R2_________________, CTL_ENT, \ KC_LSFT, _________________QWERTY_L3_________________, KC_P1, KC_P2, KC_P3, _________________QWERTY_R3_________________, LT_RAI(KC_MINS), \ - KC_ESC, KC_LCTRL, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_P0, KC_DOT, KC_EQL, KC_SPC, RAISE, KC_RALT, TG_NUMLAY, KC_APP, KC_DEL \ + KC_ESC, KC_LCTRL, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_P0, KC_DOT, KC_EQL, KC_SPC, RAISE, KC_RALT, KC_RGUI, KC_APP, KC_DEL \ ), /* Colemak @@ -39,10 +39,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_COLEMAK] = LAYOUT_wrapper( KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_DEL,\ - KC_TAB, _________________COLEMAK_L1________________, KC_P7, KC_P8, KC_P9, _________________COLEMAK_R1________________, KC_BSPC, \ + LT_FN(KC_TAB), _________________COLEMAK_L1________________, KC_P7, KC_P8, KC_P9, _________________COLEMAK_R1________________, KC_BSPC, \ KC_LCTRL, _________________COLEMAK_L2________________, KC_P4, KC_P5, KC_P6, _________________COLEMAK_R2________________, CTL_ENT, \ KC_LSFT, _________________COLEMAK_L3________________, KC_P1, KC_P2, KC_P3, _________________COLEMAK_R3________________, LT_RAI(KC_MINS), \ - KC_ESC, KC_CAPS, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_P0, KC_DOT, KC_EQL, KC_SPC, RAISE, KC_RALT, TG_NUMLAY, KC_APP, KC_DEL \ + KC_ESC, KC_CAPS, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_P0, KC_DOT, KC_EQL, KC_SPC, RAISE, KC_RALT, KC_RGUI, KC_APP, KC_DEL \ ), /* Dvorak @@ -60,10 +60,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_DVORAK] = LAYOUT_wrapper( KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_DEL,\ - KC_TAB, _________________DVORAK_L1_________________, KC_P7, KC_P8, KC_P9, _________________DVORAK_R1_________________, KC_BSPC, \ + LT_FN(KC_TAB), _________________DVORAK_L1_________________, KC_P7, KC_P8, KC_P9, _________________DVORAK_R1_________________, KC_BSPC, \ KC_LCTL, _________________DVORAK_L2_________________, KC_P4, KC_P5, KC_P6, _________________DVORAK_R2_________________, CTL_ENT, \ KC_LSFT, _________________DVORAK_L3_________________, KC_P1, KC_P2, KC_P3, _________________DVORAK_R3_________________, LT_RAI(KC_MINS), \ - KC_ESC, KC_CAPS, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_P0, KC_DOT, KC_EQL, KC_SPC, RAISE, KC_RALT, TG_NUMLAY, KC_APP, KC_DEL \ + KC_ESC, KC_CAPS, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_P0, KC_DOT, KC_EQL, KC_SPC, RAISE, KC_RALT, KC_RGUI, KC_APP, KC_DEL \ ), /* Lower @@ -102,10 +102,31 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_RAISE] = LAYOUT_wrapper( KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, _______, _______, _______, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \ - KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, _______, _______, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, _______, _______, _______, KC_F12, KC_NUHS, KC_NUBS, _______, _______, _______, \ - _______, _______, _______, _______, _______, KC_SPC, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ + ________________NUMBER_LEFT________________, KC_6, _______, _______, _______, KC_7, KC_8, KC_9, KC_0, KC_PLUS, KC_BSLS, \ + KC_DEL, KC_A, KC_UP, KC_D, KC_PSCR, KC_VOLU, _______, _______, _______, KC_4, KC_5, KC_6, KC_PAST, KC_COLN, KC_QUOT, \ + _______, KC_LEFT, KC_DOWN, KC_RIGHT,KC__MUTE, KC_VOLD, _______, _______, _______, KC_1, KC_2, KC_3, KC_UP, KC_SLSH, _______, \ + _______, _______, _______, _______, _______, KC_SPC, _______, _______, KC_SPC, KC_0, _______, KC_LEFT, KC_DOWN, KC_RIGHT, KC_NLCK \ +), + +/* FN layer on Esc key + * ,------+------+------+------+------+------------------------------------------------. + * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | + * |------+------+------+------+------+------+------+------+------+------+------+------+--------------------. + * | | ! | @ | # | $ | % | | | | ^ | & | * | ( | ) | + | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | _ | = | [ | ] | ' | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | | | | F12 |ISO ~ |ISO | | { | } |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | Next | Vol- | Vol+ | Play | + * '------+------+------+------+------+------+------+------+------+------+------+------+--------------------' + */ +[_FNLAYER] = LAYOUT_wrapper( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ + _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, _______, _______, _______, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_PLUS, \ + _______, __________________LONG_FUNC_LEFT___________________, _______, _______, _______, KC_UNDS, KC_EQL, KC_LBRC, KC_RBRC, KC_QUOT, \ + _______, __________________LONG_FUNC_RIGHT__________________, _______, _______, _______,S(KC_NUHS),S(KC_NUBS),KC_LCBR, KC_RCBR, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ ), /* Mouse Layer (semi-col) diff --git a/keyboards/hadron/ver3/rev3.h b/keyboards/hadron/ver3/rev3.h deleted file mode 100644 index 2cbd53ace..000000000 --- a/keyboards/hadron/ver3/rev3.h +++ /dev/null @@ -1,21 +0,0 @@ -/* Copyright 2018 Jack Humbert - * - * 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 . - */ -#ifndef REV3_H -#define REV3_H - -#include "hadron.h" - -#endif \ No newline at end of file From ca39fa8222ed339f09b2713bd538880fd4f2ff0e Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Wed, 12 Dec 2018 16:46:13 -0800 Subject: [PATCH 673/788] Keyboard: handwired/kbod Refactor, Configurator support and readme update (#4623) * handwired/kbod: refactor - layout macro KEYMAP renamed to LAYOUT * handwired/kbod: update config.h files to #pragma once * handwired/kbod: Configurator support * handwired/kbod: readme update - updated reademe to current template - added image --- keyboards/handwired/kbod/config.h | 5 +- keyboards/handwired/kbod/info.json | 74 +++++++++++++++++++ keyboards/handwired/kbod/kbod.h | 2 +- .../handwired/kbod/keymaps/default/config.h | 7 +- .../handwired/kbod/keymaps/default/keymap.c | 54 +++++++------- keyboards/handwired/kbod/readme.md | 23 +++--- 6 files changed, 113 insertions(+), 52 deletions(-) create mode 100644 keyboards/handwired/kbod/info.json diff --git a/keyboards/handwired/kbod/config.h b/keyboards/handwired/kbod/config.h index a3f3e3908..d3869f99e 100644 --- a/keyboards/handwired/kbod/config.h +++ b/keyboards/handwired/kbod/config.h @@ -15,8 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef CONFIG_H -#define CONFIG_H +#pragma once #include "config_common.h" @@ -161,5 +160,3 @@ along with this program. If not, see . #undef TAPPING_TOGGLE #define TAPPING_TOGGLE 2 - -#endif diff --git a/keyboards/handwired/kbod/info.json b/keyboards/handwired/kbod/info.json new file mode 100644 index 000000000..02586164b --- /dev/null +++ b/keyboards/handwired/kbod/info.json @@ -0,0 +1,74 @@ +{ + "keyboard_name": "kbod", + "url": "", + "maintainer": "qmk", + "width": 15, + "height": 5, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"`", "x":0, "y":0}, + {"label":"1", "x":1, "y":0}, + {"label":"2", "x":2, "y":0}, + {"label":"3", "x":3, "y":0}, + {"label":"4", "x":4, "y":0}, + {"label":"5", "x":5, "y":0}, + {"label":"6", "x":6, "y":0}, + {"label":"7", "x":7, "y":0}, + {"label":"8", "x":8, "y":0}, + {"label":"9", "x":9, "y":0}, + {"label":"0", "x":10, "y":0}, + {"label":"-", "x":11, "y":0}, + {"label":"=", "x":12, "y":0}, + {"label":"Backspace", "x":13, "y":0, "w":2}, + {"label":"Tab", "x":0, "y":1, "w":1.5}, + {"label":"Q", "x":1.5, "y":1}, + {"label":"W", "x":2.5, "y":1}, + {"label":"E", "x":3.5, "y":1}, + {"label":"R", "x":4.5, "y":1}, + {"label":"T", "x":5.5, "y":1}, + {"label":"Y", "x":6.5, "y":1}, + {"label":"U", "x":7.5, "y":1}, + {"label":"I", "x":8.5, "y":1}, + {"label":"O", "x":9.5, "y":1}, + {"label":"P", "x":10.5, "y":1}, + {"label":"[", "x":11.5, "y":1}, + {"label":"]", "x":12.5, "y":1}, + {"label":"\\", "x":13.5, "y":1, "w":1.5}, + {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, + {"label":"A", "x":1.75, "y":2}, + {"label":"S", "x":2.75, "y":2}, + {"label":"D", "x":3.75, "y":2}, + {"label":"F", "x":4.75, "y":2}, + {"label":"G", "x":5.75, "y":2}, + {"label":"H", "x":6.75, "y":2}, + {"label":"J", "x":7.75, "y":2}, + {"label":"K", "x":8.75, "y":2}, + {"label":"L", "x":9.75, "y":2}, + {"label":";", "x":10.75, "y":2}, + {"label":"'", "x":11.75, "y":2}, + {"label":"Enter", "x":12.75, "y":2, "w":2.25}, + {"label":"Shift", "x":0, "y":3, "w":2.25}, + {"label":"Z", "x":2.25, "y":3}, + {"label":"X", "x":3.25, "y":3}, + {"label":"C", "x":4.25, "y":3}, + {"label":"V", "x":5.25, "y":3}, + {"label":"B", "x":6.25, "y":3}, + {"label":"N", "x":7.25, "y":3}, + {"label":"M", "x":8.25, "y":3}, + {"label":",", "x":9.25, "y":3}, + {"label":".", "x":10.25, "y":3}, + {"label":"/", "x":11.25, "y":3}, + {"label":"Shift", "x":12.25, "y":3, "w":2.75}, + {"label":"Ctrl", "x":0, "y":4, "w":1.25}, + {"label":"GUI", "x":1.25, "y":4, "w":1.25}, + {"label":"Alt", "x":2.5, "y":4, "w":1.25}, + {"label":"Space", "x":3.75, "y":4, "w":6.25}, + {"label":"Alt", "x":10, "y":4, "w":1.25}, + {"label":"GUI", "x":11.25, "y":4, "w":1.25}, + {"label":"Menu", "x":12.5, "y":4, "w":1.25}, + {"label":"Ctrl", "x":13.75, "y":4, "w":1.25} + ] + } + } +} diff --git a/keyboards/handwired/kbod/kbod.h b/keyboards/handwired/kbod/kbod.h index 356063624..5d9dbd05b 100644 --- a/keyboards/handwired/kbod/kbod.h +++ b/keyboards/handwired/kbod/kbod.h @@ -3,7 +3,7 @@ #include "quantum.h" -#define KEYMAP( \ +#define LAYOUT( \ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, \ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, \ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, \ diff --git a/keyboards/handwired/kbod/keymaps/default/config.h b/keyboards/handwired/kbod/keymaps/default/config.h index df06a2620..271f48d00 100644 --- a/keyboards/handwired/kbod/keymaps/default/config.h +++ b/keyboards/handwired/kbod/keymaps/default/config.h @@ -1,8 +1,3 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" +#pragma once // place overrides here - -#endif \ No newline at end of file diff --git a/keyboards/handwired/kbod/keymaps/default/keymap.c b/keyboards/handwired/kbod/keymaps/default/keymap.c index 1386b742f..063a94b4d 100644 --- a/keyboards/handwired/kbod/keymaps/default/keymap.c +++ b/keyboards/handwired/kbod/keymaps/default/keymap.c @@ -1,6 +1,4 @@ -#include "kbod.h" - -#define _____ KC_TRNS +#include QMK_KEYBOARD_H #define MODS_PRESSED(btn) (get_mods() & (MOD_BIT(KC_L##btn)|MOD_BIT(KC_R##btn))) @@ -25,33 +23,33 @@ if (record->event.pressed) { \ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - KEYMAP( /* Base */ - F(0), KC_1, KC_2, KC_3, F(1), KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQUAL, KC_BSPC, - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLASH, - KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCOLON, KC_QUOT, KC_ENTER, - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLASH, KC_RSFT, - TT(1), KC_LCTL, KC_LALT, KC_SPACE, KC_RALT, KC_RGUI, KC_APP, KC_RCTL + LAYOUT( /* Base */ + F(0), KC_1, KC_2, KC_3, F(1), KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \ + TT(1), KC_LCTL, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL \ ), - KEYMAP( /* Cursor layer */ - KC_GRAVE, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, - TT(3), _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_INSERT, - TT(2), _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_HOME, _____, - _____, _____, _____, _____, _____, _____, _____, _____, KC_PGUP, KC_PGDN, KC_END, KC_UP, - _____, _____, _____, _____, _____, KC_LEFT, KC_DOWN, KC_RIGHT + LAYOUT( /* Cursor layer */ + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, \ + TT(3), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS, \ + TT(2), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, KC_PGDN, KC_END, KC_UP, \ + _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT \ ), - KEYMAP( /* Keypad layer */ - TO(0), KC_1, KC_2, KC_3, F(1), KC_5, KC_6, KC_P7, KC_P8, KC_P9, KC_P0, KC_PMNS, KC_PPLS, KC_BSPC, - _____, _____, _____, _____, _____, _____, _____, KC_P4, KC_P5, KC_P6, _____, _____, _____, _____, - _____, _____, _____, _____, _____, _____, _____, KC_P1, KC_P2, KC_P3, _____, _____, _____, - _____, _____, _____, _____, _____, _____, _____, KC_P0, KC_PDOT, KC_MS_BTN1, KC_MS_UP, KC_MS_BTN2, - _____, _____, _____, _____, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_MS_BTN3 + LAYOUT( /* Keypad layer */ + TO(0), KC_1, KC_2, KC_3, F(1), KC_5, KC_6, KC_P7, KC_P8, KC_P9, KC_P0, KC_PMNS, KC_PPLS, KC_BSPC, \ + _______, _______, _______, _______, _______, _______, _______, KC_P4, KC_P5, KC_P6, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, KC_P1, KC_P2, KC_P3, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, KC_P0, KC_PDOT, KC_BTN1, KC_MS_U, KC_BTN2, \ + _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R, KC_BTN3 \ ), - KEYMAP( /* Multimedia layer */ - TO(0), _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_AUDIO_MUTE, KC_AUDIO_VOL_DOWN, KC_AUDIO_VOL_UP, _____, - _____, _____, KC_WAKE, _____, _____, _____, _____, _____, _____, _____, KC_MSTP, KC_MPRV, KC_MNXT, _____, - _____, _____, KC_SLEP, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, - _____, _____, KC_PWR, _____, _____, _____, _____, _____, _____, KC_MS_BTN1, KC_MS_WH_UP, KC_MS_BTN2, - _____, _____, _____, KC_MPLY, KC_MS_WH_LEFT, KC_MS_WH_DOWN, KC_MS_WH_RIGHT, KC_MS_BTN3 + LAYOUT( /* Multimedia layer */ + TO(0), _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, \ + _______, _______, KC_WAKE, _______, _______, _______, _______, _______, _______, _______, KC_MSTP, KC_MPRV, KC_MNXT, _______, \ + _______, _______, KC_SLEP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, KC_PWR, _______, _______, _______, _______, _______, _______, KC_BTN1, KC_WH_U, KC_BTN2, \ + _______, _______, _______, KC_MPLY, KC_WH_L, KC_WH_D, KC_WH_R, KC_BTN3 \ ), }; @@ -101,4 +99,4 @@ void matrix_scan_user(void) { } else { PORTC &= ~_BV(PC7); } -} \ No newline at end of file +} diff --git a/keyboards/handwired/kbod/readme.md b/keyboards/handwired/kbod/readme.md index d2f2c01ae..470ccce0e 100644 --- a/keyboards/handwired/kbod/readme.md +++ b/keyboards/handwired/kbod/readme.md @@ -1,21 +1,18 @@ -KBOD keyboard firmware -====================== +# KBOD -KBOD is a 60% Keyboard kit, hand-wired, with Arduino Micro as its controller. It's utilize 8x8 matrix and has layout similar to GH-60 +![KBOD](https://f4.fudanchii.net/shx/2017/02/IMG_20170212_224547.jpg) -## Quantum MK Firmware +KBOD is a 60% Keyboard kit, hand-wired, with Arduino Micro as its controller. It utilizes an 8x8 matrix and has layout similar to GH60. [More info](https://github.com/fudanchii/keyboard_of_disapproval) -For the full Quantum feature list, see [the parent readme](/). +Keyboard Maintainer: [The QMK Community](https://github.com/qmk) +Hardware Supported: Arduino Micro -## Building +Make example for this keyboard (after setting up your build environment): -Download or clone the whole firmware and use ```make handwired/kbod:default``` to generate the .hex file. You may flash it with avrdude + make handwired/kbod:default -## Flashing -Something along this line: +Flashing your firmware may be done with avrdude. The command should be something along this line: -``` -avrdude -p m32u4 -c avr109 -P -C -e -u flash:w:handwired_kbod_default.hex -``` + avrdude -p m32u4 -c avr109 -P -C -e -u flash:w:handwired_kbod_default.hex -[More info](https://github.com/fudanchii/keyboard_of_disapproval) \ No newline at end of file +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). From 24b17c96191d0791110ef6b51fa54f74d91075de Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Wed, 12 Dec 2018 17:56:29 -0800 Subject: [PATCH 674/788] Keyboard: handwired/maartenwut readme cleanup and Configurator support (#4624) * handwired/maartenwut: readme cleanup - Fixed typo (Maarten's last name was misspelled) - Updated Docs links * handwired/maartenwut: Configurator support --- keyboards/handwired/maartenwut/info.json | 80 ++++++++++++++++++++++++ keyboards/handwired/maartenwut/readme.md | 4 +- 2 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 keyboards/handwired/maartenwut/info.json diff --git a/keyboards/handwired/maartenwut/info.json b/keyboards/handwired/maartenwut/info.json new file mode 100644 index 000000000..98720d24f --- /dev/null +++ b/keyboards/handwired/maartenwut/info.json @@ -0,0 +1,80 @@ +{ + "keyboard_name": "Maartenwut Ortho", + "url": "", + "maintainer": "maartenwut", + "width": 14, + "height": 5, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"`", "x":0, "y":0}, + {"label":"1", "x":1, "y":0}, + {"label":"2", "x":2, "y":0}, + {"label":"3", "x":3, "y":0}, + {"label":"4", "x":4, "y":0}, + {"label":"5", "x":5, "y":0}, + {"label":"6", "x":6, "y":0}, + {"label":"7", "x":7, "y":0}, + {"label":"8", "x":8, "y":0}, + {"label":"9", "x":9, "y":0}, + {"label":"0", "x":10, "y":0}, + {"label":"-", "x":11, "y":0}, + {"label":"=", "x":12, "y":0}, + {"label":"Backspace", "x":13, "y":0}, + {"label":"Esc", "x":0, "y":1}, + {"label":"Q", "x":1, "y":1}, + {"label":"W", "x":2, "y":1}, + {"label":"E", "x":3, "y":1}, + {"label":"R", "x":4, "y":1}, + {"label":"T", "x":5, "y":1}, + {"label":"Y", "x":6, "y":1}, + {"label":"U", "x":7, "y":1}, + {"label":"I", "x":8, "y":1}, + {"label":"O", "x":9, "y":1}, + {"label":"P", "x":10, "y":1}, + {"label":"[", "x":11, "y":1}, + {"label":"]", "x":12, "y":1}, + {"label":"\\", "x":13, "y":1}, + {"label":"Tab", "x":0, "y":2}, + {"label":"A", "x":1, "y":2}, + {"label":"S", "x":2, "y":2}, + {"label":"D", "x":3, "y":2}, + {"label":"F", "x":4, "y":2}, + {"label":"G", "x":5, "y":2}, + {"label":"H", "x":6, "y":2}, + {"label":"J", "x":7, "y":2}, + {"label":"K", "x":8, "y":2}, + {"label":"L", "x":9, "y":2}, + {"label":";", "x":10, "y":2}, + {"label":"'", "x":11, "y":2}, + {"label":"Delete", "x":12, "y":2}, + {"label":"Enter", "x":13, "y":2}, + {"label":"Shift", "x":0, "y":3}, + {"label":"Z", "x":1, "y":3}, + {"label":"X", "x":2, "y":3}, + {"label":"C", "x":3, "y":3}, + {"label":"V", "x":4, "y":3}, + {"label":"B", "x":5, "y":3}, + {"label":"N", "x":6, "y":3}, + {"label":"M", "x":7, "y":3}, + {"label":",", "x":8, "y":3}, + {"label":".", "x":9, "y":3}, + {"label":"/", "x":10, "y":3}, + {"label":"Shift", "x":11, "y":3}, + {"label":"Up", "x":12, "y":3}, + {"label":"Print Screen", "x":13, "y":3}, + {"label":"Ctrl", "x":0, "y":4}, + {"label":"GUI", "x":1, "y":4}, + {"label":"Alt", "x":2, "y":4}, + {"label":"Fn", "x":3, "y":4}, + {"label":"Fn3 / Space", "x":4, "y":4, "w":2.25}, + {"label":"Space", "x":6.25, "y":4, "w":2.75}, + {"label":"Fn2", "x":9, "y":4}, + {"label":"Alt", "x":10, "y":4}, + {"label":"Left", "x":11, "y":4}, + {"label":"Down", "x":12, "y":4}, + {"label":"Right", "x":13, "y":4} + ] + } + } +} diff --git a/keyboards/handwired/maartenwut/readme.md b/keyboards/handwired/maartenwut/readme.md index 31fc76743..0ae738271 100644 --- a/keyboards/handwired/maartenwut/readme.md +++ b/keyboards/handwired/maartenwut/readme.md @@ -2,7 +2,7 @@ Custom handwired keyboard for maartenwut. -Keyboard Maintainer: [Maarten Dekekrs](https://github.com/maartenwut) +Keyboard Maintainer: [Maarten Dekkers](https://github.com/maartenwut) Hardware Supported: Custom handwired Hardware Availability: @@ -10,4 +10,4 @@ Make example for this keyboard (after setting up your build environment): make handwired/maartenwut:default -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. \ No newline at end of file +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). From cc45f62d757f56c2fa9be92685f83f127b63b509 Mon Sep 17 00:00:00 2001 From: Wilba6582 Date: Thu, 13 Dec 2018 19:33:04 +1100 Subject: [PATCH 675/788] Added Dynamic Keymaps to M10-B --- keyboards/rama/m10_b/config.h | 24 ++++++++++- keyboards/rama/m10_b/keymaps/default/keymap.c | 18 -------- keyboards/rama/m10_b/keymaps/knops/config.h | 3 +- keyboards/rama/m10_b/m10_b.c | 31 +------------- keyboards/rama/m10_b/rules.mk | 42 +++++++++---------- keyboards/rama/u80_a/config.h | 2 + keyboards/rama/u80_a/rules.mk | 1 - keyboards/wilba_tech/wt60_a/config.h | 2 + keyboards/wilba_tech/wt65_a/config.h | 2 + keyboards/wilba_tech/wt80_a/config.h | 2 + keyboards/wilba_tech/wt_main.c | 6 +++ 11 files changed, 62 insertions(+), 71 deletions(-) diff --git a/keyboards/rama/m10_b/config.h b/keyboards/rama/m10_b/config.h index de626dba5..144f88d56 100644 --- a/keyboards/rama/m10_b/config.h +++ b/keyboards/rama/m10_b/config.h @@ -26,7 +26,7 @@ along with this program. If not, see . #define DEVICE_VER 0x0001 #define MANUFACTURER RAMA.WORKS #define PRODUCT RAMA M10-B -#define DESCRIPTION RAMA M10-B Macropad +#define DESCRIPTION RAMA M10-B /* key matrix size */ #define MATRIX_ROWS 1 @@ -186,4 +186,26 @@ along with this program. If not, see . /* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ //#define MIDI_TONE_KEYCODE_OCTAVES 1 +//#define WT_MONO_BACKLIGHT + +#define DYNAMIC_KEYMAP_LAYER_COUNT 4 + +// EEPROM usage + +// TODO: refactor with new user EEPROM code (coming soon) +#define EEPROM_MAGIC 0x451F +#define EEPROM_MAGIC_ADDR 32 +// Bump this every time we change what we store +// This will automatically reset the EEPROM with defaults +// and avoid loading invalid data from the EEPROM +#define EEPROM_VERSION 0x08 +#define EEPROM_VERSION_ADDR 34 + +// Dynamic keymap starts after EEPROM version +#define DYNAMIC_KEYMAP_EEPROM_ADDR 35 +// Dynamic macro starts after dynamic keymaps (35+(4*10*2)) = (35+80) +#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 115 +#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 909 +#define DYNAMIC_KEYMAP_MACRO_COUNT 16 + #endif diff --git a/keyboards/rama/m10_b/keymaps/default/keymap.c b/keyboards/rama/m10_b/keymaps/default/keymap.c index 8002b8c7c..c307bcb2a 100644 --- a/keyboards/rama/m10_b/keymaps/default/keymap.c +++ b/keyboards/rama/m10_b/keymaps/default/keymap.c @@ -6,21 +6,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_4, KC_KP_5, KC_KP_6, KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_0 ) }; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - return MACRO_NONE; -} - -void matrix_init_user(void) -{ -} - -void matrix_scan_user(void) -{ -} - -bool process_record_user(uint16_t keycode, keyrecord_t *record) -{ - return true; -} diff --git a/keyboards/rama/m10_b/keymaps/knops/config.h b/keyboards/rama/m10_b/keymaps/knops/config.h index d150575c1..7c3ec9601 100644 --- a/keyboards/rama/m10_b/keymaps/knops/config.h +++ b/keyboards/rama/m10_b/keymaps/knops/config.h @@ -19,6 +19,7 @@ #include "../../config.h" -// place overrides here +#undef RAW_ENABLE +#undef DYNAMIC_KEYMAP_ENABLE #endif diff --git a/keyboards/rama/m10_b/m10_b.c b/keyboards/rama/m10_b/m10_b.c index f43f6e2a1..ccff6d62c 100644 --- a/keyboards/rama/m10_b/m10_b.c +++ b/keyboards/rama/m10_b/m10_b.c @@ -1,4 +1,4 @@ -/* Copyright 2018 Wilba +/* Copyright 2018 Jason Williams (Wilba) * * 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 @@ -13,32 +13,5 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#include "m10_b.h" -/* -void matrix_init_kb(void) { - // put your keyboard start-up code here - // runs once when the firmware starts up - matrix_init_user(); -} - -void matrix_scan_kb(void) { - // put your looping keyboard code here - // runs every cycle (a lot) - - matrix_scan_user(); -} - -bool process_record_kb(uint16_t keycode, keyrecord_t *record) { - // put your per-action keyboard code here - // runs for every action, just before processing by the firmware - - return process_record_user(keycode, record); -} - -void led_set_kb(uint8_t usb_led) { - // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here - - led_set_user(usb_led); -} -*/ +// Nothing to see here, move along... ;-) diff --git a/keyboards/rama/m10_b/rules.mk b/keyboards/rama/m10_b/rules.mk index 24df4632d..70258b9ea 100644 --- a/keyboards/rama/m10_b/rules.mk +++ b/keyboards/rama/m10_b/rules.mk @@ -1,5 +1,7 @@ +# project specific files +SRC = keyboards/wilba_tech/wt_main.c + # MCU name -#MCU = at90usb1286 MCU = atmega32u4 # Processor frequency. @@ -39,30 +41,28 @@ F_USB = $(F_CPU) OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT -# Boot Section Size in *bytes* -# Teensy halfKay 512 -# Teensy++ halfKay 1024 -# Atmel DFU loader 4096 -# LUFA bootloader 4096 -# USBaspLoader 2048 -OPT_DEFS += -DBOOTLOADER_SIZE=4096 +# Boot Section +BOOTLOADER = atmel-dfu # Build Options # change yes to no to disable # -BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700) -EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) -CONSOLE_ENABLE ?= yes # Console for debug(+400) -COMMAND_ENABLE ?= yes # Commands for debug and configuration +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE -SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend # if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -NKRO_ENABLE ?= no # USB Nkey Rollover -BACKLIGHT_ENABLE ?= yes # Enable keyboard backlight functionality on B7 by default -MIDI_ENABLE ?= no # MIDI support (+2400 to 4200, depending on config) -UNICODE_ENABLE ?= no # Unicode -BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID -AUDIO_ENABLE ?= no # Audio output on port C6 -FAUXCLICKY_ENABLE ?= no # Use buzzer to emulate clicky switches +NKRO_ENABLE = yes # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches + +RAW_ENABLE = yes +DYNAMIC_KEYMAP_ENABLE = yes diff --git a/keyboards/rama/u80_a/config.h b/keyboards/rama/u80_a/config.h index b5dc27598..c733601e1 100644 --- a/keyboards/rama/u80_a/config.h +++ b/keyboards/rama/u80_a/config.h @@ -185,6 +185,8 @@ /* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ //#define MIDI_TONE_KEYCODE_OCTAVES 1 +#define WT_MONO_BACKLIGHT + #define DYNAMIC_KEYMAP_LAYER_COUNT 4 // EEPROM usage diff --git a/keyboards/rama/u80_a/rules.mk b/keyboards/rama/u80_a/rules.mk index 67b04e350..54479529b 100644 --- a/keyboards/rama/u80_a/rules.mk +++ b/keyboards/rama/u80_a/rules.mk @@ -69,4 +69,3 @@ FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches RAW_ENABLE = yes DYNAMIC_KEYMAP_ENABLE = yes -CIE1931_CURVE = yes \ No newline at end of file diff --git a/keyboards/wilba_tech/wt60_a/config.h b/keyboards/wilba_tech/wt60_a/config.h index 8c18582a8..9eff7d7f1 100644 --- a/keyboards/wilba_tech/wt60_a/config.h +++ b/keyboards/wilba_tech/wt60_a/config.h @@ -185,6 +185,8 @@ /* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ //#define MIDI_TONE_KEYCODE_OCTAVES 1 +#define WT_MONO_BACKLIGHT + #define DYNAMIC_KEYMAP_LAYER_COUNT 4 // EEPROM usage diff --git a/keyboards/wilba_tech/wt65_a/config.h b/keyboards/wilba_tech/wt65_a/config.h index 88e902353..88366edc0 100644 --- a/keyboards/wilba_tech/wt65_a/config.h +++ b/keyboards/wilba_tech/wt65_a/config.h @@ -185,6 +185,8 @@ /* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ //#define MIDI_TONE_KEYCODE_OCTAVES 1 +#define WT_MONO_BACKLIGHT + #define DYNAMIC_KEYMAP_LAYER_COUNT 4 // EEPROM usage diff --git a/keyboards/wilba_tech/wt80_a/config.h b/keyboards/wilba_tech/wt80_a/config.h index ca03c366e..7c15e4a5b 100644 --- a/keyboards/wilba_tech/wt80_a/config.h +++ b/keyboards/wilba_tech/wt80_a/config.h @@ -185,6 +185,8 @@ /* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ //#define MIDI_TONE_KEYCODE_OCTAVES 1 +#define WT_MONO_BACKLIGHT + #define DYNAMIC_KEYMAP_LAYER_COUNT 4 // EEPROM usage diff --git a/keyboards/wilba_tech/wt_main.c b/keyboards/wilba_tech/wt_main.c index de6d7b92c..7a63ab5b7 100644 --- a/keyboards/wilba_tech/wt_main.c +++ b/keyboards/wilba_tech/wt_main.c @@ -15,7 +15,9 @@ */ #include "quantum.h" +#ifdef WT_MONO_BACKLIGHT #include "keyboards/wilba_tech/wt_mono_backlight.h" +#endif #include "keyboards/zeal60/zeal60_api.h" // Temporary hack #include "keyboards/zeal60/zeal60_keycodes.h" // Temporary hack @@ -194,11 +196,13 @@ void main_init(void) eeprom_set_valid(true); } +#ifdef WT_MONO_BACKLIGHT // Initialize LED drivers for backlight. backlight_init_drivers(); backlight_timer_init(); backlight_timer_enable(); +#endif } void bootmagic_lite(void) @@ -230,8 +234,10 @@ void matrix_init_kb(void) void matrix_scan_kb(void) { +#ifdef WT_MONO_BACKLIGHT // This only updates the LED driver buffers if something has changed. backlight_update_pwm_buffers(); +#endif matrix_scan_user(); } From e8f730595c37a508ad86cc46fa39c7fae4d36800 Mon Sep 17 00:00:00 2001 From: Fredric Silberberg Date: Tue, 30 Oct 2018 01:09:22 -0700 Subject: [PATCH 676/788] Dactyl_manuform map and updates to my ergodox layout for moving to a different location. --- .../5x6/keymaps/333fred/config.h | 9 + .../5x6/keymaps/333fred/keymap.c | 80 ++++ .../5x6/keymaps/333fred/rules.mk | 7 + layouts/community/ergodox/333fred/keymap.c | 350 ++++++++---------- .../community/ergodox/333fred/visualizer.c | 14 +- users/333fred/333fred.h | 11 +- 6 files changed, 269 insertions(+), 202 deletions(-) create mode 100644 keyboards/handwired/dactyl_manuform/5x6/keymaps/333fred/config.h create mode 100644 keyboards/handwired/dactyl_manuform/5x6/keymaps/333fred/keymap.c create mode 100644 keyboards/handwired/dactyl_manuform/5x6/keymaps/333fred/rules.mk diff --git a/keyboards/handwired/dactyl_manuform/5x6/keymaps/333fred/config.h b/keyboards/handwired/dactyl_manuform/5x6/keymaps/333fred/config.h new file mode 100644 index 000000000..10b969326 --- /dev/null +++ b/keyboards/handwired/dactyl_manuform/5x6/keymaps/333fred/config.h @@ -0,0 +1,9 @@ +#pragma once + +#include "333fred_config.h" + +#define USE_SERIAL +#define EE_HANDS + +#undef TAPPING_TERM +#define TAPPING_TERM 200 diff --git a/keyboards/handwired/dactyl_manuform/5x6/keymaps/333fred/keymap.c b/keyboards/handwired/dactyl_manuform/5x6/keymaps/333fred/keymap.c new file mode 100644 index 000000000..c37009f24 --- /dev/null +++ b/keyboards/handwired/dactyl_manuform/5x6/keymaps/333fred/keymap.c @@ -0,0 +1,80 @@ +#include QMK_KEYBOARD_H +#include "333fred.h" + +enum custom_macros { + DLEFT, + DRIGHT, + PSCREEN_APP +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [BASE] = LAYOUT_5x6( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, + KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + OSM(MOD_LSFT), CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, OSM(MOD_RSFT), + KC_F4, KC_F5, TG(CODEFLOW), KC_EQL, + KC_LALT, KC_BSPC, KC_SPC, OSL(VIM), + KC_TAB, TD(TD_SYM_VIM), KC_ENT, KC_RGUI, + KC_LCTL, KC_DEL, KC_UP, KC_DOWN + ), + + [CODEFLOW] = LAYOUT_5x6( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + KC_F7, KC_F8, _______, _______, + _______, _______, _______, _______, + _______, _______, _______, _______, + _______, _______, _______, _______ + ), + + [SYMB] = LAYOUT_5x6( + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + _______, KC_EXLM, KC_AT, KC_LPRN, KC_RPRN, KC_PIPE, _______, KC_7, KC_8, KC_9, _______, KC_F12, + _______, KC_HASH, KC_DLR, KC_LCBR, KC_RCBR, KC_GRV, _______, KC_4, KC_5, KC_6, _______, _______, + _______, KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_TILD, _______, KC_1, KC_2, KC_3, _______, _______, + KC_F7, KC_F8, KC_0, KC_ENT, + _______, _______, KC_MPLY, KC_MNXT, + _______, _______, KC_MPRV, _______, + _______, _______, KC_VOLU, KC_VOLD + ), + + [VIM] = LAYOUT_5x6( + _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, RESET, _______, + _______, _______, _______, _______, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, + _______, M(DLEFT), M(DRIGHT), KC_LCTL, KC_LGUI, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, + _______, _______, _______, _______, + _______, _______, _______, _______, + _______, _______, _______, _______ + ), +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { + switch(id) { + case DLEFT: + if (record->event.pressed) { // Windows move desktop left + return MACRO(D(LCTL), D(LGUI), T(LEFT), U(LGUI), U(LCTL), END); + } + break; + case DRIGHT: + if (record->event.pressed) { // Windows move desktop right + return MACRO(D(LCTL), D(LGUI), T(RIGHT), U(LGUI), U(LCTL), END); + } + break; + case PSCREEN_APP: if (record->event.pressed) { + return MACRO(D(LALT), T(PSCR), U(LALT), END); + } + break; + } + return MACRO_NONE; +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + tap_dance_process_record(keycode); + return true; +} diff --git a/keyboards/handwired/dactyl_manuform/5x6/keymaps/333fred/rules.mk b/keyboards/handwired/dactyl_manuform/5x6/keymaps/333fred/rules.mk new file mode 100644 index 000000000..79ef33e7c --- /dev/null +++ b/keyboards/handwired/dactyl_manuform/5x6/keymaps/333fred/rules.mk @@ -0,0 +1,7 @@ + +NKRO_ENABLE = yes +KEY_LOCK_ENABLE = yes +TAP_DANCE_ENABLE = yes +CONSOLE_ENABLE = no +PERMISSIVE_HOLD = yes +EXTRAFLAGS += -flto diff --git a/layouts/community/ergodox/333fred/keymap.c b/layouts/community/ergodox/333fred/keymap.c index d7728a5bd..b203f42c6 100644 --- a/layouts/community/ergodox/333fred/keymap.c +++ b/layouts/community/ergodox/333fred/keymap.c @@ -11,28 +11,19 @@ enum custom_keycodes { }; enum custom_macros { - VERSION, - EEPROM, - // Windows macros DLEFT, DRIGHT, PSCREEN_APP, LSFT_TAB, - // VS Macros - REFACTOR, - TEST, - DEBUG_TEST, - FORMAT, - BUILD, - GO_TO_IMPL, - FIND_ALL_REF, - REMOVE_SORT_USINGS, - // KeePass macros KEEPASS_OPEN, KEEPASS_TYPE, + + // Terminal Copy/Paste + TERM_CP, + TERM_PT }; // NOTE: Cells marked with ACCESS must remain transparent, they're the keys that actually get to that layer @@ -41,131 +32,111 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Keymap 0: Basic layer * * ,--------------------------------------------------. ,--------------------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | = | | L1 | 6 | 7 | 8 | 9 | 0 | - | + * | ` | 1 | 2 | 3 | 4 | 5 | F5 | | F6 | 6 | 7 | 8 | 9 | 0 | - | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | TAB | Q | W | E | R | T | L1 | | L2 | Y | U | I | O | P | \ | + * | TAB | Q | W | E | R | T | GAME | |GAMEA | Y | U | I | O | P | \ | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| * | Esc | A | S | D | F | G |------| |------| H | J | K | L | ; | ' | - * |--------+------+------+------+------+------| L2 | |MO(3) |------+------+------+------+------+--------| + * |--------+------+------+------+------+------| SYMB | |MEDIA |------+------+------+------+------+--------| * | LShift |Z/Ctrl| X | C | V | B | | | | N | M | , | . |//Ctrl| RShift | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * |LCTRL | F4 | F5 | LGUI | LALT | | Left | Down | Up | Right| RGUI | + * |LCTRL | F4 | F5 | LGUI | LALT | | Left | Down | = | Right| RGUI | * `----------------------------------' `----------------------------------' * ,-------------. ,-------------. * | Copy | Paste| | Copy | Paste | * ,------|------|------| |------+--------+------. - * | | | PgUp | | PgDn | | | + * | | | PgUp | | Up | | | * | Bcksp|OSL(2)|------| |------| Ent |Space | - * | | VIM | Del | | RCtrl| | | + * | | VIM | Del | | Down | | | * `--------------------' `----------------------' */ -// If it accepts an argument (i.e, is a function), it doesn't need KC_. -// Otherwise, it needs KC_* -[BASE] = LAYOUT_ergodox( // layer 0 : default +[BASE] = LAYOUT_ergodox_pretty( // layer 0 : default // left hand - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_EQL, - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(CODE), - KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, - OSM(MOD_LSFT), CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, TG(SYMB), - OSM(MOD_LCTL), KC_F4, KC_F5, KC_LGUI,KC_LALT, - LCTL(KC_C), LCTL(KC_V), - KC_PGUP, - KC_BSPC,TD(TD_SYM_VIM), KC_DEL, - // right hand - TG(CODE), KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, - TG(SYMB), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, - KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, - MO(MDIA), KC_N, KC_M, KC_COMM,KC_DOT, CTL_T(KC_SLSH), OSM(MOD_RSFT), - KC_LEFT,KC_DOWN,KC_UP, KC_RIGHT, KC_RGUI, - LCTL(KC_C), LCTL(KC_V), - KC_PGDN, - KC_RCTL, KC_ENT, KC_SPC + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_F5, KC_F6, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(GAME), TG(GAME_ARROW), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, + KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + OSM(MOD_LSFT), CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, TG(SYMB), MO(MDIA), KC_N, KC_M, KC_COMM, KC_DOT, CTL_T(KC_SLSH), OSM(MOD_RSFT), + OSM(MOD_LCTL), KC_F4, KC_F5, KC_LGUI, KC_LALT, KC_LEFT, KC_DOWN, KC_EQL, KC_RIGHT, KC_RGUI, + LCTL(KC_C), LCTL(KC_V), LCTL(KC_C), LCTL(KC_V), + KC_PGUP, KC_UP, + KC_BSPC, TD(TD_SYM_VIM), KC_DEL, KC_DOWN, KC_ENT, KC_SPC ), -/* Keymap 1: Code Layer + +/* Keymap 2: Codeflow Layer * * ,--------------------------------------------------. ,--------------------------------------------------. - * | | | | | | | | |ACCESS| | | | | | | + * | | | | | | | | | | | | | | | | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | | | | | | | F10 | | F11 | | | | | | | + * | | | | | | | | | | | | | | | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| * | | | | | | |------| |------| | | | | | | - * |--------+------+------+------+------+------| L2 | | |------+------+------+------+------+--------| + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| * | | | | | | | | | | | | | | | | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | | | | | | | F12 |GoToIm| FAR | | | + * | | | | | | | F7 | F8 | | | | * `----------------------------------' `----------------------------------' * ,-------------. ,---------------. - * |Format|Build | | Copy | Paste | + * | |ACCESS| | | | * ,------|------|------| |------+--------+------. - * | | |Refact| | Up | | | - * | |ACCESS|------| |------| | | - * | | | | | Down | | | + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | * `--------------------' `----------------------' */ // If it accepts an argument (i.e, is a function), it doesn't need KC_. // Otherwise, it needs KC_* -[CODE] = LAYOUT_ergodox( // layer 1 : code +[CODEFLOW] = LAYOUT_ergodox( // layer 1 : code // left hand KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F10, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, TG(SYMB), + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - M(FORMAT),M(BUILD), - M(REFACTOR), - KC_TRNS, KC_TRNS, KC_TRNS, - // right hand + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + // right han - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_F11, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_F12, M(GO_TO_IMPL),M(FIND_ALL_REF),KC_TRNS, KC_TRNS, - LCTL(KC_C), LCTL(KC_V), - KC_UP, - KC_DOWN, KC_TRNS, KC_TRNS + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_F7, KC_F8, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS ), -/* Keymap 2: Symbol Layer +/* Keymap 3: Symbol Layer * * ,---------------------------------------------------. ,--------------------------------------------------. - * |Version | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 | + * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 | * |---------+------+------+------+------+------+------| |------+------+------+------+------+------+--------| - * | | ! | @ | ( | ) | | |ACCESS| |ACCESS| Up | 7 | 8 | 9 | * | F12 | + * | | ! | @ | ( | ) | | | | | | Up | 7 | 8 | 9 | * | F12 | * |---------+------+------+------+------+------| | | |------+------+------+------+------+--------| * | | # | $ | { | } | ` |------| |------| Down | 4 | 5 | 6 | + | | * |---------+------+------+------+------+------|ACCESS| | |------+------+------+------+------+--------| * | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | | * `---------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | EPRM | | | | | | 0 | 0 | . | = | | + * | | | | | | | 0 | 0 | . | = | | * `-----------------------------------' `----------------------------------' * ,-------------. ,-------------. - * | | Caps | | | | + * | | | | | | * ,------|------|------| |------+------+------. * | | |APScr | | | | | * | |ACCESS|------| |------| | | - * | | | PScr | |ACCESS| | | + * | | | PScr | | | | | * `--------------------' `--------------------' */ -// SYMBOLS -[SYMB] = LAYOUT_ergodox( +[SYMB] = LAYOUT_ergodox_pretty( // left hand - VRSN, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, - KC_TRNS,KC_EXLM,KC_AT, KC_LPRN,KC_RPRN,KC_PIPE,KC_TRNS, - KC_TRNS,KC_HASH,KC_DLR, KC_LCBR,KC_RCBR,KC_GRV, - KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS, - EPRM,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, - KC_TRNS,KC_CAPS, - M(PSCREEN_APP), - KC_TRNS,KC_TRNS,KC_PSCR, - // right hand - KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, - KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12, - KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS, - KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS, - KC_0, KC_0, KC_DOT, KC_EQL, KC_TRNS, - KC_TRNS, KC_TRNS, - KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + KC_TRNS, KC_EXLM, KC_AT, KC_LPRN, KC_RPRN, KC_PIPE, KC_TRNS, KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12, + KC_TRNS, KC_HASH, KC_DLR, KC_LCBR, KC_RCBR, KC_GRV, KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS, + KC_TRNS, KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_TILD, KC_TRNS, KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_0, KC_0, KC_DOT, KC_EQL, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + M(PSCREEN_APP), KC_TRNS, + KC_TRNS, KC_TRNS, KC_PSCR, KC_TRNS, KC_TRNS, KC_TRNS ), /* Keymap 3: Media and mouse keys * @@ -188,32 +159,22 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | Back | | | * `--------------------' `--------------------' */ -// MEDIA AND MOUSE -[MDIA] = LAYOUT_ergodox( - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2, - BL_INC, BL_DEC, - BL_TOGG, - KC_TRNS, KC_TRNS, KC_TRNS, - // right hand - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_VOLU, KC_TRNS, - KC_VOLD, - KC_MPRV, KC_MPLY, KC_MNXT +[MDIA] = LAYOUT_ergodox_pretty( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + BL_INC, BL_DEC, KC_VOLU, KC_TRNS, + BL_TOGG, KC_VOLD, + KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MPLY, KC_MNXT ), /* Keymap 4: Movement * * ,--------------------------------------------------. ,--------------------------------------------------. * | | | | | | | | | | | | | | | | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | |KOpen |KType |LSHFT | | | | | | Copy | | | | Paste| | + * | |KOpen |KType |TERMCP|TERMPT| | | | | Copy | | | | Paste| | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| * | |DLeft |DRight|LCTRL | LGUI | |------| |------| Left | Down | Up | Right| | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| @@ -230,26 +191,84 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `--------------------' `--------------------' */ // MEDIA AND MOUSE -[VIM] = LAYOUT_ergodox( - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, M(KEEPASS_OPEN),M(KEEPASS_TYPE),KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, M(DLEFT), M(DRIGHT), KC_LCTL, KC_LGUI, KC_TRNS, - KC_TRNS, M(LSFT_TAB), KC_TAB, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, - KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, - // right hand - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, LCTL(KC_C),KC_TRNS, KC_TRNS, KC_TRNS, LCTL(KC_V),KC_TRNS, - KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT,KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_HOME, KC_END, - KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS - -) +[VIM] = LAYOUT_ergodox_pretty( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, M(KEEPASS_OPEN), M(KEEPASS_TYPE), TERM_CP, TERM_PT, KC_TRNS, KC_TRNS, KC_TRNS, LCTL(KC_C), KC_TRNS, KC_TRNS, KC_TRNS, LCTL(KC_V), KC_TRNS, + KC_TRNS, M(DLEFT), M(DRIGHT), KC_LCTL, KC_LGUI, KC_TRNS, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_TRNS, KC_TRNS, + KC_TRNS, M(LSFT_TAB), KC_TAB, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_HOME, KC_END, + KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS +), +/* Keymap 1: Game Layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | ESC | | | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | | | | |ACCESS| | | | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | CTRL | | | | | |------| |------| | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | SHIFT | Z | | | | | | | | | | | | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * |ENTER | | | LOCK | BSPC | | | | | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,---------------. + * | F5 | F6 | | | | + * ,------|------|------| |------+--------+------. + * | | | | | | | | + * | ALT | SPC |------| |------| | | + * | | | SYMB | | | | | + * `--------------------' `----------------------' + */ +// If it accepts an argument (i.e, is a function), it doesn't need KC_. +// Otherwise, it needs KC_* +[GAME] = LAYOUT_ergodox_pretty( // layer 1 : code + // left hand + KC_ESC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_LCTL, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_LSFT, KC_Z, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_ENT, KC_TRNS, KC_TRNS, KC_LOCK, KC_BSPC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_F5, KC_F6, LCTL(KC_C), LCTL(KC_V), + KC_TRNS, KC_UP, + KC_LALT, KC_SPC, OSM(SYMB), KC_DOWN, KC_TRNS, KC_TRNS + ), +/* Keymap 1: Game Arrow Layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | ESC | | | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | Up | | | | | |ACCESS| | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | CTRL | Left | Down |Right | | |------| |------| | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | SHIFT | Z | | | | | | | | | | | | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * |ENTER | | | LOCK | BSPC | | | | | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,---------------. + * | F5 | F6 | | | | + * ,------|------|------| |------+--------+------. + * | | | | | | | | + * | ALT | SPC |------| |------| | | + * | | | SYMB | | | | | + * `--------------------' `----------------------' + */ +// If it accepts an argument (i.e, is a function), it doesn't need KC_. +// Otherwise, it needs KC_* +[GAME_ARROW] = LAYOUT_ergodox_pretty( // layer 1 : code + // left hand + KC_ESC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_LCTL, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_LSFT, KC_Z, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_ENT, KC_TRNS, KC_TRNS, KC_LOCK, KC_BSPC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_F5, KC_F6, LCTL(KC_C), LCTL(KC_V), + KC_TRNS, KC_UP, + KC_LALT, KC_SPC, OSM(SYMB), KC_DOWN, KC_TRNS, KC_TRNS + ) }; const uint16_t PROGMEM fn_actions[] = { @@ -260,16 +279,6 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { // MACRODOWN only works in this function switch(id) { - case VERSION: - if (record->event.pressed) { - SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); - } - break; - case EEPROM: - if (record->event.pressed) { // For resetting EEPROM - eeconfig_init(); - } - break; case DLEFT: if (record->event.pressed) { // Windows move desktop left return MACRO(D(LCTL), D(LGUI), T(LEFT), U(LGUI), U(LCTL), END); @@ -289,46 +298,6 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) if (record->event.pressed) { return MACRO(D(LSFT), T(TAB), U(LSFT), END); } - case REFACTOR: - if (record->event.pressed) { // VS Refactor CTRL+R, R - return MACRO(D(LCTL), T(R), U(LCTL), T(R), END); - } - break; - case TEST: - if (record->event.pressed) { // VS Run Tests CTRL+R, T - return MACRO(D(LCTL), T(R), U(LCTL), T(T), END); - } - break; - case DEBUG_TEST: - if (record->event.pressed) { // VS Debug Tests CTRL+R, CTRL+T - return MACRO(D(LCTL), T(R), T(T), U(LCTL), END); - } - break; - case FORMAT: - if (record->event.pressed) { // VS Format Document, CTRL+K, CTRL+D - return MACRO(D(LCTL), T(K), T(D), U(LCTL), END); - } - break; - case BUILD: - if (record->event.pressed) { // VS Build. Sends CTRL+SHFT+B - return MACRO(D(LCTL), D(LSFT), T(B), U(LSFT), U(LCTL), END); - } - break; - case GO_TO_IMPL: - if (record->event.pressed) { // VS Go To Implementation. Sends CTRL+F12 - return MACRO(D(LCTL), T(F12), U(LCTL), END); - } - break; - case FIND_ALL_REF: - if (record->event.pressed) { // VS Find All References. Sends CTRL+K, R - return MACRO(D(LCTL), T(K), U(LCTL), T(R), END); - } - break; - case REMOVE_SORT_USINGS: - if (record->event.pressed) { - return MACRO(D(LCTL), T(R), T(G), U(LCTL), END); - } - break; case KEEPASS_OPEN: if (record->event.pressed) { // Keepass open application return MACRO(D(LCTL), D(LALT), T(K), U(LALT), U(LCTL), END); @@ -339,27 +308,22 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) return MACRO(D(LCTL), D(LALT), T(A), U(LALT), U(LCTL), END); } break; + case TERM_CP: + if (record->event.pressed) { // Terminal Copy + return MACRO(D(LCTL), T(INSERT), U(LCTL), END); + } + break; + case TERM_PT: + if (record->event.pressed) { // Terminal Paste + return MACRO(D(LSFT), T(INSERT), U(LSFT), END); + } + break; } return MACRO_NONE; }; bool process_record_user(uint16_t keycode, keyrecord_t *record) { tap_dance_process_record(keycode); - switch (keycode) { - // dynamically generate these. - case EPRM: - if (record->event.pressed) { - eeconfig_init(); - } - return false; - break; - case VRSN: - if (record->event.pressed) { - SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); - } - return false; - break; - } return true; } diff --git a/layouts/community/ergodox/333fred/visualizer.c b/layouts/community/ergodox/333fred/visualizer.c index 2a30562ae..d13b3cd79 100644 --- a/layouts/community/ergodox/333fred/visualizer.c +++ b/layouts/community/ergodox/333fred/visualizer.c @@ -14,16 +14,22 @@ static void get_visualizer_layer_and_color(visualizer_state_t* state) { if (state->status.leds & (1u << USB_LED_CAPS_LOCK)) { saturation = 255; } - if (state->status.layer & 0x10) { + if (state->status.layer & 0x80) { + state->target_lcd_color = LCD_COLOR(0, 255, 60); + state->layer_text = "Game Arrow"; + } else if (state->status.layer & 0x40) { + state->target_lcd_color = LCD_COLOR(0, 255, 60); + state->layer_text = "Game"; + } else if (state->status.layer & 0x20) { state->target_lcd_color = LCD_COLOR(140, 100, 60); state->layer_text = "Movement"; - } else if (state->status.layer & 0x8) { + } else if (state->status.layer & 0x10) { state->target_lcd_color = LCD_COLOR(0, saturation, 0xFF); state->layer_text = "Media"; - } else if (state->status.layer & 0x4) { + } else if (state->status.layer & 0x8) { state->target_lcd_color = LCD_COLOR(168, saturation, 0xFF); state->layer_text = "Symbol"; - } else if (state->status.layer & 0x2) { + } else if (state->status.layer & 0x2 || state->status.layer & 0x4) { state->target_lcd_color = LCD_COLOR(216, 90, 0xFF); state->layer_text = "Code"; } else { diff --git a/users/333fred/333fred.h b/users/333fred/333fred.h index 3b6f21133..443930a6b 100644 --- a/users/333fred/333fred.h +++ b/users/333fred/333fred.h @@ -4,11 +4,12 @@ #define BASE 0 #define CODE 1 // code layer -#define SYMB 2 -#define MDIA 3 // media keys -#define VIM 4 -#define GAME 5 -#define GAME_ARROW 6 +#define CODEFLOW 2 +#define SYMB 3 +#define MDIA 4 // media keys +#define VIM 5 +#define GAME 6 +#define GAME_ARROW 7 // Tap dance config shared between my keyboards enum tap_dance_declarations { From 9e6ee4777995a1ac3dfd7aa4454b0a4ed825d663 Mon Sep 17 00:00:00 2001 From: Fredric Silberberg Date: Thu, 13 Dec 2018 18:05:50 -0800 Subject: [PATCH 677/788] Added noeeprom versions of set hue, sat, val, and step --- docs/feature_rgblight.md | 18 +++++++++ quantum/rgblight.c | 80 ++++++++++++++++++++++++++++++++-------- quantum/rgblight.h | 8 ++++ 3 files changed, 90 insertions(+), 16 deletions(-) diff --git a/docs/feature_rgblight.md b/docs/feature_rgblight.md index 4610467b0..52d5c5fe8 100644 --- a/docs/feature_rgblight.md +++ b/docs/feature_rgblight.md @@ -161,6 +161,24 @@ If you need to change your RGB lighting in code, for example in a macro to chang |`rgblight_sethsv(h, s, v)` |Set all LEDs to the given HSV value where `h` is between 0 and 360 and `s`/`v` are between 0 and 255 | |`rgblight_sethsv_noeeprom(h, s, v)`|Set all LEDs to the given HSV value where `h` is between 0 and 360 and `s`/`v` are between 0 and 255 (not written to EEPROM) | |`rgblight_sethsv_at(h, s, v, led)` |Set a single LED to the given HSV value, where `h` is between 0 and 360, `s`/`v` are between 0 and 255, and `led` is between 0 and `RGBLED_NUM` (not written to EEPROM)| +|`rgblight_toggle()` |Toggle all LEDs between on and off | +|`rgblight_toggle_noeeprom()` |Toggle all LEDs between on and off (not written to EEPROM) | +|`rgblight_step()` |Change the mode to the next RGB animation in the list of enabled RGB animations | +|`rgblight_step_noeeprom()` |Change the mode to the next RGB animation in the list of enabled RGB animations (not written to EEPROM) | +|`rgblight_step_reverse()` |Change the mode to the previous RGB animation in the list of enabled RGB animations | +|`rgblight_step_reverse_noeeprom()` |Change the mode to the previous RGB animation in the list of enabled RGB animations (not written to EEPROM) | +|`rgblight_increase_hue()` |Increase the hue for all LEDs. This wraps around at maximum hue | +|`rgblight_increase_hue_noeeprom()` |Increase the hue for all LEDs. This wraps around at maximum hue (not written to EEPROM) | +|`rgblight_decrease_hue()` |Decrease the hue for all LEDs. This wraps around at minimum hue | +|`rgblight_decrease_hue_noeeprom()` |Decrease the hue for all LEDs. This wraps around at minimum hue (not written to EEPROM) | +|`rgblight_increase_sat()` |Increase the saturation for all LEDs. This wraps around at maximum saturation | +|`rgblight_increase_sat_noeeprom()` |Increase the saturation for all LEDs. This wraps around at maximum saturation (not written to EEPROM) | +|`rgblight_decrease_sat()` |Decrease the saturation for all LEDs. This wraps around at minimum saturation | +|`rgblight_decrease_sat_noeeprom()` |Decrease the saturation for all LEDs. This wraps around at minimum saturation (not written to EEPROM) | +|`rgblight_increase_val()` |Increase the value for all LEDs. This wraps around at maximum value | +|`rgblight_increase_val_noeeprom()` |Increase the value for all LEDs. This wraps around at maximum value (not written to EEPROM) | +|`rgblight_decrease_val()` |Decrease the value for all LEDs. This wraps around at minimum value | +|`rgblight_decrease_val_noeeprom()` |Decrease the value for all LEDs. This wraps around at minimum value (not written to EEPROM) | Additionally, [`rgblight_list.h`](https://github.com/qmk/qmk_firmware/blob/master/quantum/rgblight_list.h) defines several predefined shortcuts for various colors. Feel free to add to this list! diff --git a/quantum/rgblight.c b/quantum/rgblight.c index a2d6fe7a0..ae5dca188 100644 --- a/quantum/rgblight.c +++ b/quantum/rgblight.c @@ -205,21 +205,33 @@ void rgblight_decrease(void) { } rgblight_mode(mode); } -void rgblight_step(void) { +void rgblight_step_helper(bool write_to_eeprom) { uint8_t mode = 0; mode = rgblight_config.mode + 1; if (mode > RGBLIGHT_MODES) { mode = 1; } - rgblight_mode(mode); + rgblight_mode_eeprom_helper(mode, write_to_eeprom); } -void rgblight_step_reverse(void) { +void rgblight_step_noeeprom(void) { + rgblight_step_helper(false); +} +void rgblight_step(void) { + rgblight_step_helper(true); +} +void rgblight_step_reverse_helper(bool write_to_eeprom) { uint8_t mode = 0; mode = rgblight_config.mode - 1; if (mode < 1) { mode = RGBLIGHT_MODES; } - rgblight_mode(mode); + rgblight_mode_eeprom_helper(mode, write_to_eeprom); +} +void rgblight_step_reverse_noeeprom(void) { + rgblight_step_reverse_helper(false); +} +void rgblight_step_reverse(void) { + rgblight_step_reverse_helper(true); } uint32_t rgblight_get_mode(void) { @@ -337,55 +349,91 @@ static uint8_t decrement( uint8_t value, uint8_t step, uint8_t min, uint8_t max return MIN( MAX( new_value, min ), max ); } -void rgblight_increase_hue(void) { +void rgblight_increase_hue_helper(bool write_to_eeprom) { uint16_t hue; hue = (rgblight_config.hue+RGBLIGHT_HUE_STEP) % 360; - rgblight_sethsv(hue, rgblight_config.sat, rgblight_config.val); + rgblight_sethsv_eeprom_helper(hue, rgblight_config.sat, rgblight_config.val, write_to_eeprom); } -void rgblight_decrease_hue(void) { +void rgblight_increase_hue_noeeprom(void) { + rgblight_increase_hue_helper(false); +} +void rgblight_increase_hue(void) { + rgblight_increase_hue_helper(true); +} +void rgblight_decrease_hue_helper(bool write_to_eeprom) { uint16_t hue; if (rgblight_config.hue-RGBLIGHT_HUE_STEP < 0) { hue = (rgblight_config.hue + 360 - RGBLIGHT_HUE_STEP) % 360; } else { hue = (rgblight_config.hue - RGBLIGHT_HUE_STEP) % 360; } - rgblight_sethsv(hue, rgblight_config.sat, rgblight_config.val); + rgblight_sethsv_eeprom_helper(hue, rgblight_config.sat, rgblight_config.val, write_to_eeprom); } -void rgblight_increase_sat(void) { +void rgblight_decrease_hue_noeeprom(void) { + rgblight_decrease_hue_helper(false); +} +void rgblight_decrease_hue(void) { + rgblight_decrease_hue_helper(true); +} +void rgblight_increase_sat_helper(bool write_to_eeprom) { uint8_t sat; if (rgblight_config.sat + RGBLIGHT_SAT_STEP > 255) { sat = 255; } else { sat = rgblight_config.sat + RGBLIGHT_SAT_STEP; } - rgblight_sethsv(rgblight_config.hue, sat, rgblight_config.val); + rgblight_sethsv_eeprom_helper(rgblight_config.hue, sat, rgblight_config.val, write_to_eeprom); } -void rgblight_decrease_sat(void) { +void rgblight_increase_sat_noeeprom(void) { + rgblight_increase_sat_helper(false); +} +void rgblight_increase_sat(void) { + rgblight_increase_sat_helper(true); +} +void rgblight_decrease_sat_helper(bool write_to_eeprom) { uint8_t sat; if (rgblight_config.sat - RGBLIGHT_SAT_STEP < 0) { sat = 0; } else { sat = rgblight_config.sat - RGBLIGHT_SAT_STEP; } - rgblight_sethsv(rgblight_config.hue, sat, rgblight_config.val); + rgblight_sethsv_eeprom_helper(rgblight_config.hue, sat, rgblight_config.val, write_to_eeprom); } -void rgblight_increase_val(void) { +void rgblight_decrease_sat_noeeprom(void) { + rgblight_decrease_sat_helper(false); +} +void rgblight_decrease_sat(void) { + rgblight_decrease_sat_helper(true); +} +void rgblight_increase_val_helper(bool write_to_eeprom) { uint8_t val; if (rgblight_config.val + RGBLIGHT_VAL_STEP > RGBLIGHT_LIMIT_VAL) { val = RGBLIGHT_LIMIT_VAL; } else { val = rgblight_config.val + RGBLIGHT_VAL_STEP; } - rgblight_sethsv(rgblight_config.hue, rgblight_config.sat, val); + rgblight_sethsv_eeprom_helper(rgblight_config.hue, rgblight_config.sat, val, write_to_eeprom); } -void rgblight_decrease_val(void) { +void rgblight_increase_val_noeeprom(void) { + rgblight_increase_val_helper(false); +} +void rgblight_increase_val(void) { + rgblight_increase_val_helper(true); +} +void rgblight_decrease_val_helper(bool write_to_eeprom) { uint8_t val; if (rgblight_config.val - RGBLIGHT_VAL_STEP < 0) { val = 0; } else { val = rgblight_config.val - RGBLIGHT_VAL_STEP; } - rgblight_sethsv(rgblight_config.hue, rgblight_config.sat, val); + rgblight_sethsv_eeprom_helper(rgblight_config.hue, rgblight_config.sat, val, write_to_eeprom); +} +void rgblight_decrease_val_noeeprom(void) { + rgblight_decrease_val_helper(false); +} +void rgblight_decrease_val(void) { + rgblight_decrease_val_helper(true); } void rgblight_increase_speed(void) { rgblight_config.speed = increment( rgblight_config.speed, 1, 0, 3 ); diff --git a/quantum/rgblight.h b/quantum/rgblight.h index 33b279f08..99ede43c5 100644 --- a/quantum/rgblight.h +++ b/quantum/rgblight.h @@ -203,6 +203,14 @@ void rgblight_mode_noeeprom(uint8_t mode); void rgblight_toggle_noeeprom(void); void rgblight_enable_noeeprom(void); void rgblight_disable_noeeprom(void); +void rgblight_step_noeeprom(void); +void rgblight_step_reverse_noeeprom(void); +void rgblight_increase_hue_noeeprom(void); +void rgblight_decrease_hue_noeeprom(void); +void rgblight_increase_sat_noeeprom(void); +void rgblight_decrease_sat_noeeprom(void); +void rgblight_increase_val_noeeprom(void); +void rgblight_decrease_val_noeeprom(void); void rgblight_sethsv_eeprom_helper(uint16_t hue, uint8_t sat, uint8_t val, bool write_to_eeprom); void rgblight_mode_eeprom_helper(uint8_t mode, bool write_to_eeprom); From 89b80b79d50b2193830a961b0ab3ea398ae1d6f1 Mon Sep 17 00:00:00 2001 From: Fredric Silberberg Date: Thu, 13 Dec 2018 11:06:41 -0800 Subject: [PATCH 678/788] Add big switch layout --- keyboards/bigswitch/keymaps/333fred/config.h | 20 +++ keyboards/bigswitch/keymaps/333fred/keymap.c | 123 +++++++++++++++++++ keyboards/bigswitch/keymaps/333fred/rules.mk | 5 + 3 files changed, 148 insertions(+) create mode 100644 keyboards/bigswitch/keymaps/333fred/config.h create mode 100644 keyboards/bigswitch/keymaps/333fred/keymap.c create mode 100644 keyboards/bigswitch/keymaps/333fred/rules.mk diff --git a/keyboards/bigswitch/keymaps/333fred/config.h b/keyboards/bigswitch/keymaps/333fred/config.h new file mode 100644 index 000000000..76f13f08b --- /dev/null +++ b/keyboards/bigswitch/keymaps/333fred/config.h @@ -0,0 +1,20 @@ +/* +Copyright 2018 Fredric Silberberg (333fred) + +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 . +*/ +#pragma once + +// Long tapping term on the big switch, because it takes so long to press +#define TAPPING_TERM 500 diff --git a/keyboards/bigswitch/keymaps/333fred/keymap.c b/keyboards/bigswitch/keymaps/333fred/keymap.c new file mode 100644 index 000000000..791fb435f --- /dev/null +++ b/keyboards/bigswitch/keymaps/333fred/keymap.c @@ -0,0 +1,123 @@ +#include QMK_KEYBOARD_H + +typedef enum { + SINGLE_TAP, SINGLE_HOLD, DOUBLE, TRIPLE, QUAD +} tap_dance_state_enum; + +enum { + TD_KEY = 0 +}; + +static tap_dance_state_enum tap_dance_state; +static bool tap_dance_active = false; +static uint16_t timer; + +void dance_cycle(bool override_timer) { + if (tap_dance_active) + { + if (timer_elapsed(timer) > 100 || override_timer) + { + switch (tap_dance_state) + { + case SINGLE_HOLD: + { + rgblight_increase_hue_noeeprom(); + break; + } + + case DOUBLE: + { + rgblight_step_noeeprom(); + break; + } + + case TRIPLE: + { + rgblight_toggle_noeeprom(); + break; + } + + default: + // Not needed + break; + } + + timer = timer_read(); + } + } +} + +void dance_finished(qk_tap_dance_state_t *state, void* user_data) { + // Determine the current state + switch (state->count) + { + case 1: + { + if (state->interrupted || state->pressed == 0) tap_dance_state = SINGLE_TAP; + else tap_dance_state = SINGLE_HOLD; + break; + } + case 2: + { + tap_dance_state = DOUBLE; + break; + } + case 3: + { + tap_dance_state = TRIPLE; + break; + } + default: + { + tap_dance_state = QUAD; + break; + } + } + + switch (tap_dance_state) + { + case SINGLE_TAP: + { + // VS Build: CTRL+SHIFT+B + SEND_STRING(SS_DOWN(X_LCTRL) SS_DOWN(X_LALT) "b" SS_UP(X_LALT) SS_UP(X_LCTRL)); + tap_dance_active = false; + break; + } + + case SINGLE_HOLD: + case DOUBLE: + case TRIPLE: + { + // These are handled by the matrix_scan, which will register the appropriate rgb + // functions every scan + tap_dance_active = true; + timer = timer_read(); + dance_cycle(true); + break; + } + + case QUAD: + { + // Reprogram + reset_keyboard(); + break; + } + } +} + +void dance_reset(qk_tap_dance_state_t *state, void* user_data) +{ + tap_dance_active = false; +} + +qk_tap_dance_action_t tap_dance_actions[] = { + [TD_KEY] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, dance_finished, dance_reset) +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT(TD(TD_KEY)) +}; + +void matrix_scan_user(void) { + dance_cycle(false); +} diff --git a/keyboards/bigswitch/keymaps/333fred/rules.mk b/keyboards/bigswitch/keymaps/333fred/rules.mk new file mode 100644 index 000000000..20aaadacb --- /dev/null +++ b/keyboards/bigswitch/keymaps/333fred/rules.mk @@ -0,0 +1,5 @@ +# I'm not using things from my userpace in this one +USER_NAME = disable + +RGBLIGHT_ENABLE = yes +TAP_DANCE_ENABLE = yes From 388de9bc076a135ff5f7ff35cc95594898d2e8c3 Mon Sep 17 00:00:00 2001 From: noroadsleft Date: Thu, 13 Dec 2018 22:35:27 -0800 Subject: [PATCH 679/788] Keyboardio Model 01: Configurator support --- keyboards/model01/info.json | 85 ++++++++++++++++++++++++++++++++++++- 1 file changed, 84 insertions(+), 1 deletion(-) diff --git a/keyboards/model01/info.json b/keyboards/model01/info.json index daf51492d..60c914d5c 100644 --- a/keyboards/model01/info.json +++ b/keyboards/model01/info.json @@ -1,4 +1,87 @@ { "keyboard_name": "model01", - "url": "https://keyboard.io" + "keyboard_folder": "model01", + "url": "https://keyboard.io", + "maintainer": "qmk", + "width": 18.5, + "height": 7.5, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"PROG", "x":0, "y":0.4, "h":1.3}, + {"label":"1", "x":1, "y":0.2, "h":1.5}, + {"label":"2", "x":2, "y":0.1, "h":1.1}, + {"label":"3", "x":3, "y":0}, + {"label":"4", "x":4, "y":0.1}, + {"label":"5", "x":5, "y":0.3}, + + {"label":"6", "x":12.5, "y":0.3}, + {"label":"7", "x":13.5, "y":0.1}, + {"label":"8", "x":14.5, "y":0}, + {"label":"9", "x":15.5, "y":0.1, "h":1.1}, + {"label":"0", "x":16.5, "y":0.2, "h":1.5}, + {"label":"NUM", "x":17.5, "y":0.4, "h":1.3}, + + {"label":"GRAVE", "x":0, "y":1.7}, + {"label":"Q", "x":1, "y":1.7}, + {"label":"W", "x":2, "y":1.2}, + {"label":"E", "x":3, "y":1}, + {"label":"R", "x":4, "y":1.1}, + {"label":"T", "x":5, "y":1.3}, + {"label":"LED", "x":6, "y":0.6, "h":1.5}, + + {"label":"ANY", "x":11.5, "y":0.6, "h":1.5}, + {"label":"Y", "x":12.5, "y":1.3}, + {"label":"U", "x":13.5, "y":1.1}, + {"label":"I", "x":14.5, "y":1}, + {"label":"O", "x":15.5, "y":1.2}, + {"label":"P", "x":16.5, "y":1.7}, + {"label":"EQUAL", "x":17.5, "y":1.7}, + + {"label":"PAGEUP", "x":0, "y":2.7}, + {"label":"A", "x":1, "y":2.7}, + {"label":"S", "x":2, "y":2.2}, + {"label":"D", "x":3, "y":2}, + {"label":"F", "x":4, "y":2.1}, + {"label":"G", "x":5, "y":2.3}, + {"label":"TAB", "x":6, "y":2.1, "h":1.3}, + + {"label":"ENTER", "x":11.5, "y":2.1, "h":1.3}, + {"label":"H", "x":12.5, "y":2.3}, + {"label":"J", "x":13.5, "y":2.1}, + {"label":"K", "x":14.5, "y":2}, + {"label":"L", "x":15.5, "y":2.2}, + {"label":"SEMICOLON", "x":16.5, "y":2.7}, + {"label":"QUOTE", "x":17.5, "y":2.7}, + + {"label":"PAGEDOWN", "x":0, "y":3.7, "h":1.2}, + {"label":"Z", "x":1, "y":3.7}, + {"label":"X", "x":2, "y":3.2, "h":1.15}, + {"label":"C", "x":3, "y":3}, + {"label":"V", "x":4, "y":3.1}, + {"label":"B", "x":5, "y":3.3}, + {"label":"ESC", "x":6, "y":3.4, "h":1.1}, + + {"label":"BUTTERFLY", "x":11.5, "y":3.4, "h":1.1}, + {"label":"N", "x":12.5, "y":3.3}, + {"label":"M", "x":13.5, "y":3.1}, + {"label":"COMMA", "x":14.5, "y":3}, + {"label":"DOT", "x":15.5, "y":3.2, "h":1.15}, + {"label":"SLASH", "x":16.5, "y":3.7}, + {"label":"MINS", "x":17.5, "y":3.7, "h":1.2}, + + {"label":"LCTL", "x":4.75, "y":4.3}, + {"label":"RCTL", "x":12.75, "y":4.3}, + {"label":"BACKSPACE", "x":5.75, "y":4.5}, + {"label":"SPACE", "x":11.75, "y":4.5}, + {"label":"LGUI", "x":6.75, "y":4.7}, + {"label":"RALT", "x":10.75, "y":4.7}, + {"label":"LSHIFT", "x":7.75, "y":5.1}, + {"label":"RSHIFT", "x":9.75, "y":5.1}, + + {"label":"FN", "x":6.25, "y":6.1, "h":1.4}, + {"label":"FN", "x":11.25, "y":6.1, "h":1.4} + ] + } + } } From 119b02c54055ba16ed2198b08d7e05443626a830 Mon Sep 17 00:00:00 2001 From: noroadsleft Date: Thu, 13 Dec 2018 23:33:29 -0800 Subject: [PATCH 680/788] AT101 Blackheart: Configurator support --- keyboards/at101_blackheart/info.json | 121 +++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 keyboards/at101_blackheart/info.json diff --git a/keyboards/at101_blackheart/info.json b/keyboards/at101_blackheart/info.json new file mode 100644 index 000000000..4bef46712 --- /dev/null +++ b/keyboards/at101_blackheart/info.json @@ -0,0 +1,121 @@ +{ + "keyboard_name": "AT101 Blackheart PCB", + "keyboard_folder": "at101_blackheart", + "url": "https://deskthority.net/group-buys-f50/programmable-vintage-board-pcbs-omnikey-at101-and-z-150-t19325.html", + "maintainer": "qmk, blindassassin111", + "width": 22.5, + "height": 6.5, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"Esc", "x":0, "y":0}, + {"label":"F1", "x":2, "y":0}, + {"label":"F2", "x":3, "y":0}, + {"label":"F3", "x":4, "y":0}, + {"label":"F4", "x":5, "y":0}, + {"label":"F5", "x":6.5, "y":0}, + {"label":"F6", "x":7.5, "y":0}, + {"label":"F7", "x":8.5, "y":0}, + {"label":"F8", "x":9.5, "y":0}, + {"label":"F9", "x":11, "y":0}, + {"label":"F10", "x":12, "y":0}, + {"label":"F11", "x":13, "y":0}, + {"label":"F12", "x":14, "y":0}, + {"label":"Print Screen", "x":15.25, "y":0}, + {"label":"Scroll Lock", "x":16.25, "y":0}, + {"label":"Pause", "x":17.25, "y":0}, + {"label":"Grave", "x":0, "y":1.5}, + {"label":"1", "x":1, "y":1.5}, + {"label":"2", "x":2, "y":1.5}, + {"label":"3", "x":3, "y":1.5}, + {"label":"4", "x":4, "y":1.5}, + {"label":"5", "x":5, "y":1.5}, + {"label":"6", "x":6, "y":1.5}, + {"label":"7", "x":7, "y":1.5}, + {"label":"8", "x":8, "y":1.5}, + {"label":"9", "x":9, "y":1.5}, + {"label":"0", "x":10, "y":1.5}, + {"label":"-", "x":11, "y":1.5}, + {"label":"=", "x":12, "y":1.5}, + {"label":"Backspace", "x":13, "y":1.5, "w":2}, + {"label":"Insert", "x":15.25, "y":1.5}, + {"label":"Home", "x":16.25, "y":1.5}, + {"label":"Page Up", "x":17.25, "y":1.5}, + {"label":"Num Lock", "x":18.5, "y":1.5}, + {"label":"Keypad /", "x":19.5, "y":1.5}, + {"label":"Keypad *", "x":20.5, "y":1.5}, + {"label":"Keypad -", "x":21.5, "y":1.5}, + {"label":"Tab", "x":0, "y":2.5, "w":1.5}, + {"label":"Q", "x":1.5, "y":2.5}, + {"label":"W", "x":2.5, "y":2.5}, + {"label":"E", "x":3.5, "y":2.5}, + {"label":"R", "x":4.5, "y":2.5}, + {"label":"T", "x":5.5, "y":2.5}, + {"label":"Y", "x":6.5, "y":2.5}, + {"label":"U", "x":7.5, "y":2.5}, + {"label":"I", "x":8.5, "y":2.5}, + {"label":"O", "x":9.5, "y":2.5}, + {"label":"P", "x":10.5, "y":2.5}, + {"label":"LBracket", "x":11.5, "y":2.5}, + {"label":"RBracket]", "x":12.5, "y":2.5}, + {"label":"Backslash", "x":13.5, "y":2.5, "w":1.5}, + {"label":"Delete", "x":15.25, "y":2.5}, + {"label":"End", "x":16.25, "y":2.5}, + {"label":"Page Down", "x":17.25, "y":2.5}, + {"label":"Keypad 7", "x":18.5, "y":2.5}, + {"label":"Keypad 8", "x":19.5, "y":2.5}, + {"label":"Keypad 9", "x":20.5, "y":2.5}, + {"label":"Keypad +", "x":21.5, "y":2.5}, + {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75}, + {"label":"A", "x":1.75, "y":3.5}, + {"label":"S", "x":2.75, "y":3.5}, + {"label":"D", "x":3.75, "y":3.5}, + {"label":"F", "x":4.75, "y":3.5}, + {"label":"G", "x":5.75, "y":3.5}, + {"label":"H", "x":6.75, "y":3.5}, + {"label":"J", "x":7.75, "y":3.5}, + {"label":"K", "x":8.75, "y":3.5}, + {"label":"L", "x":9.75, "y":3.5}, + {"label":"Semicolon", "x":10.75, "y":3.5}, + {"label":"Quote", "x":11.75, "y":3.5}, + {"label":"Enter", "x":12.75, "y":3.5, "w":2.25}, + {"label":"Keypad 4", "x":18.5, "y":3.5}, + {"label":"Keypad 5", "x":19.5, "y":3.5}, + {"label":"Keypad 6", "x":20.5, "y":3.5}, + {"label":"Keypad =", "x":21.5, "y":3.5}, + {"label":"LShift", "x":0, "y":4.5, "w":1.25}, + {"label":"ISO Backslash", "x":1.25, "y":4.5}, + {"label":"Z", "x":2.25, "y":4.5}, + {"label":"X", "x":3.25, "y":4.5}, + {"label":"C", "x":4.25, "y":4.5}, + {"label":"V", "x":5.25, "y":4.5}, + {"label":"B", "x":6.25, "y":4.5}, + {"label":"N", "x":7.25, "y":4.5}, + {"label":"M", "x":8.25, "y":4.5}, + {"label":"Comma", "x":9.25, "y":4.5}, + {"label":"Period", "x":10.25, "y":4.5}, + {"label":"Slash", "x":11.25, "y":4.5}, + {"label":"RShift", "x":12.25, "y":4.5, "w":1.75}, + {"label":"Fn", "x":14, "y":4.5}, + {"label":"Up", "x":16.25, "y":4.5}, + {"label":"Keypad 1", "x":18.5, "y":4.5}, + {"label":"Keypad 2", "x":19.5, "y":4.5}, + {"label":"Keypad 3", "x":20.5, "y":4.5}, + {"label":"Keypad Enter", "x":21.5, "y":4.5, "h":2}, + {"label":"LCtrl", "x":0, "y":5.5, "w":1.25}, + {"label":"LGUI", "x":1.25, "y":5.5, "w":1.25}, + {"label":"LAlt", "x":2.5, "y":5.5, "w":1.25}, + {"label":"Space", "x":3.75, "y":5.5, "w":6.25}, + {"label":"RAlt", "x":10, "y":5.5, "w":1.25}, + {"label":"RGUI", "x":11.25, "y":5.5, "w":1.25}, + {"label":"Menu", "x":12.5, "y":5.5, "w":1.25}, + {"label":"RCtrl", "x":13.75, "y":5.5, "w":1.25}, + {"label":"Left", "x":15.25, "y":5.5}, + {"label":"Down", "x":16.25, "y":5.5}, + {"label":"Right", "x":17.25, "y":5.5}, + {"label":"Keypad 0", "x":18.5, "y":5.5, "w":2}, + {"label":"Keypad .", "x":20.5, "y":5.5} + ] + } + } +} From 48933811c541d9666c645f12bf83421e179cfd4c Mon Sep 17 00:00:00 2001 From: noroadsleft Date: Thu, 13 Dec 2018 23:36:58 -0800 Subject: [PATCH 681/788] AT101 Blackheart: readme update - added image - updated Docs links --- keyboards/at101_blackheart/readme.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/keyboards/at101_blackheart/readme.md b/keyboards/at101_blackheart/readme.md index 7b356bc75..d435d6955 100644 --- a/keyboards/at101_blackheart/readme.md +++ b/keyboards/at101_blackheart/readme.md @@ -1,5 +1,6 @@ -AT101 Blackheart PCB -=== +# AT101 Blackheart PCB + +![AT101 Blackheart PCB](https://deskthority.net/resources/image/48571) A replacement PCB for AT101 keyboards. @@ -11,4 +12,4 @@ Make example for this keyboard (after setting up your build environment): make at101_blackheart:default -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. +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). From e83c62a0023c80554506fd75672bbb287139b833 Mon Sep 17 00:00:00 2001 From: noroadsleft Date: Fri, 14 Dec 2018 00:03:40 -0800 Subject: [PATCH 682/788] Baguette: Configurator update The layout was right, but offset on both axes. --- keyboards/baguette/info.json | 163 ++++++++++++++++++++++++++++++++--- 1 file changed, 150 insertions(+), 13 deletions(-) diff --git a/keyboards/baguette/info.json b/keyboards/baguette/info.json index 777899a60..f3c9b308f 100644 --- a/keyboards/baguette/info.json +++ b/keyboards/baguette/info.json @@ -1,16 +1,153 @@ { - "keyboard_name": "Baguette", - "url": "", - "maintainer": "qmk", - "bootloader": "atmel-dfu", - "width": 19.75, - "height": 6.5, - "layouts": { - "LAYOUT_ansi": { - "layout": [{"label":"~", "x":3.25, "y":1.5}, {"label":"!", "x":4.25, "y":1.5}, {"label":"@", "x":5.25, "y":1.5}, {"label":"#", "x":6.25, "y":1.5}, {"label":"$", "x":7.25, "y":1.5}, {"label":"%", "x":8.25, "y":1.5}, {"label":"^", "x":9.25, "y":1.5}, {"label":"&", "x":10.25, "y":1.5}, {"label":"*", "x":11.25, "y":1.5}, {"label":"(", "x":12.25, "y":1.5}, {"label":")", "x":13.25, "y":1.5}, {"label":"_", "x":14.25, "y":1.5}, {"label":"+", "x":15.25, "y":1.5}, {"label":"|", "x":16.25, "y":1.5}, {"label":"Del", "x":17.25, "y":1.5}, {"label":"Insert", "x":18.75, "y":1.5}, {"label":"Tab", "x":3.25, "y":2.5, "w":1.5}, {"label":"Q", "x":4.75, "y":2.5}, {"label":"W", "x":5.75, "y":2.5}, {"label":"E", "x":6.75, "y":2.5}, {"label":"R", "x":7.75, "y":2.5}, {"label":"T", "x":8.75, "y":2.5}, {"label":"Y", "x":9.75, "y":2.5}, {"label":"U", "x":10.75, "y":2.5}, {"label":"I", "x":11.75, "y":2.5}, {"label":"O", "x":12.75, "y":2.5}, {"label":"P", "x":13.75, "y":2.5}, {"label":"{", "x":14.75, "y":2.5}, {"label":"}", "x":15.75, "y":2.5}, {"label":"|", "x":16.75, "y":2.5, "w":1.5}, {"label":"Delete", "x":18.75, "y":2.5}, {"label":"Control", "x":3.25, "y":3.5, "w":1.75}, {"label":"A", "x":5, "y":3.5}, {"label":"S", "x":6, "y":3.5}, {"label":"D", "x":7, "y":3.5}, {"label":"F", "x":8, "y":3.5}, {"label":"G", "x":9, "y":3.5}, {"label":"H", "x":10, "y":3.5}, {"label":"J", "x":11, "y":3.5}, {"label":"K", "x":12, "y":3.5}, {"label":"L", "x":13, "y":3.5}, {"label":":", "x":14, "y":3.5}, {"label":"\"", "x":15, "y":3.5}, {"label":"Enter", "x":16, "y":3.5, "w":2.25}, {"x":3.25, "y":4.5, "w":1.25}, {"x":4.5, "y":4.5}, {"label":"Z", "x":5.5, "y":4.5}, {"label":"X", "x":6.5, "y":4.5}, {"label":"C", "x":7.5, "y":4.5}, {"label":"V", "x":8.5, "y":4.5}, {"label":"B", "x":9.5, "y":4.5}, {"label":"N", "x":10.5, "y":4.5}, {"label":"M", "x":11.5, "y":4.5}, {"label":"<", "x":12.5, "y":4.5}, {"label":">", "x":13.5, "y":4.5}, {"label":"?", "x":14.5, "y":4.5}, {"x":15.5, "y":4.5}, {"label":"Shift", "x":16.5, "y":4.5, "w":1.25}, {"label":"\u2191", "x":17.75, "y":4.5}, {"label":"Win", "x":4.5, "y":5.5}, {"label":"Alt", "x":5.5, "y":5.5, "w":1.25}, {"x":6.75, "y":5.5, "w":6.25}, {"label":"Ctrl", "x":13, "y":5.5, "w":1.25}, {"label":"Fn", "x":14.25, "y":5.5}, {"label":"\u2190", "x":16.75, "y":5.5}, {"label":"\u2193", "x":17.75, "y":5.5}, {"label":"\u2192", "x":18.75, "y":5.5}] - }, - "LAYOUT_iso": { - "layout": [{"label":"~", "x":3.25, "y":1.5}, {"label":"!", "x":4.25, "y":1.5}, {"label":"@", "x":5.25, "y":1.5}, {"label":"#", "x":6.25, "y":1.5}, {"label":"$", "x":7.25, "y":1.5}, {"label":"%", "x":8.25, "y":1.5}, {"label":"^", "x":9.25, "y":1.5}, {"label":"&", "x":10.25, "y":1.5}, {"label":"*", "x":11.25, "y":1.5}, {"label":"(", "x":12.25, "y":1.5}, {"label":")", "x":13.25, "y":1.5}, {"label":"_", "x":14.25, "y":1.5}, {"label":"+", "x":15.25, "y":1.5}, {"label":"|", "x":16.25, "y":1.5}, {"label":"Del", "x":17.25, "y":1.5}, {"label":"Insert", "x":18.75, "y":1.5}, {"label":"Tab", "x":3.25, "y":2.5, "w":1.5}, {"label":"Q", "x":4.75, "y":2.5}, {"label":"W", "x":5.75, "y":2.5}, {"label":"E", "x":6.75, "y":2.5}, {"label":"R", "x":7.75, "y":2.5}, {"label":"T", "x":8.75, "y":2.5}, {"label":"Y", "x":9.75, "y":2.5}, {"label":"U", "x":10.75, "y":2.5}, {"label":"I", "x":11.75, "y":2.5}, {"label":"O", "x":12.75, "y":2.5}, {"label":"P", "x":13.75, "y":2.5}, {"label":"{", "x":14.75, "y":2.5}, {"label":"}", "x":15.75, "y":2.5}, {"label":"Enter", "x":17, "y":2.5, "w":1.25, "h":2}, {"label":"Delete", "x":18.75, "y":2.5}, {"label":"Control", "x":3.25, "y":3.5, "w":1.75}, {"label":"A", "x":5, "y":3.5}, {"label":"S", "x":6, "y":3.5}, {"label":"D", "x":7, "y":3.5}, {"label":"F", "x":8, "y":3.5}, {"label":"G", "x":9, "y":3.5}, {"label":"H", "x":10, "y":3.5}, {"label":"J", "x":11, "y":3.5}, {"label":"K", "x":12, "y":3.5}, {"label":"L", "x":13, "y":3.5}, {"label":":", "x":14, "y":3.5}, {"label":"\"", "x":15, "y":3.5}, {"x":16, "y":3.5}, {"x":3.25, "y":4.5, "w":1.25}, {"x":4.5, "y":4.5}, {"label":"Z", "x":5.5, "y":4.5}, {"label":"X", "x":6.5, "y":4.5}, {"label":"C", "x":7.5, "y":4.5}, {"label":"V", "x":8.5, "y":4.5}, {"label":"B", "x":9.5, "y":4.5}, {"label":"N", "x":10.5, "y":4.5}, {"label":"M", "x":11.5, "y":4.5}, {"label":"<", "x":12.5, "y":4.5}, {"label":">", "x":13.5, "y":4.5}, {"label":"?", "x":14.5, "y":4.5}, {"x":15.5, "y":4.5}, {"label":"Shift", "x":16.5, "y":4.5, "w":1.25}, {"label":"\u2191", "x":17.75, "y":4.5}, {"label":"Win", "x":4.5, "y":5.5}, {"label":"Alt", "x":5.5, "y":5.5, "w":1.25}, {"x":6.75, "y":5.5, "w":6.25}, {"label":"Ctrl", "x":13, "y":5.5, "w":1.25}, {"label":"Fn", "x":14.25, "y":5.5}, {"label":"\u2190", "x":16.75, "y":5.5}, {"label":"\u2193", "x":17.75, "y":5.5}, {"label":"\u2192", "x":18.75, "y":5.5}] - } + "keyboard_name": "Baguette", + "url": "", + "maintainer": "qmk", + "bootloader": "atmel-dfu", + "width": 16.5, + "height": 5, + "layouts": { + "LAYOUT_ansi": { + "layout": [ + {"label":"`", "x":0, "y":0}, + {"label":"1", "x":1, "y":0}, + {"label":"2", "x":2, "y":0}, + {"label":"3", "x":3, "y":0}, + {"label":"4", "x":4, "y":0}, + {"label":"5", "x":5, "y":0}, + {"label":"6", "x":6, "y":0}, + {"label":"7", "x":7, "y":0}, + {"label":"8", "x":8, "y":0}, + {"label":"9", "x":9, "y":0}, + {"label":"0", "x":10, "y":0}, + {"label":"-", "x":11, "y":0}, + {"label":"=", "x":12, "y":0}, + {"label":"Backspace", "x":13, "y":0}, + {"label":"Backspace2", "x":14, "y":0}, + {"label":"Insert", "x":15.5, "y":0}, + {"label":"Tab", "x":0, "y":1, "w":1.5}, + {"label":"Q", "x":1.5, "y":1}, + {"label":"W", "x":2.5, "y":1}, + {"label":"E", "x":3.5, "y":1}, + {"label":"R", "x":4.5, "y":1}, + {"label":"T", "x":5.5, "y":1}, + {"label":"Y", "x":6.5, "y":1}, + {"label":"U", "x":7.5, "y":1}, + {"label":"I", "x":8.5, "y":1}, + {"label":"O", "x":9.5, "y":1}, + {"label":"P", "x":10.5, "y":1}, + {"label":"[", "x":11.5, "y":1}, + {"label":"]", "x":12.5, "y":1}, + {"label":"\\", "x":13.5, "y":1, "w":1.5}, + {"label":"Delete", "x":15.5, "y":1}, + {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, + {"label":"A", "x":1.75, "y":2}, + {"label":"S", "x":2.75, "y":2}, + {"label":"D", "x":3.75, "y":2}, + {"label":"F", "x":4.75, "y":2}, + {"label":"G", "x":5.75, "y":2}, + {"label":"H", "x":6.75, "y":2}, + {"label":"J", "x":7.75, "y":2}, + {"label":"K", "x":8.75, "y":2}, + {"label":"L", "x":9.75, "y":2}, + {"label":";", "x":10.75, "y":2}, + {"label":"'", "x":11.75, "y":2}, + {"label":"Enter", "x":12.75, "y":2, "w":2.25}, + {"label":"Shift", "x":0, "y":3, "w":1.25}, + {"label":"ISO \\", "x":1.25, "y":3}, + {"label":"Z", "x":2.25, "y":3}, + {"label":"X", "x":3.25, "y":3}, + {"label":"C", "x":4.25, "y":3}, + {"label":"V", "x":5.25, "y":3}, + {"label":"B", "x":6.25, "y":3}, + {"label":"N", "x":7.25, "y":3}, + {"label":"M", "x":8.25, "y":3}, + {"label":",", "x":9.25, "y":3}, + {"label":".", "x":10.25, "y":3}, + {"label":"/", "x":11.25, "y":3}, + {"label":"JP RO", "x":12.25, "y":3}, + {"label":"Shift", "x":13.25, "y":3, "w":1.25}, + {"label":"Up", "x":14.5, "y":3}, + {"label":"GUI", "x":1.25, "y":4}, + {"label":"Alt", "x":2.25, "y":4, "w":1.25}, + {"label":"Space", "x":3.5, "y":4, "w":6.25}, + {"label":"Ctrl", "x":9.75, "y":4, "w":1.25}, + {"label":"Fn", "x":11, "y":4}, + {"label":"Left", "x":13.5, "y":4}, + {"label":"Down", "x":14.5, "y":4}, + {"label":"Right", "x":15.5, "y":4} + ] + }, + + "LAYOUT_iso": { + "layout": [ + {"label":"`", "x":0, "y":0}, + {"label":"1", "x":1, "y":0}, + {"label":"2", "x":2, "y":0}, + {"label":"3", "x":3, "y":0}, + {"label":"4", "x":4, "y":0}, + {"label":"5", "x":5, "y":0}, + {"label":"6", "x":6, "y":0}, + {"label":"7", "x":7, "y":0}, + {"label":"8", "x":8, "y":0}, + {"label":"9", "x":9, "y":0}, + {"label":"0", "x":10, "y":0}, + {"label":"-", "x":11, "y":0}, + {"label":"=", "x":12, "y":0}, + {"label":"Backspace", "x":13, "y":0}, + {"label":"Backspace2", "x":14, "y":0}, + {"label":"Insert", "x":15.5, "y":0}, + {"label":"Tab", "x":0, "y":1, "w":1.5}, + {"label":"Q", "x":1.5, "y":1}, + {"label":"W", "x":2.5, "y":1}, + {"label":"E", "x":3.5, "y":1}, + {"label":"R", "x":4.5, "y":1}, + {"label":"T", "x":5.5, "y":1}, + {"label":"Y", "x":6.5, "y":1}, + {"label":"U", "x":7.5, "y":1}, + {"label":"I", "x":8.5, "y":1}, + {"label":"O", "x":9.5, "y":1}, + {"label":"P", "x":10.5, "y":1}, + {"label":"[", "x":11.5, "y":1}, + {"label":"]", "x":12.5, "y":1}, + {"label":"Delete", "x":15.5, "y":1}, + {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, + {"label":"A", "x":1.75, "y":2}, + {"label":"S", "x":2.75, "y":2}, + {"label":"D", "x":3.75, "y":2}, + {"label":"F", "x":4.75, "y":2}, + {"label":"G", "x":5.75, "y":2}, + {"label":"H", "x":6.75, "y":2}, + {"label":"J", "x":7.75, "y":2}, + {"label":"K", "x":8.75, "y":2}, + {"label":"L", "x":9.75, "y":2}, + {"label":";", "x":10.75, "y":2}, + {"label":"'", "x":11.75, "y":2}, + {"label":"ISO #", "x":12.75, "y":2}, + {"label":"Enter", "x":13.75, "y":2, "w":1.25, "h":2}, + {"label":"Shift", "x":0, "y":3, "w":1.25}, + {"label":"ISO \\", "x":1.25, "y":3}, + {"label":"Z", "x":2.25, "y":3}, + {"label":"X", "x":3.25, "y":3}, + {"label":"C", "x":4.25, "y":3}, + {"label":"V", "x":5.25, "y":3}, + {"label":"B", "x":6.25, "y":3}, + {"label":"N", "x":7.25, "y":3}, + {"label":"M", "x":8.25, "y":3}, + {"label":",", "x":9.25, "y":3}, + {"label":".", "x":10.25, "y":3}, + {"label":"/", "x":11.25, "y":3}, + {"label":"JP_RO", "x":12.25, "y":3}, + {"label":"Shift", "x":13.25, "y":3, "w":1.25}, + {"label":"Up", "x":14.5, "y":3}, + {"label":"GUI", "x":1.25, "y":4}, + {"label":"Alt", "x":2.25, "y":4, "w":1.25}, + {"label":"Space", "x":3.5, "y":4, "w":6.25}, + {"label":"Ctrl", "x":9.75, "y":4, "w":1.25}, + {"label":"Fn", "x":11, "y":4}, + {"label":"Left", "x":13.5, "y":4}, + {"label":"Down", "x":14.5, "y":4}, + {"label":"Right", "x":15.5, "y":4} + ] } + } } From 1ae07f657ad914b863d7ec095eadaeb1d44dbc74 Mon Sep 17 00:00:00 2001 From: Daniel Shields Date: Fri, 14 Dec 2018 15:27:54 +0000 Subject: [PATCH 683/788] Keymap: Disable audio for planck/dshields/rev6 and enable retro tapping. (#4643) --- keyboards/planck/keymaps/dshields/config.h | 1 + keyboards/planck/keymaps/dshields/rules.mk | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/keyboards/planck/keymaps/dshields/config.h b/keyboards/planck/keymaps/dshields/config.h index 63434f60c..7f9cf7467 100644 --- a/keyboards/planck/keymaps/dshields/config.h +++ b/keyboards/planck/keymaps/dshields/config.h @@ -5,6 +5,7 @@ #define USB_MAX_POWER_CONSUMPTION 100 #define ONESHOT_TAP_TOGGLE 2 #define ONESHOT_TIMEOUT 3000 +#define RETRO_TAPPING #define MOUSEKEY_INTERVAL 20 #define MOUSEKEY_DELAY 0 diff --git a/keyboards/planck/keymaps/dshields/rules.mk b/keyboards/planck/keymaps/dshields/rules.mk index 300a82790..a526c5a31 100644 --- a/keyboards/planck/keymaps/dshields/rules.mk +++ b/keyboards/planck/keymaps/dshields/rules.mk @@ -16,7 +16,7 @@ ifeq ($(strip $(KEYBOARD)), planck/rev3) endif ifeq ($(strip $(KEYBOARD)), planck/rev6) EXTRALDFLAGS = -Wl,--build-id=none - AUDIO_ENABLE = yes + AUDIO_ENABLE = no BACKLIGHT_ENABLE = no RGB_MATRIX_ENABLE = no endif From 25892301d426e0c77081aa8d431479df2f52d1f3 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Fri, 14 Dec 2018 07:32:12 -0800 Subject: [PATCH 684/788] Keymap: handwired/108key_trackpoint Configurator support and readme update (#4633) * handwired/108key_trackpoint: Configurator support * handwired/108key_trackpoint: readme update - fix typo in make command - rename file to lowercase --- .../handwired/108key_trackpoint/info.json | 125 ++++++++++++++++++ .../{README.md => readme.md} | 2 +- 2 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 keyboards/handwired/108key_trackpoint/info.json rename keyboards/handwired/108key_trackpoint/{README.md => readme.md} (96%) diff --git a/keyboards/handwired/108key_trackpoint/info.json b/keyboards/handwired/108key_trackpoint/info.json new file mode 100644 index 000000000..bd221892b --- /dev/null +++ b/keyboards/handwired/108key_trackpoint/info.json @@ -0,0 +1,125 @@ +{ + "keyboard_name": "108 Key with TrackPoint", + "url": "", + "maintainer": "mkem114", + "width": 22.5, + "height": 7.5, + "layouts": { + "LAYOUT": { + "key_count": 111, + "layout": [ + {"label":"Esc", "x":0, "y":0}, + {"label":"F1", "x":2, "y":0}, + {"label":"F2", "x":3, "y":0}, + {"label":"F3", "x":4, "y":0}, + {"label":"F4", "x":5, "y":0}, + {"label":"F5", "x":6.5, "y":0}, + {"label":"F6", "x":7.5, "y":0}, + {"label":"F7", "x":8.5, "y":0}, + {"label":"F8", "x":9.5, "y":0}, + {"label":"F9", "x":11, "y":0}, + {"label":"F10", "x":12, "y":0}, + {"label":"F11", "x":13, "y":0}, + {"label":"F12", "x":14, "y":0}, + {"label":"Print Screen", "x":15.25, "y":0}, + {"label":"Scroll Lock", "x":16.25, "y":0}, + {"label":"Pause", "x":17.25, "y":0}, + {"label":"Mute", "x":18.5, "y":0}, + {"label":"Previous", "x":19.5, "y":0}, + {"label":"Next", "x":20.5, "y":0}, + {"label":"Play", "x":21.5, "y":0}, + {"label":"`", "x":0, "y":1.5}, + {"label":"1", "x":1, "y":1.5}, + {"label":"2", "x":2, "y":1.5}, + {"label":"3", "x":3, "y":1.5}, + {"label":"4", "x":4, "y":1.5}, + {"label":"5", "x":5, "y":1.5}, + {"label":"6", "x":6, "y":1.5}, + {"label":"7", "x":7, "y":1.5}, + {"label":"8", "x":8, "y":1.5}, + {"label":"9", "x":9, "y":1.5}, + {"label":"0", "x":10, "y":1.5}, + {"label":"-", "x":11, "y":1.5}, + {"label":"=", "x":12, "y":1.5}, + {"label":"Backspace", "x":13, "y":1.5, "w":2}, + {"label":"Insert", "x":15.25, "y":1.5}, + {"label":"Home", "x":16.25, "y":1.5}, + {"label":"Page Up", "x":17.25, "y":1.5}, + {"label":"Num Lock", "x":18.5, "y":1.5}, + {"label":"/", "x":19.5, "y":1.5}, + {"label":"*", "x":20.5, "y":1.5}, + {"label":"-", "x":21.5, "y":1.5}, + {"label":"Tab", "x":0, "y":2.5, "w":1.5}, + {"label":"Q", "x":1.5, "y":2.5}, + {"label":"W", "x":2.5, "y":2.5}, + {"label":"E", "x":3.5, "y":2.5}, + {"label":"R", "x":4.5, "y":2.5}, + {"label":"T", "x":5.5, "y":2.5}, + {"label":"Y", "x":6.5, "y":2.5}, + {"label":"U", "x":7.5, "y":2.5}, + {"label":"I", "x":8.5, "y":2.5}, + {"label":"O", "x":9.5, "y":2.5}, + {"label":"P", "x":10.5, "y":2.5}, + {"label":"[", "x":11.5, "y":2.5}, + {"label":"]", "x":12.5, "y":2.5}, + {"label":"\\", "x":13.5, "y":2.5, "w":1.5}, + {"label":"Delete", "x":15.25, "y":2.5}, + {"label":"End", "x":16.25, "y":2.5}, + {"label":"Page Down", "x":17.25, "y":2.5}, + {"label":"7", "x":18.5, "y":2.5}, + {"label":"8", "x":19.5, "y":2.5}, + {"label":"9", "x":20.5, "y":2.5}, + {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75}, + {"label":"A", "x":1.75, "y":3.5}, + {"label":"S", "x":2.75, "y":3.5}, + {"label":"D", "x":3.75, "y":3.5}, + {"label":"F", "x":4.75, "y":3.5}, + {"label":"G", "x":5.75, "y":3.5}, + {"label":"H", "x":6.75, "y":3.5}, + {"label":"J", "x":7.75, "y":3.5}, + {"label":"K", "x":8.75, "y":3.5}, + {"label":"L", "x":9.75, "y":3.5}, + {"label":";", "x":10.75, "y":3.5}, + {"label":"'", "x":11.75, "y":3.5}, + {"label":"Enter", "x":12.75, "y":3.5, "w":2.25}, + {"label":"4", "x":18.5, "y":3.5}, + {"label":"5", "x":19.5, "y":3.5}, + {"label":"6", "x":20.5, "y":3.5}, + {"label":"+", "x":21.5, "y":2.5, "h":2}, + {"label":"Shift", "x":0, "y":4.5, "w":2.25}, + {"label":"Z", "x":2.25, "y":4.5}, + {"label":"X", "x":3.25, "y":4.5}, + {"label":"C", "x":4.25, "y":4.5}, + {"label":"V", "x":5.25, "y":4.5}, + {"label":"B", "x":6.25, "y":4.5}, + {"label":"N", "x":7.25, "y":4.5}, + {"label":"M", "x":8.25, "y":4.5}, + {"label":",", "x":9.25, "y":4.5}, + {"label":".", "x":10.25, "y":4.5}, + {"label":"/", "x":11.25, "y":4.5}, + {"label":"Shift", "x":12.25, "y":4.5, "w":2.75}, + {"label":"Up", "x":16.25, "y":4.5}, + {"label":"1", "x":18.5, "y":4.5}, + {"label":"2", "x":19.5, "y":4.5}, + {"label":"3", "x":20.5, "y":4.5}, + {"label":"Ctrl", "x":0, "y":5.5, "w":1.25}, + {"label":"LGUI", "x":1.25, "y":5.5, "w":1.25}, + {"label":"Alt", "x":2.5, "y":5.5, "w":1.25}, + {"label":"Space", "x":3.75, "y":5.5, "w":6.25}, + {"label":"Alt", "x":10, "y":5.5, "w":1.25}, + {"label":"RGUI", "x":11.25, "y":5.5, "w":1.25}, + {"label":"Menu", "x":12.5, "y":5.5, "w":1.25}, + {"label":"Ctrl", "x":13.75, "y":5.5, "w":1.25}, + {"label":"Left", "x":15.25, "y":5.5}, + {"label":"Down", "x":16.25, "y":5.5}, + {"label":"Right", "x":17.25, "y":5.5}, + {"label":"0", "x":18.5, "y":5.5, "w":2}, + {"label":".", "x":20.5, "y":5.5}, + {"label":"Enter", "x":21.5, "y":4.5, "h":2}, + {"label":"Mouse1", "x":5.25, "y":6.5}, + {"label":"Mouse3", "x":6.25, "y":6.5}, + {"label":"Mouse2", "x":7.25, "y":6.5} + ] + } + } +} diff --git a/keyboards/handwired/108key_trackpoint/README.md b/keyboards/handwired/108key_trackpoint/readme.md similarity index 96% rename from keyboards/handwired/108key_trackpoint/README.md rename to keyboards/handwired/108key_trackpoint/readme.md index 247043e17..468fdf94d 100644 --- a/keyboards/handwired/108key_trackpoint/README.md +++ b/keyboards/handwired/108key_trackpoint/readme.md @@ -9,7 +9,7 @@ Hardware Supported (tested): Teensy++ 2.0 Make example for this keyboard (after setting up your build environment): - make handwired/108keyTrackpoint:default + make handwired/108key_trackpoint:default 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). From 60f9abca1245640e12d65aa60f5953ff1719408f Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Fri, 14 Dec 2018 07:33:00 -0800 Subject: [PATCH 685/788] handwired/CMD60 Refactor, Configurator support and readme update (#4632) * handwired/CMD60: refactor - renamed layout macro KEYMAP to LAYOUT - removed K2C, K3B and K3C locations (indications are these locations were unused in hardware) - keymap - now uses #include QMK_KEYBOARD_H - converted keycodes to short format - deleted TMK fn_actions and action_get_macro blocks - white space changes (readability/alignment) * handwired/CMD60: Configurator support * handwired/CMD60: readme update - updated to conform to current QMK template - added image and build gallery links * handwired/cmd60: rename all files and folders to lowercase --- keyboards/handwired/CMD60/README.md | 35 --------- .../handwired/CMD60/keymaps/default/keymap.c | 66 ----------------- .../{CMD60/CMD60.c => cmd60/cmd60.c} | 2 +- .../{CMD60/CMD60.h => cmd60/cmd60.h} | 18 ++--- keyboards/handwired/{CMD60 => cmd60}/config.h | 0 keyboards/handwired/cmd60/info.json | 74 +++++++++++++++++++ .../handwired/cmd60/keymaps/default/keymap.c | 46 ++++++++++++ keyboards/handwired/cmd60/readme.md | 19 +++++ keyboards/handwired/{CMD60 => cmd60}/rules.mk | 0 9 files changed, 149 insertions(+), 111 deletions(-) delete mode 100644 keyboards/handwired/CMD60/README.md delete mode 100644 keyboards/handwired/CMD60/keymaps/default/keymap.c rename keyboards/handwired/{CMD60/CMD60.c => cmd60/cmd60.c} (87%) rename keyboards/handwired/{CMD60/CMD60.h => cmd60/cmd60.h} (66%) rename keyboards/handwired/{CMD60 => cmd60}/config.h (100%) create mode 100644 keyboards/handwired/cmd60/info.json create mode 100644 keyboards/handwired/cmd60/keymaps/default/keymap.c create mode 100644 keyboards/handwired/cmd60/readme.md rename keyboards/handwired/{CMD60 => cmd60}/rules.mk (100%) diff --git a/keyboards/handwired/CMD60/README.md b/keyboards/handwired/CMD60/README.md deleted file mode 100644 index 8b0dd109f..000000000 --- a/keyboards/handwired/CMD60/README.md +++ /dev/null @@ -1,35 +0,0 @@ -CMD60 keyboard firmware -====================== - -##CMD60 - -This layout has been designed to optimize use of the left-hand, and it focussed specifically on programmers who work -with text editors like SublimeText and Atom. It utilizes the power of Space_fn, and features a caps lock swap for Fn2 -and enter key on tap. These features allow you to keep your right hand on the mouse more and should enable you to -achieve a higher level of productivity if you take the time to learn its function layers. - -## Quantum MK Firmware - -For the full Quantum feature list, see [the parent readme.md](/docs/README.md). - -## Building - -Download or clone the whole firmware and navigate to the keyboards/handwired/CMD60 folder. -Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use -the Teensy Loader to program your .hex file. - -Depending on which keymap you would like to use, you will have to compile slightly differently. - -### Default - -To build with the default keymap, simply run `make`. - -### Other Keymaps - -To build the firmware binary hex file with a keymap just do `make` with `keymap` option like: - -``` -$ make keymap=[default|jack|] -``` - -Keymaps follow the format **__keymap.c__** and are stored in folders in the `keymaps` folder, eg `keymaps/my_keymap/` diff --git a/keyboards/handwired/CMD60/keymaps/default/keymap.c b/keyboards/handwired/CMD60/keymaps/default/keymap.c deleted file mode 100644 index 9f9cbcd66..000000000 --- a/keyboards/handwired/CMD60/keymaps/default/keymap.c +++ /dev/null @@ -1,66 +0,0 @@ -#include "CMD60.h" - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = KEYMAP( /* CMD60 - QWERTY */ - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \ - LT(3, KC_ENT), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NO, KC_ENT, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_NO, KC_NO, KC_RSFT, \ - KC_LCTL, KC_LGUI, KC_LALT, LT(2, KC_SPC), MO(3), MO(4), MO(5), TG(1) \ - ), - [1] = KEYMAP( /* CMD60 - GameMode */ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, \ - KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_RSFT, \ - KC_TRNS, KC_NO, KC_TRNS, KC_SPC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ - ), - [2] = KEYMAP( /* CMD60 - Arrows */ - KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, \ - KC_TRNS, KC_BSPC, KC_UP, KC_DEL, KC_TRNS, KC_TRNS, KC_TRNS, KC_BSPC, KC_UP, KC_DEL, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, \ - KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_SPC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ - ), - [3] = KEYMAP( /* CMD60 - Functions */ - KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, \ - KC_AUDIO_MUTE, KC_BSPC, KC_PGUP, KC_DEL, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_UP, KC_PGDN, KC_TRNS, KC_PAUSE, KC_SLCK, KC_PSCREEN, \ - KC_TRNS, KC_HOME, KC_PGDN, KC_END, KC_TRNS, KC_TRNS, KC_HOME, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_INSERT, KC_NO, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ - ), - [4] = KEYMAP( /* CMD60 - Mouse */ - KC_SYSTEM_SLEEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_BTN1, KC_MS_UP, KC_MS_BTN2, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_TRNS, KC_NO, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_WH_UP, KC_MS_BTN3, KC_MS_WH_DOWN, KC_NO, KC_NO, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ - ), - [5] = KEYMAP( /* CMD60 - Media */ - KC_SYSTEM_WAKE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_AUDIO_VOL_DOWN, KC_AUDIO_VOL_UP, KC_AUDIO_MUTE, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MEDIA_PREV_TRACK, KC_MEDIA_NEXT_TRACK, KC_MEDIA_PLAY_PAUSE, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_WWW_BACK, KC_WWW_FORWARD, KC_NO, KC_NO, KC_WWW_REFRESH, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ - ), -}; - -const uint16_t PROGMEM fn_actions[] = { - -}; - - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - // MACRODOWN only works in this function - switch(id) { - case 0: - if (record->event.pressed) { - register_code(KC_RSFT); - } else { - unregister_code(KC_RSFT); - } - break; - } - return MACRO_NONE; -}; diff --git a/keyboards/handwired/CMD60/CMD60.c b/keyboards/handwired/cmd60/cmd60.c similarity index 87% rename from keyboards/handwired/CMD60/CMD60.c rename to keyboards/handwired/cmd60/cmd60.c index 799848e34..91bbbd453 100644 --- a/keyboards/handwired/CMD60/CMD60.c +++ b/keyboards/handwired/cmd60/cmd60.c @@ -1,4 +1,4 @@ -#include "CMD60.h" +#include "cmd60.h" void matrix_init_kb(void) { // put your keyboard start-up code here diff --git a/keyboards/handwired/CMD60/CMD60.h b/keyboards/handwired/cmd60/cmd60.h similarity index 66% rename from keyboards/handwired/CMD60/CMD60.h rename to keyboards/handwired/cmd60/cmd60.h index f90871fc7..2e0baa999 100644 --- a/keyboards/handwired/CMD60/CMD60.h +++ b/keyboards/handwired/cmd60/cmd60.h @@ -3,18 +3,18 @@ #include "quantum.h" -#define KEYMAP( \ +#define LAYOUT( \ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \ - K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, \ - K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3D, \ K40, K41, K42, K45, K4A, K4B, K4C, K4D \ ) { \ - { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \ - { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \ - { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D }, \ - { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D }, \ - { K40, K41, K42, KC_NO, KC_NO, K45, KC_NO, KC_NO, KC_NO, KC_NO,K4A, K4B, K4C, K4D } \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, KC_NO, K2D }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, KC_NO, KC_NO, K3D }, \ + { K40, K41, K42, KC_NO, KC_NO, K45, KC_NO, KC_NO, KC_NO, KC_NO, K4A, K4B, K4C, K4D } \ } -#endif \ No newline at end of file +#endif diff --git a/keyboards/handwired/CMD60/config.h b/keyboards/handwired/cmd60/config.h similarity index 100% rename from keyboards/handwired/CMD60/config.h rename to keyboards/handwired/cmd60/config.h diff --git a/keyboards/handwired/cmd60/info.json b/keyboards/handwired/cmd60/info.json new file mode 100644 index 000000000..8d555dc07 --- /dev/null +++ b/keyboards/handwired/cmd60/info.json @@ -0,0 +1,74 @@ +{ + "keyboard_name": "CMD60", + "url": "", + "maintainer": "qmk", + "width": 15, + "height": 5, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"`", "x":0, "y":0}, + {"label":"1", "x":1, "y":0}, + {"label":"2", "x":2, "y":0}, + {"label":"3", "x":3, "y":0}, + {"label":"4", "x":4, "y":0}, + {"label":"5", "x":5, "y":0}, + {"label":"6", "x":6, "y":0}, + {"label":"7", "x":7, "y":0}, + {"label":"8", "x":8, "y":0}, + {"label":"9", "x":9, "y":0}, + {"label":"0", "x":10, "y":0}, + {"label":"-", "x":11, "y":0}, + {"label":"=", "x":12, "y":0}, + {"label":"Backspace", "x":13, "y":0, "w":2}, + {"label":"Tab", "x":0, "y":1, "w":1.5}, + {"label":"Q", "x":1.5, "y":1}, + {"label":"W", "x":2.5, "y":1}, + {"label":"E", "x":3.5, "y":1}, + {"label":"R", "x":4.5, "y":1}, + {"label":"T", "x":5.5, "y":1}, + {"label":"Y", "x":6.5, "y":1}, + {"label":"U", "x":7.5, "y":1}, + {"label":"I", "x":8.5, "y":1}, + {"label":"O", "x":9.5, "y":1}, + {"label":"P", "x":10.5, "y":1}, + {"label":"[", "x":11.5, "y":1}, + {"label":"]", "x":12.5, "y":1}, + {"label":"\\", "x":13.5, "y":1, "w":1.5}, + {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, + {"label":"A", "x":1.75, "y":2}, + {"label":"S", "x":2.75, "y":2}, + {"label":"D", "x":3.75, "y":2}, + {"label":"F", "x":4.75, "y":2}, + {"label":"G", "x":5.75, "y":2}, + {"label":"H", "x":6.75, "y":2}, + {"label":"J", "x":7.75, "y":2}, + {"label":"K", "x":8.75, "y":2}, + {"label":"L", "x":9.75, "y":2}, + {"label":";", "x":10.75, "y":2}, + {"label":"'", "x":11.75, "y":2}, + {"label":"Enter", "x":12.75, "y":2, "w":2.25}, + {"label":"Shift", "x":0, "y":3, "w":2.25}, + {"label":"Z", "x":2.25, "y":3}, + {"label":"X", "x":3.25, "y":3}, + {"label":"C", "x":4.25, "y":3}, + {"label":"V", "x":5.25, "y":3}, + {"label":"B", "x":6.25, "y":3}, + {"label":"N", "x":7.25, "y":3}, + {"label":"M", "x":8.25, "y":3}, + {"label":",", "x":9.25, "y":3}, + {"label":".", "x":10.25, "y":3}, + {"label":"/", "x":11.25, "y":3}, + {"label":"Shift", "x":12.25, "y":3, "w":2.75}, + {"label":"Ctrl", "x":0, "y":4, "w":1.25}, + {"label":"GUI", "x":1.25, "y":4, "w":1.25}, + {"label":"Alt", "x":2.5, "y":4, "w":1.25}, + {"label":"Space", "x":3.75, "y":4, "w":6.25}, + {"label":"Alt", "x":10, "y":4, "w":1.25}, + {"label":"GUI", "x":11.25, "y":4, "w":1.25}, + {"label":"Menu", "x":12.5, "y":4, "w":1.25}, + {"label":"Ctrl", "x":13.75, "y":4, "w":1.25} + ] + } + } +} diff --git a/keyboards/handwired/cmd60/keymaps/default/keymap.c b/keyboards/handwired/cmd60/keymaps/default/keymap.c new file mode 100644 index 000000000..448d81dc1 --- /dev/null +++ b/keyboards/handwired/cmd60/keymaps/default/keymap.c @@ -0,0 +1,46 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( /* CMD60 - QWERTY */ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \ + LT(3, KC_ENT), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \ + KC_LCTL, KC_LGUI, KC_LALT, LT(2, KC_SPC), MO(3), MO(4), MO(5), TG(1) \ + ), + [1] = LAYOUT( /* CMD60 - GameMode */ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + KC_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_RSFT, \ + _______, XXXXXXX, _______, KC_SPC, _______, _______, _______, _______ \ + ), + [2] = LAYOUT( /* CMD60 - Arrows */ + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, \ + _______, KC_BSPC, KC_UP, KC_DEL, _______, _______, _______, KC_BSPC, KC_UP, KC_DEL, KC_PSCR, KC_SLCK, KC_PAUS, _______, \ + _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, \ + _______, _______, _______, _______, KC_SPC, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______ \ + ), + [3] = LAYOUT( /* CMD60 - Functions */ + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, \ + KC_MUTE, KC_BSPC, KC_PGUP, KC_DEL, _______, _______, _______, KC_PGUP, KC_UP, KC_PGDN, _______, KC_PAUS, KC_SLCK, KC_PSCR, \ + _______, KC_HOME, KC_PGDN, KC_END, _______, _______, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, _______, KC_INS, _______, \ + _______, _______, _______, _______, _______, _______, KC_END, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______ \ + ), + [4] = LAYOUT( /* CMD60 - Mouse */ + KC_SLEP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_BTN1, KC_MS_U, KC_BTN2, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_WH_U, KC_BTN3, KC_WH_D, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______ \ + ), + [5] = LAYOUT( /* CMD60 - Media */ + KC_WAKE, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLD, KC_VOLU, KC_MUTE, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_MNXT, KC_MPLY, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_WBAK, KC_WFWD, KC_WREF, \ + _______, _______, _______, _______, _______, _______, _______, _______ \ + ), +}; diff --git a/keyboards/handwired/cmd60/readme.md b/keyboards/handwired/cmd60/readme.md new file mode 100644 index 000000000..933ac16d5 --- /dev/null +++ b/keyboards/handwired/cmd60/readme.md @@ -0,0 +1,19 @@ +# CMD60 + +![CMD60](https://i.imgur.com/r9LA6Lx.jpg) + +This layout has been designed to optimize use of the left-hand, and it focussed specifically on programmers who work +with text editors like SublimeText and Atom. It utilizes the power of Space_fn, and features a caps lock swap for Fn2 +and enter key on tap. These features allow you to keep your right hand on the mouse more and should enable you to +achieve a higher level of productivity if you take the time to learn its function layers. + +[Build Log](https://redd.it/4mkuu8) + +Keyboard Maintainer: [The QMK Community](https://github.com/qmk) +Hardware Supported: CMD60 handwired, Teensy 2.0 + +Make example for this keyboard (after setting up your build environment): + + make handwired/cmd60:default + +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). diff --git a/keyboards/handwired/CMD60/rules.mk b/keyboards/handwired/cmd60/rules.mk similarity index 100% rename from keyboards/handwired/CMD60/rules.mk rename to keyboards/handwired/cmd60/rules.mk From 641bbeb41af87feb01882e9f8a252312d2665a6a Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 14 Dec 2018 07:36:38 -0800 Subject: [PATCH 686/788] Remove userspace info from Quad-Function Tap Dance example (#4631) --- docs/feature_tap_dance.md | 36 +++++++----------------------------- 1 file changed, 7 insertions(+), 29 deletions(-) diff --git a/docs/feature_tap_dance.md b/docs/feature_tap_dance.md index b2b567f1d..f2f274944 100644 --- a/docs/feature_tap_dance.md +++ b/docs/feature_tap_dance.md @@ -185,29 +185,11 @@ Below is a specific example: ## Setup -You will need a few things that can be used for 'Quad Function Tap-Dance'. The suggested setup is to create a user directory for yourself. This directory will contain rules.mk `.c` and `.h`. This directory should be called ``, and located in the top level `users` directory. There should already be a few examples to look at there. +You will need a few things that can be used for 'Quad Function Tap-Dance'. -### In `/qmk_firmware/users//rules.mk` - -Put the following: -```c -TAP_DANCE_ENABLE = yes -SRC += your_name.c -``` - -Pretty simple. It is a nice way to keep some rules common on all your keymaps. - - -### In `/qmk_firmware/users//.h` - -You will need a few things in this file: +You'll need to add these to the top of your `keymap.c` file, before your keymap. ```c -#pragma once - -#include "quantum.h" -#include "process_keycode/process_tap_dance.h" - typedef struct { bool is_press_action; int state; @@ -234,18 +216,12 @@ int cur_dance (qk_tap_dance_state_t *state); //for the x tap dance. Put it here so it can be used in any keymap void x_finished (qk_tap_dance_state_t *state, void *user_data); void x_reset (qk_tap_dance_state_t *state, void *user_data); + ``` -### In `/qmk_firmware/users//.c` - -And then in your user's `.c` file you implement the functions above: +Now, at the bottom of your `keymap.c` file, you'll need to add the following: ```c -#include ".h" -#include "quantum.h" -#include "action.h" -#include "process_keycode/process_tap_dance.h" - /* Return an integer that corresponds to what kind of tap dance should be executed. * * How to figure out tap dance state: interrupted and pressed. @@ -335,4 +311,6 @@ qk_tap_dance_action_t tap_dance_actions[] = { }; ``` -And then simply use `TD(X_CTL)` anywhere in your keymap after including `.h`. +And then simply use `TD(X_CTL)` anywhere in your keymap. + +If you want to implement this in your userspace, then you may want to check out how [DanielGGordon](https://github.com/qmk/qmk_firmware/tree/master/users/gordon) has implemented this in their userspace. From 6c6bbff600cd37416bdf067ac67971c58136129f Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 14 Dec 2018 07:37:27 -0800 Subject: [PATCH 687/788] Enhance documentation for Tap-Hold functions (#4628) --- docs/feature_advanced_keycodes.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/docs/feature_advanced_keycodes.md b/docs/feature_advanced_keycodes.md index e5f241f7f..bda497233 100644 --- a/docs/feature_advanced_keycodes.md +++ b/docs/feature_advanced_keycodes.md @@ -161,8 +161,13 @@ For one shot mods, you need to call `set_oneshot_mods(MOD)` to set it, or `clear !> If you're having issues with OSM translating over Remote Desktop Connection, this can be fixed by opening the settings, going to the "Local Resources" tap, and in the keyboard section, change the drop down to "On this Computer". This will fix the issue and allow OSM to function properly over Remote Desktop. +# Tap-Hold Configuration Options -# Permissive Hold +While Tap-Hold options are fantastic, they are not without their issues. We have tried to configure them with reasonal defaults, but that may still cause issues for some people. + +These options let you modify the behavior of the Tap-Hold keys. + +## Permissive Hold As of [PR#1359](https://github.com/qmk/qmk_firmware/pull/1359/), there is a new `config.h` option: @@ -185,7 +190,7 @@ Normally, if you do all this within the `TAPPING_TERM` (default: 200ms) this wil ?> If you have `Ignore Mod Tap Interrupt` enabled, as well, this will modify how both work. The regular key has the modifier added if the first key is released first or if both keys are held longer than the `TAPPING_TERM`. -# Ignore Mod Tap Interrupt +## Ignore Mod Tap Interrupt To enable this setting, add this to your `config.h`: @@ -211,7 +216,7 @@ Normally, this would send `X` (`SHIFT`+`x`). With `Ignore Mod Tap Interrupt` ena ?> If you have `Permissive Hold` enabled, as well, this will modify how both work. The regular key has the modifier added if the first key is released first or if both keys are held longer than the `TAPPING_TERM`. -# Tapping Force Hold +## Tapping Force Hold To enable `tapping force hold`, add the following to your `config.h`: @@ -235,7 +240,7 @@ With `TAPPING_FORCE_HOLD`, the second press will be interpreted as a Shift, allo !> `TAPPING_FORCE_HOLD` will break anything that uses tapping toggles (Such as the `TT` layer keycode, and the One Shot Tapping Toggle). -# Retro Tapping +## Retro Tapping To enable `retro tapping`, add the following to your `config.h`: From 8c3054777a9d86613fd9d73cca1fdfaee54a6eff Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 14 Dec 2018 07:51:17 -0800 Subject: [PATCH 688/788] Docs: Remove duplicate layer block in keycodes.md (#4621) * Docs: Remove duplicate layer block in keycodes.md Reorder and add OSL * remove glitch Co-Authored-By: drashna --- docs/keycodes.md | 31 ++++++++++--------------------- 1 file changed, 10 insertions(+), 21 deletions(-) diff --git a/docs/keycodes.md b/docs/keycodes.md index d12a85aa1..468b59f84 100644 --- a/docs/keycodes.md +++ b/docs/keycodes.md @@ -288,15 +288,16 @@ This is a reference only. Each group of keys links to the page documenting their ## [Layer Switching](feature_advanced_keycodes.md#switching-and-toggling-layers) -|Key |Description | -|-----------------|---------------------------------------------------------------------| -|`DF(layer)` |Switches the default layer | -|`MO(layer)` |Momentarily activates layer, switches off when you let go | -|`LM(layer, mod)` |As `MO(layer)` but with `mod` active | -|`LT(layer, kc)` |Momentarily activates layer if held, sends kc if tapped | -|`TG(layer)` |Toggles the layer (enables it if no active, and vise versa) | -|`TO(layer)` |Activates layer and deactivates all other layers | -|`TT(layer)` |Momentarily activates layer if held, toggles it if tapped repeatedly | +|Key |Description | +|----------------|----------------------------------------------------------------------------------| +|`DF(layer)` |Set the base (default) layer | +|`MO(layer)` |Momentarily turn on `layer` when pressed (requires `KC_TRNS` on destination layer)| +|`OSL(layer)` |Momentarily activates `layer` until a key is pressed. See [One Shot Keys](https://docs.qmk.fm/#/feature_advanced_keycodes?id=one-shot-keys) for details. | +|`LM(layer, mod)`|Momentarily turn on `layer` (like MO) with `mod` active as well. +|`LT(layer, kc)` |Turn on `layer` when held, `kc` when tapped | +|`TG(layer)` |Toggle `layer` on or off | +|`TO(layer)` |Turn on `layer` when pressed | +|`TT(layer)` |Normally acts like MO unless it's tapped multiple times, which toggles `layer` on | ## [Mouse Keys](feature_mouse_keys.md) @@ -431,18 +432,6 @@ This is a reference only. Each group of keys links to the page documenting their |`KC_RIGHT_ANGLE_BRACKET`|`KC_RABK`, `KC_GT` |`>` | |`KC_QUESTION` |`KC_QUES` |`?` | -## [Switching and Toggling Layers](feature_advanced_keycodes.md#switching-and-toggling-layers) - -|Key |Description | -|----------------|----------------------------------------------------------------------------------| -|`LT(layer, kc)` |Turn on `layer` when held, `kc` when tapped | -|`TO(layer)` |Turn on `layer` when pressed | -|`MO(layer)` |Momentarily turn on `layer` when pressed (requires `KC_TRNS` on destination layer)| -|`DF(layer)` |Set the base (default) layer | -|`TG(layer)` |Toggle `layer` on or off | -|`TT(layer)` |Normally acts like MO unless it's tapped multiple times, which toggles `layer` on | -|`LM(layer, mod)`|Momentarily turn on `layer` (like MO) with `mod` active as well. | - ## [One Shot Keys](feature_advanced_keycodes.md#one-shot-keys) |Key |Description | From 80dfd34fe454f8dde67145fef51eb82ef7ea2e45 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 14 Dec 2018 07:52:11 -0800 Subject: [PATCH 689/788] Add additional resource links (#4594) * Add additional resource links And fix a typo or two * Update docs/newbs.md Co-Authored-By: drashna * Wordsmithing Co-Authored-By: drashna --- docs/newbs.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/newbs.md b/docs/newbs.md index e687fd227..4f115c3c7 100644 --- a/docs/newbs.md +++ b/docs/newbs.md @@ -6,13 +6,17 @@ Not sure if your keyboard can run QMK? If it's a mechanical keyboard you built y ## Overview -There are 5 main sections to this guide: +There are 6 main sections to this guide: * [Getting Started](newbs_getting_started.md) * [Building Your First Firmware](newbs_building_firmware.md) * [Flashing Firmware](newbs_flashing.md) * [Testing and Debugging](newbs_testing_debugging.md) -* [Best Practices](newbs_best_practices.md) +* [Git Best Practices](newbs_best_practices.md) * [Learn More with these Resources](newbs_learn_more_resources.md) This guide is focused on helping someone who has never compiled software before. It makes choices and recommendations based on that viewpoint. There are alternative methods for many of these procedures, and we support most of those alternatives. If you have any doubt about how to accomplish a task you can [ask us for guidance](getting_started_getting_help.md). + +## Additional Resources + +* [Thomas Baart's QMK Basics Blog](https://thomasbaart.nl/category/mechanical-keyboards/firmware/qmk/qmk-basics/) – A user-created blog covering the basics of how to use QMK Firmware, as seen from a new user's perspective. From 02d44beb4410b806cb8c38e272941d212fee8a74 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 14 Dec 2018 09:01:58 -0800 Subject: [PATCH 690/788] Fix up tap_code functionality (#4609) * Add delay in Tap Code to avoid issues I think a few people have reporting issues with it working properly, and it may be a timing issue. The 'register_code' uses this sort of delay in some of the functions, and this is probably why. Adding the 100ms delay should hopefully fix any issues with it. * Make tap_code delay configurable * Update documentation * Bring tap_code16 inline with changes * Fix type for tap_code16 Bad copy-paste job * Just use the value check for the define * Clarify timing in docs Co-Authored-By: drashna * Wordsmithing Co-Authored-By: drashna --- docs/config_options.md | 2 ++ docs/feature_macros.md | 2 ++ quantum/quantum.c | 8 ++++++++ quantum/quantum.h | 2 +- tmk_core/common/action.c | 12 ++++++++++++ tmk_core/common/action.h | 2 +- 6 files changed, 26 insertions(+), 2 deletions(-) diff --git a/docs/config_options.md b/docs/config_options.md index b811fa877..69fecc8b4 100644 --- a/docs/config_options.md +++ b/docs/config_options.md @@ -160,6 +160,8 @@ If you define these options you will enable the associated feature, which may in * Set this to the number of combos that you're using in the [Combo](feature_combo.md) feature. * `#define COMBO_TERM 200` * how long for the Combo keys to be detected. Defaults to `TAPPING_TERM` if not defined. +* `#define TAP_CODE_DELAY 100` + * Sets the delay between `register_code` and `unregister_code`, if you're having issues with it registering properly (common on VUSB boards). The value is in milliseconds. ## RGB Light Configuration diff --git a/docs/feature_macros.md b/docs/feature_macros.md index 29ba29fef..aa13fb97f 100644 --- a/docs/feature_macros.md +++ b/docs/feature_macros.md @@ -250,6 +250,8 @@ Parallel to `register_code` function, this sends the `` keyup event to the c This will send `register_code()` and then `unregister_code()`. This is useful if you want to send both the press and release events ("tap" the key, rather than hold it). +If you're having issues with taps (un)registering, you can add a delay between the register and unregister events by setting `#define TAP_CODE_DELAY 100` in your `config.h` file. The value is in milliseconds. + ### `clear_keyboard();` This will clear all mods and keys currently pressed. diff --git a/quantum/quantum.c b/quantum/quantum.c index 69692233e..a57d4f89f 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -132,6 +132,14 @@ void unregister_code16 (uint16_t code) { } } +void tap_code16(uint16_t code) { + register_code16(code); + #if TAP_CODE_DELAY > 0 + wait_ms(TAP_CODE_DELAY); + #endif + unregister_code16(code); +} + __attribute__ ((weak)) bool process_action_kb(keyrecord_t *record) { return true; diff --git a/quantum/quantum.h b/quantum/quantum.h index 5920e4b13..0faf1af29 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h @@ -243,7 +243,7 @@ void shutdown_user(void); void register_code16(uint16_t code); void unregister_code16(uint16_t code); -inline void tap_code16(uint16_t code) { register_code16(code); unregister_code16(code); } +void tap_code16(uint16_t code); #ifdef BACKLIGHT_ENABLE void backlight_init_ports(void); diff --git a/tmk_core/common/action.c b/tmk_core/common/action.c index 8bdcd54e3..456d1e25f 100644 --- a/tmk_core/common/action.c +++ b/tmk_core/common/action.c @@ -847,6 +847,18 @@ void unregister_code(uint8_t code) #endif } +/** \brief Utilities for actions. (FIXME: Needs better description) + * + * FIXME: Needs documentation. + */ +void tap_code(uint8_t code) { + register_code(code); + #if TAP_CODE_DELAY > 0 + wait_ms(TAP_CODE_DELAY); + #endif + unregister_code(code); +} + /** \brief Utilities for actions. (FIXME: Needs better description) * * FIXME: Needs documentation. diff --git a/tmk_core/common/action.h b/tmk_core/common/action.h index 833febe9c..5d797fd62 100644 --- a/tmk_core/common/action.h +++ b/tmk_core/common/action.h @@ -88,7 +88,7 @@ void process_record(keyrecord_t *record); void process_action(keyrecord_t *record, action_t action); void register_code(uint8_t code); void unregister_code(uint8_t code); -inline void tap_code(uint8_t code) { register_code(code); unregister_code(code); } +void tap_code(uint8_t code); void register_mods(uint8_t mods); void unregister_mods(uint8_t mods); //void set_mods(uint8_t mods); From 161ffa0af6b9af76b8e73a3f274bbc415ae9f842 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 14 Dec 2018 10:42:31 -0800 Subject: [PATCH 691/788] Add some optimization to the Tetris keyboard (#4645) --- keyboards/tetris/config.h | 12 +++---- keyboards/tetris/keymaps/default/keymap.c | 42 ++++++++--------------- keyboards/tetris/rules.mk | 21 ++++++------ 3 files changed, 31 insertions(+), 44 deletions(-) diff --git a/keyboards/tetris/config.h b/keyboards/tetris/config.h index 7e7dac7cf..c2e552449 100644 --- a/keyboards/tetris/config.h +++ b/keyboards/tetris/config.h @@ -1,5 +1,4 @@ -#ifndef CONFIG_H -#define CONFIG_H +#pragma once #include "config_common.h" @@ -10,6 +9,7 @@ #define MANUFACTURER Fengz #define PRODUCT Tetris #define DESCRIPTION Planck mit + #define QMK_ESC_OUTPUT B0 #define QMK_ESC_INPUT D7 #define QMK_LED B7 @@ -41,8 +41,10 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) +#define NO_ACTION_MACRO +#define NO_ACTION_FUNCTION + #define TAPPING_TERM 200 -#define PERMISSIVE_HOLD #ifdef AUDIO_ENABLE #define B5_AUDIO @@ -50,13 +52,11 @@ #define NO_MUSIC_MODE #endif +#if RGBLIGHT_ENABLE #define RGB_DI_PIN F5 -#ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS #define RGBLIGHT_SLEEP #define RGBLED_NUM 47 #define RGBLIGHT_EFFECT_KNIGHT_LED_NUM 12 //#define RGBLIGHT_LIMIT_VAL 128 #endif - -#endif diff --git a/keyboards/tetris/keymaps/default/keymap.c b/keyboards/tetris/keymaps/default/keymap.c index 61f2961b4..5f48bd07a 100644 --- a/keyboards/tetris/keymaps/default/keymap.c +++ b/keyboards/tetris/keymaps/default/keymap.c @@ -286,7 +286,7 @@ static uint16_t Type_Hue=270; void matrix_init_user( void ) { - _delay_ms( 200 ); + wait_ms( 200 ); /* Encoder init */ encoder_state = PIND & 0x3; @@ -368,27 +368,22 @@ void matrix_scan_user( void ) switch ( layer ) { case 0: - register_code( KC_VOLD ); - unregister_code( KC_VOLD ); + tap_code( KC_VOLD ); break; case _CODE: - register_code( KC_LEFT ); - unregister_code( KC_LEFT ); + tap_code( KC_LEFT ); break; case _RGB: rgblight_decrease_val(); break; case _NUMB: - register_code( KC_LEFT ); - unregister_code( KC_LEFT ); + tap_code( KC_LEFT ); break; case _MARO: - register_code( KC_UP ); - unregister_code( KC_UP ); + tap_code( KC_UP ); break; default: - register_code( KC_VOLD ); - unregister_code( KC_VOLD ); + tap_code( KC_VOLD ); } /* End of Set Encoder Keycode */ @@ -441,27 +436,22 @@ void matrix_scan_user( void ) switch ( layer ) { case 0: - register_code( KC_VOLU ); - unregister_code( KC_VOLU ); + tap_code( KC_VOLU ); break; case _CODE: - register_code( KC_RGHT ); - unregister_code( KC_RGHT ); + tap_code( KC_RGHT ); break; case _RGB: rgblight_increase_val(); break; case _NUMB: - register_code( KC_RGHT ); - unregister_code( KC_RGHT ); + tap_code( KC_RGHT ); break; case _MARO: - register_code( KC_DOWN ); - unregister_code( KC_DOWN ); + tap_code( KC_DOWN ); break; default: - register_code( KC_VOLU ); - unregister_code( KC_VOLU ); + tap_code( KC_VOLU ); } /* End of Set Encoder Keycode */ @@ -739,11 +729,8 @@ bool process_record_user( uint16_t keycode, keyrecord_t *record ){ if (record->event.pressed) { // Do something when pressed } else { - register_code( KC_0 ); // send 0 - unregister_code( KC_0 ); - - register_code( KC_0 ); // send 0 twice without macro - unregister_code( KC_0 ); + tap_code( KC_0 ); // send 0 + tap_code( KC_0 ); // send 0 twice without macro } return false; // Skip all further processing of this key @@ -818,7 +805,7 @@ bool process_record_user( uint16_t keycode, keyrecord_t *record ){ void led_set_user( uint8_t usb_led ) { static uint8_t old_usb_led = 0; - _delay_ms( 10 ); /* gets rid of tick */ + wait_ms( 10 ); /* gets rid of tick */ if ( (usb_led & (1 << USB_LED_CAPS_LOCK) ) && !(old_usb_led & (1 << USB_LED_CAPS_LOCK) ) ) { /* CAPS on */ @@ -844,4 +831,3 @@ void led_set_user( uint8_t usb_led ) } old_usb_led = usb_led; } // End of led_set_user - diff --git a/keyboards/tetris/rules.mk b/keyboards/tetris/rules.mk index 784f6e462..4741c162b 100644 --- a/keyboards/tetris/rules.mk +++ b/keyboards/tetris/rules.mk @@ -44,17 +44,18 @@ BOOTLOADER =qmk-dfu # Build Options # comment out to disable the options. # -BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE ?= no # Mouse keys(+4700) -EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) -CONSOLE_ENABLE ?= no # Console for debug(+400) -COMMAND_ENABLE ?= no # Commands for debug and configuration -SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend -NKRO_ENABLE ?= yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality -AUDIO_ENABLE ?= yes -RGBLIGHT_ENABLE ?= yes +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +AUDIO_ENABLE = yes +RGBLIGHT_ENABLE = yes TAP_DANCE_ENABLE = no + EXTRAFLAGS += -flto # Make the hex smaller LAYOUTS = planck_mit From 9739d6ba0ad3da93f42cc28a78a6722d39ad3d72 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 14 Dec 2018 10:43:24 -0800 Subject: [PATCH 692/788] Docs: Clarify audio keycodes (#4620) * Clarify audio keycodes * Spelling errors Co-Authored-By: drashna * Spacing in md Co-Authored-By: drashna * Fix midi link too * Wordsmithing --- docs/feature_audio.md | 10 ++++++---- docs/keycodes.md | 6 +++--- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/docs/feature_audio.md b/docs/feature_audio.md index a39c45687..38861e8c1 100644 --- a/docs/feature_audio.md +++ b/docs/feature_audio.md @@ -61,9 +61,11 @@ It's advised that you wrap all audio features in `#ifdef AUDIO_ENABLE` / `#endif The available keycodes for audio are: -* `AU_ON` - Turn audio mode on -* `AU_OFF` - Turn audio mode off -* `AU_TOG` - Toggle audio mode +* `AU_ON` - Turn Audio Feature on +* `AU_OFF` - Turn Audio Feature off +* `AU_TOG` - Toggle Audio Feature state + +!> These keycodes turn all of the audio functionality on and off. Turning it off means that audio feedback, audio clicky, music mode, etc. are disabled, completely. ## ARM Audio Volume @@ -158,7 +160,7 @@ You can configure the default, min and max frequencies, the stepping and built i ## MIDI Functionality -This is still a WIP, but check out `quantum/keymap_midi.c` to see what's happening. Enable from the Makefile. +This is still a WIP, but check out `quantum/process_keycode/process_midi.c` to see what's happening. Enable from the Makefile. ## Audio Keycodes diff --git a/docs/keycodes.md b/docs/keycodes.md index 468b59f84..6d8525393 100644 --- a/docs/keycodes.md +++ b/docs/keycodes.md @@ -226,9 +226,9 @@ This is a reference only. Each group of keys links to the page documenting their |Key |Aliases |Description | |----------------|---------|----------------------------------| -|`AU_ON` | |Audio mode on | -|`AU_OFF` | |Audio mode off | -|`AU_TOG` | |Toggles Audio mode | +|`AU_ON` | |Turns on Audio Feature | +|`AU_OFF` | |Turns off Audio Feature | +|`AU_TOG` | |Toggles Audio state | |`CLICKY_TOGGLE` |`CK_TOGG`|Toggles Audio clicky mode | |`CLICKY_UP` |`CK_UP` |Increases frequency of the clicks | |`CLICKY_DOWN` |`CK_DOWN`|Decreases frequency of the clicks | From 155e9310ff685f557287749bef2e02510538a6d9 Mon Sep 17 00:00:00 2001 From: Takeshi ISHII <2170248+mtei@users.noreply.github.com> Date: Sat, 15 Dec 2018 04:00:10 +0900 Subject: [PATCH 693/788] Make quantum/split_common/serial.[ch] configurable (#4419) * add temporary compile test shell script * add 'CONFIG_H += serial_backward_compatibility.h' into common_features.mk:SPLIT_KEYBOARD block * add quantum/split_common/serial_backward_compatibility.h SERIAL_PIN_PORT and other PIN define move to serial_backward_compatibility.h SERIAL_BACKLIT_START move to split_util.h * quantum/split_common/serial.c change to helix-serial.c style serial configuration * add temporary file quantum/split_common/split-keyboards-list.txt * add '#define SOFT_SERIAL_PIN D0' to keyboards/6lit/config.h * add '#define SOFT_SERIAL_PIN D0' to keyboards/divergetm2/config.h * add '#define SOFT_SERIAL_PIN D0' to keyboards/ergotravel/rev1/config.h * add '#define SOFT_SERIAL_PIN D0' to keyboards/foobar/config.h * add '#define SOFT_SERIAL_PIN D0' to keyboards/handwired/dactyl_manuform/config.h * add '#define SOFT_SERIAL_PIN D0' to keyboards/handwired/qc60/config.h * add '//#define SOFT_SERIAL_PIN D0' to keyboards/handwired/xealous/config.h * add '#define SOFT_SERIAL_PIN D0' to keyboards/iris/rev*/config.h * add '//#define SOFT_SERIAL_PIN D0' to keyboards/lets_split_eh/config.h * add '#define SOFT_SERIAL_PIN D0' to keyboards/levinson/rev*/config.h * add '#define SOFT_SERIAL_PIN D0' to keyboards/miniaxe/config.h * add '#define SOFT_SERIAL_PIN D0' to keyboards/nyquist/rev?/config.h * add '#define SOFT_SERIAL_PIN D0' to keyboards/quefrency/rev1/config.h * add '#define SOFT_SERIAL_PIN D0' to keyboards/qwertyydox/config.h,keyboards/qwertyydox/rev1/config.h * add '#define SOFT_SERIAL_PIN D0' to keyboards/redox/rev1/config.h * add '#define SOFT_SERIAL_PIN D0' to keyboards/rorschach/rev1/config.h * remove '#define SOFT_SERIAL_PIN D0' from quantum/split_common/serial_backward_compatibility.h * remove temporary file quantum/split_common/split-keyboards-list.txt * remove temporary compile test shell script * Revert "remove temporary compile test shell script" This reverts commit 15b0021b4092127b8d8a21f572642ad3702b46d4. * update quantum/split_common/compile_split_test.sh for new keyboard test * add '#define SOFT_SERIAL_PIN D0' to keyboards/diverge3/config.h * add '#define SOFT_SERIAL_PIN D0' to keyboards/40percentclub/25/config.h * remove temporary compile test shell script * update docs/config_options.md, quantum/template/avr/config.h * fix quantum/template/avr/config.h * fix typo docs/config_options.md --- common_features.mk | 5 ++ docs/config_options.md | 3 ++ keyboards/40percentclub/25/config.h | 2 + keyboards/40percentclub/6lit/config.h | 3 ++ keyboards/40percentclub/foobar/config.h | 3 ++ keyboards/diverge3/config.h | 3 ++ keyboards/divergetm2/config.h | 3 ++ keyboards/ergotravel/rev1/config.h | 3 ++ keyboards/handwired/dactyl_manuform/config.h | 3 ++ keyboards/handwired/qc60/config.h | 3 ++ keyboards/handwired/xealous/config.h | 5 +- keyboards/iris/rev1/config.h | 3 ++ keyboards/iris/rev1_led/config.h | 3 ++ keyboards/iris/rev2/config.h | 3 ++ keyboards/iris/rev3/config.h | 3 ++ keyboards/lets_split_eh/config.h | 3 ++ keyboards/levinson/rev1/config.h | 3 ++ keyboards/levinson/rev2/config.h | 3 ++ keyboards/miniaxe/config.h | 3 ++ keyboards/nyquist/rev1/config.h | 3 ++ keyboards/nyquist/rev2/config.h | 3 ++ keyboards/nyquist/rev3/config.h | 3 ++ keyboards/quefrency/rev1/config.h | 3 ++ keyboards/qwertyydox/config.h | 3 ++ keyboards/qwertyydox/rev1/config.h | 3 ++ keyboards/redox/rev1/config.h | 3 ++ keyboards/rorschach/rev1/config.h | 3 ++ quantum/split_common/serial.c | 53 +++++++++++++++++++ quantum/split_common/serial.h | 23 ++++---- .../serial_backward_compatibility.h | 11 ++++ quantum/split_common/split_util.h | 3 ++ quantum/template/avr/config.h | 5 ++ 32 files changed, 165 insertions(+), 14 deletions(-) create mode 100644 quantum/split_common/serial_backward_compatibility.h diff --git a/common_features.mk b/common_features.mk index bd88e04d6..97febe2e7 100644 --- a/common_features.mk +++ b/common_features.mk @@ -263,6 +263,11 @@ ifneq ($(strip $(CUSTOM_MATRIX)), yes) endif ifeq ($(strip $(SPLIT_KEYBOARD)), yes) + SERIAL_BACKWARD_COMPAT := $(wildcard $(QUANTUM_DIR)/split_common/serial_backward_compatibility.h) + ifneq ($(SERIAL_BACKWARD_COMPAT),) + CONFIG_H += $(SERIAL_BACKWARD_COMPAT) + # $(info CONFIG_H=$(CONFIG_H)) + endif OPT_DEFS += -DSPLIT_KEYBOARD QUANTUM_SRC += $(QUANTUM_DIR)/split_common/split_flags.c \ $(QUANTUM_DIR)/split_common/split_util.c \ diff --git a/docs/config_options.md b/docs/config_options.md index 69fecc8b4..bea4acb01 100644 --- a/docs/config_options.md +++ b/docs/config_options.md @@ -198,6 +198,9 @@ Split Keyboard specific options, make sure you have 'SPLIT_KEYBOARD = yes' in yo * `#define USE_I2C` * For using I2C instead of Serial (defaults to serial) +* `#define SOFT_SERIAL_PIN D0` + * When using serial, define this. `D0` or `D1`,`D2`,`D3`,`E6`. + # The `rules.mk` File This is a [make](https://www.gnu.org/software/make/manual/make.html) file that is included by the top-level `Makefile`. It is used to set some information about the MCU that we will be compiling for as well as enabling and disabling certain features. diff --git a/keyboards/40percentclub/25/config.h b/keyboards/40percentclub/25/config.h index 23b768e15..7fe59fcca 100644 --- a/keyboards/40percentclub/25/config.h +++ b/keyboards/40percentclub/25/config.h @@ -27,6 +27,8 @@ #define DESCRIPTION A split 50 key keyboard #define USE_SERIAL +/* serial.c configuration for split keyboard */ +#define SOFT_SERIAL_PIN D0 /* Select hand configuration */ #define MASTER_LEFT diff --git a/keyboards/40percentclub/6lit/config.h b/keyboards/40percentclub/6lit/config.h index 8397818a6..940518f36 100644 --- a/keyboards/40percentclub/6lit/config.h +++ b/keyboards/40percentclub/6lit/config.h @@ -28,6 +28,9 @@ #define USE_SERIAL +/* serial.c configuration for split keyboard */ +#define SOFT_SERIAL_PIN D0 + /* Select hand configuration */ #define MASTER_LEFT //#define MASTER_RIGHT diff --git a/keyboards/40percentclub/foobar/config.h b/keyboards/40percentclub/foobar/config.h index 89219c460..88075c456 100644 --- a/keyboards/40percentclub/foobar/config.h +++ b/keyboards/40percentclub/foobar/config.h @@ -28,6 +28,9 @@ #define USE_SERIAL +/* serial.c configuration for split keyboard */ +#define SOFT_SERIAL_PIN D0 + /* Select hand configuration */ #define MASTER_LEFT //#define MASTER_RIGHT diff --git a/keyboards/diverge3/config.h b/keyboards/diverge3/config.h index 262be7b75..464dc835f 100644 --- a/keyboards/diverge3/config.h +++ b/keyboards/diverge3/config.h @@ -57,6 +57,9 @@ along with this program. If not, see . /* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ #define DEBOUNCING_DELAY 5 +/* serial.c configuration for split keyboard */ +#define SOFT_SERIAL_PIN D0 + /* define if matrix has ghost (lacks anti-ghosting diodes) */ //#define MATRIX_HAS_GHOST diff --git a/keyboards/divergetm2/config.h b/keyboards/divergetm2/config.h index 8bc9d2c80..cbeeff9aa 100644 --- a/keyboards/divergetm2/config.h +++ b/keyboards/divergetm2/config.h @@ -59,6 +59,9 @@ /* Locking resynchronize hack */ #define LOCKING_RESYNC_ENABLE +/* serial.c configuration for split keyboard */ +#define SOFT_SERIAL_PIN D0 + /* * Magic Key Options * diff --git a/keyboards/ergotravel/rev1/config.h b/keyboards/ergotravel/rev1/config.h index 3af1147a7..e6d557361 100644 --- a/keyboards/ergotravel/rev1/config.h +++ b/keyboards/ergotravel/rev1/config.h @@ -56,6 +56,9 @@ along with this program. If not, see . keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) +/* serial.c configuration for split keyboard */ +#define SOFT_SERIAL_PIN D0 + #define BACKLIGHT_PIN B5 #define BACKLIGHT_LEVELS 5 diff --git a/keyboards/handwired/dactyl_manuform/config.h b/keyboards/handwired/dactyl_manuform/config.h index 320ce3c48..0e6f3f98e 100644 --- a/keyboards/handwired/dactyl_manuform/config.h +++ b/keyboards/handwired/dactyl_manuform/config.h @@ -38,6 +38,9 @@ along with this program. If not, see . /* Set 0 if debouncing isn't needed */ #define DEBOUNCING_DELAY 5 +/* serial.c configuration for split keyboard */ +#define SOFT_SERIAL_PIN D0 + /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ #define LOCKING_SUPPORT_ENABLE /* Locking resynchronize hack */ diff --git a/keyboards/handwired/qc60/config.h b/keyboards/handwired/qc60/config.h index 3b6f84390..00d095ddf 100644 --- a/keyboards/handwired/qc60/config.h +++ b/keyboards/handwired/qc60/config.h @@ -18,6 +18,9 @@ /* Set 0 if debouncing isn't needed */ #define DEBOUNCING_DELAY 5 +/* serial.c configuration for split keyboard */ +#define SOFT_SERIAL_PIN D0 + /* key combination for command */ #define IS_COMMAND() ( \ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ diff --git a/keyboards/handwired/xealous/config.h b/keyboards/handwired/xealous/config.h index 415a0dcf5..7bce502c1 100644 --- a/keyboards/handwired/xealous/config.h +++ b/keyboards/handwired/xealous/config.h @@ -21,10 +21,13 @@ along with this program. If not, see . /* Use I2C or Serial, not both */ -// #define USE_SERIAL #define USE_I2C #define SCL_CLOCK 400000UL +// #define USE_SERIAL +/* serial.c configuration for split keyboard */ +// #define SOFT_SERIAL_PIN D0 + /* Select hand configuration */ #define MASTER_LEFT diff --git a/keyboards/iris/rev1/config.h b/keyboards/iris/rev1/config.h index 7f76df54b..3b31ca0d7 100644 --- a/keyboards/iris/rev1/config.h +++ b/keyboards/iris/rev1/config.h @@ -48,6 +48,9 @@ along with this program. If not, see . /* Set 0 if debouncing isn't needed */ #define DEBOUNCING_DELAY 5 +/* serial.c configuration for split keyboard */ +#define SOFT_SERIAL_PIN D0 + /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ #define LOCKING_SUPPORT_ENABLE /* Locking resynchronize hack */ diff --git a/keyboards/iris/rev1_led/config.h b/keyboards/iris/rev1_led/config.h index b58b11836..e9739c003 100644 --- a/keyboards/iris/rev1_led/config.h +++ b/keyboards/iris/rev1_led/config.h @@ -48,6 +48,9 @@ along with this program. If not, see . /* Set 0 if debouncing isn't needed */ #define DEBOUNCING_DELAY 5 +/* serial.c configuration for split keyboard */ +#define SOFT_SERIAL_PIN D0 + /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ #define LOCKING_SUPPORT_ENABLE /* Locking resynchronize hack */ diff --git a/keyboards/iris/rev2/config.h b/keyboards/iris/rev2/config.h index 266c29b9c..d43d4b1c6 100644 --- a/keyboards/iris/rev2/config.h +++ b/keyboards/iris/rev2/config.h @@ -48,6 +48,9 @@ along with this program. If not, see . /* Set 0 if debouncing isn't needed */ #define DEBOUNCING_DELAY 5 +/* serial.c configuration for split keyboard */ +#define SOFT_SERIAL_PIN D0 + /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ #define LOCKING_SUPPORT_ENABLE /* Locking resynchronize hack */ diff --git a/keyboards/iris/rev3/config.h b/keyboards/iris/rev3/config.h index 1032231d8..5642512f3 100644 --- a/keyboards/iris/rev3/config.h +++ b/keyboards/iris/rev3/config.h @@ -48,6 +48,9 @@ along with this program. If not, see . /* Set 0 if debouncing isn't needed */ #define DEBOUNCING_DELAY 5 +/* serial.c configuration for split keyboard */ +#define SOFT_SERIAL_PIN D0 + /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ #define LOCKING_SUPPORT_ENABLE /* Locking resynchronize hack */ diff --git a/keyboards/lets_split_eh/config.h b/keyboards/lets_split_eh/config.h index b8fe95ea2..abfee0eac 100644 --- a/keyboards/lets_split_eh/config.h +++ b/keyboards/lets_split_eh/config.h @@ -36,6 +36,9 @@ along with this program. If not, see . /* Set 0 if debouncing isn't needed */ #define DEBOUNCING_DELAY 5 +/* serial.c configuration for split keyboard */ +//#define SOFT_SERIAL_PIN D0 + /* key combination for command */ #define IS_COMMAND() ( \ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ diff --git a/keyboards/levinson/rev1/config.h b/keyboards/levinson/rev1/config.h index 8161b4e32..07ba1e221 100644 --- a/keyboards/levinson/rev1/config.h +++ b/keyboards/levinson/rev1/config.h @@ -41,6 +41,9 @@ along with this program. If not, see . /* Set 0 if debouncing isn't needed */ #define DEBOUNCING_DELAY 5 +/* serial.c configuration for split keyboard */ +#define SOFT_SERIAL_PIN D0 + /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ #define LOCKING_SUPPORT_ENABLE /* Locking resynchronize hack */ diff --git a/keyboards/levinson/rev2/config.h b/keyboards/levinson/rev2/config.h index 03b98b45c..a731c7195 100644 --- a/keyboards/levinson/rev2/config.h +++ b/keyboards/levinson/rev2/config.h @@ -41,6 +41,9 @@ along with this program. If not, see . /* Set 0 if debouncing isn't needed */ #define DEBOUNCING_DELAY 5 +/* serial.c configuration for split keyboard */ +#define SOFT_SERIAL_PIN D0 + /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ #define LOCKING_SUPPORT_ENABLE /* Locking resynchronize hack */ diff --git a/keyboards/miniaxe/config.h b/keyboards/miniaxe/config.h index 13608feab..2b732ca16 100644 --- a/keyboards/miniaxe/config.h +++ b/keyboards/miniaxe/config.h @@ -237,6 +237,9 @@ along with this program. If not, see . /* Serial settings */ #define USE_SERIAL +/* serial.c configuration for split keyboard */ +#define SOFT_SERIAL_PIN D0 + //#define EE_HANDS #define I2C_MASTER_LEFT //#define I2C_MASTER_RIGHT diff --git a/keyboards/nyquist/rev1/config.h b/keyboards/nyquist/rev1/config.h index 35fbaffb9..892054b73 100644 --- a/keyboards/nyquist/rev1/config.h +++ b/keyboards/nyquist/rev1/config.h @@ -46,6 +46,9 @@ along with this program. If not, see . /* Set 0 if debouncing isn't needed */ #define DEBOUNCING_DELAY 5 +/* serial.c configuration for split keyboard */ +#define SOFT_SERIAL_PIN D0 + /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ #define LOCKING_SUPPORT_ENABLE /* Locking resynchronize hack */ diff --git a/keyboards/nyquist/rev2/config.h b/keyboards/nyquist/rev2/config.h index 7dc743b27..21aea0aad 100644 --- a/keyboards/nyquist/rev2/config.h +++ b/keyboards/nyquist/rev2/config.h @@ -43,6 +43,9 @@ along with this program. If not, see . /* Set 0 if debouncing isn't needed */ #define DEBOUNCING_DELAY 5 +/* serial.c configuration for split keyboard */ +#define SOFT_SERIAL_PIN D0 + /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ #define LOCKING_SUPPORT_ENABLE /* Locking resynchronize hack */ diff --git a/keyboards/nyquist/rev3/config.h b/keyboards/nyquist/rev3/config.h index 6c51bc9a8..8054ba79c 100644 --- a/keyboards/nyquist/rev3/config.h +++ b/keyboards/nyquist/rev3/config.h @@ -43,6 +43,9 @@ along with this program. If not, see . /* Set 0 if debouncing isn't needed */ #define DEBOUNCING_DELAY 5 +/* serial.c configuration for split keyboard */ +#define SOFT_SERIAL_PIN D0 + /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ #define LOCKING_SUPPORT_ENABLE /* Locking resynchronize hack */ diff --git a/keyboards/quefrency/rev1/config.h b/keyboards/quefrency/rev1/config.h index 1074590ff..88d704486 100644 --- a/keyboards/quefrency/rev1/config.h +++ b/keyboards/quefrency/rev1/config.h @@ -41,6 +41,9 @@ along with this program. If not, see . /* Set 0 if debouncing isn't needed */ #define DEBOUNCING_DELAY 5 +/* serial.c configuration for split keyboard */ +#define SOFT_SERIAL_PIN D0 + /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ #define LOCKING_SUPPORT_ENABLE /* Locking resynchronize hack */ diff --git a/keyboards/qwertyydox/config.h b/keyboards/qwertyydox/config.h index b22ca534e..a68565223 100644 --- a/keyboards/qwertyydox/config.h +++ b/keyboards/qwertyydox/config.h @@ -49,6 +49,9 @@ along with this program. If not, see . /* Set 0 if debouncing isn't needed */ #define DEBOUNCING_DELAY 5 +/* serial.c configuration for split keyboard */ +#define SOFT_SERIAL_PIN D0 + /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ #define LOCKING_SUPPORT_ENABLE /* Locking resynchronize hack */ diff --git a/keyboards/qwertyydox/rev1/config.h b/keyboards/qwertyydox/rev1/config.h index 3d4c9b0d0..a2557592d 100644 --- a/keyboards/qwertyydox/rev1/config.h +++ b/keyboards/qwertyydox/rev1/config.h @@ -49,6 +49,9 @@ along with this program. If not, see . /* Set 0 if debouncing isn't needed */ #define DEBOUNCING_DELAY 5 +/* serial.c configuration for split keyboard */ +#define SOFT_SERIAL_PIN D0 + /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ #define LOCKING_SUPPORT_ENABLE /* Locking resynchronize hack */ diff --git a/keyboards/redox/rev1/config.h b/keyboards/redox/rev1/config.h index f4ccbd2fd..654a84de7 100644 --- a/keyboards/redox/rev1/config.h +++ b/keyboards/redox/rev1/config.h @@ -49,6 +49,9 @@ along with this program. If not, see . /* Set 0 if debouncing isn't needed */ #define DEBOUNCING_DELAY 5 +/* serial.c configuration for split keyboard */ +#define SOFT_SERIAL_PIN D0 + /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ #define LOCKING_SUPPORT_ENABLE /* Locking resynchronize hack */ diff --git a/keyboards/rorschach/rev1/config.h b/keyboards/rorschach/rev1/config.h index 1c9ef8276..1ea6dde98 100644 --- a/keyboards/rorschach/rev1/config.h +++ b/keyboards/rorschach/rev1/config.h @@ -42,6 +42,9 @@ along with this program. If not, see . /* Set 0 if debouncing isn't needed */ #define DEBOUNCING_DELAY 5 +/* serial.c configuration for split keyboard */ +#define SOFT_SERIAL_PIN D0 + /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ #define LOCKING_SUPPORT_ENABLE /* Locking resynchronize hack */ diff --git a/quantum/split_common/serial.c b/quantum/split_common/serial.c index 74bcbb6bf..f34f824d7 100644 --- a/quantum/split_common/serial.c +++ b/quantum/split_common/serial.c @@ -14,6 +14,59 @@ #ifndef USE_I2C +#ifndef SOFT_SERIAL_PIN + #error quantum/split_common/serial.c need SOFT_SERIAL_PIN define +#endif + +#ifdef __AVR_ATmega32U4__ + // if using ATmega32U4 I2C, can not use PD0 and PD1 in soft serial. + #ifdef USE_I2C + #if SOFT_SERIAL_PIN == D0 || SOFT_SERIAL_PIN == D1 + #error Using ATmega32U4 I2C, so can not use PD0, PD1 + #endif + #endif + + #if SOFT_SERIAL_PIN >= D0 && SOFT_SERIAL_PIN <= D3 + #define SERIAL_PIN_DDR DDRD + #define SERIAL_PIN_PORT PORTD + #define SERIAL_PIN_INPUT PIND + #if SOFT_SERIAL_PIN == D0 + #define SERIAL_PIN_MASK _BV(PD0) + #define EIMSK_BIT _BV(INT0) + #define EICRx_BIT (~(_BV(ISC00) | _BV(ISC01))) + #define SERIAL_PIN_INTERRUPT INT0_vect + #elif SOFT_SERIAL_PIN == D1 + #define SERIAL_PIN_MASK _BV(PD1) + #define EIMSK_BIT _BV(INT1) + #define EICRx_BIT (~(_BV(ISC10) | _BV(ISC11))) + #define SERIAL_PIN_INTERRUPT INT1_vect + #elif SOFT_SERIAL_PIN == D2 + #define SERIAL_PIN_MASK _BV(PD2) + #define EIMSK_BIT _BV(INT2) + #define EICRx_BIT (~(_BV(ISC20) | _BV(ISC21))) + #define SERIAL_PIN_INTERRUPT INT2_vect + #elif SOFT_SERIAL_PIN == D3 + #define SERIAL_PIN_MASK _BV(PD3) + #define EIMSK_BIT _BV(INT3) + #define EICRx_BIT (~(_BV(ISC30) | _BV(ISC31))) + #define SERIAL_PIN_INTERRUPT INT3_vect + #endif + #elif SOFT_SERIAL_PIN == E6 + #define SERIAL_PIN_DDR DDRE + #define SERIAL_PIN_PORT PORTE + #define SERIAL_PIN_INPUT PINE + #define SERIAL_PIN_MASK _BV(PE6) + #define EIMSK_BIT _BV(INT6) + #define EICRx_BIT (~(_BV(ISC60) | _BV(ISC61))) + #define SERIAL_PIN_INTERRUPT INT6_vect + #else + #error invalid SOFT_SERIAL_PIN value + #endif + +#else + #error serial.c now support ATmega32U4 only +#endif + // Serial pulse period in microseconds. Its probably a bad idea to lower this // value. #define SERIAL_DELAY 24 diff --git a/quantum/split_common/serial.h b/quantum/split_common/serial.h index e566eb8a0..0b99f352d 100644 --- a/quantum/split_common/serial.h +++ b/quantum/split_common/serial.h @@ -1,21 +1,18 @@ #ifndef MY_SERIAL_H #define MY_SERIAL_H -#include "config.h" #include -/* TODO: some defines for interrupt setup */ -#define SERIAL_PIN_DDR DDRD -#define SERIAL_PIN_PORT PORTD -#define SERIAL_PIN_INPUT PIND -#define SERIAL_PIN_MASK _BV(PD0) -#define SERIAL_PIN_INTERRUPT INT0_vect - -#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 -#define SERIAL_MASTER_BUFFER_LENGTH 1 - -// Address location defines -#define SERIAL_BACKLIT_START 0x00 +// ///////////////////////////////////////////////////////////////// +// Need Soft Serial defines in config.h +// ///////////////////////////////////////////////////////////////// +// ex. +// /* Configuration of lower interface with the lower layer(hardware) of serial.c */ +// #define SOFT_SERIAL_PIN ?? // ?? = D0,D1,D2,D3,E6 +// +// /* Configuration of upper interface with the upper layer of serial.c */ +// #define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 +// #define SERIAL_MASTER_BUFFER_LENGTH 1 // Buffers for master - slave communication extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH]; diff --git a/quantum/split_common/serial_backward_compatibility.h b/quantum/split_common/serial_backward_compatibility.h new file mode 100644 index 000000000..216b6c41f --- /dev/null +++ b/quantum/split_common/serial_backward_compatibility.h @@ -0,0 +1,11 @@ +/* serial.h backward compatibility */ + +// #ifndef SOFT_SERIAL_PIN +// #define SOFT_SERIAL_PIN D0 +// #endif + +#ifndef SERIAL_SLAVE_BUFFER_LENGTH + #define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 + #define SERIAL_MASTER_BUFFER_LENGTH 1 +#endif + diff --git a/quantum/split_common/split_util.h b/quantum/split_common/split_util.h index d6cf3e72a..45e8db0f2 100644 --- a/quantum/split_common/split_util.h +++ b/quantum/split_common/split_util.h @@ -7,6 +7,9 @@ #include #include "eeconfig.h" +// backlight level store index in serial_master_buffer[] for slave to read +#define SERIAL_BACKLIT_START 0x00 + #define SLAVE_I2C_ADDRESS 0x32 extern volatile bool isLeftHand; diff --git a/quantum/template/avr/config.h b/quantum/template/avr/config.h index 463ddff2d..eed50e5c0 100644 --- a/quantum/template/avr/config.h +++ b/quantum/template/avr/config.h @@ -48,6 +48,11 @@ along with this program. If not, see . /* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ #define DIODE_DIRECTION COL2ROW +/* + * Split Keyboard specific options, make sure you have 'SPLIT_KEYBOARD = yes' in your rules.mk, and define SOFT_SERIAL_PIN. + */ +#define SOFT_SERIAL_PIN D0 // or D1, D2, D3, E6 + // #define BACKLIGHT_PIN B7 // #define BACKLIGHT_BREATHING // #define BACKLIGHT_LEVELS 3 From 8f02375cc6ddfbbc6be384a9d5b1a9c91517099e Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Fri, 14 Dec 2018 11:37:26 -0800 Subject: [PATCH 694/788] Keyboard: B.mini EX refactor and Configurator support (#4647) * B.mini EX: refactor - add LAYOUT_ansi and LAYOUT_iso macros - add ansi and iso keymaps with readme files * B.mini EX: Configurator support --- keyboards/bminiex/bminiex.h | 36 +++ keyboards/bminiex/info.json | 340 +++++++++++++++++++++++ keyboards/bminiex/keymaps/ansi/keymap.c | 29 ++ keyboards/bminiex/keymaps/ansi/readme.md | 17 ++ keyboards/bminiex/keymaps/iso/keymap.c | 29 ++ keyboards/bminiex/keymaps/iso/readme.md | 17 ++ 6 files changed, 468 insertions(+) create mode 100644 keyboards/bminiex/info.json create mode 100644 keyboards/bminiex/keymaps/ansi/keymap.c create mode 100644 keyboards/bminiex/keymaps/ansi/readme.md create mode 100644 keyboards/bminiex/keymaps/iso/keymap.c create mode 100644 keyboards/bminiex/keymaps/iso/readme.md diff --git a/keyboards/bminiex/bminiex.h b/keyboards/bminiex/bminiex.h index a58ce6892..8d897f639 100644 --- a/keyboards/bminiex/bminiex.h +++ b/keyboards/bminiex/bminiex.h @@ -37,6 +37,42 @@ along with this program. If not, see . { K07, K17, K27, K37, K47, K57, K67, K77, KC_NO, KC_NO, KA7, KB7, KC7, KD7, KE7 } \ } +#define LAYOUT_ansi( \ + K05, K25, K35, K45, K55, K06, KA6, KA7, K07, KB5, KC5, KD5, KE5, KD1, KE1, KE2, K65, K75, K85, K95, \ + K04, K14, K24, K34, K44, K54, K16, KB6, KB7, K17, KA4, KB4, KC4, KE4, KD0, K64, K74, K84, K94, \ + K03, K13, K23, K33, K43, K53, K26, KC6, KC7, K27, KA3, KB3, KC3, KD3, K67, K63, K73, K83, \ + K02, K12, K22, K32, K42, K52, K36, KD6, KD7, K37, KA2, KB2, KD2, KE0, K62, K72, K82, K92, \ + K01, K11, K21, K31, K41, K51, K46, KE6, KE7, K47, KA1, KB1, K86, K77, K61, K71, K81, \ + K00, K10, K20, K56, K57, KB0, KC0, K66, K76, K96, K60, K80, K90 \ +){ \ + { K00, K10, K20, KC_NO, KC_NO, KC_NO, K60, KC_NO, K80, K90, KC_NO, KB0, KC0, KD0, KE0 }, \ + { K01, K11, K21, K31, K41, K51, K61, K71, K81, KC_NO, KA1, KB1, KC_NO, KD1, KE1 }, \ + { K02, K12, K22, K32, K42, K52, K62, K72, K82, K92, KA2, KB2, KC_NO, KD2, KE2 }, \ + { K03, K13, K23, K33, K43, K53, K63, K73, K83, KC_NO, KA3, KB3, KC3, KD3, KC_NO }, \ + { K04, K14, K24, K34, K44, K54, K64, K74, K84, K94, KA4, KB4, KC4, KC_NO, KE4 }, \ + { K05, KC_NO, K25, K35, K45, K55, K65, K75, K85, K95, KC_NO, KB5, KC5, KD5, KE5 }, \ + { K06, K16, K26, K36, K46, K56, K66, K76, K86, K96, KA6, KB6, KC6, KD6, KE6 }, \ + { K07, K17, K27, K37, K47, K57, K67, K77, KC_NO, KC_NO, KA7, KB7, KC7, KD7, KE7 } \ +} + +#define LAYOUT_iso( \ + K05, K25, K35, K45, K55, K06, KA6, KA7, K07, KB5, KC5, KD5, KE5, KD1, KE1, KE2, K65, K75, K85, K95, \ + K04, K14, K24, K34, K44, K54, K16, KB6, KB7, K17, KA4, KB4, KC4, KE4, KD0, K64, K74, K84, K94, \ + K03, K13, K23, K33, K43, K53, K26, KC6, KC7, K27, KA3, KB3, KC3, K67, K63, K73, K83, \ + K02, K12, K22, K32, K42, K52, K36, KD6, KD7, K37, KA2, KB2, KC2, KD2, KE0, K62, K72, K82, K92, \ + K01, K30, K11, K21, K31, K41, K51, K46, KE6, KE7, K47, KA1, KB1, K86, K77, K61, K71, K81, \ + K00, K10, K20, K56, K57, KB0, KC0, K66, K76, K96, K60, K80, K90 \ +){ \ + { K00, K10, K20, K30, KC_NO, KC_NO, K60, KC_NO, K80, K90, KC_NO, KB0, KC0, KD0, KE0 }, \ + { K01, K11, K21, K31, K41, K51, K61, K71, K81, KC_NO, KA1, KB1, KC_NO, KD1, KE1 }, \ + { K02, K12, K22, K32, K42, K52, K62, K72, K82, K92, KA2, KB2, KC2, KD2, KE2 }, \ + { K03, K13, K23, K33, K43, K53, K63, K73, K83, KC_NO, KA3, KB3, KC3, KC_NO, KC_NO }, \ + { K04, K14, K24, K34, K44, K54, K64, K74, K84, K94, KA4, KB4, KC4, KC_NO, KE4 }, \ + { K05, KC_NO, K25, K35, K45, K55, K65, K75, K85, K95, KC_NO, KB5, KC5, KD5, KE5 }, \ + { K06, K16, K26, K36, K46, K56, K66, K76, K86, K96, KA6, KB6, KC6, KD6, KE6 }, \ + { K07, K17, K27, K37, K47, K57, K67, K77, KC_NO, KC_NO, KA7, KB7, KC7, KD7, KE7 } \ +} + #define LAYOUT_kc( \ K05, K25, K35, K45, K55, K06, KA6, KA7, K07, KB5, KC5, KD5, KE5, KD1, KE1, KE2, K65, K75, K85, K95, \ K04, K14, K24, K34, K44, K54, K16, KB6, KB7, K17, KA4, KB4, KC4, KE4, KD0, K64, K74, K84, K94, \ diff --git a/keyboards/bminiex/info.json b/keyboards/bminiex/info.json new file mode 100644 index 000000000..8e38fbfb9 --- /dev/null +++ b/keyboards/bminiex/info.json @@ -0,0 +1,340 @@ +{ + "keyboard_name": "winkeyless.kr B.mini EX", + "keyboard_folder": "bminiex", + "url": "https://winkeyless.kr/product/b-mini-ex-x2-pcb/", + "maintainer": "qmk", + "width": 20.25, + "height": 6.25, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"ESC", "x":0, "y":0}, + {"label":"F1", "x":1, "y":0}, + {"label":"F2", "x":2, "y":0}, + {"label":"F3", "x":3, "y":0}, + {"label":"F4", "x":4, "y":0}, + {"label":"F5", "x":5, "y":0}, + {"label":"F6", "x":6, "y":0}, + {"label":"F7", "x":7, "y":0}, + {"label":"F8", "x":8, "y":0}, + {"label":"F9", "x":9, "y":0}, + {"label":"F10", "x":10, "y":0}, + {"label":"F11", "x":11, "y":0}, + {"label":"F12", "x":12, "y":0}, + {"label":"PSCR", "x":13, "y":0}, + {"label":"HOME", "x":14, "y":0}, + {"label":"END", "x":15, "y":0}, + {"label":"NO", "x":16.25, "y":0}, + {"label":"NO", "x":17.25, "y":0}, + {"label":"NO", "x":18.25, "y":0}, + {"label":"NO", "x":19.25, "y":0}, + {"label":"GRV", "x":0, "y":1.25}, + {"label":"1", "x":1, "y":1.25}, + {"label":"2", "x":2, "y":1.25}, + {"label":"3", "x":3, "y":1.25}, + {"label":"4", "x":4, "y":1.25}, + {"label":"5", "x":5, "y":1.25}, + {"label":"6", "x":6, "y":1.25}, + {"label":"7", "x":7, "y":1.25}, + {"label":"8", "x":8, "y":1.25}, + {"label":"9", "x":9, "y":1.25}, + {"label":"0", "x":10, "y":1.25}, + {"label":"MINS", "x":11, "y":1.25}, + {"label":"EQL", "x":12, "y":1.25}, + {"label":"BSPC", "x":13, "y":1.25, "w":2}, + {"label":"DEL", "x":15, "y":1.25}, + {"label":"NLCK", "x":16.25, "y":1.25}, + {"label":"PSLS", "x":17.25, "y":1.25}, + {"label":"PAST", "x":18.25, "y":1.25}, + {"label":"PMNS", "x":19.25, "y":1.25}, + {"label":"TAB", "x":0, "y":2.25, "w":1.5}, + {"label":"Q", "x":1.5, "y":2.25}, + {"label":"W", "x":2.5, "y":2.25}, + {"label":"E", "x":3.5, "y":2.25}, + {"label":"R", "x":4.5, "y":2.25}, + {"label":"T", "x":5.5, "y":2.25}, + {"label":"Y", "x":6.5, "y":2.25}, + {"label":"U", "x":7.5, "y":2.25}, + {"label":"I", "x":8.5, "y":2.25}, + {"label":"O", "x":9.5, "y":2.25}, + {"label":"P", "x":10.5, "y":2.25}, + {"label":"LBRC", "x":11.5, "y":2.25}, + {"label":"RBRC", "x":12.5, "y":2.25}, + {"label":"NO", "x":13.5, "y":2.25, "w":1.5}, + {"label":"INS", "x":15, "y":2.25}, + {"label":"P7", "x":16.25, "y":2.25}, + {"label":"P8", "x":17.25, "y":2.25}, + {"label":"P9", "x":18.25, "y":2.25}, + {"label":"CAPS", "x":0, "y":3.25, "w":1.75}, + {"label":"A", "x":1.75, "y":3.25}, + {"label":"S", "x":2.75, "y":3.25}, + {"label":"D", "x":3.75, "y":3.25}, + {"label":"F", "x":4.75, "y":3.25}, + {"label":"G", "x":5.75, "y":3.25}, + {"label":"H", "x":6.75, "y":3.25}, + {"label":"J", "x":7.75, "y":3.25}, + {"label":"K", "x":8.75, "y":3.25}, + {"label":"L", "x":9.75, "y":3.25}, + {"label":"SCLN", "x":10.75, "y":3.25}, + {"label":"QUOT", "x":11.75, "y":3.25}, + {"label":"NUHS", "x":12.75, "y":3.25}, + {"label":"ENT", "x":13.75, "y":3.25, "w":1.25}, + {"label":"PGUP", "x":15, "y":3.25}, + {"label":"P4", "x":16.25, "y":3.25}, + {"label":"P5", "x":17.25, "y":3.25}, + {"label":"P6", "x":18.25, "y":3.25}, + {"label":"PPLS", "x":19.25, "y":2.25, "h":2}, + {"label":"LSFT", "x":0, "y":4.25, "w":1.25}, + {"label":"NUBS", "x":1.25, "y":4.25}, + {"label":"Z", "x":2.25, "y":4.25}, + {"label":"X", "x":3.25, "y":4.25}, + {"label":"C", "x":4.25, "y":4.25}, + {"label":"V", "x":5.25, "y":4.25}, + {"label":"B", "x":6.25, "y":4.25}, + {"label":"N", "x":7.25, "y":4.25}, + {"label":"M", "x":8.25, "y":4.25}, + {"label":"COMM", "x":9.25, "y":4.25}, + {"label":"DOT", "x":10.25, "y":4.25}, + {"label":"SLSH", "x":11.25, "y":4.25}, + {"label":"RSFT", "x":12.25, "y":4.25, "w":1.75}, + {"label":"UP", "x":14, "y":4.25}, + {"label":"PGDN", "x":15, "y":4.25}, + {"label":"P1", "x":16.25, "y":4.25}, + {"label":"P2", "x":17.25, "y":4.25}, + {"label":"P3", "x":18.25, "y":4.25}, + {"label":"LCTL", "x":0, "y":5.25, "w":1.25}, + {"label":"LGUI", "x":1.25, "y":5.25, "w":1.25}, + {"label":"LALT", "x":2.5, "y":5.25, "w":1.25}, + {"label":"SPC", "x":3.75, "y":5.25, "w":6.25}, + {"label":"RALT", "x":10, "y":5.25}, + {"label":"APP", "x":11, "y":5.25}, + {"label":"RCTL", "x":12, "y":5.25}, + {"label":"LEFT", "x":13, "y":5.25}, + {"label":"DOWN", "x":14, "y":5.25}, + {"label":"RGHT", "x":15, "y":5.25}, + {"label":"P0", "x":16.25, "y":5.25, "w":2}, + {"label":"PDOT", "x":18.25, "y":5.25}, + {"label":"PENT", "x":19.25, "y":4.25, "h":2} + ] + }, + "LAYOUT_ansi": { + "layout": [ + {"label":"ESC", "x":0, "y":0}, + {"label":"F1", "x":1, "y":0}, + {"label":"F2", "x":2, "y":0}, + {"label":"F3", "x":3, "y":0}, + {"label":"F4", "x":4, "y":0}, + {"label":"F5", "x":5, "y":0}, + {"label":"F6", "x":6, "y":0}, + {"label":"F7", "x":7, "y":0}, + {"label":"F8", "x":8, "y":0}, + {"label":"F9", "x":9, "y":0}, + {"label":"F10", "x":10, "y":0}, + {"label":"F11", "x":11, "y":0}, + {"label":"F12", "x":12, "y":0}, + {"label":"PSCR", "x":13, "y":0}, + {"label":"HOME", "x":14, "y":0}, + {"label":"END", "x":15, "y":0}, + {"label":"NO", "x":16.25, "y":0}, + {"label":"NO", "x":17.25, "y":0}, + {"label":"NO", "x":18.25, "y":0}, + {"label":"NO", "x":19.25, "y":0}, + {"label":"GRV", "x":0, "y":1.25}, + {"label":"1", "x":1, "y":1.25}, + {"label":"2", "x":2, "y":1.25}, + {"label":"3", "x":3, "y":1.25}, + {"label":"4", "x":4, "y":1.25}, + {"label":"5", "x":5, "y":1.25}, + {"label":"6", "x":6, "y":1.25}, + {"label":"7", "x":7, "y":1.25}, + {"label":"8", "x":8, "y":1.25}, + {"label":"9", "x":9, "y":1.25}, + {"label":"0", "x":10, "y":1.25}, + {"label":"MINS", "x":11, "y":1.25}, + {"label":"EQL", "x":12, "y":1.25}, + {"label":"BSPC", "x":13, "y":1.25, "w":2}, + {"label":"DEL", "x":15, "y":1.25}, + {"label":"NLCK", "x":16.25, "y":1.25}, + {"label":"PSLS", "x":17.25, "y":1.25}, + {"label":"PAST", "x":18.25, "y":1.25}, + {"label":"PMNS", "x":19.25, "y":1.25}, + {"label":"TAB", "x":0, "y":2.25, "w":1.5}, + {"label":"Q", "x":1.5, "y":2.25}, + {"label":"W", "x":2.5, "y":2.25}, + {"label":"E", "x":3.5, "y":2.25}, + {"label":"R", "x":4.5, "y":2.25}, + {"label":"T", "x":5.5, "y":2.25}, + {"label":"Y", "x":6.5, "y":2.25}, + {"label":"U", "x":7.5, "y":2.25}, + {"label":"I", "x":8.5, "y":2.25}, + {"label":"O", "x":9.5, "y":2.25}, + {"label":"P", "x":10.5, "y":2.25}, + {"label":"LBRC", "x":11.5, "y":2.25}, + {"label":"RBRC", "x":12.5, "y":2.25}, + {"label":"BSLS", "x":13.5, "y":2.25, "w":1.5}, + {"label":"INS", "x":15, "y":2.25}, + {"label":"P7", "x":16.25, "y":2.25}, + {"label":"P8", "x":17.25, "y":2.25}, + {"label":"P9", "x":18.25, "y":2.25}, + {"label":"CAPS", "x":0, "y":3.25, "w":1.75}, + {"label":"A", "x":1.75, "y":3.25}, + {"label":"S", "x":2.75, "y":3.25}, + {"label":"D", "x":3.75, "y":3.25}, + {"label":"F", "x":4.75, "y":3.25}, + {"label":"G", "x":5.75, "y":3.25}, + {"label":"H", "x":6.75, "y":3.25}, + {"label":"J", "x":7.75, "y":3.25}, + {"label":"K", "x":8.75, "y":3.25}, + {"label":"L", "x":9.75, "y":3.25}, + {"label":"SCLN", "x":10.75, "y":3.25}, + {"label":"QUOT", "x":11.75, "y":3.25}, + {"label":"ENT", "x":12.75, "y":3.25, "w":2.25}, + {"label":"PGUP", "x":15, "y":3.25}, + {"label":"P4", "x":16.25, "y":3.25}, + {"label":"P5", "x":17.25, "y":3.25}, + {"label":"P6", "x":18.25, "y":3.25}, + {"label":"PPLS", "x":19.25, "y":2.25, "h":2}, + {"label":"LSFT", "x":0, "y":4.25, "w":2.25}, + {"label":"Z", "x":2.25, "y":4.25}, + {"label":"X", "x":3.25, "y":4.25}, + {"label":"C", "x":4.25, "y":4.25}, + {"label":"V", "x":5.25, "y":4.25}, + {"label":"B", "x":6.25, "y":4.25}, + {"label":"N", "x":7.25, "y":4.25}, + {"label":"M", "x":8.25, "y":4.25}, + {"label":"COMM", "x":9.25, "y":4.25}, + {"label":"DOT", "x":10.25, "y":4.25}, + {"label":"SLSH", "x":11.25, "y":4.25}, + {"label":"RSFT", "x":12.25, "y":4.25, "w":1.75}, + {"label":"UP", "x":14, "y":4.25}, + {"label":"PGDN", "x":15, "y":4.25}, + {"label":"P1", "x":16.25, "y":4.25}, + {"label":"P2", "x":17.25, "y":4.25}, + {"label":"P3", "x":18.25, "y":4.25}, + {"label":"LCTL", "x":0, "y":5.25, "w":1.25}, + {"label":"LGUI", "x":1.25, "y":5.25, "w":1.25}, + {"label":"LALT", "x":2.5, "y":5.25, "w":1.25}, + {"label":"SPC", "x":3.75, "y":5.25, "w":6.25}, + {"label":"RALT", "x":10, "y":5.25}, + {"label":"APP", "x":11, "y":5.25}, + {"label":"RCTL", "x":12, "y":5.25}, + {"label":"LEFT", "x":13, "y":5.25}, + {"label":"DOWN", "x":14, "y":5.25}, + {"label":"RGHT", "x":15, "y":5.25}, + {"label":"P0", "x":16.25, "y":5.25, "w":2}, + {"label":"PDOT", "x":18.25, "y":5.25}, + {"label":"PENT", "x":19.25, "y":4.25, "h":2} + ] + }, + "LAYOUT_iso": { + "layout": [ + {"label":"ESC", "x":0, "y":0}, + {"label":"F1", "x":1, "y":0}, + {"label":"F2", "x":2, "y":0}, + {"label":"F3", "x":3, "y":0}, + {"label":"F4", "x":4, "y":0}, + {"label":"F5", "x":5, "y":0}, + {"label":"F6", "x":6, "y":0}, + {"label":"F7", "x":7, "y":0}, + {"label":"F8", "x":8, "y":0}, + {"label":"F9", "x":9, "y":0}, + {"label":"F10", "x":10, "y":0}, + {"label":"F11", "x":11, "y":0}, + {"label":"F12", "x":12, "y":0}, + {"label":"PSCR", "x":13, "y":0}, + {"label":"HOME", "x":14, "y":0}, + {"label":"END", "x":15, "y":0}, + {"label":"NO", "x":16.25, "y":0}, + {"label":"NO", "x":17.25, "y":0}, + {"label":"NO", "x":18.25, "y":0}, + {"label":"NO", "x":19.25, "y":0}, + {"label":"GRV", "x":0, "y":1.25}, + {"label":"1", "x":1, "y":1.25}, + {"label":"2", "x":2, "y":1.25}, + {"label":"3", "x":3, "y":1.25}, + {"label":"4", "x":4, "y":1.25}, + {"label":"5", "x":5, "y":1.25}, + {"label":"6", "x":6, "y":1.25}, + {"label":"7", "x":7, "y":1.25}, + {"label":"8", "x":8, "y":1.25}, + {"label":"9", "x":9, "y":1.25}, + {"label":"0", "x":10, "y":1.25}, + {"label":"MINS", "x":11, "y":1.25}, + {"label":"EQL", "x":12, "y":1.25}, + {"label":"BSPC", "x":13, "y":1.25, "w":2}, + {"label":"DEL", "x":15, "y":1.25}, + {"label":"NLCK", "x":16.25, "y":1.25}, + {"label":"PSLS", "x":17.25, "y":1.25}, + {"label":"PAST", "x":18.25, "y":1.25}, + {"label":"PMNS", "x":19.25, "y":1.25}, + {"label":"TAB", "x":0, "y":2.25, "w":1.5}, + {"label":"Q", "x":1.5, "y":2.25}, + {"label":"W", "x":2.5, "y":2.25}, + {"label":"E", "x":3.5, "y":2.25}, + {"label":"R", "x":4.5, "y":2.25}, + {"label":"T", "x":5.5, "y":2.25}, + {"label":"Y", "x":6.5, "y":2.25}, + {"label":"U", "x":7.5, "y":2.25}, + {"label":"I", "x":8.5, "y":2.25}, + {"label":"O", "x":9.5, "y":2.25}, + {"label":"P", "x":10.5, "y":2.25}, + {"label":"LBRC", "x":11.5, "y":2.25}, + {"label":"RBRC", "x":12.5, "y":2.25}, + {"label":"INS", "x":15, "y":2.25}, + {"label":"P7", "x":16.25, "y":2.25}, + {"label":"P8", "x":17.25, "y":2.25}, + {"label":"P9", "x":18.25, "y":2.25}, + {"label":"CAPS", "x":0, "y":3.25, "w":1.75}, + {"label":"A", "x":1.75, "y":3.25}, + {"label":"S", "x":2.75, "y":3.25}, + {"label":"D", "x":3.75, "y":3.25}, + {"label":"F", "x":4.75, "y":3.25}, + {"label":"G", "x":5.75, "y":3.25}, + {"label":"H", "x":6.75, "y":3.25}, + {"label":"J", "x":7.75, "y":3.25}, + {"label":"K", "x":8.75, "y":3.25}, + {"label":"L", "x":9.75, "y":3.25}, + {"label":"SCLN", "x":10.75, "y":3.25}, + {"label":"QUOT", "x":11.75, "y":3.25}, + {"label":"NUHS", "x":12.75, "y":3.25}, + {"label":"ENT", "x":13.75, "y":2.25, "w":1.25, "h":2}, + {"label":"PGUP", "x":15, "y":3.25}, + {"label":"P4", "x":16.25, "y":3.25}, + {"label":"P5", "x":17.25, "y":3.25}, + {"label":"P6", "x":18.25, "y":3.25}, + {"label":"PPLS", "x":19.25, "y":2.25, "h":2}, + {"label":"LSFT", "x":0, "y":4.25, "w":1.25}, + {"label":"NUBS", "x":1.25, "y":4.25}, + {"label":"Z", "x":2.25, "y":4.25}, + {"label":"X", "x":3.25, "y":4.25}, + {"label":"C", "x":4.25, "y":4.25}, + {"label":"V", "x":5.25, "y":4.25}, + {"label":"B", "x":6.25, "y":4.25}, + {"label":"N", "x":7.25, "y":4.25}, + {"label":"M", "x":8.25, "y":4.25}, + {"label":"COMM", "x":9.25, "y":4.25}, + {"label":"DOT", "x":10.25, "y":4.25}, + {"label":"SLSH", "x":11.25, "y":4.25}, + {"label":"RSFT", "x":12.25, "y":4.25, "w":1.75}, + {"label":"UP", "x":14, "y":4.25}, + {"label":"PGDN", "x":15, "y":4.25}, + {"label":"P1", "x":16.25, "y":4.25}, + {"label":"P2", "x":17.25, "y":4.25}, + {"label":"P3", "x":18.25, "y":4.25}, + {"label":"LCTL", "x":0, "y":5.25, "w":1.25}, + {"label":"LGUI", "x":1.25, "y":5.25, "w":1.25}, + {"label":"LALT", "x":2.5, "y":5.25, "w":1.25}, + {"label":"SPC", "x":3.75, "y":5.25, "w":6.25}, + {"label":"RALT", "x":10, "y":5.25}, + {"label":"APP", "x":11, "y":5.25}, + {"label":"RCTL", "x":12, "y":5.25}, + {"label":"LEFT", "x":13, "y":5.25}, + {"label":"DOWN", "x":14, "y":5.25}, + {"label":"RGHT", "x":15, "y":5.25}, + {"label":"P0", "x":16.25, "y":5.25, "w":2}, + {"label":"PDOT", "x":18.25, "y":5.25}, + {"label":"PENT", "x":19.25, "y":4.25, "h":2} + ] + } + } +} diff --git a/keyboards/bminiex/keymaps/ansi/keymap.c b/keyboards/bminiex/keymaps/ansi/keymap.c new file mode 100644 index 000000000..12c0714b1 --- /dev/null +++ b/keyboards/bminiex/keymaps/ansi/keymap.c @@ -0,0 +1,29 @@ +/* +Copyright 2017 Luiz Ribeiro + +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 . +*/ + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_ansi( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_HOME, KC_END, KC_NO, KC_NO, KC_NO, KC_NO, \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_INS, KC_P7, KC_P8, KC_P9, \ + KC_LCAP, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP, KC_P4, KC_P5, KC_P6, KC_PPLS, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN, KC_P1, KC_P2, KC_P3, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT \ + ) +}; diff --git a/keyboards/bminiex/keymaps/ansi/readme.md b/keyboards/bminiex/keymaps/ansi/readme.md new file mode 100644 index 000000000..853fa05c5 --- /dev/null +++ b/keyboards/bminiex/keymaps/ansi/readme.md @@ -0,0 +1,17 @@ +# ansi + +An ANSI-layout keymap based on the default. + + ,-------------------------------------------------------------------------------. + |Esc|F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12|PSc|Hm |End|NO |NO |NO |NO | + |-------------------------------------------------------------------------------| + |` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 |- |= |Bksp |Del|NLck|P/|P* |P- | + |-------------------------------------------------------------------------------| + |Tab |Q |W |E |R |T |Y |U |I |O |P |[ |] |\ |Ins|P7 |P8 |P9 | | + |---------------------------------------------------------------------------|P+ | + |CapsLk|A |S |D |F |G |H |J |K |L |; |' |Enter |PgU|P4 |P5 |P6 | | + |-------------------------------------------------------------------------------| + |Shift |Z |X |C |V |B |N |M |, |. |/ |Shift |Up |PgD|P1 |P2 |P3 | | + |---------------------------------------------------------------------------|Ent| + |Ctrl|GUI |Alt |Space |Alt|App|Ctl|Lft|Dwn|Rgt|P0 |P. | | + `-------------------------------------------------------------------------------' diff --git a/keyboards/bminiex/keymaps/iso/keymap.c b/keyboards/bminiex/keymaps/iso/keymap.c new file mode 100644 index 000000000..aa4ddf063 --- /dev/null +++ b/keyboards/bminiex/keymaps/iso/keymap.c @@ -0,0 +1,29 @@ +/* +Copyright 2017 Luiz Ribeiro + +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 . +*/ + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_iso( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_HOME, KC_END, KC_NO, KC_NO, KC_NO, KC_NO, \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_INS, KC_P7, KC_P8, KC_P9, \ + KC_LCAP, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_PGUP, KC_P4, KC_P5, KC_P6, KC_PPLS, \ + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN, KC_P1, KC_P2, KC_P3, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT \ + ) +}; diff --git a/keyboards/bminiex/keymaps/iso/readme.md b/keyboards/bminiex/keymaps/iso/readme.md new file mode 100644 index 000000000..74c42a618 --- /dev/null +++ b/keyboards/bminiex/keymaps/iso/readme.md @@ -0,0 +1,17 @@ +# iso + +An ISO-layout keymap based on the default. + + ,-------------------------------------------------------------------------------. + |Esc|F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12|PSc|Hm |End|NO |NO |NO |NO | + |-------------------------------------------------------------------------------| + |` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 |- |= |Bksp |Del|NLck|P/|P* |P- | + |-------------------------------------------------------------------------------| + |Tab |Q |W |E |R |T |Y |U |I |O |P |[ |] | |Ins|P7 |P8 |P9 | | + |------------------------------------------------------.Ent |---------------|P+ | + |CapsLk|A |S |D |F |G |H |J |K |L |; |' |# | |PgU|P4 |P5 |P6 | | + |-------------------------------------------------------------------------------| + |Sft |\ |Z |X |C |V |B |N |M |, |. |/ |Shift |Up |PgD|P1 |P2 |P3 | | + |---------------------------------------------------------------------------|Ent| + |Ctrl|GUI |Alt |Space |Alt|App|Ctl|Lft|Dwn|Rgt|P0 |P. | | + `-------------------------------------------------------------------------------' From 118d5cc03f587dcf97740606f8b4552749f849bc Mon Sep 17 00:00:00 2001 From: patrickmt <40182064+patrickmt@users.noreply.github.com> Date: Fri, 14 Dec 2018 13:37:37 -0500 Subject: [PATCH 695/788] Fix macro redefinition for GNUC compilers > 6 GNUC compilers greater than version 6 already have the macro __always_inline defined. This fix checks GNUC version before defining the macro itself. --- tmk_core/protocol/arm_atsam/usb/compiler.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmk_core/protocol/arm_atsam/usb/compiler.h b/tmk_core/protocol/arm_atsam/usb/compiler.h index d33843986..7d8350896 100644 --- a/tmk_core/protocol/arm_atsam/usb/compiler.h +++ b/tmk_core/protocol/arm_atsam/usb/compiler.h @@ -136,7 +136,7 @@ */ #if defined(__CC_ARM) # define __always_inline __forceinline -#elif (defined __GNUC__) +#elif (defined __GNUC__ && __GNUC__ <= 6) # define __always_inline __attribute__((__always_inline__)) #elif (defined __ICCARM__) # define __always_inline _Pragma("inline=forced") From 306f23dc5119d864eb29cfef99ededb81075368e Mon Sep 17 00:00:00 2001 From: zvecr Date: Fri, 14 Dec 2018 20:49:33 +0000 Subject: [PATCH 696/788] Document the correct path to the split keyboard EEPROM files (#4585) * Document the correct path to the split keyboard EEPROM files * Document the correct path to the split keyboard EEPROM files --- keyboards/handwired/dactyl_manuform/readme.md | 4 ++-- keyboards/handwired/not_so_minidox/readme.md | 4 ++-- keyboards/handwired/xealous/readme.md | 4 ++-- keyboards/lets_split/readme.md | 4 ++-- keyboards/minidox/readme.md | 4 ++-- keyboards/orthodox/readme.md | 2 +- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/keyboards/handwired/dactyl_manuform/readme.md b/keyboards/handwired/dactyl_manuform/readme.md index 00288a876..0d08c67a0 100644 --- a/keyboards/handwired/dactyl_manuform/readme.md +++ b/keyboards/handwired/dactyl_manuform/readme.md @@ -131,13 +131,13 @@ file will run on both hands instead of having to flash left and right handed versions of the firmware to each half. To flash the EEPROM file for the left half run: ``` -avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:eeprom-lefthand.eep +avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:"./quantum/split_common/eeprom-lefthand.eep" // or the equivalent in dfu-programmer ``` and similarly for right half ``` -avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:eeprom-righhand.eep +avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:"./quantum/split_common/eeprom-righthand.eep" // or the equivalent in dfu-programmer ``` diff --git a/keyboards/handwired/not_so_minidox/readme.md b/keyboards/handwired/not_so_minidox/readme.md index 22d355873..bd4060735 100644 --- a/keyboards/handwired/not_so_minidox/readme.md +++ b/keyboards/handwired/not_so_minidox/readme.md @@ -50,13 +50,13 @@ file will run on both hands instead of having to flash left and right handed versions of the firmware to each half. To flash the EEPROM file for the left half run: ``` -avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:eeprom-lefthand.eep +avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:"./quantum/split_common/eeprom-lefthand.eep" // or the equivalent in dfu-programmer ``` and similarly for right half ``` -avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:eeprom-righhand.eep +avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:"./quantum/split_common/eeprom-righthand.eep" // or the equivalent in dfu-programmer ``` diff --git a/keyboards/handwired/xealous/readme.md b/keyboards/handwired/xealous/readme.md index 97bebbfe3..14947cc90 100644 --- a/keyboards/handwired/xealous/readme.md +++ b/keyboards/handwired/xealous/readme.md @@ -130,13 +130,13 @@ file will run on both hands instead of having to flash left and right handed versions of the firmware to each half. To flash the EEPROM file for the left half run: ``` -avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:eeprom-lefthand.eep +avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:"./quantum/split_common/eeprom-lefthand.eep" // or the equivalent in dfu-programmer ``` and similarly for right half ``` -avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:eeprom-righhand.eep +avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:"./quantum/split_common/eeprom-righthand.eep" // or the equivalent in dfu-programmer ``` diff --git a/keyboards/lets_split/readme.md b/keyboards/lets_split/readme.md index 80fe08b93..2a2b95c09 100644 --- a/keyboards/lets_split/readme.md +++ b/keyboards/lets_split/readme.md @@ -151,13 +151,13 @@ file will run on both hands instead of having to flash left and right handed versions of the firmware to each half. To flash the EEPROM file for the left half run: ``` -avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:eeprom-lefthand.eep +avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:"./quantum/split_common/eeprom-lefthand.eep" // or the equivalent in dfu-programmer ``` and similarly for right half ``` -avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:eeprom-righhand.eep +avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:"./quantum/split_common/eeprom-righthand.eep" // or the equivalent in dfu-programmer ``` diff --git a/keyboards/minidox/readme.md b/keyboards/minidox/readme.md index 859504a43..9ec306421 100644 --- a/keyboards/minidox/readme.md +++ b/keyboards/minidox/readme.md @@ -54,13 +54,13 @@ file will run on both hands instead of having to flash left and right handed versions of the firmware to each half. To flash the EEPROM file for the left half run: ``` -avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:eeprom-lefthand.eep +avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:"./quantum/split_common/eeprom-lefthand.eep" // or the equivalent in dfu-programmer ``` and similarly for right half ``` -avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:eeprom-righhand.eep +avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:"./quantum/split_common/eeprom-righthand.eep" // or the equivalent in dfu-programmer ``` diff --git a/keyboards/orthodox/readme.md b/keyboards/orthodox/readme.md index 0c47dd9c4..8bf60a9bd 100644 --- a/keyboards/orthodox/readme.md +++ b/keyboards/orthodox/readme.md @@ -125,7 +125,7 @@ EEPROM for the left and right halves. The EEPROM is used to store whether the half is left handed or right handed. This makes it so that the same firmware -file will run on both hands instead of having to flash [left](../lets_split/eeprom-lefthand.eep) and [right](../lets_split/eeprom-righthand.eep) handed +file will run on both hands instead of having to flash [left](../../quantum/split_common/eeprom-lefthand.eep) and [right](../../quantum/split_common/eeprom-righthand.eep) handed versions of the firmware to each half. To flash the EEPROM file for the left half run: ``` From 4446f86bfd273512d473d33c46d99690db5fbc51 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Fri, 14 Dec 2018 13:01:04 -0800 Subject: [PATCH 697/788] Keyboard: Bpiphany Frosty Flake Refactor, Configurator support and readme cleanup (#4648) * Frosty Flake: layout macro refactor - frosty_flake.h updated to use #pragma once - KEYMAP renamed to LAYOUT - KEYMAP_TKL renamed to LAYOUT_tkl * Frosty Flake: keymap refactor - config.h files updated to #pragma once - deleted deprecated build script rules from rules.mk - keymap.c files: - #include QMK_KEYBOARD_H - updated layout macro name - white space changes for readability * Frosty Flake: Configurator support * Frosty Flake: readme cleanup - Fixed Hardware Availability link (old link was 404) - tiny grammar fix (colon missing on compile-and-flash instructions) --- .../bpiphany/frosty_flake/frosty_flake.h | 10 +- keyboards/bpiphany/frosty_flake/info.json | 301 ++++++++++++++++++ .../frosty_flake/keymaps/QFR_JM/config.h | 11 +- .../frosty_flake/keymaps/QFR_JM/keymap.c | 31 +- .../frosty_flake/keymaps/default/config.h | 7 +- .../frosty_flake/keymaps/default/keymap.c | 19 +- .../frosty_flake/keymaps/default/rules.mk | 8 +- .../frosty_flake/keymaps/nikchi/config.h | 11 +- .../frosty_flake/keymaps/nikchi/keymap.c | 63 ++-- .../frosty_flake/keymaps/nikchi/rules.mk | 8 +- .../frosty_flake/keymaps/tkl/config.h | 7 +- .../frosty_flake/keymaps/tkl/keymap.c | 4 +- keyboards/bpiphany/frosty_flake/readme.md | 4 +- 13 files changed, 371 insertions(+), 113 deletions(-) create mode 100644 keyboards/bpiphany/frosty_flake/info.json diff --git a/keyboards/bpiphany/frosty_flake/frosty_flake.h b/keyboards/bpiphany/frosty_flake/frosty_flake.h index 953172a8b..824287396 100644 --- a/keyboards/bpiphany/frosty_flake/frosty_flake.h +++ b/keyboards/bpiphany/frosty_flake/frosty_flake.h @@ -1,5 +1,4 @@ -#ifndef FROSTY_FLAKE_H -#define FROSTY_FLAKE_H +#pragma once #include "quantum.h" @@ -26,7 +25,7 @@ | A4 | P2 | C6 | K6 | C0 | M3 | D0 | A1 | | O0 | K0 | L0 | | L6 | Q6 | | `-------------------------------------------------------------------------' `--------------' `-------------------' */ -#define KEYMAP( \ +#define LAYOUT( \ KJ6, KI4, KH4, KH2, KH6, KA7, KE6, KD2, KD4, KB4, KB7, KB6, KB0, KC7, KC5, KA5, \ KJ4, KJ7, KI7, KH7, KG7, KG4, KF4, KF7, KE7, KD7, KR7, KR4, KE4, KB2, KL4, KO4, KQ4, KK1, KL1, KQ1, KQ0, \ KJ2, KJ5, KI5, KH5, KG5, KG2, KF2, KF5, KE5, KD5, KR5, KR2, KE2, KB3, KK4, KO7, KQ7, KK5, KL5, KQ5, KO5, \ @@ -66,7 +65,7 @@ `-------------------------------------------------------------------------' `--------------' */ -#define KEYMAP_TKL( \ +#define LAYOUT_tkl( \ KJ6, KI4, KH4, KH2, KH6, KA7, KE6, KD2, KD4, KB4, KB7, KB6, KB0, KC7, KC5, KA5, \ KJ4, KJ7, KI7, KH7, KG7, KG4, KF4, KF7, KE7, KD7, KR7, KR4, KE4, KB2, KL4, KO4, KQ4, \ KJ2, KJ5, KI5, KH5, KG5, KG2, KF2, KF5, KE5, KD5, KR5, KR2, KE2, KB3, KK4, KO7, KQ7, \ @@ -94,7 +93,7 @@ KI2, KJ3, KI3, KH3, KG3, KG6, KF6, KF3, KE3, KD3, KR3, KR6, KB1, \ KN2, KJ1, KI1, KH1, KG1, KG0, KF0, KF1, KE1, KD1, KR0, KN3, KO6, \ KA4, KP2, KC6, KK6, KC0, KM3, KD0, KA1, KO0, KK0, KL0 \ -) KEYMAP_TKL( \ +) LAYOUT_tkl( \ KJ6, KI4, KH4, KH2, KH6, KA7, KE6, KD2, KD4, KB4, KB7, KB6, KB0, KC7, KC5, KA5, \ KJ4, KJ7, KI7, KH7, KG7, KG4, KF4, KF7, KE7, KD7, KR7, KR4, KE4, KB2, KL4, KO4, KQ4, \ KJ2, KJ5, KI5, KH5, KG5, KG2, KF2, KF5, KE5, KD5, KR5, KR2, KE2, KB3, KK4, KO7, KQ7, \ @@ -103,4 +102,3 @@ KA4, KP2, KC6, KK6, KC0, KM3, KD0, KA1, KO0, KK0, KL0 \ ) -#endif diff --git a/keyboards/bpiphany/frosty_flake/info.json b/keyboards/bpiphany/frosty_flake/info.json new file mode 100644 index 000000000..15fb23d73 --- /dev/null +++ b/keyboards/bpiphany/frosty_flake/info.json @@ -0,0 +1,301 @@ +{ + "keyboard_name": "Frosty Flake", + "url": "", + "maintainer": "qmk", + "width": 22.5, + "height": 6.5, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"Esc", "x":0, "y":0}, + {"label":"F1", "x":2, "y":0}, + {"label":"F2", "x":3, "y":0}, + {"label":"F3", "x":4, "y":0}, + {"label":"F4", "x":5, "y":0}, + {"label":"F5", "x":6.5, "y":0}, + {"label":"F6", "x":7.5, "y":0}, + {"label":"F7", "x":8.5, "y":0}, + {"label":"F8", "x":9.5, "y":0}, + {"label":"F9", "x":11, "y":0}, + {"label":"F10", "x":12, "y":0}, + {"label":"F11", "x":13, "y":0}, + {"label":"F12", "x":14, "y":0}, + {"label":"Print Screen", "x":15.25, "y":0}, + {"label":"Scroll Lock", "x":16.25, "y":0}, + {"label":"Pause", "x":17.25, "y":0}, + {"label":"`", "x":0, "y":1.5}, + {"label":"1", "x":1, "y":1.5}, + {"label":"2", "x":2, "y":1.5}, + {"label":"3", "x":3, "y":1.5}, + {"label":"4", "x":4, "y":1.5}, + {"label":"5", "x":5, "y":1.5}, + {"label":"6", "x":6, "y":1.5}, + {"label":"7", "x":7, "y":1.5}, + {"label":"8", "x":8, "y":1.5}, + {"label":"9", "x":9, "y":1.5}, + {"label":"0", "x":10, "y":1.5}, + {"label":"-", "x":11, "y":1.5}, + {"label":"=", "x":12, "y":1.5}, + {"label":"Backspace", "x":13, "y":1.5, "w":2}, + {"label":"Insert", "x":15.25, "y":1.5}, + {"label":"Home", "x":16.25, "y":1.5}, + {"label":"Page Up", "x":17.25, "y":1.5}, + {"label":"Num Lock", "x":18.5, "y":1.5}, + {"label":"/", "x":19.5, "y":1.5}, + {"label":"*", "x":20.5, "y":1.5}, + {"label":"-", "x":21.5, "y":1.5}, + {"label":"Tab", "x":0, "y":2.5, "w":1.5}, + {"label":"Q", "x":1.5, "y":2.5}, + {"label":"W", "x":2.5, "y":2.5}, + {"label":"E", "x":3.5, "y":2.5}, + {"label":"R", "x":4.5, "y":2.5}, + {"label":"T", "x":5.5, "y":2.5}, + {"label":"Y", "x":6.5, "y":2.5}, + {"label":"U", "x":7.5, "y":2.5}, + {"label":"I", "x":8.5, "y":2.5}, + {"label":"O", "x":9.5, "y":2.5}, + {"label":"P", "x":10.5, "y":2.5}, + {"label":"[", "x":11.5, "y":2.5}, + {"label":"]", "x":12.5, "y":2.5}, + {"label":"\\", "x":13.5, "y":2.5, "w":1.5}, + {"label":"Delete", "x":15.25, "y":2.5}, + {"label":"End", "x":16.25, "y":2.5}, + {"label":"Page Down", "x":17.25, "y":2.5}, + {"label":"7", "x":18.5, "y":2.5}, + {"label":"8", "x":19.5, "y":2.5}, + {"label":"9", "x":20.5, "y":2.5}, + {"label":"+", "x":21.5, "y":2.5, "h":2}, + {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75}, + {"label":"A", "x":1.75, "y":3.5}, + {"label":"S", "x":2.75, "y":3.5}, + {"label":"D", "x":3.75, "y":3.5}, + {"label":"F", "x":4.75, "y":3.5}, + {"label":"G", "x":5.75, "y":3.5}, + {"label":"H", "x":6.75, "y":3.5}, + {"label":"J", "x":7.75, "y":3.5}, + {"label":"K", "x":8.75, "y":3.5}, + {"label":"L", "x":9.75, "y":3.5}, + {"label":";", "x":10.75, "y":3.5}, + {"label":"'", "x":11.75, "y":3.5}, + {"label":"Enter", "x":12.75, "y":3.5, "w":2.25}, + {"label":"4", "x":18.5, "y":3.5}, + {"label":"5", "x":19.5, "y":3.5}, + {"label":"6", "x":20.5, "y":3.5}, + {"label":"Shift", "x":0, "y":4.5, "w":1.25}, + {"label":"ISO \\", "x":1.25, "y":4.5}, + {"label":"Z", "x":2.25, "y":4.5}, + {"label":"X", "x":3.25, "y":4.5}, + {"label":"C", "x":4.25, "y":4.5}, + {"label":"V", "x":5.25, "y":4.5}, + {"label":"B", "x":6.25, "y":4.5}, + {"label":"N", "x":7.25, "y":4.5}, + {"label":"M", "x":8.25, "y":4.5}, + {"label":",", "x":9.25, "y":4.5}, + {"label":".", "x":10.25, "y":4.5}, + {"label":"/", "x":11.25, "y":4.5}, + {"label":"Shift", "x":12.25, "y":4.5, "w":2.75}, + {"label":"Up", "x":16.25, "y":4.5}, + {"label":"1", "x":18.5, "y":4.5}, + {"label":"2", "x":19.5, "y":4.5}, + {"label":"3", "x":20.5, "y":4.5}, + {"label":"Enter", "x":21.5, "y":4.5, "h":2}, + {"label":"Ctrl", "x":0, "y":5.5, "w":1.25}, + {"label":"GUI", "x":1.25, "y":5.5, "w":1.25}, + {"label":"Alt", "x":2.5, "y":5.5, "w":1.25}, + {"label":"Space", "x":3.75, "y":5.5, "w":6.25}, + {"label":"Alt", "x":10, "y":5.5, "w":1.25}, + {"label":"GUI", "x":11.25, "y":5.5, "w":1.25}, + {"label":"Menu", "x":12.5, "y":5.5, "w":1.25}, + {"label":"Ctrl", "x":13.75, "y":5.5, "w":1.25}, + {"label":"Left", "x":15.25, "y":5.5}, + {"label":"Down", "x":16.25, "y":5.5}, + {"label":"Right", "x":17.25, "y":5.5}, + {"label":"0", "x":18.5, "y":5.5, "w":2}, + {"label":".", "x":20.5, "y":5.5} + ] + }, + "LAYOUT_tkl": { + "layout": [ + {"label":"Esc", "x":0, "y":0}, + {"label":"F1", "x":2, "y":0}, + {"label":"F2", "x":3, "y":0}, + {"label":"F3", "x":4, "y":0}, + {"label":"F4", "x":5, "y":0}, + {"label":"F5", "x":6.5, "y":0}, + {"label":"F6", "x":7.5, "y":0}, + {"label":"F7", "x":8.5, "y":0}, + {"label":"F8", "x":9.5, "y":0}, + {"label":"F9", "x":11, "y":0}, + {"label":"F10", "x":12, "y":0}, + {"label":"F11", "x":13, "y":0}, + {"label":"F12", "x":14, "y":0}, + {"label":"Print Screen", "x":15.25, "y":0}, + {"label":"Scroll Lock", "x":16.25, "y":0}, + {"label":"Pause", "x":17.25, "y":0}, + {"label":"`", "x":0, "y":1.5}, + {"label":"1", "x":1, "y":1.5}, + {"label":"2", "x":2, "y":1.5}, + {"label":"3", "x":3, "y":1.5}, + {"label":"4", "x":4, "y":1.5}, + {"label":"5", "x":5, "y":1.5}, + {"label":"6", "x":6, "y":1.5}, + {"label":"7", "x":7, "y":1.5}, + {"label":"8", "x":8, "y":1.5}, + {"label":"9", "x":9, "y":1.5}, + {"label":"0", "x":10, "y":1.5}, + {"label":"-", "x":11, "y":1.5}, + {"label":"=", "x":12, "y":1.5}, + {"label":"Backspace", "x":13, "y":1.5, "w":2}, + {"label":"Insert", "x":15.25, "y":1.5}, + {"label":"Home", "x":16.25, "y":1.5}, + {"label":"Page Up", "x":17.25, "y":1.5}, + {"label":"Tab", "x":0, "y":2.5, "w":1.5}, + {"label":"Q", "x":1.5, "y":2.5}, + {"label":"W", "x":2.5, "y":2.5}, + {"label":"E", "x":3.5, "y":2.5}, + {"label":"R", "x":4.5, "y":2.5}, + {"label":"T", "x":5.5, "y":2.5}, + {"label":"Y", "x":6.5, "y":2.5}, + {"label":"U", "x":7.5, "y":2.5}, + {"label":"I", "x":8.5, "y":2.5}, + {"label":"O", "x":9.5, "y":2.5}, + {"label":"P", "x":10.5, "y":2.5}, + {"label":"[", "x":11.5, "y":2.5}, + {"label":"]", "x":12.5, "y":2.5}, + {"label":"\\", "x":13.5, "y":2.5, "w":1.5}, + {"label":"Delete", "x":15.25, "y":2.5}, + {"label":"End", "x":16.25, "y":2.5}, + {"label":"Page Down", "x":17.25, "y":2.5}, + {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75}, + {"label":"A", "x":1.75, "y":3.5}, + {"label":"S", "x":2.75, "y":3.5}, + {"label":"D", "x":3.75, "y":3.5}, + {"label":"F", "x":4.75, "y":3.5}, + {"label":"G", "x":5.75, "y":3.5}, + {"label":"H", "x":6.75, "y":3.5}, + {"label":"J", "x":7.75, "y":3.5}, + {"label":"K", "x":8.75, "y":3.5}, + {"label":"L", "x":9.75, "y":3.5}, + {"label":";", "x":10.75, "y":3.5}, + {"label":"'", "x":11.75, "y":3.5}, + {"label":"Enter", "x":12.75, "y":3.5, "w":2.25}, + {"label":"Shift", "x":0, "y":4.5, "w":1.25}, + {"label":"ISO \\", "x":1.25, "y":4.5}, + {"label":"Z", "x":2.25, "y":4.5}, + {"label":"X", "x":3.25, "y":4.5}, + {"label":"C", "x":4.25, "y":4.5}, + {"label":"V", "x":5.25, "y":4.5}, + {"label":"B", "x":6.25, "y":4.5}, + {"label":"N", "x":7.25, "y":4.5}, + {"label":"M", "x":8.25, "y":4.5}, + {"label":",", "x":9.25, "y":4.5}, + {"label":".", "x":10.25, "y":4.5}, + {"label":"/", "x":11.25, "y":4.5}, + {"label":"Shift", "x":12.25, "y":4.5, "w":2.75}, + {"label":"Up", "x":16.25, "y":4.5}, + {"label":"Ctrl", "x":0, "y":5.5, "w":1.25}, + {"label":"GUI", "x":1.25, "y":5.5, "w":1.25}, + {"label":"Alt", "x":2.5, "y":5.5, "w":1.25}, + {"label":"Space", "x":3.75, "y":5.5, "w":6.25}, + {"label":"Alt", "x":10, "y":5.5, "w":1.25}, + {"label":"GUI", "x":11.25, "y":5.5, "w":1.25}, + {"label":"Menu", "x":12.5, "y":5.5, "w":1.25}, + {"label":"Ctrl", "x":13.75, "y":5.5, "w":1.25}, + {"label":"Left", "x":15.25, "y":5.5}, + {"label":"Down", "x":16.25, "y":5.5}, + {"label":"Right", "x":17.25, "y":5.5} + ] + }, + "LAYOUT_tkl_ansi": { + "layout": [ + {"label":"Esc", "x":0, "y":0}, + {"label":"F1", "x":2, "y":0}, + {"label":"F2", "x":3, "y":0}, + {"label":"F3", "x":4, "y":0}, + {"label":"F4", "x":5, "y":0}, + {"label":"F5", "x":6.5, "y":0}, + {"label":"F6", "x":7.5, "y":0}, + {"label":"F7", "x":8.5, "y":0}, + {"label":"F8", "x":9.5, "y":0}, + {"label":"F9", "x":11, "y":0}, + {"label":"F10", "x":12, "y":0}, + {"label":"F11", "x":13, "y":0}, + {"label":"F12", "x":14, "y":0}, + {"label":"Print Screen", "x":15.25, "y":0}, + {"label":"Scroll Lock", "x":16.25, "y":0}, + {"label":"Pause", "x":17.25, "y":0}, + {"label":"`", "x":0, "y":1.5}, + {"label":"1", "x":1, "y":1.5}, + {"label":"2", "x":2, "y":1.5}, + {"label":"3", "x":3, "y":1.5}, + {"label":"4", "x":4, "y":1.5}, + {"label":"5", "x":5, "y":1.5}, + {"label":"6", "x":6, "y":1.5}, + {"label":"7", "x":7, "y":1.5}, + {"label":"8", "x":8, "y":1.5}, + {"label":"9", "x":9, "y":1.5}, + {"label":"0", "x":10, "y":1.5}, + {"label":"-", "x":11, "y":1.5}, + {"label":"=", "x":12, "y":1.5}, + {"label":"Backspace", "x":13, "y":1.5, "w":2}, + {"label":"Insert", "x":15.25, "y":1.5}, + {"label":"Home", "x":16.25, "y":1.5}, + {"label":"Page Up", "x":17.25, "y":1.5}, + {"label":"Tab", "x":0, "y":2.5, "w":1.5}, + {"label":"Q", "x":1.5, "y":2.5}, + {"label":"W", "x":2.5, "y":2.5}, + {"label":"E", "x":3.5, "y":2.5}, + {"label":"R", "x":4.5, "y":2.5}, + {"label":"T", "x":5.5, "y":2.5}, + {"label":"Y", "x":6.5, "y":2.5}, + {"label":"U", "x":7.5, "y":2.5}, + {"label":"I", "x":8.5, "y":2.5}, + {"label":"O", "x":9.5, "y":2.5}, + {"label":"P", "x":10.5, "y":2.5}, + {"label":"[", "x":11.5, "y":2.5}, + {"label":"]", "x":12.5, "y":2.5}, + {"label":"\\", "x":13.5, "y":2.5, "w":1.5}, + {"label":"Delete", "x":15.25, "y":2.5}, + {"label":"End", "x":16.25, "y":2.5}, + {"label":"Page Down", "x":17.25, "y":2.5}, + {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75}, + {"label":"A", "x":1.75, "y":3.5}, + {"label":"S", "x":2.75, "y":3.5}, + {"label":"D", "x":3.75, "y":3.5}, + {"label":"F", "x":4.75, "y":3.5}, + {"label":"G", "x":5.75, "y":3.5}, + {"label":"H", "x":6.75, "y":3.5}, + {"label":"J", "x":7.75, "y":3.5}, + {"label":"K", "x":8.75, "y":3.5}, + {"label":"L", "x":9.75, "y":3.5}, + {"label":";", "x":10.75, "y":3.5}, + {"label":"'", "x":11.75, "y":3.5}, + {"label":"Enter", "x":12.75, "y":3.5, "w":2.25}, + {"label":"Shift", "x":0, "y":4.5, "w":2.25}, + {"label":"Z", "x":2.25, "y":4.5}, + {"label":"X", "x":3.25, "y":4.5}, + {"label":"C", "x":4.25, "y":4.5}, + {"label":"V", "x":5.25, "y":4.5}, + {"label":"B", "x":6.25, "y":4.5}, + {"label":"N", "x":7.25, "y":4.5}, + {"label":"M", "x":8.25, "y":4.5}, + {"label":",", "x":9.25, "y":4.5}, + {"label":".", "x":10.25, "y":4.5}, + {"label":"/", "x":11.25, "y":4.5}, + {"label":"Shift", "x":12.25, "y":4.5, "w":2.75}, + {"label":"Up", "x":16.25, "y":4.5}, + {"label":"Ctrl", "x":0, "y":5.5, "w":1.25}, + {"label":"GUI", "x":1.25, "y":5.5, "w":1.25}, + {"label":"Alt", "x":2.5, "y":5.5, "w":1.25}, + {"label":"Space", "x":3.75, "y":5.5, "w":6.25}, + {"label":"Alt", "x":10, "y":5.5, "w":1.25}, + {"label":"GUI", "x":11.25, "y":5.5, "w":1.25}, + {"label":"Menu", "x":12.5, "y":5.5, "w":1.25}, + {"label":"Ctrl", "x":13.75, "y":5.5, "w":1.25}, + {"label":"Left", "x":15.25, "y":5.5}, + {"label":"Down", "x":16.25, "y":5.5}, + {"label":"Right", "x":17.25, "y":5.5} + ] + } + } +} \ No newline at end of file diff --git a/keyboards/bpiphany/frosty_flake/keymaps/QFR_JM/config.h b/keyboards/bpiphany/frosty_flake/keymaps/QFR_JM/config.h index b25194014..017ead425 100644 --- a/keyboards/bpiphany/frosty_flake/keymaps/QFR_JM/config.h +++ b/keyboards/bpiphany/frosty_flake/keymaps/QFR_JM/config.h @@ -1,11 +1,4 @@ - -#define TAPPING_TERM 150 //reduce time required to register a held key - -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" +#pragma once // place overrides here - -#endif +#define TAPPING_TERM 150 //reduce time required to register a held key diff --git a/keyboards/bpiphany/frosty_flake/keymaps/QFR_JM/keymap.c b/keyboards/bpiphany/frosty_flake/keymaps/QFR_JM/keymap.c index 81899396a..684987e36 100644 --- a/keyboards/bpiphany/frosty_flake/keymaps/QFR_JM/keymap.c +++ b/keyboards/bpiphany/frosty_flake/keymaps/QFR_JM/keymap.c @@ -1,9 +1,4 @@ -#include "frosty_flake.h" -#include "action_layer.h" -#ifdef AUDIO_ENABLE - #include "audio.h" -#endif -#include "eeconfig.h" +#include QMK_KEYBOARD_H enum QFR_layers { _COLEMAK, @@ -27,7 +22,7 @@ enum custom_macros { }; const uint16_t PROGMEM fn_actions[] = { //ACTION_LAYER_TAP_TOGGLE requires that number of taps be defined in *config.h* - default set to 5 - [0] = ACTION_LAYER_TAP_KEY(_LOWER, KC_SPC), //Hold for momentary Lower layer, Tap for Space, + [0] = ACTION_LAYER_TAP_KEY(_LOWER, KC_SPC), //Hold for momentary Lower layer, Tap for Space, [1] = ACTION_LAYER_MOMENTARY(_MOUSE) //Hold for momentary MOUSE }; @@ -37,12 +32,8 @@ enum custom_macros { #define PIPE M(R_PIPE) #define POINT M(R_POINT) -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[_COLEMAK] = KEYMAP_TKL(\ +[_COLEMAK] = LAYOUT_tkl(\ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR,KC_SLCK,KC_PAUS, \ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME,KC_PGUP, \ KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LBRC, KC_RBRC,KC_BSLS, KC_DEL, KC_END, KC_PGDN, \ @@ -51,25 +42,25 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL,KC_LGUI, KC_LALT, SPC_LW, MSE, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT ), -[_QWERTY] = KEYMAP_TKL(\ +[_QWERTY] = LAYOUT_tkl(\ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, \ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, \ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, \ KC_CAPS,KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_ENT, \ KC_LSFT,KC_NUBS,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT, KC_UP, \ - KC_LCTL,KC_LGUI,KC_LALT, SPC_LW, MSE, KC_RGUI , KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + KC_LCTL,KC_LGUI,KC_LALT, SPC_LW, MSE, KC_RGUI , KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT ), -[_DVORAK] = KEYMAP_TKL(\ +[_DVORAK] = LAYOUT_tkl(\ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, \ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, \ KC_TAB, KC_QUOT,KC_COMM,KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, \ KC_BSPC,KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_QUOT, KC_ENT, \ KC_LSFT,KC_NUBS,KC_SCLN,KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, KC_UP, \ - KC_LCTL,KC_LGUI,KC_LALT, SPC_LW, MSE, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + KC_LCTL,KC_LGUI,KC_LALT, SPC_LW, MSE, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT ), -[_LOWER] = KEYMAP_TKL(\ +[_LOWER] = LAYOUT_tkl(\ RESET, _______, _______, _______, _______, KC_MPLY, KC_MSTP, KC_MPRV, KC_MNXT, _______, KC_MUTE, KC_VOLD, KC_VOLU, QWERTY, COLEMAK,DVORAK, \ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LBRC, KC_RBRC, KC_UNDS, KC_PLUS, KC_BSPC, _______,_______,_______, \ KC_TAB, KC_PGUP, KC_HOME, KC_UP, KC_END, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LCBR, KC_RCBR, KC_PIPE, _______,_______,_______, \ @@ -78,7 +69,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, KC_RALT, _______, _______, _______, _______,_______,_______ \ ), -[_MOUSE] = KEYMAP_TKL(\ +[_MOUSE] = LAYOUT_tkl(\ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,_______,_______, \ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_DEL, _______,_______,_______, \ KC_TAB, KC_WH_U, KC_WH_L, KC_MS_U, KC_WH_R, XXXXXXX, XXXXXXX, KC_BTN3, KC_BTN4, KC_BTN5, XXXXXXX, KC_LBRC, KC_RBRC, KC_BSLS, _______,_______,_______, \ @@ -106,7 +97,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { } return MACRO_NONE; } - + bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch (keycode) { case QWERTY: @@ -126,7 +117,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { set_single_persistent_default_layer(_DVORAK); } return false; - break; + break; } return true; } \ No newline at end of file diff --git a/keyboards/bpiphany/frosty_flake/keymaps/default/config.h b/keyboards/bpiphany/frosty_flake/keymaps/default/config.h index 8893d122e..271f48d00 100644 --- a/keyboards/bpiphany/frosty_flake/keymaps/default/config.h +++ b/keyboards/bpiphany/frosty_flake/keymaps/default/config.h @@ -1,8 +1,3 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" +#pragma once // place overrides here - -#endif diff --git a/keyboards/bpiphany/frosty_flake/keymaps/default/keymap.c b/keyboards/bpiphany/frosty_flake/keymaps/default/keymap.c index 4dc7ed655..9d40d4c9c 100644 --- a/keyboards/bpiphany/frosty_flake/keymaps/default/keymap.c +++ b/keyboards/bpiphany/frosty_flake/keymaps/default/keymap.c @@ -1,11 +1,12 @@ -#include "frosty_flake.h" +#include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[0] = KEYMAP(\ - KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR,KC_SLCK,KC_PAUS, \ - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,KC_MINS, KC_EQL,KC_BSPC, KC_INS,KC_HOME,KC_PGUP, KC_NLCK,KC_PSLS,KC_PAST,KC_PMNS, \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,KC_LBRC,KC_RBRC,KC_BSLS, KC_DEL, KC_END,KC_PGDN, KC_P7, KC_P8, KC_P9,KC_PPLS, \ - KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L,KC_SCLN,KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, \ - KC_LSFT,KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M,KC_COMM, KC_DOT,KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3,KC_PENT, \ - KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI, KC_APP,KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT, KC_P0,KC_PDOT) -}; \ No newline at end of file + [0] = LAYOUT(\ + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, KC_PPLS, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, \ + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT \ + ) +}; diff --git a/keyboards/bpiphany/frosty_flake/keymaps/default/rules.mk b/keyboards/bpiphany/frosty_flake/keymaps/default/rules.mk index 93f927c7d..5dcea8467 100644 --- a/keyboards/bpiphany/frosty_flake/keymaps/default/rules.mk +++ b/keyboards/bpiphany/frosty_flake/keymaps/default/rules.mk @@ -1,5 +1,5 @@ # Build Options -# change to "no" to disable the options, or define them in the Makefile in +# change to "no" to disable the options, or define them in the Makefile in # the appropriate keymap folder that will get included automatically # BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) @@ -13,9 +13,5 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend - -ifndef QUANTUM_DIR - include ../../../../Makefile -endif diff --git a/keyboards/bpiphany/frosty_flake/keymaps/nikchi/config.h b/keyboards/bpiphany/frosty_flake/keymaps/nikchi/config.h index 3f7852643..4bc6d2c3c 100644 --- a/keyboards/bpiphany/frosty_flake/keymaps/nikchi/config.h +++ b/keyboards/bpiphany/frosty_flake/keymaps/nikchi/config.h @@ -1,8 +1,6 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" +#pragma once +// place overrides here #define TAPPING_TERM 200 #define LEADER_TIMEOUT 800 @@ -17,7 +15,4 @@ #define MOUSEKEY_DELAY 0 #define MOUSEKEY_TIME_TO_MAX 60 #define MOUSEKEY_MAX_SPEED 7 -#define MOUSEKEY_WHEEL_DELAY 0 -// place overrides here - -#endif +#define MOUSEKEY_WHEEL_DELAY 0 diff --git a/keyboards/bpiphany/frosty_flake/keymaps/nikchi/keymap.c b/keyboards/bpiphany/frosty_flake/keymaps/nikchi/keymap.c index bf7c5e588..dd2098d94 100644 --- a/keyboards/bpiphany/frosty_flake/keymaps/nikchi/keymap.c +++ b/keyboards/bpiphany/frosty_flake/keymaps/nikchi/keymap.c @@ -1,11 +1,5 @@ -#include "frosty_flake.h" -#include "action_layer.h" -#include "eeconfig.h" -#include "process_unicode.h" -#include "process_unicodemap.h" -#include "quantum.h" +#include QMK_KEYBOARD_H -#define _______ KC_TRNS #define MAXEMOJITAPS 80 @@ -33,16 +27,16 @@ enum taps{ ALLS }; -enum unicode_name { +enum unicode_name { EMOTIS = 1,//80, //1F60x - 1F64x ANIMALS, //64, //1F40x - 1F43x SYMBOLS,// = 45, //1F300 - 1F32C - FOODS,// = 87 , //1F32D - + FOODS,// = 87 , //1F32D - ETC,// = 192, //1F44x -1F4Fx VEHICLES,// = 83, //1F68x - 1F6Dx SUPPLEMENT,// = 32, //1F91x-1F92x ALCHEMY,// = 116 //1F70x - 1F773 - + }; enum my_macros { @@ -102,7 +96,7 @@ const uint32_t PROGMEM unicode_map[] = { [EMOTIS] = 0x1F600, [ANIMALS] = 0x1F400, [SYMBOLS] = 0x1F300, - [FOODS] = 0x1F32D, + [FOODS] = 0x1F32D, [ETC] = 0x1F440, [VEHICLES] = 0x1F680, [SUPPLEMENT] = 0x1F910, @@ -110,27 +104,30 @@ const uint32_t PROGMEM unicode_map[] = { }; // Layouts const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[0] = KEYMAP(\ - KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR,KC_SLCK,KC_PAUS, \ - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,KC_MINS, KC_EQL,KC_BSPC, KC_INS,KC_HOME,KC_PGUP, KC_NLCK,KC_PSLS,KC_PAST,KC_PMNS, \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,KC_LBRC,KC_RBRC,KC_BSLS, KC_DEL, KC_END,KC_PGDN, KC_P7, KC_P8, KC_P9,KC_PPLS, \ - KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L,KC_SCLN,KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, \ - KC_LSPO,KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M,KC_COMM, KC_DOT,KC_SLSH, KC_RSPC, KC_UP, KC_P1, KC_P2, KC_P3,KC_PENT, \ - TD(TD_CTCPS),KC_LGUI,KC_LALT, KC_SPC, KC_LEAD,KC_RGUI, KC_APP,MO(1) , KC_LEFT,KC_DOWN,KC_RGHT, KC_P0,KC_PDOT), -[1] = KEYMAP(\ - TD(ALLS), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR,KC_SLCK,KC_PAUS, \ - KC_GRV, TD(EMOJIS),TD(ANIMAL),TD(ETC),TD(FOODS), KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,KC_MINS, KC_EQL,KC_BSPC, KC_MPRV,KC_MPLY,KC_MNXT, KC_NLCK,KC_PSLS,KC_PAST,KC_PMNS, \ - KC_TAB, KC_Q, M(0), KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_UP ,KC_RBRC,KC_BSLS, KC_MUTE,KC_VOLD,KC_VOLU, KC_P7, KC_P8, KC_P9,KC_PPLS, \ - KC_LCTL, M(1), M(3), M(2), KC_F, KC_G, KC_H, KC_J, KC_K, KC_L,KC_LEFT,KC_RGHT, KC_ENT, KC_P4, KC_P5, KC_P6, \ - KC_LSFT,KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M,KC_COMM, KC_DOT,KC_DOWN, KC_RSFT, KC_MS_U, KC_P1, KC_P2, KC_P3,KC_PENT, \ - KC_BTN1,KC_BTN3,KC_BTN2, KC_SPC, KC_RALT,KC_RGUI, TG(2),_______ , KC_MS_L,KC_MS_D,KC_MS_R, KC_P0,KC_PDOT), -[2] = KEYMAP(\ - KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR,KC_SLCK,KC_PAUS, \ - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,KC_MINS, KC_EQL,KC_BSPC, KC_MPRV,KC_MPLY,KC_MNXT, KC_NLCK,KC_PSLS,KC_PAST,KC_PMNS, \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,KC_LBRC,KC_RBRC,KC_BSLS, KC_MUTE,KC_VOLD,KC_VOLU, KC_P7, KC_P8, KC_P9,KC_PPLS, \ - KC_LCTL, KC_D, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L,KC_SCLN,KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, \ - KC_LSFT,KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M,KC_COMM, KC_DOT,KC_SLSH, KC_RSFT, KC_MS_U, KC_P1, KC_P2, KC_P3,KC_PENT, \ - KC_BTN1,KC_BTN3,KC_BTN2, KC_SPC, KC_RALT,KC_RGUI, TG(2) , KC_NO , KC_MS_L,KC_MS_D,KC_MS_R, KC_P0,KC_PDOT), + [0] = LAYOUT(\ + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, KC_PPLS, \ + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, \ + KC_LSPO, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, \ + TD(TD_CTCPS), KC_LGUI, KC_LALT, KC_SPC, KC_LEAD, KC_RGUI, KC_APP, MO(1), KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT \ + ), + [1] = LAYOUT(\ + TD(ALLS), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, \ + KC_GRV, TD(EMOJIS), TD(ANIMAL), TD(ETC), TD(FOODS), KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_MPRV, KC_MPLY, KC_MNXT, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \ + KC_TAB, KC_Q, M(0), KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_UP, KC_RBRC, KC_BSLS, KC_MUTE, KC_VOLD, KC_VOLU, KC_P7, KC_P8, KC_P9, KC_PPLS, \ + KC_LCTL, M(1), M(3), M(2), KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_LEFT, KC_RGHT, KC_ENT, KC_P4, KC_P5, KC_P6, \ + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_DOWN, KC_RSFT, KC_MS_U, KC_P1, KC_P2, KC_P3, KC_PENT, \ + KC_BTN1, KC_BTN3, KC_BTN2, KC_SPC, KC_RALT, KC_RGUI, TG(2), _______, KC_MS_L, KC_MS_D, KC_MS_R, KC_P0, KC_PDOT \ + ), + [2] = LAYOUT(\ + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_MPRV, KC_MPLY, KC_MNXT, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_MUTE, KC_VOLD, KC_VOLU, KC_P7, KC_P8, KC_P9, KC_PPLS, \ + KC_LCTL, KC_D, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, \ + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_MS_U, KC_P1, KC_P2, KC_P3, KC_PENT, \ + KC_BTN1, KC_BTN3, KC_BTN2, KC_SPC, KC_RALT, KC_RGUI, TG(2), KC_NO, KC_MS_L, KC_MS_D, KC_MS_R, KC_P0, KC_PDOT \ + ), }; LEADER_EXTERNS(); @@ -183,7 +180,7 @@ void cycleEmojis(qk_tap_dance_state_t *state, void *user_data) { } }; -void cycleAnimals(qk_tap_dance_state_t *state, void *user_data) { +void cycleAnimals(qk_tap_dance_state_t *state, void *user_data) { if(state->count == 1) { unicode_input_start(); register_hex32(pgm_read_dword(&unicode_map[ANIMALS])); diff --git a/keyboards/bpiphany/frosty_flake/keymaps/nikchi/rules.mk b/keyboards/bpiphany/frosty_flake/keymaps/nikchi/rules.mk index fc5761c05..de0f30e48 100644 --- a/keyboards/bpiphany/frosty_flake/keymaps/nikchi/rules.mk +++ b/keyboards/bpiphany/frosty_flake/keymaps/nikchi/rules.mk @@ -12,13 +12,9 @@ BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode -UNICODEMAP_ENABLE = yes # unicodemap +UNICODEMAP_ENABLE = yes # unicodemap BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = yes LEADER_ENABLE = yes - -ifndef QUANTUM_DIR - include ../../../../Makefile -endif diff --git a/keyboards/bpiphany/frosty_flake/keymaps/tkl/config.h b/keyboards/bpiphany/frosty_flake/keymaps/tkl/config.h index 8893d122e..271f48d00 100644 --- a/keyboards/bpiphany/frosty_flake/keymaps/tkl/config.h +++ b/keyboards/bpiphany/frosty_flake/keymaps/tkl/config.h @@ -1,8 +1,3 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" +#pragma once // place overrides here - -#endif diff --git a/keyboards/bpiphany/frosty_flake/keymaps/tkl/keymap.c b/keyboards/bpiphany/frosty_flake/keymaps/tkl/keymap.c index 99dc95627..8e8723971 100644 --- a/keyboards/bpiphany/frosty_flake/keymaps/tkl/keymap.c +++ b/keyboards/bpiphany/frosty_flake/keymaps/tkl/keymap.c @@ -1,7 +1,7 @@ -#include "frosty_flake.h" +#include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[0] = KEYMAP_TKL(\ +[0] = LAYOUT_tkl(\ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, \ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, \ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, \ diff --git a/keyboards/bpiphany/frosty_flake/readme.md b/keyboards/bpiphany/frosty_flake/readme.md index 0d6a4779f..5917022a8 100644 --- a/keyboards/bpiphany/frosty_flake/readme.md +++ b/keyboards/bpiphany/frosty_flake/readme.md @@ -18,7 +18,7 @@ keymaps `default` (104) and `tkl` (87) for example layouts. Keyboard Maintainer: QMK Community Hardware Supported: Frosty Flake -Hardware Availability: https://1upkeyboards.com/qfr-frosty-flake-controller.html +Hardware Availability: [1upkeyboards](https://www.1upkeyboards.com/shop/controllers/qfr-frosty-flake-controller/) Make example for this keyboard (after setting up your build environment): @@ -28,7 +28,7 @@ Make example for this keyboard (after setting up your build environment): make bpiphany/frosty_flake:default ``` -To directly flash the frosty_flake after compiling use +To directly flash the frosty_flake after compiling use: ``` make bpiphany/frosty_flake:default:dfu From cb149650efd07cbdc3cacb1fe2eb58f17eee5965 Mon Sep 17 00:00:00 2001 From: zvecr Date: Fri, 14 Dec 2018 21:29:30 +0000 Subject: [PATCH 698/788] Keyboard: Lets split eh default keymap - Fixes for superseded default layer functionality (#4581) * Fixes for superseded default layer functionality * Fixes for superseded default layer functionality --- .../lets_split_eh/keymaps/default/config.h | 7 +- .../lets_split_eh/keymaps/default/keymap.c | 68 +++---------------- .../lets_split_eh/keymaps/default/rules.mk | 3 - 3 files changed, 12 insertions(+), 66 deletions(-) diff --git a/keyboards/lets_split_eh/keymaps/default/config.h b/keyboards/lets_split_eh/keymaps/default/config.h index a1df337bd..c535299e7 100644 --- a/keyboards/lets_split_eh/keymaps/default/config.h +++ b/keyboards/lets_split_eh/keymaps/default/config.h @@ -18,9 +18,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H +#pragma once -#include "../../config.h" - -#endif \ No newline at end of file + // place overrides here diff --git a/keyboards/lets_split_eh/keymaps/default/keymap.c b/keyboards/lets_split_eh/keymaps/default/keymap.c index 8ef973574..1983459f6 100644 --- a/keyboards/lets_split_eh/keymaps/default/keymap.c +++ b/keyboards/lets_split_eh/keymaps/default/keymap.c @@ -1,30 +1,19 @@ #include QMK_KEYBOARD_H -#include "action_layer.h" -#include "eeconfig.h" - -extern keymap_config_t keymap_config; // Each layer gets a name for readability, which is then used in the keymap matrix below. // The underscores don't mean anything - you can have a layer called STUFF or any other name. // Layer names don't all need to be of the same length, obviously, and you can also skip them // entirely and just use numbers. #define _QWERTY 0 - #define _LOWER 3 #define _RAISE 4 #define _FUNCTION 15 #define _ADJUST 16 -enum custom_keycodes { - QWERTY = SAFE_RANGE, - LOWER, - RAISE, - ADJUST -}; - -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO +#define LOWER MO(_LOWER) +#define RAISE MO(_RAISE) +#define FUNCTION MO(_FUNCTION) +#define ADJUST MO(_ADJUST) // Defines for task manager and such #define CALTDEL LCTL(LALT(KC_DEL)) @@ -45,7 +34,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_QWERTY] = LAYOUT( \ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ - MO(_FUNCTION), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT, \ + FUNCTION, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT, \ OSM(MOD_LSFT), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_QUOT, \ KC_LCTL, KC_GRV, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ ), @@ -90,7 +79,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * ,-----------------------------------------------------------------------------------. * |Taskmg| | | | | | | |RGBVAI|RGBSAI|RGBHUI|caltde| * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | | | | | |Qwerty|RGBVAD|RGBSAD|RGBHUD|RGBTOG| + * | | | | | | | | |RGBVAD|RGBSAD|RGBHUD|RGBTOG| * |------+------+------+------+------+------|------+------+------+------+------+------| * | | | | | | | | | | | |BLSTEP| * |------+------+------+------+------+------+------+------+------+------+------+------| @@ -99,7 +88,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_ADJUST] = LAYOUT( \ TSKMGR, _______, _______, _______, _______, _______, _______, _______, RGB_VAI, RGB_SAI, RGB_HUI, CALTDEL, \ - _______, _______, _______, _______, _______, _______, _______, QWERTY, RGB_VAD, RGB_SAD, RGB_HUD, RGB_TOG, \ + _______, _______, _______, _______, _______, _______, _______, _______, RGB_VAD, RGB_SAD, RGB_HUD, RGB_TOG, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, BL_STEP, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET \ ), @@ -124,47 +113,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; -void persistent_default_layer_set(uint16_t default_layer) { - eeconfig_update_default_layer(default_layer); - default_layer_set(default_layer); +uint32_t layer_state_set_user(uint32_t state) { + return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST); } bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case QWERTY: - if (record->event.pressed) { - persistent_default_layer_set(1UL<<_QWERTY); - } - return false; - break; - case LOWER: - if (record->event.pressed) { - layer_on(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case RAISE: - if (record->event.pressed) { - layer_on(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case ADJUST: - if (record->event.pressed) { - layer_on(_ADJUST); - } else { - layer_off(_ADJUST); - } - return false; - break; - } return true; -} \ No newline at end of file +} diff --git a/keyboards/lets_split_eh/keymaps/default/rules.mk b/keyboards/lets_split_eh/keymaps/default/rules.mk index 457a3d01d..e69de29bb 100644 --- a/keyboards/lets_split_eh/keymaps/default/rules.mk +++ b/keyboards/lets_split_eh/keymaps/default/rules.mk @@ -1,3 +0,0 @@ -ifndef QUANTUM_DIR - include ../../../../Makefile -endif From bb5262de0790ed3f4f91de20fad6e13fc0ffddc5 Mon Sep 17 00:00:00 2001 From: zvecr Date: Fri, 14 Dec 2018 22:25:32 +0000 Subject: [PATCH 699/788] Keyboard: Refactor fourier to use split common code (#4582) * Refactor fourier to use split common code * Refactor fourier to use split common code - fix handedness when not using EE_HANDS or MASTER_LEFT * add SOFT_SERIAL_PIN config --- keyboards/fourier/config.h | 9 +- keyboards/fourier/fourier.h | 8 +- keyboards/fourier/i2c.c | 162 ------- keyboards/fourier/i2c.h | 49 --- keyboards/fourier/keymaps/default/config.h | 8 +- keyboards/fourier/keymaps/default/keymap.c | 4 - keyboards/fourier/keymaps/default/rules.mk | 3 - keyboards/fourier/matrix.c | 467 --------------------- keyboards/fourier/rev1/config.h | 14 +- keyboards/fourier/rev1/rev1.c | 2 - keyboards/fourier/rev1/rev1.h | 17 +- keyboards/fourier/rules.mk | 14 +- keyboards/fourier/serial.c | 228 ---------- keyboards/fourier/serial.h | 26 -- keyboards/fourier/split_util.c | 80 ---- keyboards/fourier/split_util.h | 20 - 16 files changed, 17 insertions(+), 1094 deletions(-) delete mode 100644 keyboards/fourier/i2c.c delete mode 100644 keyboards/fourier/i2c.h delete mode 100644 keyboards/fourier/matrix.c delete mode 100644 keyboards/fourier/serial.c delete mode 100644 keyboards/fourier/serial.h delete mode 100644 keyboards/fourier/split_util.c delete mode 100644 keyboards/fourier/split_util.h diff --git a/keyboards/fourier/config.h b/keyboards/fourier/config.h index 8f0524f97..cfb6bf4ff 100644 --- a/keyboards/fourier/config.h +++ b/keyboards/fourier/config.h @@ -16,13 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef CONFIG_H -#define CONFIG_H +#pragma once #include "config_common.h" - -#ifdef SUBPROJECT_rev1 - #include "rev1/config.h" -#endif - -#endif diff --git a/keyboards/fourier/fourier.h b/keyboards/fourier/fourier.h index 4e9797b35..1b4585c82 100644 --- a/keyboards/fourier/fourier.h +++ b/keyboards/fourier/fourier.h @@ -1,12 +1,11 @@ -#ifndef FOURIER_H -#define FOURIER_H - -#include "quantum.h" +#pragma once #ifdef KEYBOARD_fourier_rev1 #include "rev1.h" #endif +#include "quantum.h" + // Used to create a keymap using only KC_ prefixed keys #define LAYOUT_kc( \ LA1, LA2, LA3, LA4, LA5, LA6, RA1, RA2, RA3, RA4, RA5, RA6, RA7, \ @@ -20,4 +19,3 @@ KC_##LC1, KC_##LC2, KC_##LC3, KC_##LC4, KC_##LC5, KC_##LC6, KC_##RC1, KC_##RC3, KC_##RC4, KC_##RC5, KC_##RC6, KC_##RC7, \ KC_##LD1, KC_##LD2, KC_##LD3, KC_##LD4, KC_##LD5, KC_##RD1, KC_##RD4, KC_##RD5, KC_##RD6, KC_##RD7 \ ) -#endif diff --git a/keyboards/fourier/i2c.c b/keyboards/fourier/i2c.c deleted file mode 100644 index 084c890c4..000000000 --- a/keyboards/fourier/i2c.c +++ /dev/null @@ -1,162 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include "i2c.h" - -#ifdef USE_I2C - -// Limits the amount of we wait for any one i2c transaction. -// Since were running SCL line 100kHz (=> 10μs/bit), and each transactions is -// 9 bits, a single transaction will take around 90μs to complete. -// -// (F_CPU/SCL_CLOCK) => # of μC cycles to transfer a bit -// poll loop takes at least 8 clock cycles to execute -#define I2C_LOOP_TIMEOUT (9+1)*(F_CPU/SCL_CLOCK)/8 - -#define BUFFER_POS_INC() (slave_buffer_pos = (slave_buffer_pos+1)%SLAVE_BUFFER_SIZE) - -volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE]; - -static volatile uint8_t slave_buffer_pos; -static volatile bool slave_has_register_set = false; - -// Wait for an i2c operation to finish -inline static -void i2c_delay(void) { - uint16_t lim = 0; - while(!(TWCR & (1<10. - // Check datasheets for more info. - TWBR = ((F_CPU/SCL_CLOCK)-16)/2; -} - -// Start a transaction with the given i2c slave address. The direction of the -// transfer is set with I2C_READ and I2C_WRITE. -// returns: 0 => success -// 1 => error -uint8_t i2c_master_start(uint8_t address) { - TWCR = (1< slave ACK -// 1 => slave NACK -uint8_t i2c_master_write(uint8_t data) { - TWDR = data; - TWCR = (1<= SLAVE_BUFFER_SIZE ) { - ack = 0; - slave_buffer_pos = 0; - } - slave_has_register_set = true; - } else { - i2c_slave_buffer[slave_buffer_pos] = TWDR; - BUFFER_POS_INC(); - } - break; - - case TW_ST_SLA_ACK: - case TW_ST_DATA_ACK: - // master has addressed this device as a slave transmitter and is - // requesting data. - TWDR = i2c_slave_buffer[slave_buffer_pos]; - BUFFER_POS_INC(); - break; - - case TW_BUS_ERROR: // something went wrong, reset twi state - TWCR = 0; - default: - break; - } - // Reset everything, so we are ready for the next TWI interrupt - TWCR |= (1< - -#ifndef F_CPU -#define F_CPU 16000000UL -#endif - -#define I2C_READ 1 -#define I2C_WRITE 0 - -#define I2C_ACK 1 -#define I2C_NACK 0 - -#define SLAVE_BUFFER_SIZE 0x10 - -// i2c SCL clock frequency -#define SCL_CLOCK 400000L - -extern volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE]; - -void i2c_master_init(void); -uint8_t i2c_master_start(uint8_t address); -void i2c_master_stop(void); -uint8_t i2c_master_write(uint8_t data); -uint8_t i2c_master_read(int); -void i2c_reset_state(void); -void i2c_slave_init(uint8_t address); - - -static inline unsigned char i2c_start_read(unsigned char addr) { - return i2c_master_start((addr << 1) | I2C_READ); -} - -static inline unsigned char i2c_start_write(unsigned char addr) { - return i2c_master_start((addr << 1) | I2C_WRITE); -} - -// from SSD1306 scrips -extern unsigned char i2c_rep_start(unsigned char addr); -extern void i2c_start_wait(unsigned char addr); -extern unsigned char i2c_readAck(void); -extern unsigned char i2c_readNak(void); -extern unsigned char i2c_read(unsigned char ack); - -#define i2c_read(ack) (ack) ? i2c_readAck() : i2c_readNak(); - -#endif diff --git a/keyboards/fourier/keymaps/default/config.h b/keyboards/fourier/keymaps/default/config.h index 20e49c421..18f4c1f7a 100644 --- a/keyboards/fourier/keymaps/default/config.h +++ b/keyboards/fourier/keymaps/default/config.h @@ -18,14 +18,8 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "config_common.h" +#pragma once /* Use I2C or Serial, not both */ - #define USE_SERIAL // #define USE_I2C - -#endif diff --git a/keyboards/fourier/keymaps/default/keymap.c b/keyboards/fourier/keymaps/default/keymap.c index 9c2013776..a08f27b7c 100644 --- a/keyboards/fourier/keymaps/default/keymap.c +++ b/keyboards/fourier/keymaps/default/keymap.c @@ -1,7 +1,5 @@ #include QMK_KEYBOARD_H -extern keymap_config_t keymap_config; - // Each layer gets a name for readability, which is then used in the keymap matrix below. // The underscores don't mean anything - you can have a layer called STUFF or any other name. // Layer names don't all need to be of the same length, obviously, and you can also skip them @@ -14,8 +12,6 @@ enum custom_keycodes { QWERTY = SAFE_RANGE, }; -#define _______ KC_TRNS -#define XXXXXXX KC_NO #define KC_FN1 MO(_FN1) #define KC_FN2 MO(_FN2) #define KC_SPFN1 LT(_FN1, KC_SPACE) diff --git a/keyboards/fourier/keymaps/default/rules.mk b/keyboards/fourier/keymaps/default/rules.mk index 457a3d01d..e69de29bb 100644 --- a/keyboards/fourier/keymaps/default/rules.mk +++ b/keyboards/fourier/keymaps/default/rules.mk @@ -1,3 +0,0 @@ -ifndef QUANTUM_DIR - include ../../../../Makefile -endif diff --git a/keyboards/fourier/matrix.c b/keyboards/fourier/matrix.c deleted file mode 100644 index fdeead7dc..000000000 --- a/keyboards/fourier/matrix.c +++ /dev/null @@ -1,467 +0,0 @@ -/* -Copyright 2012 Jun Wako - -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 . -*/ - -/* - * scan matrix - */ -#include -#include -#include -#include "wait.h" -#include "print.h" -#include "debug.h" -#include "util.h" -#include "matrix.h" -#include "split_util.h" -#include "pro_micro.h" -#include "config.h" -#include "timer.h" -#include "backlight.h" - -#ifdef USE_I2C -# include "i2c.h" -#else // USE_SERIAL -# include "serial.h" -#endif - -#ifndef DEBOUNCING_DELAY -# define DEBOUNCING_DELAY 5 -#endif - -#if (DEBOUNCING_DELAY > 0) - static uint16_t debouncing_time; - static bool debouncing = false; -#endif - -#if (MATRIX_COLS <= 8) -# define print_matrix_header() print("\nr/c 01234567\n") -# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row)) -# define matrix_bitpop(i) bitpop(matrix[i]) -# define ROW_SHIFTER ((uint8_t)1) -#else -# error "Currently only supports 8 COLS" -#endif -static matrix_row_t matrix_debouncing[MATRIX_ROWS]; - -#define ERROR_DISCONNECT_COUNT 5 - -#define SERIAL_LED_ADDR 0x00 - -#define ROWS_PER_HAND (MATRIX_ROWS/2) - -static uint8_t error_count = 0; - -static const uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; -static const uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; - -/* matrix state(1:on, 0:off) */ -static matrix_row_t matrix[MATRIX_ROWS]; -static matrix_row_t matrix_debouncing[MATRIX_ROWS]; - -#if (DIODE_DIRECTION == COL2ROW) - static void init_cols(void); - static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row); - static void unselect_rows(void); - static void select_row(uint8_t row); - static void unselect_row(uint8_t row); -#elif (DIODE_DIRECTION == ROW2COL) - static void init_rows(void); - static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col); - static void unselect_cols(void); - static void unselect_col(uint8_t col); - static void select_col(uint8_t col); -#endif - -__attribute__ ((weak)) -void matrix_init_kb(void) { - matrix_init_user(); -} - -__attribute__ ((weak)) -void matrix_scan_kb(void) { - matrix_scan_user(); -} - -__attribute__ ((weak)) -void matrix_init_user(void) { -} - -__attribute__ ((weak)) -void matrix_scan_user(void) { -} - -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - -void matrix_init(void) -{ - debug_enable = true; - debug_matrix = true; - debug_mouse = true; - // initialize row and col - unselect_rows(); - init_cols(); - - TX_RX_LED_INIT; - - // initialize matrix state: all keys off - for (uint8_t i=0; i < MATRIX_ROWS; i++) { - matrix[i] = 0; - matrix_debouncing[i] = 0; - } - - matrix_init_quantum(); - -} - -uint8_t _matrix_scan(void) -{ - int offset = isLeftHand ? 0 : (ROWS_PER_HAND); -#if (DIODE_DIRECTION == COL2ROW) - // Set row, read cols - for (uint8_t current_row = 0; current_row < ROWS_PER_HAND; current_row++) { -# if (DEBOUNCING_DELAY > 0) - bool matrix_changed = read_cols_on_row(matrix_debouncing+offset, current_row); - - if (matrix_changed) { - debouncing = true; - debouncing_time = timer_read(); - } - -# else - read_cols_on_row(matrix+offset, current_row); -# endif - - } - -#elif (DIODE_DIRECTION == ROW2COL) - // Set col, read rows - for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) { -# if (DEBOUNCING_DELAY > 0) - bool matrix_changed = read_rows_on_col(matrix_debouncing+offset, current_col); - if (matrix_changed) { - debouncing = true; - debouncing_time = timer_read(); - } -# else - read_rows_on_col(matrix+offset, current_col); -# endif - - } -#endif - -# if (DEBOUNCING_DELAY > 0) - if (debouncing && (timer_elapsed(debouncing_time) > DEBOUNCING_DELAY)) { - for (uint8_t i = 0; i < ROWS_PER_HAND; i++) { - matrix[i+offset] = matrix_debouncing[i+offset]; - } - debouncing = false; - } -# endif - - return 1; -} - -#ifdef USE_I2C - -// Get rows from other half over i2c -int i2c_transaction(void) { - int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; - - int err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_WRITE); - if (err) goto i2c_error; - - // start of matrix stored at 0x00 - err = i2c_master_write(0x00); - if (err) goto i2c_error; - - // Start read - err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_READ); - if (err) goto i2c_error; - - if (!err) { - int i; - for (i = 0; i < ROWS_PER_HAND-1; ++i) { - matrix[slaveOffset+i] = i2c_master_read(I2C_ACK); - } - matrix[slaveOffset+i] = i2c_master_read(I2C_NACK); - i2c_master_stop(); - } else { -i2c_error: // the cable is disconnceted, or something else went wrong - i2c_reset_state(); - return err; - } - - return 0; -} - -#else // USE_SERIAL - -int serial_transaction(void) { - int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; - - if (serial_update_buffers()) { - return 1; - } - - for (int i = 0; i < ROWS_PER_HAND; ++i) { - matrix[slaveOffset+i] = serial_slave_buffer[i]; - } - -#ifdef BACKLIGHT_ENABLE - // Write backlight level for slave to read - serial_master_buffer[SERIAL_LED_ADDR] = get_backlight_level(); -#endif - return 0; -} -#endif - -uint8_t matrix_scan(void) -{ - uint8_t ret = _matrix_scan(); - -#ifdef USE_I2C - if( i2c_transaction() ) { -#else // USE_SERIAL - if( serial_transaction() ) { -#endif - // turn on the indicator led when halves are disconnected - TXLED1; - - error_count++; - - if (error_count > ERROR_DISCONNECT_COUNT) { - // reset other half if disconnected - int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; - for (int i = 0; i < ROWS_PER_HAND; ++i) { - matrix[slaveOffset+i] = 0; - } - } - } else { - // turn off the indicator led on no error - TXLED0; - error_count = 0; - } - matrix_scan_quantum(); - return ret; -} - -void matrix_slave_scan(void) { - _matrix_scan(); - - int offset = (isLeftHand) ? 0 : ROWS_PER_HAND; - -#ifdef USE_I2C - for (int i = 0; i < ROWS_PER_HAND; ++i) { - i2c_slave_buffer[i] = matrix[offset+i]; - } -#else // USE_SERIAL - for (int i = 0; i < ROWS_PER_HAND; ++i) { - serial_slave_buffer[i] = matrix[offset+i]; - } - -#ifdef BACKLIGHT_ENABLE - // Read backlight level sent from master and update level on slave - backlight_set(serial_master_buffer[SERIAL_LED_ADDR]); -#endif -#endif -} - -bool matrix_is_modified(void) -{ - if (debouncing) return false; - return true; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ - return (matrix[row] & ((matrix_row_t)1<> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI - } -} - -static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) -{ - // Store last value of row prior to reading - matrix_row_t last_row_value = current_matrix[current_row]; - - // Clear data in matrix row - current_matrix[current_row] = 0; - - // Select row and wait for row selecton to stabilize - select_row(current_row); - wait_us(30); - - // For each col... - for(uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) { - - // Select the col pin to read (active low) - uint8_t pin = col_pins[col_index]; - uint8_t pin_state = (_SFR_IO8(pin >> 4) & _BV(pin & 0xF)); - - // Populate the matrix row with the state of the col pin - current_matrix[current_row] |= pin_state ? 0 : (ROW_SHIFTER << col_index); - } - - // Unselect row - unselect_row(current_row); - - return (last_row_value != current_matrix[current_row]); -} - -static void select_row(uint8_t row) -{ - uint8_t pin = row_pins[row]; - _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT - _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW -} - -static void unselect_row(uint8_t row) -{ - uint8_t pin = row_pins[row]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI -} - -static void unselect_rows(void) -{ - for(uint8_t x = 0; x < ROWS_PER_HAND; x++) { - uint8_t pin = row_pins[x]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI - } -} - -#elif (DIODE_DIRECTION == ROW2COL) - -static void init_rows(void) -{ - for(uint8_t x = 0; x < ROWS_PER_HAND; x++) { - uint8_t pin = row_pins[x]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI - } -} - -static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) -{ - bool matrix_changed = false; - - // Select col and wait for col selecton to stabilize - select_col(current_col); - wait_us(30); - - // For each row... - for(uint8_t row_index = 0; row_index < ROWS_PER_HAND; row_index++) - { - - // Store last value of row prior to reading - matrix_row_t last_row_value = current_matrix[row_index]; - - // Check row pin state - if ((_SFR_IO8(row_pins[row_index] >> 4) & _BV(row_pins[row_index] & 0xF)) == 0) - { - // Pin LO, set col bit - current_matrix[row_index] |= (ROW_SHIFTER << current_col); - } - else - { - // Pin HI, clear col bit - current_matrix[row_index] &= ~(ROW_SHIFTER << current_col); - } - - // Determine if the matrix changed state - if ((last_row_value != current_matrix[row_index]) && !(matrix_changed)) - { - matrix_changed = true; - } - } - - // Unselect col - unselect_col(current_col); - - return matrix_changed; -} - -static void select_col(uint8_t col) -{ - uint8_t pin = col_pins[col]; - _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT - _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW -} - -static void unselect_col(uint8_t col) -{ - uint8_t pin = col_pins[col]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI -} - -static void unselect_cols(void) -{ - for(uint8_t x = 0; x < MATRIX_COLS; x++) { - uint8_t pin = col_pins[x]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI - } -} - -#endif diff --git a/keyboards/fourier/rev1/config.h b/keyboards/fourier/rev1/config.h index 3bd67228c..d9913d7de 100644 --- a/keyboards/fourier/rev1/config.h +++ b/keyboards/fourier/rev1/config.h @@ -16,10 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef REV1_CONFIG_H -#define REV1_CONFIG_H - -#include "../config.h" +#pragma once /* USB Device descriptor parameter */ #define VENDOR_ID 0xCB10 @@ -38,6 +35,11 @@ along with this program. If not, see . #define MATRIX_ROW_PINS { F4, D7, E6, B4 } #define MATRIX_COL_PINS { F5, F6, F7, B1, B3, B2, B6 } +/* Split Defines */ +#define SPLIT_HAND_PIN D2 +/* serial.c configuration for split keyboard */ +#define SOFT_SERIAL_PIN D0 + /* define if matrix has ghost */ //#define MATRIX_HAS_GHOST @@ -56,7 +58,6 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 - #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 14 // Number of LEDs @@ -77,6 +78,3 @@ along with this program. If not, see . //#define NO_ACTION_ONESHOT //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION - - -#endif diff --git a/keyboards/fourier/rev1/rev1.c b/keyboards/fourier/rev1/rev1.c index 61d7139d6..1e662e7b8 100644 --- a/keyboards/fourier/rev1/rev1.c +++ b/keyboards/fourier/rev1/rev1.c @@ -1,7 +1,5 @@ #include "fourier.h" - void matrix_init_kb(void) { matrix_init_user(); }; - diff --git a/keyboards/fourier/rev1/rev1.h b/keyboards/fourier/rev1/rev1.h index 9ef9b9233..ac889462b 100644 --- a/keyboards/fourier/rev1/rev1.h +++ b/keyboards/fourier/rev1/rev1.h @@ -1,19 +1,8 @@ -#ifndef REV1_H -#define REV1_H - -#include "../fourier.h" +#pragma once +#include "fourier.h" #include "quantum.h" - -#ifdef USE_I2C -#include -#ifdef __AVR__ - #include - #include -#endif -#endif - #define LAYOUT( \ LA1, LA2, LA3, LA4, LA5, LA6, RA1, RA2, RA3, RA4, RA5, RA6, RA7, \ LB1, LB2, LB3, LB4, LB5, LB6, RB1, RB2, RB3, RB4, RB5, RB7, \ @@ -30,5 +19,3 @@ { RC1, KC_NO, RC3, RC4, RC5, RC6, RC7}, \ { RD1, KC_NO, KC_NO, RD4, RD5, RD6, RD7} \ } - -#endif diff --git a/keyboards/fourier/rules.mk b/keyboards/fourier/rules.mk index 9ec05e874..93935e02e 100644 --- a/keyboards/fourier/rules.mk +++ b/keyboards/fourier/rules.mk @@ -1,10 +1,4 @@ -SRC += matrix.c \ - i2c.c \ - split_util.c \ - serial.c - # MCU name -#MCU = at90usb1287 MCU = atmega32u4 # Processor frequency. @@ -41,7 +35,7 @@ F_USB = $(F_CPU) # Bootloader # This definition is optional, and if your keyboard supports multiple bootloaders of -# different sizes, comment this out, and the correct address will be loaded +# different sizes, comment this out, and the correct address will be loaded # automatically (+60). See bootloader.mk for all options. BOOTLOADER = caterina @@ -63,12 +57,12 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SUBPROJECT_rev1 = yes -USE_I2C = yes + # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend -CUSTOM_MATRIX = yes +SPLIT_KEYBOARD = yes DEFAULT_FOLDER = fourier/rev1 diff --git a/keyboards/fourier/serial.c b/keyboards/fourier/serial.c deleted file mode 100644 index 74bcbb6bf..000000000 --- a/keyboards/fourier/serial.c +++ /dev/null @@ -1,228 +0,0 @@ -/* - * WARNING: be careful changing this code, it is very timing dependent - */ - -#ifndef F_CPU -#define F_CPU 16000000 -#endif - -#include -#include -#include -#include -#include "serial.h" - -#ifndef USE_I2C - -// Serial pulse period in microseconds. Its probably a bad idea to lower this -// value. -#define SERIAL_DELAY 24 - -uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; -uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0}; - -#define SLAVE_DATA_CORRUPT (1<<0) -volatile uint8_t status = 0; - -inline static -void serial_delay(void) { - _delay_us(SERIAL_DELAY); -} - -inline static -void serial_output(void) { - SERIAL_PIN_DDR |= SERIAL_PIN_MASK; -} - -// make the serial pin an input with pull-up resistor -inline static -void serial_input(void) { - SERIAL_PIN_DDR &= ~SERIAL_PIN_MASK; - SERIAL_PIN_PORT |= SERIAL_PIN_MASK; -} - -inline static -uint8_t serial_read_pin(void) { - return !!(SERIAL_PIN_INPUT & SERIAL_PIN_MASK); -} - -inline static -void serial_low(void) { - SERIAL_PIN_PORT &= ~SERIAL_PIN_MASK; -} - -inline static -void serial_high(void) { - SERIAL_PIN_PORT |= SERIAL_PIN_MASK; -} - -void serial_master_init(void) { - serial_output(); - serial_high(); -} - -void serial_slave_init(void) { - serial_input(); - - // Enable INT0 - EIMSK |= _BV(INT0); - // Trigger on falling edge of INT0 - EICRA &= ~(_BV(ISC00) | _BV(ISC01)); -} - -// Used by the master to synchronize timing with the slave. -static -void sync_recv(void) { - serial_input(); - // This shouldn't hang if the slave disconnects because the - // serial line will float to high if the slave does disconnect. - while (!serial_read_pin()); - serial_delay(); -} - -// Used by the slave to send a synchronization signal to the master. -static -void sync_send(void) { - serial_output(); - - serial_low(); - serial_delay(); - - serial_high(); -} - -// Reads a byte from the serial line -static -uint8_t serial_read_byte(void) { - uint8_t byte = 0; - serial_input(); - for ( uint8_t i = 0; i < 8; ++i) { - byte = (byte << 1) | serial_read_pin(); - serial_delay(); - _delay_us(1); - } - - return byte; -} - -// Sends a byte with MSB ordering -static -void serial_write_byte(uint8_t data) { - uint8_t b = 8; - serial_output(); - while( b-- ) { - if(data & (1 << b)) { - serial_high(); - } else { - serial_low(); - } - serial_delay(); - } -} - -// interrupt handle to be used by the slave device -ISR(SERIAL_PIN_INTERRUPT) { - sync_send(); - - uint8_t checksum = 0; - for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) { - serial_write_byte(serial_slave_buffer[i]); - sync_send(); - checksum += serial_slave_buffer[i]; - } - serial_write_byte(checksum); - sync_send(); - - // wait for the sync to finish sending - serial_delay(); - - // read the middle of pulses - _delay_us(SERIAL_DELAY/2); - - uint8_t checksum_computed = 0; - for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) { - serial_master_buffer[i] = serial_read_byte(); - sync_send(); - checksum_computed += serial_master_buffer[i]; - } - uint8_t checksum_received = serial_read_byte(); - sync_send(); - - serial_input(); // end transaction - - if ( checksum_computed != checksum_received ) { - status |= SLAVE_DATA_CORRUPT; - } else { - status &= ~SLAVE_DATA_CORRUPT; - } -} - -inline -bool serial_slave_DATA_CORRUPT(void) { - return status & SLAVE_DATA_CORRUPT; -} - -// Copies the serial_slave_buffer to the master and sends the -// serial_master_buffer to the slave. -// -// Returns: -// 0 => no error -// 1 => slave did not respond -int serial_update_buffers(void) { - // this code is very time dependent, so we need to disable interrupts - cli(); - - // signal to the slave that we want to start a transaction - serial_output(); - serial_low(); - _delay_us(1); - - // wait for the slaves response - serial_input(); - serial_high(); - _delay_us(SERIAL_DELAY); - - // check if the slave is present - if (serial_read_pin()) { - // slave failed to pull the line low, assume not present - sei(); - return 1; - } - - // if the slave is present syncronize with it - sync_recv(); - - uint8_t checksum_computed = 0; - // receive data from the slave - for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) { - serial_slave_buffer[i] = serial_read_byte(); - sync_recv(); - checksum_computed += serial_slave_buffer[i]; - } - uint8_t checksum_received = serial_read_byte(); - sync_recv(); - - if (checksum_computed != checksum_received) { - sei(); - return 1; - } - - uint8_t checksum = 0; - // send data to the slave - for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) { - serial_write_byte(serial_master_buffer[i]); - sync_recv(); - checksum += serial_master_buffer[i]; - } - serial_write_byte(checksum); - sync_recv(); - - // always, release the line when not in use - serial_output(); - serial_high(); - - sei(); - return 0; -} - -#endif diff --git a/keyboards/fourier/serial.h b/keyboards/fourier/serial.h deleted file mode 100644 index 15fe4db7b..000000000 --- a/keyboards/fourier/serial.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef MY_SERIAL_H -#define MY_SERIAL_H - -#include "config.h" -#include - -/* TODO: some defines for interrupt setup */ -#define SERIAL_PIN_DDR DDRD -#define SERIAL_PIN_PORT PORTD -#define SERIAL_PIN_INPUT PIND -#define SERIAL_PIN_MASK _BV(PD0) -#define SERIAL_PIN_INTERRUPT INT0_vect - -#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 -#define SERIAL_MASTER_BUFFER_LENGTH 1 - -// Buffers for master - slave communication -extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH]; -extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH]; - -void serial_master_init(void); -void serial_slave_init(void); -int serial_update_buffers(void); -bool serial_slave_data_corrupt(void); - -#endif diff --git a/keyboards/fourier/split_util.c b/keyboards/fourier/split_util.c deleted file mode 100644 index 2704e30e0..000000000 --- a/keyboards/fourier/split_util.c +++ /dev/null @@ -1,80 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include "split_util.h" -#include "matrix.h" -#include "keyboard.h" -#include "config.h" -#include "timer.h" -#include "pincontrol.h" - -#ifdef USE_I2C -# include "i2c.h" -#else -# include "serial.h" -#endif - -volatile bool isLeftHand = true; - -static void setup_handedness(void) { - // Test D2 pin for handedness, if D2 is grounded, it's the right hand - pinMode(D2, PinDirectionInput); - isLeftHand = digitalRead(D2); -} - -static void keyboard_master_setup(void) { -#ifdef USE_I2C - i2c_master_init(); -#ifdef SSD1306OLED - matrix_master_OLED_init(); -#endif -#else - serial_master_init(); -#endif -} - -static void keyboard_slave_setup(void) { - timer_init(); -#ifdef USE_I2C - i2c_slave_init(SLAVE_I2C_ADDRESS); -#else - serial_slave_init(); -#endif -} - -bool has_usb(void) { - USBCON |= (1 << OTGPADE); //enables VBUS pad - _delay_us(5); - return (USBSTA & (1< -#include "eeconfig.h" - -#define SLAVE_I2C_ADDRESS 0x32 - -extern volatile bool isLeftHand; - -// slave version of matix scan, defined in matrix.c -void matrix_slave_scan(void); - -void split_keyboard_setup(void); -bool has_usb(void); -void keyboard_slave_loop(void); - -void matrix_master_OLED_init (void); - -#endif From 039434caf96c77a8584f03ab2b27ed255e7adae5 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Fri, 14 Dec 2018 16:38:46 -0800 Subject: [PATCH 700/788] Keyboard: Bpiphany Pegasus Hoof Refactor, Configurator support (#4649) * Pegasus Hoof: layout macro refactor - Renamed KEYMAP to LAYOUT - Added LAYOUT_tkl_ansi macro - white space changes (changed tabs for 2 spaces) * Pegasus Hoof: keymap refactor - updated layout macro names - changed to #include QMK_KEYBOARD_H - removed redundant KC_TRNS definitions - white space changes (changed tabs to spaces) - removed deprecated build script instructions from rules.mk files - updated config.h to #pragma once * Pegasus Hoof: Configurator support * Pegasus Hoof: readme cleanup - Reformat header and description paragraph - Fix Hardware Availability link (was 404) - renamed filename to lowercase * Pegasus Hoof: add LAYOUTS = tkl_ansi to rules.mk * Pegasus Hoof: fix LAYOUT_tkl_jis macro --- keyboards/bpiphany/pegasushoof/info.json | 192 ++++++++++++++++++ .../pegasushoof/keymaps/blowrak/keymap.c | 12 +- .../pegasushoof/keymaps/blowrak/rules.mk | 9 +- .../pegasushoof/keymaps/citadel/config.h | 7 +- .../pegasushoof/keymaps/citadel/keymap.c | 8 +- .../pegasushoof/keymaps/citadel/rules.mk | 7 +- .../pegasushoof/keymaps/default/keymap.c | 62 +++--- .../pegasushoof/keymaps/default/rules.mk | 9 +- keyboards/bpiphany/pegasushoof/pegasushoof.h | 66 +++--- .../pegasushoof/{README.md => readme.md} | 7 +- keyboards/bpiphany/pegasushoof/rules.mk | 3 +- 11 files changed, 282 insertions(+), 100 deletions(-) create mode 100644 keyboards/bpiphany/pegasushoof/info.json rename keyboards/bpiphany/pegasushoof/{README.md => readme.md} (63%) diff --git a/keyboards/bpiphany/pegasushoof/info.json b/keyboards/bpiphany/pegasushoof/info.json new file mode 100644 index 000000000..c4fa28ac4 --- /dev/null +++ b/keyboards/bpiphany/pegasushoof/info.json @@ -0,0 +1,192 @@ +{ + "keyboard_name": "Pegasus Hoof", + "url": "", + "maintainer": "qmk", + "width": 18.25, + "height": 6.5, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"Esc", "x":0, "y":0}, + {"label":"F1", "x":2, "y":0}, + {"label":"F2", "x":3, "y":0}, + {"label":"F3", "x":4, "y":0}, + {"label":"F4", "x":5, "y":0}, + {"label":"F5", "x":6.5, "y":0}, + {"label":"F6", "x":7.5, "y":0}, + {"label":"F7", "x":8.5, "y":0}, + {"label":"F8", "x":9.5, "y":0}, + {"label":"F9", "x":11, "y":0}, + {"label":"F10", "x":12, "y":0}, + {"label":"F11", "x":13, "y":0}, + {"label":"F12", "x":14, "y":0}, + {"label":"Print Screen", "x":15.25, "y":0}, + {"label":"Scroll Lock", "x":16.25, "y":0}, + {"label":"Pause", "x":17.25, "y":0}, + {"label":"`", "x":0, "y":1.5}, + {"label":"1", "x":1, "y":1.5}, + {"label":"2", "x":2, "y":1.5}, + {"label":"3", "x":3, "y":1.5}, + {"label":"4", "x":4, "y":1.5}, + {"label":"5", "x":5, "y":1.5}, + {"label":"6", "x":6, "y":1.5}, + {"label":"7", "x":7, "y":1.5}, + {"label":"8", "x":8, "y":1.5}, + {"label":"9", "x":9, "y":1.5}, + {"label":"0", "x":10, "y":1.5}, + {"label":"-", "x":11, "y":1.5}, + {"label":"=", "x":12, "y":1.5}, + {"label":"Backspace", "x":13, "y":1.5, "w":2}, + {"label":"Insert", "x":15.25, "y":1.5}, + {"label":"Home", "x":16.25, "y":1.5}, + {"label":"Page Up", "x":17.25, "y":1.5}, + {"label":"Tab", "x":0, "y":2.5, "w":1.5}, + {"label":"Q", "x":1.5, "y":2.5}, + {"label":"W", "x":2.5, "y":2.5}, + {"label":"E", "x":3.5, "y":2.5}, + {"label":"R", "x":4.5, "y":2.5}, + {"label":"T", "x":5.5, "y":2.5}, + {"label":"Y", "x":6.5, "y":2.5}, + {"label":"U", "x":7.5, "y":2.5}, + {"label":"I", "x":8.5, "y":2.5}, + {"label":"O", "x":9.5, "y":2.5}, + {"label":"P", "x":10.5, "y":2.5}, + {"label":"[", "x":11.5, "y":2.5}, + {"label":"]", "x":12.5, "y":2.5}, + {"label":"\\", "x":13.5, "y":2.5, "w":1.5}, + {"label":"Delete", "x":15.25, "y":2.5}, + {"label":"End", "x":16.25, "y":2.5}, + {"label":"Page Down", "x":17.25, "y":2.5}, + {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75}, + {"label":"A", "x":1.75, "y":3.5}, + {"label":"S", "x":2.75, "y":3.5}, + {"label":"D", "x":3.75, "y":3.5}, + {"label":"F", "x":4.75, "y":3.5}, + {"label":"G", "x":5.75, "y":3.5}, + {"label":"H", "x":6.75, "y":3.5}, + {"label":"J", "x":7.75, "y":3.5}, + {"label":"K", "x":8.75, "y":3.5}, + {"label":"L", "x":9.75, "y":3.5}, + {"label":";", "x":10.75, "y":3.5}, + {"label":"'", "x":11.75, "y":3.5}, + {"label":"Enter", "x":12.75, "y":3.5, "w":2.25}, + {"label":"Shift", "x":0, "y":4.5, "w":1.25}, + {"label":"ISO \\", "x":1.25, "y":4.5}, + {"label":"Z", "x":2.25, "y":4.5}, + {"label":"X", "x":3.25, "y":4.5}, + {"label":"C", "x":4.25, "y":4.5}, + {"label":"V", "x":5.25, "y":4.5}, + {"label":"B", "x":6.25, "y":4.5}, + {"label":"N", "x":7.25, "y":4.5}, + {"label":"M", "x":8.25, "y":4.5}, + {"label":",", "x":9.25, "y":4.5}, + {"label":".", "x":10.25, "y":4.5}, + {"label":"/", "x":11.25, "y":4.5}, + {"label":"Shift", "x":12.25, "y":4.5, "w":2.75}, + {"label":"Up", "x":16.25, "y":4.5}, + {"label":"Ctrl", "x":0, "y":5.5, "w":1.25}, + {"label":"GUI", "x":1.25, "y":5.5, "w":1.25}, + {"label":"Alt", "x":2.5, "y":5.5, "w":1.25}, + {"x":3.75, "y":5.5, "w":6.25}, + {"label":"AltGr", "x":10, "y":5.5, "w":1.25}, + {"label":"GUI", "x":11.25, "y":5.5, "w":1.25}, + {"label":"Menu", "x":12.5, "y":5.5, "w":1.25}, + {"label":"Ctrl", "x":13.75, "y":5.5, "w":1.25}, + {"label":"Left", "x":15.25, "y":5.5}, + {"label":"Down", "x":16.25, "y":5.5}, + {"label":"Right", "x":17.25, "y":5.5} + ] + }, + "LAYOUT_tkl_ansi": { + "layout": [ + {"label":"Esc", "x":0, "y":0}, + {"label":"F1", "x":2, "y":0}, + {"label":"F2", "x":3, "y":0}, + {"label":"F3", "x":4, "y":0}, + {"label":"F4", "x":5, "y":0}, + {"label":"F5", "x":6.5, "y":0}, + {"label":"F6", "x":7.5, "y":0}, + {"label":"F7", "x":8.5, "y":0}, + {"label":"F8", "x":9.5, "y":0}, + {"label":"F9", "x":11, "y":0}, + {"label":"F10", "x":12, "y":0}, + {"label":"F11", "x":13, "y":0}, + {"label":"F12", "x":14, "y":0}, + {"label":"Print Screen", "x":15.25, "y":0}, + {"label":"Scroll Lock", "x":16.25, "y":0}, + {"label":"Pause", "x":17.25, "y":0}, + {"label":"`", "x":0, "y":1.5}, + {"label":"1", "x":1, "y":1.5}, + {"label":"2", "x":2, "y":1.5}, + {"label":"3", "x":3, "y":1.5}, + {"label":"4", "x":4, "y":1.5}, + {"label":"5", "x":5, "y":1.5}, + {"label":"6", "x":6, "y":1.5}, + {"label":"7", "x":7, "y":1.5}, + {"label":"8", "x":8, "y":1.5}, + {"label":"9", "x":9, "y":1.5}, + {"label":"0", "x":10, "y":1.5}, + {"label":"-", "x":11, "y":1.5}, + {"label":"=", "x":12, "y":1.5}, + {"label":"Backspace", "x":13, "y":1.5, "w":2}, + {"label":"Insert", "x":15.25, "y":1.5}, + {"label":"Home", "x":16.25, "y":1.5}, + {"label":"Page Up", "x":17.25, "y":1.5}, + {"label":"Tab", "x":0, "y":2.5, "w":1.5}, + {"label":"Q", "x":1.5, "y":2.5}, + {"label":"W", "x":2.5, "y":2.5}, + {"label":"E", "x":3.5, "y":2.5}, + {"label":"R", "x":4.5, "y":2.5}, + {"label":"T", "x":5.5, "y":2.5}, + {"label":"Y", "x":6.5, "y":2.5}, + {"label":"U", "x":7.5, "y":2.5}, + {"label":"I", "x":8.5, "y":2.5}, + {"label":"O", "x":9.5, "y":2.5}, + {"label":"P", "x":10.5, "y":2.5}, + {"label":"[", "x":11.5, "y":2.5}, + {"label":"]", "x":12.5, "y":2.5}, + {"label":"\\", "x":13.5, "y":2.5, "w":1.5}, + {"label":"Delete", "x":15.25, "y":2.5}, + {"label":"End", "x":16.25, "y":2.5}, + {"label":"Page Down", "x":17.25, "y":2.5}, + {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75}, + {"label":"A", "x":1.75, "y":3.5}, + {"label":"S", "x":2.75, "y":3.5}, + {"label":"D", "x":3.75, "y":3.5}, + {"label":"F", "x":4.75, "y":3.5}, + {"label":"G", "x":5.75, "y":3.5}, + {"label":"H", "x":6.75, "y":3.5}, + {"label":"J", "x":7.75, "y":3.5}, + {"label":"K", "x":8.75, "y":3.5}, + {"label":"L", "x":9.75, "y":3.5}, + {"label":";", "x":10.75, "y":3.5}, + {"label":"'", "x":11.75, "y":3.5}, + {"label":"Enter", "x":12.75, "y":3.5, "w":2.25}, + {"label":"Shift", "x":0, "y":4.5, "w":2.25}, + {"label":"Z", "x":2.25, "y":4.5}, + {"label":"X", "x":3.25, "y":4.5}, + {"label":"C", "x":4.25, "y":4.5}, + {"label":"V", "x":5.25, "y":4.5}, + {"label":"B", "x":6.25, "y":4.5}, + {"label":"N", "x":7.25, "y":4.5}, + {"label":"M", "x":8.25, "y":4.5}, + {"label":",", "x":9.25, "y":4.5}, + {"label":".", "x":10.25, "y":4.5}, + {"label":"/", "x":11.25, "y":4.5}, + {"label":"Shift", "x":12.25, "y":4.5, "w":2.75}, + {"label":"Up", "x":16.25, "y":4.5}, + {"label":"Ctrl", "x":0, "y":5.5, "w":1.25}, + {"label":"GUI", "x":1.25, "y":5.5, "w":1.25}, + {"label":"Alt", "x":2.5, "y":5.5, "w":1.25}, + {"x":3.75, "y":5.5, "w":6.25}, + {"label":"AltGr", "x":10, "y":5.5, "w":1.25}, + {"label":"GUI", "x":11.25, "y":5.5, "w":1.25}, + {"label":"Menu", "x":12.5, "y":5.5, "w":1.25}, + {"label":"Ctrl", "x":13.75, "y":5.5, "w":1.25}, + {"label":"Left", "x":15.25, "y":5.5}, + {"label":"Down", "x":16.25, "y":5.5}, + {"label":"Right", "x":17.25, "y":5.5} + ] + } + } +} diff --git a/keyboards/bpiphany/pegasushoof/keymaps/blowrak/keymap.c b/keyboards/bpiphany/pegasushoof/keymaps/blowrak/keymap.c index 6faf4db6f..7db7e5d39 100644 --- a/keyboards/bpiphany/pegasushoof/keymaps/blowrak/keymap.c +++ b/keyboards/bpiphany/pegasushoof/keymaps/blowrak/keymap.c @@ -15,9 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#include "pegasushoof.h" - -#define _______ KC_TRNS +#include QMK_KEYBOARD_H /* Swedish keys */ #define SE_HALF KC_GRV @@ -44,7 +42,7 @@ along with this program. If not, see . const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Layer 0: Blowrak ISO layer, a Swedish take on Dvorak */ - [KM_BLOWRAK] = KEYMAP( \ + [KM_BLOWRAK] = LAYOUT( \ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR,KC_SLCK,KC_PAUS, \ SE_HALF, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, SE_PLUS,SE_ACUT,KC_BSPC, KC_INS, KC_HOME,KC_PGUP, \ KC_TAB, SE_AO, SE_AE, SE_OE, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_COMM,SE_CIRC,SE_QUOT, KC_DEL, KC_END, KC_PGDN, \ @@ -52,7 +50,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LSFT, SE_LTGT,KC_DOT, KC_Q, KC_J, KC_K, KC_B, KC_X, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, KC_UP, \ KC_FN0, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI,KC_MENU,KC_FN1, KC_LEFT,KC_DOWN,KC_RGHT), /* Layer 1: Standard ISO layer */ - [KM_QWERTY] = KEYMAP( \ + [KM_QWERTY] = LAYOUT( \ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR,KC_SLCK,KC_PAUS, \ SE_HALF, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, SE_PLUS,SE_ACUT,KC_BSPC, KC_INS, KC_HOME,KC_PGUP, \ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, SE_AO, SE_CIRC,SE_QUOT, KC_DEL, KC_END, KC_PGDN, \ @@ -60,7 +58,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LSFT, SE_LTGT,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, SE_MINS, KC_RSFT, KC_UP, \ KC_FN0, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI,KC_MENU,KC_FN1, KC_LEFT,KC_DOWN,KC_RGHT), /* Layer 2: Media layer */ - [KM_MEDIA] = KEYMAP( \ + [KM_MEDIA] = LAYOUT( \ _______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, KC_WAKE,KC_PWR, KC_SLEP, \ _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______,KC_VOLU, \ _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, KC_MUTE,_______,KC_VOLD, \ @@ -68,7 +66,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______, KC_MPLY, \ _______,_______,_______, _______, _______,_______,RESET ,_______, KC_MPRV,KC_MSTP,KC_MNXT), /* Layer 3: Programming layer */ - [KM_HAXHAX] = KEYMAP( \ + [KM_HAXHAX] = LAYOUT( \ _______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______,_______, \ _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______,_______, \ _______,SE_LCBR,SE_PIPE,SE_RCBR,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______,_______, \ diff --git a/keyboards/bpiphany/pegasushoof/keymaps/blowrak/rules.mk b/keyboards/bpiphany/pegasushoof/keymaps/blowrak/rules.mk index 7a616ee5f..8254a8389 100644 --- a/keyboards/bpiphany/pegasushoof/keymaps/blowrak/rules.mk +++ b/keyboards/bpiphany/pegasushoof/keymaps/blowrak/rules.mk @@ -1,5 +1,5 @@ # Build Options -# change to "no" to disable the options, or define them in the Makefile in +# change to "no" to disable the options, or define them in the Makefile in # the appropriate keymap folder that will get included automatically # BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) @@ -14,9 +14,4 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. - - -ifndef QUANTUM_DIR - include ../../../../Makefile -endif +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. diff --git a/keyboards/bpiphany/pegasushoof/keymaps/citadel/config.h b/keyboards/bpiphany/pegasushoof/keymaps/citadel/config.h index 2d27ff392..122627e88 100644 --- a/keyboards/bpiphany/pegasushoof/keymaps/citadel/config.h +++ b/keyboards/bpiphany/pegasushoof/keymaps/citadel/config.h @@ -1,11 +1,6 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" +#pragma once /* overridden settings: */ #undef PRODUCT #define PRODUCT Pegasus Hoof Citadel - -#endif diff --git a/keyboards/bpiphany/pegasushoof/keymaps/citadel/keymap.c b/keyboards/bpiphany/pegasushoof/keymaps/citadel/keymap.c index 382854de9..79f07d3bb 100644 --- a/keyboards/bpiphany/pegasushoof/keymaps/citadel/keymap.c +++ b/keyboards/bpiphany/pegasushoof/keymaps/citadel/keymap.c @@ -14,7 +14,7 @@ * along with this program. If not, see . */ -#include "pegasushoof.h" +#include QMK_KEYBOARD_H /* Allow shortcuts for combos like RALT(KC_RBRC) that don't take up more than 7 characters: */ #define G(kc) RALT(KC_##kc) @@ -58,7 +58,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * '------------------------------------------------------------------------' '--------------' * NUHS = true position of KC_NUHS */ -[DEF] = KEYMAP( \ +[DEF] = LAYOUT( \ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR,KC_SLCK,TD(AF4), \ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL, KC_BSPC, KC_INS, KC_HOME,KC_PGUP, \ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC,KC_NUHS, KC_DEL, KC_END, KC_PGDN, \ @@ -89,7 +89,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * '------------------------------------------------------------------------' '--------------' * */ -[FUN] = KEYMAP( \ +[FUN] = LAYOUT( \ CTALDEL, KC_MYCM,KC_WHOM,KC_CALC,KC_MSEL,KC_MPRV,KC_MNXT,KC_MPLY,KC_MSTP,KC_MUTE,KC_VOLD,KC_VOLU,MO(RES), _______,KC_SLCK,KC_PAUS, \ _______,_______,_______,_______,_______,_______,_______,G(7), G(8), G(9), G(0), G(MINS),_______,_______, _______,_______,KC_WH_U, \ _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,G(RBRC),_______, _______,_______,KC_WH_D, \ @@ -99,7 +99,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Layer 3: Reset layer (prevents accidental resets) */ -[RES] = KEYMAP( \ +[RES] = LAYOUT( \ _______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______,_______, \ _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______,_______, \ _______,_______,_______,_______,RESET, _______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______,_______, \ diff --git a/keyboards/bpiphany/pegasushoof/keymaps/citadel/rules.mk b/keyboards/bpiphany/pegasushoof/keymaps/citadel/rules.mk index 4cec29477..3eb289a71 100644 --- a/keyboards/bpiphany/pegasushoof/keymaps/citadel/rules.mk +++ b/keyboards/bpiphany/pegasushoof/keymaps/citadel/rules.mk @@ -13,10 +13,5 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. TAP_DANCE_ENABLE = yes # see https://docs.qmk.fm/#/feature_tap_dance (+1000) - - -ifndef QUANTUM_DIR - include ../../../../Makefile -endif diff --git a/keyboards/bpiphany/pegasushoof/keymaps/default/keymap.c b/keyboards/bpiphany/pegasushoof/keymaps/default/keymap.c index aa006b23a..621441b90 100644 --- a/keyboards/bpiphany/pegasushoof/keymaps/default/keymap.c +++ b/keyboards/bpiphany/pegasushoof/keymaps/default/keymap.c @@ -15,46 +15,42 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#include "pegasushoof.h" - -#define _______ KC_TRNS +#include QMK_KEYBOARD_H #define KM_QWERTY 0 #define KM_MEDIA 1 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* Layer 0: Standard ISO layer */ - [KM_QWERTY] = KEYMAP( \ - KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR,KC_SLCK,KC_PAUS, \ - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL, KC_BSPC, KC_INS, KC_HOME,KC_PGUP, \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC,KC_BSLS, KC_DEL, KC_END, KC_PGDN, \ - KC_CLCK, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_ENT, \ - KC_LSFT, KC_NUBS,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT, KC_UP, \ - KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI,KC_MENU,KC_FN0, KC_LEFT,KC_DOWN,KC_RGHT), - /* Layer 1: Function layer */ - [KM_MEDIA] = KEYMAP( \ - _______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, KC_WAKE,KC_PWR, KC_SLEP, \ - _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______,KC_VOLU, \ - _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______,KC_VOLD, \ - _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______, \ - _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______, KC_MPLY, \ - _______,_______,_______, _______, _______,_______,RESET ,_______, KC_MPRV,KC_MSTP,KC_MNXT) -}; - -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_LAYER_MOMENTARY(KM_MEDIA) + /* Layer 0: Standard ISO layer */ + [KM_QWERTY] = LAYOUT( \ + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, \ + KC_CLCK, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_MENU, MO(1), KC_LEFT, KC_DOWN, KC_RGHT \ + ), + /* Layer 1: Function layer */ + [KM_MEDIA] = LAYOUT( \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_WAKE, KC_PWR, KC_SLEP, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLU, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLD, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, \ + _______, _______, _______, _______, _______, _______, RESET, _______, KC_MPRV, KC_MSTP, KC_MNXT \ + ) }; void led_set_user(uint8_t usb_led) { - if (usb_led & (1 << USB_LED_CAPS_LOCK)) { - ph_caps_led_on(); - } else { - ph_caps_led_off(); - } + if (usb_led & (1 << USB_LED_CAPS_LOCK)) { + ph_caps_led_on(); + } else { + ph_caps_led_off(); + } - if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { - ph_sclk_led_on(); - } else { - ph_sclk_led_off(); - } + if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { + ph_sclk_led_on(); + } else { + ph_sclk_led_off(); + } } diff --git a/keyboards/bpiphany/pegasushoof/keymaps/default/rules.mk b/keyboards/bpiphany/pegasushoof/keymaps/default/rules.mk index 7a616ee5f..8254a8389 100644 --- a/keyboards/bpiphany/pegasushoof/keymaps/default/rules.mk +++ b/keyboards/bpiphany/pegasushoof/keymaps/default/rules.mk @@ -1,5 +1,5 @@ # Build Options -# change to "no" to disable the options, or define them in the Makefile in +# change to "no" to disable the options, or define them in the Makefile in # the appropriate keymap folder that will get included automatically # BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) @@ -14,9 +14,4 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. - - -ifndef QUANTUM_DIR - include ../../../../Makefile -endif +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. diff --git a/keyboards/bpiphany/pegasushoof/pegasushoof.h b/keyboards/bpiphany/pegasushoof/pegasushoof.h index 939a854cd..b91235aad 100644 --- a/keyboards/bpiphany/pegasushoof/pegasushoof.h +++ b/keyboards/bpiphany/pegasushoof/pegasushoof.h @@ -21,25 +21,39 @@ along with this program. If not, see . #include "matrix.h" #include "quantum.h" -#define ___ KC_NO +#define LAYOUT( \ + KG6, KH4, KI4, KI2, KI6, KP5, KL6, KM2, KM4, KO4, KO5, KO6, KO0, KN5, KN7, KP7, \ + KG4, KG5, KH5, KI5, KJ5, KJ4, KK4, KK5, KL5, KM5, KF5, KF4, KL4, KO2, KR4, KC4, KE4, \ + KG2, KG7, KH7, KI7, KJ7, KJ2, KK2, KK7, KL7, KM7, KF7, KF2, KL2, KO3, KQ4, KC5, KE5, \ + KH2, KG3, KH3, KI3, KJ3, KJ6, KK6, KK3, KL3, KM3, KF3, KF6, KO1, \ + KB2, KH6, KG1, KH1, KI1, KJ1, KJ0, KK0, KK1, KL1, KM1, KF0, KB3, KC6, \ + KP4, KD2, KN6, KQ6, KN0, KA3, KM0, KP1, KC0, KQ0, KR0 \ + ) { /* 00-A 01-B 02-C 03-D 04-E 05-F 06-G 07-H 08-I 09-J 10-K 11-L 12-M 13-N 14-O 15-P 16-Q 17-R */ \ + /* 0 */ { KC_NO , KC_NO , KC0 , KC_NO , KC_NO , KF0 , KC_NO , KC_NO , KC_NO , KJ0 , KK0 , KC_NO , KM0 , KN0 , KO0 , KC_NO , KQ0 , KR0 }, \ + /* 1 */ { KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KG1 , KH1 , KI1 , KJ1 , KK1 , KL1 , KM1 , KC_NO , KO1 , KP1 , KC_NO , KC_NO }, \ + /* 2 */ { KC_NO , KB2 , KC_NO , KD2 , KC_NO , KF2 , KG2 , KH2 , KI2 , KJ2 , KK2 , KL2 , KM2 , KC_NO , KO2 , KC_NO , KC_NO , KC_NO }, \ + /* 3 */ { KA3 , KB3 , KC_NO , KC_NO , KC_NO , KF3 , KG3 , KH3 , KI3 , KJ3 , KK3 , KL3 , KM3 , KC_NO , KO3 , KC_NO , KC_NO , KC_NO }, \ + /* 4 */ { KC_NO , KC_NO , KC4 , KC_NO , KE4 , KF4 , KG4 , KH4 , KI4 , KJ4 , KK4 , KL4 , KM4 , KC_NO , KO4 , KP4 , KQ4 , KR4 }, \ + /* 5 */ { KC_NO , KC_NO , KC5 , KC_NO , KE5 , KF5 , KG5 , KH5 , KI5 , KJ5 , KK5 , KL5 , KM5 , KN5 , KO5 , KP5 , KC_NO , KC_NO }, \ + /* 6 */ { KC_NO , KC_NO , KC6 , KC_NO , KC_NO , KF6 , KG6 , KH6 , KI6 , KJ6 , KK6 , KL6 , KC_NO , KN6 , KO6 , KC_NO , KQ6 , KC_NO }, \ + /* 7 */ { KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KF7 , KG7 , KH7 , KI7 , KJ7 , KK7 , KL7 , KM7 , KN7 , KC_NO , KP7 , KC_NO , KC_NO } \ + } -#define KEYMAP( \ - KG6, KH4, KI4, KI2, KI6, KP5, KL6, KM2, KM4, KO4, KO5, KO6, KO0, KN5, KN7, KP7, \ - KG4, KG5, KH5, KI5, KJ5, KJ4, KK4, KK5, KL5, KM5, KF5, KF4, KL4, KO2, KR4, KC4, KE4, \ - KG2, KG7, KH7, KI7, KJ7, KJ2, KK2, KK7, KL7, KM7, KF7, KF2, KL2, KO3, KQ4, KC5, KE5, \ - KH2, KG3, KH3, KI3, KJ3, KJ6, KK6, KK3, KL3, KM3, KF3, KF6, KO1, \ - KB2, KH6, KG1, KH1, KI1, KJ1, KJ0, KK0, KK1, KL1, KM1, KF0, KB3, KC6, \ - KP4, KD2, KN6, KQ6, KN0, KA3, KM0, KP1, KC0, KQ0, KR0 \ - ) { /* 00-A 01-B 02-C 03-D 04-E 05-F 06-G 07-H 08-I 09-J 10-K 11-L 12-M 13-N 14-O 15-P 16-Q 17-R */ \ - /* 0 */ { ___ , ___ , KC0 , ___ , ___ , KF0 , ___ , ___ , ___ , KJ0 , KK0 , ___ , KM0 , KN0 , KO0 , ___ , KQ0 , KR0 }, \ - /* 1 */ { ___ , ___ , ___ , ___ , ___ , ___ , KG1 , KH1 , KI1 , KJ1 , KK1 , KL1 , KM1 , ___ , KO1 , KP1 , ___ , ___ }, \ - /* 2 */ { ___ , KB2 , ___ , KD2 , ___ , KF2 , KG2 , KH2 , KI2 , KJ2 , KK2 , KL2 , KM2 , ___ , KO2 , ___ , ___ , ___ }, \ - /* 3 */ { KA3 , KB3 , ___ , ___ , ___ , KF3 , KG3 , KH3 , KI3 , KJ3 , KK3 , KL3 , KM3 , ___ , KO3 , ___ , ___ , ___ }, \ - /* 4 */ { ___ , ___ , KC4 , ___ , KE4 , KF4 , KG4 , KH4 , KI4 , KJ4 , KK4 , KL4 , KM4 , ___ , KO4 , KP4 , KQ4 , KR4 }, \ - /* 5 */ { ___ , ___ , KC5 , ___ , KE5 , KF5 , KG5 , KH5 , KI5 , KJ5 , KK5 , KL5 , KM5 , KN5 , KO5 , KP5 , ___ , ___ }, \ - /* 6 */ { ___ , ___ , KC6 , ___ , ___ , KF6 , KG6 , KH6 , KI6 , KJ6 , KK6 , KL6 , ___ , KN6 , KO6 , ___ , KQ6 , ___ }, \ - /* 7 */ { ___ , ___ , ___ , ___ , ___ , KF7 , KG7 , KH7 , KI7 , KJ7 , KK7 , KL7 , KM7 , KN7 , ___ , KP7 , ___ , ___ }, \ - } +#define LAYOUT_tkl_ansi( \ + KG6, KH4, KI4, KI2, KI6, KP5, KL6, KM2, KM4, KO4, KO5, KO6, KO0, KN5, KN7, KP7, \ + KG4, KG5, KH5, KI5, KJ5, KJ4, KK4, KK5, KL5, KM5, KF5, KF4, KL4, KO2, KR4, KC4, KE4, \ + KG2, KG7, KH7, KI7, KJ7, KJ2, KK2, KK7, KL7, KM7, KF7, KF2, KL2, KO3, KQ4, KC5, KE5, \ + KH2, KG3, KH3, KI3, KJ3, KJ6, KK6, KK3, KL3, KM3, KF3, KF6, KO1, \ + KB2, KG1, KH1, KI1, KJ1, KJ0, KK0, KK1, KL1, KM1, KF0, KB3, KC6, \ + KP4, KD2, KN6, KQ6, KN0, KA3, KM0, KP1, KC0, KQ0, KR0 \ + ) LAYOUT( \ + KG6, KH4, KI4, KI2, KI6, KP5, KL6, KM2, KM4, KO4, KO5, KO6, KO0, KN5, KN7, KP7, \ + KG4, KG5, KH5, KI5, KJ5, KJ4, KK4, KK5, KL5, KM5, KF5, KF4, KL4, KO2, KR4, KC4, KE4, \ + KG2, KG7, KH7, KI7, KJ7, KJ2, KK2, KK7, KL7, KM7, KF7, KF2, KL2, KO3, KQ4, KC5, KE5, \ + KH2, KG3, KH3, KI3, KJ3, KJ6, KK6, KK3, KL3, KM3, KF3, KF6, KO1, \ + KB2,KC_NO,KG1, KH1, KI1, KJ1, KJ0, KK0, KK1, KL1, KM1, KF0, KB3, KC6, \ + KP4, KD2, KN6, KQ6, KN0, KA3, KM0, KP1, KC0, KQ0, KR0 \ + ) #define LAYOUT_tkl_jis( \ KG6, KH4, KI4, KI2, KI6, KP5, KL6, KM2, KM4, KO4, KO5, KO6, KO0, KN5, KN7, KP7, \ @@ -49,14 +63,14 @@ along with this program. If not, see . KB2, KG1, KH1, KI1, KJ1, KJ0, KK0, KK1, KL1, KM1, KF0, KL0, KB3, KC6, \ KP4, KD2, KN6, KG0, KQ6, KH0, KI0, KN0, KM0, KP1, KC0, KQ0, KR0 \ ) { /* 00-A 01-B 02-C 03-D 04-E 05-F 06-G 07-H 08-I 09-J 10-K 11-L 12-M 13-N 14-O 15-P 16-Q 17-R */ \ - /* 0 */ { ___ , ___ , KC0 , ___ , ___ , KF0 , KG0 , KH0 , KI0 , KJ0 , KK0 , KL0 , KM0 , KN0 , KO0 , ___ , KQ0 , KR0 }, \ - /* 1 */ { ___ , ___ , ___ , ___ , ___ , ___ , KG1 , KH1 , KI1 , KJ1 , KK1 , KL1 , KM1 , ___ , KO1 , KP1 , ___ , ___ }, \ - /* 2 */ { ___ , KB2 , ___ , KD2 , ___ , KF2 , KG2 , KH2 , KI2 , KJ2 , KK2 , KL2 , KM2 , ___ , KO2 , ___ , ___ , ___ }, \ - /* 3 */ { ___ , KB3 , ___ , ___ , ___ , KF3 , KG3 , KH3 , KI3 , KJ3 , KK3 , KL3 , KM3 , ___ , KO3 , ___ , ___ , ___ }, \ - /* 4 */ { ___ , ___ , KC4 , ___ , KE4 , KF4 , KG4 , KH4 , KI4 , KJ4 , KK4 , KL4 , KM4 , ___ , KO4 , KP4 , KQ4 , KR4 }, \ - /* 5 */ { ___ , ___ , KC5 , ___ , KE5 , KF5 , KG5 , KH5 , KI5 , KJ5 , KK5 , KL5 , KM5 , KN5 , KO5 , KP5 , ___ , ___ }, \ - /* 6 */ { ___ , ___ , KC6 , ___ , ___ , KF6 , KG6 , ___ , KI6 , KJ6 , KK6 , KL6 , ___ , KN6 , KO6 , ___ , KQ6 , ___ }, \ - /* 7 */ { ___ , ___ , ___ , ___ , ___ , KF7 , KG7 , KH7 , KI7 , KJ7 , KK7 , KL7 , KM7 , KN7 , KO7 , KP7 , ___ , ___ }, \ + /* 0 */ { KC_NO, KC_NO, KC0, KC_NO, KC_NO, KF0, KG0, KH0, KI0, KJ0, KK0, KL0, KM0, KN0, KO0, KC_NO, KQ0, KR0 }, \ + /* 1 */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KG1, KH1, KI1, KJ1, KK1, KL1, KM1, KC_NO, KO1, KP1, KC_NO, KC_NO }, \ + /* 2 */ { KC_NO, KB2, KC_NO, KD2, KC_NO, KF2, KG2, KH2, KI2, KJ2, KK2, KL2, KM2, KC_NO, KO2, KC_NO, KC_NO, KC_NO }, \ + /* 3 */ { KC_NO, KB3, KC_NO, KC_NO, KC_NO, KF3, KG3, KH3, KI3, KJ3, KK3, KL3, KM3, KC_NO, KO3, KC_NO, KC_NO, KC_NO }, \ + /* 4 */ { KC_NO, KC_NO, KC4, KC_NO, KE4, KF4, KG4, KH4, KI4, KJ4, KK4, KL4, KM4, KC_NO, KO4, KP4, KQ4, KR4 }, \ + /* 5 */ { KC_NO, KC_NO, KC5, KC_NO, KE5, KF5, KG5, KH5, KI5, KJ5, KK5, KL5, KM5, KN5, KO5, KP5, KC_NO, KC_NO }, \ + /* 6 */ { KC_NO, KC_NO, KC6, KC_NO, KC_NO, KF6, KG6, KC_NO, KI6, KJ6, KK6, KL6, KC_NO, KN6, KO6, KC_NO, KQ6, KC_NO }, \ + /* 7 */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KF7, KG7, KH7, KI7, KJ7, KK7, KL7, KK7, KL7, KO7, KP7, KC_NO, KC_NO } \ } inline void ph_caps_led_on(void) { DDRC |= (1<<6); PORTC &= ~(1<<6); } diff --git a/keyboards/bpiphany/pegasushoof/README.md b/keyboards/bpiphany/pegasushoof/readme.md similarity index 63% rename from keyboards/bpiphany/pegasushoof/README.md rename to keyboards/bpiphany/pegasushoof/readme.md index 1b3d63190..10ec79300 100644 --- a/keyboards/bpiphany/pegasushoof/README.md +++ b/keyboards/bpiphany/pegasushoof/readme.md @@ -1,9 +1,10 @@ -Pegasus Hoof Controller -=== +# Pegasus Hoof Controller + +A replacement controller that turns your Filco Majestouch 87/88 mechanical keyboard into a fully programmable keyboard. Keyboard Maintainer: QMK Community Hardware Supported: Pegasus Hoof -Hardware Availability: https://1upkeyboards.com/filco-pegasus-hoof-controller.html +Hardware Availability: [1upkeyboards](https://www.1upkeyboards.com/shop/controllers/filco-pegasus-hoof-controller/) Make example for this keyboard (after setting up your build environment): diff --git a/keyboards/bpiphany/pegasushoof/rules.mk b/keyboards/bpiphany/pegasushoof/rules.mk index 0cfe115aa..00e4bb0ea 100644 --- a/keyboards/bpiphany/pegasushoof/rules.mk +++ b/keyboards/bpiphany/pegasushoof/rules.mk @@ -60,8 +60,9 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. +LAYOUTS = tkl_ansi CUSTOM_MATRIX = yes SRC = matrix.c From 91a4a63ac79460c63a8a8d49786ca2a67265b24d Mon Sep 17 00:00:00 2001 From: Fred Silberberg Date: Fri, 14 Dec 2018 18:39:16 -0800 Subject: [PATCH 701/788] Fix keymap build to send over remote desktop correctly. (#4651) --- keyboards/bigswitch/keymaps/333fred/keymap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/bigswitch/keymaps/333fred/keymap.c b/keyboards/bigswitch/keymaps/333fred/keymap.c index 791fb435f..be40fecb2 100644 --- a/keyboards/bigswitch/keymaps/333fred/keymap.c +++ b/keyboards/bigswitch/keymaps/333fred/keymap.c @@ -79,7 +79,7 @@ void dance_finished(qk_tap_dance_state_t *state, void* user_data) { case SINGLE_TAP: { // VS Build: CTRL+SHIFT+B - SEND_STRING(SS_DOWN(X_LCTRL) SS_DOWN(X_LALT) "b" SS_UP(X_LALT) SS_UP(X_LCTRL)); + send_string_with_delay_P(PSTR(SS_DOWN(X_LCTRL) SS_DOWN(X_LSHIFT) "b" SS_UP(X_LSHIFT) SS_UP(X_LCTRL)), 10); tap_dance_active = false; break; } From 4f1f52b53ba66ff83ce57e662c27b309ead9c693 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 14 Dec 2018 18:39:54 -0800 Subject: [PATCH 702/788] Add left/right EEPROM flashing for DFU (#4560) --- tmk_core/avr.mk | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/tmk_core/avr.mk b/tmk_core/avr.mk index add904c9c..0c3a9624c 100644 --- a/tmk_core/avr.mk +++ b/tmk_core/avr.mk @@ -169,6 +169,36 @@ dfu-ee: $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).eep fi $(DFU_PROGRAMMER) $(MCU) reset +dfu-split-left: $(BUILD_DIR)/$(TARGET).hex cpfirmware check-size + until $(DFU_PROGRAMMER) $(MCU) get bootloader-version; do\ + echo "Error: Bootloader not found. Trying again in 5s." ;\ + sleep 5 ;\ + done + if $(DFU_PROGRAMMER) --version 2>&1 | $(GREP) -q 0.7 ; then\ + $(DFU_PROGRAMMER) $(MCU) erase --force;\ + $(DFU_PROGRAMMER) $(MCU) flash --eeprom $(QUANTUM_PATH)/split_common/eeprom-lefthand.eep;\ + else\ + $(DFU_PROGRAMMER) $(MCU) erase;\ + $(DFU_PROGRAMMER) $(MCU) flash-eeprom $(QUANTUM_PATH)/split_common/eeprom-lefthand.eep;\ + fi + $(DFU_PROGRAMMER) $(MCU) flash $(BUILD_DIR)/$(TARGET).hex + $(DFU_PROGRAMMER) $(MCU) reset + +dfu-split-right: $(BUILD_DIR)/$(TARGET).hex cpfirmware check-size + until $(DFU_PROGRAMMER) $(MCU) get bootloader-version; do\ + echo "Error: Bootloader not found. Trying again in 5s." ;\ + sleep 5 ;\ + done + if $(DFU_PROGRAMMER) --version 2>&1 | $(GREP) -q 0.7 ; then\ + $(DFU_PROGRAMMER) $(MCU) erase --force;\ + $(DFU_PROGRAMMER) $(MCU) flash --eeprom $(QUANTUM_PATH)/split_common/eeprom-righthand.eep;\ + else\ + $(DFU_PROGRAMMER) $(MCU) erase;\ + $(DFU_PROGRAMMER) $(MCU) flash-eeprom $(QUANTUM_PATH)/split_common/eeprom-rightand.eep;\ + fi + $(DFU_PROGRAMMER) $(MCU) flash $(BUILD_DIR)/$(TARGET).hex + $(DFU_PROGRAMMER) $(MCU) reset + define EXEC_AVRDUDE USB= ;\ if $(GREP) -q -s Microsoft /proc/version; then \ @@ -279,4 +309,3 @@ production: $(BUILD_DIR)/$(TARGET).hex bootloader cpfirmware @cat $(TARGET)_bootloader.hex >> $(TARGET)_production.hex echo "File sizes:" $(SIZE) $(TARGET).hex $(TARGET)_bootloader.hex $(TARGET)_production.hex - From a49d98e665d934c318894cfc9d9813adacd08f11 Mon Sep 17 00:00:00 2001 From: noroadsleft Date: Fri, 14 Dec 2018 02:29:14 -0800 Subject: [PATCH 703/788] Comet46: Configurator support --- keyboards/comet46/info.json | 62 +++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 keyboards/comet46/info.json diff --git a/keyboards/comet46/info.json b/keyboards/comet46/info.json new file mode 100644 index 000000000..9881397b4 --- /dev/null +++ b/keyboards/comet46/info.json @@ -0,0 +1,62 @@ +{ + "keyboard_name": "Comet46", + "url": "", + "maintainer": "SatT", + "width": 15, + "height": 4.9, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"TAB", "x":0, "y":0.45}, + {"label":"Q", "x":1, "y":0.45}, + {"label":"W", "x":2, "y":0.15}, + {"label":"E", "x":3, "y":0}, + {"label":"R", "x":4, "y":0.30}, + {"label":"T", "x":5, "y":0.45}, + {"label":"Y", "x":9, "y":0.45}, + {"label":"U", "x":10, "y":0.30}, + {"label":"I", "x":11, "y":0}, + {"label":"O", "x":12, "y":0.15}, + {"label":"P", "x":13, "y":0.45}, + {"label":"BSPC", "x":14, "y":0.45}, + + {"label":"LCTL", "x":0, "y":1.45}, + {"label":"A", "x":1, "y":1.45}, + {"label":"S", "x":2, "y":1.15}, + {"label":"D", "x":3, "y":1}, + {"label":"F", "x":4, "y":1.30}, + {"label":"G", "x":5, "y":1.45}, + {"label":"ESC", "x":6, "y":1}, + {"label":"DEL", "x":8, "y":1}, + {"label":"H", "x":9, "y":1.45}, + {"label":"J", "x":10, "y":1.30}, + {"label":"K", "x":11, "y":1}, + {"label":"L", "x":12, "y":1.15}, + {"label":"SCLN", "x":13, "y":1.45}, + {"label":"QUOT", "x":14, "y":1.45}, + + {"label":"LSFT", "x":0, "y":2.45}, + {"label":"Z", "x":1, "y":2.45}, + {"label":"X", "x":2, "y":2.15}, + {"label":"C", "x":3, "y":2}, + {"label":"V", "x":4, "y":2.30}, + {"label":"B", "x":5, "y":2.45}, + {"label":"LCBR", "x":6, "y":2}, + {"label":"RCBR", "x":8, "y":2}, + {"label":"N", "x":9, "y":2.45}, + {"label":"M", "x":10, "y":2.30}, + {"label":"COMM", "x":11, "y":2}, + {"label":"DOT", "x":12, "y":2.15}, + {"label":"SLSH", "x":13, "y":2.45}, + {"label":"RSFT", "x":14, "y":2.45}, + + {"label":"LGUI", "x":4, "y":3.9}, + {"label":"LOWER", "x":5, "y":3.9}, + {"label":"SPACE", "x":6, "y":3.4, "h":1.5}, + {"label":"ENTER", "x":8, "y":3.4, "h":1.5}, + {"label":"RAISE", "x":9, "y":3.9}, + {"label":"LALT", "x":10, "y":3.9} + ] + } + } +} From 8f790948e5f7ed62b2c56e1a6aa63dae89d5c860 Mon Sep 17 00:00:00 2001 From: Takeshi ISHII <2170248+mtei@users.noreply.github.com> Date: Sat, 15 Dec 2018 14:31:56 +0900 Subject: [PATCH 704/788] Refactor quantum/split_common/i2c.c, quantum/split_common/serial.c (#4522) * add temporary compile test shell script * Extended support of SKIP_VERSION to make invariant compile results during testing. * build_keyboard.mk, tmk_core/rules.mk: add LIB_SRC, QUANTUM_LIB_SRC support Support compiled object enclosed in library. e.g. ``` LIB_SRC += xxxx.c xxxx.c --> xxxx.o ---> xxxx.a ``` * remove 'ifdef/ifndef USE_I2C' from quantum/split_common/{i2c|serial}.c * add SKIP_DEBUG_INFO into tmk_core/rules.mk When SKIP_DEBUG_INFO=yes is specified, do not use the -g option at compile time. * tmk_core/rules.mk: Library object need -fno-lto * add SKIP_DEBUG_INFO=yes * remove temporary compile test shell script * add '#define SOFT_SERIAL_PIN D0' to keyboards/lets_split/rev?/config.h * quantum/split_common/serial.c: Changed not to use USE_I2C. --- build_keyboard.mk | 6 +++++ common_features.mk | 6 ++--- keyboards/lets_split/rev1/config.h | 3 +++ keyboards/lets_split/rev2/config.h | 3 +++ keyboards/lets_split/sockets/config.h | 3 +++ quantum/split_common/i2c.c | 3 --- quantum/split_common/serial.c | 16 +++++------- tmk_core/common/command.c | 4 +++ tmk_core/rules.mk | 36 +++++++++++++++++++++------ 9 files changed, 56 insertions(+), 24 deletions(-) diff --git a/build_keyboard.mk b/build_keyboard.mk index d225fe821..b639b92d3 100644 --- a/build_keyboard.mk +++ b/build_keyboard.mk @@ -34,6 +34,10 @@ $(error MASTER does not have a valid value(left/right)) endif endif +ifdef SKIP_VERSION + OPT_DEFS += -DSKIP_VERSION +endif + # Determine which subfolders exist. KEYBOARD_FOLDER_PATH_1 := $(KEYBOARD) KEYBOARD_FOLDER_PATH_2 := $(patsubst %/,%,$(dir $(KEYBOARD_FOLDER_PATH_1))) @@ -278,6 +282,7 @@ ifneq ("$(wildcard $(KEYMAP_PATH)/config.h)","") endif # # project specific files +SRC += $(patsubst %.c,%.clib,$(LIB_SRC)) SRC += $(KEYBOARD_SRC) \ $(KEYMAP_C) \ $(QUANTUM_SRC) @@ -296,6 +301,7 @@ include $(TMK_PATH)/protocol.mk include $(TMK_PATH)/common.mk include bootloader.mk +SRC += $(patsubst %.c,%.clib,$(QUANTUM_LIB_SRC)) SRC += $(TMK_COMMON_SRC) OPT_DEFS += $(TMK_COMMON_DEFS) EXTRALDFLAGS += $(TMK_COMMON_LDFLAGS) diff --git a/common_features.mk b/common_features.mk index 97febe2e7..73aab5d84 100644 --- a/common_features.mk +++ b/common_features.mk @@ -270,7 +270,7 @@ ifeq ($(strip $(SPLIT_KEYBOARD)), yes) endif OPT_DEFS += -DSPLIT_KEYBOARD QUANTUM_SRC += $(QUANTUM_DIR)/split_common/split_flags.c \ - $(QUANTUM_DIR)/split_common/split_util.c \ - $(QUANTUM_DIR)/split_common/i2c.c \ - $(QUANTUM_DIR)/split_common/serial.c + $(QUANTUM_DIR)/split_common/split_util.c + QUANTUM_LIB_SRC += $(QUANTUM_DIR)/split_common/i2c.c + QUANTUM_LIB_SRC += $(QUANTUM_DIR)/split_common/serial.c endif diff --git a/keyboards/lets_split/rev1/config.h b/keyboards/lets_split/rev1/config.h index a8d614915..18b7cce5a 100644 --- a/keyboards/lets_split/rev1/config.h +++ b/keyboards/lets_split/rev1/config.h @@ -45,6 +45,9 @@ along with this program. If not, see . /* Set 0 if debouncing isn't needed */ #define DEBOUNCING_DELAY 5 +/* serial.c configuration for split keyboard */ +#define SOFT_SERIAL_PIN D0 + /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ #define LOCKING_SUPPORT_ENABLE /* Locking resynchronize hack */ diff --git a/keyboards/lets_split/rev2/config.h b/keyboards/lets_split/rev2/config.h index 8844e5bb8..1c0871cd1 100644 --- a/keyboards/lets_split/rev2/config.h +++ b/keyboards/lets_split/rev2/config.h @@ -45,6 +45,9 @@ along with this program. If not, see . /* Set 0 if debouncing isn't needed */ #define DEBOUNCING_DELAY 5 +/* serial.c configuration for split keyboard */ +#define SOFT_SERIAL_PIN D0 + /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ #define LOCKING_SUPPORT_ENABLE /* Locking resynchronize hack */ diff --git a/keyboards/lets_split/sockets/config.h b/keyboards/lets_split/sockets/config.h index 10d0c997e..6939d37dc 100644 --- a/keyboards/lets_split/sockets/config.h +++ b/keyboards/lets_split/sockets/config.h @@ -45,6 +45,9 @@ along with this program. If not, see . /* Set 0 if debouncing isn't needed */ #define DEBOUNCING_DELAY 5 +/* serial.c configuration for split keyboard */ +#define SOFT_SERIAL_PIN D0 + /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ #define LOCKING_SUPPORT_ENABLE /* Locking resynchronize hack */ diff --git a/quantum/split_common/i2c.c b/quantum/split_common/i2c.c index b3d7fcc68..45e958b39 100644 --- a/quantum/split_common/i2c.c +++ b/quantum/split_common/i2c.c @@ -7,8 +7,6 @@ #include "i2c.h" #include "split_flags.h" -#if defined(USE_I2C) || defined(EH) - // Limits the amount of we wait for any one i2c transaction. // Since were running SCL line 100kHz (=> 10μs/bit), and each transactions is // 9 bits, a single transaction will take around 90μs to complete. @@ -184,4 +182,3 @@ ISR(TWI_vect) { // Reset everything, so we are ready for the next TWI interrupt TWCR |= (1< #include "serial.h" -#ifndef USE_I2C - -#ifndef SOFT_SERIAL_PIN - #error quantum/split_common/serial.c need SOFT_SERIAL_PIN define -#endif +#ifdef SOFT_SERIAL_PIN #ifdef __AVR_ATmega32U4__ // if using ATmega32U4 I2C, can not use PD0 and PD1 in soft serial. - #ifdef USE_I2C - #if SOFT_SERIAL_PIN == D0 || SOFT_SERIAL_PIN == D1 - #error Using ATmega32U4 I2C, so can not use PD0, PD1 - #endif + #ifdef USE_AVR_I2C + #if SOFT_SERIAL_PIN == D0 || SOFT_SERIAL_PIN == D1 + #error Using ATmega32U4 I2C, so can not use PD0, PD1 + #endif #endif #if SOFT_SERIAL_PIN >= D0 && SOFT_SERIAL_PIN <= D3 @@ -278,4 +274,4 @@ int serial_update_buffers(void) { return 0; } -#endif +#endif /* SOFT_SERIAL_PIN */ diff --git a/tmk_core/common/command.c b/tmk_core/common/command.c index f79d5a257..aab99290d 100644 --- a/tmk_core/common/command.c +++ b/tmk_core/common/command.c @@ -181,7 +181,11 @@ static void print_version(void) print("VID: " STR(VENDOR_ID) "(" STR(MANUFACTURER) ") " "PID: " STR(PRODUCT_ID) "(" STR(PRODUCT) ") " "VER: " STR(DEVICE_VER) "\n"); +#ifdef SKIP_VERSION + print("BUILD: (" __DATE__ ")\n"); +#else print("BUILD: " STR(QMK_VERSION) " (" __TIME__ " " __DATE__ ")\n"); +#endif /* build options */ print("OPTIONS:" diff --git a/tmk_core/rules.mk b/tmk_core/rules.mk index ce3cd83b3..2e419dd66 100644 --- a/tmk_core/rules.mk +++ b/tmk_core/rules.mk @@ -28,12 +28,13 @@ VPATH := # Convert all SRC to OBJ define OBJ_FROM_SRC -$(patsubst %.c,$1/%.o,$(patsubst %.cpp,$1/%.o,$(patsubst %.cc,$1/%.o,$(patsubst %.S,$1/%.o,$($1_SRC))))) +$(patsubst %.c,$1/%.o,$(patsubst %.cpp,$1/%.o,$(patsubst %.cc,$1/%.o,$(patsubst %.S,$1/%.o,$(patsubst %.clib,$1/%.a,$($1_SRC)))))) endef $(foreach OUTPUT,$(OUTPUTS),$(eval $(OUTPUT)_OBJ +=$(call OBJ_FROM_SRC,$(OUTPUT)))) # Define a list of all objects OBJ := $(foreach OUTPUT,$(OUTPUTS),$($(OUTPUT)_OBJ)) +NO_LTO_OBJ := $(filter %.a,$(OBJ)) MASTER_OUTPUT := $(firstword $(OUTPUTS)) @@ -81,7 +82,9 @@ CSTANDARD = -std=gnu99 # -Wall...: warning level # -Wa,...: tell GCC to pass this to the assembler. # -adhlns...: create assembler listing -CFLAGS += -g$(DEBUG) +ifndef SKIP_DEBUG_INFO + CFLAGS += -g$(DEBUG) +endif CFLAGS += $(CDEFS) CFLAGS += -O$(OPT) # add color @@ -110,7 +113,9 @@ CFLAGS += $(CSTANDARD) # -Wall...: warning level # -Wa,...: tell GCC to pass this to the assembler. # -adhlns...: create assembler listing -CPPFLAGS += -g$(DEBUG) +ifndef SKIP_DEBUG_INFO + CPPFLAGS += -g$(DEBUG) +endif CPPFLAGS += $(CPPDEFS) CPPFLAGS += -O$(OPT) # to supress "warning: only initialized variables can be placed into program memory area" @@ -138,7 +143,11 @@ CPPFLAGS += -Wa,-adhlns=$(@:%.o=%.lst) # -listing-cont-lines: Sets the maximum number of continuation lines of hex # dump that will be displayed for a given single line of source input. ASFLAGS += $(ADEFS) -ASFLAGS += -Wa,-adhlns=$(@:%.o=%.lst),-gstabs,--listing-cont-lines=100 +ifndef SKIP_DEBUG_INFO + ASFLAGS += -Wa,-adhlns=$(@:%.o=%.lst),-gstabs,--listing-cont-lines=100 +else + ASFLAGS += -Wa,-adhlns=$(@:%.o=%.lst),--listing-cont-lines=100 +endif #---------------- Library Options ---------------- # Minimalistic printf version @@ -210,6 +219,11 @@ ALL_CFLAGS = $(MCUFLAGS) $(CFLAGS) $(EXTRAFLAGS) ALL_CPPFLAGS = $(MCUFLAGS) -x c++ $(CPPFLAGS) $(EXTRAFLAGS) ALL_ASFLAGS = $(MCUFLAGS) -x assembler-with-cpp $(ASFLAGS) $(EXTRAFLAGS) +define NO_LTO +$(patsubst %.a,%.o,$1): NOLTO_CFLAGS += -fno-lto +endef +$(foreach LOBJ, $(NO_LTO_OBJ), $(eval $(call NO_LTO,$(LOBJ)))) + MOVE_DEP = mv -f $(patsubst %.o,%.td,$@) $(patsubst %.o,%.d,$@) @@ -290,8 +304,8 @@ $1_INCFLAGS := $$(patsubst %,-I%,$$($1_INC)) ifdef $1_CONFIG $1_CONFIG_FLAGS += $$(patsubst %,-include %,$$($1_CONFIG)) endif -$1_CFLAGS = $$(ALL_CFLAGS) $$($1_DEFS) $$($1_INCFLAGS) $$($1_CONFIG_FLAGS) -$1_CPPFLAGS= $$(ALL_CPPFLAGS) $$($1_DEFS) $$($1_INCFLAGS) $$($1_CONFIG_FLAGS) +$1_CFLAGS = $$(ALL_CFLAGS) $$($1_DEFS) $$($1_INCFLAGS) $$($1_CONFIG_FLAGS) $$(NOLTO_CFLAGS) +$1_CPPFLAGS= $$(ALL_CPPFLAGS) $$($1_DEFS) $$($1_INCFLAGS) $$($1_CONFIG_FLAGS) $$(NOLTO_CFLAGS) $1_ASFLAGS= $$(ALL_ASFLAGS) $$($1_DEFS) $$($1_INCFLAGS) $$($1_CONFIG_FLAGS) # Compile: create object files from C source files. @@ -321,6 +335,12 @@ $1/%.o : %.S $1/asflags.txt $1/compiler.txt | $(BEGIN) $$(eval CMD=$$(CC) -c $$($1_ASFLAGS) $$< -o $$@) @$$(BUILD_CMD) +$1/%.a : $1/%.o + @mkdir -p $$(@D) + @$(SILENT) || printf "Archiving: $$<" | $$(AWK_CMD) + $$(eval CMD=$$(AR) $$@ $$<) + @$$(BUILD_CMD) + $1/force: $1/cflags.txt: $1/force @@ -346,7 +366,7 @@ $(MASTER_OUTPUT)/ldflags.txt: $(MASTER_OUTPUT)/force # We have to use static rules for the .d files for some reason -DEPS = $(patsubst %.o,%.d,$(OBJ)) +DEPS = $(patsubst %.o,%.d,$(patsubst %.a,%.o,$(OBJ))) # Keep the .d files .PRECIOUS: $(DEPS) # Empty rule to force recompilation if the .d file is missing @@ -391,7 +411,7 @@ $(shell mkdir -p $(BUILD_DIR) 2>/dev/null) $(eval $(foreach OUTPUT,$(OUTPUTS),$(shell mkdir -p $(OUTPUT) 2>/dev/null))) # Include the dependency files. --include $(patsubst %.o,%.d,$(OBJ)) +-include $(patsubst %.o,%.d,$(patsubst %.a,%.o,$(OBJ))) # Listing of phony targets. From 45591ee443f57000bf5ad39f45bfa5d44f43dce0 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Fri, 14 Dec 2018 21:36:03 -0800 Subject: [PATCH 705/788] Keyboard: Chimera Ortho refactor (#4652) * Layout macro refactor - Renamed KC_KEYMAP to LAYOUT_kc - Renamed KEYMAP to LAYOUT - moved LAYOUT above LAYOUT_kc (Hoping this encourages users to use LAYOUT.) - updated layout macro name in info.json - white space changes for readability * Keymap refactor: default Default keymap now uses `#include QMK_KEYBOARD_H` and LAYOUT macro (from KC_KEYMAP/LAYOUT_kc). Keymap was also refactored to use process_record_user function instead of deprecated action_get_macro from TMK. Also moved LONGPRESS_DELAY and LAYER_TOGGLE_DELAY definitions to config.h. * Keymap refactor: dcompact - Changed chimera_ortho.h include for QMK_KEYBOARD_H - Updated layout name on keymap layers * Coding conventions fix in default keymap * Keymap refactor: gordon - Changed chimera_ortho.h include for QMK_KEYBOARD_H - Removed redundant includes of action_layer.h and process_tap_dance.h (superseded by QMK_KEYBOARD_H) - Removed redundant definitions for KC_NO and KC_TRNS - Updated layout name on keymap layers --- keyboards/chimera_ortho/chimera_ortho.h | 33 ++- keyboards/chimera_ortho/info.json | 280 +++--------------- .../chimera_ortho/keymaps/dcompact/keymap.c | 12 +- .../chimera_ortho/keymaps/default/config.h | 5 + .../chimera_ortho/keymaps/default/keymap.c | 218 +++++++------- .../chimera_ortho/keymaps/gordon/keymap.c | 58 ++-- 6 files changed, 206 insertions(+), 400 deletions(-) create mode 100644 keyboards/chimera_ortho/keymaps/default/config.h diff --git a/keyboards/chimera_ortho/chimera_ortho.h b/keyboards/chimera_ortho/chimera_ortho.h index 3b7690d43..598125275 100644 --- a/keyboards/chimera_ortho/chimera_ortho.h +++ b/keyboards/chimera_ortho/chimera_ortho.h @@ -49,31 +49,32 @@ // This a shortcut to help you visually see your layout. // The first section contains all of the arguements // The second converts the arguments into a two-dimensional array -#define KC_KEYMAP( \ +#define LAYOUT( \ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k10, k11, k12, k13, \ k14, k15, k16, k17, k18, k19, k20, k21, k22, k23, k24, k25, k26, k27, \ - k28, k29, k31, k32, k33, k34, k35, k36, k37, k38, k41, k42, k43, k44,\ - k45, k46, k47, k48 \ + k28, k29, k31, k32, k33, k34, k35, k36, k37, k38, k41, k42, k43, k44, \ + k45, k46, k47, k48 \ ) \ { \ - { KC_##k01, KC_##k02, KC_##k03, KC_##k04, KC_##k05, KC_##k08, KC_##k09, KC_##k10, KC_##k11, KC_##k12 }, \ - { KC_##k15, KC_##k16, KC_##k17, KC_##k18, KC_##k19, KC_##k22, KC_##k23, KC_##k24, KC_##k25, KC_##k26 }, \ - { KC_##k29, KC_##k31, KC_##k32, KC_##k33, KC_##k34, KC_##k37, KC_##k38, KC_##k41, KC_##k42, KC_##k43 }, \ - { KC_NO, KC_##k06, KC_##k20, KC_##k35, KC_##k46, KC_##k47, KC_##k36, KC_##k21, KC_##k07, KC_NO }, \ - { KC_NO, KC_##k28, KC_##k14, KC_##k00, KC_##k45, KC_##k48, KC_##k13, KC_##k27, KC_##k44, KC_NO }, \ + { k01, k02, k03, k04, k05, k08, k09, k10, k11, k12 }, \ + { k15, k16, k17, k18, k19, k22, k23, k24, k25, k26 }, \ + { k29, k31, k32, k33, k34, k37, k38, k41, k42, k43 }, \ + { KC_NO, k06, k20, k35, k46, k47, k36, k21, k07, KC_NO }, \ + { KC_NO, k28, k14, k00, k45, k48, k13, k27, k44, KC_NO } \ } -#define KEYMAP( \ +#define LAYOUT_kc( \ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k10, k11, k12, k13, \ k14, k15, k16, k17, k18, k19, k20, k21, k22, k23, k24, k25, k26, k27, \ - k28, k29, k31, k32, k33, k34, k35, k36, k37, k38, k41, k42, k43, k44,\ - k45, k46, k47, k48 \ + k28, k29, k31, k32, k33, k34, k35, k36, k37, k38, k41, k42, k43, k44, \ + k45, k46, k47, k48 \ ) \ { \ - { k01, k02, k03, k04, k05, k08, k09, k10, k11, k12 }, \ - { k15, k16, k17, k18, k19, k22, k23, k24, k25, k26 }, \ - { k29, k31, k32, k33, k34, k37, k38, k41, k42, k43 }, \ - { KC_NO, k06, k20, k35, k46, k47, k36, k21, k07, KC_NO }, \ - { KC_NO, k28, k14, k00, k45, k48, k13, k27, k44, KC_NO }, \ + { KC_##k01, KC_##k02, KC_##k03, KC_##k04, KC_##k05, KC_##k08, KC_##k09, KC_##k10, KC_##k11, KC_##k12 }, \ + { KC_##k15, KC_##k16, KC_##k17, KC_##k18, KC_##k19, KC_##k22, KC_##k23, KC_##k24, KC_##k25, KC_##k26 }, \ + { KC_##k29, KC_##k31, KC_##k32, KC_##k33, KC_##k34, KC_##k37, KC_##k38, KC_##k41, KC_##k42, KC_##k43 }, \ + { KC_NO, KC_##k06, KC_##k20, KC_##k35, KC_##k46, KC_##k47, KC_##k36, KC_##k21, KC_##k07, KC_NO }, \ + { KC_NO, KC_##k28, KC_##k14, KC_##k00, KC_##k45, KC_##k48, KC_##k13, KC_##k27, KC_##k44, KC_NO } \ } + #endif diff --git a/keyboards/chimera_ortho/info.json b/keyboards/chimera_ortho/info.json index b1384379c..3f8481be4 100644 --- a/keyboards/chimera_ortho/info.json +++ b/keyboards/chimera_ortho/info.json @@ -1,240 +1,58 @@ { + "keyboard_name": "Chimera Ortho", + "keyboard_folder": "chimera_ortho", "maintainer": "qmk", "width": 15.5, "height": 4.25, "layouts": { - "KEYMAP": { + "LAYOUT": { "layout": [ - { - "label": "Esc", - "x": 0, - "y": 0 - }, - { - "label": "Q", - "x": 1, - "y": 0 - }, - { - "label": "W", - "x": 2, - "y": 0 - }, - { - "label": "E", - "x": 3, - "y": 0 - }, - { - "label": "R", - "x": 4, - "y": 0 - }, - { - "label": "T", - "x": 5, - "y": 0 - }, - { - "label": "{", - "x": 6, - "y": 0 - }, - { - "label": "}", - "x": 8.5, - "y": 0 - }, - { - "label": "Y", - "x": 9.5, - "y": 0 - }, - { - "label": "U", - "x": 10.5, - "y": 0 - }, - { - "label": "I", - "x": 11.5, - "y": 0 - }, - { - "label": "O", - "x": 12.5, - "y": 0 - }, - { - "label": "P", - "x": 13.5, - "y": 0 - }, - { - "label": "\"", - "x": 14.5, - "y": 0 - }, - { - "label": "Tab", - "x": 0, - "y": 1 - }, - { - "label": "A", - "x": 1, - "y": 1 - }, - { - "label": "S", - "x": 2, - "y": 1 - }, - { - "label": "D", - "x": 3, - "y": 1 - }, - { - "label": "F", - "x": 4, - "y": 1 - }, - { - "label": "G", - "x": 5, - "y": 1 - }, - { - "label": "-", - "x": 6, - "y": 1 - }, - { - "label": "1", - "x": 8.5, - "y": 1 - }, - { - "label": "H", - "x": 9.5, - "y": 1 - }, - { - "label": "J", - "x": 10.5, - "y": 1 - }, - { - "label": "K", - "x": 11.5, - "y": 1 - }, - { - "label": "L", - "x": 12.5, - "y": 1 - }, - { - "label": ";", - "x": 13.5, - "y": 1 - }, - { - "label": "Enter", - "x": 14.5, - "y": 1 - }, - { - "label": "(", - "x": 0, - "y": 2 - }, - { - "label": "Z", - "x": 1, - "y": 2 - }, - { - "label": "X", - "x": 2, - "y": 2 - }, - { - "label": "C", - "x": 3, - "y": 2 - }, - { - "label": "V", - "x": 4, - "y": 2 - }, - { - "label": "B", - "x": 5, - "y": 2 - }, - { - "label": "=", - "x": 6, - "y": 2 - }, - { - "label": "8", - "x": 8.5, - "y": 2 - }, - { - "label": "N", - "x": 9.5, - "y": 2 - }, - { - "label": "M", - "x": 10.5, - "y": 2 - }, - { - "label": ",", - "x": 11.5, - "y": 2 - }, - { - "label": ".", - "x": 12.5, - "y": 2 - }, - { - "label": "/", - "x": 13.5, - "y": 2 - }, - { - "label": ")", - "x": 14.5, - "y": 2 - }, - { - "label": "Num Layer", - "x": 4, - "y": 3.25 - }, - { - "label": "Back Space", - "x": 5, - "y": 3.25 - }, - { - "label": "Space", - "x": 9.5, - "y": 3.25 - }, - { - "label": "Symbol Layer", - "x": 10.5, - "y": 3.25 - } + {"label": "Esc", "x": 0, "y": 0}, + {"label": "Q", "x": 1, "y": 0}, + {"label": "W", "x": 2, "y": 0}, + {"label": "E", "x": 3, "y": 0}, + {"label": "R", "x": 4, "y": 0}, + {"label": "T", "x": 5, "y": 0}, + {"label": "{", "x": 6, "y": 0}, + {"label": "}", "x": 8.5, "y": 0}, + {"label": "Y", "x": 9.5, "y": 0}, + {"label": "U", "x": 10.5, "y": 0}, + {"label": "I", "x": 11.5, "y": 0}, + {"label": "O", "x": 12.5, "y": 0}, + {"label": "P", "x": 13.5, "y": 0}, + {"label": "\"", "x": 14.5, "y": 0}, + {"label": "Tab", "x": 0, "y": 1}, + {"label": "A", "x": 1, "y": 1}, + {"label": "S", "x": 2, "y": 1}, + {"label": "D", "x": 3, "y": 1}, + {"label": "F", "x": 4, "y": 1}, + {"label": "G", "x": 5, "y": 1}, + {"label": "-", "x": 6, "y": 1}, + {"label": "1", "x": 8.5, "y": 1}, + {"label": "H", "x": 9.5, "y": 1}, + {"label": "J", "x": 10.5, "y": 1}, + {"label": "K", "x": 11.5, "y": 1}, + {"label": "L", "x": 12.5, "y": 1}, + {"label": ";", "x": 13.5, "y": 1}, + {"label": "Enter", "x": 14.5, "y": 1}, + {"label": "(", "x": 0, "y": 2}, + {"label": "Z", "x": 1, "y": 2}, + {"label": "X", "x": 2, "y": 2}, + {"label": "C", "x": 3, "y": 2}, + {"label": "V", "x": 4, "y": 2}, + {"label": "B", "x": 5, "y": 2}, + {"label": "=", "x": 6, "y": 2}, + {"label": "8", "x": 8.5, "y": 2}, + {"label": "N", "x": 9.5, "y": 2}, + {"label": "M", "x": 10.5, "y": 2}, + {"label": ", ", "x": 11.5, "y": 2}, + {"label": ".", "x": 12.5, "y": 2}, + {"label": "/", "x": 13.5, "y": 2}, + {"label": ")", "x": 14.5, "y": 2}, + {"label": "Num Layer", "x": 4, "y": 3.25}, + {"label": "Back Space", "x": 5, "y": 3.25}, + {"label": "Space", "x": 9.5, "y": 3.25}, + {"label": "Symbol Layer", "x": 10.5, "y": 3.25} ] } } diff --git a/keyboards/chimera_ortho/keymaps/dcompact/keymap.c b/keyboards/chimera_ortho/keymaps/dcompact/keymap.c index 74c3a25cd..1c6ef7d6f 100644 --- a/keyboards/chimera_ortho/keymaps/dcompact/keymap.c +++ b/keyboards/chimera_ortho/keymaps/dcompact/keymap.c @@ -1,4 +1,4 @@ -#include "chimera_ortho.h" +#include QMK_KEYBOARD_H enum chimera_ortho_layers { @@ -34,7 +34,7 @@ enum chimera_ortho_layers const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_BASE] = KC_KEYMAP( + [_BASE] = LAYOUT_kc( //,-------+-------+-------+-------+-------+-------+-------. ,-------+-------+-------+-------+-------+-------+-------. LALT ,TAB ,QUOT ,COMM ,DOT ,P ,Y ,F ,G ,C ,R ,L ,SLSH ,FUNC //|-------+-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------+-------| @@ -46,7 +46,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //\-------------------------------+-------+-------+-------/ \-------+-------+---------------------------------------/ ), - [_NAV] = KC_KEYMAP( + [_NAV] = LAYOUT_kc( //,-------+-------+-------+-------+-------+-------+-------. ,-------+-------+-------+-------+-------+-------+-------. , , , , , , , ,HOME ,PGDOWN ,PGUP ,END , , //|-------+-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------+-------| @@ -58,7 +58,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //\-------------------------------+-------+-------+-------/ \-------+-------+---------------------------------------/ ), - [_SYM] = KC_KEYMAP( + [_SYM] = LAYOUT_kc( //,-------+-------+-------+-------+-------+-------+-------. ,-------+-------+-------+-------+-------+-------+-------. ,QUAKE ,GRAVE ,TILDE ,BSLASH ,PIPE ,LPRN ,RPRN ,7 ,8 ,9 ,SLSH ,EQUAL , //|-------+-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------+-------| @@ -70,7 +70,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //\-------------------------------+-------+-------+-------/ \-------+-------+---------------------------------------/ ), - [_FUNC] = KC_KEYMAP( + [_FUNC] = LAYOUT_kc( //,-------+-------+-------+-------+-------+-------+-------. ,-------+-------+-------+-------+-------+-------+-------. ,RESET ,SLEP ,MRWD ,MPLY ,MFFD , , ,F9 ,F10 ,F11 ,F12 , , //|-------+-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------+-------| @@ -82,7 +82,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //\-------------------------------+-------+-------+-------/ \-------+-------+---------------------------------------/ ), - [_MOUSE] = KC_KEYMAP( + [_MOUSE] = LAYOUT_kc( //,-------+-------+-------+-------+-------+-------+-------. ,-------+-------+-------+-------+-------+-------+-------. , , , , , , , , , , , , , //|-------+-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------+-------| diff --git a/keyboards/chimera_ortho/keymaps/default/config.h b/keyboards/chimera_ortho/keymaps/default/config.h new file mode 100644 index 000000000..bdfd4db80 --- /dev/null +++ b/keyboards/chimera_ortho/keymaps/default/config.h @@ -0,0 +1,5 @@ +#pragma once + +// place overrides here +#define LONGPRESS_DELAY 150 +//#define LAYER_TOGGLE_DELAY 300 diff --git a/keyboards/chimera_ortho/keymaps/default/keymap.c b/keyboards/chimera_ortho/keymaps/default/keymap.c index 6201eebac..6a676493d 100644 --- a/keyboards/chimera_ortho/keymaps/default/keymap.c +++ b/keyboards/chimera_ortho/keymaps/default/keymap.c @@ -1,20 +1,19 @@ // this is the style you want to emulate. // This is the canonical layout file for the Quantum project. If you want to add another keyboard, -#include "chimera_ortho.h" +#include QMK_KEYBOARD_H // Each layer gets a name for readability, which is then used in the keymap matrix below. // The underscores don't mean anything - you can have a layer called STUFF or any other name. // Layer names don't all need to be of the same length, obviously, and you can also skip them // entirely and just use numbers. -enum chimera_ortho_layers -{ - _QWERTY, - _CAPS, - _NUMPAD, - _SYMBOLS, - _MACROS, - _NAV +enum chimera_ortho_layers { + _QWERTY, + _CAPS, + _NUMPAD, + _SYMBOLS, + _MACROS, + _NAV }; #define KC_NMPD TG(_NUMPAD) @@ -27,153 +26,140 @@ enum chimera_ortho_layers #define KC_GBRC MT(MOD_RGUI, KC_8) #define KC_GQOT MT(MOD_LGUI, KC_QUOT) #define KC_MESC LT(_MACROS, KC_ESC) -#define KC_INCL M(0) -#define KC_PULL M(1) -#define KC_PUSH M(2) -#define KC_SCAP M(3) -#define KC_SCOF M(4) #define KC_CAD LALT(LCTL(KC_DEL)) -#define LONGPRESS_DELAY 150 -//#define LAYER_TOGGLE_DELAY 300 - -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO -#define KC_ KC_TRNS +enum custom_keycodes { + KC_INCL = SAFE_RANGE, + KC_PULL, + KC_PUSH, + KC_SCAP, + KC_SCOF +}; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_QWERTY] = KC_KEYMAP( - //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. - MESC, Q , W , E , R , T ,SCTL, SCTR, Y , U , I , O , P ,QUOT, - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - TAB , A , S , D , F , G ,SPLT, SPRT, H , J , K , L ,SCLN,ENT , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - LSPO, Z , X , C , V , B ,SPFN, GBRC, N , M ,COMM,DOT ,SLSH,RSPC, - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - NMPD,BSPC, SPC ,SYMB - // \------------------+----+----+---/ \---+----+----+-------------------/ + [_QWERTY] = LAYOUT( + //,-------+-------+-------+-------+-------+-------+-------. ,-------+-------+-------+-------+-------+-------+-------. + KC_MESC, KC_Q , KC_W , KC_E , KC_R , KC_T ,KC_SCTL, KC_SCTR, KC_Y , KC_U , KC_I , KC_O , KC_P ,KC_QUOT, + //|-------+-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------+-------| + KC_TAB , KC_A , KC_S , KC_D , KC_F , KC_G ,KC_SPLT, KC_SPRT, KC_H , KC_J , KC_K , KC_L ,KC_SCLN,KC_ENT , + //|-------+-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------+-------| + KC_LSPO, KC_Z , KC_X , KC_C , KC_V , KC_B ,KC_SPFN, KC_GBRC, KC_N , KC_M ,KC_COMM,KC_DOT ,KC_SLSH,KC_RSPC, + //|-------+-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------+-------| + KC_NMPD,KC_BSPC, KC_SPC ,KC_SYMB + // \------------------------------+-------+-------+------/ \------+-------+-------+------------------------------/ ), - [_CAPS] = KC_KEYMAP( - //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. - , , , , , , , , , , , , , , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , , , , , ,UNDS, , , , , ,COLN, , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - SCOF, , , , , , , , , , , , ,SCOF, - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , , , - // \------------------+----+----+---/ \---+----+----+-------------------/ + [_CAPS] = LAYOUT( + //,-------+-------+-------+-------+-------+-------+-------. ,-------+-------+-------+-------+-------+-------+-------. + _______,_______,_______,_______,_______,_______,_______, _______,_______,_______,_______,_______,_______,_______, + //|-------+-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------+-------| + _______,_______,_______,_______,_______,_______,KC_UNDS, _______,_______,_______,_______,_______,KC_COLN,_______, + //|-------+-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------+-------| + KC_SCOF,_______,_______,_______,_______,_______,_______, _______,_______,_______,_______,_______,_______,KC_SCOF, + //|-------+-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------+-------| + _______,_______, _______,_______ + // \------------------------------+-------+-------+------/ \------+-------+-------+------------------------------/ ), - [_NUMPAD] = KC_KEYMAP( - //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. - , ,COLN , , , , , , , 7 , 8 , 9 ,ASTR,MINS, - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , ,DOT , , , , , , , 4 , 5 , 6 ,PLUS, , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , , , , , , , , , 1 , 2 , 3 ,SLSH, , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , , , 0 - // \------------------+----+----+---/ \---+----+----+-------------------/ + [_NUMPAD] = LAYOUT( + //,-------+-------+-------+-------+-------+-------+-------. ,-------+-------+-------+-------+-------+-------+-------. + _______,_______,KC_COLN,_______,_______,_______,_______, _______,_______, KC_7 , KC_8 , KC_9 ,KC_ASTR,KC_MINS, + //|-------+-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------+-------| + _______,_______,KC_DOT ,_______,_______,_______,_______, _______,_______, KC_4 , KC_5 , KC_6 ,KC_PLUS,_______, + //|-------+-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------+-------| + _______,_______,_______,_______,_______,_______,_______, _______,_______, KC_1 , KC_2 , KC_3 ,KC_SLSH,_______, + //|-------+-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------+-------| + _______,_______, _______, KC_0 + // \------------------------------+-------+-------+------/ \------+-------+-------+------------------------------/ ), - [_SYMBOLS] = KC_KEYMAP( - //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. - ,EXLM, AT ,HASH,DLR ,PERC, , ,CIRC,AMPR,ASTR,LPRN,RPRN,BSLS, - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , F1 , F2 , F3 , F4 , F5 , , ,TILD,COLN,UNDS,LCBR,RCBR, , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , F6 , F7 , F8 , F9 ,F10 , , ,GRV ,SCLN,MINS,LBRC,RBRC, , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - PIPE, , , - // \------------------+----+----+---/ \---+----+----+-------------------/ + [_SYMBOLS] = LAYOUT( + //,-------+-------+-------+-------+-------+-------+-------. ,-------+-------+-------+-------+-------+-------+-------. + _______,KC_EXLM, KC_AT ,KC_HASH,KC_DLR ,KC_PERC,_______, _______,KC_CIRC,KC_AMPR,KC_ASTR,KC_LPRN,KC_RPRN,KC_BSLS, + //|-------+-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------+-------| + _______, KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 ,_______, _______,KC_TILD,KC_COLN,KC_UNDS,KC_LCBR,KC_RCBR,_______, + //|-------+-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------+-------| + _______, KC_F6 , KC_F7 , KC_F8 , KC_F9 ,KC_F10 ,_______, _______,KC_GRV ,KC_SCLN,KC_MINS,KC_LBRC,KC_RBRC,_______, + //|-------+-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------+-------| + KC_PIPE,_______, _______,_______ + // \------------------------------+-------+-------+------/ \------+-------+-------+------------------------------/ ), - [_NAV] = KC_KEYMAP( - //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. - , , , , , , , , , , UP , ,PSCR, , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , , , , , , , , ,LEFT,DOWN,RGHT, , , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , , , , , , , , ,PGUP,PGDN, , , , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - ,DEL , , - // \------------------+----+----+---/ \---+----+----+-------------------/ + [_NAV] = LAYOUT( + //,-------+-------+-------+-------+-------+-------+-------. ,-------+-------+-------+-------+-------+-------+-------. + _______,_______,_______,_______,_______,_______,_______, _______,_______,_______, KC_UP ,_______,KC_PSCR,_______, + //|-------+-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------+-------| + _______,_______,_______,_______,_______,_______,_______, _______,_______,KC_LEFT,KC_DOWN,KC_RGHT,_______,_______, + //|-------+-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------+-------| + _______,_______,_______,_______,_______,_______,_______, _______,_______,KC_PGUP,KC_PGDN,_______,_______,_______, + //|-------+-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------+-------| + _______,KC_DEL , _______,_______ + // \------------------------------+-------+-------+------/ \------+-------+-------+------------------------------/ ), - [_MACROS] = KC_KEYMAP( - //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. - , , , , , , , , , ,INCL, , , , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , , ,CAD , , , , , , , , , , , - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - SCAP, , , , , , , , , ,PULL,PUSH, ,SCAP, - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , , , - // \------------------+----+----+---/ \---+----+----+-------------------/ + [_MACROS] = LAYOUT( + //,-------+-------+-------+-------+-------+-------+-------. ,-------+-------+-------+-------+-------+-------+-------. + _______,_______,_______,_______,_______,_______,_______, _______,_______,_______,KC_INCL,_______,_______,_______, + //|-------+-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------+-------| + _______,_______,_______,KC_CAD ,_______,_______,_______, _______,_______,_______,_______,_______,_______,_______, + //|-------+-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------+-------| + KC_SCAP,_______,_______,_______,_______,_______,_______, _______,_______,_______,KC_PULL,KC_PUSH,_______,KC_SCAP, + //|-------+-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------+-------| + _______,_______, _______,_______ + // \------------------------------+-------+-------+------/ \------+-------+-------+------------------------------/ ) }; -const uint16_t PROGMEM fn_actions[] = { - -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - switch(id) { +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch(keycode) { /* include some kind of library or header */ - case 0: + case KC_INCL: if (record->event.pressed) { - SEND_STRING("#include <>"); - return MACRO( T(LEFT), END); + SEND_STRING("#include <>" SS_TAP(X_LEFT)); } - break; - case 1: + return false; + case KC_PULL: if (record->event.pressed) { - SEND_STRING("git pull"); - return MACRO( T(ENT), END ); + SEND_STRING("git pull" SS_TAP(X_ENTER)); } - break; - case 2: + return false; + case KC_PUSH: if (record->event.pressed){ - SEND_STRING("git push"); - return MACRO( T(ENT), END ); + SEND_STRING("git push" SS_TAP(X_ENTER)); } - break; - case 3: + return false; + case KC_SCAP: if (record->event.pressed){ layer_on(_CAPS); register_code(KC_CAPSLOCK); unregister_code(KC_CAPSLOCK); } - break; - case 4: + return false; + case KC_SCOF: if (record->event.pressed){ layer_off(_CAPS); register_code(KC_CAPSLOCK); unregister_code(KC_CAPSLOCK); } - break; + return false; } - return MACRO_NONE; + return true; }; - + void matrix_scan_user(void) { uint8_t layer = biton32(layer_state); - + switch (layer) { - case _QWERTY: - set_led_green; - break; + case _QWERTY: + set_led_green; + break; case _CAPS: - set_led_white; - break; + set_led_white; + break; case _NUMPAD: set_led_blue; break; @@ -181,11 +167,11 @@ void matrix_scan_user(void) { set_led_red; break; case _NAV: - set_led_magenta; - break; + set_led_magenta; + break; case _MACROS: - set_led_cyan; - break; + set_led_cyan; + break; default: set_led_green; break; diff --git a/keyboards/chimera_ortho/keymaps/gordon/keymap.c b/keyboards/chimera_ortho/keymaps/gordon/keymap.c index c6d668f8f..c6766bed3 100644 --- a/keyboards/chimera_ortho/keymaps/gordon/keymap.c +++ b/keyboards/chimera_ortho/keymaps/gordon/keymap.c @@ -1,10 +1,8 @@ // this is the style you want to emulate. // This is the canonical layout file for the Quantum project. If you want to add another keyboard, -#include "chimera_ortho.h" -#include "action_layer.h" +#include QMK_KEYBOARD_H #include "version.h" -#include "process_keycode/process_tap_dance.h" #include "gordon.h" // Each layer gets a name for readability, which is then used in the keymap matrix below. @@ -83,11 +81,9 @@ //#define LAYER_TOGGLE_DELAY 300 // Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO -#define KC_ KC_TRNS +#define KC_ KC_TRNS -/* TODO: +/* TODO: * * DONE: RESET and CAD into macro layer. * DONE: WINUP AND WINDOWN in NAV layer @@ -113,7 +109,7 @@ * Russain layer * Hebrew layer * Get rid of stupid git pull and push macros. - * + * */ //Tap dance enums @@ -127,14 +123,14 @@ enum { CALC_PRINTSCREEN }; -static xtap ttt_state = { +static xtap ttt_state = { .is_press_action = true, .state = 0 }; //Already exists in gordon.c, shouldn't need this anymore -/*// To activate SINGLE_HOLD, you will need to hold for 200ms first. +/*// To activate SINGLE_HOLD, you will need to hold for 200ms first. // This tap dance favors keys that are used frequently in typing like 'f' int cur_dance (qk_tap_dance_state_t *state) { if (state->count == 1) { @@ -151,8 +147,8 @@ int cur_dance (qk_tap_dance_state_t *state) { else if (state->count == 2) { if (state->interrupted) return DOUBLE_SINGLE_TAP; else if (state->pressed) return DOUBLE_HOLD; - else return DOUBLE_TAP; - } + else return DOUBLE_TAP; + } else if ((state->count == 3) && ((state->interrupted) || (!state->pressed))) return TRIPLE_TAP; else if (state->count == 3) return TRIPLE_HOLD; else return 8; //magic number. At some point this method will expand to work for more presses @@ -194,7 +190,7 @@ void TTT_reset (qk_tap_dance_state_t *state, void *user_data) { qk_tap_dance_action_t tap_dance_actions[] = { // simple tap dance - [F12ETAPS] = ACTION_TAP_DANCE_DOUBLE(KC_F12,LSFT(LCTL(KC_F10))), + [F12ETAPS] = ACTION_TAP_DANCE_DOUBLE(KC_F12,LSFT(LCTL(KC_F10))), [CALCCOMP] = ACTION_TAP_DANCE_DOUBLE(KC_CALCULATOR, KC_MY_COMPUTER), [CALC_PRINTSCREEN] = ACTION_TAP_DANCE_DOUBLE(KC_CALCULATOR, KC_PSCR), [ALTF4] = ACTION_TAP_DANCE_DOUBLE(KC_F4,LALT(KC_F4)), @@ -206,7 +202,7 @@ qk_tap_dance_action_t tap_dance_actions[] = { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_QWERTY] = KC_KEYMAP( + [_QWERTY] = LAYOUT_kc( //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. MESC, Q ,CSHW,ENAV, R , T ,SPC , CLPS, Y , U ,INAV, O , P ,TTT, //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| @@ -218,7 +214,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // \------------------+----+----+---/ \---+----+----+-------------------/ ), - [_NUMPAD] = KC_KEYMAP( + [_NUMPAD] = LAYOUT_kc( //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. , , , ,ASTR, , , , , 7 , 8 , 9 ,ASTR,/**/, //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| @@ -226,11 +222,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| , , , ,SLSH, , , , , 1 , 2 , 3 ,SLSH, , //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , , , 0 + , , , 0 // \------------------+----+----+---/ \---+----+----+-------------------/ ), - [_SYMBOLS] = KC_KEYMAP( + [_SYMBOLS] = LAYOUT_kc( //,----+----+-----+----+----+----+----. ,----+----+----+----+----+----+----. ,EXLM, AT ,LCBR,RCBR,HASH, , ,CIRC,AMPR,ASTR,LPRN,RPRN,/**/, //|----+----+-----+----+----+----+----| |----+----+----+----+----+----+----| @@ -242,7 +238,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // \-------------------+----+----+---/ \---+----+----+-------------------/ ), - [_FUNCTION] = KC_KEYMAP( + [_FUNCTION] = LAYOUT_kc( //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. F6F7 ,F1 ,F2 ,F3 ,ALF4,F5 ,F6 , F7 ,F8 ,F9 ,F10 ,F11 ,F12 ,/**/, //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| @@ -250,11 +246,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| , , , , , , , , , , , , , , //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , , , + , , , // \------------------+----+----+---/ \---+----+----+-------------------/ ), - [_NAV] = KC_KEYMAP( + [_NAV] = LAYOUT_kc( //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. , ,SNAPLEFT,/**/,SNAPRIGHT,, , , , , UP , , , , //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| @@ -262,11 +258,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| , ,WORKLEFT, ,WORKRIGHT,, , , ,PGUP,PGDN, , , , //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - CDEL ,DEL, , + CDEL ,DEL, , // \------------------+----+----+---/ \---+----+----+-------------------/ ), - [_TEXTNAV] = KC_KEYMAP( + [_TEXTNAV] = LAYOUT_kc( //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. , , , , , , , , , ,/**/, , , , //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| @@ -274,11 +270,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| , , , , , , , , , , , , , , //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , , , + , , , // \------------------+----+----+---/ \---+----+----+-------------------/ ), - [_MOUSE] = KC_KEYMAP( + [_MOUSE] = LAYOUT_kc( //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. , , ,MS_UP, , , , , , , UP , , , ,/**/ //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| @@ -286,12 +282,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| , , , , , , , , , , , , , , //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - ,MS_BTN1 ,MS_BTN2 , + ,MS_BTN1 ,MS_BTN2 , // \------------------+----+----+---/ \---+----+----+-------------------/ - ), + ), - [_MACROS] = KC_KEYMAP( + [_MACROS] = LAYOUT_kc( //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. /**/,RESET,SECRET_2,SECRET_3, , , ,SYSTEM_SLEEP, , ,INCL, , , , //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| @@ -299,7 +295,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| SCAP, , , , , , , , , , , , ,SCAP, //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , , , + , , , // \------------------+----+----+---/ \---+----+----+-------------------/ ) @@ -349,11 +345,11 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) } return MACRO_NONE; }; - + void matrix_scan_user(void) { uint8_t layer = biton32(layer_state); - + switch (layer) { case _QWERTY: set_led_green; @@ -381,7 +377,7 @@ void matrix_scan_user(void) { _delay_ms(45); set_led_blue; _delay_ms(45); - break; + break; default: set_led_green; break; From 2527fe879f7c5249bbd35488cc6e889e518a6d56 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Fri, 14 Dec 2018 22:58:30 -0800 Subject: [PATCH 706/788] converter/ibm_5291: Configurator support and readme cleanup (#4654) * converter/ibm_5291: Configurator support - added layout data to info.json file - corrected keyboard_folder value * converter/ibm_5291: readme cleanup - Fixed "image" url (target of link was a web page; changed markdown formatting to text link) - Sentence capitalization fixes - markdown formatting fixes for readability --- keyboards/converter/ibm_5291/info.json | 95 +++++++++++++++++++++++++- keyboards/converter/ibm_5291/readme.md | 12 ++-- 2 files changed, 100 insertions(+), 7 deletions(-) diff --git a/keyboards/converter/ibm_5291/info.json b/keyboards/converter/ibm_5291/info.json index 48d835f33..2cb3b76c2 100644 --- a/keyboards/converter/ibm_5291/info.json +++ b/keyboards/converter/ibm_5291/info.json @@ -1,6 +1,97 @@ { "keyboard_name": "IBM 5291", - "keyboard_folder": "converter/5291", + "keyboard_folder": "converter/ibm_5291", "url": "https://deskthority.net/wiki/IBM_Model_F#IBM_5291_Keyboard", - "maintainer": "listofoptions" + "maintainer": "listofoptions", + "width": 21, + "height": 5, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"Sys Req", "x":0, "y":0}, + {"label":"Cmd", "x":1, "y":0}, + {"label":"`", "x":2.25, "y":0}, + {"label":"1", "x":3.25, "y":0}, + {"label":"2", "x":4.25, "y":0}, + {"label":"3", "x":5.25, "y":0}, + {"label":"4", "x":6.25, "y":0}, + {"label":"5", "x":7.25, "y":0}, + {"label":"6", "x":8.25, "y":0}, + {"label":"7", "x":9.25, "y":0}, + {"label":"8", "x":10.25, "y":0}, + {"label":"9", "x":11.25, "y":0}, + {"label":"0", "x":12.25, "y":0}, + {"label":"-", "x":13.25, "y":0}, + {"label":"=", "x":14.25, "y":0}, + {"label":"Backspace", "x":15.25, "y":0, "w":1.75}, + {"label":"Reverse Tab", "x":17, "y":0, "w":2}, + {"label":"Dup", "x":19, "y":0, "w":2}, + {"label":"Del", "x":0, "y":1}, + {"label":"Erase Input", "x":1, "y":1}, + {"label":"Tab", "x":2.25, "y":1, "w":1.5}, + {"label":"Q", "x":3.75, "y":1}, + {"label":"W", "x":4.75, "y":1}, + {"label":"E", "x":5.75, "y":1}, + {"label":"R", "x":6.75, "y":1}, + {"label":"T", "x":7.75, "y":1}, + {"label":"Y", "x":8.75, "y":1}, + {"label":"U", "x":9.75, "y":1}, + {"label":"I", "x":10.75, "y":1}, + {"label":"O", "x":11.75, "y":1}, + {"label":"P", "x":12.75, "y":1}, + {"label":"¢", "x":13.75, "y":1}, + {"label":"\\", "x":14.75, "y":1, "w":1.25}, + {"label":"7", "x":17, "y":1}, + {"label":"8", "x":18, "y":1}, + {"label":"9", "x":19, "y":1}, + {"label":"Field -", "x":20, "y":1}, + {"label":"Print", "x":0, "y":2}, + {"label":"Help", "x":1, "y":2}, + {"label":"Caps Lock", "x":2.25, "y":2, "w":1.75}, + {"label":"A", "x":4, "y":2}, + {"label":"S", "x":5, "y":2}, + {"label":"D", "x":6, "y":2}, + {"label":"F", "x":7, "y":2}, + {"label":"G", "x":8, "y":2}, + {"label":"H", "x":9, "y":2}, + {"label":"J", "x":10, "y":2}, + {"label":"K", "x":11, "y":2}, + {"label":"L", "x":12, "y":2}, + {"label":";", "x":13, "y":2}, + {"label":"'", "x":14, "y":2}, + {"label":"{", "x":15, "y":2}, + {"label":"Field Exit", "x":16, "y":1, "h":2}, + {"label":"4", "x":17, "y":2}, + {"label":"5", "x":18, "y":2}, + {"label":"6", "x":19, "y":2}, + {"label":"Roll Up", "x":0, "y":3}, + {"label":"Roll Down", "x":1, "y":3}, + {"label":"Shift", "x":2.25, "y":3, "w":1.25}, + {"label":"<", "x":3.5, "y":3}, + {"label":"Z", "x":4.5, "y":3}, + {"label":"X", "x":5.5, "y":3}, + {"label":"C", "x":6.5, "y":3}, + {"label":"V", "x":7.5, "y":3}, + {"label":"B", "x":8.5, "y":3}, + {"label":"N", "x":9.5, "y":3}, + {"label":"M", "x":10.5, "y":3}, + {"label":",", "x":11.5, "y":3}, + {"label":".", "x":12.5, "y":3}, + {"label":"/", "x":13.5, "y":3}, + {"label":"Shift", "x":14.5, "y":3, "w":1.5}, + {"label":"Return", "x":16, "y":3}, + {"label":"1", "x":17, "y":3}, + {"label":"2", "x":18, "y":3}, + {"label":"3", "x":19, "y":3}, + {"label":"Field +", "x":20, "y":2, "h":3}, + {"label":"Left", "x":0, "y":4}, + {"label":"Right", "x":1, "y":4}, + {"label":"Error Reset", "x":2.25, "y":4, "w":2}, + {"label":"Space", "x":4.25, "y":4, "w":9.75}, + {"label":"Enter Rec Adv", "x":14, "y":4, "w":2}, + {"label":"0", "x":16, "y":4, "w":2}, + {"label":".", "x":18, "y":4, "w":2} + ] + } + } } diff --git a/keyboards/converter/ibm_5291/readme.md b/keyboards/converter/ibm_5291/readme.md index 06ae2e994..03406d3f9 100644 --- a/keyboards/converter/ibm_5291/readme.md +++ b/keyboards/converter/ibm_5291/readme.md @@ -1,6 +1,6 @@ # IBM 5291 keyboard converter -![5291](https://deskthority.net/wiki/IBM_Model_F#IBM_5291_Keyboard) +[IBM 5291](https://deskthority.net/wiki/IBM_Model_F#IBM_5291_Keyboard) A converter for the eponymous keyboard. @@ -14,7 +14,7 @@ Make example for this keyboard (after setting up your build environment): 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). -the pinout is as follows: +The pinout is as follows: IBM−5291−Cable to Pinhead−14 @@ -35,7 +35,8 @@ IBM−5291−Cable to Pinhead−14 13| Strobe 14| Out -the pins on this connector are organized ![here](https://geekhack.org/index.php?action=dlattach;topic=48950.0;attach=36759;image) +The pins on this connector are organized +![here](https://geekhack.org/index.php?action=dlattach;topic=48950.0;attach=36759;image) IBM−5291−2 Cable with DB15M connector @@ -55,10 +56,11 @@ IBM−5291−2 Cable with DB15M connector |14 | PE |15 | NC -the above connector is actually numbered so it should be easier to determine +The above connector is actually numbered so it should be easier to determine where the needed connections are. -to connect to the teensy, the following are pins are needed (if you should choose not set your own): +To connect to the teensy, the following are pins are needed (if you should choose not set your own): + * PB0 -> PB6 are connected to D0 -> D6 * +5V is connected to the corresponding teensy pin * gnd is as well, only one of the gnd pins needs to be connected though. From ff5fcedb10310538ff8fda7b2bb620966e069b2a Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Fri, 14 Dec 2018 22:58:57 -0800 Subject: [PATCH 707/788] converter/palm_usb/stowaway: Configurator support (#4655) --- .../converter/palm_usb/stowaway/info.json | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 keyboards/converter/palm_usb/stowaway/info.json diff --git a/keyboards/converter/palm_usb/stowaway/info.json b/keyboards/converter/palm_usb/stowaway/info.json new file mode 100644 index 000000000..8188d14bd --- /dev/null +++ b/keyboards/converter/palm_usb/stowaway/info.json @@ -0,0 +1,83 @@ +{ + "keyboard_name": "Palm Stowaway Serial", + "keyboard_folder": "converter/palm_usb/stowaway", + "url": "", + "maintainer": "qmk", + "width": 15.25, + "height": 5, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"1", "x":0.5, "y":0}, + {"label":"2", "x":1.5, "y":0}, + {"label":"3", "x":2.5, "y":0}, + {"label":"4", "x":3.5, "y":0}, + {"label":"5", "x":4.5, "y":0}, + {"label":"6", "x":5.5, "y":0}, + {"label":"7", "x":6.5, "y":0}, + {"label":"8", "x":7.5, "y":0}, + {"label":"9", "x":8.5, "y":0}, + {"label":"0", "x":9.5, "y":0}, + {"label":"MINS", "x":10.5, "y":0}, + {"label":"EQL", "x":11.5, "y":0}, + {"label":"BACK", "x":12.5, "y":0, "w":1.5}, + {"label":"APP0", "x":14.25, "y":1, "h":0.6875}, + {"label":"TAB", "x":0, "y":1}, + {"label":"Q", "x":1, "y":1}, + {"label":"W", "x":2, "y":1}, + {"label":"E", "x":3, "y":1}, + {"label":"R", "x":4, "y":1}, + {"label":"T", "x":5, "y":1}, + {"label":"Y", "x":6, "y":1}, + {"label":"U", "x":7, "y":1}, + {"label":"I", "x":8, "y":1}, + {"label":"O", "x":9, "y":1}, + {"label":"P", "x":10, "y":1}, + {"label":"LBRC", "x":11, "y":1}, + {"label":"RBRC", "x":12, "y":1}, + {"label":"BSLS", "x":13, "y":1}, + {"label":"APP1", "x":14.25, "y":1.6875, "h":0.6875}, + {"label":"CAPS", "x":0, "y":2, "w":1.25}, + {"label":"A", "x":1.25, "y":2}, + {"label":"S", "x":2.25, "y":2}, + {"label":"D", "x":3.25, "y":2}, + {"label":"F", "x":4.25, "y":2}, + {"label":"G", "x":5.25, "y":2}, + {"label":"H", "x":6.25, "y":2}, + {"label":"J", "x":7.25, "y":2}, + {"label":"K", "x":8.25, "y":2}, + {"label":"L", "x":9.25, "y":2}, + {"label":"SCLN", "x":10.25, "y":2}, + {"label":"QUOT", "x":11.25, "y":2}, + {"label":"ENT", "x":12.25, "y":2, "w":1.75}, + {"label":"APP2", "x":14.25, "y":2.375, "h":0.6875}, + {"label":"LSFT", "x":0, "y":3, "w":1.75}, + {"label":"Z", "x":1.75, "y":3}, + {"label":"X", "x":2.75, "y":3}, + {"label":"C", "x":3.75, "y":3}, + {"label":"V", "x":4.75, "y":3}, + {"label":"B", "x":5.75, "y":3}, + {"label":"N", "x":6.75, "y":3}, + {"label":"M", "x":7.75, "y":3}, + {"label":"COMM", "x":8.75, "y":3}, + {"label":"DOT", "x":9.75, "y":3}, + {"label":"SLSH", "x":10.75, "y":3}, + {"label":"RSFT", "x":11.75, "y":3, "w":1.25}, + {"label":"UP", "x":13, "y":3}, + {"label":"APP3", "x":14.25, "y":3.0625, "h":0.6875}, + {"label":"LCTL", "x":0, "y":4, "w":1.25}, + {"label":"FN", "x":1.25, "y":4}, + {"label":"LALT", "x":2.25, "y":4}, + {"label":"CMD", "x":3.25, "y":4}, + {"label":"SPACE", "x":4.25, "y":4, "w":3.5}, + {"label":"SPACE/New", "x":7.75, "y":4}, + {"label":"GRAVE", "x":8.75, "y":4}, + {"label":"DONE", "x":9.75, "y":4}, + {"label":"DEL", "x":10.75, "y":4, "w":1.25}, + {"label":"LEFT", "x":12, "y":4}, + {"label":"DOWN", "x":13, "y":4}, + {"label":"RIGHT", "x":14, "y":4} + ] + } + } +} From 11439c432600bae455d546fba0ad7685a2800948 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Sat, 15 Dec 2018 07:25:11 -0800 Subject: [PATCH 708/788] Configurator support for Sun Type 3 and Type 5 USB converters (#4656) * Sun Type 3 USB converter: Configurator support * Sun Type 5 USB converter: Configurator support --- keyboards/converter/sun_usb/type3/info.json | 109 ++++++ keyboards/converter/sun_usb/type5/info.json | 381 ++++++++++++++++++++ 2 files changed, 490 insertions(+) create mode 100644 keyboards/converter/sun_usb/type3/info.json create mode 100644 keyboards/converter/sun_usb/type5/info.json diff --git a/keyboards/converter/sun_usb/type3/info.json b/keyboards/converter/sun_usb/type3/info.json new file mode 100644 index 000000000..f8525b15c --- /dev/null +++ b/keyboards/converter/sun_usb/type3/info.json @@ -0,0 +1,109 @@ +{ + "keyboard_name": "Sun Type 3", + "keyboard_folder": "converter/sun_usb/type3", + "url": "", + "maintainer": "qmk", + "width": 21, + "height": 6, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"STOP", "x":0, "y":0}, + {"label":"AGAIN", "x":1, "y":0}, + {"label":"CAPS LOCK", "x":2.5, "y":0}, + {"label":"F2", "x":3.5, "y":0}, + {"label":"F3", "x":4.5, "y":0, "w":2}, + {"label":"F4", "x":6.5, "y":0, "w":2}, + {"label":"F5", "x":8.5, "y":0, "w":2}, + {"label":"F6", "x":10.5, "y":0, "w":2}, + {"label":"F7", "x":12.5, "y":0, "w":2}, + {"label":"F8", "x":14.5, "y":0}, + {"label":"F9", "x":15.5, "y":0}, + {"label":"BACKSPACE", "x":16.5, "y":0}, + {"label":"R1", "x":18, "y":0}, + {"label":"R2", "x":19, "y":0}, + {"label":"R3", "x":20, "y":0}, + {"label":"PROPS", "x":0, "y":1}, + {"label":"UNDO", "x":1, "y":1}, + {"label":"ESC", "x":2.5, "y":1}, + {"label":"1", "x":3.5, "y":1}, + {"label":"2", "x":4.5, "y":1}, + {"label":"3", "x":5.5, "y":1}, + {"label":"4", "x":6.5, "y":1}, + {"label":"5", "x":7.5, "y":1}, + {"label":"6", "x":8.5, "y":1}, + {"label":"7", "x":9.5, "y":1}, + {"label":"8", "x":10.5, "y":1}, + {"label":"9", "x":11.5, "y":1}, + {"label":"0", "x":12.5, "y":1}, + {"label":"MINUS", "x":13.5, "y":1}, + {"label":"EQUAL", "x":14.5, "y":1}, + {"label":"BACKSLASH", "x":15.5, "y":1}, + {"label":"GRAVE", "x":16.5, "y":1}, + {"label":"R4", "x":18, "y":1}, + {"label":"R5", "x":19, "y":1}, + {"label":"R6", "x":20, "y":1}, + {"label":"FRONT", "x":0, "y":2}, + {"label":"COPY", "x":1, "y":2}, + {"label":"TAB", "x":2.5, "y":2, "w":1.5}, + {"label":"Q", "x":4, "y":2}, + {"label":"W", "x":5, "y":2}, + {"label":"E", "x":6, "y":2}, + {"label":"R", "x":7, "y":2}, + {"label":"T", "x":8, "y":2}, + {"label":"Y", "x":9, "y":2}, + {"label":"U", "x":10, "y":2}, + {"label":"I", "x":11, "y":2}, + {"label":"O", "x":12, "y":2}, + {"label":"P", "x":13, "y":2}, + {"label":"LBRACKET", "x":14, "y":2}, + {"label":"RBRACKET", "x":15, "y":2}, + {"label":"DELETE", "x":16, "y":2, "w":1.5}, + {"label":"R7", "x":18, "y":2}, + {"label":"R8", "x":19, "y":2}, + {"label":"R9", "x":20, "y":2}, + {"label":"OPEN", "x":0, "y":3}, + {"label":"PASTE", "x":1, "y":3}, + {"label":"CONTROL", "x":2.5, "y":3, "w":1.75}, + {"label":"A", "x":4.25, "y":3}, + {"label":"S", "x":5.25, "y":3}, + {"label":"D", "x":6.25, "y":3}, + {"label":"F", "x":7.25, "y":3}, + {"label":"G", "x":8.25, "y":3}, + {"label":"H", "x":9.25, "y":3}, + {"label":"J", "x":10.25, "y":3}, + {"label":"K", "x":11.25, "y":3}, + {"label":"L", "x":12.25, "y":3}, + {"label":"SEMICOLON", "x":13.25, "y":3}, + {"label":"QUOTE", "x":14.25, "y":3}, + {"label":"RETURN", "x":15.25, "y":3, "w":2.25}, + {"label":"R10", "x":18, "y":3}, + {"label":"R11", "x":19, "y":3}, + {"label":"R12", "x":20, "y":3}, + {"label":"FIND", "x":0, "y":4}, + {"label":"CUT", "x":1, "y":4}, + {"label":"LSHIFT", "x":2.5, "y":4, "w":2.25}, + {"label":"Z", "x":4.75, "y":4}, + {"label":"X", "x":5.75, "y":4}, + {"label":"C", "x":6.75, "y":4}, + {"label":"V", "x":7.75, "y":4}, + {"label":"B", "x":8.75, "y":4}, + {"label":"N", "x":9.75, "y":4}, + {"label":"M", "x":10.75, "y":4}, + {"label":"COMMA", "x":11.75, "y":4}, + {"label":"PERIOD", "x":12.75, "y":4}, + {"label":"SLASH", "x":13.75, "y":4}, + {"label":"RSHIFT", "x":14.75, "y":4, "w":1.75}, + {"label":"LINE FEED", "x":16.5, "y":4}, + {"label":"R13", "x":18, "y":4}, + {"label":"R14", "x":19, "y":4}, + {"label":"R15", "x":20, "y":4}, + {"label":"CAPS", "x":2.5, "y":5, "w":1.25}, + {"label":"LEFT", "x":3.75, "y":5, "w":1.5}, + {"label":"SPACE", "x":5.25, "y":5, "w":9}, + {"label":"RIGHT", "x":14.25, "y":5, "w":1.5}, + {"label":"ALTERNATE", "x":15.75, "y":5, "w":1.75} + ] + } + } +} diff --git a/keyboards/converter/sun_usb/type5/info.json b/keyboards/converter/sun_usb/type5/info.json new file mode 100644 index 000000000..6785bbc07 --- /dev/null +++ b/keyboards/converter/sun_usb/type5/info.json @@ -0,0 +1,381 @@ +{ + "keyboard_name": "Sun Type 5", + "keyboard_folder": "converter/sun_usb/type5", + "url": "", + "maintainer": "qmk", + "width": 24.75, + "height": 7, + "layouts": { + "LAYOUT_jp_unix": { + "layout": [ + {"label":"HELP", "x":0, "y":0, "w":2}, + {"label":"NO", "x":2.25, "y":0}, + {"label":"F1", "x":4.25, "y":0}, + {"label":"F2", "x":5.25, "y":0}, + {"label":"F3", "x":6.25, "y":0}, + {"label":"F4", "x":7.25, "y":0}, + {"label":"F5", "x":8.75, "y":0}, + {"label":"F6", "x":9.75, "y":0}, + {"label":"F7", "x":10.75, "y":0}, + {"label":"F8", "x":11.75, "y":0}, + {"label":"F9", "x":13.25, "y":0}, + {"label":"F10", "x":14.25, "y":0}, + {"label":"F11", "x":15.25, "y":0}, + {"label":"F12", "x":16.25, "y":0}, + {"label":"PRINT SCREEN", "x":17.5, "y":0}, + {"label":"SCROLL LOCK", "x":18.5, "y":0}, + {"label":"PAUSE", "x":19.5, "y":0}, + {"label":"MUTE", "x":20.75, "y":0}, + {"label":"VOLD", "x":21.75, "y":0}, + {"label":"VOLU", "x":22.75, "y":0}, + {"label":"PWR", "x":23.75, "y":0}, + {"label":"STOP", "x":0, "y":2}, + {"label":"AGAIN", "x":1, "y":2}, + {"label":"ESC", "x":2.25, "y":2}, + {"label":"1", "x":3.25, "y":2}, + {"label":"2", "x":4.25, "y":2}, + {"label":"3", "x":5.25, "y":2}, + {"label":"4", "x":6.25, "y":2}, + {"label":"5", "x":7.25, "y":2}, + {"label":"6", "x":8.25, "y":2}, + {"label":"7", "x":9.25, "y":2}, + {"label":"8", "x":10.25, "y":2}, + {"label":"9", "x":11.25, "y":2}, + {"label":"0", "x":12.25, "y":2}, + {"label":"MINUS", "x":13.25, "y":2}, + {"label":"EQUAL", "x":14.25, "y":2}, + {"label":"BACKSLASH", "x":15.25, "y":2}, + {"label":"GRAVE", "x":16.25, "y":2}, + {"label":"INSERT", "x":17.5, "y":2}, + {"label":"HOME", "x":18.5, "y":2}, + {"label":"PAGE UP", "x":19.5, "y":2}, + {"label":"NUM LOCK", "x":20.75, "y":2}, + {"label":"PSLASH", "x":21.75, "y":2}, + {"label":"PASTERISK", "x":22.75, "y":2}, + {"label":"PMINUS", "x":23.75, "y":2}, + {"label":"MENU", "x":0, "y":3}, + {"label":"UNDO", "x":1, "y":3}, + {"label":"TAB", "x":2.25, "y":3, "w":1.5}, + {"label":"Q", "x":3.75, "y":3}, + {"label":"W", "x":4.75, "y":3}, + {"label":"E", "x":5.75, "y":3}, + {"label":"R", "x":6.75, "y":3}, + {"label":"T", "x":7.75, "y":3}, + {"label":"Y", "x":8.75, "y":3}, + {"label":"U", "x":9.75, "y":3}, + {"label":"I", "x":10.75, "y":3}, + {"label":"O", "x":11.75, "y":3}, + {"label":"P", "x":12.75, "y":3}, + {"label":"LBRACKET", "x":13.75, "y":3}, + {"label":"RBRACKET", "x":14.75, "y":3}, + {"label":"BACKSPACE", "x":15.75, "y":3, "w":1.5}, + {"label":"DELETE", "x":17.5, "y":3}, + {"label":"END", "x":18.5, "y":3}, + {"label":"PAGE DOWN", "x":19.5, "y":3}, + {"label":"P7", "x":20.75, "y":3}, + {"label":"P8", "x":21.75, "y":3}, + {"label":"P9", "x":22.75, "y":3}, + {"label":"PPLUS", "x":23.75, "y":3, "h":2}, + {"label":"SELECT", "x":0, "y":4}, + {"label":"COPY", "x":1, "y":4}, + {"label":"LCTRL", "x":2.25, "y":4, "w":1.75}, + {"label":"A", "x":4, "y":4}, + {"label":"S", "x":5, "y":4}, + {"label":"D", "x":6, "y":4}, + {"label":"F", "x":7, "y":4}, + {"label":"G", "x":8, "y":4}, + {"label":"H", "x":9, "y":4}, + {"label":"J", "x":10, "y":4}, + {"label":"K", "x":11, "y":4}, + {"label":"L", "x":12, "y":4}, + {"label":"SEMICOLON", "x":13, "y":4}, + {"label":"QUOTE", "x":14, "y":4}, + {"label":"ENTER", "x":15, "y":4, "w":2.25}, + {"label":"P4", "x":20.75, "y":4}, + {"label":"P5", "x":21.75, "y":4}, + {"label":"P6", "x":22.75, "y":4}, + {"label":"EXECUTE", "x":0, "y":5}, + {"label":"PASTE", "x":1, "y":5}, + {"label":"LSHIFT", "x":2.25, "y":5, "w":2.25}, + {"label":"Z", "x":4.5, "y":5}, + {"label":"X", "x":5.5, "y":5}, + {"label":"C", "x":6.5, "y":5}, + {"label":"V", "x":7.5, "y":5}, + {"label":"B", "x":8.5, "y":5}, + {"label":"N", "x":9.5, "y":5}, + {"label":"M", "x":10.5, "y":5}, + {"label":"COMMA", "x":11.5, "y":5}, + {"label":"PERIOD", "x":12.5, "y":5}, + {"label":"SLASH", "x":13.5, "y":5}, + {"label":"RSHIFT", "x":14.5, "y":5, "w":2.75}, + {"label":"UP", "x":18.5, "y":5}, + {"label":"P1", "x":20.75, "y":5}, + {"label":"P2", "x":21.75, "y":5}, + {"label":"P3", "x":22.75, "y":5}, + {"label":"PENTER", "x":23.75, "y":5, "h":2}, + {"label":"FIND", "x":0, "y":6}, + {"label":"CUT", "x":1, "y":6}, + {"label":"CAPS LOCK", "x":2.25, "y":6}, + {"label":"LALT", "x":3.25, "y":6}, + {"label":"LGUI", "x":4.25, "y":6}, + {"label":"HENKAN", "x":5.25, "y":6, "w":1.5}, + {"label":"SPACE", "x":6.75, "y":6, "w":5}, + {"label":"MUHENKAN", "x":11.75, "y":6, "w":1.5}, + {"label":"KANA", "x":13.25, "y":6}, + {"label":"RGUI", "x":14.25, "y":6}, + {"label":"APP", "x":15.25, "y":6}, + {"label":"RALT", "x":16.25, "y":6}, + {"label":"LEFT", "x":17.5, "y":6}, + {"label":"DOWN", "x":18.5, "y":6}, + {"label":"RIGHT", "x":19.5, "y":6}, + {"label":"P0", "x":20.75, "y":6, "w":2}, + {"label":"PDOT", "x":22.75, "y":6} + ] + }, + "LAYOUT_us_unix": { + "layout": [ + {"label":"HELP", "x":0, "y":0, "w":2}, + {"label":"NO", "x":2.25, "y":0}, + {"label":"F1", "x":4.25, "y":0}, + {"label":"F2", "x":5.25, "y":0}, + {"label":"F3", "x":6.25, "y":0}, + {"label":"F4", "x":7.25, "y":0}, + {"label":"F5", "x":8.75, "y":0}, + {"label":"F6", "x":9.75, "y":0}, + {"label":"F7", "x":10.75, "y":0}, + {"label":"F8", "x":11.75, "y":0}, + {"label":"F9", "x":13.25, "y":0}, + {"label":"F10", "x":14.25, "y":0}, + {"label":"F11", "x":15.25, "y":0}, + {"label":"F12", "x":16.25, "y":0}, + {"label":"PRINT SCREEN", "x":17.5, "y":0}, + {"label":"SCROLL LOCK", "x":18.5, "y":0}, + {"label":"PAUSE", "x":19.5, "y":0}, + {"label":"MUTE", "x":20.75, "y":0}, + {"label":"VOLD", "x":21.75, "y":0}, + {"label":"VOLU", "x":22.75, "y":0}, + {"label":"PWR", "x":23.75, "y":0}, + {"label":"STOP", "x":0, "y":2}, + {"label":"AGAIN", "x":1, "y":2}, + {"label":"ESC", "x":2.25, "y":2}, + {"label":"1", "x":3.25, "y":2}, + {"label":"2", "x":4.25, "y":2}, + {"label":"3", "x":5.25, "y":2}, + {"label":"4", "x":6.25, "y":2}, + {"label":"5", "x":7.25, "y":2}, + {"label":"6", "x":8.25, "y":2}, + {"label":"7", "x":9.25, "y":2}, + {"label":"8", "x":10.25, "y":2}, + {"label":"9", "x":11.25, "y":2}, + {"label":"0", "x":12.25, "y":2}, + {"label":"MINUS", "x":13.25, "y":2}, + {"label":"EQUAL", "x":14.25, "y":2}, + {"label":"BACKSLASH", "x":15.25, "y":2}, + {"label":"GRAVE", "x":16.25, "y":2}, + {"label":"INSERT", "x":17.5, "y":2}, + {"label":"HOME", "x":18.5, "y":2}, + {"label":"PAGE UP", "x":19.5, "y":2}, + {"label":"NUM LOCK", "x":20.75, "y":2}, + {"label":"PSLASH", "x":21.75, "y":2}, + {"label":"PASTERISK", "x":22.75, "y":2}, + {"label":"PMINUS", "x":23.75, "y":2}, + {"label":"MENU", "x":0, "y":3}, + {"label":"UNDO", "x":1, "y":3}, + {"label":"TAB", "x":2.25, "y":3, "w":1.5}, + {"label":"Q", "x":3.75, "y":3}, + {"label":"W", "x":4.75, "y":3}, + {"label":"E", "x":5.75, "y":3}, + {"label":"R", "x":6.75, "y":3}, + {"label":"T", "x":7.75, "y":3}, + {"label":"Y", "x":8.75, "y":3}, + {"label":"U", "x":9.75, "y":3}, + {"label":"I", "x":10.75, "y":3}, + {"label":"O", "x":11.75, "y":3}, + {"label":"P", "x":12.75, "y":3}, + {"label":"LBRACKET", "x":13.75, "y":3}, + {"label":"RBRACKET", "x":14.75, "y":3}, + {"label":"BACKSPACE", "x":15.75, "y":3, "w":1.5}, + {"label":"DELETE", "x":17.5, "y":3}, + {"label":"END", "x":18.5, "y":3}, + {"label":"PAGE DOWN", "x":19.5, "y":3}, + {"label":"P7", "x":20.75, "y":3}, + {"label":"P8", "x":21.75, "y":3}, + {"label":"P9", "x":22.75, "y":3}, + {"label":"PPLUS", "x":23.75, "y":3, "h":2}, + {"label":"SELECT", "x":0, "y":4}, + {"label":"COPY", "x":1, "y":4}, + {"label":"LCTRL", "x":2.25, "y":4, "w":1.75}, + {"label":"A", "x":4, "y":4}, + {"label":"S", "x":5, "y":4}, + {"label":"D", "x":6, "y":4}, + {"label":"F", "x":7, "y":4}, + {"label":"G", "x":8, "y":4}, + {"label":"H", "x":9, "y":4}, + {"label":"J", "x":10, "y":4}, + {"label":"K", "x":11, "y":4}, + {"label":"L", "x":12, "y":4}, + {"label":"SEMICOLON", "x":13, "y":4}, + {"label":"QUOTE", "x":14, "y":4}, + {"label":"ENTER", "x":15, "y":4, "w":2.25}, + {"label":"P4", "x":20.75, "y":4}, + {"label":"P5", "x":21.75, "y":4}, + {"label":"P6", "x":22.75, "y":4}, + {"label":"EXECUTE", "x":0, "y":5}, + {"label":"PASTE", "x":1, "y":5}, + {"label":"LSHIFT", "x":2.25, "y":5, "w":2.25}, + {"label":"Z", "x":4.5, "y":5}, + {"label":"X", "x":5.5, "y":5}, + {"label":"C", "x":6.5, "y":5}, + {"label":"V", "x":7.5, "y":5}, + {"label":"B", "x":8.5, "y":5}, + {"label":"N", "x":9.5, "y":5}, + {"label":"M", "x":10.5, "y":5}, + {"label":"COMMA", "x":11.5, "y":5}, + {"label":"PERIOD", "x":12.5, "y":5}, + {"label":"SLASH", "x":13.5, "y":5}, + {"label":"RSHIFT", "x":14.5, "y":5, "w":2.75}, + {"label":"UP", "x":18.5, "y":5}, + {"label":"P1", "x":20.75, "y":5}, + {"label":"P2", "x":21.75, "y":5}, + {"label":"P3", "x":22.75, "y":5}, + {"label":"PENTER", "x":23.75, "y":5, "h":2}, + {"label":"FIND", "x":0, "y":6}, + {"label":"CUT", "x":1, "y":6}, + {"label":"CAPS LOCK", "x":2.25, "y":6, "w":1.75}, + {"label":"LALT", "x":4, "y":6}, + {"label":"LGUI", "x":5, "y":6}, + {"label":"SPACE", "x":6, "y":6, "w":8.25}, + {"label":"RGUI", "x":14.25, "y":6}, + {"label":"APP", "x":15.25, "y":6}, + {"label":"RALT", "x":16.25, "y":6}, + {"label":"LEFT", "x":17.5, "y":6}, + {"label":"DOWN", "x":18.5, "y":6}, + {"label":"RIGHT", "x":19.5, "y":6}, + {"label":"P0", "x":20.75, "y":6, "w":2}, + {"label":"PDOT", "x":22.75, "y":6} + ] + }, + "LAYOUT_ansi": { + "layout": [ + {"label":"HELP", "x":0, "y":0, "w":2}, + {"label":"ESC", "x":2.25, "y":0}, + {"label":"F1", "x":4.25, "y":0}, + {"label":"F2", "x":5.25, "y":0}, + {"label":"F3", "x":6.25, "y":0}, + {"label":"F4", "x":7.25, "y":0}, + {"label":"F5", "x":8.75, "y":0}, + {"label":"F6", "x":9.75, "y":0}, + {"label":"F7", "x":10.75, "y":0}, + {"label":"F8", "x":11.75, "y":0}, + {"label":"F9", "x":13.25, "y":0}, + {"label":"F10", "x":14.25, "y":0}, + {"label":"F11", "x":15.25, "y":0}, + {"label":"F12", "x":16.25, "y":0}, + {"label":"PRINT SCREEN", "x":17.5, "y":0}, + {"label":"SCROLL LOCK", "x":18.5, "y":0}, + {"label":"PAUSE", "x":19.5, "y":0}, + {"label":"MUTE", "x":20.75, "y":0}, + {"label":"VOLD", "x":21.75, "y":0}, + {"label":"VOLU", "x":22.75, "y":0}, + {"label":"PWR", "x":23.75, "y":0}, + {"label":"STOP", "x":0, "y":2}, + {"label":"AGAIN", "x":1, "y":2}, + {"label":"GRAVE", "x":2.25, "y":2}, + {"label":"1", "x":3.25, "y":2}, + {"label":"2", "x":4.25, "y":2}, + {"label":"3", "x":5.25, "y":2}, + {"label":"4", "x":6.25, "y":2}, + {"label":"5", "x":7.25, "y":2}, + {"label":"6", "x":8.25, "y":2}, + {"label":"7", "x":9.25, "y":2}, + {"label":"8", "x":10.25, "y":2}, + {"label":"9", "x":11.25, "y":2}, + {"label":"0", "x":12.25, "y":2}, + {"label":"MINUS", "x":13.25, "y":2}, + {"label":"EQUAL", "x":14.25, "y":2}, + {"label":"BACKSPACE", "x":15.25, "y":2, "w":2}, + {"label":"INSERT", "x":17.5, "y":2}, + {"label":"HOME", "x":18.5, "y":2}, + {"label":"PAGE UP", "x":19.5, "y":2}, + {"label":"NUM LOCK", "x":20.75, "y":2}, + {"label":"PSLASH", "x":21.75, "y":2}, + {"label":"PASTERISK", "x":22.75, "y":2}, + {"label":"PMINUS", "x":23.75, "y":2}, + {"label":"MENU", "x":0, "y":3}, + {"label":"UNDO", "x":1, "y":3}, + {"label":"TAB", "x":2.25, "y":3, "w":1.5}, + {"label":"Q", "x":3.75, "y":3}, + {"label":"W", "x":4.75, "y":3}, + {"label":"E", "x":5.75, "y":3}, + {"label":"R", "x":6.75, "y":3}, + {"label":"T", "x":7.75, "y":3}, + {"label":"Y", "x":8.75, "y":3}, + {"label":"U", "x":9.75, "y":3}, + {"label":"I", "x":10.75, "y":3}, + {"label":"O", "x":11.75, "y":3}, + {"label":"P", "x":12.75, "y":3}, + {"label":"LBRACKET", "x":13.75, "y":3}, + {"label":"RBRACKET", "x":14.75, "y":3}, + {"label":"BACKSLASH", "x":15.75, "y":3, "w":1.5}, + {"label":"DELETE", "x":17.5, "y":3}, + {"label":"END", "x":18.5, "y":3}, + {"label":"PAGE DOWN", "x":19.5, "y":3}, + {"label":"P7", "x":20.75, "y":3}, + {"label":"P8", "x":21.75, "y":3}, + {"label":"P9", "x":22.75, "y":3}, + {"label":"PPLUS", "x":23.75, "y":3, "h":2}, + {"label":"SELECT", "x":0, "y":4}, + {"label":"COPY", "x":1, "y":4}, + {"label":"CAPS LOCK", "x":2.25, "y":4, "w":1.75}, + {"label":"A", "x":4, "y":4}, + {"label":"S", "x":5, "y":4}, + {"label":"D", "x":6, "y":4}, + {"label":"F", "x":7, "y":4}, + {"label":"G", "x":8, "y":4}, + {"label":"H", "x":9, "y":4}, + {"label":"J", "x":10, "y":4}, + {"label":"K", "x":11, "y":4}, + {"label":"L", "x":12, "y":4}, + {"label":"SEMICOLON", "x":13, "y":4}, + {"label":"QUOTE", "x":14, "y":4}, + {"label":"ENTER", "x":15, "y":4, "w":2.25}, + {"label":"P4", "x":20.75, "y":4}, + {"label":"P5", "x":21.75, "y":4}, + {"label":"P6", "x":22.75, "y":4}, + {"label":"EXECUTE", "x":0, "y":5}, + {"label":"PASTE", "x":1, "y":5}, + {"label":"LSHIFT", "x":2.25, "y":5, "w":2.25}, + {"label":"Z", "x":4.5, "y":5}, + {"label":"X", "x":5.5, "y":5}, + {"label":"C", "x":6.5, "y":5}, + {"label":"V", "x":7.5, "y":5}, + {"label":"B", "x":8.5, "y":5}, + {"label":"N", "x":9.5, "y":5}, + {"label":"M", "x":10.5, "y":5}, + {"label":"COMMA", "x":11.5, "y":5}, + {"label":"PERIOD", "x":12.5, "y":5}, + {"label":"SLASH", "x":13.5, "y":5}, + {"label":"RSHIFT", "x":14.5, "y":5, "w":2.75}, + {"label":"UP", "x":18.5, "y":5}, + {"label":"P1", "x":20.75, "y":5}, + {"label":"P2", "x":21.75, "y":5}, + {"label":"P3", "x":22.75, "y":5}, + {"label":"PENTER", "x":23.75, "y":5, "h":2}, + {"label":"FIND", "x":0, "y":6}, + {"label":"CUT", "x":1, "y":6}, + {"label":"LCTRL", "x":2.25, "y":6, "w":1.75}, + {"label":"LALT", "x":4, "y":6}, + {"label":"LGUI", "x":5, "y":6}, + {"label":"SPACE", "x":6, "y":6, "w":8.25}, + {"label":"RGUI", "x":14.25, "y":6}, + {"label":"APP", "x":15.25, "y":6}, + {"label":"RALT", "x":16.25, "y":6}, + {"label":"LEFT", "x":17.5, "y":6}, + {"label":"DOWN", "x":18.5, "y":6}, + {"label":"RIGHT", "x":19.5, "y":6}, + {"label":"P0", "x":20.75, "y":6, "w":2}, + {"label":"PDOT", "x":22.75, "y":6} + ] + } + } +} From 72bd17f2902c82ef84b9134433facb21ad696fbb Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Sat, 15 Dec 2018 07:25:29 -0800 Subject: [PATCH 709/788] converter/xt_usb: Configurator support (#4657) --- keyboards/converter/xt_usb/info.json | 229 +++++++++++++++++++++++++++ 1 file changed, 229 insertions(+) create mode 100644 keyboards/converter/xt_usb/info.json diff --git a/keyboards/converter/xt_usb/info.json b/keyboards/converter/xt_usb/info.json new file mode 100644 index 000000000..1fde77d1f --- /dev/null +++ b/keyboards/converter/xt_usb/info.json @@ -0,0 +1,229 @@ +{ + "keyboard_name": "IBM PC XT", + "keyboard_folder": "converter/xt_usb", + "url": "", + "maintainer": "qmk", + "width": 21, + "height": 5, + "layouts": { + "LAYOUT_xt": { + "layout": [ + {"label":"F1", "x":0, "y":0}, + {"label":"F2", "x":1, "y":0}, + {"label":"Esc", "x":2.25, "y":0}, + {"label":"1", "x":3.25, "y":0}, + {"label":"2", "x":4.25, "y":0}, + {"label":"3", "x":5.25, "y":0}, + {"label":"4", "x":6.25, "y":0}, + {"label":"5", "x":7.25, "y":0}, + {"label":"6", "x":8.25, "y":0}, + {"label":"7", "x":9.25, "y":0}, + {"label":"8", "x":10.25, "y":0}, + {"label":"9", "x":11.25, "y":0}, + {"label":"0", "x":12.25, "y":0}, + {"label":"-", "x":13.25, "y":0}, + {"label":"=", "x":14.25, "y":0}, + {"label":"Backspace", "x":15.25, "y":0, "w":1.75}, + {"label":"Num Lock", "x":17, "y":0, "w":2}, + {"label":"Scroll Lock", "x":19, "y":0, "w":2}, + {"label":"F3", "x":0, "y":1}, + {"label":"F4", "x":1, "y":1}, + {"label":"Tab", "x":2.25, "y":1, "w":1.5}, + {"label":"Q", "x":3.75, "y":1}, + {"label":"W", "x":4.75, "y":1}, + {"label":"E", "x":5.75, "y":1}, + {"label":"R", "x":6.75, "y":1}, + {"label":"T", "x":7.75, "y":1}, + {"label":"Y", "x":8.75, "y":1}, + {"label":"U", "x":9.75, "y":1}, + {"label":"I", "x":10.75, "y":1}, + {"label":"O", "x":11.75, "y":1}, + {"label":"P", "x":12.75, "y":1}, + {"label":"[", "x":13.75, "y":1}, + {"label":"]", "x":14.75, "y":1}, + {"label":"7", "x":17, "y":1}, + {"label":"8", "x":18, "y":1}, + {"label":"9", "x":19, "y":1}, + {"label":"-", "x":20, "y":1}, + {"label":"F5", "x":0, "y":2}, + {"label":"F6", "x":1, "y":2}, + {"label":"Ctrl", "x":2.25, "y":2, "w":1.75}, + {"label":"A", "x":4, "y":2}, + {"label":"S", "x":5, "y":2}, + {"label":"D", "x":6, "y":2}, + {"label":"F", "x":7, "y":2}, + {"label":"G", "x":8, "y":2}, + {"label":"H", "x":9, "y":2}, + {"label":"J", "x":10, "y":2}, + {"label":"K", "x":11, "y":2}, + {"label":"L", "x":12, "y":2}, + {"label":";", "x":13, "y":2}, + {"label":"'", "x":14, "y":2}, + {"label":"`", "x":15, "y":2}, + {"label":"Enter", "x":16, "y":1, "h":2}, + {"label":"4", "x":17, "y":2}, + {"label":"5", "x":18, "y":2}, + {"label":"6", "x":19, "y":2}, + {"label":"F7", "x":0, "y":3}, + {"label":"F8", "x":1, "y":3}, + {"label":"Shift", "x":2.25, "y":3, "w":1.25}, + {"label":"\\", "x":3.5, "y":3}, + {"label":"Z", "x":4.5, "y":3}, + {"label":"X", "x":5.5, "y":3}, + {"label":"C", "x":6.5, "y":3}, + {"label":"V", "x":7.5, "y":3}, + {"label":"B", "x":8.5, "y":3}, + {"label":"N", "x":9.5, "y":3}, + {"label":"M", "x":10.5, "y":3}, + {"label":",", "x":11.5, "y":3}, + {"label":".", "x":12.5, "y":3}, + {"label":"/", "x":13.5, "y":3}, + {"label":"Shift", "x":14.5, "y":3, "w":1.5}, + {"label":"Print Screen", "x":16, "y":3}, + {"label":"1", "x":17, "y":3}, + {"label":"2", "x":18, "y":3}, + {"label":"3", "x":19, "y":3}, + {"label":"+", "x":20, "y":2, "h":3}, + {"label":"F9", "x":0, "y":4}, + {"label":"F10", "x":1, "y":4}, + {"label":"Alt", "x":2.25, "y":4, "w":2}, + {"label":"Space", "x":4.25, "y":4, "w":9.75}, + {"label":"Caps Lock", "x":14, "y":4, "w":2}, + {"label":"0", "x":16, "y":4, "w":2}, + {"label":".", "x":18, "y":4, "w":2} + ] + }, + "LAYOUT": { + "layout": [ + {"label":"F13", "x":2, "y":0}, + {"label":"F14", "x":3, "y":0}, + {"label":"F15", "x":4, "y":0}, + {"label":"F16", "x":5, "y":0}, + {"label":"F17", "x":6, "y":0}, + {"label":"F18", "x":7, "y":0}, + {"label":"F19", "x":8, "y":0}, + {"label":"F20", "x":9, "y":0}, + {"label":"F21", "x":10, "y":0}, + {"label":"F22", "x":11, "y":0}, + {"label":"F23", "x":12, "y":0}, + {"label":"F24", "x":13, "y":0}, + {"label":"Esc", "x":0, "y":1}, + {"label":"F1", "x":2, "y":1}, + {"label":"F2", "x":3, "y":1}, + {"label":"F3", "x":4, "y":1}, + {"label":"F4", "x":5, "y":1}, + {"label":"F5", "x":6, "y":1}, + {"label":"F6", "x":7, "y":1}, + {"label":"F7", "x":8, "y":1}, + {"label":"F8", "x":9, "y":1}, + {"label":"F9", "x":10, "y":1}, + {"label":"F10", "x":11, "y":1}, + {"label":"F11", "x":12, "y":1}, + {"label":"F12", "x":13, "y":1}, + {"label":"Print Screen", "x":15.25, "y":1}, + {"label":"Scroll Lock", "x":16.25, "y":1}, + {"label":"Pause", "x":17.25, "y":1}, + {"label":"Volume Down", "x":19.5, "y":1}, + {"label":"Volume Up", "x":20.5, "y":1}, + {"label":"Mute", "x":21.5, "y":1}, + {"label":"`", "x":0, "y":2.5}, + {"label":"1", "x":1, "y":2.5}, + {"label":"2", "x":2, "y":2.5}, + {"label":"3", "x":3, "y":2.5}, + {"label":"4", "x":4, "y":2.5}, + {"label":"5", "x":5, "y":2.5}, + {"label":"6", "x":6, "y":2.5}, + {"label":"7", "x":7, "y":2.5}, + {"label":"8", "x":8, "y":2.5}, + {"label":"9", "x":9, "y":2.5}, + {"label":"0", "x":10, "y":2.5}, + {"label":"-", "x":11, "y":2.5}, + {"label":"=", "x":12, "y":2.5}, + {"label":"JP Yen", "x":13, "y":2.5}, + {"label":"Back Space", "x":14, "y":2.5}, + {"label":"Insert", "x":15.25, "y":2.5}, + {"label":"Home", "x":16.25, "y":2.5}, + {"label":"Page Up", "x":17.25, "y":2.5}, + {"label":"Num Lock", "x":18.5, "y":2.5}, + {"label":"KP/", "x":19.5, "y":2.5}, + {"label":"KP*", "x":20.5, "y":2.5}, + {"label":"KP-", "x":21.5, "y":2.5}, + {"label":"Tab", "x":0, "y":3.5, "w":1.5}, + {"label":"Q", "x":1.5, "y":3.5}, + {"label":"W", "x":2.5, "y":3.5}, + {"label":"E", "x":3.5, "y":3.5}, + {"label":"R", "x":4.5, "y":3.5}, + {"label":"T", "x":5.5, "y":3.5}, + {"label":"Y", "x":6.5, "y":3.5}, + {"label":"U", "x":7.5, "y":3.5}, + {"label":"I", "x":8.5, "y":3.5}, + {"label":"O", "x":9.5, "y":3.5}, + {"label":"P", "x":10.5, "y":3.5}, + {"label":"[", "x":11.5, "y":3.5}, + {"label":"]", "x":12.5, "y":3.5}, + {"label":"\\", "x":13.5, "y":3.5, "w":1.5}, + {"label":"Delete", "x":15.25, "y":3.5}, + {"label":"End", "x":16.25, "y":3.5}, + {"label":"Page Down", "x":17.25, "y":3.5}, + {"label":"KP 7", "x":18.5, "y":3.5}, + {"label":"KP 8", "x":19.5, "y":3.5}, + {"label":"KP 9", "x":20.5, "y":3.5}, + {"label":"KP+", "x":21.5, "y":3.5}, + {"label":"Caps Lock", "x":0, "y":4.5, "w":1.75}, + {"label":"A", "x":1.75, "y":4.5}, + {"label":"S", "x":2.75, "y":4.5}, + {"label":"D", "x":3.75, "y":4.5}, + {"label":"F", "x":4.75, "y":4.5}, + {"label":"G", "x":5.75, "y":4.5}, + {"label":"H", "x":6.75, "y":4.5}, + {"label":"J", "x":7.75, "y":4.5}, + {"label":"K", "x":8.75, "y":4.5}, + {"label":"L", "x":9.75, "y":4.5}, + {"label":";", "x":10.75, "y":4.5}, + {"label":"'", "x":11.75, "y":4.5}, + {"label":"ISO #", "x":12.75, "y":4.5}, + {"label":"Enter", "x":13.75, "y":4.5, "w":1.25}, + {"label":"KP 4", "x":18.5, "y":4.5}, + {"label":"KP 5", "x":19.5, "y":4.5}, + {"label":"KP 6", "x":20.5, "y":4.5}, + {"label":"KP ,", "x":21.5, "y":4.5}, + {"label":"Shift", "x":0, "y":5.5, "w":1.25}, + {"label":"ISO \\", "x":1.25, "y":5.5}, + {"label":"Z", "x":2.25, "y":5.5}, + {"label":"X", "x":3.25, "y":5.5}, + {"label":"C", "x":4.25, "y":5.5}, + {"label":"V", "x":5.25, "y":5.5}, + {"label":"B", "x":6.25, "y":5.5}, + {"label":"N", "x":7.25, "y":5.5}, + {"label":"M", "x":8.25, "y":5.5}, + {"label":",", "x":9.25, "y":5.5}, + {"label":".", "x":10.25, "y":5.5}, + {"label":"/", "x":11.25, "y":5.5}, + {"label":"JP RO", "x":12.25, "y":5.5}, + {"label":"Shift", "x":13.25, "y":5.5, "w":1.75}, + {"label":"Up", "x":16.25, "y":5.5}, + {"label":"KP 1", "x":18.5, "y":5.5}, + {"label":"KP 2", "x":19.5, "y":5.5}, + {"label":"KP 3", "x":20.5, "y":5.5}, + {"label":"KP Enter", "x":21.5, "y":5.5}, + {"label":"Ctrl", "x":0, "y":6.5, "w":1.25}, + {"label":"GUI", "x":1.25, "y":6.5, "w":1.25}, + {"label":"Alt", "x":2.5, "y":6.5, "w":1.25}, + {"label":"Muhenkan", "x":3.75, "y":6.5, "w":1.25}, + {"label":"Space", "x":5, "y":6.5, "w":3.25}, + {"label":"Henkan", "x":8.25, "y":6.5, "w":1.25}, + {"label":"Kana", "x":9.5, "y":6.5, "w":1.25}, + {"label":"Alt", "x":10.75, "y":6.5}, + {"label":"GUI", "x":11.75, "y":6.5}, + {"label":"Menu", "x":12.75, "y":6.5}, + {"label":"Ctrl", "x":13.75, "y":6.5, "w":1.25}, + {"label":"Left", "x":15.25, "y":6.5}, + {"label":"Down", "x":16.25, "y":6.5}, + {"label":"Right", "x":17.25, "y":6.5}, + {"label":"KP 0", "x":18.5, "y":6.5, "w":2}, + {"label":"KP .", "x":20.5, "y":6.5}, + {"label":"KP =", "x":21.5, "y":6.5} + ] + } + } +} From 3ec4a00bfc090fc440480336e3273b459074aa18 Mon Sep 17 00:00:00 2001 From: Alexander Kagno Date: Sat, 15 Dec 2018 08:29:24 -0700 Subject: [PATCH 710/788] Per Key Leader Timing Option (#4026) * leader changes to enable per key timing option * Changes requested to docs for @drashna * Changes requested by @drashna --- docs/config_options.md | 6 +++++- docs/feature_leader_key.md | 23 +++++++++++++++++++++++ quantum/process_keycode/process_leader.c | 6 ++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/docs/config_options.md b/docs/config_options.md index bea4acb01..fb1655e9a 100644 --- a/docs/config_options.md +++ b/docs/config_options.md @@ -143,6 +143,8 @@ If you define these options you will enable the associated feature, which may in * Breaks any Tap Toggle functionality (`TT` or the One Shot Tap Toggle) * `#define LEADER_TIMEOUT 300` * how long before the leader key times out +* `#define LEADER_PER_KEY_TIMING` + * sets the timer for leader key chords to run on each key press rather than overall * `#define ONESHOT_TIMEOUT 300` * how long before oneshot times out * `#define ONESHOT_TAP_TOGGLE 2` @@ -194,7 +196,7 @@ Split Keyboard specific options, make sure you have 'SPLIT_KEYBOARD = yes' in yo * `#define SPLIT_HAND_PIN B7` * For using high/low pin to determine handedness, low = right hand, high = left hand. Replace 'B7' with the pin you are using. This is optional and you can still use the EEHANDS method or MASTER_LEFT / MASTER_RIGHT defines like the stock Let's Split uses. - + * `#define USE_I2C` * For using I2C instead of Serial (defaults to serial) @@ -252,6 +254,8 @@ Use these to enable or disable building certain features. The more you have enab * Enable the audio subsystem. * `RGBLIGHT_ENABLE` * Enable keyboard underlight functionality +* `LEADER_ENABLE` + * Enable leader key chording * `MIDI_ENABLE` * MIDI controls * `UNICODE_ENABLE` diff --git a/docs/feature_leader_key.md b/docs/feature_leader_key.md index 92aebd463..9b49e0fd9 100644 --- a/docs/feature_leader_key.md +++ b/docs/feature_leader_key.md @@ -47,3 +47,26 @@ To add support for Leader Key you simply need to add a single line to your keyma ``` LEADER_ENABLE = yes ``` + +## Per Key Timing on Leader keys + +Rather than relying on an incredibly high timeout for long leader key strings or those of us without 200wpm typing skills, we can enable per key timing to ensure that each key pressed provides us with more time to finish our stroke. This is incredibly helpful with leader key emulation of tap dance (read: multiple taps of the same key like C, C, C). + +In order to enable this, place this in your `config.h`: +``` +#define LEADER_PER_KEY_TIMING +``` + +After this, it's recommended that you lower your `LEADER_TIMEOUT` to something less that 300ms. + +``` +#define LEADER_TIMEOUT 250 +``` + +Now, something like this won't seem impossible to do without a 1000MS leader key timeout: + +``` +SEQ_THREE_KEYS(KC_C, KC_C, KC_C) { + SEND_STRING("Per key timing is great!!!"); +} +``` diff --git a/quantum/process_keycode/process_leader.c b/quantum/process_keycode/process_leader.c index eddbf71f7..b32fc1db6 100644 --- a/quantum/process_keycode/process_leader.c +++ b/quantum/process_keycode/process_leader.c @@ -38,9 +38,15 @@ uint8_t leader_sequence_size = 0; bool process_leader(uint16_t keycode, keyrecord_t *record) { // Leader key set-up if (record->event.pressed) { +#ifdef LEADER_PER_KEY_TIMING + leader_time = timer_read(); +#endif if (!leading && keycode == KC_LEAD) { leader_start(); leading = true; +#ifndef LEADER_PER_KEY_TIMING + leader_time = timer_read(); +#endif leader_time = timer_read(); leader_sequence_size = 0; leader_sequence[0] = 0; From 6172e55489b225f874125e801ca4b3d5a956f781 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Sat, 15 Dec 2018 13:39:05 -0800 Subject: [PATCH 711/788] Ergo42: Configurator patch (#4664) Wasn't rendering in Configurator as intended. Updated JSON data to use alias name instead of macro name. --- keyboards/ergo42/info.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/ergo42/info.json b/keyboards/ergo42/info.json index 6489e25a8..cac5a46a1 100644 --- a/keyboards/ergo42/info.json +++ b/keyboards/ergo42/info.json @@ -5,7 +5,7 @@ "width": 15, "height": 4, "layouts": { - "LAYOUT_ortho_4x14": { + "LAYOUT": { "key_count": 56, "layout": [{"label":"L00", "x":0, "y":0}, {"label":"L01", "x":1, "y":0}, {"label":"L02", "x":2, "y":0}, {"label":"L03", "x":3, "y":0}, {"label":"L04", "x":4, "y":0}, {"label":"L05", "x":5, "y":0}, {"label":"L06", "x":6, "y":0}, {"label":"R00", "x":8, "y":0}, {"label":"R01", "x":9, "y":0}, {"label":"R02", "x":10, "y":0}, {"label":"R03", "x":11, "y":0}, {"label":"R04", "x":12, "y":0}, {"label":"R05", "x":13, "y":0}, {"label":"R06", "x":14, "y":0}, {"label":"L10", "x":0, "y":1}, {"label":"L11", "x":1, "y":1}, {"label":"L12", "x":2, "y":1}, {"label":"L13", "x":3, "y":1}, {"label":"L14", "x":4, "y":1}, {"label":"L15", "x":5, "y":1}, {"label":"L16", "x":6, "y":1}, {"label":"R10", "x":8, "y":1}, {"label":"R11", "x":9, "y":1}, {"label":"R12", "x":10, "y":1}, {"label":"R13", "x":11, "y":1}, {"label":"R14", "x":12, "y":1}, {"label":"R15", "x":13, "y":1}, {"label":"R16", "x":14, "y":1}, {"label":"L20", "x":0, "y":2}, {"label":"L21", "x":1, "y":2}, {"label":"L22", "x":2, "y":2}, {"label":"L23", "x":3, "y":2}, {"label":"L24", "x":4, "y":2}, {"label":"L25", "x":5, "y":2}, {"label":"L26", "x":6, "y":2}, {"label":"R20", "x":8, "y":2}, {"label":"R21", "x":9, "y":2}, {"label":"R22", "x":10, "y":2}, {"label":"R23", "x":11, "y":2}, {"label":"R24", "x":12, "y":2}, {"label":"R25", "x":13, "y":2}, {"label":"R26", "x":14, "y":2}, {"label":"L30", "x":0, "y":3}, {"label":"L31", "x":1, "y":3}, {"label":"L32", "x":2, "y":3}, {"label":"L33", "x":3, "y":3}, {"label":"L34", "x":4, "y":3}, {"label":"L35", "x":5, "y":3}, {"label":"L36", "x":6, "y":3}, {"label":"R30", "x":8, "y":3}, {"label":"R31", "x":9, "y":3}, {"label":"R32", "x":10, "y":3}, {"label":"R33", "x":11, "y":3}, {"label":"R34", "x":12, "y":3}, {"label":"R35", "x":13, "y":3}, {"label":"R36", "x":14, "y":3}] } From 5ec327ad9974145e209146825e966aaf4a15d32d Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Sat, 15 Dec 2018 13:39:34 -0800 Subject: [PATCH 712/788] Cospad Configurator and readme update (#4663) * Cospad: Configurator update - added LAYOUT_gamepad_6x4 data - renders as 4 rows by 6 columns visually - fixed LAYOUT_numpad_6x4 data - JSON objects were in the wrong order * Cospad: readme update - markdown formatting fixes - made Hardware Availability address a hyperlink - updated Docs links --- keyboards/cospad/info.json | 77 +++++++++++++++++++++++++++++++------- keyboards/cospad/readme.md | 6 +-- 2 files changed, 67 insertions(+), 16 deletions(-) diff --git a/keyboards/cospad/info.json b/keyboards/cospad/info.json index 4fd2ea087..b34013a47 100644 --- a/keyboards/cospad/info.json +++ b/keyboards/cospad/info.json @@ -1,16 +1,67 @@ { - "keyboard_name": "", - "url": "", - "maintainer": "qmk", - "width": 4, - "height": 6, - "layouts": { - "LAYOUT_numpad_6x4": { - "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"Tab", "x":1, "y":0}, {"label":"Fn", "x":2, "y":0}, {"label":"Back", "x":3, "y":0}, {"label":"Num Lock", "x":0, "y":1}, {"label":"/", "x":1, "y":1}, {"label":"*", "x":2, "y":1}, {"label":"-", "x":3, "y":1}, {"label":"7", "x":0, "y":2}, {"label":"8", "x":1, "y":2}, {"label":"9", "x":2, "y":2}, {"label":"+", "x":3, "y":2, "h":2}, {"label":"4", "x":0, "y":3}, {"label":"5", "x":1, "y":3}, {"label":"6", "x":2, "y":3}, {"label":"1", "x":0, "y":4}, {"label":"2", "x":1, "y":4}, {"label":"3", "x":2, "y":4}, {"label":"Enter", "x":3, "y":4, "h":2}, {"label":"0", "x":0, "y":5, "w":2}, {"label":".", "x":2, "y":5}] - }, + "keyboard_name": "Cospad", + "keyboard_folder": "cospad", + "url": "", + "maintainer": "qmk", + "width": 4, + "height": 6, + "layouts": { + "LAYOUT_numpad_6x4": { + "layout": [ + {"label":"Esc", "x":0, "y":0}, + {"label":"Tab", "x":1, "y":0}, + {"label":"Fn", "x":2, "y":0}, + {"label":"Back", "x":3, "y":0}, + {"label":"Num Lock", "x":0, "y":1}, + {"label":"/", "x":1, "y":1}, + {"label":"*", "x":2, "y":1}, + {"label":"-", "x":3, "y":1}, + {"label":"7", "x":0, "y":2}, + {"label":"8", "x":1, "y":2}, + {"label":"9", "x":2, "y":2}, + {"label":"4", "x":0, "y":3}, + {"label":"5", "x":1, "y":3}, + {"label":"6", "x":2, "y":3}, + {"label":"+", "x":3, "y":2, "h":2}, + {"label":"1", "x":0, "y":4}, + {"label":"2", "x":1, "y":4}, + {"label":"3", "x":2, "y":4}, + {"label":"0", "x":0, "y":5, "w":2}, + {"label":".", "x":2, "y":5}, + {"label":"Enter", "x":3, "y":4, "h":2} + ] + }, - "LAYOUT_ortho_6x4": { - "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"Tab", "x":1, "y":0}, {"label":"Fn", "x":2, "y":0}, {"label":"Back", "x":3, "y":0}, {"label":"Num Lock", "x":0, "y":1}, {"label":"/", "x":1, "y":1}, {"label":"*", "x":2, "y":1}, {"label":"-", "x":3, "y":1}, {"label":"7", "x":0, "y":2}, {"label":"8", "x":1, "y":2}, {"label":"9", "x":2, "y":2}, {"label":"+", "x":3, "y":2}, {"label":"4", "x":0, "y":3}, {"label":"5", "x":1, "y":3}, {"label":"6", "x":2, "y":3}, {"x":3, "y":3}, {"label":"1", "x":0, "y":4}, {"label":"2", "x":1, "y":4}, {"label":"3", "x":2, "y":4}, {"label":"Enter", "x":3, "y":4}, {"label":"0", "x":0, "y":5}, {"x":1, "y":5}, {"label":".", "x":2, "y":5}, {"x":3, "y":5}] - } + "LAYOUT_gamepad_6x4": { + "layout": [ + {"label":"k00", "x":5, "y":0}, + {"label":"k01", "x":5, "y":1}, + {"label":"k02", "x":5, "y":2}, + {"label":"k03", "x":5, "y":3}, + {"label":"k10", "x":4, "y":0}, + {"label":"k11", "x":4, "y":1}, + {"label":"k12", "x":4, "y":2}, + {"label":"k13", "x":4, "y":3}, + {"label":"k20", "x":3, "y":0}, + {"label":"k21", "x":3, "y":1}, + {"label":"k22", "x":3, "y":2}, + {"label":"k30", "x":2, "y":0}, + {"label":"k31", "x":2, "y":1}, + {"label":"k32", "x":2, "y":2}, + {"label":"k23", "x":2, "y":3, "w":2}, + {"label":"k40", "x":1, "y":0}, + {"label":"k41", "x":1, "y":1}, + {"label":"k42", "x":1, "y":2}, + {"label":"k43", "x":1, "y":3}, + {"label":"k50", "x":0, "y":0}, + {"label":"k51", "x":0, "y":1}, + {"label":"k52", "x":0, "y":2}, + {"label":"k53", "x":0, "y":3} + ] + }, + + "LAYOUT_ortho_6x4": { + "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"Tab", "x":1, "y":0}, {"label":"Fn", "x":2, "y":0}, {"label":"Back", "x":3, "y":0}, {"label":"Num Lock", "x":0, "y":1}, {"label":"/", "x":1, "y":1}, {"label":"*", "x":2, "y":1}, {"label":"-", "x":3, "y":1}, {"label":"7", "x":0, "y":2}, {"label":"8", "x":1, "y":2}, {"label":"9", "x":2, "y":2}, {"label":"+", "x":3, "y":2}, {"label":"4", "x":0, "y":3}, {"label":"5", "x":1, "y":3}, {"label":"6", "x":2, "y":3}, {"x":3, "y":3}, {"label":"1", "x":0, "y":4}, {"label":"2", "x":1, "y":4}, {"label":"3", "x":2, "y":4}, {"label":"Enter", "x":3, "y":4}, {"label":"0", "x":0, "y":5}, {"x":1, "y":5}, {"label":".", "x":2, "y":5}, {"x":3, "y":5}] } -} \ No newline at end of file + } +} diff --git a/keyboards/cospad/readme.md b/keyboards/cospad/readme.md index 436b87dce..2e9add691 100644 --- a/keyboards/cospad/readme.md +++ b/keyboards/cospad/readme.md @@ -4,8 +4,8 @@ COSPAD A DIY Keypad Kit sold by KPRepublic, runs TKG natively. Keyboard Maintainer: QMK Community -Hardware Supported: COSPAD -Hardware Availability: https://aliexpress.com/item/cospad-Custom-Mechanical-Keyboard-Kit-up-tp-24-keys-Supports-TKG-TOOLS-Underglow-RGB-PCB-20/32818383873.html +Hardware Supported: COSPAD +Hardware Availability: [KPrepublic on Aliexpress](https://aliexpress.com/item/cospad-Custom-Mechanical-Keyboard-Kit-up-tp-24-keys-Supports-TKG-TOOLS-Underglow-RGB-PCB-20/32818383873.html) Only supports on and off for the backlight leds, as they are not connected to a PWM pin. @@ -18,4 +18,4 @@ Make example for this keyboard (after setting up your build environment): make cospad:default -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. +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). From 398204b2a03bdac68fccb6f7592ed3ea52741ce5 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Sun, 16 Dec 2018 00:40:46 -0800 Subject: [PATCH 713/788] EKeyboard: ErgoInu Configurator fix (#4665) * ErgoInu: Configurator update, part 1 Give each key its own line to make the file easier to debug. * ErgoInu: Configurator update, part 2 - converted all JSON variables to lowercase (this was the bugfix) - converted Tabs to Spaces * ErgoInu: Configurator update, part 3 - break key data into chunks * ErgoInu: Configurator update, part 4 Rebuilt the layout tree into a new file, taking the Y values from the original data. Copied relevant data from original file into the new file, and then overwrote the original file. --- keyboards/ergoinu/info.json | 83 +++++++++++++++++++++++++++++++++---- 1 file changed, 75 insertions(+), 8 deletions(-) diff --git a/keyboards/ergoinu/info.json b/keyboards/ergoinu/info.json index f85447913..81f53fd25 100644 --- a/keyboards/ergoinu/info.json +++ b/keyboards/ergoinu/info.json @@ -2,18 +2,85 @@ "keyboard_name": "Ergoinu", "url": "", "maintainer": "hsgw", - "width": 17, - "height": 6.75, + "width": 18, + "height": 5.4, "layouts": { "LAYOUT": { "key_count": 64, "layout": [ - {"x": 0, "y": 0.6}, {"x": 1, "y": 0.4}, {"x": 2, "y": 0.4}, {"x": 3, "y": 0.25}, {"x": 4, "y": 0}, {"x": 5, "y": 0.25}, {"x": 6, "y": 0.4}, {"x": 10, "y": 0.4}, {"x": 11, "y": 0.25}, {"x": 12, "y": 0}, {"x": 13, "y": 0.25}, {"x": 14, "y": 0.4}, {"x": 15, "y": 0.4}, {"x": 16, "y": 0.6}, - {"x": 0, "y": 1.6}, {"x": 1, "y": 1.4}, {"x": 2, "y": 1.4}, {"x": 3, "y": 1.25}, {"x": 4, "y": 1}, {"x": 5, "y": 1.25}, {"x": 6, "y": 1.4}, {"x": 10, "y": 1.4}, {"x": 11, "y": 1.25}, {"x": 12, "y": 1}, {"x": 13, "y": 1.25}, {"x": 14, "y": 1.4}, {"x": 15, "y": 1.4}, {"x": 16, "y": 1.6}, - {"x": 0.25, "y": 2.6, "W":1.75}, {"x": 2, "y": 2.4}, {"x": 3, "y": 2.25}, {"x": 4, "y": 2}, {"x": 5, "y": 2.25}, {"x": 6, "y": 2.4}, {"x": 10, "y": 2.4}, {"x": 11, "y": 2.25}, {"x": 12, "y": 2}, {"x": 13, "y": 2.25}, {"x": 14, "y": 2.4}, {"x": 15, "y": 2.4}, {"x": 16, "y": 2.6}, - {"x": 0.25, "y": 3.6, "W":1.75}, {"x": 2, "y": 3.4}, {"x": 3, "y": 3.25}, {"x": 4, "y": 3}, {"x": 5, "y": 3.25}, {"x": 6, "y": 3.4}, {"x": 10, "y": 3.4}, {"x": 11, "y": 3.25}, {"x": 12, "y": 3}, {"x": 13, "y": 3.25}, {"x": 14, "y": 3.4}, {"x": 15, "y": 3.4}, {"x": 16, "y": 3.6}, - {"x": 3, "y": 4.25}, {"x": 4, "y": 4}, {"x": 5, "y": 4.25}, {"x": 6, "y": 4.4}, {"X":7.5, "Y":4.4, "H":1.25,"R":30, "RX":6, "RY":4.4}, - {"X":8.25, "Y":4.4, "H":1.25,"R":-30, "RX":11, "RY":4.4}, {"x": 10, "y": 4.4}, {"x": 11, "y": 4.25}, {"x": 12, "y": 4}, {"x": 13, "y": 4.4} + { "x": 0, "y": 0.6, "label": "ESC" }, + { "x": 1, "y": 0.4, "label": "1" }, + { "x": 2, "y": 0.4, "label": "2" }, + { "x": 3, "y": 0.25, "label": "3" }, + { "x": 4, "y": 0, "label": "4" }, + { "x": 5, "y": 0.25, "label": "5" }, + { "x": 6, "y": 0.4, "label": "6" }, + + { "x": 11, "y": 0.4, "label": "7" }, + { "x": 12, "y": 0.25, "label": "8" }, + { "x": 13, "y": 0, "label": "9" }, + { "x": 14, "y": 0.25, "label": "0" }, + { "x": 15, "y": 0.4, "label": "MINUS" }, + { "x": 16, "y": 0.4, "label": "EQUAL" }, + { "x": 17, "y": 0.6, "label": "BACKSLASH" }, + + { "x": 0, "y": 1.6, "label": "DELETE" }, + { "x": 1, "y": 1.4, "label": "TAB" }, + { "x": 2, "y": 1.4, "label": "Q" }, + { "x": 3, "y": 1.25, "label": "W" }, + { "x": 4, "y": 1, "label": "E" }, + { "x": 5, "y": 1.25, "label": "R" }, + { "x": 6, "y": 1.4, "label": "T" }, + + { "x": 11, "y": 1.4, "label": "Y" }, + { "x": 12, "y": 1.25, "label": "U" }, + { "x": 13, "y": 1, "label": "I" }, + { "x": 14, "y": 1.25, "label": "O" }, + { "x": 15, "y": 1.4, "label": "P" }, + { "x": 16, "y": 1.4, "label": "LBRACKET" }, + { "x": 17, "y": 1.6, "label": "RBRACKET" }, + + { "x": 0.25, "y": 2.6, "w": 1.75, "label": "LCTRL" }, + { "x": 2, "y": 2.4, "label": "A" }, + { "x": 3, "y": 2.25, "label": "S" }, + { "x": 4, "y": 2, "label": "D" }, + { "x": 5, "y": 2.25, "label": "F" }, + { "x": 6, "y": 2.4, "label": "G" }, + + { "x": 11, "y": 2.4, "label": "H" }, + { "x": 12, "y": 2.25, "label": "J" }, + { "x": 13, "y": 2, "label": "K" }, + { "x": 14, "y": 2.25, "label": "L" }, + { "x": 15, "y": 2.4, "label": "SEMICOLON" }, + { "x": 16, "y": 2.4, "label": "QUOTE" }, + { "x": 17, "y": 2.6, "label": "GRAVE" }, + + { "x": 0.25, "y": 3.6, "w": 1.75, "label": "LSHIFT" }, + { "x": 2, "y": 3.4, "label": "Z" }, + { "x": 3, "y": 3.25, "label": "X" }, + { "x": 4, "y": 3, "label": "C" }, + { "x": 5, "y": 3.25, "label": "V" }, + { "x": 6, "y": 3.4, "label": "B" }, + + { "x": 11, "y": 3.4, "label": "N" }, + { "x": 12, "y": 3.25, "label": "M" }, + { "x": 13, "y": 3, "label": "COMMA" }, + { "x": 14, "y": 3.25, "label": "DOT" }, + { "x": 15, "y": 3.4, "label": "SLASH" }, + { "x": 16, "y": 3.4, "label": "RSHIFT" }, + { "x": 17, "y": 3.6, "label": "RSHIFT" }, + + { "x": 3, "y": 4.25, "label": "MO(META)" }, + { "x": 4, "y": 4, "label": "LALT" }, + { "x": 5, "y": 4.25, "label": "LGUI" }, + { "x": 6, "y": 4.4, "label": "ENT" }, + { "x": 7, "y": 4.4, "w": 1.5, "label": "SPACE" }, + + { "x": 9.5, "y": 4.4, "w": 1.5, "label": "ENTER" }, + { "x": 11, "y": 4.4, "label": "BACKSPACE" }, + { "x": 12, "y": 4.25, "label": "RGUI" }, + { "x": 13, "y": 4, "label": "RALT" }, + { "x": 14, "y": 4.25, "label": "MO(META)" } ] } } From 20e134e6817f2927dfa146524f84335b0b7cced3 Mon Sep 17 00:00:00 2001 From: Andrew Kannan Date: Tue, 18 Dec 2018 11:26:43 -0500 Subject: [PATCH 714/788] Keyboard: Adding ortho60 to handwired (#4672) * Adding ortho60 to handwired * update to use LAYOUT_ortho_5x12 * Address PR comments about layout macros * Add default layout to info.json for configurator * Hack to xyverz layout until RGB branch is merged * Fix undef RGBDIPIN in xyverz 12x5 layout * Revert change to xvyerz's layout * Fix typo * Fix order * Revert xyverz rules.mk --- .../ortho60/boards/GENERIC_STM32_F103/board.c | 56 ++ .../ortho60/boards/GENERIC_STM32_F103/board.h | 166 ++++++ .../boards/GENERIC_STM32_F103/board.mk | 5 + keyboards/handwired/ortho60/bootloader_defs.h | 10 + keyboards/handwired/ortho60/chconf.h | 524 ++++++++++++++++++ keyboards/handwired/ortho60/config.h | 74 +++ keyboards/handwired/ortho60/halconf.h | 353 ++++++++++++ keyboards/handwired/ortho60/hsv2rgb.c | 80 +++ keyboards/handwired/ortho60/hsv2rgb.h | 23 + keyboards/handwired/ortho60/info.json | 73 +++ .../ortho60/keymaps/default/keymap.c | 98 ++++ keyboards/handwired/ortho60/ld/MKL26Z64.ld | 105 ++++ .../ld/STM32F103x8_stm32duino_bootloader.ld | 88 +++ keyboards/handwired/ortho60/led.c | 51 ++ keyboards/handwired/ortho60/mcuconf.h | 209 +++++++ keyboards/handwired/ortho60/ortho60.c | 32 ++ keyboards/handwired/ortho60/ortho60.h | 33 ++ keyboards/handwired/ortho60/readme.md | 3 + keyboards/handwired/ortho60/rules.mk | 56 ++ keyboards/handwired/ortho60/underglow.c | 157 ++++++ keyboards/handwired/ortho60/underglow.h | 10 + 21 files changed, 2206 insertions(+) create mode 100644 keyboards/handwired/ortho60/boards/GENERIC_STM32_F103/board.c create mode 100644 keyboards/handwired/ortho60/boards/GENERIC_STM32_F103/board.h create mode 100644 keyboards/handwired/ortho60/boards/GENERIC_STM32_F103/board.mk create mode 100644 keyboards/handwired/ortho60/bootloader_defs.h create mode 100644 keyboards/handwired/ortho60/chconf.h create mode 100644 keyboards/handwired/ortho60/config.h create mode 100644 keyboards/handwired/ortho60/halconf.h create mode 100644 keyboards/handwired/ortho60/hsv2rgb.c create mode 100644 keyboards/handwired/ortho60/hsv2rgb.h create mode 100644 keyboards/handwired/ortho60/info.json create mode 100644 keyboards/handwired/ortho60/keymaps/default/keymap.c create mode 100644 keyboards/handwired/ortho60/ld/MKL26Z64.ld create mode 100644 keyboards/handwired/ortho60/ld/STM32F103x8_stm32duino_bootloader.ld create mode 100644 keyboards/handwired/ortho60/led.c create mode 100644 keyboards/handwired/ortho60/mcuconf.h create mode 100644 keyboards/handwired/ortho60/ortho60.c create mode 100644 keyboards/handwired/ortho60/ortho60.h create mode 100644 keyboards/handwired/ortho60/readme.md create mode 100644 keyboards/handwired/ortho60/rules.mk create mode 100644 keyboards/handwired/ortho60/underglow.c create mode 100644 keyboards/handwired/ortho60/underglow.h diff --git a/keyboards/handwired/ortho60/boards/GENERIC_STM32_F103/board.c b/keyboards/handwired/ortho60/boards/GENERIC_STM32_F103/board.c new file mode 100644 index 000000000..8c5a87f35 --- /dev/null +++ b/keyboards/handwired/ortho60/boards/GENERIC_STM32_F103/board.c @@ -0,0 +1,56 @@ +/* + 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. +*/ + +#include "hal.h" + +// Value to place in RTC backup register 10 for persistent bootloader mode +#define RTC_BOOTLOADER_FLAG 0x424C + +/** + * @brief PAL setup. + * @details Digital I/O ports static configuration as defined in @p board.h. + * This variable is used by the HAL when initializing the PAL driver. + */ +#if HAL_USE_PAL || defined(__DOXYGEN__) +const PALConfig pal_default_config = +{ + {VAL_GPIOAODR, VAL_GPIOACRL, VAL_GPIOACRH}, + {VAL_GPIOBODR, VAL_GPIOBCRL, VAL_GPIOBCRH}, + {VAL_GPIOCODR, VAL_GPIOCCRL, VAL_GPIOCCRH}, + {VAL_GPIODODR, VAL_GPIODCRL, VAL_GPIODCRH}, + {VAL_GPIOEODR, VAL_GPIOECRL, VAL_GPIOECRH}, +}; +#endif + +/* + * Early initialization code. + * This initialization must be performed just after stack setup and before + * any other initialization. + */ +void __early_init(void) { + + stm32_clock_init(); +} + +/* + * Board-specific initialization code. + */ +void boardInit(void) { + //JTAG-DP Disabled and SW-DP Enabled + AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE; + //Set backup register DR10 to enter bootloader on reset + BKP->DR10 = RTC_BOOTLOADER_FLAG; +} diff --git a/keyboards/handwired/ortho60/boards/GENERIC_STM32_F103/board.h b/keyboards/handwired/ortho60/boards/GENERIC_STM32_F103/board.h new file mode 100644 index 000000000..9427adabf --- /dev/null +++ b/keyboards/handwired/ortho60/boards/GENERIC_STM32_F103/board.h @@ -0,0 +1,166 @@ +/* + 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 _BOARD_H_ +#define _BOARD_H_ + +/* + * Setup for a Generic STM32F103 board. + */ + +/* + * Board identifier. + */ +#define BOARD_GENERIC_STM32_F103 +#define BOARD_NAME "Generic STM32F103x board" + +/* + * Board frequencies. + */ +#define STM32_LSECLK 32768 +#define STM32_HSECLK 8000000 + +/* + * MCU type, supported types are defined in ./os/hal/platforms/hal_lld.h. + */ +#define STM32F103xB + +/* + * IO pins assignments + */ + +/* on-board */ + +#define GPIOA_LED 8 +#define GPIOD_OSC_IN 0 +#define GPIOD_OSC_OUT 1 + +/* In case your board has a "USB enable" hardware + controlled by a pin, define it here. (It could be just + a 1.5k resistor connected to D+ line.) +*/ +/* +#define GPIOB_USB_DISC 10 +*/ + +/* + * I/O ports initial setup, this configuration is established soon after reset + * in the initialization code. + * + * The digits have the following meaning: + * 0 - Analog input. + * 1 - Push Pull output 10MHz. + * 2 - Push Pull output 2MHz. + * 3 - Push Pull output 50MHz. + * 4 - Digital input. + * 5 - Open Drain output 10MHz. + * 6 - Open Drain output 2MHz. + * 7 - Open Drain output 50MHz. + * 8 - Digital input with PullUp or PullDown resistor depending on ODR. + * 9 - Alternate Push Pull output 10MHz. + * A - Alternate Push Pull output 2MHz. + * B - Alternate Push Pull output 50MHz. + * C - Reserved. + * D - Alternate Open Drain output 10MHz. + * E - Alternate Open Drain output 2MHz. + * F - Alternate Open Drain output 50MHz. + * Please refer to the STM32 Reference Manual for details. + */ + +/* + * Port A setup. + * Everything input with pull-up except: + * PA2 - Alternate output (USART2 TX). + * PA3 - Normal input (USART2 RX). + * PA9 - Alternate output (USART1 TX). + * PA10 - Normal input (USART1 RX). + */ +#define VAL_GPIOACRL 0x88884B88 /* PA7...PA0 */ +#define VAL_GPIOACRH 0x888884B8 /* PA15...PA8 */ +#define VAL_GPIOAODR 0xFFFFFFFF + +/* + * Port B setup. + * Everything input with pull-up except: + * PB10 - Push Pull output (USB switch). + */ +#define VAL_GPIOBCRL 0x88888888 /* PB7...PB0 */ +#define VAL_GPIOBCRH 0x88888388 /* PB15...PB8 */ +#define VAL_GPIOBODR 0xFFFFFFFF + +/* + * Port C setup. + * Everything input with pull-up except: + * PC13 - Push Pull output (LED). + */ +#define VAL_GPIOCCRL 0x88888888 /* PC7...PC0 */ +#define VAL_GPIOCCRH 0x88388888 /* PC15...PC8 */ +#define VAL_GPIOCODR 0xFFFFFFFF + +/* + * Port D setup. + * Everything input with pull-up except: + * PD0 - Normal input (XTAL). + * PD1 - Normal input (XTAL). + */ +#define VAL_GPIODCRL 0x88888844 /* PD7...PD0 */ +#define VAL_GPIODCRH 0x88888888 /* PD15...PD8 */ +#define VAL_GPIODODR 0xFFFFFFFF + +/* + * Port E setup. + * Everything input with pull-up except: + */ +#define VAL_GPIOECRL 0x88888888 /* PE7...PE0 */ +#define VAL_GPIOECRH 0x88888888 /* PE15...PE8 */ +#define VAL_GPIOEODR 0xFFFFFFFF + +/* + * USB bus activation macro, required by the USB driver. + */ +/* The point is that most of the generic STM32F103* boards + have a 1.5k resistor connected on one end to the D+ line + and on the other end to some pin. Or even a slightly more + complicated "USB enable" circuit, controlled by a pin. + That should go here. + + However on some boards (e.g. one that I have), there's no + such hardware. In which case it's better to not do anything. +*/ +/* +#define usb_lld_connect_bus(usbp) palClearPad(GPIOB, GPIOB_USB_DISC) +*/ +#define usb_lld_connect_bus(usbp) palSetPadMode(GPIOA, 12, PAL_MODE_INPUT); + +/* + * USB bus de-activation macro, required by the USB driver. + */ +/* +#define usb_lld_disconnect_bus(usbp) palSetPad(GPIOB, GPIOB_USB_DISC) +*/ +#define usb_lld_disconnect_bus(usbp) palSetPadMode(GPIOA, 12, PAL_MODE_OUTPUT_PUSHPULL); palClearPad(GPIOA, 12); + +#if !defined(_FROM_ASM_) +#ifdef __cplusplus +extern "C" { +#endif + void boardInit(void); +#ifdef __cplusplus +} +#endif +#endif /* _FROM_ASM_ */ + +#endif /* _BOARD_H_ */ diff --git a/keyboards/handwired/ortho60/boards/GENERIC_STM32_F103/board.mk b/keyboards/handwired/ortho60/boards/GENERIC_STM32_F103/board.mk new file mode 100644 index 000000000..6b8b312fd --- /dev/null +++ b/keyboards/handwired/ortho60/boards/GENERIC_STM32_F103/board.mk @@ -0,0 +1,5 @@ +# List of all the board related files. +BOARDSRC = $(BOARD_PATH)/boards/GENERIC_STM32_F103/board.c + +# Required include directories +BOARDINC = $(BOARD_PATH)/boards/GENERIC_STM32_F103 diff --git a/keyboards/handwired/ortho60/bootloader_defs.h b/keyboards/handwired/ortho60/bootloader_defs.h new file mode 100644 index 000000000..0f45203cb --- /dev/null +++ b/keyboards/handwired/ortho60/bootloader_defs.h @@ -0,0 +1,10 @@ +/* Address for jumping to bootloader on STM32 chips. */ +/* It is chip dependent, the correct number can be looked up here (page 175): + * http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf + * This also requires a patch to chibios: + * /tmk_core/tool/chibios/ch-bootloader-jump.patch + */ + +// STM32F103* does NOT have an USB bootloader in ROM (only serial), +// so setting anything here does not make much sense +// #define STM32_BOOTLOADER_ADDRESS 0x1FFFC800 diff --git a/keyboards/handwired/ortho60/chconf.h b/keyboards/handwired/ortho60/chconf.h new file mode 100644 index 000000000..bbd9b2da6 --- /dev/null +++ b/keyboards/handwired/ortho60/chconf.h @@ -0,0 +1,524 @@ +/* + 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. +*/ + +/** + * @file templates/chconf.h + * @brief Configuration file template. + * @details A copy of this file must be placed in each project directory, it + * contains the application specific kernel settings. + * + * @addtogroup config + * @details Kernel related settings and hooks. + * @{ + */ + +#ifndef CHCONF_H +#define CHCONF_H + +#define _CHIBIOS_RT_CONF_ + +/*===========================================================================*/ +/** + * @name System timers settings + * @{ + */ +/*===========================================================================*/ + +/** + * @brief System time counter resolution. + * @note Allowed values are 16 or 32 bits. + */ +#define CH_CFG_ST_RESOLUTION 32 + +/** + * @brief System tick frequency. + * @details Frequency of the system timer that drives the system ticks. This + * setting also defines the system tick time unit. + */ +#define CH_CFG_ST_FREQUENCY 100000 + +/** + * @brief Time delta constant for the tick-less mode. + * @note If this value is zero then the system uses the classic + * periodic tick. This value represents the minimum number + * of ticks that is safe to specify in a timeout directive. + * The value one is not valid, timeouts are rounded up to + * this value. + */ +#define CH_CFG_ST_TIMEDELTA 0 + +/** @} */ + +/*===========================================================================*/ +/** + * @name Kernel parameters and options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Round robin interval. + * @details This constant is the number of system ticks allowed for the + * threads before preemption occurs. Setting this value to zero + * disables the preemption for threads with equal priority and the + * round robin becomes cooperative. Note that higher priority + * threads can still preempt, the kernel is always preemptive. + * @note Disabling the round robin preemption makes the kernel more compact + * and generally faster. + * @note The round robin preemption is not supported in tickless mode and + * must be set to zero in that case. + */ +#define CH_CFG_TIME_QUANTUM 0 + +/** + * @brief Managed RAM size. + * @details Size of the RAM area to be managed by the OS. If set to zero + * then the whole available RAM is used. The core memory is made + * available to the heap allocator and/or can be used directly through + * the simplified core memory allocator. + * + * @note In order to let the OS manage the whole RAM the linker script must + * provide the @p __heap_base__ and @p __heap_end__ symbols. + * @note Requires @p CH_CFG_USE_MEMCORE. + */ +#define CH_CFG_MEMCORE_SIZE 0 + +/** + * @brief Idle thread automatic spawn suppression. + * @details When this option is activated the function @p chSysInit() + * does not spawn the idle thread. The application @p main() + * function becomes the idle thread and must implement an + * infinite loop. + */ +#define CH_CFG_NO_IDLE_THREAD FALSE + +/* Use __WFI in the idle thread for waiting. Does lower the power + * consumption. */ +#define CORTEX_ENABLE_WFI_IDLE TRUE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Performance options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief OS optimization. + * @details If enabled then time efficient rather than space efficient code + * is used when two possible implementations exist. + * + * @note This is not related to the compiler optimization options. + * @note The default is @p TRUE. + */ +#define CH_CFG_OPTIMIZE_SPEED TRUE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Subsystem options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Time Measurement APIs. + * @details If enabled then the time measurement APIs are included in + * the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_TM FALSE + +/** + * @brief Threads registry APIs. + * @details If enabled then the registry APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_REGISTRY TRUE + +/** + * @brief Threads synchronization APIs. + * @details If enabled then the @p chThdWait() function is included in + * the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_WAITEXIT TRUE + +/** + * @brief Semaphores APIs. + * @details If enabled then the Semaphores APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_SEMAPHORES TRUE + +/** + * @brief Semaphores queuing mode. + * @details If enabled then the threads are enqueued on semaphores by + * priority rather than in FIFO order. + * + * @note The default is @p FALSE. Enable this if you have special + * requirements. + * @note Requires @p CH_CFG_USE_SEMAPHORES. + */ +#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE + +/** + * @brief Mutexes APIs. + * @details If enabled then the mutexes APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MUTEXES TRUE + +/** + * @brief Enables recursive behavior on mutexes. + * @note Recursive mutexes are heavier and have an increased + * memory footprint. + * + * @note The default is @p FALSE. + * @note Requires @p CH_CFG_USE_MUTEXES. + */ +#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE + +/** + * @brief Conditional Variables APIs. + * @details If enabled then the conditional variables APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_MUTEXES. + */ +#define CH_CFG_USE_CONDVARS TRUE + +/** + * @brief Conditional Variables APIs with timeout. + * @details If enabled then the conditional variables APIs with timeout + * specification are included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_CONDVARS. + */ +#define CH_CFG_USE_CONDVARS_TIMEOUT FALSE + +/** + * @brief Events Flags APIs. + * @details If enabled then the event flags APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_EVENTS TRUE + +/** + * @brief Events Flags APIs with timeout. + * @details If enabled then the events APIs with timeout specification + * are included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_EVENTS. + */ +#define CH_CFG_USE_EVENTS_TIMEOUT TRUE + +/** + * @brief Synchronous Messages APIs. + * @details If enabled then the synchronous messages APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MESSAGES TRUE + +/** + * @brief Synchronous Messages queuing mode. + * @details If enabled then messages are served by priority rather than in + * FIFO order. + * + * @note The default is @p FALSE. Enable this if you have special + * requirements. + * @note Requires @p CH_CFG_USE_MESSAGES. + */ +#define CH_CFG_USE_MESSAGES_PRIORITY FALSE + +/** + * @brief Mailboxes APIs. + * @details If enabled then the asynchronous messages (mailboxes) APIs are + * included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_SEMAPHORES. + */ +#define CH_CFG_USE_MAILBOXES TRUE + +/** + * @brief Core Memory Manager APIs. + * @details If enabled then the core memory manager APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MEMCORE TRUE + +/** + * @brief Heap Allocator APIs. + * @details If enabled then the memory heap allocator APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or + * @p CH_CFG_USE_SEMAPHORES. + * @note Mutexes are recommended. + */ +#define CH_CFG_USE_HEAP TRUE + +/** + * @brief Memory Pools Allocator APIs. + * @details If enabled then the memory pools allocator APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MEMPOOLS FALSE + +/** + * @brief Dynamic Threads APIs. + * @details If enabled then the dynamic threads creation APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_WAITEXIT. + * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. + */ +#define CH_CFG_USE_DYNAMIC FALSE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Debug options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Debug option, kernel statistics. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_STATISTICS FALSE + +/** + * @brief Debug option, system state check. + * @details If enabled the correct call protocol for system APIs is checked + * at runtime. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_SYSTEM_STATE_CHECK FALSE + +/** + * @brief Debug option, parameters checks. + * @details If enabled then the checks on the API functions input + * parameters are activated. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_ENABLE_CHECKS FALSE + +/** + * @brief Debug option, consistency checks. + * @details If enabled then all the assertions in the kernel code are + * activated. This includes consistency checks inside the kernel, + * runtime anomalies and port-defined checks. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_ENABLE_ASSERTS FALSE + +/** + * @brief Debug option, trace buffer. + * @details If enabled then the trace buffer is activated. + * + * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. + */ +#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_DISABLED + +/** + * @brief Trace buffer entries. + * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is + * different from @p CH_DBG_TRACE_MASK_DISABLED. + */ +#define CH_DBG_TRACE_BUFFER_SIZE 128 + +/** + * @brief Debug option, stack checks. + * @details If enabled then a runtime stack check is performed. + * + * @note The default is @p FALSE. + * @note The stack check is performed in a architecture/port dependent way. + * It may not be implemented or some ports. + * @note The default failure mode is to halt the system with the global + * @p panic_msg variable set to @p NULL. + */ +#define CH_DBG_ENABLE_STACK_CHECK FALSE + +/** + * @brief Debug option, stacks initialization. + * @details If enabled then the threads working area is filled with a byte + * value when a thread is created. This can be useful for the + * runtime measurement of the used stack. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_FILL_THREADS FALSE + +/** + * @brief Debug option, threads profiling. + * @details If enabled then a field is added to the @p thread_t structure that + * counts the system ticks occurred while executing the thread. + * + * @note The default is @p FALSE. + * @note This debug option is not currently compatible with the + * tickless mode. + */ +#define CH_DBG_THREADS_PROFILING FALSE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Kernel hooks + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Threads descriptor structure extension. + * @details User fields added to the end of the @p thread_t structure. + */ +#define CH_CFG_THREAD_EXTRA_FIELDS \ + /* Add threads custom fields here.*/ + +/** + * @brief Threads initialization hook. + * @details User initialization code added to the @p chThdInit() API. + * + * @note It is invoked from within @p chThdInit() and implicitly from all + * the threads creation APIs. + */ +#define CH_CFG_THREAD_INIT_HOOK(tp) { \ + /* Add threads initialization code here.*/ \ +} + +/** + * @brief Threads finalization hook. + * @details User finalization code added to the @p chThdExit() API. + */ +#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ + /* Add threads finalization code here.*/ \ +} + +/** + * @brief Context switch hook. + * @details This hook is invoked just before switching between threads. + */ +#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ + /* Context switch code here.*/ \ +} + +/** + * @brief ISR enter hook. + */ +#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ + /* IRQ prologue code here.*/ \ +} + +/** + * @brief ISR exit hook. + */ +#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ + /* IRQ epilogue code here.*/ \ +} + +/** + * @brief Idle thread enter hook. + * @note This hook is invoked within a critical zone, no OS functions + * should be invoked from here. + * @note This macro can be used to activate a power saving mode. + */ +#define CH_CFG_IDLE_ENTER_HOOK() { \ + /* Idle-enter code here.*/ \ +} + +/** + * @brief Idle thread leave hook. + * @note This hook is invoked within a critical zone, no OS functions + * should be invoked from here. + * @note This macro can be used to deactivate a power saving mode. + */ +#define CH_CFG_IDLE_LEAVE_HOOK() { \ + /* Idle-leave code here.*/ \ +} + +/** + * @brief Idle Loop hook. + * @details This hook is continuously invoked by the idle thread loop. + */ +#define CH_CFG_IDLE_LOOP_HOOK() { \ + /* Idle loop code here.*/ \ +} + +/** + * @brief System tick event hook. + * @details This hook is invoked in the system tick handler immediately + * after processing the virtual timers queue. + */ +#define CH_CFG_SYSTEM_TICK_HOOK() { \ + /* System tick event code here.*/ \ +} + +/** + * @brief System halt hook. + * @details This hook is invoked in case to a system halting error before + * the system is halted. + */ +#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ + /* System halt code here.*/ \ +} + +/** + * @brief Trace hook. + * @details This hook is invoked each time a new record is written in the + * trace buffer. + */ +#define CH_CFG_TRACE_HOOK(tep) { \ + /* Trace code here.*/ \ +} + +/** @} */ + +/*===========================================================================*/ +/* Port-specific settings (override port settings defaulted in chcore.h). */ +/*===========================================================================*/ + +#endif /* CHCONF_H */ + +/** @} */ diff --git a/keyboards/handwired/ortho60/config.h b/keyboards/handwired/ortho60/config.h new file mode 100644 index 000000000..dd06f3f95 --- /dev/null +++ b/keyboards/handwired/ortho60/config.h @@ -0,0 +1,74 @@ +/* +Copyright 2015 Jun Wako + +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 . +*/ + +#pragma once + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6464 +#define DEVICE_VER 0x0001 +/* in python2: list(u"whatever".encode('utf-16-le')) */ +/* at most 32 characters or the ugly hack in usb_main.c borks */ +#define MANUFACTURER QMK +#define PRODUCT Ortho60 +#define DESCRIPTION Ortho60 + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 12 + +#define MATRIX_COL_PINS { B11, B10, B1, B0, A7, A6, A5, A4, A3, A2, A1, A0 } +#define MATRIX_ROW_PINS { B3, B4, B5, B6, B7 } +#define DIODE_DIRECTION COL2ROW + +#define BACKLIGHT_LEVELS 1 + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCE 5 + +/* 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 + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + + + +/* + * 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 diff --git a/keyboards/handwired/ortho60/halconf.h b/keyboards/handwired/ortho60/halconf.h new file mode 100644 index 000000000..5fba285a3 --- /dev/null +++ b/keyboards/handwired/ortho60/halconf.h @@ -0,0 +1,353 @@ +/* + 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. +*/ + +/** + * @file templates/halconf.h + * @brief HAL configuration header. + * @details HAL configuration file, this file allows to enable or disable the + * various device drivers from your application. You may also use + * this file in order to override the device drivers default settings. + * + * @addtogroup HAL_CONF + * @{ + */ + +#ifndef _HALCONF_H_ +#define _HALCONF_H_ + +#include "mcuconf.h" + +/** + * @brief Enables the PAL subsystem. + */ +#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) +#define HAL_USE_PAL TRUE +#endif + +/** + * @brief Enables the ADC subsystem. + */ +#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) +#define HAL_USE_ADC FALSE +#endif + +/** + * @brief Enables the CAN subsystem. + */ +#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) +#define HAL_USE_CAN FALSE +#endif + +/** + * @brief Enables the DAC subsystem. + */ +#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) +#define HAL_USE_DAC FALSE +#endif + +/** + * @brief Enables the EXT subsystem. + */ +#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) +#define HAL_USE_EXT FALSE +#endif + +/** + * @brief Enables the GPT subsystem. + */ +#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) +#define HAL_USE_GPT FALSE +#endif + +/** + * @brief Enables the I2C subsystem. + */ +#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) +#define HAL_USE_I2C FALSE +#endif + +/** + * @brief Enables the I2S subsystem. + */ +#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) +#define HAL_USE_I2S FALSE +#endif + +/** + * @brief Enables the ICU subsystem. + */ +#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) +#define HAL_USE_ICU FALSE +#endif + +/** + * @brief Enables the MAC subsystem. + */ +#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) +#define HAL_USE_MAC FALSE +#endif + +/** + * @brief Enables the MMC_SPI subsystem. + */ +#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) +#define HAL_USE_MMC_SPI FALSE +#endif + +/** + * @brief Enables the PWM subsystem. + */ +#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) +#define HAL_USE_PWM FALSE +#endif + +/** + * @brief Enables the RTC subsystem. + */ +#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) +#define HAL_USE_RTC FALSE +#endif + +/** + * @brief Enables the SDC subsystem. + */ +#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) +#define HAL_USE_SDC FALSE +#endif + +/** + * @brief Enables the SERIAL subsystem. + */ +#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) +#define HAL_USE_SERIAL FALSE +#endif + +/** + * @brief Enables the SERIAL over USB subsystem. + */ +#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) +#define HAL_USE_SERIAL_USB FALSE +#endif + +/** + * @brief Enables the SPI subsystem. + */ +#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) +#define HAL_USE_SPI TRUE +#endif + +/** + * @brief Enables the UART subsystem. + */ +#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) +#define HAL_USE_UART FALSE +#endif + +/** + * @brief Enables the USB subsystem. + */ +#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) +#define HAL_USE_USB TRUE +#endif + +/** + * @brief Enables the WDG subsystem. + */ +#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) +#define HAL_USE_WDG FALSE +#endif + +/*===========================================================================*/ +/* ADC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) +#define ADC_USE_WAIT TRUE +#endif + +/** + * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define ADC_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* CAN driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Sleep mode related APIs inclusion switch. + */ +#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) +#define CAN_USE_SLEEP_MODE TRUE +#endif + +/*===========================================================================*/ +/* I2C driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables the mutual exclusion APIs on the I2C bus. + */ +#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define I2C_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* MAC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables an event sources for incoming packets. + */ +#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) +#define MAC_USE_ZERO_COPY FALSE +#endif + +/** + * @brief Enables an event sources for incoming packets. + */ +#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) +#define MAC_USE_EVENTS TRUE +#endif + +/*===========================================================================*/ +/* MMC_SPI driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Delays insertions. + * @details If enabled this options inserts delays into the MMC waiting + * routines releasing some extra CPU time for the threads with + * lower priority, this may slow down the driver a bit however. + * This option is recommended also if the SPI driver does not + * use a DMA channel and heavily loads the CPU. + */ +#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) +#define MMC_NICE_WAITING TRUE +#endif + +/*===========================================================================*/ +/* SDC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Number of initialization attempts before rejecting the card. + * @note Attempts are performed at 10mS intervals. + */ +#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) +#define SDC_INIT_RETRY 100 +#endif + +/** + * @brief Include support for MMC cards. + * @note MMC support is not yet implemented so this option must be kept + * at @p FALSE. + */ +#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) +#define SDC_MMC_SUPPORT FALSE +#endif + +/** + * @brief Delays insertions. + * @details If enabled this options inserts delays into the MMC waiting + * routines releasing some extra CPU time for the threads with + * lower priority, this may slow down the driver a bit however. + */ +#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) +#define SDC_NICE_WAITING TRUE +#endif + +/*===========================================================================*/ +/* SERIAL driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Default bit rate. + * @details Configuration parameter, this is the baud rate selected for the + * default configuration. + */ +#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) +#define SERIAL_DEFAULT_BITRATE 38400 +#endif + +/** + * @brief Serial buffers size. + * @details Configuration parameter, you can change the depth of the queue + * buffers depending on the requirements of your application. + * @note The default is 64 bytes for both the transmission and receive + * buffers. + */ +#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) +#define SERIAL_BUFFERS_SIZE 16 +#endif + +/*===========================================================================*/ +/* SERIAL_USB driver related setting. */ +/*===========================================================================*/ + +/** + * @brief Serial over USB buffers size. + * @details Configuration parameter, the buffer size must be a multiple of + * the USB data endpoint maximum packet size. + * @note The default is 64 bytes for both the transmission and receive + * buffers. + */ +#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) +#define SERIAL_USB_BUFFERS_SIZE 1 +#endif + +/*===========================================================================*/ +/* SPI driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) +#define SPI_USE_WAIT TRUE +#endif + +/** + * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define SPI_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* USB driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) +#define USB_USE_WAIT TRUE +#endif + +#endif /* _HALCONF_H_ */ + +/** @} */ diff --git a/keyboards/handwired/ortho60/hsv2rgb.c b/keyboards/handwired/ortho60/hsv2rgb.c new file mode 100644 index 000000000..adb7af8fa --- /dev/null +++ b/keyboards/handwired/ortho60/hsv2rgb.c @@ -0,0 +1,80 @@ +/* hsv2rgb.c + * Integer only conversion functions between HSV and RGB + */ + +#include "hsv2rgb.h" + +// TODO fix these buggy macros +#define max(x,y) ((x>y) ? x:y) +#define min(x,y) ((x>y) ? y:x) +#define min3(x,y,z) (min(min(x,y),z)) +#define max3(x,y,z) (max(max(x,y),z)) + + +rgb_color hsv2rgb(hsv_color hsv) +{ + // From : http://qscribble.blogspot.fr/2008/06/integer-conversion-from-hsl-to-rgb.html + int h = hsv.h; + int s = hsv.s; + int v = hsv.v; + rgb_color rgb = {0, 0, 0}; + + if (v == 0) + return rgb; + + // sextant = 0 .. 5 + int sextant = (h*6)/256; + // f = 0 .. 42 + int f = h - (sextant*256)/6; + + int p = (v * (256 - s))/256; + int q = (v * (256*43 - s*f))/(256*43); + int t = (v * (256*43 - s*(43-f)))/(256*43); + + // Corrige les erreurs dues aux arrondis + p = max(min(p, 255), 0); + q = max(min(q, 255), 0); + t = max(min(t, 255), 0); + + switch(sextant){ + case 0: rgb.r = v; rgb.g = t; rgb.b = p; break; + case 1: rgb.r = q; rgb.g = v; rgb.b = p; break; + case 2: rgb.r = p; rgb.g = v; rgb.b = t; break; + case 3: rgb.r = p; rgb.g = q; rgb.b = v; break; + case 4: rgb.r = t; rgb.g = p; rgb.b = v; break; + default:rgb.r = v; rgb.g = p; rgb.b = q; break; + } + return rgb; +} + + +hsv_color rgb2hsv(rgb_color rgb) +{ + // From : http://www.ruinelli.ch/rgb-to-hsv + hsv_color hsv = {0, 0, 0}; + int min, max, delta; + + min = min3(rgb.r, rgb.g, rgb.b); + max = max3(rgb.r, rgb.g, rgb.b); + + if(max==0) { + hsv.h = 0; + hsv.s = 0; + hsv.v = 0; + return hsv; + } + + hsv.v = max; + delta = max - min; + + hsv.s = (delta)*255 / max; + + if(rgb.r == max) + hsv.h = (rgb.g - rgb.b)*42/delta; // between yellow & magenta + else if(rgb.g == max) + hsv.h = 120 + (rgb.b - rgb.r)*42/delta; // between cyan & yellow + else + hsv.h = 240 + (rgb.r - rgb.g)*42/delta; // between magenta & cyan + + return hsv; +} \ No newline at end of file diff --git a/keyboards/handwired/ortho60/hsv2rgb.h b/keyboards/handwired/ortho60/hsv2rgb.h new file mode 100644 index 000000000..99566c32c --- /dev/null +++ b/keyboards/handwired/ortho60/hsv2rgb.h @@ -0,0 +1,23 @@ +/* hsv2rgb.h + * Convert Hue Saturation Value to Red Green Blue + * + * Programme de convertion d'une information HSV en RGB + */ +#ifndef HSV2RGB_H +#define HSV2RGB_H + +typedef struct { + unsigned char h; + unsigned char s; + unsigned char v; +} hsv_color; + +typedef struct { + unsigned char r; + unsigned char g; + unsigned char b; +} rgb_color; + +rgb_color hsv2rgb(hsv_color hsv); + +#endif \ No newline at end of file diff --git a/keyboards/handwired/ortho60/info.json b/keyboards/handwired/ortho60/info.json new file mode 100644 index 000000000..b6e485441 --- /dev/null +++ b/keyboards/handwired/ortho60/info.json @@ -0,0 +1,73 @@ +{ + "keyboard_name": "Ortho60", + "url": "", + "maintainer": "qmk", + "width": 12, + "height": 5, + "layouts": { + "LAYOUT_ortho_5x12": { + "layout": [ + {"label":"`", "x":0, "y":0}, + {"label":"1", "x":1, "y":0}, + {"label":"2", "x":2, "y":0}, + {"label":"3", "x":3, "y":0}, + {"label":"4", "x":4, "y":0}, + {"label":"5", "x":5, "y":0}, + {"label":"6", "x":6, "y":0}, + {"label":"7", "x":7, "y":0}, + {"label":"8", "x":8, "y":0}, + {"label":"9", "x":9, "y":0}, + {"label":"0", "x":10, "y":0}, + {"label":"Backspace", "x":11, "y":0}, + {"label":"Tab", "x":0, "y":1}, + {"label":"Q", "x":1, "y":1}, + {"label":"W", "x":2, "y":1}, + {"label":"E", "x":3, "y":1}, + {"label":"R", "x":4, "y":1}, + {"label":"T", "x":5, "y":1}, + {"label":"Y", "x":6, "y":1}, + {"label":"U", "x":7, "y":1}, + {"label":"I", "x":8, "y":1}, + {"label":"O", "x":9, "y":1}, + {"label":"P", "x":10, "y":1}, + {"label":"Delete", "x":11, "y":1}, + {"label":"Esc", "x":0, "y":2}, + {"label":"A", "x":1, "y":2}, + {"label":"S", "x":2, "y":2}, + {"label":"D", "x":3, "y":2}, + {"label":"F", "x":4, "y":2}, + {"label":"G", "x":5, "y":2}, + {"label":"H", "x":6, "y":2}, + {"label":"J", "x":7, "y":2}, + {"label":"K", "x":8, "y":2}, + {"label":"L", "x":9, "y":2}, + {"label":";", "x":10, "y":2}, + {"label":"'", "x":11, "y":2}, + {"label":"Shift", "x":0, "y":3}, + {"label":"Z", "x":1, "y":3}, + {"label":"X", "x":2, "y":3}, + {"label":"C", "x":3, "y":3}, + {"label":"V", "x":4, "y":3}, + {"label":"B", "x":5, "y":3}, + {"label":"N", "x":6, "y":3}, + {"label":"M", "x":7, "y":3}, + {"label":",", "x":8, "y":3}, + {"label":".", "x":9, "y":3}, + {"label":"/", "x":10, "y":3}, + {"label":"Enter", "x":11, "y":3}, + {"label":"Fn", "x":0, "y":4}, + {"label":"Ctrl", "x":1, "y":4}, + {"label":"Alt", "x":2, "y":4}, + {"label":"Meta", "x":3, "y":4}, + {"label":"Lower", "x":4, "y":4}, + {"label":"Space", "x":5, "y":4}, + {"label":"Space", "x":6, "y":4}, + {"label":"Raise", "x":7, "y":4}, + {"label":"Left", "x":8, "y":4}, + {"label":"Down", "x":9, "y":4}, + {"label":"Right", "x":10, "y":4}, + {"label":"up", "x":11, "y":4} + ] + } + } +} diff --git a/keyboards/handwired/ortho60/keymaps/default/keymap.c b/keyboards/handwired/ortho60/keymaps/default/keymap.c new file mode 100644 index 000000000..8617b6341 --- /dev/null +++ b/keyboards/handwired/ortho60/keymaps/default/keymap.c @@ -0,0 +1,98 @@ +/* +Copyright 2012,2013 Jun Wako + +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 . +*/ +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _BASE 0 +#define _RAISE 1 +#define _LOWER 2 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + LOWER, + RAISE +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_BASE] = LAYOUT_ortho_5x12( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL, \ + KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, \ + BL_TOGG, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT_ortho_5x12( \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),KC_HOME, KC_END, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT_ortho_5x12( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +) +}; diff --git a/keyboards/handwired/ortho60/ld/MKL26Z64.ld b/keyboards/handwired/ortho60/ld/MKL26Z64.ld new file mode 100644 index 000000000..c4ca8b874 --- /dev/null +++ b/keyboards/handwired/ortho60/ld/MKL26Z64.ld @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2013-2016 Fabio Utzig, http://fabioutzig.com + * (C) 2016 flabbergast + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* + * KL26Z64 memory setup. + */ +MEMORY +{ + flash0 : org = 0x00000000, len = 0x100 + flash1 : org = 0x00000400, len = 0x10 + flash2 : org = 0x00000410, len = 62k - 0x410 + flash3 : org = 0x0000F800, len = 2k + flash4 : org = 0x00000000, len = 0 + flash5 : org = 0x00000000, len = 0 + flash6 : org = 0x00000000, len = 0 + flash7 : org = 0x00000000, len = 0 + ram0 : org = 0x1FFFF800, len = 8k + ram1 : org = 0x00000000, len = 0 + ram2 : org = 0x00000000, len = 0 + ram3 : org = 0x00000000, len = 0 + ram4 : org = 0x00000000, len = 0 + ram5 : org = 0x00000000, len = 0 + ram6 : org = 0x00000000, len = 0 + ram7 : org = 0x00000000, len = 0 +} + +/* Flash region for the configuration bytes.*/ +SECTIONS +{ + .cfmprotect : ALIGN(4) SUBALIGN(4) + { + KEEP(*(.cfmconfig)) + } > flash1 +} + +/* For each data/text section two region are defined, a virtual region + and a load region (_LMA suffix).*/ + +/* Flash region to be used for exception vectors.*/ +REGION_ALIAS("VECTORS_FLASH", flash0); +REGION_ALIAS("VECTORS_FLASH_LMA", flash0); + +/* Flash region to be used for constructors and destructors.*/ +REGION_ALIAS("XTORS_FLASH", flash2); +REGION_ALIAS("XTORS_FLASH_LMA", flash2); + +/* Flash region to be used for code text.*/ +REGION_ALIAS("TEXT_FLASH", flash2); +REGION_ALIAS("TEXT_FLASH_LMA", flash2); + +/* Flash region to be used for read only data.*/ +REGION_ALIAS("RODATA_FLASH", flash2); +REGION_ALIAS("RODATA_FLASH_LMA", flash2); + +/* Flash region to be used for various.*/ +REGION_ALIAS("VARIOUS_FLASH", flash2); +REGION_ALIAS("VARIOUS_FLASH_LMA", flash2); + +/* Flash region to be used for RAM(n) initialization data.*/ +REGION_ALIAS("RAM_INIT_FLASH_LMA", flash2); + +/* RAM region to be used for Main stack. This stack accommodates the processing + of all exceptions and interrupts.*/ +REGION_ALIAS("MAIN_STACK_RAM", ram0); + +/* RAM region to be used for the process stack. This is the stack used by + the main() function.*/ +REGION_ALIAS("PROCESS_STACK_RAM", ram0); + +/* RAM region to be used for data segment.*/ +REGION_ALIAS("DATA_RAM", ram0); +REGION_ALIAS("DATA_RAM_LMA", flash2); + +/* RAM region to be used for BSS segment.*/ +REGION_ALIAS("BSS_RAM", ram0); + +/* RAM region to be used for the default heap.*/ +REGION_ALIAS("HEAP_RAM", ram0); + +__eeprom_workarea_start__ = ORIGIN(flash3); +__eeprom_workarea_size__ = LENGTH(flash3); +__eeprom_workarea_end__ = __eeprom_workarea_start__ + __eeprom_workarea_size__; + +/* Generic rules inclusion.*/ +INCLUDE rules.ld diff --git a/keyboards/handwired/ortho60/ld/STM32F103x8_stm32duino_bootloader.ld b/keyboards/handwired/ortho60/ld/STM32F103x8_stm32duino_bootloader.ld new file mode 100644 index 000000000..d0688ef60 --- /dev/null +++ b/keyboards/handwired/ortho60/ld/STM32F103x8_stm32duino_bootloader.ld @@ -0,0 +1,88 @@ +/* + ChibiOS - Copyright (C) 2006..2016 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. +*/ + +/* + * ST32F103xB memory setup for use with the maplemini bootloader. + * You will have to + * #define CORTEX_VTOR_INIT 0x5000 + * in your projects chconf.h + */ +MEMORY +{ + flash0 : org = 0x08002000, len = 64k - 0x2000 + flash1 : org = 0x00000000, len = 0 + flash2 : org = 0x00000000, len = 0 + flash3 : org = 0x00000000, len = 0 + flash4 : org = 0x00000000, len = 0 + flash5 : org = 0x00000000, len = 0 + flash6 : org = 0x00000000, len = 0 + flash7 : org = 0x00000000, len = 0 + ram0 : org = 0x20000000, len = 20k + ram1 : org = 0x00000000, len = 0 + ram2 : org = 0x00000000, len = 0 + ram3 : org = 0x00000000, len = 0 + ram4 : org = 0x00000000, len = 0 + ram5 : org = 0x00000000, len = 0 + ram6 : org = 0x00000000, len = 0 + ram7 : org = 0x00000000, len = 0 +} + +/* For each data/text section two region are defined, a virtual region + and a load region (_LMA suffix).*/ + +/* Flash region to be used for exception vectors.*/ +REGION_ALIAS("VECTORS_FLASH", flash0); +REGION_ALIAS("VECTORS_FLASH_LMA", flash0); + +/* Flash region to be used for constructors and destructors.*/ +REGION_ALIAS("XTORS_FLASH", flash0); +REGION_ALIAS("XTORS_FLASH_LMA", flash0); + +/* Flash region to be used for code text.*/ +REGION_ALIAS("TEXT_FLASH", flash0); +REGION_ALIAS("TEXT_FLASH_LMA", flash0); + +/* Flash region to be used for read only data.*/ +REGION_ALIAS("RODATA_FLASH", flash0); +REGION_ALIAS("RODATA_FLASH_LMA", flash0); + +/* Flash region to be used for various.*/ +REGION_ALIAS("VARIOUS_FLASH", flash0); +REGION_ALIAS("VARIOUS_FLASH_LMA", flash0); + +/* Flash region to be used for RAM(n) initialization data.*/ +REGION_ALIAS("RAM_INIT_FLASH_LMA", flash0); + +/* RAM region to be used for Main stack. This stack accommodates the processing + of all exceptions and interrupts.*/ +REGION_ALIAS("MAIN_STACK_RAM", ram0); + +/* RAM region to be used for the process stack. This is the stack used by + the main() function.*/ +REGION_ALIAS("PROCESS_STACK_RAM", ram0); + +/* RAM region to be used for data segment.*/ +REGION_ALIAS("DATA_RAM", ram0); +REGION_ALIAS("DATA_RAM_LMA", flash0); + +/* RAM region to be used for BSS segment.*/ +REGION_ALIAS("BSS_RAM", ram0); + +/* RAM region to be used for the default heap.*/ +REGION_ALIAS("HEAP_RAM", ram0); + +/* Generic rules inclusion.*/ +INCLUDE rules.ld diff --git a/keyboards/handwired/ortho60/led.c b/keyboards/handwired/ortho60/led.c new file mode 100644 index 000000000..f15baed16 --- /dev/null +++ b/keyboards/handwired/ortho60/led.c @@ -0,0 +1,51 @@ +/* +Copyright 2012 Jun Wako + +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 . +*/ + +#include "hal.h" +#include "backlight.h" +#include "led.h" +#include "printf.h" + +void backlight_init_ports(void) { + printf("backlight_init_ports()\n"); + #ifdef BACKLIGHT_ENABLE + palSetPadMode(GPIOA, 8, PAL_MODE_OUTPUT_PUSHPULL); + palSetPad(GPIOA, 8); + #endif +} + +void backlight_set(uint8_t level) { + printf("backlight_set(%d)\n", level); + #ifdef BACKLIGHT_ENABLE + if (level == 0) { + // Turn backlight off + palSetPad(GPIOA, 8); + } else { + // Turn backlight on + palClearPad(GPIOA, 8); + } + #endif +} + +void led_set(uint8_t usb_led) +{ + if (usb_led & (1</os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES) +MCU_FAMILY = STM32 +MCU_SERIES = STM32F1xx +# linker script to use +# it should exist either in /os/common/ports/ARMCMx/compilers/GCC/ld/ +# or /ld/ +# startup code to use +# is should exist in /os/common/ports/ARMCMx/compilers/GCC/mk/ +MCU_STARTUP = stm32f1xx +# it should exist either in /os/hal/boards/ +# or /boards +# Cortex version +# Teensy LC is cortex-m0; Teensy 3.x are cortex-m4 +MCU = cortex-m3 +# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7 +ARMV = 7 +# If you want to be able to jump to bootloader from firmware on STM32 MCUs, +# set the correct BOOTLOADER_ADDRESS. Either set it here, or define it in +# ./bootloader_defs.h or in ./boards//bootloader_defs.h (if you have +# a custom board definition that you plan to reuse). +# If you're not setting it here, leave it commented out. +# It is chip dependent, the correct number can be looked up here (page 175): +# http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf +# This also requires a patch to chibios: +# /tmk_core/tool/chibios/ch-bootloader-jump.patch +#STM32_BOOTLOADER_ADDRESS = 0x1FFFC800 + + +#BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration +MOUSEKEY_ENABLE = yes # Mouse keys +EXTRAKEY_ENABLE = yes # Audio control and System control +CONSOLE_ENABLE = yes # Console for debug +COMMAND_ENABLE = yes # Commands for debug and configuration +SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover +BACKLIGHT_ENABLE = yes + +LAYOUTS = ortho_5x12 + +DEFAULT_FOLDER = handwired/ortho60 diff --git a/keyboards/handwired/ortho60/underglow.c b/keyboards/handwired/ortho60/underglow.c new file mode 100644 index 000000000..1383af189 --- /dev/null +++ b/keyboards/handwired/ortho60/underglow.c @@ -0,0 +1,157 @@ +#include "ch.h" +#include "hal.h" + +#include "hsv2rgb.h" +#include "underglow.h" + +#define BYTES_FOR_LED_BYTE 4 +#define NB_COLORS 3 +#define BYTES_FOR_LED BYTES_FOR_LED_BYTE*NB_COLORS +#define DATA_SIZE BYTES_FOR_LED*NB_LEDS +#define RESET_SIZE 200 +#define PREAMBLE_SIZE 4 + +// Define the spi your LEDs are plugged to here +#define LEDS_SPI SPID2 +// Define the number of LEDs you wish to control in your LED strip +#define NB_LEDS 8 + +#define LED_SPIRAL 1 + +static uint8_t txbuf[PREAMBLE_SIZE + DATA_SIZE + RESET_SIZE]; +static uint8_t get_protocol_eq(uint8_t data, int pos); + +/* + * This lib is meant to be used asynchronously, thus the colors contained in + * the txbuf will be sent in loop, so that the colors are always the ones you + * put in the table (the user thus have less to worry about) + * + * Since the data are sent via DMA, and the call to spiSend is a blocking one, + * the processor ressources are not used to much, if you see your program being + * too slow, simply add a: + * chThdSleepMilliseconds(x); + * after the spiSend, where you increment x untill you are satisfied with your + * program speed, another trick may be to lower this thread priority : your call + */ +static THD_WORKING_AREA(LEDS_THREAD_WA, 128); +static THD_FUNCTION(ledsThread, arg) { + (void) arg; + while(1){ + spiSend(&LEDS_SPI, PREAMBLE_SIZE + DATA_SIZE + RESET_SIZE, txbuf); + } +} + +#if LED_SPIRAL +/* + * 'Led spiral' is a simple demo in which we put all the leds to the same + * color, where this color does all the hsv circle in loop. + * If you want to launch the thread that will chage the led colors to the + * appropriate value, simply set LED_SPIRAL to 1. + */ +static THD_WORKING_AREA(HSVTRANS_WA, 128); +static THD_FUNCTION(hsv_transThread, arg){ + (void) arg; + hsv_color color = {0, 255, 127}; + while(1){ + color.h += 1; + color.h %= 256; + set_leds_color_hsv(color); + chThdSleepMilliseconds(50); + } +} +#endif + +static const SPIConfig spicfg = { + NULL, + GPIOB, + 15, + SPI_CR1_BR_1|SPI_CR1_BR_0 // baudrate : fpclk / 8 => 1tick is 0.32us +}; + +/* + * Function used to initialize the driver. + * + * Starts by shutting off all the LEDs. + * Then gets access on the LED_SPI driver. + * May eventually launch an animation on the LEDs (e.g. a thread setting the + * txbuff values) + */ +void leds_init(void){ + for(int i = 0; i < RESET_SIZE; i++) + txbuf[DATA_SIZE+i] = 0x00; + for (int i=0; i Date: Wed, 19 Dec 2018 03:28:31 +1100 Subject: [PATCH 715/788] Keyboard: Initial commit of WT8-A implementation (#4674) --- keyboards/wilba_tech/wt8_a/config.h | 115 ++++++++++++++++++ keyboards/wilba_tech/wt8_a/info.json | 13 ++ .../wilba_tech/wt8_a/keymaps/default/keymap.c | 16 +++ keyboards/wilba_tech/wt8_a/readme.md | 15 +++ keyboards/wilba_tech/wt8_a/rules.mk | 68 +++++++++++ keyboards/wilba_tech/wt8_a/wt8_a.c | 17 +++ keyboards/wilba_tech/wt8_a/wt8_a.h | 27 ++++ 7 files changed, 271 insertions(+) create mode 100644 keyboards/wilba_tech/wt8_a/config.h create mode 100644 keyboards/wilba_tech/wt8_a/info.json create mode 100644 keyboards/wilba_tech/wt8_a/keymaps/default/keymap.c create mode 100644 keyboards/wilba_tech/wt8_a/readme.md create mode 100644 keyboards/wilba_tech/wt8_a/rules.mk create mode 100644 keyboards/wilba_tech/wt8_a/wt8_a.c create mode 100644 keyboards/wilba_tech/wt8_a/wt8_a.h diff --git a/keyboards/wilba_tech/wt8_a/config.h b/keyboards/wilba_tech/wt8_a/config.h new file mode 100644 index 000000000..1c8522a1b --- /dev/null +++ b/keyboards/wilba_tech/wt8_a/config.h @@ -0,0 +1,115 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 . + */ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0x6582 // wilba.tech +#define PRODUCT_ID 0x008A // 8-A +#define DEVICE_VER 0x0001 +#define MANUFACTURER wilba.tech +#define PRODUCT wilba.tech WT8-A +#define DESCRIPTION wilba.tech WT8-A + +/* key matrix size */ +#define MATRIX_ROWS 1 +#define MATRIX_COLS 8 + +/* + * 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 { E6 } +#define MATRIX_COL_PINS { F4, F1, B2, B6, F6, F7, D5, B4 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_BREATHING +// #define BACKLIGHT_LEVELS 3 + + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* 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 userful 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 + +// Does not use WT_MONO_BACKLIGHT +// #define WT_MONO_BACKLIGHT + +#define DYNAMIC_KEYMAP_LAYER_COUNT 4 + +// EEPROM usage + +// TODO: refactor with new user EEPROM code (coming soon) +#define EEPROM_MAGIC 0x451F +#define EEPROM_MAGIC_ADDR 32 +// Bump this every time we change what we store +// This will automatically reset the EEPROM with defaults +// and avoid loading invalid data from the EEPROM +#define EEPROM_VERSION 0x08 +#define EEPROM_VERSION_ADDR 34 + +// Dynamic keymap starts after EEPROM version +#define DYNAMIC_KEYMAP_EEPROM_ADDR 35 +// Dynamic macro starts after dynamic keymaps (35+(4*1*8*2)) = (35+64) +#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 99 +#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 925 +#define DYNAMIC_KEYMAP_MACRO_COUNT 16 diff --git a/keyboards/wilba_tech/wt8_a/info.json b/keyboards/wilba_tech/wt8_a/info.json new file mode 100644 index 000000000..c40d44db7 --- /dev/null +++ b/keyboards/wilba_tech/wt8_a/info.json @@ -0,0 +1,13 @@ +{ + "keyboard_name": "wilba.tech WT8-A", + "url": "https://wilba.tech", + "maintainer": "Wilba", + "bootloader": "atmel-dfu", + "width": 4, + "height": 2, + "layouts": { + "LAYOUT": { + "layout": [{"label":"x", "x":0, "y":0}, {"label":"x", "x":1, "y":0}, {"label":"x", "x":2, "y":0}, {"label":"x", "x":3, "y":0}, {"label":"x", "x":0, "y":1}, {"label":"x", "x":1, "y":1}, {"label":"x", "x":2, "y":1}, {"label":"x", "x":3, "y":1}] + } + } +} \ No newline at end of file diff --git a/keyboards/wilba_tech/wt8_a/keymaps/default/keymap.c b/keyboards/wilba_tech/wt8_a/keymaps/default/keymap.c new file mode 100644 index 000000000..a9f40362c --- /dev/null +++ b/keyboards/wilba_tech/wt8_a/keymaps/default/keymap.c @@ -0,0 +1,16 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + LAYOUT( + KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8 ), + + LAYOUT( + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO), + + LAYOUT( + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO), + + LAYOUT( + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO) }; + diff --git a/keyboards/wilba_tech/wt8_a/readme.md b/keyboards/wilba_tech/wt8_a/readme.md new file mode 100644 index 000000000..ab3cfdc55 --- /dev/null +++ b/keyboards/wilba_tech/wt8_a/readme.md @@ -0,0 +1,15 @@ +# WILBA.TECH WT8-A + +![WILBA.TECH WT8-A](https://wilba.tech) + +WT8-A is an 8-key macropad PCB, designed for the Singa Ocelot. [More info at wilba.tech](https://wilba.tech/) + +Keyboard Maintainer: [Wilba6582](https://github.com/Wilba6582) +Hardware Supported: WILBA.TECH WT8-A +Hardware Availability: Singa Keyboards + +Make example for this keyboard (after setting up your build environment): + + make wilba_tech/wt8_a:default + +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). \ No newline at end of file diff --git a/keyboards/wilba_tech/wt8_a/rules.mk b/keyboards/wilba_tech/wt8_a/rules.mk new file mode 100644 index 000000000..f072c6719 --- /dev/null +++ b/keyboards/wilba_tech/wt8_a/rules.mk @@ -0,0 +1,68 @@ +# project specific files +SRC = keyboards/wilba_tech/wt_main.c + +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section +BOOTLOADER = atmel-dfu + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = yes # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches + +RAW_ENABLE = yes +DYNAMIC_KEYMAP_ENABLE = yes \ No newline at end of file diff --git a/keyboards/wilba_tech/wt8_a/wt8_a.c b/keyboards/wilba_tech/wt8_a/wt8_a.c new file mode 100644 index 000000000..ccff6d62c --- /dev/null +++ b/keyboards/wilba_tech/wt8_a/wt8_a.c @@ -0,0 +1,17 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 . + */ + +// Nothing to see here, move along... ;-) diff --git a/keyboards/wilba_tech/wt8_a/wt8_a.h b/keyboards/wilba_tech/wt8_a/wt8_a.h new file mode 100644 index 000000000..0fb754f0a --- /dev/null +++ b/keyboards/wilba_tech/wt8_a/wt8_a.h @@ -0,0 +1,27 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 . + */ + +#pragma once + +#include "quantum.h" + +#define ____ KC_NO + +#define LAYOUT( \ + K00, K01, K02, K03, K04, K05, K06, K07 ) \ + { \ + {K00, K01, K02, K03, K04, K05, K06, K07 }, \ + } From 9eedaa88022f2e221ef3443ed35935e163b9ac95 Mon Sep 17 00:00:00 2001 From: Takeshi ISHII <2170248+mtei@users.noreply.github.com> Date: Wed, 19 Dec 2018 01:29:20 +0900 Subject: [PATCH 716/788] Keymap: Changed to use LAYOUT_kc() macro instead of LAYOUT() macro for easy maintenance. (#4676) --- .../helix/rev2/keymaps/five_rows/keymap.c | 172 +++++++++--------- 1 file changed, 83 insertions(+), 89 deletions(-) diff --git a/keyboards/helix/rev2/keymaps/five_rows/keymap.c b/keyboards/helix/rev2/keymaps/five_rows/keymap.c index e293f5900..7b7d573d6 100644 --- a/keyboards/helix/rev2/keymaps/five_rows/keymap.c +++ b/keyboards/helix/rev2/keymaps/five_rows/keymap.c @@ -47,22 +47,25 @@ enum custom_keycodes { DVORAK, EUCALYN, KEYPAD, - EISU, - KANA, - ZERO2, + KC_xEISU, + KC_xKANA, + KC_ZERO2, RGBRST }; -enum macro_keycodes { - KC_SAMPLEMACRO, -}; - - -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO //Macros -#define M_SAMPLE M(KC_SAMPLEMACRO) +#define KC_LOWER MO(_LOWER) +#define KC_RABS LT(_RAISE,KC_BSPC) +#define KC_RAEN LT(_RAISE,KC_ENT) +#define KC_FF12 LT(_PADFUNC,KC_F12) +#define KC_____ _______ +#define KC_XXXX XXXXXXX +#define KC_ADJ MO(_ADJUST) +#define KC_LSMI LSFT(KC_MINS) +#define KC_LSEQ LSFT(KC_EQL) +#define KC_LSRB LSFT(KC_RBRC) +#define KC_LSLB LSFT(KC_LBRC) +#define ___ _______ #if HELIX_ROWS == 5 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { @@ -80,13 +83,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |Lower | Lower| Caps | Alt | GUI | Space| BS | Enter| Space| GUI | Alt | Menu |Lower |Lower | * `-------------------------------------------------------------------------------------------------' */ - [_QWERTY] = LAYOUT( \ - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, \ - KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_RCTL, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_GRV, KC_QUOT, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \ - MO(_LOWER),MO(_LOWER), KC_CAPS, KC_LALT, KC_LGUI, KC_SPC, LT(_RAISE,KC_BSPC), \ - LT(_RAISE,KC_ENT), KC_SPC, KC_RGUI, KC_RALT, KC_APP,MO(_LOWER),MO(_LOWER) \ + [_QWERTY] = LAYOUT_kc( \ + ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, BSPC, \ + TAB, Q, W, E, R, T, Y, U, I, O, P, BSLS, \ + LCTL, A, S, D, F, G, H, J, K, L, SCLN, RCTL, \ + LSFT, Z, X, C, V, B, GRV, QUOT, N, M, COMM, DOT, SLSH, RSFT, \ + LOWER, LOWER, CAPS, LALT, LGUI, SPC, RABS, RAEN, SPC, RGUI, RALT, APP,LOWER, LOWER \ ), /* Colemak @@ -102,13 +104,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |Lower | Lower| Caps | Alt | GUI | Space| BS | Enter| Space| GUI | Alt | Menu |Lower |Lower | * `-------------------------------------------------------------------------------------------------' */ - [_COLEMAK] = LAYOUT( \ - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ - KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSLS, \ - KC_LCTL, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_RCTL, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_GRV, KC_QUOT, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \ - MO(_LOWER),MO(_LOWER), KC_CAPS, KC_LALT, KC_LGUI, KC_SPC, LT(_RAISE,KC_BSPC), \ - LT(_RAISE,KC_ENT), KC_SPC, KC_RGUI, KC_RALT, KC_APP,MO(_LOWER),MO(_LOWER) \ + [_COLEMAK] = LAYOUT_kc( \ + ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, BSPC, \ + TAB, Q, W, F, P, G, J, L, U, Y, SCLN, BSLS, \ + LCTL, A, R, S, T, D, H, N, E, I, O, RCTL, \ + LSFT, Z, X, C, V, B, GRV, QUOT, K, M, COMM, DOT, SLSH, RSFT, \ + LOWER, LOWER, CAPS, LALT, LGUI, SPC, RABS, RAEN, SPC, RGUI, RALT, APP,LOWER, LOWER \ ), /* Dvorak @@ -124,13 +125,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |Lower | Lower| Caps | Alt | GUI | Space| BS | Enter| Space| GUI | Alt | Menu |Lower |Lower | * `-------------------------------------------------------------------------------------------------' */ - [_DVORAK] = LAYOUT( \ - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ - KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSLS, \ - KC_LCTL, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_RCTL, \ - KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_GRV, KC_SLSH, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, \ - MO(_LOWER),MO(_LOWER), KC_CAPS, KC_LALT, KC_LGUI, KC_SPC, LT(_RAISE,KC_BSPC), \ - LT(_RAISE,KC_ENT), KC_SPC, KC_RGUI, KC_RALT, KC_APP,MO(_LOWER),MO(_LOWER) \ + [_DVORAK] = LAYOUT_kc( \ + ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, BSPC, \ + TAB, QUOT, COMM, DOT, P, Y, F, G, C, R, L, BSLS, \ + LCTL, A, O, E, U, I, D, H, T, N, S, RCTL, \ + LSFT, SCLN, Q, J, K, X, GRV, SLSH, B, M, W, V, Z, RSFT, \ + LOWER, LOWER, CAPS, LALT, LGUI, SPC, RABS, RAEN, SPC, RGUI, RALT, APP,LOWER, LOWER \ ), /* Eucalyn (http://eucalyn.hatenadiary.jp/entry/about-eucalyn-layout) @@ -146,13 +146,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |Lower | Lower| Caps | Alt | GUI | Space| BS | Enter| Space| GUI | Alt | Menu |Lower |Lower | * `-------------------------------------------------------------------------------------------------' */ - [_EUCALYN] = LAYOUT( \ - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ - KC_TAB, KC_Q, KC_W, KC_COMM, KC_DOT, KC_SCLN, KC_M, KC_R, KC_D, KC_Y, KC_P, KC_BSLS, \ - KC_LCTL, KC_A, KC_O, KC_E, KC_I, KC_U, KC_G, KC_T, KC_K, KC_S, KC_N, KC_RCTL, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_F, KC_GRV, KC_QUOT, KC_B, KC_H, KC_J, KC_L, KC_SLSH, KC_RSFT, \ - MO(_LOWER),MO(_LOWER), KC_CAPS, KC_LALT, KC_LGUI, KC_SPC, LT(_RAISE,KC_BSPC), \ - LT(_RAISE,KC_ENT), KC_SPC, KC_RGUI, KC_RALT, KC_APP,MO(_LOWER),MO(_LOWER) \ + [_EUCALYN] = LAYOUT_kc( \ + ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, BSPC, \ + TAB, Q, W, COMM, DOT, SCLN, M, R, D, Y, P, BSLS, \ + LCTL, A, O, E, I, U, G, T, K, S, N, RCTL, \ + LSFT, Z, X, C, V, F, GRV, QUOT, B, H, J, L, SLSH, RSFT, \ + LOWER, LOWER, CAPS, LALT, LGUI, SPC, RABS, RAEN, SPC, RGUI, RALT, APP,LOWER, LOWER \ ), /* Keypad @@ -168,13 +167,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | 0 | , | . | Enter| F5 | F10 | F12 | F12 | F5 | F10 | Enter| 0 | , | . | * `-------------------------------------------------------------------------------------------------' */ - [_KEYPAD] = LAYOUT( \ - KC_TAB, KC_PSLS, KC_PAST, KC_DEL, KC_F1, KC_F6, KC_F1, KC_F6, KC_DEL, KC_TAB, KC_PSLS, KC_PAST, \ - KC_KP_7, KC_KP_8, KC_KP_9, KC_BSPC, KC_F2, KC_F7, KC_F2, KC_F7, KC_BSPC, KC_KP_7, KC_KP_8, KC_KP_9, \ - KC_KP_4, KC_KP_5, KC_KP_6, KC_PMNS, KC_F3, KC_F8, KC_F3, KC_F8, KC_PMNS, KC_KP_4, KC_KP_5, KC_KP_6, \ - KC_KP_1, KC_KP_2, KC_KP_3, KC_PPLS, KC_F4, KC_F9, KC_F11, KC_F11, KC_F4, KC_F9, KC_PPLS, KC_KP_1, KC_KP_2, KC_KP_3, \ - KC_KP_0, KC_COMM, KC_PDOT, KC_PENT, KC_F5, KC_F10, LT(_PADFUNC,KC_F12), - LT(_PADFUNC,KC_F12),KC_F5, KC_F10, KC_PENT, KC_KP_0, KC_COMM, KC_PDOT \ + [_KEYPAD] = LAYOUT_kc( \ + TAB, PSLS, PAST, DEL, F1, F6, F1, F6, DEL, TAB, PSLS, PAST, \ + KP_7, KP_8, KP_9, BSPC, F2, F7, F2, F7, BSPC, KP_7, KP_8, KP_9, \ + KP_4, KP_5, KP_6, PMNS, F3, F8, F3, F8, PMNS, KP_4, KP_5, KP_6, \ + KP_1, KP_2, KP_3, PPLS, F4, F9, F11, F11, F4, F9, PPLS, KP_1, KP_2, KP_3, \ + KP_0, COMM, PDOT, PENT, F5, F10, FF12, FF12, F5, F10, PENT, KP_0, COMM, PDOT \ ), /* AUX modifier key layer @@ -190,12 +188,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | 00 | | | | | | | | | | | 00 | | * `-------------------------------------------------------------------------------------------------' */ - [_KAUX] = LAYOUT( \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ - _______, ZERO2, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ZERO2, _______ \ + [_KAUX] = LAYOUT_kc( \ + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + ____,ZERO2, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ZERO2,____ \ ), /* Keypad function layer @@ -211,13 +209,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | | | | | | * `-------------------------------------------------------------------------------------------------' */ - [_PADFUNC] = LAYOUT( \ - XXXXXXX, XXXXXXX, XXXXXXX, KC_PAUS, KC_SLCK, KC_PSCR, KC_PSCR, KC_SLCK, KC_PAUS, XXXXXXX, XXXXXXX, XXXXXXX, \ - XXXXXXX, XXXXXXX, XXXXXXX, KC_HOME, KC_UP, KC_PGUP, KC_PGUP, KC_UP, KC_HOME, XXXXXXX, XXXXXXX, XXXXXXX, \ - XXXXXXX, KC_DEL, KC_INS, KC_LEFT, KC_DOWN, KC_RGHT, KC_LEFT, KC_DOWN, KC_RGHT, KC_INS, KC_DEL, XXXXXXX, \ - XXXXXXX, XXXXXXX, XXXXXXX, KC_END, XXXXXXX, KC_PGDN,MO(_ADJUST), - MO(_ADJUST), KC_PGDN, XXXXXXX, KC_END, XXXXXXX, XXXXXXX, XXXXXXX, \ - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX \ + [_PADFUNC] = LAYOUT_kc( \ + XXXX, XXXX, XXXX, PAUS, SLCK, PSCR, PSCR, SLCK, PAUS, XXXX, XXXX, XXXX, \ + XXXX, XXXX, XXXX, HOME, UP, PGUP, PGUP, UP, HOME, XXXX, XXXX, XXXX, \ + XXXX, DEL, INS, LEFT, DOWN, RGHT, LEFT, DOWN, RGHT, INS, DEL, XXXX, \ + XXXX, XXXX, XXXX, END, XXXX, PGDN, ADJ, ADJ, PGDN, XXXX, END, XXXX, XXXX, XXXX, \ + XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, ____, ____, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX \ ), /* Lower @@ -233,13 +230,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | PrtSc| | | | | | | | | PrtSc| | | * `-------------------------------------------------------------------------------------------------' */ - [_LOWER] = LAYOUT( \ - XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, \ - XXXXXXX, XXXXXXX, KC_PAUS, KC_SLCK, KC_INS, XXXXXXX, XXXXXXX, KC_INS, KC_SLCK, KC_PAUS, XXXXXXX, KC_F12, \ - _______, KC_HOME, XXXXXXX, KC_UP, KC_DEL, KC_PGUP, KC_PGUP, KC_DEL, KC_UP, XXXXXXX, KC_HOME, _______, \ - _______, KC_END, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, XXXXXXX, XXXXXXX,KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, _______, \ - _______, _______, KC_PSCR, _______, _______, _______, MO(_ADJUST), - MO(_ADJUST), _______, _______, _______, KC_PSCR, _______, _______ \ + [_LOWER] = LAYOUT_kc( \ + XXXX, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, \ + XXXX, XXXX, PAUS, SLCK, INS, XXXX, XXXX, INS, SLCK, PAUS, XXXX, F12, \ + ____, HOME, XXXX, UP, DEL, PGUP, PGUP, DEL, UP, XXXX, HOME, ____, \ + ____, END, LEFT, DOWN, RGHT, PGDN, XXXX, XXXX, PGDN, LEFT, DOWN, RGHT, END, ____, \ + ____, ____, PSCR, ____, ____, ____, ADJ, ADJ, ____, ____, ____, PSCR, ____, ____ \ ), /* Raise @@ -255,13 +251,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | | | | | | * `-------------------------------------------------------------------------------------------------' */ - [_RAISE] = LAYOUT( \ - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, LSFT(KC_MINS), KC_MINS, KC_EQL, LSFT(KC_EQL), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ - _______, XXXXXXX, XXXXXXX, XXXXXXX, LSFT(KC_LBRC), KC_LBRC, KC_RBRC, LSFT(KC_RBRC), XXXXXXX, XXXXXXX, XXXXXXX, _______, \ - _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, EISU, EISU, KANA, KANA, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, _______, \ - MO(_ADJUST),MO(_ADJUST),XXXXXXX, _______, _______, XXXXXXX, _______, - _______, XXXXXXX, _______, _______, XXXXXXX,MO(_ADJUST),MO(_ADJUST) \ + [_RAISE] = LAYOUT_kc( \ + XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, \ + XXXX, XXXX, XXXX, XXXX, LSMI, MINS, EQL, LSEQ, XXXX, XXXX, XXXX, XXXX, \ + ____, XXXX, XXXX, XXXX, LSLB, LBRC, RBRC, LSRB, XXXX, XXXX, XXXX, ____, \ + ____, XXXX, XXXX, XXXX, XXXX,xEISU,xEISU, xKANA,xKANA,MNXT, VOLD, VOLU, MPLY, ____, \ + ADJ, ADJ, XXXX, ____, ____, XXXX, ____, ____, XXXX, ____, ____, XXXX, ADJ, ADJ \ ), /* Adjust (Lower + Raise) @@ -278,11 +273,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-------------------------------------------------------------------------------------------------' */ [_ADJUST] = LAYOUT( \ - XXXXXXX, KEYPAD, DVORAK, COLEMAK, EUCALYN, QWERTY, QWERTY, EUCALYN, COLEMAK, DVORAK, KEYPAD, XXXXXXX, \ - XXXXXXX, RESET, RGBRST, RGB_TOG, AU_ON, AG_SWAP, AG_SWAP, AU_ON, RGB_TOG, RGBRST, XXXXXXX, XXXXXXX, \ - RGB_HUI, RGB_SAI, RGB_VAI, RGB_MOD, AU_OFF, AG_NORM, AG_NORM, AU_OFF, RGB_MOD, RGB_VAI, RGB_SAI, RGB_HUI, \ - RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, RGB_VAD, RGB_SAD, RGB_HUD, \ - _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______ \ + XXXXXXX, KEYPAD, DVORAK, COLEMAK, EUCALYN, QWERTY, QWERTY, EUCALYN, COLEMAK, DVORAK, KEYPAD, XXXXXXX, \ + XXXXXXX, RESET, RGBRST, RGB_TOG, AU_ON, AG_SWAP, AG_SWAP, AU_ON, RGB_TOG, RGBRST, XXXXXXX, XXXXXXX, \ + RGB_HUI, RGB_SAI, RGB_VAI, RGB_MOD, AU_OFF, AG_NORM, AG_NORM, AU_OFF, RGB_MOD, RGB_VAI, RGB_SAI, RGB_HUI, \ + RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, ___,___, XXXXXXX, XXXXXXX, XXXXXXX, RGB_VAD, RGB_SAD, RGB_HUD, \ + _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, ___,___, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______ \ ), /* AUX modifier key layer @@ -298,13 +293,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | BS | Enter| | | | | | | | * `-------------------------------------------------------------------------------------------------' */ - [_AUX] = LAYOUT( \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ - _______, _______, _______, _______, _______, KC_BSPC, LT(_RAISE,KC_ENT), \ - _______, _______, _______, _______, _______, _______, _______ \ + [_AUX] = LAYOUT_kc( \ + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + ____, ____, ____, ____, ____, BSPC, RAEN, ____, ____, ____, ____, ____, ____, ____ \ ) }; @@ -400,13 +394,13 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } return false; break; - case ZERO2: + case KC_ZERO2: if (record->event.pressed) { SEND_STRING("00"); } return false; break; - case EISU: + case KC_xEISU: if (record->event.pressed) { if(keymap_config.swap_lalt_lgui==false){ register_code(KC_LANG2); @@ -418,7 +412,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } return false; break; - case KANA: + case KC_xKANA: if (record->event.pressed) { if(keymap_config.swap_lalt_lgui==false){ register_code(KC_LANG1); From e59f331268e28657954bdc7aa2f2eab09796610b Mon Sep 17 00:00:00 2001 From: Matthew Lyon Date: Tue, 18 Dec 2018 08:37:04 -0800 Subject: [PATCH 717/788] Keymap: @mattly's planck layout (#4678) --- keyboards/planck/keymaps/mattly/config.h | 43 ++++++ keyboards/planck/keymaps/mattly/keymap.c | 176 ++++++++++++++++++++++ keyboards/planck/keymaps/mattly/readme.md | 28 ++++ keyboards/planck/keymaps/mattly/rules.mk | 2 + 4 files changed, 249 insertions(+) create mode 100644 keyboards/planck/keymaps/mattly/config.h create mode 100644 keyboards/planck/keymaps/mattly/keymap.c create mode 100644 keyboards/planck/keymaps/mattly/readme.md create mode 100644 keyboards/planck/keymaps/mattly/rules.mk diff --git a/keyboards/planck/keymaps/mattly/config.h b/keyboards/planck/keymaps/mattly/config.h new file mode 100644 index 000000000..52e39ec7f --- /dev/null +++ b/keyboards/planck/keymaps/mattly/config.h @@ -0,0 +1,43 @@ +#pragma once + +#ifdef AUDIO_ENABLE + #define STARTUP_SONG SONG(PLANCK_SOUND) + // #define STARTUP_SONG SONG(NO_SOUND) + + #define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \ + SONG(COLEMAK_SOUND), \ + SONG(DVORAK_SOUND) \ + } +#endif + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ + +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + +// Most tactile encoders have detents every 4 stages +#define ENCODER_RESOLUTION 4 + +#define IGNORE_MOD_TAP_INTERRUPT +#define PERMISSIVE_HOLD +#define TAPPING_TOGGLE 2 +#define TAPPING_TERM 200 diff --git a/keyboards/planck/keymaps/mattly/keymap.c b/keyboards/planck/keymaps/mattly/keymap.c new file mode 100644 index 000000000..2495f8a19 --- /dev/null +++ b/keyboards/planck/keymaps/mattly/keymap.c @@ -0,0 +1,176 @@ +/* Copyright 2015-2017 Jack Humbert + * + * 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 . + */ + +#include QMK_KEYBOARD_H +#include "muse.h" + +extern keymap_config_t keymap_config; + +enum planck_layers { + _QWERTY, + _NUMBER, + _SYMBOL, + _FUNC, + _ADJUST +}; + +enum planck_keycodes { + QWERTY = SAFE_RANGE +}; + +#define SPC_SHF MT(MOD_LSFT, KC_SPC) + +#define ENT_FUN LT(_FUNC, KC_ENT) +#define ESC_FUN LT(_FUNC, KC_ESC) +#define TAB_NUM LT(_NUMBER, KC_TAB) +#define BSP_SYM LT(_SYMBOL, KC_BSPC) +#define DEL_ADJ LT(_ADJUST, KC_DEL) + +#define SYMLOCK TG(_SYMBOL) +#define NUMLOCK TG(_NUMBER) + +#define ONE_CTL OSM(MOD_LCTL) +#define ONE_ALT OSM(MOD_LALT) +#define ONE_GUI OSM(MOD_LGUI) +#define ONE_HYP OSM(MOD_HYPR) +#define ONE_MEH OSM(MOD_MEH) +#define ONE_WRP OSM(MOD_LCTL | MOD_LALT | MOD_LGUI) + +#define A_CTRL MT(MOD_LCTL, KC_A) +#define S_ALT MT(MOD_LALT, KC_S) +#define D_GUI MT(MOD_LGUI, KC_D) +#define F_SHFT MT(MOD_LSFT, KC_F) +#define G_NUM LT(_NUMBER, KC_G) +#define H_NAV LT(_SYMBOL, KC_H) +#define J_SHFT MT(MOD_RSFT, KC_J) +#define K_GUI MT(MOD_RGUI, KC_K) +#define L_ALT MT(MOD_RALT, KC_L) +#define MINSCTL MT(MOD_RCTL, KC_MINS) +#define SCL_CTL MT(MOD_RCTL, KC_SCLN) + +#define BWORD LALT(KC_LEFT) +#define FWORD LALT(KC_RIGHT) + +#define NWIN LGUI(KC_GRV) +#define PWIN LGUI(LSFT(KC_GRV)) +#define NTAB LGUI(LSFT(KC_RBRC)) +#define PTAB LGUI(LSFT(KC_LBRC)) + +#define XMSNCTL HYPR(KC_F14) +#define XDSKTOP HYPR(KC_F15) +#define XNXTSPC HYPR(KC_F16) +#define XPRVSPC HYPR(KC_F17) +#define XNOTIFY HYPR(KC_F18) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Querty + | # | q | w | e | r | t | y | u | i | o | p | - | + | | | | | | | | | | | | | + |------|------|------|------|------|------|------|------|------|------|------|------| + | ( | a | s | d | f | g | h | j | k | l | ; | ' | + | | CTRL | ALT | GUI | SHIFT| NUMBR| SYMBL| SHIFT| GUI | ALT | CTRL | | + |------|------|------|------|------|------|------|------|------|------|------|------| + | [ | z | x | c | v | b | n | m | , | . | / | > | + | | | | | | | | | | | | | + |------|------|------|------|------|------|------|------|------|------|------|------| + | ctrl | alt | gui | Esc | Tab | space | Bksp | Del | hyper| meh | warp | + | | | | FUNC |NUMBER| SHIFT |SYMBOL| | | | | + */ + [_QWERTY] = LAYOUT_planck_grid( + KC_HASH, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_SCLN, + KC_LPRN, A_CTRL, S_ALT, D_GUI, F_SHFT, G_NUM, H_NAV, J_SHFT, K_GUI, L_ALT, MINSCTL, KC_QUOT, + KC_LBRC, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RABK, + KC_CAPS, ONE_ALT, ONE_GUI, ESC_FUN, TAB_NUM, SPC_SHF, SPC_SHF, BSP_SYM, DEL_ADJ, ONE_HYP, ONE_MEH, ONE_WRP + ), + +/* Symbol + | | & | ` | ~ | [ | ] | < | > | + | | | | - | + | | $ | % | = | ( | ) | | : | ! | @ | * | ' | + | | | ^ | # | { | } | | " | | | \ | | | + | | | | | LOCK | | .... | | | | | + */ + [_SYMBOL] = LAYOUT_planck_grid( + _______, KC_AMPR, KC_GRV, KC_TILD, KC_LBRC, KC_RBRC, KC_LABK, KC_RABK, KC_PLUS, KC_ASTR, XXXXXXX, _______, + _______, KC_DLR, KC_PERC, KC_EQL, KC_LPRN, KC_RPRN, KC_SCLN, KC_COLN, KC_EXLM, KC_AT, KC_ASTR, _______, + _______, XXXXXXX, KC_CIRC, KC_HASH, KC_LCBR, KC_RCBR, KC_QUOT, KC_DQUO, KC_PIPE, KC_BSLS, XXXXXXX, _______, + _______, _______, _______, _______, SYMLOCK, _______, _______, _______, _______, _______, _______, _______ + ), +/* Number + | | |<-word| up |word->| PgUp | . | 7 | 8 | 9 | + | * | + | | Enter| left | down | right| PgDn | 0 | 4 | 5 | 6 | - | / | + | | Bksp | Home | tab | End | Del | , | 1 | 2 | 3 | = | % | + | | | | | .... | | LOCK | | : | $ | | + */ +[_NUMBER] = LAYOUT_planck_grid( + XXXXXXX, _______, BWORD, KC_UP, FWORD, KC_PGUP, KC_DOT, KC_7, KC_8, KC_9, KC_PLUS, KC_ASTR, + XXXXXXX, KC_ENT , KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_0, KC_4, KC_5, KC_6, KC_MINS, KC_SLSH, + XXXXXXX, KC_BSPC, KC_HOME, KC_TAB, KC_END, KC_DEL, KC_COMM, KC_1, KC_2, KC_3, KC_EQL, KC_PERC, + _______, _______, _______, _______, _______, _______, _______, NUMLOCK, _______, KC_COLN, KC_DLR, _______ +), +/* Function + * | | Mctl | Pspc | Nwin | Nspc | Desk | | F7 | F8 | F9 | F10 | F13 | + * | | Nctr | Ptab | Pwin | Ntab | | | F4 | F5 | F6 | F11 | F14 | + * | Mute | Vol- | Vol+ | Trk- | Trk+ | Play | | F1 | F2 | F3 | F12 | F15 | + * | | | | | | | | | | | | | + */ +[_FUNC] = LAYOUT_planck_grid( + XXXXXXX, XMSNCTL, XPRVSPC, NWIN, XNXTSPC, XDSKTOP, XXXXXXX, KC_F7, KC_F8, KC_F9, KC_F10, KC_F13, + XXXXXXX, XNOTIFY, PTAB, PWIN, NTAB, XXXXXXX, XXXXXXX, KC_F4, KC_F5, KC_F6, KC_F11, KC_F14, + KC_MUTE, KC_VOLD, KC_VOLU, KC_MRWD, KC_MFFD, KC_MPLY, XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F12, KC_F15, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | Reset| Debug| | | | | | | | | | | + * | | | | | | | | | | | | | + * | | | | | | | | | | | | | + * | | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = LAYOUT_planck_grid( + RESET, DEBUG, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +) + + +}; + +#ifdef AUDIO_ENABLE +#endif + +uint32_t layer_state_set_user(uint32_t state) { + /* state = update_tri_layer_state(state, _SYMBOL, _NUMBER, _ADJUST); */ + return state; +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + print("mode just switched to qwerty and this is a huge string\n"); + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + } + return true; +} + + diff --git a/keyboards/planck/keymaps/mattly/readme.md b/keyboards/planck/keymaps/mattly/readme.md new file mode 100644 index 000000000..58f2b979c --- /dev/null +++ b/keyboards/planck/keymaps/mattly/readme.md @@ -0,0 +1,28 @@ +# Mattly's Planck layout + +This planck layout is optimized for, in order: + +- moving work from my pinkies to my thumbs +- writing lisp/clojure code in my evil-mode based emacs setup +- tapping out messages in chat applications such as slack +- writing english in markdown files in said emacs +- navigating mac applications +- writing english in a web browser on a macintosh +- writing other programming languages' code in said emacs +- writing english in other contexts +- literally anything else + +## oddities: + +You may notice that `enter` is on a layer. This is an experiment and I kind of +like it so far, since many programs interpret that keystroke as a "commit" +of some kind. + +## works in progress + +I'm trying to figure out how to make some things easier to do with the mouse or +one-handed. Right now the combo of entering numbers and using a mouse with my +right hand is kind of annoying. I want to be able to toggle layers on, but only +from within that layer. + +![mattly's keymap](https://lyonheart.us/etc/mattly-keymap.png) diff --git a/keyboards/planck/keymaps/mattly/rules.mk b/keyboards/planck/keymaps/mattly/rules.mk new file mode 100644 index 000000000..7210cf34f --- /dev/null +++ b/keyboards/planck/keymaps/mattly/rules.mk @@ -0,0 +1,2 @@ +AUDIO_ENABLE = yes +SRC += muse.c From 06f19017839c25c4b41a16a9d9cf12b66ef8ade9 Mon Sep 17 00:00:00 2001 From: Yan-Fa Li Date: Tue, 18 Dec 2018 09:14:56 -0800 Subject: [PATCH 718/788] Keymap: A Planck style keymap with iris flair (#4677) * A Planck style keymap with iris flair - Re-arrange layers to be more planck like. - move backspace to right thumb - replace backspace with minus, more useful for coding - replace center keys with brackets - MT(MOD_LCTRL and ESCAPE) - Use QMK-DFU for bootloader - add a soft reset to keymap * Feedback from reviewers - remove redundant define (noroadsleft) - remove unused layer switch case (drashna) --- keyboards/ergotravel/keymaps/yanfali/config.h | 38 ++++++ keyboards/ergotravel/keymaps/yanfali/keymap.c | 108 ++++++++++++++++++ keyboards/ergotravel/keymaps/yanfali/rules.mk | 1 + 3 files changed, 147 insertions(+) create mode 100644 keyboards/ergotravel/keymaps/yanfali/config.h create mode 100644 keyboards/ergotravel/keymaps/yanfali/keymap.c create mode 100644 keyboards/ergotravel/keymaps/yanfali/rules.mk diff --git a/keyboards/ergotravel/keymaps/yanfali/config.h b/keyboards/ergotravel/keymaps/yanfali/config.h new file mode 100644 index 000000000..eeca26ce1 --- /dev/null +++ b/keyboards/ergotravel/keymaps/yanfali/config.h @@ -0,0 +1,38 @@ +/* +Copyright 2017 Pierre Constantineau + +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 . +*/ + +#pragma once + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + +#undef RGBLED_NUM +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 12 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 + + diff --git a/keyboards/ergotravel/keymaps/yanfali/keymap.c b/keyboards/ergotravel/keymaps/yanfali/keymap.c new file mode 100644 index 000000000..399dc9998 --- /dev/null +++ b/keyboards/ergotravel/keymaps/yanfali/keymap.c @@ -0,0 +1,108 @@ +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +#define _QWERTY 0 +#define _LOWER 1 +#define _RAISE 2 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + LOWER, + RAISE, + ADJUST, +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_QWERTY] = LAYOUT( + //,---------------------+--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------+--------. + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LBRC, KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINUS, + //|---------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + MT(MOD_LCTL, KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_LCBR, KC_RCBR, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + //|---------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_NO, KC_NO, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, + //|---------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + ADJUST, ADJUST, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_BSPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT + //`---------------------+--------+--------+--------+--------+--------+--------/ \--------+--------+--------+--------+--------+--------+--------' + ), + + [_LOWER] = LAYOUT( + //,--------+--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------+--------. + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, _______, _______, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, + //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, _______, KC_Y, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, + //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + KC_CAPS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, _______, _______, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, + //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + _______, _______, _______, _______, _______, _______, _______, RAISE, _______, _______, _______, _______ + //`--------+--------+--------+--------+--------+--------+--------/ \--------+--------+--------+--------+--------+--------+--------' + ), + + + [_RAISE] = LAYOUT( + //,--------+--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------+--------. + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, _______, _______, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, + //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + _______, KC_Q, KC_W, KC_E, KC_R, KC_T, _______, _______, KC_Y, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, + //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + _______, KC_Z, KC_X, KC_C, KC_V, KC_B, _______, _______, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, + //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + _______, _______, _______, _______, _______, _______, _______, RAISE, _______, _______, _______, _______ + //`--------+--------+--------+--------+--------+--------+--------/ \--------+--------+--------+--------+--------+--------+--------' + ), + + [_ADJUST] = LAYOUT( + //,--------+--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------+--------. + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, RESET, + //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + _______, _______, _______, _______, _______, _______, _______, RAISE, _______, _______, _______, _______ + //`--------+--------+--------+--------+--------+--------+--------/ \--------+--------+--------+--------+--------+--------+--------' + ) + +}; + + + + + + + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + break; + } + return true; +} diff --git a/keyboards/ergotravel/keymaps/yanfali/rules.mk b/keyboards/ergotravel/keymaps/yanfali/rules.mk new file mode 100644 index 000000000..0613ea866 --- /dev/null +++ b/keyboards/ergotravel/keymaps/yanfali/rules.mk @@ -0,0 +1 @@ +BOOTLOADER = qmk-dfu From 8181c8dc97ddd073a94430032c2505ec2e4d4a05 Mon Sep 17 00:00:00 2001 From: noroadsleft Date: Sat, 15 Dec 2018 22:44:48 -0800 Subject: [PATCH 719/788] FC980C: refactor and Configurator update - fc980c.h - updated to #pragma once method - layout macro visual alignment - info.json - fixed JSON ordering (keys were being assigned out-of-order) - default keymap - visual alignment - deleted unused fn_actions block --- keyboards/fc980c/fc980c.h | 60 +++++------ keyboards/fc980c/info.json | 197 +++++++++++++++++++------------------ 2 files changed, 123 insertions(+), 134 deletions(-) diff --git a/keyboards/fc980c/fc980c.h b/keyboards/fc980c/fc980c.h index 74c468061..f20c102e5 100644 --- a/keyboards/fc980c/fc980c.h +++ b/keyboards/fc980c/fc980c.h @@ -14,11 +14,9 @@ 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 . */ -#ifndef FC980C_H -#define FC980C_H +#pragma once #include "quantum.h" -// #include "quantum_keycodes.h" /* ---------------------------------------------------------------------------------------------------------------------- @@ -37,41 +35,31 @@ along with this program. If not, see . ---------------------------------------------------------------------------------------------------------------------- */ -#define LAYOUT( \ - K0D, K2D, K5D, K3D, K6D, K7D, K7F, K7E, K7C, K72, K71, K70, K73, K74, K76, K77, K75, \ - K0A, K69, K59, K58, K5B, K6F, K5F, K5E, K6C, K5C, K52, K51, K50, K55, K54, K56, K57, K65, \ - K6A, K39, K68, K6B, K3B, K3F, K6E, K3E, K3C, K62, K61, K60, K33, K53, K64, K66, K67, K25, \ - K3A, K29, K38, K28, K2B, K2F, K2E, K2C, K1C, K32, K31, K20, K63, K24, K26, K27, \ - K2A, K18, K08, K1B, K0B, K1F, K1E, K0E, K22, K11, K21, K30, K34, K14, K16, K17, K15, \ - K1A, K09, K19, K0F, K02, K01, K10, K00, K04, K06, K07, K05) \ - { \ - {K00, K01, K02, KC_NO, K04, K05, K06, K07, \ - K08, K09, K0A, K0B, KC_NO, K0D, K0E, K0F}, \ - {K10, K11, KC_NO, KC_NO, K14, K15, K16, K17, \ - K18, K19, K1A, K1B, K1C, KC_NO, K1E, K1F}, \ - {K20, K21, K22, KC_NO, K24, K25, K26, K27, \ - K28, K29, K2A, K2B, K2C, K2D, K2E, K2F}, \ - {K30, K31, K32, K33, K34, KC_NO, KC_NO, KC_NO, \ - K38, K39, K3A, K3B, K3C, K3D, K3E, K3F}, \ - {KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO}, \ - {K50, K51, K52, K53, K54, K55, K56, K57, \ - K58, K59, KC_NO, K5B, K5C, K5D, K5E, K5F}, \ - {K60, K61, K62, K63, K64, K65, K66, K67, \ - K68, K69, K6A, K6B, K6C, K6D, K6E, K6F}, \ - { \ - K70, K71, K72, K73, K74, K75, K76, K77, \ - KC_NO, KC_NO, KC_NO, KC_NO, K7C, K7D, K7E, K7F \ - } \ - } +#define LAYOUT( \ + K0D, K2D, K5D, K3D, K6D, K7D, K7F, K7E, K7C, K72, K71, K70, K73, K74, K76, K77, K75, \ + K0A, K69, K59, K58, K5B, K6F, K5F, K5E, K6C, K5C, K52, K51, K50, K55, K54, K56, K57, K65, \ + K6A, K39, K68, K6B, K3B, K3F, K6E, K3E, K3C, K62, K61, K60, K33, K53, K64, K66, K67, K25, \ + K3A, K29, K38, K28, K2B, K2F, K2E, K2C, K1C, K32, K31, K20, K63, K24, K26, K27, \ + K2A, K18, K08, K1B, K0B, K1F, K1E, K0E, K22, K11, K21, K30, K34, K14, K16, K17, K15, \ + K1A, K09, K19, K0F, K02, K01, K10, K00, K04, K06, K07, K05 \ +) { \ + { K00, K01, K02, KC_NO, K04, K05, K06, K07, K08, K09, K0A, K0B, KC_NO, K0D, K0E, K0F }, \ + { K10, K11, KC_NO, KC_NO, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, KC_NO, K1E, K1F }, \ + { K20, K21, K22, KC_NO, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, K2F }, \ + { K30, K31, K32, K33, K34, KC_NO, KC_NO, KC_NO, K38, K39, K3A, K3B, K3C, K3D, K3E, K3F }, \ + { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ + { K50, K51, K52, K53, K54, K55, K56, K57, K58, K59, KC_NO, K5B, K5C, K5D, K5E, K5F }, \ + { K60, K61, K62, K63, K64, K65, K66, K67, K68, K69, K6A, K6B, K6C, K6D, K6E, K6F }, \ + { K70, K71, K72, K73, K74, K75, K76, K77, KC_NO, KC_NO, KC_NO, KC_NO, K7C, K7D, K7E, K7F } \ +} /* LAYOUT( - _______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______,_______,_______, - _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______,_______,_______, - _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______,_______,_______, - _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______, _______,_______,_______, - _______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______,_______,_______, - _______,_______,_______, _______, _______,_______,_______, _______,_______,_______, _______,_______ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ ) */ diff --git a/keyboards/fc980c/info.json b/keyboards/fc980c/info.json index f3007f2f8..a15ff216c 100644 --- a/keyboards/fc980c/info.json +++ b/keyboards/fc980c/info.json @@ -6,105 +6,106 @@ "height": 6.75, "layouts": { "LAYOUT": { + "key_count": 98, "layout": [ - { "label": "Esc", "x": 0, "y": 0 }, - { "label": "F1", "x": 2, "y": 0 }, - { "label": "F2", "x": 3, "y": 0 }, - { "label": "F3", "x": 4, "y": 0 }, - { "label": "F4", "x": 5, "y": 0 }, - { "label": "F5", "x": 6.5, "y": 0 }, - { "label": "F6", "x": 7.5, "y": 0 }, - { "label": "F7", "x": 8.5, "y": 0 }, - { "label": "F8", "x": 9.5, "y": 0 }, - { "label": "F9", "x": 11, "y": 0 }, - { "label": "F10", "x": 12, "y": 0 }, - { "label": "F11", "x": 13, "y": 0 }, - { "label": "F12", "x": 14, "y": 0 }, - { "label": "Delete", "x": 15.5, "y": 0 }, - { "label": "Insert", "x": 16.5, "y": 0 }, - { "label": "Pg Up", "x": 17.5, "y": 0 }, - { "label": "Pg Dn", "x": 18.5, "y": 0 }, - { "label": "~", "x": 0, "y": 1.5 }, - { "label": "!", "x": 1, "y": 1.5 }, - { "label": "@", "x": 2, "y": 1.5 }, - { "label": "#", "x": 3, "y": 1.5 }, - { "label": "$", "x": 4, "y": 1.5 }, - { "label": "%", "x": 5, "y": 1.5 }, - { "label": "^", "x": 6, "y": 1.5 }, - { "label": "&", "x": 7, "y": 1.5 }, - { "label": "*", "x": 8, "y": 1.5 }, - { "label": "(", "x": 9, "y": 1.5 }, - { "label": ")", "x": 10, "y": 1.5 }, - { "label": "_", "x": 11, "y": 1.5 }, - { "label": "+", "x": 12, "y": 1.5 }, - { "label": "Backspace", "x": 13, "y": 1.5, "w": 2 }, - { "label": "Num Lock", "x": 15.5, "y": 1.5 }, - { "label": "/", "x": 16.5, "y": 1.5 }, - { "label": "*", "x": 17.5, "y": 1.5 }, - { "label": "-", "x": 18.5, "y": 1.5 }, - { "label": "Tab", "x": 0, "y": 2.5, "w": 1.5 }, - { "label": "Q", "x": 1.5, "y": 2.5 }, - { "label": "W", "x": 2.5, "y": 2.5 }, - { "label": "E", "x": 3.5, "y": 2.5 }, - { "label": "R", "x": 4.5, "y": 2.5 }, - { "label": "T", "x": 5.5, "y": 2.5 }, - { "label": "Y", "x": 6.5, "y": 2.5 }, - { "label": "U", "x": 7.5, "y": 2.5 }, - { "label": "I", "x": 8.5, "y": 2.5 }, - { "label": "O", "x": 9.5, "y": 2.5 }, - { "label": "P", "x": 10.5, "y": 2.5 }, - { "label": "{", "x": 11.5, "y": 2.5 }, - { "label": "}", "x": 12.5, "y": 2.5 }, - { "label": "|", "x": 13.5, "y": 2.5, "w": 1.5 }, - { "label": "7", "x": 15.5, "y": 2.5 }, - { "label": "8", "x": 16.5, "y": 2.5 }, - { "label": "9", "x": 17.5, "y": 2.5 }, - { "label": "+", "x": 18.5, "y": 2.5, "h": 2 }, - { "label": "Caps Lock", "x": 0, "y": 3.5, "w": 1.75 }, - { "label": "A", "x": 1.75, "y": 3.5 }, - { "label": "S", "x": 2.75, "y": 3.5 }, - { "label": "D", "x": 3.75, "y": 3.5 }, - { "label": "F", "x": 4.75, "y": 3.5 }, - { "label": "G", "x": 5.75, "y": 3.5 }, - { "label": "H", "x": 6.75, "y": 3.5 }, - { "label": "J", "x": 7.75, "y": 3.5 }, - { "label": "K", "x": 8.75, "y": 3.5 }, - { "label": "L", "x": 9.75, "y": 3.5 }, - { "label": ":", "x": 10.75, "y": 3.5 }, - { "label": "\"", "x": 11.75, "y": 3.5 }, - { "label": "Enter", "x": 12.75, "y": 3.5, "w": 2.25 }, - { "label": "4", "x": 15.5, "y": 3.5 }, - { "label": "5", "x": 16.5, "y": 3.5 }, - { "label": "6", "x": 17.5, "y": 3.5 }, - { "label": "Shift", "x": 0, "y": 4.5, "w": 2.25 }, - { "label": "Z", "x": 2.25, "y": 4.5 }, - { "label": "X", "x": 3.25, "y": 4.5 }, - { "label": "C", "x": 4.25, "y": 4.5 }, - { "label": "V", "x": 5.25, "y": 4.5 }, - { "label": "B", "x": 6.25, "y": 4.5 }, - { "label": "N", "x": 7.25, "y": 4.5 }, - { "label": "M", "x": 8.25, "y": 4.5 }, - { "label": "<", "x": 9.25, "y": 4.5 }, - { "label": ">", "x": 10.25, "y": 4.5 }, - { "label": "?", "x": 11.25, "y": 4.5 }, - { "label": "Shift", "x": 12.25, "y": 4.5, "w": 1.75 }, - { "label": "1", "x": 15.5, "y": 4.5 }, - { "label": "2", "x": 16.5, "y": 4.5 }, - { "label": "3", "x": 17.5, "y": 4.5 }, - { "label": "Enter", "x": 18.5, "y": 4.5, "h": 2 }, - { "label": "\u2191", "x": 14.25, "y": 4.75 }, - { "label": "Ctrl", "x": 0, "y": 5.5, "w": 1.25 }, - { "label": "Win", "x": 1.25, "y": 5.5 }, - { "label": "Alt", "x": 2.25, "y": 5.5, "w": 1.25 }, - { "x": 3.5, "y": 5.5, "w": 6 }, - { "label": "Alt", "x": 9.5, "y": 5.5, "w": 1.25 }, - { "label": "Ctrl", "x": 10.75, "y": 5.5 }, - { "label": "Fn", "x": 11.75, "y": 5.5, "w": 1.25 }, - { "label": "0", "x": 16.5, "y": 5.5 }, - { "label": ".", "x": 17.5, "y": 5.5 }, - { "label": "\u2190", "x": 13.25, "y": 5.75 }, - { "label": "\u2193", "x": 14.25, "y": 5.75 }, - { "label": "\u2192", "x": 15.25, "y": 5.75 } + {"label":"Esc", "x":0, "y":0}, + {"label":"F1", "x":2, "y":0}, + {"label":"F2", "x":3, "y":0}, + {"label":"F3", "x":4, "y":0}, + {"label":"F4", "x":5, "y":0}, + {"label":"F5", "x":6.5, "y":0}, + {"label":"F6", "x":7.5, "y":0}, + {"label":"F7", "x":8.5, "y":0}, + {"label":"F8", "x":9.5, "y":0}, + {"label":"F9", "x":11, "y":0}, + {"label":"F10", "x":12, "y":0}, + {"label":"F11", "x":13, "y":0}, + {"label":"F12", "x":14, "y":0}, + {"label":"Delete", "x":15.5, "y":0}, + {"label":"Insert", "x":16.5, "y":0}, + {"label":"Page Up", "x":17.5, "y":0}, + {"label":"Page Down", "x":18.5, "y":0}, + {"label":"`", "x":0, "y":1.5}, + {"label":"1", "x":1, "y":1.5}, + {"label":"2", "x":2, "y":1.5}, + {"label":"3", "x":3, "y":1.5}, + {"label":"4", "x":4, "y":1.5}, + {"label":"5", "x":5, "y":1.5}, + {"label":"6", "x":6, "y":1.5}, + {"label":"7", "x":7, "y":1.5}, + {"label":"8", "x":8, "y":1.5}, + {"label":"9", "x":9, "y":1.5}, + {"label":"0", "x":10, "y":1.5}, + {"label":"-", "x":11, "y":1.5}, + {"label":"=", "x":12, "y":1.5}, + {"label":"Backspace", "x":13, "y":1.5, "w":2}, + {"label":"Num Lock", "x":15.5, "y":1.5}, + {"label":"/", "x":16.5, "y":1.5}, + {"label":"*", "x":17.5, "y":1.5}, + {"label":"-", "x":18.5, "y":1.5}, + {"label":"Tab", "x":0, "y":2.5, "w":1.5}, + {"label":"Q", "x":1.5, "y":2.5}, + {"label":"W", "x":2.5, "y":2.5}, + {"label":"E", "x":3.5, "y":2.5}, + {"label":"R", "x":4.5, "y":2.5}, + {"label":"T", "x":5.5, "y":2.5}, + {"label":"Y", "x":6.5, "y":2.5}, + {"label":"U", "x":7.5, "y":2.5}, + {"label":"I", "x":8.5, "y":2.5}, + {"label":"O", "x":9.5, "y":2.5}, + {"label":"P", "x":10.5, "y":2.5}, + {"label":"[", "x":11.5, "y":2.5}, + {"label":"]", "x":12.5, "y":2.5}, + {"label":"\\", "x":13.5, "y":2.5, "w":1.5}, + {"label":"7", "x":15.5, "y":2.5}, + {"label":"8", "x":16.5, "y":2.5}, + {"label":"9", "x":17.5, "y":2.5}, + {"label":"+", "x":18.5, "y":2.5, "h":2}, + {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75}, + {"label":"A", "x":1.75, "y":3.5}, + {"label":"S", "x":2.75, "y":3.5}, + {"label":"D", "x":3.75, "y":3.5}, + {"label":"F", "x":4.75, "y":3.5}, + {"label":"G", "x":5.75, "y":3.5}, + {"label":"H", "x":6.75, "y":3.5}, + {"label":"J", "x":7.75, "y":3.5}, + {"label":"K", "x":8.75, "y":3.5}, + {"label":"L", "x":9.75, "y":3.5}, + {"label":";", "x":10.75, "y":3.5}, + {"label":"'", "x":11.75, "y":3.5}, + {"label":"Enter", "x":12.75, "y":3.5, "w":2.25}, + {"label":"4", "x":15.5, "y":3.5}, + {"label":"5", "x":16.5, "y":3.5}, + {"label":"6", "x":17.5, "y":3.5}, + {"label":"Shift", "x":0, "y":4.5, "w":2.25}, + {"label":"Z", "x":2.25, "y":4.5}, + {"label":"X", "x":3.25, "y":4.5}, + {"label":"C", "x":4.25, "y":4.5}, + {"label":"V", "x":5.25, "y":4.5}, + {"label":"B", "x":6.25, "y":4.5}, + {"label":"N", "x":7.25, "y":4.5}, + {"label":"M", "x":8.25, "y":4.5}, + {"label":",", "x":9.25, "y":4.5}, + {"label":".", "x":10.25, "y":4.5}, + {"label":"/", "x":11.25, "y":4.5}, + {"label":"Shift", "x":12.25, "y":4.5, "w":1.75}, + {"label":"Up", "x":14.25, "y":4.75}, + {"label":"1", "x":15.5, "y":4.5}, + {"label":"2", "x":16.5, "y":4.5}, + {"label":"3", "x":17.5, "y":4.5}, + {"label":"Enter", "x":18.5, "y":4.5, "h":2}, + {"label":"Ctrl", "x":0, "y":5.5, "w":1.25}, + {"label":"Win", "x":1.25, "y":5.5}, + {"label":"Alt", "x":2.25, "y":5.5, "w":1.25}, + {"label":"Space", "x":3.5, "y":5.5, "w":6}, + {"label":"Alt", "x":9.5, "y":5.5, "w":1.25}, + {"label":"Ctrl", "x":10.75, "y":5.5}, + {"label":"Fn", "x":11.75, "y":5.5, "w":1.25}, + {"label":"Left", "x":13.25, "y":5.75}, + {"label":"Down", "x":14.25, "y":5.75}, + {"label":"Right", "x":15.25, "y":5.75}, + {"label":"0", "x":16.5, "y":5.5}, + {"label":".", "x":17.5, "y":5.5} ] } } From 584a7a03952dc5950b22fa4d035dc1c8ee98c87f Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Tue, 18 Dec 2018 09:16:06 -0800 Subject: [PATCH 720/788] Keyboard: Espectro refactor and Configurator support (#4666) * Espectro: layout macro refactor - updated to #pragma once method - restructure LAYOUT_all data as block comment - Configurator was reading the LAYOUT_all macro even though it was commented out. - updated all keyswitch arguments to use K notation - add LAYOUT_iso macro - add info.json file for Configurator support * Espectro: keymap refactor - deleted unused MODS_CTRL_MASK definitions - iso keymap refactored to use LAYOUT_iso macro - default and iso keymaps refactored for readability --- keyboards/espectro/espectro.h | 173 ++++++---- keyboards/espectro/info.json | 347 ++++++++++++++++++++ keyboards/espectro/keymaps/default/keymap.c | 29 +- keyboards/espectro/keymaps/iso/keymap.c | 30 +- keyboards/espectro/keymaps/mac/keymap.c | 1 - keyboards/espectro/keymaps/mapdev/keymap.c | 1 - 6 files changed, 489 insertions(+), 92 deletions(-) create mode 100644 keyboards/espectro/info.json diff --git a/keyboards/espectro/espectro.h b/keyboards/espectro/espectro.h index 6f9e4b7f7..ff58f9d97 100755 --- a/keyboards/espectro/espectro.h +++ b/keyboards/espectro/espectro.h @@ -15,77 +15,130 @@ */ -#ifndef ESPECTRO_H -#define ESPECTRO_H +#pragma once #include "quantum.h" -//Arrow keys and 1.75u shift +/* + * Placement of every possible switch defined below. + * x2 means the diode allows two possible positions for the switch + * + * Layout: + * ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ + * │K00 │K01 │K02 │K03 │K04 │K60 │K61 │K62 │K63 │K05 │K06 │K07 │K08 │K72 │K09 │K0A │K0B │K0C │K7C │ + * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + * ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ + * │K10 │K11 │K12 │K13 │K14 │K64 │K65 │K66 │K67 │K15 │K16 │K17 │K18 │K70 │K71 │K19 │K1A │K1B │K1C │ + * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │x2 │ │ │ │ │ + * ├─────┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴─────┼─────┼─────┼─────┼─────┤ ┌────────┐ + * │K20 │K21 │K22 │K23 │K24 │K68 │K69 │K6A │K6B │K25 │K26 │K27 │K28 │K73 │K29 │K2A │K2B │K2C │ │K38 │ + * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + * ├────────┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴────────┼─────┼─────┼─────┼─────┤ ┌───┴─┐ │ + * │K30 │K31 │K32 │K33 │K34 │K6C │K75 │K76 │K77 │K35 │K36 │K37 │K38 │K39 │K3A │K3B │K3C │ │K73 │ │ + * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + * ├───────┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──────┬─────┼─────┼─────┼─────┼─────┤ └─────┴──────┘ + * │K40x2 │K41 │K42 │K43 │K44 │K78 │K79 │K7A │K7B │K45 │K46 │K47 │K48 │K74 │K49 │K4A │K4B │K4C │ + * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + * ├───────┼─────┴─┬───┴───┬─┴─────┴─────┴─────┴─────┴─────┴───┬─┴───┬─┴───┬─┴───┬─────┼─────┼─────┼─────┼─────┼─────┤ + * │K50 │K51 │K52 │K59 │K55 │K56 │K57 │K58 │K53 │K54 │K5A │K5B │K5C │ + * │x2 │x2 │ │x3 │x3 │x2 │x2 │x2 │x2 │ │x2 │ │ │ + * └───────┴───────┴───────┴───────────────────────────────────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ + * + * Variants: + * - 2u Backspace: Delete K70 Use K71 + * - 2u Num +: Delete K3C Use K2C + * - 2u Num Enter: Delete K5C Use K4C + * - ANSI Left Shift: Delete K41 Use K40 + * + * ANSI Backslash and ISO Hash are the same position + * ANSI Enter and ISO Enter are the same position + * For two 1.5u modifiers on the right of the Spacebar, delete K56 and use K55 and K57 + * + * Matrix: + * { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C }, \ + * { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C }, \ + * { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C }, \ + * { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C }, \ + * { K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C }, \ + * { K50, K51, K52, K53, K54, K55, K56, K57, K58, K59, K5A, K5B, K5C }, \ + * { K60, K61, K62, K63, K64, K65, K66, K67, K68, K69, K6A, K6B, K6C }, \ + * { K70, K71, K72, K73, K74, K75, K76, K77, K78, K79, K7A, K7B, K7C } \ + */ + + +/* LAYOUT_all (Identical to LAYOUT_split_shift_and_bs) + * Every matrix position + * ,---------------------------------------------------------------------------. + * | 00| 01| 02| 03| 04| 60| 61| 62| 63| 05| 06| 07| 08| 72| 09| 0A| 0B| 0C| 7C| + * |---------------------------------------------------------------------------| + * | 10| 11| 12| 13| 14| 64| 65| 66| 67| 15| 16| 17| 18| 70| 71| 19| 1A| 1B| 1C| + * |---------------------------------------------------------------------------| + * | 20 | 21| 22| 23| 24| 68| 69| 6A| 6B| 25| 26| 27| 28| 73| 29| 2A| 2B| 2C| + * |---------------------------------------------------------------------------| + * | 30 | 31| 32| 33| 34| 6C| 75| 76| 77| 35| 36| 37| 38| 39| 3A| 3B| 3C| + * |---------------------------------------------------------------------------| + * | 40 | 41| 42| 43| 44| 78| 79| 7A| 7B| 45| 46| 47| 48| 74| 49| 4A| 4B| 4C| + * |---------------------------------------------------------------------------| + * | 50 | 51 | 52 | 59 | 55| 56| 57| 58| 53| 54| 5A| 5B| 5C| + * `---------------------------------------------------------------------------' +*/ + + +//Arrow keys and 1.75u right shift #define LAYOUT_default( \ -K000, K001, K002, K003, K004, K600, K601, K602, K603, K005, K006, K007, K008, K702, K009, K010, K011, K012, K712, \ -K100, K101, K102, K103, K104, K604, K605, K606, K607, K105, K106, K107, K108, K701, K109, K110, K111, K112, \ - K200, K201, K202, K203, K204, K608, K609, K610, K611, K205, K206, K207, K208, K703, K209, K210, K211, K212, \ - K300, K301, K302, K303, K304, K612, K705, K706, K707, K305, K306, K307, K308, K309, K310, K311, \ - K400, K402, K403, K404, K708, K709, K710, K711, K405, K406, K407, K408, K704, K409, K410, K411, K412, \ -K500, K501, K502, K509, K505, K506, K507, K508, K503, K504, K510, K511 \ + K00, K01, K02, K03, K04, K60, K61, K62, K63, K05, K06, K07, K08, K72, K09, K0A, K0B, K0C, K7C, \ + K10, K11, K12, K13, K14, K64, K65, K66, K67, K15, K16, K17, K18, K71, K19, K1A, K1B, K1C, \ + K20, K21, K22, K23, K24, K68, K69, K6A, K6B, K25, K26, K27, K28, K73, K29, K2A, K2B, K2C, \ + K30, K31, K32, K33, K34, K6C, K75, K76, K77, K35, K36, K37, K38, K39, K3A, K3B, \ + K40, K42, K43, K44, K78, K79, K7A, K7B, K45, K46, K47, K48, K74, K49, K4A, K4B, K4C, \ + K50, K51, K52, K59, K55, K56, K57, K58, K53, K54, K5A, K5B \ ) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012 }, \ - { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112 }, \ - { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212 }, \ - { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO }, \ - { K400, KC_NO, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412 }, \ - { K500, K501, K502, K503, K504, K505, K506, K507, K508, K509, K510, K511, KC_NO }, \ - { K600, K601, K602, K603, K604, K605, K606, K607, K608, K609, K610, K611, K612 }, \ - { KC_NO, K701, K702, K703, K704, K705, K706, K707, K708, K709, K710, K711, K712 }, \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, KC_NO }, \ + { K40, KC_NO, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C }, \ + { K50, K51, K52, K53, K54, K55, K56, K57, K58, K59, K5A, K5B, KC_NO }, \ + { K60, K61, K62, K63, K64, K65, K66, K67, K68, K69, K6A, K6B, K6C }, \ + { KC_NO, K71, K72, K73, K74, K75, K76, K77, K78, K79, K7A, K7B, K7C } \ } // Split numpad (enter, 0), split shifts (right, left), split backspace -// This is more of an example of every possible keycode placement +// This layout contains every possible keycode placement #define LAYOUT_split_shift_and_bs( \ -K000, K001, K002, K003, K004, K600, K601, K602, K603, K005, K006, K007, K008, K702, K009, K010, K011, K012, K712, \ -K100, K101, K102, K103, K104, K604, K605, K606, K607, K105, K106, K107, K108, K700, K701, K109, K110, K111, K112, \ - K200, K201, K202, K203, K204, K608, K609, K610, K611, K205, K206, K207, K208, K703, K209, K210, K211, K212, \ - K300, K301, K302, K303, K304, K612, K705, K706, K707, K305, K306, K307, K308, K309, K310, K311, K312, \ - K400, K401, K402, K403, K404, K708, K709, K710, K711, K405, K406, K407, K408, K704, K409, K410, K411, K412, \ -K500, K501, K502, K509, K505, K506, K507, K508, K503, K504, K510, K511, K512 \ + K00, K01, K02, K03, K04, K60, K61, K62, K63, K05, K06, K07, K08, K72, K09, K0A, K0B, K0C, K7C, \ + K10, K11, K12, K13, K14, K64, K65, K66, K67, K15, K16, K17, K18, K70, K71, K19, K1A, K1B, K1C, \ + K20, K21, K22, K23, K24, K68, K69, K6A, K6B, K25, K26, K27, K28, K73, K29, K2A, K2B, K2C, \ + K30, K31, K32, K33, K34, K6C, K75, K76, K77, K35, K36, K37, K38, K39, K3A, K3B, K3C, \ + K40, K41, K42, K43, K44, K78, K79, K7A, K7B, K45, K46, K47, K48, K74, K49, K4A, K4B, K4C, \ + K50, K51, K52, K59, K55, K56, K57, K58, K53, K54, K5A, K5B, K5C \ ) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012 }, \ - { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112 }, \ - { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212 }, \ - { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312 }, \ - { K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412 }, \ - { K500, K501, K502, K503, K504, K505, K506, K507, K508, K509, K510, K511, K512 }, \ - { K600, K601, K602, K603, K604, K605, K606, K607, K608, K609, K610, K611, K612 }, \ - { K701, K701, K702, K703, K704, K705, K706, K707, K708, K709, K710, K711, K712 }, \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C }, \ + { K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C }, \ + { K50, K51, K52, K53, K54, K55, K56, K57, K58, K59, K5A, K5B, K5C }, \ + { K60, K61, K62, K63, K64, K65, K66, K67, K68, K69, K6A, K6B, K6C }, \ + { K71, K71, K72, K73, K74, K75, K76, K77, K78, K79, K7A, K7B, K7C }, \ } - - - -/* -Placement of every possible switch defined below. -x2 means the diode allows two possible positions for the switch - -#define LAYOUT_all( \ -K000, K001, K002, K003, K004, K600, K601, K602, K603, K005, K006, K007, K008, K702, K009, K010, K011, K012, K712, \ -K100, K101, K102, K103, K104, K604, K605, K606, K607, K105, K106, K107, K108, K700, K701x2, K109, K110, K111, K112, \ -K200, K201, K202, K203, K204, K608, K609, K610, K611, K205, K206, K207, K208, K703, K209, K210, K211, K212, \ - K308, K212, \ -K300, K300, K301, K302, K304, K612, K705, K706, K707, K305, K306, K307, K703, K308, K309, K310, K311, K312, \ -K400x2, K401, K402, K403, K404, K708, K709, K710, K711, K405, K406, K407, K408, K408, K704, K409, K410, K411, K412, \ - K412, \ -K500x2, K501x2, K502, K509x3, K505x3, K506x2, K507x2, K508x2, K503x2, K504, K510x2, K511, K512 \ -) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012 }, \ - { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112 }, \ - { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212 }, \ - { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312 }, \ - { K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412 }, \ - { K500, K501, K502, K503, K504, K505, K506, K507, K508, K509, K510, K511, K512 }, \ - { K600, K601, K602, K603, K604, K605, K606, K607, K608, K609, K610, K611, K612 }, \ - { K700, K701, K702, K703, K704, K705, K706, K707, K708, K709, K710, K711, K712 }, \ +// ISO Layout +#define LAYOUT_iso( \ + K00, K01, K02, K03, K04, K60, K61, K62, K63, K05, K06, K07, K08, K72, K09, K0A, K0B, K0C, K7C, \ + K10, K11, K12, K13, K14, K64, K65, K66, K67, K15, K16, K17, K18, K71, K19, K1A, K1B, K1C, \ + K20, K21, K22, K23, K24, K68, K69, K6A, K6B, K25, K26, K27, K28, K29, K2A, K2B, K2C, \ + K30, K31, K32, K33, K34, K6C, K75, K76, K77, K35, K36, K37, K73, K38, K39, K3A, K3B, \ + K40, K41, K42, K43, K44, K78, K79, K7A, K7B, K45, K46, K47, K48, K74, K49, K4A, K4B, K4C, \ + K50, K51, K52, K59, K55, K56, K57, K58, K53, K54, K5A, K5B \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, KC_NO }, \ + { K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C }, \ + { K50, K51, K52, K53, K54, K55, K56, K57, K58, K59, K5A, K5B, KC_NO }, \ + { K60, K61, K62, K63, K64, K65, K66, K67, K68, K69, K6A, K6B, K6C }, \ + { KC_NO, K71, K72, K73, K74, K75, K76, K77, K78, K79, K7A, K7B, K7C } \ } -*/ - -#endif diff --git a/keyboards/espectro/info.json b/keyboards/espectro/info.json new file mode 100644 index 000000000..7a8c9bc0a --- /dev/null +++ b/keyboards/espectro/info.json @@ -0,0 +1,347 @@ +{ + "keyboard_name": "Espectro", + "keyboard_folder": "espectro", + "url": "", + "maintainer": "qmk", + "width": 19, + "height": 6, + "layouts": { + "LAYOUT_default": { + "key_count": 100, + "layout": [ + {"label":"ESC", "x":0, "y":0}, + {"label":"F1", "x":1, "y":0}, + {"label":"F2", "x":2, "y":0}, + {"label":"F3", "x":3, "y":0}, + {"label":"F4", "x":4, "y":0}, + {"label":"F5", "x":5, "y":0}, + {"label":"F6", "x":6, "y":0}, + {"label":"F7", "x":7, "y":0}, + {"label":"F8", "x":8, "y":0}, + {"label":"F9", "x":9, "y":0}, + {"label":"F10", "x":10, "y":0}, + {"label":"F11", "x":11, "y":0}, + {"label":"F12", "x":12, "y":0}, + {"label":"PRINT SCREEN", "x":13, "y":0}, + {"label":"HOME", "x":14, "y":0}, + {"label":"END", "x":15, "y":0}, + {"label":"PAGE UP", "x":16, "y":0}, + {"label":"PAGE DOWN", "x":17, "y":0}, + {"label":"DELETE", "x":18, "y":0}, + + {"label":"GRAVE", "x":0, "y":1}, + {"label":"1", "x":1, "y":1}, + {"label":"2", "x":2, "y":1}, + {"label":"3", "x":3, "y":1}, + {"label":"4", "x":4, "y":1}, + {"label":"5", "x":5, "y":1}, + {"label":"6", "x":6, "y":1}, + {"label":"7", "x":7, "y":1}, + {"label":"8", "x":8, "y":1}, + {"label":"9", "x":9, "y":1}, + {"label":"0", "x":10, "y":1}, + {"label":"MINUS", "x":11, "y":1}, + {"label":"EQUAL", "x":12, "y":1}, + {"label":"BACKSPACE", "x":13, "y":1, "w":2}, + {"label":"NUM LOCK", "x":15, "y":1}, + {"label":"KEYPAD /", "x":16, "y":1}, + {"label":"KEYPAD *", "x":17, "y":1}, + {"label":"KEYPAD -", "x":18, "y":1}, + + {"label":"TAB", "x":0, "y":2, "w":1.5}, + {"label":"Q", "x":1.5, "y":2}, + {"label":"W", "x":2.5, "y":2}, + {"label":"E", "x":3.5, "y":2}, + {"label":"R", "x":4.5, "y":2}, + {"label":"T", "x":5.5, "y":2}, + {"label":"Y", "x":6.5, "y":2}, + {"label":"U", "x":7.5, "y":2}, + {"label":"I", "x":8.5, "y":2}, + {"label":"O", "x":9.5, "y":2}, + {"label":"P", "x":10.5, "y":2}, + {"label":"LBRACKET", "x":11.5, "y":2}, + {"label":"RBRACKET", "x":12.5, "y":2}, + {"label":"BACKSLASH", "x":13.5, "y":2, "w":1.5}, + {"label":"KEYPAD 7", "x":15, "y":2}, + {"label":"KEYPAD 8", "x":16, "y":2}, + {"label":"KEYPAD 9", "x":17, "y":2}, + {"label":"KEYPAD +", "x":18, "y":2, "h":2}, + + {"label":"CAPS LOCK", "x":0, "y":3, "w":1.75}, + {"label":"A", "x":1.75, "y":3}, + {"label":"S", "x":2.75, "y":3}, + {"label":"D", "x":3.75, "y":3}, + {"label":"F", "x":4.75, "y":3}, + {"label":"G", "x":5.75, "y":3}, + {"label":"H", "x":6.75, "y":3}, + {"label":"J", "x":7.75, "y":3}, + {"label":"K", "x":8.75, "y":3}, + {"label":"L", "x":9.75, "y":3}, + {"label":"SEMICOLON", "x":10.75, "y":3}, + {"label":"QUOTE", "x":11.75, "y":3}, + {"label":"ENTER", "x":12.75, "y":3, "w":2.25}, + {"label":"KEYPAD 4", "x":15, "y":3}, + {"label":"KEYPAD 5", "x":16, "y":3}, + {"label":"KEYPAD 6", "x":17, "y":3}, + + {"label":"LSHIFT", "x":0, "y":4, "w":2.25}, + {"label":"Z", "x":2.25, "y":4}, + {"label":"X", "x":3.25, "y":4}, + {"label":"C", "x":4.25, "y":4}, + {"label":"V", "x":5.25, "y":4}, + {"label":"B", "x":6.25, "y":4}, + {"label":"N", "x":7.25, "y":4}, + {"label":"M", "x":8.25, "y":4}, + {"label":"COMMA", "x":9.25, "y":4}, + {"label":"PERIOD", "x":10.25, "y":4}, + {"label":"SLASH", "x":11.25, "y":4}, + {"label":"RSHIFT", "x":12.25, "y":4, "w":1.75}, + {"label":"UP", "x":14, "y":4}, + {"label":"KEYPAD 1", "x":15, "y":4}, + {"label":"KEYPAD 2", "x":16, "y":4}, + {"label":"KEYPAD 3", "x":17, "y":4}, + {"label":"KEYPAD ENTER", "x":18, "y":4, "h":2}, + + {"label":"LCTRL", "x":0, "y":5, "w":1.25}, + {"label":"LGUI", "x":1.25, "y":5, "w":1.25}, + {"label":"LALT", "x":2.5, "y":5, "w":1.25}, + {"label":"SPACE", "x":3.75, "y":5, "w":6.25}, + {"label":"RALT", "x":10, "y":5}, + {"label":"RCTRL", "x":11, "y":5}, + {"label":"FN", "x":12, "y":5}, + {"label":"LEFT", "x":13, "y":5}, + {"label":"DOWN", "x":14, "y":5}, + {"label":"RIGHT", "x":15, "y":5}, + {"label":"KEYPAD 0", "x":16, "y":5}, + {"label":"KEYPAD .", "x":17, "y":5} + ] + }, + + "LAYOUT_split_shift_and_bs": { + "key_count": 104, + "layout": [ + {"label":"ESC", "x":0, "y":0}, + {"label":"F1", "x":1, "y":0}, + {"label":"F2", "x":2, "y":0}, + {"label":"F3", "x":3, "y":0}, + {"label":"F4", "x":4, "y":0}, + {"label":"F5", "x":5, "y":0}, + {"label":"F6", "x":6, "y":0}, + {"label":"F7", "x":7, "y":0}, + {"label":"F8", "x":8, "y":0}, + {"label":"F9", "x":9, "y":0}, + {"label":"F10", "x":10, "y":0}, + {"label":"F11", "x":11, "y":0}, + {"label":"F12", "x":12, "y":0}, + {"label":"PRINT SCREEN", "x":13, "y":0}, + {"label":"HOME", "x":14, "y":0}, + {"label":"END", "x":15, "y":0}, + {"label":"PAGE UP", "x":16, "y":0}, + {"label":"PAGE DOWN", "x":17, "y":0}, + {"label":"DELETE", "x":18, "y":0}, + + {"label":"GRAVE", "x":0, "y":1}, + {"label":"1", "x":1, "y":1}, + {"label":"2", "x":2, "y":1}, + {"label":"3", "x":3, "y":1}, + {"label":"4", "x":4, "y":1}, + {"label":"5", "x":5, "y":1}, + {"label":"6", "x":6, "y":1}, + {"label":"7", "x":7, "y":1}, + {"label":"8", "x":8, "y":1}, + {"label":"9", "x":9, "y":1}, + {"label":"0", "x":10, "y":1}, + {"label":"MINUS", "x":11, "y":1}, + {"label":"EQUAL", "x":12, "y":1}, + {"label":"BACKSPACE", "x":13, "y":1}, + {"label":"BACKSPACE", "x":14, "y":1}, + {"label":"NUM LOCK", "x":15, "y":1}, + {"label":"KEYPAD /", "x":16, "y":1}, + {"label":"KEYPAD *", "x":17, "y":1}, + {"label":"KEYPAD -", "x":18, "y":1}, + + {"label":"TAB", "x":0, "y":2, "w":1.5}, + {"label":"Q", "x":1.5, "y":2}, + {"label":"W", "x":2.5, "y":2}, + {"label":"E", "x":3.5, "y":2}, + {"label":"R", "x":4.5, "y":2}, + {"label":"T", "x":5.5, "y":2}, + {"label":"Y", "x":6.5, "y":2}, + {"label":"U", "x":7.5, "y":2}, + {"label":"I", "x":8.5, "y":2}, + {"label":"O", "x":9.5, "y":2}, + {"label":"P", "x":10.5, "y":2}, + {"label":"LBRACKET", "x":11.5, "y":2}, + {"label":"RBRACKET", "x":12.5, "y":2}, + {"label":"BACKSLASH", "x":13.5, "y":2, "w":1.5}, + {"label":"KEYPAD 7", "x":15, "y":2}, + {"label":"KEYPAD 8", "x":16, "y":2}, + {"label":"KEYPAD 9", "x":17, "y":2}, + {"label":"KEYPAD +", "x":18, "y":2}, + + {"label":"CAPS LOCK", "x":0, "y":3, "w":1.75}, + {"label":"A", "x":1.75, "y":3}, + {"label":"S", "x":2.75, "y":3}, + {"label":"D", "x":3.75, "y":3}, + {"label":"F", "x":4.75, "y":3}, + {"label":"G", "x":5.75, "y":3}, + {"label":"H", "x":6.75, "y":3}, + {"label":"J", "x":7.75, "y":3}, + {"label":"K", "x":8.75, "y":3}, + {"label":"L", "x":9.75, "y":3}, + {"label":"SEMICOLON", "x":10.75, "y":3}, + {"label":"QUOTE", "x":11.75, "y":3}, + {"label":"ENTER", "x":12.75, "y":3, "w":2.25}, + {"label":"KEYPAD 4", "x":15, "y":3}, + {"label":"KEYPAD 5", "x":16, "y":3}, + {"label":"KEYPAD 6", "x":17, "y":3}, + {"label":"KEYPAD +", "x":18, "y":3}, + + {"label":"LSHIFT", "x":0, "y":4, "w":1.25}, + {"label":"ISO BACKSLASH", "x":1.25, "y":4}, + {"label":"Z", "x":2.25, "y":4}, + {"label":"X", "x":3.25, "y":4}, + {"label":"C", "x":4.25, "y":4}, + {"label":"V", "x":5.25, "y":4}, + {"label":"B", "x":6.25, "y":4}, + {"label":"N", "x":7.25, "y":4}, + {"label":"M", "x":8.25, "y":4}, + {"label":"COMMA", "x":9.25, "y":4}, + {"label":"PERIOD", "x":10.25, "y":4}, + {"label":"SLASH", "x":11.25, "y":4}, + {"label":"RSHIFT", "x":12.25, "y":4, "w":1.75}, + {"label":"UP", "x":14, "y":4}, + {"label":"KEYPAD 1", "x":15, "y":4}, + {"label":"KEYPAD 2", "x":16, "y":4}, + {"label":"KEYPAD 3", "x":17, "y":4}, + {"label":"KEYPAD ENTER", "x":18, "y":4}, + + {"label":"LCTRL", "x":0, "y":5, "w":1.25}, + {"label":"LGUI", "x":1.25, "y":5, "w":1.25}, + {"label":"LALT", "x":2.5, "y":5, "w":1.25}, + {"label":"SPACE", "x":3.75, "y":5, "w":6.25}, + {"label":"RALT", "x":10, "y":5}, + {"label":"MENU", "x":11, "y":5}, + {"label":"RCTRL", "x":12, "y":5}, + {"label":"LEFT", "x":13, "y":5}, + {"label":"DOWN", "x":14, "y":5}, + {"label":"RIGHT", "x":15, "y":5}, + {"label":"KEYPAD 0", "x":16, "y":5}, + {"label":"KEYPAD .", "x":17, "y":5}, + {"label":"KEYPAD ENTER", "x":18, "y":5} + ] + }, + + "LAYOUT_iso": { + "key_count": 101, + "layout": [ + {"label":"ESC", "x":0, "y":0}, + {"label":"F1", "x":1, "y":0}, + {"label":"F2", "x":2, "y":0}, + {"label":"F3", "x":3, "y":0}, + {"label":"F4", "x":4, "y":0}, + {"label":"F5", "x":5, "y":0}, + {"label":"F6", "x":6, "y":0}, + {"label":"F7", "x":7, "y":0}, + {"label":"F8", "x":8, "y":0}, + {"label":"F9", "x":9, "y":0}, + {"label":"F10", "x":10, "y":0}, + {"label":"F11", "x":11, "y":0}, + {"label":"F12", "x":12, "y":0}, + {"label":"PRINT SCREEN", "x":13, "y":0}, + {"label":"HOME", "x":14, "y":0}, + {"label":"END", "x":15, "y":0}, + {"label":"PAGE UP", "x":16, "y":0}, + {"label":"PAGE DOWN", "x":17, "y":0}, + {"label":"DELETE", "x":18, "y":0}, + + {"label":"GRAVE", "x":0, "y":1}, + {"label":"1", "x":1, "y":1}, + {"label":"2", "x":2, "y":1}, + {"label":"3", "x":3, "y":1}, + {"label":"4", "x":4, "y":1}, + {"label":"5", "x":5, "y":1}, + {"label":"6", "x":6, "y":1}, + {"label":"7", "x":7, "y":1}, + {"label":"8", "x":8, "y":1}, + {"label":"9", "x":9, "y":1}, + {"label":"0", "x":10, "y":1}, + {"label":"MINUS", "x":11, "y":1}, + {"label":"EQUAL", "x":12, "y":1}, + {"label":"BACKSPACE", "x":13, "y":1, "w":2}, + {"label":"NUM LOCK", "x":15, "y":1}, + {"label":"KEYPAD /", "x":16, "y":1}, + {"label":"KEYPAD *", "x":17, "y":1}, + {"label":"KEYPAD -", "x":18, "y":1}, + + {"label":"TAB", "x":0, "y":2, "w":1.5}, + {"label":"Q", "x":1.5, "y":2}, + {"label":"W", "x":2.5, "y":2}, + {"label":"E", "x":3.5, "y":2}, + {"label":"R", "x":4.5, "y":2}, + {"label":"T", "x":5.5, "y":2}, + {"label":"Y", "x":6.5, "y":2}, + {"label":"U", "x":7.5, "y":2}, + {"label":"I", "x":8.5, "y":2}, + {"label":"O", "x":9.5, "y":2}, + {"label":"P", "x":10.5, "y":2}, + {"label":"LBRACKET", "x":11.5, "y":2}, + {"label":"RBRACKET", "x":12.5, "y":2}, + {"label":"KEYPAD 7", "x":15, "y":2}, + {"label":"KEYPAD 8", "x":16, "y":2}, + {"label":"KEYPAD 9", "x":17, "y":2}, + {"label":"KEYPAD +", "x":18, "y":2, "h":2}, + + {"label":"CAPS LOCK", "x":0, "y":3, "w":1.75}, + {"label":"A", "x":1.75, "y":3}, + {"label":"S", "x":2.75, "y":3}, + {"label":"D", "x":3.75, "y":3}, + {"label":"F", "x":4.75, "y":3}, + {"label":"G", "x":5.75, "y":3}, + {"label":"H", "x":6.75, "y":3}, + {"label":"J", "x":7.75, "y":3}, + {"label":"K", "x":8.75, "y":3}, + {"label":"L", "x":9.75, "y":3}, + {"label":"SEMICOLON", "x":10.75, "y":3}, + {"label":"QUOTE", "x":11.75, "y":3}, + {"label":"ISO HASH", "x":12.75, "y":3}, + {"label":"ENTER", "x":13.75, "y":2, "w":1.25, "h":2}, + {"label":"KEYPAD 4", "x":15, "y":3}, + {"label":"KEYPAD 5", "x":16, "y":3}, + {"label":"KEYPAD 6", "x":17, "y":3}, + + {"label":"LSHIFT", "x":0, "y":4, "w":1.25}, + {"label":"ISO BACKSLASH", "x":1.25, "y":4}, + {"label":"Z", "x":2.25, "y":4}, + {"label":"X", "x":3.25, "y":4}, + {"label":"C", "x":4.25, "y":4}, + {"label":"V", "x":5.25, "y":4}, + {"label":"B", "x":6.25, "y":4}, + {"label":"N", "x":7.25, "y":4}, + {"label":"M", "x":8.25, "y":4}, + {"label":"COMMA", "x":9.25, "y":4}, + {"label":"PERIOD", "x":10.25, "y":4}, + {"label":"SLASH", "x":11.25, "y":4}, + {"label":"RSHIFT", "x":12.25, "y":4, "w":1.75}, + {"label":"UP", "x":14, "y":4}, + {"label":"KEYPAD 1", "x":15, "y":4}, + {"label":"KEYPAD 2", "x":16, "y":4}, + {"label":"KEYPAD 3", "x":17, "y":4}, + {"label":"KEYPAD ENTER", "x":18, "y":4, "h":2}, + + {"label":"LCTRL", "x":0, "y":5, "w":1.25}, + {"label":"LGUI", "x":1.25, "y":5, "w":1.25}, + {"label":"LALT", "x":2.5, "y":5, "w":1.25}, + {"label":"SPACE", "x":3.75, "y":5, "w":6.25}, + {"label":"RALT", "x":10, "y":5}, + {"label":"MENU", "x":11, "y":5}, + {"label":"RCTRL", "x":12, "y":5}, + {"label":"LEFT", "x":13, "y":5}, + {"label":"DOWN", "x":14, "y":5}, + {"label":"RIGHT", "x":15, "y":5}, + {"label":"KEYPAD 0", "x":16, "y":5}, + {"label":"KEYPAD .", "x":17, "y":5} + ] + } + } +} diff --git a/keyboards/espectro/keymaps/default/keymap.c b/keyboards/espectro/keymaps/default/keymap.c index aeff733fc..b78fdbcac 100755 --- a/keyboards/espectro/keymaps/default/keymap.c +++ b/keyboards/espectro/keymaps/default/keymap.c @@ -16,7 +16,6 @@ #include QMK_KEYBOARD_H -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) #define _BL 0 //Base layer #define _FN1 1 //Function layer @@ -26,7 +25,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* BL ____________________________________________________________________________________________________________________________________________________________________________ | | | | | | | | | | | | | | | | | | | | -| ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | P SCN | HOME | END | P UP | P DOWN | DEL | +| ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | DEL | PRT SC | SCR LK | PAUSE | P UP | P DOWN | |________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________| | | | | | | | | | | | | | | BACK | NUM | | | | | ~` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | _ - | = + | SPACE | LOCK | / | * | - | @@ -46,12 +45,12 @@ ________________________________________________________________________________ */ [_BL] = LAYOUT_default( - KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_PSCR, KC_SLCK, KC_PAUS, KC_PGUP, KC_PGDN, - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PPLS, - KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, - KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, - KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, MO(1), KC_LEFT, KC_DOWN, KC_RIGHT, KC_P0, KC_PDOT + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_PSCR, KC_SLCK, KC_PAUS, KC_PGUP, KC_PGDN, \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PPLS, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, \ + KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, MO(1), KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT \ ), /* FN_1 @@ -60,7 +59,7 @@ ________________________________________________________________________________ | RESET | | | | | | | | | | | | | MUTE | DOWN | UP | TRACK | HOME | END | |________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________| | | RGB | RGB | RGB | RGB | RGB | RGB | RGB | RGB | | | | | | | | | | -| | TOGGLE | MODE |INCREASE|DECREASE| HUE | HUE | SAT | | | | | | DELETE | | | | | +| | TOGGLE | MODE |INCREASE|DECREASE| HUE | HUE | SAT | SAT | | | | | DELETE | | | | | |________|________|________|________|________|INCREASE|DECREASE|INCREASE|DECREASE|________|________|________|________|_________________|________|________|________|________| | | BACK | BACK | | | | | | | | | | | | | | | | | | LIGHT | LIGHT | | | | | | | | | | | | | | | | @@ -77,12 +76,12 @@ ________________________________________________________________________________ */ [_FN1] = LAYOUT_default( - RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, KC_MNXT, KC_HOME, KC_END, - _______, RGB_TOG, RGB_MOD, RGB_VAI, RGB_VAD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, _______, _______, _______, _______, KC_DEL, _______, _______, _______, _______, - _______, BL_TOGG, BL_INC, BL_DEC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, KC_MNXT, KC_HOME, KC_END, \ + _______, RGB_TOG, RGB_MOD, RGB_VAI, RGB_VAD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, _______, _______, _______, _______, KC_DEL, _______, _______, _______, _______, \ + _______, BL_TOGG, BL_INC, BL_DEC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ ), }; diff --git a/keyboards/espectro/keymaps/iso/keymap.c b/keyboards/espectro/keymaps/iso/keymap.c index d22e7aac4..a9625e4d9 100755 --- a/keyboards/espectro/keymaps/iso/keymap.c +++ b/keyboards/espectro/keymaps/iso/keymap.c @@ -44,13 +44,13 @@ ________________________________________________________________________________ |__________|__________|__________|________________________________________________________|________|________|________|________|________|________|________|________|________| */ - [_BL] = LAYOUT_split_shift_and_bs( - KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_PSCR, KC_HOME, KC_END, KC_PGUP, KC_PGDN, - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_NO, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_NUHS, KC_P7, KC_P8, KC_P9, KC_PPLS, - KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_NO, KC_P4, KC_P5, KC_P6, - KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, - KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, MO(1), KC_LEFT, KC_DOWN, KC_RIGHT, KC_P0, KC_PDOT, KC_NO + [_BL] = LAYOUT_iso( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_PSCR, KC_HOME, KC_END, KC_PGUP, KC_PGDN, \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_P7, KC_P8, KC_P9, KC_PPLS, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_P4, KC_P5, KC_P6, \ + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, MO(1), KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT \ ), /* FN_1 @@ -59,7 +59,7 @@ ________________________________________________________________________________ | RESET | | | | | | | | | | | | | MUTE | DOWN | UP | TRACK | HOME | END | |________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________| | | RGB | RGB | RGB | RGB | RGB | RGB | RGB | RGB | | | | | | | | | | -| | TOGGLE | MODE |INCREASE|DECREASE| HUE | HUE | SAT | | | | | | DELETE | | | | | +| | TOGGLE | MODE |INCREASE|DECREASE| HUE | HUE | SAT | SAT | | | | | DELETE | | | | | |________|________|________|________|________|INCREASE|DECREASE|INCREASE|DECREASE|________|________|________|________|_________________|________|________|________|________| | | BACK | BACK | | | | | | | | | | | | | | | | | | LIGHT | LIGHT | | | | | | | | | | | | | | | | @@ -75,13 +75,13 @@ ________________________________________________________________________________ |__________|__________|__________|________________________________________________________|________|________|________|________|________|________|________|________|________| */ - [_FN1] = LAYOUT_split_shift_and_bs( - RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, KC_MNXT, KC_HOME, KC_END, - _______, RGB_TOG, RGB_MOD, RGB_VAI, RGB_VAD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, _______, _______, _______, _______, _______, KC_DEL, _______, _______, _______, _______, - _______, BL_TOGG, BL_INC, BL_DEC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + [_FN1] = LAYOUT_iso( + RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, KC_MNXT, KC_HOME, KC_END, \ + _______, RGB_TOG, RGB_MOD, RGB_VAI, RGB_VAD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, _______, _______, _______, _______, KC_DEL, _______, _______, _______, _______, \ + _______, BL_TOGG, BL_INC, BL_DEC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ ), }; diff --git a/keyboards/espectro/keymaps/mac/keymap.c b/keyboards/espectro/keymaps/mac/keymap.c index 4b72ff0aa..9c03e1345 100644 --- a/keyboards/espectro/keymaps/mac/keymap.c +++ b/keyboards/espectro/keymaps/mac/keymap.c @@ -17,7 +17,6 @@ #include QMK_KEYBOARD_H -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) #define _QWERTY 0 //BASE layer #define _FUNCTION 1 //Function layer diff --git a/keyboards/espectro/keymaps/mapdev/keymap.c b/keyboards/espectro/keymaps/mapdev/keymap.c index bbd791582..89d412b2d 100644 --- a/keyboards/espectro/keymaps/mapdev/keymap.c +++ b/keyboards/espectro/keymaps/mapdev/keymap.c @@ -15,7 +15,6 @@ #include QMK_KEYBOARD_H -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) #define _BL 0 //Base layer #define _FN1 1 //Function layer From 3054c7bda0dc68723f6402f9175ee11758ffc1b8 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Wed, 19 Dec 2018 08:23:28 -0800 Subject: [PATCH 721/788] Fix fc980c.h update (#4682) --- keyboards/fc980c/fc980c.h | 1 - 1 file changed, 1 deletion(-) diff --git a/keyboards/fc980c/fc980c.h b/keyboards/fc980c/fc980c.h index f20c102e5..ffb02e257 100644 --- a/keyboards/fc980c/fc980c.h +++ b/keyboards/fc980c/fc980c.h @@ -63,4 +63,3 @@ LAYOUT( ) */ -#endif From 40bf3a2ce9ec781cc2ff7218f909ffdbece44e97 Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Tue, 18 Dec 2018 16:17:29 -0500 Subject: [PATCH 722/788] Make `readPin` output a 0 or 1 when using AVR to match ChibiOS's version of `readPin` --- quantum/quantum.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quantum/quantum.h b/quantum/quantum.h index 0faf1af29..f78915fdf 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h @@ -161,7 +161,7 @@ extern uint32_t default_layer_state; } } - #define readPin(pin) (PIN_ADDRESS(pin, 0) & _BV(pin & 0xF)) + #define readPin(pin) ((bool)(PIN_ADDRESS(pin, 0) & _BV(pin & 0xF))) #elif defined(PROTOCOL_CHIBIOS) #define pin_t ioline_t #define setPinInput(pin) palSetLineMode(pin, PAL_MODE_INPUT) From fdeec296369c0995bad1117e50946b2df84f35e4 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Wed, 19 Dec 2018 08:39:24 -0800 Subject: [PATCH 723/788] Overhaul Unicode Common functionality (#4325) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Standardize the Unicode EEPROM code * Remove unicode init from process_record_* functions * Add unicode init to where it belongs: matrix_init_quantum * Move Unicode proccessing to unicode common * Add audio feedback to input mode keys to drive konstantin up a wall * Tap_code cleanup * Update keycodes * Update unicode documentation * Update unicode keycodes for consistency/easier merge * Add Audio Feedback section * Remove Functions from feature page And link to the file instead. Link to specific lines later on. * Fix spacing Co-Authored-By: drashna * Because I missed it! Co-Authored-By: drashna * Fix spacing Co-Authored-By: drashna * SPAAAAAAAAAACing Co-Authored-By: drashna * Add BSD for future compatibility * Thought I fixed that! Co-Authored-By: drashna * non-breaking Co-Authored-By: drashna * Considered that Co-Authored-By: drashna * Yuuup Co-Authored-By: drashna * consistency Co-Authored-By: drashna * white spaces .... copied from elsewhere Co-Authored-By: drashna * white spaces Co-Authored-By: drashna * white spaces Co-Authored-By: drashna * Update keycode defines * Fix Linux Song * Update all of the songs * Cleanup * Move and update check to ensure only one unicode method is enabled * Update quantum/quantum_keycodes.h * Update documentation * Wordsmithing and cleanup * Format unicode_common (#13) * case alignment * process_record_unicode_common → process_unicode_common * Move song arrays into function where they're used, align preprocessor directives * Swap the order of UC_WIN and UC_BSD * Update Unicode docs * Reorder Unicode mode stuff to match the order of input mode constants * Fix capitalization in doc subtitle * Readd BSD and OSX_RALT songs * Reword BSD note in docs * Readd BSD keycode description * Reword explanation of input on different platforms * Steal vomindoraan's input mode documentation Co-Authored-By: vomindoraan (vomindoraan@gmail.com) * Willingly give Drashna the rest of my Unicode doc improvements * Wordsmithing Co-Authored-By: drashna * remove merge artifacts * Unicode common cleanup (#17) * Standardize the Unicode EEPROM code * Remove unicode init from process_record_* functions * Add unicode init to where it belongs: matrix_init_quantum * Move Unicode proccessing to unicode common * Add audio feedback to input mode keys to drive konstantin up a wall * Tap_code cleanup * Update keycodes * Update unicode documentation * Update unicode keycodes for consistency/easier merge * Add Audio Feedback section * Remove Functions from feature page And link to the file instead. Link to specific lines later on. * Fix white spaces Co-Authored-By: drashna * Fix spacing Co-Authored-By: drashna * Because I missed it! Co-Authored-By: drashna * Fix spacing Co-Authored-By: drashna * SPAAAAAAAAAACing Co-Authored-By: drashna * white spaces Co-Authored-By: drashna * Add BSD for future compatibility * Thought I fixed that! Co-Authored-By: drashna * non-breaking Co-Authored-By: drashna * Considered that Co-Authored-By: drashna * Yuuup Co-Authored-By: drashna * consistency Co-Authored-By: drashna * white spaces .... copied from elsewhere Co-Authored-By: drashna * white spaces Co-Authored-By: drashna * white spaces Co-Authored-By: drashna * Update keycode defines * Fix Linux Song * Update all of the songs * Cleanup * Move and update check to ensure only one unicode method is enabled * Update quantum/quantum_keycodes.h * Update documentation * Wordsmithing and cleanup * Format unicode_common (#13) * case alignment * process_record_unicode_common → process_unicode_common * Move song arrays into function where they're used, align preprocessor directives * Swap the order of UC_WIN and UC_BSD * Update Unicode docs * Reorder Unicode mode stuff to match the order of input mode constants * Fix capitalization in doc subtitle * Readd BSD and OSX_RALT songs * Reword BSD note in docs * Readd BSD keycode description * Reword explanation of input on different platforms * Steal vomindoraan's input mode documentation Co-Authored-By: vomindoraan (vomindoraan@gmail.com) * Willingly give Drashna the rest of my Unicode doc improvements * Wordsmithing Co-Authored-By: drashna * Rearrange process_unicode_common functions * Make Unicode input mode constants (UC_*) an enum * Simplify unicode_input_start/finish code * Make the key used for WinCompose configurable * Remove UC_OSX_RALT in favor of setting the key with UNICODE_OSX_KEY * Update Unicode input mode doc * Add descriptions and rearrange definitions in process_unicode_common.h * Add registry command to Unicode docs + misc updates * Reword an explanation in Unicode docs * Add TODO comment * Remove trailing whitespace * Improve Cycling documentation * Add Unicode Input method Cycling support (#19) * Standardize the Unicode EEPROM code * Remove unicode init from process_record_* functions * Add unicode init to where it belongs: matrix_init_quantum * Move Unicode proccessing to unicode common * Add audio feedback to input mode keys to drive konstantin up a wall * Tap_code cleanup * Update keycodes * Update unicode documentation * Update unicode keycodes for consistency/easier merge * Add Audio Feedback section * Remove Functions from feature page And link to the file instead. Link to specific lines later on. * Fix white spaces Co-Authored-By: drashna * Fix spacing Co-Authored-By: drashna * Because I missed it! Co-Authored-By: drashna * Fix spacing Co-Authored-By: drashna * SPAAAAAAAAAACing Co-Authored-By: drashna * white spaces Co-Authored-By: drashna * Add BSD for future compatibility * Thought I fixed that! Co-Authored-By: drashna * non-breaking Co-Authored-By: drashna * Considered that Co-Authored-By: drashna * Yuuup Co-Authored-By: drashna * consistency Co-Authored-By: drashna * white spaces .... copied from elsewhere Co-Authored-By: drashna * white spaces Co-Authored-By: drashna * white spaces Co-Authored-By: drashna * Update keycode defines * Fix Linux Song * Update all of the songs * Cleanup * Move and update check to ensure only one unicode method is enabled * Update quantum/quantum_keycodes.h * Update documentation * Wordsmithing and cleanup * Format unicode_common (#13) * case alignment * process_record_unicode_common → process_unicode_common * Move song arrays into function where they're used, align preprocessor directives * Swap the order of UC_WIN and UC_BSD * Update Unicode docs * Reorder Unicode mode stuff to match the order of input mode constants * Fix capitalization in doc subtitle * Readd BSD and OSX_RALT songs * Reword BSD note in docs * Readd BSD keycode description * Reword explanation of input on different platforms * Steal vomindoraan's input mode documentation Co-Authored-By: vomindoraan (vomindoraan@gmail.com) * Willingly give Drashna the rest of my Unicode doc improvements * Wordsmithing Co-Authored-By: drashna * Rearrange process_unicode_common functions * Make Unicode input mode constants (UC_*) an enum * Simplify unicode_input_start/finish code * Make the key used for WinCompose configurable * Remove UC_OSX_RALT in favor of setting the key with UNICODE_OSX_KEY * Update Unicode input mode doc * Add descriptions and rearrange definitions in process_unicode_common.h * Add registry command to Unicode docs + misc updates * Reword an explanation in Unicode docs * Add TODO comment * Add cycle_unicode_input_mode and UNICODE_SELECTED_MODES macro * Add an option for making cycle changes persistent * Add debug prints to functions that change input_mode * Use cycle_unicode_input_mode in whitefox/konstantin * Add persist_unicode_input_mode function * Add offset to cycle to allow stepping in reverse * Add keycodes: UNICODE_MODE_FORWARD, UNICODE_MODE_REVERSE Aliases: UC_MOD, UC_RMOD (respectively) * REVERT ME: Undo changes to whitefox/konstantin to avoid conflicts * Fix wrong constant name * Revert "REVERT ME: Undo changes to whitefox/konstantin to avoid conflicts" This reverts commit 42676bf251fc8e3823f5e614dad6e510ba47a2f3. * Change dprintf text * Give selected modes priority over EEPROM when !UNICODE_CYCLE_PERSIST * Remove trailing whitespace * Cleanup of RALT code and unicode compilation stuff * Remove else for unicode handling --- docs/feature_unicode.md | 137 ++++++++---- .../whitefox/keymaps/konstantin/config.h | 4 + .../whitefox/keymaps/konstantin/keymap.c | 8 +- quantum/process_keycode/process_ucis.c | 2 - quantum/process_keycode/process_ucis.h | 5 +- quantum/process_keycode/process_unicode.c | 2 - quantum/process_keycode/process_unicode.h | 5 +- .../process_keycode/process_unicode_common.c | 198 ++++++++++++------ .../process_keycode/process_unicode_common.h | 68 ++++-- quantum/process_keycode/process_unicodemap.c | 5 +- quantum/process_keycode/process_unicodemap.h | 4 +- quantum/quantum.c | 19 +- quantum/quantum_keycodes.h | 21 +- 13 files changed, 321 insertions(+), 157 deletions(-) diff --git a/docs/feature_unicode.md b/docs/feature_unicode.md index c98a40228..1b083896a 100644 --- a/docs/feature_unicode.md +++ b/docs/feature_unicode.md @@ -1,28 +1,28 @@ # Unicode Support -There are three Unicode keymap definition method available in QMK: +There are three Unicode keymap definition methods available in QMK: ## UNICODE_ENABLE -Supports Unicode input up to 0xFFFF. The keycode function is `UC(n)` in keymap file, where *n* is a 4 digit hexadecimal. +Supports Unicode up to `0xFFFF`. The keycode function is `UC(n)` in the keymap file, where _n_ is a 4 digit hexadecimal number. ## UNICODEMAP_ENABLE -Supports Unicode up to 0xFFFFFFFF. You need to maintain a separate mapping table `const uint32_t PROGMEM unicode_map[] = {...}` in your keymap file. The keycode function is `X(n)` where *n* is the array index of the mapping table. +Supports Unicode up to `0x10FFFF` (all possible code points). You need to maintain a separate mapping table `const uint32_t PROGMEM unicode_map[] = {...}` in your keymap file. The keycode function is `X(n)`, where _n_ is an array index into the mapping table. And you may want to have an enum to make reference easier. So you'd want to add something like this to your keymap: ```c -enum unicode_name { - BANG, // ‽ - IRONY, // ⸮ - SNEK // snke 🐍 +enum unicode_names { + BANG, + IRONY, + SNEK, }; const uint32_t PROGMEM unicode_map[] = { - [BANG] = 0x0203D, // ‽ - [IRONY] = 0x02E2E, // ⸮ - [SNEK] = 0x1F40D // snke 🐍 + [BANG] = 0x203D, // ‽ + [IRONY] = 0x2E2E, // ⸮ + [SNEK] = 0x1F40D, // 🐍 }: ``` @@ -30,7 +30,7 @@ Make sure that the order for both matches. ## UCIS_ENABLE -Supports Unicode up to 0xFFFFFFFF. As with `UNICODE_MAP`, you may want to maintain a mapping table in your keymap file. However, there is no keycodes for this feature, you will have to add a keycode or function to call `qk_ucis_start()`. Once you've run that, you can just type the text for your unicode, and then hit space or enter to complete it, or ESC to cancel it. And if it matches an entry in your table, it will automatically "backspace" the trigger word (from your table) and then will input the unicode sequence. +Supports Unicode up to `0x10FFFF` (all possible code points). As with `UNICODEMAP`, you may want to maintain a mapping table in your keymap file. However, there are no built-in keycodes for this feature — you will have to add a keycode or function that calls `qk_ucis_start()`. Once it's been called, you can type the mnemonic for your character, then hit Space or Enter to complete it or Esc to cancel. If the mnemonic matches an entry in your table, the typed text will automatically be erased and the corresponding Unicode sequence inserted. For instance, you would need to have a table like this in your keymap: @@ -53,42 +53,103 @@ There are several functions that you can add to your keymap to customize the fun * `void qk_ucis_success(uint8_t symbol_index)` - This runs when the unicode input has matched something, and has completed. Default doesn't do anything. * `void qk_ucis_symbol_fallback (void)` - This runs if the input text doesn't match anything. The default function falls back to trying that input as a unicode code. -The default code for these are: +You can find the default implementations of these functions in [`process_ucis.c`](https://github.com/qmk/qmk_firmware/blob/master/quantum/process_keycode/process_ucis.c). + +## Input Modes + +Unicode input in QMK works by inputting a sequence of characters to the OS, sort of like a macro. Unfortunately, the way this is done differs for each platform. Specifically, each platform requires a different combination of keys to trigger Unicode input. Therefore, a corresponding input mode has to be set in QMK. + +The following input modes are available: + +* **`UC_OSX`**: Mac OS X built-in Unicode hex input. Supports code points up to `0xFFFF` (`0x10FFFF` with `UNICODEMAP`). + + To enable, go to _System Preferences > Keyboard > Input Sources_, add _Unicode Hex Input_ to the list (it's under _Other_), then activate it from the input dropdown in the Menu Bar. + By default, this mode uses the left Option key (`KC_LALT`), but this can be changed by defining [`UNICODE_OSX_KEY`](#input-key-configuration) with another keycode. + +* **`UC_LNX`**: Linux built-in IBus Unicode input. Supports all possible code points (`0x10FFFF`). + + Enabled by default and works almost anywhere on IBus-enabled distros. Without IBus, this mode works under GTK apps, but rarely anywhere else. + +* **`UC_WIN`**: _(not recommended)_ Windows built-in hex numpad Unicode input. Supports code points up to `0xFFFF`. + + To enable, create a registry key under `HKEY_CURRENT_USER\Control Panel\Input Method\EnableHexNumpad` of type `REG_SZ` called `EnableHexNumpad` and set its value to `1`. This can be done from the Command Prompt by running `reg add "HKCU\Control Panel\Input Method" -v EnableHexNumpad -t REG_SZ -d 1` with administrator privileges. Afterwards, reboot. + This mode is not recommended because of reliability and compatibility issues; use the `UC_WINC` mode instead. + +* **`UC_BSD`**: _(non implemented)_ Unicode input under BSD. Not implemented at this time. If you're a BSD user and want to help add support for it, please [open an issue on GitHub](https://github.com/qmk/qmk_firmware/issues). + +* **`UC_WINC`**: Windows Unicode input using [WinCompose](https://github.com/samhocevar/wincompose). As of v0.8.2, supports code points up to `0xFFFFF`. + + To enable, install the [latest release](https://github.com/samhocevar/wincompose/releases/latest). Once installed, WinCompose will automatically run on startup. Works reliably under all version of Windows supported by the app. + By default, this mode uses the right Alt key (`KC_RALT`), but this can be changed in the WinCompose settings and by defining [`UNICODE_WINC_KEY`](#input-key-configuration) with another keycode. + +### Switching Input Modes + +There are two ways to set the input mode for Unicode: by keycode or by function. Keep in mind that both methods write to persistent storage (EEPROM), and are loaded each time the keyboard starts. So once you've set it the first time, you don't need to set it again unless you want to change it, or you've reset the EEPROM settings. + +You can switch the input mode at any time by using one of the following keycodes. The easiest way is to add the ones you use to your keymap. + +|Keycode |Alias |Input mode |Description | +|-----------------------|---------|-------------|-----------------------------------------| +|`UNICODE_MODE_FORWARD` |`UC_MOD` | |Cycles forwards through the available modes. [(Disabled by default)](#input-method-cycling)| +|`UNICODE_MODE_REVERSE` |`UC_RMOD`| |Cycles forwards through the available modes. [(Disabled by default)](#input-method-cycling)| +|`UNICODE_MODE_OSX` |`UC_M_OS`|`UC_OSX` |Switch to Mac OS X input. | +|`UNICODE_MODE_LNX` |`UC_M_LN`|`UC_LNX` |Switch to Linux input. | +|`UNICODE_MODE_WIN` |`UC_M_WI`|`UC_WIN` |Switch to Windows input. | +|`UNICODE_MODE_BSD` |`UC_M_BS`|`UC_BSD` |Switch to BSD input (not implemented). | +|`UNICODE_MODE_WINC` |`UC_M_WC`|`UC_WINC` |Switch to Windows input using WinCompose.| + +You can also switch the input mode by calling `set_unicode_input_mode(x)` in your code, where _x_ is one of the above input mode constants (e.g. `UC_LNX`). Since the function only needs to be called once, it's recommended that you do it in `eeconfig_init_user` (or a similar function). For example: ```c -void qk_ucis_start_user(void) { // outputs keyboard emoji - unicode_input_start(); - register_hex(0x2328); - unicode_input_finish(); -} - -void qk_ucis_success(uint8_t symbol_index) { -} - -void qk_ucis_symbol_fallback (void) { // falls back to manual unicode entry - for (uint8_t i = 0; i < qk_ucis_state.count - 1; i++) { - uint8_t code = qk_ucis_state.codes[i]; - register_code(code); - unregister_code(code); - wait_ms(UNICODE_TYPE_DELAY); - } +void eeconfig_init_user(void) { + set_unicode_input_mode(UC_LNX); } ``` -## Unicode Input methods +### Audio Feedback -Unicode input in QMK works by inputting a sequence of characters to the OS, -sort of like macro. Unfortunately, each OS has different ideas on how Unicode is input. +If you have the [Audio feature](feature_audio.md) enabled on the board, you can set melodies to be played when you press the above keys. That way you can have some audio feedback when switching input modes. -This is the current list of Unicode input method in QMK: +For instance, you can add these definitions to your `config.h` file: -* __UC_OSX__: MacOS Unicode Hex Input support. Works only up to 0xFFFF. Disabled by default. To enable: go to System Preferences -> Keyboard -> Input Sources, and enable Unicode Hex. -* __UC_OSX_RALT__: Same as UC_OSX, but sends the Right Alt key for unicode input -* __UC_LNX__: Unicode input method under Linux. Works up to 0xFFFFF. Should work almost anywhere on ibus enabled distros. Without ibus, this works under GTK apps, but rarely anywhere else. -* __UC_WIN__: (not recommended) Windows built-in Unicode input. To enable: create registry key under `HKEY_CURRENT_USER\Control Panel\Input Method\EnableHexNumpad` of type `REG_SZ` called `EnableHexNumpad`, set its value to 1, and reboot. This method is not recommended because of reliability and compatibility issue, use WinCompose method below instead. -* __UC_WINC__: Windows Unicode input using WinCompose. Requires [WinCompose](https://github.com/samhocevar/wincompose). Works reliably under many (all?) variations of Windows. +```c +#define UNICODE_SONG_OSX COIN_SOUND +#define UNICODE_SONG_LNX UNICODE_LINUX +#define UNICODE_SONG_BSD MARIO_GAMEOVER +#define UNICODE_SONG_WIN UNICODE_WINDOWS +#define UNICODE_SONG_WINC UNICODE_WINDOWS +``` -At some point, you need to call `set_unicode_input_mode(x)` to set the correct unicode method. This sets the method that is used to send the unicode, and stores it in EEPROM, so you only need to call this once. +### Additional Customization + +Because Unicode is such a large and variable feature, there are a number of options that you can customize to work better on your system. + +#### Start and Finish input functions + +The functions for starting and finishing Unicode input on your platform can be overridden locally. Possible uses include customizing input mode behavior if you don't use the default keys, or adding extra visual/audio feedback to Unicode input. + +* `void unicode_input_start(void)` – This sends the initial sequence that tells your platform to enter Unicode input mode. For example, it presses Ctrl+Shift+U on Linux and holds the Option key on Mac. +* `void unicode_input_finish(void)` – This is called to exit Unicode input mode, for example by pressing Space or releasing the Option key. + +You can find the default implementations of these functions in [`process_unicode_common.c`](https://github.com/qmk/qmk_firmware/blob/master/quantum/process_keycode/process_unicode_common.c). + + +#### Input Key Configuration + +Additionally, you can customize the keys used to trigger the unicode input for macOS and WinCompose by adding defines to your `config.h` + +```c +#define UNICODE_OSX_KEY KC_LALT +#define UNICODE_WINC_KEY KC_RALT +``` + +#### Input Method Cycling + +Also, you can choose which input methods are availble for cycling through. By default, this is disabled. But if you want to enabled it, then limiting it to just those modes makes sense. Note that `UNICODE_SELECTED_MODES` define is comma delimited. + +```c +#define UNICODE_SELECTED_MODES UC_OSX, UC_LNX, UC_WIN, UC_BSD, UC_WINC +``` ## `send_unicode_hex_string` diff --git a/keyboards/whitefox/keymaps/konstantin/config.h b/keyboards/whitefox/keymaps/konstantin/config.h index ee30dbece..ab920a50b 100644 --- a/keyboards/whitefox/keymaps/konstantin/config.h +++ b/keyboards/whitefox/keymaps/konstantin/config.h @@ -21,3 +21,7 @@ #define PERMISSIVE_HOLD #define TAPPING_TERM 200 #define TAPPING_TOGGLE 2 + +#define UNICODE_CYCLE_PERSIST false +#define UNICODE_SELECTED_MODES UC_WINC, UC_LNX +#define UNICODE_WINC_KEY KC_RGUI diff --git a/keyboards/whitefox/keymaps/konstantin/keymap.c b/keyboards/whitefox/keymaps/konstantin/keymap.c index 55db5ca6b..54777cfe0 100644 --- a/keyboards/whitefox/keymaps/konstantin/keymap.c +++ b/keyboards/whitefox/keymaps/konstantin/keymap.c @@ -23,10 +23,6 @@ #define DIVIDE UC(0x00F7) #define MINUS UC(0x2212) -void eeconfig_init_user(void) { - set_unicode_input_mode(UC_WINC); -} - enum layers { L_BASE, L_FN, @@ -162,7 +158,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ * │ │F1 │F2 │F3 │F4 │F5 │F6 │F7 │F8 │F9 │F10│F11│F12│Num│Scr│Pau│ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┼───┤ - * │ M4 │M2 │M↑ │M1 │M3 │M5 │ │ │ │Stp│Ply│Prv│Nxt│Clear│Ins│ + * │ M4 │M2 │M↑ │M1 │M3 │M5 │ │UCM│ │Stp│Ply│Prv│Nxt│Clear│Ins│ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤ * │ │M← │M↓ │M→ │MW↑│ │ │ │ │ │ │ │ │Top│ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤ @@ -173,7 +169,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [L_FN] = LAYOUT_truefox( \ _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, NUMPAD, KC_SLCK, KC_PAUS, \ - KC_BTN4, KC_BTN2, KC_MS_U, KC_BTN1, KC_BTN3, KC_BTN5, _______, _______, _______, KC_MSTP, KC_MPLY, KC_MPRV, KC_MNXT, CLEAR, KC_INS, \ + KC_BTN4, KC_BTN2, KC_MS_U, KC_BTN1, KC_BTN3, KC_BTN5, _______, UC_MOD, _______, KC_MSTP, KC_MPLY, KC_MPRV, KC_MNXT, CLEAR, KC_INS, \ _______, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_U, _______, _______, _______, _______, _______, _______, _______, _______, TOP, \ _______, KC_ACL0, KC_ACL2, KC_WH_L, KC_WH_R, _______, _______, _______, KC_VOLD, KC_VOLU, KC_MUTE, KC_APP, KC_PGUP, BOTTOM, \ _______, DESKTOP, DSKTP_L, KC_WH_D, DSKTP_R, _______, KC_HOME, KC_PGDN, KC_END \ diff --git a/quantum/process_keycode/process_ucis.c b/quantum/process_keycode/process_ucis.c index 8deb24a86..5de2e41fc 100644 --- a/quantum/process_keycode/process_ucis.c +++ b/quantum/process_keycode/process_ucis.c @@ -95,8 +95,6 @@ void register_ucis(const char *hex) { bool process_ucis (uint16_t keycode, keyrecord_t *record) { uint8_t i; - unicode_input_mode_init(); - if (!qk_ucis_state.in_progress) return true; diff --git a/quantum/process_keycode/process_ucis.h b/quantum/process_keycode/process_ucis.h index d4aa34cde..b114d839a 100644 --- a/quantum/process_keycode/process_ucis.h +++ b/quantum/process_keycode/process_ucis.h @@ -14,8 +14,7 @@ * along with this program. If not, see . */ -#ifndef PROCESS_UCIS_H -#define PROCESS_UCIS_H +#pragma once #include "quantum.h" #include "process_unicode_common.h" @@ -48,5 +47,3 @@ void qk_ucis_symbol_fallback (void); void qk_ucis_success(uint8_t symbol_index); void register_ucis(const char *hex); bool process_ucis (uint16_t keycode, keyrecord_t *record); - -#endif diff --git a/quantum/process_keycode/process_unicode.c b/quantum/process_keycode/process_unicode.c index f39c4a36e..19beb8452 100644 --- a/quantum/process_keycode/process_unicode.c +++ b/quantum/process_keycode/process_unicode.c @@ -20,11 +20,9 @@ bool process_unicode(uint16_t keycode, keyrecord_t *record) { if (keycode > QK_UNICODE && record->event.pressed) { uint16_t unicode = keycode & 0x7FFF; - unicode_input_mode_init(); unicode_input_start(); register_hex(unicode); unicode_input_finish(); } return true; } - diff --git a/quantum/process_keycode/process_unicode.h b/quantum/process_keycode/process_unicode.h index c525b74f0..0913e9910 100644 --- a/quantum/process_keycode/process_unicode.h +++ b/quantum/process_keycode/process_unicode.h @@ -13,12 +13,9 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#ifndef PROCESS_UNICODE_H -#define PROCESS_UNICODE_H +#pragma once #include "quantum.h" #include "process_unicode_common.h" bool process_unicode(uint16_t keycode, keyrecord_t *record); - -#endif diff --git a/quantum/process_keycode/process_unicode_common.c b/quantum/process_keycode/process_unicode_common.c index 4285d20a1..3286f45b5 100644 --- a/quantum/process_keycode/process_unicode_common.c +++ b/quantum/process_keycode/process_unicode_common.c @@ -16,98 +16,111 @@ #include "process_unicode_common.h" #include "eeprom.h" -#include #include +#include -static uint8_t input_mode; -uint8_t mods; +unicode_config_t unicode_config; +#if UNICODE_SELECTED_MODES != -1 +static uint8_t selected[] = { UNICODE_SELECTED_MODES }; +static uint8_t selected_count = sizeof selected / sizeof *selected; +static uint8_t selected_index; +#endif -void set_unicode_input_mode(uint8_t os_target) { - input_mode = os_target; - eeprom_update_byte(EECONFIG_UNICODEMODE, os_target); +void unicode_input_mode_init(void) { + unicode_config.raw = eeprom_read_byte(EECONFIG_UNICODEMODE); +#if UNICODE_SELECTED_MODES != -1 + #if UNICODE_CYCLE_PERSIST + // Find input_mode in selected modes + uint8_t i; + for (i = 0; i < selected_count; i++) { + if (selected[i] == unicode_config.input_mode) { + selected_index = i; + break; + } + } + if (i == selected_count) { + // Not found: input_mode isn't selected, change to one that is + unicode_config.input_mode = selected[selected_index = 0]; + } + #else + // Always change to the first selected input mode + unicode_config.input_mode = selected[selected_index = 0]; + #endif +#endif + dprintf("Unicode input mode init to: %u\n", unicode_config.input_mode); } uint8_t get_unicode_input_mode(void) { - return input_mode; + return unicode_config.input_mode; } -void unicode_input_mode_init(void) { - static bool first_flag = false; - if (!first_flag) { - input_mode = eeprom_read_byte(EECONFIG_UNICODEMODE); - first_flag = true; - } +void set_unicode_input_mode(uint8_t mode) { + unicode_config.input_mode = mode; + persist_unicode_input_mode(); + dprintf("Unicode input mode set to: %u\n", unicode_config.input_mode); } +void cycle_unicode_input_mode(uint8_t offset) { +#if UNICODE_SELECTED_MODES != -1 + selected_index = (selected_index + offset) % selected_count; + unicode_config.input_mode = selected[selected_index]; + #if UNICODE_CYCLE_PERSIST + persist_unicode_input_mode(); + #endif + dprintf("Unicode input mode cycle to: %u\n", unicode_config.input_mode); +#endif +} + +void persist_unicode_input_mode(void) { + eeprom_update_byte(EECONFIG_UNICODEMODE, unicode_config.input_mode); +} + +static uint8_t saved_mods; + __attribute__((weak)) -void unicode_input_start (void) { - // save current mods - mods = keyboard_report->mods; +void unicode_input_start(void) { + saved_mods = get_mods(); // Save current mods + clear_mods(); // Unregister mods to start from a clean state - // unregister all mods to start from clean state - if (mods & MOD_BIT(KC_LSFT)) unregister_code(KC_LSFT); - if (mods & MOD_BIT(KC_RSFT)) unregister_code(KC_RSFT); - if (mods & MOD_BIT(KC_LCTL)) unregister_code(KC_LCTL); - if (mods & MOD_BIT(KC_RCTL)) unregister_code(KC_RCTL); - if (mods & MOD_BIT(KC_LALT)) unregister_code(KC_LALT); - if (mods & MOD_BIT(KC_RALT)) unregister_code(KC_RALT); - if (mods & MOD_BIT(KC_LGUI)) unregister_code(KC_LGUI); - if (mods & MOD_BIT(KC_RGUI)) unregister_code(KC_RGUI); - - switch(input_mode) { + switch (unicode_config.input_mode) { case UC_OSX: - register_code(KC_LALT); - break; - case UC_OSX_RALT: - register_code(KC_RALT); + register_code(UNICODE_OSX_KEY); break; case UC_LNX: register_code(KC_LCTL); register_code(KC_LSFT); - register_code(KC_U); - unregister_code(KC_U); + tap_code(KC_U); // TODO: Replace with tap_code16(LCTL(LSFT(KC_U))); and test unregister_code(KC_LSFT); unregister_code(KC_LCTL); break; case UC_WIN: register_code(KC_LALT); - register_code(KC_PPLS); - unregister_code(KC_PPLS); + tap_code(KC_PPLS); break; case UC_WINC: - register_code(KC_RALT); - unregister_code(KC_RALT); - register_code(KC_U); - unregister_code(KC_U); + tap_code(UNICODE_WINC_KEY); + tap_code(KC_U); + break; } + wait_ms(UNICODE_TYPE_DELAY); } __attribute__((weak)) -void unicode_input_finish (void) { - switch(input_mode) { - case UC_OSX: - case UC_WIN: - unregister_code(KC_LALT); - break; - case UC_OSX_RALT: - unregister_code(KC_RALT); - break; - case UC_LNX: - register_code(KC_SPC); - unregister_code(KC_SPC); - break; +void unicode_input_finish(void) { + switch (unicode_config.input_mode) { + case UC_OSX: + unregister_code(UNICODE_OSX_KEY); + break; + case UC_LNX: + tap_code(KC_SPC); + break; + case UC_WIN: + unregister_code(KC_LALT); + break; } - // reregister previously set mods - if (mods & MOD_BIT(KC_LSFT)) register_code(KC_LSFT); - if (mods & MOD_BIT(KC_RSFT)) register_code(KC_RSFT); - if (mods & MOD_BIT(KC_LCTL)) register_code(KC_LCTL); - if (mods & MOD_BIT(KC_RCTL)) register_code(KC_RCTL); - if (mods & MOD_BIT(KC_LALT)) register_code(KC_LALT); - if (mods & MOD_BIT(KC_RALT)) register_code(KC_RALT); - if (mods & MOD_BIT(KC_LGUI)) register_code(KC_LGUI); - if (mods & MOD_BIT(KC_RGUI)) register_code(KC_RGUI); + set_mods(saved_mods); // Reregister previously set mods } __attribute__((weak)) @@ -124,13 +137,12 @@ uint16_t hex_to_keycode(uint8_t hex) { void register_hex(uint16_t hex) { for(int i = 3; i >= 0; i--) { uint8_t digit = ((hex >> (i*4)) & 0xF); - register_code(hex_to_keycode(digit)); - unregister_code(hex_to_keycode(digit)); + tap_code(hex_to_keycode(digit)); } } void send_unicode_hex_string(const char *str) { - if (!str) { return; } // Safety net + if (!str) { return; } while (*str) { // Find the next code point (token) in the string @@ -153,3 +165,61 @@ void send_unicode_hex_string(const char *str) { str += n; // Move to the first ' ' (or '\0') after the current token } } + +bool process_unicode_common(uint16_t keycode, keyrecord_t *record) { + if (record->event.pressed) { + switch (keycode) { + case UNICODE_MODE_FORWARD: + cycle_unicode_input_mode(+1); + break; + case UNICODE_MODE_REVERSE: + cycle_unicode_input_mode(-1); + break; + + case UNICODE_MODE_OSX: + set_unicode_input_mode(UC_OSX); +#if defined(AUDIO_ENABLE) && defined(UNICODE_SONG_OSX) + static float song_osx[][2] = UNICODE_SONG_OSX; + PLAY_SONG(song_osx); +#endif + break; + case UNICODE_MODE_LNX: + set_unicode_input_mode(UC_LNX); +#if defined(AUDIO_ENABLE) && defined(UNICODE_SONG_LNX) + static float song_lnx[][2] = UNICODE_SONG_LNX; + PLAY_SONG(song_lnx); +#endif + break; + case UNICODE_MODE_WIN: + set_unicode_input_mode(UC_WIN); +#if defined(AUDIO_ENABLE) && defined(UNICODE_SONG_WIN) + static float song_win[][2] = UNICODE_SONG_WIN; + PLAY_SONG(song_win); +#endif + break; + case UNICODE_MODE_BSD: + set_unicode_input_mode(UC_BSD); +#if defined(AUDIO_ENABLE) && defined(UNICODE_SONG_BSD) + static float song_bsd[][2] = UNICODE_SONG_BSD; + PLAY_SONG(song_bsd); +#endif + break; + case UNICODE_MODE_WINC: + set_unicode_input_mode(UC_WINC); +#if defined(AUDIO_ENABLE) && defined(UNICODE_SONG_WINC) + static float song_winc[][2] = UNICODE_SONG_WINC; + PLAY_SONG(song_winc); +#endif + break; + } + } +#if defined(UNICODE_ENABLE) + return process_unicode(keycode, record); +#elif defined(UNICODEMAP_ENABLE) + return process_unicode_map(keycode, record); +#elif defined(UCIS_ENABLE) + return process_ucis(keycode, record); +#else + return true; +#endif +} diff --git a/quantum/process_keycode/process_unicode_common.h b/quantum/process_keycode/process_unicode_common.h index e78e1cec6..e608ab76b 100644 --- a/quantum/process_keycode/process_unicode_common.h +++ b/quantum/process_keycode/process_unicode_common.h @@ -14,35 +14,71 @@ * along with this program. If not, see . */ -#ifndef PROCESS_UNICODE_COMMON_H -#define PROCESS_UNICODE_COMMON_H +#pragma once #include "quantum.h" -#ifndef UNICODE_TYPE_DELAY -#define UNICODE_TYPE_DELAY 10 +#if defined(UNICODE_ENABLE) + defined(UNICODEMAP_ENABLE) + defined(UCIS_ENABLE) > 1 + #error "Cannot enable more than one Unicode method (UNICODE, UNICODEMAP, UCIS) at the same time" #endif -__attribute__ ((unused)) -static uint8_t input_mode; +// Keycodes used for starting Unicode input on different platforms +#ifndef UNICODE_OSX_KEY + #define UNICODE_OSX_KEY KC_LALT +#endif +#ifndef UNICODE_WINC_KEY + #define UNICODE_WINC_KEY KC_RALT +#endif + +// Comma-delimited, ordered list of input modes selected for use (e.g. in cycle) +// Example: #define UNICODE_SELECTED_MODES UC_WINC, UC_LNX +#ifndef UNICODE_SELECTED_MODES + #define UNICODE_SELECTED_MODES -1 +#endif + +// Whether input mode changes in cycle should be written to EEPROM +#ifndef UNICODE_CYCLE_PERSIST + #define UNICODE_CYCLE_PERSIST true +#endif + +// Delay between starting Unicode input and sending a sequence, in ms +#ifndef UNICODE_TYPE_DELAY + #define UNICODE_TYPE_DELAY 10 +#endif + +enum unicode_input_modes { + UC_OSX, // Mac OS X using Unicode Hex Input + UC_LNX, // Linux using IBus + UC_WIN, // Windows using EnableHexNumpad + UC_BSD, // BSD (not implemented) + UC_WINC, // Windows using WinCompose (https://github.com/samhocevar/wincompose) + UC__COUNT // Number of available input modes (always leave at the end) +}; + +typedef union { + uint32_t raw; + struct { + uint8_t input_mode : 8; + }; +} unicode_config_t; + +extern unicode_config_t unicode_config; -void set_unicode_input_mode(uint8_t os_target); -uint8_t get_unicode_input_mode(void); void unicode_input_mode_init(void); +uint8_t get_unicode_input_mode(void); +void set_unicode_input_mode(uint8_t mode); +void cycle_unicode_input_mode(uint8_t offset); +void persist_unicode_input_mode(void); + void unicode_input_start(void); void unicode_input_finish(void); + void register_hex(uint16_t hex); void send_unicode_hex_string(const char *str); -#define UC_OSX 0 // Mac OS X -#define UC_LNX 1 // Linux -#define UC_WIN 2 // Windows 'HexNumpad' -#define UC_BSD 3 // BSD (not implemented) -#define UC_WINC 4 // WinCompose https://github.com/samhocevar/wincompose -#define UC_OSX_RALT 5 // Mac OS X using Right Alt key for Unicode Compose +bool process_unicode_common(uint16_t keycode, keyrecord_t *record); #define UC_BSPC UC(0x0008) - #define UC_SPC UC(0x0020) #define UC_EXLM UC(0x0021) @@ -147,5 +183,3 @@ void send_unicode_hex_string(const char *str); #define UC_RCBR UC(0x007D) #define UC_TILD UC(0x007E) #define UC_DEL UC(0x007F) - -#endif diff --git a/quantum/process_keycode/process_unicodemap.c b/quantum/process_keycode/process_unicodemap.c index ab5717ba3..75f35112b 100644 --- a/quantum/process_keycode/process_unicodemap.c +++ b/quantum/process_keycode/process_unicodemap.c @@ -45,13 +45,12 @@ __attribute__((weak)) void unicode_map_input_error() {} bool process_unicode_map(uint16_t keycode, keyrecord_t *record) { - unicode_input_mode_init(); uint8_t input_mode = get_unicode_input_mode(); if ((keycode & QK_UNICODE_MAP) == QK_UNICODE_MAP && record->event.pressed) { const uint32_t* map = unicode_map; uint16_t index = keycode - QK_UNICODE_MAP; uint32_t code = pgm_read_dword(&map[index]); - if (code > 0xFFFF && code <= 0x10ffff && (input_mode == UC_OSX || input_mode == UC_OSX_RALT)) { + if (code > 0xFFFF && code <= 0x10ffff && input_mode == UC_OSX) { // Convert to UTF-16 surrogate pair code -= 0x10000; uint32_t lo = code & 0x3ff; @@ -60,7 +59,7 @@ bool process_unicode_map(uint16_t keycode, keyrecord_t *record) { register_hex32(hi + 0xd800); register_hex32(lo + 0xdc00); unicode_input_finish(); - } else if ((code > 0x10ffff && (input_mode == UC_OSX || input_mode == UC_OSX_RALT)) || (code > 0xFFFFF && input_mode == UC_LNX)) { + } else if ((code > 0x10ffff && input_mode == UC_OSX) || (code > 0xFFFFF && input_mode == UC_LNX)) { // when character is out of range supported by the OS unicode_map_input_error(); } else { diff --git a/quantum/process_keycode/process_unicodemap.h b/quantum/process_keycode/process_unicodemap.h index 929c88c0b..f6d64bb86 100644 --- a/quantum/process_keycode/process_unicodemap.h +++ b/quantum/process_keycode/process_unicodemap.h @@ -14,12 +14,10 @@ * along with this program. If not, see . */ -#ifndef PROCESS_UNICODEMAP_H -#define PROCESS_UNICODEMAP_H +#pragma once #include "quantum.h" #include "process_unicode_common.h" void unicode_map_input_error(void); bool process_unicode_map(uint16_t keycode, keyrecord_t *record); -#endif diff --git a/quantum/quantum.c b/quantum/quantum.c index a57d4f89f..85db100ab 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -243,7 +243,7 @@ bool process_record_quantum(keyrecord_t *record) { process_key_lock(&keycode, record) && #endif #if defined(AUDIO_ENABLE) && defined(AUDIO_CLICKY) - process_clicky(keycode, record) && + process_clicky(keycode, record) && #endif //AUDIO_CLICKY process_record_kb(keycode, record) && #if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_KEYPRESSES) @@ -258,33 +258,27 @@ bool process_record_quantum(keyrecord_t *record) { #ifdef STENO_ENABLE process_steno(keycode, record) && #endif - #if ( defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_BASIC))) && !defined(NO_MUSIC_MODE) + #if (defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_BASIC))) && !defined(NO_MUSIC_MODE) process_music(keycode, record) && #endif #ifdef TAP_DANCE_ENABLE process_tap_dance(keycode, record) && #endif + #if defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE) + process_unicode_common(keycode, record) && + #endif #ifdef LEADER_ENABLE process_leader(keycode, record) && #endif #ifdef COMBO_ENABLE process_combo(keycode, record) && #endif - #ifdef UNICODE_ENABLE - process_unicode(keycode, record) && - #endif - #ifdef UCIS_ENABLE - process_ucis(keycode, record) && - #endif #ifdef PRINTING_ENABLE process_printer(keycode, record) && #endif #ifdef AUTO_SHIFT_ENABLE process_auto_shift(keycode, record) && #endif - #ifdef UNICODEMAP_ENABLE - process_unicode_map(keycode, record) && - #endif #ifdef TERMINAL_ENABLE process_terminal(keycode, record) && #endif @@ -1010,6 +1004,9 @@ void matrix_init_quantum() { #ifdef ENCODER_ENABLE encoder_init(); #endif + #if defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE) + unicode_input_mode_init(); + #endif matrix_init_kb(); } diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h index 283b4a65c..2b309f4d5 100644 --- a/quantum/quantum_keycodes.h +++ b/quantum/quantum_keycodes.h @@ -81,9 +81,6 @@ enum quantum_keycodes { #endif QK_MOD_TAP = 0x6000, QK_MOD_TAP_MAX = 0x7FFF, -#if defined(UNICODEMAP_ENABLE) && defined(UNICODE_ENABLE) - #error "Cannot enable both UNICODEMAP && UNICODE" -#endif #ifdef UNICODE_ENABLE QK_UNICODE = 0x8000, QK_UNICODE_MAX = 0xFFFF, @@ -456,6 +453,15 @@ enum quantum_keycodes { EEPROM_RESET, + UNICODE_MODE_FORWARD, + UNICODE_MODE_REVERSE, + + UNICODE_MODE_OSX, + UNICODE_MODE_LNX, + UNICODE_MODE_WIN, + UNICODE_MODE_BSD, + UNICODE_MODE_WINC, + // always leave at the end SAFE_RANGE }; @@ -684,6 +690,15 @@ enum quantum_keycodes { #define X(n) (QK_UNICODE_MAP | (n)) #endif +#define UC_MOD UNICODE_MODE_FORWARD +#define UC_RMOD UNICODE_MODE_REVERSE + +#define UC_M_OS UNICODE_MODE_OSX +#define UC_M_LN UNICODE_MODE_LNX +#define UC_M_WI UNICODE_MODE_WIN +#define UC_M_BS UNICODE_MODE_BSD +#define UC_M_WC UNICODE_MODE_WINC + #ifdef SWAP_HANDS_ENABLE #define SH_T(kc) (QK_SWAP_HANDS | (kc)) #define SH_TG (QK_SWAP_HANDS | OP_SH_TOGGLE) From df33618b26bb7ff0c0eff619b2d638490c514ce4 Mon Sep 17 00:00:00 2001 From: yiancar Date: Wed, 19 Dec 2018 13:56:44 +0000 Subject: [PATCH 724/788] Minor STM32 i2c driver cleanup --- drivers/arm/i2c_master.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/drivers/arm/i2c_master.c b/drivers/arm/i2c_master.c index ab962ea95..4417dc985 100644 --- a/drivers/arm/i2c_master.c +++ b/drivers/arm/i2c_master.c @@ -45,8 +45,6 @@ static const I2CConfig i2cconfig = { __attribute__ ((weak)) void i2c_init(void) { - //palSetGroupMode(GPIOB, GPIOB_PIN6 | GPIOB_PIN7, 0, PAL_MODE_INPUT); - // Try releasing special pins for a short time palSetPadMode(GPIOB, 6, PAL_MODE_INPUT); palSetPadMode(GPIOB, 7, PAL_MODE_INPUT); From b13162f7fd5a4c09dff15ff6f9713526622925a7 Mon Sep 17 00:00:00 2001 From: yiancar Date: Wed, 19 Dec 2018 13:59:58 +0000 Subject: [PATCH 725/788] Also fix use of weak stm32 internal pullup --- drivers/arm/i2c_master.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/arm/i2c_master.c b/drivers/arm/i2c_master.c index 4417dc985..385bd97cb 100644 --- a/drivers/arm/i2c_master.c +++ b/drivers/arm/i2c_master.c @@ -51,8 +51,8 @@ void i2c_init(void) chThdSleepMilliseconds(10); - palSetPadMode(GPIOB, 6, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUPDR_PULLUP); - palSetPadMode(GPIOB, 7, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUPDR_PULLUP); + palSetPadMode(GPIOB, 6, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN); + palSetPadMode(GPIOB, 7, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN); //i2cInit(); //This is invoked by halInit() so no need to redo it. } From 5eb8f3f6b51cecc067aaedfb8b2f08cb626381bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ismael=20Venegas=20Castell=C3=B3?= Date: Wed, 19 Dec 2018 18:49:56 -0600 Subject: [PATCH 726/788] Keymap: Refactor Hacker Dvorak (#4688) Programmer Dvorak based layout for the Ergodox EZ. --- .../ergodox_ez/keymaps/hacker_dvorak/config.h | 50 +- .../keymaps/hacker_dvorak/default.png.md | 1 - .../hacker_dvorak/default_highres.png.md | 1 - .../keymaps/hacker_dvorak/gulpfile.js | 10 +- .../keymaps/hacker_dvorak/hacker_dvorak.c | 353 ++++++++ .../keycodes/aliases_definitions.c | 5 + .../hacker_dvorak/keycodes/custom_keycodes.c | 8 + .../ergodox_ez/keymaps/hacker_dvorak/keymap.c | 800 +----------------- .../hacker_dvorak/layers/layers_definitions.c | 12 + .../hacker_dvorak/leader/leader_dictionary.c | 14 + .../hacker_dvorak/leader/leader_setup.c | 14 + .../hacker_dvorak/plover/plover_mode.c | 20 + .../keymaps/hacker_dvorak/readme.md | 10 +- .../ergodox_ez/keymaps/hacker_dvorak/rules.mk | 33 +- .../mod_tap_layer_dances/none_lead.c | 40 + .../tap_dance/tap_dance_actions.c | 20 + .../hacker_dvorak/tap_dance/tap_dance_setup.c | 75 ++ .../hacker_dvorak/tap_dance/tap_dances.c | 74 ++ .../hacker_dvorak/user/eeconfig_init_user.c | 3 + .../hacker_dvorak/user/layer_set_state_user.c | 121 +++ .../hacker_dvorak/user/matrix_scan_user.c | 12 + .../hacker_dvorak/user/process_record_user.c | 75 ++ 22 files changed, 925 insertions(+), 826 deletions(-) delete mode 100644 keyboards/ergodox_ez/keymaps/hacker_dvorak/default.png.md delete mode 100644 keyboards/ergodox_ez/keymaps/hacker_dvorak/default_highres.png.md create mode 100644 keyboards/ergodox_ez/keymaps/hacker_dvorak/hacker_dvorak.c create mode 100644 keyboards/ergodox_ez/keymaps/hacker_dvorak/keycodes/aliases_definitions.c create mode 100644 keyboards/ergodox_ez/keymaps/hacker_dvorak/keycodes/custom_keycodes.c create mode 100644 keyboards/ergodox_ez/keymaps/hacker_dvorak/layers/layers_definitions.c create mode 100644 keyboards/ergodox_ez/keymaps/hacker_dvorak/leader/leader_dictionary.c create mode 100644 keyboards/ergodox_ez/keymaps/hacker_dvorak/leader/leader_setup.c create mode 100644 keyboards/ergodox_ez/keymaps/hacker_dvorak/plover/plover_mode.c create mode 100644 keyboards/ergodox_ez/keymaps/hacker_dvorak/tap_dance/mod_tap_layer_dances/none_lead.c create mode 100644 keyboards/ergodox_ez/keymaps/hacker_dvorak/tap_dance/tap_dance_actions.c create mode 100644 keyboards/ergodox_ez/keymaps/hacker_dvorak/tap_dance/tap_dance_setup.c create mode 100644 keyboards/ergodox_ez/keymaps/hacker_dvorak/tap_dance/tap_dances.c create mode 100644 keyboards/ergodox_ez/keymaps/hacker_dvorak/user/eeconfig_init_user.c create mode 100644 keyboards/ergodox_ez/keymaps/hacker_dvorak/user/layer_set_state_user.c create mode 100644 keyboards/ergodox_ez/keymaps/hacker_dvorak/user/matrix_scan_user.c create mode 100644 keyboards/ergodox_ez/keymaps/hacker_dvorak/user/process_record_user.c diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/config.h b/keyboards/ergodox_ez/keymaps/hacker_dvorak/config.h index c6b86004c..e188d95d5 100644 --- a/keyboards/ergodox_ez/keymaps/hacker_dvorak/config.h +++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/config.h @@ -5,26 +5,33 @@ #pragma once -/* Keyboard Settings */ #undef TAPPING_TERM -#define TAPPING_TERM 150 +#define TAPPING_TERM 200 #undef DEBOUNCE #define DEBOUNCE 10 #undef IGNORE_MOD_TAP_INTERRUPT -#define IGNORE_MOD_TAP_INTERRUPT #undef FORCE_NKRO #define FORCE_NKRO -/* This isn't defined by default, so there is no need to undefine it first. */ -#define LEADER_TIMEOUT 500 +#undef TAPPING_TOGGLE +#define TAPPING_TOGGLE 5 + +#define LEADER_TIMEOUT 1000 +#define IGNORE_MOD_TAP_INTERRUPT #define PERMISSIVE_HOLD #define QMK_KEYS_PER_SCAN 4 +#define DANCING_TERM 175 + +#define ONESHOT_TAP_TOGGLE 5 +#define ONESHOT_TIMEOUT 5000 + +#define COMBO_COUNT 4 +#define COMBO_TERM 200 -// RGB Lights #undef RGBLIGHT_HUE_STEP #define RGBLIGHT_HUE_STEP 24 @@ -40,11 +47,7 @@ #undef RGBLIGHT_LIMIT_VAL #define RGBLIGHT_LIMIT_VAL 255 -/* This isn't defined by default, so there is no need to undefine it first. */ -#define RGBLIGHT_SLEEP - -// Mouse #undef MOUSEKEY_INTERVAL #define MOUSEKEY_INTERVAL 10 @@ -52,31 +55,34 @@ #define MOUSEKEY_DELAY 15 #undef MOUSEKEY_MAX_SPEED -#define MOUSEKEY_MAX_SPEED 15 +#define MOUSEKEY_MAX_SPEED 20 #undef MOUSEKEY_TIME_TO_MAX -#define MOUSEKEY_TIME_TO_MAX 150 +#define MOUSEKEY_TIME_TO_MAX 200 #undef MOUSEKEY_WHEEL_MAX_SPEED -#define MOUSEKEY_WHEEL_MAX_SPEED 15 +#define MOUSEKEY_WHEEL_MAX_SPEED 20 #undef MOUSEKEY_WHEEL_TIME_TO_MAX -#define MOUSEKEY_WHEEL_TIME_TO_MAX 150 +#define MOUSEKEY_WHEEL_TIME_TO_MAX 200 -/* This is defined only if CONSOLE_ENABLE is set to "yes" */ // #undef NO_DEBUG // #define NO_DEBUG // #undef NO_PRINT // #define NO_PRINT -/* For COMBO only*/ -// #define COMBO_COUNT 1 -// #define COMBO_TERM 200 +// #define RETRO_TAPPING +// #define TAPPING_FORCE_HOLD -/* For tap toggle */ -// #define TAPPING_TOGGLE 2 -// #define ONESHOT_TAP_TOGGLE 2 -// #define ONESHOT_TIMEOUT 300 +// #define AUTO_SHIFT_TIMEOUT 150 +// #define NO_AUTO_SHIFT_SPECIAL +// #define NO_AUTO_SHIFT_NUMERIC +// #define NO_AUTO_SHIFT_ALPHA +// #define EXTRA_LONG_COMBOS +// #define EXTRA_EXTRA_LONG_COMBOS +// #define COMBO_ALLOW_ACTION_KEYS + +// #define RGBLIGHT_SLEEP diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/default.png.md b/keyboards/ergodox_ez/keymaps/hacker_dvorak/default.png.md deleted file mode 100644 index 744e7d172..000000000 --- a/keyboards/ergodox_ez/keymaps/hacker_dvorak/default.png.md +++ /dev/null @@ -1 +0,0 @@ -https://i.imgur.com/fKX0Zbs.png diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/default_highres.png.md b/keyboards/ergodox_ez/keymaps/hacker_dvorak/default_highres.png.md deleted file mode 100644 index 074e0634d..000000000 --- a/keyboards/ergodox_ez/keymaps/hacker_dvorak/default_highres.png.md +++ /dev/null @@ -1 +0,0 @@ -https://i.imgur.com/giAc3M9.jpg diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/gulpfile.js b/keyboards/ergodox_ez/keymaps/hacker_dvorak/gulpfile.js index 338b0c6ba..23f19d18a 100644 --- a/keyboards/ergodox_ez/keymaps/hacker_dvorak/gulpfile.js +++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/gulpfile.js @@ -1,7 +1,7 @@ let gulp = require('gulp'); let run = require('gulp-run-command').default; - + gulp.task('clean', run('rm -rf ../../../../.build')); gulp.task('build', ['clean'], run('make -C ../../../../ ergodox_ez:hacker_dvorak', { @@ -9,5 +9,11 @@ gulp.task('build', ['clean'], run('make -C ../../../../ ergodox_ez:hacker_dvorak })); gulp.task('watch', ['build'], () => { - gulp.watch(['keymap.c', 'config.h', 'rules.mk'], ['build']); + gulp.watch([ + 'keymap.c', + 'config.h', + 'rules.mk', + ], ['build']); }); + +gulp.task('default', ['watch']); diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/hacker_dvorak.c b/keyboards/ergodox_ez/keymaps/hacker_dvorak/hacker_dvorak.c new file mode 100644 index 000000000..65878a67c --- /dev/null +++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/hacker_dvorak.c @@ -0,0 +1,353 @@ +// Keyboard keymap: +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [DVORAK] = LAYOUT_ergodox( + + // HACKER DVORAK left hand + + //------------------------+-------------------------+-------------------------+-------------------------+-------------------------+-------------------------+------------------------// + // ESCAPE | | | | | | START RECORDING // + // | | | | | | // + KC_ESC, TD(GRV_TILD), TD(AT_DLR), TD(LCBR_LABK), TD(LPRN_LBRC), TD(EXLM_QUES), DYN_REC_START1, // + // | ~ | $ | < | [ | ? | // + // | TAP DANCE: ` | TAP DANCE: @ TAP DANCE: { | TAP DANCE: ( | TAP DANCE: ! | DYNAMIC MARCO 1 // + //------------------------+-------------------------+-------------------------+-------------------------+-------------------------+-------------------------+------------------------// + // TAB | MOD TAP: ALT+SHIFT | MOD TAP: CTRL+ALT | MOD TAP: CTRL+SHIFT | P | Y | // + // | | | | | | // + KC_TAB, TD(NONE_LEAD), TD(QUOT_DQUO), TD(DOT_COMM), ALL_T(KC_P), MEH_T(KC_Y), DYN_MACRO_PLAY1, // + // | LEAD | " | , | | | // + // | TAP DANCE: NONE | TAP DANCE: ' | TAP DANCE: . | MOD TAP: HYPER | MOD TAP: MEH | // + //------------------------+-------------------------+-------------------------+-------------------------+-------------------------+-------------------------| PLAY DYNAMIC MACRO 1 // + // | MOD TAP: ALT | MOD TAP: CTRL | LAYER TAP: SHIFT | LAYER TAP: ARROW KEYS | MOD TAP: GUI | // + // | | | | Ü | | // + TD(EQL_PLUS), ALT_T(KC_A), CTL_T(KC_O), SFT_T(KC_E), LT(ARROWS, KC_U), LGUI_T(KC_I), //-----------------------// + // + | Á | Ó | É | Ú | Í | // + // TAP DANCE: = | TAP DANCE: A | TAP DANCE: O | TAP DANCE: E | TAP DANCE: U | TAP DANCE: I | // + //------------------------+-------------------------+-------------------------+-------------------------+-------------------------+-------------------------| META // + // STOP RECORDING | MOD TAP: GUI+SHIFT+ALT | Q | J | K | X | // + // | | | | | | // + DYN_REC_STOP, TD(SCLN_COLN), SGUI_T(KC_Q), LT(MEDIA_FN, KC_J), LT(NUMPAD, KC_K), LCAG_T(KC_X), KC_LGUI, // + // | : | | | | | // + // DYNAMIC MACRO | TAP DANCE: ; | MOD TAP: SHIFT+GUI | LAYER TAP: MEDIA/F-KEYS | LAYER TAP: ATM NUMPAD | MOD TAP: CTL+ALT+GUI | // + //------------------------+-------------------------+-------------------------+-------------------------+-------------------------+-------------------------+------------------------// + // LAYERS SWITCHER | APPLICATION MENU | | | // + // | | | | SCROLL // + TG(LAYERS), KC_APP, KC_NLCK, KC_SLCK, KC_CAPS, // + // | | | | NUM // + // LAYER TOGGLE | | | | TAP DANCE: CAPS // + //------------------------+-------------------------+-------------------------+-------------------------+------------------------// + + // HACKER DVORAK left thumb + + //------------------------+------------------------// + // MOUSE WHEEL LEFT | MOUSE WHEEL RIGHT // + // | // + KC_WH_L, KC_WH_R, // + // | // + // | // + //-------------------------+-------------------------+------------------------// + // | | HOME // + // | | // + /* SPACE | BACKSPACE */ KC_HOME, // + // | | // + // | | // + KC_SPC, KC_BSPC, //-----------------------// + // | | END // + // | | // + /* | */ KC_END, // + // | | // + // | | // + //-------------------------+-------------------------+------------------------// + + // HACKER DVORAK right hand + + //------------------------+-------------------------+-------------------------+-------------------------+-------------------------+-------------------------+------------------------// + // | | | | | | // + // | | | | | | // + DYN_REC_START2, TD(APMR_PIPE), TD(RPRN_RBRC), TD(RCBR_RABK), TD(HASH_PERC), TD(ASTR_CIRC), XXXXXXX, // + // | | | | | | // + // | | | | | | // + //------------------------+-------------------------+-------------------------+-------------------------+-------------------------+-------------------------+------------------------// + // | | | | | | // + // | | | | | | // + DYN_MACRO_PLAY2, MEH_T(KC_F), ALL_T(KC_G), C_S_T(KC_C), LCA_T(KC_R), LAS_T(KC_L), TD(SLSH_BSLS), // + // | | | | | | // + // | | | | | | // + // |-------------------------+-------------------------+-------------------------+-------------------------+-------------------------+------------------------// + // | | | | | | // + // | | | | | | // + /*-----------------------*/ LGUI_T(KC_D), LT(MOUSE, KC_H), SFT_T(KC_T), CTL_T(KC_N), ALT_T(KC_S), TD(MINS_UNDS), // + // | | | | | | // + // | | | | | | // + // |-------------------------+-------------------------+-------------------------+-------------------------+-------------------------+------------------------// + // | | | | | | // + // | | | | | | // + KC_LGUI, LCAG_T(KC_B), LT(HYPER, KC_M), LT(MEDIA_FN, KC_W), SGUI_T(KC_V), LGAS_T(KC_Z), COMPOSE, // + // | | | | | | // + // | | | | | | ⎄ // + //------------------------+-------------------------+-------------------------+-------------------------+-------------------------+-------------------------+------------------------// + // | | | | // + // | | | | // + KC_LEFT, KC_UP, KC_DOWN, KC_RGHT, KC_SYSREQ, // + // | | | | // + // | | | | // + //------------------------+-------------------------+-------------------------+-------------------------+------------------------// + + // HACKER DVORAK right thumb + + //------------------------+------------------------// + // | // + // | // + KC_WH_U, KC_WH_D, // + // | // + // | // + //------------------------+-------------------------+------------------------// + // | | // + // | | // + KC_PGUP, // | // + // | | // + // | | // + //------------------------| | // + // | | // + // | | // + KC_PGDN, KC_DEL, KC_ENT // + // | | // + // | | // + //------------------------+-------------------------+------------------------// + + ), + + [PLOVER] = LAYOUT_ergodox( + // left hand + XXXXXXX, XXXXXXX, KC_MS_BTN2, KC_MS_UP, KC_MS_BTN1, KC_MS_BTN3, GUI_T(KC_NO), + KC_ESC, KC_MS_BTN4, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_MS_BTN5, PV_NUM, + KC_TAB, PV_LS, PV_LT, PV_LP, PV_LH, PV_STAR, + KC_CLCK, PV_LS, PV_LK, PV_LW, PV_LR, PV_STAR, PV_STAR, + XXXXXXX, TG(LAYERS), PV_NUM, PV_NUM, PV_NUM, + + // left thumb + KC_SPACE, KC_BSPACE, + KC_HOME, + PV_A, PV_O, KC_END, + + // right hand + KC_MS_ACCEL2, KC_MS_ACCEL1, KC_MS_ACCEL0, KC_UP, KC_APPLICATION, XXXXXXX, KC_MS_WH_UP, + PV_NUM, KC_MS_WH_LEFT, KC_LEFT, KC_DOWN, KC_RIGHT, KC_MS_WH_RIGHT, KC_MS_WH_DOWN, + PV_STAR, PV_RF, PV_RP, PV_RL, PV_RT, PV_RD, + PV_STAR, PV_STAR, PV_RR, PV_RB, PV_RG, PV_RS, PV_RZ, + PV_NUM, PV_NUM, PV_NUM, PV_NUM, XXXXXXX, + + // right thumb + KC_DELETE, KC_ENTER, + KC_PGUP, + KC_PGDOWN, PV_E, PV_U + ), + + [GAMING] = LAYOUT_ergodox( + // left hand + KC_ESCAPE, GUI_T(KC_MINS), KC_I, KC_O, KC_P, ALGR_T(KC_EQL), KC_T, + KC_TAB, KC_LALT, KC_Q, KC_W, KC_E, ALL_T(KC_R), KC_G, + LT(MOUSE, KC_GRV), KC_LCTRL, KC_A, KC_S, KC_D, MEH_T(KC_F), + KC_BSLS, KC_LSHIFT, KC_Z, KC_X, KC_C, SCMD_T(KC_V), KC_M, + XXXXXXX, TG(LAYERS), KC_COMM, KC_DOT, KC_LBRC, + + // left thumb + MO(MEDIA_FN), KC_NLCK, + KC_SCLN, + KC_SPACE, KC_ENTER, KC_BSPACE, + + // right hand + KC_QUOT, KC_Y, KC_K, KC_U, KC_KP_7, KC_KP_8, KC_KP_9, + KC_MS_WH_UP, KC_H, KC_J, KC_L, KC_KP_4, KC_KP_2, KC_KP_6, + KC_B, KC_MS_UP, KC_N, KC_KP_1, KC_KP_5, KC_KP_3, + KC_MS_WH_DOWN, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_UP, KC_KP_0, KC_SLASH, + KC_RBRC, KC_LEFT, KC_DOWN, KC_RIGHT, XXXXXXX, + + // right thumb + KC_MS_BTN5, MO(HYPER), + KC_MS_BTN4, + KC_MS_BTN3, KC_MS_BTN2, KC_MS_BTN1 + ), + + [ARROWS] = LAYOUT_ergodox( + // left hand + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, SCMD_T(KC_NO), MEH_T(KC_NO), ALL_T(KC_NO), XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, KC_LCTRL, KC_LSHIFT, XXXXXXX, _______, XXXXXXX, + XXXXXXX, KC_RALT, KC_LALT, GUI_T(KC_NO), XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + + // left thumb + XXXXXXX, XXXXXXX, + KC_HOME, + KC_SPACE, KC_BSPACE, KC_END, + + // right hand + LGUI(KC_X), XXXXXXX, LCTL(KC_X), KC_MS_WH_UP, XXXXXXX, XXXXXXX, XXXXXXX, + LGUI(KC_C), XXXXXXX, LCTL(KC_C), KC_UP, SCTL(KC_C), LCTL(KC_Z), LGUI(KC_Z), + KC_MS_WH_LEFT, KC_LEFT, KC_DOWN, KC_RIGHT, KC_MS_WH_RIGHT, KC_APPLICATION, + LGUI(KC_V), XXXXXXX, LCTL(KC_V), KC_MS_WH_DOWN, SCTL(KC_V), LCTL(KC_Y), SGUI(KC_Z), + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_SLCK, + + // right thumb + XXXXXXX, XXXXXXX, + KC_PGUP, + KC_PGDOWN, KC_DELETE, KC_ENTER + ), + + [MOUSE] = LAYOUT_ergodox( + // left hand + XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_WH_UP, LCTL(KC_X), XXXXXXX, LGUI(KC_X), + LGUI(KC_Z), LCTL(KC_Z), SCTL(KC_C), KC_MS_UP, LCTL(KC_C), KC_MS_BTN4, LGUI(KC_C), + KC_MS_BTN3, KC_MS_WH_LEFT, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_MS_WH_RIGHT, + LGUI(KC_Z), LCTL(KC_Y), SCTL(KC_V), KC_MS_WH_DOWN, LCTL(KC_V), KC_MS_BTN5, LGUI(KC_V), + KC_SLCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + + // left thumb + XXXXXXX, XXXXXXX, + XXXXXXX, + KC_MS_BTN1, KC_MS_BTN2, XXXXXXX, + + // right hand + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, ALL_T(KC_NO), MEH_T(KC_NO), SCMD_T(KC_NO), XXXXXXX, + XXXXXXX, _______, KC_MS_ACCEL1, KC_LSHIFT, KC_LCTRL, KC_MS_ACCEL2, + XXXXXXX, XXXXXXX, XXXXXXX, GUI_T(KC_NO), KC_LALT, KC_RALT, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + + // right thumb + XXXXXXX, XXXXXXX, + XXXXXXX, + XXXXXXX, XXXXXXX, KC_MS_ACCEL0 + ), + + [NUMPAD] = LAYOUT_ergodox( + // left hand + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, GUI_T(KC_NO), XXXXXXX, ALL_T(KC_NO), XXXXXXX, XXXXXXX, + _______, KC_LCTRL, KC_LSHIFT, _______, MEH_T(KC_NO), XXXXXXX, + XXXXXXX, KC_RALT, KC_LALT, XXXXXXX, SCMD_T(KC_NO), XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + + // left thumb + XXXXXXX, XXXXXXX, + KC_HOME, + KC_SPACE, KC_BSPACE, KC_END, + + // right hand + KC_X, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, + KC_O, KC_I, KC_1, KC_2, KC_3, KC_SLSH, KC_PERC, + KC_M, KC_4, KC_5, KC_6, KC_PLUS, KC_MINS, + KC_L, KC_J, KC_7, KC_8, KC_9, KC_ASTR, KC_CIRC, + KC_DOT, KC_0, KC_COMM, KC_UNDS, KC_BSLS, + + // right thumb + XXXXXXX, XXXXXXX, + KC_PGUP, + KC_PGDOWN, KC_DELETE, KC_ENTER + ), + + [LAYERS] = LAYOUT_ergodox( + // left hand + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, + + // left thumb + XXXXXXX, XXXXXXX, + XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, + + // right hand + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, TO(DVORAK), TO(PLOVER), TO(GAMING), XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + + // right thumb + XXXXXXX, XXXXXXX, + XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX + ), + + [MEDIA_FN] = LAYOUT_ergodox( + // left hand + KC_VOLD, KC_MUTE, RGB_TOG, XXXXXXX, KC_MAIL, KC_FIND, KC_WWW_REFRESH, + KC_MPRV, KC_F9, KC_F7, KC_F5, KC_F3, KC_F1, KC_WWW_HOME, + KC_PAUS, KC_F19, KC_F17, KC_F15, KC_F13, KC_F11, + RGB_HUD, XXXXXXX, XXXXXXX, _______, KC_F23, KC_F21, KC_WWW_BACK, + RGB_VAD, KC_CLCK, KC_PSCREEN, XXXXXXX, MO(FIRMWARE), + + // left thumb + _______, XXXXXXX, + XXXXXXX, + XXXXXXX, XXXXXXX, KC_MEDIA_EJECT, + + // right hand + KC_WWW_FAVORITES, KC_MYCM, KC_CALC, XXXXXXX, RGB_MOD, RGB_M_P, KC_VOLU, + KC_WWW_SEARCH, KC_F2, KC_F4, KC_F6, KC_F8, KC_F10, KC_MNXT, + KC_F12, KC_F14, KC_F16, KC_F18, KC_F20, KC_MPLY, + KC_WWW_FORWARD, KC_F22, KC_F24, _______, XXXXXXX, XXXXXXX, RGB_HUI, + KC_PWR, XXXXXXX, KC_SLEP, KC_WAKE, RGB_VAI, + + // right thumb + XXXXXXX, XXXXXXX, + XXXXXXX, + RGB_GREEN, XXXXXXX, XXXXXXX + ), + + [HYPER] = LAYOUT_ergodox( + // left hand + XXXXXXX, HYPR(KC_F1), HYPR(KC_F2), HYPR(KC_F3), HYPR(KC_F4), HYPR(KC_F5), XXXXXXX, + XXXXXXX, HYPR(KC_F6), HYPR(KC_F7), HYPR(KC_F8), HYPR(KC_F9), HYPR(KC_F10), XXXXXXX, + XXXXXXX, HYPR(KC_F11), HYPR(KC_F12), HYPR(KC_F13), HYPR(KC_F14), HYPR(KC_F15), + XXXXXXX, HYPR(KC_F16), HYPR(KC_F17), HYPR(KC_F18), HYPR(KC_F19), HYPR(KC_F20), XXXXXXX, + XXXXXXX, HYPR(KC_F21), HYPR(KC_F22), HYPR(KC_F23), HYPR(KC_F24), + + // left thumb + XXXXXXX, XXXXXXX, + XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, + + // right hand + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + + // right thumb + XXXXXXX, _______, + XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX + ), + + [FIRMWARE] = LAYOUT_ergodox( + + // left hand + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, + + // left thumb + XXXXXXX, XXXXXXX, + XXXXXXX, + RESET, XXXXXXX, XXXXXXX, + + // right hand + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + + // right thumb + XXXXXXX, XXXXXXX, + XXXXXXX, + XXXXXXX, XXXXXXX, EEP_RST + ) +}; diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/keycodes/aliases_definitions.c b/keyboards/ergodox_ez/keymaps/hacker_dvorak/keycodes/aliases_definitions.c new file mode 100644 index 000000000..e5eba1820 --- /dev/null +++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/keycodes/aliases_definitions.c @@ -0,0 +1,5 @@ +// Keycode aliases +#define SCTL(kc) LSFT(LCTL(kc)) // Modifier keys: SHIFT+CTRL+kc combination. +#define LGAS_T(kc) MT(MOD_LGUI | MOD_LALT | MOD_LSFT, kc) // Mod tap: kc when tapped, GUI+ALT+SHIFT when held. +#define LAS_T(kc) MT(MOD_LALT | MOD_LSFT, kc) // Mod tap: kc when tapped, ALT+SHIFT whin held. +#define COMPOSE KC_RALT // Compose key (used to input characters like á, ñ, ü). diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/keycodes/custom_keycodes.c b/keyboards/ergodox_ez/keymaps/hacker_dvorak/keycodes/custom_keycodes.c new file mode 100644 index 000000000..368062172 --- /dev/null +++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/keycodes/custom_keycodes.c @@ -0,0 +1,8 @@ +// Define custom user keycodes: +enum custom_keycodes { + PLACEHOLDER = SAFE_RANGE, // Can always be here. + RGB_GREEN, // To set default RGB layer as green once. + MY_CUSTOM_MACRO, // Custom macro example. + MY_OTHER_MACRO, // Custom macro example. + DYNAMIC_MACRO_RANGE // Should always be the last. +}; diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/keymap.c b/keyboards/ergodox_ez/keymaps/hacker_dvorak/keymap.c index c42b55108..af06d2bd8 100644 --- a/keyboards/ergodox_ez/keymaps/hacker_dvorak/keymap.c +++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/keymap.c @@ -1,781 +1,19 @@ -#include QMK_KEYBOARD_H -#include "keymap_dvorak.h" -#include "sendstring_dvorak.h" -#include "keymap_plover.h" -#include "keymap_plover_dvorak.h" - - -#define SCTL(kc) LSFT(LCTL(kc)) - -// Layers -enum layers { - DVORAK_US = 0, - PLOVER_US, - GAMING_US, - ARROWS_US, - MOUSE_US, - NUMPAD_US, - LAYERS_US, - DVORAK_DV, - PLOVER_DV, - GAMING_DV, - ARROWS_DV, - MOUSE_DV, - NUMPAD_DV, - LAYERS_DV, - MEDIA_FN, - HYPER_FN, - MEH_FN, - MEH_FN_PLUS, - FIRMWARE -}; - -int CAPS_LOCK = 0; -int NUM_LOCK = 0; -int SCROLL_LOCK = 0; - -enum tap_dances { - TD_ESC_CAPS = 0 -}; - -qk_tap_dance_action_t tap_dance_actions[] = { - [TD_ESC_CAPS] = ACTION_TAP_DANCE_DOUBLE(KC_ESC, KC_CLCK) -}; - - -enum custom_keycodes { - PLACEHOLDER = SAFE_RANGE, // can always be here - RGB_GREEN // to set default RGB layer as green once -}; - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* - * ,--------------------------------------------------. ,--------------------------------------------------. - * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | | 38 | 39 | 40 | 41 | 42 | 43 | 44 | - * |--------+------+------+------+------+------+------| |------+------+------+------+------+------+--------| - * | 7 | 8 | 9 | 10 | 11 | 12 | 13 | | 45 | 46 | 47 | 48 | 49 | 50 | 51 | - * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | 14 | 15 | 16 | 17 | 18 | 19 |------| |------| 52 | 53 | 54 | 55 | 56 | 57 | - * |--------+------+------+------+------+------| 26 | | 58 |------+------+------+------+------+--------| - * | 20 | 21 | 22 | 23 | 24 | 25 | | | | 59 | 60 | 61 | 62 | 63 | 64 | - * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | 27 | 28 | 29 | 30 | 31 | | 65 | 66 | 67 | 68 | 69 | - * `----------------------------------' `----------------------------------' - * ,-------------. ,-------------. - * | 32 | 33 | | 70 | 71 | - * ,------+------+------| |------+------+------. - * | | | 34 | | 72 | | | - * | 35 | 36 |------| |------| 74 | 75 | - * | | | 37 | | 73 | | | - * `--------------------' `--------------------' - */ - [DVORAK_US] = LAYOUT_ergodox( - // left hand - KC_ESC, KC_LABK, KC_LCBR, KC_LBRC, KC_LPRN, KC_EXLM, KC_AMPR, - KC_TAB, KC_QUOT, SCMD_T(KC_COMM), MEH_T(KC_DOT), ALL_T(KC_P), KC_Y, KC_AT, - KC_EQL, CTL_T(KC_A), SFT_T(KC_O), LT(NUMPAD_US, KC_E), LT(ARROWS_US, KC_U), KC_I, - KC_BSLS, ALGR_T(KC_SCLN), ALT_T(KC_Q), LT(MEDIA_FN, KC_J), GUI_T(KC_K), KC_X, KC_PERC, - MO(MEH_FN), TG(LAYERS_US), KC_CIRC, KC_PLUS, KC_COLN, - - // left thumb - KC_LEFT, KC_RGHT, - KC_HOME, - KC_SPC, KC_BSPC, KC_END, - - // right hand - KC_PIPE, KC_QUES, KC_RPRN, KC_RBRC, KC_RCBR, KC_RABK, KC_ASTR, - KC_HASH, KC_F, ALL_T(KC_G), MEH_T(KC_C), SCMD_T(KC_R), KC_L, KC_SLSH, - KC_D, LT(MOUSE_US, KC_H), LT(HYPER_FN, KC_T), SFT_T(KC_N), CTL_T(KC_S), KC_MINS, - KC_DLR, KC_B, GUI_T(KC_M), LT(MEDIA_FN, KC_W), ALT_T(KC_V), ALGR_T(KC_Z), KC_GRV, - KC_DQUO, KC_UNDS, KC_TILD, TG(DVORAK_DV), MO(MEH_FN_PLUS), - - // right thumb - KC_UP, KC_DOWN, - KC_PGUP, - KC_PGDN, KC_DEL, KC_ENT - ), - - [PLOVER_US] = LAYOUT_ergodox( - // left hand - XXXXXXX, XXXXXXX, KC_MS_BTN2, KC_MS_UP, KC_MS_BTN1, KC_MS_BTN3, GUI_T(KC_NO), - KC_ESC, KC_MS_BTN4, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_MS_BTN5, PV_NUM, - KC_TAB, PV_LS, PV_LT, PV_LP, PV_LH, PV_STAR, - KC_CLCK, PV_LS, PV_LK, PV_LW, PV_LR, PV_STAR, PV_STAR, - MO(MEH_FN), TG(LAYERS_US), PV_NUM, PV_NUM, PV_NUM, - - // left thumb - KC_SPACE, KC_BSPACE, - KC_HOME, - PV_A, PV_O, KC_END, - - // right hand - KC_MS_ACCEL2, KC_MS_ACCEL1, KC_MS_ACCEL0, KC_UP, KC_APPLICATION, XXXXXXX, KC_MS_WH_UP, - PV_NUM, KC_MS_WH_LEFT, KC_LEFT, KC_DOWN, KC_RIGHT, KC_MS_WH_RIGHT, KC_MS_WH_DOWN, - PV_STAR, PV_RF, PV_RP, PV_RL, PV_RT, PV_RD, - PV_STAR, PV_STAR, PV_RR, PV_RB, PV_RG, PV_RS, PV_RZ, - PV_NUM, PV_NUM, PV_NUM, PV_NUM, MO(MEH_FN_PLUS), - - // right thumb - KC_DELETE, KC_ENTER, - KC_PGUP, - KC_PGDOWN, PV_E, PV_U - ), - - [GAMING_US] = LAYOUT_ergodox( - // left hand - KC_ESCAPE, GUI_T(KC_MINS), KC_I, KC_O, KC_P, ALGR_T(KC_EQL), KC_T, - KC_TAB, KC_LALT, KC_Q, KC_W, KC_E, ALL_T(KC_R), KC_G, - LT(MOUSE_US, KC_GRV), KC_LCTRL, KC_A, KC_S, KC_D, MEH_T(KC_F), - KC_BSLS, KC_LSHIFT, KC_Z, KC_X, KC_C, SCMD_T(KC_V), KC_M, - MO(MEH_FN), TG(LAYERS_US), KC_COMM, KC_DOT, KC_LBRC, - - // left thumb - MO(MEDIA_FN), KC_NLCK, - KC_SCLN, - KC_SPACE, KC_ENTER, KC_BSPACE, - - // right hand - KC_QUOT, KC_Y, KC_K, KC_U, KC_KP_7, KC_KP_8, KC_KP_9, - KC_MS_WH_UP, KC_H, KC_J, KC_L, KC_KP_4, KC_KP_2, KC_KP_6, - KC_B, KC_MS_UP, KC_N, KC_KP_1, KC_KP_5, KC_KP_3, - KC_MS_WH_DOWN, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_UP, KC_KP_0, KC_SLASH, - KC_RBRC, KC_LEFT, KC_DOWN, KC_RIGHT, MO(MEH_FN_PLUS), - - // right thumb - KC_MS_BTN5, MO(HYPER_FN), - KC_MS_BTN4, - KC_MS_BTN3, KC_MS_BTN2, KC_MS_BTN1 - ), - - [ARROWS_US] = LAYOUT_ergodox( - // left hand - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, SCMD_T(KC_NO), MEH_T(KC_NO), ALL_T(KC_NO), XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, KC_LCTRL, KC_LSHIFT, XXXXXXX, _______, XXXXXXX, - XXXXXXX, KC_RALT, KC_LALT, GUI_T(KC_NO), XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - - // left thumb - XXXXXXX, XXXXXXX, - KC_HOME, - KC_SPACE, KC_BSPACE, KC_END, - - // right hand - LGUI(KC_X), XXXXXXX, LCTL(KC_X), KC_MS_WH_UP, XXXXXXX, XXXXXXX, XXXXXXX, - LGUI(KC_C), XXXXXXX, LCTL(KC_C), KC_UP, SCTL(KC_C), LCTL(KC_Z), LGUI(KC_Z), - KC_MS_WH_LEFT, KC_LEFT, KC_DOWN, KC_RIGHT, KC_MS_WH_RIGHT, KC_APPLICATION, - LGUI(KC_V), XXXXXXX, LCTL(KC_V), KC_MS_WH_DOWN, SCTL(KC_V), LCTL(KC_Y), SGUI(KC_Z), - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_SLCK, - - // right thumb - XXXXXXX, XXXXXXX, - KC_PGUP, - KC_PGDOWN, KC_DELETE, KC_ENTER - ), - - [MOUSE_US] = LAYOUT_ergodox( - // left hand - XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_WH_UP, LCTL(KC_X), XXXXXXX, LGUI(KC_X), - LGUI(KC_Z), LCTL(KC_Z), SCTL(KC_C), KC_MS_UP, LCTL(KC_C), KC_MS_BTN4, LGUI(KC_C), - KC_MS_BTN3, KC_MS_WH_LEFT, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_MS_WH_RIGHT, - LGUI(KC_Z), LCTL(KC_Y), SCTL(KC_V), KC_MS_WH_DOWN, LCTL(KC_V), KC_MS_BTN5, LGUI(KC_V), - KC_SLCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - - // left thumb - XXXXXXX, XXXXXXX, - XXXXXXX, - KC_MS_BTN1, KC_MS_BTN2, XXXXXXX, - - // right hand - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, ALL_T(KC_NO), MEH_T(KC_NO), SCMD_T(KC_NO), XXXXXXX, - XXXXXXX, _______, KC_MS_ACCEL1, KC_LSHIFT, KC_LCTRL, KC_MS_ACCEL2, - XXXXXXX, XXXXXXX, XXXXXXX, GUI_T(KC_NO), KC_LALT, KC_RALT, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - - // right thumb - XXXXXXX, XXXXXXX, - XXXXXXX, - XXXXXXX, XXXXXXX, KC_MS_ACCEL0 - ), - - [NUMPAD_US] = LAYOUT_ergodox( - // left hand - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, GUI_T(KC_NO), XXXXXXX, ALL_T(KC_NO), XXXXXXX, XXXXXXX, - _______, KC_LCTRL, KC_LSHIFT, _______, MEH_T(KC_NO), XXXXXXX, - XXXXXXX, KC_RALT, KC_LALT, XXXXXXX, SCMD_T(KC_NO), XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - - // left thumb - XXXXXXX, XXXXXXX, - KC_HOME, - KC_SPACE, KC_BSPACE, KC_END, - - // right hand - KC_X, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, - KC_O, KC_I, KC_1, KC_2, KC_3, KC_SLSH, KC_PERC, - KC_M, KC_4, KC_5, KC_6, KC_PLUS, KC_MINS, - KC_L, KC_J, KC_7, KC_8, KC_9, KC_ASTR, KC_CIRC, - KC_DOT, KC_0, KC_COMM, KC_UNDS, KC_BSLS, - - // right thumb - XXXXXXX, XXXXXXX, - KC_PGUP, - KC_PGDOWN, KC_DELETE, KC_ENTER - ), - - [LAYERS_US] = LAYOUT_ergodox( - // left hand - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, - - // left thumb - XXXXXXX, XXXXXXX, - XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, - - // right hand - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, TO(DVORAK_US), TO(PLOVER_US), TO(GAMING_US), XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - - // right thumb - XXXXXXX, XXXXXXX, - XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX - ), - - [DVORAK_DV] = LAYOUT_ergodox( - // left hand - KC_ESC, DV_LABK, DV_LCBR, DV_LBRC, DV_LPRN, DV_EXLM, DV_AMPR, - KC_TAB, DV_QUOT, SCMD_T(DV_COMM), MEH_T(DV_DOT), ALL_T(DV_P), DV_Y, DV_AT, - DV_EQL, CTL_T(DV_A), SFT_T(DV_O), LT(NUMPAD_DV, DV_E), LT(ARROWS_DV, DV_U), DV_I, - DV_BSLS, ALGR_T(DV_SCLN), ALT_T(DV_Q), LT(MEDIA_FN, DV_J), GUI_T(DV_K), DV_X, DV_PERC, - MO(MEH_FN), TG(LAYERS_DV), DV_CIRC, DV_PLUS, DV_COLN, - - // left thumb - KC_LEFT, KC_RGHT, - KC_HOME, - KC_SPC, KC_BSPC, KC_END, - - // right hand - DV_PIPE, DV_QUES, DV_RPRN, DV_RBRC, DV_RCBR, DV_RABK, DV_ASTR, - DV_HASH, DV_F, ALL_T(DV_G), MEH_T(DV_C), SCMD_T(DV_R), DV_L, DV_SLSH, - DV_D, LT(MOUSE_DV, DV_H), LT(HYPER_FN, DV_T), SFT_T(DV_N), CTL_T(DV_S), DV_MINS, - DV_DLR, DV_B, GUI_T(DV_M), LT(MEDIA_FN, DV_W), ALT_T(DV_V), ALGR_T(DV_Z), DV_GRV, - DV_DQUO, DV_UNDS, DV_TILD, _______, MO(MEH_FN_PLUS), - - // right thumb - KC_UP, KC_DOWN, - KC_PGUP, - KC_PGDN, KC_DEL, KC_ENT - ), - - [PLOVER_DV] = LAYOUT_ergodox( - // left hand - XXXXXXX, XXXXXXX, KC_MS_BTN2, KC_MS_UP, KC_MS_BTN1, KC_MS_BTN3, GUI_T(KC_NO), - KC_ESC, KC_MS_BTN4, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_MS_BTN5, PD_NUM, - KC_TAB, PD_LS, PD_LT, PD_LP, PD_LH, PD_STAR, - KC_CLCK, PD_LS, PD_LK, PD_LW, PD_LR, PD_STAR, PD_STAR, - MO(MEH_FN), TG(LAYERS_DV), PD_NUM, PD_NUM, PD_NUM, - - // left thumb - KC_SPACE, KC_BSPACE, - KC_HOME, - PD_A, PD_O, KC_END, - - // right hand - KC_MS_ACCEL2, KC_MS_ACCEL1, KC_MS_ACCEL0, KC_UP, KC_APPLICATION, XXXXXXX, KC_MS_WH_UP, - PD_NUM, KC_MS_WH_LEFT, KC_LEFT, KC_DOWN, KC_RIGHT, KC_MS_WH_RIGHT, KC_MS_WH_DOWN, - PD_STAR, PD_RF, PD_RP, PD_RL, PD_RT, PD_RD, - PD_STAR, PD_STAR, PD_RR, PD_RB, PD_RG, PD_RS, PD_RZ, - PD_NUM, PD_NUM, PD_NUM, PD_NUM, MO(MEH_FN_PLUS), - - // right thumb - KC_DELETE, KC_ENTER, - KC_PGUP, - KC_PGDOWN, PD_E, PD_U - ), - - [GAMING_DV] = LAYOUT_ergodox( - // left hand - KC_ESCAPE, GUI_T(DV_MINS), DV_I, DV_O, DV_P, ALGR_T(DV_EQL), DV_T, - KC_TAB, KC_LALT, DV_Q, DV_W, DV_E, ALL_T(DV_R), DV_G, - LT(MOUSE_DV, DV_GRV), KC_LCTRL, DV_A, DV_S, DV_D, MEH_T(DV_F), - DV_BSLS, KC_LSHIFT, DV_Z, DV_X, DV_C, SCMD_T(DV_V), DV_M, - MO(MEH_FN), TG(LAYERS_DV), DV_COMM, DV_DOT, DV_LBRC, - - // left thumb - MO(MEDIA_FN), KC_NLCK, - DV_SCLN, - KC_SPACE, KC_ENTER, KC_BSPACE, - - // right hand - DV_QUOT, DV_Y, DV_K, DV_U, KC_KP_7, KC_KP_8, KC_KP_9, - KC_MS_WH_UP, DV_H, DV_J, DV_L, KC_KP_4, KC_KP_2, KC_KP_6, - DV_B, KC_MS_UP, DV_N, KC_KP_1, KC_KP_5, KC_KP_3, - KC_MS_WH_DOWN, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_UP, KC_KP_0, DV_SLSH, - DV_RBRC, KC_LEFT, KC_DOWN, KC_RIGHT, MO(MEH_FN_PLUS), - - // right thumb - KC_MS_BTN5, MO(HYPER_FN), - KC_MS_BTN4, - KC_MS_BTN3, KC_MS_BTN2, KC_MS_BTN1 - ), - - [ARROWS_DV] = LAYOUT_ergodox( - // left hand - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, SCMD_T(KC_NO), MEH_T(KC_NO), ALL_T(KC_NO), XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, KC_LCTRL, KC_LSHIFT, XXXXXXX, _______, XXXXXXX, - XXXXXXX, KC_RALT, KC_LALT, GUI_T(KC_NO), XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - - // left thumb - XXXXXXX, XXXXXXX, - KC_HOME, - KC_SPACE, KC_BSPACE, KC_END, - - // right hand - LGUI(DV_X), XXXXXXX, LCTL(DV_X), KC_MS_WH_UP, XXXXXXX, XXXXXXX, XXXXXXX, - LGUI(DV_C), XXXXXXX, LCTL(DV_C), KC_UP, SCTL(DV_C), LCTL(DV_Z), LGUI(DV_Z), - KC_MS_WH_LEFT, KC_LEFT, KC_DOWN, KC_RIGHT, KC_MS_WH_RIGHT, KC_APPLICATION, - LGUI(DV_V), XXXXXXX, LCTL(DV_V), KC_MS_WH_DOWN, SCTL(DV_V), LCTL(DV_Y), SGUI(DV_Z), - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_SLCK, - - // right thumb - XXXXXXX, XXXXXXX, - KC_PGUP, - KC_PGDOWN, KC_DELETE, KC_ENTER - ), - - [MOUSE_DV] = LAYOUT_ergodox( - // left hand - XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_WH_UP, LCTL(DV_X), XXXXXXX, LGUI(DV_X), - LGUI(DV_Z), LCTL(DV_Z), SCTL(DV_C), KC_MS_UP, LCTL(DV_C), KC_MS_BTN4, LGUI(DV_C), - KC_MS_BTN3, KC_MS_WH_LEFT, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_MS_WH_RIGHT, - LGUI(DV_Z), LCTL(DV_Y), SCTL(DV_V), KC_MS_WH_DOWN, LCTL(DV_V), KC_MS_BTN5, LGUI(DV_V), - KC_SLCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - - // left thumb - XXXXXXX, XXXXXXX, - XXXXXXX, - KC_MS_BTN1, KC_MS_BTN2, XXXXXXX, - - // right hand - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, ALL_T(KC_NO), MEH_T(KC_NO), SCMD_T(KC_NO), XXXXXXX, - XXXXXXX, _______, KC_MS_ACCEL1, KC_LSHIFT, KC_LCTRL, KC_MS_ACCEL2, - XXXXXXX, XXXXXXX, XXXXXXX, GUI_T(KC_NO), KC_LALT, KC_RALT, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - - // right thumb - XXXXXXX, XXXXXXX, - XXXXXXX, - XXXXXXX, XXXXXXX, KC_MS_ACCEL0 - ), - - [NUMPAD_DV] = LAYOUT_ergodox( - // left hand - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, GUI_T(KC_NO), XXXXXXX, ALL_T(KC_NO), XXXXXXX, XXXXXXX, - _______, KC_LCTRL, KC_LSHIFT, _______, MEH_T(KC_NO), XXXXXXX, - XXXXXXX, KC_RALT, KC_LALT, XXXXXXX, SCMD_T(KC_NO), XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - - // left thumb - XXXXXXX, XXXXXXX, - KC_HOME, - KC_SPACE, KC_BSPACE, KC_END, - - // right hand - DV_X, DV_A, DV_B, DV_C, DV_D, DV_E, DV_F, - DV_O, DV_I, DV_1, DV_2, DV_3, DV_SLSH, DV_PERC, - DV_M, DV_4, DV_5, DV_6, DV_PLUS, DV_MINS, - DV_L, DV_J, DV_7, DV_8, DV_9, DV_ASTR, DV_CIRC, - DV_DOT, DV_0, DV_COMM, DV_UNDS, DV_BSLS, - - // right thumb - XXXXXXX, XXXXXXX, - KC_PGUP, - KC_PGDOWN, KC_DELETE, KC_ENTER - ), - - [LAYERS_DV] = LAYOUT_ergodox( - // left hand - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, - - // left thumb - XXXXXXX, XXXXXXX, - XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, - - // right hand - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, TO(DVORAK_DV), TO(PLOVER_DV), TO(GAMING_DV), XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - - // right thumb - XXXXXXX, XXXXXXX, - XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX - ), - - [MEDIA_FN] = LAYOUT_ergodox( - // left hand - KC_AUDIO_VOL_DOWN, KC_AUDIO_MUTE, RGB_TOG, XXXXXXX, KC_MAIL, KC_FIND, KC_WWW_REFRESH, - KC_MEDIA_PREV_TRACK, KC_F9, KC_F7, KC_F5, KC_F3, KC_F1, KC_WWW_HOME, - KC_PAUSE, KC_F19, KC_F17, KC_F15, KC_F13, KC_F11, - RGB_HUD, XXXXXXX, XXXXXXX, _______, KC_F23, KC_F21, KC_WWW_BACK, - RGB_VAD, KC_CLCK, KC_PSCREEN, XXXXXXX, MO(FIRMWARE), - - // left thumb - _______, XXXXXXX, - XXXXXXX, - XXXXXXX, XXXXXXX, KC_MEDIA_EJECT, - - // right hand - KC_WWW_FAVORITES, KC_MY_COMPUTER, KC_CALCULATOR, XXXXXXX, RGB_MOD, RGB_M_P, KC_AUDIO_VOL_UP, - KC_WWW_SEARCH, KC_F2, KC_F4, KC_F6, KC_F8, KC_F10, KC_MEDIA_NEXT_TRACK, - KC_F12, KC_F14, KC_F16, KC_F18, KC_F20, KC_MEDIA_PLAY_PAUSE, - KC_WWW_FORWARD, KC_F22, KC_F24, _______, XXXXXXX, XXXXXXX, RGB_HUI, - KC_SYSTEM_POWER, XXXXXXX, KC_SYSTEM_SLEEP, KC_SYSTEM_WAKE, RGB_VAI, - - // right thumb - XXXXXXX, XXXXXXX, - XXXXXXX, - RGB_GREEN, XXXXXXX, XXXXXXX - ), - - [HYPER_FN] = LAYOUT_ergodox( - // left hand - XXXXXXX, HYPR(KC_F1), HYPR(KC_F2), HYPR(KC_F3), HYPR(KC_F4), HYPR(KC_F5), XXXXXXX, - XXXXXXX, HYPR(KC_F6), HYPR(KC_F7), HYPR(KC_F8), HYPR(KC_F9), HYPR(KC_F10), XXXXXXX, - XXXXXXX, HYPR(KC_F11), HYPR(KC_F12), HYPR(KC_F13), HYPR(KC_F14), HYPR(KC_F15), - XXXXXXX, HYPR(KC_F16), HYPR(KC_F17), HYPR(KC_F18), HYPR(KC_F19), HYPR(KC_F20), XXXXXXX, - XXXXXXX, HYPR(KC_F21), HYPR(KC_F22), HYPR(KC_F23), HYPR(KC_F24), - - // left thumb - XXXXXXX, XXXXXXX, - XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, - - // right hand - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - - // right thumb - XXXXXXX, _______, - XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX - ), - - [MEH_FN] = LAYOUT_ergodox( - // left hand - LCA(KC_F11), LCA(KC_F9), LCA(KC_F7), LCA(KC_F5), LCA(KC_F3), LCA(KC_F1), XXXXXXX, - LCAG(KC_F11), LCAG(KC_F9), LCAG(KC_F7), LCAG(KC_F5), LCAG(KC_F3), LCAG(KC_F1), XXXXXXX, - MEH(KC_F11), MEH(KC_F9), MEH(KC_F7), MEH(KC_F5), MEH(KC_F3), MEH(KC_F1), - SGUI(KC_F11), SGUI(KC_F9), SGUI(KC_F7), SGUI(KC_F5), SGUI(KC_F3), SGUI(KC_F1), XXXXXXX, - _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - - // left thumb - XXXXXXX, XXXXXXX, - XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, - - // right hand - XXXXXXX, LCA(KC_F2), LCA(KC_F4), LCA(KC_F6), LCA(KC_F8), LCA(KC_F10), LCA(KC_F12), - XXXXXXX, LCAG(KC_F2), LCAG(KC_F4), LCAG(KC_F6), LCAG(KC_F8), LCAG(KC_F10), LCAG(KC_F12), - MEH(KC_F2), MEH(KC_F4), MEH(KC_F6), MEH(KC_F8), MEH(KC_F10), MEH(KC_F12), - XXXXXXX, SGUI(KC_F2), SGUI(KC_F4), SGUI(KC_F6), SGUI(KC_F8), SGUI(KC_F10), SGUI(KC_F12), - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - - // right thumb - XXXXXXX, XXXXXXX, - XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX - ), - - [MEH_FN_PLUS] = LAYOUT_ergodox( - // left hand - LCA(KC_F23), LCA(KC_F21), LCA(KC_F19), LCA(KC_F17), LCA(KC_F15), LCA(KC_F13), XXXXXXX, - LCAG(KC_F23), LCAG(KC_F21), LCAG(KC_F19), LCAG(KC_F17), LCAG(KC_F15), LCAG(KC_F13), XXXXXXX, - MEH(KC_F23), MEH(KC_F21), MEH(KC_F19), MEH(KC_F17), MEH(KC_F15), MEH(KC_F13), - SGUI(KC_F23), SGUI(KC_F21), SGUI(KC_F19), SGUI(KC_F17), SGUI(KC_F15), SGUI(KC_F13), XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - - // left thumb - XXXXXXX, XXXXXXX, - XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, - - // right hand - XXXXXXX, LCA(KC_F14), LCA(KC_F16), LCA(KC_F18), LCA(KC_F20), LCA(KC_F22), LCA(KC_F24), - XXXXXXX, LCAG(KC_F14), LCAG(KC_F16), LCAG(KC_F18), LCAG(KC_F20), LCAG(KC_F22), LCAG(KC_F24), - MEH(KC_F14), MEH(KC_F16), MEH(KC_F18), MEH(KC_F20), MEH(KC_F22), MEH(KC_F24), - XXXXXXX, SGUI(KC_F14), SGUI(KC_F16), SGUI(KC_F18), SGUI(KC_F20), SGUI(KC_F22), SGUI(KC_F24), - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, - - // right thumb - XXXXXXX, XXXXXXX, - XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX - ), - - [FIRMWARE] = LAYOUT_ergodox( - // left hand - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, - - // left thumb - XXXXXXX, XXXXXXX, - XXXXXXX, - RESET, XXXXXXX, XXXXXXX, - - // right hand - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - - // right thumb - XXXXXXX, XXXXXXX, - XXXXXXX, - XXXXXXX, XXXXXXX, EEP_RST - ) -}; - - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case RGB_GREEN: - if (record->event.pressed) { - #ifdef RGBLIGHT_ENABLE - rgblight_enable(); - rgblight_mode(1); - rgblight_sethsv_red(); - #endif - } - - return false; - - case KC_CLCK: - if (record->event.pressed) { - if (!(CAPS_LOCK)) { - ergodox_right_led_1_on(); - CAPS_LOCK = 1; - } else { - ergodox_right_led_1_off(); - CAPS_LOCK = 0; - } - } - - return true; - - case KC_NLCK: - if (record->event.pressed) { - if (!(NUM_LOCK)) { - ergodox_right_led_2_on(); - NUM_LOCK = 1; - } else { - ergodox_right_led_2_off(); - NUM_LOCK = 0; - } - } - - return true; - - case KC_SLCK: - if (record->event.pressed) { - if (!(SCROLL_LOCK)) { - ergodox_right_led_3_on(); - SCROLL_LOCK = 1; - } else { - ergodox_right_led_3_off(); - SCROLL_LOCK = 0; - } - } - - case KC_MS_WH_LEFT: - if (record->event.pressed) { - if (SCROLL_LOCK) { - return false; - } else { - return true; - } - } - - case KC_MS_WH_UP: - if (record->event.pressed) { - if (SCROLL_LOCK) { - return false; - } else { - return true; - } - } - - case KC_MS_WH_DOWN: - if (record->event.pressed) { - if (SCROLL_LOCK) { - return false; - } else { - return true; - } - } - - case KC_MS_WH_RIGHT: - if (record->event.pressed) { - if (SCROLL_LOCK) { - return false; - } else { - return true; - } - } - - default: - return true; - } -} - -uint32_t layer_state_set_user(uint32_t state) { - uint8_t layer = biton32(state); - - switch (layer) { - case DVORAK_US: - rgblight_sethsv_noeeprom_red(); - rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT); - - break; - - case PLOVER_US: - rgblight_sethsv_noeeprom_red(); - rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3); - - break; - - case GAMING_US: - rgblight_sethsv_noeeprom_red(); - rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3); - - break; - - case ARROWS_US: - rgblight_sethsv_noeeprom_blue(); - rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2); - - break; - - case MOUSE_US: - rgblight_sethsv_noeeprom_blue(); - rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2); - - break; - - case NUMPAD_US: - rgblight_sethsv_noeeprom_blue(); - rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2); - - break; - - case LAYERS_US: - rgblight_sethsv_noeeprom_cyan(); - rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2); - - break; - - case DVORAK_DV: - rgblight_sethsv_noeeprom_green(); - rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT); - break; - - case PLOVER_DV: - rgblight_sethsv_noeeprom_green(); - rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3); - - break; - - case GAMING_DV: - rgblight_sethsv_noeeprom_green(); - rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3); - - break; - - case ARROWS_DV: - rgblight_sethsv_noeeprom_blue(); - rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2); - - break; - - case MOUSE_DV: - rgblight_sethsv_noeeprom_blue(); - rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2); - - break; - - case NUMPAD_DV: - rgblight_sethsv_noeeprom_blue(); - rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2); - - break; - - case LAYERS_DV: - rgblight_sethsv_noeeprom_cyan(); - rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2); - - break; - - case MEDIA_FN: - rgblight_sethsv_noeeprom_yellow(); - rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2); - - break; - - case HYPER_FN: - rgblight_sethsv_noeeprom_magenta(); - rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2); - - break; - - case MEH_FN: - rgblight_sethsv_noeeprom_magenta(); - rgblight_mode_noeeprom(RGBLIGHT_MODE_SNAKE + 4); - - break; - - case MEH_FN_PLUS: - rgblight_sethsv_noeeprom_magenta(); - rgblight_mode_noeeprom(RGBLIGHT_MODE_SNAKE + 5); - - break; - - case FIRMWARE: - rgblight_sethsv_noeeprom_pink(); - rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2); - - break; - - default: - break; - } - - return state; -}; +#include QMK_KEYBOARD_H // Includes the QMK-verse. +#include "keymap_plover.h" // Includes the Plover keymap for easier readability. + + +// TODO: No eeprom changes unless needed, custom rgb settings for animations. +#include "keycodes/aliases_definitions.c" +#include "layers/layers_definitions.c" +#include "tap_dance/tap_dance_setup.c" +#include "tap_dance/tap_dances.c" +#include "user/matrix_scan_user.c" +#include "tap_dance/mod_tap_layer_dances/none_lead.c" +#include "tap_dance/tap_dance_actions.c" +#include "keycodes/custom_keycodes.c" +#include "dynamic_macro.h" // Includes dynamic macro definitions, needed *after* the custom keycodes. +#include "hacker_dvorak.c" +#include "user/eeconfig_init_user.c" +#include "user/process_record_user.c" +#include "plover/plover_mode.c" +#include "user/layer_set_state_user.c" diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/layers/layers_definitions.c b/keyboards/ergodox_ez/keymaps/hacker_dvorak/layers/layers_definitions.c new file mode 100644 index 000000000..f190e4f6f --- /dev/null +++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/layers/layers_definitions.c @@ -0,0 +1,12 @@ +enum layers { // Hacker Dvorak keyboard layers: + DVORAK = 0, // * Dvorak base layer. + PLOVER = 1, // * Steno layer for use with Plover. + GAMING = 2, // * Gaming layer intended for general purpose playing. + ARROWS = 3, // * Arrows movement keys and edition shortcuts. + MOUSE = 4, // * Mouse movement keys and edition shortcuts. + NUMPAD = 5, // * ATM style numpad with symbols and letters that should suffice to input any numeric literal. + LAYERS = 6, // * Layer switcher used to change between DVORAK, PLOVER and GAMING layers. + MEDIA_FN = 7, // * Media, RGB and function keys from F1 to F24 in symmetric fashion. + HYPER = 8, // * Hot keys layer (uses hyper + F1 .. F24) suitable for global shortcut tasks. + FIRMWARE = 9 // * Layer with firmware related functionality, like the reset and EEPROM keys. +}; diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/leader/leader_dictionary.c b/keyboards/ergodox_ez/keymaps/hacker_dvorak/leader/leader_dictionary.c new file mode 100644 index 000000000..8d5fa00a7 --- /dev/null +++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/leader/leader_dictionary.c @@ -0,0 +1,14 @@ +LEADER_DICTIONARY() { + leading = false; + leader_end(); + + SEQ_ONE_KEY(TD(APMR_PIPE)) { + register_code(KC_LCTL); + register_code(KC_LSFT); + register_code(KC_U); + + unregister_code(KC_U); + unregister_code(KC_LSFT); + unregister_code(KC_LCTL); + } +} diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/leader/leader_setup.c b/keyboards/ergodox_ez/keymaps/hacker_dvorak/leader/leader_setup.c new file mode 100644 index 000000000..1e89c4bfc --- /dev/null +++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/leader/leader_setup.c @@ -0,0 +1,14 @@ +LEADER_EXTERNS(); + +void qk_leader_start(void) { + if (!leading) { + leading = true; + leader_time = timer_read(); + leader_sequence_size = 0; + leader_sequence[0] = 0; + leader_sequence[1] = 0; + leader_sequence[2] = 0; + leader_sequence[3] = 0; + leader_sequence[4] = 0; + } +} diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/plover/plover_mode.c b/keyboards/ergodox_ez/keymaps/hacker_dvorak/plover/plover_mode.c new file mode 100644 index 000000000..b38826490 --- /dev/null +++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/plover/plover_mode.c @@ -0,0 +1,20 @@ +// TODO: improve feedback +void plover_toggle(void) { + // Press "PHROLG" + register_code(PV_LP); + register_code(PV_LH); + register_code(PV_LR); + register_code(PV_O); + register_code(PV_RL); + register_code(PV_RG); + + // Release "PHROLG" + unregister_code(PV_LP); + unregister_code(PV_LH); + unregister_code(PV_LR); + unregister_code(PV_O); + unregister_code(PV_RL); + unregister_code(PV_RG); +} + +bool PLOVER_MODE = false; diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/readme.md b/keyboards/ergodox_ez/keymaps/hacker_dvorak/readme.md index c7df0d748..8089a6d55 100644 --- a/keyboards/ergodox_ez/keymaps/hacker_dvorak/readme.md +++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/readme.md @@ -17,8 +17,8 @@ I plan to use [QMK](https://docs.qmk.fm) in the future, in order to overcome som * All symbols (including shifted symbols). * All modifier are dual keys positioned near the home row. 2. Querty - * Used to overcome the limitation pointed above, when your OS layout is set to Dvorak instead of US, this way you can use - Standard Dvorak (available by default on all the main operating systems) on other normal keybdoards and Hacker Dvorak on + * Used to overcome the limitation pointed above, when your OS layout is set to Dvorak instead of US, this way you can use + Standard Dvorak (available by default on all the main operating systems) on other normal keybdoards and Hacker Dvorak on the Ergodox EZ Shine at the same time, without changing back and forth tho OS layout. 3. Gaming * Still in development. @@ -35,7 +35,7 @@ I plan to use [QMK](https://docs.qmk.fm) in the future, in order to overcome som 6. Numpad * ATM style numpad. * All modifier keys. - * Letters from `A` to `F` for hexadecimal numbers (`B` is also used for binary numeric literals in most programming + * Letters from `A` to `F` for hexadecimal numbers (`B` is also used for binary numeric literals in most programming languages, ie. `0b11001`). * `X` for hexadecimal numeric literals in most programming languages, ie. `0xbeef`. * `O` for octal numeric literals in most programming languages, ie `0o123`. @@ -52,11 +52,11 @@ I plan to use [QMK](https://docs.qmk.fm) in the future, in order to overcome som * Useful for custom application shortcuts. 10. Meh Fn + * Useful for custom standard shortcuts. - + ## To Do Add images. *** -Please comment below if you have any ideas or suggestions. If you have used this layout or used it as a base, I'd love to hear about your experience! \ No newline at end of file +Please comment below if you have any ideas or suggestions. If you have used this layout or used it as a base, I'd love to hear about your experience! diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/rules.mk b/keyboards/ergodox_ez/keymaps/hacker_dvorak/rules.mk index 4aa2f262b..51a9ff0d4 100644 --- a/keyboards/ergodox_ez/keymaps/hacker_dvorak/rules.mk +++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/rules.mk @@ -1,35 +1,40 @@ # Set any rules.mk overrides for your specific keymap here. # See rules at https://docs.qmk.fm/#/config_options?id=the-rulesmk-file -NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -TAP_DANCE_ENABLE = yes -MOUSEKEY_ENABLE = yes # Mouse keys(+4700b). -EXTRAKEY_ENABLE = yes # Audio control and System control(+450b). -SLEEP_LED_ENABLE = yes # Turn off leds when computer is sleeping. -KEY_LOCK_ENABLE = yes # (+1730b) -RGBLIGHT_ENABLE = yes -LEADER_ENABLE = yes +NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +TAP_DANCE_ENABLE = yes +MOUSEKEY_ENABLE = yes # Mouse keys(+4700b). +EXTRAKEY_ENABLE = yes # Audio control and System control(+450b). +RGBLIGHT_ENABLE = yes +LEADER_ENABLE = yes -UNICODE_ENABLE = no # For Unicode. +UNICODE_ENABLE = no COMMAND_ENABLE = no # Commands for debug and configuration SWAP_HANDS_ENABLE = no # Allow swapping hands of keyboard. # This are by default off: -# CONSOLE_ENABLE = no # Console for debug(+400) -# BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +# COMBO_ENABLE = no +# UCIS_ENABLE = no # For Unicode. +# UNICODEMAP_ENABLE = no +# SLEEP_LED_ENABLE = no # Turn off leds when computer is sleeping. +# KEY_LOCK_ENABLE = no # (+1730b) +# CONSOLE_ENABLE = no # Console for debug(+400b) +# BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000b) # API_SYSEX_ENABLE = no # MIDI_ENABLE = no -# UNICODEMAP_ENABLE = no # BLUETOOTH_ENABLE = no # AUDIO_ENABLE = no # FAUXCLICKY_ENABLE = no # VARIABLE_TRACE = no # BACKLIGHT_ENABLE = no # RGB_MATRIX_ENABLE = no -# COMBO_ENABLE = no +# POINTING_DEVICE_ENABLE = no -# This don't need argument: +# AUTO_SHIFT_ENABLE = no +# AUTO_SHIFT_MODIFIERS = no + +# This don't need argument? # CUSTOM_MATRIX # Custom matrix file for the ErgoDox EZ # SPLIT_KEYBOARD diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/tap_dance/mod_tap_layer_dances/none_lead.c b/keyboards/ergodox_ez/keymaps/hacker_dvorak/tap_dance/mod_tap_layer_dances/none_lead.c new file mode 100644 index 000000000..6debc1ce4 --- /dev/null +++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/tap_dance/mod_tap_layer_dances/none_lead.c @@ -0,0 +1,40 @@ +//instanalize an instance of 'tap' for the None - Lead tap dance. +static tap none_lead_state = { + .is_press_action = true, + .state = 0 +}; + +void none_lead_finished(qk_tap_dance_state_t *state, void *user_data) { + none_lead_state.state = current_dance(state); + switch (none_lead_state.state) { + case SINGLE_TAP: + register_code(KC_NO); + break; + + case SINGLE_HOLD: + register_code(KC_LALT); + register_code(KC_LSFT); + break; + + case DOUBLE_TAP: + qk_leader_start(); + break; + } +} + +void none_lead_reset(qk_tap_dance_state_t *state, void *user_data) { + switch (none_lead_state.state) { + case SINGLE_TAP: + unregister_code(KC_NO); + break; + + case SINGLE_HOLD: + unregister_code(KC_LALT); + unregister_code(KC_LSFT); + break; + + case DOUBLE_TAP: + break; + } + none_lead_state.state = 0; +} diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/tap_dance/tap_dance_actions.c b/keyboards/ergodox_ez/keymaps/hacker_dvorak/tap_dance/tap_dance_actions.c new file mode 100644 index 000000000..550e1f7c8 --- /dev/null +++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/tap_dance/tap_dance_actions.c @@ -0,0 +1,20 @@ +// Register the double tap dances: +qk_tap_dance_action_t tap_dance_actions[] = { + [EQL_PLUS] = ACTION_TAP_DANCE_DOUBLE(KC_EQL, KC_PLUS), + [MINS_UNDS] = ACTION_TAP_DANCE_DOUBLE(KC_MINS, KC_UNDS), + [SLSH_BSLS] = ACTION_TAP_DANCE_DOUBLE(KC_SLSH, KC_BSLS), + [GRV_TILD] = ACTION_TAP_DANCE_DOUBLE(KC_GRV, KC_TILD), + [QUOT_DQUO] = ACTION_TAP_DANCE_DOUBLE(KC_QUOT, KC_DQUO), + [SCLN_COLN] = ACTION_TAP_DANCE_DOUBLE(KC_SCLN, KC_COLN), + [ASTR_CIRC] = ACTION_TAP_DANCE_DOUBLE(KC_ASTR, KC_CIRC), + [APMR_PIPE] = ACTION_TAP_DANCE_DOUBLE(KC_AMPR, KC_PIPE), + [EXLM_QUES] = ACTION_TAP_DANCE_DOUBLE(KC_EXLM, KC_QUES), + [HASH_PERC] = ACTION_TAP_DANCE_DOUBLE(KC_HASH, KC_PERC), + [AT_DLR] = ACTION_TAP_DANCE_DOUBLE(KC_AT, KC_DLR), + [LPRN_LBRC] = ACTION_TAP_DANCE_DOUBLE(KC_LPRN, KC_LBRC), + [RPRN_RBRC] = ACTION_TAP_DANCE_DOUBLE(KC_RPRN, KC_RBRC), + [LCBR_LABK] = ACTION_TAP_DANCE_DOUBLE(KC_LCBR, KC_LABK), + [RCBR_RABK] = ACTION_TAP_DANCE_DOUBLE(KC_RCBR, KC_RABK), + [DOT_COMM] = ACTION_TAP_DANCE_DOUBLE(KC_DOT, KC_COMM), + [NONE_LEAD] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, none_lead_finished, none_lead_reset, DANCING_TERM) +}; diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/tap_dance/tap_dance_setup.c b/keyboards/ergodox_ez/keymaps/hacker_dvorak/tap_dance/tap_dance_setup.c new file mode 100644 index 000000000..340ccca13 --- /dev/null +++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/tap_dance/tap_dance_setup.c @@ -0,0 +1,75 @@ +typedef struct { + bool is_press_action; + int state; +} tap; + +enum { + SINGLE_TAP = 1, + SINGLE_HOLD = 2, + DOUBLE_TAP = 3, + DOUBLE_HOLD = 4, + DOUBLE_SINGLE_TAP = 5, // Send two single taps. + TRIPLE_TAP = 6, + TRIPLE_HOLD = 7, + TRIPLE_SINGLE_TAP = 8 // Send three single taps. +}; + +/* Return an integer that corresponds to what kind of tap dance should be executed. + * + * How to figure out tap dance state: interrupted and pressed. + * + * Interrupted: If the state of a dance dance is "interrupted", that means that another key has been hit + * under the tapping term. This is typically indicitive that you are trying to "tap" the key. + * + * Pressed: Whether or not the key is still being pressed. If this value is true, that means the tapping term + * has ended, but the key is still being pressed down. This generally means the key is being "held". + * + * One thing that is currenlty not possible with qmk software in regards to tap dance is to mimic the "permissive hold" + * feature. In general, advanced tap dances do not work well if they are used with commonly typed letters. + * For example "A". Tap dances are best used on non-letter keys that are not hit while typing letters. + * + * Good places to put an advanced tap dance: + * z,q,x,j,k,v,b, any function key, home/end, comma, semi-colon + * + * Criteria for "good placement" of a tap dance key: + * Not a key that is hit frequently in a sentence + * Not a key that is used frequently to double tap, for example 'tab' is often double tapped in a terminal, or + * in a web form. So 'tab' would be a poor choice for a tap dance. + * Letters used in common words as a double. For example 'p' in 'pepper'. If a tap dance function existed on the + * letter 'p', the word 'pepper' would be quite frustating to type. + * + * For the third point, there does exist the 'DOUBLE_SINGLE_TAP', however this is not fully tested + * + */ +int current_dance(qk_tap_dance_state_t *state) { + int current_state = 0; + if (state->count == 1) { + if (state->interrupted || !state->pressed) { + current_state = SINGLE_TAP; + } else { + current_state = SINGLE_HOLD; //key has not been interrupted, but they key is still held. Means you want to send a 'HOLD'. + } + } else if (state->count == 2) { + /* + * DOUBLE_SINGLE_TAP is to distinguish between typing "pepper", and actually wanting a double tap + * action when hitting 'pp'. Suggested use case for this return value is when you want to send two + * keystrokes of the key, and not the 'double tap' action/macro. + */ + if (state->interrupted) { + current_state = DOUBLE_SINGLE_TAP; + } else if (state->pressed) { + current_state = DOUBLE_HOLD; + } else { + current_state = DOUBLE_TAP; + } + } else if (state->count == 3) { + if (state->interrupted) { + current_state = TRIPLE_SINGLE_TAP; + } else if (state->pressed) { + current_state = TRIPLE_HOLD; + } else { + current_state = TRIPLE_TAP; + } + } + return current_state; +} diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/tap_dance/tap_dances.c b/keyboards/ergodox_ez/keymaps/hacker_dvorak/tap_dance/tap_dances.c new file mode 100644 index 000000000..3d4469872 --- /dev/null +++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/tap_dance/tap_dances.c @@ -0,0 +1,74 @@ + //--------------------------------------------------------------------------------------------// + // | | | | | // + // Single tap | Single hold | Double tap | Double hold | Triple tap | Triple hold // +// Mod tap dances: // | | | | | // +enum tap_dances { //--------------------------------------------------------------------------------------------// + // | | | | | // + EQL_PLUS = 0, // = | + | | | | // + // | | | | | // + //--------------------------------------------------------------------------------------------// + // | | | | | // + MINS_UNDS = 1, // - | _ | | | | // + // | | | | | // + //--------------------------------------------------------------------------------------------// + // | | | | | // + SLSH_BSLS = 2, // / | \ | | | | // + // | | | | | // + //--------------------------------------------------------------------------------------------// + // | | | | | // + GRV_TILD = 3, // ` | ~ | | | | // + // | | | | | // + //--------------------------------------------------------------------------------------------// + // | | | | | // + QUOT_DQUO = 4, // ' | " | | | | // + // | | | | | // + //--------------------------------------------------------------------------------------------// + // | | | | | // + SCLN_COLN = 5, // ; | : | | | | // + // | | | | | // + //--------------------------------------------------------------------------------------------// + // | | | | | // + ASTR_CIRC = 6, // * | ^ | | | | // + // | | | | | // + //--------------------------------------------------------------------------------------------// + // | | | | | // + APMR_PIPE = 7, // & | | | | | | // + // | | | | | // + //--------------------------------------------------------------------------------------------// + // | | | | | // + EXLM_QUES = 8, // ! | ? | | | | // + // | | | | | // + //--------------------------------------------------------------------------------------------// + // | | | | | // + HASH_PERC = 9, // # | % | | | | // + // | | | | | // + //--------------------------------------------------------------------------------------------// + // | | | | | // + AT_DLR = 10, // @ | $ | | | | // + // | | | | | // + //--------------------------------------------------------------------------------------------// + // | | | | | // + LPRN_LBRC = 11, // ( | [ | | | | // + // | | | | | // + //--------------------------------------------------------------------------------------------// + // | | | | | // + RPRN_RBRC = 12, // ) | ] | | | | // + // | | | | | // + //--------------------------------------------------------------------------------------------// + // | | | | | // + LCBR_LABK = 13, // { | < | | | | // + // | | | | | // + //--------------------------------------------------------------------------------------------// + // | | | | | // + RCBR_RABK = 14, // } | > | | | | // + // | | | | | // + //--------------------------------------------------------------------------------------------// + // | | | | | // + DOT_COMM = 15, // . | , | | | | // + // | | | | | // + //--------------------------------------------------------------------------------------------// + // | | | | | // + NONE_LEAD = 16, // NONE | ALT+SHIFT | LEAD | | | // + // | | | | | // + //--------------------------------------------------------------------------------------------// +}; diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/user/eeconfig_init_user.c b/keyboards/ergodox_ez/keymaps/hacker_dvorak/user/eeconfig_init_user.c new file mode 100644 index 000000000..41b7b6694 --- /dev/null +++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/user/eeconfig_init_user.c @@ -0,0 +1,3 @@ +// void eeconfig_init_user(void) { +// +// }; diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/user/layer_set_state_user.c b/keyboards/ergodox_ez/keymaps/hacker_dvorak/user/layer_set_state_user.c new file mode 100644 index 000000000..e2eeed6fa --- /dev/null +++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/user/layer_set_state_user.c @@ -0,0 +1,121 @@ + +uint32_t layer_state_set_user(uint32_t state) { + uint8_t layer = biton32(state); + + switch (layer) { + case DVORAK: + rgblight_sethsv_noeeprom_green(); + rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT); + + if (PLOVER_MODE) { + plover_toggle(); + PLOVER_MODE = false; + } + + break; + + case PLOVER: + rgblight_sethsv_noeeprom_red(); + rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3); + + if (!(PLOVER_MODE)) { + plover_toggle(); + PLOVER_MODE = true; + } + + break; + + case GAMING: + rgblight_sethsv_noeeprom_red(); + rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2); + + if (PLOVER_MODE) { + plover_toggle(); + PLOVER_MODE = false; + } + + break; + + case ARROWS: + rgblight_sethsv_noeeprom_blue(); + rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2); + + if (PLOVER_MODE) { + plover_toggle(); + PLOVER_MODE = false; + } + + break; + + case MOUSE: + rgblight_sethsv_noeeprom_blue(); + rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2); + + if (PLOVER_MODE) { + plover_toggle(); + PLOVER_MODE = false; + } + + break; + + case NUMPAD: + rgblight_sethsv_noeeprom_blue(); + rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2); + + if (PLOVER_MODE) { + plover_toggle(); + PLOVER_MODE = false; + } + + break; + + case LAYERS: + rgblight_sethsv_noeeprom_cyan(); + rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2); + + if (PLOVER_MODE) { + plover_toggle(); + PLOVER_MODE = false; + } + + break; + + case MEDIA_FN: + rgblight_sethsv_noeeprom_yellow(); + rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2); + + if (PLOVER_MODE) { + plover_toggle(); + PLOVER_MODE = false; + } + + break; + + case HYPER: + rgblight_sethsv_noeeprom_magenta(); + rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2); + + if (PLOVER_MODE) { + plover_toggle(); + PLOVER_MODE = false; + } + + break; + + case FIRMWARE: + rgblight_sethsv_noeeprom_magenta(); + rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2); + + if (PLOVER_MODE) { + plover_toggle(); + PLOVER_MODE = false; + } + + break; + + default: + break; + } + + return state; +} diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/user/matrix_scan_user.c b/keyboards/ergodox_ez/keymaps/hacker_dvorak/user/matrix_scan_user.c new file mode 100644 index 000000000..3b78079cc --- /dev/null +++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/user/matrix_scan_user.c @@ -0,0 +1,12 @@ +#include "../leader/leader_setup.c" + +bool MATRIX_SCANNED = false; + +void matrix_scan_user(void) { + if (!(MATRIX_SCANNED)) { + rgblight_sethsv_noeeprom_green(); + MATRIX_SCANNED = true; + } + + #include "../leader/leader_dictionary.c" +}; diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/user/process_record_user.c b/keyboards/ergodox_ez/keymaps/hacker_dvorak/user/process_record_user.c new file mode 100644 index 000000000..764463582 --- /dev/null +++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/user/process_record_user.c @@ -0,0 +1,75 @@ +// TODO: Improve this currently there is no feedback if activated by other means. +bool CAPS_LOCK = false; +bool NUM_LOCK = false; +bool SCROLL_LOCK = false; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (!process_record_dynamic_macro(keycode, record)) { + return false; + } + + switch (keycode) { + case KC_CLCK: + if (record->event.pressed) { + if (!(CAPS_LOCK)) { + ergodox_right_led_1_on(); + CAPS_LOCK = true; + } else { + ergodox_right_led_1_off(); + CAPS_LOCK = false; + } + } + + return true; + + case KC_NLCK: + if (record->event.pressed) { + if (!(NUM_LOCK)) { + ergodox_right_led_2_on(); + NUM_LOCK = true; + } else { + ergodox_right_led_2_off(); + NUM_LOCK = false; + } + } + + return true; + + case KC_SLCK: + if (record->event.pressed) { + if (!(SCROLL_LOCK)) { + ergodox_right_led_3_on(); + SCROLL_LOCK = true; + } else { + ergodox_right_led_3_off(); + SCROLL_LOCK = false; + } + } + + return true; + + case KC_MS_WH_UP ... KC_MS_WH_RIGHT: + if (record->event.pressed) { + if (SCROLL_LOCK) { + return false; + } else { + return true; + } + } + + case MY_CUSTOM_MACRO: + if (record->event.pressed) { + SEND_STRING("QMK is the best thing ever!"); // this is our macro! + return false; + } + + case MY_OTHER_MACRO: + if (record->event.pressed) { + SEND_STRING(SS_LCTRL("ac")); // selects all and copies + return false; + } + + default: + return true; + } +} From f3cbb7bd6e307186e5802fa0366a21a5f9f5e41c Mon Sep 17 00:00:00 2001 From: Skyler Lewis Date: Wed, 19 Dec 2018 17:54:19 -0700 Subject: [PATCH 727/788] update the alairock keymap for dichotomy (#4687) Just a couple placement updates to my layout on the dichotomy keyboard. --- keyboards/dichotomy/keymaps/alairock/keymap.c | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/keyboards/dichotomy/keymaps/alairock/keymap.c b/keyboards/dichotomy/keymaps/alairock/keymap.c index f39a226b7..a1d196fb0 100644 --- a/keyboards/dichotomy/keymaps/alairock/keymap.c +++ b/keyboards/dichotomy/keymaps/alairock/keymap.c @@ -43,34 +43,34 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_RAISE] = LAYOUT( /* Shifted layout, small changes (because angle brackets have been moved to thumb cluster buttons) */ _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, - _______, _______, KC_VOLD, KC_VOLU, KC_MPLY, KC_MFFD, KC_MUTE, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, _______, - _______, _______, _______, _______, _______, KC_MRWD, _______, _______, _______, KC_BSLS, KC_QUOT, _______, + _______, _______, KC_VOLD, KC_VOLU, KC_MPLY, KC_MFFD, KC_MUTE, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, _______, + _______, _______, KC_GRV, _______, _______, KC_MRWD, _______, _______, _______, KC_BSLS, KC_QUOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_LABK, _______, _______, KC_RABK, _______, _______ ), [_LOWER] = LAYOUT( /* Number layout, basically the main function layer */ - _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, _______, - _______, KC_TILD, KC_GRV, KC_F13, KC_F14, KC_F15, KC_F16, KC_F7, KC_F8, KC_F9, KC_F10, _______, - _______, _______, _______, _______, _______, _______, - _______, RAISE, _______, _______, _______, _______, _______, _______ + _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, + _______, _______, KC_VOLD, KC_VOLU, KC_MPLY, KC_MFFD, KC_MUTE, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, _______, + _______, _______, KC_TILD, _______, _______, KC_MRWD, _______, _______, _______, KC_PIPE, KC_DQT, _______, + _______, _______, _______, _______, _______, _______, + _______, RAISE, _______, _______, _______, _______, _______, _______ ), [_ADJUST] = LAYOUT( /* Shifted number/function layout, for per-key control. Only active when shift is held, and number is toggled or held */ - _______, _______, _______, _______, _______, _______, _______, _______, KC_UP, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______ + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, _______, _______, KC_UP, _______, _______, _______, + KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, + KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______ ), [_MOUSE] = LAYOUT( /* Mouse layer, including buttons for clicking. */ _______, _______, _______, _______, _______, _______, KC_VOLU, KC_HOME, KC_PGUP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, MS_BTN1, MS_BTN2, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLD, KC_END, KC_PGDN, _______, _______, _______, - _______, _______, _______, _______, KC_UP, _______, - _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______ + _______, _______, _______, _______, KC_UP, _______, + _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______ ) }; // end keymaps block From 374ed67e87f8cba4e239696eecbb7477ce0286f1 Mon Sep 17 00:00:00 2001 From: Kevin Hogeland Date: Thu, 20 Dec 2018 01:43:17 -0800 Subject: [PATCH 728/788] Add PROGMEM keyword to Clueboard keymaps --- keyboards/clueboard/60/keymaps/default/keymap.c | 4 ++-- keyboards/clueboard/60/keymaps/default_aek/keymap.c | 4 ++-- keyboards/clueboard/60/keymaps/yanfali/keymap.c | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/keyboards/clueboard/60/keymaps/default/keymap.c b/keyboards/clueboard/60/keymaps/default/keymap.c index 8397c4bbf..3e906737b 100644 --- a/keyboards/clueboard/60/keymaps/default/keymap.c +++ b/keyboards/clueboard/60/keymaps/default/keymap.c @@ -1,4 +1,4 @@ -#include "60.h" +#include QMK_KEYBOARD_H #define _______ KC_TRNS @@ -32,7 +32,7 @@ enum custom_keycodes { float song_zelda_puzzle[][2] = SONG(ZELDA_PUZZLE); #endif -const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Layer 0: Default Layer * ,-----------------------------------------------------------. * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| `|BSp| diff --git a/keyboards/clueboard/60/keymaps/default_aek/keymap.c b/keyboards/clueboard/60/keymaps/default_aek/keymap.c index 63b1d8ba2..ea5333e3c 100644 --- a/keyboards/clueboard/60/keymaps/default_aek/keymap.c +++ b/keyboards/clueboard/60/keymaps/default_aek/keymap.c @@ -1,4 +1,4 @@ -#include "60.h" +#include QMK_KEYBOARD_H #define _______ KC_TRNS @@ -8,7 +8,7 @@ enum keyboard_layers { _CL }; -const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Layer 0: Default Layer * ,-----------------------------------------------------------. * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| BkSp| diff --git a/keyboards/clueboard/60/keymaps/yanfali/keymap.c b/keyboards/clueboard/60/keymaps/yanfali/keymap.c index eec17720a..b810bdcf8 100644 --- a/keyboards/clueboard/60/keymaps/yanfali/keymap.c +++ b/keyboards/clueboard/60/keymaps/yanfali/keymap.c @@ -1,4 +1,4 @@ -#include "60.h" +#include QMK_KEYBOARD_H #define _______ KC_TRNS @@ -33,7 +33,7 @@ enum custom_keycodes { float song_zelda_puzzle[][2] = SONG(ZELDA_PUZZLE); #endif -const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Layer 0: Default Layer * ,-----------------------------------------------------------------. * |Esc | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| `|BSp| From af55ef84182efbc148698d3528d48f2bf0fb730f Mon Sep 17 00:00:00 2001 From: noroadsleft Date: Sun, 16 Dec 2018 00:11:08 -0800 Subject: [PATCH 729/788] GSKT-00 Configurator update - add JSON data for LAYOUT_all layout - fix ISO Enter on LAYOUT_60_iso_tsangan layout --- keyboards/gskt00/info.json | 94 ++++++++++++++++++++++++++++++++------ 1 file changed, 81 insertions(+), 13 deletions(-) diff --git a/keyboards/gskt00/info.json b/keyboards/gskt00/info.json index 88191240b..bfbb1fd7c 100644 --- a/keyboards/gskt00/info.json +++ b/keyboards/gskt00/info.json @@ -1,16 +1,84 @@ { - "keyboard_name": "gskt00", - "url": "", - "maintainer": "nachie", - "width": 15, - "height": 5, - "layouts": { - "LAYOUT_60_ansi_tsangan": { - "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.5}, {"label":"Win", "x":1.5, "y":4}, {"label":"Alt", "x":2.5, "y":4, "w":1.5}, {"x":4, "y":4, "w":7}, {"label":"Alt", "x":11, "y":4, "w":1.5}, {"label":"Win", "x":12.5, "y":4}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}] - }, - - "LAYOUT_60_iso_tsangan": { - "layout": [{"label":"\u00ac", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"\"", "x":2, "y":0}, {"label":"\u00a3", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"@", "x":11.75, "y":2}, {"label":"~", "x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":2, "w":1.25}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"label":"|", "x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.5}, {"label":"Win", "x":1.5, "y":4}, {"label":"Alt", "x":2.5, "y":4, "w":1.5}, {"x":4, "y":4, "w":7}, {"label":"AltGr", "x":11, "y":4, "w":1.5}, {"label":"Menu", "x":12.5, "y":4}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}] - } + "keyboard_name": "gskt00", + "url": "", + "maintainer": "nachie", + "width": 15, + "height": 5, + "layouts": { + "LAYOUT_60_ansi_tsangan": { + "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.5}, {"label":"Win", "x":1.5, "y":4}, {"label":"Alt", "x":2.5, "y":4, "w":1.5}, {"x":4, "y":4, "w":7}, {"label":"Alt", "x":11, "y":4, "w":1.5}, {"label":"Win", "x":12.5, "y":4}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}] + }, + + "LAYOUT_60_iso_tsangan": { + "layout": [{"label":"\u00ac", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"\"", "x":2, "y":0}, {"label":"\u00a3", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"@", "x":11.75, "y":2}, {"label":"~", "x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"label":"|", "x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.5}, {"label":"Win", "x":1.5, "y":4}, {"label":"Alt", "x":2.5, "y":4, "w":1.5}, {"x":4, "y":4, "w":7}, {"label":"AltGr", "x":11, "y":4, "w":1.5}, {"label":"Menu", "x":12.5, "y":4}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}] + }, + + "LAYOUT_all": { + "layout": [ + {"label":"Esc", "x":0, "y":0}, + {"label":"1", "x":1, "y":0}, + {"label":"2", "x":2, "y":0}, + {"label":"3", "x":3, "y":0}, + {"label":"4", "x":4, "y":0}, + {"label":"5", "x":5, "y":0}, + {"label":"6", "x":6, "y":0}, + {"label":"7", "x":7, "y":0}, + {"label":"8", "x":8, "y":0}, + {"label":"9", "x":9, "y":0}, + {"label":"0", "x":10, "y":0}, + {"label":"-", "x":11, "y":0}, + {"label":"=", "x":12, "y":0}, + {"label":"\\", "x":13, "y":0}, + {"label":"`", "x":14, "y":0}, + {"label":"Tab", "x":0, "y":1, "w":1.5}, + {"label":"Q", "x":1.5, "y":1}, + {"label":"W", "x":2.5, "y":1}, + {"label":"E", "x":3.5, "y":1}, + {"label":"R", "x":4.5, "y":1}, + {"label":"T", "x":5.5, "y":1}, + {"label":"Y", "x":6.5, "y":1}, + {"label":"U", "x":7.5, "y":1}, + {"label":"I", "x":8.5, "y":1}, + {"label":"O", "x":9.5, "y":1}, + {"label":"P", "x":10.5, "y":1}, + {"label":"[", "x":11.5, "y":1}, + {"label":"]", "x":12.5, "y":1}, + {"label":"Backspace", "x":13.5, "y":1, "w":1.5}, + {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, + {"label":"A", "x":1.75, "y":2}, + {"label":"S", "x":2.75, "y":2}, + {"label":"D", "x":3.75, "y":2}, + {"label":"F", "x":4.75, "y":2}, + {"label":"G", "x":5.75, "y":2}, + {"label":"H", "x":6.75, "y":2}, + {"label":"J", "x":7.75, "y":2}, + {"label":"K", "x":8.75, "y":2}, + {"label":"L", "x":9.75, "y":2}, + {"label":";", "x":10.75, "y":2}, + {"label":"'", "x":11.75, "y":2}, + {"label":"Enter", "x":12.75, "y":2, "w":2.25}, + {"label":"Shift", "x":0, "y":3, "w":1.25}, + {"label":"ISO \\", "x":1.25, "y":3}, + {"label":"Z", "x":2.25, "y":3}, + {"label":"X", "x":3.25, "y":3}, + {"label":"C", "x":4.25, "y":3}, + {"label":"V", "x":5.25, "y":3}, + {"label":"B", "x":6.25, "y":3}, + {"label":"N", "x":7.25, "y":3}, + {"label":"M", "x":8.25, "y":3}, + {"label":",", "x":9.25, "y":3}, + {"label":".", "x":10.25, "y":3}, + {"label":"/", "x":11.25, "y":3}, + {"label":"Shift", "x":12.25, "y":3, "w":1.75}, + {"label":"Fn", "x":14, "y":3}, + {"label":"Ctrl", "x":0, "y":4, "w":1.5}, + {"label":"GUI", "x":1.5, "y":4}, + {"label":"Alt", "x":2.5, "y":4, "w":1.5}, + {"label":"Space", "x":4, "y":4, "w":7}, + {"label":"Alt", "x":11, "y":4, "w":1.5}, + {"label":"GUI", "x":12.5, "y":4}, + {"label":"Ctrl", "x":13.5, "y":4, "w":1.5} + ] } } +} From 29830f306f682f731d64950eba43953d95503967 Mon Sep 17 00:00:00 2001 From: MakotoKurauchi Date: Fri, 21 Dec 2018 01:55:03 +0900 Subject: [PATCH 730/788] Keyboard: Pr/helixpico add layout kc (#4686) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add some comment about Helix customize and auto-setup RGBLIGHT_LIMIT_VAL * add define USB_MAX_POWER_CONSUMPTION * Helix keyboard OLED, RGBLIGHT enable/disable control integrate into rules.mk rules.mk: add 4 Variables for compile control. # Helix keyboard customize # you can edit follows 4 Variables # jp: 以下の4つの変数を必要に応じて編集します。 OLED_ENABLE = no # OLED_ENABLE LED_BACK_ENABLE = no # LED backlight (Enable WS2812 RGB underlight.) LED_UNDERGLOW_ENABLE = no # LED underglow (Enable WS2812 RGB underlight.) LED_ANIMATIONS = yes # LED animations config.h: auto set RGBLED_NUM by HELIX_ROWS and rules.mk's define * HELIX_ROWS define move from config.h to rules.mk * add readme.md * rename readme.md to readme_jp.md * add readme.md and modify readme_jp.md * change helix/ssd1306.c for select glcdfont.c position * add variable LOCAL_GLCDFONT into each keymaps rules.mk * Add iPhone/iPad LED support to Helix default keymap * renumber _ADJUST for shrink program size * Fix Helix i2c wrong bit rate * add helix serial debug code * serial debug macro move from config.h to serial.h * helix serial.c debugging... * refine debug macros * add some comments * add SELECT_SERIAL_SPEED * add comments * debugging sync_send/sync_recv * add very high speed * fix sync_send/sync_recv * fix com. start and switch send/recv * debug mode off * remove debug codes * temporary change, compiling C, C++ and ASM without -g * helix config.h refine * Revert "temporary change, compiling C, C++ and ASM without -g" This reverts commit e9730cbbfd94fbcf792d992e3a1a65ad279b24d6. * add change_reciver2sender()/change_sender2reciver() This is a change to improve readability. * txled, rxled off in matrix_init() * add serial_send_packet() / serial_recive_packet() This is a change to reduce object size. * add serial_low() at ISR() top * add __attribute__((always_inline)) to some functions * modify serial_send_packet()/serial_recive_packet() A little, object size reduction. A little, speedup. * add debug code to helix/serial.c * Adjust sampling timing of serial signal being received * add split_scomm.c/split_scomm.h and change serial.c/serial.h serial.c was divided into 2 layers, split_scom.c and serial.c. The upper layer split_scomm.c is called from matrix.c. The lower layer serial.c accesses the hardware. * add split_scomm.c/split_scomm.h into helix/rev1 * reduce object size helix/rev2/matrix.c * remove checksum check, add parity check * force occur parity error for test * parity test ok. remove test code * change some comment & add skip code when buffer_size == 0 * serial.c: multiple types of transaction support Add 4 bits transaction-type field at packet top. Select Transaction Descriptor Table entry by transaction-type. * helix serial master-slave transaction optimize Using multi-type transaction feature of serial.c, communication contents between master slaves were optimized. * add debug code for retry * add comment into each config.h * fix ISR status drop * add a debug macro 'debug_retry_chg()' * reduce led_test size * remove debug code from helix/serial.c and etc. * helix:five_rows change TAPPING_TERM value 140 * Improved compatibility with let's split of serial.c. Finish helix/serial.c improvement. - The difference with the original let's split's serial.c - It's high-speed about 4 times. - Stable bi-directional data transfer. (Helix need master to slave transfer) - serial.h was divided 2 files, serial_config.h and sereial.h - With multiple types of transaction support, communication contents can be optimized. (NEW flexible API) - USE OLD Simple APIs (compatible with let's split serial.c) - files : - serial_config.h -- hardware configuration (need include by config.h) - serial.c/serial.h -- serial communication - USE NEW flexible APIs. (Support multi-type transaction function.) serial.c was divided into 2 layers, split_scom.c and serial.c. The upper layer split_scomm.c is called from matrix.c. The lower layer serial.c accesses the hardware. - files - split_scomm.c -- communication buffer is defined in here. call by matrix.c. - split_scomm.h -- buffer size is defined in here. include by matrix.c, split_util.c - serial_config.h -- hardware configuration (need include by config.h) To use the NEW API, specify #define SERIAL_USE_MULTI_TRANSACTION - serial.c/serial.h -- serial communication lower layer - NEW APIs for serial.c / serial.h (The lower layer) // Soft Serial Transaction Descriptor typedef struct _SSTD_t { uint8_t *status; uint8_t initiator2target_buffer_size; uint8_t *initiator2target_buffer; uint8_t target2initiator_buffer_size; uint8_t *target2initiator_buffer; } SSTD_t; // initiator is transaction start side void soft_serial_initiator_init(SSTD_t *sstd_table); // target is interrupt accept side void soft_serial_target_init(SSTD_t *sstd_table); int soft_serial_transaction(int sstd_index); int soft_serial_get_and_clean_target_status(int sstd_index); - NEW APIs for split_scomm.c / split_scomm.h (The upper layer) move from old serial.c the following buffer and functions serial_slave_buffer[] serial_master_buffer[] void serial_master_init(void) void serial_slave_init(void) int serial_update_buffers(void) define SERIAL_xxxxx_BUFFER_LENGTH move from serial_config.h to split_scomm.h * fix comment typo * Fix the value of helix:five_rows variable HELIX_ROWS to 5. * led_test rules.mk some change * Separate common parts of helix/rev2/keymaps/*/rules.mk into helix/rev2/keymaps_common.mk * helix/rev2/keymaps/edvorakjp/rules.mk use helix/rev2/keymaps_common.mk * Separate common parts of helix/pico/keymaps/*/rules.mk into helix/pico/keymaps_common.mk * Helix each keymap's using rgblight mode symbol instead magic number No change in build result. * Helix pico keymaps: make rgblight modes selectable. No change in build result. * Helix rev2 keymaps: make rgblight modes selectable. No change in build result. * fixed Helix froggy/keymap.c: invalid rgblight mode value 0 to 1 (=RGBLIGHT_MODE_STATIC_LIGHT) * Deselect RGB_TEST and ALTERNATING in Helix rev2,pico keymaps config.h. * Merge branch 'master' of https://github.com/qmk/qmk_firmware * revert 955dcbc * delete keymaps_common.mk * add LAYOUT_kc() to keyboards/helix/pico/pico.h --- keyboards/helix/pico/pico.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/keyboards/helix/pico/pico.h b/keyboards/helix/pico/pico.h index a3d658daa..153132775 100644 --- a/keyboards/helix/pico/pico.h +++ b/keyboards/helix/pico/pico.h @@ -62,4 +62,18 @@ } #endif +#define LAYOUT_kc( \ + L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \ + L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \ + L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \ + L30, L31, L32, L33, L34, L35, L36, R36, R30, R31, R32, R33, R34, R35 \ + ) \ + LAYOUT( \ + KC_##L00, KC_##L01, KC_##L02, KC_##L03, KC_##L04, KC_##L05, KC_##R00, KC_##R01, KC_##R02, KC_##R03, KC_##R04, KC_##R05, \ + KC_##L10, KC_##L11, KC_##L12, KC_##L13, KC_##L14, KC_##L15, KC_##R10, KC_##R11, KC_##R12, KC_##R13, KC_##R14, KC_##R15, \ + KC_##L20, KC_##L21, KC_##L22, KC_##L23, KC_##L24, KC_##L25, KC_##R20, KC_##R21, KC_##R22, KC_##R23, KC_##R24, KC_##R25, \ + KC_##L30, KC_##L31, KC_##L32, KC_##L33, KC_##L34, KC_##L35, KC_##L36, KC_##R36, KC_##R30, KC_##R31, KC_##R32, KC_##R33, KC_##R34, KC_##R35 \ + ) + + #endif From 1586548b4f45f76d9cd05be4ee9588b3d4b3860e Mon Sep 17 00:00:00 2001 From: Emily Soldal Date: Wed, 19 Dec 2018 14:46:18 +0100 Subject: [PATCH 731/788] Enable RGB animations in Atom47 --- keyboards/atom47/rev3/config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/atom47/rev3/config.h b/keyboards/atom47/rev3/config.h index 8a91e2990..b94dc9773 100644 --- a/keyboards/atom47/rev3/config.h +++ b/keyboards/atom47/rev3/config.h @@ -61,7 +61,7 @@ along with this program. If not, see . #define RGB_DI_PIN F5 // The pin the LED strip is connected to #define RGBLED_NUM 6 // Number of LEDs in your strip - +#define RGBLIGHT_ANIMATIONS #define QMK_ESC_OUTPUT B7 // usually COL #define QMK_ESC_INPUT B3 // usually ROW #define QMK_LED E6 From 639585314863912480c9967fc38bb2d9418a34ab Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Thu, 20 Dec 2018 08:58:12 -0800 Subject: [PATCH 732/788] Docs: Add additional clarification to Leader Key documention (#4660) * Add clarification for Leader Timeout * Add additional documentatin to config_options.md * Add leader_start() and leader_end() documentation * Add Examples * Clarify timout * Remove customization * Improve docs based on feedback * Better clarification of features * Fix example * Spelling/grammar issue * Spelling and clarification --- docs/config_options.md | 1 + docs/feature_leader_key.md | 82 ++++++++++++++++++++++++++++++++++---- 2 files changed, 76 insertions(+), 7 deletions(-) diff --git a/docs/config_options.md b/docs/config_options.md index fb1655e9a..879761a40 100644 --- a/docs/config_options.md +++ b/docs/config_options.md @@ -143,6 +143,7 @@ If you define these options you will enable the associated feature, which may in * Breaks any Tap Toggle functionality (`TT` or the One Shot Tap Toggle) * `#define LEADER_TIMEOUT 300` * how long before the leader key times out + * If you're having issues finishing the sequence before it times out, you may need to increase the timeout setting. Or you may want to enable the `LEADER_PER_KEY_TIMING` option, which resets the timeout after each key is tapped. * `#define LEADER_PER_KEY_TIMING` * sets the timer for leader key chords to run on each key press rather than overall * `#define ONESHOT_TIMEOUT 300` diff --git a/docs/feature_leader_key.md b/docs/feature_leader_key.md index 9b49e0fd9..168a1fc1c 100644 --- a/docs/feature_leader_key.md +++ b/docs/feature_leader_key.md @@ -5,10 +5,11 @@ If you've ever used Vim, you know what a Leader key is. If not, you're about to That's what `KC_LEAD` does. Here's an example: 1. Pick a key on your keyboard you want to use as the Leader key. Assign it the keycode `KC_LEAD`. This key would be dedicated just for this -- it's a single action key, can't be used for anything else. -2. Include the line `#define LEADER_TIMEOUT 300` in your config.h. The 300 there is 300ms -- that's how long you have for the sequence of keys following the leader. You can tweak this value for comfort, of course. -3. Within your `matrix_scan_user` function, do something like this: +2. Include the line `#define LEADER_TIMEOUT 300` in your `config.h`. This sets the timeout for the `KC_LEAD` key. Specifically, when you press the `KC_LEAD` key, you only have a certain amount of time to complete the Leader Key sequence. The `300` here sets that to 300ms, and you can increase this value to give you more time to hit the sequence. But any keys pressed during this timeout are intercepted and not sent, so you may want to keep this value low. . + * By default, this timeout is how long after pressing `KC_LEAD` to complete your entire sequence. This may be very low for some people. So you may want to increase this timeout. Optionally, you may want to enable the `LEADER_PER_KEY_TIMING` option, which resets the timeout after each key is tapped. This allows you to maintain a low value here, but still be able to use the longer sequences. To enable this option, add `#define LEADER_PER_KEY_TIMING` to your `config.h`. +3. Within your `matrix_scan_user` function, add something like this: -``` +```c LEADER_EXTERNS(); void matrix_scan_user(void) { @@ -44,7 +45,7 @@ Each of these accepts one or more keycodes as arguments. This is an important po To add support for Leader Key you simply need to add a single line to your keymap's `rules.mk`: -``` +```make LEADER_ENABLE = yes ``` @@ -53,20 +54,87 @@ LEADER_ENABLE = yes Rather than relying on an incredibly high timeout for long leader key strings or those of us without 200wpm typing skills, we can enable per key timing to ensure that each key pressed provides us with more time to finish our stroke. This is incredibly helpful with leader key emulation of tap dance (read: multiple taps of the same key like C, C, C). In order to enable this, place this in your `config.h`: -``` +```c #define LEADER_PER_KEY_TIMING ``` After this, it's recommended that you lower your `LEADER_TIMEOUT` to something less that 300ms. -``` +```c #define LEADER_TIMEOUT 250 ``` Now, something like this won't seem impossible to do without a 1000MS leader key timeout: -``` +```c SEQ_THREE_KEYS(KC_C, KC_C, KC_C) { SEND_STRING("Per key timing is great!!!"); } ``` + +## Customization + +The Leader Key feature has some additional customization to how the Leader Key feature works. It has two functions that can be called at certain parts of the process. Namely `leader_start()` and `leader_end()`. + +The `leader_start()` function is called when you tap the `KC_LEAD` key, and the `leader_end()` function is called when either the leader sequence is completed, or the leader timeout is hit. + +You can add these functions to your code (`keymap.c` usually) to add feedback to the Leader sequences (such as beeping or playing music). + +```c +void leader_start(void) { + // sequence started +} + +void leader_end(void) { + // sequence ended (no success/failuer detection) +} +``` + +### Example + +This example will play the Mario "One Up" sound when you hit `KC_LEAD` to start the Leader Sequence, and will play "All Star" if it completes successfully or "Rick Roll" you if it fails. + +```c +bool did_leader_succeed; +#ifdef AUDIO_ENABLE +float leader_start[][2] = SONG(ONE_UP_SOUND ); +float leader_succeed[][2] = SONG(ALL_STAR); +float leader_fail[][2] = SONG(RICK_ROLL); +#endif +LEADER_EXTERNS(); + +void matrix_scan_user(void) { + LEADER_DICTIONARY() { + did_leader_succeed = leading = false; + + SEQ_ONE_KEY(KC_E) { + // Anything you can do in a macro. + SEND_STRING(SS_LCTRL(SS_LSFT("t"))); + did_leader_succeed = true; + } else + SEQ_TWO_KEYS(KC_E, KC_D) { + SEND_STRING(SS_LGUI("r")"cmd"SS_TAP(KC_ENTER)SS_LCTRL("c")); + did_leader_succeed = true; + } + leader_end(); + } +} + +void leader_start(void) { +#ifdef AUDIO_ENABLE + PLAY_SONG(leader_start); +#endif +} + +void leader_end(void) { + if (did_leader_succeed) { +#ifdef AUDIO_ENABLE + PLAY_SONG(leader_succeed); +#endif + } else { +#ifdef AUDIO_ENABLE + PLAY_SONG(leader_fail); +#endif + } +} +``` From 30c3f3b2bd9c68ba8bba644fcfa97152a4834c03 Mon Sep 17 00:00:00 2001 From: Takeshi ISHII <2170248+mtei@users.noreply.github.com> Date: Fri, 21 Dec 2018 02:50:51 +0900 Subject: [PATCH 733/788] Keymap: Add Helix/pico keymap 'mtei' (#4696) * add pico keymap 'mtei' * num layer key change --- keyboards/helix/pico/keymaps/mtei/config.h | 52 +++ keyboards/helix/pico/keymaps/mtei/keymap.c | 496 +++++++++++++++++++++ keyboards/helix/pico/keymaps/mtei/rules.mk | 129 ++++++ 3 files changed, 677 insertions(+) create mode 100644 keyboards/helix/pico/keymaps/mtei/config.h create mode 100644 keyboards/helix/pico/keymaps/mtei/keymap.c create mode 100644 keyboards/helix/pico/keymaps/mtei/rules.mk diff --git a/keyboards/helix/pico/keymaps/mtei/config.h b/keyboards/helix/pico/keymaps/mtei/config.h new file mode 100644 index 000000000..c5812de8d --- /dev/null +++ b/keyboards/helix/pico/keymaps/mtei/config.h @@ -0,0 +1,52 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +// place overrides here + +#ifdef AUDIO_ENABLE + #define STARTUP_SONG SONG(STARTUP_SOUND) + #define AUDIO_CLICKY +#endif + +#undef TAPPING_TERM +#define TAPPING_TERM 300 +#define PERMISSIVE_HOLD +/* when TAPPING_TERM >= 500 same effect PERMISSIVE_HOLD. + see tmk_core/common/action_tapping.c */ + +// If you need more program area, try select and reduce rgblight modes to use. + +// Selection of RGBLIGHT MODE to use. +#if defined(LED_ANIMATIONS) + #define RGBLIGHT_EFFECT_BREATHING + #define RGBLIGHT_EFFECT_RAINBOW_MOOD + #define RGBLIGHT_EFFECT_RAINBOW_SWIRL + //#define RGBLIGHT_EFFECT_SNAKE + //#define RGBLIGHT_EFFECT_KNIGHT + #define RGBLIGHT_EFFECT_CHRISTMAS + #define RGBLIGHT_EFFECT_STATIC_GRADIENT + //#define RGBLIGHT_EFFECT_RGB_TEST + //#define RGBLIGHT_EFFECT_ALTERNATING +#endif + +#endif /* CONFIG_USER_H */ diff --git a/keyboards/helix/pico/keymaps/mtei/keymap.c b/keyboards/helix/pico/keymaps/mtei/keymap.c new file mode 100644 index 000000000..27bf06243 --- /dev/null +++ b/keyboards/helix/pico/keymaps/mtei/keymap.c @@ -0,0 +1,496 @@ +#include QMK_KEYBOARD_H +#include "bootloader.h" +#ifdef PROTOCOL_LUFA +#include "lufa.h" +#include "split_util.h" +#endif +#ifdef AUDIO_ENABLE + #include "audio.h" +#endif +#ifdef SSD1306OLED + #include "ssd1306.h" +#endif +#ifdef CONSOLE_ENABLE + #include +#endif + +extern keymap_config_t keymap_config; + +#ifdef RGBLIGHT_ENABLE +//Following line allows macro to read current RGB settings +extern rgblight_config_t rgblight_config; +#endif + +extern uint8_t is_master; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +enum layer_number { + _QWERTY = 0, + _COLEMAK, + _DVORAK, + _EUCALYN, + _NUML, + _NUMR, + _LOWER, + _RAISE, + _ADJUST, +}; + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + EUCALYN, + NUML, + NUMR, + KC_xEISU, + KC_xKANA, + KC_ZERO2, + RGBRST +}; + +//Macros +#define KC_LOWER MO(_LOWER) +#define KC_NUML LT(_NUML,KC_SPC) +#define KC_NUMR LT(_NUMR,KC_SPC) +#define KC_RABS LT(_RAISE,KC_BSPC) +#define KC_RAEN LT(_RAISE,KC_ENT) +#define KC_____ _______ +#define KC_XXXX XXXXXXX +#define KC_ADJ MO(_ADJUST) +#define KC_LSMI LSFT(KC_MINS) +#define KC_LSEQ LSFT(KC_EQL) +#define KC_LSRB LSFT(KC_RBRC) +#define KC_LSLB LSFT(KC_LBRC) +#define KC_LSGR LSFT(KC_GRV) +#define KC_LSQT LSFT(KC_QUOT) +#define ___ _______ +#define KC_S0 LSFT(KC_0) +#define KC_S1 LSFT(KC_1) +#define KC_S2 LSFT(KC_2) +#define KC_S3 LSFT(KC_3) +#define KC_S4 LSFT(KC_4) +#define KC_S5 LSFT(KC_5) +#define KC_S6 LSFT(KC_6) +#define KC_S7 LSFT(KC_7) +#define KC_S8 LSFT(KC_8) +#define KC_S9 LSFT(KC_9) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* Qwerty + * ,-----------------------------------------. ,-----------------------------------------. + * | ESC | Q | W | E | R | T | | Y | U | I | O | P | \ | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | A | S | D | F | G | | H | J | K | L | ; | Ctrl | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | | N | M | , | . | / | Shift| + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * |Lower | Lower| Caps | Alt | GUI | Space| BS | Enter| Space| GUI | Alt | Menu |Lower |Lower | + * `-------------------------------------------------------------------------------------------------' + */ + [_QWERTY] = LAYOUT_kc( \ + ESC, Q, W, E, R, T, Y, U, I, O, P, BSLS, \ + LCTL, A, S, D, F, G, H, J, K, L, SCLN, RCTL, \ + LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, RSFT, \ + LOWER,LOWER, CAPS, LALT, LGUI,NUML, RABS, RAEN,NUMR, RGUI, RALT, APP,LOWER, LOWER \ + ), + + /* Colemak + * ,-----------------------------------------. ,-----------------------------------------. + * | ESC | Q | W | F | P | G | | J | L | U | Y | ; | \ | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | A | R | S | T | D | | H | N | E | I | O | Ctrl | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | | K | M | , | . | / | Shift| + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * |Lower | Lower| Caps | Alt | GUI | Space| BS | Enter| Space| GUI | Alt | Menu |Lower |Lower | + * `-------------------------------------------------------------------------------------------------' + */ + [_COLEMAK] = LAYOUT_kc( \ + ESC, Q, W, F, P, G, J, L, U, Y, SCLN, BSLS, \ + LCTL, A, R, S, T, D, H, N, E, I, O, RCTL, \ + LSFT, Z, X, C, V, B, K, M, COMM, DOT, SLSH, RSFT, \ + LOWER,LOWER, CAPS, LALT, LGUI,NUML, RABS, RAEN,NUMR, RGUI, RALT, APP,LOWER, LOWER \ + ), + + /* Dvorak + * ,-----------------------------------------. ,-----------------------------------------. + * | ESC | ' | , | . | P | Y | | F | G | C | R | L | \ | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | A | O | E | U | I | | D | H | T | N | S | Ctrl | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | | B | M | W | V | Z | Shift| + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * |Lower | Lower| Caps | Alt | GUI | Space| BS | Enter| Space| GUI | Alt | Menu |Lower |Lower | + * `-------------------------------------------------------------------------------------------------' + */ + [_DVORAK] = LAYOUT_kc( \ + ESC, QUOT, COMM, DOT, P, Y, F, G, C, R, L, BSLS, \ + LCTL, A, O, E, U, I, D, H, T, N, S, RCTL, \ + LSFT, SCLN, Q, J, K, X, B, M, W, V, Z, RSFT, \ + LOWER,LOWER, CAPS, LALT, LGUI,NUML, RABS, RAEN,NUMR, RGUI, RALT, APP,LOWER, LOWER \ + ), + + /* Eucalyn (http://eucalyn.hatenadiary.jp/entry/about-eucalyn-layout) + * ,-----------------------------------------. ,-----------------------------------------. + * | ESC | Q | W | , | . | ; | | M | R | D | Y | P | \ | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | A | O | E | I | U | | G | T | K | S | N | Ctrl | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shift| Z | X | C | V | F | | B | H | J | L | / | Shift| + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * |Lower | Lower| Caps | Alt | GUI | Space| BS | Enter| Space| GUI | Alt | Menu |Lower |Lower | + * `-------------------------------------------------------------------------------------------------' + */ + [_EUCALYN] = LAYOUT_kc( \ + ESC, Q, W, COMM, DOT, SCLN, M, R, D, Y, P, BSLS, \ + LCTL, A, O, E, I, U, G, T, K, S, N, RCTL, \ + LSFT, Z, X, C, V, F, B, H, J, L, SLSH, RSFT, \ + LOWER,LOWER, CAPS, LALT, LGUI,NUML, RABS, RAEN,NUMR, RGUI, RALT, APP,LOWER, LOWER \ + ), + + /* Num + * ,-----------------------------------------. ,-----------------------------------------. + * | | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | F12 | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | | | | + * `-------------------------------------------------------------------------------------------------' + */ + [_NUML] = LAYOUT_kc( \ + ____, S1, S2, S3, S4, S5, S6, S7, S8, S9, S0, ____, \ + ____, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, F12, \ + ____, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, \ + ____, ____, ____, ____, ____, ____, ____, ____, SPC, ____, ____, ____, ____, ____ \ + ), + + [_NUMR] = LAYOUT_kc( \ + ____, S1, S2, S3, S4, S5, S6, S7, S8, S9, S0, ____, \ + ____, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, F12, \ + ____, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, \ + ____, ____, ____, ____, ____, SPC, ____, ____, ____, ____, ____, ____, ____, ____ \ + ), + + /* Lower + * ,-----------------------------------------. ,-----------------------------------------. + * | | |Pause | ScrLk| Ins | | | | Ins | ScrLk|Pause | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | PgUp | | Up |Delete| Home | | Home |Delete| Up | | PgUp | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | PgDn | Left | Down | Right| End | | End | Left | Down | Right| PgDn | | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | | | PrtSc| | | |Adjust|Adjust| | | | PrtSc| | | + * `-------------------------------------------------------------------------------------------------' + */ + [_LOWER] = LAYOUT_kc( \ + XXXX, XXXX, PAUS, SLCK, INS, XXXX, XXXX, INS, SLCK, PAUS, XXXX, ____, \ + ____, HOME, XXXX, UP, DEL, PGUP, PGUP, DEL, UP, XXXX, HOME, ____, \ + ____, END, LEFT, DOWN, RGHT, PGDN, PGDN, LEFT, DOWN, RGHT, END, ____, \ + ____, ____, PSCR, ____, ____, ____, ADJ, ADJ, ____, ____, ____, PSCR, ____, ____ \ + ), + + /* Raise + * ,-----------------------------------------. ,-----------------------------------------. + * | TAB | | | | _ | - | | = | + | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | EISU | | | | { | [ | | ] | } | | | | KANA | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | ~ | ` | | ' | " | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | | | | + * `-------------------------------------------------------------------------------------------------' + */ + [_RAISE] = LAYOUT_kc( \ + TAB, XXXX, XXXX, XXXX, LSMI, MINS, EQL, LSEQ, XXXX, XXXX, XXXX, XXXX, \ + xEISU, XXXX, XXXX, XXXX, LSLB, LBRC, RBRC, LSRB, XXXX, XXXX, XXXX, xKANA, \ + XXXX, XXXX, XXXX, XXXX, LSGR, GRV, QUOT, LSQT, XXXX, XXXX, XXXX, XXXX, \ + ADJ, ADJ, XXXX, ____, ____, XXXX, ____, ____, XXXX, ____, ____, XXXX, ADJ, ADJ \ + ), + + /* Adjust (Lower + Raise) + * ,-----------------------------------------. ,-----------------------------------------. + * | | Reset|RGBRST|RGB ON|Aud on| Win | | Win | |Qwerty|Euclyn|Colemk|Dvorak| + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | HUE+ | SAT+ | VAL+ |RGB md|Audoff| Mac | | Mac | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | HUE- | SAT- | VAL- | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | | | | + * `-------------------------------------------------------------------------------------------------' + */ + [_ADJUST] = LAYOUT( \ + XXXXXXX, RESET, RGBRST, RGB_TOG, AU_ON, AG_SWAP, AG_SWAP, XXXXXXX, QWERTY, EUCALYN, COLEMAK, DVORAK, \ + RGB_HUI, RGB_SAI, RGB_VAI, RGB_MOD, AU_OFF, AG_NORM, AG_NORM, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, ___,___, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______ \ + ) +}; + +#ifdef AUDIO_ENABLE + +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +float tone_dvorak[][2] = SONG(DVORAK_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); +float tone_plover[][2] = SONG(PLOVER_SOUND); +float tone_plover_gb[][2] = SONG(PLOVER_GOODBYE_SOUND); +float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); +#endif + +static int current_default_layer; + +uint32_t default_layer_state_set_kb(uint32_t state) { + // 1<<_QWERTY - 1 == 1 - 1 == _QWERTY (=0) + // 1<<_COLEMAK - 1 == 2 - 1 == _COLEMAK (=1) + current_default_layer = state - 1; + // 1<<_DVORAK - 2 == 4 - 2 == _DVORAK (=2) + if ( current_default_layer == 3 ) current_default_layer -= 1; + // 1<<_EUCALYN - 5 == 8 - 5 == _EUCALYN (=3) + if ( current_default_layer == 7 ) current_default_layer -= 4; + return state; +} + +void update_base_layer(int base) +{ + if( current_default_layer != base ) { + eeconfig_update_default_layer(1UL<event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_qwerty); + #endif + update_base_layer(_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_colemak); + #endif + update_base_layer(_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_dvorak); + #endif + update_base_layer(_DVORAK); + } + return false; + break; + case EUCALYN: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_dvorak); + #endif + update_base_layer(_EUCALYN); + } + return false; + break; + case KC_xEISU: + if (record->event.pressed) { + if(keymap_config.swap_lalt_lgui==false){ + register_code(KC_LANG2); + }else{ + SEND_STRING(SS_LALT("`")); + } + } else { + unregister_code(KC_LANG2); + } + return false; + break; + case KC_xKANA: + if (record->event.pressed) { + if(keymap_config.swap_lalt_lgui==false){ + register_code(KC_LANG1); + }else{ + SEND_STRING(SS_LALT("`")); + } + } else { + unregister_code(KC_LANG1); + } + return false; + break; + case RGBRST: + #ifdef RGBLIGHT_ENABLE + if (record->event.pressed) { + eeconfig_update_rgblight_default(); + rgblight_enable(); + } + #endif + break; + } + return true; +} + +void matrix_init_user(void) { + #ifdef AUDIO_ENABLE + startup_user(); + #endif + //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h + #ifdef SSD1306OLED + iota_gfx_init(!has_usb()); // turns on the display + #endif +} + + +#ifdef AUDIO_ENABLE + +void startup_user() +{ + _delay_ms(50); // gets rid of tick +} + +void shutdown_user() +{ + _delay_ms(150); + stop_all_notes(); +} + +void music_on_user(void) +{ + music_scale_user(); +} + +void music_scale_user(void) +{ + PLAY_SONG(music_scale); +} + +#endif + + +//SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h +#ifdef SSD1306OLED + +void matrix_scan_user(void) { + iota_gfx_task(); // this is what updates the display continuously +} + +void matrix_update(struct CharacterMatrix *dest, + const struct CharacterMatrix *source) { + if (memcmp(dest->display, source->display, sizeof(dest->display))) { + memcpy(dest->display, source->display, sizeof(dest->display)); + dest->dirty = true; + } +} + +static void render_logo(struct CharacterMatrix *matrix) { + + static char logo[]={ + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94, + 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4, + 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4, + 0}; + matrix_write(matrix, logo); +#if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_ANIMATIONS) + char buf[30]; + if(rgblight_config.enable) { + snprintf(buf, sizeof(buf), " LED %2d: %d,%d,%d ", + rgblight_config.mode, + rgblight_config.hue/RGBLIGHT_HUE_STEP, + rgblight_config.sat/RGBLIGHT_SAT_STEP, + rgblight_config.val/RGBLIGHT_VAL_STEP); + matrix_write(matrix, buf); + } +#endif + //matrix_write_P(&matrix, PSTR(" Split keyboard kit")); +} + +static const char Qwerty_name[] PROGMEM = " Qwerty"; +static const char Colemak_name[] PROGMEM = " Colemak"; +static const char Dvorak_name[] PROGMEM = " Dvorak"; +static const char Eucalyn_name[] PROGMEM = " Eucalyn"; + +static const char NumL_name[] PROGMEM = ":NumL"; +static const char NumR_name[] PROGMEM = ":NumR"; +static const char Lower_name[] PROGMEM = ":Func"; +static const char Raise_name[] PROGMEM = ":Extra"; +static const char Adjust_name[] PROGMEM = ":Adjust"; + +static const char *layer_names[] = { + [_QWERTY] = Qwerty_name, + [_COLEMAK] = Colemak_name, + [_DVORAK] = Dvorak_name, + [_EUCALYN] = Eucalyn_name, + + [_NUML] = NumL_name, + [_NUMR] = NumR_name, + [_LOWER] = Lower_name, + [_RAISE] = Raise_name, + [_ADJUST] = Adjust_name +}; + +void render_status(struct CharacterMatrix *matrix) { + + // Render to mode icon + static char logo[][2][3]={{{0x95,0x96,0},{0xb5,0xb6,0}},{{0x97,0x98,0},{0xb7,0xb8,0}}}; + if(keymap_config.swap_lalt_lgui==false){ + matrix_write(matrix, logo[0][0]); + matrix_write_P(matrix, PSTR("\n")); + matrix_write(matrix, logo[0][1]); + }else{ + matrix_write(matrix, logo[1][0]); + matrix_write_P(matrix, PSTR("\n")); + matrix_write(matrix, logo[1][1]); + } + + // Define layers here, Have not worked out how to have text displayed for each layer. Copy down the number you see and add a case for it below + int name_num; + uint32_t lstate; + matrix_write_P(matrix, layer_names[current_default_layer]); + matrix_write_P(matrix, PSTR("\n")); + for( lstate = layer_state, name_num = 0; + lstate && name_num < sizeof(layer_names)/sizeof(char *); + lstate >>=1, name_num++ ) { + if( (lstate & 1) != 0 ) { + if( layer_names[name_num] ) { + matrix_write_P(matrix, layer_names[name_num]); + } + } + } + + // Host Keyboard LED Status + char led[40]; + snprintf(led, sizeof(led), "\n%s %s %s", + (host_keyboard_leds() & (1< helix:defualt +## option= oled | back | under | na | ios +## ex. +## make HELIX=oled helix:defualt +## make HELIX=oled,back helix:defualt +## make HELIX=oled,under helix:defualt +## make HELIX=oled,back,na helix:defualt +## make HELIX=oled,back,ios helix:defualt +## +ifneq ($(strip $(HELIX)),) + ifeq ($(findstring oled,$(HELIX)), oled) + OLED_ENABLE = yes + endif + ifeq ($(findstring back,$(HELIX)), back) + LED_BACK_ENABLE = yes + else ifeq ($(findstring under,$(HELIX)), under) + LED_UNDERGLOW_ENABLE = yes + endif + ifeq ($(findstring na,$(HELIX)), na) + LED_ANIMATIONS = no + endif + ifeq ($(findstring ios,$(HELIX)), ios) + IOS_DEVICE_ENABLE = yes + endif + $(eval $(call HELIX_CUSTOMISE_MSG)) + $(info ) +endif + +# Uncomment these for checking +# jp: コンパイル時にカスタマイズの状態を表示したい時はコメントをはずします。 +# $(eval $(call HELIX_CUSTOMISE_MSG)) +# $(info ) + +ifeq ($(strip $(LED_BACK_ENABLE)), yes) + RGBLIGHT_ENABLE = yes + OPT_DEFS += -DRGBLED_BACK + ifeq ($(strip $(LED_UNDERGLOW_ENABLE)), yes) + $(eval $(call HELIX_CUSTOMISE_MSG)) + $(error LED_BACK_ENABLE and LED_UNDERGLOW_ENABLE both 'yes') + endif +else ifeq ($(strip $(LED_UNDERGLOW_ENABLE)), yes) + RGBLIGHT_ENABLE = yes +else + RGBLIGHT_ENABLE = no +endif + +ifeq ($(strip $(IOS_DEVICE_ENABLE)), yes) + OPT_DEFS += -DIOS_DEVICE_ENABLE +endif + +ifeq ($(strip $(LED_ANIMATIONS)), yes) + OPT_DEFS += -DLED_ANIMATIONS +endif + +ifeq ($(strip $(OLED_ENABLE)), yes) + OPT_DEFS += -DOLED_ENABLE +endif + +ifeq ($(strip $(LOCAL_GLCDFONT)), yes) + OPT_DEFS += -DLOCAL_GLCDFONT +endif + +ifeq ($(strip $(AUDIO_ENABLE)),yes) + ifeq ($(strip $(RGBLIGHT_ENABLE)),yes) + Link_Time_Optimization = yes + endif + ifeq ($(strip $(OLED_ENABLE)),yes) + Link_Time_Optimization = yes + endif +endif + +ifeq ($(strip $(Link_Time_Optimization)),yes) + EXTRAFLAGS += -flto -DUSE_Link_Time_Optimization +endif + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif + +# Uncomment these for debugging +# $(info -- RGBLIGHT_ENABLE=$(RGBLIGHT_ENABLE)) +# $(info -- OPT_DEFS=$(OPT_DEFS)) +# $(info ) From afd5cda4a0d832bacfff319177fe93968f686a11 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Thu, 20 Dec 2018 16:54:06 -0800 Subject: [PATCH 734/788] Fix up process_leader to be a bit more optimized (#4662) * Fix up process_leader to be a bit more optimized * Process dual function keys better * Make leader start a callable function * Fix per key timer call location * Add escape if already leading * Return false for KC_LEAD * Add documentation --- docs/config_options.md | 2 + docs/feature_leader_key.md | 6 +++ quantum/process_keycode/process_leader.c | 51 ++++++++++++++---------- quantum/process_keycode/process_leader.h | 2 +- 4 files changed, 40 insertions(+), 21 deletions(-) diff --git a/docs/config_options.md b/docs/config_options.md index 879761a40..4bbc5debd 100644 --- a/docs/config_options.md +++ b/docs/config_options.md @@ -146,6 +146,8 @@ If you define these options you will enable the associated feature, which may in * If you're having issues finishing the sequence before it times out, you may need to increase the timeout setting. Or you may want to enable the `LEADER_PER_KEY_TIMING` option, which resets the timeout after each key is tapped. * `#define LEADER_PER_KEY_TIMING` * sets the timer for leader key chords to run on each key press rather than overall +* `#define LEADER_KEY_STRICT_KEY_PROCESSING` + * Disables keycode filtering for Mod-Tap and Layer-Tap keycodes. Eg, if you enable this, you would need to specify `MT(MOD_CTL, KC_A)` if you want to use `KC_A`. * `#define ONESHOT_TIMEOUT 300` * how long before oneshot times out * `#define ONESHOT_TAP_TOGGLE 2` diff --git a/docs/feature_leader_key.md b/docs/feature_leader_key.md index 168a1fc1c..82cf78901 100644 --- a/docs/feature_leader_key.md +++ b/docs/feature_leader_key.md @@ -72,6 +72,12 @@ SEQ_THREE_KEYS(KC_C, KC_C, KC_C) { } ``` +## Strict Key Processing + +By default, the Leader Key feature will filter the keycode out of [`Mod-Tap`](feature_advanced_keycodes.md#mod-tap) and [`Layer Tap`](feature_advanced_keycodes.md#switching-and-toggling-layers) functions when checking for the Leader sequences. That means if you're using `LT(3, KC_A)`, it will pick this up as `KC_A` for the sequence, rather than `LT(3, KC_A)`, giving a more expected behavior for newer users. + +While, this may be fine for most, if you want to specify the whole keycode (eg, `LT(3, KC_A)` from the example above) in the sequence, you can enable this by added `#define LEADER_KEY_STRICT_KEY_PROCESSING` to your `config.h` file. This well then disable the filtering, and you'll need to specify the whole keycode. + ## Customization The Leader Key feature has some additional customization to how the Leader Key feature works. It has two functions that can be called at certain parts of the process. Namely `leader_start()` and `leader_end()`. diff --git a/quantum/process_keycode/process_leader.c b/quantum/process_keycode/process_leader.c index b32fc1db6..57fccdc7e 100644 --- a/quantum/process_keycode/process_leader.c +++ b/quantum/process_keycode/process_leader.c @@ -35,31 +35,42 @@ uint16_t leader_time = 0; uint16_t leader_sequence[5] = {0, 0, 0, 0, 0}; uint8_t leader_sequence_size = 0; +void qk_leader_start(void) { + if (leading) { return; } + leader_start(); + leading = true; + leader_time = timer_read(); + leader_sequence_size = 0; + leader_sequence[0] = 0; + leader_sequence[1] = 0; + leader_sequence[2] = 0; + leader_sequence[3] = 0; + leader_sequence[4] = 0; +} + bool process_leader(uint16_t keycode, keyrecord_t *record) { // Leader key set-up if (record->event.pressed) { + if (leading) { + if (timer_elapsed(leader_time) < LEADER_TIMEOUT) { +#ifndef LEADER_KEY_STRICT_KEY_PROCESSING + if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)) { + keycode = keycode & 0xFF; + } +#endif // LEADER_KEY_STRICT_KEY_PROCESSING + leader_sequence[leader_sequence_size] = keycode; + leader_sequence_size++; #ifdef LEADER_PER_KEY_TIMING - leader_time = timer_read(); + leader_time = timer_read(); #endif - if (!leading && keycode == KC_LEAD) { - leader_start(); - leading = true; -#ifndef LEADER_PER_KEY_TIMING - leader_time = timer_read(); -#endif - leader_time = timer_read(); - leader_sequence_size = 0; - leader_sequence[0] = 0; - leader_sequence[1] = 0; - leader_sequence[2] = 0; - leader_sequence[3] = 0; - leader_sequence[4] = 0; - return false; - } - if (leading && timer_elapsed(leader_time) < LEADER_TIMEOUT) { - leader_sequence[leader_sequence_size] = keycode; - leader_sequence_size++; - return false; + return false; + } + } else { + if (keycode == KC_LEAD) { + qk_leader_start(); + return false; + } + break; } } return true; diff --git a/quantum/process_keycode/process_leader.h b/quantum/process_keycode/process_leader.h index 59c3eed1b..15bccc3f6 100644 --- a/quantum/process_keycode/process_leader.h +++ b/quantum/process_keycode/process_leader.h @@ -24,7 +24,7 @@ bool process_leader(uint16_t keycode, keyrecord_t *record); void leader_start(void); void leader_end(void); - +void qk_leader_start(void); #define SEQ_ONE_KEY(key) if (leader_sequence[0] == (key) && leader_sequence[1] == 0 && leader_sequence[2] == 0 && leader_sequence[3] == 0 && leader_sequence[4] == 0) #define SEQ_TWO_KEYS(key1, key2) if (leader_sequence[0] == (key1) && leader_sequence[1] == (key2) && leader_sequence[2] == 0 && leader_sequence[3] == 0 && leader_sequence[4] == 0) From ca3564753526fc866d6195ab6b957781070a64f8 Mon Sep 17 00:00:00 2001 From: Gergely Peidl Date: Fri, 21 Dec 2018 14:38:21 +0100 Subject: [PATCH 735/788] Feature Unicode example code fixed. --- docs/feature_unicode.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/feature_unicode.md b/docs/feature_unicode.md index 1b083896a..9d57e2fb7 100644 --- a/docs/feature_unicode.md +++ b/docs/feature_unicode.md @@ -23,7 +23,7 @@ const uint32_t PROGMEM unicode_map[] = { [BANG] = 0x203D, // ‽ [IRONY] = 0x2E2E, // ⸮ [SNEK] = 0x1F40D, // 🐍 -}: +}; ``` Make sure that the order for both matches. From b21c592f1e42b016f020821ae2879d1681ee3321 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Fri, 21 Dec 2018 08:03:34 -0800 Subject: [PATCH 736/788] handwired/not_so_minidox: Configurator support (#4699) --- keyboards/handwired/not_so_minidox/info.json | 63 ++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 keyboards/handwired/not_so_minidox/info.json diff --git a/keyboards/handwired/not_so_minidox/info.json b/keyboards/handwired/not_so_minidox/info.json new file mode 100644 index 000000000..022209502 --- /dev/null +++ b/keyboards/handwired/not_so_minidox/info.json @@ -0,0 +1,63 @@ +{ + "keyboard_name": "Not So MiniDox", + "url": "", + "maintainer": "qmk", + "width": 12, + "height": 5.75, + "layouts": { + "LAYOUT": { + "key_count": 42, + "layout": [ + {"x":0, "y":0.375}, + {"x":1, "y":0.25}, + {"x":2, "y":0.125}, + {"x":3, "y":0}, + {"x":4, "y":0.125}, + {"x":5, "y":0.25}, + + {"x":8, "y":0.25}, + {"x":9, "y":0.125}, + {"x":10, "y":0}, + {"x":11, "y":0.125}, + {"x":12, "y":0.25}, + {"x":13, "y":0.375}, + + {"x":0, "y":1.375}, + {"x":1, "y":1.25}, + {"x":2, "y":1.125}, + {"x":3, "y":1}, + {"x":4, "y":1.125}, + {"x":5, "y":1.25}, + + {"x":8, "y":1.25}, + {"x":9, "y":1.125}, + {"x":10, "y":1}, + {"x":11, "y":1.125}, + {"x":12, "y":1.25}, + {"x":13, "y":1.375}, + + {"x":0, "y":2.375}, + {"x":1, "y":2.25}, + {"x":2, "y":2.125}, + {"x":3, "y":2}, + {"x":4, "y":2.125}, + {"x":5, "y":2.25}, + + {"x":8, "y":2.25}, + {"x":9, "y":2.125}, + {"x":10, "y":2}, + {"x":11, "y":2.125}, + {"x":12, "y":2.25}, + {"x":13, "y":2.375}, + + {"x":3.5, "y":4.75}, + {"x":4.5, "y":4.75}, + {"x":5.5, "y":3.75, "h":2}, + + {"x":7.5, "y":3.75, "h":2}, + {"x":8.5, "y":4.75}, + {"x":9.5, "y":4.75} + ] + } + } +} From f0863286ccde082475d9cb483354f19a4e4de67c Mon Sep 17 00:00:00 2001 From: Sascha Grunert Date: Fri, 21 Dec 2018 17:33:36 +0100 Subject: [PATCH 737/788] Update keymap for planck/rev6 (#4701) * Update keymap.c * Update rules and keymap * Update keymap rules --- keyboards/planck/keymaps/sascha/keymap.c | 4 ++-- keyboards/planck/keymaps/sascha/rules.mk | 13 +++++++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/keyboards/planck/keymaps/sascha/keymap.c b/keyboards/planck/keymaps/sascha/keymap.c index 93787599c..684b61f36 100644 --- a/keyboards/planck/keymaps/sascha/keymap.c +++ b/keyboards/planck/keymaps/sascha/keymap.c @@ -26,13 +26,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * ├──────┼──────┼──────┼──────┼──────┼──────┼──────┼──────┼──────┼──────┼──────┼──────┤ * │ SINS │ ♥ │ ≈ │ ✓ │ ✗ │ ← │ → │ € │ ß │ Ü │ Ö │ Ä │ * ├──────┼──────┼──────┼──────┼──────┼──────┼──────┼──────┼──────┼──────┼──────┼──────┤ - * │ Powr │ Rset │ BLSt │ Home │ End │ PgUp │ PgDn │ Left │ Down │ Up │ Rght │ │ + * │ Rset │ BLSt │ F1 │ Home │ End │ PgUp │ PgDn │ Left │ Down │ Up │ Rght │ │ * └──────┴──────┴──────┴──────┴──────┴──────┴──────┴──────┴──────┴──────┴──────┴──────┘ */ KC_TILD , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_DEL, KC_GRV , KC_EXLM , KC_AT , KC_HASH , KC_DLR , KC_PERC , KC_CIRC , KC_AMPR , KC_ASTR , UC(L'ü') , UC(L'ö') , UC(L'ä'), S(KC_INS) , UC(L'♥') , UC(L'≈') , UC(L'✓') , UC(L'✗') , UC(L'←') , UC(L'→') , UC(L'€') , UC(L'ß') , UC(L'Ü') , UC(L'Ö') , UC(L'Ä'), - KC_PWR , RESET , BL_STEP , KC_HOME , KC_END , KC_PGUP , KC_PGDN , KC_LEFT , KC_DOWN , KC_UP , KC_RGHT , KC_TRNS + RESET , BL_STEP , KC_F1 , KC_HOME , KC_END , KC_PGUP , KC_PGDN , KC_LEFT , KC_DOWN , KC_UP , KC_RGHT , KC_TRNS ) }; diff --git a/keyboards/planck/keymaps/sascha/rules.mk b/keyboards/planck/keymaps/sascha/rules.mk index d3918164d..276b71daa 100644 --- a/keyboards/planck/keymaps/sascha/rules.mk +++ b/keyboards/planck/keymaps/sascha/rules.mk @@ -1,5 +1,14 @@ AUTO_SHIFT_ENABLE = yes AUTO_SHIFT_MODIFIERS = yes -BACKLIGHT_ENABLE = yes UNICODE_ENABLE = yes -DEFAULT_FOLDER = planck/rev5 + +ifeq ($(strip $(KEYBOARD)), planck/rev5) +BACKLIGHT_ENABLE = yes +CONSOLE_ENABLE = no +endif +ifeq ($(strip $(KEYBOARD)), planck/rev6) +BACKLIGHT_ENABLE = no +CONSOLE_ENABLE = yes +EXTRALDFLAGS = -Wl,--build-id=none +UNICODE_ENABLE = yes +endif From af84f0ff86b6b7fd8fd77ef49393ebe964c793c0 Mon Sep 17 00:00:00 2001 From: Jeremy Herve Date: Fri, 21 Dec 2018 19:00:45 +0100 Subject: [PATCH 738/788] Keymap: Redox / jeherve: updates (#4694) * Start using send_unicode_hex_string for shrug See https://docs.qmk.fm/#/feature_unicode?id=send_unicode_hex_string * Make sure one can come back to main layer after tapping to NAV * Add 4 new keys to symbol layer ~, `, =, +, are now more accesssible. No need to reach out far from home row anymore * Add two new macro keys I did not have much use for the Expose key and the right Command key, so opted to replace those with 2 Macros: - One to invoke Alfred: https://www.alfredapp.com/ => Opt + Space - One to invoke 1password: https://1password.com/ => Cmd + Opt + \ * Update readme to mention changes in new version * Remove unneeded short definition * Shorter name for our custom key See https://github.com/qmk/qmk_firmware/pull/4694#discussion_r243341864 * Make macros one-liners See https://github.com/qmk/qmk_firmware/pull/4694#discussion_r243341487 * Switch to using eeconfig_init_user to set Unicode mode See https://github.com/qmk/qmk_firmware/pull/4694#issuecomment-449151724 --- keyboards/redox/keymaps/jeherve/keymap.c | 42 ++++++++++++----------- keyboards/redox/keymaps/jeherve/readme.md | 7 +++- 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/keyboards/redox/keymaps/jeherve/keymap.c b/keyboards/redox/keymaps/jeherve/keymap.c index c2852f312..f39b5a438 100644 --- a/keyboards/redox/keymaps/jeherve/keymap.c +++ b/keyboards/redox/keymaps/jeherve/keymap.c @@ -25,14 +25,11 @@ enum custom_keycodes { WAVE, YOSHI, THUMB_UP, - NBSP + NBSP, + INV_1P, + ALFRED }; -// Make macros a bit simpler with this shortcut. -#define TAP_ONCE(code) \ - register_code (code); \ - unregister_code (code) - // Is shift being held? Let's store this in a bool. static bool shift_held = false; @@ -40,16 +37,22 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch(keycode) { case SHRUG: if (record->event.pressed) { - unicode_input_start(); register_hex(0xaf); unicode_input_finish(); - TAP_ONCE (KC_BSLS); - register_code (KC_RSFT); TAP_ONCE (KC_MINS); TAP_ONCE (KC_9); unregister_code (KC_RSFT); - unicode_input_start (); register_hex(0x30c4); unicode_input_finish(); - register_code (KC_RSFT); TAP_ONCE (KC_0); TAP_ONCE (KC_MINS); unregister_code (KC_RSFT); - TAP_ONCE (KC_SLSH); - unicode_input_start (); register_hex(0xaf); unicode_input_finish(); + send_unicode_hex_string("00AF 005C 005F 0028 30C4 0029 005F 002F 00AF"); } return false; break; + case INV_1P: + if (record->event.pressed) { + SEND_STRING(SS_DOWN(X_LGUI)SS_DOWN(X_LALT)SS_TAP(X_BSLASH)SS_UP(X_LGUI)SS_UP(X_LALT)); + } + return false; + break; + case ALFRED: + if (record->event.pressed) { + SEND_STRING(SS_DOWN(X_LALT)SS_TAP(X_SPACE)SS_UP(X_LALT)); + } + return false; + break; case YOSHI: if (record->event.pressed) { SEND_STRING(":yellow_yoshi:"); @@ -125,7 +128,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { }; // Shortcut to make keymap more readable -#define KC_CTDN LCTL(KC_DOWN) #define KC_SYQT LT(_SYMB,KC_QUOT) #define SYM_L MO(_SYMB) #define MO_INTR MO(_INTER) @@ -152,13 +154,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ KC_GRV ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 , KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,KC_EQL , //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ - KC_TAB ,KC_Q ,KC_W ,KC_F ,KC_P ,KC_G ,KC_ESC , KC_CTDN ,KC_J ,KC_L ,KC_U ,KC_Y ,KC_SCLN ,KC_BSLS , + KC_TAB ,KC_Q ,KC_W ,KC_F ,KC_P ,KC_G ,KC_ESC , INV_1P ,KC_J ,KC_L ,KC_U ,KC_Y ,KC_SCLN ,KC_BSLS , //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ SYM_L ,KC_A ,KC_R ,KC_S ,KC_T ,KC_D ,M_BRACKET_LEFT, M_BRACKET_RIGHT ,KC_H ,KC_N ,KC_E ,KC_I ,KC_O ,KC_SYQT , //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ KC_LSFT ,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,TT(_NAV),TT(_SYMB), TT(_SYMB),TT(_NAV),KC_K ,KC_M ,KC_COMM ,KC_DOT ,KC_SLSH ,KC_RSFT , //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ - MO_INTR ,KC_LCTL ,KC_HYPR ,KC_LALT , KC_LCMD , KC_BSPC ,KC_LCTL , KC_ENT ,KC_SPC , KC_RCMD , TT_ADJ ,KC_HYPR ,KC_RCTL ,MO_INTR + MO_INTR ,KC_LCTL ,KC_HYPR ,KC_LALT , KC_LCMD , KC_BSPC ,KC_LCTL , KC_ENT ,KC_SPC , ALFRED , TT_ADJ ,KC_HYPR ,KC_RCTL ,MO_INTR //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ), @@ -170,7 +172,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ _______ ,KC_EXLM ,KC_AT ,KC_HASH ,KC_DLR ,KC_PERC ,KC_LCBR , KC_RCBR ,KC_CIRC ,KC_AMPR ,KC_ASTR ,KC_MINS ,KC_UNDS ,_______ , //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ - _______ ,_______ ,_______ ,_______ ,_______ ,_______ ,_______ ,_______ , _______ ,_______ ,_______ ,_______ ,_______ ,_______ ,_______ ,_______ , + _______ ,_______ ,_______ ,KC_TILD ,KC_GRV , _______ ,_______ ,_______ , _______ ,_______ ,_______ ,KC_EQL ,KC_PLUS ,_______ ,_______ ,_______ , //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ _______ ,_______ ,_______ ,_______ , _______ , _______ ,_______ , _______ ,_______ , _______ , _______ ,_______ ,_______ ,_______ //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ @@ -184,7 +186,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ XXXXXXX ,XXXXXXX ,KC_VOLD ,KC_VOLU ,KC_MUTE ,XXXXXXX ,_______ , _______ ,XXXXXXX ,KC_LEFT ,KC_DOWN ,KC_UP ,KC_RIGHT,XXXXXXX , //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ - XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ , _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ ,_______ , _______ ,_______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,_______ , _______ ,XXXXXXX , XXXXXXX , _______ ,XXXXXXX ,XXXXXXX ,_______ //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ @@ -230,8 +232,8 @@ void persistent_default_layer_set(uint16_t default_layer) { } // Set unicode in Mac OS. -void matrix_init_user(void) { - set_unicode_input_mode(UC_OSX); +void eeconfig_init_user(void) { + set_unicode_input_mode(UC_OSX); }; // Change LED colors depending on the layer. diff --git a/keyboards/redox/keymaps/jeherve/readme.md b/keyboards/redox/keymaps/jeherve/readme.md index 5afad5530..515dcbd62 100644 --- a/keyboards/redox/keymaps/jeherve/readme.md +++ b/keyboards/redox/keymaps/jeherve/readme.md @@ -1,7 +1,7 @@ # A Colemak keymap for the Redox keyboard ---- -![jeherve-redox-layout-3](https://user-images.githubusercontent.com/426388/45171716-69888200-b203-11e8-822d-7bc91f9f6c07.jpg) +![jeherve-redox-layout-4](https://user-images.githubusercontent.com/426388/50276398-2664be80-0442-11e9-86b9-fbd0f4275354.png) ---- @@ -25,6 +25,11 @@ My keymap uses 5 layers: ## Changelog +- 2018.12.20 + - 2 new Macro keys, to invoke [Alfred](https://www.alfredapp.com/) and [1Password](https://1password.com/). + - No more Right Command key or Expose key, I didn't use those much. + - Updates to use newer QMK function to call ¯\_(ツ)_/¯ + - Fix: you can now move back to the base layer when double tapping the thumb keys to switch to the Nav layer. 👍 - 2018.09.06 - Initial submission to QMK. It's alive! ⌨️ From ff8b1b9c6916a0817189a1c3079e8f2e09fc04b3 Mon Sep 17 00:00:00 2001 From: Jason Thigpen Date: Fri, 21 Dec 2018 17:39:10 -0800 Subject: [PATCH 739/788] Add crd's XD60 ANSI keymap (#4702) --- keyboards/xd60/keymaps/crd_ansi/README.md | 52 +++++++++++++++++++++++ keyboards/xd60/keymaps/crd_ansi/keymap.c | 30 +++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 keyboards/xd60/keymaps/crd_ansi/README.md create mode 100644 keyboards/xd60/keymaps/crd_ansi/keymap.c diff --git a/keyboards/xd60/keymaps/crd_ansi/README.md b/keyboards/xd60/keymaps/crd_ansi/README.md new file mode 100644 index 000000000..80e455024 --- /dev/null +++ b/keyboards/xd60/keymaps/crd_ansi/README.md @@ -0,0 +1,52 @@ +# ANSI Layout + +This is the standard ANSI keymap that I use on all of my 60% boards. This keymap +includes a single function layer available by holding the designated key on the +bottom row. + +I don't ever use Caps Lock, so that keycode is not mapped anywhere. In place of +the usual Caps Lock key, I have the following bnehaviour encoded: Escape when tapped +and Control when held. + +I also have the bottom right mod cluster mapped to navigational direction keys when tapped. +Shift = Up, Alt = Down, Ctrl = Right, Fn = Left. When held, these keys send the usual modifier +signals. + +``` +/* Base layer + * ,-----------------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Backspace | + * |-----------------------------------------------------------------------------------------+ + * | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | + * |-----------------------------------------------------------------------------------------+ + * | Esc/Ctrl| A | S | D | F | G | H | J | K | L | ; | ' | Enter | + * |-----------------------------------------------------------------------------------------+ + * | Shift | Z | X | C | V | B | N | M | , | . | ? | Shift | + * |-----------------------------------------------------------------------------------------+ + * | Ctrl | Alt | Cmd | Space | Cmd | Fn | Alt | Ctrl | + * `-----------------------------------------------------------------------------------------' + */ +``` + +While holding the function key, you have access to the following layout. Any key +not indicated is considered "transparent" and sends the signal indicated in the +layer below. This function later gets you dedicated access to Escape and Delete +keys, function keys on numbers, WASD directions, other navigation, multimedia +controls, RGB (underglow) controls, and firmware reset (DFU mode). + +``` +/* Fn layer + * ,-----------------------------------------------------------------------------------------. + * | Esc | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | Del | + * |-----------------------------------------------------------------------------------------+ + * | | Home| Up | End | | | | | Mute| | | Pg+ | Pg- | Reset | + * |-----------------------------------------------------------------------------------------+ + * | | Left| Down|Right| | | |Brt- |Vol- |Vol+ |Brt+ | | RGB Toggle | + * |-----------------------------------------------------------------------------------------+ + * | | | | | | | | |R(Bt-)|R(Bt+)|R(Rot)| | + * |-----------------------------------------------------------------------------------------+ + * | | | | | | | | | + * `-----------------------------------------------------------------------------------------' + */ + +``` \ No newline at end of file diff --git a/keyboards/xd60/keymaps/crd_ansi/keymap.c b/keyboards/xd60/keymaps/crd_ansi/keymap.c new file mode 100644 index 000000000..6964ca315 --- /dev/null +++ b/keyboards/xd60/keymaps/crd_ansi/keymap.c @@ -0,0 +1,30 @@ +#include QMK_KEYBOARD_H + +enum keyboard_layers { + _BL = 0, // Base Layer + _FL // Function Layer +}; + +// Custom #defined keycodes (shorter macros for readability) +#define KC_CTES CTL_T(KC_ESC) +#define KC_RSUP RSFT_T(KC_UP) +#define KC_FNLT LT(_FL, KC_LEFT) +#define KC_RADN RALT_T(KC_DOWN) +#define KC_RCRT RCTL_T(KC_RIGHT) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BL] = LAYOUT_60_ansi( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, + KC_CTES, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSUP, + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_FNLT, KC_RADN, KC_RCRT + ), + [_FL] = LAYOUT_60_ansi( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, + _______, KC_HOME, KC_UP, KC_END, _______, _______, _______, _______, KC_MUTE, _______, _______, KC_PGDN, KC_PGUP, RESET, + _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, KC_SLCK, KC_VOLD, KC_VOLU, KC_PAUS, _______, _______, RGB_TOG, + _______, _______, _______, _______, _______, _______, _______, _______, RGB_VAD, RGB_VAI, RGB_MOD, _______, + _______, _______, _______, _______, _______, _______, _______, _______ + ) +}; From 4d98c69e0297973789564ce508f2e8dafe69c32b Mon Sep 17 00:00:00 2001 From: Michael Pio Date: Sat, 22 Dec 2018 10:39:25 +0800 Subject: [PATCH 740/788] Update Vinta (#4705) * add support for configurator * add more layouts * fix default keymap --- keyboards/vinta/info.json | 18 +++++++++++++ keyboards/vinta/keymaps/default/keymap.c | 6 ++--- keyboards/vinta/vinta.h | 32 +++++++++++++++++++++++- 3 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 keyboards/vinta/info.json diff --git a/keyboards/vinta/info.json b/keyboards/vinta/info.json new file mode 100644 index 000000000..dd972c895 --- /dev/null +++ b/keyboards/vinta/info.json @@ -0,0 +1,18 @@ +{ + "keyboard_name": "vinta", + "url": "", + "maintainer": "Peioris", + "width": 16, + "height": 5, + "layouts": { + "LAYOUT_69_ansi": { + "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"~", "x":13, "y":0}, {"label":"|", "x":14, "y":0}, {"label":"Del", "x":15, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"PgUp", "x":15, "y":1}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"PgDn", "x":15, "y":2}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"label":"\u2191", "x":14, "y":3}, {"label":"End", "x":15, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4}, {"label":"Reset", "x":11, "y":4}, {"label":"Ctrl", "x":12, "y":4}, {"label":"\u2190", "x":13, "y":4}, {"label":"\u2193", "x":14, "y":4}, {"label":"\u2192", "x":15, "y":4}] + }, + "LAYOUT_68_tada": { + "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"~", "x":15, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Del", "x":15, "y":1}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"PgUp", "x":15, "y":2}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"label":"\u2191", "x":14, "y":3}, {"label":"PgDn", "x":15, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4}, {"label":"Menu", "x":11, "y":4}, {"label":"Ctrl", "x":12, "y":4}, {"label":"\u2190", "x":13, "y":4}, {"label":"\u2193", "x":14, "y":4}, {"label":"\u2192", "x":15, "y":4}] + }, + "LAYOUT_67_ansi": { + "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"~", "x":15, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Del", "x":15, "y":1}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"PgUp", "x":15, "y":2}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"label":"\u2191", "x":14, "y":3}, {"label":"PgDn", "x":15, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4, "w":1.25}, {"label":"Ctrl", "x":11.25, "y":4, "w":1.25}, {"label":"\u2190", "x":13, "y":4}, {"label":"\u2193", "x":14, "y":4}, {"label":"\u2192", "x":15, "y":4}] + } + } +} diff --git a/keyboards/vinta/keymaps/default/keymap.c b/keyboards/vinta/keymaps/default/keymap.c index 4e55ec308..80499d73f 100644 --- a/keyboards/vinta/keymaps/default/keymap.c +++ b/keyboards/vinta/keymaps/default/keymap.c @@ -33,8 +33,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT_69_ansi( KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, KC_DEL,\ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, KC_PGUP,\ - KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP,\ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN,\ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN,\ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END, \ KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT, RESET, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), }; @@ -48,4 +48,4 @@ void matrix_scan_user(void) { bool process_record_user(uint16_t keycode, keyrecord_t *record) { return true; -} \ No newline at end of file +} diff --git a/keyboards/vinta/vinta.h b/keyboards/vinta/vinta.h index 7f21157ee..991c981c9 100644 --- a/keyboards/vinta/vinta.h +++ b/keyboards/vinta/vinta.h @@ -22,4 +22,34 @@ { K40, K41, K42, XXX, XXX, K45, XXX, XXX, XXX, K49, K4A, XXX, K4C, K4D, K4E, K4F } \ } -#endif \ No newline at end of file +#define LAYOUT_68_tada( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0F, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1E, K1F, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2E, K2F, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3C, K3E, K3F, \ + K40, K41, K42, K45, K49, K4A, K4C, K4D, K4E, K4F \ +) \ +{ \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, XXX, K0F }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, XXX, K1E, K1F }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, XXX, XXX, K2E, K2F }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, XXX, K3C, XXX, K3E, K3F }, \ + { K40, K41, K42, XXX, XXX, K45, XXX, XXX, XXX, K49, K4A, XXX, XXX, K4D, K4E, K4F } \ +} + +#define LAYOUT_67_ansi( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0F, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1E, K1F, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2E, K2F, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3C, K3E, K3F, \ + K40, K41, K42, K45, K49, K4A, K4D, K4E, K4F \ +) \ +{ \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, XXX, K0F }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, XXX, K1E, K1F }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, XXX, XXX, K2E, K2F }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, XXX, K3C, XXX, K3E, K3F }, \ + { K40, K41, K42, XXX, XXX, K45, XXX, XXX, XXX, K49, K4A, XXX, XXX, K4D, K4E, K4F } \ +} + +#endif From ea1fe35ae7c5fa026309a1d51cd90450e48c6b39 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Fri, 21 Dec 2018 19:39:48 -0800 Subject: [PATCH 741/788] Keyboard: Infinity60 refactor, Configurator support and readme update (#4707) * Infinity60: refactor - infinity60.h / keymap.c - renamed layout macro to LAYOUT_60_ansi_split_bs_rshift; removed layout macro alias - updated to #pragma once - keymaps now use #include QMK_KEYBOARD_H - keymaps/jpetermans/config.h updated to #pragma once - keymaps/jpetermans/rules.mk deleted (complete contents were deprecated make instructions) * Infinity 60%: Configurator support * Infinity60: readme update Updated the Docs links. * Infinity60: bugfix depariel keymap Had a typo. * Infinity60: edit matrix.c per @drashna - https://github.com/qmk/qmk_firmware/pull/4707#issuecomment-449540676 --- keyboards/infinity60/infinity60.h | 11 +-- keyboards/infinity60/info.json | 78 +++++++++++++++++++ keyboards/infinity60/keymaps/default/keymap.c | 10 +-- .../infinity60/keymaps/depariel/keymap.c | 16 ++-- keyboards/infinity60/keymaps/hasu/keymap.c | 12 +-- .../infinity60/keymaps/jpetermans/config.h | 7 +- .../infinity60/keymaps/jpetermans/keymap.c | 17 ++-- .../infinity60/keymaps/jpetermans/rules.mk | 4 - keyboards/infinity60/matrix.c | 19 +++++ keyboards/infinity60/readme.md | 3 +- 10 files changed, 130 insertions(+), 47 deletions(-) create mode 100644 keyboards/infinity60/info.json delete mode 100644 keyboards/infinity60/keymaps/jpetermans/rules.mk diff --git a/keyboards/infinity60/infinity60.h b/keyboards/infinity60/infinity60.h index 21b8eeba2..a71921045 100644 --- a/keyboards/infinity60/infinity60.h +++ b/keyboards/infinity60/infinity60.h @@ -14,16 +14,14 @@ 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 . */ -#ifndef KEYMAP_COMMON_H -#define KEYMAP_COMMON_H +#pragma once #include "quantum.h" -#define LAYOUT_60_ansi_split_bs_rshift KEYMAP - #ifdef INFINITY_PROTOTYPE + /* Infinity prototype */ -#define KEYMAP( \ +#define LAYOUT_60_ansi_split_bs_rshift( \ K00, K10, K20, K30, K40, K50, K60, K70, K80, K01, K11, K21, K31, K41, K86, \ K51, K61, K71, K81, K02, K12, K22, K32, K42, K52, K62, K72, K82, K03, \ K13, K23, K33, K43, K53, K63, K73, K83, K04, K14, K24, K34, K44, \ @@ -44,7 +42,7 @@ along with this program. If not, see . #else /* Infinity production */ -#define KEYMAP( \ +#define LAYOUT_60_ansi_split_bs_rshift( \ K00, K10, K20, K30, K40, K50, K60, K70, K80, K01, K11, K21, K31, K41, K51, \ K61, K71, K81, K02, K12, K22, K32, K42, K52, K62, K72, K82, K03, K13, \ K23, K33, K43, K53, K63, K73, K83, K04, K14, K24, K34, K44, K54, \ @@ -64,4 +62,3 @@ along with this program. If not, see . #endif -#endif diff --git a/keyboards/infinity60/info.json b/keyboards/infinity60/info.json new file mode 100644 index 000000000..06df911e5 --- /dev/null +++ b/keyboards/infinity60/info.json @@ -0,0 +1,78 @@ +{ + "keyboard_name": "Infinity 60%", + "keyboard_folder": "infinity60", + "url": "https://input.club/devices/infinity-keyboard/", + "maintainer": "qmk", + "width": 15, + "height": 5, + "layouts": { + "LAYOUT_60_ansi_split_bs_rshift": { + "key_count": 63, + "layout": [ + {"label":"Esc", "x":0, "y":0}, + {"label":"1", "x":1, "y":0}, + {"label":"2", "x":2, "y":0}, + {"label":"3", "x":3, "y":0}, + {"label":"4", "x":4, "y":0}, + {"label":"5", "x":5, "y":0}, + {"label":"6", "x":6, "y":0}, + {"label":"7", "x":7, "y":0}, + {"label":"8", "x":8, "y":0}, + {"label":"9", "x":9, "y":0}, + {"label":"0", "x":10, "y":0}, + {"label":"-", "x":11, "y":0}, + {"label":"=", "x":12, "y":0}, + {"label":"\\", "x":13, "y":0}, + {"label":"`", "x":14, "y":0}, + {"label":"Tab", "x":0, "y":1, "w":1.5}, + {"label":"Q", "x":1.5, "y":1}, + {"label":"W", "x":2.5, "y":1}, + {"label":"E", "x":3.5, "y":1}, + {"label":"R", "x":4.5, "y":1}, + {"label":"T", "x":5.5, "y":1}, + {"label":"Y", "x":6.5, "y":1}, + {"label":"U", "x":7.5, "y":1}, + {"label":"I", "x":8.5, "y":1}, + {"label":"O", "x":9.5, "y":1}, + {"label":"P", "x":10.5, "y":1}, + {"label":"[", "x":11.5, "y":1}, + {"label":"]", "x":12.5, "y":1}, + {"label":"Backspace", "x":13.5, "y":1, "w":1.5}, + {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, + {"label":"A", "x":1.75, "y":2}, + {"label":"S", "x":2.75, "y":2}, + {"label":"D", "x":3.75, "y":2}, + {"label":"F", "x":4.75, "y":2}, + {"label":"G", "x":5.75, "y":2}, + {"label":"H", "x":6.75, "y":2}, + {"label":"J", "x":7.75, "y":2}, + {"label":"K", "x":8.75, "y":2}, + {"label":"L", "x":9.75, "y":2}, + {"label":";", "x":10.75, "y":2}, + {"label":"'", "x":11.75, "y":2}, + {"label":"Enter", "x":12.75, "y":2, "w":2.25}, + {"label":"Shift", "x":0, "y":3, "w":2.25}, + {"label":"Z", "x":2.25, "y":3}, + {"label":"X", "x":3.25, "y":3}, + {"label":"C", "x":4.25, "y":3}, + {"label":"V", "x":5.25, "y":3}, + {"label":"B", "x":6.25, "y":3}, + {"label":"N", "x":7.25, "y":3}, + {"label":"M", "x":8.25, "y":3}, + {"label":",", "x":9.25, "y":3}, + {"label":".", "x":10.25, "y":3}, + {"label":"/", "x":11.25, "y":3}, + {"label":"Shift", "x":12.25, "y":3, "w":1.75}, + {"label":"Fn", "x":14, "y":3}, + {"label":"Ctrl", "x":0, "y":4, "w":1.5}, + {"label":"GUI", "x":1.5, "y":4}, + {"label":"Alt", "x":2.5, "y":4, "w":1.5}, + {"label":"Space", "x":4, "y":4, "w":6}, + {"label":"Alt", "x":10, "y":4, "w":1.5}, + {"label":"GUI", "x":11.5, "y":4}, + {"label":"Fn", "x":12.5, "y":4}, + {"label":"Ctrl", "x":13.5, "y":4, "w":1.5} + ] + } + } +} diff --git a/keyboards/infinity60/keymaps/default/keymap.c b/keyboards/infinity60/keymaps/default/keymap.c index 8347c94b4..5d310e3b2 100644 --- a/keyboards/infinity60/keymaps/default/keymap.c +++ b/keyboards/infinity60/keymaps/default/keymap.c @@ -1,11 +1,11 @@ -#include "infinity60.h" +#include QMK_KEYBOARD_H const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Layer 0: Default Layer * ,-----------------------------------------------------------. - * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| `|BSp| + * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| `| * |-----------------------------------------------------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| Bksp| * |-----------------------------------------------------------| * |Contro| A| S| D| F| G| H| J| K| L| ;| '|Enter | * |-----------------------------------------------------------| @@ -14,7 +14,7 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | |Gui|Alt | Space |Alt |Gui| | | * `-----------------------------------------------------------' */ - [0] = KEYMAP( + [0] = LAYOUT_60_ansi_split_bs_rshift( KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL, KC_BSLS, KC_GRV, \ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC,KC_BSPC, \ KC_LCTL,KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT,KC_ENT, \ @@ -34,7 +34,7 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | |Gui|Alt | Space |Alt |Gui| | | * `-----------------------------------------------------------' */ - [1] = KEYMAP( + [1] = LAYOUT_60_ansi_split_bs_rshift( KC_PWR, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, \ KC_CAPS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PSCR,KC_SLCK,KC_PAUS, KC_UP, KC_TRNS, KC_BSPC, \ KC_TRNS,KC_VOLD,KC_VOLU,KC_MUTE,KC_TRNS,KC_TRNS,KC_PAST,KC_PSLS,KC_HOME,KC_PGUP,KC_LEFT,KC_RGHT,KC_PENT, \ diff --git a/keyboards/infinity60/keymaps/depariel/keymap.c b/keyboards/infinity60/keymaps/depariel/keymap.c index 57f9487f2..d1a1a04a4 100755 --- a/keyboards/infinity60/keymaps/depariel/keymap.c +++ b/keyboards/infinity60/keymaps/depariel/keymap.c @@ -1,4 +1,4 @@ -#include "infinity60.h" +#include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Layer 0: Default Layer @@ -14,7 +14,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |Fn2 |Gui |Alt | Space |RAlt|Prv|PlPs|Next| * `-----------------------------------------------------------' */ - [0] = KEYMAP( + [0] = LAYOUT_60_ansi_split_bs_rshift( KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, \ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, \ KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, LT(5, KC_ENT), \ @@ -23,7 +23,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Layer 1: "Toggle" off SpaceFn for League of Legends */ - [1] = KEYMAP( + [1] = LAYOUT_60_ansi_split_bs_rshift( KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, \ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, \ KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ @@ -32,7 +32,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Layer 2: "Toggle" off SpaceFn for MapleRoyals */ - [2] = KEYMAP( + [2] = LAYOUT_60_ansi_split_bs_rshift( KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, \ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, \ KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ @@ -41,7 +41,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Layer 3: FN layer 1 */ - [3] = KEYMAP( + [3] = LAYOUT_60_ansi_split_bs_rshift( KC_NO, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NO, KC_NO, \ KC_NO, KC_BTN1, KC_MS_U, KC_BTN2, LALT(KC_F4), KC_HOME, KC_PGUP, KC_PSCR, KC_SLCK, KC_UP, KC_NO, KC_LPRN, KC_RPRN, KC_DEL, \ MO(6), KC_MS_L, KC_MS_D, KC_MS_R, KC_NO, KC_END, KC_PGDN, KC_TILD, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_NO, \ @@ -50,7 +50,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Layer 4: FN layer 2 */ - [4] = KEYMAP( + [4] = LAYOUT_60_ansi_split_bs_rshift( KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_PMNS, KC_PPLS, KC_PSLS, TG(2), \ KC_CAPS, KC_NO, KC_UP, KC_NO, KC_NO, KC_NO, KC_NO, KC_PSCR, KC_NO, KC_P7, KC_P8, KC_P9, KC_PAST, KC_BSPC, \ KC_LCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_P4, KC_P5, KC_P6, KC_PENT, \ @@ -59,7 +59,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Layer 5: FN layer 3 */ - [5] = KEYMAP( + [5] = LAYOUT_60_ansi_split_bs_rshift( KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ KC_TAB , KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_F13, KC_F14, KC_F15, KC_F16, KC_NO, KC_TRNS, \ KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_F17, KC_F18, KC_F19, KC_F20, LT(5, KC_ENT), \ @@ -68,7 +68,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Layer 6: FN layer 4 */ - [6] = KEYMAP( + [6] = LAYOUT_60_ansi_split_bs_rshift( KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ LCTL(LSFT(KC_TAB)), KC_NO, LGUI(KC_UP), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ MO(6), LGUI(KC_LEFT), LGUI(KC_DOWN), LGUI(KC_RGHT), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ diff --git a/keyboards/infinity60/keymaps/hasu/keymap.c b/keyboards/infinity60/keymaps/hasu/keymap.c index 9982078c1..ec0d32183 100644 --- a/keyboards/infinity60/keymaps/hasu/keymap.c +++ b/keyboards/infinity60/keymaps/hasu/keymap.c @@ -1,4 +1,4 @@ -#include "infinity60.h" +#include QMK_KEYBOARD_H const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Layer 0: Default Layer @@ -14,7 +14,7 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | |Gui|Alt | Space |Alt |Gui| | | * `-----------------------------------------------------------' */ - [0] = KEYMAP( + [0] = LAYOUT_60_ansi_split_bs_rshift( KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL, KC_BSLS,KC_GRV, \ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC,KC_BSPC, \ KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, LT(3, KC_SCLN), KC_QUOT,MT(KC_RCTL, KC_ENT), \ @@ -34,7 +34,7 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | |Gui|Alt | Space |Alt |Gui| | | * `-----------------------------------------------------------' */ - [1] = KEYMAP( + [1] = LAYOUT_60_ansi_split_bs_rshift( KC_PWR, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, \ KC_CAPS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PSCR,KC_SLCK,KC_PAUS, KC_UP, KC_TRNS,KC_BSPC, \ KC_LCTL,KC_VOLD,KC_VOLU,KC_MUTE,KC_TRNS,KC_TRNS,KC_PAST,KC_PSLS,KC_HOME,KC_PGUP,KC_LEFT,KC_RGHT,KC_ENT, \ @@ -54,7 +54,7 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |Gui|Alt | Space |Alt |Gui| * `-------------------------------------------' */ - [2] = KEYMAP( + [2] = LAYOUT_60_ansi_split_bs_rshift( KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, \ KC_TAB, KC_HOME,KC_PGDN,KC_UP, KC_PGUP,KC_END, KC_HOME,KC_PGDN,KC_PGUP,KC_END, KC_NO, KC_NO, KC_NO, KC_BSPC, \ KC_LCTL,KC_NO, KC_LEFT,KC_DOWN,KC_RGHT,KC_NO, KC_LEFT,KC_DOWN,KC_UP, KC_RGHT,KC_NO, KC_NO, KC_ENT, \ @@ -75,7 +75,7 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `--------------------------------------------' * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel */ - [3] = KEYMAP( + [3] = LAYOUT_60_ansi_split_bs_rshift( KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, \ LALT(KC_TAB), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_WH_L,KC_WH_D,KC_MS_U, KC_WH_U, KC_WH_R, ALT_T(KC_LEFT), ALT_T(KC_RGHT),LALT(KC_TAB), \ KC_LCTL, KC_ACL0,KC_ACL1,KC_ACL2,KC_ACL2,KC_NO, KC_NO, KC_MS_L,KC_MS_D, KC_MS_R, LT(3, KC_SCLN), KC_NO, KC_ENT, \ @@ -96,7 +96,7 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `--------------------------------------------' * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel */ - [4] = KEYMAP( + [4] = LAYOUT_60_ansi_split_bs_rshift( KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, \ LALT(KC_TAB), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_WH_L,KC_WH_D,KC_MS_U, KC_WH_U, KC_WH_R,KC_BTN4,KC_BTN5,LALT(KC_TAB), \ KC_LCTL, KC_VOLD,KC_VOLU,KC_MUTE,KC_NO, KC_NO, KC_NO, KC_MS_L,KC_MS_D, KC_MS_R, KC_BTN1,KC_NO, KC_ENT, \ diff --git a/keyboards/infinity60/keymaps/jpetermans/config.h b/keyboards/infinity60/keymaps/jpetermans/config.h index 72a2ed081..1949a9ad9 100644 --- a/keyboards/infinity60/keymaps/jpetermans/config.h +++ b/keyboards/infinity60/keymaps/jpetermans/config.h @@ -1,11 +1,6 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - - -#include "../../config.h" +#pragma once //overrides #undef TAPPING_TOGGLE #define TAPPING_TOGGLE 2 -#endif diff --git a/keyboards/infinity60/keymaps/jpetermans/keymap.c b/keyboards/infinity60/keymaps/jpetermans/keymap.c index 59249ff72..c99b05e4c 100644 --- a/keyboards/infinity60/keymaps/jpetermans/keymap.c +++ b/keyboards/infinity60/keymaps/jpetermans/keymap.c @@ -1,9 +1,6 @@ -#include "infinity60.h" +#include QMK_KEYBOARD_H #include "led_controller.h" -//Helpful Defines -#define _______ KC_TRNS - //Define Layer Names #define _BASE 0 #define _NUMPAD 1 @@ -54,7 +51,7 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------' */ /* default */ - [_BASE] = KEYMAP( \ + [_BASE] = LAYOUT_60_ansi_split_bs_rshift( \ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL, KC_BSLS,KC_NO,\ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC,KC_BSPC, \ TT(_FNAV), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT,KC_ENT, \ @@ -63,7 +60,7 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), /* numpad */ - [_NUMPAD] = KEYMAP( \ + [_NUMPAD] = LAYOUT_60_ansi_split_bs_rshift( \ _______,_______,_______,_______,_______,_______,_______, KC_P7, KC_P8, KC_P9, KC_PSLS, _______,_______,_______,KC_NO,\ _______,_______,_______,_______,_______,_______,_______, KC_P4, KC_P5, KC_P6, KC_PAST, _______,_______,_______, \ MO(_FNAV),_______,_______,_______,_______,_______,_______, KC_P1, KC_P2, KC_P3, KC_PMNS, _______,_______, \ @@ -72,7 +69,7 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), /* F-, arrow, and media keys */ - [_FNAV] = KEYMAP( \ + [_FNAV] = LAYOUT_60_ansi_split_bs_rshift( \ KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______,KC_NO,\ KC_CAPS,_______,_______,_______,_______,_______,_______,KC_PGUP,KC_UP,KC_PGDN,KC_PSCR,_______,_______,KC_DEL, \ _______,_______,KC_BTN2,_______,_______,_______,KC_HOME,KC_LEFT,KC_DOWN,KC_RGHT,KC_INS,_______,_______, \ @@ -81,7 +78,7 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), /* media */ - [_MEDIA] = KEYMAP( \ + [_MEDIA] = LAYOUT_60_ansi_split_bs_rshift( \ _______,F(MODE_SINGLE),F(MODE_PAGE),F(MODE_FLASH),_______,_______,_______, _______, _______, _______,KC_MUTE, KC_VOLD, KC_VOLU,_______,KC_NO,\ _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,\ _______,_______,_______,_______,_______,F(GAME),_______, _______, _______, _______,_______, _______,_______, \ @@ -89,7 +86,7 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______,_______,_______, KC_MPLY, _______,_______, _______,_______ \ ), /* ~ */ - [_TILDE] = KEYMAP( \ + [_TILDE] = LAYOUT_60_ansi_split_bs_rshift( \ KC_GRV,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,KC_NO,\ _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,\ _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______, \ @@ -97,7 +94,7 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______,_______,_______, _______, _______,_______, _______,_______ \ ), /* template */ - [5] = KEYMAP( \ + [5] = LAYOUT_60_ansi_split_bs_rshift( \ _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,KC_NO,\ _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,\ _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______, \ diff --git a/keyboards/infinity60/keymaps/jpetermans/rules.mk b/keyboards/infinity60/keymaps/jpetermans/rules.mk deleted file mode 100644 index df3d1e952..000000000 --- a/keyboards/infinity60/keymaps/jpetermans/rules.mk +++ /dev/null @@ -1,4 +0,0 @@ - -ifndef QUANTUM_DIR - include ../../../../Makefile -endif diff --git a/keyboards/infinity60/matrix.c b/keyboards/infinity60/matrix.c index bf86591cc..ba16e6900 100644 --- a/keyboards/infinity60/matrix.c +++ b/keyboards/infinity60/matrix.c @@ -177,3 +177,22 @@ void matrix_print(void) xprintf("\n"); } } + +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + diff --git a/keyboards/infinity60/readme.md b/keyboards/infinity60/readme.md index e77abca64..01f3a8a2f 100644 --- a/keyboards/infinity60/readme.md +++ b/keyboards/infinity60/readme.md @@ -11,4 +11,5 @@ Make example for this keyboard (after setting up your build environment): make infinity60:default -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. +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). + From 7bbd299fbac2cc1318ce5ec8cef18ffcf7fe8837 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Sat, 22 Dec 2018 08:23:04 -0800 Subject: [PATCH 742/788] JD40 refactor and readme update (#4710) * JD40: default keymap refactor - Removed redundant action_layer.h include - Refactored to use LAYOUT macro (from LAYOUT_kc) - Refactored to use QMK-native keycodes - Removed superseded TMK code blocks * JD40: readme cleanup Fixed and updated the links in the readme file --- keyboards/jd40/keymaps/default/keymap.c | 220 +++++------------------- keyboards/jd40/readme.md | 4 +- 2 files changed, 41 insertions(+), 183 deletions(-) diff --git a/keyboards/jd40/keymaps/default/keymap.c b/keyboards/jd40/keymaps/default/keymap.c index b4ec05505..ff31fd6f5 100644 --- a/keyboards/jd40/keymaps/default/keymap.c +++ b/keyboards/jd40/keymaps/default/keymap.c @@ -1,5 +1,4 @@ #include QMK_KEYBOARD_H -#include "action_layer.h" #define _BL 0 #define _AL 1 @@ -7,189 +6,48 @@ #define _UL 3 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_BL] = LAYOUT_kc( - F12, Q, W, E, R, T, Y, U, I, O, P, BSPC, - TAB, A, S, D, F, G, H, J, K, L, ENT, - LSFT, Z, X, C, V, B, N, M, COMM, UP, DOT, - LCTL, LGUI, LALT, FN0, SPC, SPC, FN0, LEFT, DOWN, RIGHT), + [_BL] = LAYOUT( + KC_F12, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_UP, KC_DOT, + KC_LCTL, KC_LGUI, KC_LALT, MO(_AL), KC_SPC, KC_SPC, MO(_AL), KC_LEFT, KC_DOWN, KC_RGHT + ), - [_AL] = LAYOUT_kc( - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, DEL, - CAPS, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, - TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, SCLN, PGUP, QUOT, - TRNS, TRNS, TRNS, TRNS, FN3, FN3, TRNS, HOME, PGDN, END), + [_AL] = LAYOUT( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_DEL, + KC_CAPS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, + _______, _______, _______, _______, _______, _______, _______, _______, KC_SCLN, KC_PGUP, KC_QUOT, + _______, _______, _______, _______, TG(_UL), TG(_UL), _______, KC_HOME, KC_PGDN, KC_END + ), - [_FL] = LAYOUT_kc( - TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, - TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, - TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, - TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS), + [_FL] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), - [_UL] = LAYOUT_kc( - TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, - TRNS, FN4, FN5, FN11, FN10, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, - TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, - TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS), + [_UL] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RGB_TOG, RGB_MOD, RGB_VAD, RGB_VAI, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), }; -enum function_id -{ - RGBLED_TOGGLE, - RGBLED_STEP_MODE, - RGBLED_INCREASE_HUE, - RGBLED_DECREASE_HUE, - RGBLED_INCREASE_SAT, - RGBLED_DECREASE_SAT, - RGBLED_INCREASE_VAL, - RGBLED_DECREASE_VAL, - SHIFT_ESC, -}; - -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_LAYER_MOMENTARY(1), // Momentary Fn overlay - [1] = ACTION_LAYER_TOGGLE(2), // Toggle Arrow Layer overlay - [2] = ACTION_LAYER_TAP_KEY(2, KC_CAPS), // Tap to toggle caps lock and hold to activate function layer - [3] = ACTION_LAYER_TOGGLE(3), // Toggle Underglow Layer overlay - [4] = ACTION_FUNCTION(RGBLED_TOGGLE), //Turn on/off underglow - [5] = ACTION_FUNCTION(RGBLED_STEP_MODE), // Change underglow mode - [6] = ACTION_FUNCTION(RGBLED_INCREASE_HUE), - [7] = ACTION_FUNCTION(RGBLED_DECREASE_HUE), - [8] = ACTION_FUNCTION(RGBLED_INCREASE_SAT), - [9] = ACTION_FUNCTION(RGBLED_DECREASE_SAT), - [10] = ACTION_FUNCTION(RGBLED_INCREASE_VAL), - [11] = ACTION_FUNCTION(RGBLED_DECREASE_VAL), - [12] = ACTION_FUNCTION(SHIFT_ESC), -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - // MACRODOWN only works in this function - switch (id) - { - case 0: - if (record->event.pressed) - { - register_code(KC_RSFT); - } - else - { - unregister_code(KC_RSFT); - } - break; - } - return MACRO_NONE; -}; - -void matrix_scan_user(void) -{ - - // Layer LED indicators - // ESC led on when in function layer, WASD cluster leds enabled when on arrow cluster - uint32_t layer = layer_state; - if (layer & (1 << 1)) - { - //gh60_wasd_leds_on(); - } - else - { - //gh60_wasd_leds_off(); - } - - if (layer & (1 << 2)) - { - //gh60_esc_led_on(); - } - else - { - //gh60_esc_led_off(); - } -}; - -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) - -void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - switch (id) - { - case RGBLED_TOGGLE: - //led operations - if (record->event.pressed) - { - rgblight_toggle(); - } - break; - case RGBLED_INCREASE_HUE: - if (record->event.pressed) - { - rgblight_increase_hue(); - } - break; - case RGBLED_DECREASE_HUE: - if (record->event.pressed) - { - rgblight_decrease_hue(); - } - break; - case RGBLED_INCREASE_SAT: - if (record->event.pressed) - { - rgblight_increase_sat(); - } - break; - case RGBLED_DECREASE_SAT: - if (record->event.pressed) - { - rgblight_decrease_sat(); - } - break; - case RGBLED_INCREASE_VAL: - if (record->event.pressed) - { - rgblight_increase_val(); - } - break; - case RGBLED_DECREASE_VAL: - if (record->event.pressed) - { - rgblight_decrease_val(); - } - break; - case RGBLED_STEP_MODE: - if (record->event.pressed) - { - rgblight_step(); - } - break; - static uint8_t shift_esc_shift_mask; - // Shift + ESC = ~ - case SHIFT_ESC: - shift_esc_shift_mask = get_mods() & MODS_CTRL_MASK; - if (record->event.pressed) - { - if (shift_esc_shift_mask) - { - add_key(KC_GRV); - send_keyboard_report(); - } - else - { - add_key(KC_ESC); - send_keyboard_report(); - } - } - else - { - if (shift_esc_shift_mask) - { - del_key(KC_GRV); - send_keyboard_report(); - } - else - { - del_key(KC_ESC); - send_keyboard_report(); - } - } - break; - } +void matrix_scan_user(void) { + // Layer LED indicators + // ESC led on when in function layer, WASD cluster leds enabled when on arrow cluster + uint32_t layer = layer_state; + if (layer & (1 << 1)) { + //gh60_wasd_leds_on(); + } else { + //gh60_wasd_leds_off(); + } + + if (layer & (1 << 2)) { + //gh60_esc_led_on(); + } else { + //gh60_esc_led_off(); + } }; diff --git a/keyboards/jd40/readme.md b/keyboards/jd40/readme.md index f70bd9107..3a92b8fb8 100644 --- a/keyboards/jd40/readme.md +++ b/keyboards/jd40/readme.md @@ -5,10 +5,10 @@ A compact 40% keyboard. Keyboard Maintainer: QMK Community Hardware Supported: JD40 PCB -Hardware Availability: [1up](https://1upkeyboards.com/jd40-mkii-1up-keyboards-logo-pcb.html) [mechanicalkeyboards.com](https://mechanicalkeyboards.com/shop/index.php?l=product_detail&p=2452) [originative](https://www.originativeco.com/products/jd40-pcb) +Hardware Availability: [1upkeyboards](https://www.1upkeyboards.com/shop/controllers/jd40-mkii-1up-keyboards-logo-pcb/), [mechanicalkeyboards.com](https://mechanicalkeyboards.com/shop/index.php?l=product_detail&p=2452), [originative](https://www.originativeco.com/products/jd40-pcb) Make example for this keyboard (after setting up your build environment): make jd40:default -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. +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). From 5e52eda0cacd45d2daa63dce71d7b7ceb5953368 Mon Sep 17 00:00:00 2001 From: Michishige Kaito Date: Thu, 20 Dec 2018 22:55:13 +0000 Subject: [PATCH 743/788] shell.nix: Packages relocated in upstream cleanup --- shell.nix | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/shell.nix b/shell.nix index 67efb46b7..6ff8a7ad2 100644 --- a/shell.nix +++ b/shell.nix @@ -4,6 +4,10 @@ with pkgs; let + avrbinutils = pkgsCross.avr.buildPackages.binutils; + avrlibc = pkgsCross.avr.libcCross; + gcc-arm-embedded = pkgsCross.arm-embedded.buildPackages.gcc; + avr_incflags = [ "-isystem ${avrlibc}/avr/include" "-B${avrlibc}/avr/lib/avr5" @@ -13,7 +17,7 @@ let "-B${avrlibc}/avr/lib/avr51" "-L${avrlibc}/avr/lib/avr51" ]; - avrgcc = pkgs.avrgcc.overrideAttrs (oldAttrs: rec { + avrgcc = pkgsCross.avr.buildPackages.gcc.overrideAttrs (oldAttrs: rec { name = "avr-gcc-8.1.0"; src = fetchurl { url = "mirror://gcc/releases/gcc-8.1.0/gcc-8.1.0.tar.xz"; From 2c3706611ff6ad20cc3210de837aacd4af7c7264 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Sun, 23 Dec 2018 08:36:01 -0800 Subject: [PATCH 744/788] Noxary x268: refactor and Configurator bugfix (#4713) - renamed layout macro LAYOUT_65_ansi to LAYOUT - rebuilt info.json to match LAYOUT macro --- keyboards/noxary/x268/info.json | 80 ++++++++++++++++++- .../noxary/x268/keymaps/default/keymap.c | 6 +- keyboards/noxary/x268/x268.h | 2 +- 3 files changed, 81 insertions(+), 7 deletions(-) diff --git a/keyboards/noxary/x268/info.json b/keyboards/noxary/x268/info.json index 047c39f04..cac7559ba 100644 --- a/keyboards/noxary/x268/info.json +++ b/keyboards/noxary/x268/info.json @@ -5,8 +5,82 @@ "width": 16, "height": 5, "layouts": { - "LAYOUT": { - "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0, "w":2}, {"x":15, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":15, "y":1}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2, "w":2.25}, {"x":15, "y":2}, {"x":0, "y":3, "w":2.25}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"x":15, "y":3}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"x":10, "y":4}, {"x":11, "y":4}, {"x":12, "y":4}, {"x":13, "y":4}, {"x":14, "y":4}, {"x":15, "y":4}] - } + "LAYOUT": { + "key_count": 71, + "layout": [ + {"label":"ESC", "x":0, "y":0}, + {"label":"1", "x":1, "y":0}, + {"label":"2", "x":2, "y":0}, + {"label":"3", "x":3, "y":0}, + {"label":"4", "x":4, "y":0}, + {"label":"5", "x":5, "y":0}, + {"label":"6", "x":6, "y":0}, + {"label":"7", "x":7, "y":0}, + {"label":"8", "x":8, "y":0}, + {"label":"9", "x":9, "y":0}, + {"label":"0", "x":10, "y":0}, + {"label":"MINUS", "x":11, "y":0}, + {"label":"EQUAL", "x":12, "y":0}, + {"label":"BACKSLASH", "x":13, "y":0}, + {"label":"BACKSPACE", "x":14, "y":0}, + {"label":"GRAVE", "x":15, "y":0}, + {"label":"TAB", "x":0, "y":1, "w":1.5}, + {"label":"Q", "x":1.5, "y":1}, + {"label":"W", "x":2.5, "y":1}, + {"label":"E", "x":3.5, "y":1}, + {"label":"R", "x":4.5, "y":1}, + {"label":"T", "x":5.5, "y":1}, + {"label":"Y", "x":6.5, "y":1}, + {"label":"U", "x":7.5, "y":1}, + {"label":"I", "x":8.5, "y":1}, + {"label":"O", "x":9.5, "y":1}, + {"label":"P", "x":10.5, "y":1}, + {"label":"LBRACKET", "x":11.5, "y":1}, + {"label":"RBRACKET", "x":12.5, "y":1}, + {"label":"BACKSLASH", "x":13.5, "y":1, "w":1.5}, + {"label":"DELETE", "x":15, "y":1}, + {"label":"CAPS LOCK", "x":0, "y":2, "w":1.75}, + {"label":"A", "x":1.75, "y":2}, + {"label":"S", "x":2.75, "y":2}, + {"label":"D", "x":3.75, "y":2}, + {"label":"F", "x":4.75, "y":2}, + {"label":"G", "x":5.75, "y":2}, + {"label":"H", "x":6.75, "y":2}, + {"label":"J", "x":7.75, "y":2}, + {"label":"K", "x":8.75, "y":2}, + {"label":"L", "x":9.75, "y":2}, + {"label":"SEMICOLON", "x":10.75, "y":2}, + {"label":"QUOTE", "x":11.75, "y":2}, + {"label":"ISO HASH", "x":12.75, "y":2}, + {"label":"ENTER", "x":13.75, "y":2, "w":1.25}, + {"label":"PAGE UP", "x":15, "y":2}, + {"label":"LSHIFT", "x":0, "y":3, "w":1.25}, + {"label":"ISO BACKSLASH", "x":1.25, "y":3}, + {"label":"Z", "x":2.25, "y":3}, + {"label":"X", "x":3.25, "y":3}, + {"label":"C", "x":4.25, "y":3}, + {"label":"V", "x":5.25, "y":3}, + {"label":"B", "x":6.25, "y":3}, + {"label":"N", "x":7.25, "y":3}, + {"label":"M", "x":8.25, "y":3}, + {"label":"COMMA", "x":9.25, "y":3}, + {"label":"PERIOD", "x":10.25, "y":3}, + {"label":"SLASH", "x":11.25, "y":3}, + {"label":"RSHIFT", "x":12.25, "y":3, "w":1.75}, + {"label":"UP", "x":14, "y":3}, + {"label":"PAGE DOWN", "x":15, "y":3}, + {"label":"LCTRL", "x":0, "y":4, "w":1.25}, + {"label":"LGUI", "x":1.25, "y":4, "w":1.25}, + {"label":"LALT", "x":2.5, "y":4, "w":1.25}, + {"label":"SPACE", "x":3.75, "y":4, "w":6.25}, + {"label":"LALT", "x":10, "y":4}, + {"label":"FN", "x":11, "y":4}, + {"label":"RCTRL", "x":12, "y":4}, + {"label":"LEFT", "x":13, "y":4}, + {"label":"DOWN", "x":14, "y":4}, + {"label":"RIGHT", "x":15, "y":4} + ] + } } } + diff --git a/keyboards/noxary/x268/keymaps/default/keymap.c b/keyboards/noxary/x268/keymaps/default/keymap.c index cb37407a7..ae07f5213 100644 --- a/keyboards/noxary/x268/keymaps/default/keymap.c +++ b/keyboards/noxary/x268/keymaps/default/keymap.c @@ -22,7 +22,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |Ctrl|Win |Alt | Space |Alt|Mo(1)|Ctrl|Lef|Dow|Rght| * `----------------------------------------------------------------' */ - [_BL] = LAYOUT_65_ansi( + [_BL] = LAYOUT( KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_BSPC, KC_GRV, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_PGUP, @@ -41,7 +41,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | BL_Toggle | | | | |Vol-| | * `----------------------------------------------------------------' */ - [_FL1] = LAYOUT_65_ansi( + [_FL1] = LAYOUT( KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_PSCR, _______, RGB_TOG, RGB_VAI, RGB_SAI, RGB_HUI, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS, _______, RGB_VAD, RGB_SAD, RGB_HUD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, @@ -60,7 +60,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | | * `----------------------------------------------------------------' */ - [_FL2] = LAYOUT_65_ansi( + [_FL2] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, diff --git a/keyboards/noxary/x268/x268.h b/keyboards/noxary/x268/x268.h index 53855e206..9961b7dfd 100644 --- a/keyboards/noxary/x268/x268.h +++ b/keyboards/noxary/x268/x268.h @@ -18,7 +18,7 @@ #include "quantum.h" -#define LAYOUT_65_ansi( \ +#define LAYOUT( \ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015, \ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K114, K115, \ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K214, K215, \ From 7e56c4bcb1bf0bad264401384d393ff0f7431d11 Mon Sep 17 00:00:00 2001 From: Adam Lee Date: Sun, 23 Dec 2018 11:39:30 -0500 Subject: [PATCH 745/788] [Miuni32] Update the # of LEDs to match the final version of PCB (#4714) * [Miuni32] Update the # of LEDs to match the final version of PCB * [Miuni32] Update link to website --- keyboards/miuni32/config.h | 2 +- keyboards/miuni32/readme.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/miuni32/config.h b/keyboards/miuni32/config.h index a56a818f5..37e9113f9 100644 --- a/keyboards/miuni32/config.h +++ b/keyboards/miuni32/config.h @@ -161,7 +161,7 @@ along with this program. If not, see . #define RGB_DI_PIN D0 // The pin your RGB strip is wired to -#define RGBLED_NUM 7 // Number of LEDs +#define RGBLED_NUM 17 // Number of LEDs #define RGBLIGHT_ANIMATIONS #define RGBLIGHT_HUE_STEP 10 #define RGBLIGHT_SAT_STEP 17 diff --git a/keyboards/miuni32/readme.md b/keyboards/miuni32/readme.md index 050ec8ecd..7fc72d601 100644 --- a/keyboards/miuni32/readme.md +++ b/keyboards/miuni32/readme.md @@ -5,7 +5,7 @@ A compact 30% keyboard. Keyboard Maintainer: QMK Community Hardware Supported: miuni32 PCB -Hardware Availability: https://zealpc.net/products/miuni32 +Hardware Availability: https://bigtuna.io Make example for this keyboard (after setting up your build environment): From fc921a9c54bb28fe91219a9321f9d2c0cf7cf293 Mon Sep 17 00:00:00 2001 From: Othi Date: Mon, 24 Dec 2018 17:06:12 +0000 Subject: [PATCH 746/788] First PR for KBD6x HHKB layout keymap (#4704) * initial commit for Othi's HHKB layout keymap, covering multiple modifiers hold and vim-like support and german characters. If there's any suggestion i can be reached via mnpqraven on github or Othi#6661 on discord * added readme.md. TODO: update readme.md * changed to default quantum keycode for `KC_TRNS`, removed `PREVENT_STUCK_MODIFIERS`, fixed tap dance using one shots TODO: unicode implementation at https://docs.qmk.fm/#/feature_unicode * keymap documentaion(readme) added * unicode init TODO: figure out what made the compose sequence not running * update unicode and readme --- keyboards/kbd6x/keymaps/othi/config.h | 10 ++ keyboards/kbd6x/keymaps/othi/keymap.c | 190 +++++++++++++++++++++++++ keyboards/kbd6x/keymaps/othi/readme.md | 56 ++++++++ keyboards/kbd6x/keymaps/othi/rules.mk | 19 +++ 4 files changed, 275 insertions(+) create mode 100644 keyboards/kbd6x/keymaps/othi/config.h create mode 100644 keyboards/kbd6x/keymaps/othi/keymap.c create mode 100644 keyboards/kbd6x/keymaps/othi/readme.md create mode 100644 keyboards/kbd6x/keymaps/othi/rules.mk diff --git a/keyboards/kbd6x/keymaps/othi/config.h b/keyboards/kbd6x/keymaps/othi/config.h new file mode 100644 index 000000000..42f68b435 --- /dev/null +++ b/keyboards/kbd6x/keymaps/othi/config.h @@ -0,0 +1,10 @@ +#pragma once +#define ONESHOT_TAP_TOOGLE 2 +#define ONESHOT_TIMEOUT 2000 +// tap dance configurations +#define TAPPING_TERM 200 +#define TAPPING_TOGGLE 2 +#define PERMISSIVE_HOLD +// Fix KC_GESC conflict with Cmd+Alt+Esc on macros +#define GRAVE_ESC_GUI_OVERRIDE + diff --git a/keyboards/kbd6x/keymaps/othi/keymap.c b/keyboards/kbd6x/keymaps/othi/keymap.c new file mode 100644 index 000000000..1e0fc8ad7 --- /dev/null +++ b/keyboards/kbd6x/keymaps/othi/keymap.c @@ -0,0 +1,190 @@ +/* Copyright 2018 Othi + * + * 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 . + */ +#include QMK_KEYBOARD_H + +// read README.md for rundown of what does what + +// #define BL 0 +#define CL 0 +#define NM_MODE 2 +#define VI_MODE 3 +#define FN3 4 +#define ACCENT 5 +#define ACCENT_CAP 6 + +//Unicode keymaps +void eeconfig_init_user(void) { + set_unicode_input_mode(UC_LNX); +} +#define DE_AE UC(0x00E4) +#define DE_SS UC(0x00DF) +#define DE_OE UC(0x00F6) +#define DE_UE UC(0x00FC) +#define DE_AE_CAP UC(0x00C4) +#define DE_OE_CAP UC(0x00D6) +#define DE_UE_CAP UC(0x00DC) + +uint32_t layer_state_set_user(uint32_t state) { + switch (biton32(state)) { + case NM_MODE: + rgblight_setrgb (0x00, 0x66, 0x00); + break; + case VI_MODE: + rgblight_setrgb (0x66, 0x66, 0x00); + break; + case ACCENT: + rgblight_setrgb (0x7A, 0x00, 0xFF); + break; + case ACCENT_CAP: + rgblight_setrgb (0x7A, 0xFF, 0xFF); + break; + default: // for any other layers, or the default layer + rgblight_setrgb (0xFF, 0x00, 0x00); + break; + } + return state; +} + +//Tap Dance Declarations +enum { + CTL_NM = 0, + ALT_NM = 1, + SFT_NM = 2, + GUI_NM = 3 +}; + +void dance_CTL_NM_finished (qk_tap_dance_state_t *state, void *user_data) { + if (state->count == 1) { + set_oneshot_mods(MOD_LCTL); + } else { + register_code (KC_LCTL); + layer_on(NM_MODE); + } +} + +void dance_CTL_NM_reset (qk_tap_dance_state_t *state, void *user_data) { + if (state->count == 1) { + unregister_code (KC_LCTL); + } else { + unregister_code (KC_LCTL); + layer_off(NM_MODE); + } +} + +void dance_GUI_NM_finished (qk_tap_dance_state_t *state, void *user_data) { + if (state->count == 1) { + register_code (KC_LGUI); + } else { + register_code (KC_LGUI); + layer_on(NM_MODE); + } +} + +void dance_GUI_NM_reset (qk_tap_dance_state_t *state, void *user_data) { + if (state->count == 1) { + unregister_code (KC_LGUI); + } else { + unregister_code (KC_LGUI); + layer_off(NM_MODE); + } +} + +void dance_ALT_NM_finished (qk_tap_dance_state_t *state, void *user_data) { + if (state->count == 1) { + register_code (KC_LALT); + } else { + register_code (KC_LALT); + layer_on(NM_MODE); + } +} + +void dance_ALT_NM_reset (qk_tap_dance_state_t *state, void *user_data) { + if (state->count == 1) { + unregister_code (KC_LALT); + } else { + unregister_code (KC_LALT); + layer_off(NM_MODE); + } +} + +void dance_SFT_NM_finished (qk_tap_dance_state_t *state, void *user_data) { + if (state->count == 1) { + register_code (KC_LSFT); + set_oneshot_mods(MOD_LSFT); + } else { + register_code (KC_LSFT); + layer_on(NM_MODE); + } +} + +void dance_SFT_NM_reset (qk_tap_dance_state_t *state, void *user_data) { + if (state->count == 1) { + unregister_code (KC_LSFT); + } else { + unregister_code (KC_LSFT); + layer_off(NM_MODE); + } +} + + +qk_tap_dance_action_t tap_dance_actions[] = { + [CTL_NM] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, dance_CTL_NM_finished, dance_CTL_NM_reset), + [GUI_NM] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, dance_GUI_NM_finished, dance_GUI_NM_reset), + [ALT_NM] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, dance_ALT_NM_finished, dance_ALT_NM_reset), + [SFT_NM] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, dance_SFT_NM_finished, dance_SFT_NM_reset) +}; + +// backup +// old R3 capslock, LT(NM_MODE,KC_BSPC), +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [CL] = LAYOUT( + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_DEL, + MT(MOD_LGUI,KC_TAB), LT(NM_MODE,KC_Q), KC_W, LT(ACCENT,KC_F), KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LBRC, KC_RBRC, KC_BSPC, + MT(MOD_LCTL,KC_BSPC), KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENT, + TD(SFT_NM), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, MT(MOD_LCTL,KC_COMM), MT(MOD_LSFT,KC_DOT), MT(MOD_LALT,KC_SLSH), LM(CL,MOD_LGUI|MOD_LSFT), TT(NM_MODE), + _______, TD(CTL_NM), TD(ALT_NM), KC_SPC, LM(CL,MOD_LGUI|MOD_LALT), OSL(ACCENT) , _______ + ), + [NM_MODE] = LAYOUT( + KC_GRV, KC_MPRV, KC_MNXT, KC_MPLY, KC_END, _______, _______, _______, _______, _______, KC_HOME, _______, _______, RESET, KC_INS, + LGUI(KC_TAB), _______, LCTL(KC_RGHT), _______, _______, _______, _______, KC_UP, KC_PGUP, _______, _______, _______, TG(CL), KC_DEL, + _______, KC_LEFT, _______, KC_RGHT, _______, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, _______, KC_ENT, KC_QUOT, KC_LGUI, + KC_LSFT, _______, _______, _______, _______, LCTL(KC_LEFT), _______, _______, _______, _______, _______, TG(VI_MODE), TO(CL), + _______, TD(CTL_NM), TD(ALT_NM), KC_SPC, LM(CL,MOD_LGUI|MOD_LALT), OSL(ACCENT), _______ + ), + + [VI_MODE] = LAYOUT( + KC_GRV, KC_MPRV, KC_MNXT, KC_MPLY, LSFT(KC_END), KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, LSFT(KC_HOME), KC_F11, KC_F12, RESET, KC_INS, + LGUI(KC_TAB), _______, LSFT(LCTL(KC_RGHT)), _______, _______, _______, _______, LSFT(KC_UP), _______, _______, _______, _______, TG(CL), KC_BSPC, + _______, _______, _______, _______, _______, _______, LSFT(LCTL(KC_LEFT)), LSFT(KC_DOWN), LSFT(KC_RGHT), _______, KC_SCLN, KC_QUOT, KC_LGUI, + KC_LSFT, _______, _______, _______, _______, LSFT(LCTL(KC_LEFT)), _______, _______, _______, _______, KC_SLSH, OSM(MOD_LSFT), TO(CL), + _______, TD(CTL_NM), TD(ALT_NM), KC_SPC, LM(CL,MOD_LGUI|MOD_LALT), OSL(ACCENT), _______ + ), + [ACCENT] = LAYOUT( + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, + _______, RGB_TOG, RGB_MODE_PLAIN, _______, _______, _______, _______, _______, DE_UE, _______, _______, _______, _______, _______, + _______, DE_AE, UC_Z, DE_SS, _______, _______, _______, _______, _______, _______, DE_OE, _______, _______, + OSL(ACCENT_CAP), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, TO(CL), + _______, _______, _______, _______, _______, _______, _______ + ), + [ACCENT_CAP] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, DE_UE_CAP, _______, _______, _______, _______, _______, + _______, DE_AE_CAP, _______, DE_SS, _______, _______, _______, _______, _______, _______, DE_OE_CAP, _______, TO(CL), + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______ + ), +}; + diff --git a/keyboards/kbd6x/keymaps/othi/readme.md b/keyboards/kbd6x/keymaps/othi/readme.md new file mode 100644 index 000000000..95be36d05 --- /dev/null +++ b/keyboards/kbd6x/keymaps/othi/readme.md @@ -0,0 +1,56 @@ +## Othi's Universal HHKB keymap + +### Goals +- Colemak layout. If you don't use Colemak then you'll need to also change the arrow key bindigns in other layers + +- Vim-like navigation layer so you can use vim binding arrowkeys in non-vim environment + +- Good modifier support so you don't have to hold 14 modifier keys at the same time + +- RGB indicating layer change(only work with plain colors so far, don't put your rgb to pulsing or any non static animation) + +### Layers +- **CL:** + + The base layer, default is Colemak + +- **NM_MODE:** + + Vim-like arrowkeys in the home row, it's `LHNE` for *JENK Colemak* and `HJKL` for *QWERTY* + + Also `HOME`, `END` and next/prev word (`Ctrl + Left/Right`) in `0, 4, w, b` like in vim + +- **VI_MODE:** + + The same as `NM_MODE` but with `KC_LSFT` held down for mostly highlighting + +- **ACCENT + ACCENT_CAP:** + + Function row and Unicode characters + +### Modifiers and Tap Dance keys +**LHS:** + +- Any Tap Dance key with the format of `TD(XXX_NM)` act as normal XXX modifier upon hold, but will hold **and** put you to `NM_MODE` when double click hold(a tap before the hold)(eg you can produce `Alt + PgUp` by pressing `Alt + Alt + U`) + +- `KC_TAB` acts as both `KC_TAB` on tap and `KC_LGUI` on hold + +- R3 CapsLock acts as both `KC_BSPC` on tap and `KC_LCTL` on hold + +- Holding `KC_Q` also puts you into `NM_MODE` + +- Holding `KC_F` puts you into `VI_MODE` for fast function keys + +**RHS:** + +- 3 keys `KC_SCLN`, `KC_DOT` and `KC_SLSH` in `CL` layer can also be held down for respectively `KC_LCTL`, `KC_LSFT`, `KC_LALT` for easier 2-hand modifier holding + +- Right modifiers hold the selected modifier with `KC_LGUI` at the same time, mainly for i3wm, you can change this to whatever combination you want + +### Misc. functionalities + +**Unicode:** + +- In case the keyboard output the 4-digit codepoint instead of the actual unicode, you need to change the rewrite input mode of the keyboard into the EEPROM(you only have to do this if the EEPROM was cleared or your current machine use another unicode compose method other than IBus/Linux's `Ctrl + Shift + U`). Change the corresponding Input `void eeconfig_init_user(void)`. See [this](https://docs.qmk.fm/#/feature_unicode) for availble input modes. + +- **NOTE:** make sure to keep your qmk env up to date with upstream diff --git a/keyboards/kbd6x/keymaps/othi/rules.mk b/keyboards/kbd6x/keymaps/othi/rules.mk new file mode 100644 index 000000000..9cda4109d --- /dev/null +++ b/keyboards/kbd6x/keymaps/othi/rules.mk @@ -0,0 +1,19 @@ +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = yes # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = yes # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = yes +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) +TAP_DANCE_ENABLE=yes + From 33483b440ce1cf6df1010597b68a94751f4807b6 Mon Sep 17 00:00:00 2001 From: ishtob Date: Mon, 24 Dec 2018 12:06:33 -0500 Subject: [PATCH 747/788] Keymap: fix userspace compile error with planck grid (#4719) --- keyboards/planck/keymaps/ishtob/keymap.c | 20 ++++++++++---------- users/ishtob/ishtob.h | 1 - 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/keyboards/planck/keymaps/ishtob/keymap.c b/keyboards/planck/keymaps/ishtob/keymap.c index 082257b89..e036d8a5a 100644 --- a/keyboards/planck/keymaps/ishtob/keymap.c +++ b/keyboards/planck/keymaps/ishtob/keymap.c @@ -24,7 +24,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Esc | Caps | Alt | GUI |Lower | Space |Raise |NumLay| RAlt | Men | Del | * `-----------------------------------------------------------------------------------' */ -[_QWERTY] = LAYOUT_planck_grid( +[_QWERTY] = LAYOUT_ortho_4x12_wrapper( LT_FN(KC_TAB), _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_BSPC, KC_LCTL, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, CTL_ENT, KC_LSFT, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, LT_RAI(KC_MINS), @@ -42,7 +42,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | * `-----------------------------------------------------------------------------------' */ -[_COLEMAK] = LAYOUT_planck_grid( +[_COLEMAK] = LAYOUT_ortho_4x12_wrapper( LT_FN(KC_TAB), _________________COLEMAK_L1________________, _________________COLEMAK_R1________________, KC_BSPC, KC_LCTL, _________________COLEMAK_L2________________, _________________COLEMAK_R2________________, KC_ENT, KC_LSFT, _________________COLEMAK_L3________________, _________________COLEMAK_R3________________, LT_RAI(KC_MINS), @@ -60,7 +60,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | * `-----------------------------------------------------------------------------------' */ -[_DVORAK] = LAYOUT_planck_grid( +[_DVORAK] = LAYOUT_ortho_4x12_wrapper( LT_FN(KC_TAB), _________________DVORAK_L1_________________, _________________DVORAK_R1_________________, KC_BSPC, KC_LCTL, _________________DVORAK_L2_________________, _________________DVORAK_R2_________________, KC_ENT, KC_LSFT, _________________DVORAK_L3_________________, _________________DVORAK_R3_________________, LT_RAI(KC_MINS), @@ -78,7 +78,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | Next | Vol- | Vol+ | Play | * `-----------------------------------------------------------------------------------' */ -[_LOWER] = LAYOUT_planck_grid( +[_LOWER] = LAYOUT_ortho_4x12_wrapper( ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________, KC_GRV, KC_BSLS, _______, __________________LONG_FUNC_LEFT___________________, KC_UNDS, KC_EQL, KC_LBRC, KC_RBRC, KC_PIPE, _______, __________________LONG_FUNC_RIGHT__________________,S(KC_NUHS),S(KC_NUBS),KC_LCBR, KC_RCBR, _______, @@ -96,7 +96,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | 0 | | Left | Down | Right| NumLk| * `-----------------------------------------------------------------------------------' */ -[_RAISE] = LAYOUT_planck_grid( +[_RAISE] = LAYOUT_ortho_4x12_wrapper( ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________, KC_PLUS, KC_BSLS, _______, KC_A, KC_UP, KC_D, KC_PSCR, KC_VOLU, KC_4, KC_5, KC_6, KC_PAST, KC_COLN, KC_QUOT, _______, KC_LEFT, KC_DOWN, KC_RIGHT,KC__MUTE, KC_VOLD, KC_1, KC_2, KC_3, KC_UP, KC_SLSH, _______, @@ -115,7 +115,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ -[_PLOVER] = LAYOUT_planck_grid( +[_PLOVER] = LAYOUT_ortho_4x12_wrapper( KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1 , XXXXXXX, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, XXXXXXX, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, @@ -133,7 +133,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | Next | Vol- | Vol+ | Play | * `-----------------------------------------------------------------------------------' */ -[_FNLAYER] = LAYOUT_planck_grid( +[_FNLAYER] = LAYOUT_ortho_4x12_wrapper( _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_PLUS, _______, __________________LONG_FUNC_LEFT___________________, KC_UNDS, KC_EQL, KC_LBRC, KC_RBRC, KC_QUOT, _______, __________________LONG_FUNC_RIGHT__________________,S(KC_NUHS),S(KC_NUBS),KC_LCBR, KC_RCBR, _______, @@ -151,7 +151,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | 0 | . | Exit | Vol- | Vol+ | Play | * `-----------------------------------------------------------------------------------' */ -[_NUMLAY] = LAYOUT_planck_grid( +[_NUMLAY] = LAYOUT_ortho_4x12_wrapper( _______, KC_Q, KC_UP, KC_H, XXXXXXX, XXXXXXX, KC_P7, KC_P8, KC_P9, KC_MINS, KC_PLUS, KC_BSPC, _______, KC_LEFT, KC_DOWN, KC_RIGHT, XXXXXXX, XXXXXXX, KC_P4, KC_P5, KC_P6, KC_PAST, KC_COLN, KC_ENT, _______, KC_Z, KC_X, KC_C, KC_V, XXXXXXX, KC_P1, KC_P2, KC_P3, KC_PDOT, KC_PSLS, _______, @@ -170,7 +170,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ -[_MOUSECURSOR] = LAYOUT_planck_grid( +[_MOUSECURSOR] = LAYOUT_ortho_4x12_wrapper( KC_ACL0, KC_ACL1, KC_ACL2, M_EMAIL,M_EMAIL2, KC_HOME, KC_PGUP, KC_WH_L, KC_MS_U, KC_WH_R, P_MPASS, P_META, _______, XXXXXXX, XXXXXXX, XXXXXXX, O_RTQ6H, KC_END , KC_PGDN, KC_MS_L, KC_MS_D, KC_MS_R, _______, O_DAYRN, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, KC_BTN2, KC_BTN3, KC_BTN4, KC_BTN5, _______, _______, @@ -188,7 +188,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | | | * `-----------------------------------------------------------------------------------' */ -[_ADJUST] = LAYOUT_planck_grid( +[_ADJUST] = LAYOUT_ortho_4x12_wrapper( DFU, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, KC_DEL, _______, MAGIC_TOGGLE_NKRO, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, PLOVER, _______, _______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, BL_DEC, BL_INC, BL_STEP, BL_TOGG, diff --git a/users/ishtob/ishtob.h b/users/ishtob/ishtob.h index 3e4d4ffbc..ced78a09d 100644 --- a/users/ishtob/ishtob.h +++ b/users/ishtob/ishtob.h @@ -85,7 +85,6 @@ expanded before being used as arguments to the LAYOUT_xxx macro. #define KEYMAP_wrapper(...) LAYOUT(__VA_ARGS__) #define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__) #define LAYOUT_ortho_4x12_wrapper(...) LAYOUT_ortho_4x12(__VA_ARGS__) -#define LAYOUT_planck_grid(...) LAYOUT_planck_grid(__VA_ARGS__) /* Blocks for each of the four major keyboard layouts From 2149f3b5889f898fecde845a03d61c1a854d9393 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Mon, 24 Dec 2018 09:19:18 -0800 Subject: [PATCH 748/788] Toad Configurator support and readme update (#4718) * Toad: Configurator support * Toad: update Docs links in readme --- keyboards/toad/info.json | 409 +++++++++++++++++++++++++++++++++++++++ keyboards/toad/readme.md | 2 +- 2 files changed, 410 insertions(+), 1 deletion(-) create mode 100644 keyboards/toad/info.json diff --git a/keyboards/toad/info.json b/keyboards/toad/info.json new file mode 100644 index 000000000..17a37147e --- /dev/null +++ b/keyboards/toad/info.json @@ -0,0 +1,409 @@ +{ + "keyboard_name": "Toad", + "url": "", + "maintainer": "qmk", + "width": 15, + "height": 6.5, + "layouts": { + "LAYOUT_all": { + "key_count": 78, + "layout": [ + {"label":"K000", "x":0, "y":0}, + {"label":"K001", "x":2, "y":0}, + {"label":"K002", "x":3, "y":0}, + {"label":"K003", "x":4, "y":0}, + {"label":"K004", "x":5, "y":0}, + {"label":"K005", "x":6.5, "y":0}, + {"label":"K006", "x":7.5, "y":0}, + {"label":"K007", "x":8.5, "y":0}, + {"label":"K008", "x":9.5, "y":0}, + {"label":"K009", "x":11, "y":0}, + {"label":"K010", "x":12, "y":0}, + {"label":"K011", "x":13, "y":0}, + {"label":"K012", "x":14, "y":0}, + {"label":"K100", "x":0, "y":1.5}, + {"label":"K101", "x":1, "y":1.5}, + {"label":"K102", "x":2, "y":1.5}, + {"label":"K103", "x":3, "y":1.5}, + {"label":"K104", "x":4, "y":1.5}, + {"label":"K105", "x":5, "y":1.5}, + {"label":"K106", "x":6, "y":1.5}, + {"label":"K107", "x":7, "y":1.5}, + {"label":"K108", "x":8, "y":1.5}, + {"label":"K109", "x":9, "y":1.5}, + {"label":"K110", "x":10, "y":1.5}, + {"label":"K111", "x":11, "y":1.5}, + {"label":"K112", "x":12, "y":1.5}, + {"label":"K113", "x":13, "y":1.5}, + {"label":"K013", "x":14, "y":1.5}, + {"label":"K200", "x":0, "y":2.5, "w":1.5}, + {"label":"K201", "x":1.5, "y":2.5}, + {"label":"K202", "x":2.5, "y":2.5}, + {"label":"K203", "x":3.5, "y":2.5}, + {"label":"K204", "x":4.5, "y":2.5}, + {"label":"K205", "x":5.5, "y":2.5}, + {"label":"K206", "x":6.5, "y":2.5}, + {"label":"K207", "x":7.5, "y":2.5}, + {"label":"K208", "x":8.5, "y":2.5}, + {"label":"K209", "x":9.5, "y":2.5}, + {"label":"K210", "x":10.5, "y":2.5}, + {"label":"K211", "x":11.5, "y":2.5}, + {"label":"K212", "x":12.5, "y":2.5}, + {"label":"K213", "x":13.5, "y":2.5, "w":1.5}, + {"label":"K300", "x":0, "y":3.5, "w":1.75}, + {"label":"K301", "x":1.75, "y":3.5}, + {"label":"K302", "x":2.75, "y":3.5}, + {"label":"K303", "x":3.75, "y":3.5}, + {"label":"K304", "x":4.75, "y":3.5}, + {"label":"K305", "x":5.75, "y":3.5}, + {"label":"K306", "x":6.75, "y":3.5}, + {"label":"K307", "x":7.75, "y":3.5}, + {"label":"K308", "x":8.75, "y":3.5}, + {"label":"K309", "x":9.75, "y":3.5}, + {"label":"K310", "x":10.75, "y":3.5}, + {"label":"K311", "x":11.75, "y":3.5}, + {"label":"K312", "x":12.75, "y":3.5}, + {"label":"K313", "x":13.75, "y":3.5, "w":1.25}, + {"label":"K400", "x":0, "y":4.5, "w":1.25}, + {"label":"K401", "x":1.25, "y":4.5}, + {"label":"K402", "x":2.25, "y":4.5}, + {"label":"K403", "x":3.25, "y":4.5}, + {"label":"K404", "x":4.25, "y":4.5}, + {"label":"K405", "x":5.25, "y":4.5}, + {"label":"K406", "x":6.25, "y":4.5}, + {"label":"K407", "x":7.25, "y":4.5}, + {"label":"K408", "x":8.25, "y":4.5}, + {"label":"K409", "x":9.25, "y":4.5}, + {"label":"K410", "x":10.25, "y":4.5}, + {"label":"K411", "x":11.25, "y":4.5}, + {"label":"K412", "x":12.25, "y":4.5, "w":1.75}, + {"label":"K413", "x":14, "y":4.5}, + {"label":"K500", "x":0, "y":5.5, "w":1.25}, + {"label":"K501", "x":1.25, "y":5.5, "w":1.25}, + {"label":"K502", "x":2.5, "y":5.5, "w":1.25}, + {"label":"K507", "x":3.75, "y":5.5, "w":6.25}, + {"label":"K510", "x":10, "y":5.5, "w":1.25}, + {"label":"K511", "x":11.25, "y":5.5, "w":1.25}, + {"label":"K512", "x":12.5, "y":5.5, "w":1.25}, + {"label":"K513", "x":13.75, "y":5.5, "w":1.25} + ] + }, + + "LAYOUT_ansi_wk": { + "key_count": 74, + "layout": [ + {"label":"K000", "x":0, "y":0}, + {"label":"K001", "x":2, "y":0}, + {"label":"K002", "x":3, "y":0}, + {"label":"K003", "x":4, "y":0}, + {"label":"K004", "x":5, "y":0}, + {"label":"K005", "x":6.5, "y":0}, + {"label":"K006", "x":7.5, "y":0}, + {"label":"K007", "x":8.5, "y":0}, + {"label":"K008", "x":9.5, "y":0}, + {"label":"K009", "x":11, "y":0}, + {"label":"K010", "x":12, "y":0}, + {"label":"K011", "x":13, "y":0}, + {"label":"K012", "x":14, "y":0}, + {"label":"K100", "x":0, "y":1.5}, + {"label":"K101", "x":1, "y":1.5}, + {"label":"K102", "x":2, "y":1.5}, + {"label":"K103", "x":3, "y":1.5}, + {"label":"K104", "x":4, "y":1.5}, + {"label":"K105", "x":5, "y":1.5}, + {"label":"K106", "x":6, "y":1.5}, + {"label":"K107", "x":7, "y":1.5}, + {"label":"K108", "x":8, "y":1.5}, + {"label":"K109", "x":9, "y":1.5}, + {"label":"K110", "x":10, "y":1.5}, + {"label":"K111", "x":11, "y":1.5}, + {"label":"K112", "x":12, "y":1.5}, + {"label":"K013", "x":13, "y":1.5, "w":2}, + {"label":"K200", "x":0, "y":2.5, "w":1.5}, + {"label":"K201", "x":1.5, "y":2.5}, + {"label":"K202", "x":2.5, "y":2.5}, + {"label":"K203", "x":3.5, "y":2.5}, + {"label":"K204", "x":4.5, "y":2.5}, + {"label":"K205", "x":5.5, "y":2.5}, + {"label":"K206", "x":6.5, "y":2.5}, + {"label":"K207", "x":7.5, "y":2.5}, + {"label":"K208", "x":8.5, "y":2.5}, + {"label":"K209", "x":9.5, "y":2.5}, + {"label":"K210", "x":10.5, "y":2.5}, + {"label":"K211", "x":11.5, "y":2.5}, + {"label":"K212", "x":12.5, "y":2.5}, + {"label":"K213", "x":13.5, "y":2.5, "w":1.5}, + {"label":"K300", "x":0, "y":3.5, "w":1.75}, + {"label":"K301", "x":1.75, "y":3.5}, + {"label":"K302", "x":2.75, "y":3.5}, + {"label":"K303", "x":3.75, "y":3.5}, + {"label":"K304", "x":4.75, "y":3.5}, + {"label":"K305", "x":5.75, "y":3.5}, + {"label":"K306", "x":6.75, "y":3.5}, + {"label":"K307", "x":7.75, "y":3.5}, + {"label":"K308", "x":8.75, "y":3.5}, + {"label":"K309", "x":9.75, "y":3.5}, + {"label":"K310", "x":10.75, "y":3.5}, + {"label":"K311", "x":11.75, "y":3.5}, + {"label":"K313", "x":12.75, "y":3.5, "w":2.25}, + {"label":"K400", "x":0, "y":4.5, "w":2.25}, + {"label":"K402", "x":2.25, "y":4.5}, + {"label":"K403", "x":3.25, "y":4.5}, + {"label":"K404", "x":4.25, "y":4.5}, + {"label":"K405", "x":5.25, "y":4.5}, + {"label":"K406", "x":6.25, "y":4.5}, + {"label":"K407", "x":7.25, "y":4.5}, + {"label":"K408", "x":8.25, "y":4.5}, + {"label":"K409", "x":9.25, "y":4.5}, + {"label":"K410", "x":10.25, "y":4.5}, + {"label":"K411", "x":11.25, "y":4.5}, + {"label":"K412", "x":12.25, "y":4.5, "w":2.75}, + {"label":"K500", "x":0, "y":5.5, "w":1.25}, + {"label":"K501", "x":1.25, "y":5.5, "w":1.25}, + {"label":"K502", "x":2.5, "y":5.5, "w":1.25}, + {"label":"K507", "x":3.75, "y":5.5, "w":6.25}, + {"label":"K510", "x":10, "y":5.5, "w":1.25}, + {"label":"K511", "x":11.25, "y":5.5, "w":1.25}, + {"label":"K512", "x":12.5, "y":5.5, "w":1.25}, + {"label":"K513", "x":13.75, "y":5.5, "w":1.25} + ] + }, + + "LAYOUT_ansi_wkl": { + "key_count": 71, + "layout": [ + {"label":"K000", "x":0, "y":0}, + {"label":"K001", "x":2, "y":0}, + {"label":"K002", "x":3, "y":0}, + {"label":"K003", "x":4, "y":0}, + {"label":"K004", "x":5, "y":0}, + {"label":"K005", "x":6.5, "y":0}, + {"label":"K006", "x":7.5, "y":0}, + {"label":"K007", "x":8.5, "y":0}, + {"label":"K008", "x":9.5, "y":0}, + {"label":"K009", "x":11, "y":0}, + {"label":"K010", "x":12, "y":0}, + {"label":"K011", "x":13, "y":0}, + {"label":"K012", "x":14, "y":0}, + {"label":"K100", "x":0, "y":1.5}, + {"label":"K101", "x":1, "y":1.5}, + {"label":"K102", "x":2, "y":1.5}, + {"label":"K103", "x":3, "y":1.5}, + {"label":"K104", "x":4, "y":1.5}, + {"label":"K105", "x":5, "y":1.5}, + {"label":"K106", "x":6, "y":1.5}, + {"label":"K107", "x":7, "y":1.5}, + {"label":"K108", "x":8, "y":1.5}, + {"label":"K109", "x":9, "y":1.5}, + {"label":"K110", "x":10, "y":1.5}, + {"label":"K111", "x":11, "y":1.5}, + {"label":"K112", "x":12, "y":1.5}, + {"label":"K013", "x":13, "y":1.5, "w":2}, + {"label":"K200", "x":0, "y":2.5, "w":1.5}, + {"label":"K201", "x":1.5, "y":2.5}, + {"label":"K202", "x":2.5, "y":2.5}, + {"label":"K203", "x":3.5, "y":2.5}, + {"label":"K204", "x":4.5, "y":2.5}, + {"label":"K205", "x":5.5, "y":2.5}, + {"label":"K206", "x":6.5, "y":2.5}, + {"label":"K207", "x":7.5, "y":2.5}, + {"label":"K208", "x":8.5, "y":2.5}, + {"label":"K209", "x":9.5, "y":2.5}, + {"label":"K210", "x":10.5, "y":2.5}, + {"label":"K211", "x":11.5, "y":2.5}, + {"label":"K212", "x":12.5, "y":2.5}, + {"label":"K213", "x":13.5, "y":2.5, "w":1.5}, + {"label":"K300", "x":0, "y":3.5, "w":1.75}, + {"label":"K301", "x":1.75, "y":3.5}, + {"label":"K302", "x":2.75, "y":3.5}, + {"label":"K303", "x":3.75, "y":3.5}, + {"label":"K304", "x":4.75, "y":3.5}, + {"label":"K305", "x":5.75, "y":3.5}, + {"label":"K306", "x":6.75, "y":3.5}, + {"label":"K307", "x":7.75, "y":3.5}, + {"label":"K308", "x":8.75, "y":3.5}, + {"label":"K309", "x":9.75, "y":3.5}, + {"label":"K310", "x":10.75, "y":3.5}, + {"label":"K311", "x":11.75, "y":3.5}, + {"label":"K313", "x":12.75, "y":3.5, "w":2.25}, + {"label":"K400", "x":0, "y":4.5, "w":2.25}, + {"label":"K402", "x":2.25, "y":4.5}, + {"label":"K403", "x":3.25, "y":4.5}, + {"label":"K404", "x":4.25, "y":4.5}, + {"label":"K405", "x":5.25, "y":4.5}, + {"label":"K406", "x":6.25, "y":4.5}, + {"label":"K407", "x":7.25, "y":4.5}, + {"label":"K408", "x":8.25, "y":4.5}, + {"label":"K409", "x":9.25, "y":4.5}, + {"label":"K410", "x":10.25, "y":4.5}, + {"label":"K411", "x":11.25, "y":4.5}, + {"label":"K412", "x":12.25, "y":4.5, "w":2.75}, + {"label":"K500", "x":0, "y":5.5, "w":1.5}, + {"label":"K502", "x":2.5, "y":5.5, "w":1.5}, + {"label":"K507", "x":4, "y":5.5, "w":7}, + {"label":"K511", "x":11, "y":5.5, "w":1.5}, + {"label":"K513", "x":13.5, "y":5.5, "w":1.5} + ] + }, + + "LAYOUT_iso_wk": { + "key_count": 75, + "layout": [ + {"label":"K000", "x":0, "y":0}, + {"label":"K001", "x":2, "y":0}, + {"label":"K002", "x":3, "y":0}, + {"label":"K003", "x":4, "y":0}, + {"label":"K004", "x":5, "y":0}, + {"label":"K005", "x":6.5, "y":0}, + {"label":"K006", "x":7.5, "y":0}, + {"label":"K007", "x":8.5, "y":0}, + {"label":"K008", "x":9.5, "y":0}, + {"label":"K009", "x":11, "y":0}, + {"label":"K010", "x":12, "y":0}, + {"label":"K011", "x":13, "y":0}, + {"label":"K012", "x":14, "y":0}, + {"label":"K100", "x":0, "y":1.5}, + {"label":"K101", "x":1, "y":1.5}, + {"label":"K102", "x":2, "y":1.5}, + {"label":"K103", "x":3, "y":1.5}, + {"label":"K104", "x":4, "y":1.5}, + {"label":"K105", "x":5, "y":1.5}, + {"label":"K106", "x":6, "y":1.5}, + {"label":"K107", "x":7, "y":1.5}, + {"label":"K108", "x":8, "y":1.5}, + {"label":"K109", "x":9, "y":1.5}, + {"label":"K110", "x":10, "y":1.5}, + {"label":"K111", "x":11, "y":1.5}, + {"label":"K112", "x":12, "y":1.5}, + {"label":"K013", "x":13, "y":1.5, "w":2}, + {"label":"K200", "x":0, "y":2.5, "w":1.5}, + {"label":"K201", "x":1.5, "y":2.5}, + {"label":"K202", "x":2.5, "y":2.5}, + {"label":"K203", "x":3.5, "y":2.5}, + {"label":"K204", "x":4.5, "y":2.5}, + {"label":"K205", "x":5.5, "y":2.5}, + {"label":"K206", "x":6.5, "y":2.5}, + {"label":"K207", "x":7.5, "y":2.5}, + {"label":"K208", "x":8.5, "y":2.5}, + {"label":"K209", "x":9.5, "y":2.5}, + {"label":"K210", "x":10.5, "y":2.5}, + {"label":"K211", "x":11.5, "y":2.5}, + {"label":"K212", "x":12.5, "y":2.5}, + {"label":"K300", "x":0, "y":3.5, "w":1.75}, + {"label":"K301", "x":1.75, "y":3.5}, + {"label":"K302", "x":2.75, "y":3.5}, + {"label":"K303", "x":3.75, "y":3.5}, + {"label":"K304", "x":4.75, "y":3.5}, + {"label":"K305", "x":5.75, "y":3.5}, + {"label":"K306", "x":6.75, "y":3.5}, + {"label":"K307", "x":7.75, "y":3.5}, + {"label":"K308", "x":8.75, "y":3.5}, + {"label":"K309", "x":9.75, "y":3.5}, + {"label":"K310", "x":10.75, "y":3.5}, + {"label":"K311", "x":11.75, "y":3.5}, + {"label":"K312", "x":12.75, "y":3.5}, + {"label":"K313", "x":13.75, "y":2.5, "w":1.25, "h":2}, + {"label":"K400", "x":0, "y":4.5, "w":1.25}, + {"label":"K401", "x":1.25, "y":4.5}, + {"label":"K402", "x":2.25, "y":4.5}, + {"label":"K403", "x":3.25, "y":4.5}, + {"label":"K404", "x":4.25, "y":4.5}, + {"label":"K405", "x":5.25, "y":4.5}, + {"label":"K406", "x":6.25, "y":4.5}, + {"label":"K407", "x":7.25, "y":4.5}, + {"label":"K408", "x":8.25, "y":4.5}, + {"label":"K409", "x":9.25, "y":4.5}, + {"label":"K410", "x":10.25, "y":4.5}, + {"label":"K411", "x":11.25, "y":4.5}, + {"label":"K412", "x":12.25, "y":4.5, "w":2.75}, + {"label":"K500", "x":0, "y":5.5, "w":1.25}, + {"label":"K501", "x":1.25, "y":5.5, "w":1.25}, + {"label":"K502", "x":2.5, "y":5.5, "w":1.25}, + {"label":"K507", "x":3.75, "y":5.5, "w":6.25}, + {"label":"K510", "x":10, "y":5.5, "w":1.25}, + {"label":"K511", "x":11.25, "y":5.5, "w":1.25}, + {"label":"K512", "x":12.5, "y":5.5, "w":1.25}, + {"label":"K513", "x":13.75, "y":5.5, "w":1.25} + ] + }, + + "LAYOUT_iso_wkl": { + "key_count": 72, + "layout": [ + {"label":"K000", "x":0, "y":0}, + {"label":"K001", "x":2, "y":0}, + {"label":"K002", "x":3, "y":0}, + {"label":"K003", "x":4, "y":0}, + {"label":"K004", "x":5, "y":0}, + {"label":"K005", "x":6.5, "y":0}, + {"label":"K006", "x":7.5, "y":0}, + {"label":"K007", "x":8.5, "y":0}, + {"label":"K008", "x":9.5, "y":0}, + {"label":"K009", "x":11, "y":0}, + {"label":"K010", "x":12, "y":0}, + {"label":"K011", "x":13, "y":0}, + {"label":"K012", "x":14, "y":0}, + {"label":"K100", "x":0, "y":1.5}, + {"label":"K101", "x":1, "y":1.5}, + {"label":"K102", "x":2, "y":1.5}, + {"label":"K103", "x":3, "y":1.5}, + {"label":"K104", "x":4, "y":1.5}, + {"label":"K105", "x":5, "y":1.5}, + {"label":"K106", "x":6, "y":1.5}, + {"label":"K107", "x":7, "y":1.5}, + {"label":"K108", "x":8, "y":1.5}, + {"label":"K109", "x":9, "y":1.5}, + {"label":"K110", "x":10, "y":1.5}, + {"label":"K111", "x":11, "y":1.5}, + {"label":"K112", "x":12, "y":1.5}, + {"label":"K013", "x":13, "y":1.5, "w":2}, + {"label":"K200", "x":0, "y":2.5, "w":1.5}, + {"label":"K201", "x":1.5, "y":2.5}, + {"label":"K202", "x":2.5, "y":2.5}, + {"label":"K203", "x":3.5, "y":2.5}, + {"label":"K204", "x":4.5, "y":2.5}, + {"label":"K205", "x":5.5, "y":2.5}, + {"label":"K206", "x":6.5, "y":2.5}, + {"label":"K207", "x":7.5, "y":2.5}, + {"label":"K208", "x":8.5, "y":2.5}, + {"label":"K209", "x":9.5, "y":2.5}, + {"label":"K210", "x":10.5, "y":2.5}, + {"label":"K211", "x":11.5, "y":2.5}, + {"label":"K212", "x":12.5, "y":2.5}, + {"label":"K300", "x":0, "y":3.5, "w":1.75}, + {"label":"K301", "x":1.75, "y":3.5}, + {"label":"K302", "x":2.75, "y":3.5}, + {"label":"K303", "x":3.75, "y":3.5}, + {"label":"K304", "x":4.75, "y":3.5}, + {"label":"K305", "x":5.75, "y":3.5}, + {"label":"K306", "x":6.75, "y":3.5}, + {"label":"K307", "x":7.75, "y":3.5}, + {"label":"K308", "x":8.75, "y":3.5}, + {"label":"K309", "x":9.75, "y":3.5}, + {"label":"K310", "x":10.75, "y":3.5}, + {"label":"K311", "x":11.75, "y":3.5}, + {"label":"K312", "x":12.75, "y":3.5}, + {"label":"K313", "x":13.75, "y":2.5, "w":1.25, "h":2}, + {"label":"K400", "x":0, "y":4.5, "w":1.25}, + {"label":"K401", "x":1.25, "y":4.5}, + {"label":"K402", "x":2.25, "y":4.5}, + {"label":"K403", "x":3.25, "y":4.5}, + {"label":"K404", "x":4.25, "y":4.5}, + {"label":"K405", "x":5.25, "y":4.5}, + {"label":"K406", "x":6.25, "y":4.5}, + {"label":"K407", "x":7.25, "y":4.5}, + {"label":"K408", "x":8.25, "y":4.5}, + {"label":"K409", "x":9.25, "y":4.5}, + {"label":"K410", "x":10.25, "y":4.5}, + {"label":"K411", "x":11.25, "y":4.5}, + {"label":"K412", "x":12.25, "y":4.5, "w":2.75}, + {"label":"K500", "x":0, "y":5.5, "w":1.5}, + {"label":"K502", "x":2.5, "y":5.5, "w":1.5}, + {"label":"K507", "x":4, "y":5.5, "w":7}, + {"label":"K511", "x":11, "y":5.5, "w":1.5}, + {"label":"K513", "x":13.5, "y":5.5, "w":1.5} + ] + } + } +} + diff --git a/keyboards/toad/readme.md b/keyboards/toad/readme.md index 3f3bff5b5..de58f7202 100644 --- a/keyboards/toad/readme.md +++ b/keyboards/toad/readme.md @@ -10,5 +10,5 @@ Make examples for these keyboards (after setting up your build environment): make toad:default +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). -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. From 72d4e4bfd76b2c83b89787f8b3a8ba779a3e8d81 Mon Sep 17 00:00:00 2001 From: Takeshi ISHII <2170248+mtei@users.noreply.github.com> Date: Tue, 25 Dec 2018 04:14:57 +0900 Subject: [PATCH 749/788] Replace serial.c of quantum/split_common/ (#4669) * Add provisional Helix implementation to test the quantum/split_common. * copy keyboards/helix/serial.[ch] to quantum/split_common/ * Make serial.c a pure driver. Remove buffer name and buffer size from serial.c. They should be placed in the caller(matrix.c, split_utils.c). * remove quantum/split_common/serial_backward_compatibility.h * Changed array serial_master_buffer to structure serial_m2s_buffer. * Changed array serial_slave_buffer to structure serial_s2m_buffer. * Change keyboards/miniaxe/matrix.c I also made changes to quantum/split_comon/matrix.c to keyboards/miniaxe/matrix.c. Note: I contacted @ka2hiro, creator of miniaxe, and I got permission to change keyboards/miniaxe/matrix.c. * update history comment in quantum/split_common/serial.c * Revert "Add provisional Helix implementation to test the quantum/split_common." This reverts commit 168c82ef82c88e79979d9796bab9cc819cc2f685. * fix keyboards/miniaxe/matrix.c, quantum/split_common/matrix.c avr-gcc 4.9.[23] report error. avr-gcc 5.4.0, avr-gcc 7.3.0 pass. It is funny. * update comment quantum/split_common/serial.c * Reserve RGBLIGHT_SPLIT macro in quantum/split_common --- common_features.mk | 5 - keyboards/miniaxe/matrix.c | 59 +- quantum/split_common/matrix.c | 61 ++- quantum/split_common/matrix.h | 31 ++ quantum/split_common/serial.c | 509 +++++++++++++----- quantum/split_common/serial.h | 65 ++- .../serial_backward_compatibility.h | 11 - quantum/split_common/split_util.c | 9 +- quantum/split_common/split_util.h | 3 - 9 files changed, 580 insertions(+), 173 deletions(-) create mode 100644 quantum/split_common/matrix.h delete mode 100644 quantum/split_common/serial_backward_compatibility.h diff --git a/common_features.mk b/common_features.mk index 73aab5d84..883681324 100644 --- a/common_features.mk +++ b/common_features.mk @@ -263,11 +263,6 @@ ifneq ($(strip $(CUSTOM_MATRIX)), yes) endif ifeq ($(strip $(SPLIT_KEYBOARD)), yes) - SERIAL_BACKWARD_COMPAT := $(wildcard $(QUANTUM_DIR)/split_common/serial_backward_compatibility.h) - ifneq ($(SERIAL_BACKWARD_COMPAT),) - CONFIG_H += $(SERIAL_BACKWARD_COMPAT) - # $(info CONFIG_H=$(CONFIG_H)) - endif OPT_DEFS += -DSPLIT_KEYBOARD QUANTUM_SRC += $(QUANTUM_DIR)/split_common/split_flags.c \ $(QUANTUM_DIR)/split_common/split_util.c diff --git a/keyboards/miniaxe/matrix.c b/keyboards/miniaxe/matrix.c index 55c458e1f..5fec1281d 100644 --- a/keyboards/miniaxe/matrix.c +++ b/keyboards/miniaxe/matrix.c @@ -32,9 +32,6 @@ along with this program. If not, see . #include "timer.h" #include "split_flags.h" -#ifdef RGBLIGHT_ENABLE -# include "rgblight.h" -#endif #ifdef BACKLIGHT_ENABLE # include "backlight.h" extern backlight_config_t backlight_config; @@ -55,6 +52,8 @@ along with this program. If not, see . static bool debouncing = false; #endif +#if defined(USE_I2C) || defined(EH) + #if (MATRIX_COLS <= 8) # define print_matrix_header() print("\nr/c 01234567\n") # define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row)) @@ -62,6 +61,27 @@ along with this program. If not, see . # define ROW_SHIFTER ((uint8_t)1) #else # error "Currently only supports 8 COLS" +#endif + +#else // USE_SERIAL + +#if (MATRIX_COLS <= 8) +# define print_matrix_header() print("\nr/c 01234567\n") +# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row)) +# define matrix_bitpop(i) bitpop(matrix[i]) +# define ROW_SHIFTER ((uint8_t)1) +#elif (MATRIX_COLS <= 16) +# define print_matrix_header() print("\nr/c 0123456789ABCDEF\n") +# define print_matrix_row(row) print_bin_reverse16(matrix_get_row(row)) +# define matrix_bitpop(i) bitpop16(matrix[i]) +# define ROW_SHIFTER ((uint16_t)1) +#elif (MATRIX_COLS <= 32) +# define print_matrix_header() print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n") +# define print_matrix_row(row) print_bin_reverse32(matrix_get_row(row)) +# define matrix_bitpop(i) bitpop32(matrix[i]) +# define ROW_SHIFTER ((uint32_t)1) +#endif + #endif static matrix_row_t matrix_debouncing[MATRIX_ROWS]; @@ -315,15 +335,39 @@ i2c_error: // the cable is disconnceted, or something else went wrong #else // USE_SERIAL + +typedef struct _Serial_s2m_buffer_t { + // TODO: if MATRIX_COLS > 8 change to uint8_t packed_matrix[] for pack/unpack + matrix_row_t smatrix[ROWS_PER_HAND]; +} Serial_s2m_buffer_t; + +volatile Serial_s2m_buffer_t serial_s2m_buffer = {}; +volatile Serial_m2s_buffer_t serial_m2s_buffer = {}; +uint8_t volatile status0 = 0; + +SSTD_t transactions[] = { + { (uint8_t *)&status0, + sizeof(serial_m2s_buffer), (uint8_t *)&serial_m2s_buffer, + sizeof(serial_s2m_buffer), (uint8_t *)&serial_s2m_buffer + } +}; + +void serial_master_init(void) +{ soft_serial_initiator_init(transactions, TID_LIMIT(transactions)); } + +void serial_slave_init(void) +{ soft_serial_target_init(transactions, TID_LIMIT(transactions)); } + int serial_transaction(void) { int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; - if (serial_update_buffers()) { + if (soft_serial_transaction()) { return 1; } + // TODO: if MATRIX_COLS > 8 change to unpack() for (int i = 0; i < ROWS_PER_HAND; ++i) { - matrix[slaveOffset+i] = serial_slave_buffer[i]; + matrix[slaveOffset+i] = serial_s2m_buffer.smatrix[i]; } #ifdef RGBLIGHT_ENABLE @@ -332,7 +376,7 @@ int serial_transaction(void) { #ifdef BACKLIGHT_ENABLE // Write backlight level for slave to read - serial_master_buffer[SERIAL_BACKLIT_START] = backlight_config.enable ? backlight_config.level : 0; + serial_m2s_buffer.backlight_level = backlight_config.enable ? backlight_config.level : 0; #endif return 0; @@ -375,8 +419,9 @@ void matrix_slave_scan(void) { i2c_slave_buffer[I2C_KEYMAP_START+i] = matrix[offset+i]; } #else // USE_SERIAL + // TODO: if MATRIX_COLS > 8 change to pack() for (int i = 0; i < ROWS_PER_HAND; ++i) { - serial_slave_buffer[i] = matrix[offset+i]; + serial_s2m_buffer.smatrix[i] = matrix[offset+i]; } #endif matrix_slave_scan_user(); diff --git a/quantum/split_common/matrix.c b/quantum/split_common/matrix.c index d6359b51f..261137638 100644 --- a/quantum/split_common/matrix.c +++ b/quantum/split_common/matrix.c @@ -32,9 +32,6 @@ along with this program. If not, see . #include "timer.h" #include "split_flags.h" -#ifdef RGBLIGHT_ENABLE -# include "rgblight.h" -#endif #ifdef BACKLIGHT_ENABLE # include "backlight.h" extern backlight_config_t backlight_config; @@ -55,6 +52,8 @@ along with this program. If not, see . static bool debouncing = false; #endif +#if defined(USE_I2C) || defined(EH) + #if (MATRIX_COLS <= 8) # define print_matrix_header() print("\nr/c 01234567\n") # define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row)) @@ -62,6 +61,27 @@ along with this program. If not, see . # define ROW_SHIFTER ((uint8_t)1) #else # error "Currently only supports 8 COLS" +#endif + +#else // USE_SERIAL + +#if (MATRIX_COLS <= 8) +# define print_matrix_header() print("\nr/c 01234567\n") +# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row)) +# define matrix_bitpop(i) bitpop(matrix[i]) +# define ROW_SHIFTER ((uint8_t)1) +#elif (MATRIX_COLS <= 16) +# define print_matrix_header() print("\nr/c 0123456789ABCDEF\n") +# define print_matrix_row(row) print_bin_reverse16(matrix_get_row(row)) +# define matrix_bitpop(i) bitpop16(matrix[i]) +# define ROW_SHIFTER ((uint16_t)1) +#elif (MATRIX_COLS <= 32) +# define print_matrix_header() print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n") +# define print_matrix_row(row) print_bin_reverse32(matrix_get_row(row)) +# define matrix_bitpop(i) bitpop32(matrix[i]) +# define ROW_SHIFTER ((uint32_t)1) +#endif + #endif static matrix_row_t matrix_debouncing[MATRIX_ROWS]; @@ -286,24 +306,48 @@ i2c_error: // the cable is disconnceted, or something else went wrong #else // USE_SERIAL + +typedef struct _Serial_s2m_buffer_t { + // TODO: if MATRIX_COLS > 8 change to uint8_t packed_matrix[] for pack/unpack + matrix_row_t smatrix[ROWS_PER_HAND]; +} Serial_s2m_buffer_t; + +volatile Serial_s2m_buffer_t serial_s2m_buffer = {}; +volatile Serial_m2s_buffer_t serial_m2s_buffer = {}; +uint8_t volatile status0 = 0; + +SSTD_t transactions[] = { + { (uint8_t *)&status0, + sizeof(serial_m2s_buffer), (uint8_t *)&serial_m2s_buffer, + sizeof(serial_s2m_buffer), (uint8_t *)&serial_s2m_buffer + } +}; + +void serial_master_init(void) +{ soft_serial_initiator_init(transactions, TID_LIMIT(transactions)); } + +void serial_slave_init(void) +{ soft_serial_target_init(transactions, TID_LIMIT(transactions)); } + int serial_transaction(void) { int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; - if (serial_update_buffers()) { + if (soft_serial_transaction()) { return 1; } + // TODO: if MATRIX_COLS > 8 change to unpack() for (int i = 0; i < ROWS_PER_HAND; ++i) { - matrix[slaveOffset+i] = serial_slave_buffer[i]; + matrix[slaveOffset+i] = serial_s2m_buffer.smatrix[i]; } - #ifdef RGBLIGHT_ENABLE + #if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT) // Code to send RGB over serial goes here (not implemented yet) #endif #ifdef BACKLIGHT_ENABLE // Write backlight level for slave to read - serial_master_buffer[SERIAL_BACKLIT_START] = backlight_config.enable ? backlight_config.level : 0; + serial_m2s_buffer.backlight_level = backlight_config.enable ? backlight_config.level : 0; #endif return 0; @@ -346,8 +390,9 @@ void matrix_slave_scan(void) { i2c_slave_buffer[I2C_KEYMAP_START+i] = matrix[offset+i]; } #else // USE_SERIAL + // TODO: if MATRIX_COLS > 8 change to pack() for (int i = 0; i < ROWS_PER_HAND; ++i) { - serial_slave_buffer[i] = matrix[offset+i]; + serial_s2m_buffer.smatrix[i] = matrix[offset+i]; } #endif matrix_slave_scan_user(); diff --git a/quantum/split_common/matrix.h b/quantum/split_common/matrix.h new file mode 100644 index 000000000..b5cb45bae --- /dev/null +++ b/quantum/split_common/matrix.h @@ -0,0 +1,31 @@ +#ifndef SPLIT_COMMON_MATRIX_H +#define SPLIT_COMMON_MATRIX_H + +#include + +#ifdef RGBLIGHT_ENABLE +# include "rgblight.h" +#endif + +typedef struct _Serial_m2s_buffer_t { +#ifdef BACKLIGHT_ENABLE + uint8_t backlight_level; +#endif +#if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT) + rgblight_config_t rgblight_config; //not yet use + // + // When MCUs on both sides drive their respective RGB LED chains, + // it is necessary to synchronize, so it is necessary to communicate RGB information. + // In that case, define the RGBLIGHT_SPLIT macro. + // + // Otherwise, if the master side MCU drives both sides RGB LED chains, + // there is no need to communicate. +#endif +} Serial_m2s_buffer_t; + +extern volatile Serial_m2s_buffer_t serial_m2s_buffer; + +void serial_master_init(void); +void serial_slave_init(void); + +#endif diff --git a/quantum/split_common/serial.c b/quantum/split_common/serial.c index 13e58d825..4df8d103b 100644 --- a/quantum/split_common/serial.c +++ b/quantum/split_common/serial.c @@ -1,5 +1,10 @@ /* * WARNING: be careful changing this code, it is very timing dependent + * + * 2018-10-28 checked + * avr-gcc 4.9.2 + * avr-gcc 5.4.0 + * avr-gcc 7.3.0 */ #ifndef F_CPU @@ -9,17 +14,19 @@ #include #include #include +#include #include #include "serial.h" +//#include #ifdef SOFT_SERIAL_PIN #ifdef __AVR_ATmega32U4__ // if using ATmega32U4 I2C, can not use PD0 and PD1 in soft serial. #ifdef USE_AVR_I2C - #if SOFT_SERIAL_PIN == D0 || SOFT_SERIAL_PIN == D1 - #error Using ATmega32U4 I2C, so can not use PD0, PD1 - #endif + #if SOFT_SERIAL_PIN == D0 || SOFT_SERIAL_PIN == D1 + #error Using ATmega32U4 I2C, so can not use PD0, PD1 + #endif #endif #if SOFT_SERIAL_PIN >= D0 && SOFT_SERIAL_PIN <= D3 @@ -63,215 +70,477 @@ #error serial.c now support ATmega32U4 only #endif -// Serial pulse period in microseconds. Its probably a bad idea to lower this -// value. -#define SERIAL_DELAY 24 +#define ALWAYS_INLINE __attribute__((always_inline)) +#define NO_INLINE __attribute__((noinline)) +#define _delay_sub_us(x) __builtin_avr_delay_cycles(x) -uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; -uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0}; +// parity check +#define ODD_PARITY 1 +#define EVEN_PARITY 0 +#define PARITY EVEN_PARITY -#define SLAVE_DATA_CORRUPT (1<<0) -volatile uint8_t status = 0; +#ifdef SERIAL_DELAY + // custom setup in config.h + // #define TID_SEND_ADJUST 2 + // #define SERIAL_DELAY 6 // micro sec + // #define READ_WRITE_START_ADJUST 30 // cycles + // #define READ_WRITE_WIDTH_ADJUST 8 // cycles +#else +// ============ Standard setups ============ +#ifndef SELECT_SOFT_SERIAL_SPEED +#define SELECT_SOFT_SERIAL_SPEED 1 +// 0: about 189kbps (Experiment only) +// 1: about 137kbps (default) +// 2: about 75kbps +// 3: about 39kbps +// 4: about 26kbps +// 5: about 20kbps +#endif + +#if __GNUC__ < 6 + #define TID_SEND_ADJUST 14 +#else + #define TID_SEND_ADJUST 2 +#endif + +#if SELECT_SOFT_SERIAL_SPEED == 0 + // Very High speed + #define SERIAL_DELAY 4 // micro sec + #if __GNUC__ < 6 + #define READ_WRITE_START_ADJUST 33 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_START_ADJUST 34 // cycles + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif +#elif SELECT_SOFT_SERIAL_SPEED == 1 + // High speed + #define SERIAL_DELAY 6 // micro sec + #if __GNUC__ < 6 + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_START_ADJUST 33 // cycles + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif +#elif SELECT_SOFT_SERIAL_SPEED == 2 + // Middle speed + #define SERIAL_DELAY 12 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #if __GNUC__ < 6 + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif +#elif SELECT_SOFT_SERIAL_SPEED == 3 + // Low speed + #define SERIAL_DELAY 24 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #if __GNUC__ < 6 + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif +#elif SELECT_SOFT_SERIAL_SPEED == 4 + // Very Low speed + #define SERIAL_DELAY 36 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #if __GNUC__ < 6 + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif +#elif SELECT_SOFT_SERIAL_SPEED == 5 + // Ultra Low speed + #define SERIAL_DELAY 48 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #if __GNUC__ < 6 + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif +#else +#error invalid SELECT_SOFT_SERIAL_SPEED value +#endif /* SELECT_SOFT_SERIAL_SPEED */ +#endif /* SERIAL_DELAY */ + +#define SERIAL_DELAY_HALF1 (SERIAL_DELAY/2) +#define SERIAL_DELAY_HALF2 (SERIAL_DELAY - SERIAL_DELAY/2) + +#define SLAVE_INT_WIDTH_US 1 +#ifndef SERIAL_USE_MULTI_TRANSACTION + #define SLAVE_INT_RESPONSE_TIME SERIAL_DELAY +#else + #define SLAVE_INT_ACK_WIDTH_UNIT 2 + #define SLAVE_INT_ACK_WIDTH 4 +#endif + +static SSTD_t *Transaction_table = NULL; +static uint8_t Transaction_table_size = 0; + +inline static void serial_delay(void) ALWAYS_INLINE; inline static void serial_delay(void) { _delay_us(SERIAL_DELAY); } +inline static void serial_delay_half1(void) ALWAYS_INLINE; +inline static +void serial_delay_half1(void) { + _delay_us(SERIAL_DELAY_HALF1); +} + +inline static void serial_delay_half2(void) ALWAYS_INLINE; +inline static +void serial_delay_half2(void) { + _delay_us(SERIAL_DELAY_HALF2); +} + +inline static void serial_output(void) ALWAYS_INLINE; inline static void serial_output(void) { SERIAL_PIN_DDR |= SERIAL_PIN_MASK; } // make the serial pin an input with pull-up resistor +inline static void serial_input_with_pullup(void) ALWAYS_INLINE; inline static -void serial_input(void) { +void serial_input_with_pullup(void) { SERIAL_PIN_DDR &= ~SERIAL_PIN_MASK; SERIAL_PIN_PORT |= SERIAL_PIN_MASK; } +inline static uint8_t serial_read_pin(void) ALWAYS_INLINE; inline static uint8_t serial_read_pin(void) { return !!(SERIAL_PIN_INPUT & SERIAL_PIN_MASK); } +inline static void serial_low(void) ALWAYS_INLINE; inline static void serial_low(void) { SERIAL_PIN_PORT &= ~SERIAL_PIN_MASK; } +inline static void serial_high(void) ALWAYS_INLINE; inline static void serial_high(void) { SERIAL_PIN_PORT |= SERIAL_PIN_MASK; } -void serial_master_init(void) { - serial_output(); - serial_high(); +void soft_serial_initiator_init(SSTD_t *sstd_table, int sstd_table_size) +{ + Transaction_table = sstd_table; + Transaction_table_size = (uint8_t)sstd_table_size; + serial_output(); + serial_high(); } -void serial_slave_init(void) { - serial_input(); +void soft_serial_target_init(SSTD_t *sstd_table, int sstd_table_size) +{ + Transaction_table = sstd_table; + Transaction_table_size = (uint8_t)sstd_table_size; + serial_input_with_pullup(); - // Enable INT0 - EIMSK |= _BV(INT0); - // Trigger on falling edge of INT0 - EICRA &= ~(_BV(ISC00) | _BV(ISC01)); + // Enable INT0-INT3,INT6 + EIMSK |= EIMSK_BIT; +#if SERIAL_PIN_MASK == _BV(PE6) + // Trigger on falling edge of INT6 + EICRB &= EICRx_BIT; +#else + // Trigger on falling edge of INT0-INT3 + EICRA &= EICRx_BIT; +#endif } -// Used by the master to synchronize timing with the slave. +// Used by the sender to synchronize timing with the reciver. +static void sync_recv(void) NO_INLINE; static void sync_recv(void) { - serial_input(); - // This shouldn't hang if the slave disconnects because the - // serial line will float to high if the slave does disconnect. + for (uint8_t i = 0; i < SERIAL_DELAY*5 && serial_read_pin(); i++ ) { + } + // This shouldn't hang if the target disconnects because the + // serial line will float to high if the target does disconnect. while (!serial_read_pin()); - serial_delay(); } -// Used by the slave to send a synchronization signal to the master. +// Used by the reciver to send a synchronization signal to the sender. +static void sync_send(void) NO_INLINE; static void sync_send(void) { - serial_output(); - serial_low(); serial_delay(); - serial_high(); } // Reads a byte from the serial line -static -uint8_t serial_read_byte(void) { - uint8_t byte = 0; - serial_input(); - for ( uint8_t i = 0; i < 8; ++i) { - byte = (byte << 1) | serial_read_pin(); - serial_delay(); - _delay_us(1); +static uint8_t serial_read_chunk(uint8_t *pterrcount, uint8_t bit) NO_INLINE; +static uint8_t serial_read_chunk(uint8_t *pterrcount, uint8_t bit) { + uint8_t byte, i, p, pb; + + _delay_sub_us(READ_WRITE_START_ADJUST); + for( i = 0, byte = 0, p = PARITY; i < bit; i++ ) { + serial_delay_half1(); // read the middle of pulses + if( serial_read_pin() ) { + byte = (byte << 1) | 1; p ^= 1; + } else { + byte = (byte << 1) | 0; p ^= 0; + } + _delay_sub_us(READ_WRITE_WIDTH_ADJUST); + serial_delay_half2(); } + /* recive parity bit */ + serial_delay_half1(); // read the middle of pulses + pb = serial_read_pin(); + _delay_sub_us(READ_WRITE_WIDTH_ADJUST); + serial_delay_half2(); + + *pterrcount += (p != pb)? 1 : 0; return byte; } // Sends a byte with MSB ordering -static -void serial_write_byte(uint8_t data) { - uint8_t b = 8; - serial_output(); - while( b-- ) { - if(data & (1 << b)) { - serial_high(); - } else { - serial_low(); +void serial_write_chunk(uint8_t data, uint8_t bit) NO_INLINE; +void serial_write_chunk(uint8_t data, uint8_t bit) { + uint8_t b, p; + for( p = PARITY, b = 1<<(bit-1); b ; b >>= 1) { + if(data & b) { + serial_high(); p ^= 1; + } else { + serial_low(); p ^= 0; + } + serial_delay(); } + /* send parity bit */ + if(p & 1) { serial_high(); } + else { serial_low(); } serial_delay(); + + serial_low(); // sync_send() / senc_recv() need raise edge +} + +static void serial_send_packet(uint8_t *buffer, uint8_t size) NO_INLINE; +static +void serial_send_packet(uint8_t *buffer, uint8_t size) { + for (uint8_t i = 0; i < size; ++i) { + uint8_t data; + data = buffer[i]; + sync_send(); + serial_write_chunk(data,8); } } -// interrupt handle to be used by the slave device +static uint8_t serial_recive_packet(uint8_t *buffer, uint8_t size) NO_INLINE; +static +uint8_t serial_recive_packet(uint8_t *buffer, uint8_t size) { + uint8_t pecount = 0; + for (uint8_t i = 0; i < size; ++i) { + uint8_t data; + sync_recv(); + data = serial_read_chunk(&pecount, 8); + buffer[i] = data; + } + return pecount == 0; +} + +inline static +void change_sender2reciver(void) { + sync_send(); //0 + serial_delay_half1(); //1 + serial_low(); //2 + serial_input_with_pullup(); //2 + serial_delay_half1(); //3 +} + +inline static +void change_reciver2sender(void) { + sync_recv(); //0 + serial_delay(); //1 + serial_low(); //3 + serial_output(); //3 + serial_delay_half1(); //4 +} + +static inline uint8_t nibble_bits_count(uint8_t bits) +{ + bits = (bits & 0x5) + (bits >> 1 & 0x5); + bits = (bits & 0x3) + (bits >> 2 & 0x3); + return bits; +} + +// interrupt handle to be used by the target device ISR(SERIAL_PIN_INTERRUPT) { - sync_send(); - uint8_t checksum = 0; - for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) { - serial_write_byte(serial_slave_buffer[i]); - sync_send(); - checksum += serial_slave_buffer[i]; +#ifndef SERIAL_USE_MULTI_TRANSACTION + serial_low(); + serial_output(); + SSTD_t *trans = Transaction_table; +#else + // recive transaction table index + uint8_t tid, bits; + uint8_t pecount = 0; + sync_recv(); + bits = serial_read_chunk(&pecount,7); + tid = bits>>3; + bits = (bits&7) != nibble_bits_count(tid); + if( bits || pecount> 0 || tid > Transaction_table_size ) { + return; } - serial_write_byte(checksum); - sync_send(); + serial_delay_half1(); - // wait for the sync to finish sending - serial_delay(); + serial_high(); // response step1 low->high + serial_output(); + _delay_sub_us(SLAVE_INT_ACK_WIDTH_UNIT*SLAVE_INT_ACK_WIDTH); + SSTD_t *trans = &Transaction_table[tid]; + serial_low(); // response step2 ack high->low +#endif - // read the middle of pulses - _delay_us(SERIAL_DELAY/2); + // target send phase + if( trans->target2initiator_buffer_size > 0 ) + serial_send_packet((uint8_t *)trans->target2initiator_buffer, + trans->target2initiator_buffer_size); + // target switch to input + change_sender2reciver(); - uint8_t checksum_computed = 0; - for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) { - serial_master_buffer[i] = serial_read_byte(); - sync_send(); - checksum_computed += serial_master_buffer[i]; - } - uint8_t checksum_received = serial_read_byte(); - sync_send(); - - serial_input(); // end transaction - - if ( checksum_computed != checksum_received ) { - status |= SLAVE_DATA_CORRUPT; + // target recive phase + if( trans->initiator2target_buffer_size > 0 ) { + if (serial_recive_packet((uint8_t *)trans->initiator2target_buffer, + trans->initiator2target_buffer_size) ) { + *trans->status = TRANSACTION_ACCEPTED; + } else { + *trans->status = TRANSACTION_DATA_ERROR; + } } else { - status &= ~SLAVE_DATA_CORRUPT; + *trans->status = TRANSACTION_ACCEPTED; } + + sync_recv(); //weit initiator output to high } -inline -bool serial_slave_DATA_CORRUPT(void) { - return status & SLAVE_DATA_CORRUPT; -} - -// Copies the serial_slave_buffer to the master and sends the -// serial_master_buffer to the slave. +///////// +// start transaction by initiator +// +// int soft_serial_transaction(int sstd_index) // // Returns: -// 0 => no error -// 1 => slave did not respond -int serial_update_buffers(void) { - // this code is very time dependent, so we need to disable interrupts +// TRANSACTION_END +// TRANSACTION_NO_RESPONSE +// TRANSACTION_DATA_ERROR +// this code is very time dependent, so we need to disable interrupts +#ifndef SERIAL_USE_MULTI_TRANSACTION +int soft_serial_transaction(void) { + SSTD_t *trans = Transaction_table; +#else +int soft_serial_transaction(int sstd_index) { + if( sstd_index > Transaction_table_size ) + return TRANSACTION_TYPE_ERROR; + SSTD_t *trans = &Transaction_table[sstd_index]; +#endif cli(); - // signal to the slave that we want to start a transaction + // signal to the target that we want to start a transaction serial_output(); serial_low(); - _delay_us(1); + _delay_us(SLAVE_INT_WIDTH_US); - // wait for the slaves response - serial_input(); - serial_high(); - _delay_us(SERIAL_DELAY); +#ifndef SERIAL_USE_MULTI_TRANSACTION + // wait for the target response + serial_input_with_pullup(); + _delay_us(SLAVE_INT_RESPONSE_TIME); - // check if the slave is present + // check if the target is present if (serial_read_pin()) { - // slave failed to pull the line low, assume not present + // target failed to pull the line low, assume not present + serial_output(); + serial_high(); + *trans->status = TRANSACTION_NO_RESPONSE; sei(); - return 1; + return TRANSACTION_NO_RESPONSE; } - // if the slave is present syncronize with it - sync_recv(); +#else + // send transaction table index + int tid = (sstd_index<<3) | (7 & nibble_bits_count(sstd_index)); + sync_send(); + _delay_sub_us(TID_SEND_ADJUST); + serial_write_chunk(tid, 7); + serial_delay_half1(); - uint8_t checksum_computed = 0; - // receive data from the slave - for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) { - serial_slave_buffer[i] = serial_read_byte(); - sync_recv(); - checksum_computed += serial_slave_buffer[i]; - } - uint8_t checksum_received = serial_read_byte(); - sync_recv(); - - if (checksum_computed != checksum_received) { - sei(); - return 1; + // wait for the target response (step1 low->high) + serial_input_with_pullup(); + while( !serial_read_pin() ) { + _delay_sub_us(2); } - uint8_t checksum = 0; - // send data to the slave - for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) { - serial_write_byte(serial_master_buffer[i]); - sync_recv(); - checksum += serial_master_buffer[i]; + // check if the target is present (step2 high->low) + for( int i = 0; serial_read_pin(); i++ ) { + if (i > SLAVE_INT_ACK_WIDTH + 1) { + // slave failed to pull the line low, assume not present + serial_output(); + serial_high(); + *trans->status = TRANSACTION_NO_RESPONSE; + sei(); + return TRANSACTION_NO_RESPONSE; + } + _delay_sub_us(SLAVE_INT_ACK_WIDTH_UNIT); + } +#endif + + // initiator recive phase + // if the target is present syncronize with it + if( trans->target2initiator_buffer_size > 0 ) { + if (!serial_recive_packet((uint8_t *)trans->target2initiator_buffer, + trans->target2initiator_buffer_size) ) { + serial_output(); + serial_high(); + *trans->status = TRANSACTION_DATA_ERROR; + sei(); + return TRANSACTION_DATA_ERROR; + } + } + + // initiator switch to output + change_reciver2sender(); + + // initiator send phase + if( trans->initiator2target_buffer_size > 0 ) { + serial_send_packet((uint8_t *)trans->initiator2target_buffer, + trans->initiator2target_buffer_size); } - serial_write_byte(checksum); - sync_recv(); // always, release the line when not in use - serial_output(); - serial_high(); + sync_send(); + *trans->status = TRANSACTION_END; sei(); - return 0; + return TRANSACTION_END; } -#endif /* SOFT_SERIAL_PIN */ +#ifdef SERIAL_USE_MULTI_TRANSACTION +int soft_serial_get_and_clean_status(int sstd_index) { + SSTD_t *trans = &Transaction_table[sstd_index]; + cli(); + int retval = *trans->status; + *trans->status = 0;; + sei(); + return retval; +} +#endif + +#endif + +// Helix serial.c history +// 2018-1-29 fork from let's split and add PD2, modify sync_recv() (#2308, bceffdefc) +// 2018-6-28 bug fix master to slave comm and speed up (#3255, 1038bbef4) +// (adjusted with avr-gcc 4.9.2) +// 2018-7-13 remove USE_SERIAL_PD2 macro (#3374, f30d6dd78) +// (adjusted with avr-gcc 4.9.2) +// 2018-8-11 add support multi-type transaction (#3608, feb5e4aae) +// (adjusted with avr-gcc 4.9.2) +// 2018-10-21 fix serial and RGB animation conflict (#4191, 4665e4fff) +// (adjusted with avr-gcc 7.3.0) +// 2018-10-28 re-adjust compiler depend value of delay (#4269, 8517f8a66) +// (adjusted with avr-gcc 5.4.0, 7.3.0) +// 2018-12-17 copy to TOP/quantum/split_common/ and remove backward compatibility code (#4669) diff --git a/quantum/split_common/serial.h b/quantum/split_common/serial.h index 0b99f352d..b6638b3bd 100644 --- a/quantum/split_common/serial.h +++ b/quantum/split_common/serial.h @@ -1,5 +1,5 @@ -#ifndef MY_SERIAL_H -#define MY_SERIAL_H +#ifndef SOFT_SERIAL_H +#define SOFT_SERIAL_H #include @@ -7,20 +7,59 @@ // Need Soft Serial defines in config.h // ///////////////////////////////////////////////////////////////// // ex. -// /* Configuration of lower interface with the lower layer(hardware) of serial.c */ // #define SOFT_SERIAL_PIN ?? // ?? = D0,D1,D2,D3,E6 +// OPTIONAL: #define SELECT_SOFT_SERIAL_SPEED ? // ? = 1,2,3,4,5 +// // 1: about 137kbps (default) +// // 2: about 75kbps +// // 3: about 39kbps +// // 4: about 26kbps +// // 5: about 20kbps // -// /* Configuration of upper interface with the upper layer of serial.c */ -// #define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 -// #define SERIAL_MASTER_BUFFER_LENGTH 1 +// //// USE simple API (using signle-type transaction function) +// /* nothing */ +// //// USE flexible API (using multi-type transaction function) +// #define SERIAL_USE_MULTI_TRANSACTION +// +// ///////////////////////////////////////////////////////////////// -// Buffers for master - slave communication -extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH]; -extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH]; +// Soft Serial Transaction Descriptor +typedef struct _SSTD_t { + uint8_t *status; + uint8_t initiator2target_buffer_size; + uint8_t *initiator2target_buffer; + uint8_t target2initiator_buffer_size; + uint8_t *target2initiator_buffer; +} SSTD_t; +#define TID_LIMIT( table ) (sizeof(table) / sizeof(SSTD_t)) -void serial_master_init(void); -void serial_slave_init(void); -int serial_update_buffers(void); -bool serial_slave_data_corrupt(void); +// initiator is transaction start side +void soft_serial_initiator_init(SSTD_t *sstd_table, int sstd_table_size); +// target is interrupt accept side +void soft_serial_target_init(SSTD_t *sstd_table, int sstd_table_size); +// initiator resullt +#define TRANSACTION_END 0 +#define TRANSACTION_NO_RESPONSE 0x1 +#define TRANSACTION_DATA_ERROR 0x2 +#define TRANSACTION_TYPE_ERROR 0x4 +#ifndef SERIAL_USE_MULTI_TRANSACTION +int soft_serial_transaction(void); +#else +int soft_serial_transaction(int sstd_index); #endif + +// target status +// *SSTD_t.status has +// initiator: +// TRANSACTION_END +// or TRANSACTION_NO_RESPONSE +// or TRANSACTION_DATA_ERROR +// target: +// TRANSACTION_DATA_ERROR +// or TRANSACTION_ACCEPTED +#define TRANSACTION_ACCEPTED 0x8 +#ifdef SERIAL_USE_MULTI_TRANSACTION +int soft_serial_get_and_clean_status(int sstd_index); +#endif + +#endif /* SOFT_SERIAL_H */ diff --git a/quantum/split_common/serial_backward_compatibility.h b/quantum/split_common/serial_backward_compatibility.h deleted file mode 100644 index 216b6c41f..000000000 --- a/quantum/split_common/serial_backward_compatibility.h +++ /dev/null @@ -1,11 +0,0 @@ -/* serial.h backward compatibility */ - -// #ifndef SOFT_SERIAL_PIN -// #define SOFT_SERIAL_PIN D0 -// #endif - -#ifndef SERIAL_SLAVE_BUFFER_LENGTH - #define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 - #define SERIAL_MASTER_BUFFER_LENGTH 1 -#endif - diff --git a/quantum/split_common/split_util.c b/quantum/split_common/split_util.c index 56077e4f2..e4475c535 100644 --- a/quantum/split_common/split_util.c +++ b/quantum/split_common/split_util.c @@ -11,9 +11,6 @@ #include "timer.h" #include "split_flags.h" -#ifdef RGBLIGHT_ENABLE -# include "rgblight.h" -#endif #ifdef BACKLIGHT_ENABLE # include "backlight.h" #endif @@ -24,8 +21,6 @@ #if defined(USE_I2C) || defined(EH) # include "i2c.h" -#else -# include "serial.h" #endif volatile bool isLeftHand = true; @@ -112,7 +107,7 @@ void keyboard_slave_loop(void) { BACKLIT_DIRTY = false; } #else // USE_SERIAL - backlight_set(serial_master_buffer[SERIAL_BACKLIT_START]); + backlight_set(serial_m2s_buffer.backlight_level); #endif #endif // Read RGB Info @@ -137,7 +132,9 @@ void keyboard_slave_loop(void) { sei(); } #else // USE_SERIAL + #ifdef RGBLIGHT_SPLIT // Add serial implementation for RGB here + #endif #endif #endif } diff --git a/quantum/split_common/split_util.h b/quantum/split_common/split_util.h index 45e8db0f2..d6cf3e72a 100644 --- a/quantum/split_common/split_util.h +++ b/quantum/split_common/split_util.h @@ -7,9 +7,6 @@ #include #include "eeconfig.h" -// backlight level store index in serial_master_buffer[] for slave to read -#define SERIAL_BACKLIT_START 0x00 - #define SLAVE_I2C_ADDRESS 0x32 extern volatile bool isLeftHand; From 41dee98ec4d621c04541628bda70f06e703eab34 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Mon, 24 Dec 2018 14:27:35 -0800 Subject: [PATCH 750/788] Redox: Configurator bugfix (#4721) --- keyboards/redox/info.json | 87 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 86 insertions(+), 1 deletion(-) diff --git a/keyboards/redox/info.json b/keyboards/redox/info.json index f75d88a6b..f91017365 100644 --- a/keyboards/redox/info.json +++ b/keyboards/redox/info.json @@ -6,7 +6,92 @@ "height": 6.25, "layouts": { "LAYOUT": { - "layout": [{"label":"[L2] `", "x":0, "y":0.375, "w":1.25}, {"label":"!", "x":1.25, "y":0.375}, {"label":"@", "x":2.25, "y":0.125}, {"label":"#", "x":3.25, "y":0}, {"label":"$", "x":4.25, "y":0.125}, {"label":"%", "x":5.25, "y":0.25}, {"label":"[L1]", "x":6.25, "y":0.75}, {"label":"[L1]", "x":11.25, "y":0.75}, {"label":"^", "x":12.25, "y":0.25}, {"label":"&", "x":13.25, "y":0.125}, {"label":"*", "x":14.25, "y":0}, {"label":"(", "x":15.25, "y":0.125}, {"label":")", "x":16.25, "y":0.375}, {"label":"[L2] -", "x":17.25, "y":0.375, "w":1.25}, {"label":"Tab", "x":0, "y":1.375, "w":1.25}, {"label":"Q", "x":1.25, "y":1.375}, {"label":"W", "x":2.25, "y":1.125}, {"label":"E", "x":3.25, "y":1}, {"label":"R", "x":4.25, "y":1.125}, {"label":"T", "x":5.25, "y":1.25}, {"label":"[", "x":6.25, "y":1.75, "h":1.5}, {"label":"]", "x":11.25, "y":1.75, "h":1.5}, {"label":"Y", "x":12.25, "y":1.25}, {"label":"U", "x":13.25, "y":1.125}, {"label":"I", "x":14.25, "y":1}, {"label":"O", "x":15.25, "y":1.125}, {"label":"P", "x":16.25, "y":1.375}, {"label":"=", "x":17.25, "y":1.375, "w":1.25}, {"label":"Esc", "x":0, "y":2.375, "w":1.25}, {"label":"A", "x":1.25, "y":2.375}, {"label":"S", "x":2.25, "y":2.125}, {"label":"D", "x":3.25, "y":2}, {"label":"F", "x":4.25, "y":2.125}, {"label":"G", "x":5.25, "y":2.25}, {"label":"PgUp", "x":6.75, "y":3.75}, {"label":"End", "x":10.75, "y":3.75}, {"label":"H", "x":12.25, "y":2.25}, {"label":"J", "x":13.25, "y":2.125}, {"label":"K", "x":14.25, "y":2}, {"label":"L", "x":15.25, "y":2.125}, {"label":":", "x":16.25, "y":2.375}, {"label":"'", "x":17.25, "y":2.375, "w":1.25}, {"label":"Shift", "x":0, "y":3.375, "w":1.25}, {"label":"Z", "x":1.25, "y":3.375}, {"label":"X", "x":2.25, "y":3.125}, {"label":"C", "x":3.25, "y":3}, {"label":"V", "x":4.25, "y":3.125}, {"label":"B", "x":5.25, "y":3.25}, {"label":"PgDn", "x":7.75, "y":3.75}, {"label":"Home", "x":9.75, "y":3.75}, {"label":"N", "x":12.25, "y":3.25}, {"label":"M", "x":13.25, "y":3.125}, {"label":"<", "x":14.25, "y":3}, {"label":">", "x":15.25, "y":3.125}, {"label":"?", "x":16.25, "y":3.375}, {"label":"Shift", "x":17.25, "y":3.375, "w":1.25}, {"label":"GUI", "x":0.25, "y":4.375}, {"label":"+", "x":1.25, "y":4.375}, {"label":"-", "x":2.25, "y":4.125}, {"label":"[Alt] *", "x":3.25, "y":4}, {"label":"[Ctrl] /", "x":5.5, "y":5.25, "w":1.25}, {"label":"Backspace", "x":6.75, "y":4.75, "h":1.5}, {"label":"Del", "x":7.75, "y":4.75, "h":1.5}, {"label":"Enter", "x":9.75, "y":4.75, "h":1.5}, {"label":"Space", "x":10.75, "y":4.75, "h":1.5}, {"label":"Alt", "x":11.75, "y":5.25, "w":1.25}, {"label":"Left", "x":14.25, "y":4}, {"label":"Down", "x":15.25, "y":4.125}, {"label":"Up", "x":16.25, "y":4.375}, {"label":"Right", "x":17.25, "y":4.375}] + "layout": [ + {"label":"_Nav || `", "x":0, "y":0.375, "w":1.25}, + {"label":"1", "x":1.25, "y":0.375}, + {"label":"2", "x":2.25, "y":0.125}, + {"label":"3", "x":3.25, "y":0}, + {"label":"4", "x":4.25, "y":0.125}, + {"label":"5", "x":5.25, "y":0.25}, + + {"label":"6", "x":12.25, "y":0.25}, + {"label":"7", "x":13.25, "y":0.125}, + {"label":"8", "x":14.25, "y":0}, + {"label":"9", "x":15.25, "y":0.125}, + {"label":"0", "x":16.25, "y":0.375}, + {"label":"_Nav || -", "x":17.25, "y":0.375, "w":1.25}, + + {"label":"Tab", "x":0, "y":1.375, "w":1.25}, + {"label":"Q", "x":1.25, "y":1.375}, + {"label":"W", "x":2.25, "y":1.125}, + {"label":"E", "x":3.25, "y":1}, + {"label":"R", "x":4.25, "y":1.125}, + {"label":"T", "x":5.25, "y":1.25}, + {"label":"MO(_SYMB)", "x":6.25, "y":0.75}, + + {"label":"MO(_SYMB)", "x":11.25, "y":0.75}, + {"label":"Y", "x":12.25, "y":1.25}, + {"label":"U", "x":13.25, "y":1.125}, + {"label":"I", "x":14.25, "y":1}, + {"label":"O", "x":15.25, "y":1.125}, + {"label":"P", "x":16.25, "y":1.375}, + {"label":"=", "x":17.25, "y":1.375, "w":1.25}, + + {"label":"Esc", "x":0, "y":2.375, "w":1.25}, + {"label":"A", "x":1.25, "y":2.375}, + {"label":"S", "x":2.25, "y":2.125}, + {"label":"D", "x":3.25, "y":2}, + {"label":"F", "x":4.25, "y":2.125}, + {"label":"G", "x":5.25, "y":2.25}, + {"label":"[", "x":6.25, "y":1.75, "h":1.5}, + + {"label":"]", "x":11.25, "y":1.75, "h":1.5}, + {"label":"H", "x":12.25, "y":2.25}, + {"label":"J", "x":13.25, "y":2.125}, + {"label":"K", "x":14.25, "y":2}, + {"label":"L", "x":15.25, "y":2.125}, + {"label":";", "x":16.25, "y":2.375}, + {"label":"'", "x":17.25, "y":2.375, "w":1.25}, + + {"label":"Shift", "x":0, "y":3.375, "w":1.25}, + {"label":"Z", "x":1.25, "y":3.375}, + {"label":"X", "x":2.25, "y":3.125}, + {"label":"C", "x":3.25, "y":3}, + {"label":"V", "x":4.25, "y":3.125}, + {"label":"B", "x":5.25, "y":3.25}, + + {"label":"_Adjust/Page Up", "x":6.75, "y":3.75}, + {"label":"Page Down", "x":7.75, "y":3.75}, + + {"label":"Home", "x":9.75, "y":3.75}, + {"label":"_Adjust/End", "x":10.75, "y":3.75}, + + {"label":"N", "x":12.25, "y":3.25}, + {"label":"M", "x":13.25, "y":3.125}, + {"label":",", "x":14.25, "y":3}, + {"label":",", "x":15.25, "y":3.125}, + {"label":"\\", "x":16.25, "y":3.375}, + {"label":"Shift", "x":17.25, "y":3.375, "w":1.25}, + + {"label":"LGUI", "x":0.25, "y":4.375}, + {"label":"P+", "x":1.25, "y":4.375}, + {"label":"P-", "x":2.25, "y":4.125}, + {"label":"LAlt || P*", "x":3.25, "y":4}, + + {"label":"LCtrl || P/", "x":5.5, "y":5.25, "w":1.25}, + {"label":"Backspace", "x":6.75, "y":4.75, "h":1.5}, + {"label":"Delete", "x":7.75, "y":4.75, "h":1.5}, + + {"label":"Enter", "x":9.75, "y":4.75, "h":1.5}, + {"label":"Space", "x":10.75, "y":4.75, "h":1.5}, + {"label":"RAlt", "x":11.75, "y":5.25, "w":1.25}, + + {"label":"Left", "x":14.25, "y":4}, + {"label":"Down", "x":15.25, "y":4.125}, + {"label":"Up", "x":16.25, "y":4.375}, + {"label":"Right", "x":17.25, "y":4.375} + ] } } } + From 08e9fc142c89e783fdad3ecda0639bdf5c2e4c50 Mon Sep 17 00:00:00 2001 From: Jason Thigpen Date: Mon, 24 Dec 2018 14:49:03 -0800 Subject: [PATCH 751/788] Add tsangan layout to dz60 with a "sane" default keymap (#4717) --- keyboards/dz60/dz60.h | 27 ++++++++++++++++++ keyboards/dz60/info.json | 4 +++ keyboards/dz60/keymaps/60_tsangan/keymap.c | 32 ++++++++++++++++++++++ 3 files changed, 63 insertions(+) create mode 100644 keyboards/dz60/keymaps/60_tsangan/keymap.c diff --git a/keyboards/dz60/dz60.h b/keyboards/dz60/dz60.h index 50e80bed8..202bd1db4 100644 --- a/keyboards/dz60/dz60.h +++ b/keyboards/dz60/dz60.h @@ -332,6 +332,33 @@ { k40, k41, KC_NO, k43, k44, KC_NO, k46, KC_NO, k48, KC_NO, k4a, k4b, k4c, k4d, k4e } \ } +/* LAYOUT_60_tsangan + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ + * │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0a │0b │0c │ 0e │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ + * │10 │12 │13 │14 │15 │16 │17 │18 │19 │1a │1b │1c │1d │1e │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ + * │20 │22 │23 │24 │25 │26 │27 │28 │29 │2a │2b │2c │2d │ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ + * │30 │32 │33 │34 │35 │36 │37 │38 │39 │3a │3b │3d │3e │ + * ├─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬───┬─┴───┤ + * │40 │41 │43 │46 (7u) │4b │4d │4e │ + * └─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘ +*/ +#define LAYOUT_60_tsangan( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0e, \ + k10, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, \ + k20, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, \ + k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3d, k3e, \ + k40, k41, k43, k46, k4b, k4d, k4e \ +) { \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, KC_NO, k0e }, \ + { k10, KC_NO, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e }, \ + { k20, KC_NO, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, KC_NO }, \ + { k30, KC_NO, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, KC_NO, k3d, k3e }, \ + { k40, k41, KC_NO, k43, KC_NO, KC_NO, k46, KC_NO, KC_NO, KC_NO, KC_NO, k4b, KC_NO, k4d, k4e } \ +} + /* LAYOUT_60_tsangan_hhkb * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ * │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0a │0b │0c │0d │0e │ diff --git a/keyboards/dz60/info.json b/keyboards/dz60/info.json index d1139fd1f..6a3023496 100644 --- a/keyboards/dz60/info.json +++ b/keyboards/dz60/info.json @@ -53,6 +53,10 @@ "key_count": 67, "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"1", "x":1, "y":0}, {"label":"2", "x":2, "y":0}, {"label":"3", "x":3, "y":0}, {"label":"4", "x":4, "y":0}, {"label":"5", "x":5, "y":0}, {"label":"6", "x":6, "y":0}, {"label":"7", "x":7, "y":0}, {"label":"8", "x":8, "y":0}, {"label":"9", "x":9, "y":0}, {"label":"0", "x":10, "y":0}, {"label":"-", "x":11, "y":0}, {"label":"=", "x":12, "y":0}, {"x":13, "y":0}, {"label":"Back Space", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"[", "x":11.5, "y":1}, {"label":"]", "x":12.5, "y":1}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":";", "x":10.75, "y":2}, {"label":"'", "x":11.75, "y":2}, {"label":"#", "x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"label":"\\", "x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":",", "x":9.25, "y":3}, {"label":".", "x":10.25, "y":3}, {"label":"Shift", "x":11.25, "y":3, "w":1.75}, {"label":"Up", "x":13, "y":3}, {"label":"Del", "x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"GUI", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"label":"Space", "x":3.75, "y":4, "w":2.25}, {"label":"Space", "x":6, "y":4, "w":1.25}, {"label":"Space", "x":7.25, "y":4, "w":2.75}, {"label":"AltGr", "x":10, "y":4}, {"label":"Fn", "x":11, "y":4}, {"label":"Left", "x":12, "y":4}, {"label":"Down", "x":13, "y":4}, {"label":"Right", "x":14, "y":4}] }, + "LAYOUT_60_tsangan": { + "keycount": 61, + "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"label":"Fn", "x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.5}, {"label":"Win", "x":1.5, "y":4}, {"label":"Alt", "x":2.5, "y":4, "w":1.5}, {"x":4, "y":4, "w":7}, {"label":"Alt", "x":11, "y":4, "w":1.5}, {"label":"Win", "x":12.5, "y":4}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}] + }, "LAYOUT_60_tsangan_hhkb": { "key_count": 62, "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"|", "x":13, "y":0}, {"label":"~", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"Backspace", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"label":"Fn", "x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.5}, {"label":"Win", "x":1.5, "y":4}, {"label":"Alt", "x":2.5, "y":4, "w":1.5}, {"x":4, "y":4, "w":7}, {"label":"Win", "x":11, "y":4, "w":1.5}, {"label":"Menu", "x":12.5, "y":4}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}] diff --git a/keyboards/dz60/keymaps/60_tsangan/keymap.c b/keyboards/dz60/keymaps/60_tsangan/keymap.c new file mode 100644 index 000000000..dfbc51dd9 --- /dev/null +++ b/keyboards/dz60/keymaps/60_tsangan/keymap.c @@ -0,0 +1,32 @@ +#include QMK_KEYBOARD_H + +enum keyboard_layers { + _BL = 0, // Base Layer + _FL, // Function Layer + _CL // Control Layer +}; + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BL] = LAYOUT_60_tsangan( + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(_FL), + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL + ), + [_FL] = LAYOUT_60_tsangan( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, + _______, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUS, RESET, + _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, KC_INS, KC_HOME, KC_PGUP, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_END, KC_PGDN, _______, _______, + _______, _______, _______, _______, _______, MO(_CL), _______ + ), + [_CL] = LAYOUT_60_tsangan( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, BL_DEC, BL_TOGG, BL_INC, BL_STEP, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______ + ) +}; From de78d9e1ffbeff34991413641c794a36e9fc5f9d Mon Sep 17 00:00:00 2001 From: TerryMathews Date: Tue, 25 Dec 2018 13:42:48 -0500 Subject: [PATCH 752/788] Chibios_test/stm32_f072_onekey: Add support for reset to bootloader (#4238) * Add support for reset to bootloader Chibios_test/STM32_F072_ONEKEY wouldn't reset to bootloader on a compatible Discovery board because the Chibios library board file was lacking the __early_init(void) function necessary to read the magic key. Borrowed code from Clueboard 60, tested working. * Remove board.chcfg --- .../boards/ST_STM32F072B_DISCOVERY/board.c | 111 +++ .../boards/ST_STM32F072B_DISCOVERY/board.h | 923 ++++++++++++++++++ .../boards/ST_STM32F072B_DISCOVERY/board.mk | 5 + 3 files changed, 1039 insertions(+) create mode 100644 keyboards/chibios_test/boards/ST_STM32F072B_DISCOVERY/board.c create mode 100644 keyboards/chibios_test/boards/ST_STM32F072B_DISCOVERY/board.h create mode 100644 keyboards/chibios_test/boards/ST_STM32F072B_DISCOVERY/board.mk diff --git a/keyboards/chibios_test/boards/ST_STM32F072B_DISCOVERY/board.c b/keyboards/chibios_test/boards/ST_STM32F072B_DISCOVERY/board.c new file mode 100644 index 000000000..7e9f90853 --- /dev/null +++ b/keyboards/chibios_test/boards/ST_STM32F072B_DISCOVERY/board.c @@ -0,0 +1,111 @@ +/* + ChibiOS - Copyright (C) 2006..2016 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. +*/ + +/* + * This file has been automatically generated using ChibiStudio board + * generator plugin. Do not edit manually. + */ + +#include "hal.h" + +#if HAL_USE_PAL || defined(__DOXYGEN__) +/** + * @brief PAL setup. + * @details Digital I/O ports static configuration as defined in @p board.h. + * This variable is used by the HAL when initializing the PAL driver. + */ +const PALConfig pal_default_config = { +#if STM32_HAS_GPIOA + {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, + VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, +#endif +#if STM32_HAS_GPIOB + {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, + VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, +#endif +#if STM32_HAS_GPIOC + {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, + VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, +#endif +#if STM32_HAS_GPIOD + {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, + VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, +#endif +#if STM32_HAS_GPIOE + {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, + VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, +#endif +#if STM32_HAS_GPIOF + {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, + VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH}, +#endif +#if STM32_HAS_GPIOG + {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, + VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH}, +#endif +#if STM32_HAS_GPIOH + {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, + VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH}, +#endif +#if STM32_HAS_GPIOI + {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, + VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH} +#endif +}; +#endif + +void enter_bootloader_mode_if_requested(void); + +/** + * @brief Early initialization code. + * @details This initialization must be performed just after stack setup + * and before any other initialization. + */ +void __early_init(void) { + enter_bootloader_mode_if_requested(); + stm32_clock_init(); +} + + + +#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) +/** + * @brief MMC_SPI card detection. + */ +bool mmc_lld_is_card_inserted(MMCDriver *mmcp) { + + (void)mmcp; + /* TODO: Fill the implementation.*/ + return true; +} + +/** + * @brief MMC_SPI card write protection detection. + */ +bool mmc_lld_is_write_protected(MMCDriver *mmcp) { + + (void)mmcp; + /* TODO: Fill the implementation.*/ + return false; +} +#endif + +/** + * @brief Board-specific initialization code. + * @todo Add your board-specific code, if any. + */ +void boardInit(void) { +} diff --git a/keyboards/chibios_test/boards/ST_STM32F072B_DISCOVERY/board.h b/keyboards/chibios_test/boards/ST_STM32F072B_DISCOVERY/board.h new file mode 100644 index 000000000..173f7b605 --- /dev/null +++ b/keyboards/chibios_test/boards/ST_STM32F072B_DISCOVERY/board.h @@ -0,0 +1,923 @@ +/* + ChibiOS - Copyright (C) 2006..2016 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. +*/ + +/* + * This file has been automatically generated using ChibiStudio board + * generator plugin. Do not edit manually. + */ + +#ifndef BOARD_H +#define BOARD_H + +/* + * Setup for ST STM32F072B-Discovery board. + */ + +/* + * Board identifier. + */ +#define BOARD_ST_STM32F072B_DISCOVERY +#define BOARD_NAME "ST STM32F072B-Discovery" + +/* + * Board oscillators-related settings. + * NOTE: LSE not fitted. + * NOTE: HSE not fitted. + */ +#if !defined(STM32_LSECLK) +#define STM32_LSECLK 0U +#endif + +#define STM32_LSEDRV (3U << 3U) + +#if !defined(STM32_HSECLK) +#define STM32_HSECLK 0U +#endif + +#define STM32_HSE_BYPASS + +/* + * MCU type as defined in the ST header. + */ +#define STM32F072xB + +/* + * IO pins assignments. + */ +#define GPIOA_BUTTON 0U +#define GPIOA_PIN1 1U +#define GPIOA_PIN2 2U +#define GPIOA_PIN3 3U +#define GPIOA_PIN4 4U +#define GPIOA_PIN5 5U +#define GPIOA_PIN6 6U +#define GPIOA_PIN7 7U +#define GPIOA_PIN8 8U +#define GPIOA_PIN9 9U +#define GPIOA_PIN10 10U +#define GPIOA_USB_DM 11U +#define GPIOA_USB_DP 12U +#define GPIOA_SWDIO 13U +#define GPIOA_SWCLK 14U +#define GPIOA_PIN15 15U + +#define GPIOB_PIN0 0U +#define GPIOB_PIN1 1U +#define GPIOB_PIN2 2U +#define GPIOB_PIN3 3U +#define GPIOB_PIN4 4U +#define GPIOB_PIN5 5U +#define GPIOB_PIN6 6U +#define GPIOB_PIN7 7U +#define GPIOB_PIN8 8U +#define GPIOB_PIN9 9U +#define GPIOB_PIN10 10U +#define GPIOB_PIN11 11U +#define GPIOB_PIN12 12U +#define GPIOB_SPI2_SCK 13U +#define GPIOB_SPI2_MISO 14U +#define GPIOB_SPI2_MOSI 15U + +#define GPIOC_MEMS_CS 0U +#define GPIOC_PIN1 1U +#define GPIOC_PIN2 2U +#define GPIOC_PIN3 3U +#define GPIOC_PIN4 4U +#define GPIOC_PIN5 5U +#define GPIOC_LED_RED 6U +#define GPIOC_LED_BLUE 7U +#define GPIOC_LED_ORANGE 8U +#define GPIOC_LED_GREEN 9U +#define GPIOC_PIN10 10U +#define GPIOC_PIN11 11U +#define GPIOC_PIN12 12U +#define GPIOC_PIN13 13U +#define GPIOC_OSC32_IN 14U +#define GPIOC_OSC32_OUT 15U + +#define GPIOD_PIN0 0U +#define GPIOD_PIN1 1U +#define GPIOD_PIN2 2U +#define GPIOD_PIN3 3U +#define GPIOD_PIN4 4U +#define GPIOD_PIN5 5U +#define GPIOD_PIN6 6U +#define GPIOD_PIN7 7U +#define GPIOD_PIN8 8U +#define GPIOD_PIN9 9U +#define GPIOD_PIN10 10U +#define GPIOD_PIN11 11U +#define GPIOD_PIN12 12U +#define GPIOD_PIN13 13U +#define GPIOD_PIN14 14U +#define GPIOD_PIN15 15U + +#define GPIOE_PIN0 0U +#define GPIOE_PIN1 1U +#define GPIOE_PIN2 2U +#define GPIOE_PIN3 3U +#define GPIOE_PIN4 4U +#define GPIOE_PIN5 5U +#define GPIOE_PIN6 6U +#define GPIOE_PIN7 7U +#define GPIOE_PIN8 8U +#define GPIOE_PIN9 9U +#define GPIOE_PIN10 10U +#define GPIOE_PIN11 11U +#define GPIOE_PIN12 12U +#define GPIOE_PIN13 13U +#define GPIOE_PIN14 14U +#define GPIOE_PIN15 15U + +#define GPIOF_OSC_IN 0U +#define GPIOF_OSC_OUT 1U +#define GPIOF_PIN2 2U +#define GPIOF_PIN3 3U +#define GPIOF_PIN4 4U +#define GPIOF_PIN5 5U +#define GPIOF_PIN6 6U +#define GPIOF_PIN7 7U +#define GPIOF_PIN8 8U +#define GPIOF_PIN9 9U +#define GPIOF_PIN10 10U +#define GPIOF_PIN11 11U +#define GPIOF_PIN12 12U +#define GPIOF_PIN13 13U +#define GPIOF_PIN14 14U +#define GPIOF_PIN15 15U + +/* + * IO lines assignments. + */ +#define LINE_BUTTON PAL_LINE(GPIOA, 0U) +#define LINE_USB_DM PAL_LINE(GPIOA, 11U) +#define LINE_USB_DP PAL_LINE(GPIOA, 12U) +#define LINE_SWDIO PAL_LINE(GPIOA, 13U) +#define LINE_SWCLK PAL_LINE(GPIOA, 14U) + +#define LINE_SPI2_SCK PAL_LINE(GPIOB, 13U) +#define LINE_SPI2_MISO PAL_LINE(GPIOB, 14U) +#define LINE_SPI2_MOSI PAL_LINE(GPIOB, 15U) + +#define LINE_MEMS_CS PAL_LINE(GPIOC, 0U) +#define LINE_LED_RED PAL_LINE(GPIOC, 6U) +#define LINE_LED_BLUE PAL_LINE(GPIOC, 7U) +#define LINE_LED_ORANGE PAL_LINE(GPIOC, 8U) +#define LINE_LED_GREEN PAL_LINE(GPIOC, 9U) +#define LINE_OSC32_IN PAL_LINE(GPIOC, 14U) +#define LINE_OSC32_OUT PAL_LINE(GPIOC, 15U) + + + +#define LINE_OSC_IN PAL_LINE(GPIOF, 0U) +#define LINE_OSC_OUT PAL_LINE(GPIOF, 1U) + +/* + * I/O ports initial setup, this configuration is established soon after reset + * in the initialization code. + * Please refer to the STM32 Reference Manual for details. + */ +#define PIN_MODE_INPUT(n) (0U << ((n) * 2U)) +#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U)) +#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U)) +#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U)) +#define PIN_ODR_LOW(n) (0U << (n)) +#define PIN_ODR_HIGH(n) (1U << (n)) +#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) +#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) +#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U)) +#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U)) +#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U)) +#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U)) +#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U)) +#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U)) +#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U)) +#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U)) + +/* + * GPIOA setup: + * + * PA0 - BUTTON (input floating). + * PA1 - PIN1 (input pullup). + * PA2 - PIN2 (input pullup). + * PA3 - PIN3 (input pullup). + * PA4 - PIN4 (input pullup). + * PA5 - PIN5 (input pullup). + * PA6 - PIN6 (input pullup). + * PA7 - PIN7 (input pullup). + * PA8 - PIN8 (input pullup). + * PA9 - PIN9 (input pullup). + * PA10 - PIN10 (input pullup). + * PA11 - USB_DM (input floating). + * PA12 - USB_DP (input floating). + * PA13 - SWDIO (alternate 0). + * PA14 - SWCLK (alternate 0). + * PA15 - PIN15 (input pullup). + */ +#define VAL_GPIOA_MODER (PIN_MODE_INPUT(GPIOA_BUTTON) | \ + PIN_MODE_INPUT(GPIOA_PIN1) | \ + PIN_MODE_INPUT(GPIOA_PIN2) | \ + PIN_MODE_INPUT(GPIOA_PIN3) | \ + PIN_MODE_INPUT(GPIOA_PIN4) | \ + PIN_MODE_INPUT(GPIOA_PIN5) | \ + PIN_MODE_INPUT(GPIOA_PIN6) | \ + PIN_MODE_INPUT(GPIOA_PIN7) | \ + PIN_MODE_INPUT(GPIOA_PIN8) | \ + PIN_MODE_INPUT(GPIOA_PIN9) | \ + PIN_MODE_INPUT(GPIOA_PIN10) | \ + PIN_MODE_INPUT(GPIOA_USB_DM) | \ + PIN_MODE_INPUT(GPIOA_USB_DP) | \ + PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \ + PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \ + PIN_MODE_INPUT(GPIOA_PIN15)) +#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_BUTTON) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOA_USB_DM) | \ + PIN_OTYPE_PUSHPULL(GPIOA_USB_DP) | \ + PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | \ + PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN15)) +#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOA_BUTTON) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN1) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN10) | \ + PIN_OSPEED_VERYLOW(GPIOA_USB_DM) | \ + PIN_OSPEED_VERYLOW(GPIOA_USB_DP) | \ + PIN_OSPEED_HIGH(GPIOA_SWDIO) | \ + PIN_OSPEED_HIGH(GPIOA_SWCLK) | \ + PIN_OSPEED_HIGH(GPIOA_PIN15)) +#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_BUTTON) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN10) | \ + PIN_PUPDR_FLOATING(GPIOA_USB_DM) | \ + PIN_PUPDR_FLOATING(GPIOA_USB_DP) | \ + PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \ + PIN_PUPDR_PULLDOWN(GPIOA_SWCLK) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN15)) +#define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_BUTTON) | \ + PIN_ODR_HIGH(GPIOA_PIN1) | \ + PIN_ODR_HIGH(GPIOA_PIN2) | \ + PIN_ODR_HIGH(GPIOA_PIN3) | \ + PIN_ODR_HIGH(GPIOA_PIN4) | \ + PIN_ODR_HIGH(GPIOA_PIN5) | \ + PIN_ODR_HIGH(GPIOA_PIN6) | \ + PIN_ODR_HIGH(GPIOA_PIN7) | \ + PIN_ODR_HIGH(GPIOA_PIN8) | \ + PIN_ODR_HIGH(GPIOA_PIN9) | \ + PIN_ODR_HIGH(GPIOA_PIN10) | \ + PIN_ODR_HIGH(GPIOA_USB_DM) | \ + PIN_ODR_HIGH(GPIOA_USB_DP) | \ + PIN_ODR_HIGH(GPIOA_SWDIO) | \ + PIN_ODR_HIGH(GPIOA_SWCLK) | \ + PIN_ODR_HIGH(GPIOA_PIN15)) +#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_BUTTON, 0U) | \ + PIN_AFIO_AF(GPIOA_PIN1, 0U) | \ + PIN_AFIO_AF(GPIOA_PIN2, 0U) | \ + PIN_AFIO_AF(GPIOA_PIN3, 0U) | \ + PIN_AFIO_AF(GPIOA_PIN4, 0U) | \ + PIN_AFIO_AF(GPIOA_PIN5, 0U) | \ + PIN_AFIO_AF(GPIOA_PIN6, 0U) | \ + PIN_AFIO_AF(GPIOA_PIN7, 0U)) +#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_PIN8, 0U) | \ + PIN_AFIO_AF(GPIOA_PIN9, 0U) | \ + PIN_AFIO_AF(GPIOA_PIN10, 0U) | \ + PIN_AFIO_AF(GPIOA_USB_DM, 0U) | \ + PIN_AFIO_AF(GPIOA_USB_DP, 0U) | \ + PIN_AFIO_AF(GPIOA_SWDIO, 0U) | \ + PIN_AFIO_AF(GPIOA_SWCLK, 0U) | \ + PIN_AFIO_AF(GPIOA_PIN15, 0U)) + +/* + * GPIOB setup: + * + * PB0 - PIN0 (input pullup). + * PB1 - PIN1 (input pullup). + * PB2 - PIN2 (input pullup). + * PB3 - PIN3 (input pullup). + * PB4 - PIN4 (input pullup). + * PB5 - PIN5 (input pullup). + * PB6 - PIN6 (input pullup). + * PB7 - PIN7 (input pullup). + * PB8 - PIN8 (input pullup). + * PB9 - PIN9 (input pullup). + * PB10 - PIN10 (input pullup). + * PB11 - PIN11 (input pullup). + * PB12 - PIN12 (input pullup). + * PB13 - SPI2_SCK (alternate 0). + * PB14 - SPI2_MISO (alternate 0). + * PB15 - SPI2_MOSI (alternate 0). + */ +#define VAL_GPIOB_MODER (PIN_MODE_INPUT(GPIOB_PIN0) | \ + PIN_MODE_INPUT(GPIOB_PIN1) | \ + PIN_MODE_INPUT(GPIOB_PIN2) | \ + PIN_MODE_INPUT(GPIOB_PIN3) | \ + PIN_MODE_INPUT(GPIOB_PIN4) | \ + PIN_MODE_INPUT(GPIOB_PIN5) | \ + PIN_MODE_INPUT(GPIOB_PIN6) | \ + PIN_MODE_INPUT(GPIOB_PIN7) | \ + PIN_MODE_INPUT(GPIOB_PIN8) | \ + PIN_MODE_INPUT(GPIOB_PIN9) | \ + PIN_MODE_INPUT(GPIOB_PIN10) | \ + PIN_MODE_INPUT(GPIOB_PIN11) | \ + PIN_MODE_INPUT(GPIOB_PIN12) | \ + PIN_MODE_ALTERNATE(GPIOB_SPI2_SCK) | \ + PIN_MODE_ALTERNATE(GPIOB_SPI2_MISO) | \ + PIN_MODE_ALTERNATE(GPIOB_SPI2_MOSI)) +#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOB_SPI2_SCK) | \ + PIN_OTYPE_PUSHPULL(GPIOB_SPI2_MISO) | \ + PIN_OTYPE_PUSHPULL(GPIOB_SPI2_MOSI)) +#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOB_PIN0) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN1) | \ + PIN_OSPEED_HIGH(GPIOB_PIN2) | \ + PIN_OSPEED_HIGH(GPIOB_PIN3) | \ + PIN_OSPEED_HIGH(GPIOB_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN10) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN11) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN12) | \ + PIN_OSPEED_VERYLOW(GPIOB_SPI2_SCK) | \ + PIN_OSPEED_VERYLOW(GPIOB_SPI2_MISO) | \ + PIN_OSPEED_VERYLOW(GPIOB_SPI2_MOSI)) +#define VAL_GPIOB_PUPDR (PIN_PUPDR_PULLUP(GPIOB_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN12) | \ + PIN_PUPDR_FLOATING(GPIOB_SPI2_SCK) | \ + PIN_PUPDR_FLOATING(GPIOB_SPI2_MISO) | \ + PIN_PUPDR_FLOATING(GPIOB_SPI2_MOSI)) +#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_PIN0) | \ + PIN_ODR_HIGH(GPIOB_PIN1) | \ + PIN_ODR_HIGH(GPIOB_PIN2) | \ + PIN_ODR_HIGH(GPIOB_PIN3) | \ + PIN_ODR_HIGH(GPIOB_PIN4) | \ + PIN_ODR_HIGH(GPIOB_PIN5) | \ + PIN_ODR_HIGH(GPIOB_PIN6) | \ + PIN_ODR_HIGH(GPIOB_PIN7) | \ + PIN_ODR_HIGH(GPIOB_PIN8) | \ + PIN_ODR_HIGH(GPIOB_PIN9) | \ + PIN_ODR_HIGH(GPIOB_PIN10) | \ + PIN_ODR_HIGH(GPIOB_PIN11) | \ + PIN_ODR_HIGH(GPIOB_PIN12) | \ + PIN_ODR_HIGH(GPIOB_SPI2_SCK) | \ + PIN_ODR_HIGH(GPIOB_SPI2_MISO) | \ + PIN_ODR_HIGH(GPIOB_SPI2_MOSI)) +#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN1, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN2, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN3, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN4, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN5, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN6, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN7, 0U)) +#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN9, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN10, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN11, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN12, 0U) | \ + PIN_AFIO_AF(GPIOB_SPI2_SCK, 0U) | \ + PIN_AFIO_AF(GPIOB_SPI2_MISO, 0U) | \ + PIN_AFIO_AF(GPIOB_SPI2_MOSI, 0U)) + +/* + * GPIOC setup: + * + * PC0 - MEMS_CS (output pushpull maximum). + * PC1 - PIN1 (input pullup). + * PC2 - PIN2 (input pullup). + * PC3 - PIN3 (input pullup). + * PC4 - PIN4 (input pullup). + * PC5 - PIN5 (input pullup). + * PC6 - LED_RED (output pushpull maximum). + * PC7 - LED_BLUE (output pushpull maximum). + * PC8 - LED_ORANGE (output pushpull maximum). + * PC9 - LED_GREEN (output pushpull maximum). + * PC10 - PIN10 (input pullup). + * PC11 - PIN11 (input pullup). + * PC12 - PIN12 (input pullup). + * PC13 - PIN13 (input pullup). + * PC14 - OSC32_IN (input floating). + * PC15 - OSC32_OUT (input floating). + */ +#define VAL_GPIOC_MODER (PIN_MODE_OUTPUT(GPIOC_MEMS_CS) | \ + PIN_MODE_INPUT(GPIOC_PIN1) | \ + PIN_MODE_INPUT(GPIOC_PIN2) | \ + PIN_MODE_INPUT(GPIOC_PIN3) | \ + PIN_MODE_INPUT(GPIOC_PIN4) | \ + PIN_MODE_INPUT(GPIOC_PIN5) | \ + PIN_MODE_OUTPUT(GPIOC_LED_RED) | \ + PIN_MODE_OUTPUT(GPIOC_LED_BLUE) | \ + PIN_MODE_OUTPUT(GPIOC_LED_ORANGE) | \ + PIN_MODE_OUTPUT(GPIOC_LED_GREEN) | \ + PIN_MODE_INPUT(GPIOC_PIN10) | \ + PIN_MODE_INPUT(GPIOC_PIN11) | \ + PIN_MODE_INPUT(GPIOC_PIN12) | \ + PIN_MODE_INPUT(GPIOC_PIN13) | \ + PIN_MODE_INPUT(GPIOC_OSC32_IN) | \ + PIN_MODE_INPUT(GPIOC_OSC32_OUT)) +#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_MEMS_CS) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOC_LED_RED) | \ + PIN_OTYPE_PUSHPULL(GPIOC_LED_BLUE) | \ + PIN_OTYPE_PUSHPULL(GPIOC_LED_ORANGE) | \ + PIN_OTYPE_PUSHPULL(GPIOC_LED_GREEN) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOC_OSC32_IN) | \ + PIN_OTYPE_PUSHPULL(GPIOC_OSC32_OUT)) +#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_HIGH(GPIOC_MEMS_CS) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN1) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN5) | \ + PIN_OSPEED_HIGH(GPIOC_LED_RED) | \ + PIN_OSPEED_HIGH(GPIOC_LED_BLUE) | \ + PIN_OSPEED_HIGH(GPIOC_LED_ORANGE) | \ + PIN_OSPEED_HIGH(GPIOC_LED_GREEN) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN10) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN11) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN12) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN13) | \ + PIN_OSPEED_HIGH(GPIOC_OSC32_IN) | \ + PIN_OSPEED_HIGH(GPIOC_OSC32_OUT)) +#define VAL_GPIOC_PUPDR (PIN_PUPDR_FLOATING(GPIOC_MEMS_CS) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN5) | \ + PIN_PUPDR_FLOATING(GPIOC_LED_RED) | \ + PIN_PUPDR_FLOATING(GPIOC_LED_BLUE) | \ + PIN_PUPDR_FLOATING(GPIOC_LED_ORANGE) | \ + PIN_PUPDR_FLOATING(GPIOC_LED_GREEN) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN13) | \ + PIN_PUPDR_FLOATING(GPIOC_OSC32_IN) | \ + PIN_PUPDR_FLOATING(GPIOC_OSC32_OUT)) +#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_MEMS_CS) | \ + PIN_ODR_HIGH(GPIOC_PIN1) | \ + PIN_ODR_HIGH(GPIOC_PIN2) | \ + PIN_ODR_HIGH(GPIOC_PIN3) | \ + PIN_ODR_HIGH(GPIOC_PIN4) | \ + PIN_ODR_HIGH(GPIOC_PIN5) | \ + PIN_ODR_LOW(GPIOC_LED_RED) | \ + PIN_ODR_LOW(GPIOC_LED_BLUE) | \ + PIN_ODR_LOW(GPIOC_LED_ORANGE) | \ + PIN_ODR_LOW(GPIOC_LED_GREEN) | \ + PIN_ODR_HIGH(GPIOC_PIN10) | \ + PIN_ODR_HIGH(GPIOC_PIN11) | \ + PIN_ODR_HIGH(GPIOC_PIN12) | \ + PIN_ODR_HIGH(GPIOC_PIN13) | \ + PIN_ODR_HIGH(GPIOC_OSC32_IN) | \ + PIN_ODR_HIGH(GPIOC_OSC32_OUT)) +#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_MEMS_CS, 0U) | \ + PIN_AFIO_AF(GPIOC_PIN1, 0U) | \ + PIN_AFIO_AF(GPIOC_PIN2, 0U) | \ + PIN_AFIO_AF(GPIOC_PIN3, 0U) | \ + PIN_AFIO_AF(GPIOC_PIN4, 0U) | \ + PIN_AFIO_AF(GPIOC_PIN5, 0U) | \ + PIN_AFIO_AF(GPIOC_LED_RED, 0U) | \ + PIN_AFIO_AF(GPIOC_LED_BLUE, 0U)) +#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_LED_ORANGE, 0U) | \ + PIN_AFIO_AF(GPIOC_LED_GREEN, 0U) | \ + PIN_AFIO_AF(GPIOC_PIN10, 0U) | \ + PIN_AFIO_AF(GPIOC_PIN11, 0U) | \ + PIN_AFIO_AF(GPIOC_PIN12, 0U) | \ + PIN_AFIO_AF(GPIOC_PIN13, 0U) | \ + PIN_AFIO_AF(GPIOC_OSC32_IN, 0U) | \ + PIN_AFIO_AF(GPIOC_OSC32_OUT, 0U)) + +/* + * GPIOD setup: + * + * PD0 - PIN0 (input pullup). + * PD1 - PIN1 (input pullup). + * PD2 - PIN2 (input pullup). + * PD3 - PIN3 (input pullup). + * PD4 - PIN4 (input pullup). + * PD5 - PIN5 (input pullup). + * PD6 - PIN6 (input pullup). + * PD7 - PIN7 (input pullup). + * PD8 - PIN8 (input pullup). + * PD9 - PIN9 (input pullup). + * PD10 - PIN10 (input pullup). + * PD11 - PIN11 (input pullup). + * PD12 - PIN12 (input pullup). + * PD13 - PIN13 (input pullup). + * PD14 - PIN14 (input pullup). + * PD15 - PIN15 (input pullup). + */ +#define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_PIN0) | \ + PIN_MODE_INPUT(GPIOD_PIN1) | \ + PIN_MODE_INPUT(GPIOD_PIN2) | \ + PIN_MODE_INPUT(GPIOD_PIN3) | \ + PIN_MODE_INPUT(GPIOD_PIN4) | \ + PIN_MODE_INPUT(GPIOD_PIN5) | \ + PIN_MODE_INPUT(GPIOD_PIN6) | \ + PIN_MODE_INPUT(GPIOD_PIN7) | \ + PIN_MODE_INPUT(GPIOD_PIN8) | \ + PIN_MODE_INPUT(GPIOD_PIN9) | \ + PIN_MODE_INPUT(GPIOD_PIN10) | \ + PIN_MODE_INPUT(GPIOD_PIN11) | \ + PIN_MODE_INPUT(GPIOD_PIN12) | \ + PIN_MODE_INPUT(GPIOD_PIN13) | \ + PIN_MODE_INPUT(GPIOD_PIN14) | \ + PIN_MODE_INPUT(GPIOD_PIN15)) +#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN15)) +#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOD_PIN0) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN1) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN10) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN11) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN12) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN13) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN14) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN15)) +#define VAL_GPIOD_PUPDR (PIN_PUPDR_PULLUP(GPIOD_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN15)) +#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \ + PIN_ODR_HIGH(GPIOD_PIN1) | \ + PIN_ODR_HIGH(GPIOD_PIN2) | \ + PIN_ODR_HIGH(GPIOD_PIN3) | \ + PIN_ODR_HIGH(GPIOD_PIN4) | \ + PIN_ODR_HIGH(GPIOD_PIN5) | \ + PIN_ODR_HIGH(GPIOD_PIN6) | \ + PIN_ODR_HIGH(GPIOD_PIN7) | \ + PIN_ODR_HIGH(GPIOD_PIN8) | \ + PIN_ODR_HIGH(GPIOD_PIN9) | \ + PIN_ODR_HIGH(GPIOD_PIN10) | \ + PIN_ODR_HIGH(GPIOD_PIN11) | \ + PIN_ODR_HIGH(GPIOD_PIN12) | \ + PIN_ODR_HIGH(GPIOD_PIN13) | \ + PIN_ODR_HIGH(GPIOD_PIN14) | \ + PIN_ODR_HIGH(GPIOD_PIN15)) +#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN1, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN2, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN3, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN4, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN5, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN6, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN7, 0U)) +#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN9, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN10, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN11, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN12, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN13, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN14, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN15, 0U)) + +/* + * GPIOE setup: + * + * PE0 - PIN0 (input pullup). + * PE1 - PIN1 (input pullup). + * PE2 - PIN2 (input pullup). + * PE3 - PIN3 (input pullup). + * PE4 - PIN4 (input pullup). + * PE5 - PIN5 (input pullup). + * PE6 - PIN6 (input pullup). + * PE7 - PIN7 (input pullup). + * PE8 - PIN8 (input pullup). + * PE9 - PIN9 (input pullup). + * PE10 - PIN10 (input pullup). + * PE11 - PIN11 (input pullup). + * PE12 - PIN12 (input pullup). + * PE13 - PIN13 (input pullup). + * PE14 - PIN14 (input pullup). + * PE15 - PIN15 (input pullup). + */ +#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_PIN0) | \ + PIN_MODE_INPUT(GPIOE_PIN1) | \ + PIN_MODE_INPUT(GPIOE_PIN2) | \ + PIN_MODE_INPUT(GPIOE_PIN3) | \ + PIN_MODE_INPUT(GPIOE_PIN4) | \ + PIN_MODE_INPUT(GPIOE_PIN5) | \ + PIN_MODE_INPUT(GPIOE_PIN6) | \ + PIN_MODE_INPUT(GPIOE_PIN7) | \ + PIN_MODE_INPUT(GPIOE_PIN8) | \ + PIN_MODE_INPUT(GPIOE_PIN9) | \ + PIN_MODE_INPUT(GPIOE_PIN10) | \ + PIN_MODE_INPUT(GPIOE_PIN11) | \ + PIN_MODE_INPUT(GPIOE_PIN12) | \ + PIN_MODE_INPUT(GPIOE_PIN13) | \ + PIN_MODE_INPUT(GPIOE_PIN14) | \ + PIN_MODE_INPUT(GPIOE_PIN15)) +#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN15)) +#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOE_PIN0) | \ + PIN_OSPEED_VERYLOW(GPIOE_PIN1) | \ + PIN_OSPEED_VERYLOW(GPIOE_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOE_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOE_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOE_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOE_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOE_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOE_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOE_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOE_PIN10) | \ + PIN_OSPEED_VERYLOW(GPIOE_PIN11) | \ + PIN_OSPEED_VERYLOW(GPIOE_PIN12) | \ + PIN_OSPEED_VERYLOW(GPIOE_PIN13) | \ + PIN_OSPEED_VERYLOW(GPIOE_PIN14) | \ + PIN_OSPEED_VERYLOW(GPIOE_PIN15)) +#define VAL_GPIOE_PUPDR (PIN_PUPDR_PULLUP(GPIOE_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN15)) +#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \ + PIN_ODR_HIGH(GPIOE_PIN1) | \ + PIN_ODR_HIGH(GPIOE_PIN2) | \ + PIN_ODR_HIGH(GPIOE_PIN3) | \ + PIN_ODR_HIGH(GPIOE_PIN4) | \ + PIN_ODR_HIGH(GPIOE_PIN5) | \ + PIN_ODR_HIGH(GPIOE_PIN6) | \ + PIN_ODR_HIGH(GPIOE_PIN7) | \ + PIN_ODR_HIGH(GPIOE_PIN8) | \ + PIN_ODR_HIGH(GPIOE_PIN9) | \ + PIN_ODR_HIGH(GPIOE_PIN10) | \ + PIN_ODR_HIGH(GPIOE_PIN11) | \ + PIN_ODR_HIGH(GPIOE_PIN12) | \ + PIN_ODR_HIGH(GPIOE_PIN13) | \ + PIN_ODR_HIGH(GPIOE_PIN14) | \ + PIN_ODR_HIGH(GPIOE_PIN15)) +#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN1, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN2, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN3, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN4, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN5, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN6, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN7, 0U)) +#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN9, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN10, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN11, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN12, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN13, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN14, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN15, 0U)) + +/* + * GPIOF setup: + * + * PF0 - OSC_IN (input floating). + * PF1 - OSC_OUT (input floating). + * PF2 - PIN2 (input pullup). + * PF3 - PIN3 (input pullup). + * PF4 - PIN4 (input pullup). + * PF5 - PIN5 (input pullup). + * PF6 - PIN6 (input pullup). + * PF7 - PIN7 (input pullup). + * PF8 - PIN8 (input pullup). + * PF9 - PIN9 (input pullup). + * PF10 - PIN10 (input pullup). + * PF11 - PIN11 (input pullup). + * PF12 - PIN12 (input pullup). + * PF13 - PIN13 (input pullup). + * PF14 - PIN14 (input pullup). + * PF15 - PIN15 (input pullup). + */ +#define VAL_GPIOF_MODER (PIN_MODE_INPUT(GPIOF_OSC_IN) | \ + PIN_MODE_INPUT(GPIOF_OSC_OUT) | \ + PIN_MODE_INPUT(GPIOF_PIN2) | \ + PIN_MODE_INPUT(GPIOF_PIN3) | \ + PIN_MODE_INPUT(GPIOF_PIN4) | \ + PIN_MODE_INPUT(GPIOF_PIN5) | \ + PIN_MODE_INPUT(GPIOF_PIN6) | \ + PIN_MODE_INPUT(GPIOF_PIN7) | \ + PIN_MODE_INPUT(GPIOF_PIN8) | \ + PIN_MODE_INPUT(GPIOF_PIN9) | \ + PIN_MODE_INPUT(GPIOF_PIN10) | \ + PIN_MODE_INPUT(GPIOF_PIN11) | \ + PIN_MODE_INPUT(GPIOF_PIN12) | \ + PIN_MODE_INPUT(GPIOF_PIN13) | \ + PIN_MODE_INPUT(GPIOF_PIN14) | \ + PIN_MODE_INPUT(GPIOF_PIN15)) +#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_OSC_IN) | \ + PIN_OTYPE_PUSHPULL(GPIOF_OSC_OUT) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN15)) +#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOF_OSC_IN) | \ + PIN_OSPEED_VERYLOW(GPIOF_OSC_OUT) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN10) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN11) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN12) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN13) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN14) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN15)) +#define VAL_GPIOF_PUPDR (PIN_PUPDR_FLOATING(GPIOF_OSC_IN) | \ + PIN_PUPDR_FLOATING(GPIOF_OSC_OUT) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN15)) +#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_OSC_IN) | \ + PIN_ODR_HIGH(GPIOF_OSC_OUT) | \ + PIN_ODR_HIGH(GPIOF_PIN2) | \ + PIN_ODR_HIGH(GPIOF_PIN3) | \ + PIN_ODR_HIGH(GPIOF_PIN4) | \ + PIN_ODR_HIGH(GPIOF_PIN5) | \ + PIN_ODR_HIGH(GPIOF_PIN6) | \ + PIN_ODR_HIGH(GPIOF_PIN7) | \ + PIN_ODR_HIGH(GPIOF_PIN8) | \ + PIN_ODR_HIGH(GPIOF_PIN9) | \ + PIN_ODR_HIGH(GPIOF_PIN10) | \ + PIN_ODR_HIGH(GPIOF_PIN11) | \ + PIN_ODR_HIGH(GPIOF_PIN12) | \ + PIN_ODR_HIGH(GPIOF_PIN13) | \ + PIN_ODR_HIGH(GPIOF_PIN14) | \ + PIN_ODR_HIGH(GPIOF_PIN15)) +#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_OSC_IN, 0U) | \ + PIN_AFIO_AF(GPIOF_OSC_OUT, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN2, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN3, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN4, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN5, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN6, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN7, 0U)) +#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN9, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN10, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN11, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN12, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN13, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN14, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN15, 0U)) + + +#if !defined(_FROM_ASM_) +#ifdef __cplusplus +extern "C" { +#endif + void boardInit(void); +#ifdef __cplusplus +} +#endif +#endif /* _FROM_ASM_ */ + +#endif /* BOARD_H */ diff --git a/keyboards/chibios_test/boards/ST_STM32F072B_DISCOVERY/board.mk b/keyboards/chibios_test/boards/ST_STM32F072B_DISCOVERY/board.mk new file mode 100644 index 000000000..b98dcdd26 --- /dev/null +++ b/keyboards/chibios_test/boards/ST_STM32F072B_DISCOVERY/board.mk @@ -0,0 +1,5 @@ +# List of all the board related files. +BOARDSRC = $(BOARD_PATH)/boards/ST_STM32F072B_DISCOVERY/board.c + +# Required include directories +BOARDINC = $(BOARD_PATH)/boards/ST_STM32F072B_DISCOVERY From 8e0444618fdf42301cce4467aea6de63bec3cfed Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Tue, 25 Dec 2018 11:24:47 -0800 Subject: [PATCH 753/788] XMMX refactor, Configurator support and readme update (#4722) * XMMX: matrix and keymap refactor - xmmx.h updated to use #pragma once - renamed LAYOUT_ansi_wk macro to LAYOUT_tkl_ansi - renamed LAYOUT_ansi_wkl macro to LAYOUT_tkl_ansi_wkl - renamed LAYOUT_iso_wk macro to LAYOUT_tkl_iso - renamed LAYOUT_iso_wkl macro to LAYOUT_tkl_iso_wkl * XMMX: Configurator support * XMMX: readme update --- keyboards/xmmx/info.json | 475 +++++++++++++++++++++++ keyboards/xmmx/keymaps/ansi_wk/keymap.c | 7 +- keyboards/xmmx/keymaps/ansi_wkl/keymap.c | 7 +- keyboards/xmmx/keymaps/default/keymap.c | 7 +- keyboards/xmmx/keymaps/iso_wk/keymap.c | 7 +- keyboards/xmmx/keymaps/iso_wkl/keymap.c | 7 +- keyboards/xmmx/readme.md | 10 +- keyboards/xmmx/xmmx.h | 12 +- 8 files changed, 505 insertions(+), 27 deletions(-) create mode 100644 keyboards/xmmx/info.json diff --git a/keyboards/xmmx/info.json b/keyboards/xmmx/info.json new file mode 100644 index 000000000..28bd06bbf --- /dev/null +++ b/keyboards/xmmx/info.json @@ -0,0 +1,475 @@ +{ + "keyboard_name": "XMMX", + "url": "", + "maintainer": "qmk", + "width": 18.25, + "height": 6.5, + "layouts": { + "LAYOUT_all": { + "key_count": 96, + "layout": [ + {"label":"Esc", "x":0, "y":0}, + {"label":"F1", "x":2, "y":0}, + {"label":"F2", "x":3, "y":0}, + {"label":"F3", "x":4, "y":0}, + {"label":"F4", "x":5, "y":0}, + {"label":"F5", "x":6.5, "y":0}, + {"label":"F6", "x":7.5, "y":0}, + {"label":"F7", "x":8.5, "y":0}, + {"label":"F8", "x":9.5, "y":0}, + {"label":"F9", "x":11, "y":0}, + {"label":"F10", "x":12, "y":0}, + {"label":"F11", "x":13, "y":0}, + {"label":"F12", "x":14, "y":0}, + {"label":"PrtSc", "x":15.25, "y":0}, + {"label":"Scroll Lock", "x":16.25, "y":0}, + {"label":"Pause", "x":17.25, "y":0}, + {"label":"~", "x":0, "y":1.5}, + {"label":"!", "x":1, "y":1.5}, + {"label":"@", "x":2, "y":1.5}, + {"label":"#", "x":3, "y":1.5}, + {"label":"$", "x":4, "y":1.5}, + {"label":"%", "x":5, "y":1.5}, + {"label":"^", "x":6, "y":1.5}, + {"label":"&", "x":7, "y":1.5}, + {"label":"*", "x":8, "y":1.5}, + {"label":"(", "x":9, "y":1.5}, + {"label":")", "x":10, "y":1.5}, + {"label":"_", "x":11, "y":1.5}, + {"label":"+", "x":12, "y":1.5}, + {"label":"Back Space", "x":13, "y":1.5}, + {"label":"Back Space", "x":14, "y":1.5}, + {"label":"Insert", "x":15.25, "y":1.5}, + {"label":"Home", "x":16.25, "y":1.5}, + {"label":"PgUp", "x":17.25, "y":1.5}, + {"label":"Tab", "x":0, "y":2.5, "w":1.5}, + {"label":"Q", "x":1.5, "y":2.5}, + {"label":"W", "x":2.5, "y":2.5}, + {"label":"E", "x":3.5, "y":2.5}, + {"label":"R", "x":4.5, "y":2.5}, + {"label":"T", "x":5.5, "y":2.5}, + {"label":"Y", "x":6.5, "y":2.5}, + {"label":"U", "x":7.5, "y":2.5}, + {"label":"I", "x":8.5, "y":2.5}, + {"label":"O", "x":9.5, "y":2.5}, + {"label":"P", "x":10.5, "y":2.5}, + {"label":"{", "x":11.5, "y":2.5}, + {"label":"}", "x":12.5, "y":2.5}, + {"label":"|", "x":13.5, "y":2.5, "w":1.5}, + {"label":"Delete", "x":15.25, "y":2.5}, + {"label":"End", "x":16.25, "y":2.5}, + {"label":"PgDn", "x":17.25, "y":2.5}, + {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75}, + {"label":"A", "x":1.75, "y":3.5}, + {"label":"S", "x":2.75, "y":3.5}, + {"label":"D", "x":3.75, "y":3.5}, + {"label":"F", "x":4.75, "y":3.5}, + {"label":"G", "x":5.75, "y":3.5}, + {"label":"H", "x":6.75, "y":3.5}, + {"label":"J", "x":7.75, "y":3.5}, + {"label":"K", "x":8.75, "y":3.5}, + {"label":"L", "x":9.75, "y":3.5}, + {"label":":", "x":10.75, "y":3.5}, + {"label":"\"", "x":11.75, "y":3.5}, + {"label":"~", "x":12.75, "y":3.5}, + {"label":"Enter", "x":13.75, "y":3.5, "w":1.25}, + {"x":15.25, "y":3.5}, + {"x":16.25, "y":3.5}, + {"x":17.25, "y":3.5}, + {"label":"Shift", "x":0, "y":4.5, "w":1.25}, + {"label":"|", "x":1.25, "y":4.5}, + {"label":"Z", "x":2.25, "y":4.5}, + {"label":"X", "x":3.25, "y":4.5}, + {"label":"C", "x":4.25, "y":4.5}, + {"label":"V", "x":5.25, "y":4.5}, + {"label":"B", "x":6.25, "y":4.5}, + {"label":"N", "x":7.25, "y":4.5}, + {"label":"M", "x":8.25, "y":4.5}, + {"label":"<", "x":9.25, "y":4.5}, + {"label":">", "x":10.25, "y":4.5}, + {"label":"?", "x":11.25, "y":4.5}, + {"label":"Shift", "x":12.25, "y":4.5, "w":1.75}, + {"label":"Fn", "x":14, "y":4.5}, + {"x":15.25, "y":4.5}, + {"label":"Up", "x":16.25, "y":4.5}, + {"x":17.25, "y":4.5}, + {"label":"Ctrl", "x":0, "y":5.5, "w":1.25}, + {"label":"Win", "x":1.25, "y":5.5, "w":1.25}, + {"label":"Alt", "x":2.5, "y":5.5, "w":1.25}, + {"label":"Space", "x":3.75, "y":5.5, "w":6.25}, + {"label":"Alt", "x":10, "y":5.5, "w":1.25}, + {"label":"Win", "x":11.25, "y":5.5, "w":1.25}, + {"label":"Menu", "x":12.5, "y":5.5, "w":1.25}, + {"label":"Ctrl", "x":13.75, "y":5.5, "w":1.25}, + {"label":"Left", "x":15.25, "y":5.5}, + {"label":"Down", "x":16.25, "y":5.5}, + {"label":"Right", "x":17.25, "y":5.5} + ] + }, + "LAYOUT_tkl_ansi": { + "key_count": 87, + "layout": [ + {"label":"Esc", "x":0, "y":0}, + {"label":"F1", "x":2, "y":0}, + {"label":"F2", "x":3, "y":0}, + {"label":"F3", "x":4, "y":0}, + {"label":"F4", "x":5, "y":0}, + {"label":"F5", "x":6.5, "y":0}, + {"label":"F6", "x":7.5, "y":0}, + {"label":"F7", "x":8.5, "y":0}, + {"label":"F8", "x":9.5, "y":0}, + {"label":"F9", "x":11, "y":0}, + {"label":"F10", "x":12, "y":0}, + {"label":"F11", "x":13, "y":0}, + {"label":"F12", "x":14, "y":0}, + {"label":"PrtSc", "x":15.25, "y":0}, + {"label":"Scroll Lock", "x":16.25, "y":0}, + {"label":"Pause", "x":17.25, "y":0}, + {"label":"~", "x":0, "y":1.5}, + {"label":"!", "x":1, "y":1.5}, + {"label":"@", "x":2, "y":1.5}, + {"label":"#", "x":3, "y":1.5}, + {"label":"$", "x":4, "y":1.5}, + {"label":"%", "x":5, "y":1.5}, + {"label":"^", "x":6, "y":1.5}, + {"label":"&", "x":7, "y":1.5}, + {"label":"*", "x":8, "y":1.5}, + {"label":"(", "x":9, "y":1.5}, + {"label":")", "x":10, "y":1.5}, + {"label":"_", "x":11, "y":1.5}, + {"label":"+", "x":12, "y":1.5}, + {"label":"Backspace", "x":13, "y":1.5, "w":2}, + {"label":"Insert", "x":15.25, "y":1.5}, + {"label":"Home", "x":16.25, "y":1.5}, + {"label":"PgUp", "x":17.25, "y":1.5}, + {"label":"Tab", "x":0, "y":2.5, "w":1.5}, + {"label":"Q", "x":1.5, "y":2.5}, + {"label":"W", "x":2.5, "y":2.5}, + {"label":"E", "x":3.5, "y":2.5}, + {"label":"R", "x":4.5, "y":2.5}, + {"label":"T", "x":5.5, "y":2.5}, + {"label":"Y", "x":6.5, "y":2.5}, + {"label":"U", "x":7.5, "y":2.5}, + {"label":"I", "x":8.5, "y":2.5}, + {"label":"O", "x":9.5, "y":2.5}, + {"label":"P", "x":10.5, "y":2.5}, + {"label":"{", "x":11.5, "y":2.5}, + {"label":"}", "x":12.5, "y":2.5}, + {"label":"|", "x":13.5, "y":2.5, "w":1.5}, + {"label":"Delete", "x":15.25, "y":2.5}, + {"label":"End", "x":16.25, "y":2.5}, + {"label":"PgDn", "x":17.25, "y":2.5}, + {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75}, + {"label":"A", "x":1.75, "y":3.5}, + {"label":"S", "x":2.75, "y":3.5}, + {"label":"D", "x":3.75, "y":3.5}, + {"label":"F", "x":4.75, "y":3.5}, + {"label":"G", "x":5.75, "y":3.5}, + {"label":"H", "x":6.75, "y":3.5}, + {"label":"J", "x":7.75, "y":3.5}, + {"label":"K", "x":8.75, "y":3.5}, + {"label":"L", "x":9.75, "y":3.5}, + {"label":":", "x":10.75, "y":3.5}, + {"label":"\"", "x":11.75, "y":3.5}, + {"label":"Enter", "x":12.75, "y":3.5, "w":2.25}, + {"label":"Shift", "x":0, "y":4.5, "w":2.25}, + {"label":"Z", "x":2.25, "y":4.5}, + {"label":"X", "x":3.25, "y":4.5}, + {"label":"C", "x":4.25, "y":4.5}, + {"label":"V", "x":5.25, "y":4.5}, + {"label":"B", "x":6.25, "y":4.5}, + {"label":"N", "x":7.25, "y":4.5}, + {"label":"M", "x":8.25, "y":4.5}, + {"label":"<", "x":9.25, "y":4.5}, + {"label":">", "x":10.25, "y":4.5}, + {"label":"?", "x":11.25, "y":4.5}, + {"label":"Shift", "x":12.25, "y":4.5, "w":2.75}, + {"label":"Up", "x":16.25, "y":4.5}, + {"label":"Ctrl", "x":0, "y":5.5, "w":1.25}, + {"label":"Win", "x":1.25, "y":5.5, "w":1.25}, + {"label":"Alt", "x":2.5, "y":5.5, "w":1.25}, + {"label":"Space", "x":3.75, "y":5.5, "w":6.25}, + {"label":"Alt", "x":10, "y":5.5, "w":1.25}, + {"label":"Win", "x":11.25, "y":5.5, "w":1.25}, + {"label":"Menu", "x":12.5, "y":5.5, "w":1.25}, + {"label":"Ctrl", "x":13.75, "y":5.5, "w":1.25}, + {"label":"Left", "x":15.25, "y":5.5}, + {"label":"Down", "x":16.25, "y":5.5}, + {"label":"Right", "x":17.25, "y":5.5} + ] + }, + "LAYOUT_tkl_ansi_wkl": { + "key_count": 84, + "layout": [ + {"label":"Esc", "x":0, "y":0}, + {"label":"F1", "x":2, "y":0}, + {"label":"F2", "x":3, "y":0}, + {"label":"F3", "x":4, "y":0}, + {"label":"F4", "x":5, "y":0}, + {"label":"F5", "x":6.5, "y":0}, + {"label":"F6", "x":7.5, "y":0}, + {"label":"F7", "x":8.5, "y":0}, + {"label":"F8", "x":9.5, "y":0}, + {"label":"F9", "x":11, "y":0}, + {"label":"F10", "x":12, "y":0}, + {"label":"F11", "x":13, "y":0}, + {"label":"F12", "x":14, "y":0}, + {"label":"PrtSc", "x":15.25, "y":0}, + {"label":"Scroll Lock", "x":16.25, "y":0}, + {"label":"Pause", "x":17.25, "y":0}, + {"label":"~", "x":0, "y":1.5}, + {"label":"!", "x":1, "y":1.5}, + {"label":"@", "x":2, "y":1.5}, + {"label":"#", "x":3, "y":1.5}, + {"label":"$", "x":4, "y":1.5}, + {"label":"%", "x":5, "y":1.5}, + {"label":"^", "x":6, "y":1.5}, + {"label":"&", "x":7, "y":1.5}, + {"label":"*", "x":8, "y":1.5}, + {"label":"(", "x":9, "y":1.5}, + {"label":")", "x":10, "y":1.5}, + {"label":"_", "x":11, "y":1.5}, + {"label":"+", "x":12, "y":1.5}, + {"label":"Backspace", "x":13, "y":1.5, "w":2}, + {"label":"Insert", "x":15.25, "y":1.5}, + {"label":"Home", "x":16.25, "y":1.5}, + {"label":"PgUp", "x":17.25, "y":1.5}, + {"label":"Tab", "x":0, "y":2.5, "w":1.5}, + {"label":"Q", "x":1.5, "y":2.5}, + {"label":"W", "x":2.5, "y":2.5}, + {"label":"E", "x":3.5, "y":2.5}, + {"label":"R", "x":4.5, "y":2.5}, + {"label":"T", "x":5.5, "y":2.5}, + {"label":"Y", "x":6.5, "y":2.5}, + {"label":"U", "x":7.5, "y":2.5}, + {"label":"I", "x":8.5, "y":2.5}, + {"label":"O", "x":9.5, "y":2.5}, + {"label":"P", "x":10.5, "y":2.5}, + {"label":"{", "x":11.5, "y":2.5}, + {"label":"}", "x":12.5, "y":2.5}, + {"label":"|", "x":13.5, "y":2.5, "w":1.5}, + {"label":"Delete", "x":15.25, "y":2.5}, + {"label":"End", "x":16.25, "y":2.5}, + {"label":"PgDn", "x":17.25, "y":2.5}, + {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75}, + {"label":"A", "x":1.75, "y":3.5}, + {"label":"S", "x":2.75, "y":3.5}, + {"label":"D", "x":3.75, "y":3.5}, + {"label":"F", "x":4.75, "y":3.5}, + {"label":"G", "x":5.75, "y":3.5}, + {"label":"H", "x":6.75, "y":3.5}, + {"label":"J", "x":7.75, "y":3.5}, + {"label":"K", "x":8.75, "y":3.5}, + {"label":"L", "x":9.75, "y":3.5}, + {"label":":", "x":10.75, "y":3.5}, + {"label":"\"", "x":11.75, "y":3.5}, + {"label":"Enter", "x":12.75, "y":3.5, "w":2.25}, + {"label":"Shift", "x":0, "y":4.5, "w":2.25}, + {"label":"Z", "x":2.25, "y":4.5}, + {"label":"X", "x":3.25, "y":4.5}, + {"label":"C", "x":4.25, "y":4.5}, + {"label":"V", "x":5.25, "y":4.5}, + {"label":"B", "x":6.25, "y":4.5}, + {"label":"N", "x":7.25, "y":4.5}, + {"label":"M", "x":8.25, "y":4.5}, + {"label":"<", "x":9.25, "y":4.5}, + {"label":">", "x":10.25, "y":4.5}, + {"label":"?", "x":11.25, "y":4.5}, + {"label":"Shift", "x":12.25, "y":4.5, "w":2.75}, + {"label":"Up", "x":16.25, "y":4.5}, + {"label":"Ctrl", "x":0, "y":5.5, "w":1.5}, + {"label":"Alt", "x":2.5, "y":5.5, "w":1.5}, + {"label":"Space", "x":4, "y":5.5, "w":7}, + {"label":"Alt", "x":11, "y":5.5, "w":1.5}, + {"label":"Ctrl", "x":13.5, "y":5.5, "w":1.5}, + {"label":"Left", "x":15.25, "y":5.5}, + {"label":"Down", "x":16.25, "y":5.5}, + {"label":"Right", "x":17.25, "y":5.5} + ] + }, + "LAYOUT_tkl_iso": { + "key_count": 88, + "layout": [ + {"label":"Esc", "x":0, "y":0}, + {"label":"F1", "x":2, "y":0}, + {"label":"F2", "x":3, "y":0}, + {"label":"F3", "x":4, "y":0}, + {"label":"F4", "x":5, "y":0}, + {"label":"F5", "x":6.5, "y":0}, + {"label":"F6", "x":7.5, "y":0}, + {"label":"F7", "x":8.5, "y":0}, + {"label":"F8", "x":9.5, "y":0}, + {"label":"F9", "x":11, "y":0}, + {"label":"F10", "x":12, "y":0}, + {"label":"F11", "x":13, "y":0}, + {"label":"F12", "x":14, "y":0}, + {"label":"PrtSc", "x":15.25, "y":0}, + {"label":"Scroll Lock", "x":16.25, "y":0}, + {"label":"Pause", "x":17.25, "y":0}, + {"label":"\u00ac", "x":0, "y":1.5}, + {"label":"!", "x":1, "y":1.5}, + {"label":"\"", "x":2, "y":1.5}, + {"label":"\u00a3", "x":3, "y":1.5}, + {"label":"$", "x":4, "y":1.5}, + {"label":"%", "x":5, "y":1.5}, + {"label":"^", "x":6, "y":1.5}, + {"label":"&", "x":7, "y":1.5}, + {"label":"*", "x":8, "y":1.5}, + {"label":"(", "x":9, "y":1.5}, + {"label":")", "x":10, "y":1.5}, + {"label":"_", "x":11, "y":1.5}, + {"label":"+", "x":12, "y":1.5}, + {"label":"Backspace", "x":13, "y":1.5, "w":2}, + {"label":"Insert", "x":15.25, "y":1.5}, + {"label":"Home", "x":16.25, "y":1.5}, + {"label":"PgUp", "x":17.25, "y":1.5}, + {"label":"Tab", "x":0, "y":2.5, "w":1.5}, + {"label":"Q", "x":1.5, "y":2.5}, + {"label":"W", "x":2.5, "y":2.5}, + {"label":"E", "x":3.5, "y":2.5}, + {"label":"R", "x":4.5, "y":2.5}, + {"label":"T", "x":5.5, "y":2.5}, + {"label":"Y", "x":6.5, "y":2.5}, + {"label":"U", "x":7.5, "y":2.5}, + {"label":"I", "x":8.5, "y":2.5}, + {"label":"O", "x":9.5, "y":2.5}, + {"label":"P", "x":10.5, "y":2.5}, + {"label":"{", "x":11.5, "y":2.5}, + {"label":"}", "x":12.5, "y":2.5}, + {"label":"Delete", "x":15.25, "y":2.5}, + {"label":"End", "x":16.25, "y":2.5}, + {"label":"PgDn", "x":17.25, "y":2.5}, + {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75}, + {"label":"A", "x":1.75, "y":3.5}, + {"label":"S", "x":2.75, "y":3.5}, + {"label":"D", "x":3.75, "y":3.5}, + {"label":"F", "x":4.75, "y":3.5}, + {"label":"G", "x":5.75, "y":3.5}, + {"label":"H", "x":6.75, "y":3.5}, + {"label":"J", "x":7.75, "y":3.5}, + {"label":"K", "x":8.75, "y":3.5}, + {"label":"L", "x":9.75, "y":3.5}, + {"label":":", "x":10.75, "y":3.5}, + {"label":"@", "x":11.75, "y":3.5}, + {"label":"~", "x":12.75, "y":3.5}, + {"label":"Enter", "x":13.75, "y":2.5, "w":1.25, "h":2}, + {"label":"Shift", "x":0, "y":4.5, "w":1.25}, + {"label":"|", "x":1.25, "y":4.5}, + {"label":"Z", "x":2.25, "y":4.5}, + {"label":"X", "x":3.25, "y":4.5}, + {"label":"C", "x":4.25, "y":4.5}, + {"label":"V", "x":5.25, "y":4.5}, + {"label":"B", "x":6.25, "y":4.5}, + {"label":"N", "x":7.25, "y":4.5}, + {"label":"M", "x":8.25, "y":4.5}, + {"label":"<", "x":9.25, "y":4.5}, + {"label":">", "x":10.25, "y":4.5}, + {"label":"?", "x":11.25, "y":4.5}, + {"label":"Shift", "x":12.25, "y":4.5, "w":2.75}, + {"label":"Up", "x":16.25, "y":4.5}, + {"label":"Ctrl", "x":0, "y":5.5, "w":1.25}, + {"label":"Win", "x":1.25, "y":5.5, "w":1.25}, + {"label":"Alt", "x":2.5, "y":5.5, "w":1.25}, + {"label":"Space", "x":3.75, "y":5.5, "w":6.25}, + {"label":"AltGr", "x":10, "y":5.5, "w":1.25}, + {"label":"Win", "x":11.25, "y":5.5, "w":1.25}, + {"label":"Menu", "x":12.5, "y":5.5, "w":1.25}, + {"label":"Ctrl", "x":13.75, "y":5.5, "w":1.25}, + {"label":"Left", "x":15.25, "y":5.5}, + {"label":"Down", "x":16.25, "y":5.5}, + {"label":"Right", "x":17.25, "y":5.5} + ] + }, + "LAYOUT_tkl_iso_wkl": { + "key_count": 85, + "layout": [ + {"label":"Esc", "x":0, "y":0}, + {"label":"F1", "x":2, "y":0}, + {"label":"F2", "x":3, "y":0}, + {"label":"F3", "x":4, "y":0}, + {"label":"F4", "x":5, "y":0}, + {"label":"F5", "x":6.5, "y":0}, + {"label":"F6", "x":7.5, "y":0}, + {"label":"F7", "x":8.5, "y":0}, + {"label":"F8", "x":9.5, "y":0}, + {"label":"F9", "x":11, "y":0}, + {"label":"F10", "x":12, "y":0}, + {"label":"F11", "x":13, "y":0}, + {"label":"F12", "x":14, "y":0}, + {"label":"PrtSc", "x":15.25, "y":0}, + {"label":"Scroll Lock", "x":16.25, "y":0}, + {"label":"Pause", "x":17.25, "y":0}, + {"label":"\u00ac", "x":0, "y":1.5}, + {"label":"!", "x":1, "y":1.5}, + {"label":"\"", "x":2, "y":1.5}, + {"label":"\u00a3", "x":3, "y":1.5}, + {"label":"$", "x":4, "y":1.5}, + {"label":"%", "x":5, "y":1.5}, + {"label":"^", "x":6, "y":1.5}, + {"label":"&", "x":7, "y":1.5}, + {"label":"*", "x":8, "y":1.5}, + {"label":"(", "x":9, "y":1.5}, + {"label":")", "x":10, "y":1.5}, + {"label":"_", "x":11, "y":1.5}, + {"label":"+", "x":12, "y":1.5}, + {"label":"Backspace", "x":13, "y":1.5, "w":2}, + {"label":"Insert", "x":15.25, "y":1.5}, + {"label":"Home", "x":16.25, "y":1.5}, + {"label":"PgUp", "x":17.25, "y":1.5}, + {"label":"Tab", "x":0, "y":2.5, "w":1.5}, + {"label":"Q", "x":1.5, "y":2.5}, + {"label":"W", "x":2.5, "y":2.5}, + {"label":"E", "x":3.5, "y":2.5}, + {"label":"R", "x":4.5, "y":2.5}, + {"label":"T", "x":5.5, "y":2.5}, + {"label":"Y", "x":6.5, "y":2.5}, + {"label":"U", "x":7.5, "y":2.5}, + {"label":"I", "x":8.5, "y":2.5}, + {"label":"O", "x":9.5, "y":2.5}, + {"label":"P", "x":10.5, "y":2.5}, + {"label":"{", "x":11.5, "y":2.5}, + {"label":"}", "x":12.5, "y":2.5}, + {"label":"Delete", "x":15.25, "y":2.5}, + {"label":"End", "x":16.25, "y":2.5}, + {"label":"PgDn", "x":17.25, "y":2.5}, + {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75}, + {"label":"A", "x":1.75, "y":3.5}, + {"label":"S", "x":2.75, "y":3.5}, + {"label":"D", "x":3.75, "y":3.5}, + {"label":"F", "x":4.75, "y":3.5}, + {"label":"G", "x":5.75, "y":3.5}, + {"label":"H", "x":6.75, "y":3.5}, + {"label":"J", "x":7.75, "y":3.5}, + {"label":"K", "x":8.75, "y":3.5}, + {"label":"L", "x":9.75, "y":3.5}, + {"label":":", "x":10.75, "y":3.5}, + {"label":"@", "x":11.75, "y":3.5}, + {"label":"~", "x":12.75, "y":3.5}, + {"label":"Enter", "x":13.75, "y":2.5, "w":1.25, "h":2}, + {"label":"Shift", "x":0, "y":4.5, "w":1.25}, + {"label":"|", "x":1.25, "y":4.5}, + {"label":"Z", "x":2.25, "y":4.5}, + {"label":"X", "x":3.25, "y":4.5}, + {"label":"C", "x":4.25, "y":4.5}, + {"label":"V", "x":5.25, "y":4.5}, + {"label":"B", "x":6.25, "y":4.5}, + {"label":"N", "x":7.25, "y":4.5}, + {"label":"M", "x":8.25, "y":4.5}, + {"label":"<", "x":9.25, "y":4.5}, + {"label":">", "x":10.25, "y":4.5}, + {"label":"?", "x":11.25, "y":4.5}, + {"label":"Shift", "x":12.25, "y":4.5, "w":2.75}, + {"label":"Up", "x":16.25, "y":4.5}, + {"label":"Ctrl", "x":0, "y":5.5, "w":1.5}, + {"label":"Alt", "x":2.5, "y":5.5, "w":1.5}, + {"label":"Space", "x":4, "y":5.5, "w":7}, + {"label":"AltGr", "x":11, "y":5.5, "w":1.5}, + {"label":"Ctrl", "x":13.5, "y":5.5, "w":1.5}, + {"label":"Left", "x":15.25, "y":5.5}, + {"label":"Down", "x":16.25, "y":5.5}, + {"label":"Right", "x":17.25, "y":5.5} + ] + } + } +} + diff --git a/keyboards/xmmx/keymaps/ansi_wk/keymap.c b/keyboards/xmmx/keymaps/ansi_wk/keymap.c index abdba99ba..213f65a4a 100644 --- a/keyboards/xmmx/keymaps/ansi_wk/keymap.c +++ b/keyboards/xmmx/keymaps/ansi_wk/keymap.c @@ -2,12 +2,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - LAYOUT_ansi_wk( - KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, \ + LAYOUT_tkl_ansi( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, \ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,KC_MINS, KC_EQL, KC_BSPC, KC_INS,KC_HOME, KC_PGUP, \ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, \ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_ENT, \ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT, KC_UP, \ KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI, KC_APP,KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT - ) + ) }; + diff --git a/keyboards/xmmx/keymaps/ansi_wkl/keymap.c b/keyboards/xmmx/keymaps/ansi_wkl/keymap.c index aeb61ff2c..d566f1a21 100644 --- a/keyboards/xmmx/keymaps/ansi_wkl/keymap.c +++ b/keyboards/xmmx/keymaps/ansi_wkl/keymap.c @@ -2,12 +2,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - LAYOUT_ansi_wkl( - KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, \ + LAYOUT_tkl_ansi_wkl( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, \ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,KC_MINS, KC_EQL, KC_BSPC, KC_INS,KC_HOME, KC_PGUP, \ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, \ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_ENT, \ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT, KC_UP, \ KC_LCTL, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT - ) + ) }; + diff --git a/keyboards/xmmx/keymaps/default/keymap.c b/keyboards/xmmx/keymaps/default/keymap.c index a7522fe25..a4c38cd54 100644 --- a/keyboards/xmmx/keymaps/default/keymap.c +++ b/keyboards/xmmx/keymaps/default/keymap.c @@ -2,12 +2,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - LAYOUT_all( - KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, \ + LAYOUT_all( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, \ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, KC_INS,KC_HOME, KC_PGUP, \ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, \ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_NUHS, KC_ENT, KC_NO, KC_NO, KC_NO, \ KC_LSFT,KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT, KC_RSFT, KC_NO, KC_UP, KC_NO, \ KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI, KC_APP,KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT - ) + ) }; + diff --git a/keyboards/xmmx/keymaps/iso_wk/keymap.c b/keyboards/xmmx/keymaps/iso_wk/keymap.c index 882cb224a..a71795ccf 100644 --- a/keyboards/xmmx/keymaps/iso_wk/keymap.c +++ b/keyboards/xmmx/keymaps/iso_wk/keymap.c @@ -2,12 +2,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - LAYOUT_iso_wk( - KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, \ + LAYOUT_tkl_iso( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, \ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,KC_MINS, KC_EQL, KC_BSPC, KC_INS,KC_HOME, KC_PGUP, \ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,KC_LBRC, KC_RBRC, KC_DEL, KC_END, KC_PGDN, \ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_NUHS, KC_ENT, \ KC_LSFT, KC_NUBS,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT, KC_UP, \ KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI, KC_APP,KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT - ) + ) }; + diff --git a/keyboards/xmmx/keymaps/iso_wkl/keymap.c b/keyboards/xmmx/keymaps/iso_wkl/keymap.c index 18ba79e1f..d40257177 100644 --- a/keyboards/xmmx/keymaps/iso_wkl/keymap.c +++ b/keyboards/xmmx/keymaps/iso_wkl/keymap.c @@ -2,12 +2,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - LAYOUT_iso_wkl( - KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, \ + LAYOUT_tkl_iso_wkl( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, \ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,KC_MINS, KC_EQL, KC_BSPC, KC_INS,KC_HOME, KC_PGUP, \ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,KC_LBRC, KC_RBRC, KC_DEL, KC_END, KC_PGDN, \ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_NUHS, KC_ENT, \ KC_LSFT, KC_NUBS,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT, KC_UP, \ KC_LCTL, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT - ) + ) }; + diff --git a/keyboards/xmmx/readme.md b/keyboards/xmmx/readme.md index 8f94df4b9..51775f241 100644 --- a/keyboards/xmmx/readme.md +++ b/keyboards/xmmx/readme.md @@ -1,14 +1,14 @@ # XMMX -XMMX: Tenkeyless Mechanical Keyboard PCB designed to fit Filco Majestouch TKL and Cooler Master Quickfire Rapid cases +XMMX is a Tenkeyless Mechanical Keyboard PCB designed to fit Filco Majestouch TKL and Cooler Master Quickfire Rapid cases. -XMMX schematic and PCB are available opensource under Creative Commons BY-SA 3.0 license on EasyEDA at [this link](https://easyeda.com/farmakon/XMMX-0447d28c1e4644b88fd04905d983684d) +XMMX schematic and PCB are available opensource under Creative Commons BY-SA 3.0 license on EasyEDA at [this link](https://easyeda.com/farmakon/XMMX-0447d28c1e4644b88fd04905d983684d). -For more informations on the XMMX please visit this [geekhack.org thread](https://geekhack.org/index.php?topic=93422.0) +For more informations on the XMMX please visit [this geekhack.org thread](https://geekhack.org/index.php?topic=93422.0). -Make examples for these keyboards (after setting up your build environment): +Make example for this keyboard (after setting up your build environment): make xmmx:default +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). -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. diff --git a/keyboards/xmmx/xmmx.h b/keyboards/xmmx/xmmx.h index 22d0f1480..82c3fb588 100644 --- a/keyboards/xmmx/xmmx.h +++ b/keyboards/xmmx/xmmx.h @@ -1,5 +1,4 @@ -#ifndef XMMX -#define XMMX +#pragma once #include "quantum.h" @@ -21,7 +20,7 @@ } // 80% keyboard: ANSI Winkey -#define LAYOUT_ansi_wk( \ +#define LAYOUT_tkl_ansi( \ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K015, K016, \ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116, \ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216, \ @@ -38,7 +37,7 @@ } // 80% keyboard: ANSI Winkeyless -#define LAYOUT_ansi_wkl( \ +#define LAYOUT_tkl_ansi_wkl( \ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K015, K016, \ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116, \ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216, \ @@ -55,7 +54,7 @@ } // 80% keyboard: ISO Winkey -#define LAYOUT_iso_wk( \ +#define LAYOUT_tkl_iso( \ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K015, K016, \ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116, \ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K214, K215, K216, \ @@ -72,7 +71,7 @@ } // 80% keyboard: ISO Winkeyless -#define LAYOUT_iso_wkl( \ +#define LAYOUT_tkl_iso_wkl( \ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K015, K016, \ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116, \ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K214, K215, K216, \ @@ -88,4 +87,3 @@ { K500, KC_NO,K502, KC_NO,KC_NO,KC_NO,KC_NO,K507, KC_NO,KC_NO,KC_NO,K511, KC_NO,K513, K514, K515, K516 } \ } -#endif From ee1be3e5b5a0259cc7d1c7a126ff7451acf3d6cb Mon Sep 17 00:00:00 2001 From: Yan-Fa Li Date: Tue, 25 Dec 2018 16:40:53 -0800 Subject: [PATCH 754/788] Improve diagnostics for build hashes --- .travis.yml | 3 ++- util/travis_compiled_push.sh | 7 ++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 7ff4060ab..6cfc9e067 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,6 +19,7 @@ install: before_script: - avr-gcc --version script: +- git rev-parse --short HEAD - make test:all AUTOGEN=false - bash util/travis_build.sh - bash util/travis_docs.sh @@ -33,7 +34,7 @@ addons: - diffutils - dos2unix - doxygen -after_success: +after_success: bash util/travis_compiled_push.sh notifications: webhooks: diff --git a/util/travis_compiled_push.sh b/util/travis_compiled_push.sh index a49908c71..66b3beb6c 100755 --- a/util/travis_compiled_push.sh +++ b/util/travis_compiled_push.sh @@ -8,6 +8,7 @@ TRAVIS_COMMIT_RANGE="${TRAVIS_COMMIT_RANGE:-HEAD~1..HEAD}" set -o errexit -o nounset rev=$(git rev-parse --short HEAD) +echo "Using git hash ${rev}" if [[ "$TRAVIS_BRANCH" == "master" && "$TRAVIS_PULL_REQUEST" == "false" ]] ; then @@ -34,7 +35,7 @@ increment_version () part[2]=$((part[2] + 1)) new="${part[*]}" echo -e "${new// /.}" -} +} git diff --name-only -n 1 ${TRAVIS_COMMIT_RANGE} @@ -63,7 +64,7 @@ if [[ "$TRAVIS_COMMIT_MESSAGE" != *"[skip build]"* ]] ; then ssh-add -D eval `ssh-agent -s` ssh-add id_rsa_qmk.fm - + # don't delete files in case not all keyboards are built # rm -f compiled/*.hex @@ -74,7 +75,7 @@ if [[ "$TRAVIS_COMMIT_MESSAGE" != *"[skip build]"* ]] ; then for file in ../qmk_firmware/keyboards/*/*/*/*/keymaps/*/*_default.hex; do mv -v "$file" "compiled/${file##*/}" || true; done bash _util/generate_keyboard_page.sh git add -A - git commit -m "generated from qmk/qmk_firmware@${rev}" + git commit -m "generated from qmk/qmk_firmware@${rev}" git push git@github.com:qmk/qmk.fm.git fi From b7d2a9f980be009f5d40950cf649ce1086b821a9 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Wed, 26 Dec 2018 07:55:42 -0800 Subject: [PATCH 755/788] S65-Plus: refactor and Configurator support (#4725) - s65_plus.h updated to #pragma once method - added info.json file --- keyboards/s65_plus/info.json | 92 +++++++++++++++++++++++++++++++++++ keyboards/s65_plus/s65_plus.h | 4 +- 2 files changed, 93 insertions(+), 3 deletions(-) create mode 100644 keyboards/s65_plus/info.json diff --git a/keyboards/s65_plus/info.json b/keyboards/s65_plus/info.json new file mode 100644 index 000000000..589269db9 --- /dev/null +++ b/keyboards/s65_plus/info.json @@ -0,0 +1,92 @@ +{ + "keyboard_name": "S65-Plus", + "url": "", + "maintainer": "qmk", + "width": 18, + "height": 5, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"F1", "x":0, "y":0}, + {"label":"F2", "x":1, "y":0}, + {"label":"ESC", "x":2, "y":0}, + {"label":"1", "x":3, "y":0}, + {"label":"2", "x":4, "y":0}, + {"label":"3", "x":5, "y":0}, + {"label":"4", "x":6, "y":0}, + {"label":"5", "x":7, "y":0}, + {"label":"6", "x":8, "y":0}, + {"label":"7", "x":9, "y":0}, + {"label":"8", "x":10, "y":0}, + {"label":"9", "x":11, "y":0}, + {"label":"0", "x":12, "y":0}, + {"label":"MINUS", "x":13, "y":0}, + {"label":"EQUAL", "x":14, "y":0}, + {"label":"BACKSPACE", "x":15, "y":0, "w":2}, + {"label":"DELETE", "x":17, "y":0}, + {"label":"F3", "x":0, "y":1}, + {"label":"F4", "x":1, "y":1}, + {"label":"TAB", "x":2, "y":1, "w":1.5}, + {"label":"Q", "x":3.5, "y":1}, + {"label":"W", "x":4.5, "y":1}, + {"label":"E", "x":5.5, "y":1}, + {"label":"R", "x":6.5, "y":1}, + {"label":"T", "x":7.5, "y":1}, + {"label":"Y", "x":8.5, "y":1}, + {"label":"U", "x":9.5, "y":1}, + {"label":"I", "x":10.5, "y":1}, + {"label":"O", "x":11.5, "y":1}, + {"label":"P", "x":12.5, "y":1}, + {"label":"LBRACKET", "x":13.5, "y":1}, + {"label":"RBRACKET", "x":14.5, "y":1}, + {"label":"BACKSLASH", "x":15.5, "y":1, "w":1.5}, + {"label":"PAGEUP", "x":17, "y":1}, + {"label":"F5", "x":0, "y":2}, + {"label":"F6", "x":1, "y":2}, + {"label":"CAPSLOCK", "x":2, "y":2, "w":1.75}, + {"label":"A", "x":3.75, "y":2}, + {"label":"S", "x":4.75, "y":2}, + {"label":"D", "x":5.75, "y":2}, + {"label":"F", "x":6.75, "y":2}, + {"label":"G", "x":7.75, "y":2}, + {"label":"H", "x":8.75, "y":2}, + {"label":"J", "x":9.75, "y":2}, + {"label":"K", "x":10.75, "y":2}, + {"label":"L", "x":11.75, "y":2}, + {"label":"SEMICOLON", "x":12.75, "y":2}, + {"label":"QUOTE", "x":13.75, "y":2}, + {"label":"ENTER", "x":14.75, "y":2, "w":2.25}, + {"label":"PAGEDOWN", "x":17, "y":2}, + {"label":"F7", "x":0, "y":3}, + {"label":"F8", "x":1, "y":3}, + {"label":"LSHIFT", "x":2, "y":3, "w":2.25}, + {"label":"Z", "x":4.25, "y":3}, + {"label":"X", "x":5.25, "y":3}, + {"label":"C", "x":6.25, "y":3}, + {"label":"V", "x":7.25, "y":3}, + {"label":"B", "x":8.25, "y":3}, + {"label":"N", "x":9.25, "y":3}, + {"label":"M", "x":10.25, "y":3}, + {"label":"COMMA", "x":11.25, "y":3}, + {"label":"PERIOD", "x":12.25, "y":3}, + {"label":"SLASH", "x":13.25, "y":3}, + {"label":"RSHIFT", "x":14.25, "y":3, "w":1.75}, + {"label":"UP", "x":16, "y":3}, + {"label":"END", "x":17, "y":3}, + {"label":"F9", "x":0, "y":4}, + {"label":"F10", "x":1, "y":4}, + {"label":"LCTRL", "x":2, "y":4, "w":1.25}, + {"label":"LGUI", "x":3.25, "y":4, "w":1.25}, + {"label":"LALT", "x":4.5, "y":4, "w":1.25}, + {"label":"SPACE", "x":5.75, "y":4, "w":6.25}, + {"label":"RALT", "x":12, "y":4}, + {"label":"FN", "x":13, "y":4}, + {"label":"RCTRL", "x":14, "y":4}, + {"label":"LEFT", "x":15, "y":4}, + {"label":"DOWN", "x":16, "y":4}, + {"label":"RIGHT", "x":17, "y":4} + ] + } + } +} + diff --git a/keyboards/s65_plus/s65_plus.h b/keyboards/s65_plus/s65_plus.h index 2ff445f6c..107557108 100644 --- a/keyboards/s65_plus/s65_plus.h +++ b/keyboards/s65_plus/s65_plus.h @@ -1,5 +1,4 @@ -#ifndef S60PLUS_H -#define S60PLUS_H +#pragma once #include "quantum.h" @@ -20,4 +19,3 @@ void matrix_init_user(void); void matrix_scan_user(void); -#endif From 0c1256e60ab430402ad5dcd11f2368bb065fa958 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20=C4=90or=C4=91evi=C4=87?= Date: Wed, 26 Dec 2018 17:01:26 +0100 Subject: [PATCH 756/788] Read user input properly in linux_install.sh for Gentoo (#4395) * Change spaces to tabs on two lines The rest of the file uses tabs * Read user input in a non-terrible, non-hacky way * Remove unnecessary tee call * read -p is not POSIX * Add missing $ to echo GENTOO_WARNING * Replace non-POSIX echo -n with printf * Use cd ... || exit 1 in case git clone fails * Add missing sudo Thanks @snortwolf * Undo replacing tee with >> --- util/linux_install.sh | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/util/linux_install.sh b/util/linux_install.sh index 70b389c0d..d6e6b86cd 100755 --- a/util/linux_install.sh +++ b/util/linux_install.sh @@ -32,7 +32,7 @@ if grep ID /etc/os-release | grep -qE "fedora"; then elif grep ID /etc/os-release | grep -qE 'debian|ubuntu'; then DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true - export DEBIAN_FRONTEND DEBCONF_NONINTERACTIVE_SEEN + export DEBIAN_FRONTEND DEBCONF_NONINTERACTIVE_SEEN sudo apt-get update sudo apt-get install \ build-essential \ @@ -70,20 +70,18 @@ elif grep ID /etc/os-release | grep -q 'arch\|manjaro'; then wget \ zip git clone https://aur.archlinux.org/dfu-programmer.git /tmp/dfu-programmer - cd /tmp/dfu-programmer + cd /tmp/dfu-programmer || exit 1 makepkg -sic rm -rf /tmp/dfu-programmer/ elif grep ID /etc/os-release | grep -q gentoo; then - echo GENTOO_WARNING | fmt - echo -n "Proceed (y/N)? " - old_stty_cfg=$(stty -g) - stty raw -echo - answer=$( while ! head -c 1 | grep -i '[ny]' ;do true ;done ) - stty $old_stty_cfg - if echo "$answer" | grep -iq "^y" ;then + echo "$GENTOO_WARNING" | fmt + printf "\nProceed (y/N)? " + read -r answer + if echo "$answer" | grep -iq "^y"; then sudo touch /etc/portage/package.use/qmkfirmware - echo "sys-devel/gcc multilib" | sudo tee --append /etc/portage/package.use/qmkfirmware > /dev/null + # tee is used here since sudo doesn't apply to >> + echo "sys-devel/gcc multilib" | sudo tee --append /etc/portage/package.use/qmkfirmware >/dev/null sudo emerge -auN \ app-arch/unzip \ app-arch/zip \ From cfba2165413796da0e657675c67e40a8683e6107 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Thu, 27 Dec 2018 08:37:29 -0800 Subject: [PATCH 757/788] S65-Plus: fix layout macro name in info.json (#4728) --- keyboards/s65_plus/info.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/s65_plus/info.json b/keyboards/s65_plus/info.json index 589269db9..14c5b08d9 100644 --- a/keyboards/s65_plus/info.json +++ b/keyboards/s65_plus/info.json @@ -5,7 +5,7 @@ "width": 18, "height": 5, "layouts": { - "LAYOUT": { + "LAYOUT_ansi": { "layout": [ {"label":"F1", "x":0, "y":0}, {"label":"F2", "x":1, "y":0}, From 3744a2b641628c8e1646ce743c07934314357c51 Mon Sep 17 00:00:00 2001 From: Jumail Mundekkat Date: Fri, 28 Dec 2018 03:40:33 +1100 Subject: [PATCH 758/788] Added Skog TKL support (#4727) * Added Skog TKL support * Updated manufacturer/product name --- keyboards/skog/README.md | 61 ++++ keyboards/skog/backlight.c | 211 +++++++++++++ keyboards/skog/backlight_custom.h | 13 + keyboards/skog/breathing_custom.h | 140 +++++++++ keyboards/skog/config.h | 42 +++ keyboards/skog/i2c.c | 106 +++++++ keyboards/skog/i2c.h | 25 ++ keyboards/skog/info.json | 12 + keyboards/skog/keymaps/default/keymap.c | 37 +++ keyboards/skog/matrix.c | 112 +++++++ keyboards/skog/rules.mk | 55 ++++ keyboards/skog/skog.c | 98 ++++++ keyboards/skog/skog.h | 39 +++ keyboards/skog/usbconfig.h | 396 ++++++++++++++++++++++++ 14 files changed, 1347 insertions(+) create mode 100644 keyboards/skog/README.md create mode 100644 keyboards/skog/backlight.c create mode 100644 keyboards/skog/backlight_custom.h create mode 100644 keyboards/skog/breathing_custom.h create mode 100644 keyboards/skog/config.h create mode 100644 keyboards/skog/i2c.c create mode 100644 keyboards/skog/i2c.h create mode 100644 keyboards/skog/info.json create mode 100644 keyboards/skog/keymaps/default/keymap.c create mode 100644 keyboards/skog/matrix.c create mode 100644 keyboards/skog/rules.mk create mode 100644 keyboards/skog/skog.c create mode 100644 keyboards/skog/skog.h create mode 100644 keyboards/skog/usbconfig.h diff --git a/keyboards/skog/README.md b/keyboards/skog/README.md new file mode 100644 index 000000000..51a792b6b --- /dev/null +++ b/keyboards/skog/README.md @@ -0,0 +1,61 @@ +Skog TKL by Percent +========================== + +Keyboard Maintainer: QMK Community +Hardware Supported: Skog PCB +Hardware Availability: https://geekhack.org/index.php?topic=87953.0 + +Make example for this keyboard (after setting up your build environment): + + make skog:default + +## Setting the board to bootloader mode + +If you're lucky, the programming script does this automagically for you. If +however this doesn't work for you, you need to enter the bootloader mode manually +by plugging the keyboard in while holding the bootloader key. If you did this +correctly the LEDs will blink and you'll be able to flash your firmware. + +The bootloader key is in the top-right (Pause). + +## Flashing + +ps2avr(GB) boards use an atmega32a microcontroller and a different bootloader. It is not flashable using the regular QMK methods. + +Windows: +1. Download [HIDBootFlash](http://vusb.wikidot.com/project:hidbootflash). +2. Place your keyboard into reset. +3. Press the `Find Device` button and ensure that your keyboard is found. +4. Press the `Open .hex File` button and locate the `.hex` file you created. +5. Press the `Flash Device` button and wait for the process to complete. + +macOS: +1. Install homebrew by typing the following: + ``` + /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" + ``` +2. Install `crosspack-avr`. + ``` + brew cask install crosspack-avr + ``` +3. Install the following packages: + ``` + brew install python + brew install pyusb + brew install --HEAD`https://raw.githubusercontent.com/robertgzr/homebrew-tap/master/bootloadhid.rb + +4. Place your keyboard into reset. +5. Flash the board by typing `bootloadHID -r` followed by the path to your `.hex` file. + +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). + +## Troubleshooting + +From my experience, it's really hard to brick these boards. But these +tricks have been useful when it got stuck in a weird scenario. + +1. Try plugging the board in while holding the bootloader key. This will force + it to boot only the bootloader without loading the firmware. Once this is + done, just reflash the board with the original firmware. +2. Sometimes USB hubs can act weird, so try connecting the board directly + to your computer or plugging/unplugging the USB hub. diff --git a/keyboards/skog/backlight.c b/keyboards/skog/backlight.c new file mode 100644 index 000000000..94e8126d8 --- /dev/null +++ b/keyboards/skog/backlight.c @@ -0,0 +1,211 @@ +/** + * Backlighting code for PS2AVRGB boards (ATMEGA32A) + * Kenneth A. (github.com/krusli | krusli.me) + */ + +#include "backlight.h" +#include "quantum.h" + +#include +#include + +#include "backlight_custom.h" +#include "breathing_custom.h" + +// DEBUG +#include +#include + +// Port D: digital pins of the AVR chipset +#define NUMLOCK_PORT (1 << 0) // D0 +#define CAPSLOCK_PORT (1 << 1) // D1 +#define BACKLIGHT_PORT (1 << 4) // D4 +#define SCROLLLOCK_PORT (1 << 6) // D6 + +#define TIMER_CLK_DIV64 0x03 ///< Timer clocked at F_CPU/64 +#define TIMER1PRESCALE TIMER_CLK_DIV64 ///< timer 1 prescaler default + +#define TIMER_PRESCALE_MASK 0x07 ///< Timer Prescaler Bit-Mask + +#define PWM_MAX 0xFF +#define TIMER_TOP 255 // 8 bit PWM + +extern backlight_config_t backlight_config; + +/** + * References + * Port Registers: https://www.arduino.cc/en/Reference/PortManipulation + * TCCR1A: https://electronics.stackexchange.com/questions/92350/what-is-the-difference-between-tccr1a-and-tccr1b + * Timers: http://www.avrbeginners.net/architecture/timers/timers.html + * 16-bit timer setup: http://sculland.com/ATmega168/Interrupts-And-Timers/16-Bit-Timer-Setup/ + * PS2AVRGB firmware: https://github.com/showjean/ps2avrU/tree/master/firmware + */ + +// @Override +// turn LEDs on and off depending on USB caps/num/scroll lock states. +__attribute__ ((weak)) +void led_set_user(uint8_t usb_led) { + if (usb_led & (1 << USB_LED_NUM_LOCK)) { + // turn on + DDRD |= NUMLOCK_PORT; + PORTD |= NUMLOCK_PORT; + } else { + // turn off + DDRD &= ~NUMLOCK_PORT; + PORTD &= ~NUMLOCK_PORT; + } + + if (usb_led & (1 << USB_LED_CAPS_LOCK)) { + DDRD |= CAPSLOCK_PORT; + PORTD |= CAPSLOCK_PORT; + } else { + DDRD &= ~CAPSLOCK_PORT; + PORTD &= ~CAPSLOCK_PORT; + } + + if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { + DDRD |= SCROLLLOCK_PORT; + PORTD |= SCROLLLOCK_PORT; + } else { + DDRD &= ~SCROLLLOCK_PORT; + PORTD &= ~SCROLLLOCK_PORT; + } +} + +#ifdef BACKLIGHT_ENABLE + +// sets up Timer 1 for 8-bit PWM +void timer1PWMSetup(void) { // NOTE ONLY CALL THIS ONCE + // default 8 bit mode + TCCR1A &= ~(1 << 1); // cbi(TCCR1A,PWM11); <- set PWM11 bit to HIGH + TCCR1A |= (1 << 0); // sbi(TCCR1A,PWM10); <- set PWM10 bit to LOW + + // clear output compare value A + // outb(OCR1AH, 0); + // outb(OCR1AL, 0); + + // clear output comparator registers for B + OCR1BH = 0; // outb(OCR1BH, 0); + OCR1BL = 0; // outb(OCR1BL, 0); +} + +bool is_init = false; +void timer1Init(void) { + // timer1SetPrescaler(TIMER1PRESCALE) + // set to DIV/64 + (TCCR1B) = ((TCCR1B) & ~TIMER_PRESCALE_MASK) | TIMER1PRESCALE; + + // reset TCNT1 + TCNT1H = 0; // outb(TCNT1H, 0); + TCNT1L = 0; // outb(TCNT1L, 0); + + // TOIE1: Timer Overflow Interrupt Enable (Timer 1); + TIMSK |= _BV(TOIE1); // sbi(TIMSK, TOIE1); + + is_init = true; +} + +void timer1UnInit(void) { + // set prescaler back to NONE + (TCCR1B) = ((TCCR1B) & ~TIMER_PRESCALE_MASK) | 0x00; // TIMERRTC_CLK_STOP + + // disable timer overflow interrupt + TIMSK &= ~_BV(TOIE1); // overflow bit? + + setPWM(0); + + is_init = false; +} + + +// handle TCNT1 overflow +//! Interrupt handler for tcnt1 overflow interrupt +ISR(TIMER1_OVF_vect, ISR_NOBLOCK) +{ + // sei(); + // handle breathing here + #ifdef BACKLIGHT_BREATHING + if (is_breathing()) { + custom_breathing_handler(); + } + #endif +} + +// enable timer 1 PWM +// timer1PWMBOn() +void timer1PWMBEnable(void) { + // turn on channel B (OC1B) PWM output + // set OC1B as non-inverted PWM + TCCR1A |= _BV(COM1B1); + TCCR1A &= ~_BV(COM1B0); +} + +// disable timer 1 PWM +// timer1PWMBOff() +void timer1PWMBDisable(void) { + TCCR1A &= ~_BV(COM1B1); + TCCR1A &= ~_BV(COM1B0); +} + +void enableBacklight(void) { + DDRD |= BACKLIGHT_PORT; // set digital pin 4 as output + PORTD |= BACKLIGHT_PORT; // set digital pin 4 to high +} + +void disableBacklight(void) { + // DDRD &= ~BACKLIGHT_PORT; // set digital pin 4 as input + PORTD &= ~BACKLIGHT_PORT; // set digital pin 4 to low +} + +void startPWM(void) { + timer1Init(); + timer1PWMBEnable(); + enableBacklight(); +} + +void stopPWM(void) { + timer1UnInit(); + disableBacklight(); + timer1PWMBDisable(); +} + +void b_led_init_ports(void) { + /* turn backlight on/off depending on user preference */ + #if BACKLIGHT_ON_STATE == 0 + // DDRx register: sets the direction of Port D + // DDRD &= ~BACKLIGHT_PORT; // set digital pin 4 as input + PORTD &= ~BACKLIGHT_PORT; // set digital pin 4 to low + #else + DDRD |= BACKLIGHT_PORT; // set digital pin 4 as output + PORTD |= BACKLIGHT_PORT; // set digital pin 4 to high + #endif + + timer1PWMSetup(); + startPWM(); + + #ifdef BACKLIGHT_BREATHING + breathing_enable(); + #endif +} + +void b_led_set(uint8_t level) { + if (level > BACKLIGHT_LEVELS) { + level = BACKLIGHT_LEVELS; + } + + setPWM((int)(TIMER_TOP * (float) level / BACKLIGHT_LEVELS)); +} + +// called every matrix scan +void b_led_task(void) { + // do nothing for now +} + +void setPWM(uint16_t xValue) { + if (xValue > TIMER_TOP) { + xValue = TIMER_TOP; + } + OCR1B = xValue; // timer1PWMBSet(xValue); +} + +#endif // BACKLIGHT_ENABLE diff --git a/keyboards/skog/backlight_custom.h b/keyboards/skog/backlight_custom.h new file mode 100644 index 000000000..51365fe3b --- /dev/null +++ b/keyboards/skog/backlight_custom.h @@ -0,0 +1,13 @@ +/** + * Backlighting code for PS2AVRGB boards (ATMEGA32A) + * Kenneth A. (github.com/krusli | krusli.me) + */ + +#pragma once + +#include +void b_led_init_ports(void); +void b_led_set(uint8_t level); +void b_led_task(void); +void setPWM(uint16_t xValue); + diff --git a/keyboards/skog/breathing_custom.h b/keyboards/skog/breathing_custom.h new file mode 100644 index 000000000..71416b1b4 --- /dev/null +++ b/keyboards/skog/breathing_custom.h @@ -0,0 +1,140 @@ +/** + * Breathing effect code for PS2AVRGB boards (ATMEGA32A) + * Works in conjunction with `backlight.c`. + * + * Code adapted from `quantum.c` to register with the existing TIMER1 overflow + * handler in `backlight.c` instead of setting up its own timer. + * Kenneth A. (github.com/krusli | krusli.me) + */ + +#ifdef BACKLIGHT_ENABLE +#ifdef BACKLIGHT_BREATHING + +#include "backlight_custom.h" + +#ifndef BREATHING_PERIOD +#define BREATHING_PERIOD 6 +#endif + +#define breathing_min() do {breathing_counter = 0;} while (0) +#define breathing_max() do {breathing_counter = breathing_period * 244 / 2;} while (0) + +// TODO make this share code with quantum.c + +#define BREATHING_NO_HALT 0 +#define BREATHING_HALT_OFF 1 +#define BREATHING_HALT_ON 2 +#define BREATHING_STEPS 128 + +static uint8_t breathing_period = BREATHING_PERIOD; +static uint8_t breathing_halt = BREATHING_NO_HALT; +static uint16_t breathing_counter = 0; + +static bool breathing = false; + +bool is_breathing(void) { + return breathing; +} + +// See http://jared.geek.nz/2013/feb/linear-led-pwm +static uint16_t cie_lightness(uint16_t v) { + if (v <= 5243) // if below 8% of max + return v / 9; // same as dividing by 900% + else { + uint32_t y = (((uint32_t) v + 10486) << 8) / (10486 + 0xFFFFUL); // add 16% of max and compare + // to get a useful result with integer division, we shift left in the expression above + // and revert what we've done again after squaring. + y = y * y * y >> 8; + if (y > 0xFFFFUL) // prevent overflow + return 0xFFFFU; + else + return (uint16_t) y; + } +} + +void breathing_enable(void) { + breathing = true; + breathing_counter = 0; + breathing_halt = BREATHING_NO_HALT; + // interrupt already registered +} + +void breathing_pulse(void) { + if (get_backlight_level() == 0) + breathing_min(); + else + breathing_max(); + breathing_halt = BREATHING_HALT_ON; + // breathing_interrupt_enable(); + breathing = true; +} + +void breathing_disable(void) { + breathing = false; + // backlight_set(get_backlight_level()); + b_led_set(get_backlight_level()); // custom implementation of backlight_set() +} + +void breathing_self_disable(void) +{ + if (get_backlight_level() == 0) + breathing_halt = BREATHING_HALT_OFF; + else + breathing_halt = BREATHING_HALT_ON; +} + +void breathing_toggle(void) { + if (is_breathing()) + breathing_disable(); + else + breathing_enable(); +} + +void breathing_period_set(uint8_t value) +{ + if (!value) + value = 1; + breathing_period = value; +} + +void breathing_period_default(void) { + breathing_period_set(BREATHING_PERIOD); +} + +void breathing_period_inc(void) +{ + breathing_period_set(breathing_period+1); +} + +void breathing_period_dec(void) +{ + breathing_period_set(breathing_period-1); +} + +/* To generate breathing curve in python: + * from math import sin, pi; [int(sin(x/128.0*pi)**4*255) for x in range(128)] + */ +static const uint8_t breathing_table[BREATHING_STEPS] PROGMEM = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 4, 5, 6, 8, 10, 12, 15, 17, 20, 24, 28, 32, 36, 41, 46, 51, 57, 63, 70, 76, 83, 91, 98, 106, 113, 121, 129, 138, 146, 154, 162, 170, 178, 185, 193, 200, 207, 213, 220, 225, 231, 235, 240, 244, 247, 250, 252, 253, 254, 255, 254, 253, 252, 250, 247, 244, 240, 235, 231, 225, 220, 213, 207, 200, 193, 185, 178, 170, 162, 154, 146, 138, 129, 121, 113, 106, 98, 91, 83, 76, 70, 63, 57, 51, 46, 41, 36, 32, 28, 24, 20, 17, 15, 12, 10, 8, 6, 5, 4, 3, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +// Use this before the cie_lightness function. +static inline uint16_t scale_backlight(uint16_t v) { + return v / BACKLIGHT_LEVELS * get_backlight_level(); +} + +void custom_breathing_handler(void) { + uint16_t interval = (uint16_t) breathing_period * 244 / BREATHING_STEPS; + // resetting after one period to prevent ugly reset at overflow. + breathing_counter = (breathing_counter + 1) % (breathing_period * 244); + uint8_t index = breathing_counter / interval % BREATHING_STEPS; + + if (((breathing_halt == BREATHING_HALT_ON) && (index == BREATHING_STEPS / 2)) || + ((breathing_halt == BREATHING_HALT_OFF) && (index == BREATHING_STEPS - 1))) + { + // breathing_interrupt_disable(); + } + + setPWM(cie_lightness(scale_backlight((uint16_t) pgm_read_byte(&breathing_table[index]) * 0x0101U))); +} + +#endif // BACKLIGHT_BREATHING +#endif // BACKLIGHT_ENABLE diff --git a/keyboards/skog/config.h b/keyboards/skog/config.h new file mode 100644 index 000000000..dea3e28e8 --- /dev/null +++ b/keyboards/skog/config.h @@ -0,0 +1,42 @@ +/* +Copyright 2018 Jumail Mundekkat / MxBlue + +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 . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#define VENDOR_ID 0x20A0 +#define PRODUCT_ID 0x422D + +#define MANUFACTURER Percent +#define PRODUCT Skog TKL + +/* matrix size */ +#define MATRIX_ROWS 8 +#define MATRIX_COLS 14 + +#define RGBLED_NUM 2 +#define RGBLIGHT_ANIMATIONS + +#define BACKLIGHT_LEVELS 5 + +#define NO_UART 1 +#define BOOTLOADHID_BOOTLOADER 1 + +/* key combination for command */ +#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) + +#endif diff --git a/keyboards/skog/i2c.c b/keyboards/skog/i2c.c new file mode 100644 index 000000000..a4f952135 --- /dev/null +++ b/keyboards/skog/i2c.c @@ -0,0 +1,106 @@ +/* +Copyright 2016 Luiz Ribeiro + +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 . +*/ + +// Please do not modify this file + +#include +#include + +#include "i2c.h" + +void i2c_set_bitrate(uint16_t bitrate_khz) { + uint8_t bitrate_div = ((F_CPU / 1000l) / bitrate_khz); + if (bitrate_div >= 16) { + bitrate_div = (bitrate_div - 16) / 2; + } + TWBR = bitrate_div; +} + +void i2c_init(void) { + // set pull-up resistors on I2C bus pins + PORTC |= 0b11; + + i2c_set_bitrate(400); + + // enable TWI (two-wire interface) + TWCR |= (1 << TWEN); + + // enable TWI interrupt and slave address ACK + TWCR |= (1 << TWIE); + TWCR |= (1 << TWEA); +} + +uint8_t i2c_start(uint8_t address) { + // reset TWI control register + TWCR = 0; + + // begin transmission and wait for it to end + TWCR = (1< + +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 . +*/ + +// Please do not modify this file + +#pragma once + +void i2c_init(void); +void i2c_set_bitrate(uint16_t bitrate_khz); +uint8_t i2c_send(uint8_t address, uint8_t *data, uint16_t length); + diff --git a/keyboards/skog/info.json b/keyboards/skog/info.json new file mode 100644 index 000000000..06fad3a74 --- /dev/null +++ b/keyboards/skog/info.json @@ -0,0 +1,12 @@ +{ + "keyboard_name": "skog", + "url": "", + "maintainer": "qmk", + "width": 18.25, + "height": 6.5, + "layouts": { + "LAYOUT": { + "layout": [{"x":0, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6.5, "y":0}, {"x":7.5, "y":0}, {"x":8.5, "y":0}, {"x":9.5, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":15.25, "y":0}, {"x":16.25, "y":0}, {"x":17.25, "y":0}, {"x":0, "y":1.5}, {"x":1, "y":1.5}, {"x":2, "y":1.5}, {"x":3, "y":1.5}, {"x":4, "y":1.5}, {"x":5, "y":1.5}, {"x":6, "y":1.5}, {"x":7, "y":1.5}, {"x":8, "y":1.5}, {"x":9, "y":1.5}, {"x":10, "y":1.5}, {"x":11, "y":1.5}, {"x":12, "y":1.5}, {"x":13, "y":1.5, "w":2}, {"x":15.25, "y":1.5}, {"x":16.25, "y":1.5}, {"x":17.25, "y":1.5}, {"x":0, "y":2.5, "w":1.5}, {"x":1.5, "y":2.5}, {"x":2.5, "y":2.5}, {"x":3.5, "y":2.5}, {"x":4.5, "y":2.5}, {"x":5.5, "y":2.5}, {"x":6.5, "y":2.5}, {"x":7.5, "y":2.5}, {"x":8.5, "y":2.5}, {"x":9.5, "y":2.5}, {"x":10.5, "y":2.5}, {"x":11.5, "y":2.5}, {"x":12.5, "y":2.5}, {"x":13.5, "y":2.5, "w":1.5}, {"x":15.25, "y":2.5}, {"x":16.25, "y":2.5}, {"x":17.25, "y":2.5}, {"x":0, "y":3.5, "w":1.75}, {"x":1.75, "y":3.5}, {"x":2.75, "y":3.5}, {"x":3.75, "y":3.5}, {"x":4.75, "y":3.5}, {"x":5.75, "y":3.5}, {"x":6.75, "y":3.5}, {"x":7.75, "y":3.5}, {"x":8.75, "y":3.5}, {"x":9.75, "y":3.5}, {"x":10.75, "y":3.5}, {"x":11.75, "y":3.5}, {"x":12.75, "y":3.5, "w":2.25}, {"x":0, "y":4.5, "w":2.25}, {"x":2.25, "y":4.5}, {"x":3.25, "y":4.5}, {"x":4.25, "y":4.5}, {"x":5.25, "y":4.5}, {"x":6.25, "y":4.5}, {"x":7.25, "y":4.5}, {"x":8.25, "y":4.5}, {"x":9.25, "y":4.5}, {"x":10.25, "y":4.5}, {"x":11.25, "y":4.5}, {"x":12.25, "y":4.5, "w":1.75}, {"x":14, "y":4.5}, {"x":16.25, "y":4.5}, {"x":0, "y":5.5, "w":1.25}, {"x":1.25, "y":5.5, "w":1.25}, {"x":2.5, "y":5.5, "w":1.25}, {"x":3.75, "y":5.5, "w":6.25}, {"x":10, "y":5.5, "w":1.25}, {"x":11.25, "y":5.5, "w":1.25}, {"x":12.5, "y":5.5, "w":1.25}, {"x":13.75, "y":5.5, "w":1.25}, {"x":15.25, "y":5.5}, {"x":16.25, "y":5.5}, {"x":17.25, "y":5.5}] + } + } +} diff --git a/keyboards/skog/keymaps/default/keymap.c b/keyboards/skog/keymaps/default/keymap.c new file mode 100644 index 000000000..eefc24cb0 --- /dev/null +++ b/keyboards/skog/keymaps/default/keymap.c @@ -0,0 +1,37 @@ +/* +Copyright 2018 Jumail Mundekkat / MxBlue + +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 . +*/ + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT , KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, KC_TRNS, KC_UP, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_MENU, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + ) +}; + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} diff --git a/keyboards/skog/matrix.c b/keyboards/skog/matrix.c new file mode 100644 index 000000000..245813dfd --- /dev/null +++ b/keyboards/skog/matrix.c @@ -0,0 +1,112 @@ +/* +Copyright 2017 Luiz Ribeiro + +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 . +*/ + +#include +#include + +#include "matrix.h" + +#ifndef DEBOUNCE +# define DEBOUNCE 5 +#endif + +static uint8_t debouncing = DEBOUNCE; + +static matrix_row_t matrix[MATRIX_ROWS]; +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; + +void matrix_set_row_status(uint8_t row); +uint8_t bit_reverse(uint8_t x); + +void matrix_init(void) { + // all outputs for rows high + DDRB = 0xFF; + PORTB = 0xFF; + // all inputs for columns + DDRA = 0x00; + DDRC &= ~(0x111111<<2); + DDRD &= ~(1< 7 + (~PINA) & 0xFF + ) | ( + // cols 8..13, PORTC 7 -> 0 + bit_reverse((~PINC) & 0xFF) << 8 + ) | ( + // col 14, PORTD 7 + ((~PIND) & (1 << PIND7)) << 7 + ); + + if (matrix_debouncing[row] != cols) { + matrix_debouncing[row] = cols; + debouncing = DEBOUNCE; + } + } + + if (debouncing) { + if (--debouncing) { + _delay_ms(1); + } else { + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + matrix[i] = matrix_debouncing[i]; + } + } + } + + matrix_scan_quantum(); + + return 1; +} + +// declarations +void matrix_set_row_status(uint8_t row) { + DDRB = (1 << row); + PORTB = ~(1 << row); +} + +uint8_t bit_reverse(uint8_t x) { + x = ((x >> 1) & 0x55) | ((x << 1) & 0xaa); + x = ((x >> 2) & 0x33) | ((x << 2) & 0xcc); + x = ((x >> 4) & 0x0f) | ((x << 4) & 0xf0); + return x; +} + +inline matrix_row_t matrix_get_row(uint8_t row) { + return matrix[row]; +} + +void matrix_print(void) { +} diff --git a/keyboards/skog/rules.mk b/keyboards/skog/rules.mk new file mode 100644 index 000000000..bce0c442a --- /dev/null +++ b/keyboards/skog/rules.mk @@ -0,0 +1,55 @@ +# Copyright 2018 Jumail Mundekkat / MxBlue +# +# 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 . + +# MCU name +MCU = atmega32a +PROTOCOL = VUSB + +# unsupported features for now +NO_UART = yes +NO_SUSPEND_POWER_DOWN = yes + +# processor frequency +F_CPU = 12000000 + +# Bootloader +# This definition is optional, and if your keyboard supports multiple bootloaders of +# different sizes, comment this out, and the correct address will be loaded +# automatically (+60). See bootloader.mk for all options. +BOOTLOADER = bootloadHID + +# build options +BOOTMAGIC_ENABLE = full +MOUSEKEY_ENABLE = no +EXTRAKEY_ENABLE = yes +CONSOLE_ENABLE = yes +COMMAND_ENABLE = yes +BACKLIGHT_ENABLE = yes +RGBLIGHT_ENABLE = yes + +BACKLIGHT_CUSTOM_DRIVER = yes +RGBLIGHT_CUSTOM_DRIVER = yes + +OPT_DEFS = -DDEBUG_LEVEL=0 + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +# custom matrix setup +CUSTOM_MATRIX = yes +SRC = matrix.c i2c.c backlight.c + +# programming options +PROGRAM_CMD = ./util/atmega32a_program.py $(TARGET).hex diff --git a/keyboards/skog/skog.c b/keyboards/skog/skog.c new file mode 100644 index 000000000..3d1eb0e1a --- /dev/null +++ b/keyboards/skog/skog.c @@ -0,0 +1,98 @@ +/* +Copyright 2018 Jumail Mundekkat / MxBlue + +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 . + +ps2avrGB support code by Kenneth A. (bminiex/.[ch]) +*/ + +#include "skog.h" + +#include "rgblight.h" + +#include + +#include "action_layer.h" +#include "i2c.h" +#include "quantum.h" + +#include "backlight.h" +#include "backlight_custom.h" + +// for keyboard subdirectory level init functions +// @Override +void matrix_init_kb(void) { + // call user level keymaps, if any + matrix_init_user(); +} + +#ifdef BACKLIGHT_ENABLE +/// Overrides functions in `quantum.c` +void backlight_init_ports(void) { + b_led_init_ports(); +} + +void backlight_task(void) { + b_led_task(); +} + +void backlight_set(uint8_t level) { + b_led_set(level); +} +#endif + +#ifdef RGBLIGHT_ENABLE +extern rgblight_config_t rgblight_config; + +// custom RGB driver +void rgblight_set(void) { + if (!rgblight_config.enable) { + for (uint8_t i=0; i. +*/ + +#pragma once + +#include "quantum.h" + +#define LAYOUT( \ + K11, K31, K41, K51, K61, K81, K91, KA1, KB1, KC1, K01, KD1, K21, K20, K30, K00, \ + \ + K12, K22, K32, K42, K52, K62, K72, K82, K92, KA2, KB2, KC2, K02, KD2 , K70, K60, K50, \ + K13 , K23, K33, K43, K53, K63, K73, K83, K93, KA3, KB3, KC3, K03, KD3 , KD0, K90, K80, \ + K15 , K25, K35, K45, K55, K65, K75, K85, K95, KA5, KB5, KC5, K05 , \ + K16 , K26, K36, K46, K56, K66, K76, K86, K96, KA6, KB6, KC6 , K06, KD6, \ + K17 , K27 , K37 , K57 , K97 , KA7 , KB7 , KC7 , K07, KD7, K87 \ +){ \ + { K00, KC_NO, K20, K30, KC_NO, K50, K60, K70, K80, K90, KC_NO, KC_NO, KC_NO, KD0 }, \ + { K01, K11, K21, K31, K41, K51, K61, KC_NO, K81, K91, KA1, KB1, KC1, KD1 }, \ + { K02, K12, K22, K32, K42, K52, K62, K72, K82, K92, KA2, KB2, KC2, KD2 }, \ + { K03, K13, K23, K33, K43, K53, K63, K73, K83, K93, KA3, KB3, KC3, KD3 }, \ + { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ + { K05, K15, K25, K35, K45, K55, K65, K75, K85, K95, KA5, KB5, KC5, KC_NO }, \ + { K06, K16, K26, K36, K46, K56, K66, K76, K86, K96, KA6, KB6, KC6, KD6 }, \ + { K07, K17, K27, K37, KC_NO, K57, KC_NO, KC_NO, K87, K97, KA7, KB7, KC7, KD7 } \ +} diff --git a/keyboards/skog/usbconfig.h b/keyboards/skog/usbconfig.h new file mode 100644 index 000000000..481d7c0b1 --- /dev/null +++ b/keyboards/skog/usbconfig.h @@ -0,0 +1,396 @@ +/* Name: usbconfig.h + * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers + * Author: Christian Starkjohann + * Creation Date: 2005-04-01 + * Tabsize: 4 + * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $ + */ + +#ifndef __usbconfig_h_included__ +#define __usbconfig_h_included__ + +#include "config.h" + +/* +General Description: +This file is an example configuration (with inline documentation) for the USB +driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is +also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may +wire the lines to any other port, as long as D+ is also wired to INT0 (or any +other hardware interrupt, as long as it is the highest level interrupt, see +section at the end of this file). +*/ + +/* ---------------------------- Hardware Config ---------------------------- */ + +#define USB_CFG_IOPORTNAME D +/* This is the port where the USB bus is connected. When you configure it to + * "B", the registers PORTB, PINB and DDRB will be used. + */ +#define USB_CFG_DMINUS_BIT 3 +/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected. + * This may be any bit in the port. + */ +#define USB_CFG_DPLUS_BIT 2 +/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected. + * This may be any bit in the port. Please note that D+ must also be connected + * to interrupt pin INT0! [You can also use other interrupts, see section + * "Optional MCU Description" below, or you can connect D- to the interrupt, as + * it is required if you use the USB_COUNT_SOF feature. If you use D- for the + * interrupt, the USB interrupt will also be triggered at Start-Of-Frame + * markers every millisecond.] + */ +#define USB_CFG_CLOCK_KHZ (F_CPU/1000) +/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000, + * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code + * require no crystal, they tolerate +/- 1% deviation from the nominal + * frequency. All other rates require a precision of 2000 ppm and thus a + * crystal! + * Since F_CPU should be defined to your actual clock rate anyway, you should + * not need to modify this setting. + */ +#define USB_CFG_CHECK_CRC 0 +/* Define this to 1 if you want that the driver checks integrity of incoming + * data packets (CRC checks). CRC checks cost quite a bit of code size and are + * currently only available for 18 MHz crystal clock. You must choose + * USB_CFG_CLOCK_KHZ = 18000 if you enable this option. + */ + +/* ----------------------- Optional Hardware Config ------------------------ */ + +/* #define USB_CFG_PULLUP_IOPORTNAME D */ +/* If you connect the 1.5k pullup resistor from D- to a port pin instead of + * V+, you can connect and disconnect the device from firmware by calling + * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h). + * This constant defines the port on which the pullup resistor is connected. + */ +/* #define USB_CFG_PULLUP_BIT 4 */ +/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined + * above) where the 1.5k pullup resistor is connected. See description + * above for details. + */ + +/* --------------------------- Functional Range ---------------------------- */ + +#define USB_CFG_HAVE_INTRIN_ENDPOINT 1 +/* Define this to 1 if you want to compile a version with two endpoints: The + * default control endpoint 0 and an interrupt-in endpoint (any other endpoint + * number). + */ +#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1 +/* Define this to 1 if you want to compile a version with three endpoints: The + * default control endpoint 0, an interrupt-in endpoint 3 (or the number + * configured below) and a catch-all default interrupt-in endpoint as above. + * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature. + */ +#define USB_CFG_EP3_NUMBER 3 +/* If the so-called endpoint 3 is used, it can now be configured to any other + * endpoint number (except 0) with this macro. Default if undefined is 3. + */ +/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */ +/* The above macro defines the startup condition for data toggling on the + * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1. + * Since the token is toggled BEFORE sending any data, the first packet is + * sent with the oposite value of this configuration! + */ +#define USB_CFG_IMPLEMENT_HALT 0 +/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature + * for endpoint 1 (interrupt endpoint). Although you may not need this feature, + * it is required by the standard. We have made it a config option because it + * bloats the code considerably. + */ +#define USB_CFG_SUPPRESS_INTR_CODE 0 +/* Define this to 1 if you want to declare interrupt-in endpoints, but don't + * want to send any data over them. If this macro is defined to 1, functions + * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if + * you need the interrupt-in endpoints in order to comply to an interface + * (e.g. HID), but never want to send any data. This option saves a couple + * of bytes in flash memory and the transmit buffers in RAM. + */ +#define USB_CFG_INTR_POLL_INTERVAL 1 +/* If you compile a version with endpoint 1 (interrupt-in), this is the poll + * interval. The value is in milliseconds and must not be less than 10 ms for + * low speed devices. + */ +#define USB_CFG_IS_SELF_POWERED 0 +/* Define this to 1 if the device has its own power supply. Set it to 0 if the + * device is powered from the USB bus. + */ +#define USB_CFG_MAX_BUS_POWER 500 +/* Set this variable to the maximum USB bus power consumption of your device. + * The value is in milliamperes. [It will be divided by two since USB + * communicates power requirements in units of 2 mA.] + */ +#define USB_CFG_IMPLEMENT_FN_WRITE 1 +/* Set this to 1 if you want usbFunctionWrite() to be called for control-out + * transfers. Set it to 0 if you don't need it and want to save a couple of + * bytes. + */ +#define USB_CFG_IMPLEMENT_FN_READ 0 +/* Set this to 1 if you need to send control replies which are generated + * "on the fly" when usbFunctionRead() is called. If you only want to send + * data from a static buffer, set it to 0 and return the data from + * usbFunctionSetup(). This saves a couple of bytes. + */ +#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0 +/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints. + * You must implement the function usbFunctionWriteOut() which receives all + * interrupt/bulk data sent to any endpoint other than 0. The endpoint number + * can be found in 'usbRxToken'. + */ +#define USB_CFG_HAVE_FLOWCONTROL 0 +/* Define this to 1 if you want flowcontrol over USB data. See the definition + * of the macros usbDisableAllRequests() and usbEnableAllRequests() in + * usbdrv.h. + */ +#define USB_CFG_DRIVER_FLASH_PAGE 0 +/* If the device has more than 64 kBytes of flash, define this to the 64 k page + * where the driver's constants (descriptors) are located. Or in other words: + * Define this to 1 for boot loaders on the ATMega128. + */ +#define USB_CFG_LONG_TRANSFERS 0 +/* Define this to 1 if you want to send/receive blocks of more than 254 bytes + * in a single control-in or control-out transfer. Note that the capability + * for long transfers increases the driver size. + */ +/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */ +/* This macro is a hook if you want to do unconventional things. If it is + * defined, it's inserted at the beginning of received message processing. + * If you eat the received message and don't want default processing to + * proceed, do a return after doing your things. One possible application + * (besides debugging) is to flash a status LED on each packet. + */ +/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */ +/* This macro is a hook if you need to know when an USB RESET occurs. It has + * one parameter which distinguishes between the start of RESET state and its + * end. + */ +/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */ +/* This macro (if defined) is executed when a USB SET_ADDRESS request was + * received. + */ +#define USB_COUNT_SOF 1 +/* define this macro to 1 if you need the global variable "usbSofCount" which + * counts SOF packets. This feature requires that the hardware interrupt is + * connected to D- instead of D+. + */ +/* #ifdef __ASSEMBLER__ + * macro myAssemblerMacro + * in YL, TCNT0 + * sts timer0Snapshot, YL + * endm + * #endif + * #define USB_SOF_HOOK myAssemblerMacro + * This macro (if defined) is executed in the assembler module when a + * Start Of Frame condition is detected. It is recommended to define it to + * the name of an assembler macro which is defined here as well so that more + * than one assembler instruction can be used. The macro may use the register + * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages + * immediately after an SOF pulse may be lost and must be retried by the host. + * What can you do with this hook? Since the SOF signal occurs exactly every + * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in + * designs running on the internal RC oscillator. + * Please note that Start Of Frame detection works only if D- is wired to the + * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES! + */ +#define USB_CFG_CHECK_DATA_TOGGLING 0 +/* define this macro to 1 if you want to filter out duplicate data packets + * sent by the host. Duplicates occur only as a consequence of communication + * errors, when the host does not receive an ACK. Please note that you need to + * implement the filtering yourself in usbFunctionWriteOut() and + * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable + * for each control- and out-endpoint to check for duplicate packets. + */ +#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0 +/* define this macro to 1 if you want the function usbMeasureFrameLength() + * compiled in. This function can be used to calibrate the AVR's RC oscillator. + */ +#define USB_USE_FAST_CRC 0 +/* The assembler module has two implementations for the CRC algorithm. One is + * faster, the other is smaller. This CRC routine is only used for transmitted + * messages where timing is not critical. The faster routine needs 31 cycles + * per byte while the smaller one needs 61 to 69 cycles. The faster routine + * may be worth the 32 bytes bigger code size if you transmit lots of data and + * run the AVR close to its limit. + */ + +/* -------------------------- Device Description --------------------------- */ + +#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF) +/* USB vendor ID for the device, low byte first. If you have registered your + * own Vendor ID, define it here. Otherwise you may use one of obdev's free + * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules! + * *** IMPORTANT NOTE *** + * This template uses obdev's shared VID/PID pair for Vendor Class devices + * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand + * the implications! + */ +#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF) +/* This is the ID of the product, low byte first. It is interpreted in the + * scope of the vendor ID. If you have registered your own VID with usb.org + * or if you have licensed a PID from somebody else, define it here. Otherwise + * you may use one of obdev's free shared VID/PID pairs. See the file + * USB-IDs-for-free.txt for details! + * *** IMPORTANT NOTE *** + * This template uses obdev's shared VID/PID pair for Vendor Class devices + * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand + * the implications! + */ +#define USB_CFG_DEVICE_VERSION 0x00, 0x02 +/* Version number of the device: Minor number first, then major number. + */ +#define USB_CFG_VENDOR_NAME 'P','e','r','c','e','n','t' +#define USB_CFG_VENDOR_NAME_LEN 7 +/* These two values define the vendor name returned by the USB device. The name + * must be given as a list of characters under single quotes. The characters + * are interpreted as Unicode (UTF-16) entities. + * If you don't want a vendor name string, undefine these macros. + * ALWAYS define a vendor name containing your Internet domain name if you use + * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for + * details. + */ +#define USB_CFG_DEVICE_NAME 'S','k','o','g',' ','T','K','L' +#define USB_CFG_DEVICE_NAME_LEN 8 +/* Same as above for the device name. If you don't want a device name, undefine + * the macros. See the file USB-IDs-for-free.txt before you assign a name if + * you use a shared VID/PID. + */ +/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */ +/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */ +/* Same as above for the serial number. If you don't want a serial number, + * undefine the macros. + * It may be useful to provide the serial number through other means than at + * compile time. See the section about descriptor properties below for how + * to fine tune control over USB descriptors such as the string descriptor + * for the serial number. + */ +#define USB_CFG_DEVICE_CLASS 0 +#define USB_CFG_DEVICE_SUBCLASS 0 +/* See USB specification if you want to conform to an existing device class. + * Class 0xff is "vendor specific". + */ +#define USB_CFG_INTERFACE_CLASS 3 /* HID */ +#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */ +#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */ +/* See USB specification if you want to conform to an existing device class or + * protocol. The following classes must be set at interface level: + * HID class is 3, no subclass and protocol required (but may be useful!) + * CDC class is 2, use subclass 2 and protocol 1 for ACM + */ +#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0 +/* Define this to the length of the HID report descriptor, if you implement + * an HID device. Otherwise don't define it or define it to 0. + * If you use this define, you must add a PROGMEM character array named + * "usbHidReportDescriptor" to your code which contains the report descriptor. + * Don't forget to keep the array and this define in sync! + */ + +/* #define USB_PUBLIC static */ +/* Use the define above if you #include usbdrv.c instead of linking against it. + * This technique saves a couple of bytes in flash memory. + */ + +/* ------------------- Fine Control over USB Descriptors ------------------- */ +/* If you don't want to use the driver's default USB descriptors, you can + * provide our own. These can be provided as (1) fixed length static data in + * flash memory, (2) fixed length static data in RAM or (3) dynamically at + * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more + * information about this function. + * Descriptor handling is configured through the descriptor's properties. If + * no properties are defined or if they are 0, the default descriptor is used. + * Possible properties are: + * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched + * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is + * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if + * you want RAM pointers. + * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found + * in static memory is in RAM, not in flash memory. + * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash), + * the driver must know the descriptor's length. The descriptor itself is + * found at the address of a well known identifier (see below). + * List of static descriptor names (must be declared PROGMEM if in flash): + * char usbDescriptorDevice[]; + * char usbDescriptorConfiguration[]; + * char usbDescriptorHidReport[]; + * char usbDescriptorString0[]; + * int usbDescriptorStringVendor[]; + * int usbDescriptorStringDevice[]; + * int usbDescriptorStringSerialNumber[]; + * Other descriptors can't be provided statically, they must be provided + * dynamically at runtime. + * + * Descriptor properties are or-ed or added together, e.g.: + * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18)) + * + * The following descriptors are defined: + * USB_CFG_DESCR_PROPS_DEVICE + * USB_CFG_DESCR_PROPS_CONFIGURATION + * USB_CFG_DESCR_PROPS_STRINGS + * USB_CFG_DESCR_PROPS_STRING_0 + * USB_CFG_DESCR_PROPS_STRING_VENDOR + * USB_CFG_DESCR_PROPS_STRING_PRODUCT + * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER + * USB_CFG_DESCR_PROPS_HID + * USB_CFG_DESCR_PROPS_HID_REPORT + * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver) + * + * Note about string descriptors: String descriptors are not just strings, they + * are Unicode strings prefixed with a 2 byte header. Example: + * int serialNumberDescriptor[] = { + * USB_STRING_DESCRIPTOR_HEADER(6), + * 'S', 'e', 'r', 'i', 'a', 'l' + * }; + */ + +#define USB_CFG_DESCR_PROPS_DEVICE 0 +#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC +//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0 +#define USB_CFG_DESCR_PROPS_STRINGS 0 +#define USB_CFG_DESCR_PROPS_STRING_0 0 +#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0 +#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0 +#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0 +#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC +//#define USB_CFG_DESCR_PROPS_HID 0 +#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC +//#define USB_CFG_DESCR_PROPS_HID_REPORT 0 +#define USB_CFG_DESCR_PROPS_UNKNOWN 0 + +#define usbMsgPtr_t unsigned short +/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to + * a scalar type here because gcc generates slightly shorter code for scalar + * arithmetics than for pointer arithmetics. Remove this define for backward + * type compatibility or define it to an 8 bit type if you use data in RAM only + * and all RAM is below 256 bytes (tiny memory model in IAR CC). + */ + +/* ----------------------- Optional MCU Description ------------------------ */ + +/* The following configurations have working defaults in usbdrv.h. You + * usually don't need to set them explicitly. Only if you want to run + * the driver on a device which is not yet supported or with a compiler + * which is not fully supported (such as IAR C) or if you use a differnt + * interrupt than INT0, you may have to define some of these. + */ +/* #define USB_INTR_CFG MCUCR */ +/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */ +/* #define USB_INTR_CFG_CLR 0 */ +/* #define USB_INTR_ENABLE GIMSK */ +/* #define USB_INTR_ENABLE_BIT INT0 */ +/* #define USB_INTR_PENDING GIFR */ +/* #define USB_INTR_PENDING_BIT INTF0 */ +/* #define USB_INTR_VECTOR INT0_vect */ + +/* Set INT1 for D- falling edge to count SOF */ +/* #define USB_INTR_CFG EICRA */ +#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10)) +/* #define USB_INTR_CFG_CLR 0 */ +/* #define USB_INTR_ENABLE EIMSK */ +#define USB_INTR_ENABLE_BIT INT1 +/* #define USB_INTR_PENDING EIFR */ +#define USB_INTR_PENDING_BIT INTF1 +#define USB_INTR_VECTOR INT1_vect + +#endif /* __usbconfig_h_included__ */ From fbcbf4492685108a7f257df4e06871abd9def4d7 Mon Sep 17 00:00:00 2001 From: Kyle Brown Date: Fri, 28 Dec 2018 10:31:15 -0800 Subject: [PATCH 759/788] Update feature_advanced_keycodes.md (#3672) * Update feature_advanced_keycodes.md Probably a better way to word it, but I've solved this issue on reddit several times, had to solve this for friends, ect. It's something worth being in the docs as it's a common issue, and not always intuitive. I have offered this change as I was told by several people "It was never mentioned in the docs". * Update feature_advanced_keycodes.md Clear up what was meant to be said. --- docs/feature_advanced_keycodes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/feature_advanced_keycodes.md b/docs/feature_advanced_keycodes.md index bda497233..8c0a22fc6 100644 --- a/docs/feature_advanced_keycodes.md +++ b/docs/feature_advanced_keycodes.md @@ -21,7 +21,7 @@ Additionally, if at least one right-handed modifier is specified in a Mod Tap or # Switching and Toggling Layers -These functions allow you to activate layers in various ways. Note that layers are not generally independent layouts -- multiple layers can be activated at once, and it's typical for layers to use `KC_TRNS` to allow keypresses to pass through to lower layers. For a detailed explanation of layers, see [Keymap Overview](keymap.md#keymap-and-layers) +These functions allow you to activate layers in various ways. Note that layers are not generally independent layouts -- multiple layers can be activated at once, and it's typical for layers to use `KC_TRNS` to allow keypresses to pass through to lower layers. For a detailed explanation of layers, see [Keymap Overview](keymap.md#keymap-and-layers) When using momentary layer switching with MO(), LM(), TT(), or LT(), make sure to leave the key on the above layers transparent or it may not work as intended. * `DF(layer)` - switches the default layer. The default layer is the always-active base layer that other layers stack on top of. See below for more about the default layer. This might be used to switch from QWERTY to Dvorak layout. (Note that this is a temporary switch that only persists until the keyboard loses power. To modify the default layer in a persistent way requires deeper customization, such as calling the `set_single_persistent_default_layer` function inside of [process_record_user](custom_quantum_functions.md#programming-the-behavior-of-any-keycode).) * `MO(layer)` - momentarily activates *layer*. As soon as you let go of the key, the layer is deactivated. From 93b004c943a4b13bd640fc83000e910b72cb4640 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20=C4=90or=C4=91evi=C4=87?= Date: Fri, 28 Dec 2018 20:07:56 +0100 Subject: [PATCH 760/788] Keep pressed keys on layer state change (fixes #2053, #2279) (#3905) * Keep pressed keys on layer state change * Add doc comment for clear_keyboard_but_mods_and_keys * Keep pressed keys only if PREVENT_STUCK_MODIFIERS is on * Check STRICT_LAYER_RELEASE instead of PREVENT_STUCK_MODIFIERS --- tmk_core/common/action.c | 11 ++++++++++- tmk_core/common/action.h | 1 + tmk_core/common/action_layer.c | 8 ++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/tmk_core/common/action.c b/tmk_core/common/action.c index 456d1e25f..b99c2acaa 100644 --- a/tmk_core/common/action.c +++ b/tmk_core/common/action.c @@ -898,10 +898,19 @@ void clear_keyboard(void) * FIXME: Needs documentation. */ void clear_keyboard_but_mods(void) +{ + clear_keys(); + clear_keyboard_but_mods_and_keys(); +} + +/** \brief Utilities for actions. (FIXME: Needs better description) + * + * FIXME: Needs documentation. + */ +void clear_keyboard_but_mods_and_keys() { clear_weak_mods(); clear_macro_mods(); - clear_keys(); send_keyboard_report(); #ifdef MOUSEKEY_ENABLE mousekey_clear(); diff --git a/tmk_core/common/action.h b/tmk_core/common/action.h index 5d797fd62..8e47e5339 100644 --- a/tmk_core/common/action.h +++ b/tmk_core/common/action.h @@ -94,6 +94,7 @@ void unregister_mods(uint8_t mods); //void set_mods(uint8_t mods); void clear_keyboard(void); void clear_keyboard_but_mods(void); +void clear_keyboard_but_mods_and_keys(void); void layer_switch(uint8_t new_layer); bool is_tap_key(keypos_t key); diff --git a/tmk_core/common/action_layer.c b/tmk_core/common/action_layer.c index b8dcb34f3..120ce3f51 100644 --- a/tmk_core/common/action_layer.c +++ b/tmk_core/common/action_layer.c @@ -44,7 +44,11 @@ static void default_layer_state_set(uint32_t state) default_layer_debug(); debug(" to "); default_layer_state = state; default_layer_debug(); debug("\n"); +#ifdef STRICT_LAYER_RELEASE clear_keyboard_but_mods(); // To avoid stuck keys +#else + clear_keyboard_but_mods_and_keys(); // Don't reset held keys +#endif } /** \brief Default Layer Print @@ -127,7 +131,11 @@ void layer_state_set(uint32_t state) layer_debug(); dprint(" to "); layer_state = state; layer_debug(); dprintln(); +#ifdef STRICT_LAYER_RELEASE clear_keyboard_but_mods(); // To avoid stuck keys +#else + clear_keyboard_but_mods_and_keys(); // Don't reset held keys +#endif } /** \brief Layer clear From c0859ac096f1e4251351bb0a5a04b3ae4a9451f4 Mon Sep 17 00:00:00 2001 From: Danny Date: Fri, 28 Dec 2018 16:02:53 -0500 Subject: [PATCH 761/788] Update split keyboard docs (#4735) * Remove unused I2C_MASTER_RIGHT setting * Update documentation about split keyboard options --- docs/config_options.md | 37 +++++++++++++++++++++++++++++-- quantum/split_common/serial.c | 2 +- quantum/split_common/split_util.c | 3 +-- 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/docs/config_options.md b/docs/config_options.md index 4bbc5debd..085ab3ee5 100644 --- a/docs/config_options.md +++ b/docs/config_options.md @@ -197,8 +197,27 @@ If you define these options you will enable the associated feature, which may in Split Keyboard specific options, make sure you have 'SPLIT_KEYBOARD = yes' in your rules.mk -* `#define SPLIT_HAND_PIN B7` - * For using high/low pin to determine handedness, low = right hand, high = left hand. Replace 'B7' with the pin you are using. This is optional and you can still use the EEHANDS method or MASTER_LEFT / MASTER_RIGHT defines like the stock Let's Split uses. +### Setting Handedness + +One thing to remember, the side that the USB port is plugged into is always the master half. The side not plugged into USB is the slave. + +There are a few different ways to set handedness for split keyboards (listed in order of precedence): + +1. Set `SPLIT_HAND_PIN`: Reads a pin to determine handedness. If pin is high, it's the left side, if low, the half is determined to be the right side +2. Set `EE_HANDS` and flash `eeprom-lefthand.eep`/`eeprom-righthand.eep` to each half +3. Set `MASTER_RIGHT`: Half that is plugged into the USB port is determined to be the master and right half (inverse of the default) +4. Default: The side that is plugged into the USB port is the master half and is assumed to be the left half. The slave side is the right half + +* `#define SPLIT_HAND_PIN B7` + * For using high/low pin to determine handedness, low = right hand, high = left hand. Replace `B7` with the pin you are using. This is optional, and if you leave `SPLIT_HAND_PIN` undefined, then you can still use the EE_HANDS method or MASTER_LEFT / MASTER_RIGHT defines like the stock Let's Split uses. + +* `#define EE_HANDS` (only works if `SPLIT_HAND_PIN` is not defined) + * Reads the handedness value stored in the EEPROM after `eeprom-lefthand.eep`/`eeprom-righthand.eep` has been flashed to their respective halves. + +* `#define MASTER_RIGHT` + * Master half is defined to be the right half. + +### Other Options * `#define USE_I2C` * For using I2C instead of Serial (defaults to serial) @@ -206,6 +225,20 @@ Split Keyboard specific options, make sure you have 'SPLIT_KEYBOARD = yes' in yo * `#define SOFT_SERIAL_PIN D0` * When using serial, define this. `D0` or `D1`,`D2`,`D3`,`E6`. +* `#define MATRIX_ROW_PINS_RIGHT { }` +* `#define MATRIX_COL_PINS_RIGHT { }` + * If you want to specify a different pinout for the right half than the left half, you can define `MATRIX_ROW_PINS_RIGHT`/`MATRIX_COL_PINS_RIGHT`. Currently, the size of `MATRIX_ROW_PINS` must be the same as `MATRIX_ROW_PINS_RIGHT` and likewise for the definition of columns. + +* `#define SELECT_SOFT_SERIAL_SPEED ` (default speed is 1) + * Sets the protocol speed when using serial communication + * Speeds: + * 0: about 189kbps (Experimental only) + * 1: about 137kbps (default) + * 2: about 75kbps + * 3: about 39kbps + * 4: about 26kbps + * 5: about 20kbps + # The `rules.mk` File This is a [make](https://www.gnu.org/software/make/manual/make.html) file that is included by the top-level `Makefile`. It is used to set some information about the MCU that we will be compiling for as well as enabling and disabling certain features. diff --git a/quantum/split_common/serial.c b/quantum/split_common/serial.c index 4df8d103b..1315377a3 100644 --- a/quantum/split_common/serial.c +++ b/quantum/split_common/serial.c @@ -90,7 +90,7 @@ #ifndef SELECT_SOFT_SERIAL_SPEED #define SELECT_SOFT_SERIAL_SPEED 1 -// 0: about 189kbps (Experiment only) +// 0: about 189kbps (Experimental only) // 1: about 137kbps (default) // 2: about 75kbps // 3: about 39kbps diff --git a/quantum/split_common/split_util.c b/quantum/split_common/split_util.c index e4475c535..da04c8d3f 100644 --- a/quantum/split_common/split_util.c +++ b/quantum/split_common/split_util.c @@ -36,8 +36,7 @@ static void setup_handedness(void) { #ifdef EE_HANDS isLeftHand = eeprom_read_byte(EECONFIG_HANDEDNESS); #else - // I2C_MASTER_RIGHT is deprecated, use MASTER_RIGHT instead, since this works for both serial and i2c - #if defined(I2C_MASTER_RIGHT) || defined(MASTER_RIGHT) + #ifdef(MASTER_RIGHT) isLeftHand = !has_usb(); #else isLeftHand = has_usb(); From 6b46c06018324d78bed863d823df53d71cefb2fd Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 28 Dec 2018 13:37:23 -0800 Subject: [PATCH 762/788] Fix Split Common Split_util.c typo --- quantum/split_common/split_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quantum/split_common/split_util.c b/quantum/split_common/split_util.c index da04c8d3f..c613f265a 100644 --- a/quantum/split_common/split_util.c +++ b/quantum/split_common/split_util.c @@ -36,7 +36,7 @@ static void setup_handedness(void) { #ifdef EE_HANDS isLeftHand = eeprom_read_byte(EECONFIG_HANDEDNESS); #else - #ifdef(MASTER_RIGHT) + #ifdef MASTER_RIGHT isLeftHand = !has_usb(); #else isLeftHand = has_usb(); From 2c6c483096f2ec1f37943975e9d62b901884c835 Mon Sep 17 00:00:00 2001 From: Max <17062872+westfoxtrot@users.noreply.github.com> Date: Sat, 29 Dec 2018 00:07:47 +0100 Subject: [PATCH 763/788] refactored cyclops keyboard project (#4734) * refactored cyclops keyboard project Moved the files into a subfolder to allow consistency in preparation for additional commits to come in the future. made some small adjustments to the configuration and keymap * Update keyboards/westfoxtrot/cyclops/keymaps/default/keymap.c Co-Authored-By: westfoxtrot <17062872+westfoxtrot@users.noreply.github.com> * Update keyboards/westfoxtrot/cyclops/readme.md Co-Authored-By: westfoxtrot <17062872+westfoxtrot@users.noreply.github.com> * Update keyboards/westfoxtrot/cyclops/readme.md Co-Authored-By: westfoxtrot <17062872+westfoxtrot@users.noreply.github.com> * Update keyboards/westfoxtrot/cyclops/readme.md Co-Authored-By: westfoxtrot <17062872+westfoxtrot@users.noreply.github.com> --- keyboards/cyclops/keymaps/default/keymap.c | 65 ------------------- keyboards/{ => westfoxtrot}/cyclops/config.h | 14 ++-- keyboards/{ => westfoxtrot}/cyclops/cyclops.c | 4 +- keyboards/{ => westfoxtrot}/cyclops/cyclops.h | 2 +- keyboards/{ => westfoxtrot}/cyclops/info.json | 2 +- .../cyclops/keymaps/default/config.h | 0 .../cyclops/keymaps/default/keymap.c | 53 +++++++++++++++ .../cyclops/keymaps/default/readme.md | 0 keyboards/{ => westfoxtrot}/cyclops/readme.md | 14 ++-- keyboards/{ => westfoxtrot}/cyclops/rules.mk | 10 +-- 10 files changed, 76 insertions(+), 88 deletions(-) delete mode 100644 keyboards/cyclops/keymaps/default/keymap.c rename keyboards/{ => westfoxtrot}/cyclops/config.h (97%) rename keyboards/{ => westfoxtrot}/cyclops/cyclops.c (97%) rename keyboards/{ => westfoxtrot}/cyclops/cyclops.h (98%) rename keyboards/{ => westfoxtrot}/cyclops/info.json (99%) rename keyboards/{ => westfoxtrot}/cyclops/keymaps/default/config.h (100%) create mode 100644 keyboards/westfoxtrot/cyclops/keymaps/default/keymap.c rename keyboards/{ => westfoxtrot}/cyclops/keymaps/default/readme.md (100%) rename keyboards/{ => westfoxtrot}/cyclops/readme.md (51%) rename keyboards/{ => westfoxtrot}/cyclops/rules.mk (91%) diff --git a/keyboards/cyclops/keymaps/default/keymap.c b/keyboards/cyclops/keymaps/default/keymap.c deleted file mode 100644 index 875fbe244..000000000 --- a/keyboards/cyclops/keymaps/default/keymap.c +++ /dev/null @@ -1,65 +0,0 @@ -/* Copyright 2018 'mechmerlin' - * - * 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 . - */ -#include QMK_KEYBOARD_H - -// Defines the keycodes used by our macros in process_record_user -enum custom_keycodes { - QMKBEST = SAFE_RANGE, - QMKURL -}; - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = LAYOUT( - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_PGUP, - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_PGDN, - KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_RGHT, - KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, MO(1), KC_0, KC_UP, - KC_CAPS, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_ENT, KC_DOWN), -}; - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case QMKBEST: - if (record->event.pressed) { - // when keycode QMKBEST is pressed - SEND_STRING("QMK is the best thing ever!"); - } else { - // when keycode QMKBEST is released - } - break; - case QMKURL: - if (record->event.pressed) { - // when keycode QMKURL is pressed - SEND_STRING("https://qmk.fm/" SS_TAP(X_ENTER)); - } else { - // when keycode QMKURL is released - } - break; - } - return true; -} - -void matrix_init_user(void) { - -} - -void matrix_scan_user(void) { - -} - -void led_set_user(uint8_t usb_led) { - -} diff --git a/keyboards/cyclops/config.h b/keyboards/westfoxtrot/cyclops/config.h similarity index 97% rename from keyboards/cyclops/config.h rename to keyboards/westfoxtrot/cyclops/config.h index d6b637345..f54f818d5 100644 --- a/keyboards/cyclops/config.h +++ b/keyboards/westfoxtrot/cyclops/config.h @@ -1,5 +1,5 @@ /* -Copyright 2018 'mechmerlin' +Copyright 2018 westfoxtrot 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 @@ -20,12 +20,12 @@ along with this program. If not, see . #include "config_common.h" /* USB Device descriptor parameter */ -#define VENDOR_ID 0xFEED -#define PRODUCT_ID 0x0000 +#define VENDOR_ID 0x21FF +#define PRODUCT_ID 0x0A66 #define DEVICE_VER 0x0001 -#define MANUFACTURER You +#define MANUFACTURER westfoxtrot #define PRODUCT cyclops -#define DESCRIPTION A custom 66% keyboard +#define DESCRIPTION AEK66 /* key matrix size */ #define MATRIX_ROWS 5 @@ -187,9 +187,7 @@ along with this program. If not, see . /* #define LCD_LINES 2 //< number of visible lines of the display #define LCD_DISP_LENGTH 16 //< visibles characters per line of the display - #define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode - #if LCD_IO_MODE #define LCD_PORT PORTB //< port for the LCD lines #define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 @@ -211,4 +209,4 @@ along with this program. If not, see . /* Bootmagic Lite key configuration */ // #define BOOTMAGIC_LITE_ROW 0 -// #define BOOTMAGIC_LITE_COLUMN 0 +// #define BOOTMAGIC_LITE_COLUMN 0 \ No newline at end of file diff --git a/keyboards/cyclops/cyclops.c b/keyboards/westfoxtrot/cyclops/cyclops.c similarity index 97% rename from keyboards/cyclops/cyclops.c rename to keyboards/westfoxtrot/cyclops/cyclops.c index 8a15e8950..aea51e6b3 100644 --- a/keyboards/cyclops/cyclops.c +++ b/keyboards/westfoxtrot/cyclops/cyclops.c @@ -1,4 +1,4 @@ -/* Copyright 2018 'mechmerlin' +/* Copyright 2018 westfoxtrot * * 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 @@ -40,4 +40,4 @@ void led_set_kb(uint8_t usb_led) { // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here led_set_user(usb_led); -} +} \ No newline at end of file diff --git a/keyboards/cyclops/cyclops.h b/keyboards/westfoxtrot/cyclops/cyclops.h similarity index 98% rename from keyboards/cyclops/cyclops.h rename to keyboards/westfoxtrot/cyclops/cyclops.h index d85b4e903..f32d2fd44 100644 --- a/keyboards/cyclops/cyclops.h +++ b/keyboards/westfoxtrot/cyclops/cyclops.h @@ -1,4 +1,4 @@ -/* Copyright 2018 'mechmerlin' +/* Copyright 2018 westfoxtrot * * 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 diff --git a/keyboards/cyclops/info.json b/keyboards/westfoxtrot/cyclops/info.json similarity index 99% rename from keyboards/cyclops/info.json rename to keyboards/westfoxtrot/cyclops/info.json index e0e91222b..a215a8a3d 100644 --- a/keyboards/cyclops/info.json +++ b/keyboards/westfoxtrot/cyclops/info.json @@ -9,4 +9,4 @@ "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Page Up", "x":15.5, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"Page Down", "x":15.5, "y":1}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"~", "x":12.75, "y":2}, {"label":"Shift", "x":0, "y":3, "w":1.5}, {"label":"|", "x":1.5, "y":3}, {"label":"Z", "x":2.5, "y":3}, {"label":"X", "x":3.5, "y":3}, {"label":"C", "x":4.5, "y":3}, {"label":"V", "x":5.5, "y":3}, {"label":"B", "x":6.5, "y":3}, {"label":"N", "x":7.5, "y":3}, {"label":"M", "x":8.5, "y":3}, {"label":"<", "x":9.5, "y":3}, {"label":">", "x":10.5, "y":3}, {"label":"?", "x":11.5, "y":3}, {"x":12.5, "y":3}, {"label":"Shift", "x":13.5, "y":3}, {"label":"\u2191", "x":14.5, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.5}, {"label":"Win", "x":1.5, "y":4, "w":1.25}, {"label":"Alt", "x":2.75, "y":4, "w":1.5}, {"x":4.25, "y":4, "w":6.5}, {"label":"Alt", "x":10.75, "y":4, "w":1.5}, {"label":"Ctrl", "x":12.25, "y":4, "w":1.25}, {"label":"\u2190", "x":13.5, "y":4}, {"label":"\u2193", "x":14.5, "y":4}, {"label":"\u2192", "x":15.5, "y":4}] } } -} +} \ No newline at end of file diff --git a/keyboards/cyclops/keymaps/default/config.h b/keyboards/westfoxtrot/cyclops/keymaps/default/config.h similarity index 100% rename from keyboards/cyclops/keymaps/default/config.h rename to keyboards/westfoxtrot/cyclops/keymaps/default/config.h diff --git a/keyboards/westfoxtrot/cyclops/keymaps/default/keymap.c b/keyboards/westfoxtrot/cyclops/keymaps/default/keymap.c new file mode 100644 index 000000000..c850b9da0 --- /dev/null +++ b/keyboards/westfoxtrot/cyclops/keymaps/default/keymap.c @@ -0,0 +1,53 @@ +/* Copyright 2018 westfoxtrot + * + * 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 . + */ + +#include QMK_KEYBOARD_H + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + // Default layer + [0] = LAYOUT( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_PGUP, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_PGDN, + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_NO, KC_RSFT, KC_UP, + KC_CAPS, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT), + + // Fn1 Layer + [1] = LAYOUT( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F11, KC_DEL, KC_HOME, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_END, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_ENT, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RESET, _______, _______, _______, _______, _______, _______, _______, _______), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/cyclops/keymaps/default/readme.md b/keyboards/westfoxtrot/cyclops/keymaps/default/readme.md similarity index 100% rename from keyboards/cyclops/keymaps/default/readme.md rename to keyboards/westfoxtrot/cyclops/keymaps/default/readme.md diff --git a/keyboards/cyclops/readme.md b/keyboards/westfoxtrot/cyclops/readme.md similarity index 51% rename from keyboards/cyclops/readme.md rename to keyboards/westfoxtrot/cyclops/readme.md index fcf6c1546..e026c4119 100644 --- a/keyboards/cyclops/readme.md +++ b/keyboards/westfoxtrot/cyclops/readme.md @@ -1,13 +1,15 @@ -# Cyclops +# cyclops -66% Alps Keyboard in ISO layout. +![cyclops](https://github.com/westfoxtrot/Cyclops) -Keyboard Maintainer: [MechMerlin](https://github.com/mechmerlin) -Hardware Supported: 66% Alps Keyboard -Hardware Availability: A very limited number were made. +66% Alps Keyboard in ISO layout. + + Keyboard Maintainer: [westfoxtrot](https://github.com/westfoxtrot) + Hardware Supported: Cyclops (AEKISO66) PCB + Hardware Availability: Files released here (https://github.com/westfoxtrot/Cyclops) Make example for this keyboard (after setting up your build environment): - make cyclops:default + make westfoxtrot/cyclops:default 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). diff --git a/keyboards/cyclops/rules.mk b/keyboards/westfoxtrot/cyclops/rules.mk similarity index 91% rename from keyboards/cyclops/rules.mk rename to keyboards/westfoxtrot/cyclops/rules.mk index bc370be03..10ea51391 100644 --- a/keyboards/cyclops/rules.mk +++ b/keyboards/westfoxtrot/cyclops/rules.mk @@ -62,14 +62,14 @@ BOOTLOADER = atmel-dfu # change yes to no to disable # BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = yes # Console for debug(+400) -COMMAND_ENABLE = yes # Commands for debug and configuration +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend # if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -NKRO_ENABLE = no # USB Nkey Rollover +NKRO_ENABLE = yes # USB Nkey Rollover BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) @@ -77,4 +77,4 @@ UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID AUDIO_ENABLE = no # Audio output on port C6 FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches -HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) \ No newline at end of file From d9abb833e54ff8981a2bc1d17c6f863b49430fcd Mon Sep 17 00:00:00 2001 From: Jason Thigpen Date: Fri, 28 Dec 2018 22:27:35 -0800 Subject: [PATCH 764/788] Add my zeal60 keymap (#4732) * Add my zeal60 keymap * Temporarily remove failing community layout from zeal60 make rules * Revert "Temporarily remove failing community layout from zeal60 make rules" This reverts commit ffd0018fb1dcf3d5f90d4a226c437d4e85430cce. --- keyboards/zeal60/keymaps/crd/config.h | 29 ++++++++++++++++++++ keyboards/zeal60/keymaps/crd/keymap.c | 39 +++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 keyboards/zeal60/keymaps/crd/config.h create mode 100644 keyboards/zeal60/keymaps/crd/keymap.c diff --git a/keyboards/zeal60/keymaps/crd/config.h b/keyboards/zeal60/keymaps/crd/config.h new file mode 100644 index 000000000..a70f9da7e --- /dev/null +++ b/keyboards/zeal60/keymaps/crd/config.h @@ -0,0 +1,29 @@ +#pragma once + +/* enable/disable LEDs based on layout */ +#undef RGB_BACKLIGHT_USE_SPLIT_BACKSPACE +#define RGB_BACKLIGHT_USE_SPLIT_BACKSPACE 0 + +#undef RGB_BACKLIGHT_USE_SPLIT_LEFT_SHIFT +#define RGB_BACKLIGHT_USE_SPLIT_LEFT_SHIFT 0 + +#undef RGB_BACKLIGHT_USE_SPLIT_RIGHT_SHIFT +#define RGB_BACKLIGHT_USE_SPLIT_RIGHT_SHIFT 1 + +#undef RGB_BACKLIGHT_USE_7U_SPACEBAR +#define RGB_BACKLIGHT_USE_7U_SPACEBAR 1 + +#undef RGB_BACKLIGHT_USE_ISO_ENTER +#define RGB_BACKLIGHT_USE_ISO_ENTER 0 + +#undef RGB_BACKLIGHT_DISABLE_HHKB_BLOCKER_LEDS +#define RGB_BACKLIGHT_DISABLE_HHKB_BLOCKER_LEDS 0 + +#undef RGB_BACKLIGHT_DISABLE_WHEN_USB_SUSPENDED +#define RGB_BACKLIGHT_DISABLE_WHEN_USB_SUSPENDED 1 + +#undef RGB_BACKLIGHT_DISABLE_AFTER_TIMEOUT +#define RGB_BACKLIGHT_DISABLE_AFTER_TIMEOUT 3 + +#undef RGB_BACKLIGHT_EFFECT +#define RGB_BACKLIGHT_EFFECT 0 \ No newline at end of file diff --git a/keyboards/zeal60/keymaps/crd/keymap.c b/keyboards/zeal60/keymaps/crd/keymap.c new file mode 100644 index 000000000..971782561 --- /dev/null +++ b/keyboards/zeal60/keymaps/crd/keymap.c @@ -0,0 +1,39 @@ +// tsangan layout for Zeal60 +#include QMK_KEYBOARD_H + +enum keyboard_layers { + _BL = 0, // Base Layer + _FL, // Function Layer + _CL // Control Layer +}; + +// Custom #defined keycodes (shorter macros for readability) +#define KC_CTES CTL_T(KC_ESC) +#define KC_RSUP RSFT_T(KC_UP) +#define KC_RGLT RCMD_T(KC_LEFT) +#define KC_RADN LT(_CL, KC_DOWN) +#define KC_RCRT RCTL_T(KC_RIGHT) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BL] = LAYOUT_60_ansi_split_bs_rshift( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, XXXXXXX, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, + KC_CTES, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSUP, MO(_FL), + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, XXXXXXX, KC_RGLT, KC_RADN, KC_RCRT + ), + [_FL] = LAYOUT_60_ansi_split_bs_rshift( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, _______, + _______, KC_HOME, KC_UP, KC_END, _______, _______, _______, _______, KC_MUTE, _______, _______, KC_PGDN, KC_PGUP, _______, + _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, KC_SLCK, KC_VOLD, KC_VOLU, KC_PAUS, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______ + ), + [_CL] = LAYOUT_60_ansi_split_bs_rshift( + _______, EF_DEC, EF_INC, H1_DEC, H1_INC, H2_DEC, H2_INC, _______, _______, _______, _______, BR_DEC, BR_INC, _______, _______, + _______, _______, _______, S1_DEC, S1_INC, S2_DEC, S2_INC, _______, _______, _______, _______, ES_DEC, ES_INC, RESET, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______ + ), +}; From 8443481aea47182683d6b26aa00548e9ebfab82e Mon Sep 17 00:00:00 2001 From: Stephen Gelman Date: Thu, 27 Dec 2018 01:15:58 -0600 Subject: [PATCH 765/788] Fix apparent typo in WhiteFox LED config It seems the led_mask is set incorrectly on the WhiteFox meaning that the LED at C9-1 (the space bar) doesn't get lit. I can't see any reason for this to be intentional so I am pretty sure it's a typo. At the very least it fixes the space bar LED for me. --- keyboards/whitefox/board_is31fl3731c.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/whitefox/board_is31fl3731c.h b/keyboards/whitefox/board_is31fl3731c.h index dea643f10..d59b2ff43 100644 --- a/keyboards/whitefox/board_is31fl3731c.h +++ b/keyboards/whitefox/board_is31fl3731c.h @@ -31,7 +31,7 @@ static const uint8_t led_mask[] = { 0xFF, 0x00, /* C6-1 -> C6-16 */ 0xFF, 0x00, /* C7-1 -> C7-16 */ 0xFF, 0x00, /* C8-1 -> C8-16 */ - 0xFE, 0x00, /* C9-1 -> C9-16 */ + 0xFF, 0x00, /* C9-1 -> C9-16 */ }; // The address of the LED From e2f60eba2f5d44282a6aff35fde9076b0532c23c Mon Sep 17 00:00:00 2001 From: Menchen Date: Tue, 25 Dec 2018 20:01:54 +0100 Subject: [PATCH 766/788] Fix capkey led for dz60. --- keyboards/dz60/dz60.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/keyboards/dz60/dz60.c b/keyboards/dz60/dz60.c index b54ff0117..8295fb432 100644 --- a/keyboards/dz60/dz60.c +++ b/keyboards/dz60/dz60.c @@ -23,11 +23,9 @@ void led_init_ports(void) { void led_set_kb(uint8_t usb_led) { if (usb_led & (1 << USB_LED_CAPS_LOCK)) { - DDRB |= (1 << 2); PORTB &= ~(1 << 2); } else { - DDRB &= ~(1 << 2); - PORTB &= ~(1 << 2); + PORTB |= (1 << 2); } led_set_user(usb_led); From bb1b44132514fc30de7de77f2c6a80b8c7ba0416 Mon Sep 17 00:00:00 2001 From: Giuseppe Rota Date: Sat, 29 Dec 2018 16:04:41 +0100 Subject: [PATCH 767/788] Fix leader processing --- quantum/process_keycode/process_leader.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/quantum/process_keycode/process_leader.c b/quantum/process_keycode/process_leader.c index 57fccdc7e..897e9eabf 100644 --- a/quantum/process_keycode/process_leader.c +++ b/quantum/process_keycode/process_leader.c @@ -68,9 +68,7 @@ bool process_leader(uint16_t keycode, keyrecord_t *record) { } else { if (keycode == KC_LEAD) { qk_leader_start(); - return false; } - break; } } return true; From cc7bf108a93416036e3cd4d3e129abd56dfa9350 Mon Sep 17 00:00:00 2001 From: ginjake Date: Sun, 30 Dec 2018 01:19:34 +0900 Subject: [PATCH 768/788] Keymap: add ginjake keymap for the zinc keyboard (#4741) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * サンシャインぴっかぴかモード実装 * サンシャインぴっかぴかモード --- keyboards/zinc/keymaps/ginjake/config.h | 38 ++ keyboards/zinc/keymaps/ginjake/keymap.c | 368 ++++++++++++++++++++ keyboards/zinc/keymaps/ginjake/readme_jp.md | 123 +++++++ keyboards/zinc/keymaps/ginjake/rules.mk | 98 ++++++ 4 files changed, 627 insertions(+) create mode 100644 keyboards/zinc/keymaps/ginjake/config.h create mode 100644 keyboards/zinc/keymaps/ginjake/keymap.c create mode 100644 keyboards/zinc/keymaps/ginjake/readme_jp.md create mode 100644 keyboards/zinc/keymaps/ginjake/rules.mk diff --git a/keyboards/zinc/keymaps/ginjake/config.h b/keyboards/zinc/keymaps/ginjake/config.h new file mode 100644 index 000000000..4dcb0724f --- /dev/null +++ b/keyboards/zinc/keymaps/ginjake/config.h @@ -0,0 +1,38 @@ +/* +This is the c configuration file for the keymap + +Copyright 2018 monksoffunk +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#pragma once +// if you need more program area, try uncomment follow line +#include "serial_config_simpleapi.h" + +// place overrides here +// Selection of RGBLIGHT MODE to use. +#if defined(LED_ANIMATIONS) + #define RGBLIGHT_EFFECT_BREATHING + #define RGBLIGHT_EFFECT_RAINBOW_MOOD + #define RGBLIGHT_EFFECT_RAINBOW_SWIRL + #define RGBLIGHT_EFFECT_SNAKE + #define RGBLIGHT_EFFECT_KNIGHT + #define RGBLIGHT_EFFECT_CHRISTMAS + #define RGBLIGHT_EFFECT_STATIC_GRADIENT + //#define RGBLIGHT_EFFECT_RGB_TEST + //#define RGBLIGHT_EFFECT_ALTERNATING +#endif diff --git a/keyboards/zinc/keymaps/ginjake/keymap.c b/keyboards/zinc/keymaps/ginjake/keymap.c new file mode 100644 index 000000000..323d2c7d4 --- /dev/null +++ b/keyboards/zinc/keymaps/ginjake/keymap.c @@ -0,0 +1,368 @@ +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +#ifdef RGBLIGHT_ENABLE +//Following line allows macro to read current RGB settings +extern rgblight_config_t rgblight_config; +rgblight_config_t RGB_current_config; +#endif + +extern uint8_t is_master; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +enum layer_number { + _QWERTY = 0, + _COLEMAK, + _DVORAK, + _LOWER, + _RAISE, + _ADJUST +}; + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + LOWER, + RAISE, + ADJUST, + BACKLIT, + KANA, + EISU, + RGBRST, + AQOURS, //サンシャインぴっかぴかモード +}; + +#ifdef RGBLIGHT_ENABLE + //9色に変化するLEDのHSV各パラメータ + int aqours_h[] = { 26, 340, 150, 0, 199, 220, 53, 265, 322}; + int aqours_s[] = {255, 165, 255, 255, 255, 350, 255, 255, 255}; + int aqours_v[] = {255, 255, 255, 255, 255, 255, 255, 255, 255}; + const int NEXT_COLOR_TIME = 2400; //次の色に切り替わるまでの時間 + const int NEXT_CHANGE_TARGET_TIME = 100; //次のキーに色が伝播するまでの時間 + bool aqours_mode = false; + int aqours_next_color_timer_count = 0; + int aqours_num = 0; + int target_col = 0; + + //keyのmatrixの位置とLEDの番号を紐づける + int combined_key_to_led[] = + { + 0,1,2,3,4,5, + 11,10,9,8,7,6, + 12,13,14,15,16,17, + 23,22,21,20,19,18 + }; +#endif + +enum macro_keycodes { + KC_SAMPLEMACRO, +}; + +//Macros +#define M_SAMPLE M(KC_SAMPLEMACRO) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { \ + /* Qwerty + * ,-----------------------------------------. ,-----------------------------------------. + * | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | A | S | D | F | G | | H | J | K | L | ; | ' | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | | N | M | , | . | / |Enter | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Esc |ADJUST| Win | Alt |LOWER |Space | | Space| RAISE| Left | Down | Up | Right| + * `-----------------------------------------' `-----------------------------------------' + */ +[_QWERTY] = LAYOUT_ortho_4x12( + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ + KC_ESC, ADJUST, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ + ), + + /* Colemak + * ,-----------------------------------------. ,-----------------------------------------. + * | Tab | Q | W | F | P | G | | J | L | U | Y | ; | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | A | R | S | T | D | | H | N | E | I | O | ' | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | | K | M | , | . | / |Enter | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Esc |ADJUST| Alt | Win |LOWER |Space | | Space| RAISE| Left | Down | Up | Right| + * `-----------------------------------------' `-----------------------------------------' + */ + [_COLEMAK] = LAYOUT_ortho_4x12( \ + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, \ + KC_LCTL, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ + KC_ESC, ADJUST, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ + ), + + /* Dvorak + * ,-----------------------------------------. ,-----------------------------------------. + * | Tab | ' | , | . | P | Y | | F | G | C | R | L | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | A | O | E | U | I | | D | H | T | N | S | / | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | | B | M | W | V | Z |Enter | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Esc |ADJUST| Alt | Win |LOWER |Space | | Space| RAISE| Left | Down | Up | Right| + * `-----------------------------------------' `-----------------------------------------' + */ + [_DVORAK] = LAYOUT_ortho_4x12( \ + KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_DEL, \ + KC_LCTL, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, \ + KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT , \ + KC_ESC, ADJUST, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ + ), + + /* Lower + * ,-----------------------------------------. ,-----------------------------------------. + * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | - | _ | + | { | } | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | | Home | End | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------' `-----------------------------------------' + */ + [_LOWER] = LAYOUT_ortho_4x12( \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, \ + _______, _______, _______, _______, _______, _______, KC_MINS, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_END, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ + ), + + /* Raise + * ,-----------------------------------------. ,-----------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | F1 | F2 | F3 | F4 | F5 | | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | | F12 | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------' `-----------------------------------------' + */ + [_RAISE] = LAYOUT_ortho_4x12( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \ + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ + ), + + /* Adjust (Lower + Raise) + * ,-----------------------------------------. ,-----------------------------------------. + * | | Reset|RGBRST|Aud on|Audoff| | | |Qwerty|Colemk|Dvorak| | Ins | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * |AQOURS|RGB ON| HUE+ | SAT+ | VAL+ | Mac | | Win | - | = |Print |ScLock|Pause | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | MODE | HUE- | SAT- | VAL- | | | | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | EISU | EISU | EISU | | KANA | KANA | Home |PageDn|PageUp| End | + * `-----------------------------------------' `-----------------------------------------' + */ + [_ADJUST] = LAYOUT_ortho_4x12( \ + _______, RESET, RGBRST, _______, _______, _______, _______, QWERTY, COLEMAK, DVORAK, _______, KC_INS, \ + AQOURS, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, AG_NORM, AG_SWAP, KC_MINS, KC_EQL, KC_PSCR, KC_SLCK, KC_PAUS,\ + _______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, _______, _______, _______, _______, _______, _______, _______,\ + _______, _______, _______, EISU, EISU, EISU, KANA, KANA, KC_HOME, KC_PGDN, KC_PGUP, KC_END\ + ) +}; + +// define variables for reactive RGB +bool TOG_STATUS = false; + +// Setting ADJUST layer RGB back to default +void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) { + if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) { + #ifdef RGBLIGHT_ENABLE + rgblight_mode_noeeprom(RGB_current_config.mode); + #endif + layer_on(layer3); + } else { + layer_off(layer3); + } +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + set_single_persistent_default_layer(_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + set_single_persistent_default_layer(_DVORAK); + } + return false; + break; + + case LOWER: + if (record->event.pressed) { + //not sure how to have keyboard check mode and set it to a variable, so my work around + //uses another variable that would be set to true after the first time a reactive key is pressed. + if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false + } else { + TOG_STATUS = !TOG_STATUS; + #ifdef RGBLIGHT_ENABLE + rgblight_mode_noeeprom(16); + #endif + } + layer_on(_LOWER); + update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); + } else { + #ifdef RGBLIGHT_ENABLE + rgblight_mode_noeeprom(RGB_current_config.mode); // revert RGB to initial mode prior to RGB mode change + #endif + TOG_STATUS = false; + layer_off(_LOWER); + update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + + case RAISE: + if (record->event.pressed) { + //not sure how to have keyboard check mode and set it to a variable, so my work around + //uses another variable that would be set to true after the first time a reactive key is pressed. + if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false + } else { + TOG_STATUS = !TOG_STATUS; + #ifdef RGBLIGHT_ENABLE + rgblight_mode_noeeprom(15); + #endif + } + layer_on(_RAISE); + update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); + } else { + #ifdef RGBLIGHT_ENABLE + rgblight_mode_noeeprom(RGB_current_config.mode); // revert RGB to initial mode prior to RGB mode change + #endif + layer_off(_RAISE); + TOG_STATUS = false; + update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + break; + //led operations - RGB mode change now updates the RGB_current_mode to allow the right RGB mode to be set after reactive keys are released + case RGB_MOD: + #ifdef RGBLIGHT_ENABLE + if (record->event.pressed) { + rgblight_mode_noeeprom(RGB_current_config.mode); + rgblight_step(); + RGB_current_config.mode = rgblight_config.mode; + } + #endif + return false; + break; + + case EISU: + if (record->event.pressed) { + if(keymap_config.swap_lalt_lgui==false){ + register_code(KC_LANG2); + }else{ + SEND_STRING(SS_LALT("`")); + } + } else { + unregister_code(KC_LANG2); + } + return false; + break; + case KANA: + if (record->event.pressed) { + if(keymap_config.swap_lalt_lgui==false){ + register_code(KC_LANG1); + }else{ + SEND_STRING(SS_LALT("`")); + } + } else { + unregister_code(KC_LANG1); + } + return false; + break; + case AQOURS: + #ifdef RGBLIGHT_ENABLE + if (record->event.pressed) { + aqours_mode = !aqours_mode; + } + #endif + break; + case RGBRST: + #ifdef RGBLIGHT_ENABLE + if (record->event.pressed) { + eeconfig_update_rgblight_default(); + rgblight_enable(); + RGB_current_config = rgblight_config; + } + #endif + break; + } + return true; +} + +#ifdef RGBLIGHT_ENABLE + + void aqours_led(void) { + aqours_next_color_timer_count++; + //一定間隔で色が変化 + if (aqours_next_color_timer_count > NEXT_COLOR_TIME) { + aqours_num++; + aqours_next_color_timer_count = 0; + target_col = 0; + if (aqours_num == sizeof(aqours_h) / sizeof(int)) { + aqours_num = 0; + } + } + + //キー毎に時間差で色が変化していく + if (aqours_next_color_timer_count % NEXT_CHANGE_TARGET_TIME == 0) { + if (target_col < MATRIX_COLS) { + sethsv(aqours_h[aqours_num], aqours_s[aqours_num], aqours_v[aqours_num], (LED_TYPE *)&led[target_col]); + sethsv(aqours_h[aqours_num], aqours_s[aqours_num], aqours_v[aqours_num], (LED_TYPE *)&led[11 - target_col]); + sethsv(aqours_h[aqours_num], aqours_s[aqours_num], aqours_v[aqours_num], (LED_TYPE *)&led[12 + target_col]); + sethsv(aqours_h[aqours_num], aqours_s[aqours_num], aqours_v[aqours_num], (LED_TYPE *)&led[23 - target_col]); + target_col++; + rgblight_set(); + } + } + } +#endif + +void matrix_scan_user(void) { + #ifdef RGBLIGHT_ENABLE + if (aqours_mode) { + aqours_led(); + } + #endif +} + +void matrix_init_user(void) { + #ifdef RGBLIGHT_ENABLE + rgblight_init(); + RGB_current_config = rgblight_config; + #endif +} diff --git a/keyboards/zinc/keymaps/ginjake/readme_jp.md b/keyboards/zinc/keymaps/ginjake/readme_jp.md new file mode 100644 index 000000000..f6e91f0c8 --- /dev/null +++ b/keyboards/zinc/keymaps/ginjake/readme_jp.md @@ -0,0 +1,123 @@ +# The Default Zinc Layout +## 配列 + +### Qwerty配列 + +``` + ,-----------------------------------------. ,-----------------------------------------. + | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | + |------+------+------+------+------+------| |------+------+------+------+------+------| + | Ctrl | A | S | D | F | G | | H | J | K | L | ; | ' | + |------+------+------+------+------+------| |------+------+------+------+------+------| + | Shift| Z | X | C | V | B | | N | M | , | . | / |Enter | + |------+------+------+------+------+------| |------+------+------+------+------+------| + | Esc | Fn | Alt | Win |Lower |Space | | Space| Raise| Left | Down | Up | Right| + `------------------------------------------ ------------------------------------------' +``` + +### Colemak + +``` + ,-----------------------------------------. ,-----------------------------------------. + | Tab | Q | W | F | P | G | | J | L | U | Y | ; | Bksp | + |------+------+------+------+------+------| |------+------+------+------+------+------| + | Ctrl | A | R | S | T | D | | H | N | E | I | O | ' | + |------+------+------+------+------+------| |------+------+------+------+------+------| + | Shift| Z | X | C | V | B | | K | M | , | . | / |Enter | + |------+------+------+------+------+------| |------+------+------+------+------+------| + | Esc |ADJUST| Alt | Win |LOWER |Space | | Space| RAISE| Left | Down | Up | Right| + `------------------------------------------ ------------------------------------------' +``` + +### Dvorak + +``` + ,-----------------------------------------. ,-----------------------------------------. + | Tab | ' | , | . | P | Y | | F | G | C | R | L | Del | + |------+------+------+------+------+------| |------+------+------+------+------+------| + | Ctrl | A | O | E | U | I | | D | H | T | N | S | / | + |------+------+------+------+------+------| |------+------+------+------+------+------| + | Shift| ; | Q | J | K | X | | B | M | W | V | Z |Enter | + |------+------+------+------+------+------| |------+------+------+------+------+------| + | Esc |ADJUST| Alt | Win |LOWER |Space | | Space| RAISE| Left | Down | Up | Right| + `-----------------------------------------' `-----------------------------------------' +``` + + +## コンパイルの仕方 + +コンパイルは、qmk_firmware のトップディレクトリで行います。 + +``` +$ cd qmk_firmware +``` +qmk_firmwareでは各キーボードのコンパイルは、`<キーボード名>:<キーマップ名>`という指定で行います。 + +``` +$ make zinc:default +``` + +キーボードへの書き込みまで同時に行うには下記のように`:avrdude`を付けます。 + +``` +$ make zinc:default:avrdude +``` + +コンパイル結果と中間生成物を消去したい場合は以下のようにします。 + +``` +$ make zinc:default:clean +``` + +## カスタマイズ + +コマンドラインからオプションを指定してビルドすることが出来ます。 + +``` +# Zinc keyboard 'default' keymap: convenient command line option +make ZINC= zinc:defualt +# option= back | under | na | ios +# ex. +# make ZINC=under zinc:defualt +# make ZINC=under,ios zinc:defualt +# make ZINC=back zinc:default +# make ZINC=back,na zinc:default +# make ZINC=back,ios zinc:default +``` + +あるいは`qmk_firmware/keyboards/zinc/rev1/keymaps/default/rules.mk` の以下の部分を直接編集して機能を有効化してください。 + +``` +# Zinc keyboard customize +LED_BACK_ENABLE = no # LED backlight (Enable SK6812mini backlight) +LED_UNDERGLOW_ENABLE = no # LED underglow (Enable WS2812 RGB underlight) +LED_ANIMATIONS = yes # LED animations +IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone) + + +``` + +## RGB backlight を有効にする + +rules.mk の下記の部分を編集して no を yes に変更してください。 +``` +LED_BACK_ENABLE = yes # LED backlight (Enable SK6812mini backlight) +``` + + +## RGB Underglow を有効にする + +rules.mk の下記の部分を編集して no を yes に変更してください。 +``` +LED_UNDERGLOW_ENABLE = yes # LED underglow (Enable WS2812 RGB underlight.) +``` + + +## iPad/iPhoneサポートを有効にする。 + +rules.mk の下記の部分を編集して no を yes に変更してください。 +RBG Underglow や RGBバックライトの輝度を抑えて、iPad, iPhone にも接続できるようになります。 + +``` +IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone) +``` \ No newline at end of file diff --git a/keyboards/zinc/keymaps/ginjake/rules.mk b/keyboards/zinc/keymaps/ginjake/rules.mk new file mode 100644 index 000000000..2dcefc001 --- /dev/null +++ b/keyboards/zinc/keymaps/ginjake/rules.mk @@ -0,0 +1,98 @@ + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SWAP_HANDS_ENABLE = no # Enable one-hand typing + +define ZINC_CUSTOMISE_MSG + $(info Zinc customize) + $(info - LED_BACK_ENABLE=$(LED_BACK_ENABLE)) + $(info - LED_UNDERGLOW_ENABLE=$(LED_UNDERGLOW_ENABLE)) + $(info - LED_ANIMATION=$(LED_ANIMATIONS)) + $(info - IOS_DEVICE_ENABLE=$(IOS_DEVICE_ENABLE)) +endef + +# Zinc keyboard customize +LED_BACK_ENABLE = no # LED backlight (Enable SK6812mini backlight) +LED_UNDERGLOW_ENABLE = no # LED underglow (Enable WS2812 RGB underlight) +LED_ANIMATIONS = yes # LED animations +IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone) +Link_Time_Optimization = no # if firmware size over limit, try this option + +#### LED_BACK_ENABLE and LED_UNDERGLOW_ENABLE. +#### Do not enable these with audio at the same time. + +### Zinc keyboard 'default' keymap: convenient command line option +## make ZINC= zinc:defualt +## option= back | under | na | ios +## ex. +## make ZINC=under zinc:defualt +## make ZINC=under,ios zinc:defualt +## make ZINC=back zinc:default +## make ZINC=back,na zinc:default +## make ZINC=back,ios zinc:default + +ifneq ($(strip $(ZINC)),) + ifeq ($(findstring back,$(ZINC)), back) + LED_BACK_ENABLE = yes + else ifeq ($(findstring under,$(ZINC)), under) + LED_UNDERGLOW_ENABLE = yes + endif + ifeq ($(findstring na,$(ZINC)), na) + LED_ANIMATIONS = no + endif + ifeq ($(findstring ios,$(ZINC)), ios) + IOS_DEVICE_ENABLE = yes + endif + $(eval $(call ZINC_CUSTOMISE_MSG)) + $(info ) +endif + +ifeq ($(strip $(LED_BACK_ENABLE)), yes) + RGBLIGHT_ENABLE = yes + OPT_DEFS += -DRGBLED_BACK + ifeq ($(strip $(LED_UNDERGLOW_ENABLE)), yes) + $(eval $(call ZINC_CUSTOMISE_MSG)) + $(error LED_BACK_ENABLE and LED_UNDERGLOW_ENABLE both 'yes') + endif +else ifeq ($(strip $(LED_UNDERGLOW_ENABLE)), yes) + RGBLIGHT_ENABLE = yes +else + RGBLIGHT_ENABLE = no +endif + +ifeq ($(strip $(IOS_DEVICE_ENABLE)), yes) + OPT_DEFS += -DIOS_DEVICE_ENABLE +endif + +ifeq ($(strip $(LED_ANIMATIONS)), yes) +# OPT_DEFS += -DRGBLIGHT_ANIMATIONS + OPT_DEFS += -DLED_ANIMATIONS + +endif + +ifeq ($(strip $(Link_Time_Optimization)),yes) + EXTRAFLAGS += -flto -DUSE_Link_Time_Optimization +endif + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + + +# Uncomment these for debugging +# $(info -- RGBLIGHT_ENABLE=$(RGBLIGHT_ENABLE)) +# $(info -- OPT_DEFS=$(OPT_DEFS)) +# $(info ) From c043edd13871b9ec96cf495b9423da8df7f36965 Mon Sep 17 00:00:00 2001 From: wanleg <32079073+wanleg@users.noreply.github.com> Date: Sun, 30 Dec 2018 07:53:02 -0800 Subject: [PATCH 769/788] Keymap: Wanleg 5x5 Keymap changes (#4738) * config fixes (including for issue #3678) * put back audio * jj40 backlighting setup * jj40 backlighting setup * rules.mk fix * jj40 backlighting settings * iris setup * iris setup * iris setup * iris setup * iris setup - onehand * remove commented-out section * edits due to #4403 * xd75 testing * fix 5x15 layout issues with 5x5 bluetooth & xd75 * commenting out unused placeholders * change iris to more wanleg-like 4x12 layout * formatting changes * onehand layout cleanup/fix * revert temp change * create centre numpad option * 1st working version * change keypad numbers to regular numbers - doesn't work otherwise * adding comparison files, no change to core * fixed 5x5 with cleave * fixed 5x5 with cleave * switch mouse scroll buttons * clean up left/right/centre pad placement in 5x15 layouts * minor comment change * Update layouts/community/ortho_5x15/wanleg/keymap.c Co-Authored-By: wanleg <32079073+wanleg@users.noreply.github.com> * Update layouts/community/ortho_5x15/wanleg/keymap.c Co-Authored-By: wanleg <32079073+wanleg@users.noreply.github.com> * Update layouts/community/ortho_5x15/wanleg/keymap.c Co-Authored-By: wanleg <32079073+wanleg@users.noreply.github.com> * revert to original --- layouts/community/ortho_5x15/wanleg/keymap.c | 137 ++++++++++++------- users/wanleg/rules.mk | 9 ++ users/wanleg/tapdances.c | 4 +- users/wanleg/wanleg.c | 58 +------- users/wanleg/wanleg.h | 71 ++-------- 5 files changed, 110 insertions(+), 169 deletions(-) diff --git a/layouts/community/ortho_5x15/wanleg/keymap.c b/layouts/community/ortho_5x15/wanleg/keymap.c index 51b020fcd..a98f61988 100644 --- a/layouts/community/ortho_5x15/wanleg/keymap.c +++ b/layouts/community/ortho_5x15/wanleg/keymap.c @@ -1,26 +1,71 @@ #include QMK_KEYBOARD_H #include "wanleg.h" -#define _________________BLANK_75__________________ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ #define _________________BLANK_50__________________ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ -#define _________________Num_Row_75________________ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_NLCK + +#if defined(PADC) +#define LAYOUT_75_base( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0a, K0b, K0c, K0d, K0e, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1a, K1b, K1c, K1d, K1e, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2a, K2b, K2c, K2d, K2e, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3a, K3b, K3c, K3d, K3e \ + ) \ + LAYOUT_ortho_5x15_wrapper( \ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_NLCK, QWERTY, GHERKIN, FUNCTION, \ + K00, K01, K02, K03, K04, K05, K0c, K0d, K0e, K06, K07, K08, K09, K0a, K0b, \ + K10, K11, K12, K13, K14, K15, K1c, K1d, K1e, K16, K17, K18, K19, K1a, K1b, \ + K20, K21, K22, K23, K24, K25, K2c, K2d, K2e, K26, K27, K28, K29, K2a, K2b, \ + K30, K31, K32, K33, K34, K35, K3c, K3d, K3e, K36, K37, K38, K39, K3a, K3b \ + ) + +#elif defined(PADL) +#define LAYOUT_75_base( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0a, K0b, K0c, K0d, K0e, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1a, K1b, K1c, K1d, K1e, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2a, K2b, K2c, K2d, K2e, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3a, K3b, K3c, K3d, K3e \ + ) \ + LAYOUT_ortho_5x15_wrapper( \ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_NLCK, QWERTY, GHERKIN, FUNCTION, \ + K0c, K0d, K0e, K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0a, K0b, \ + K1c, K1d, K1e, K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1a, K1b, \ + K2c, K2d, K2e, K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2a, K2b, \ + K3c, K3d, K3e, K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3a, K3b \ + ) + +#else +#define LAYOUT_75_base( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0a, K0b, K0c, K0d, K0e, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1a, K1b, K1c, K1d, K1e, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2a, K2b, K2c, K2d, K2e, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3a, K3b, K3c, K3d, K3e \ + ) \ + LAYOUT_ortho_5x15_wrapper( \ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_NLCK, QWERTY, GHERKIN, FUNCTION, \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0a, K0b, K0c, K0d, K0e, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1a, K1b, K1c, K1d, K1e, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2a, K2b, K2c, K2d, K2e, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3a, K3b, K3c, K3d, K3e \ + ) +#endif + +#define LAYOUT_75_base_wrapper(...) LAYOUT_75_base(__VA_ARGS__) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #if defined(KEYBOARD_40percentclub_5x5) -[GK75] = LAYOUT_ortho_5x15_wrapper( - _________________Num_Row_75________________, QWERTY75, XXXXXXX, FUNCTION75, - _______________GherkinLike_0_______________, KC_KP_7, KC_KP_8, KC_KP_9, - _______________GherkinLike_1_______________, KC_KP_4, KC_KP_5, KC_KP_6, - TD(TD_SFT_CAPS), SFT_T(KC_Z), KC_X, KC_C, LT(NUM75, KC_V), LT(ETC75, KC_B), KC_N, LT(DIR75, KC_M), GUI_T(KC_COMM), ALT_T(KC_DOT), CTL_T(KC_BSPC), SFT_T(KC_ENT), KC_KP_1, KC_KP_2, KC_KP_3, - TD(RST_TAP_DANCE), GHERKIN50, KC_LALT, NUMPAD, NUMBER75, ETCETERA75, KC_SPC,DIRECTION75, KC_RGUI, KC_RALT, KC_DEL, KC_RCTL, KC_KP_0, KC_KP_0, KC_KP_DOT +[_GK] = LAYOUT_75_base_wrapper( + _______________GherkinLike_0_______________, KC_7, KC_8, KC_9, + _______________GherkinLike_1_______________, KC_4, KC_5, KC_6, + TD(TD_SFT_CAPS), SFT_T(KC_Z), KC_X, KC_C, LT(NUM, KC_V), LT(ETC, KC_B), KC_N, LT(DIR, KC_M), GUI_T(KC_COMM), ALT_T(KC_DOT), CTL_T(KC_BSPC), SFT_T(KC_ENT), KC_1, KC_2, KC_3, + TD(RST_TAP_DANCE), GHERKIN50, KC_LALT, NUMPAD, NUMBER, ETCETERA, KC_SPC,DIRECTION, KC_RGUI, KC_RALT, KC_DEL, KC_RCTL, KC_0, KC_0, KC_DOT ), [GK50] = LAYOUT_ortho_5x10_wrapper( - KC_ESC, _______, _______, _______, _______, _______, _______, _______, _______, KC_BSPC, + KC_ESC, _______, _______, _______, _______, _______, _______, _______, _______, KC_BSPC, _______________Gherkin_Row_0_______________, _______________Gherkin_Row_1_______________, _______________Gherkin_Row_2_______________, - TD(RST_TAP_DANCE), GHERKIN75, NUMPAD, gNUMBER, gETCETERA, KC_SPC,gDIRECTION, KC_RGUI, KC_RALT, KC_RGUI + TD(RST_TAP_DANCE), GHERKIN, NUMPAD, gNUMBER, gETCETERA, KC_SPC,gDIRECTION, KC_RGUI, KC_RALT, KC_RGUI ), [gNUM] = LAYOUT_ortho_5x10_wrapper( @@ -65,9 +110,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), #endif #else - /* Gherkin 75 + /* Gherkin * .--------------------------------------------------------------------------------------------------------------------------------------. - * | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | NUMLOCK| qwerty | | FN | + * | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | NUMLOCK| qwerty | gherkin| FN | * |-----------------------------------------------------------------------------------------------------------+--------+--------+--------| * | | 7 | 8 | 9 | * | |--------+--------+--------| @@ -78,17 +123,16 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | 0 | 0 | . | * '--------------------------------------------------------------------------------------------------------------------------------------' */ -[GK75] = LAYOUT_ortho_5x15_wrapper( - _________________Num_Row_75________________, QWERTY75, XXXXXXX, FUNCTION75, - _______________GherkinLike_0_______________, KC_KP_7, KC_KP_8, KC_KP_9, - _______________GherkinLike_1_______________, KC_KP_4, KC_KP_5, KC_KP_6, - TD(TD_SFT_CAPS), SFT_T(KC_Z), KC_X, KC_C, LT(NUM75, KC_V), LT(ETC75, KC_B), KC_N, LT(DIR75, KC_M), GUI_T(KC_COMM), ALT_T(KC_DOT), CTL_T(KC_BSPC), SFT_T(KC_ENT), KC_KP_1, KC_KP_2, KC_KP_3, - KC_LCTL, KC_LGUI, KC_LALT, KC_LALT, NUMBER75, ETCETERA75, KC_SPC,DIRECTION75, KC_RGUI, KC_RALT, KC_DEL, KC_RCTL, KC_KP_0, KC_KP_0, KC_KP_DOT +[_GK] = LAYOUT_75_base_wrapper( + _______________GherkinLike_0_______________, KC_7, KC_8, KC_9, + _______________GherkinLike_1_______________, KC_4, KC_5, KC_6, + _______________GherkinLike_2_______________, KC_1, KC_2, KC_3, + _______________GherkinLike_3_______________, KC_0, KC_0, KC_DOT ), #endif - /* QWERTY 75 +/* QWERTY * .--------------------------------------------------------------------------------------------------------------------------------------. - * | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | NUMLOCK| gherkin| | FN | + * | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | NUMLOCK| qwerty | gherkin| FN | * |-----------------------------------------------------------------------------------------------------------+--------+--------+--------| * | | 7 | 8 | 9 | * | |--------+--------+--------| @@ -99,17 +143,16 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | 0 | 0 | . | * '--------------------------------------------------------------------------------------------------------------------------------------' */ -[QW75] = LAYOUT_ortho_5x15_wrapper( - _________________Num_Row_75________________, GHERKIN75, XXXXXXX, FUNCTION75, - _______________Qwerty_Row__0_______________, KC_KP_7, KC_KP_8, KC_KP_9, - _______________Qwerty_Row__1_______________, KC_KP_4, KC_KP_5, KC_KP_6, - _______________Qwerty_Row__2_______________, KC_KP_1, KC_KP_2, KC_KP_3, - KC_LCTL, KC_LGUI, KC_LALT, KC_LALT, SUBTER75, KC_LSFT, KC_SPC, SUPRA75, KC_RGUI, KC_RALT, KC_DEL, KC_RCTL, KC_KP_0, KC_KP_0, KC_KP_DOT +[_QW] = LAYOUT_75_base_wrapper( + _______________Qwerty_Row__0_______________, KC_7, KC_8, KC_9, + _______________Qwerty_Row__1_______________, KC_4, KC_5, KC_6, + _______________Qwerty_Row__2_______________, KC_1, KC_2, KC_3, + _______________Qwerty_Row__3_______________, KC_0, KC_0, KC_DOT ), - /* SUBTER75 + /* SUBTER * .--------------------------------------------------------------------------------------------------------------------------------------. - * | SUBTER ROW 0 LAYOUT | | | | + * | | | | | | | | | | | | | | | | * |-----------------------------------------------------------------------------------------------------------+--------+-----------------| * | | / | * | - | * | |--------+--------+--------| @@ -120,15 +163,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | * '--------------------------------------------------------------------------------------------------------------------------------------' */ -[SUB75] = LAYOUT_ortho_5x15_wrapper( - _______________SUBTER_Row__0_______________, _______, _______, _______, +[SUB] = LAYOUT_75_base_wrapper( _______________SUBTER_Row__0_______________, KC_PSLS, KC_PAST, KC_PMNS, - _______________SUBTER_Row__1_______________, _______, _______, KC_PPLS, + _______________SUBTER_Row__1_______________, _______, _______, KC_PPLS, _______________SUBTER_Row__2_______________, _______, _______, KC_PENT, - _______, _______, GHERKIN75, _______, _______, _______, KC_ENT, KC_LSFT, _______, _______, _______, _______, _______, _______, _______ + _______________SUBTER_Row__3_______________, _______, _______, _______ ), -/* SUPRA75 +/* SUPRA * .--------------------------------------------------------------------------------------------------------------------------------------. * | | | | | | | | | | | | | | | | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------| @@ -141,15 +183,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | * '--------------------------------------------------------------------------------------------------------------------------------------' */ -[SUP75] = LAYOUT_ortho_5x15_wrapper( - _________________BLANK_75__________________, +[SUP] = LAYOUT_75_base_wrapper( ________________SUPRA_Row_0________________, _______, _______, _______, ________________SUPRA_Row_1________________, _______, _______, _______, ________________SUPRA_Row_2________________, _______, _______, _______, - _________________BLANK_75__________________ + ________________SUPRA_Row_3________________, _______, _______, _______ ), -/* Gherkin 75 Numbers +/* Gherkin Numbers * .--------------------------------------------------------------------------------------------------------------------------------------. * | | | | | | | | | | | | | | | | * |-----------------------------------------------------------------------------------------------------------|--------+-----------------| @@ -162,15 +203,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | * '--------------------------------------------------------------------------------------------------------------------------------------' */ -[NUM75] = LAYOUT_ortho_5x15_wrapper( - _________________BLANK_75__________________, +[NUM] = LAYOUT_75_base_wrapper( _______________NUMBERS_Row_0_______________, KC_PSLS, KC_PAST, KC_PMNS, _______________NUMBERS_Row_1_______________, _______, _______, KC_PPLS, _______________NUMBERS_Row_2_______________, _______, _______, KC_PENT, _______________NUMBERS_Row_3_______________, _______, _______, _______ ), -/* Gherkin 75 Et Cetera +/* Gherkin Et Cetera * .--------------------------------------------------------------------------------------------------------------------------------------. * | | | | | | | | | | | | | | | | * |-----------------------------------------------------------------------------------------------------------|--------+-----------------| @@ -183,15 +223,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | * '--------------------------------------------------------------------------------------------------------------------------------------' */ -[ETC75] = LAYOUT_ortho_5x15_wrapper( - _________________BLANK_75__________________, +[ETC] = LAYOUT_75_base_wrapper( ______________ETCETERA_Row__0______________, _______, _______, _______, ______________ETCETERA_Row__1______________, _______, _______, _______, ______________ETCETERA_Row__2______________, _______, _______, _______, ______________ETCETERA_Row__3______________, _______, _______, _______ ), -/* Gherkin 75 Directional Keys +/* Gherkin Directional Keys * .--------------------------------------------------------------------------------------------------------------------------------------. * | | | | | | | | | | | | | | | | * |-----------------------------------------------------------------------------------------------------------|--------+-----------------| @@ -204,16 +243,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | * '--------------------------------------------------------------------------------------------------------------------------------------' */ -[DIR75] = LAYOUT_ortho_5x15_wrapper( - _________________BLANK_75__________________, +[DIR] = LAYOUT_75_base_wrapper( _____________DIRECTIONS_Row__0_____________, _______, _______, _______, _____________DIRECTIONS_Row__1_____________, _______, _______, _______, _____________DIRECTIONS_Row__2_____________, _______, _______, _______, - _______, _______, QWERTY75, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + _____________DIRECTIONS_Row__3_____________, _______, _______, _______ ), -/* FUNCTION 75 +/* FUNCTION * .--------------------------------------------------------------------------------------------------------------------------------------. * | | | | | | | | | | | | | | | | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------| @@ -226,9 +264,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | MS BT1 | | | | | | MOUS L | MOUS D | MOUS R | * '--------------------------------------------------------------------------------------------------------------------------------------' */ -[FN75] = LAYOUT_ortho_5x15_wrapper( - _________________BLANK_75__________________, - _________________BLANK_75__________________, +[_FN] = LAYOUT_75_base_wrapper( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_CAPS, KC_BTN5, KC_BTN4, KC_BTN3, KC_BTN2, KC_ACL0, KC_ACL2, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, _______, _______, _______, KC_WH_U, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, BL_TOGG, BL_INC, BL_DEC, _______, _______, KC_MS_U, KC_WH_D, _______, _______, _______, _______, _______, _______, KC_BTN1, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R diff --git a/users/wanleg/rules.mk b/users/wanleg/rules.mk index c6569594b..b069cd8d3 100644 --- a/users/wanleg/rules.mk +++ b/users/wanleg/rules.mk @@ -27,4 +27,13 @@ ifeq ($(strip $(BT)), yes) CONSOLE_ENABLE = no # Console for debug(+400) COMMAND_ENABLE = no # Commands for debug and configuration RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +endif + +#move numpad to Left/Centre/Right(default) on 5x15 boards +#example usage: make 4x4:wanleg padc=yes +ifeq ($(strip $(padc)), yes) + OPT_DEFS += -DPADC +endif +ifeq ($(strip $(padl)), yes) + OPT_DEFS += -DPADL endif \ No newline at end of file diff --git a/users/wanleg/tapdances.c b/users/wanleg/tapdances.c index e5051f9ee..1be5636dc 100644 --- a/users/wanleg/tapdances.c +++ b/users/wanleg/tapdances.c @@ -168,7 +168,7 @@ void LYR75_finished (qk_tap_dance_state_t *state, void *user_data) { LYR75tap_state.state = cur_dance(state); switch (LYR75tap_state.state) { case SINGLE_TAP: register_code(KC_PSLS); break; - case DOUBLE_TAP: set_single_persistent_default_layer(GK75); break; + case DOUBLE_TAP: set_single_persistent_default_layer(_GK); break; case DOUBLE_SINGLE_TAP: register_code(KC_PSLS); unregister_code(KC_PSLS); register_code(KC_PSLS); } } @@ -176,7 +176,7 @@ void LYR75_finished (qk_tap_dance_state_t *state, void *user_data) { void LYR75_reset (qk_tap_dance_state_t *state, void *user_data) { switch (LYR75tap_state.state) { case SINGLE_TAP: unregister_code(KC_PSLS); break; - case DOUBLE_TAP: set_single_persistent_default_layer(GK75); break; + case DOUBLE_TAP: set_single_persistent_default_layer(_GK); break; case DOUBLE_SINGLE_TAP: unregister_code(KC_PSLS); } LYR75tap_state.state = 0; diff --git a/users/wanleg/wanleg.c b/users/wanleg/wanleg.c index 4e60c422f..274c74f72 100644 --- a/users/wanleg/wanleg.c +++ b/users/wanleg/wanleg.c @@ -29,18 +29,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } return false; break; - case QWERTY75: - if (record->event.pressed) { - set_single_persistent_default_layer(QW75); - } - return false; - break; - case GHERKIN75: - if (record->event.pressed) { - set_single_persistent_default_layer(GK75); - } - return false; - break; case NUMPAD: if (record->event.pressed) { set_single_persistent_default_layer(PAD); @@ -117,51 +105,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } return false; break; - case SUBTER75: + case FUNCTION: if (record->event.pressed) { - layer_on(SUB75); + layer_on(_FN); } else { - layer_off(SUB75); - } - return false; - break; - case SUPRA75: - if (record->event.pressed) { - layer_on(SUP75); - } else { - layer_off(SUP75); - } - return false; - break; - case NUMBER75: - if (record->event.pressed) { - layer_on(NUM75); - } else { - layer_off(NUM75); - } - return false; - break; - case DIRECTION75: - if (record->event.pressed) { - layer_on(DIR75); - } else { - layer_off(DIR75); - } - return false; - break; - case ETCETERA75: - if (record->event.pressed) { - layer_on(ETC75); - } else { - layer_off(ETC75); - } - return false; - break; - case FUNCTION75: - if (record->event.pressed) { - layer_on(FN75); - } else { - layer_off(FN75); + layer_off(_FN); } return false; break; diff --git a/users/wanleg/wanleg.h b/users/wanleg/wanleg.h index c2644cd6c..9d07760a7 100644 --- a/users/wanleg/wanleg.h +++ b/users/wanleg/wanleg.h @@ -11,72 +11,33 @@ enum userspace_layers { gETC, _GK, _QW, - QW75, - GK75, ONE, SUB, SUP, NUM, DIR, ETC, - SUB75, - SUP75, - NUM75, - DIR75, - ETC75, - FN75, + _FN, PAD, GK50, }; -#elif KEYBOARD_xd75 -enum userspace_layers { - GK75 = 0, - QW75, - SUB75, - SUP75, - NUM75, - DIR75, - ETC75, - FN75, - gGK, - _GK, - _QW, - PAD, - ONE, - SUB, - SUP, - NUM, - DIR, - ETC, - gNUM, - gDIR, - gETC, - GK50, -}; #elif KEYBOARD_40percentclub_5x5 enum userspace_layers { GK50 = 0, + _GK, + _QW, + PAD, gNUM, gDIR, gETC, - GK75, - QW75, - SUB75, - SUP75, - NUM75, - DIR75, - ETC75, - FN75, - PAD, gGK, - _GK, - _QW, ONE, SUB, SUP, NUM, DIR, ETC, + _FN, }; #else enum userspace_layers { @@ -93,14 +54,7 @@ enum userspace_layers { gNUM, gDIR, gETC, - QW75, - GK75, - SUB75, - SUP75, - NUM75, - DIR75, - ETC75, - FN75, + _FN, GK50, }; #endif @@ -109,8 +63,6 @@ enum userspace_custom_keycodes { gGHERKIN = SAFE_RANGE, GHERKIN, QWERTY, - QWERTY75, - GHERKIN75, ONEHAND, SUBTER, SUPRA, @@ -120,12 +72,7 @@ enum userspace_custom_keycodes { gNUMBER, gDIRECTION, gETCETERA, - SUBTER75, - SUPRA75, - NUMBER75, - DIRECTION75, - ETCETERA75, - FUNCTION75, + FUNCTION, NUMPAD, GHERKIN50, @@ -215,14 +162,14 @@ enum { /* Et Cetera * .-----------------------------------------------------------------------------------------. - * | ` | mUP | | | RESET | SHIFT | mScrUp | mScrDn | | \ | + * | ` | mUP | | | RESET | SHIFT | mScrDn | mScrUp | | \ | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| * | mLeft | mDown | mRight | | SHIFT | mBtn3 | mBtn1 | mBtn2 | ; | ' | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| * | Sft//Cp| CAPS | | | | C-A-D | mScrL | mScrR | ALT | DEL | * '-----------------------------------------------------------------------------------------' */ -#define _______________Gherkin_ETC_0_______________ KC_GRV, KC_MS_U, _______,_______, RESET, KC_RSFT, KC_WH_U, KC_WH_D, _______, KC_BSLS +#define _______________Gherkin_ETC_0_______________ KC_GRV, KC_MS_U, _______,_______, RESET, KC_RSFT, KC_WH_D, KC_WH_U, _______, KC_BSLS #define _______________Gherkin_ETC_1_______________ KC_MS_L, KC_MS_D, KC_MS_R,_______, KC_LSFT, KC_BTN3, KC_BTN1, KC_BTN2, KC_SCLN, KC_QUOT #define _______________Gherkin_ETC_2_______________ TD(TD_SFT_CAPS),KC_CAPS, _______,_______, _______, LALT(LCTL(KC_DEL)), KC_WH_L, KC_WH_R, KC_LALT, KC_DEL From c2390bf32156884d6825686c7f13f9c621bab366 Mon Sep 17 00:00:00 2001 From: Matthew Lyon Date: Sun, 30 Dec 2018 07:54:10 -0800 Subject: [PATCH 770/788] Keymap: mattly: more tweaks (#4746) --- keyboards/planck/keymaps/mattly/keymap.c | 92 +++++++++++------------- 1 file changed, 41 insertions(+), 51 deletions(-) diff --git a/keyboards/planck/keymaps/mattly/keymap.c b/keyboards/planck/keymaps/mattly/keymap.c index 2495f8a19..baa7d9fbf 100644 --- a/keyboards/planck/keymaps/mattly/keymap.c +++ b/keyboards/planck/keymaps/mattly/keymap.c @@ -24,7 +24,6 @@ enum planck_layers { _NUMBER, _SYMBOL, _FUNC, - _ADJUST }; enum planck_keycodes { @@ -33,11 +32,10 @@ enum planck_keycodes { #define SPC_SHF MT(MOD_LSFT, KC_SPC) -#define ENT_FUN LT(_FUNC, KC_ENT) -#define ESC_FUN LT(_FUNC, KC_ESC) +#define ESC_HYP MT(MOD_HYPR, KC_ESC) #define TAB_NUM LT(_NUMBER, KC_TAB) #define BSP_SYM LT(_SYMBOL, KC_BSPC) -#define DEL_ADJ LT(_ADJUST, KC_DEL) +#define DEL_WRP MT(MOD_LCTL | MOD_LALT | MOD_LGUI, KC_DEL) #define SYMLOCK TG(_SYMBOL) #define NUMLOCK TG(_NUMBER) @@ -48,18 +46,25 @@ enum planck_keycodes { #define ONE_HYP OSM(MOD_HYPR) #define ONE_MEH OSM(MOD_MEH) #define ONE_WRP OSM(MOD_LCTL | MOD_LALT | MOD_LGUI) +#define ONE_WOA OSM(MOD_LCTL | MOD_LGUI | MOD_LSFT) +#define ONE_DER OSM(MOD_LALT | MOD_LGUI | MOD_LSFT) -#define A_CTRL MT(MOD_LCTL, KC_A) -#define S_ALT MT(MOD_LALT, KC_S) -#define D_GUI MT(MOD_LGUI, KC_D) -#define F_SHFT MT(MOD_LSFT, KC_F) -#define G_NUM LT(_NUMBER, KC_G) -#define H_NAV LT(_SYMBOL, KC_H) -#define J_SHFT MT(MOD_RSFT, KC_J) -#define K_GUI MT(MOD_RGUI, KC_K) -#define L_ALT MT(MOD_RALT, KC_L) +#define A_CTRL MT(MOD_LCTL, KC_A) +#define S_ALT MT(MOD_LALT, KC_S) +#define D_GUI MT(MOD_LGUI, KC_D) +#define F_SHFT MT(MOD_LSFT, KC_F) +#define J_SHFT MT(MOD_RSFT, KC_J) +#define K_GUI MT(MOD_RGUI, KC_K) +#define L_ALT MT(MOD_RALT, KC_L) #define MINSCTL MT(MOD_RCTL, KC_MINS) -#define SCL_CTL MT(MOD_RCTL, KC_SCLN) + +#define ENT_CTL MT(MOD_LCTL, KC_ENT) +#define LT_ALT MT(MOD_LALT, KC_LEFT) +#define DN_GUI MT(MOD_LGUI, KC_DOWN) +#define RT_SHFT MT(MOD_LSFT, KC_RGHT) +#define N4_SHFT MT(MOD_RSFT, KC_4) +#define N5_GUI MT(MOD_RGUI, KC_5) +#define N6_ALT MT(MOD_RALT, KC_6) #define BWORD LALT(KC_LEFT) #define FWORD LALT(KC_RIGHT) @@ -68,6 +73,8 @@ enum planck_keycodes { #define PWIN LGUI(LSFT(KC_GRV)) #define NTAB LGUI(LSFT(KC_RBRC)) #define PTAB LGUI(LSFT(KC_LBRC)) +#define NAVBACK LGUI(KC_LBRC) +#define NAVFWD LGUI(KC_RBRC) #define XMSNCTL HYPR(KC_F14) #define XDSKTOP HYPR(KC_F15) @@ -82,7 +89,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | | | | | | | | | | | | | |------|------|------|------|------|------|------|------|------|------|------|------| | ( | a | s | d | f | g | h | j | k | l | ; | ' | - | | CTRL | ALT | GUI | SHIFT| NUMBR| SYMBL| SHIFT| GUI | ALT | CTRL | | + | | CTRL | ALT | GUI | SHIFT| | | SHIFT| GUI | ALT | CTRL | | |------|------|------|------|------|------|------|------|------|------|------|------| | [ | z | x | c | v | b | n | m | , | . | / | > | | | | | | | | | | | | | | @@ -92,71 +99,54 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_QWERTY] = LAYOUT_planck_grid( KC_HASH, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_SCLN, - KC_LPRN, A_CTRL, S_ALT, D_GUI, F_SHFT, G_NUM, H_NAV, J_SHFT, K_GUI, L_ALT, MINSCTL, KC_QUOT, + KC_LPRN, A_CTRL, S_ALT, D_GUI, F_SHFT, KC_G, KC_H, J_SHFT, K_GUI, L_ALT, MINSCTL, KC_QUOT, KC_LBRC, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RABK, - KC_CAPS, ONE_ALT, ONE_GUI, ESC_FUN, TAB_NUM, SPC_SHF, SPC_SHF, BSP_SYM, DEL_ADJ, ONE_HYP, ONE_MEH, ONE_WRP + NUMLOCK, MO(_FUNC), ONE_MEH, ESC_HYP, TAB_NUM, SPC_SHF, SPC_SHF, BSP_SYM, DEL_WRP, ONE_WRP, ONE_DER, SYMLOCK ), /* Symbol - | | & | ` | ~ | [ | ] | < | > | + | | | | - | - | | $ | % | = | ( | ) | | : | ! | @ | * | ' | - | | | ^ | # | { | } | | " | | | \ | | | - | | | | | LOCK | | .... | | | | | + | | & | ` | ~ | [ | ] | < | > | + | | | | | + | | $ | % | = | ( | ) | ; | : | ! | @ | _ | | + | | | ^ | # | { | } | ' | " | | | \ | ? | | + | | | | | | | .... | | | | | */ [_SYMBOL] = LAYOUT_planck_grid( - _______, KC_AMPR, KC_GRV, KC_TILD, KC_LBRC, KC_RBRC, KC_LABK, KC_RABK, KC_PLUS, KC_ASTR, XXXXXXX, _______, - _______, KC_DLR, KC_PERC, KC_EQL, KC_LPRN, KC_RPRN, KC_SCLN, KC_COLN, KC_EXLM, KC_AT, KC_ASTR, _______, - _______, XXXXXXX, KC_CIRC, KC_HASH, KC_LCBR, KC_RCBR, KC_QUOT, KC_DQUO, KC_PIPE, KC_BSLS, XXXXXXX, _______, - _______, _______, _______, _______, SYMLOCK, _______, _______, _______, _______, _______, _______, _______ + KC_ESC, KC_AMPR, KC_GRV, KC_TILD, KC_LBRC, KC_RBRC, KC_LABK, KC_RABK, KC_PLUS, KC_ASTR, XXXXXXX, KC_DEL, + KC_ENT, KC_DLR, KC_PERC, KC_EQL, KC_LPRN, KC_RPRN, KC_SCLN, KC_COLN, KC_EXLM, KC_AT, KC_UNDS, KC_BSPC, + _______, XXXXXXX, KC_CIRC, KC_HASH, KC_LCBR, KC_RCBR, KC_QUOT, KC_DQUO, KC_PIPE, KC_BSLS, KC_QUES, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), /* Number | | |<-word| up |word->| PgUp | . | 7 | 8 | 9 | + | * | | | Enter| left | down | right| PgDn | 0 | 4 | 5 | 6 | - | / | | | Bksp | Home | tab | End | Del | , | 1 | 2 | 3 | = | % | - | | | | | .... | | LOCK | | : | $ | | + | | | | | .... | | | | : | $ | | */ [_NUMBER] = LAYOUT_planck_grid( - XXXXXXX, _______, BWORD, KC_UP, FWORD, KC_PGUP, KC_DOT, KC_7, KC_8, KC_9, KC_PLUS, KC_ASTR, - XXXXXXX, KC_ENT , KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_0, KC_4, KC_5, KC_6, KC_MINS, KC_SLSH, + XXXXXXX, XXXXXXX, BWORD, KC_UP, FWORD, KC_PGUP, KC_DOT, KC_7, KC_8, KC_9, KC_PLUS, KC_ASTR, + KC_CAPS, ENT_CTL, LT_ALT, DN_GUI, RT_SHFT, KC_PGDN, KC_0, N4_SHFT, N5_GUI, N6_ALT, MINSCTL, KC_SLSH, XXXXXXX, KC_BSPC, KC_HOME, KC_TAB, KC_END, KC_DEL, KC_COMM, KC_1, KC_2, KC_3, KC_EQL, KC_PERC, - _______, _______, _______, _______, _______, _______, _______, NUMLOCK, _______, KC_COLN, KC_DLR, _______ + _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_COLN, KC_DLR, _______ ), /* Function - * | | Mctl | Pspc | Nwin | Nspc | Desk | | F7 | F8 | F9 | F10 | F13 | - * | | Nctr | Ptab | Pwin | Ntab | | | F4 | F5 | F6 | F11 | F14 | + * | Reset| Mctl | Pspc | Nwin | Nspc | Desk | | F7 | F8 | F9 | F10 | F13 | + * | Debug| Nctr | Ptab | Pwin | Ntab | Back | Fwd | F4 | F5 | F6 | F11 | F14 | * | Mute | Vol- | Vol+ | Trk- | Trk+ | Play | | F1 | F2 | F3 | F12 | F15 | * | | | | | | | | | | | | | */ [_FUNC] = LAYOUT_planck_grid( - XXXXXXX, XMSNCTL, XPRVSPC, NWIN, XNXTSPC, XDSKTOP, XXXXXXX, KC_F7, KC_F8, KC_F9, KC_F10, KC_F13, - XXXXXXX, XNOTIFY, PTAB, PWIN, NTAB, XXXXXXX, XXXXXXX, KC_F4, KC_F5, KC_F6, KC_F11, KC_F14, + RESET, XMSNCTL, XPRVSPC, NWIN, XNXTSPC, XDSKTOP, XXXXXXX, KC_F7, KC_F8, KC_F9, KC_F10, KC_F13, + DEBUG, XNOTIFY, PTAB, PWIN, NTAB, NAVBACK, NAVFWD, KC_F4, KC_F5, KC_F6, KC_F11, KC_F14, KC_MUTE, KC_VOLD, KC_VOLU, KC_MRWD, KC_MFFD, KC_MPLY, XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F12, KC_F15, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ -), - -/* Adjust (Lower + Raise) - * ,-----------------------------------------------------------------------------------. - * | Reset| Debug| | | | | | | | | | | - * | | | | | | | | | | | | | - * | | | | | | | | | | | | | - * | | | | | | | | | | | | | - * `-----------------------------------------------------------------------------------' - */ -[_ADJUST] = LAYOUT_planck_grid( - RESET, DEBUG, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ) - - }; #ifdef AUDIO_ENABLE #endif uint32_t layer_state_set_user(uint32_t state) { - /* state = update_tri_layer_state(state, _SYMBOL, _NUMBER, _ADJUST); */ + state = update_tri_layer_state(state, _SYMBOL, _NUMBER, _FUNC); return state; } From 46b4b4407ff6e23d0799b0f902e61f1fe3645a9a Mon Sep 17 00:00:00 2001 From: satt99 <39004890+satt99@users.noreply.github.com> Date: Mon, 31 Dec 2018 01:34:06 +0900 Subject: [PATCH 771/788] Comet46 add support for OLED (#4745) * Add OLED support for Comet46 * fix length of char "name" of keylogger.c * update ssd1306 * fix rules.mk * update led-receiver keymap * Update OLED related code * add mod_state_reader & modify led_state_reader * Update OLED related files * Update kemaps * Update readme * change default-oled-display to default * Add OSM compatibility to mod_state_reader * Code formatting * Use PROGMEM to store code_to_name * Clean up satt keymap * Rename default-led keymap to defult-rgbled --- keyboards/comet46/comet46.c | 8 - keyboards/comet46/comet46.h | 40 -- keyboards/comet46/config.h | 12 +- keyboards/comet46/i2c.c | 162 +++++++++ keyboards/comet46/i2c.h | 49 +++ .../comet46/keymaps/default-rgbled/keymap.c | 226 ++++++++++++ .../comet46/keymaps/default-rgbled/readme.md | 3 + keyboards/comet46/keymaps/default/config.h | 31 ++ keyboards/comet46/keymaps/default/keymap.c | 195 ++++++++-- keyboards/comet46/keymaps/default/readme.md | 3 + keyboards/comet46/keymaps/default/rules.mk | 5 + .../comet46/keymaps/satt/action_pseudo_lut.c | 222 +++++------ keyboards/comet46/keymaps/satt/config.h | 34 ++ keyboards/comet46/keymaps/satt/keymap.c | 264 +++++++++----- .../comet46/keymaps/satt/keymap_jis2us.h | 46 +-- keyboards/comet46/keymaps/satt/rules.mk | 29 +- keyboards/comet46/lib/glcdfont.c | 148 ++++++++ keyboards/comet46/lib/host_led_state_reader.c | 15 + keyboards/comet46/lib/keylogger.c | 294 +++++++++++++++ keyboards/comet46/lib/modifier_state_reader.c | 18 + keyboards/comet46/readme.md | 5 +- keyboards/comet46/rules.mk | 16 +- keyboards/comet46/ssd1306.c | 344 ++++++++++++++++++ keyboards/comet46/ssd1306.h | 91 +++++ 24 files changed, 1918 insertions(+), 342 deletions(-) create mode 100644 keyboards/comet46/i2c.c create mode 100644 keyboards/comet46/i2c.h create mode 100644 keyboards/comet46/keymaps/default-rgbled/keymap.c create mode 100644 keyboards/comet46/keymaps/default-rgbled/readme.md create mode 100644 keyboards/comet46/keymaps/default/config.h create mode 100644 keyboards/comet46/keymaps/default/readme.md create mode 100644 keyboards/comet46/keymaps/default/rules.mk create mode 100644 keyboards/comet46/keymaps/satt/config.h create mode 100644 keyboards/comet46/lib/glcdfont.c create mode 100644 keyboards/comet46/lib/host_led_state_reader.c create mode 100644 keyboards/comet46/lib/keylogger.c create mode 100644 keyboards/comet46/lib/modifier_state_reader.c create mode 100644 keyboards/comet46/ssd1306.c create mode 100644 keyboards/comet46/ssd1306.h diff --git a/keyboards/comet46/comet46.c b/keyboards/comet46/comet46.c index 20dcfab83..0710b8e33 100644 --- a/keyboards/comet46/comet46.c +++ b/keyboards/comet46/comet46.c @@ -4,19 +4,11 @@ void uart_init(void) { SERIAL_UART_INIT(); } -void led_init(void) { - DDRD |= (1<<1); - PORTD |= (1<<1); - DDRF |= (1<<4) | (1<<5); - PORTF |= (1<<4) | (1<<5); -} - void matrix_init_kb(void) { // put your keyboard start-up code here // runs once when the firmware starts up matrix_init_user(); uart_init(); - led_init(); } void matrix_scan_kb(void) { diff --git a/keyboards/comet46/comet46.h b/keyboards/comet46/comet46.h index 7d6d6d513..07dad0a00 100644 --- a/keyboards/comet46/comet46.h +++ b/keyboards/comet46/comet46.h @@ -6,46 +6,6 @@ #include "backlight.h" #include -#define red_led_off PORTF |= (1<<5) -#define red_led_on PORTF &= ~(1<<5) -#define blu_led_off PORTF |= (1<<4) -#define blu_led_on PORTF &= ~(1<<4) -#define grn_led_off PORTD |= (1<<1) -#define grn_led_on PORTD &= ~(1<<1) - -#define set_led_off red_led_off; grn_led_off; blu_led_off -#define set_led_red red_led_on; grn_led_off; blu_led_off -#define set_led_blue red_led_off; grn_led_off; blu_led_on -#define set_led_green red_led_off; grn_led_on; blu_led_off -#define set_led_yellow red_led_on; grn_led_on; blu_led_off -#define set_led_magenta red_led_on; grn_led_off; blu_led_on -#define set_led_cyan red_led_off; grn_led_on; blu_led_on -#define set_led_white red_led_on; grn_led_on; blu_led_on - -/* -#define LED_B 5 -#define LED_R 6 -#define LED_G 7 - -#define all_leds_off PORTF &= ~(1<. #define ONESHOT_TIMEOUT 500 - -/* key combination for command */ -#define IS_COMMAND() ( \ - keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ -) - /* * Feature disable options * These options are also useful to firmware size reduction. @@ -65,6 +59,12 @@ along with this program. If not, see . //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION +// Define masks for modifiers +#define MODS_SHIFT_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) +#define MODS_CTRL_MASK (MOD_BIT(KC_LCTL)|MOD_BIT(KC_RCTRL)) +#define MODS_ALT_MASK (MOD_BIT(KC_LALT)|MOD_BIT(KC_RALT)) +#define MODS_GUI_MASK (MOD_BIT(KC_LGUI)|MOD_BIT(KC_RGUI)) + //UART settings for communication with the RF microcontroller #define SERIAL_UART_BAUD 1000000 #define SERIAL_UART_DATA UDR1 diff --git a/keyboards/comet46/i2c.c b/keyboards/comet46/i2c.c new file mode 100644 index 000000000..4bee5c639 --- /dev/null +++ b/keyboards/comet46/i2c.c @@ -0,0 +1,162 @@ +#include +#include +#include +#include +#include +#include +#include "i2c.h" + +#ifdef USE_I2C + +// Limits the amount of we wait for any one i2c transaction. +// Since were running SCL line 100kHz (=> 10μs/bit), and each transactions is +// 9 bits, a single transaction will take around 90μs to complete. +// +// (F_CPU/SCL_CLOCK) => # of μC cycles to transfer a bit +// poll loop takes at least 8 clock cycles to execute +#define I2C_LOOP_TIMEOUT (9+1)*(F_CPU/SCL_CLOCK)/8 + +#define BUFFER_POS_INC() (slave_buffer_pos = (slave_buffer_pos+1)%SLAVE_BUFFER_SIZE) + +volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE]; + +static volatile uint8_t slave_buffer_pos; +static volatile bool slave_has_register_set = false; + +// Wait for an i2c operation to finish +inline static +void i2c_delay(void) { + uint16_t lim = 0; + while(!(TWCR & (1<10. + // Check datasheets for more info. + TWBR = ((F_CPU/SCL_CLOCK)-16)/2; +} + +// Start a transaction with the given i2c slave address. The direction of the +// transfer is set with I2C_READ and I2C_WRITE. +// returns: 0 => success +// 1 => error +uint8_t i2c_master_start(uint8_t address) { + TWCR = (1< slave ACK +// 1 => slave NACK +uint8_t i2c_master_write(uint8_t data) { + TWDR = data; + TWCR = (1<= SLAVE_BUFFER_SIZE ) { + ack = 0; + slave_buffer_pos = 0; + } + slave_has_register_set = true; + } else { + i2c_slave_buffer[slave_buffer_pos] = TWDR; + BUFFER_POS_INC(); + } + break; + + case TW_ST_SLA_ACK: + case TW_ST_DATA_ACK: + // master has addressed this device as a slave transmitter and is + // requesting data. + TWDR = i2c_slave_buffer[slave_buffer_pos]; + BUFFER_POS_INC(); + break; + + case TW_BUS_ERROR: // something went wrong, reset twi state + TWCR = 0; + default: + break; + } + // Reset everything, so we are ready for the next TWI interrupt + TWCR |= (1< + +#ifndef F_CPU +#define F_CPU 16000000UL +#endif + +#define I2C_READ 1 +#define I2C_WRITE 0 + +#define I2C_ACK 1 +#define I2C_NACK 0 + +#define SLAVE_BUFFER_SIZE 0x10 + +// i2c SCL clock frequency 400kHz +#define SCL_CLOCK 400000L + +extern volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE]; + +void i2c_master_init(void); +uint8_t i2c_master_start(uint8_t address); +void i2c_master_stop(void); +uint8_t i2c_master_write(uint8_t data); +uint8_t i2c_master_read(int); +void i2c_reset_state(void); +void i2c_slave_init(uint8_t address); + + +static inline unsigned char i2c_start_read(unsigned char addr) { + return i2c_master_start((addr << 1) | I2C_READ); +} + +static inline unsigned char i2c_start_write(unsigned char addr) { + return i2c_master_start((addr << 1) | I2C_WRITE); +} + +// from SSD1306 scrips +extern unsigned char i2c_rep_start(unsigned char addr); +extern void i2c_start_wait(unsigned char addr); +extern unsigned char i2c_readAck(void); +extern unsigned char i2c_readNak(void); +extern unsigned char i2c_read(unsigned char ack); + +#define i2c_read(ack) (ack) ? i2c_readAck() : i2c_readNak(); + +#endif diff --git a/keyboards/comet46/keymaps/default-rgbled/keymap.c b/keyboards/comet46/keymaps/default-rgbled/keymap.c new file mode 100644 index 000000000..d446d50d0 --- /dev/null +++ b/keyboards/comet46/keymaps/default-rgbled/keymap.c @@ -0,0 +1,226 @@ +// this is the style you want to emulate. +// This is the canonical layout file for the Quantum project. If you want to add another keyboard, + +#include QMK_KEYBOARD_H + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +enum comet46_layers +{ + _QWERTY, + _COLEMAK, + _DVORAK, + _LOWER, + _RAISE, + _ADJUST, +}; + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + LOWER, + RAISE, +}; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO +#define LOWER MO(_LOWER) +#define RAISE MO(_RAISE) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* Qwerty + * ,-----------------------------------------+ +-----------------------------------------. + * | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------| + * | Ctl | A | S | D | F | G | Esc | | Del | H | J | K | L | ; | " | + * |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | { | | } | N | M | , | . | / | Shift| + * |------+------+------+------+------+------+------+ +------+------+------+------+------+-------------| + * | GUI | Lower| Space| | Enter| Raise| Alt | + * +--------------------/ \--------------------+ + */ + [_QWERTY] = LAYOUT( + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_ESC, KC_DEL, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LCBR, KC_RCBR, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LGUI, LOWER, KC_SPC, KC_ENT, RAISE, KC_LALT + ), + + /* Colemak + * ,-----------------------------------------+ +-----------------------------------------. + * | Tab | Q | W | F | P | G | | J | L | U | Y | ; | Bksp | + * |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------| + * | Ctl | A | R | S | T | D | Esc | | Del | H | N | E | I | O | " | + * |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | { | | } | K | M | , | . | / | Shift| + * |------+------+------+------+------+------+------+ +------+------+------+------+------+-------------| + * | GUI | Lower| Space| | Enter| Raise| Alt | + * +--------------------/ \--------------------+ + */ + [_COLEMAK] = LAYOUT( + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, + KC_LCTL, KC_A, KC_R, KC_S, KC_T, KC_D, KC_ESC, KC_DEL, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LCBR, KC_RCBR, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LGUI, LOWER, KC_SPC, KC_ENT, RAISE, KC_LALT + ), + + /* Dvorak + * ,-----------------------------------------+ +-----------------------------------------. + * | Tab | " | , | . | P | Y | | F | G | C | R | L | Bksp | + * |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------| + * | Ctl | A | O | E | U | I | Esc | | Del | D | H | T | N | S | / | + * |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | { | | } | B | M | W | V | Z | Shift| + * |------+------+------+------+------+------+------+ +------+------+------+------+------+-------------| + * | GUI | Lower| Space| | Enter| Raise| Alt | + * +--------------------/ \--------------------+ + */ + [_DVORAK] = LAYOUT( + KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, + KC_LCTL, KC_A, KC_O, KC_E, KC_U, KC_I, KC_ESC, KC_DEL, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, + KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_LCBR, KC_RCBR, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, + KC_LGUI, LOWER, KC_SPC, KC_ENT, RAISE, KC_LALT + ), + + /* Lower + * ,-----------------------------------------+ +-----------------------------------------. + * | | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | + * |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------| + * | | | | | | | | | ` | \ | - | = | [ | ] | | + * |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------| + * | | | | | | | | | ~ | | | _ | + | { | } | | + * |------+------+------+------+------+------+------+ +------+------+------+------+------+-------------| + * | | | | | | | | + * +--------------------/ \--------------------+ + */ + [_LOWER] = LAYOUT( + _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, + _______, _______, _______, _______, _______, _______, _______, KC_GRV, KC_BSLS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, _______, + _______, _______, _______, _______, _______, _______, _______, KC_TILD, KC_PIPE, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, _______, + _______, _______, _______, _______, _______, _______ + ), + + /* Raise + * ,-----------------------------------------+ +-----------------------------------------. + * | | 1 | 2 | 3 | 4 | 5 | | | | | | | | + * |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------| + * | | F1 | F2 | F3 | F4 | F5 | F6 | | | Left | Down | Up |Right | End | | + * |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | | Home | | PgDn | PgUp | | | | + * |------+------+------+------+------+------+------+ +------+------+------+------+------+-------------| + * | | | | | | | | + * +--------------------/ \--------------------+ + */ + [_RAISE] = LAYOUT( + _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_END, _______, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_HOME, XXXXXXX, KC_PGDN, KC_PGUP, XXXXXXX, XXXXXXX, _______, + _______, _______, _______, _______, _______, _______ + ), + + /* Adjust + * ,-----------------------------------------+ +-----------------------------------------. + * | | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------| + * | | | | | | |Qwerty| |Colemk| | | | | | | + * |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------| + * | | | | | | |Reset | |Dvorak| | | | | | | + * |------+------+------+------+------+------+------+ +------+------+------+------+------+-------------| + * | | | | | | | | + * +--------------------/ \--------------------+ + */ + [_ADJUST] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, QWERTY, COLEMAK, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, RESET, DVORAK, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______ + ) +}; + + +uint32_t layer_state_set_user(uint32_t state) { + return update_tri_layer_state(state, _RAISE, _LOWER, _ADJUST); +} + +// settings for LED on receiver +void led_init(void) { + DDRD |= (1<<1); + PORTD |= (1<<1); + DDRF |= (1<<4) | (1<<5); + PORTF |= (1<<4) | (1<<5); +} + +#define red_led_off PORTF |= (1<<5) +#define red_led_on PORTF &= ~(1<<5) +#define blu_led_off PORTF |= (1<<4) +#define blu_led_on PORTF &= ~(1<<4) +#define grn_led_off PORTD |= (1<<1) +#define grn_led_on PORTD &= ~(1<<1) + +#define set_led_off red_led_off; grn_led_off; blu_led_off +#define set_led_red red_led_on; grn_led_off; blu_led_off +#define set_led_blue red_led_off; grn_led_off; blu_led_on +#define set_led_green red_led_off; grn_led_on; blu_led_off +#define set_led_yellow red_led_on; grn_led_on; blu_led_off +#define set_led_magenta red_led_on; grn_led_off; blu_led_on +#define set_led_cyan red_led_off; grn_led_on; blu_led_on +#define set_led_white red_led_on; grn_led_on; blu_led_on + +void matrix_init_user(void) { + led_init(); +} + +void matrix_scan_user(void) { + uint8_t layer = biton32(layer_state); + uint8_t default_layer = biton32(eeconfig_read_default_layer()); + switch (layer) { + case _LOWER: + set_led_red; + break; + case _RAISE: + set_led_blue; + break; + case _ADJUST: + set_led_magenta; + break; + default: + switch (default_layer) { + case _COLEMAK: + set_led_white; + break; + case _DVORAK: + set_led_yellow; + break; + default: + set_led_green; + break; + } + break; + } +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + } + break; + case COLEMAK: + if (record->event.pressed) { + set_single_persistent_default_layer(_COLEMAK); + } + break; + case DVORAK: + if (record->event.pressed) { + set_single_persistent_default_layer(_DVORAK); + } + break; + } + return true; +} diff --git a/keyboards/comet46/keymaps/default-rgbled/readme.md b/keyboards/comet46/keymaps/default-rgbled/readme.md new file mode 100644 index 000000000..40cc74433 --- /dev/null +++ b/keyboards/comet46/keymaps/default-rgbled/readme.md @@ -0,0 +1,3 @@ +## default-led + +A keymap that is compatible with mitosis-type receivers, which use RGB LED for layer indication. diff --git a/keyboards/comet46/keymaps/default/config.h b/keyboards/comet46/keymaps/default/config.h new file mode 100644 index 000000000..7873cf5a7 --- /dev/null +++ b/keyboards/comet46/keymaps/default/config.h @@ -0,0 +1,31 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +// #include "../../config.h" + +/* Use I2C or Serial */ + +#define USE_I2C +#define SSD1306OLED + +#endif diff --git a/keyboards/comet46/keymaps/default/keymap.c b/keyboards/comet46/keymaps/default/keymap.c index b03ece4e9..c87492e4b 100644 --- a/keyboards/comet46/keymaps/default/keymap.c +++ b/keyboards/comet46/keymaps/default/keymap.c @@ -2,6 +2,10 @@ // This is the canonical layout file for the Quantum project. If you want to add another keyboard, #include QMK_KEYBOARD_H +#ifdef SSD1306OLED + #include "ssd1306.h" +#endif + // Each layer gets a name for readability, which is then used in the keymap matrix below. // The underscores don't mean anything - you can have a layer called STUFF or any other name. @@ -9,13 +13,18 @@ // entirely and just use numbers. enum comet46_layers { - _QWERTY, - _LOWER, - _RAISE, + _QWERTY, + _COLEMAK, + _DVORAK, + _LOWER, + _RAISE, + _ADJUST, }; enum custom_keycodes { QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, LOWER, RAISE, }; @@ -46,6 +55,42 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LGUI, LOWER, KC_SPC, KC_ENT, RAISE, KC_LALT ), + /* Colemak + * ,-----------------------------------------+ +-----------------------------------------. + * | Tab | Q | W | F | P | G | | J | L | U | Y | ; | Bksp | + * |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------| + * | Ctl | A | R | S | T | D | Esc | | Del | H | N | E | I | O | " | + * |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | { | | } | K | M | , | . | / | Shift| + * |------+------+------+------+------+------+------+ +------+------+------+------+------+-------------| + * | GUI | Lower| Space| | Enter| Raise| Alt | + * +--------------------/ \--------------------+ + */ + [_COLEMAK] = LAYOUT( + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, + KC_LCTL, KC_A, KC_R, KC_S, KC_T, KC_D, KC_ESC, KC_DEL, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LCBR, KC_RCBR, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LGUI, LOWER, KC_SPC, KC_ENT, RAISE, KC_LALT + ), + + /* Dvorak + * ,-----------------------------------------+ +-----------------------------------------. + * | Tab | " | , | . | P | Y | | F | G | C | R | L | Bksp | + * |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------| + * | Ctl | A | O | E | U | I | Esc | | Del | D | H | T | N | S | / | + * |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | { | | } | B | M | W | V | Z | Shift| + * |------+------+------+------+------+------+------+ +------+------+------+------+------+-------------| + * | GUI | Lower| Space| | Enter| Raise| Alt | + * +--------------------/ \--------------------+ + */ + [_DVORAK] = LAYOUT( + KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, + KC_LCTL, KC_A, KC_O, KC_E, KC_U, KC_I, KC_ESC, KC_DEL, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, + KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_LCBR, KC_RCBR, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, + KC_LGUI, LOWER, KC_SPC, KC_ENT, RAISE, KC_LALT + ), + /* Lower * ,-----------------------------------------+ +-----------------------------------------. * | | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | @@ -70,7 +115,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------| * | | F1 | F2 | F3 | F4 | F5 | F6 | | | Left | Down | Up |Right | End | | * |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 | | Home | | | | | | | + * | | F7 | F8 | F9 | F10 | F11 | F12 | | Home | | PgDn | PgUp | | | | * |------+------+------+------+------+------+------+ +------+------+------+------+------+-------------| * | | | | | | | | * +--------------------/ \--------------------+ @@ -78,26 +123,134 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_RAISE] = LAYOUT( _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_END, _______, - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_HOME, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_HOME, XXXXXXX, KC_PGDN, KC_PGUP, XXXXXXX, XXXXXXX, _______, + _______, _______, _______, _______, _______, _______ + ), + + /* Adjust + * ,-----------------------------------------+ +-----------------------------------------. + * | | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------| + * | | | | | | |Qwerty| |Colemk| | | | | | | + * |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------| + * | | | | | | |Reset | |Dvorak| | | | | | | + * |------+------+------+------+------+------+------+ +------+------+------+------+------+-------------| + * | | | | | | | | + * +--------------------/ \--------------------+ + */ + [_ADJUST] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, QWERTY, COLEMAK, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, RESET, DVORAK, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ) }; -void matrix_scan_user(void) { - uint8_t layer = biton32(layer_state); - switch (layer) { - case _QWERTY: - set_led_green; - break; - case _RAISE: - set_led_blue; - break; - case _LOWER: - set_led_red; - break; - default: - set_led_green; - break; - } +uint32_t layer_state_set_user(uint32_t state) { + return update_tri_layer_state(state, _RAISE, _LOWER, _ADJUST); +} + +//SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h +#ifdef SSD1306OLED + +// You need to add source files to SRC in rules.mk when using OLED display functions +void set_keylog(uint16_t keycode); +const char *read_keylog(void); +const char *read_modifier_state(void); +const char *read_host_led_state(void); + +void matrix_init_user(void) { + iota_gfx_init(false); // turns on the display +} + +void matrix_scan_user(void) { + iota_gfx_task(); // this is what updates the display continuously +} + +void matrix_update(struct CharacterMatrix *dest, const struct CharacterMatrix *source) { + if (memcmp(dest->display, source->display, sizeof(dest->display))) { + memcpy(dest->display, source->display, sizeof(dest->display)); + dest->dirty = true; + } +} + +void render_status(struct CharacterMatrix *matrix) { + // Layer state + char layer_str[22]; + matrix_write(matrix, "Layer: "); + uint8_t layer = biton32(layer_state); + uint8_t default_layer = biton32(eeconfig_read_default_layer()); + switch (layer) { + case _QWERTY: + switch (default_layer) { + case _QWERTY: + snprintf(layer_str, sizeof(layer_str), "Qwerty"); + break; + case _COLEMAK: + snprintf(layer_str, sizeof(layer_str), "Colemak"); + break; + case _DVORAK: + snprintf(layer_str, sizeof(layer_str), "Dvorak"); + break; + default: + snprintf(layer_str, sizeof(layer_str), "Undef-%d", default_layer); + break; + } + break; + case _RAISE: + snprintf(layer_str, sizeof(layer_str), "Raise"); + break; + case _LOWER: + snprintf(layer_str, sizeof(layer_str), "Lower"); + break; + case _ADJUST: + snprintf(layer_str, sizeof(layer_str), "Adjust"); + break; + default: + snprintf(layer_str, sizeof(layer_str), "Undef-%d", layer); + } + matrix_write_ln(matrix, layer_str); + // Last entered keycode + matrix_write_ln(matrix, read_keylog()); + // Modifier state + matrix_write_ln(matrix, read_modifier_state()); + // Host Keyboard LED Status + matrix_write(matrix, read_host_led_state()); +} + + +void iota_gfx_task_user(void) { + struct CharacterMatrix matrix; + matrix_clear(&matrix); + render_status(&matrix); + matrix_update(&display, &matrix); +} + +#endif//SSD1306OLED + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + #ifdef SSD1306OLED + if (record->event.pressed) { + set_keylog(keycode); + } + #endif + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + } + break; + case COLEMAK: + if (record->event.pressed) { + set_single_persistent_default_layer(_COLEMAK); + } + break; + case DVORAK: + if (record->event.pressed) { + set_single_persistent_default_layer(_DVORAK); + } + break; + } + return true; } diff --git a/keyboards/comet46/keymaps/default/readme.md b/keyboards/comet46/keymaps/default/readme.md new file mode 100644 index 000000000..b0085d2a6 --- /dev/null +++ b/keyboards/comet46/keymaps/default/readme.md @@ -0,0 +1,3 @@ +## default-oled-display + +A keymap that is compatible with receivers with an OLED display. diff --git a/keyboards/comet46/keymaps/default/rules.mk b/keyboards/comet46/keymaps/default/rules.mk new file mode 100644 index 000000000..3fa01f96a --- /dev/null +++ b/keyboards/comet46/keymaps/default/rules.mk @@ -0,0 +1,5 @@ +# If you want to change display settings of the OLED, you need to change the following lines +SRC += ./lib/glcdfont.c \ + ./lib/keylogger.c \ + ./lib/modifier_state_reader.c \ + ./lib/host_led_state_reader.c diff --git a/keyboards/comet46/keymaps/satt/action_pseudo_lut.c b/keyboards/comet46/keymaps/satt/action_pseudo_lut.c index 5664d4d2a..0ac713359 100644 --- a/keyboards/comet46/keymaps/satt/action_pseudo_lut.c +++ b/keyboards/comet46/keymaps/satt/action_pseudo_lut.c @@ -10,133 +10,133 @@ static uint8_t send_key_shift_bit[SHIFT_BIT_SIZE]; * Memo: Using other layer keymap to get keycode */ void action_pseudo_lut(keyrecord_t *record, uint8_t base_keymap_id, const uint16_t (*keymap)[2]) { - uint8_t prev_shift; - uint16_t keycode; - uint16_t pseudo_keycode; + uint8_t prev_shift; + uint16_t keycode; + uint16_t pseudo_keycode; - /* get keycode from keymap you specified */ - keycode = keymap_key_to_keycode(base_keymap_id, record->event.key); + /* get keycode from keymap you specified */ + keycode = keymap_key_to_keycode(base_keymap_id, record->event.key); - prev_shift = keyboard_report->mods & (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT)); + prev_shift = keyboard_report->mods & (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT)); - if (record->event.pressed) { - /* when magic commands entered, keycode does not converted */ - if (IS_COMMAND()) { - if (prev_shift) { - add_shift_bit(keycode); - } - register_code(keycode); - return; - } - - if (prev_shift) { - pseudo_keycode = convert_keycode(keymap, keycode, true); - dprintf("pressed: %02X, converted: %04X\n", keycode, pseudo_keycode); - add_shift_bit(keycode); - - if (IS_LSFT(pseudo_keycode)) { - register_code(QK_LSFT ^ pseudo_keycode); - } else { - /* delete shift mod temporarily */ - del_mods(prev_shift); - send_keyboard_report(); - register_code(pseudo_keycode); - add_mods(prev_shift); - send_keyboard_report(); - } - } else { - pseudo_keycode = convert_keycode(keymap, keycode, false); - dprintf("pressed: %02X, converted: %04X\n", keycode, pseudo_keycode); - - if (IS_LSFT(pseudo_keycode)) { - add_weak_mods(MOD_BIT(KC_LSFT)); - send_keyboard_report(); - register_code(QK_LSFT ^ pseudo_keycode); - /* on Windows, prevent key repeat to avoid unintended output */ - unregister_code(QK_LSFT ^ pseudo_keycode); - del_weak_mods(MOD_BIT(KC_LSFT)); - send_keyboard_report(); - } else { - register_code(pseudo_keycode); - } - } - } else { - if (get_shift_bit(keycode)) { - del_shift_bit(keycode); - pseudo_keycode = convert_keycode(keymap, keycode, true); - } else { - pseudo_keycode = convert_keycode(keymap, keycode, false); - } - dprintf("released: %02X, converted: %04X\n", keycode, pseudo_keycode); - - if (IS_LSFT(pseudo_keycode)) { - unregister_code(QK_LSFT ^ pseudo_keycode); - } else { - unregister_code(pseudo_keycode); - } + if (record->event.pressed) { + /* when magic commands entered, keycode does not converted */ + if (IS_COMMAND()) { + if (prev_shift) { + add_shift_bit(keycode); + } + register_code(keycode); + return; } + + if (prev_shift) { + pseudo_keycode = convert_keycode(keymap, keycode, true); + dprintf("pressed: %02X, converted: %04X\n", keycode, pseudo_keycode); + add_shift_bit(keycode); + + if (IS_LSFT(pseudo_keycode)) { + register_code(QK_LSFT ^ pseudo_keycode); + } else { + /* delete shift mod temporarily */ + del_mods(prev_shift); + send_keyboard_report(); + register_code(pseudo_keycode); + add_mods(prev_shift); + send_keyboard_report(); + } + } else { + pseudo_keycode = convert_keycode(keymap, keycode, false); + dprintf("pressed: %02X, converted: %04X\n", keycode, pseudo_keycode); + + if (IS_LSFT(pseudo_keycode)) { + add_weak_mods(MOD_BIT(KC_LSFT)); + send_keyboard_report(); + register_code(QK_LSFT ^ pseudo_keycode); + /* on Windows, prevent key repeat to avoid unintended output */ + unregister_code(QK_LSFT ^ pseudo_keycode); + del_weak_mods(MOD_BIT(KC_LSFT)); + send_keyboard_report(); + } else { + register_code(pseudo_keycode); + } + } + } else { + if (get_shift_bit(keycode)) { + del_shift_bit(keycode); + pseudo_keycode = convert_keycode(keymap, keycode, true); + } else { + pseudo_keycode = convert_keycode(keymap, keycode, false); + } + dprintf("released: %02X, converted: %04X\n", keycode, pseudo_keycode); + + if (IS_LSFT(pseudo_keycode)) { + unregister_code(QK_LSFT ^ pseudo_keycode); + } else { + unregister_code(pseudo_keycode); + } + } } uint16_t convert_keycode(const uint16_t (*keymap)[2], uint16_t keycode, bool shift_modded) { - uint16_t pseudo_keycode; + uint16_t pseudo_keycode; - switch (keycode) { - case KC_A ... KC_CAPSLOCK: -#if defined(__AVR__) - if (shift_modded) { - pseudo_keycode = pgm_read_word(&keymap[keycode][1]); - } else { - pseudo_keycode = pgm_read_word(&keymap[keycode][0]); - } -#else - if (shift_modded) { - pseudo_keycode = keymap[keycode][1]; - } else { - pseudo_keycode = keymap[keycode][0]; - } -#endif - /* if undefined, use got keycode as it is */ - if (pseudo_keycode == 0x00) { - if (shift_modded) { - pseudo_keycode = S(keycode); - } else { - pseudo_keycode = keycode; - } - } - break; - default: - if (shift_modded) { - pseudo_keycode = S(keycode); - } else { - pseudo_keycode = keycode; - } - break; - } - return pseudo_keycode; + switch (keycode) { + case KC_A ... KC_CAPSLOCK: + #if defined(__AVR__) + if (shift_modded) { + pseudo_keycode = pgm_read_word(&keymap[keycode][1]); + } else { + pseudo_keycode = pgm_read_word(&keymap[keycode][0]); + } + #else + if (shift_modded) { + pseudo_keycode = keymap[keycode][1]; + } else { + pseudo_keycode = keymap[keycode][0]; + } + #endif + /* if undefined, use got keycode as it is */ + if (pseudo_keycode == 0x00) { + if (shift_modded) { + pseudo_keycode = S(keycode); + } else { + pseudo_keycode = keycode; + } + } + break; + default: + if (shift_modded) { + pseudo_keycode = S(keycode); + } else { + pseudo_keycode = keycode; + } + break; + } + return pseudo_keycode; } uint8_t get_shift_bit(uint16_t keycode) { - if ((keycode >> 3) < SHIFT_BIT_SIZE) { - return send_key_shift_bit[keycode >> 3] & (1 << (keycode & 7)); - } else { - dprintf("get_shift_bit: Can't get shift bit. keycode: %02X\n", keycode); - return 0; - } + if ((keycode >> 3) < SHIFT_BIT_SIZE) { + return send_key_shift_bit[keycode >> 3] & (1 << (keycode & 7)); + } else { + dprintf("get_shift_bit: Can't get shift bit. keycode: %02X\n", keycode); + return 0; + } } void add_shift_bit(uint16_t keycode) { - if ((keycode >> 3) < SHIFT_BIT_SIZE) { - send_key_shift_bit[keycode >> 3] |= (1 << (keycode & 7)); - } else { - dprintf("add_shift_bit: Can't add shift bit. keycode: %02X\n", keycode); - } + if ((keycode >> 3) < SHIFT_BIT_SIZE) { + send_key_shift_bit[keycode >> 3] |= (1 << (keycode & 7)); + } else { + dprintf("add_shift_bit: Can't add shift bit. keycode: %02X\n", keycode); + } } void del_shift_bit(uint16_t keycode) { - if ((keycode >> 3) < SHIFT_BIT_SIZE) { - send_key_shift_bit[keycode >> 3] &= ~(1 << (keycode & 7)); - } else { - dprintf("del_shift_bit: Can't delete shift bit. keycode: %02X\n", keycode); - } + if ((keycode >> 3) < SHIFT_BIT_SIZE) { + send_key_shift_bit[keycode >> 3] &= ~(1 << (keycode & 7)); + } else { + dprintf("del_shift_bit: Can't delete shift bit. keycode: %02X\n", keycode); + } } diff --git a/keyboards/comet46/keymaps/satt/config.h b/keyboards/comet46/keymaps/satt/config.h new file mode 100644 index 000000000..c99de2cf8 --- /dev/null +++ b/keyboards/comet46/keymaps/satt/config.h @@ -0,0 +1,34 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 . +*/ + +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT)) \ +) + +/* Use I2C or Serial */ + +#define USE_I2C +#define SSD1306OLED + +#endif diff --git a/keyboards/comet46/keymaps/satt/keymap.c b/keyboards/comet46/keymaps/satt/keymap.c index 7e728e5d0..eec40eff4 100644 --- a/keyboards/comet46/keymaps/satt/keymap.c +++ b/keyboards/comet46/keymaps/satt/keymap.c @@ -4,64 +4,96 @@ #include QMK_KEYBOARD_H #include "keymap_jis2us.h" #include "action_pseudo_lut.h" +#include "keymap_jp.h" +#ifdef SSD1306OLED + #include "ssd1306.h" +#endif // Each layer gets a name for readability, which is then used in the keymap matrix below. // The underscores don't mean anything - you can have a layer called STUFF or any other name. // Layer names don't all need to be of the same length, obviously, and you can also skip them // entirely and just use numbers. enum comet46_layers { - _QWERTY, - _LOWER, - _RAISE, - _PSEUDO_US, - _PSEUDO_US_LOWER, - _PSEUDO_US_RAISE, - _ADJUST + _QWERTY, + _LOWER, + _RAISE, + _PSEUDO_US, + _PSEUDO_US_LOWER, + _PSEUDO_US_RAISE, + _ADJUST }; enum custom_keycodes { QWERTY = SAFE_RANGE, PSEUDO_US, + JIS2US, }; -#define KC_LWR MO(_LOWER) -#define KC_RSE MO(_RAISE) +// JIS keycodes +#define KC_JZHT JP_ZHTG // hankaku/zenkaku|kanzi +#define KC_JCIR JP_CIRC // ^, ~ +#define KC_JAT JP_AT // @, ` +#define KC_JLBR JP_LBRC // [, { +#define KC_JCOL JP_COLN // :, * +#define KC_JRBR JP_RBRC // ], } +#define KC_JBSL JP_BSLS // \, _ +#define KC_JMHE JP_MHEN // muhenkan +#define KC_JHEN JP_HENK // henkan +#define KC_JKAN JP_KANA // katakana/hiragana|ro-mazi +#define KC_JMKA JP_MKANA //kana on MacOSX +#define KC_JMEI JP_MEISU //eisu on MacOSX +#define KC_JAMP JP_AMPR // & +#define KC_JQUO JP_QUOT // ' +#define KC_JLPR JP_LPRN // ( +#define KC_JRPR JP_RPRN // ) +#define KC_JEQL JP_EQL // = +#define KC_JTIL JP_TILD // ~ +#define KC_JPIP JP_PIPE // | +#define KC_JGRV JP_GRV // ` +#define KC_JLCB JP_LCBR // { +#define KC_JPLU JP_PLUS // + +#define KC_JAST JP_ASTR // * +#define KC_JRCB JP_RCBR // } +#define KC_JUND JP_UNDS // _ + +// Layer related keycodes +#define KC_LWR MO(_LOWER) +#define KC_RSE MO(_RAISE) #define KC_P_LW MO(_PSEUDO_US_LOWER) #define KC_P_RS MO(_PSEUDO_US_RAISE) #define KC_QWRT QWERTY #define KC_P_US PSEUDO_US +#define KC_J2US JIS2US + +// Special keycodes #define KC_SPCT CTL_T(KC_SPC) #define KC_ENSF SFT_T(KC_ENT) -#define KC_SFTA SFT_T(KC_A) -#define KC_CTSF S(KC_LCTL) +#define KC_CAEC MT(MOD_LCTL | MOD_LALT, KC_ESC) +#define KC_CSTB C_S_T(KC_TAB) #define KC_IMON ALT_T(KC_F13) #define KC_IMOF GUI_T(KC_F14) -#define KC_SRO S(KC_RO) -#define KC_SYEN S(KC_JYEN) #define KC_CAD LCA(KC_DEL) #define KC_RST RESET -#define LONGPRESS_DELAY 150 - // Fillers to make layering more clear -#define KC_ KC_TRNS +#define KC_ KC_TRNS #define KC_XXXX KC_NO const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_QWERTY] = LAYOUT_kc( + [_QWERTY] = LAYOUT_kc( //,----+----+----+----+----+----+ +----+----+----+----+----+----. - ESC , Q , W , E , R , T , Y , U , I , O , P ,DEL , + CAEC, Q , W , E , R , T , Y , U , I , O , P ,DEL , //|----+----+----+----+----+----+----+ +----+----+----+----+----+----+----| - TAB ,SFTA, S , D , F , G ,LPRN, RPRN, H , J , K , L ,SCLN,BSPC, + CSTB, A , S , D , F , G ,LPRN, RPRN, H , J , K , L ,SCLN,BSPC, //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - CTSF, Z , X , C , V , B ,LBRC, RBRC, N , M ,COMM,DOT ,SLSH,QUOT, + LSFT, Z , X , C , V , B ,LBRC, RBRC, N , M ,COMM,DOT ,SLSH,QUOT, //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| IMOF,LWR ,SPCT, ENSF,RSE ,IMON // +----+----+---/ \---+----+----+ ), - [_LOWER] = LAYOUT_kc( + [_LOWER] = LAYOUT_kc( //,----+----+----+----+----+----+ +----+----+----+----+----+----. ,EXLM, AT ,HASH,DLR ,PERC, CIRC,AMPR,ASTR,LPRN,RPRN, , //|----+----+----+----+----+----+----+ +----+----+----+----+----+----+----| @@ -69,60 +101,60 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| , F7 , F8 , F9 , F10, F11, F12, TILD,PIPE,UNDS,PLUS,LCBR,RCBR, , //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , , , , , + , , , , , // +----+----+---/ \---+----+----+ ), - [_RAISE] = LAYOUT_kc( + [_RAISE] = LAYOUT_kc( //,----+----+----+----+----+----+ +----+----+----+----+----+----. , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 , , //|----+----+----+----+----+----+----+ +----+----+----+----+----+----+----| , , , , , , , XXXX,LEFT,DOWN, UP ,RGHT,END , , //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , , , , , , , HOME,XXXX,XXXX,XXXX,XXXX,XXXX, , + , , , , , , , HOME,XXXX,PGDN,PGUP,XXXX,XXXX, , //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , , , , , + , , , , , // +----+----+---/ \---+----+----+ ), - [_PSEUDO_US] = LAYOUT_kc( + [_PSEUDO_US] = LAYOUT_kc( //,----+----+----+----+----+----+ +----+----+----+----+----+----. - ESC , Q , W , E , R , T , Y , U , I , O , P ,DEL , + CAEC, Q , W , E , R , T , Y , U , I , O , P ,DEL , //|----+----+----+----+----+----+----+ +----+----+----+----+----+----+----| - TAB ,SFTA, S , D , F , G ,ASTR, LPRN, H , J , K , L ,FN0 ,BSPC, + CSTB, A , S , D , F , G ,JLPR, JRPR, H , J , K , L ,J2US,BSPC, //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - CTSF, Z , X , C , V , B ,FN0 , FN0 , N , M ,COMM,DOT ,SLSH,FN0 , + LSFT, Z , X , C , V , B ,J2US, J2US, N , M ,COMM,DOT ,SLSH,J2US, //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| IMOF,P_LW,SPCT, ENSF,P_RS,IMON // +----+----+---/ \---+----+----+ ), - [_PSEUDO_US_LOWER] = LAYOUT_kc( + [_PSEUDO_US_LOWER] = LAYOUT_kc( //,----+----+----+----+----+----+ +----+----+----+----+----+----. - ,EXLM,LBRC,HASH,DLR ,PERC, EQL ,CIRC, DQT,ASTR,LPRN, , + ,EXLM,JAT ,HASH,DLR ,PERC, JCIR,JAMP,JAST,JLPR,JRPR, , //|----+----+----+----+----+----+----+ +----+----+----+----+----+----+----| - , F1 , F2 , F3 , F4 , F5 , F6 , LCBR,JYEN,MINS,UNDS,RBRC,BSLS, , + , F1 , F2 , F3 , F4 , F5 , F6 , JGRV,JBSL,MINS,JEQL,JLBR,JRBR, , //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , F7 , F8 , F9 , F10, F11, F12, PLUS,SYEN,SRO ,COLN,RCBR,PIPE, , + , F7 , F8 , F9 , F10, F11, F12, JTIL,JPIP,JUND,JPLU,JLCB,JRCB, , //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , , , , , + , , , , , // +----+----+---/ \---+----+----+ ), - [_PSEUDO_US_RAISE] = LAYOUT_kc( + [_PSEUDO_US_RAISE] = LAYOUT_kc( //,----+----+----+----+----+----+ +----+----+----+----+----+----. , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 , , //|----+----+----+----+----+----+----+ +----+----+----+----+----+----+----| - , , , , , , GRV, XXXX,LEFT,DOWN, UP ,RGHT,END , , + , , , , , ,JZHT, XXXX,LEFT,DOWN, UP ,RGHT,END , , //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , , , , , , , HOME,XXXX,XXXX,XXXX,XXXX,XXXX, , + , , , , , , , HOME,XXXX,PGDN,PGUP,XXXX,XXXX, , //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , , , , , + , , , , , // +----+----+---/ \---+----+----+ ), - [_ADJUST] = LAYOUT_kc( + [_ADJUST] = LAYOUT_kc( //,----+----+----+----+----+----+ +----+----+----+----+----+----. , , , , , , , , , , , , //|----+----+----+----+----+----+----+ +----+----+----+----+----+----+----| @@ -130,69 +162,16 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| , , , , , ,RST , P_US, , , , , , , //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - , , , , , + , , , , , // +----+----+---/ \---+----+----+ ) }; - -/* - * user defined action function - */ -enum function_id { - PSEUDO_US_FUNCTION, -}; - -void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { - switch (id) - { - case PSEUDO_US_FUNCTION: - action_pseudo_lut(record, _QWERTY, keymap_jis2us); - break; - } -} - -/* - * Fn action definition - */ -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_FUNCTION(PSEUDO_US_FUNCTION), -}; - -void matrix_scan_user(void) { - uint8_t layer = biton32(layer_state); - switch (layer) { - case _LOWER: - set_led_red; - break; - case _RAISE: - set_led_blue; - break; - case _PSEUDO_US_LOWER: - set_led_yellow; - break; - case _PSEUDO_US_RAISE: - set_led_cyan; - break; - case _ADJUST: - set_led_magenta; - break; - default: - set_led_green; - break; - } -}; - uint32_t layer_state_set_user(uint32_t state) { switch (biton32(state)) { - case _PSEUDO_US: - return update_tri_layer_state(state, _PSEUDO_US_RAISE, _PSEUDO_US_LOWER, _ADJUST); - break; case _PSEUDO_US_LOWER: - return update_tri_layer_state(state, _PSEUDO_US_RAISE, _PSEUDO_US_LOWER, _ADJUST); - break; - case _PSEUDO_US_RAISE: + case _PSEUDO_US_RAISE: return update_tri_layer_state(state, _PSEUDO_US_RAISE, _PSEUDO_US_LOWER, _ADJUST); break; default: @@ -201,19 +180,112 @@ uint32_t layer_state_set_user(uint32_t state) { } } +//SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h +#ifdef SSD1306OLED + +// You need to add source files to SRC in rules.mk when using OLED display functions +void set_keylog(uint16_t keycode); +const char *read_keylog(void); +const char *read_modifier_state(void); +const char *read_host_led_state(void); + +void matrix_init_user(void) { + iota_gfx_init(false); // turns on the display +} + +void matrix_scan_user(void) { + iota_gfx_task(); // this is what updates the display continuously +} + +void matrix_update(struct CharacterMatrix *dest, const struct CharacterMatrix *source) { + if (memcmp(dest->display, source->display, sizeof(dest->display))) { + memcpy(dest->display, source->display, sizeof(dest->display)); + dest->dirty = true; + } +} + +void render_status(struct CharacterMatrix *matrix) { + // Layer state + char layer_str[22]; + matrix_write(matrix, "Layer: "); + uint8_t layer = biton32(layer_state); + uint8_t default_layer = biton32(eeconfig_read_default_layer()); + switch (layer) { + case _QWERTY: + switch (default_layer) { + case _QWERTY: + snprintf(layer_str, sizeof(layer_str), "Qwerty"); + break; + case _PSEUDO_US: + snprintf(layer_str, sizeof(layer_str), "Psuedo_US"); + break; + default: + snprintf(layer_str, sizeof(layer_str), "Undef-%d", default_layer); + break; + } + break; + case _RAISE: + snprintf(layer_str, sizeof(layer_str), "Raise"); + break; + case _LOWER: + snprintf(layer_str, sizeof(layer_str), "Lower"); + break; + case _PSEUDO_US_RAISE: + snprintf(layer_str, sizeof(layer_str), "P_US_Raise"); + break; + case _PSEUDO_US_LOWER: + snprintf(layer_str, sizeof(layer_str), "P_US_Lower"); + break; + case _ADJUST: + snprintf(layer_str, sizeof(layer_str), "Adjust"); + break; + default: + snprintf(layer_str, sizeof(layer_str), "Undef-%d", layer); + } + matrix_write_ln(matrix, layer_str); + // Last entered keycode + matrix_write_ln(matrix, read_keylog()); + // Modifier state + matrix_write_ln(matrix, read_modifier_state()); + // Host Keyboard LED Status + matrix_write(matrix, read_host_led_state()); +} + +void iota_gfx_task_user(void) { + struct CharacterMatrix matrix; + +#if DEBUG_TO_SCREEN + if (debug_enable) { + return; + } +#endif + + matrix_clear(&matrix); + render_status(&matrix); + matrix_update(&display, &matrix); +} + +#endif//SSD1306OLED + bool process_record_user(uint16_t keycode, keyrecord_t *record) { + #ifdef SSD1306OLED + if (record->event.pressed) { + set_keylog(keycode); + } + #endif switch (keycode) { case QWERTY: if (record->event.pressed) { set_single_persistent_default_layer(_QWERTY); } - return false; break; case PSEUDO_US: if (record->event.pressed) { set_single_persistent_default_layer(_PSEUDO_US); } - return false; + break; + case JIS2US: + action_pseudo_lut(record, _QWERTY, keymap_jis2us); break; } return true; diff --git a/keyboards/comet46/keymaps/satt/keymap_jis2us.h b/keyboards/comet46/keymaps/satt/keymap_jis2us.h index cf2bd4f0e..e32a0579a 100644 --- a/keyboards/comet46/keymaps/satt/keymap_jis2us.h +++ b/keyboards/comet46/keymaps/satt/keymap_jis2us.h @@ -3,30 +3,30 @@ /* keymap for convert from JIS to US */ const uint16_t PROGMEM keymap_jis2us[][2] = { - [KC_A ... KC_CAPS] = { 0x00, 0x00 }, /* default value */ + [KC_A ... KC_CAPS] = { 0x00, 0x00 }, /* default value */ - [KC_1] = { KC_1, KC_EXLM }, /* 1 and ! -> 1 and ! */ - [KC_2] = { KC_2, KC_LBRC }, /* 2 and " -> 2 and @ */ - [KC_3] = { KC_3, KC_HASH }, /* 3 and # -> 3 and # */ - [KC_4] = { KC_4, KC_DLR }, /* 4 and $ -> 4 and $ */ - [KC_5] = { KC_5, KC_PERC }, /* 5 and % -> 5 and % */ - [KC_6] = { KC_6, KC_EQL }, /* 6 and & -> 6 and ^ */ - [KC_7] = { KC_7, KC_CIRC }, /* 7 and ' -> 7 and & */ - [KC_8] = { KC_8, KC_DQT }, /* 8 and ( -> 8 and * */ - [KC_9] = { KC_9, KC_ASTR }, /* 9 and ) -> 9 and ( */ - [KC_0] = { KC_0, KC_LPRN }, /* 0 and (no assign) -> 0 and ) */ - [KC_MINS] = { KC_MINS, S(KC_RO) }, /* - and = -> - and _ */ - [KC_EQL] = { KC_UNDS, KC_COLN }, /* ^ and ~ -> = and + */ - [KC_LBRC] = { KC_RBRC, KC_RCBR }, /* @ and ` -> [ and { */ - [KC_RBRC] = { KC_BSLS, KC_PIPE }, /* [ and { -> ] and } */ - [KC_BSLS] = { KC_JYEN, S(KC_JYEN) }, /* ] and } -> / and | */ - [KC_NUHS] = { KC_NUHS, S(KC_NUHS) }, /* (no assign) */ - [KC_SCLN] = { KC_SCLN, KC_QUOT }, /* ; and + -> ; and : */ - [KC_QUOT] = { KC_AMPR, KC_AT }, /* : and * -> ' and " */ - [KC_GRV] = { KC_LCBR, KC_PLUS }, /* (no assign) -> ` and ~ */ - [KC_COMM] = { KC_COMM, KC_LT }, /* , and < -> , and < */ - [KC_DOT] = { KC_DOT, KC_GT }, /* . and > -> . and > */ - [KC_SLSH] = { KC_SLSH, KC_QUES }, /* / and ? -> / and ? */ + [KC_1] = { KC_1, KC_EXLM }, /* 1 and ! -> 1 and ! */ + [KC_2] = { KC_2, KC_LBRC }, /* 2 and " -> 2 and @ */ + [KC_3] = { KC_3, KC_HASH }, /* 3 and # -> 3 and # */ + [KC_4] = { KC_4, KC_DLR }, /* 4 and $ -> 4 and $ */ + [KC_5] = { KC_5, KC_PERC }, /* 5 and % -> 5 and % */ + [KC_6] = { KC_6, KC_EQL }, /* 6 and & -> 6 and ^ */ + [KC_7] = { KC_7, KC_CIRC }, /* 7 and ' -> 7 and & */ + [KC_8] = { KC_8, KC_DQT }, /* 8 and ( -> 8 and * */ + [KC_9] = { KC_9, KC_ASTR }, /* 9 and ) -> 9 and ( */ + [KC_0] = { KC_0, KC_LPRN }, /* 0 and (no assign) -> 0 and ) */ + [KC_MINS] = { KC_MINS, S(KC_RO) }, /* - and = -> - and _ */ + [KC_EQL] = { KC_UNDS, KC_COLN }, /* ^ and ~ -> = and + */ + [KC_LBRC] = { KC_RBRC, KC_RCBR }, /* @ and ` -> [ and { */ + [KC_RBRC] = { KC_BSLS, KC_PIPE }, /* [ and { -> ] and } */ + [KC_BSLS] = { KC_JYEN, S(KC_JYEN) }, /* ] and } -> / and | */ + [KC_NUHS] = { KC_NUHS, S(KC_NUHS) }, /* (no assign) */ + [KC_SCLN] = { KC_SCLN, KC_QUOT }, /* ; and + -> ; and : */ + [KC_QUOT] = { KC_AMPR, KC_AT }, /* : and * -> ' and " */ + [KC_GRV] = { KC_LCBR, KC_PLUS }, /* (no assign) -> ` and ~ */ + [KC_COMM] = { KC_COMM, KC_LT }, /* , and < -> , and < */ + [KC_DOT] = { KC_DOT, KC_GT }, /* . and > -> . and > */ + [KC_SLSH] = { KC_SLSH, KC_QUES }, /* / and ? -> / and ? */ }; #endif diff --git a/keyboards/comet46/keymaps/satt/rules.mk b/keyboards/comet46/keymaps/satt/rules.mk index dc4355c78..5839b778b 100644 --- a/keyboards/comet46/keymaps/satt/rules.mk +++ b/keyboards/comet46/keymaps/satt/rules.mk @@ -1,26 +1,7 @@ SRC += action_pseudo_lut.c -# Build Options -# change to "no" to disable the options, or define them in the Makefile in -# the appropriate keymap folder that will get included automatically -# -BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = no # Mouse keys(+4700) -EXTRAKEY_ENABLE = no # Audio control and System control(+450) -CONSOLE_ENABLE = no # Console for debug(+400) -COMMAND_ENABLE = no # Commands for debug and configuration -NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality -MIDI_ENABLE = no # MIDI controls -AUDIO_ENABLE = no # Audio output on port C6 -UNICODE_ENABLE = no # Unicode -BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. -ONEHAND_ENABLE = no # Enable one-hand typing - -# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE -SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend - -ifndef QUANTUM_DIR - include ../../../../Makefile -endif +# If you want to change display settings of the OLED, you need to change the following lines +SRC += ./lib/glcdfont.c \ + ./lib/keylogger.c \ + ./lib/modifier_state_reader.c \ + ./lib/host_led_state_reader.c diff --git a/keyboards/comet46/lib/glcdfont.c b/keyboards/comet46/lib/glcdfont.c new file mode 100644 index 000000000..e912d2233 --- /dev/null +++ b/keyboards/comet46/lib/glcdfont.c @@ -0,0 +1,148 @@ +// This is the 'classic' fixed-space bitmap font for Adafruit_GFX since 1.0. +// See gfxfont.h for newer custom bitmap font info. + +#ifndef FONT5X7_H +#define FONT5X7_H + +#ifdef __AVR__ + #include + #include +#elif defined(ESP8266) + #include +#else + #define PROGMEM +#endif + +// Standard ASCII 5x7 font + +const unsigned char font[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x00, + 0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x00, + 0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x00, + 0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x00, + 0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x00, + 0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00, + 0x00, 0x18, 0x3C, 0x18, 0x00, 0x00, + 0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00, + 0x00, 0x18, 0x24, 0x18, 0x00, 0x00, + 0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x00, + 0x30, 0x48, 0x3A, 0x06, 0x0E, 0x00, + 0x26, 0x29, 0x79, 0x29, 0x26, 0x00, + 0x40, 0x7F, 0x05, 0x05, 0x07, 0x00, + 0x40, 0x7F, 0x05, 0x25, 0x3F, 0x00, + 0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x00, + 0x7F, 0x3E, 0x1C, 0x1C, 0x08, 0x00, + 0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x00, + 0x14, 0x22, 0x7F, 0x22, 0x14, 0x00, + 0x5F, 0x5F, 0x00, 0x5F, 0x5F, 0x00, + 0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00, + 0x00, 0x66, 0x89, 0x95, 0x6A, 0x00, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, + 0x94, 0xA2, 0xFF, 0xA2, 0x94, 0x00, + 0x08, 0x04, 0x7E, 0x04, 0x08, 0x00, + 0x10, 0x20, 0x7E, 0x20, 0x10, 0x00, + 0x08, 0x08, 0x2A, 0x1C, 0x08, 0x00, + 0x08, 0x1C, 0x2A, 0x08, 0x08, 0x00, + 0x1E, 0x10, 0x10, 0x10, 0x10, 0x00, + 0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x00, + 0x30, 0x38, 0x3E, 0x38, 0x30, 0x00, + 0x06, 0x0E, 0x3E, 0x0E, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, + 0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00, + 0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00, + 0x23, 0x13, 0x08, 0x64, 0x62, 0x00, + 0x36, 0x49, 0x56, 0x20, 0x50, 0x00, + 0x00, 0x08, 0x07, 0x03, 0x00, 0x00, + 0x00, 0x1C, 0x22, 0x41, 0x00, 0x00, + 0x00, 0x41, 0x22, 0x1C, 0x00, 0x00, + 0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x00, + 0x08, 0x08, 0x3E, 0x08, 0x08, 0x00, + 0x00, 0x80, 0x70, 0x30, 0x00, 0x00, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, + 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, + 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, + 0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00, + 0x00, 0x42, 0x7F, 0x40, 0x00, 0x00, + 0x72, 0x49, 0x49, 0x49, 0x46, 0x00, + 0x21, 0x41, 0x49, 0x4D, 0x33, 0x00, + 0x18, 0x14, 0x12, 0x7F, 0x10, 0x00, + 0x27, 0x45, 0x45, 0x45, 0x39, 0x00, + 0x3C, 0x4A, 0x49, 0x49, 0x31, 0x00, + 0x41, 0x21, 0x11, 0x09, 0x07, 0x00, + 0x36, 0x49, 0x49, 0x49, 0x36, 0x00, + 0x46, 0x49, 0x49, 0x29, 0x1E, 0x00, + 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x00, 0x40, 0x34, 0x00, 0x00, 0x00, + 0x00, 0x08, 0x14, 0x22, 0x41, 0x00, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x00, + 0x00, 0x41, 0x22, 0x14, 0x08, 0x00, + 0x02, 0x01, 0x59, 0x09, 0x06, 0x00, + 0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x00, + 0x7C, 0x12, 0x11, 0x12, 0x7C, 0x00, + 0x7F, 0x49, 0x49, 0x49, 0x36, 0x00, + 0x3E, 0x41, 0x41, 0x41, 0x22, 0x00, + 0x7F, 0x41, 0x41, 0x41, 0x3E, 0x00, + 0x7F, 0x49, 0x49, 0x49, 0x41, 0x00, + 0x7F, 0x09, 0x09, 0x09, 0x01, 0x00, + 0x3E, 0x41, 0x41, 0x51, 0x73, 0x00, + 0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00, + 0x00, 0x41, 0x7F, 0x41, 0x00, 0x00, + 0x20, 0x40, 0x41, 0x3F, 0x01, 0x00, + 0x7F, 0x08, 0x14, 0x22, 0x41, 0x00, + 0x7F, 0x40, 0x40, 0x40, 0x40, 0x00, + 0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x00, + 0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00, + 0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00, + 0x7F, 0x09, 0x09, 0x09, 0x06, 0x00, + 0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00, + 0x7F, 0x09, 0x19, 0x29, 0x46, 0x00, + 0x26, 0x49, 0x49, 0x49, 0x32, 0x00, + 0x03, 0x01, 0x7F, 0x01, 0x03, 0x00, + 0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00, + 0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00, + 0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00, + 0x63, 0x14, 0x08, 0x14, 0x63, 0x00, + 0x03, 0x04, 0x78, 0x04, 0x03, 0x00, + 0x61, 0x59, 0x49, 0x4D, 0x43, 0x00, + 0x00, 0x7F, 0x41, 0x41, 0x41, 0x00, + 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, + 0x00, 0x41, 0x41, 0x41, 0x7F, 0x00, + 0x04, 0x02, 0x01, 0x02, 0x04, 0x00, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, + 0x00, 0x03, 0x07, 0x08, 0x00, 0x00, + 0x20, 0x54, 0x54, 0x78, 0x40, 0x00, + 0x7F, 0x28, 0x44, 0x44, 0x38, 0x00, + 0x38, 0x44, 0x44, 0x44, 0x28, 0x00, + 0x38, 0x44, 0x44, 0x28, 0x7F, 0x00, + 0x38, 0x54, 0x54, 0x54, 0x18, 0x00, + 0x00, 0x08, 0x7E, 0x09, 0x02, 0x00, + 0x18, 0xA4, 0xA4, 0x9C, 0x78, 0x00, + 0x7F, 0x08, 0x04, 0x04, 0x78, 0x00, + 0x00, 0x44, 0x7D, 0x40, 0x00, 0x00, + 0x20, 0x40, 0x40, 0x3D, 0x00, 0x00, + 0x7F, 0x10, 0x28, 0x44, 0x00, 0x00, + 0x00, 0x41, 0x7F, 0x40, 0x00, 0x00, + 0x7C, 0x04, 0x78, 0x04, 0x78, 0x00, + 0x7C, 0x08, 0x04, 0x04, 0x78, 0x00, + 0x38, 0x44, 0x44, 0x44, 0x38, 0x00, + 0xFC, 0x18, 0x24, 0x24, 0x18, 0x00, + 0x18, 0x24, 0x24, 0x18, 0xFC, 0x00, + 0x7C, 0x08, 0x04, 0x04, 0x08, 0x00, + 0x48, 0x54, 0x54, 0x54, 0x24, 0x00, + 0x04, 0x04, 0x3F, 0x44, 0x24, 0x00, + 0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00, + 0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00, + 0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00, + 0x44, 0x28, 0x10, 0x28, 0x44, 0x00, + 0x4C, 0x90, 0x90, 0x90, 0x7C, 0x00, + 0x44, 0x64, 0x54, 0x4C, 0x44, 0x00, + 0x00, 0x08, 0x36, 0x41, 0x00, 0x00, + 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, + 0x00, 0x41, 0x36, 0x08, 0x00, 0x00, + 0x02, 0x01, 0x02, 0x04, 0x02, 0x00, + 0x3C, 0x26, 0x23, 0x26, 0x3C, 0x00 +}; +#endif // FONT5X7_H diff --git a/keyboards/comet46/lib/host_led_state_reader.c b/keyboards/comet46/lib/host_led_state_reader.c new file mode 100644 index 000000000..864b1e244 --- /dev/null +++ b/keyboards/comet46/lib/host_led_state_reader.c @@ -0,0 +1,15 @@ +#include +#include "comet46.h" + +char host_led_state_str[22]; + +const char *read_host_led_state(void) { + uint8_t leds = host_keyboard_leds(); + + snprintf(host_led_state_str, sizeof(host_led_state_str), "Lock: %s%s%s", + (leds & (1 << USB_LED_CAPS_LOCK)) ? "CAPL " : "", + (leds & (1 << USB_LED_SCROLL_LOCK)) ? "SCRL " : "", + (leds & (1 << USB_LED_NUM_LOCK)) ? "NUML" : ""); + + return host_led_state_str; +} diff --git a/keyboards/comet46/lib/keylogger.c b/keyboards/comet46/lib/keylogger.c new file mode 100644 index 000000000..184f60109 --- /dev/null +++ b/keyboards/comet46/lib/keylogger.c @@ -0,0 +1,294 @@ +#include + +#ifdef __AVR__ + #include + #include +#else + #define PROGMEM +#endif + +#define NUM_USB_HID_KEYCODES 255 +#define LEN_KEYCODE_STR 4 + +char keylog[22] = {"KC: ID: "}; + +// Quick and dirty way to display USB HID keycodes used in QMK +// USB HID keycodes from 0x0000 to 0x00FF are stored in a 4x256+1 length char +const char code_to_name[] PROGMEM = { + "NO " //0x00 + "TRNS" + "? " + "? " + "A " + "B " + "C " + "D " + "E " + "F " + "G " + "H " + "I " + "J " + "K " + "L " + "M " //0x10 + "N " + "O " + "P " + "Q " + "R " + "S " + "T " + "U " + "V " + "W " + "X " + "Y " + "Z " + "1 " + "2 " + "3 " //0x20 + "4 " + "5 " + "6 " + "7 " + "8 " + "9 " + "0 " + "ENT " + "ESC " + "BSPC" + "TAB " + "SPC " + "MINS" + "EQL " + "LBRC" + "RBRC" //0x30 + "BSLS" + "NUHS" + "SCLN" + "QUOT" + "GRV " + "COMM" + "DOT " + "SLSH" + "CAPS" + "F1 " + "F2 " + "F3 " + "F4 " + "F5 " + "F6 " + "F7 " //0x40 + "F8 " + "F9 " + "F10 " + "F11 " + "F12 " + "PSCR" + "SLCK" + "PAUS" + "INS " + "HOME" + "PGUP" + "DEL " + "END " + "PGDN" + "RGHT" + "LEFT" //0x50 + "DOWN" + "UP " + "NLCK" + "PSLS" + "PAST" + "PMNS" + "PPLS" + "PENT" + "P1 " + "P2 " + "P3 " + "P4 " + "P5 " + "P6 " + "P7 " + "P8 " //0x60 + "P9 " + "P0 " + "PDOT" + "NUBS" + "APP " + "POW " + "PEQL" + "F13 " + "F14 " + "F15 " + "F16 " + "F17 " + "F18 " + "F19 " + "F20 " + "F21 " //0x70 + "F22 " + "F23 " + "F24 " + "EXEC" + "HELP" + "MENU" + "SLCT" + "STOP" + "AGIN" + "UNDO" + "CUT " + "COPY" + "PSTE" + "FIND" + "_MUT" + "_VUP" //0x80 + "_VDN" + "LCAP" + "LNUM" + "LSCR" + "PCMM" + "PEQA" + "INT1" + "INT2" + "INT3" + "INT4" + "INT5" + "INT6" + "INT7" + "INT8" + "INT9" + "LAN1" //0x90 + "LAN2" + "LAN3" + "LAN4" + "LAN5" + "LAN6" + "LAN7" + "LAN8" + "LAN9" + "ERAS" + "SYSR" + "CNCL" + "CLR " + "PRIR" + "RTRN" + "SEP " + "OUT " //0xA0 + "OPER" + "CLRA" + "CSEL" + "ESEL" + "PWR " //0xA5 + "SLEP" + "WAKE" + "MUTE" + "VOLU" + "VOLD" + "MNXT" + "MPRV" + "MSTP" + "MPLY" + "MSEL" + "EJCT" //0xB0 + "MAIL" + "CALC" + "MYCM" + "WSCH" + "WHOM" + "WBAK" + "WFWD" + "WSTP" + "WREF" + "WFAV" + "MFFD" + "MRWD" + "BRIU" + "BRID" + "? " + "FN0 " //0xC0 + "FN1 " + "FN2 " + "FN3 " + "FN4 " + "FN5 " + "FN6 " + "FN7 " + "FN8 " + "FN9 " + "FN10" + "FN11" + "FN12" + "FN13" + "FN14" + "FN15" + "FN16" //0xD0 + "FN17" + "FN18" + "FN19" + "FN20" + "FN21" + "FN22" + "FN23" + "FN24" + "FN25" + "FN26" + "FN27" + "FN28" + "FN29" + "FN30" + "FN31" + "LCTL" //0xE0 + "LSFT" + "LALT" + "LGUI" + "RCTL" + "RSFT" + "RALT" + "RGUI" + "? " + "? " + "? " + "? " + "? " + "? " + "? " + "? " + "MS_U" //0xF0 + "MS_D" + "MS_L" + "MS_R" + "BTN1" + "BTN2" + "BTN3" + "BTN4" + "BTN5" + "WH_U" + "WH_D" + "WH_L" + "WH_R" + "ACL0" + "ACL1" + "ACL2" +}; + +void set_keylog(uint16_t keycode) +{ + char name[LEN_KEYCODE_STR+1] = "? "; + + if (keycode <= NUM_USB_HID_KEYCODES) { + for (uint8_t k = 0; k < LEN_KEYCODE_STR; k++) { + name[k] = pgm_read_byte_near(code_to_name + keycode * LEN_KEYCODE_STR + k); + } + } else if (keycode > NUM_USB_HID_KEYCODES) { + snprintf(name, sizeof(name), "QMK "); + } + + // update keylog + snprintf(keylog, sizeof(keylog), "KC: %s ID: %d", name, keycode); +} + +const char *read_keylog(void) { + return keylog; +} diff --git a/keyboards/comet46/lib/modifier_state_reader.c b/keyboards/comet46/lib/modifier_state_reader.c new file mode 100644 index 000000000..518eef92a --- /dev/null +++ b/keyboards/comet46/lib/modifier_state_reader.c @@ -0,0 +1,18 @@ +#include +#include "comet46.h" + +char modifier_state_str[22]; + +const char *read_modifier_state(void) { + uint8_t modifiers = get_mods(); + uint8_t one_shot = get_oneshot_mods(); + + snprintf(modifier_state_str, sizeof(modifier_state_str), "Mod: %s%s%s%s", + (modifiers & MODS_CTRL_MASK || one_shot & MODS_CTRL_MASK) ? "CTL " : "", + (modifiers & MODS_GUI_MASK || one_shot & MODS_GUI_MASK) ? "GUI " : "", + (modifiers & MODS_ALT_MASK || one_shot & MODS_ALT_MASK) ? "ALT " : "", + (modifiers & MODS_SHIFT_MASK || one_shot & MODS_SHIFT_MASK) ? "SFT" : "" + ); + + return modifier_state_str; +} diff --git a/keyboards/comet46/readme.md b/keyboards/comet46/readme.md index 8df27183d..3db64d291 100644 --- a/keyboards/comet46/readme.md +++ b/keyboards/comet46/readme.md @@ -1,6 +1,6 @@ # Comet46 -![Comet46](https://user-images.githubusercontent.com/39004890/42418180-d5bb188c-82d5-11e8-99fa-65020ce5ac5d.jpg) +![Comet46](https://user-images.githubusercontent.com/39004890/50396817-a1660600-07af-11e9-8611-3156c635db43.jpg) A split wireless 40% column-staggered keyboard @@ -13,4 +13,5 @@ Make example for this keyboard (after setting up your build environment): make comet46:default -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. +See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. + diff --git a/keyboards/comet46/rules.mk b/keyboards/comet46/rules.mk index 648b8b200..897cc9b8c 100644 --- a/keyboards/comet46/rules.mk +++ b/keyboards/comet46/rules.mk @@ -1,12 +1,8 @@ - -OPT_DEFS += -DCOMET46_ORTHO_===PROMICRO -COMET46_UPLOAD_COMMAND = while [ ! -r $(USB) ]; do sleep 1; done; \ - avrdude -p $(MCU) -c avr109 -U flash:w:$(TARGET).hex -P $(USB) - # # project specific files -SRC = matrix.c - - +SRC += matrix.c \ + i2c.c \ + ssd1306.c + # MCU name #MCU = at90usb1287 MCU = atmega32u4 @@ -24,8 +20,6 @@ MCU = atmega32u4 # software delays. F_CPU = 16000000 - -# # LUFA specific # # Target architecture (see library "Board Types" documentation). @@ -48,7 +42,7 @@ F_USB = $(F_CPU) # This definition is optional, and if your keyboard supports multiple bootloaders of # different sizes, comment this out, and the correct address will be loaded # automatically (+60). See bootloader.mk for all options. -BOOTLOADER = caterina +# BOOTLOADER = caterina # Interrupt driven control endpoint task(+60) OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT diff --git a/keyboards/comet46/ssd1306.c b/keyboards/comet46/ssd1306.c new file mode 100644 index 000000000..4330c8497 --- /dev/null +++ b/keyboards/comet46/ssd1306.c @@ -0,0 +1,344 @@ +#ifdef SSD1306OLED + +#include "ssd1306.h" +#include "i2c.h" +#include +#include "print.h" +#ifdef ADAFRUIT_BLE_ENABLE +#include "adafruit_ble.h" +#endif +#ifdef PROTOCOL_LUFA +#include "lufa.h" +#endif +#include "sendchar.h" +#include "timer.h" + +static const unsigned char font[] PROGMEM; + +// Set this to 1 to help diagnose early startup problems +// when testing power-on with ble. Turn it off otherwise, +// as the latency of printing most of the debug info messes +// with the matrix scan, causing keys to drop. +#define DEBUG_TO_SCREEN 0 + +//static uint16_t last_battery_update; +//static uint32_t vbat; +//#define BatteryUpdateInterval 10000 /* milliseconds */ + +// 'last_flush' is declared as uint16_t, +// so this must be less than 65535 +#define ScreenOffInterval 60000 /* milliseconds */ +#if DEBUG_TO_SCREEN +static uint8_t displaying; +#endif +static uint16_t last_flush; + +static bool force_dirty = true; + +// Write command sequence. +// Returns true on success. +static inline bool _send_cmd1(uint8_t cmd) { + bool res = false; + + if (i2c_start_write(SSD1306_ADDRESS)) { + xprintf("failed to start write to %d\n", SSD1306_ADDRESS); + goto done; + } + + if (i2c_master_write(0x0 /* command byte follows */)) { + print("failed to write control byte\n"); + + goto done; + } + + if (i2c_master_write(cmd)) { + xprintf("failed to write command %d\n", cmd); + goto done; + } + res = true; +done: + i2c_master_stop(); + return res; +} + +// Write 2-byte command sequence. +// Returns true on success +static inline bool _send_cmd2(uint8_t cmd, uint8_t opr) { + if (!_send_cmd1(cmd)) { + return false; + } + return _send_cmd1(opr); +} + +// Write 3-byte command sequence. +// Returns true on success +static inline bool _send_cmd3(uint8_t cmd, uint8_t opr1, uint8_t opr2) { + if (!_send_cmd1(cmd)) { + return false; + } + if (!_send_cmd1(opr1)) { + return false; + } + return _send_cmd1(opr2); +} + +#define send_cmd1(c) if (!_send_cmd1(c)) {goto done;} +#define send_cmd2(c,o) if (!_send_cmd2(c,o)) {goto done;} +#define send_cmd3(c,o1,o2) if (!_send_cmd3(c,o1,o2)) {goto done;} + +static void clear_display(void) { + matrix_clear(&display); + + // Clear all of the display bits (there can be random noise + // in the RAM on startup) + send_cmd3(PageAddr, 0, (DisplayHeight / 8) - 1); + send_cmd3(ColumnAddr, 0, DisplayWidth - 1); + + if (i2c_start_write(SSD1306_ADDRESS)) { + goto done; + } + if (i2c_master_write(0x40)) { + // Data mode + goto done; + } + for (uint8_t row = 0; row < MatrixRows; ++row) { + for (uint8_t col = 0; col < DisplayWidth; ++col) { + i2c_master_write(0); + } + } + + display.dirty = false; + +done: + i2c_master_stop(); +} + +#if DEBUG_TO_SCREEN +#undef sendchar +static int8_t capture_sendchar(uint8_t c) { + sendchar(c); + iota_gfx_write_char(c); + + if (!displaying) { + iota_gfx_flush(); + } + return 0; +} +#endif + +bool iota_gfx_init(bool rotate) { + bool success = false; + + i2c_master_init(); + send_cmd1(DisplayOff); + send_cmd2(SetDisplayClockDiv, 0x80); + send_cmd2(SetMultiPlex, DisplayHeight - 1); + + send_cmd2(SetDisplayOffset, 0); + + + send_cmd1(SetStartLine | 0x0); + send_cmd2(SetChargePump, 0x14 /* Enable */); + send_cmd2(SetMemoryMode, 0 /* horizontal addressing */); + + if(rotate){ + // the following Flip the display orientation 180 degrees + send_cmd1(SegRemap); + send_cmd1(ComScanInc); + }else{ + // Flips the display orientation 0 degrees + send_cmd1(SegRemap | 0x1); + send_cmd1(ComScanDec); + } + + send_cmd2(SetComPins, 0x2); + send_cmd2(SetContrast, 0x8f); + send_cmd2(SetPreCharge, 0xf1); + send_cmd2(SetVComDetect, 0x40); + send_cmd1(DisplayAllOnResume); + send_cmd1(NormalDisplay); + send_cmd1(DeActivateScroll); + send_cmd1(DisplayOn); + + send_cmd2(SetContrast, 0); // Dim + + clear_display(); + + success = true; + + iota_gfx_flush(); + +#if DEBUG_TO_SCREEN + print_set_sendchar(capture_sendchar); +#endif + +done: + return success; +} + +bool iota_gfx_off(void) { + bool success = false; + + send_cmd1(DisplayOff); + success = true; + +done: + return success; +} + +bool iota_gfx_on(void) { + bool success = false; + + send_cmd1(DisplayOn); + success = true; + +done: + return success; +} + +void matrix_write_char_inner(struct CharacterMatrix *matrix, uint8_t c) { + *matrix->cursor = c; + ++matrix->cursor; + + if (matrix->cursor - &matrix->display[0][0] == sizeof(matrix->display)) { + // We went off the end; scroll the display upwards by one line + memmove(&matrix->display[0], &matrix->display[1], + MatrixCols * (MatrixRows - 1)); + matrix->cursor = &matrix->display[MatrixRows - 1][0]; + memset(matrix->cursor, ' ', MatrixCols); + } +} + +void matrix_write_char(struct CharacterMatrix *matrix, uint8_t c) { + matrix->dirty = true; + + if (c == '\n') { + // Clear to end of line from the cursor and then move to the + // start of the next line + uint8_t cursor_col = (matrix->cursor - &matrix->display[0][0]) % MatrixCols; + + while (cursor_col++ < MatrixCols) { + matrix_write_char_inner(matrix, ' '); + } + return; + } + + matrix_write_char_inner(matrix, c); +} + +void iota_gfx_write_char(uint8_t c) { + matrix_write_char(&display, c); +} + +void matrix_write(struct CharacterMatrix *matrix, const char *data) { + const char *end = data + strlen(data); + while (data < end) { + matrix_write_char(matrix, *data); + ++data; + } +} + +void matrix_write_ln(struct CharacterMatrix *matrix, const char *data) { + char data_ln[strlen(data)+2]; + snprintf(data_ln, sizeof(data_ln), "%s\n", data); + matrix_write(matrix, data_ln); +} + +void iota_gfx_write(const char *data) { + matrix_write(&display, data); +} + +void matrix_write_P(struct CharacterMatrix *matrix, const char *data) { + while (true) { + uint8_t c = pgm_read_byte(data); + if (c == 0) { + return; + } + matrix_write_char(matrix, c); + ++data; + } +} + +void iota_gfx_write_P(const char *data) { + matrix_write_P(&display, data); +} + +void matrix_clear(struct CharacterMatrix *matrix) { + memset(matrix->display, ' ', sizeof(matrix->display)); + matrix->cursor = &matrix->display[0][0]; + matrix->dirty = true; +} + +void iota_gfx_clear_screen(void) { + matrix_clear(&display); +} + +void matrix_render(struct CharacterMatrix *matrix) { + last_flush = timer_read(); + iota_gfx_on(); +#if DEBUG_TO_SCREEN + ++displaying; +#endif + + // Move to the home position + send_cmd3(PageAddr, 0, MatrixRows - 1); + send_cmd3(ColumnAddr, 0, (MatrixCols * FontWidth) - 1); + + if (i2c_start_write(SSD1306_ADDRESS)) { + goto done; + } + if (i2c_master_write(0x40)) { + // Data mode + goto done; + } + + for (uint8_t row = 0; row < MatrixRows; ++row) { + for (uint8_t col = 0; col < MatrixCols; ++col) { + const uint8_t *glyph = font + (matrix->display[row][col] * FontWidth); + + for (uint8_t glyphCol = 0; glyphCol < FontWidth; ++glyphCol) { + uint8_t colBits = pgm_read_byte(glyph + glyphCol); + i2c_master_write(colBits); + } + + // 1 column of space between chars (it's not included in the glyph) + //i2c_master_write(0); + } + } + + matrix->dirty = false; + +done: + i2c_master_stop(); +#if DEBUG_TO_SCREEN + --displaying; +#endif +} + +void iota_gfx_flush(void) { + matrix_render(&display); +} + +__attribute__ ((weak)) +void iota_gfx_task_user(void) { +} + +void iota_gfx_task(void) { + iota_gfx_task_user(); + + if (display.dirty|| force_dirty) { + iota_gfx_flush(); + force_dirty = false; + } + + if (timer_elapsed(last_flush) > ScreenOffInterval) { + iota_gfx_off(); + } +} + +bool process_record_gfx(uint16_t keycode, keyrecord_t *record) { + force_dirty = true; + return true; +} + +#endif diff --git a/keyboards/comet46/ssd1306.h b/keyboards/comet46/ssd1306.h new file mode 100644 index 000000000..ea8c92328 --- /dev/null +++ b/keyboards/comet46/ssd1306.h @@ -0,0 +1,91 @@ +#pragma once + +#include +#include +#include "pincontrol.h" +#include "action.h" + +enum ssd1306_cmds { + DisplayOff = 0xAE, + DisplayOn = 0xAF, + + SetContrast = 0x81, + DisplayAllOnResume = 0xA4, + + DisplayAllOn = 0xA5, + NormalDisplay = 0xA6, + InvertDisplay = 0xA7, + SetDisplayOffset = 0xD3, + SetComPins = 0xda, + SetVComDetect = 0xdb, + SetDisplayClockDiv = 0xD5, + SetPreCharge = 0xd9, + SetMultiPlex = 0xa8, + SetLowColumn = 0x00, + SetHighColumn = 0x10, + SetStartLine = 0x40, + + SetMemoryMode = 0x20, + ColumnAddr = 0x21, + PageAddr = 0x22, + + ComScanInc = 0xc0, + ComScanDec = 0xc8, + SegRemap = 0xa0, + SetChargePump = 0x8d, + ExternalVcc = 0x01, + SwitchCapVcc = 0x02, + + ActivateScroll = 0x2f, + DeActivateScroll = 0x2e, + SetVerticalScrollArea = 0xa3, + RightHorizontalScroll = 0x26, + LeftHorizontalScroll = 0x27, + VerticalAndRightHorizontalScroll = 0x29, + VerticalAndLeftHorizontalScroll = 0x2a, +}; + +// Controls the SSD1306 128x32 OLED display via i2c + +#ifndef SSD1306_ADDRESS +#define SSD1306_ADDRESS 0x3C +#endif + +#define DisplayHeight 32 +#define DisplayWidth 128 + +#define FontHeight 8 +#define FontWidth 6 + +#define MatrixRows (DisplayHeight / FontHeight) +#define MatrixCols (DisplayWidth / FontWidth) + +struct CharacterMatrix { + uint8_t display[MatrixRows][MatrixCols]; + uint8_t *cursor; + bool dirty; +}; + +struct CharacterMatrix display; + +bool iota_gfx_init(bool rotate); +void iota_gfx_task(void); +bool iota_gfx_off(void); +bool iota_gfx_on(void); +void iota_gfx_flush(void); +void iota_gfx_write_char(uint8_t c); +void iota_gfx_write(const char *data); +void iota_gfx_write_P(const char *data); +void iota_gfx_clear_screen(void); + +void iota_gfx_task_user(void); + +void matrix_clear(struct CharacterMatrix *matrix); +void matrix_write_char_inner(struct CharacterMatrix *matrix, uint8_t c); +void matrix_write_char(struct CharacterMatrix *matrix, uint8_t c); +void matrix_write(struct CharacterMatrix *matrix, const char *data); +void matrix_write_ln(struct CharacterMatrix *matrix, const char *data); +void matrix_write_P(struct CharacterMatrix *matrix, const char *data); +void matrix_render(struct CharacterMatrix *matrix); + +bool process_record_gfx(uint16_t keycode, keyrecord_t *record); \ No newline at end of file From 3ddec14eb8c1b666df381573c6db8a4b2fda035f Mon Sep 17 00:00:00 2001 From: Giuseppe Rota Date: Sat, 29 Dec 2018 15:48:01 +0100 Subject: [PATCH 772/788] Register the interrupting keycode in the tap dance state struct --- quantum/process_keycode/process_tap_dance.c | 2 ++ quantum/process_keycode/process_tap_dance.h | 1 + 2 files changed, 3 insertions(+) diff --git a/quantum/process_keycode/process_tap_dance.c b/quantum/process_keycode/process_tap_dance.c index b55ace5ba..16d33ddde 100644 --- a/quantum/process_keycode/process_tap_dance.c +++ b/quantum/process_keycode/process_tap_dance.c @@ -131,6 +131,7 @@ void preprocess_tap_dance(uint16_t keycode, keyrecord_t *record) { if (keycode == action->state.keycode && keycode == last_td) continue; action->state.interrupted = true; + action->state.interrupting_keycode = keycode; process_tap_dance_action_on_dance_finished (action); reset_tap_dance (&action->state); } @@ -209,5 +210,6 @@ void reset_tap_dance (qk_tap_dance_state_t *state) { state->count = 0; state->interrupted = false; state->finished = false; + state->interrupting_keycode = 0; last_td = 0; } diff --git a/quantum/process_keycode/process_tap_dance.h b/quantum/process_keycode/process_tap_dance.h index 8b0a47c49..ca12f4746 100644 --- a/quantum/process_keycode/process_tap_dance.h +++ b/quantum/process_keycode/process_tap_dance.h @@ -27,6 +27,7 @@ typedef struct uint8_t oneshot_mods; uint8_t weak_mods; uint16_t keycode; + uint16_t interrupting_keycode; uint16_t timer; bool interrupted; bool pressed; From 0c0e208a36300660f3d568d52ae3155becf92893 Mon Sep 17 00:00:00 2001 From: takashiski Date: Mon, 31 Dec 2018 07:53:09 +0900 Subject: [PATCH 773/788] define brainfuck keymap (#4742) * define brainfuck keymap * Update keyboards/namecard2x4/keymaps/brainfuck/readme.md Co-Authored-By: takashiski --- .../namecard2x4/keymaps/brainfuck/config.h | 19 ++++++ .../namecard2x4/keymaps/brainfuck/keymap.c | 59 +++++++++++++++++++ .../namecard2x4/keymaps/brainfuck/readme.md | 12 ++++ 3 files changed, 90 insertions(+) create mode 100644 keyboards/namecard2x4/keymaps/brainfuck/config.h create mode 100644 keyboards/namecard2x4/keymaps/brainfuck/keymap.c create mode 100644 keyboards/namecard2x4/keymaps/brainfuck/readme.md diff --git a/keyboards/namecard2x4/keymaps/brainfuck/config.h b/keyboards/namecard2x4/keymaps/brainfuck/config.h new file mode 100644 index 000000000..dbacdcce5 --- /dev/null +++ b/keyboards/namecard2x4/keymaps/brainfuck/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 takashiski + * + * 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 . + */ + +#pragma once + +// place overrides here diff --git a/keyboards/namecard2x4/keymaps/brainfuck/keymap.c b/keyboards/namecard2x4/keymaps/brainfuck/keymap.c new file mode 100644 index 000000000..287e011de --- /dev/null +++ b/keyboards/namecard2x4/keymaps/brainfuck/keymap.c @@ -0,0 +1,59 @@ +/* Copyright 2018 takashiski + * + * 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 . + */ +#include QMK_KEYBOARD_H +#include "keymap_jp.h" + +enum Layer +{ + JP, + EN, + CONFIG +}; + + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[JP] = LAYOUT( + JP_LT,JP_GT,JP_PLUS,JP_MINS,\ + LT(CONFIG,JP_DOT),JP_COMM,JP_LBRC,LT(CONFIG,JP_RBRC)\ + ), +[EN] = LAYOUT( + KC_LT,KC_GT,KC_PLUS,KC_MINS,\ + LT(CONFIG,KC_DOT),KC_COMM,KC_LBRC,LT(CONFIG,KC_RBRC)\ + ), +[CONFIG]= LAYOUT( + KC_NO,DF(JP),DF(JP),KC_NO,\ + KC_TRNS,DF(EN),DF(JP),KC_TRNS\ + ) + +}; + + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/namecard2x4/keymaps/brainfuck/readme.md b/keyboards/namecard2x4/keymaps/brainfuck/readme.md new file mode 100644 index 000000000..7fee17acd --- /dev/null +++ b/keyboards/namecard2x4/keymaps/brainfuck/readme.md @@ -0,0 +1,12 @@ +# keymap for brainfuck + + This keymap is specialized for the brainfuck programming language. + +| < | > | + | - | +| . | , | [ | ] | + +and when you hold . or ], change config layer. + +default layer is for JP keyboard(logical pairing). +you can choose EN keyboard(typewrite pairing). + From b7688590b8a252f7497e3f78d569b98ae62ab177 Mon Sep 17 00:00:00 2001 From: David Dai Date: Mon, 31 Dec 2018 08:42:58 -0800 Subject: [PATCH 774/788] Change rgblight_get_mode & rgb_matrix_get_mode's return type to uint8_t. (#4747) * Change rgblight_get_mode's return type to uint8_t. Since rgblight_get_mode() is just returning rgblight_config_t.mode, it should match rgblight_config_t.mode's type: uint8_t. * Update rgb_matrix_get_mode to return uint8_t. --- keyboards/mxss/rgblight.c | 2 +- quantum/rgb_matrix.c | 2 +- quantum/rgb_matrix.h | 2 +- quantum/rgblight.c | 2 +- quantum/rgblight.h | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/keyboards/mxss/rgblight.c b/keyboards/mxss/rgblight.c index da7959c6a..73f94f3ab 100644 --- a/keyboards/mxss/rgblight.c +++ b/keyboards/mxss/rgblight.c @@ -234,7 +234,7 @@ void rgblight_step_reverse(void) { rgblight_mode(mode); } -uint32_t rgblight_get_mode(void) { +uint8_t rgblight_get_mode(void) { if (!rgblight_config.enable) { return false; } diff --git a/quantum/rgb_matrix.c b/quantum/rgb_matrix.c index 82d36177b..2ed36304d 100644 --- a/quantum/rgb_matrix.c +++ b/quantum/rgb_matrix.c @@ -973,7 +973,7 @@ void rgb_matrix_mode_noeeprom(uint8_t mode) { rgb_matrix_config.mode = mode; } -uint32_t rgb_matrix_get_mode(void) { +uint8_t rgb_matrix_get_mode(void) { return rgb_matrix_config.mode; } diff --git a/quantum/rgb_matrix.h b/quantum/rgb_matrix.h index 0cfeb4e06..e43532d11 100644 --- a/quantum/rgb_matrix.h +++ b/quantum/rgb_matrix.h @@ -180,7 +180,7 @@ void rgb_matrix_increase_speed(void); void rgb_matrix_decrease_speed(void); void rgb_matrix_mode(uint8_t mode); void rgb_matrix_mode_noeeprom(uint8_t mode); -uint32_t rgb_matrix_get_mode(void); +uint8_t rgb_matrix_get_mode(void); #ifndef RGBLIGHT_ENABLE #define rgblight_toggle() rgb_matrix_toggle() diff --git a/quantum/rgblight.c b/quantum/rgblight.c index ae5dca188..23420ddd8 100644 --- a/quantum/rgblight.c +++ b/quantum/rgblight.c @@ -234,7 +234,7 @@ void rgblight_step_reverse(void) { rgblight_step_reverse_helper(true); } -uint32_t rgblight_get_mode(void) { +uint8_t rgblight_get_mode(void) { if (!rgblight_config.enable) { return false; } diff --git a/quantum/rgblight.h b/quantum/rgblight.h index 99ede43c5..65dda3f52 100644 --- a/quantum/rgblight.h +++ b/quantum/rgblight.h @@ -167,7 +167,7 @@ void rgblight_enable(void); void rgblight_disable(void); void rgblight_step(void); void rgblight_step_reverse(void); -uint32_t rgblight_get_mode(void); +uint8_t rgblight_get_mode(void); void rgblight_mode(uint8_t mode); void rgblight_set(void); void rgblight_update_dword(uint32_t dword); From 7f0def77a201bd419517332581dbc2cc3b0bd7eb Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 31 Dec 2018 08:45:44 -0800 Subject: [PATCH 775/788] Move Split Common VPATH addition (#4716) Specifically, only add the split_common folder to COMMON_VPATH if the feature is eanbled, to prevent issues with compilation --- common.mk | 1 - common_features.mk | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/common.mk b/common.mk index 272d170e6..aea29a7a2 100644 --- a/common.mk +++ b/common.mk @@ -21,5 +21,4 @@ COMMON_VPATH += $(QUANTUM_PATH)/keymap_extras COMMON_VPATH += $(QUANTUM_PATH)/audio COMMON_VPATH += $(QUANTUM_PATH)/process_keycode COMMON_VPATH += $(QUANTUM_PATH)/api -COMMON_VPATH += $(QUANTUM_PATH)/split_common COMMON_VPATH += $(DRIVER_PATH) diff --git a/common_features.mk b/common_features.mk index 883681324..c86e8bbfe 100644 --- a/common_features.mk +++ b/common_features.mk @@ -268,4 +268,5 @@ ifeq ($(strip $(SPLIT_KEYBOARD)), yes) $(QUANTUM_DIR)/split_common/split_util.c QUANTUM_LIB_SRC += $(QUANTUM_DIR)/split_common/i2c.c QUANTUM_LIB_SRC += $(QUANTUM_DIR)/split_common/serial.c + COMMON_VPATH += $(QUANTUM_PATH)/split_common endif From 40383089d035f69101851831f756508271fff103 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 31 Dec 2018 14:29:56 -0800 Subject: [PATCH 776/788] Keymap: Update for Drashna code - Proton C Prep Edition (#4708) * Make CRKBD keylogger output actually show tap keys * check MT/LT for twinkling * Add ortho 5x12 support for fractal keyboard * Use newer interface for setting pins/ports * Remove custom unicode methods * Reomve unicode input info * Odd rules issue * Redefine REST note to be more pleasing * Properly disable PM LEDs with GPIO commands * Update gitlab CI yaml file * Remove extra mod tap check * Remove initial state on ergodox glow * Rev6 Cleanup * Fix KC_MAKE macro * Update GitLab CI yaml file * More GitLab CI changes * One final GitLab CI change * Remove unneeded unicode support * Optimize KC_MAKE --- keyboards/crkbd/keymaps/drashna/keymap.c | 20 ++- keyboards/iris/keymaps/drashna/keymap.c | 10 +- keyboards/orthodox/keymaps/drashna/keymap.c | 10 +- keyboards/viterbi/keymaps/drashna/keymap.c | 13 +- layouts/community/ergodox/drashna/keymap.c | 10 +- layouts/community/ergodox/drashna/rules.mk | 2 +- .../community/ergodox/drashna_glow/rules.mk | 2 + layouts/community/ortho_4x12/drashna/config.h | 5 +- layouts/community/ortho_4x12/drashna/keymap.c | 13 +- layouts/community/ortho_5x12/drashna/config.h | 16 ++ layouts/community/ortho_5x12/drashna/keymap.c | 156 ++++++++++++++++++ layouts/community/ortho_5x12/drashna/rules.mk | 23 +++ users/drashna/.gitlab-ci.yml | 70 +++++++- users/drashna/config.h | 8 +- users/drashna/process_records.c | 43 ++--- users/drashna/rgb_stuff.c | 5 +- users/drashna/rules.mk | 13 -- users/drashna/send_unicode.c | 112 ------------- users/drashna/wrappers.h | 1 + 19 files changed, 339 insertions(+), 193 deletions(-) create mode 100644 layouts/community/ortho_5x12/drashna/config.h create mode 100644 layouts/community/ortho_5x12/drashna/keymap.c create mode 100644 layouts/community/ortho_5x12/drashna/rules.mk delete mode 100644 users/drashna/send_unicode.c diff --git a/keyboards/crkbd/keymaps/drashna/keymap.c b/keyboards/crkbd/keymaps/drashna/keymap.c index 282ee2572..678fd33b5 100644 --- a/keyboards/crkbd/keymaps/drashna/keymap.c +++ b/keyboards/crkbd/keymaps/drashna/keymap.c @@ -88,16 +88,18 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; void matrix_init_keymap(void) { - //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h - #ifdef SSD1306OLED - iota_gfx_init(!has_usb()); // turns on the display - #endif + //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h + #ifdef SSD1306OLED + iota_gfx_init(!has_usb()); // turns on the display + #endif - DDRD &= ~(1<<5); - PORTD &= ~(1<<5); + #ifndef CONVERT_TO_PROTON_C + setPinOutput(D5); + writePinHigh(D5); - DDRB &= ~(1<<0); - PORTB &= ~(1<<0); + setPinOutput(B0); + writePinHigh(B0); + #endif } //SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h @@ -126,10 +128,10 @@ const char code_to_name[60] = { void set_keylog(uint16_t keycode, keyrecord_t *record) { char name = ' '; + if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)) { keycode = keycode & 0xFF; } if (keycode < 60) { name = code_to_name[keycode]; } - // update keylog snprintf(keylog_str, sizeof(keylog_str), "%dx%d, k%2d : %c", record->event.key.row, record->event.key.col, diff --git a/keyboards/iris/keymaps/drashna/keymap.c b/keyboards/iris/keymaps/drashna/keymap.c index ba6f18edd..d89656b7e 100644 --- a/keyboards/iris/keymaps/drashna/keymap.c +++ b/keyboards/iris/keymaps/drashna/keymap.c @@ -89,9 +89,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { void matrix_init_keymap(void) { - DDRD &= ~(1<<5); - PORTD &= ~(1<<5); + #ifndef CONVERT_TO_PROTON_C + setPinOutput(D5); + writePinHigh(D5); - DDRB &= ~(1<<0); - PORTB &= ~(1<<0); + setPinOutput(B0); + writePinHigh(B0); + #endif } diff --git a/keyboards/orthodox/keymaps/drashna/keymap.c b/keyboards/orthodox/keymaps/drashna/keymap.c index 346ca4f12..9373d851d 100644 --- a/keyboards/orthodox/keymaps/drashna/keymap.c +++ b/keyboards/orthodox/keymaps/drashna/keymap.c @@ -97,9 +97,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; void matrix_init_keymap(void) { - DDRD &= ~(1<<5); - PORTD &= ~(1<<5); + #ifndef CONVERT_TO_PROTON_C + setPinOutput(D5); + writePinHigh(D5); - DDRB &= ~(1<<0); - PORTB &= ~(1<<0); + setPinOutput(B0); + writePinHigh(B0); + #endif } diff --git a/keyboards/viterbi/keymaps/drashna/keymap.c b/keyboards/viterbi/keymaps/drashna/keymap.c index a34320519..9ca14961b 100644 --- a/keyboards/viterbi/keymaps/drashna/keymap.c +++ b/keyboards/viterbi/keymaps/drashna/keymap.c @@ -87,10 +87,13 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { -void matrix_init_keymap(void) { - DDRD &= ~(1<<5); - PORTD &= ~(1<<5); - DDRB &= ~(1<<0); - PORTB &= ~(1<<0); +void matrix_init_keymap(void) { + #ifndef CONVERT_TO_PROTON_C + setPinOutput(D5); + writePinHigh(D5); + + setPinOutput(B0); + writePinHigh(B0); + #endif } diff --git a/layouts/community/ergodox/drashna/keymap.c b/layouts/community/ergodox/drashna/keymap.c index df9be62b7..45860b874 100644 --- a/layouts/community/ergodox/drashna/keymap.c +++ b/layouts/community/ergodox/drashna/keymap.c @@ -20,7 +20,6 @@ along with this program. If not, see . #ifdef UNICODEMAP_ENABLE #include "drashna_unicode.h" #endif // UNICODEMAP_ENABLE -extern uint8_t input_mode; #ifdef RGB_MATRIX_ENABLE extern bool g_suspend_state; @@ -425,17 +424,12 @@ void rgb_matrix_indicators_user(void) { } void matrix_init_keymap(void) { +#if 0 #ifdef RGB_MATRIX_KEYPRESSES rgblight_mode(RGB_MATRIX_MULTISPLASH); #else rgblight_mode(RGB_MATRIX_RAINBOW_MOVING_CHEVRON); #endif - - input_mode = 2; -} - -#else -void matrix_init_keymap(void) { - input_mode = 2; +#endif } #endif //RGB_MATRIX_INIT diff --git a/layouts/community/ergodox/drashna/rules.mk b/layouts/community/ergodox/drashna/rules.mk index 8bf53950e..31488108b 100644 --- a/layouts/community/ergodox/drashna/rules.mk +++ b/layouts/community/ergodox/drashna/rules.mk @@ -1,6 +1,6 @@ TAP_DANCE_ENABLE = yes SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend -COMMAND_ENABLE = yes # Commands for debug and configuration +COMMAND_ENABLE = no # Commands for debug and configuration ifneq (,$(findstring ergodox_ez,$(KEYBOARD))) RGBLIGHT_ENABLE = yes RGB_MATRIX_ENABLE = no diff --git a/layouts/community/ergodox/drashna_glow/rules.mk b/layouts/community/ergodox/drashna_glow/rules.mk index 3b317224a..c8941391e 100644 --- a/layouts/community/ergodox/drashna_glow/rules.mk +++ b/layouts/community/ergodox/drashna_glow/rules.mk @@ -7,3 +7,5 @@ ifneq (,$(findstring ergodox_ez,$(KEYBOARD))) RGBLIGHT_ENABLE = no RGB_MATRIX_ENABLE = yes endif + +COMMAND_ENABLE = no diff --git a/layouts/community/ortho_4x12/drashna/config.h b/layouts/community/ortho_4x12/drashna/config.h index 8658802d8..0b0110dfa 100644 --- a/layouts/community/ortho_4x12/drashna/config.h +++ b/layouts/community/ortho_4x12/drashna/config.h @@ -1,5 +1,4 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H +#pragma once #if defined(RGBLIGHT_ENABLE) && !defined(RGBLED_NUM) @@ -61,5 +60,3 @@ /* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ //#define MIDI_TONE_KEYCODE_OCTAVES 2 - -#endif diff --git a/layouts/community/ortho_4x12/drashna/keymap.c b/layouts/community/ortho_4x12/drashna/keymap.c index 205d12d8c..5d3218934 100644 --- a/layouts/community/ortho_4x12/drashna/keymap.c +++ b/layouts/community/ortho_4x12/drashna/keymap.c @@ -94,7 +94,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_MAKE, _________________ADJUST_L1_________________, _________________ADJUST_R1_________________, KC_RST, VRSN, _________________ADJUST_L2_________________, _________________ADJUST_R2_________________, EEP_RST, _______, _________________ADJUST_L3_________________, _________________ADJUST_R3_________________, TG_MODS, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_NUKE ) @@ -219,4 +219,15 @@ void rgb_matrix_indicators_user(void) { void matrix_init_keymap(void) { rgblight_mode(RGB_MATRIX_MULTISPLASH); } +#else //RGB_MATRIX_INIT + +void matrix_init_keymap(void) { + #ifndef CONVERT_TO_PROTON_C + setPinOutput(D5); + writePinHigh(D5); + + setPinOutput(B0); + writePinHigh(B0); + #endif +} #endif //RGB_MATRIX_INIT diff --git a/layouts/community/ortho_5x12/drashna/config.h b/layouts/community/ortho_5x12/drashna/config.h new file mode 100644 index 000000000..e41dadc60 --- /dev/null +++ b/layouts/community/ortho_5x12/drashna/config.h @@ -0,0 +1,16 @@ +#pragma once + + +/* ws2812 RGB LED */ +#if defined(KEYBOARD_fractal) + #define RGB_DI_PIN D2 + #undef RGBLED_NUM + #define RGBLIGHT_ANIMATIONS + #define RGBLED_NUM 29 // Number of LEDs + #undef RGBLIGHT_HUE_STEP + #define RGBLIGHT_HUE_STEP 8 + #undef RGBLIGHT_SAT_STEP + #define RGBLIGHT_SAT_STEP 8 + #undef RGBLIGHT_VAL_STEP + #define RGBLIGHT_VAL_STEP 8 +#endif diff --git a/layouts/community/ortho_5x12/drashna/keymap.c b/layouts/community/ortho_5x12/drashna/keymap.c new file mode 100644 index 000000000..bf0907a51 --- /dev/null +++ b/layouts/community/ortho_5x12/drashna/keymap.c @@ -0,0 +1,156 @@ +/* Copyright 2015-2017 Jack Humbert + * Modified by KeyPCB for the Fractal keyboard + * Backlight isn't on the Fractal, so I've removed the keycode from the keymaps + * + * 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 . + */ + +#include QMK_KEYBOARD_H +#include "drashna.h" + +#define LAYOUT_ortho_5x12_base( \ + K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, \ + K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \ + K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, \ + K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A \ + ) \ + LAYOUT_ortho_5x12_wrapper( \ + KC_GRV, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, KC_BSPC, \ + KC_TAB, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, KC_BSPC, \ + KC_ESC, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, KC_QUOT, \ + KC_MLSF, CTL_T(K31), K32, K33, K34, K35, K36, K37, K38, K39, CTL_T(K3A), KC_ENT, \ + KC_NO, OS_LCTL, OS_LALT, OS_LGUI, SP_LWER, BK_LWER, DL_RAIS, ET_RAIS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ + ) +#define LAYOUT_ortho_5x12_base_wrapper(...) LAYOUT_ortho_5x12_base(__VA_ARGS__) + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +[_QWERTY] = LAYOUT_ortho_5x12_base_wrapper( + ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________, + _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, + _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, + _________________QWERTY_L3_________________, _________________QWERTY_R3_________________ +), + +[_COLEMAK] = LAYOUT_ortho_5x12_base_wrapper( + ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________, + _________________COLEMAK_L1________________, _________________COLEMAK_R1________________, + _________________COLEMAK_L2________________, _________________COLEMAK_R2________________, + _________________COLEMAK_L3________________, _________________COLEMAK_R3________________ +), + +[_DVORAK] = LAYOUT_ortho_5x12_base_wrapper( + ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________, + _________________DVORAK_L1_________________, _________________DVORAK_R1_________________, + _________________DVORAK_L2_________________, _________________DVORAK_R2_________________, + _________________DVORAK_L3_________________, _________________DVORAK_R3_________________ +), + +[_WORKMAN] = LAYOUT_ortho_5x12_base_wrapper( + ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________, + _________________WORKMAN_L1________________, _________________WORKMAN_R1________________, + _________________WORKMAN_L2________________, _________________WORKMAN_R2________________, + _________________WORKMAN_L3________________, _________________WORKMAN_R3________________ +), + +[_MODS] = LAYOUT_ortho_5x12_wrapper( + _______, ___________________BLANK___________________, ___________________BLANK___________________, _______, + _______, ___________________BLANK___________________, ___________________BLANK___________________, _______, + _______, ___________________BLANK___________________, ___________________BLANK___________________, _______, + KC_LSFT, ___________________BLANK___________________, ___________________BLANK___________________, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT_ortho_5x12_wrapper( \ + _______, ___________________BLANK___________________, ___________________BLANK___________________, _______, + KC_TILD, _________________LOWER_L1__________________, _________________LOWER_R1__________________, KC_PIPE, + KC_DEL, _________________LOWER_L2__________________, _________________LOWER_R2__________________, _______, + _______, _________________LOWER_L3__________________, _________________LOWER_R3__________________, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY +), + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT_ortho_5x12_wrapper( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ + KC_GRV, _________________RAISE_L1__________________, _________________RAISE_R1__________________, _______, + KC_DEL, _________________RAISE_L2__________________, _________________RAISE_R2__________________, KC_BSLS, + _______, _________________RAISE_L3__________________, _________________RAISE_R3__________________, _______, + _______, _______, _______, _______, _______, _______, _______, _________________RAISE_R3__________________ +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | Reset| | | | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|AudOff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | |Voice-|Voice+|Mus on|MusOff|MidiOn|MidOff| | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = LAYOUT_ortho_5x12_wrapper( \ + KC_MAKE, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_RST, + VRSN, _________________ADJUST_L1_________________, _________________ADJUST_R1_________________, EEP_RST, + _______, _________________ADJUST_L2_________________, _________________ADJUST_R2_________________, _______, + _______, _________________ADJUST_L3_________________, _________________ADJUST_R3_________________, TG_MODS, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +) + + +}; + +bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + } + return true; +}; + +void matrix_init_keymap(void) { +#ifdef KEYBOARD_fractal + setPinOutput(D5); + writePinHigh(D5); + + setPinOutput(B0); + writePinHigh(B0); +#endif +} diff --git a/layouts/community/ortho_5x12/drashna/rules.mk b/layouts/community/ortho_5x12/drashna/rules.mk new file mode 100644 index 000000000..160419fcc --- /dev/null +++ b/layouts/community/ortho_5x12/drashna/rules.mk @@ -0,0 +1,23 @@ +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +TAP_DANCE_ENABLE = no +AUDIO_ENABLE = yes +ifneq (,$(findstring fractal,$(KEYBOARD))) # Make sure it IS the Planck Light + RGB_MATRIX_ENABLE = no + AUDIO_ENABLE = no + RGBLIGHT_ENABLE = yes + RGBLIGHT_TWINKLE = yes + BOOTLOADER = qmk-dfu +endif + +ifeq ($(strip $(PROTOCOL)), VUSB) +NKRO_ENABLE = no +else +NKRO_ENABLE = yes +endif + + +MACROS_ENABLED = no diff --git a/users/drashna/.gitlab-ci.yml b/users/drashna/.gitlab-ci.yml index bd693babc..9b18d44fb 100644 --- a/users/drashna/.gitlab-ci.yml +++ b/users/drashna/.gitlab-ci.yml @@ -1,26 +1,78 @@ stages: + - test - build + - deploy -qmk_firmware: +Tests: + stage: test + variables: + GIT_SUBMODULE_STRATEGY: recursive + tags: + - linux + image: ubuntu:18.10 + before_script: + - apt-get update -qy + - apt-get install -y build-essential avr-libc binutils-arm-none-eabi binutils-avr dfu-programmer dfu-util gcc gcc-arm-none-eabi gcc-avr git libnewlib-arm-none-eabi unzip wget zip + - avr-gcc --version + - uname -a + script: + - make test:all + - make planck/rev6:default + +QMK Firmware Defaults: + stage: deploy + variables: + GIT_SUBMODULE_STRATEGY: recursive + tags: + - linux + image: ubuntu:18.10 + before_script: + - apt-get update -qy + - apt-get install -y build-essential avr-libc binutils-arm-none-eabi binutils-avr dfu-programmer dfu-util gcc gcc-arm-none-eabi gcc-avr git libnewlib-arm-none-eabi unzip wget zip + - avr-gcc --version + - uname -a + script: + - make test:all + - make all:default -j16 + +Drashna Firmware: stage: build variables: GIT_SUBMODULE_STRATEGY: recursive tags: - linux - image: ubuntu + image: ubuntu:18.10 before_script: - apt-get update -qy - - apt-get install -y build-essential avr-libc binutils-arm-none-eabi binutils-avr dfu-programmer dfu-util diffutils gcc gcc-arm-none-eabi gcc-avr git libnewlib-arm-none-eabi unzip wget zip + - apt-get install -y build-essential avr-libc binutils-arm-none-eabi binutils-avr dfu-programmer dfu-util gcc gcc-arm-none-eabi gcc-avr git libnewlib-arm-none-eabi unzip wget zip - avr-gcc --version script: - - make iris/rev2:drashna:production iris/rev2:drashna_old:production ergodox_ez:drashna ergodox_ez:drashna_glow viterbi/rev1:drashna:production orthodox/rev1:drashna:production orthodox/rev3:drashna:production crkbd:drashna:production planck/light:drashna:production + - make iris/rev2:drashna iris/rev2:drashna_old ergodox_ez:drashna ergodox_ez:drashna_glow viterbi/rev1:drashna orthodox/rev1:drashna orthodox/rev3:drashna crkbd:drashna planck/light:drashna planck/rev6:drashna fractal:drashna artifacts: name: "$CI_JOB_NAME-$CI_COMMIT_REF_SLUG" paths: - ./*.hex - ./*.bin - only: - - master - - drashna_keymaps - - merge-requests - - branches + expire_in: 1 month + +Firmware Deploy: + stage: deploy + dependencies: + - Drashna Firmware + variables: + GIT_SUBMODULE_STRATEGY: recursive + tags: + - linux + image: ubuntu:18.10 + before_script: + - apt-get update -qy + - apt-get install -y build-essential avr-libc binutils-arm-none-eabi binutils-avr dfu-programmer dfu-util gcc gcc-arm-none-eabi gcc-avr git libnewlib-arm-none-eabi unzip wget zip + - avr-gcc --version + script: + - make iris/rev2:drashna:production iris/rev2:drashna_old:production ergodox_ez:drashna ergodox_ez:drashna_glow viterbi/rev1:drashna:production orthodox/rev1:drashna:production orthodox/rev3:drashna:production crkbd:drashna:production planck/light:drashna planck/rev6:drashna fractal:drashna:production + artifacts: + name: "$CI_JOB_NAME-$CI_COMMIT_REF_SLUG" + paths: + - ./*.hex + - ./*.bin + expire_in: 1 month diff --git a/users/drashna/config.h b/users/drashna/config.h index a33851230..827b1b8ac 100644 --- a/users/drashna/config.h +++ b/users/drashna/config.h @@ -14,8 +14,12 @@ #define AUDIO_CLICKY_FREQ_RANDOMNESS 1.5f // #ifdef RGBLIGHT_ENABLE // #define NO_MUSIC_MODE -// #endif //RGBLIGHT_ENABLE -#endif +// #endif //RGBLIGHT_ENABLE/ +#ifndef __arm__ +#undef NOTE_REST +#define NOTE_REST 1.00f +#endif // !__arm__ +#endif // !AUDIO_ENABLE #ifdef RGBLIGHT_ENABLE #define RGBLIGHT_SLEEP diff --git a/users/drashna/process_records.c b/users/drashna/process_records.c index 5e311e60e..17d7dc01c 100644 --- a/users/drashna/process_records.c +++ b/users/drashna/process_records.c @@ -51,27 +51,30 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { case KC_MAKE: // Compiles the firmware, and adds the flash command based on keyboard bootloader if (!record->event.pressed) { - uint8_t temp_mod = get_mods(); - uint8_t temp_osm = get_oneshot_mods(); - clear_mods(); clear_oneshot_mods(); - send_string_with_delay_P(PSTR("make " QMK_KEYBOARD ":" QMK_KEYMAP), 10); - if (temp_mod & MODS_SHIFT_MASK || temp_osm & MODS_SHIFT_MASK) { - #if defined(__ARM__) - send_string_with_delay_P(PSTR(":dfu-util"), 10); - #elif defined(BOOTLOADER_DFU) - send_string_with_delay_P(PSTR(":dfu"), 10); - #elif defined(BOOTLOADER_HALFKAY) - send_string_with_delay_P(PSTR(":teensy"), 10); - #elif defined(BOOTLOADER_CATERINA) - send_string_with_delay_P(PSTR(":avrdude"), 10); - #endif // bootloader options - } - #if defined(KEYBOARD_viterbi) - send_string_with_delay_P(PSTR(":dfu"), 10); + #if !defined(KEYBOARD_viterbi) + uint8_t temp_mod = get_mods(); + uint8_t temp_osm = get_oneshot_mods(); + clear_mods(); clear_oneshot_mods(); + #endif + send_string_with_delay_P(PSTR("make " QMK_KEYBOARD ":" QMK_KEYMAP), MACRO_TIMER); + #if defined(KEYBOARD_viterbi) + send_string_with_delay_P(PSTR(":dfu" SS_TAP(X_ENTER)), MACRO_TIMER); + #else + if (temp_mod & MODS_SHIFT_MASK || temp_osm & MODS_SHIFT_MASK) { + #if defined(__arm__) + send_string_with_delay_P(PSTR(":dfu-util"), MACRO_TIMER); + #elif defined(BOOTLOADER_DFU) + send_string_with_delay_P(PSTR(":dfu"), MACRO_TIMER); + #elif defined(BOOTLOADER_HALFKAY) + send_string_with_delay_P(PSTR(":teensy"), MACRO_TIMER); + #elif defined(BOOTLOADER_CATERINA) + send_string_with_delay_P(PSTR(":avrdude"), MACRO_TIMER); + #endif // bootloader options + } + if (temp_mod & MODS_CTRL_MASK || temp_osm & MODS_CTRL_MASK) { send_string_with_delay_P(PSTR(" -j8 --output-sync"), MACRO_TIMER); } + send_string_with_delay_P(PSTR(SS_TAP(X_ENTER)), MACRO_TIMER); + set_mods(temp_mod); #endif - if (temp_mod & MODS_CTRL_MASK || temp_osm & MODS_CTRL_MASK) { send_string_with_delay_P(PSTR(" -j8 --output-sync"), 10); } - send_string_with_delay_P(PSTR(SS_TAP(X_ENTER)), 10); - set_mods(temp_mod); } break; diff --git a/users/drashna/rgb_stuff.c b/users/drashna/rgb_stuff.c index d238c2065..7d00604b4 100644 --- a/users/drashna/rgb_stuff.c +++ b/users/drashna/rgb_stuff.c @@ -200,7 +200,10 @@ void start_rgb_light(void) { bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { + if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)) { + keycode = keycode & 0xFF; + } + switch (keycode) { #ifdef RGBLIGHT_TWINKLE case KC_A ... KC_SLASH: case KC_F1 ... KC_F12: diff --git a/users/drashna/rules.mk b/users/drashna/rules.mk index 5f243b007..6d8612e71 100644 --- a/users/drashna/rules.mk +++ b/users/drashna/rules.mk @@ -42,16 +42,3 @@ ifdef CONSOLE_ENABLE OPT_DEFS += -DKEYLOGGER_ENABLE endif endif - - -ifeq ($(strip $(UCIS_ENABLE)), yes) - SRC += send_unicode.c -endif - -ifeq ($(strip $(UNICODEMAP_ENABLE)), yes) - SRC += send_unicode.c -endif - -ifeq ($(strip $(UNICODE_ENABLE)), yes) - SRC += send_unicode.c -endif diff --git a/users/drashna/send_unicode.c b/users/drashna/send_unicode.c deleted file mode 100644 index ff35368da..000000000 --- a/users/drashna/send_unicode.c +++ /dev/null @@ -1,112 +0,0 @@ -// Written by konstantin: vomindoraan -#include "send_unicode.h" -#include -#include - -__attribute__((weak)) -void send_unicode_hex_string(const char* str) { - if (!str) { return; } // Safety net - - while (*str) { - // Find the next code point (token) in the string - for (; *str == ' '; str++); - size_t n = strcspn(str, " "); // Length of the current token - char code_point[n+1]; - strncpy(code_point, str, n); - code_point[n] = '\0'; // Make sure it's null-terminated - - // Normalize the code point: make all hex digits lowercase - for (char *p = code_point; *p; p++) { - *p = tolower((unsigned char)*p); - } - - // Send the code point as a Unicode input string - unicode_input_start(); - send_string(code_point); - unicode_input_finish(); - - str += n; // Move to the first ' ' (or '\0') after the current token - } -} - -// (ノಠ痊ಠ)ノ彡┻━┻ -// send_unicode_hex_string("0028 30CE 0CA0 75CA 0CA0 0029 30CE 5F61 253B 2501 253B"); - -//Old code -// (╯°□°)╯ ︵ ┻━┻ - #if 0 - register_code(KC_RSFT); - tap(KC_9); - unregister_code(KC_RSFT); - process_unicode((0x256F | QK_UNICODE), record); // Arm - process_unicode((0x00B0 | QK_UNICODE), record); // Eye - process_unicode((0x25A1 | QK_UNICODE), record); // Mouth - process_unicode((0x00B0 | QK_UNICODE), record); // Eye - register_code(KC_RSFT); - tap(KC_0); - unregister_code(KC_RSFT); - process_unicode((0x256F | QK_UNICODE), record); // Arm - tap(KC_SPC); - process_unicode((0x0361 | QK_UNICODE), record); // Flippy - tap(KC_SPC); - process_unicode((0x253B | QK_UNICODE), record); // Table - process_unicode((0x2501 | QK_UNICODE), record); // Table - process_unicode((0x253B | QK_UNICODE), record); // Table - #endif - - -// If you need a good converter: https://r12a.github.io/app-conversion/ -uint8_t saved_mods; - -void unicode_input_start (void) { - // save current mods - saved_mods = get_mods(); // Save current mods - clear_mods(); // Unregister mods to start from a clean state - - switch(get_unicode_input_mode()) { - case UC_OSX: - register_code(KC_LALT); - break; - case UC_OSX_RALT: - register_code(KC_RALT); - break; - case UC_LNX: - register_code(KC_LCTL); - register_code(KC_LSFT); - register_code(KC_U); - unregister_code(KC_U); - unregister_code(KC_LSFT); - unregister_code(KC_LCTL); - break; - case UC_WIN: - register_code(KC_LALT); - register_code(KC_PPLS); - unregister_code(KC_PPLS); - break; - case UC_WINC: - register_code(KC_RALT); - unregister_code(KC_RALT); - register_code(KC_U); - unregister_code(KC_U); - break; - } - wait_ms(UNICODE_TYPE_DELAY); -} - -void unicode_input_finish (void) { - switch(get_unicode_input_mode()) { - case UC_OSX: - case UC_WIN: - unregister_code(KC_LALT); - break; - case UC_OSX_RALT: - unregister_code(KC_RALT); - break; - case UC_LNX: - register_code(KC_SPC); - unregister_code(KC_SPC); - break; - } - - set_mods(saved_mods); // Reregister previously set mods -} diff --git a/users/drashna/wrappers.h b/users/drashna/wrappers.h index b45359f67..070a5a0a4 100644 --- a/users/drashna/wrappers.h +++ b/users/drashna/wrappers.h @@ -14,6 +14,7 @@ expanded before being used as arguments to the LAYOUT_xxx macro. #define KEYMAP_wrapper(...) LAYOUT(__VA_ARGS__) #define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__) #define LAYOUT_ortho_4x12_wrapper(...) LAYOUT_ortho_4x12(__VA_ARGS__) +#define LAYOUT_ortho_5x12_wrapper(...) LAYOUT_ortho_5x12(__VA_ARGS__) /* Blocks for each of the four major keyboard layouts From 134a69f4ada6b50d98cb233c30cce05ddc39c1cd Mon Sep 17 00:00:00 2001 From: Frank Tackitt Date: Mon, 31 Dec 2018 15:55:48 -0700 Subject: [PATCH 777/788] Keyboard: Enable defaults for Sol (#4751) The enables RGB, Mousekeys, and Extrakeys for users of config.qmk.fm --- keyboards/sol/rules.mk | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/keyboards/sol/rules.mk b/keyboards/sol/rules.mk index f53e5b21f..aa18721b6 100644 --- a/keyboards/sol/rules.mk +++ b/keyboards/sol/rules.mk @@ -52,19 +52,14 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT # the appropriate keymap folder that will get included automatically # BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = no # Mouse keys(+4700) -EXTRAKEY_ENABLE = no # Audio control and System control(+450) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) CONSOLE_ENABLE = no # Console for debug(+400) -COMMAND_ENABLE = no # Commands for debug and configuration +COMMAND_ENABLE = yes # Commands for debug and configuration NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality -MIDI_ENABLE = no # MIDI controls -AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. -# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE -SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. CUSTOM_MATRIX = yes From c71c078dff74ea3047410c855f6e42bad7281f8c Mon Sep 17 00:00:00 2001 From: lbibass Date: Wed, 2 Jan 2019 11:42:03 -0500 Subject: [PATCH 778/788] Added brightness controls and Media controls to my keymap. (#4760) * Added my Mechmini2 layout to qmk. * Added more info to the readme. * Made changes. * Update keyboards/mechmini/v2/keymaps/lbibass_625_space/keymap.c Co-Authored-By: lbibass * Update keyboards/mechmini/v2/keymaps/lbibass_split_space/keymap.c Co-Authored-By: lbibass * Added brightness and volume controls to MechMini 625 layout. --- .../v2/keymaps/lbibass_625_space/keymap.c | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/keyboards/mechmini/v2/keymaps/lbibass_625_space/keymap.c b/keyboards/mechmini/v2/keymaps/lbibass_625_space/keymap.c index 40bfc42de..fba582e1b 100755 --- a/keyboards/mechmini/v2/keymaps/lbibass_625_space/keymap.c +++ b/keyboards/mechmini/v2/keymaps/lbibass_625_space/keymap.c @@ -4,6 +4,7 @@ #define _FN1 2 #define _FN2 3 #define _WIN 1 +#define _FN3 4 //Tap Dance Declarations enum { @@ -22,10 +23,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LT(OSL(2), KC_TAB), KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, GUI_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, LT(3, KC_ENT), KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, TD(TD_DOTCOM), OSL(2), OSM(MOD_RSFT), - KC_ESC, KC_LALT, KC_LCTL, KC_SPC, KC_RGUI, RGB_TOG), + KC_ESC, KC_LALT, KC_LCTL, KC_SPC, KC_RGUI, MO(4)), [_WIN] = LAYOUT_625_space( LT(OSL(2), KC_TAB), KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, - CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, LT(3, KC_ENT), + CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, LT(4, KC_ENT), KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, TD(TD_DOTCOM), OSL(2), OSM(MOD_RSFT), KC_ESC, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, RGB_TOG), [_FN1] = LAYOUT_625_space( @@ -35,14 +36,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), [_FN2] = LAYOUT_625_space( - KC_PWR, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, RESET, - MT(KC_LGUI, KC_ESC), KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, TG(1), KC_TRNS, KC_TRNS, KC_F11, KC_F12, KC_TRNS, + KC_PWR, KC_BRID, KC_BRIU, KC_NO, KC_NO, KC_NO, KC_NO, KC_MRWD, KC_MPLY, KC_MFFD, KC_MUTE, RESET, + MT(KC_LGUI, KC_ESC), KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, TG(1), KC_TRNS, KC_TRNS, KC_VOLD, KC_VOLU, KC_TRNS, KC_TRNS, RGB_TOG, RGB_MOD, RGB_VAI, RGB_VAD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, KC_TRNS, KC_TRNS, KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + [_FN3] = LAYOUT_625_space( + KC_PWR, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, RESET, + MT(KC_LGUI, KC_ESC), KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, TG(1), KC_TRNS, KC_TRNS, KC_F11, KC_F12, KC_TRNS, + KC_TRNS, RGB_TOG, RGB_MOD, RGB_VAI, RGB_VAD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, KC_TRNS, KC_TRNS, + KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) + }; - - - - - From 7b5fa4b13e332bab476b65565d63708b306d000a Mon Sep 17 00:00:00 2001 From: Frank Tackitt Date: Wed, 2 Jan 2019 10:16:55 -0700 Subject: [PATCH 779/788] Keymap: Add userspace for @kageurufu (#4752) * Add userspace for @kageurufu * Remove custom keycodes for layer keys Add some common defaults for my rules.mk --- keyboards/sol/keymaps/kageurufu/keymap.c | 346 +++--------------- keyboards/sol/keymaps/kageurufu/readme.md | 47 --- keyboards/zen/keymaps/kageurufu/keymap.c | 62 ++++ users/kageurufu/config.h | 4 + users/kageurufu/custom_rgb.c | 18 + users/kageurufu/custom_rgb.h | 3 + users/kageurufu/kageurufu.c | 12 + users/kageurufu/kageurufu.h | 5 + users/kageurufu/layouts.h | 58 +++ users/kageurufu/process_records.c | 44 +++ users/kageurufu/process_records.h | 27 ++ .../config.h => users/kageurufu/readme.md | 13 +- users/kageurufu/rules.mk | 15 + 13 files changed, 294 insertions(+), 360 deletions(-) delete mode 100644 keyboards/sol/keymaps/kageurufu/readme.md create mode 100644 keyboards/zen/keymaps/kageurufu/keymap.c create mode 100644 users/kageurufu/config.h create mode 100644 users/kageurufu/custom_rgb.c create mode 100644 users/kageurufu/custom_rgb.h create mode 100644 users/kageurufu/kageurufu.c create mode 100644 users/kageurufu/kageurufu.h create mode 100644 users/kageurufu/layouts.h create mode 100644 users/kageurufu/process_records.c create mode 100644 users/kageurufu/process_records.h rename keyboards/sol/keymaps/kageurufu/config.h => users/kageurufu/readme.md (78%) create mode 100644 users/kageurufu/rules.mk diff --git a/keyboards/sol/keymaps/kageurufu/keymap.c b/keyboards/sol/keymaps/kageurufu/keymap.c index 822256d85..9ea89db05 100644 --- a/keyboards/sol/keymaps/kageurufu/keymap.c +++ b/keyboards/sol/keymaps/kageurufu/keymap.c @@ -1,69 +1,35 @@ #include QMK_KEYBOARD_H +#include "kageurufu.h" #ifdef PROTOCOL_LUFA #include "lufa.h" #include "split_util.h" #endif -#ifdef SSD1306OLED - #include "common/ssd1306.h" -#endif extern keymap_config_t keymap_config; - -#ifdef RGBLIGHT_ENABLE -//Following line allows macro to read current RGB settings -extern rgblight_config_t rgblight_config; -#endif - extern uint8_t is_master; -// Each layer gets a name for readability, which is then used in the keymap matrix below. -// The underscores don't mean anything - you can have a layer called STUFF or any other name. -// Layer names don't all need to be of the same length, obviously, and you can also skip them -// entirely and just use numbers. -enum layer_number { - _QWERTY = 0, - _COLEMAK, - _FN, - _ADJ -}; - -enum custom_keycodes { - QWERTY = SAFE_RANGE, - COLEMAK, - FN, - ADJ, - BACKLIT, - RGBRST -}; - -enum macro_keycodes { - KC_SAMPLEMACRO, -}; - -#define FN_ESC LT(_FN, KC_ESC) - -// Define your non-alpha grouping in this define's LAYOUT, and all your BASE_LAYERS will share the same mod/macro columns - /* Base Layout - * ,------------------------------------------------. ,------------------------------------------------. - * | ` | | | | | | | | | | | | | | BkSp | - * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| - * | Tab | | | | | | | | | | | | | | \ | - * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| - * | Esc | | | | | | | | | | | | | | ' | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | Sft( | | | | | | | | | | | | | | Sft) | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | Ctrl | Win | Win | Alt | FN | Space| RGB | | FN | FN | - | = | Down | PgUp | PgDn | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | Space| Bksp | | Enter| Space| - * `-------------' `--------=----' - */ -#define BASE_LAYOUT( \ +/* Base Layout + * ,------------------------------------------------. ,------------------------------------------------. + * | ` | | | | | | | | | | | | | | BkSp | + * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| + * | Tab | | | | | | | | | | | | | | \ | + * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| + * | Esc | | | | | | | | | | | | | | ' | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | Sft( | | | | | | | | | | | | | | Sft) | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | Ctrl | Win | Win | Alt | FN | Space| RGB | | FN | FN | - | = | Down | PgUp | PgDn | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | Space| Bksp | | Enter| Space| + * `-------------' `--------=----' + */ +#define EXPAND_LAYOUT(...) LAYOUT(__VA_ARGS__) +#define _BASE_LAYOUT( \ _00, _01, _02, _03, _04, _05, _06, _07, _08, _09, \ _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, \ _20, _21, _22, _23, _24, _25, _26, _27, _28, _29 \ ) \ -LAYOUT( \ +EXPAND_LAYOUT( \ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, RGB_MOD, KC_EQL, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ KC_TAB, _00, _01, _02, _03, _04, KC_LBRC, KC_RBRC, _05, _06, _07, _08, _09, KC_BSLS, \ FN_ESC, _10, _11, _12, _13, _14, RGB_SAI, RGB_VAI, _15, _16, _17, _18, _19, KC_QUOT, \ @@ -71,265 +37,43 @@ LAYOUT( \ KC_LCTL, KC_LGUI, KC_LGUI, KC_LALT, FN, KC_SPC, FN, FN, KC_SPC, KC_MINS, KC_EQL, KC_DOWN, KC_PGUP, KC_PGDN, \ KC_VOLD, KC_VOLU, KC_SPC, KC_BSPC, KC_ENT, KC_SPC, KC_VOLD, KC_VOLU \ ) +#define BASE_LAYOUT(...) _BASE_LAYOUT(__VA_ARGS__) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* Qwerty - * ,------------------------------------------------. ,------------------------------------------------. - * | | | | | | | | | | | | | | | | - * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| - * | | Q | W | E | R | T | | | | Y | U | I | O | P | | - * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| - * | | A | S | D | F | G | | | | H | J | K | L | ; | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | Z | X | C | V | B | | | | N | M | , | . | / | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | | | | | | | | | | | | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | | | | - * `-------------' `--------=----' - */ + [_QWERTY] = BASE_LAYOUT( \ - KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, \ - KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, \ - KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH \ + _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, \ + _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, \ + _________________QWERTY_L3_________________, _________________QWERTY_R3_________________ \ ), - /* Colemak - * ,------------------------------------------------. ,------------------------------------------------. - * | | | | | | | | | | | | | | | | - * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| - * | | Q | W | F | P | B | | | | J | L | U | Y | ; | | - * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| - * | | A | R | S | T | G | | | | K | N | E | I | O | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | Z | X | C | D | V | [ | | ] | M | H | , | . | / | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | | | | | | | | | | | | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | | | | - * `-------------' `--------=----' - */ [_COLEMAK] = BASE_LAYOUT( \ - KC_Q, KC_W, KC_F, KC_P, KC_B, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, \ - KC_A, KC_R, KC_S, KC_T, KC_G, KC_K, KC_N, KC_E, KC_I, KC_O, \ - KC_Z, KC_X, KC_C, KC_D, KC_V, KC_M, KC_H, KC_COMM, KC_DOT, KC_SLSH + _________________COLEMAK_L1________________, _________________COLEMAK_R1________________, \ + _________________COLEMAK_L2________________, _________________COLEMAK_R2________________, \ + _________________COLEMAK_L3________________, _________________COLEMAK_R3________________ \ ), + [_COLEMAK_DH] = BASE_LAYOUT( \ + ______________COLEMAK_MOD_DH_L1____________, ______________COLEMAK_MOD_DH_R1____________, \ + ______________COLEMAK_MOD_DH_L2____________, ______________COLEMAK_MOD_DH_R2____________, \ + ______________COLEMAK_MOD_DH_L3____________, ______________COLEMAK_MOD_DH_R3____________ \ + ), - /* FN - * ,------------------------------------------------. ,------------------------------------------------. - * | ~ | ! | @ | # | $ | % | | | | ^ | & | * | ( | ) | | - * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| - * | ~ | ! | @ | # | $ | % | | | | ^ | & | * | ( | ) | | - * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| - * | Ctrl | A | O | E | U | I | | | | D | H | T | N | S | / | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | Shift| ; | Q | J | K | X | [ | | ] | B | M | W | V | Z |Enter | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | ADJ | Esc | Alt | GUI | EISU |Lower |Space | |Space |FN | KANA | Left | Down | Up |Right | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * |Lower |Space | |Space |FN | - * `-------------' `------------' - */ - [_FN] = LAYOUT( \ - KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, _______, KC_PSCR, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ - _______, KC_PGDN, KC_UP, KC_PGUP, _______, KC_LBRC, _______, _______, KC_RBRC, KC_7, KC_UP, KC_9, KC_0, KC_HOME, \ - ADJ, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_RBRC, KC_END, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGDN, KC_PGUP, _______, \ - _______, _______, _______, _______, ADJ, _______, ADJ, ADJ, ADJ, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, \ - KC_VOLD, KC_VOLU, _______, KC_DEL, _______, _______, KC_VOLD, KC_VOLU \ + [_FN] = EXPAND_LAYOUT( \ + ________________FUNCTION_L1________________, _______, KC_PSCR, ________________FUNCTION_R1________________, \ + ________________FUNCTION_L2________________, _______, _______, ________________FUNCTION_R2________________, \ + ________________FUNCTION_L3________________, _______, _______, ________________FUNCTION_R3________________, \ + ________________FUNCTION_L4________________, _______, _______, ________________FUNCTION_R4________________, \ + ________________FUNCTION_L5________________, ADJ, ADJ, ________________FUNCTION_R5________________, \ + KC_VOLD, KC_VOLU, _______, KC_DEL, _______, _______, KC_VOLD, KC_VOLU \ ), - /* ADJ - * ,------------------------------------------------. ,------------------------------------------------. - * | ~ | ! | @ | # | $ | % | | | | ^ | & | * | ( | ) | | - * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| - * | ~ | ! | @ | # | $ | % | | | | ^ | & | * | ( | ) | | - * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| - * | Ctrl | A | O | E | U | I | | | | D | H | T | N | S | / | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | Shift| ; | Q | J | K | X | [ | | ] | B | M | W | V | Z |Enter | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * |ADJ| Esc | Alt | GUI | EISU |Lower |Space | |Space |FN | KANA | Left | Down | Up |Right | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * |Lower |Space | |Space |FN | - * `-------------' `------------' - */ - - [_ADJ] = LAYOUT( \ - KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, _______, _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ - _______, RGB_SAD, RGB_VAI, RGB_SAI, RESET, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ - _______, RGB_HUD, RGB_VAD, RGB_HUI, RGBRST, _______, _______, _______, _______, QWERTY, COLEMAK, _______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_RMOD,RGB_HUD, RGB_SAD, RGB_VAD, \ + [_ADJ] = EXPAND_LAYOUT( \ + _________________ADJUST_L1_________________, _______, _______, _________________ADJUST_R1_________________, \ + _________________ADJUST_L2_________________, _______, _______, _________________ADJUST_R2_________________, \ + _________________ADJUST_L3_________________, _______, _______, _________________ADJUST_R3_________________, \ + _________________ADJUST_L4_________________, _______, _______, _________________ADJUST_R4_________________, \ + _________________ADJUST_L5_________________, _______, _______, _________________ADJUST_R5_________________, \ KC_VOLD, KC_VOLU, _______, _______, _______, _______, KC_VOLD, KC_VOLU \ ) }; - - -// define variables for reactive RGB -bool TOG_STATUS = false; -int RGB_current_mode; - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - //uint8_t shifted = get_mods() & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)); - - switch (keycode) { - case QWERTY: - if (record->event.pressed) { - set_single_persistent_default_layer(_QWERTY); - } - return false; - break; - case COLEMAK: - if(record->event.pressed) { - set_single_persistent_default_layer(_COLEMAK); - } - return false; - break; - case FN: - if (record->event.pressed) { - layer_on(_FN); - } else { - layer_off(_FN); - } - return false; - break; - case ADJ: - if (record->event.pressed) { - layer_on(_ADJ); - } else { - layer_off(_ADJ); - } - return false; - break; - //led operations - RGB mode change now updates the RGB_current_mode to allow the right RGB mode to be set after reactive keys are released - case RGBRST: - #ifdef RGBLIGHT_ENABLE - if (record->event.pressed) { - eeconfig_update_rgblight_default(); - rgblight_enable(); - RGB_current_mode = rgblight_config.mode; - } - #endif - break; - } - return true; -} - -void matrix_init_user(void) { - #ifdef RGBLIGHT_ENABLE - RGB_current_mode = rgblight_config.mode; - #endif - //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h - #ifdef SSD1306OLED - iota_gfx_init(!has_usb()); // turns on the display - #endif -} - -void matrix_scan_user(void) { - #ifdef SSD1306OLED - led_test_init(); - iota_gfx_task(); // this is what updates the display continuously - #endif -} - - -//SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h -#ifdef SSD1306OLED - -// hook point for 'led_test' keymap -// 'default' keymap's led_test_init() is empty function, do nothing -// 'led_test' keymap's led_test_init() force rgblight_mode_noeeprom(35); -__attribute__ ((weak)) -void led_test_init(void) {} - -void matrix_update(struct CharacterMatrix *dest, - const struct CharacterMatrix *source) { - if (memcmp(dest->display, source->display, sizeof(dest->display))) { - memcpy(dest->display, source->display, sizeof(dest->display)); - dest->dirty = true; - } -} - -//assign the right code to your layers for OLED display -#define L_BASE 0 -#define L_FN (1<<_FN) -#define L_ADJ (1<<_ADJ) -#define L_ADJ_TRI (L_ADJ|L_FN) - -static void render_logo(struct CharacterMatrix *matrix) { - - static char logo[]={ - 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94, - 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4, - 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4, - 0}; - matrix_write(matrix, logo); - //matrix_write_P(&matrix, PSTR(" Split keyboard kit")); -} - - - -void render_status(struct CharacterMatrix *matrix) { - - // Render to mode icon - static char logo[][2][3]={{{0x95,0x96,0},{0xb5,0xb6,0}},{{0x97,0x98,0},{0xb7,0xb8,0}}}; - if(keymap_config.swap_lalt_lgui==false){ - matrix_write(matrix, logo[0][0]); - matrix_write_P(matrix, PSTR("\n")); - matrix_write(matrix, logo[0][1]); - }else{ - matrix_write(matrix, logo[1][0]); - matrix_write_P(matrix, PSTR("\n")); - matrix_write(matrix, logo[1][1]); - } - - // Define layers here, Have not worked out how to have text displayed for each layer. Copy down the number you see and add a case for it below - char buf[40]; - snprintf(buf,sizeof(buf), "Undef-%ld", layer_state); - matrix_write_P(matrix, PSTR("\nLayer: ")); - switch (layer_state) { - case L_BASE: - matrix_write_P(matrix, PSTR("Default")); - break; - case L_FN: - matrix_write_P(matrix, PSTR("FN")); - break; - case L_ADJ: - case L_ADJ_TRI: - matrix_write_P(matrix, PSTR("ADJ")); - break; - default: - matrix_write(matrix, buf); - } - - // Host Keyboard LED Status - char led[40]; - snprintf(led, sizeof(led), "\n%s %s %s", - (host_keyboard_leds() & (1<event.pressed) { + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + case COLEMAK: + if(record->event.pressed) { + set_single_persistent_default_layer(_COLEMAK); + } + return false; + break; + case RGBRST: + #ifdef RGBLIGHT_ENABLE + if (record->event.pressed) { + eeconfig_update_rgblight_default(); + rgblight_enable(); + } + #endif + break; + } + + + return process_record_keymap(keycode, record) && +#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE) + process_record_rgb(keycode, record) && +#endif // RGBLIGHT_ENABLE; + true; +} + +__attribute__ ((weak)) +bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { + return true; +} + + +__attribute__ ((weak)) +bool process_record_rgb(uint16_t keycode, keyrecord_t *record) { + return true; +} diff --git a/users/kageurufu/process_records.h b/users/kageurufu/process_records.h new file mode 100644 index 000000000..d1c50a411 --- /dev/null +++ b/users/kageurufu/process_records.h @@ -0,0 +1,27 @@ +#pragma once +#include "kageurufu.h" + +#define FN_ESC LT(_FN, KC_ESC) +#define FN MO(_FN) +#define ADJ MO(_ADJ) + +enum layer_number { + _QWERTY = 0, + _COLEMAK, + _COLEMAK_DH, + _FN, + _ADJ, + ADDITIONAL_LAYER +}; + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + CMAK_DH, + RGBRST, + KAGEURUFU_SAFE_RANGE +}; + + +bool process_record_keymap(uint16_t keycode, keyrecord_t *record); +bool process_record_rgb(uint16_t keycode, keyrecord_t *record); diff --git a/keyboards/sol/keymaps/kageurufu/config.h b/users/kageurufu/readme.md similarity index 78% rename from keyboards/sol/keymaps/kageurufu/config.h rename to users/kageurufu/readme.md index 452cdda82..57dd85d6b 100644 --- a/keyboards/sol/keymaps/kageurufu/config.h +++ b/users/kageurufu/readme.md @@ -1,8 +1,4 @@ -/* -This is the c configuration file for the keymap - -Copyright 2012 Jun Wako -Copyright 2015 Jack Humbert +Copyright 2018- Franklyn Tackitt franklyn@tackitt.net @kageurufu 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 @@ -16,10 +12,3 @@ 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 . -*/ - -#pragma once - - -// place overrides here - diff --git a/users/kageurufu/rules.mk b/users/kageurufu/rules.mk new file mode 100644 index 000000000..1bd16e262 --- /dev/null +++ b/users/kageurufu/rules.mk @@ -0,0 +1,15 @@ +SRC += kageurufu.c \ + process_records.c \ + custom_rgb.c + +# Link time optimization, should save on firmware size +EXTRAFLAGS += -flto + + +# Some usual defaults +MOUSEKEY_ENABLE = no +EXTRAKEY_ENABLE = yes +COMMAND_ENABLE = yes +CONSOLE_ENABLE = yes +RGBLIGHT_ENABLE = yes +RGBLIGHT_ANIMATIONS = yes From a7b1b146d12cce1858db59c1d99ce84fb37fc59e Mon Sep 17 00:00:00 2001 From: Jacob Jerrell Date: Wed, 2 Jan 2019 11:23:42 -0600 Subject: [PATCH 780/788] Keymap: Bocaj Layout and Userspace Refactor (#4753) * Bocaj Layout Revamp * Pull in Upstream (#1) * Various tweaks for some Input:Club build processes * change KEYMAP to LAYOUT for all new keyboards made using this script * Add support for rev3 of the Atom47 (#2672) * Added support for rev3 of the Atom47 * Updated Atom47 readme's * Fix redefine error on rev2 and add maartenwut's keymap * Fix redefine error on LEdiodes keymap * Add Nyquist keymap (#2692) * nyquist * danielhklein nyquist setup * shift left controls * remove readme * cleanup before pr * ready for pr * Adds Phantom TKL support (#2696) * Add an info.json to phantom keyboard * Add layouts - KEYMAP_WINKEYLESS - KEYMAP_7BIT - KEYMAP_ISO - KEYMAP_ISO_WINKEYLESS * Add key_counts * Add 2 missing F-Row keys * Add TKC1800 info.json Created an info.json for the tkc1800. * Clueboard 60 info.json - adds - LAYOUT_60_ansi - LAYOUT_60_iso - KEYMAP_AEK - KEYMAP - LAYOUT_60_ansi_split_bs_rshift * Add the Speedo keyboard * Fix KC60 info.json file (#2707) * change KEYMAP to LAYOUT in all the KC60 files * Redo the info.json file * Small fixes to TKC1800 - adjust F-row to use 0.25 spacing - split left shift - add key_count * Fix some Configurator Warnings regarding LAYOUT vs KEYMAP (#2708) * change diverge 3 KC_KEYMAP to LAYOUT * Change KEYMAP to LAYOUT for handwired arrow pad * change M10A to LAYOUT for m10-a * Change KC_KEYMAP to LAYOUT_kc and KEYMAP to LAYOUT for mf68 * change KC_KEYMAP to LAYOUT for nano * Refactor to LAYOUT * refactor to LAYOUT-ansi and LAYOUT_iso for s65 * LAYOUT conversions for lfkkeyboards * missed a few renames * mini1800 for lfkeyobards support of LAYOUT * Improve state/chord handling and clean up namespace Some values that can never, ever, change were held in local variables, rather than in PROGMEM. Fixed. Change "pressed" to a signed int so the test for < 0 makes sense, and to avoid possible weird failure modes in the case where a key release comes in when pressed is already zero. (Shouldn't happen, sure, but computers are weird.) A lot of things in process_steno had external linkage for no particular reason. They've been marked static. Stuff still builds. Distinguish between currently-held keys and keys that have been held, and expose these values through a nicely-named API so other code could, say, check on the current set of steno chording in order to make displays. Also in passing fix up the "state" value having external linkage so it could clash with other people's variable declarations. The API also provides hooks for key processing and steno chord events, so you can monitor those events without having to run in matrix_scan_user and recheck the values directly. Also document these. There is no path through processing a key that doesn't end with a return false, so the nested return foo() are gone and we just return false. * Pull information from config.h and rules.mk (#2711) * Pull information from config.h and rules.mk * Readd the kbd75 maintainer * Remove obsolete info.json entries (#2712) * Clean up some long-standing errors when populating the API (#2715) * More Configurator Warning Fixes (#2716) * mf68_ble did not have the correct .c and .h files * Fix JC65 KEYMAP to LAYOUT * Change KEYMAP to LAYOUT for s60_x * Convert KEYMAP to LAYOUT for lets_split boards * Convert KEYMAP to LAYOUT * more fixes to keymap for iris * convert KEYMAP to LAYOUT for levinson keyboard * change losinggeneration's KEYMAP to LAYOUT * convert KEYMAP to LAYOUT * convert KEYMAP to LAYOUT for nyquist * convert KEYMAP to LAYOUT * convert KEYMAP to LAYOUT for viterbi * convert KEYMAP to LAYOUT * convert KEYMAP and its subsidiries to the LAYOUT standard * convert KEYMAP and its subsidiries to the new LAYOUT standard * Normacos keymap for let's split keyboard (#2691) * Cheers let's split keymap * fixed typo on norman layer of cheers keymap for let's split * fixed right handed mappings for home row * cheers keymap for let's split redefinition * updated Cheers keymap for let's split * cheers keymap for let's split updated with some terminal macros * renamed cheers let's split keymap to a more appropriate normacos * updated normacos keymap doc / removed non functional keys * reset let's split rules to default values * added more spotlight search macros * normalized keymap comments * Moved numpad on lower layer * hhkb jp personal keymap (#2698) * Add JJ40 Cockpit personal keymap (#2713) * Add JJ40 Cockpit keymap * Fix lower layer symbols * Add readme for "major" keyboards to eliminate more QMK Configurator errors (#2718) * add readme to ktype keyboard * add readme to m10a * add readme to mini1800 * add readme to parent directory * Revert "Pull in Upstream (#1)" This reverts commit eeba0cec17ccb636e4225eed88aeae72b99f5e45. * Updates to Bocaj Files - Gave up on Tap Dance for ' -> ' + Added another 'Secret' + Add ' -> ' to the Swap Hands key + Add Swap Hands to the ' -> ' key + Made Hand Swapping a momentary toggle - Removed Auto Shift + Added Layer Toggle to KC_QUOTE for the _TOOLS layer - Disabled Tap Dance * Merge remote-tracking branch 'upstream/master' * Updates to Bocaj Added Game Layers, Removed Unused Macros * Removed 'secrets.h' * Updates to Bocaj Remove 'secrets'. Remove 'sendstring_workman.h' and set related layer back to qwerty due to macro compatibility issues * Total revisioning of keymap and layout structure * Missed readme.md file * Bocaj - Permissive Hold setting enabled * Switching from ErgoDox EZ centric configuration to the layout/user approach * Bocaj - Create Userspace and Ergodox layout * Update settings.json * Pushing local updates * Reverting .vscode/settings.json * Adds pretty_osx and _win wrappers * Utilize Windows and Mac Wrappers * Update layouts/community/ergodox/bocaj/keymap.c * Updates to Bocaj keymap.c - Extended pretty_osx and pretty_win wrappers to allow modification of the bottom rows and thumb clusters. - Fixed already wrapped layouts to align with the change - Wrapped _NUMS and _CLICKY layers with the _osx wrapper because I main with a Mac * Updates to Bocaj Small documentation updates, added KC_MAKE from Drashna's layout, added KC_LOCK back to the diablo layer. * Add LShift to _Adjust layer * Minor changes to bocaj Put wrappers in userspace and added RESET keycode to the Adjust layer * Updates to Bocaj config & keymap; Fixed problem with process_leader.c - Made lots of changes to the bocaj layout and userspace - Pulled in latest upstream/master - Attempted to compile with latest and found an unneccessary `break` in process_leader.c * Bocaj - Updates to Layout and Userspace * Adjust LEADER_TIMEOUT to 350 * Put KC_GRAVE on _ADJUST layer * Eliminate _LOWER layer and associated definitions * Adjusted layer indicating LEDs to match changes * Fixed Diablo leader sequence * Added build info leader sequence * Got rid of obsoleted IGNORE_MOD_TAP_INTERRUPT/PERMISSIVE_HOLD/PREVENT_STUCK_MODIFIERS (may add STRICT_LAYER_RELEASE in the future) * Remove type_traits Not sure what in my VSCode config always brings this one in * refactor stage 1 * Bocaj Refactor Phase II * Made LED_2 brighter if both CTRL & GUI are being held * Enabled unicode because I got it to work in Mac OS * Finalized Build Info leader combination after testing in Mac OS * Not sure why KC_D3_1 was set to ASDF if !TAP_DANCE_ENABLE. So I changed that back * Experienced issues with `EXTRAFLAGS += -flto` using Docker in MacOS. Not sure what it does, but I don't seem to be missing anything * Wrote obligatory readme.md files and mentioned Drashna too many times... I don't think I can actually take credit for much of anything here. * Updates to Bocaj Made LED changes, added LM_DFLT which is similar to the grave macro, enabled retro tapping, working on a unicode idea -- currently fails to build. * Bocaj Refactor Phase 3 Part 2 - Continuation of implementing unicode switching based on default layer - Slight adjustments to _DIABLO and base wrapper because LM_DFLT macro didn't function as I'd hoped * Slight adjustment to KC_MAKE --- layouts/community/ergodox/bocaj/config.h | 4 +- layouts/community/ergodox/bocaj/keymap.c | 292 +++++++++------------- layouts/community/ergodox/bocaj/readme.md | 37 +++ layouts/community/ergodox/bocaj/rules.mk | 5 + users/bocaj/bocaj.c | 200 ++++++++------- users/bocaj/bocaj.h | 190 +++++--------- users/bocaj/config.h | 5 +- users/bocaj/process_records.c | 149 +++++++++++ users/bocaj/process_records.h | 52 ++++ users/bocaj/readme.md | 110 +++++++- users/bocaj/rules.mk | 30 ++- users/bocaj/send_unicode.c | 106 ++++++++ users/bocaj/send_unicode.h | 71 ++++++ users/bocaj/tap_dances.c | 1 - users/bocaj/tap_dances.h | 12 + users/bocaj/wrappers.h | 37 +++ 16 files changed, 896 insertions(+), 405 deletions(-) create mode 100644 layouts/community/ergodox/bocaj/readme.md create mode 100644 users/bocaj/process_records.c create mode 100644 users/bocaj/process_records.h create mode 100644 users/bocaj/send_unicode.c create mode 100644 users/bocaj/send_unicode.h create mode 100644 users/bocaj/wrappers.h diff --git a/layouts/community/ergodox/bocaj/config.h b/layouts/community/ergodox/bocaj/config.h index 78350f603..bc1d20a62 100644 --- a/layouts/community/ergodox/bocaj/config.h +++ b/layouts/community/ergodox/bocaj/config.h @@ -2,5 +2,5 @@ #include QMK_KEYBOARD_CONFIG_H -#undef PRODUCT -#define PRODUCT BocajEZ - Frankensteined ErgoDox EZ +#define LEADER_TIMEOUT 250 +#define LEADER_PER_KEY_TIMING diff --git a/layouts/community/ergodox/bocaj/keymap.c b/layouts/community/ergodox/bocaj/keymap.c index fbe0fca65..cb78e7aae 100644 --- a/layouts/community/ergodox/bocaj/keymap.c +++ b/layouts/community/ergodox/bocaj/keymap.c @@ -1,5 +1,5 @@ /* -Copyright 2018 Jacob Jerrell jacob.jerrell@gmail.com @JacobJerrell +Copyright 2018 Jacob Jerrell @JacobJerrell 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 @@ -14,97 +14,99 @@ 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 . */ + #include QMK_KEYBOARD_H #include "bocaj.h" +#define LAYOUT_ergodox_pretty_base( \ + K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, \ + K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \ + K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A \ + ) \ + LAYOUT_ergodox_pretty_wrapper( \ + KC_ESC, __________________NUMBER_LEFT_______________, JJ_ARRW, KC_MINS, __________________NUMBER_RIGHT______________, KC_EQUAL, \ + KC_DEL, K01, K02, K03, K04, K05, KC_LPRN, KC_RPRN, K06, K07, K08, K09, K0A, KC_BSLASH, \ + KC_NUMS, K11, SFT_T(K12), K13, ALT_T(K14), K15, K16, ALT_T(K17), K18, SFT_T(K19), K1A, KC_QUOT, \ + OS_LSFT, CTL_T(K21), K22, K23, K24, K25, HYP_LBK, MEH_RBK, K26, K27, K28, K29, CTL_T(K2A), KC_RSFT, \ + KC_GAME,KC_NUMS, TT(_LOWER), KC_UP, KC_LEFT, KC_RIGHT, KC_DOWN, UC_DISA,KC_GAME, KC_ADJS, \ + KC_APP,KC_HOME, KC_END,KC_ESC, \ + UC_FLIP, UC_TABL, \ + KC_SPACE,KC_BSPACE,KC_LEAD, UC_SHRG,KC_TAB,KC_LWEN \ +) + +#define LAYOUT_ergodox_pretty_base_wrapper(...) LAYOUT_ergodox_pretty_base(__VA_ARGS__) + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* Hardware Workman - http://www.keyboard-layout-editor.com/#/gists/7a07cb982ec3597ba3e3d947554225f1 - .---------------------------------------------. .---------------------------------------------. - | ESC | 1 | 2 | 3 | 4 | 5 | -> | ! - | 6 | 7 | 8 | 9 | 0 | = | - !-------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+-------! - | DEL | Q | D | R | W | B | ( | ! ) | J | F | U | P | ; | \ | - !-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------! - | NUMS | A | S | H | T | G |-------! !-------! Y | N | E | O | I | ' | - !-------+-----+-----+-----x-----x-----! HYP ! ! MEH !-----x-----x-----+-----+-----+-------! - | SHIFT | Z | X | M | C | V | [ | ! ] | K | L | , | . | / | SHIFT | - '-------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+-------' - | GAME | NUM | LWR | UP | LFT | .---------------. .---------------. ! RGT | DWN | | | ADJ | - '------------------------------' | APP | HOME | ! PGUP | ESC | '------------------------------' - .-------+-------+-------! !-------+-------+-------. - ! ! | END | ! PGDN | ! ENTER ! - ! SPACE ! BSPCE !-------! !-------! TAB ! / ! - | | | COPY | ! PASTE | | LOWER | - '-----------------------' '-----------------------' + /* Workman - http://www.keyboard-layout-editor.com/#/gists/7a07cb982ec3597ba3e3d947554225f1 + .---------------------------------------------. .---------------------------------------------. + | ESC | 1 | 2 | 3 | 4 | 5 | -> | ! - | 6 | 7 | 8 | 9 | 0 | = | + !-------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+-------! + | DEL | Q | D | R | W | B | ( | ! ) | J | F | U | P | ; | \ | + !-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------! + | NUMS | A | S | H | T | G |-------! !-------! Y | N | E | O | I | ' | + !-------+-----+-----+-----x-----x-----! HYP ! ! MEH !-----x-----x-----+-----+-----+-------! + | SHIFT | Z | X | M | C | V | [ | ! ] | K | L | , | . | / | SHIFT | + '-------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+-------' + | | NUM | LWR | UP | LFT | .---------------. .---------------. ! RGT | DWN | |GAME | ADJ | + '------------------------------' | APP | HOME | ! PGUP | ESC | '------------------------------' + .-------+-------+-------! !-------+-------+-------. + ! ! | END | ! PGDN | ! ENTER ! + ! SPACE ! BSPCE !-------! !-------! TAB ! / ! + | | | COPY | ! PASTE | | LOWER | + '-----------------------' '-----------------------' */ - [_HWRKMN] = LAYOUT_ergodox_pretty_wrapper( - KC_ESC, _______________________NUMBER_LEFT_______________________, JJ_ARRW, KC_MINUS,_______________________NUMBER_RIGHT______________________, KC_EQUAL, - KC_DEL, _______________________HWORKMAN_L1_______________________, KC_LPRN, KC_RPRN, _______________________HWORKMAN_R1_______________________, KC_BSLS, - KC_NUMS,_______________________HWORKMAN_L2_______________________, _______________________HWORKMAN_R2_______________________, KC_QUOTE, - KC_LSFT,_______________________HWORKMAN_L3_______________________, HYP_LBK, MEH_RBK, _______________________HWORKMAN_R3_______________________, KC_RSFT, - ___________________ERGODOX_BOTTOM_LEFT___________________, ___________________ERGODOX_BOTTOM_RIGHT__________________, - ______________________ERGODOX_THUMBS_____________________ + [_WORKMAN] = LAYOUT_ergodox_pretty_base_wrapper( + _________________WORKMAN_L1_________________, _________________WORKMAN_R1_________________, + _________________WORKMAN_L2_________________, _________________WORKMAN_R2_________________, + _________________WORKMAN_L3_________________, _________________WORKMAN_R3_________________ ), -/* Software Workman / QWERTY - http://www.keyboard-layout-editor.com/#/gists/b6c016a22a9d31381a276a603a42fe5f - .---------------------------------------------. .---------------------------------------------. - | ESC | 1 | 2 | 3 | 4 | 5 | -> | ! - | 6 | 7 | 8 | 9 | 0 | = | - !-------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+-------! - | DEL | Q | W | E | R | T | ( | ! ) | Y | U | I | O | P | \ | - !-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------! - | NUMS | A | S | D | F | G |-------! !-------! H | J | K | L | ; | ' | - !-------+-----+-----+-----x-----x-----! HYP ! ! MEH !-----x-----x-----+-----+-----+-------! - | SHIFT | Z | X | C | V | B | [ | ! ] | N | M | , | . | / | SHIFT | - '-------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+-------' - | GAME | NUM | LWR | UP | LFT | .---------------. .---------------. ! RGT | DWN | | | ADJ | - '------------------------------' | APP | HOME | ! PGUP | ESC | '------------------------------' - .-------+-------+-------! !-------+-------+-------. - ! ! | END | ! PGDN | ! ENTER ! - ! SPACE ! BSPCE !-------! !-------! TAB ! / ! - | | | COPY | ! PASTE | | LOWER | - '-----------------------' '-----------------------' -*/ - [_SWRKMN] = LAYOUT_ergodox_pretty_wrapper( - KC_ESC, _______________________NUMBER_LEFT_______________________, JJ_ARRW, KC_MINUS,_______________________NUMBER_RIGHT______________________, KC_EQUAL, - KC_DEL, _______________________SWORKMAN_L1_______________________, KC_LPRN, KC_RPRN, _______________________SWORKMAN_R1_______________________, KC_BSLS, - KC_NUMS,_______________________SWORKMAN_L2_______________________, _______________________SWORKMAN_R2_______________________, KC_QUOTE, - KC_LSFT,_______________________SWORKMAN_L3_______________________, HYP_LBK, MEH_RBK, _______________________SWORKMAN_R3_______________________, KC_RSFT, - ___________________ERGODOX_BOTTOM_LEFT___________________, ___________________ERGODOX_BOTTOM_RIGHT__________________, - ______________________ERGODOX_THUMBS_____________________ + [_WINWORKMAN] = LAYOUT_ergodox_pretty_base_wrapper( + _________________WORKMAN_L1_________________, _________________WORKMAN_R1_________________, + ________________WWORKMAN_L2_________________, ________________WWORKMAN_R2_________________, + _________________WORKMAN_L3_________________, _________________WORKMAN_R3_________________ ), -/* Lower - http://www.keyboard-layout-editor.com/#/gists/f1d745a88d1c48ab55e095efd9e7a43a - .---------------------------------------------. .---------------------------------------------. - | ESC | | | | | | -> | ! - | | | | | | = | - !-------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+-------! - | DEL | ! | @ | # | $ | % | ( | ! ) | ^ | & | * | ( | ) | \ | - !-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------! - | ` | 1 | 2 | 3 | 4 | 5 |-------! !-------! 6 | 7 | 8 | 9 | 0 | ' | - !-------+-----+-----+-----x-----x-----! HYP ! ! MEH !-----x-----x-----+-----+-----+-------! - | SHIFT | | | | | | [ | ! ] | | | | | | SHIFT | - '-------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+-------' - | GAME | NUM | LWR | UP | LFT | .---------------. .---------------. ! RGT | DWN | | | ADJ | - '------------------------------' | APP | HOME | ! PGUP | ESC | '------------------------------' - .-------+-------+-------! !-------+-------+-------. - ! ! | END | ! PGDN | ! ENTER ! - ! SPACE ! BSPCE !-------! !-------! TAB ! / ! - | | | COPY | ! PASTE | | LOWER | - '-----------------------' '-----------------------' +/* QWERTY - http://www.keyboard-layout-editor.com/#/gists/b6c016a22a9d31381a276a603a42fe5f + .---------------------------------------------. .---------------------------------------------. + | ESC | 1 | 2 | 3 | 4 | 5 | -> | ! - | 6 | 7 | 8 | 9 | 0 | = | + !-------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+-------! + | DEL | Q | W | E | R | T | ( | ! ) | Y | U | I | O | P | \ | + !-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------! + | NUMS | A | S | D | F | G |-------! !-------! H | J | K | L | ; | ' | + !-------+-----+-----+-----x-----x-----! HYP ! ! MEH !-----x-----x-----+-----+-----+-------! + | SHIFT | Z | X | C | V | B | [ | ! ] | N | M | , | . | / | SHIFT | + '-------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+-------' + | GAME | NUM | LWR | UP | LFT | .---------------. .---------------. ! RGT | DWN | | | ADJ | + '------------------------------' | APP | HOME | ! PGUP | ESC | '------------------------------' + .-------+-------+-------! !-------+-------+-------. + ! ! | END | ! PGDN | ! ENTER ! + ! SPACE ! BSPCE !-------! !-------! TAB ! / ! + | | | COPY | ! PASTE | | LOWER | + '-----------------------' '-----------------------' */ + [_QWERTY] = LAYOUT_ergodox_pretty_base_wrapper( + _________________QWERTY_L1__________________, _________________QWERTY_R1__________________, + _________________QWERTY_L2__________________, _________________QWERTY_R2__________________, + _________________QWERTY_L3__________________, _________________QWERTY_R3__________________ + ), [_LOWER] = LAYOUT_ergodox_pretty_wrapper( - _______,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, _______, _______, XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, _______, - _______,_______________________SPECIAL_LEFT______________________, _______, _______, _______________________SPECIAL_RIGHT_____________________, _______, - KC_GRV ,_______________________NUMBER_LEFT_______________________, _______________________NUMBER_RIGHT______________________, _______, - _______,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, _______, _______, XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, _______, - _________________________________________________________, _________________________________________________________, - ______________________ERGODOX_THUMBS_____________________ + KC_F11 ,__________________FUNCTION_LEFT_____________, _______, _______, __________________FUNCTION_RIGHT____________, KC_F12, + _______, _______, _______, KC_UP, _______, _______, _______, _______, _______, KC_7, KC_8, KC_9, KC_PAST, _______, + LM_GRAVE, _______, KC_LEFT, KC_DOWN,KC_RIGHT, _______, _______, KC_4, KC_5, KC_6, KC_PPLS, _______, + OS_LSFT,____________________BLANK___________________, _______, _______, _______, KC_1, KC_2, KC_3, KC_PMNS, _______, + ____________________BLANK___________________, KC_0, KC_PDOT, KC_COMM,KC_PEQL, _______, + _______, _______, _______, _______, + _______, _______, + _______, _______, _______, _______, _______, _______ ), - /* Adjust - http://www.keyboard-layout-editor.com/#/gists/dedeae17b35a5d5f745a42aaea78f007 +/* Adjust - http://www.keyboard-layout-editor.com/#/gists/dedeae17b35a5d5f745a42aaea78f007 .---------------------------------------------. .---------------------------------------------. - | | | | | | | EPRM | ! EPRM | | | | | | | + | MAKE | | | | | | RESET | ! EPRM | | | | | | | !-------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+-------! | | | | | | | | ! | | | | | | | !-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------! - | | 🔇 | 🔉 | 🔊 | LCK | |-------! !-------! | | | | | SWRKM | + | | 🔇 | 🔉 | 🔊 | LCK | |-------! !-------! | | | | | QWRTY | !-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------! - | | | | | | | | ! | | | | | | HWRKM | + | | | | | | | | ! | | | | | WIN | WRKMN | '-------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+-------' | | | | | | .---------------. .---------------. ! | | | | | '------------------------------' | | | ! | | '------------------------------' @@ -115,101 +117,66 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { '-----------------------' '-----------------------' */ [_ADJUST] = LAYOUT_ergodox_pretty_wrapper( - XXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, KC_EPRM, KC_EPRM, XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, XXXXXXX, - XXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX,KC__MUTE, KC__VOLDOWN, KC__VOLUP, MC_LOCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_SWRK, - XXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_HWRK, - XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, - ______________________ERGODOX_THUMBS_____________________ + KC_MAKE, ____________________BLANK___________________, KC_RST, KC_EPRM, ____________________BLANK___________________, XXXXXXX, + _______, ____________________BLANK___________________, _______, _______, ____________________BLANK___________________, XXXXXXX, + _______,KC__MUTE,KC__VOLDOWN,KC__VOLUP,MC_LOCK,_______, ____________________BLANK___________________, KC_MQWR, + _______, ____________________BLANK___________________, _______, _______, _______, _______, _______, _______, KC_WWRK, KC_MWRK, + ____________________BLANK___________________, ____________________BLANK___________________, + _______, _______, _______, _______, + _______, _______, + _______, _______, _______, _______, _______, _______ ), - [_NUMS] = LAYOUT_ergodox_pretty_wrapper( - XXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, XXXXXXX, XXXXXXX, XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, XXXXXXX, - XXXXXXX,XXXXXXX, XXXXXXX, KC_UP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_KP_7, KC_KP_8, KC_KP_9, KC_PAST, XXXXXXX, - _______,XXXXXXX, KC_LEFT, KC_DOWN, KC_RIGHT, XXXXXXX, XXXXXXX, KC_KP_4, KC_KP_5, KC_KP_6, KC_PPLS, XXXXXXX, - LM_SHFT,XXXXXXX, XXXXXXX, XXXXXXX, JJ_COPY, JJ_PSTE, XXXXXXX, XXXXXXX, XXXXXXX, KC_KP_1, KC_KP_2, KC_KP_3, KC_PMNS, XXXXXXX, - XXXXXXX,_______,XXXXXXX,XXXXXXX,XXXXXXX, KC_KP_0, KC_PDOT, KC_COMM, KC_PEQL, XXXXXXX, - _______, _______, _______,_______, - _______, _______, - KC_LALT,KC_LGUI,_______, _______,_______,_______ - ), - [_NMOD] = LAYOUT_ergodox_pretty_wrapper( - XXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, XXXXXXX, XXXXXXX, XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, XXXXXXX, - XXXXXXX,XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, XXXXXXX, - XXXXXXX,XXXXXXX, _______, _______, _______, XXXXXXX, XXXXXXX, _______, _______, _______, _______, XXXXXXX, - LM_SHFT,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, XXXXXXX, - XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, _______, _______, _______, _______, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX, - XXXXXXX, XXXXXXX, - KC_LALT,KC_LGUI,XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX - ), -// Diablo - http://www.keyboard-layout-editor.com/#/gists/28476e4237e77d4835ac8a9d7e5f9b2c [_DIABLO] = LAYOUT_ergodox_pretty_wrapper( - KC_ESC , XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - KC_TAB , KC_Q ,ALT_T(KC_S), KC_I , KC_F , KC_J ,KC_MINS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - KC_LOCK, KC_1 , KC_2 , KC_3 , KC_4 ,KC_DCLR , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - KC_LSFT, KC_D3_1 , KC_D3_2 , KC_D3_3 , KC_D3_4 , KC_T ,KC_MINS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - _______, XXXXXXX , XXXXXXX , XXXXXXX , KC_M , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX, - XXXXXXX, XXXXXXX, - KC_BTN1,KC_BTN2,KC_ENTER, XXXXXXX,XXXXXXX,XXXXXXX + KC_ESC, KC_V, KC_D, KC_LALT, KC_NO, KC_NO, KC_NO, KC_NO, KC_F9, KC_F10, KC_F11, KC_F12, KC_NO, KC_NO, + KC_TAB, KC_S, KC_F, KC_I, KC_M, KC_T, KC_ENTER, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_Q, KC_1, KC_2, KC_3, KC_4, KC_P, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_LCTL, KC_D3_1, KC_D3_2, KC_D3_3, KC_D3_4, KC_Z, KC_LOCK, KC_NO, KC_N, KC_M, KC_NO, KC_NO, KC_NO, KC_NO, + _______, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, KC_NO, + KC_L, KC_J, KC_NO, KC_NO, + KC_F, KC_NO, + SFT_T(KC_SPACE), ALT_T(KC_Q), KC_DCLR, KC_PGDN, KC_DEL, KC_ENT ) }; bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { - uint8_t default_layer = 0; - default_layer = eeconfig_read_default_layer(); - switch (keycode) { - case KC_SWRK: - if (!record->event.pressed) { - set_single_persistent_default_layer(_SWRKMN); - layer_move(default_layer); - ergodox_blink_all_leds(); - ergodox_blink_all_leds(); - } - return false; - break; - case KC_HWRK: - if (!record->event.pressed) { - set_single_persistent_default_layer(_HWRKMN); - layer_move(default_layer); - ergodox_blink_all_leds(); - ergodox_blink_all_leds(); - } - return false; - break; - case KC_EPRM: - if (!record->event.pressed) { - ergodox_blink_all_leds(); - eeconfig_init(); - } - return false; - break; - case MC_LOCK: - if (!record->event.pressed) { - layer_move(default_layer); - SEND_STRING(SS_LCTRL(SS_LGUI("q"))); - } - return false; - break; - } return true; } void matrix_init_keymap(void) {}; void matrix_scan_keymap(void) { + uint8_t modifiers = get_mods(); + uint8_t led_usb_state = host_keyboard_leds(); + uint8_t one_shot = get_oneshot_mods(); uint8_t layer = biton32(layer_state); + ergodox_board_led_off(); ergodox_right_led_1_off(); ergodox_right_led_2_off(); ergodox_right_led_3_off(); + switch (layer) { - /* - Lights are treated as binary here for easy identification. - LED1 = 4; LED2 = 2; LED1 = 1 - This allows for up to 8 identified layers (default layers being no lights on) - Which is way more than I should ever need - */ + case _WORKMAN: + case _QWERTY: + case _WINWORKMAN: + if (modifiers & MODS_SHIFT_MASK || led_usb_state & (1< @JacobJerrell + +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 . +*/ + #include "bocaj.h" -#include "eeprom.h" -#include "version.h" -#include "tap_dances.h" -static uint16_t copy_paste_timer; userspace_config_t userspace_config; +#if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE)) + #define BOCAJ_UNICODE_MODE UC_OSX +#else + // set to 2 for UC_WIN, set to 4 for UC_WINC + #define BOCAJ_UNICODE_MODE 2 +#endif -/* *** *** *** *** * - * Helper Functions * - * *** *** *** *** */ void tap(uint16_t keycode){ register_code(keycode); unregister_code(keycode); }; // Add reconfigurable functions here, for keymap customization @@ -36,10 +52,7 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { } __attribute__ ((weak)) -bool process_record_secrets(uint16_t keycode, keyrecord_t *record) { - return true; -} - +void matrix_scan_secrets(void) {} __attribute__ ((weak)) uint32_t layer_state_set_keymap (uint32_t state) { @@ -57,7 +70,14 @@ void led_set_keymap(uint8_t usb_led) {} // Call user matrix init, set default RGB colors and then // call the keymap's init function void matrix_init_user(void) { - userspace_config.raw = eeprom_read_byte(EECONFIG_USERSPACE); + userspace_config.raw = eeconfig_read_user(); + + #if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE)) + set_unicode_input_mode(BOCAJ_UNICODE_MODE); + get_unicode_input_mode(); + #endif //UNICODE_ENABLE + + matrix_init_keymap(); } @@ -78,6 +98,18 @@ void suspend_wakeup_init_user(void) #endif } +void eeconfig_init_user(void) { + userspace_config.raw = 0; + eeconfig_update_user(userspace_config.raw); + #if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE)) + set_unicode_input_mode(BOCAJ_UNICODE_MODE); + get_unicode_input_mode(); + #else + eeprom_update_byte(EECONFIG_UNICODEMODE, BOCAJ_UNICODE_MODE); + #endif +} + +LEADER_EXTERNS(); // No global matrix scan code, so just run keymap's matrix // scan function void matrix_scan_user(void) { @@ -86,6 +118,68 @@ void matrix_scan_user(void) { has_ran_yet = true; startup_user(); } + LEADER_DICTIONARY() { + leading = false; + leader_end(); + + // Mac Save (Leader -> s) + SEQ_ONE_KEY(KC_S) { + SEND_STRING(SS_LGUI("s")); + } + + // Mac copy line down (Leader -> d, d) + SEQ_TWO_KEYS(KC_D, KC_D) { + register_code(KC_LSHIFT); + register_code(KC_HOME); + unregister_code(KC_HOME); + unregister_code(KC_LSHIFT); + SEND_STRING(SS_LGUI("c")); + tap(KC_END); + tap(KC_ENTER); + SEND_STRING(SS_LGUI("v")); + } + + // Mac copy line up (Leader -> u, u) + SEQ_TWO_KEYS(KC_U, KC_U) { + register_code(KC_LSHIFT); + register_code(KC_HOME); + unregister_code(KC_HOME); + unregister_code(KC_LSHIFT); + SEND_STRING(SS_LGUI("c")); + tap(KC_UP); + tap(KC_END); + tap(KC_ENTER); + SEND_STRING(SS_LGUI("v")); + } + + // Mac VS Debug + SEQ_ONE_KEY(KC_D) { + tap(KC_F5); + } + + // Mac VS Stop Debug + SEQ_TWO_KEYS(KC_S, KC_D) { + register_code(KC_LSHIFT); + tap(KC_F5); + unregister_code(KC_LSHIFT); + } + + // Start Diablo 3 + SEQ_ONE_KEY(KC_3) { + SEND_STRING(SS_LCTRL(" ")); + SEND_STRING("Diablo"); + tap(KC_ENTER); + } + + SEQ_ONE_KEY(KC_B) { + SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION " "); + tap(KC_ENTER); + SEND_STRING ("Built at: " QMK_BUILDDATE); + } +#ifndef NO_SECRETS + matrix_scan_secrets(); +#endif // !NO_SECRETS + } #ifdef TAP_DANCE_ENABLE // Run Diablo 3 macro checking code. run_diablo_macro_check(); @@ -93,85 +187,3 @@ void matrix_scan_user(void) { matrix_scan_keymap(); } - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - /* uint8_t default_layer = 0; - default_layer = eeconfig_read_default_layer(); */ - switch (keycode) { - case JJ_COPY: - if (!record->event.pressed) { - SEND_STRING(SS_LGUI("c")); - } - return false; - break; - case JJ_PSTE: - if (!record->event.pressed) { - SEND_STRING(SS_LGUI("v")); - } - return false; - break; - case JJ_ARRW: - if (!record->event.pressed) { - SEND_STRING("->"); - } - return false; - break; /* - case KC_SWRK: - if (!record->event.pressed) { - set_single_persistent_default_layer(_SWRKMN); - layer_move(default_layer); - //ergodox_blink_all_leds(); - //ergodox_blink_all_leds(); - } - return false; - break; - case KC_HWRK: - if (!record->event.pressed) { - set_single_persistent_default_layer(_HWRKMN); - layer_move(default_layer); - //ergodox_blink_all_leds(); - //ergodox_blink_all_leds(); - } - return false; - break; - case KC_EPRM: - if (!record->event.pressed) { - //ergodox_blink_all_leds(); - eeconfig_init(); - } - return false; - break; - case MC_LOCK: - if (!record->event.pressed) { - layer_move(default_layer); - SEND_STRING(SS_LCTRL(SS_LGUI("q"))); - } - return false; - break; */ - case KC_DCLR: -#ifdef TAP_DANCE_ENABLE - if (record->event.pressed) { - uint8_t dtime; - for (dtime = 0; dtime < 4; dtime++) { - diablo_key_time[dtime] = diablo_times[0]; - } - } -#endif // !TAP_DANCE_ENABLE - return false; - break; - case KC_CCCV: - if (record->event.pressed) { - copy_paste_timer = timer_read(); - } else { - if (timer_elapsed(copy_paste_timer) > TAPPING_TERM) { // Hold, copy - SEND_STRING(SS_LGUI("c")); - } else { - SEND_STRING(SS_LGUI("v")); - } - } - return false; - break; - } - return process_record_keymap(keycode, record); -} - diff --git a/users/bocaj/bocaj.h b/users/bocaj/bocaj.h index 7b537397f..04991a015 100644 --- a/users/bocaj/bocaj.h +++ b/users/bocaj/bocaj.h @@ -1,141 +1,85 @@ -#ifndef USERSPACE -#define USERSPACE +/* +Copyright 2018 Jacob Jerrell @JacobJerrell +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 . +*/ + +#pragma once #include "quantum.h" +#include "version.h" +#include "eeprom.h" +#include "wrappers.h" +#include "process_records.h" +#ifdef TAP_DANCE_ENABLE + #include "tap_dances.h" +#endif // TAP_DANCE_ENABLE -/* *** *** *** *** *** * - * Define layer names * - * *** *** *** *** *** */ +/* Layer Names */ enum userspace_layers { - _HWRKMN = 0, - _SWRKMN, + _WORKMAN = 0, + _WINWORKMAN, + _QWERTY, _LOWER, _ADJUST, - _NUMS, - _NMOD, - _DIABLO + _DIABLO, }; -#define EECONFIG_USERSPACE (uint8_t *)19 +#if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE)) + #define BOCAJ_UNICODE_MODE UC_OSX +#else + // set to 2 for UC_WIN, set to 4 for UC_WINC + #define BOCAJ_UNICODE_MODE 2 +#endif + +/* +define modifiers here, since MOD_* doesn't seem to work for these + */ +#define MODS_SHIFT_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) +#define MODS_CTRL_MASK (MOD_BIT(KC_LCTL)|MOD_BIT(KC_RCTRL)) +#define MODS_ALT_MASK (MOD_BIT(KC_LALT)|MOD_BIT(KC_RALT)) +#define MODS_GUI_MASK (MOD_BIT(KC_LGUI)|MOD_BIT(KC_RGUI)) + +bool mod_key_press_timer (uint16_t code, uint16_t mod_code, bool pressed); +bool mod_key_press (uint16_t code, uint16_t mod_code, bool pressed, uint16_t this_timer); +bool send_game_macro(const char *str, keyrecord_t *record, bool override); +void matrix_init_keymap(void); +void shutdown_keymap(void); +void suspend_power_down_keymap(void); +void suspend_wakeup_init_keymap(void); +void matrix_scan_keymap(void); +uint32_t layer_state_set_keymap (uint32_t state); +uint32_t default_layer_state_set_keymap (uint32_t state); +void led_set_keymap(uint8_t usb_led); +void eeconfig_init_keymap(void); +void tap(uint16_t keycode); + typedef union { uint8_t raw; } userspace_config_t; -/* *** *** *** *** *** *** * - * Define Custom Keycodes * - * *** *** *** *** *** *** */ -enum userspace_custom_keycodes { - KC_EPRM = SAFE_RANGE, // can always be here - KC_SWRK, - KC_HWRK, - KC_VRSN, - JJ_COPY, - JJ_PSTE, - JJ_ARRW, - KC_CCCV, - MC_LOCK, - KC_DCLR, - NEW_SAFE_RANGE //use "NEWPLACEHOLDER for keymap specific codes -}; - -// Space Cadet Hyper/Meh and [/] -#define HYP_LBK ALL_T(KC_LBRACKET) -#define MEH_RBK MEH_T(KC_RBRACKET) - -// Layout beauti-/simpli-fication -#define KC_LWEN LT(_LOWER, KC_ENTER) -#define KC_ADJS TT(_ADJUST) -#define KC_NUMS TT(_NUMS) -#define LM_SHFT LM(_NMOD, MOD_LSFT) -#define XXXXXXX KC_NO -#define _______ KC_TRNS - -void tap(uint16_t keycode); - -/* *** *** *** *** *** *** * - * Diablo 3 Macro Handling * - * *** *** *** *** *** *** */ +extern userspace_config_t userspace_config; // If Tap Dancing is enabled, we manage that here. // If it is not, then we define the KC_D3_# codes gracefully #ifdef TAP_DANCE_ENABLE -enum { - TD_D3_1 = 0, - TD_D3_2, - TD_D3_3, - TD_D3_4, -}; - -#define KC_D3_1 TD(TD_D3_1) -#define KC_D3_2 TD(TD_D3_2) -#define KC_D3_3 TD(TD_D3_3) -#define KC_D3_4 TD(TD_D3_4) + #define KC_D3_1 TD(TD_D3_1) + #define KC_D3_2 TD(TD_D3_2) + #define KC_D3_3 TD(TD_D3_3) + #define KC_D3_4 TD(TD_D3_4) #else // !TAP_DANCE_ENABLE -#define KC_D3_1 KC_1 -#define KC_D3_2 KC_2 -#define KC_D3_3 KC_3 -#define KC_D3_4 KC_4 + #define KC_D3_1 KC_1 + #define KC_D3_2 KC_2 + #define KC_D3_3 KC_3 + #define KC_D3_4 KC_4 #endif // TAP_DANCE_ENABLE - -// Wrapper for handling of keymap 'blocks' -// not 100% sure what this first part does. Credit to Drashna -#if (!defined(LAYOUT) && defined(KEYMAP)) -#define LAYOUT KEYMAP -#endif - -#define LAYOUT_ergodox_pretty_wrapper(...) LAYOUT_ergodox_pretty(__VA_ARGS__) -/* Pretty Layout -.---------------------------------------------. .---------------------------------------------. -| 1 | 2 | 3 | 4 | 5 | 6 | 7 | ! 8 | 9 | 10 | 11 | 12 | 13 | 14 | -!-------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+-------! -| 15 | 16 | 17 | 18 | 19 | 20 | 21 | ! 22 | 23 | 24 | 25 | 26 | 27 | 28 | -!-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------! -| 29 | 30 | 31 | 32 | 33 | 34 |-------! !-------! 35 | 36 | 37 | 38 | 39 | 40 | -!-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------! -| 41 | 42 | 43 | 44 | 45 | 46 | 47 | ! 48 | 49 | 50 | 51 | 52 | 53 | 54 | -'-------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+-------' - | 55 | 56 | 57 | 58 | 59 | .---------------. .---------------. ! 60 | 61 | 62 | 63 | 64 | - '------------------------------' | 65 | 66 | ! 67 | 68 | '------------------------------' - .-------+-------+-------! !-------+-------+-------. - ! ! | 69 | ! 70 | ! ! - ! ! !-------! !-------! ! ! - | 71 | 72 | 73 | ! 74 | 75 | 76 | - '-----------------------' '-----------------------' -*/ - -#define _______________________SWORKMAN_L1_______________________ KC_Q, KC_W, KC_E, KC_R, KC_T -#define _______________________SWORKMAN_L2_______________________ KC_A, SFT_T(KC_S), GUI_T(KC_D), ALT_T(KC_F), KC_G -#define _______________________SWORKMAN_L3_______________________ CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B - -#define _______________________SWORKMAN_R1_______________________ KC_Y, KC_U, KC_I, KC_O, KC_P -#define _______________________SWORKMAN_R2_______________________ KC_H, ALT_T(KC_J), GUI_T(KC_K), SFT_T(KC_L), KC_SCLN -#define _______________________SWORKMAN_R3_______________________ KC_N, KC_M, KC_COMM, KC_DOT, CTL_T(KC_SLASH) - -// Hardware Driven Workman -#define _______________________HWORKMAN_L1_______________________ KC_Q, KC_D, KC_R, KC_W, KC_B -#define _______________________HWORKMAN_L2_______________________ KC_A, SFT_T(KC_S), GUI_T(KC_H), ALT_T(KC_T), KC_G -#define _______________________HWORKMAN_L3_______________________ CTL_T(KC_Z), KC_X, KC_M, KC_C, KC_V - -#define _______________________HWORKMAN_R1_______________________ KC_J, KC_F, KC_U, KC_P, KC_SCLN -#define _______________________HWORKMAN_R2_______________________ KC_Y, ALT_T(KC_N), GUI_T(KC_E), SFT_T(KC_O), KC_I -#define _______________________HWORKMAN_R3_______________________ KC_K, KC_L, KC_COMM, KC_DOT, CTL_T(KC_SLASH) - -#define ___________________ERGODOX_BOTTOM_LEFT___________________ TT(_DIABLO), KC_NUMS, TT(_LOWER), KC_UP, KC_LEFT -#define ___________________ERGODOX_BOTTOM_RIGHT__________________ KC_RIGHT, KC_DOWN, XXXXXXX, XXXXXXX, TT(_ADJUST) - -#define _______________________NUMBER_LEFT_______________________ KC_1, KC_2, KC_3, KC_4, KC_5 -#define _______________________NUMBER_RIGHT______________________ KC_6, KC_7, KC_8, KC_9, KC_0 - -#define _______________________SPECIAL_LEFT______________________ KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC -#define _______________________SPECIAL_RIGHT_____________________ KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN - -#define _________________________________________________________ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS -#define XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX KC_NO, KC_NO, KC_NO, KC_NO, KC_NO - -// LEFT | RIGHT -#define ______________________ERGODOX_THUMBS_____________________ KC_APP,KC_HOME, KC_PGUP,KC_ESC, \ - KC_END, KC_PGDOWN, \ - KC_SPACE,KC_BSPACE,JJ_COPY, JJ_PSTE,KC_TAB,KC_LWEN - - -#endif // !USERSPACE diff --git a/users/bocaj/config.h b/users/bocaj/config.h index 0e726598c..1956ea6d9 100644 --- a/users/bocaj/config.h +++ b/users/bocaj/config.h @@ -10,12 +10,15 @@ // actually sends Ctrl-x. That's bad.) #define IGNORE_MOD_TAP_INTERRUPT #undef PERMISSIVE_HOLD +#define PREVENT_STUCK_MODIFIERS #ifdef TAPPING_TERM #undef TAPPING_TERM #endif // TAPPING_TERM #define TAPPING_TERM 175 +#define RETRO_TAPPING + // Disable action_get_macro and fn_actions, since we don't use these // and it saves on space in the firmware. #ifndef NO_DEBUG @@ -27,6 +30,4 @@ #define NO_ACTION_MACRO #define NO_ACTION_FUNCTION -#define DISABLE_LEADER - #define MACRO_TIMER 5 diff --git a/users/bocaj/process_records.c b/users/bocaj/process_records.c new file mode 100644 index 000000000..c36683f8b --- /dev/null +++ b/users/bocaj/process_records.c @@ -0,0 +1,149 @@ +#include "bocaj.h" +#include QMK_KEYBOARD_H + +uint16_t copy_paste_timer; +uint16_t grave_layer_timer; +uint16_t heal_layer_timer; + +__attribute__ ((weak)) +bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { + return true; +} + +// Defines actions tor my global custom keycodes. Defined in bocaj.h file +// Then runs the _keymap's record handler if not processed here +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case KC_MWRK: + if (!record->event.pressed) { + set_single_persistent_default_layer(_WORKMAN); + #if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE)) + set_unicode_input_mode(0); + #endif + layer_move(0); + ergodox_blink_all_leds(); + } + break; + case KC_WWRK: + if (!record->event.pressed) { + set_single_persistent_default_layer(_WINWORKMAN); + #if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE)) + set_unicode_input_mode(4); + #endif + layer_move(0); + ergodox_blink_all_leds(); + } + break; + case KC_MQWR: + if (!record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + #if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE)) + set_unicode_input_mode(0); + #endif + layer_move(0); + ergodox_blink_all_leds(); + } + break; + case MC_LOCK: + if (!record->event.pressed) { + layer_move(0); + SEND_STRING(SS_LCTRL(SS_LGUI("q"))); + } + break; + case KC_MAKE: // Compiles the firmware, and adds the flash command based on keyboard bootloader + if (!record->event.pressed) { + uint8_t temp_mod = get_mods(); + uint8_t temp_osm = get_oneshot_mods(); + clear_mods(); + clear_oneshot_mods(); + if (biton32(default_layer_state) == _WINWORKMAN) { + send_string_with_delay_P(PSTR("make " QMK_KEYBOARD ":" QMK_KEYMAP), 10); + } else { + send_string_with_delay_P(PSTR("util/docker_build.sh " QMK_KEYBOARD ":" QMK_KEYMAP), 10); + } + if (temp_mod & MODS_SHIFT_MASK) { + send_string_with_delay_P(PSTR(":teensy"), 10); + } + if (temp_mod & MODS_CTRL_MASK) { + send_string_with_delay_P(PSTR(" -j8 --output-sync"), 10); + } + send_string_with_delay_P(PSTR(SS_TAP(X_ENTER)), 10); + set_mods(temp_mod); + layer_move(0); + } + break; + case KC_DCLR: // reset all Diablo timers, disabling them +#ifdef TAP_DANCE_ENABLE + if (record->event.pressed) { + uint8_t dtime; + for (dtime = 0; dtime < 4; dtime++) { + diablo_key_time[dtime] = diablo_times[0]; + } + } +#endif // TAP_DANCE_ENABLE + break; + case JJ_ARRW: + if (!record->event.pressed) { + SEND_STRING("->"); + } + return false; + break; + case LM_GRAVE: + if (record->event.pressed) { + grave_layer_timer = timer_read(); + } else { + if (timer_elapsed(grave_layer_timer) < TAPPING_TERM) { + uint8_t temp_mod = get_mods(); + uint8_t one_shot = get_oneshot_mods(); + clear_mods(); + if (temp_mod & MODS_SHIFT_MASK || one_shot & MODS_SHIFT_MASK) { + register_code(KC_LSFT); + tap(KC_GRAVE); + unregister_code(KC_LSFT); + } else { + tap(KC_GRAVE); + } + set_mods(temp_mod); + } else { + layer_move(0); + } + } + return false; + break; + case KC_CCCV: + if (record->event.pressed) { + copy_paste_timer = timer_read(); + } else { + if (timer_elapsed(copy_paste_timer) > TAPPING_TERM) { // Hold, copy + SEND_STRING(SS_LGUI("c")); + } else { + SEND_STRING(SS_LGUI("v")); + } + } + return false; + break; +#ifdef UNICODE_ENABLE + case UC_FLIP: // (ノಠ痊ಠ)ノ彡┻━┻ + if (record->event.pressed) { + send_unicode_hex_string("0028 30CE 0CA0 75CA 0CA0 0029 30CE 5F61 253B 2501 253B"); + } + break; + case UC_TABL: // ┬─┬ノ( º _ ºノ) + if (record->event.pressed) { + send_unicode_hex_string("252C 2500 252C 30CE 0028 0020 00BA 0020 005F 0020 00BA 30CE 0029"); + } + break; + case UC_SHRG: // ¯\_(ツ)_/¯ + if (record->event.pressed) { + send_unicode_hex_string("00AF 005C 005F 0028 30C4 0029 005F 002F 00AF"); + } + break; + case UC_DISA: // ಠ_ಠ + if (record->event.pressed) { + send_unicode_hex_string("0CA0 005F 0CA0"); + } + break; +#endif + } + return process_record_keymap(keycode, record); +} diff --git a/users/bocaj/process_records.h b/users/bocaj/process_records.h new file mode 100644 index 000000000..248df13e1 --- /dev/null +++ b/users/bocaj/process_records.h @@ -0,0 +1,52 @@ +#pragma once +#include "bocaj.h" + +#if defined(KEYMAP_SAFE_RANGE) + #define PLACEHOLDER_SAFE_RANGE KEYMAP_SAFE_RANGE +#else + #define PLACEHOLDER_SAFE_RANGE SAFE_RANGE +#endif + +enum userspace_custom_keycodes { + KC_EPRM = PLACEHOLDER_SAFE_RANGE, // can always be here + KC_MWRK, + KC_WWRK, + KC_MQWR, + KC_VRSN, + LM_GRAVE, // Shift if held, layer change if tapped + JJ_COPY, + JJ_PSTE, + JJ_ARRW, + KC_CCCV, + MC_LOCK, + KC_DCLR, + KC_MAKE, + UC_FLIP, // (ಠ痊ಠ)┻━┻ + UC_TABL, // ┬─┬ノ( º _ ºノ) + UC_SHRG, // ¯\_(ツ)_/¯ + UC_DISA, // ಠ_ಠ + NEW_SAFE_RANGE //use "NEWPLACEHOLDER for keymap specific codes +}; + +bool process_record_keymap(uint16_t keycode, keyrecord_t *record); + +// One Shot +#define OS_LSFT OSM(MOD_LSFT) + +// Space Cadet Hyper/Meh and [/] +#define HYP_LBK ALL_T(KC_LBRACKET) +#define MEH_RBK MEH_T(KC_RBRACKET) + +#define GUI_CTR(os, kc) MT( (os == 0) ? (MOD_LGUI) : (MOD_LCTL), kc ) + +// Layout beauti-/simpli-fication +#define KC_LWEN LT(_LOWER, KC_ENTER) +#define KC_ADJS TT(_ADJUST) +#define KC_NUMS TT(_LOWER) +#define KC_GAME TT(_DIABLO) +#define XXXXXXX KC_NO +#define _______ KC_TRNS + +// Other Keycodes +#define KC_RST RESET +#define KC_BS KC_BSLASH diff --git a/users/bocaj/readme.md b/users/bocaj/readme.md index bab6d7337..669299cb0 100644 --- a/users/bocaj/readme.md +++ b/users/bocaj/readme.md @@ -1,14 +1,102 @@ -Copyright 2018 Jacob Jerrell jacob.jerrell@gmail.com @JacobJerrell +# Overview -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. +My personal QMK userspace. First, I must say that the credit for a majority of the code found here belongs to Drashna and/or the people he derived his code from. My Ergodox layout is briefly described in its respective folder. As for explaining this userspace, you could honestly go to Drashna's userspace and read his well put together readme. Regardless, I am mostly writing this as an excercise for myself to better understand what is going on, and where applicable, describe things that I innovated on my own. -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. +## Bocaj.c -You should have received a copy of the GNU General Public License -along with this program. If not, see . +### Unicode + +I've always had difficulty implementing unicode in QMK, all of this code is literally copy/pasted from Drashna's userspace and lies dormant here until I can take the time to figure it out. + +Update: Got it to work in Mac OS which is more important to me than Windows (probably pretty easy to figure out at this point). So I'm a happy table flipping person now! + +(ノಠ痊ಠ)ノ彡┻━┻ + +┬─┬ノ( º _ ºノ) + +### Tap Macro + +Not sure why this doesn't exist in QMK already (maybe it does?) + +```c +void tap(uint16_t keycode){ register_code(keycode); unregister_code(keycode); }; +``` + +### *_keymap functions + +We're running *_user functions in the userspace, that way we can add to or reconfigure at the keyboard level. Any *_user functions should call the equivalent *_keymap function at the end. If the *_keymap function isn't defined in the keymap, the `__attribute__ ((weak))` will prevent build problems. + +### Startup/Suspend/Shutdown Functions + +I have no idea what these do. Non-Ergodox keyboard functions? + +### Matrix Scan User + +Leader key defines, Diablo macro ancillary function, run matrix_scan_keymap. + +#### Leader Key + +I've always been interested in this feature, but I've had 0 experience with applications that have similar behavior. My implementation seeks to implement features that I feel VS2017 lacks + +## Secrets + +Hacked Drashna's secret macro implementation to work with the leader key instead. +TODO: Finish documentation + +## Bocaj.h + +Layer defines, some macro ancillary defines, setup Diablo macros and failsafe + +## Process_Records.c/.h + +Again, taking ideas from Drashna to make maintenance simpler. A couple of things that I'm proud of here, but nothing really ground breaking. + +* Features + * Change default layer + * KC_MWRK, KC_WWRK, KC_MQWR + * MacOS Lock Screen Macro + * Make macro (Credit: Drashna) + * Need to reconfigure so it runs the docker command if one of the Mac OS layers are default because the AVR install fails on the corporate laptop + * Arrow macro (->) because I find myself telling people how to get to something quite frequently and typing this manually requires moving the right hand to the top-left of the ergodox and then to the bottom right, which feels unnatural. + * LM_GRAVE + * While combining _NUMS and _LOWER, I also needed a place to put F1-12 keys. This required me to relocate the grave key. The most comfortable place to put it was over a key that I frequently use to toggle the numpad. I do have other ways to get to/from this layer but my mind has been wired to use them for different workflows, so I would sit here frozen for a moment trying to tell my fingers where to go + * How it works + * A timer starts when pressed down + * If the timer at release was less than the TAPPING_TERM define + * Get mods + * If Shift was held or one-shot shift was active + * Send `~` + * Else + * Send ` + * Else (timer at released was greater than the TAPPING_TERM define) + * Move to the default layer + * KC_CCCV + * Another neat idea I found in Drashna's userspace... highly underutilized in my layout but the inspiration for LM_GRAVE was obviously derived from this code + * Unicode stuff + * All I've ever wanted was a table-flip macro... I managed to get about half of it to work before I gave up and disabled it + +## Send_Unicode.c/.h + +I have some basic understanding of this, Drashna may already have it documented in his userspace. I'll put it in my own words when I get around to making it work and understanding it better. + +## Tap_Dances.c/h + +Again, building on Drashna's userspace organization to simplify maintenance of a heavily configured layout. This is all the stuff for the Diablo 3 macros that spam a given skill (1-4) every ~1 second + +## Wrappers.h + +Traditionally, you would put all of this into the \.h file. But I liked the idea of separating it to simplify modification in the future. + +### GUI_CTR(os, kc) + +A notable mention in this file is the GUI_CTR(os, kc) custom keycode defined in process_records.h as: + +```c +#define GUI_CTR(os, kc) MT( (os == 0) ? (MOD_LGUI) : (MOD_LCTL), kc ) +``` + +I tried several things before coming to this one-liner conclusion. I believe it is quite elegant and it definitely solves the problem I had (separate wrappers for Windows/MacOS layers). But I would love to make this into something more intuitive, like a macro that detects which layer you're on and sends the applicable hotkey when held, or keycode when tapped. Ultimately, I was too tired of thinking about it to come up with a solution like that at this time. + +Anyhow, if you set `os == 1`, it sends the Windows CTRL hotkey when held. If you set `os == 0`, it sends the Mac OS GUI hotkey when held. If tapped, it sends the keycode. + +This is effectively a slightly more advanced `MOD_T(kc)` keycode. diff --git a/users/bocaj/rules.mk b/users/bocaj/rules.mk index 17d2772a7..9ed8c250a 100644 --- a/users/bocaj/rules.mk +++ b/users/bocaj/rules.mk @@ -1,5 +1,33 @@ -SRC += bocaj.c +SRC += bocaj.c \ + process_records.c + +ifneq ("$(wildcard $(USER_PATH)/secrets.c)","") + SRC += secrets.c +endif ifeq ($(strip $(TAP_DANCE_ENABLE)), yes) SRC += tap_dances.c endif + +# Caused problems when building via docker on Mac OS +# EXTRAFLAGS += -flto + +ifeq ($(strip $(NO_SECRETS)), yes) + OPT_DEFS += -DNO_SECRETS +endif + +ifeq ($(strip $(MACROS_ENABLED)), yes) + OPT_DEFS += -DMACROS_ENABLED +endif + +ifeq ($(strip $(UCIS_ENABLE)), yes) + SRC += send_unicode.c +endif + +ifeq ($(strip $(UNICODEMAP_ENABLE)), yes) + SRC += send_unicode.c +endif + +ifeq ($(strip $(UNICODE_ENABLE)), yes) + SRC += send_unicode.c +endif diff --git a/users/bocaj/send_unicode.c b/users/bocaj/send_unicode.c new file mode 100644 index 000000000..b1290f631 --- /dev/null +++ b/users/bocaj/send_unicode.c @@ -0,0 +1,106 @@ +// Written by konstantin: vomindoraan +#include "send_unicode.h" +#include +#include + +__attribute__((weak)) +void send_unicode_hex_string(const char* str) { + if (!str) { return; } // Safety net + + while (*str) { + // Find the next code point (token) in the string + for (; *str == ' '; str++); + size_t n = strcspn(str, " "); // Length of the current token + char code_point[n+1]; + strncpy(code_point, str, n); + code_point[n] = '\0'; // Make sure it's null-terminated + + // Normalize the code point: make all hex digits lowercase + for (char *p = code_point; *p; p++) { + *p = tolower((unsigned char)*p); + } + + // Send the code point as a Unicode input string + unicode_input_start(); + send_string(code_point); + unicode_input_finish(); + + str += n; // Move to the first ' ' (or '\0') after the current token + } +} + +// (ノಠ痊ಠ)ノ彡┻━┻ +// send_unicode_hex_string("0028 30CE 0CA0 75CA 0CA0 0029 30CE 5F61 253B 2501 253B"); + +//Old code +// (╯°□°)╯ ︵ ┻━┻ + #if 0 + register_code(KC_RSFT); + tap(KC_9); + unregister_code(KC_RSFT); + process_unicode((0x256F | QK_UNICODE), record); // Arm + process_unicode((0x00B0 | QK_UNICODE), record); // Eye + process_unicode((0x25A1 | QK_UNICODE), record); // Mouth + process_unicode((0x00B0 | QK_UNICODE), record); // Eye + register_code(KC_RSFT); + tap(KC_0); + unregister_code(KC_RSFT); + process_unicode((0x256F | QK_UNICODE), record); // Arm + tap(KC_SPC); + process_unicode((0x0361 | QK_UNICODE), record); // Flippy + tap(KC_SPC); + process_unicode((0x253B | QK_UNICODE), record); // Table + process_unicode((0x2501 | QK_UNICODE), record); // Table + process_unicode((0x253B | QK_UNICODE), record); // Table + #endif + + +// If you need a good converter: https://r12a.github.io/app-conversion/ +uint8_t saved_mods; + +void unicode_input_start (void) { + // save current mods + saved_mods = get_mods(); // Save current mods + clear_mods(); // Unregister mods to start from a clean state + + switch(get_unicode_input_mode()) { + case UC_OSX: + register_code(KC_LALT); + break; + case UC_LNX: + register_code(KC_LCTL); + register_code(KC_LSFT); + register_code(KC_U); + unregister_code(KC_U); + unregister_code(KC_LSFT); + unregister_code(KC_LCTL); + break; + case UC_WIN: + register_code(KC_LALT); + register_code(KC_PPLS); + unregister_code(KC_PPLS); + break; + case UC_WINC: + register_code(KC_RALT); + unregister_code(KC_RALT); + register_code(KC_U); + unregister_code(KC_U); + break; + } + wait_ms(UNICODE_TYPE_DELAY); +} + +void unicode_input_finish (void) { + switch(get_unicode_input_mode()) { + case UC_OSX: + case UC_WIN: + unregister_code(KC_LALT); + break; + case UC_LNX: + register_code(KC_SPC); + unregister_code(KC_SPC); + break; + } + + set_mods(saved_mods); // Reregister previously set mods +} diff --git a/users/bocaj/send_unicode.h b/users/bocaj/send_unicode.h new file mode 100644 index 000000000..818b6e571 --- /dev/null +++ b/users/bocaj/send_unicode.h @@ -0,0 +1,71 @@ +#pragma once + +#include "quantum.h" + +void send_unicode_hex_string(const char* str); + +/* use X(n) to call the */ +#ifdef UNICODEMAP_ENABLE +enum unicode_name { + THINK, // thinking face 🤔 + GRIN, // grinning face 😊 + SMRK, // smirk 😏 + WEARY, // good shit 😩 + UNAMU, // unamused 😒 + + SNEK, // snke 🐍 + PENGUIN, // 🐧 + DRAGON, // 🐉 + MONKEY, // 🐒 + CHICK, // 🐥 + BOAR, // 🐗 + + OKOK, // 👌 + EFFU, // 🖕 + INUP, // 👆 + THUP, // 👍 + THDN, // 👎 + + BBB, // dat B 🅱 + POO, // poop 💩 + HUNDR, // 100 💯 + EGGPL, // EGGPLANT 🍆 + WATER, // wet 💦 + TUMBLER, // 🥃 + + LIT, // fire 🔥 + BANG, // ‽ + IRONY, // ⸮ + DEGREE // ° +}; + + +const uint32_t PROGMEM unicode_map[] = { + [THINK] = 0x1F914, + [GRIN] = 0x1F600, + [BBB] = 0x1F171, + [POO] = 0x1F4A9, + [HUNDR] = 0x1F4AF, + [SMRK] = 0x1F60F, + [WEARY] = 0x1F629, + [EGGPL] = 0x1F346, + [WATER] = 0x1F4A6, + [LIT] = 0x1F525, + [UNAMU] = 0x1F612, + [SNEK] = 0x1F40D, + [PENGUIN] = 0x1F427, + [BOAR] = 0x1F417, + [MONKEY] = 0x1F412, + [CHICK] = 0x1F425, + [DRAGON] = 0x1F409, + [OKOK] = 0x1F44C, + [EFFU] = 0x1F595, + [INUP] = 0x1F446, + [THDN] = 0x1F44E, + [THUP] = 0x1F44D, + [TUMBLER] = 0x1F943, + [BANG] = 0x0203D, + [IRONY] = 0x02E2E, + [DEGREE] = 0x000B0 + }; +#endif // UNICODEMAP_ENABLE diff --git a/users/bocaj/tap_dances.c b/users/bocaj/tap_dances.c index 10767db45..a9628a345 100644 --- a/users/bocaj/tap_dances.c +++ b/users/bocaj/tap_dances.c @@ -1,4 +1,3 @@ -#include "bocaj.h" #include "tap_dances.h" diff --git a/users/bocaj/tap_dances.h b/users/bocaj/tap_dances.h index 8935753f6..5b1277ec5 100644 --- a/users/bocaj/tap_dances.h +++ b/users/bocaj/tap_dances.h @@ -1,3 +1,6 @@ +#pragma once +#include "bocaj.h" + //define diablo macro timer variables extern uint16_t diablo_timer[4]; extern uint8_t diablo_times[]; @@ -5,3 +8,12 @@ extern uint8_t diablo_key_time[4]; void run_diablo_macro_check(void); + +#ifdef TAP_DANCE_ENABLE +enum { + TD_D3_1 = 0, + TD_D3_2, + TD_D3_3, + TD_D3_4 +}; +#endif // TAP_DANCE_ENABLE diff --git a/users/bocaj/wrappers.h b/users/bocaj/wrappers.h new file mode 100644 index 000000000..379edaad2 --- /dev/null +++ b/users/bocaj/wrappers.h @@ -0,0 +1,37 @@ +#pragma once +#include "bocaj.h" + +#if (!defined(LAYOUT) && defined(KEYMAP)) +#define LAYOUT KEYMAP +#endif + +#define LAYOUT_ergodox_wrapper(...) LAYOUT_ergodox(__VA_ARGS__) +#define LAYOUT_ergodox_pretty_wrapper(...) LAYOUT_ergodox_pretty(__VA_ARGS__) + +#define _________________QWERTY_L1__________________ KC_Q, KC_W, KC_E, KC_R, KC_T +#define _________________QWERTY_L2__________________ KC_A, KC_S, GUI_CTR(0, KC_D), KC_F, KC_G +#define _________________QWERTY_L3__________________ KC_Z, KC_X, KC_C, KC_V, KC_B + +#define _________________QWERTY_R1__________________ KC_Y, KC_U, KC_I, KC_O, KC_P +#define _________________QWERTY_R2__________________ KC_H, KC_J, GUI_CTR(0, KC_K), KC_L, KC_SCLN +#define _________________QWERTY_R3__________________ KC_N, KC_M, KC_COMM, KC_DOT, KC_SLASH + +// Hardware Driven Workman +#define _________________WORKMAN_L1_________________ KC_Q, KC_D, KC_R, KC_W, KC_B +#define _________________WORKMAN_L2_________________ KC_A, KC_S, GUI_CTR(0, KC_H), KC_T, KC_G // GUI_CTR(0, kc) behaves as GUI_T(kc) +#define ________________WWORKMAN_L2_________________ KC_A, KC_S, GUI_CTR(1, KC_H), KC_T, KC_G // GUI_CTR(1, kc) behaves as CTR_T(kc) +#define _________________WORKMAN_L3_________________ KC_Z, KC_X, KC_M, KC_C, KC_V + +#define _________________WORKMAN_R1_________________ KC_J, KC_F, KC_U, KC_P, KC_SCLN +#define _________________WORKMAN_R2_________________ KC_Y, KC_N, GUI_CTR(0, KC_E), KC_O, KC_I // GUI_CTR(0, kc) behaves as GUI_T(kc) +#define ________________WWORKMAN_R2_________________ KC_Y, KC_N, GUI_CTR(1, KC_E), KC_O, KC_I // GUI_CTR(1, kc) behaves as CTR_T(kc) +#define _________________WORKMAN_R3_________________ KC_K, KC_L, KC_COMM, KC_DOT, KC_SLASH + + +#define __________________NUMBER_LEFT_______________ KC_1, KC_2, KC_3, KC_4, KC_5 +#define __________________NUMBER_RIGHT______________ KC_6, KC_7, KC_8, KC_9, KC_0 + +#define __________________FUNCTION_LEFT_____________ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5 +#define __________________FUNCTION_RIGHT____________ KC_F6, KC_F7, KC_F8, KC_F9, KC_F10 + +#define ____________________BLANK___________________ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS From 484c85bd0dd1141bfc12ecada44da92a8f2e78f6 Mon Sep 17 00:00:00 2001 From: ishtob Date: Wed, 2 Jan 2019 16:30:59 -0500 Subject: [PATCH 781/788] Adding default settings for ERM motors for Hadron v3 haptic feedback (#4761) * adding default settings to support 3v ERM vibration motors * set default settings of haptic motor for LV061228B-L64-A 2v LRA * update ishtob keymap and fix config settings --- keyboards/hadron/ver3/config.h | 30 ++++++++++++------- keyboards/hadron/ver3/keymaps/ishtob/keymap.c | 2 +- keyboards/hadron/ver3/mcuconf.h | 2 +- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/keyboards/hadron/ver3/config.h b/keyboards/hadron/ver3/config.h index 11288f7a5..7db500304 100644 --- a/keyboards/hadron/ver3/config.h +++ b/keyboards/hadron/ver3/config.h @@ -148,13 +148,26 @@ #define FB_BRAKEFACTOR 6 /* For 1x:0, 2x:1, 3x:2, 4x:3, 6x:4, 8x:5, 16x:6, Disable Braking:7 */ #define FB_LOOPGAIN 1 /* For Low:0, Medium:1, High:2, Very High:3 */ +/* default 3V ERM vibration motor voltage and library*/ +#if FB_ERM_LRA == 0 +#define RATED_VOLTAGE 3 +#define V_RMS 2.3 +#define V_PEAK 3.30 +/* Library Selection */ +#define LIB_SELECTION 4 /* For Empty:0' TS2200 library A to D:1-5, LRA Library: 6 */ + +/* default 2V LRA voltage and library */ +#elif FB_ERM_LRA == 1 #define RATED_VOLTAGE 2 #define V_RMS 2.0 #define V_PEAK 2.85 -#define F_LRA 205 +#define F_LRA 200 /* Library Selection */ #define LIB_SELECTION 6 /* For Empty:0' TS2200 library A to D:1-5, LRA Library: 6 */ +#endif + + /* Control 1 register settings */ #define DRIVE_TIME 25 #define AC_COUPLE 0 @@ -179,14 +192,11 @@ #define ZC_DET_TIME 0 #define AUTO_CAL_TIME 3 -//#define WS2812_LED_N 2 -//#define RGBLED_NUM WS2812_LED_N -//#define WS2812_TIM_N 2 -//#define WS2812_TIM_CH 2 -//#define PORT_WS2812 GPIOA -//#define PIN_WS2812 15 -//#define WS2812_DMA_STREAM STM32_DMA1_STREAM2 // DMA stream for TIMx_UP (look up in reference manual under DMA Channel selection) -//#define WS2812_DMA_CHANNEL 7 // DMA channel for TIMx_UP -//#define WS2812_EXTERNAL_PULLUP +//#define RGBLIGHT_ANIMATIONS +//#define RGBLED_NUM 10 +//#define RGB_DI_PIN B5 +//#define DRIVER_LED_TOTAL RGBLED_NUM + +//#define RGB_MATRIX_KEYPRESSES #endif diff --git a/keyboards/hadron/ver3/keymaps/ishtob/keymap.c b/keyboards/hadron/ver3/keymaps/ishtob/keymap.c index 530508b01..641c01624 100644 --- a/keyboards/hadron/ver3/keymaps/ishtob/keymap.c +++ b/keyboards/hadron/ver3/keymaps/ishtob/keymap.c @@ -82,7 +82,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_LOWER] = LAYOUT_wrapper( KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, _______, _______, _______, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \ - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, _______, _______, KC_F6, KC_UNDS, KC_PLUS, KC_LBRC, KC_RBRC, KC_PIPE, \ + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, _______, _______, KC_F6, KC_UNDS, KC_EQL, KC_LBRC, KC_RBRC, KC_PIPE, \ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, _______, _______, _______, KC_F12,S(KC_NUHS),S(KC_NUBS),_______,_______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ ), diff --git a/keyboards/hadron/ver3/mcuconf.h b/keyboards/hadron/ver3/mcuconf.h index 36f8ca225..d0776b046 100644 --- a/keyboards/hadron/ver3/mcuconf.h +++ b/keyboards/hadron/ver3/mcuconf.h @@ -159,7 +159,7 @@ #define STM32_I2C_BUSY_TIMEOUT 50 #define STM32_I2C_I2C1_IRQ_PRIORITY 10 #define STM32_I2C_I2C2_IRQ_PRIORITY 10 -#define STM32_I2C_USE_DMA TRUE +#define STM32_I2C_USE_DMA FALSE #define STM32_I2C_I2C1_DMA_PRIORITY 1 #define STM32_I2C_I2C2_DMA_PRIORITY 1 #define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") From 526bc4c7cc6b4a7701d317bb66b8bb5fa6c9c87f Mon Sep 17 00:00:00 2001 From: flehrad <20124416+flehrad@users.noreply.github.com> Date: Fri, 4 Jan 2019 03:05:33 +1100 Subject: [PATCH 782/788] Keyboard: add snagpad and trainstation keyboards (#4755) * add snagpad * Update keyboards/snagpad/kb.c Co-Authored-By: flehrad <20124416+flehrad@users.noreply.github.com> * Rename kb.c to snagpad.c * Update and rename kb.h to snagpad.h * Update snagpad.h * Update keymap.c * Update config.h * Update config.h * Update rules.mk * Update README.md * Add files via upload * Update info.json * Update keymap.c * Update snagpad.h * Delete snagpad_numpad.json * Delete snagpad_ortho.json * Update README.md * Update keyboards/snagpad/info.json Co-Authored-By: flehrad <20124416+flehrad@users.noreply.github.com> * Update keyboards/snagpad/keymaps/default/keymap.c Co-Authored-By: flehrad <20124416+flehrad@users.noreply.github.com> * Update keyboards/snagpad/keymaps/default/keymap.c Co-Authored-By: flehrad <20124416+flehrad@users.noreply.github.com> * Update keyboards/snagpad/keymaps/default/keymap.c Co-Authored-By: flehrad <20124416+flehrad@users.noreply.github.com> * Update keyboards/snagpad/snagpad.h Co-Authored-By: flehrad <20124416+flehrad@users.noreply.github.com> * Update keyboards/snagpad/keymaps/default/keymap.c Co-Authored-By: flehrad <20124416+flehrad@users.noreply.github.com> * Update keyboards/snagpad/snagpad.h Co-Authored-By: flehrad <20124416+flehrad@users.noreply.github.com> * Update keyboards/snagpad/snagpad.h Co-Authored-By: flehrad <20124416+flehrad@users.noreply.github.com> * Update keyboards/snagpad/snagpad.h Co-Authored-By: flehrad <20124416+flehrad@users.noreply.github.com> * Update keyboards/snagpad/keymaps/default/keymap.c Co-Authored-By: flehrad <20124416+flehrad@users.noreply.github.com> * Update keyboards/snagpad/keymaps/default/keymap.c Co-Authored-By: flehrad <20124416+flehrad@users.noreply.github.com> * Update keyboards/snagpad/keymaps/default/keymap.c Co-Authored-By: flehrad <20124416+flehrad@users.noreply.github.com> * Update keyboards/snagpad/rules.mk Co-Authored-By: flehrad <20124416+flehrad@users.noreply.github.com> * add tradestation * --all * Did something weird messing with git -_- hopefully fixed * Update keyboards/tradestation/keymaps/default/keymap.c Co-Authored-By: flehrad <20124416+flehrad@users.noreply.github.com> * Update keyboards/tradestation/config.h Co-Authored-By: flehrad <20124416+flehrad@users.noreply.github.com> * Update keyboards/tradestation/config.h Co-Authored-By: flehrad <20124416+flehrad@users.noreply.github.com> * Update keyboards/tradestation/rules.mk Co-Authored-By: flehrad <20124416+flehrad@users.noreply.github.com> * Update snagpad.h * Update rules.mk * Update keymap.c * fixed merge conflict, updated to LAYOUT_numpad_5x4 * relocated to handwire, updated naming, added layouts to rules.mk * Update keyboards/handwired/tradestation/rules.mk Co-Authored-By: flehrad <20124416+flehrad@users.noreply.github.com> * Update keyboards/snagpad/snagpad.h Co-Authored-By: flehrad <20124416+flehrad@users.noreply.github.com> * Update keyboards/snagpad/snagpad.h Co-Authored-By: flehrad <20124416+flehrad@users.noreply.github.com> * Update keyboards/snagpad/snagpad.h Co-Authored-By: flehrad <20124416+flehrad@users.noreply.github.com> * Update keyboards/snagpad/snagpad.h Co-Authored-By: flehrad <20124416+flehrad@users.noreply.github.com> * Rename LICENSE to license * Rename README.md to readme.md * Rename LICENSE to license * Rename README.md to readme.md * Update info.json * Update keymap.c * Update info.json --- keyboards/handwired/tradestation/config.h | 52 +++++ keyboards/handwired/tradestation/info.json | 15 ++ .../tradestation/keymaps/default/keymap.c | 61 ++++++ keyboards/handwired/tradestation/license | 201 ++++++++++++++++++ keyboards/handwired/tradestation/readme.md | 25 +++ keyboards/handwired/tradestation/rules.mk | 65 ++++++ .../handwired/tradestation/tradestation.c | 1 + .../handwired/tradestation/tradestation.h | 27 +++ keyboards/snagpad/config.h | 56 +++++ keyboards/snagpad/info.json | 17 ++ keyboards/snagpad/keymaps/default/keymap.c | 63 ++++++ keyboards/snagpad/license | 201 ++++++++++++++++++ keyboards/snagpad/readme.md | 21 ++ keyboards/snagpad/rules.mk | 65 ++++++ keyboards/snagpad/snagpad.c | 1 + keyboards/snagpad/snagpad.h | 30 +++ 16 files changed, 901 insertions(+) create mode 100644 keyboards/handwired/tradestation/config.h create mode 100644 keyboards/handwired/tradestation/info.json create mode 100644 keyboards/handwired/tradestation/keymaps/default/keymap.c create mode 100644 keyboards/handwired/tradestation/license create mode 100644 keyboards/handwired/tradestation/readme.md create mode 100644 keyboards/handwired/tradestation/rules.mk create mode 100644 keyboards/handwired/tradestation/tradestation.c create mode 100644 keyboards/handwired/tradestation/tradestation.h create mode 100644 keyboards/snagpad/config.h create mode 100644 keyboards/snagpad/info.json create mode 100644 keyboards/snagpad/keymaps/default/keymap.c create mode 100644 keyboards/snagpad/license create mode 100644 keyboards/snagpad/readme.md create mode 100644 keyboards/snagpad/rules.mk create mode 100644 keyboards/snagpad/snagpad.c create mode 100644 keyboards/snagpad/snagpad.h diff --git a/keyboards/handwired/tradestation/config.h b/keyboards/handwired/tradestation/config.h new file mode 100644 index 000000000..346577a92 --- /dev/null +++ b/keyboards/handwired/tradestation/config.h @@ -0,0 +1,52 @@ +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Flehrad +#define PRODUCT Trade Station + #define DESCRIPTION A Pro Micro-powered macropad layout by Didier Luximon. 1/8U gap space top two rows and 1/4U gap between 2U bottom two rows. + +/* key matrix size */ +#define MATRIX_ROWS 4 +#define MATRIX_COLS 4 + +/* key matrix pins */ +#define MATRIX_ROW_PINS { D1, C6, D4, D0 } +#define MATRIX_COL_PINS { F7, B1, D7, E6 } +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* number of backlight levels */ + +#ifdef BACKLIGHT_PIN +#define BACKLIGHT_LEVELS 3 +#endif + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCING_DELAY 5 + +/* 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 + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + + +#ifdef RGB_DI_PIN +#define RGBLIGHT_ANIMATIONS + #define RGBLED_NUM 5 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 +#endif diff --git a/keyboards/handwired/tradestation/info.json b/keyboards/handwired/tradestation/info.json new file mode 100644 index 000000000..f26d4ec37 --- /dev/null +++ b/keyboards/handwired/tradestation/info.json @@ -0,0 +1,15 @@ +{ + "keyboard_name": "Tradestation", + "url": "", + "maintainer": "Flehrad", + "bootloader": "", + "width": 4.3, + "height": 4.5, + "layouts": { + "LAYOUT_tradestation": { + "layout": [{"x":0, "y":0}, {"x":1.1, "y":0}, {"x":2.2, "y":0}, {"x":3.3, "y":0}, {"x":0, "y":1.1}, {"x":1.1, "y":1.1}, {"x":2.2, "y":1.1}, {"x":3.3, "y":1.1}, {"x":0, "y":2.25, "w":2}, {"x":2.25, "y":2.25, "w":2}, {"x":0, "y":3.5, "w":2}, {"x":2.25, "y":3.5, "w":2}] + }, + "LAYOUT_ortho_4x4": { + "layout": [{"x":0, "y":0}, {"x":1.1, "y":0}, {"x":2.2, "y":0}, {"x":3.3, "y":0}, {"x":0, "y":1.1}, {"x":1.1, "y":1.1}, {"x":2.2, "y":1.1}, {"x":3.3, "y":1.1}, {"x":0, "y":2.25}, {"x":1, "y":2.25}, {"x":2.25, "y":2.25}, {"x":3.25, "y":2.25}, {"x":0, "y":3.5}, {"x":1, "y":3.5}, {"x":2.25, "y":3.5}, {"x":3.25, "y":3.5}] + } +} diff --git a/keyboards/handwired/tradestation/keymaps/default/keymap.c b/keyboards/handwired/tradestation/keymaps/default/keymap.c new file mode 100644 index 000000000..3497dcb94 --- /dev/null +++ b/keyboards/handwired/tradestation/keymaps/default/keymap.c @@ -0,0 +1,61 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + LAYOUT_ortho_4x4( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + LAYOUT_tradestation( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS), +}; + + +void matrix_init_user(void) { +} + +void matrix_scan_user(void) { +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void led_set_user(uint8_t usb_led) { + + if (usb_led & (1 << USB_LED_NUM_LOCK)) { + + } else { + + } + + if (usb_led & (1 << USB_LED_CAPS_LOCK)) { + + } else { + + } + + if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { + + } else { + + } + + if (usb_led & (1 << USB_LED_COMPOSE)) { + + } else { + + } + + if (usb_led & (1 << USB_LED_KANA)) { + + } else { + + } + +} diff --git a/keyboards/handwired/tradestation/license b/keyboards/handwired/tradestation/license new file mode 100644 index 000000000..261eeb9e9 --- /dev/null +++ b/keyboards/handwired/tradestation/license @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/keyboards/handwired/tradestation/readme.md b/keyboards/handwired/tradestation/readme.md new file mode 100644 index 000000000..69c0331a9 --- /dev/null +++ b/keyboards/handwired/tradestation/readme.md @@ -0,0 +1,25 @@ +# Tradestation +QMK for Tradestation Macropad + +This macropad was layout designed by Didier Luximon + +This PCB supports an overall 4x4 matrix with unique spacing. +* Top two rows are 1U keys with 1/8U spacing +* Bottom two rows are available with 4x2 1U as clusters of 2x1U or as 2x2 2U, spaced with 1/4U + +For QMK Configurator, the info.json is utilised. +- For 2U keys , the first 1u row/column key assignment is the same as the 2u position. + +Build requires a pro micro. + +Can be built as single PCB with custom case, or as two PCB style with standoffs. + +If you like this simple PCB and want to make a donation, you can at https://paypal.me/theboardpodcast + +Check out our: + +YouTube (https://www.youtube.com/channel/UCg98oJZNffR9nDLJNkorjqw) + +Podcast (www.libsyn.com/theboardpodcast) + +Patreon (www.patreon.com/theboardpodcast) diff --git a/keyboards/handwired/tradestation/rules.mk b/keyboards/handwired/tradestation/rules.mk new file mode 100644 index 000000000..9d49888b5 --- /dev/null +++ b/keyboards/handwired/tradestation/rules.mk @@ -0,0 +1,65 @@ +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = caterina + +# Boot Section Size in *bytes* +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# comment out to disable the options. +# +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +AUDIO_ENABLE = no +RGBLIGHT_ENABLE = no + LAYOUTS = ortho_4x4 diff --git a/keyboards/handwired/tradestation/tradestation.c b/keyboards/handwired/tradestation/tradestation.c new file mode 100644 index 000000000..a3285a2cc --- /dev/null +++ b/keyboards/handwired/tradestation/tradestation.c @@ -0,0 +1 @@ +#include "tradestation.h" diff --git a/keyboards/handwired/tradestation/tradestation.h b/keyboards/handwired/tradestation/tradestation.h new file mode 100644 index 000000000..15e40e3b5 --- /dev/null +++ b/keyboards/handwired/tradestation/tradestation.h @@ -0,0 +1,27 @@ +#pragma once + +#include "quantum.h" + +#define LAYOUT_ortho_4x4( \ + K00, K01, K02, K03, \ + K10, K11, K12, K13, \ + K20, K21, K22, K23, \ + K30, K31, K32, K33 \ +) { \ + { K00, K01, K02, K03 }, \ + { K10, K11, K12, K13 }, \ + { K20, K21, K22, K23 }, \ + { K30, K31, K32, K33 } \ +} + +#define LAYOUT_tradestation( \ + K00, K01, K02, K03, \ + K10, K11, K12, K13, \ + K20, K22, \ + K30, K32 \ +) { \ + { K00, K01, K02, K03 }, \ + { K10, K11, K12, K13 }, \ + { K20, KC_NO, K22, KC_NO }, \ + { K30, KC_NO, K32, KC_NO } \ +} diff --git a/keyboards/snagpad/config.h b/keyboards/snagpad/config.h new file mode 100644 index 000000000..a14ead67f --- /dev/null +++ b/keyboards/snagpad/config.h @@ -0,0 +1,56 @@ +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Flehrad +#define PRODUCT Snagpad +#define DESCRIPTION A Pro Micro-Powered 5x4 macropad/numpad + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 4 + +/* key matrix pins */ +#define MATRIX_ROW_PINS { D1, D0, D4, C6, D7 } +#define MATRIX_COL_PINS { F4, F5, F6, F7 } +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* number of backlight levels */ + +#ifdef BACKLIGHT_PIN +#define BACKLIGHT_LEVELS 3 +#endif + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCING_DELAY 5 + +/* 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 + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* prevent stuck modifiers */ +//#define STRICT_LAYER_RELEASE + + +#ifdef RGB_DI_PIN +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 0 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 +#endif + diff --git a/keyboards/snagpad/info.json b/keyboards/snagpad/info.json new file mode 100644 index 000000000..4faa1d2c0 --- /dev/null +++ b/keyboards/snagpad/info.json @@ -0,0 +1,17 @@ +{ + "keyboard_name": "Snagpad", + "url": "", + "maintainer": "Flehrad", + + "width": 4, + "height": 5, + "layouts": { + "LAYOUT_ortho_5x4": { + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":0, "y":4}, {"x":1, "y":4}, {"x":2, "y":4}, {"x":3, "y":4}] + }, + "LAYOUT_numpad_5x4": { + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1, "h":2}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3, "h":2}, {"x":0, "y":4, "w":2}, {"x":2, "y":4}] + + } + } +} diff --git a/keyboards/snagpad/keymaps/default/keymap.c b/keyboards/snagpad/keymaps/default/keymap.c new file mode 100644 index 000000000..7645b435c --- /dev/null +++ b/keyboards/snagpad/keymaps/default/keymap.c @@ -0,0 +1,63 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + LAYOUT_ortho_5x4( + KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, + KC_P7, KC_P8, KC_P9, KC_PPLS, + KC_P4, KC_P5, KC_P6, KC_PPLS, + KC_P1, KC_P2, KC_P3, KC_PENT, + KC_P0, KC_P0, KC_PDOT, KC_PENT), + + LAYOUT_numpad_5x4( + KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, + KC_P7, KC_P8, KC_P9, + KC_P4, KC_P5, KC_P6, KC_PPLS, + KC_P1, KC_P2, KC_P3, + KC_P0, KC_PDOT, KC_PENT), +}; + + +void matrix_init_user(void) { +} + +void matrix_scan_user(void) { +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void led_set_user(uint8_t usb_led) { + + if (usb_led & (1 << USB_LED_NUM_LOCK)) { + + } else { + + } + + if (usb_led & (1 << USB_LED_CAPS_LOCK)) { + + } else { + + } + + if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { + + } else { + + } + + if (usb_led & (1 << USB_LED_COMPOSE)) { + + } else { + + } + + if (usb_led & (1 << USB_LED_KANA)) { + + } else { + + } + +} diff --git a/keyboards/snagpad/license b/keyboards/snagpad/license new file mode 100644 index 000000000..261eeb9e9 --- /dev/null +++ b/keyboards/snagpad/license @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/keyboards/snagpad/readme.md b/keyboards/snagpad/readme.md new file mode 100644 index 000000000..eeafceba9 --- /dev/null +++ b/keyboards/snagpad/readme.md @@ -0,0 +1,21 @@ +# Snagpad +QMK for Snagpad + +This PCB can be used as a standard numpad, or a ortho 5x4 macropad. + +For QMK Configurator, the info.json is utilised. +- For 2U keys on numpad, the first 1u row/column key assignment is the same as the 2u position. + +Build requires a pro micro. + +Can be built as single PCB with custom case, or as two PCB style with standoffs. + +If you like this simple PCB and want to make a donation, you can at https://paypal.me/theboardpodcast + +Check out our: + +YouTube (https://www.youtube.com/channel/UCg98oJZNffR9nDLJNkorjqw) + +Podcast (www.libsyn.com/theboardpodcast) + +Patreon (www.patreon.com/theboardpodcast) diff --git a/keyboards/snagpad/rules.mk b/keyboards/snagpad/rules.mk new file mode 100644 index 000000000..624ed262e --- /dev/null +++ b/keyboards/snagpad/rules.mk @@ -0,0 +1,65 @@ +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = caterina + +# Boot Section Size in *bytes* +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# comment out to disable the options. +# +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +AUDIO_ENABLE = no +RGBLIGHT_ENABLE = no +LAYOUTS = ortho_5x4 numpad_5x4 diff --git a/keyboards/snagpad/snagpad.c b/keyboards/snagpad/snagpad.c new file mode 100644 index 000000000..ce7e50b38 --- /dev/null +++ b/keyboards/snagpad/snagpad.c @@ -0,0 +1 @@ +#include "snagpad.h" diff --git a/keyboards/snagpad/snagpad.h b/keyboards/snagpad/snagpad.h new file mode 100644 index 000000000..d6a62ddf7 --- /dev/null +++ b/keyboards/snagpad/snagpad.h @@ -0,0 +1,30 @@ +#pragma once + +#include "quantum.h" + +#define LAYOUT_ortho_5x4( \ + K00, K01, K02, K03, \ + K10, K11, K12, K13, \ + K20, K21, K22, K23, \ + K30, K31, K32, K33, \ + K40, K41, K42, K43 \ +) { \ + { K00, K01, K02, K03 }, \ + { K10, K11, K12, K13 }, \ + { K20, K21, K22, K23 }, \ + { K30, K31, K32, K33 }, \ + { K40, K41, K42, K43 } \ +} +#define LAYOUT_numpad_5x4( \ + K00, K01, K02, K03, \ + K10, K11, K12, \ + K20, K21, K22, K13, \ + K30, K31, K32, \ + K40, K42, K33 \ +) { \ + { K00, K01, K02, K03 }, \ + { K10, K11, K12, K13 }, \ + { K20, K21, K22, KC_NO }, \ + { K30, K31, K32, K33 }, \ + { K40, KC_NO, K42, KC_NO } \ +} From 6cb2d7ba6dc19fe579fac856fbce36be0f8384f6 Mon Sep 17 00:00:00 2001 From: Gam3cat <31171909+Gam3cat@users.noreply.github.com> Date: Thu, 3 Jan 2019 08:12:58 -0800 Subject: [PATCH 783/788] Keymap updates (#4706) * adding my keymap * update keymap * adding gamecat keymap for jc65 keyboard * updating jc65-gamecat keymap * updating jc65-gamecat keymap * updating jc65-gamecat keymap * updating jc65-gamecat keymap * M10a keymap and M65a updates * keymap updates * keymap updates * M10a/M65a keymap updates * M10a/M65a keymap updates * Delete test.txt * M65 keymap update * M65 keymap update * M65 keymap update * M65/M10 keymap updates * M65 keymap update * M65 keymap update * M65 keymap update * M65 keymap update * M65 keymap update * M65/M10 keymap update * M65 keymap update * M65 keymap update * M65 keymap update * M65 keymap update * M65 keymap update * Set theme jekyll-theme-cayman * Set theme jekyll-theme-slate * M65 keymap update * M10a/M65a keymap updates * M10a keymap update * M65a keymap update * M65a keymap update * M65a keymap update * M65a readme update * M65a/M10a updates * M65a readme updates * M65a/M10a updates * M65A update * M65A update * M65A update * M65A update * M65A/M10A keymap update * M10A keymap update * Set theme jekyll-theme-tactile * M10A keymap update * M65A keymap.c update * M65 keymap added LED backlight toggle, inc/dec to adjust layer. * M65 keymap/readme updates. * M65 keymap fix * M65 keymap update * remove theme * fix comments/readme * update keymap * LED backlight update, guess based on reading atmega32u4 documentation for DDRB/PORTB regs, believe DDRB should only be written to once not every time CAPS is hit, but really not too sure. * LED backlight update, guess based on reading atmega32u4 documentation for DDRB/PORTB regs, believe DDRB should only be written to once not every time CAPS is hit, but really not too sure. * M65 keymap update * Updated M65, M10, and gonNerd keymaps. * update * del * keymap updates M65, M10, gonnerd * update keymaps * adding back readme that somehow got removed. * updated keymap * update keymap * add back readme * Added h87a keymap, updated m10a/jc65/gonnerd * Update h87a keymap * Updates after feedback * Updates after feedback * Updates after feedback * Updates after feedback --- keyboards/gonnerd/keymaps/gam3cat/config.h | 8 +- keyboards/gonnerd/keymaps/gam3cat/keymap.c | 381 +++++++++--------- keyboards/gonnerd/keymaps/gam3cat/readme.md | 106 +++-- keyboards/gonnerd/keymaps/gam3cat/rules.mk | 33 +- keyboards/h87a/keymaps/gam3cat/config.h | 10 + keyboards/h87a/keymaps/gam3cat/keymap.c | 292 ++++++++++++++ keyboards/h87a/keymaps/gam3cat/readme.md | 114 ++++++ keyboards/h87a/keymaps/gam3cat/rules.mk | 24 ++ keyboards/jc65/v32u4/keymaps/gam3cat/config.h | 6 +- keyboards/jc65/v32u4/keymaps/gam3cat/keymap.c | 265 ++++++------ .../jc65/v32u4/keymaps/gam3cat/readme.md | 54 ++- keyboards/jc65/v32u4/keymaps/gam3cat/rules.mk | 30 +- keyboards/m10a/keymaps/gam3cat/keymap.c | 229 ++++++----- keyboards/m10a/keymaps/gam3cat/readme.md | 10 +- keyboards/m10a/keymaps/gam3cat/rules.mk | 27 +- 15 files changed, 1017 insertions(+), 572 deletions(-) create mode 100644 keyboards/h87a/keymaps/gam3cat/config.h create mode 100644 keyboards/h87a/keymaps/gam3cat/keymap.c create mode 100644 keyboards/h87a/keymaps/gam3cat/readme.md create mode 100644 keyboards/h87a/keymaps/gam3cat/rules.mk diff --git a/keyboards/gonnerd/keymaps/gam3cat/config.h b/keyboards/gonnerd/keymaps/gam3cat/config.h index d86da86e4..334beb0ac 100644 --- a/keyboards/gonnerd/keymaps/gam3cat/config.h +++ b/keyboards/gonnerd/keymaps/gam3cat/config.h @@ -1,6 +1,10 @@ -#include "../../config.h" +#pragma once + +//Force NKRO to be enabled. +#define FORCE_NKRO + //GRAVE_ESC override for CTRL+SHIFT+ESC Windows task manager shortcut. -#define GRAVE_ESC_CTRL_OVERRIDE +//#define GRAVE_ESC_CTRL_OVERRIDE //Delay matrix scan for tap dance, reduce to activate modifier keys faster. //#define TAPPING_TERM 200 diff --git a/keyboards/gonnerd/keymaps/gam3cat/keymap.c b/keyboards/gonnerd/keymaps/gam3cat/keymap.c index 3e43d67d5..f01dd920e 100644 --- a/keyboards/gonnerd/keymaps/gam3cat/keymap.c +++ b/keyboards/gonnerd/keymaps/gam3cat/keymap.c @@ -11,13 +11,16 @@ enum layers { _AL, // Adjust Layer }; -enum gonnerd_keycodes { +enum custom_keycodes { DYNAMIC_MACRO_RANGE = SAFE_RANGE, + QMK_REV, + KC_WEB, + KC_SP4 }; +extern backlight_config_t backlight_config; + #include "dynamic_macro.h" -#define _______ KC_TRNS -#define XXXXXXX KC_NO #define FN_CAPS LT(_FL, KC_CAPS) #define KC_DMR1 DYN_REC_START1 #define KC_DMR2 DYN_REC_START2 @@ -25,47 +28,44 @@ enum gonnerd_keycodes { #define KC_DMP2 DYN_MACRO_PLAY2 #define KC_DMRS DYN_REC_STOP -static uint8_t current_layer; - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* _BL: Base Layer, mostly standard TKL QWERTY layout. - * .-----------------------------------------------------------------------. - * |Esc||||| F1| F2| F3| F4||| F5| F6| F7| F8||| F9|F10|F11|F12|PSc|SLk|Pau| - * |-----------------------------------------------------------|-----------| - * | ~| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp |Ins|Hom|PgU| - * |-----------------------------------------------------------|-----------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \|Del|End|PgD| - * |-----------------------------------------------------------|-----------| - * |FnCaps| A| S| D| F| G| H| J| K| L| ;| '|Return | | - * |-----------------------------------------------------------|-----------| - * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | | Up| | - * |-----------------------------------------------------------|-----------| - * |Ctrl |||||Win | Space |RAlt |||||Ctrl |Lft|Dwn|Rgt| - * *-----------------------------------------------------------------------* + /*#### _BL: Base Layer - Standard TKL QWERTY layout. + * .-----------------------------------------------------------------------. + * |Esc|||||F1 |F2 |F3 |F4 |||F5 |F6 |F7 |F8 |||F9 |F10|F11|F12|PSc|SLk|Pau| + * |-----------------------------------------------------------|-----------| + * |~ |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 |- |= |Backsp |Ins|Hom|PgU| + * |-----------------------------------------------------------|-----------| + * |Tab |Q |W |E |R |T |Y |U |I |O |P |[ |] |\ |Del|End|PgD| + * |-----------------------------------------------------------|-----------| + * |Caps |A |S |D |F |G |H |J |K |L |; |' |Return | | + * |-----------------------------------------------------------|-----------| + * |Shift |Z |X |C |V |B |N |M |, |. |/ |Shift |Fn | | Up| | + * |-----------------------------------------------------------|-----------| + * |Ctrl |Win|Alt | Space |RAlt |Fn |Ctrl |Lft|Dwn|Rgt| + * *-----------------------------------------------------------------------* */ [_BL] = LAYOUT_tkl( \ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, \ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, \ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, \ - FN_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, XXXXXXX, KC_ENT, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, XXXXXXX, KC_ENT, \ KC_LSFT, XXXXXXX, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(_FL), KC_UP, \ - KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT, MO(_FL), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RGUI, KC_RALT, MO(_FL), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT \ ), - - /* _WL: Workman Layer. - * .-----------------------------------------------------------------------. - * | ||||| | | | ||| | | | ||| | | | | | | | - * .-----------------------------------------------------------|-----------| - * | | | | | | | | | | | | -| =| | | | | - * |-----------------------------------------------------------|-----------| - * | | Q| D| R| W| B| J| F| U| P| ;| [| ]| \| | | | - * |-----------------------------------------------------------|-----------| - * | | A| S| H| T| G| Y| N| E| O| I| '| | | - * |-----------------------------------------------------------|-----------| - * | | Z| X| M| C| V| K| L| ,| .| /| | | | | | - * |-----------------------------------------------------------|-----------| - * | ||||| | | ||||| | | | | - * *-----------------------------------------------------------------------* + /*#### _WL: Workman Layer. + * .-----------------------------------------------------------------------. + * | ||||| | | | ||| | | | ||| | | | | | | | + * .-----------------------------------------------------------|-----------| + * | | | | | | | | | | | |- |= | | | | | + * |-----------------------------------------------------------|-----------| + * | |Q |D |R |W |B |J |F |U |P |; |[ |] |\ | | | | + * |-----------------------------------------------------------|-----------| + * | |A |S |H |T |G |Y |N |E |O |I |' | | | + * |-----------------------------------------------------------|-----------| + * | |Z |X |M |C |V |K |L |, |. |/ | | | | | | + * |-----------------------------------------------------------|-----------| + * | | | | | | | | | | | + * *-----------------------------------------------------------------------* */ [_WL] = LAYOUT_tkl( \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ @@ -75,21 +75,20 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, KC_Z , KC_X , KC_M , KC_C , KC_V , KC_K , KC_L , KC_COMM, KC_DOT , KC_SLSH, _______, _______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ ), - - /* _NL: Norman Layer. - * .-----------------------------------------------------------------------. - * | ||||| | | | ||| | | | ||| | | | | | | | - * .-----------------------------------------------------------|-----------| - * | | | | | | | | | | | | -| =| | | | | - * |-----------------------------------------------------------|-----------| - * | | Q| W| D| F| K| J| U| R| L| ;| [| ]| \| | | | - * |-----------------------------------------------------------|-----------| - * | | A| S| E| T| G| Y| N| I| O| H| '| | | - * |-----------------------------------------------------------|-----------| - * | | Z| X| C| V| B| P| M| ,| .| /| | | | | | - * |-----------------------------------------------------------|-----------| - * | ||||| | | ||||| | | | | - * *-----------------------------------------------------------------------* + /*#### _NL: Norman Layer. + * .-----------------------------------------------------------------------. + * | ||||| | | | ||| | | | ||| | | | | | | | + * .-----------------------------------------------------------|-----------| + * | | | | | | | | | | | |- |= | | | | | + * |-----------------------------------------------------------|-----------| + * | |Q |W |D |F |K |J |U |R |L |; |[ |] |\ | | | | + * |-----------------------------------------------------------|-----------| + * | |A |S |E |T |G |Y |N |I |O |H |' | | | + * |-----------------------------------------------------------|-----------| + * | |Z |X |C |V |B |P |M |, |. |/ | | | | | | + * |-----------------------------------------------------------|-----------| + * | | | | | | | | | | | + * *-----------------------------------------------------------------------* */ [_NL] = LAYOUT_tkl( \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ @@ -99,21 +98,20 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_P , KC_M , KC_COMM, KC_DOT , KC_SLSH, _______, _______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ ), - - /* _DL: Dvorak Layer. - * .-----------------------------------------------------------------------. - * | ||||| | | | ||| | | | ||| | | | | | | | - * .-----------------------------------------------------------|-----------| - * | | | | | | | | | | | | [| ]| | | | | - * |-----------------------------------------------------------|-----------| - * | | '| ,| .| P| Y| F| G| C| R| L| /| =| \| | | | - * |-----------------------------------------------------------|-----------| - * | | A| O| E| U| I| D| H| T| N| S| -| | | - * |-----------------------------------------------------------|-----------| - * | | ;| Q| J| K| X| B| M| W| V| Z| | | | | | - * |-----------------------------------------------------------|-----------| - * | ||||| | | ||||| | | | | - * *-----------------------------------------------------------------------* + /*#### _DL: Dvorak Layer. + * .-----------------------------------------------------------------------. + * | ||||| | | | ||| | | | ||| | | | | | | | + * .-----------------------------------------------------------|-----------| + * | | | | | | | | | | | |[ |] | | | | | + * |-----------------------------------------------------------|-----------| + * | |' |, |. |P |Y |F |G |C |R |L |/ |= |\ | | | | + * |-----------------------------------------------------------|-----------| + * | |A |O |E |U |I |D |H |T |N |S |- | | | + * |-----------------------------------------------------------|-----------| + * | |; |Q |J |K |X |B |M |W |V |Z | | | | | | + * |-----------------------------------------------------------|-----------| + * | | | | | | | | | | | + * *-----------------------------------------------------------------------* */ [_DL] = LAYOUT_tkl( \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ @@ -123,21 +121,20 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, KC_SCLN, KC_Q , KC_J , KC_K , KC_X , KC_B , KC_M , KC_W , KC_V , KC_Z , _______, _______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ ), - - /* _CL: Colmak Layer. - * .-----------------------------------------------------------------------. - * | ||||| | | | ||| | | | ||| | | | | | | | - * .-----------------------------------------------------------|-----------| - * | | | | | | | | | | | | -| =| | | | | - * |-----------------------------------------------------------|-----------| - * | | Q| W| F| P| G| J| L| U| Y| ;| [| ]| \| | | | - * |-----------------------------------------------------------|-----------| - * | | A| R| S| T| D| H| N| E| I| O| '| | | - * |-----------------------------------------------------------|-----------| - * | | Z| X| C| V| B| K| M| ,| .| /| | | | | | - * |-----------------------------------------------------------|-----------| - * | ||||| | | ||||| | | | | - * *-----------------------------------------------------------------------* + /*#### _CL: Colmak Layer. + * .-----------------------------------------------------------------------. + * | ||||| | | | ||| | | | ||| | | | | | | | + * .-----------------------------------------------------------|-----------| + * | | | | | | | | | | | |- |= | | | | | + * |-----------------------------------------------------------|-----------| + * | |Q |W |F |P |G |J |L |U |Y |; |[ |] |\ | | | | + * |-----------------------------------------------------------|-----------| + * | |A |R |S |T |D |H |N |E |I |O |' | | | + * |-----------------------------------------------------------|-----------| + * | |Z |X |C |V |B |K |M |, |. |/ | | | | | | + * |-----------------------------------------------------------|-----------| + * | | | | | | | | | | | + * *-----------------------------------------------------------------------* */ [_CL] = LAYOUT_tkl( \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ @@ -147,142 +144,126 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_K , KC_M , KC_COMM, KC_DOT , KC_SLSH, _______, _______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ ), - - /* _FL: Function Layer. - * M0 opens Chrome - * .-----------------------------------------------------------------------. - * | ||||| | | | ||| | | | ||| |VlM|VlD|VlU| | | | - * .-----------------------------------------------------------|-----------| - * | M0| | | | | | | | | | | | | | | | | - * |-----------------------------------------------------------|-----------| - * |Fn_AL| | | | | | | | | | | | | | | | | - * |-----------------------------------------------------------|-----------| - * |FnCaps| | | | | | |Lft|Dwn|Up |Rgt| | | | - * |-----------------------------------------------------------|-----------| - * | | | | | | | | | | | | | | | | | - * |-----------------------------------------------------------|-----------| - * | ||||| | | ||||| |WBk| |WFw| - * *-----------------------------------------------------------------------* + /*#### _FL: Function Layer. + * .-----------------------------------------------------------------------. + * | ||||| | | | ||| | | | ||| |VlM|VlD|VlU| | | | + * .-----------------------------------------------------------|-----------| + * |Web| | | | | | | | | | | | | | | | | + * |-----------------------------------------------------------|-----------| + * |Fn_AL| | | | | | | | | | | | | | | | | + * |-----------------------------------------------------------|-----------| + * | | | | | | | |Lft|Dwn|Up |Rgt| | | | + * |-----------------------------------------------------------|-----------| + * | | | | | | | | | | | | |Fn | | | | + * |-----------------------------------------------------------|-----------| + * | | | | SP4 | |Fn | |WBk| |WFw| + * *-----------------------------------------------------------------------* */ [_FL] = LAYOUT_tkl( \ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MUTE, KC_VOLD, KC_VOLU, XXXXXXX, XXXXXXX, XXXXXXX, \ - M(0), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + KC_WEB, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ MO(_AL), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ - _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, \ - XXXXXXX, XXXXXXX, KC_MENU, M(1), XXXXXXX, _______, XXXXXXX, XXXXXXX, KC_WBAK, XXXXXXX, KC_WFWD \ + XXXXXXX, XXXXXXX, KC_MENU, KC_SP4, XXXXXXX, _______, XXXXXXX, XXXXXXX, KC_WBAK, XXXXXXX, KC_WFWD \ ), - - /* _AL: Adjust Layer. - * Default keymap, RGB Underglow, LED backlight, and Dynamic Macro settings. - * .-----------------------------------------------------------------------. - * |Rst||||| | | | ||| | | | ||| | | | | | | | - * .-----------------------------------------------------------|-----------| - * |Ver|Tog|Mod|H- |H+ |S- |S+ |V- |V+ | |BLT|BL-|BL+| | |MR1|MP1| - * |-----------------------------------------------------------|-----------| - * |Fn_AL|_BL|_WL| | | | | | | | | | | | MS|MR2|MP2| - * |-----------------------------------------------------------|-----------| - * |FnCaps| | |_DL| | | | | | | | | | | - * |-----------------------------------------------------------|-----------| - * | | | |_CL| |_BL|_NL| | | | | | | | | | - * |-----------------------------------------------------------|-----------| - * | ||||| | | ||||| | | | | - * *-----------------------------------------------------------------------* + /*#### _AL: Adjust Layer - Keymap select, LED backlight, and Dynamic Macro settings. + * .-----------------------------------------------------------------------. + * |Rst||||| | | | ||| | | | ||| | | | | | | | + * .-----------------------------------------------------------|-----------| + * |Rev|Tog|Mod|H- |H+ |S- |S+ |V- |V+ | |BLT|BL-|BL+| | |MR1|MP1| + * |-----------------------------------------------------------|-----------| + * |Fn_AL|_BL|_WL| | | | | | | | | | | | MS|MR2|MP2| + * |-----------------------------------------------------------|-----------| + * | | | |_DL| | | | | | | | | | | + * |-----------------------------------------------------------|-----------| + * | | | |_CL| |_BL|_NL| | | | | |Fn | | | | + * |-----------------------------------------------------------|-----------| + * | | | | | |Fn | | | | | + * *-----------------------------------------------------------------------* */ [_AL] = LAYOUT_tkl( \ RESET, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ - F(0), RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, XXXXXXX, BL_TOGG, BL_DEC, BL_INC, XXXXXXX, XXXXXXX, KC_DMR1, KC_DMP1, \ + QMK_REV, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, XXXXXXX, BL_TOGG, BL_DEC, BL_INC, XXXXXXX, XXXXXXX, KC_DMR1, KC_DMP1, \ _______, DF(_BL), DF(_WL), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_DMRS, KC_DMR2, KC_DMP2, \ - _______, XXXXXXX, XXXXXXX, DF(_DL), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, DF(_DL), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, DF(_CL), XXXXXXX, DF(_BL), DF(_NL), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, \ - _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX \ ), }; -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { - switch(id) { - case 0: - if (record->event.pressed) { - return MACRO(I(0), D(LGUI), T(R), U(LGUI), END); - } - else { - SEND_STRING("chrome.exe\n"); - return false; - } - break; - case 1: - if (record->event.pressed) { - return MACRO(I(0), T(SPC), T(SPC), T(SPC), T(SPC), END); - } - else { - return false; - } - break; - } - return MACRO_NONE; -}; - -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_FUNCTION(0), -}; - -void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { - switch (id) { - case 0: - if (record->event.pressed) { - SEND_STRING ("[QMK:" QMK_KEYBOARD ":" QMK_KEYMAP ":" QMK_VERSION "]"); - } - break; - } -} - -void matrix_init_user(void) { - #ifdef BACKLIGHT_ENABLE - backlight_level(0); - #endif -} - -// Runs constantly in the background, in a loop. -void matrix_scan_user(void) { - uint8_t layer = biton32(layer_state); - - if (current_layer == layer) { - } - else { - current_layer = layer; - switch (layer) { - case 0: - backlight_level(0); - break; - case 1: - backlight_level(1); - break; - case 2: - backlight_level(1); - break; - case 3: - backlight_level(1); - break; - case 4: - backlight_level(1); - break; - case 5: - backlight_level(2); - break; - case 6: - backlight_level(3); - break; - default: - backlight_level(0); - break; - } - } -} - bool process_record_user(uint16_t keycode, keyrecord_t *record) { - // Enable Dynamic Macros. + switch (keycode) { + case QMK_REV: + if (record->event.pressed) { + SEND_STRING(QMK_KEYBOARD "/" QMK_KEYMAP "@" QMK_VERSION ":" QMK_BUILDDATE); + } + return false; + break; + case KC_WEB: + if (record->event.pressed) { + SEND_STRING(SS_LGUI("r")); + wait_ms(100); + SEND_STRING("chrome.exe\n"); + } + return false; + break; + case KC_SP4: + if (record->event.pressed) { + SEND_STRING (" "); + } + return false; + break; + } + // Dynamic Macros. if (!process_record_dynamic_macro(keycode, record)) { return false; } return true; } + +void custom_backlight_level(uint8_t level) { + if (level > BACKLIGHT_LEVELS) + level = BACKLIGHT_LEVELS; + backlight_config.level = level; + backlight_config.enable = !!backlight_config.level; + backlight_set(backlight_config.level); +} + +void matrix_init_user(void) { + #ifdef BACKLIGHT_ENABLE + custom_backlight_level(0); + #endif +} + +void matrix_scan_user(void) { + +} + +uint32_t layer_state_set_user(uint32_t state) { + switch (biton32(state)) { + case _BL: + custom_backlight_level(0); + break; + case _WL: + case _NL: + case _DL: + case _CL: + custom_backlight_level(1); + break; + case _FL: + custom_backlight_level(2); + break; + case _AL: + custom_backlight_level(3); + break; + default: + custom_backlight_level(0); + break; + } + return state; +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/gonnerd/keymaps/gam3cat/readme.md b/keyboards/gonnerd/keymaps/gam3cat/readme.md index 181369790..8630ea296 100644 --- a/keyboards/gonnerd/keymaps/gam3cat/readme.md +++ b/keyboards/gonnerd/keymaps/gam3cat/readme.md @@ -1,120 +1,114 @@ # Keymap Maintainer: Gam3cat make gonnerd:gam3cat ## Layout Config: -2u backspace, 2.25u left shift/enter, 1.75u right shift. -2x1.5u, 1x7.0u, 2x1.5u, 3x1u bottom row. - - FN_CAPS = MO(_FL) when held, CAPS when tapped. - GRAVE_ESC + GUI = ` - GRAVE_ESC + SHIFT = ~ +2u backspace, 2.25u lshift/enter, [2.75u rshift] or [1.75u rshift, 1u Fn]. +[1.5u, 1u, 1.5u 1x7.0u, 1.5u, 1u, 1.5u, 3x1u] or [2x1.5u, 1x7.0u, 2x1.5u, 3x1u] bottom row. ## Base Layer Selection: -(Caps+TAB+( )): (Q)WERTY, (W)orkman, (N)orman, (D)vorak, (C)olmak +(Fn+TAB+( )): (Q)WERTY, (W)orkman, (N)orman, (D)vorak, (C)olmak ### Base Layer Options: - _BL: Base Layer, mostly standard TKL QWERTY layout. +#### _BL: Base Layer - Standard TKL QWERTY layout. .-----------------------------------------------------------------------. - |Esc||||| F1| F2| F3| F4||| F5| F6| F7| F8||| F9|F10|F11|F12|PSc|SLk|Pau| + |Esc|||||F1 |F2 |F3 |F4 |||F5 |F6 |F7 |F8 |||F9 |F10|F11|F12|PSc|SLk|Pau| |-----------------------------------------------------------|-----------| - | ~| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp |Ins|Hom|PgU| + |~ |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 |- |= |Backsp |Ins|Hom|PgU| |-----------------------------------------------------------|-----------| - |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \|Del|End|PgD| + |Tab |Q |W |E |R |T |Y |U |I |O |P |[ |] |\ |Del|End|PgD| |-----------------------------------------------------------|-----------| - |FnCaps| A| S| D| F| G| H| J| K| L| ;| '|Return | | + |Caps |A |S |D |F |G |H |J |K |L |; |' |Return | | |-----------------------------------------------------------|-----------| - |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | | Up| | + |Shift |Z |X |C |V |B |N |M |, |. |/ |Shift |Fn | | Up| | |-----------------------------------------------------------|-----------| - |Ctrl |||||Win | Space |RAlt |||||Ctrl |Lft|Dwn|Rgt| + |Ctrl |Win|Alt | Space |RAlt |Fn |Ctrl |Lft|Dwn|Rgt| *-----------------------------------------------------------------------* - - _WL: Workman Layer. + +#### _WL: Workman Layer. .-----------------------------------------------------------------------. | ||||| | | | ||| | | | ||| | | | | | | | .-----------------------------------------------------------|-----------| - | | | | | | | | | | | | -| =| | | | | + | | | | | | | | | | | |- |= | | | | | |-----------------------------------------------------------|-----------| - | | Q| D| R| W| B| J| F| U| P| ;| [| ]| \| | | | + | |Q |D |R |W |B |J |F |U |P |; |[ |] |\ | | | | |-----------------------------------------------------------|-----------| - | | A| S| H| T| G| Y| N| E| O| I| '| | | + | |A |S |H |T |G |Y |N |E |O |I |' | | | |-----------------------------------------------------------|-----------| - | | Z| X| M| C| V| K| L| ,| .| /| | | | | | + | |Z |X |M |C |V |K |L |, |. |/ | | | | | | |-----------------------------------------------------------|-----------| - | ||||| | | ||||| | | | | + | | | | | | | | | | | *-----------------------------------------------------------------------* - - _NL: Norman Layer. + +#### _NL: Norman Layer. .-----------------------------------------------------------------------. | ||||| | | | ||| | | | ||| | | | | | | | .-----------------------------------------------------------|-----------| - | | | | | | | | | | | | -| =| | | | | + | | | | | | | | | | | |- |= | | | | | |-----------------------------------------------------------|-----------| - | | Q| W| D| F| K| J| U| R| L| ;| [| ]| \| | | | + | |Q |W |D |F |K |J |U |R |L |; |[ |] |\ | | | | |-----------------------------------------------------------|-----------| - | | A| S| E| T| G| Y| N| I| O| H| '| | | + | |A |S |E |T |G |Y |N |I |O |H |' | | | |-----------------------------------------------------------|-----------| - | | Z| X| C| V| B| P| M| ,| .| /| | | | | | + | |Z |X |C |V |B |P |M |, |. |/ | | | | | | |-----------------------------------------------------------|-----------| - | ||||| | | ||||| | | | | + | | | | | | | | | | | *-----------------------------------------------------------------------* - - _DL: Dvorak Layer. + +#### _DL: Dvorak Layer. .-----------------------------------------------------------------------. | ||||| | | | ||| | | | ||| | | | | | | | .-----------------------------------------------------------|-----------| - | | | | | | | | | | | | [| ]| | | | | + | | | | | | | | | | | |[ |] | | | | | |-----------------------------------------------------------|-----------| - | | '| ,| .| P| Y| F| G| C| R| L| /| =| \| | | | + | |' |, |. |P |Y |F |G |C |R |L |/ |= |\ | | | | |-----------------------------------------------------------|-----------| - | | A| O| E| U| I| D| H| T| N| S| -| | | + | |A |O |E |U |I |D |H |T |N |S |- | | | |-----------------------------------------------------------|-----------| - | | ;| Q| J| K| X| B| M| W| V| Z| | | | | | + | |; |Q |J |K |X |B |M |W |V |Z | | | | | | |-----------------------------------------------------------|-----------| - | ||||| | | ||||| | | | | + | | | | | | | | | | | *-----------------------------------------------------------------------* - - _CL: Colmak Layer. + +#### _CL: Colmak Layer. .-----------------------------------------------------------------------. | ||||| | | | ||| | | | ||| | | | | | | | .-----------------------------------------------------------|-----------| - | | | | | | | | | | | | -| =| | | | | + | | | | | | | | | | | |- |= | | | | | |-----------------------------------------------------------|-----------| - | | Q| W| F| P| G| J| L| U| Y| ;| [| ]| \| | | | + | |Q |W |F |P |G |J |L |U |Y |; |[ |] |\ | | | | |-----------------------------------------------------------|-----------| - | | A| R| S| T| D| H| N| E| I| O| '| | | + | |A |R |S |T |D |H |N |E |I |O |' | | | |-----------------------------------------------------------|-----------| - | | Z| X| C| V| B| K| M| ,| .| /| | | | | | + | |Z |X |C |V |B |K |M |, |. |/ | | | | | | |-----------------------------------------------------------|-----------| - | ||||| | | ||||| | | | | + | | | | | | | | | | | *-----------------------------------------------------------------------* - - _FL: Function Layer. - M0 opens Chrome + +#### _FL: Function Layer. .-----------------------------------------------------------------------. | ||||| | | | ||| | | | ||| |VlM|VlD|VlU| | | | .-----------------------------------------------------------|-----------| - | M0| | | | | | | | | | | | | | | | | + |Web| | | | | | | | | | | | | | | | | |-----------------------------------------------------------|-----------| - | | | | | | | | | | | | | | | | | | + |Fn_AL| | | | | | | | | | | | | | | | | |-----------------------------------------------------------|-----------| | | | | | | | |Lft|Dwn|Up |Rgt| | | | |-----------------------------------------------------------|-----------| - | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | |Fn | | | | |-----------------------------------------------------------|-----------| - | ||||| | | ||||| |WBk| |WFw| + | | | | SP4 | |Fn | |WBk| |WFw| *-----------------------------------------------------------------------* - - _AL: Adjust Layer. - Default keymap, RGB Underglow, LED backlight, and Dynamic Macro settings. + +#### _AL: Adjust Layer - Keymap select, LED backlight, and Dynamic Macro settings. .-----------------------------------------------------------------------. |Rst||||| | | | ||| | | | ||| | | | | | | | .-----------------------------------------------------------|-----------| - |Ver|Tog|Mod|H- |H+ |S- |S+ |V- |V+ | |BLT|BL-|BL+| | |MR1|MP1| + |Rev|Tog|Mod|H- |H+ |S- |S+ |V- |V+ | |BLT|BL-|BL+| | |MR1|MP1| |-----------------------------------------------------------|-----------| |Fn_AL|_BL|_WL| | | | | | | | | | | | MS|MR2|MP2| |-----------------------------------------------------------|-----------| - |FnCaps| | |_DL| | | | | | | | | | | + | | | |_DL| | | | | | | | | | | |-----------------------------------------------------------|-----------| - | | | |_CL| |_BL|_NL| | | | | | | | | | + | | | |_CL| |_BL|_NL| | | | | |Fn | | | | |-----------------------------------------------------------|-----------| - | ||||| | | ||||| | | | | + | | | | | |Fn | | | | | *-----------------------------------------------------------------------* diff --git a/keyboards/gonnerd/keymaps/gam3cat/rules.mk b/keyboards/gonnerd/keymaps/gam3cat/rules.mk index a22683842..6eab033cc 100644 --- a/keyboards/gonnerd/keymaps/gam3cat/rules.mk +++ b/keyboards/gonnerd/keymaps/gam3cat/rules.mk @@ -2,20 +2,23 @@ # change to "no" to disable the options, or define them in the Makefile in # the appropriate keymap folder that will get included automatically # -BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = yes # Console for debug(+400) -COMMAND_ENABLE = yes # Commands for debug and configuration -NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality -MIDI_ENABLE = no # MIDI controls -AUDIO_ENABLE = no # Audio output on port C6 -UNICODE_ENABLE = no # Unicode -BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +TAP_DANCE_ENABLE = no # Enable TapDance functionality RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+1500) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend - -ifndef QUANTUM_DIR - include ../../../../Makefile -endif +NKRO_ENABLE = yes # Nkey Rollover - If this doesn't work, add this to config.h: #define FORCE_NKRO +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +UNICODE_ENABLE = no # Unicode +UNICODEMAP_ENABLE = no # Enable extended unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Uses buzzer to emulate clicky switches. By default, uses the C6 pin, same as AUDIO_ENABLE. +#VARIABLE_TRACE = no # Use this to debug changes to variable values +API_SYSEX_ENABLE = no # This enables using the Quantum SYSEX API to send strings(+5390) +KEY_LOCK_ENABLE = no # This enables key lock(+260) +SPLIT_KEYBOARD = no # This enables split keyboard support and includes all necessary files located at quantum/split_common diff --git a/keyboards/h87a/keymaps/gam3cat/config.h b/keyboards/h87a/keymaps/gam3cat/config.h new file mode 100644 index 000000000..334beb0ac --- /dev/null +++ b/keyboards/h87a/keymaps/gam3cat/config.h @@ -0,0 +1,10 @@ +#pragma once + +//Force NKRO to be enabled. +#define FORCE_NKRO + +//GRAVE_ESC override for CTRL+SHIFT+ESC Windows task manager shortcut. +//#define GRAVE_ESC_CTRL_OVERRIDE + +//Delay matrix scan for tap dance, reduce to activate modifier keys faster. +//#define TAPPING_TERM 200 diff --git a/keyboards/h87a/keymaps/gam3cat/keymap.c b/keyboards/h87a/keymaps/gam3cat/keymap.c new file mode 100644 index 000000000..2a4e5ca41 --- /dev/null +++ b/keyboards/h87a/keymaps/gam3cat/keymap.c @@ -0,0 +1,292 @@ +#include QMK_KEYBOARD_H +#include "version.h" + +enum layers { + _BL = 0, // Base Layer + _WL, // Workman Layer + _NL, // Norman Layer + _DL, // Dvorak Layer + _CL, // Base Layer + _FL, // Function Layer + _AL, // Adjust Layer +}; + +enum custom_keycodes { + DYNAMIC_MACRO_RANGE = SAFE_RANGE, + QMK_REV, + KC_WEB, + KC_SP4 +}; + +extern backlight_config_t backlight_config; + +#include "dynamic_macro.h" +#define FN_CAPS LT(_FL, KC_CAPS) +#define KC_DMR1 DYN_REC_START1 +#define KC_DMR2 DYN_REC_START2 +#define KC_DMP1 DYN_MACRO_PLAY1 +#define KC_DMP2 DYN_MACRO_PLAY2 +#define KC_DMRS DYN_REC_STOP + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /*#### _BL: Base Layer - Standard TKL QWERTY layout. + * .-----------------------------------------------------------------------. + * |Esc|||||F1 |F2 |F3 |F4 |||F5 |F6 |F7 |F8 |||F9 |F10|F11|F12|PSc|SLk|Pau| + * |-----------------------------------------------------------|-----------| + * |~ |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 |- |= |Backsp |Ins|Hom|PgU| + * |-----------------------------------------------------------|-----------| + * |Tab |Q |W |E |R |T |Y |U |I |O |P |[ |] |\ |Del|End|PgD| + * |-----------------------------------------------------------|-----------| + * |Caps |A |S |D |F |G |H |J |K |L |; |' |Return | | + * |-----------------------------------------------------------|-----------| + * |Shift |Z |X |C |V |B |N |M |, |. |/ |Shift |Fn | | Up| | + * |-----------------------------------------------------------|-----------| + * |Ctrl |Win|Alt | Space |RAlt |Fn |Ctrl |Lft|Dwn|Rgt| + * *-----------------------------------------------------------------------* + */ + [_BL] = LAYOUT_all( \ + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, XXXXXXX, KC_ENT, \ + KC_LSFT, XXXXXXX, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(_FL), KC_UP, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RGUI, KC_RALT, MO(_FL), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT \ + ), + /*#### _WL: Workman Layer. + * .-----------------------------------------------------------------------. + * | ||||| | | | ||| | | | ||| | | | | | | | + * .-----------------------------------------------------------|-----------| + * | | | | | | | | | | | |- |= | | | | | + * |-----------------------------------------------------------|-----------| + * | |Q |D |R |W |B |J |F |U |P |; |[ |] |\ | | | | + * |-----------------------------------------------------------|-----------| + * | |A |S |H |T |G |Y |N |E |O |I |' | | | + * |-----------------------------------------------------------|-----------| + * | |Z |X |M |C |V |K |L |, |. |/ | | | | | | + * |-----------------------------------------------------------|-----------| + * | | | | | | | | | | | + * *-----------------------------------------------------------------------* + */ + [_WL] = LAYOUT_all( \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, KC_Q , KC_D , KC_R , KC_W , KC_B , KC_J , KC_F , KC_U , KC_P , KC_SCLN, _______, _______, _______, _______, _______, _______, \ + _______, KC_A , KC_S , KC_H , KC_T , KC_G , KC_Y , KC_N , KC_E , KC_O , KC_I , _______, _______, _______, \ + _______, _______, KC_Z , KC_X , KC_M , KC_C , KC_V , KC_K , KC_L , KC_COMM, KC_DOT , KC_SLSH, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), + /*#### _NL: Norman Layer. + * .-----------------------------------------------------------------------. + * | ||||| | | | ||| | | | ||| | | | | | | | + * .-----------------------------------------------------------|-----------| + * | | | | | | | | | | | |- |= | | | | | + * |-----------------------------------------------------------|-----------| + * | |Q |W |D |F |K |J |U |R |L |; |[ |] |\ | | | | + * |-----------------------------------------------------------|-----------| + * | |A |S |E |T |G |Y |N |I |O |H |' | | | + * |-----------------------------------------------------------|-----------| + * | |Z |X |C |V |B |P |M |, |. |/ | | | | | | + * |-----------------------------------------------------------|-----------| + * | | | | | | | | | | | + * *-----------------------------------------------------------------------* + */ + [_NL] = LAYOUT_all( \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, KC_Q , KC_W , KC_D , KC_F , KC_K , KC_J , KC_U , KC_R , KC_L , KC_SCLN, _______, _______, _______, _______, _______, _______, \ + _______, KC_A , KC_S , KC_E , KC_T , KC_G , KC_Y , KC_N , KC_I , KC_O , KC_H , _______, _______, _______, \ + _______, _______, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_P , KC_M , KC_COMM, KC_DOT , KC_SLSH, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), + /*#### _DL: Dvorak Layer. + * .-----------------------------------------------------------------------. + * | ||||| | | | ||| | | | ||| | | | | | | | + * .-----------------------------------------------------------|-----------| + * | | | | | | | | | | | |[ |] | | | | | + * |-----------------------------------------------------------|-----------| + * | |' |, |. |P |Y |F |G |C |R |L |/ |= |\ | | | | + * |-----------------------------------------------------------|-----------| + * | |A |O |E |U |I |D |H |T |N |S |- | | | + * |-----------------------------------------------------------|-----------| + * | |; |Q |J |K |X |B |M |W |V |Z | | | | | | + * |-----------------------------------------------------------|-----------| + * | | | | | | | | | | | + * *-----------------------------------------------------------------------* + */ + [_DL] = LAYOUT_all( \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_LBRC, KC_RBRC, _______, _______, _______, _______, _______, \ + _______, KC_QUOT, KC_COMM, KC_DOT , KC_P , KC_Y , KC_F , KC_G , KC_C , KC_R , KC_L , KC_SLSH, KC_EQL , _______, _______, _______, _______, \ + _______, KC_A , KC_O , KC_E , KC_U , KC_I , KC_D , KC_H , KC_T , KC_N , KC_S , KC_MINS, _______, _______, \ + _______, _______, KC_SCLN, KC_Q , KC_J , KC_K , KC_X , KC_B , KC_M , KC_W , KC_V , KC_Z , _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), + /*#### _CL: Colmak Layer. + * .-----------------------------------------------------------------------. + * | ||||| | | | ||| | | | ||| | | | | | | | + * .-----------------------------------------------------------|-----------| + * | | | | | | | | | | | |- |= | | | | | + * |-----------------------------------------------------------|-----------| + * | |Q |W |F |P |G |J |L |U |Y |; |[ |] |\ | | | | + * |-----------------------------------------------------------|-----------| + * | |A |R |S |T |D |H |N |E |I |O |' | | | + * |-----------------------------------------------------------|-----------| + * | |Z |X |C |V |B |K |M |, |. |/ | | | | | | + * |-----------------------------------------------------------|-----------| + * | | | | | | | | | | | + * *-----------------------------------------------------------------------* + */ + [_CL] = LAYOUT_all( \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, KC_Q , KC_W , KC_F , KC_P , KC_G , KC_J , KC_L , KC_U , KC_Y , KC_SCLN, _______, _______, _______, _______, _______, _______, \ + _______, KC_A , KC_R , KC_S , KC_T , KC_D , KC_H , KC_N , KC_E , KC_I , KC_O , _______, _______, _______, \ + _______, _______, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_K , KC_M , KC_COMM, KC_DOT , KC_SLSH, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), + /*#### _FL: Function Layer. + * .-----------------------------------------------------------------------. + * | ||||| | | | ||| | | | ||| |VlM|VlD|VlU| | | | + * .-----------------------------------------------------------|-----------| + * |Web| | | | | | | | | | | | | | | | | + * |-----------------------------------------------------------|-----------| + * |Fn_AL| | | | | | | | | | | | | | | | | + * |-----------------------------------------------------------|-----------| + * | | | | | | | |Lft|Dwn|Up |Rgt| | | | + * |-----------------------------------------------------------|-----------| + * | | | | | | | | | | | | |Fn | | | | + * |-----------------------------------------------------------|-----------| + * | | | | SP4 | |Fn | |WBk| |WFw| + * *-----------------------------------------------------------------------* + */ + [_FL] = LAYOUT_all( \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MUTE, KC_VOLD, KC_VOLU, XXXXXXX, XXXXXXX, XXXXXXX, \ + KC_WEB, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + MO(_AL), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, \ + XXXXXXX, XXXXXXX, KC_MENU, KC_SP4, XXXXXXX, _______, XXXXXXX, XXXXXXX, KC_WBAK, XXXXXXX, KC_WFWD \ + ), + /*#### _AL: Adjust Layer - Keymap select, LED backlight, and Dynamic Macro settings. + * .-----------------------------------------------------------------------. + * |Rst||||| | | | ||| | | | ||| | | | | | | | + * .-----------------------------------------------------------|-----------| + * |Rev|Tog|Mod|H- |H+ |S- |S+ |V- |V+ | |BLT|BL-|BL+| | |MR1|MP1| + * |-----------------------------------------------------------|-----------| + * |Fn_AL|_BL|_WL| | | | | | | | | | | | MS|MR2|MP2| + * |-----------------------------------------------------------|-----------| + * | | | |_DL| | | | | | | | | | | + * |-----------------------------------------------------------|-----------| + * | | | |_CL| |_BL|_NL| | | | | |Fn | | | | + * |-----------------------------------------------------------|-----------| + * | | | | | |Fn | | | | | + * *-----------------------------------------------------------------------* + */ + [_AL] = LAYOUT_all( \ + RESET, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + QMK_REV, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, XXXXXXX, BL_TOGG, BL_DEC, BL_INC, XXXXXXX, XXXXXXX, XXXXXXX, KC_DMR1, KC_DMP1, \ + _______, DF(_BL), DF(_WL), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_DMRS, KC_DMR2, KC_DMP2, \ + XXXXXXX, XXXXXXX, XXXXXXX, DF(_DL), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, DF(_CL), XXXXXXX, DF(_BL), DF(_NL), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX \ + ), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QMK_REV: + if (record->event.pressed) { + SEND_STRING(QMK_KEYBOARD "/" QMK_KEYMAP "@" QMK_VERSION ":" QMK_BUILDDATE); + } + return false; + break; + case KC_WEB: + if (record->event.pressed) { + SEND_STRING(SS_LGUI("r")); + wait_ms(100); + SEND_STRING("chrome.exe\n"); + } + return false; + break; + case KC_SP4: + if (record->event.pressed) { + SEND_STRING (" "); + } + return false; + break; + } + // Dynamic Macros. + if (!process_record_dynamic_macro(keycode, record)) { + return false; + } + return true; +} + +void custom_backlight_level(uint8_t level) { + if (level > BACKLIGHT_LEVELS) + level = BACKLIGHT_LEVELS; + backlight_config.level = level; + backlight_config.enable = !!backlight_config.level; + backlight_set(backlight_config.level); +} + +void matrix_init_user(void) { + #ifdef BACKLIGHT_ENABLE + custom_backlight_level(0); + #endif + #ifdef RGBLIGHT_ENABLE + rgblight_mode(1); + rgblight_sethsv_noeeprom(180,100,100); + #endif +} + +void matrix_scan_user(void) { + +} + +uint32_t layer_state_set_user(uint32_t state) { + switch (biton32(state)) { + case _BL: + custom_backlight_level(0); + rgblight_sethsv_noeeprom(180,100,255); + break; + case _WL: + case _NL: + case _DL: + case _CL: + custom_backlight_level(1); + rgblight_sethsv_noeeprom(230,255,255); + break; + case _FL: + custom_backlight_level(2); + rgblight_sethsv_noeeprom(280,255,255); + break; + case _AL: + custom_backlight_level(3); + rgblight_sethsv_noeeprom(350,255,255); + break; + default: + custom_backlight_level(0); + rgblight_sethsv_noeeprom(180,100,100); + break; + } + return state; +} + +void led_init_ports(void) { + DDRD |= (1<<5); // OUT + DDRE |= (1<<6); // OUT +} + +void led_set_user(uint8_t usb_led) { + if (usb_led & (1 << USB_LED_CAPS_LOCK)) { + DDRD |= (1 << 5); PORTD &= ~(1 << 5); + } else { + DDRD &= ~(1 << 5); PORTD &= ~(1 << 5); + } + if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { + DDRE |= (1 << 6); PORTE &= ~(1 << 6); + } else { + DDRE &= ~(1 << 6); PORTE &= ~(1 << 6); + } +} diff --git a/keyboards/h87a/keymaps/gam3cat/readme.md b/keyboards/h87a/keymaps/gam3cat/readme.md new file mode 100644 index 000000000..5eb4c7d61 --- /dev/null +++ b/keyboards/h87a/keymaps/gam3cat/readme.md @@ -0,0 +1,114 @@ +# Keymap Maintainer: Gam3cat +make h87a:gam3cat +## Layout Config: +2u backspace, 2.25u lshift/enter, [2.75u rshift] or [1.75u rshift, 1u Fn]. +[1.5u, 1u, 1.5u 1x7.0u, 1.5u, 1u, 1.5u, 3x1u] or [2x1.5u, 1x7.0u, 2x1.5u, 3x1u] bottom row. + +## Base Layer Selection: +(Fn+TAB+( )): (Q)WERTY, (W)orkman, (N)orman, (D)vorak, (C)olmak + +### Base Layer Options: +#### _BL: Base Layer - Standard TKL QWERTY layout. + .-----------------------------------------------------------------------. + |Esc|||||F1 |F2 |F3 |F4 |||F5 |F6 |F7 |F8 |||F9 |F10|F11|F12|PSc|SLk|Pau| + |-----------------------------------------------------------|-----------| + |~ |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 |- |= |Backsp |Ins|Hom|PgU| + |-----------------------------------------------------------|-----------| + |Tab |Q |W |E |R |T |Y |U |I |O |P |[ |] |\ |Del|End|PgD| + |-----------------------------------------------------------|-----------| + |Caps |A |S |D |F |G |H |J |K |L |; |' |Return | | + |-----------------------------------------------------------|-----------| + |Shift |Z |X |C |V |B |N |M |, |. |/ |Shift |Fn | | Up| | + |-----------------------------------------------------------|-----------| + |Ctrl |Win|Alt | Space |RAlt |Fn |Ctrl |Lft|Dwn|Rgt| + *-----------------------------------------------------------------------* + +#### _WL: Workman Layer. + .-----------------------------------------------------------------------. + | ||||| | | | ||| | | | ||| | | | | | | | + .-----------------------------------------------------------|-----------| + | | | | | | | | | | | |- |= | | | | | + |-----------------------------------------------------------|-----------| + | |Q |D |R |W |B |J |F |U |P |; |[ |] |\ | | | | + |-----------------------------------------------------------|-----------| + | |A |S |H |T |G |Y |N |E |O |I |' | | | + |-----------------------------------------------------------|-----------| + | |Z |X |M |C |V |K |L |, |. |/ | | | | | | + |-----------------------------------------------------------|-----------| + | | | | | | | | | | | + *-----------------------------------------------------------------------* + +#### _NL: Norman Layer. + .-----------------------------------------------------------------------. + | ||||| | | | ||| | | | ||| | | | | | | | + .-----------------------------------------------------------|-----------| + | | | | | | | | | | | |- |= | | | | | + |-----------------------------------------------------------|-----------| + | |Q |W |D |F |K |J |U |R |L |; |[ |] |\ | | | | + |-----------------------------------------------------------|-----------| + | |A |S |E |T |G |Y |N |I |O |H |' | | | + |-----------------------------------------------------------|-----------| + | |Z |X |C |V |B |P |M |, |. |/ | | | | | | + |-----------------------------------------------------------|-----------| + | | | | | | | | | | | + *-----------------------------------------------------------------------* + +#### _DL: Dvorak Layer. + .-----------------------------------------------------------------------. + | ||||| | | | ||| | | | ||| | | | | | | | + .-----------------------------------------------------------|-----------| + | | | | | | | | | | | |[ |] | | | | | + |-----------------------------------------------------------|-----------| + | |' |, |. |P |Y |F |G |C |R |L |/ |= |\ | | | | + |-----------------------------------------------------------|-----------| + | |A |O |E |U |I |D |H |T |N |S |- | | | + |-----------------------------------------------------------|-----------| + | |; |Q |J |K |X |B |M |W |V |Z | | | | | | + |-----------------------------------------------------------|-----------| + | | | | | | | | | | | + *-----------------------------------------------------------------------* + +#### _CL: Colmak Layer. + .-----------------------------------------------------------------------. + | ||||| | | | ||| | | | ||| | | | | | | | + .-----------------------------------------------------------|-----------| + | | | | | | | | | | | |- |= | | | | | + |-----------------------------------------------------------|-----------| + | |Q |W |F |P |G |J |L |U |Y |; |[ |] |\ | | | | + |-----------------------------------------------------------|-----------| + | |A |R |S |T |D |H |N |E |I |O |' | | | + |-----------------------------------------------------------|-----------| + | |Z |X |C |V |B |K |M |, |. |/ | | | | | | + |-----------------------------------------------------------|-----------| + | | | | | | | | | | | + *-----------------------------------------------------------------------* + +#### _FL: Function Layer. + .-----------------------------------------------------------------------. + | ||||| | | | ||| | | | ||| |VlM|VlD|VlU| | | | + .-----------------------------------------------------------|-----------| + |Web| | | | | | | | | | | | | | | | | + |-----------------------------------------------------------|-----------| + |Fn_AL| | | | | | | | | | | | | | | | | + |-----------------------------------------------------------|-----------| + | | | | | | | |Lft|Dwn|Up |Rgt| | | | + |-----------------------------------------------------------|-----------| + | | | | | | | | | | | | |Fn | | | | + |-----------------------------------------------------------|-----------| + | | | | SP4 | |Fn | |WBk| |WFw| + *-----------------------------------------------------------------------* + +#### _AL: Adjust Layer - Keymap select, LED backlight, and Dynamic Macro settings. + .-----------------------------------------------------------------------. + |Rst||||| | | | ||| | | | ||| | | | | | | | + .-----------------------------------------------------------|-----------| + |Rev|Tog|Mod|H- |H+ |S- |S+ |V- |V+ | |BLT|BL-|BL+| | |MR1|MP1| + |-----------------------------------------------------------|-----------| + |Fn_AL|_BL|_WL| | | | | | | | | | | | MS|MR2|MP2| + |-----------------------------------------------------------|-----------| + | | | |_DL| | | | | | | | | | | + |-----------------------------------------------------------|-----------| + | | | |_CL| |_BL|_NL| | | | | |Fn | | | | + |-----------------------------------------------------------|-----------| + | | | | | |Fn | | | | | + *-----------------------------------------------------------------------* diff --git a/keyboards/h87a/keymaps/gam3cat/rules.mk b/keyboards/h87a/keymaps/gam3cat/rules.mk new file mode 100644 index 000000000..85b2b41a6 --- /dev/null +++ b/keyboards/h87a/keymaps/gam3cat/rules.mk @@ -0,0 +1,24 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +TAP_DANCE_ENABLE = no # Enable TapDance functionality +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+1500) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # Nkey Rollover - If this doesn't work, add this to config.h: #define FORCE_NKRO +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +UNICODE_ENABLE = no # Unicode +UNICODEMAP_ENABLE = no # Enable extended unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Uses buzzer to emulate clicky switches. By default, uses the C6 pin, same as AUDIO_ENABLE. +#VARIABLE_TRACE = no # Use this to debug changes to variable values +API_SYSEX_ENABLE = no # This enables using the Quantum SYSEX API to send strings(+5390) +KEY_LOCK_ENABLE = no # This enables key lock(+260) +SPLIT_KEYBOARD = no # This enables split keyboard support and includes all necessary files located at quantum/split_common diff --git a/keyboards/jc65/v32u4/keymaps/gam3cat/config.h b/keyboards/jc65/v32u4/keymaps/gam3cat/config.h index d86da86e4..e4df94be7 100644 --- a/keyboards/jc65/v32u4/keymaps/gam3cat/config.h +++ b/keyboards/jc65/v32u4/keymaps/gam3cat/config.h @@ -1,4 +1,8 @@ -#include "../../config.h" +#pragma once + +//Force NKRO to be enabled. +#define FORCE_NKRO + //GRAVE_ESC override for CTRL+SHIFT+ESC Windows task manager shortcut. #define GRAVE_ESC_CTRL_OVERRIDE diff --git a/keyboards/jc65/v32u4/keymaps/gam3cat/keymap.c b/keyboards/jc65/v32u4/keymaps/gam3cat/keymap.c index af45fb608..aa5709a37 100644 --- a/keyboards/jc65/v32u4/keymaps/gam3cat/keymap.c +++ b/keyboards/jc65/v32u4/keymaps/gam3cat/keymap.c @@ -11,13 +11,16 @@ enum layers { _AL, // Adjust Layer }; -enum jc65_keycodes { +enum custom_keycodes { DYNAMIC_MACRO_RANGE = SAFE_RANGE, + QMK_REV, + KC_WEB, + KC_SP4 }; +extern backlight_config_t backlight_config; + #include "dynamic_macro.h" -#define _______ KC_TRNS -#define XXXXXXX KC_NO #define FN_CAPS LT(_FL, KC_CAPS) #define KC_DMR1 DYN_REC_START1 #define KC_DMR2 DYN_REC_START2 @@ -25,18 +28,16 @@ enum jc65_keycodes { #define KC_DMP2 DYN_MACRO_PLAY2 #define KC_DMRS DYN_REC_STOP -static uint8_t current_layer; - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* _BL: Base Layer, mostly standard 65% QWERTY layout. + /*#### _BL: Base Layer - Mostly standard 65% QWERTY layout. * .---------------------------------------------------------------. - * |GrE| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp |Ins| + * |GrE|1 |2 |3 |4 |5 |6 |7 |8 |9 |0 |- |= |Backsp |Ins| * |---------------------------------------------------------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \|Del| + * |Tab |Q |W |E |R |T |Y |U |I |O |P |[ |] |\ |Del| * |---------------------------------------------------------------| - * |FnCaps| A| S| D| F| G| H| J| K| L| ;| '|Return |PgU| + * |FnCaps|A |S |D |F |G |H |J |K |L |; |' |Return |PgU| * |---------------------------------------------------------------| - * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift |Up |PgD| + * |Shift |Z |X |C |V |B |N |M |, |. |/ |Shift |Up |PgD| * |---------------------------------------------------------------| * |Ctrl|Gui |Alt | Space |RAlt |Ctrl |Lft|Dwn|Rgt| * *---------------------------------------------------------------* @@ -48,16 +49,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LSFT, XXXXXXX, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT ), - - /* _WL: Workman Layer. + /*#### _WL: Workman Layer. * .---------------------------------------------------------------. - * | | | | | | | | | | | | -| =| | | + * | | | | | | | | | | | |- |= | | | * |---------------------------------------------------------------| - * | | Q| D| R| W| B| J| F| U| P| ;| [| ]| \| | + * | |Q |D |R |W |B |J |F |U |P |; |[ |] |\ | | * |---------------------------------------------------------------| - * | | A| S| H| T| G| Y| N| E| O| I| '| | | + * | |A |S |H |T |G |Y |N |E |O |I |' | | | * |---------------------------------------------------------------| - * | | Z| X| M| C| V| K| L| ,| .| /| | | | + * | |Z |X |M |C |V |K |L |, |. |/ | | | | * |---------------------------------------------------------------| * | | | | | | | | | | * *---------------------------------------------------------------* @@ -69,16 +69,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, KC_Z , KC_X , KC_M , KC_C , KC_V , KC_K , KC_L , KC_COMM, KC_DOT , KC_SLSH, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), - - /* _NL: Norman Layer. + /*#### _NL: Norman Layer. * .---------------------------------------------------------------. - * | | | | | | | | | | | | -| =| | | + * | | | | | | | | | | | |- |= | | | * |---------------------------------------------------------------| - * | | Q| W| D| F| K| J| U| R| L| ;| [| ]| \| | + * | |Q |W |D |F |K |J |U |R |L |; |[ |] |\ | | * |---------------------------------------------------------------| - * | | A| S| E| T| G| Y| N| I| O| H| '| | | + * | |A |S |E |T |G |Y |N |I |O |H |' | | | * |---------------------------------------------------------------| - * | | Z| X| C| V| B| P| M| ,| .| /| | | | + * | |Z |X |C |V |B |P |M |, |. |/ | | | | * |---------------------------------------------------------------| * | | | | | | | | | | * *---------------------------------------------------------------* @@ -90,16 +89,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_P , KC_M , KC_COMM, KC_DOT , KC_SLSH, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), - - /* _DL: Dvorak Layer. + /*#### _DL: Dvorak Layer. * .---------------------------------------------------------------. - * | | | | | | | | | | | | [| ]| | | + * | | | | | | | | | | | |[ |] | | | * |---------------------------------------------------------------| - * | | '| ,| .| P| Y| F| G| C| R| L| /| =| \| | + * | |' |, |. |P |Y |F |G |C |R |L |/ |= |\ | | * |---------------------------------------------------------------| - * | | A| O| E| U| I| D| H| T| N| S| -| | | + * | |A |O |E |U |I |D |H |T |N |S |- | | | * |---------------------------------------------------------------| - * | | ;| Q| J| K| X| B| M| W| V| Z| | | | + * | |; |Q |J |K |X |B |M |W |V |Z | | | | * |---------------------------------------------------------------| * | | | | | | | | | | * *---------------------------------------------------------------* @@ -111,16 +109,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, KC_SCLN, KC_Q , KC_J , KC_K , KC_X , KC_B , KC_M , KC_W , KC_V , KC_Z , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), - - /* _CL: Colmak Layer. + /*#### _CL: Colmak Layer. * .---------------------------------------------------------------. - * | | | | | | | | | | | | -| =| | | + * | | | | | | | | | | | |- |= | | | * |---------------------------------------------------------------| - * | | Q| W| F| P| G| J| L| U| Y| ;| [| ]| \| | + * | |Q |W |F |P |G |J |L |U |Y |; |[ |] |\ | | * |---------------------------------------------------------------| - * | | A| R| S| T| D| H| N| E| I| O| '| | | + * | |A |R |S |T |D |H |N |E |I |O |' | | | * |---------------------------------------------------------------| - * | | Z| X| C| V| B| K| M| ,| .| /| | | | + * | |Z |X |C |V |B |K |M |, |. |/ | | | | * |---------------------------------------------------------------| * | | | | | | | | | | * *---------------------------------------------------------------* @@ -132,11 +129,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_K , KC_M , KC_COMM, KC_DOT , KC_SLSH, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), - - /* _FL: Function Layer. - * M0 opens Chrome + /*#### _FL: Function Layer. * .---------------------------------------------------------------. - * |M0 | F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|SLock |PSc| + * |Web|F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12|SLock |PSc| * |---------------------------------------------------------------| * |Fn_AL| | | | | | | | | | | | | |Pau| * |---------------------------------------------------------------| @@ -144,21 +139,19 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |---------------------------------------------------------------| * | | | | | | | | | | | |VlMute|VlU|End| * |---------------------------------------------------------------| - * | | |Menu| | | |WBk|VlD|WFw| + * | | |Menu| SP4 | | |WBk|VlD|WFw| * *---------------------------------------------------------------* */ [_FL] = LAYOUT( - M(0), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, KC_SLCK, KC_PSCR, + KC_WEB, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, KC_SLCK, KC_PSCR, MO(_AL), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_PAUS, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, XXXXXXX, XXXXXXX, XXXXXXX, KC_HOME, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MUTE, KC_VOLU, KC_END, - XXXXXXX, XXXXXXX, KC_MENU, M(1), M(1), M(1), XXXXXXX, XXXXXXX, XXXXXXX, KC_WBAK, KC_VOLD, KC_WFWD + XXXXXXX, XXXXXXX, KC_MENU, KC_SP4, KC_SP4, KC_SP4, XXXXXXX, XXXXXXX, XXXXXXX, KC_WBAK, KC_VOLD, KC_WFWD ), - - /* _AL: Adjust Layer. - * Default keymap, RGB Underglow, LED backlight, and Dynamic Macro settings. + /*#### _AL: Adjust Layer - Keymap select, RGB Underglow, LED backlight, and Dynamic Macro settings. * .---------------------------------------------------------------. - * |Ver|Tog|Mod|H- |H+ |S- |S+ |V- |V+ | |BLT|BL-|BL+| |MP1| + * |Rev|Tog|Mod|H- |H+ |S- |S+ |V- |V+ | |BLT|BL-|BL+| |MP1| * |---------------------------------------------------------------| * |Fn_AL|_BL|_WL| | | | | | | | | | | |MR1| * |---------------------------------------------------------------| @@ -170,7 +163,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * *---------------------------------------------------------------* */ [_AL] = LAYOUT( - F(0), RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, XXXXXXX, BL_TOGG, BL_DEC, BL_INC, XXXXXXX, XXXXXXX, KC_DMP1, + QMK_REV, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, XXXXXXX, BL_TOGG, BL_DEC, BL_INC, XXXXXXX, XXXXXXX, KC_DMP1, _______, DF(_BL), DF(_WL), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_DMR1, _______, XXXXXXX, XXXXXXX, DF(_DL), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_DMRS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, DF(_CL), XXXXXXX, DF(_BL), DF(_NL), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_DMR2, @@ -178,102 +171,96 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), }; -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { - switch(id) { - case 0: - if (record->event.pressed) { - return MACRO(I(0), D(LGUI), T(R), U(LGUI), END); - } - else { - SEND_STRING("chrome.exe https://geekhack.org/index.php?topic=86756.new;topicseen#new\n"); - return false; - } - break; - case 1: - if (record->event.pressed) { - return MACRO(I(0), T(SPC), T(SPC), T(SPC), T(SPC), END); - } - else { - return false; - } - break; - } - return MACRO_NONE; -}; - -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_FUNCTION(0), -}; - -void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { - switch (id) { - case 0: - if (record->event.pressed) { - SEND_STRING ("[QMK:" QMK_KEYBOARD ":" QMK_KEYMAP ":" QMK_VERSION "]"); - } - break; - } -} - -void matrix_init_user(void) { - #ifdef BACKLIGHT_ENABLE - backlight_level(0); - #endif - #ifdef RGBLIGHT_ENABLE - rgblight_mode(1); - rgblight_sethsv(180,100,100); - #endif -} - -// Runs constantly in the background, in a loop. -void matrix_scan_user(void) { - uint8_t layer = biton32(layer_state); - - if (current_layer == layer) { - } - else { - current_layer = layer; - switch (layer) { - case 0: - backlight_level(0); - rgblight_sethsv(180,100,255); - break; - case 1: - backlight_level(1); - rgblight_sethsv(180,95,240); - break; - case 2: - backlight_level(1); - rgblight_sethsv(180,90,225); - break; - case 3: - backlight_level(1); - rgblight_sethsv(180,85,210); - break; - case 4: - backlight_level(1); - rgblight_sethsv(180,80,195); - break; - case 5: - backlight_level(2); - rgblight_sethsv(230,255,255); - break; - case 6: - backlight_level(3); - rgblight_sethsv(350,255,255); - break; - default: - backlight_level(0); - rgblight_sethsv(180,100,100); - break; - } - } -} - bool process_record_user(uint16_t keycode, keyrecord_t *record) { - // Enable Dynamic Macros. + switch (keycode) { + case QMK_REV: + if (record->event.pressed) { + SEND_STRING(QMK_KEYBOARD "/" QMK_KEYMAP "@" QMK_VERSION ":" QMK_BUILDDATE); + } + return false; + break; + case KC_WEB: + if (record->event.pressed) { + SEND_STRING(SS_LGUI("r")); + wait_ms(100); + SEND_STRING("chrome.exe https://geekhack.org/index.php?topic=86756.new;topicseen#new\n"); + } + return false; + break; + case KC_SP4: + if (record->event.pressed) { + SEND_STRING (" "); + } + return false; + break; + } + // Dynamic Macros. if (!process_record_dynamic_macro(keycode, record)) { return false; } return true; } + +void custom_backlight_level(uint8_t level) { + if (level > BACKLIGHT_LEVELS) + level = BACKLIGHT_LEVELS; + backlight_config.level = level; + backlight_config.enable = !!backlight_config.level; + backlight_set(backlight_config.level); +} + +void matrix_init_user(void) { + #ifdef BACKLIGHT_ENABLE + custom_backlight_level(0); + #endif + #ifdef RGBLIGHT_ENABLE + rgblight_mode(1); + rgblight_sethsv_noeeprom(180,100,100); + #endif +} + +void matrix_scan_user(void) { + +} + +uint32_t layer_state_set_user(uint32_t state) { + switch (biton32(state)) { + case _BL: + custom_backlight_level(0); + rgblight_sethsv_noeeprom(180,100,255); + break; + case _WL: + custom_backlight_level(1); + rgblight_sethsv_noeeprom(180,95,240); + break; + case _NL: + custom_backlight_level(1); + rgblight_sethsv_noeeprom(180,90,225); + break; + case _DL: + custom_backlight_level(1); + rgblight_sethsv_noeeprom(180,85,210); + break; + case _CL: + custom_backlight_level(1); + rgblight_sethsv_noeeprom(180,80,195); + break; + case _FL: + custom_backlight_level(2); + rgblight_sethsv_noeeprom(230,255,255); + break; + case _AL: + custom_backlight_level(3); + rgblight_sethsv_noeeprom(350,255,255); + break; + default: + custom_backlight_level(0); + rgblight_sethsv_noeeprom(180,100,100); + break; + } + return state; +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/jc65/v32u4/keymaps/gam3cat/readme.md b/keyboards/jc65/v32u4/keymaps/gam3cat/readme.md index 88b65dbbb..e79ce4ff7 100644 --- a/keyboards/jc65/v32u4/keymaps/gam3cat/readme.md +++ b/keyboards/jc65/v32u4/keymaps/gam3cat/readme.md @@ -13,76 +13,74 @@ make jc65/v32u4:gam3cat (Caps+TAB+( )): (Q)WERTY, (W)orkman, (N)orman, (D)vorak, (C)olmak ### Base Layer Options: -#### _BL: Base Layer, mostly standard 65% QWERTY layout. +#### _BL: Base Layer - Mostly standard 65% QWERTY layout. .---------------------------------------------------------------. - |GrE| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp |Ins| + |GrE|1 |2 |3 |4 |5 |6 |7 |8 |9 |0 |- |= |Backsp |Ins| |---------------------------------------------------------------| - |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \|Del| + |Tab |Q |W |E |R |T |Y |U |I |O |P |[ |] |\ |Del| |---------------------------------------------------------------| - |FnCaps| A| S| D| F| G| H| J| K| L| ;| '|Return |PgU| + |FnCaps|A |S |D |F |G |H |J |K |L |; |' |Return |PgU| |---------------------------------------------------------------| - |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift |Up |PgD| + |Shift |Z |X |C |V |B |N |M |, |. |/ |Shift |Up |PgD| |---------------------------------------------------------------| |Ctrl|Gui |Alt | Space |RAlt |Ctrl |Lft|Dwn|Rgt| *---------------------------------------------------------------* #### _WL: Workman Layer. .---------------------------------------------------------------. - | | | | | | | | | | | | -| =| | | + | | | | | | | | | | | |- |= | | | |---------------------------------------------------------------| - | | Q| D| R| W| B| J| F| U| P| ;| [| ]| \| | + | |Q |D |R |W |B |J |F |U |P |; |[ |] |\ | | |---------------------------------------------------------------| - | | A| S| H| T| G| Y| N| E| O| I| '| | | + | |A |S |H |T |G |Y |N |E |O |I |' | | | |---------------------------------------------------------------| - | | Z| X| M| C| V| K| L| ,| .| /| | | | + | |Z |X |M |C |V |K |L |, |. |/ | | | | |---------------------------------------------------------------| | | | | | | | | | | *---------------------------------------------------------------* #### _NL: Norman Layer. .---------------------------------------------------------------. - | | | | | | | | | | | | -| =| | | + | | | | | | | | | | | |- |= | | | |---------------------------------------------------------------| - | | Q| W| D| F| K| J| U| R| L| ;| [| ]| \| | + | |Q |W |D |F |K |J |U |R |L |; |[ |] |\ | | |---------------------------------------------------------------| - | | A| S| E| T| G| Y| N| I| O| H| '| | | + | |A |S |E |T |G |Y |N |I |O |H |' | | | |---------------------------------------------------------------| - | | Z| X| C| V| B| P| M| ,| .| /| | | | + | |Z |X |C |V |B |P |M |, |. |/ | | | | |---------------------------------------------------------------| | | | | | | | | | | *---------------------------------------------------------------* #### _DL: Dvorak Layer. .---------------------------------------------------------------. - | | | | | | | | | | | | [| ]| | | + | | | | | | | | | | | |[ |] | | | |---------------------------------------------------------------| - | | '| ,| .| P| Y| F| G| C| R| L| /| =| \| | + | |' |, |. |P |Y |F |G |C |R |L |/ |= |\ | | |---------------------------------------------------------------| - | | A| O| E| U| I| D| H| T| N| S| -| | | + | |A |O |E |U |I |D |H |T |N |S |- | | | |---------------------------------------------------------------| - | | ;| Q| J| K| X| B| M| W| V| Z| | | | + | |; |Q |J |K |X |B |M |W |V |Z | | | | |---------------------------------------------------------------| | | | | | | | | | | *---------------------------------------------------------------* #### _CL: Colmak Layer. .---------------------------------------------------------------. - | | | | | | | | | | | | -| =| | | + | | | | | | | | | | | |- |= | | | |---------------------------------------------------------------| - | | Q| W| F| P| G| J| L| U| Y| ;| [| ]| \| | + | |Q |W |F |P |G |J |L |U |Y |; |[ |] |\ | | |---------------------------------------------------------------| - | | A| R| S| T| D| H| N| E| I| O| '| | | + | |A |R |S |T |D |H |N |E |I |O |' | | | |---------------------------------------------------------------| - | | Z| X| C| V| B| K| M| ,| .| /| | | | + | |Z |X |C |V |B |K |M |, |. |/ | | | | |---------------------------------------------------------------| | | | | | | | | | | *---------------------------------------------------------------* -### Function Layer: (hold Caps to access) - M0 opens Chrome #### _FL: Function Layer. .---------------------------------------------------------------. - |M0 | F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|SLock |PSc| + |Web|F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12|SLock |PSc| |---------------------------------------------------------------| |Fn_AL| | | | | | | | | | | | | |Pau| |---------------------------------------------------------------| @@ -90,14 +88,12 @@ make jc65/v32u4:gam3cat |---------------------------------------------------------------| | | | | | | | | | | | |VlMute|VlU|End| |---------------------------------------------------------------| - | | |Menu| | | |WBk|VlD|WFw| + | | |Menu| SP4 | | |WBk|VlD|WFw| *---------------------------------------------------------------* -### Adjust Layer: (hold Caps+TAB to access) - Default keymap, RGB Underglow, LED backlight, and Dynamic Macro settings. -#### _AL: Adjust Layer. +#### _AL: Adjust Layer - Keymap select, RGB Underglow, LED backlight, and Dynamic Macro settings. .---------------------------------------------------------------. - |Ver|Tog|Mod|H- |H+ |S- |S+ |V- |V+ | |BLT|BL-|BL+| |MP1| + |Rev|Tog|Mod|H- |H+ |S- |S+ |V- |V+ | |BLT|BL-|BL+| |MP1| |---------------------------------------------------------------| |Fn_AL|_BL|_WL| | | | | | | | | | | |MR1| |---------------------------------------------------------------| diff --git a/keyboards/jc65/v32u4/keymaps/gam3cat/rules.mk b/keyboards/jc65/v32u4/keymaps/gam3cat/rules.mk index c0a3ac69c..85b2b41a6 100644 --- a/keyboards/jc65/v32u4/keymaps/gam3cat/rules.mk +++ b/keyboards/jc65/v32u4/keymaps/gam3cat/rules.mk @@ -1,6 +1,24 @@ -ifndef QUANTUM_DIR - include ../../../../Makefile -endif - -BACKLIGHT_ENABLE=yes -//TAP_DANCE_ENABLE=yes +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +TAP_DANCE_ENABLE = no # Enable TapDance functionality +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+1500) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # Nkey Rollover - If this doesn't work, add this to config.h: #define FORCE_NKRO +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +UNICODE_ENABLE = no # Unicode +UNICODEMAP_ENABLE = no # Enable extended unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Uses buzzer to emulate clicky switches. By default, uses the C6 pin, same as AUDIO_ENABLE. +#VARIABLE_TRACE = no # Use this to debug changes to variable values +API_SYSEX_ENABLE = no # This enables using the Quantum SYSEX API to send strings(+5390) +KEY_LOCK_ENABLE = no # This enables key lock(+260) +SPLIT_KEYBOARD = no # This enables split keyboard support and includes all necessary files located at quantum/split_common diff --git a/keyboards/m10a/keymaps/gam3cat/keymap.c b/keyboards/m10a/keymaps/gam3cat/keymap.c index 8f4c878da..8ee35d50a 100644 --- a/keyboards/m10a/keymaps/gam3cat/keymap.c +++ b/keyboards/m10a/keymaps/gam3cat/keymap.c @@ -1,6 +1,4 @@ -#include "m10a.h" -#include "action_layer.h" -#include "eeconfig.h" +#include QMK_KEYBOARD_H #include "version.h" extern keymap_config_t keymap_config; @@ -18,46 +16,48 @@ enum layers { _L9 }; -enum m10a_keycodes { +enum custom_keycodes { DYNAMIC_MACRO_RANGE = SAFE_RANGE, + QMK_REV, + KC_WEB, + KC_WCLS }; +extern backlight_config_t backlight_config; + #include "dynamic_macro.h" -#define _______ KC_TRNS -#define XXXXXXX KC_NO -#define FN_ZERO LT(_L9, KC_0) +#define FN_ZERO LT(_L9, KC_KP_0) #define KC_DMR1 DYN_REC_START1 #define KC_DMR2 DYN_REC_START2 #define KC_DMP1 DYN_MACRO_PLAY1 #define KC_DMP2 DYN_MACRO_PLAY2 #define KC_DMRS DYN_REC_STOP -static uint8_t current_layer; - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* .-----------. .-----------. .-----------. .-----------. .-----------. - * | 7| 8| 9| | +| -| *| | ^| &| !| |VLU|Ver|WFD| |VLU|NXT|FFD| - * |-----------| |-----------| |-----------| |-----------| |-----------| - * | 4| 5| 6| | /| %| ,| | D| E| F| |MUT|C-W|CHR| |MUT|STP|PLY| - * |-----------| |-----------| |-----------| |-----------| |-----------| - * | 1| 2| 3| | .| =|Ent| | A| B| C| |VLD|CMP|WBK| |VLD|PRV|RWD| - * |-----------| |-----------| |-----------| |-----------| |-----------| - * |L0 | _L9/0| |L1 | _L9 | |L2 | _L9 | |L3 | _L9 | |L4 | _L9 | - * *-----------* *-----------* *-----------* *-----------* *-----------* - * .-----------. .-----------. .-----------. .-----------. .-----------. - * | | | | | | | | |MP1| |MP2| | | |RST| |_L6|_L7|_L8| - * |-----------| |-----------| |-----------| |-----------| |-----------| - * | | | | | | | | | |MRS| | | | | | |_L3|_L4|_L5| - * |-----------| |-----------| |-----------| |-----------| |-----------| - * | | | | | | | | |MR1| |MR2| | | | | |_L0|_L1|_L2| - * |-----------| |-----------| |-----------| |-----------| |-----------| - * |L5 | _L9 | |L6 | _L9 | |L7 | _L9 | |L8 | _L9 | |L9 | | - * *-----------* *-----------* *-----------* *-----------* *-----------* + /*## Layout Config: + * .-----------. .-----------. .-----------. .-----------. .-----------. + * |7 |8 |9 | |+ |- |* | |^ |& |! | |VLU|Ver|WFD| |VLU|NXT|FFD| + * |-----------| |-----------| |-----------| |-----------| |-----------| + * |4 |5 |6 | |/ |% |, | |D |E |F | |MUT|C-W|CHR| |MUT|STP|PLY| + * |-----------| |-----------| |-----------| |-----------| |-----------| + * |1 |2 |3 | |. |= |Ent| |A |B |C | |VLD|CMP|WBK| |VLD|PRV|RWD| + * |-----------| |-----------| |-----------| |-----------| |-----------| + * |#L0|_L9/0 | |#L1|_L9 | |#L2|_L9 | |#L3|_L9 | |#L4|_L9 | + * *-----------* *-----------* *-----------* *-----------* *-----------* + * .-----------. .-----------. .-----------. .-----------. .-----------. + * | | | | | | | | |MP1| |MP2| | | |RST| |_L6|_L7|_L8| + * |-----------| |-----------| |-----------| |-----------| |-----------| + * | | | | | | | | | |MRS| | | | | | |_L3|_L4|_L5| + * |-----------| |-----------| |-----------| |-----------| |-----------| + * | | | | | | | | |MR1| |MR2| | | | | |_L0|_L1|_L2| + * |-----------| |-----------| |-----------| |-----------| |-----------| + * |#L5|_L9 | |#L6|_L9 | |#L7|_L9 | |#L8|_L9 | |#L9| | + * *-----------* *-----------* *-----------* *-----------* *-----------* */ - [_L0] = {{KC_7, KC_8, KC_9 }, {KC_4, KC_5, KC_6 }, {KC_1, KC_2, KC_3 }, {XXXXXXX, XXXXXXX, FN_ZERO}}, + [_L0] = {{KC_KP_7, KC_KP_8, KC_KP_9}, {KC_KP_4, KC_KP_5, KC_KP_6}, {KC_KP_1, KC_KP_2, KC_KP_3}, {XXXXXXX, XXXXXXX, FN_ZERO}}, [_L1] = {{KC_PPLS, KC_PMNS, KC_PAST}, {KC_PSLS, KC_PERC, KC_COMM}, {KC_PDOT, KC_EQL, KC_PENT}, {XXXXXXX, XXXXXXX, MO(_L9)}}, [_L2] = {{KC_CIRC, KC_AMPR, KC_EXLM}, {S(KC_D), S(KC_E), S(KC_F)}, {S(KC_A), S(KC_B), S(KC_C)}, {XXXXXXX, XXXXXXX, MO(_L9)}}, - [_L3] = {{KC_VOLU, F(0), KC_WFWD}, {KC_MUTE, M(1), M(0) }, {KC_VOLD, KC_MYCM, KC_WBAK}, {XXXXXXX, XXXXXXX, MO(_L9)}}, + [_L3] = {{KC_VOLU, QMK_REV, KC_WFWD}, {KC_MUTE, KC_WCLS, KC_WEB }, {KC_VOLD, KC_MYCM, KC_WBAK}, {XXXXXXX, XXXXXXX, MO(_L9)}}, [_L4] = {{KC_VOLU, KC_MNXT, KC_MFFD}, {KC_MUTE, KC_MSTP, KC_MPLY}, {KC_VOLD, KC_MPRV, KC_MRWD}, {XXXXXXX, XXXXXXX, MO(_L9)}}, [_L5] = {{_______, _______, _______}, {_______, _______, _______}, {_______, _______, _______}, {XXXXXXX, XXXXXXX, MO(_L9)}}, [_L6] = {{_______, _______, _______}, {_______, _______, _______}, {_______, _______, _______}, {XXXXXXX, XXXXXXX, MO(_L9)}}, @@ -66,96 +66,93 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_L9] = {{DF(_L6), DF(_L7), DF(_L8)}, {DF(_L3), DF(_L4), DF(_L5)}, {DF(_L0), DF(_L1), DF(_L2)}, {XXXXXXX, XXXXXXX, _______}}, }; -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { - switch(id) { - case 0: - if (record->event.pressed) { - return MACRO(I(10), D(LGUI), T(R), U(LGUI), END); - } - else { - SEND_STRING("chrome.exe\n"); - return false; - } - break; - case 1: - if (record->event.pressed) { - return MACRO(I(10), D(LCTL), T(W), U(LCTL), END); - } - break; - } - return MACRO_NONE; -}; - -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_FUNCTION(0), -}; - -void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { - switch (id) { - case 0: - if (record->event.pressed) { - SEND_STRING ("[Keyboard: " QMK_KEYBOARD "] -- [QMK Version: " QMK_VERSION "] -- [Keymap: " QMK_KEYMAP "]"); - } - break; - } -} - -void matrix_init_user(void) { - #ifdef BACKLIGHT_ENABLE - backlight_level(0); - #endif -} - -// Runs constantly in the background, in a loop. -void matrix_scan_user(void) { - uint8_t layer = biton32(layer_state); - - if (current_layer == layer) { - } - else { - current_layer = layer; - switch (layer) { - case 0: - backlight_level(0); - break; - case 1: - backlight_level(1); - break; - case 2: - backlight_level(2); - break; - case 3: - backlight_level(3); - break; - case 4: - backlight_level(4); - break; - case 5: - backlight_level(5); - break; - case 6: - backlight_level(6); - break; - case 7: - backlight_level(6); - break; - case 8: - backlight_level(6); - break; - case 9: - backlight_level(0); - break; - default: - backlight_level(0); - break; - } - } -} - bool process_record_user(uint16_t keycode, keyrecord_t *record) { - // Enable Dynamic Macros. + switch (keycode) { + case QMK_REV: + if (record->event.pressed) { + SEND_STRING(QMK_KEYBOARD "/" QMK_KEYMAP "@" QMK_VERSION ":" QMK_BUILDDATE); + } + return false; + break; + case KC_WEB: + if (record->event.pressed) { + SEND_STRING(SS_LGUI("r")); + wait_ms(100); + SEND_STRING("chrome.exe\n"); + } + return false; + break; + case KC_WCLS: + if (record->event.pressed) { + SEND_STRING (SS_LCTRL("w")); + } + return false; + break; + } + // Dynamic Macros. if (!process_record_dynamic_macro(keycode, record)) { return false; } return true; } + +void custom_backlight_level(uint8_t level) { + if (level > BACKLIGHT_LEVELS) + level = BACKLIGHT_LEVELS; + backlight_config.level = level; + backlight_config.enable = !!backlight_config.level; + backlight_set(backlight_config.level); +} + +void matrix_init_user(void) { + #ifdef BACKLIGHT_ENABLE + custom_backlight_level(0); + #endif +} + +void matrix_scan_user(void) { + +} + +uint32_t layer_state_set_user(uint32_t state) { + switch (biton32(state)) { + case _L0: + custom_backlight_level(0); + break; + case _L1: + custom_backlight_level(1); + break; + case _L2: + custom_backlight_level(2); + break; + case _L3: + custom_backlight_level(3); + break; + case _L4: + custom_backlight_level(4); + break; + case _L5: + custom_backlight_level(5); + break; + case _L6: + custom_backlight_level(6); + break; + case _L7: + custom_backlight_level(6); + break; + case _L8: + custom_backlight_level(6); + break; + case _L9: + custom_backlight_level(0); + break; + default: + custom_backlight_level(0); + break; + } + return state; +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/m10a/keymaps/gam3cat/readme.md b/keyboards/m10a/keymaps/gam3cat/readme.md index 879a6c5a3..5c68e8c89 100644 --- a/keyboards/m10a/keymaps/gam3cat/readme.md +++ b/keyboards/m10a/keymaps/gam3cat/readme.md @@ -2,13 +2,13 @@ make m10a:gam3cat ## Layout Config: .-----------. .-----------. .-----------. .-----------. .-----------. - | 7| 8| 9| | +| -| *| | ^| &| !| |VLU|Ver|WFD| |VLU|NXT|FFD| + |7 |8 |9 | |+ |- |* | |^ |& |! | |VLU|Ver|WFD| |VLU|NXT|FFD| |-----------| |-----------| |-----------| |-----------| |-----------| - | 4| 5| 6| | /| %| ,| | D| E| F| |MUT|C-W|CHR| |MUT|STP|PLY| + |4 |5 |6 | |/ |% |, | |D |E |F | |MUT|C-W|CHR| |MUT|STP|PLY| |-----------| |-----------| |-----------| |-----------| |-----------| - | 1| 2| 3| | .| =|Ent| | A| B| C| |VLD|CMP|WBK| |VLD|PRV|RWD| + |1 |2 |3 | |. |= |Ent| |A |B |C | |VLD|CMP|WBK| |VLD|PRV|RWD| |-----------| |-----------| |-----------| |-----------| |-----------| - |L0 | _L9/0| |L1 | _L9 | |L2 | _L9 | |L3 | _L9 | |L4 | _L9 | + |#L0|_L9/0 | |#L1|_L9 | |#L2|_L9 | |#L3|_L9 | |#L4|_L9 | *-----------* *-----------* *-----------* *-----------* *-----------* .-----------. .-----------. .-----------. .-----------. .-----------. | | | | | | | | |MP1| |MP2| | | |RST| |_L6|_L7|_L8| @@ -17,5 +17,5 @@ make m10a:gam3cat |-----------| |-----------| |-----------| |-----------| |-----------| | | | | | | | | |MR1| |MR2| | | | | |_L0|_L1|_L2| |-----------| |-----------| |-----------| |-----------| |-----------| - |L5 | _L9 | |L6 | _L9 | |L7 | _L9 | |L8 | _L9 | |L9 | | + |#L5|_L9 | |#L6|_L9 | |#L7|_L9 | |#L8|_L9 | |#L9| | *-----------* *-----------* *-----------* *-----------* *-----------* diff --git a/keyboards/m10a/keymaps/gam3cat/rules.mk b/keyboards/m10a/keymaps/gam3cat/rules.mk index 457a3d01d..00515a31e 100644 --- a/keyboards/m10a/keymaps/gam3cat/rules.mk +++ b/keyboards/m10a/keymaps/gam3cat/rules.mk @@ -1,3 +1,24 @@ -ifndef QUANTUM_DIR - include ../../../../Makefile -endif +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +TAP_DANCE_ENABLE = no # Enable TapDance functionality +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+1500) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # Nkey Rollover - If this doesn't work, add this to config.h: #define FORCE_NKRO +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +UNICODE_ENABLE = no # Unicode +UNICODEMAP_ENABLE = no # Enable extended unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Uses buzzer to emulate clicky switches. By default, uses the C6 pin, same as AUDIO_ENABLE. +#VARIABLE_TRACE = no # Use this to debug changes to variable values +API_SYSEX_ENABLE = no # This enables using the Quantum SYSEX API to send strings(+5390) +KEY_LOCK_ENABLE = no # This enables key lock(+260) +SPLIT_KEYBOARD = no # This enables split keyboard support and includes all necessary files located at quantum/split_common From e76bf17d36c3e23d4c780ab7dd0a10b5883889a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20=C4=90or=C4=91evi=C4=87?= Date: Thu, 3 Jan 2019 17:13:55 +0100 Subject: [PATCH 784/788] Remove redundant, language-specific aliases for KC_ALGR (#4720) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Use standard KC_ALGR, remove language-specific redefinitions * Use ALGR instead of ALTGR in BÉPO and Canadian multilingual keymaps * Remove BE_LALT, BE_LGUI aliases --- keyboards/contra/keymaps/maxr1998/keymap.c | 4 +- keyboards/ergodox_ez/keymaps/skug/keymap.c | 2 +- .../handwired/reddot/keymaps/default/keymap.c | 4 +- .../lets_split/keymaps/DE_simple/keymap.c | 2 +- keyboards/planck/keymaps/skug/keymap.c | 2 +- keyboards/preonic/keymaps/jacwib/keymap.c | 4 +- keyboards/satan/keymaps/dende_iso/keymap.c | 2 +- keyboards/xd75/keymaps/germanized/config.h | 3 - layouts/community/ergodox/bepo/keymap.c | 2 +- layouts/community/ergodox/bepo_csa/keymap.c | 12 +- .../ergodox/dvorak_svorak_a5/keymap.c | 2 +- .../community/ergodox/swedish-lindhe/keymap.c | 2 +- layouts/community/ergodox/swedish/keymap.c | 2 +- quantum/keymap_extras/keymap_belgian.h | 6 - quantum/keymap_extras/keymap_bepo.h | 150 +++++++++--------- .../keymap_canadian_multilingual.h | 46 +++--- quantum/keymap_extras/keymap_fr_ch.h | 3 - quantum/keymap_extras/keymap_french.h | 3 - quantum/keymap_extras/keymap_german.h | 3 - quantum/keymap_extras/keymap_german_ch.h | 3 - quantum/keymap_extras/keymap_hungarian.h | 3 - quantum/keymap_extras/keymap_italian.h | 6 - quantum/keymap_extras/keymap_neo2.h | 2 +- quantum/keymap_extras/keymap_nordic.h | 3 - quantum/keymap_extras/keymap_slovenian.h | 3 - quantum/keymap_extras/keymap_spanish.h | 3 - quantum/keymap_extras/keymap_uk.h | 3 - users/spacebarracecar/spacebarracecar.c | 4 +- users/spacebarracecar/spacebarracecar.h | 4 +- 29 files changed, 116 insertions(+), 172 deletions(-) diff --git a/keyboards/contra/keymaps/maxr1998/keymap.c b/keyboards/contra/keymaps/maxr1998/keymap.c index 87bf33894..4d731c08b 100644 --- a/keyboards/contra/keymaps/maxr1998/keymap.c +++ b/keyboards/contra/keymaps/maxr1998/keymap.c @@ -127,11 +127,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { return true; case NR_L3: if (record->event.pressed) { - register_code(DE_ALGR); + register_code(KC_ALGR); layer_on(_NUMROW_L3); } else { layer_off(_NUMROW_L3); - unregister_code(DE_ALGR); + unregister_code(KC_ALGR); } return false; default: diff --git a/keyboards/ergodox_ez/keymaps/skug/keymap.c b/keyboards/ergodox_ez/keymaps/skug/keymap.c index d17990481..b3696f3a9 100644 --- a/keyboards/ergodox_ez/keymaps/skug/keymap.c +++ b/keyboards/ergodox_ez/keymaps/skug/keymap.c @@ -80,7 +80,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TG(SYMB), KC_Y, KC_U, KC_I, KC_O, KC_P, NO_AA, KC_H, KC_J, KC_K, KC_L, LT(MDIA, NO_OSLH), LT(SYMB, NO_AE), KC_WFWD, KC_N, KC_M, KC_COMM, KC_DOT, NO_MINS, KC_RSPC, - KC_SPC, KC_BSPC, NO_ALGR, NO_ASTR, CTL_T(NO_TILD), + KC_SPC, KC_BSPC, KC_ALGR, NO_ASTR, CTL_T(NO_TILD), KC_HOME, NO_CIRC, KC_PGUP, KC_UP, KC_DOWN, KC_LGUI, ALT_T(KC_ESC), CTL_T(KC_ENT) diff --git a/keyboards/handwired/reddot/keymaps/default/keymap.c b/keyboards/handwired/reddot/keymaps/default/keymap.c index c67cc0e4c..73aeff225 100755 --- a/keyboards/handwired/reddot/keymaps/default/keymap.c +++ b/keyboards/handwired/reddot/keymaps/default/keymap.c @@ -8,14 +8,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LALT, FR_AMP, FR_EACU, FR_QUOT, FR_APOS, FR_LPRN, KC_BSPACE, KC_DELETE, FR_MINS, FR_EGRV, FR_UNDS, FR_CCED, FR_AGRV, FR_RPRN, FR_EQL, KC_INSERT, KC_HOME, KC_PGUP,\ KC_LGUI, FR_A, FR_Z, KC_E, KC_R, KC_T, KC_LSFT, KC_ENT, KC_Y, KC_U, KC_I, KC_O, KC_P, FR_CIRC, FR_DLR, KC_DELETE, KC_END, KC_PGDOWN, KC_KP_PLUS,\ KC_LCTL, FR_Q, KC_S, KC_D, KC_F, KC_G, KC_ENT, KC_H, KC_J, KC_K, KC_L, FR_M, FR_UGRV, FR_ASTR, KC_KP_1, KC_UP, KC_KP_3,\ - FR_LESS, FR_W, KC_X, KC_C, KC_V, KC_B, KC_SPACE, KC_SPACE, KC_N, FR_COMM, FR_SCLN, FR_COLN, FR_EXLM, FR_ALGR, KC_LEFT, KC_DOWN, KC_RIGHT, KC_KP_ENTER), + FR_LESS, FR_W, KC_X, KC_C, KC_V, KC_B, KC_SPACE, KC_SPACE, KC_N, FR_COMM, FR_SCLN, FR_COLN, FR_EXLM, KC_ALGR, KC_LEFT, KC_DOWN, KC_RIGHT, KC_KP_ENTER), [1] = KEYMAP( KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TAB, KC_CAPS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_FN0, KC_KP_SLASH, KC_KP_ASTERISK, KC_KP_MINUS,\ KC_LALT, FR_AMP, FR_EACU, FR_QUOT, FR_APOS, FR_LPRN, KC_BSPACE, KC_DELETE, FR_MINS, FR_EGRV, FR_UNDS, FR_CCED, FR_AGRV, FR_RPRN, FR_EQL, KC_7, KC_8, KC_9,\ KC_LGUI, FR_A, FR_Z, KC_E, KC_R, KC_T, KC_LSFT, KC_ENT, KC_Y, KC_U, KC_I, KC_O, KC_P, FR_CIRC, FR_DLR, KC_4, KC_5, KC_6, KC_KP_PLUS,\ KC_LCTL, FR_Q, KC_S, KC_D, KC_F, KC_G, KC_ENT, KC_H, KC_J, KC_K, KC_L, FR_M, FR_UGRV, FR_ASTR, KC_1, KC_2, KC_3,\ - FR_LESS, FR_W, KC_X, KC_C, KC_V, KC_B, KC_SPACE, KC_SPACE, KC_N, FR_COMM, FR_SCLN, FR_COLN, FR_EXLM, FR_ALGR, KC_LEFT, KC_DOWN, KC_RIGHT, KC_KP_ENTER), + FR_LESS, FR_W, KC_X, KC_C, KC_V, KC_B, KC_SPACE, KC_SPACE, KC_N, FR_COMM, FR_SCLN, FR_COLN, FR_EXLM, KC_ALGR, KC_LEFT, KC_DOWN, KC_RIGHT, KC_KP_ENTER), }; diff --git a/keyboards/lets_split/keymaps/DE_simple/keymap.c b/keyboards/lets_split/keymaps/DE_simple/keymap.c index d329bea4c..e801c241e 100644 --- a/keyboards/lets_split/keymaps/DE_simple/keymap.c +++ b/keyboards/lets_split/keymaps/DE_simple/keymap.c @@ -40,7 +40,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_ESC, DE_Q, DE_W, DE_E, DE_R, DE_T, DE_Z, DE_U, DE_I, DE_O, DE_P, KC_BSPC, \ KC_TAB, DE_A, DE_S, DE_D, DE_F, DE_G, DE_H, DE_J, DE_K, DE_L, DE_PLUS, DE_HASH, \ KC_LSFT, DE_Y, DE_X, DE_C, DE_V, DE_B, DE_N, DE_M, DE_COMM, DE_DOT, DE_MINS, KC_ENT , \ - KC_LCTL, KC_LALT, DE_ALGR, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ + KC_LCTL, KC_LALT, KC_ALGR, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ ), /* Lower diff --git a/keyboards/planck/keymaps/skug/keymap.c b/keyboards/planck/keymaps/skug/keymap.c index 29324a09e..86a1de767 100644 --- a/keyboards/planck/keymaps/skug/keymap.c +++ b/keyboards/planck/keymaps/skug/keymap.c @@ -60,7 +60,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , NO_AA , UTILITY, KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , NO_OSLH, NO_AE , KC_LSPO, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM, KC_DOT , NO_MINS, KC_RSPC, - LFT_CTR, KC_LALT, KC_LGUI, NO_AT , ESC_LOW, KC_ENT , KC_SPC , BSP_RAI, _______, NO_ALGR, NO_ASTR, RGT_CTR + LFT_CTR, KC_LALT, KC_LGUI, NO_AT , ESC_LOW, KC_ENT , KC_SPC , BSP_RAI, _______, KC_ALGR, NO_ASTR, RGT_CTR ), /* Raise diff --git a/keyboards/preonic/keymaps/jacwib/keymap.c b/keyboards/preonic/keymaps/jacwib/keymap.c index 0b63abce1..ffd588945 100644 --- a/keyboards/preonic/keymaps/jacwib/keymap.c +++ b/keyboards/preonic/keymaps/jacwib/keymap.c @@ -46,7 +46,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, NO_AM, \ KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, NO_AE, NO_OSLH, \ KC_LSFT, NO_LESS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_DOT, KC_COMM, NO_MINS, \ - KC_LCTL, KC_LALT, KC_LGUI, NO_ALGR, LOWER, KC_SPC, KC_ENT, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ + KC_LCTL, KC_LALT, KC_LGUI, KC_ALGR, LOWER, KC_SPC, KC_ENT, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ ), /* Lower @@ -109,7 +109,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, NO_AM, \ KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, NO_AE, NO_OSLH, \ KC_LSFT, NO_LESS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_DOT, KC_COMM, NO_MINS, \ - KC_LCTL, KC_LALT, KC_LGUI, NO_ALGR, MLOWER, KC_SPC, KC_ENT, MRAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ + KC_LCTL, KC_LALT, KC_LGUI, KC_ALGR, MLOWER, KC_SPC, KC_ENT, MRAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ ), /* Mac Lower diff --git a/keyboards/satan/keymaps/dende_iso/keymap.c b/keyboards/satan/keymaps/dende_iso/keymap.c index 205e9cb77..be1bfd23a 100644 --- a/keyboards/satan/keymaps/dende_iso/keymap.c +++ b/keyboards/satan/keymaps/dende_iso/keymap.c @@ -35,7 +35,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, DE_Z, KC_U, KC_I, KC_O, KC_P, DE_UE, DE_PLUS, \ FN_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, DE_OE, DE_AE, DE_HASH, KC_ENT, \ KC_LSFT, DE_LESS, DE_Y, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, DE_MINS, KC_RSFT, KC_DELETE, \ - KC_LCTL, KC_LGUI, KC_LALT, KC_SPACE, DE_ALGR, KC_RGUI, KC_APP, KC_RCTL), + KC_LCTL, KC_LGUI, KC_LALT, KC_SPACE, KC_ALGR, KC_RGUI, KC_APP, KC_RCTL), /* Keymap _FNK: Function Keys diff --git a/keyboards/xd75/keymaps/germanized/config.h b/keyboards/xd75/keymaps/germanized/config.h index 379b95471..dd3f32275 100644 --- a/keyboards/xd75/keymaps/germanized/config.h +++ b/keyboards/xd75/keymaps/germanized/config.h @@ -27,9 +27,6 @@ //Tap Dancing #define TAPPING_TERM 200 -// Alt gr -#define DE_ALGR KC_RALT - // normal characters #define DE_Z KC_Y #define DE_Y KC_Z diff --git a/layouts/community/ergodox/bepo/keymap.c b/layouts/community/ergodox/bepo/keymap.c index c33c3c255..6ea8cba68 100644 --- a/layouts/community/ergodox/bepo/keymap.c +++ b/layouts/community/ergodox/bepo/keymap.c @@ -50,7 +50,7 @@ KC_ESC, KC_INS, KC_LGUI, KC_LCTL, KC_LALT, KC_CAPSLOCK, BP_DCRC, BP_V, BP_D, BP_L, BP_J, BP_Z, BP_C, BP_T, BP_S, BP_R, BP_N, BP_M, KC_NUMLOCK, BP_APOS, BP_Q, BP_G, BP_H, BP_F, BP_CCED, - BP_ALGR, KC_RCTL, KC_RGUI, KC_PSCREEN, KC_PAUSE, + KC_ALGR, KC_RCTL, KC_RGUI, KC_PSCREEN, KC_PAUSE, DF(AZ_B), DF(BEPO), MO(NUMK), MO(FNAV), KC_RSHIFT, KC_ENTER), diff --git a/layouts/community/ergodox/bepo_csa/keymap.c b/layouts/community/ergodox/bepo_csa/keymap.c index 9526ea3f7..125301d44 100644 --- a/layouts/community/ergodox/bepo_csa/keymap.c +++ b/layouts/community/ergodox/bepo_csa/keymap.c @@ -105,7 +105,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_BSPC, BP_DCRC, BP_V, BP_D, BP_L, BP_J, BP_Z, BP_C, BP_T, BP_S, BP_R, BP_N, BP_M, KC_ENT, BP_APOS, BP_Q, BP_G, BP_H, BP_F, KC_RSFT, - BP_ALGR, BP_PERC, KC_APP, BP_CCED, KC_RCTL, + KC_ALGR, BP_PERC, KC_APP, BP_CCED, KC_RCTL, KC_LEFT, KC_RGHT, KC_UP, @@ -449,14 +449,14 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) register_code(KC_1 + (id - M_1)); break; case M_DEGR: - return MACRO(DOWN(CSA_ALTGR), D(SCLN), END); + return MACRO(DOWN(KC_ALGR), D(SCLN), END); case M_SCLN: return MACRO(D(SCLN), END); case M_GRV: - return MACRO(I(75), DOWN(CSA_ALTGR), TYPE(CSA_DCRC), UP(CSA_ALTGR), T(SPACE), END); + return MACRO(I(75), DOWN(KC_ALGR), TYPE(CSA_DCRC), UP(KC_ALGR), T(SPACE), END); case M_NBSP: // use weak mod such that pressing another key will not be affected - add_weak_mods(MOD_BIT(CSA_ALTGR)); + add_weak_mods(MOD_BIT(KC_ALGR)); return MACRO(D(SPACE), END); } } else { @@ -466,11 +466,11 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) unregister_code(KC_1 + (id - M_1)); break; case M_DEGR: - return MACRO(UP(CSA_ALTGR), U(SCLN), END); + return MACRO(UP(KC_ALGR), U(SCLN), END); case M_SCLN: return MACRO(U(SCLN), END); case M_NBSP: - del_weak_mods(MOD_BIT(CSA_ALTGR)); + del_weak_mods(MOD_BIT(KC_ALGR)); return MACRO(U(SPACE), END); } } diff --git a/layouts/community/ergodox/dvorak_svorak_a5/keymap.c b/layouts/community/ergodox/dvorak_svorak_a5/keymap.c index 2668fce86..98df73289 100644 --- a/layouts/community/ergodox/dvorak_svorak_a5/keymap.c +++ b/layouts/community/ergodox/dvorak_svorak_a5/keymap.c @@ -171,7 +171,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_Y, KC_U, KC_I, KC_O, KC_P, NO_AA, KC_H, KC_J, KC_K, KC_L, NO_OSLH, NO_AE, KC_DELT, KC_N, KC_M, KC_COMM, KC_DOT, NO_MINS, KC_RSFT, - NO_ALGR, KC_DOWN, KC_UP, KC_LEFT, KC_RGHT, + KC_ALGR, KC_DOWN, KC_UP, KC_LEFT, KC_RGHT, KC_HOME, KC_END, KC_PGUP, KC_PGDN, KC_ENT, KC_SPACE diff --git a/layouts/community/ergodox/swedish-lindhe/keymap.c b/layouts/community/ergodox/swedish-lindhe/keymap.c index e977ab994..a46408793 100644 --- a/layouts/community/ergodox/swedish-lindhe/keymap.c +++ b/layouts/community/ergodox/swedish-lindhe/keymap.c @@ -63,7 +63,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TG(SYMB), KC_Y, KC_U, KC_I, KC_O, KC_P, NO_AA, KC_H, KC_J, KC_K, KC_L, NO_OSLH, NO_AE, KC_DELT, KC_N, KC_M, KC_COMM, KC_DOT, NO_MINS, KC_RSFT, - NO_ALGR, KC_DOWN, KC_UP, KC_LEFT, KC_RGHT, + KC_ALGR, KC_DOWN, KC_UP, KC_LEFT, KC_RGHT, KC_HOME, KC_END, KC_PGUP, KC_PGDN, KC_TAB, LT(MDIA, KC_ENT) diff --git a/layouts/community/ergodox/swedish/keymap.c b/layouts/community/ergodox/swedish/keymap.c index d2b9b40d1..0cda8511f 100644 --- a/layouts/community/ergodox/swedish/keymap.c +++ b/layouts/community/ergodox/swedish/keymap.c @@ -76,7 +76,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_H, KC_J, KC_K, KC_L, LT(MDIA, NO_OSLH), GUI_T(NO_AE), MEH_T(KC_NO), KC_N, KC_M, KC_COMM, KC_DOT, CTL_T(NO_MINS), KC_RSFT, KC_UP, KC_DOWN, NO_CIRC, NO_ASTR, KC_FN1, - NO_ALGR, CTL_T(KC_ESC), + KC_ALGR, CTL_T(KC_ESC), KC_PGUP, KC_PGDN,KC_TAB, KC_ENT ), diff --git a/quantum/keymap_extras/keymap_belgian.h b/quantum/keymap_extras/keymap_belgian.h index 573fa2e8a..ab89fbabf 100644 --- a/quantum/keymap_extras/keymap_belgian.h +++ b/quantum/keymap_extras/keymap_belgian.h @@ -18,12 +18,6 @@ #include "keymap.h" -#define BE_LGUI KC_LALT -#define BE_LALT KC_LGUI - -// Alt gr -#define BE_ALGR KC_RALT - // Normal characters // Line 1 #define BE_SUP2 KC_GRV diff --git a/quantum/keymap_extras/keymap_bepo.h b/quantum/keymap_extras/keymap_bepo.h index e6545a7a8..8d7b36ca3 100644 --- a/quantum/keymap_extras/keymap_bepo.h +++ b/quantum/keymap_extras/keymap_bepo.h @@ -19,12 +19,6 @@ #include "keymap.h" -// Alt gr -#ifndef ALTGR -#define ALTGR(kc) ALGR(kc) -#endif -#define BP_ALGR KC_RALT - // Normal characters // First row (on usual keyboards) #define BP_DOLLAR KC_GRAVE // $ @@ -139,138 +133,138 @@ // AltGr-ed characters // First row -#define BP_EN_DASH ALTGR(BP_DOLLAR) // – +#define BP_EN_DASH ALGR(BP_DOLLAR) // – #define BP_NDSH BP_EN_DASH -#define BP_EM_DASH ALTGR(KC_1) // — +#define BP_EM_DASH ALGR(KC_1) // — #define BP_MDSH BP_EM_DASH -#define BP_LESS ALTGR(KC_2) // < -#define BP_GREATER ALTGR(KC_3) // > +#define BP_LESS ALGR(KC_2) // < +#define BP_GREATER ALGR(KC_3) // > #define BP_GRTR BP_GREATER -#define BP_LBRACKET ALTGR(KC_4) // [ +#define BP_LBRACKET ALGR(KC_4) // [ #define BP_LBRC BP_LBRACKET -#define BP_RBRACKET ALTGR(KC_5) // ] +#define BP_RBRACKET ALGR(KC_5) // ] #define BP_RBRC BP_RBRACKET -#define BP_CIRCUMFLEX ALTGR(KC_6) // ^ +#define BP_CIRCUMFLEX ALGR(KC_6) // ^ #define BP_CIRC BP_CIRCUMFLEX -#define BP_PLUS_MINUS ALTGR(KC_7) // ± +#define BP_PLUS_MINUS ALGR(KC_7) // ± #define BP_PSMS BP_PLUS_MINUS -#define BP_MATH_MINUS ALTGR(KC_8) // − +#define BP_MATH_MINUS ALGR(KC_8) // − #define BP_MMNS BP_MATH_MINUS -#define BP_OBELUS ALTGR(KC_9) // ÷ +#define BP_OBELUS ALGR(KC_9) // ÷ #define BP_OBEL BP_OBELUS // more conventional name of the symbol #define BP_DIVISION_SIGN BP_OBELUS #define BP_DVSN BP_DIVISION_SIGN -#define BP_TIMES ALTGR(KC_0) // × +#define BP_TIMES ALGR(KC_0) // × #define BP_TIMS BP_TIMES -#define BP_DIFFERENT ALTGR(BP_EQUAL) // ≠ +#define BP_DIFFERENT ALGR(BP_EQUAL) // ≠ #define BP_DIFF BP_DIFFERENT -#define BP_PERMILLE ALTGR(BP_PERCENT) // ‰ +#define BP_PERMILLE ALGR(BP_PERCENT) // ‰ #define BP_PMIL BP_PERMILLE // Second row -#define BP_PIPE ALTGR(BP_B) // | -#define BP_DEAD_ACUTE ALTGR(BP_E_ACUTE) // dead ´ +#define BP_PIPE ALGR(BP_B) // | +#define BP_DEAD_ACUTE ALGR(BP_E_ACUTE) // dead ´ #define BP_DACT BP_DEAD_ACUTE -#define BP_AMPERSAND ALTGR(BP_P) // & +#define BP_AMPERSAND ALGR(BP_P) // & #define BP_AMPR BP_AMPERSAND -#define BP_OE_LIGATURE ALTGR(BP_O) // œ +#define BP_OE_LIGATURE ALGR(BP_O) // œ #define BP_OE BP_OE_LIGATURE -#define BP_DEAD_GRAVE ALTGR(BP_E_GRAVE) // ` +#define BP_DEAD_GRAVE ALGR(BP_E_GRAVE) // ` #define BP_DGRV BP_DEAD_GRAVE -#define BP_INVERTED_EXCLAIM ALTGR(BP_DEAD_CIRCUMFLEX) // ¡ +#define BP_INVERTED_EXCLAIM ALGR(BP_DEAD_CIRCUMFLEX) // ¡ #define BP_IXLM BP_INVERTED_EXCLAIM -#define BP_DEAD_CARON ALTGR(BP_V) // dead ˇ +#define BP_DEAD_CARON ALGR(BP_V) // dead ˇ #define BP_DCAR BP_DEAD_CARON -#define BP_ETH ALTGR(BP_D) // ð -#define BP_DEAD_SLASH ALTGR(BP_L) // dead / +#define BP_ETH ALGR(BP_D) // ð +#define BP_DEAD_SLASH ALGR(BP_L) // dead / #define BP_DSLH BP_DEAD_SLASH -#define BP_IJ_LIGATURE ALTGR(BP_J) // ij +#define BP_IJ_LIGATURE ALGR(BP_J) // ij #define BP_IJ BP_IJ_LIGATURE -#define BP_SCHWA ALTGR(BP_Z) // ə +#define BP_SCHWA ALGR(BP_Z) // ə #define BP_SCWA BP_SCHWA -#define BP_DEAD_BREVE ALTGR(BP_W) // dead ˘ +#define BP_DEAD_BREVE ALGR(BP_W) // dead ˘ #define BP_DBRV BP_DEAD_BREVE // Third row -#define BP_AE_LIGATURE ALTGR(BP_A) // æ +#define BP_AE_LIGATURE ALGR(BP_A) // æ #define BP_AE BP_AE_LIGATURE -#define BP_U_GRAVE ALTGR(BP_U) // ù +#define BP_U_GRAVE ALGR(BP_U) // ù #define BP_UGRV BP_U_GRAVE -#define BP_DEAD_TREMA ALTGR(BP_I) // dead ¨ (trema/umlaut/diaresis) +#define BP_DEAD_TREMA ALGR(BP_I) // dead ¨ (trema/umlaut/diaresis) #define BP_DTRM BP_DEAD_TREMA -#define BP_EURO ALTGR(BP_E) // € -#define BP_TYPOGRAPHICAL_APOSTROPHE ALTGR(BP_COMMA) // ’ +#define BP_EURO ALGR(BP_E) // € +#define BP_TYPOGRAPHICAL_APOSTROPHE ALGR(BP_COMMA) // ’ #define BP_TAPO BP_TYPOGRAPHICAL_APOSTROPHE -#define BP_COPYRIGHT ALTGR(BP_C) // © +#define BP_COPYRIGHT ALGR(BP_C) // © #define BP_CPRT BP_COPYRIGHT -#define BP_THORN ALTGR(BP_T) // þ +#define BP_THORN ALGR(BP_T) // þ #define BP_THRN BP_THORN -#define BP_SHARP_S ALTGR(BP_S) // ß +#define BP_SHARP_S ALGR(BP_S) // ß #define BP_SRPS BP_SHARP_S -#define BP_REGISTERED_TRADEMARK ALTGR(BP_R) // ® +#define BP_REGISTERED_TRADEMARK ALGR(BP_R) // ® #define BP_RTM BP_REGISTERED_TRADEMARK -#define BP_DEAD_TILDE ALTGR(BP_N) // dead ~ +#define BP_DEAD_TILDE ALGR(BP_N) // dead ~ #define BP_DTLD BP_DEAD_TILDE -#define BP_DEAD_MACRON ALTGR(BP_M) // dead ¯ +#define BP_DEAD_MACRON ALGR(BP_M) // dead ¯ #define BP_DMCR BP_DEAD_MACRON -#define BP_DEAD_CEDILLA ALTGR(BP_C_CEDILLA) // dead ¸ +#define BP_DEAD_CEDILLA ALGR(BP_C_CEDILLA) // dead ¸ #define BP_DCED BP_DEAD_CEDILLA // Fourth row -#define BP_NONUS_SLASH ALTGR(BP_E_CIRCUMFLEX) // / on non-us backslash key (102nd key, ê in bépo) +#define BP_NONUS_SLASH ALGR(BP_E_CIRCUMFLEX) // / on non-us backslash key (102nd key, ê in bépo) #define BP_NUSL BP_NONUS_SLASH -#define BP_BACKSLASH ALTGR(BP_A_GRAVE) /* \ */ +#define BP_BACKSLASH ALGR(BP_A_GRAVE) /* \ */ #define BP_BSLS BP_BACKSLASH -#define BP_LEFT_CURLY_BRACE ALTGR(BP_Y) // { +#define BP_LEFT_CURLY_BRACE ALGR(BP_Y) // { #define BP_LCBR BP_LEFT_CURLY_BRACE -#define BP_RIGHT_CURLY_BRACE ALTGR(BP_X) // } +#define BP_RIGHT_CURLY_BRACE ALGR(BP_X) // } #define BP_RCBR BP_RIGHT_CURLY_BRACE -#define BP_ELLIPSIS ALTGR(BP_DOT) // … +#define BP_ELLIPSIS ALGR(BP_DOT) // … #define BP_ELPS BP_ELLIPSIS -#define BP_TILDE ALTGR(BP_K) // ~ +#define BP_TILDE ALGR(BP_K) // ~ #define BP_TILD BP_TILDE -#define BP_INVERTED_QUESTION ALTGR(BP_QUESTION) // ¿ +#define BP_INVERTED_QUESTION ALGR(BP_QUESTION) // ¿ #define BP_IQST BP_INVERTED_QUESTION -#define BP_DEAD_RING ALTGR(BP_Q) // dead ° +#define BP_DEAD_RING ALGR(BP_Q) // dead ° #define BP_DRNG BP_DEAD_RING -#define BP_DEAD_GREEK ALTGR(BP_G) // dead Greek key (following key will make a Greek letter) +#define BP_DEAD_GREEK ALGR(BP_G) // dead Greek key (following key will make a Greek letter) #define BP_DGRK BP_DEAD_GREEK -#define BP_DAGGER ALTGR(BP_H) // † +#define BP_DAGGER ALGR(BP_H) // † #define BP_DAGR BP_DAGGER -#define BP_DEAD_OGONEK ALTGR(BP_F) // dead ˛ +#define BP_DEAD_OGONEK ALGR(BP_F) // dead ˛ #define BP_DOGO BP_DEAD_OGONEK // Space bar -#define BP_UNDERSCORE ALTGR(KC_SPACE) // _ +#define BP_UNDERSCORE ALGR(KC_SPACE) // _ #define BP_UNDS BP_UNDERSCORE // AltGr-Shifted characters (different from capitalised AltGr-ed characters) // First row -#define BP_PARAGRAPH ALTGR(BP_HASH) // ¶ +#define BP_PARAGRAPH ALGR(BP_HASH) // ¶ #define BP_PARG BP_PARAGRAPH -#define BP_LOW_DOUBLE_QUOTE ALTGR(BP_1) // „ +#define BP_LOW_DOUBLE_QUOTE ALGR(BP_1) // „ #define BP_LWQT BP_LOW_DOUBLE_QUOTE -#define BP_LEFT_DOUBLE_QUOTE ALTGR(BP_2) // “ +#define BP_LEFT_DOUBLE_QUOTE ALGR(BP_2) // “ #define BP_LDQT BP_LEFT_DOUBLE_QUOTE -#define BP_RIGHT_DOUBLE_QUOTE ALTGR(BP_3) // ” +#define BP_RIGHT_DOUBLE_QUOTE ALGR(BP_3) // ” #define BP_RDQT BP_RIGHT_DOUBLE_QUOTE -#define BP_LESS_OR_EQUAL ALTGR(BP_4) // ≤ +#define BP_LESS_OR_EQUAL ALGR(BP_4) // ≤ #define BP_LEQL BP_LESS_OR_EQUAL -#define BP_GREATER_OR_EQUAL ALTGR(BP_5) // ≥ +#define BP_GREATER_OR_EQUAL ALGR(BP_5) // ≥ #define BP_GEQL BP_GREATER_OR_EQUAL -// nothing on ALTGR(BP_6) -#define BP_NEGATION ALTGR(BP_7) // ¬ +// nothing on ALGR(BP_6) +#define BP_NEGATION ALGR(BP_7) // ¬ #define BP_NEGT BP_NEGATION -#define BP_ONE_QUARTER ALTGR(BP_8) // ¼ +#define BP_ONE_QUARTER ALGR(BP_8) // ¼ #define BP_1QRT BP_ONE_QUARTER -#define BP_ONE_HALF ALTGR(BP_9) // ½ +#define BP_ONE_HALF ALGR(BP_9) // ½ #define BP_1HLF BP_ONE_HALF -#define BP_THREE_QUARTERS ALTGR(BP_0) // ¾ +#define BP_THREE_QUARTERS ALGR(BP_0) // ¾ #define BP_3QRT BP_THREE_QUARTERS -#define BP_MINUTES ALTGR(BP_DEGREE) // ′ +#define BP_MINUTES ALGR(BP_DEGREE) // ′ #define BP_MNUT BP_MINUTES -#define BP_SECONDS ALTGR(BP_GRAVE) // ″ +#define BP_SECONDS ALGR(BP_GRAVE) // ″ #define BP_SCND BP_SECONDS // Second row @@ -278,7 +272,7 @@ #define BP_BPIP BP_BROKEN_PIPE #define BP_DEAD_DOUBLE_ACUTE LSFT(BP_DEAD_ACUTE) // ˝ #define BP_DDCT BP_DEAD_DOUBLE_ACUTE -#define BP_SECTION ALTGR(LSFT(BP_P)) // § +#define BP_SECTION ALGR(LSFT(BP_P)) // § #define BP_SECT BP_SECTION // LSFT(BP_DEAD_GRAVE) is actually the same character as LSFT(BP_PERCENT) #define BP_GRAVE_BIS LSFT(BP_DEAD_GRAVE) // ` @@ -289,35 +283,35 @@ #define BP_DDTA BP_DEAD_DOT_ABOVE #define BP_DEAD_CURRENCY LSFT(BP_EURO) // dead ¤ (next key will generate a currency code like ¥ or £) #define BP_DCUR BP_DEAD_CURRENCY -#define BP_DEAD_HORN LSFT(ALTGR(BP_COMMA)) // dead ̛ +#define BP_DEAD_HORN LSFT(ALGR(BP_COMMA)) // dead ̛ #define BP_DHRN BP_DEAD_HORN -#define BP_LONG_S LSFT(ALTGR(BP_C)) // ſ +#define BP_LONG_S LSFT(ALGR(BP_C)) // ſ #define BP_LNGS BP_LONG_S #define BP_TRADEMARK LSFT(BP_REGISTERED_TRADEMARK) // ™ #define BP_TM BP_TRADEMARK -#define BP_ORDINAL_INDICATOR_O LSFT(ALTGR(BP_M)) // º +#define BP_ORDINAL_INDICATOR_O LSFT(ALGR(BP_M)) // º #define BP_ORDO BP_ORDINAL_INDICATOR_O #define BP_DEAD_COMMA LSFT(BP_DEAD_CEDILLA) // dead ˛ #define BP_DCOM BP_DEAD_COMMA // Fourth row -#define BP_LEFT_QUOTE LSFT(ALTGR(BP_Y)) // ‘ +#define BP_LEFT_QUOTE LSFT(ALGR(BP_Y)) // ‘ #define BP_LQOT BP_LEFT_QUOTE -#define BP_RIGHT_QUOTE LSFT(ALTGR(BP_X)) // ’ +#define BP_RIGHT_QUOTE LSFT(ALGR(BP_X)) // ’ #define BP_RQOT BP_RIGHT_QUOTE -#define BP_INTERPUNCT LSFT(ALTGR(BP_DOT)) // · +#define BP_INTERPUNCT LSFT(ALGR(BP_DOT)) // · #define BP_IPCT BP_INTERPUNCT -#define BP_DEAD_HOOK_ABOVE LSFT(ALTGR(BP_QUESTION)) // dead ̉ +#define BP_DEAD_HOOK_ABOVE LSFT(ALGR(BP_QUESTION)) // dead ̉ #define BP_DHKA BP_DEAD_HOOK_ABOVE #define BP_DEAD_UNDERDOT LSFT(BP_DEAD_RING) // dead ̣ #define BP_DUDT BP_DEAD_UNDERDOT #define BP_DOUBLE_DAGGER LSFT(BP_DAGGER) // ‡ #define BP_DDGR BP_DOUBLE_DAGGER -#define BP_ORDINAL_INDICATOR_A LSFT(ALTGR(BP_F)) // ª +#define BP_ORDINAL_INDICATOR_A LSFT(ALGR(BP_F)) // ª #define BP_ORDA BP_ORDINAL_INDICATOR_A // Space bar -#define BP_NARROW_NON_BREAKING_SPACE ALTGR(BP_NON_BREAKING_SPACE) +#define BP_NARROW_NON_BREAKING_SPACE ALGR(BP_NON_BREAKING_SPACE) #define BP_NNBS BP_NARROW_NON_BREAKING_SPACE #endif diff --git a/quantum/keymap_extras/keymap_canadian_multilingual.h b/quantum/keymap_extras/keymap_canadian_multilingual.h index fbeef2187..2b5b95d6f 100644 --- a/quantum/keymap_extras/keymap_canadian_multilingual.h +++ b/quantum/keymap_extras/keymap_canadian_multilingual.h @@ -13,19 +13,11 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#ifndef KEYMAP_CANADIAN_MULTILINGUAG_H -#define KEYMAP_CANADIAN_MULTILINGUAG_H +#ifndef KEYMAP_CANADIAN_MULTILINGUAL_H +#define KEYMAP_CANADIAN_MULTILINGUAL_H #include "keymap.h" -// Alt gr -#ifndef ALTGR -#define ALTGR(kc) ALGR(kc) -#endif - -#define CSA_ALTGR KC_RALT -#define CSA_ALGR CSA_ALTGR - #ifndef GR2A #define GR2A(kc) RCTL(kc) #endif @@ -75,43 +67,43 @@ // Alt Gr-ed characters // First row -#define CSA_PIPE ALTGR(CSA_SLASH) // | -#define CSA_CURRENCY ALTGR(KC_4) // ¤ +#define CSA_PIPE ALGR(CSA_SLASH) // | +#define CSA_CURRENCY ALGR(KC_4) // ¤ #define CSA_CURR CSA_CURRENCY -#define CSA_LEFT_CURLY_BRACE ALTGR(KC_7) // { +#define CSA_LEFT_CURLY_BRACE ALGR(KC_7) // { #define CSA_LCBR CSA_LEFT_CURLY_BRACE -#define CSA_RIGHT_CURLY_BRACE ALTGR(KC_8) // } +#define CSA_RIGHT_CURLY_BRACE ALGR(KC_8) // } #define CSA_RCBR CSA_RIGHT_CURLY_BRACE -#define CSA_LBRACKET ALTGR(KC_9) // [ +#define CSA_LBRACKET ALGR(KC_9) // [ #define CSA_LBRC CSA_LBRACKET -#define CSA_RBRACKET ALTGR(KC_0) // ] +#define CSA_RBRACKET ALGR(KC_0) // ] #define CSA_RBRC CSA_RBRACKET -#define CSA_NEGATION ALTGR(KC_EQUAL) // ¬ +#define CSA_NEGATION ALGR(KC_EQUAL) // ¬ #define CSA_NEGT CSA_NEGATION // Second row // euro symbol not available on Linux? (X.org) -#define CSA_EURO ALTGR(KC_E) // € -#define CSA_DEAD_GRAVE ALTGR(CSA_DEAD_CIRCUMFLEX) +#define CSA_EURO ALGR(KC_E) // € +#define CSA_DEAD_GRAVE ALGR(CSA_DEAD_CIRCUMFLEX) #define CSA_DGRV CSA_DEAD_GRAVE // dead ` -#define CSA_DEAD_TILDE ALTGR(CSA_C_CEDILLA) // ~ +#define CSA_DEAD_TILDE ALGR(CSA_C_CEDILLA) // ~ #define CSA_DTLD CSA_DEAD_TILDE // Third row -#define CSA_DEGREE ALTGR(KC_SCOLON) // ° +#define CSA_DEGREE ALGR(KC_SCOLON) // ° #define CSA_DEGR CSA_DEGREE // Fourth row -#define CSA_LEFT_GUILLEMET ALTGR(KC_Z) // « +#define CSA_LEFT_GUILLEMET ALGR(KC_Z) // « #define CSA_LGIL CSA_LEFT_GUILLEMET -#define CSA_RIGHT_GUILLEMET ALTGR(KC_X) // » +#define CSA_RIGHT_GUILLEMET ALGR(KC_X) // » #define CSA_RGIL CSA_RIGHT_GUILLEMET -#define CSA_LESS ALTGR(KC_COMMA) // < -#define CSA_GREATER ALTGR(KC_DOT) // > +#define CSA_LESS ALGR(KC_COMMA) // < +#define CSA_GREATER ALGR(KC_DOT) // > #define CSA_GRTR CSA_GREATER // Space bar -#define CSA_NON_BREAKING_SPACE ALTGR(KC_SPACE) +#define CSA_NON_BREAKING_SPACE ALGR(KC_SPACE) #define CSA_NBSP CSA_NON_BREAKING_SPACE // GR2A-ed characters @@ -198,7 +190,7 @@ // nothing on 2 #define CSA_POUND GR2A(LSFT(KC_3)) // £ #define CSA_GBP CSA_POUND_SIGN -// already on ALTGR(KC_E) +// already on ALGR(KC_E) #define CSA_EURO_BIS GR2A(LSFT(KC_4)) // € #define CSA_EURB CSA_EURO_BIS #define CSA_THREE_EIGHTHS GR2A(LSFT(KC_5)) // ⅜ diff --git a/quantum/keymap_extras/keymap_fr_ch.h b/quantum/keymap_extras/keymap_fr_ch.h index 4eeca7209..69f9547bb 100644 --- a/quantum/keymap_extras/keymap_fr_ch.h +++ b/quantum/keymap_extras/keymap_fr_ch.h @@ -18,9 +18,6 @@ #include "keymap.h" -// Alt gr -#define FR_CH_ALGR KC_RALT - // normal characters #define FR_CH_Z KC_Y #define FR_CH_Y KC_Z diff --git a/quantum/keymap_extras/keymap_french.h b/quantum/keymap_extras/keymap_french.h index d2de859ee..bef775470 100644 --- a/quantum/keymap_extras/keymap_french.h +++ b/quantum/keymap_extras/keymap_french.h @@ -18,9 +18,6 @@ #include "keymap.h" -// Alt gr -#define FR_ALGR KC_RALT - // Normal characters #define FR_SUP2 KC_GRV #define FR_AMP KC_1 diff --git a/quantum/keymap_extras/keymap_german.h b/quantum/keymap_extras/keymap_german.h index a215570fd..0ba3570df 100644 --- a/quantum/keymap_extras/keymap_german.h +++ b/quantum/keymap_extras/keymap_german.h @@ -19,9 +19,6 @@ #include "keymap.h" -// Alt gr -#define DE_ALGR KC_RALT - // normal characters #define DE_Z KC_Y #define DE_Y KC_Z diff --git a/quantum/keymap_extras/keymap_german_ch.h b/quantum/keymap_extras/keymap_german_ch.h index f0376a17c..bd1ef89a1 100644 --- a/quantum/keymap_extras/keymap_german_ch.h +++ b/quantum/keymap_extras/keymap_german_ch.h @@ -18,9 +18,6 @@ #include "keymap.h" -// Alt gr -#define CH_ALGR KC_RALT - // normal characters #define CH_Z KC_Y #define CH_Y KC_Z diff --git a/quantum/keymap_extras/keymap_hungarian.h b/quantum/keymap_extras/keymap_hungarian.h index cd2dc94cf..ff43535f3 100644 --- a/quantum/keymap_extras/keymap_hungarian.h +++ b/quantum/keymap_extras/keymap_hungarian.h @@ -19,9 +19,6 @@ #include "keymap.h" -// Alt gr -#define HU_ALGR KC_RALT - // basic letters #define HU_Z KC_Y #define HU_Y KC_Z diff --git a/quantum/keymap_extras/keymap_italian.h b/quantum/keymap_extras/keymap_italian.h index f62908150..fe0f5eb84 100644 --- a/quantum/keymap_extras/keymap_italian.h +++ b/quantum/keymap_extras/keymap_italian.h @@ -19,13 +19,7 @@ #include "keymap.h" -// Alt gr -#define IT_ALGR KC_RALT - // normal characters - - - #define IT_A KC_A #define IT_B KC_B #define IT_C KC_C diff --git a/quantum/keymap_extras/keymap_neo2.h b/quantum/keymap_extras/keymap_neo2.h index 174f4a6ee..818a739c7 100644 --- a/quantum/keymap_extras/keymap_neo2.h +++ b/quantum/keymap_extras/keymap_neo2.h @@ -73,6 +73,6 @@ #define NEO_L1_R DE_HASH #define NEO_L2_L DE_LESS -#define NEO_L2_R DE_ALGR +#define NEO_L2_R KC_ALGR #endif diff --git a/quantum/keymap_extras/keymap_nordic.h b/quantum/keymap_extras/keymap_nordic.h index 4210d3714..551a4212b 100644 --- a/quantum/keymap_extras/keymap_nordic.h +++ b/quantum/keymap_extras/keymap_nordic.h @@ -18,9 +18,6 @@ #include "keymap.h" -// Alt gr -#define NO_ALGR KC_RALT - // Normal characters #define NO_HALF KC_GRV #define NO_PLUS KC_MINS diff --git a/quantum/keymap_extras/keymap_slovenian.h b/quantum/keymap_extras/keymap_slovenian.h index 47f5bceed..892283e70 100644 --- a/quantum/keymap_extras/keymap_slovenian.h +++ b/quantum/keymap_extras/keymap_slovenian.h @@ -20,9 +20,6 @@ #include "keymap.h" -// Alt gr -#define SI_ALGR KC_RALT - //Swapped Z and Y #define SI_Z KC_Y #define SI_Y KC_Z diff --git a/quantum/keymap_extras/keymap_spanish.h b/quantum/keymap_extras/keymap_spanish.h index 19d12551a..1f183327f 100644 --- a/quantum/keymap_extras/keymap_spanish.h +++ b/quantum/keymap_extras/keymap_spanish.h @@ -18,9 +18,6 @@ #include "keymap.h" -// Alt gr -#define ES_ALGR KC_RALT - // Normal characters #define ES_OVRR KC_GRV #define ES_APOS KC_MINS diff --git a/quantum/keymap_extras/keymap_uk.h b/quantum/keymap_extras/keymap_uk.h index a7bcd697e..cc3d0039e 100644 --- a/quantum/keymap_extras/keymap_uk.h +++ b/quantum/keymap_extras/keymap_uk.h @@ -18,9 +18,6 @@ #include "keymap.h" -// Alt gr -#define UK_ALGR KC_RALT - // Normal characters #define UK_HASH KC_NUHS #define UK_BSLS KC_NUBS diff --git a/users/spacebarracecar/spacebarracecar.c b/users/spacebarracecar/spacebarracecar.c index f7048869e..130d7dc2d 100644 --- a/users/spacebarracecar/spacebarracecar.c +++ b/users/spacebarracecar/spacebarracecar.c @@ -211,11 +211,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { timer_timeout(); if (lshift || rshift){ unregister_code(KC_LSFT); - register_code(DE_ALGR); + register_code(KC_ALGR); unregister_code(DE_PLUS); register_code(DE_PLUS); unregister_code(DE_PLUS); - unregister_code(DE_ALGR); + unregister_code(KC_ALGR); register_code(KC_LSFT); } else { register_code(KC_LSFT); diff --git a/users/spacebarracecar/spacebarracecar.h b/users/spacebarracecar/spacebarracecar.h index 035c1ac79..d0259b73c 100644 --- a/users/spacebarracecar/spacebarracecar.h +++ b/users/spacebarracecar/spacebarracecar.h @@ -192,7 +192,7 @@ return false; if (record->event.pressed) { \ timer_timeout(); \ unregister_code(KC_LSFT); \ - register_code(DE_ALGR); \ + register_code(KC_ALGR); \ if (lshift || rshift) { \ unregister_code(kc2); \ register_code(kc2); \ @@ -203,7 +203,7 @@ if (record->event.pressed) { \ register_code(kc1); \ unregister_code(kc1); \ } \ - unregister_code(DE_ALGR); \ + unregister_code(KC_ALGR); \ } \ return false; From 6f80217958e575aab3c247e286cf919ff75bc72f Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Thu, 3 Jan 2019 16:33:32 -0800 Subject: [PATCH 785/788] Snagpad: fix Configurator mismatch (#4767) Key objects for the LAYOUT_numpad_5x4 macro were out-of-order in info.json. Also white space changes because I'm that guy. --- keyboards/snagpad/info.json | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/keyboards/snagpad/info.json b/keyboards/snagpad/info.json index 4faa1d2c0..ffaa5c0a7 100644 --- a/keyboards/snagpad/info.json +++ b/keyboards/snagpad/info.json @@ -6,12 +6,11 @@ "width": 4, "height": 5, "layouts": { - "LAYOUT_ortho_5x4": { + "LAYOUT_ortho_5x4": { "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":0, "y":4}, {"x":1, "y":4}, {"x":2, "y":4}, {"x":3, "y":4}] - }, + }, "LAYOUT_numpad_5x4": { - "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1, "h":2}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3, "h":2}, {"x":0, "y":4, "w":2}, {"x":2, "y":4}] - - } + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":1, "h":2}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":0, "y":4, "w":2}, {"x":2, "y":4}, {"x":3, "y":3, "h":2}] + } } } From 54b572159f62913ead47b0a6ee8d2d09dfb8f19a Mon Sep 17 00:00:00 2001 From: noroadsleft Date: Thu, 3 Jan 2019 18:40:23 -0800 Subject: [PATCH 786/788] Preonic rev. 3: fix info.json file File was saved with an invalid JSON structure. --- keyboards/preonic/rev3/info.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/preonic/rev3/info.json b/keyboards/preonic/rev3/info.json index 50ae8e5fb..b1ad1227e 100644 --- a/keyboards/preonic/rev3/info.json +++ b/keyboards/preonic/rev3/info.json @@ -262,8 +262,8 @@ ] }, "LAYOUT_ortho_5x12": { - "layout": [ "key_count": 60, + "layout": [ {"label":"k00", "x":0, "y":0}, {"label":"k01", "x":1, "y":0}, {"label":"k02", "x":2, "y":0}, From 38e01a7480f6826b3d220c4c8357788558b2af07 Mon Sep 17 00:00:00 2001 From: James Churchill Date: Sat, 29 Dec 2018 16:53:21 +1100 Subject: [PATCH 787/788] Convert split_common to use generic GPIO api --- quantum/split_common/matrix.c | 62 ++++++++++--------------------- quantum/split_common/split_util.c | 15 ++------ 2 files changed, 23 insertions(+), 54 deletions(-) diff --git a/quantum/split_common/matrix.c b/quantum/split_common/matrix.c index 261137638..2c37053f8 100644 --- a/quantum/split_common/matrix.c +++ b/quantum/split_common/matrix.c @@ -20,17 +20,14 @@ along with this program. If not, see . */ #include #include -#include #include "wait.h" -#include "print.h" -#include "debug.h" #include "util.h" #include "matrix.h" #include "split_util.h" -#include "pro_micro.h" #include "config.h" #include "timer.h" #include "split_flags.h" +#include "quantum.h" #ifdef BACKLIGHT_ENABLE # include "backlight.h" @@ -91,8 +88,8 @@ static matrix_row_t matrix_debouncing[MATRIX_ROWS]; static uint8_t error_count = 0; -static uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; -static uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; +static pin_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; +static pin_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; /* matrix state(1:on, 0:off) */ static matrix_row_t matrix[MATRIX_ROWS]; @@ -440,9 +437,7 @@ uint8_t matrix_key_count(void) static void init_cols(void) { for(uint8_t x = 0; x < MATRIX_COLS; x++) { - uint8_t pin = col_pins[x]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + setPinInputHigh(col_pins[x]); } } @@ -460,13 +455,8 @@ static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) // For each col... for(uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) { - - // Select the col pin to read (active low) - uint8_t pin = col_pins[col_index]; - uint8_t pin_state = (_SFR_IO8(pin >> 4) & _BV(pin & 0xF)); - // Populate the matrix row with the state of the col pin - current_matrix[current_row] |= pin_state ? 0 : (ROW_SHIFTER << col_index); + current_matrix[current_row] |= readPin(col_pins[col_index]) ? 0 : (ROW_SHIFTER << col_index); } // Unselect row @@ -477,24 +467,19 @@ static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) static void select_row(uint8_t row) { - uint8_t pin = row_pins[row]; - _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT - _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW + writePinLow(row_pins[row]); + setPinOutput(row_pins[row]); } static void unselect_row(uint8_t row) { - uint8_t pin = row_pins[row]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + setPinInputHigh(row_pins[row]); } static void unselect_rows(void) { for(uint8_t x = 0; x < ROWS_PER_HAND; x++) { - uint8_t pin = row_pins[x]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + setPinInputHigh(row_pins[x]); } } @@ -503,9 +488,7 @@ static void unselect_rows(void) static void init_rows(void) { for(uint8_t x = 0; x < ROWS_PER_HAND; x++) { - uint8_t pin = row_pins[x]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + setPinInputHigh(row_pins[x]); } } @@ -525,16 +508,16 @@ static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) matrix_row_t last_row_value = current_matrix[row_index]; // Check row pin state - if ((_SFR_IO8(row_pins[row_index] >> 4) & _BV(row_pins[row_index] & 0xF)) == 0) - { - // Pin LO, set col bit - current_matrix[row_index] |= (ROW_SHIFTER << current_col); - } - else + if (readPin(row_pins[row_index])) { // Pin HI, clear col bit current_matrix[row_index] &= ~(ROW_SHIFTER << current_col); } + else + { + // Pin LO, set col bit + current_matrix[row_index] |= (ROW_SHIFTER << current_col); + } // Determine if the matrix changed state if ((last_row_value != current_matrix[row_index]) && !(matrix_changed)) @@ -551,24 +534,19 @@ static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) static void select_col(uint8_t col) { - uint8_t pin = col_pins[col]; - _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT - _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW + writePinLow(col_pins[col]); + setPinOutput(col_pins[col]); } static void unselect_col(uint8_t col) { - uint8_t pin = col_pins[col]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + setPinInputHigh(col_pins[col]); } static void unselect_cols(void) { for(uint8_t x = 0; x < MATRIX_COLS; x++) { - uint8_t pin = col_pins[x]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + setPinInputHigh(col_pins[x]); } } diff --git a/quantum/split_common/split_util.c b/quantum/split_common/split_util.c index c613f265a..11453c998 100644 --- a/quantum/split_common/split_util.c +++ b/quantum/split_common/split_util.c @@ -1,24 +1,15 @@ -#include -#include -#include -#include -#include -#include #include "split_util.h" #include "matrix.h" #include "keyboard.h" #include "config.h" #include "timer.h" #include "split_flags.h" +#include "quantum.h" #ifdef BACKLIGHT_ENABLE # include "backlight.h" #endif -#ifdef SPLIT_HAND_PIN -# include "pincontrol.h" -#endif - #if defined(USE_I2C) || defined(EH) # include "i2c.h" #endif @@ -30,8 +21,8 @@ volatile uint8_t setTries = 0; static void setup_handedness(void) { #ifdef SPLIT_HAND_PIN // Test pin SPLIT_HAND_PIN for High/Low, if low it's right hand - pinMode(SPLIT_HAND_PIN, PinDirectionInput); - isLeftHand = digitalRead(SPLIT_HAND_PIN); + setPinInput(SPLIT_HAND_PIN); + isLeftHand = readPin(SPLIT_HAND_PIN); #else #ifdef EE_HANDS isLeftHand = eeprom_read_byte(EECONFIG_HANDEDNESS); From 563ce3f225d981ce460c12ca5130dfe47af41df0 Mon Sep 17 00:00:00 2001 From: James Churchill Date: Thu, 3 Jan 2019 14:30:23 +1100 Subject: [PATCH 788/788] Add explicit eeprom include in split_common Fixes builds that set EE_HANDS. --- quantum/split_common/split_util.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/quantum/split_common/split_util.c b/quantum/split_common/split_util.c index 11453c998..e41b6f638 100644 --- a/quantum/split_common/split_util.c +++ b/quantum/split_common/split_util.c @@ -6,6 +6,10 @@ #include "split_flags.h" #include "quantum.h" +#ifdef EE_HANDS +# include "tmk_core/common/eeprom.h" +#endif + #ifdef BACKLIGHT_ENABLE # include "backlight.h" #endif

p<8JqN28pH2mC;gjx$8M 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�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 Lf>^DHLD2sPg=7|Q literal 0 HcmV?d00001 diff --git a/layouts/community/ergodox/algernon/images/base-layer.png b/layouts/community/ergodox/algernon/images/base-layer.png new file mode 100644 index 0000000000000000000000000000000000000000..2ca7a273bed32e630522ed70618a930037537029 GIT binary patch literal 106956 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

W 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�{1ax_{kN$0#) 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%0AX-%N$=*AUYL*`vcwXN1FYYxKyFOU* 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ⅈ?SdU)4 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

$&Ta0NXeGNF5`z3p@DCoAP&?B%Cu56 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